2010/05/10(月)配列?リングバッファ?
今更ながらに気づいた
必要なのは配列ではなく、リングバッファでした
...
配列のソースを元に作り直す事にする
2010/05/07(金)配列
javascriptとかperlになれてしまうと使いにくくてしかたがない
やってられないので、テンプレート使ってarrayクラスを自作
素直に、テンプレートのarrayとかlistつかえって話もあるんだろうけど、使い勝手の都合上作成
使い方メモ
#include "array.h" CArray<double> array(10); // 一度に確保するメモリサイズ array = 1; array = 2; array[5] = 5; array = 6; array[104] = 104;
これで
[0] = 1 [1] = 2 // 間は不定(コンストラクタ次第) [5] = 5 [6] = 6 // 間は不定(コンストラクタ次第) [104] = 104
になる
確保されるメモリ
[0]-[9]
[100]-[109]
の20ブロック分
アクセスがあるとその部分のメモリが確保される
そのため、順次アクセス
for(int i = 0; i < array.Count(); ++i) [i];
なんてことをすると普通にすべて確保されてしまうので注意
isAlloacted(i)を使うと、メモリが確保されているか確認できる
ただし、確保されている = 定義済み、ではない
2010/05/05(水)Direct 3Dの初期化とか
適当に作ったformのpicturebox内部に描画するように作成
背景を適当に塗りつぶして、四角形(三角形×2)の描画
四角形の描画のため、頂点4つ分だけメモリ確保してます
もっと大きなものを書きたければそれだけメモリ確保する必要あり
namespace書いてないとか、this->を書いてあるとか丁寧に書いてます。
適当に省略してください。
あと、ブログに載せるとき一部編集してます(変数名とか)
直し忘れとかあったらごめんなさい
プロジェクトの設定
[プロジェクト] - [xxxのプロパティ Alt+F7]の共通プロパティの参照に
- Microsoft.DirectX
- Microsoft.DirectX.Direct3D
を追加
使う変数の定義
public ref class Form1 : public System::Windows::Forms::Form { private: Microsoft::DirectX::Direct3D::Device^ dxDevice; Microsoft::DirectX::Direct3D::PresentParameters^ dxPresentParameters; array<Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured, 1>^ dxVertexs; Microsoft::DirectX::Direct3D::VertexBuffer^ dxVertexBuffer; System::Timers::Timer^ dxRefreshTimer; }
上から、描画のためのデバイス、そのパラメータ、描画のための頂点座標配列、ビデオメモリ上のメモリバッファ、再描画のためのタイマー
コンストラクタ
Form1(void) { InitializeComponent(); InitializeDirectX(); // 追加 }
DirextXのための初期化ルーチンを呼び出すように追加。初期化ルーチンの内容は次。
初期化ルーチン
void InitializeDirectX(void) { // パラメータ this->dxPresentParameters = gcnew Microsoft::DirectX::Direct3D::PresentParameters(); this->dxPresentParameters->Windowed = true; this->dxPresentParameters->SwapEffect = Microsoft::DirectX::Direct3D::SwapEffect::Discard; this->dxPresentParameters->PresentationInterval = Microsoft::DirectX::Direct3D::PresentInterval::Immediate; // デバイスの作成 this->dxDevice = gcnew Microsoft::DirectX::Direct3D::Device(0, Microsoft::DirectX::Direct3D::DeviceType::Hardware, this->pictureBox1, // 表示するコントロールまたはウィンドウを渡す Microsoft::DirectX::Direct3D::CreateFlags::SoftwareVertexProcessing, this->dxPresentParameters); this->dxDevice->RenderState->Lighting = false; // 光源なし // 描画用の頂点配列のメモリ確保 this->dxVertexs= gcnew array<Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured, 1>(4); this->dxVertexBuffer= gcnew Microsoft::DirectX::Direct3D::VertexBuffer(this->dxVertexs[0].GetType(), 4, this->dxDevice, Microsoft::DirectX::Direct3D::Usage::None, Microsoft::DirectX::Direct3D::VertexFormats::Normal, Microsoft::DirectX::Direct3D::Pool::Managed); // 再描画用のタイマー設定 this->dxRefreshTimer= gcnew System::Timers::Timer(); this->dxRefreshTimer->Elapsed += gcnew System::Timers::ElapsedEventHandler(this, &Form1::RefreshTimer_Event); this->dxRefreshTimer->Interval = 1000.0 / 30.0; // 30[fps] this->dxRefreshTimer->Enabled = true; }
強制的に再描画させるためにタイマーを設定
描画のためのルーチン
タイマーイベント用
System::Void RefreshTimer_Event(System::Object^ sender, System::Timers::ElapsedEventArgs^ e){ this->pictureBox1_RePaint(); }
実際の再描画
System::Void pictureBox1_RePaint() { this->dxDevice->BeginScene(); // 描画開始 this->dxDevice->Clear(Microsoft::DirectX::Direct3D::ClearFlags::Target, System::Drawing::SystemColors::ActiveCaption, 1.0f, 0); // 一度画面を指定色でクリア this->drawBox(10.0, 10.0, 30.0+i, 30.0+i); // 四角形の描画 this->dxDevice->EndScene(); // 描画終了 try{ this->dxDevice->Present(); // 画面に反映 }catch(Microsoft::DirectX::Direct3D::DeviceLostException^ e){ // 失敗 = デバイスが使えない状態 // 今回は5秒後に再チャレンジ this->dxRefreshTimer->Interval = 5000; // 5[sec] // デバイスがリセットできる状態になったらリセット int result; if(!this->dxDevice->CheckCooperativeLevel(result)){ if(result == (int)Microsoft::DirectX::Direct3D::ResultCode::DeviceNotReset){ this->dxDevice->Reset(this->dxPresentParameters); this->dxRefreshTimer->Interval = 1000.0 / 15.0; // 15fpsに戻す } } } }
描画補助(四角形の描画)
System::Void drawBox(float x, float y, float w, float h){ // 頂点を指定する順番に注意(左上、右上、左下、右下) this->dxVertexs[0].X = x; this->dxVertexs[0].Y = y; this->dxVertexs[0].Tu = 0; this->dxVertexs[0].Tv = 0; this->dxVertexs[0].Z = 0; this->dxVertexs[0].Color = Color::Pink.ToArgb(); this->dxVertexs[1].X = x+w; this->dxVertexs[1].Y = y; this->dxVertexs[1].Tu = 1; this->dxVertexs[1].Tv = 0; this->dxVertexs[1].Z = 0; this->dxVertexs[1].Color = Color::Pink.ToArgb(); this->dxVertexs[2].X = x; this->dxVertexs[2].Y = y+h; this->dxVertexs[2].Tu = 1; this->dxVertexs[2].Tv = 1; this->dxVertexs[2].Z = 0; this->dxVertexs[2].Color = Color::AliceBlue.ToArgb(); this->dxVertexs[3].X = x+w; this->dxVertexs[3].Y = y+h; this->dxVertexs[3].Tu = 0; this->dxVertexs[3].Tv = 1; this->dxVertexs[3].Z = 0; this->dxVertexs[3].Color = Color::AliceBlue.ToArgb(); Microsoft::DirectX::GraphicsStream^ dxGraphicsStream = this->dxVertexBuffer->Lock(0, 0, Microsoft::DirectX::Direct3D::LockFlags::None); dxGraphicsStream->Write(this->dxVertexs); // 頂点座標をバッファに書き込み this->dxVertexBuffer->Unlock(); this->dxDevice->SetStreamSource(0, this->dxVertexBuffer, 0); this->dxDevice->VertexFormat = Microsoft::DirectX::Direct3D::CustomVertex::TransformedColoredTextured::Format; this->dxDevice->DrawPrimitives(Microsoft::DirectX::Direct3D::PrimitiveType::TriangleStrip, 0, 2); // 描画 }
TriangleStripで三角形の描画を指定、それを2個描画することで四角形になる
参考
- ググって出てきたいろんなサイト
- ソフトウェア制作サイト CLKsのC#でゲームプログラミング
- Google Books DirectX逆引き大全500の極意
検索用
[DirectX] [Direct3D] [Visual Studio 2008] [.net] [cpp/cli] [c++]
2010/05/04(火)CPP/CLI + DirectX
辞書が欲しい
関数調べるのにわざわざネット繋ぐのだるい
世の中快適なブロードバンドばかりだと思うなー
それはいいとして、マネージコード上でDirectXを使うときの注意
普通に古い?DirectXのライブラリを使おうとするとローダー上でマネージコードを実行するなと怒られます
マネージ デバッグ アシスタント 'LoaderLock' では 'c:\Users\serika\Documents\Visual Studio 2008\Projects\MyDXApp\Debug\MyDXApp.exe' に問題を検出しました。
追加情報: DLL 'C:\Windows\assembly\GAC\Microsoft.DirectX.DirectDraw\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.DirectDraw.dll' は、OS ローダー ロック内でマネージ実行を試行しています。DllMain またはイメージ初期化関数内でマネージ コードを実行しないでください。この動作は、アプリケーションをハングさせる原因になる可能性があります。
.NET開発者のためのDirectX連携手法の2ページ目によると、ライブラリが古いのが悪いらしい(汗
一応問題ないらしいので、[デバッグ] - [例外]の[Managed Debbuging Assistants] - [LorderLock]のチェックを外してしまえばよい模様
検索用
[Visual Studio 2008] [.net] [DirectX] [Direct Draw] [CPP] [CLI]
2010/03/19(金)カタカナをひらがなに変換 @ エクセル
カタカナをひらがなに変換する関数したかったのだけれど、ググるとPHONETIC関数使えと出てくる
って、どんなデータにもふりがな入ってると思うな-
半角カナを全角カナに変換する JIS関数 はあるのに、全角カナをひらがなに変換する関数はなさげ
仕方ないので関数を作成
一応こんな感じになった
Function toKana(k As Range) Dim str As String i = 1 Do While (1) letter = Mid(k.Value, i, 1) If (letter = "") Then Exit Do ElseIf (AscW("ァ") <= AscW(letter) And AscW(letter) <= AscW("ン")) Then letter = ChrW(AscW(letter) - AscW("ァ") + AscW("ぁ")) End If str = str & letter i = i + 1 Loop toKana = str End Function
使い方
おもむろにエクセルのvbaエディタ開いて、標準モジュール挿入して上のコードをコピペ
あとは、セルに = toKana("カタカナ") とかいれてあげると、ひらがなで表示されるはず
注意
ひらがなのない ヴ、ヵ、ヶ の3文字は変換できません
これらはカタカナのまま残ります...タブン
"ウ゛"のように置換してもいいだろうけどね
参考サイト
ぐぐってでてきたいろいろなところ
検索用
[excel] [vba] [関数] [マクロ] [カタカナ] [ひらがな] [変換]
2009/11/24(火)Goのinstall
google先生が開発中のGoを使ってみた
install
installing Goに一通り書いてあるので、その通りにするだけ
環境設定
goを入れるディレクトリを作成し、環境設定
ついでに、homeにbinディレクトリを作成*1
$ mkdir $HOME/go $ mkdir $HOME/bin
~/bash.rcに設定を追記
# go export GOROOT=$HOME/go export GOARCH=amd64 export GOOS=linux export PATH="$PATH:$HOME/bin"
リポジトリからDL
pythonまわりのツールが入って無かったのでインストールしてからDL
# apt-get install python-setuptools python-dev # easy_install mercurial $ hg clone -r release https://go.googlecode.com/hg/ $GOROOT
コンパイルしてインストール
bisonとか入ってなったのでインストールしてからコンパイル
環境によっては、他にも入れるものがあるかも
# apt-get install bison $ cd $GOROOT/src $ ./all.bash
最後に、
--- cd ../test 1 known bugs; 0 unexpected bugs
と出て
binフォルダにコンパイラとかインストールされて終了
って、既知のバグが残ってるのね...
hello world
exampleのとおりに書いてコンパイルしてみる
$ vi helloworld.go $ 6g helloworld.go $ 6l helloworld.6 $ 6.out hello, world $
というわけで無事実行できました
疑問とか
6gがコンパイラ、6lがリンカってことは何となく分かるけど、他の2つ(6c, 6a)は何だろう
そのうち、マニュアルとか見てみることにする
2009/05/27(水)4kbのプログラム
たった4kbでここまでできるものなのですね
って、どれだけ圧縮したり、CPUに負荷をかけているのかわかりませんが...
http://www.pouet.net/prod.php?which=52938
2009/03/02(月)zope
# apt-get install python-dev $ wget http://peak.telecommunity.com/dist/ez_setup.py # python2.4 ez_setup.py $ wget http://download.zope.org/distribution/ZConfig-2.4a2.tar.gz $ easy_install2.4 --install-dir='ZOPE/lib/python/' ZConfig-2.4a2.tar.gz $ wget http://download.zope.org/distribution/zdaemon-1.4a2.tar.gz $ easy_install2.4 --install-dir='ZOPE/lib/python/' zdaemon-1.4a2.tar.gz $ wget http://pypi.python.org/packages/source/p/plone.app.blob/plone.app.blob-1.0b2.tar.gz#md5=3a438c29ed34f819aea7983340eddd2c $ easy_install2.4 --install-dir='ZOPE/lib/python/' plone.app.blob-1.0b2.tar.gz
2009/02/23(月)cookie
set
self.context.REQUEST.RESPONSE.setCookie('name', 'value', path='/', expires='')
get
self.context.REQUEST.has_key('name')でチェック
trueならばデータがあるので
self.context.REQUEST['name']で取り出し
消し方
よく分からないけど、
self.context.REQUEST.RESPONSE.setCookie('name', '', path='/', expires='Thu, 1-Jan-2000 00:00:00 GMT')
とかでいいのかな