<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>
ブログをマシにしよう → ブログサービスをいろいろ探す → ちょっと試すもなにか満足いかなくて → 自作しようとして → せっかくならと流行りのフレームワークを試し始めて → 満足してそのことをブログに書こうとして → 自分のブログがイマイチなのを思い出して → (最初に戻る) の悪循環を断ち切る為に準備ができるまでひとまず書き置いておくブログ


Tweet


米国サンフランシスコ在住。たまに東京。現在Twitter, Inc.でソフトウェアエンジニアをしています。



@niw



色々連絡先
</description><title>blog.niw.at</title><generator>Tumblr (3.0; @niw)</generator><link>http://blog.niw.at/</link><item><title>JSConf 2012 に来てみた</title><description>&lt;p&gt;米国 Arizona 州は Phoenix に来ています。&lt;/p&gt;

&lt;iframe width="500" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;aq=0&amp;amp;oq=Phoenix,+&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=45.149289,85.253906&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Phoenix,+Maricopa,+Arizona&amp;amp;ll=33.448377,-112.074037&amp;amp;spn=11.94107,21.313477&amp;amp;t=m&amp;amp;z=6&amp;amp;output=embed"&gt;&lt;/iframe&gt;

&lt;p&gt;Phoenix はここ。Arizona 州は初めてなのですが、事前に聞くと100度(華氏 = 37度セ氏)くらいになるとか聞いてげんなりしてたのですが、そこまでヤバイくらい暑いことはなく、風は冷たいのでなんとかなる感じです。例によって夜は寒い&amp;#8230;&lt;/p&gt;

&lt;p&gt;さて、そんな Arizona 州は Phoenix に、今回は &lt;a href="http://2012.jsconf.us/"&gt;JSConf 2012&lt;/a&gt; に参加するために来ました。&lt;a href="http://twitter.github.com/bootstrap/"&gt;Bootstrap&lt;/a&gt; の &lt;a href="http://twitter.com/fat"&gt;Jacob&lt;/a&gt; はプレゼンターなのですが、僕は完全に参加者で来ています。
是非、発表できるようになりたいですが&amp;#8230;&lt;/p&gt;

&lt;p&gt;それはさておき、その名の通り JSConf は JavaScript の小中規模のカンファレンスで、今これがアツいっていうのを話し合って友達を作る会みたいなもので、遠くアイスランドから、あるいはニューヨーク、近くは地元の人までそれでもわりと多くの地域から人が来ています。&lt;/p&gt;

&lt;h2&gt;SFO から一路 PHX へ&lt;/h2&gt;

&lt;p&gt;愛しというわけではないけれど、ずっと使ってたノースウェストが買収された&lt;a href="http://delta.com/"&gt;デルタ航空&lt;/a&gt;は直行便がないので、ハブの SLC 経由で PHX 入です。遠回りすぎて直行便の倍の時間がかかるのですが、アップグレードされたのでよしとします。
乗り換えの SLC は吹雪いてました&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1wa0pn2PH1qz5rul.jpg" alt="SLC"/&gt;&lt;/p&gt;

&lt;p&gt;前日の昼に PHX についたので、その日は iPad が抽選であたるとかなんとかの前日祭的な感じで開かれる &lt;a href="http://notconf.com/"&gt;notconf&lt;/a&gt; に行くことに。JSConf に行く人も行かない人も完全無料で楽しめる会でした。notconf では途中からだったのですが、最後の JSConf 主催者の Chris Willams の発表が爆笑だったので簡単に内容を。&lt;/p&gt;

&lt;p&gt;「ン千ドルするようなカンファレンスなんか行くな、金の無駄だ。例えば、Rails Conf。もう完全に金儲けになってる。でもパーティーにはいけ。そこでプレゼンターを探して、ちょっと他のバーに行こうよって声をかけるんだ。大抵、プレゼンターは質問攻めに飽きあきしてるから、その提案には絶対イェスって言うさ。そしたらもうプレセンターは君のものだ！」 (だいぶ意訳)&lt;/p&gt;

&lt;p&gt;じゃあ JSConf は違うんだな、期待していいんだなと思った次第で、iPad もハズレたしっていうので notconf はおしまい。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1wa15OgYK1qz5rul.jpg" alt="notconf"/&gt;&lt;/p&gt;

&lt;h2&gt;パーティー、そしてパーティー&lt;/h2&gt;

&lt;p&gt;ほとんどのカンファレンスでは同時開催でスポンサーのパーティーやオフィシャルのパーティーが連日開催されます。この手のパーティーは出来る限り参加してなるべく知り合いを作る、プレゼンターでなければ、ある意味カンファレンス中で最も重要な部分の気もします。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1wa28SPcm1qz5rul.jpg" alt="Party"/&gt;&lt;/p&gt;

&lt;p&gt;大抵の場合、会場のバーとかはすごいウルサイので何言ってるのかさっぱりわからないですが、まあこれは慣れるしかないなーと思った次第。
海外からの参加で、例えば今年6月の Google I/O とか WWDC とか、その規模のカンファレンスよりはこのサイズのカンファレンスのほうがパーティーも割と気楽かもしれないので、WWDC のアレでゲンナリした人も是非チャレンジしてみてください。&lt;/p&gt;

&lt;h2&gt;カンファレンス初日&lt;/h2&gt;

&lt;p&gt;そういえば一つ面白かったこと。カンファレンスでは大量の Schwag (会社のロゴ入りグッズ)がもらえるのですが今回はなかなかすごかったです。&lt;/p&gt;

&lt;p&gt;そもそも、スケジュールに「花火（いや、マジで花火。絶対参加！）」って書いてあって、レジストレーションの際に花火のチケットをもらったのですが花火とは景気がいいなぁ、とか呑気に思ってて、でもなんでチケットがいるの？とか話したのですが、なんと花火違いでした。&lt;/p&gt;

&lt;p&gt;その時間になってチケットと引き換えに配られたのは、&lt;a href="https://wiki.mozilla.org/B2G"&gt;Mozilla の G2B&lt;/a&gt; が入った Nexus S！ いいおもちゃを手に入れてしまった感じです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1w9sxghM51qz5rul.jpg" alt="Fireworks"/&gt;&lt;/p&gt;

&lt;p&gt;その後のプレゼンテーションは興味深い V8 の最適化の手法から最近の JavaScript のツール事情など多岐に渡っており JavaScript 好きな方や、最新の雰囲気をキャッチアップするだけでもとてもいい感じです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1w9tnfNKF1qz5rul.jpg" alt="Arizona"/&gt;&lt;/p&gt;

&lt;p&gt;と、こんな感じで久しぶりのカンファレンスに来て色々刺激を受けております。&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4774146293" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/20400461578</link><guid>http://blog.niw.at/post/20400461578</guid><pubDate>Tue, 03 Apr 2012 01:33:00 -0700</pubDate></item><item><title>オンラインバックアップ CrashPlan を使ってみた</title><description>&lt;p&gt;先に断っておきますが、ステマではありません。単なる体験記です。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m1j2m4d2HF1qz5rul.png" alt="CrashPlan"/&gt;&lt;/p&gt;

&lt;p&gt;皆さん、バックアップしてますか？ ここを読んでる方はほとんどが Mac OS X ユーザだと思うので、Time Machine でバックアップをしていると思いますがいくつか問題があります。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;Time Machine はバックアップの最小粒度がファイルである&lt;/p&gt;

&lt;p&gt;Time Machine のバックアップは HFS+ の特殊なハードリンクを使った世代間差分バックアップです。ある時点からの変更をファイル単位で監視してその変更のあったファイルをコピー、保存します。ですので、VMWare などが作るディスクイメージのバックアップでは毎回巨大なファイルのコピーが行われて残念な気持ちになります。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;バックアップ先が物理的に同じ場所に限定される&lt;/p&gt;

&lt;p&gt;Time Machine は外付けHDDをつないだ時に一定時間ごとに自動でバックアップをするという利用方法でデザインされているためバックアップ先は当然物理的に同じ場所（たとえば、家とか会社とか）になります。ですので、家に押し入られて盗難にあったり&lt;sup id="fnref:p20001821370-1"&gt;&lt;a href="#fn:p20001821370-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;、災害&lt;sup id="fnref:p20001821370-2"&gt;&lt;a href="#fn:p20001821370-2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;があったときに本当に消えるリスクは常にあります。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;実際には、Sparse Bundle を使ってネットワークマウントした場所をバックアップ先として Time Machine を実行できるので工夫すれば解決するのですが、というか Time Machine をオンラインバックアップ化するスタートアップサービス &lt;a href="http://www.dollydrive.com/"&gt;Dolly Drive&lt;/a&gt; もあるのですが、これはこれで面白いと思うのですが、本来の利用方法とはちょっとだけ違うのでいろいろと不安な点もでてきます。&lt;/p&gt;

&lt;h2&gt;そこでオンラインバックアップ&lt;/h2&gt;

&lt;p&gt;そこで、現在の状況を考えるとオンラインバックアップがとても有力な候補として上がってきます。&lt;/p&gt;

&lt;p&gt;身近な例でいくと &lt;a href="http://db.tt/XMOCDSs"&gt;Dropbox&lt;/a&gt; ですが、Dropboxに収まり切らないデータは困りますね。というかバックアップとはちょっと趣向が違います。
そこで、ちょっと最近試している &lt;a href="http://www.crashplan.com/"&gt;CrashPlan&lt;/a&gt; が素晴らしいので紹介したいと思います&lt;sup id="fnref:p20001821370-3"&gt;&lt;a href="#fn:p20001821370-3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;h2&gt;CrashPlan を使ってみた&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://www.crashplan.com/"&gt;CrashPlan&lt;/a&gt; はすこし変わったオンラインバックアップサービスです。
なにが変わっているかというと、バックアップ先が CrashPlan が運営するデータセンター以外にも選べるという点で、かつデータセンターを使わない限りに置いては一定の制約がついていますが無償でも使えるということです。&lt;/p&gt;

&lt;p&gt;オンラインバックアップなのにデータセンター使わないってどこにバックアップすんねん！ってことですが、それはなんと友達で CrashPlan を使ってる人のところに送ってしまいます。
例えば日本とアメリカに住んでる友達がいて相互にバックアップ、みたいなことができるのです。&lt;/p&gt;

&lt;p&gt;あと一応、バックアップ先にはローカルのハードディスクやローカルネットワークの他のデバイスも選択できます。あるいは、自分でレンタルサーバーをしてそこをバックアップ先にしてもいいかもしれません。&lt;/p&gt;

&lt;p&gt;あと、CrashPlan はバックアップ時の挙動を見る限り、ファイルの移動や部分変更があってもファイル全体のバックアップではなく、差分バックアップを行うようで、具体的にはファイルを&lt;a href="http://www.crashplan.com/consumer/details.html"&gt;ブロック単位&lt;/a&gt;で暗号化・バックアップを行なっているようです。
つまり VMware などが使う巨大な仮想ディスクイメージに変更を加えるようなことがあっても部分転送だけで済むということですね。&lt;/p&gt;

&lt;h2&gt;お値段などなど&lt;/h2&gt;

&lt;p&gt;その他、復元時にオンライン以外の、HDD の郵送による復元などひと通りのオンラインバックアップサービスが備えているサービスが備わっています。あと、よくありがちな外付け HDD のバックアップに関する制約はありません。&lt;/p&gt;

&lt;p&gt;気になるお値段は1年契約で月$5程度なので、他のサービスと比べても同じか、ちょっと高い程度です。これまでいくつかオンラインバックアップを試してみましたが CrashPlan は使ってみようと思うのになかなか良さそうなサービスでした&lt;sup id="fnref:p20001821370-4"&gt;&lt;a href="#fn:p20001821370-4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;h2&gt;ダメなところ&lt;/h2&gt;

&lt;p&gt;ところで、このブログを書いてる最中に CrashPlan がメンテナンスに入り、自動ソフトウェアアップデートが行われたのですが&lt;sup id="fnref:p20001821370-5"&gt;&lt;a href="#fn:p20001821370-5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;、その後バックアップデーモンが起動しなくなりバックアップ不能に陥りました。
一度、アプリケーションをアンインストールして再インストールして現在インデックスを作りなおしてバックアップは再開しましたが、まあ、こういうのはちょっと困りますねぇ。&lt;/p&gt;

&lt;h2&gt;ふと思ったのですが&lt;/h2&gt;

&lt;p&gt;そういえば、日本では &lt;a href="http://agora-web.jp/archives/1257832.html"&gt;Dropbox が違法かもしれない&lt;/a&gt;という話しらしいですが、オンラインバックアップは大丈夫なんですかね？
CrashPlan のデータは暗号化されていますが、オンライン上のデバイス（データセンターや友達のデバイス）に転送、記録されたりするのですが。
&lt;a href="http://www.nikkansports.com/general/news/p-gn-tp0-20120326-923378.html"&gt;ダウンロードに刑事罰&lt;/a&gt;とかもあるので不安です。&lt;/p&gt;

&lt;p&gt;そのへん詳しい方@&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt;に教えてもらえると嬉しいです！&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;p&gt;これにローカルでバックアップして、オンラインでもバックアップすれば完璧！&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B00620LZCY" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;@&lt;a href="http://twitter.com/mootoh"&gt;mootoh&lt;/a&gt; - &lt;a href="http://mootoh.tumblr.com/post/20215360398/backblaze"&gt;Backblaze を使っている&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p20001821370-1"&gt;
&lt;p&gt;普通はこのリスクは考えないけど&amp;#8230; アメリカだと&amp;#8230; &lt;a href="#fnref:p20001821370-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p20001821370-2"&gt;
&lt;p&gt;昨年の出来事ですので、記憶に新しいですね。 &lt;a href="#fnref:p20001821370-2" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p20001821370-3"&gt;
&lt;p&gt;昔は &lt;a href="https://mozy.com/"&gt;Mozy&lt;/a&gt; がけっこう画期的で、他には &lt;a href="http://www.backblaze.com/"&gt;BackBlaze&lt;/a&gt;（日本語がヘンなのはご愛嬌、近々直すらしいです。）などもあります。 &lt;a href="#fnref:p20001821370-3" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p20001821370-4"&gt;
&lt;p&gt;ちなみに、探すと CrashPlan に似たサービスもけっこうあるようです。 &lt;a href="#fnref:p20001821370-4" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p20001821370-5"&gt;
&lt;p&gt;バージョンが 3.2 から 3.2.1 になった。 &lt;a href="#fnref:p20001821370-5" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.niw.at/post/20001821370</link><guid>http://blog.niw.at/post/20001821370</guid><pubDate>Tue, 27 Mar 2012 01:20:00 -0700</pubDate></item><item><title>未来のカメラ Lytro を使ってみた</title><description>&lt;p&gt;去年に予約した&lt;a href="http://www.lytro.com/"&gt;未来のカメラ Lytro&lt;/a&gt; がついに届きました!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15rlguu7Z1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;Lytro は普通のカメラと違い撮影後にピントを合わせることができます。つまりこう言うこと。&lt;/p&gt;

&lt;iframe width="500" height="415" src="https://pictures.lytro.com/n/pictures/49964/embed" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;上の写真は撮影後のLytroのサイトにアップロードしたもので、クリックすると任意の場所にピントが合います。仕組みは&lt;a href="https://www.lytro.com/science_inside"&gt;このあたり&lt;/a&gt;に。&lt;/p&gt;

&lt;h2&gt;届いた！&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15rlwTT3y1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;箱はとっても iPhone のような箱で中身もとても iPhone のような感じでした。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15rmaShpQ1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;使われている素材とか表面加工とか見るとなんていうか iPhone のそれと比べていまいちなのでちょっと残念ですけど。&lt;/p&gt;

&lt;h2&gt;本体の様子&lt;/h2&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15rmuamLq1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15kpm4Eto1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15kpt3tF41qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15kq5r4zD1qz5rul.jpg" alt="Lytro"/&gt;&lt;/p&gt;

&lt;h2&gt;デスクトップ・アプリケーション&lt;/h2&gt;

&lt;p&gt;撮影した写真は専用の Mac OS X 用デスクトップアプリケーションで行います。
Windows 版は、必要ないと思いますが、用意されていません。&lt;/p&gt;

&lt;p&gt;インストールして Lytro をつなぐとまずバックアップが始まります。じわじわ。遅い&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15iwlLslm1qz5rul.png" alt="Lytro.app"/&gt;&lt;/p&gt;

&lt;p&gt;バックアップは本体のメモリのコピーをしているようで専用形式で &lt;code&gt;~/Pictures/Lytro.lytrolib/cameras/&lt;/code&gt; に取り込まれるようです。&lt;/p&gt;

&lt;p&gt;バックアップが終わると撮影された写真の後処理が始まります。じわじわ。遅い&amp;#8230;
1枚に1分くらいかかります。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15iwy6aA31qz5rul.png" alt="Lytro.app"/&gt;&lt;/p&gt;

&lt;p&gt;処理が終わった写真はフォーカスの変更、回転、Lytro.com や Facebook で共有ができます。というか、それだけでなんと JPEG で書き出しといった機能はありません&amp;#8230;
&lt;code&gt;~/Pictures/Lytro.lytrolib/thumbs&lt;/code&gt; にサムネイルの JPEG が保存されていて、⌘+4 などで画面のスクリーンショットを撮って保存できますが、ちょっと残念ですね。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15ixw21uY1qz5rul.png" alt="Lytro.app"/&gt;&lt;/p&gt;

&lt;h2&gt;ウェブで共有&lt;/h2&gt;

&lt;p&gt;というわけで、実質 &lt;a href="https://pictures.lytro.com/n/pictures/49700"&gt;Lytro.com の URL&lt;/a&gt; を送ったりしてウェブで共有するのが唯一の出力方法になります。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m15jbsq6xw1qz5rul.png" alt="lytro.com"/&gt;&lt;/p&gt;

&lt;p&gt;また、ブログ埋め込み用のタグもここから取れますので、基本的な使い方？である、撮影→ブログに載せる、は問題無いように思います。&lt;/p&gt;

&lt;iframe width="500" height="415" src="https://pictures.lytro.com/n/pictures/49700/embed" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;上の&lt;a href="http://hamusoku.com/archives/6845462.html"&gt;ろくろ写真&lt;/a&gt;を埋め込むとこうなります。&lt;/p&gt;

&lt;h2&gt;本体落とすとこうなる&lt;/h2&gt;

&lt;p&gt;ところで開封してからまもない間に、さっそく机の高さから落としました。&lt;/p&gt;

&lt;iframe width="500" height="415" src="https://pictures.lytro.com/n/pictures/50038/embed" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;悲惨なことになります。一瞬、悲しみがこみ上げてきましたが、Menu から Reset して元に戻りました。落とさないようにしましょう。&lt;/p&gt;

&lt;h2&gt;まとめ&lt;/h2&gt;

&lt;p&gt;ざっくりとした印象は、まだまだやれることはあるけれど実装が追いついていない感じでベータバージョンではないかと感じました。&lt;/p&gt;

&lt;p&gt;周辺のソフトウェアの出来やファームウェアの改善で現在の問題点、デスクトップソフトウェアが遅い、JPEG 出力できないなど撮影したあとにできることの少なさはかなり改善されると思います。&lt;/p&gt;

&lt;p&gt;この未来のカメラをもっと良くしたい、未来を先取りしたいという場合は &lt;a href="http://www.lytro.com/jobs"&gt;Lytro はエンジニアを採用をしている&lt;/a&gt;ようなので応募してみると良いかと思います。勤務地は Mountain View のようです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;もちろん、&lt;a href="http://twitter.com/jobs"&gt;Twitter も&lt;/a&gt;積極的に採用していますので、未来の Twitterを先取りしたいという場合はぜひ応募してください！&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;p&gt;Lytro で撮影した写真を見るのに必要ですよ！&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B005DPEXNM" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/19602421858</link><guid>http://blog.niw.at/post/19602421858</guid><pubDate>Mon, 19 Mar 2012 17:58:00 -0700</pubDate></item><item><title>米国の iPad WiFi + 4G のアンロック具合</title><description>&lt;p&gt;先日発売された Retina ディスプレイ iPad の Verizon モデルを買いました。ちなみに、Verizon については&lt;a href="http://blog.niw.at/post/11471638009"&gt;このブログ&lt;/a&gt;に詳しいです。&lt;/p&gt;

&lt;p&gt;しかし、これ、なんと呼べばいいのでしょうか。Apple のこれまでの命名規則だと、MacBook Pro (Late 2009) のような年式を付与する呼び方や、iPod (2nd Generation) のような世代を付与する方法がありました。
しかし、Apple のサポートをパッと見た限りに置いては公式には iPad 以外の呼称がありません、あるいは iPad WiFi + 4G と呼ばれています。マーケッティング的には The new iPad のようですが。
候補としては、混乱を承知で iPad、The new iPad、あるいは iPad (3rd Generation)、iPad (Early 2012)、あるいは iPad 3 と呼んでしまう?&lt;/p&gt;

&lt;p&gt;まあ、何れにせよここで言う iPad はつまり Retina ディスプレイの第3世代 iPad のことです。&lt;/p&gt;

&lt;h2&gt;NTT DOCOMO の SIM カードを指してみた&lt;/h2&gt;

&lt;p&gt;予約の際に、オンラインの Apple Store に記載のあったとおり、 iPad WiFi + 4G はアンロックされており、現地の SIM で 3G 通信は可能であるらしいので、NTT DOCOMO の SIM は認識するはずです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m143fm4LG71qz5rul.png" alt="NTT DOCOMO"/&gt;&lt;/p&gt;

&lt;p&gt;何事もなかったようにつながりました。ローミング先は AT&amp;amp;T です。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m143gaqauY1qz5rul.png" alt="APN"/&gt;&lt;/p&gt;

&lt;p&gt;APN の設定を見るとテザリングの設定もあるのでテザリングも問題なしのように見えます。&lt;/p&gt;

&lt;p&gt;ということは、NTT DOCOMO の MVNO な最近&lt;a href="http://www.yodobashi.com/ec/product/100000001001477613/index.html"&gt;ヨドバシで売ってるらしい安価な SIMカード&lt;/a&gt;を買って入れておけば日本で便利に使うことはできそうですね。&lt;/p&gt;

&lt;h2&gt;AT&amp;amp;T の SIM カードを指してみたけれど&lt;/h2&gt;

&lt;p&gt;手元にある AT&amp;amp;T の SIM カードは既に無効になってるものしかなくて、ちゃんとした結果ではないのですが、多分使えるような気がします。少なくとも、拒絶はされませんし、キャリアプロファイルは AT&amp;amp;T となります。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m144c9gl801qz5rul.png" alt="AT&amp;amp;T"/&gt;&lt;/p&gt;

&lt;p&gt;というわけで、多分 4G LTE の仕様の違いという意味でのキャリアごとのデバイスが発売されているようですが、3G についていえばロックされていないようです。
つまり、AT&amp;amp;T の 4G LTE を使わないのであれば Verizonのモデルでいいんじゃないかって気がしますね。&lt;/p&gt;

&lt;h2&gt;日本国内で Softbank が販売する iPad WiFi + 4G について&lt;/h2&gt;

&lt;p&gt;日本の Softbank が販売する iPad は国内の GSM キャリアに対してのロックがあるようです。つまり&lt;a href="http://www.nikkei.com/news/latest/article/g=96958A9C93819696E3E2E2E2EA8DE3E2E2E1E0E2E3E09C9C97E2E2E2"&gt;ドコモダケロック&lt;/a&gt;されているようですね (将来リンクが死んだ場合ですが、日本経済新聞のサイトで「ロックの対象は国内の携帯電話事業者のみ」という記述がありました。)&lt;/p&gt;

&lt;p&gt;あと、4G って言ってますが、HSPA+ を 4G って呼んでいいらしいですけど、LTE じゃありません。iPad では LTE は LTE と表示されるようです。
さらに Softbank は&lt;a href="http://plusd.itmedia.co.jp/mobile/articles/1203/10/news022.html"&gt;現時点では HSPA+ も使うことが出来ない&lt;/a&gt;ようです。
まあ、正確には LTE も 4G じゃなかったんですけどね&amp;#8230; なんていうか、4G に漸近してるけど、けして 4G にならない、みたいな感じ。&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;p&gt;風呂のフタどうですか？&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B004TW8KX4" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;日本ではこういう SIMカード もあります。&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B005LAZDVK" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/19558058477</link><guid>http://blog.niw.at/post/19558058477</guid><pubDate>Sun, 18 Mar 2012 20:54:00 -0700</pubDate></item><item><title>Mac OS X Lion の起動 USB を作る過程でハマった</title><description>&lt;p&gt;先日、&lt;a href="http://eshop.macsales.com/shop/SSD/OWC/"&gt;SSD を買った&lt;/a&gt;ので Mac OS X Lion を入れなおしましたが、その過程でハマったのでメモしておきます。&lt;/p&gt;

&lt;p&gt;Mac OS X Lion は出た当時いろいろ言われましたが起動 USB メモリを作ることが可能で、Lion を入れるために Snow Leopard を入れる必要があるとかはありません。&lt;/p&gt;

&lt;h2&gt;起動ディスクを作る&lt;/h2&gt;

&lt;p&gt;まず、少なくとも 4GByte 以上ある USB メモリが必要です。そしてもう一台 Mac がある、あるいは事前にこの作業ができることが前提です。&lt;/p&gt;

&lt;p&gt;そして、Mac OS X Lion を Mac App Store からダウンロードします。&lt;code&gt;Applications&lt;/code&gt; に &lt;code&gt;Install Mac OS X Lion&lt;/code&gt; がダウンロードされるので、その内部にある &lt;code&gt;Contents/ShareSupport/InstallESD.dmg&lt;/code&gt; を Disk Utility を使って USB メモリに書き込みます。&lt;/p&gt;

&lt;p&gt;が、まずその前に USB メモリを &lt;strong&gt;GIUD パーティションを使って初期化&lt;/strong&gt; します。
これをしないと、作成した USB メモリで起動しても途中までは動くのですが途中で STOP マークが出て悲しい気持ちになるので注意です。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m10kl74w0i1qz5rul.png" alt="Disk Utility"/&gt;&lt;/p&gt;

&lt;p&gt;次に、先の &lt;code&gt;InstallESD.dmg&lt;/code&gt; を Disk Utility にドラック＆ドロップして Restore を選びます。Destination: に先程つくった &lt;strong&gt;パーティションを&lt;/strong&gt; ドロップして Restore ボタンを押して書き込み完成です。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m10klnrdZf1qz5rul.png" alt="Disk Utility"/&gt;&lt;/p&gt;

&lt;h2&gt;そしてUSBから起動&lt;/h2&gt;

&lt;p&gt;こうして作成した USB メモリを Mac に指して Option を押しながら起動すれば USB からの起動が選べるはずです!&lt;/p&gt;

&lt;p&gt;以上、自分メモでした。&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;p&gt;これ使ってます！&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0049XHRXC" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;p&gt;これ買いました！&lt;/p&gt;

&lt;iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwat-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B005NIP07C" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/19439278461</link><guid>http://blog.niw.at/post/19439278461</guid><pubDate>Fri, 16 Mar 2012 22:31:00 -0700</pubDate></item><item><title>Uber の トム</title><description>&lt;p&gt;San Francisco には &lt;a href="https://www.uber.com/"&gt;Uber&lt;/a&gt; というリムジン&lt;strike&gt;廃車&lt;/strike&gt;配車サービスがあります。簡単に言えば、タクシーを呼べるサービスみたいなものなのですが、来るのはリムジンです。これが非常によくできていて、リムジンなので&lt;a href="https://www.uber.com/cities/san-francisco"&gt;ちょっと高い&lt;/a&gt;けれど、東京のタクシー値段と比べれば大差ないみたいなサービスとなっています。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0wygbi42k1qz5rul.png" alt="Uber"/&gt;&lt;/p&gt;

&lt;p&gt;今日、仕事帰りにディナーに行くという事で Uber を使いました。
Uber はまず iPhone アプリをダウンロードして自分のクレジットカードを登録しておきます。
登録するとリムジンを呼べるので、「ここに呼ぶ」ボタンを押すと一番近くにいるリムジンに配車の連絡がいき、「あとちょっとで来るよ」みたいな表示になります。
と、同時にそのリムジンがどこに居るのかが地図でわかるのですが今回はトムという人が運転するリムジンが来ることになりました。&lt;/p&gt;

&lt;p&gt;このトムのリムジン、最初は近い場所にいるように見えたのになぜだかすごい遠回りをして呼んだ場所まで来ます。この時点で結構アレだったのですが、トムはなんだかちょっと不安な感じで、目的地までの運転も途中で逆走したりしてすごい遠回りなどをしてとても残念でした。あまり道がわかってない感じで。&lt;/p&gt;

&lt;p&gt;Uber は乗った後に☆5つで評価が出来るのですが、ちゃんと目的地にたどり着いたけど、結構待ったし、遠回りだったし、で☆2つにして評価。iPhone アプリが理由を聞いてきたのでその理由を書いてあーぁ、って思ってディナーに向かいました。&lt;/p&gt;

&lt;p&gt;すると、しばらくして Uber からメールが来ました。&lt;/p&gt;

&lt;p&gt;「やあ。Uber の利用レポートを送ってくれてありがとう。☆が5つじゃないから経路をみてみたら、たしかに遠回りしてるね&amp;#8230; ごめんネ！これだけ割引するから、請求はこれだけになるよ。 ありがとう！」&lt;/p&gt;

&lt;p&gt;って書いてありました。うーん、こんなサービス、アメリカにはないと思ってたんだけどこれで「あ、今回トムはアレだったけど、また使ってみよう！」って思いました。
普通のタクシーの場合は、ひどかったらチップで調整できますが Uber では出来ないのでこういうフィードバックへの対応は大事なんですね。&lt;/p&gt;

&lt;p&gt;そんなわけで、こんな気軽にリムジンが使えるサービス東京にもあったら&amp;#8230; と書くというのはちょっと違くて、東京ではこのクオリティがあたりまえでタクシーなんて呼ばなくても大量に走っているので困らないし、まあサービス業が死んだと言われるアメリカでも、色々考えられているんだなってことでした。&lt;/p&gt;

&lt;p&gt;ちなみに、この Uber のファウンダー、Travisは起業家としては&lt;a href="http://blog.btrax.com/jp/2011/11/06/uber/"&gt;かなりの経歴&lt;/a&gt;の方だそうです。&lt;/p&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;p&gt;これは読んでみたい。&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=416370180X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/19336050521</link><guid>http://blog.niw.at/post/19336050521</guid><pubDate>Thu, 15 Mar 2012 00:01:00 -0700</pubDate></item><item><title>だいぶ実装がアレな SkypeLogger の解説</title><description>&lt;p&gt;tl; dr: SIMBL も Ruby も、あるんだよ。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;Mac OS X のアプリケーションを作る方法が Objective-C だけとは、限りません。&lt;/p&gt;

&lt;p&gt;今回はそういった意味ではだいぶ実装がアレな拙作 &lt;a href="https://github.com/niw/skype_logger"&gt;SkypeLogger&lt;/a&gt; の実装を見ながら、こんな作り方もあるよねということを紹介したいと思います。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0v9faIFO61qz5rul.png" alt="Xcode"/&gt;&lt;/p&gt;

&lt;h2&gt;SkypeLogger の紹介&lt;/h2&gt;

&lt;p&gt;まず、SkypeLogger ですが、何をするものかというと、Skype のチャットログを人間が読める形で普通のファイルに書きだしてくれるツールです。Skype.app 自体にログを残す機能はあるのですが、人間が読めないし、機械でも読めない独自の形式&lt;sup id="fnref:p19284359434-1"&gt;&lt;a href="#fn:p19284359434-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;で書き出されるので不便なのです。
そこで、&lt;a href="http://developer.skype.com/public-api-reference#Mac"&gt;Skype API&lt;/a&gt; を使ってチャットの発言の送信、受信イベントをもとにチャットの発言を逐一ファイルに書き込んでいくだけの簡単なお仕事をしていただく、というツールです。&lt;/p&gt;

&lt;p&gt;しかしこの Skype API が曲者で、API とは名ばかりで &lt;code&gt;Skype.app&lt;/code&gt; と通信するインターフェイスが提供されるだけで、実際に &lt;code&gt;Skype.app&lt;/code&gt; が起動していないと使えません。今回のような用途に限ってはそれでも問題ないのですが、ボットを作る、とかだとちょっと面倒&lt;sup id="fnref:p19284359434-2"&gt;&lt;a href="#fn:p19284359434-2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;ですね。&lt;/p&gt;

&lt;h2&gt;SkypeLogger の概要&lt;/h2&gt;

&lt;p&gt;さて以上を踏まえてこの SkypeLogger の実装についてお話しましょう。仕組みはこうです。&lt;/p&gt;

&lt;p&gt;まず &lt;code&gt;Skype.app&lt;/code&gt; の起動を検出して自身も同時に起動します。これには &lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt; を使っています。SIMBL とは、Mac OS X の既存の(ほとんど、どんな)アプリケーションでも拡張できるプラグインを作るためのプラグインです。具体的には、&lt;a href="http://reederapp.com/mac/"&gt;Reeder&lt;/a&gt;を&lt;a href="http://niw.at/articles/2010/12/05/growl-plugin-for-reeder-for-mac/"&gt;Growlに対応させたり&lt;/a&gt; とか、そういうツールを作るのに使います。&lt;/p&gt;

&lt;p&gt;動作原理についてはまた後述するとして、全体像を把握するために、ここでは SIMBL は他のアプリの起動と同時にアプリと一緒にプラグインを読み込んでくれるツールと考えてください。&lt;/p&gt;

&lt;p&gt;SkypeLogger は、この SIMBL を使って薄い Objective-C で書かれたコードを Skype に読み込ませます。次に、そのコードは &lt;code&gt;ruby&lt;/code&gt; をつかって Ruby で書かれた Skype API を使ってログを取るツールを内部的に起動します。これには RubyCocoa を使っています。そしてそのツールが &lt;code&gt;Skype.app&lt;/code&gt; と通信をしてログを&lt;code&gt;Logger&lt;/code&gt; を使って所定のファイルに書き出していきます。&lt;/p&gt;

&lt;p&gt;あとは Objective-C で書かれた部分で &lt;code&gt;Skype.app&lt;/code&gt;の終了通知を監視して、Skypeが終了したら、内部的に起動したツールも一緒に終了させます。&lt;/p&gt;

&lt;p&gt;と、まあこういう仕組みで動いているのですが、つまり、このツールというかアプリ、Objective-C と、Ruby (と RubyCocoa) の2つを使って書かれています。このあたり、各言語ごとにブリッジが存在している Objective-C ならではですね。&lt;/p&gt;

&lt;p&gt;ここまで見るとわかると思うのですが、Ruby で書かれた部分は SIMBL を使う Objective-C で書かれた部分と完全に切り離されていることに気がつくと思います。実際、この Ruby 部分だけでロガーとして別に手動で起動することも可能です。これには諸事情&lt;sup id="fnref:p19284359434-3"&gt;&lt;a href="#fn:p19284359434-3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;あってこのような実装になっています&lt;sup id="fnref:p19284359434-4"&gt;&lt;a href="#fn:p19284359434-4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;h2&gt;SIMBL の仕組み&lt;/h2&gt;

&lt;p&gt;では、まず起点となる SIMBL から見て行きましょう。SIMBL はほとんどのMac OS Xのアプリにプラグイン機能を提供してくれます。つまり、ちょっーっと足らないあと一歩の機能を自分で追加したりすることができます&lt;sup id="fnref:p19284359434-5"&gt;&lt;a href="#fn:p19284359434-5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;さて、その仕組みなのですが、Mac OS X のバージョンアップを重ねるにつれて複雑化してきています。その昔は Mac OS Xのアプリが &lt;code&gt;Library/InputManagers&lt;/code&gt; にあるプラグインを自動的に読み込む機能を経由して独自のプラグインを読みこませることをしていましたが、現在は &lt;code&gt;/Library/ScriptingAdditions&lt;/code&gt; とデーモンによる複雑な手法になっています&lt;sup id="fnref:p19284359434-6"&gt;&lt;a href="#fn:p19284359434-6" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;まず、対象のアプリケーションが起動すると &lt;code&gt;/Library/ScriptingAdditions&lt;/code&gt; にあるスクリプト拡張プラグインを読み込みます。が、実行はされません。SIMBL はここにスクリプト拡張プラグインを置いて、対象のアプリケーション内部にスクリプティング用のエンドポイントを提供します。&lt;/p&gt;

&lt;p&gt;次にバックグラウンドで動いているデーモン &lt;code&gt;SIMBL Agent&lt;/code&gt; がアプリケーションの起動監視をしていて、アプリケーションが起動され次第、事前にスクリプト拡張で作っておいたエンドポイントをスクリプティング経由で叩きます。&lt;/p&gt;

&lt;p&gt;その後、対象のアプリケーション内部で &lt;code&gt;Library/Application Support/SIMBL/Plugins&lt;/code&gt; から読み込むべきプラグインを探して &lt;code&gt;+[NSBundle bundleWithPath:]&lt;/code&gt; で対象のアプリケーションに読み込みます。
詳しい挙動は&lt;a href="http://code.google.com/p/simbl/source/browse"&gt;SIMBLのソース&lt;/a&gt;を確認してください。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0vajqSqdx1qz5rul.png" alt="SIMBL"/&gt;&lt;/p&gt;

&lt;p&gt;なんだか面倒な仕組みですが、このような努力の結果、&lt;code&gt;Library/Application Support/SIMBL/Plugins&lt;/code&gt; にプラグインを置いておけば、対象のアプリが起動したときに自動で読み込んで実行してくれます。&lt;/p&gt;

&lt;h2&gt;SIMBL プラグインを作る&lt;/h2&gt;

&lt;p&gt;ここからは &lt;a href="https://github.com/niw/skype_logger"&gt;SkypeLoggerのソース&lt;/a&gt; を片手にお読みください。&lt;/p&gt;

&lt;p&gt;SIMBL プラグインを作るには、Xcode で Bundle を作り、&lt;code&gt;Info.plist&lt;/code&gt; に対象とするアプリケーションの &lt;code&gt;Bundle identifier&lt;/code&gt; とバージョンを記載しておきます。&lt;code&gt;Skype.app&lt;/code&gt; の場合はこんな感じ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;BundleIdentifier&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;com.skype.skype&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;MaxBundleVersion&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;5.2.0.1523&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;MinBundleVersion&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;2.8.0.851&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;そして、SIMBL がこの Bundle を読み込んだ際に Principal class の &lt;code&gt;+load&lt;/code&gt; が呼ばれるのでそこにやりたいことを書きます。&lt;/p&gt;

&lt;p&gt;大抵は対象のアプリケーションの一部のメソッドを書き換えたり奪ったりしてやりたいことを追加したりします。 書き換えには Objetive-C のランタイムの機能を使ったり、&lt;code&gt;NSObject&lt;/code&gt; のカテゴリを使ったりする手法がありましたが、最近は &lt;code&gt;method_exchangeImplementations&lt;/code&gt; を使うと楽です。&lt;/p&gt;

&lt;p&gt;しかし、&lt;code&gt;SkypeLogger&lt;/code&gt; はアレなのでそういうことはせずに &lt;code&gt;ruby&lt;/code&gt; を内部的に起動します。つまり、&lt;code&gt;fork&lt;/code&gt; します。&lt;a href="https://github.com/niw/skype_logger/blob/53b009ae22add713c35c9db7c01e2adc54e8cc34/plugin/SkypeLoggerLoader.m"&gt;&lt;code&gt;SkypeLoggerLoader.m&lt;/code&gt;&lt;/a&gt; あたりをご覧ください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pid_t pid;
if((pid = fork()) == 0) {
    ...
    if(execl("/usr/bin/ruby",
             "ruby",
             skypeLoggerPath,
             "-l",
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とても普通に &lt;code&gt;fork&lt;/code&gt; ですね。親プロセス(つまり Skype.app)側では &lt;code&gt;fork&lt;/code&gt; 後、アプリケーションの終了通知 &lt;code&gt;NSApplicationWillTerminateNotification&lt;/code&gt; を待っておきます。
子プロセス(つまり、Ruby スクリプト)側は Skype API の使用準備を始めます。&lt;/p&gt;

&lt;p&gt;親プロセスは、つまり &lt;code&gt;Skype.app&lt;/code&gt; の終了通知が来たら、子プロセスに、つまり &lt;code&gt;fork&lt;/code&gt; した &lt;code&gt;ruby&lt;/code&gt; にシグナルを送って死んでもらいます。
以上、ここまでは Objective-C で書かれています。&lt;/p&gt;

&lt;h2&gt;Skype API を使う&lt;/h2&gt;

&lt;p&gt;ここからは Ruby の世界になります。&lt;a href="https://github.com/niw/skype_logger/blob/53b009ae22add713c35c9db7c01e2adc54e8cc34/lib"&gt;&lt;code&gt;/lib&lt;/code&gt;以下&lt;/a&gt;をご覧ください。&lt;/p&gt;

&lt;p&gt;Mac OS X 標準添付の Ruby では RubyCocoa が提供されていて&lt;sup id="fnref:p19284359434-7"&gt;&lt;a href="#fn:p19284359434-7" rel="footnote"&gt;7&lt;/a&gt;&lt;/sup&gt;、&lt;code&gt;require "osx/cocoa"&lt;/code&gt;することで Objective-C のクラスとRubyのクラスを行ったり来たりすることができます。&lt;/p&gt;

&lt;p&gt;Skype API を使うには &lt;code&gt;Skype.framework&lt;/code&gt; を読み込んで &lt;code&gt;+[SkypeAPI setSkypeDelegate:]&lt;/code&gt; でコールバックされるクラスを提供して &lt;code&gt;+[SkypeAPI sendSkypeCommand:]&lt;/code&gt; でコマンドを送ります。
これを RubyCocoa を使って Ruby で書くとこうなります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def applicationDidFinishLaunching(notification)
  OSX::SkypeAPI.setSkypeDelegate client
  OSX::SkypeAPI.connect
end
...
def command(cmd)
  res = OSX::SkypeAPI.sendSkypeCommand(cmd).to_s
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;簡単ですねー。あんまり深いことは考えなくても動くのでいろいろ楽ですが、ちょっとミスると簡単にプロセスが死ぬので怖いです。&lt;/p&gt;

&lt;h2&gt;Skype API のバグ？ 仕様変更？&lt;/h2&gt;

&lt;p&gt;Skype API は基本的に同期呼び出しが可能だったはずなのですが、あるバージョンから突然同期呼び出しができなくなりました&lt;sup id="fnref:p19284359434-8"&gt;&lt;a href="#fn:p19284359434-8" rel="footnote"&gt;8&lt;/a&gt;&lt;/sup&gt;。つまり &lt;code&gt;SkypeAPI.sendSkypeCommand()&lt;/code&gt; を読んでも結果はすぐに返らずに非同期で &lt;code&gt;SkypeAPI.setSkypeDelegate()&lt;/code&gt; で登録したクラスの &lt;code&gt;skypeNotificationReceived()&lt;/code&gt; が呼ばれます。&lt;/p&gt;

&lt;p&gt;というわけで SkypeLogger では同期呼び出しが出来るか出来ないかを最初のメッセージを受け取った時に判断して以降のメッセージハンドラを差し替えるという &lt;strike&gt;キモい&lt;/strike&gt; かっこいいことをしています。メッセージを受け取るたびに &lt;code&gt;if&lt;/code&gt; 文が走るなんてことはありません。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def on_message_sent_or_recieve(id)
  handler_module = if command("GET CHATMESSAGE #{id} CHATNAME").empty?
    ...
    AsynchronousSendSkypeCommand
  else
    ...
    SynchronousSendSkypeCommand
  end
  self.class.class_eval do
    # 使える方のメッセージハンドラモジュールをincludeして
    include handler_module
    # 自分自身を消す
    remove_method :on_message_sent_or_recieve
  end
  # 選んだ方のメッセージハンドラを呼ぶ
  on_message_sent_or_recieve(id)
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;まとめ&lt;/h2&gt;

&lt;p&gt;Mac OS X のアプリケーションを作るには様々な方法があります。アプリケーションの形態も様々で単体のアプリケーションからこういうようなプラグイン形式のものなどいろいろあります。&lt;/p&gt;

&lt;p&gt;AppStore 全盛期にアプリケーションはこれこれこういう形でこう作るんだよ、みたいな風潮がありますが、もっと本当は自由なんですよーってことでまとまったようなのでオシマイ！&lt;/p&gt;

&lt;p&gt;感想とか、こうしたほうがいいとか、これはマズいとかは @&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt; にツイートしてもらえると嬉しいです。&lt;/p&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;p&gt;Ruby を使った Mac OS X の開発についての本ですよ。&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=483993178X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p19284359434-1"&gt;
&lt;p&gt;確か、けっこう頑張って誰かが解析してたはず。 &lt;a href="#fnref:p19284359434-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-2"&gt;
&lt;p&gt;Linux用のバイナリを使ってコンソールで使えるようにしていた記事もあったはず。 &lt;a href="#fnref:p19284359434-2" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-3"&gt;
&lt;p&gt;実は最初は内部的に別プロセスの Ruby を起動するようにはせず、直接 RubyCocoa で書かれたコードをSIMBLから呼ぶようにしていました。しかし、どうやら &lt;code&gt;Skype.app&lt;/code&gt; は同じプロセスがAPIを使うことを想定していないようで、このような実装だと毎回APIアクセスの許可を求めるダイアログが出てしまう面倒くさい挙動になってしまったので、別プロセスを起動するようにしました。 &lt;a href="#fnref:p19284359434-3" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-4"&gt;
&lt;p&gt;さらに補足すれば、実際のところ、SIMBLをつかって同時起動しようと思ったのはずいぶん後で、昔は手動で Ruby の部分だけ起動していました。 &lt;a href="#fnref:p19284359434-4" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-5"&gt;
&lt;p&gt;拙作の Growl 機能を &lt;a href="http://niw.at/articles/2010/12/05/growl-plugin-for-reeder-for-mac/"&gt;Reeder.app に追加するやつ&lt;/a&gt;とか &lt;a href="http://niw.at/articles/2007/11/02/TerminalColoreopard/"&gt;Terminal.appの文字色を変えるやつ&lt;/a&gt; とかそんな感じです。 &lt;a href="#fnref:p19284359434-5" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-6"&gt;
&lt;p&gt;年々厳しくなります。 10.8 ではどうなることやら。 &lt;a href="#fnref:p19284359434-6" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-7"&gt;
&lt;p&gt;実はこっそり MacRuby も標準搭載されているのですが、PrivateFramework で簡単に使えません。 &lt;a href="#fnref:p19284359434-7" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p19284359434-8"&gt;
&lt;p&gt;5.6 頃から? &lt;a href="#fnref:p19284359434-8" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.niw.at/post/19284359434</link><guid>http://blog.niw.at/post/19284359434</guid><pubDate>Wed, 14 Mar 2012 02:13:00 -0700</pubDate></item><item><title>Instapaper から Readability に移行する</title><description>&lt;p&gt;「あとで読むツール」にはいろいろあって、僕の中では決定打はないというか、自作するか&amp;#8230; と思っているもののひとつなんですが、そんななか最近 &lt;a href="http://itunes.apple.com/app/id460156587"&gt;iPhone/iPad アプリが登場&lt;/a&gt;した &lt;a href="http://www.readability.com/"&gt;Readability&lt;/a&gt; を使ってみようという気になってきました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0kb3cjGLa1qz5rul.png" alt="Readability"/&gt;&lt;/p&gt;

&lt;p&gt;これまで &lt;a href="http://www.instapaper.com/"&gt;Instapaper&lt;/a&gt; を使っていたので、じゃあ、ためてある「後で読む」たちを移行するか、と思ったらそうはなんだか簡単にいきそうにない。
Instapaper 側は CSV ファイルで2,000件までなら書き出せるらしいのでこちら側はなんとかよしとする(実は1,980件くらいあってギリギリだったんだけど。)
けれども、Readability 側にはインポート機能がなくて、API は&lt;a href="https://www.readability.com/publishers/api/"&gt;メールしないと API トークンがもらえないという面倒くささ&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;しかし、よく見ると Readability で用意されたメールアドレスにメールで URL を送るとインポートしてくれるらしい。あ、つまり、SMTPっていうAPIがあるってことかー、と脳内理解したのでスクリプトを書きました。&lt;a href="https://github.com/niw/readability_importer"&gt;ソースはこちら&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;Gemにしたので&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem install readability_importer
$ rehash
$ readability_importer
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で使えると思います。&lt;/p&gt;

&lt;h2&gt;中身の話&lt;/h2&gt;

&lt;p&gt;URL の一覧を受け取って、メールをつくって SMTP で Readability に送る、ということをしていますが、Readability の SMTP が遅いのもあってか、普通に&lt;code&gt;Net::SMTP&lt;/code&gt;とかで実装するとかなーり遅いです。
そこで &lt;a href="http://rubyeventmachine.com/"&gt;&lt;code&gt;EventMachine&lt;/code&gt;&lt;/a&gt; で並列化して送るようになっているます。あんまり無茶しすぎるとブロックされそうなのでリーズナブルな並列度合いで使ってください。&lt;code&gt;-c&lt;/code&gt;で変えられます。&lt;/p&gt;

&lt;p&gt;あと、重要なのことなのですが&lt;a href="http://ja.wikipedia.org/wiki/Outbound_Port_25_Blocking"&gt;OP25B&lt;/a&gt;をされている環境&lt;sup id="fnref:p18943948810-1"&gt;&lt;a href="#fn:p18943948810-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;ではSMTPが使えないのでたぶん動かないと思います。&lt;/p&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;p&gt;今夜わかるって！&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=479810941X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p18943948810-1"&gt;
&lt;p&gt;たぶんほとんどの環境では無理かもしれない&amp;#8230; &lt;a href="#fnref:p18943948810-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.niw.at/post/18943948810</link><guid>http://blog.niw.at/post/18943948810</guid><pubDate>Thu, 08 Mar 2012 02:56:00 -0800</pubDate></item><item><title>Mac OS Xで追加された絵文字が怖い件について</title><description>&lt;p&gt;先日は&lt;a href="http://blog.niw.at/post/18720917915"&gt;マジなブログ&lt;/a&gt;を書いてしまったので脱力系を。&lt;/p&gt;

&lt;p&gt;Mac OS X 10.7にはカラー絵文字というのが搭載されていて、iPhoneでお馴染みのあの絵文字がレンダリングできます。レンダリング可能な絵文字やその割り当ては真面目に調べるとけっこう色々とあるのですが、Unicode 6の絵文字仕様ものが大体搭載されているようです。&lt;/p&gt;

&lt;p&gt;しかし、Mac OS X 10.7.3に搭載されているのをよく見るとなんだかけっこう解像度が高くて、しかも怖いのが増えてるようなのです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0gecymF4C1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;なにかお持ちのようです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0gedvdjpS1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;これは苦手な人はアウトでは？&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0geg0O5Cv1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;ちょ、頭だけのやつもある！&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0geh16SJ21qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;ちびる&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0geiowXHk1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;John AppleseedさんのクレカのCCVは445だそうですよ！！&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0gekxlDXu1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;ちなみに、この方です。クレカの管理はもうちょっと厳重に・・・&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0gen9xcKf1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;な、なんか風呂に居る・・・&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0ge9cRxZO1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;もしオレンジだったら&lt;a href="https://twitter.com/niw"&gt;アイコンに&lt;/a&gt;とか一瞬おもったけど、よーく見るとちょっと怖い。&lt;/p&gt;

&lt;p&gt;と、ツイートしたところ、Appleの&lt;a href="http://twitter.com/kidayasuo"&gt;木田さん&lt;/a&gt;がつくってくれました (∩´∀｀)∩ﾜｰｲ&lt;/p&gt;

&lt;blockquote class="twitter-tweet" data-in-reply-to="176926691304800257" lang="ja"&gt;&lt;p&gt;@&lt;a href="https://twitter.com/niw"&gt;niw&lt;/a&gt; こんな感じかな？ :) &lt;a href="http://t.co/O8FX6q4E" title="http://twitter.com/kidayasuo/status/176931130770075650/photo/1"&gt;twitter.com/kidayasuo/stat…&lt;/a&gt;&lt;/p&gt;— 木田泰夫さん (@kidayasuo) &lt;a href="https://twitter.com/kidayasuo/status/176931130770075650" data-datetime="2012-03-06T07:24:03+00:00"&gt;3月 6, 2012&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;と、なかなか楽しいのでいろいろ探してみください。
Font Book.appを起動してApple Color Emojiフォントを選んで⌘+2で表示されます。右端のつまみででっかくできますよ！&lt;/p&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;p&gt;イチオシの文字コード本。ブログでふれてる木田さんも登場しますよ！&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=450154970X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/18840488272</link><guid>http://blog.niw.at/post/18840488272</guid><pubDate>Tue, 06 Mar 2012 00:13:00 -0800</pubDate></item><item><title>+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:] が何をしているか調べてみた</title><description>&lt;p&gt;tl; dr: &lt;code&gt;+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]&lt;/code&gt; は &lt;code&gt;dispatch_async&lt;/code&gt; で &lt;code&gt;+[NSURLConnection sendSynchronousRequest:returningResponse:error:]&lt;/code&gt; を呼んでいる。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;&lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html"&gt;&lt;code&gt;NSURLConnection&lt;/code&gt;&lt;/a&gt; を非同期に使いたいなんて要望はもうそれこそかなり昔からあって、数多の車輪の再発明とブログと FAQ が生まれたわけですが、一昨年の Grand Central Dispatch&lt;sup id="fnref:p18720917915-1"&gt;&lt;a href="#fn:p18720917915-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;、GCD の登場でついに抜本的な解決が見えるかのように見えてわひょーいってなった割には2010年の WWDC のネットワークのセッション&lt;sup id="fnref:p18720917915-2"&gt;&lt;a href="#fn:p18720917915-2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;で GCD は未来、諸刃の刃、素人にはオススメしないとか言ってたりしていて、おいマジかよとか思ったのは記憶に新しいかと思います。&lt;/p&gt;

&lt;p&gt;そんな昨今、あの &lt;code&gt;NSRunLoop&lt;/code&gt; を回さないとロクに仕事をしなくなった&lt;sup id="fnref:p18720917915-3"&gt;&lt;a href="#fn:p18720917915-3" rel="footnote"&gt;3&lt;/a&gt;&lt;/sup&gt;ことで有名な &lt;code&gt;NSURLConnection&lt;/code&gt; にひっそり &lt;a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html"&gt;&lt;code&gt;sendAsynchronousRequest:queue:completionHandler:&lt;/code&gt;&lt;/a&gt; なんていうメソッドが生えているではありませんか。&lt;/p&gt;

&lt;p&gt;こ、これはっ！もうこれ使えば &lt;code&gt;NSRunLoop&lt;/code&gt; 回したりとかいらねえんじゃね？ってなって歓喜なわけですが、よく見るとですね、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Availability
Available in Mac OS X v10.7 and later.
Available in iOS 5.0 and later.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;って書かれていてガックシなわけですね。Mac OS X はいいとしても、iOS のほうはまだ iOS 4 な iPhone がたっぷりこの世にある以上無視できない&lt;sup id="fnref:p18720917915-4"&gt;&lt;a href="#fn:p18720917915-4" rel="footnote"&gt;4&lt;/a&gt;&lt;/sup&gt;わけで&amp;#8230; ぐぬぬと。&lt;/p&gt;

&lt;p&gt;じゃあ、っていうんで当然、挙動を調べて互換のコード書いておこうってなります(ならないか&amp;#8230; いや、なることにしてください。)&lt;/p&gt;

&lt;p&gt;ということで、今回は &lt;code&gt;+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]&lt;/code&gt; が何をしているか調べる過程で&lt;code&gt;lldb&lt;/code&gt;の使い方や GCD のことやブロックの実装がどうなっているのかとか Objective-C がどうやって動いているのかを調べてみます。&lt;/p&gt;

&lt;h2&gt;まずは使ってみる&lt;/h2&gt;

&lt;p&gt;まず、簡単な短いコードを書いてどうやって動くのか確かめます。
ちょっとハマったのは &lt;code&gt;queue:&lt;/code&gt; の部分で、これは &lt;code&gt;completionHandler:&lt;/code&gt; を実行するための &lt;code&gt;NSOperationQueue&lt;/code&gt; を渡すので、ここで渡す &lt;code&gt;queue&lt;/code&gt; に対して &lt;code&gt;-[NSOperationQueue waitUntilAllOperationsAreFinished]&lt;/code&gt; をしてもうまく待てなかったりします。で、こんな感じのコードを書きました&lt;sup id="fnref:p18720917915-5"&gt;&lt;a href="#fn:p18720917915-5" rel="footnote"&gt;5&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
#import &amp;lt;dispatch/dispatch.h&amp;gt;

int main(int argc, char *argv[])
{
    @autoreleasepool {
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];

        dispatch_semaphore_t s = dispatch_semaphore_create(0);

        [NSURLConnection sendAsynchronousRequest:request
            queue:queue
            completionHandler:^(NSURLResponse *r, NSData *d, NSError *e) {
            NSLog(@"%@", r);
            dispatch_semaphore_signal(s);
        }];

        dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
        dispatch_release(s);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;何もしていませんね。リクエスト投げて終わり。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ clang -g -framework Foundation -o test test.m
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とかでコンパイルします。実行すると、まあちゃんと動きますね。&lt;/p&gt;

&lt;h2&gt;はじめに&lt;/h2&gt;

&lt;p&gt;こからが本題です。何をしているのか知りたいと。まずは予想します。明らかに GCD は使っていると思われます。&lt;/p&gt;

&lt;p&gt;なので、&lt;code&gt;dispatch_async&lt;/code&gt; で &lt;code&gt;NSURLConnection&lt;/code&gt; の何かを呼ぶ &lt;code&gt;block&lt;/code&gt; を突っ込んでいるだろうと。問題は、どのキューにどんなことをするブロックが突っ込まれているかわかんないということですね&lt;sup id="fnref:p18720917915-6"&gt;&lt;a href="#fn:p18720917915-6" rel="footnote"&gt;6&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;最終的に呼ばれる &lt;code&gt;completionHandler&lt;/code&gt; はまた別の &lt;code&gt;NSOperationQueue&lt;/code&gt; (内部的にはGCDになってる) で呼ばれてしまうのでここから実際にリクエストを投げているブロックには到達できないのですね&lt;sup id="fnref:p18720917915-7"&gt;&lt;a href="#fn:p18720917915-7" rel="footnote"&gt;7&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;p&gt;というけでやってみます。&lt;/p&gt;

&lt;h2&gt;デバッガ起動&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ lldb ./test
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://blog.niw.at/post/17311357890"&gt;前回は &lt;code&gt;gdb&lt;/code&gt; を使いました&lt;/a&gt; が、今回は &lt;code&gt;lldb&lt;/code&gt; を使います。基本的には同じなのですが、コマンド体系が違って困ります&lt;sup id="fnref:p18720917915-8"&gt;&lt;a href="#fn:p18720917915-8" rel="footnote"&gt;8&lt;/a&gt;&lt;/sup&gt;。
そんなときは&lt;a href="http://lldb.llvm.org/lldb-gdb.html"&gt;ここに対応表&lt;/a&gt;があるので便利です。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Current executable set to './test' (x86_64).
(lldb) 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;では、まずおもむろにターゲットのメソッドに &lt;code&gt;b&lt;/code&gt; でブレークポイントを立てます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) b +[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;それで、&lt;code&gt;r&lt;/code&gt; で走らせて止まるまで行きます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) r
...
Process 18965 stopped
* thread #1: tid = 0x1f03, 0x00007fff90c4248e Foundation`+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:], stop reason = breakpoint 1.1
    frame #0: 0x00007fff90c4248e Foundation`+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]
Foundation`+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]:
-&amp;gt; 0x7fff90c4248e:  pushq  %rbp
   0x7fff90c4248f:  movq   %rsp, %rbp
   0x7fff90c42492:  subq   $64, %rsp
   0x7fff90c42496:  movq   1756339(%rip), %rax    ; 0x00007fff90def150 
(lldb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;はい、止まりました。&lt;/p&gt;

&lt;h2&gt;GCD の呼び出しを追う&lt;/h2&gt;

&lt;p&gt;ここからが勝負です。実際の挙動が予想通りだと期待して、GCD 関係の API にブレークポイントを立てておきます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) b dispatch_get_global_queue
(lldb) b dispatch_async
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;では &lt;code&gt;c&lt;/code&gt; で続きを。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Process 18965 stopped
* thread #1: tid = 0x1f03, 0x00007fff893b201d libdispatch.dylib`dispatch_get_global_queue, stop reason = breakpoint 2.1
    frame #0: 0x00007fff893b201d libdispatch.dylib`dispatch_get_global_queue
libdispatch.dylib`dispatch_get_global_queue:
-&amp;gt; 0x7fff893b201d:  testq  $-3, %rsi
   0x7fff893b2024:  jne    0x00007fff893b20b0     ; dispatch_get_global_queue + 147
   0x7fff893b202a:  testb  $2, %sil
   0x7fff893b202e:  je     0x00007fff893b2068     ; dispatch_get_global_queue + 75
(lldb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;おお、&lt;code&gt;dispatch_get_global_queue&lt;/code&gt; で止まりました。やっぱり GCD を使ってますね。自分で作ったキューではなくてグローバルのものを使っているようです。
&lt;code&gt;dispatch_get_global_queue&lt;/code&gt; は &lt;code&gt;man&lt;/code&gt; によると、次のような引数と戻り値だそうです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; dispatch_queue_t
 dispatch_get_global_queue(long priority, unsigned long flags);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;つまり、1つめの引数を見ればどのグローバルのキューを使っているのかわかって、戻り値でそのキューの場所がわかります。1つめの引数は &lt;code&gt;rdi&lt;/code&gt; レジスタに格納されるので見てみます&lt;sup id="fnref:p18720917915-9"&gt;&lt;a href="#fn:p18720917915-9" rel="footnote"&gt;9&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) p (long)$rdi
(long) $0 = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;はー、0 ですか。これは &lt;code&gt;dispatch/queue.h&lt;/code&gt; によると &lt;code&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&lt;/code&gt; ですね。ではこのキューの場所を押さえておきます。戻り値は &lt;code&gt;rax&lt;/code&gt; レジスタに入るので、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) finish
(lldb) p (void*)$rax
(void *) $1 = 0x00007fff74d6a0c0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここだそうです。はい覚えた。じゃ &lt;code&gt;c&lt;/code&gt; で続きを見ていきます。&lt;/p&gt;

&lt;h2&gt;dispatch_async の呼び出し&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;Process 18965 stopped
* thread #1: tid = 0x1f03, 0x00007fff893b3ae9 libdispatch.dylib`dispatch_async, stop reason = breakpoint 3.1
    frame #0: 0x00007fff893b3ae9 libdispatch.dylib`dispatch_async
libdispatch.dylib`dispatch_async:
-&amp;gt; 0x7fff893b3ae9:  pushq  %rbp
   0x7fff893b3aea:  movq   %rsp, %rbp
   0x7fff893b3aed:  pushq  %rbx
   0x7fff893b3aee:  subq   $8, %rsp
(lldb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;今度は、&lt;code&gt;dispatch_async&lt;/code&gt; で止まりましたね。どうやら予想通りなにやらブロックをキューに追加しているようですよ。&lt;code&gt;dispatch_async&lt;/code&gt; は &lt;code&gt;man&lt;/code&gt; によると、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; void
 dispatch_async(dispatch_queue_t queue, void (^block)(void));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ということなので、最初の引数が追加するキューの場所、2つめがブロックとなります。ではそれぞれ確認しましょう。1つめの引数は &lt;code&gt;rdi&lt;/code&gt; ですね。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) p (void *)$rdi
(void *) $2 = 0x00007fff74d6a0c0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;おや、どこかで見た数字。そうです、さっき手に入れた &lt;code&gt;DISPATCH_QUEUE_PRIORITY_DEFAULT&lt;/code&gt; なグローバルなキューですね。ここにブロックを追加していると。ふむ、このブロックが多分非同期にネットワークのリクエストを投げていることでしょう。ではこのブロックが呼ばれる箇所でブレークポイントを立てる&amp;#8230; となるわけですが、これがちょっと難しい。&lt;/p&gt;

&lt;h2&gt;ブロックの実体について&lt;/h2&gt;

&lt;p&gt;ブロックは実体はCの関数ポインタのようなものですが、実はもっと面倒なことをやっています。次のような超絶短いコードを書いて &lt;code&gt;clang -rewrite-objc&lt;/code&gt; で C++ のソースを生成させて実際の &lt;code&gt;dispatch_async&lt;/code&gt; の呼び出しがブロック無しではどうなるのかを確認します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &amp;lt;dispatch/dispatch.h&amp;gt;
int main() {
    dispatch_async(dispatch_get_global_queue(0, 0), ^{});
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;何もしなさすぎですね。4行。しかし、これがコンパイラの手にかかると凄まじい行数になります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ clang -rewrite-objc block.m
$ wc -l block.cpp
      93 block.cpp
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;うぉ&amp;#8230; 100行くらいになっとるではないか。当社比25倍。
うろたえますが、中身を見てみます。どうなってんのかなぁ&amp;#8230;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dispatch_async(dispatch_get_global_queue(0, 0),
    (void (*)(void))&amp;amp;__main_block_impl_0((void *)__main_block_func_0,
        &amp;amp;__main_block_desc_0_DATA));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;長い、長いぜ&amp;#8230; でも、ブロックのところは &lt;code&gt;__main_block_impl_0&lt;/code&gt; 構造体のコンストラクタ呼び出しになっています。一瞬あれ？って思いますが、これ C++ のコードです。1つめの引数は &lt;code&gt;__main_block_func_0&lt;/code&gt; で、これがもともとブロックの中身、実体です。で、そのコンストラクタではブロックの実体を &lt;code&gt;impl.FuncPtr&lt;/code&gt; に格納しています。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;struct __main_block_impl_0 {
  struct __block_impl impl;
  ...
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
    ...
    impl.FuncPtr = fp;
    ...
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;impl&lt;/code&gt; は &lt;code&gt;__block_impl&lt;/code&gt; で、中身は&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となっています。えーっとつまり、2つめの引数に入ってる &lt;code&gt;__main_block_impl_0&lt;/code&gt; 構造体の先頭は &lt;code&gt;__block_impl&lt;/code&gt; 構造体で、&lt;code&gt;__block_impl&lt;/code&gt; 構造体の4つめの &lt;code&gt;FuncPtr&lt;/code&gt; がブロックの実体を指しているわけですね。&lt;/p&gt;

&lt;h2&gt;ブロックの呼び出しを追う&lt;/h2&gt;

&lt;p&gt;ここまで分かればブレークポイントを立てられます。2つめの引数は &lt;code&gt;rsi&lt;/code&gt; レジスタなので見てみます。あ、すごい寄り道をしましたが、&lt;code&gt;lldb&lt;/code&gt; は &lt;code&gt;dispatch_async&lt;/code&gt; を呼び出したところで止まってます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) p (void *)$rsi
(void *) $3 = 0x00007fff5fbff6a8
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これが先ほどの例でいうところの &lt;code&gt;__main_block_impl_0&lt;/code&gt; 構造体の先頭で、つまり、&lt;code&gt;__block_impl&lt;/code&gt; 構造体の先頭でもあるので、ここから &lt;code&gt;__block_impl&lt;/code&gt; 構造体の最初の3つの &lt;code&gt;size(void *) + size(int) + size(int)&lt;/code&gt; 分、つまり16バイトを読み飛ばしてそこがブロックの実体のアドレスになります&lt;sup id="fnref:p18720917915-10"&gt;&lt;a href="#fn:p18720917915-10" rel="footnote"&gt;10&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) p *(void **)($rsi+16)
(void *) $4 = 0x00007fff90c427dd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これだー！ここがブロックの実体だ！ってことでブレークポイントをぽちっとな。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) b 0x00007fff90c427dd
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ふう。これでブロックの中身、たぶんリクエストを非同期で実行する実体が書かれた箇所が呼ばれたら止まります。では &lt;code&gt;c&lt;/code&gt; で続きを。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Process 18965 stopped
* thread #6: tid = 0x2703, 0x00007fff90c427dd Foundation`__+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_1, stop reason = breakpoint 4.1
    frame #0: 0x00007fff90c427dd Foundation`__+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_1
Foundation`__+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_1:
-&amp;gt; 0x7fff90c427dd:  pushq  %rbp
   0x7fff90c427de:  movq   %rsp, %rbp
   0x7fff90c427e1:  pushq  %r14
   0x7fff90c427e3:  pushq  %rbx
(lldb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;はい、ちゃんとブロックの中身で止まりました。スレッド番号がこれまでと違いますね。ちゃんと並列化されているようです。って、ちょっ、ちゃんとブロックの実体の名前が表示されてるじゃん！
そうです、実は&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) b __+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ってやればブロックで止められたんです。まあそんなことわからなかったのでブロックの勉強になったってことでよしとします。&lt;/p&gt;

&lt;h2&gt;Objetive-Cのコードを追う&lt;/h2&gt;

&lt;p&gt;ここからはObjective-Cな感じで。Objective-Cのメソッド呼び出しはすべてランタイムの &lt;code&gt;objc_msgSend&lt;/code&gt; で行われます。中身はアセンブラらしいですが&lt;sup id="fnref:p18720917915-11"&gt;&lt;a href="#fn:p18720917915-11" rel="footnote"&gt;11&lt;/a&gt;&lt;/sup&gt;、Objective-Cはコンパイラとランタイムによる協奏曲のようなもので、Cで動的で美しいですね。
ということで &lt;code&gt;objc_msgSend&lt;/code&gt; の呼び出しを監視すれば、Objective-Cのコードがなにをしているのか大体わかります。ではここにブレイクポイントを立てておきます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) b objc_msgSend
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;では &lt;code&gt;c&lt;/code&gt; で続けます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Process 18965 stopped
* thread #6: tid = 0x2703, 0x00007fff8d9a8e80 libobjc.A.dylib`objc_msgSend, stop reason = breakpoint 5.1
    frame #0: 0x00007fff8d9a8e80 libobjc.A.dylib`objc_msgSend
libobjc.A.dylib`objc_msgSend:
-&amp;gt; 0x7fff8d9a8e80:  testq  %rdi, %rdi
   0x7fff8d9a8e83:  je     0x00007fff8d9a8eb0     ; objc_msgSend + 48
   0x7fff8d9a8e85:  testb  $1, %dil
   0x7fff8d9a8e89:  jne    0x00007fff8d9a8ec7     ; objc_msgSend + 71
(lldb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;はい、止まりました。&lt;code&gt;objc_msgSend&lt;/code&gt; はリファレンスによると、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;id objc_msgSend(id theReceiver, SEL theSelector, ...)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ということなので、一つめの引数がメソッドを呼び出す対象のオブジェクトで二つめがメソッド名となります。&lt;code&gt;SEL&lt;/code&gt; の名前は &lt;code&gt;sel_getName&lt;/code&gt; で見られます。&lt;code&gt;id&lt;/code&gt; からクラス名を得るのはちょっとめんどくさくて、&lt;code&gt;objc/objc.h&lt;/code&gt; の &lt;code&gt;id&lt;/code&gt; の定義を見ると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;typedef struct objc_object {
     Class isa;
} *id;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となっているので、まず &lt;code&gt;isa&lt;/code&gt; の &lt;code&gt;Class&lt;/code&gt; を得て &lt;code&gt;class_getName&lt;/code&gt; を使います。ということでこうなります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(lldb) p (const char *)class_getName(((id)$rdi)-&amp;gt;isa)
(const char *) $5 = 0x00007fff90d22f23 "NSURLConnection"
(lldb) p (const char *)sel_getName($rsi)
(const char *) $6 = 0x00007fff8b1f75f6 "sendSynchronousRequest:returningResponse:error:"
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;結論&lt;/h2&gt;

&lt;p&gt;なんと！そういうことか！なんと、ブロックの中で &lt;code&gt;+[NSURLConnection sendSynchronousRequest:returningResponse:error:]&lt;/code&gt; を呼び出しているではありませんか。
どうやらこれが答えのようです。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]&lt;/code&gt; は GCD で同期呼び出しである &lt;code&gt;+[NSURLConnection sendSynchronousRequest:returningResponse:error:]&lt;/code&gt; をつかっていました！&lt;code&gt;NSRunLoop&lt;/code&gt; なんて回していないし、&lt;code&gt;NSThread&lt;/code&gt; でゴチャゴチャやっていない。いやはや。&lt;/p&gt;

&lt;p&gt;というわけで、すでにすごい数ある &lt;code&gt;NSURLConnection&lt;/code&gt; のFAQにもうひとつ追加。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;NSURLConnection&lt;/code&gt; を非同期に簡単に並列化したい場合は、GCD の &lt;code&gt;dispatch_async&lt;/code&gt; で &lt;code&gt;+[NSURLConnection sendSynchronousRequest:returningResponse:error:]&lt;/code&gt; を呼び出す。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;最初につくったものと同じような動きをするコードではこうなります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;
#import &amp;lt;dispatch/dispatch.h&amp;gt;

int main(int argc, char *argv[])
{
    @autoreleasepool {
        dispatch_semaphore_t s = dispatch_semaphore_create(0);

        dispatch_queue_t queue = dispatch_get_global_queue(
                                 DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_async(queue, ^{
            NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];
            NSURLResponse *response;
            NSError *error;

            [NSURLConnection sendSynchronousRequest:request
                                  returningResponse:&amp;amp;response
                                              error:&amp;amp;error];

            NSLog(@"%@", response);

            dispatch_semaphore_signal(s);
        });
        dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
        dispatch_release(s);
    }
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;まあ、いろんな状況があるのでこれが最適解かといえばそうでもないと思います。
これだと途中でリクエストを止められないとか問題がある気がしますし、その場合は、いまのところは &lt;code&gt;NSRunLoop&lt;/code&gt; を回してバックグラウンドスレッドでぐんにょりみたいな感じでやることになるんでしょうね。&lt;/p&gt;

&lt;p&gt;以上、長くなりました。&lt;/p&gt;

&lt;p&gt;もっとこうするとかっこ良く挙動が調べられるよ！とか @&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt; まで教えてください！&lt;/p&gt;

&lt;h2&gt;あわせて読みたい&lt;/h2&gt;

&lt;p&gt;より詳しく知りたい方はこちらがオススメです。&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4844331094" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p18720917915-1"&gt;
&lt;p&gt;なんでこんな名前かっていうと、New YorkのGrand Central駅から線路がいろんな方向に伸びてるから、ってことらしい。そういえばちゃんとApple Storeができていました。 &lt;a href="#fnref:p18720917915-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-2"&gt;
&lt;p&gt;&lt;a href="https://developer.apple.com/videos/wwdc/2010/?id=207"&gt;Session 207&lt;/a&gt;、&lt;a href="https://developer.apple.com/videos/wwdc/2010/?id=208"&gt;Session 208&lt;/a&gt; の Network Apps for iPhone OS Part 1 と 2 を見るべし &lt;a href="#fnref:p18720917915-2" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-3"&gt;
&lt;p&gt;Session 208でちゃんとその事実を述べているんだけど、わりといろんな人がハマってるご様子。バックグラウンドスレッドを作ったはいいけれど、&lt;code&gt;-[NSURLConnection start]&lt;/code&gt; だけ呼んで &lt;code&gt;NSRunLoop&lt;/code&gt; を回さずに動かないぃぃ！なんていうことはよくある間違いですね。 &lt;a href="#fnref:p18720917915-3" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-4"&gt;
&lt;p&gt;iOS 4 は OTA、いわゆる端末単体でのアップデートが出来ないため、この問題が厳しい。iPhone 4 は iOS 4 で出荷されて売りまくったので携帯の買い替え期間である2年が経過するまではまだまだiOS 4は生き残り続けるだろう。ま、Android はもっとバージョンとハードウェアのフラグメンテーションが酷いので、それに比べたら天国ですが。 &lt;a href="#fnref:p18720917915-4" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-5"&gt;
&lt;p&gt;いつ完了したかわからないので GCD のセマフォを使っています。セマフォは単なる利用可能かどうかを示すカウンタです。リクエストが完了すると &lt;code&gt;dispatch_semaphore_signal&lt;/code&gt; でカウントアップしてリソースが準備できたことを通知します。&lt;code&gt;dispatch_semaphore_wait&lt;/code&gt; はリソースの準備ができるまで、0じゃなくなるまで待ちます。 &lt;a href="#fnref:p18720917915-5" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-6"&gt;
&lt;p&gt;GCD は簡単です。並列動作させたい仕事をキューに突っ込むとあとはカーネルレベルでうまい具合にスレッドを生成して並列処理してくれるというものです。マルチスレッドがどーのこーのとかあんまり考えなくていいです。あるレベルまでは。 &lt;a href="#fnref:p18720917915-6" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-7"&gt;
&lt;p&gt;やってみるとわかります。&lt;code&gt;bt&lt;/code&gt; するとぐぬぬ、となります。 &lt;a href="#fnref:p18720917915-7" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-8"&gt;
&lt;p&gt;と、言うわりにはこの記事ではほとんど GDB 互換のショートカットなコマンドしか使ってないので安心です。 &lt;a href="#fnref:p18720917915-8" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-9"&gt;
&lt;p&gt;x86_64 の環境では呼び出しの引数は &lt;code&gt;rdi&lt;/code&gt;、&lt;code&gt;rsi&lt;/code&gt;、&lt;code&gt;rdx&lt;/code&gt;、&lt;code&gt;rcx&lt;/code&gt;、&lt;code&gt;r8&lt;/code&gt;、&lt;code&gt;r9&lt;/code&gt; のレジスタに格納されます。戻り値は &lt;code&gt;rax&lt;/code&gt; です。 &lt;a href="#fnref:p18720917915-9" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-10"&gt;
&lt;p&gt;&lt;code&gt;sizeof(void*)&lt;/code&gt; は 8、&lt;code&gt;sizeof(int)&lt;/code&gt; は 4 です。&lt;code&gt;memory read -c 24 $rsi&lt;/code&gt;でも眺めてみましょう。 &lt;a href="#fnref:p18720917915-10" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn:p18720917915-11"&gt;
&lt;p&gt;&lt;a href="http://opensource.apple.com/source/objc4/objc4-493.11/runtime/Messengers.subproj/"&gt;これ&lt;/a&gt;です。 &lt;a href="#fnref:p18720917915-11" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.niw.at/post/18720917915</link><guid>http://blog.niw.at/post/18720917915</guid><pubDate>Sun, 04 Mar 2012 03:13:00 -0800</pubDate></item><item><title>Mountain LionのMessages.appを使ってみた</title><description>&lt;p&gt;Mac OS Xのあたらしいバージョン、10.8、通称「Mountain Lion」の内容が&lt;a href="http://www.apple.com/macosx/mountain-lion/"&gt;ちらりと発表&lt;/a&gt;されました。&lt;/p&gt;

&lt;p&gt;Mountain Lionは&lt;a href="http://www.flickr.com/search/?q=Mountain%20Lion"&gt;こういう生き物&lt;/a&gt;なんですが、それはさておき、今回その一部であるMessages(複数形です)が&lt;a href="http://www.apple.com/macosx/mountain-lion/messages-beta/"&gt;一般にダウンロードできる&lt;/a&gt;ので使って見ました。&lt;/p&gt;

&lt;p&gt;これはこれまでのiChat.appを置き換え、iOSのiMessageに対応させるもので、実際、Messages.appと画面には表示されますが、実態は&lt;code&gt;/Applications/iChat.app&lt;/code&gt;だったりします。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m0cqcfyalh1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;で、感想。まだベータ版なので不都合があってあたりまえなんですが現状、日本語で使う上でこまった問題があります。なんと一つのメッセージに日本語英語が混在するとiOS上で見た時にバラバラになってしまうという問題が&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzimhar5cP1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Messages.appではこのように普通に表示されるのですが&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzimbuivaU1qz5rul.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;iPhoneではこんなことに&amp;#8230;&lt;/p&gt;

&lt;p&gt;うーむ、これテストしなかったのかなあ。なぜバラバラになるのか、プロトコルはXMPPらしいのですが説明ができるひと、@&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt;まで教えてください!&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;以下のようなツイートをもらいました。&lt;/p&gt;

&lt;blockquote class="twitter-tweet" lang="ja"&gt;&lt;p&gt;Mac の iMessage で、欧文と和文が混じったメッセージを iOS Devices に送ったとき分割されてしまうのはフォントの問題で、Mac の方で例えばヒラギノとか和文書体を設定するととりあえず解決する。&lt;/p&gt;— Hiroki Katoさん (@cockscomb) &lt;a href="https://twitter.com/cockscomb/status/170393700822822912" data-datetime="2012-02-17T06:26:38+00:00"&gt;2月 17, 2012&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;謎ですが、フォントをヒラギノに変えたら分割されなくなるようです。手元の環境でヒラギノにしても分割されたこともあるのでよくわかりません。&lt;/p&gt;

&lt;h2&gt;あわせて買いたい&lt;/h2&gt;

&lt;p&gt;Mountain Lionって、たぶんこんなの。&lt;/p&gt;

&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=FFFFFF&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=niwniwat-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=B0076I1NS2" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</description><link>http://blog.niw.at/post/17744371140</link><guid>http://blog.niw.at/post/17744371140</guid><pubDate>Thu, 16 Feb 2012 18:20:00 -0800</pubDate></item><item><title>Tahoe にスノボに行って来た</title><description>&lt;p&gt;まだ筋肉痛で動きが制限されています。こんにちは。&lt;/p&gt;

&lt;p&gt;San Francisco は California 州の都市なんですが、多分カリフォルニアっていうと、こう、 &lt;em&gt;海!&lt;/em&gt; &lt;em&gt;青い空!&lt;/em&gt; だと思うんですが、実は雪山もあります。&lt;/p&gt;

&lt;p&gt;今回はそんな California 州と Nevada 州の境目にある Tahoe のスキーリゾートに遊びに行ってきたというお話。&lt;/p&gt;

&lt;iframe width="500" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/?ie=UTF8&amp;amp;t=m&amp;amp;ll=39.100226,-120.031128&amp;amp;spn=1.492013,2.746582&amp;amp;z=8&amp;amp;output=embed"&gt;&lt;/iframe&gt;

&lt;p&gt;今回はいろいろ準備が後手に回ったり、予約の過程で大失敗をしたりと色々と不手際が重なったのですが、結果的に&lt;a href="http://www.northstarattahoe.com/"&gt;Northstar&lt;/a&gt;という Tahoe の北西にあるリゾートに行きました。&lt;/p&gt;

&lt;p&gt;San Francisco からは只今絶賛増線中の Bay Bridge を渡ってひたすら I-80 を北上する、というコースです。昨年シーズンは渋滞で4〜5時間かかった記憶があるのですが、今回は渋滞もなく途中の Sacramento で休憩しても3時間ちょっとで到着しました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzf9q1xgDb1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;こ、これがスキーリゾート&amp;#8230;?!&lt;/p&gt;

&lt;p&gt;実は Tahoe は昨年シーズン記録的な大雪で、見渡す限り真っ白でしたが、今シーズンは記録的な &lt;em&gt;雪の降らなさ&lt;/em&gt; で1月になってからやっと雪が降り、2月になってからは全然降っていない、みたいな状態です。
到着まで雪がちらほらとしか見えないので、さすがに途中で不安になりました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzf9z9fhLs1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;今回は4名で出かけたので2br2ba(寝室2つ、トイレ風呂も2つ、の意味)のコンドミニアムを借りました。綺麗でキッチンとか暖炉とかもあり、いろいろ準備すればBBQとかも出来ます。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfa35Wyap1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;さて、その雪がないリゾートなのですが、さすがにゲレンデはバッチり雪があります。けっこうガリガリしていて、春スキーって感じでした。あ、スキーはしてませんが。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfa6h4bHh1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;山頂からの光景。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfa8dpE3I1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;ちなみに、日本ではスキー場では1,000円のカレーと相場決まっているのですが、米国では$10のハンバーガーとなります。California なので Tacos とかもあります。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfaedo0w21qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;これまでずっとレンタルだったので San Francisco に引っ越してからボードなどを買いました。ところが、昨年シーズンこのリゾートに来たときにビンディングのパーツを盗まれたり、その後遭難しかかるなど、ここは思い出深いリゾートだったりします。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfanlcScK1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;写ってないけれど、右足のパーツを盗られ、その後交換パーツを送ってもらったりした関係で左右で色が違います。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lzfaltO55F1qz5rul.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;今回はそんなトラブルはなく、かつリフト券を Fast Pass にしたのでリフト待ちが全くなくて非常に快適でした。これはオススメです。&lt;/p&gt;

&lt;p&gt;というわけで、今度はちゃんと準備して今シーズンもうあと1回は行きたいなあと思っています!&lt;/p&gt;</description><link>http://blog.niw.at/post/17649213803</link><guid>http://blog.niw.at/post/17649213803</guid><pubDate>Tue, 14 Feb 2012 23:20:00 -0800</pubDate></item><item><title>Mac OS Xで動的ライブラリのバージョン違いの警告が出た</title><description>&lt;p&gt;たまに、&lt;code&gt;nokogiri.gem&lt;/code&gt;を使っているときに、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;WARNING: Nokogiri was built against LibXML version 2.7.8,
but has dynamically loaded 2.7.3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;と言われて凹むことがあります、というか、先日ありました。原因は多分Mac OS X 10.7.3にしたことなんですがこういう時に何をすればいいのかという話です。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nokogiri.gem&lt;/code&gt;は&lt;code&gt;libxml2&lt;/code&gt;を使ったRubyのXML/HTMLパーサーなんですが、ビルド時に利用した&lt;code&gt;libxml2&lt;/code&gt;のバージョンを覚えていて、実行時に違うバージョンを使うと文句を垂れます。というのも特定の&lt;code&gt;libxml2&lt;/code&gt;はバグがアレすぎて&lt;code&gt;nokogiri.gem&lt;/code&gt;がまともに動かないのでそれを排除する目的でそういうことをしているんだと思います。&lt;/p&gt;

&lt;p&gt;さて、こうなった時には誰が違うバージョンの&lt;code&gt;libxml2&lt;/code&gt;を&lt;code&gt;nokogiri.gem&lt;/code&gt;より &lt;em&gt;先に&lt;/em&gt; ロードしているのを知る必要があります。普通は他のgemが明らかに&lt;code&gt;libxml2&lt;/code&gt;を使っていたりして、あぁ、こいつが違うバージョンの&lt;code&gt;libxml2&lt;/code&gt;をロードしてるのかー って気がつけることもあるのですが、まったく見当がつかない場合が問題です。&lt;/p&gt;

&lt;p&gt;そこで、Mac OS Xで動的ライブラリのいろいろを司ってるのは&lt;code&gt;dyld&lt;/code&gt;ですが、その環境変数で便利な&lt;code&gt;DYLD_PRINT_LIBRARIES&lt;/code&gt;を使います。詳しくは&lt;code&gt;man 1 dyld&lt;/code&gt;。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;DYLD_PRINT_LIBRARIES=1 ruby a_script_requires_many_gems.rb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とすると、ロードされたライブラリがずらずら出てきますので、どのタイミングで期待してない&lt;code&gt;libxml2&lt;/code&gt;がロードされているのか眺めます。例えば、こんな感じ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dyld: loaded: ... /gems/memcached-1.3.1.1/lib/rlibmemcached.bundle
dyld: loaded: /usr/lib/libsasl2.2.dylib
...
dyld: loaded: ... /Kerberos.framework/Versions/A/Kerberos
dyld: loaded: ... /Heimdal.framework/Versions/A/Heimdal
dyld: loaded: ... /Security.framework/Versions/A/Security
dyld: loaded: ... /CoreFoundation.framework/Versions/A/CoreFoundation
...
dyld: loaded: /usr/lib/libxar-nossl.dylib
dyld: loaded: /usr/lib/libDiagnosticMessagesClient.dylib
dyld: loaded: /usr/lib/libbz2.1.0.dylib
dyld: loaded: /usr/lib/libxml2.2.dylib
... ↑あっ
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;おや、ここでMac OS Xの&lt;code&gt;libxml2&lt;/code&gt;が呼ばれていますね。これが原因っぽい。じゃあこれをロードした奴は誰だってことになるので、これより上でロードしているライブラリを&lt;code&gt;otool -L&lt;/code&gt;で調べていきます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ otool -L /usr/lib/libxar-nossl.dylib
/usr/lib/libxar-nossl.dylib:
    /usr/lib/libxar-nossl.dylib (compatibility version 1.0.0, ...
    ...
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, ...
    ... ↑あっ
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ほう、&lt;code&gt;libxar-nossl.dylib&lt;/code&gt;が&lt;code&gt;libxml2&lt;/code&gt;をロードした犯人っぽいですね。で、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ otool -L ... /Security.framework/Versions/A/Security:
    ... /Security.framework/Versions/A/Security (compatibility...
    ...
    /usr/lib/libxar-nossl.dylib (compatibility version 1.0.0, ...
    ... ↑あっ
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ほう、&lt;code&gt;Security.framework&lt;/code&gt;が&lt;code&gt;libxar-nossl.dylib&lt;/code&gt;をロードしていますね。という感じで掘り進めます。で、この依存関係を呼ばれる逆順に書き出すとこうなります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/usr/lib/libxml2.2.dylib
← /usr/lib/libxar-nossl.dylib
← Security.framework
← Kerberos.framework
← /usr/lib/sasl2/libgssapiv2.2.so
← /usr/lib/libsasl2.2.dylib ←これはotool -Lではわかりませんが、明らかですね。
← gems/memcached-1.3.1.1/lib/rlibmemcached.bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;なんと、お前かー! まさか、&lt;code&gt;memcached.gem&lt;/code&gt;が&lt;code&gt;libxml2&lt;/code&gt;をロードしているとは思いもよりませんでした。&lt;code&gt;memcached.gem&lt;/code&gt;は&lt;code&gt;memcached&lt;/code&gt;のクライアントですがXMLを使う余地など無いのでパッと見さっぱりわからないですね。
多分、10.7.3でどこかの誰かがこの依存関係を創り上げたのではないかと思っていますが、今後SASL関係のやつらが全部&lt;code&gt;libxml2&lt;/code&gt;をロードすると思うとげんなりです。&lt;/p&gt;

&lt;p&gt;で、この場合、解決策は&lt;code&gt;nokogiri.gem&lt;/code&gt;を素直に&lt;code&gt;/usr/lib/libxml2.2.dylib&lt;/code&gt;を使うようにビルドしなおせばいいのですがまあ、最適解はそれぞれの状況に応じて変わるのでなんとも言えません。
というわけで、原因がわかってめでたしめでたし!&lt;/p&gt;

&lt;h2&gt;おまけ - gdbで追いかける&lt;/h2&gt;

&lt;p&gt;最初、&lt;code&gt;DYLD_PRINT_LIBRARIES&lt;/code&gt;なんて気が付かなかったので&lt;code&gt;gdb&lt;/code&gt;して&lt;code&gt;dlopen&lt;/code&gt;でブレイクポイント立ててロードしている奴らを知ろうと思いました。結果から言えば&lt;code&gt;dlopen&lt;/code&gt;だけではすべての&lt;code&gt;dyld&lt;/code&gt;のロードを見られるわけではないので失敗したのですが、忘れないようにやり方をメモしておきます。この場合は、&lt;code&gt;dtrace&lt;/code&gt;しても良いんだけど。&lt;/p&gt;

&lt;p&gt;ここでのポイントは&lt;code&gt;dlopen&lt;/code&gt;はデバッグ情報がないのでそのままでは&lt;code&gt;gdb&lt;/code&gt;で引数が表示できないこと。そこで&lt;code&gt;x86_64&lt;/code&gt;の場合、&lt;code&gt;rdiレジスタ&lt;/code&gt;から順に&lt;code&gt;rsi&lt;/code&gt;、&lt;code&gt;rdx&lt;/code&gt;、&lt;code&gt;rcx&lt;/code&gt;、&lt;code&gt;r8&lt;/code&gt;、&lt;code&gt;r9&lt;/code&gt;に引数が入ってるので、それを見ていきます。こんな感じ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gdb --args ruby a_script_requires_many_gems.rb
(gdb) b dlopen  ←dlopenにブレイクポイント立てる
(gdb) r ←実行
...
Breakpoint 1, 0x00007fff93c18929 in dlopen () ←止まる
(gdb) i r ←レジスタ一覧
...
rax    0x1    1
rbx    0x7fff8cbe1000    140735554654208
rcx    0x69    105
rdx    0x9    9
rsi    0x10    16
rdi    0x7fff8cbe1980    140735554656640
rbp    0x7fff5fbfe650    0x7fff5fbfe650
rsp    0x7fff5fbfe640    0x7fff5fbfe640
...
(gdb) p (char *)0x7fff8cbe1980 ← rdi をchar *として見る。$rdi でも同じ。
$1 = 0x7fff8cbe1980 "/usr/lib/libobjc.A.dylib" ←見えた
(gdb) display (char *)$rdi ←止まるたびに出るようにする
(gdb) c ←続行
...
Breakpoint 1, 0x00007fff93c18929 in dlopen ()
1: (char *) $rdi = 0x100275210 "... /thread.bundle" ←見えた
(gdb)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;便利ですね!&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;多分もっとかっこいい方法があるはずなので、是非@&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt;まで教えてください!&lt;/p&gt;</description><link>http://blog.niw.at/post/17311357890</link><guid>http://blog.niw.at/post/17311357890</guid><pubDate>Wed, 08 Feb 2012 23:48:00 -0800</pubDate></item><item><title>ドメインを移管してみるテスト</title><description>&lt;p&gt;現在個人で保有しているドメインがいくつかあります。&lt;/p&gt;

&lt;p&gt;そのうち伝統的に古い90年代に取得したある.comドメインがずーっと当時のNetwork Solutions、今のVeriSignで管理されており、その管理費用が異様に高い(年間$40くらい)なうえに、Network Solutionsのサイトが広告まみれで、なにか操作をするたびに「この機能いらない？いらない？ねえ、本当にいらない？」と聞いてきて非常にイライラするので更新時期を踏まえて移管することにしました。&lt;/p&gt;

&lt;h2&gt;移管先を探す&lt;/h2&gt;

&lt;p&gt;まず、移管先を決めなくてはいけません。条件は、手頃な値段で、うざくなくて、ある程度長い間営業している米国から使っても問題ない、&lt;em&gt;.atドメインに対応している&lt;/em&gt;業者ということで選びました。&lt;/p&gt;

&lt;p&gt;しかし最後の条件がキビしくてかなり絞られることになりました。最初はGoDaddyが浮かんだのですがSOPAの一件もあるのでちょっと敬遠し、結果的に&lt;em&gt;No Bullshit&lt;/em&gt;と言っているレジストラ、&lt;a href="http://gandi.net"&gt;Gandi&lt;/a&gt;に移管することにしました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lylgggWxd11qz5rul.png" alt="Gandi"/&gt;&lt;/p&gt;

&lt;p&gt;フランスの会社です。&lt;/p&gt;

&lt;h2&gt;移管する前にネームサーバーを変えておく&lt;/h2&gt;

&lt;p&gt;ドメインレジストラを変えるということはそのレジストラが提供しているサービスも変えるということになるので、もしレジストラのネームサーバーを使っている場合はそれを予め切り替えておかないといけません。ダウンタイムが発生してもよいのならなにも考えずに移動すればいいような気もしますが、運用されているドメイン名の場合はそうもゆかず。&lt;/p&gt;

&lt;p&gt;ということで一旦、第三者で、簡単に設定できる&lt;a href="http://aws.amazon.com/route53/"&gt;Amazon AWSのRoute 53&lt;/a&gt;に書き換えておきます。
移管が終わって問題なさそうなら移管先のネームサーバーに再度切り替えるのでもいいですし、もし移管先のネームサーバーが事前に分かっていて、かつ設定できるのならそれを利用すればいいとも思います。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# そのドメインで使っているネームサーバー一覧する
$ dig NS ドメイン.名
...
;; ANSWER SECTION:
ドメイン.名.     165948  IN  NS  ns-....awsdns-....com.
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Route 53はAmazonが提供するDNSサービスで名称の53はもちろん、DNSが使うUDPのポート番号に因んでいると思います。サインアップしてゾーンを追加して現在DNSに設定されているレコードを全部作ってから移管元のレジストラでネームサーバーをRoute 53のものに変更します。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lyljgyqC451qz5rul.png" alt="Route 53"/&gt;&lt;/p&gt;

&lt;p&gt;AWSのManagement Consoleからできるので楽チン。&lt;/p&gt;

&lt;h2&gt;移管申請の前にAuthorization Codeを取得&lt;/h2&gt;

&lt;p&gt;.comなどのドメインを移管するときには、移管元のレジストラでAuthorization Codeを取得して、それを移管先に伝える作業が必要です。このあたりのやり取りで重要になるのがドメインのWHOISで登録されているメールアドレスで所有者の確認に使われます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# WHOISを見る
$ whois ドメイン.名
...
Registrant:
Yoshimasa Niwa    メール@アドレス
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;まずDomain Protectみたいな機能がある場合はそれを外して、Authorization Codeを取得します。レジストラによって手順が異なるようですが、基本的にウェブインターフェイスで完了するでしょう。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lylh1q9umH1qz5rul.png" alt="Domain Protect"/&gt;&lt;/p&gt;

&lt;h2&gt;費用の支払いと移管元、移管先からの確認&lt;/h2&gt;

&lt;p&gt;ここまで準備ができたら、移管先のレジストラのサイトで移管したいドメイン名を指定してAuthorization Codeを入力して移管費用などを支払います。&lt;/p&gt;

&lt;p&gt;その後移管元、移管先双方から移管したいドメインのメールアドレスに対して「移管したい言うてるんだけどほんまかいな」的なメールが来ますので、リンクを踏んで「せやで」と答えておきます。この確認メールが来るまでに数時間を要しました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lylh69H0NU1qz5rul.png" alt="Transfer Confirmation"/&gt;&lt;/p&gt;

&lt;h2&gt;移管完了&lt;/h2&gt;

&lt;p&gt;ここから待つこと数日。その日にそのままサクサク終わるかと思いきや、まったくぜんぜん。&lt;/p&gt;

&lt;p&gt;忘れたころに移管元から移管が完了したという通知が来ます。そして移管先からも移管が完了したという通知が来てすべて完了しました。&lt;/p&gt;

&lt;p&gt;結果的に、移管が完了するまでにさらに5日かかりましたが、そういうもののようです。ひょっとしたら手動なのかも。&lt;/p&gt;</description><link>http://blog.niw.at/post/16966988089</link><guid>http://blog.niw.at/post/16966988089</guid><pubDate>Thu, 02 Feb 2012 23:28:32 -0800</pubDate></item><item><title>Mac OS Xのパッケージファイルを操作する</title><description>&lt;p&gt;Mac OS Xではアプリケーションなどをインストールするときに伝統的に.pkgで終わるパッケージが使われています。
しかし、インストールする前にどんなファイルが展開されるんだろう、とか、あのインストーラーに入ってるあのファイルだけ取り出したい、みたいなことがあると思います。&lt;/p&gt;

&lt;p&gt;そんなパッケージにまつわる基本的な操作をまとめました。基本的に&lt;code&gt;Terminal.app&lt;/code&gt;での操作になります。&lt;/p&gt;

&lt;h2&gt;インストールされているパッケージの一覧&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --pkgs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;例えば、mysqlが入ってるかなーとかは、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --pkgs|grep '[m]ysql'
com.mysql.mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;となります。&lt;code&gt;[]&lt;/code&gt;がついてるのは、そういう&lt;code&gt;grep&lt;/code&gt;のテクニックです。&lt;/p&gt;

&lt;h2&gt;インストールされているファイルの一覧&lt;/h2&gt;

&lt;p&gt;既にインストールされているmysqlのパッケージがインストールしたファイルの一覧は次にようにします。インストール前のpkgに対しては後述。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --files com.mysql.mysq
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;インストールされているファイルの削除&lt;/h2&gt;

&lt;p&gt;一応&lt;code&gt;pkgutil&lt;/code&gt;にオプションがあったんですが(&lt;code&gt;--unlink&lt;/code&gt;)、うまく消せないし、フォルダが残ることがあるし、なんかコマンドそれ自体がなくなった気もするので、自前のコマンドを作っています。&lt;a href="https://github.com/niw/profiles/blob/master/bin/rm_pkg_files"&gt;このあたりから入手&lt;/a&gt;してください。
こういうのは&lt;code&gt;root&lt;/code&gt;で実行しますが、なんか重要なファイル消えちゃうかもなので、自己責任で。&lt;/p&gt;

&lt;h2&gt;インストールされているパッケージを消す&lt;/h2&gt;

&lt;p&gt;ファイルの削除ではなく、パッケージの登録を消す場合は次のようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --forget com.mysql.mysq
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;インストール前のパッケージのファイル一覧&lt;/h2&gt;

&lt;p&gt;どんなファイルがpkgでインストールされるか知るには、パッケージによって2種類の方法があります。まず、pkgが単一のファイルの場合(Flat Package File)は次のようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --payload-files path-to-flat-package-file.pkg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;もし、pkgファイルがディレクトリ形式の場合は次のようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ lsbom path-to.pkg/Contents/Archive.bom
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;BOMってなんじゃらほいってことですが、Bill of Materialsという意味だそうです。詳しくは&lt;code&gt;man bom&lt;/code&gt;で。&lt;/p&gt;

&lt;h2&gt;インストール前のパッケージからファイルを取り出す&lt;/h2&gt;

&lt;p&gt;これも2種類それぞれに違う方法が必要です。まず、Flat Package Fileの場合は次にようにしまう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pkgutil --expand path-to-flat-package-file.pkg ./tmp
$ ditto -x --bom ./tmp/path-to-Bom ./tmp/path-top-Payload ./
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;pkgutil&lt;/code&gt;でFlat Package Fileからディレクトリに展開して、その中にある&lt;code&gt;Bom&lt;/code&gt;を使って&lt;code&gt;Payload&lt;/code&gt;ファイルからファイルを取り出します。めんどくさい&amp;#8230;&lt;/p&gt;

&lt;p&gt;ディレクトリの場合は次のようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ pax -rzf path-to.pkg/Contents/Archive.pax.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;また別のコマンド&amp;#8230; なんだか様々な圧縮方法とファイル形式があって、非常に大変です。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;他にも&lt;code&gt;Archive.bom&lt;/code&gt;がない場合とかいろんな形式がある雰囲気なので、もっと良い方法があったら@&lt;a href="http://twitter.com/niw"&gt;niw&lt;/a&gt;まで教えてもらえると嬉しいです!&lt;/p&gt;</description><link>http://blog.niw.at/post/16690761384</link><guid>http://blog.niw.at/post/16690761384</guid><pubDate>Sun, 29 Jan 2012 03:00:00 -0800</pubDate></item><item><title>boundioで電話を鳴らす</title><description>&lt;p&gt;さっきTwitterでちらっと&lt;a href="http://boundio.jp/"&gt;boundio&lt;/a&gt;というのを見かけたので試して見ました。簡単に言えばHTTP POSTで電話を鳴らせるというサービスです。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;なにはともあれアカウント作る&lt;/li&gt;
&lt;li&gt;&lt;p&gt;管理画面の「音声ファイル管理」で音声ファイルをアップする。
さくっとMacの&lt;code&gt;say&lt;/code&gt;コマンドで作りました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;say -o hello.aiff "hello, world"
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;アップロードしたファイルのIDを覚える。多分最初は&lt;code&gt;000001&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;p&gt;curlでお試しURL(サイトではデベロッパーツールというわかりにくいネーミング。)にHTTP POSTする。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl -v 'https://boundio.jp/api/vd1/&amp;lt;自分のユーザーID&amp;gt;/call' \
-d 'key=&amp;lt;デベロッパーツールに載ってるアプリケーションキー&amp;gt;' \
-d 'tel_to=&amp;lt;電話番号&amp;gt;' \
-d 'cast=file(&amp;lt;さっきのアップロードしたファイルのID&amp;gt;)'
{"success":"true","_id":"****"}
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;050の番号から電話がかかってくるらしい&lt;/li&gt;
&lt;li&gt;&lt;p&gt;電話がつながったかどうか後で調べるにはこうする&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ curl -v 'https://boundio.jp/api/vd1/&amp;lt;自分のユーザーID&amp;gt;/tel_status?
  key=&amp;lt;デベロッパーツールに載ってるアプリケーションキー&amp;gt;'
[{"success":"true",
  "result":[
    {"_id":"****",
     "_from":"050********",
     "_to":"+1415*******",
     "_start":"2012-01-17 17:34",
     "_end":"",
     "_duration":"0",
     "_status":"架電待機"},
    {"_id":"****",
     "_from":"050********",
     "_to":"080********",
     "_start":"2012-01-17 17:28",
     "_end":"2012-01-17 17:29",
     "_duration":"34",
     "_status":"架電完了"}, ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ドキュメントには&lt;code&gt;tel_id&lt;/code&gt;が必須と書いてあるけど、指定しないと履歴が取れる。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;ところで、電話がかかってくる「らしい」、というのは、実は米国の番号を試したのですがAPI呼び出しは成功するものの電話かからず。残念ながらダメだったので、日本にいる人の協力を仰いだわけで、本当に電話が鳴ったかどうかは僕にはわからないのです。&lt;/p&gt;

&lt;p&gt;喋らせる音声は自分でアップしたファイルを組み合わせたり、合成音声で番号を喋らせたりできるようです。&lt;/p&gt;

&lt;p&gt;というわけで、&lt;strike&gt;イタ電&lt;/strike&gt;例えば、電話認証やちょっとアレげな通知をするウェブアプリとかに使えそうですね!&lt;/p&gt;</description><link>http://blog.niw.at/post/16000747363</link><guid>http://blog.niw.at/post/16000747363</guid><pubDate>Tue, 17 Jan 2012 00:57:00 -0800</pubDate></item><item><title>2011年を振り返ってみる</title><description>&lt;p&gt;2010年も&lt;a href="http://blog.niw.at/post/15213401886"&gt;同じようなこと&lt;/a&gt;をしていましたので、2011年も数字で振り返ってみようと思います。&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;687&lt;/span&gt;人、140文字をお届け&lt;/h2&gt;

&lt;p&gt;あまりこのブログでは仕事や職場のことを書いていませんが、今働いてるTwitterはこの1年でさらに何倍にも成長しました。二度同じことがない、とてもエキサイティングで楽しい1年でした。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm8.staticflickr.com/7005/6497083241_9e9d12cb40.jpg" alt="Twitter Holiday Party 2011"/&gt;&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;59,693&lt;/span&gt;マイル、15区間&lt;/h2&gt;

&lt;p&gt;2011年は太平洋を何度か往復しましたが、結局、太平洋横断だけで終わりました。是非、2012年こそはヨーロッパ方面にも等にも行けるように頑張りたいと思います。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm7.staticflickr.com/6188/6082121267_eefeb1e639.jpg" alt="DL209"/&gt;&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;35&lt;/span&gt;回レンタル&lt;/h2&gt;

&lt;p&gt;カリフォルニア州のいろいろな所に車で出かけました。あとハワイ州とニューヨーク州にも行ったかな。いい加減、車を手に入れようと思います。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm7.staticflickr.com/6192/6052298007_29c6d06025.jpg" alt="California Blue Sky"/&gt;&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;62,708&lt;/span&gt;通&lt;/h2&gt;

&lt;p&gt;送受信した電子メールの数。だいたい、8分あたり1通の計算。まだ健全ですね。&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;1,679&lt;/span&gt;コミット&lt;/h2&gt;

&lt;p&gt;去年よりはちょっと多いかな。平均5時間あたり1コミット。&lt;a href="https://github.com/niw"&gt;Make things&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;&lt;span style="font-size: x-large; font-family: Georgia, serif;"&gt;2012&lt;/span&gt;年、あるいは平成24年&lt;/h2&gt;

&lt;p&gt;どの数字も少しだけ去年より増えて、よりアクティブな1年だったということがなんとなくわかりました。2012年もたくさんの友達を世界中につくって、新しいものいっぱいつくって、エキサイティングで楽しい年にしたいと思います!&lt;/p&gt;

&lt;p&gt;今年もよろしくお願いします!!&lt;/p&gt;</description><link>http://blog.niw.at/post/15224582489</link><guid>http://blog.niw.at/post/15224582489</guid><pubDate>Mon, 02 Jan 2012 20:29:00 -0800</pubDate></item><item><title>New Yorkの焼き鳥事情</title><description>&lt;p&gt;先日、New Yorkでブランチをした店から出てきたらいきなりコワーカーに声をかけられて、まさに同じ店に入ろうとしていた所だったと。多少有名な店だったのは事実ですが、ばったり街で人に会うことがまさかNew Yorkまで出かけていって起こるとは。&lt;/p&gt;

&lt;p&gt;さて、先輩のブロガー@&lt;a href="http://twitter.com/drikin"&gt;drikin&lt;/a&gt;に&lt;a href="http://blog.drikin.com/2011/11/torikyu.html"&gt;ラーメン以上に恋しい美味しい焼き鳥&lt;/a&gt;と言わしめた焼き鳥ですが、ちょっと前にタイムラインでこんなツイートを見かけたので、&lt;/p&gt;

&lt;blockquote class="twitter-tweet" lang="ja"&gt;&lt;p&gt;Like yakitori? In New York? Come get &lt;a href="https://twitter.com/search/%2523truechicken"&gt;#truechicken&lt;/a&gt; at Tori Shin &lt;a href="http://t.co/4lK5joQX" title="http://torishinny.com/about-us/"&gt;torishinny.com/about-us/&lt;/a&gt; Pre-Nationals omakase with @&lt;a href="https://twitter.com/yarrow"&gt;yarrow&lt;/a&gt; :)&lt;/p&gt;— crystalさん (@crystal) &lt;a href="https://twitter.com/crystal/status/146382202467393536" data-datetime="2011-12-13T00:13:31+00:00"&gt;12月 13, 2011&lt;/a&gt;&lt;/blockquote&gt;

&lt;p&gt;これは行かねば! ということで今回は前回に引き続きNew Yorkの焼き鳥編です。&lt;/p&gt;

&lt;h2&gt;鳥心&lt;/h2&gt;

&lt;p&gt;Upper Eastといっても1st Ave.沿い、Lexington Ave.から極寒のなかを歩いて数分いきなり日本風の門構えの店、&lt;a href="http://torishinny.com/"&gt;鳥心&lt;/a&gt;が現れます。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwngglKjTV1qz5rul.jpg" alt="鳥心"/&gt;&lt;/p&gt;

&lt;p&gt;店内は、なんていうか日本です。日本の大企業の方々の駐在員さんがスーツ姿でお食事をなさっていて、いやはや格差社会とか思ったのですが、それはさておき。&lt;/p&gt;

&lt;p&gt;メニューは単品をランダムに選ぶ方法とコースのおまかせがあって、おまかせは分量的にも内容的にもかなり満足できました。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwngpiCMWb1qz5rul.jpg" alt="焼き鳥"/&gt;&lt;/p&gt;

&lt;p&gt;最後に親子丼とスープと、ちょっと鳥尽くしすぎる! ってくらい楽しめます。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwngqwHZMU1qz5rul.jpg" alt="親子丼"/&gt;&lt;/p&gt;

&lt;p&gt;デザートのしそシャーベットはアメリカのデザートではまずありえない甘さ控えめで驚きです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwngt9nlJU1qz5rul.jpg" alt="デザート"/&gt;&lt;/p&gt;

&lt;p&gt;お値段は、だいたい日本円で6,000円くらいでした。つまり$80なんですが、お安いですね(ドルが)!
ちょっと歩く場所にあるので行きづらいかもしれませんが、たまに焼き鳥が恋しくなったときは6時間の飛行機とさらに数百ドルはらって食べに来るのもありかなと思いました。&lt;/p&gt;

&lt;p&gt;ちなみに、帰り際にSan Franciscoに出店して下さい! と、お願いしておきましたが軽く笑って流されてしまった感があってガックシです。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;合わせて読みたい → &lt;a href="http://blog.niw.at/post/14503885653"&gt;New Yorkのラーメン事情&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.niw.at/post/14664029263</link><guid>http://blog.niw.at/post/14664029263</guid><pubDate>Fri, 23 Dec 2011 01:33:00 -0800</pubDate></item><item><title>New Yorkのラーメン事情</title><description>&lt;p&gt;週末を利用してNew Yorkに遊びに行きました。San Franciscoからは飛行機で5〜6時間と、成田からですと、Singaporeちょっと手前くらいと同じ距離があります。
飛んでる間はずっと北米大陸上空ですので、&lt;a href="http://www.gogoair.com/"&gt;gogo&lt;/a&gt;によるインターネットが使えるのですが、それはまたの機会にブログすることにして、今回はラーメンのお話。&lt;/p&gt;

&lt;h1&gt;「San Franciscoが東京のラーメンにやられたようだな&amp;#8230;」「フフフ&amp;#8230; San Franciscoは&lt;ruby&gt;米国&lt;rt&gt;べいこく&lt;/rt&gt;都四天王&lt;rt&gt;としてんのう&lt;/rt&gt;&lt;/ruby&gt;の中でも最弱」「ラーメンごときで消えるとは北米都市の面汚しよ&amp;#8230;」&lt;/h1&gt;

&lt;p&gt;はっきり言って、New Yorkのご飯クオリティはSan Franciscoとは比べ物にならないクオリティです。ラーメンも例外じゃないです。&lt;/p&gt;

&lt;h2&gt;せたが屋 ニューヨーク&lt;/h2&gt;

&lt;p&gt;まずひとつめ、&lt;a href="http://www.ramensetagayany.com/"&gt;せたが屋&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwaykszy1qz5rul.jpg" alt="St. Marks Pl."/&gt;&lt;/p&gt;

&lt;p&gt;East Villageのなんだかよく見ると和食っぽいなぁ、みたいな店がいっぱいあるストリートにあります。地下鉄を8で降りてちょっと歩きました。このへん。&lt;/p&gt;

&lt;iframe width="506" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=East+Village,+New+York&amp;amp;t=m&amp;amp;ll=40.725535,-73.981419&amp;amp;spn=0.019514,0.04283&amp;amp;z=14&amp;amp;output=embed"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;お店はこんな感じ。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwd1c9Yh1qz5rul.jpg" alt="せたが屋"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwd81tvA1qz5rul.jpg" alt="せたが屋"/&gt;&lt;/p&gt;

&lt;p&gt;塩ラーメンです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwe1byIV1qz5rul.jpg" alt="塩ラーメン"/&gt;&lt;/p&gt;

&lt;p&gt;日本のお店には行った事がない気がするので比較できないんですが、美味しいです。
お昼だったのもあって、あまり混んでませんでした。&lt;/p&gt;

&lt;p&gt;店内は日本のラーメン特集番組が流れていて、デザートにはちゃんと餅アイスがあって定番な感じ。何故か米国にあるラーメン店の基本メニューはラーメンと餃子、唐揚げ、デザートに餅アイスがあって、これはSan Franciscoのお店も同じ。&lt;/p&gt;

&lt;h2&gt;一風堂 ニューヨーク&lt;/h2&gt;

&lt;p&gt;さて、次は有名店、&lt;a href="http://www.ippudony.com/"&gt;一風堂&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;場所はせたが屋から遠くないEast Villageの4th Av.沿い。なんかすごい店の外に寒い中並んでる! って思ったらバス停のバス待ち客でした。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwszc9d71qz5rul.jpg" alt="行列?"/&gt;&lt;/p&gt;

&lt;p&gt;しかし、近づくと中ですごい人が並んでる&amp;#8230; ぐぬぬ。ちなみに、2人とかで1時間くらい待ちみたいのようでした。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwtmpnwL1qz5rul.jpg" alt="一風堂"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwy0zkjH1qz5rul.jpg" alt="一風堂"/&gt;&lt;/p&gt;

&lt;p&gt;ラーメンは日本の一風堂と同じメニュー構成で、白丸をチョイス。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwhwyyIHnH1qz5rul.jpg" alt="白丸元味"/&gt;&lt;/p&gt;

&lt;p&gt;替え玉もあります。&lt;/p&gt;

&lt;p&gt;ところで気になるお値段なのですが&amp;#8230; この円高であってもちょっとこれはっていう値段します。具体的には日本の倍くらい。まあ、ちゃんとしたディナーとしていく雰囲気の店なので五行に近い感じなのかな。&lt;/p&gt;

&lt;p&gt;しかし、ちゃんと米国でこのラーメンが食べられるんですねー。
さてはて、ベイエリアにはいつ来るのか。&lt;/p&gt;

&lt;p&gt;という訳で片道6時間(と、ん百ドル)かけてラーメンを食べに行った話でした。おしまい。&lt;/p&gt;

&lt;hr&gt;&lt;p&gt;合わせて読みたい → &lt;a href="http://blog.niw.at/post/14256752050"&gt;San Franciscoのお寿司事情&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.niw.at/post/14503885653</link><guid>http://blog.niw.at/post/14503885653</guid><pubDate>Tue, 20 Dec 2011 01:33:00 -0800</pubDate></item><item><title>重要なことはfont-size: 600%で</title><description>&lt;div style="font-size: 600%; line-height: 100%;"&gt;来週から、年末年始に東京に行きます。みなさん遊んで下さい! お寿司とか好きです。&lt;/div&gt;

&lt;hr&gt;&lt;p&gt;12/18, 2011 追記: 過ぎ去ると意味がわからないので、解説しておくと、日本時間の2011年12月19日の特大ニュースを&lt;a href="http://www.nikkei.com/"&gt;日本経済新聞&lt;/a&gt;がウェブに掲載した際に、ヘッドラインに&lt;code&gt;font-size: 600%;&lt;/code&gt;の指定をして特別デカイ文字でニュースを掲載したことが話題になりましたの。参考画像がこちらです。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lwflw3BKec1qz5rul.png" alt="日経のヘッドラインの文字がでかすぎる件について"/&gt;&lt;/p&gt;</description><link>http://blog.niw.at/post/14439085863</link><guid>http://blog.niw.at/post/14439085863</guid><pubDate>Sun, 18 Dec 2011 19:34:00 -0800</pubDate></item></channel></rss>

