<?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://blog.moonshine-project.com/ja/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.moonshine-project.com/ja</link>
	<description>iPhoneアプリ開発のことをあれこれ</description>
	<lastBuildDate>Fri, 02 Jul 2010 15:32:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhoneでのピクセル処理をNEON(ベクタ演算)を使って4倍高速化する</title>
		<link>http://blog.moonshine-project.com/ja/?p=533</link>
		<comments>http://blog.moonshine-project.com/ja/?p=533#comments</comments>
		<pubDate>Fri, 02 Jul 2010 07:33:22 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[開発]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=533</guid>
		<description><![CDATA[目次

はじめに
どのような処理をするのか？
コードの入手先
C言語でのコード
アセンブラでのコードとgccの最適化の素晴らしさ
NEON : 資料
NEON : 処理の流れと制限
NEON : コード
NEON : コード解説-処理限界数でのループ
NEON : コード解説-レジスタの役割
NEON : コード解説-データの読込
NEON : コード解説-加算
NEON : コード解説-ピクセルの色チェックとカウント
NEON : コード解説-カウントの合計
終りに


はじめに


ARMのNEONというベクタ演算を使ってコードを書いたところ、C言語で書いたコードの４倍の速度で動作する事ができました。この記事では、C言語でのコードの紹介、アセンブラでのコードの紹介、そしてNEONを利用したコードの紹介を行い、高速化を実現させた手法を書きます。

どのような処理をするのか？


弊社からリリースしている自炊系読書アプリ「吾輩の小説 for iPhone」は、画像のピクセルを全てチェックして文章を整形して表示しています。この処理がとても重いので最適化の一貫として研究した情報を公開します。
このプログラムでは 1024&#215;768 ピクセルでRGBAのフォーマットをもつデータから、RGBの各色の合計値が256未満であるピクセルの数を計算します。つまり、画像データから黒っぽいピクセルがいくつあるのかを計算します。また、計算速度の違いが分かりやすくなるように、これを100回繰り返し合計で約8000万ピクセルの計算を行ないます。また、その計算時間を表示します。

コードの入手先

githubにプロジェクトファイルも含めてiPhoneで実行できるファイル一式をアップしましたのでご利用ください。gitコマンドを使用しない場合はこちらからzip化したものを落としてください。

C言語でのコード

以下がコードになります。

#define IMAGE_SIZE_W		(1024)
#define IMAGE_SIZE_H		(768)
#define CHECK_COLOR		(0xFF)
#define LOOP_COUNT		(100)
#define ELEMENT_OF_PIXEL	(4)
&#160;
NSString* Test::testC&#40;&#41;&#123;
	int pixelCount = width * height;
	int hitCount = 0;
	int startTime = getTime&#40;&#41;;
	for&#40;int i = 0; i &#60; LOOP_COUNT; i++&#41;&#123;
		unsigned char* imageWork = image;
		for&#40;int j = 0; j [...]]]></description>
			<content:encoded><![CDATA[<h2>目次</h2>
<ul>
<li><a href="#block01">はじめに</a></li>
<li><a href="#block02">どのような処理をするのか？</a></li>
<li><a href="#block03">コードの入手先</a></li>
<li><a href="#block04">C言語でのコード</a></li>
<li><a href="#block05">アセンブラでのコードとgccの最適化の素晴らしさ</a></li>
<li><a href="#block06">NEON : 資料</a></li>
<li><a href="#block07">NEON : 処理の流れと制限</a></li>
<li><a href="#block08">NEON : コード</a></li>
<li><a href="#block09">NEON : コード解説-処理限界数でのループ</a></li>
<li><a href="#block10">NEON : コード解説-レジスタの役割</a></li>
<li><a href="#block11">NEON : コード解説-データの読込</a></li>
<li><a href="#block12">NEON : コード解説-加算</a></li>
<li><a href="#block13">NEON : コード解説-ピクセルの色チェックとカウント</a></li>
<li><a href="#block14">NEON : コード解説-カウントの合計</a></li>
<li><a href="#block15">終りに</a></li>
</ul>
<p><a name="block01"><br />
<h2>はじめに</h2>
<p></a><br />
<a href="http://www.flickr.com/photos/akiraak/4750774211/" title="IMG_0001 by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4076/4750774211_df1f5564f8_o.png" width="320" height="480" alt="IMG_0001" /></a><br />
ARMのNEONというベクタ演算を使ってコードを書いたところ、C言語で書いたコードの４倍の速度で動作する事ができました。この記事では、C言語でのコードの紹介、アセンブラでのコードの紹介、そしてNEONを利用したコードの紹介を行い、高速化を実現させた手法を書きます。</p>
<p><a name="block02"><br />
<h2>どのような処理をするのか？</h2>
<p></a><br />
<a target="_blank" href="http://itunes.apple.com/jp/app/id351820519?mt=8" title="吾輩の小説"><img src="http://www.moonshine-project.com/app_image?app_key=NVV1" width="96" height="100" alt="吾輩の小説" /></a><br />
弊社からリリースしている自炊系読書アプリ<a href="http://itunes.apple.com/jp/app/id351820519?mt=8">「吾輩の小説 for iPhone」</a>は、画像のピクセルを全てチェックして文章を整形して表示しています。この処理がとても重いので最適化の一貫として研究した情報を公開します。</p>
<p>このプログラムでは 1024&#215;768 ピクセルでRGBAのフォーマットをもつデータから、RGBの各色の合計値が256未満であるピクセルの数を計算します。つまり、画像データから黒っぽいピクセルがいくつあるのかを計算します。また、計算速度の違いが分かりやすくなるように、これを100回繰り返し合計で約8000万ピクセルの計算を行ないます。また、その計算時間を表示します。</p>
<p><a name="block03"><br />
<h2>コードの入手先</h2>
<p></a></p>
<p><a href="http://github.com/akiraak/neon-pixeltest-for-iphone">github</a>にプロジェクトファイルも含めてiPhoneで実行できるファイル一式をアップしましたのでご利用ください。gitコマンドを使用しない場合は<a href="http://github.com/akiraak/neon-pixeltest-for-iphone/downloads">こちら</a>からzip化したものを落としてください。</p>
<p><a name="block04"><br />
<h2>C言語でのコード</h2>
<p></a><br />
以下がコードになります。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define IMAGE_SIZE_W		(1024)</span>
<span style="color: #339900;">#define IMAGE_SIZE_H		(768)</span>
<span style="color: #339900;">#define CHECK_COLOR		(0xFF)</span>
<span style="color: #339900;">#define LOOP_COUNT		(100)</span>
<span style="color: #339900;">#define ELEMENT_OF_PIXEL	(4)</span>
&nbsp;
NSString<span style="color: #000040;">*</span> Test<span style="color: #008080;">::</span><span style="color: #007788;">testC</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> pixelCount <span style="color: #000080;">=</span> width <span style="color: #000040;">*</span> height<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> hitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> startTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> LOOP_COUNT<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> imageWork <span style="color: #000080;">=</span> image<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> pixelCount<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> color <span style="color: #000080;">=</span> imageWork<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span>imageWork<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span>imageWork<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>color <span style="color: #000080;">&lt;</span> CHECK_COLOR<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
				hitCount<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			imageWork <span style="color: #000040;">+</span><span style="color: #000080;">=</span> ELEMENT_OF_PIXEL<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> endTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	NSString<span style="color: #000040;">*</span> string <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span>NSString stringWithFormat<span style="color: #008080;">:</span>@<span style="color: #FF0000;">&quot;Pixcel: %d<span style="color: #000099; font-weight: bold;">\n</span>Hit Pixel: %d<span style="color: #000099; font-weight: bold;">\n</span>Time: %d msec<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pixelCount <span style="color: #000040;">*</span> LOOP_COUNT, hitCount, endTime<span style="color: #000040;">-</span>startTime<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> string<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>RGBの合計値を算出し、CHECK_COLOR(0xFF) よりも小さいものをカウントしていくだけのシンプルなプログラムです。</p>
<p><a name="block05"><br />
<h2>アセンブラでのコードとgccの最適化の素晴らしさ</h2>
<p></a><br />
以下がコードになります。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define IMAGE_SIZE_W		(1024)</span>
<span style="color: #339900;">#define IMAGE_SIZE_H		(768)</span>
<span style="color: #339900;">#define CHECK_COLOR		(0xFF)</span>
<span style="color: #339900;">#define LOOP_COUNT		(100)</span>
<span style="color: #339900;">#define ELEMENT_OF_PIXEL	(4)</span>
&nbsp;
NSString<span style="color: #000040;">*</span> Test<span style="color: #008080;">::</span><span style="color: #007788;">testAsm</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> pixelCount <span style="color: #000080;">=</span> width <span style="color: #000040;">*</span> height<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> hitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> checkColor <span style="color: #000080;">=</span> CHECK_COLOR<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> startTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> LOOP_COUNT<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		__asm__ <span style="color: #0000ff;">volatile</span> <span style="color: #008000;">&#40;</span>
				<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// ループ開始</span>
				<span style="color: #FF0000;">&quot;1: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add	r0, r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb	r3, [%[image]] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;ldrb	r2, [%[image], #1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add	r2, r2, r3  <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb	r3, [%[image], #2] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add	r2, r2, r3  <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add	%[image], %[image], #4  <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// 色判定とカウント</span>
				<span style="color: #FF0000;">&quot;cmp	r2, %[checkColor] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;addlt %[hitCount], %[hitCount], #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// 「ループ開始」へ戻る</span>
				<span style="color: #FF0000;">&quot;cmp	r0, %[pixelCount] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;bne	1b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>hitCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;+r&quot;</span> <span style="color: #008000;">&#40;</span>hitCount<span style="color: #008000;">&#41;</span>
				<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>pixelCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>pixelCount<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>image<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>image<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>checkColor<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>checkColor<span style="color: #008000;">&#41;</span>
				<span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;r0&quot;</span>, <span style="color: #FF0000;">&quot;r1&quot;</span>, <span style="color: #FF0000;">&quot;r2&quot;</span>, <span style="color: #FF0000;">&quot;r3&quot;</span>, <span style="color: #FF0000;">&quot;cc&quot;</span>, <span style="color: #FF0000;">&quot;memory&quot;</span>
				<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> endTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	NSString<span style="color: #000040;">*</span> string <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span>NSString stringWithFormat<span style="color: #008080;">:</span>@<span style="color: #FF0000;">&quot;Pixcel: %d<span style="color: #000099; font-weight: bold;">\n</span>Hit Pixel: %d<span style="color: #000099; font-weight: bold;">\n</span>Time: %d msec<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pixelCount <span style="color: #000040;">*</span> LOOP_COUNT, hitCount, endTime<span style="color: #000040;">-</span>startTime<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> string<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>時間を計測したところ、驚くことに C言語 で書いたものよりも速度が遅くなりました。gccがCからアセンブラにコンパイルする時の最適化がとても優れているのだと思います。NEONなどの特殊な機能を使わないかぎりは、アセンブラ化せず C言語 で書くほうが良いと思います。</p>
<p><a name="block06"><br />
<h2>NEON : 資料</h2>
<p></a><br />
今回のコードでお見苦しい点があればご容赦願います。アセンブラでの開発経験が全く無く2日前に勉強しながら作成したものです。そこで、使用した資料を列挙しておきます。</p>
<ul>
<li>
		<a href="http://www.mztn.org/slasm/arm00.html"><strong>ARM アセンブリ</strong></a><br />
		ARMの基本的なプログラミングの手法を知る事ができます。
	</li>
</ul>
<ul>
<li>
		<a href="http://www32.atwiki.jp/nakamura001/?page=%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8/iPhone/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9"><strong>iPhoneでインラインアセンブラを使う</strong></a><br />
		iPhoneでアセンブラを使用する時の手法を知る事ができます。</p>
</li>
</ul>
<ul>
<li>
		<a href="http://wlog.flatlib.jp/item/1408"><strong>ARM Cortex-A8 の NEON と浮動小数演算最適化</strong></a><br />
		<a href="http://wlog.flatlib.jp/item/1401"><strong>NetWalker PC-Z1 Cortex-A8 (ARM) 浮動小数演算の実行速度</strong></a><br />
		NEONのレジスタや計算の雰囲気を知ることができます。
	</li>
</ul>
<ul>
<li>
		<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ij/index.html"><strong>RealView® Compilation Tools アセンブラガイド<br />
バージョン 4.0</strong></a><br />
		ARM命令が網羅されているリファレンスです。ただし、バージョンが古いせいか今回使用している一部の命令は載っていません。
	</li>
</ul>
<ul>
<li>
		<a href="http://blogs.arm.com/software-enablement/coding-for-neon-part-1-load-and-stores/"><strong>Coding for NEON &#8211; Part 1: Load and Stores</strong></a><br />
		メモリからNEONレジスタにデータを読み込む時の参考になる資料です。
	</li>
</ul>
<p><a name="block07"><br />
<h2>NEON : 処理の流れと制限</h2>
<p></a></p>
<p>NEONはベクタ演算です。ベクタ演算とは復数の演算を１命令で実行します。今回の方法では、１６回の足し算、１６回の比較などを１命令で実行します。それにともなって、今までの単純なループや比較ではなくて、それなりに複雑なプログラムになってきます。処理の大まかな流れは以下の順番になります。</p>
<ol>
<li>16ピクセル(64バイト)分のデータを詠込む</li>
<li>16ピクセルのRGBを一気に足す</li>
<li>16ピクセルの0xFF未満の値を一気にカウンタに追加</li>
<li>4096ピクセルの処理が終わるまで1-3を繰返す</li>
<li>カウンタの合計を取る</li>
<li>全てのピクセルの処理が終わるまで1-5を繰返す</li>
</ol>
<p>ポイントは「16ピクセルを一気に処理」している所と、「4096ピクセルの処理」を一つの境目としている所です。以下で詳しく説明していきます。</p>
<p><a name="block08"><br />
<h2>NEON : コード</h2>
<p></a><br />
以下がコードになります。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define IMAGE_SIZE_W		(1024)</span>
<span style="color: #339900;">#define IMAGE_SIZE_H		(768)</span>
<span style="color: #339900;">#define CHECK_COLOR			(0xFF)</span>
<span style="color: #339900;">#define LOOP_COUNT			(100)</span>
<span style="color: #339900;">#define ELEMENT_OF_PIXEL	(4)</span>
&nbsp;
NSString<span style="color: #000040;">*</span> Test<span style="color: #008080;">::</span><span style="color: #007788;">testNeon</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> pixelCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">4096</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> innerLoop <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>width<span style="color: #000040;">*</span>height<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>pixelCount<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> totalHitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> checkColor <span style="color: #000080;">=</span>
		CHECK_COLOR <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">24</span> <span style="color: #000040;">|</span>
		CHECK_COLOR <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">16</span> <span style="color: #000040;">|</span>
		CHECK_COLOR <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">8</span> <span style="color: #000040;">|</span>
		CHECK_COLOR <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> startTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> addMask <span style="color: #000080;">=</span> <span style="color: #208080;">0x01010101</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> LOOP_COUNT<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> _image <span style="color: #000080;">=</span> image<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> innerLoop<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> hitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			__asm__ <span style="color: #0000ff;">volatile</span> <span style="color: #008000;">&#40;</span>
					<span style="color: #666666;">// 初期化</span>
					<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #666666;">// 0クリア用</span>
					<span style="color: #FF0000;">&quot;mov	r1, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #666666;">// 処理済みピクセルのカウンタ</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d8, r0, r0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d9, r0, r0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d10, %[checkColor], %[checkColor] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d11, %[checkColor], %[checkColor] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d12, %[addMask], %[addMask] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32 d13, %[addMask], %[addMask] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// ループ開始</span>
					<span style="color: #FF0000;">&quot;1: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add	r1, r1, #16 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// データの読込と色の加算</span>
					<span style="color: #FF0000;">&quot;add		r2, %[image], #32 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vld4.8	{d0, d2, d4, d6}, [%[image]] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vld4.8	{d1, d3, d5, d7}, [r2] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vqadd.u8	q0, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vqadd.u8	q0, q2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// 色の判定とカウント</span>
					<span style="color: #FF0000;">&quot;vclt.u8 q1, q0, q5 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vand q1, q6 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vadd.u8 q4, q4, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// データのアドレスを進める</span>
					<span style="color: #FF0000;">&quot;add	%[image], #64 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// 「ループ開始」へ</span>
					<span style="color: #FF0000;">&quot;cmp	r1, %[pixelCount] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;bcc	1b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #666666;">// 色数の合計</span>
					<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32	r1, d8[0] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;2: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;and		r2, r1, #0xFF <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		%[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;lsr		r1, #8 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;cmp		r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;bne		2b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32	r1, d8[1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;3: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;and		r2, r1, #0xFF <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		%[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;lsr		r1, #8 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;cmp		r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;bne		3b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32	r1, d9[0] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;4: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;and		r2, r1, #0xFF <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		%[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;lsr		r1, #8 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;cmp		r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;bne		4b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;vmov.u32	r1, d9[1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;5: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;and		r2, r1, #0xFF <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		%[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;lsr		r1, #8 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;add		r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;cmp		r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
					<span style="color: #FF0000;">&quot;bne		5b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
					<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>hitCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;+r&quot;</span> <span style="color: #008000;">&#40;</span>hitCount<span style="color: #008000;">&#41;</span>
					<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>pixelCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>pixelCount<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>image<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>_image<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>checkColor<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>checkColor<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>addMask<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>addMask<span style="color: #008000;">&#41;</span>
					<span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;r0&quot;</span>, <span style="color: #FF0000;">&quot;r1&quot;</span>, <span style="color: #FF0000;">&quot;r2&quot;</span>, <span style="color: #FF0000;">&quot;q0&quot;</span>, <span style="color: #FF0000;">&quot;q1&quot;</span>, <span style="color: #FF0000;">&quot;q2&quot;</span>, <span style="color: #FF0000;">&quot;q3&quot;</span>, <span style="color: #FF0000;">&quot;q4&quot;</span>, <span style="color: #FF0000;">&quot;cc&quot;</span>, <span style="color: #FF0000;">&quot;memory&quot;</span>
					<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			totalHitCount <span style="color: #000040;">+</span><span style="color: #000080;">=</span> hitCount<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> endTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	NSString<span style="color: #000040;">*</span> string <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span>NSString stringWithFormat<span style="color: #008080;">:</span>@<span style="color: #FF0000;">&quot;Pixcel: %d<span style="color: #000099; font-weight: bold;">\n</span>Hit Pixel: %d<span style="color: #000099; font-weight: bold;">\n</span>Time: %d msec<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, width <span style="color: #000040;">*</span> height <span style="color: #000040;">*</span> LOOP_COUNT, totalHitCount, endTime<span style="color: #000040;">-</span>startTime<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> string<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><a name="block09"><br />
<h2>NEON : コード解説-処理限界数でのループ</h2>
<p></a><br />
上記しましたが、この処理でのポイントに「4096ピクセルの処理」というものがあります。これはピクセル数のカウントを１バイトで行い、それを１６個保持しているからです。「２５６(１バイト)ｘ１６＝４０９６」となります。なぜ１バイトで計算するのか？と思われるとおもいますが、これがベクタ演算を使った高速化のカギになります。以下で説明します。</p>
<p><a name="block10"><br />
<h2>NEON : コード解説-レジスタの役割</h2>
<p></a><br />
この最適化コードでは7本のNEON128ビットレジスタを使用しています。それぞれの主な役割は以下のようになります。</p>
<ul>
<li>q0(d0,d1): R値を保持</li>
<li>q1(d2,d3): G値を保持</li>
<li>q2(d4,d5): B値を保持</li>
<li>q3(d6,d7): A値を保持。読込むだけで計算には使わない。</li>
<li>q4(d8,d9): 色判定の結果をカウント</li>
<li>q5(d10,d11): 色判定で使用する値(0xFFが詰まっている)</li>
<li>q6(d12,d13): 結果をカウントするときに使用するビットマスク(0&#215;01が詰まっている)</li>
</ul>
<p><a name="block11"><br />
<h2>NEON : コード解説-データの読込</h2>
<p></a><br />
まず、計算の前にメモリからNEONレジスタにデータを読み込みます。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// データの読込と色の加算</span>
<span style="color: #FF0000;">&quot;add	r2, %[image], #32 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vld4.8	{d0, d2, d4, d6}, [%[image]] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vld4.8	{d1, d3, d5, d7}, [r2] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span></pre></div></div>

<p>%[image]レジスタがデータの先頭のアドレスを指し、r2レジスタがそこから32バイトずらした8個目以降のピクセルのアドレスを指しています。そして vld4.8 命令を呼び以下の画像のような配置でデータが読み込まれます。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4753801567/" title="neon_1_registers by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4136/4753801567_2dbe537c9b.jpg" width="500" height="363" alt="neon_1_registers" /></a></p>
<p><a name="block12"><br />
<h2>NEON : コード解説-加算</h2>
<p></a><br />
そして、RGBの値を加算します。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #FF0000;">&quot;vqadd.u8	q0, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vqadd.u8	q0, q2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span></pre></div></div>

<p>Rの値が入っている q0 レジスタに、G値の q1 と、B値の q2 を加算します。以下の図ような処理になります。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4754442260/" title="neon_2_adding_colors by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4096/4754442260_4459bf0609.jpg" width="500" height="290" alt="neon_2_adding_colors" /></a></p>
<p>この時に vadd.u8 ではなく vqadd.u8 を使います。前者は加算時にビットが溢れても気にせずに計算がされます。後者はビットが溢れた場合に最大値が設定されます。計算式でたとえると以下のような違いになります。</p>
<p>vadd.u8  : 0xFF + 0&#215;01 = 0&#215;0<br />
vqadd.u8  : 0xFF + 0&#215;01 = 0xFF</p>
<p>これで次に行う比較演算が問題なくおこなえます。</p>
<p>しかし、正確にいうと場合によっては問題が大ありです。上記のとおり、この最適化コードでは256以上の値での色判定は行えません。どんな値でも判定できるコードも書いてみたのですが、これがあまり高速化できなかったため今回はバッサリと切り捨てました。</p>
<p><a name="block13"><br />
<h2>NEON : コード解説-ピクセルの色チェックとカウント</h2>
<p></a><br />
ピクセルの色チェックとカウントは多少やっかいなので、図をまじえつつ説明していきます。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// 色の判定とカウント</span>
<span style="color: #FF0000;">&quot;vclt.u8 q1, q0, q5 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vand q1, q6 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vadd.u8 q4, q4, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span></pre></div></div>

<p>vclt.u8 は比較命令です。 RGBの合計値が入っている q0 と、比較用の値を詰め込んである q5 を比較し、 q0 の値の方が小さかった場合に対応するビットに 1 が設定された値を q1 に入れます。意味が分かりにくいと思うので図では以下のようになります。例として q0 にはRGB値が加算されたとして適当な値を入れています。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4754522223/" title="neon_3_vclt by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4073/4754522223_d392487911.jpg" width="500" height="240" alt="neon_3_vclt" /></a></p>
<p>次は、比較判定にヒットしたピクセルをカウントします。vclt.u8 では比較にヒットしたピクセルに対応する箇所のビットが全て立つ、つまり 0xFF が入っています。これを 1 になるように 0&#215;1 で AND を取ります。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4755161406/" title="neon_4_vand by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4139/4755161406_481562581b.jpg" width="500" height="236" alt="neon_4_vand" /></a></p>
<p>最後に vadd.u8 で q4 に q1 を足してあげれば、１６ピクセル分のカウントが完了します。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4755161338/" title="neon_5_vadd by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4138/4755161338_004e771cdd_b.jpg" width="624" height="300" alt="neon_5_vadd" /></a></p>
<p>上記の図ではカウント用の q4 レジスタが空でしたが、ループを重ねるごとに値が加算されていくことになります。</p>
<p><a name="block14"><br />
<h2>NEON : コード解説-カウントの合計</h2>
<p></a><br />
上記したように、このコードでは4096ピクセルまで計算すると、q4 でのカウンタが最大値である 0xFF になるものが出てきます。ですので、ここで一度別のレジスタに待避させます。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// 色数の合計</span>
<span style="color: #FF0000;">&quot;mov		r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;vmov.u32	r1, d8[0] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;2: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;and		r2, r1, #0xFF <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;add		%[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;lsr		r1, #8 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;add		r0, #1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;cmp	r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
<span style="color: #FF0000;">&quot;bne		2b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
以下の同様の処理は省略</pre></div></div>

<p>まず vmov.u32	で d8[0](d8の上位4バイト) を r1 レジスタにコピーします。and で 下位１バイトに格納されているカウンタを取り出し %[hitCount] に足します。lsr r1, #8 で１バイト分右にシフトし次のカウンタの値を取得する準備をします。and と lsr の処理は以下の図のようになります。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4754521753/" title="neon_6_shift_count by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4094/4754521753_9d7e894a5c_o.jpg" width="396" height="253" alt="neon_6_shift_count" /></a></p>
<p>これらの処理をループで４回まわして、合計４個のカウント値を合計します。</p>
<p>その後 d8[1] d9[0] d9[1] にも同様の処理を行ない、16個を合計します。</p>
<p>これまでの処理を画像データの最後まで繰り返すと、RGB合計値が256未満の色をもつピクセル（黒っぽいピクセル）の個数が、C言語で書いたプログラムの約４倍の速度で取得できます。</p>
<p><a name="block15"><br />
<h2>終りに</h2>
<p></a></p>
<p>今回最適化を行うにあたって上記のコード量の１０倍程度を書き検証しました。そこで分かった注意点が、NEONで最適化するなら、メモリロードなどにARMレジスタや命令を使わずに、直接NEONレジスタと命令を使わないと意味が無いという事です。</p>
<p>決して汎用的な最適化コードではないですが、iPhoneで大量の処理を行う必要がある場合に、NEONでの高速化は有効だと思います。その時の参考になれば幸いです。</p>
<p>最後に、NEONを使いながらC言語の処理速度とほぼ同じだったコードを書いておきます。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define IMAGE_SIZE_W		(1024)</span>
<span style="color: #339900;">#define IMAGE_SIZE_H		(768)</span>
<span style="color: #339900;">#define CHECK_COLOR		(0xFF)</span>
<span style="color: #339900;">#define LOOP_COUNT		(100)</span>
<span style="color: #339900;">#define ELEMENT_OF_PIXEL	(4)</span>
&nbsp;
NSString<span style="color: #000040;">*</span> Test<span style="color: #008080;">::</span><span style="color: #007788;">testNeon</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> pixelCount <span style="color: #000080;">=</span> width <span style="color: #000040;">*</span> height<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> totalHitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> checkColor <span style="color: #000080;">=</span> CHECK_COLOR<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> startTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> LOOP_COUNT<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> hitCount <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		__asm__ <span style="color: #0000ff;">volatile</span> <span style="color: #008000;">&#40;</span>
				<span style="color: #666666;">// 初期化</span>
				<span style="color: #FF0000;">&quot;mov	r0, #0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.u32 d8, r0, r0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.u32 d9, r0, r0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.u32 d6, %[checkColor], %[checkColor] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.u32 d7, %[checkColor], %[checkColor] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// ループ開始</span>
				<span style="color: #FF0000;">&quot;1: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add	r0, r0, #4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb r1, [%[image]] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r2, [%[image], #1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r3, [%[image], #2] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb r4, [%[image], #4] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r5, [%[image], #5] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r6, [%[image], #6] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
&nbsp;
				<span style="color: #FF0000;">&quot;vmov d0, r1, r4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov d2, r2, r5 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov d4, r3, r6 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb r1, [%[image], #8] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r2, [%[image], #9] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r3, [%[image], #10] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
&nbsp;
				<span style="color: #FF0000;">&quot;ldrb r4, [%[image], #12] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r5, [%[image], #13] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
				<span style="color: #FF0000;">&quot;ldrb r6, [%[image], #14] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
&nbsp;
				<span style="color: #FF0000;">&quot;vmov d1, r1, r4 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov d3, r2, r5 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov d5, r3, r6 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #FF0000;">&quot;add %[image], %[image], #16 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>  
&nbsp;
				<span style="color: #FF0000;">&quot;vadd.s32	q0, q0, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vadd.s32	q0, q0, q2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// カウント</span>
				<span style="color: #FF0000;">&quot;vclt.s32 q1, q0, q3 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vsub.s32 q4, q4, q1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// 「ループ開始」へ</span>
				<span style="color: #FF0000;">&quot;cmp	r0, %[pixelCount] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;bcc	1b <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #666666;">// 色判定とカウント</span>
				<span style="color: #FF0000;">&quot;vmov.s32 %[hitCount], d8[0] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.s32 r0, d8[1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.s32 r1, d9[0] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;vmov.s32 r2, d9[1] <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add %[hitCount], r0 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add %[hitCount], r1 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
				<span style="color: #FF0000;">&quot;add %[hitCount], r2 <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\t</span>&quot;</span>
&nbsp;
				<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;+r&quot;</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>hitCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;+r&quot;</span> <span style="color: #008000;">&#40;</span>hitCount<span style="color: #008000;">&#41;</span>
				<span style="color: #008080;">:</span> <span style="color: #008000;">&#91;</span>pixelCount<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>pixelCount<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>image<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>image<span style="color: #008000;">&#41;</span>, <span style="color: #008000;">&#91;</span>checkColor<span style="color: #008000;">&#93;</span> <span style="color: #FF0000;">&quot;r&quot;</span> <span style="color: #008000;">&#40;</span>checkColor<span style="color: #008000;">&#41;</span>
				<span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;r0&quot;</span>, <span style="color: #FF0000;">&quot;r1&quot;</span>, <span style="color: #FF0000;">&quot;r2&quot;</span>, <span style="color: #FF0000;">&quot;r3&quot;</span>, <span style="color: #FF0000;">&quot;r4&quot;</span>, <span style="color: #FF0000;">&quot;r5&quot;</span>, <span style="color: #FF0000;">&quot;r6&quot;</span>, <span style="color: #FF0000;">&quot;q0&quot;</span>, <span style="color: #FF0000;">&quot;q1&quot;</span>, <span style="color: #FF0000;">&quot;q2&quot;</span>, <span style="color: #FF0000;">&quot;q3&quot;</span>, <span style="color: #FF0000;">&quot;q4&quot;</span>, <span style="color: #FF0000;">&quot;cc&quot;</span>, <span style="color: #FF0000;">&quot;memory&quot;</span>
				<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		totalHitCount <span style="color: #000040;">+</span><span style="color: #000080;">=</span> hitCount<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> endTime <span style="color: #000080;">=</span> getTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	NSString<span style="color: #000040;">*</span> string <span style="color: #000080;">=</span> <span style="color: #008000;">&#91;</span>NSString stringWithFormat<span style="color: #008080;">:</span>@<span style="color: #FF0000;">&quot;Pixcel: %d<span style="color: #000099; font-weight: bold;">\n</span>Hit Pixel: %d<span style="color: #000099; font-weight: bold;">\n</span>Time: %d msec<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pixelCount <span style="color: #000040;">*</span> LOOP_COUNT, totalHitCount, endTime<span style="color: #000040;">-</span>startTime<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> string<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=533</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分厚いハードカバーの本をカッターで綺麗に裁断する方法</title>
		<link>http://blog.moonshine-project.com/ja/?p=517</link>
		<comments>http://blog.moonshine-project.com/ja/?p=517#comments</comments>
		<pubDate>Tue, 25 May 2010 12:22:12 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=517</guid>
		<description><![CDATA[ 
「吾輩の小説 for iPhone」で村上春樹の1Q84-BOOK1を読んだら面白くてBOOK2を買ったのですが、この本は分厚くてカッターで綺麗に裁断するのが難しいんですよね。そこで綺麗に裁断する方法を教えます。
さて、1Q84-BOOK2はすでに裁断してしまったので、福田 和代のオーディンの鴉で説明します。
用意する道具は、カッター、定規、下敷きです。

まず、ハードカバーの部分はページとの間にカッターの刃を入れて切り分離させます。
 
次に本体の部分を100ページ程度ごとに切り分けます。
 
そして、切り分けたものの糊付け部分を切っていきます。

すると、こんなに綺麗にできあがります。

お試しあれ。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/akiraak/4638875058/" title="1q84 by akiraak2, on Flickr"><img src="http://farm4.static.flickr.com/3056/4638875058_39e96084df_o.png" width="138" height="268" alt="1q84" /></a> <a href="http://itunes.apple.com/jp/app/id351820519?mt=8"><img src="http://blog.moonshine-project.com/ja/files/2010/02/nvv1_icon_reflection_96x100.png" width="96" height="100"></a></p>
<p><a href="http://itunes.apple.com/jp/app/id351820519?mt=8">「吾輩の小説 for iPhone」</a>で村上春樹の<a href="http://amzn.to/bTk3si">1Q84-BOOK1</a>を読んだら面白くて<a href="http://amzn.to/clE66V">BOOK2</a>を買ったのですが、この本は分厚くてカッターで綺麗に裁断するのが難しいんですよね。そこで綺麗に裁断する方法を教えます。</p>
<p>さて、<a href="http://amzn.to/clE66V">1Q84-BOOK2</a>はすでに裁断してしまったので、福田 和代の<a href="http://amzn.to/bg2em1">オーディンの鴉</a>で説明します。</p>
<p>用意する道具は、カッター、定規、下敷きです。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4638199119/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4022/4638199119_54a2776278_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a></p>
<p>まず、ハードカバーの部分はページとの間にカッターの刃を入れて切り分離させます。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4638199475/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4023/4638199475_1cfd2d461e_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a> <a href="http://www.flickr.com/photos/akiraak/4638809654/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm4.static.flickr.com/3359/4638809654_9459292bcc_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a></p>
<p>次に本体の部分を100ページ程度ごとに切り分けます。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4638200229/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm4.static.flickr.com/3413/4638200229_53ce8cdc1a_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a> <a href="http://www.flickr.com/photos/akiraak/4638200573/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm5.static.flickr.com/4048/4638200573_df3348401c_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a></p>
<p>そして、切り分けたものの糊付け部分を切っていきます。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4638200879/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm4.static.flickr.com/3410/4638200879_9f3542bbd2_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a></p>
<p>すると、こんなに綺麗にできあがります。</p>
<p><a href="http://www.flickr.com/photos/akiraak/4638201189/" title="厚いハードカバーをカッターで裁断 by akiraak2, on Flickr"><img src="http://farm4.static.flickr.com/3343/4638201189_9fc0be6dec_m.jpg" width="160" height="240" alt="厚いハードカバーをカッターで裁断" /></a></p>
<p>お試しあれ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=517</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>吾輩の小説: 最新の小説を快適に読めちゃう！小説が大好きな方へ。</title>
		<link>http://blog.moonshine-project.com/ja/?p=502</link>
		<comments>http://blog.moonshine-project.com/ja/?p=502#comments</comments>
		<pubDate>Mon, 15 Mar 2010 03:22:32 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=502</guid>
		<description><![CDATA[今年は iPad, Kindle が発売され電子書籍の年になりそうですね。そこで、自炊系小説ビュワー「吾輩の小説」の紹介です。

「吾輩の小説」は青空文庫系アプリとは違い、自分で購入した最新の小説を読む事ができます。村山春樹だって涼宮ハルヒだって読めちゃいます。あなたの家の本棚に眠る懐かしい小説を読み返す事だってできます。

まずは、書籍の追加方法の説明です。書籍画面から追加ボタンを押して「書籍の追加」画面を表示させます。書籍はzipファイルにまとめてWEBにアップしておきそのURLを指定します。デフォルトで「人間失格」のURLが入っているので試しにこちらを取得してみてください。

小説を読むときは「書籍」画面から追加した小説名をタップします。「整形表示モード」を使えば、文字をこんなに大きく表示して快適に読めます（画像のページは開発者が「涼宮ハルヒの消失」の中で一番好きなシーンです）

そして、高速化されたアプリの起動時間です。信号待ちやエレベーターの待ち短い時間でも小説が読めるように、前回読んでいた部分を高速に表示します。開発者自身、毎日「吾輩の小説」を持ち出して、信号待ち時間で読んでテストしてるのでばっちりです。

読書中に気になった所はメモで残せます。ミステリー物など登場人物が多い小説はとっても便利です（画像は「かまいたちの夜」で有名な我孫子武丸による「殺戮にいたる病」この小説で登場人物をメモったところ死亡者リストになってしまいました）

そして、その日の読書が終わったらコメント付きの読書記録を twitter に残せます。

開発者自身が小学生の頃から「はてしない物語」「小説ドラゴンクエスト」「ロードス島戦記」など千冊程度の小説を読んできた小説大好きっ子です。小説が大好きな iPhone ユーザーは是非使ってみてください。
※「涼宮ハルヒの消失」は角川書店の出版物です
※「かまいたちの夜」はチュンソフトの発売物です
※「殺戮にいたる病」は講談社の出版物です
※「はてしない物語」は岩波書店の出版物です
※「小説ドラゴンクエスト」はエニックスの出版物です
※「ロードス島戦記」は角川書店の出版物です
]]></description>
			<content:encoded><![CDATA[<p>今年は iPad, Kindle が発売され電子書籍の年になりそうですね。そこで、自炊系小説ビュワー「吾輩の小説」の紹介です。</p>
<p><a href="http://itunes.apple.com/jp/app/id351820519?mt=8"><img src="http://blog.moonshine-project.com/ja/files/2010/02/nvv1_icon_reflection_96x100.png" width="96" height="100"></a></p>
<p>「吾輩の小説」は青空文庫系アプリとは違い、自分で購入した最新の小説を読む事ができます。村山春樹だって涼宮ハルヒだって読めちゃいます。あなたの家の本棚に眠る懐かしい小説を読み返す事だってできます。</p>
<p><img src="http://blog.moonshine-project.com/ja/files/2010/03/01.jpeg" alt="01" width="320" height="480" class="alignnone size-full wp-image-503" /></p>
<p>まずは、書籍の追加方法の説明です。書籍画面から追加ボタンを押して「書籍の追加」画面を表示させます。書籍はzipファイルにまとめてWEBにアップしておきそのURLを指定します。デフォルトで「人間失格」のURLが入っているので試しにこちらを取得してみてください。</p>
<p><img src="http://blog.moonshine-project.com/ja/files/2010/03/02.png" alt="02" width="320" height="480" class="alignnone size-full wp-image-504" /></p>
<p>小説を読むときは「書籍」画面から追加した小説名をタップします。「整形表示モード」を使えば、文字をこんなに大きく表示して快適に読めます（画像のページは開発者が「涼宮ハルヒの消失」の中で一番好きなシーンです）</p>
<p><img src="http://blog.moonshine-project.com/ja/files/2010/03/03.png" alt="03" width="320" height="480" class="alignnone size-full wp-image-506" /></p>
<p>そして、高速化されたアプリの起動時間です。信号待ちやエレベーターの待ち短い時間でも小説が読めるように、前回読んでいた部分を高速に表示します。開発者自身、毎日「吾輩の小説」を持ち出して、信号待ち時間で読んでテストしてるのでばっちりです。</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/YvLT6DACKHQ&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/YvLT6DACKHQ&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>読書中に気になった所はメモで残せます。ミステリー物など登場人物が多い小説はとっても便利です（画像は「かまいたちの夜」で有名な我孫子武丸による「殺戮にいたる病」この小説で登場人物をメモったところ死亡者リストになってしまいました）</p>
<p><img src="http://blog.moonshine-project.com/ja/files/2010/03/04.png" alt="04" width="320" height="480" class="alignnone size-full wp-image-507" /></p>
<p>そして、その日の読書が終わったらコメント付きの読書記録を twitter に残せます。</p>
<p><img src="http://blog.moonshine-project.com/ja/files/2010/03/05.png" alt="05" width="320" height="480" class="alignnone size-full wp-image-508" /></p>
<p>開発者自身が小学生の頃から「はてしない物語」「小説ドラゴンクエスト」「ロードス島戦記」など千冊程度の小説を読んできた小説大好きっ子です。小説が大好きな iPhone ユーザーは是非使ってみてください。</p>
<p>※「涼宮ハルヒの消失」は角川書店の出版物です<br />
※「かまいたちの夜」はチュンソフトの発売物です<br />
※「殺戮にいたる病」は講談社の出版物です<br />
※「はてしない物語」は岩波書店の出版物です<br />
※「小説ドラゴンクエスト」はエニックスの出版物です<br />
※「ロードス島戦記」は角川書店の出版物です</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=502</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CALayerの好きなプロパティをアニメーションさせる</title>
		<link>http://blog.moonshine-project.com/ja/?p=486</link>
		<comments>http://blog.moonshine-project.com/ja/?p=486#comments</comments>
		<pubDate>Sun, 14 Mar 2010 03:58:05 +0000</pubDate>
		<dc:creator>ento</dc:creator>
				<category><![CDATA[開発]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=486</guid>
		<description><![CDATA[iPhone 上の描画システムとして、弊社ではこれまで UIKit、OpenGL を使ってきました。 UIKit を使ったのは最初のアプリだけで、パフォーマンス上の理由からそれ以降のアプリはすべて OpenGL で描画しています。
しかし先週から開始した次のアプリの開発では、Quartz と Core Animation を使ってみています。簡単な時計アプリになる予定で、これらのフレームワークでどこまでできるかの試作段階といったところです。その中で 1 つ、詰まった点があったので紹介します。
それはというと、時計の針を描画するところまではよかったのですが、その角度を変えながらアニメーションさせるところで行き詰まったのです。CALayer の「アニメーション可能なプロパティ」 animatable properties (不透明度やサイズなどが含まれます) ならば、値を変えるだけで自動的にアニメーション implicit animation が実行されます。時計の針の角度のような、自分で定義したプロパティでもそれをするにはどうすれば?
Google 検索に 3 時間お付き合いいただいた結果、iPhone OS 3.0 以降なら、CALayer の needsDisplayForKey: クラスメソッドで「変更されたら再描画が必要になるプロパティ」を指定できること、actionForKey: メソッドで「変更されたら実行するアクション (アニメーション)」を指定できることが分かりました。ここまでは簡単に調べられたのですが、時計の針をアニメーションさせるにはもう 1 つ注意すべきことがありました。こちらは後で紹介します。
それより何よりソースコードを見てみましょう。
はじめに、時計の針用のレイヤーを作るコードです:

@implementation ClockView
&#160;
- &#40;void&#41;awakeFromNib &#123;
    &#91;self setupLayers&#93;;
    &#91;self start&#93;;
&#125;
&#160;
- &#40;void&#41;start &#123;
    // tick [...]]]></description>
			<content:encoded><![CDATA[<p>iPhone 上の描画システムとして、弊社ではこれまで UIKit、OpenGL を使ってきました。 UIKit を使ったのは最初のアプリだけで、パフォーマンス上の理由からそれ以降のアプリはすべて OpenGL で描画しています。</p>
<p>しかし先週から開始した次のアプリの開発では、Quartz と Core Animation を使ってみています。簡単な時計アプリになる予定で、これらのフレームワークでどこまでできるかの試作段階といったところです。その中で 1 つ、詰まった点があったので紹介します。</p>
<p>それはというと、時計の針を描画するところまではよかったのですが、その角度を変えながらアニメーションさせるところで行き詰まったのです。CALayer の「アニメーション可能なプロパティ」 animatable properties (不透明度やサイズなどが含まれます) ならば、値を変えるだけで自動的にアニメーション implicit animation が実行されます。時計の針の角度のような、自分で定義したプロパティでもそれをするにはどうすれば?</p>
<p>Google 検索に 3 時間お付き合いいただいた結果、iPhone OS 3.0 以降なら、CALayer の needsDisplayForKey: クラスメソッドで「変更されたら再描画が必要になるプロパティ」を指定できること、actionForKey: メソッドで「変更されたら実行するアクション (アニメーション)」を指定できることが分かりました。ここまでは簡単に調べられたのですが、時計の針をアニメーションさせるにはもう 1 つ注意すべきことがありました。こちらは後で紹介します。</p>
<p>それより何よりソースコードを見てみましょう。</p>
<p>はじめに、時計の針用のレイヤーを作るコードです:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@implementation</span> ClockView
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>awakeFromNib <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>self setupLayers<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>self start<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>start <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// tick メソッドを呼び出すタイマーを作成</span>
    <span style="color: #400080;">NSTimer</span> <span style="color: #002200;">*</span>timer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTimer</span> scheduledTimerWithTimeInterval<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">/</span><span style="color: #2400d9;">60.0</span> 
        target<span style="color: #002200;">:</span>self
        selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>tick<span style="color: #002200;">&#41;</span>
        userInfo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
        repeats<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
    self.animationTimer <span style="color: #002200;">=</span> timer;
<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>setupLayers <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">/*
     各針用のレイヤーを追加。
     angle を変化させてアニメーションする。
     */</span>
    <span style="color: #002200;">&#123;</span>
        HandLayer <span style="color: #002200;">*</span>hand <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>HandLayer alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
        hand.frame <span style="color: #002200;">=</span> self.frame;
        self.secondHand <span style="color: #002200;">=</span> hand;
        <span style="color: #002200;">&#91;</span>hand release<span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>self.layer addSublayer<span style="color: #002200;">:</span>self.secondHand<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #11740a; font-style: italic;">// ...</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> tick <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// 各針に新しい角度を通知</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>ここまでは大したことはありませんね。次がこの記事の心臓、アニメーション部分です:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> HandLayer <span style="color: #002200;">:</span> CALayer <span style="color: #002200;">&#123;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> CGFloat angle;
&nbsp;
<span style="color: #a61390;">@end</span>
&nbsp;
&nbsp;
<span style="color: #a61390;">@implementation</span> HandLayer
&nbsp;
@dynamic angle;
&nbsp;
<span style="color: #002200;">+</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>needsDisplayForKey<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>aKey <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// angle が変わったら再描画がいるよ</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>aKey isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;angle&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>super needsDisplayForKey<span style="color: #002200;">:</span>aKey<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</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>actionForKey<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> aKey <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>aKey isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;angle&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// angle 用の補間アニメーションを作る</span>
        CABasicAnimation <span style="color: #002200;">*</span>theAnimation <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CABasicAnimation
            animationWithKeyPath<span style="color: #002200;">:</span>aKey<span style="color: #002200;">&#93;</span>;
        <span style="color: #11740a; font-style: italic;">// 注意: fromValue を設定しないと正しくアニメーションしない</span>
        theAnimation.fromValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self presentationLayer<span style="color: #002200;">&#93;</span> valueForKey<span style="color: #002200;">:</span>aKey<span style="color: #002200;">&#93;</span>;
        <span style="color: #a61390;">return</span> theAnimation;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>super actionForKey<span style="color: #002200;">:</span>aKey<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</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>drawInContext<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>CGContextRef<span style="color: #002200;">&#41;</span>context <span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// angle プロパティを参照しながら針を描画</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>theAnimation.fromValue を現在表示中の針の角度に設定していることに注意してください。これがドキュメントを探しても見つけられなかったポイントです。解決できたのは、<a href="http://www.omnigroup.com/blog/entry/Animating_CALayer_content">Omni Group のブログ記事 &#8220;Animating CALayer content&#8221;</a>のおかげでした。その当時は自分で needsDisplayForKey: 周辺の仕組みを実装しないといけなかったんですね。</p>
<p>最後に、動画をどうぞ:</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/4rcE0kOrjVA&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/4rcE0kOrjVA&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="355" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>※ 動画中の針のアニメーションは、アニメーションのローカル時間を決める関数 timingFunction にデフォルトの線形タイプではなく kCAMediaTimingFunctionEaseIn を使っています。</p>
<p>参考:</p>
<ul>
<li><a href="http://developer.apple.com/mac/library/documentation/cocoa/conceptual/CoreAnimation_guide/Introduction/Introduction.html">Core Animation Programming Guide</a></li>
<li><a href="http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/clm/CALayer/needsDisplayForKey:">CALayer needsDisplayForKey:</a></li>
<li><a href="http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/actionForKey:">CALayer actionForKey:</a></li>
</ul>
<p>追記:<br />
実際に実行されている補間アニメーションの開始値 fromValue → 終了値 toValue / 増加値 byValue をログに出してみました。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">2010-03-13 11:12:41.179 app[14615:207] angle \
&lt;CABasicAnimation: 0x3b02620&gt;, 6.283185 -&gt; (null) / (null)</pre></div></div>

<p>fromValue が設定されていて、その他は設定されていないのが分かります。終了値が設定されていないのにどうやって補間しているのかは謎です&#8230;。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=486</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「笑わない数学者 &#8211; 森博嗣 」に出てくる数学パズルをプログラム(Clojure)で解く [吾輩の小説 for iPhone]</title>
		<link>http://blog.moonshine-project.com/ja/?p=460</link>
		<comments>http://blog.moonshine-project.com/ja/?p=460#comments</comments>
		<pubDate>Sat, 13 Mar 2010 11:00:51 +0000</pubDate>
		<dc:creator>ento</dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=460</guid>
		<description><![CDATA[自炊系小説ビューワ「吾輩の小説」で今日も電車で本を読んでいたら、話の中に数学パズルが出てきました。それもそのはず、読んでいたのは森博嗣 による「笑わない数学者」です。


五つのビリヤードの玉を、真珠のネックレスのように、リングにつなげてみるとしよう。玉には、それぞれナンバが書かれている。さて、この五つの玉のうち、幾つ取っても良いが、隣どうしが連続したものしか取れないとしよう。一つでも、二つでも、五つ全部でも良い。しかし、離れているものは取れない。この条件で取った玉のナンバを足し合わせて、1から21までのすべての数ができるようにしたい。さあ、どのナンバの玉を、どのように並べて、ネックレスを作れば良いかな？

うーん、まず1を作るには「1」の玉が必要。次に2を作るには、0+2、1+1の組み合わせがあって、1の玉を2つは入れられないから、「2」の玉も必要だ。と、ここまで考えたところで気付きました。プログラマにはコンピュータという計算の得意な友達がいる！
ということで計算機にパズルを解いてもらいました。言語は、最近はまっているClojureという関数型言語です。

; 名前空間の設定と使うライブラリのインポート
&#40;ns ball-chain
  &#40;:use &#91;clojure.contrib.combinatorics :only &#40;combinations permutations&#41;&#93;&#41;
  &#40;:use clojure.contrib.test-is&#41;&#41;
&#160;
; 玉を定義
&#40;defn balls &#91;&#93; &#40;range 3 15&#41;&#41;
&#160;
; ネックレスの start 番目から length 個だけ取り出して数を合計する関数
&#40;defn take-sum &#91;chain start length&#93;
  &#40;reduce + &#40;for &#91;i &#40;range start &#40;+ start length&#41;&#41;&#93;
	       &#40;nth chain
		    &#40;mod i &#40;count chain&#41;&#41; 1&#41;&#41;&#41;&#41;
&#160;
; ネックレスから玉を取り出して
; [...]]]></description>
			<content:encoded><![CDATA[<p>自炊系小説ビューワ<a href="http://itunes.apple.com/jp/app/id351820519?mt=8">「吾輩の小説」</a>で今日も電車で本を読んでいたら、話の中に数学パズルが出てきました。それもそのはず、読んでいたのは森博嗣 による<a href="http://www.amazon.co.jp/dp/4062646145">「笑わない数学者」</a>です。</p>
<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/V729gFDX7Fw&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/V729gFDX7Fw&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<blockquote><p>
五つのビリヤードの玉を、真珠のネックレスのように、リングにつなげてみるとしよう。玉には、それぞれナンバが書かれている。さて、この五つの玉のうち、幾つ取っても良いが、隣どうしが連続したものしか取れないとしよう。一つでも、二つでも、五つ全部でも良い。しかし、離れているものは取れない。この条件で取った玉のナンバを足し合わせて、1から21までのすべての数ができるようにしたい。さあ、どのナンバの玉を、どのように並べて、ネックレスを作れば良いかな？
</p></blockquote>
<p>うーん、まず1を作るには「1」の玉が必要。次に2を作るには、0+2、1+1の組み合わせがあって、1の玉を2つは入れられないから、「2」の玉も必要だ。と、ここまで考えたところで気付きました。プログラマにはコンピュータという計算の得意な友達がいる！</p>
<p>ということで計算機にパズルを解いてもらいました。言語は、最近はまっている<a href="http://clojure.org/">Clojure</a>という関数型言語です。</p>

<div class="wp_syntax"><div class="code"><pre class="clojure" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">; 名前空間の設定と使うライブラリのインポート</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">ns</span> ball<span style="color: #66cc66;">-</span>chain
  <span style="color: #66cc66;">&#40;</span>:<span style="color: #555;">use</span> <span style="color: #66cc66;">&#91;</span>clojure<span style="color: #66cc66;">.</span>contrib<span style="color: #66cc66;">.</span>combinatorics :<span style="color: #555;">only</span> <span style="color: #66cc66;">&#40;</span>combinations permutations<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>:<span style="color: #555;">use</span> clojure<span style="color: #66cc66;">.</span>contrib<span style="color: #66cc66;">.</span>test<span style="color: #66cc66;">-</span>is<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; 玉を定義</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> balls <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">range</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; ネックレスの start 番目から length 個だけ取り出して数を合計する関数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> take<span style="color: #66cc66;">-</span>sum <span style="color: #66cc66;">&#91;</span>chain start length<span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reduce</span> <span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#91;</span>i <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">range</span> start <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> start length<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
	       <span style="color: #66cc66;">&#40;</span>nth chain
		    <span style="color: #66cc66;">&#40;</span>mod i <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">count</span> chain<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; ネックレスから玉を取り出して</span>
<span style="color: #808080; font-style: italic;">; 合計が number になるようにできるか? を返す関数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> yields? 
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>chain number<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span>not <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">empty?</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">take</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">filter</span> #<span style="color: #66cc66;">&#40;</span>yields? chain number <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">range</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>chain number start<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span>not <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">empty?</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">take</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">filter</span> #<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> number <span style="color: #66cc66;">&#40;</span>take<span style="color: #66cc66;">-</span>sum chain start <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">range</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; ネックレスが条件に合うか? を返す関数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> correct? <span style="color: #66cc66;">&#91;</span>chain<span style="color: #66cc66;">&#93;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">every?</span> identity <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">map</span> #<span style="color: #66cc66;">&#40;</span>yields? chain <span style="color: #66cc66;">%</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">range</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; 玉を組み合わせてネックレスを作る関数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> all<span style="color: #66cc66;">-</span>chains <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">map</span> permutations <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">map</span> #<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">concat</span> <span style="color: #66cc66;">%</span> <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>combinations <span style="color: #66cc66;">&#40;</span>balls<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; ネックレスの組み合わせの中から、条件に合うものを抽出する関数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defn</span> answers <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#91;</span>perms <span style="color: #66cc66;">&#40;</span>all<span style="color: #66cc66;">-</span>chains<span style="color: #66cc66;">&#41;</span> :<span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not-empty</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">filter</span> correct? perms<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">filter</span> correct? perms<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; yields? のテスト</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">deftest</span> test<span style="color: #66cc66;">-</span>yields
  <span style="color: #66cc66;">&#40;</span>is <span style="color: #66cc66;">&#40;</span>yields? <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>is <span style="color: #66cc66;">&#40;</span>yields? <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>is <span style="color: #66cc66;">&#40;</span>yields? <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>is <span style="color: #66cc66;">&#40;</span>yields? <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>is <span style="color: #66cc66;">&#40;</span>yields? <span style="color: #66cc66;">&#40;</span>list <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; テストを実行</span>
<span style="color: #66cc66;">&#40;</span>run<span style="color: #66cc66;">-</span>tests<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; 答えを1つ出力</span>
<span style="color: #66cc66;">&#40;</span>println <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">take</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>answers<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>「1と2の玉が必ずある」という条件を組み込んで、多少の高速化をはかっています。ネックレス状なので右回りも左回りも同等の組み合わせになる、といった条件は考慮できていません。</p>
<p>これを Mac OS X で動かすには、たとえば ball-chain.clj というファイルに保存した上で、以下のように実行します。</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo port install clojure clojure-contrib
$ java -classpath .:/opt/local/share/java/clojure/lib/clojure.jar:/opt/local/share/java/clojure/lib/clojure-contrib.jar clojure.main ball-chain.clj --</pre></div></div>

<p>※ 本来は</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">clj ball-chain.clj</pre></div></div>

<p>だけで実行できるはずなんですが、MacPorts の<a href="http://trac.macports.org/ticket/22889">バグ</a>のため、それには少し設定が必要です。詳しくはリンク先を参照してください。</p>
<p>答え? 答えはネタバレなのでここには書きません。どうしても見たい方は↓へどうぞ</p>
<div style="margin-top: 80em">。。。</div>
<div style="margin-top: 80em">
スクリプトの出力結果はこちら:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ clj ball-chain.clj
&nbsp;
Testing ball-chain
&nbsp;
Ran 1 tests containing 5 assertions.
0 failures, 0 errors.
(((3 10 2 5 1) (3 1 5 2 10) (5 1 3 10 2) (5 2 10 3 1) (10 3 1 5 2) (10 2 5 1 3) (1 3 10 2 5) (1 5 2 10 3) (2 5 1 3 10) (2 10 3 1 5)))</pre></div></div>

<p>1 つ目の答え (3 10 2 5 1) が本当に合っているか、見てみましょう。</p>
<table>
<tr>
<td>1</td>
<td>3 10 2 5 <strong>1</strong></td>
</tr>
<tr>
<td>2</td>
<td>3 10 <strong>2</strong> 5 1</td>
</tr>
<tr>
<td>3</td>
<td><strong>3</strong> 10 2 5 1</td>
</tr>
<tr>
<td>4</td>
<td><strong>3</strong> 10 2 5 <strong>1</strong></td>
</tr>
<tr>
<td>5</td>
<td>3 10 2 <strong>5</strong> 1</td>
</tr>
<tr>
<td>6</td>
<td>3 10 2 <strong>5 1</strong></td>
</tr>
<tr>
<td>7</td>
<td>3 10 <strong>2 5</strong> 1</td>
</tr>
<tr>
<td>8</td>
<td>3 10 <strong>2 5 1</strong></td>
</tr>
<tr>
<td>9</td>
<td><strong>3</strong> 10 2 <strong>5 1</strong></td>
</tr>
<tr>
<td>10</td>
<td>3 <strong>10</strong> 2 5 1</td>
</tr>
<tr>
<td>11</td>
<td><strong>3</strong> 10 <strong>2 5 1</strong></td>
</tr>
<tr>
<td>12</td>
<td>3 <strong>10 2</strong> 5 1</td>
</tr>
<tr>
<td>13</td>
<td><strong>3 10</strong> 2 5 1</td>
</tr>
<tr>
<td>14</td>
<td><strong>3 10</strong> 2 5 <strong>1</strong></td>
</tr>
<tr>
<td>15</td>
<td><strong>3 10 2</strong> 5 1</td>
</tr>
<tr>
<td>16</td>
<td><strong>3 10 2</strong> 5 <strong>1</strong></td>
</tr>
<tr>
<td>17</td>
<td>3 <strong>10 2 5</strong> 1</td>
</tr>
<tr>
<td>18</td>
<td>3 <strong>10 2 5 1</strong></td>
</tr>
<tr>
<td>19</td>
<td><strong>3 10</strong> 2 <strong>5 1</strong></td>
</tr>
<tr>
<td>20</td>
<td><strong>3 10 2 5</strong> 1</td>
</tr>
<tr>
<td>21</td>
<td><strong>3 10 2 5 1</strong></td>
</tr>
</table>
<p>その他の答えも、右回り・左回りを逆にしたり、さらに開始点をずらしたりすることで 1 つ目の答えと同じネックレスになっていることがわかります。
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=460</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「吾輩の小説 for iPhone」レビューへの返信</title>
		<link>http://blog.moonshine-project.com/ja/?p=455</link>
		<comments>http://blog.moonshine-project.com/ja/?p=455#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:35:22 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=455</guid>
		<description><![CDATA[期待 by ｍｓｋｋ &#8211; Version 2.0 &#8211; 2010/03/08
整形表示モード追加に大感謝です。
まさに求めていた機能です。有難うございました。
欲をいえばファイル名の変更が出来るようになると嬉しいです。
あと中途半端な部分でページ送りされるのでその辺を改善して欲しいです。
今後のアップデートも期待しています。

ver 1.0 をリリースしたのち、iPhoneなどの携帯電話の小さい画面で、さらに文字を見やすくする方法を半月ほど調査＆研究していたのですが、やはり整形表示モードのような仕組みを入れるしかないと結論に達して実装しました。今後は整形の精度を上げていきます。
さて、２点ある修正点ですが、まず１つめの「ファイル名の変更」は、開発初期から必要性があると考えていましたので実装します。
２つめの「中途半端な部分でページ送り」は、私がページ送り後にページ送り前の１行を見ながら読まないと内容を把握できないという状態ですので実装は見送らせて頂きます。
ただし、人によって読み方はさまざまですので、まだ決定はしていませんが「吾輩の小説 Pro」という細かい設定が行えるバージョンを出す事を検討しています。
レビューありがとうございました。参考にしながら使いやすいアプリを作っていきます。
]]></description>
			<content:encoded><![CDATA[<blockquote><p>期待 by ｍｓｋｋ &#8211; Version 2.0 &#8211; 2010/03/08</p>
<p>整形表示モード追加に大感謝です。<br />
まさに求めていた機能です。有難うございました。</p>
<p>欲をいえばファイル名の変更が出来るようになると嬉しいです。<br />
あと中途半端な部分でページ送りされるのでその辺を改善して欲しいです。<br />
今後のアップデートも期待しています。
</p></blockquote>
<p>ver 1.0 をリリースしたのち、iPhoneなどの携帯電話の小さい画面で、さらに文字を見やすくする方法を半月ほど調査＆研究していたのですが、やはり整形表示モードのような仕組みを入れるしかないと結論に達して実装しました。今後は整形の精度を上げていきます。</p>
<p>さて、２点ある修正点ですが、まず１つめの「ファイル名の変更」は、開発初期から必要性があると考えていましたので実装します。</p>
<p>２つめの「中途半端な部分でページ送り」は、私がページ送り後にページ送り前の１行を見ながら読まないと内容を把握できないという状態ですので実装は見送らせて頂きます。</p>
<p>ただし、人によって読み方はさまざまですので、まだ決定はしていませんが「吾輩の小説 Pro」という細かい設定が行えるバージョンを出す事を検討しています。</p>
<p>レビューありがとうございました。参考にしながら使いやすいアプリを作っていきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=455</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>猫を抱いて象と泳ぐ – 小川洋子 [吾輩の小説 for iPhone]</title>
		<link>http://blog.moonshine-project.com/ja/?p=448</link>
		<comments>http://blog.moonshine-project.com/ja/?p=448#comments</comments>
		<pubDate>Fri, 05 Mar 2010 05:43:00 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=448</guid>
		<description><![CDATA[
整形モードで見やすくなった「吾輩の小説 ver 2.0」で「猫を抱いて象と泳ぐ」を読む。
主人公の祖母が孫の成長をチェスで知るこのシーンで涙した。
]]></description>
			<content:encoded><![CDATA[<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/YvLT6DACKHQ&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/YvLT6DACKHQ&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>整形モードで見やすくなった<a href="http://itunes.apple.com/jp/app/id351820519?mt=8">「吾輩の小説 ver 2.0」</a>で<a href="http://www.amazon.co.jp/gp/product/4163277501?ie=UTF8&amp;tag=akira00-22&amp;linkCode=xm2&amp;camp=247&amp;creativeASIN=4163277501">「猫を抱いて象と泳ぐ」</a>を読む。</p>
<p>主人公の祖母が孫の成長をチェスで知るこのシーンで涙した。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=448</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>電子出版へのアプローチの手法</title>
		<link>http://blog.moonshine-project.com/ja/?p=442</link>
		<comments>http://blog.moonshine-project.com/ja/?p=442#comments</comments>
		<pubDate>Wed, 03 Mar 2010 03:13:16 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=442</guid>
		<description><![CDATA[iPad/Kindleが発売されて電子書籍市場は今後活性化していくと思います。そして、電子書籍市場への参加の仕方に２つの手法があると思っています。
１つはこちら。今までの印刷業者や書店に置き換わるところを担おうとする方法です。
電子出版はすでに始まっている -- 池田信夫 blog part2
3月1日付で「株式会社アゴラブックス」を設立し、私が代表取締役に就任した。役員兼社員5人の超零細企業だが、4月から電子書籍の刊行を始める予定だ――といっても、設備は何もない。インフラはGoogle Appsで1人年間6000円。システム管理もすべてアウトソースするので、固定費はゼロ。失敗した場合のリスクもほとんどない。
そして、もう１つの可能性を、富士通のScanSnapというスキャナが100万台売れたというところから感じました。
感謝を込めて「ScanSnapシリーズ 100万台突破記念キャンペーン」を開始！
一部の電子書籍ユーザーには自炊とも呼ばれている方法で、自分で書籍をスキャンしてPCやiPhoneなどで読む方法です。前者の電子書籍販売ルートが完璧に構築されれば不必要になると思うので、それまでのつなぎの手法になると思います。
弊社では後者の手法をとっていきます。一時的な需要しかありませんが、前者には無い優れた点として、電子書籍化されていない最新の出版物を楽しめるという非常に大きい利点があるからです。
まずは「吾輩の小説 for iPhone」で、小説をiPhoneで読めるアプリを作りました。
読書記録をつぶやける自炊系の小説ビュワー「我輩の小説」


※整形モードを追加したバージョンは現在申請中です。今週中にリリースされると思います。
]]></description>
			<content:encoded><![CDATA[<p>iPad/Kindleが発売されて電子書籍市場は今後活性化していくと思います。そして、電子書籍市場への参加の仕方に２つの手法があると思っています。</p>
<p>１つはこちら。今までの印刷業者や書店に置き換わるところを担おうとする方法です。</p>
<p><a href="http://ikedanobuo.livedoor.biz/archives/51385545.html">電子出版はすでに始まっている -- 池田信夫 blog part2</a></p>
<blockquote><p>3月1日付で「株式会社アゴラブックス」を設立し、私が代表取締役に就任した。役員兼社員5人の超零細企業だが、4月から電子書籍の刊行を始める予定だ――といっても、設備は何もない。インフラはGoogle Appsで1人年間6000円。システム管理もすべてアウトソースするので、固定費はゼロ。失敗した場合のリスクもほとんどない。</p></blockquote>
<p>そして、もう１つの可能性を、富士通のScanSnapというスキャナが100万台売れたというところから感じました。</p>
<p><a href="http://scansnap.fujitsu.com/jp/campaign/index.html?userid=ss01">感謝を込めて「ScanSnapシリーズ 100万台突破記念キャンペーン」を開始！</a></p>
<p>一部の電子書籍ユーザーには自炊とも呼ばれている方法で、自分で書籍をスキャンしてPCやiPhoneなどで読む方法です。前者の電子書籍販売ルートが完璧に構築されれば不必要になると思うので、それまでのつなぎの手法になると思います。</p>
<p>弊社では後者の手法をとっていきます。一時的な需要しかありませんが、前者には無い優れた点として、電子書籍化されていない最新の出版物を楽しめるという非常に大きい利点があるからです。</p>
<p>まずは<a href="http://blog.moonshine-project.com/ja/?p=419">「吾輩の小説 for iPhone」</a>で、小説をiPhoneで読めるアプリを作りました。</p>
<p><a href="http://blog.moonshine-project.com/ja/?p=419">読書記録をつぶやける自炊系の小説ビュワー「我輩の小説」</a></p>
<p><a href="http://itunes.apple.com/jp/app/id354084841?mt=8"><img src="http://blog.moonshine-project.com/ja/files/2010/02/nvv0_icon_reflection_96x100.png" alt="nvv0_icon_reflection_96x100" width="96" height="100" class="alignnone size-full wp-image-415" /></a><a href="http://itunes.apple.com/jp/app/id351820519?mt=8"><img src="http://blog.moonshine-project.com/ja/files/2010/02/nvv1_icon_reflection_96x100.png" alt="nvv1_icon_reflection_96x100" width="96" height="100" class="alignnone size-full wp-image-416" /></a></p>
<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/8tbMs1r9X24&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/8tbMs1r9X24&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>※整形モードを追加したバージョンは現在申請中です。今週中にリリースされると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=442</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>殺戮にいたる病 &#8211; 我孫子武丸 [我輩の小説 for iPhone]</title>
		<link>http://blog.moonshine-project.com/ja/?p=437</link>
		<comments>http://blog.moonshine-project.com/ja/?p=437#comments</comments>
		<pubDate>Sun, 14 Feb 2010 11:07:26 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=437</guid>
		<description><![CDATA[
「オチがめちゃめちゃびっくりする日本の小説教えて」 を見て、中学生の頃にかなりハマった「かまいたちの夜」の作者「我孫子武丸」による「殺戮にいたる病」があったので、購入＆裁断＆スキャンして「我輩の小説」で読みました。
サスペンスものは話が複雑で登場人物も多いですよね。話を理解するために名前などをメモに追加していったら、なにやら死亡者リストが出来てしまいました。おそろしい。。。
]]></description>
			<content:encoded><![CDATA[<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/RKVwDbvuaS4&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/RKVwDbvuaS4&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p><a href="http://mudainodqnment.blog35.fc2.com/blog-entry-1161.html">「オチがめちゃめちゃびっくりする日本の小説教えて」</a> を見て、中学生の頃にかなりハマった「かまいたちの夜」の作者「我孫子武丸」による「殺戮にいたる病」があったので、購入＆裁断＆スキャンして<a href="http://itunes.apple.com/jp/app/id354084841?mt=8">「我輩の小説」</a>で読みました。</p>
<p>サスペンスものは話が複雑で登場人物も多いですよね。話を理解するために名前などをメモに追加していったら、なにやら死亡者リストが出来てしまいました。おそろしい。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=437</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>涼宮ハルヒの消失 &#8211; 谷川流 [我輩の小説 for iPhone]</title>
		<link>http://blog.moonshine-project.com/ja/?p=430</link>
		<comments>http://blog.moonshine-project.com/ja/?p=430#comments</comments>
		<pubDate>Sun, 14 Feb 2010 10:22:20 +0000</pubDate>
		<dc:creator>akiraak</dc:creator>
				<category><![CDATA[吾輩の小説]]></category>

		<guid isPermaLink="false">http://blog.moonshine-project.com/ja/?p=430</guid>
		<description><![CDATA[
「映画 : 涼宮ハルヒの消失」を観て、手持ちの文庫を読み直したくなったので、裁断＆スキャンし「我輩の小説」で読んでみました。
アニメでもそうでしたが、ハルヒの原作再現度はかなり高いですよね。とくにセリフなんて全く一緒じゃないですかね。それは、ハルヒは過去と未来を行き来きし、パズルを合わせていくような話なので、原作を忠実に再現しないと話に矛盾がでてきてしまうからだと思いました。
読了です。
]]></description>
			<content:encoded><![CDATA[<p><!-- Smart Youtube --><span class="youtube"><object width="480" height="360"><param name="movie" value="http://www.youtube.com/v/2Kikf-VR3Lk&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" /><param name="allowFullScreen" value="true" /><embed wmode="transparent" src="http://www.youtube.com/v/2Kikf-VR3Lk&amp;rel=1&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=&amp;fs=1&amp;hl=en&amp;autoplay=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;ap=%2526fmt%3D22" type="application/x-shockwave-flash" allowfullscreen="true" width="480" height="360" ></embed><param name="wmode" value="transparent" /></object></span></p>
<p>「映画 : 涼宮ハルヒの消失」を観て、手持ちの文庫を読み直したくなったので、裁断＆スキャンし<a href="http://itunes.apple.com/jp/app/id354084841?mt=8">「我輩の小説」</a>で読んでみました。</p>
<p>アニメでもそうでしたが、ハルヒの原作再現度はかなり高いですよね。とくにセリフなんて全く一緒じゃないですかね。それは、ハルヒは過去と未来を行き来きし、パズルを合わせていくような話なので、原作を忠実に再現しないと話に矛盾がでてきてしまうからだと思いました。</p>
<p>読了です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.moonshine-project.com/ja/?feed=rss2&amp;p=430</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
