erlang

RESTfull な I/F を持つストレージを作った

yaws 調査の為、試しに RESTfull な I/F を持つストレージを作ってみたので晒してみる。 インストール % svn co http://labs.miu.vc/svn/cooldaemon/erl/ssd/trunk/ ssd % cd ssd % makemake を実行する前に、Makefile 内の yaws のインストール先を編集する…

embedded モードで appmods 使う

Yaws を embedded モードで動かす為のメモ(適当) appmods で使う為のモジュール 適当に、arg を出力するモジュールを準備する。 -module(put_arg). -author('cooldaemon@gmail.com'). -include("/path/to/yaws/include/yaws_api.hrl"). -export([out/1]). ou…

リスト内のタプルのキーが重複する場合の lists:filter/2 と list:keysearch/3 の速度比較

yaws で遊んでいたのですが、GET で a=b&a=c みたいな引数を渡すと yaws_api:parse_query(Arg) を実行した際の戻り値が [{"a","b"}, {"a","c"}] となるので、リスト内のタプルのキーが重複する場合は、どうやったら素早くタプルを取り出せるのかなぁと思い、…

Common Test

まだ、解らない事だらけだが、使い始める所まで辿り着いたのでメモを残す。 run_test コマンドの準備 run_test とは、名前の通り、テストを実行してくれるコマンドで、実際は、erl コマンドを実行するシェルスクリプト。 作業は、Common Test がインストール…

ports の erlang が R12B-0 になった

うれしい。

gen_event

イベント発生時の処理を管理する為のモジュール。 管理プロセスに、予め処理を 0〜複数個 登録しておくと、イベント発生時に実行してくれる。 管理プロセスの起動 1> gen_event:start_link({local, event_hoge}). {ok,<0.33.0>} これで、event_hoge という名…

Mnesia で作った memcached もどきにレプリケーション機能とディスク保存機能を追加した

まだ中途半端だが、晒してみる。 突っ込み大歓迎。 source http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/ インストール % cd /path/to % svn co http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/ yamd % cd yamd % makeFreeBSD なら make のかわり…

erlang 用の辞書ファイルと snippets ファイル

こそこそ使ってたのを commit したので公開。 辞書 snippets(snippetsEmu.vim が必要) それは使い難いから、こーした方が良いとか、突っ込み大歓迎。

lists:map/2 のかわりにリスト内包表記を使う

これと・・・ lists:map(fun (X) -> X*2 end, lists:seq(1, 10)). これは・・・ [fun (X) -> X*2 end(X) || X <- lists:seq(1, 10)]. 同じ結果になる。下記のような適当な実行時間を計測する module を作って・・・ -module(bench). -export([mark/1]). mark…

supervisor の simple_one_for_one を使って echoserver を書き直した

gen_tcp の練習で書いた id:cooldaemon:20070614:1181827975 を gen_server 化しようと考えたが、gen_tcp モジュールの accept や recv は処理をブロックするので、gen_server 化を諦めて id:cooldaemon:20070717:1184676090 のように proc_lib を使ってお茶…

Dynamic Code Loading

某所で apache に負荷をかける為に erlang を使おうとして、知らずに http module を上書きしててハマったという書き込みをみて、Programming Erlang の APPENDIX E. Dynamic Code Loading の内容を思い出したので紹介。まず、下記の source code を準備。 -…

config ファイルの楽な読み込み方 その2

id:cooldaemon:20071013:1192285916 で application を使った場合にのみ使える限定的な方法を書いたが、もっと簡単な方法を見つけたので紹介。 % cat ./test.config {test1, foo, bar}. [test2, {foo, 1}, {bar, 2}]. test3. % erl 1> file:consult("./test.…

Mnesia を起動した後、schema を local node の ram に配置するなら mnesia:create_schema/1 は不要だった

今まで(id:cooldaemon:20070919:1190169198 とか)、下記の source のように Mnesia を起動した後に mnesia:create_schema/1 を実行していたのですが… start() -> mnesia:start(), mnesia:create_schema([node()]), mnesia:create_table(store, [{attributes,…

erl コマンドにユーザ定義のオプションを渡す

id:cooldaemon:20071013:1192285916 を書く際、 man erl を読んでいたら、erl コマンドにユーザ定義のオプションを渡す方法が書かれていたのでメモを残す。(これ常識なんだろうなぁ) % erl -flag1 value1 -flag2 value2 value3 1> init:get_arguments(). […

config ファイルの楽な読み込み方(application を使う場合、限定)

erlang 付属の httpd や yaws 等は、設定ファイルを自力で開き、読み込み、値を確認して…とやっている。 何か楽をできる良い方法は無いものか?と思い調べたらあったのでメモを残す。erl コマンドには便利な -config オプションがある。 % erl -config test…

Mnesia で永続化したテーブルに関数を入れ、全ノード停止後に再起動し、別ノードで実行したら動いた(まー、動いて当たり前ですけど)

id:cooldaemon:20071011:1192094209 で Mnesia 上のテーブルをディスクに保存しましたが、そのテーブルに関数を入れて遊んでみました。前回作ったノード a を再起動し、io:fwrite/2 を保存する。 % erlang -sname a (a@imac)1> mnesia_test:restart(). ok (a…

Mnesia に保存されたデータを永続化する(後からノードを追加しても大丈夫)

id:cooldaemon:20070919 で書いた Mnesia のレプリケーションの記事で、id:Hamano 氏からコメントで 便利ですよねー、mnesia のレプリケーション。 でも最近悩んでいるのが ram_copies ram_copies と disc_copies ram_copies は2つ目を後から起動しても上手…

ある module に含まれた _test が関数名末尾に付く関数の一覧を取得する

メソッド名一覧の表示 どう書く?org リフレクション系のお題の続編です。「ある与えられたオブジェクトtargetのメソッドのうち、 "test_"で始まるものをすべて呼びだす」というコードを書いてください。引数に関しては都合のいいように仮定して構いません(…

mnesia:select と qlc:q の lock はテーブル丸ごと

ロック状態がどうなっているか気になったので、いろいろコード書いて試したところ、テーブル単位でロックが掛かっていた…。 レコード毎にロックできないもんだろうか? ちなみに、トランザクション内で qlc:q を使って QueryHandle を作ると read lock にな…

Mnesia のレプリケーションを試す

Mnesia のレプリケーションをいろいろ試してみたのでメモ。まずは、下記を mnesia_test.erl というファイル名で保存して、コンパイルする。 -module(mnesia_test). -include_lib("stdlib/include/qlc.hrl"). -record(store, {key, value}). -export([start/0…

エラーログ管理(sasl、error_logger、rb)

erlang でエラーログを管理する方法を調べたのでメモ。まず、sasl の設定ファイルを作成。適当に elog.config として保存する。 [{sasl, [ {sasl_error_logger, false}, {errlog_type, error}, {error_logger_mf_dir, "/path/to/logs"}, {error_logger_mf_ma…

erlang でテストファースト

先日、erlang でテストを書くモジュールは無いのか?(id:cooldaemon:20070910:1189392523)と書いたところ、jijixi's diary - ユニットテストフレームワーク , 契約プログラミング , ほにほにネタ数点で eunit を教えて頂いたので、早速使ってみた。 インスト…

erlang でテストの自動化ってどうやるのだろうか?

memcached の代替えを作った際、Mnesia の I/F と TCP の I/F を分けて作ったので、割とテストは楽なのだが・・・手動では、やってらんないなーと思った。 そこで、yaws ではどうやっているのだろうかと思ったら、そんな事はやってなかった orz (勘違いだと…

Erlang(Mnesia) で memcached (互換なし)を作ってみました

DSAS開発者の部屋:Erlang で memcached を作ってみました。 触発されました。で、家族サービスを一日サボって作りました。嫁と子供達に感謝!http://labs.miu.vc/svn/cooldaemon/erl/yamd/trunk/ memcached との違い プロトコル(w; validation が抜けまく…

erlang shell を background で実行(erlang で書いたサーバを常駐させる)

id:cooldaemon:20070717:1184676090 で作った echoserver を常駐させる方法を調べた。 erl -sname echoserver3 -s echoserver3 start_link -detachedコマンドで上記を実行するだけ。 -sname オプションで名前を付けているので、停止する場合は、これを使う。…

application

id:cooldaemon:20070717 で作った supervisor を application から操作できるようにしてみる。 .app ファイルを準備 test と言う名前の application にするので、test.app を作成する。 内容は下記の通り。 {application, test, [{description, "test applic…

vim の erlang 用辞書ファイルを Web::Scraper で作る

やっつけだけど動く。Web::Scraper 便利すぎ! #!/usr/bin/env perl use strict; use warnings; use List::MoreUtils qw(uniq); use URI; use Web::Scraper; my $scraper = scraper { process '//html/body/p/table/tr/td[3]/a', 'functions[]' => 'text'; r…

proc_lib で echoserver を書き直した

gen_server、supervisor、proc_lib の三つを押さえれば、httpd.erl の起動と停止の動作を理解する事が可能。 って事で、以前 みかログ: Erlang で echo server こちらで添削して頂いた id:cooldaemon:20070614 を proc_lib で書き直してみた。 -module(echos…

supervisor

仕事が落ち着いたので、erlang 勉強再開。 id:cooldaemon:20070625 と id:cooldaemon:20070630 で作った server を supervisor tree に入れてみた。 -module(sup). -behaviour(supervisor). -export([start_link/1, stop/0]). -export([init/1, worker_spec/…

gen_fsm

httpd の source を見てたら Supervisor Behaviour を使っていて…Supervisor Behaviour を読んでいたら、supervision tree の考え方と実装方法を理解しなきゃ駄目っぽい気がしたので、OTP Design Principles の Overview に目を通してみた。で、以前、gen_se…