Help us understand the problem. What is going on with this article?

Clojureから気軽にProcessingを使えるライブラリQuilの「出社準備完了」のテンプレート

More than 3 years have passed since last update.

ClojureにはQuilというライブラリがあって、これは何をするライブラリかというと、ProcessingをClojureから扱えるようにラップしたものだ。

で、最近は出社前に「出社準備完了」というのをやっている。いわゆるこんな感じの画像を、一日の始まりに放流している。

ギャラリー

0702.gif

0703b.gif

0707.gif

で、これらについて、だいぶ知見が溜まって来たので、そこらへんを軽くメモしておく。

始め方

Quilの始め方は至って簡単だ。既にleiningenをインストールしているのならば、Quilのテンプレートは、下のようにして作られる。

$ lein new quil hello-quil

すると、leiningenのプロジェクトテンプレートが出来上がって、既に実行可能なQuilテンプレートが作成される筈だ。

さて、貴方がemacsを使っており、Ciderを使っているならば、M-x cider-jack-in したあとに、出来上がったテンプレートのソースコードをおもむろにC-c C-k(バッファ全体を実行する)をやれば、下のようなウィンドウが出てくるはずだ。

sample.gif

あとは、適当にドキュメントを見ながら、改造していけば良い。

ちょっとした知見

詳しくドキュメントを見ていない(最低限のコードが書ければ良いという方針)なので、もしかしたら適切な方法があるのかもしれないが、基本的にQuilでは、何らかの関数でエラーが起きた場合は、ただ処理がストップしてしまうだけで、エラーが出てこなくて困ることがある。そういうときは、下のようなものをセットすると良い。

(q/defsketch hello-quil
  :setup setup
  :update update-state
  :draw draw-state
  :features [:keep-on-top]
  :middleware [m/fun-mode m/pause-on-error])

文字通り、pause-on-errorは、なにかミスったときに、エラーメッセージをウィンドウに表示してくれる奴だ。困った時には、セットしておくと、何かと便利だ。

テンプレート

さて、では「出社準備完了」の最小構成についてだが、だいたい下のような構成に落ち着いている。

(ns shussha-kanryo.core
  (:require [quil.core :as q]
            [quil.middleware :as m]))

;; ----- Settings
(def window-width 400)
(def window-height 400)

; ----- State
(defn draw-text [s font-size x y]
  (q/text-font (q/create-font "TakaoGothic" font-size true))
  (q/text s x y))

(defn setup []
  (q/no-stroke)
  (q/frame-rate 40)
  (q/color-mode :rgb)
  (q/background 255)
  {:frame 1})

(defn update-state [state]
    {:frame (+ (:frame state) 1)})

(defn draw-state [state]
  (q/color-mode :rgb)
  (q/fill 0)
  (draw-text "出社準備完了" 32 64 64))

(q/defsketch shussha-kanryo
  :title "出社完了"
  :size [window-width window-height]
  :setup setup
  :update update-state
  :draw draw-state
  :middleware [m/fun-mode
               ;;m/pause-on-error
               ])

ちょっとだけ説明しておくべきものがあるとするならば、no-strokeという関数だ。これは、自分が四角形などを描くときに、周囲の辺、つまりstrokeがあると不便なことが多いので、デフォルトで設定している。

また、カラーモードに関してなのだが、hsbrgbの二つがあり、基本的にrgb指定のほうが慣れているので、そっちに合わせている。ちなみにhsbとなにかについては、Wikipediaを見たほうが早いだろう。

また、fillに関してだが、基本的には、最後にfillでセットされた色が、四角形や文字などを描写するさいに採用される。fillは一つの引数なら、0 0 0みたいに展開され、4つの引数を持つと、最後がアルファ値となって、透明な色を作れたりする。

あと、もう一つとしては

(defn draw-text [s font-size x y]
  (q/text-font (q/create-font "TakaoGothic" font-size true))
  (q/text s x y))

という関数だ。これは基本的にフォントの大きさをいじることが多いので、それらについて、二つの手続きを考えたくないし、面倒だから、一緒くたにしているという事情による。

当然、q/create-fontの生成コストを考えるならば、よろしくない実装であるが、基本、これらのアニメーションについては、コードを捨てて描くということを繰り返しているので、下手に最適化するよりも利便性を重視している。

ライブコーディング

ちなみに、Quilは、C-x C-e(手前の関数を評価する)によって、動的に挙動を変更させることが出来る。

終わりに

というわけで、Quilは滅茶楽しいので、もし興味があったらやって欲しい。ちなみに、今まで書いた「出社準備完了」のソースコードについては、自分のGistに全部まとめてあるので、興味ある人は参照してくれれば嬉しい。

esehara@github
本物のプログラマーではないほうを担当しています
http://bugrammer.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした