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

2011年7月30日土曜日

#mikutter 0.0.3.14

追加
  • なし
修正
  • 初回起動時にクラッシュすることがあった
  • Twitter APIの不具合に対応
  • mousedownとmousedownで著しく位置が違う場合にもclickが発生している
  • 非フルカラー環境で起動しない
  • 不要なファイルを削除した
  • bit.lyの展開ミスった時にクラッシュする
うわああああああああああああああああああああああああああwwwwバグまだたくさん7月中にリリースできないよおおおおおお^p^p^p^p^p^p^

このままでは8月中に0.0.4いけるか微妙ですね!死ぬ!

2011年7月23日土曜日

#mikutter 0.0.3.13

追加

  • なし


修正

  • 空文字からコンテキストメニューでペーストした後、投稿ボタンが有効にならない

^q^?

^q^≡^p^

/(^o^)\

今回は細かすぎて伝わらないところやってたしそもそもコミット数が少なくてあれ
実はミクの誕生日に0.1にしたいと思っているんだけど、目安として

0.1→既知のバグのうち「バグ」「致命的」レベルのチケットを全て消す
0.0.4→「致命的」を全て消す

というふうに思っているので、0.0.4は一ヶ月前にはリリースしておきたかったね…
(「致命的」の報告が一週間ないバージョンがあれば、それが0.0.4になるので)

んでこのバージョンの上げ方どうよというのは前から言ってるので.4になるまでにはなんとかするというタスクも実はある

2011年7月18日月曜日

非ASCII文字ハッシュタグのはなし

なんか今更感のある日本語ハッシュタグが導入されましたねー(厳密には日本語以外もいけるようになったんだけど、このエントリは日本語なのでまぁ)。
ここんところフォーラムも何も見てないのでそういう情報入ってきてないので、事前情報があったかもしれないけど寝て起きたらできてたかんじでした。
で、いろいろとよくわからんことがあった

リンク条件

どういう時に日本語ハッシュタグになるのかよくわかってない人が多いですね。これは公式ブログ書いてあるけどつまり
  • 最初にスペースorツイートの先頭
  • #か#で始まる
  • 日本語とか(記号は不可)
  • スペースか句読点で終わる
を満たしていないと、そもそも一文字もハッシュタグとして認識されないというあれ。たとえば「#みくったー」は記号「ー」が含まれているのでハッシュタグじゃないです「みくった」の部分だけハッシュタグになるということもないです
(→流石にこの(糞仕様|バグ)は改善されて昨日あたりから「ー」が許されるようになった)

各種Twitterクライアントの対応の差異

大抵のTwitterクライアントは、24時間以内にアップデートをかけて日本語ハッシュタグに対応してしまった。まあこれはいいことですよね。
ただ、上に述べたような、長音が含まれてるとハッシュタグとして認識されないというのはどういう扱いになっているんだろう。かなり怪しい挙動だけど、仕様という解釈もできなくはなかった。また、そもそも最初からハッシュタグに以下のような正規表現を使ってるせいで
#.+?\s
そもそも日本語だろうと何だろうと全部リンクしてしまうあれなTwitterクライアントも結構ある。
つまり、同じツイートなのにハッシュタグとして認識される範囲がツイッタークライアントによってまちまちであるというコーナーケースがいくつか存在してるわけですね。

mikutterの対応

みくったーユーザ「あ、ありのまま今起こったことを話すぜ…。mikutterを立ち上げたら、バージョンも上げていないのに、既にハッシュタグに対応していたんだ、自分でも何を言っているのかry」

こんな風に勝手に対応してしまった理由は、俺が事前に情報をつかんでたわけではなく、Twitterにエンティティ情報を元にリンクを張っているからです。

https://dev.twitter.com/docs/tweet-entities

Twitter的には何文字から何文字目がURLだとか、そういう情報を送ってきている(エンティティ)ので、そのとおりにリンクを張れば、Twitter Webと全く同じ位置にリンクを貼ることができる。
この情報を使っているツイッタークライアントは、Twitterが日本語ハッシュタグのリンク位置を送ってくるようになった瞬間から対応ができてしまっていたということになるわけですね。

エンティティ情報を使っていないのが大多数

何かしらのバージョンアップをするということは、そういうことになりますよね。
ぱっと思いつく理由はこんな所かな

  1. 出来たのが最近なので、対応していない
  2. Twitterが言うことなので、信用ならない
  3. いろいろと面倒くさい

1は既に自前でやっててちゃんとできてるしいいじゃんという話。2は、まあ、はい。3は、なんか<>はエンティティエンコードされて送られてきてるのに&はされてなかった気がするんだけどあれナンダヨとか、実は微妙にバグってたりするんじゃねーのとか、まあそのあたり。

で、mikutterには愚かにもこれを信用していて、Twitterが日本語ハッシュタグ対応した時点で、そのルールに合ったものについてはエンティティがくっついてくるようになったので、普通に日本語ハッシュタグがつかえるようになったというわけ。
だけど、先に述べたような、全角長音記号が含まれているとハッシュタグとして認識されない不具合などまでそのまま反映してしまう(Twitterが治したタイミングで治ったが)。

まとめ

みんなエンティティつかってないんだね…僕テッキリ使ってると思ってたよ…グスン

2011年7月16日土曜日

#mikutter 0.0.3.12

変更
  • なし
修正
  • voterのアイコンにチップヘルプでscreen_nameが出ていなかった。また、クリックでユーザのプロフィールが表示されていなかった
  • フォロー・フォロワー一覧で、ホイールスクロールができない
  • /statuses/updateを叩くときに、include_entities=1をつけて、自分のつぶやきにエンティティを付けさせるようにした
  • エスケープされた文字列を適切にカウントしてインデックスを補正するようにしているところです
  • つぶやきがTLから消えた瞬間にリツイートされた場合にクラッシュすることがある
やったねバグが増減したよ!!!
前回までのバージョンでは、自分のツイートに対して日本語ハッシュタグが正常に反映されない問題がありました(ほかのひとにはちゃんとみえてる)。このバージョンからは自分の投稿にも日本語ハッシュタグが正常にリンクされます。

2011年7月11日月曜日

mikutterにDeferred入れたらどうなるのっと

mikutterには実行予約の機能がいろいろある。
RubyのThreadもある意味そうだけど、Delayerなんかもそう。これはJavaScriptでいうところのSetTimeout(callback, 0)みたいなもので、用途もウィジェットの更新とかなので被ってる。

で、JavaScriptではJSDeferredが便利だ

http.get('some_twitter_api').next(function(){
  // success
}).error(function(){
  // fail
})

いやーすばらしい。これはパクらない手はない
deferredは、連続した処理をぼちぼち順番にやっていって、エラーの捕捉もしやすい。で、http通信のメソッドとかがDeferredオブジェクトを返せば同じようにつかえて便利だなぁ。
ちょっと実験してみましょう。

現在のmikutterでは

例えばTwitterAPIを叩くのはPost#call_apiというメソッドを使う。こいつはAPI名とブロックを引数に取って、新しくスレッドを作ってリクエストを発行して、そのスレッドを返す。
あとでリクエストが完了したらコールバックを呼ぶ。という、JavaScriptのXMLHttpRequestだっけ、あれみたいな挙動をしている。スレッドを返す理由は、途中でThread#killを使ってキャンセルできるようにという深遠な理由がある。

Deferredを使うとどうなる

まず、今回の実験では、Deferredableをincludeした全てのクラスがdeferredみたいに振舞うことにした。これで、以下のオブジェクトが等しくDeferredのように振る舞える。

  • Delayer
  • SerialThread
  • Thread
Deferredのブロックが返す値は、次のnext{}ブロックの引数になるけれど、それがDeferredのインスタンスだったら、それの実行を待ってから次のブロックが呼ばれる。つまりDeferredをネストできる。
ということは、Deferredのブロックの戻り値にThreadとかを設定できてしまう

deferred{
  post.call_api(:api)
}.next{ |value|
  // success
}.trap{ |exception|
  // fail
}

Proc#call_apiの戻り値はThreadなので、本当は以下のように書ける

post.call_api(:api).next{ |value|
  // success
}.trap{ |exception|
  // fail
}

おなじこと。
こうする利点は、whenとかloopとかがつかえることかな

Deferred.when(deferred_1, deferred_2, ..., deferred_n).next{
  // do something
}

こういう感じで、複数のDeferredableの終了を待てる。今までだったらDelayerとThread両方が終わったら…なんてコードはよう書かなかったんだけど、Deferredableならできますよどうですか!

Enumerableにeach_deferとか作っておけば、イベントで大量のつぶやきを受け取ったとき、時々休みながら実行ということができる。つまり、ループが長引いたら一旦処理を中断するというあれ。なかなかいいんじゃないかな

とまあ適当なことを書き散らしたけれど、まあ利点は本家とたいして変わらない。DeferredableをincludeすればどんなオブジェクトでもDeferredになれるので、いろんなクラスのエラー処理をとてもスマートに書ける可能性がありますね。
まだこれはコミットせずに様子を見てる。プラグインが書きやすくなるだろうか。

2011年7月9日土曜日

#mikutter 0.0.3.11

追加

  • なし


修正

  • 起動時に稀にクラッシュする
  • mikutterが起動するプロセスが全てゾンビになる
  • 削除されたツイートへのリプライを表示するとクラッシュする
  • フォロー関係のキャッシュファイルの節約
  • 自分のツイートの削除時に稀にクラッシュする
おおバグ直してるのにチケット数は減らねえぞどうなってやがru!
(既知の)バグが全部なくならないと0.0.4ないで

とはいえ。まだまだデスマが続きそうなので、今夏中に不安定版上げるのは無理ですね工数的な意味で
明日も休出なので今日は気が向いたらなにかやるかな しかし
コミット権限を持っている人を増やしたほうがよい気がしてきた でもそうしたら運用ポリシーどうしたらええのんかわからぬ
自分に害のあるバグとか見つけたらソースコード探ってみたりする人とかいるみたいだし俺のTLポテンシャルあるよ!!!

まあちょっとづつコミットできてるからいつかリリースはできるよ

2011年7月3日日曜日

#mikutter 0.0.3.10

ピャアアアアアwwwww 僕がデスマーチしてる間に時間が2週間も過ぎてたのおおおおwwwwww

追加

  • 起動時は、最後に取得したフォロー・フォロワーをレジュームするようにした
    • キャッシュを大量生産するのでちゃんとゴミ集めしないとなー

修正

  • フォロー・フォロワーが最新の200人しか取得されていなかった
  • ツイートを選択した状態でほったらかしておくとクラッシュしていた
  • URL展開に失敗したときにクラッシュしていた
  • 起動時に稀にクラッシュしていた

投稿遅いことがあるのはTwitterが原因ですのでさっさと直してくださいな、時間がない