2012/01/06 20:23:39
UNIXネットワークプログラミング入門 とルーター自作でわかるパケットの流れ を読んで、pollとかepollとかlibeventの使い方を覚えたいなぁと思ったらLinuxネットワークプログラミングバイブルってのを見つけた。
というか、ルーター自作でわかるパケットの流れの著者とソケットプログラミングを調べていたときに見つけたブログの著者の共著だったので、即買いした。
小さいけどきちんと動くコードがたくさん載ってて、プログラムはコードで語れ という匂いが感じられるのは個人的にはありがたい。8章まで読んだけどわかりやすくて良かった。特に5章の多重化の章はボリュームがあってselect,poll,epollにマルチプロセス、マルチスレッド、ノンブロッキングI/Oのコードが一通り揃っていて知りたいことは全部入ってた。
まだ流し読みしただけで写経はしてないが、Cのネットワークプログラミングはここまでおさえておけば自分的には満足だなぁという感じなので、いい本ゲットしたなぁと思った。
2011/12/27 20:07:39
Unixネットワークプログラミング入門でTCPとUDP をあつかったので、その勢いでデータリンク層をあつかってみます。
2章は基本。
TCP,UDPと同じようにsocketを使えばいい
soc = socket ( PF_PACKET , SOCK_RAW , htons ( ETH_P_IP )))
ちなみにTCPの場合はこんな感じ
soc = socket ( AF_INET , SOCK_STREAM , 0 ))
続いてbind
sa . sll_family = PF_PACKET ;
sa . sll_protocol = htons ( ETH_P_IP );
sa . sll_ifindex = ifreq . ifr_ifindex ;
bind ( soc ,( struct sockaddr * ) & sa , sizeof ( sa ))
と、socをインターフェースに関連付ける
TCPの場合もbindでアドレスとポートに結びつける
me . sin_family = AF_INET ;
me . sin_addr . s_addr = htonl ( INADDR_ANY );
me . sin_port = htons ( port );
bind ( soc_waiting , ( struct sockaddr * ) & me , sizeof ( me ))
まだ2章までしか読んでいないが、3章でパケットキャプチャ、4章でブリッジ、5章でルータを書いていくという流れになっていて、楽しみ。
ちなみに初心者向けではなくて、著者の暗黙の前提のあたりは説明がさくっと省かれている。 Unixネットワークプログラミング入門を読んでなかったら速攻挫折してたと思う。
ちなみにサンプルコードはmacでは動かない。
2011/12/23 17:11:31
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でつくったら楽しいだろうなぁと思った。
2011/12/13 21:38:07
最近ちょっとヤル気がおきないので、別のことでもしようとネットワーク関連の本でも読んでみることにした。
そういえばRWHにもSocket通信の章があったので後で読みなおしてみるか。
2011/09/22 20:25:40
Linuxカーネル2.6解読室の流れで読み始めた。
Linuxも色々勉強しておかないといけない。
そしてこれはまだ読んでいない、積んである。
2011/07/13 21:06:21
そういう風が吹いているということで
1章 カーネル入門
2章 リソース管理
3章 ファイルシステム
4章 ネットワーク
5章 仮想化
6章 省電力
7章 デバッグ
8章 プロファイリング、トレース
2011/06/11 14:19:39
先日の静岡インフラ部でZFSのホットスワップを見た。
VIDEO
面白かったのでやってみた。ちなみにZFSではないので単にraid0の構築です。
貰ったUSBハブとUSBメモリをかき集めたので、128M, 256M, 2G, 8Gという中途半端なサイズ。
fdisk /dev/sda # typeはfd
fdisk /dev/sdb # typeはfd
fdisk /dev/sdc # typeはfd
fdisk /dev/sdd # typeはfd
mdadm -C -v /dev/md0 -l0 -n4 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
mkfs -j /dev/md0
mkdir /tmp/raid
mount /dev/md0 /tmp/raid
これで10G位のサイズのファイルが見える
データを書きこんでみる。yesコマンドで無限y攻撃
それぞれのメモリが点滅しているのできちんと書きこまれていることが分かる。そして、それぞれのメモリのロゴを見ることで貰い物のガジェットであることがわかる。
参考
2011/04/05 05:39:21
さくらのVPSで採用されているというKVMに興味を持ったので書籍を探してみたら、これがヒットしたので早速購入して読んでみた。
ちなみにKVMとは
第1回 Linux標準の仮想化技術「KVM」の仕組み
KVMは、Linux Kernel自体をハイパーバイザとする仕組みで、正式名称を「Kernel-based Virtual Machine」といいます。KVMは現時点では、Intel VT-xやAMD-VといったCPUの仮想化支援機能を必要とし、完全仮想化によりOSの仮想化環境を提供します。
本書の内容は、仮想化全般の基礎知識から、インストール、導入まで。あとはコマンドのちょっとしたリファレンスが付いてくる感じ。Amazonのレビューにある通りひと通り試したことある人には物足りない内容かも知れないが、予備知識無しでKVMが知りたいのならば手軽に読めてよいと思う。
僕の場合にはこういう 内容が知りたかったのだけど、ライブマイグレーションの話題しか触れてなかったのでそこはちょっと残念だったかな。
自分の職場はサーバー管理のスキルのない人間が管理者をヤラざるを得ず、ハードウェアを移行するたびに、(昔作ったサービスが移行できずに)サーバー環境が劣化していくという結構悲惨な状況だったりするわけだ。そもそもサーバー管理自体が本来の仕事と関係なくて片手間なのでしょうがなかったりするので、仮想化しとけばさくっと移行できて、ハードウェア移行の際のコスト減らせるかなぁという期待感からKVMに興味を持ったのだ。
特に7章でPythonとlibvirtを使ったプログラミングの例が出ているようにPythonを利用して色々できそうなので、サーバー管理の省力化に貢献しそうな気はするんだよなぁ。
仮想マシンの導入には複数の方法がある
ホストから見た場合、VCPUはQEMUが立ち上げるスレッドに対応する。
実CPUの数を超えてVCPUを割り当てることも可能だが、あまり意味はない
HugePageの利用シーンは?
virtio-balloonでメモリの確保と開放
live migration
ネットワークの設定の仕方は主に2つある
libvirtdでのプログラミング
2011/03/27 14:06:17
今週からさくらのVPSを使い始めた。
sshをきちんと使えなきゃなということで数年前に買って積んでいたこの本をじっくり読んだら、大変勉強になったというかちゃんと読んでよかった。
7章のクライアント使用法 応用編が役に立った。
特にscpは非常に便利で使い方覚えたらこればっか使うようになってしまい、Cyberduck立ち上げなくなった。
OpenSSHでパスフレーズの変更は-pオプション
SFTPとFTPはプロトコル上の互換性はない
OpenSSHでは-Tオプションでptyを割り当てない
<ESC> .でSSHセッションの終了
scpでディレクトリの再帰的コピーは-rオプション
sshでトラブったら-vで冗長モードにする
scpのポート指定オプションは-P
scpの-Cでデータ圧縮して転送
2011/03/14 21:36:28
うちは輪番停電の第5グループなので、明日は正午に停電が起こるわけだ。
そのタイミングで自宅サーバーも落としておきたいがcronだと毎日同じ時間に設定されるし、毎度毎度変更するのも面倒くさい。
そういう時にはatを使えばいいらしい。
echo "shutdown - h now " | at 11: 50 3/ 15/ 2011
なにげにatを使うのは初めてだな。
というわけで、このブログは第5グループの停電に応じてアクセスできなくなることが判明した。