HDDの本当の容量
めんどうだから、金で解決って感じだ。今後は2進表記で統一されるのかな。ちょっと気になったんだけどUSBメモリとかは、2進表記だよね。コンパクトフラッシュも? コンパクトフラッシュ型HDD(旧マイクロドライブ)はどうなんだろう。さすがに、この2つで表記が違うと紛らわしいとは思う。
そういえば新人研修の時に「AS/400の仮想アドレスは260TBで、AIXは256TB。AS/400の方が少し多いのです」とか説明していたことがあったなぁ。始めは冗談かと思ったけど、どっこい本気で、結局アドレス線が48本ってことで、一緒でしょと何度も説明したけど、分かってもらえず、自分の説明力の無さに愕然とした覚えが。あれもAS/400はメモリとDASDがプログラムからは同じに見えるので、HDD表記に習って10進表記していたんだろうな。
EclipseのRefresh automatically
Refresh automaticallyなんてオプションがあった。

これをチェックしておくと、外部で更新されたファイルを定期的に取り込んでくれるようだ。デフォルトでチェックしておいてくれればいいのに。
相互リンク
最近、相互リンクのお願いが増えてきたような気がする(月に1-2件くらいかな)。リンク先はもちろん、ちゃんと紹介文まで用意されているので簡単だ。自分が最後にリンクのお願いメールを送ったのって、いつだったか覚えていないくらい前だけど、紹介文なんて書かなかったような気がする。
あれかな、ホームページ作成入門みたいな本に、相互リンクのお願いの仕方みたいな事が書いてあるんだろうか。
最近、小桃が逃げなくなった。
結構、そばに寄っても大丈夫。

反対に富久の方が怖がりになった気がする。
半年振りくらいで幕張に。PofEAAの話をしたのだけど、あまり人が集まらなかった。来ていただいた人も、ほとんどの人がPofEAAという言葉自体を聞いたことが無いとのことで。やっぱりうちの会社は、実際に実装をしている人がわずかなんだろうな。その後の呑み会では、濃い人もいて、ちょっと安心したものの、やっぱり希少種という感じだ。逆にここまで希少になると、割と仕事には困らなかったりするので、まぁいいか(いいのか?)。
Opera
9.0を機会にOperaをまた使ってみる。というのも設定の履歴のところに、常にサーバに見に行くという設定を見つけたので(どうやら前からあった模様)。でも、この設定にするとページの表示途中でハングすることが多い。とりあえず5分に設定して様子見。パスワードとか勝手に入らないなと思ったら、Ctrl+Enterを押すのか。すっかり忘れていた。
やっぱりレンダリングは、Operaが一番速いように思う。あとフットプリントが小さい。感覚的にはFireFoxの1/4くらいな感じ。しかし無料化しても、今ひとつ盛り上がりに欠けるね。なぜなんだろう。
Google browser sync
どうもうまくいかない。ちゃんと動いている人、いるんだろうか。最初はエラー400とか出て、それはどうやらブックマークの中に不正なエンコーディングの文字があるのが原因らしく、ブックマークをいったんエクスポートして削除したら、出なくなった。しかし今度はエラーコード-1とか、ずっと応答せずとかで、どうもまともに動かない。これちゃんと動けば、便利だと思うんだけどな。
エンコーディングエラーのspam
なんか最近「失礼します」とかのタイトルのspamが届くのだけど、本文がからっぽ。どうやら本文の文字コードが不正のようでGMail側で削除してしまうようだ。そういえばspamフィルタにひっかからないように、わざと文字コードを不正にしたspamがあるという話を聞いたことがあるので、それだろうか。どうせなら、いっそのことエラーで送り返してくれればいいのに。
ビックリイコール
!=って、自分では「ビックリイコール」と読んでいたのだけど、ふと他の人がなんと読んでいるのか気になったり。=, ==, !=, equals(), !equals()って、他の人はなんと読んでいるんだろうか。英語だとイコールだとequals()と区別つかないけど、identical, assign, equalと別々の言葉があるし、とはいえ日本語だって同一、代入、等しいという言葉がある。でもif (a == b)を読み上げる時に「イフ エー と ビー が同一なら」とは読まないだろうし。英語圏ではif the a is identical to the bとか読むんだろうか。
assertとIllegalArgumentException
入力値の事前条件チェックにassertとIllegalArgumentExceptionのどちらを使うか。
assertの方が記述が簡単(IllegalArgumentExceptionを投げるstaticメソッドを用意すれば、そんなに変わらないかな)。
assertは1.4以降でしか使えない。
assertは実行時に-eaオプションが必要で、慣れていないアプリケーションサーバとかは、どこで設定するのか分からなくて迷う。
assertなら不要な時はコンパイルオプションで簡単に削除できる。
assertはうっかり副作用のある式を書いてしまうバグが起こり得る。
あとassert使うとstaticイニシャライザがコンパイラで生成されて、この部分のせいで、コードカバレッジが100%にならないことがあり、気分的にすっきりしない(笑)
static {};
Code:
0: ldc_w #5; //class Foo
3: invokevirtual #6; //Method java/lang/Class.desiredAssertionStatus:()Z
6: ifne 13
9: iconst_1
10: goto 14
13: iconst_0
14: putstatic #2; //Field $assertionsDisabled:Z
17: return
他にもあるかな...
Excel
今のプロジェクトの人たちは、Excelの達人が多く、色々な技を教えてくれる、というか会議はプロジェクタでパソコンの画面を出しながらExcelを開いてメモを書き込んでいくので、色んな技が見られるのだ。

ウィンドウの右下のところを右クリックすると、こんなポップアップが出る。ためしにデータの個数を選ぶ。一見、何も変化が無いようだが...

セルを選択すると、選択範囲の中でデータが入っているセルの個数が表示される。
OpenOfficeにもあるんだろうかと、思ったら、デフォルトで合計値が出るようになっていた。右クリックしてみると...

ポップアップが出るんだけど、この画面からみ出すのは何とかならないもんだろうか。
そういえば、自分がプロジェクタ使っている時にMeadowとかSKK使っていると、えらく便利に見えるらしく、良く聞かれる。昔は熱心に解説したりしたが、今ではあっさり「EmacsっていうのでGoogleとかで調べてみてください」程度。いや、だって解説して使うに至った人って皆無なんだもん。使う人は、何も言わなくても既に使っている。そうじゃない人は、教えてもGive upしてしまう。
WebWork2.2 のContinuations
Struts 2.0のベースになるWebWork 2.2にはRIFEを使用した、Continuationsという面白い試みがある。リンク先にサンプルがあるのだけど、
public String execute() throws Exception {
int answer = new Random().nextInt(100) + 1;
int tries = 5;
while (answer != guess && tries > 0) {
pause(Action.SUCCESS);
if (guess > answer) {
addFieldError("guess", "Too high!");
} else if (guess < answer) {
addFieldError("guess", "Too low!");
}
tries--;
}
...
public void setGuess(int guess) {
this.guess = guess;
}
このpause()のところで、クライアントに制御が返って、クライアントからリクエストが来て、guessが設定される、という動作がはさまる。つまりWebアプリを、普通のCUIなスタンドアロンアプリケーションみたいに書ける。これはアプリによっては、かなり簡単に書けるようになる気がするね。
凶暴なアメショもいるらしい。
今年は創立記念日が土曜に重なってしまい、残念。
飲み屋で、うしろの知らないおやじが「アメショは凶暴だよ、性格荒いよ」とか話していた。凶暴なアメショなんているのか。そりゃ中にはいるかもしれないが、そんなの見たことないから、想像できない。いやもしかしたら、別の猫種のことを間違えて「アメショ」と言っていただけかも。うっとんは鷹揚なので、るいもを除いてみんなに慕われているようだ。いつもみんながすり寄ってる。人間も含めて^^;
IDEで作った開発環境の移動
今のところ、NetBeansで雛形とAntスクリプト生成=>Eclipseにインポート。で、ソース修正はEmacsで、全コンパイルやJavaDoc生成はNetBeans(Ant起動のオーバーヘッドが無いので)。リファクタリングやテストはEclipse(djUnitサイコー)という感じに落ち着きつつある。
IDEは便利なんだけど、こうして作ったものを人に渡す時にいつも困ってしまう。特定のIDEに依存するのはいやだから、やっぱりAntさえあればokという状態にして渡したい。nbprojectディレクトリには目をつぶるとしても、home(WindowsだとDocuments and Settings)の内容にも依存しているから、どうも手離れが良くない気がする。確かにプラットフォームJDKとかライブラリ設定をhomeに持てば全プロジェクトで共有できるから嬉しいんだけど、人に渡す時には不便だ。
セッションのマイグレーション
セッションのマイグレーションって、ライフサイクルイベントはどうなるんだろう。やはり移動されたら、移動した側でだけvalueUnbound()が呼ばれるないと困る気がする。しかしクラスタリング環境でメモリコピー(ピアツーピア)によるフェールオーバを使っている場合って、複数のサーバにセッションオブジェクトのコピーが置かれているわけで、そうするとセッションタイムアウトした時に、どのセッションオブジェクトのvalueUnbound()を呼ぶかという判断は微妙なタイミング(サーバが落ちるタイミングとか、ネットワークが切れてハートビートが聞こえなくなるタイミングとか)に依存しそう。そうするとPofEAAの悲観的オフラインロックみたいにセッションのタイムアウトでリソースのクローズなんかしていると、ちょっと危ない気がする(呼ばれなかったり、2回呼ばれたり)。まぁしょっちゅう起きるわけじゃないし(しょっちゅう起きるなら、それは別の意味で問題)、そんなに神経質になっても仕方がないけど、ピアツーピアでセッションを持ち合うやり方は、ちょっと危険な香りがする。DBに持つか、メモリに持つ場合も一箇所のサーバに集中させておいた方が良さそうだ。
Mustang
この前、櫻庭さんから「Mustangでは、最下層がシングルスレッド化されて、高速になっている」と聞いたので、もしかしたらと思い、この件をMustangでやってみた。うん、やっぱり直っている模様。多分典型的なRace condition絡みのバグだったんだろう。症状的にも、いかにもそんな感じだし。しかし、この程度の簡単なアプリでも、明らかに速くなっているのが分かるね。
ところで、読みはマスタングでいいの?
Bill Pugh と Brian Goetz の対談
聴きとれた範囲で。
Javaのメモリモデルを理解している人は少ない。
PMDとFindBugsだと、PMDは「こうした方がいいかもね」的なサジェッションが多い。
動的言語だと、FindBugsみたいなツールは難しいよね。
最新のFindBugsだとアノテーションで、イミュータブルとか、フィールドに同期化アクセスしなければいけないという注釈を付けて、間違ったコードを見つけることができる。=>標準に入れちゃえば?
マルチプロセッサがエントリモデルにまで降りてきて、今後はシングルプロセッサでは動いていたけれど、マルチプロセッサ環境だと動かなくなったなんてケースが増えるかもね。
「日本人がFindBugsの本を出してるんだよ」と紹介もありました。^^
javax.mail.internet.MimeUtility
う、javax.mail.internet.MimeUtility.encode()のbase64エンコードって勝手に改行コードが挿入されてしまうようだ。そうかメールに埋め込む目的だからだな。とりあえず改行消しても大丈夫みたいなので、こんなんで回避。
static class ZapCRLF extends FilterOutputStream {
ZapCRLF(OutputStream out) {
super (out);
}
public void write(int b) throws IOException {
if (b != '\r' && b != '\n') out.write(b);
}
}
HttpSession.getLastAccessedTime()
HttpSessionのニセモノを作る仕事。
HttpSession.getLastAccessedTime()は、"Returns the last time the client sent a request associated with this session"とある。クライアントからのリクエストを受け付けた時間だ。そうするとセッションを生成したばかりで、まだクライアントに返っていない状態では、何を返すのが正しいのだろうか。作成時間かな。それとも0か。なんとなく0は危険な香りがするので、作成時間にしておく。
高橋メソッド
初めて生でみましたよ。
なんで、こんなに引き込まれるのか考えてみた。もちろん、どんどんチャートが変わっていくので、引き付けられるという点も、あるのだろうけど、それだけではない。
普通のプレゼンチャートだと、良くできたもので5項目くらい。大抵は7つも8つも項目が並んでいる。だから、講演者が話しているところとは全然違うところを、読んでいたりして、講演者との一体感が無くなってしまい易い。
高橋メソッドだと、1チャートに1/3 - 1/2項目くらいしかない。つまり1枚目を見ても1項目も分からないので、次のチャートが気になって引き付けられてしまう。
ストーリ性とか全体構成を感じさせない、意識させにくいように思う。普通のチャートだと数枚見た段階で、大体の全体構成とか、オチとかが透けて見えてきてしまうので、安心感はあるけれど、逆に新鮮味に欠ける。
高橋メソッドだと構成感を感じさせないため、新鮮に感じるため聞いていて飽きない。
でもこれは多分、表裏一体で、間違えると支離滅裂になって「結局何言ってたんだっけ?」となる恐れがありそう。なので周到にストーリ展開を練っておかないと失敗しそう。
今日のお話だと、最初は笑いをとる話が続いて「あぁこのまま笑いで終わりかな」と思わせておいて「フリーは手段であって、それ自体を目的としてはいけない」という主題が突然現われるので、ずしりとくる。でも実際は全然突然ではなくて、ちゃんとつながっている。普通のチャートだと、それが「分かってしまう」ので、多分先が読めてしまって「そんなのあたりまえじゃん」とかなってしまうところだろう。
で、ここには、パワポは使わないなんて書いてあるけど、実際はパワポokというかWYSIWYGが必須だそうだ。日本語や東洋の言語で有効って書いてあるけど、英語でも通用しそうに思うんだけど、どうだろう。
Swingのバグ
Sunから「再現しないからCloseしたよ。じゃね」と回答が来ていた。
日本語環境とかでしか起きない問題なんだろうか。とりあえず最初にフォーカスがあたるコンポーネントをテキストフィールド以外のものにしてごまかすか。
コーヒー
うん。確かにそう感じる。もっとも店によって違うんだろうけど。今度の常駐先はスタバが近くにあって喜んでいたら、なんかタリーズにくらべると、アイスコーヒーもエスプレッソも、すっぱくて香が無い。ドトールもあるんで試しに入ってみたら、いやこれ「なんでエスプレッソがこんなに大量にカップに入ってますか」っていう感じで、ちょっと別物だった。
コピペ
今どきサーバサイドじゃ、バイトコードサイズが問題になるなんてことは無いからコピペの問題は、重複による保守性の問題が一番だろう。
コピペすると、ペースト位置にはリンクのみが書き込まれ、内容はコピー元と共有される。リンクをクリックするとコピー元へジャンプ。コピー元を変更すると、ペースト先にも反映される。コンパイラが読む時にペースト先にテキストが展開される。リンクの状態の場合はフォントがグレーで、ダメなやつのコードは、全体に影が薄い。ペースト先で中身を変更した時点で本当のコピーが起きて、変更した部分だけフォントの色が元に戻る。IDEの中で完結する仕組みなら可能そうだ。だれか作って(笑)。
メニューのニモニックキーが、テキストフィールドに入力されてしまう。
右クリックして、ニモニックキーの'p'を押すと、

次に表示されたダイアログ上のテキストフィールドに"p"が入力されてしまうことがある。うちの環境だと10回に1回くらい起きる。

Bug Parade見ると、1.2あたりのころから報告されているようだけど「再現せず」で終わっているみたい。だめもとで新たに(ID 725191)で入れてみた。
import java.util.*;
public class Test extends javax.swing.JFrame {
public Test() {
jPopupMenu1 = new javax.swing.JPopupMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem1.setMnemonic('P');
jMenuItem1.setText("Property");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jPopupMenu1.add(jMenuItem1);
getContentPane().setLayout(new java.awt.FlowLayout());
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
formMouseClicked(evt);
}
});
pack();
}
private void formMouseClicked(java.awt.event.MouseEvent evt) {
jPopupMenu1.show(this, evt.getX(), evt.getY());
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
new NewJDialog(this, true).setVisible(true);
}
static class NewJDialog extends javax.swing.JDialog {
public NewJDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().add(jTextField1, java.awt.BorderLayout.NORTH);
jButton1.setText("CLOSE");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1, java.awt.BorderLayout.SOUTH);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
setVisible(false);
}
javax.swing.JButton jButton1;
javax.swing.JTextField jTextField1;
}
public static void main(String[] args) {
Test test = new Test();
test.setBounds(0, 0, 300, 300);
test.setVisible(true);
}
javax.swing.JButton jButton1;
javax.swing.JMenuItem jMenuItem1;
javax.swing.JPopupMenu jPopupMenu1;
}
String.split()
便利なのは分かるけど、ループの中で、
firstOccurence = xxx.split(", ")[0];
とか。要は最初に見つかった", "までの文字列を切り出したいだけみたいなのだが。裏ではループで毎回正規表現のコンパイルと、(結局先頭しか使わないのに)結果配列の生成が。気が遠くなる... せめてsplit(", ", 2)[0]としてもらうか。でも正規表現のコンパイル時間の方が支配的な気がする。
Struts
知らないうちに、結構ややこしいことになっていたのね。
Struts Action 1
従来のStruts。現在1.2.9。1.1との違いはわずか。1.3がテスト用に提供されている。2006第二半期の始めに提供予定。引き続きメンテナンスされる。
Struts Action 2
新しいStrutsで、2.0はOpenSymphony社のWebWork2.2をベースにしている。WebWorkはStruts 1.xのリクエストベースのパラダイムのWebアプリケーション用フレームワーク。技術的にはWebWork2.3と同じものになる予定(WebWorkはここで打ち止めの予定)。Struts Action 1を元にしているが、新規に実装し直している。Struts Tiの提案(2005/11)のPhase 1を元にしている。WebWork2.3は2006/3にApacheに寄贈。2.0.0は2006/8にリリースの予定。Java 5.0でのみ稼働。それ以前のバージョンはretroweaverを使用。
Action 1とAction 2
Action 2.0には、1.3が同梱される。Action 1.xとAction 2.0は同時稼働でき、メッセージ、バリデーションルール、タイルは共用できる。設定ファイルのマイグレーションツールが提供される予定。Action, ActionForm, Pluginは2.0でも動作する。完全な互換性は提供されないだろうが、最大限の努力がなされる。
Struts Shale
コンポーネントベースでJSFと共に使用。あまり調べてない ^^;
どうもJavaの世界ではコンポーネントベースはあまり、はやっていないようだ。Action 2.0はRailsもかなり意識している模様。
DocBook
DocBookってどうなの? 最近ドキュメントはこれってのが多い気がする。LaTeXもいいんだけど図を入れた時の文書の回り込みとか、段組(minipage)とかに微妙に難があって、最近はあまり使わなくなってしまった。
NetBeansとレイアウトマネージャ
NetBeansではGUIエディタでレイアウトマネージャが設定できるのだけど、何かの拍子に子供のコンポーネントにレイアウトマネージャを設定するコードが出るようになってしまうことがある。子供のコンポーネントは自分のコンストラクタの中から、initComponents()を呼んで、その中で自分自身のレイアウトマネージャを設定済みだから、結局2回レイアウトマネージャが設定されてしまうことになる。で、そうなると画面が表示されなかったり、色々と妙なことが起きる。今日はそれにはまった。
でGUIエディタには「レイアウトマネージャについて何もしない」という設定が無いので困る。formファイルがXMLなのが救いか。開いて、手で削除してやれば復活する。
微妙にEclipseが使いにくいと感じるところ。
結局ある程度のコードを書くとなるとEmacsの操作性にはかなわない。それはいい。大抵は両者を往き来すれば良いだけだ。編集後に、Eclipseに戻って来た時に、開いているファイルであれば、再ロードするかと聞いてくれるから、Yを押せば良い。開いていなくても、元々プロジェクトに入っているファイルであれば、clean buildすれば良い。問題は、新規にファイルを作った時だ。そのままでは認識されないので、プロジェクト選んで更新をかけないといけない。これが微妙にめんどい。単一プロジェクトで作業していればいいのだけれど、ある程度の規模になると複数プロジェクトに分けるので、いちいちプロジェクトを選んでF5を押すのが億劫になる。NetBeansだと、とにかくclean buildすればいいので、だんだんイライラしてきてNetBeansを立ち上げてしまう。でも、いらないimportの削除とか、親クラスのコンストラクタ呼び出しの追加とか便利な機能もあるので、結局両方立ち上げて512MB以上メモリ使っていたり。
今日はいい天気だ。
天気がいいのに、World of Warcraftにはまったり。やっとLevel 39になった。Level 40になると馬に乗れるようなので、だいぶ移動が楽になるはず。なのだけどオークションにはまって、銅の延べ棒を作っては出品していたりするので、ちっともLevelが上がらなかったりする。
findbugs-1.0.0 rc2
出た模様。net.jcip.annotations.*というアノテーションが増えて、ソースの意図を伝えられるようになっている。@Immutableとか付けておくと、フィールドがfinalでない時に警告してくれる。そのうちセッタとかにも警告してくれるようになるのだろう。net.jcip.annotations.GuardedByというのもあってフィールドへの同時並行アクセスを規定するようだ。
throws Exception
うーむ、throws Exceptionつけるのがクセになっているんだろうか...
private Util() throws Exception{
// nop
}
NetBeansがNPE
なんかNetBeansのupdateを入れたら、ぬるぽで起動しなくなってしまった。どうもsubversionまわりで落ちているようだ。アンインストール/インストールでも回復せず。レジストリ探しても、それらしいキーが無いし。daily buildを入れて回復。
さすがに64MBだと。
ThinkPad390。さすがに64MBだと、Windows2000でもFireFoxは重すぎ。3-4個タブを開くと、スラッシング状態になる。こういうギリギリ環境だとやっぱりOperaが一番軽く感じる。
i1124の方は結局Debianを導入。RTL8139のPCMCIA LANは、認識はするものの、eth0のリンクupの後で認識されるので立ち上がり後に手動でifup eth0しないと動かない。








