火曜日, 12月 12, 2006

実装と理論

実装は何となく出来てきた.
後はコレに,「理論,数式,理論評価,実験評価」が加わると,誰も手出しが出来なくなって,勝ちだゼ!

月曜日, 12月 11, 2006

JavaScriptで高階関数

例:
function higher_order() {
var add = function (x, y) {
return x + y;
}

var sub = function (x, y) {
return x - y;
}

calc(1, 5, add);
calc(7, 6, sub);
}

function calc(x, y, f) {
return f(x, y);
}


これを,XMLHttpRequestで利用。

function getJson(uri, func) {
var req = new XMLHttpRequest();

req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200) {
var linksJson = req.responseText;
var data;

eval("data = " + linksJson);

func(data);
}
}

req.open("GET", uri, true);
req.send(null);
}

function process1() {
var func = function (data) {
// process
}

getJson("hoge.json", func);
}

水曜日, 12月 06, 2006

perl

なんで,perlってやつは,演算子にeqとか 使ってんだよ!
お前はアレか?それで,イクォール(equal)とかでも言いたいのか!?
それに,@_とかキモイ予約語つくんじゃねーよ!
awkを見習え!Pythonを見習え!Rubyを見習いやがれェェェェェ~!!!!

日曜日, 12月 03, 2006

Ajaxで遊ぶ

Ajaxで作った面白サイトを集めてみる
そんで,極めつけはこのスクリプト(元ネタ
javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.images; DIL=DI.length; function A(){for(i=0; i < DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5}R++}setInterval('A()',5); void(0);
  1. ブラウザで,画像のたくさんあるページを開く(例:google image
  2. ブラウザのURLの欄に,上のjavascriptをコピペ
  3. おもむろにリターン!
いや,こりゃすごいですね.

javascriptのデバッガとしては,FireBugがとても優秀なようです.
Firefoxのプラグインとして動くそうですが,ステップ実行や,breakpointの設定,変数のウォッチができる模様.

土曜日, 12月 02, 2006

利用する言語

利用する言語は

Core 部分 : C++
UIへのインターフェース: C++
WEB UI: JavaScript
CLI: Python
データフォーマット: JSON

にしよう.

Javaで無い理由:
Javaは公称値よりも体感が大分遅い
Javaは使うときに不愉快
「Write Once, Run Anyware」とはとても思えない
straceとかで追えない
JVMがおかしいと手出しができない

XMLで無い理由:
Parseがやたら面倒
見難い
JSONに比べて重い
特に優れているとは思えない

Ruby, Perlじゃない理由:
Rubyは遅い
バイトコンパイルして欲しい
RubyもPerlも$を使っているのが嫌
個人的にPythonはCライクでとても見やすい

cvsにtagつけた

tag: p2pati-0-4-rc1

Linuxだとコンパイルが通ってなんとなく動くバージョン.

- MacOS XとNetBSDは未検証
- WEB UIは作成中

次は,WEB UIができあがったらRC2にしてタグ付けようっと.

特に問題ない限り,pthreadはちゃんとjoinしたほうがよさげなことがわかった.

通常の3倍速で近付いてきます!

シャアだ…赤い彗星だ…に,逃げろ〜!!

久々に,Pentium M 2GHzをつんだThink Padを使って,NetBSDのコンパイルをしてみるけれど,VMWareや,Pentium III 1GHzを使ったときとは比べ物にならないくらいの速度でコンパイルしてくれる.
はえ〜
しかし,Atokに比べて,Anthyがとてもお馬鹿なので使いづらい…

というわけで,今からユーザーランドをインストールしてみて,おかしくなったら,Debianに移行しようかな.

金曜日, 12月 01, 2006

Bonjour

BonjourはAppleの開発した,zero configurationによる自動的なIPアドレス設定と,マルチキャストDNSを使ってサービス発見を行うソフトウェアです.
もともとApple Talkが実現していたことを,IPを使って実現します.

- AppleのBonjour紹介ページ
- Apple Developer Connectioのページ

このソフトウェアは,OpenSourceソフトウェアとしてソースコードが公開されており,Apache Lisenseで提供されています.

Bonjourは,基本的にローカルリンク上でしか動かないわけですが,MacOS 10.4からDynamic DNSを使って,違うSubnet間でも利用できるようになっています.
しかしながら,これは,せっかく,DNSサーバを利用せずにサービスを発見できるという利点を無くしてしまっています.
これはとても,勿体ない,というわけなんです.

mDNSResponder-107.6
サンプル ResQuerySample

デモンストレーション用のWEB UIを作ったら,DNS機能と,mDNSをいじっていこうと思うわけです

火曜日, 11月 28, 2006

使いやすいOS (Distribution)

最近使ったOSで,大勢に使いやすいOSはこんな感じだと思う
1. MacOS X
2. Windows XP
3. Ubuntu
4. Fedora 6 or SuSE
6. Debian
7. FreeBSD
8. NetBSD
9. gentoo or OpenBSD
11. Solaris

個人的に使いやすいOSはこんな感じ
1. MacOS X
2. Debian
3. NetBSD
4. Ubuntu
5. Windows XP
6. SuSE
7. Fedora 6 or FreeBSD
9. OpenBSD or gentoo
11. Solaris

Appleはユーザのことを良くわかっていると感じる.
Microsoftも実は結構良くわかっているが,センスが無い.
Sunは全くわかっていない.最悪.
BSD系,Debian系は,自分たちの路線をしっかり持っている感じ.
Fedora 6, SuSEはどっちつかず.

月曜日, 11月 27, 2006

暗号化の速度

次は暗号化の速度を計算.
計測マシンは,CPU: PentiumIII 933MHz x 2, Memory: 1GB, OS: Debian etch / Linux 2.6
測定するのは,AES 128bit CBCモード,AES 256bit CBCモード,sha1
% openssl speed aes-128-cbc aes-256-cbc sha1
Doing sha1 for 3s on 16 size blocks: 1030353 sha1's in 3.00s
Doing sha1 for 3s on 64 size blocks: 824617 sha1's in 3.01s
Doing sha1 for 3s on 256 size blocks: 500991 sha1's in 3.00s
Doing sha1 for 3s on 1024 size blocks: 194812 sha1's in 3.00s
Doing sha1 for 3s on 8192 size blocks: 29062 sha1's in 3.00s
Doing aes-128 cbc for 3s on 16 size blocks: 3020029 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 64 size blocks: 1348323 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 256 size blocks: 419475 aes-128 cbc's in 3.01s
Doing aes-128 cbc for 3s on 1024 size blocks: 111829 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 8192 size blocks: 14270 aes-128 cbc's in 3.00s
Doing aes-256 cbc for 3s on 16 size blocks: 2647977 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 1078655 aes-256 cbc's in 3.01s
Doing aes-256 cbc for 3s on 256 size blocks: 319714 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 83899 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 8192 size blocks: 10642 aes-256 cbc's in 3.00s
OpenSSL 0.9.8c 05 Sep 2006
built on: Mon Oct 2 16:47:57 UTC 2006
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long)
aes(partial) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT
-DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -march=i686 -Wa,--noexecstack
-g -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DSHA1_ASM -DMD5_ASM
-DRMD160_ASM -DAES_ASM
available timing options: TIMES TIMEB HZ=100 [sysconf value]
timing function used: times
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha1 5495.22k 17533.38k 42751.23k 66495.83k 79358.63k
aes-128 cbc 16106.82k 28764.22k 35676.28k 38170.97k 38966.61k
aes-256 cbc 14122.54k 22934.86k 27282.26k 28637.53k 29059.75k


という感じなんだけど,この値,k(キロ)じゃなくて,M(メガ)の間違いな気がする…
(8192bytes x 10642) / 3(s) x 1000(s) = 29056207333.33 = 29056.20M

というのはおいておいて,
AESの暗号化速度は,単純に相加平均して計算してみると,
AES 128: 252.3Mbps
AES 256: 192.3Mbps

という感じ,

sha1は,1024bytesのパケットを定常的に送信した場合
544.73Mbps

の速度が出る.
しかし,16bytesのパケットを定常的に送信したら,
44.0Mbps

しかでない.

PentiumIII 933MHzでAES 128使って暗号化している限り,限界値は250Mbpsあたり.
RC4使うと,この倍以上は出るっぽい.
しかし,1パケット毎に32バイト分だけ,AES 256で暗号化しているので,113Mbpsが限界っぽくて,netperfで測った速度はそれなりに良い結果なのがわかった.

つまり,どんなにプログラムを最適化しても,現状の2倍以上の性能は出せない.
通常の3倍には及ばないというわけです.
これならムーアの法則のほうが早いね.

netperf その2

環境は前と同じ.
netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PnetiumIII 900MHz x 4 on VMWare server
Memory: 256MB

実ネットワーク
% netperf -t TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.01 41.74

% netperf -t UDP_STREAM -H solomon.jpcert.cc
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 7937 0 415.91
105472 10.00 60 3.14


仮想ネットワーク
% netperf -t TCP_STREAM -H 172.24.194.52
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.194.52 (172.24.194.52) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 29.47

% netperf -t UDP_STREAM -H 172.24.194.52
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.194.52 (172.24.194.52) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 999 0 52.34
105472 10.00 644 33.74

結果
    実ネットワーク P2P@i
TCP 41.7Mbps 29.4Mbps
UDP 415.9Mbps 52.3Mbps

最近のCore 2 Duoとかだったらもっと早そうだけど.
DVTSの30Mbpsをなんとか送信できる程度は出てるので,こんなもんかな.

ところで,クライアントにNetBSD 4.0 Betaを使うと,かなりスループットが上がる事が判明.

netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: NetBSD 4.0 Beta
CPU: PentiumIII 933MHz x 2
Memory: 1GB
/usr/pkg/netperf/netperf -t TCP_STREAM -H solomon
TCP STREAM TEST to solomon : histogram
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 32768 32768 10.01 695.22

netperf Client側:
OS: Ubuntu 6.10 / Linux 2.6.17-10-server
CPU: PentiumIII 933MHz x 2
Memory: 1GB
netperf -t TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 54.34

結果
     Linux 2.6 NetBSD 4
TCP 54.3Mbps 695.2Mbps

うーん,こんなに違うものなのか???
今度,Windows XPとMacOS Xで試してみよう.

土曜日, 11月 25, 2006

メモリプール

UDPで送信した場合,mbufみたいにメモりプールしている数が足りなくなってるっぽい…
それで,UDPの場合は遅いのか.
プールの数も考えないとな.
1024 x 16パケット分のプールじゃ足りないのか.
2048 x 1024 x 16 = 32MB
しか使ってないから,もっと豪勢にとるかな…
悩むところだ.
きょうび,128MBぐらい使っても問題ない気もするが.

netperfを使った測定

netperf Server側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PentiumIII 933MHz x 2
Memory: 1GB

netperf Client側:
OS: Debian etch Testing / Linux 2.6.16-2-686
CPU: PnetiumIII 900MHz x 4 on VMWare server
Memory: 256MB

まずは実ネットワークの測定結果
% netper -T  TCP_STREAM -H solomon
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.03 51.73

% netperf -t UDP_STREAM -H solomon
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to solomon port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 7318 0 383.38
105472 10.00 74 3.88


続いて,P2P@i上
% netperf -t TCP_STREAM -H 172.24.251.203
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.251.203 (172.24.251.203) port 0 AF_INET
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec

87380 16384 16384 10.02 30.00

% netperf -t UDP_STREAM -H 172.24.251.203
UDP UNIDIRECTIONAL SEND TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET
to 172.24.251.203 (172.24.251.203) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec

107520 65507 10.00 873 0 45.74
105472 10.00 865 45.32

結果
    実ネットワーク P2P@i
TCP 51.7Mbps 30.0Mbps
UDP 383.4Mbps 45.8Mbps


VM使ってこれだけでれば,動画ぐらいはストリーム出来そうだな.

SIGPIPE

TCPのsocket書き込み時等に,既に相手側が閉じていたら,SIGPIPEが投げられる.
SIGPIPEが飛んでくるとアプリケーションが終了してしまうので,SIGPIPEを捕捉しなければいけないっぽい.
writeやsendtoに失敗した場合,errnoにはEPIPEがセットされる.
WRITE(2)                    BSD System Calls Manual                   WRITE(2)

NAME
write, writev, pwrite - write output

...

ERRORS
Write(), writev(), and pwrite() will fail and the file pointer will
remain unchanged if:
[EPIPE] An attempt is made to write to a pipe that is not open
for reading by any process.

[EPIPE] An attempt is made to write to a socket of type
SOCK_STREAM that is not connected to a peer socket.

火曜日, 11月 21, 2006

マルチキャスト

マルチキャストパケットがぐるぐるまわる~!!
最近転送したパケットの情報を保存するようにしないと…

月曜日, 11月 20, 2006

Macで動いた

1. 一つのプラットフォームでなんとか動く
2. 複数のプラットフォームでなんとか動く We are here!
3. 一部のプラットフォームで安定して動く
4. 複数のプラットフォームで安定して動く
5. 複数のプラットフォームで効率的に動く

C++ on MacOS X Panther

MacOS X Panther対応のg++は,Appleからはversion 3までしか出ていない
g++ version 3ではC++のtemplateとSTLを使うとうまく動かない場合があるので,Finkを入れて,g++のversion 4を使うようにしよう.

木曜日, 11月 16, 2006

iproute2 for Linux

eth0:
192.168.0.1

eth1:
10.0.0.1

destination next
192.168.0.0/24 192.168.0.88
10.0.0.0/8 10.0.0.88

# ip route add default via 192.50.109.88 table ispA
# ip route add default via 150.65.118.88 table ispB

# ip rule add from 192.168.0.0/24 lookup ispA
# ip rule add from 10.0.0.0/8 lookup ispB

# ip route add default via 192.168.0.88

水曜日, 11月 15, 2006

MacOS XにSTLportを入れる

1. STLportから,STLport 5.1.0 RC3をダウンロードしてくる.

2. STLport-5.1.0/stlport/stl/config/features.hに以下のパッチを当てる.
--- STLport-5.1.0/stlport/stl/config/features.h Sat Aug  5 18:11:19 2006
+++ STLport-5.1.0-apple/stlport/stl/config/features.h Wed Nov 15 01:07:56 2006
@@ -187,6 +187,12 @@
# else
# define _STLP_LITTLE_ENDIAN 1
# endif
+# elif defined (__APPLE__)
+# if defined (__BIG_ENDIAN__)
+# define _STLP_BIG_ENDIAN 1
+# else
+# define _STLP_LITTLE_ENDIAN 1
+# endif
# else
# error "can't determine endianess"
# endif

2.5 MacOS X Tigerの場合STLportのディレクトリに,C++のincludeディレクトリへのシンボリックリンクを作成する必要がある (2006/11/18 追加)
# ln -s /usr/include/c++/4.0.0 STLport-5.1.0/c++

3. makeする
% cd STLport-5.1.0/build/lib
% make -f gcc.mak clean all install

4. /usr/local以下にコピーする
% su
# tar cf - stlport | (cd /usr/local/include; tar xf -)
# chmod -R a+r /usr/local/include/stlport
# chown -R root:wheel /usr/local/include/stlport
# (cd lib; tar cf - --exclude=CVS --exclude=.cvsignore .) | (cd /usr/local/lib; tar xf -)
# chown -R root:wheel /usr/local/lib/libstlport*
# exit

gccで定義されているマクロを見る

% echo | gcc -v -E -dM -
#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
...

MacOS Xの場合,
#define __APPLE__ 1

と定義されていて,エンディアンは,
#define __BIG_ENDIAN__ 1

となっているか,
#define __LITTLE_ENDIAN__ 1

となっている.

月曜日, 11月 13, 2006

tun/tap driver for Mac OS X

tun/tap driver for Mac OS X

Road Map

1. implement CUI
2. improve and modify the algorithm of DHT
3. implement Web UI
4. test on MacOS X Tiger, NetBSD 4, Debin testing, Fedora 6, Ubuntu 6.10
5. implement DNS
6. implement ICMP unreach
7. implement IP routing
8. implement a structure to collect data
9. test on some OSes
10. release and distribute!
11. implement IPv6
...

LinuxでBroadcast宛のpingに応答するようにする

# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Fedora 6でselinuxを無効にする

起動時に無効にする.
# /usr/sbin/getenforce
Enforcing

# /usr/sbin/setenforce 1

# /usr/sbin/getenforce
Permissive

設定ファイルで無効にしておく.
# vi /etc/selinux/config
# SELINUX=enforcing
SELINUX=disabled

日曜日, 11月 12, 2006

Fedora 6でiptablesを無効にする

# /etc/rc.d/init.d/iptables stop

# /sbin/chkconfig iptables off

Fedora 6でIPv4のzeroconfを無効にする

# netstat -rn
Destination Gateway Genmask
169.254.0.0 0.0.0.0 255.255.0.0

# vi /etc/sysconfig/network
NOZEROCONF=yes

# /etc/rc.d/init.d/network restart

# netstat -rn