<?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>へびにっき</title>
	<atom:link href="http://wp.serpere.info/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:25:38 +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>『その数学が戦略を決める』 レビュー</title>
		<link>http://wp.serpere.info/archives/2523</link>
		<comments>http://wp.serpere.info/archives/2523#comments</comments>
		<pubDate>Sat, 04 Feb 2012 13:25:13 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[読書]]></category>
		<category><![CDATA[勝間塾]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2523</guid>
		<description><![CDATA[本書は、統計分析の活躍を語る本である。特に、様々な意思決定に用いられる統計分析を「絶対計算」と呼んで、それらがどれだけ多くの分野で、どれだけ大きな成功を収めてきたかを、実に誇らしげに語っている。何しろ著者自身が、第一級の”絶対計算家”の一人なのだ。その強い自負と責任感が、文の調子からも伝わってくる。 絶対計算の台頭によって、人間の経験や知識や直感、そしてそれらを売りにしていた専門家たちは、意思決定プロセスの現場から弾き出されてしまった（あるいは、弾き出されつつある）。本書は、専門家たちに対する、絶対計算の優位性を、これでもかというくらいに語る。その様は爽快ではあるし、頭では正しいと理解できるけれども、やっぱり、空恐ろしさを感じずにはいられない。なぜなら、ごく普通の意味での「意思決定」とは、「自分の経験や知識や直感をもとに、専門家の意見も聞いて、自分で何かを決定すること」に他ならないからだ。 私は今、この本の感想をiPhoneで書いている。多くの人に読んで欲しいと思って、文章を推敲している。あなたはこの感想を読んでいる。きっと、何か有益な情報が欲しいと思って読んでくれているのだと思う。しかし私たちの行動は、ともに目的に対してベストではない。より適切な行動は、統計分析が知っている。 人間の直感に基づく意思決定は、全く当てにならない。本書にはそんな事例が、山ほど出てくる。「でも、絶対計算の結果を専門家の代わりに利用すれば、より良い判断ができるってことでしょう？」という、”直感的な”期待すら裏切られる。ほとんどの場合、何も考えずに、ただ統計分析に従った方が正しい。 しかし本書は、人間の直感の価値を否定する本ではない。例えばワインの事例。どのような気象条件が揃えばブドウが美味しくなるのかは、昔から経験的に知られていた。その背景にあったのは、ごく自然な、直感に基づく推論だ：「夏の気温が高ければ、実が良く熟して酸味が抜ける。雨が少なければ、果汁が実の中で濃縮される」。著者らが行った無線式車両盗難防止装置の調査も、”根拠に基づく医療”を掲げるバーウィックの根拠も、本書のその他あらゆる事例も、そうした例に加えていいだろう。みんな始まりは、ありきたりな直感からなのだ。 だから絶対計算とは、人間の直感にとっては、いわば淘汰圧のようなものだ。淘汰圧がなかった頃は、どんな役に立たない直感も、生き延びることができた。たまたま最初の事例で偏りがあったとか、言い出した人が業界の権威だったとか、全くの誤解だけど理屈だけはもっともらしいとか……いずれにせよ、誰にも間違いを証明することはできなかったから、根拠がないままに信じられていた。そこに絶対計算が登場した。誰にでも分かる形で、直感の本当の価値が示されるようになった。価値のない直感は淘汰された。そして真に価値ある直感、絶対計算という淘汰の力をも利用する直感だけが、生き延びて大きな繁栄を謳歌するようになった。その繁栄の規模は、かつては考えられなかったほどに巨大だ。 無論、この淘汰の圧力は、今後も強まり続けるだろう。コンピュータの処理能力はますます上がり、より多くのデータを、さらに短時間で解析できるようになっていく。人生の多くの意思決定が、誰かの絶対計算の結果によって覆い尽くされていくのだ。そんな世界では、絶対計算家ではない一般の人たちも、統計の基礎的な素養を身につけなければならない。それは不当な扱いから身を守るためであり、同時に自らがチャンスを掴むためでもある。その手始めとして、誰もが使える統計の武器である「2SDルール」と「ベイズ理論」を紹介して、本書は締めくくられる。 補足：プログレッサ計画はバラマキか？ 本書の文庫版には追加の訳者付記があって、そこで翻訳者の山形浩生氏が、3章に登場する「プログレッサ計画」に対し、「バラマキ政策ではないのか」と疑問を投げかけている。 要するに、子供が学校に通ったらお金を（それも通常賃金の三分の二というかなりの金額を）あげるという代物だ。所得水準でいえば、日本で小学生に、月に十万円あげるから学校に行こう、と言うに等しい。（略）それだけのお金をあげれば、就学率が上がったり、学校をやめる子が減ったりするのは当然だ。 だがこのプロジェクトの中身を考えると、本当に絶対計算を使う必要があったのだろうか？（略）そしてこれは実は（日本の子供手当など問題にならないくらいすごい）ばらまき政策ではないのか？ これはあんまりな誤読だと思うから、要点を論じておこう。以下の議論は、あくまで本文に何と書いてあるかについての議論であって、現実のプログレッサ計画がどんなものだったかとは関係ない。 プログレッサとは、子供の労働力の市場価値に応じて、親に現金を給付する政策だ。本当に貧しい家庭では、親が幼い子供を働きに出す。親が子供の未来を犠牲にしてしまうのだ。それを防ぐための政策が、プログレッサである。この時点で「日本で小学生に10万円」とは全く違う話だ。 さて、直感的には、子の労働力の市場価値を越えるくらいの現金を給付すれば、問題は解決しそうに思われる。それだけなら、訳者の言う通り、絶対計算など使う必要はなかったかもしれない。しかしプログレッサの考案者たちは、もっと別のことも考えたのだ。「予算はできる限り抑えたい」「給付金が、確実に子供たちのために使われることを、保証したい」。これによって、プログレッサの実施条件は、次のようになった： 現金支給額は、子供の労働力の市場価値の、約3分の2 支給を受けるには、各種の健康診断を受けなければならない 支給を受けられるのは母親のみ ここまで来れば、もはや成功が明らかな政策とは、言えないだろう。仮に成功したとしても、確かにこの政策のお陰だったと断言するのは、難しいだろう。だからこそ、まず無作為抽出テストを行って有効性を明らかにしたことには、大きな意味があったのだ。もちろん、それが次の政権への引き継ぎにも大きな役割を果たしたことは、本文にある通りだ。 まとめると、プログレッサには、貧困の継承を断ち切るという、明確な目標があった。登校率や各種の健康指標という、客観的に成果を測るための指標もあった。無作為抽出テストで有効性が示されてから全国規模に拡大するという、慎重な導入プロセスをも踏んでいた。それをバラマキではないかと言うのは、流石に違うだろう。]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.amazon.co.jp/%E3%81%9D%E3%81%AE%E6%95%B0%E5%AD%A6%E3%81%8C%E6%88%A6%E7%95%A5%E3%82%92%E6%B1%BA%E3%82%81%E3%82%8B-%E6%96%87%E6%98%A5%E6%96%87%E5%BA%AB-%E3%82%A4%E3%82%A2%E3%83%B3-%E3%82%A8%E3%82%A2%E3%83%BC%E3%82%BA/dp/416765170X%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D416765170X"><img class="alignleft" src="http://ecx.images-amazon.com/images/I/61yG%2Bpm157L._SL160_.jpg" alt="" width="110" height="160" /></a></p>
<p>本書は、統計分析の活躍を語る本である。特に、様々な意思決定に用いられる統計分析を「絶対計算」と呼んで、それらがどれだけ多くの分野で、どれだけ大きな成功を収めてきたかを、実に誇らしげに語っている。何しろ著者自身が、第一級の”絶対計算家”の一人なのだ。その強い自負と責任感が、文の調子からも伝わってくる。</p>
<p>絶対計算の台頭によって、人間の経験や知識や直感、そしてそれらを売りにしていた専門家たちは、意思決定プロセスの現場から弾き出されてしまった（あるいは、弾き出されつつある）。本書は、専門家たちに対する、絶対計算の優位性を、これでもかというくらいに語る。その様は爽快ではあるし、頭では正しいと理解できるけれども、やっぱり、空恐ろしさを感じずにはいられない。なぜなら、ごく普通の意味での「意思決定」とは、「自分の経験や知識や直感をもとに、専門家の意見も聞いて、自分で何かを決定すること」に他ならないからだ。</p>
<p><em>私は今、この本の感想をiPhoneで書いている。多くの人に読んで欲しいと思って、文章を推敲している。あなたはこの感想を読んでいる。きっと、何か有益な情報が欲しいと思って読んでくれているのだと思う。しかし私たちの行動は、ともに目的に対してベストではない。より適切な行動は、統計分析が知っている。</em></p>
<p>人間の直感に基づく意思決定は、全く当てにならない。本書にはそんな事例が、山ほど出てくる。「でも、絶対計算の結果を専門家の代わりに利用すれば、より良い判断ができるってことでしょう？」という、”直感的な”期待すら裏切られる。ほとんどの場合、何も考えずに、ただ統計分析に従った方が正しい。</p>
<p>しかし本書は、人間の直感の価値を否定する本ではない。例えばワインの事例。どのような気象条件が揃えばブドウが美味しくなるのかは、昔から経験的に知られていた。その背景にあったのは、ごく自然な、直感に基づく推論だ：「夏の気温が高ければ、実が良く熟して酸味が抜ける。雨が少なければ、果汁が実の中で濃縮される」。著者らが行った無線式車両盗難防止装置の調査も、”根拠に基づく医療”を掲げるバーウィックの根拠も、本書のその他あらゆる事例も、そうした例に加えていいだろう。みんな始まりは、ありきたりな直感からなのだ。</p>
<p>だから絶対計算とは、人間の直感にとっては、いわば淘汰圧のようなものだ。淘汰圧がなかった頃は、どんな役に立たない直感も、生き延びることができた。たまたま最初の事例で偏りがあったとか、言い出した人が業界の権威だったとか、全くの誤解だけど理屈だけはもっともらしいとか……いずれにせよ、誰にも間違いを証明することはできなかったから、根拠がないままに信じられていた。そこに絶対計算が登場した。誰にでも分かる形で、直感の本当の価値が示されるようになった。価値のない直感は淘汰された。そして真に価値ある直感、絶対計算という淘汰の力をも利用する直感だけが、生き延びて大きな繁栄を謳歌するようになった。その繁栄の規模は、かつては考えられなかったほどに巨大だ。</p>
<p>無論、この淘汰の圧力は、今後も強まり続けるだろう。コンピュータの処理能力はますます上がり、より多くのデータを、さらに短時間で解析できるようになっていく。人生の多くの意思決定が、誰かの絶対計算の結果によって覆い尽くされていくのだ。そんな世界では、絶対計算家ではない一般の人たちも、統計の基礎的な素養を身につけなければならない。それは不当な扱いから身を守るためであり、同時に自らがチャンスを掴むためでもある。その手始めとして、誰もが使える統計の武器である「2SDルール」と「ベイズ理論」を紹介して、本書は締めくくられる。</p>
<h3>補足：プログレッサ計画はバラマキか？</h3>
<p>本書の文庫版には追加の訳者付記があって、そこで翻訳者の山形浩生氏が、3章に登場する「プログレッサ計画」に対し、「バラマキ政策ではないのか」と疑問を投げかけている。</p>
<blockquote>
<p>要するに、子供が学校に通ったらお金を（それも通常賃金の三分の二というかなりの金額を）あげるという代物だ。所得水準でいえば、日本で小学生に、月に十万円あげるから学校に行こう、と言うに等しい。（略）それだけのお金をあげれば、就学率が上がったり、学校をやめる子が減ったりするのは当然だ。</p></blockquote>
<blockquote>
<p>だがこのプロジェクトの中身を考えると、本当に絶対計算を使う必要があったのだろうか？（略）そしてこれは実は（日本の子供手当など問題にならないくらいすごい）ばらまき政策ではないのか？</p></blockquote>
<p>これはあんまりな誤読だと思うから、要点を論じておこう。以下の議論は、あくまで本文に何と書いてあるかについての議論であって、現実のプログレッサ計画がどんなものだったかとは関係ない。</p>
<p>プログレッサとは、<strong>子供の労働力の市場価値</strong>に応じて、<strong>親に</strong>現金を給付する政策だ。本当に貧しい家庭では、親が幼い子供を働きに出す。親が子供の未来を犠牲にしてしまうのだ。それを防ぐための政策が、プログレッサである。この時点で「日本で小学生に10万円」とは全く違う話だ。</p>
<p>さて、直感的には、子の労働力の市場価値を越えるくらいの現金を給付すれば、問題は解決しそうに思われる。それだけなら、訳者の言う通り、絶対計算など使う必要はなかったかもしれない。しかしプログレッサの考案者たちは、もっと別のことも考えたのだ。「予算はできる限り抑えたい」「給付金が、確実に子供たちのために使われることを、保証したい」。これによって、プログレッサの実施条件は、次のようになった：</p>
<ul>
	<li>現金支給額は、子供の労働力の市場価値の、約3分の2</li>
	<li>支給を受けるには、各種の健康診断を受けなければならない</li>
	<li>支給を受けられるのは母親のみ</li>
</ul>
<p>ここまで来れば、もはや成功が明らかな政策とは、言えないだろう。仮に成功したとしても、確かにこの政策のお陰だったと断言するのは、難しいだろう。だからこそ、まず無作為抽出テストを行って有効性を明らかにしたことには、大きな意味があったのだ。もちろん、それが次の政権への引き継ぎにも大きな役割を果たしたことは、本文にある通りだ。</p>
<p>まとめると、プログレッサには、貧困の継承を断ち切るという、明確な目標があった。登校率や各種の健康指標という、客観的に成果を測るための指標もあった。無作為抽出テストで有効性が示されてから全国規模に拡大するという、慎重な導入プロセスをも踏んでいた。それをバラマキではないかと言うのは、流石に違うだろう。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2523/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>『さあ、才能に目覚めよう』 レビュー</title>
		<link>http://wp.serpere.info/archives/2488</link>
		<comments>http://wp.serpere.info/archives/2488#comments</comments>
		<pubDate>Sun, 29 Jan 2012 09:50:12 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[読書]]></category>
		<category><![CDATA[勝間塾]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2488</guid>
		<description><![CDATA[書名の&#8221;才能&#8221;は「じぶん」と読む。その&#8221;才能&#8221;の、本書における定義は次の通りだ。 才能とは、無意識に繰り返される思考、感情、行動のパターンである つまり才能それ自体には良し悪しはなく、使い方次第で強みにも弱みにもなる人格的な偏り、ということである。 どんな才能を持っていてどんな才能を持っていないかは（成人の場合は）変えようがないので、持っていない才能にこだわって弱みを克服しようと必死になるよりは、持っている才能を磨いて自らの強みとし、その強みを活かして生きるべきだ、その方が幸せだし企業の生産性も高くなるよ！……というのが本書の基本的な主張である。 さらに著者らの会社では統計分析を基に、この才能を形作る34種類の&#8221;資質&#8221;を見出したと主張する。人はそれぞれ、その中の5つ前後を特に顕著な資質として持ち、その組み合わせと強弱が人によってバラバラなので、才能もまた人それぞれ異なる形を取るのだ、と。 その&#8221;資質&#8221;はストレングス・ファインダーというテストを受けることで実際に確かめることができ、本書を買えば無料で1回受けられる。このテスト目当てで本書を買う人も少なくないだろう。ちなみに私の資質は次の5つだった。 収集心 戦略性 内省 着想 学習欲 こうしたテストは単に「当たってるー！」と喜ぶだけでもそれなりに楽しめるわけだが、真剣に自分の人生を見つめ直す一助として本書を活用するのであれば、2つほど注意すべき点がある。 1つ目。この本自体は基本的に企業のマネージャーに向けた内容になっているということ。ある企業の枠内である人材を最大限活用するには、というのが第一の関心事であり、個々人が（それこそ転身転職を含めた）自分の生き方を再考するというテーマについてはあまり突っ込んだことを語ってくれない。いわゆる自己啓発本を期待していると肩透かしを食うだろう。 2つ目。弱みを克服するより強みを活かすべし、という普遍的な哲学と、著者らが独自に提唱する理論とは分けて考える必要があるということ。特にこれを他人に対する見方にも適用し、良くも悪くもその人に対する先入観として利用するのであれば（それが正式なマネージメントの一環であれ、カジュアルな人間観察であれ）、理論的な根拠にはそれなりに注意を払っておくべきである。 ずばり、この理論は正しいのか。本当に各人に固有で不変な思考感情行動のパターンなるものが存在し、それが著者らの主張するような資質に分解可能なのか。本書における根拠は大きく分けて二つである: 神経細胞の連結構造の一意性と不変性 ギャラップ社が独自に行った200万人分の統計分析 神経細胞の連結回路が加齢とともに減少し、人それぞれ固有のパターンを形成して、一定の年齢以後は変化しなくなるというのは科学的な事実だろう（本当に本当かまでは調べていないが、科学的手法で容易に正否が判断できる類のものなので、著者らを信用することにする）。ただ、その構造が直接、繰り返し現れる変更不能な感情思考行動パターンに対応しており、故にそのパターン=才能も不変である、という部分は多少科学的に飛躍しているのではないかと私には思われる。 またそれが科学的事実だとしても、そのパターンが「34種類の資質に分解でき」「特に顕著な5種類を持つ」ということ、そしてその資質の具体的な内容については、あくまでこの会社独自の主張である。ギャラップ社がその主張をベースにしてコンサルタント業を営む会社だということも忘れるべきではないだろう。 もちろん、この本で説明されている各資質の説明を読み、実際に自分でストレングス・ファインダーを受けて結果を見、自分の経験則に照らして考えれば、かなりな程度&#8221;正しそう&#8221;には感じられると思う（個人的には自分の分析結果も含め、大いに納得できる点は多い）。しかし単に確からしさだけを問題にするなら、血液型占いにすら信憑性は宿るのだ。 こうした点を踏まえれば、34の資質だとか5つの強みだとかの具体的な内容にあまり捉われすぎるのは得策ではないだろう。本書で解説されている内容およびストレングス・ファインダーで示された結果は、むしろ日々の実践の中で自らの本当の才能――無意識に繰り返される思考、感情、行動のパターンに目を向けるための補助線として活用すべきものだ。ストレングス・ファインダーの分かりやすさについ目が行きがちだが、それこそが才能を見つける王道であると本書にもある（第3章）。 そしてまた、理論面での精確な根拠はさておくにしても、著者らが主張する哲学の面に関しては、自分の生き方や働き方、他人との関わり方を見つめ直すための一種の「問いかけ」として、誰にとっても役に立つものと思う： 自分に向いていないこと、弱みを克服しようともがき苦しむよりは、強みに目を向けてそれを伸ばしていく生き方の方が幸福になれるのではないか 自分にできないことを率直に認め、他人と協力し合うべきではないのか 理解不能な他人の言動にただ腹を立てるよりは、表裏一体の長所に気を向けるべきではないか]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.amazon.co.jp/%E3%81%95%E3%81%82%E3%80%81%E6%89%8D%E8%83%BD-%E3%81%98%E3%81%B6%E3%82%93-%E3%81%AB%E7%9B%AE%E8%A6%9A%E3%82%81%E3%82%88%E3%81%86%E2%80%95%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE5%E3%81%A4%E3%81%AE%E5%BC%B7%E3%81%BF%E3%82%92%E8%A6%8B%E5%87%BA%E3%81%97%E3%80%81%E6%B4%BB%E3%81%8B%E3%81%99-%E3%83%9E%E3%83%BC%E3%82%AB%E3%82%B9-%E3%83%90%E3%83%83%E3%82%AD%E3%83%B3%E3%82%AC%E3%83%A0/dp/4532149479%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4532149479"><img class="alignleft" src="http://ecx.images-amazon.com/images/I/51A7ZKPW20L._SL160_.jpg" alt="" width="111" height="160" style="border:1px #666 solid" /></a></p>
<p>書名の&#8221;才能&#8221;は「じぶん」と読む。その&#8221;才能&#8221;の、本書における定義は次の通りだ。</p>
<p><strong> 才能とは、無意識に繰り返される思考、感情、行動のパターンである </strong></p>
<p>つまり才能それ自体には良し悪しはなく、使い方次第で強みにも弱みにもなる人格的な偏り、ということである。</p>
<p>どんな才能を持っていてどんな才能を持っていないかは（成人の場合は）変えようがないので、持っていない才能にこだわって弱みを克服しようと必死になるよりは、持っている才能を磨いて自らの強みとし、その強みを活かして生きるべきだ、その方が幸せだし企業の生産性も高くなるよ！……というのが本書の基本的な主張である。</p>
<p>さらに著者らの会社では統計分析を基に、この才能を形作る34種類の&#8221;資質&#8221;を見出したと主張する。人はそれぞれ、その中の5つ前後を特に顕著な資質として持ち、その組み合わせと強弱が人によってバラバラなので、才能もまた人それぞれ異なる形を取るのだ、と。</p>
<p>その&#8221;資質&#8221;は<a target="_blank" href="http://sf1.strengthsfinder.com/ja-jp/homepage.aspx">ストレングス・ファインダー</a>というテストを受けることで実際に確かめることができ、本書を買えば無料で1回受けられる。このテスト目当てで本書を買う人も少なくないだろう。ちなみに私の資質は次の5つだった。</p>
<ol>
	<li>収集心</li>
	<li>戦略性</li>
	<li>内省</li>
	<li>着想</li>
	<li>学習欲</li>
</ol>
<p>こうしたテストは単に「当たってるー！」と喜ぶだけでもそれなりに楽しめるわけだが、真剣に自分の人生を見つめ直す一助として本書を活用するのであれば、2つほど注意すべき点がある。</p>
<p><strong>1つ目</strong>。この本自体は基本的に企業のマネージャーに向けた内容になっているということ。ある企業の枠内である人材を最大限活用するには、というのが第一の関心事であり、個々人が（それこそ転身転職を含めた）自分の生き方を再考するというテーマについてはあまり突っ込んだことを語ってくれない。いわゆる自己啓発本を期待していると肩透かしを食うだろう。</p>
<p><strong>2つ目</strong>。弱みを克服するより強みを活かすべし、という普遍的な哲学と、著者らが独自に提唱する理論とは分けて考える必要があるということ。特にこれを他人に対する見方にも適用し、良くも悪くもその人に対する先入観として利用するのであれば（それが正式なマネージメントの一環であれ、カジュアルな人間観察であれ）、理論的な根拠にはそれなりに注意を払っておくべきである。</p>
<p>ずばり、この理論は正しいのか。本当に各人に固有で不変な思考感情行動のパターンなるものが存在し、それが著者らの主張するような資質に分解可能なのか。本書における根拠は大きく分けて二つである:</p>
<ul>
	<li>神経細胞の連結構造の一意性と不変性</li>
	<li>ギャラップ社が独自に行った200万人分の統計分析</li>
</ul>
<p>神経細胞の連結回路が加齢とともに減少し、人それぞれ固有のパターンを形成して、一定の年齢以後は変化しなくなるというのは科学的な事実だろう（本当に本当かまでは調べていないが、科学的手法で容易に正否が判断できる類のものなので、著者らを信用することにする）。ただ、その構造が直接、繰り返し現れる変更不能な感情思考行動パターンに対応しており、故にそのパターン=才能も不変である、という部分は多少科学的に飛躍しているのではないかと私には思われる。</p>
<p>またそれが科学的事実だとしても、そのパターンが「34種類の資質に分解でき」「特に顕著な5種類を持つ」ということ、そしてその資質の具体的な内容については、あくまでこの会社独自の主張である。ギャラップ社がその主張をベースにしてコンサルタント業を営む会社だということも忘れるべきではないだろう。</p>
<p>もちろん、この本で説明されている各資質の説明を読み、実際に自分でストレングス・ファインダーを受けて結果を見、自分の経験則に照らして考えれば、かなりな程度&#8221;正しそう&#8221;には感じられると思う（個人的には自分の分析結果も含め、大いに納得できる点は多い）。しかし単に確からしさだけを問題にするなら、血液型占いにすら信憑性は宿るのだ。</p>
<p>こうした点を踏まえれば、34の資質だとか5つの強みだとかの具体的な内容にあまり捉われすぎるのは得策ではないだろう。本書で解説されている内容およびストレングス・ファインダーで示された結果は、むしろ日々の実践の中で自らの本当の才能――無意識に繰り返される思考、感情、行動のパターンに目を向けるための補助線として活用すべきものだ。ストレングス・ファインダーの分かりやすさについ目が行きがちだが、それこそが才能を見つける王道であると本書にもある（第3章）。</p>
<p>そしてまた、理論面での精確な根拠はさておくにしても、著者らが主張する哲学の面に関しては、自分の生き方や働き方、他人との関わり方を見つめ直すための一種の「問いかけ」として、誰にとっても役に立つものと思う：</p>
<ul>
	<li>自分に向いていないこと、弱みを克服しようともがき苦しむよりは、強みに目を向けてそれを伸ばしていく生き方の方が幸福になれるのではないか</li>
	<li>自分にできないことを率直に認め、他人と協力し合うべきではないのか</li>
	<li>理解不能な他人の言動にただ腹を立てるよりは、表裏一体の長所に気を向けるべきではないか</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2488/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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[
<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[
<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[
<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[
<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>OmniFocusによるGTDの実践2 〜OmniFocusを使い始める</title>
		<link>http://wp.serpere.info/archives/2388</link>
		<comments>http://wp.serpere.info/archives/2388#comments</comments>
		<pubDate>Mon, 07 Nov 2011 15:30:10 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[GTD]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2388</guid>
		<description><![CDATA[前回の続き。 GTD本を読んで、OmniFocusを買ったら、いよいよGTDの実践。今回のテーマは実践にあたっての心構えと、OmniFocusへの向き合い方。 全ては行動するためにある まずGTDの全ては行動するためにあるという大原則を忘れないこと。決して整理分類マニアになってはいけない。GTDもOmniFocusも「気になること」を行動に移すための手段に過ぎない。もしうまく行動に移せていないと感じたら、躊躇わず自分のやり方を見直そう。 OmniFocus一つで全てをまかなおうとしてはいけない OmniFocusはGTDを念頭に作られた、非常に多機能なソフトだが、決して万能ではない。これ一つで全てをまかなおうとはしないこと。例えば以下のような用途には使えない: カレンダー/スケジューラ 大量の資料の整理・保存 「旅行に持っていくもの一覧」のようなリスト こういった用途には別のアプリ（もしくはアナログなリスト）を使うべきである。GTDは複数の異なるリストを使い分けることを前提としているので、全てを一箇所で管理する必要はない。 OmniFocusの機能とGTD本の関係 OmniFocusではGTD本に出てくる概念を多少アレンジしているので、 本に登場する各種リストと、OmniFocusの機能は完全には一致しない。本に従ってGTDを実践するなら、この差異をうまく埋める必要がある。 以下に対応関係の例を示す。あくまで私が考えた対応関係なので、他にもあり得ると思う。 （GTD本の概念） （OmniFocusの機能） Inbox Inbox 行動 アクション プロジェクトリスト 「プロジェクト」パースペクティブ プロジェクトの参考情報 アクション/プロジェクトのノート、写真メモ、音声メモ OmniFocus以外のアプリ（Evernote等） カレンダー 日付を設定したアクション/プロジェクト OmniFocus以外のアプリ（カレンダー等） 次にとるべき行動リスト 「コンテキスト」パースペクティブ 連絡待ちリスト 「連絡待ち」コンテキスト 資料 OmniFocus以外のアプリ（Evernote,Dropbox等） いつかやる・多分やるリスト 「いつかやる・多分やる」プロジェクト 備忘録ファイル 日付を設定したアクション/プロジェクト。 この分類に従うなら、OmniFocus を買って最初にやることは コンテキスト「連絡待ち 」を追加 プロジェクト「いつかやる、多分やる」を追加 この2つになる。 「連絡待ち」「いつかやる・多分やる」について 次回以降に詳しく説明する予定。 OmniFocus は誰にも見せない 最後に、とても大切なこと。OmniFocusは誰にも見せてはいけない。 昨今は何でも共有するのが流行りだが、OmniFocusは誰にも見せないものだと常に意識しよう。他人の目を気にするとつい格好つけて、本当は大してやりたくないことを入れてしまったり、本当はやりたいんだけどみっともなような気がするアレやソレを省いてしまったりする。それではGTD本で言う「水のように澄んだ心」にはなれない。 GTDで扱うのは気になること全て。どんなに大それた野望も、ちょっと公にはしたくないような望みも、全てを集めよう。 続きます。]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576082116%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4576082116"><img class="alignleft" src="http://ecx.images-amazon.com/images/I/51umAMmeSlL._SL160_.jpg" alt="はじめてのGTD ストレスフリーの整理術" width="112" height="160" /></a></p>
<p>
<a href="http://wp.serpere.info/archives/2356">前回</a>の続き。
</p>
<p>
<a href="http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576082116%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4576082116">GTD本</a>を読んで、<a href="http://itunes.apple.com/jp/app/omnifocus-for-iphone/id284885288?mt=8" target="_blank">OmniFocus</a>を買ったら、いよいよGTDの実践。今回のテーマは実践にあたっての心構えと、OmniFocusへの向き合い方。
</p>
<h3 style="clear:left;">全ては行動するためにある</h3>
<p>
まず<strong>GTDの全ては行動するためにある</strong>という大原則を忘れないこと。決して整理分類マニアになってはいけない。GTDもOmniFocusも「気になること」を行動に移すための手段に過ぎない。もしうまく行動に移せていないと感じたら、躊躇わず自分のやり方を見直そう。
</p>
<h3>OmniFocus一つで全てをまかなおうとしてはいけない</h3>
<p>
 OmniFocusはGTDを念頭に作られた、非常に多機能なソフトだが、決して万能ではない。これ一つで全てをまかなおうとはしないこと。例えば以下のような用途には使えない:
</p>
<ul>
<li>カレンダー/スケジューラ</li>
<li>大量の資料の整理・保存</li>
<li>「旅行に持っていくもの一覧」のようなリスト</li>
</ul>
<p>
こういった用途には別のアプリ（もしくはアナログなリスト）を使うべきである。GTDは複数の異なるリストを使い分けることを前提としているので、全てを一箇所で管理する必要はない。
</p>
<h3>OmniFocusの機能とGTD本の関係</h3>
<p>
OmniFocusではGTD本に出てくる概念を多少アレンジしているので、 本に登場する各種リストと、OmniFocusの機能は完全には一致しない。本に従ってGTDを実践するなら、この差異をうまく埋める必要がある。
</p>
<p>
以下に対応関係の例を示す。あくまで私が考えた対応関係なので、他にもあり得ると思う。
</p>
<table>
<thead>
<th>（GTD本の概念）</th>
<td>（OmniFocusの機能）</td>
</thead>
<tbody>
<tr>
<th>Inbox</th>
<td>Inbox</td>
</tr>
<tr>
<th>行動</th>
<td>アクション</td>
</tr>
<tr>
<th>プロジェクトリスト</th>
<td>「プロジェクト」パースペクティブ</td>
</tr>
<tr>
<th rowspan="2">プロジェクトの参考情報</th>
<td>アクション/プロジェクトのノート、写真メモ、音声メモ</td>
</tr>
<tr>
<td>OmniFocus以外のアプリ（Evernote等）</td>
</tr>
<tr>
<th rowspan="2">カレンダー</th>
<td>日付を設定したアクション/プロジェクト</td>
</tr>
<tr>
<td>OmniFocus以外のアプリ（カレンダー等）</td>
</tr>
<tr>
<th>次にとるべき行動リスト</th>
<td>「コンテキスト」パースペクティブ</td>
</tr>
<tr>
<th>連絡待ちリスト</th>
<td>「連絡待ち」コンテキスト</td>
</tr>
<tr>
<th>資料</th>
<td>OmniFocus以外のアプリ（Evernote,Dropbox等）</td>
</tr>
<tr>
<th>いつかやる・多分やるリスト</th>
<td>「いつかやる・多分やる」プロジェクト</td>
</tr>
<tr>
<th>備忘録ファイル</th>
<td>日付を設定したアクション/プロジェクト。</td>
</tr>
</tbody>
</table>

<p>
この分類に従うなら、OmniFocus を買って最初にやることは
</p>
<ul>
<li>コンテキスト「連絡待ち 」を追加</li>
<li>プロジェクト「いつかやる、多分やる」を追加</li>
 </ul>
<p>
この2つになる。
</p>
<h3>「連絡待ち」「いつかやる・多分やる」について</h3>
<p>
次回以降に詳しく説明する予定。
</p>
<h3>OmniFocus は誰にも見せない</h3>
<p>
最後に、とても大切なこと。OmniFocusは誰にも見せてはいけない。
</p>
<p>
昨今は何でも共有するのが流行りだが、OmniFocusは誰にも見せないものだと常に意識しよう。他人の目を気にするとつい格好つけて、本当は大してやりたくないことを入れてしまったり、本当はやりたいんだけどみっともなような気がするアレやソレを省いてしまったりする。それではGTD本で言う「水のように澄んだ心」にはなれない。
</p>
<p>
GTDで扱うのは気になること全て。どんなに大それた野望も、ちょっと公にはしたくないような望みも、全てを集めよう。
</p>
<p>
続きます。
</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2388/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OmniFocusによるGTDの実践1 〜GTDを始める</title>
		<link>http://wp.serpere.info/archives/2356</link>
		<comments>http://wp.serpere.info/archives/2356#comments</comments>
		<pubDate>Fri, 04 Nov 2011 15:41:32 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[GTD]]></category>
		<category><![CDATA[OmniFocus]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=2356</guid>
		<description><![CDATA[OmniFocusを使ったGTDを始めて1年近くが経った。自分なりに使いこなすコツが集まってきたので、ブログにまとめていこうと思う。これからGTDを始める方、OmniFocusを買おうか迷っている方、OmniFocusのより良い使い方を探している方などの参考になれば幸い。 最初はなるべく大きな話題、基本的な話題から始めて、徐々に細かい使い方の話に移っていく予定。 OmniFocusまたはその他の専用アプリを買うべき？ まずGTDを始めるにあたって、OmniFocusなど専用アプリを買うべきか？結論からいえば、絶対に買うべき。根拠は二つ。 GTDは、まともに取り組もうとすれば、かなり複雑な方法論である GTDの本質は習慣付けや精神論ではなく、システムを構築して運用することである GTDが複雑であることは否定し難い。GTDでは役割の違う「リスト」を何種類も使い分けて、それぞれを適切に運用して、しかも全体を秩序だったシステムとして維持していかなければならない。各リスト間の整合性を保つ作業などは、典型的な「人間には難しいが、コンピュータには易しい」仕事だ。スマホ全盛のこの世の中で、手元のコンピュータ資源を活用しない手はない。 実際、GTDの原著ではこの「リスト」を作るのにアナログなツールを使うことを基本の想定としているため、デスクの再構築までがセットになっている。それこそGTD本の著者デビッド・アレンさんをコンサルとして雇うならともかく、普通の人はいきなりそこまでやりたくはないというか、できないだろう。 それにGTDとは本質的にシステムの運用論であり、テクニックである。だから「形から入る」ことに罪悪感を覚える必要はない。形を作って維持するのがGTDなのだから、出来合い品を買って使い方を覚えれば、それで十分機能する。 逆にいうと、GTDのコツと使っているアプリの使い方のコツとはほとんど不可分になる。私はOmniFocusを使っているので、 このブログに書く内容もOmniFocusの使用を前提としている。 どのOmniFocusを買うべき？ OmniFocusにはMac版、iPhone版、iPad版がある。いつでもどこでも使えるという意味でiPhone版は必須、あとは個人の好みだろう(私はMac版も持っている)。このブログでもiPhone版をメインにまとめていく。 原著Getting Things Done（邦訳『ストレスフリーの仕事術』）は読むべき？ もちろん読むべきだが、はっきり言ってわかりにくい本だということは覚悟した方がいい。この本は体系だった方法論を説明するというより、著者が自分のクライアントに対する時の説明の手順をそのままなぞっているようなところがある。 私がこうやってブログにまとめようと思ったのも、本の内容がわかりにくくて、自分なりに体系付けたいと思ったからだ。だからGTDの本に書いてある内容と重複する内容も多くなると思う。 続き: OmniFocusを使い始める]]></description>
			<content:encoded><![CDATA[
<p><a href="http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576082116%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4576082116"><img class="alignleft" src="http://ecx.images-amazon.com/images/I/51umAMmeSlL._SL160_.jpg" alt="はじめてのGTD ストレスフリーの整理術" width="112" height="160" /></a></p>
<p><a href="http://click.linksynergy.com/fs-bin/click?id=ZvcGVa/PJnw&#038;subid=0&#038;offerid=94348.1&#038;type=10&#038;tmpid=3910&#038;RD_PARM0=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-iphone%2Fid284885288%3Fmt%3D8%2526uo%3D4&#038;RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-iphone%2Fid284885288%3Fmt%3D8%2526uo%3D4" rel="nofollow" target="_blank">OmniFocus</a>を使ったGTDを始めて1年近くが経った。自分なりに使いこなすコツが集まってきたので、ブログにまとめていこうと思う。これからGTDを始める方、OmniFocusを買おうか迷っている方、OmniFocusのより良い使い方を探している方などの参考になれば幸い。</p>
<p>最初はなるべく大きな話題、基本的な話題から始めて、徐々に細かい使い方の話に移っていく予定。</p>
<h3 style="clear:left;">OmniFocusまたはその他の専用アプリを買うべき？</h3>
<p>まずGTDを始めるにあたって、OmniFocusなど専用アプリを買うべきか？結論からいえば、絶対に買うべき。根拠は二つ。</p>
<ul>
	<li>GTDは、まともに取り組もうとすれば、かなり複雑な方法論である</li>
	<li>GTDの本質は習慣付けや精神論ではなく、システムを構築して運用することである</li>
</ul>
<p>GTDが複雑であることは否定し難い。GTDでは役割の違う「リスト」を何種類も使い分けて、それぞれを適切に運用して、しかも全体を秩序だったシステムとして維持していかなければならない。各リスト間の整合性を保つ作業などは、典型的な「人間には難しいが、コンピュータには易しい」仕事だ。スマホ全盛のこの世の中で、手元のコンピュータ資源を活用しない手はない。</p>
<p>実際、GTDの原著ではこの「リスト」を作るのにアナログなツールを使うことを基本の想定としているため、デスクの再構築までがセットになっている。それこそGTD本の著者デビッド・アレンさんをコンサルとして雇うならともかく、普通の人はいきなりそこまでやりたくはないというか、できないだろう。</p>
<p>それにGTDとは本質的にシステムの運用論であり、テクニックである。だから「形から入る」ことに罪悪感を覚える必要はない。形を作って維持するのがGTDなのだから、出来合い品を買って使い方を覚えれば、それで十分機能する。</p>
<p>逆にいうと、GTDのコツと使っているアプリの使い方のコツとはほとんど不可分になる。私はOmniFocusを使っているので、 このブログに書く内容もOmniFocusの使用を前提としている。</p>
<h3>どのOmniFocusを買うべき？</h3>
<p>OmniFocusには<a href="http://click.linksynergy.com/fs-bin/click?id=ZvcGVa/PJnw&#038;subid=0&#038;offerid=94348.1&#038;type=10&#038;tmpid=3910&#038;RD_PARM0=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus%2Fid402835630%3Fmt%3D12%2526uo%3D4&#038;RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus%2Fid402835630%3Fmt%3D12%2526uo%3D4" rel="nofollow" target="_blank">Mac版</a>、<a href="http://click.linksynergy.com/fs-bin/click?id=ZvcGVa/PJnw&#038;subid=0&#038;offerid=94348.1&#038;type=10&#038;tmpid=3910&#038;RD_PARM0=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-iphone%2Fid284885288%3Fmt%3D8%2526uo%3D4&#038;RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-iphone%2Fid284885288%3Fmt%3D8%2526uo%3D4" rel="nofollow" target="_blank">iPhone版</a>、<a href="http://click.linksynergy.com/fs-bin/click?id=ZvcGVa/PJnw&#038;subid=0&#038;offerid=94348.1&#038;type=10&#038;tmpid=3910&#038;RD_PARM0=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-ipad%2Fid383804552%3Fmt%3D8%2526uo%3D4&#038;RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fomnifocus-for-ipad%2Fid383804552%3Fmt%3D8%2526uo%3D4" rel="nofollow" target="_blank">iPad版</a>がある。いつでもどこでも使えるという意味でiPhone版は必須、あとは個人の好みだろう(私はMac版も持っている)。このブログでもiPhone版をメインにまとめていく。</p>
<h3>原著Getting Things Done（邦訳『<a href="http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AEGTD-%E3%82%B9%E3%83%88%E3%83%AC%E3%82%B9%E3%83%95%E3%83%AA%E3%83%BC%E3%81%AE%E6%95%B4%E7%90%86%E8%A1%93-%E3%83%87%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%82%A2%E3%83%AC%E3%83%B3/dp/4576082116%3FSubscriptionId%3DAKIAJUX5XJO3NQFNQ4TQ%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4576082116">ストレスフリーの仕事術</a>』）は読むべき？</h3>
<p>もちろん読むべきだが、はっきり言ってわかりにくい本だということは覚悟した方がいい。この本は体系だった方法論を説明するというより、著者が自分のクライアントに対する時の説明の手順をそのままなぞっているようなところがある。</p>
<p>私がこうやってブログにまとめようと思ったのも、本の内容がわかりにくくて、自分なりに体系付けたいと思ったからだ。だからGTDの本に書いてある内容と重複する内容も多くなると思う。</p>
<p>
続き: <a href="http://wp.serpere.info/archives/2388">OmniFocusを使い始める</a>
</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/2356/feed</wfw:commentRss>
		<slash:comments>1</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[
<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[
<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>
	</channel>
</rss>

