水曜日, 8月 08, 2007

simpleCaptcha on Debian etch

Debian etch上でtomcat 5.5を動かして,SimpleCaptchaを使うには工夫が必要.

implementingを見ながら,普通に使うと以下のようなエラーが出る.

java.awt.HeadlessException
sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:65)
nl.captcha.text.imp.DefaultWordRenderer.renderWord(Unknown Source)
nl.captcha.servlet.DefaultCaptchaIml.createImage(Unknown Source)
nl.captcha.servlet.CaptchaServlet.doGet(Unknown Source)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

google等で調べると,tomcatの起動時に,
-Djava.awt.headless=true

と指定すれば解決できると書いてある.

具体的には,Debianでは,
/etc/default/tomcat5.5

を,以下のように編集する
# Arguments to pass to the Java virtual machine (JVM)
# "-Djava.awt.headless=true -Xmx128M" is automatically set if CATALINA_OPTS
# is left empty here
CATALINA_OPTS="-Djava.awt.headless=true -Xmx128M -server"

が,実際はこれだけではうまくいかない.
何故かというと,Debian etchのaptを使ってインストールされるJavaが,やや古いために起こる.
Java 1.4.2では,headless modeでJavaを起動しても,sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(...)がheadless exceptionを投げてくるバグがあるのだ.
Running in Headless mode still produces Headless exception with GTK UI

これを回避するために,SimpleCaptchaのコードを少々いじくる.
いじくるファイルは,
$ vi $SimpleCaptchaDir/JavaSource/nl/captcha/text/imp/DefaultWordRenderer.java

で,57-60行目をコメントアウト
 57                 //GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
58
59 //GraphicsDevice gd = ge.getDefaultScreenDevice();
60 //GraphicsConfiguration gc = gd.getDefaultConfiguration();


次に,build.xmlの12行目を正しいj2ee.jarのありかに書き換える.
 vi $SimpleCaptchaDir/build.xml
12 <fileset file="F:\Program Files\IBM\WebSphere Studio\Application Developer\v5.1\runtimes\aes_v4\lib\j2ee.jar"/>

最後に,SimpleCaptchaのトップディレクトリで,antを実行.
$ cd $SimpleCaptchaDir
$ ant

すると,dist以下にそれらしきjarファイルが出来上がる.

日曜日, 6月 17, 2007

Windows版

Parallels上のWindows XP SP2だと全然落ちないけれど,実機だと落ちる模様.
うーん,これじゃ,デバッグできない.

日曜日, 6月 10, 2007

IPv4アドレスは枯渇していないのか?

IPアドレスは枯渇していない

現状として,これだけNATだらけの社会でいわれても,あまり納得がいかない.

タイトルは,「理論上IPv4アドレスは枯渇していない」の誤りなのでは.

まぁ,なんとかしてくれ!NAT!
と,P2Pソフトウェアを作っていて思うので,アドレス再分配か,All IPv6化ができればとても幸せなのですけどね.
どちらも,机上の空論で終わって欲しくないものです.

僕もWIDEメンバーの端くれなので,IPv6はP2P@iでも対応したいところです.
対応するにしても,現在のIPv6の普及を見る限り,たぶん,仮想IPネットワークの方からだけど・・・
しかし,おそらく,IPv6なネットワークを即座に構築できるようになれば,IPv6アプリケーションの普及にも役立つのではないかと思う.

水曜日, 6月 06, 2007

安心できる社会

最近,安心してくらせる社会を,などと囁かれることが多い.
それは,インターネットの世界でも例外ではなく,安心して利用できるインターネットの実現に向けて,などといわれる.

しかし,安心,安心,と謳っている割にいっこうに世の中が安心できる世の中になっているとは考えられない.

それでは,この「安心な世界を!」と言うフレーズを,声高らかに言っている人は誰なのだろうか?
じつのところ,こういった人たちは,セキュリティや防衛の人々な気がする.
この人たち,つまり,安心を売る人たちは,それを売って商売をしているわけで,実際,みんなに安心してもらっては困ってしまうのだ.

例えば,
「現在の御社は,セキュリティ管理が非常に甘くなっております」
「我が社のセキュリティソフトを利用すれば,安心してインターネットに接続できます」
などなど,安心を売る人たちは,いかに現状が安心できない社会かを述べて,利益を上げている.
このような人たちが,うようよでてきて,毎度毎度きかされると,現在の社会がとても不安定で,ひどいものであるという気になってしまう.

しかし,一言断っておくと,セキュリティを生業としている人達の中にも,真面目に社会インフラのセーフティネットとしての,セキュリティに関する技術開発や研究を行っている人もいるにはいる.
しかしながら,消防署の方から来ました,などと言うあやしい論法で安心を売っている人も確実に存在する.

話は変わるが,アメリカの国防費は,全世界でトップであるばかりではなく,国防費全世界2位日本との差は7.1倍もある.
http://www.number27.org/work/maps/weapons.jpg
日本も,アメリカも,こんなに国防費を使っているのに,安心できる社会を!と叫んでいるのは,ちょっと滑稽な感じがする.
一体全体,どれだけ国防費をつぎ込めば,安心できる社会になるのだろう.

安心を得ようとして,ますます不安を煽っては居ないのだろうか?
安心を見つけるために,現在どれだけ安心でないかを探してしまっては居ないのだろうか?

そして,安心を売っている人に教えて欲しい,
「いったい,いつになったら,安心できる社会とやらが訪れるのか?」
を.

火曜日, 6月 05, 2007

UPnP NAT Traversal

世の中の大半は,NATで接続しているという,驚愕の事実が発覚したため,至急UPnP NAT Traversal対応版を作成中.

次のリリース0.6では,UPnP対応となる予定.

しかし,このUPnPってやつは,XMLをパースしなければ行けなかったり,ひたすら面倒くさい.
そんなわけで,もう,ライブラリ使ってしまおう.

とりあえず,Linuxは,
http://upnp.sourceforge.net/
Windowsは,
http://www.codeproject.com/internet/PortForward.asp
でいけるかなぁ〜

このページも役に立ちそう.
http://www.bosuke.mine.nu/neta/upnp.shtml

はやく,IPv6オンリーの世界になぁれ!

火曜日, 5月 29, 2007

Windows版 その2

基本的なところは,ほぼ動くように!
あとは,Web UIの部分を移植すればWin32版の移植は一段落.

つづいて,ユーザビリティの向上を行おう.

月曜日, 5月 28, 2007

emacs for BSD style coding

(setq c-default-style "bsd")
(setq c-basic-offset 8)

アフォーダンス

部屋に入って,ボールと椅子があったとき,普通,ボールをけっ飛ばして遊んで,椅子に腰掛ける.
誰も,椅子をけっ飛ばして,ボールに腰掛けようとはしない.

これは,椅子自身が,座るものだということを,人間に思い起こさせ,ボールはけっ飛ばすものだと人に訴えかけているからである.

男子トイレが青色のマークで,女性トイレが赤色のマークなのも,過去の経験などを人に思い起こさせるためだと考えられる.
すなわち,そのマーク自身について,人間が新たに知るべき情報を極力減らすことが出来るので,ユーザは迷うことなくトイレに駆け込むことが出来る.

もしも,引き戸にドアノブがついていたら,とんでもなく使いづらくなってしまう.
これは,過去の経験との相違があり,さらに,その扉について,人間が新たに学習しないという負担を課してしまうためだと考えられる.
学習は楽しいものであるが,主題や目的と外れた学習は,人間にとって苦痛であるのだ.

オブジェクトがどうすればいいか物語らなければ,よいUIとは言えない.
機能が豊富であれば良いように思われるけれど,豊富な機能を学習しなければ,使えないのはあまりよろしくない.
なんでも出来ます,とうたわれているものが,実は何も出来ないのはよくあること.

昔はパソコンさえあれば,何でも出来ますと言われていたけれど,最近は,ネット接続や,マルチメディアなどに的を絞って宣伝している.
何でも出来ますは,実はユーザにとっては何も出来ないことだったのだ.

以上の考察より,

「何ができるのか?」

を,明確にした上で,

「どうすれば.その出来ることを実現できるのか?」

を直感的に人間に分からせるようなインターフェースを実現できると,人間に優しいソフトウェアが出来上がるのではないかと思う.

水曜日, 5月 23, 2007

for Windows版のメモ

libsymphony

  • sym_dht.hpp
  • sym_util.hpp
を編集したので,後で更新する必要あり.

ipv4_peer.hpp
OpenBSD製のtree.hを変更して,テンプレートクラスに埋め込んだファイルをVC++ 2005で編集していると,落ちる.
tree.hを一端,別の場所に移動してから編集すれば大丈夫っぽい?

日曜日, 5月 20, 2007

Windows版

Windows版の作成を開始しました.
Windows版は,

を利用.

金曜日, 3月 23, 2007

続 bonjour by Java

次は、Bonjourを使ってローカルリンク上にサービスを通知してみます。

今回通知するサービスは、_testとし、このサービスはTCPの6666番ポートを使っていると仮定します。

さらに、サービスを行っているノードを識別するインスタンス名を_QuBEとします。

すなわち、_QuBE._test._tcp.localとしてサービスを通知します。

このプログラムは以下のようになります。

import com.apple.dnssd.*;

public class Main implements RegisterListener {
DNSSDRegistration r;

public Main() {
}

public void serviceRegistered(DNSSDRegistration registration, int flags,
String serviceName, String regType, String domain) {
System.out.println("serviceName = " + serviceName);
System.out.println("regType = " + regType);
System.out.println("domain = " + domain);
}

public void operationFailed(DNSSDService service, int errorCode) {

}

public void register(String name, int port) {
try {
r = DNSSD.register(name, "_test._tcp", port, this);
} catch (Exception e){
e.printStackTrace();
System.exit(-1);
}
}

public static void main(String[] args) {
Main m = new Main();

m.register("QuBE", 6666);

for (;;) {
try {
Thread.sleep(100);
} catch (Exception e){
e.printStackTrace();
System.exit(-1);
}
}
}
}

DNSSD.register(name, "_test._tcp", port, this); が、サービスを通知、登録するための関数になります。
ここでは、nameがサービスのインスタンス名、"_test._tcp"がサービスタイプ、portがそのサービスを提供しているポート番号となります。
最後の引数、thisでは、リスナクラスを登録する必要があり、このクラスはRegisterListenerインターフェースをインプリメントしていなければいけません。

RegisterListenerインターフェースをインプリメントするには、serviceRegistered関数と、operationFailed関数を定義する必要があります。
これらは、サービスの登録が成功したとき、もしくは失敗したときに呼び出されます。

それでは、このプログラムを実行してみます。

実行する前に、dns-sdをターミナルで動かしておきます
% dns-sd -B _test._tcp

この後、上記プログラムを実行すると、dns-sdでは、以下のようなメッセージが表示されます。
Browsing for _test._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
13:07:47.146 Add 2 8 local. _test._tcp. QuBE
13:07:47.148 Add 2 9 local. _test._tcp. QuBE
13:07:47.148 Add 2 5 local. _test._tcp. QuBE

また、プログラムの実行結果は以下のようになります。
serviceName = QuBE
regType = _test._tcp.
domain = local.

月曜日, 3月 19, 2007

bonjour by Java

BonjourをJavaで使ってみます。
Bonjourの詳しい説明はこちら(Wikipedia)。

Bonjourでは、サービスタイプという概念があります。
たとえば、iTunesでは、_daap._tcpというサービスタイプが用いられています。
他には、_http._tcpや、_printer._udpなどがあります。

PCは_http._tcpというサービスを提供していることを、リンクローカルマルチキャスを用いて知らせます。

dns-sdを利用すると、同一セグメント上に流れてきているサービスを、表示することができます。
例えば、_daap._tcpというサービスが流れてきているかどうかを表示するには以下のようにします。
 % dns-sd -B _daap._tcp

この後、iTunesを起動してみると、次のようなメッセージが表示されます。
Browsing for _daap._tcp
Timestamp A/R Flags if Domain Service Type Instance Name
3:03:01.323 Add 3 8 local. _daap._tcp. QuBE
3:03:01.324 Add 3 9 local. _daap._tcp. QuBE
3:03:01.324 Add 2 5 local. _daap._tcp. QuBE

次に、これと似たようなことを、Javaで実装してみます。
コードは以下のようになります。
import java.util.*;
import com.apple.dnssd.*;

public class bonjourTest implements BrowseListener {

public bonjourTest() {}

public void serviceFound(DNSSDService browser, int flags, int ifIndex,
String serviceName, String regType, String domain) {
System.out.println("Sercice Founded");
System.out.println("name = " + serviceName);
System.out.println("registered type = " + regType);
System.out.println("domain = " + domain);
}

public void serviceLost(DNSSDService browser, int flags, int ifIndex,
String serviceName, String regType, String domain) {
System.out.println("Service Lost");
System.out.println("name = " + serviceName);
System.out.println("name = " + serviceName);
System.out.println("registered type = " + regType);
System.out.println("domain = " + domain);
}

public void operationFailed(DNSSDService service, int errorCode) {

}

public static void main (String args[]) {
bonjourTest b = new bonjourTest();

try {
DNSSD.browse("_daap._tcp", b);

for (;;) {
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
}

DNSSD::browse() 関数を用いて、取得するサービスタイプを指定し、サービスが取得されたときのリスナクラスを指定します。
このリスナクラスは、BrowseListenerインターフェースをインプリメントし、serviceFound(), serviceLost(), operationFailed()関数を定義することで出来上がります。

DNSSDクラスはファクトリクラスとなっており、ここで定義された関数を用いることで、サービスの登録なども行えます。

上記のプログラムを実行して、iTunesを起動すると、以下のようなメッセージが表示されます。
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.
Sercice Founded
name = QuBE
registered type = _daap._tcp.
domain = local.

月曜日, 2月 26, 2007

NetBSD 4 Beta2とPthreadとfork

NetBSD 4 Beta2では,forkしたあとにpthread_createは出来ない.
これは,Daemonプロセスをつくるときに不便である.
Daemonにしたい場合は,forkした後に,execして,pthread_createしないといけない.
そうすればうまくいくだろう.

とご神託が下った.

水曜日, 2月 21, 2007

ソースコード公開

Sourceforge.netにソースコード公開.
http://sourceforge.net/projects/p2pati/

shell.sourceforge.net に繋がらないのはなぜ?

水曜日, 1月 24, 2007

データ取得部分作った

統計情報を取得して,サーバに投げる部分作った.

cvsにタグつけた
% cvs tag p2pati-0-4-rc4

明日からは論文書こう
27日には書き上げとこ

TODO:
とりあえずやること.
  1. データ収集サーバ作成
  2. MacOS X, Linux, NetBSDで実験
  3. 公開用WEB作成
これから追加すること
  • icmp host unreachの追加
  • dns, mdns
  • もっととろう,統計情報
  • UIの改善
  • IPv6対応
  • マルチキャスト部分の改良

月曜日, 1月 15, 2007

WEB UIできた

とりあえずのWEB UIと設定ファイル読み込みができた。
次は、統計情報を取得するようにしよう。

cvsにタグつけた
% cvs tag p2pati-0-4-rc3

あと少し。

月曜日, 1月 08, 2007

進捗

WEB UIがちょっと出来たので,cvsにtagつけた
% cvs tag p2pati-0-4-rc2

そして,sourceforge.netにアカウント作った.

次は,設定ファイルを読み込んだりするように出来るようにしようっと.