2009年12月31日木曜日

最初の年末を迎えることが出来ました。

何とかかんとか、お陰さまで会社としての最初の年末を迎えることが出来ました。
従業員をはじめ、お客様や弊社を支えてくれている皆様のお陰です。本当にありがとうございます。

弊社は6月決算ですので、準備期間も入れてようやく丁度半年になろうか、というところでまだまだまだまだ・・・ですが、今後とも邁進して参ります。

2009年12月28日月曜日

[EJB3] EJB 3.1リンク纏め

個人的に注目度の高いEJB 3.1の記事のリンクを纏めてみました。
ちょっと古いのもありますが、纏めて読むと何となくわかる?

http://d.hatena.ne.jp/shin/20091219/p3
http://d.hatena.ne.jp/shin/20080614/p4
http://blogs.sun.com/enterprisetechtips/entry/a_sampling_of_ejb_3
http://www.infoq.com/jp/news/2008/04/ejb31draft
http://journal.mycom.co.jp/news/2007/07/23/041/index.html
http://weblogs.java.net/blog/2009/06/02/ejb-31-release-third-quarter-2009
http://blogs.sun.com/enterprisetechtips/entry/a_sampling_of_ejb_3

要は、EJB3.0との大きな違いはあまりないんだよね。
でも、インターフェイスを作らなくて良かったり、EARファイルではなくて、WARで良かったりって、小さいけど結構利便性の面で大きく変わってくるところが改善されているから、早く欲しい。

2009年12月27日日曜日

Embedded Jopr Core

ネタにするような事かどうかは疑問ですが、JBoss 5.1.0.GA から、Embedded Jopr Core  という、従来よりも使い勝手の良い管理コンソールがバンドルされています。

http://localhost:8080/admin-console/

WebSphereやWebLogicを使っていた方たちで、JBossに対して持つ不満の最たるものとして、管理コンソールがショボイ!というのがあったかと思うのですが、この点で大きな改善と思います。 同じような操作性で管理することができますので是非お試しください。 ちなみに、Seamベースですので、そういう見方をすると興味深い代物ですよ。

2009年12月26日土曜日

Amazon CloudFront

Amazon EC2を国内で利用した場合に画像とかCSSとかの表示がもっさりした感じになるのを改善するのに利用できるようです。

http://aws.amazon.com/cloudfront/
http://mtl.recruit.co.jp/blog/2008/11/amazons3amazon_cloudfront.html
http://collectivemeta.com/k4bd2

でも、SSLをサポートしないってのはなぁ。
そもそも、EC2を国内に持ってきてもらいたいところですが?

Amazon EC2 料金体系

下記サイトで非常に分かりにくいEC2の料金体系が分かりやすく纏っています。
http://lunarium.info/arc/index.php/AmazonEC2料金体系

一年で5万円を切るのか。(為替によるけど)

高円寺20000V閉店・・・

会社のメンバーに教えてもらったのですが、高円寺20000Vが火事の影響で閉店になってしまったそうです・・・。
色々思い入れもあり、非常に残念。時代の流れなのでしょうか。
http://sankei.jp.msn.com/region/kanto/tokyo/091212/tky0912122104005-n1.htm

2009年12月25日金曜日

WordPress 2.9 (2)

バージョンアップちゃんとすんなり出来ました。でも、2.9.1が出るみたい・・・。
善し悪しありますが、WordPressのバージョンアップは頻度が多すぎます。バグ対応だけのリリースとかないのはどうかと。

2009年12月24日木曜日

RichFaces 3,3,3,BETA1

まだベータ版ですが、RichFacesにJSF 2のサポートが入ったようです。
http://www.jboss.org/feeds/post/richfaces_3_3_3_beta1_released_with_jsf_2_support

WordPress 2.9

日本語版がリリースされたようです。
弊社のHPも、このブログもWordPressなので、バージョンアップしなきゃ。テーマに不都合があると泣いてしまいますが。

しかし、年末ってのは何でかわかりませねんが、忙しくなりますですね。

2009年12月21日月曜日

Google Apps

すっかり時代遅れになっている感じですが、Google Appsで50ユーザーまで無料で独自ドメインのメールがGMailで利用できるんですねっ!
http://www.google.com/apps/intl/en/group/index.html

Google Email UploaderってのでOutlookやThunderbirdからGMailへのインポートは出来るみたいですね。

そこらの安いサーバー使うくらいならよっぽど良いに違いないですね。
登録だけしましたが、、、、MXいきなり変える訳にも行かず。苦笑

2009年12月17日木曜日

SeamTest on PostgreSQL

SeamTestでのDB操作はHSQLとMySQLしかサポートされていません。
PostgreSQLで使いたいところ。ざっと調べると実装は無さそうなので仕方ないからつくろうかな。
フリーな実装をご存知の方がいらっしゃったらお知らせ戴けると。

2009年12月15日火曜日

共通項目を追い出そう。

・作成日
・更新日
・論理削除フラグ

の類というのは、基本的にどのテーブルにも追加していたりしませんか?
こういった場合は、何度も書くのはプログラマとしてアレなので、一箇所に追いやりたいところ。

○追い出したクラス(エンティティではない)
@Embeddable
public class Basis implements Serializable
{
@Column(nullable = false)
@NotNull
private Date entry = new Date();

@Column(nullable = false)
@NotNull
private Date modify = new Date();

@Column(nullable = false)
@NotNull
private Boolean del = false;
}

○呼び出すエンティティ側
@Embedded
private Basis basis = new Basis();

継承するんじゃなくて@EmbeddedアノテーションでDIするというのが、肝ですね。

@Versionアノテーション

なんだこれ?って思っている方も多いかと思うのですが、更新しつつ、テーブルの生データを眺めていると、更新ごとにインクリメントされているのが分かります。
楽観的ロックの能力を付与するためにあるようです。
手で操作する類のものではないので、セッターはprivateにするか取ってしまうのが良いでしょう。
@Version
private Integer version_no;

テーブルは日本語で、Entityは英語。

なんてことをしたい人が世にどれだけ居るのかは存じ上げませんが、EJB3ではそんなこともできます。
以下のようにしてあげれば、
User(Entity)=> ユーザ(テーブル名称)
name(Entity)=> ユーザ名称(カラム名称)

のように翻訳可能です。
あくまでもアクション側からはエンティティ名称で操作するので、日本語が混ざってしまうのは、エンティティだけに抑えるという役目も果たしています。
@Entity
@Table(name="ユーザ")
public class User implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "ユーザ名称", nullable = false)
@NotNull
@Length(max = 20)
private String name;

@Column(name = "パスワード", nullable = false)
@NotNull
@Length(max = 10)
private String passwd;
}

2009年12月14日月曜日

@OneToMany, @ManyToOne

今日2稿目です。
親子関係にある、外部キーを持ったテーブルをEJB3のEntity Beanで表現するために、@OneToMany, @ManyToOneというアノテーションを使います。
決まり文句に近いものなので、押さえておきましょう。
A(1) -------------------> B(*)

○親テーブルA
@Entity
public class A implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Version
private Integer version;

@OneToMany(mappedBy = "a", cascade = CascadeType.REMOVE)
private Set<B> bs;
}

○子テーブルB
@Entity
public class B implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Version
private Integer version;

@ManyToOne(optional = false)
@NotNull
private A a;
}

吐き出されるDDLは以下のようになります。
CREATE TABLE A
(
id bigserial NOT NULL,
"version" integer,
CONSTRAINT a_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);

CREATE TABLE B
(
id bigserial NOT NULL,
"version" integer,
a_id bigint NOT NULL,
CONSTRAINT b_pkey PRIMARY KEY (id),
CONSTRAINT fk26f4fb2dbc3ce1 FOREIGN KEY (a_id)
REFERENCES a (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);

外部キーは自動的に a_id(親テーブル名_id) となります。

EJB3.0 Entityの自動連番とPostgreSQLのserial/bigserial型

意外と書かれていなかったりするので記録を残してみます。普通は主キーにすると思うので、@Idもセットで書きましょう。

・bigserial型として宣言
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

・serial型として宣言
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

ピンとこないかもしれませんが、GenerationType.IDENTITYが肝です。他のDBでも同様と思います。

一昔前はもっとごにょごにょしなきゃいけなかったんですが、今はこれだけで大丈夫でした。

2009年12月12日土曜日

Weldのライセンス

全く気づいてませんでしたが、SeamのLGPLとは違い、APL 2.0なのか。
http://seamframework.org/Download

よくよく見ると、Web Beans 1.0.0.PREVIEW1の時のライセンスはAPL(2.0かどうかは明記されていない)

2009年12月10日木曜日

Thunderbird 3.0

早く寝ろ、という感じですが。苦笑

Thunderbird 3.0がリリースされていたのでバージョンアップしてみました。

が、イマイチ何故にタブがあると嬉しいのかが分かりません。
ブラウザーとは違うと思うんですが・・・。

JBoss事例

海外事例ですが、なかなか面白い読み物です。
http://www.jp.redhat.com/solutions/successstories/Union-bank_1201.pdf
http://www.jp.redhat.com/solutions/successstories/AVIS_Europe_1201.pdf
http://www.jp.redhat.com/solutions/successstories/Daiwa_CS_1201.pdf

JBoss EAP 5.0 日本語マニュアル

リリースノート
インストールガイド
スタートガイド

がリリースされてます。

つまらないところですが、意外と便利?
http://www.redhat.com/docs/ja-JP/JBoss_Enterprise_Application_Platform/5.0/html/Getting_Started_Guide/creating_a_jdbc_client.html

2009年12月8日火曜日

WiMAX....

WiMAXは抱き合わせ販売はしないという方針だそうですが、それは仕方ないとしてビル内で繋がらないと言う情報もあったりして利用を躊躇しますね。
期待しているので、頑張って欲しいところです。

http://www.uqwimax.jp/

2009年12月4日金曜日

Bean Validation: validation everywhere EE 6 edition

JBoss AS6 M1で試せるそうです。先取りしたい人はどうぞ。
Bean Validation: validation everywhere EE 6 edition


Bean ValidationのほかにもJBoss AS6には色々入ってきそうです。

http://www.jboss.org/feeds/post/introducing_jboss_as_6_0_0_m1

EE6 has been approved

良いニュースかな。
EE6 has been approved, yet…

感動!



人身事故にあうと良いことがある?(笑)
夕方、大した用も無くナッツウェルさんにお邪魔してしまったんですが、入口にこんな貼り紙が!

いや~、ありがとうございます。
物を戴いたりするよりもこういう心尽しの方が全然嬉しいですし、こんな事をしていただけたのは初めてでビックリです。

アイディア次第でローコストで出来ることって色々あるんだな、と非常に勉強になりました!

JBoss追いきれない・・・

本日は、中央線の人身事故で1時間弱、電車に缶詰にされ、萎えてしまいましたので弱音を吐いてみます。w

http://www.jboss.org/projects/matrix

をみると、全く追いきれる気がしませんね。増えたものの概要すら分からないもの多数。苦笑
できるだけ追いかけて生きたいのですが、やっぱり人間なので関心のある方に意識は向きますし、もはや単一のプロジェクトの範疇を大きく超えてしまっています。

もう少しすっきり纏めて貰えると嬉しいですね。

2009年11月30日月曜日

Zend Framework on Ubuntu

UbuntuへのZend Frameworkの導入は簡単です。
必要なものを一気にインストール
# sudo apt-get install php5 zend-framework php-pear proftpd postgresql php5-pgsql

proftpdはFTPを使わなければ不要です。DBは好きなのを。続いて設定ファイル。

○/etc/php5/apache2/php.ini
include_path = ".:/usr/share/php:/usr/share/pear:/usr/share/php/libzend-framework-php/"

○プロジェクト直下に(ここでは/zf/)
$ cat zf/.htaccess
RewriteEngine on
RewriteBase /zf/
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

○最後に稼動確認
$ cat index.php
<?php
require_once 'Zend/Version.php';
echo Zend_Version::VERSION;
?>

http://localhost/zf/
等をブラウザで開いて確認。

ついでに、Eclipse PDTのオールインワンパッケージ。環境に合わせてどうぞ。
http://downloads.zend.com/pdt/all-in-one/
$ cat zf/.htaccess

RewriteEngine on

RewriteBase /zf/

RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

2009年11月25日水曜日

JBoss Enterprise BRMS クイックスタートセミナー

今日はBRMSのセミナーに行きました。
Javaを知らないエンドユーザーさんでも気軽に聞ける感じだと思いますので、安価なルールエンジンが欲しい方は評価がてら行ってみては?

ルールのユニットテストのところの操作性は、なんとも言えない所がありました。どうやったら、パラメータとか書けるのか最初は全く分からず。苦笑
今後に期待という感じですかね。

エクセルで作ったルールを取り込めるのは良いです。でも、エクセルで作ったルールは、現実的には最後までエクセルだけで管理するしか無い様で。

ハードコーディングでルールを書くのは、やめましょうというのを理解したい人にはちゃんと説得してくれてそう思えるようにしてくれるので、ルールエンジンって?という感じの方も聴きに行ってみて下さい。

2009年11月24日火曜日

JBoss 5.1.0.GAのソースをEclipseで読む

JBossのソースを読まなければならない人というのはそうそう居ないとは思うんですが、何かの時にEclipse上で参照したいケースは出てくる場合があります。
この場合、コンパイルエラーが出ていると非常に煩いので、あらかじめJBossをコンパイルしたものをインポートすると良いでしょう。

まず、5.1.0.GAを展開したソース中のbuildというディレクトリに移動します。Mavenにパスが通っている事を確認し、
> build
を実行すれば、必要な依存関係をMavenが解決し、JBossのビルドをしてくれます。結構お時間取られますので、他の作業をしているのが良いでしょう。

・・・・で、あれ?Windows上でビルドできない・・・。なぜだ。苦笑
generate-parsers:
[javacc] Java Compiler Compiler Version 4.0 (Parser Generator)
[javacc] (type "javacc" with no arguments for help)
[javacc] Reading from file D:\usr\local\workspace\vyw\org\jbosssrc510\server\
output\parsers\org\jboss\ejb\plugins\cmp\ejbql\JBossQLParser.jj . . .
[javacc] Exception in thread "main" java.lang.Error: Invalid escape character
at line 1 column 64.
[javacc] at org.javacc.parser.JavaCharStream.readChar(Unknown Source)
[javacc] at org.javacc.parser.JavaCCParserTokenManager.getNextToken(Unkno
wn Source)
[javacc] at org.javacc.parser.JavaCCParser.jj_ntk(Unknown Source)
[javacc] at org.javacc.parser.JavaCCParser.javacc_options(Unknown Source)

[javacc] at org.javacc.parser.JavaCCParser.javacc_input(Unknown Source)
[javacc] at org.javacc.parser.Main.mainProgram(Unknown Source)
[javacc] at org.javacc.parser.Main.main(Unknown Source)

以前はできていたのですが。

仕方ないので、VMware上にまっさらなUbuntu環境を作ってこちらでビルド。
折角なので、OpenJDK環境で。w

$ sudo apt-get install openjdk-6-jdk maven2
$ cd /path/to/jboss-5.1.0.GA-src/build
$ chmod +x build.sh
$ ./build.sh

これだけでした。くそー。普通にできるし。(できて当たり前なんだけど)

2009年11月20日金曜日

第7回RedHatレディ・ビジネスパートナー定例会

昨日は、RedHatレディ・ビジネスパートナー定例会でした。

レッドハットさんは勢いがあって凄いです。

なぜか、私も喋る事になっていたのですが、よく考えたらまだ起業したばかりで特にアピールする点は無いですね。w
一応、Seam主体で話しました。

懇親会で、色んな方とお話をすることが出来て良かったです。

2009年11月19日木曜日

JBoss オープンセミナー

18日に行ってきました。

JBoss EAP 5.0の話っぽかったので食いついてみたのですが、行って良かったです。
5.0で何が変わったのか、結構ちゃんと聞けました。
個人的に大きいと感じたのは以下の点。

・管理コンソール
噂のSeamベースの管理コンソールをようやく生で見ました。(ぉぃ)
便利そう。

・セキュリティ強化
Windowsデスクトップとのシングルサインオン?
それは是非やりたい。

・mod_clusterというロードバランサが追加され、ラウンドロビンでないインテリジェントで負荷分散できるようになった
APのノードによって負荷が違ったり、落ちてたりするのにもホットに対応できるとの事。また、追加も対応。

・RESTful Web Services(JSR-311, JAX-RS)というHTTPコマンドを使って実装したWeb Service機能が追加された
そういえば、Web Serviceを学んでいたときに、GETとかとは違うのかなー、とか思っていたけど、お馬鹿な発想ではなかったということで良かった。w
JSR-181よりもシンプルだし、POJOで書けるのは良いなー。

・Hibernate Search
Apache Luceneのエンジンを使って、全文検索が可能になるのだとか。デモしていただいたけど、すばらしい。知らなかっただけか?

ずっと待ってるCLI管理機能はEAP 6.0までお預けらしい。2011年てだいぶ先だなー。

ルールエンジン BRMSの説明もさらりとはあったんだけど、Droolsとの違いが良く分からず。
セミナー終了後に、講師の方に色々聞くと、DroolsにGUIが乗っかってる感じらしい。なるほど。
で、条件自体を変更したりできるということで、棲み分けが理解できた。
講師の方が親切に資料を別途送ってくれました。ありがとうございます。

セミナー終了後に、M本さんがひょっこり出てきてびっくり。Weld翻訳がんばりましょう。苦笑

BRMSも使えそうな印象なので、24日にBRMSクイックスタートセミナーにも行ってこようかと。

明日19日はなぜか、RedHatレディ・ビジネスパートナー定例会で時間をいただいて喋る事になってます。
別段、話すことも無かったりして・・・・。ぼちぼちやります。w

2009年11月13日金曜日

mobilepoint

独り言です。

営業の合間によくマックのmobilepointを使うんですが、今日のマックは電波は非常に良いなのに、非常にレスポンスが悪い!!
なんなんですかねー。

そんなけです。

2009年11月12日木曜日

JBoss EAP 5.0 (2)

7日以降、JBoss EAP 5.0の情報を探しているんですが、日本語情報は皆無ですね。
レッドハットの日本語サイトの最新ニュースにも書かれていない模様・・・・。

もう少し待ちますか。

そんなわけで、これ行ってきます。
http://www.jp.redhat.com/event/2009jboss_openseminar.html

2009年11月8日日曜日

JBoss EAP 5.0

やっとリリースされました。(11/3)

2009年10月22日木曜日

近い人はご存知と思いますが、ワタクシは紙が大っ嫌いです。なのに、起業してからというもの、すっかり役所周りの紙で埋もれてしまっています。
ペーパーレスと言われて久しいですが、減るどころか世界の紙の需要は増えるばかり。
謄本とかオンラインで取得できるんですが、届くのは紙が郵送で送られてきます。
登記するときも電子認証できるんですが、結局1部は紙の定款を残すことになります。

必要な紙とそうでない紙があると思いますが、特に役所周りでペーパーレス化が進むことを切に望みます。

どーでも良い内容でごめんなさい。

2009年10月16日金曜日

Weld

Web Beansが改名されました。
http://www.seamframework.org/Weld

で、1.0.0.CR1がリリースされました。名前変わっちゃうと翻訳大変そうです・・・。

Weldって溶接とか密着とか。
どうしてもSeamじゃ駄目なんだね。w

2009年10月9日金曜日

Amazon EC2 お試し

前から気になってたので、今更ですが試してみました。
http://aws.amazon.com/ec2/

細かいやり方は他の方が沢山書いてるのでパスするとして、僕が気になっていたのは

1) Smallの1.7GBでメモリが足りるかどうか
2) JBossがまともな速度で動くのかどうか
3) 回線スピードがどうなのか

と言う点なんですが、

1) 小規模ならギリギリ・・・・セーフ?中規模以上ならLarge以上のスペックにしないと厳しい。
2) JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)] Started in 2m:9s:265ms
だったので、一応は我慢できるレベル。これもLargeにすれば問題無さそう。
3) 正直遅い。他の人も書いてるけど、画像とかを国内サーバーに置けば我慢できるかも?

安いのは安いと思うけど、やっぱり「うーん」となってしまう感じ。Sunのクラウドが気になるところ。

2009年10月7日水曜日

Rails環境作成

新しいノートに環境作成をしていて丁度良かったので、今日は、Railsの環境作成について書いてみようかと。ほぼ自分のためのメモなのであしからず。

http://rubyforge.org/projects/rubyinstaller/

から、One-Click Installerをダウンロード&インストールする。RubyGemsを一緒に入れるのを忘れないように。
# 1.8.6かぁ・・・・まぁいっか。

インストール後、
> gem install rubygems-update
> update_rubygems
> gem update

で、構成をバージョンアップしてから、Railsを入れる。
> gem install rails
> gem install sqlite3-ruby 窶錀-version ‘= 1.2.3′

として完了。SQLiteのDLLを別途落としてRubyのパスに突っ込んでおきます。

関係ないけど、gem updateされたものを見るだけで、One-Click Installerには余計なものがたくさん入ってる・・・・まぁいっか。
さくっと動作確認だけしておこう。
> rails bookmark
> cd bookmark
> rake db:create:all
> ruby script/generate scaffold bookmark url:string
> rake db:migrate
> ruby script/server

で、Bookmarkプログラムのインストールが完了。動作確認します。

最後に、開発環境としてNetBeansを入れます。Ruby版でオーケー。

# Javaとは違ってWindows上で検証したものが本番環境(Linuxとかの別OSのサーバー)上で同じように動くかどうかは別問題なので、注意。

authenticator

さて、もうひとつ早めに説明しておいた方が良いですかね。忘れそうだし。苦笑

Seam標準のログイン認証機能の説明です。

C:\Projects\myproject\src\hot\com\mydomain\myproject\action\AuthenticatorBean.java を見てみましょう。(import文はもう省略)
@Stateless
@Name("authenticator")
public class AuthenticatorBean implements Authenticator {
@Logger
private Log log;

@In
Identity identity;
@In
Credentials credentials;

public boolean authenticate() {
log.info("authenticating {0}", credentials.getUsername());
//write your authentication logic here,
//return true if the authentication was
//successful, false otherwise
if ("admin".equals(credentials.getUsername())) {
identity.addRole("admin");
return true;
}
return false;
}

}

Seamコンポート名として、authenticatorが宣言されていますので、JSF等からこのインスタンス名でアクセスされます。
C:\Projects\myproject\resources\WEB-INF\components.xml に
<security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/>

という宣言があり、ログインされたときは #{authenticator.authenticate} を実行し、戻り値がtrueであればログイン成功だよ、という事です。

で、このサンプルの場合はauthenticate()で何をしているかというと、C:\Projects\myproject\view\login.xhtml のツꀀUsernameの値が「admin」だったらログイン成功・・・・なるほど。w
まぁ、そんなわけで実際の開発時にはこのauthenticate()をカスタマイズするだけで、DBと普通に認証しても良いし、LDAPと認証しても良いし、ActiveDirectoryと認証しても良いし、という具合になります。便利。

さらにDroolsを使ってロールの概念を持たせると権限の概念の定義も可能です。これはもっと先の話。(そこまで書く元気があるのかしら)

login.xhtmlやmenu.xhtmlを見るとログインしているかどうかで表示を分けていたりするので、参考にしてください。
また、フレームワークとしてログインしているかどうかというのがちゃんと認識されていますので、特定のメソッドをログインしてなかったら実行できないようにする、というような事がアノテーション一行で定義可能です。これもどこかで説明したいと思います。

最後に、恒例(うそ)のアノテーション解説して終わります。新出だけね。
@Stateless: ステートレスセッションBeanであることを示します。ちなみに、SeamでステートレスセッションBeanを使うのは一般的にはログイン画面と(層を作りたい場合に)純粋なDAOを作るような場合くらいですかね。通常ステートフルセッションBeanを使うことになります。
@Logger: org.jboss.seam.log.Logのインスタンスを使います。これを書いておくと、Log4Jを使うときの非常に冗長なif文を書かなくてもSeamがよしなにしてくれることになっています。
@In: インジェクション。画面からの値をクラスの属性で受け取るのに使います。ログイン画面の例なので最初はしんどいかもしれませんが、logins.xhtmlと見比べれば分かると思います。

generate-entitiesにより作られたクラス2

続いて、C:\Projects\myproject\src\hot\com\mydomain\myproject\action\MyprojectList.java
これは所謂セッションBeanに相当するものです。MyprojectはエンティティBeanだったので、これに対するビジネスロジックを定義する場所と考えてください。
相当するものと書いたのは、EntityQueryを継承してしまうことで、一般的なセッションBeanの書き方とは異なるから。
セッションBeanを使う場合は、EntityManagerに関する記述を書いたり、セッションBeanであることを宣言したりすることが必要。

package com.mydomain.myproject.action;
import com.mydomain.myproject.model.*;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.framework.EntityQuery;
import java.util.Arrays;
@Name("myprojectList")
public class MyprojectList extends EntityQuery<Myproject> {
private static final String EJBQL = "select myproject from Myproject myproject";
private static final String[] RESTRICTIONS = {"lower(myproject.val) like lower(concat(#{myprojectList.myproject.val},'%'))",};
private Myproject myproject = new Myproject();
public MyprojectList() {
setEjbql(EJBQL);
setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
setMaxResults(25);
}
public Myproject getMyproject() {
return myproject;
}
}
ここでもアノテーションが出てくるので、簡単に。
@Name: これはSeamアノテーションで、Seamコンポート名というのを指定します。とか書くと分からないのですが、ここで宣言した名前でJSFから直接呼び出せることになっています。要はその時のクラスのインスタンス名を書いてって事なので、普通はクラス名の先頭を小文字にしたのを書いとけば十分です。

あれ?SQL変じゃね?って思った人がいるかもしれませんが、これはEJB3.0規格のEJB-QLという独自のSQL文になっています。何でそんなことを・・・と思うかもしれませんが、EJB-QLが間に挟まっているおかげで開発者はその先にあるデータベースの方言について一切意識する必要が無いのです。それは本来開発者の仕事ではなく、フレームワークの仕事だろってのがEJB3.0の思想になるわけです。

#{myprojectList.myproject.val}はJSF側の該当パラメータが直接入ります。どこにあるかというと、C:\Projects\myproject\view\MyprojectList.xhtml つまり、部分一致検索の条件パラメータが入ります。
普段、何層にも層を作って開発をされている方には気持ち悪いですが、本来これくらいシンプルじゃないと。

setMaxResults(25);

は検索結果の最大件数が25行までですよ、と宣言しています。こんなこともSQLだけでやろうと思うと、あれ?このDBの場合はどうやるんだっけ?って絶対迷うので、EJB-QLの場合そういうのが無いだけで精神衛生上良いです。(EJB-QLでどう書くんだっけ?とはなるわけだけど・・・・それは仕方ない。苦笑)

C:\Projects\myproject\src\hot\com\mydomain\myproject\action\MyprojectHome.java も同様にEntityQueryを継承していますが、こちらは今見てもさっぱり意味が分からないと思うので、スルーしましょう。(ぉぃ)

追いたい人は、C:\Projects\myproject\view\MyprojectEdit.xhtml からMyprojectHomeがどのように使われているのかを見ておくと良いです。ものすごくすっきりしてますが、正直何やってるか分かんないというのが実情ではないかと。

たった一行のDDL(create table)からgenerate-entitiesで出力されたCRUDするためのコードがどのように動いているのか、もう少し上手に説明したいところですが、余り使われてないEntityQueryのせいでちょっと分かりにくくなってしまっているんです。一通り全体が分かるようになったところでもう一度おさらいしてみて下さい。

2009年10月6日火曜日

generate-entitiesにより作られたクラス1

前回の投稿からだいぶ時間が空いてしまいました。誰も観てないからいいか。

ノートを買いました。なので、ここから先は当面ローカルホストで動かすことを前提とします。(ごめんっ)

さて、generate-entitiesによりテーブルから自動的にクラスとJSFを作成して貰うことで、前回はプログラムコーディングが1行も無しでCRUDできてしまいました。
RailsにしてもSeamにしてもここまでは皆さん喜ぶんですが、当然これでは仕事にはなりません。
なので、少しずつ深みに嵌らないといけませんが、今回はまずgenerate-entitiesで作成されたクラスを見ていきましょう。
一度にたくさん書くと続かないので、今回は、エンティティBeanの C:\Projects\myproject\src\main\com\mydomain\myproject\model\Myproject.java です。
エンティティBeanというのは、DBのテーブルとのインターフェースに使うマッピングクラスのようなものです。EJB3.0ではエンティティBeanPOJOでなければいけません。POJOってのはただのJava Beans。
EJB3.0の事を知りたくなければこういうのを作るんだ位で読み流してよいでしょう。要はSeamで開発できるようになることが大事。
package com.mydomain.myproject.model;

// Generated 2009/10/06 12:43:58 by Hibernate Tools 3.2.4.GA

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.validator.NotNull;

/**
* Myproject generated by hbm2java
*/

@Entity
@Table(name = "myproject", schema = "public")
public class Myproject implements java.io.Serializable {

private int id;
private String val;

public Myproject() {
}

public Myproject(int id, String val) {
this.id = id;
this.val = val;
}

@Id
@Column(name = "id", unique = true, nullable = false)
public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}

@Column(name = "val", nullable = false)
@NotNull
public String getVal() {
return this.val;
}

public void setVal(String val) {
this.val = val;
}
}

んんんん?アットマーク(アノテーション)は何だ?という人の為に、

@Entity: 注釈されたクラスがEJB3のエンティティBeanであることを示します。
@Table: 注釈されたエンティティBeanがDB側のテーブルに関連付けられることを示します。ここでは、public.myprojectに対するエンティティBeanであるという宣言。省略したら「エンティティBeanのクラス名 = DBのテーブル名」と見なされます。
@Id: 注釈された属性がテーブルの主キーに関連付けられることを示します。基本的にはエンティティBeanに毎に1回しか使えません。また、エンティティBean毎に必ず一度利用しなければなりません。複数キーに対応する方法はありますが、複雑なので今は割愛します。特に理由が無ければ単一カラムで主キーを宣言しておいたほうが楽です。属性のゲッターに付与することもできます。
@Column: 注釈された属性がテーブルの項目に関連付けられることを示します。ここでは、属性idとpublic.myproject.idが関連付けられ、idはユニークで、NULLは許容されない、という意味です。省略したら「属性 = テーブルの項目名」と見なされますが、実際には、どのみちnullableを書かないといけないので都度都度宣言が必要です。属性のゲッターに付与することもできます。
@NotNull: 注釈された属性がNULL許容されないことを示します。これはJPAのアノテーションではないので、Hibernate環境でなければ使えませんが、SeamにはHibernateが同梱されているのでほかの環境に乗り換える予定が無ければ付けておきます。属性のゲッターに付与することもできます。
アノテーションを理解すれば何が書かれているかが何となくわかります。便利。

自動生成だけあって、いくつか問題があります。

・シーケンスに対応されていない。

・アノテーションが冗長でメンテしづらい。
前者については問題ありありなので、解決しなければなりません。
後者については、常にテーブルからエンティティBeanを作るという一方通行なら無視して良いでしょう。逆にエンティティBeanからテーブルを作るという一方通行が好みなら何とかしないと生産性に響きます。僕の場合は後者ですが、話をできるのは少し先。

エンティティBeanはシンプルですが、奥が深いので都度都度追加で説明しますが、1つのテーブルにこのようなものを1つ作ることになるんだというのを今回は押さえてください。 それではまた次回。

2009年8月7日金曜日

seam generate-entities

本質的にはあまり関係ないですが、PostgreSQLをリモートから接続できるようにします。

# echo "host all all 192.168.0.0/24 md5" >> /etc/postgresql/8.3/main/pg_hba.conf
# vi /etc/postgresql/8.3/main/postgresql.conf(下記の行を変更)
listen_addresses = '*'
# /etc/init.d/postgresql-8.3 restart

続いて、myprojectというテーブルを作成します。サンプルですので、カラムは2つしかありません。
# psql myproject -Useam -hlocalhost
Password for user seam:
myproject=> create table myproject (id serial primary key, val text not null);

pgAdminIIIなどで、PostgreSQLサーバーに対して接続できる状態であることを確認します。PostgreSQLサーバーがローカルにあるのであれば、それで特に何もしなくて良いでしょう。
PostgreSQLサーバーがリモートであれば、ローカルのseamからも見えるようにします。(今回からはseam setupの変更場所だけ書くようにします。)
> seam setup settings:
[echo] JDBC URL: jdbc:postgresql://192.168.0.7:5432/myproject
> seam update

これで、ローカルのseamでもリモートのseamでも同じPostgreSQLサーバーを見に行きます。(当たり前だけど)

続いて、C:\Projects\myproject\resources\META-INF\persistence-dev.xmlの設定がPostgreSQL用になってくれてないので

直しておきます。seam-genがやってほしいところ。変えるのは下記の行。
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>

同様に、C:\Projects\myproject\resources\myproject-dev-ds.xmlの設定も甘いので、下記のようになるようにしましょう。
<datasources>
<local-tx-datasource>
............(snip)............
<metadata>
<type-mapping>PostgreSQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>

で、今回は作成したテーブルに対して、自動的にJavaのO/Rマッピングクラスを生成し、CRUD出来るようにします。何するの?というと、下記一発!
> seam generate-entities

これだけで、myprojectテーブルに対してのCRUDができるようになります。
> seam deploy

して、リモートのJBossにデプロイしましょう。(ローカルのJBossでテストするなら seam deploy 時点でデプロイされています)
seamcrud

正しくデプロイされると、メニュー上に「Browse data」というリンクが出来ますので、「Myproject List」を選択します。遷移するとmyprojectテーブルに対しての検索画面が表示されます。簡単にCRUD出来る筈なので試してみてください。
seamcrud2

次回は、generate-entitiesで作られたクラスを追いかけてみましょう。

2009年8月1日土曜日

Seam on PostgreSQL

JBoss/SeamのデフォルトデータベースのデータソースはHSQLDBというJavaで実装されたものなのですが、PostgreSQLに変えたいのでやっておきます。

【インストール】
# apt-get install postgresql libpg-java

【ユーザ作成&パスワード設定】
# su - postgres
$ createuser seam
$ createuser seam

Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n

$ createdb myproject
$ psql -l
$ psql template1
template1=# alter user seam password 'seamseamseam';
ALTER ROLE
template1=# \q

【接続確認】
$ psql myproject -Useam -hlocalhost
$ exit

【JDBCの設定】
# cd /usr/local/jboss/jboss-5.1.0.GA/server/default/lib
# ln -s /usr/share/java/postgresql.jar

また、/usr/share/java/postgresql.jar をローカルにも
C:\usr\local\jboss\jboss-5.1.0.GA\server\default\lib\postgresql.jar
として保存しておきます。

【seam-genの再実行】
HSQLDBからPostgreSQLに向き先を変更します。
C:\Projects\myproject\resources\myproject-dev-ds.xml
を削除してからseam-genを実行します。
あるいは、C:\Projects\myproject自体を削除してやり直しても構いません。

>seam setup
settings:
[echo] JBoss AS home: C:/usr/local/jboss/jboss-5.1.0.GA
[echo] GlassFish home: C:/Program Files/glassfish-v2.1
[echo] Project name: myproject
[echo] Project location: C:/Projects/myproject
[echo] Project type: ear
[echo] IceFaces: n
[echo] Action package: jp.vyw.myproject.action
[echo] Model package: jp.vyw.myproject.model
[echo] Test package: jp.vyw.myproject.test
[echo] JDBC driver class: org.postgresql.Driver
[echo] JDBC DataSource class: org.postgresql.jdbc3.Jdbc3ConnectionPool
[echo] Hibernate dialect: org.hibernate.dialect.PostgreSQLDialect
[echo] JDBC URL:ツꀀjdbc:postgresql://localhost:5432/myproject
[echo] Database username: seam
[echo] Database password: seamseamseam

>seam create-project
>seam undeploy
>seam deploy

新しいmyproject.earとmyproject-ds.xmlをLinuxサーバーにデプロイします。
デプロイ後 、再度動作を確認してください。

次回は、実際のPostgreSQLのテーブルとORMします。

seam-gen on Seam 2.2.0.GA

Seam 2.2.0.GAがリリースされてしまったので、seam-genやり直し。苦笑
JBoss 5.1.0.GAは省略するので、前回に沿って導入してください。

Seam 2.2.0.GAをダウンロード


C:\usr\local\jboss\jboss-seam-2.2.0.GA
として展開します。

で、Seamのセットアップ。

コマンドプロンプトを起動して、seam-genを実行。今回は単に動かすだけなので、ほとんど変更しなくて構いませんが、JBossは正しく指定するようにしましょう。また、今後EJBを使うので、Project typeをearにします。

>cd C:\usr\local\jboss\jboss-seam-2.2.0.GA
>seam setup

[echo] JBoss AS home: C:/usr/local/jboss/jboss-5.1.0.GA
[echo] GlassFish home: C:/Program Files/glassfish-v2.1
settings:
[echo] JBoss AS home: C:/usr/local/jboss/jboss-5.1.0.GA
[echo] GlassFish home: C:/Program Files/glassfish-v2.1
[echo] Project name: myproject
[echo] Project location: C:/Projects/myproject
[echo] Project type: ear
[echo] IceFaces: n
[echo] Action package: com.mydomain.myproject.action
[echo] Model package: com.mydomain.myproject.model
[echo] Test package: jp.vyw.myproject.test
[echo] JDBC driver class: org.hsqldb.jdbcDriver
[echo] JDBC DataSource class: org.hsqldb.jdbc.jdbcDataSource
[echo] Hibernate dialect: org.hibernate.dialect.HSQLDialect
[echo] JDBC URL: jdbc:hsqldb:.
[echo] Database username: sa
[echo] Database password:

>seam create-project
>seam deploy

とすると、JBossのdeployディレクトリにSeamの空プロジェクトがデプロイされます。 JBossが起きていれば、オートデプロイされますし、起きていなければ起こしてやると動作確認可能な状態となります。
http://localhost:8080/myproject

ブラウザで表示されればオーケーです。
手元のWindowsノートのスペックが厳しすぎなので、今回からはLinuxサーバー上のJBoss 5.1.0.GAにdeployします。 Linuxサーバー側の以下のディレクトリが一般ユーザで書き込み可能な状態となっていることを確認して、
ローカル(C:\usr\local\jboss\jboss-5.1.0.GA\server\default\deploy)
からLinux側(/usr/local/jboss/jboss-5.1.0.GA/server/default/deploy)
にEARファイル(myproject.ear)とデータソース(myproject-ds.xml)ををコピーします。転送クライアントは何でも良いですが、今回はWinSCPを使いました。

JBossが起動していなければ下記のようにして起動します。
JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun \
JBOSS_HOME=/usr/local/jboss/jboss-5.1.0.GA \
/usr/local/jboss/jboss-5.1.0.GA/bin/run.sh -b 0.0.0.0

以下のアドレスで動作確認できることを確認します。
http://(サーバーのIP):8080/myproject

Welcome to Seam!

Seam 2.2.0.GA

Seam 2.2.0.GAがリリースされました。
https://jira.jboss.org/jira/secure/ReleaseNote.jspa?version=12312739&styleName=Text&projectId=10071&Create=Create

JBossのデフォルトターゲットが5になりました。

2009年7月21日火曜日

seam-gen

なんか、シリーズ化しないと続かない予感がひしひしと・・・なので、とりあえずSeamを最初から動かしてみるってのを書いてみます。

あくまでも目安になりますが、以下くらいのスペックが無いと結構厳しいかと思います。
CPU: Core 2 Duoレベル
RAM: 2GB程度

# ただ、そもそも今書いてるこのノートが動作環境を全く満たしていませんが・・・。

さて、行きましょう。まずは以下からJBoss 5.1.0.GAとSeam 2.1.2.GA をダウンロード
http://sourceforge.net/projects/jboss/files/JBoss/jboss-5.1.0.GA.zip/download
https://sourceforge.net/projects/jboss/files/JBoss%20Seam/jboss-seam-2.1.2.tar.gz/download


どこに展開してもよいですが、僕はLinux環境のパスに揃ておくのが好みなので、それぞれ
C:\usr\local\jboss\jboss-5.1.0.GA
C:\usr\local\jboss\jboss-seam-2.1.2
として展開します。

システム環境変数として、
JBOSS_HOME=C:\usr\local\jboss\jboss-5.1.0.GA
を登録しておきます。

で、Seamのセットアップ。
コマンドプロンプトを起動して、seam-genを実行。今回は単に動かすだけなので、ほとんど変更しなくて構いませんが、JBossは正しく指定するようにしましょう。また、今後EJBを使うので、Project typeをearにします。

>cd C:\usr\local\jboss\jboss-seam-2.1.2
>seam setup
[echo] JBoss AS home: C:/usr/local/jboss/jboss-5.1.0.GA

[echo] JBoss AS home: C:/usr/local/jboss/jboss-5.1.0.GA
[echo] GlassFish home: C:/Program Files/glassfish-v2.1
[echo] Project name: myproject
[echo] Project location: C:/Projects/myproject
[echo] Project type: ear
[echo] IceFaces: n
[echo] Action package: com.mydomain.myproject.action
[echo] Model package:ツꀀcom.mydomain.myproject.model
[echo] Test package:ツꀀcom.mydomain.myproject.test
[echo] JDBC driver class: org.hsqldb.jdbcDriver
[echo] JDBC DataSource class: org.hsqldb.jdbc.jdbcDataSource
[echo] Hibernate dialect: org.hibernate.dialect.HSQLDialect
[echo] JDBC URL: jdbc:hsqldb:.
[echo] Database username: sa
[echo] Database password:

>seam create-project
>seam explode

とすると、JBossのdeployディレクトリにSeamの空プロジェクトがデプロイされます。 JBossが起きていれば、オートデプロイされますし、起きていなければ起こしてやると動作確認可能な状態となります。
http://localhost:8080/myproject

ただしくブラウザで表示されれば今回はオーケーです。

2009年7月12日日曜日

Asterisk

Asteriskって、思っていたよりも世に普及しているんですね。
中にはローカルにあるツꀀAsteriskと連携してくれるSIPトランクサービスなんかもあるという。

将来性がある気がしてしまうので、時間を探して追っかけてみたいと思います。



ただ、トランクサービスが恒常的に提供されるサービスなのか、つまりずっと同じ電話番号を利用できる類のサービスなのかはどこも説明が足りていない気がします。
この辺がクリアにならないと安心して利用できないという。

iPhone OS 3.0

リリースされたので早速アップグレードしました。
コピペできるようになったのは良いけど、、、、ボタン長押しで、iPodやSafariが終了しなくなってしまいました・・・・・常にメモリ不足な感じで結構重い。
http://plusd.itmedia.co.jp/mobile/articles/0906/18/news013.html

デザリングにかなり期待していたのですが、日本はやっぱりだめ。帯域細いからな・・・。
アップルにデザリングに関する記述があるから採用されるのだと思ってた・・・。
http://www.apple.com/jp/iphone/softwareupdate/

残念ですね。

JBoss EAP

がJBoss5に対応するのは一体いつ?
Java EE 5に一番対応したいのはredhat自身ではないかと思いますが・・・。

JBoss 5.1.0.GAがリリースされてしまっているので、どこにターゲットを据えてるか位は知りたいところですね。

JBoss 5.1.0.GA

やばい。完全に出遅れた。いつのまにかJBoss 5.1.0.GAがリリースされてる。
http://www.jboss.org/jbossas/docs/Release_Notes/510GA/readme.html
http://www.jboss.org/jbossas/
http://sourceforge.net/project/showfiles.php?group_id=22866&package_id=16942&release_id=684683

というか、JBossASじゃなくてJBossなのね・・・。
しかも、EJB3もいつの間にか永遠のベータ版から脱却した模様。

あー、5.0自体余り見てなかったのに。また追いかけないと。焦

Ubuntu ON USB

超今更、、、というか正直今までは余り関心が無かったのですが、最近の急激なUSBメモリの下落を受けまして、なんとなく8GBのを調達しましたので、ubuntuを突っ込んでみました。

やり方は色々あるようですが、まー、とりあえずお試しってことで、一番シンプルな単に編集可能なLiveCD。後述するバグが無ければ以下の方法でオーケーです。USBメモリから起動できないマシンの場合は、CD-ROMから起動して、USBメモリ側を呼ぶ形になります。USBメモリで起動できるマシンであればUSBメモリを持ち歩くだけでどのマシンでも起動させられるスグレモノ。
https://wiki.ubuntulinux.jp/UbuntuTips/UsbInstall/CreateUSBStartupDisk

ただし、9.04の不具合でUSBメモリにインストールした場合に変更が保持されないと言うどうしようもないバグがあるので、下記で対応が必要。
http://another.maple4ever.net/archives/859/
http://nofx2.txt-nifty.com/it/2009/04/usb-ubuntu-linu.html

9.04のディスクイメージを落としてきてCDに焼いてubuntuをブートする普通のやり方の方が楽だと思いますが、CD起動できない?など諸事情のある方はWindowsからインストールする方法もあるようです。
http://www.pendrivelinux.com/usb-ubuntu-904-persistent-install-windows/

これで普通に使えて、変更した差分が正しく反映されていることは確認できましたが、USBメモリの特性としてHDDに比べると寿命が短い事と、落としたりなくしたりするリスクが高いので、重要なデータは極力含めないようにしたほうが良いですね。

その意味では、最初から変更を受け付けないという利用方法もアリなのかもしれません。
速度は犠牲にするとして、USBメモリ自体を暗号化した状態で利用できる方法があると良いかもしれませんが、どうでしょうかね。

JBossTools 3.0.0.GA

JBoss系で一覧新しい情報としては開発環境であるJBossToolsのメジャーバージョンアップですね。
http://in.relation.to/Bloggers/JBossTools3IsHere

日本語対応版がすでにありますので、こちらを使うのが手っ取り早いです。
http://sourceforge.jp/projects/japan-jbug/downloads/38753/InstallerForJBossTools-3.0.0.GA-R200903141626-H5-win32-0.0.16.jar

ただし、巨大なので要注意。

はじめます。

なんとなくJBoss主体で暫く書いていきます。
根を詰めると飽きるのでぼちぼちやります。

とりあえず今日はWordpressの設置だけ。