Nodeを触っているのは楽しいんだけど、じゃぁなんか作りたいものがあるのかと言われたらイマイチ思い浮かばない。リアルタイムウェブ〜とか言っておいて(言ってないけど)アイデアが浮かばないってのはまずかろうとソケットプログラミングの本を読んでみることにした。
ソケットプログラミングを覚えるにはいい本だった。サンプルはCで書いてあるんだけど、システムコールとかの低レベルのモジュールはPerlもPythonもほとんど一緒なので、動きがイメージできるようになって良い感じ。本を読み終えたついでにSocketServerのソースコード読んでみたけど、理解度がさらにあがった。
本の内容は、
- 一対一通信
- 一対一非同期通信
- 一対多通信
- 一対多非同期通信
非同期はselect使っています。8章でデーモンの入門の章だったんだけど、なんでforkを二回するのかわかりやすい説明ではなかったので、ここを読むといいですね。
3章のチャットっぽいものをPythonとPerlで書いてみた
server
import socket host = socket.gethostbyname('localhost') port = 50000 soc_waiting = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc_waiting.bind((host, port)) soc_waiting.listen(1) print "server running at %d\n" % port (soc, client_addr) = soc_waiting.accept() soc_waiting.close() print "Go ahead!" msg = "" while True: msg = raw_input() soc.send(msg) msg = soc.recv(512) print msg if msg == "quit": break soc.close()
Client (Python)
import socket host = socket.gethostbyname('localhost') port = 50000 soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.connect((host,port)) print "Wait\n" while True: msg = soc.recv(512) print msg msg = raw_input() soc.send(msg) if msg == "quit": break soc.close()
Client (Perl)
#!/usr/bin/env perl use IO::Socket; $soc = new IO::Socket::INET("localhost:50000"); die "IO::Socket : $!" unless $soc; print "Wait\n"; my $msg; while (1) { $soc->recv($msg, 512); print $msg,"\n"; $msg = <STDIN>; chomp($msg); $soc->send($msg,512); last if $msg eq "quit"; } close($soc);
Unixネットワークプログラミング欲しいなぁ
おまけ(なんか考えた)
今度静岡でおまちバルがあるように、静岡はバルブーム、バルバブル、バブルボブル。で、バルイベントにはハッシュタグとtwitterでつぶやいて盛り上がろう的な今時なソーシャルな仕掛けも一緒についてくるんだけど、これがまじでつまらない。
ハッシュタグが漢字混じりのひらがなとかあり得ないでしょう。そもそも酒飲むイベントで打たせるか?と。全員がiPhoneに向かってカチャカチャやってるIT系のオフじゃないんだから。あと、飲んでる時にハッシュタグでtweetおいかけるのもめんどくさい。結局送りっぱなしになっちゃうので、だれかがまとめたのを読み返すくらいで、全然リアルタイムじゃないね。
というわけで、バルのtweetシステムに不満があったのでソーシャルでスマホ持ちの我々が使って楽しいシステムを考えてみた。
バルラーにちまちまと端末を打たせないように店の入口に「店なうだらー、ハッシュタグ、ジオコード」が入ったQRコードを貼っとく。これで、カメラで撮るだけでtweetできるようになるので酒が良い感じに入っていてもOK。パンフにつけておいてもいいかも。そっちは宣伝で、人気度調査用にしてもいいかもしれん。
で、サーバー側をリアルタイムウェブで、twitterのストリーム読みながらマップ上にマッピングさせていくと。ジオコードの頻度で明るくするとかでもいいしね。そうすればリアルタイムで楽しい。ユーザーの動向を線でつないでも面白いかも(どういう順番で店をまわってんのかとか)。主催者側にもそういうデータが集まればいろいろ役に立つでしょう。
そういうシステムをNode.jsでつくったら楽しいだろうなぁと思った。