2009年6月28日日曜日

GAEでVelocity

少しテンプレートエンジンを使いたいなぁ。。。って思ったので
Velocityを使うことにしたんだけど、
GAEはファイルシステムはないので、、、って思ってたら
メモリ上で展開できるみたい。


VelocityContext context = new VelocityContext();
StringWriter writer = new StringWriter();
String template =
"テンプレートのテストです[${name}]" +
"";
context.put("name", "なまえー");
Velocity.evaluate(context, writer, "vecocityTest", template);


これでwriterに設定できます。
テンプレートを「com.google.appengine.api.datastore.Text」で
保存すれば使えそうですね。

実行にはVelocity、commons-lang、commons-collectionが必要です。

2009年6月27日土曜日

GAEで派生データを登録


すでにこの設定などは古くなっている可能性があります。

Slim3の開発はこんなブログより正式ドキュメントが有効です。
Slim3サイト
非公式と言われていますが充実した日本語サイトもあります。
Slim3日本語サイト



少し前に試した時にダメだったので諦めていたのですが、
再度チャレンジしたらOKだったので投稿しておきます。

親クラスを準備します。

package bz.ziro.slim3.test.model;

import java.io.Serializable;
import java.util.Date;
import java.util.logging.Logger;

import javax.jdo.JDOHelper;
import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.annotations.Version;
import javax.jdo.annotations.VersionStrategy;

import com.google.appengine.api.users.User;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
@Version(strategy = VersionStrategy.VERSION_NUMBER)
public class Parent implements Serializable {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(Parent.class.getName());

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String key;


@Persistent
private User creator;
@Persistent
private Date createDate;
@Persistent
private User editor;
@Persistent
private Date editDate;

/**
* @return the key
*/
public String getKey() {
return key;
}

/**
* @param key
* the key to set
*/
public void setKey(String key) {
this.key = key;
}
public User getCreator() {
return creator;
}

public void setCreator(User creator) {
this.creator = creator;
}

public Date getCreateDate() {
return createDate;
}

public void setCreateDate(Date createDate) {
this.createDate = createDate;
}

public User getEditor() {
return editor;
}

public void setEditor(User editor) {
this.editor = editor;
}

public Date getEditDate() {
return editDate;
}

public void setEditDate(Date editDate) {
this.editDate = editDate;
}

/**
* @return the version
*/
public long getVersion() {
return (Long) JDOHelper.getVersion(this);
}
}



でこのクラスを派生した子クラスを準備します。


package bz.ziro.slim3.test.model;

import java.io.Serializable;
import java.util.logging.Logger;

import javax.jdo.JDOHelper;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.Version;
import javax.jdo.annotations.VersionStrategy;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
@Version(strategy = VersionStrategy.VERSION_NUMBER)
public class Child extends Parent implements Serializable {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(Child.class.getName());

@Persistent
private String name;
@Persistent
private String detail;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
/**
* @param detail セットする detail
*/
public void setDetail(String detail) {
this.detail = detail;
}
/**
* @return detail
*/
public String getDetail() {
return detail;
}
/**
* @return the version
*/
public long getVersion() {
return (Long) JDOHelper.getVersion(this);
}
}



これで準備完了です。
ChildオブジェクトをGAE(JDO,BigTable)で登録すれば
Parentの属性も登録できます。


実装の通り、登録ユーザや登録日付などテーブル内にある同一の属性を
親クラスを利用することにより、はしょることができます。
まぁ私の場合は更新時などにオブジェクトに都度同一の実装が必要になり
困っていたので助かります。

JDOを知った時に論理モデル(つうかUML記述?)をそのまま使えるなぁ。。。
って思ってやったらダメだったんですけど、やっぱできるんですね。

ちなみにDataNucleusでJDBC(HSQLDB)で同じようにやると
Parentテーブルがにもデータがあって。。。って感じになった記憶があります。
※同一のエンティティではないです。


ちなみにSlim3のDaoでMetaクラスを利用して検索式を作成しても
ChildMetaに存在しないのでエラーになります。
問い合わせるかはもう少し試してからにしようと思ってます。

2009/07/08 ※再度試したらSlim3でも動作しました。
2009/07/26 ※再度試したらSlim3で動作。。。っていうかGAEで動作しませんでした。
ので、Embeddedの話で記述します。

Slim3で開発を始める。


すでにこの設定などは古くなっている可能性があります。

Slim3の開発はこんなブログより正式ドキュメントが有効です。
Slim3サイト
非公式と言われていますが充実した日本語サイトもあります。
Slim3日本語サイト



Slim3はGAE用に最適化され開発されているフレームワークで
すごくシンプルに開発できるように工夫されています。


今回は現在のSlim3での開発をおさらいしてみましょう。
まだ開発中ですので違う手法になっている可能性もあるので
十分に気をつけていただければ幸いです。
※eclipseでの開発です。

まず、「http://slim3.googlecode.com/svn」にSVNでアクセスして
「trunk/slim3-blank」からチェックアウトを行います。
ライブラリを落とし込んで来て作成するのもよいのですが
genで使用しているaptの設定などがあるのでblankで作成しておくのが良いでしょう。

で現在、aptの設定がプロジェクト名に依存しているので
プロジェクト名を変更した場合それを変更する必要があります。
プロジェクトで右クリック「プロパティ」をクリック
「Javaコンパイラー」→「注釈処理」→「ファクトリーパス」において
編集で「lib/slim3-genEA1-SNAPSHOT.jar」を再度指定します。



war/WEB-INF/web.xmlの中にある

<context-param>
<param-name>slim3.rootPackage</param-name>
<param-value>slim3</param-value>
</context-param>
<context-param>
<param-name>slim3.staticPackages</param-name>
<param-value>model</param-value>
</context-param>


の部分をオリジナルの名前空間に変更します。
「slim3.rootPackage」が自分の作成するアプリケーションのルートパッケージで
指定した位置がHotReloadingの対象になります。
「slim3.staticPackages」がHOTの対象外のパッケージを設定します。
カンマ区切りで指定できます。(モデルのパッケージは必ず指定してください)

これで開発の準備は完了です。

プロジェクトのルートにあるbuild.xmlで必要なクラスは
自動生成をして開発を進めていきます。

「gen-model」:エンティティ,Daoとそれぞれのテストクラスを出力してくれます。
「gen-controller」:controller,jspとそれぞれのテストクラスを出力してくれます。
※それぞれを指定する場合、パッケージ名は必要ありません。


build.xmlのprojectタグにある「name="xxxx"」を
自分のプロジェクト名に変更してあげる必要があります。


「gen-controller」で「index」と指定すると
ひとまずアプリケーションとして動作できるようになります。
※既存のjspやcontrollerは消しておいた方が良いかな。。。

2009年6月21日日曜日

SVNの設定(認証)

さて、SVNのインストールが終わったので設定します。
Apacheのhttpd.confに

<Location /svn/mog>
DAV svn
SVNPath /home/svn/mog
</Location>

を追加します。


svnadmin create /home/svn/mog


を行うとリポジトリが作成されます。
これでクライアントからアクセスできるはずですが
apacheの起動ユーザに対して権限があることが条件です。


さてDIGEST認証を使うにはApacheにDIGEST認証モジュールが必要です。
※Apacheのモジュールでインストールしてあれば問題ありません。

ソースのmodules/aaaに移動して

/usr/local/apache2/bin/apxs -D DEV_RANDOM -c ./mod_auth_digest.c
/usr/local/apache2/bin/apxs -i -a -n auth_digest mod_auth_digest.la


と行うとhttpd.confにLoadModuleが追加されるはずです。
これで準備はOK

Apacheに

<Location /svn/test>

DAV svn
SVNPath /home/svn/test

AuthType Digest
AuthName "SVN AUTH"
AuthUserFile /home/svn/.htdigest
Require valid-user

</Location>


って感じで追加します。


htdigest -c /home/svn/.htdigest "SVN AUTH" username


でパスワードを入力してApacheを再起動します。
で再起動すればOKです。

2009年6月20日土曜日

SVNをインストール

ソースを管理していたCVSのディスクがぶっ飛び、
せっかくなんでSVNをインストールしようと思い立つ

前準備で

http://www.oracle.com/technology/software/products/berkeley-db/index.html
※ごめんなさい。。。後述しますが、、、いらないかも。

からBerkeleyDBをダウンロードしてきて

cd dist/build-unix
../dist/configure
make
make install

を行います。
build-unixに入ってからconfigureを行うのがポイントです。

/usr/local/BerkeleyDB.4.7
ができています。


echo "/usr/local/BerkeleyDB.4.7/lib" >> /etc/ld.so.conf
/sbin/ldconfig


を行って共有ライブラリに追加しておきます。

でApacheをインストールします。
http://www.apache.jp/misc/download.html
などから持ってきます。


./configure --enable-modules=most --enable-shared=max --enable-dav=yes --with-berkeley-db=/usr/local/BerkeleyDB.4.7
make
make install


を行います。
モジュールをすべて入れています。

次にいよいよSubversionです。
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=74
からダウンロードしてきます。
sqlliteのソースなどがいるのでdepsもダウンロードしておきます。



./configure --with-apxs=/usr/local/apache2/bin/apxs \
--with-apr=/usr/local/apache2/bin/apr-1-config \
--with-apr-util=/usr/local/apache2/bin/apu-1-config
make
make install


一応これで完了です。
・・・んーと。。。文献だとberkeleyを
configureに設定していたんですけど。。。
なんかうまくいかなかったので外しました。

2009年6月13日土曜日

ガツンとSlim3

はてさて「Seasar Conference 2009 Spring」行ってきました。
行ってきたというより、ひがさんの話を聞いただけですけど。

まぁ単純に感想を言うと、為になったというか。。。
バイトを連れて言ったのですがわかりやすくてとても
参考になったというところでしょうか。


「ガツン」の節で始まるとは少し予想してませんでしたけど。

で、ひがさんに感化されたわけではないのですが
あんまりこういうことは書かんのようにしていますが一応言っておきます。


まぁ言語はなんでも良いんですよ。
ようは作るものだとか作りたいものに対してどうなのか?

Perlでも優れたシステムはあるし、RoRでもへなちょこなシステムはある。
※あくまでPerlは古いって意味合いだけ使ってますし
RoRは言語じゃないですけど、新しいって意味で使ってます。

言語は言語屋さんにお任せして(もちろん要望等は出しましょう)
私らはシステムを向きましょう。

だから私は「システムに絶対はない」と言うとるわけでして。