<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkYBQno9eSp7ImA9WhRUGEw.&quot;"><id>tag:blogger.com,1999:blog-21285512</id><updated>2012-01-29T15:22:33.461+09:00</updated><category term="contents" /><category term="Daily" /><category term="Game" /><category term="Phone" /><category term="Movie" /><category term="Apple/Mac" /><category term="Cocoa/Objective-C" /><category term="Music" /><category term="Computer" /><title>眠れぬ夜のために</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://forthesleeplessnight.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://forthesleeplessnight.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>956</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/MpzsG" /><feedburner:info uri="blogspot/mpzsg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkYBQno9cSp7ImA9WhRUGEw.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-9191934213404638307</id><published>2012-01-29T13:03:00.000+09:00</published><updated>2012-01-29T15:22:33.469+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-29T15:22:33.469+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>既存のものと同名のネームスペースを addNamespace すると、Snow Leopard 環境で Segmentation fault になる</title><content type="html">&lt;code&gt;NSXMLElement&lt;/code&gt; の &lt;code&gt;addNamespace&lt;/code&gt; メソッドにおいて、レシーヴァがすでに同名のネームスペースを持っている場合、かつ Snow Leopard な環境で実行すると Segmentation fault で落ちる。&lt;br /&gt;
&lt;br /&gt;
　以下のような HTML があるとする。&lt;script src="https://gist.github.com/1696941.js?file=test.html"&gt;&lt;/script&gt;　&lt;code&gt;html&lt;/code&gt; 要素に &lt;code&gt;epub&lt;/code&gt; という名前のネームスペースを持っている。&lt;br /&gt;
&lt;br /&gt;
　次に、この HTML を読み込んで処理を行う以下のようなコードがあるとする。&lt;script src="https://gist.github.com/1696941.js?file=AddNamespaceProblem.m"&gt;&lt;/script&gt;　test.html にはすでに &lt;code&gt;epub&lt;/code&gt; というネームスペースを持っているが、そこにさらに同名のネームスペースを追加する処理を行う。このコードは Lion では正常に動作するが、Snow Leopard で実行すると &lt;code&gt;addNamespace:&lt;/code&gt; の部分で Segmentation fault で落ちる。&lt;br /&gt;
&lt;br /&gt;
　&lt;code&gt;addNamespace:&lt;/code&gt; のドキュメントによると、&lt;blockquote&gt;If the receiver already has a namespace with the same name, aNamespace is not added.&lt;/blockquote&gt;とのことで「レシーヴァがすでに同名のものを持っている場合はネームスペースは追加されない」、つまり何もしないということだと思うんだが、そして Lion ではそのようになっているんだが、Snow Leopard では Segmentation fault で落ちる。うーん……。&lt;br /&gt;
&lt;br /&gt;
　したがって、Snow Leopard で実行される場合は &lt;code&gt;addNamespace:&lt;/code&gt; する前に同名のネームスペースがあるかどうかをチェックしておく必要がある。ある名前を持つネームスペースがあるかどうかは &lt;code&gt;namespaceForPrefix:&lt;/code&gt; メソッドで調べることができる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-9191934213404638307?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/_gVwhkmXPak" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2012/01/addnamespace-snow-leopard-segmentation.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/9191934213404638307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/9191934213404638307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/_gVwhkmXPak/addnamespace-snow-leopard-segmentation.html" title="既存のものと同名のネームスペースを addNamespace すると、Snow Leopard 環境で Segmentation fault になる" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2012/01/addnamespace-snow-leopard-segmentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8NSXgyeip7ImA9WhRWE00.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-762343266393631192</id><published>2011-12-31T13:34:00.001+09:00</published><updated>2011-12-31T13:48:18.692+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T13:48:18.692+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>Cocoa テキストシステムのキィバインドをさらに Emacs に近づける</title><content type="html">本ブログのエントリィ「&lt;a href="http://forthesleeplessnight.blogspot.com/2005/11/keybindingseditor.html" &gt;眠れぬ夜のために: KeyBindingsEditor&lt;/a&gt;」の六年ぶりの続編。&lt;br /&gt;
&lt;br /&gt;
　上記エントリィの繰り返しになるけど、Mac OS X の Cocoa フレームワークを用いて作られたアプリケーションのテキストフィールドは、ディフォルトで Emacs 風なキィバインドが割り当てられている。たとえば &lt;code&gt;Control + p/n/f/b/a/e&lt;/code&gt; によるカーソル移動や &lt;code&gt;Control + d/h&lt;/code&gt; によるカーソル前後の文字削除、&lt;code&gt;Control + k/y&lt;/code&gt; による &lt;code&gt;kill-line&lt;/code&gt; と &lt;code&gt;yank&lt;/code&gt; など。&lt;br /&gt;
　Emacs 風のキィバインドに慣れたユーザであれば、両手をキィボードのホームポジションに置いたままで様々な操作ができるけん、テキスト編集のスピードが上がる。みんな覚えよう！&lt;br /&gt;
&lt;br /&gt;
　ほなけど、ディフォルトの割り当てだけではまだまだ Emacs でよく使う操作には足りない。今回は Cocoa テキストシステムのキィバインドをさらに Emacs に近づけることを考える。&lt;br /&gt;
&lt;br /&gt;
　今回は以下の操作をキィバインドに割り当てる。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;set-mark&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newline-and-indent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kill-region&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kill-ring-save&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;　キィバインドの割り当てには&lt;a href="http://forthesleeplessnight.blogspot.com/2005/11/keybindingseditor.html" &gt;前回のエントリィ&lt;/a&gt;と同じ &lt;a href="http://www.cocoabits.com/KeyBindingsEditor/" &gt;KeyBindingsEditor&lt;/a&gt; を用いる。&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;KeyBindingsEditor を立ち上げる&lt;/li&gt;
&lt;li&gt;メニューバーから File -&amp;gt; Open -&amp;gt; User Key Bindings を選択してユーザのキィバインド定義ファイルを開く&lt;/li&gt;
&lt;li&gt;Add Binding ボタン（2 ストローク以上のキィバインドの場合は Add Multikey binding ボタン）を押してキィバインドを追加する&lt;/li&gt;
&lt;li&gt;追加したキィバインドを選択して、ウィンドウ下部の Keystroke 欄をクリックし、好みのキィバインドをタイプする&lt;/li&gt;
&lt;li&gt;Actions 欄でキィバインドに割り当てる操作を選択する。ひとつのキィバインドにふたつ以上の操作を割り当てたい場合は Add Action ボタンを押してアクションを増やす&lt;/li&gt;
&lt;li&gt;3 - 5 を必要なだけ繰り返す&lt;/li&gt;
&lt;/ol&gt;　KeyBindingsEditor でキィバインドを割り当てた結果が以下の画像のようになる。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-AFu0dUUI9R0/Tv6RlbGMx9I/AAAAAAAADEw/ElaKSMC6rw4/s1600/keybindingseditor.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="311" width="400" src="http://2.bp.blogspot.com/-AFu0dUUI9R0/Tv6RlbGMx9I/AAAAAAAADEw/ElaKSMC6rw4/s400/keybindingseditor.png" /&gt;&lt;/a&gt;&lt;/div&gt;　画像中で Action 欄が &lt;code&gt;(&lt;/code&gt; となっているのはふたつ以上のアクションを割り当てたもの。具体的には &lt;code&gt;Control + j&lt;/code&gt; には &lt;code&gt;insertNewline:&lt;/code&gt; と &lt;code&gt;indent:&lt;/code&gt;、&lt;code&gt;Control + [&lt;/code&gt; に続く 2 ストローク目の &lt;code&gt;Control + w&lt;/code&gt; には &lt;code&gt;deleteToMark:&lt;/code&gt; と &lt;code&gt;yank:&lt;/code&gt; が割り当てられている。&lt;br /&gt;
&lt;br /&gt;
　今回の KeyBindingsEditor での割り当てで &lt;code&gt;kill-ring-save&lt;/code&gt; に対応するキィバインドは &lt;code&gt;Control + [&lt;/code&gt;、&lt;code&gt;Control + w&lt;/code&gt; とした。Emacs において &lt;code&gt;kill-ring-save&lt;/code&gt; に対応するキィバインドは &lt;code&gt;M-w&lt;/code&gt; であり、ふだん私が Emacs でこの操作を行う場合は &lt;code&gt;Meta&lt;/code&gt; を &lt;code&gt;C-[&lt;/code&gt; で代用してから 2 ストローク目で &lt;code&gt;w&lt;/code&gt; を単独で押す。本来であれば KeyBindingsEditor での割り当ても 2 ストローク目は単独の &lt;code&gt;w&lt;/code&gt; で構わない。ほなけど、日本語入力が ON になっている状態で 2 ストローク目の &lt;code&gt;w&lt;/code&gt; を押すと、その入力が IM に取られて割り当てた操作が実行されない（日本語入力が OFF の場合は単独の &lt;code&gt;w&lt;/code&gt;で動作する）。&lt;code&gt;Control&lt;/code&gt; を修飾すると日本語入力が ON の状態でも動作するので、今回のようにしている。&lt;br /&gt;
&lt;br /&gt;
　これで &lt;strong&gt;一般的なCocoa アプリケーションの&lt;/strong&gt;テキストフィールドにて割り当てた操作を実行できる（Cocoa アプリケーションではなかったり、テキストフィールドを独自実装しているような場合は実行できない。たとえば Google Chrome なんかは動作が怪しい）。たとえば &lt;code&gt;Control + Space&lt;/code&gt; でマークし、カーソルを動かして &lt;code&gt;Control + w&lt;/code&gt; すると、マークした箇所からカーソル位置までの文字を削除して kill-ring に格納することができる。kill-ring の内容は &lt;code&gt;Control + y&lt;/code&gt; で &lt;code&gt;yank&lt;/code&gt;。つまり、ホームポジションのままでカットアンドペーストができることになる。&lt;br /&gt;
　割り当て変更後にはアプリケーションの終了、再実行が必要となる。&lt;br /&gt;
&lt;br /&gt;
　ここで、kill-ring の内容と Mac OS X 標準のペーストボードの内容とは関係がないことに注意。コンテキストメニューや &lt;code&gt;Command + c/x&lt;/code&gt; からコピィ・カットした文字を &lt;code&gt;Control + y&lt;/code&gt; で &lt;code&gt;yank&lt;/code&gt; することはできないし、上述の &lt;code&gt;Control + w&lt;/code&gt; で kill-ring に格納した文字を &lt;code&gt;Command + v&lt;/code&gt; でペーストすることはできない。それぞれが独立して動作する。&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-762343266393631192?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/bzjmKhRLwb8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/12/cocoa-emacs.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/762343266393631192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/762343266393631192?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/bzjmKhRLwb8/cocoa-emacs.html" title="Cocoa テキストシステムのキィバインドをさらに Emacs に近づける" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-AFu0dUUI9R0/Tv6RlbGMx9I/AAAAAAAADEw/ElaKSMC6rw4/s72-c/keybindingseditor.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/12/cocoa-emacs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QCRn85eSp7ImA9WhRXFEU.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-197762292640660454</id><published>2011-12-20T05:21:00.001+09:00</published><updated>2011-12-22T02:42:47.121+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T02:42:47.121+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>Mac アプリケーションの環境設定ウィンドウを作る</title><content type="html">&lt;h4&gt;環境設定ウィンドウについて&lt;/h4&gt;　Mac アプリケーションの動作等を設定するときに用いる環境設定ウィンドウを作る。&lt;br /&gt;
&lt;br /&gt;
　環境設定ウィンドウの特徴は、&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;クラスは &lt;code&gt;NSPanel&lt;/code&gt; （非 &lt;code&gt;NSWindow&lt;/code&gt;）&lt;br /&gt;
これはエスケープキィを押したときにウィンドウが閉じられることから&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;ツールバーを持ち、そのツールバーアイテムをクリックすることでウィンドウのヴュウを切り替える&lt;/li&gt;
&lt;li&gt;ヴュウを切り替える際にウィンドウの大きさがアニメーションを伴って変化する&lt;/li&gt;
&lt;/ul&gt;　ここでは、上記のような環境設定ウィンドウの、ウィンドウとしてのふるまいを実装していく。実際にアプリケーションの設定をする方法は別論（&lt;code&gt;NSUserDefaults&lt;/code&gt; 等を用いる）。&lt;br /&gt;
&lt;br /&gt;
　今回作成したプロジェクトは &lt;a href="https://github.com/GenjiApp/PrefWindowApp" &gt;GenjiApp/PrefWindowApp - GitHub&lt;/a&gt; で公開するので参照のこと。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Xcode プロジェクトの作成&lt;/h4&gt;　Xcode を起動し、New Project... から Mac OS X Application の Cocoa Application を選択する。ここでは Project Name を PrefWindowApp とし、適当な場所にプロジェクトを作成する。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;ウィンドウコントローラの追加&lt;/h4&gt;　プロジェクトに環境設定ウィンドウを管理する新しいファイルを追加する。New File... から Objective-C class を選択し、&lt;code&gt;NSWindowController&lt;/code&gt; のサブクラスを作成する。名前は &lt;code&gt;PreferencesWindowController&lt;/code&gt; とした。&lt;br /&gt;
　今回の環境設定ウィンドウはふたつのヴュウを切り替えて操作するものとする。&lt;br /&gt;
　それぞれのヴュウを判別するための &lt;code&gt;tag&lt;/code&gt; に用いる定数を列挙型で宣言しておく。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;typedef enum {
  PreferencesViewGeneral = 100,
  PreferencesViewAdvanced,
} PreferencesViewType;&lt;/code&gt;&lt;/pre&gt;　さらに、それぞれのヴュウと接続するメンバ変数として、ふたつの &lt;code&gt;NSView&lt;/code&gt; クラスの変数を宣言する。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;@interface PreferencesWindowController : NSWindowController
{
  IBOutlet NSView *generalView_;
  IBOutlet NSView *advancedView_;
}&lt;/code&gt;&lt;/pre&gt;　最後に、ヴュウを切り替えるアクションメソッドを宣言する。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;- (IBAction)switchView:(id)sender;&lt;/code&gt;&lt;/pre&gt;　実装部は後回しにして、次に xib ファイルを編集する。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;環境設定ウィンドウの xib ファイルを編集する&lt;/h4&gt;　&lt;code&gt;MainMenu.xib&lt;/code&gt; ファイルを開く。&lt;br /&gt;
　Object Libaray から Object（&lt;code&gt;NSObject&lt;/code&gt;）をドラッグしてトップレヴェルに追加する。オブジェクトの Identity Inspector で Class を先ほど作成した &lt;code&gt;PreferencesWindowController&lt;/code&gt; に設定する。&lt;code&gt;MainMenu&lt;/code&gt; の Preferences... メニューアイテムから &lt;code&gt;PreferencesWindowController&lt;/code&gt; へ Control + ドラッグして &lt;code&gt;showWindow:&lt;/code&gt; と接続する。&lt;br /&gt;
&lt;br /&gt;
　Object Library から Panel（&lt;code&gt;NSPanel&lt;/code&gt;）をキャンバスにドラッグして追加する。パネルの Attribute Inspector で以下の設定を行う。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Style を Regular Panel に変更&lt;/li&gt;
&lt;li&gt;Controls の Resize と Minimize からチェックを外す&lt;/li&gt;
&lt;li&gt;Behavior の Hide on Deactivate と Visible At Launch からチェックを外す&lt;/li&gt;
&lt;/ul&gt;　次に &lt;code&gt;PreferencesWindowController&lt;/code&gt; からパネルへ Control + ドラッグして &lt;code&gt;window&lt;/code&gt; と接続する。&lt;br /&gt;
&lt;br /&gt;
　Object Library からToolbar（&lt;code&gt;NSToolbar&lt;/code&gt;）をパネルにドラッグして追加する。ツールバーの Attribute Inspector で Customizable からチェックを外す。&lt;br /&gt;
　ツールバーの Allowed Toolbar Items からすべてのツールバーアイテムを削除し、代わりに Object Library から Image Toolbar Item（&lt;code&gt;NSToolbarItem&lt;/code&gt;）をふたつドラッグして追加する。追加したふたつのツールバーアイテムをそれぞれ Default Toolbar Items 欄にドラッグする。ツールバーアイテムの Attribute Inspector より以下のように設定する。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Image Name をそれぞれ &lt;code&gt;NSPreferencesGeneral&lt;/code&gt;、&lt;code&gt;NSAdvanced&lt;/code&gt; に設定する&lt;/li&gt;
&lt;li&gt;Label をそれぞれ General、Advanced に設定する&lt;/li&gt;
&lt;li&gt;Palette Label をそれぞれ General、Advanced に設定する&lt;/li&gt;
&lt;li&gt;Tag をそれぞれ &lt;code&gt;100&lt;/code&gt;、&lt;code&gt;101&lt;/code&gt; に設定する&lt;br /&gt;
この &lt;code&gt;100&lt;/code&gt;、&lt;code&gt;101&lt;/code&gt; は &lt;code&gt;PreferencesWindowController.h&lt;/code&gt; で宣言した列挙型の値に合わせたもの&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Behavior の Selectable にチェックを入れる&lt;/li&gt;
&lt;/ul&gt;　それぞれのツールバーアイテムからトップレヴェルオブジェクトに追加した &lt;code&gt;PreferencesWindowController&lt;/code&gt; へ Control + ドラッグして &lt;code&gt;switchView:&lt;/code&gt; アクションと接続する。これでツールバーアイテムをクリックしたときに &lt;code&gt;switchView:&lt;/code&gt; アクションが呼ばれるようになる。　&lt;br /&gt;
&lt;br /&gt;
　次に Object Library から Custom View（&lt;code&gt;NSView&lt;/code&gt;）をふたつ、キャンバスにドラッグしトップレヴェルに追加する（Panel への追加ではない）。このヴュウのサイズは適当に違う大きさにしておくと、あとで実装するヴュウ切り替えによるウィンドウサイズの変更が解りやすくなる。とりあえず、解りやすいように Label（&lt;code&gt;NSTextField&lt;/code&gt;）でも追加して適当な文字列を入力しておく。&lt;br /&gt;
トップレヴェルオブジェクトの &lt;code&gt;PreferencesWindowController&lt;/code&gt; からふたつのヴュウへ Control + ドラッグして、それぞれ &lt;code&gt;generalView_&lt;/code&gt;、&lt;code&gt;advancedView_&lt;/code&gt; へ接続する。これで、&lt;code&gt;PreferencesWindowController.m&lt;/code&gt; からふたつのヴュウを参照できるようになる。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;環境設定ウィンドウのふるまいを実装する&lt;/h4&gt;　&lt;code&gt;PreferencesWindowController.m&lt;/code&gt; を開き、以下のような &lt;code&gt;switchView:&lt;/code&gt; メソッドを実装する。これは前述のツールバーアイテムをクリックしたときに呼ばれるアクションメソッドである。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;- (IBAction)switchView:(id)sender
{
  NSWindow *window = [self window];
  NSView *contentView = [window contentView];

  NSArray *subviews = [contentView subviews];
  if([subviews count]) {
    NSView *currentView = [subviews objectAtIndex:0];
    [currentView removeFromSuperview];
  }

  NSToolbarItem *item = (NSToolbarItem *)sender;
  NSString *title = [item label];
  [window setTitle:title];

  NSView *newView = nil;
  switch([item tag]) {
    case PreferencesViewGeneral:
      newView = generalView_;
      break;
    case PreferencesViewAdvanced:
      newView = advancedView_;
      break;
    default:
      return;
  }

  NSRect windowFrame = [window frame];
  NSRect newWindowFrame = [window frameRectForContentRect:[newView frame]];
  newWindowFrame.origin.x = windowFrame.origin.x;
  newWindowFrame.origin.y = windowFrame.origin.y + windowFrame.size.height - newWindowFrame.size.height;
  [window setFrame:newWindowFrame display:YES animate:YES];

  [contentView addSubview:newView];
}&lt;/code&gt;&lt;/pre&gt;　ここで行なっていることは、&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;ウィンドウの &lt;code&gt;contentView&lt;/code&gt; がサブヴュウを持っている場合はそれを取り除く&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sender&lt;/code&gt;、つまりツールバーアイテムの &lt;code&gt;label&lt;/code&gt; からウィンドウのタイトルを設定する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sender&lt;/code&gt;、つまりツールバーアイテムの &lt;code&gt;tag&lt;/code&gt; から切り替え先となる新しいヴュウを判別する&lt;/li&gt;
&lt;li&gt;ウィンドウと新しいヴュウの &lt;code&gt;frame&lt;/code&gt; から、切り替え後のウィンドウの &lt;code&gt;frame&lt;/code&gt; を計算する&lt;/li&gt;
&lt;li&gt;計算したウィンドウの新しい &lt;code&gt;frame&lt;/code&gt; をウィンドウにアニメーション付きで適用する&lt;/li&gt;
&lt;li&gt;ウィンドウの &lt;code&gt;contentView&lt;/code&gt; に新しいヴュウを追加する&lt;/li&gt;
&lt;/ol&gt;である。&lt;br /&gt;
　ウィンドウの新しい &lt;code&gt;frame&lt;/code&gt; について、Mac OS X の座標系は左下原点なので、&lt;code&gt;contentView&lt;/code&gt; のサイズを変更しただけでは、ウィンドウの上端が動いてしまうことになる。したがって、ヴュウ切り替え前のウィンドウの上端座標を計算し、そこから切り替え後のウィンドウの高さを引くことで、ウィンドウの新しい原点座標を得る。&lt;br /&gt;
&lt;br /&gt;
　最後に、以下のような &lt;code&gt;awakeFromNib&lt;/code&gt; メソッドを追加する。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;- (void)awakeFromNib
{
  NSWindow *window = [self window];
  NSToolbar *toolbar = [window toolbar];
  NSArray *toolbarItems = [toolbar items];
  NSToolbarItem *item = [toolbarItems objectAtIndex:0];

  [toolbar setSelectedItemIdentifier:[item itemIdentifier]];
  [self switchView:item];
  [window center];
}&lt;/code&gt;&lt;/pre&gt;　&lt;code&gt;awakeFromNib&lt;/code&gt; メソッドは xib ファイルが読み込まれ、そこに登録されたオブジェクトにアウトレット接続がなされたあとで呼ばれる。ここでツールバーアイテムの初期選択状態や、最初に表示されるヴュウの設定を行う。今回はツールバーアイテムの一番最初のものを初期状態に設定するようにしたが、選択状態を適当な方法で保存しておき、次回起動時にその状態を復元しても良いかもしれない。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;ビルドして実行&lt;/h4&gt;　以上により、環境設定ウィンドウが完成した。アプリケーションを実行し、アプリケーションメニューから Preferences... を選択して環境設定ウィンドウを表示してみる。ツールバーアイテムのクリックでヴュウが切り替わり、同時にウィンドウサイズの変更がアニメーションを伴って変更されることを確認する。&lt;br /&gt;
&lt;br /&gt;
　今回作成したプロジェクトは &lt;a href="https://github.com/GenjiApp/PrefWindowApp" &gt;GenjiApp/PrefWindowApp - GitHub&lt;/a&gt; で公開するので参照のこと。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-197762292640660454?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/H7ygvZHRj3g" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/12/mac.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/197762292640660454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/197762292640660454?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/H7ygvZHRj3g/mac.html" title="Mac アプリケーションの環境設定ウィンドウを作る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/12/mac.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QDRXc4cCp7ImA9WhRRGU8.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-4788993751089636033</id><published>2011-12-03T15:27:00.000+09:00</published><updated>2011-12-04T00:16:14.938+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-04T00:16:14.938+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>Mac App Store に提出するアプリケーションに Spotlight/Quick Look プラグインを同梱する方法</title><content type="html">アプリケーションの Xcode プロジェクトと、Spotlight/Quick Look プラグインのプロジェクトがあるとする。&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;アプリケーションのプロジェクトを開いて、Project navigator にプラグインのプロジェクトをドラッグ・アンド・ドロップする&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ck1hSHC9eWc/TtnCA_SORRI/AAAAAAAADDw/IUBuayFQyMQ/s1600/project_navigator.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="204" width="199" src="http://1.bp.blogspot.com/-ck1hSHC9eWc/TtnCA_SORRI/AAAAAAAADDw/IUBuayFQyMQ/s400/project_navigator.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;プラグインのプロジェクトの Build Settings にて Skip Install を &lt;code&gt;Yes&lt;/code&gt; に設定する&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sTd7ic_RK-w/TtnCPbTLlwI/AAAAAAAADD8/Yx32J4WaJls/s1600/skip_install.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="79" width="400" src="http://4.bp.blogspot.com/-sTd7ic_RK-w/TtnCPbTLlwI/AAAAAAAADD8/Yx32J4WaJls/s400/skip_install.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;アプリケーションのターゲットにて、Build Phases タブで Add Build Phase で Add Copy Files を選択して追加する。Copy Files の Destination には &lt;code&gt;Wrapper&lt;/code&gt;、Subpath はそれぞれ &lt;code&gt;Contents/Library/Spotlight&lt;/code&gt;、&lt;code&gt;Contents/Library/QuickLook&lt;/code&gt; を指定する。コピィするファイルはそれぞれのターゲットを指定する&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-HjBsoMybFuc/TtnCVwzPP9I/AAAAAAAADEI/P7fKHDakfIo/s1600/copy_files.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="356" width="400" src="http://2.bp.blogspot.com/-HjBsoMybFuc/TtnCVwzPP9I/AAAAAAAADEI/P7fKHDakfIo/s400/copy_files.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Build Phases にて Add Build Phases で Add Run Script を選択して追加し、以下のようなコマンドを入力する&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;codesign -v -s "${CODE_SIGN_IDENTITY}" ${CODESIGNING_FOLDER_PATH}/Contents/Library/Spotlight/EPUBImporter.mdimporter
codesign -v -s "${CODE_SIGN_IDENTITY}" ${CODESIGNING_FOLDER_PATH}/Contents/Library/QuickLook/EPUBQLGenerator.qlgenerator&lt;/code&gt;&lt;/pre&gt;署名は提出用だけでいいので、Run script only when installing にチェックを入れておく&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2NTqRGnb8ew/TtnCbi18PiI/AAAAAAAADEU/hBceMT81Y2w/s1600/run_script.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="92" width="400" src="http://2.bp.blogspot.com/-2NTqRGnb8ew/TtnCbi18PiI/AAAAAAAADEU/hBceMT81Y2w/s400/run_script.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Archive して完成&lt;/li&gt;
&lt;/ol&gt;　手順 2 について、Skip Install を &lt;code&gt;Yes&lt;/code&gt; にしておかないと、手順 5 でアプリケーションがうまくアーカイヴできない。&lt;br /&gt;
　手順 3 でアプリケーションパッケージ内に各プラグインを配置。&lt;br /&gt;
　手順 4 でプラグインに署名を行う。以前まではプラグインに署名せずとも大丈夫だったが、ちょっと前からプラグインにも署名をしないといけなくなった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-4788993751089636033?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/FBOhisxQ1Ak" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/12/mac-app-store-spotlightquick-look.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/4788993751089636033?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/4788993751089636033?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/FBOhisxQ1Ak/mac-app-store-spotlightquick-look.html" title="Mac App Store に提出するアプリケーションに Spotlight/Quick Look プラグインを同梱する方法" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ck1hSHC9eWc/TtnCA_SORRI/AAAAAAAADDw/IUBuayFQyMQ/s72-c/project_navigator.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/12/mac-app-store-spotlightquick-look.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkECR3g7fSp7ImA9WhRRFEQ.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-8299156439659826456</id><published>2011-11-28T23:18:00.001+09:00</published><updated>2011-11-28T23:31:06.605+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-28T23:31:06.605+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>EPUB をフォルダ展開するサービスを Automator で作る</title><content type="html">EPUB ファイルは、その構成物を Zip でまとめたもんやけん、EPUB の内部構成等を確認したい場合は、Zip アーカイヴを展開すればよい。&lt;br /&gt;
　ふつうの Zip ファイルであれば拡張子が .zip であり、Finder からダブルクリックすれば関連付けられたアーカイヴ展開ツールが起動してフォルダ展開してくれるだろう。ほなけど EPUB ファイルは拡張子 .epub であり、ファイルをダブルクリックしたところで EPUB 閲覧アプリケーション等がインストールされていればそれが起動し、インストールされていなければどのアプリケーションを用いてファイルを開くかを尋ねてくるダイアログ等が表示されるだけ。&lt;br /&gt;
　ほなけん、EPUB ファイルを展開したい場合は、&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;あらかじめアーカイヴ展開ツールの GUI を起動させ、そこへ EPUB ファイルを読み込ませる&lt;/li&gt;
&lt;li&gt;EPUB ファイルの拡張子を .zip に変更してからダブルクリックでアーカイヴ展開ツールを起動する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ unzip &amp;lt;epubfile.epub&amp;gt;&lt;/code&gt; 等のコマンドライン操作を行う&lt;/li&gt;
&lt;/ul&gt;等の手段を用いることになる。&lt;br /&gt;
&lt;br /&gt;
　めんどくさい。&lt;br /&gt;
　いちいちこんなことをやるのはめんどくさいけん、Automator を使って EPUB をフォルダに展開するサービスを作る。&lt;br /&gt;
&lt;br /&gt;
　Automator を起動し、新規作成のダイアログで「サービス」を選ぶ。「&amp;quot;サービス&amp;quot;は、次の選択項目を受け取ります」には「ファイルまたはフォルダ」を、「検索対象」には「Finder」を選択する。&lt;br /&gt;
　用いるアクションは「シェルスクリプトを実行」のみ。「シェル」には「/bin/bash」を選択して、以下のようなシェルスクリプトを入力する。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;for filePath in &amp;quot;$@&amp;quot;
do
  workingDir=${filePath%/*}
  filename=${filePath##*/}
  extension=${filename##*.}
  filenameWithoutExtension=${filename%.*}
  cd &amp;quot;$workingDir&amp;quot;
  if [ $extension != epub ] ; then continue; fi
  if [ -e &amp;quot;$filenameWithoutExtension&amp;quot; ] ; then continue; fi
  mkdir &amp;quot;$filenameWithoutExtension&amp;quot;
  unzip &amp;quot;$filename&amp;quot; -d &amp;quot;$filenameWithoutExtension&amp;quot;
done&lt;/code&gt;&lt;/pre&gt;　これで完成。かんたんですね。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-AJwawQekVT4/TtOZP06WPTI/AAAAAAAADDk/wSVG7miUCuw/s1600/Thumbnail.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="156" width="400" src="http://3.bp.blogspot.com/-AJwawQekVT4/TtOZP06WPTI/AAAAAAAADDk/wSVG7miUCuw/s400/Thumbnail.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
　保存すると &lt;code&gt;~/Library/Services&lt;/code&gt; に保存される。Finder から EPUB ファイルを選択してコンテキストメニュー（右クリック or Control + クリック）かアプリケーションメニューの「サービス」に保存した Automator ワークフローがあるけん、それを選択すればフォルダに展開してくれる。&lt;br /&gt;
　仕様は以下の通り。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;EPUB ファイルがあるフォルダに EPUB ファイルと同名のフォルダを作り、そこに中身を展開する&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;すでに同名のフォルダがある場合はなにもしない&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;拡張子 .epub 以外のファイルからこのサービスを呼び出してもなにもしない&lt;/li&gt;
&lt;li&gt;複数の EPUB ファイルを一気に展開できる&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-8299156439659826456?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/EmyPRmMe1TE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/11/epub-automator.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8299156439659826456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8299156439659826456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/EmyPRmMe1TE/epub-automator.html" title="EPUB をフォルダ展開するサービスを Automator で作る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-AJwawQekVT4/TtOZP06WPTI/AAAAAAAADDk/wSVG7miUCuw/s72-c/Thumbnail.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/11/epub-automator.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAERns5eSp7ImA9WhRSE08.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-8329717587542378487</id><published>2011-10-18T20:52:00.000+09:00</published><updated>2011-11-15T12:28:27.521+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-15T12:28:27.521+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><title>MacBook Late 2008 の HDD を SSD に換装</title><content type="html">　「&lt;a href="http://forthesleeplessnight.blogspot.com/2011/05/macbook-late-2008-8gb.html"&gt;MacBook Late 2008 のメモリィを 8GB に増設&lt;/a&gt;」でメモリィ増設した MacBook Late 2008、今度は内蔵 HDD を SSD に換装した。&lt;br /&gt;
&lt;br /&gt;
　使用する SSD は &lt;a href="http://www.donya.jp/item/19841.html"&gt;Crucial の M4 SSD 256GB モデル&lt;/a&gt;。前回のメモリィ増設と同じ上海問屋さんから購入した。&lt;br /&gt;
&lt;br /&gt;
　作業自体は超かんたん。必要な工具はプラスドライヴァとトルクスドライヴァ。&lt;a href="http://www.youtube.com/watch?v=613Th34BBhg"&gt;この YouTube 動画&lt;/a&gt;に換装のやり方が紹介されとるけん見ておくと良い。&lt;br /&gt;
&lt;iframe width="640" height="360" src="http://www.youtube.com/embed/613Th34BBhg?rel=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;
　ウチにはサイズの合うトルクスドライヴァがなかったけん、ペンチで挟んで無理矢理回したけど、これは推奨されんやり方やけん真似しないように。&lt;br /&gt;
&lt;br /&gt;
　換装後は Snow Leopard のインストール DVD を挿入して SSD のフォーマット。さらに外付け HDD の Time Machine バックアップからシステムとデータを復元した。インストール DVD は Snow Leopard で、復元するシステムは Lion のものやったけど、いまのところ問題はないみたい。&lt;br /&gt;
&lt;br /&gt;
　ただ、換装前の HDD には Lion にアップグレードした時点で Recovery HD という隠しボリュームができとったんやけど、それが消失した。&lt;br /&gt;
　Recovery HD は緊急時にインストール DVD と同様の作業が行えるボリューム。Mac App Store 経由で Snow Leopard から Lion にアップグレードした場合は、Lion のインストールメディアが存在しないため、インストール DVD の役目を担うボリュームが内蔵ストレージ内に作られる。&lt;br /&gt;
　Time Machine でバックアップされるのはふつうの起動ディスクの内容であり、その外側にある Recovery HD はバックアップされていないのが消失の原因。別に Recovery HD がなくても、トラブルさえ起きなければ、特に問題はないものと思われる。今回のシステム復元で用いたように Snow Leopard のインストール DVD があればそれで役目は果たせると考えてもいいのかも。保険として Recovery HD を持っていた方が良いかもしれないので、復元できる方法を調査してみる。&lt;br /&gt;
&lt;br /&gt;
　換装前後のベンチマークを Xbench で取ったので、それを掲載する。左側は換装前 HDD のベンチマーク、右側が換装後 SSD のベンチマーク。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jjJz9QolaLY/Tp1mqLvPz9I/AAAAAAAADDE/1fdej4QMgo8/s1600/benchmark.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="229" width="400" src="http://3.bp.blogspot.com/-jjJz9QolaLY/Tp1mqLvPz9I/AAAAAAAADDE/1fdej4QMgo8/s400/benchmark.png" /&gt;&lt;/a&gt;&lt;/div&gt;　換装前の Disk Test 総合値が 36.42、換装後が 341.99 と約 9.3 倍のスコアをマークした。換装後の Disk Test 以外の項目のスコアが軒並みダウンしているのは、換装後のベンチマークを取る際に MacBook からバッテリィを外していたため、CPU が抑制されていたものと考えられる（参考「&lt;a href="http://support.apple.com/kb/HT2332?viewlocale=ja_JP"&gt;MacBook および MacBook Pro：AC アダプタ使用時にバッテリーが取り外されるとプロセッサの速度が抑制される&lt;/a&gt;」）。&lt;br /&gt;
&lt;br /&gt;
　なぜバッテリィを外していたのかというと、換装するさいに気がついたんやけど、バッテリィが膨張していたため。裏蓋が閉まらないほどではなかったものの、一応安全を期してしばらくはバッテリィを抜いて MacBook を運用する。後日サポートセンタに連絡したいと思う。&lt;br /&gt;
&lt;br /&gt;
　……抜けやすいマグセーフアダプタでバッテリィなし運用はスリリングだぜ！&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-8329717587542378487?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/8EPQ9lctqSI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/10/macbook-late-2008-hdd-ssd.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8329717587542378487?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8329717587542378487?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/8EPQ9lctqSI/macbook-late-2008-hdd-ssd.html" title="MacBook Late 2008 の HDD を SSD に換装" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/613Th34BBhg/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/10/macbook-late-2008-hdd-ssd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEHSH8-eyp7ImA9WhRSE08.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-5908577812915418710</id><published>2011-10-17T21:56:00.000+09:00</published><updated>2011-11-15T12:27:19.153+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-15T12:27:19.153+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Music" /><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><title>iCloud？ それよりも Complete My Album って覚えてる？</title><content type="html">　Apple の iCloud サーヴィスにおいて、音楽配信に関連する部分が日本では提供されていないというということに対する業界への批判なんかを最近よく目にしたりする。&lt;br /&gt;
&lt;br /&gt;
　iCloud の音楽配信関連サーヴィスは、&lt;a href="http://www.apple.com/jp/icloud/features/"&gt;iCloud の特徴説明ページ&lt;/a&gt;に詳しい。&lt;br /&gt;
　かんたんにまとめると、ひとつはあるデヴァイスでストアから購入した楽曲が自動的に他のデヴァイスへもダウンロードされるというサーヴィス。ひとつは過去にダウンロード購入した楽曲を再ダウンロードできるというサーヴィス。&lt;br /&gt;
　以上は iOS アプリケーションでは同様のサーヴィスが開始されている。&lt;br /&gt;
　次に、上述の日本版説明ページには書いていないが、&lt;a href="http://www.apple.com/icloud/features/"&gt;アメリカ版ページ&lt;/a&gt;には書いてある iTunes Match というサーヴィス。これもかんたんにまとめると、すでに自分が CD 等から iTunes に取り込んだ楽曲で、かつその楽曲が iTunes Store で配信されているものであるとする。その場合、年会費を支払うことでその楽曲をストアで配信されている 256 Kbps で DRM フリーな AAC ファイルをダウンロードできるというサーヴィスである。自分が過去に CD から取り込んだときの、128 Kbps 等の現在から見ると低ビットレートなファイルを、自分で取り込み直すことなくお手軽にアップグレードできるというわけである。&lt;br /&gt;
&lt;br /&gt;
　これらが日本では——というかアメリカ以外のほとんどの国では提供されていない。これに対して業界に批判の声がいったりしているわけである。&lt;br /&gt;
&lt;br /&gt;
　でもちょっと待って。みんな忘れてないかい？　iTunes Store のサーヴィスでまだ日本で始まっていないのがあるよ。それは Complete My Album というサーヴィス。これに関する説明は日本語では&lt;a href="http://www.apple.com/jp/pr/library/2007/03/30Apple-to-Offer-Major-League-Baseball-Video-Highlights-on-the-iTunes-Store.html"&gt;このプレスリリース&lt;/a&gt;にある。&lt;br /&gt;
　かんたんに説明する。一曲あたり 99 セントでアルバム単位では 9.99 ドルであったとき、そのアルバムからたとえば三曲を購入したとする。そのあとでアルバム単位で購入しようとするときは、先に購入した三曲分の値段がアルバム価格から割り引かれて 7.02 ドルで購入できるというわけ。たいていアルバムを一曲ずつ購入するよりもアルバム単位で購入した方が価格が安い。でも、先にアルバムから数曲を購入していた場合、一曲ずつ残りのものを購入した方が安いのか、あるいはアルバム単位で購入した方が安いのかを自分で計算しなければならない。アルバム単位で購入したとしても、先に購入した楽曲がダブってしまう。こんなスマートじゃない状況を解決してくれるのが Complete My Album というサーヴィス。&lt;br /&gt;
　これ、上述のプレスリリースを見ると解る通り、アメリカでは 2007 年に始まっている。4 年も前だけどまだ日本では始まっていない。&lt;br /&gt;
&lt;br /&gt;
　いま注目を集めている iCloud の音楽配信関連サーヴィスについては先に説明をしたけど、よく考えてほしい。&lt;br /&gt;
　購入した楽曲が手持ちの他のデヴァイスへ自動ダウンロードできたらそれは便利だけど、それがなくたって明示的に同期をすれば済む話ではある。iTunes Store で購入した楽曲はダウンロードしたデヴァイスでの再生に限られているわけじゃないからね。楽曲の再ダウンロードはそれが必要になるのはレアケースじゃないかな？ Time Machine でバックアップ取っとけばまあ問題ないと思う。iTunes Match に関しては、これだけは他のと違って有料サーヴィスなのでちょっと言及を避けるけども。&lt;br /&gt;
&lt;br /&gt;
　とまあこのように、iCloud の音楽配信関連サーヴィスはなきゃないでまだいいと思うんだ。&lt;br /&gt;
　それよりもアメリカでは 4 年も前に始まっている Complete My Album、こっちを先にサーヴィスインしてほしいとは思わないかい？&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-5908577812915418710?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/WpfxrTto9is" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/10/icloud-complete-my-album.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/5908577812915418710?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/5908577812915418710?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/WpfxrTto9is/icloud-complete-my-album.html" title="iCloud？ それよりも Complete My Album って覚えてる？" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/10/icloud-complete-my-album.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UMQXsyfSp7ImA9WhdREUo.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-751719440449371483</id><published>2011-07-31T21:56:00.003+09:00</published><updated>2011-08-01T14:08:00.595+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-01T14:08:00.595+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>Automator を用いて EPUB を作る</title><content type="html">　Mac OS X Lion の Automator には「テキストを EPUB ファイルにレンダリング」というアクションが追加されている。このアクションを用いることでテキストファイル（.txt）もしくはリッチテキスト（.rtf）から EPUB ファイルを生成することができる。今回は以下のようなサービスを作成して実際にどのような EPUB が生成されるかを見てみる。&lt;br /&gt;
  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cChqjdzikoM/TjU5QT9VZ0I/AAAAAAAAC_c/MI8dlGhl59Y/s1600/automator_epub.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://2.bp.blogspot.com/-cChqjdzikoM/TjU5QT9VZ0I/AAAAAAAAC_c/MI8dlGhl59Y/s400/automator_epub.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;　この Automator ワークフローを保存すると &lt;code&gt;~/Library/Services&lt;/code&gt; に保存され、Finder のサービスメニューもしくはファイル選択して右クリックのコンテキストメニューから実行できるようになる。&lt;br /&gt;
「テキストを EPUB ファイルにレンダリング」アクションは複数ファイルの入力をサポートしており、その場合はファイル名の順番に章立てされるような感じで EPUB が生成される。複数のファイルから生成する場合はそれらに連番を付ける等をしておくと並び順を制御できる。 &lt;br /&gt;
&lt;br /&gt;
　原稿のテキストファイルとそれらから生成した EPUB が以下。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/160781/samples/EPUB/Automator%20%E3%81%A7%20EPUB%20%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%B7%A8%EF%BC%89.zip"&gt;Automator で EPUB を作る（テキストファイル編）.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/160781/samples/EPUB/Automator%20%E3%81%A7%20EPUB%20%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%B7%A8%EF%BC%89.epub"&gt;Automator で EPUB を作る（テキストファイル編）.epub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;　EPUB を &lt;a href="http://dl.dropbox.com/u/160781/apps/mac/Murasaki/index.html"&gt;Murasaki&lt;/a&gt; で表示すると以下の画像のようになる。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GCUoPgYN2xU/TjU_GPwD8HI/AAAAAAAAC_k/R2nV5Ow6n7g/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.27.02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://3.bp.blogspot.com/-GCUoPgYN2xU/TjU_GPwD8HI/AAAAAAAAC_k/R2nV5Ow6n7g/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.27.02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;　元が単なるテキストなので見栄えはしない。たとえばファイルの先頭一行目はタイトルとみなして自動で大きめのフォントサイズにしてくれる、みたいな気の効いたことをしてくれると使い出があるのだが。&lt;br /&gt;
&lt;br /&gt;
　次にリッチテキスト原稿と生成した EPUB が以下。&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/160781/samples/EPUB/Automator%20%E3%81%A7%20EPUB%20%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%E3%83%AA%E3%83%83%E3%83%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B7%A8%EF%BC%89.zip"&gt;Automator で EPUB を作る（リッチテキスト編）.zip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/160781/samples/EPUB/Automator%20%E3%81%A7%20EPUB%20%E3%82%92%E4%BD%9C%E3%82%8B%EF%BC%88%E3%83%AA%E3%83%83%E3%83%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B7%A8%EF%BC%89.epub"&gt;Automator で EPUB を作る（リッチテキスト編）.epub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;　EPUB を &lt;a href="http://dl.dropbox.com/u/160781/apps/mac/Murasaki/index.html"&gt;Murasaki&lt;/a&gt; で表示すると以下のようになる。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QV5317US59U/TjVAyUGh38I/AAAAAAAAC_s/YqsA4A8JHV0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.47.05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://2.bp.blogspot.com/-QV5317US59U/TjVAyUGh38I/AAAAAAAAC_s/YqsA4A8JHV0/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.47.05.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;　こちらの場合では、元のリッチテキストの段階でフォントサイズや色をある程度制御できる。4ページ目の「文字いじり」の章が以下の画像のようになる。  &lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CUrlk31iklc/TjVB7TB4AkI/AAAAAAAAC_0/m8_Y2jwgt1I/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.50.31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://1.bp.blogspot.com/-CUrlk31iklc/TjVB7TB4AkI/AAAAAAAAC_0/m8_Y2jwgt1I/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2011-07-31%2B20.50.31.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;　これは Mac OS X 付属のテキストエディットで設定できる「段落スタイル」に対応している。「アウトライン」以外のスタイルは Murasaki で表示できる形式に変換されているようである。「アウトライン」の部分が実際にどのように変換されているのかを見てみると &lt;code&gt;font-effect: outline&lt;/code&gt; という CSS3 のプロパティが設定されていた。Murasaki は Safari と同等の WebKit を用いているが、WebKit は &lt;code&gt;font-effect&lt;/code&gt; には対応していないようである。 &lt;br /&gt;
&lt;br /&gt;
　設定されるメタデータが以下のようになる。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;metadata xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot; xmlns:opf=&amp;quot;http://www.idpf.org/2007/opf&amp;quot;&amp;gt;
    &amp;lt;dc:title&amp;gt;Automator で EPUB を作る（テキストファイル編）&amp;lt;/dc:title&amp;gt;
    &amp;lt;dc:language&amp;gt;en&amp;lt;/dc:language&amp;gt;
    &amp;lt;dc:identifier id=&amp;quot;BookId&amp;quot; opf:scheme=&amp;quot;ISBN&amp;quot;&amp;gt;123456789X&amp;lt;/dc:identifier&amp;gt;
    &amp;lt;dc:creator opf:file-as=&amp;quot;&amp;quot; opf:role=&amp;quot;aut&amp;quot;&amp;gt;Genji&amp;lt;/dc:creator&amp;gt;
&amp;lt;/metadata&amp;gt;&lt;/code&gt;&lt;/pre&gt;　&lt;code&gt;dc:title&lt;/code&gt; と &lt;code&gt;dc:creator&lt;/code&gt; の値はアクション実行時のダイアログから設定できるが、&lt;code&gt;dc:language&lt;/code&gt; と &lt;code&gt;dc:identifier&lt;/code&gt; は固定のようである。&lt;code&gt;dc:language&lt;/code&gt; はともかく &lt;code&gt;dc:identifier&lt;/code&gt; が固定なのは気持ち悪い。 &lt;br /&gt;
&lt;br /&gt;
　テキストエディットでは文中に画像を入れた、rtfd という拡張子を持つ「添付データ付きリッチテキストフォーマット」を作成できるが、この Automator アクションには対応していない。アクション実行時のダイアログで表紙画像を設定したり、HTML ファイルそれぞれに画像等を配置したりすることはできる。 &lt;br /&gt;
&lt;br /&gt;
　以上、簡単な紹介でした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-751719440449371483?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/OrAnpOheG2M" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/07/automator-epub.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/751719440449371483?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/751719440449371483?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/OrAnpOheG2M/automator-epub.html" title="Automator を用いて EPUB を作る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-cChqjdzikoM/TjU5QT9VZ0I/AAAAAAAAC_c/MI8dlGhl59Y/s72-c/automator_epub.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/07/automator-epub.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYNQnY6fip7ImA9WhdSGEk.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-8918778977081435557</id><published>2011-07-28T19:16:00.000+09:00</published><updated>2011-07-28T19:16:33.816+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-28T19:16:33.816+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>NSXMLDocument と文字コード指定の謎</title><content type="html">　&lt;code&gt;NSXMLDocument&lt;/code&gt; の謎な挙動でハマったのでメモ。&lt;br /&gt;
&lt;br /&gt;
　HTML ファイルの内容を &lt;code&gt;NSXMLDocument&lt;/code&gt; でパースして情報を取得するという場合を考える。読み込むのは以下のような HTML ファイル。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&amp;quot;ja&amp;quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
    &amp;lt;title&amp;gt;あいうえお&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;p&amp;gt;あめんぼあかいなあいうえお&amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;　ポイントは HTML5 的な &lt;code&gt;&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;&lt;/code&gt; という文字コード指定。従来の &lt;code&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;/code&gt; というような指定方法では問題ないのに、上記 HTML5 的な指定をすると &lt;code&gt;NSXMLDocument&lt;/code&gt; が文字コードを正しく解釈してくれず、場合によっては取得する文字列値が化ける。&lt;br /&gt;
&lt;br /&gt;
　&lt;code&gt;NSXMLDocument&lt;/code&gt; オブジェクトを初期化する方法として三つの異なる初期化メソッドを用いて実験してみる。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;

static void output(NSXMLDocument *xmlDoc)
{
  NSLog(@&amp;quot;encoding: %@&amp;quot;, [xmlDoc characterEncoding]);
  NSArray *nodes = [xmlDoc nodesForXPath:@&amp;quot;html/body/p&amp;quot; error:NULL];
  NSXMLNode *node = [nodes objectAtIndex:0];
  NSLog(@&amp;quot;result  : %@&amp;quot;, [node stringValue]);
}

int main (int argc, const char *argv[])
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  NSUInteger options = NSXMLDocumentTidyHTML;
  NSURL *url = [NSURL fileURLWithPath:@&amp;quot;/Users/genji/Desktop/test.html&amp;quot;];

  NSXMLDocument *xmlDoc;
  xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:url
                                                options:options
                                                  error:NULL];
  output(xmlDoc);
  [xmlDoc release];

  NSData *htmlData = [NSData dataWithContentsOfURL:url];
  xmlDoc = [[NSXMLDocument alloc] initWithData:htmlData
                                       options:options
                                         error:NULL];
  output(xmlDoc);
  [xmlDoc release];

  NSString *htmlString;
  htmlString = [NSString stringWithContentsOfURL:url
                                        encoding:NSUTF8StringEncoding
                                           error:NULL];
  xmlDoc = [[NSXMLDocument alloc] initWithXMLString:htmlString
                                            options:options
                                              error:NULL];
  output(xmlDoc);
  [xmlDoc release];

  [pool drain];
  return 0;
}&lt;/code&gt;&lt;/pre&gt;　処理内容は &lt;code&gt;NSXMLDocument&lt;/code&gt; を用いて HTML ファイル中の &lt;code&gt;p&lt;/code&gt; 要素の文字列値を出力するという単純なもの。こいつの実行結果が以下のようになる。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;encoding: (null)
result  : ã‚ã‚ã‚“ã¼ã‚ã‹ã„ãªã‚ã„ã†ãˆãŠ
encoding: (null)
result  : ã‚ã‚ã‚“ã¼ã‚ã‹ã„ãªã‚ã„ã†ãˆãŠ
encoding: UTF-8
result  : あめんぼあかいなあいうえお&lt;/code&gt;&lt;/pre&gt;　はじめのふたつ、初期化メソッドに &lt;code&gt;initWithContentsOfURL:options:error:&lt;/code&gt; を用いた場合と、一度 &lt;code&gt;NSData&lt;/code&gt; にファイル内容を読み込んでから &lt;code&gt;initWithData:options:error:&lt;/code&gt; を用いた場合は &lt;code&gt;characterEncoding&lt;/code&gt; に何もセットされておらず、文字列値を出力しても化けてしまっている。&lt;br /&gt;
&lt;br /&gt;
　翻ってファイル内容を &lt;code&gt;NSString&lt;/code&gt; に読み込んでから &lt;code&gt;initWithXMLString:options:error:&lt;/code&gt; を用いた場合は &lt;code&gt;characterEncoding&lt;/code&gt; が正しくセットされており出力も正常に出る。&lt;br /&gt;
&lt;br /&gt;
　&lt;code&gt;NSString&lt;/code&gt; でファイル内容を読んだあとに &lt;code&gt;dataUsingEncoding:&lt;/code&gt; で &lt;code&gt;NSData&lt;/code&gt; に変換して初期化した場合は &lt;code&gt;characterEncoding&lt;/code&gt; はセットされず文字化ける。&lt;br /&gt;
&lt;br /&gt;
　さらに、上記のコード例では &lt;code&gt;NSXMLDocument&lt;/code&gt; の初期化メソッドに渡すオプションは &lt;code&gt;NSXMLDocumentTidyHTML&lt;/code&gt; にしているが、これを &lt;code&gt;NSXMLDocumentTidyXML&lt;/code&gt; にすると、&lt;code&gt;characterEncoding&lt;/code&gt; がセットされないのは変わらないが、出力文字列値が化けないのである。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-8918778977081435557?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/hE3DDMxdJDM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/07/nsxmldocument.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8918778977081435557?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8918778977081435557?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/hE3DDMxdJDM/nsxmldocument.html" title="NSXMLDocument と文字コード指定の謎" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/07/nsxmldocument.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4BQHg4eyp7ImA9WhdTEko.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-1374171407747886518</id><published>2011-07-09T17:58:00.002+09:00</published><updated>2011-07-10T13:09:11.633+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T13:09:11.633+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>文字数を数えるサービスを Automator + AppleScript で作る</title><content type="html">　ウェブブラウザやテキストエディタで選択中の文章の文字数を数えるサービスを作る。今回は Automator の「AppleScript を実行」アクションを使う。&lt;br /&gt;
&lt;br /&gt;
　まず、ワークフロー新規作成時の「ワークフローのテンプレートを選択」より「サービス」を選択する。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kiFH299Ekvg/ThgVgqYIrbI/AAAAAAAAC_E/FmYHUiDJvIg/s1600/CountCharacters01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="355" src="http://1.bp.blogspot.com/-kiFH299Ekvg/ThgVgqYIrbI/AAAAAAAAC_E/FmYHUiDJvIg/s400/CountCharacters01.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
　次に「AppleScript を実行」アクションを追加する。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3Fl_jUcbcSk/ThgVkAQ3jLI/AAAAAAAAC_M/a1TD43QvPTM/s1600/CountCharacters02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-3Fl_jUcbcSk/ThgVkAQ3jLI/AAAAAAAAC_M/a1TD43QvPTM/s400/CountCharacters02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;　ワークフロー表示部分の上にある「"サービス"は次の選択項目を受け取ります」には「テキスト」を選択する。&lt;br /&gt;
&lt;br /&gt;
　AppleScipt は以下のような感じ。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;on run {input, parameters}
	
	set inputCharacters to (input as string)
	set lengthOfCharacters to length of inputCharacters
	display dialog "Length of characters is " &amp;amp; lengthOfCharacters buttons {"OK"} default button 1 with icon 1
	
end run&lt;/code&gt;&lt;/pre&gt;　これで完成。かんたんですね。ワークフローを保存すると &lt;code&gt;~/Library/Services&lt;/code&gt; に拡張子 &lt;code&gt;.workflow&lt;/code&gt; で保存される。&lt;br /&gt;
&lt;br /&gt;
　あとはブラウザやテキストエディタなんかで文章を選択状態にして、メニューバーのサービスメニューもしくは右クリックのコンテキストメニューからこのサービスを使うことで文字数を表示したダイアログが表示される。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-1374171407747886518?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/oYNFiE7q-5I" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/07/automator-applescript.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1374171407747886518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1374171407747886518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/oYNFiE7q-5I/automator-applescript.html" title="文字数を数えるサービスを Automator + AppleScript で作る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-kiFH299Ekvg/ThgVgqYIrbI/AAAAAAAAC_E/FmYHUiDJvIg/s72-c/CountCharacters01.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/07/automator-applescript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YDSHw5fip7ImA9WhRUFUk.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-9113689400531337704</id><published>2011-07-09T15:41:00.000+09:00</published><updated>2012-01-26T11:32:59.226+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-26T11:32:59.226+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>Mac App Store での Dashboard Widget 配信の可能性について</title><content type="html">Mac OS X 10.4 Tiger から搭載された機能として Dashboard がある。Dashboard は HTML + CSS + JavaScript で作られた Widget という Web アプリケーションのようなものを動かす環境である。時計やカレンダー、辞書、計算機、スティッキーズメモなどの Widget が標準で用意されている。Widget のゲームなんかもサードパーティから公開されていたりする。&lt;br /&gt;
&lt;br /&gt;
　Tiger の目玉機能のひとつとして発表当時からしばらくはそこそこの話題にはなったものの、今となっては影が薄くなった感は否めない。そこで今一度 Dashboard が注目を集めるにはどうすればよいか？　と考えて思いついたのが Mac App Store での配信である。&lt;br /&gt;
&lt;br /&gt;
　Mac App Store は iOS の App Store の Mac 版である。サードパーティ企業や一般の開発者によって登録されたアプリケーションが一堂に会しており、簡単にアプリケーションのダウンロード・インストールを行うことができる。&lt;br /&gt;
　App Store をユーザから見た場合、ひとつの場所で多くのアプリケーションから目的のものを探すことができ、有料アプリケーションの決済についても Apple ID をひとつ用意するだけですむメリットがある。&lt;br /&gt;
　ディヴェロッパから見た場合、Apple ブランドの店に商品を卸すことができ、自前で決済システムを用意することなく有料アプリケーションを販売することができるメリットがある（その代わり売り上げの 30 % は Apple の手数料となる）。&lt;br /&gt;
&lt;br /&gt;
　現在、Mac App Store では Dashboard Widget の配信は行われていないが、それが可能になれば、再び Dashboard に注目が集まる日が来るかもしれない。通常の Mac 用アプリケーションで作るよりも Dashboard Widget の方が向いているようなジャンルも存在するし、Tiger 当時よりも Web アプリケーション分野も発達してきておりノウハウも貯まってきている。App Store で簡単に有料配信が可能になれば Dashboard Widget 開発に乗り出すディヴェロッパも増えてくるのではないだろうか。&lt;br /&gt;
&lt;br /&gt;
　Dashboard Widget の配信に際して問題になるのは、そのアーキテクチャである。Dashboard Widget の実体は簡単に言えば HTML、CSS、JavaScript（＋その他のリソース）をフォルダに纏めただけのものである。簡単に中身を覗くことができ、ロジックやリソースはコピィし放題となる。これでは有料配信には向かない（と考えるディヴェロッパもいるだろう）。&lt;br /&gt;
&lt;br /&gt;
　ここで参考になるのが Apple のもうひとつの電子ストアの iBookstore である。iBookstore は iOS 機器から利用できる電子書籍ストアでり、EPUB を扱う。&lt;br /&gt;
&lt;br /&gt;
　EPUB は電子書籍の形式のひとつでる。その実体は、書籍の内容となる HTML、CSS やその他画像等のリソースと、メタデータとなる XML を纏めて zip 圧縮したものであり、構造としては Dashboard Widget とよく似た部分がある。&lt;br /&gt;
&lt;br /&gt;
　iBookstore で配信されている EPUB は DRM が掛かっており、その中身は暗号化されている。そのためダウンロードした EPUB ファイルを展開して単純に中身を覗こうとしても、それは不可能となっている。&lt;br /&gt;
&lt;br /&gt;
　これと同じようなことを応用すれば、Mac App Store で Dashboard Widget の配信も可能になるのではないだろうか？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-9113689400531337704?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/FktvpKWzy7k" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/07/mac-app-store-dashboard-widget.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/9113689400531337704?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/9113689400531337704?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/FktvpKWzy7k/mac-app-store-dashboard-widget.html" title="Mac App Store での Dashboard Widget 配信の可能性について" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/07/mac-app-store-dashboard-widget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAFRH49eyp7ImA9WhZbE0U.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-7854394218434140470</id><published>2011-06-18T17:07:00.001+09:00</published><updated>2011-06-18T17:11:55.063+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-18T17:11:55.063+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Game" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>3DS と Mac 間の画像受け渡しを SD カードを介さずに行う</title><content type="html">　ニンテンドー 3DS で撮った写真や、保存した Mii 画像、ゲームソフトで生成した画像を Mac（パソコン）に移動させようとしたら、通常は SD カードを経由して行うことになる。つまり&lt;ol&gt;&lt;li&gt;3DS から SD カードを抜いて&lt;/li&gt;
&lt;li&gt;カードリーダ・ライタ機器に差して&lt;/li&gt;
&lt;li&gt;それを Mac に認識させて&lt;/li&gt;
&lt;li&gt;ファイル移動&lt;/li&gt;
&lt;li&gt;カードリーダ・ライタ機器から SD カードを抜いて&lt;/li&gt;
&lt;li&gt;3DS にカードを差す&lt;/li&gt;
&lt;/ol&gt;というような手順を踏む。&lt;br /&gt;
&lt;br /&gt;
　これはいかにもめんどくさい。3DS から SD カードを抜き差しする際は 3DS 本体の電源を切ることが推奨されてるっぽいのでさらにめんどい。3DS 本体が SD カードリーダ・ライタとして動作し、Mac とケーブルで繋いでファイル転送、くらいならまだいいのだが……。&lt;br /&gt;
&lt;br /&gt;
　そこで、六月の 3DS 本体アップデートでインターネットブラウザが使用可能になったことに着目する。3DS のインターネットブラウザはフォームの &lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot; /&amp;gt;&lt;/code&gt; に対応しており、本体および SD カードに保存されている画像のアップロードを行うことができる。&lt;br /&gt;
&lt;br /&gt;
　つまり、ローカルネットワーク上でウェブサーヴァを立ち上げて、そこで簡易的な画像アップローダを構築すれば、SD カードの抜き差しを行うことなく画像の受け渡しが可能になるというわけである。&lt;br /&gt;
&lt;br /&gt;
　アップローダは「&lt;a href="http://www.gesource.jp/programming/python/cgi/0115.html"&gt;ファイルをアップロードする - Python CGIプログラミング入門&lt;/a&gt;」を参考に Python で書いた。40 行程度。参考ページの Python スクリプトは単にファイルをアップロードするだけやけど、一般的な画像アップローダみたいなファイルリストなんかも出力するようにしておけば、Mac から 3DS への画像移動も簡単にできるようになる（3DS のインターネットブラウザで画像を開くと本体に保存できる）。ウェブサーヴァは Mac 標準の Apache で適当な設定をして Python スクリプトが CGI として動くようにしておく。画像を書き込むディレクトリィのパーミッション設定も忘れずに。&lt;br /&gt;
&lt;br /&gt;
　3DS のインターネットブラウザは viewport 指定が効くみたいやけん、head 内に &lt;code&gt;&amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width&amp;quot;&amp;gt;&lt;/code&gt; を入れておくとイイ感じのサイズで表示してくれる。&lt;br /&gt;
&lt;br /&gt;
　準備が終われば 3DS のインターネットブラウザからアップローダにアクセスし、Mac に移動したい画像をアップロードすればよい。簡単ですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-7854394218434140470?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/6LMKo1PYS_c" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/06/3ds-mac-sd.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7854394218434140470?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7854394218434140470?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/6LMKo1PYS_c/3ds-mac-sd.html" title="3DS と Mac 間の画像受け渡しを SD カードを介さずに行う" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/06/3ds-mac-sd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4FRXkzcCp7ImA9WhZWFkw.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-3568769957762575152</id><published>2011-05-17T15:08:00.001+09:00</published><updated>2011-05-17T15:15:14.788+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-17T15:15:14.788+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>Segmented Control 等に独自のアイコンを設定する際の留意点</title><content type="html">　Interface Builder を用いて Segmented Control 等に独自のアイコン画像を設定する場合、まず画像を Xcode に登録してから IB のインスペクタで画像を選択する。&lt;br /&gt;
&lt;br /&gt;
　Xcode に登録する画像名は任意でも構わんのやけど、名前の末尾に Template と付けておくと、Segemented Control 等を選択時に画像を良い感じにしてくれる。&lt;br /&gt;
　たとえば SDK に用意されている NSPathTemplate という定数名で指定する画像は、非選択時には黒単色で構成されている画像やけど、選択時には青いドロップシャドウが掛かった感じになる。SDK の他の画像も末尾に Template が付いているものは同様になる。&lt;br /&gt;
　自分でアイコン画像を用意する場合も同様で、画像名の末尾に Template を付けると（HogeTemplate.png 等）上記の画像変換を自動でやってくれる。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-0yLY-8FvvPA/TdIQe0YgWFI/AAAAAAAAC9Y/sTTv7KJUcqw/s1600/Template.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="88" width="194" src="http://4.bp.blogspot.com/-0yLY-8FvvPA/TdIQe0YgWFI/AAAAAAAAC9Y/sTTv7KJUcqw/s400/Template.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
　上記の画像は各行の左ふたつは SDK で用意されている標準の画像（NSPathTemplate、NSListViewTemplate）。右ふたつは自分で用意した画像（BookmarkTemplate.png、Bookmark.png）。右端の Bookmark.png を設定したセグメント以外は、クリックで選択時に青いドロップシャドウが掛かった画像に自動的になる。&lt;br /&gt;
&lt;br /&gt;
　Template 画像に関する詳細は NSImage のクラスリファレンスを参照。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-3568769957762575152?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/z-aF0eP-WLg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/05/interface-builder-segmented-control.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/3568769957762575152?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/3568769957762575152?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/z-aF0eP-WLg/interface-builder-segmented-control.html" title="Segmented Control 等に独自のアイコンを設定する際の留意点" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-0yLY-8FvvPA/TdIQe0YgWFI/AAAAAAAAC9Y/sTTv7KJUcqw/s72-c/Template.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/05/interface-builder-segmented-control.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEINQHk9fSp7ImA9WhZXE00.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-3378039416484461490</id><published>2011-05-02T12:17:00.001+09:00</published><updated>2011-05-02T12:23:11.765+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-02T12:23:11.765+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>MacBook Late 2008 のメモリィを 8GB に増設</title><content type="html">　現在使用している Mac は MacBook の Late 2008 版。非 MacBook Pro でありながらアルミニウムユニボディの筐体を持つ珍しい世代の MacBook である。&lt;br /&gt;
&lt;br /&gt;
　二年以上前の世代ながら性能はまずまずで、一般的な用途ならまだぜんぜん現役で戦えるし、ぱっと見 MacBook Pro みたいでかっこいい。また、現在のユニボディ筐体は底面も一体化していてバッテリィや内蔵ストレージへのアクセスが容易ではないのに対し、この Late 2008 版は底面の半分をワンタッチで取り外しでき、内部へのアクセスが容易であるという利点もある(その反面、それまでの世代では搭載されていた FireWire 端子がオミットされている)。&lt;br /&gt;
&lt;br /&gt;
　購入時にメモリィを最大の 4GB にしていたし、一般的な用途(ウェブブラウズや音楽・動画鑑賞等)ではぜんぜん問題なかったものの、それらにプラスして Xcode や Interface Builder 等の開発アプリケーションを同時に立ち上げたりしていると、メモリィを食い尽くして頻繁にスワップしてしまっていた。&lt;br /&gt;
&lt;br /&gt;
　だがだが、この MacBook Late 2008 版、公称ではメモリィは最大 4GB ながらも、実は非公式ながら 8GB まで搭載できるのである。そのあたりの詳しい情報は Google 先生にお尋ねを……。&lt;br /&gt;
&lt;br /&gt;
　ここはいっちょう、8GB まで増設してみるのだ。&lt;br /&gt;
&lt;br /&gt;
　MacBook Late 2008 版に搭載できるメモリィの規格は「DDR3 SODIMM PC3 8500 (DDR3 1066)」というタイプのもの。今回は&lt;a href="http://www.donya.jp/item/18334.html#cat"&gt;上海問屋さんから SAMSUNG 製のもの&lt;/a&gt;を購入。&lt;br /&gt;
　値段は、私が購入したときで 4GB が 3,880 円の掛ける 2 で 7,760 円。送料無料でクレジットカードも使えて便利で安い。&lt;br /&gt;
&lt;br /&gt;
　今のところ相性問題等もなく、快適に 8GB ライフを満喫している。Google Chrome だろうが、iTunes だろうが、Xcode だろうが、Interface Builder だろうがドンとこい！&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-GmmimAJkg1w/Tb4jeNr1x9I/AAAAAAAAC9M/Fr0ktMVL5NA/s1600/memory.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="245" width="400" src="http://2.bp.blogspot.com/-GmmimAJkg1w/Tb4jeNr1x9I/AAAAAAAAC9M/Fr0ktMVL5NA/s400/memory.png" /&gt;&lt;/a&gt;&lt;/div&gt;　これで内蔵ストレージを SSD に換装できれば、あと三年は戦えるのだが……。もっと安くなっておくれ、SSD。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-3378039416484461490?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/qILFM1tExvw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/05/macbook-late-2008-8gb.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/3378039416484461490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/3378039416484461490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/qILFM1tExvw/macbook-late-2008-8gb.html" title="MacBook Late 2008 のメモリィを 8GB に増設" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-GmmimAJkg1w/Tb4jeNr1x9I/AAAAAAAAC9M/Fr0ktMVL5NA/s72-c/memory.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/05/macbook-late-2008-8gb.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4DSXo8fip7ImA9WhZXEUs.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-7001668001280721189</id><published>2011-04-30T19:54:00.002+09:00</published><updated>2011-04-30T19:56:18.476+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-30T19:56:18.476+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>NSToolbar にカテゴリィを用いてメソッドを追加する</title><content type="html">　Safari で言えば「戻る・進む」ボタンや URL 欄がある部分を Cocoa アプリケーションでは「ツールバー」と言い、NSToolbar クラスで表現される。ツールバー上にある要素は NSToolbarItem クラスで表現され、NSToolbar のインスタンスメソッド &lt;code&gt;- (NSArray *)items&lt;/code&gt; で配列オブジェクトとして取得できる。画面最上部のメニューバーとメニュー項目は、同じように NSMenu クラス、NSMenuItem クラスで表現され、NSMenu からインスタンスメソッド &lt;code&gt; - (NSArray *)itemArray&lt;/code&gt; で配列オブジェクトととして NSMenuItem を取得できる。&lt;br /&gt;
&lt;br /&gt;
　ここで、NSMenu にはインスタンスメソッド &lt;code&gt;- (NSMenuItem *)itemWithTag:(NSInteger)aTag&lt;/code&gt; が存在し、NSMenuItem に設定した tag をパラメータに指定することで特定のメニュー項目を一発で取得できるのに対し、NSToolbar にはそのようなインスタンスメソッドが存在しない。&lt;br /&gt;
&lt;br /&gt;
　今回は NSToolbar に NSMenu と同様の &lt;code&gt;- (NSToolbarItem *)itemWithTag:(NSInteger)aTag&lt;/code&gt; を実装する。実装するにあたり、NSToolbar のサブクラスを作るのではなく、カテゴリィを用いてメソッドを追加する形で行う。&lt;br /&gt;
&lt;br /&gt;
　まずヘッダファイル NSToolbar+Additions.h が以下のようになる。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;#import &amp;lt;Cocoa/Cocoa.h&amp;gt;

@interface NSToolbar (Additions)

- (NSToolbarItem *)itemWithTag:(NSInteger)aTag;

@end&lt;/code&gt;&lt;/pre&gt;　実装ファイル NSToolbar+Additions.m は以下のようになる。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;#import "NSToolbar+Additions.h"

@implementation NSToolbar (Additions)

- (NSToolbarItem *)itemWithTag:(NSInteger)aTag
{
  NSArray *items = [self items];
  for(NSToolbarItem *item in items) {
    if([item tag] == aTag) return item;
  }
  return nil;
}

@end&lt;/code&gt;&lt;/pre&gt;　簡単ですね。これで、NSToolbar+Additions.h をインポートすれば、NSToolbar のインスタンスメソッドとして &lt;code&gt;- (NSToolbarItem *)itemWithTag:(NSInteger)aTag&lt;/code&gt; を使えるようになる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-7001668001280721189?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/WEoUQE-bchg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/04/nstoolbar.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7001668001280721189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7001668001280721189?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/WEoUQE-bchg/nstoolbar.html" title="NSToolbar にカテゴリィを用いてメソッドを追加する" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/04/nstoolbar.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMSX86eCp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-2569118533365100841</id><published>2011-02-27T21:43:00.001+09:00</published><updated>2011-05-08T14:26:28.110+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:26:28.110+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>WebView に水平スクロールバーが表示されているかを検出する</title><content type="html">　作成中の &lt;a href="http://dl.dropbox.com/u/160781/apps/mac/Murasaki/index.html"&gt;EPUB 閲覧アプリケーション Murasaki&lt;/a&gt; において、EPUB の本文を表示している WebView に水平スクロールバーが表示されているかどうかを検出する必要が出た。そこで、WebView のサブクラスに以下のようなインスタンスメソッドを実装した。&lt;pre&gt;&lt;code&gt;- (BOOL)isHorizontalScrollerVisible
{
  NSInteger clientWidth, scrollWidth;
  clientWidth = [[self stringByEvaluatingJavaScriptFromString:
                  @"document.documentElement.clientWidth;"] integerValue];
  scrollWidth = [[self stringByEvaluatingJavaScriptFromString:
                  @"document.documentElement.scrollWidth;"] integerValue];
  return (clientWidth &lt; scrollWidth);
}&lt;/code&gt;&lt;/pre&gt;　WebView のインスタンスメソッド &lt;code&gt;stringByEvaluatingJavaScriptFromString:&lt;/code&gt; は、&lt;code&gt;NSString&lt;/code&gt; 型で JavaScript のコードを渡すと、その結果を &lt;code&gt;NSString&lt;/code&gt; で返してくれるけん、これを用いる。&lt;br /&gt;
　&lt;code&gt;document.documentElement.clientWidth&lt;/code&gt; はユーザに見えている表示領域の幅、&lt;code&gt;document.documentElement.scrollWidth&lt;/code&gt; はドキュメントの実際の幅を返す。表示領域の幅よりもドキュメントの実際の幅が大きければ、すなわち水平スクロールバーが出ているということ。&lt;br /&gt;
&lt;br /&gt;
&lt;span class="nowplaying"&gt;Now Playing: &lt;em&gt;&amp;quot;オレンジ・フィルム・ガーデン&amp;quot;&lt;/em&gt; from the album &amp;quot;GOOD DREAMS&amp;quot; by &lt;a href="http://www.google.com/search?q=%22the pillows%22"&gt;the pillows&lt;/a&gt;, My Rate: *****&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-2569118533365100841?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/CCY1YPMDTOs" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/02/webview.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/2569118533365100841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/2569118533365100841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/CCY1YPMDTOs/webview.html" title="WebView に水平スクロールバーが表示されているかを検出する" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/02/webview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcMR3w5cSp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-5230323297507680551</id><published>2011-01-29T16:29:00.023+09:00</published><updated>2011-05-08T14:38:06.229+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:38:06.229+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>トラックパッドのピンチ操作で拡大縮小</title><content type="html">　「&lt;a href="http://cocoadays.blogspot.com/2011/01/mac_29.html" &gt;Cocoaの日々: [Mac] トラックパッド 〜 ピンチで拡大縮小&lt;/a&gt;」を参考に、開発中の EPUB 閲覧アプリケーションにピンチ操作による文字の拡大縮小処理を追加。具体的には WebView のサブクラスに以下のメソッドを実装した。&lt;pre&gt;&lt;code&gt;- (void)magnifyWithEvent:(NSEvent *)event
{
  static NSTimeInterval lastOccurredTime;
  NSTimeInterval currentTime = [event timestamp];
  if(currentTime - lastOccurredTime &lt; 0.3) return;

  if([event magnification] &gt; 0) [self makeTextLarger:nil];
  else [self makeTextSmaller:nil];
  
  lastOccurredTime = currentTime;
}&lt;/code&gt;&lt;/pre&gt;　ピンチ操作の拡大縮小具合は &lt;code&gt;[event magnification]&lt;/code&gt; で得られる。拡大の場合は正、縮小の場合は負の値が取れるけん、それに合わせて WebView の文字拡大縮小のメソッドを呼び出す。&lt;br /&gt;
&lt;br /&gt;
　ユーザ的には一度のピンチ操作でも、&lt;code&gt;magnifyWithEvent:&lt;/code&gt; はジェスチャ中に何度も呼び出されてしまう。そのままでは一度のピンチ操作で一気に最大／最小文字サイズまで行ってしまうけん、最後にイヴェントが発生した時間を保存しておき、現在時間と比べて適当な時間間隔内であれば何もしないようにしておく。イヴェントが発生した時間（システム起動時からの経過時間）は &lt;code&gt;[event timestamp]&lt;/code&gt; で取れる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-5230323297507680551?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/MyUIBJiOuSA" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2011/01/blog-post.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/5230323297507680551?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/5230323297507680551?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/MyUIBJiOuSA/blog-post.html" title="トラックパッドのピンチ操作で拡大縮小" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2011/01/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBQ3k6eyp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-6923095593583239776</id><published>2010-12-31T13:09:00.002+09:00</published><updated>2011-05-08T14:37:32.713+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:37:32.713+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>リンク先の URL を表示する</title><content type="html">　EPUB にはふつうの HTML 同様、ハイパリンクを入れることができる。前回のポストでは EPUB 内リンクと外部リンクで動作を変えたわけやけど、今回はリンク文字列にマウスカーソルを乗せたときにそのURLをウィンドウ下部に表示する処理を考える。&lt;br /&gt;
&lt;br /&gt;
　WebView に表示させている HTML 文書の要素上にマウスカーソルが乗ったときに呼ばれるデリゲートメソッドが &lt;code&gt;webView:mouseDidMoveOverElement:modifierFlags:&lt;/code&gt;。実際の実装具合が以下の通り。&lt;pre&gt;&lt;code&gt;- (void)webView:(WebView *)sender
mouseDidMoveOverElement:(NSDictionary *)elementInformation
  modifierFlags:(NSUInteger)modifierFlags
{
  NSString *statusText = @"";
  NSURL *linkURL = [elementInformation objectForKey:WebElementLinkURLKey];
  if(linkURL) {
    NSString *urlString = [linkURL absoluteString];
    if([urlString hasPrefix:@"file://"]) {
      statusText = [NSString stringWithFormat:@"Go to \"%@\"", [urlString lastPathComponent]];
    }
    else {
      statusText = [NSString stringWithFormat:@"Open \"%@\" in Web Browser", urlString];
    }
  }
  [statusLabel setTitleWithMnemonic:statusText];
}&lt;/code&gt;&lt;/pre&gt;　マウスカーソルが乗ったのがリンク文字列だった場合は、&lt;code&gt;elementInformation&lt;/code&gt; の &lt;code&gt;WebElementLinkURLKey&lt;/code&gt; キィにリンク先URLが入っている。前回同様、EPUB 内リンクだった場合と外部リンクの場合とで処理を変える。結果生成された文字列を &lt;code&gt;NSTextField&lt;/code&gt; に設定してやることで完成。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-6923095593583239776?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/Ptdn6hmp-JM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/12/url.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/6923095593583239776?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/6923095593583239776?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/Ptdn6hmp-JM/url.html" title="リンク先の URL を表示する" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/12/url.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEBSXY_fyp7ImA9WhZREks.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-7825423577878436432</id><published>2010-11-24T00:20:00.013+09:00</published><updated>2011-04-08T22:17:38.847+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-08T22:17:38.847+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Movie" /><title>ザ・シネマハスラーで評論された映画を iTunes で観る</title><content type="html">　ラジオ番組「&lt;a href="http://www.tbsradio.jp/utamaru/index.html"&gt;TBS RADIO ライムスター宇多丸のウィークエンド・シャッフル&lt;/a&gt;」のポッドキャストを聴いている。その中で「&lt;a href="http://www.tbsradio.jp/utamaru/cinema/index.html"&gt;ザ・シネマハスラー&lt;/a&gt;」という映画を評論するコーナがあって、お題となっている映画を観たリスナからのメイルを紹介しつつ、パーソナリティ宇多丸さんの熱い評論が聴ける。&lt;br /&gt;
&lt;br /&gt;
　で、先日始まった iTunes の映画レンタル（or 販売）サーヴィス。それなりのラインナップが用意されとってどれを観るか目移りするわけやけど、そこで前述のザ・シネマハスラーの登場となる。&lt;br /&gt;
　過去に評論されたものはいまでもポッドキャストで聴けるけん、宇多丸さんとリスナの評論を元にどの映画を観るかの参考にしてみる。ザ・シネマハスラーで評論されたものの中で、現在 iTunes の映画レンタルで観ることができる作品を対応づけたリストを作成した。&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://dl.dropbox.com/u/160781/CinemaHustler/index.html"&gt;ザ・シネマハスラーで評論された映画を iTunes で観る&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
　こうやって纏めてみると、2010年作品はまだしも、2009年・2008年作品でもまだまだ iTunes で取り扱ってないのが多いな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-7825423577878436432?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/blYBV58GyqQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/11/itunes.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7825423577878436432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7825423577878436432?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/blYBV58GyqQ/itunes.html" title="ザ・シネマハスラーで評論された映画を iTunes で観る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/11/itunes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIDSXY_fSp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-7395354226381725686</id><published>2010-10-31T12:09:00.071+09:00</published><updated>2011-05-08T14:29:38.845+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:29:38.845+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>EPUB 内リンクと外部リンクで動作を変える</title><content type="html">　Mac 用 EPUB プレヴュワ開発について。&lt;br /&gt;
&lt;br /&gt;
　EPUB の実体は (X)HTML やけん、本文中に &lt;code&gt;&amp;lt;a href=&amp;quot;http://www.google.com/&amp;quot;&amp;gt;Google&amp;lt;/a&amp;gt;&lt;/code&gt; みたいなハイパリンクを入れることができる。&lt;br /&gt;
&lt;br /&gt;
　EPUB プレヴュワの表示エンジンには WebKit を使っとるけん、何もしなくてもリンククリックでページ遷移をすることはできる（ただし、&lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; 等で新しいウィンドウを開くタイプのリンクの場合はちょっとしたコードを書く必要がある）。ほなけど、作っとんのはあくまでも EPUB を（簡易的に）閲覧するアプリケーションやけん、外部リンクの場合は Safari 等システムで指定されとるウェブブラウザで開いて、目次から各章へのリンクなどの同一 EPUB 内へのリンクはアプリケーション内のページ遷移で処理する必要がある。&lt;br /&gt;
　したがって、クリックしたリンクのリンク先 URL をページ遷移処理前に調べて、それが内部リンクなのか外部リンクなのかで動作を変える処理を入れる。&lt;br /&gt;
&lt;br /&gt;
　ページ読み込み処理の前には &lt;code&gt;webView:decidePolicyForNavigationAction:request:frame:decisionListener:&lt;br /&gt;
&lt;/code&gt; という WebPolicyDelegate 非形式プロトコルのメソッドが呼ばれる。これをオーヴァライドすることで上述の処理を実現できる。具体的には以下のような感じ。&lt;pre&gt;&lt;code&gt;- (void)webView:(WebView *)webView
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request
          frame:(WebFrame *)frame
decisionListener:(id &amp;lt;WebPolicyDecisionListener&amp;gt;)listener
{
  int navigationType = [[actionInformation objectForKey:WebActionNavigationTypeKey] integerValue];
  if(navigationType == WebNavigationTypeLinkClicked) {
    NSDictionary *element = [actionInformation objectForKey:WebActionElementKey];
    NSURL *linkURL = [element objectForKey:WebElementLinkURLKey];
    if(![[linkURL scheme] isEqualToString:@"file"]) {
      [[NSWorkspace sharedWorkspace] openURL:linkURL];
      [listener ignore];
    }
  }

  [listener use];
}&lt;/code&gt;&lt;/pre&gt;　&lt;code&gt;actionInformation&lt;/code&gt; には読み込み処理がトリガされたアクションに関するデータが NSDictionary で入っている。その &lt;code&gt;WebActionNavigationTypeKey&lt;/code&gt; キィには、リンククリックやフォームのサブミット等、どのような操作によって読み込み処理が発生したのかが入っている。&lt;code&gt;WebActionElementKey&lt;/code&gt; キィには要素の詳細なデータがやはり NSDictionary で入っとるけん、そこからリンク先の URL を調べることができる。内部リンクであれば、リンク先の URL のスキームは &lt;code&gt;file&lt;/code&gt; になっとるはずやけん、&lt;code&gt;file&lt;/code&gt; 以外ならばシステム指定のブラウザで開く処理とディフォルトの動作を無視させる &lt;code&gt;[listener ignore];&lt;/code&gt; の処理を入れる。&lt;br /&gt;
&lt;br /&gt;
　上記のようなコードを書いたあとは、Interface Builder において WebView の Policy Delegate を接続してやると、内部リンクと外部リンクで動作を変えた処理をできるようになる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-7395354226381725686?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/cvwgn4NABA4" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/10/epub_31.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7395354226381725686?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/7395354226381725686?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/cvwgn4NABA4/epub_31.html" title="EPUB 内リンクと外部リンクで動作を変える" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/10/epub_31.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANQ3k6eip7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-1220553348987021483</id><published>2010-10-31T04:49:00.004+09:00</published><updated>2011-05-08T14:33:12.712+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:33:12.712+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>EPUB プレヴュワ開発中</title><content type="html">　Amazon Kindle や Apple iBooks 等の登場により、電子書籍がちょっとしたブームになっとります。一口に電子書籍と言ってもその形式は様々で単なる PDF だったりプラットフォーム側が用意した独自形式だったり。&lt;br /&gt;
　そんななかで有力な形式とひとつとして EPUB というものがある。おおざっぱに言えば、本文を記述した (X)HTML とメタデータを記述した XML ファイルを纏めて ZIP 圧縮したものである。オープンな規格でだれでも簡単に作成できることから、電子書籍ブームの中で注目されている規格と言える。&lt;br /&gt;
&lt;br /&gt;
　iPhone や iPad で EPUB を読むなら iBooks を使えば良いわけやけど、これが Mac でとなると話が変わってくる。Mac 用の EPUB リーダもいくつか存在してはいるものの、どれもいまいち使い勝手が良くない。そのどれもがマルチプラットフォームを意識した作りになっとって、実際の実装がどうなっとるかは解らんけど、とにかく Mac 用アプリケーションらしさがない。Apple が Mac 用の iBooks を作ってくれればそれで良いんやけど、どうもそういう気配もないわけで。&lt;br /&gt;
&lt;br /&gt;
　ないならいっちょ作ってみよう、と考えてやっと今回のエントリィのタイトルにたどり着くわけです。現在、EPUB のプレヴュウアプリケーションを開発中。&lt;br /&gt;
&lt;br /&gt;
　ふつう、電子書籍を閲覧するアプリケーションは「Reader/リーダ」を名乗るけど、あえて「Previewer/プレヴュワ」なのはそれほど凝ったことをやるつもりがないから。&lt;br /&gt;
　Mac の標準的な開発環境である Cocoa フレームワークでは、ウェブブラウザ Safari や Chrome でも用いられとる WebKit を使うことができて、ごく単純なウェブブラウザならば、それこそ自分では一行もコードを書くことなく作れてしまう。EPUB の実体は (X)HTML やけん、今回のアプリケーションでは WebKit に HTML を喰わすだけ、みたいなシンプルな実装をしてみようと思う。これは Mac App Store が始まることへの布石でもある。&lt;br /&gt;
&lt;br /&gt;
　で、試作してみたアプリケーションがこんな感じ。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_olBno5NeVPk/TMx1WI4C8kI/AAAAAAAAC7A/8izA7fYMK_s/s1600/Murasaki.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://1.bp.blogspot.com/_olBno5NeVPk/TMx1WI4C8kI/AAAAAAAAC7A/8izA7fYMK_s/s320/Murasaki.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;　中身の HTML を WebKit に読み込ませとるだけやけど、だからこそ自分で特別な処理を書かんでも画像やルビなんかも表示できる。&lt;br /&gt;
&lt;br /&gt;
　実際、単に EPUB を読むだけならば、現在出回っとる他の EPUB リーダよりもこのアプリケーションの方が読みやすいんじゃないかと思います。&lt;br /&gt;
&lt;br /&gt;
　まだ実装すべき部分があって、加えて Mac 用アプリケーション開発の実績も、オブジェクト指向言語での開発も碌にしたことがない私なので、覚えるべきこと、調べるべきことがたくさんあって、完成にはまだまだと言ったところ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-1220553348987021483?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/VN9ywT2w35g" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/10/epub.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1220553348987021483?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1220553348987021483?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/VN9ywT2w35g/epub.html" title="EPUB プレヴュワ開発中" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_olBno5NeVPk/TMx1WI4C8kI/AAAAAAAAC7A/8izA7fYMK_s/s72-c/Murasaki.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/10/epub.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4HRHk8cCp7ImA9WhZXGE4.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-1347847005557438323</id><published>2010-09-30T00:02:00.073+09:00</published><updated>2011-05-08T14:35:35.778+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-08T14:35:35.778+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>Automator + Python でサービスを作る</title><content type="html">　Mac OS X 付属の自動化処理作成アプリケーション Automator で「サービス」を作ることができる。Automator の中で Python を実行させることもできるけん、今回は Automator + Python な環境で、iPhone アプリケーションのスクリーンショット画像から、AppStore 提出用にステータスバー領域を切り抜いた画像を生成するサービスを作ってみる。&lt;br /&gt;
&lt;br /&gt;
　まず、ワークフロー新規作成時の「ワークフローのテンプレートを選択」より「サービス」を選択する。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_olBno5NeVPk/TKNW8WGWttI/AAAAAAAAC6o/qZ_dyCNi74g/s1600/CreateServiceWithPython01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://3.bp.blogspot.com/_olBno5NeVPk/TKNW8WGWttI/AAAAAAAAC6o/qZ_dyCNi74g/s320/CreateServiceWithPython01.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;　そして、「Finder 項目を複製する」アクションと「シェルスクリプトを実行する」アクションを追加する。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_olBno5NeVPk/TKNXrI1e9pI/AAAAAAAAC6s/j4boXuk1qvU/s1600/CreateServiceWithPython02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://4.bp.blogspot.com/_olBno5NeVPk/TKNXrI1e9pI/AAAAAAAAC6s/j4boXuk1qvU/s320/CreateServiceWithPython02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;　ワークフロー表示部分の上にある「"サービス"は次の選択項目を受け取ります」には「イメージファイル」を選択し、シェルスクリプトを実行するアクションの「シェル」には「/usr/bin/python」を、「入力の引き渡し方法」には「引数として」を選択する。&lt;br /&gt;
&lt;br /&gt;
　Python スクリプトは以下のような感じ。&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;import sys
import Image

def cropImage(image):
 width, height = image.size
 offset = 0
 if (width, height) == (640, 960) or (width, height) == (960, 640): offset = 40
 elif (width, height) == (320, 480) or (width, height) == (480, 320): offset = 20
 else: return image
 return image.crop((0, offset, width, height))

for filename in sys.argv[1:]:
 try:
  image = Image.open(filename)
  cropped = cropImage(image)
  cropped.save(filename)
 except IOError as err:
  print "IO Error: %s" % format(err)
  continue&lt;/code&gt;&lt;/pre&gt;　これで完成。切り抜き等の画像処理には &lt;a href="http://www.pythonware.com/products/pil/"&gt;Python Imaging Library (PIL)&lt;/a&gt; を使っとるけん、事前にインストールが必要。&lt;pre&gt;&lt;code&gt;$ sudo easy_install PIL&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;
　このワークフローを保存すると、&lt;code&gt;~/Library/Services&lt;/code&gt;に拡張子 workflow で保存される。&lt;br /&gt;
&lt;br /&gt;
　あとは Finder で画像ファイルを選択し、メニューバーのサービスメニュー、もしくは右クリックから作成したサービスを実行することができる。複数ファイルを選択した状態でも実行可能。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_olBno5NeVPk/TKNZeMpY7-I/AAAAAAAAC6w/rRQct1X7lZY/s1600/CreateServiceWithPython03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_olBno5NeVPk/TKNZeMpY7-I/AAAAAAAAC6w/rRQct1X7lZY/s320/CreateServiceWithPython03.png" width="228" /&gt;&lt;/a&gt;&lt;/div&gt;　「Finder 項目を複製する」アクションを噛ましとるけん、元の画像は変化せず、コピィされたファイルに対して画像処理が施される。&lt;br /&gt;
&lt;br /&gt;
　Python の勉強がてら便利そうなもの作ってみるテストでした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-1347847005557438323?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/URl-2VEW8Jk" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/09/automator-python.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1347847005557438323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/1347847005557438323?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/URl-2VEW8Jk/automator-python.html" title="Automator + Python でサービスを作る" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_olBno5NeVPk/TKNW8WGWttI/AAAAAAAAC6o/qZ_dyCNi74g/s72-c/CreateServiceWithPython01.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/09/automator-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8CQno6eSp7ImA9WhRXF0w.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-4133455904636371341</id><published>2010-07-31T22:47:00.000+09:00</published><updated>2011-12-24T16:14:23.411+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-24T16:14:23.411+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>無線LAN設定と戦った三時間</title><content type="html">iPhone 4を買った際に貰ったfonルータを、今まで使っていた無線ルータと置き換えよとして浪費した三時間。&lt;br /&gt;&lt;br /&gt;自分が使っとるMacBookとiPhone、父親が使っとるiBookの設定はそれぞれ5分程度で終了。問題は姉が使っているWindowsマシンなのだった。&lt;br /&gt;&lt;br /&gt;Windowsマシンはデスクトップ型で無線LAN機器は内蔵されていない。既存の無線ルータに付いてきたUSB接続の子機を介して無線接続されていた。&lt;br /&gt;&lt;br /&gt;問題は子機のドライバである。fonルータのディフォルトでは無線の暗号化にWPA/WPA2を使う。しかし子機は古い機種でWEPにしか対応していなかった。&lt;br /&gt;&lt;br /&gt;メーカのウェブサイトで新しいドライバを探すとWPAに対応したドライバが配布されていたので、早速インストールしたのだが、はい、出ました。ブルー・スクリーン・オブ・デス！&lt;br /&gt;&lt;br /&gt;新しいドライバをインストールすると、子機を接続した段階で落ちる。子機を外しておくと落ちない。ドライバをアンインストールすると子機接続時でも落ちない。&lt;br /&gt;&lt;br /&gt;問題は新しいドライバのようです。&lt;br /&gt;&lt;br /&gt;何度かインストール・アンインストールを繰り返して見るものの問題は解決せず。&lt;br /&gt;&lt;br /&gt;子機購入時に製品に添付されとったCDからインストールする古いドライバだとBSODはでないけどWPAに対応していない。新しいドライバはWPAに対応しとる(？)けど落ちて使い物にならない。&lt;br /&gt;&lt;br /&gt;結局、不本意ながらfonルータの暗号化の形式をWEPに変えて対処した。&lt;br /&gt;&lt;br /&gt;そういうお話し。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-4133455904636371341?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/O5AvpfLMclI" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/07/lan.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/4133455904636371341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/4133455904636371341?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/O5AvpfLMclI/lan.html" title="無線LAN設定と戦った三時間" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/07/lan.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08ER3c8fSp7ImA9WxFaEU8.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-8571986274192484441</id><published>2010-07-15T02:29:00.037+09:00</published><updated>2010-07-15T02:50:06.975+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-15T02:50:06.975+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><title>Google SketchUp + Podiumプラグイン</title><content type="html">　&lt;a href="http://sketchup.google.com/"&gt;Google SketchUp&lt;/a&gt;は簡単な操作で3Dモデルを作成できるアプリケーション。WindowsとMacに対応。ただしあくまでもモデリングツールやけん、SketchUpだけではリアルな質感や光源の表現は難しい。&lt;br /&gt;
　そこで登場するんが&lt;a href="http://www.sketchupjapan.com/podium/index.php"&gt;Podium for SketchUp&lt;/a&gt;。SketchUp内で動作するプラグインで、これを使うことによってリアルな質感や光源の表現を伴ったレンダリングを行うことができる。有料のソフトウェアやけど、機能制限が付いた無料版がある。&lt;br /&gt;
&lt;br /&gt;
　SketchUp標準の画像出力がこんな感じになる。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_olBno5NeVPk/TD31ndzzOeI/AAAAAAAAC54/ZKyMXJaKLCw/s1600/bell_normal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_olBno5NeVPk/TD31ndzzOeI/AAAAAAAAC54/ZKyMXJaKLCw/s1600/bell_normal.png" /&gt;&lt;/a&gt;&lt;/div&gt;　これとまったく同じ3DモデルをPodiumを使ってレンダリングすることで、&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_olBno5NeVPk/TD312M3XIYI/AAAAAAAAC58/lvJW-Zr-1es/s1600/bell_podium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_olBno5NeVPk/TD312M3XIYI/AAAAAAAAC58/lvJW-Zr-1es/s1600/bell_podium.png" /&gt;&lt;/a&gt;&lt;/div&gt;　というような感じに、リアルな質感を持った画像を出力できる。SketchUpだけでは出せない金属部分の光沢や反射が綺麗に表現できていると思う。&lt;br /&gt;
&lt;br /&gt;
　MacBook 2GHz Intel Core 2 Duoプロセッサ、4GBメモリの環境で、SketchUp標準の画像出力に掛かる時間が五秒程度、Podiumでのレンダリングに掛かる時間が500x500ピクセルサイズ・クォリティ重視の設定で一分程度といったところ。&lt;br /&gt;
&lt;br /&gt;
　SketchUpもPodiumも無料で使えるソフトウェアでここまでできるんだから良い時代になったもんです。&lt;br /&gt;
&lt;br /&gt;
　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-8571986274192484441?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/zIo7KuF1Kn0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/07/google-sketchup-podium.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8571986274192484441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/8571986274192484441?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/zIo7KuF1Kn0/google-sketchup-podium.html" title="Google SketchUp + Podiumプラグイン" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_olBno5NeVPk/TD31ndzzOeI/AAAAAAAAC54/ZKyMXJaKLCw/s72-c/bell_normal.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/07/google-sketchup-podium.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYMRXc6fSp7ImA9WxFUE00.&quot;"><id>tag:blogger.com,1999:blog-21285512.post-128306127761544724</id><published>2010-06-23T23:26:00.000+09:00</published><updated>2010-06-23T23:26:24.915+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-23T23:26:24.915+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apple/Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Computer" /><category scheme="http://www.blogger.com/atom/ns#" term="Phone" /><category scheme="http://www.blogger.com/atom/ns#" term="Cocoa/Objective-C" /><title>iPhoneベルアプリ作成 その4</title><content type="html">　iPhoneベルアプリ作成その4。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_olBno5NeVPk/TCIY2NKCHHI/AAAAAAAAC5g/KM792yV1YoY/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-06-23+23.18.55%EF%BC%89.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_olBno5NeVPk/TCIY2NKCHHI/AAAAAAAAC5g/KM792yV1YoY/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-06-23+23.18.55%EF%BC%89.png" width="172" /&gt;&lt;/a&gt;&lt;/div&gt;　いままでベルの画像はGoogle画像検索で拾ってきた適当なのを使っとったんやけど、Google SketchUpで3Dモデルを作って差し替え。金属部分の光沢が出せない……。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21285512-128306127761544724?l=forthesleeplessnight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/MpzsG/~4/3pytn9sSxy8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://forthesleeplessnight.blogspot.com/2010/06/iphone-4.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/128306127761544724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/21285512/posts/default/128306127761544724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/MpzsG/~3/3pytn9sSxy8/iphone-4.html" title="iPhoneベルアプリ作成 その4" /><author><name>Genji</name><uri>http://www.blogger.com/profile/15622196829857000694</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-td5zWTgChRY/TXZptcKCdoI/AAAAAAAAC70/2KmcS9LTg6M/s220/HNI_0006_cropped.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_olBno5NeVPk/TCIY2NKCHHI/AAAAAAAAC5g/KM792yV1YoY/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-06-23+23.18.55%EF%BC%89.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://forthesleeplessnight.blogspot.com/2010/06/iphone-4.html</feedburner:origLink></entry></feed>

