プログラム

ワーカースレッドを含むプログラムをVC++のデバッグモードでデバッグすると落ちる

まだ、生きてるよ。ということでメモ代わりに書いておく。
VisualStudio2005...というか、VisualC++のデバッグモードでワーカースレッドを含むプログラムをブレークポイントを設定してデバッグするとVC++が固まって動かない。応答もなくなり、キー入力も受け付けない。
何かデバッグの仕方間違えてるのかな。と思いつつ、あれこれ調べてみると、MS-IMEをタスクバーに入れていたり、ウィンドウとして表示していると固まるという冗談みたいな内容を見つけたので、まさかと思いつつ試したら解決した。

・・・なんだこれ。

bookreader.js

やっぱり、話題に微妙に乗り遅れる人。私。

簡単にHTMLを修正するだけで、小説の様なインターフェースで横スクロールで表示し読みやすくするJavaScriptライブラリ。bookreader.jsを使ってみた。
ということで、簡単なサンプルとして、指定したサイトのフィード情報を取ってbookreader.jsで表示するのを書いてみた。
f:id:hideack:20080629181323p:image
が、画像が入るとどうもうまく表示させられない*1ので、現状文字のみ。寂しい。

このページ( http://www.feeddown.com/feedbook/ )でフィードがあるサイトのURL入れると情報取ってきて表示されます。
やってることは、シンプルですが、実際に触ってみないと何事もわからないので。

*1:多分、フィード取ってきたときの加工がへたくそなのだと思う

VisualStudio2005のオーバーライドのボタン

VisualStudioで何か継承したクラスを作成したとき*1VisualStudioのクラスのプロパティからオーバーライドのアイコンをクリックする事でオーバーライド可能な関数の一覧がすぐに表示されて、クリックするだけで*.hへの反映と*.cppへの雛形表示が行われますが。
前々から思っていたのだけど、どうも解せない。このアイコン。(選択されている立方体のアイコン)
f:id:hideack:20080623170708p:image
イベントリスナー追加の、このアイコンのとなりにある稲妻マークは結構直感的だと思うのだけど。
ただ、以前のVisualStudioのバージョンから続くアイコンだから、ずっと使い続けている人にはわかりやすいのだろうな。
時々しか使わない私にはいつまでも頭に入らない。

*1:もっぱら、C〜のMFCのクラスを継承する事が大半ですが

HDLでRAMの一面からもう一面へコピーする話

その昔のお話。HDLでRAMからデータを読み出して云々していた頃。
あ、そもそもRAMといっても、いろいろ種類がありますが、シンプルにアドレスと値だけここでは取り上げます。
f:id:hideack:20080616213533p:image
どの様な内容だったかというと…。
画像の処理だったか忘れてしまいましたが、RAMが2面あって、そこに次の様なコピーをする処理が必要になった。というとき。
あ、でも、こうやって正方形にできたってことは画像処理だったのかなぁ。
簡単のため、4x4の情報、16アドレスのRAMで考えます。
f:id:hideack:20080616213535p:image
で、コピーをするときにはRAMのアドレスを指定する必要があるので、この場合、コピー元のアドレスは単純に4ビットのカウンタを用意してアドレスに指定してやればよい。
f:id:hideack:20080616213534p:image
問題は、書き出すときのRAMの指定でありまして。

0x0 → 0x4 → 0x8 → 0xc → 0x1 → 0x5 ...

てな具合の動きをさせてやらなければならない。
読むアドレスと書くときのアドレスは次の様な関係な訳です。
f:id:hideack:20080616213530p:image
このとき、書き込み先のRAMのアドレスは、例えばソフト書くとき配列の引数の様に考えれば、

int baseram[16];  // 読み込み元RAMのイメージ
int destram[16];  // 書き込み先RAMのイメージ
int address;
for(int i=0; i<16; i++){
address = (i * 4) % 15;
destram[address] = baseram[i];   // コピー
}

といった形で書けるが、これをVHDLで書くときは、単純にこうしてやればよい…。
コピー元のアドレスを作るためのカウンタが、

signal COUNTER : std_logic_vector(3 downto 0);

といった感じで構成されていれば、書き込み先にアドレスをビット連結して次の様にすればよい。

signal WRADRS : std_logic_vector(4 downto 0);
-- 中略
WRADRS = COUNTER(1 downto 0) & COUNTER(3 downto 2);  -- ココ!

図に書くとこの様な感じ。
f:id:hideack:20080616213532p:image
ビットの並びを変えるだけで、書き込み先のアドレスも簡単に構成できる訳です。
初めて教わったときには、目から鱗がボロボロこぼれた記憶がある。

よく考えると、そりゃそうさ。なのだけど。
気づいたり教わったときの感動は忘れない様に。ということで、長いエントリーでした。

Ethnaでベースディレクトリの場所を取得する

ベースディレクトリというのは、Ethnaのプロジェクトの親ディレクトリ。"app"や"template", "log"等々が置かれているディレクトリのことでありまして...。このディレクトリ名を処理中取得したい場合。
バックエンド処理クラス Ethna_Backend に getBasedir() というメソッドがあるのでこれを使えばよい。
Actionクラスであれば、

$basedir = $this->backend->getBasedir();

といった感じで取得できる。

なぜ、いまさらこんなことを書いているかというと、Ethna...というよりPHP...というよりWebアプリケーションって何ですか?という様な右も左もわからないまま、1年と少し前、突如Webアプリを作ることになった際にあれこれ調べながら作ったのですがその時にEthnaの環境設定ファイルの"etc/〜-ini.php"へプロジェクトディレクトリの場所をご丁寧に書いてそこからとっていたので。

落ち着いたとき振り返るのは重要ですね。
なかなか落ち着かないので振り返られないという話もありますが。

processingその後

昨今はJavaScript版で書かれたprocessing*1が流行の様ですが、私は先日以来入れて触っている元祖processingでありまして。
今日はいろいろ上に書いた様なもやもや感を解消すべく、MacBookAirについてるカメラで撮った画像をリアルタイムで処理させてみようと試みてみました。
あれこれ見たところ、JMyronというライブラリを取り込めばやりたいことはできる様なので早速導入。
Downloadのリンクから"Processing Library (Popular)"と書かれているリンクからzipファイルを落として解凍*2すると

  • JMyronフォルダ
  • JMyron Exampleフォルダ
  • Extra DLLsフォルダ
  • HowToInstall.txt

なる4つが得られので、JMyronフォルダをprocessingのlibrariesフォルダへ。
プログラム例もあると便利なので、JMyron Exampleフォルダをprocessingのexamplesフォルダの中へとそれぞれ投げ込みます。
(HowToInstall.txtの説明のまんまですな。)
ただ、Intel Macの場合は、そのままではNGでJMyronフォルダの中にあるlibJMyron.jnilibをhttp://www.jibberia.com/projects/で配布されているバイナリに差し替えないとNGの様だ。

http://www.jibberia.com/projects/ の "libJMyron.jnilib compiled for intel macs"というリンクをクリックしてIntel Mac用のバイナリを取得する。
f:id:hideack:20080514002207p:image
(赤い矢印の先がリンク)
ファイルをダウンロードしたら解凍の後、"libJMyron.jnilib"を、(processingのインストール位置)//libraries/JMyron/libraryへ上書きコピー。
ファイル*.jnilibという拡張子からして、Java Native Interface用のライブラリなのだろう。

これで動くはずなので、さきほどコピーしたサンプルを試してみる。
JMyron Examplesの中の"Myron_simpleCamera"なる名前のサンプルがいかにもシンプルそうなので試してみる。
えいやと実行すると…。MacBookのカメラが起動して…。
f:id:hideack:20080514002533p:image

おお、カメラで撮られているのが動く!
ソースを見ると結構シンプルなのでわかりやすい。実質35行くらい。
少し加工してみる。
画像を上下左右反転させて、モノクロ化をしようと思ったら*3次の様に書き換えればよい。
サンプルを多少書き換えて下の様にしてみる。

void draw(){
m.update();
int[] img = m.image();
float r,g,b,ave;
loadPixels();
for(int i=0;i<width*height;i++){
r = red(img[i]);
g = green(img[i]);
b = blue(img[i]);
ave = (r+g+b)/3.0;
pixels[width*height-1-i] = color(ave,ave,ave);
}
updatePixels();
}

んでもって実行。

f:id:hideack:20080514003618p:image

ココで見るとすべて静止画ですが、きちんと動画として表示されています。
なんか結構楽しいなぁ。と、楽しんでいるといい時間になったので、とりあえず今日はここまで。

学生の頃に勉強した画像処理のフィルタを試してみたりとか、最近のデジカメでよく付いてる顔検出の勉強とかできそうですね。
動き検出して画像を動かしたり音とかならせたら、テルミンの様な不思議なこともできたりして。

*1:厳密には機能を一部実装したもの

*2:…うーん。展開と言わないところがナニですかね

*3:ナニを思ったらこうなるのか。簡単にできることを探したらこうなった。。。

Processing入門

[追記]2008/8/4
MacBook等についているカメラから取り込んだ動画をprocessingで編集する話はこちらを参照。

連休中はすっかりコンピュータを触れることからはなれて、クワで畑を耕したり、切り倒した木を小さく切ったりとすっかり「御職業は?」状態なので本日午後よりリハビリ開始。
でも、いままで経験したことないのを試してみるか。ということで、Processingを触ってみた。
簡単に絵が描ける。という、ものすごいおおざっぱな解釈は持っていたので、では図のプログラムの入門はマンデルブロー集合でしょうということでプログラムを、こんにゃろこんにゃろと書く。
下の様な図を表示させるプログラムがすぐにかけた。
f:id:hideack:20080506171630p:image
Javaを非常にシンプルにした様な形なので結構気楽に書けたなぁ。
N88-BASICで中学校のとき、Javaで大学生のときに書いて以来だったけど、グラフィックを使ったプログラムを書くと、激しく満足感が得られるので楽しい。

蛇足だが、N88-BASICで書いたときは640x400の画面へ400x400ピクセルの範囲に描画させても、えらく待った記憶がある。

NetBeans IDE 6.1

まだ日本語版はリリースされていない*1様ですが、NetBeans6.1を使ってみた。
ダウンロードはこちらから可能。
というのも、今回のバージョンからPHP5の開発環境をサポートするバージョンの提供が始まったのと、以前のバージョンからJavaScriptの編集機能もついているということで。
f:id:hideack:20080429095501p:image
f:id:hideack:20080429094324p:image
Netbeansは大学生の頃、一度使ってみたのだけど、動作が重くて少し我慢ならずecipseを使う様になっていたで久しぶりだ。
いろいろと試してみようと思う。

*1:日本語化パッチは提供されている

Rubyで2進数表記に変換(負の数は2の補数で表示)

Rubyで整数を与えて、その数を2進数で表記したい場合。
sprintf or formatで数値を文字列に直して表示させればよい。
以下の様な形。

>> format("%.10b", 1)
=> "0000000001"
>> format("%.10b", -1)
=> "1111111111"

%の右隣の".10"は精度を示すもので、ここでは"b"(ビット列表記)が指定されているのでビット幅を意味する。
この場合は10bit幅と相成る。
ここで、"."を抜いて表記すると以下の様になる。

>> format("%10b", -1)
=> "       ..1"

Rubyの整数は上限が無いので、-1を2の補数表記すると"1111.......1111"と、ずーっと続くことになるので、ビット幅を指定しないと上記の様に表示されてしまうということになる。
以前もここで書いたことがあるけど、Rubyはハードウェア検証の際の期待値を作るのに適してる気がする。
前職で別の会社で常駐していたときに利用されている方がいたなぁ。と思い出した。

GHDL

今日もまたメモメモ。
フリーのVHDLシミュレータ(コンパイラ)。論理合成はもちろんできない。

GHDL is a complete VHDL simulator, using the GCC technology.
(http://ghdl.free.fr/)

VCDファイルを出力することができるので、GTKWave等のビューワで波形を確認できる。
雑談だけど、これだと私が使ってるMacのOSXの上でも一通りできそうだよな。