mikutterのソースコードをgrepする旅
この記事はmikutterアドベントカレンダーのために書かれたものです.
mikutterとの出会いとか
よく覚えていませんが,1年半くらい前でしょうか.
それまではTwitterにはあまり首をつっこんでいませんでしたが,このクライアントを使い始めてからというもの,
しました.
あまりにもひどい激変っぷりだったためか,下のようなコードがmikutterに残っています.
core/test/test_entity.rb
126 tweet = 'もともとは@penguin2716さんに勧められて始めたついった。そして彼より遅く始めた自分がTwitterにハマり、彼の総ポスト数をすぐに追い抜いたと思ったのですが、今や彼はれっきとしたmikutter廃人となり、ワタシの手の届かぬ領域に到達されました。'
実際のところ,プラグインが簡単に作れるし,UserStreamに対応してるし,
よく落ちるしメモリを食う素晴らしいTwitterクライアントだったのでずっと使ってたわけです.
mikutterが使いにくいクライアントだったらこんな熱狂的なておくれファンは集まりません.
いつからでしょうか,
10.times do |x| Service.primary.post :message => "ぴゃああああああああああ#{" " * x}" end
みたいなことをやりはじめたのは…
しかしながら,mikutterは様々な使い方のできるTwitterクライアントなので,
自分が「こうしたい!」と思ったことは大体実現できます.
きっとそんな魅力にとらわれて,僕は今でもmikutterを使っているのでしょう.
ところで,mikutterのソースコードって面白いよね!
core/utils.rb とかを覗いてみると,こんなメソッドが見つかりますよね.
21 # 基本的な単位であり、数学的にも重要なマジックナンバーで、至るところで使われる。 22 # これが言語仕様に含まれていないRubyは正直気が狂っていると思う。 23 # http://ja.uncyclopedia.info/wiki/Hyde 24 HYDE = 156
mikutterには上に示したようなコードが点在しています.
今回はgrepやfindを駆使していろんなコードを探してみましたので,いくつか紹介したいと思います.
core/utils.rb
mikutterには数学的にも重要なマジックナンバーHYDEが定義されていることは既に述べました.
mikutterではこのマジックナンバーを応用して複数Linkの検出を行っているようですね.
6 if defined? HYDE 7 raise "HYDEが再定義されました。utils.rbを2回Linkしてるんじゃないか?それ> はいけない。すぐにバグをSHOT AT THE DEVILしろ。" 8 # こんなふうにするといいと想います 9 require File.expand_path(File.join(File.dirname(__FILE__), 'utils'))
「複数条件ifなんて誰が使うん…」と思う方もいるでしょう.
しかし,何か理由があって書かれたものなのです.そう信じるのです…
52 # 複数条件if 53 # 条件を二つ持ち、a&b,a&!b,!a&b,!a&!bの4パターンに分岐する 54 # procs配列は前から順番に、上記の条件の順番に対応している。 55 # 評価されたブロックの戻り値を返す。ブロックがない場合はfalseを返す。 56 # なお、ブロックはa,bを引数に取り呼び出される。 57 # 誰得すぎて自分でも使ってないけどどこかで使った気がするなぁ 58 def biif(a, b, *procs, &last_proc) 59 procs.push(last_proc) 60 num = 0 61 if not(a) then 62 num += 2 63 end 64 if not(b) then 65 num += 1 66 end 67 if(procs[num]) then 68 procs[num].call(a,b) 69 end 70 end
「メルト」の歌詞をうっかり忘れてしまった場合でも,mikutterのソースを見れば一発で思い出しますね!!
そうだ,今度としぁさんとカラオケ行った時にこの歌詞で歌おう.
437 # freezeされていない同じ内容のオブジェクトを作って返す。 438 # メルト 溶けてしまいそう (実装が)dupだなんて 絶対に 言えない 439 def melt 440 if frozen? then dup else self end end end
core/miquire.rb
「ミク」でgrepしたらこんなコードにたどり着きました.
いやぁ,なんて分かりやすい説明なんだろう.
10 # ミクってかわいいよねぇ。 11 # ツインテールいいよねー。 12 # どう良いのかを書くとコードより長くなりそうだから詳しくは書かないけどいいよ ねぇ。 13 # ふたりで寒い時とかに歩いてたら首にまいてくれるんだよー。 14 # 我ながらなんてわかりやすい説明なんだろう。 15 # (訳: Miquire::miquire のエイリアス) 16 def miquire(*args) 17 Miquire.miquire(*args) 18 end
core/lib/mikutwitter.rb
sedとかを駆使してみつけたコード.ファイル行数9行です.
実はTwitter.rbにしたかった作者の気持ちがひしひしと伝わってきます.
1 # -*- coding: utf-8 -*- 2 # よくもこんなキ○ガイライブラリを!!! 3 # だってだってぇ、Twitterとかにしたら、他と名前被るじゃないですかぁ〜(悲) 4 5 require "mikutwitter/connect" 6 require "mikutwitter/api_call_support" 7 require "mikutwitter/api_shortcuts" 8 require "mikutwitter/oauth_hacks" 9 require "mikutwitter/streaming_failed_actions"
おわりに
mikutterに出会った頃の話をしたあとに,楽しいコードがある中の一部をご紹介しました.
実際にgrepしてみると「色々アレでソレ」なコードも見つかります.
3時間くらいておくれましたが,日本時間ではまだ27時くらいなのでセーフですね!!!
それでは,12/25のmikutterお誕生日会の準備をしましょう!
次は@haru067さんです?バトンタッチですー
追伸:
冬コミC83では「らぼちっく;げーと」というサークル名で,12/31(月)東2ホール Y-17aにブースを出します!
「俺のクラウドがこんなに安いわけがない」というタイトルで100ページくらいの薄い本を販売します.
mikutterの薄い本と各種グッズの委託販売も受けておりますので,皆様どうぞお越しください.