2009年10月22日木曜日
2009年10月16日金曜日
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環境作成
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
これは所謂セッション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から直接呼び出せることになっています。要はその時のクラスのインスタンス名を書いてって事なので、普通はクラス名の先頭を小文字にしたのを書いとけば十分です。
普段、何層にも層を作って開発をされている方には気持ち悪いですが、本来これくらいシンプルじゃないと。
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からテーブルを作るという一方通行が好みなら何とかしないと生産性に響きます。僕の場合は後者ですが、話をできるのは少し先。
2009年8月7日金曜日
seam generate-entities
# 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 時点でデプロイされています)

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

次回は、generate-entitiesで作られたクラスを追いかけてみましょう。
2009年8月1日土曜日
Seam on 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
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
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
https://jira.jboss.org/jira/secure/ReleaseNote.jspa?version=12312739&styleName=Text&projectId=10071&Create=Create
JBossのデフォルトターゲットが5になりました。
2009年7月21日火曜日
seam-gen
あくまでも目安になりますが、以下くらいのスペックが無いと結構厳しいかと思います。
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] 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日日曜日
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 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
やり方は色々あるようですが、まー、とりあえずお試しってことで、一番シンプルな単に編集可能な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
ただし、巨大なので要注意。