<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-646629770840133147</id><updated>2012-02-16T15:54:38.751+09:00</updated><category term='C++'/><category term='xcode'/><category term='Geometry'/><category term='Cinder'/><category term='Opengl'/><category term='error'/><category term='openframeworks'/><category term='Boost'/><category term='mac'/><category term='as3'/><title type='text'>デザイン系の学生がプログラミングするブログ(仮)</title><subtitle type='html'>openframeworks、cinder、processing、Flashに関しての個人的メモ置き場</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-6174071922217496367</id><published>2011-06-10T03:08:00.010+09:00</published><updated>2011-06-10T09:16:53.750+09:00</updated><title type='text'>Reaction Diffusion 3D</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Xy09auDyQho/TfEBklzSIrI/AAAAAAAAACE/DxyVfF22AKg/s1600/SS_RD_GrayScott3D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-Xy09auDyQho/TfEBklzSIrI/AAAAAAAAACE/DxyVfF22AKg/s400/SS_RD_GrayScott3D.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;反応拡散系のシュミレーションをoFで書いてみた。３次元２成分のGray Scottモデルを使用。&lt;br /&gt;&lt;br /&gt;参考は、Nervous Systemの&lt;a href="http://www.openprocessing.org/visuals/?visualID=15938"&gt;このコード&lt;/a&gt;と、&lt;a href="http://code.google.com/p/reaction-diffusion/"&gt;このページ&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;最初、FitzHugh-Nagumoモデルに書きなおしていじってたけど、よさげなパラメータが見つからずgdgdになったので放置。結局、単純に元ネタをcppに翻訳した感じになった。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/itr0510filehost/folder/RD_GrayScott3D_Mesh.zip"&gt;RD_GrayScott3D_Mesh.zip&lt;/a&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;（使用しているアドオンは&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;&lt;a href="http://code.google.com/p/ruicode/"&gt;ofxMarchingCubes、ofxSTL、ofx3DUtils、ofxVectorMath&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;。）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GUIはきまぐれで自作。実はMarchingCubesも自作してたけど、後から見つけたアドオンのほうが出来がよかったのでお蔵入りになった。残念。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-6174071922217496367?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/6174071922217496367/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/06/reaction-diffusion-3d.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6174071922217496367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6174071922217496367'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/06/reaction-diffusion-3d.html' title='Reaction Diffusion 3D'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Xy09auDyQho/TfEBklzSIrI/AAAAAAAAACE/DxyVfF22AKg/s72-c/SS_RD_GrayScott3D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-3656669141348081975</id><published>2011-05-07T02:28:00.000+09:00</published><updated>2011-05-07T02:28:37.383+09:00</updated><title type='text'>貝のやつ</title><content type='html'>HIGASHISMのひとを見てたら自分もやってみたくなったので、やってみた。&lt;br /&gt;&lt;br /&gt;円錐からの整形は早々に諦めてwebでカンニングしてたところ&lt;a href="http://mathdl.maa.org/images/upload_library/23/picado/seashells/index.html"&gt;いい感じにまとまったサイト&lt;/a&gt;を発見したので参考にしつつcinderで実装してみた。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-igdZKTrqAaY/TcQpw-0L4bI/AAAAAAAAAB4/_VOAD0moqzY/s1600/ss_shell.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="275" src="http://1.bp.blogspot.com/-igdZKTrqAaY/TcQpw-0L4bI/AAAAAAAAAB4/_VOAD0moqzY/s400/ss_shell.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;上記のサイトにのってるアルゴリズムは基本的な殻の生成に加え、瘤を発生させることができ、画像のようなトゲの生えた貝も描画できる。&lt;br /&gt;以下がソース（&lt;a href="http://marcinignac.com/blog/simplegui/"&gt;SimpleGUI&lt;/a&gt;が必要。）&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/itr0510filehost/folder/TheMuseumOfAllShells.zip"&gt;TheMuseumOfAllShells.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;法線計算が力技でかなりひどく、また瘤の挙動が仕様か実装ミスか時々変なのが気になる。時間できたら、手を加えよう。&lt;br /&gt;&lt;br /&gt;あと、gitにある最新のcinderで該当箇所のコメントアウト（TheMuseumOfAllShellsAppApp.cppの263行目くらい）を外してビルドするとメッシュを.obj形式で保存できるようになる。なかなか便利。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-3656669141348081975?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/3656669141348081975/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/05/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/3656669141348081975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/3656669141348081975'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/05/blog-post.html' title='貝のやつ'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-igdZKTrqAaY/TcQpw-0L4bI/AAAAAAAAAB4/_VOAD0moqzY/s72-c/ss_shell.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-4605006059474653017</id><published>2011-04-18T21:09:00.029+09:00</published><updated>2011-04-21T03:18:13.216+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openframeworks'/><category scheme='http://www.blogger.com/atom/ns#' term='Opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>openframeworks上でのアンチエイリアスのかけ方</title><content type='html'>tipsを二つメモ。openframeworksでアンチエイリアスをかける方法と、ワイヤーフレームを描画する方法について&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-e-1G52N6k9k/Taw8-tbSVKI/AAAAAAAAABw/FoJ_eKJscOg/s1600/ss_cubes_aa.png" imageanchor="1" style="clear: left; display: inline !important; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="112" src="http://3.bp.blogspot.com/-e-1G52N6k9k/Taw8-tbSVKI/AAAAAAAAABw/FoJ_eKJscOg/s200/ss_cubes_aa.png" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;まずは、アンチエイリアスをかける方法について&lt;/b&gt;。oF（v0062）はデフォルトだとジャギーがかなり目立つ。なんとなく以前からアンチエイリアスの実装方法を探していたけど、最近oFのフォーラムで方法がのっているのを発見したので試してみた。&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//main.cppファイルにて&lt;br /&gt;#include "ofMain.h"&lt;br /&gt;#include "testApp.h"&lt;br /&gt;#include "ofAppGlutWindow.h"&lt;br /&gt;&lt;br /&gt;//========================================================================&lt;br /&gt;int main( ){&lt;br /&gt; ofAppGlutWindow window;&lt;br /&gt; //アンチエイリアスを有効にする&lt;br /&gt; window.setGlutDisplayString("rgb alpha double samples&amp;gt;=4 depth");&lt;br /&gt; ofSetupOpenGL(&amp;amp;window, 500,500, OF_WINDOW);&lt;br /&gt; ofRunApp( new testApp());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;ofSetupOpenGLの前にwindow.setGlutDisplayString("rgb alpha double samples&amp;gt;=4 depth");と一行追加するだけ。すごい簡単だった。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-nXxVh_hNbhQ/Taw9D3MwzwI/AAAAAAAAAB0/0xf2BCD49fo/s1600/ss_cubes_wire.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="106" src="http://3.bp.blogspot.com/-nXxVh_hNbhQ/Taw9D3MwzwI/AAAAAAAAAB0/0xf2BCD49fo/s200/ss_cubes_wire.png" style="cursor: move;" width="200" /&gt;&lt;/a&gt;&lt;b&gt;つづいて、ワイヤフレームを描画する方法&lt;/b&gt;。processingのようにポリゴンをワイヤーフレームで表示したい時、ポリゴンの描画方法をglPolygonModeで切り替えれる。&lt;br /&gt;例えば、ワイヤーフレームのみ表示する場合は&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//ワイヤーフレームを描画&lt;br /&gt; ofSetColor(50, 50, 50);&lt;br /&gt; glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//ポリゴンの表と裏をワイヤーフレームで描画する&lt;br /&gt; glutSolidCube(5);&lt;br /&gt; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//変更した設定をもとに戻す。ポリゴンの表と裏を塗りつぶす。&lt;br /&gt; ofSetColor(255, 255, 255);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ワイヤーフレームと面を両方表示する場合は、面とワイヤーフレームの二回に分けて描画すればいいが、そのままだとワイヤーフレームが面にめり込んだ状態で表示される可能性があるため、glPolygonOffsetでオフセットを付けてやる必要がある。&lt;br /&gt;&lt;pre class="brush:cpp"&gt;//面を描画&lt;br /&gt; ofxLightsOn();&lt;br /&gt; glEnable(GL_POLYGON_OFFSET_FILL); //オフセット値を有効化&lt;br /&gt;  glPolygonOffset(1, 1);      //オフセット値を決定&lt;br /&gt; glutSolidCube(5);&lt;br /&gt; glDisable(GL_POLYGON_OFFSET_FILL); //変更した設定をもとに戻す。オフセット値を無効化。&lt;br /&gt; ofxLightsOff();&lt;br /&gt; &lt;br /&gt; //ワイヤーフレームを描画&lt;br /&gt; ofSetColor(50, 50, 50);&lt;br /&gt; glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);//ポリゴンの表と裏をワイヤーフレームで描画する&lt;br /&gt; glutSolidCube(5);&lt;br /&gt; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);//変更した設定をもとに戻す。ポリゴンの表と裏を塗りつぶす。&lt;br /&gt; ofSetColor(255, 255, 255);&lt;br /&gt;&lt;/pre&gt;こんな感じ。&lt;br /&gt;&lt;br /&gt;以上をひとまとめにした&lt;a href="https://sites.google.com/site/itr0510filehost/folder/anit_aliasing.zip"&gt;ソースはこちら&lt;/a&gt;。（&lt;a href="http://code.google.com/p/ofx3dutils/"&gt;ofx3dutils&lt;/a&gt;とofxVectorMathがアドオンに必要。）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-4605006059474653017?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/4605006059474653017/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/04/openframeworks.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/4605006059474653017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/4605006059474653017'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/04/openframeworks.html' title='openframeworks上でのアンチエイリアスのかけ方'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-e-1G52N6k9k/Taw8-tbSVKI/AAAAAAAAABw/FoJ_eKJscOg/s72-c/ss_cubes_aa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-8976446081981670947</id><published>2011-04-04T01:20:00.007+09:00</published><updated>2011-04-04T09:10:06.062+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='Geometry'/><title type='text'>断面図の出力</title><content type='html'>3Dモデルの断面図を計算するコードをスケッチしてみた。&lt;br /&gt;&lt;br /&gt;&lt;script src="http://wonderfl.net/blogparts/xUib/js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="ttlBpWonderfl" style="font-size: 11px; margin: 0; text-align: right; width: 465px;"&gt;&lt;a href="http://wonderfl.net/c/xUib" title="forked from: Voronoi 3D "&gt;forked from: Voronoi 3D  - wonderfl build flash online&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;前回のsplitMeshをやっつけで書きなおしただけなのでコードは汚め。&lt;br /&gt;&lt;br /&gt;3Dモデルのアウトプットとかに使うつもり。&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;ここからさらにsvgで出力し、&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;カッティングプロッタでプラ板等に切り出し、&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;積層していくとか。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;次は、ペパクラデザイナーのような展開図を作成するアルゴリズムに挑戦してみる。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-8976446081981670947?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/8976446081981670947/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/04/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/8976446081981670947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/8976446081981670947'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/04/blog-post.html' title='断面図の出力'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-3462607183069895074</id><published>2011-03-22T03:22:00.009+09:00</published><updated>2011-03-24T03:39:40.497+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='Geometry'/><title type='text'>三次元ボロノイ分割</title><content type='html'>half-edgeデータ構造の勉強に、&lt;a href="http://www.wblut.com/"&gt;Frederik Vanhoutte&lt;/a&gt;氏の&lt;a href="http://www.wblut.com/2009/05/04/snippets-ii/"&gt;コード&lt;/a&gt;をFlashへ移植してみた。&lt;br /&gt;&lt;br /&gt;&lt;script src="http://wonderfl.net/blogparts/qilS/js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="ttlBpWonderfl" style="font-size: 11px; margin: 0; text-align: right; width: 465px;"&gt;&lt;a href="http://wonderfl.net/c/qilS" title="三次元ボロノイ分割"&gt;三次元ボロノイ分割 - wonderfl build flash online&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;マウスプレスで母点追加、キープレスで更新のオンオフ&lt;br /&gt;&lt;br /&gt;描画はテキトー&lt;br /&gt;さらっと書くつもりが、完成間近で一度ミスってファイルを消したり、バグがとれなかったりで時間かかった。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;おまけ&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://wonderfl.net/blogparts/1rQ1/js"&gt;&lt;/script&gt;&lt;p class="ttlBpWonderfl" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"&gt;&lt;a href="http://wonderfl.net/c/1rQ1" title="Voronoi 3D with PV3D"&gt;Voronoi 3D with PV3D - wonderfl build flash online&lt;/a&gt;&lt;/p&gt;PV3Dにつっこんでみた。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-3462607183069895074?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/3462607183069895074/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/3462607183069895074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/3462607183069895074'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/blog-post.html' title='三次元ボロノイ分割'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-966613221196410808</id><published>2011-03-18T06:01:00.003+09:00</published><updated>2011-03-18T06:19:12.022+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><title type='text'>Xcodeでパッケージにファイルがコピーされない</title><content type='html'>cinder上でGLSLをいじっていて&lt;br /&gt;&lt;blockquote&gt;warning: no rule to process file '$(PROJECT_DIR)/hoge/FlatShader.frag' of type sourcecode.glsl for architecture i386&lt;br /&gt;warning: no rule to process file '$(PROJECT_DIR)/hoge/FlatShader.vert' of type sourcecode.glsl for architecture i386&lt;br /&gt;warning: no rule to process file '$(PROJECT_DIR)/hoge/NormalMap.frag' of type sourcecode.glsl for architecture i386&lt;br /&gt;warning: no rule to process file '$(PROJECT_DIR)/hoge/NormalMap.vert' of type sourcecode.glsl for architecture i386&lt;/blockquote&gt;という警告がでてパッケージに該当するファイルがコピーされなくなった。&lt;br /&gt;&lt;br /&gt;左のカラムの”ターゲット”を開くと、”ソースをコンパイル”にGLSLのファイルが入っていたので、”バンドルリソースをコピー”にドラッグする。そうすると警告がでなくなり上手く動くようになった。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-nvmUDddJqCI/TYJvJ9CDk3I/AAAAAAAAAAw/gPBARtOycPw/s1600/SS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="https://lh5.googleusercontent.com/-nvmUDddJqCI/TYJvJ9CDk3I/AAAAAAAAAAw/gPBARtOycPw/s200/SS.png" width="200" /&gt;&lt;/a&gt;&lt;a href="https://lh3.googleusercontent.com/-XevGAfh5zuA/TYJvKIY4LeI/AAAAAAAAAA0/RKj6lGswbIA/s1600/SS_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="https://lh3.googleusercontent.com/-XevGAfh5zuA/TYJvKIY4LeI/AAAAAAAAAA0/RKj6lGswbIA/s200/SS_2.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;単純だけど、いきなりなって焦った。　.vertや.fragって前からこうだったかな？&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-966613221196410808?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/966613221196410808/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/xcode.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/966613221196410808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/966613221196410808'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/xcode.html' title='Xcodeでパッケージにファイルがコピーされない'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-nvmUDddJqCI/TYJvJ9CDk3I/AAAAAAAAAAw/gPBARtOycPw/s72-c/SS.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-2586352700629483943</id><published>2011-03-10T08:10:00.005+09:00</published><updated>2011-03-11T14:16:35.595+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>XcodeでMacPortsのフォルダにインクルードパスを通す</title><content type='html'>セットアップしたMacPortsを実際に使用してみる。ついでに、Xcodeでの使用方法もメモしとく。&lt;br /&gt;&lt;br /&gt;とりあえず、Boostライブラリを例にする。&lt;br /&gt;ターミナルから&lt;br /&gt;&lt;pre class="brush:shell"&gt;sudo port install boost&lt;br /&gt;&lt;/pre&gt;とうつとインストールが始まるので、しばらく待つ。buildに時間がかかる。&lt;br /&gt;これで、ライブラリのインストールは終了。&lt;br /&gt;&lt;br /&gt;で、Xcodeでインストールしたライブラリを使用するには、インストール先である/opt/loaclまでのパスを設定してやればいい。&lt;br /&gt;&lt;br /&gt;boostのヘッダーは/opt/local/include/に格納されているので、Xcodeのプロジェクト&amp;gt;プロジェクト設定の編集&amp;gt;ヘッダ検索パスに/opt/loacl/include/と追加する。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Y7g4xpjUXuc/TXgFof4azJI/AAAAAAAAAAo/NGnQOirxVbQ/s1600/Xcode_Path.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://2.bp.blogspot.com/-Y7g4xpjUXuc/TXgFof4azJI/AAAAAAAAAAo/NGnQOirxVbQ/s400/Xcode_Path.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;これで、Xcodeのプロジェクト上でboostが使用可能になる。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ついでに、Xcodeのグローバルパスの設定方法を調べてみた。&lt;br /&gt;~/.MacOSX/environment.plistのHEADER_SEARCH_PATHSでヘッダ検索パス、USER_HEADER_SEARCH_PATHSでユーザヘッダ検索パスを設定できるらしいんだけど、ユーザヘッダ検索パスしか動かなかった。&lt;a href="http://stackoverflow.com/questions/749027/how-to-add-a-global-include-path-for-xcode"&gt;http://stackoverflow.com/questions/749027/how-to-add-a-global-include-path-for-xcode&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえず、手動でパスは設定していくとして、こっちの方法もあとで調べておくとしよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-2586352700629483943?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/2586352700629483943/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/xcodemacports.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/2586352700629483943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/2586352700629483943'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/xcodemacports.html' title='XcodeでMacPortsのフォルダにインクルードパスを通す'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Y7g4xpjUXuc/TXgFof4azJI/AAAAAAAAAAo/NGnQOirxVbQ/s72-c/Xcode_Path.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-2368293872970492901</id><published>2011-03-10T07:01:00.002+09:00</published><updated>2011-03-11T14:15:54.736+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>MacPortsのセットアップ手順</title><content type='html'>MacPortsとはオープンソース・ソフトウェアを手軽にインストール、管理できるアプリのこと。&lt;br /&gt;ソースを探し、ビルドし、アップデートする手間が省けてすごく楽ができる。&lt;br /&gt;&lt;br /&gt;最近、友人に聞かれたので、改めてまとめてみる。&lt;br /&gt;&lt;br /&gt;まず、&lt;a href="http://www.macports.org/"&gt;MacPortsのサイト&lt;/a&gt;から、インストーラをダウンロードしインストールする。&lt;br /&gt;&lt;br /&gt;次に、環境変数 PATHにMacPortsで使用するフォルダの場所を追加する。PATHとはコマンドラインで各種のコマンドを手軽に呼び出すための設定。&lt;br /&gt;ターミナルを起動して、&lt;br /&gt;&lt;pre class="brush:shell"&gt;echo 'export PATH=$PATH:/opt/local/bin:/opt/local/sbin/' &amp;gt;&amp;gt; ~/.bashrc &lt;br /&gt;echo 'export MANPATH=$MANPATH:/opt/local/man' &amp;gt;&amp;gt; ~/.bashrc &lt;br /&gt;echo 'source ~/.bashrc' &amp;gt;&amp;gt; ~/.bash_profile &lt;br /&gt;&lt;/pre&gt;と打ち込んだあと、ターミナルを再起動。&lt;br /&gt;&lt;br /&gt;最後に、MacPorts自身をアップデートする。&lt;br /&gt;&lt;pre class="brush:shell"&gt;sudo port selfupdate&lt;br /&gt;&lt;/pre&gt;といれて、パスワードをいれてやるとアップデートしてくれる。&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;※エラーで、javaのアップデートが必要とでた場合は、&lt;a href="http://www.in-vitro.jp/blog/index.cgi/Apple/20101129_01.htm"&gt;こちらを参照&lt;/a&gt;&lt;/span&gt;。&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;※学校だとmacports上手く動かない、gitもなんか変な動きするし。ポートかな&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-2368293872970492901?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/2368293872970492901/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/macports.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/2368293872970492901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/2368293872970492901'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/macports.html' title='MacPortsのセットアップ手順'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-8208642331468447379</id><published>2011-03-05T09:45:00.009+09:00</published><updated>2011-03-11T14:15:23.834+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openframeworks'/><category scheme='http://www.blogger.com/atom/ns#' term='Opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>openframeworksでポリゴンを選択する方法</title><content type='html'>前回のnurbsとhemeshを組み合わせて、なにか凝ったモノをつくろうとして挫折。そもそも、JOGLのnurbsが未実装だった。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-Lvrjo1nJgkk/TXGC8OgpAnI/AAAAAAAAAAk/JJQaRYb0XyI/s1600/sh.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="https://lh3.googleusercontent.com/-Lvrjo1nJgkk/TXGC8OgpAnI/AAAAAAAAAAk/JJQaRYb0XyI/s200/sh.png" width="200" /&gt;&lt;/a&gt;というわけで、今回もTipsっぽい記事。openframeworkでポリゴンのマウスクリックや、マウスオーバーの判定を取る方法。&lt;br /&gt;&lt;br /&gt;地道に座標を変換して照合していくことももちろん可能だが、openglにマウスピック用のAPIがすでに用意されているので、それを試してみた。&lt;br /&gt;&lt;br /&gt;参考したのは以下のサイト&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.lighthouse3d.com/opengl/picking/"&gt;Picking Tutorial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://son-son.sakura.ne.jp/old/programming/opengl_6.html"&gt;[OpenGL] マウスピッキング&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;※カメラやライトの設定に&lt;a href="http://code.google.com/p/ofx3dutils/"&gt;ofx3dutils&lt;/a&gt;というアドオンを（あと、ofxVectorMathも）使用しています&lt;br /&gt;&lt;br /&gt;testApp.h&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#ifndef _TEST_APP&lt;br /&gt;#define _TEST_APP&lt;br /&gt;&lt;br /&gt;#include "ofMain.h"&lt;br /&gt;#include "ofxEasyCam.h"&lt;br /&gt;#include "ofxLight.h"&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;&lt;br /&gt;#define FOV  60.0f&lt;br /&gt;#define NEAR 1.0f&lt;br /&gt;#define FAR  100.0f&lt;br /&gt;#define BUFSIZE 512&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class testApp : public ofBaseApp{&lt;br /&gt;&lt;br /&gt; public:&lt;br /&gt;  void setup();&lt;br /&gt;  void update();&lt;br /&gt;  void draw();&lt;br /&gt;  void mousePressed(int x, int y, int button);&lt;br /&gt;  void mouseReleased(int x, int y, int button);&lt;br /&gt;  void windowResized(int w, int h);&lt;br /&gt;  &lt;br /&gt;  void drawBox(GLenum mode = GL_RENDER);&lt;br /&gt;  void pick(int x, int y, std::vector&amp;lt;int&amp;gt;&amp;amp; hitList);&lt;br /&gt;  void selectThisSide(GLuint hits, GLuint *buf, std::vector&amp;lt;int&amp;gt;&amp;amp; hitList);&lt;br /&gt; &lt;br /&gt;  ofxEasyCam   cam;&lt;br /&gt;  ofxLight   light;&lt;br /&gt;  std::vector&amp;lt;int&amp;gt; selectedList;&lt;br /&gt; &lt;br /&gt; private:&lt;br /&gt;  template&amp;lt;typename T&amp;gt; bool contains(std::vector&amp;lt;T&amp;gt;&amp;amp; hitList, T element){&lt;br /&gt;   return std::find( hitList.begin(),hitList.end() , element )!= hitList.end(); &lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;testApp.cpp&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include "testApp.h"&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::setup(){&lt;br /&gt; ofBackground( 0, 0, 0);&lt;br /&gt; glEnable(GL_DEPTH_TEST);&lt;br /&gt; &lt;br /&gt; // init camera /////////////////////////////////////////////&lt;br /&gt; cam.setOrigin(OF_ORIGIN_ZERO);&lt;br /&gt; cam.perspective(FOV, (float)ofGetWidth()/(float)ofGetHeight() , NEAR, FAR);&lt;br /&gt; cam.position(10.0f, 10.0f, 10.0f);&lt;br /&gt; cam.eye(0.0f,0.0f,0.0f);&lt;br /&gt; cam.zoomSpeed  = 0.1;&lt;br /&gt; cam.panSpeed   = 0.1;&lt;br /&gt; &lt;br /&gt; // init light //////////////////////////////////////////////&lt;br /&gt; light.pointLight(255, 255, 255, 0, 5, 0);&lt;br /&gt; ofxSetSmoothLight(true);&lt;br /&gt; ofxLightsOn();&lt;br /&gt; light.on();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::update(){&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::draw(){&lt;br /&gt; cam.place();&lt;br /&gt; drawBox(); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::drawBox(GLenum mode){&lt;br /&gt; glPushMatrix();&lt;br /&gt; //ネームスタックを空にする&lt;br /&gt; if (mode==GL_SELECT) glInitNames(); &lt;br /&gt; &lt;br /&gt; // box 1 /////////////////////////&lt;br /&gt; glTranslatef(3.0f, 0.0f, 3.0f);&lt;br /&gt; if (mode==GL_SELECT) {&lt;br /&gt;  glPushName(1);&lt;br /&gt; } else {&lt;br /&gt;  // 選択された状態であれば色を付ける&lt;br /&gt;  if(contains(selectedList, 1)) ofSetColor(255, 255,   0);&lt;br /&gt;  else       ofSetColor(255, 255, 255);&lt;br /&gt; }&lt;br /&gt; glutSolidCube(2.5f);&lt;br /&gt; if (mode==GL_SELECT) glPopName();&lt;br /&gt; &lt;br /&gt; // box 2 /////////////////////////&lt;br /&gt; glTranslatef(-3.0f, 0.0f, -3.0f);&lt;br /&gt; if (mode==GL_SELECT) {&lt;br /&gt;  glPushName(2);&lt;br /&gt; } else {&lt;br /&gt;  // 選択された状態であれば色を付ける&lt;br /&gt;  if(contains(selectedList, 2)) ofSetColor(255,   0, 255);&lt;br /&gt;  else       ofSetColor(255, 255, 255);&lt;br /&gt; }&lt;br /&gt; glutSolidCube(2.5f);&lt;br /&gt; if (mode==GL_SELECT) glPopName();&lt;br /&gt; &lt;br /&gt; // box 3 /////////////////////////&lt;br /&gt; glTranslatef(-3.0f, 0.0f, -3.0f);&lt;br /&gt; if (mode==GL_SELECT) {&lt;br /&gt;  glPushName(3);&lt;br /&gt; } else {&lt;br /&gt;  // 選択された状態であれば色を付ける&lt;br /&gt;  if(contains(selectedList, 3)) ofSetColor(  0, 255, 255);&lt;br /&gt;  else       ofSetColor(255, 255, 255);&lt;br /&gt; }&lt;br /&gt; glutSolidCube(2.5f);&lt;br /&gt; if (mode==GL_SELECT) glPopName();&lt;br /&gt; glPopMatrix();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::mousePressed(int x, int y, int button){&lt;br /&gt; pick(x, y, selectedList);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::mouseReleased(int x, int y, int button){&lt;br /&gt; selectedList.clear();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::windowResized(int w, int h){&lt;br /&gt; cam.perspective(FOV, (float)w/(float)h , NEAR, FAR);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::pick(int x, int y, std::vector&amp;lt;int&amp;gt;&amp;amp; hitList){&lt;br /&gt; GLuint selectBuf[BUFSIZE];&lt;br /&gt; GLint hits;&lt;br /&gt; &lt;br /&gt; // ビューポートの情報を習得する&lt;br /&gt; GLint viewport[4];&lt;br /&gt; glGetIntegerv(GL_VIEWPORT, viewport);&lt;br /&gt;&lt;br /&gt; // ピックした結果を保存するバッファ&lt;br /&gt; glSelectBuffer(BUFSIZE, selectBuf);&lt;br /&gt; // 描画モードの切り替え&lt;br /&gt; glRenderMode(GL_SELECT);&lt;br /&gt; glMatrixMode(GL_PROJECTION);    &lt;br /&gt; // gluPickMatrixは射影変換行列を変更するため変更前の行列をスタックに保存する&lt;br /&gt; glPushMatrix();&lt;br /&gt; glLoadIdentity();&lt;br /&gt; // 第３,4引数はそれぞれx,yのピックアップの判定領域&lt;br /&gt; gluPickMatrix(x,viewport[3]-y, 5.0,5.0, viewport);&lt;br /&gt; // 変更された射影変換行列をもとにもどす。&lt;br /&gt; gluPerspective( FOV, (float)viewport[2]/(float)viewport[3], NEAR, FAR );&lt;br /&gt; glMatrixMode( GL_MODELVIEW );&lt;br /&gt; drawBox(GL_SELECT);                    &lt;br /&gt; glMatrixMode(GL_PROJECTION);&lt;br /&gt; glPopMatrix();&lt;br /&gt; glMatrixMode( GL_MODELVIEW );&lt;br /&gt; // 元の描画モードに戻す　返り値にヒットした数が返る&lt;br /&gt; hits = glRenderMode(GL_RENDER);&lt;br /&gt; &lt;br /&gt; hitList.clear();&lt;br /&gt; hitList.resize(hits);&lt;br /&gt; if(hits) selectThisSide(hits, selectBuf, hitList);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//--------------------------------------------------------------&lt;br /&gt;void testApp::selectThisSide(GLuint hits, GLuint *buf, std::vector&amp;lt;int&amp;gt;&amp;amp; hitList){&lt;br /&gt; unsigned int i, j;&lt;br /&gt; GLuint names, *ptr, minZ,*ptrNames, numberOfNames=0;&lt;br /&gt; ptr = (GLuint *) buf;&lt;br /&gt; minZ = 0xffffffff;&lt;br /&gt; for (i = 0; i &amp;lt; hits; i++) { &lt;br /&gt;  names = *ptr; // ヒットしたデータの要素数を格納&lt;br /&gt;  ptr++;   // ポインタはデプスの最小値を指す&lt;br /&gt;  if (*ptr &amp;lt; minZ) {&lt;br /&gt;   numberOfNames = names; // 要素数を更新&lt;br /&gt;   minZ = *ptr;   // 最小値を更新&lt;br /&gt;   ptrNames = ptr+2;  // ヒットしたデータ中の識別番号の先頭を格納する&lt;br /&gt;  }&lt;br /&gt;  ptr += names+2; // 次のヒットデータへ&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; ptr = ptrNames;&lt;br /&gt; std::string str = "The closest hit names are " ;&lt;br /&gt; for (j = 0; j &amp;lt; numberOfNames; j++,ptr++) {&lt;br /&gt;  str += ofToString((int)*ptr) + " ";&lt;br /&gt;  selectedList.push_back((int)*ptr);&lt;br /&gt; }&lt;br /&gt; std::cout &amp;lt;&amp;lt; str &amp;lt;&amp;lt; endl;&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;マウスプレス時にglRenderMode(GL_SELECT)で描画モードを選択モードへ変更、glPushNameでポリゴンに名前をつけて描画する。&lt;br /&gt;そこから、gluPickMatrixでマウス座標上のデプスバッファを利用しヒットしたポリゴンの名前と深度情報を取り出す。&lt;br /&gt;もし、ポリゴンが重なっていた場合、取り出した深度情報をもとに一番手前のものを選択する。というような流れ。&lt;br /&gt;&lt;br /&gt;ヒットした情報を取り出すところまでは簡単だけど、取り出した情報がちょっと複雑。&lt;br /&gt;&lt;s&gt;上手くまとめられる気がしないので&lt;/s&gt;詳しくは&lt;a href="http://son-son.sakura.ne.jp/old/programming/opengl_6.html"&gt;上記のサイト&lt;/a&gt;のセレクションバッファの項の図を参照してください。すごく分かりやすい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-8208642331468447379?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/8208642331468447379/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/openframeworks.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/8208642331468447379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/8208642331468447379'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/openframeworks.html' title='openframeworksでポリゴンを選択する方法'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-Lvrjo1nJgkk/TXGC8OgpAnI/AAAAAAAAAAk/JJQaRYb0XyI/s72-c/sh.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-6488145244078457729</id><published>2011-03-02T01:46:00.007+09:00</published><updated>2011-03-02T02:43:52.254+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cinder'/><category scheme='http://www.blogger.com/atom/ns#' term='Opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='Geometry'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Cinder上でnurbsを描く</title><content type='html'>普通にcinder上でopenglのgluNurbsSurfaceを使ってみただけ。特に変わったことはしてないけど、nurbs自体をはじめてさわったので、メモ。&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QJVS5os06BI/TW0XJ6YZrPI/AAAAAAAAAAc/8Vcv54IOjAQ/s1600/nurbs_ss.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-QJVS5os06BI/TW0XJ6YZrPI/AAAAAAAAAAc/8Vcv54IOjAQ/s320/nurbs_ss.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;openglのnurbsをcinder上で使用する。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;参考にしたサイトは以下。&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.root.cz/clanky/opengl-a-nadstavbova-knihovna-glu-15/"&gt;OpenGL a nadstavbová knihovna GLU (15) - Root.cz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wakayama-u.ac.jp/~wuhy/GSS/10.html"&gt;グラフィックス科学演習 / Graphics Science Seminar&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;コードは&lt;a href="https://sites.google.com/site/itr0510filehost/folder/study_NurbsApp.cpp"&gt;&lt;span id="goog_760670118"&gt;&lt;/span&gt;こちら(study_NurbsApp.cpp)&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;※&lt;a href="http://marcinignac.com/blog/simplegui/"&gt;SimpleGUI&lt;/a&gt;をいれておく必要あり&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;例のごとく、上のサイトからコピペしていろいろいじくり回しただけだけど。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;気になった点は、軽量化のためnurbsをdisplayListにいれようとした時、デフォルトで設定されてるテッセレーションの挙動がおかしくなったところ。もともと、分割されすぎて重く感じてたので&lt;br /&gt;&lt;pre class="brush:cpp"&gt;gluNurbsProperty(nurbs, GLU_SAMPLING_METHOD,  GLU_OBJECT_PATH_LENGTH);&lt;br /&gt;&lt;/pre&gt;で切っておいた。&lt;br /&gt;&lt;br /&gt;あと、ノットベクトルは&lt;a href="http://www.wakayama-u.ac.jp/~wuhy/GSS/10.html#10.6"&gt;ここを参照&lt;/a&gt;。エセ理系の自分にはちょっとキツイ。とりあえず、制御点数+次数だけの要素数をもつ配列をつくり、要素を単純増加させてやればよさそう。例えば、制御点数6、次数4のときノットベクトルは&lt;br /&gt;&lt;pre class="brush:cpp"&gt;GLfloat knot1[10]={0.0, 0.0, 0.0, 0.0, 0.33, 0.66, 1.0, 1.0, 1.0, 1.0};&lt;br /&gt;GLfloat knot2[10]={0.0, 0.0, 0.0, 0.0, 0.33, 0.66, 1.0, 1.0, 1.0, 1.0}; &lt;br /&gt;&lt;/pre&gt;とか、&lt;br /&gt;&lt;pre class="brush:cpp"&gt;GLfloat knot1[10]={0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};&lt;br /&gt;GLfloat knot2[10]={0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}; &lt;br /&gt;&lt;/pre&gt;にしてやる。左から右に増加さえしていれば動くはず。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-6488145244078457729?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/6488145244078457729/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/03/cindernurbs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6488145244078457729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6488145244078457729'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/03/cindernurbs.html' title='Cinder上でnurbsを描く'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-QJVS5os06BI/TW0XJ6YZrPI/AAAAAAAAAAc/8Vcv54IOjAQ/s72-c/nurbs_ss.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-401325081670519779</id><published>2011-02-28T04:31:00.008+09:00</published><updated>2011-03-02T02:44:40.798+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='Cinder'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>object_poolのdestroy()がなんだか遅い</title><content type='html'>object_poolでメモリを確保したshared_ptrをvectorに大量に追加し、clear()で解放しようとした際、フリーズしたかと思うほど時間がかかったので検証してみた。&lt;br /&gt;&lt;br /&gt;どうやら、destroy()の中で使われているordered_free()がなんかのタイミングでオーバーヘッドになってるっぽい。&lt;br /&gt;&lt;br /&gt;以下、無駄に長い検証用コード。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;boost/shared_ptr.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;boost/pool/pool.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/pool/object_pool.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;new&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;using namespace boost;&lt;br /&gt;&lt;br /&gt;class testClass {&lt;br /&gt;public:&lt;br /&gt; testClass() {}//cout&amp;lt;&amp;lt;"constructer"&amp;lt;&amp;lt;endl;}&lt;br /&gt; ~testClass(){}//cout&amp;lt;&amp;lt;"destructer"&amp;lt;&amp;lt;endl;}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//使用するpool,object_pool&lt;br /&gt;pool&amp;lt;&amp;gt; p(sizeof(testClass));&lt;br /&gt;object_pool&amp;lt;testClass&amp;gt; op;&lt;br /&gt;&lt;br /&gt;// 時間計測用&lt;br /&gt;double gettimeofday_sec()&lt;br /&gt;{&lt;br /&gt;    struct timeval tv;&lt;br /&gt;    gettimeofday(&amp;amp;tv, NULL);&lt;br /&gt;    return tv.tv_sec + (double)tv.tv_usec*1e-6;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// pool malloc ////////////////////////////////////////&lt;br /&gt;inline testClass* malloc_pool()&lt;br /&gt;{&lt;br /&gt; testClass* temp = (testClass*)p.malloc();&lt;br /&gt; if (!temp) throw std::bad_alloc(); &lt;br /&gt; return new(temp)testClass();     &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// pool free //////////////////////////////////////////&lt;br /&gt;inline void free_pool(testClass *ptr)&lt;br /&gt;{&lt;br /&gt; ptr-&amp;gt;~testClass();&lt;br /&gt; p.free(ptr);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// pool ordered_malloc ////////////////////////////////&lt;br /&gt;inline testClass* malloc_pool_ordered()&lt;br /&gt;{&lt;br /&gt; testClass* temp = (testClass*)p.ordered_malloc();&lt;br /&gt; if (!temp) throw std::bad_alloc(); &lt;br /&gt; return new(temp)testClass();     &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// pool ordered_free //////////////////////////////////&lt;br /&gt;inline void free_pool_ordered(testClass *ptr)&lt;br /&gt;{&lt;br /&gt; ptr-&amp;gt;~testClass();&lt;br /&gt; p.ordered_free(ptr);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// object_pool construct //////////////////////////////&lt;br /&gt;inline testClass* construct_object_pool()&lt;br /&gt;{&lt;br /&gt; return op.construct();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// object_pool construct //////////////////////////////&lt;br /&gt;inline void destroy_object_pool(testClass *ptr)&lt;br /&gt;{&lt;br /&gt; op.destroy(ptr);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;typedef boost::shared_ptr&amp;lt;testClass&amp;gt; shPtr;&lt;br /&gt;&lt;br /&gt;// テスト用　object_poolでメモリ確保、解放を行うshared_ptrを生成&lt;br /&gt;inline shPtr createShPtr()&lt;br /&gt;{&lt;br /&gt; return shPtr(construct_object_pool(),destroy_object_pool);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// 後ろの要素から解放するclear&lt;br /&gt;inline void clear_reverse(vector&amp;lt;shPtr&amp;gt; &amp;amp;v)&lt;br /&gt;{&lt;br /&gt; vector&amp;lt;shPtr&amp;gt;::reverse_iterator rItr   = v.rbegin();&lt;br /&gt;    vector&amp;lt;shPtr&amp;gt;::reverse_iterator rSentinel = v.rend();&lt;br /&gt; //ややこしい!&lt;br /&gt; while(rItr != rSentinel){&lt;br /&gt;  rItr = vector&amp;lt;shPtr&amp;gt;::reverse_iterator(v.erase((++rItr).base()));&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/////////////////////////////////////////////////////////////////////////////&lt;br /&gt;int main () {&lt;br /&gt;    int max_count = 100000;&lt;br /&gt; double start, end;&lt;br /&gt; &lt;br /&gt; // 比較用　ふつーに new delete ////////////// &lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = new testClass();&lt;br /&gt;  }&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   delete tps[i];&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f new delete\n", end - start);&lt;br /&gt; &lt;br /&gt; // pool malloc free /////////////////////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = malloc_pool();&lt;br /&gt;  }&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   free_pool(tps[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f pool malloc() free()\n", end - start);&lt;br /&gt; &lt;br /&gt; // pool ordered_malloc ordered_free /////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = malloc_pool_ordered();&lt;br /&gt;  }&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   free_pool_ordered(tps[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f pool ordered_malloc() ordered_free()\n", end - start);&lt;br /&gt; &lt;br /&gt; // pool ordered_malloc ordered_free 逆順に解放&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = malloc_pool_ordered();&lt;br /&gt;  }&lt;br /&gt;  for (int i = max_count - 1; i &amp;gt;= 0; i--){&lt;br /&gt;   free_pool_ordered(tps[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f pool ordered_malloc() ordered_free() reverse\n", end - start);&lt;br /&gt; &lt;br /&gt; // object_pool construct destroy ///////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = malloc_pool_ordered();&lt;br /&gt;  }&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   free_pool_ordered(tps[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f object_pool construct() destroy()\n", end - start);&lt;br /&gt; &lt;br /&gt; // object_pool construct destroy 逆順に解放///////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  testClass* tps[max_count];&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   tps[i] = malloc_pool_ordered();&lt;br /&gt;  }&lt;br /&gt;  for (int i = max_count - 1; i &amp;gt;= 0; i--){&lt;br /&gt;   free_pool_ordered(tps[i]);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f object_pool construct() destroy() reverse\n\n", end - start);&lt;br /&gt; &lt;br /&gt; // object_pool vector&amp;lt;shared_ptr&amp;gt; clear() ////////////////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  vector&amp;lt; shPtr &amp;gt; vec;&lt;br /&gt;  vec.reserve(max_count);&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   vec.push_back(createShPtr());&lt;br /&gt;  }&lt;br /&gt;  vec.clear();&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f object_pool vector&amp;lt;shared_ptr&amp;gt; clear()\n", end - start);&lt;br /&gt; &lt;br /&gt; // object_pool vector&amp;lt;shared_ptr&amp;gt; clear_reverse() ////////////////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; {&lt;br /&gt;  vector&amp;lt; shPtr &amp;gt; vec;&lt;br /&gt;  vec.reserve(max_count);&lt;br /&gt;  for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;   vec.push_back(createShPtr());&lt;br /&gt;  }&lt;br /&gt;  clear_reverse(vec);&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f object_pool vector&amp;lt;shared_ptr&amp;gt; clear_reverse()\n", end - start);&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実行結果&lt;br /&gt;&lt;blockquote&gt;0.019162 new delete&lt;br /&gt;0.001466 pool malloc() free()&lt;br /&gt;3.160949 pool ordered_malloc() ordered_free()&lt;br /&gt;0.000657 pool ordered_malloc() ordered_free() reverse&lt;br /&gt;8.477591 object_pool construct() destroy()&lt;br /&gt;0.000578 object_pool construct() destroy() reverse&lt;br /&gt;&lt;br /&gt;7.018725 object_pool vector&amp;lt;shared_ptr&amp;gt; clear()&lt;br /&gt;0.018434 object_pool vector&amp;lt;shared_ptr&amp;gt; clear_reverse()&lt;/blockquote&gt;&lt;br /&gt;ordered_freeのコードを見てないのでなんともだけど、メモリを確保した順に解放しようとするとものすごく時間がかかる模様。名前から察するに後ろから解放していけばいいんじゃね？的な勘でやってみたら上手くいった。&lt;br /&gt;&lt;br /&gt;暇なときに、&lt;a href="http://boost.cppll.jp/HEAD/libs/pool/doc/concepts.html"&gt;poolのアルゴリズム&lt;/a&gt;に目を通しておきたいですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-401325081670519779?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/401325081670519779/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/02/objectpooldestroy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/401325081670519779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/401325081670519779'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/02/objectpooldestroy.html' title='object_poolのdestroy()がなんだか遅い'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-6748816367501178212</id><published>2011-02-27T05:03:00.013+09:00</published><updated>2011-03-02T02:44:57.997+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='Cinder'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>shared_ptrとintrusive_ptrをメモリプールをつかって高速化してみる</title><content type='html'>引き続き、C++のメモリ動的確保の話。&lt;br /&gt;shared_ptrをどうしても高速で扱えるようになりたかったので、メモリプールを組み合わせて試してみた。&lt;br /&gt;&lt;br /&gt;まんま&lt;a href="http://d.hatena.ne.jp/ytakano/20100317/1268778286"&gt;こちらのサイト&lt;/a&gt;を参考にさせてもらった。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;boost/intrusive_ptr.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/shared_ptr.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;boost/pool/pool.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;new&amp;gt; // std::bad_alloc用&lt;br /&gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class testClass {&lt;br /&gt;private:&lt;br /&gt; static boost::pool&amp;lt;&amp;gt; p;&lt;br /&gt; &lt;br /&gt;public:&lt;br /&gt; testClass():refCount(0) {}&lt;br /&gt; ~testClass()   {}&lt;br /&gt; &lt;br /&gt; static inline boost::intrusive_ptr&amp;lt;testClass&amp;gt;  createInPtr()&lt;br /&gt; {&lt;br /&gt;  return boost::intrusive_ptr&amp;lt;testClass&amp;gt;(new_testClass());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; static inline boost::shared_ptr&amp;lt;testClass&amp;gt;     createShPtr()&lt;br /&gt; {&lt;br /&gt;  //第二引数でdelete用の関数を渡せる&lt;br /&gt;  return boost::shared_ptr&amp;lt;testClass&amp;gt;(new_testClass(),testClass::delete_testClass);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; static inline testClass* new_testClass()&lt;br /&gt; {&lt;br /&gt;  testClass* temp = (testClass*)p.malloc();&lt;br /&gt;  if (!temp) throw std::bad_alloc(); //　メモリ確保に失敗した際、poolは0を返すため例外はこちらで投げとく&lt;br /&gt;  return new(temp)testClass();       // 配置new&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; static inline void delete_testClass(testClass *ptr)&lt;br /&gt; {&lt;br /&gt;  ptr-&amp;gt;~testClass(); // freeはデストラクタを呼んでくれないため自前で呼ぶ必要あり&lt;br /&gt;  p.free(ptr);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;private:&lt;br /&gt; &lt;br /&gt; // intrusive_ptr用 参照カウンタ&lt;br /&gt; int refCount;&lt;br /&gt; &lt;br /&gt; // intrusive_ptr用 参照が増えた時呼ばれる処理&lt;br /&gt; friend void intrusive_ptr_add_ref( testClass* ptr )&lt;br /&gt; {&lt;br /&gt;  ptr-&amp;gt;refCount++; &lt;br /&gt; }&lt;br /&gt;    &lt;br /&gt; // intrusive_ptr用 参照が減った時呼ばれる処理 参照が0になるとdeleteが呼ばれる。&lt;br /&gt; friend void intrusive_ptr_release( testClass* ptr )&lt;br /&gt; { &lt;br /&gt;  ptr-&amp;gt;refCount--;&lt;br /&gt;  if (ptr-&amp;gt;refCount &amp;lt;= 0) delete_testClass(ptr);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// pool の初期化&lt;br /&gt;boost::pool&amp;lt;&amp;gt; testClass::p(sizeof(testClass));&lt;br /&gt;&lt;br /&gt;typedef boost::intrusive_ptr&amp;lt;testClass&amp;gt; inPtr;&lt;br /&gt;typedef boost::shared_ptr&amp;lt;testClass&amp;gt; shPtr; &lt;br /&gt;&lt;br /&gt;// 時間計測用&lt;br /&gt;double gettimeofday_sec()&lt;br /&gt;{&lt;br /&gt;    struct timeval tv;&lt;br /&gt;    gettimeofday(&amp;amp;tv, NULL);&lt;br /&gt;    return tv.tv_sec + (double)tv.tv_usec*1e-6;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main () {&lt;br /&gt; int max_count = 1000000;&lt;br /&gt; double start, end;&lt;br /&gt; &lt;br /&gt; // 比較用　ふつーに new delete ////////////// &lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  testClass *tp = new testClass();&lt;br /&gt;  delete tp;&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f new delete\n", end - start);&lt;br /&gt; &lt;br /&gt; // shared_ptr /////////////////////////// &lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  shPtr tcShp = testClass::createShPtr();&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f shared_ptr\n", end - start);&lt;br /&gt; &lt;br /&gt; // intrusive_ptr ///////////////////////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  inPtr tcInp = testClass::createInPtr();&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f intrusive_ptr\n", end - start);&lt;br /&gt; &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実行速度は以下の通り&lt;br /&gt;&lt;blockquote&gt;0.060343 new delete&lt;br /&gt;0.080444 shared_ptr&lt;br /&gt;0.003590 intrusive_ptr&lt;/blockquote&gt;intrusive_ptrに関してはかなり高速。&lt;br /&gt;shared_ptrは上記のサイトにあるように参照カウンタ分のオーバヘッドが残っているため通常のnew deleteとトントンくらい。&lt;br /&gt;&lt;br /&gt;intrusive_ptrの速度は魅力的だが、shared_ptrと対でつかうweak_ptrを使用したいのでこれで我慢しとく。&lt;br /&gt;&lt;br /&gt;この書き方だと、メモリはrelease_memory()を呼んでやらない限りプールされ続ける。そのため、数回しかそのクラスを使わない場合は、メモリ効率が良くなさそう。けど、毎フレーム大量かつ一定の量クラスのメモリ確保と解放を行うような場合は使えそうだ。&lt;br /&gt;&lt;br /&gt;あと、現時点でスレッドセーフという考え方を全く理解してないため、上のコードも安全かどうかさっぱり分かってない。そういった理由から、singleton_poolより単純に早かったstaticなpoolを使ってたりする。まあ、もう少し勉強したらもう一回チャレンジしてみよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-6748816367501178212?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/6748816367501178212/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/02/sharedptrintrusiveptr_27.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6748816367501178212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6748816367501178212'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/02/sharedptrintrusiveptr_27.html' title='shared_ptrとintrusive_ptrをメモリプールをつかって高速化してみる'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-6717188016311503731</id><published>2011-02-27T03:48:00.003+09:00</published><updated>2011-03-02T02:45:06.997+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Boost'/><category scheme='http://www.blogger.com/atom/ns#' term='Cinder'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>shared_ptrとintrusive_ptrの実装方法とかパフォーマンスとか</title><content type='html'>最近、C++のメモリの動的確保や管理の方法についていろいろ調べまわっていたので、わかったことをメモしておく。&lt;br /&gt;&lt;br /&gt;まずは、スマートポインタについて。&lt;br /&gt;&lt;br /&gt;スマートポインタとは、登録したオブジェクトがどこからも参照されなくなったさい、自動でdeleteを呼んでくれる便利クラス。ガベージコレクションの実装された言語ばかりさわってた自分にとって、これはすごくありがたい。&lt;br /&gt;&lt;br /&gt;shared_ptrやauto_ptr、intrusive_ptr等が存在するけど、今回はshared_ptrとintrusive_ptrの使い方とパフォーマンスを比較してみた。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:cpp"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;boost/intrusive_ptr.hpp&amp;gt;&lt;br /&gt;#include &amp;lt;boost/shared_ptr.hpp&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;&lt;br /&gt;class testClass {&lt;br /&gt; &lt;br /&gt;public:&lt;br /&gt; testClass():refCount(0) {}&lt;br /&gt; ~testClass()   {}&lt;br /&gt; &lt;br /&gt; static inline boost::intrusive_ptr&amp;lt;testClass&amp;gt;  createInPtr()&lt;br /&gt; {&lt;br /&gt;  return boost::intrusive_ptr&amp;lt;testClass&amp;gt;(new testClass());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; static inline boost::shared_ptr&amp;lt;testClass&amp;gt;     createShPtr()&lt;br /&gt; {&lt;br /&gt;  return boost::shared_ptr&amp;lt;testClass&amp;gt;(new testClass());&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;private:&lt;br /&gt; &lt;br /&gt; // intrusive_ptr用 参照カウンタ&lt;br /&gt; int refCount;&lt;br /&gt; &lt;br /&gt; // intrusive_ptr用 参照が増えた時呼ばれる処理&lt;br /&gt; friend void intrusive_ptr_add_ref( testClass* p )&lt;br /&gt; {&lt;br /&gt;  p-&amp;gt;refCount++; &lt;br /&gt; }&lt;br /&gt;    &lt;br /&gt; // intrusive_ptr用 参照が減った時呼ばれる処理 参照が0になるとdeleteが呼ばれる。&lt;br /&gt; friend void intrusive_ptr_release( testClass* p )&lt;br /&gt; { &lt;br /&gt;  p-&amp;gt;refCount--;&lt;br /&gt;  if (p-&amp;gt;refCount &amp;lt;= 0) delete p;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;typedef boost::intrusive_ptr&amp;lt;testClass&amp;gt; inPtr;&lt;br /&gt;typedef boost::shared_ptr&amp;lt;testClass&amp;gt; shPtr; &lt;br /&gt;&lt;br /&gt;// 時間計測用&lt;br /&gt;double gettimeofday_sec()&lt;br /&gt;{&lt;br /&gt;    struct timeval tv;&lt;br /&gt;    gettimeofday(&amp;amp;tv, NULL);&lt;br /&gt;    return tv.tv_sec + (double)tv.tv_usec*1e-6;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main () {&lt;br /&gt; int max_count = 1000000;&lt;br /&gt; double start, end;&lt;br /&gt; &lt;br /&gt; // 比較用　ふつーに new delete ////////////// &lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  testClass *tp = new testClass();&lt;br /&gt;  delete tp;&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f new delete\n", end - start);&lt;br /&gt; &lt;br /&gt; // shared_ptr /////////////////////////// &lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  shPtr tcShp = testClass::createShPtr();&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f shared_ptr\n", end - start);&lt;br /&gt; &lt;br /&gt; // intrusive_ptr ///////////////////////&lt;br /&gt; start = gettimeofday_sec();&lt;br /&gt; for (int i = 0; i &amp;lt; max_count; i++){&lt;br /&gt;  inPtr tcInp = testClass::createInPtr();&lt;br /&gt; }&lt;br /&gt; end   = gettimeofday_sec();&lt;br /&gt; printf("%f intrusive_ptr\n", end - start);&lt;br /&gt; &lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;実行速度はこんな感じになった&lt;br /&gt;&lt;blockquote&gt;0.065289 new delete&lt;br /&gt;0.178643 shared_ptr&lt;br /&gt;0.059417 intrusive_ptr&lt;/blockquote&gt;shared_ptrがかなり遅い。内部で参照カウンタをnewしてるせいか。&lt;br /&gt;てか、new delete自体も意外なほどマイペース。&lt;br /&gt;&lt;br /&gt;メモリプールをつかってパフォーマンスの改善を試してみたので&lt;a href="http://itr0510.blogspot.com/2011/02/sharedptrintrusiveptr_27.html"&gt;次回&lt;/a&gt;にまとめる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-6717188016311503731?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/6717188016311503731/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/02/sharedptrintrusiveptr.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6717188016311503731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/6717188016311503731'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/02/sharedptrintrusiveptr.html' title='shared_ptrとintrusive_ptrの実装方法とかパフォーマンスとか'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-4448148917233129572</id><published>2011-02-26T18:00:00.012+09:00</published><updated>2011-02-26T19:06:48.270+09:00</updated><title type='text'>bloggerでSyntaxHighlighter</title><content type='html'>手始めに記事上のコードを見やすくするために、SyntaxHighlighterを導入してみる。&lt;br /&gt;&lt;br /&gt;いろいろやり方はあるみたいだけど、今回は&lt;a href="http://kennyj-jp.blogspot.com/2011/01/bloggersyntaxhighlighter.html"&gt;こちらの方の記事&lt;/a&gt;を参考にさせてもらった。&lt;br /&gt;使用したい言語を追加しつつ、headタグ内に以下のコードをペースト&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:html"&gt;&amp;lt;!--start SyntaxHighlighter--&amp;gt; &lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/&amp;gt; &lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/&amp;gt; &lt;br /&gt;&amp;lt;script type='text/javascript'&amp;gt; &lt;br /&gt;  window.onload = function() {&lt;br /&gt;  SyntaxHighlighter.autoloader(&lt;br /&gt;      "js jscript javascript    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js"&lt;br /&gt;     ,"bash shell               http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js"&lt;br /&gt;     ,"css                      http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js"&lt;br /&gt;     ,"html xml xhtml           http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js"&lt;br /&gt;     ,"cpp c                    http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js"&lt;br /&gt;     ,"java                     http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js"&lt;br /&gt;     ,"actionscript3 as3        http://alexgorbatchev.com/pub/sh/current/scripts/shBrushAS3.js"&lt;br /&gt;     ,"php                      http://alexgorbatchev.com/pub/sh/current/scripts/hBrushPhp.js"&lt;br /&gt;  );&lt;br /&gt;  SyntaxHighlighter.all();&lt;br /&gt;};&lt;br /&gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;!--end SyntaxHighlighter--&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで準備完了。あとは、投稿画面のHTMLの編集で、コードを以下のようにpreタグで囲ってやる。&lt;br /&gt;brush:のあとのhogeに&lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/manual/api/autoloader.html"&gt;言語に対応した名称&lt;/a&gt;を入れてやればいい。&lt;br /&gt;&lt;pre class="brush:html"&gt;&amp;lt;pre class="brush:hoge"&amp;gt;&lt;br /&gt;コードを記述...&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あと、htmlの記述に&lt;a href="http://www.kuribo.info/2008/06/blogger-syntax-highlighter.html"&gt;こちらの変換ツール&lt;/a&gt;を使用させてもらった。便利。&lt;br /&gt;&lt;br /&gt;jsをアップロードしておきたいんだけど、どこにおけばいいんだろ？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-4448148917233129572?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/4448148917233129572/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/02/bloggersyntaxhighlighter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/4448148917233129572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/4448148917233129572'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/02/bloggersyntaxhighlighter.html' title='bloggerでSyntaxHighlighter'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-646629770840133147.post-9072406357832741881</id><published>2011-02-25T16:18:00.001+09:00</published><updated>2011-02-26T16:18:54.295+09:00</updated><title type='text'>このブログについて</title><content type='html'>プログラミングの勉強、メモ用にブログを使ってみることにした。&lt;br /&gt;&lt;br /&gt;基本的にopenframeworksやcinder、processingのようなメディアアート系のフレームワークについての個人的メモを置く場所となる予定。&lt;br /&gt;&lt;br /&gt;てきとーなこと書いて、だれかに優しく正してもらう、そんなブログにしたい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/646629770840133147-9072406357832741881?l=itr0510.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://itr0510.blogspot.com/feeds/9072406357832741881/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://itr0510.blogspot.com/2011/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/9072406357832741881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/646629770840133147/posts/default/9072406357832741881'/><link rel='alternate' type='text/html' href='http://itr0510.blogspot.com/2011/02/blog-post.html' title='このブログについて'/><author><name>goto</name><uri>http://www.blogger.com/profile/13062493562915171719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
