突発erlang(えらアッー!んぐ)オンライン勉強会に参加した。

http://d.hatena.ne.jp/daiki41ti/20090403/p2
id:daiki41tiが主催してた奴です。erlangの勉強会だそうです。
環境はすでに整っていたので(port使った)、12:30から参加。
最初のほうはgdgdでしたが、だんだんまじめになってきました。
まあでも後半またネタ切れしたんで、(並列処理の説明終わった後)またgdgdになりましたがね。。
つきたときには「俺空気\(^o^)/」「続・俺空気\(^o^)/」「The 空気 3nd season」とかでした。

作ったものまとめ

「フィボナッチ数」を順番に求めるerlang

処女作です。

-module(fib).
-export([f/1,f/4]).
f(N) -> io:put_chars("1\n1\n"),f(1,1,1,N).
f(E,F,X,N) -> 
if X > -1 -> io:put_chars(integer_to_list(E + F)),
	 io:put_chars("\n"),
	 if 	X /= N -> f(F,E+F,X+1,N);
				true -> ok
	 end;
	 true -> ok
end.

fib.erlで保存してね。
使い方
c(fib).
として
fib:f(もとめる個数).
で順番に出力してくれます。
もとめる個数は1,1,2,3の2からカウントが始まりますので、2,3にしたければ2と渡してください。

超簡易HTTPサーバ

これは完全に一人で書いてました。id:daiki41tiサボってやらないので。
本当は時刻出力までいきたかったけどうまく行かないので、(判断部分でマッチすらしてないとみた)
その前のソース。

-module(httpd).
-export([start/0,start/1,handle_connection/1,recv_loop/1]).

start() -> {ok, ListenSocket} = gen_tcp:listen(8080,[{active, false}, binary, {packet, line}, {reuseaddr, true}]),accept(ListenSocket).
start(P) -> {ok, ListenSocket} = gen_tcp:listen(P,[{active, false}, binary, {packet, line}, {reuseaddr, true}]),accept(ListenSocket).

accept(ListenSocket) ->
  {ok, Socket} = gen_tcp:accept(ListenSocket),
  spawn(?MODULE, handle_connection, [Socket]),
  accept(ListenSocket).

handle_connection(Socket) ->
	recv_loop(Socket).

recv_loop(Socket) ->
  case gen_tcp:recv(Socket, 0) of
    {ok, B} ->
      case B of
        <<"GET / HTTP/1.0\r\n">> ->
gen_tcp:send(Socket, <<"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nServer: ErLangDesugaNanikaMonkuAru?/MakedByErLang\r\nConnection: close\r\n\r\n">>),gen_tcp:send(Socket, <<"\r\n<h1>Hello, erlang</h1>\r\n\r\n">>),gen_tcp:close(Socket);
        <<"GET / HTTP/1.1\r\n">> ->
gen_tcp:send(Socket, <<"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nServer: ErLangDesugaNanikaMonkuAru?/MakedByErLang\r\nConnection: close\r\n\r\n">>),gen_tcp:send(Socket, <<"\r\n<h1>Hello, erlang</h1>\r\n\r\n">>),gen_tcp:close(Socket);

        _ ->
          recv_loop(Socket)
      end;
    {error, closed} ->
      ok
  end.

httpd.erlで保存してねー。
使い方
c(httpd).
とし
httpd:start([port = 8080]).
でスタートします。引数にポート番号を。省略すると8080になります。
/以外にアクセスしたときの例外処理ないです。
/にアクセスしたときだけ作動します。
ライセンス
これだけはライセンスつけておきます。
Creative Commons License
この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。

感想

またこれやりたいですね!
第二回楽しみにしています。
いつかOnline.sgでもこれやれたらいいなあ。