blogに引っ越しました。非ASCII文字ハッシュタグのはなしなんか今更感のある日本語ハッシュタグが導入されましたねー(厳密には日本語以外もいけるようになったんだけど、このエントリは日本語なのでまぁ)。ここんところフォーラムも何も見てないのでそういう情報入ってきてないので、事前情報があったかもしれないけど寝て起きたらできてたかんじでした。わからんことがあったリンク条件どういう時に日本語ハッシュタグになるのかよくわかってない人が多いですね。これは公式ブログ書いてあるけどつまり最初にスペースorツイートの先頭#か#で始まる日本語とか(記号は不可)スペースか句読点で終わるを満たしていないと、そもそも一文字もハッシュタグとして認識されないというあれ。Twitterクライアントは、24時間以内にアップデートをかけて日本語ハッシュタグに対応してしまった。これはいいことですよね。上に述べたような、長音が含まれてるとハッシュタグとして認識されないというのはどういう扱いになっているんだろう。怪しい挙動だけど、仕様という解釈もできなくはなかった。そもそも最初からハッシュタグに以下のような正規表現を使ってるせいで#.+?\sそもそも日本語だろうと何だろうと全部リンクしてしまうあれなTwitterクライアントも結構ある。同じツイートなのにハッシュタグとして認識される範囲がツイッタークライアントによってまちまちであるというコーナーケースがいくつか存在してるわけですね。mikutterの対応みくったーユーザ「あ、ありのまま今起こったことを話すぜ...。mikutterを立ち上げたら、バージョンも上げていないのに、既にハッシュタグに対応していたんだ、自分でも何を言っているのかry」こんな風に勝手に対応してしまった理由は、俺が事前に情報をつかんでたわけではなく、Twitterにエンティティ情報を元にリンクを張っているからです。Webと全く同じ位置にリンクを貼ることができる。この情報を使っているツイッタークライアントは、Twitterが日本語ハッシュタグのリンク位置を送ってくるようになった瞬間から対応ができてしまっていたということになるわけですね。何かしらのバージョンアップをするということは、そういうことになりますよね。思いつく理由はこんな所かな出来たのが最近なので、対応していないTwitterが言うことなので、信用ならないいろいろと面倒くさい1は既に自前でやっててちゃんとできてるしいいじゃんという話。3は、なんか<>はエンティティエンコードされて送られてきてるのに&はされてなかった気がするんだけどあれナンダヨとか、実は微妙にバグってたりするんじゃねーのとか、まあそのあたり。mikutterには愚かにもこれを信用していて、Twitterが日本語ハッシュタグ対応した時点で、そのルールに合ったものについてはエンティティがくっついてくるようになったので、普通に日本語ハッシュタグがつかえるようになったというわけ。先に述べたような、全角長音記号が含まれているとハッシュタグとして認識されない不具合などまでそのまま反映してしまう(Twitterが治したタイミングで治ったが)。0.0.3.12変更なし修正voterのアイコンにチップヘルプでscreen_nameが出ていなかった。クリックでユーザのプロフィールが表示されていなかったフォロー・フォロワー一覧で、ホイールスクロールができない/statuses/updateを叩くときに、include_entities=1をつけて、自分のつぶやきにエンティティを付けさせるようにしたエスケープされた文字列を適切にカウントしてインデックスを補正するようにしているところですつぶやきがTLから消えた瞬間にリツイートされた場合にクラッシュすることがあるやったねバグが増減したよ!!!前回までのバージョンでは、自分のツイートに対して日本語ハッシュタグが正常に反映されない問題がありました(ほかのひとにはちゃんとみえてる)。このバージョンからは自分の投稿にも日本語ハッシュタグが正常にリンクされます。release2011年7月11日月曜日mikutterにDeferred入れたらどうなるのっとmikutterには実行予約の機能がいろいろある。RubyのThreadもある意味そうだけど、Delayerなんかもそう。0)みたいなもので、用途もウィジェットの更新とかなので被ってる。fail})いやーすばらしい。これはパクらない手はないdeferredは、連続した処理をぼちぼち順番にやっていって、エラーの捕捉もしやすい。http通信のメソッドとかがDeferredオブジェクトを返せば同じようにつかえて便利だなぁ。現在のmikutterでは例えばTwitterAPIを叩くのはPost#call_apiというメソッドを使う。こいつはAPI名とブロックを引数に取って、新しくスレッドを作ってリクエストを発行して、そのスレッドを返す。あとでリクエストが完了したらコールバックを呼ぶ。いう、JavaScriptのXMLHttpRequestだっけ、あれみたいな挙動をしている。スレッドを返す理由は、途中でThread#killを使ってキャンセルできるようにという深遠な理由がある。Deferredを使うとどうなるまず、今回の実験では、Deferredableをincludeした全てのクラスがdeferredみたいに振舞うことにした。これで、以下のオブジェクトが等しくDeferredのように振る舞える。DelayerSerialThreadThreadDeferredのブロックが返す値は、次のnext{}ブロックの引数になるけれど、それがDeferredのインスタンスだったら、それの実行を待ってから次のブロックが呼ばれる。Deferredをネストできる。fail}おなじこと。something}こういう感じで、複数のDeferredableの終了を待てる。今までだったらDelayerとThread両方が終わったら...なんてコードはよう書かなかったんだけど、Deferredableならできますよどうですか!Enumerableにeach_deferとか作っておけば、イベントで大量のつぶやきを受け取ったとき、時々休みながら実行ということができる。ループが長引いたら一旦処理を中断するというあれ。いいんじゃないかなとまあ適当なことを書き散らしたけれど、まあ利点は本家とたいして変わらない。DeferredableをincludeすればどんなオブジェクトでもDeferredになれるので、いろんなクラスのエラー処理をとてもスマートに書ける可能性がありますね。これはコミットせずに様子を見てる。プラグインが書きやすくなるだろうか。自分のツイートの削除時に稀にクラッシュするおおバグ直してるのにチケット数は減らねえぞどうなってやがru!(既知の)バグが全部なくならないと0.0.4ないでとはいえ。