<?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>touch the world!</title>
	<atom:link href="http://touch.hogelab.net/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://touch.hogelab.net/blog</link>
	<description>結局いつもの有象無象</description>
	<lastBuildDate>Sat, 24 Dec 2011 16:14:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>適性検査</title>
		<link>http://touch.hogelab.net/blog/?p=277</link>
		<comments>http://touch.hogelab.net/blog/?p=277#comments</comments>
		<pubDate>Thu, 22 Jul 2010 03:00:27 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[アイデアノート]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=277</guid>
		<description><![CDATA[○とか□とかをいっぱい描かせる 個数、正確さを評価 ひとまずメモ]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D277"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D277&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>○とか□とかをいっぱい描かせる<br />
個数、正確さを評価<br />
ひとまずメモ</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=277</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone OS での遅延呼び出し</title>
		<link>http://touch.hogelab.net/blog/?p=275</link>
		<comments>http://touch.hogelab.net/blog/?p=275#comments</comments>
		<pubDate>Sat, 05 Jun 2010 16:43:19 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=275</guid>
		<description><![CDATA[NSNetServiceBrowser で didFindService したときに resolve してはいけない や tableView:didSelectRowAtIndexPath: で insertRowsAtIndexPaths や deleteRowsAtIndexPaths をしてはいけない でハマったように iPhone OS では delegate で凝った処理をすると動かないことがある。 そんなときに performSelector ほげほげで遅延呼び出しをするわけだがこれにもいくつか方法があって悩ましい （１）performSelectorOnMainThread:withObject:waitUntilDone: 動作はセレクタと引数のオブジェクトをメインスレッドのメッセージキューに積んで実行を待つ or ほっといて続けるよってな感じ メインスレッド実行中に使うのはちょっと憚れる感もあるがリファレンスをつらつら眺めていると「メインスレッドで waitUntilDone に YES で使うと即時実行されるよ」的な記述もあるので想定内と思っていいだろう 内部的にはどんな実装になっているのだろうか。単純に考えれば同期オブジェクトで排他処理をしているキューに積む操作か、まぁそんなにコストはかからなそう。 （２）performSelector:withObject:afterDelay: 動作はセレクタと引数のオブジェクトを afterDelay 後にキューに積むよってな感じ リファレンスには 0 を指定しても即時実行されずにキューに積まれるよって記述があるが、実際のところ内部的に Timer が使われるのか使われないのかはちとわからない また実行をキャンセルできるというメリットもあるが有効な局面はほぼ無いと思う ということでどっちを使うべきかなんだけど自分の好みとしてはやっぱり（１）かな 時間を指定するってのがちょっぴり抵抗があるので しかしより汎用的なのは（２）でしょうね 別 Run Loop で使ったりも可能なので こんな感じでまともな結論も出さずにこのエントリーは終わり 読んでるあなた、他にご意見等あれば是非コメントしてくださいな]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D275"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D275&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://touch.hogelab.net/blog/?p=171">NSNetServiceBrowser で didFindService したときに resolve してはいけない</a> や <a href="http://touch.hogelab.net/blog/?p=177">tableView:didSelectRowAtIndexPath: で insertRowsAtIndexPaths や deleteRowsAtIndexPaths をしてはいけない</a> でハマったように iPhone OS では delegate で凝った処理をすると動かないことがある。<br />
そんなときに performSelector ほげほげで遅延呼び出しをするわけだがこれにもいくつか方法があって悩ましい</p>
<p>（１）performSelectorOnMainThread:withObject:waitUntilDone:<br />
動作はセレクタと引数のオブジェクトをメインスレッドのメッセージキューに積んで実行を待つ or ほっといて続けるよってな感じ<br />
メインスレッド実行中に使うのはちょっと憚れる感もあるがリファレンスをつらつら眺めていると「メインスレッドで waitUntilDone に YES で使うと即時実行されるよ」的な記述もあるので想定内と思っていいだろう<br />
内部的にはどんな実装になっているのだろうか。単純に考えれば同期オブジェクトで排他処理をしているキューに積む操作か、まぁそんなにコストはかからなそう。</p>
<p>（２）performSelector:withObject:afterDelay:<br />
動作はセレクタと引数のオブジェクトを afterDelay 後にキューに積むよってな感じ<br />
リファレンスには 0 を指定しても即時実行されずにキューに積まれるよって記述があるが、実際のところ内部的に Timer が使われるのか使われないのかはちとわからない<br />
また実行をキャンセルできるというメリットもあるが有効な局面はほぼ無いと思う</p>
<p>ということでどっちを使うべきかなんだけど自分の好みとしてはやっぱり（１）かな<br />
時間を指定するってのがちょっぴり抵抗があるので<br />
しかしより汎用的なのは（２）でしょうね<br />
別 Run Loop で使ったりも可能なので</p>
<p>こんな感じでまともな結論も出さずにこのエントリーは終わり<br />
読んでるあなた、他にご意見等あれば是非コメントしてくださいな</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=275</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OS X で OS 9 までのような機能拡張が廃止された理由</title>
		<link>http://touch.hogelab.net/blog/?p=272</link>
		<comments>http://touch.hogelab.net/blog/?p=272#comments</comments>
		<pubDate>Wed, 26 May 2010 05:09:26 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[開発日記]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=272</guid>
		<description><![CDATA[2000年の WWDC に行ったときのことである OS X 概要的なセッションの終わり、質疑応答である参加者がこう聞いた 「OS X で機能拡張はサポートしないの？」 答えはノー Apple のスピーカーはだいたいこんな感じのことを返していた 機能拡張（や類するコントロールパネル）は失敗だった。これらのおかげで本来安定して動作する筈の MacOS が不安定になってしまっている。カーネルエクステンション等のサポートはするがカジュアルな OS ハッキングはサポートしない。 会場では少しだけため息のようなざわめきがあった 私もちょっと残念に思った しかしまぁ本当に素の MacOS が安定していたかはさておき、このような決定に対してとやかくいう筋合いじゃないのは間違いないと思う ちなみに件の質問をした人は Aaron や Kaleidoscope の開発者だったような… ちと記憶が曖昧]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D272"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D272&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>2000年の WWDC に行ったときのことである<br />
OS X 概要的なセッションの終わり、質疑応答である参加者がこう聞いた</p>
<p>「OS X で機能拡張はサポートしないの？」</p>
<p>答えはノー</p>
<p>Apple のスピーカーはだいたいこんな感じのことを返していた</p>
<blockquote><p>機能拡張（や類するコントロールパネル）は失敗だった。これらのおかげで本来安定して動作する筈の MacOS が不安定になってしまっている。カーネルエクステンション等のサポートはするがカジュアルな OS ハッキングはサポートしない。
</p></blockquote>
<p>会場では少しだけため息のようなざわめきがあった<br />
私もちょっと残念に思った<br />
しかしまぁ本当に素の MacOS が安定していたかはさておき、このような決定に対してとやかくいう筋合いじゃないのは間違いないと思う</p>
<p>ちなみに件の質問をした人は Aaron や Kaleidoscope の開発者だったような…<br />
ちと記憶が曖昧</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=272</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORIGAMI 折り方</title>
		<link>http://touch.hogelab.net/blog/?p=270</link>
		<comments>http://touch.hogelab.net/blog/?p=270#comments</comments>
		<pubDate>Thu, 06 May 2010 08:20:44 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[アイデアノート]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=270</guid>
		<description><![CDATA[図解＆実際の動画で折り紙の折り方を解説 で、コンテンツはどうするの？ なんとかなりそうな気がするけどねぇ、無理か]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D270"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D270&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>図解＆実際の動画で折り紙の折り方を解説</p>
<p>で、コンテンツはどうするの？</p>
<p>なんとかなりそうな気がするけどねぇ、無理か</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=270</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BENTO レシピ</title>
		<link>http://touch.hogelab.net/blog/?p=268</link>
		<comments>http://touch.hogelab.net/blog/?p=268#comments</comments>
		<pubDate>Fri, 23 Apr 2010 08:57:43 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[アイデアノート]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=268</guid>
		<description><![CDATA[動画付きならこりゃ売れるぜぇぇぇ コンテンツはどっから？ 糸冬　了]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D268"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D268&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>動画付きならこりゃ売れるぜぇぇぇ</p>
<p>コンテンツはどっから？</p>
<p>糸冬　了</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=268</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dealloc で self.hoge = nil は感心しない</title>
		<link>http://touch.hogelab.net/blog/?p=265</link>
		<comments>http://touch.hogelab.net/blog/?p=265#comments</comments>
		<pubDate>Fri, 02 Apr 2010 17:01:10 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[開発日記]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=265</guid>
		<description><![CDATA[少し前のことなんでびたいち記憶があやふやなんだけど自分の TL に「dealloc で self.hoge = nil と書こうぜ」のような内容のブログ？が流れてた その場で指摘しようととも思ったんだけど follow, follower でなかった（たぶん）のでひとまずスルーしてた 最近、ちょくちょくブログを書いてるついでにこのことにも触れておこうと思う 予め予告しておくとともすれば物事を行儀で語る老害ウゼーな話になるかもしれない その元記事を（覚えてる限り）要約する dealloc を書くときにあるメンバ hoge の後始末を [hoge release] とするよりは self.hoge = nil にしたほうが安全じゃん @property で assign にしようが retain にしようが途中で変えようが dealloc のコードをいぢらないで済むしね たしか、こんな内容だ しかし dealloc はオブジェクトが始末されるときに走るコードなので後始末はなるたけ&#8221;シンプル&#8221;かつ&#8221;他に依存&#8221;しないように書くべきだと思う 提唱された self.hoge = nil は実際には&#8221;setter メソッドの呼び出し&#8221;なので setter で複雑だったり他に依存（他メンバを参照したりとか）するようなコードが書かれているかもしれない たとえ現状そうでなくても将来書くかもしれないし もちろん getter, setter は&#8221;絶対に自分では記述しない&#8221;とかの縛りをいれればこれでも問題ないのかもしれないが また assign や retain [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D265"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D265&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>少し前のことなんでびたいち記憶があやふやなんだけど自分の TL に「dealloc で self.hoge = nil と書こうぜ」のような内容のブログ？が流れてた<br />
その場で指摘しようととも思ったんだけど follow, follower でなかった（たぶん）のでひとまずスルーしてた<br />
最近、ちょくちょくブログを書いてるついでにこのことにも触れておこうと思う<br />
予め予告しておくとともすれば物事を行儀で語る老害ウゼーな話になるかもしれない</p>
<p><span id="more-265"></span></p>
<p>その元記事を（覚えてる限り）要約する<br />
dealloc を書くときにあるメンバ hoge の後始末を [hoge release] とするよりは self.hoge = nil にしたほうが安全じゃん<br />
@property で assign にしようが retain にしようが途中で変えようが dealloc のコードをいぢらないで済むしね<br />
たしか、こんな内容だ</p>
<p>しかし dealloc はオブジェクトが始末されるときに走るコードなので後始末はなるたけ&#8221;シンプル&#8221;かつ&#8221;他に依存&#8221;しないように書くべきだと思う<br />
提唱された self.hoge = nil は実際には&#8221;setter メソッドの呼び出し&#8221;なので setter で複雑だったり他に依存（他メンバを参照したりとか）するようなコードが書かれているかもしれない<br />
たとえ現状そうでなくても将来書くかもしれないし<br />
もちろん getter, setter は&#8221;絶対に自分では記述しない&#8221;とかの縛りをいれればこれでも問題ないのかもしれないが</p>
<p>また assign や retain を書き直すケースで安全というところ<br />
私はそんなに Objective-C のコードを書いてるわけでもないので経験不足により不正確な話かもしれないが基本データ型は assign だろうし NSObject 派生のオブジェクトは一部の例外（delegate など）を除いて盲目的に retain にしといたほうが無難じゃなかろうか</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=265</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>autorelease は悪の手先なの？</title>
		<link>http://touch.hogelab.net/blog/?p=260</link>
		<comments>http://touch.hogelab.net/blog/?p=260#comments</comments>
		<pubDate>Wed, 31 Mar 2010 09:06:13 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[開発日記]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=260</guid>
		<description><![CDATA[前エントリー「ぼくのかんがえた autorelease」の続きのようなもの メモリが潤沢な場合における autorelease のデメリットについて考えたとき、まぁたいしたことないんでないの？と思ってるってのが前エントリーだったが、それの延長でメモリが十分に少ない場合を想像してみる ○メモリが断片化しやすくて遅くならね？ 実際に使用されているメモリ管理のアルゴリズムは調べてないがファーストマッチもしくはそれに似た特性を持ったものだとしとく メモリの延べ使用量が同程度ならば確保・開放の間隔が広く使用量のピークが高いほうが断片化しやすい。また断片化することにより確保・開放のコストも線形的に増える てことでこまめに alloc, release する場合に比べて autorelease による遅延 release は確保・開放の間隔が広くなるので&#8221;遅くなりやすい&#8221;ということがいえる しかし ・そもそも autorelease は根絶できなくね？ ・開放タイミングが揃うことにより断片化しづらくなるよね？ ってな側面もある なので感覚的には&#8221;汚れやすい&#8221;けど&#8221;ひどく汚れる&#8221;までにかかる時間はそんなに変わらなそうって感じかなー ここでの&#8221;ひどく汚れる&#8221;は空き領域としては十分にある筈なのにメモリ不足に陥る状態ぐらいに捉えてもらって 余談だがその昔 proxy サーバのようなものに別途メモリ管理機構を組み込んだことがあった 空き領域を一方向の線形リストで持ちファーストマッチで返す簡単なやつで（ここから記憶があやふや）32バイトアライン、不足したら1MBづつ追加するような機構で鬼のようなテキスト処理と DNS などのオンメモリキャッシュを扱ったが2MB程で事足りてたんじゃなかったっけな 閑話休題 なもんで私は「autorelease は遅い」って話から autorelease を闇雲に使わないようにするのはどうなの？って思っちょります alloc, release は短いスコープの中に限るとか結構気を使わないとリークや多重解放を起こしてしまうリスクもあるし しかしながら autorelease マンセー！なのもちょっと メモリ消費の激しいオブジェクトを扱うとか凝った処理をするループの内側とかはあえて alloc, release にするとか、ループの内側の場合は少なくとも AutoreleasePool で挟んどくとか気を使ったほうがいいと思う]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D260"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D260&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>前エントリー<a href="http://touch.hogelab.net/blog/?p=252">「ぼくのかんがえた autorelease」</a>の続きのようなもの</p>
<p>メモリが潤沢な場合における autorelease のデメリットについて考えたとき、まぁたいしたことないんでないの？と思ってるってのが前エントリーだったが、それの延長でメモリが十分に少ない場合を想像してみる</p>
<p><span id="more-260"></span></p>
<p>○メモリが断片化しやすくて遅くならね？<br />
実際に使用されているメモリ管理のアルゴリズムは調べてないがファーストマッチもしくはそれに似た特性を持ったものだとしとく<br />
メモリの延べ使用量が同程度ならば確保・開放の間隔が広く使用量のピークが高いほうが断片化しやすい。また断片化することにより確保・開放のコストも線形的に増える<br />
てことでこまめに alloc, release する場合に比べて autorelease による遅延 release は確保・開放の間隔が広くなるので&#8221;遅くなりやすい&#8221;ということがいえる<br />
しかし<br />
・そもそも autorelease は根絶できなくね？<br />
・開放タイミングが揃うことにより断片化しづらくなるよね？<br />
ってな側面もある<br />
なので感覚的には&#8221;汚れやすい&#8221;けど&#8221;ひどく汚れる&#8221;までにかかる時間はそんなに変わらなそうって感じかなー<br />
ここでの&#8221;ひどく汚れる&#8221;は空き領域としては十分にある筈なのにメモリ不足に陥る状態ぐらいに捉えてもらって</p>
<p>余談だがその昔 proxy サーバのようなものに別途メモリ管理機構を組み込んだことがあった<br />
空き領域を一方向の線形リストで持ちファーストマッチで返す簡単なやつで（ここから記憶があやふや）32バイトアライン、不足したら1MBづつ追加するような機構で鬼のようなテキスト処理と DNS などのオンメモリキャッシュを扱ったが2MB程で事足りてたんじゃなかったっけな</p>
<p>閑話休題</p>
<p>なもんで私は「autorelease は遅い」って話から autorelease を闇雲に使わないようにするのはどうなの？って思っちょります<br />
alloc, release は短いスコープの中に限るとか結構気を使わないとリークや多重解放を起こしてしまうリスクもあるし<br />
しかしながら autorelease マンセー！なのもちょっと<br />
メモリ消費の激しいオブジェクトを扱うとか凝った処理をするループの内側とかはあえて alloc, release にするとか、ループの内側の場合は少なくとも AutoreleasePool で挟んどくとか気を使ったほうがいいと思う</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=260</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ぼくのかんがえた autorelease</title>
		<link>http://touch.hogelab.net/blog/?p=252</link>
		<comments>http://touch.hogelab.net/blog/?p=252#comments</comments>
		<pubDate>Fri, 26 Mar 2010 07:19:58 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[開発日記]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=252</guid>
		<description><![CDATA[ここんとこ autorelease は遅いという話を目にするようになってちろっと調べたんだけどリクツについての記述が見つからない。そんな tweet をしたところいくつか反応があって情報交換はできた。結果としては残念ながらしっくりきていないんだけどそもそも自分がどう理解してるかってのも140文字のやりとりのなかでは説明が難しかったのでここに書いておこうと思う ちなみに私は自分の書いたコードを見られるのは性癖を知られるくらい恥ずかしく感じるタイプで今までソースの公開※とかしたことがない 今回はソースのような体裁をとるがプログラマ同士ならば自分の拙い日本語よりもより正確に通じるだろうという判断、つか願い ※業務上どうしても同僚に見られてしまうが身内には自分のケツの穴だって晒せるくらい心を許すのでほぼ問題ない。また最近は自己研鑽のためにも全世界にケツの穴を晒してこうって覚悟もちらほら 以下、私の理解していることの説明ってことで間違いの指摘などは大歓迎だが&#8221;そうなんだ&#8221;などと鵜呑みにすることのなきよう、くれぐれも まずは autorelease を多用すればメモリ使用量のピークが上がるということについて ピークが上がれば Memory Warning が起こるもしくは頻発する　→　View Controller にぶらさがった View や自分の責任下でパージするオブジェクト等が棄てられる　→　パージしたものが必要になったらまた再構築　→　以下ループ こんなん繰り返したらそら遅いわなって話は&#8221;共通理解&#8221;としておいておいて release に比べて autorelease を使う場合のコスト増がいかほどかってことに的を絞る。言い換えればメモリがふんだんにある環境下でどうなの？ってことだ んで retain, release, autorelease や AutoreleasePool が中でなにやってるかなんだけどソースがあるわけでもないので想像してみるしかない。その結果をコードとして書き下ろした まずは「ぼくのかんがえた NSObject のようなもの」 参照カウント式のオブジェクト管理についてのみ記述してある 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D252"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D252&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>ここんとこ autorelease は遅いという話を目にするようになってちろっと調べたんだけどリクツについての記述が見つからない。そんな tweet をしたところいくつか反応があって情報交換はできた。結果としては残念ながらしっくりきていないんだけどそもそも自分がどう理解してるかってのも140文字のやりとりのなかでは説明が難しかったのでここに書いておこうと思う</p>
<p>ちなみに私は自分の書いたコードを見られるのは性癖を知られるくらい恥ずかしく感じるタイプで今までソースの公開※とかしたことがない<br />
今回はソースのような体裁をとるがプログラマ同士ならば自分の拙い日本語よりもより正確に通じるだろうという判断、つか願い</p>
<p>※業務上どうしても同僚に見られてしまうが身内には自分のケツの穴だって晒せるくらい心を許すのでほぼ問題ない。また最近は自己研鑽のためにも全世界にケツの穴を晒してこうって覚悟もちらほら</p>
<p>以下、私の理解していることの説明ってことで間違いの指摘などは大歓迎だが&#8221;そうなんだ&#8221;などと鵜呑みにすることのなきよう、くれぐれも</p>
<p><span id="more-252"></span></p>
<p>まずは autorelease を多用すればメモリ使用量のピークが上がるということについて<br />
ピークが上がれば Memory Warning が起こるもしくは頻発する　→　View Controller にぶらさがった View や自分の責任下でパージするオブジェクト等が棄てられる　→　パージしたものが必要になったらまた再構築　→　以下ループ</p>
<p>こんなん繰り返したらそら遅いわなって話は&#8221;共通理解&#8221;としておいておいて release に比べて autorelease を使う場合のコスト増がいかほどかってことに的を絞る。言い換えればメモリがふんだんにある環境下でどうなの？ってことだ</p>
<p>んで retain, release, autorelease や AutoreleasePool が中でなにやってるかなんだけどソースがあるわけでもないので想像してみるしかない。その結果をコードとして書き下ろした</p>
<p>まずは「ぼくのかんがえた NSObject のようなもの」<br />
参照カウント式のオブジェクト管理についてのみ記述してある</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//--------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">// MyObject.h</span>
&nbsp;
<span style="color: #a61390;">@interface</span> MyObject <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">int</span>		_retainCount;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">int</span> retainCount;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>retain;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>autorelease;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>release;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">//--------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">// MyObject.m</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> MyObject
&nbsp;
<span style="color: #a61390;">@synthesize</span> retainCount <span style="color: #002200;">=</span> _retainCount;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init <span style="color: #002200;">&#123;</span>
	_retainCount<span style="color: #002200;">++</span>;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>retain <span style="color: #002200;">&#123;</span>
	self.retainCount<span style="color: #002200;">++</span>;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>autorelease <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>MyAutoreleasePool addObject<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>release <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">--</span>self.retainCount &lt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>self dealloc<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>次に「ぼくのかんがえた NSAutoreleasePool のようなもの」<br />
autorelease されるオブジェクトの管理と一応ネスト可能なように記述してある</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//--------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">// MyAutoreleasePool.h</span>
&nbsp;
<span style="color: #a61390;">@interface</span> MyAutoreleasePool <span style="color: #002200;">:</span> MyObject <span style="color: #002200;">&#123;</span>
	MyAutoreleasePool<span style="color: #002200;">*</span> _savedPool;
	<span style="color: #a61390;">id</span><span style="color: #002200;">*</span>		_objectPool;
	<span style="color: #a61390;">int</span>		_objectCount;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> MyAutoreleasePool<span style="color: #002200;">*</span> savedPool;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">id</span><span style="color: #002200;">*</span> objectPool;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>assign<span style="color: #002200;">&#41;</span> <span style="color: #a61390;">int</span> objectCount;
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">//--------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">// MyAutoreleasePool.m</span>
&nbsp;
<span style="color: #a61390;">static</span> MyAutoreleasePool<span style="color: #002200;">*</span> sharedAutoreleasePool <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
<span style="color: #a61390;">@implementation</span> MyAutoreleasePool
&nbsp;
<span style="color: #a61390;">@synthesize</span> savedPool <span style="color: #002200;">=</span> _savedPool;
<span style="color: #a61390;">@synthesize</span> objectPool <span style="color: #002200;">=</span> _objectPool;
<span style="color: #a61390;">@synthesize</span> objectCount <span style="color: #002200;">=</span> _objectCount;
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>sharedAutoreleasePool addObject<span style="color: #002200;">:</span>object<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		_objectPool <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>メモリ確保<span style="color: #002200;">&#40;</span><span style="color: #a61390;">sizeof</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">*</span> MAX_POOL<span style="color: #002200;">&#41;</span>;
		_objectCount <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
&nbsp;
		_savedPool <span style="color: #002200;">=</span> sharedAutoreleasePool;
		sharedAutoreleasePool <span style="color: #002200;">=</span> self;
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	sharedAutoreleasePool <span style="color: #002200;">=</span> _savedPool;
&nbsp;
	<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; i &lt; _objectCount; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>_objectPool<span style="color: #002200;">&#91;</span>i<span style="color: #002200;">&#93;</span> release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
	メモリ解放<span style="color: #002200;">&#40;</span>_objectPool<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>object <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.objectCount &lt; MAX_POOL<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		self.objectPool<span style="color: #002200;">&#91;</span>self.objectCount<span style="color: #002200;">++</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> object;
	<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//どうすんべ？</span>
		<span style="color: #11740a; font-style: italic;">// ふつーに考えて realloc とかかな</span>
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>以上、かなりシンプルなコードだが狙って単純化してるわけではなく（エラー処理はまったく考慮していないが）知ってる機能を満足するよう想像してみたらこんなかんじに帰結しただけ</p>
<p>で利用する場合を考えると release に比べて autorelease で増えるコストは</p>
<p>・AutoreleasePool オブジェクト生成・破棄のコスト（けっこう小）<br />
　※自前で AutoreleasePool を用意した場合<br />
・プール登録のコスト（極小）<br />
・プール登録個数回ループ（かなり小）<br />
　※ループ中の release は相殺</p>
<p>以上、とても&#8221;体感できるようなコスト増&#8221;には繋がらないだろうと思ってる<br />
てな感じ</p>
<p>ちなみに autorelease 後、てけとーなオブジェクトで retain しておくと&#8221;イベントループの度に&#8221;参照されて遅いという話がありました<br />
私は上述のコードのように想像しているのでこの話が腑に落ちず悶々としている、みたいなー</p>
<p>［追記］<br />
・return self; が抜けまくってるので追加した<br />
・init, dealloc 以外でメンバの直接参照している箇所を self. に修正<br />
・ちなみにこのことを考え始めるきっかけとなったエントリ<br />
　<a href="http://iphone-dev.g.hatena.ne.jp/ktakayama/20100324">autorelease は遅いか速いか</a></p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=252</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Android-x86 のインストール</title>
		<link>http://touch.hogelab.net/blog/?p=243</link>
		<comments>http://touch.hogelab.net/blog/?p=243#comments</comments>
		<pubDate>Tue, 19 Jan 2010 03:05:32 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Eee PC]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=243</guid>
		<description><![CDATA[つっても DL して粛々と作業しただけ 現時点では stable の Android-x86 1.6 live &#038; installation usb image がお勧めか ○材料 ・Eee PC（対象機種はリンク先を参照） 　※うちのマシン（1002HA）は列挙されてないけど特に問題はなさげ ・起動用 USB メモリとか SD とか ○調理 ・イメージを起動用 USB とかに書き込み ・起動してインストールを選択 ・ブートローダは環境にあわせてどぞー 　※別パーティションに ubuntu が入ってたのでパスした。んだっけかな？ でだ OpenWnn が入ってないようなので一からビルドすべくソースを取りに行ったあたりで年末年始 年が明けてみると OpenWnn は動かない情報もちらほら そんな中、chekela さんがビルドした OpenWnn x86 ライブラリを組み込んだ adamrocker さんの Simeji が公開されているのを発見！ありがたくちょうだいいたしました ・参考リンクから Simeji をインストール 　※予め ubuntu + chrome で落としておいた [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D243"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D243&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>つっても DL して粛々と作業しただけ<br />
現時点では stable の Android-x86 1.6 live &#038; installation usb image がお勧めか</p>
<p>○材料<br />
・Eee PC（対象機種はリンク先を参照）<br />
　※うちのマシン（1002HA）は列挙されてないけど特に問題はなさげ<br />
・起動用 USB メモリとか SD とか</p>
<p>○調理<br />
・イメージを起動用 USB とかに書き込み<br />
・起動してインストールを選択<br />
・ブートローダは環境にあわせてどぞー<br />
　※別パーティションに ubuntu が入ってたのでパスした。んだっけかな？</p>
<p>でだ<br />
OpenWnn が入ってないようなので一からビルドすべくソースを取りに行ったあたりで年末年始<br />
年が明けてみると OpenWnn は動かない情報もちらほら<br />
そんな中、chekela さんがビルドした OpenWnn x86 ライブラリを組み込んだ adamrocker さんの Simeji が公開されているのを発見！ありがたくちょうだいいたしました</p>
<p>・参考リンクから Simeji をインストール<br />
　※予め ubuntu + chrome で落としておいた apk からはインストールできんかった。理由不明</p>
<p>○動作状況<br />
・無線LANおっけー<br />
・スリープおっけー<br />
　※スリープ後、無線LANあうち？<br />
・日本語入力おっけー<br />
・二本指スクロールはうれしいがタップは切りたい。設定不明</p>
<p>○参考リンク<br />
・<a href="http://www.android-x86.org/">Android-x86 &#8211; Porting Android to x86</a><br />
・<a href="http://www.adamrocker.com/blog/286/simeji-for-x86.html">x86で動くSimeji</a><br />
・<a href="http://blog.cnu.jp/2010/01/01/android-x86-on-vmware-fusion/">Android x86をVMware Fusionにインストール</a></p>
<p>○謝辞<br />
adamrocker さん、chekela さん、ありがとうございました</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=243</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>昆虫採集</title>
		<link>http://touch.hogelab.net/blog/?p=241</link>
		<comments>http://touch.hogelab.net/blog/?p=241#comments</comments>
		<pubDate>Mon, 28 Dec 2009 06:40:49 +0000</pubDate>
		<dc:creator>こば</dc:creator>
				<category><![CDATA[アイデアノート]]></category>

		<guid isPermaLink="false">http://touch.hogelab.net/blog/?p=241</guid>
		<description><![CDATA[今どき昆虫採集なんてしないのかもしれんが 僕夏とかどうぶつの森風のノリで昆虫（植物、etc.）図鑑を&#8221;自分で&#8221;完成させるようなアプリ 説明を元にこれか？って写真を撮っていくのね 実際の写真と照らし合わせて答え合わせができるといいかな iPhone より DSi のが向いてるかな、まいいか]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D241"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftouch.hogelab.net%2Fblog%2F%3Fp%3D241&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>今どき昆虫採集なんてしないのかもしれんが</p>
<p>僕夏とかどうぶつの森風のノリで昆虫（植物、etc.）図鑑を&#8221;自分で&#8221;完成させるようなアプリ<br />
説明を元にこれか？って写真を撮っていくのね<br />
実際の写真と照らし合わせて答え合わせができるといいかな<br />
iPhone より DSi のが向いてるかな、まいいか</p>
]]></content:encoded>
			<wfw:commentRss>http://touch.hogelab.net/blog/?feed=rss2&#038;p=241</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

