2009年10月20日

Mnesiaでテーブル構造を変えたときは

Erlangの標準データベース管理システム「Mnesia」は-recordからテーブル構造をつくれたり、保存できるデータもErlangのデータ構造と親和性が高かったりと、非常に便利です。

が、「プログラミングErlang」のMnesiaの説明はちょっとだけ不親切というか、サンプルコードを変更して自分用にいろいろしていくときに肝心な説明が抜けてる。

テーブル構造を変えたときにどう作り直すかが書かれてない。まあ、仕方ないのかもしれないけど、とりあえ初学者はハマると思う。少なくとも自分ははまりました。

対処としてシンプルなのは、ノードが保存している古い情報をクリアしてテーブル構造の構築からやりなおさせるという手順。

mnesia:stop(), mnesia:delete_schema([node()]).

です。

これであらためてdo_this_once()←サンプルにあるデーブル初期化コードから実行すれば、あたらしいテーブル構造が使えるようになります。

たぶんdelete_schemaではなくテーブル単位での消去もあると思うけど、とりあえず自分のメモもかねてこれを記録しておきます、はい。
posted by へろ at 00:33| Comment(46) | TrackBack(0) | Erlang

2009年10月17日

アンサー:ErlangとYawsを使ったRESTfulなサービス@InfoQ

RESTfulな形でオンラインゲームサーバーを構築しようと考えていて、検索したら出てきたのがこの記事。

ErlangとYawsを使ったRESTfulなサービス@InfoQ

これを読みながら「ほうほう、yawsにはout/1以外にもout/3なんていうつなぎ方があるのか。それなら勝ったも同然だな」と思ったのですが、記事にある関数宣言に従ったモジュールをyawsにくわせても、ちーっとも動かない。

で。しばらく考えて気がついた。

InfoQさんの記事は「out/3を自分で作るとRESTfulが作りやすくなるぜ」という意味だったのです。。。。

というわけで、とりあえずout/3を書いてみました。ちょろっと書くだけでmod_rewriteでごりごりやるようなRESTfulな処理が動くのはすごい便利。Yawsはぜひ使いこなしたいですね。




-module(sample_for_restful).
-include("/opt/local/lib/yaws/include/yaws_api.hrl").
-compile(export_all).

%% dispacher for RESTful service
out(A) ->
{http_request, Req, _params, _unknown} = A#arg.req,
Uri = yaws_api:request_url(A),
Path = string:tokens(Uri#url.path, "/"),
out(A, Req, Path).

%% sample for "GET http://localhost:8001/project/x/entities/123456"
out(A, 'GET', ["project", Project, "entities", EntityId]) ->
{ehtml,
[{p,[],
box(io_lib:format("GET for ~p~n"
"EntityId = ~p~n",
[Project,
EntityId]))}]};

%% sample for "catch all" handler.
out(A, _Method, _Params) ->
{ehtml,
[{p,[],
box(io_lib:format("general handler: A#arg.appmoddata = ~p~n"
"A#arg.appmod_prepath = ~p~n"
"A#arg.querydata = ~p~n",
[A#arg.appmoddata,
A#arg.appmod_prepath,
A#arg.querydata]))}]}.

%% utitity function in original sample.
box(Str) ->
{'div',[{class,"box"}],
{pre,[],Str}}.





このときのyaws.confはこんな感じ


<server erlangtestserver>
port = 8001
listen = 0.0.0.0
docroot = /somewhere/public_html
appmods = </project, sample_for_restful>
</server>

posted by へろ at 22:58| Comment(1) | TrackBack(0) | Erlang

2008年06月22日

iconvはCとの通信で動くのか

ErlangとPerlの速度比較(みかログ)
によると、

Cのモジュールと通信してデータをやりとりする仕様だけれど, C側のモジュールがシングルスレッドで実行されて,そのモジュールとの通信を奪い合うのが原因?なのかなぁ.


だそうだ。とはいえ、今のところそんなにスピードは求めないからiconvでも十分かな。
posted by へろ at 23:42| Comment(1) | TrackBack(0) | Erlang

あやうく車輪を再発明するところ

Erlangでのコード種別変換、あやうく車輪を再発明するところでしたわ。

CEAN(http://cean.process-one.net/)にiconvというのが上がってて、これをつかえばいいらしい。

そうだよなあ。
posted by へろ at 23:24| Comment(0) | TrackBack(0) | Erlang

Erlangで日本語(コード体系判別 EUC/SJIS)

とりあえずErlangをいろいろいじり始めたけど、日本語対応がまったくない(バイトコードを自分で扱え)ということで、1980年代末期のC言語のよう。

というわけで、ひとまず勉強がてら日本語処理関連のユーティリティコードを書き始めることに。

UTF-8というかUnicodeの扱いが問題なんだよなぁ。。。
※みての通りコード推定が雑なので、実用にはまだまだ使えません、念のため↓

-module(jcode).
-export([check/1]).

is_euc({codepair, C1, C2}) ->
( (C1 >= 16#a1) and (C1 =< 16#fe))
andalso( (C2 >= 16#a1) and (C2 =< 16#fe)).

is_sjis({codepair, C1, C2}) ->
(((C1 >= 16#81) and (C1 =< 16#9F))
orelse ((C1 >= 16#E0) and (C1 =< 16#FE)))
andalso( ((C2 >= 16#40) and (C2 =< 16#7e))
orelse ((C2 >= 16#80) and (C2 =< 16#fc))).

check_pair([A, B | T]) ->
CodeE = is_euc({codepair, A, B}),
CodeS = is_sjis({codepair, A, B}),
if
CodeE == true -> {ok, euc, T} ;
CodeS == true -> {ok, sjis, T} ;
true -> check_pair([B] ++ T)
end;
check_pair([A|T]) -> {ok, ascii, [] };
check_pair([]) -> { ok, ascii, [] }.

check(Source) ->
check_pair(Source).



■補足
Erlangでのコード種別変換、あやうく車輪を再発明するところでしたわ。 → http://blog.dressingroom.jp/article/16282486.html

iconvはCとの通信で動くのか → http://blog.dressingroom.jp/article/16282967.html
posted by へろ at 19:40| Comment(344) | TrackBack(0) | Erlang