もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

mikutter:おっさんだってサインコサインを学びたい!(学んだやん)

f:id:moguno:20150830205041p:plain

はじめに

なんか巷では三角関数が空前の大ブームと言うことで、デスマから解放されて無駄にテンションの高い僕もノッてみることにしました!!

冷静に考えると、もぐのはおっさんであり社会に出てから三角関数なんてとんと使ってない勢であるわけで、テメェが手を動かしたところで元ネタに擦りもしてませんね。アレ。

「くくく・・・計画ミス」

取り敢えず三角関数で作れるプログラムと言ったらアナログ時計ですよね!
(異論はrescueして揉み消します。)

アナログ時計の針の動きは円軌道なので、極座標(原点からの距離と偏角で平面上の点を特定するモデル。偏角を変化させていくと円が描けるよ。)との親和性が高いです。その極座標をcairoの座標系である直交座標に変換する際に、件の三角関数を用います。

距離r、偏角θの点を直行座標x, yに変換するには、

x = r * cos(θ)
y = r * sin(θ)

ですね。

てな訳でアナログ時計画像を作るプログラムが誕生したので、現在時刻を吐き出すmikutter-datasource-clockのアイコン画像にして終わりにしようとしたのですが、ここで問題が。

mikutter内での画像の指定方法はファイル名またはURLのみで、cairoで作成したPixbufを指定することはできません。どうしてもと言うならPixbufをテンポラリディレクトリにpngとかで保存すればいいですが、まぁ格好悪いなと。

ならばモンキーパッチとなるのですが、アイコン画像を差し替えるだけじゃつまんないなと思って、前からやってみたかった大技にチャレンジすることにしました。

ミクぺたをペタペタする

mikutterのTLの描画はGdk::MiraclePainter(以降「ミクぺた」)と言うクラスで行われており、Messageごとにそのインスタンスを保持しています。

と言うことは、オブジェクト志向的発想でミクぺたのサブクラスを作ってやれば、TLに独自レイアウトの描画が出来るはずです。

出来ました。割と簡単。

まずはGdk::MiraclePainterを継承してrender_to_context()をオーバーライドします。
引数のcairocontextにあなたのパトスをぶつけましょう。

次にMessageにミクぺたのインスタンスをアサインしているGtk::CellRendererMessageのcreate_miracle_painter()をモンキーパッチして、適宜さっきのサブクラスのインスタンスを返せばOKです。

んで、出来たのがこれ

github.com

でっかいみくったーちゃん時計がホームTLの上部に居座ります。割と邪魔です。

しかしながら、mikutterは時計すら無いヤバい環境で動かされることもしばしばなので、一周回って案外便利かもしれません。

mikutterパッケージマネージャ"Packaged"でもインストールが可能です。こちらもよろしくです。moguno.hatenablog.jp