Jsp.warはターミナルなのか・・・

会社から自宅PCのJsp.warにアクセスしてみると、これはリモートターミナルなんだということがわかる。コマンドこそ全く違うが、telnetでログインしてコマンドを実行するのと変わらない。
・・・
Jsp.warでEXECUTEボタンを押すと、その画面を切り替えているから悪いんだな。
特にjspエラーが発生したときに、Jsp.warのアプリケーションエラーのように見える。
そこで、フレームを切って、上フレームにjavaソースを書いてEXECUTEボタンを押すと、下フレームにジェレネートしたjspの実行結果を表示すればいいのか。
・・・
サンプルをtextareaに貼り付けて実行しているけど、実はひとつひとつがシェルのコマンドみたいなものかも。もしくはマクロみたいなもの。今はout.write();で直接出力してしまっているけど、Stringを返すメソッドを持った内部クラスにして、指定した変数名でインスタンス化すると、あたかもコマンドを実行しているように見えるかもしれない。
例えばメモリ使用状況は、以下のクラス定義を登録しておいて、

class MemoryReport {
  public String toString() {
    StringBuffer sb = new StringBuffer();
    Runtime r = Runtime.getRuntime();
    long m = r.maxMemory();
    long t = r.totalMemory();
    long f = r.freeMemory();
    sb.append("maxMemory=" + (m/1024/1024) + "MB
"); sb.append("totalMemory=" + (t/1024/1024) + "MB
"); sb.append("freeMemory=" + (f/1024/1024) + "MB
"); sb.append("usedMemory=" + ((t-f)/1024/1024) + "MB
"); } }

javaソースを入力するtextareaの上にでも、使用するマクロをいくつでも設定できるようにして、MemoryReportをONして、変数名をmrにするみたいな設定をすると、上記のクラス定義と

MemoryReport mr = new MemoryReport();

javaソースのprefixとしてgenerate.jsp内でつけてやる。
すると、mrというインスタンスがある前提で、outやapplicationなどと同様にすぐに使える。つまり、これをout.write()したいのなら、

out.write(mr.toString());

の1行でメモリ使用状況を表示することができる。つまり、MemoryReportクラスはマクロ定義みたいになるかな。
・・・
ダウンロードなんかは、内部クラスのインスタンスに、リモートファイルのパスをパラメータで渡してメソッド実行する形になる。

dl.execute("c:/temp/abc.txt");

通勤途中の思いつき・・・

メモ。

  • もしrefererが常に用意されているのなら、AOPデバッグ出力を埋め込むのが一番きれいかも
  • refererが存在するのなら、これをlog4jのカテゴリ名として渡してやる。
  • refererってちょっと変なので、意味的にはparentか。でも親クラスと勘違いしそうだな。
  • MyDebugListImplはMyListImplを継承することになるな。
public class MyDebugListImpl extends MyListImpl implements MyList {
  public void add(String key, String val) {
    //デバッグ出力
    super.add(key, val);
  }
}

まったく関係のないメモ

それでも「インターフェイスをnewしたい」と言ってみる・・・

リンクでつながっているコメント等を読ませていただいて、とっても勉強になります。いやー、ありがたいものです。
・・・
やはり「インターフェイスをnewする」というメリットはあるかなぁと思っています。ただし、java言語で実現するかどうかはまた別次元の問題があります(互換性とか言語仕様は公共物?とか)。
・・・
「new List();」という例は2つのことが混ざっていて、それが例として適切ではなかったです。1つが「ゆるい結合でインスタンスをnewする」という本質的なこと。2つ目が「不明確な指定」による違和感。
・・・
例を変えましょう。SAXパーサーにします。インターフェイス名をSaxParserとします。やりたいことは、「SaxParser p = new SaxParser();」です。いまなら、「SaxParser p = SaxParserFactory.create();」となるでしょうか? どっちが優秀でしょうか? 前者に決まっています。キータイプ数が短い。キータイプ数をバカにできないはずです。1年間でどのくらいインスタンス生成の記述をするでしょうか? トヨタ式の改善の内容と比べると、IT業界は、まだまだまだまだまだ無駄な作業が多すぎます。もし、javaが1つの企業内のシステムを構築するローカルな言語ならば、私ならばすぐに「インターフェイスをnewする」仕様変更を提案するでしょうね。経営者も変えることに賛成するでしょう。開発工数の節減ができるはずです。でもjavaがグローバルな言語だから難しいのだろうな。
・・・
インターフェイスをnewするというのは、ゆるい結合なのかな?とも思います。例えば、「List l = new java.util.ArrayList();」とコーディングをした新人君をつかまえて、「なぜ世界中にさまざまなオープンソース等が存在するのに、java.utilのArrayListの実装を選んだのか根拠を説明しろ!!!」とおどしてみたらいかがでしょうか? 1個人がベストな実装クラスなんて選べるものなんでしょうか? それよりも、自分以外の優秀な人にベストな実装を選んでもらったほうがいいんじゃないでしょうか? そんなときに「インターフェイスをnewする」なのかと。優秀な人とは誰なのか?といえば、ランタイム(VM)であったり、フレームワークであったりするのかと。
・・・
たぶんどこかにメモが残っているはずですが、自分自身でも「VMに最適な実装クラスを選んでもらう」ってどこかに書いてます。そのためには1プログラマが勝手な判断で実装クラスを特定してはいけないのかなと。DIをいう言葉を出したから間違っていました。DIの設定を決めるのは私です。従って、直接コーディングしても、DIを使っても、私が実装クラスを選ぶことに変わりありません。
・・・
さらに「new List();」が問題なのは不明確な指定だからです。例えば、「new java.util.ArrayList();」と「new java.util.LinkedList();」が交互に選ばれたどうなるか。List#get(int)メソッドを使っていたら、性能に影響が出ることになります。つまり、「どんな実装クラスが欲しいのか?」という希望条件が不明確なんです。そこで、ArrayListもLinkedListもインターフェイスじゃないのか?って思ったわけです。「new IArrayList();」と指定した場合、「配列としての特性を持っているもので適切な実装クラスをくれ」という指定となり、「new List();」より希望条件が絞られるのかなと。
今のArrayListやLinkedListが実装クラスである場合に、「new List();」はあっても、「new Collection();」はないかな。これも不明確な指定だから「とにかく何でもいいからコレクションをくれ」とはあまり言うことはないな。
・・・
最後に「ゆるい結合」ってクラス図の線がたるんでいる感じになると思います。こんな感じ"〜〜〜〜〜>"。マターリとした結合とも言えるでしょうか。・・・何言ってるんだか
・・・
#はっはっは(*^o^*)。typoで「インスタンスをnewしたい」のタイトルでトラックバックを送信してしまった。

バージョンアップしました・・・

以前は「ランタイム(VM)にDIコンテナが空気のように内蔵している」と表現しました。
バージョンアップして、「ランタイム(VM)にAIコンテナが空気のように内蔵している」のなら、「インターフェイスをnewする」のもありなのかも。
・・・
人間が実装クラスを選んでいるようでは、ハードコーディングもDIコンテナも似たりよったりだよな・・・と。
・・・
例えば、DOMインターフェイスがあり、実装クラスとしてDOM1, DOM2, DOM3とあるとする。DOM1はメモリ効率に優れ、DOM2はスピード重視、DOM3は長巨大データでもOutOfMemoryにならない実装とすれば、やはり用途によって使い分けとなる。人間が検証していては、限界があるよなと。
まぁランタイムが勝手にインターネットからダウンロードして検証して選ぶことはムリとしても、設定ファイルに候補のライブラリをXMLファイルなんかで登録しておいて、あとは運用した結果で実装クラスの性能を計って、アプリの特性にあった実装クラスなんかをチョイスしてくれたら・・・いいのに。
・・・
そういえば、パッケージ開発でも受託開発でも、「複数の実装クラスを用意しておいて、運用での成績からもっともベストなものを選ぶ」なんて絶対にやらないわな。あるとすれば宇宙空間の放射線がデータを書き換えてしまうから実装を複数作って多数決にするみたいなときだけなのかな?
・・・
気前よく同じ機能の実装3つ分の費用を払ってくれるクライアントがあればいいのに。でも、悪徳企業はお金は3つ分もらって、1つしか実装を作らない(クラス名だけ変更)なんて手抜きをするんだろうな(笑)。

人生ゲーム M&Aって・・・

玩具(がんぐ)大手のタカラは9日、証券取引法違反容疑で逮捕されたライブドア前社長の堀江貴文容疑者が開発に協力した「人生ゲーム M&A」(通常価格3780円、税込み)の出荷を自粛することを明らかにした。

なんか一度やってみたい。