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

2011年6月19日日曜日

#mikutter 0.0.3.9

最近働きっぱなしで、会社にきのこが生えてしまったよ…もういやだ…。

追加
  • なし
修正
  • 日本語で検索できなかった
  • 日本語でgoogle検索ができなかった
  • 検索文字列を入力中に、つぶやき用のショートカットキーが発動してしまっていた
  • メモリリークを随分マシにした
  • 自分を認証していない鍵付きアカウントのつぶやきを取得しようとしたらAPIを食い尽くすまでリトライし続けていた
  • 一部プラットフォームでサウンドが鳴らない不具合
今回はバグ修正しかしていないwwwwwwwwwちょっとへんなハックしたから逆に増えてるかもwwwwwwwwwwちゃんとテストしたけど自分信用できないwwwwwwwwwwユニットテストも書けない部分とかぶっちゃけ弄りたくないよおおおおwwwwwwwwwwwwUIいやだあああよおおおおwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworz

もっと安定させていきたいですね!!!ヾ(@⌒ー⌒@)ノ

mikutterプラグインから使う並列処理・遅延処理のユーティリティ

mikutterでプラグインを作ると、時間がかかる処理をしたくなることが稀によくあるので、そんな時に便利そうなmikutter内部で使えるクラスなどをまとめました。Ruby標準のThreadなどは使えるけど省略

mikutterのThreadによる並列処理の考え方

現在のRubyでは、複数のThreadによる並列処理をしても、単一のプロセッサで複数のThreadが時系列で切り替わるだけなので、本当の意味で並列処理されるわけではないし、処理が速くなるわけじゃあない。んで俺は頭が弱いので、並列処理なんてしたら基本的にぽぽぽぽーんしてしまう残念な頭をしているので、極力使わないようにしています。

!!!触らぬ神に祟なし!!!

ということですね。
積極的に使う数少ない例外ケースは、ネットワーク通信。サーバの応答待ちの間、シングルスレッドなら他の処理をブロックしてしまうけれど、他のスレッドでネットワーク通信をすればブロックされることはないと。
また、mikutter内ではメインスレッドでしかGtk関連の操作をしてはいけないことになっています。つまり
メインスレッド → UIの処理、すぐやるべき処理
その他スレッド → 通信など
という役割になっています。だからメインスレッドであんまり時間がかかる処理はしないように心がけましょう!

Twitter APIを叩くためのメソッドは、メインスレッドで呼ばれるとクラッシュするようになっています。又、Gtk関連の一部メソッドも、メインスレッド以外で呼び出すとクラッシュするようになっています。

並列・遅延処理のためのメソッドいろいろ

そんなmikutterのための並列処理などのためのお役立ちメソッド|クラスたち。

コンストラクタに渡したブロックをあとで実行する。あとでというのは、そのうちヒマな時にやるということで、そんなに即時性が重要じゃない処理に使う。
Delayer.new{
  # Do something
}
ブロックは登録された順番に呼ばれる。また、必ずメインスレッドで呼ばれる。

Threadとほとんど同じだけど、別々のSerialThread同士は順番に実行され、同時に実行されることはない。Delayerだとメインスレッドをブロックしてしまい、UI操作に支障をきたす可能性がある処理につかう。一つのThreadを使いまわすので、Threadが増えない。
SerialThread.new{
  # Do something
}

RubyでHaskellみたいな遅延評価をするためのもの。ちょっとへんなのもあるけど。
ブロックを渡して使う。戻り値は、ブロックの実行結果なんだけど、ちょっとブロックの実行するタイミングが違う。

lazy
遅延評価オブジェクトを返す。初めてこのオブジェクトにたいしてメソッドが呼ばれたときに、1度だけブロックを実行する。
a = lazy{ fact(156) }
b = lazy{ fact(39) }
p b
上の例だと、39の階乗が出力されるけれど、実際に計算されるのは表示されるとき。156の階乗も一見計算しているようだけど(a)、使われていないので計算されない。

everytime
lazyと殆ど同じだけど、メソッドが呼ばれるたびに毎回ブロックを実行する。

parallel
lazyは最初に必要になったときだけど、parallelはすぐに別のスレッドでブロックを1度だけ実行する。実際に値が必要になったときに、まだ実行が終わっていない場合は、ブロックの実行終了まで待つ。

atomic
グローバルなMonitorのインスタンスのロックを取得してからブロックを処理する。ひとつしかMutexがなければデッドロックなんてないんや原理主義者のために用意されている。コアで使うためにと思って用意しました
atomic{
  # Do something
}
イベントが処理されるスレッド

mikutterのイベント(PluginPluginTag)は、必ずメインスレッドから呼ばれます。なのであんまり時間のかかりそうな処理はしないほうがいいです。
一方、イベントフィルタは、Plugin.filteringを呼んだ時に直ちに実行されるので、どのスレッドから呼ばれるかは不定です。つまり、フィルタは特にマルチスレッド処理に注意!ということです。

まとめ

mikutterで処理のタイミングをずらすためのユーティリティをまとめました。また、スレッドの扱い方の暗黙のルールを明文化しました。

2011年6月12日日曜日

#mikutter 0.0.3.8

今回からWeeklyリリース(snapshot)を、mikutterのサイトのDownloadからDevelopの項目に移しました。初めて使う人が、文章を読まずに単純な数値比較でWeeklyリリース版をダウンロードしてしまう事故を避けるためです。その他のバージョンは、今までどおりDownloadからダウンロードできます。

http://mikutter.hachune.net/develop

追加

  • 通知関連のイベントの追加。これによって、以下のプラグインが追加されました。その他については後述
    • alsa - サウンドを鳴らすプラグイン
    • libnotify - libnotifyを使って通知を表示するプラグイン

修正

  • 規制されたときにクラッシュする不具合
  • 付属のJSONライブラリのバージョンが古く、一部環境で問題が出ていた
  • 設定が正常に保存されない不具合
  • リンク位置がずれる不具合
  • 一部APIのキャッシュ機能
  • ショートカットキーの編集でクラッシュする不具合
いやー、0.0.3.9が0.0.4にならないかなーとか思ってたがなかなかそうもいきませんねぇヾ(@⌒ー⌒@)ノ
0.0.2のようにバグを潰す為に.12くらいまで行ってしまうのだろうか。このバージョン番号についても0.0.4以降ちょっと変わるんだけど

通知プラグインを小分けにしたおかげで、特定のプラットフォームでは音とかが鳴らなくなったと思います。そんな時は以下のプラグインを入れてみましょう

https://github.com/toshia/mikutter-win32sound - Windowsでサウンド鳴らす
https://github.com/toshia/mikutter-sdl - SDLでサウンド鳴らす

これらのプラグインの要領で、手軽に通知やサウンド関連を拡張できるようになりました。ニッチな環境でmikutterを使っている人はチェックだ!

折角高速化できたところなので、このタイミングでぜひとも安定させていきたいところですね!!!当分はバグをとり続けることになるかなー。今バグチケット21個もあるんだけど^p^

2011年6月5日日曜日

#mikutter 0.0.3.7

追加

  • Twitter公式画像アップロードサービスを使ってアップされた画像のプレビュー機能
  • Twitter APIで短縮URLの展開形が取得できた場合、それを利用する

修正

  • タイムライン上のリンク文字のリンクの位置のずれ
  • メモリリークをちょっとマシにした
Twitterが画像アップロードサービスを自分で始めちゃいましたね。entityにそれがくっついてくるとのことで、急遽エンティティを読むようにした。それから、どうもentityはOAuth通さないとくっついてこないようで、今のmikutterの実装だとUserStream、home_timeline、mentions経由で取ったものでないとentityがない、つまり公式画像サービスを使ってアップされた画像が展開できないと。まぁブラウザで開けるんだけどね。

とりあえず日曜日になったから上げてみたものの、メモリ削ってる途中なので、相当重くなってますね。このところ時間が取れないから0.0.4は梅雨明け以降かな…