2007年01月11日

●VMware server 1.0.1 と Linux 2.6.19

VMware server をインストールするときに、ネットワーク用のカーネルモジュールをコンパイルするステップが有ります。カーネルが 2.6.19 だとコンパイルエラーが出るので調べてみたところ、パッチを公開してくれている人が居ました。
http://nerdbynature.de/bits/2.6.19-rc5/

2006年11月30日

●PowerEdge 1950にDebian Sargeをインストール

PowerEdgeにDebianをインストールするときはいつもちょっとだけ苦労します。今回の1950ではイーサネットアダプタ(Broadcom BCM5708)で、まず引っ掛りました。

いつものようにDell Linuxのページに進んでDebian on PowerEdge 9Gの情報を調べると、足りなくて問題になりそうなドライバはmegaraid_sas(PERC 5 SAS RAID コントローラ)とmptsas(SAS 5 non-RAIDコントローラ)とbnx2(Broadcom NetXtreme II Gigabit Ethernet Adapter)の3つだそうです。新しいカーネルを含む Sarge のインストールCDを武藤さんが公開してくれているのでそれを使うと良い、とのことなので、kernel 2.6.19rc3のsarge-custom-1115.isoを有難くダウンロードしてCD-ROMに焼いて使ったところ、無事にインストールできました。

2006年10月29日

●RSS Auto-Discovery ブックマークレット

あるサイトのRSSのURLをコピペしたいことが有ります。RSS Auto-Discoveryは設定されているものの、ページの本文中にRSSへのリンクが用意されていない(あるいはリンクがどこに有るのかパッと見では分からない)ということも多く、そういう場合はソースを表示してコピーすることになります。結構面倒です。

そこでブックマークレットを作ってみました。別ウィンドウを開いて RSS Auto-DiscoveryなRSSをすべて表示します。

2006年10月11日

●やりかけの仕事が終わるまでプロセスの終了を遅らせる

プログラムによっては、外部からの終了イベント(Ctrl-Cの入力など)でいきなり終わってしまっては困るものが有ります。そこでJavaでは、JVMの終了時に実行したい処理を仕込むためのシャットダウンフックという仕組みが用意されています。

手元に、リクエストを受け付けてマルチスレッドでタスクを実行するプログラムが有ります。このプログラムの場合、やりかけのタスク(とキューに溜っているタスク)が全部終了してからプロセスを終了したいので、シャットダウンフック内でタスク実行スレッドの終了を待つようにしました。スレッドの管理をjava.util.concurrent.ExecutorServiceで行なうようにするとこれは意外と簡単に実現できます。

以下は、そのプログラムを簡単化したサンプルです。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ShutdownHookTest {
    public static void main(String[] args) throws Exception {
        final ExecutorService threadPool = Executors.newFixedThreadPool(3);
        Runtime.getRuntime().addShutdownHook(
            new Thread() {
                public void run() {
                    System.out.println("shutdown hook start");
                    // スレッドプールのシャットダウン
                    // 実行中のタスクとキュー内のタスクをすべて終えたら終了する
                    threadPool.shutdown();
                    try {
                        //すべてのタスクの終了を待つ
                        threadPool.awaitTermination(10, TimeUnit.SECONDS);
                    } catch (InterruptedException e) {
                    }
                    System.out.println("shutdown hook end");
                }
            });
		
        for (int i = 1; i <= 4; i++) {
            threadPool.execute(new Task(i));
        }
    }
}

// 各タスクは自分に与えられた番号と同じ秒数カウントして終了する
class Task extends Thread {
    int num;
    public Task(int num) {
       System.out.println("task #" + num + " init");
        this.num = num;
    }
    public void run() {
        System.out.println("task #" + num + " start");
        for (int i = 1; i <= num; i++) {
            try {
                Thread.sleep(1000);
                System.out.println("[" + num + "]" + i);
            } catch (InterruptedException e) {
            }
        }
        System.out.println("task #" + num + " end");
    }
}

[実行結果]

$java -cp bin ShutdownHookTest
main start
task #1 init
task #2 init
task #3 init
task #4 init
task #1 start
task #2 start
task #3 start              ←実行スレッドが3つなので、4つめのタスクはキューで待つ
shutdown hook start    ←Ctrl-Cを入力
[1]1
task #1 end
task #4 start              ←キューに溜っていたタスクがスタート
[2]1
[3]1
[4]1
[2]2
task #2 end
[3]2
[4]2
[3]3
task #3 end
[4]3
[4]4
task #4 end
shutdown hook end       ← 全部のタスクの実行が終わったので終了

●スタート

開店休業状態だった当ブログですが、今日から本格スタートします。
サブタイトルにもあるように、MAILPIA に関係する技術を主に取り上げる予定です。
なにとぞよろしくお願いします。