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

2012年12月17日月曜日

Display Requirements

TwitterがAPIを使うにあたって、ツイートの表示方法を制限してきたので、対応しないといけない。もうDisplay Requirementsはさんざん叩かれていて、どういうものかは皆わかっていると思う。この記事を書いた目的は、私がどのように解釈してどのような対応をするかという説明をすることなので、Display Requirementsの良し悪しについてはあまり言及しない。他のTwitterクライアントを作っているなら俺は悪くないということを強調する羽目になるが、mikutterのユーザは賢い方が多いと信じている。

その前に前提の確認

実はさんざん叩かれているDRだけど、mikutterはそんなには変わらない。2009年のTwitter Webを参考にして今のUIデザインがあるので、当然と言えば当然。実はDRはつい最近制定されたものではなく、もともとあったのが義務化されただけ(それに際して変更はされたが)。
とはいえDRとmikutterのUIは完璧に同じではない。具体的に言えば、私がTwitterのUIで不満に思っていたところを「改善」したのがおおよそmikutterのUIなわけだけど、そういうアレンジを全て取り払わなければいけない。
それによってユーザがどれくらい迷惑を被るかは、0.2.1のリリース後にわかるだろう。

must always

多くのTwitterクライアントがやってる、設定で変更できるというのは、個人的にはグレーじゃないかと思った。「しんどいとかあったら相談して!」みたいなことはちらっと書いてあるけど、やだって言って通用するならこんな規約そもそもないだろう。
あと、フォーラムのスレッドとか全部追っかけてるわけじゃないので、実は知らないだけで設定で無効にできるのは構わん、みたいな結論が実は出てて、相当恥ずかしいことを書いてるかもしれない。だったらそのことをDRに書き足しておけよっていう話だけど。
尚、設定で戻せるようにしてはならない、という明確な記述は見当たらなかった。いずれにせよ、後述する理由により(=めんどい)、そのような設定は付けないと思う。

ぶっちゃけどうでもいいのでは

多くのクライアントが違反してるのでは、と言いたいわけではない。検問やって得するのはTwitterだけだ。DR みんなで破れば こわくない。
守らなくてもいいじゃんと言いたいわけではなく、バカ正直にやると文字通りバカを見るので、ある程度ユーザビリティを維持しながら、うまい落とし所を探っていく必要がある(多くのTwitterクライアントは、設定で戻せるというのを落とし所としたのだろう。悪いやり方だとは思わない)。

とはいっても決まりなので

インターネットは怖いところなので、決まりを守らないとユーザレベルでリンチされることがままある。たまにmikutterインストールしてしこたまハッシュタグ付きでdisったあと去っていくモヒカンがいるけど、こういう人たちの生態はまだ解明されていないので、急所は隠しておかないと不安で夜も眠れない。私の安眠のためにもやっぱり避けては通れない。
インターネットでは規約にとらわれないといけないのですね!

サドンデス

3/5まで実装しなきゃいいじゃん、というのはナシ。API 1.0、3/5までというバッファをもたせた順次移行というよりは、いつ使えなくなるかわからないサドンデスシステムが採用されていると思ったほうが事実に近い。API 1.0の不具合の修正がめちゃくちゃ遅いのだ。mikutter 0.2.0.1089で一応それっぽく動くようになったけど、明日TLを取得できなくなっていても不思議ではない。ユーザは以前のmikutterを使い続けられるけど、3/5までではなく、最大3/5までと考えたほうが、いざというときに寿命が縮まらなくて良いと思う。
v1.1への対応は急務であり、できるだけ同じタイミングでDR対応もしたいです。

ノーガード戦法

mikutterはどうするかというと、Twitterとの化かし合いの土俵には上がらず、あえてこれらに従い、ユーザビリティの低下を見過ごします。mikutterユーザはDRに準拠したUIを否が応でも強いられます。must always、設定で戻すことはできません。でも私は決められたことをしたに過ぎないのだし、Twitter社もユーザも、私を責めることはできません。残念でした。

見つからなきゃなにやってもバレない

多くの人気のTwitterクライアントとmikutterには、ソースが公開されているかどうかという大きな違いがあります。つまり皆さんが勝手に書き換えて、その結果DRに違反することになるのは何ら問題がありません。というか、それがどんな表示をしているかは確認できないしね。絶望するのはまだ早い。DRの実装の全てはそこに置いてきた。

プラグイン

mikutterのコアにはGUIは含まれません。つまりDisplay Requirementsの対応と言っても、標準プラグインの書き換えに過ぎないのです。プラグインは取り外し可能です。この意味がわかるな…?

display_requirementsプラグイン

いっけねー、コード同士の連携を粗にして見通しがよいコード書こうと思ってたら、display_requirementsプラグインになっちゃったー!これ外したらDisplay Requirementsに違反した使いやすいUIがもどってきちゃうわー。アップデートする度に削除するだけでもどってきちゃうわー。

あやしいプラグイン

あれれー? https://github.com/toshia/display_requirements をインストールしたら、プラグイン削除してないのにDR非準拠な洗練されたUIを取り戻せたよー?
これじゃあ、各種ディストリが用意しているパッケージなどを用いてインストールしている等の理由で削除が難しい人も、手軽に無効化できちゃうわー

茶番乙

0.2.1でDRに対応する予定。開発中のコードはtrunkにあります。
API v1.1についても同時に対応中なので、まだ不具合が残ってます。DRに対応するとゆるふわ清楚系mikutterちゃんがどうなっちゃうのか早く知りたいなら止めないけど、trunkを試す時は設定などのバックアップは忘れずにね。とはいえまだDR対応も途中なので、工事現場が見れるというだけの話です。


雑感

私がmikutterにかけた時間は決して短くないし、Twitterに愛着もある。ならば当然この件について思うところはあるんだけど、開発を打ち切るという選択はしなかった。
もちろんここに思いの丈を書き散らしてもいいんだけど、2つのdisplay-requirementsプラグイン(標準プラグインと上記github上のもの)で私の思いを表現することにした。私の表現の場としては、これが一番ふさわしいのだ。

まとめ


  • mikutter 0.2.1からはDRに対応します
  • 設定で戻すことは不可能
  • それプラグインでできるよ

これでよかったのかな。Twitterがこれの違反を根拠にシメあげてくることもないだろうから、多分死ぬまでそれはわからないね。

疲れた。これ25日までに間に合うのかな。

2012年12月15日土曜日

#mikutter 0.2.0.1089


  • Twitterの一部APIによる不具合対策。認証ダイアログが何度も表示される、起動できなくなる等の問題を修正
Twitterの不具合対策です。既知の不具合にあげたのは、今回の不具合完全に回避できたわけではないので、以下のような症状が残っています。
  • API RateLimit残数の表示が間違ったものになることがある(激しく増減する等)
  • リストが更新されない、フォローフォロワーが正しく取得できないなどの問題が起こる可能性があります。
以前のバージョンでも同様の不具合は発生するので、アップデートをおすすめします。最近にわかに増えたふぁぼっていないツイートに★マークがつく問題もTwitterサイドです、遅くとも0.2.1で対応するでしょう。

前回もちらっと書きましたが、対策はAPI v1.1を使うことしかないので、0.2.1は予定を変更してAPI v1.1対応とDisplay Requirements対応になります。

2012年12月10日月曜日

#mikutter 0.2.0.1080


  • アクティビティが自動スクロールアップしない問題
  • アクセストークンが破棄された時の不具合の修正
  • Twitterの不正な応答に暫定的に対応。約1時間毎に認証ダイアログボックスが表示される不具合の改善
  • ツイートを選択していない状態でショートカットキーからプロフィールコマンドを実行するとクラッシュする問題
TwitterのAPI1.0で不具合と思われる挙動があり、現在調査中ですが時間が取れてなくてちゃんと原因を特定してません。これを期にさっさとAPI 1.1に乗り換えることも検討しています。このバージョンでのこの不具合に対する対応は暫定的です。週の半ばにもう一度問題を解決したバージョンを緊急リリースするかもしれません。
なお、上記の問題は初めてmikutterを起動した時にクラッシュしてしまうという問題も孕んでいるようです。こちらも現在調査中。

うーん、0.2.1の作業いろいろしたいけど、API1.1対応を先にやれという事か

2012年11月23日金曜日

#mikutter 0.2.0.1064 0.1.1.1063


0.1.1
  • Twitterの仕様変更により初回起動時にトークンが取得できなくなっていた
0.2
  • Twitterの仕様変更により初回起動時にトークンが取得できなくなっていた
  • ディレクトリの整理
  • 抽出タブを削除できない問題
  • 設定画面の一部リストビュー(Twitterリスト機能等)において、レコードが一件もない時に新規追加ができない問題
  • プラグインを大量に入れた場合、画面からはみ出た設定が表示されない問題
  • Tumblr、はてなフォトライフの画像プレビューに対応
ここ数日(昨晩以降くらい?)でmikutterを導入した人はやってみよう。

Twitterがよくわからん変更を加えてきたので対策。一時的なものかもしれないけど、もともとの実装にも無駄な処理があったので。一応0.1.1にも適用したけど、新しくインストールするのでもない限り意味ないかもね。0.1.1は大きめの問題があればこうやってしばらくはアップデートします。大体みんな移行してるんだけどね。

0.2はそれに加えて、積み残していた優先度の低い不具合の消化と若干の機能追加があるのでアップデートをおすすめします。おすすめしないアップデートってなんだよって話だけど。

0.2.1の予定

ついでに0.2.1の予定を書いてなかった気がするので書いておきます。
  • 高速化。アップデートの定番。何もしてなくてもとりあえずこう言っておけばいい。
  • mikutterコマンドのUI関連。アイコンつけたり、階層構造にしたり
  • Twitte API v1.1 に対応。メリットはほぼ無いけど古いAPIは運営のやる気がないようなのでさっさと引っ越すべき。Developer RejectionDisplay Requirementsどうするかね。
  • マルチアカウントの準備。マルチサービスのためにね。
  • 12/25にリリース。今回は三周年記念のバージョンアップなので、以上のことができてなくても、できてる部分だけでバージョンあげちゃいます。
高速化は実は0.2になったことで割と速くなったんだけど、それによって更に速くできる予知が生まれたのであえて書いた。Ruby2.0で高速になるという話もちらっと聞いたけど、追い風になるだろうか(1.8→1.9は凄すぎて、mikutterの1.8サポートを即切ったね)。
コマンドは、できることが増えたのでコマンドの種類も増えてしまい、探すのが大変なので。閉じるアイコンの出番がまた増えます。
v1.1の要件でもあるDR対応はやるけど、そうなると糞UIになるので、UIを過去のものに戻すプラグインも同時に公開しないといけません。mikutterがただのTwitterクライアントではないことは皆さんご存知の通り。
マルチアカウントっていうのは、もうとっくの昔からそうなってるんだけど、昔botだった頃のコードは流石にマルチアカウント対応になっていない。うまく行けば0.2.1からマルチアカウント対応にできるけど、なんか嫌な予感しかしないからどうするかね。遠い昔の夢だった、別のSNS等への対応のためにも必要なことだね。

来る12/25は皆さんご存知の通りmikutterの3周年です。オンラインでイベントもします(http://atnd.org/events/33737)が、この日のmikutter 0.2.1をリリースします。上に書いたことが一つも出来なかったとしてもバージョンを上げますバージョンは飾りなので。

また、アドベントカレンダー(http://atnd.org/events/33911)やコミケでの薄い本vol.3の頒布(http://home1.tigers-net.com/brsywe/mikutter/mikutter3.html)も行いますし(落ちたけど委託できたようです)、世間でもこの佳節を記念して、普段アニメ等を見ない私がハマったアニメ「けいおん!」の映画の地上波放映が行われる(http://www.tbs.co.jp/anime/k-on/k-on_tv/news/news.html#201211221700)など、過分な祝福を頂いております。

今年も、ただでさえ忙しい年末の貴重な時間を、mikutterでどんどん削りましょう!

2012年11月18日日曜日

mikutterプラグイン管理ツールの構想

本筋とは全く関係ない話。プラグインのパッケージ管理とかやってくれるのが欲しいと思って、ちょっとだけ作りかけてみました。

現状のプラグインシステムの問題点

mikutterはサードパーティプラグインを ~/.mikutter/plugin/ の中に入れたら動くようになっています。いちいちビルドとかしなくていいので楽ですし、単純なので理解しやすい(置く→動く!)のですが、単純過ぎる故に色々と問題がありました。

  1. プラグインを探すこれといった方法がない
    現状として、プラグイン纏まった場所がないので、プラグインを探す時はgoogle先生にきくしかなく、検索すべきキーワードがわからない、特に欲しいプラグインがないという時にダラダラ見れるリストは存在しないようです。
  2. 何が入ってるかパッとわからない
    プラグインディレクトリ見れば分かりますが、ねえ。
  3. mikutterのバージョンとプラグインが想定するバージョンを気にしなければならない
    多くはREADMEとかに書いてあると思うけど、ねえ。
  4. 最新版の確認を、全てのプラグイン毎に行う必要がある
    リポジトリを直接プラグインディレクトリにチェックアウトすると楽にできるけど、それにしたってステップ数が減るだけ
で、誰もがパッケージ管理みたいなことしてくれないのかよ、って思っていたのではないでしょうか。今まで挑戦した人もイタみたいですが、皆途中で一身上の都合又は音楽性の違いにより、完成には至らなかったようです。

私も以前一度やろうとしていましたが、既存のものを使って辺にこったものを作ろうとしてしまって頓挫しました。というのも、プラグインから提供してもらえる情報というのが意外と少ないんですよね。しかし、ちょっと0.2で状況が変わって来ました。

定義ファイルの導入

mikutter 0.2からプラグインの依存関係を記述する目的で、プラグインにYAMLで記述された定義ファイルを同梱しておく機能が導入されました。
これは、依存するプラグインを記述しておき、それが先にロードされるようにすることで、コアを書き換えるプラグインの機能に依存したプラグインを書けるようにという目論見です。
ついでに、プラグインのバージョンとかも書けるようにしました。詳しくは「プラグイン移行ガイド」の7章を見てください。

いろいろ書く割にはほとんどのキーが使われていないというのが現状ですが、この情報を利用したらパッケージ管理みたいなことができるのではないかと思ってやってみました。

理想
  1. リポジトリみたいなのに登録されてるプラグインを一覧したい。
  2. インストールはできるだけ簡単に。
  3. yumとかaptみたいな感じで、バージョンアップとか依存関係とか見てうまい感じにやってほしい
  4. app storeやGoogle Playみたいに評価とか付けれるようにしたい(審査ができないため、悪意のあるコードが入ったプラグインを実行してしまうと…。)
作ってみた


0.2で使えます。設定画面に「みっくストア」というのが増えてるので、そこからプラグインをダブルクリック(todo: なぜクリックで開かない)するとプラグインの説明が出てきて…っていうのはスクショ見たら大体イメージつくと思います。


はい。変なプラグインをインストールしてしまったのでインストール済みになってしまってます。プロトタイプなので使用はおすすめしませんが、現時点で以下のような機能があります。
  • プラグインをインストールする。
    通常のプラグインディレクトリにスラッグと同じ名前のディレクトリを作ってそこに設置。git cloneしてるだけなのでgitコマンド必須です。みっくストアを用いてインストールすると、すぐにmikutterにロードされるので再起動は必要ありません。
  • すでにインストールされてるプラグインを確認
    「導入」カラムに表示されているバージョンは、インストールされているプラグインのバージョンです。バージョンがないけどインストールされてるものは○、インストールされてないものは空白。「みっくストア」を用いずにインストールしたものも検知できます。
  • 開発者の気がふれていないか確認
    プラグイン開発者の頭に不具合がないか確認できます。mikutterプラグインはなんでもできてしまうので、信頼できないものは入れるべきではありません。こう簡単だとホイホイ入れちゃいそうだけど。
これ以外は何も実装してません。バージョンアップ、アンインストール等はそのうちつくんじゃないかな。
また投げ出してしまいそうだけど、最低限のものはできてるので、いい感じにできないかなー

mikutterプラグインの管理が楽になるといいですね

2012年11月7日水曜日

#mikutter 0.2.0.1054


  • ツイートにフォーカスしてなくても会話タブを開くコマンドが使える問題
  • 意味のないトレースをエラー報告として送っていたのをやめた
あんまり何も変わっていない。二週間経ったのでバージョン上げてみた。いつかみたいに大して何もなくても毎週バージョン上げるようにしたら危機感持てて、ちょっとは開発速度上がるかなとか思って。
パッチとかももらってるし割と残してるバグもあるんだけど、最近元気がなくてなかなかコードをかけてない。mikutterの薄い本製作委員会がコミケ落選したのは関係ないです。

0.2ではプラグイン開発者が嬉しい機能とかあるのでそういうのもまとめたいと思っているんだけどコードすらかけてないし全然時間が足りない!これから寒くなったら自分の部屋でコード書くのがかなりしんどくなってくるのに。

2012年10月21日日曜日

#mikutter 0.2

9末とか言っててなんとかそれくらいにRC出してからぐだぐだしてたらもう21日じゃないですか!このまま噂されているiPad miniより遅れてせっかく作った特設ページとかまた作り直しなったら嫌だし、なんか忘れてる気がするけど、ここで区切らせてもらうぜ!
  • 機能追加・仕様変更
    • プロフィールプラグインのデザイン変更
    • 会話タブの抽出方法変更。会話のミックス等
    • 設定タブを廃止。ステータスバーに設置したボタンをクリックしたらポップアップするようになった
    • ショートカットキーにペインの移動、タブの移動等フォーカス関連のコマンドを追加
    • 隠し機能、mikutterコンソール機能を正式機能として採用。起動中のmikutterの中でRubyのインタプリタっぽいものが使える
    • 隠し機能、マルチペインを正式機能として採用。タブの右クリックやショートカットキーで、特定のタブを新しいペインに移動することができる
  • 内部変更
    • UIを一から書きなおした。自由度が上がって若干パフォーマンスも上がった。
    • コマンドロールを刷新。
    • UI DSLを採用。Gtkオブジェクトをイベントで渡す方法はオワコンになった。
    • プラグインメタ情報ファイルのサポート。
    • 収録されているすべての画像、音声のライセンスを「クリエイティブ・コモンズ 表示 - 継承 3.0 非移植」に変更
  • バグ追加
    • 新しいアイコンが可愛すぎる問題
    • and you
RC2の内容と全く同じです。RC2を使っていた人はバージョンアップする必要はありません。

今回はいくつかUIに細かい変更を加えています。長い時間をかけてUIをできるだけ変更しない方法を模索していたけれど、やむを得ず変更を入れました。
大幅な内部変更のおかげでフォーカス処理などがプラグインからできるようになりました。単純なものはmikutterの標準で実装しています。詳しいことは使ってみればわかるんじゃないかな(http://mikutter.hachune.net/)
細かいバグがいくつか残っています。安定したmikutterが使いたい人*1は、アップデートを待ってもいいんじゃないでしょうか。

*1: アアアッwww

プラグイン開発者の方は、内部APIの一部に互換性が無いのでご自分のプラグインを確認してください。とりあえず動くようにするには、 mikutter 0.2 プラグイン移行ガイド を参照してください。ナウい♂プラグインマニュアルは今書いてます、多分次の薄い本にもそれが載ると思います。

2012年10月15日月曜日

#mikutter 0.2.0.1051 RC2


  • 不具合
    • アカウントのトークンが取得できない問題
    • 一部環境で起動できない問題
  • 仕様変更
    • リストでフォローしているアカウントがされたリツイートを取得しないように変更した。今後は(そういったプラグインを入れない限り)フォロイーのリツイートしか表示されない。
ちょっと遅くなりましたがRC2です。基本的にこれで大丈夫だったら0.2の最初の版ということにしようと思っています。
他にも判明している不具合はありますが、使用に支障をきたすほどのものではないので、これらができていないからといってリリースを延期する予定はありません。ただ、それまでに修正できたものについてはアップデートに含めます。
現在判明している不具合は以下のとおりです。他にも何かあれば報告お願いします。

2012年10月5日金曜日

#mikutter 0.2.0.1045 RC1

一定以上の優先度のタスクが全て終わりったので、mikutter 0.2 のRC版を公開します。一週間程様子を見て、大きな不具合がなければ、このまま押し切ります。
何かあれば教えてください。ダウンロードページの一番下からダウンロードできます。

主な変更点 http://mikutter.blogspot.jp/2012/09/mikutter-02_18.html

開発者用変更点 http://mikutter.blogspot.jp/2012/09/mikutter-02.html

残作業等 http://dev.mikutter.hachune.net/projects/mikutter/issues?fixed_version_id=5&set_filter=1&status_id=o

2012年9月18日火曜日

mikutter 0.2 開発版のテスト開始


若干日数がたってしまいましたが()、mikutter 0.2をtrunkにマージしたので、trunkを使っている人たちは、updateするともうmikutter 0.2がつかえるようになると思います。


で、これを以てバグ報告の受付を開始します。まだできてないこともあるけれど、数が減ってきたのである程度つかえるレベルになってきたと思います。さあ今こそかつての人柱魂を呼び起こす時だ!


A____A
|・ㅅ・|
|っ c|
| か |
| た |
| じ |   
| け |
| な |
| い |
| ! |
|   |
U ̄ ̄U


リリーススケジュール

Redmineのトラッカーが「機能」か「致命的」になっているものが全て完了した時点でRC1を公開(tarball)、致命的な不具合があれば修正して、数日サイクルでRCをリリースしていき、一週間大きな問題が見つからなければ0.2をリリースです。9/30あたりになればいいんだけどな。

新機能

ちょいちょい言ってますがざっとおさらい。

UI関連の内部APIの大幅変更

前回のエントリで説明したとおりです。人によっては、拾ってきて入れてるプラグインが対応して無くて起動できなくなると言ったこともあるでしょう。

マルチペイン

マルチペインに正式対応しました。二つ以上タブがあるペインのタブを右クリックすると、「新規ペインを作成」というコマンドが出てきます。これで新しいペインが一番左にできて、そのタブがそこに移動します。
今までの怪しい隙間にD&Dで増えるというのはないです。
ペインの構造が大幅に変わったので、0.1系のペイン情報は失われています。

設定

設定タブを廃止しました。ステータスバーの右にあるネギレンチアイコンをクリックすると、設定ウィンドウがポップアップします。設定はいままでどおり、触ったら即反映されます。決定ボタンなどはないので、設定が終わったらWMの機能を使って設定ウィンドウを閉じてください。

プロフィールプラグイン

プロフィールプラグインを書き直しています。レイアウトが大幅に変わったことと、ふぁぼ・ふぁぼられ数が見れるようになったことが変更点です。

フォーカス操作系のコマンド

左右のタブに移動する等、キーボード操作をしやすくするmikutterコマンドを大量に追加しました。ちょっとショートカットキーの割り当て画面考えないとそろそろきつくなってきましたね。

この世の全てをそこに置いてきた

いろんなプラグインにどさくさに紛れて隠し機能を追加しました。あと、いい忘れてる機能もありそうです。

バグ報告

クラッシュしたらレポートを送ってやってください。だけどバックトレースをコピペしてRedmineで適切に報告してくれたら、より早く対応できます。
バグ報告はRedmineでお願いします。Twitter上で報告されてもチケット化が追いつかないし、そもそもバグの報告から修正完了までの流れを扱うのに不向きです。また、流れが早いため他の人との情報の共有がうまく行きません。一応リプライで言われても聞きますが、基本的にTL上にいる時は休憩中なので、その場で聞いてるだけですぐに忘れる、ということがしばしばあります。人間だもの。
もちろん、質問はTwitterで結構です。でもアカウントを持ってる人には最終的なチケットの作成はお願いすると思います。

mikutterのRedmineアカウントを持っていない人で、報告するのに登録してやってもいいという方は、登録フォームから登録してください。ただしアクティベートは手動で行うので、登録したらリプとかで知らせてください。

チケット作成の流れはこちらの文書を参照してください。Redmineで残作業を確認するにはこちらから。コンソールのように、実装してあるのにまだチケットが残っているものは、現在作業中ということです。


今週は結構できるとおもうんだけどなーほんとに今月中にリリースとかできるんかな

2012年9月16日日曜日

mikutter 0.2 プラグイン移行ガイド

1 はじめに
まだバグは致命的なもの含めていくつか残ってますが、テストしてもらえる品質になったと判断したので、mikutter 0.2 を mikutter の trunk にマージしました。 今回のアップデートで、0.1 系と互換性が失われた部分がいくつかあり、プラグインを開発している人にはお手数ですが自分のプラグインに手を入れてもらわなけばいけなくなりました。

それもこれもクーラーが壊れたのが悪いんです。で、みなさんのプラグインをどうやって移行していけばいいかを簡単に説明します。 今回は、あくまで0.1用のプラグインが「動く」ようになることを主眼に説明します。 つまり、すべてをモダンな形式に書きなおす訳ではなく、互換性のあるところはできるだけ触らないようにして、 最小ステップで動くようにする方法を紹介します。 したがって、0.2対応のプラグインを書くためのドキュメントとしてはあまり使えません。

2 ざっくり
0.2 の目玉の変更はGUI関連に大幅に手が入ったことです。 これにより、複雑なGUIをもったプラグインが動作しない場合があります。 また、mikutterコマンドも変わったので、 もしあなたの作成したプラグインにmikutterコマンドを提供しているものがあるなら、 基本的には必ず書き替えなければならないと考えてください。

3 タブ
今までは、Gtkオブジェクトを作成して、 mui_tab_regist イベントでそれをGUIに渡して、適切な場所に配置されていました。 これからはGtkは基本的には使いません。全てはUI DSLを介して操作し、それをツールキットプラグインが表示する というスタイルをとっています。こうすることで、mikutterをGtk以外で操作する方法を提供する余地を持たせたい、 という目論見があります。 とはいうものの、UI DSLはmikutterプラグインのほとんどのニーズを満たすために最適化されているため、複雑な インターフェイスを定義することには向いていません。望むなら nativewidget メソッドを使ってタブの中に Gtkオブジェクトを直接埋め込めますし、 mui_tab_regist も非推奨ですが残されています (そして、いくつかのmikutterプラグインは未だにこの古い方法でタブを構築しています)。 ぶっちゃけて言えば mui_tab_regist はそのまま使える。Gtk::TimeLineもそのままでいい。 (Gtk::TimeLineは昨日あたりまでバグで動作してませんでしたが、今はもう大丈夫です)

あとどうでもいいんですけど、registっていう英単語はないんですってね。なんであると思い込んでたんだろう。 多分みんな使ってるから、調べもせずに日常的に使うようになってしまったんでしょうけど、 イベント名なので単純に変えられないし。早くこんな黒歴史イベント消し去りたいです。 このイベントを使わずにもっとクールに書く方法はあるんですが、今回の範囲外なのでカット。

4 設定
設定はポップアップウィンドウになりましたが、プラグインからsettings DSLを 使って設定を挿入することに変わりはありません。 これについても、内部のAPIは完全に互換性があります。

5 廃止されたイベント
内部でしかほとんど使っていなかったような、Gtk関係のフィルタを削除しました。残念ながら、見た目はほとんど 変わっていませんが、mikutterのUIの構造は大幅に変わっているので、安直に代替できるものはほとんどの場合ありません。 Gtkウィジェットのツリー構造を直接操作するようなプラグインも(多分見たことないけど)動かなくなります。

6 mikutter コマンド
おそらく一番多くの人にとって問題になるのはmikutterコマンドです。これは今回どうしても変更せざるを得ませんでした。

6.1 command メソッド
従来はmikutterコマンドを追加するためにはフィルタを用いていましたが、これからは command メソッドを使用します。 まずは従来の書き方をおさらいしてみましょう。
# in 0.1.x
on_command do |menu|
  menu[:reply] = {
    :slug = :reply,
    :name => '返信',
    :condition => lambda{ |ms| ms.map(&:message).all? &:repliable? },
    :exec => lambda{ |ms| ms.first.timeline.reply(ms.first.message, :subreplies => ms.map(&:message)) },
    :visible => true,
    :role => :message
  }
  [menu]
end
このモデルにはさまざまな問題があって、まずフィルタで受け取ったHashに、スラッグをキーにしてHashを入れる必要がありますが、 中に入れるハッシュの中にもスラッグを書いておかなければいけません。2つが違うと不具合が起こるので、 あまり好ましいAPIではありませんでした。 更に、フィルタなので、最後に引数を配列で返す必要があります。だいたいはスニペットで書いてしまうのでこれが問題になることは少ないですが、 ミスをする原因にしかなりません。 0.2では以上の点を改善しています。
# in 0.2
  command(:reply,
          name: '返信',
          condition: Plugin::Command[:CanReplyAll],
          visible: true,
          role: :timeline) do |opt|
    opt.widget.create_reply_postbox(opt.messages.first.message,
                                    subreplies: opt.messages.map(&:message)) end    
commandメソッドが追加されました。
command(slug, options, &proc)
slug にスラッグを設定して、 options は従来渡していたHashと同じ物を渡します。ポイントは、slugを指定する必要が なくなったことです。 slug に設定されている値が流用されます。 更に、 :exec キー(コマンドの実行内容)も不要になり、 &proc を使うようになりました。これも slug のように中で Hashが加工されているとお考えください。というかそうなってます。

6.2 condition
condition キーに、従来は無名関数を渡していましたが、例では Plugin::Command[:CanReplyAll] という値が 設定されています。 これは単純に、よくある条件を定数にまとめたもので、あえて使う必要はありません。 すべての定数は mikutterの「core/plugin/command/conditions.rb」にまとめられています。 実は引数に渡される構造体にも若干の変化があるのですが、それは次の実行部分の話にまとめます。

6.3 ロール
どのウィジェット上でコマンドを実行するかを指定する部分で、条件や実行時に渡ってくる引数が変わります。 ただ、今まであった :message:message_select のような、 直接存在しないウィジェットに紐づいていないロールは 廃止されています 。 0.2でも使用できるロールは、実際のウィジェットとして存在するもの、すなわち :timeline, :postbox です。 また、ウィジェット全てにロールが割り当てられたので、今までにはなかった :tab, :pane, :window, :profiletab, :profile が新たに使えるようになりました。移植するのに新しいロールを使うことはない と思うのでここでは割愛します。

6.4 条件及び実行時の引数
いままでは、ロールによって渡される引数が違いましたが、 これからはどのロールでも同じ構造体が渡されるようになりました。
Plugin::GUI::Event = Struct.new(:event, :widget, :messages)
event には、mikutterコマンドがどのような入力によって実行されたかがシンボルで入っています。 基本的には :contextmenu (右クリックメニューから選択された)か :keypress (ショートカットキー)です (mikutter 0.2 からはmikutterコマンドを呼ぶデバイス等も拡張できます。だから :gamepad とか :kinect とかが入ってくる可能性があります)。 widget は、イベントが発生したウィジェットです。ロールが :timeline なら、必ずPlugin::GUI::Timeline のインスタンスが入ります。 最後の :messageswidget のアクティブな子ウィジェットを再帰的に探索し、タイムラインがあれば、 そのタイムラインでイベント発生時にアクティブだった Message の配列が渡されます。 これは Plugin::GUI::Timeline#selected_messages の戻り値ですが、 選択されているツイートに対して実行されるコマンドには必ずこの配列の内容を使ってください。 イベント発生時と実行時には微妙なタイムラグがある可能性があり、コマンドを実行した時に選択していたツイートと、 実際に実行された時に選択しているツイートが違う可能性があるからです。

6.5 具体例等
mikutterの core/plugin/command/command.rb に、たいがいのコマンドが定義されているので参考になると思います。 フィーリングでコピったらいけるでしょう。

7 定義ファイル
プラグインによっては、正しく書いているのにNoMethodErrorなどでクラッシュすることがあります。 理由はたいがい、guiプラグイン等がプラグインDSLにあとからメソッドを足しているケースがあり、これらの プラグインよりそのプラグインが先にロードされていることが原因なんじゃないでしょうか。 0.2からはどのプラグインに依存しているかといった情報を書く定義ファイルが追加されたので、 依存するプラグインがあればそれを書いておくべきです。そうすれば、依存しているプラグインを先にロードしますし、 依存するプラグインが一つでも存在しなければ、ロードされません。

7.1 定義ファイルの書式
spec という名前のファイルを作成して、中にYAMLで記述します。 例えばダイレクトメッセージプラグインはこんなかんじです。
name: Direct Message
slug: directmessage
description:
  mikutterにリア充御用達機能ダイレクトメッセージを追加します。
  送受信したすべてのDMを見るタブと、各ユーザのプロフィールにそのユーザと自分がやり取りしたDMを表示するタブを追加します。
depends:
  mikutter: "0.2"
  plugin:
    - gui
    - gtk
version:
  "1.1"
author: toshi_a
  • name プラグインの通称です。日本語でもいいです。現在は使われませんが、インストールしてるプラグイン一覧みたいなのをそのうち作ってみたいですね。
  • slug プラグインのスラッグ。依存関係の解決に使われます。
  • description プラグインの簡単な説明。
  • depends/mikutter 想定するmikutterのバージョン。ここに書いてあるバージョンと現在のmikutterのバージョンに 互換性がなければプラグインがロードされません。
  • depends/plugin 依存するプラグインのスラッグ。今のところ、GUIがないと意味がないようなプラグインは gui を、 Gtkクラスを少しでも使っている場合は gtk を指定してください。DirectMessage は両方指定しています。 一つしかない場合も配列で指定してください。
  • version プラグイン自体のバージョン。今のところ特に用途はありません。
  • author プラグインの開発者のTwitterアカウントのscreen_name。これも今のところ特に用途はない。
8 まとめ
今回は当初の設計では想定していなかったことをいくつか実現するために、内部を大幅に書き換えたので、いくつか プラグインの互換性がなくなってしまいました。mikutterは今まで、必ず過去のプラグインも動くようにしていたので、 今回手を入れたGUIまわりは、最初の設計が誤っていたと言わざるを得ないでしょう。 

難しく言えば、クライアントに新たなユーザエクスペリエンスを提供するためにはアーキテクチャにイノベーションを起こすことが必要でした。 その代償としてコンパチビリティを失うソリューションしかトゥギャザーできなかったのは残念ですが、逆に言えば、 長いスパンで見ればプラグインデベロッパの開発コストを大幅に減らすオポチュニティと捉え、 プラグインDSLを拡張することによって新たなmikutterのコアコンピタンスを創出することができたので、 私とみなさんにとってWin-Winの変更になったと思う次第です。

mikutterのプラグインは本当にいろんなことができます。だから場合によってはここにある内容だけでは 移植することができないかもしれません。あと、なんか書き忘れてる気もします。 だから何かあれば適当に聞いてくれたらいいと思います。適当に答えますんで。

2012年9月4日火曜日

#mikutter 0.1.1.863

  • Twitpicとinstagramの画像が表示できなくなった。仕様変更に対応
  • mikutter.rbにシンボリックリンクを貼ってそれを起動すると起動できない問題
お久しぶりです。いかがお過ごしですか。自分の部屋にクーラー無くても、2回くらい頭痛と吐き気で動けなくなる程度で、基本的に生きていけることが分かりました。
ただし流石に40度を超えると怖いので、クーラーが生きてる部屋に逃げてしまいます。そうするとmikutterの開発が止まるので、mikutterのバージョンアップが一ヶ月以上空いた原因は、間違いなく夏にあります。

今回のアップデートについてはあまり話すことはありません。現在、0.2を開発中です。ですが、あまりにも抜本的な変更だったため、trunkに入れると一部trunkを常用している人の環境が破壊されるので、ブランチを一時的に切り替えていて、ある程度のところでtrunkにマージする、という手順で開発を進めていくことにしました。

0.2の現状

0.2はまだ不安定なので、うかつに起動すると、プロファイル等を壊し、mikutterを起動不能にし、あなたを一生童貞のままにしてしまう可能性があります。彼女はできたとしても財布しか見てません。
そのため、現在0.2は「開発者用プレビュー」です。αかな。プラグイン開発者とかは先に見ておきたいですからね。それから、バグ報告は受け付けていません。あまりにもバグが多すぎて、いちいちバグ報告を聞いている感じじゃないからです。

trunkに取り込んだ時(βくらい?)、RC(tarボールを公開した時)にここでもう一度記事にするので、テストしてみたい方はもうしばらく待っていてください。パッチはくれたら気温が低い日に取り込みます。

Twitterの規約の変更等を受けてのこれからのmikutterについて

最近話題になっています。これについて私から説明することはありません。Twitterの発表が全てです。ただ、mikutterがこれに対してどういう対応をするかはお伝えしておこうと思います。一言で言えば、まだ様子を見ているところで、今のところなにも行動していません。

今のところ問題視しているのは、Twitterの定める Display Requirements に従わなければならないようになったことです。mikutterでこれに従うことは、技術的にはそれほど難しいことではありませんが、これに従えば、mikutterの使い勝手を損なうことになるだろうと考えています。ではどうするのか…というのも実はまだ考え中なのですが、おそらくみんな似たようなことを考えているんじゃないでしょうか。どうしようもないことばかり考えてないで、週末のOSCに向けて日程を調整したほうが良いと思います。俺はいけないけどね。(mikutterマグカップが手に入るチャンスもあるとかないとか)

2012年8月11日土曜日

OSC Kansai 2012に行ってきた

先日の告知にもあったように、OSCにmikutterブースを出展させていただきました。個人的にまとめてみます。

1 準備

ブース自体は普段使っているmikutterの展示をするということで、あまり準備はしなかったけど、私の持っているノートパソコンがMBAだけなので、標準のMac OS Xでは動作しません。 そこで、Ubuntu Linux 12.04をインストールしてmikutterをセットアップし、展示を行うことにしました。 mikutterのセットアップ自体は本番2週間前くらいになってセットアップ。セミナー用開発環境も込みで、朝起きてから開始して昼くらいには終わってました。いやぁ楽になったものだ。 当日ブースを手伝ってくれたぺんぎんさん(@penguin数字四桁(忘れた))は、多忙なスケジュールの合間を縫って参加してくれて、Gentoo Linux上で動いているmikutterを展示してくれました。
また、Android用Twitterクライアント、ShootingStarの多分マスコットキャラクターであるイプシロンマンのTシャツを、私の務める会社のデザイナーに協力してもらい作成し、当日着用して参加しました。結果、作者にふぁぼ爆撃されました。 殺伐としたOSCにmikutterブースが!!!

_人人人人人人人_
> (´へεへ`*) <
 ̄^Y^Y^Y^Y^Y^ ̄

2 前日

OSCは3日と4日に開催されていますが、mikutterの参加は4日だけでした。私も仕事が大詰めで、下手をすると参加できないということもありえたので、前々から仕事を片付けておき、金曜日は午後からはほとんど会社にはおらず、会場の下見等をしていました。 で、15時くらいに会場に行ったら、すでにタペストリーやグッズがセッティングされているし、ぺんぎんさんがブースでmikutterの展示をしているし、お客さんもぽつぽつ来るし、事実上mikutterブースやってる。いいのかこれ。 私はmikutterブースで翌日のためにmikutter0.2のデバッグをしてました。

3 当日

3.1 開始

OSC開始が10:00なんですが。5分前くらいに「ておくれた人たち」(私のことを「ておくれである」と言い、定義も曖昧なまま言葉だけをひとり歩きさせ、手遅れにさせる人たちのこと)がぞろぞろとやってきてブースを囲み、肉まんを開けるというハプニングがあったけどなんとか予定通り開始。

3.2 展示内容

ブースでは、以下のグッズを配りました。
  • mikutterシール(円形) @okano_t さんから
  • mikutterシール(エンブレム・okanoさんから横流しらしい・笑) @uwabami さんから
  • mikutterシール(縦長) @tsutsuii さんから
  • mikutterちゃんブロマイド @brsywe さんから
  • mikutterタオル @okano_t さんから
  • mikutterマグカップ(mikutterの薄い本vol2執筆者のみ) @tsutsuii さんから
  • mikutterの薄い本vol2「すごいmikutterたのしくておくれよう!」 @brsywe さんから タイトル自重
多い。ほんとうに多い。どうしてこうなった。多すぎて書き忘れてるのあるんじゃないか。大丈夫か。 グッズだけじゃなくて展示も紹介しておかないといけません。
  • ubuntu 12.04でのmikutter 0.2(開発中)の展示
  • Gentoo Linuxでのmikutter 0.1.1の展示
これではグッズ売り場か展示してるのかよくわからない。しかも私は全く何も用意していない(mikutterの薄い本には寄稿したが)。いいのかこれ。

3.3 お客さん

当日はかなりたくさんのお客さんが来てくれました。不慣れなことも手伝ってとても慌ただしくて周りをよく見てなかったけど、聞くところによると初参加ということもあってか相対的に人気のブースだったようで、ありがたい限りだ。

3.3.1 janetterの人

Windows/Mac用のTwitterクライアント、janetterの中の人が絡んでくれた。まさかjanetterのような有名なTwitterクライアントの中の人に捕捉されていた上に、前日は同じTシャツを着ていて、mikutterのREADMEから無断リンクしていることもバレていたとは。jane氏〜相互リンク(死語)してくだされ〜。
そういえば母校の先輩だったということもわかった。janetterはリリース当初からたまに追いかけていたが、これで気兼ねなく機能をパクることができるようになった。 あの学校、(不本意だが)やばいとされているTwitterクライアント開発者二人も排出してるのか、恐ろしいな。

3.3.2 Archの人

私が現在mikutterの開発にも使っているArch Linuxでmikutterのメンテナンスをされている方と初めて会うことができました。関西でも結構いろんな人に会えるものですね。 あと別の人からですがArch Linuxの缶バッジをもらいました。これはArch(ry

3.3.3 遠方から

わざわざ、mikutterが出展するから来京予定を前後させてOSCに参加してくれた人が何人かいた。嬉しいですね。

3.3.4 通りすがりにエナジードリンクをくれる人

エナジードリンクはたまに飲むけど、立て続けに二本のんだのは初めてで、カフェインの取り過ぎか、とても気分が悪くなって、死ぬかと思った。それともちゃんぽんしたのが悪かったのかな。 飲み過ぎには注意しよう。

3.3.5 通りすがりにGentooTシャツを売ってる人

ブース出せよwww

3.3.6 通りすがりにふぁぼってくる人

家でやれ

3.4 セミナー

当日は、13:00からセミナー「mikutterをあなた色に染める」を開催した。 講義内容相当の記事は開発日記に掲載する予定だけど、資料はアップするとまずいものがかなり含まれているので大人の事情で非公開で。 めったにプレゼンしないのに、展示会場の前のステージでやらされた。どう考えても運営にマークされている。どうせネタ枠だし前でやらしといたらええやろといったところだろうか。そうだよ。

3.4.1 mikutter 0.2

mikutter0.2から大幅にカスタマイズの幅が広がるので、それを紹介させてもらいました。 このブログでも当然そのことについては後に詳細に解説した記事を書く予定です。0.2のエッセンスを伝えられてよかった。ただ今回は、内部の話が主だったため、プラグインを開発するつもりのない人にはピンと来ない話だったかもしれません。 一方、本来対象としていた人たちには、一定の反響がありました。もう少しまともに動くようになったらブランチを切って公開したいと思う(あんまり溜めるの良くないと思ってるし)。

3.4.2 ライブコーディング(プラグイン作成デモ)

mikutterプラグインを作るライブコーディングを行いました。推定30人以上が見てる前でコードを書くという極めて過酷な状況下でも書けるくらいプラグイン簡単だよというのをアッピルするつもりで、同じコードをちゃんと再現できるように10回以上同じプラグインを書く練習をするというなかなかない経験をしました。でも入念に練習しすぎて、前日に書いたコードの設定が残っていて、へんなやつにカラーラベルがついたりして本番でテンパってしまった。料理番組メソッドがあって本当に良かった。

今まで、ustreamで画面を配信しながらコードを書いたことは何度かあったけど、あれだけ多くの人が注目する中でコードを書くのは初めて。さすがに緊張するかと思ったけど、ちゃんと準備していたので思った程でもなかった。

ライブコーディングで伝えたかったことは、私がmikutterプラグインを作るときにどういう環境でコードを書いているかということです。mikutterの薄い本vol.2に私が寄稿した内容をフル活用してました。 同等の環境は、mikutter0.1.1でも、私が公開しているコードや、他の有名なelispをインストールするだけで実現できます。ぜひお試しあれ。

3.4.3 笑い

10回取ることが目標だったけど、それくらいはいけたと思う。練習した甲斐があった。

3.4.4 人

他のアトリウムでのセミナーの雰囲気から、2/3くらい来ればと思っていたが、フタを開けるとはるかに多くの人が来て、スタッフが椅子を追加してもまだ立ち見が出るほどでした。だれがこんなこと予想できただろう。運営にも、人多すぎワロタとか言われていたようだし。 今回は、mikutterプラグインにある程度興味が有るか知っている人が対象で、あまり人が入るたぐいのセミナーではなかったんだけど。

3.4.5 ふぁぼ爆撃

ふぁぼ魔たちが、セミナー中に示し合わせてふぁぼ爆撃をする計画をしていたようで、数日前からほとんどふぁぼられなくなり、本番が始まった時に未曾有のふぁぼ爆撃を受けた。 あとでfavstarで調べたところ、40分のセミナー中に2万ふぁぼされたことがわかりました。これは1秒に8favのペースで、過去に受けた最大のふぁぼ爆撃、20分4000ふぁぼ(1秒3fav)を遥かに超える規模・長さ。爆撃を受けている間はmikutterの動作に難があり若干セミナーに支障をきたしたものの、爆撃が終わったらいつもどおり動作しており、毎秒8ふぁぼにも耐えられることが証明できました。 依然として爆撃を受けている最中の挙動に課題は残るものの、今回のところは大成功と言って良いでしょう。

4 経緯

思い返せば、ステッカーが作られ、東京ではユーザ会が行われ、同人誌まで出すなど、かなりいろんなことに手を出しています。だから「mikutter」をよく知っている人の感想は、「今度はOSCか」といったところだったかと思います。 しかし「私」をよく知る人の中には、今回のOSC参加に違和感を持ったというか、驚いていた人がいて、何度かそのことについて聞かれたので良い機会だからまとめておきます。 今までのそういったアクティビティと今回では、(私にとっては)決定的な違いが一つありました。それは、初めて私が主導したということです。

今まで私がmikutterに関して行ったことは、コード自体へのコミットとリリース作業くらいなものでした。 リリースも、私はWebサイトを作ってtarボールを置くだけで、各種OS/ディストリでのインストール方法をブログにまとめたり、パッケージを再配布していただいているのは全て別の人です。 当然、イベントやグッズの企画、運営、頒布も全て私以外の人が主導しています(支援することはあったが、私が言い出したわけではないし、主導権を奪うようなことはしなかった)。

もともと、mikutterは私のために開発されました。 今まで私が書いたコードは、しばしば他人のためにデザインされていました。それというのはより多くの人に使ってもらう意図があったのですが、製作過程はつまらないから出来も悪く、尽く失敗していました。 あるときその過ちに気がついて、私は自分が書いていて楽しいコードだけを書いたほうがいいのではないかと考え、楽しければ実用できないコードでも書くようになりました。 そのアウトプットの趣向が大きく変わるきっかけになったのがTwitterとの出会いです。そう、気に入るTwitterクライアントがなかったから、作ろうと思い立ったわけです。その時決めたことが2つあって、今も概ね貫いています。
  • 楽しくなくなったらやめる。そうなったら続ける価値がないから
  • 自分のために。そのほうが良い物ができるだろうし、この考えが間違っているならmikutterは誰にも見向きされないだろう
だから、パッケージを提供するようなこともしなかったし(面白くない)、機能の要望も自分がやりたいと思わないと聞かないし(これはDMなど、何度かミスを犯して痛い目にあった)、グッズも作りませんでした(面倒以前に、そもそも思いつかないw)。 人のことを考えて作ったソフトウェアが全く日の目を見ないのに、私のわがままを体現したものが広く受け入れられる。よく聞くような話ですが、なんとも皮肉というか、不思議ですよね。

いままでこのようなイベントを見送ってきたのは、私が面倒くさがり屋だからです。準備が大変なのはわかりきっています。それでも今回私を参加させるに至った動機が2つありました。
  • 楽しそうだった。せっかくだし一度くらい、自分のソフトウェアを持って参加とかしてみてもいいんじゃないか
  • 一度みんなを見てみたかった
各種企画をしてくださること自体は非常にありがたいですが、やってる本人たちは大変そうだけどとても楽しそうで、開発者という立場を利用して今回私も楽しんでやろうと思いました。 2つ目は説明がとてもむずかしいし、理解されないかもしれないけれど、私が上記のような経歴を持っているから、mikutterに興味を持ってくれる人がどんな人なのか純粋に興味がありました。 もちろんそういう人たちには感謝もしていますが、べつに一人ひとりにお礼を言いたいというわけではなく、何を伝えたいというわけでもなく、かといってただの好奇心だけでもない。一度一緒に飲んでみたいという感覚に一番近いかもしれません。 そこで、mikutterを使っているような人が集まるであろうOSCという場に目をつけて、今回出展を決意するに至ったわけです。

そんなわけで今回のOSCへのブース出展、セミナーの開催は、二年半を超えるmikutterの歴史の中で、初めて私が企画し、私の主導のもとで運営されました。皆さんが楽しかったといっても、私のそれには遠くおよばないでしょうが、少しでも何か持って帰ったもらえたなら(物理的、論理的に)嬉しいです。

mikutterを使ってくれてる皆さん、来て下さった皆さん、サポートして下さった皆さん、ありがとうございました。これからもよろしくお願いします。そのうち飲みましょう。もちろんおごってくださいね。

5 今後

クーラー壊れたので死ぬ前に0.2をブランチに置いておきたいです。あとはたのんだ

2012年7月8日日曜日

#mikutter 0.1.1.814


  • 検索でクラッシュすることがある問題
  • OAuthトークンが切れた時のリトライ処理の不具合修正
  • 画像アップロードサービス「via.me」の仕様変更対応
いくつかバグを修正しました。自分の部屋の壁の中にネズミがすんでるみたいで、作業効率が下がってかないません。知り合いにそういう業者の人間がいるので相談したら、「次はイタチとかがくるよ!ハハッ!」とか言われましたそうじゃないだろもっとプロっぽい回答求めてるんだよ小学生かお前は

今回のバージョンにネズミが混入していないことは確認済みです。

2012年6月17日日曜日

#mikutter 0.1.1.810

  • 以下のWebサービスの画像プレビューに対応
    • twitgoo
    • via.me
    • 地獄のミサワの「女に惚れさす名言集」
  • 画像サービス「gyazo」の画像プレビューが機能していなかった問題
  • プロフィールタブを閉じた後、稀に「retweet error」というエラーが表示される問題の改善
  • デバッグモード中、特定の処理中にデバッグモードが有効にならない問題
マイナーチェンジです。最近話題になっている、いろんなtwitterクライアントで401エラーを受け取ってしまい、アクセストークンを破棄したような動作をする問題は、まだTwitterが修正を完了していないようですね。これ以上長引くようなら対策してもいいですが、データが返ってこないわけですから、通常通りお使いいただくことはできないです。でもTwitter社を責めないでください。Twitterと不具合はズッ友だよ…!

相次いで画像サービス(なんて呼べばいいんだ)向けのパッチを頂いたので、機能追加になってしまいますが今バージョンで提供することにしました。これからもジョニーデップに激似どころかそれを超越するTwitterクライアントになるべく、がんばっていきます。

(とはいっても来週から当分、また忙しくなりそうなんだよなぁ…

2012年6月9日土曜日

#mikutter 0.1.1 r799


  • 高負荷時、ツイート入力開始時にクラッシュする問題
  • タイムラインを閉じる時にクラッシュする問題
  • 規制されていたりネットワークが不安定な時に起動に失敗する問題
バグ修正ばかりですが、何れもクラッシュする可能性のあるものです。アップデートを推奨します。
Twitterの仕様変更がありましたね。URLに含まれてる #! を削除してくれました。やったね。また余計なことを
0.1.1リリースを記念して、Twitterがサーバサイドエラーに40xを返すようになったようです。RESTのホームタイムライン、メンション、UserStreamが影響を受けたみたいですね。私にとっては昨日の出来事ですがみなさんにとっては2週間くらい前の出来事だったんでしょう。0.1.1.790のリリースから一ヶ月近く開いててびっくり。

現在はなんとか少しづつ時間を確保できる状態になってきて、モチベも回復してきたからちょっとづつコードを書いてます。しかしじめじめして作業効率も落ちるし、なんとかならんのかいな

2012年5月28日月曜日

GUIプラグイン書き直してる話

久しぶりにやってることを書く。Twitterで小出しにして言ってたことをちゃんとまとめてみた。

GUIプラグインといえば、Gtkを使って諸々のUIを全て管理しているプラグイン。これを追加したことで、mikutterはbotからTwitterクライアントに進化したんだね。
ただ、最初にこれを書いてから三年くらい経ってるわけで、最初は200行くらいの超大規模()プラグインだったわけだけど、今では400行弱あって、これ関係が入ってるmuiディレクトリでwc -l *.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にしようかな。え?最初の0がどうしたって?)とはいえ、多少の書き換えで済むので、把握してるぶんについては、pull requestを送ることもできそうです。

丁度仕事も落ち着いてきて今月は時間が取れそうなので、あまり風呂敷を広げすぎないようにしつつ、8月はじめまでにはリリースしたいです。アレがあるからね

2012年5月13日日曜日

#mikutter 0.1.1

mikutterの最新不安定版、0.1.1をリリースしました。


  • 機能追加・仕様変更
    • アクティビティタブの仮実装(Twitterのアクティビティとは別物です。リンク先参照)
    • 抽出タブプラグインに、Twitterクライアント名によるフィルタのサポートを追加
    • リプライ記号として、♨や陰陽玉、チルノ等を新たにサポート
    • ツイート検索、PINコード入力をエンターキーで決定できるようにした
    • フォントと色を細かく設定できるようにした
    • ミュート機能でミュートしたユーザのツイートに加え、関連するリツイート、リプライを表示しないようにした
    • 処理の高速化
  • 内部変更
    • 設定画面のUIを追加
      • multiselect(チェックボックスによる複数項目選択)
      • multi(複数のテキスト)
    • プラグインのデタッチ機能
  • バグ追加
    • priceless

自分で設定していた期限が来たのでリリースします。pre1のテストのご協力ありがとうございました。あれからもいくつかのバグが追加・削除されているので、pre1を使ってくれていた人もアップデートしてね。

2012年5月8日火曜日

mikutter 0.1.1 pre1

http://mikutter.hachune.net/bin/mikutter.0.1.1.780.tar.gz

主な変更点

  • アクティビティタブの実装
    • ツイート受信以外のイベントが、ただのリストビューに表示されます。
    • 設定で指定された種類のイベントについては、ホームタイムラインにも表示します。(ex)フォローされた、リストに追加された時にホームタイムラインに表示、等
    • Twitterのアクティビティ機能とは別物なので注意(APIが公開されていないため不可能・mikutterのは自分関連のものに限る)
  • ツイートの全ての色の変更が可能になった
  • 抽出フィルタに、投稿元ツイッタークライアントを追加
  • いくつかの速度最適化
そろそろ、0.1.1をリリースできる頃になってきたと思うので、プレリリース版を公開しようと思います。予定では、今週末までにできることをやってリリースという事にしてしまおうと思ってます。

今回はアクティビティ、Activity、アコテベテェなど、あなたのTwitter体験に革命を起こす様々な新機能が追加されてます。

集え有志!フィードバックの始まりだ!

2012年5月1日火曜日

#mikutter 0.1.0.772



  • ubuntu 12.04でStreaming APIが動作しなかった問題
  • 稀にフリーズして、強制終了以外何もできなくなる問題
  • 抽出タブの条件設定がたまに消える問題
GWアップデートです。ウソです。先日公開されたUbuntu 12.04にてUserStreamが動作してない問題があったので焦って対応しました。
他にも安定性に関わる問題を数点修正してます。アップデートしましょう。

そろそろ0.1.1を出そうと思っていたのでその時にしようかと思ったけどそれだと遅くなるのでやめました。0.1.1はもうすぐ出ます。

だけど、明日からしばらく旅行してるので世間一般のゴールデンウィーク期間中には来ないでしょう。
とはいいつつ、つけたい機能はあらかた終わってるので案外いけるかもしれない。

2012年4月21日土曜日

0.1.1実装予定機能

今やってることの途中経過とかだよ

アクティビティ
イベントのタイムライン
「アクティビティ」
mikutterのUIは、「メッセージ(=ツイート)」をいろいろな抽出条件で表示するタイムラインを中心に構成されてるわけですが、mikutter開発開始当初と違い、今ではお気に入りを初め、様々なツイート以外の「イベント」が飛び交うようになりました。TwitterのWebやTweetDeckも、Facebookをパク意識してそういったユーザの行動(=アクティビティ)を追うことができる機能をつけました(それと憑依機能とkおっと誰か来たようだ)。

API自体は提供されていませんが、UserStreamから受け取れる情報である程度それっぽいことができるようになります。また、こうやって行動の実態を定義してやることで、タイムラインに抽出したり、通知を設定することができるようになるでしょう。

任意のイベントをタイムラインに

また、プラグインからアクティビティタイムラインにイベントを表示するためのAPIも用意していますし、全ては表示する前にフィルタで書き換えたり削除したりできるようになっているので、この機能を使ったプラグインもそのうち出てくると思われます。

フィルタによる表示の自由な書き換え

タイムラインを黒くしてみた。
全ての色が変えられるので、実用できる
今までmikutterのデザインって、結構決め打ちのところが多かったんですが、フィルタのパフォーマンスが上がったので、色とかをフィルタでいじれるようにしました。

主に色についての変更が見た目には大きいと思います。実はいままでメッセージのヘッダ(名前とか日付とか表示されてる部分)の文字色は黒固定だったので、黒背景で使いたい人はヘッダが見えなくなってしまっていたんですが、ヘッダは左右で色を設定できるようにしました。

設定が細かくなった
何より、ここの色がフィルタで自由にいじれるようになったことが今回最大の変更点です。

例えば、以下のように実行すれば、Twitterユーザ@toshi_aのツイートだけ文字色が赤になります。




こんなふうに、MiraclePainterを受け取ってそこから適当な条件で任意の色をつけるプラグインを簡単に開発することができるようになります。この他にも、スレッド(会話)プラグインの拡張、ツイートを投稿前に加工するフィルタ等で、表示に影響を与えるプラグインを作成する上で表現の幅を拡げるような内部的な変更を複数取り入れる予定です。

先送りになったの

タブのDSL化

タブをGtkオブジェクトではなくGUIプラグインの提供するDSLで定義・管理させることで、他のプラグインが関係ないタブに干渉できるようになる機能です。つまり、左右のタブにフォーカスを切り換えるmikutterコマンドとか、タブごとの新着通知なんかがプラグインで実現できるようになります。
このためには、半ば手探りで実装したGUIプラグインを再設計しないと難しいと判断しました。思ったよりGUIプラグインが大きいし、設定画面の作成など、ついでにやってしまいたいこともいろいろあったので、あえて0.1.1では対応せず、次回に回すことにしました。

いつになるの

5月中頃くらいで蹴りをつけたいですね。ubuntu 12.04には間に合いません。

#mikutter 0.1.0.749

  • UserStreamが止まることがあった問題を改善
  • フィルタやフックを独自に定義する一部のプラグインが動かなかった
  • ツイートの右クリックメニューが出ないことがあった
  • ロケールがUTF8になっていない環境で起動できなかった

パッチをもらうなどした。

割と忙しかったのでバグの修正も疎かに ふへへ
一ヶ月ぶりくらいにmikutter使えるような状態になってきたので、新機能とかをついかしていきたい
ってか前回のバージョンアップが24日だし

0.1.1の実装予定機能を書く書く詐欺してるのでぼちぼち書いておきたいな。リポジトリ追いかけてくれてる人はいろいろと新機能が入ってるのに気づいてくれていると思うけれど

2012年4月4日水曜日

約束の日

! 注意 !
この記事は4/1に書いた記事ではありませんが、私@toshi_aにとっては毎日がエイプリルフールです。


着想

「3! 2! 1!ぴゃあああああああああwwwwwwwwww」
角のテーブルの若者がにわかに騒ぎ始める。2012年になった。
@toshi_a は去年、家族が身長156cmの男のライブに行ってしまい※1、あやうく一人で2011年を迎えるところだったので今年は早々に @brsywe 主催の年越しオフ会に参加することにしていた。
しかし実際に蓋を開けてみると、彼はついさっきコミケから新幹線で帰ってきたところで眠そうだし、@toshi_aの他には誰も来なかったのである。
オフ会というよりはただのサシ飲みだ。誰も来なかったらどうするつもりだったのか。


※1 余談だが、161cmであると正式に発表があり、有識者の中でも意見が別れ問題になっている。今後の動向次第ではmikutterも対応するかも知れない



二人は1月15日のこみトレに本を持っていく計画について話しており、新年になったことにもあまり興味を示しておらず、当然 @toshi_a も自分のiPhoneに普段来ないgoogle calendarからのリマインダが来たことにも気がついていなかった。
その日は深夜2時くらいに別れて、 @toshi_a は京阪の地下で普段ならとっくに終電が終わっている2:30発の電車の案内板を眺めながら、いよいよ2012年の始まりか、と気を引き締めた。
ておくれることを強いられているんだ
思えば、2011年は本当に悲惨な一年だった。以前より数百倍ふぁぼられるようになったり、ておくれなどと不名誉なあだ名をつけられてしまい、初めて合う人にも「ておくれさんですか?」などと言われ、今でもせんべいのような概念になってしまうのではないかと警戒することを強いられているんだ

@toshi_a は、どうせ来月には忘れる一年の目標でも考えてみようかとiPhoneを取り出し、目に飛び込んできた「約束の日」という奇妙なリマインダに一瞬戸惑った。しかし4月1日という日付を見るやいなや、今年の目標のことなんかすっかり忘れ、今年のネタを考えるのであった。


歴史

@toshi_aはエイプリルフールには嘘はつかない。どうせ普段からふざけたようなことばかり言っているし、今更何を言ってもエイプリルフールらしくならない。巷では彼女ができたとか、内定が出たとか、卒業できたとか嘘を言う人がたくさんいるが、どれも大概やったし、嘘をついてもつかれてもたいしておもしろくない。そんなわけでエイプリルフールには全く興味がなかった。
なんで今年のエイプリルフールは
Webページいじらなかったのにアクセスが伸びたのか
その考え方を変えたのは、近年のWebサイトの参入からだ。
彼らは年度末の一番忙しい中で、我々の宿敵であるユーモア欠落症患者に罵られるような内容のページを作る。それらはすべてくだらなく、取るに足らないどうでもいいもので、笑い以外に何も与えない。だが繁忙期にもかかわらずそんなことに身を裂く彼らの遊び心に感動したのだ。

ただ彼らのやりかたに心を打たれた所で簡単に真似できるものではない。普通の人間がコンスタントに不特定多数からのアクセスのあるサイトを作るのはなかなか厳しいのだ。ブログではアルファブロガーでもない限り友達にジョークを言うのと大して変わらないし、Webサイトなら尚更だ。誰も見てないWebサイトが調子に乗ってエイプリルフールネタをやったところで2日にはGoogleのbotのアクセスログたくさん入ったApacheログと一緒に削除することになるのは確定的に明らか
結局このモデルは一見魅力的だが現実的ではなく、彼は結局、毎年彼女ができたと死ぬまで報告しつづけるしかない運命を呪うしか無かったのだ。

しかし2010年に変化が起こる。Twitterクライアントを作り始めたことだ。Twitterクライアントは常に使うアプリケーションなので、ここにネタを仕込めば不特定多数にネタをブロードキャストできる。彼は普段から「初音ミクに全く関係ないじゃないか」という、聞く人が聞けばTwitterをやっていいのは中学生からですよと思わずマジレスをしてしまうような呟きが何か気にかかっており、エイプリルフールに彼らのユーモアを試すとともに、俺が本気を出してしまったらいったいどんなひどいことになってしまうのか思い知らせ、二度と同じ口を叩けないようにしてやろうと思ったのである。
mikutterにとってユーザはお客様ではないのだ。いつからmikutterを「使っている」と錯覚していた?お前たちは常に試されているのだ。mikutterではTwitterクライアントがユーザを選ぶ。

2010年3月、彼は16種類のアイコンを自分のサーバに設置し、それをエイプリルフール当日に取得させ、ユーザのアイコンのURLを一定のルールでいずれかの画像に置き換えた。当然これらはすべて初音ミクのアイコンで、ユーザのタイムラインはすべてみっくみくにされた。
当時10人ほどいたユーザには突然のことに恐れおののくもの、最高にクールだと賞賛するもの等いろいろいたが、中には好ましく思わない人の声もあった。
彼は、最初はそういったつまらない人間もいるだろうと考えていたが、翌年のエイプリルフールにはmikutterに触れることにより「これだからmikutterはやめられない」と言うまでに変貌を遂げているのを見て、実は彼らは私達と同じ「ユーモア」を持って生まれたのにもかかわらず、殺伐とした現代社会に心を破壊され、いつしか人の心を閉ざしてしまっただけなのではないか、と悟ったのである。

彼らも私達と同じ人間なのだ
彼は絶望に打ちひしがれた。俺達と常に争ってきたあいつらにも心があったのだ。
なのになぜ私たちは同じ人間同士争わなければならないのだろうか。きのこ派とたけのこ派は分かり合えないのだろうか。なぜどう見てもチョコが少ないきのこの山を選ぶ過ちを犯す人間がいるのだろう?ご自分の息子が皮を被ってるのがそんなに気になるのだろうかwww
しかし、mikutterで変われる人がいるのならば、創り続けたい。毎年この日のために。

その日から彼はもう一度mikutterの機能目標を練り直し、翌年までにTwitterクライアントとして最低条件を満たし、ユーザをあわよくば増加させることを決めた。餌がなければ、獲物はかからないからだ。
一年後には無事に実装を終えて、その顛末はこのブログにも書いた。

新年になったと同時に彼に届いたアラートは、「約束の日」まであと3ヶ月しかないことを報せるために、いつだったか自分で設定したものだったのだ。
とはいえ、今年に入る寸前にどう考えてもデスマです本当にryみたいな案件の話を聞かされて最悪の気分で新年を迎えた彼は、あまり時間が無いことはわかっていたし、一発勝負なので複雑なことをしてバグを作り込むよりは、単純なことに留めておいたことがいいということもよくよくわかっていた。

「今年は順当にアイコンを増やすか…。」

この決断は決して安易なものではなかった。今年はすでに去年の128種類があり、ここから更に増やすのは非常に困難である。
ミクの写真はいくらでもあるが、一緒にデートに行った時に撮影したものなどが殆どで、童貞の巣窟であるTwitterで晒せばフォロワー全員にリムられることは想像に難くなかった。できるだけ早く手を打たなければならない。


準備

同じ事をするにしても全く繰り返す訳にはいかない。去年の反省点がある。
まずアクセス数だ。昨年は3月からプリフェッチするようにしておき、できるだけ当日のサーバの負荷を減らした。この判断は非常に良かったのだが、この対策を講じても結局トラフィックが当日に集中したのだ。
理由は簡単で、mikutterのエイプリルフールネタを聞きつけた人たちがこぞって導入したのだ。これをキッカケに使い始めてくれた人もいたのだ。正直なところ想定外で、ユーザの増加が見込まれる今回は、何も考えなしにコネクションを貼りまくるのではなく、同時アクセス数を制限しなければならない。
もうひとつは、この機能はコアに完全に組み込まれていたためにテストがしづらく、当日不安すぎて死にそうになったということだ。これは、プラグイン化することで回避できる。取り外しができてしまうという欠点があったが、今回は目をつぶることにした。
これらの問題を解決するために、アイコンを取得するためのロジックを大幅に書き換え、表向きにはキャッシュの効率化を測ったことにしておいて、実際にはアイコンをオーバライドするフィルタを実装したのだ。

バージョンアップしたと言ったな?あれはウソだ
また、昨年は3月19日にそのコミットをしており、バージョンアップにておくれる人がちらほらいた。やはり、0:00に全員がミクアイコンに浄化される悦びを皆に感じて欲しい。そのためには華やかなバージョンアップで釣ることが必要で、3月第一週のうちに大量のバグを修正し、高速化したことにして0.1をリリースしたが、実際には上記の機能を入れたかっただけだ。

ちなみに一か月前という数字の根拠は、先にリリースしておいた0.0.4がそれくらいの日数あれば十分浸透するということがわかったからだ。つまり0.0.4は最新版がどのくらいの速度で行き渡るかを実験していたに過ぎなかったのである。
手早く行動することで、来るデスマーチで私が動けなくても、エイプリルフールは滞り無く遂行される。すべては最初から計画されていたのだよ。

新たな問題も出てきた。昨年と違い、プラグインを書くため、ハックするためにmikutter自体のソースを読む人がでてきたということだ。これは彼にとって非常に嬉しいことだったが、これでは約束の日機能をつけたら即座にバレるのである。そこで今回は、当初aprilfool.rbという名前だったプラグインを、頭文字が同じRubyGTKのクラスから名前をとってaspectframe.rbという名前にした。当然そのクラスとはなんの関係もない。

最後にアイコンだ。
2月の終わりごろに、@toshi_a はmikutterのダイレクトメッセージタブをクリックした。彼はDMがないと言われないようにそれっぽい機能をつけたが、実際に使うのは今回が初めてだ。宛先は @penguin2716 になっている。
彼はmikutterプラグインも開発しているが、 @toshi_a のアイコンをいじって100種類以上の派生アイコンを作ってgithubに上げている(https://github.com/penguin2716/teokure-icons)。
@toshi_a は彼に協力して数十種類程度アイコンを調達できれば、収集はかなり楽になると考えて声をかけたのだ。
頼むやいなや、 @penguin2716 はノリノリでアイコンを描きまくり、一気に200種類くらいにしてしまった。これだけあれば、数十種類と言わず128個のアイコンを調達できる。それに去年のを合わせ、256種類のアイコンを用意することにしたのだ。


約束の日

3月31日22時。京都の某社には、年度末の連日の激務で疲弊しきって体で死んだ目でTLを見る @toshi_aの姿があった。
しばらく見ていると、エイプリルフールの文字が目に飛び込んできた。彼はいつの間にか約束の日が目前に迫っていることに気づいた。
うまくいくだろうか。入念にテストをして、概ね思い通りに動いていることを確認したが、それは2月の話。にわかに不安になる。
TLには、去年よりうんと増加したmikutterユーザがツイートしており、エゴサーチの方も結構なペースでmikutterの話題を拾ってくる。
あと2時間で、彼らのTLはすべて彼が夢見た秩序に満たされ、彼は神となるのである。
もう一度サーバの設定などを確認する。自分は今日も会社に泊まる。Twitter越しにYFでツイートを見て確認するしか無い。
ミスったら終わりだ。すぐに修正版を提供するということすら困難なのだ。

36. 37...

だ…駄目だ まだ笑うな…
こらえるんだ…
し…しかし…

59. 0.



にわかにタイムラインが速くなり、多くの人がよるほーを成功させる。思えばTwitterサーバのレスポンスも速くなり、よるほーの難易度も随分と低くなったものだ。
mikutterユーザのツイートがなくなり一瞬戸惑ったが、戸惑っているのはユーザの方である。いや、あまりのことに状況が理解できていないだろう。あるいは、mikutterの見せる秩序で満たされた幻想世界に陶酔し、ツイートすることを忘れているのかもしれない。
一分ほどの間をおいて、一人のユーザが反応し、続いて次々と喜びの声が届いた。…うまくいったのだ。

彼は自分の犯行をユーザのうpする画像でしか見ることが出来なかったが、ユーザにはすべてがミクによって浄化されたユートピアが見えていたはずだ。




--- キリトリ ---



反省

どうだったかな、伝統の「約束の日」は。去年からの人は、待ちわびてくれていたことと思う。最近使い始めた人は、突然のことに驚いたたろう。
今回はまとめを、去年のDQNブログ風に引き続き、携帯小説風に仕上げてみたよ※2。ここ数年小説を読んでないのもあるだろうけど、意外と難しいね。印税生活は諦めよう。

※2 そういえば携帯小説とか読んだこと無い

とはいえこれ、単に冗談だけでやっているわけではない※3
ソフトウェアは、ユーザ数を測ることが難しい。クローズドなものであれば、自分しか配布しないのが基本なのでサーバのログなどからダウンロード数を測ることができるが、それにしたってアクティブユーザを測れるわけじゃない。mikutterは今やさまざまなディストリビューションのパッケージとして入手できるため、計測ができないのだ。
しかし、エイプリルフールの画像はサーバから取ってくるため、サーバログを見れば、今月のアクティブユーザ数がなんとなくわかる。IPアドレスは変わりうるので正確ではないが、おおまかな目安にはなるのだ。集計した結果、最大で821人は居るという結果になった。500人くらいはいるんじゃないかと思っていたので、思ったよりいるのかもしれない。


※3 ウソです



最後にTwitterで見たツイートに適当に紹介、回答しておく。

午後もミクアイコンになったままだけど、エイプリルフールって午前までじゃないの?

2つ勘違いしていますね。

  1. エイプリルフールだからこういうことをしたのではなく、mikutter自体がエイプリルフールみたいなものだということ。
  2. エイプリルフールが午前までというのはエイプリルフールネタです。はやくユーモア欠落症が治るといいですね。


アイコンがかぶってる人がいる

仕様です。
今回で256種類ですが、全ユーザが被らないようにするには、2011年9月にTwitterのアクティブユーザが1億人を突破したので、1億枚以上の画像を用意する必要があります。

通知アイコンが戻らない

4/1に取得されたアイコンが変わる仕様です。通知は一度ファイルに書き出さないとアイコンを表示できないのでいつまでも戻りません。現在はmikutterはこのファイルを削除しないので永遠にそのままになります。よかったですね。ずっとミクかわいいできますよ。
残念ながら今後のアップデートで消すようにする可能性が高いですが、もっと残念なことに以下のように実行してキャッシュファイルを全て削除すると直ちに戻ってしまいます。
$ mikutter --clean

同じ人でもちょくちょくアイコンが変わってる

ユーザのアイコンを変えているのではなく、画像のURLをフックしてアイコンを変えているので、特定のユーザがアイコンを変えると割り当てられるアイコンも変わります。

4/1以降もこのTLがいいwww

みんなミクアイコンにしたらいいのにねぇ。俺も来年は見たいなぁ

誰が誰かわからない

ミクだよぉ☆彡

不便なのでプラグインを探しだして削除した。としぁは死ぬべき

深刻なユーモア欠落症です。こういう人が争いを起こすのだと思います。しかしmikutterは先に述べたとおりこういう人にも寛容です。
まだmikutterを使い続けてくれるなら、来年の約束の日には楽しめるようになっているかもしれません。
ユーモア欠落症は治せる病気です。一緒に克服しましょう!

ちょwwwwなにこれwwwwマジmikutter神すぎるwwwwとしぁふぁぼろwwww

深刻なておくれです。こういう人がふぁぼ爆撃をするのだと思います。しかしmikutterはふぁぼ爆撃にも強い設計です。
mikutterを使い続けるとふぁぼ魔になるという迷信もありますが、そんな事実はありません。
ておくれは治せません。死ぬしか無い!

2012年3月24日土曜日

#mikutter 0.1.0.723


  • たまに不特定の2ユーザのアイコンが入れ替わる問題を修正
  • ダイレクトメッセージの強制改行が正常に働かないことがあった
  • ダイレクトメッセージにアイコンをつけた
  • Rubyコンソールの閉じるボタンがキーボードで反応しなかった
  • 例外を捕捉できずにクラッシュした時に、それを標準エラー出力に表示しないことがあった
主にバグフィックスです。多分今月はこれで最後。
加えて、再現性の高い致命的なバグは取り終えたので、このバージョンは割とおすすめできる感じになったと思います。アップデートお願いしますぅ

0.1.1の予定でも書くかー^^

2012年3月2日金曜日

#mikutter 0.1

前回のプレビュー版を、mikutter 0.1としてリリースすることにしました。
特に変わったことはないです、はい。
全く新しくなったmikutterは全てを変えていきます。もう一度。

http://mikutter.hachune.net/

0.0.4からの主な変更点

  • リストリアルタイム更新の正式な実装。
    • フォローしているユーザ + 5000アカウントまでのツイートが、リストタブ上にリアルタイムに表示できます。
    • 当然、この挙動は変更できます。
  • APIを使用するタイミングの変更。
    • Rate Limitの消費が激しい処理を、Rate Limitの更新前に実行するようになりました
  • Twitter APIライブラリの刷新
    • 一部のリクエストが大幅に高速化されました。
  • プラグイン向けの新しいクラス/メソッド
    • Deferred
    • 設定画面API
  • 約束の時の対応
  • 低速回線での挙動の改善
  • 起動の高速化
  • メモリリークの改善
  • 多くのバグ修正
  • それと便座カバー
これといった新機能はありませんが、コードの大規模な書き直しや、0.0.4で試験的な実装だったいくつかの機能が正式に実装されました。既に古いバージョンのmikutterを使用している人は、アップデートをお勧めします。

とはいえ

まだちょいちょいバグがあるんだなこれが。既知のバグについては Redmine にかいたります。今一度人柱精神を呼び覚まし給え。

他のこと

予告通り、Weekly Releaseについては削除しました。開発版はtrunkを追ってください。trunkにした変更についての話とかをこのブログに不定期に書いていきます。

また、本日から mikutter Wiki を試験的にですが公開します。
  • mikutterのインストール方法
  • 使いかた
  • プラグイン
についての情報を、皆さんに書きこんでいただいて共有できたらと思います。いろいろやってみて様子を見てみようと思いますので、意見があれば @toshi_a なり、READMEに書いてあるメールアドレスなりに投げてください。

次の話(0.1.1)

時間のある時にでも。

2012年2月26日日曜日

#mikutter 0.1 rev.697 pre2

プレリリース版2です。多分これで0.1ということにします。軽微な不具合が残っているけど追々。いつものクオリティ。

http://mikutter.hachune.net/bin/mikutter.0.1.0.697.tar.gz (tarball直リン注意)


  • リスト不具合を修正。全てのリストがリアルタイム更新されるようになった
  • 新しく0.1を使い始めた人がOAuthアクセストークンを起動毎に求められる問題
  • before_exit_api_section イベントが一切発行されなかった

現在、確認が取れてないもの等含めて7件

日程


何もなければ 3/1 に0.1をリリースします。ただ、残ってる他の不具合もうちょっと潰してからにしようかなーとか、今週忙しいフラグが無事に回収されるとかするとリリースが遅れます。

2012年2月18日土曜日

#mikutter 0.0.4, 0.1 rev.690


  • 0.0.4
    • Twitpicのプレビューができなくなってた
  • 0.1
    • Twitter APIライブラリの以下の機能を実装
      • フォロー
      • リムーブ
      • 検索の保存
      • 検索の削除
      • ダイレクトメッセージの送信
      • ダイレクトメッセージ削除
      • ツイートの削除
    • ユーザのプロフィールのリストのタブが表示されないことがあった。又、リスト加入チェックを厳密に行うようにした
    • mikutter内部でのツイートの配送方法の見直し。POST関連操作のUIフィードバックの高速化。
    • アイコンファイルキャッシュが壊れることがあった
いやー風邪で死にかけたり仕事忙しくなったりでずいぶん間があいちゃいましたよHAHAHA
もうすぐ0.1.1を出しますこれはRC1みたいなやつです

今後のリリースサイクルについて

リリースサイクルを多少見直します。多分3月から

trunkのWeekly Snapshotを廃止する

どうしようかなぁと思ったのですが、trunkは実際の稼働テストが充分にされていない開発中のバージョンで、安定している時もありますが基本的にはいつなにが起こるかわかりません。
今までは、現在のmikutterを見てもらうために、trunkのスナップショットを定期的に公開していましたが、Webサイト上に上がっているし変更点もブログに書いてしまっていたため、安定版であると誤解されていました。

テスト版

変更点はそれだけです。
現在公開しているバージョン(今は0.0.4)に不具合があったとしても、どんなに高頻度になっても週に一回しか更新はしないつもりです。mikutterのサイトのDevelopから開発版をダウンロードするリンクが消えるだけです。

開発版を試すには

mikutterのSubversionのリポジトリをチェックアウトしてください。Web上で開発版をダウンロードする手段は提供しません。

更新頻度

あんまりよく考えてないけど更新頻度をかなり高くするつもりです。生産性は変わらないので毎回のバージョンアップの変更を小さくしてアップグレードの頻度を上げるということになるでしょう。
なぜなら、スナップショットをうpしないようになるとやってる感が出ないからです。

0.1.1について

話は変わって、0.1を3月1日までにリリースします(前倒しになるかも)。今回のスナップショットを以て0.1に対する新機能実装を終わり、今後はbugfixのみにします。又、0.0.4のサポートは0.1リリースと同時に終了します。

2012年1月30日月曜日

#mikutter 0.0.4, 0.1 rev.658


  • 0.0.4
    • Twitpicの仕様変更に対応。画像が開けるようになった
  • 0.1
    • openimgプラグインで画像を開く時にクラッシュすることがあった
    • 既存のTwitter APIライブラリを削除。mikutter用に作成した新しいライブラリを採用
    • Deferred.rb
    • Twitter APIリクエストキャッシュのとり方の変更
    • バグレポートの報告方法の変更。今後はクラッシュした時にしかレポートを送信しません
とりあえず0.1でやりたいことはあとはアクティビティ機能だけになったか…。ついにmikutterのバージョンが1桁上がる時が来るわけです

今回は、まだ新Twitter APIライブラリの実装中です。未実装の機能を使用するような操作をするとクラッシュします。フォロー・リムーブ、リスト追加・削除・変更、検索の保存・削除など、頻繁に使われない様なPOST系APIは軒並み未実装です。trunkをstableだと思ってる情弱がフッフゥします。

最近まともなドキュメントを書いたお陰なのか、mikutterプラグインを書いてくれる人が増えた、ような…。俺もいろいろ書きたくなってるけど、mikutter wikiを先に準備します。基本的な内容は
  • インストール方法
  • 使いかた(一応)
  • mikutter plugin
で、言うまでもなく3つ目がメインです。プラグインを作ったら必ず作者がここに自分のプラグインについて書くみたいなふうにすれば、みんなが幸せになるんじゃないかな。とりあえず適当にwiki置いてあれするのでまたその時に詳しいことを。

2012年1月17日火曜日

mikutter の薄い本

先日15日にインテックス大阪で開催されたこみトレ19で、「mikutterの薄い本 vol.1」を頒布しました。今回のプロジェクトを企画(だけしてておくれた)し無事成功まで導いてくれた @brsywe、記事を書いてくれた@katsyoshi、サポートしてくれた方々、当日来てくださった皆さん、ありがとうございました!
宣伝もほとんどしていなかったので、どれくらい捌けるかなぁと心配していましたが、まぁまぁ消化できました。

以下、@toshi_aの個人的なまとめです。

発端

最初は、たかがTwitterクライアント、しかもこんなに小規模なもので同人誌を出すなんてまた下手くそな冗談を…と思ってましたが、恐ろしいことにマジで応募していたらしく、当日用事を早く切り上げて会場にかけつけたらまじでブースがあって肝が冷えました。

参加した魂胆

つまり俺の知らない所で勝手に始まっててあとから乗っかりました。とはいってもmikutterと言われたから乗っかるほど尻軽じゃないです。
少しこのブログにも書いた覚えがあるけど、ぼちぼちプラグインチュートリアルみたいなものが必要なんじゃないかと思ってました。ただ書く機会がない。そんなところに、丁度同人誌を作っているという話を聞きつけて、ならばこれにプラグインチュートリアルを寄稿して、それを叩き台に正式なオンラインマニュアルを作ってはどうか、と思って参加したわけです。
結果、「Writing mikutter plugin」が出来上がり、本の1コーナーを飾ることもできて、プラグインを書きたいという人に差し出せるドキュメントも一応できました(もちろん、これからもっと内容を充実させていく必要があるので、リンク先はちょくちょく更新する予定です)。
このチュートリアルは、各セクションごとに実用的な例から少しづつ新しいことを学べるように作られています。逆引きリファレンスみたいに使うこともできるようにしたつもりです。mikutterプラグインを作りたい人にも、既にmikutterプラグインを作ってる人にも役に立つ内容になっていると思います。
こんなこと書いて欲しいとかあったらどんどん@toshi_aに教えてください。割とやると思います。



本やWriting mikutter pluginについて、見かけた疑問と回答を書いておきます。


  • 内容がておくれてない
    →ディレクターがておくれていました。内容自体は真面目です。一部を除いて。
  • 下線を引くところがおかしい
    →なんでこの疑問が俺からしか上がってないのかが不思議です。
  • mikutterの薄い本とかこわい
    →まじでやられた俺の気持ちがわかるのか
  • フォロイー(followee)ってなに
    →自分がフォローしている人のことです。対義語は自分をフォローしている人を差すフォロワー(follower)。
  • 意外と真面目だった
    →誤解があったようだね
  • ○○はどうして載ってないの?こういうのがあればよかったのに。
    →ツイートは削除できても、うちのマシンのテキストファイルは消せないよ


オンライン版

@brsyweが、以下のURLでPDFを公開しています。興味がある方はどうぞ。
http://home1.tigers-net.com/brsywe/mikutter.html

まとめ

冒頭で、mikutterごときがと書きましたが、そもそも本を出していいソフトウェアの最小規模なんてものは存在していなくて、イベントに行けば規模にかかわらず割と居るものです。反省点もいろいろありましたが、今回はそのお陰でマニュアルもかけたわけで、やってよかったです。こういった機会を与えてもらえてとても感謝しています。

早速三年目のはじめから新しいことができました。今年一年もいろいろやっていきたいですね。

2012年1月15日日曜日

#mikutter 0.0.4, 0.1 rev.642


  • 0.0.4
    • Twitter APIのレスポンスコードが401だった場合の挙動の変更
  • 0.1
    • 画像プレビュー機能でクラッシュする場合があった
そういえば、trunkのほう(0.1)を使ってる人は、アイコンのキャッシュの置き場が ~/.mikutter/icon から、 ~/.mikutter/cache/icon に変更されました。前者のディレクトリは今のところ自動削除されないので(削除するようにしようかなぁどうしようかなぁ)、気になる人は消しましょうこんなこと言わなければ気にならなかっただろうけどな

RubyGtk 1.1 がリリースされましたね。バグとメモリリークの修正がメインということで、確かにmikutterでも長い間計測すれば効果があるように見受けられます。よかったですね。今は個人的にはダークマターをあれするのがあれなのであれですねどね

2012年1月10日火曜日

#mikutter 0.0.4, 0.1 rev.638


  • 0.0.4
    • メモリリーク改善
  • 0.1
    • アイコン関連・画像プレビュー関連でクラッシュする問題を幾つか修正
年末にポチった加湿器とミクのフィギュアが届きました。
かわいいですね(訳:特に言うことがない)

2012年1月3日火曜日

#mikutter 0.1 rev.628


  • アイコンのキャッシュの持ち方を変更
    あんまりTLに出てこない人はファイルにキャッシュしないようにしました。また、前回のスナップショットにあったいくつかのバグが修正されています。
    • コネクション数を削減
      この変更で、低速回線・不安定な回線での動作が改善されます。
    • 画像プレビュー機能の画像サイズがうまく変更されないバグ
  • あけましておめでとうございます
あまり変更がないのは正月だからだと思った?残念!いままでどおりでした!

ヾ(@⌒ー⌒@)ノ

年末は実はずっとダークマターと戦ってました。6割くらいHP削りました。でもあと変身を何回残しているかはわかりません。年始は酒を飲んでました。今も飲んでます。
もうご挨拶は元日にしたけど、ことよろおねがいします。

2012年1月1日日曜日

mikutter 二年目

あけましておめがいします。

(以下、2011年の年末に書いていた文章なので、ここでいう「今年」は2011年のことで す。)

一昨年の12月25日にmikutterが書き始められました。去年もいろ いろ振り返っていたので、今年も振り返ってみましょう。

1 Twitterに起こったこと

1.1 機能追加

Twitterには今年もいろいろな機能が追加されました。今年追加変更された 機能の中で、特にmikutterにとって重要だったのは、だいたいこんなところ かな(mikutterにとって割りとどうでもいいことは書いてません。あと忘れ てるのありそう、わりとどうでもいいこととか)。

1.1.1 エンティティ

ツイートにscreen_name、ハッシュタグ、URLが入っていると、その情報が JSONオブジェクトで返ってくるようになりました。内部的な話なんだけど、 これが今思えば短縮URLやマルチメディア投稿機能の伏線だったわけか。

1.1.2 短縮URL

全部のURLがt.coで短縮されてしまうようになったのは記憶に新しいです ね。最近では短縮URLでも多重に短縮してしまうので余計に話がややこし くなっています。
mikutterは、bit.lyだと字数が長すぎて多重短縮されてしまうからj.mpに 対応しましたが、すぐさま字数が関係なくなったので、現在長さの計算式 をいじる方向で考えています。

1.1.3 アクティビティ

8月くらいにアナウンスがあったかと思いますが、ようやく解禁されまし た。mikutterは現在、アクティビティ情報がリアルタイムに取得できる Streaming APIが出たらぜひ対応したいと思っていて、準備を進めていま す。

1.1.4 マルチバイト文字ハッシュタグ(日本語ハッシュタグ)

いつかあったけど誰にも使われなくて消えていったような…?と思ったん ですが、大喜利とかに利用されていて、今では毎日見かけますね。アニメ 実況とかにも使われているのを見ると、時代が変わったんだなぁと思いま す。
唐突に実装された機能ではありますが、mikutterは先にエンティティに対 応していたため、アップデートしなくても日本語ハッシュタグを識別する ことができていました。他のTwitterクライアントは日本語ハッシュタグ 対応のために緊急アップデートをしていたので、mikutterくらいしかエン ティティを使っていなかったことがわかりましたね。Twitter信用されて なさ杉ワロタ

1.1.5 マルチメディア投稿機能

ついにTwitterが画像を投稿する機能を自前で提供するようになりました。 いままではサードパーティのサービスにマルチメディアファイルをアップ ロードして、それに対するパーマリンクをツイートすることで、擬似的に 投稿していましたが、ツイートに画像を含めることができるようになった わけです。
これ、実はかなり画期的なことじゃないかと思うんですが、ユーザの使い 勝手的には特に変わってないし、未だにみんなTwitpicとか使ってるしで なんだかぱっとしませんね。ただ、Twitterを使うとアップロードが速い とか、自然に一個のサービスにまとめられるとか、利点はありますね。
iOSから気軽にアップできることも人気を後押ししていて、現在Twitter上 では一番使われている画像アップロードサービスにまでなったようです。

1.2 まわりのこと

Twitterの周りで起こったことを、Twitter視点、またmikutter視点で見て いきます。

1.2.1 震災

今年の3月11日にあった震災では、災害時の通信手段としてTwitterが見直 されました。マルチバイト文字ハッシュタグは、災害時の情報交換を円滑 にする意味も込めて実装したそうですまったくそんなつかいかたされてな いがなpgr。現在でも、震災に関連することを議論するのにTwitterが使われ ていることがあるようですね。
実はこのあたりの時期は、私はデスマ中で、家には全然いなかったので、 mikutterがどの程度役に立てたかはよくわかっていません。ただ、 UserStreamの流速が尋常じゃないことになっていたのは記憶しています。 東京電力の電力使用量をmikutter_botに喋らせるプラグインとか書いたの をなんとなく覚えています。使った人いたんだろうか。

1.2.2 UserStream

昨年末に実装されたUserStreamが漸くこの1年で当たり前のものになって 来ました。ツイート数も平均して増加傾向にあるようで、チャット的に使 う人が増えた印象です。またイベントが通知されるようになったから、 いままでよりもイベントが頻繁に発生するようになりました。個人的には、 いままでは毎年1600favづつくらいされていて、2011年のはじめには 4000favedくらいあったのですが、現在は28万favedくらいあって、今年は平年より17250%くらいfavedイベントが多く発生していたことがわかりました。
200倍くらいの情報をさばくTwitter本当にすごいですね。

2 mikutterに起こったこと

mikutterにも様々な機能が追加されました。といいたいところですが、今年 は去年適当にやりすぎた尻拭いをやっていた感が大きいですね。しかし、全 部ではありませんが、コードの掃除はかなり進んで、メンテナンスしやすく なったので良かったです。多分自分がもっと暇だったら1から書きなおすと か言ってたんじゃないでしょうか。

2.1 本体

実はmikutter本体がどれくらい進化したかというと、項目数はそれほど多 くないですね。最低限の機能は揃ったので華やかなコミットはそうそうな くなってきたということでもありますね。また、今年は個人的に割りと忙 しい一年だったので、単純にアクティビティが下がったということもあり ました。

2.1.1 タイムラインのレンダリング方法の変更

最初、mikutterを作成したときは、UIに妥協したくない(リストビューカッ コ悪いプークス)と思っていて、とりあえずこんなかんじだよね、とツイー トごとに適当にウィジェットをパッキングするプロトタイプを書きました。
悪いことに、これがずっと使い続けられることになってしまったのです。 それがボトルネックになっているのは火を見るより明らかで、レンダリン グを妥協せずにどうやったら十分高速に動くのか、模索していました。
紆余曲折を経て、5月にリストビューとcairoを使って、リストビューの高 速性とcairoの自由度両方を兼ね備えたレンダリング方法を採用し、20倍 程度の高速化を実現することが出来ました。非効率なプロトタイプからで 20倍なのに最近のブラウザさんとかどうやったら毎回あんなに早くなった というベンチマークを出せるんですかね(
ともあれ、この変更のおかげで、それまでのmikutterは大体100人もフォ ローしていると実用できませんでしたが、もっと増えても全く問題なく使 えるようになりました。
最近ではこの実装に関する深刻なバグはほぼ取れており、漸く普段使いが 出来るレベルになったと思います。

2.1.2 カスタマイズ性

拡張が更に自由になりました。例えば新しく実装された「mikutterコマン ド」は、プラグインが提供する機能を、コンテキストメニューやショート カットキーなどにユーザがマッピングすることができる機能です。 他にも、イベントフィルタの積極的な利用、タイムラインの中に任意の描 画領域を持つことが出来る機能など、カスタマイズ性はこの一年間で飛躍 的に上がりました。

2.2 ユーザ/コミュニティ

2.2.1 開発の協力者

パッチを送ってくれるとか、mikutterコアをハックしてくれる人がでてき ました。 また、プラグインもたくさんの人が書いてくれるようになりました。プラ グインをmikutter上から探してインストールできるmiku storeも計画中 で(止まってま)す。

2.2.2 いろんなディストリのパッケージになった

まだ開発版にも関わらず、様々なディストリビューションで、公式・非公 式のリポジトリにパッケージが用意されています。正直把握しきれていな いのですが、どれもmikutterを気に入ってくれた人がやってくれているこ とです。

2.2.3 ユーザがとても増えた

最近は、Windowsを使っている人でもmikutterを使用したいと言ってくれ ていることがあります。すべてを自分で用意すれば可能なんですけどね。 もともと、Linuxに良いTwitterクライアントがないことを理由に作り始め たmikutterです。実際にはアラばかり目立ちますが、Twitterクライアン トが飽和状態なWindowsのユーザが羨んでくれるというのは、なかなか嬉 しいことではないでしょうか。

3 今後

2012年はこうなる、みたいな。保証はしません

3.1 Twitter

アクティビティ機能は、一部でストーカー機能とか言われていますが、じ きに当たり前のものになってくるでしょう。mikutterにもこれは取り込ま れるでしょう。mikutterは、アクティビティ機能をフルに活用できるTLを 持った数少ないTwitterクライアントの一つではないかと思っています。も ちろんmikutterのUI自身にも手を入れる必要はあるでしょうが、、かつて 無いTwitter体験でもう一度私たちをごにょごにょしてくれることでしょう。

3.2 mikutter

いい加減、1.0ですかね。1.0にするためには、ダークマターをはじめとした 残り幾つかの難解なバグを取る、リリースまでにどうしても書きなおす必要 がある部分があるなど、いろいろと大変です。しかしバージョンなんて言っ た者勝ちなので、どこかいいタイミングでやってしまいます。ただの数字 ですから、上げても何も変わりませんしね。
また、依存しているライブラリのバグの影響を受けていましたが、最近では Ubuntuの環境で新しいRubyが漸く使えるようになり、環境自体にバグがある といったことは減って来ました。mikutter自体もRuby1.8のサポートは取り やめ、安定して動作するようになってきて、いよいよ1.0の時が来たような 気がしています。Ubuntu 12.04が楽しみですね

4 まとめ

2012年も亀進行でぼちぼち適当にやっていきたいです。よろしくお願いします。