雑記帳 2006年 9月第3週

2006/09/10 Sun.

たまたま昨夜は0時なんぞに寝てしまったために8時起床。予定の無い休日に早起きすると1日が長くなりすぎて困る。
14時半から17時まで昼寝してたけど、それなら最初から10時半まで寝ておけばよかったと、どうでもいい後悔をしてみる。

2006/09/11 Mon.

Javaの反復子というかループというか、いわゆる全要素を列挙する方法が色々ありすぎてメンドくさい。誰かまとめてくれ。

import java.io.*;
import java.util.*;
public class test {
    public static void main(String[] args) {
        try {
            Properties properties = System.getProperties();
            Enumeration enumerationProp = properties.propertyNames();
            while (enumerationProp.hasMoreElements()) {
                String sPropName = (String)enumerationProp.nextElement();
                System.out.println(sPropName + "=" + properties.getProperty(sPropName));
            }
            System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ");
            TreeMap tm = new TreeMap();
            for (int i = 0; i < 10; i++) {
                tm.put(Integer.toString(i), Integer.toString(i));
            }
            Iterator itr = tm.keySet().iterator();
            while (itr.hasNext()) {
                String sKey = (String)itr.next();
                System.out.println(sKey + "=" + (String)tm.get(sKey));
            }
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            System.out.println(sw.toString().trim());
        }
    }
}

hasMoreElements()とかhasNext()とかhasMoreTokens()とかnext()とか、よくもこんなに用意してくれたもんだ。
EnumerationをEnemurationと間違えまくってコンパイルエラーを出しまくるのはご愛嬌。普段それほど使わないしな。
何かいい反復子のまとめとかないかと思ってたら、「IteratorEnumerationなどループあれこれ」ってのがあった。
自分で頻繁に反復子を使うのはResultSetStringTokenizerくらいしかないし。真面目に覚えていかんと。

仕事の前日は早く寝ようと心がけていたのだが、昨夜は急にFLVをローカルで見たいと思い立って時間食ってしまった。
GetFLV」でIEコンテキストメニューを拡張、その後に「ffdshow」でコーデックを設定、その後にWMPとの関連付け。
この「GetFLV」をインストールするのにスクリプトを利用するんだけど、中身読んだらすげー作りになってるのな。
自宅のマシンのWMPのバージョンは6.4とかで古いのを使ってるんだけど、これでFLV再生できるかはかなり不安だった。
WMPをバージョンアップしろとよく言われるけど、新しいWMPってインターフェースがゴチャゴチャしてて嫌いなんだよな。
おかげでネット上に転がってる動画は見れないのが多いけど、WMP9のコーデック単体で突っ込んで無理やり解決してる。
Windows Vista」になれば色々と変わるだろうし、自分もマシンごと買い換えるだろうから、それまでは当分我慢だな。

2006/09/12 Tue.

最近あちこちでメール送信を行う機能を作ってるから、とりあえず自分用に「こんなクラス」を作っておいた。流用しまくろう。
BCCとかは普段使わないし、とりあえず放置でいいか。それにしてもj2ee.jarってファイルサイズが大きすぎると思わん?

さて、シェルスクリプト関連で問題が挙がっていたので、対処法とかを考えてみたり。まずはJavaとシェルスクリプトのソース。

String sName = "junmix";
String sAge  = "26";
String sTel  = "090xxxxxxxx";
Runtime runtime = Runtime.getRuntime();
runtime.exec("run.sh " + sName + " " + sAge + " " + sTel);
#!/bin/sh
java test $1 $2 $3
public class test {
    public static void main(String[] args) {
        try {
            for (int i = 0; i < args.length; i++) {
                System.out.println(Integer.toString(i + 1) + "=" + args[i]);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

実行結果は以下の通り。別に何もおかしなことしていません。引数を受け取って、それを解釈するだけの単純なもの。

1=junmix
2=26
3=090xxxxxxxx

ただ、シェルスクリプトに渡す引数の値に空白が入ると、その瞬間に結果がおかしなことになる。以下の例と結果を参照。

String sName = "junmix";
String sAge  = "26";
#    この変数に空白を入れてみる
String sTel  = "090 xxxx xxxx";
Runtime runtime = Runtime.getRuntime();
runtime.exec("run.sh " + sName + " " + sAge + " " + sTel);
1=junmix
2=26
3=090

値に空白があると、それをパラメータの区切りだと見なされてしまい、空白の数だけ余計なパラメータが設定されてしまう。
また、引数に「*」が入るとUnix上ではディレクトリのファイル一覧を展開してしまい、異常なパラメータが設定される。
上記の例だと、パラメータは「junmix」「26」「090」「xxxx」「xxxx」となってしまい、3つ目のパラメータが狂ってしまう。
シェルスクリプトでは標準出力を行うJavaにパラメータを3つしか渡さないようになっているので、パラメータ数は3つのまま。
この二つの問題を何とかできないものかと悩んでたんだけど、Runtime#exec()の引数とシェルスクリプトの変更で一応解決?

String sName = "junmix";
String sAge  = "26";
String sTel  = "090 xxxx xxxx";
Runtime runtime = Runtime.getRuntime();
runtime.exec(new String[]{"run.sh", sName, sAge, sTel});
#!/bin/sh
java test "$1" "$2" "$3"
1=junmix
2=26
3=090 xxxx xxxx

何だかとりあえず動かしましたって感じだけど、これって正しいやり方なのか?環境依存とかじゃないだろうな?

そうそう、今日は「シェル」という言葉を使わずに「シェルスクリプト」という言葉を使うようにしておいた。理由は以下の通り。

もうねアホかと、バカかと。
じゃ、shやcshやtcshやbashやzshを指す言葉とどう区別するんだと問い詰めたい。小一時間問い詰めたい。
おまいはJavaScriptのこともJavaと言うのかと。
シェルって言ったらデフォルトのbashしか使ったことなくて、.bashrcのカスタマイズもやったことのないような彼らだから
こんなふうに略してなんの疑問も抱かないんでしょうね。
ちなみに私が最初の会社に新人として配属されたときの宿題は、文字通り「シェルを作れ」でしたけどね。Cで。
というのも、十数名の派遣のプログラマにコードを書かせることが最近の私の仕事なんですが、
彼らの8~9割くらいは普通にシェルスクリプトのことを「シェル」と略して言います。
なので「シェルを作る」なんてしれっと言った日には、
「じゃ、作ってもらいましょうか。君専用のシェルを」ととことんつっこんてやってますが。
私が入ったころの○ンフォ○ー○には、こんなプログラマはひとりもいなかったんですが…。疲れるわ。

シェルスクリプトを「シェル」と略すプログラマ

出典元はあえて出しません。いずれにせよ、今後余計な誤解を招く恐れが出てきそうなので、直せる表現はさっさと直します。

帰りに立川南からモノレールに乗ろうとしたら、デカい態度で鎮座していたVodafoneショップの態度がさらにデカくなってた。

終焉は近い。本気でどうするかを考えないと、大変なことになりそうだ。ナンバーポータビリティはまだか!?

2006/09/13 Wed.

仕様書を書く際に操作フローとか処理フローを書く必要があるんだけど、微妙に乱れてる部分が多いから書き直し。
Wordを使えばわかると思うんだけど、「図形描写」の「オートシェイプ」から「フローチャート」を選んで書くワケです。
図形を色々と描いて、それを「コネクタ」という矢印で繋ぐのが普通。で、この「コネクタ」が微妙に歪む時があるのよね。
例えば、縦に一本矢印を引きたいだけなのに、上と下の末端の横の座標が微妙にズレたりするのが気に食わない。
各種図形の描き方にもよるんだけど、とにかく絶対に歪ませたくない為に各種図形のテンプレートを自分で作成。
そのテンプレートの図形のみを使ってフローを書けば絶対に歪まないというパターンを作り、それを基に書き直しです。
そんな作業を延々と続けて、とりあえず手持ちの仕様書のフローを全て綺麗にしてみた。この方が見てて気分いいしな。

今日は職場で飲み会があった。客先の人たちも含めて「慰労の意味も含めて」とかいう名目で開催されました。
本気で慰労の意味を考えてくれているのであれば、無条件で休ませてくれるとありがたい。ってか、平日に飲みたくない。
実際に参加してみたらかなり面白い飲み会になったからいいんだけどね。平日につまらん飲み会だったら萎えまくる。
それにしても、18時くらいから22時くらいまで食って飲んでだったのに、アホみたく安いな。絶対計算ミスってる。

さて、今日は非常に下らないコンテンツを一つ追加してみた。どこに何を追加したかは、この場ではあえて伏せておこう。
見たところで誰もわかるネタじゃないだろうし、加えて内容がアホの境地に達しているため、自分でもアホらしく思えるし。

2006/09/14 Thu.

Utilitiesクラス」と「Mailクラス」のコメントを整理して、Javadocに完全対応。「Javadoc - Wikipedia」でも置いておこう。
半角スペースの入れ具合によってはJavadocで生成したドキュメントが見苦しくなる場合があるので、最適化ってワケです。
これからは真面目にJavadocを書いていくか。「Utilitiesクラス」は自分でも頻繁に使うけど、ドキュメントあると参照が楽だ。
JSPだとJavadocの書き方が超適当になるクセがあるんだけど、そもそもJSPからJavadocを生成することってあるのか?

C:\>javadoc TestJSP.jsp
          ソースファイル TestJSP.jsp を読み込んでいます...
          TestJSP.jsp: クラスまたはインタフェース宣言がありません。
          TestJSP.jsp: クラスまたはインタフェース宣言がありません。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 識別子がありません。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          TestJSP.jsp: 入力文字が無効です。
          エラー 14 個

色々とうるさいな。クラス宣言しないとメソッド記述できないって怒られるけど、JSPはクラス無しメソッドばっかじゃないか。
とにかく、自作クラスのAPI仕様書の出力ができたので、自作クラスAPI仕様書という形でとりあえず置いておこう。

2006/09/15 Fri.

CSVに関する話は以前にしたと思うんだけど、ちょっとばかり調査をしていたんで、簡単にまとめてみる。Excelベースの話。

普通の文字列,,
aaaa,bbbb,cccc
カンマが入る文字列,,
"aa,aa","bb,bb","cc,cc"
ダブルクォーテーションが入る文字列,,
"aa""aa","bb""bb","cc""cc"
カンマとダブルクォーテーションが入る文字列,,
"a,a""a,a","b,b""b,b","c,c""c,c"
数値,,
123,456,789
文字列として扱いたい数値,,
="0123",="0456",="0789"
カンマで桁区切りされた数値(事実上文字列と同様のはずだが、Excel上では数値と同様の表示),,
"16,384","32,768","65,536"

「="」と「"」で囲った値に「,」や「"」が含まれた場合の対応方法がわからない。そもそも「=""」って何を出力するためのだ?
唯一見つけたのが、「1/2」とかって出力したい場合。そのまま「1/2」と書くとExcel上で「1月2日」とか勝手に変換される。
月日に該当しない、例えば「25/100」なら問題無く表示できるけど。月日と解釈されるのを回避するくらいしかないのか?
ってことは、「="」と「"」で囲った値に「,」や「"」が含まれることはありえないと考えていいのだろうか。正式なRFCはまだか!?

さて、明日から夏休み!先月のは客先に合わせて取らされただけなので、夏休みとは言わんぞ。言ったかもしれないけど。
有休を3日ほど使って、明日16日の土曜から24日の日曜まで怒涛の9連休!さて、何もする予定ないけど、どうしたモンか。
随分前に「gadult」から旅行の誘いがあったが、当時の時点では行けるか不明だったから不参加にしておいたんだよな。
休む理由が無いなら休まなくてもいいかとも思うけど、開発中の機能の仕様が全然決まらんから、作業が進まない。
要するに、いかにして作業内容を見つけるかという意味不明な状態に陥っているワケです。いやはや困ったモンです。
っつーか、有休を一気に3日も消化していいのかな。7月末の時点で残有休21日。8月に1日使ってるから残り20日か。
今月で3日使って残り17日か?あれ、敬老の日は18日だけど秋分の日って23日?で、客先は22日が休みになってる?
客先が休みでもウチのクソ会社は休みじゃないので、ここでも有休使う必要が出てくるワケか。有休4日使って残り16日。
こりゃ一気に使いすぎだよなー、来月の6日にも客先が休みで強制的に有休取るハメになるし、無駄遣いできないかも。
やっぱ夏休み取り消す?取る理由も無いし、取り消してもよさそうな気がするな。来週には仕様決まってくるっぽいし。

ってなワケで、やっぱり夏休みは無しにするか。同じ休むなら職場で休んでいた方が一石二鳥モノになるだろうしな。

2006/09/16 Sat.

体調不良。今日が休みで助かった。有休が余っていようと無かろうと、どっちにしても有休使いたくない人だからな。