フィンローダの本当の裏 →Home , Prev , Next

2003年4月のアレ

2003年4月30日

らんだむCGりんく のデータをXML化する処理をJavaで書いている。 なぜわざわざJavaかというと、 eclipseの練習。

Junitでテストスイート作って、 紆余曲折アリでとりあえず動くようになったのだが、 ところで、これって本番稼動する必要あるのだろうか。 Junit のテストで目的としているXMLのファイルができてしまう訳だが。

§

JRの切符、 インターネットで注文しようとしたら、 登録画面で携帯のメールアドレスを入力する画面に。 入力したら、凄いお言葉が。

メールアドレスが不正です

だそうだ。

他人のアドレスをよりによって不正ですとは失礼な話だ。 というか、何ですか、 メールアドレスをspamを集めやすいデフォルトアドレスにしろとかいう話なのか、 JR。


2003年4月27日

昨日の続き。 もう一つ抜けていたというか、 抜けた訳じゃないのだが、 うかつに上位レベルに近い所の xsl を修正すると、 それに依存するターゲットが鬼のような数あるのだが、 何とかならないか? import とか使って切り分けするしかないのかな。

まあそれはいいとして、 依存関係が前日のような形で生成できたとする。 余談だが、target タグで書くという手法は ant の依存関係の記述方法です。 ただし、実際に ant でこういうのを書いたことがないから、 デタラメかもしれない。

本題に戻って、 draft.xml から *.html を生成するという問題。 draft.xml が更新されたら、次のような処理を行う。

1. 現在の draft.xml から依存関係リストを作る。

2. この依存関係リストを使って、 html を更新する。

3. CVS を使って、1つ古いバージョン (厳密には、最新(現在公開状態)のサイトで公開されているhtmlを生成したバージョン) の draft.xml を取り出し、 その依存関係リストを作る。

あるいは、依存関係リストを作成したらそのまま持っていることにすれば、 CVSから引っ張ってくることないか。

4. 依存関係リストを比較し、依存しなくなったターゲットを探す。 ここでは、 staffonly.html がそれに該当する。

5. 依存しなくなったターゲットを再生成して、 コンテンツが空になった場合は、削除する。

5はどういうことかといいますと、 staffonly.html を生成するのは、 draft.xml に限らない、という話。

§

さらに fprog 的に実際の状況を想定すると、 現時点で一番こんがらがっているのがスタッフ日記。 ちなみに次にこんがらがるのが戯言。

<target name="index.htm" depend="diary.htm">
<target name="diary.htm" depend="d*.htm">
<target name="d200304.htm" depend="(2003年4月の原稿)">

そんなに複雑でもないか。 d*.htm ってウソで、 こんな書き方をしたら diary.htm とマッチしてえらいことになりそう。 実は現在の処理はこうなっていない。 というか、そもそも ant 使ってない。 本当はどうなっているのか、自分でも忘れたので、確かめてみたのだが。 その更新処理。

jperl pickup18.pl
if not "%CMODE%" == "1" (
  jperl index.pl > index.htm
)

余計分からんのでは。

とりあえず、 index.htm はそう簡単に生成されていない、という感じだ。 なお、index.htm に関してだけ言えば、 FPROG Home Page のどこか一部でも更新したら、常に index.htm も更新されるという性質のものだから、 要するに、 依存関係を無視して毎回生成しても構わないのである。 (本当は全く変更されていない場合には構わなくないのだが)。


2003年4月26日

xmlからroleで分割しながらhtmlを作る話。 昨日の chat で CVS の話題に。 確かに CVS を使えばうまく行きそうな感じだが、 一つ抜けていた。 要するに、Webコンテンツマネージメントをするのなら、 もう一つ重要な機能が必要なのでした、 つまり、リンク切れチェック。

どういうのかというと、 a.html から b.html にリンクがあったとする。 a.html を更新したら、 b.html へのリンクが消滅した。 b.html は他からリンクされていないとする。 また、 b.html は削除する訳ではない。 このページ自体は存在するし、 原稿から生成される。

こういう場合、 b.html も公開すべきか、 それとも公開サイトからは削除するのか、というのが問題。 基本的には、一旦出してしまったものは削除しないというのもアリだと思うが、 いつまでもリンク切れの島になったページが残っているのもおかしい、 という考え方にも一理ある。 折衷案として、 MUSTBELINKED みたいな属性が true だったら、島になった時に消してしまうとか、 そういう手か。

もう少し細かく見ていくと、 原稿は draft.xml とする。 ここから、 a.html と b.html が生成される。

draft.xml を更新した。 その結果、 a.html の内容は更新されて、 b.html へのリンクが消滅した。 但し、 b.html の内容は更新されなかった。 ここで注意が必要なことがある。 中間データ(ワークエリア内のデータ)は生成し直していても構わないが、 少なくとも公開サイトの b.html は、ファイルの更新日付も含めて更新してはならない。 なぜかというと、 ファイルの更新日時が変更されてしまったら、 オートパイロットで無駄なトラフィックが生じる原因になるので。

§

draft.xml から hoge.html と staffonly.html を生成する。 この時点の依存関係を作っておく。

<target name="home.html" depend="draft.xml">
<target name="staffonly.html" depend="draft.xml">

のような依存関係リストを作っておく。

次に draft.xml を更新した時に、 hoge.html しか生成しない状態になったとしよう。 依存関係リストは次のように更新される。

<target name="home.html" depend="draft.xml">

更新というか、依存関係が一部消滅しただけだな。

(つづく)


2003年4月23日

Javaで、ドライブの全容量とか、 空き容量を調べるのって、どうするのでしたっけ? Webで探しまくったけど分からなかった。

で、探す時間も勿体無いので、 作ってしまったのだけど。 例によって反則技。 原稿ネタになる予定だけど、 メモのつもりでここに出しておく。

import junit.framework.TestCase;
import java.util.*;
import java.util.regex.*;

/*
 * Created on 2003/04/23
 */

/**
 * ドライブのサイズ、空き容量を求める
 * cygwin の df を呼び出すというインチキをしている
 * 
 * @author phinloda
 */
public class GetVolumeSize extends TestCase {

	/**
	 * Constructor for GetVolumeSize.
	 * @param arg0
	 */
	public GetVolumeSize(String arg0) {
		super(arg0);
	}
	
	public GetVolumeSize() {
	}

	private ArrayList execDfCommand(String option) {
		final String command = "c:/cygwin/bin/df " + option;
		ExecCmd ec = new ExecCmd();
		return ec.execGetResult(command);
	}
			
	private ArrayList execDfCommandByte() {
		return execDfCommand("--block-size=1");
	}
			
	private ArrayList execDfCommandKiroByte() {
		return execDfCommand("-k");
	}
				
	private long getVolumeSize(ArrayList al) {
		String lastLine = getLastLine(al);
		return getVolumeSizeFromLine(lastLine);
	}
			
	private long getFreeSize(ArrayList al) {
		String lastLine = getLastLine(al);
		return getFreeSizeFromLine(lastLine);
	}
	
	/**
	 * String を入れた ArrayList の最後の空白でない要素を返す
	 * @param al String の配列
	 * @return 見つかった要素。見つからない場合は "" を返す。
	 */
	private String getLastLine(ArrayList al) {
		int size = al.size();
		String str;
		for (int n = size - 1; n >= 0; n--) {
			str = (String) al.get(n);
			if (str.length() > 0) {
				return str;
			}
		}
		return "";
	}
			
	private long getVolumeSizeFromLine(String line) {
		return getLongValue(line, 1);
	}
	
	private long getFreeSizeFromLine(String line) {
		return getLongValue(line, 3);
	}			
				
	private long getLongValue(String line, int nPos) {
		Pattern p = Pattern.compile("^\\S+\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");		
		Matcher m = p.matcher(line);
		if (m.find(0)) {
			return Long.parseLong(m.group(nPos));
		}
		return -1;
	}

	public long getVolumeSizeByte() {
		return getVolumeSize(execDfCommandByte());
	}

	public long getFreeSizeByte() {
		return getFreeSize(execDfCommandByte());
	}

	public long getVolumeSizeKiroByte() {
		return getVolumeSize(execDfCommandKiroByte());
	}

	public long getFreeSizeKiroByte() {
		return getFreeSize(execDfCommandKiroByte());
	}

	/**
	 * test
	 */
	public void testAll() {
		GetVolumeSize gvs = new GetVolumeSize();

		// まず ArrayList を作って、それで確認
		ArrayList testArrayList = new ArrayList();
		testArrayList.add("Filesystem           1k-blocks      Used Available Use% Mounted on\n");
		testArrayList.add("C:\\cygwin\\bin         14654708   8588352   6066356  59% /usr/bin\n");
		testArrayList.add("C:\\cygwin\\lib         14654708   8588352   6066356  59% /usr/lib\n");
		testArrayList.add("C:\\cygwin             14654708   8588352   6066356  59% /\n");
		testArrayList.add("c:                    14654708   8588352   6066356  59% /cygdrive/c\n");
		testArrayList.add("d:                    14611952  10421776   4190176  72% /cygdrive/d\n");

		assertEquals(14611952, getVolumeSize(testArrayList));
		assertEquals(4190176, getFreeSize(testArrayList));
	}

	public static void main(String[] args) {
		junit.textui.TestRunner.run(GetVolumeSize.class);
	}

}

Eclipse で作っているのだが、 Junit でいいかげんにテストしたらこうなるという例かも。 というか、Javadoc のコメントちゃんと書けよという声が? だいたい、これじゃ D: の情報しか処理できないというか、バグっていると言われても仕方ないぞ。 "^c:" とか "^d:" でマッチさせればいいだけの話なんだけど。

もうちょっとマジに書いたら LINUX でも使えるようになるのか? df 使えるし。 というか、Java でディスクの空き容量調べるのって本当はどうやるのが正しいんだ?

えーと、 ExceCmd というクラスがないと使えないけど、 見せられる状態じゃないというか、 どうせこんなの使う人いないと思うのでパス。 要するに、 execGetResult(String command); というメソッドがあればいい。 Runtime.getRuntime(); で Runtime を get して、 rt.exec で Process を受け取り、 getInputStream でアレするという定番。 で、結果を ArrayList で返すだけ。 「だけ」って感じの処理でもないけど、 誰か作って(^^;

§

メールの回送ルールを変更。 Interwayからやろうとしたら全然訳が分からなくて、 結局ttyから入って設定した。 これだけ見ても、 NIFTY SERVE が見捨てられているような気がしてしょうがない。

§

しょうこりもなく NAMCO の株を買ったら何やら合併話が出てきて 訳の分からない値動きに翻弄されていたりする。


2003年4月22日

Windows update で推奨される更新をいくつか実行。 何か変わったのか?


2003年4月20日

昨日のWebコンテンツの話。 そんなのperlやjavaを使わなくても、 makeを使ってできないのか、という声がありそうなので、一言。

さあ? どうだろ?

最近は実際にやってないから分からないが、 実は最初の頃(って何時だ?)はmakeを使ったこともあった。 ところが、すぐに頓挫することになる。 makeって、何々作るには何をどうしろ、という感じでルールを積み立てるでしょ。 私の場合(というか、もしかするとコンテンツ生成の一般的なケースか?)は、 逆。 例えば、今書いているのは draft.xml という原稿ファイル。 ここから、ページを生成するのだが、 一体何ができるのか、原稿が完成しないと分からない。

本当に何も分からないとどうしようもないので、 そんなことはないのだが、 例えば、

<topic role="private">
 …
</topic>

というような内容は、個人用のローカルな秘密ディレクトリに転送し、

<topic role="forumstaff">
 …
</topic>

となっている内容なら、 フォーラムスタッフだけ参照できるサーバーに転送したいとする。 つまり、 draft.xml に何かを実行すると、

http://localhost/private/hoge.html

http://どこか外/staff/staffonly.html

が更新される(または生成される)訳だ。

もう一つの例としては、これは4月20日の日記データだから、 更新すると、多分 index.htm がupdateされることになる。 ところが、ここに5月1日の日記を追加した途端に、 凄くややこしい処理が勃発する。 凄いという程でもないのだが、 index.htm の他に、 d200304.htm というファイルと、 d200304.xml というファイルが生成されるのである。 もちろん、 これらのファイルは、さらにここに5月2日のデータを追加しても更新されない。

もっと怖いのは、削除した時の処理。

<topic role="forumstaff">
 …
</topic>

の部分を、やっぱ公開ヤメということにして、

<topic role="private">
 …
</topic>

に修正したとする。 この時点で、他に staffonly.html を生成するような原稿データがなければ、

http://どこか外/staff/staffonly.html

を削除する処理が必要になる。

これのどこが怖いかというと、 修正前の draft.xml には、

http://どこか外/staff/staffonly.html

を作るぞ、という情報が書かれていたから、 そのようなページを作成するのは簡単なのだ。 ところが、前述のように変更した瞬間に、 全宇宙から、 staffonly.html を 作ったのが draft.xml であるという情報が抹消されてしまうのである。 その状態で、どうやって

http://どこか外/staff/staffonly.html

が不要になったことを識別して、 それを削除する処理を実現すればよいか?

make的にこれが実現不可能というのではない。 例えば毎回必ず make clean を実行して全部作ってしまえばいいのだ。 もちろん、これはあまりにも馬鹿馬鹿しい非効率な話なので却下。 で、いろいろ昔考えたけど思いつかなくて、 というか、perl で書いてしまった方が早いということで、 現在そうなっていたのだと思う。 ただ、perl ならできるかというと、 ない情報が参照できないというのは全く同じことで、 要するに、処理したログを残しておいて、 後でそれを見ながら依存関係をチェックしているという話だ。 make って処理のログを作成できたっけ? ant は?

ちなみに、素人みたいな疑問ですみませんが、unmake みたいなツールあるんですか? foo.o はあるけど foo.c がない場合には foo.o を消してくれる、みたいな。 (蛇足だが、今回の処理はそれだけでは不十分で、foo.o から foo.c, bar1.c(名前が対応する保証はない), … を探して、全部スキャンした結果によって foo.o の存続を判定しなければならない)

で、話を戻すけど、 削除のような場合の話。 根本的に、そういう類のデータを外にバラバラに置くというのがいかんと思う。 servlet にして、その都度生成することにすればすっきり解決する。 重そうだけど。

もっと現実的な方法もありまっせ。 要するに、こだわらないというアレだ。 コンテンツを消さないで放置プレイにする。 メインのツリーからはリンクされていないから、 一見ないのと同じような気がするかもしれないが、 実は検索サイトからリンクされまくっているので、 世界からはreachableのままである。 google みたいにキャッシュを残すエンジンもあるから、 削除してもダメという説あり。 だったら、削除しなくてもいいじゃん、という開き直り。 もちろん、それだとディスク容量がヤバいということもあるので、 たまには全削除で全部入れなおせばいい。


2003年4月19日

XMLエディタって何がメジャーなのか、という話題で静かに盛り上がる。 ボヘミアンと貴族のどちらかと言われたのだが、 意味不明という人は、 @IT:XMLにおける「ボヘミアンと貴族の階級闘争」を読み解く とかどうぞ。

個人的には、当然スキーマですが、こだわらない。 という感じなのだが、それって両方から叩かれるのだろうか? 庶民感覚ってその程度だと思うのだが。 貧乏貴族?

おてもやん?

§

chatでのネタ。 そろそろ「フセイン大統領は死んだら消える」という本が出るのでは。

著者誰だっけ?

§

Webコンテンツマネージメントの基本は更新時の自動処理、 ということで、 このページを更新するのは perl が大活躍していて、 例えば更新ファイルの検出とか管理を perl で行うのだが、 そのあたり Java に移植できないかどうかを検討。 やることは簡単。 (1) 更新一覧表とファイルのタイムスタンプを比較して、 更新されたファイルを検出する。 (2) 検出されたそれぞれのファイルに対して、公開用処理を行う。 (3) 更新一覧表の更新。

最近の Java (1.4) は java.util.regex が使えるようになったので、 ディレクトリのファイル一覧から特定のパターンでファイル名を選択するというような、 perl なら一瞬で書けるような処理が、 JDKだけでも「一瞬+α」程度で書けるようになった。 もっとも、以前は非JDKのクラス使えばよかっただけなんですが。 とりあえず、 String path に存在して、 ファイル名が特定の条件 (FilenameFilter filter で判断させる) を満たすものの一覧は、 次の処理でok。 ってすぐ忘れるので書いておかないと。

File[] files = new File(path).listFiles(filter);

§

ベーマガ 休刊なんですか。

§

XML editor といえば全然違うような気がするが、 唐突に eclipse 。

Eclipse.org Main Page から、eclipse-SDK-2.1-win32.zip をget。 展開すると eclipse というディレクトリができる。

さらに、 eclipse-nls-SDK-2.0.x.zip をget。

based on the Eclipse 2.0.2 build but should work on any 2.x build.

と書いてあるので、2.1でもokなんだろう。 で、同じ所に展開する。 これで、メニューとか日本語になるのだが、 ヘルプの画像が表示されない。 謎。


2003年4月18日

w2k (vaio) に、 Apache 2.045 をインストール。

手順は例によって全部デフォルト。 その後、 Apache2/conf/httpd.conf を編集する。

ScriptAlias /cgi-bin/ …

の行を、cgi を入れるディレクトリに変更。 その直後にある <Directory のあたりも同じように変更。 さらに、 DocumentRoot を変更。 さらに、 AddDefaultCharset の変更。

AddDefaultCharset sjis

§

で、Windows Update とか。 重要な更新とかあるみたいだけど、 Windowsは安全です(ビルゲイツ談) なので、別に慌てて更新しなくても安全なのだ。

冗談は抜きにして、 Windows Updateを実行。 重要な更新が3つあった。 インストールを開始する。 途中で異常終了。 更新は一つも成功しなかったとか表示されている。 失敗らしい。 とりあえず、ブルースクリーンとかにならないだけ進歩している。 Windows、やはり安全だ。

§

お仕事であった話なんですけど、 某社のLANポート自動判別(auto-crossover)機能付きADSLルーターと、 某社のLANポート自動判別(AUTO-MDIX)機能付き10/100Mbps sw-hubを接続したら、 LINKのLEDが超高速点滅状態になって、 通信が超遅いという現象が発生した。 Webで探したが、そんな障害報告はどこにも見つからない。 特殊事例なのか? 両方で自動判別しようとして、シンクロ率が「まさか、ありえないわ」状態になったようにしか見えないのだが、シナリオ通りなのだ。

ちなみに、ルーターの箱を開けてdipをポチッとな、で解決。 10Mbpsになっちゃいますが、こだわらない。 コマンドラインからauto-crossover offにするコマンドを突っ込んでも解決しない、 というのが謎。


2003年4月17日

まだ文句数。 しつこい? 結局、次の問題と同値なのだ。

ダイヤモンドが1個、 ルビーが2個、 エメラルドが3個、 サファイアが4個、 トパーズが5個 あります。 この中から7個を選ぶ方法は何通りありますか? 但し、同じ種類の宝石は区別できないものとします。

制限付き重複組み合わせ?

これが、5種類無制限個から2個を選ぶのなら、 重複組み合わせの基本的な問題で済むのだが。

§

で、今回からxmlのデータからuploadするようにしたけど、 見た目変わらないので分からないか。 というか、変わると困る。 xmlでそのまま上げてもいいのだが、 Netscape 4.7 とかだと見えないか? どうでもいいけど、IE4とかいるのでしょうか。 とにかく、わざわざhtmlに変換してからupload。 それも、かなり面倒な話だが、 draft.xml → (xalan で変換) draft.html.utf-8 → (文字コード変換) draft.html.sjis → (perl で変換) index.htm みたいなことをしてからupload。 perlの処理の所で、空白がダブっていたら1個に減らしているので、 preの中に複数の空白とかあったら間が詰まってしまう。 ってバグやん。

§

コミックモーニングの、ブラックジャックによろしく。 ドラマになるそうだが。 それはそうとして、 連載の表紙に、衝撃的な情報が多々含まれますと書いてある。

東京がけっぷち倶楽部 のリピーターだった私としては、 いまいちインパクトに欠けるような気がするのだが、 何か麻痺してしまったのだろうか。


2003年4月16日

tomcat でCGI。 web.xml に書いてある通りなんですが、

$CATALINA_HOME/server/lib/servlets-cgi.renametojar

$CATALINA_HOME/server/lib/servlets-cgi.jar

に改名すべし。 で、その下のコメントアウトされている所を復活させる。 忘れずに、 servlet-mapping のcgiから/cgi-bin/* へのマッピングも。

で、 WEB-INF に cgi-bin というディレクトリを作ってしまってハマる。 cgi という名前じゃないとダメですか。 そうですか。

§

xalan-j 2.5.0

このページ、HTMLもどきの原稿ページからHTMLに変換して公開しているのだが、 どうせならXMLで書いてしまえということで、 うっかり <xsl:template match="/"> の中で無限ループを作ってしまったら、 Netscape 7.02 が落ちた。 そういうものなのか? 再帰しまくったらスタック食い尽くすから、 そりゃまあ私が悪いわけだが、 別に落ちなくても…。とかいう。

ま、とりあえず、

java org.apache.xalan.xslt.Process -IN draft.xml -XSL draft.xsl -OUT draft.htm

みたいな感じで xml から html を生成できるようにしたが、 そこからこのページを作るのはまた別の処理が必要になるのだ。


2003年4月13日

都知事選挙は開票率0.1%で当確出てたが、 選挙しなくても結果わかっていたのでは。


2003年4月12日

まだ文句数。 再帰呼び出しで計算したのだが、

c(n, m) = c(n, m-1) + c(n-1, m) - c(n-1, m-n)

を使えば、少し呼び出しが少なくて済むようだ。

sub get_monku_count {
  my $members = shift;
  my $monku = shift;
  my $i;

  return $i if (defined($i = $results{$members, $monku}));
  return 1 if ($monku == 0);
  return 0 if ($members == 1);

  my $result = &get_monku_count($members, $monku - 1) +
               &get_monku_count($members - 1, $monku);
  if ($monku >= $members) {
    $result -= &get_monku_count($members - 1, $monku - $members);
  }

  $results{$members, $monku} = $result;
  return $result;
}

もっとも、 キャッシュを外すと2184回の呼び出しが発生するのだが、 これは計算の所のループが外に出たため。 処理的には、呼び出しを増やすよりもループで処理した方がいいか?

ところで、話は変わるが、 昨日書いたキャッシュ版、 キャッシュする処理を別に書いた方がいいと思う。 つまり、こうなる。

print &get_monku_count(6, 7);
exit 0;

sub get_monku_count {
  my $members = shift;
  my $monku = shift;
  my $i;

  return $i if (defined($i = $results{$members, $monku}));
  return &calc_monku_count($members, $monku);
}

sub calc_monku_count {
  my $members = shift;
  my $monku = shift;
  my $i;

  return 1 if ($monku == 0);

  my $result = 0;
  for ($i = 0; $i < $members && $monku >= $i; $i++) {
    $result += &get_monku_count($members - 1, $monku - $i);
  }

  $results{$members, $monku} = $result;
  return $result;
}

処理効率はやや落ちるはずだが、 こちらの方がいい。 ただ、ネーミングは何かいまいちですけど。 Java だったら、 calc の方は privateで、 get が public、って感じ?

§

TRON作法

(FPROG 会議室1番 1989-06-19 037 の、 日経コンピュータグラフィクス、1987/7, p.108 の表1 の引用のさらに引用)

・思想レベルのTRON作法

思想1 できる限りモードに入らない。

思想2 コンピュータで判断が付くことをユーザーに行なわせてはならない。

思想3 初心者の時の操作法と、熟練してからの操作法を設け、スムーズに移行できるようにする。

思想4 ユーザーの操作には常に即座になんらかの反応を返し、見捨ててはならない。

思想5 ユーザーが指示することが可能でありながら、行なってはならない操作があってはならない。

・設計方針レベルのTRON作法

方針1 処理の単位ごとに、できる限りその処理を行なう前の状態に復旧できるようにする。
・どうしても復旧できない致命的な操作については指示を受けても即座に実行にかからずユーザーに確認をとる。

方針2 使用頻度の高い操作の指示にはメニュー以外に簡易命令法を設ける。
・よく使用する処理の指示については、タッチタイプ可能な領域にある文字キーの[命令]シフトと対応させる。

方針3 文書のオブジェクト性を強調し、保存領域と内容の関係を希薄にしすぎてはいけない。

方針4 ポインタはどんなときでも、ポインティング・デバイスに追従して移動する。

方針5 反応を返すまでに時間がかかりすぎる(3秒以上)と見込まれる場合でも、ポインタをビジー・シェイプにするなどなんらかの変化を起こす。

方針6 開始されると終了までに時間がかかる(ユーザーを明白に待たせる)と予想される処理については、刻々の残り時間の推定の提示と、中断する手段を必ず明白に与える。

方針7 表示されている状況が先行制御入力を受け付けた結果の内部状況から大きく遅れないようにする。
・具体的には、先行制御されて内部状況が変わった場合でも、常に最新の状況に表示を持っていくようにして、無駄な過渡的表示を行なわないようにする。

方針8 コンピュータに対する命令はNOUN/VERB方式。
・まず処理の対象を選択してから、その対象をどう処理するかを指示する。つまり「何を」「どうする」という順番で指示するためNOUN/VERB方式と呼ぶ。命令はできるかぎり具体的な処理の説明となるようにし、あいまいな表現は避ける。

方針9 ユーザーがAを行なおうとして操作した場合に、「Aを行なうにはBを行なって下さい」といったメッセージを出して、ユーザーの要求を排除するようなMMIを設計してはならない。ただし、Bの操作の中にユーザーのその場での意識的判断の必要な要素がある場合にはこの限りではない。

方針10 ユーザーの判断についてある程度の予想が付くパラメータについては、できる限りデフォルトを活用する。

方針11 システムにとって不都合なことは深刻になる前にできる限り察知し、余裕があるうちに定常的な対応または指示を行ない、ユーザーにコンピュータの知識の必要な意志決定は求めないようにする。
・具体的な例としてディスクの残り容量などの管理が挙げられる。

で、気になっているのが NOUN/VERB方式で、 これに関する論文を調査中。 操作方法が一貫していないと混乱するという点では、 NOUN/VERB方式に統一するというのは基本的なアイデアである。 ただ、 NOUN/VERB方式だと操作が難しくなるUIに関するレポートがあったような記憶があるのだが、 それが見つからない。

とりあえず基本ルールがあって、例外を設ける、というのが広い意味での基本か。


2003年4月11日

文句数って何? とか言われそうなので。 http://www.sansu-olympic.gr.jp/library/1997/final.html

小学生じゃなかったらどう解くのかって? FPROG会員なら多分こう解く。

n人が並んだ場合に、文句数がmとなる並び方を c(n, m)とすれば、 誰も文句を言わない並び方は1通りしかない。

c(n, 0) = 1

m が負の数なら、当然

c(n, m) = 0

となる。 さらに、

c(n, m) = c(n-1, m) + c(n-1, m-1) + ... + c(n-1, m-n+1)

てなわけで、 perlでいってみよう。

print &get_monku_count(6, 7);
exit 0;

sub get_monku_count {
  my $members = shift;
  my $monku = shift;
  my $i;

  return 1 if ($monku == 0);

  my $result = 0;
  for ($i = 0; $i < $members && $monku >= $i; $i++) {
    $result += &get_monku_count($members - 1, $monku - $i);
  }

  return $result;
}

ただ、これだと get_monku_count が何回呼ばれるかというと、 873回呼ばれている。 結果をキャッシュすれば100回で済む。

print &get_monku_count(6, 7);
exit 0;

sub get_monku_count {
  my $members = shift;
  my $monku = shift;
  my $i;

  return $i if (defined($i = $results{$members, $monku}));
  return 1 if ($monku == 0);

  my $result = 0;
  for ($i = 0; $i < $members && $monku >= $i; $i++) {
    $result += &get_monku_count($members - 1, $monku - $i);
  }

  $results{$members, $monku} = $result;
  return $result;
}

§

これ昨日の話なんだけど、 FPROG日記に書き損ねたのでここに書いておく。

渋谷のスクランブル交差点の所で、 ドクター中松氏が選挙演説していた。 それは別に何の変哲も無いことなのだが、 その周囲を携帯をかざした若者が取り囲んでいるのである。 つまり、携帯で撮影しているのだ。

かなり異様な雰囲気だった。 宗教的なものだと説明されたら信じるような光景である。


2003年4月10日

モーニングのケンタに出てくる文句数。 最近の小学5年生は、こんな問題解けるのか。 小学生のテクだけで解くと、 こんな感じ?

1      1        1           1                   1
1 1    2 1      3 1         4  1                5
  1 1  2 2 1    5 3 1       9  4  1            14
    1  1 2 2 1  6 5 3 1    15  9  4  1         29
         1 2 2  5 6 5 3 1  20 15  9  4  1      49
           1 2  3 5 6 5 3  22 20 15  9  4  1   71
             1  1 3 5 6 5  20 22 20 15  9  4   90
                  1 3 5 6  15 20 22 20 15  9  101 -- Answer
                    1 3 5   9 15 20 22 20 15  101
                      1 3   4  9 15 20 22 20   90
                        1   1  4  9 15 20 22   71
                               1  4  9 15 20   49
                                  1  4  9 15   29
                                     1  4  9   14
                                        1  4    5
                                           1    1

なるほど、 解けなくもないか。 しかし、最近は小中あわせて9年制なんて話もあるようだが…。 でも、この解き方だと、7がポイントだというのが分からないんだよな。


2003年4月9日

rasdial というコマンドがあるのか。

netsh とか。

で、先日のVPNの話、 Air H" に接続して、Netscreen-Remote で connect して、 VPN のトンネル開く、という処理を一発でやりたいのだが、 Netscreen-Remote をコマンドラインから起動する(connect する)方法が分からない。 もしかして、Netscreen-Remote 使わずに、 w2k の IPSec 使えばいいとか?

§

イラクでジャーナリストが滞在中のホテルに戦車が砲撃して、 ロイターの記者が死んだとか。 正当防衛なんだそうです。 そうじゃなくて、戦争なのでは?

とりあえず正当防衛だとして、 多分、記者が軍に攻撃するのもアリだろう。 当然、正当防衛。 いい映画が取れるような気がする。

で、そろそろ大量破壊兵器を持ち込んだ頃だと思うのだが…。


2003年4月8日

FPROG 15周年。 忙しくて何もできなかったが。

§

えーと、Windows2000で、L2TP over IPSec とかいう。 L2TPでVPNトンネルを掘ったら、 確かに掘れるのだが、LANの外が一切見えなくなってしまう。 なぜ?

トンネル掘る前の route print 実行結果の一部。

Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   202.219.168.70  202.219.168.70       1
     61.204.7.254  255.255.255.255   202.219.168.70  202.219.168.70       1
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
   202.219.168.70  255.255.255.255        127.0.0.1       127.0.0.1       1
  202.219.168.255  255.255.255.255   202.219.168.70  202.219.168.70       1
        224.0.0.0        224.0.0.0   202.219.168.70  202.219.168.70       1
  255.255.255.255  255.255.255.255   202.219.168.70               2       1
Default Gateway:    202.219.168.70

202.219.168.70 は、たまたまこの時プロバイダから割り当てられていた動的グローバルアドレス (って言い方あるのか?)。 61.204.7.254 って何? ppp接続先のgatewayか何か?

掘った後。

Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0  192.168.xxx.yyy  192.168.xxx.yyy      1
          0.0.0.0          0.0.0.0   202.219.168.70  202.219.168.70       2
     61.204.7.254  255.255.255.255   202.219.168.70  202.219.168.70       1
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
  192.168.xxx.yyy  255.255.255.255        127.0.0.1       127.0.0.1       1
  192.168.xxx.255  255.255.255.255  192.168.xxx.yyy  192.168.xxx.yyy      1
   202.219.168.70  255.255.255.255        127.0.0.1       127.0.0.1       1
  202.219.168.255  255.255.255.255   202.219.168.70  202.219.168.70       1
  ***.***.***.***  255.255.255.255   202.219.168.70  202.219.168.70       1
        224.0.0.0        224.0.0.0  192.168.xxx.yyy  192.168.xxx.yyy      1
        224.0.0.0        224.0.0.0   202.219.168.70  202.219.168.70       1
  255.255.255.255  255.255.255.255  192.168.xxx.yyy               2       1
Default Gateway:   192.168.xxx.yyy

192.168.xxx.yyy はVPN上でこのpcに対応するアドレス。 xxx, yyy は伏せただけ。 伏せる必要はないような気もするが。 ***.***.***.*** はVPNの接続先のグローバルアドレス。 こっちは伏せないとヤバいので伏せる。 これ見ると、いきなり

          0.0.0.0          0.0.0.0  192.168.xxx.yyy  192.168.xxx.yyy      1

となっているから、外向きのパケットは 192.168.xxx.yyy に飛んでいく。 これって何かというと、 仮想プライベート接続だ。 つまり、パケットがどこ向きであれ、 全部仮想プライベート接続が吸い込むという設定になっているのか? もちろん、唯一、

  ***.***.***.***  255.255.255.255   202.219.168.70  202.219.168.70       1

これだけは外に出て行くが、 そりゃまあそうでないとVPNがいつまでたっても外に行けない?

ちなみに、 Windows XP で同じことをやってみたら、 Metric の値が違っている所があるが、こだわらない【古】。

じゃあ、WANに抜けるパケットは全部プロバイダ側に流せば外が見えるのかというと、

route DELETE 0.0.0.0 MASK 0.0.0.0 192.168.xxx.yyy METRIC 1
route ADD 192.168.0.0 MASK 255.255.0.0 192.168.xxx.yyy METRIC 1

とかやれば、当たり前だが見えるようになる。 もちろん、VPN接続中のLAN側も全部見える。 しかし、これでいいのだろうか? 何か余計なパケットが外にそのまま出て行っているとか、 そういうことがあるような気もするのだが、気のせい?

もしかして、firewallを通さないと外からpcが丸見えになってヤバいので、 わざと外世界と隔離している?

Ethereal でパケットモニタ? それがうまく行かないんですな。 Netscreen-Remote がパケット食っていて、大食い勝負状態になっているような気がするのだが。 10Base-Tとかで接続するとモニタできるのだが、 それだとL2TPにならないので、意味がない。 いや、ルーターかまさずに直結してそういう設定にしてやればいいのか?


2003年4月6日

桜が散っている所としぶとく残っている所があるのだが、 あの差は何なんでしょうね。 種類が違うのか?


2003年4月5日

高校生とか主催で反戦デモが行われたりしているようだ。 別に悪いことではないが、 戦争を体験したことのない世代が(もっとも、私もそんな体験はないが)、 なぜ戦争に反対するのか、というのがよく分からない。 というか、知りたい。

もちろん、戦争はいけないことだと刷り込まれて教育されて育ってきた、 という現実はあると思う。 だからといって、 高校生の年齢になったら、 鸚鵡返しに「戦争反対」というのではなく、 自分で考えて反対する程度の思考能力を持っていて欲しい。 現実に戦争は行われている。 なぜか。 世の中に、戦争をした方がいいと判断した人達がいるからだ。 しかも、その中には超大国のトップも含まれているし、 日本の総理大臣もそう考えていることになっている。 世の中に、戦争をした方がいいと考えている人も大勢いるのはなぜか、 という所まで理由も考えた上で戦争に反対している高校生はどれ位いるのかな。

さらに、なぜその人達が戦争をした方がいいと判断したか、 もし戦争はいけないというのなら、 その原因をどうやって解消すればいいのか、 そこまで考えて反戦デモをしている人はどれ位いるかな。

一般論はおいといて、 なぜアメリカとイラクが戦争しているのか、 というのは理解しているのだろうか? 現に、イラクの市民が千人以上死んでいるという。 何百万人という人口の都市に爆撃しているのだから、 多分本当だろう。 それにしても、どうも日本はのほほんとしているようだ。 そのあたりも、なぜ戦争をするのかという鍵が隠れているのではないか。

別に戦争に賛成するつもりもないし、 特に今回の戦争が不可避だったとも思えないが、 なぜイラク戦争が始まったか、原因を考えるのは、かなりinteresting な話だ。 例えば、開戦時の理由に、 大量破壊兵器を廃棄しないから武力で放棄させるというものがあった。 イラクは既にない物を捨てようがないと主張したわけだが、 実際、大量破壊兵器は未だに出てこない。 もちろん、最終的に出てくることは間違いないのだが(なければ捏造するに決まっている)、 まず、「大量破壊兵器を廃棄しないから」という理由は、 開戦の理由としてはブラフだったと考えても差し支えないだろう。 だいたい、世界で最も大量の「大量破壊兵器」を持っている国がどこで、 その国が大量破壊兵器の廃棄にどれだけ反対しているかを考えれば分かる話だ。

テロを根絶するため、という理由はどうなんだろ? 今回みたいな戦い方では、 テロリストを増やしているように見えてしょうがないのだが、 例えばアメリカは あれで本当にテロがなくなると思っているのだろうか? そんな甘い考え方はしないはずだ。 現に、アメリカでも、 戦争に勝っても500人、1000人のビンラディンを生むだけだ、 と批判的な意見を言う人がいたと思う。

「今日の戯言」の方に思わせぶりに書いたが、 「実際に天然痘を生物兵器として使ったことのある国」 というのはイギリスのことである。 まあ時効かもしれないが、インディアンの人口が半分になったはずだ。


2003年4月4日

アメリカの世論調査で、 イラク戦争が非常にうまくいっていると考える人が47%だという。 千人も一般市民を殺しておいて、何がうまくいっているのかよく分からないが、 同時多発テロの標的になった理由は分かるような気がした。

§

@FreeD の DoPa とか対応している方、 ビックカメラだと8800円。 どうするか悩む。 現状だとAir H"の32kだが、 何か割引とかあるみたいだが、よく分からない。 とりあえず、結果的に、4872円/月かかっている。 @FreeDって、4880円/月だというから、 料金は高くなる訳だ。 もしかして税別? だとすると、5124円/月ということで、 月あたり244円の増額になる。 速度が32kから64kになるというのが、どの程度のメリットなのかという感じだ。 実はアンテナの都合だと思われるが、 自宅からAir H" が凄く入りにくいから、 自宅から接続できるようになるのであれば、それなりのメリットはあるのだが。


(C) 2003 Phinloda, all rights reserved

RIMNET: phinloda@st.rim.or.jp