検証用Protocolを実装

少しだけ時間が取れたのでJGroupsの一人ソース輪読会の続きをやった.

がしかし,読んでいてこんがらかってきたので,ある手法で動きを調べてみることに.

ある手法とは,こんな感じのSystem.out.println()ログ出力プロトコルを実装してJGroupsを動かしてみること.

public class MIR extends Protocol {

    public String getName() {
        return "MIR";
    }
    
    public void destroy() {
        System.out.println("MIR.destroy()");
        super.destroy();
    }
    
    public void down(Event evt) {
        System.out.println("MIR.down(" + evt + ")");
        super.down(evt);
    }

    public Protocol getDownProtocol() {
        System.out.println("MIR.getDownProtocol() returns " + super.getDownProtocol());
        return super.getDownProtocol();
    }
...略
}

呼び出し元のmainメソッドは以下.

public static final String STACK2 =
    "UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):" +
    "MIR";

public static void main(String[] args) throws Exception {
    System.out.println("\n----- start new JChannel() -----\n");
    JChannel channel = new JChannel(STACK2);
    System.out.println("\n----- start channel.connect() -----\n");
    channel.connect("demo-group");
    System.out.println("\n----- start channel.disconnect() -----\n");
    channel.disconnect();
    System.out.println("\n----- start channel.close() -----\n");
    channel.close();
    System.out.println("\n----- main method end -----\n");
}

最下層レイヤーにはUDPのようなProtocolを設定しておかないと上手く動かないので,MIR+UDPの2層構成にて.

設定ファイル上での上下関係は動作時の上下関係とは逆になる.

以下のログが出力された.

----- start new JChannel() -----

MIR.setProtocolStack(org.jgroups.stack.ProtocolStack@32fb4f)
MIR.setProperties({}) returns true
MIR.setPropertiesInternal({}) returns true
MIR.init()
MIR.requiredUpServices() returns null
MIR.requiredDownServices() returns null
MIR.providedUpServices() returns null
MIR.providedDownServices() returns null
MIR.setDownProtocol(Protocol UDP(local address: null))
MIR.setUpProtocol(org.jgroups.stack.ProtocolStack@32fb4f)
MIR.getDownProtocol() returns Protocol UDP(local address: null)
MIR.startDownHandler()
MIR.startUpHandler()
MIR.getUpProtocol() returns org.jgroups.stack.ProtocolStack@32fb4f

----- start channel.connect() -----

MIR.(protected) receiveDownEvent(Event[type=START, arg=null])
MIR.(protected) handleSpecialDownEvent(Event[type=START, arg=null])
MIR.start()
MIR.down(Event[type=START, arg=null])
MIR.passDown(Event[type=START, arg=null])
MIR.(protected) receiveUpEvent(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319])
MIR.up(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319])
MIR.passUp(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319])
MIR.(protected) receiveUpEvent(Event[type=START_OK, arg=true])
MIR.up(Event[type=START_OK, arg=true])
MIR.passUp(Event[type=START_OK, arg=true])
MIR.(protected) receiveDownEvent(Event[type=CONNECT, arg=demo-group])
MIR.down(Event[type=CONNECT, arg=demo-group])
MIR.passDown(Event[type=CONNECT, arg=demo-group])
MIR.(protected) receiveUpEvent(Event[type=CONNECT_OK, arg=null])
MIR.up(Event[type=CONNECT_OK, arg=null])
MIR.passUp(Event[type=CONNECT_OK, arg=null])

----- start channel.disconnect() -----

MIR.(protected) receiveDownEvent(Event[type=DISCONNECT, arg=192.168.1.100:2319])
MIR.down(Event[type=DISCONNECT, arg=192.168.1.100:2319])
MIR.passDown(Event[type=DISCONNECT, arg=192.168.1.100:2319])
MIR.(protected) receiveUpEvent(Event[type=DISCONNECT_OK, arg=null])
MIR.up(Event[type=DISCONNECT_OK, arg=null])
MIR.passUp(Event[type=DISCONNECT_OK, arg=null])
MIR.(protected) receiveDownEvent(Event[type=STOP_QUEUEING, arg=null])
MIR.(protected) receiveDownEvent(Event[type=STOP, arg=null])
MIR.down(Event[type=STOP_QUEUEING, arg=null])
MIR.passDown(Event[type=STOP_QUEUEING, arg=null])
MIR.(protected) handleSpecialDownEvent(Event[type=STOP, arg=null])
MIR.stop()
MIR.down(Event[type=STOP, arg=null])
MIR.passDown(Event[type=STOP, arg=null])
MIR.(protected) receiveUpEvent(Event[type=STOP_OK, arg=true])
MIR.up(Event[type=STOP_OK, arg=true])
MIR.passUp(Event[type=STOP_OK, arg=true])

----- start channel.close() -----

MIR.stopInternal()
MIR.destroy()
MIR.getDownProtocol() returns Protocol UDP(local address: 192.168.1.100:2319)

----- main method end -----

続きはまた後日.

過去半年の国内コミュニティにおけるトラフィック状況

2chMySQL本スレと日本MySQLユーザ会メーリングリストトラフィック量で過去半年分を検証.

MySQL 総合 Part5 http://pc8.2ch.net/test/read.cgi/db/1121561160/l50

  • 2005/7/17に開始、1000レス目がついたのが2005/11/28.1スレ消費に要した日数は135日.1日あたりの平均レス数は7.41

MySQL 総合 Part6 http://pc8.2ch.net/test/read.cgi/db/1133166614/l50

  • 2005/11/28に開始、1000レス目がついたのが2006/2/17.1スレ消費に要した日数は82日.1日あたりの平均レス数は12.19

日本MySQLユーザ会ML

  • 2005/7/17から2005/11/28の間に流れたメールは731通.1日あたり平均メール数は5.41
  • 2005/11/28から2006/2/17の間に流れたメールは233通.1日あたり平均メール数は2.84

Javaが普及を達成したことによって逆にJava-House-MLのトラフィックがなくなったように、必ずしもトラフィック量と普及度合は正の相関関係があるわけではないと思うが,面白い結果となっている.2chはMLよりもレスをしやすいし,ジャンクなレスもこの中に含まれるので一概に比較はできないけれども、全体の傾向としてはユーザ会MLでのQ/Aは過去半年で見た場合減少し、2chでのQ/Aは増加したといえると思う.一時的にトラフィックが増えたり減ったりする期間もあるとおもうのでこれだけはでどうこうはいえない部分もあるけれども.

両方読んでいる身としては,MLのほうが投稿の敷居が高いのかな,というふうに感じる節もある.MySQLをこの半年で使い始めた人がMLに投稿しにくいと感じて2chに流れたのだろうか? あるいはMLだと割と登場するSIer系の方々にとっては既にMySQLは十分既知のものとなり,MLを活用する必要がなくなる段階に来たと捉えるべきだろうか?

2chスレのほうは残念ながらPart5以前のものが見つからなかったのだけれども,あれば見てみたい気もする.2chはあまり詳しくないのだけれども,何かツールを導入すれば見れるんだっけ?

購入計画あれこれ

現在 ikda.net にて使用しているThinkPad X31 2672-LJ6は諸事情により帰国後使えなくなるので,代替機を早急に用意せねばならない.

先々の目標としては自宅鯖環境をGLAN Tankなどの低価格小箱サーバに切り替えることなのだけれども,GLAN Tank鯖構築に必要な「IDE接続が可能なマシン」つまりデスクトップPCが一台もない現状においてはこれはできない.帰国後,ハイスペックなデスクトップマシンを自作で構築後の話になるだろう.しかし ikda.net はそれまでの間ずっとダウンさせておくわけには行かない.

代替機の本命に考えているのは,中古のThinkPadかあるいは片落ちして叩き売りされているThinkPad.他のNotePCでも安くてしっかりしていれば良いのだけれども,既にThinkPadに慣れている身(過去から累計4台のThinkPadを使っている)としては早急に鯖復旧をさせるならThinkPadであろうということがある.

ニッシンパルのWEBサイトを見ると,X31系の一番安い奴でも十数万円はする.最新のT42系などに比べれば半分以下の価格だがちょっと今回は予算オーバー気味.ikda.netへのアクセスはほとんど無いに等しい(1日100アクセス未満)なので,新品の高性能マシンは不要.

メインマシンがWin2Kだったので,こっちに居た時はX31(CPU 1.5GHz、RAM 1GB)でよくMySQLコンパイルとかをしてた.メインマシン(CPU 1.7GHz, RAM 2GB)にはVMWare+SuSE9.1も入れていたけれども,これでコンパイルするとCPUリソースが食われて他の作業を並行してやりずらくなるので結局VMWare+Linuxはあまり使わなかった.SSHで繋いでdev.mysql.comあるいはmysql.bkbits.netからソースを落としてコンパイルしつつ,手元では他のことをするほうが効率が良かった.

Yahoo!オークションで中古のThinkPadを探すと、3万円くらいでいくつか出てくる.
http://page12.auctions.yahoo.co.jp/jp/auction/p38865763
これとか良いかもしれない.現 ikda.net 鯖(X31)とさほど代わらないスペックでありながら,20千円を切っている.締め切り間際にはもう少し値段があがるかもだけど.(→ヤフオク初心者なのであれですが、他の中古NotePCの競売履歴を見るとどうも最後の2時間くらいで1万円くらいはあがるみたいですね.このスペックで考えると落札価格は5万円は超えそうな気がします.締め切り時間がPSTでAM6:59なので参戦は厳しいかw)

だがしかし,秋葉原で直接自分で探したいという気持ちもある.
http://akibamap.info/archives/50344260.html
このあたりとかにThinkPadの中古はかなりあるらしい.

今回購入予定のマシンはGLAN Tank鯖などを導入したらikda.net鯖としては不要になるマシンだし,帰国したら高性能デスクトップを組み立てる予定なのでMySQLコンパイルはそっちでやれば良いし(出社時はサーバルームのマシンを借りれば良いし),あとで余った場合に尚利用価値があるようなスペックというのも考えてないといかんと思う.

思いつくのは,触ったことがないLinuxディストリを入れるマシンという役回りとか.あるいはGLAN Tankだと載せられないようなサービスを動かすためのマシンか.GLAN TankのRAMってどんなんだっけな.128MBか.MySQLJBossも絞れば動くよな.となるとMySQL Clusterを動かしたいですとかそんな場合か.512MBは最低でも必要だし.しかしMySQL Clusterをシングルノードで動かして何か意味があるのか,という突っ込みが残る.まあ良いや.(())