<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
  
    <language>ja-jp</language>
    
      <title>niw.atの更新フィード</title>
      <link>http://niw.at/</link>
      <description>niw.atから、丹羽善将の作業、記事やブログの更新情報</description>
    
    
      
        <pubDate>Sun, 05 Dec 2010 00:00:00 GMT</pubDate>
        <lastBuildDate>Sun, 05 Dec 2010 00:00:00 GMT</lastBuildDate>
      
    

    
      
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.niw.at/niwat_ja" /><feedburner:info uri="niwat_ja" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
          <title>Reeder for MacにGrowl通知を追加</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0343/growl_for_reeder.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0343/growl_for_reeder_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;数日前に素晴らしい&lt;a href="http://google.com/reader"&gt;Google Reader&lt;/a&gt;のクライアント、&lt;a href="http://reederapp.com/"&gt;Reeder&lt;/a&gt;のMac版が登場しました。
もともとReederはiPhone, iPad用のアプリで、最高のiPhone, iPadアプリのひとつでした。&lt;/p&gt;

&lt;p&gt;現在Reeder for Macはベータ版としてリリースされています。とても良いアプリなのですが、何かが足らないのです。そう、&lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt;による通知です。実は、昨年&lt;a href="http://niw.at/articles/2009/04/26/temporary-growl-plugin-for-tweetie-for-mac/"&gt;Tweetieで似たようなこと&lt;/a&gt;をやっています。&lt;/p&gt;

&lt;p&gt;そこでReeder for MacのプラグインをつくってGrowlによるデスクトップ通知を可能にしました。
未読の記事があるとすぐに通知されるようになります。これで読み逃しと未読地獄からは開放される(かも)しれませんね。
多分近い将来Reeder for Mac自体がデスクトップ通知を実装するとは思いますが、今なにも無いよりはいいかなと思い公開します。&lt;/p&gt;&lt;h2&gt;ダウンロードとインストール&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0353/GrowlReeder-0.1.6.zip"&gt;GrowlReeder-0.1.6.zip (114Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;まずは、&lt;a href="http://reederapp.com"&gt;Reeder for Mac&lt;/a&gt;をインストール。
Reeder fro Macのダウンロード先は&lt;a href="http://twitter.com/reederapp"&gt;Reeder開発者のツイート&lt;/a&gt;で見つかります。&lt;/li&gt;
&lt;li&gt;未だSIMBLをインストールしていなかったら、このプラグインは&lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt;が必要ですので、
先にインストールしてください。&lt;/li&gt;
&lt;li&gt;このプラグインをダウンロードしてパッケージを展開してください。&lt;/li&gt;
&lt;li&gt;Reeder for Macを実行していたら終了して、&lt;code&gt;(自分のホーム)/Library/Application Support/SIMBL/Plugins&lt;/code&gt;にフォルダがなければ作成してください。
そして展開した&lt;code&gt;GrowlReeder.bundle&lt;/code&gt;を&lt;code&gt;Plugins&lt;/code&gt;フォルダにコピーします。&lt;/li&gt;
&lt;li&gt;Reeder for Macを実行すると新着通知が有効になります :)&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;ご注意&lt;/h2&gt;

&lt;p&gt;&lt;del&gt;もしGoogle Readerに未読記事が大量にある場合、このプラグインはReeder for Macの初回起動時に大量のGrowl通知を表示してしまいます。
そのような場合は、まず先にReeder for Macを起動してすべての記事を読み込ませてからこのプラグインをインストールしてください。&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;バージョン0.1.1で一度にたくさんの通知は表示されないようにしました。&lt;/p&gt;

&lt;h2&gt;変更履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.1.6&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最新のReeder for Mac Version 1.1.4に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.5&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最新のReeder for Mac Version 1.1.3に対応&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0352/GrowlReeder-0.1.5.zip"&gt;GrowlReeder-0.1.5.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.4&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最新のReeder for Mac Version 1.1.2に対応&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0351/GrowlReeder-0.1.4.zip"&gt;GrowlReeder-0.1.4.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.3&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最新のReeder for Mac Version 1.1.1に対応&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0350/GrowlReeder-0.1.3.zip"&gt;GrowlReeder-0.1.3.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reeder for Mac Version 1.0 Draft 14に対応&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0349/GrowlReeder-0.1.2.zip"&gt;GrowlReeder-0.1.2.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Growl通知を一度にたくさん出さないように変更&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0348/GrowlReeder-0.1.1.zip"&gt;GrowlReeder-0.1.1.zip (117Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0347/GrowlReeder-0.1.0.zip"&gt;GrowlReeder-0.1.0.zip (115Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ソースコード&lt;/h2&gt;

&lt;p&gt;ソースコードは&lt;a href="http://github.com/niw/growl_reeder"&gt;githubのレポジトリ&lt;/a&gt;で公開しています。&lt;/p&gt;

&lt;h2&gt;ライセンス&lt;/h2&gt;

&lt;p&gt;GrowlReederは&lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;で公開しています。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/TREbdyESkGI" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 05 Dec 2010 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/TREbdyESkGI/</link>
        <feedburner:origLink>http://niw.at/articles/2010/12/05/growl-plugin-for-reeder-for-mac/</feedburner:origLink></item>
      
        <item>
          <title>Mac OS XでネイティブAPIをGoogle Chromeの拡張機能から実行</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0339/open_with_default.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0339/open_with_default_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;先日のWWDCでAppleは&lt;a href="http://www.apple.com/jp/safari/whats-new.html"&gt;Safariの拡張機能&lt;/a&gt;を公開し、また&lt;a href="http://developer.apple.com/safari/"&gt;Safari Developer Program&lt;/a&gt;を開始しました。
既にGoogleはChromeブラウザで&lt;a href="https://chrome.google.com/extensions/"&gt;拡張機能&lt;/a&gt;を提供していますし、にわかにFirefoxの独壇場だった拡張機能市場が盛り上がりを見せています。&lt;/p&gt;

&lt;p&gt;実際、僕はSafariがデフォルトブラウザなのですが、たまにChromeを使って、Chrome上からURLをSafariに送りたくなったりします。
しかし、ちょっと探してみてもそのような拡張機能はありません。なければ作るしかないわけですね!&lt;/p&gt;

&lt;p&gt;ただ、これを実現するには他のアプリケーションをGoogle Chromeから起動しなくてはいけませんし、そうするためにはMac OS XのネイティブAPIを呼び出す必要があるわけです。ひょっとしたらもっと賢い方法があるかもしれないのですけど。Google Chromeは幸い&lt;a href="http://code.google.com/chrome/extensions/npapi.html"&gt;ネイティブコードを拡張機能から実行する手立て&lt;/a&gt;を用意してくれています。そのためにはFlashプレイヤーのようなNPAPIに対応したプラグインを作成して拡張機能のバックグランドページに読み込みます。この記事ではNPAPIプラグインを利用してネイティブコードをエクステンションから呼び出す方法を紹介します。&lt;/p&gt;

&lt;h2&gt;まず始めに&lt;/h2&gt;

&lt;p&gt;ソースコードは&lt;a href="http://github.com/niw/open_with_default"&gt;githubのレポジトリ&lt;/a&gt;で公開しています。
すでにgitを利用している場合はgithubからレポジトリをcloneしてください。gitがない場合は、githubのDownload SourceボタンからZipかTarをダウンロードして解凍してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% git clone git://github.com/niw/open_with_default
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;実験的APIを使うための準備&lt;/h2&gt;

&lt;div class="alert"&gt;
2010/7/28 更新: 以下の情報はすでに古くなっています。右クリックメニューを拡張するAPIは実験的なAPIではなくなりました。Google Chromeを&lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;DevChannel&lt;/a&gt;からダウンロードして実行するだけで、引数の追加は必要ありません!
&lt;/div&gt;


&lt;p&gt;この拡張機能はリンクの右クリックメニューを拡張します。そのためには&lt;a href="http://code.google.com/chrome/extensions/trunk/experimental.html"&gt;実験的なAPI&lt;/a&gt;
を有効にする必要がありますが、これは普通のリリース版では使えません。
まず、Google Chromeを&lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;DevChannel&lt;/a&gt;で提供されているものに更新します。
その後、Google Chromeを起動する際に&lt;code&gt;--enable-experimental-extension-apis&lt;/code&gt;引数を追加します。
たとえば、ターミナル.appから次のように実行します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% open /Applications/Google\ Chrome.app --args --enable-experimental-extension-apis
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;ビルドしてテスト!&lt;/h2&gt;

&lt;p&gt;ダウンロードした&lt;code&gt;OpenWithDefault.xcodeproj&lt;/code&gt;をXcodeで開いて、メニューからビルドを選択します。展開済みの拡張機能が&lt;code&gt;Extension&lt;/code&gt;フォルダに作成されます。
上記の通り、DevChannelからGoogle Chromeをダウンロードして起動します。
「拡張機能」のページを開いて、「デベロッパーメニュー」を有効にします。
「パッケージ化されていない拡張機能を読み込みます&amp;#8230;」という変な日本語のボタンを押して&lt;code&gt;Extension&lt;/code&gt;フォルダを選び拡張機能をGoogle Chromeに読み込みます。&lt;/p&gt;

&lt;p&gt;「Open with Default」という項目がリンクの右クリックメニューに追加されます。選ぶとデフォルトのブラウザ、Safariなどでそのリンクを開くことができます。&lt;/p&gt;

&lt;h2&gt;NPAPIプラグインを拡張機能に読み込む&lt;/h2&gt;

&lt;p&gt;基本的な&lt;a href="http://code.google.com/chrome/extensions/trunk/getstarted.html"&gt;Google Chrome拡張機能の作り方&lt;/a&gt;は割愛します。NPAPIプラグインは、Flashプレイヤーと同じなので、&lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt;タグで&lt;code&gt;background.html&lt;/code&gt;に読み込みます。&lt;code&gt;type&lt;/code&gt;はNPAPIプラグインを作る際に指定します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;body onload="init()"&amp;gt;
&amp;lt;embed type="application/x-open-with-default" id="pluginId"&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このように読み込んだプラグインに対して、&lt;code&gt;id&lt;/code&gt;を使ってJavaScriptからは以下のように呼び出しをします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var plugin = document.getElementById("pluginId");
plugin.open("http://twitter.com/");
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この&lt;code&gt;open&lt;/code&gt;は作ったプラグインで提供するメソッドになります。&lt;/p&gt;

&lt;h2&gt;NPAPIプラグインを作成する&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/NPAPI"&gt;NPAPI&lt;/a&gt;(Netscape Plugin Application Programming Interface)はウェブブラウザのプラグインを作るための伝統的なCのAPIです。
プラグインは任意の関数をブラウザのJavaScriptに提供できるので、そこを経由してネイティブAPIを拡張機能から呼び出すことができるというわけです。&lt;/p&gt;

&lt;p&gt;Mac OS Xでは&lt;code&gt;.plugin&lt;/code&gt;で終わるBundleに特別な&lt;code&gt;Info.plist&lt;/code&gt;を記述することで作成します。以下にこの拡張機能の&lt;code&gt;Info.plist&lt;/code&gt;から重要な部分を掲載します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;key&amp;gt;WebPluginMIMETypes&amp;lt;/key&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;application/x-open-with-default&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;WebPluginTypeDescription&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;A Plugin for Chrome Extension&amp;lt;/string&amp;gt;
    &amp;lt;/dict&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;key&amp;gt;WebPluginName&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;${PRODUCT_NAME}&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;WebPluginDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;A Plugin for Chrome Extension&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここでは&lt;code&gt;embed&lt;/code&gt;タグの&lt;code&gt;type&lt;/code&gt;と同じMIMEタイプを指定する必要があります。この場合は、&lt;code&gt;application/x-open-with-default&lt;/code&gt;です。
またプラグインを初期化するためにいくつかの必要な関数を定義します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NPError NP_Initialize(NPNetscapeFuncs* browserFuncs) {  
    // NPAPIで提供されるAPIをプラグインから呼び出すために保存しておく
    npnfuncs = browserFuncs;
    return NPERR_NO_ERROR;
}

NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) {
    // このプラグインを登録するために必要な関数を指定
    pluginFuncs-&amp;gt;version = (NP_VERSION_MAJOR &amp;lt;&amp;lt; 8) | NP_VERSION_MINOR;
    pluginFuncs-&amp;gt;size = sizeof(pluginFuncs);
    pluginFuncs-&amp;gt;newp = NPP_New;
    pluginFuncs-&amp;gt;destroy = NPP_Destroy;
    pluginFuncs-&amp;gt;getvalue = NPP_GetValue;
    return NPERR_NO_ERROR;
}

void NP_Shutdown(void) {
    // 何もしないけれども、必要です
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この&lt;code&gt;NP_Shutdown&lt;/code&gt;は何もしないですが、これら3つの関数はすべて必要です。&lt;code&gt;NP_GetEntryPoints&lt;/code&gt;では、今回必要な3つの関数、&lt;code&gt;newp&lt;/code&gt;と&lt;code&gt;destroy&lt;/code&gt;、&lt;code&gt;getvalue&lt;/code&gt;を登録します。
&lt;code&gt;newp&lt;/code&gt;と&lt;code&gt;destroy&lt;/code&gt;はこのプラグインがページにロード、アンロードされた際に呼ばれます。&lt;code&gt;getvalue&lt;/code&gt;はJavaScriptからこのプラグインが呼ばれたときに必要になります。&lt;/p&gt;

&lt;h2&gt;JavaScriptから呼べるようにする&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;getvalue&lt;/code&gt;で指定した関数、この場合&lt;code&gt;NPP_GetValue&lt;/code&gt;の中で上で説明したようなJavaScriptの呼び出しをしたときに使われるオブジェクトのインスタンスを生成します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// もしまだインスタンス化していなかったら、作る
if(!plugin_instance) {
    plugin_instance = npnfuncs-&amp;gt;createobject(instance, &amp;amp;plugin_class);
    npnfuncs-&amp;gt;retainobject(plugin_instance);
}
*(NPObject **)value = plugin_instance;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;plugin_class&lt;/code&gt;はJavaScriptから見えるオブジェクトの定義です。またインスタンス化したあとに参照カウントを増やす必要があります。&lt;code&gt;destroy&lt;/code&gt;で指定した関数、つまり&lt;code&gt;NPP_Destroy&lt;/code&gt;でこの参照カウントを減らすことでNPAPIはプラグインがアンロードされたときにこのオブジェクトに確保したメモリを開放することができます。&lt;/p&gt;

&lt;p&gt;このオブジェクトに対して関数、たとえば&lt;code&gt;open&lt;/code&gt;のような呼び出しをした場合、このサンプルでは&lt;code&gt;plugin_class&lt;/code&gt;で定義した&lt;code&gt;plugin_invoke&lt;/code&gt;が関数名と引数とともに呼ばれます。
この中でネイティブの世界でできることがなんでも出来ます。もちろん、デフォルトのブラウザでURLを開く、といったことも。&lt;/p&gt;

&lt;p&gt;関数名は&lt;code&gt;NPIdentifier&lt;/code&gt;型、引数や戻り値は&lt;code&gt;NPVariant&lt;/code&gt;型の配列で提供されます。
これらの値は次の通り通常のUTF-8の文字列などに変換することができます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// NPIdentifierからUTF-8の文字列を得る
NPUTF8 *name = npnfuncs-&amp;gt;utf8fromidentifier(methodName);

// NPVariantからUTF-8の文字列を得る
if(NPVARIANT_IS_STRING(args[0])) {
    NPString str = NPVARIANT_TO_STRING(args[0]);
    // str.UTF8Charactersとstr.UTF8Lengthを使ってなにかする
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;ネイティブAPIを使った拡張機能&lt;/h2&gt;

&lt;p&gt;NPAPIプラグインをつかった拡張機能を作るのは、確かに面倒ですがとても強力です。
たとえば、辞書.appを引くような拡張をGoogle Chromeに追加するといようにGoogle Chromeに欠けている機能を追加できます。
この拡張機能はたいしたことをしていませんが、サンプルとして素晴らしい拡張機能を作る際の参考になればと思います。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/FKkNUen9D2k" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 18 Jun 2010 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/FKkNUen9D2k/</link>
        <feedburner:origLink>http://niw.at/articles/2010/06/18/call-native-api-from-google-chrome-extension-on-mac-os-x/</feedburner:origLink></item>
      
        <item>
          <title>iPhoneでOpenCVを使う方法</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3472/3351972997_d2803aedcf_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3472/3351972997_de85ffbc9c_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3574/3352798974_12dec156fb_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3574/3352798974_c976586f6d_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;OpenCVはIntelが開発したコンピュータビジョンのライブラリで、例えば顔検出などを簡単に行うことができます。
覚え書きとして、OpenCVをiOS SDKをつかってiPhone上やiPadで使う方法を、ビルドスクリプトとデモアプリケーションつきでメモしておきます。
これらのサムネイルはデモアプリケーションのスクリーンショットです。&lt;/p&gt;

&lt;h2&gt;最新のOpenCVとiOS SDKに対応&lt;/h2&gt;

&lt;p&gt;プロジェクトをOpenCV 2.2.0、iOS SDK 4.3、Xcode4に対応しました (2011/4/17更新)。&lt;/p&gt;

&lt;h2&gt;ひとまず使ってみる&lt;/h2&gt;

&lt;p&gt;すべてのソースコードとリソースは&lt;a href="http://github.com/niw/iphone_opencv_test"&gt;githubのレポジトリ&lt;/a&gt;に公開されています。
簡単に使えるように、事前にコンパイルしたOpenCVのライブラリとヘッダファイルを入れてあります。
すでにgitがあるなら、githubからレポジトリをcloneしてください。ない場合は、githubのdownloadリンクからzipかtarをダウンロードして解凍してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% git git://github.com/niw/iphone_opencv_test.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ソースコードを手に入れたら、OpenCVTest.xcodeprojをXcodeで開いてビルドします。
デモアプリケーションがシミュレータと実機両方で動くことが確認できると思います。&lt;/p&gt;&lt;h2&gt;OpenCVのライブラリをソースからビルドする&lt;/h2&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3582/3351973079_749d5126cf_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3582/3351973079_be4530ac26_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;もちろんOpenCVのライブラリをソースからgccでクロスコンパイルすることもできます。
そのための補助スクリプトを追加してあります。
重要なことは、iOS SDKはダイナミックリンク(.frameworkのような)に対応していない点です。
コンパイルするときには静的なライブラリを作成し、アプリケーションに静的にリンクする必要があります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;OpenCVのビルドには&lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt;が必要です。&lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;か&lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt;を利用してインストールするのが簡単です。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Homebrewを使う場合
% brew install cmake
# MacPortsを使う場合
% sudo port install cmake
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;もし最近のAppleのJavaアップデートをインストールしていたとすると、&lt;code&gt;javadeveloper_10.6_10m3261.dmg&lt;/code&gt;のインストールを求められるかもしれません。
かなり変ですが、cmakeはjni.hが必要でそれは最近のJavaアップデートで消されてしまったようです。
一応、&lt;a href="https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719"&gt;ここから&lt;/a&gt;ダウンロードできますが、Apple Developer Connectionに登録する必要があると思います。
ちなみに、このパッケージはいろいろと余計な物もインストールします&amp;#8230; 悩ましいですねえ。どうやら、Appleは&lt;a href="http://www.macrumors.com/2010/10/21/apple-discontinuing-java-installation-packages-for-mac-os-x/"&gt;Javaを消し去りたい&lt;/a&gt;ようですね。 (2010/10/30更新)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenCVのソースコードをSourceForgeからダウンロードしてください。&lt;a href="http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/OpenCV-2.2.0.tar.bz2/download"&gt;OpenCV-2.2.0.tar.bz2&lt;/a&gt;でテストしてあります。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenCVのソースコードをこのデモアプリケーションのディレクトリで展開してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% tar xjvf OpenCV-2.2.0.tar.bz2
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenCVにiOS SDKでビルドできるようにパッチを当ててください&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd OpenCV-2.2.0
% patch -p1 &amp;lt; ../OpenCV-2.2.0.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iPhoneのシミュレータむけには以下の手順でビルドしてください。
ファイルはデフォルトでは&lt;code&gt;opencv_simulator&lt;/code&gt;ディレクトにインストールされます。
&lt;code&gt;make&lt;/code&gt;コマンドでは&lt;code&gt;-j&lt;/code&gt;でCPUに応じてジョブ数を変更してください。
&lt;code&gt;-j&lt;/code&gt;がないとすごく時間がかかります&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd .. # デモアプリケーションのディレクトリに戻る
% mkdir build_simulator
% cd build_simulator
% ../opencv_cmake.sh Simulator ../OpenCV-2.2.0
% make -j 4
% make install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;iPhoneの実機むけには以下の手順でビルドしてください。
ファイルは&lt;code&gt;opencv_device&lt;/code&gt;ディレクトにインストールされます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd .. # デモアプリケーションのディレクトリに戻る
% mkdir build_device
% cd build_device
% ../opencv_cmake.sh Device ../OpenCV-2.2.0
% make -j 4
% make install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;ビルドサポートスクリプト&lt;/h2&gt;

&lt;p&gt;ビルドサポートスクリプト&lt;code&gt;opencv_cmake.sh&lt;/code&gt;はいくつかのオプションがあります。環境や目的に合わせて選択してください。
&lt;code&gt;--help&lt;/code&gt;オプションをつけるとすべてのオプションが見られます。&lt;/p&gt;

&lt;h2&gt;UIImageとIplImageの相互変換&lt;/h2&gt;

&lt;p&gt;OpenCVはIplImage構造体を処理に使いますが、iOS SDKはUIImageオブジェクトを描画に使います。
つまり、これらの相互変換が必要になるわけですが、ありがたい事にiOS SDKのAPIで可能です。&lt;/p&gt;

&lt;p&gt;IplImageをUIImageから作成するには、このようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// NOTE 戻り値は利用後cvReleaseImage()で解放してください
- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
  // CGImageをUIImageから取得
  CGImageRef imageRef = image.CGImage;

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // 一時的なIplImageを作成
  IplImage *iplimage = cvCreateImage(
    cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
  );
  // CGContextを一時的なIplImageから作成
  CGContextRef contextRef = CGBitmapContextCreate(
    iplimage-&amp;gt;imageData, iplimage-&amp;gt;width, iplimage-&amp;gt;height,
    iplimage-&amp;gt;depth, iplimage-&amp;gt;widthStep,
    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
  );
  // CGImageをCGContextに描画
  CGContextDrawImage(
    contextRef,
    CGRectMake(0, 0, image.size.width, image.size.height),
    imageRef
  );
  CGContextRelease(contextRef);
  CGColorSpaceRelease(colorSpace);

  // 最終的なIplImageを作成
  IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
  cvCvtColor(iplimage, ret, CV_RGBA2BGR);
  cvReleaseImage(&amp;amp;iplimage);

  return ret;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;戻り値のIplImageは利用後にcvReleaseImageで解放することを忘れないでください!&lt;/p&gt;

&lt;p&gt;UIImageをIplImageから作成するには、このようにします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// NOTE IplImageは事前にRGBモードにしておいてください。
- (UIImage *)UIImageFromIplImage:(IplImage *)image {
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // CGImageのためのバッファを確保
  NSData *data =
    [NSData dataWithBytes:image-&amp;gt;imageData length:image-&amp;gt;imageSize];
  CGDataProviderRef provider =
    CGDataProviderCreateWithCFData((CFDataRef)data);
  // IplImageのデータからCGImageを作成
  CGImageRef imageRef = CGImageCreate(
    image-&amp;gt;width, image-&amp;gt;height,
    image-&amp;gt;depth, image-&amp;gt;depth * image-&amp;gt;nChannels, image-&amp;gt;widthStep,
    colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
    provider, NULL, false, kCGRenderingIntentDefault
  );
  // UIImageをCGImageから取得
  UIImage *ret = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
  CGDataProviderRelease(provider);
  CGColorSpaceRelease(colorSpace);
  return ret;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これでOpenCVをiPhoneで使うことができます!&lt;/p&gt;

&lt;h2&gt;OpenCVのライブラリを自分のプロジェクトで使う際の注意点&lt;/h2&gt;

&lt;p&gt;デモアプリケーションのXcodeプロジェクトはOpenCVのライブラリを使うためにいくつか特別な設定を加えています。
もし、自分のプロジェクトでOpenCVのライブラリを使う場合は、デモアプリケーションのXcodeプロジェクトを参考に以下の設定を行ってください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;libopencv_core.a&lt;/code&gt;などをOpenCVのデバイス用かシミュレータ用のlibディレクトリから追加してください。
実際に使われるファイルはLibrary Search Pathsで決定されますので、どちらでも構いません。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Accelerate.framework&lt;/code&gt;を追加してください。OpenCVの内部で利用しているライブラリが含まれています。&lt;/li&gt;
&lt;li&gt;アクティブなターゲットを選択して情報パネルの「ビルド」タブを「情報を見る」メニューから開いてください。

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-lstdc++&lt;/code&gt;と&lt;code&gt;-lz&lt;/code&gt;をOther Linker Flagsに追加してください。&lt;/li&gt;
&lt;li&gt;OpenCVの&lt;code&gt;include&lt;/code&gt;ディレクトリへのパスをHeader Search Pathsにシミュレータ用とデバイス用に追加してください。&lt;/li&gt;
&lt;li&gt;OpenCVの&lt;code&gt;lib&lt;/code&gt;ディレクトリをLibrary Search Pathsにシミュレータ用とデバイス用に追加してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;変更履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2011/04/17 - OpenCV 2.2.0とiOS SDK 4.3、Xcode 4に対応。コメントありがとう!&lt;/li&gt;
&lt;li&gt;2010/10/30 - 最近の状況に合わせて文章を変更。コメントありがとう!&lt;/li&gt;
&lt;li&gt;2010/08/22 - OpenCV 2.1.0とiOS SDK 4.0に対応&lt;/li&gt;
&lt;li&gt;2009/12/21 - Snow Leopardでの問題を修正。Hyonさん、ありがとう!&lt;/li&gt;
&lt;li&gt;2009/11/05 - OpenCV 2.0.0とiPhone SDK 3.xに対応&lt;/li&gt;
&lt;li&gt;2009/03/14 - OpenCV 1.1.0とiPhone SDK 2.x対応版を公開&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ご支援のお願い&lt;/h2&gt;

&lt;p&gt;もしこのプロジェクトを気に入って頂けましたら、お気軽に以下のフォームから&lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt;を通じてご支援いただけると幸いです。&lt;/p&gt;

&lt;p&gt;&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="5C84VM52Z94JY" /&gt;
&lt;input type="hidden" name="item_name" value="iPhone OpenCV Test Donation" /&gt;
&lt;input type="hidden" name="item_number" value="IPHONE_OPENCV_TEST-DONATION" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="JPY" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="JP" /&gt;
ご支援 &lt;input type="text" name="amount" value="1000" size="6" /&gt;円
&lt;input type="submit" name="submit" value="寄付する" /&gt;
&lt;/form&gt;&lt;/p&gt;

&lt;p&gt;皆様のご支援に感謝いたします。&lt;/p&gt;

&lt;h2&gt;ライセンス&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://github.com/niw/iphone_opencv_test/"&gt;このサンプル&lt;/a&gt;は&lt;a href="http://ja.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;で公開しています。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/xgpm8fSvHh4" height="1" width="1"/&gt;</description>
          <pubDate>Sat, 14 Mar 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/xgpm8fSvHh4/</link>
        <feedburner:origLink>http://niw.at/articles/2009/03/14/using-opencv-on-iphone/</feedburner:origLink></item>
      
        <item>
          <title>エクスプレス予約をiPhoneで使う</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0249/expy_login.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0249/expy_login_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;東海道新幹線の&lt;a href="http://expy.jp/"&gt;エクスプレス予約&lt;/a&gt;をたまに使います。&lt;/p&gt;

&lt;p&gt;頻繁につかうビジネスマンの方もおおいかと思いますが、残念ながらiPhoneには対応していません。
いちおうPC用のウェブ画面が使えるように見えるのですが、拡大をするとボタンがどこかにいってしまったり、画面が欠けたりしてまったく使いものになりません。
もちろん、携帯用の画面はまったく表示できません。&lt;/p&gt;

&lt;p&gt;そこで、対処療法的にこのエクスプレス予約をiPhoneのSafariから使う為のブックマークレットを作成しました。
このブックマークレットを使う事で、なんとか使うことができる状態までもっていくことができます。
このブックマークレットには次の機能が入っています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ログイン画面へのブックマークとして機能&lt;/li&gt;
&lt;li&gt;ログイン画面で会員ID、パスワードのオートフィル(自動入力)機能&lt;/li&gt;
&lt;li&gt;予約画面をiPhoneで使えるようするための自動補正機能&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;専用アプリをApp Storeにて提供中&lt;/h2&gt;

&lt;div style="float: right; margin-left: 20px;"&gt;
&lt;a href="http://dotswitch.net/services/rapidy/"&gt;&lt;img src="http://niw.at/page_attachments/0000/0323/Icon_120_icon.png" size="icon" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;審査と契約に非常に長い時間がかかってしまいましたが、エクスプレス予約の専用ブラウザアプリ&lt;a href="http://dotswitch.net/services/rapidy/"&gt;Rapidy 新幹線予約&lt;/a&gt;を公開しました。このブックマークレットは引き続き公開します。どうぞご利用ください。&lt;/p&gt;

&lt;h2&gt;エクスプレス予約の変更に対応 (2011年3月24日 更新)&lt;/h2&gt;

&lt;p&gt;2011年3月中旬に行われたエクスプレス予約サイトの変更に対応しました。既にブックマークレットをこのページで作成した場合は、一度既存のブックマークレットを削除し、再度このページでつくり直してください。&lt;/p&gt;&lt;h2&gt;iPhone用エクスプレス予約のブックマークレットの作成と登録&lt;/h2&gt;

&lt;p&gt;以下のパネルからブックマークレットの作成と登録が行えます。&lt;/p&gt;

&lt;script type="text/javascript"&gt;
var expy = {
  bookmarklet: function(userid, password, type, autologin) {
    return 'javascript:(function(){'
    + 'var USERID="' + userid + '",PASSWORD="' + password + '",TYPE=' + type + ',AUTOLOGIN=' + (autologin ? 'true' : 'false') + ';'
    + 'var w=window,d=document,h=d.location.href,u=undefined;'
    + 'if(h.match(/expy\\.jp\\/member\\/login/)){'
    +   'var f=d.forms[TYPE+2],i=f.getElementsByTagName("input");'
    +   'i[0].value=USERID;'
    +   'i[1].value=PASSWORD;'
    +   'if(PASSWORD&amp;&amp;AUTOLOGIN){f.submit()};'
    + '}else if(h.match(/shinkansen1\\.jr-central\\.co\\.jp\\/RSV_P/)){'
    +   'if(!w.expyfix)'
    +     'w.expyfix=setInterval(function(){var f=w.frames[0];'
    +       'if(f){'
    +         'f.onresize=u;'
    +         'var ff=f.frames[0];'
    +         'if(ff){'
    +           'ff.onresize=u;'
    +           'var a=ff.document.getElementsByClassName("padding");'
    +           'for(var i=0;i&lt;a.length;i++)a[i].setAttribute("style","position:static;");'
    +           'var s=[["bottom","top:0;left:0"],'
    +             '["content","width:auto;height:auto"],'
    +             '["side","height:auto"],'
    +             '["guide","width:auto"],'
    +             '["top","display:none"]];'
    +           'for(var i in s){'
    +             'var e = ff.document.getElementById(s[i][0]);'
    +             'if(e)e.setAttribute("style", s[i][1]);'
    +           '}'
    +         '}'
    +       '}'
    +     '},200)'
    + '}else d.location="http://expy.jp/member/login";'
    + '})()';
  },
  updateLinks: function(form, instruction, iphone_link_id, pc_link_id) {
    var userid = $(form["userid"]).getValue();
    var password = $(form["password"]).getValue();
    var type = $(form["type"]).getValue();
    var autologin = $(form["autologin"]).getValue();

    var bookmarklet = expy.bookmarklet(userid, password, type, autologin);
    $(iphone_link_id).setAttribute('href', 'about:?' + bookmarklet);
    $(pc_link_id).setAttribute('href', bookmarklet);

    $(form).hide();
    $(instruction).show();
  }
};
&lt;/script&gt;




&lt;div style="padding: 10px; background: #eee;"&gt;
  &lt;form id="expy_form" onsubmit="expy.updateLinks(this, 'expy_instruction', 'expy_iphone_link', 'expy_pc_link'); return false;"&gt;
    &lt;h3&gt;ステップ1. ブックマークレットを作成&lt;/h3&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;td&gt;クレジットカード種別&lt;/td&gt;&lt;td&gt;&lt;select name="type"&gt;
        &lt;option value="1" selected&gt;エクスプレスカード&lt;/option&gt;
        &lt;option value="2"&gt;J-WESTカード&lt;/option&gt;
      &lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;会員ID&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="userid" /&gt; (任意)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;パスワード&lt;/td&gt;&lt;td&gt;&lt;input type="password" name="password" /&gt; (任意)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;自動ログイン&lt;/td&gt;&lt;td&gt;&lt;input type="checkbox" name="autologin" /&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" value="ブックマークレットを作成" /&gt;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h3&gt;注意事項&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;span style="color: #c00;"&gt;このブックマークレットの利用は自己責任でお願いします。&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span style="color: #c00;"&gt;エクスプレス予約側の変更により動作しなくなる可能性があります。&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;会員IDなどを入力しておくと、オートフィル機能(自動会員ID、パスワード入力)を使うことが出来ます。&lt;/li&gt;
      &lt;li&gt;会員IDのみのオートフィルも可能ですし、入力しなくてもかまいません。&lt;/li&gt;
      &lt;li&gt;パスワードを入力し自動ログインにチェックすると、ログイン画面ですぐにログインするブックマークレットを作成することができます。&lt;/li&gt;
      &lt;li&gt;ここで入力した会員IDやパスワードが外部に送信されることはありません。&lt;/li&gt;
      &lt;li&gt;パスワードを事前に指定すると便利に使えますが、反面誰でもログインすることができるようになりますので危険です。おすすめしません。&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/form&gt;
  &lt;div id="expy_instruction" style="display: none;"&gt;
    &lt;h3&gt;ステップ2. iPhoneでブックマークレットを登録する場合&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;&lt;a href="#" id="expy_iphone_link" target="_blank"&gt;この特別なリンク&lt;/a&gt;をタップし、別ウィンドウを開きます。&lt;/li&gt;
      &lt;li&gt;開いたウィンドウをタイトルを「エクスプレス予約」などとして、一旦ブックマークに追加します。&lt;/li&gt;
      &lt;li&gt;ブックマークボタンを押して先ほど追加したブックマークを編集状態します。&lt;/li&gt;
      &lt;li&gt;アドレスの先頭に付いている「about:?」までタップしてスクロールし、この7文字を削除して、登録します。&lt;/li&gt;
    &lt;/ol&gt;
    &lt;h3&gt;ステップ2. 事前にMac, PCでブックマークレットを作成し、iPhoneとSyncして登録する場合&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;&lt;a href="#" id="expy_pc_link"&gt;このブックマークレットリンク&lt;/a&gt;をタイトルを「エクスプレス予約」などとして、ブックマークに追加します。&lt;/li&gt;
      &lt;li&gt;iPhoneとSyncして、登録します。&lt;/li&gt;
    &lt;/ol&gt;
    &lt;div style="text-align: right;"&gt;
      &lt;a href="#" onclick="$('expy_form').show(); $('expy_instruction').hide(); return false;"&gt;戻る&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;使い方&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;上記「ブックマークレットの作成と登録」パネルを使ってブックマークレットの作成と登録を行ってください。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;登録後、エクスプレス予約以外の画面でこのブックマークレットを開くとログイン画面に移動します。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ここで再度このブックマークレットを開きます、するとオートフィルが行われ、会員IDとパスワード(指定していれば)が入力されます。
また自動ログインにチェックをしてブックマークレットを作成したばあい、自動的にログインが行われます。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;予約のメイン画面が表示されます。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ここでさらにもう一度このブックマークレットを開きます。するとiPhoneでも使えるようにこの予約画面の補正機能が働きます。
終了、次へなど本来画面下部に表示されるバーが画面上部に移動すれば完了です。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;div style="text-align: center; margin: 10px 0;"&gt;
  &lt;table style="margin: auto;"&gt;
    &lt;tr&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0249/expy_login.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0249/expy_login_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0253/expy_bookmark.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0253/expy_bookmark_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0257/expy_loginpanel.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0257/expy_loginpanel_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ログイン画面&lt;/td&gt;
      &lt;td&gt;ブックマークレットを実行&lt;/td&gt;
      &lt;td&gt;自動入力される&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0261/expy_main.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0261/expy_main_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0265/expy_applied.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0265/expy_applied_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0269/expy_booking.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0269/expy_booking_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ログイン直後&lt;/td&gt;
      &lt;td&gt;ブックマークレットを実行すると&lt;br /&gt;画面が補正される&lt;/td&gt;
      &lt;td&gt;予約画面&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;よくある質問と答え&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;画面遷移するたびにこのブックマークレットを実行する必要がありますか?

&lt;ul&gt;
&lt;li&gt;いいえ。ログイン後は一度だけ実行すれば、画面遷移後に(画面スクロールなどを操作をしたときに)自動で補正が適用されます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ログインに失敗したあと、予約画面内のログインフォームが表示されません

&lt;ul&gt;
&lt;li&gt;多少問題があったようです。修正しました。再度ブックマークレットを作成して登録し直して下さい。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;パスワードを入力してブックマークレットを作成しましたが、安全ですか?

&lt;ul&gt;
&lt;li&gt;利便性は高まりますが、まったく安全ではありません。iPhoneを落としたりして、勝手に切符が買われてしまうかもしれませんので、この機能を使う際には十分注意してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;そもそもブックマークレットって何ですか?

&lt;ul&gt;
&lt;li&gt;ブックマークに登録して動作する小さなプログラムのことです。登録したブックマークを開くことでプログラムが実行され、様々な機能をブラウザ内で実行することができます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ご支援のお礼&lt;/h2&gt;

&lt;p&gt;これまでご支援頂、ありがとうございます。現在&lt;a href="http://dotswitch.net/services/rapidy/"&gt;iPhoneアプリを公開中&lt;/a&gt;です。
皆様のご支援に感謝いたします。&lt;/p&gt;

&lt;h2&gt;更新履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;2011/3/24

&lt;ul&gt;
&lt;li&gt;2011年3月中旬のエクスプレス予約のサイト変更に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2009/6/3

&lt;ul&gt;
&lt;li&gt;ふたたび専用アプリについて更新&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2009/4/13

&lt;ul&gt;
&lt;li&gt;専用アプリについて更新&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2009/1/19

&lt;ul&gt;
&lt;li&gt;フレーム内のログインフォームが表示されない問題を解決&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2009/1/16

&lt;ul&gt;
&lt;li&gt;公開&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/GnGr11-oJFk" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 16 Jan 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/GnGr11-oJFk/</link>
        <feedburner:origLink>http://niw.at/articles/2009/01/16/express-yoyaku-on-iphone/</feedburner:origLink></item>
      
        <item>
          <title>Zoommy スタイリッシュイメージ拡大スクリプト</title>
          <description>&lt;p&gt;本日、Zoommyをリリースします!&lt;/p&gt;

&lt;p&gt;Zoommyはイメージ拡大の為のJavaScriptツール。
これは既にこのウェブサイトで利用しているものと同じもので、Zoommyを組み込む事で、
普通の画像とリンクタグを簡単に、ファッショナブルでスタイリッシュなズームインタフェース(よくウェブで見るアレです)を備える事ができます!&lt;/p&gt;

&lt;p&gt;ZoommyはSafari, Firefox, IE7とIE6をMacOS X、およびWindowsで動作確認しています。
Zoommyは&lt;a href="http://www.apple.com/"&gt;Apple webpage&lt;/a&gt;、および&lt;a href="http://www.cabel.name/2008/02/fancyzoom-10.html"&gt;FancyZoom&lt;/a&gt;を参考に作られました。
&lt;a href="http://www.huddletogether.com/projects/lightbox/"&gt;Lightbox.js&lt;/a&gt;の代わりとして使うことができます。&lt;/p&gt;

&lt;h2&gt;デモ&lt;/h2&gt;

&lt;p&gt;Zoommyは次のHTMLを自動的にZoomminizeします!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;さらに、Zoommyは複数の画像をつなげてスライドショーギャラリーを作ることもできます!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['mySlideShow']" title="Montmartre, Paris, France"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['mySlideShow']" title="Raffles Hotel, Singapore"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['mySlideShow']" title="Karuizawa, Nagano, Japan"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['mySlideShow']" title="Montmartre, Paris, France"&gt;
&lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['mySlideShow']" title="Raffles Hotel, Singapore"&gt;
&lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['mySlideShow']" title="Karuizawa, Nagano, Japan"&gt;
&lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;ダウンロード&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0313/zoommy-0.1.0.zip"&gt;zoommy-0.1.0.zip (95Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Zoommyを使ってみる&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;依存するライブラリをウェブサイトにコピーします&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  Zoommyは&lt;a href="http://www.prototypejs.org/"&gt;Prototype.js&lt;/a&gt;&lt;strong&gt;バージョン1.6.x&lt;/strong&gt;と&lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;バージョン1.8.xに依存しています。
  もしすでにウェブサイトがこれらのライブラリを使っている場合、たとえば、&lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;のプロジェクトなどではこれらのファイルをコピーする必要はありません。&lt;/p&gt;

&lt;p&gt;  Zoommyは現状、Prototype.jsバージョン1.5.xには対応していません。事前にPrototype.jsのバージョンを確認してください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javascripts/prototype.js&lt;/li&gt;
&lt;li&gt;&lt;p&gt;javascripts/effects.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;次のファイルをウェブサイトにコピーします&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;images/zoommy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;javascripts/zoommy.js&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;  なお、zoommy.jsはコンパクト化済みのもので、zoommy_pack.jsはより圧縮されたもの、zoommy_src.jsはコンパクト化するまえのものです。用途の応じて使い分けてください。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ウェブサイトのページのheadタグに以下のコードを追加します。&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  すでにprototype.jsとeffects.jsへのタグがある場合はこれらを追加する必要はありません。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;head&amp;gt;
    ....
    &amp;lt;script type="text/javascript" src="javascripts/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type="text/javascript" src="javascripts/effects.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type="text/javascript" src="javascripts/zoommy.js"&amp;gt;&amp;lt;/script&amp;gt;
    ....
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;追加の設定コードを記述&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  もし上記手順2.でコピーした画像を違う場所にしたい場合は、各ページのheadタグに以下のコードを追加します。
  ここでの&lt;strong&gt;imagePath&lt;/strong&gt;はそのウェブページからの相対パスかサイト全体の絶対パスである必要があります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;head&amp;gt;
    ....
    &amp;lt;script type="text/javascript"&amp;gt;
    zoommy_config = {imagePath: "relative/or/site/wide/absolute/path/to/zoommy/image/from/html"};
    &amp;lt;/script&amp;gt;
    ....
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;これで完了です。ウェブサイトを表示してみましょう!&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;カスタマイズ&lt;/h2&gt;

&lt;h3&gt;タイトルを表示する&lt;/h3&gt;

&lt;p&gt;  画像をズーム表示した際に、タイトルを表示することができます。&lt;strong&gt;title=&amp;#8221;&lt;em&gt;(画像のタイトル)&lt;/em&gt;&amp;#8221;&lt;/strong&gt;をリンクタグに追加してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" title="Blue sky and Sunshine!!"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" title="Blue sky and Sunshine!!"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;スライドショーギャラリーを作成する&lt;/h3&gt;

&lt;p&gt;  &lt;strong&gt;rel=&amp;#8221;zoommy[&amp;#8217;&lt;em&gt;(スライドショーの識別子)&lt;/em&gt;&amp;#8217;]&amp;#8221;&lt;/strong&gt;をリンクタグに追加することで、Zoommyは同じ識別子のリンクをスライドショーギャラリーにして表示します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;Zoommyの対象から除外する&lt;/h3&gt;

&lt;p&gt;  もし画像へのリンクをZoommyの対象から除外する場合は、&lt;strong&gt;rel=&amp;#8221;nozoommy&amp;#8221;&lt;/strong&gt;をリンクタグに追加してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" target="_blank" rel="nozoommy"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" target="_blank" rel="nozoommy"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;Zoommyのバッジを表示しない&lt;/h3&gt;

&lt;p&gt;  標準ではZoommyは対象のリンクないのサムネイルにZoommyバッジを左上に表示します。
  その必要がない場合は、&lt;strong&gt;noBadge: true&lt;/strong&gt;というオプションをheadタグの設定コードに加えてください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
....
&amp;lt;script type="text/javascript"&amp;gt;
zoommy_config = {
    noBadge: true
};
&amp;lt;/script&amp;gt;
....
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Z-Indexを調整する&lt;/h3&gt;

&lt;p&gt;  もしZoommyをほかのかっこいいスクリプトやライブラリと同時に使う場合、&lt;strong&gt;baseZIndex&lt;/strong&gt;オプションを設定コードに追加して、Z-Indexの順番を明示する必要があるでしょう。
  標準では、Zoommyは900以降を使います。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
....
&amp;lt;script type="text/javascript"&amp;gt;
zoommy_config = {baseZIndex: 10000};
&amp;lt;/script&amp;gt;
....
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Q. いくつかの画像へのリンクタグがZoommyの対象になりません。なぜですか?&lt;/p&gt;

&lt;p&gt;A. Zoommyは&amp;#8221;.png&amp;#8221;, &amp;#8220;.gif&amp;#8221;, &amp;#8220;.jpg&amp;#8221;または&amp;#8221;.jpeg&amp;#8221;で終わるhref属性か、&amp;#8221;zoommy&amp;#8221;で始まるrel属性を持つリンクタグを対象にします。つまり、もしリンクタグのhref属性がこれらの拡張子で終わらない場合(画像をCGIなどが生成する場合など)は、&lt;strong&gt;rel=&amp;#8221;zoommy&amp;#8221;&lt;/strong&gt;を書き加える必要があるでしょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &amp;lt;a href="/path/to/image?var=value" rel="zoommy"&amp;gt;
    &amp;lt;img src="/path/to/thumbnail" /&amp;gt;
  &amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;更新履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1.0.1

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ご支援のお願い&lt;/h2&gt;

&lt;p&gt;  もしこのZoommyを気に入って頂けましたら、お気軽に以下のフォームから&lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt;を通じてご支援いただけると幸いです。&lt;/p&gt;

&lt;h3&gt;Zoommyを支援する&lt;/h3&gt;

&lt;p&gt;&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="5C84VM52Z94JY" /&gt;
&lt;input type="hidden" name="item_name" value="Zoommy Donation" /&gt;
&lt;input type="hidden" name="item_number" value="ZOOMMY-DONATION" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="JPY" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="JP" /&gt;
ご支援 &lt;input type="text" name="amount" value="1000" size="6" /&gt;円
&lt;input type="submit" name="submit" value="寄付する" /&gt;
&lt;/form&gt;&lt;/p&gt;

&lt;p&gt;皆様のご支援に感謝いたします。&lt;/p&gt;

&lt;h2&gt;ソースコード&lt;/h2&gt;

&lt;p&gt;このプロジェクトはオープンソースプロジェクトです。
すべてのソースコードは&lt;a href="http://github.com/niw/zoommy"&gt;githubのレポジトリ&lt;/a&gt;から取得できます。&lt;/p&gt;

&lt;h2&gt;ライセンス&lt;/h2&gt;

&lt;p&gt;  Zoommyは&lt;a href="http://ja.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;で公開しています。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/yqVF90ezu7A" height="1" width="1"/&gt;</description>
          <pubDate>Thu, 05 Feb 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/yqVF90ezu7A/</link>
        <feedburner:origLink>http://niw.at/articles/2009/02/05/zoommy/</feedburner:origLink></item>
      
        <item>
          <title>TerminalColoreopard LeopardのターミナルのANSI配色を変えるツール</title>
          <description>&lt;h1&gt;TerminalColoreopardの紹介です!&lt;/h1&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0333/color_palette.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0333/color_palette_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0329/additional_menu.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0329/additional_menu_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;MacOS X 10.5(Leopard)が発売されました。Leopardのターミナル(Terminal.app)は日本語を正しくあつかったりだとか、タブ機能だったりだとか、カラーテーマのプロファイルだとかかなり改善されてて満足が行くのですが、一点。なぜかANSIカラー(8色あります)を変更できないのです。Tigerのターミナルでは、同様に変更できなかったのですが、&lt;a href="http://www.culater.net/software/TerminalColors/TerminalColors.php"&gt;Terminal Colors Plugin&lt;/a&gt;を使うことで解決できました。このプラグインは残念ながらLeopardでは動作しません。
そこで、同じようなものをLeopardのTerminal.appむけに作りました。とりあえず動くものができたので公開します。&lt;/p&gt;

&lt;h2&gt;Snow Leopardの対応について&lt;/h2&gt;

&lt;p&gt;Snow Leopardに対応した64bit対応版を公開します。動作には最新の&lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt;が必要です。Leopardでご利用の場合は以前のバージョンをご利用ください。&lt;/p&gt;&lt;h2&gt;ダウンロードとインストール&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0338/TerminalColoreopard-0.2.6.dmg"&gt;TerminalColoreopard-0.2.6.dmg (175Kbyte, Snow Leopard専用)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;上記パッケージをダウンロード&lt;/li&gt;
&lt;li&gt;ダブルクリックしてマウントして下さい&lt;/li&gt;
&lt;li&gt;このプラグインは&lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBLという拡張アプリケーション&lt;/a&gt;が必要です。インストールしていない場合は、SIMBL.pkgをダブルクリックしてインストールしてください。&lt;/li&gt;
&lt;li&gt;ターミナルが起動していないことを確認してください。起動していたら終了してください。&lt;/li&gt;
&lt;li&gt;TerminalColoreopard.bundleを自分のホームの/Library/Application Support/SIMBL/Pluginsにコピーしてください。このコピー先が存在しない場合は作成してください。&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;ささやかな不都合&lt;/h2&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0213/terminal_screen.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0213/terminal_screen_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
&lt;li&gt;現状、このANSIカラー設定はすべてのプロファイルで共用されます。&lt;/li&gt;
&lt;li&gt;パレットで色変更をしても、現状ではすぐに反映されません。ターミナル画面になにか操作をすると反映されると思います。&lt;/li&gt;
&lt;li&gt;日本語リソースを作っていません。&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;1.0にむけての覚書&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;del&gt;不都合を修正&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;インストーラを作る&lt;/li&gt;
&lt;li&gt;組み込みのテーマカラーを用意。Gnome Terminalにあるような、Tangoとか。&lt;/li&gt;
&lt;li&gt;Terminal.appの設定画面に組み込む&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;変更履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.2.6&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mac OS X 10.6.3に対応、Snow Leopard専用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.5 beta&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Snow Leopardに対応、64bit対応ベータ版。Snow Leopard専用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.4&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;明るい色を使うと例外が発生したバグを修正&lt;/li&gt;
&lt;li&gt;明るい色も変えられるように変更&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0327/TerminalColoreopard-0.2.4.dmg"&gt;TerminalColoreopard-0.2.4.dmg (105Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.3&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0.2.2のリリース時に混入したバグを修正&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0314/TerminalColoreopard-0.2.3.dmg"&gt;TerminalColoreopard-0.2.3.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;メモリ管理のバグを修正&lt;/li&gt;
&lt;li&gt;黒色と白色のインターフェイスを追加&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0299/TerminalColoreopard-0.2.2.dmg"&gt;TerminalColoreopard-0.2.2.dmg (64Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MacOS X 10.5.2ソフトウェアアップデートに対応&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0167/TerminalColoreopard-0.2.1.dmg"&gt;TerminalColoreopard-0.2.1.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;配布イメージの背景画像が欠損していたのを修正&lt;/li&gt;
&lt;li&gt;Terminal.app自身の設定にある白黒の設定を削除&lt;/li&gt;
&lt;li&gt;Terminal.appを乗っ取る方法を変更&lt;/li&gt;
&lt;li&gt;カラーパレットの見た目を変更&lt;/li&gt;
&lt;li&gt;ソース公開&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0162/TerminalColoreopard-0.2.0.dmg"&gt;TerminalColoreopard-0.2.0.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0155/TerminalColoreopard-0.1.0.dmg"&gt;TerminalColoreopard-0.1.0.dmg (100Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ご支援のお願い&lt;/h2&gt;

&lt;p&gt;  もしTerminalColoreopardを気に入っていただけましたら、お気軽に以下のフォームから&lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt;を通じてご支援いただけると幸いです。&lt;/p&gt;

&lt;div style="background: #fff; padding: 10px; margin: 10px 0;"&gt;
&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="5C84VM52Z94JY" /&gt;
&lt;input type="hidden" name="item_name" value="TerminalColoreopard Donation" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="JPY" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/articles/2007/11/02/TerminalColoreopard/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="JP" /&gt;
ご支援 &lt;input type="text" name="amount" value="1000" size="6" /&gt;円
&lt;input type="submit" name="submit" value="寄付する" /&gt;
&lt;/form&gt;
&lt;/div&gt;


&lt;p&gt;皆様のご支援に感謝いたします。&lt;/p&gt;

&lt;h2&gt;ソースコード&lt;/h2&gt;

&lt;p&gt;このプロジェクトはオープンソースプロジェクトです。
すべてのソースコードは&lt;a href="http://github.com/niw/terminal_coloreopard"&gt;githubのレポジトリ&lt;/a&gt;から取得できます。&lt;/p&gt;

&lt;h2&gt;ライセンス&lt;/h2&gt;

&lt;p&gt;TerminalColoeropardは&lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;で公開しています。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/rhOY36zqV_E" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 02 Nov 2007 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/rhOY36zqV_E/</link>
        <feedburner:origLink>http://niw.at/articles/2007/11/02/TerminalColoreopard/</feedburner:origLink></item>
      
        <item>
          <title>SafariでGoogle検索画面に言語選択とサムネイルを追加する</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0193/googlethumbnails.png"&gt;&lt;img src="/page_attachments/0000/0193/googlethumbnails_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0185/googlelanguagecodeselector.png"&gt;&lt;img src="/page_attachments/0000/0185/googlelanguagecodeselector_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;GreaseMonkey&lt;/a&gt;というウェブサイトに機能追加をすることができるツールがあります。
便利なのですが、残念なことにこれ自体はSafariでは動きません。しかし、&lt;a href="http://8-p.info/greasekit/"&gt;GreaseKit&lt;/a&gt;というSafariでにたように動くツールがあります。
GreaseKitはGreaseMonkeyとほぼ互換なのですが、&lt;a href="http://userscripts.org"&gt;userscripts.org&lt;/a&gt;でみつけたいくつかの便利なスクリプトはうまく動きませんでした。
そこで、にたような動作をGreaseKitでも動くユーザスクリプトとして実装しました。&lt;/p&gt;&lt;h1&gt;Googleの検索結果にプレビューを表示する&lt;/h1&gt;

&lt;p&gt;Googleの検索結果に検索結果のスクリーンショットプレビューを&lt;a href="http://ackroyd.de/googlepreview/"&gt;google preview&lt;/a&gt;から取得して表示します。&lt;/p&gt;

&lt;h2&gt;ダウンロード&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;&lt;a href="http://github.com/niw/userscripts/raw/6a97423e31ae9a9b1c9286525442c426d06301fc/googlethumbnails.user.js"&gt;googlethumbnails.user.js (0.2.1, GitHubにホスト)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;更新履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0.2.1

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://autopagerize.net/"&gt;AutoPagerize&lt;/a&gt;に対応&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.2 (正しくは0.2.0)

&lt;ul&gt;
&lt;li&gt;Google側の変更に追従&lt;/li&gt;
&lt;li&gt;open.thumbshots.orgからgooglepreview.comに変更&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0285/googlethumbnails-0.2.user.js"&gt;googlethumbnails-0.2.user.js (2Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.1

&lt;ul&gt;
&lt;li&gt;Google側の変更に追従&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0184/googlethumbnails-0.1.1.user.js"&gt;googlethumbnails-0.1.1.user.js (1Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.0

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0181/googlethumbnails-0.1.0.user.js"&gt;googlethumbnails-0.1.0.user.js (1Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;言語選択をGoogle検索に追加する&lt;/h1&gt;

&lt;p&gt;このユーザスクリプトはGoogleの検索を言語を切り替えて(hlパラメータです)実行することができるようにします。
このスクリプトは英語と日本語の切り替えができますが、&amp;#8221;var langs = {&amp;#8230;&amp;#8221;のあたりを変えることで他の言語も追加できます。&lt;/p&gt;

&lt;h2&gt;ダウンロード&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;&lt;a href="http://github.com/niw/userscripts/raw/c5cc5bf7dd6fb3a55779bd1c82066190b9550d83/googlelanguagecodeselector.user.js"&gt;googlelanguagecodeselector.user.js (0.2.1, GitHubにホスト)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;更新履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0.2.1

&lt;ul&gt;
&lt;li&gt;Googleの変更に追従。&amp;#8221;-webkit-appearance: button;&amp;#8221;がボタンに加わった。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.2.0

&lt;ul&gt;
&lt;li&gt;ボタンモードを追加して、デフォルトをボタンモードに&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0337/googlelanguagecodeselector-0.2.0.user.js"&gt;googlelanguagecodeselector-0.2.0.user.js (3Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.1

&lt;ul&gt;
&lt;li&gt;Google側の変更に追従&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0183/googlelanguagecodeselector-0.1.1.user.js"&gt;googlelanguagecodeselector-0.1.1.user.js (2Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.0

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0180/googlelanguagecodeselector-0.1.0.user.js"&gt;googlelanguagecodeselector-0.1.0.user.js (3Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;使い方&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;まずGreaseKitを動かすために&lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt;をインストールしてください。&lt;/li&gt;
&lt;li&gt;次に&lt;a href="http://8-p.info/greasekit/"&gt;この手順にしたがって&lt;/a&gt;GreaseKitをインストールしてください。&lt;/li&gt;
&lt;li&gt;上記からダウンロードしたファイルをSafariにドラック＆ドロップするか、そのままクリックしてInstallしてください&lt;/li&gt;
&lt;li&gt;&lt;a href="http://google.com/"&gt;Google.com&lt;/a&gt;を開くと&amp;#8230;!&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/KoEK8_R1p9c" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 22 Feb 2008 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/KoEK8_R1p9c/</link>
        <feedburner:origLink>http://niw.at/articles/2008/02/22/add-previews-language-selector-to-google-on-safari/</feedburner:origLink></item>
      
        <item>
          <title>ポップアップウィンドウをUIWebViewで使う</title>
          <description>&lt;p&gt;UIWebViewは&lt;a href="http://http://developer.apple.com/iphone/"&gt;iPhone SDK&lt;/a&gt;のかなり重要なUIKitのクラスです。
ご存知の通りSafariが丸ごと入ってますが、しかし、ウィンドウを開く、ポップアップするというイベントは無効にされています。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="somehere" target="_blank" /&amp;gt;Open this link in new window&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;たとえば、このようなリンクがUIWebViewのなかで表示されてユーザがクリックしたとしても、何も起きません。
勿論、UIWebViewはかなり高度に抽象化されていて、いくつかのメソッドを呼ぶ事はできます。
そこで、完璧ではないのですがある程度この問題を解決する手段があります。
鍵となるメソッドは次のものです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
- (void)webViewDidFinishLoad:(UIWebView *)webView
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;すべてのポップアップイベントを奪う&lt;/h2&gt;

&lt;p&gt;まず始めに、表示しているウェブページのすべてのウィンドウを開くイベントを奪います。
どうやるのかというと、JavaScriptで解決します。
手法は、まずすべての開くイベントを奪って開くべきURLを特別なものにして、さらにObjective-C側でその特別なURLを再処理して自前でウィンドウを開きます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (void)webViewDidFinishLoad:(UIWebView *)webView {
  [webView stringByEvaluatingJavaScriptFromString:/* JavaScriptの入った文字列 */];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;次のJavaScriptをstringByEvaluatingJavaScriptFromStringに渡します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
var tags = document.getElementsByTagName("a");
for(var i=0; i &amp;lt; tags.length; i++) {
  var tag = tags[i];
  var t = tag.getAttribute("target");
  var h = tag.getAttribute("href");
  if(/* targetとhrefを確認 */) {
    tag.setAttribute("target", "");
    tag.setAttribute("href", /* href属性から特別なURLを作成 */);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;webViewDidFinishLoadが呼ばれたときにJavaScriptを実行してすべてのアンカータグを奪ってターゲット属性を削除してhrefに特別なのもに置き換えます。
さらに、フォームとJavaScriptからのイベントも奪います。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
var tags = document.getElementsByTagName("form");
for(var i=0; i &amp;lt; tags.length; i++) {
  var tag = tags[i];
  var submit = tag.submit;
  tag.submit = function() {
    var t = tag.target;
    var a = tag.action;
    if(/* targetとactionを確認 */) {
      tag.target = "";
      tag.action = /* action属性から特別なURLを作成  */
    }
    return submit.apply(this, arguments);
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このコードは多くの状況で動くのですが、すべての状況での動作は難しいです。特にsumitイベントのリスナーが存在する場合などです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
window.open = function(url) {
  if(/* urlを確認 */) {
    var t = document.createElement("a");
    t.setAttribute("href", /* 特別なurlを作成 */);
    var e = document.createEvent("MouseEvent");
    e.initMouseEvent("click");
    t.dispatchEvent(e);
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このコードはかなり変なのです。window.openが呼ばれた際に画面の裏で見えないアンカータグをつくりそれに特別なURLを設定してHTTPリクエストを発生させます。
このリクエストをObjective-C側で受け取ります。&lt;/p&gt;

&lt;h2&gt;ポップアップイベントをObjective-Cで受け取る&lt;/h2&gt;

&lt;p&gt;これで、Objective-C側でイベントを受け取る事ができるようになりました。
UIWebViewのdelegateでポップアップイベントを受け取り処理します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  if(navigationType == UIWebViewNavigationTypeLinkClicked || navigationType == UIWebViewNavigationTypeFormSubmitted) {
    NSURL *url = [request URL];
    if(/* URLが特別なものか確認 */) {
      NSString *urlstr = /* 特別なURLから普通のURLに戻す */;
      NSMutableURLRequest *req = [request mutableCopyWithZone:nil];
      [req setURL:[NSURL URLWithString:urlstr]];

      if(/* ポップアップは閉じているか? */) {
        /* ポップアップを開く */
      }
      [popupWebView loadRequest:req];
      return NO;
    }
  }
  return YES;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この凄く長い名前のdelegateですべてのHTTPリクエストを取得することができます。
まずリクエストのURLがJavaScriptでつくった特別なものかをチェックして、もしそうなら普通のURLの戻してNSURLRequestを作成し、ポップアップするUIWebViewに渡します。
これらのコードによってUIWebViewでポップアップを実現できます。&lt;/p&gt;

&lt;h2&gt;特別なURLを作成する&lt;/h2&gt;

&lt;p&gt;この問題はちょっと難しいです。なぜなら、HTTPリクエストのベースURLを保持する必要があるからです。
URLの書き換えても安全な部分、たとえば、スキーマやホスト名などですが、これらを書き換えるとベースURLが失われてしまい、webView:shouldStartLoadWithRequest:navigationTypeの中でポップアップの為のURLを作成することができなくなってしまいます。
そこで、一案ではあるのですが、URLの最後に特別なHashを付与することで一応の解決をみます。
あまり安全ではないのですが、多くの状況では安全です。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
function makeSpecialURL(url) {
  return url + (url.match(/#/) ? "_open" : "#open");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;そして、webView:shouldStartLoadWithRequest:navigationTypeのなかで追加したHashを削除します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
if([[url fragment] hasSuffix:@"open"]) {
  NSString *urlstr = [[url absoluteString] substringToIndex:[[url absoluteString] length] - 5];
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;その他の手法について&lt;/h2&gt;

&lt;p&gt;この問題は多分ドキュメントにのっていないAPIかdelegate(webView:createWebViewWithRequest:)で解決できます。
しかし、iPhone SDKの中だけでは、このJavaScriptを使う手法以外にはよい解決方法はないでしょう。
あまりよい実装ではないですが、iPhoneアプリケーションのなにかの助けになればと思います。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/KD5VngypwLU" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 06 Feb 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/KD5VngypwLU/</link>
        <feedburner:origLink>http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/</feedburner:origLink></item>
      
        <item>
          <title>Tweetie for MacにGrowlを追加(仮)</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0316/tweetie_with_growl.png"&gt;&lt;img src="/page_attachments/0000/0316/tweetie_with_growl_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;いろんな&lt;a href="http://twitter.com/niw"&gt;twitter&lt;/a&gt;クライアントがあふれていますが、今はかなり便利でかっこいい&lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie for Mac&lt;/a&gt;を使っています。
でも、少なくとも現在のバージョンは&lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt;に対応してないんですよね。&lt;/p&gt;

&lt;h2&gt;TweetieHackでTweetie for Macをハック&lt;/h2&gt;

&lt;p&gt;そんなTweetieがGrowlをサポートするのが待てない!ということで、Growlに対応させるプラグインを作りました。&lt;/p&gt;

&lt;p&gt;ご存知の通り、Tweetieの作者はGrowlに対応させる作業をしています。ので、これはとても一時的な急場しのぎのプラグイン(仮)です。Enjoy!&lt;/p&gt;

&lt;h2&gt;TweetieHackアップデートのお知らせ&lt;/h2&gt;

&lt;p&gt;最新のTweetieHack 0.2.0はTweetie 1.1をサポートし、そのGrowl通知を改良します。Tweeterの名前をタイトルに表示したり、最新5件のTweetをTweeterのアイコンと表示する、などなど。&lt;/p&gt;

&lt;p&gt;下記の通りTweetie 1.1でGrowl通知は本体がサポートしましたが、TweetieHackのGrowl通知が良いという方のためにもアップデートは続けようと思います。(2009年5月10日更新)&lt;/p&gt;&lt;h2&gt;Tweetieのアップデートのお知らせ&lt;/h2&gt;

&lt;p&gt;Tweetie 1.1は本体だけでGrowlに対応しています。Growl通知を表示するのには、このプラグインはもはや必要ありません!
TweetieのPreferencesのAccountsパネルにあるNotification OptionsからGrowlを有効にすることができます。 (2009年5月5日更新)&lt;/p&gt;

&lt;h2&gt;ダウンロードとインストール&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0322/TweetieHack-0.2.0.dmg"&gt;TweetieHack-0.2.0.dmg (124Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie for Mac&lt;/a&gt;をインストール&lt;/li&gt;
&lt;li&gt;上記パッケージをダウンロード&lt;/li&gt;
&lt;li&gt;ダブルクリックしてマウントして下さい。&lt;/li&gt;
&lt;li&gt;このプラグインは&lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBLという拡張アプリケーション&lt;/a&gt;が必要です。インストールしていない場合は、SIMBL.pkgをダブルクリックしてインストールしてください。&lt;/li&gt;
&lt;li&gt;Tweetieが起動していないことを確認してください。起動していたら終了してください。TweetieHack.bundleを自分のホームの/Library/Application Support/SIMBL/Pluginsにコピーしてください。このコピー先が存在しない場合は作成してください。&lt;/li&gt;
&lt;li&gt;TweetieのアプリケーションアイコンをCtrlキーを押しながらクリックし、情報を見るを選択してください。32ビットモードで開くにチェックをいれてパネルを閉じてください (この操作は、&lt;strong&gt;Tweetie 1.2では必要ありません&lt;/strong&gt;。Tweetie 1.2は32ビットモードに戻っています)。&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;変更履歴&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.2.0 &amp;#8211; Tweetie 1.1以降用&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tweetie 1.1をサポート。Tweetie本体のGrowl通知を改良&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.2 &amp;#8211; Tweetie 1.0用&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;フックポイントの変更、ダイレクトメッセージをサポート&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0321/TweetieHack-0.1.2.dmg"&gt;TweetieHack-0.1.2.dmg (71Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tweetのカウントバグを修正、残りの未読数を表示&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0320/TweetieHack-0.1.1.dmg"&gt;TweetieHack-0.1.1.dmg (55Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最初のリリース&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0315/TweetieHack-0.1.0.dmg"&gt;TweetieHack-0.1.0.dmg (55Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;ソースコード&lt;/h2&gt;

&lt;p&gt;このプロジェクトはオープンソースプロジェクトです。
すべてのソースコードは&lt;a href="http://github.com/niw/tweetie_hack"&gt;githubのレポジトリ&lt;/a&gt;から取得できます。&lt;/p&gt;

&lt;h2&gt;ライセンス&lt;/h2&gt;

&lt;p&gt;TweetieHackは&lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;で公開しています。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/AkR-bzgzpJ0" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 26 Apr 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/AkR-bzgzpJ0/</link>
        <feedburner:origLink>http://niw.at/articles/2009/04/26/temporary-growl-plugin-for-tweetie-for-mac/</feedburner:origLink></item>
      
        <item>
          <title>MacBook ProにつまったDVDディスクを強制排出する</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm3.static.flickr.com/2140/2457444284_a492697067.jpg"&gt;&lt;img src="http://farm3.static.flickr.com/2140/2457444284_a492697067_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;以前&lt;a href="http://www.apple.com/macbookpro/"&gt;MacBook Pro(17inch, Late 2007)&lt;/a&gt;を手に入れたときにものすごく困ったことがありました。
MacOS X LeopardのインストールDVDをMacBook Proのスロットローディング・ドライブにいれてCキーを押しながら起動したのです。&lt;/p&gt;

&lt;p&gt;しかし、インストールディスクが回転しだしてドライブが読み取ろうしたのですが、何かが問題で読み取りが開始できないようなのです。
この状況は電源を切って入れても回復しませんでした。と、こういうわけでLeopardのDVDはMacBook Proから取り出せなくなりました。&lt;/p&gt;&lt;p&gt;もちろん、ハードディスクから起動してみたのですが、DVDはマウントさてなくて、つまりイジェクトボタンを押しても取り出すことが出来ません。&lt;/p&gt;

&lt;p&gt;思うにドライブのファームウェアがディスクを読み取ろうとはするけれども、何かが問題でそれが完了しない状態がくりかえしていて取り出せなくなったようです。
一応、F12やイジェクトボタンやトラックパッドのボタンを押しっぱなしにして起動したりもしたがのですが(&lt;a href="http://docs.info.apple.com/article.html?artnum=88275"&gt;アップルのFAQに書かれてている方法です&lt;/a&gt;)、さっぱり出てくる気配がありません。&lt;/p&gt;

&lt;h1&gt;強制排出する!&lt;/h1&gt;

&lt;p&gt;まず最初に強制排出させるためにMacBook Proを分解します。&lt;a href="http://www.ifixit.com/Guide/Mac/MacBook-Pro-17-Inch-Core-Duo/Optical-Drive-Replacement/87/10/"&gt;このサイト&lt;/a&gt;が参考になります。&lt;/p&gt;

&lt;p&gt;次のステップはすこし難しいのですが、パームレスなどにつながっているフラットケーブル類はすべてつないだまま電源を入れます。&lt;/p&gt;

&lt;p&gt;その後ディスクドライブが回転しだすのですが、その後ディスクドライブの向かって左がわにフラットケーブル上に4つの小さなドットパターンがあるので、
そのうち2つを金属製の通電するクリップのようなものでショートさせます。
これでディスクが出てきます。&lt;/p&gt;

&lt;p&gt;MacBook Proには物理的なスイッチが一切付いていないのがあだとなったわけですが、この4つのドットパターンは本来物理的なスイッチを配置するためのパターンのようです。&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_ja/~4/4qCPjXilRHY" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 25 Jan 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_ja/~3/4qCPjXilRHY/</link>
        <feedburner:origLink>http://niw.at/articles/2009/01/25/force-to-eject-the-stuck-disc-from-macbook-pro/</feedburner:origLink></item>
      
    
  
  </channel>
</rss>

