検索
カレンダー
2012年 5月
« 3月    
 12345
6789101112
13141516171819
20212223242526
2728293031  
ブログメニュー

Faceletsではc:タグとui:タグを混在しないほうがいいみたい

2010年3月2日

FaceletsではJSFのタグ(ui:repeat等)とJSTLのタグ(c:if等)が使えます。

ですが、評価されるタイミングが違うので混在すると思った通りに動かないことがあります。
JSFのタグはレンダリングの際に評価され、JSTLのタグはコンパイルの際に評価されるようです。

たとえば、以下のような書き方をしても、c:if タグの条件は思った通りに評価されません。

<ui:repeat var="member" value="#{members}">
    <c:if test="#{member.admin}"><span class="admin">ADMIN</span></c:if>
    <c:if test="#{!member.admin}">MEMBER</c:if>
    <br />
</ui:repeat>

ui:repeatの代わりにc:forEachを使うか、次のようにc:ifの代わりにui:fragmentを使えば同じタイミングで評価されます。

<ui:repeat var="member" value="#{members}">
    <ui:fragment rendered="#{member.admin}"><span class="admin">ADMIN</span></ui:fragment>
    <ui:fragment rendered="#{!member.admin}">MEMBER</ui:fragment>
    <br />
</ui:repeat>

Firefoxを早くするための2つの方法

2010年2月5日

最近、「○○するための○個の方法」みたいな記事が増えてきているので、敢えて乗ってみます。

今回は、「Firefoxを早くするための2つの方法」です。


SQLite Optimizer アドオンを入れる

一つ目の方法は SQLite Optimizer アドオンを使います。詳しい使い方は『Firefoxのデータベースを最適化して高速化を図るアドオン「SQLite Optimizer」』を参照してください。

外部ツールの Fireboot を使う

二つ目の方法は、外部ツールのFIrebootを使います。詳しい使い方は『アドオンから不要な言語ファイルを削除してFirefoxの起動を高速化するソフトウェア「Fireboot」』を参照してください。


・・・参照ばっかりですいませんです。

Hibernate Validator を自動的に動作させないようにするには

2010年1月28日

Hibernate Validator を Hibernate と組み合わせるとINSERTやUPDATEするときに自動的に動作しますが、アプリケーションレベルでバリデーションを行っているときは、この動作が只のオーバヘッドになってしまいかねません。

この自動バリデートを停止するには、hibernate.validator.autoregister_listeners を false にすればいいみたいです。

Hibernate Validator のリファレンスマニュアルによると『Such a need is very uncommon and not recommended.』らしいですが(^^;
(2010年2月17日追記)
これは Hibernate Search を使うときの警告みたいですね。単体で使うときは非推奨じゃないみたいです。

参照:
Hibernate Validator: Chapter 2. Using the Validator framework
Hibernate Annotations: Chapter 4. Additional modules

HibernateEntityManagerでのクエリキャッシュ

2010年1月25日

HibernateEntityManagerを使ってJPA実装としてHibernateを使うときに、クエリキャッシュの有効/無効の切り替え方がわからなくて調べたのでメモ。

まず、 persistence.xml で hibernate.cache.use_query_cache を true に設定します。

次に、ソースコードで EntityManager から作った Query に対して、以下のように設定します。

query.setHint("org.hibernate.cacheable", true);

これで、その query に対してクエリキャッシュが有効になります。

ジェトロに感謝!

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メソッドの中身に関係なく実行することができるようになりますし、
インタフェースも作らなくてよくなります。

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

PHP用の組み込みDB

2009年11月16日

PHP用の組み込みDBを探してみました。JavaのHSQLDBやH2DBみたいに、アプリケーションに同梱して配布できたらいいなぁ・・・と。

PHPならMySQLとかが使いやすいんでしょうけど、不特定多数の人に配布するには敷居が高いような気がするんで。解凍してサーバのディレクトリに置くだけで使えるようなものが欲しかったんです。

検索してみると、見つけました。

その名も「Posql」!

普通のファイルをDBとして扱え、しかもSQLが使えるようですね。

今すぐには必要ないので忘れないようにメモ。いつか使ってみたいものです。

Javaにブラウザ機能を組み込めるかも

2009年10月29日

WebKit for SWT というライブラリを見つけました。

どうやらSWTからWebKitの機能が利用できるようです。まだ試していないのでどこまでできるかわかりませんが、デモを見る限りJavaScriptやFlashもバリバリ動くようですね。

Javaで作られたブラウザとか、Javaの知識だけでRIAを作るとかできるかもしれません。

将来役立ちそうなのでメモ。

複数枚に渡るWebページ印刷時のヘッダ表示

2009年10月23日

大きなテーブルが含まれたWebページを印刷したいという要望をいただきました。

HTMLのheadタグの中で次のように指定することで、印刷時のみ適用されるスタイルシートを指定することができます。

<head>
  ...
  <link rel="stylesheet" type="text/css" href="print.css" media="print" />
  ...
</head>

普通のページなら、このスタイルシートの中でロゴとかメニューのスタイルをdisplay:none;にするだけなのですが、ページの中に大きなテーブルが存在するときは、もうひと工夫必要です。

大きなテーブルを印刷すると、途中で改ページされた場合に2ページ以降はヘッダが表示されなくなる場合があります。テーブルのヘッダを2ページ以降も表示するようにするためには、cssファイルに次のような定義を追加し、テーブルのヘッダにしたい行をtheadタグで囲んでください。

thead {
  display: table-header-group;
}

規約では、デフォルトで設定されているはずなので、ブラウザによってはそのままで表示されるかもしれません。