mikutterの最新の情報は、mikutter blogに引っ越しました。

2012年12月25日火曜日

設定をつけよう

こんにちはー!

ごあいさつ

どうしようもない用事が入ってしまって年末までめっちゃ忙しくなったよ!だからmikutter 0.2.1のリリースは延期します! 最優先にしても良かったのだが、ちょっと丁寧にやって少しでも安定した感じにしたほうがいいだろうと思ってね(思ってもない)。他の環境で動かなくても知ったこっちゃないがな!ぴょぴょぴょぴょぴょwwwww
と、いつものご挨拶はさておきこの記事はmikutter アドベントカレンダー 25日目の記事です。あれ、おっかしいなぁ。俺4日目くらいに登録したと思ったんだけどな…?昨日のunaristさんお疲れ様、今回企画してくれたkatsyoshiさん、書いてくれた皆ありがとう。

お誕生日

今日はmikutterのお誕生日です。3歳になりました。ありがとう、これからもよろしく。今年を振り返る記事は正月中にこのブログで公開します。

閑話休題

折角なので、このブログで昔いつもやってたようなプラグイン開発のtipsを書くっていうのをやってみよう。 mikutterプラグインを作って公開している人は結構見かけるけど、こういうプラグインが割とよくある。
これは、ツイートを右クリックしてごぼうをクリックすると、そのツイートに対して「ごぼう♡」とリプライするプラグイン。一見、ごぼうの後の記号は GOBOU_SIGN を書き換えれば変更できるし、回数も GOBOU_QUANTITY を書き換えれば変更できるので柔軟性がありそうだが、こういったバリアブルな値を毎回ソースから書き換えるのは不便。
そんなわけで、mikutterには設定があるし、一部のプラグインは確かに設定に対応しているが、「こんなしょうもないプラグインが設定できてもなー、ていうかやり方がわからん」と思われることだろう。実際設定の提供方法は、意外なことにドキュメント化されてない(しろよ!)。はい、ということで、知ってる人にはつまらんと思うけど、このプラグインに設定をつけてみよう。

UserConfig

その前にUserConfigについておさらいしてみる。 UserConfigは設定を保存するためのkey-value型のデータストアみたいなもの。こんな風にHashのようにアクセスすることができる。未設定ならnilが返ってくるのもHashと一緒。
UserConfig[:gobou_sign]
書き込みも然り。
UserConfig[:gobou_sign] = "♡"
ただ、これで取り出したオブジェクトは全てfreezeされているので、ちょっと書き換えるだけでもコピーを取る必要がある。ArrayやHashをはじめ、JSONで扱えそうなデータはたいがい扱えるが、再帰的にfreezeされる。全プラグインで共通なので、キーのシンボルは「プラグインスラッグ_」からはじめるのが習慣になってる。あと、あまりでかいデータを入れると遅くなるはずなので気をつけよう。データのキャッシュとかちょっとしたデータベースが必要な場合はこれは使えないね。

setting DSL

つまりUserConfigに設定を書き込むのが最もスタンダードなやり方ということなので、定数にしていたのは全部これで置き換えれば問題無さそう。問題はGUIだけど、意外とつけるのは難しくない。少なくとも、Gtkなどを知る必要はない。具体的には以下のようなコード。
settings "ごぼう" do
  input "ごぼうの後の記号", :gobou_sign
  adjustment "ごぼうの量", :gobou_quantity, 1, 3
end



これだけで、スクショのような設定画面が出てくる。やったね。 input とか adjustment というのはウィジェットの種類。全てのウィジェットで共通しているのは、第一引数が設定の説明、第二引数が書き換えたい設定のキー、ということ。 adjustment は特殊で、特定の範囲の整数を入力させるために使うので、第三引数に最小値、第四引数に最大値を渡してる。
ごぼうプラグインも改良してみよう。
うん、これは素晴らしい。手軽にいろんな設定を増やせる。面倒そうで敬遠してる人も多かったようだけど、意外と簡単だと思ってもらえたんじゃないかな。mikutterの基本設定は、 /core/plugin/settings/basic_settings.rb に書いてあるから、参考になるかな。 あと、同じ階層の builder.rb に、input や adjustment のようなメソッドが定義してあるので、ここを見れば使いたいウィジェットがあるかどうか判断できる。さすがに、コード読めじゃあ記事の意味があまりないから、以下に列挙するけど。
(引数のLは説明の文字列、CはUserConfigのキーのこと)
メソッド名引数意味
multitextL,C複数行のテキスト
adjustmentL,C,min,maxminからmaxまでの数字
booleanL,Cチェックボックス。チェックがついてる時がtrue
fileselectL,C,dirファイル選択。設定にはファイルの絶対パスが文字列で入る。dirはダイアログが最初に開くディレクトリ。省略可
inputL,C一行テキスト
inputpassL,Cパスワード。一行テキストと同じだけど入力文字が隠れてるアレ
multiL,C複数テキスト。ユーザはテキストボックスを追加ボタンで増やすことができ、それらの値が配列で格納される
settingsL,&body枠で囲む。先に上げたbasic_settings.rbの使用例を見てね
aboutL,optionsクレジット。mikutterのクレジットを表示するためのものなので、使わないかな
colorL,C色選択ダイアログ。[RRRR,GGGG,BBBB]のような配列。各要素0xFFFFが最大値。
fontcolorL,f,cフォントと色。fのキーにフォントの情報が文字列で、cのキーには color ウィジェットと同じように
selectL,C,o,&bodyoのHashの値から一つの要素を選択する。表示されるのはHashの値だが、格納されるのはキーの方。普通はコンボボックスだけど、bodyにウィジェットを入れたらラジオボタンになる
multiselectL,C,o,&bodyselect ウィジェットの複数選択奴。選ばれた値がすべて配列で格納される。bodyにウィジェットがあればチェックボックスになる
とはいいつつ、意外とちゃんとまとめるとめっちゃボリュームありそう。aboutとかcolorみたいにほとんど使わなさそうなのもあるし。

とにかく

これでみんなも自分のプラグインに設定をつけてみたくなったんじゃないかな。自分用のちょっとしたプラグインも、こうやって設定できるようにしておくと、便利ですよ。

反省とか

説明がザックリですまんやでwwwぴょぴょぴょぴょぴょwwww しかしね、最近こういう適当なエントリかかないから、適当なマニュアルもないという状態になってしまって、設定難民が出てしまうわけだよ。設定つけるためにソース読んだ皆も、諦めてた皆も、ごめんな!
なので、来年はこういうの書いていくようにしようと思う。ないよりあるほうがマシだしね。あと、半端なこと書いてるとこれはイカンやばいと思ってちゃんとしたのを書くモチベーションが上がるという話もある。ておくれ駆動開発みたいなやつ。