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

  • 12
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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に全部まとめてあるので、興味ある人は参照してくれれば嬉しい。