検索
カレンダー
2009年12月
« 11月   1月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  
ブログメニュー
Amazon検索
キーワード:

CSSによるブラウザごとの不透明度の指定方法

2009年12月14日

ブラウザごとに不透明度の指定方法が違うのですが、まとめられた記事を発見したのでメモ。

[CSS]IE8にも対応したクロスブラウザ用の不透明度の指定方法

ちなみに、こんな感じになります。

selector {
    opacity: .75; /* Standard: FF gt 1.5, Opera, Safari */
    filter: alpha(opacity=75); /* IE lt 8 */
    -ms-filter: "alpha(opacity=75)"; /* IE 8 */
    -khtml-opacity: .75; /* Safari 1.x */
    -moz-opacity: .75; /* FF lt 1.5, Netscape */
}

Eclipse3.5+m2eclipseでインデックスの作成が失敗したときは

2009年12月14日

最近、Eclipse3.5(galileo)を使い始めたのですが、m2eclipseで次のようなエラーが発生していました。

PM EDT: Error on adding indexing context http://repo1.maven.org/maven2/; read past EOF

このエラーが原因で、pomエディタで補完が利かなくなってました。

このエラーの解決方法を見つけたのでメモしておきます。

ウィンドウ → ビューの表示 → その他 → Maven → Mavenインデックス
→ MavenインデックスビューのセントラルリポジトリのURL(http://repo1.maven.org/maven2/)を選択(ないときは追加)
→ インデックスの更新

でいけるようです。

ジャンに感謝!


 # この記事を書いているときにFirefoxが2回もクラッシュしました…Firefoxもダメですね

DIのためのインタフェースって必要?

2009年12月11日

ご無沙汰しております。今日は久しぶりにプログラマっぽいことを書いてみます。

SpringFrameworkやGuiceといったDIコンテナを触っていて、いつも思うことがあります。
それは、「DIのためのインタフェースって必要?」ってことです。
よく本には「インタフェースを定義しておくことで、テスト時にモックと入れ替えることができる」とありますが、
別にインタフェースを使わなくてもできるんじゃないの?って思ってます。
実クラスにすると、IDEでインタフェースにジャンプしてイラっとしたりしませんし(笑)

例えば、(Guiceのコードからアイデアを貰いましたが)FrogManというクラスがあるとします。
そのクラスはVehicle(乗り物)というフィールドを持ち、scramble(緊急発進)というメソッドを持つとします。
Vehicleクラスの中身が出来ていない段階で、FrogManクラスをテストしたいとします。

DIの本ではVehicleインタフェースとVehicleMockクラスを作ってテストし、
本番ではVehicleImplクラスで実行するって感じだと思います。

でも、とりあえず中身が空のVehicleクラスを作っておいて、
テスト用のVehicleMockクラスはVehicleクラスを継承したらダメなんでしょうか?

文字だけならイメージが湧かないかもしれませんので、Guiceを使ったコードを書いてみます。

まず、FrogManクラスを作ります。
注入されたVehicleクラスのscrambleメソッドを呼び出す、同名のメソッドを用意しておきました。

public class FrogMan {

    @Inject
    private Vehicle vehicle;

    public void scramble() {
        this.vehicle.scramble();
    }

}

次に、Vehicleクラスを作ります。とりあえず製作中だとします。

public class Vehicle {
    public void scramble() {
        System.out.println("製作中・・・");
    }
}

次のようにして実行してみます。
FrogManクラスやVehicleクラスは実クラスですので、bindしなくても大丈夫みたいです。

Injector injector = Guice.createInjector(
    new AbstractModule() {
        @Override
        protected void configure() {
        }
    }
);

FrogMan instance = injector.getInstance(FrogMan.class);
instance.scramble();

実行すると、画面には次のように表示されます。

製作中・・・

ちゃんと注入されているようですね。次に、テスト用のVehicleMockクラスを作ります。

public class VehicleMock extends Vehicle {
    @Override
    public void scramble() {
        System.out.println("モックです");
    }
}

テストでは次のようにして実行します。
モックを使うので、VehicleクラスにVehicleMockクラスをbindしています。

Injector injector = Guice.createInjector(
    new AbstractModule() {
        @Override
        protected void configure() {
            bind(Vehicle.class).to(VehicleMock.class);
        }
    }
);

FrogMan instance = injector.getInstance(FrogMan.class);
instance.scramble();

テストを実行すると、画面には次のように表示されます。

モックです

ちゃんとモッククラスに入れ替わっているようですね。

この方法だと、テストではVehicleのscrambleメソッドの中身に関係なく実行することができるようになりますし、
インタフェースも作らなくてよくなります。

・・・これじゃダメなんですかね?