覚え書き
Up one level[覚え書き] AspectJ Development Tools 1.3 for Eclipse 3.1のインストール方法
- AspectJ Development Tools を ダウンロードする
- 日本語化パッチを ダウンロードする
- ajdt_1.3_for_eclipse_3.1.zipを解凍する
- pluginsフォルダとfeaturesフォルダができるので、それぞれeclipse/pluginsとeclipse/featuresにコピーする
- ajdt_1.3_nls_fragment.zipを解凍する
- pluginsフォルダができるので、eclipse/pluginsにコピーする
- Eclipseを終了する
- Eclipseを起動する
- [ウィンドウ]-[パースペクティブを開く]-[その他]にアスペクト・ビジュアライザーが存在することを確認する
- 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
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)
もしかして英語のタイトルのコメントは問答無用に消す設定ですか?
Re:idiom ? coding pattern ? part2
(chompはあっているかどうかわからないが、要するに最後のコンマをsubstringでカットします)
Re:idiom ? coding pattern ? part2
ちなみに、コンテナの型によるchompのコストを気にすべき局面もあります(要素数が多い場合)。ただのLinked Listだと、chompのコストはO(n)です。
Re:idiom ? coding pattern ? part2
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を入れてみました
今までに食べたハンバーガーの数なら覚えている
- 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
Re:Tiger! Tiger!
脱帽です。