mikutterのソースコードをgrepする旅

この記事はmikutterアドベントカレンダーのために書かれたものです.

mikutterとの出会いとか

よく覚えていませんが,1年半くらい前でしょうか.
それまではTwitterにはあまり首をつっこんでいませんでしたが,このクライアントを使い始めてからというもの,

  • 急激にTweet数が増加
  • 急激にネタツイートが増加
  • 急激にふぁぼ数が増加
  • 急激にふぁぼられ数が増加

しました.
あまりにもひどい激変っぷりだったためか,下のようなコードが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"

grep

自分でgrepしてみましょう!

grep -Rn 姉ヶ崎寧々 *
grep -Rn 変態ツイッタークライアント *
grep -Rn 垢消せ *

おわりに

mikutterに出会った頃の話をしたあとに,楽しいコードがある中の一部をご紹介しました.
実際にgrepしてみると「色々アレでソレ」なコードも見つかります.
3時間くらいておくれましたが,日本時間ではまだ27時くらいなのでセーフですね!!!

それでは,12/25のmikutterお誕生日会の準備をしましょう!
次は@haru067さんです?バトンタッチですー

追伸:
冬コミC83では「らぼちっく;げーと」というサークル名で,12/31(月)東2ホール Y-17aにブースを出します!
「俺のクラウドがこんなに安いわけがない」というタイトルで100ページくらいの薄い本を販売します.
mikutterの薄い本と各種グッズの委託販売も受けておりますので,皆様どうぞお越しください.