<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2japanesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Rest Term</title>
	
	<link>http://rest-term.com</link>
	<description>Development and Creative Playground::Flash, Flex, Java and XML...</description>
	<lastBuildDate>Sat, 31 Oct 2009 08:21:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/rest-term" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.co.jp/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://img.yahoo.co.jp/i/jp/my/addtomy1.gif">myyahoo???</feedburner:feedFlare><feedburner:feedFlare href="http://feedpath.jp/feedreader/feeds_add?url=http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://feedpath.jp/common/images/sub_feedpath.gif">feedpath???</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/rest-term" src="http://www.bloglines.com/images/sub_modern11.gif">Bloglines???</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://buttons.googlesyndication.com/fusion/add.gif">Google???</feedburner:feedFlare><feedburner:feedFlare href="http://r.hatena.ne.jp/append/http://feeds.feedburner.com/rest-term" src="http://r.hatena.ne.jp/images/addto_w.gif">???RSS???</feedburner:feedFlare><feedburner:feedFlare href="http://reader.livedoor.com/subscribe/http://feeds.feedburner.com/rest-term" src="http://image.reader.livedoor.com/img/banner/91_17_1.gif">Livedoor???????</feedburner:feedFlare><feedburner:feedFlare href="http://reader.goo.ne.jp/web/bookmarklet.html?,,http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://reader.goo.ne.jp/web/img/addwebrss.gif">goo RSS???????</feedburner:feedFlare><feedburner:feedFlare href="http://www.fenrir.co.jp/rd/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://images2.fenrir.co.jp/fb/sleipnir_feed.gif">Sleipnir に追加</feedburner:feedFlare><feedburner:feedFlare href="http://reader.excite.co.jp/subscribe/?url=http%3A%2F%2Ffeeds.feedburner.com%2Frest-term" src="http://reader.excite.co.jp/images/add_rss_excitereader.gif">エキサイトリーダーに登録</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>10月おわり</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/skRY1Lhls0A/</link>
		<comments>http://rest-term.com/archives/2536/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 08:21:01 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[design/art]]></category>
		<category><![CDATA[diary]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2536</guid>
		<description><![CDATA[				最近は天気のいい日が多いので、お昼休憩は外に出ています。
				同期や先輩達と食べるのはいいんですが、週1,2くらいはひとりまったりと過ごす時間を作ろうかと。
				
				会社近くの檜町公園やミッドタウンガーデンっていう所でサンドイッチとか食べてますｖ
				
				
				今はミッドタウンでDESIGN TOUCHっていうイベントの期間中で、今日は熱気球が上がってました。
				けっこう近くで見たんですが、ゴーっていう炎の音がすごいんですね。
				
				あと、ガレリアB1Fではデザイン展が開かれていて、初期のApple Mouseとか展示してあって面白かったです。
				11月からは忙しくなるので、今の内に元気を溜めておこう。
]]></description>
			<content:encoded><![CDATA[				<p>最近は天気のいい日が多いので、お昼休憩は外に出ています。<br />
				同期や先輩達と食べるのはいいんですが、週1,2くらいはひとりまったりと過ごす時間を作ろうかと。</p>
				<p><span id="more-2536"></span><br />
				会社近くの檜町公園やミッドタウンガーデンっていう所でサンドイッチとか食べてますｖ</p>
				<p><img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00847.JPG" alt="DSC00847" title="DSC00847" width="320" height="240" class="alignnone size-full wp-image-2537" /><img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00845.JPG" alt="DSC00845" title="DSC00845" width="320" height="240" class="alignnone size-full wp-image-2547" /><br />
				<img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00844.JPG" alt="DSC00844" title="DSC00844" width="320" height="240" class="alignnone size-full wp-image-2541" /><img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00868.JPG" alt="DSC00868" title="DSC00868" width="320" height="240" class="alignnone size-full wp-image-2542" /></p>
				<p>今はミッドタウンで<a href="http://www.tokyo-midtown.com/jp/designtouch/2009/index.html" title="東京ミッドタウン／DESIGN TOUCH 2009">DESIGN TOUCH</a>っていうイベントの期間中で、今日は熱気球が上がってました。<br />
				けっこう近くで見たんですが、ゴーっていう炎の音がすごいんですね。</p>
				<p><img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00848.JPG" alt="DSC00848" title="DSC00848" width="320" height="240" class="alignnone size-full wp-image-2544" /><img src="http://rest-term.com/wp-content/uploads/2009/10/DSC00849.JPG" alt="DSC00849" title="DSC00849" width="320" height="240" class="alignnone size-full wp-image-2545" /></p>
				<p>あと、ガレリアB1Fではデザイン展が開かれていて、初期のApple Mouseとか展示してあって面白かったです。</p>
				<p>11月からは忙しくなるので、今の内に元気を溜めておこう。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=skRY1Lhls0A:C489S8X7J74:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=skRY1Lhls0A:C489S8X7J74:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2536/</feedburner:origLink></item>
		<item>
		<title>OpenCV 2.0 – cv::Mat 行列演算</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/0UgZ2Q_bJAo/</link>
		<comments>http://rest-term.com/archives/2484/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 07:21:37 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2484</guid>
		<description><![CDATA[				前回に引き続き、cv::Matクラスについて。
				今回は行列演算に関する機能を使います。
				
				上記のシンプルな連立一次方程式を cv::Mat クラスの機能を使って解いてみます。
				• 出力結果
				
1.0　// x
3.0　// y
2.0　// z

				CvMatでは cvmInvert -> cvmMul と関数を順番に呼び出さないといけないところを、
				cv::Matなら matX = matA.inv()*matB のように直感的に行列演算を行うことができます。
				また、今回のような線形な問題であれば solve(matA, matB, matX) で解くこともできます。
				基本的な行列演算
				
				
				 
				CvMat
				cv::Mat
				
				
				X = A + B
				cvmAdd(A, B, X)
				X = A + B
				
				
				X = A &#8211; B
				cvmSub(A, B, X)
				X = A &#8211; B
				
				
				X = AB
				cvmMul(A, B, X)
				X = A * B
				
				
				X = A-1 (逆行列)
				cvmInvert(A, X)
				X = A.inv()
				
				
				X = [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://rest-term.com/archives/2445/">前回</a>に引き続き、<strong>cv::Mat</strong>クラスについて。<br />
				今回は行列演算に関する機能を使います。</p>
				<p><img src="http://rest-term.com/wp-content/uploads/2009/10/houteisiki.png" alt="houteisiki" title="houteisiki" width="170" height="82" class="alignnone size-full wp-image-2512" /></p>
				<p>上記のシンプルな連立一次方程式を cv::Mat クラスの機能を使って解いてみます。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
// 係数行列 A
float dataA[][3] = { {1.0, -2.0, 3.0}, {3.0, 1.0, -5.0}, {-2.0, 6.0, -9.0} };
// 行列 B
float dataB[] = {1.0, -4.0, -2.0};
Mat matA(3, 3, CV_32FC1, dataA);
Mat matB(3, 1, CV_32FC1, dataB);
Mat matX(3, 1, CV_32FC1);

// AX = B を解く. 両辺にAの逆行列を前掛けする
matX = matA.inv()*matB;

MatConstIterator_&lt;float&gt; iter = matX.begin&lt;float&gt;();
while(iter != matX.end&lt;float&gt;()) printf(&quot;%.1f\n&quot;, *iter++);
</pre>
				<p>• 出力結果</p>
				<pre>
1.0　// x
3.0　// y
2.0　// z
</pre>
				<p>CvMatでは cvmInvert -> cvmMul と関数を順番に呼び出さないといけないところを、<br />
				cv::Matなら matX = matA.inv()*matB のように直感的に行列演算を行うことができます。<br />
				また、今回のような線形な問題であれば solve(matA, matB, matX) で解くこともできます。</p>
				<h3>基本的な行列演算</h3>
				<table>
				<tr>
				<th> </th>
				<th>CvMat</th>
				<th>cv::Mat</th>
				</tr>
				<tr>
				<td>X = A + B</td>
				<td>cvmAdd(A, B, X)</td>
				<td>X = A + B</td>
				</tr>
				<tr>
				<td>X = A &#8211; B</td>
				<td>cvmSub(A, B, X)</td>
				<td>X = A &#8211; B</td>
				</tr>
				<tr>
				<td>X = AB</td>
				<td>cvmMul(A, B, X)</td>
				<td>X = A * B</td>
				</tr>
				<tr>
				<td>X = A<span style="vertical-align:super; font-size:80%;">-1</span> (逆行列)</td>
				<td>cvmInvert(A, X)</td>
				<td>X = A.inv()</td>
				</tr>
				<tr>
				<td>X = A<span style="vertical-align:super; font-size:80%;">T</span> (転置行列)</td>
				<td>cvmTranspose(A, X)</td>
				<td>X = A.t()</td>
				</tr>
				<tr>
				<td>X = A・B (内積)</td>
				<td>cvmDotProduct(A, B)</td>
				<td>X = A.dot(B)</td>
				</tr>
				<tr>
				<td>X = A × B (外積)</td>
				<td>cvmCrossProduct(A, B, X)</td>
				<td>X = A.cross(B)</td>
				</tr>
				<tr>
				<td>&#x7c;A&#x7c; (行列式)</td>
				<td>cvmDet(A)</td>
				<td>determinant(A)</td>
				</tr>
				</table>
				<p>以下のような細かい操作もできます。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
matA*5.0;　// 行列の各要素に5を掛ける (スケーリング)

matA.row(0) = matA.row(2)*2.0;　// 3行目をスケーリングして1行目に (添字に注意)
</pre>
				<p>また、Matlabスタイルの行列初期化関数も用意されています。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
Mat zero = Mat::zeros(3, 3, CV_32FC1);　// 零行列を生成
Mat eye = Mat::eye(3, 3, CV_32FC1);　// 単位行列を生成
Mat one = Mat::ones(3, 3, CV_32FC1);　// 全要素が 1 の行列を生成
</pre>
				<p>これ以外にもまだまだたくさんの機能があります。<br />
				今まで面倒だった行列演算がかなり楽になるのでうれしいですね。</p>
				<p>関連記事：<br />
				<a href="http://rest-term.com/archives/2445/" title="OpenCV 2.0 – cv::Mat">OpenCV 2.0 – cv::Mat</a><br />
				<a href="http://rest-term.com/archives/2418/" title="OpenCV 2.0 – cv::Ptr">OpenCV 2.0 – cv::Ptr</a><br />
				<a href="http://rest-term.com/archives/2402/" title="OpenCV 2.0を試してみた">OpenCV 2.0を試してみた</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=0UgZ2Q_bJAo:VFNzYXAG3_c:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=0UgZ2Q_bJAo:VFNzYXAG3_c:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2484/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2484/</feedburner:origLink></item>
		<item>
		<title>OpenCV 2.0 – cv::Mat</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/CtBzplVhfRM/</link>
		<comments>http://rest-term.com/archives/2445/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 05:46:03 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2445</guid>
		<description><![CDATA[				OpenCV C++ matrix class
				前回、OpenCV 2.0 – cv::Ptr ではスマートポインタである cv::Ptr について調べました。
				今回はOpenCV 2.0のC++インタフェースの中でも重要な役割を持つ cv::Mat クラスについて。
				このクラスは従来の IplImage 及び CvMat に取って代わるものになっていますが、
				かなり大きいクラスなので何回かに分けて調べていきたいと思います。
				cv::Mat はマルチチャンネルとROI(Region Of Interest)をサポートしている二次元行列です。
				オブジェクトの生成方法は複数ありますが、ここでは基本的な方法から紹介します。
				次はMatクラスの構造について。
				gdbで上のコードのmatAを見てみると、
				
(gdb) p matA
$1 = {
  flags = 1124024336,
  rows = 5,
  cols = 5,
  step = 15,
  data = 0xb07ff0 "",
  refcount = 0xb0803c,
  datastart = 0xb07ff0 "",
  [...]]]></description>
			<content:encoded><![CDATA[				<blockquote><p>OpenCV C++ matrix class</p></blockquote>
				<p>前回、<a href="http://rest-term.com/archives/2418/" title="OpenCV 2.0 – cv::Ptr">OpenCV 2.0 – cv::Ptr</a> ではスマートポインタである cv::Ptr について調べました。<br />
				今回はOpenCV 2.0のC++インタフェースの中でも重要な役割を持つ <strong>cv::Mat</strong> クラスについて。<br />
				このクラスは従来の <strong>IplImage</strong> 及び <strong>CvMat</strong> に取って代わるものになっていますが、<br />
				かなり大きいクラスなので何回かに分けて調べていきたいと思います。</p>
				<p>cv::Mat はマルチチャンネルとROI(Region Of Interest)をサポートしている二次元行列です。<br />
				オブジェクトの生成方法は複数ありますが、ここでは基本的な方法から紹介します。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
using namespace cv;
using namespace std;

// create() メソッド　(5行5列，各要素が8ビット符号なし整数型 3チャンネル)
// タイプ指定：CV_&lt;bit-depth&gt;{U|S|F}C&lt;number_of_channels&gt;
Mat matA;
matA.create(5, 5, CV_8UC3);

// コンストラクタ　(3行3列，各要素が32ビット浮動小数点型 1チャンネル)
Mat matB(3, 3, CV_32FC1);

// コンストラクタの引数に cv::Size を指定
Mat matC(Size(640, 480), CV_8UC3);

// 二次元配列を使って初期化
double data[][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
Mat matD(Size(3, 3), CV_64FC1, data);

// std::vector を使って初期化
// デフォルトでは浅いコピー、第二引数にtrueを指定すると深いコピーになる
// この場合、10行1列の行列が生成され、要素は全て0で初期化される
vector&lt;double&gt; v(10);
Mat matE(v);　// or Mat matE(v, true);

// cv::Scalar を使って初期化
Mat matF(5, 5, CV_32FC2, Scalar(1.0, 3.0));

// コピーコンストラクタ (浅いコピー, refcount++)
Mat copy(matA);

// clone() メソッド　(深いコピー)
Mat clone = matA.clone();

// ROIを設定 (cv::Rect で位置と大きさを指定)
Mat roi(matC, Rect(10, 10, 100, 100));

// IplImage から cv::Mat に変換
IplImage* src_img = cvLoadImage(&quot;lena.jpg&quot;, CV_LOAD_IMAGE_COLOR);
Mat img(src_img);

// CvMat から cv::Mat に変換
CvMat* cv_mat = cvCreateMat(3, 3, CV_32FC1);
Mat mat(cv_mat);
</pre>
				<p>次はMatクラスの構造について。<br />
				gdbで上のコードのmatAを見てみると、</p>
				<pre>
(gdb) p matA
$1 = {
  flags = 1124024336,
  rows = 5,
  cols = 5,
  step = 15,
  data = 0xb07ff0 "",
  refcount = 0xb0803c,
  datastart = 0xb07ff0 "",
  dataend = 0xb0803b ""
}
</pre>
				<table>
				<tr>
				<td>flags</td>
				<td>//</td>
				</tr>
				<tr>
				<td>rows</td>
				<td>行数</td>
				</tr>
				<tr>
				<td>cols</td>
				<td>列数</td>
				</tr>
				<tr>
				<td>step</td>
				<td>一行のバイト数</td>
				</tr>
				<tr>
				<td>data</td>
				<td>データへのポインタ</td>
				</tr>
				<tr>
				<td>refcount</td>
				<td>参照カウントへのポインタ</td>
				</tr>
				<tr>
				<td>datastart</td>
				<td>データの始まりへのポインタ</td>
				</tr>
				<tr>
				<td>dataend</td>
				<td>データの終わりへのポインタ</td>
				</tr>
				</table>
				<p>メンバは基本的にCvMatと同様のものを備えています。<br />
				flagsはMatクラスの各メソッドで内部的に利用されているものなので特に気にしなくて構いません。<br />
				また、サイズはIplImageと比べるとかなり小さく、sizeofしてみるとIplImageは112、Matは32となっています。</p>
				<p>各要素のアドレスは以下のように計算します。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
// M(i, j) の要素のアドレス

// elemSize() は1要素のバイト数を返す
M.data + M.step*i + j*M.elemSize()

// 要素の型が既知の場合は at(int y, int x) が利用可能
// 内部では、指定された型のポインタでキャストされた (data + step*y)[x] がreturnされている
&amp;M.at&lt;double&gt;(i, j)

---------------------------------------
// 各行の先頭アドレスは ptr(int y) で取得可能　(内部では、return data + step*y)
// 型指定しない場合は uchar* が返される
M.ptr&lt;double&gt;(y)
M.ptr(y)
</pre>
				<p>とりあえず今回はcv::Matクラスの構造を主に紹介しました。<br />
				次からは実際にこのクラスを利用していろいろな処理を行いたいと思います。</p>
				<p>:: 追記<br />
				＊ IplImage, CvMat と cv::Mat の互換性について<br />
				とりあえず、ドキュメントに載っていたコードを使って確認を行いました。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
/* IplImage -&gt; cv::Mat -&gt; CvMat の順で変換 */

IplImage* img = cvLoadImage(&quot;lena.jpg&quot;, CV_LOAD_IMAGE_COLOR);
Mat mtx(img);
CvMat oldmat = mtx;

// OpenCV Error: Assertion failed~ は発生しないことを確認
CV_Assert(oldmat.cols == img-&gt;width &amp;&amp; oldmat.rows == img-&gt;height
  &amp;&amp; oldmat.data.ptr == (uchar*)img-&gt;imageData &amp;&amp; oldmat.step == img-&gt;widthStep);
</pre>
				<p>関連記事：<br />
				<a href="http://rest-term.com/archives/2418/" title="OpenCV 2.0 – cv::Ptr">OpenCV 2.0 – cv::Ptr</a><br />
				<a href="http://rest-term.com/archives/2402/" title="OpenCV 2.0を試してみた">OpenCV 2.0を試してみた</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=CtBzplVhfRM:UtU4mJPO4t0:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=CtBzplVhfRM:UtU4mJPO4t0:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2445/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2445/</feedburner:origLink></item>
		<item>
		<title>OpenCV 2.0 – cv::Ptr</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/WuVq0ee23ag/</link>
		<comments>http://rest-term.com/archives/2418/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 15:39:16 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2418</guid>
		<description><![CDATA[				A template class for smart reference-counting pointers
				OpenCV 2.0では cv::Ptr という参照カウント方式のスマートポインタが用意されています。
				これは Boost C++ Library の shared_ptr と同様のもので大変便利です。
				参考：参照カウント &#8211; Wikipedia
				一時的にcv::Ptrクラスのrefcountというメンバをprotectedからpublicに変更して挙動を見てみます。
				(cxcore.hppの660行目付近にあります)
				すばらしい。
				また、IplImage に適用した場合はきちんとテンプレートの特殊化が施されているので安心です。
				OpenCV 1.0ではメモリのアロケートに cvAlloc() という malloc() のラッパーが使われていましたが、
				OpenCV 2.0ではその代わりに fastMalloc() という関数が用意され、cv::Ptr内でもコールされています。
				少し中を覗いてみると、どうやらシステムコールの mmap() でアロケートしているようです。
				(Windowsでは普通のmalloc()が呼ばれる模様)
				詳しくはまだ読めていませんが、fastというくらいだからきっと速くなっているんでしょう。
				メモリ管理を cv::Ptr に任せておくと開発が楽になるのは間違いなさそうです。
				関連記事：
				OpenCV 2.0を試してみた
]]></description>
			<content:encoded><![CDATA[				<blockquote><p>A template class for smart reference-counting pointers</p></blockquote>
				<p>OpenCV 2.0では <strong>cv::Ptr</strong> という参照カウント方式のスマートポインタが用意されています。<br />
				これは Boost C++ Library の shared_ptr と同様のもので大変便利です。<br />
				参考：<a href="http://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88" title="参照カウント - Wikipedia">参照カウント &#8211; Wikipedia</a></p>
				<p>一時的にcv::Ptrクラスのrefcountというメンバをprotectedからpublicに変更して挙動を見てみます。<br />
				(cxcore.hppの660行目付近にあります)</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
class Test {
public:
  Test() { std::cout&lt;&lt;&quot;construct&quot;&lt;&lt;std::endl; }
  ~Test() { std::cout&lt;&lt;&quot;destruct&quot;&lt;&lt;std::endl; }
};

int main(void) {
  using namespace std;
  cv::Ptr&lt;Test&gt; p1(new Test());  // 参照カウント 1
  cout&lt;&lt;&quot;refcount: &quot;&lt;&lt;*(p1.refcount)&lt;&lt;endl;
  {
    cv::Ptr&lt;Test&gt; p2;
    p2 = p1;  // 参照カウントが+1されて2になる
    cout&lt;&lt;&quot;refcount: &quot;&lt;&lt;*(p1.refcount)&lt;&lt;endl;
  }  // 参照カウントが-1されて1になる、まだオブジェクトは解放されない
  cout&lt;&lt;&quot;refcount: &quot;&lt;&lt;*(p1.refcount)&lt;&lt;endl;
  cout&lt;&lt;&quot;main exit&quot;&lt;&lt;endl;
  return 0;
}  // Testオブジェクトが解放される

--------------
/** 結果
 construct
 refcount: 1
 refcount: 2
 refcount: 1
 main exit
 destruct
**/
</pre>
				<p>すばらしい。<br />
				また、IplImage に適用した場合はきちんとテンプレートの特殊化が施されているので安心です。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
int main(void) {
  cv::Ptr&lt;IplImage&gt; img = cvLoadImage(&quot;test.jpg&quot;);

  if(img.empty()) {
    std::cerr&lt;&lt;&quot;can&#039;t load image.&quot;&lt;&lt;std::endl;
    return -1;
  }

  namedWindow(&quot;image&quot;, CV_WINDOW_AUTOSIZE);
  imshow(&quot;image&quot;, Mat(img));
  waitKey();

  return 0;
}

--------------------------------------------------------------------
/* 参照カウント(refcount)が0になると Ptr::delete_obj() が呼ばれる
 CvMatやIplImageは以下のように特殊化されている */
template&lt;&gt; inline void Ptr&lt;CvMat&gt;::delete_obj()
{ cvReleaseMat(&amp;obj); }   

template&lt;&gt; inline void Ptr&lt;IplImage&gt;::delete_obj()
{ cvReleaseImage(&amp;obj); }
</pre>
				<p>OpenCV 1.0ではメモリのアロケートに cvAlloc() という malloc() のラッパーが使われていましたが、<br />
				OpenCV 2.0ではその代わりに fastMalloc() という関数が用意され、cv::Ptr内でもコールされています。<br />
				少し中を覗いてみると、どうやらシステムコールの mmap() でアロケートしているようです。<br />
				(Windowsでは普通のmalloc()が呼ばれる模様)<br />
				詳しくはまだ読めていませんが、fastというくらいだからきっと速くなっているんでしょう。</p>
				<p>メモリ管理を cv::Ptr に任せておくと開発が楽になるのは間違いなさそうです。</p>
				<p>関連記事：<br />
				<a href="http://rest-term.com/archives/2402/" title="OpenCV 2.0を試してみた">OpenCV 2.0を試してみた</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=WuVq0ee23ag:lijvtrhF_V0:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=WuVq0ee23ag:lijvtrhF_V0:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2418/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2418/</feedburner:origLink></item>
		<item>
		<title>OpenCV 2.0を試してみた</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/y0EjYAQaOj4/</link>
		<comments>http://rest-term.com/archives/2402/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 12:20:21 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2402</guid>
		<description><![CDATA[				この連休中にちょっとOpenCV 2.0で遊んでいました。
				ライブラリの規模がかなり大きくなったのでソースを読むのも大変です；
				IplImage や CvMat は 新しいC++インタフェースでは cv::Mat に取って代わります。
				(1.1preで追加されたWImageクラスの立場は?  関連：cv::WImage – OpenCV 1.1)
				また、メモリ管理が賢くなっているので、後始末は各クラスのデストラクタに任せておきましょう。
				boostのshared_ptrと同様のスマートポインタ(cv::Ptr)も用意されていて、いろいろ便利になっているようです。
				C++インタフェースを中心にこれから少しずつ調べていこうと思います。
				
]]></description>
			<content:encoded><![CDATA[				<p>この連休中にちょっとOpenCV 2.0で遊んでいました。<br />
				ライブラリの規模がかなり大きくなったのでソースを読むのも大変です；</p>
				<p>IplImage や CvMat は 新しいC++インタフェースでは cv::Mat に取って代わります。<br />
				(1.1preで追加されたWImageクラスの立場は?  関連：<a href="http://rest-term.com/archives/1156/" title="cv::WImage – OpenCV 1.1">cv::WImage – OpenCV 1.1</a>)<br />
				また、メモリ管理が賢くなっているので、後始末は各クラスのデストラクタに任せておきましょう。<br />
				boostのshared_ptrと同様のスマートポインタ(cv::Ptr)も用意されていて、いろいろ便利になっているようです。</p>
				<p>C++インタフェースを中心にこれから少しずつ調べていこうと思います。</p>
				<p><a href="http://rest-term.com/wp-content/uploads/2009/10/opencv2.0_test.png"><img src="http://rest-term.com/wp-content/uploads/2009/10/opencv2.0_test-300x187.png" alt="opencv2.0_test" title="opencv2.0_test" width="300" height="187" class="alignnone size-medium wp-image-2407" /></a></p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
// カメラから画像をキャプチャ

#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;

int main(int argc, char **argv) {
  using namespace cv;
  VideoCapture cap(0);  // VideoCapture(int device)
  if(!cap.isOpened()) return -1;
  Mat edges;
  char code;
  namedWindow(&quot;OpenCV 2.0 Capture Test&quot;, CV_WINDOW_AUTOSIZE);
  for(;;) {
    Mat frame;
    cap &gt;&gt; frame;  // virtual VideoCapture&amp;  operator &gt;&gt; (Mat&amp; image)
    cvtColor(frame ,edges, CV_BGR2GRAY);
    GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
    Canny(edges, edges, 0, 30, 3);
    imshow(&quot;OpenCV 2.0 Capture Test&quot;, edges);
    code = waitKey(30);
    if(code == &#039;q&#039;) break;
    if(code == &#039;s&#039;) imwrite(&quot;test.jpg&quot;, edges);
  }
  return 0;
}
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=y0EjYAQaOj4:DKr8Rb89Uaw:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=y0EjYAQaOj4:DKr8Rb89Uaw:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2402/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2402/</feedburner:origLink></item>
		<item>
		<title>Thriftでバイナリデータを扱う</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/3c_jW7dqq6Q/</link>
		<comments>http://rest-term.com/archives/2393/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 14:49:32 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2393</guid>
		<description><![CDATA[				Thriftでバイナリデータをやりとりする方法。
				以前、FlexでXML-RPCを利用していた時は、確かbase64にエンコードして返していたと思うので、
				Thriftでも同様にバイナリデータはbase64にエンコードして返すようにします。
				Thriftのソースを漁っていると TBase64Utils とかいうのを見つけたのですが、
				どうせboost必須なフレームワークなのでboostを使ってエンコードしてみます。
				インタフェースとして、
				・サービス名を Test
				・プロシージャ名を returnImage
				・引数は画像ファイル名、戻り値はbase64エンコード文字列
				を定義します。
				
#!/usr/bin/thrift

service Test {
  string returnImage(1: string name)
}

				画像ファイルを読み込んで、base64にエンコードするだけの処理です。
				boostでbase64にエンコードする方法は以下のサイトを参考にさせていただきました。
				B Lifeで行こう: boostでbase64のエンコード
				ここではハンドラの部分のみ、自動生成部分は省略します。
				次にクライアントを今回はPHPで書きます。
				RPCで受け取ったbase64エンコード文字列をimgタグに埋め込んで画面に表示します。
				こんな感じで一応上手く表示まで行うことができました。
				サーバ側で画像処理を行った後、出力画像をクライアントに返す時などに使えます。
				楽な方法なんですが、大きな画像データをやりとりするのには向いてないですね；；
				もうちょっと良い方法を探してみます。
				・関連記事
				Thrift + OpenCV
				Thrift::例外処理
				Thriftインストール
]]></description>
			<content:encoded><![CDATA[				<p>Thriftでバイナリデータをやりとりする方法。</p>
				<p>以前、FlexでXML-RPCを利用していた時は、確かbase64にエンコードして返していたと思うので、<br />
				Thriftでも同様にバイナリデータはbase64にエンコードして返すようにします。<br />
				Thriftのソースを漁っていると TBase64Utils とかいうのを見つけたのですが、<br />
				どうせboost必須なフレームワークなのでboostを使ってエンコードしてみます。</p>
				<p>インタフェースとして、<br />
				・サービス名を Test<br />
				・プロシージャ名を returnImage<br />
				・引数は画像ファイル名、戻り値はbase64エンコード文字列<br />
				を定義します。</p>
				<pre>
#!/usr/bin/thrift

service Test {
  string returnImage(1: string name)
}
</pre>
				<p>画像ファイルを読み込んで、base64にエンコードするだけの処理です。<br />
				boostでbase64にエンコードする方法は以下のサイトを参考にさせていただきました。<br />
				<a href="http://babei.sblo.jp/article/25063647.html" title="B Lifeで行こう: boostでbase64のエンコード">B Lifeで行こう: boostでbase64のエンコード</a></p>
				<p>ここではハンドラの部分のみ、自動生成部分は省略します。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
class TestHandler : virtual public TestIf {

 public:
  TestHandler() {
  }

  void returnImage(std::string&amp; _return, const std::string&amp; name) {
    std::ifstream ifs;
    std::ostringstream oss;
    std::string str;

    ifs.open(name.c_str(), std::ios::in | std::ios::binary);
    if(!ifs.is_open()) {
      _return = &quot;&quot;;
    }else {
      oss&lt;&lt;ifs.rdbuf();
      str = oss.str();
      _return = encode_base64(str);
    }
  }

  std::string encode_base64(const std::string&amp; src_data) {
    using namespace boost::archive::iterators;
    const int Base64_Column_Width = 76;
    typedef insert_linebreaks&lt;base64_from_binary&lt;transform_width&lt;
      const char *, 6, 8&gt; &gt;, Base64_Column_Width&gt; base64_encoder;

    // エンコードしたデータを格納
    std::stringstream ost_base64;
    // エンコード処理
    std::copy(
      base64_encoder(src_data.c_str()),
      base64_encoder(src_data.c_str() + src_data.length()),
      std::ostream_iterator&lt;char&gt;(ost_base64)
    );
    std::string base64 = ost_base64.str();
    // 末尾の長さ調整
    while(((base64.length() % (Base64_Column_Width + 1)) % 4) &gt; 0) {
      base64 += &quot;=&quot;;
    }
    return base64;
  }
};
</pre>
				<p>次にクライアントを今回はPHPで書きます。<br />
				RPCで受け取ったbase64エンコード文字列をimgタグに埋め込んで画面に表示します。</p>
				<pre name="code" class="php" style="margin:15px 0;">
&lt;?php
$GLOBALS[&#039;THRIFT_ROOT&#039;] = &#039;src&#039;;
$GEN_DIR = &#039;gen-php&#039;;

/** Include the Thrift base */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/Thrift.php&#039;;

/** Include the binary protocol */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/protocol/TBinaryProtocol.php&#039;;

/** Include the socket layer */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/transport/TSocketPool.php&#039;;

/** Include the socket layer */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/transport/TBufferedTransport.php&#039;;

/** Include the generated code */
require_once $GEN_DIR.&#039;/test/Test.php&#039;;
require_once $GEN_DIR.&#039;/test/test_types.php&#039;;

$transport = new TSocket(&#039;localhost&#039;, 9090);
$client = new TestClient(new TBinaryProtocol($transport));

try {
  $transport-&gt;open();
  $img = $client-&gt;returnImage(&quot;lenna.jpg&quot;);  /* $img に base64エンコード文字列が入る */
  $transport-&gt;close();
}catch(Exception $e) {
  echo $e-&gt;getMessage();
}
?&gt;

&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;www.w3.org/1999/xhtml&quot; lang=&quot;ja&quot; xml:lang=&quot;ja&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot; /&gt;
&lt;title&gt;Embed Base64 Image Test&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;img src=&quot;data:image/jpg;base64,&lt;?php echo $img ?&gt;&quot; /&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
				<p>こんな感じで一応上手く表示まで行うことができました。</p>
				<p>サーバ側で画像処理を行った後、出力画像をクライアントに返す時などに使えます。<br />
				楽な方法なんですが、大きな画像データをやりとりするのには向いてないですね；；<br />
				もうちょっと良い方法を探してみます。</p>
				<p>・関連記事<br />
				<a href="http://rest-term.com/archives/2350/" title="Thrift + OpenCV">Thrift + OpenCV</a><br />
				<a href="http://rest-term.com/archives/2310/" title="Thrift::例外処理">Thrift::例外処理</a><br />
				<a href="http://rest-term.com/archives/2297/" title="Thriftインストール">Thriftインストール</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=3c_jW7dqq6Q:qRHWKCt8rn0:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=3c_jW7dqq6Q:qRHWKCt8rn0:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2393/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2393/</feedburner:origLink></item>
		<item>
		<title>memcached: Slab Allocator</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/GizZJXHefqw/</link>
		<comments>http://rest-term.com/archives/2364/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 02:37:30 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2364</guid>
		<description><![CDATA[				僕の務める会社でも memcached はほとんどのサービスで利用されています。
				今は業務も少ないので、ひまつぶしにmemcachedのコードを読んでいました。
				Slab Allocatorの部分に興味を持ったので、それについてわかったことのメモ。
				以下のサイトで事前知識を付けてからコードを読みました。
				memcachedを知り尽くす：第2回　memcachedのメモリストレージを理解する
				Slab Allocator : メモリの確保・管理を行うメカニズム
				　・メモリアロケーションでオーバーヘッドの大きいmalloc()を極力呼ばない
				　・一度アロケートしたメモリ領域を再利用してメモリフラグメンテーションを抑える
				これらを実現するために以下のルールでメモリアロケーションを行っています。
				　・memcachedの初期化時にmalloc()で大きな領域(slabと呼ばれる, デフォルトで1MB)を確保
				　・あるslab classに属するslabは全て同一サイズのchunkで構成される
				　・chunkサイズはslab classにより異なる
				　・各slabはどのchunkが使われていないかを指すポインタを持っている
				　・chunkは不要になったらfree()されるのではなく、再利用するためにchunkリストに戻される
				　・もし利用可能なchunkがなくなった場合は、malloc()して新しいslabを作成する
				Slab Allocatorの実装は slabs.h, slabs.c
				　・ slabclass_t 構造体
				chunkサイズやslabのリストを持っています。
				これを見ると、chunkのことをコード上ではitemと呼んでいる模様。
				　・Slab Allocatorは固定数のslabclass_t配列を持ち、chunkサイズでソートされている
				　・slabclass_t配列のインデックス番号はclsidと呼ばれ、これはslab classを識別するためのidになっている
				Slab Allocatorのメインインタフェース
				malloc()が実際にメモリ割り当てを行っているのに対して、
				slab_alloc()はあらかじめ確保した領域から、最適なサイズのchunkを返しているだけです。
				同様に、free()が実際にメモリ解放を行っているのに対して、
				slab_free()はchunkをリスト(slabclass_tのslots)に戻しているだけです。
				このSlab Allocatorの仕組みは、Linuxカーネルでも使われているとのことです。
				時間があれば続きを読んでいきたいと思います。
				・参考
				MemcachedSlabAllocator &#8211; memcached -
]]></description>
			<content:encoded><![CDATA[				<p>僕の務める会社でも memcached はほとんどのサービスで利用されています。<br />
				今は業務も少ないので、ひまつぶしにmemcachedのコードを読んでいました。</p>
				<p><strong>Slab Allocator</strong>の部分に興味を持ったので、それについてわかったことのメモ。<br />
				以下のサイトで事前知識を付けてからコードを読みました。<br />
				<a href="http://gihyo.jp/dev/feature/01/memcached/0002" title="memcachedを知り尽くす：第2回　memcachedのメモリストレージを理解する｜gihyo.jp … 技術評論社">memcachedを知り尽くす：第2回　memcachedのメモリストレージを理解する</a></p>
				<h3>Slab Allocator : メモリの確保・管理を行うメカニズム</h3>
				<p>　・メモリアロケーションでオーバーヘッドの大きいmalloc()を極力呼ばない<br />
				　・一度アロケートしたメモリ領域を再利用してメモリフラグメンテーションを抑える</p>
				<p>これらを実現するために以下のルールでメモリアロケーションを行っています。<br />
				　・memcachedの初期化時にmalloc()で大きな領域(slabと呼ばれる, デフォルトで1MB)を確保<br />
				　・あるslab classに属するslabは全て同一サイズのchunkで構成される<br />
				　・chunkサイズはslab classにより異なる<br />
				　・各slabはどのchunkが使われていないかを指すポインタを持っている<br />
				　・chunkは不要になったらfree()されるのではなく、再利用するためにchunkリストに戻される<br />
				　・もし利用可能なchunkがなくなった場合は、malloc()して新しいslabを作成する</p>
				<p>Slab Allocatorの実装は slabs.h, slabs.c<br />
				　・ slabclass_t 構造体<br />
				chunkサイズやslabのリストを持っています。<br />
				これを見ると、chunkのことをコード上ではitemと呼んでいる模様。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
typedef struct {
    unsigned int size;      /* sizes of items */
    unsigned int perslab;   /* how many items per slab */

    void **slots;           /* list of item ptrs */
    unsigned int sl_total;  /* size of previous array */
    unsigned int sl_curr;   /* first free slot */

    void *end_page_ptr;         /* pointer to next free item at end of page, or 0 */
    unsigned int end_page_free; /* number of items remaining at end of last alloced page */

    unsigned int slabs;     /* how many slabs were allocated for this class */

    void **slab_list;       /* array of slab pointers */
    unsigned int list_size; /* size of prev array */

    unsigned int killing;  /* index+1 of dying slab, or zero if none */
    size_t requested; /* The number of requested bytes */
} slabclass_t;

static slabclass_t slabclass[MAX_NUMBER_OF_SLAB_CLASSES];
</pre>
				<p>　・Slab Allocatorは固定数のslabclass_t配列を持ち、chunkサイズでソートされている<br />
				　・slabclass_t配列のインデックス番号はclsidと呼ばれ、これはslab classを識別するためのidになっている</p>
				<h3>Slab Allocatorのメインインタフェース</h3>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
unsigned int slabs_clsid(const size_t size);
void *slabs_alloc(size_t size, unsigned int id);
void slabs_free(void *ptr, size_t size, unsigned int id);
</pre>
				<p>malloc()が実際にメモリ割り当てを行っているのに対して、<br />
				slab_alloc()はあらかじめ確保した領域から、最適なサイズのchunkを返しているだけです。<br />
				同様に、free()が実際にメモリ解放を行っているのに対して、<br />
				slab_free()はchunkをリスト(slabclass_tのslots)に戻しているだけです。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
unsigned int clsid;
item *it;
clsid = slabs_clsid(item_size);  // item_sizeに応じてclsidを決める
it = slabs_alloc(item_size, clsid); // item_sizeとclsidをもとにchunkの割り当てを行う
slabs_free(it, item_size, clsid); // chunkをリストに戻す
</pre>
				<p>このSlab Allocatorの仕組みは、Linuxカーネルでも使われているとのことです。<br />
				時間があれば続きを読んでいきたいと思います。</p>
				<p>・参考<br />
				<a href="http://code.google.com/p/memcached/wiki/MemcachedSlabAllocator" title="MemcachedSlabAllocator - memcached - Project Hosting on Google Code">MemcachedSlabAllocator &#8211; memcached -</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=GizZJXHefqw:tFYncLS-bA4:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=GizZJXHefqw:tFYncLS-bA4:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2364/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2364/</feedburner:origLink></item>
		<item>
		<title>Thrift + OpenCV</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/GsWyxUkmTxA/</link>
		<comments>http://rest-term.com/archives/2350/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 13:33:11 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2350</guid>
		<description><![CDATA[				Thriftを利用してOpenCVの関数をスクリプトから呼んでみます。
				といってもRPCで繋げるだけで特別なことをする必要はありません。
				ここでは、画像の各チャンネルの平均値と標準偏差を求めてみます。
				サーバ側でOpenCVの cvAvgSvd() を利用すればOK。
				まず、最初にRPCのインタフェースをThrift IDLに書きます。
				ここでは、平均と標準偏差を求める関数を2つ作ることにしました。
				各チャンネルの値が欲しいので戻り値は list&#60;double&#62; に、
				引数は画像ファイル名を指定したいので string にしておきます。
				• cv.thrift (サービス名は CV)
				
service CV {
  list&#60;double&#62; calcAvg(1: string img)
  list&#60;double&#62; calcSdv(1: string img)
}

				• thriftコマンドでコード生成
				
$ thrift --gen cpp --gen perl --gen php --gen rb cv.thrift

				サーバ側の実装ではC++で普通にOpenCVを使って書けばOKです。
				(今回の場合は gen-cpp/CV_server.skeleton.cpp というファイルを編集する)
				メソッドの引数にだけ注意しておきます。
				ここではコードを一部省略しますが、実際はドメインロジック以外自動生成されます。
				ソケットを作って接続を待ったり、データ構造をシリアライズしたりといった面倒な部分は、
				全てThriftが引き受けてくれるので安心です。
				• サーバ側 CV_server.skeleton.cpp (C++)
				• コンパイル
				
$ g++ -g CV.cpp CV_server.skeleton.cpp -o CV_server `pkg-config --cflags --libs opencv thrift`

				次はクライアント側を実装します。
				• クライアント側 cv.pl (Perl)
				
				• サーバの起動およびクライアントの実行
				
$ [...]]]></description>
			<content:encoded><![CDATA[				<p>Thriftを利用してOpenCVの関数をスクリプトから呼んでみます。<br />
				といってもRPCで繋げるだけで特別なことをする必要はありません。</p>
				<p>ここでは、画像の各チャンネルの平均値と標準偏差を求めてみます。<br />
				サーバ側でOpenCVの cvAvgSvd() を利用すればOK。</p>
				<p>まず、最初にRPCのインタフェースをThrift IDLに書きます。<br />
				ここでは、平均と標準偏差を求める関数を2つ作ることにしました。<br />
				各チャンネルの値が欲しいので戻り値は list&lt;double&gt; に、<br />
				引数は画像ファイル名を指定したいので string にしておきます。</p>
				<p><strong>• cv.thrift (サービス名は CV)</strong></p>
				<pre>
service CV {
  list&lt;double&gt; calcAvg(1: string img)
  list&lt;double&gt; calcSdv(1: string img)
}
</pre>
				<p><strong>• thriftコマンドでコード生成</strong></p>
				<pre>
$ thrift --gen cpp --gen perl --gen php --gen rb cv.thrift
</pre>
				<p>サーバ側の実装ではC++で普通にOpenCVを使って書けばOKです。<br />
				(今回の場合は gen-cpp/CV_server.skeleton.cpp というファイルを編集する)<br />
				メソッドの引数にだけ注意しておきます。<br />
				ここではコードを一部省略しますが、実際はドメインロジック以外自動生成されます。<br />
				ソケットを作って接続を待ったり、データ構造をシリアライズしたりといった面倒な部分は、<br />
				全てThriftが引き受けてくれるので安心です。</p>
				<p><strong>• サーバ側 CV_server.skeleton.cpp (C++)</strong></p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
#include &quot;CV.h&quot;
#include &lt;protocol/TBinaryProtocol.h&gt;
#include &lt;server/TSimpleServer.h&gt;
#include &lt;transport/TServerSocket.h&gt;
#include &lt;transport/TBufferTransports.h&gt;

#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;
#include &lt;iostream&gt;

/*  中略  */

class CVHandler : virtual public CVIf {
  IplImage *srcImg;
  CvScalar mean;
  CvScalar std_dev;
 public:
  CVHandler() {
    srcImg = 0;
    mean = cvScalarAll(0);
    std_dev = cvScalarAll(0);
  }

  void calcAvg(std::vector&lt;double&gt; &amp; _return, const std::string&amp; img) {
    if((srcImg = cvLoadImage(img.c_str(), CV_LOAD_IMAGE_ANYDEPTH |  CV_LOAD_IMAGE_ANYCOLOR)) == 0) {
      std::cout&lt;&lt;&quot;load error.&quot;&lt;&lt;std::endl;
      exit(0);
    }
    cvAvgSdv(srcImg , &amp;mean, NULL);
    for(int i=0;i&lt;3;++i) _return.push_back(mean.val[i]);
    cvReleaseImage(&amp;srcImg);
  }

  void calcSdv(std::vector&lt;double&gt; &amp; _return, const std::string&amp; img) {
    /* 以下略 (calcAvgと同様に書けばよい)*/
　
</pre>
				<p>• コンパイル</p>
				<pre>
$ g++ -g CV.cpp CV_server.skeleton.cpp -o CV_server `pkg-config --cflags --libs opencv thrift`
</pre>
				<p>次はクライアント側を実装します。<br />
				<strong>• クライアント側 cv.pl (Perl)</strong></p>
				<pre name="code" class="php" style="margin:15px 0;">
#!/usr/bin/perl

use strict;
use warnings;
use lib &#039;./gen-perl&#039;;

use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;

use CV;

my $transport = Thrift::Socket-&gt;new(&#039;localhost&#039;, 9090);
my $client = CVClient-&gt;new(Thrift::BinaryProtocol-&gt;new($transport));

eval {
  $transport-&gt;open();
  print &quot;Calculate the Mean\n( Blue Green Red ) = ( &quot;;
  printf &quot;%f &quot;, $_ for @{$client-&gt;calcAvg(&quot;lena.jpg&quot;)};　# 戻り値はリストリファレンス
  print &quot;)\n\n&quot;;
  print &quot;Calculate the Standard-Deviation\n( Blue Green Red ) = ( &quot;;
  printf &quot;%f &quot;, $_ for @{$client-&gt;calcSdv(&quot;baboon.jpg&quot;)};
  print &quot;)&quot;;
  $transport-&gt;close();
};

if($@) {
  warn $@-&gt;{message};
}
</pre>
				<p><strong><br />
				• サーバの起動およびクライアントの実行</strong></p>
				<pre>
$ mv ./gen-cpp/CV_server .
$ ./CV_server
</pre>
				<pre>
$ chmod +x cv.pl
$ ./cv.pl
Calculate the Mean
( Blue Green Red ) = ( 105.398991 99.562698 179.730305 )

Calculate the Standard-Deviation
( Blue Green Red ) = ( 60.611124 47.493925 55.499225 )
</pre>
				<p>上手くいきました。<br />
				次はPHPから。抽象化レイヤのおかげでPHPでも簡単に使えます。<br />
				<strong>• クライアント側  cv.php (PHP)</strong></p>
				<pre name="code" class="php" style="margin:15px 0;">
&lt;?php
$GLOBALS[&#039;THRIFT_ROOT&#039;] = &#039;src&#039;;
$GEN_DIR = &#039;gen-php&#039;;

/** Include the Thrift base */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/Thrift.php&#039;;

/** Include the binary protocol */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/protocol/TBinaryProtocol.php&#039;;

/** Include the socket layer */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/transport/TSocketPool.php&#039;;

/** Include the socket layer */
require_once $GLOBALS[&#039;THRIFT_ROOT&#039;].&#039;/transport/TBufferedTransport.php&#039;;

/** Include the generated code */
require_once $GEN_DIR.&#039;/CV.php&#039;;
require_once $GEN_DIR.&#039;/cv_types.php&#039;;

$transport = new TSocket(&#039;localhost&#039;, 9090);
$client = new CVClient(new TBinaryProtocol($transport));

try {
  $transport-&gt;open();
  print_r($client-&gt;calcAvg(&quot;lena.jpg&quot;));　/* Perl版と同じように呼べる */
  print_r($client-&gt;calcSdv(&quot;baboon.jpg&quot;));
  $transport-&gt;close();
}catch(Exception $e) {
  echo $e-&gt;getMessage();
}

?&gt;
</pre>
				<p><strong>• 出力結果</strong></p>
				<pre>
Array
(
    [0] => 105.3989906311
    [1] => 99.562698364258
    [2] => 179.73030471802
)
Array
(
    [0] => 60.611123950567
    [1] => 47.493925313866
    [2] => 55.499224912776
)
</pre>
				<p>詳細は省きますが、Rubyでもシンタックスを変えるだけで利用できます。</p>
				<pre name="code" class="php" style="margin:15px 0;">
# Rubyでも簡単
client.calcAvg(&quot;lena.jpg&quot;)
client.calcSdv(&quot;baboon.jpg&quot;)
</pre>
				<p>今回はThriftを使って各言語から簡単にOpenCVを利用できることを確認しました。</p>
				<p>それはともかくOpenCV 2.0 のリリースが Sept. 31, 2009 って書いてありましたが、<br />
				また便利な機能が追加されてるんですかね。楽しみです。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=GsWyxUkmTxA:tPJgr1_Yqgw:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=GsWyxUkmTxA:tPJgr1_Yqgw:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2350/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2350/</feedburner:origLink></item>
		<item>
		<title>Thrift::例外処理</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/4a2Rny8l3sY/</link>
		<comments>http://rest-term.com/archives/2310/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 09:50:59 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2310</guid>
		<description><![CDATA[				Thriftでの例外処理について。
				macbookへのインストールについてはThriftインストールを参照。
				hello, world 的な話はたくさん情報が公開されているのでそちらを参考するといいかと。
				ここでは例外処理についてメモしておきます。
				TException
				ThriftはRPCフレームワークです。
				このRPCにおいてなんらかの理由でサーバと通信ができなかった時などの異常系処理。
				ThriftではTExceptionという例外オブジェクトを送出します。
				PerlとPHPの例を載せますが、以下のように普通にハンドリングすればOKです。
				• Perlの場合
				• PHPの場合
				普通ですね。
				エラーメッセージは message というプロパティに入っています。
				• エラーメッセージ例
				
TSocket: Could not connect to localhost:9090

				RPCにおける異常系処理にも特に頭を悩ませることがないのはうれしいです。
]]></description>
			<content:encoded><![CDATA[				<p>Thriftでの例外処理について。</p>
				<p>macbookへのインストールについては<a href="http://rest-term.com/archives/2297/">Thriftインストール</a>を参照。<br />
				hello, world 的な話はたくさん情報が公開されているのでそちらを参考するといいかと。<br />
				ここでは例外処理についてメモしておきます。</p>
				<p><strong>TException</strong><br />
				ThriftはRPCフレームワークです。<br />
				このRPCにおいてなんらかの理由でサーバと通信ができなかった時などの異常系処理。<br />
				ThriftではTExceptionという例外オブジェクトを送出します。<br />
				PerlとPHPの例を載せますが、以下のように普通にハンドリングすればOKです。</p>
				<p><strong>• Perlの場合</strong></p>
				<pre name="code" class="php" style="margin:15px 0;">
my $transport = Thrift::Socket-&gt;new(&#039;localhost&#039;, 9090);
my $client = HelloClient-&gt;new(Thrift::BinaryProtocol-&gt;new($transport));

eval {
  $transport-&gt;open();
  printf &quot;%s&yen;n&quot;, $client-&gt;hello(&quot;aru&quot;);
  $transport-&gt;close();
};
if($@) {
  print $@-&gt;{message};
}
</pre>
				<p><strong>• PHPの場合</strong></p>
				<pre name="code" class="php" style="margin:15px 0;">
$transport = new TSocket(&#039;localhost&#039;, 9090);
$client = new HelloClient(new TBinaryProtocol($transport));

try {
  $transport-&gt;open();
  echo $client-&gt;hello(&quot;aru&quot;);
  $transport-&gt;close();
}catch(Exception $e) {
  echo $e-&gt;getMessage();
}
</pre>
				<p>普通ですね。<br />
				エラーメッセージは message というプロパティに入っています。</p>
				<p>• エラーメッセージ例</p>
				<pre>
TSocket: Could not connect to localhost:9090
</pre>
				<p>RPCにおける異常系処理にも特に頭を悩ませることがないのはうれしいです。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=4a2Rny8l3sY:nQotYMQimII:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=4a2Rny8l3sY:nQotYMQimII:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2310/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2310/</feedburner:origLink></item>
		<item>
		<title>休養中…</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/C5ZUCqqYiV0/</link>
		<comments>http://rest-term.com/archives/2315/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 06:32:59 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[diary]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2315</guid>
		<description><![CDATA[				って書くと、仕事辛くて休職中みたいにも読めるけど、別にそこまで辛くはないです；
				今日は六本木ヒルズの森美術館とスカイアクアリウムに行ってきました。
				美術館はフラッシュ無しなら撮影可だったんですが、なんとデジカメを忘れるという。。
				まぁここに写真を貼るよりああいうのは実物をみないとあんまり意味ないですし。
				一応ケータイで東京の街並みを撮りましたが、ひどい画質。。
				
				あとは、マグカップとかエンピツを買ってきました。
				
				職場から歩いて5,6分くらいなんですが、あまり行かないので今日はイイ気分転換になりました。
]]></description>
			<content:encoded><![CDATA[				<p>って書くと、仕事辛くて休職中みたいにも読めるけど、別にそこまで辛くはないです；</p>
				<p>今日は六本木ヒルズの森美術館とスカイアクアリウムに行ってきました。<br />
				美術館はフラッシュ無しなら撮影可だったんですが、なんとデジカメを忘れるという。。<br />
				まぁここに写真を貼るよりああいうのは実物をみないとあんまり意味ないですし。</p>
				<p>一応ケータイで東京の街並みを撮りましたが、ひどい画質。。<br />
				<img src="http://rest-term.com/wp-content/uploads/2009/09/200909201220000.jpg" alt="200909201220000" title="200909201220000" width="240" height="345" class="alignnone size-full wp-image-2319" /><img src="http://rest-term.com/wp-content/uploads/2009/09/200909201223000.jpg" alt="200909201223000" title="200909201223000" width="240" height="345" class="alignnone size-full wp-image-2320" /></p>
				<p>あとは、マグカップとかエンピツを買ってきました。<br />
				<a href="http://rest-term.com/wp-content/uploads/2009/09/DSC00821.JPG"><img src="http://rest-term.com/wp-content/uploads/2009/09/DSC00821-300x225.jpg" alt="DSC00821" title="DSC00821" width="300" height="225" class="alignnone size-medium wp-image-2316" /></a></p>
				<p>職場から歩いて5,6分くらいなんですが、あまり行かないので今日はイイ気分転換になりました。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=C5ZUCqqYiV0:Om5fFsLQXaY:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=C5ZUCqqYiV0:Om5fFsLQXaY:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2315/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2315/</feedburner:origLink></item>
		<item>
		<title>Thriftインストール</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/n_qajJLikd8/</link>
		<comments>http://rest-term.com/archives/2297/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 17:53:00 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2297</guid>
		<description><![CDATA[				Thriftを業務で今後利用するかもしれないので少し調べています。
				ただ、インストールでつまづいてた。。
				普通に公式サイトに書いてあるようにやれば上手くインストールできるのです。
				FrontPage Thrift Wiki
				ただ、FAQもよく読んでおくべきだった。。それだけ。
				一応メモ。
				今回はMacbookにインストールしました。
				Thriftはboostが必須なので注意。公式サイトにはSo please download the bzip2 of boost and unpack〜〜とか書いてありますが、portでインストールしてしまいます。
				$ sudo port install boost
インストールに失敗する場合は一度cleanしてみる。
$ sudo port clean --work boost
				環境変数の設定も忘れずに(.bashrc, .zshrc &#8230;)。
				
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
export LIBRARY_PATH=/opt/local/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib
export BOOST_ROOT=/opt/local/include/boost:$BOOST_ROOT

				あとはThrift本体をインストールするだけです。
				
$ wget -O thrift.tgz "http://gitweb.thrift-rpc.org/?p=thrift.git;a=snapshot;h=HEAD;sf=tgz"
$ tar -xzf thrift.tgz
$ cd thrift
$ ./bootstrap.sh
$ ./configure
$ make
$ sudo make install

				ただ、僕の場合 ./configure で以下のようなエラーがでました。
				
./configure: line 21183: syntax error near unexpected token `MONO,'
./configure: [...]]]></description>
			<content:encoded><![CDATA[				<p>Thriftを業務で今後利用するかもしれないので少し調べています。<br />
				ただ、インストールでつまづいてた。。<br />
				普通に公式サイトに書いてあるようにやれば上手くインストールできるのです。<br />
				<a href="http://wiki.apache.org/thrift/">FrontPage Thrift Wiki</a><br />
				ただ、FAQもよく読んでおくべきだった。。それだけ。</p>
				<p>一応メモ。<br />
				今回はMacbookにインストールしました。<br />
				Thriftはboostが必須なので注意。公式サイトにはSo please download the bzip2 of boost and unpack〜〜とか書いてありますが、portでインストールしてしまいます。</p>
				<pre><code>$ sudo port install boost</code></pre>
<p>インストールに失敗する場合は一度cleanしてみる。</p>
<pre><code>$ sudo port clean --work boost</code></pre>
				<p>環境変数の設定も忘れずに(.bashrc, .zshrc &#8230;)。</p>
				<pre><code>
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
export LIBRARY_PATH=/opt/local/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib
export BOOST_ROOT=/opt/local/include/boost:$BOOST_ROOT
</code></pre>
				<p>あとはThrift本体をインストールするだけです。</p>
				<pre><code>
$ wget -O thrift.tgz "http://gitweb.thrift-rpc.org/?p=thrift.git;a=snapshot;h=HEAD;sf=tgz"
$ tar -xzf thrift.tgz
$ cd thrift
$ ./bootstrap.sh
$ ./configure
$ make
$ sudo make install
</code></pre>
				<p>ただ、僕の場合 ./configure で以下のようなエラーがでました。</p>
				<pre>
./configure: line 21183: syntax error near unexpected token `MONO,'
./configure: line 21183: `  PKG_CHECK_MODULES(MONO, mono >= 1.2.6, have_mono=yes, have_mono=no)'
</pre>
				<p>意味がわからなくて途方に暮れていたんですが、公式のFAQに解決策が書いてありました。。<br />
				<a href="http://wiki.apache.org/thrift/FAQ">FAQ &#8211; Thrift Wiki</a><br />
				If you&#8217;re on OS X: find pkg.m4, copy it to thrift/aclocal, and rerun bootstrap.sh.<br />
				とあるので、とりあえず /opt/local/share/aclocal  に pkg.m4 があるか確認してからcopy。<br />
				(pkgconfigパッケージがインストールされている必要がある)</p>
				<pre>
$ cp /opt/local/share/aclocal/pkg.m4 ./aclocal
$ ./bootstrap.sh
.... 略
</pre>
				<p>make install まで上手くいきました。<br />
				公式にドキュメントがある場合はFAQも含めてよく読もう。</p>
				<p>＜追記＞<br />
				各言語のライブラリのインストールも忘れないように。<br />
				ここでは、perl, ruby, pythonの各ライブラリをインストールしておきます。</p>
				<pre>
$ cd lib/perl
$ perl Makefile.PL
$ sudo make install
$ cd ../rb
$ sudo ruby setup.rb
$ cd ../py
$ sudo python setup.py install
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=n_qajJLikd8:IE5CWbnaAFk:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=n_qajJLikd8:IE5CWbnaAFk:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2297/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2297/</feedburner:origLink></item>
		<item>
		<title>デジタルホーム</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/Zd776dIH6Nc/</link>
		<comments>http://rest-term.com/archives/2283/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 17:17:14 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[diary]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2283</guid>
		<description><![CDATA[				Macbookは画面が小さくてずっとなんとかしたいと思ってたんですが、
				試しにケーブルを買ってきてAQUOS(32型)とMacbookに繋げてみました。
				
				Apple Mini DisplayPort − DVI アダプタとDVI to HDMI変換ケーブルで併せて5000円くらいだったと思います。
				TV側がフルハイビジョン(1920×1080)なので、２枚目のディスプレイとしては申し分ない大きさです。
				ただ、こっちでコードとか書くのはツライのでTV側には主にブラウザとかを配置することになるかと。
				作業用デスクとディスプレイは大きい方が良い。
]]></description>
			<content:encoded><![CDATA[				<p>Macbookは画面が小さくてずっとなんとかしたいと思ってたんですが、<br />
				試しにケーブルを買ってきてAQUOS(32型)とMacbookに繋げてみました。<br />
				<a href="http://rest-term.com/wp-content/uploads/2009/08/DSC00820.JPG"><img src="http://rest-term.com/wp-content/uploads/2009/08/DSC00820-150x150.jpg" alt="DSC00820" title="DSC00820" width="150" height="150" class="alignnone size-thumbnail wp-image-2284" /></a><a href="http://rest-term.com/wp-content/uploads/2009/08/DSC00819.JPG"><img src="http://rest-term.com/wp-content/uploads/2009/08/DSC00819-150x150.jpg" alt="DSC00819" title="DSC00819" width="150" height="150" class="alignnone size-thumbnail wp-image-2285" /></a></p>
				<p><a href="http://store.apple.com/jp/product/MB570Z/A" title="Apple Mini DisplayPort − DVI アダプタ">Apple Mini DisplayPort − DVI アダプタ</a>とDVI to HDMI変換ケーブルで併せて5000円くらいだったと思います。</p>
				<p>TV側がフルハイビジョン(1920×1080)なので、２枚目のディスプレイとしては申し分ない大きさです。<br />
				ただ、こっちでコードとか書くのはツライのでTV側には主にブラウザとかを配置することになるかと。</p>
				<p>作業用デスクとディスプレイは大きい方が良い。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=Zd776dIH6Nc:8kUjREdtfeY:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=Zd776dIH6Nc:8kUjREdtfeY:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2283/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2283/</feedburner:origLink></item>
		<item>
		<title>Vector() 関数について</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/plsnfsB1SVE/</link>
		<comments>http://rest-term.com/archives/2262/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 08:24:16 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2262</guid>
		<description><![CDATA[				以前書いた位相限定相関のコードなんですが、ピクセルデータを一次元(Number)で扱いたくて
				こんな風に書いていました。
				ナイトビジョンエフェクトのコードは最初はByteArrayで書いてて、その後でVectorに書き換えています。
				get/setVector() vs get/setPixels()
				で、コードの整理ついでに位相限定相関のコードもVector版で書き換えようとしたんですが、
				位相限定相関法はフーリエ変換してからいろいろ計算する必要があります。
				でも、getVector() の戻り値が Vector.&#60;uint&#62; なのでこのままでは使えません。
				ということで、
				と書いて実際これで上手く動いたのですが、これって新しいVectorをさらにもう一つ生成してることになるの?
				ちなみに速度的には前述の getPixel() での一次元化とほとんど変わりませんでした。
				(計算量的にはこの部分がボトルネックになってるわけではないのですが；)
				メリットはコードが少しだけ短くなることですかね。
				参考：トップレベルの定数と関数 &#8211; ActionScript 3.0 言語およびコンポーネントリファレンス
				・ソースコード
				FFT演算用クラスはこれまで利用してきたものと同じものです → FFT.as
				・出力結果
				time: 1542 ms
				peak: 0.44900903245107504, position: (x=86, y=45)
]]></description>
			<content:encoded><![CDATA[				<p>以前書いた<a href="http://rest-term.com/archives/1777/">位相限定相関のコード</a>なんですが、ピクセルデータを一次元(Number)で扱いたくて</p>
				<pre name="code" class="as" style="margin:15px 0;">
// グレースケールのデータ
private function serializeData(data:Vector.&lt;Number&gt;, img:BitmapData):void {
  for(var y:int=0; y&lt;h; y++) {
    for(var x:int=0; x&lt;w; x++) {
      data[x + y*w] = img.getPixel(x, y) &amp; 0xff;
    }
  }
}
</pre>
				<p>こんな風に書いていました。<br />
				<a href="http://rest-term.com/archives/1980/">ナイトビジョンエフェクト</a>のコードは最初はByteArrayで書いてて、その後でVectorに書き換えています。<br />
				<a href="http://rest-term.com/archives/1999/#extended" title="get/setVector() vs get/setPixels() - Rest Term">get/setVector() vs get/setPixels()</a><br />
				で、コードの整理ついでに位相限定相関のコードもVector版で書き換えようとしたんですが、<br />
				位相限定相関法はフーリエ変換してからいろいろ計算する必要があります。<br />
				でも、getVector() の戻り値が Vector.&lt;uint&gt; なのでこのままでは使えません。<br />
				ということで、</p>
				<pre name="code" class="as" style="margin:15px 0;">
// reはVector.&lt;Number&gt;, imgDataはBitmapData
re = Vector.&lt;Number&gt;(imgData.getVector(imgData.rect));
</pre>
				<p>と書いて実際これで上手く動いたのですが、これって新しいVectorをさらにもう一つ生成してることになるの?<br />
				ちなみに速度的には前述の getPixel() での一次元化とほとんど変わりませんでした。<br />
				(計算量的にはこの部分がボトルネックになってるわけではないのですが；)<br />
				メリットはコードが少しだけ短くなることですかね。</p>
				<p>参考：<a href="http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/package.html#Vector()" title="トップレベルの定数と関数 - ActionScript 3.0 言語およびコンポーネントリファレンス">トップレベルの定数と関数 &#8211; ActionScript 3.0 言語およびコンポーネントリファレンス</a></p>
				<p>・ソースコード<br />
				FFT演算用クラスはこれまで利用してきたものと同じものです → <a href="http://rest-term.com/contents/flash/misc/FFT.as">FFT.as</a></p>
				<pre name="code" class="as" style="margin:15px 0;">
package {
  import __AS3__.vec.Vector;

  import flash.display.*;
  import flash.geom.Point;
  import flash.utils.getTimer;

  [SWF(width = &quot;514&quot;, height = &quot;300&quot;, backgroundColor = &quot;#000000&quot;, frameRate = &quot;12&quot;)]

  public class POC extends Sprite {
    [Embed(source = &#039;./assets/lennagray1.jpg&#039;)]
    private var EmbedImage:Class;

    [Embed(source = &#039;./assets/lennagray2.jpg&#039;)]
    private var EmbedImage2:Class;

    private var srcBmp:Bitmap;
    private var srcBmp2:Bitmap;
    private var imgData:BitmapData;
    private var imgData2:BitmapData;
    private var re:Vector.&lt;Number&gt;;
    private var im:Vector.&lt;Number&gt;;
    private var re2:Vector.&lt;Number&gt;;
    private var im2:Vector.&lt;Number&gt;;
    private var rePOC:Vector.&lt;Number&gt;;
    private var imPOC:Vector.&lt;Number&gt;;
    private var w:int = 0;
    private var h:int = 0;

    public function POC() {
      srcBmp = new EmbedImage() as Bitmap;
      imgData = srcBmp.bitmapData.clone();
      srcBmp2 = new EmbedImage2() as Bitmap;
      imgData2 = srcBmp2.bitmapData.clone();
      w = imgData.width;
      h = imgData.height;
      var ts:int = getTimer();
      // 画像データの直列化
      re = Vector.&lt;Number&gt;(imgData.getVector(imgData.rect));
      re2 = Vector.&lt;Number&gt;(imgData2.getVector(imgData2.rect));
      im = new Vector.&lt;Number&gt;(w*h, true);
      im2 = im.concat();
      rePOC = im.concat();
      imPOC = im.concat();

      // 位相限定相関
      phaseOnlyCorrelation(re, im, re2, im2, rePOC, imPOC);
      var te:int = getTimer();
      trace(&quot;time: &quot; + (te - ts) + &quot; ms&quot;);
      // ピーク値と座標の探索
      var peak:Number = 0.0, spectrum:Number = 0.0;
      var pos:Point = new Point();
      for(var y:int=0; y&lt;h; y++) {
        for(var x:int=0; x&lt;w; x++) {
          //spectrum = Math.sqrt(rePOC[x + y*w]*rePOC[x + y*w] + imPOC[x + y*w]*imPOC[x + y*w]);
          spectrum = rePOC[x + y*w] + Math.abs(imPOC[x + y*w]);
          if(spectrum &gt; peak){
            peak = spectrum;
            pos.x = x;
            pos.y = y;
          }
        }
      }
      trace(&quot;peak: &quot; + peak + &quot;, position: &quot; + pos);
      addChild(srcBmp);
      addChild(srcBmp2).x += w + 2;
    }
    // 位相限定相関
    private function phaseOnlyCorrelation(srcRe1:Vector.&lt;Number&gt;, srcIm1:Vector.&lt;Number&gt;, srcRe2:Vector.&lt;Number&gt;, srcIm2:Vector.&lt;Number&gt;, dstRe:Vector.&lt;Number&gt;, dstIm:Vector.&lt;Number&gt;):void {
      var fft:FFT = new FFT(w);
      var spectrum:Number = 0.0;
      // 2D-FFT
      fft.fft2d(srcRe1, srcIm1);
      fft.fft2d(srcRe2, srcIm2);
      for(var i:int=0; i&lt;w*h; i++) {
        // 位相を算出 (振幅で正規化)
        spectrum = Math.sqrt(srcRe1[i]*srcRe1[i] + srcIm1[i]*srcIm1[i]);
        srcRe1[i] /= spectrum;
        srcIm1[i] /= spectrum;
        spectrum = Math.sqrt(srcRe2[i]*srcRe2[i] + srcIm2[i]*srcIm2[i]);
        srcRe2[i] /= spectrum;
        srcIm2[i] /= spectrum;
        // 相互相関
        dstRe[i] = srcRe1[i]*srcRe2[i];
        dstIm[i] = srcIm1[i]*(-srcIm2[i]);
      }
      // 2D-IFFT
      fft.fft2d(dstRe, dstIm, true);
    }
  }
}
</pre>
				<p>・出力結果<br />
				<code>time: 1542 ms<br />
				peak: 0.44900903245107504, position: (x=86, y=45)</code></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=plsnfsB1SVE:E16WKFswlIs:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=plsnfsB1SVE:E16WKFswlIs:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2262/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2262/</feedburner:origLink></item>
		<item>
		<title>The Quick Brown Fox jumps over the lazy dog.</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/PbyL2s4rv_Y/</link>
		<comments>http://rest-term.com/archives/2256/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 14:53:21 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[font]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2256</guid>
		<description><![CDATA[				フォントブログさんでも紹介されていますが、
				The Quick Brown Fox jumps over the lazy dog.を実際にやってみた動画。
				ちいさなキツネが予想以上にかわいいｗ
				The Quick Brown Fox… &#124; The FontFeed
				The Quick Brown Fox～とは&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
				英語のパングラムの一つであり、タイプライターやコンピュータのキーボードの試験などによく用いられる。quick brown fox（クイック・ブラウン・フォックス）と略して呼称することが多い。パングラムとは、ラテン文字のアルファベット26字をすべて用い、かつ重複をなるべく少なくした短文のこと。
]]></description>
			<content:encoded><![CDATA[				<p><a href="http://blog.petitboys.com/archives/quick-brown-fox.html">フォントブログ</a>さんでも紹介されていますが、<br />
				The Quick Brown Fox jumps over the lazy dog.を実際にやってみた動画。<br />
				ちいさなキツネが予想以上にかわいいｗ<br />
				<a href="http://fontfeed.com/archives/the-quick-brown-fox%E2%80%A6/" title="The Quick Brown Fox… | The FontFeed">The Quick Brown Fox… | The FontFeed</a></p>
				<p>The Quick Brown Fox～とは&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
				<blockquote><p>英語のパングラムの一つであり、タイプライターやコンピュータのキーボードの試験などによく用いられる。quick brown fox（クイック・ブラウン・フォックス）と略して呼称することが多い。パングラムとは、ラテン文字のアルファベット26字をすべて用い、かつ重複をなるべく少なくした短文のこと。</p></blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=PbyL2s4rv_Y:Ws83HeuG_AQ:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=PbyL2s4rv_Y:Ws83HeuG_AQ:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2256/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2256/</feedburner:origLink></item>
		<item>
		<title>土曜は本屋へ</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/7H8Z6yrizWI/</link>
		<comments>http://rest-term.com/archives/2251/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 14:15:38 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[diary]]></category>
		<category><![CDATA[tech/study]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2251</guid>
		<description><![CDATA[				OpenCVの新しい書籍を立ち読みしてきました。
				OpenCV プログラミングブック 第2版 OpenCV 1.1対応
				第1版と違うところはやはり「機械学習」の項が増えたことでしょう。
				内容はお約束のHaar-likeであまり新鮮味はありませんが、丁寧に書かれていたのは良いです。
				巻末のリファレンスもしっかりしているのでお守り代わりに買っておくのもありだと思います。
				(ディスプレイでHTMLリファレンスを読みたくない人にオススメ)
				&#8212;&#8212;&#8212;-
				最近は業務で簡単な動画配信周りの処理を書くことになり今はその対応をしています。
				言語はperlなんですが、今まで遊び程度でしか書いたことがなかったので今がんばって勉強中。
				今後はperl関連のことも書いていくかもしれません。(今はまだ[perl]タグは付けません)
]]></description>
			<content:encoded><![CDATA[				<p>OpenCVの新しい書籍を立ち読みしてきました。<br />
				<a href="http://www.amazon.co.jp/gp/product/4839931593?ie=UTF8&#038;tag=rslife-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4839931593">OpenCV プログラミングブック 第2版 OpenCV 1.1対応</a><img src="http://www.assoc-amazon.jp/e/ir?t=rslife-22&#038;l=as2&#038;o=9&#038;a=4839931593" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /><br />
				第1版と違うところはやはり「機械学習」の項が増えたことでしょう。<br />
				内容はお約束のHaar-likeであまり新鮮味はありませんが、丁寧に書かれていたのは良いです。<br />
				巻末のリファレンスもしっかりしているのでお守り代わりに買っておくのもありだと思います。<br />
				(ディスプレイでHTMLリファレンスを読みたくない人にオススメ)</p>
				<p>&#8212;&#8212;&#8212;-<br />
				最近は業務で簡単な動画配信周りの処理を書くことになり今はその対応をしています。<br />
				言語はperlなんですが、今まで遊び程度でしか書いたことがなかったので今がんばって勉強中。<br />
				今後はperl関連のことも書いていくかもしれません。(今はまだ[perl]タグは付けません)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=7H8Z6yrizWI:R1_9qSXZuj0:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=7H8Z6yrizWI:R1_9qSXZuj0:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2251/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2251/</feedburner:origLink></item>
		<item>
		<title>ビデオ入出力</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/TR0_bPSNypw/</link>
		<comments>http://rest-term.com/archives/2242/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 14:21:44 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2242</guid>
		<description><![CDATA[				OpenCV &#8211; HighGUI &#8211; Tech Noteを更新しました。
				opencv.jpのサンプルコードよりも少しだけ詳しく。
				1.1preの方も少しずつ調べていきたいと思ってます。
]]></description>
			<content:encoded><![CDATA[				<p><a href="http://rest-term.com/contents/other/technote/index.php/OpenCV%20-%20HighGUI" title="OpenCV - HighGUI - Tech Note">OpenCV &#8211; HighGUI &#8211; Tech Note</a>を更新しました。<br />
				opencv.jpのサンプルコードよりも少しだけ詳しく。<br />
				1.1preの方も少しずつ調べていきたいと思ってます。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=TR0_bPSNypw:bhE_zKi04gU:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=TR0_bPSNypw:bhE_zKi04gU:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2242/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2242/</feedburner:origLink></item>
		<item>
		<title>typename</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/-HMIUG_9YmY/</link>
		<comments>http://rest-term.com/archives/2228/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 08:54:37 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2228</guid>
		<description><![CDATA[				業務でつまづいたことメモ。
				テンプレートパラメータの宣言でclassとtypenameの違いはないが、typenameにはもう一つの意味があって、これを使わなければならない場所がある。例えば、STLコンテナを引数に取る関数テンプレートを作る時、
				C++には、テンプレート内にあるネストされた依存名は、特に指示されていなければ型名とは解釈されないというルールがある。T::const_iteratorを型名と解釈させるためにはコンパイラに指示を与える必要があるが、ここで使うのがtypename。
				typenameはネストされた依存名でのみ使う。
				ただし、派生クラスを定義するときの基底クラスの指定と、初期化子リスト内での基底クラスの指定ではtypenameは使わないので注意。
				参考：Effective C++ 42項
]]></description>
			<content:encoded><![CDATA[				<p>業務でつまづいたことメモ。</p>
				<p>テンプレートパラメータの宣言でclassとtypenameの違いはないが、typenameにはもう一つの意味があって、これを使わなければならない場所がある。例えば、STLコンテナを引数に取る関数テンプレートを作る時、</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
template &lt;typename T&gt;
void func(const T&amp; container) {
  if(container.size() &gt; 2) {
    T::const_iterator iter(container.begin());  // 型名とは解釈されないのでエラー
    ...
</pre>
				<p>C++には、テンプレート内にあるネストされた依存名は、特に指示されていなければ型名とは解釈されないというルールがある。T::const_iteratorを型名と解釈させるためにはコンパイラに指示を与える必要があるが、ここで使うのがtypename。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
template &lt;typename T&gt;
void func(const T&amp; container) {
  if(container.size() &gt; 2) {
    typename T::const_iterator iter(container.begin());  // 依存型名の頭にtypenameを付ける
    ...
</pre>
				<p>typenameはネストされた依存名でのみ使う。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
template &lt;typename C&gt;               // typenameを使う(classでもよい)
void f(const C&amp; container,          // typenameは使えない
       typename C::iterator iter);  // typenameが必要
</pre>
				<p>ただし、派生クラスを定義するときの基底クラスの指定と、初期化子リスト内での基底クラスの指定ではtypenameは使わないので注意。</p>
				<pre name="code" class="c-sharp" style="margin:15px 0;">
template &lt;typename T&gt;
class Derived:public Base&lt;T&gt;::Nested {  // 基底クラスの指定ではtypenameを使えない
public:
  explicit Derived(int x)  // 初期化子リスト内での基底クラスの指定ではtypenameを使えない
  :Base&lt;T&gt;::Nested(x)
  {
    typename Base&lt;T&gt;::Nested temp;  // ネストされた依存名なのでここではtypenameが必要
    ...
  }
  ...
};
</pre>
				<p>参考：Effective C++ 42項</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=-HMIUG_9YmY:-D2lUVvdcRE:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=-HMIUG_9YmY:-D2lUVvdcRE:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2228/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2228/</feedburner:origLink></item>
		<item>
		<title>Macbook</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/ifeWKdc-Ekw/</link>
		<comments>http://rest-term.com/archives/2219/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 09:44:01 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[diary]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2219</guid>
		<description><![CDATA[				1QのボーナスでMacbookを買いました。
				Proの中で一番安い13万円ちょっとのやつです。
				
				
				これからゆっくりといじっていきましょうかね。
				なんか便利なツールあったら教えてください^^
]]></description>
			<content:encoded><![CDATA[				<p>1QのボーナスでMacbookを買いました。<br />
				Proの中で一番安い13万円ちょっとのやつです。<br />
				<img src="http://rest-term.com/wp-content/uploads/2009/07/DSC00810.JPG" alt="DSC00810" title="DSC00810" width="400" height="300" class="alignnone size-full wp-image-2220" /><br />
				<img src="http://rest-term.com/wp-content/uploads/2009/07/DSC00813.JPG" alt="DSC00813" title="DSC00813" width="400" height="300" class="alignnone size-full wp-image-2221" /></p>
				<p>これからゆっくりといじっていきましょうかね。<br />
				なんか便利なツールあったら教えてください^^</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=ifeWKdc-Ekw:voIDMt2l6Iw:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=ifeWKdc-Ekw:voIDMt2l6Iw:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2219/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2219/</feedburner:origLink></item>
		<item>
		<title>Yahoo! トピックス見出しアーカイブ API</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/Qs8buzDrbGM/</link>
		<comments>http://rest-term.com/archives/2205/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 14:01:51 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2205</guid>
		<description><![CDATA[				先月ヤフーがリリースしたトピックス見出しアーカイブを使ってみました。
				ヤフートップページの真ん中に出ている15文字くらいのニュースの見出しを過去にさかのぼって取得できます。
				PV指標順(ページビュー/アクセス数)でもデータが得られるので、どんなニュースが過去に話題になったか思い出せて楽しいです。
				
				>> Demo
				今回はFlexで簡単なデモを作りました(ソースコードは右クリックから)。
				指定した日付まで過去にさかのぼってひたすら見出しを表示しつづけます。
				カテゴリーとデータソートの種類を指定(掲載開始時間順 or PV指標順)する機能と、
				見出しをクリックするとバックナンバーのページに飛ぶ機能が付いています。
				勢いでガガッと作ったので中身は粗いですが、
				1ユーザーとしてチームに良いフィードバックができたらいいなと思ってます。
]]></description>
			<content:encoded><![CDATA[				<p>先月ヤフーがリリースした<a href="http://developer.yahoo.co.jp/webapi/news/news/v1/heading.html" title="Yahoo!デベロッパーネットワーク - ニュース - トピックス見出しアーカイブ">トピックス見出しアーカイブ</a>を使ってみました。<br />
				ヤフートップページの真ん中に出ている15文字くらいのニュースの見出しを過去にさかのぼって取得できます。<br />
				PV指標順(ページビュー/アクセス数)でもデータが得られるので、どんなニュースが過去に話題になったか思い出せて楽しいです。</p>
				<p><a href="http://rest-term.com/contents/flex/topics/bin-release/Topics.html"><img src="http://rest-term.com/wp-content/uploads/2009/07/headline.jpg" alt="headline" title="headline" width="400" height="345" class="alignnone size-full wp-image-2208" /><br />
				>> Demo</a></p>
				<p>今回はFlexで簡単なデモを作りました(ソースコードは右クリックから)。<br />
				指定した日付まで過去にさかのぼってひたすら見出しを表示しつづけます。<br />
				カテゴリーとデータソートの種類を指定(掲載開始時間順 or PV指標順)する機能と、<br />
				見出しをクリックするとバックナンバーのページに飛ぶ機能が付いています。</p>
				<p>勢いでガガッと作ったので中身は粗いですが、<br />
				1ユーザーとしてチームに良いフィードバックができたらいいなと思ってます。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=Qs8buzDrbGM:Z8Ti4T8mxnw:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=Qs8buzDrbGM:Z8Ti4T8mxnw:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2205/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2205/</feedburner:origLink></item>
		<item>
		<title>実践 OpenCV 映像処理&amp;解析</title>
		<link>http://feedproxy.google.com/~r/rest-term/~3/XxhnzTLCX6U/</link>
		<comments>http://rest-term.com/archives/2175/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 09:36:35 +0000</pubDate>
		<dc:creator>aru</dc:creator>
				<category><![CDATA[tech/study]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[cv/im]]></category>

		<guid isPermaLink="false">http://rest-term.com/?p=2175</guid>
		<description><![CDATA[				実践OpenCV―映像処理&#038;解析を買いました。
				
				6月10日発売のOpenCVの新しい書籍です。
				NAISTの人達が書いたOpenCV プログラミングブックを既に持っていてこの本を買う意義としては、
				強いて挙げるなら6章の「OpenGLとの連携」と7章の「物体検出の機械学習」の部分でしょうか。
				ちなみに5章では「映像解析」を扱っていますが、ここで紹介されている処理を載せておきます。
				・テンプレートマッチング
				・オプティカルフロー
				・離散フーリエ変換フィルタリング
				・モーションテンプレート
				・Haar-like特徴分類
				理論説明はほとんどなくて関数紹介が主な内容です。
				1,2年前ならHaar-likeの所の説明はとても有用だったんだと思いますが、今はWeb上でたくさん調べられます。
				カメラキャリブレーション関係を扱っていないのもツライ。
				あと、OpenCV プログラミングブックにはあった巻末の関数リファレンスがなかったのも残念です。
				CD-ROMなんか付けなくていいから代わりにリファレンスを付けて欲しかった。
				良い所はOpenCV プログラミングブックよりも載っているソースコードが見やすいところ。
				大きめで読みやすいフォントが使われています。
				大学院時代は機械学習方面にはあまり興味がなくて研究でも取り組んでいなかったんですが、
				今はヒマがあったら勉強してみようかなと思っているところです。
				なので7章はじっくり読んで実践して、ある程度理解したらTech Noteにもメモしておきます。
]]></description>
			<content:encoded><![CDATA[				<p><a href="http://www.amazon.co.jp/gp/product/4877832033?ie=UTF8&#038;tag=rest-term-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4877832033">実践OpenCV―映像処理&#038;解析</a><img src="http://www.assoc-amazon.jp/e/ir?t=rest-term-22&#038;l=as2&#038;o=9&#038;a=4877832033" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を買いました。</p>
				<p><a href="http://www.amazon.co.jp/gp/product/4877832033?ie=UTF8&#038;tag=rest-term-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4877832033"><img src="http://rest-term.com/wp-content/uploads/2009/06/jissen_opencv.jpg" alt="jissen_opencv"  style="border:none;"/></a></p>
				<p>6月10日発売のOpenCVの新しい書籍です。<br />
				NAISTの人達が書いた<a href="http://www.amazon.co.jp/gp/product/483992354X?ie=UTF8&#038;tag=rest-term-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=483992354X">OpenCV プログラミングブック</a><img src="http://www.assoc-amazon.jp/e/ir?t=rest-term-22&#038;l=as2&#038;o=9&#038;a=483992354X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を既に持っていてこの本を買う意義としては、<br />
				強いて挙げるなら6章の「OpenGLとの連携」と7章の「物体検出の機械学習」の部分でしょうか。<br />
				ちなみに5章では「映像解析」を扱っていますが、ここで紹介されている処理を載せておきます。</p>
				<p>・テンプレートマッチング<br />
				・オプティカルフロー<br />
				・離散フーリエ変換フィルタリング<br />
				・モーションテンプレート<br />
				・Haar-like特徴分類</p>
				<p>理論説明はほとんどなくて関数紹介が主な内容です。<br />
				1,2年前ならHaar-likeの所の説明はとても有用だったんだと思いますが、今はWeb上でたくさん調べられます。<br />
				カメラキャリブレーション関係を扱っていないのもツライ。<br />
				あと、OpenCV プログラミングブックにはあった巻末の関数リファレンスがなかったのも残念です。<br />
				CD-ROMなんか付けなくていいから代わりにリファレンスを付けて欲しかった。</p>
				<p>良い所はOpenCV プログラミングブックよりも載っているソースコードが見やすいところ。<br />
				大きめで読みやすいフォントが使われています。</p>
				<p>大学院時代は機械学習方面にはあまり興味がなくて研究でも取り組んでいなかったんですが、<br />
				今はヒマがあったら勉強してみようかなと思っているところです。<br />
				なので7章はじっくり読んで実践して、ある程度理解したら<a href="http://rest-term.com/contents/other/technote/" title="Tech Note">Tech Note</a>にもメモしておきます。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/rest-term?a=XxhnzTLCX6U:ul7QxQ8Fabg:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/rest-term?d=spdCosxkSQE" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/rest-term?a=XxhnzTLCX6U:ul7QxQ8Fabg:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/rest-term?d=OAQBO0PjnPA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://rest-term.com/archives/2175/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://rest-term.com/archives/2175/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.722 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-11-09 14:34:22 -->
