2009年5月31日日曜日

Slim3でおーだーばい。


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

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



  1. ShopMeta shopMeta = new ShopMeta();  
  2. List<Shop> list = from(Shop.class).range(0,10).orderBy(shopMeta.createDate.desc()).getResultList();  
  3. List<BeanMap> shopList = new ArrayList<BeanMap>();  
  4. for (Shop b : list) {  
  5.   BeanMap m = new BeanMap();  
  6.   BeanUtil.copy(b, m);  
  7.   shopList.add(m);  
  8. }  
  9. requestScope("newShopList", shopList);  


んー。。。エクセレント。なんかきれいです。
なんか直感的なソースが良いですね。

Slim3でユーザの検索


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

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



  1. UserService userService = UserServiceFactory.getUserService();  
  2. User user = userService.getCurrentUser();  
  3.   
  4. ShopMeta shopMeta = new ShopMeta();  
  5.       List<Shop> list = from(Shop.class).where(shopMeta.creator.eq(user)).getResultList();  


ShopMetaは自動的に作られます。(aptとかをプロジェクトで設定します)
creatorはJDOで保存しているカラムの一部です。
※aptについては今勉強中です。後日設定方法を書きます。

なんかおしゃれになってきましたね。
もし私がゴクウだったら「おらワクワクしてきたぞ状態」です。

2009年5月26日火曜日

Slim3でリソース表示(訂正)


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

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



※以下コメントを受けまして、少し訂正を入れています。
 訂正と言うか注釈ですね。。。

Slim3を触っています。
構築中っていうことでまだ単純な機能が足りません。
※訂正:単純な機能ではなく、私のスキルが足りなかったようです。

ん。。。JSPにリソースを表示したい。。。
ってことでオリジナルで作ってみました。
おそらく近日本家で実装されますんで
※訂正:コメントより、作られるのではなくJSTLで既にあるようです。


taglib作成の参考として読んでください。

まずtldファイルを作成します。



で作成したところにあるfunction-classを生成します。



ResourceBundleの生成に使っている"application"はクラスパス+名称になります。
のでこの設定だとクラスパス直下にapplication.propertiesやapplication_ja.propertiesを
作成しておきます。※ResourceBundleは国際化されています。


  1. <%@taglib prefix="res" uri="http://mog.ziro.bz/resource"%>  
  2.   
  3. ${res:get("mog.l.title")}  


で表示することができます。
uriに指定するのはtldのuriに記述したURIです。
こういうtaglib作成があるんですね。Slim3のFunctionを参考にさせてもらいました。

TDDってもんを完全に守ったこともない僕にはまだまだ。。。
それでもコミッタを夢見るの巻きでした。

2009年5月25日月曜日

Slim3Struts廃止・・・

Struts本命の僕には悲しいニュースです。

ただ。。。

Seasar Conference 2009 Spring - 6/13(SAT), Tokyo

ここで面白い話が聞けそうです!
ちょっくら行く予定です。

2009年5月23日土曜日

HTMLにFlashを埋め込む

http://code.google.com/p/swfobject/

からswfobject.jsを取ってきて読み込みます。

  1. <script type="text/javascript" src="assets/js/swfobject.js"></script>  
  2. <div id="flashcontent_container">  
  3. FlashPlayerがない  
  4. </div>  


JavaSctiprなどで埋め込みます。

  1. var so = new SWFObject("MogPlayer.swf""MogPlayer""260""400""9");  
  2. so.addParam("allowScriptAccess""always");  
  3. so.addParam("menu""false");  
  4. so.addParam("scale""noscale");  
  5. so.setAttribute("id""playerWrapper");  
  6. so.write("flashcontent_container");  
  7.   
  8. SWFID = "playerWrapper";  

FlexでRadioButton

Flexでラジオボタンを設定します。

  1. <mx:RadioButtonGroup id="answer"/>  
  2. <mx:RadioButton id="answer1" groupName="answer" value="1" label="選択肢1" width="100%"/>  
  3. <mx:RadioButton id="answer2" groupName="answer" value="2" label="選択肢2" width="100%"/>  
  4. <mx:RadioButton id="answer3" groupName="answer" value="3" label="選択肢3" width="100%"/>  
  5. <mx:RadioButton id="answer4" groupName="answer" value="4" label="選択肢4" width="100%"/>  


でラジオボタンを作成します。
その後スクリプトなどでRadioButtonGroupで指定したIDのselectedValueを利用して
どれが選択されているかがわかります。

  1. if ( nowAnswer == answer.selectedValue ) {  
  2.  Alert.show("正解!");  
  3. else {  
  4.  Alert.show("ブー");  
  5. }  

2009年5月16日土曜日

Javaでセッション管理

JavaのWebアプリでオブジェクトをセッションに
登録、削除した時にイベントを発生する場合
HttpSessionBindingListenerをimplementするとイベントを発生することができます。

  1. public class Account implements HttpSessionBindingListener {  
  2.   
  3.  @Override  
  4.  public void valueBound(HttpSessionBindingEvent arg0) {  
  5.  }  
  6.   
  7.  @Override  
  8.  public void valueUnbound(HttpSessionBindingEvent arg0) {  
  9.  }  
  10. }  


って感じです。

DataNucleusでJDBC接続

datanucleus.propertiesを作成して
  1. javax.jdo.PersistenceManagerFactoryClass=org.datanucleus.jdo.JDOPersistenceManagerFactory  
  2.   
  3. javax.jdo.option.ConnectionDriverName=org.hsqldb.jdbcDriver  
  4. javax.jdo.option.ConnectionURL=jdbc:hsqldb:hsql://localhost/sealion_db  
  5. javax.jdo.option.ConnectionUserName=sa  
  6. javax.jdo.option.ConnectionPassword=  
  7. javax.jdo.option.Mapping=hsql  

クラスパスのトップにおいて
  1. private static final PersistenceManagerFactory pmfInstance =  
  2.        JDOHelper.getPersistenceManagerFactory("datanucleus.properties");  
  3.    public static PersistenceManagerFactory get() {  
  4.        return pmfInstance;  
  5.    }  

でPersistenceManagerFactoryを取得します。

これと同様にMETA-INF/jdoconfig.xmlを作成して
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"  
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.    xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">  
  5.   
  6.    <persistence-manager-factory name="transactions-optional">  
  7.        <property name="javax.jdo.PersistenceManagerFactoryClass"  
  8.            value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>  
  9.        <property name="javax.jdo.option.ConnectionURL" value="appengine"/>  
  10.        <property name="javax.jdo.option.NontransactionalRead" value="true"/>  
  11.        <property name="javax.jdo.option.NontransactionalWrite" value="true"/>  
  12.        <property name="javax.jdo.option.RetainValues" value="true"/>  
  13.        <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>  
  14.    </persistence-manager-factory>  
  15. </jdoconfig>  

と行います。
その場合は
  1. private static final PersistenceManagerFactory pmfInstance =  
  2.        JDOHelper.getPersistenceManagerFactory("transactions-optional");  
  3.    public static PersistenceManagerFactory get() {  
  4.        return pmfInstance;  
  5.    }  

って感じになります。
何個もセッションを用意する場合は、指定子(transactions-optional)を
変更して追加します。

2009年5月15日金曜日

HSQLDBとDataNucleus

hsqldb-1.9.0-alpha2を使ってたら
スキーマを作成するところで

java.sql.SQLException: unexpected token: NULL

と出ます。
DataNucleusのせいだと思っていたのですが
良く調べたら、create tableで

"NAME" VARCHAR(256) NULL,

みたいな指定ができないようです。
何か久々に無駄につかれた。
※同時に2個調査しようとするのが悪い

2009年5月11日月曜日

DataNucleusをEclipseで使う

GAEだと勝手にEnhancerが動作していますが
JDOを単独で使うと都度「実行」を行っていました。
・・・しかしなんかあるだろうと思ったら本家にありました。

http://sourceforge.net/project/showfiles.php?group_id=222750&package_id=273215

ここからJARをダウンロードしてきて
Eclipseのpluginディレクトリに追加します。
Eclipseを再起動するとプロジェクトの右クリックに
「DataNucleus」が追加されます。




この画像の通り、AddするとDataNucleusがサポートされます。
その後Autoを設定しておくと更新ごとにEnhanceしてくれます。
※プロジェクトの設定でLog4Jのファイルを変更しないとエラーが出ます。

スキーマなどもここで動作します。
これで少し開発が簡単にいくかな?
※POJOからxmlファイルの作成もしてくれそうですね。

2009年5月9日土曜日

DataNucleusを動かしてみる

GAEやSlim3を動作させてきました。
せっかくなのでSlim3を生で使いたいと思い立ちました。
Hibernate,S2DAOなどを使って。。。と思いましたが
せっかくなのでDataNucleusを使ってHSQLDBにアクセスしたと思います。
※とは言ってもサンプルです。

まず、DataNucleusのページから
http://sourceforge.net/project/showfiles.php?group_id=222750

・core
・rdbms
・enhancer
・sample

をダウンロードしてきます。

ObjectWebのASMサイトから
http://forge.ow2.org/project/download.php?group_id=23&file_id=9309

・asm

をダウンロードしてきて

Log4Jから
http://logging.apache.org/log4j/1.2/download.html

・Log4J

をダウンロードしてきます。
ApacheJDOから。。。といきたいところですが
JDOの2.3が必要ですので
http://www.datanucleus.org/downloads/maven2/javax/jdo/jdo2-api/

・JDO

をダウンロードしてきます。
HSQLDBから
http://sourceforge.net/project/platformdownload.php?group_id=23316&sel_platform=14519

・HSQLDB

をダウンロードしてきます。

JDOの2.3ってGAEでも使ってるんですけど良いんでしょうね。
※SNAPSHOTからea(アーリーアクセス?)に代わってますね。

解凍してきたHSQLDBの
demo/runServer.bat実行してDBを立ち上げます。


で、DataNucleusのsampleを解凍してeclipseに展開します。
でダウンロードしてきたそれぞれのjarをlibディレクトリなどに展開。
jarをクラスパスに追加してMainを実行します!



・・・・あれ?うごかない。。。
って調べていたら
JDOの設定ファイル「package.jdo」がない。。。
あれ?ormファイルならある。。。なんかの仕様変更ですかね。。。


http://www.datanucleus.org/products/accessplatform_1_0/guides/jdo/tutorial.html

にあるjdoファイルをコピーして作成します。
・・・それでも実行してもダメでした。

buildファイルなら実行可能なんですが、、、
GAEで見たことあるような、、、

おー!Enhancerですね。


「org.datanucleus.enhancer.DataNucleusEnhancer」を
「src\java\org\datanucleus\samples\jdo\tutorial\package.jdo」を引数にして
実行する必要があります。


・・・これで実行できますがこれは何の為にやってるんだか。。。

ひとまずこれで実行可能になります。
さぁ開発開始だぁー!

2009年5月7日木曜日

JDO関連のデプロイ後の遅延



GAEのアプリケーション管理画面の
「DataStore」→「Indexes」を見ると画像のような画面が出ます。
ここの「Serving」が「Building」ってなってると
パーシスタントクラスの関連を構築中だって意味になります。

こないだやった時は半日(途中睡眠があるのでもう少し早いかも)かかりました。
デプロイした後試せるのは結構時間がかかります。

http://code.google.com/intl/ja/appengine/kb/general.html#indexes

ここにいろいろ書いてあります。

Slim3でディレクトリを表現

Slim3では設定ファイル「slim3_configuration.properties」に

  1. slim3.controllerPackage=bz.ziro.mog.slim3.controller  
  2. slim3.viewPrefix=/WEB-INF/jsp  


という風にパッケージとJSPのディレクトリを記述して
URL(ディレクトリ)を表現していきます。
デモアプリにもあるように。。。なんかいっぱいコントローラーが出来上がってくると

・管理が煩雑になるのでは。。。
・いやいやきっと抜け道がある。。。


・・・後者でした。
「mng」というディレクトリを作ってその下に
アプリケーションを画像の通りに構築します。




「/mng/」にアクセスすると、MngControllerが動作してくれます。
※JSPは「mng下にファイルです」
「/mng/shop/」にアクセスすると mng.ShopControllerが動作してくれます。
※JSPは「mng/shop下にファイルです」

やっぱこのくらいのことは考えてあるんですね。

GAEにデータを保存


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

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



さて、Slim3を手に入れ、Strutsでアップロードを可能にした私は
ついにデータを保存するということに挑戦。
っていうか簡単なんですけどね。

単純にBlobデータを使いました。
ファイルをアップロードして
FormFileからInputStreamを取り出して
ByteArrayOutputStreamを利用して

  1. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  2. InputStream stream = aFile.getInputStream();  
  3. byte[] buffer = new byte[8192];  
  4. //終了まで読み込み続ける  
  5. while (stream.read(buffer) != -1) {  
  6.  baos.write(buffer);  
  7. }  
  8. Blob imageBlob = new Blob(baos.toByteArray());  


[com.google.appengine.api.datastore.Blob]ですね。
を生成します。

これをJDOで永続化してBigTableに保存します。

でそれを検索して

  1. Image image = getPersistentImage(Long.valueOf(shopId),Long.valueOf(imageId));  
  2. Blob blob = image.getImage();  
  3. rtnByte = blob.getBytes();  


※ImageってのはBlobを保存したパーシスタントクラスです。

取得します。
これをストリームに描きだしたりすると画像が出ます!

Blobを見た時からこれをやりたかったんですけどね。
Slim3の力を借りてここまでたどり着きました!

2009年5月5日火曜日

ひとまずGAEでSlim3を動かしてみよう!


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

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



GAEでSlim3の使い方をやってみます!

みなさん。SVNでアクセスは可能ですか?
http://slim3.googlecode.com/svn
だったら上記にリポジトリパスを設定しましょう。
※eclipseっす。



ここから「slim3-demo」チェックアウトして、
後はGAEでデプロイするだけです。

※アプリケーションIDは自分のアプリケーションに設定して、
 バージョンも1つにしましょう。


思いのほかデプロイが簡単でびっくりしています!

2009年5月4日月曜日

押してもだめならSlim3化

GAEにてファイルアップロードを行っていました。

ひがやすを氏がStrutsでのファイルアップロードを成功したようで
オープンソースらしいので少しお知恵を拝借しようと。。。
http://d.hatena.ne.jp/higayasuo/20090411/1239460908

と思い少しソース(+ブログ)を眺めていたら。。。
「俺は一体何をしているのだろうと。。。」
と思ってしまいました。
※ちなみに「S3MultipartRequestHandler」を利用して
 やっているみたいですね。
久々にソース(+ブログ)に感動しました。

Seasarには結構前にトライしましたが
客先に乗せるのは困難だと判断して少し離れていましたが
Slim3の考えには賛同できる気がします。


ってことでソースを借りるのではなく「On」させてもらおうと。。。
まぁ挫折の可能性は高いですが。。。