blogに引っ越しました。久しぶりにやってることを書く。Twitterで小出しにして言ってたことをちゃんとまとめてみた。GUIプラグインといえば、Gtkを使って諸々のUIを全て管理しているプラグイン。これを追加したことで、mikutterはbotからTwitterクライアントに進化したんだね。*.rbやったら4700とか出てきて合わせたら5000行を超えますね。200行で大規模とか若かったな現在問題になっていることが数点あって、それを解決するためにはもういっそ再設計したほうがいいんじゃないかと思って今回書きなおしてます。一応最低限動くようになってこれでいけるんじゃねって思ったので今回ブログを書きました。今回問題にしたのはタブとかペインを扱うmikutterコマンド作るのがしんどいプラグインのGtk依存を除去したいタイムラインにイベントを引っ掛けられたら便利の3点。mikutterコマンドのほうの話は、そもそも俺がそんなことをしたいと思ってなかったのでそんな設計ではなかったんだけど、確かにできると便利。具体的には、キーを押せば左右のタブにフォーカスが移るという事ができる。ユーザ層的にキーボード大好きな人が多いので、できるとよさそう。今のguiプラグインだと、RubyGtkの知識がめっちゃ無いとそういうものは作れない。完全にプラグインのGtk依存をなくせば、まずGtk以外のUIツールキットでmikutterのUIを書くことが理論上できるようになる。いうのは、guiプラグインだけすげ替えればよくなるので。Gtkがうまく使えないプラットフォームでは、プラグインを書けばなんとかなるということがあるかもしれない。それから(実はこっちがメイン)、イベントがGtkオブジェクトをやりとりしないようになるという事は、UIに影響を与えるようなプラグインでも別プロセス化しやすくなる。そもそも特定のプラグインのプロセス分けるのをまだやってないんだけど、その理由がほとんどのプラグインはタブ作ってるからあまり意味ないというもの。ちなみにGtk依存は完全には無くせないと思ってます。あとは、特定のタイムラインにだけ通知、フィルタなどをかけられるといいなと思ってるんだけど、これをするには今のタブの管理方法では不可能。大幅な書き換えがいるけれど、嬉しいことに三年で俺のスキルが上がったらしく、guiプラグインをいじっているとSAN値直葬されるので、書きなおすしかなくなってしまったわけです。内部処理については端折るけれど、タブとかに固有ID(スラッグ)を持たせたら通知の鳴り分けができるし、その名前を指定して直接タブオブジェクトとかにアクセスできたら、ショートカットキーで左右のタブに移動するのもできるようになる。あとはちゃんと設計して前よりは読みやすくする。gtkプラグインを新設することで、guiプラグインにgtkの話が一切入らないようにした。この2つのプラグインは、mikutterのイベント機能を使って通信しているので、ほかのプラグインで気軽にちょっかいを出せる。多くの人にとっては、具体的にプラグインの書き方がどう変わるかが関心ごとだと思います。今移植した中で一番簡単なfriend_timeline改めhome_timelineプラグインのコードがこんな感じです。タイムライン作ってるらしい処理があるけどGtkの文字はどこにも出てこないようになりました。2-4行目が、タブを作ってアイコンを当てはめ、タブの中にタイムラインを入れるという一連の処理。実際にツイートを入れるのは7行目ですね。これはスラッグを指定してインスタンスをわざわざ得ていること以外は特に変わらない。ところどころ出てきてるシンボルが識別名です。プラグイン、タブ、タイムラインで同じ名前使ってるから若干わかりづらいけど。スラッグさえ指定すれば別のプラグインから別のタブにちょっかいを出せます。あとタイムライン以外に必要なパーツといえば、フォロイーリストとかで使ってるようなユーザリストと、アクティビティなどで使ってるCRUDビューくらいかな。プラグイン開発者が望めばGtkを使えるようにします。プロフィール画面をこの調子で作れるようにしようとおもったらwxWidgetsを再発明するハメになってしまいかねない。やり過ぎはよくないのだよ以上でやりたかったことは全て解決できそうです。guiプラグインならまだしも、gtkプラグインに依存するプラグインが出てきてしまうという新たな問題が顕在化しました。これじゃあ別のツールキットで実装が出来なくなるし、マルチプロセスの夢も遠のいてしまいます。いうわけで、先延ばしにしていた、プラグインのメタ情報を書くことができる「プラグインメタファイル(仮名)」の実装を検討しています。これは、yamlとかで、プラグイン名や想定するmikutterのバージョンなどを書いておくファイルです。別ファイルになっているので、実際にプラグインをロードするまえに動作条件を満たしているかどうかが分かります。ロード完了してからバージョンが違って動かないということがわかっても手遅れなので、ソースコード内に書くのはボツになりました。この中に依存するプラグインを書いておけば、想定するプラグインがないというエラーを出せますし、同じプロセス上で実行するといった配慮もできそうです。これは今のところ0.1.2のメインになるであろう変更でもあります。今のところ前のタイムラインやタブの作り方と互換性を取るのに苦労していて(タイムライン、タブにスラッグがない等)、mikutterとしては初の互換性がないリリースになる恐れがあります。(メジャーバージョン上げて0.2にしようかな。requestを送ることもできそうです。仕事も落ち着いてきて今月は時間が取れそうなので、あまり風呂敷を広げすぎないようにしつつ、8月はじめまでにはリリースしたいです。アクティビティタブの仮実装(Twitterのアクティビティとは別物です。UIを追加multiselect(チェックボックスによる複数項目選択)multi(複数のテキスト)プラグインのデタッチ機能バグ追加priceless自分で設定していた期限が来たのでリリースします。pre1のテストのご協力ありがとうございました。あれからもいくつかのバグが追加・削除されているので、pre1を使ってくれていた人もアップデートしてね。pre1http://mikutter.hachune.net/bin/mikutter.0.1.1.780.tar.gz主な変更点アクティビティタブの実装ツイート受信以外のイベントが、ただのリストビューに表示されます。設定で指定された種類のイベントについては、ホームタイムラインにも表示します。(ex)フォローされた、リストに追加された時にホームタイムラインに表示、等Twitterのアクティビティ機能とは別物なので注意(APIが公開されていないため不可能・mikutterのは自分関連のものに限る)ツイートの全ての色の変更が可能になった抽出フィルタに、投稿元ツイッタークライアントを追加いくつかの速度最適化そろそろ、0.1.1をリリースできる頃になってきたと思うので、プレリリース版を公開しようと思います。予定では、今週末までにできることをやってリリースという事にしてしまおうと思ってます。今回はアクティビティ、Activity、アコテベテェなど、あなたのTwitter体験に革命を起こす様々な新機能が追加されてます。抽出タブの条件設定がたまに消える問題GWアップデートです。12.04にてUserStreamが動作してない問題があったので焦って対応しました。他にも安定性に関わる問題を数点修正してます。アップデートしましょう。0.1.1を出そうと思っていたのでその時にしようかと思ったけどそれだと遅くなるのでやめました。0.1.1はもうすぐ出ます。明日からしばらく旅行してるので世間一般のゴールデンウィーク期間中には来ないでしょう。いいつつ、つけたい機能はあらかた終わってるので案外いけるかもしれない。