drkcore

2012/01/06 20:23:39

Linuxネットワークプログラミングバイブルを買った

UNIXネットワークプログラミング入門ルーター自作でわかるパケットの流れを読んで、pollとかepollとかlibeventの使い方を覚えたいなぁと思ったらLinuxネットワークプログラミングバイブルってのを見つけた。

というか、ルーター自作でわかるパケットの流れの著者とソケットプログラミングを調べていたときに見つけたブログの著者の共著だったので、即買いした。

ProductName Linuxネットワークプログラミングバイブル
小俣 光之
秀和システム / 3990円 ( 2011-01 )


小さいけどきちんと動くコードがたくさん載ってて、プログラムはコードで語れという匂いが感じられるのは個人的にはありがたい。8章まで読んだけどわかりやすくて良かった。特に5章の多重化の章はボリュームがあってselect,poll,epollにマルチプロセス、マルチスレッド、ノンブロッキングI/Oのコードが一通り揃っていて知りたいことは全部入ってた。

まだ流し読みしただけで写経はしてないが、Cのネットワークプログラミングはここまでおさえておけば自分的には満足だなぁという感じなので、いい本ゲットしたなぁと思った。

2011/12/27 20:07:39

プログラムからデータリンク層を扱う

Unixネットワークプログラミング入門でTCPとUDPをあつかったので、その勢いでデータリンク層をあつかってみます。

ProductName ルーター自作でわかるパケットの流れ
小俣 光之
技術評論社 / 1974円 ( 2011-07-09 )


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

UNIXネットワークプログラミング入門

Nodeを触っているのは楽しいんだけど、じゃぁなんか作りたいものがあるのかと言われたらイマイチ思い浮かばない。リアルタイムウェブ〜とか言っておいて(言ってないけど)アイデアが浮かばないってのはまずかろうとソケットプログラミングの本を読んでみることにした。

ソケットプログラミングを覚えるにはいい本だった。サンプルはCで書いてあるんだけど、システムコールとかの低レベルのモジュールはPerlもPythonもほとんど一緒なので、動きがイメージできるようになって良い感じ。本を読み終えたついでにSocketServerのソースコード読んでみたけど、理解度がさらにあがった。

ProductName UNIXネットワークプログラミング入門
雪田 修一
技術評論社 / ?円 ( 2003-06-05 )


本の内容は、

  1. 一対一通信
  2. 一対一非同期通信
  3. 一対多通信
  4. 一対多非同期通信

非同期は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ネットワークプログラミング欲しいなぁ

ProductName UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
W.リチャード スティーヴンス
ピアソンエデュケーション / 8400円 ( 1999-07 )


おまけ(なんか考えた)

今度静岡でおまちバルがあるように、静岡はバルブーム、バルバブル、バブルボブル。で、バルイベントにはハッシュタグとtwitterでつぶやいて盛り上がろう的な今時なソーシャルな仕掛けも一緒についてくるんだけど、これがまじでつまらない。

ハッシュタグが漢字混じりのひらがなとかあり得ないでしょう。そもそも酒飲むイベントで打たせるか?と。全員がiPhoneに向かってカチャカチャやってるIT系のオフじゃないんだから。あと、飲んでる時にハッシュタグでtweetおいかけるのもめんどくさい。結局送りっぱなしになっちゃうので、だれかがまとめたのを読み返すくらいで、全然リアルタイムじゃないね。

というわけで、バルのtweetシステムに不満があったのでソーシャルでスマホ持ちの我々が使って楽しいシステムを考えてみた。

バルラーにちまちまと端末を打たせないように店の入口に「店なうだらー、ハッシュタグ、ジオコード」が入ったQRコードを貼っとく。これで、カメラで撮るだけでtweetできるようになるので酒が良い感じに入っていてもOK。パンフにつけておいてもいいかも。そっちは宣伝で、人気度調査用にしてもいいかもしれん。

で、サーバー側をリアルタイムウェブで、twitterのストリーム読みながらマップ上にマッピングさせていくと。ジオコードの頻度で明るくするとかでもいいしね。そうすればリアルタイムで楽しい。ユーザーの動向を線でつないでも面白いかも(どういう順番で店をまわってんのかとか)。主催者側にもそういうデータが集まればいろいろ役に立つでしょう。

そういうシステムをNode.jsでつくったら楽しいだろうなぁと思った。

2011/12/13 21:38:07

ネットワーク関連の本を読んでみることにした

最近ちょっとヤル気がおきないので、別のことでもしようとネットワーク関連の本でも読んでみることにした。

ProductName UNIXネットワークプログラミング入門
雪田 修一
技術評論社 / ?円 ( 2003-06-05 )


ProductName ルーター自作でわかるパケットの流れ
小俣 光之
技術評論社 / 1974円 ( 2011-07-09 )


そういえばRWHにもSocket通信の章があったので後で読みなおしてみるか。

ProductName Real World Haskell
Bryan O'Sullivan
Oreilly & Associates Inc / 4058円 ( 2008-12-05 )


2011/09/22 20:25:40

「はじめて読む486」を読んでいる

Linuxカーネル2.6解読室の流れで読み始めた。

ProductName はじめて読む486―32ビットコンピュータをやさしく語る
蒲地 輝尚
アスキー / 2548円 ( 1994-09 )


Linuxも色々勉強しておかないといけない。

ProductName Linuxカーネル2.6解読室
高橋浩和
ソフトバンククリエイティブ / 5670円 ( 2006-11-18 )


そしてこれはまだ読んでいない、積んである。

2011/07/13 21:06:21

「Linuxカーネル Hacks」予約した

そういう風が吹いているということで

  • 1章 カーネル入門
  • 2章 リソース管理
  • 3章 ファイルシステム
  • 4章 ネットワーク
  • 5章 仮想化
  • 6章 省電力
  • 7章 デバッグ
  • 8章 プロファイリング、トレース

2011/06/11 14:19:39

USBメモリでraid0

先日の静岡インフラ部でZFSのホットスワップを見た。

面白かったのでやってみた。ちなみに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位のサイズのファイルが見える

1307768420

データを書きこんでみる。yesコマンドで無限y攻撃

yes > /tmp/raid/y.txt

1307768423

それぞれのメモリが点滅しているのできちんと書きこまれていることが分かる。そして、それぞれのメモリのロゴを見ることで貰い物のガジェットであることがわかる。

参考

2011/04/05 05:39:21

KVM徹底入門が面白い

さくらのVPSで採用されているというKVMに興味を持ったので書籍を探してみたら、これがヒットしたので早速購入して読んでみた。

ProductName KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド
平 初
翔泳社 / 3444円 ( 2010-07-08 )


ちなみに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

実用SSH

今週からさくらのVPSを使い始めた。

sshをきちんと使えなきゃなということで数年前に買って積んでいたこの本をじっくり読んだら、大変勉強になったというかちゃんと読んでよかった。

7章のクライアント使用法 応用編が役に立った。

特にscpは非常に便利で使い方覚えたらこればっか使うようになってしまい、Cyberduck立ち上げなくなった。

ProductName 実用SSH 第2版―セキュアシェル徹底活用ガイド
Daniel J. Barrett
オライリー・ジャパン / 5040円 ( 2006-11-22 )


  • OpenSSHでパスフレーズの変更は-pオプション
  • SFTPとFTPはプロトコル上の互換性はない
  • OpenSSHでは-Tオプションでptyを割り当てない
  • <ESC> .でSSHセッションの終了
  • scpでディレクトリの再帰的コピーは-rオプション
  • sshでトラブったら-vで冗長モードにする
  • scpのポート指定オプションは-P
  • scpの-Cでデータ圧縮して転送

2011/03/14 21:36:28

linuxのatコマンド

うちは輪番停電の第5グループなので、明日は正午に停電が起こるわけだ。

そのタイミングで自宅サーバーも落としておきたいがcronだと毎日同じ時間に設定されるし、毎度毎度変更するのも面倒くさい。

そういう時にはatを使えばいいらしい。

echo "shutdown -h now" | at 11:50 3/15/2011

なにげにatを使うのは初めてだな。

ProductName プロのための Linuxシステム構築・運用技術 (Software Design plus)
中井 悦司
技術評論社 / 3024円 ( 2010-12-22 )


というわけで、このブログは第5グループの停電に応じてアクセスできなくなることが判明した。