Personal tools
You are here: Home ブログ nakayama Categories 覚え書き
Document Actions

覚え書き

Up one level

Document Actions

[覚え書き] AspectJ Development Tools 1.3 for Eclipse 3.1のインストール方法

  1. AspectJ Development Tools を ダウンロードする
  2. 日本語化パッチを ダウンロードする
  3. ajdt_1.3_for_eclipse_3.1.zipを解凍する
  4. pluginsフォルダとfeaturesフォルダができるので、それぞれeclipse/pluginsとeclipse/featuresにコピーする
  5. ajdt_1.3_nls_fragment.zipを解凍する
  6. pluginsフォルダができるので、eclipse/pluginsにコピーする
  7. Eclipseを終了する
  8. Eclipseを起動する
  9. [ウィンドウ]-[パースペクティブを開く]-[その他]にアスペクト・ビジュアライザーが存在することを確認する
Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/899a304866f8304d-aspectj-development-tools-1-3-for-eclipse-3-1306e30a430f330b930c830fc30eb65b96cd5/tbping

[覚え書き] WindowsXP SP2でYs I・II完全版がオープニングで止まる

オープニングが始まる直前にIndeoコーデックがないと表示されて止まる。
調べた限りでは、こういうことらしい ↓

特定の Windows XP SP2 環境でIntel IndeoR video 5.10コーデックを利用できない
http://support.microsoft.com/default.aspx?scid=kb;ja;887326

コマンドラインで、regsvr32 ir50_32.dll したら表示されるようになった。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/899a304866f8304d-windowsxp-sp2ys-i30fbii5b8c5168724830aa30fc30cb30f36b62307e308b/tbping

Tiger! Tiger!

福島さんに、

> J2SE5.0では、javacがうまくStringを、StringBuilderに変換してくれるそうです。
> http://www.javainthebox.net/laboratory/J2SE1.5/TinyTips/StringBuilder/StringBuilder.html

ということを教えてもらいました。
Javaで文字列を連結するときはStringBufferを使うというのが鉄則でしたが、常識は変わるものです。
もっとも、うまい話を素直に信じないのが技術屋です。
というわけで、調査してみました。

最初に用意したのは、こんなコード。

class Hoge {
    public static void main(String[] arg) {
        String s = "hoge";
        s += "huga" + "muga";
        s += "huuu";
        System.out.println(s);
    }
}

JDKのjavacでコンパイルして、javapで逆アセンブルすると、

Compiled from "Hoge.java"
class Hoge extends java.lang.Object{
Hoge();
  Code:
   0: aload_0
   1: invokespecial #1; //Method java/lang/Object."<init>":()V
   4: return

public static void main(java.lang.String[]);
  Code:
   0: ldc #2; //String hoge
   2: astore_1
   3: new #3; //class java/lang/StringBuilder
   6: dup
   7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
   10: aload_1
   11: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14: ldc #6; //String hugamuga
   16: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19: invokevirtual #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   22: astore_1
   23: new #3; //class java/lang/StringBuilder
   26: dup
   27: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
   30: aload_1
   31: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
   34: ldc #8; //String huuu
   36: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
   39: invokevirtual #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   42: astore_1
   43: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream;
   46: aload_1
   47: invokevirtual #10; //Method java/io/PrintStream.println:
(Ljava/lang/String;)V
   50: return
}

と出ました。読みにくいので、適当にハンド逆コンパイルすると、

class Hoge {
    public static void main(String[] arg) {
        StringBuilder sb1 = new StringBuilder();
        sb.append("hoge");
        sb.append("hugamuga");
        String s1 = sb1.toString();
        StringBuilder sb2 = new StringBuilder();
        sb.append(s1);
        sb.append("huuu");
        String s2 = sb2.toString();
        System.out.println(s2);
    }
}

となります。
StringBuilderを二つも作ってたりして、ちょっと頭の悪いコードです。
うまくやっている感じはしません。

次に用意したのはこんなの。

class Hoge {
    public static void main(String[] arg) {
        String s = "00000";
        s += "aaaa";
        s += "bbbb";
        s += "cccc";
        s += "dddd";
        s += "eeee";
        s += "ffffff";
        System.out.println(s);
    }
}

コンパイルして、逆アセンブルすると、StringBuilderとStringを6個ずつ生成しています。
お話になりません。

でも、

class Hoge {
    public static void main(String[] arg) {
        String s = "00000";
        s += s + s + s + s + s + s + s;
        System.out.println(s);
    }
}

では、StringBuilderとStringは1個ずつしか生成されず、一つのStringBuilderに対してappend()が繰り返し呼ばれています。
どうも、Javaの一行に対してStringBuilderが一つ生成されるようです。

結論
・Javaのソースコード上、一行で連結を完結できる場合は+演算子で連結する (条件はこれであってる?)
・それ以外はStringBuilderで連結する

使い分けが面倒なら、常にStringBuilderを使います。
ただし、

・スレッド間で共有されるインスタンス変数やクラス変数は、従来通りStringBufferを使う

という条件は、常につきまといます。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/tiger-tiger/tbping

Re:Tiger! Tiger!

Posted by fukushima at 2006-02-22 10:47
ここまで調べるという姿勢がさすが中山さんですね。
脱帽です。

Genericsの罠

Java1.5で、二つのValidatorを合成したValidatorのベースになるものを作ろうとして、

public class CompositValidator<L, R> implements Validator {
    Validator[] validators;
    public CompositValidator(String name) {
        super(name);
        validators = new Validator[2];
        validators[0] = new L();
        validators[1] = new R();
    }     public boolean validate(String arg) {
        for (Validator validator : validators) {
            if (!validator.validate(arg)) {
                return false;
            }
        }
        return true;
    } }

と書いたら、コンパイラに拒否されました。
JavaのGenericsだと、コンパイル時に型パラメータが消されて実行時には型情報が残らないので、new Lとかできないんですな。
C++使いにはつらい言語です。Lを文字列化できれば、リフレクションでなんとかなるんですが、それも無理っぽいし。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/generics306e7f60/tbping

[覚え書き] 気になる本

即買いするほどの興味はないけど、気になっている本の覚え書き。


プレファクタリング―リファクタリング軽減のための新設計    THEORY/IN/PRACTICE
 http://www.amazon.co.jp/exec/obidos/ASIN/4873112729/

リファクタリングのコストを抑えるために何かするというアプローチで、それに見合った効果が得られるのか、という辺りに興味アリ。


パターン指向リファクタリング入門 ソフトウエア設計を改善する27の作法
 http://www.amazon.co.jp/exec/obidos/ASIN/4822282384/

リファクタリングするときにイディオムやデザインパターンを意識するのは当たり前だと思うけど、定式化するとどうなるのか、という部分に注目。
ただ、amazonのレビューを見る限りではリファクタリングからパターンを自然に導くための手法を解説したものに思える。
@ITの http://www.atmarkit.co.jp/fdotnet/designptn/index/index.html みたいなのなら、買うほどの興味はないしなぁ。


Write Great Code〈Vol.1〉ハードウェアを知り、ソフトウェアを書く
 http://www.amazon.co.jp/exec/obidos/ASIN/4839918201/

ハードウェア関連の知識はしばらくアップデートしていないので、タイトルだけで買いかけた。
が、目次を見ると今更な項目しか並んでいないので、興味半減。
内容によっては買うので、amazonの「なかみ!検索」に対応してほしい。


ソフトウェアファクトリー―パターン、モデル、フレームワーク、ツールによるアプリケーションの組み立て
 http://www.amazon.co.jp/exec/obidos/ASIN/489100472X/

未だにソフトウェア工場を進めている人がいたんですね。それもMicrosoftに。
これは気になります。

デマルコの批判にどう応えているのかが見物。
デマルコ大いに語る―ソフトウェア24の閃きと冴え からソフトウェア工場批判の箇所を引用しようと思ったら、本が行方不明。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/899a304866f8304d-6c17306b306a308b672c/tbping

idiom ? coding pattern ?

例えば、0~59の数列を扱うのに

int second = 0;
for (;;) {
    /* secondを使う */
    second++;
    if (second > 59) {
        second = 0;
    }
}

みたいなコードを見ることがある。
こういうのは、

int count = 0;
for (;;) {
    /* secondを使う */
    second = (second + 1) % (59 + 1);
}

と書くべきである、というのはidiomと呼ぶのか、coding patternとでも呼ぶのか?
昔読んだ本(GoF本だったかな)では、idiomは言語依存のパターンで、その上の層にはdesign patternとなっていた。
このような、言語に依存するわけではないけどdesign patternと呼ぶには大げさすぎるものは、なんと呼ぶのだろう。

ちなみに、1~12の数列であれば

month = (((month - 1) + 1) % 12) + 1;

と書ける。一度0~11にしてから剰余を求め、その後にオフセットを足してやればいい。

もうちょっと一般化すると、n~mの整数列(step刻み)は

count = (((count - n) + step) % (m - n + 1)) + n;

で得られる。nが負の値でも一緒。
stepが負の場合は、(step + (m - n + 1) * r)が正になるようなrを選んでstepとする。
stepを-1にしたmonthの例だと、stepは-1 + 12 * 1になり

month = (((month - 1) + 11) % 12) + 1;

で12, 11, 10, … , 2, 1, 12, … という数列が得られる。

 

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/idiom-coding-pattern/tbping

idiom ? coding pattern ? part2

http://dev.ariel-networks.com/Members/anaka/idiom-coding-pattern の続き。

なんと呼べばいいのか分からない粒度のpatternだが、

StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.length; i++) {
    if (i > 0) {
        sb.append(", ");
    }
    sb.append(array[i]);
}

といったコードもよく見る。
#文字列の配列["ab", "cde", "f", "ghi"]を渡すと文字列"ab, cde, f, ghi"が返ってくる。

ループ変数で条件判断をするのはループの本質に合わない(同じことを繰り返すからループである)ので、このケースなら

StringBuilder sb = new StringBuilder();
String delim = "";
for (int i = 0; i < array.length; i++) {
    sb.append(delim);
    sb.append(array[i]);
    delim = ", ";
}

とすべきだと思っているのだが、この書き方はあまり人気がないような気がする。

#念のために書いておくが、if文を書いたら負けかなと思っているわけではない。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/idiom-coding-pattern-part2/tbping

コメントが消された (Re:idiom ? coding pattern ? part2)

Posted by inoue at 2006-12-12 13:40
コメントが消された...

もしかして英語のタイトルのコメントは問答無用に消す設定ですか?

Re:idiom ? coding pattern ? part2

Posted by jian at 2007-03-23 12:04
基本的にはループから抜いた時点でchompします。
(chompはあっているかどうかわからないが、要するに最後のコンマをsubstringでカットします)

Re:idiom ? coding pattern ? part2

Posted by inoue at 2007-03-23 15:45
元のコメント(消された)には同様のことを書いていました。

ちなみに、コンテナの型によるchompのコストを気にすべき局面もあります(要素数が多い場合)。ただのLinked Listだと、chompのコストはO(n)です。

Re:idiom ? coding pattern ? part2

Posted by inoue at 2007-03-24 00:41
考えてみれば、Linked Listに大量のappendを繰り返す時点で負けです。appendのコストが低いコンテナ型なら、chompのコストも低いはずなので、jianさんの答えで正しいです。

Windows Vistaを入れてみました

新しいマシンにWindows Vistaを入れてみました
全体としてはちゃんと動きますが、ちょこちょこと細かいトラブルが

 

・SE-90PCI(ONKYOのサウンドカード)が鳴らない
  WindowsXP用のドライバをダウンロードして、インストーラを使わずにドライバの更新から入れると正しく動きそうに見えます
  が、実際に鳴らしてみると音割れしまくりのグチャグチャな音が出ます
  サンプリングレートを設定すればうまく鳴りそうだと当たりをつけて調べた結果、次の手順で解決できました

   1. VIAのページ http://www.viaarena.com/default.aspx?PageID=420&OSID=36&CatID=2910&SubCatID=107 から、envy24_family_drivers20061027sdv510beta1027.zip をダウンロードして展開します (2007/02/02時点)
   2. 展開したフォルダの中にsetup.exeがあるので、実行してインストールします
   3. インストールが終わると、Envy24 Family Audio Controller WDMというデバイスが動作しているはずです
      ただし、まともに鳴りません
   4. EnvyADeckを開きます (タスクトレイから開けます)
   5. 一番上のボタン(S/PDIF Control)をクリックして、右側のペインを開きます
   6. S/PDIF Out Enableのチェックを外します (ラジオボタンのようなUIですが、実際はチェックボックスです)
   7. Sample Rateを選べるようになるので、192を選択します
   8. コントロールパネルのサウンドを開き、Envy24 Family Audio Controller WDMのプロパティを開きます
   9. 詳細タブでサンプリングレートを「24ビット、192000 Hz (スタジオの音質)」にして、OKボタンを押します
   10. これで、ちゃんと鳴るようになります

 

・Ys I・II完全版のオープニングで画面が真っ暗
  これはいつか来た道です
   http://dev.ariel-networks.com/Members/anaka/899a304866f8304d-windowsxp-sp2ys-i30fbii5b8c5168724830aa30fc30cb30f36b62307e308b
  管理者で実行する必要があるので、Vistaの場合はちょっと手順が増えます
 
  1. スタートメニューから、[すべてのプログラム]-[アクセサリ]を開きます
  2. [コマンドプロンプト]を右クリックして、[管理者として実行]を選びます
  3. コマンドプロンプトが起動するので、「regsvr32 ir50_32.dll」を実行します
  4. 「ir50_32.dllのDllRegisterServerは成功しました」と表示されれば成功です
  5. Ysのオープニングで画面が表示されるようになります

 

・Sleipnirで設定が初期化された
  別マシン(WindowsXP)で使っているSleipnirを丸ごとコピーして実行したら、設定が完全に初期化されてしまいました
  お気に入りやRSSも全部消えてます
  Vistaになって設定ファイルを置く場所が変わったのだろうと当たりをつけて %APPDATA% を開いたら、Fenrir & Coフォルダがちゃんとありました
  Fenrir & Coフォルダの下の構造も見覚えがあります
  というわけで、C:\Program Files\Fenrir & Coから設定ファイルを%APPDATA%\Fenrir & Coにコピーして解決しました

 

・MS-IMEにxを長音記号として登録できない
  MSXユーザーなので、長音記号はxで入力するのが習慣になっています
  しかし、MS-IMEではこの設定ができないようです
  未解決ですが、ATOKの最新版を買うので問題ないはず

 

・Active Portsが動かない
  netstatすりゃいいんですが、あれば便利です
  が、管理者権限で実行したり、Windows Firewallに登録したりしても動きません
  未解決ですが、既にあきらめモードです

 

・DeamonToolsのインストーラでアドウェアが検出される
  「Daemon Tools」最新版v4.00にアドウェアが同梱 ( http://www.forest.impress.co.jp/article/2005/11/15/daemon40adware.html )を覚えていたので、アドウェアがインストールされかけたのは不思議でもなんでもない(というかインストールをキャンセルしようと待ち構えていた)のですが、Windows Defenderがこれをきちんと検出したのにはちょっとびっくりしました
  Windows Defenderは意外と使えるかも知れません

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/windows-vista30925165308c3066307f307e3057305f/tbping

Re:Windows Vistaを入れてみました

Posted by Anonymous User at 2007-02-07 12:08
つまり素人さんが使うには「むり」ってことっすね。

今までに食べたハンバーガーの数なら覚えている

たぶん4個。

牛丼は6杯。

パンの数はもちろん覚えていない。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/4eca307e306b98df305f30cf30f330fc30fc306e6570306a3089899a304830663044308b/tbping

気になるマンガ

Damons
http://www.amazon.co.jp/dp/4253211216/

がちょっと気になる。

手塚原作で、

> 30年の時を超え蘇る傑作サイコサスペンス!!
> 己の両腕と愛する妻と娘を奪われたヘイトは、すべてを奪った奴らに復讐を誓う…!!

となっているから、たぶん「鉄の旋律」を長編化したものだと思う。
最後のコマがやりきれなくて、印象に残る話。
あれをそのまま長くしても無意味だから全然違う話になってそうだけど、それはそれで面白そう。

で、Amazonのレビューに、

> 復讐の為に主人公が特殊能力を得ますが、30年も前にこんなアイディアが出るなんて・・手塚治虫先生はやはり神ですね。

というのがある。
この論理だと、半世紀前に「虎よ!虎よ!」を書いたベスターは神を超えた存在ということになるけど…それもいいか。

Category(s)
覚え書き
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/anaka/6c17306b306a308b30de30f3/tbping

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.