Type-P MOTION EYE キャプチャプログラム その2 ― 2009/03/29 02:48
SetPixel関数にバグがあるため。
Vistaベーシック上では、描画されないエリアが発生するという...。
しかしこのBugはなによ。
SetPixelって基本的な関数じゃん。
それがSP1でも修正されてないって..。
効率の問題から最終形のプログラムでは使わないにしろ、
ちょっとした実験などではこの命令は重宝する。
基本的な関数だからまさかBugとは思わず
ググらなかったのではまってしまった。
Type-P MOTION EYE キャプチャプログラム ― 2009/03/29 01:27
プロセスの複数生成 ― 2009/03/08 22:15
さて、今Erlangで作りたいと思っているサンプルがあるのですが、それは大量のプロセスを生成する必要があります。まずは、その機能を「プログラミングErlang」を参考にしながら、前のソースに追加してみます。と言っても、下記コメント部分の2箇所を追加しただけです。
-module(ets_hina_taksan). -export([taksan/1]). %%追加 taksan(N) -> for(1,N,fun() -> spawn(fun() -> start() end) end). start() -> TableId = ets:new(test, [ set ]), receiver(TableId). receiver(TableId) -> receive {init} -> init(TableId), receiver(TableId); {view} -> view(TableId), receiver(TableId); {set,A,B} -> set(TableId,A,B), receiver(TableId) end. init(TableId) -> ets:insert(TableId, {a,1}), ets:insert(TableId, {b,2}), ets:insert(TableId, {c,3}), ets:insert(TableId, {d,4}). view(TableId) -> List = ets:tab2list(TableId), io:format("~-13w => ~p~n", [set, List]). set(TableId,A,B) -> ets:insert(TableId, {A,B}). %%追加 for(N, N, F) -> [F()]; for(I, N, F) -> [F()|for(I+1, N, F)].
これをコンパイルします。
> c(ets_hina_taksan). {ok,ets_hina_taksan}
ここで、プロセスを5つ生成してみましょう。
Pid = ets_hina_taksan:taksan(5). [<0.54.0>,<0.55.0>,<0.56.0>,<0.57.0>,<0.58.0>]
全プロセスに、viewメッセージを送ってみます。
> lists:foreach(fun(Pidx) -> Pidx ! {view} end,Pid). set => [] set => [] set => [] set => [] set => []
当然、全部空[]ですね。
では、1番目のプロセスのみinitメッセージを送り、初期値を設定してみます。
> [Pid1|_]=Pid. %%リストの先頭要素をPid1に取り出す。 [<0.54.0>,<0.55.0>,<0.56.0>,<0.57.0>,<0.58.0>] > Pid1. %%念のため、Pid1が1番目のプロセスを掴んだか確認 <0.54.0> > Pid1 ! {init}. %%Pid1にinitメッセージを送る。 {init}
再度、全プロセスにviewメッセージを送ってみます。
> lists:foreach(fun(Pidx) -> Pidx ! {view} end,Pid). set => [{d,4},{c,3},{b,2},{a,1}] set => [] set => [] set => [] set => []
1番目のプロセスのみ、値が設定されましたね。
ETS (Erlang Term Storage) -Erlangでの破壊的代入(変数の変更) ― 2009/03/04 23:57
もともとこのブログは、Erlangを探るため、またその備忘として始めたのでした。 しかし、その最初がこれかという感じもしますが...。
Erlangは変数の値が変更できないのでしたが、 場合によっては、どうしても破壊的代入を行いたくなることがあります。 Erlangではそのようなケースも察してか、ETSという、破壊的代入ができる、汎用性の高いハッシュテーブルが用意されています。 (ただしETSの仕組みのうち、順序付きセットはハッシュテーブルではなく平衡二分木で実装されているとのことです)
-module(ets_hina). -export([start/0]). start() -> TableId = ets:new(test, [ set ]), receiver(TableId). receiver(TableId) -> receive {init} -> init(TableId), receiver(TableId); {view} -> view(TableId), receiver(TableId); {set,A,B} -> set(TableId,A,B), receiver(TableId) end. init(TableId) -> ets:insert(TableId, {a,1}), ets:insert(TableId, {b,2}), ets:insert(TableId, {c,3}), ets:insert(TableId, {d,4}). view(TableId) -> List = ets:tab2list(TableId), io:format("~-13w => ~p~n", [set, List]). set(TableId,A,B) -> ets:insert(TableId, {A,B}).
これをコンパイルします。
> c(ets_hina). {ok,ets_hina}
早速、プロセスを生成してみましょう。
> Pid = spawn(fun ets_hina:start/0). <0.57.0>
テーブルの中身を見るよう、先ほど生成したプロセスに、viewメッセージを送りましょう。
> Pid ! {view}. set => []
当然中身は空っぽです。 値を代入していないからですね。
では、テーブルの値を初期化するよう、initメッセージを送ってみましょう。
> Pid ! {init}. {init}
もう一度、viewメッセージを送って、テーブルの中身を表示してみましょう。
> Pid ! {view}. set => [{d,4},{c,3},{b,2},{a,1}]
はい。テーブルの中身が表示されました。
では本日のお題。 aの値を1から9へ変更してみましょう。
> Pid ! {set,a,9}. {set,a,9}
見てみましょう。
> Pid ! {view}. set => [{d,4},{c,3},{b,2},{a,9}]
はい。値が変更されました。
今度は新しいキーwaoとその値8を送ってみましょう。
> Pid ! {set,wao,8}. {set,wao,8}
見てみましょう。
> Pid ! {view}. set => [{wao,8},{d,4},{c,3},{b,2},{a,9}]
セットされました。
しかし、Erlang、簡単すぎる。 これはマルチコア時代のBASICか。 それかSmalltalk(80ではなく、アランケイ先生が本当に好きとおっしゃる初期のやつ) にも、似ている感じがする。
もっとも、これから探っていくので、まだほんとにはわからないな。
Shibuya.lispテクニカルトーク#2視聴を終えて ― 2009/02/28 21:11
非常に有益で、また刺激を受ける内容でした。
簡単に言うと、「おもちゃのScheme実装から、本物のScheme実装へ」と言ったところでしょうか。
「本物の」と言うのは、処理系として現代において第一線でタメを張れるほどの性能を持った実装という意味です。それはVMを使用したモダンな実装のことなのですが、ご自身のMoshの最新版の実装を元に説明されました。
トーク冒頭、参加者に対し、LispまたはScheme処理系の実装経験がある方の挙手を求めて、およそ1/3程度挙手があったようです。80名ほど参加だから、つまり25~30人ほどが経験ありということになりますが、しかし恐らくはこの中で「本物の」処理系の実装まで行った方となると、また数はぐっと減ることと思います。
氏のやさしいところは、今日のテクニカルトークは、モダンなLispまたはScheme処理系を作成するために、氏自身の経験を惜しまず披露し、聞くものに道すじを示し、その入り口まで後押ししてくれる内容だったことです。
当方も、3impの存在は、それを知っただけでも収穫でした。
(でもこの論文も、1987年に書かれているのですね。)
氏の実行力というか、壁を突破する能力というのは、感銘するというか、見習いたい限りです。
最近のコメント