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

2013年4月20日土曜日

#mikutter 0.2.2.1211 pre1

mikutter 0.2.2 テスト版を公開します。というか内部スケジュールが押してしまってこれ以上延期するといろいろ問題があるので…。主な変更は前に先走って投稿したエントリをご覧ください。
http://mikutter.blogspot.jp/2013/03/mikutter-022.html

簡単にまとめます。

  • 機能追加・仕様変更
    • 実績機能
    • ショートカットキー設定のUIの改善
    • デーモンモードを試験的に実装
    • bundlerを使って使用しているライブラリをインストールできるようにしてみた
    • プラグインのGemfileに対応
    • ふぁぼ・リツイート数をAPIから取得するように変更。
  • 内部変更
    • プラグイン・イベント周りのコードを刷新
    • プラグインのロード処理を大幅に変更。依存関係を満たしておらずロードできない場合は警告を表示するようにした
    • サウンドを鳴らす方法を拡張できるようにした
    • 高速化
今回から、バージョンの最後の桁はSubversionのリビジョン番号ではなく、ビルド番号になりました。mikutterの開発を始めてから経過した日数です。そんなにリビジョン番号と離れていなかったので違和感もないし、ぶっちゃけどうでもいいことです。今回公開したのは1211で、実は前に1201を公開したけれどアナウンスしませんでした。

テスト版なので、起動する前には~/.mikutterのバックアップを取っておいてください。実装したかった機能は残ってるけどだいたいバグは取ったのでリリースは近いか(フラグ)。

2013年4月6日土曜日

THE DAY

今年も、4月1日を無事に終えることができた。去年よりも多くの反応があり、ユーザの増加を実感した次第である。

四年目
あなたは何回mikutterと共にエイプリルフールを超えただろうか。エイプリルフールにアイコンを変更するのは今回で4度目だ。一度目は2010年。あの頃は開発が始まってまだ3ヶ月しか経っていなかったし、まだあまり時間をかけていなかったので、Twitterクライアントとして、ほとんど使用には耐えなかった。当時存在した数少ないユーザとは、たった16種類のアイコンで大いに盛り上がったのを今でも4年前の事のように覚えている。しかし、このいたずらを快く思わない人もいた。

mikutter開発の動機
初音ミクはかわいい。かわいいアイコンは素晴らしい。初音ミクアイコンは、考えうる最高のアイコンである。しかし現実はどうだ。ほとんどの人が初音ミクのアイコンを使っておらず、初音ミクアイコンの人をまとめたリストまで見られる。嘆かわしい限りだ。
アイコンを初音ミクにしないがために人々の心はすさみ、TLでは諍いが絶えず、Togetterは常に炎上、ついに運営チームの心も蝕まれ、サードパーティを排斥しはじめて久しい。これらはすべて、人々の心にミク分が不足していることが原因である。
このことを2009年にすでに予知していた私は、なんとかこの滅亡の戯曲の台本を書き換えようと試みた。そう、つまりクライアントサイドでアイコンを書き換えるのだ。mikutterが描こうとした世界は素晴らしいものだったが、私の声はTwitterに対してあまりにも小さすぎた。

約束の日
それから一年後、またエイプリルフールが訪れた。ユーザ数は40倍近くに増え、アイコンも128種類に増やした。やはりユーザが増えるとわかってくれない人もいる。ユーモアを必要条件に掲げているのに、ユーモア欠乏症患者は概して日本語が読めないので、平気で使いやがられるようだ。
だが、ここで私は数人の奇妙なケースを目の当たりにした。去年disっていた人が楽しんでいるではないか。彼らは心を腐らせていたにも関わらず、ふぁぼられる度にミクの声に心を浄化され、人の心を取り戻しつつあったのだ。
この時私は初めて、mikutterを作ってよかったと思えた。開始から一年を超えて、漸く私は、無意識にしか自覚出来なかったmikutterの真の目的を自覚することができたのだ。私はこの日を約束の日と定め、来年のその日のために早速一年のロードマップを打ち出した。

本質
私はもともとTwitterクライアントをつくろうと思ったのではなかった。ではなぜmikutterが今の形になったのだろうか。全ては約束の日のためである。一人でも多くの人に、心を取り戻して欲しい。もう「手遅れ」な人もいるかもしれない。しかし、「ておくれ」な人も多い。きっと彼らと来年はともに笑いあえることを信じて、私はキーを打ち続けている。
mikutterの本質はTwitterクライアントでは断じてない。約束の日のための単なる釣竿に過ぎず、ユートピアを映し出すスクリーンに過ぎない。あの便利な機能も、最適化も、全部エイプリルフールである。この間数年触っていなかったCで書かれたruby-gtk2のコードに必死の思いでパッチを投げたのもエイプリルフールのためである。つまり、Twitterクライアントとしての側面は単なる約束の日の準備であり、約束の日のタイムラインこそが、mikutterなのである。ユーザである(と、あなたは思い込んでいるのだろう)あなたたちは、私の手の上で踊らされていたのだ。

失敗
今年の約束の日は、一見無事に成功したように見える。去年同様、フィルタでほとんどのネットワーク経由の画像読み込みを差し替えた。そのことによってTwitterBirdも姿を変えることになったし、mikutterコマンドのアイコンも変わったが、癒されるので由とした。同様の理由で、昨年好評だった、通知のアイコンがエイプリルフールのままになる不具合は残しておいた。
正直に告白すると、私は今回やってはならないミスを一つ犯してしまったのだ。それは、環境によってある人のアイコンの見え方が異なる場合があるというものだ。判明したのは3月の終わりの方で、これに気づいたときはもうmikutterは終わったと思った。
しかし、やるしかない。問題を修正し、入念に確認したあと、すぐにそれっぽい不具合をでっち上げて、さもすぐアップデートしないとデータの破損を引き起こす可能性があるかのような虚偽のリリースノートを書いた。約束の日はmikutterにとって最重要と言うよりもmikutterの全てだ。そのためにはリリースノートを偽ることも、1コミットで2つの変更をすることも厭わない。全てを秘密裏に行い、その日を迎える必要がある。
今年は会社に泊まることはなく、自分の目で全てを見届けることができた。大きな失敗はあったが、去年以上に多くの人が楽しんでくれた。最初はわけがわからないと言っていた人も、1日が終わる頃には、ミク以外のアイコンに違和感を覚えるほどにまで精神を浄化されていた。今年もmikutterがその目標を達成できたという意味では、今年も成功したといって良いだろう。

手段の目的化
この一年、私はTwitterクライアントを作ることを目的にしてしまっていたのではないか。こんな機能が必要だ、こういうUIが良い、最近のデスクトップ環境のUXとの相性は…。もちろんそれは魚を釣るために必要なことだ。しかしそれはあくまでも餌で、本来の目的ではない。Twitterクライアントなんてどうでもいい。品質なんてある程度でいいんだ。そこがブレたから、守りの開発になった。何をやるにも違和感があった。そしてミスを許した。ユーザに対しても失礼なことだし、何よりmikutterがかわいそうである。

4月1日、自らが創りだしたTLに、自らの魂が浄化されるのを感じた。そうだ、これだよこれ。これがmikutterなんだ。Twitterクライアントではなく、mikutterを創っているんだ。ユーザを増やして、どこにも初音ミクなんて書いてないのに「ミク要素がない」と言った奴らに目に物見せてやるんだ。そういう思想的バックボーンがあったから、Twitterクライアントが飽和状態のWindowsのユーザでさえ、mikutterを羨むんじゃないか。

反省
先に一つだけ言っておきたいことがある。今年は直前になって、過去のエイプリルフールエントリ「約束の日」「謝罪」のリンクをTwitterに貼る人がいたが、これはやめていただきたい。mikutterのユーザは私も驚くくらい増えている。新参者がこのことを事前に知ることはできるだけ避けたい。

ではどれくらいユーザが増えたのだろうか。正確な数はわからないが、mikutterは約束の日のために、3月からサーバ上から当日のために画像を収集する機能が備わっている。そののため、サーバのログを見れば、おおよそのユーザ数をつかめるのだ。例年通り、統計データだけ公開する。

ユニークIPアドレス数 1989
当日ユニークIPアドレス数 332
3月ユニークIPアドレス数 1897

肝心のユーザ数の正確なところがわからないが、ユニークIPアドレス数というのが参考になる。勿論、家の他に学校や職場、モバイル回線でも使う人なら多重にカウントされてしまうので正確な数ではないが、例年と比べると明らかに増加傾向にある。



約2000なので、少なく見積もっても1000くらいはいきそうだ。10万トークンの上限を心配する人もいたが、これを見る限り、全く問題は無さそうだ。

ところで、0.2.1からDisplay Requirementsに対応したことで、Twitterの鳥をタイムラインの下に表示しなければならなくなった。実はこれはライセンス等の問題でmikutterには同梱されておらず、mikutterのWebページのサーバからダウンロードしてきているのだが、ついでにログを集計してみたところ、1736という数字が出た。こちらはエイプリルフールと違って、同じ設定ファイルを使いまわす限り必ず一度しかアクセスしないため、テザリングなどで頻繁にIPアドレスが代わる人を多重カウントしないのでより正確かもしれない。今年の予想人数(上のグラフ)はこの数字を採用した。

共犯者
今年使用したアイコンは、半分は @penguin2716 さん、もう半分は新たに @catina013 さんに描いていただいた。私も10枚ほど描いたが、合計256枚のアイコンを提供してくれた二人にはいくら星謝しても足りない。この場を借りて改めてふぁぼりたい★。

まとめ
当日はトラブルもあったが、概ねうまく行ったと私は思っている。しかし成否はあなた自身が決めることだ。今年も楽しんでもらえたなら何よりだし、例年または開始時はうっとおしい、区別がつかないと否定的な見方をしていた人が楽しめるようになったならこれほど喜ばしいことはない。最後まで人の心を取り戻せなかった人もたくさんいただろう。そういう人も、mikutterに触れていくうちに、必ず人間に戻れると私は確信している。

最後に、念のため書いておくが、以上の内容は全てエイプリルフールである。

2013年3月30日土曜日

プラグインに実績を追加する

mikutter 0.2.2から実績機能が追加されます。

これは、皆さん分かってると思いますが achievement というひとつのmikutterプラグインが提供している機能で、 achievement APIを使えば他のプラグインから実績を新しく追加することができます。

どんな風に実績を追加するか、実際のコードを見てみましょう。

これは、5favされたら解除される実績、「red_fav」を追加するプラグインです。実際にこれをインストールして起動すると、4行目の :hint の値がアクティビティに表示されます(他に未解除の実績があれば、そちらが表示される可能性もあります。表示される実績は毎回ランダムです)。ここに解除の仕方を書いておけば、ユーザは起動する度にそれを一定の確率で目にするので、実績を解除する手助けになります。

defacievement

実装についてもう少し詳しく見てみましょう。defacievementというプラグインメソッドが今回の肝です。

第一引数はスラッグ、第二引数には以下の値を指定します。
  • description ... 説明。現在は見返す方法がないので、用意されているだけ
  • hint ... 起動時にアクティビティに表示されるヒント。hiddenがtrueなら必要ない
  • depends ... 前提実績。実績のスラッグをシンボルの配列で指定する。指定された全ての実績が解除されていないとヒントが表示されない。
  • hidden ... 隠し実績。trueなら、起動時にランダムに表示されるヒントの抽選対象に入れない。
defacievement のブロック

ここには実績を解除するための条件を記述します。このブロック、そもそも実績が解除された状態では実行されません。解除するための条件なので、もう解除された状態では必要がないのです。
この例では、「on_favorite ...」という部分です。この中もプラグインの一部なので、こうやってイベントリスナを設定することができるのです。

Plugin::Achievement::Achievement

defachievement ブロックは一つの引数を取ります。これは実績オブジェクト(Plugin::Achievement::Achievement)のインスタンスです。実績の主要な情報を得たり、実績を解除するために使います。defachievementを呼び出す度にインスタンスが一つ作られる感じで、普段あまり気にするものではないです。

実績解除

Plugin::Achievement::Achievement#take! を呼びだせば実績が解除されます。このメソッドが呼ばれると、直ちに defachievement ブロック内でセットされたイベントリスナやフィルタ(例ではon_favorite)が解除されます。

それから、前提実績をチェックして、まだ解除されていないものがあればそれを待ちます。これは、前提となる実績より先に現在の実績が解除されるのを防ぐためです。この状態で前提実績が解除されたら、すぐにこの実績も解除されます。

そうやって実際に解除されたら、 achievement_took イベントが発火されます。

achievement_took(Plugin::Achievement::Achievement)

実績解除のメッセージはこのイベントをachievementプラグインが受け取った時に表示されるようになっています。実績解除をトリガーに何かをしたいということはあまり無さそうですが。

実績の例

mikutterの標準の実績は全て achievement プラグインに集約されています。以下のプラグインの100行目あたりから後は、全て実績の定義です。

http://dev.mikutter.hachune.net/projects/mikutter/repository/revisions/develop/entry/core/plugin/achievement/achievement.rb

実績を見てしまうとネタバレになるのですが、それぞれが全く異なった方法で実装されているので、これだけで例としては十分でしょう。このファイルの前半の方は、実績プラグイン自信の実装です。このプラグイン、mikutterプラグインとしても結構興味深いのですが、それについては別の機会に触れたいと思います。

ヒントのタイミング

最後に、一応、実績のヒント(hint)がユーザに提示される条件を説明しておきます。毎回mikutterが起動される度に、

  • 未達成で
  • hidden が偽か未指定
の実績のうち、ランダムに一つを選出します。その実績に上記条件に当てはまる前提実績があれば、再帰的にそれを辿って、最終的に一つだけ実績を選んでそのhintの値を表示します。

前提とされている数が多い実績のほうが、表示される可能性が高くなりますね。前提実績が解除の邪魔をしているような実績のヒントは表示されません。
また、ユーザには、mikutterを再起動する以外に新しいヒントを得る方法がありません。Twitterクライアントの使い方なんて一気に勉強するものではありません。ゆっくり覚えたらいいし、もっと言えばTwitterなんてしてないでとっととレポートを書くべきです。mikutterのせいで単位を落としたって、私にはふぁぼることしかできません。

まとめ

使えそうで使えない、楽しそうで案外どうでもいい、実績機能について紹介しました。かなり変な機能なので、構想はかなり前からあったにも関わらず、0.2.1では導入を見送っていました。DRを言いたかっただけです。

2013年3月27日水曜日

#mikutter 0.2.1.1141


  • 主にRuby 2.0.0 で、サードパーティプラグインを入れていると起動しない又は設定ファイルが破損することがある問題
  • Ruby 1.9.3 でクラッシュすることがあった
なーにが0.2.1最後のリリースになりますじゃ。

設定が破損する問題はRuby1.9系でも顕在化してないだけで存在していました。.mikutter以下を守るためにさっさとアップデートしましょう。この問題は、過去リリースした全ての mikutter に存在し、全ての環境に影響があります。

バグフィックスが相次いで申し訳ないですが、ておくれにならないうちにアップデートしたほうがいいです。お友達にも教えてあげてください。

Ruby 2.0.0
私の使っているArch Linuxにも来たんですが、結構これで起動できなくなった人がいらっしゃったようで、こんなにユーザが居るのかと驚きました(←呑気
rcairoとかの調子が良くないようですね。「undefined symbol: rb_cCairo_Context」とか言われるやつです。時間が解決しそうな問題ではありますが、そういう時は、
$ gem install glib2 --version 1.2.3
$ gem install gtk2 --version 1.2.3
みたいなかんじのコマンドで、RubyGtk2をgemでインストールしてやると良いんじゃないでしょうか。再現できてないのでよくわかりませんが、RubyGtkをgemで入れたら治ったと言ってる人が結構いたので。うまく行ったのを情報共有すれば、インターネットが便利になると思います。

ううん、bundlerを使ったらもう少し楽になるんだけど、残念ながら0.2.2からなんですよね(丁度そこの作業中)。

RubyGnome2 1.2.4
mikutterの使っているRubyGnome2の最新版がリリースされました。が、このバージョンには不具合があって、mikutterが起動できません。うっかりアップデートしないように注意してください。もししてしまった場合は、過去のバージョンを使用する方法が用意されているでしょうから、1.2.3以前に戻してください。現在問題の特定と報告をやってもらっているところなので、次で直る可能性もあります。いずれにせよ、このブログでこんな感じでお知らせします。

最近寝ても寝ても眠いんですよね、なんとかならないかな。

2013年3月22日金曜日

#mikutter 0.2.1.1137

  • Ruby 2.0に対応
  • データソース追加系プラグインを導入するとツイートが表示されなくなる問題
  • TL描画時に稀にクラッシュする問題
Ruby 2.0対応をやってみました。Ruby 2.0に上げたいけどmikutter動かなかった…という人はこれを試してね。

0.2.2の開発中に、いくつかmikutterに致命的なバグがいくつか見つかったのでバックポートしました。今のmikutterを使っていてクラッシュしたと言う人はあまりいないでしょうが、何かの拍子にパターン入るかもしれません。さっさとバージョンアップしたほうがいいです。

おそらく、0.2.1のバージョンアップはこれで最後か、次があっても随分後になるでしょうから、特別な理由がなければバージョンアップしたほうがいいです。

2013年3月10日日曜日

#mikutter 0.2.1.1132


  • Activityの幾つかの不具合修正
  • Ruby1.9.3 p392以降で画像プレビューができず、ブラウザで開いてしまう問題
  • 画像アップロードサービスpikuboに対応 (thanks @negi_s)
  • 遅延対策
Rubyの変更によってTwitpicを含む一部サービスの画像プレビューができなくなっていました。早かれ遅かれまっとうなディストリならRubyのセキュリティフィックスならすぐ適用されるでしょうから、すぐにmikutterをアップデートすることをおすすめします。

2013年3月7日木曜日

mikutter 0.2.2の新機能

皆さんごきげんようでし!ついにmikutter 0.2.2の季節がやって来ました!フロントの新機能をサクッと見て行きましょう!
開発者向けの情報は別の記事にします。

実績

新しいプラグイン「achievement」をバンドルしました。「設定を開く」「ペインを作成する」などのアクションを実行すると実績が解除されます。毎回起動する時、まだ達成していない実績があれば、その中からランダムに一つの実績の解除方法をmikutter_botが教えてくれます。

こんな機能を付けた理由は、ユーザと機能が増えてきて、気づかれない機能も出てきたからです。実績を解除していく事で、自然と機能に気づくことができます。実績は達成したら終わりなので、よくある起動時に出るtipsダイアログのように、毎回知ってることをガミガミ言われることはありません。たいした個数はないので、煩わしく感じることはないと思います。え、それを見返したい時はどうするかって?それはもうあるんだけどなぁ。

さらにこの実績、サードパーティプラグインが自由に追加できるようになっています。各機能へのポインタとして使用してもいいし、他にも面白い使い方があるかもしれません。

ショートカットキー

ショートカットキーに、システムで予約されているキーを使用できるようになりました。例えば、タイムラインでスペース、エンター、Ctrl+P等にmikutterコマンドを割り当てることができます。

Windowロールのmikutterコマンドの正式なサポートも開始します。これによって、「設定を開く」がmikutterコマンドになったので、ショートカットキーに割り当てることができるようになりました。

また、最近プラグインを入れすぎてキーを割り当てるのが大変という人に朗報。

はい、インクリメンタルサーチができるようになりました。一番上のテキストウィジェットに文字を入力すると、キーバインドか機能名、または表示されてませんがスラッグの何れかに部分的に一致した行だけが表示されます。「あれ、Ctrl+Sってふぁぼ以外に何か登録していたかな?」という時に使ってみましょう。mikutterでは自分で全てのキーを割り当てられますが、そのせいでわからなくなることも有りました。これで少しは良くなったでしょう。

さらに、ショートカットキーの割り当て画面も変更しました。
コンボボックスを廃止して、表示域いっぱいにコマンドリストを表示するようにしました。先ほどと同じようにインクリメンタルサーチできるようになっている他、ロール毎にカテゴライズされています。こちらも少しは選びやすくなったかな。
ん、キーバインドの下のスペースが気になるって?…君のようなカンのいいガキは嫌いだよ。

サウンド

新しく「sound」というプラグインを導入しました。サウンドプラグイン自体は音を再生せず、サウンドプラグインにルーチンを登録したプラグインの中から、ユーザが使うものを選べるというプラグインです。
OS/ディストリによっては、ALSAが導入しづらく、効果音を楽しめない環境もありましたが、相応しいサウンドサーバプラグインを選べるようになったわけです。

設定ファイルの場所

いままでmikutterは、設定等を全て ~/.mikutter/ 以下に格納しており、これを変更する手段は用意されてませんでしたが、コマンドラインオプションでパスを指定できるようになりました。

# mikutter --confroot=/var/mikutter/

これで起動すると、~/.mikutter/は使われず、/var/mikutter に読み書きするようになります。キャッシュやプラグインの位置だけを指定とかには対応していません。

デーモンモード(仮)

botを作るためにmikutterのフレームワークがつかえるようになりました。

使い方は簡単。普段使っているmikutterとは別の場所にインストールして、 core/plugin内を全て削除します。でも本当に全て消すと役に立たなくなるので、restとstreamingだけ残しておきましょう。これで、ツイートを受信するだけで何もしないbotができました。あとはいつものmikutterと同じで、プラグインをインストールしていくと、いろんな機能をつけることができます。データの蓄積や、おしゃべりbotなども作成できるでしょう。

botとして使う場合は、Consumer Key/Secretを新規取得して書き換えてください。なぜなら、mikutterフレームワークを使って作られたのがTwitterクライアントのmikutterですが、デーモンとして使うという事は、すでにそれはTwitterクライアントのmikutterではないからです。CS/CSは core/config.rb に書いてます。

そう遠くないうちに、mikutterフレームワークを別途配布したいと思っていますが、CK/CSを削除してプラグインを大半削除したものを配布することになるでしょう。

かなりうまく動きますが、まだこの機能は仮実装です。なので、端末からデタッチするなどの機能がありません。興味があれば使ってみてフィードバックをください。

その他

メモリ効率が大幅に改善されました。私自身RubyGnome2プロジェクトにメモリリークを修正するパッチを送るなどかなり力を入れました。また、mikutter自体の実装も一部見直しました。まだ稼働時間に比例してメモリ使用量が増加する傾向はありますが、今までとは比べ物になりません。

とはいっても、改善はRubyGnome2のバグフィックスによるところがほとんどなので、是非1.2.1以降のRubyGtk2を使用してください。

書き忘れていること

分かってたら書き忘れんやろ

試すには

今回から開発用のメインリポジトリをGitに移行しました。現在Subversionは、リリース時にしか更新していないので、開発中のmikutterを試したい人は、WebページからGitリポジトリを探してきてください。

まとめ

mikutter 0.2.2に搭載する予定の機能のうち、実装が終わっていて、且つユーザに関係することを簡単にまとめました。前回と違って、今回は期間の割りには多くの新要素を追加できると思います。正式版の提供は4月前後になりそうです。3月中にプレビュー版が出せるといいのですが。

この年度末は、数年ぶりにデスマーチにならなさそうなので、3月にもかかわらずmikutterの開発を続けています。なんだか3月じゃないみたいですね。ありがたいことに心配してくれる人もいますが、そんな感じなので御心配なく。もうすぐ春が来てしまうので、寒いうちに彼女とデートしてきます。こんな事ばかりしていたらなかなか進まないんだけど、冬のデートっていいですよね。