<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>へびにっき &#187; プログラミング</title>
	<atom:link href="http://wp.serpere.info/archives/category/programing/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Thu, 09 Feb 2012 11:35:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>VimでCoffeeScriptの開発環境を構築する</title>
		<link>http://wp.serpere.info/archives/2470</link>
		<comments>http://wp.serpere.info/archives/2470#comments</comments>
		<pubDate>Fri, 06 Jan 2012 13:40:18 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2470</guid>
		<description><![CDATA[VimでCoffeeScriptを快適に書くための環境作り。 Mac OS X Lion Vim 7.3（Lionに標準で入っているもの） CoffeeScript 1.2.0 VimはMac標準のターミナル.app上で使用する。Lionからは256色表示に対応したので実用性が高くなった。 ppathogenのインストール まずvimのプラグインを管理しやすくするためのプラグインであるpathogenを導入する。手順は配布ページに書いてある通り。 mkdir -p ~/.vim/autoload ~/.vim/bundle curl 'www.vim.org/scripts/download_script.php?src_id=16224' \ &#62; ~/.vim/autoload/pathogen.vim .vimrcに次の1行を追加してインストール完了。 call pathogen#infect() vim-coffee-scriptプラグインのインストール インストール自体は.vim/bundle以下にgit cloneするだけで完了。 cd ~/.vim/bundle git clone https://github.com/kchmck/vim-coffee-script.git タブの設定をCoffeeScriptの推奨値にあわせて変更。次の1行を ~/.vim/after/ftplugin/coffee.vim に追加する。 setlocal shiftwidth=2 expandtab さらに最も使用頻度が高い:CoffeeCompileコマンド（編集中のファイルをJavaScriptにコンパイルして、結果を別ウィンドウに表示するコマンド）にはショートカットキーを割り当てる。私はC-cに割り当てることにした。以下の2行を ~/.vim/after/ftplugin/coffee.vim に追加する。 &#34; CoffeeCompileコマンドにvertオプションを付けることでウィンドウが縦に分割され、 &#34; splitrightオプションによってコンパイル結果が右側に表示されるようになる nnoremap &#60;silent&#62; &#60;C-C&#62; :CoffeeCompile vert &#60;CR&#62;&#60;C-w&#62;h setlocal splitright vim-indent-guidesプラグインのインストール CoffeeScriptはインデントで構造を表すので、インデント量の違いを見やすくするためにvim-indent-guidesプラグインを導入する。これもインストール自体はgit [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2470%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Vim%E3%81%A7CoffeeScript%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
VimでCoffeeScriptを快適に書くための環境作り。
</p>
<ul>
<li>Mac OS X Lion</li>
<li>Vim 7.3（Lionに標準で入っているもの）</li>
<li>CoffeeScript 1.2.0</li>
</ul>
<p>
VimはMac標準のターミナル.app上で使用する。Lionからは256色表示に対応したので実用性が高くなった。
</p>
<h3>ppathogenのインストール</h3>
<p>
まずvimのプラグインを管理しやすくするためのプラグインであるpathogenを導入する。手順は<a href="http://www.vim.org/scripts/script.php?script_id=2332">配布ページ</a>に書いてある通り。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> ~<span style="color: #000000; font-weight: bold;">/</span>.vim<span style="color: #000000; font-weight: bold;">/</span>autoload ~<span style="color: #000000; font-weight: bold;">/</span>.vim<span style="color: #000000; font-weight: bold;">/</span>bundle
curl <span style="color: #ff0000;">'www.vim.org/scripts/download_script.php?src_id=16224'</span> \
  <span style="color: #000000; font-weight: bold;">&gt;</span> ~<span style="color: #000000; font-weight: bold;">/</span>.vim<span style="color: #000000; font-weight: bold;">/</span>autoload<span style="color: #000000; font-weight: bold;">/</span>pathogen.vim</pre></div></div>



<p>
.vimrcに次の1行を追加してインストール完了。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">call pathogen<span style="color: #666666; font-style: italic;">#infect()</span></pre></div></div>



<h3>vim-coffee-scriptプラグインのインストール</h3>
<p>
インストール自体は.vim/bundle以下にgit cloneするだけで完了。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>.vim<span style="color: #000000; font-weight: bold;">/</span>bundle
<span style="color: #c20cb9; font-weight: bold;">git</span> clone https:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>kchmck<span style="color: #000000; font-weight: bold;">/</span>vim-coffee-script.git</pre></div></div>



<p>
タブの設定をCoffeeScriptの推奨値にあわせて変更。次の1行を ~/.vim/after/ftplugin/coffee.vim に追加する。
</p>


<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">setlocal</span> <span style="color: #668080;">shiftwidth</span>=<span style="color: #000000; font-weight:bold;">2</span> <span style="color: #668080;">expandtab</span></pre></div></div>



<p>
さらに最も使用頻度が高い:CoffeeCompileコマンド（編集中のファイルをJavaScriptにコンパイルして、結果を別ウィンドウに表示するコマンド）にはショートカットキーを割り当てる。私はC-cに割り当てることにした。以下の2行を ~/.vim/after/ftplugin/coffee.vim に追加する。
</p>


<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #adadad; font-style: italic;">&quot; CoffeeCompileコマンドにvertオプションを付けることでウィンドウが縦に分割され、</span><span style="color: #adadad; font-style: italic;">
&quot; splitrightオプションによってコンパイル結果が右側に表示されるようになる</span>
<span style="color: #804040;">nnoremap</span> <span style="color: #668080;">&lt;silent&gt;</span> <span style="color: #000000;">&lt;</span>C<span style="color: #000000;">-</span>C<span style="color: #000000;">&gt;</span> <span style="color: #000000;">:</span>CoffeeCompile vert <span style="color: #000000;">&lt;</span>CR<span style="color: #000000;">&gt;&lt;</span>C<span style="color: #000000;">-</span>w<span style="color: #000000;">&gt;</span>h
<span style="color: #804040;">setlocal</span> <span style="color: #668080;">splitright</span></pre></div></div>



<h3>vim-indent-guidesプラグインのインストール</h3>
<p>
CoffeeScriptはインデントで構造を表すので、インデント量の違いを見やすくするためにvim-indent-guidesプラグインを導入する。これもインストール自体はgit cloneで完了。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>.vim<span style="color: #000000; font-weight: bold;">/</span>bundle
<span style="color: #c20cb9; font-weight: bold;">git</span> clone https:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>nathanaelkane<span style="color: #000000; font-weight: bold;">/</span>vim-indent-guides.git</pre></div></div>



<p>
gVimで使用する場合はインデントの色も自動で設定されるようだが、私はターミナルで使用したいので手動で色を指定した。色見本は<a href="http://d.hatena.ne.jp/kakurasan/20080703/p1">こちらのページ</a>を参考にした。
</p>


<div class="wp_syntax"><div class="code"><pre class="vim" style="font-family:monospace;"><span style="color: #804040;">let</span> g<span style="color: #000000;">:</span>indent_guides_enable_on_vim_startup = <span style="color: #000000; font-weight:bold;">1</span>
<span style="color: #804040;">let</span> g<span style="color: #000000;">:</span>indent_guides_auto_colors = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #adadad; font-style: italic;">
&nbsp;
&quot; indent guides</span>
<span style="color: #804040;">augroup</span> indentguides
    <span style="color: #804040;">autocmd</span><span style="color: #000000;">!</span>
    <span style="color: #804040;">autocmd</span> <span style="color: #25BB4D;">VimEnter</span>,Colorscheme <span style="color: #000000;">*</span> <span style="color: #000000;">:</span><span style="color: #804040;">hi</span> IndentGuidesEven ctermbg=<span style="color: #000000; font-weight:bold;">236</span>
    <span style="color: #804040;">autocmd</span> <span style="color: #25BB4D;">VimEnter</span>,Colorscheme <span style="color: #000000;">*</span> <span style="color: #000000;">:</span><span style="color: #804040;">hi</span> IndentGuidesOdd ctermbg=<span style="color: #000000; font-weight:bold;">235</span>
<span style="color: #804040;">augroup</span> END</pre></div></div>



<p>
最終的な表示は次のようになる。
</p>
<p>
<a href="http://wp.serpere.info/wp-content/uploads/2012/01/vim-coffee.jpg"><img src="http://wp.serpere.info/wp-content/uploads/2012/01/vim-coffee-300x208.jpg" alt="CoffeeCompileを実行してコンパイル結果を表示したところ" title="CoffeeCompileを実行してコンパイル結果を表示したところ" width="300" height="208" class="alignnone size-medium wp-image-2483" /></a>
</p>
<h3>参考</h3>
<ul>
<li><a href="http://www.sochiai.com/2011/10/vim-coffee-script/">vim pluginとgitで強まった開発環境を手に入れよう！〜coffeescript編〜</a></li>
<li><a href="http://www.amazon.co.jp/Vim%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB-%EF%BD%9E%E4%BD%9C%E6%A5%AD%E5%8A%B9%E7%8E%87%E3%82%92%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%81%99%E3%82%8B150%E3%81%AE%E6%8A%80-Vim%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/4774147958%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774147958">Vimテクニックバイブル　～作業効率をカイゼンする150の技</a></li>
</ul>
<p>
<a href="http://www.amazon.co.jp/Vim%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%83%90%E3%82%A4%E3%83%96%E3%83%AB-%EF%BD%9E%E4%BD%9C%E6%A5%AD%E5%8A%B9%E7%8E%87%E3%82%92%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%81%99%E3%82%8B150%E3%81%AE%E6%8A%80-Vim%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/4774147958%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774147958"><img src="http://ecx.images-amazon.com/images/I/516K5O-bN8L._SL160_.jpg" alt="" /></a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2470/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>doScrollによるDOMContentLoadedエミュレーションの落とし穴</title>
		<link>http://wp.serpere.info/archives/2454</link>
		<comments>http://wp.serpere.info/archives/2454#comments</comments>
		<pubDate>Thu, 24 Nov 2011 15:26:42 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2454</guid>
		<description><![CDATA[今更こんなことが問題になるケースは稀だと思うが、『パーフェクトJavaScript』の中でも紹介されていたので注意として書いておく。 IE8以前でDOMContentLoadedイベントをエミュレートする方法として、doScrollを使ったハックは広く知られている。例として『パーフェクトJavaScript』230ページのリスト8.9より引用。 function IEContentLoaded &#40;callback&#41; &#123; &#40;function &#40;&#41; &#123; try &#123; document.documentElement.doScroll&#40;'left'&#41;; &#125; catch &#40;error&#41; &#123; setTimeout&#40;arguments.callee, 0&#41;; return; &#125; callback&#40;&#41;; &#125;&#41;&#40;&#41;; &#125; しかし実際に試してみればわかるが、これだとwindow.onloadより実行が遅くなる場合がある。 テスト1（画像なし） テスト2（画像あり） 具体的には 画像など外部から読み込まれるリソースが少ない場合 リロードした時にキャッシュがきいている場合 こういったケースではwindow.onloadとdoScrollハックの実行順序は逆転する場合がある。もちろん逆転しない場合もある。doScrollハックはあくまでハックであって正式なイベントシステムの一部ではないのだから、一貫した動作をしなくても当然だと言える。 この実行順序の逆転を防ぐために、世の中のライブラリではdocument.onreadystatechangeイベントを併用するのが習わしとなっている。例えばdoScrollハックを世に広めたDiego Perini氏の実装を見れば、trying to always fire before onload というコメントとともにreadyStateをチェックするコードが入っているのが分かる。 document.onreadystatechange = function&#40;&#41; &#123; if &#40;document.readyState == 'complete'&#41; &#123; //コールバック関数を実行し、以後はdoScrollハックが動かないようにしておく &#125; &#125;; テスト1（画像なし） テスト2（画像あり） 現実問題としては、わざわざ自前でdoScrollハックを書くような状況では、この順序の逆転が問題になることはまずないと思われる。しかし以下のような教訓を読み取ることはできるだろう: 広く知られていようがハックはハック。使うときは慎重になろう 可能な限り信頼できる既存の実装を使おう [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2454%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FuQBkxp%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22doScroll%E3%81%AB%E3%82%88%E3%82%8BDOMContentLoaded%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4%22%20%7D);"></div>
<p>
今更こんなことが問題になるケースは稀だと思うが、『<a href="http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88JavaScript-PERFECT-4-%E4%BA%95%E4%B8%8A-%E8%AA%A0%E4%B8%80%E9%83%8E/dp/477414813X%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D477414813X">パーフェクトJavaScript</a>』の中でも紹介されていたので注意として書いておく。
</p>
<p>
IE8以前でDOMContentLoadedイベントをエミュレートする方法として、doScrollを使ったハックは広く知られている。例として『パーフェクトJavaScript』230ページのリスト8.9より引用。
</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> IEContentLoaded <span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">doScroll</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'left'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>error<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            setTimeout<span style="color: #009900;">&#40;</span>arguments.<span style="color: #660066;">callee</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        callback<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
しかし実際に試してみればわかるが、これだとwindow.onloadより実行が遅くなる場合がある。
</p>
<p>
<a href="http://www.serpere.info/doscroll/loadtest.php">テスト1（画像なし）</a> <a href="http://www.serpere.info/doscroll/loadtest.php/naive_image">テスト2（画像あり）</a>
</p>
<p>
具体的には
</p>
<ul>
<li>画像など外部から読み込まれるリソースが少ない場合</li>
<li>リロードした時にキャッシュがきいている場合</li>
</ul>
<p>
こういったケースではwindow.onloadとdoScrollハックの実行順序は逆転する場合がある。もちろん逆転しない場合もある。doScrollハックはあくまでハックであって正式なイベントシステムの一部ではないのだから、一貫した動作をしなくても当然だと言える。
</p>
<p>
この実行順序の逆転を防ぐために、世の中のライブラリではdocument.onreadystatechangeイベントを併用するのが習わしとなっている。例えばdoScrollハックを世に広めた<a href="http://javascript.nwbox.com/IEContentLoaded/iecontentloaded.js">Diego Perini氏の実装</a>を見れば、<q>trying to always fire before onload</q> というコメントとともにreadyStateをチェックするコードが入っているのが分かる。
</p>


<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">document.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'complete'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">//コールバック関数を実行し、以後はdoScrollハックが動かないようにしておく</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>



<p>
<a href="http://www.serpere.info/doscroll/loadtest.php/correct_text">テスト1（画像なし）</a> <a href="http://www.serpere.info/doscroll/loadtest.php/correct_image">テスト2（画像あり）</a>
</p>
<p>
現実問題としては、わざわざ自前でdoScrollハックを書くような状況では、この順序の逆転が問題になることはまずないと思われる。しかし以下のような教訓を読み取ることはできるだろう:
</p>
<ul>
<li>広く知られていようがハックはハック。使うときは慎重になろう</li>
<li>可能な限り信頼できる既存の実装を使おう</li>
<li>自分の手で実験しよう</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2454/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UINavigationControllerによる「戻る」「進む」を検出する</title>
		<link>http://wp.serpere.info/archives/2445</link>
		<comments>http://wp.serpere.info/archives/2445#comments</comments>
		<pubDate>Wed, 23 Nov 2011 01:36:02 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[iOS/iPhone開発]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2445</guid>
		<description><![CDATA[UIViewControllerのviewWillAppear:、viewDidDisappear:等のメソッドはviewの表示状態が変化した時に呼ばれるが、なぜ変化したのかという理由までは分からない。つまり以下のようなイベントが簡単には区別できない： UINavigationControllerの中で画面遷移が起こった（戻った・進んだ） modalダイアログが開かれた・閉じられた UITabBarControllerでタブが切り替えられた 今作っているアプリでは特にUINavigationControllerの中で「進んだ」「戻った」といったイベントを検出したかったので、それらをサポートするための抽象クラスを作ってみた（UIViewControllerのサブクラス）。 NavigationSupportController.h NavigationSupportController.m （iOS 4.3と5.0で動作確認） このNavigationSupportControllerのサブクラスでは、viewWillAppear:、viewDidDisappear:等の代わりに次のメソッドをオーバーライドする。 viewWillAppear:(BOOL)animated direction:(NavigationDirection)direction viewDidAppear:(BOOL)animated direction:(NavigationDirection)direction viewWillDisappear:(BOOL)animated direction:(NavigationDirection)direction viewDidDisappear:(BOOL)animated direction:(NavigationDirection)direction NavigationDirectionは列挙型で、次の3種類の値をとる。 NavigationBackUINavigationControllerによる「戻る（=pop）」で画面遷移が起こった NavigationForwardUINavigationControllerによる「進む（=push）」で画面遷移が起こった NavigationNoneUINavigationControllerによらない表示状態の変化が起こった こんな感じで判定する。 - &#40;void&#41;viewWillAppear:&#40;BOOL&#41;animated direction:&#40;NavigationDirection&#41;direction &#123; if &#40;direction == NavigationBack&#41; &#123; //「戻る（= pop）」の場合 &#125; else if &#40;direction == NavigationForward&#41; &#123; //「進む（ = push）」の場合 &#125; else if &#40;direction == NavigationNone&#41; &#123; //NavigationControllerによらない画面遷移の場合 &#125; &#160; //共通の処理はここに書く [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2445%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22UINavigationController%E3%81%AB%E3%82%88%E3%82%8B%E3%80%8C%E6%88%BB%E3%82%8B%E3%80%8D%E3%80%8C%E9%80%B2%E3%82%80%E3%80%8D%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
UIViewControllerのviewWillAppear:、viewDidDisappear:等のメソッドはviewの表示状態が変化した時に呼ばれるが、なぜ変化したのかという理由までは分からない。つまり以下のようなイベントが簡単には区別できない：
</p>
<ul>
<li>UINavigationControllerの中で画面遷移が起こった（戻った・進んだ）</li>
<li>modalダイアログが開かれた・閉じられた</li>
<li>UITabBarControllerでタブが切り替えられた</li>
</ul>
<p>
今作っているアプリでは特にUINavigationControllerの中で「進んだ」「戻った」といったイベントを検出したかったので、それらをサポートするための抽象クラスを作ってみた（UIViewControllerのサブクラス）。
</p>
<p>
<a href="https://gist.github.com/1384662#file_navigation_support_controller.h">NavigationSupportController.h</a><br />
<a href="https://gist.github.com/1384662#file_navigation_support_controller.m">NavigationSupportController.m</a><br />
（iOS 4.3と5.0で動作確認）
</p>
<p>
このNavigationSupportControllerのサブクラスでは、viewWillAppear:、viewDidDisappear:等の代わりに次のメソッドをオーバーライドする。
</p>
<ul>
<li>viewWillAppear:(BOOL)animated direction:(NavigationDirection)direction</li>
<li>viewDidAppear:(BOOL)animated direction:(NavigationDirection)direction</li>
<li>viewWillDisappear:(BOOL)animated direction:(NavigationDirection)direction</li>
<li>viewDidDisappear:(BOOL)animated direction:(NavigationDirection)direction</li>
</ul>
<p>
NavigationDirectionは列挙型で、次の3種類の値をとる。
</p>
<table>
<tr><th>NavigationBack</th><td>UINavigationControllerによる「戻る（=pop）」で画面遷移が起こった</td></tr>
<tr><th>NavigationForward</th><td>UINavigationControllerによる「進む（=push）」で画面遷移が起こった</td></tr>
<tr><th>NavigationNone</th><td>UINavigationControllerによらない表示状態の変化が起こった</td></tr>
</table>
<p>
こんな感じで判定する。
</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewWillAppear<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>animated direction<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NavigationDirection<span style="color: #002200;">&#41;</span>direction
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>direction <span style="color: #002200;">==</span> NavigationBack<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">//「戻る（= pop）」の場合</span>
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>direction <span style="color: #002200;">==</span> NavigationForward<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">//「進む（ = push）」の場合</span>
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>direction <span style="color: #002200;">==</span> NavigationNone<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">//NavigationControllerによらない画面遷移の場合</span>
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">//共通の処理はここに書く</span>
    <span style="color: #11740a; font-style: italic;">//つまり viewWillAppear:(BOOL)animated の方はオーバーライドすべきではない</span>
<span style="color: #002200;">&#125;</span></pre></div></div>



<p>
検出ロジックの都合上、コントローラのインスタンスはpushするときに作成され、popされるときに破棄されることを前提としている。普通はこれで問題ないはず。
</p>
<p>
もっと確実・簡単な方法があれば教えてください。
</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2445/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mod_dosdetector-forkをApache 2.0で動かす</title>
		<link>http://wp.serpere.info/archives/2419</link>
		<comments>http://wp.serpere.info/archives/2419#comments</comments>
		<pubDate>Sat, 12 Nov 2011 01:57:30 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[mod_dosdetector]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2419</guid>
		<description><![CDATA[今更ながら、mod_dosdetector-forkをApache 2.0で動かすための方法をまとめておく。少しだけソースコードを編集する必要がある。 必要なもの： mod_dosdetector-forkのapache-2.0ブランチ Apache 2.2 のソースコード Download &#8211; The Apache HTTP Server Project ソースコードを編集するためのエディタ（手動で編集する場合） Linux（他のUNIX系のOSでも動くかも） 一応、自動で編集するスクリプトも作ってみたが、先に手動で編集する場合の手順をざっと説明しておく。 手順1. mod_dosdetector.c をエディタで開き、/* code for apache 2.0 */ というコメントが書いてある部分に次の1行を書き加える。 #include &#34;apache20.h&#34; 手順2. Apache 2.2のソースを展開して srclib/apr/shmem/unix/shm.c をエディタで開き、関数apr_shm_removeの定義部分をコピーして、手順1で編集した部分の直後にペーストする。最終的にこんな感じになる。 /* code for apache 2.0 */ #include &#34;apache20.h&#34; APR_DECLARE&#40;apr_status_t&#41; apr_shm_remove&#40;const char *filename, apr_pool_t *pool&#41; &#123; //..略.. &#125; 以上で必要な編集作業は終わり。ここまでの手順を自動化するスクリプトがapache20.plという名前で入っているので、これを実行してもいい。 # 展開したApache 2.2のソースディレクトリを指定する perl [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2419%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22mod_dosdetector-fork%E3%82%92Apache%202.0%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%22%20%7D);"></div>
<p>
今更ながら、<a href="https://github.com/tkyk/mod_dosdetector-fork">mod_dosdetector-fork</a>をApache 2.0で動かすための方法をまとめておく。少しだけソースコードを編集する必要がある。
</p>
<p>
必要なもの：
</p>
<ul> 
<li>mod_dosdetector-forkの<a href="https://github.com/tkyk/mod_dosdetector-fork/tree/apache-2.0">apache-2.0ブランチ</a></li>
<li>Apache 2.2 のソースコード <a href="http://httpd.apache.org/download.cgi">Download &#8211; The Apache HTTP Server Project</a></li>
<li>ソースコードを編集するためのエディタ（手動で編集する場合）</li>
<li>Linux（他のUNIX系のOSでも動くかも）</li>
</ul>
<p>
一応、自動で編集するスクリプトも作ってみたが、先に手動で編集する場合の手順をざっと説明しておく。
</p>
<h3>手順1.</h3>
<p>
mod_dosdetector.c をエディタで開き、<code>/* code for apache 2.0 */</code> というコメントが書いてある部分に次の1行を書き加える。
</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;apache20.h&quot;</span></pre></div></div>



<h3>手順2.</h3>
<p>
Apache 2.2のソースを展開して srclib/apr/shmem/unix/shm.c をエディタで開き、関数apr_shm_removeの定義部分をコピーして、手順1で編集した部分の直後にペーストする。最終的にこんな感じになる。
</p>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* code for apache 2.0 */</span>
<span style="color: #339933;">#include &quot;apache20.h&quot;</span>
APR_DECLARE<span style="color: #009900;">&#40;</span>apr_status_t<span style="color: #009900;">&#41;</span> apr_shm_remove<span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>filename<span style="color: #339933;">,</span>
                                         apr_pool_t <span style="color: #339933;">*</span>pool<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//..略..</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
以上で必要な編集作業は終わり。ここまでの手順を自動化するスクリプトがapache20.plという名前で入っているので、これを実行してもいい。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># 展開したApache 2.2のソースディレクトリを指定する</span>
<span style="color: #c20cb9; font-weight: bold;">perl</span> apache20.pl path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>httpd-<span style="color: #000000;">2.2</span>.x</pre></div></div>



<p>
あとは通常通りのインストール手順でOK。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#apxsが/usr/sbinに入っている場合</span>
<span style="color: #666666; font-style: italic;">#コンパイル</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin:<span style="color: #007800;">$PATH</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#インストール</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin:<span style="color: #007800;">$PATH</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>



<p>
動作確認は次の環境で行った。
</p>
<ul>
<li>ソースコードのコピー元: Apache 2.2.21</li>
<li>動作: Apache 2.0.64 on CentOS 5</li>
<li>動作: Apache 2.0.52 on CentOS 4</li>
</ul>
<p>
今後どの程度メンテナンスを行っていくかは不明なので、そこは予めご了承いただきたい。あと2.2側のコード変更によっては自動化スクリプトは動かなくなる可能性があるので、そのときは適宜手動で対応のこと。
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2419/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dart言語のIsolateについて調べてみた</title>
		<link>http://wp.serpere.info/archives/2332</link>
		<comments>http://wp.serpere.info/archives/2332#comments</comments>
		<pubDate>Fri, 28 Oct 2011 15:29:19 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Dart]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2332</guid>
		<description><![CDATA[Googleが先日発表したプログラミング言語Dart。その特長の一つとして挙げられるIsolateが面白そうだったので、ちょっと特性を調べてみた。結論から言うと、なかなか気難しい機能だな、という印象。 何か意味のあるサンプルを作りたかったわけではなく、単に動作の性質が知りたかっただけです 実装は読んでないので多分に憶測混じりです dartlang.org上のDartboardでテストしています DartのIsolateはErlangのプロセスに似ていると評価されることがあるが（確かに似たところもあるが）、使用感は全く別物と思った方が良いと思う。最も大きな違いは「receiveがブロックしない」つまり「メッセージを受信するまで待つ」ことができないこと。 class IsolateA extends Isolate &#123; main&#40;&#41; &#123; port.receive&#40;&#40;msg, replyTo&#41; &#123; //受信したメッセージの処理 &#125;&#41;; //ここに書いたコードはメッセージの受信を待たず実行される print&#40;&#34;hoge&#34;&#41;; &#125; &#125; これが何を意味するかと言うと、メッセージを受信した後で実行したい処理は全てクロージャの中に入れて、イベント駆動で動作させる必要があるということ。複数のIsolateを扱ったり、処理の前後関係が発生したりするとかなり面倒なことになる。Dart組み込みのPromiseを駆使することが必須になるだろう（最後に例を載せています）。 それと別のIsolateにデータを送るには厳密にメッセージ送信しか手段がない。コンストラクタやプロパティ経由で値を送ってもIsolateインスタンスの中からは参照できない。 class IsolateB extends Isolate &#123; int x = 0; &#160; main&#40;&#41; &#123; port.receive&#40;&#40;msg, replyTo&#41; &#123; print&#40;x + msg&#41;; &#125;&#41;; &#125; &#125; &#160; main&#40;&#41; &#123; IsolateB iso = new IsolateB&#40;&#41;; //ここで値を設定しても消える iso.x = [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2332%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FsMpwyb%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Dart%E8%A8%80%E8%AA%9E%E3%81%AEIsolate%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%81%9F%22%20%7D);"></div>
<p>
Googleが先日発表したプログラミング言語<a href="http://www.dartlang.org/">Dart</a>。その特長の一つとして挙げられるIsolateが面白そうだったので、ちょっと特性を調べてみた。結論から言うと、なかなか気難しい機能だな、という印象。
</p>
<ul>
<li>何か意味のあるサンプルを作りたかったわけではなく、単に動作の性質が知りたかっただけです</li>
<li>実装は読んでないので多分に憶測混じりです</li>
<li>dartlang.org上の<a href="http://try.dartlang.org/">Dartboard</a>でテストしています</li>
</ul>
<p>
DartのIsolateはErlangのプロセスに似ていると評価されることがあるが（確かに似たところもあるが）、使用感は全く別物と思った方が良いと思う。最も大きな違いは「receiveがブロックしない」つまり「メッセージを受信するまで待つ」ことができないこと。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> IsolateA <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">//受信したメッセージの処理</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//ここに書いたコードはメッセージの受信を待たず実行される</span>
    print<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;hoge&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
これが何を意味するかと言うと、メッセージを受信した後で実行したい処理は全てクロージャの中に入れて、イベント駆動で動作させる必要があるということ。複数のIsolateを扱ったり、処理の前後関係が発生したりするとかなり面倒なことになる。Dart組み込みのPromiseを駆使することが必須になるだろう（最後に例を載せています）。
</p>
<p>
それと別のIsolateにデータを送るには厳密にメッセージ送信しか手段がない。コンストラクタやプロパティ経由で値を送ってもIsolateインスタンスの中からは参照できない。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> IsolateB <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">int</span> x <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      print<span style="color: #009900;">&#40;</span>x <span style="color: #339933;">+</span> msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  IsolateB iso <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> IsolateB<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #666666; font-style: italic;">//ここで値を設定しても消える</span>
  iso.<span style="color: #006633;">x</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//表示されるのは 105 ではなく 100</span>
  iso.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
では初期化が必要な場合はどうするのかというと、初期化専用のメッセージ構造を決めておいて、その中に値を込める。例えば配列や辞書を使って。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> IsolateC <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">int</span> x <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;init&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        x <span style="color: #339933;">=</span> msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        print<span style="color: #009900;">&#40;</span>x <span style="color: #339933;">+</span> msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">new</span> IsolateC<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;init&quot;</span>, <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;print&quot;</span>, <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
こういったやり方はErlangでもお馴染みだけど、Erlangと違ってパターンマッチはないしapplyもないし文字列からメソッドを得ることもできないし、そもそも静的型付け思想と全然相容れないしで、はっきりいって、ひどい。このIsolateという機能がどうにもDart言語に最適化されていない、練り込みが足りない感じがするのはこの辺りだ。
</p>
<p>
そしてメッセージ送信を用いても、制約なくどんなオブジェクトでも送れるわけではない。リファレンスに説明がない＆実装を読んでないので詳しい条件は不明だが、独自に定義したクラスのインスタンスは送れない。組み込みのRegExpやPromise等も駄目（Dartboardにはエラーすら出ない）。intやStringといった基本的な値の他には、ListとMapくらいしか送れないと考えた方が良いかもしれない。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Xyz <span style="color: #009900;">&#123;</span>
  <span style="color: #003399;">String</span> toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;xyz&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> IsolateD <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      print<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">new</span> IsolateD<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//エラーすら出ずに無視される</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Xyz<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
それはそれとして、新たに起動したIsolateに対してメッセージを送るサンプルは多いが、別のIsolateから送られたメッセージを”メインIsolate&#8221;で受け取る方法があまり紹介されていないので触れておくと、ReceivePortを普通にnewして、toSendPortで対応するSendPortを生成、sendの第二引数で送信元Isolateに通知すれば良い。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> EchoIsolate <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  SendPort mainPort<span style="color: #339933;">;</span>
&nbsp;
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//第2引数でSendPortが送られてくる</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;init&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        mainPort <span style="color: #339933;">=</span> replyTo<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        mainPort.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;echo: &quot;</span> <span style="color: #339933;">+</span> msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ReceivePort p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReceivePort<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">new</span> EchoIsolate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;init&quot;</span>, p.<span style="color: #006633;">toSendPort</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bar&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//echo: foo, echo bar</span>
  p.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> print<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
特定のIsolateと単発でやり取りする場合はsendの代わりにcallを使うとこの過程を自動化してくれる。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> EchoIsolate <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      replyTo.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;echo: &quot;</span> <span style="color: #339933;">+</span> msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">new</span> EchoIsolate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">call</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> print<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
また特例として、メッセージの中にReceivePortを入れると自動でSendPortに変換されるので、次のようにも書ける。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> EchoIsolate <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  SendPort mainPort<span style="color: #339933;">;</span>
&nbsp;
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg is SendPort<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        mainPort <span style="color: #339933;">=</span> msg<span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        mainPort.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;echo: &quot;</span> <span style="color: #339933;">+</span> msg<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ReceivePort p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReceivePort<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">new</span> EchoIsolate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bar&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">//echo: foo, echo bar</span>
  p.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> print<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>



<p>
最後にFizzBuzzを題材として、2つのIsolateを起動し、&#8221;メインIsolate&#8221;を含む3つをリング状に連結してメッセージを回す例を載せておく。main => Fizz => Buzz => main とメッセージが回って、mainでprintする。それぞれの起動と初期化が非同期になるので、盛大にPromiseを使うことになった。
</p>


<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> FizzBuzzIsolate <span style="color: #000000; font-weight: bold;">extends</span> Isolate <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> MSG_INIT <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;init&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  Promise<span style="color: #339933;">&lt;</span>SendPort<span style="color: #339933;">&gt;</span> _nextPromise<span style="color: #339933;">;</span>
  <span style="color: #003399;">String</span> _word<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">int</span> _divisor<span style="color: #339933;">;</span>
&nbsp;
  _senderFunc<span style="color: #009900;">&#40;</span>i, s<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span>SendPort nextPort<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>i <span style="color: #339933;">%</span> _divisor <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> s <span style="color: #339933;">+=</span> _word<span style="color: #339933;">;</span>
    nextPort.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>i, s<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">static</span> init<span style="color: #009900;">&#40;</span>SendPort port, SendPort nextPort, <span style="color: #003399;">String</span> word, <span style="color: #000066; font-weight: bold;">int</span> divisor<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span>
    port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>MSG_INIT, <span style="color: #009900;">&#91;</span>word, divisor<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span>, nextPort<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    _nextPromise <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Promise<span style="color: #339933;">&lt;</span>SendPort<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    port.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>msg, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        port.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> MSG_INIT<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        _word <span style="color: #339933;">=</span> msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        _divisor <span style="color: #339933;">=</span> msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        _nextPromise.<span style="color: #006633;">complete</span><span style="color: #009900;">&#40;</span>replyTo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        _nextPromise.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span>_senderFunc<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>, msg<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  ReceivePort mainPort <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ReceivePort<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  Promise<span style="color: #339933;">&lt;</span>SendPort<span style="color: #339933;">&gt;</span>
    fizz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FizzBuzzIsolate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
    buzz <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FizzBuzzIsolate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">spawn</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>,
    p <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Promise<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  p.<span style="color: #006633;">waitFor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>fizz, buzz<span style="color: #009900;">&#93;</span>, <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  p.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>val<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    FizzBuzzIsolate.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>fizz.<span style="color: #006633;">value</span>, buzz.<span style="color: #006633;">value</span>, <span style="color: #0000ff;">&quot;Fizz&quot;</span>, <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    FizzBuzzIsolate.<span style="color: #006633;">init</span><span style="color: #009900;">&#40;</span>buzz.<span style="color: #006633;">value</span>, mainPort.<span style="color: #006633;">toSendPort</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, <span style="color: #0000ff;">&quot;Buzz&quot;</span>, <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  _sender<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=&gt;</span> port.<span style="color: #006633;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>i, <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&lt;=</span><span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> fizz.<span style="color: #006633;">then</span><span style="color: #009900;">&#40;</span>_sender<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  mainPort.<span style="color: #006633;">receive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>message, replyTo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    print<span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">?</span> message<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">:</span> message<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>




]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2332/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneの機種を判別するUIDevice Extension</title>
		<link>http://wp.serpere.info/archives/2316</link>
		<comments>http://wp.serpere.info/archives/2316#comments</comments>
		<pubDate>Sun, 25 Sep 2011 14:48:17 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[iOS/iPhone開発]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2316</guid>
		<description><![CDATA[iPhone 5の発表間近といわれる今日この頃。 アプリ内でiPhone（iOSデバイス）の機種を判別するには sysctlbyname というC言語の関数を使うのだが、結果は &#8220;iPhone3,1&#8243; のような文字列で返ってくるため、そのままでは扱いづらい。これをわかりやすい形に変換してくれるUIDevice Extensionというオープンソースのライブラリが存在する。 erica / uidevice-extension &#8211; GitHub BSDライセンス （注: forked from ars/uidevice-extension とあるが、arsとericaはともにErica Sadunさんのアカウントなので、これが本家リポジトリと考えて良いようだ） UIDevice Extensionには多くの機能があるが、機種判別を行うだけなら UIDevice-Hardware.{h,m} のみ自分のプロジェクトにコピーすれば良い。いずれもUIDeviceクラスに対するカテゴリとして構成されているので、使用したい箇所で .h をインクルードすれば、UIDeviceに専用のメソッドが追加される。 機種名を文字列として取得するには platformString メソッドを使う。このメソッドが適しているのはユーザがどの機種を使っているか集計したい場合等だろう。なお2011年9月25日現在、未発表のiPhone 5まで対応している（この情報が確実に正しいとまでは言えないはずだが）。 //@&#34;iPhone 3GS&#34; や @&#34;iPhone 4&#34; といった文字列が返る NSString *iosDevice = &#91;&#91;UIDevice currentDevice&#93; platformString&#93;; &#160; //おまけ: iOSのバージョンとアプリのバージョンを取得する NSString *osVersion = &#91;&#91;UIDevice currentDevice&#93; systemVersion&#93;; NSString *appVersion = &#91;&#91;&#91;NSBundle [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2316%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22iPhone%E3%81%AE%E6%A9%9F%E7%A8%AE%E3%82%92%E5%88%A4%E5%88%A5%E3%81%99%E3%82%8BUIDevice%20Extension%22%20%7D);"></div>
<p>
iPhone 5の発表間近といわれる今日この頃。
</p>
<p>
アプリ内でiPhone（iOSデバイス）の機種を判別するには <a href="http://www.google.co.jp/search?q=sysctlbyname+hw.machine&#038;ie=utf-8&#038;oe=utf-8">sysctlbyname</a> というC言語の関数を使うのだが、結果は &#8220;iPhone3,1&#8243; のような文字列で返ってくるため、そのままでは扱いづらい。これをわかりやすい形に変換してくれるUIDevice Extensionというオープンソースのライブラリが存在する。
</p>
<a href="https://github.com/erica/uidevice-extension">erica / uidevice-extension &#8211; GitHub</a> BSDライセンス
</br>
<span class="remark">（注: forked from ars/uidevice-extension とあるが、arsとericaはともにErica Sadunさんのアカウントなので、これが本家リポジトリと考えて良いようだ）</span>
</p>
<p>
UIDevice Extensionには多くの機能があるが、機種判別を行うだけなら UIDevice-Hardware.{h,m}  のみ自分のプロジェクトにコピーすれば良い。いずれもUIDeviceクラスに対するカテゴリとして構成されているので、使用したい箇所で .h をインクルードすれば、UIDeviceに専用のメソッドが追加される。
</p>
<p>
機種名を文字列として取得するには platformString メソッドを使う。このメソッドが適しているのはユーザがどの機種を使っているか集計したい場合等だろう。なお2011年9月25日現在、未発表のiPhone 5まで対応している（この情報が確実に正しいとまでは言えないはずだが）。
</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//@&quot;iPhone 3GS&quot; や @&quot;iPhone 4&quot; といった文字列が返る</span>
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>iosDevice <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> platformString<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//おまけ: iOSのバージョンとアプリのバージョンを取得する</span>
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>osVersion <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemVersion<span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>appVersion <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> infoDictionary<span style="color: #002200;">&#93;</span>
                                        objectForKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>kCFBundleVersionKey<span style="color: #002200;">&#93;</span>;</pre></div></div>



<p>
機種に応じてロジックを切り替える必要がある場合には platformType メソッドが適している。戻り値はヘッダファイル内で定義された列挙型 UIDevicePlatform である。
</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> platformType<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> UIDevice4iPhone<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">//iPhone4 の場合の処理</span>
<span style="color: #002200;">&#125;</span></pre></div></div>



<p>
ただ大雑把に機種を振り分ける場合にはコードが煩雑になりがちなので、<a href="https://github.com/jorgenpt/uidevice-extension/blob/master/UIDevice-Hardware.h">jorgenptさんのforkで定義されている</a>ような包括的なマクロを利用するのが良いかもしれない。いずれにせよこの種の判定でロジックを切り替える場合、前方互換性に注意する必要がある。
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2316/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneアプリの使用状況をGoogle Analytics for iOSで解析する</title>
		<link>http://wp.serpere.info/archives/2308</link>
		<comments>http://wp.serpere.info/archives/2308#comments</comments>
		<pubDate>Mon, 19 Sep 2011 12:31:35 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[iOS/iPhone開発]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2308</guid>
		<description><![CDATA[Google AnalyticsにはiOS版があり、アプリ内の画面操作に仮想的なURLを割り当てることで、Webサイトと同じように”アクセス解析”ができる。 インストール 公式サイトからSDKをダウンロードして展開、Libraryディレクトリの中に入っている GANTracker.h と libGoogleAnalytics.a を自分のプロジェクトにコピーする（もう一つの libGoogleAnalytics_NoThumb.a はThumb命令を無効にしたプロジェクトで使用するもの。標準のプロジェクトでは必要ない）。 次にXcodeでプロジェクトファイルを開き「TARGETS」でアプリを選択、「Build Phases」「Link Binary With Libraries」を開いて、「+」ボタンを押してCFNetworkフレームワークとlibsqlite3.0.dylibを追加する。ちなみに libGoogleAnalytics.a はプロジェクトにコピーした段階で追加されているはず。 使用方法 公式サイトのドキュメントを読めばわかる通り、トラッキングの概念や使い方はWeb用のGoogle Analyticsとほぼ同じなので、迷うことはないだろう。ただトラッキング用のメソッドを実行してもすぐにはGoogleサーバーにデータが送られず、一定の時間（初期化時に dispatchPeriod として指定する）ごとにまとめて送られるという動作が異なる。 あと GANTracker.h のコメントにはサイトに書いていない有用な情報が含まれているので、そちらもチェックした方が良い。下記の便利マクロに使っている知識もそこから得た。 便利マクロ http://d.hatena.ne.jp/ninjinkun/20110115/1295074900 ここで紹介されているマクロが便利なので改造して使わせていただいている。自分で追加・変更した内容は以下の通り。 初期化マクロ GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) GAアカウントと送信間隔とdelegateの設定を行う、初期化用のマクロ。定義は下のようになる。 #define __GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) \ &#91;&#91;GANTracker sharedTracker&#93; startTrackerWithAccountID:ACCOUNT \ dispatchPeriod:PERIOD \ delegate:DELEGATE&#93;; &#160; #ifdef DEBUG #define GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) { \ __GA_INIT_TRACKER&#40;ACCOUNT, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2308%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22iPhone%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%BF%E7%94%A8%E7%8A%B6%E6%B3%81%E3%82%92Google%20Analytics%20for%20iOS%E3%81%A7%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
Google AnalyticsにはiOS版があり、アプリ内の画面操作に仮想的なURLを割り当てることで、Webサイトと同じように”アクセス解析”ができる。
</p>
<h3>インストール</h3>
<p>
<a href="http://code.google.com/mobile/analytics/download.html">公式サイト</a>からSDKをダウンロードして展開、Libraryディレクトリの中に入っている GANTracker.h と libGoogleAnalytics.a を自分のプロジェクトにコピーする（もう一つの libGoogleAnalytics_NoThumb.a はThumb命令を無効にしたプロジェクトで使用するもの。標準のプロジェクトでは必要ない）。
</p>
<p>
次にXcodeでプロジェクトファイルを開き「TARGETS」でアプリを選択、「Build Phases」「Link Binary With Libraries」を開いて、「+」ボタンを押してCFNetworkフレームワークとlibsqlite3.0.dylibを追加する。ちなみに libGoogleAnalytics.a はプロジェクトにコピーした段階で追加されているはず。
</p>
<h3>使用方法</h3>
<a href="http://code.google.com/mobile/analytics/docs/iphone/#howItWorks">公式サイトのドキュメント</a>を読めばわかる通り、トラッキングの概念や使い方はWeb用のGoogle Analyticsとほぼ同じなので、迷うことはないだろう。ただトラッキング用のメソッドを実行してもすぐにはGoogleサーバーにデータが送られず、一定の時間（初期化時に dispatchPeriod として指定する）ごとにまとめて送られるという動作が異なる。
</p>
<p>
あと GANTracker.h のコメントにはサイトに書いていない有用な情報が含まれているので、そちらもチェックした方が良い。下記の便利マクロに使っている知識もそこから得た。
</p>
<h3>便利マクロ</h3>
<p>
<a href="http://d.hatena.ne.jp/ninjinkun/20110115/1295074900">http://d.hatena.ne.jp/ninjinkun/20110115/1295074900</a>
</p>
<p>
ここで紹介されているマクロが便利なので改造して使わせていただいている。自分で追加・変更した内容は以下の通り。
</p>
<h4>初期化マクロ</h4>
<pre>
 GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE)
</pre>
<p>
GAアカウントと送信間隔とdelegateの設定を行う、初期化用のマクロ。定義は下のようになる。
</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define __GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) \</span>
<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GANTracker sharedTracker<span style="color: #002200;">&#93;</span> startTrackerWithAccountID<span style="color: #002200;">:</span>ACCOUNT \
                            dispatchPeriod<span style="color: #002200;">:</span>PERIOD \
                            delegate<span style="color: #002200;">:</span>DELEGATE<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #6e371a;">#ifdef DEBUG</span>
<span style="color: #6e371a;">#define GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) { \</span>
  __GA_INIT_TRACKER<span style="color: #002200;">&#40;</span>ACCOUNT, PERIOD, DELEGATE<span style="color: #002200;">&#41;</span>; \
  <span style="color: #002200;">&#91;</span>GANTracker sharedTracker<span style="color: #002200;">&#93;</span>.debug <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>; \
  <span style="color: #002200;">&#91;</span>GANTracker sharedTracker<span style="color: #002200;">&#93;</span>.dryRun <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>; <span style="color: #002200;">&#125;</span>
<span style="color: #6e371a;">#else</span>
<span style="color: #6e371a;">#define GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE) __GA_INIT_TRACKER(ACCOUNT, PERIOD, DELEGATE);</span>
<span style="color: #6e371a;">#endif</span></pre></div></div>



<p>
DEBUGマクロが定義されていた場合限り debug プロパティと dryRun プロパティが有効になる。debug プロパティを有効にするとデータがサーバに送られるタイミングでコンソールにログが出る（生の__utm.gifに対するリクエストログ）。dryRun プロパティを有効にすると実際のサーバにはデータが送られない。
</p>
<h4>ページトラッキング</h4>
<pre>
GA_TRACK_PAGE(PAGE)
</pre>
<p>
元サイトのものとほぼ同じだが、trackPageview:withError: は先頭に / がない場合は自動で付加してくれるので、その部分の処理を省いている。この方が / 付きのパス（NSURLから得たパスなど）をそのまま使えるので便利。
</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#define GA_TRACK_PAGE(PAGE) { \</span>
  <span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span>error; \
  <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GANTracker sharedTracker<span style="color: #002200;">&#93;</span> trackPageview<span style="color: #002200;">:</span>PAGE withError<span style="color: #002200;">:&amp;</span>error<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>,error.helpAnchor<span style="color: #002200;">&#41;</span>;  <span style="color: #002200;">&#125;</span> <span style="color: #002200;">&#125;</span>;</pre></div></div>



]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2308/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>UITableViewのスクロール位置をView再読み込み時に復帰する方法</title>
		<link>http://wp.serpere.info/archives/2296</link>
		<comments>http://wp.serpere.info/archives/2296#comments</comments>
		<pubDate>Fri, 05 Aug 2011 13:06:25 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[iOS/iPhone開発]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2296</guid>
		<description><![CDATA[メモリ警告によってViewが破棄された場合、UITableViewのスクロール位置はリセットされてしまう。再度Viewが読み込まれたときに元の位置に戻すには、破棄される直前のスクロール位置を覚えておく必要がある。だいたい次のようなコードになる： ScrollTestViewController.h #import &#60;UIKit/UIKit.h&#62; &#160; /* UITableViewControllerではなくUIViewControllerを使っている理由は後述 */ @interface ScrollTestViewController : UIViewController&#60;UITableViewDataSource, UITableViewDelegate&#62; &#123; &#160; /* UITableViewはIBOutletでretainする想定 */ UITableView *_tableView; &#160; /* Viewが破棄される直前のスクロール位置 */ CGPoint lastScrollOffset; &#125; @property &#40;nonatomic, retain&#41; IBOutlet UITableView *tableView; &#160; @end ScrollTestViewController.m @implementation ScrollTestViewController &#160; @synthesize tableView = _tableView; &#160; - &#40;void&#41;viewDidLoad &#123; &#91;super viewDidLoad&#93;; &#160; /* reloadDataでデータを読み込んだ後に 記録されているスクロール位置を復帰 初期化直後は{0,0}で初期化されているので影響はない */ [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2296%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fq0VkB0%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22UITableView%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E4%BD%8D%E7%BD%AE%E3%82%92View%E5%86%8D%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E6%99%82%E3%81%AB%E5%BE%A9%E5%B8%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>
メモリ警告によってViewが破棄された場合、UITableViewのスクロール位置はリセットされてしまう。再度Viewが読み込まれたときに元の位置に戻すには、破棄される直前のスクロール位置を覚えておく必要がある。だいたい次のようなコードになる：
</p>
<p>ScrollTestViewController.h</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/* UITableViewControllerではなくUIViewControllerを使っている理由は後述 */</span>
<span style="color: #a61390;">@interface</span> ScrollTestViewController <span style="color: #002200;">:</span>
UIViewController&lt;UITableViewDataSource, UITableViewDelegate&gt; <span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">/* UITableViewはIBOutletでretainする想定 */</span>
    UITableView <span style="color: #002200;">*</span>_tableView;
&nbsp;
    <span style="color: #11740a; font-style: italic;">/* Viewが破棄される直前のスクロール位置 */</span>
    CGPoint lastScrollOffset;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UITableView <span style="color: #002200;">*</span>tableView;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>



<p>ScrollTestViewController.m</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ScrollTestViewController
&nbsp;
<span style="color: #a61390;">@synthesize</span> tableView <span style="color: #002200;">=</span> _tableView;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">/*
     reloadDataでデータを読み込んだ後に
     記録されているスクロール位置を復帰
     初期化直後は{0,0}で初期化されているので影響はない
    */</span>
    <span style="color: #002200;">&#91;</span>_tableView reloadData<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>_tableView setContentOffset<span style="color: #002200;">:</span>lastScrollOffset<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidUnload <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidUnload<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">/*
     スクロール位置を記録した後でUITableViewを破棄する
     viewDidUnloadが呼ばれた時点でメインのViewは既に破棄されているが、
     Controllerがretainしているサブビューはまだ生きているというのがポイント
    */</span>
    lastScrollOffset <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>_tableView contentOffset<span style="color: #002200;">&#93;</span>;
    self.tableView <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc <span style="color: #002200;">&#123;</span>
    self.tableView <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">/*
...
その他、UIViewControllerでUITableViewを使うためには
viewWillAppearで選択を解除する処理などが必要だが
本題には関係ないので省略
...
*/</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>



<p>
ここでUITableViewControllerを使ってしまうと、UITableViewが破棄されるタイミングや再読み込みされるタイミングを制御できなくなるので、記憶するのも元に戻すのも難しくなる。例えばUITableViewのreloadDataをオーバーライドする必要があったりするらしい。
</p>
<p>
参考: <a href="http://blog.livedoor.jp/tek_nishi/archives/3075735.html">iPhone 画面切り替え時、あらかじめテーブルビューを目的の位置にスクロールさせとく技</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2296/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails3のi18n機能および日本語化</title>
		<link>http://wp.serpere.info/archives/2241</link>
		<comments>http://wp.serpere.info/archives/2241#comments</comments>
		<pubDate>Wed, 22 Jun 2011 14:01:30 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails3]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2241</guid>
		<description><![CDATA[必要な情報はRails Guidesの中の以下のページにまとまっている。 Rails Internationalization (I18n) API I18n.translate メソッドを使って「抽象化されたキー」から、ロケールに基づく「自然言語」に変換する。いきなり英語で文章を考えなくて済む分、日本人には取っ付きやすいかもしれない。同様に、 I18n.localize メソッドで日付や時刻のフォーマットを行う。 それぞれ I18n.t, I18n.l という省略形が用意されている。さらに多くのコンテクストでは t, l というショートカットメソッドが使える。 Railsフレームワーク自体もこのメカニズムで国際化されているため、各コンポーネントが要求するキーに対して適切な翻訳を用意することで、フレームワーク全体が翻訳される。 キーは階層化することができる。またRailsが要求するキーも、コンポーネントごとに階層化されている（例: activerecord.errors.messages.record_invalid など） 標準のメッセージファイルにおいては、YAML(.yml)またはRuby(.rb)のハッシュを使って、キーの階層をそのまま再現する。 階層の上位部分をスコープ（scope）と呼ぶが、どこまでがスコープかという区別は明確ではない。 I18n.locale= で使用するロケールを設定する。 使用するロケールの決定方法について。Web&#8221;サイト&#8221;においてはURL中にロケールを含めるべきである。一方で、Web&#8221;アプリケーション/サービス&#8221;においてはAcceptヘッダやDBに保存した個人設定を使うことも有効である。 フレームワーク全体の日本語化 とにかく手っ取り早く”日本語化”をしたいという場合は https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml を config/locales/ に放り込んで、config/application.rb に config.i18n.default_locale = :ja と書いておけば、フレームワークが自動で出力する各種メッセージは日本語になる。ただ標準ではエラーメッセージのフィールド名の後に空白が入るので、errors.formatを次のように修正しておいた方が良いかもしれない（好みの問題だが）。 --- ja.yml.orig 2011-06-22 22:38:21.000000000 +0900 +++ ja.yml 2011-06-22 22:38:33.000000000 +0900 @@ -188,7 +188,7 @@ submit: "保存する" errors: - [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2241%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FmfIeOe%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Rails3%E3%81%AEi18n%E6%A9%9F%E8%83%BD%E3%81%8A%E3%82%88%E3%81%B3%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%22%20%7D);"></div>
<p>
必要な情報はRails Guidesの中の以下のページにまとまっている。
</p>
<p>
<a href="http://guides.rubyonrails.org/i18n.html">Rails Internationalization (I18n) API</a>
</p>
<ul>
<li>
<code>I18n.translate</code> メソッドを使って「抽象化されたキー」から、ロケールに基づく「自然言語」に変換する。いきなり英語で文章を考えなくて済む分、日本人には取っ付きやすいかもしれない。同様に、 <code>I18n.localize</code> メソッドで日付や時刻のフォーマットを行う。
<ul>
<li>それぞれ <code>I18n.t, I18n.l</code> という省略形が用意されている。さらに多くのコンテクストでは <code>t, l</code> というショートカットメソッドが使える。</li>
</ul>
</li>
<li>
Railsフレームワーク自体もこのメカニズムで国際化されているため、各コンポーネントが要求するキーに対して適切な翻訳を用意することで、フレームワーク全体が翻訳される。
</il>
<li>
キーは階層化することができる。またRailsが要求するキーも、コンポーネントごとに階層化されている（例: activerecord.errors.messages.record_invalid など）
<ul>
<li>
標準のメッセージファイルにおいては、YAML(.yml)またはRuby(.rb)のハッシュを使って、キーの階層をそのまま再現する。
</li>
<li>
 階層の上位部分をスコープ（scope）と呼ぶが、どこまでがスコープかという区別は明確ではない。
</li>
</ul>
</il>
<li><code>I18n.locale=</code> で使用するロケールを設定する。
<ul>
<li>使用するロケールの決定方法について。Web&#8221;サイト&#8221;においてはURL中にロケールを含めるべきである。一方で、Web&#8221;アプリケーション/サービス&#8221;においてはAcceptヘッダやDBに保存した個人設定を使うことも有効である。
</li>
</ul>
</li>
</ul>
<h3>フレームワーク全体の日本語化</h3>
<p>
とにかく手っ取り早く”日本語化”をしたいという場合は
</p>
<p>
<a href="https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml">https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml</a>
</p>
<p>を config/locales/ に放り込んで、config/application.rb に</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">config.<span style="color:#9900CC;">i18n</span>.<span style="color:#9900CC;">default_locale</span> = <span style="color:#ff3333; font-weight:bold;">:ja</span></pre></div></div>



<p>
と書いておけば、フレームワークが自動で出力する各種メッセージは日本語になる。ただ標準ではエラーメッセージのフィールド名の後に空白が入るので、errors.formatを次のように修正しておいた方が良いかもしれない（好みの問題だが）。
</p>
<pre>
--- ja.yml.orig     2011-06-22 22:38:21.000000000 +0900
+++ ja.yml     2011-06-22 22:38:33.000000000 +0900
@@ -188,7 +188,7 @@
       submit: "保存する"
 
   errors:
-    format: "%{attribute} %{message}"
+    format: "%{attribute}%{message}"
 
     messages: &#038;errors_messages
       inclusion: "は一覧にありません。"
</pre>
<p>
以後、この ja.yml に自分のアプリ用のメッセージを追加していっても良いが、やはり専用の翻訳ファイルを追加した方が扱いやすいだろう。翻訳ファイルは config/locales/ の中に拡張子 .yml か .rb で作成する。ファイル名は何でもいいし、言語ごとに分けてもいいし分けなくてもいい。ただしサブディレクトリの中に入れた場合は追加の設定が必要になる（参照 <a href="http://guides.rubyonrails.org/i18n.html#organization-of-locale-files">3.4 Organization of Locale Files</a>）。また新たにファイルを追加した場合はサーバを再起動しなければならない。
</p>
<h3>ActiveRecordのモデル名・フィールド名の日本語化</h3>
<p>
上の手順でvalidationのエラーメッセージは日本語化されるが、モデル名やフィールド名は自分で翻訳を用意する必要がある。詳細については下ページ参照。
</p>
<p>
<a href="http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models">Translations for Active Record Models</a>
</p>
<h3>ActiveModelのモデル名・フィールド名の日本語化</h3>
<p>
任意のクラスにおいて <code>ActiveModel::Translation</code> モジュールをextendすることで、ActiveRecord同様の翻訳機能が有効になる。
</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyForm
  extend <span style="color:#6666ff; font-weight:bold;">ActiveModel::Translation</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>
<a href="http://api.rubyonrails.org/classes/ActiveModel/Translation.html">Active Model Translation</a>
</p>
<p>
ただしスコープが activerecord ではなく activemodel であることに注意（サブクラスで <code>i18n_scope</code> メソッドをオーバライドすれば変更できるが）。
</p>


<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">activemodel:
  models:
    my_form: &quot;モデル名&quot;
  attributes:
    my_form
      attr_name: &quot;属性名&quot;</pre></div></div>



<p>
なおvalidationに関してはActiveRecordと共通である。
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2241/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails3+Rspecでファイルアップロードのテストをする</title>
		<link>http://wp.serpere.info/archives/2237</link>
		<comments>http://wp.serpere.info/archives/2237#comments</comments>
		<pubDate>Mon, 20 Jun 2011 14:30:22 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Rails3]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2237</guid>
		<description><![CDATA[標準のTest::Unitに含まれている fixture_file_upload はrspec-railsに含まれていないので、自分でspec_helper.rbに追加する。 def fixture_file_upload&#40;path, type&#41; Rack::Test::UploadedFile.new&#40;fixture_path + path, type&#41; end 標準の fixture_file_upload 同様、Rack::Test::UploadedFile のインスタンスを返すだけ。 テストに使用するファイルは spec/fixtures/ 以下に置く。例えば spec/fixtures/files/dummy.txt を使用するには fixture_file_upload&#40;&#34;/files/dummy.txt&#34;, &#34;text/plain&#34;&#41;]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F2237%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Rails3%2BRspec%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
標準のTest::Unitに含まれている fixture_file_upload はrspec-railsに含まれていないので、自分でspec_helper.rbに追加する。
</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> fixture_file_upload<span style="color:#006600; font-weight:bold;">&#40;</span>path, type<span style="color:#006600; font-weight:bold;">&#41;</span>
  Rack::<span style="color:#CC00FF; font-weight:bold;">Test</span>::UploadedFile.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>fixture_path <span style="color:#006600; font-weight:bold;">+</span> path, type<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>



<p>
標準の fixture_file_upload 同様、Rack::Test::UploadedFile のインスタンスを返すだけ。
</p>
<p>
テストに使用するファイルは spec/fixtures/ 以下に置く。例えば spec/fixtures/files/dummy.txt を使用するには
</p>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">fixture_file_upload<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/files/dummy.txt&quot;</span>, <span style="color:#996600;">&quot;text/plain&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>



]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2237/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 2.820 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-11 11:50:09 -->

