Eris 0.3.4でメニュー周りを充実させてみた。
インストーラー版もあるよ(゜▽、゜
Eris 0.3.2は、Radikoの4/7のセキュリティ強化前のやつなので、
起動できるけど録音系は全滅なのだ。
その関係で、Erisの新しいのに入れ替えても、起動するとエラーになる場合がっ。
そんな場合は、設定ファイル、特に、Cache〜のファイルとかを消すと起動できるはず。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
4/7のRadikoセキュリティ強化?で録音が出来なくなってたので修正したのをアップしたのだ。
他の修正とかしてたところで気づいたので、ちょっと機能が中途半端かもだけど、まぁ、いいよね。
ついでに、MSI形式のファイルも作ってみた。
Windowsのインストールウィザードって言うのかな?で入れられるはず!
ライトな人はこういう方がいいんだよね、きっと。
Weldの1.0.0.SP1と1.0.1-CR2がダウンロードできなくなって、1.0.1-Finalだけになった。
あとEclipseLinkも2.0.1になってる。
というわけで新しくTomcatで動く組み合わせを確認してみたよ(゜▽、゜
jarの名前+Version | どこから? |
jsf-api-2.0.2.jar | Mojarra 2.0.2 |
jsf-impl-2.0.2.jar | Mojarra 2.0.2 |
javax.inject-1.0.1-Final.jar | JSR-299 TCK 1.0 1.0.1-Final(Weldの側から) |
cdi-api-1.0.1-Final.jar | Weld 1.0.1-Final |
weld-api-1.0.1-Final.jar | Weld 1.0.1-Final |
weld-core-1.0.1-Final.jar | Weld 1.0.1-Final |
weld-servlet-1.0.1-Final.jar | Weld 1.0.1-Final |
weld-spi-1.0.1-Final.jar | Weld 1.0.1-Final |
weld-tomcat-support-1.0.1-Final.jar | Weld 1.0.1-Final |
javax.persistence_2.0.0.v201002051058.jar | EclipseLink 2.0.1 |
eclipselink-2.0.1.v20100213-r6600.jar | EclipseLink 2.0.1 |
validation-api-1.0.0.GA.jar | Hibernate Validator 4.0.2.GA |
hibernate-validator-4.0.2.GA.jar | Hibernate Validator 4.0.2.GA |
jp.empressia.jsf.scope.view-1.0.1.20.jar | Empressia |
jp.empressia.logging-1.0.0.12.jar | Empressia |
jstl-api-1.2.jar | JSTL(GlassFishのサブプロジェクト) |
jstl-impl-1.2.jar | JSTL(GlassFishのサブプロジェクト) |
javassist-3.11.0.jar | Javassist 3.11.0(Weldのため) |
google-collect-1.0.jar | Google Collection 1.0(Weldのため) |
dom4j-1.6.1.jar | ネットから探して(Weldのため) |
ログ周りは、Weldのservlet.jarかな。に入ってるので別に持ってくる必要はないのだ。
あとEJBのもぽいぽい!ってことで、GlassFishV3から持ってきてたのも取り除いてみた。
あと、WeldのSP1の時は、servet-intが必要だったけど、今回はservletになってるね。
うーむ、20個まで減った!(゜▽、゜いいことだ
WeldはbeforeShutdownが呼ばれるようになったし本当に良かった……(ρ_;)
でもやっぱりGlassFishが良いデス。
Weld(CDI)が1.0.1-FinalにVersionがあがってたので、
ViewScopedのjp.empressia.jsf.scope.view.jarもバージョンを上げて対応したよ。
それにしてもAPI変わりすぎ(笑)
影響されて、1.0.1.19と1.0.1.20で大分変わっちゃった。
1.0.1.19がWeld 1.0.0.SP1用で
1.0.1.20がWeld 1.0.1-Final用ね。
いろんなサイトで、「JPAをTomcatで」とか。「JSFをTomcatで」とか。
まぁ、色々あるけど、全部一緒に動かす例って無いんだよね。
整合性保つのが大変なのかな?
jp.empressia.scope.view.jarをテストするために色々放り込んで動く環境を確認したので、
これなら動く!って言うのをメモっておくのだ。
Tomcatは6.0.24ね。
JSF2.0(mojarra)+CDI1.0(Weld)+JPA2.0(EclipseLink)と
BeanValidation1.0(Hibernate Validator 4)を入れるのだ。
あとWeld用ViewScopedもね!
ちなみに、jarのバージョン番号とかはわたしが勝手につけた部分もあるので注意。
jarの名前+Version | どこから? |
jsf-api-2.0.2.jar | Mojarra 2.0.2 |
jsf-impl-2.0.2.jar | Mojarra 2.0.2 |
javax.inject-1.0.1-CR1.jar | JSR-299 TCK 1.0 1.0.1-CR1(Weldの側から) |
cdi-api-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
weld-api-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
weld-core-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
weld-logger-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
Weld 1.0.0.SP1 | |
weld-servlet-int-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
weld-spi-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
weld-tomcat-support-1.0.0.SP1.jar | Weld 1.0.0.SP1 |
javax.persistence_2.0.0.v200911271158.jar | EclipseLink 2.0.0 |
eclipselink-2.0.0.v20091127-r5931.jar | EclipseLink 2.0.0 |
validation-api-1.0.0.GA.jar | Hibernate Validator 4.0.2.GA |
hibernate-validator-4.0.2.GA.jar | Hibernate Validator 4.0.2.GA |
log4j-1.2.14.jar | Hibernate Validator 4.0.2.GA |
jp.empressia.jsf.scope.view-1.0.1.18.jar | Empressia |
jp.empressia.logging-1.0.0.12.jar | Empressia |
jstl-api-1.2.jar | JSTL(GlassFishのサブプロジェクト) |
jstl-impl-1.2.jar | JSTL(GlassFishのサブプロジェクト) |
javassist-3.11.0.jar | Javassist 3.11.0(Weldのため) |
google-collect-1.0.jar | Google Collection 1.0(Weldのため) |
dom4j-1.6.1.jar | ネットから探して(Weldのため) |
javax.ejb-glsasfishv3.jar | GlassFishV3の中 |
weld-osgi-bundle-glassfishv3.jar | GlassFishV3の中 |
slf4j-api-1.5.10.jar | SLF4J 1.5.10(Hibernate Validatorと他の調整のため) |
slf4j-ext-1.5.10.jar | SLF4J 1.5.10(Hibernate Validatorと他の調整のため) |
slf4j-log4j12-1.5.10.jar | SLF4J 1.5.10(Hibernate Validatorと他の調整のため) |
cal10n-api-0.7.2.jar | ネットから探して(Hibernate Validatorと他の調整のため) |
全部で29個……( ̄▽ ̄;;)
Tomcatでこれだけめんどくさいの調整するくらいならGlassFishかなぁ(笑)
それぞれのバージョン上げるのも大変そうだね、これ(゜▽、゜
そうそう、これだけがんばってもEL式でメソッド#{bean.method()}みたいなのは使えませんw
EL式使えるようにするには、Tomcat改造しないと無理っぽいから……。
さすがにそんなことするくらいならGlassFishV3でしょ!
あ!これで安心しないように!
DB使うならそれのjarも必要だからね!あわせてTomcatのlibに投入('-^*/⌒°
で、設定ファイルはねー。
Tomcatのconf/context.xmlでしょ〜。WeldのBeanManagerとDBのDataSourceを設定!
WEB-INF/faces-config.xmlでしょ〜。JSF2.0で設定!1.2にしないに注意だよ!
WEB-INF/beans.xmlでしょ〜。からっぽでもは忘れないようにっ!
META-INF/persistence.xmlでしょ〜。RESOURCE_LOCALでnon-jtaだね!
WEB-INF/web.xmlでしょ〜。FacesServletとかいろいろ!
ふー、設定完了(゜▽、゜起動してみてね!
え?動かない!?(ρ_;)イイモン わたしはこれで動くもん
JSFとCDI使ってWebアプリをいじっていたら、やっとわかったきがした(゜▽、゜
なにがって、なんていうか、実現する構成の方向性みたいなのが。
JSFはStrutsと違ってコンポーネントベースって言われるフレームワークなのね。
Strutsは、URLへのRequest(引数)に対して対象のAction(関数)を呼んで、画面(戻り値)を返す感じ。
JSFは、URLに対応する画面(オブジェクト)があって、画面のアクション(イベント・メソッド)で、状態を変化させていく。
まぁ、どっちもまともに使ったこと無いけど(笑)
Strutsは関数指向。JSFはオブジェクト指向な感じだね。
関数指向は処理が分散しがちでメンテナンスはちょっと気を抜くと大変なことになる。
オブジェクト指向は、正しく作ればメンテナンス性は高くなるけど、処理を分散しにくい。
そうなると、棲み分け的には、
クライアントのアプリとかは、オブジェクト指向で作って、
最近よく聞く、クラウドっていうのは、関数指向で作ることになるんだろうね。
まぁ、オブジェクト指向は、関数指向を受け入れない訳じゃないから、
ハイブリッドとかもあり得るだろうけど。
まぁ、普通の(?)Webアプリ作るならJSFの方が管理とかはずっと楽って言うこと〜。
そして、クライアントとサーバーをまとめて見下ろすと、なんか別の世界が見えてきた。
「あ、これってWPFと同じMVVMじゃん。」
結局、『.NET』も『Java』も行き着くところに行き着いた。という感じなのかな?
MVVMって言うのは、MVCの派生みたいなの。Model-View-ViewModelって感じのやつ。
難しいことはよくわかんないけど、わたし的解釈は、下(↓)に書いたような感じかな。
「画面(View)と画面に出すもの(ViewModel)の関係は、
View→ViewModelでしかもバインドとして疎結合であるべき。
Modelからの依存は許さない。」
バインドってことはその外側でバインディングを管理している人がいるわけなのをお忘れ無く!
フレームワーク | View | ViewModel | Model |
---|---|---|---|
WPF | .xamlファイル | .xaml.csファイル | その他 |
JSF+Weld | .xhtmlファイル | .xhtmlに対応した(Managed)Bean | その他 |
結局、どっちもViewに対してViewModelを割り付けて、
Viewで発生したイベントをViewModelで拾ってModelに流してるのね。
JSFだけだと、Modelを完全に切り離すのがめんどくさそうなので、Weldの力を一緒に使うのが良さそう。
っていうことで、Webアプリを作るならJSF+CDI(Weld)が楽っぽいなー。
特にわたしはクライアントアプリ中心にオブジェクト指向でやってきたし(笑)
jp.empressia.scope.view.jarがTomcatで動かないって言う話があって、修正したよ。
Version1.0.1.18ってことで少し数字上げた〜(゜▽、゜
ついでに、サーバーシャットダウン時(再デプロイとかの時)に、
シャットダウンに時間がかかる(最大10分とか)みたいだったので確認したのだ。
なんか、WeldとかTomcatとかGlassFishのSessionと起動周りの動きとか、
いくつかくぐり抜けないといけないところが多そうだったから、
JSF2.0に依存する形で構造見直しして綺麗に動くように対応したよ。
これで、JSFのViewの破棄とかとリンクして、正しいタイミングで@PreDestroyとかが呼ばれるはず!
Inject系を作るのは簡単だったけど、破棄系を整理するのが結構大変だったo(__oポテ
ダウンロードはこの辺からね☆
jp.empressia.jsf.scope.view.jar
jp.empressia.logging.jar
よく使う?とわたしが独断で思うやつを勝手に一覧化(゜▽、゜
他にどんなのよく使うのかな〜?(・_・?)ハテ
あと、こっそりEmpressiaライブラリも入ってたりする(゚ー゚)ニヤニヤ
画像版↓
製品 | 仕様(依存) | アノテーション | パッケージ | 個人的分類 | 期待効果 |
Weld | CDI | @Named | javax.inject | Inject対象管理 | Inject管理対象としてマーク。 |
Weld | CDI | @Inject | javax.inject | Inject対象管理 | Inject先のフィールド、Injectするための特殊処理を挟むメソッドを指定する。 |
Weld | CDI | @Qualifier | javax.inject | Inject対象管理 | InjectとProducesを結びつけるマッピング。 |
Weld | CDI | @Produces | javax.enterprise.inject | Inject対象管理 | Inject元のィールド、Inject元を生成するメソッドを指定する。 |
Weld | CDI | @Disposes | javax.enterprise.inject | Inject対象管理 | 破棄される時に呼ばれるのを指定。 |
Weld | CDI | @ApplicationScoped | javax.enterprise.context | Injectスコープ管理 | アプリケーション単位での生成と破棄。 |
Weld | CDI | @SessionScoped | javax.enterprise.context | Injectスコープ管理 | セッション単位での生成と破棄。 |
Weld | CDI | @RequestScoped | javax.enterprise.context | Injectスコープ管理 | リクエスト単位での生成と破棄。 |
Weld | CDI | @ConversationScoped | javax.enterprise.context | Injectスコープ管理 | 業務単位での生成と破棄。 |
Weld | CDI | @Dependent | javax.enterprise.context | Injectスコープ管理 | Injectされる元に依存した生成と破棄。 |
Weld | CDI | @NormalScoped | javax.enterprise.context | Injectスコープ管理 | 新しいスコープを定義するために使う。 |
Empressia | Weld | @ViewScoped | jp.empressia.jsf.scope.view | Injectスコープ管理 | JSFの画面単位での生成と破棄。 |
Common Annotations | Common Annotations | @PostConstruct | javax.annotation | Inject生成管理 | Inject生成完了した時に行う処理。 |
Common Annotations | Common Annotations | @PreDestroy | javax.annotation | Inject生成管理 | Inject破棄する前に行う処理。 |
EclipseLink | JPA | @Entity | javax.persistence | 永続化管理 | EntityManagerの管理対象としてマーク。 |
EclipseLink | JPA | @Id | javax.persistence | 永続化管理 | 主キーを指定する。ID指定された対象のEntityが複合主キーを持っている場合は、ばらしたフィールドを別途用意して、@Idをつける必要がある。 Id関連は@Columnとかで名前を指定した方が良いかも。@JoinColumnとか必要になってくるし。 |
EclipseLink | JPA | @OneToMany | javax.persistence | 関連数指定 | 1対多の関係のあるフィールドに指定する。主にListのフィールドに指定する。相手側からの依存が基本の場合はmappedBy属性を指定する。 |
EclipseLink | JPA | @ManyToOne | javax.persistence | 関連数指定 | 多対1 |
EclipseLink | JPA | @OneToOne | javax.persistence | 関連数指定 | 1対1 |
EclipseLink | JPA | @ManyToMany | javax.persistence | 関連数指定 | 多対多 |
EclipseLink | JPA | @MapKey | javax.persistence | 関連指定 | 主にMapなフィールドに指定する。※詳細は確認してない。 |
EclipseLink | JPA | @Embeddable | javax.persistence | テーブルマッピング | フィールドの形で同じテーブルに組み込むための定義側指定。 @PrePersist等は動かない。@MappedSuperclassと@Entityのみで動作する。 |
EclipseLink | JPA | @Embedded | javax.persistence | テーブルマッピング | フィールドの形で同じテーブルに組み込むための指定。 |
EclipseLink | JPA | @MappedSuperclass | javax.persistence | テーブルマッピング | これを定義したクラスをEntityで継承すると継承元も永続化対象になる。 @Embed〜系と違って、@PrePersistを定義しておくと動作する。 |
EclipseLink | JPA | @PrePersist | javax.persistence | 永続化対象管理 | Insert前に行う処理を指定。 |
EclipseLink | JPA | @PreUpdate | javax.persistence | 永続化対象管理 | Update前に行う処理を指定。 |
EclipseLink | JPA | @Temporal | javax.persistence | 詳細指定 | 日付系に指定する。 |
EclipseLink | JPA | @OrderBy | javax.persistence | 詳細指定 | 順序指定。 |
EclipseLink | JPA | @Transient | javax.persistence | 詳細指定 | 永続化対象外マーク。 |
mojarra | JSF | @ManagedBean | javax.faces.bean | 画面対象管理 | Weld使う時は使用しない。 |
mojarra | JSF | @ManagedProperty | javax.faces.bean | 画面対象管理 | Weld使う時は使用しない。 |
mojarra | JSF | @ApplicationScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @SessionScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @RequestScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @ViewScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @CustomScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @NoneScoped | javax.faces.bean | スコープ管理 | Weld使う時は使用しない。 |
mojarra | JSF | @FacesConverter | javax.faces.convert | 画面管理 | 独自クラスをプルダウンとかチェックボックスとかに使う場合の定義に使用する。 |
mojarra | JSF | @FacesValidator | javax.faces.validator | 画面管理 | 独自の入力のチェックを定義する。フロントエンド用。 |
-- フェーズ1
-- 前提処理
CREATE TABLE SIMPLE_TEST (
ID CHAR(8) NOT NULL,
NAME VARCHAR(64) NOT NULL,
PRIMARY KEY (ID)
)
ENGINE = InnoDB;
INSERT INTO SIMPLE_TEST (ID, NAME) VALUES ('0001', 'オリジナルネーム1');
INSERT INTO SIMPLE_TEST (ID, NAME) VALUES ('0002', 'オリジナルネーム2');
-- フェーズ2
-- Aさん作業
-- Aさんトランザクション開始
SELECT * FROM SIMPLE_TEST;
UPDATE SIMPLE_TEST SET NAME = '名前上書き' WHERE ID = '0001';
-- Bさん
-- Bさんトランザクション開始
SELECT * FROM SIMPLE_TEST;
-- フェーズ3
-- Aさん作業
-- Aさんコミット
-- フェーズ4
-- Bさん作業
SELECT * FROM SIMPLE_TEST;
-- ↑Aさんがコミットした値が見えない。
UPDATE SIMPLE_TEST SET NAME = '名前上書き' WHERE ID = '0001';
-- ↑UPDATE件数が0件で正常に終わる。
SELECT * FROM SIMPLE_TEST;
-- ↑UPDATEされたと思っている値が見えない。
-- Bさんコミット
-- ↑仮にCさんが別作業でコミットしててもBさんがやろうとした更新は何も反映されない。
JavaEE6がでて、おもしろそうなのでいろいろ実験してたんだけど、
Context and Dependency Injection(CDI)って言うのがおもしろいね。
実装は、Weld。JavaSEでも動くみたいだし!
JSF2.0のmojarraとWeldを使ってて、なんだろ、InjectionはやっぱWeldの方がいい(゜▽、゜
さすがって感じ?(なにがっ
でもでも、JSF2.0にはViewScopedがあるんだけど、
Weldには無いんだよね。
かといって、CDI(Weld)のConversationScopedは、JSF2.0にはない……。
ネット見てたら、やっぱ作るしかないらしい……。
というわけで作った!
ダウンロードページ
下の2個のライブラリをlibの中にでも放り込めばOK
jp.empressia.jsf.scope.view.jar
jp.empressia.logging.jar
あとは管理対象に、SessionScopedとか、ConversationScopedと同じように、ViewScopedを書くだけ〜☆
あ、ViewScopedは、JSFの方じゃなくて、jp.empressia.scope.view.ViewScopedね。
便利になった(゚ー゚)(。_。)(゚-゚)(。_。)ウンウン
まだ微妙におかしいところがあるかな……。基本的な動きは大丈夫っぽいので、そこだけ修正しないとダメかな?φ(。。めもめも
↑2009/12/27 追記:1.0.0.15で対応済み♪