<?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-2837470629762242097</id><updated>2011-08-19T15:08:01.993+09:00</updated><category term='雑記'/><category term='メモ'/><category term='CI'/><category term='ユニットテスト'/><category term='hudson'/><category term='自作'/><category term='3D'/><category term='git'/><category term='デザインパターン'/><title type='text'>あまやどり</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-1339953061521452896</id><published>2011-08-19T14:53:00.004+09:00</published><updated>2011-08-19T15:08:02.003+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>VST SDKとかのメモ</title><content type='html'>VSTエフェクトを使ってみたいなーと思ったので調べてみたメモ。&lt;br /&gt;&lt;br /&gt;SDKは下記からダウンロードできる。ユーザ登録が必要。&lt;br /&gt;http://www.steinberg.net/en/company/developer.html&lt;br /&gt;&lt;br /&gt;2.4とかと3.5とかがあるけど、3.x系のプラグインをあまり知らないので、ひとまずは2.4で。&lt;br /&gt;&lt;br /&gt;ちなみにライセンスを読んだところ、英文だから合ってるか怪しいけど、SDK使って作ったものを公開するときは連絡しろよ的なことが書いてあった気がするので、ちゃんと調べた方がよさげ。&lt;br /&gt;VSTプラグインをつくるのにはユニークなベンダーID的なものが必要らしいのでなおのこと注意。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SDKをダウンロードすると、ドキュメントとサンプルがついていて、VST hostについてもminihostというサンプルがあるので、それを参考に。&lt;br /&gt;&lt;br /&gt;基本的には&lt;br /&gt;　・DLLを読み込む&lt;br /&gt;　・エフェクトのインスタンスを作成&lt;br /&gt;　・初期化&lt;br /&gt;　・入力バッファにデータを入れて渡すと出力バッファにデータが入って帰ってくる&lt;br /&gt;　・上記の出力バッファを元に鳴らす&lt;br /&gt;&lt;br /&gt;入出力データは 1サンプルあたり float いっこ。PCMからだと変換が必要。&lt;br /&gt;サンプリングレートやブロックサイズ(一気に処理する量)は初期化時に設定。&lt;br /&gt;&lt;br /&gt;バッファのIn/Outに同じアドレスを渡していいかは調べてない。プラグインごとの実装に依りそうな気もするので、とりあえず別にしてる。&lt;br /&gt;&lt;br /&gt;DAWで見るVSTごとの設定画面も作ってくれる。作らないままでもいられる。&lt;br /&gt;&lt;br /&gt;CubaseについてたVST Effectを挿してみようと思ったら、Cubaseから使ってね的なエラーがでて、とてもがっかりした。&lt;br /&gt;&lt;br /&gt;VSTiについてはまたそのうち。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-1339953061521452896?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/1339953061521452896/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2011/08/vst-sdk.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1339953061521452896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1339953061521452896'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2011/08/vst-sdk.html' title='VST SDKとかのメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-6866847167599362380</id><published>2010-06-06T15:20:00.011+09:00</published><updated>2010-06-06T15:43:47.055+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>C#からC++にプロセス間通信したメモ</title><content type='html'>C++で作ってるゲームをC#で作ったデバッグ用フロントエンドから操作するためにプロセス間通信をしたメモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;通信の仕方&lt;/span&gt;&lt;br /&gt;WM_COPYDATAをSendMessageなどで送る。&lt;br /&gt;&lt;pre name="code" class="c#:nocontrols"&gt;&lt;br /&gt;[DllImport("user32.dll")]&lt;br /&gt;private static extern uint SendMessage(IntPtr hWnd, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);&lt;br /&gt;&lt;br /&gt;private const Int32 WM_COPYDATA = 0x4A;&lt;br /&gt;&lt;br /&gt;struct COPYDATASTRUCT&lt;br /&gt;{&lt;br /&gt;    public IntPtr dwData;&lt;br /&gt;    public UInt32 cbData;&lt;br /&gt;    public IntPtr lpData;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;COPYDATASTRUCT data = new COPYDATASTRUCT();&lt;br /&gt;{&lt;br /&gt;    // 色々設定&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// 通信する&lt;br /&gt;SendMessage(hTargetWindow, WM_COPYDATA, hMyWindow, ref data);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;文字列を送る&lt;/span&gt;&lt;br /&gt;Unicode文字を送る。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c#:nocontrols"&gt;&lt;br /&gt;// 送る側 (C#)&lt;br /&gt;COPYDATASTRUCT data = new COPYDATASTRUCT();&lt;br /&gt;data.lpData = Marshal.StringToBSTR(msg);&lt;br /&gt;data.cbData = (uint)msg.Length*sizeof(char);&lt;br /&gt;&lt;br /&gt;SendMessage(hTargetWindow, WM_COPYDATA, hMyWindow, ref data);&lt;br /&gt;&lt;br /&gt;Marshal.FreeBSTR(data.lpData);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// 受け取る側 (C++)&lt;br /&gt;switch(msg) {&lt;br /&gt;    case WM_COPYDATA:&lt;br /&gt;    {&lt;br /&gt;        COPYDATASTRUCT * const pData = reinterpret_cast&amp;lt;COPYDATASTRUCT *&amp;gt;(lp);&lt;br /&gt;        wstring str;&lt;br /&gt;        str.assign(reinterpret_cast&amp;lt;wchar_t *&amp;gt;(pData-&amp;gt;lpData), pData-&amp;gt;cbData/sizeof(wchar_t));&lt;br /&gt;    }&lt;br /&gt;    break;&lt;br /&gt;}&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/2837470629762242097-6866847167599362380?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/6866847167599362380/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/06/cc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6866847167599362380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6866847167599362380'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/06/cc.html' title='C#からC++にプロセス間通信したメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-851623385101591631</id><published>2010-05-30T18:19:00.001+09:00</published><updated>2010-05-30T18:20:53.254+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>試験受けてきたんですけど</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p1vux84u5yg/TAIt6hHP5rI/AAAAAAAAABg/3fdQFnXXqX8/s1600/20100530.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_p1vux84u5yg/TAIt6hHP5rI/AAAAAAAAABg/3fdQFnXXqX8/s320/20100530.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5476990580180379314" /&gt;&lt;/a&gt;&lt;br /&gt;いつもこんな感じで体のどこかが痛くなって困ります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-851623385101591631?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/851623385101591631/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/05/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/851623385101591631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/851623385101591631'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/05/blog-post.html' title='試験受けてきたんですけど'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p1vux84u5yg/TAIt6hHP5rI/AAAAAAAAABg/3fdQFnXXqX8/s72-c/20100530.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-7328537987415787860</id><published>2010-05-16T14:43:00.007+09:00</published><updated>2010-05-16T15:01:43.287+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>premake4を使ってみたメモ</title><content type='html'>定義ファイルから.slnとかmakefileとかを自動生成するのにpremake4を使ってみたメモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;公式&lt;/span&gt;&lt;br /&gt;&lt;a href="http://industriousone.com/premake"&gt;http://industriousone.com/premake&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんな感じのバッチを書いて&lt;br /&gt; @set PATH=%PATH%;%CD%\path\to\tool\premake4&lt;br /&gt; @premake4 --file=YourDefinitionFile.lua vs2008&lt;br /&gt; @YourSolutionFile.sln&lt;br /&gt;そのバッチを起動するとVS2008用の.slnを自動生成して勝手に起動するようにしてみている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;定義ファイルの書き方&lt;/span&gt;&lt;br /&gt;&lt;a href="http://industriousone.com/introducing-premake"&gt;公式の解説&lt;/a&gt;が充実している。&lt;br /&gt;&lt;br /&gt;てきとーにメモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;設定の適用範囲&lt;/span&gt;&lt;br /&gt;definesとかbuildoptionsとかみたいなのは、projectに対して書くと全てのビルド構成に、configuration "Debug"の下に書くとDebugビルド時のみに適用されるようになる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ファイル追加&lt;/span&gt;&lt;br /&gt;*はワイルドマーク&lt;br /&gt;**は下位のディレクトリも探査するワイルドマーク&lt;br /&gt;excludesで無視も指定できる。ただし、あらかた探査した上で除外するようで、生成が軽くはならない。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;出力先のディレクトリ&lt;/span&gt;&lt;br /&gt;$(OutDir): targetdir&lt;br /&gt;$(IntDir): objdir&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;依存するライブラリ&lt;/span&gt;&lt;br /&gt;.libとかの拡張子はつけずに指定する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;プロジェクトの設定&lt;/span&gt;&lt;br /&gt;&lt;a href="http://industriousone.com/flags"&gt;flags&lt;/a&gt; で指定する。&lt;br /&gt;目的のものがない場合は buildoptions や linkoptions で無理やり指定する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;プリコンパイル済みヘッダ&lt;/span&gt;&lt;br /&gt;使用するヘッダ: pchheader&lt;br /&gt;作成するソース: pchsource&lt;br /&gt;その他のソースは全て「プリコンパイル済みヘッダを使用する」になる&lt;br /&gt;強制インクルード: buildoptionsで"/FI stdafx.h"とでも指定する&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;シンボルを残しつつリリース版のランタイムライブラリを使いたい&lt;/span&gt;&lt;br /&gt;flagsでSymbolsを指定すると/MTdになってしまう。&lt;br /&gt;やり方がわからなかったので linkoptions で /MTを指定。&lt;br /&gt;リンク時にwarningがでてしまうけど、/MTが優先されてるので妥協する。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-7328537987415787860?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/7328537987415787860/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/05/premake4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7328537987415787860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7328537987415787860'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/05/premake4.html' title='premake4を使ってみたメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3051010126540524210</id><published>2010-05-11T23:24:00.003+09:00</published><updated>2010-05-11T23:31:55.023+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>Hudsonのplugiに手を加えてみたメモ</title><content type='html'>このたび必要に駆られてHudsonのpluginに手を入れてビルドしなおしてみたのでメモしておきます。&lt;br /&gt;Java文化よくわかんない……。そのうち勉強する。&lt;br /&gt;&lt;br /&gt;ちなみに、実際にやった修正はその場しのぎ的な対応を入れるためのものなので、元のプロジェクトにフィードバックはできそうにないです……。&lt;br /&gt;&lt;br /&gt;とても参考にさせていただきました&lt;br /&gt;http://d.hatena.ne.jp/fits/20080502/1209726765&lt;br /&gt;&lt;br /&gt;本家&lt;br /&gt;http://wiki.hudson-ci.org/display/JA/Extend+Hudson&lt;br /&gt;&lt;br /&gt;1. とても参考にさせていただいたサイトを参考にmavenとかを入れたり環境をセットアップ。&lt;br /&gt;2. https://svn.dev.java.net/svn/hudson/trunk/hudson/plugins/ 以下のお目当てのpluginをSVNでチェックアウト。&lt;br /&gt;2-1. リポジトリから取ると新しすぎたりするので、ログをみてよさげなリビジョンに戻す。&lt;br /&gt;3. ソースをいじる。&lt;br /&gt;4. mvn package&lt;br /&gt;5. hpiとかplugin名のフォルダをHudsonのpluginsフォルダに上書き。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-3051010126540524210?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3051010126540524210/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/05/hudsonplugi.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3051010126540524210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3051010126540524210'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/05/hudsonplugi.html' title='Hudsonのplugiに手を加えてみたメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-8808270386260886800</id><published>2010-03-27T18:11:00.002+09:00</published><updated>2010-03-27T18:12:41.796+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>DIALOG IN THE DARKに参加してきました</title><content type='html'>暗闇からでたとき、何か残念な気持ちがよぎりました。&lt;br /&gt;&lt;br /&gt;公式の受け売りで説明すると、DIALOG IN THE DARKは、本当の闇の中でのコミュニケーションを体験できるエンターテインメントです。&lt;br /&gt;暗闇のエキスパートである視覚障碍者のアテンドに案内されて、目を開けても閉じても変わらない本当の闇の中を過ごします。&lt;br /&gt;&lt;br /&gt;面白みは大きく二つあると思いました。&lt;br /&gt;印象が視覚情報に影響されない。&lt;br /&gt;助け合う必然性がある。&lt;br /&gt;&lt;br /&gt;助け合う必然性があると、人は自信を持って友好的になれます。&lt;br /&gt;今の世の中、よかれと思ってやったことさえ、時として迷惑にとられてしまったり。&lt;br /&gt;労力を割いてまで嫌な思いをするリスクを負いたくありませんよね。&lt;br /&gt;&lt;br /&gt;自力でできて然るべきという基準が高い気もします。&lt;br /&gt;そして自力でできることを頼ることなかれという感じもします。&lt;br /&gt;だからちょっと忘れかけてるのかもしれませんが、&lt;br /&gt;助け合う必然性があると、人は自信を持って友好的になれます。&lt;br /&gt;&lt;br /&gt;暗闇の中でのあの一体感は不思議でした。&lt;br /&gt;数分前に出会ったばかりだというのに。&lt;br /&gt;暗闇からでたとき、何か残念な気持ちがよぎりました。&lt;br /&gt;何だかみんな、それぞれ自分の世界に帰っていったような気がしまして。&lt;br /&gt;アテンドの方だけは、そのままそこにいるのに。&lt;br /&gt;&lt;br /&gt;DIALOG IN THE DARK&lt;br /&gt;&lt;a href="http://www.dialoginthedark.com/"&gt;http://www.dialoginthedark.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-8808270386260886800?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/8808270386260886800/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/03/dialog-in-dark.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/8808270386260886800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/8808270386260886800'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/03/dialog-in-dark.html' title='DIALOG IN THE DARKに参加してきました'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-4735679190135303090</id><published>2010-03-21T17:55:00.005+09:00</published><updated>2010-03-21T22:53:02.148+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>GamePM #7 に参加してきました</title><content type='html'>ゲーム制作おもにプロジェクトマネジメントに関する勉強会に参加してきました。&lt;br /&gt;詳しくは&lt;a href="http://sites.google.com/site/gpmahome/"&gt;GamePM勉強会のWebサイト&lt;/a&gt;をご参照ください。&lt;br /&gt;&lt;br /&gt;また、今回の内容については&lt;a href="http://d.hatena.ne.jp/thinca/20100321/1269114480"&gt;第7回GamePM勉強会に参加してきた&lt;/a&gt;というエントリが参考になります。&lt;br /&gt;なので感想中心で。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;発表について&lt;/span&gt;&lt;br /&gt;　全然知らない世界の話とかレアなケースの話とかが聞けて面白かったです。喋るのうまいわスライドも凝ってるわ、本気すぎます。&lt;br /&gt;　発表の内容を題材にディスカッションみたいなかたちがあっても面白いかもなぁと思いました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;「３DCG映像製作の現場の声とマネージメントの声」&lt;/span&gt;&lt;br /&gt;　よく熾烈を極めるという噂を聞く、アニメ業界の話。&lt;br /&gt;　めりこみ直しを新人にっていうのは参考になりました。一昨年くらいのCEDECであった『メインプログラマーはボトルネック？』でも似たような話があった気がします。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;「Scrum 始めました」&lt;/span&gt;&lt;br /&gt;　まず言いだしっぺが上の層というのが羨ましいです。&lt;br /&gt;　イテレーション内の仕様追加の拒否についてはやっぱり難しく、「検証」をタスクに積むっていうのを提案しましたが、それもどれだけで見積もればいいのかが難点です。これこれこういう案がいくつあって、それを試す、というかたちになっていると見積もりやすいんですが、何々したいのでそれの検証、とかだけだと不味い予感がします。案を出すために何々を試す、とかになっていてほしいです。&lt;br /&gt;　あとは、ときおり繰り出される&lt;a href="http://rubycolor.org/takahashi/"&gt;高橋メソッド&lt;/a&gt;がいちいちツボに入ってやばかったです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ライトニングトーク&lt;/span&gt;&lt;br /&gt;　短い時間での説明なため要点が絞られていて興味をひきやすいと思いました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;「認定スクラムマスターについて」&lt;/span&gt;&lt;br /&gt;　まずScrumPrimerを読んでおいてそっから講習を受けるとあったので、ググってみました。&lt;br /&gt;　http://www.rallydev.com/documents/scrumprimer.pdf&lt;br /&gt;　英語ですが、日本語化プロジェクトもあるみたいですね。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;「５分でわかるARG」&lt;/span&gt;&lt;br /&gt;　オリエンテーリングとARGの違いという質問への答え（「非現実感」や「ストーリー」）は、将棋とコンピュータゲームのストラテジとの違いみたいなものかなぁと思いました。&lt;br /&gt;　ARG楽しいよARG.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;「Vimエディタを使おう」&lt;/span&gt;&lt;br /&gt;　Vimを勧めるのにVimを使ってプレゼンっていうのは素敵でした。&lt;br /&gt;　多分、次回はEmacsを使おうっていうLTがあるんじゃないでしょうか。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ワークショップ&lt;/span&gt;&lt;br /&gt;　チームでも振り返りはある程度の区切りごとにやりたいなぁと思いました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;交流&lt;/span&gt;&lt;br /&gt;　同僚がいて笑いました。上司がいてびびった方もいたそうです。&lt;br /&gt;　個人用の名刺にTwitterとかFacebookのアカウントを書いておけばよかったと思いました。ウィルコムでトマトっぽいメールアドレスなのが私です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;その他&lt;/span&gt;&lt;br /&gt;　今回は、IGDAのページにあった紹介記事で知りました。&lt;br /&gt;　みんなIDGAとかDiGRAはフィードに入れておくといいと思うんですよ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-4735679190135303090?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/4735679190135303090/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/03/gamepm-7.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4735679190135303090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4735679190135303090'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/03/gamepm-7.html' title='GamePM #7 に参加してきました'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-2165284538039774481</id><published>2010-02-24T19:45:00.007+09:00</published><updated>2010-03-21T00:05:39.940+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>共用リポジトリとWindowsでGit</title><content type='html'>自分用メモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[サーバ] Gitのインストール&lt;/span&gt;&lt;br /&gt;ググると出てきます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;TortoiseGitのインストール&lt;/span&gt;&lt;br /&gt;これもググると出てきます。&lt;br /&gt;SSHクライアントにはTortoisePLinkを使うようにします。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[サーバ] 共用リポジトリの作成&lt;/span&gt;&lt;br /&gt;Git用のユーザをつくって作業。&lt;br /&gt;Git用のユーザは鍵認証でSSHからログインできるようにしておきます。&lt;br /&gt;&lt;br /&gt; server$ mkdir /path/to/shared/repository&lt;br /&gt; server$ cd /path/to/shared/repository&lt;br /&gt; server$ git init --bare --shared&lt;br /&gt;  (1.5.2.1では git --bare init --shared じゃないとだめだった)&lt;br /&gt;&lt;br /&gt; server$ mkdir /path/to/temp/repository&lt;br /&gt; server$ cd /path/to/temp/repository&lt;br /&gt; server$ git init&lt;br /&gt; (適当にコミットする)&lt;br /&gt; server$ git push /path/to/shared/repository master&lt;br /&gt; &lt;br /&gt; server$ cd /path/to/shared/repository&lt;br /&gt; server$ git log&lt;br /&gt; (コミットログが確認できる)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;作業環境から共用リポジトリにアクセスできるようにする&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.clear-code.com/blog/2009/7/8.html"&gt;『TortoiseGitでOpenSSHの鍵を使う』&lt;/a&gt;のまんまやりました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;作業環境にCloneする&lt;/span&gt;&lt;br /&gt;適当なフォルダで右クリック→TortoiseGit→Clone&lt;br /&gt;urlには&lt;br /&gt; ssh://username@hostname/path/to/shared/repository&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;その後&lt;/span&gt;&lt;br /&gt;push/pullしたりする度にどの鍵を使うか聞かれる場合は、右クリック→TortoiseGit→Settings→Remote→origin→Putty Keyで指定。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;外部参照&lt;/span&gt;&lt;br /&gt;Submodule&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;その他&lt;/span&gt;&lt;br /&gt;アクセスするユーザが増えるたびにLinuxのユーザを増やすのも嫌なので、同じユーザを使いまわすか、gitosisを使うかしようかと。&lt;br /&gt;sshでログインできてしまうのでchrootします。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;TortoiseGitへの疑惑&lt;/span&gt;&lt;br /&gt;Addしたやつは次のCommitに強制的に含まれる？&lt;br /&gt;Addしてチェックせずにコミット→Addだけコミットされる&lt;br /&gt;Addしてチェックしてコミット→AddとModifyがコミットされる&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-2165284538039774481?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/2165284538039774481/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/02/windowsgit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2165284538039774481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2165284538039774481'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/02/windowsgit.html' title='共用リポジトリとWindowsでGit'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-5671150010923358566</id><published>2010-02-23T00:15:00.000+09:00</published><updated>2010-02-23T00:15:30.346+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3D'/><title type='text'>イノシシって何て鳴くんですか</title><content type='html'>今年の干支にまったくちなまず、イノシシをつくってみました。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_p1vux84u5yg/S4KfBUh9vWI/AAAAAAAAABY/ohrKN5fZMU8/s1600-h/100222_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_p1vux84u5yg/S4KfBUh9vWI/AAAAAAAAABY/ohrKN5fZMU8/s320/100222_003.png" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;なんでイノシシかというと、これまた深い理由がまったくないのですが、&lt;a href="http://ktg.xii.jp/mqo/"&gt;参考にした入門記事&lt;/a&gt;の題材だったからです……。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-5671150010923358566?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/5671150010923358566/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/02/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5671150010923358566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5671150010923358566'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/02/blog-post.html' title='イノシシって何て鳴くんですか'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p1vux84u5yg/S4KfBUh9vWI/AAAAAAAAABY/ohrKN5fZMU8/s72-c/100222_003.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-915708046563630936</id><published>2010-02-19T02:05:00.008+09:00</published><updated>2010-02-19T02:14:51.277+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>Skypeとかで自分の声とPCで再生している音との両方を送りたいのですが</title><content type='html'>マウスのクリック音に合わせて歌を口ずさむとかそういう需要がきっとあると思うんですよ。&lt;br /&gt;&lt;br /&gt;データの流れを極端に簡単にいうと次のような感じ：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;再生する場合&lt;/b&gt;&lt;br /&gt;プレイヤーなど→Audio OUT→スピーカーなど&lt;br /&gt;&lt;br /&gt;&lt;b&gt;自分の声など&lt;/b&gt;&lt;br /&gt;マイクなど→Audio IN→Skypeなど&lt;br /&gt;&lt;br /&gt;なので、Audio OUTへの出力を、Audio INに入力されたことにすればいいわけです。&lt;br /&gt;方法としては、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 物理的につなぐ&lt;/b&gt;&lt;br /&gt;スピーカーで出した音をマイクで拾うとか、LINE OUTをLINE INにつなぐとか。&lt;br /&gt;＜完＞&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. ハードウェア的になんとかする&lt;/b&gt;&lt;br /&gt;サウンドカードにそういう機能があるものもあるらしいけど、うちのオーディオI/Fにはそんなものはありません。&lt;br /&gt;＜完＞&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. ソフトウェア的になんとかする&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3-1. なんとかするソフト&lt;/b&gt;&lt;br /&gt;&lt;a href="http://homepage2.nifty.com/t_ishii/vs/"&gt;TiVSound&lt;/a&gt;というソフトで仮想デバイスをつくれ、その仮想デバイスのOUTに出力すると、仮想デバイスのINから入力したことにできます。&lt;br /&gt;詳しい使い方はReadmeなどで。&lt;br /&gt;Skypeでオーディオ設定のマイクを TiVSound Wave にしましょう。&lt;br /&gt;ちなみにスピーカーの設定は今までどおりにしておいたほうが良いと思われます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3-2. スピーカーからも流す&lt;/b&gt;&lt;br /&gt;再生すべきデータを仮想デバイスのOUTに送ってしまうと、今度はスピーカーから音がでなくなりますが、TiVSoundは仮想デバイスへのOUTを他のデバイスにも送れます。今まで使ってたAudio OUTに送ってやりましょう。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3-3. マイクで喋った声も流す&lt;/b&gt;&lt;br /&gt;仮想デバイスのOUTに出力したものが相手に送られるので、マイクからの入力を仮想デバイスのOUTに出力すれば、自分の声も相手に送れます。&lt;br /&gt;猿ちぃというソフトでやってみたところ、ピッチをかえる機能があったので、ピッチを下げて社会の闇的なことを言ったり、ピッチを上げて裏声で喋ったりして遊びまくりました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3-4. 遅延&lt;/b&gt;&lt;br /&gt;諦めましょう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-915708046563630936?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/915708046563630936/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2010/02/skypepc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/915708046563630936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/915708046563630936'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2010/02/skypepc.html' title='Skypeとかで自分の声とPCで再生している音との両方を送りたいのですが'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-7429976253799844292</id><published>2009-12-06T15:25:00.005+09:00</published><updated>2009-12-06T16:54:15.314+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>入手した本を読む合い間から</title><content type='html'>　第九回&lt;a href="http://bunfree.net/"&gt;文学フリマ&lt;/a&gt;に行ってきました。&lt;br /&gt;&lt;br /&gt;　ゲームプログラマという分類的には理系の私ですが、小中高と最も得意かつ好きな教科は国語でした。理系とか文系とかいう分類なんてナンセンスですよね。大学も情報系に進んだものの、科目等履修生として他大の文学部に紛れ込んだり、一時期は物書き志望の真似事のようなこともしていました。私は文章や言語による創作・表現が好きです。&lt;br /&gt;　好きだというのなら、なぜゲームプログラマになったの。創作を仕事にしないのならまだしも、別の創作を仕事に選ぶなんて、あなた、やっぱり私のことが好きだったなんて、口だけだったのね。&lt;br /&gt;　そんな、違うんです。私は今でも貴方のことが大好きで……ただ、自活して身を立てなければならない状況に際して、ゲームプログラミングについてだけは職業人としてやっていける甲斐性があっただけなんです。&lt;br /&gt;　じゃあ本当はゲームプログラミングなんか好きじゃないっていうの？&lt;br /&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/2837470629762242097-7429976253799844292?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/7429976253799844292/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7429976253799844292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7429976253799844292'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/12/blog-post.html' title='入手した本を読む合い間から'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-2510532462737064806</id><published>2009-11-29T15:23:00.007+09:00</published><updated>2009-11-29T15:34:20.107+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Hudsonでジョブの結果をメール以外で通知したい</title><content type='html'>ジョブ実行後の通知をメール以外の手段で行いたく、&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Plugins#Plugins-Buildnotifiers"&gt;Pluginを探してみた&lt;/a&gt;ところ、Twitterにつぶやくとかはあるのに、任意のリクエストを発行できるものがなさそうです……。&lt;br /&gt;&amp;nbsp;pluginを自作しようかと、&lt;a href="http://d.hatena.ne.jp/fits/20080502/1209726765"&gt;丁寧な導入記事&lt;/a&gt;があったので参考にしつつ環境まで整えましたが、何か そこまでがんばらなくてもできることに途中で気づきました。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;ジョブの結果を取得する&lt;/b&gt;&lt;br /&gt;&lt;a href="http://wiki.hudson-ci.org/display/JA/Remote+access+API"&gt;HudsonのAPI&lt;/a&gt;&lt;a href="http://wiki.hudson-ci.org/display/JA/Remote+access+API"&gt;&lt;/a&gt;を使えば取得できます。&lt;br /&gt;ジョブ名やビルドナンバーは&lt;a href="http://wiki.hudson-ci.org/display/JA/Building+a+software+project"&gt;環境変数から取得&lt;/a&gt;できます。こいつらをパラメータとして渡してやれば良さげ。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;ジョブ実行後の処理&lt;/b&gt;&lt;br /&gt;しかし「ビルド」の項目から外部のスクリプトを呼んでAPI経由でデータを取ろうとしても、まだ処理が終わっていないので、結果が取得できません(resultのないデータが帰ってきます)。&lt;br /&gt;&lt;br /&gt;ご心配ありません。&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Post+build+task"&gt;Post build task&lt;/a&gt;を使うことで、ジョブ実行後に処理を行えます。&lt;br /&gt;コンソール出力では結果より先にPost build taskの内容が表示されていますが、Post build taskの処理されるタイミングでAPIをたたくと、結果もちゃんと取得できます。（逆に言うと、Post build taskはジョブの成功／失敗に影響を与えられません。)&lt;br /&gt;&lt;br /&gt;あとはAPI経由で引っ張ってきたデータをみて、お好きな手段で通知すればO.K.です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-2510532462737064806?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/2510532462737064806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/11/hudson.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2510532462737064806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2510532462737064806'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/11/hudson.html' title='Hudsonでジョブの結果をメール以外で通知したい'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-4345660921133320916</id><published>2009-11-23T22:52:00.017+09:00</published><updated>2010-08-01T00:50:30.331+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='自作'/><title type='text'>OAuthで認証してTwitterでつぶやいてみた</title><content type='html'>&lt;a href="http://petitbanca.blogspot.com/2009/10/twitica.html"&gt;先日の記事で取り上げたTwitica&lt;/a&gt;を、&lt;a href="http://twitter.com/petitbanca/status/5971458121"&gt;OAuthでの認証に対応&lt;/a&gt;してみました。&lt;br /&gt;&lt;br /&gt;JavaとかPerlとかPythonとかRubyとかC#ではサンプルがさくっと見つかったりライブラリがあったりするのですが、C++は見つからず。C++/CLIなら.Net用のものが使えるみたいですが。しかしTwiticaがネイティブC++で書かれているので、そのまま貫き通します。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OAuthの手順&lt;/b&gt;&lt;br /&gt;下記の記事は大変参考になりました。ありがとうございます。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://labs.i-revo.jp/wiki/?xtra/OAuth1.0"&gt;『xtra/OAuth1.0』- irevo labs&lt;/a&gt; (OAuth仕様書の日本語訳) &lt;/li&gt;&lt;li&gt;&lt;a href="http://sayama-yuki.cocolog-nifty.com/blog/2009/09/twitteroauth-d7.html"&gt;『twitterでOAuthを使う方法（その１：認証まで）』 - てっく☆ゆきろぐ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sayama-yuki.cocolog-nifty.com/blog/2009/09/twitteroauth2ap.html"&gt;『twitterでOAuthを使う方法（その2：前回の続き〜APIにアクセスしてみる）』  - てっく☆ゆきろぐ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/shiba-yan/20090525/1243260021"&gt;『Twitter と OAuth まとめ』-  まめしば雑記&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;OAuthで認証してつぶやくのに必要なもの&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BASE64&lt;/li&gt;&lt;li&gt;URLエンコード (ただし16進数のアルファベットは大文字, 非対象文字は 英数字 - _ . ~)&lt;/li&gt;&lt;li&gt;HMAC-SHA1&lt;/li&gt;&lt;/ul&gt;自分で書きたくない場合は、 &lt;a href="http://clx.cielquis.net/"&gt;『CLX C++ Libraries』&lt;/a&gt;などを使うと良いかと。jsonのパーサーもあるので、処理結果をいじるのにも使えます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;つぶやくときに送信するもの&lt;/b&gt;&lt;br /&gt;OAuthでの認証に必要なパラメータをHTTPリクエストヘッダのAuthorizationで渡し、つぶやきに必要なパラメータをメッセージボディで渡します。&lt;br /&gt;&lt;br /&gt;Authorizationはこんな感じ:&lt;br /&gt;&lt;blockquote&gt;Authorization: OAuth realm="", oauth_consumer_key="***", oauth_nonce="***", oauth_signature="***", oauth_signature_method="HMAC-SHA1", oauth_timestamp="***", oauth_token="***", oauth_version="1.0"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;各パラメータの内容は前述のリンク先でご確認ください。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;署名(oauth_signature)の作り方&lt;/b&gt;&lt;br /&gt;どこがエンコード対象になるのかわかりづらいのでまとめてみました。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;HMACの鍵 = URLENCODE(Consumer secret) + "&amp;amp;" + URLENCODE(Access token secret);&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;REQUEST_METHOD = "POST" とか "GET" とか;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;REQUEST_URL = リクエストを投げる先のurl;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;　※ http://から書き, ポート番号は含むけど80と443の場合は含めず、すべて小文字で書く。&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;PARAMETERS = URLENCODE("oauth_consumer_key") + "=" + URLENCODE(Consumer Key) + "&amp;amp;" + .... + "&amp;amp;" + URLENCODE("oauth_version") + "=" + URLENCODE("1.0") + "&amp;amp;" + URLENCODE("status") + "=" + URLENCODE(つぶやきの内容);&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;　※ OAuth認証に必要なパラメータとリクエストに必要なパラメータに対し、キーと値をURLエンコードして = で結び、そのすべてをソートして &amp;amp; でつなぐ。&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;SIGNATURE_BASE_STRING =  URLENCODE(REQUEST_METHOD) + "&amp;amp;" + URLENCODE(REQUEST_URL) + "&amp;amp;" + URLENCODE(PARAMETERS);&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;DIGEST =  HMAC_SHA1(HMACの鍵, SIGNATURE_BASE_STRING);&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: rgb(238, 238, 238);"&gt;&lt;span style="color:blue;"&gt;oauth_signature&lt;/span&gt; = URLENCODE(BASE64(DIGEST));&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;やったーできたよー。&lt;br /&gt;あんまりわかりやすくならなかった……。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CLX C++ ライブラリを使う場合&lt;/b&gt;&lt;br /&gt;&lt;strike&gt;まず、CLX C++ ライブラリのURLエンコードは&lt;a href="http://clx.cielquis.net/uri.html"&gt;JavaScriptのencodeURI相当らしい&lt;/a&gt;ので、少しいじらないといけません。&lt;br /&gt;安直ですが、is_reserved()の中身を書き換えたり、encode()にstd::uppercaseを足したりすれば、とりあえず要件を満たせます。&lt;/strike&gt;&lt;br /&gt;※追記(2010/06/26): &lt;a href="http://d.hatena.ne.jp/tt_clown/20100607/1275912518"&gt;エンコード処理のインターフェース - Life like a clown&lt;/a&gt;を参考にしてください。&lt;br /&gt;&lt;br /&gt;&lt;pre class="c++:nocontrols" name="code"&gt;&lt;br /&gt;// 右辺値に前の項目での変数名を流用&lt;br /&gt;std::string strHmacKey = HMACの鍵;&lt;br /&gt;std::string strSignatureBaseString = SIGNATURE_BASE_STRING;&lt;br /&gt;const clx::sha1 &amp;amp;digest = clx::hmac&amp;lt;clx::sha1&amp;gt;(strHmacKey, strSignatureBaseString);&lt;br /&gt;std::string strOAuthSignature = clx::uri::encode(clx::base64::encode(reinterpret_cast&amp;lt;const char *&amp;gt;(digest.code()), digest.size()));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;余談 &lt;/b&gt;&lt;br /&gt;最近WPFをいじってみだしたのですが、何かアプリをつくるときはもうC#で書こうかな……。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-4345660921133320916?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/4345660921133320916/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/11/oauthtwitter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4345660921133320916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4345660921133320916'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/11/oauthtwitter.html' title='OAuthで認証してTwitterでつぶやいてみた'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-4360185688642054347</id><published>2009-10-17T21:52:00.005+09:00</published><updated>2009-10-17T22:27:36.933+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='自作'/><title type='text'>Twitica</title><content type='html'>知人に頼まれて作った投稿専用のTwitterクライアントに、久しぶりに手を入れました。&lt;br /&gt;UIがどんどんシンプルになっていきます。&lt;br /&gt;&lt;br /&gt;Twiticaと命名しましたが、申請を出していないので、こいつでつぶやいてもクライアント名は反映されません。&lt;br /&gt;OAuthはそのうち気が向いたら調べます。 &lt;br /&gt;&lt;br /&gt;Bloggerは画像しか置けないみたいなので、スクリーンショットのみ。 &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_p1vux84u5yg/Stm7h5kyTzI/AAAAAAAAABQ/GWxzR4wet9s/s1600-h/twitica_091017_001.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_p1vux84u5yg/Stm7h5kyTzI/AAAAAAAAABQ/GWxzR4wet9s/s320/twitica_091017_001.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Windows API + Winsock2でゴリ押し気味に作りました。&lt;br /&gt;URLエンコードとか Base64エンコードとかすら手書き。.NET系統の何かとか覚えた方がいいのかな。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下、メモ &lt;br /&gt;&lt;br /&gt;&lt;b&gt;どこでもウィンドウ移動&lt;/b&gt;&lt;br /&gt;WM_NCHITTESTでHTCAPTIONを返す。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ウィンドウを左右にしかリサイズさせない&lt;/b&gt;&lt;br /&gt;WM_SIZINGで飛んでくるlParamがRECT *なので無理やり書き換える。&lt;br /&gt;wParamでウィンドウのどの辺でリサイズしているかわかる(WMSZ_LEFTとか)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-4360185688642054347?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/4360185688642054347/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/10/twitica.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4360185688642054347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4360185688642054347'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/10/twitica.html' title='Twitica'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p1vux84u5yg/Stm7h5kyTzI/AAAAAAAAABQ/GWxzR4wet9s/s72-c/twitica_091017_001.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-4005887725669176363</id><published>2009-10-10T15:25:00.013+09:00</published><updated>2010-03-30T00:10:20.754+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CI'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>HudsonによるCIのメモ</title><content type='html'>導入と必要そうな設定までを書きます。&lt;br /&gt;環境は Windows XP, Hudson ver. 1.328&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;インストール&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;というか実行&lt;/span&gt;&lt;br /&gt;hudson.warをダウンロードしてきて java -jar hudson.war するだけです。&lt;br /&gt;Hudsonはブラウザから管理画面にアクセスするためにHTTPサーバになりますが、そのポート番号を変えるには --httpPort=N (Nは数値)のオプションを加えます。&lt;br /&gt;環境変数HUDSON_HOMEで指定したディレクトリにいろいろ置かれるので、@set HUDSON_HOME=好きなところ みたいなのの後に起動するバッチでも書いておきましょう。&lt;br /&gt;Windows XPでのデフォルトでは C:\Documents and Settings\UserName\.hudson というディレクトリになりますが、他のツールのことを考えて、. やスペース を含まないディレクトリにしておいたほうが無難でしょう。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;アクセス&lt;/span&gt;&lt;br /&gt;ブラウザで http://your-host:port/ を開きます。&lt;br /&gt;Ajaxなどが使われているので、無効にしている人は、ブラウザのセキュリティ設定を下げる必要があります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;管理画面&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;「Hudsonの管理」→「システムの管理」から各種設定を変更できます。&lt;br /&gt;あとでビルドを壊した個人に通知するため、「セキュリティを有効化」にチェックをつけて、サインアップ/ログインを有効にましょう。&lt;br /&gt;「E-mail 通知」で「SMTPサーバ」を設定しておかないと、レポートを送信できません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;プロジェクト&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;「新規ジョブの作成」から新しいプロジェクトを作成できます。&lt;br /&gt;&lt;br /&gt;Hudsonではプロジェクト単位でビルドの成否をチェックします。&lt;br /&gt;ビルドの成否は「最後に実行したコマンドの返り値が0なら成功、そうでなければ失敗」という風に判定されます。&lt;br /&gt;成否をチェックしたいもの一つにつきプロジェクトを一つつくる必要があります。&lt;br /&gt;ちなみに、プロジェクトはできるだけ細かく分割するほうが良いそうです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;デバッグビルドとリリースビルド&lt;/span&gt;&lt;br /&gt;ビルドごとにプロジェクトをつくるのは面倒です。&lt;br /&gt;こういうときは「マルチ構成プロジェクトのビルド」を使用しましょう。&lt;br /&gt;&lt;br /&gt;マルチ構成プロジェクトでは、「設定」に「構成マトリックス」という項目が増えています。&lt;br /&gt;ここの構成軸の「名前」と同じ環境変数に、「値」の設定値を順に設定して、ビルドを実行します。&lt;br /&gt;名前: BuildType&lt;br /&gt;値: Debug, Release&lt;br /&gt;という風に設定すると、同じ処理を%ByuldType%の値だけ変えて実行できます。&lt;br /&gt;&lt;br /&gt;三軸、四軸の設定もできます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;他のプロジェクトを続けて実行&lt;/span&gt;&lt;br /&gt;プロジェクトごとの「設定」から「他のプロジェクトのビルド」を指定できます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SCMからどこにチェックアウトしよう？&lt;/span&gt;&lt;br /&gt;プロジェクトごとにチェックアウトするので、そのプロジェクトに必要な部分だけチェックアウトするようにするか、「設定」の「ローカルモジュールディレクトリ」で無理やり位置を変えるかすると良いと思います。&lt;br /&gt;&lt;br /&gt;ちなみに、マルチ構成プロジェクトでは、一つのビルドごとに一つチェックアウトします。&lt;br /&gt;BuildTypeにDebugとReleaseを指定していたら、その両方のワークディレクトリにチェックアウトされます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;コマンドラインからビルドする&lt;/span&gt;&lt;br /&gt;コマンドライン用のインターフェイスが用意されてないとビルドできません。&lt;br /&gt;&lt;br /&gt;VisualStudioならdevenvをコマンドラインから叩けます。&lt;br /&gt;MSDNオンラインにコマンド一覧が載っています。&lt;br /&gt;/build /rebuild /runexit を使えば何とかなると思います。&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;ターゲットに実行ファイルを送る&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;多分、ドキュメントにコピーするコマンドが載ってると思うので、それでコピーします。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;結果を通知したい&lt;/span&gt;&lt;br /&gt;プロジェクトごとの「設定」の「ビルド後の処理」から「E-mail通知」にチェックをつけてください。&lt;br /&gt;「宛先」に指定されている人と、ビルドを壊した個人にメールを送ることができます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ビルドを壊した個人はどうやって特定するの？&lt;/span&gt;&lt;br /&gt;そのビルドに関連するSCMの更新に関わった人が、ビルドを壊した容疑者になります。&lt;br /&gt;SCMでのユーザ名とHudsonでのユーザ名を合わせておかないといけません。&lt;br /&gt;&lt;br /&gt;他のプロジェクトを続けて実行した場合、次のプロジェクトには、前のプロジェクトでの容疑者は引き継がれません。&lt;br /&gt;マルチ構成プロジェクトでは、全部の回で同じユーザが容疑者になります。&lt;br /&gt;&lt;br /&gt;個人ごとのメールアドレスは「人々」から辿って設定できます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SCMにコミットしたら自動でビルドする&lt;/span&gt;&lt;br /&gt;お使いのSCMのドキュメントを読んで、コミット後の処理を行う方法を調べましょう。&lt;br /&gt;&lt;br /&gt;Subversionではpost-commitに wget -O /dev/null -q http://your-host:port/job/JOB-NAME/build?delay=Nsec と書きます。&lt;br /&gt;NsecのNの部分は数値に置き換えてください。&lt;br /&gt;ビルドの実行はN秒だけ待ってから行われます。&lt;br /&gt;これは、何回かに分けてコミットしたとき、まとめて一回のビルドにするためのオプションです。&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;プラグイン&lt;/span&gt;&lt;br /&gt;色々あるみたいですが、英語を読むのが面倒なので、あまり試していません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;その他&lt;/span&gt;&lt;br /&gt;CppUnit-xでのテスト結果をJUnitのXML形式にしたりするプラグインがあると便利なのかなぁとか思っています。&lt;br /&gt;（CppUnitのXMLレポートをJUnit形式にするプラグインはあるみたいです。）&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-4005887725669176363?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/4005887725669176363/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/10/hudsonci.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4005887725669176363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4005887725669176363'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/10/hudsonci.html' title='HudsonによるCIのメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-6338267358253626566</id><published>2009-10-03T08:45:00.011+09:00</published><updated>2010-03-30T00:10:35.259+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ユニットテスト'/><category scheme='http://www.blogger.com/atom/ns#' term='メモ'/><title type='text'>ユニットテストのメモ</title><content type='html'>今年の頭くらいから、ユニットテストとかCIとかをやりましょうよと言っていて、ようやく最近、導入するチャンスがあったので、職場でやってみています。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;最初に考えたこと&lt;/span&gt;&lt;br /&gt;リリースにテストが含まれないようにすべきです。使われていないコードは最適化で消えてくれるとしても、CppUnitやCppUnit-xはLGPLなので、配布するバイナリにはリンクしないようにします。&lt;br /&gt;あと、テストの追加と実行を容易にしないと、きっとみんなテストしてくれません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ユニットテストフレームワーク&lt;/span&gt;&lt;br /&gt;CppUnitとCppUnit-xという選択肢があります。&lt;br /&gt;あまり厳密には比較していませんが、内作のゲームフレームワークの都合上、CppUnit-xを使わせていただいています。VCでもgccでも簡単にビルドできるし、C++の機能の一部を制限できるのが魅力だと思います。&lt;br /&gt;テスト結果の出力方法を変えるために custdio.h に手を入れたのと、テストに stdint.h 相当の型を使うために多少の修正を加える必要はありました。&lt;br /&gt;static link libraryにしてリンクしています。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;テストの実行方法&lt;/span&gt;&lt;br /&gt;テストを手軽に行うため、実行したらすぐに結果が得られるのが良いと思います。そのため、テスト時は、main()からすぐにTestRunnerを呼びます（そのあとは即終了していますが、デバッグメニューに行ってもいいかもしれませんね）。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;それぞれのテスト&lt;/span&gt;&lt;br /&gt;別のプログラマの書いたテストの影響を受けるとうざいので、テストランナーはそれぞれ書いたものを実行するようにしています。単純ですが、SCMに登録しないプライベートなファイルで各自ラベルを書き換えるようにして切り替えています。&lt;br /&gt;ビルドPCでテストを行う際は、すべてのテストを実施します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;テストケース置き場&lt;/span&gt;&lt;br /&gt;基本的にすべての機能にテストを書くことを前提にしていますので、ソースツリーと同じ構成でテストケース置き場をつくっています。&lt;br /&gt;　：&lt;br /&gt;├src&lt;br /&gt;│├Foo&lt;br /&gt;│├└Bar.cpp/.h&lt;br /&gt;│Hoge&lt;br /&gt;├testcase&lt;br /&gt;│├Foo&lt;br /&gt;│├└Bar_Test.cpp/.h&lt;br /&gt;│Hoge&lt;br /&gt;　：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;テストファースト&lt;/span&gt;&lt;br /&gt;ここまでは特に問題なくできていたのですが、テストファーストはちょっと厳しい印象です。&lt;br /&gt;ターゲットによってはビルドに時間がかかるので、いちいち失敗させるのが手間です。コンパイルは修正範囲が狭ければ問題ありませんが、リンクも重かったりしてイライラします（インクリメンタルリンクは有効にしているのですが……）。&lt;br /&gt;「失敗させながら」のところだけ省略して、テストケースは先に書くようにするのもありかと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;どこまでテストを書くか&lt;/span&gt;&lt;br /&gt;まだ手探りです。「可能な限り書く」というルールにしています。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;その他&lt;/span&gt;&lt;br /&gt;今はテストもIDEから実行していますが、裏でコマンドラインからビルドして実行するなり、邪魔されないようにした方がいいのかもしれません。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;参考情報&lt;/span&gt;&lt;br /&gt;CEDEC2009の&lt;a href="http://cedec.cesa.or.jp/2009/contents/prg/pg_1007.html"&gt;『バグを限りなくゼロにする方法』&lt;/a&gt;がゲーム業界に特化した内容もあって参考になります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-6338267358253626566?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/6338267358253626566/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/10/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6338267358253626566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6338267358253626566'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/10/blog-post.html' title='ユニットテストのメモ'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3531686615243363482</id><published>2009-09-26T16:52:00.002+09:00</published><updated>2009-09-26T17:56:37.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>刺激を受けてきました</title><content type='html'>昨日、&lt;a href="http://tgs.cesa.or.jp/index.html"&gt;東京ゲームショウ2009&lt;/a&gt;と&lt;a href="http://expo.nikkeibp.co.jp/tgs/2009/business/sown.html"&gt;SENSE OF WANDER NIGHT2009&lt;/a&gt;に行ってきました。&lt;br /&gt;&lt;br /&gt;毎年、業務としてショーに行くべき理由とは何だろうかと考えています。私自身はゲームが好きなので、ショーに行くこと自体は楽しうございます。年に一度のお祭りに参加できてご満悦です。しかし、これを業務として行う理由は何なのでしょうか。話題作は大体記事になりますし、プレイアブル出展されているものは、大抵、しばらく待てば発売されてしまいます。チケットをとり交通費を出して就業時間に行かせる、そんな許可を出している人は、何を期待して、許可を出しているのでしょうか。&lt;br /&gt;&lt;br /&gt;聞いてみたら、一番は「刺激を受けてがんばってもらうため」と言われました。いい話だなー。&lt;br /&gt;&lt;br /&gt;刺激を受けたという意味では、ちょっと変わったアイディアのゲームが好きな私には、&lt;a href="http://expo.nikkeibp.co.jp/tgs/2009/business/sown.html"&gt;SOWN&lt;/a&gt;が大変面白うございました。後日、会場の様子を動画で配信するとのことなので、それでプレゼンテーションの内容も確認できると思います。&lt;br /&gt;&lt;br /&gt;会社で知り合いと、「毎日１アイディア」みたいなことをやっていて、その中で、ちょっと面白いアイディアがあったりもするのですが、大抵、実際にはつくられません。今回&lt;a href="http://expo.nikkeibp.co.jp/tgs/2009/business/sown.html"&gt;SOWN&lt;/a&gt;で面白いと感じたのは、どれも実際に動いていたからだと思います。&lt;a href="http://cedec.cesa.or.jp/2009/contents/prg/pg_1104.html"&gt;CEDEC2009の『ゲェムのカタチ』のセッション&lt;/a&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/2837470629762242097-3531686615243363482?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3531686615243363482/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post_26.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3531686615243363482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3531686615243363482'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post_26.html' title='刺激を受けてきました'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-7620219393431790403</id><published>2009-09-23T21:25:00.003+09:00</published><updated>2009-09-26T18:07:03.656+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>蔵書管理</title><content type='html'>メディアマーカーで&lt;a href="http://mediamarker.net/u/petitbanca/"&gt;手持ちの本を管理&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/2837470629762242097-7620219393431790403?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/7620219393431790403/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post_23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7620219393431790403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7620219393431790403'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post_23.html' title='蔵書管理'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-5536197275548849267</id><published>2009-09-21T11:40:00.002+09:00</published><updated>2009-09-21T11:42:10.080+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Visitor</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクトに変更を加えることなくオペレーションを追加する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;所持品の種類ごとに異なる価格、重量を計算する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Visitor&lt;br /&gt;class IVisitor {&lt;br /&gt;public:&lt;br /&gt;    virtual void VisitItem(Item *) = 0;&lt;br /&gt;    virtual void VisitEquip(Equip *) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteVisitor&lt;br /&gt;/*&lt;br /&gt;   所持品の重量を求める&lt;br /&gt;*/&lt;br /&gt;class TotalWeight : public IVisitor {&lt;br /&gt;public:&lt;br /&gt;    virtual void VisitItem(Item *pItem)&lt;br /&gt;    {&lt;br /&gt;        const int weight = pItem-&gt;GetWeight();&lt;br /&gt;        const int num = pItem-&gt;GetNum();&lt;br /&gt;        m_weight += (weight * num);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void VisitEquip(Equip *pEquip)&lt;br /&gt;    {&lt;br /&gt;        m_weight += pEquip-&gt;GetWeight();&lt;br /&gt;        const Array&amp;lt;Item*&amp;gt; aItem = pEquip-&gt;GetItems();&lt;br /&gt;        foreach (Item *pItem, aItem) { // aItemの全要素を辿る&lt;br /&gt;            m_weight += pItem-&gt;GetWeight();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void GetWeight() const&lt;br /&gt;    {&lt;br /&gt;        return m_weight;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    int m_weight;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    所持品の価格を求める&lt;br /&gt;*/&lt;br /&gt;class TotalPrice : public IVisitor {&lt;br /&gt;public:&lt;br /&gt;    virtual void VisitItem(Item *pItem)&lt;br /&gt;    {&lt;br /&gt;        const int price = pItem-&gt;GetPrice();&lt;br /&gt;        const int num = pItem-&gt;GetNum();&lt;br /&gt;        m_price += (price * num);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void VisitEquip(Equip *pEquip)&lt;br /&gt;    {&lt;br /&gt;        m_price += pEquip-&gt;GetPrice();&lt;br /&gt;        const Array&amp;lt;Item*&amp;gt; aItem = pEquip-&gt;GetItems();&lt;br /&gt;        foreach (Item *pItem, aItem) { // aItemの全要素を辿る&lt;br /&gt;            if (pItem-&gt;GetID() == SPECIAL_ITEM) {&lt;br /&gt;                // 特殊なアイテムと組み合わせると割り増しになる.&lt;br /&gt;                m_price += VALUE_ADDED;&lt;br /&gt;            }&lt;br /&gt;            m_price += pItem-&gt;GetPrice();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void GetPrice() const&lt;br /&gt;    {&lt;br /&gt;        return m_price;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    int m_price;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Element&lt;br /&gt;class IElement {&lt;br /&gt;public:&lt;br /&gt;    virtual void Visit(IVisitor *) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteElement&lt;br /&gt;/*&lt;br /&gt;    消費アイテム, 同じアイテムを複数個所持できる.&lt;br /&gt;*/&lt;br /&gt;class Item : public IElement {&lt;br /&gt;public:&lt;br /&gt;    ItemID GetID() const;  // アイテムのID&lt;br /&gt;    int GetNum() const;    // 所持数&lt;br /&gt;    int GetWeight() const; // 単体の重量&lt;br /&gt;    int GetPrice() const;  // 単価&lt;br /&gt;&lt;br /&gt;    virtual void Visit(IVisit *pVisit)&lt;br /&gt;    {&lt;br /&gt;        pVisit-&gt;VisitItem(this);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    装備アイテム, 同じ装備でも別々に一個ずつ所持する.&lt;br /&gt;    更に装備にはアイテムを付加して特殊効果を付与でき, それによって重量や価格も変わる.&lt;br /&gt;*/&lt;br /&gt;clas Equip : public IElement {&lt;br /&gt;public:&lt;br /&gt;    int GetWeight() const; // 単体の重量&lt;br /&gt;    int GetPrice() const;  // 単価&lt;br /&gt;&lt;br /&gt;    const Array&amp;lt;Item*&amp;gt; GetItems() const;&lt;br /&gt;&lt;br /&gt;    virtual void Visit(IVisit *pVisit)&lt;br /&gt;    {&lt;br /&gt;        pVisit-&gt;VisitEquip(this);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ObjectStructure&lt;br /&gt;class ElementContainer {&lt;br /&gt;public:&lt;br /&gt;    void Visit(IVisitor *pVisit)&lt;br /&gt;    {&lt;br /&gt;        foreach (IElement *pElement, m_aElement) { // m_aElementの全要素を辿る&lt;br /&gt;            pElement-&gt;Visit(pVisit);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    Array&amp;lt;IElement*&amp;gt; m_aElement;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// 使用例&lt;br /&gt;void GetTotalPrice()&lt;br /&gt;{&lt;br /&gt;    ElementContainer &amp;elements = GetElementContainer();&lt;br /&gt;    TotalPrice visitor;&lt;br /&gt;    elements.Visit(&amp;visitor);&lt;br /&gt;    const int price = visitor.GetPrice();&lt;br /&gt;}&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/2837470629762242097-5536197275548849267?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/5536197275548849267/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/visitor.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5536197275548849267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5536197275548849267'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/visitor.html' title='Visitor'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-2139694563086439519</id><published>2009-09-20T22:52:00.001+09:00</published><updated>2009-09-20T22:52:41.220+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Template Method</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;基本となる処理を実装しておき、異なる部分だけサブクラスで実装する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;各画面の、遷移など共通部分は基底クラスで実装しておき、画面ごとの処理はサブクラスで実装する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// AbstructClass&lt;br /&gt;class ModeBase {&lt;br /&gt;public:&lt;br /&gt;    virtual void Update();     // 画面遷移中のフェードや状態管理などを行う&lt;br /&gt;    virtual void Draw();       // 上記に伴った描画処理を行う&lt;br /&gt;    virtual void AddUpdater(); // 独自の更新関数を追加する&lt;br /&gt;    virtual void AddDrawer();  // 独自の描画関数を追加する&lt;br /&gt;&lt;br /&gt;    // template methods&lt;br /&gt;    virtual void OnInitialized() {} // 初期化直後&lt;br /&gt;    virtual void OnOpening() {}     // 遷移が終わってこのモードが始まる際の&lt;br /&gt;    virtual void OnEnding() {}      // このモードが終わって次の画面に移る際の処理&lt;br /&gt;    virtual void OnTerminated() {}  // 終了処理の直後&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteClass&lt;br /&gt;class ModeTitle {&lt;br /&gt;public:&lt;br /&gt;    virual void OnOpening()&lt;br /&gt;    {&lt;br /&gt;        // タイトル画面で何十秒か放置すると,&lt;br /&gt;        // 自動でデモ画面に行くようにしたいので,&lt;br /&gt;        // 画面の開始時にタイマをリセットしておく.&lt;br /&gt;        m_timer.Reset();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    Timer m_timer;&lt;br /&gt;}&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/2837470629762242097-2139694563086439519?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/2139694563086439519/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/template-method.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2139694563086439519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2139694563086439519'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/template-method.html' title='Template Method'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-1161644169663683780</id><published>2009-09-20T22:50:00.003+09:00</published><updated>2009-09-20T22:52:16.064+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Strategy</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;アルゴリズムをカプセル化し、目的に応じて選択できるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;難易度ごとに異なるアルゴリズムで実装されたA.I.を切り替えられるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Strategy&lt;br /&gt;class IAiStrategy {&lt;br /&gt;public:&lt;br /&gt;    virtual int Think() = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteStrategy&lt;br /&gt;/*&lt;br /&gt;    常にランダムな手を返す&lt;br /&gt;*/&lt;br /&gt;class Ai_Monkey {&lt;br /&gt;public:&lt;br /&gt;    virtual int Think()&lt;br /&gt;    {&lt;br /&gt;        return RANDOM();&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    過去の手を考慮して返す&lt;br /&gt;*/&lt;br /&gt;class Ai_EvalPastMove {&lt;br /&gt;public:&lt;br /&gt;    virtual int Think()&lt;br /&gt;    {&lt;br /&gt;        return EvalPastMove();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    int EvalPastMove(); // 過去の手を考慮して次の手を導く&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Context&lt;br /&gt;class IPlayer;&lt;br /&gt;class ComPlayer : IPlayer {&lt;br /&gt;public:&lt;br /&gt;    ComPlayer(IAiStrategy *pAi)&lt;br /&gt;        : m_pAi(pAi)&lt;br /&gt;    {&lt;br /&gt;        ASSERT(pAi);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual int GetNextMove()&lt;br /&gt;    {&lt;br /&gt;        const int result = m_pAi-&gt;Think();&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    IAiStrategy *m_pAi;&lt;br /&gt;};&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/2837470629762242097-1161644169663683780?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/1161644169663683780/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/strategy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1161644169663683780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1161644169663683780'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/strategy.html' title='Strategy'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-1100056026587476922</id><published>2009-09-20T22:34:00.001+09:00</published><updated>2009-09-20T22:42:26.118+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>State</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;内部状態に合わせて異なる振る舞いのオブジェクトを適用する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;各モードの画面遷移を実装する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// State&lt;br /&gt;class ISequence {&lt;br /&gt;public:&lt;br /&gt;    virtual void Update() = 0;&lt;br /&gt;    virtual void Draw() = 0;&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    SequenceControler * getCtrl();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteState&lt;br /&gt;/*&lt;br /&gt;    タイトル画面.&lt;br /&gt;    何らかのキーを押すと次の画面に進む.&lt;br /&gt;*/&lt;br /&gt;class TitleSequence : public ISequence {&lt;br /&gt;public:&lt;br /&gt;    virtual void Update()&lt;br /&gt;    {&lt;br /&gt;        if (IsPushAnyKey()) {&lt;br /&gt;           getCtrl()-&gt;ChangeSequence(new MenuSequence);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    virtual void Draw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    トップメニュー画面&lt;br /&gt;*/&lt;br /&gt;class MenuSequence : public ISequence;&lt;br /&gt;&lt;br /&gt;// Context&lt;br /&gt;class SequenceControler {&lt;br /&gt;public:&lt;br /&gt;    void MainLoop()&lt;br /&gt;    {&lt;br /&gt;        m_pSequence-&gt;Update();&lt;br /&gt;        m_pSequence-&gt;Draw();&lt;br /&gt;&lt;br /&gt;        if (m_pNextSequence != NULL) {&lt;br /&gt;            SAFE_DELETE(m_pSequence);&lt;br /&gt;            m_pSequence = m_pNextSequence;&lt;br /&gt;            m_pNextSequence = NULL;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    void ChangeSequence(ISequence *pNext)&lt;br /&gt;    {&lt;br /&gt;        ASSERT(m_pNextSequence);&lt;br /&gt;        m_pNextSequence = pNext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    ISequence *m_pSequence;&lt;br /&gt;    ISequence *m_pNextSequence;&lt;br /&gt;};&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/2837470629762242097-1100056026587476922?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/1100056026587476922/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/state.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1100056026587476922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1100056026587476922'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/state.html' title='State'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-4904643589577586609</id><published>2009-09-19T23:05:00.001+09:00</published><updated>2009-09-19T23:05:29.678+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Singleton</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;インスタンスが常に一つである事を保障する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;同じ資源を多重に読み込まないようにするリソースマネージャなど、一つしか存在してはならないことを表現する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// singleton&lt;br /&gt;template&amp;lt;class T&amp;gt;&lt;br /&gt;class singleton {&lt;br /&gt;public:&lt;br /&gt;    T * GetInstance()&lt;br /&gt;    {&lt;br /&gt;        if (m_pInstance == NULL) {&lt;br /&gt;            HANDLE h = BeginCriticalSection();&lt;br /&gt;            if (m_pInstance == NULL) {&lt;br /&gt;                m_pInstance = new T;&lt;br /&gt;            }&lt;br /&gt;            EndCriticalSection(h);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return m_pInstance;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    T * operator -&amp;gt;()&lt;br /&gt;    {&lt;br /&gt;        return GetInstance();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    static T * m_pInstance;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// 使用例&lt;br /&gt;class Sample {&lt;br /&gt;public:&lt;br /&gt;    void DoSomething();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    friend singleton&amp;lt;Foo&amp;gt;;&lt;br /&gt;    Sample();&lt;br /&gt;    ~Sample();&lt;br /&gt;    Sample(const Sample &amp;);&lt;br /&gt;    Sample &amp; operator =(const Sample &amp;);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void Exsample()&lt;br /&gt;{&lt;br /&gt;    singleton&amp;lt;Sample&amp;gt; foo;&lt;br /&gt;    foo-&amp;gt;DoSomething();&lt;br /&gt;}&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/2837470629762242097-4904643589577586609?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/4904643589577586609/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/singleton.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4904643589577586609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/4904643589577586609'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/singleton.html' title='Singleton'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-6259243507006214742</id><published>2009-09-19T10:10:00.000+09:00</published><updated>2009-09-19T10:11:10.983+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Proxy</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクトの間を仲介し、処理を隠蔽したり制限したりする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;remote proxy&lt;br /&gt;DBサーバ上に保存されているデータを、ローカルデータと同じように扱えるようにする。&lt;br /&gt;&lt;br /&gt;virtual proxy&lt;br /&gt;ディスクからのロード中は仮のモデルやテクスチャを出し、ロードが完了し次第リソースを使用する。&lt;br /&gt;&lt;br /&gt;protection proxy&lt;br /&gt;ディスク上のデータと書き換え可能な外部メモリ上のデータを同じインターフェイスで扱い、ディスク上のデータについてはREAD ONLYにし、外部メモリ上のデータは権限情報に基づいて扱いを変える。&lt;br /&gt;&lt;br /&gt;smart reference&lt;br /&gt;スマートポインタを実現する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// &lt;br /&gt;// virtual proxy&lt;br /&gt;// &lt;br /&gt;&lt;br /&gt;// Subject&lt;br /&gt;class IImage {&lt;br /&gt;public:&lt;br /&gt;    virtual void Load(FILENAME) = 0;&lt;br /&gt;    virtual void Update() = 0;&lt;br /&gt;    virtual void Draw() = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// RealSubject&lt;br /&gt;class Image : public IImage {&lt;br /&gt;    virtual void Load(FILENAME);&lt;br /&gt;    virtual void Update();&lt;br /&gt;    virtual void Draw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Proxy&lt;br /&gt;class ImageDelayLoad : public IImage {&lt;br /&gt;public:&lt;br /&gt;    virtual void Load(FILENAME)&lt;br /&gt;    {&lt;br /&gt;        m_image.Load(FILENAME); // m_imageのロードを発行する&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Update()&lt;br /&gt;    {&lt;br /&gt;        // m_imageのロードも行う&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Draw()&lt;br /&gt;    {&lt;br /&gt;        if (m_image.IsLoaded()) {&lt;br /&gt;            m_image.Draw();&lt;br /&gt;&lt;br /&gt;        } else {&lt;br /&gt;            DrawDummy();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    Image m_image;&lt;br /&gt;};&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/2837470629762242097-6259243507006214742?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/6259243507006214742/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/proxy.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6259243507006214742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6259243507006214742'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/proxy.html' title='Proxy'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-1550270142120202709</id><published>2009-09-18T14:20:00.003+09:00</published><updated>2009-09-18T19:01:07.458+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Prototype</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;プロトタイプとなるオブジェクトを生成しておき、そのコピーを元に新たなオブジェクトを作成する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;敵オブジェクトの生成には設定ファイルの解釈に大きなコストがかかるため、読み込み済みのオブジェクトを原型とし、他のオブジェクトは原型をコピーして生成する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Prototype&lt;br /&gt;class IObjectBase {&lt;br /&gt;public:&lt;br /&gt;    virtual void Initialize(int x, int y)&lt;br /&gt;    {&lt;br /&gt;        m_x = x, m_y = y;&lt;br /&gt;    }&lt;br /&gt;    virtual void Update() = 0;&lt;br /&gt;    virtual void Draw() = 0;&lt;br /&gt;&lt;br /&gt;    virtual IObjectBase * Copy() const = 0;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    int m_x, m_y;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcretePrototype&lt;br /&gt;class EnemyObject : public IObjectBase {&lt;br /&gt;public:&lt;br /&gt;    EnemyObject();&lt;br /&gt;    virtual IObjectBase * Copy() const&lt;br /&gt;    {&lt;br /&gt;        return new EnemyObject(*this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void LoadFile(FILENAME);&lt;br /&gt;    virtual void Update();&lt;br /&gt;    virtual void Draw();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    explicit EnemyObject(const EnemyObject &amp;); // copy constructor&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    COMPLEX_PARAM m_param; // 設定ファイルなどを処理して決定される, 複雑な設定値&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;class ObjectFactory {&lt;br /&gt;public:&lt;br /&gt;    explicit ObjectFactory(const IObjectBase &amp;prototype)&lt;br /&gt;        : IObjectBase(prototype)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    IObjectBase * Create(int x, int y) const&lt;br /&gt;    {&lt;br /&gt;        IObjectBase * pClone = m_prototype.Copy();&lt;br /&gt;        pClone-&gt;Initialize(x, y);&lt;br /&gt;        return pClone;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    const IObjectBase &amp; m_prototype;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;void SetEnemyPrototype()&lt;br /&gt;{&lt;br /&gt;    Enemy * const pEnemy = new Enemy;&lt;br /&gt;    pEnemy-&gt;LoadFile(FILENAME); // 設定ファイルを読み込み、複雑な処理の後、パラメータが決定される&lt;br /&gt;&lt;br /&gt;    ObjectFactory &amp;objFactory = CreateObjectFactory(pEnemy);&lt;br /&gt;    RegistorEnemyFactory(objFactory);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void CreateNewEnemy()&lt;br /&gt;{&lt;br /&gt;    const ObjectFactory &amp;objFactory = GetEnemyFactory();&lt;br /&gt;    IObjectBase * pNewObject = objFactory.Create(X, Y);&lt;br /&gt;}&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/2837470629762242097-1550270142120202709?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/1550270142120202709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/prototype.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1550270142120202709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1550270142120202709'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/prototype.html' title='Prototype'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-100727822207435658</id><published>2009-09-18T14:17:00.001+09:00</published><updated>2009-09-18T14:18:43.832+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Observer</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;あるオブジェクトが更新されたとき、依存するオブジェクトに通知し、矛盾状態にならないようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;ゲーム中自立して動くオブジェクトを、ポーズしたときには止めるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Subject&lt;br /&gt;class ISubjectBase {&lt;br /&gt;public:&lt;br /&gt;    virtual void Attach(IObserver &amp;); // m_aObserverに追加する&lt;br /&gt;    virtual void Detach(IObserver &amp;); // m_aObserverから取り除く&lt;br /&gt;    virtual void Notify();            // m_aObserverに通知する&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    Array&amp;ltIObserver &amp;;&amp;gt; m_aObserver;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class GameController : public ISubjectBase {&lt;br /&gt;public:&lt;br /&gt;    virtual void SetPause(bool pause)&lt;br /&gt;    {&lt;br /&gt;        m_isPaused = pause;&lt;br /&gt;        Notify();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual bool IsPaused() const { return m_isPaused; }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    bool m_isPaused;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Observer&lt;br /&gt;class IObserver {&lt;br /&gt;public:&lt;br /&gt;    virtual void Update() = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class ObjectBase : public IObserver {&lt;br /&gt;public:&lt;br /&gt;    Object(const GameController &amp;gameCtrl)&lt;br /&gt;        : m_GameController(gameCtrl)&lt;br /&gt;    {&lt;br /&gt;        m_GameController.Attach(this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Update()&lt;br /&gt;    {&lt;br /&gt;        if (m_GameController.IsPaused()) {&lt;br /&gt;            Pause();&lt;br /&gt;&lt;br /&gt;        } else {&lt;br /&gt;            Restart();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Pause();&lt;br /&gt;    virtual void Restart();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    const GameController &amp;m_GameController;&lt;br /&gt;};&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/2837470629762242097-100727822207435658?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/100727822207435658/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/observer.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/100727822207435658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/100727822207435658'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/observer.html' title='Observer'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-7148271365310577875</id><published>2009-09-17T13:09:00.003+09:00</published><updated>2009-09-17T13:17:02.013+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Memento</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;カプセル化破壊せずに、内部情報を外部に保存する。&lt;br /&gt;保存しておいた情報から以前の状態を復元できる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;ターン性ストラテジで、ユニットを動かした後、ターン終了前であれば移動をキャンセルできるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Originator&lt;br /&gt;class Unit {&lt;br /&gt;public:&lt;br /&gt;    const UnitMement * CreateMemento() const&lt;br /&gt;    void SetMement(const UnitMement *);&lt;br /&gt;&lt;br /&gt;    // ユニットを移動する&lt;br /&gt;    void Move(const POSITION &amp;next);&lt;br /&gt;private:&lt;br /&gt;    POSITION m_pos;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Memento&lt;br /&gt;class UnitMemento {&lt;br /&gt;public:&lt;br /&gt;    ~UnitMemento();&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    friend Unit;&lt;br /&gt;    UnitMement();&lt;br /&gt;&lt;br /&gt;    void setPos(const POSITION &amp;pos);&lt;br /&gt;    const POSITION &amp; getPos() const;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    POSITION m_pos;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Caretaker&lt;br /&gt;void Move()&lt;br /&gt;{&lt;br /&gt;    Unit &amp;unit = GetUnit();&lt;br /&gt;    UnitMement * const pMement = unit.CreateMement();&lt;br /&gt;    RegistorMement(pMement);&lt;br /&gt;&lt;br /&gt;    const POSITION &amp; next = GetNextPos();&lt;br /&gt;    unit.Move(next);&lt;br /&gt;}&lt;br /&gt;void Cancel()&lt;br /&gt;{&lt;br /&gt;    Unit &amp;unit = GetUnit();&lt;br /&gt;    UnitMement * const pMement = GetRegistoredMement();&lt;br /&gt;    unit.SetMement(pMement);&lt;br /&gt;}&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/2837470629762242097-7148271365310577875?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/7148271365310577875/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/memento.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7148271365310577875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7148271365310577875'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/memento.html' title='Memento'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3230342620366867014</id><published>2009-09-17T12:32:00.003+09:00</published><updated>2009-09-17T17:43:38.378+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Mediator</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクト間の複雑な依存関係を一箇所に集中させる。&lt;br /&gt;それにより個々のオブジェクトの再利用性を高める。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;装備画面で、キャラクターを選択すると装備できるアイテムのみがハイライトされる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Mediator&lt;br /&gt;/*&lt;br /&gt;    アイテムの選択に関する振る舞いを取りまとめる.&lt;br /&gt;    装備の選択, 消費アイテムの選択など, 必要に応じて具象クラスを作成する.&lt;br /&gt;*/&lt;br /&gt;class IItemDirector {&lt;br /&gt;public:&lt;br /&gt;    virtual void OnSelect(Chara *) = 0;&lt;br /&gt;    virtual void OnSelect(IItem *) = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteMediator&lt;br /&gt;class EquipDirector : public IItemDirector {&lt;br /&gt;public:&lt;br /&gt;    /*&lt;br /&gt;        キャラクターを選んだので、装備可能なアイテムをハイライトする。&lt;br /&gt;    */&lt;br /&gt;    virtual void OnSelect(Chara *pChara)&lt;br /&gt;    {&lt;br /&gt;        foreach (Equip *pEquip, m_aEquip) {       // 各要素をpEquipに入れつつm_aEquipの全要素を辿る&lt;br /&gt;            const ItemID id = pEquip-&gt;GetID();&lt;br /&gt;            const bool canEquip = pChara-&gt;canEquip(id);&lt;br /&gt;            pEquip-&gt;SetHilight(canEquip);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void OnSelect(IItem *pItem);  // 逆に装備を先に選ぶと、装備可能なキャラクターがハイライトされる。&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    Array&amp;lt;Chara*&amp;gt; m_aChara; // パーティにいるキャラ&lt;br /&gt;    Array&amp;lt;Equip*&amp;gt; m_aEquip; // 所持している装備&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Colleague&lt;br /&gt;class Chara {&lt;br /&gt;public:&lt;br /&gt;    explicit Chara(IItemDirector &amp;mediator)&lt;br /&gt;        : m_meiator(mediator)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    bool canEquip(ItemID) const;&lt;br /&gt;&lt;br /&gt;    void OnSelect()&lt;br /&gt;    {&lt;br /&gt;        m_mediator-&gt;OnSelect(this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    IItemDirector &amp;m_mediator;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class IItem;&lt;br /&gt;class Equip : public IItem {&lt;br /&gt;public:&lt;br /&gt;    explicit Equip(IItemDirector &amp;mediator)&lt;br /&gt;        : m_meiator(mediator)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    virtual ItemID GetID() const;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    IItemDirector &amp;m_mediator;&lt;br /&gt;};&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/2837470629762242097-3230342620366867014?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3230342620366867014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/mediator.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3230342620366867014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3230342620366867014'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/mediator.html' title='Mediator'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-8668047796031329264</id><published>2009-09-16T14:47:00.002+09:00</published><updated>2009-09-16T14:51:19.483+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Iterator</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;コンテナクラスを順に処理するための共通のインターフェイスを提供する。&lt;br /&gt;STLの汎用コンテナクラスでも使われている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;順序なしリストとそのイテレータをつくる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Aggregate&lt;br /&gt;template &amp;lt;class T&amp;gt;&lt;br /&gt;class IContainer {&lt;br /&gt;public:&lt;br /&gt;    virtual IIterator&amp;lt;T&amp;gt; * Create() = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// ConcreteAggregate&lt;br /&gt;template &amp;lt;class T&amp;gt;&lt;br /&gt;class Crowd : public IContainer {&lt;br /&gt;public:&lt;br /&gt;    virtual IIterator&amp;lt;T&amp;gt; * Create()&lt;br /&gt;    {&lt;br /&gt;        return CrowdIterator&amp;lt;T&amp;gt;::Create(this);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    T * Get(unsigned int index) const;&lt;br /&gt;    unsigned int GetNum() const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Iterator&lt;br /&gt;template &amp;lt;class T&amp;gt;&lt;br /&gt;class IIterator {&lt;br /&gt;public:&lt;br /&gt;    virtual T * Get() const = 0;&lt;br /&gt;    virtual void Prev() = 0;&lt;br /&gt;    virtual void Next() = 0;&lt;br /&gt;    virtual bool IsEnd() const = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteIterator&lt;br /&gt;template &amp;lt;class T&amp;gt;&lt;br /&gt;class CrowdIterator : public IIterator&amp;lt;T&amp;gt; {&lt;br /&gt;public:&lt;br /&gt;    static IIterator * Create(const Crowd&amp;lt;T&amp;gt; &amp;);&lt;br /&gt;&lt;br /&gt;    virtual T * Get() const&lt;br /&gt;    {&lt;br /&gt;        return (IsEnd() ? NULL : m_container.Get(m_index));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Prev()&lt;br /&gt;    {&lt;br /&gt;        if (m_index &gt; 0) {&lt;br /&gt;            --m_index;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Next()&lt;br /&gt;    {&lt;br /&gt;        if (! IsEnd())&lt;br /&gt;            ++m_index;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual bool IsEnd() const&lt;br /&gt;    {&lt;br /&gt;        return (m_index &gt;= m_continer.GetNum());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    unsigned int m_index;&lt;br /&gt;    const Crowd&amp;lt;T&amp;gt; &amp;m_container;&lt;br /&gt;};&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/2837470629762242097-8668047796031329264?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/8668047796031329264/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/iterator.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/8668047796031329264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/8668047796031329264'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/iterator.html' title='Iterator'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-6044957461526711369</id><published>2009-09-16T14:44:00.002+09:00</published><updated>2009-09-16T14:44:51.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Interpreter</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;簡単な文法とそのインタプリタを定義する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;設定値を式で表現する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// AbstractExpression&lt;br /&gt;class IExpression {&lt;br /&gt;public:&lt;br /&gt;    virtual int Evaluate(const Context &amp;) const = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// TerminalExpression&lt;br /&gt;/*&lt;br /&gt;     定数&lt;br /&gt;*/&lt;br /&gt;class Constant : public IExpression {&lt;br /&gt;public:&lt;br /&gt;    Constant(int value)&lt;br /&gt;        : m_value(value)&lt;br /&gt;    {}&lt;br /&gt;    virtual int Evaluate(const Context &amp;) const&lt;br /&gt;    {&lt;br /&gt;        return m_value;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;     const int m_value;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;     変数&lt;br /&gt;*/&lt;br /&gt;class Variable : public IExpression {&lt;br /&gt;public:&lt;br /&gt;     Variable(LABEL label)&lt;br /&gt;     {}&lt;br /&gt;     virtual int Evaluate(const Context &amp; context) const&lt;br /&gt;     {&lt;br /&gt;          retrn context.GetValue(m_label);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;     const LABEL m_label;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// NonterminalExpression&lt;br /&gt;/*&lt;br /&gt;    加算&lt;br /&gt;*/&lt;br /&gt;class Plus : public IExpression {&lt;br /&gt;public:&lt;br /&gt;    Plus(const IExpression &amp;lh, const IExpression &amp;rh)&lt;br /&gt;        : m_lh(lh), m_rh(rh)&lt;br /&gt;    {}&lt;br /&gt;    virtual int Evaluate(const Context &amp;context)&lt;br /&gt;    {&lt;br /&gt;        return (m_lh.Evaluate(context) + m_rh.Evaluate(context));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    const IExpression &amp; m_lh, &amp;m_rh;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    減算、乗算、除算も、加算と同じように実装する。&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void Calc()&lt;br /&gt;{&lt;br /&gt;    // 3+X*Y&lt;br /&gt;    IExpression &amp;exp = Plus(Constant(3), Multi(Variable(X), Variable(Y)));&lt;br /&gt;&lt;br /&gt;    // 評価時のContextの内容に応じて算出される&lt;br /&gt;    const int value = exp.Evaluate(GetContext());&lt;br /&gt;}&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/2837470629762242097-6044957461526711369?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/6044957461526711369/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/interpreter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6044957461526711369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6044957461526711369'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/interpreter.html' title='Interpreter'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-6444722789680226598</id><published>2009-09-16T14:41:00.001+09:00</published><updated>2009-09-16T14:42:47.880+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Flyweight</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクトを使いまわしてメモリを節約する。&lt;br /&gt;内部状態を共有されても構わない内部に保持する情報(intrinsic)と、使用時毎に異なる外から与えられる情報(extrinsic)とにわけ、instrinsicだけ内部に持つようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;弾幕を描画する際に、同じ種類の弾の画像のインスタンスはひとつだけ作成し、使いまわすようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// FlyweightFactory&lt;br /&gt;class ImageLoader {&lt;br /&gt;public:&lt;br /&gt;    // 同じ画像は多重に読み込まないようにする&lt;br /&gt;    IImage * Load(FILENAME file)&lt;br /&gt;    {&lt;br /&gt;        if (m_aImage[file].exist) {&lt;br /&gt;            return m_aImage[file].get();&lt;br /&gt;&lt;br /&gt;        } else {&lt;br /&gt;            return LoadInner(file);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    IImage * LoadInner(FILENAME);          // FILENAMEの画像を読み込む&lt;br /&gt;    Hash&amp;lt;FILENME, IImage*&amp;gt; m_aImage; // ハッシュテーブル的な&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Flyweight&lt;br /&gt;class IImage {&lt;br /&gt;public:&lt;br /&gt;    void Draw(const BulletContext &amp;);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteFlyweight&lt;br /&gt;class SpriteAnime : public IImage;&lt;br /&gt;&lt;br /&gt;// extrinsic Context&lt;br /&gt;class BulletContext;  // 描画位置やアニメの状態などを持っている&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;/*&lt;br /&gt;    生成した弾幕の各弾の位置を計算し、BulletContextを作成し、弾を描画する&lt;br /&gt;*/&lt;br /&gt;class BulletManager {&lt;br /&gt;public:&lt;br /&gt;    unsigned int GetNum() const;&lt;br /&gt;&lt;br /&gt;    void Draw()&lt;br /&gt;    {&lt;br /&gt;     const unsigned int num = GetNum();&lt;br /&gt;     for (unsigned int i = 0; i &lt; num; ++i) {&lt;br /&gt;         const Image &amp; img = GetImage(i);&lt;br /&gt;         const ddddContext &amp; context = GetContext(i);&lt;br /&gt;&lt;br /&gt;         img.Draw(ddddContext);&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    const IImage &amp; GetImage(unsigned int index) const;&lt;br /&gt;    const BulletContext &amp; GetContext(unsigned int index) const;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;備考&lt;/span&gt;&lt;br /&gt;共有しない UnsharedConcreteFlyweight もあり得る。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-6444722789680226598?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/6444722789680226598/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/flyweight.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6444722789680226598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/6444722789680226598'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/flyweight.html' title='Flyweight'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3895890091736948960</id><published>2009-09-15T10:11:00.003+09:00</published><updated>2009-09-19T22:08:27.464+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Factory Method</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクトを作成するインターフェイスを用意し、実際に何を作るかはサブクラスに任せる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;マップ上にオブジェクトを設置でき、そのオブジェクトの種類を動的に切り替えられるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Creator&lt;br /&gt;class IObjectFactory {&lt;br /&gt;public:&lt;br /&gt;    void PutObject()&lt;br /&gt;    {&lt;br /&gt;        IObject * const pObject = createObject();&lt;br /&gt;&lt;br /&gt;        // Objectを管理しているクラスに任せる&lt;br /&gt;        GetObjectManager().add(pObject);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    // factory method&lt;br /&gt;    virtual IObject * createObject() = 0;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteCreator&lt;br /&gt;template&amp;lt;class T&amp;gt;   // IObjectの具象クラスを指定する&lt;br /&gt;class StandardObject : public IObjectFactory {&lt;br /&gt;protected:&lt;br /&gt;    virtual IObject * createObject()&lt;br /&gt;    {&lt;br /&gt;        return T::Create();&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Product&lt;br /&gt;class IObject;&lt;br /&gt;&lt;br /&gt;// ConcreteProduct&lt;br /&gt;class HouseObject : public IObject {&lt;br /&gt;public:&lt;br /&gt;    static IObject * Create();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class ParkObject : public IObject {&lt;br /&gt;public:&lt;br /&gt;    static IObject * Create();&lt;br /&gt;};&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/2837470629762242097-3895890091736948960?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3895890091736948960/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/factory-method.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3895890091736948960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3895890091736948960'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/factory-method.html' title='Factory Method'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-648082246463122916</id><published>2009-09-14T12:30:00.003+09:00</published><updated>2009-09-19T22:08:50.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Facade</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;複雑なサブシステムを簡易に使うための窓口を用意する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;ソケット通信、暗号化、独自パケットの作成をまとめて、簡単に通信処理を行えるようにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Subsystem classes&lt;br /&gt;/*&lt;br /&gt;    ソケット通信を行う&lt;br /&gt;*/&lt;br /&gt;class SocketWrapper {&lt;br /&gt;public:&lt;br /&gt;    void Send(const void *pBuffer, unsigned int size);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    暗号化を行う&lt;br /&gt;*/&lt;br /&gt;namespace Crypto {&lt;br /&gt;void Encrypto(void *pOut, unsigned int sizeOut, const void *pIn, unsigned int sizeIn);&lt;br /&gt;&lt;br /&gt;unsigned int GetEncryptedSize(unsigned int) const; // 暗号後のサイズを求める&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    パケットデータを作成する&lt;br /&gt;*/&lt;br /&gt;class PacketStream {&lt;br /&gt;public:&lt;br /&gt;    // パケットの種類&lt;br /&gt;    typedef enum {&lt;br /&gt;        PACKET_DATA,&lt;br /&gt;&lt;br /&gt;        PACKET_NUM,&lt;br /&gt;    } ePACKET_KIND;&lt;br /&gt;&lt;br /&gt;    PacketStream(ePACKET_KIND kind); // パケットを作成する&lt;br /&gt;    void AddData(Data data);         // データを追加する&lt;br /&gt;&lt;br /&gt;    unsigned int GetSize() const;    // パケットデータのサイズを得る&lt;br /&gt;    const void * GetBuffer() const;  // パケットデータを得る&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Facade&lt;br /&gt;/*&lt;br /&gt;    パケット化、暗号化、送信をまとめて簡単に扱えるようにする。&lt;br /&gt;*/&lt;br /&gt;class PacketSender {&lt;br /&gt;public:&lt;br /&gt;    void SendData(const Data *pData, unsigned int numData)&lt;br /&gt;    {&lt;br /&gt;        ASSERT(pData != NULL);&lt;br /&gt;&lt;br /&gt;        PacketStream packet(PacketStream::PACKET_DATA);&lt;br /&gt;        for (unsigned int i = 0; i &lt; numData; ++i) {&lt;br /&gt;            packet.AddData(pData[i]);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        const unsigned int sizePacket = packet.GetSize();&lt;br /&gt;        const void * const pPacketData = packet.GetBuffer();&lt;br /&gt;&lt;br /&gt;        const unsigned int sizeTemp = Crypto::GetEncryptedSize(sizePacket);&lt;br /&gt;        void * const pTemp = GetTempBuffer(sizeTemp); // これで一時バッファを作成できるとする&lt;br /&gt;&lt;br /&gt;        Crypto::Encrypto(pTemp, sizeTemp, pPacketData, sizePacket);&lt;br /&gt;&lt;br /&gt;        m_socket.Send(pTemp, sizeTemp);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    SocketWrapper m_socket;&lt;br /&gt;};&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/2837470629762242097-648082246463122916?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/648082246463122916/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/facade.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/648082246463122916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/648082246463122916'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/facade.html' title='Facade'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3193274314628698196</id><published>2009-09-14T11:01:00.003+09:00</published><updated>2009-09-14T11:15:55.373+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Decorator</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;同じインターフェイスのままオブジェクトに機能を追加する。&lt;br /&gt;クラスの全てに追加するわけでなく、オブジェクト単位で機能の追加を行える。&lt;br /&gt;インターフェイスが同じなので、使う側は違いを意識しなくて良い。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;動作ファイルを再生したりキーフレームアニメファイルを再生するだけのオブジェクトに、ゲーム内のデザインに合わせた枠を追加する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Component&lt;br /&gt;class IUiObject {&lt;br /&gt;public:&lt;br /&gt;    virtual void Update();&lt;br /&gt;    virtual void Draw();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteComponent&lt;br /&gt;class MovieObject;         // 動画ファイルを再生するだけ&lt;br /&gt;class KeyframeAnimeOBject; // キーフレームアニメファイルを再生するだけ&lt;br /&gt;&lt;br /&gt;// Decorator&lt;br /&gt;class IUiDecoratorBase : public IUiObject {&lt;br /&gt;public:&lt;br /&gt;    IUiDecoratorBase(IUiBase &amp;component)&lt;br /&gt;        : m_component(component)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    virtual void Update()&lt;br /&gt;    {&lt;br /&gt;        m_component.Update();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void Draw()&lt;br /&gt;    {&lt;br /&gt;        m_component.Draw();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    IUiObject &amp; m_component;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteDecorator&lt;br /&gt;class FrameDecorator : public IUiDecoratorBase {&lt;br /&gt;public:&lt;br /&gt;    FrameDecorator(IUiObject &amp; component)&lt;br /&gt;        : IUiDecoratorBase(component)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    virtual void Draw()&lt;br /&gt;    {&lt;br /&gt;        IUiDecoratorBase::Draw();&lt;br /&gt;        drawFrame();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    void drawFrame(); // 枠を描画する&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void CreateFramedObjects()&lt;br /&gt;{&lt;br /&gt;    AddObject(FrameDecorator(MovieObject()));&lt;br /&gt;    AddObject(FrameDecorator(KeyframeAnimeObject()));&lt;br /&gt;}&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/2837470629762242097-3193274314628698196?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3193274314628698196/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/decorator.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3193274314628698196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3193274314628698196'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/decorator.html' title='Decorator'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-2064189083201537653</id><published>2009-09-14T00:23:00.007+09:00</published><updated>2009-09-14T01:14:22.929+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Composit</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;入れ子状に連なる単体のオブジェクトと複数のオブジェクトとを、その違いを意識することなく扱える。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;単独で行動するキャラと、複数のキャラで行動する部隊とを同じように扱う。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Component&lt;br /&gt;class IChara {&lt;br /&gt;public:&lt;br /&gt;    virtual void DoSomething() = 0;&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    virtual void AddChild(IChara * pChild) {}&lt;br /&gt;    virtual void RemoveChild(IChara * pChild) {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Composit&lt;br /&gt;class IUnitBase: public IChara {&lt;br /&gt;public:&lt;br /&gt;    virtual void DoSomething()&lt;br /&gt;    {&lt;br /&gt;        // m_aChildのすべてのDoSomething()を呼ぶ.&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void AddChild(IChara * pChild)&lt;br /&gt;    {&lt;br /&gt;        m_aChild.add(pChild);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    virtual void RemoveChild(IChara * pChild)&lt;br /&gt;    {&lt;br /&gt;        m_aChild.remove(pChild);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;    Array&amp;lt;IChara&amp;gt; m_aChild; // 何らかのコンテナ的な &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class Unit : public IUnitBase {&lt;br /&gt;public:&lt;br /&gt;    virtual void DoSomething()&lt;br /&gt;    {&lt;br /&gt;        // 何らかの部隊としての行動&lt;br /&gt;&lt;br /&gt;        // 個々の行動&lt;br /&gt;        IUnitBase::DoSomething();&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Leaf&lt;br /&gt;class Chara : public IChara {&lt;br /&gt;public:&lt;br /&gt;    virtual void DoSomething()&lt;br /&gt;    {&lt;br /&gt;        // このキャラの行動&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void CreateChara()&lt;br /&gt;{&lt;br /&gt;    // 単独のキャラを追加&lt;br /&gt;    AddChara(MakeChara());  // ICharaを受け取る&lt;br /&gt;&lt;br /&gt;    // 部隊を追加&lt;br /&gt;    IUnitBase * const pUnit = FormUnit();&lt;br /&gt;    pUnit-&gt;AddChara(MakeChara());&lt;br /&gt;    pUnit-&gt;AddChara(MakeChara());&lt;br /&gt;    AddChara(pUnit);        // ICharaを受け取る&lt;br /&gt;}&lt;br /&gt;void DoSomething()&lt;br /&gt;{&lt;br /&gt;    // AddChara(IChara *) で追加したキャラ全てを動かす&lt;br /&gt;}&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/2837470629762242097-2064189083201537653?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/2064189083201537653/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/composit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2064189083201537653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2064189083201537653'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/composit.html' title='Composit'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-9097614944391249898</id><published>2009-09-12T23:45:00.007+09:00</published><updated>2009-09-13T00:20:18.867+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Command</title><content type='html'>&lt;span style="font-weight: bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;要求を出す側がその実際の処理を知ることなく要求を出すことができる。&lt;br /&gt;状態の保存と逆処理を行えるようにすることで、UnDoとReDoをサポートできる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;例&lt;/span&gt;&lt;br /&gt;いくつかのスキルをもったキャラクターがおり、メニューからそのスキルを使用する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Command&lt;br /&gt;class ISpecialSkill {&lt;br /&gt;public:&lt;br /&gt;    virtual Result Execute(Chara &amp;amp;target) const {};&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteCommand&lt;br /&gt;/*&lt;br /&gt;    指定したキャラの所持金を増やす&lt;br /&gt;*/&lt;br /&gt;class Skill_GetMoneyRandom {&lt;br /&gt;public:&lt;br /&gt;    virtual Result Execute(Chara &amp;amp;target) const&lt;br /&gt;    {&lt;br /&gt;        target.AddMoney();&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    指定したキャラの体力を回復させる&lt;br /&gt;*/ &lt;br /&gt;class Skill_Heal {&lt;br /&gt;public:&lt;br /&gt;    virtual Result Execute(Chara &amp;amp;target) const&lt;br /&gt;    {&lt;br /&gt;        target.RecoverLifePoint();&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Receiver&lt;br /&gt;class IChara {&lt;br /&gt;public:&lt;br /&gt;    virtual void AddMoney();&lt;br /&gt;    virtual void RecoverLifePoint();&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Invoker&lt;br /&gt;class SkillMenuItem {&lt;br /&gt;public:&lt;br /&gt;    SkillMenuItem(const ISpecialSkill &amp;amp;skill)&lt;br /&gt;        : m_skill(skill)&lt;br /&gt;    {}&lt;br /&gt;&lt;br /&gt;    Result OnSelected(Chara &amp;target) const&lt;br /&gt;    {&lt;br /&gt;        return skill.Execute(target);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    const ISpecialSkill &amp;amp;m_skill;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void RegisterSkillMenu()&lt;br /&gt;{&lt;br /&gt;    AddSkillMenu(SkillMenuItem(Skill_GetMoneyRandom()));&lt;br /&gt;    AddSkillMenu(SkillMenuItem(Skill_Heal()));&lt;br /&gt;}&lt;br /&gt;void ClickSkillMenu()&lt;br /&gt;{&lt;br /&gt;    const SkillMenuItem &amp;amp; item = GetSelectedSkillMenuItem();&lt;br /&gt;    Chara &amp; target = GetSelectedTarget();&lt;br /&gt;    item.OnSelected(target);&lt;br /&gt;}&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/2837470629762242097-9097614944391249898?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/9097614944391249898/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/command.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/9097614944391249898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/9097614944391249898'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/command.html' title='Command'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-5570121564760055828</id><published>2009-09-06T12:51:00.005+09:00</published><updated>2009-09-06T12:55:57.799+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Chain of Responsibility</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;オブジェクトを階層状につなげ、自分が処理できない要求は連鎖的に上位層に渡す。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;項目を選ぶとポップアップが開くオプションメニューがあり、&lt;br /&gt;オプション自体もポップアップで、「サウンド」を選ぶとその上にサウンド関連のメニューが重なり、「BGM」「SE」「VIOCE」などを選ぶとそれぞれの調整画面が開くとする。&lt;br /&gt;入力は最前面のポップアップのみが受け取るが、一気にオプションから抜けるなど、下のポップアップ（上位層）に任される処理も存在する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Handler&lt;br /&gt;class InputHandler {&lt;br /&gt;protected:&lt;br /&gt;    virtual void handleRequest(BUTTON);  // 入力したボタン情報を受け取る&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;    InputHandler * m_pSuccessor; // successorへのリンク&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class IPopup : public InputHandler { // ポップアップのインターフェイス&lt;br /&gt;public:&lt;br /&gt;    virtual void Update() {} // 更新処理&lt;br /&gt;    virtual void Input() {}  // 入力処理, 最前面のもののみ呼ばれる&lt;br /&gt;    virtual void Draw() {}   // 描画処理&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// ConcreteHandler&lt;br /&gt;class PopupOption : public IPopup;      // オプションウィンドウ&lt;br /&gt;class PopupSoundMenu : public IPopup;   // サウンドメニュー&lt;br /&gt;class PopupSoundAdjust : public IPopup; // 音量調整&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void PopupSoundAdjust::Input()&lt;br /&gt;{&lt;br /&gt;    // モードから一気に抜けるボタンを押した&lt;br /&gt;    if (pad.isClicked(ESCAPE)) {&lt;br /&gt;        handleRequest(ESCAPE);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void PopupSoundAdjust::handleRequest(BUTTON button)&lt;br /&gt;{&lt;br /&gt;    switch (button) {&lt;br /&gt;    default:&lt;br /&gt;        /*&lt;br /&gt;            処理できないのでsuccessorに任せる.&lt;br /&gt;            上には → PopupSoundMenu → PopupOption がいる.&lt;br /&gt;        */&lt;br /&gt;        InputHandler::handleRequest(button);&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    case DECIDE:&lt;br /&gt;        // 決定処理&lt;br /&gt;        break;&lt;br /&gt;&lt;br /&gt;    case CANCEL:&lt;br /&gt;        // キャンセル処理&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;    自分で処理できないときはsuccessorに任せる.&lt;br /&gt;*/&lt;br /&gt;void InputHandler::handleRequest(BUTTON button)&lt;br /&gt;{&lt;br /&gt;    if (m_pSuccessor) {&lt;br /&gt;        m_pSuccessor-&gt;handleRequest(button);&lt;br /&gt;    }&lt;br /&gt;}&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/2837470629762242097-5570121564760055828?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/5570121564760055828/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/chain-of-responsibility.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5570121564760055828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/5570121564760055828'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/chain-of-responsibility.html' title='Chain of Responsibility'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3169980664056045135</id><published>2009-09-06T05:50:00.004+09:00</published><updated>2009-09-06T06:13:24.283+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Builder</title><content type='html'>&lt;span style="font-weight:bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;表現形式に依存せず同じ手順でオブジェクトを生成する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;例&lt;/span&gt;&lt;br /&gt;プレイ中のスクリーンショットを撮影し、ファイルに保存する。&lt;br /&gt;保存するファイル形式は複数種類から選べ、今後も増える可能性があるので、&lt;br /&gt;ファイル形式ごとのBuilderで生成を行う。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Director&lt;br /&gt;/*&lt;br /&gt;    フレームバッファを取得し、指定した画像形式のBuilderでエンコードする.&lt;br /&gt;*/&lt;br /&gt;class ScreenCapture {&lt;br /&gt;public:&lt;br /&gt;    ScreenCapture(ImageEncorder &amp;);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Builder&lt;br /&gt;class ImageEncorder; // 画像を何らかのフォーマットにエンコードする&lt;br /&gt;&lt;br /&gt;// ConcreteBuilder&lt;br /&gt;class BmpEncorder : public ImageEncorder;  // Bitmapファイル形式にエンコードする&lt;br /&gt;class PngEncorder : public ImageEncorder { // PNGファイル形式にエンコードする&lt;br /&gt;public:&lt;br /&gt;    const Png * GetResult() const;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Product&lt;br /&gt;class Bitmap;&lt;br /&gt;class Png {&lt;br /&gt;public:&lt;br /&gt;    void SaveToFile(const std::string &amp; filename) const; // ファイルに保存する&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;void CreateSnapShot()&lt;br /&gt;{&lt;br /&gt;    PngEncorder builder;&lt;br /&gt;    ScreenCapture capture(builder); // Builderを指定する&lt;br /&gt;&lt;br /&gt;    // 結果を取得する&lt;br /&gt;    const Png * const pData = builder.GetResult();&lt;br /&gt;    pData-&gt;SaveToFile(FILENAME);&lt;br /&gt;}&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/2837470629762242097-3169980664056045135?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3169980664056045135/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/builder.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3169980664056045135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3169980664056045135'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/builder.html' title='Builder'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-7249885574401572661</id><published>2009-09-06T05:06:00.006+09:00</published><updated>2009-09-06T06:13:39.287+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Bridge</title><content type='html'>&lt;span style="font-weight: bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;実装を分離することで、クラスの拡張性を高めるとともに、実装を隠蔽し、コンパイル時の依存性を下げることができる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;例&lt;/span&gt;&lt;br /&gt;動画ファイルの再生、キーフレームアニメ、スプライトアニメを同列に扱いアニメーションを表示したい。&lt;br /&gt;ただし、使用箇所に合わせて何らかの拡張を行うことが考えられるため、実装は分離する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Abstruction&lt;br /&gt;class AnimeBase {&lt;br /&gt;   /*&lt;br /&gt;       アニメの基本機能はAnimeImplで実装する.&lt;br /&gt;   */&lt;br /&gt;   AnimeImpl * m_pAnime;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// RefinedAbstruction&lt;br /&gt;class AnimeOnBackground : public AnimeBase;    // ゲームの背景素材としてアニメを表示する&lt;br /&gt;class AnimeOnDisplayInGame : public AnimeBase; // ゲーム空間内のディスプレイにアニメを表示する&lt;br /&gt;&lt;br /&gt;// Implementor&lt;br /&gt;class AnimeImpl; // アニメの実装のインターフェイス&lt;br /&gt;&lt;br /&gt;// ConcreteImplementor&lt;br /&gt;class MovieAnimeImpl : public AnimeImpl;    // 動画ファイル&lt;br /&gt;class KeyFrameAnimeImpl : public AnimeImpl; // キーフレームアニメーション&lt;br /&gt;class SpriteAnimeImpl : public AnimeImpl;   // スプライトアニメ&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/2837470629762242097-7249885574401572661?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/7249885574401572661/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/bridge.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7249885574401572661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/7249885574401572661'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/bridge.html' title='Bridge'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-3800945639751162126</id><published>2009-09-06T04:06:00.007+09:00</published><updated>2009-09-06T04:14:57.233+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Adaptor</title><content type='html'>&lt;span style="font-weight: bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;あるクラスのインターフェイスを、必要とされるインターフェイスに変換する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;例&lt;/span&gt;&lt;br /&gt;様々な形式の設定ファイルを読み込むために、IParserの具象化クラスで解析するようにしている。&lt;br /&gt;XMLから読み込む必要が生まれたので、既にあるXmlParserを使用して実装したい。&lt;br /&gt;XmlParserはIParserのサブクラスではないが、Adaptorを作成することで使用できるようになる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// Target&lt;br /&gt;class IParser;&lt;br /&gt;&lt;br /&gt;// Adaptee&lt;br /&gt;class XmlParser;&lt;br /&gt;&lt;br /&gt;// Adaptor&lt;br /&gt;class XmlParserAdaptor : public IParser {&lt;br /&gt;    /*&lt;br /&gt;        IParserの機能はXmlParserを使って実装する.&lt;br /&gt;    */&lt;br /&gt;    XmlParser m_parser;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;/*&lt;br /&gt;    IParserを使って設定ファイルを読み込む.&lt;br /&gt;    XmlParserは使用できないが, Adaptor(XmlParserAdaptor)なら使用できる.&lt;br /&gt;*/&lt;br /&gt;void LoadConfig(IParser &amp;amp;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;その他&lt;/span&gt;&lt;br /&gt;オブジェクトコンポジション、多重継承の二通りの方法で実現できる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2837470629762242097-3800945639751162126?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/3800945639751162126/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/adaptor.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3800945639751162126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/3800945639751162126'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/adaptor.html' title='Adaptor'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-2812932569976925595</id><published>2009-09-06T00:10:00.012+09:00</published><updated>2009-09-06T11:45:57.601+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>Abstruct Factory</title><content type='html'>&lt;span style="font-weight: bold;"&gt;概要&lt;/span&gt;&lt;br /&gt;複数のオブジェクトを使って実現する機能があるとき、そのまとまり単位で生成するようにする。&lt;br /&gt;そのまとまりを丸ごと違うものと入れ替えられるようにする。&lt;br /&gt;使う側は実際に生成されるオブジェクトの違いを意識しなくて良い。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;例&lt;/span&gt;&lt;br /&gt;16:9と4:3ではメニュー画面の異なるゲームがあり、&lt;br /&gt;メニュー画面には「メニューそのもの」「背景」「説明テキスト欄」があるとする。&lt;br /&gt;16:9と4:3とのそれぞれのオブジェクトとFactoryを用意し、呼び出す際に画面の設定を見て作成するほうを決める。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;雰囲気&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="c++:nocontrols"&gt;&lt;br /&gt;// AbstructFactory&lt;br /&gt;class IModeMenuFactory; // Factoryのインターフェイス&lt;br /&gt;&lt;br /&gt;// AbstructProduct&lt;br /&gt;class IMenu;       // メニューのインターフェイス&lt;br /&gt;class IBackground; // 背景のインターフェイス&lt;br /&gt;class IExplain;    // 説明テキスト欄のインターフェイス&lt;br /&gt;&lt;br /&gt;// ConcreteFactory&lt;br /&gt;class NormlModeMenuFactory : public IModeMenuFactory; // 4:3でのメニュー画面&lt;br /&gt;class WideModeMenuFactory: public IModeMenuFactory;   // 16:9でのメニュー画面&lt;br /&gt;&lt;br /&gt;// ConcreteProduct&lt;br /&gt;class NormalMenu  : public IMenu;            // 4:3でのメニュー&lt;br /&gt;class NormalBackground : public IBackground; // 4:3での背景&lt;br /&gt;class NormalExplain : public IExplain;       // 4:3での説明テキスト欄&lt;br /&gt;&lt;br /&gt;class WideMenu : public IMenu;             // 16:9でのメニュー&lt;br /&gt;class WideBackground : public IBackground; // 16:9での背景&lt;br /&gt;class WideExplain : public IExplain;       // 16:9での説明テキスト欄&lt;br /&gt;&lt;br /&gt;// Client&lt;br /&gt;/*&lt;br /&gt;    ConcreteFactory(4:3ならNormalModeMenuFactory, 16:9ならWideModeMenuFactoryのインスタンス)を受け取りメニュー画面を作成する.&lt;br /&gt;    内部ではConcreteFactoryが生成したConcreteProductをアップキャストしたAbstructProduct(IMenu, IBackground, IExplain)を使う.&lt;br /&gt;    受け渡しがAbstructFactory, 使用するのがAbstructProductと抽象化されているので, 丸ごと差し替えられる.&lt;br /&gt;    ClientはConcreteProductについて知らなくても良い.&lt;br /&gt;*/&lt;br /&gt;void CreateModeMenu(const IModeMenuFactory &amp;amp; factory)&lt;br /&gt;{&lt;br /&gt;    IMenu * const pMenu = factory.CreateMenu();&lt;br /&gt;    IBackground * const pBg = factory.CreateBackground();&lt;br /&gt;    IExplain * const pExplain = factory.CreateExplain();&lt;br /&gt;&lt;br /&gt;    SetModeMenuObjects(pMenu, pBg, pExplain);&lt;br /&gt;}&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/2837470629762242097-2812932569976925595?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/2812932569976925595/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/abstructfactory.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2812932569976925595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/2812932569976925595'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/abstructfactory.html' title='Abstruct Factory'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2837470629762242097.post-1108982869073561484</id><published>2009-09-06T00:09:00.005+09:00</published><updated>2009-09-16T15:18:58.000+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='デザインパターン'/><title type='text'>デザインパターン: カテゴリの説明</title><content type='html'>デザインパターンについてのメモを書きます。&lt;br /&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/2837470629762242097-1108982869073561484?l=petitbanca.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petitbanca.blogspot.com/feeds/1108982869073561484/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1108982869073561484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2837470629762242097/posts/default/1108982869073561484'/><link rel='alternate' type='text/html' href='http://petitbanca.blogspot.com/2009/09/blog-post.html' title='デザインパターン: カテゴリの説明'/><author><name>のぶ</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_p1vux84u5yg/ShF3NVFQmaI/AAAAAAAAAAs/qPBG1MAHhXM/S220/OB0000052.PNG'/></author><thr:total>0</thr:total></entry></feed>
