ラベル Slim3 の投稿を表示しています。 すべての投稿を表示
ラベル Slim3 の投稿を表示しています。 すべての投稿を表示

2011年6月3日金曜日

Evernoteにアクセスする その3 サンプルをシンプル編


サンプルはJSPでOAuthを分かりやすく記述していますが
手数が多く記述してあるので、実装としてはわかりずらいので
一旦整理してみましょう。

Google for Eclipse Plugin[更新サイト:http://dl.google.com/eclipse/plugin/3.6] と
Slim3 Plugin[更新サイト:http://slim3.googlecode.com/svn/updates/]をインストールします。

Slim3はGoogleAppEngineに最適化されたMVCフレームワークです。
非常に簡単なので説明は省きます。

indexを作成して


SimpleOAuthRequest oauthRequestor =
new SimpleOAuthRequest(requestTokenUrl,consumerKey,consumerSecret,null);

//現在のURLからコールバックURLを作成
String thisUrl = request.getRequestURL().toString();
String cbUrl = thisUrl.substring(0, thisUrl.lastIndexOf('/') + 1);
cbUrl = cbUrl + "callback";

oauthRequestor.setParameter("oauth_callback", cbUrl);
Map reply = oauthRequestor.sendRequest();

String requestToken = reply.get("oauth_token");
String authorizationUrl = authorizationUrlBase + "?oauth_token=" + requestToken;

//認証にリダイレクトを行う
return redirect(authorizationUrl);


設定値などはコールバックURL以外はそのままです。
SimpleOAuthRequestを利用して認証用のURLを作成してそのままリダイレクトをかけてます。
※もちろんログインボタンとか作りたいなら別ですけど。

これにより/indexにアクセスするとEvernoteの認可画面が表示されるはずです。
それではコールバックURLを指定してみましょう。
callbackを作成して



SimpleOAuthRequest oauthRequestor = new SimpleOAuthRequest( requestTokenUrl, consumerKey, consumerSecret, null);

String requestToken = requestScope("oauth_token");
String verifier = requestScope("oauth_verifier");
oauthRequestor.setParameter( "oauth_token", requestToken);
oauthRequestor.setParameter( "oauth_verifier", verifier);

Map reply = oauthRequestor.sendRequest();

String accessToken = reply.get("oauth_token");
String shardId = reply.get("edam_shard");
String noteStoreUrl = noteStoreUrlBase + shardId;

THttpClient noteStoreTrans = new THttpClient(noteStoreUrl);
TBinaryProtocol noteStoreProt = new TBinaryProtocol(noteStoreTrans);
NoteStore.Client noteStore =
new NoteStore.Client(noteStoreProt, noteStoreProt);

List notebooks = noteStore.listNotebooks(accessToken);
for (Notebook notebook : notebooks) {
logger.info("Notebook: " + notebook.getName());
}


これもサンプルと同じ実装ですね。
もちろん認証してなかったら~とかの処理は必要ですが、
何やっているかを分かりやすくするため、2つのURLだけで実装してみました。

ListのところはNotebookを返してたので?じゃなくしました。
THttpClient はライブラリに存在するthriftのAPIですね。
それらを利用してEvernoteのAPIを利用するイメージです。

SimpleOAuthRequestの実装を説明しないと何やってるかわかりずらいですね。
次回はSimpleOAuthRequestについて記述してみましょう。

2010年4月24日土曜日

ExCellaで帳票

最近ExCellaを触ってます。

実際はGoogleAppEngineでサービスを目標にしていて、
一部ExCella自体をいじりながらの開発です。
一応Excelが出力できたのでブログを起こしておきましょう。

やっぱりGAEでネックになるのは
ファイルシステムとの問題です。

まず、core側にあるExporterのTextExporterとWorkbookExporterを
削除しました。
単純にいうとまずはスモールスタートの為に
ExcelOutputStreamExporterのみをサポートする事にしました。

本来はXLS周りを使用してみたかったのですが
POI自体(ExCella内部で使っている)が、テンプレートの読み込み途中で
xmlファイルを保存している感じがあって、落ちてしまいます。

なので一旦はExcelに集中。


ExCella自体がファイルへの出力重視的な実装になっていて
親クラスで「出力ファイル名」等を持つことが多いみたいなので
ひとまずそのあたりを削除。
エラーになるところを潰していくような作業になりました。


・・・実際は根本の部分でOutputStreamの設定する仕組みに変えるべきだと
。。。ブログ書いてる途中に思いまして、ちょっと実装しなおそうかな?
って思っています。

現状だと


ByteArrayInputStream inStream = new ByteArrayInputStream(template.getBytes());

ReportBook outputBook = new ReportBook(inStream,ExcelOutputStreamExporter.FORMAT_TYPE);

ReportSheet outputSheet = new ReportSheet("テンプレート","請求書");

outputBook.addReportSheet(outputSheet);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
ReportProcessor reportProcessor = new ReportProcessor();
stream = reportProcessor.process(outputBook);

response.setHeader("Content-Disposition","attachment; filename=excel.xls");
response.setContentType("application/msexcel");
response.setContentLength(stream.toByteArray().length);

OutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(stream.toByteArray());
out.close();


こんな感じで動作します。

GAEでの動作なのでinputStreamは
テンプレート用のファイルをDataStore上に溜め込んでいます。

コードネームはdon-gabachoです。
あー。。。もういっかい書き直して
全部書き留めないとなぁ。。。

※2010/4/25 でリファクタリング完成
http://code.google.com/p/don-gabacho/wiki/ExCella?ts=1272171109&updated=ExCella
streamをBookから引き渡すように変更しています。

2010年3月2日火曜日

Slim3でクラウド開発を始める。その4


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




第二弾をやってから第一弾をやらないと、
アノテーションのところがプロジェクト名に依存しているので
大変な事になりそう(>_<)すみません。


今回はGoogleAppEngineへのデプロイです。

GooglePluginを入れると左上に以下のアイコンが出ます。
それをポチッとな。


するとデプロイの画面がでますので、
プロジェクトを選択して、管理者のメールアドレスとパスワードを入力します。




画像では切れていますが、SDKの設定があるのでそこをクリック!



出てきた画面にGoogleAppEngineにアプリケーションを登録した際の
IDを入力します。

これで設定は完了です。

デプロイしたらURLにアクセスしてください。
おそらくアプリケーションが表示されている。。。。はずです。

2010年2月27日土曜日

Slim3でクラウド開発を始める。その3


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




第一弾第二弾

そういえば少し前にGAEがDataNucleusを使ってるので
それを使って、HSQLDBにつなげた事もありました(>_<)


で本題です。
Slim3は同時にテストも出力してくれます。
なのでその設定をします。

まずプロジェクトを選択して、設定を行います。
その後、Javaのコードスタイル、インポートの編成を選択して
プロジェクト特有の設定を行います。



(java.lang.Math.*)に必要なインポート数を「1」に設定します。



終わったら画面を閉じて「ウィンドウ」から「設定」を選択します。


Javaのエディタにコンテンツ・アシストがあります。
そこにお気に入りがあるので選択して


以下を追加します。

org.hamcrest.CoreMatchers
org.junit.Assert
org.junit.matchers.JUnitMatchers


で「一般」を選択すると「ワークスペース」があります。


そこに「自動的にリフレッシュ」がありますんで


選択してください。

2010年2月22日月曜日

Slim3でクラウド開発を始める。その2


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





第一弾

さぁ第二弾です。
いよいよSlim3 RC1が近づいて参りました。
今回はsllim3-blankの名称を変更したい時の話をします。


まずプロジェクトで右クリックします。
その後リファクタを選んで、名前変更を選択します。
もしくはプロジェクトを選択して、F2でもOK。

出てきたボックスに対して、
自分の好きな名前(任意)を書きます。

するとプロジェクト名が変わります。
その後、build.xmlを選択して、
nameを変更します。

こんな感じですかね?

第三弾に続く。

2010年2月21日日曜日

Slim3でクラウド開発を始める


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



Slim3に飛びついたのは、GoogleAppEngineで
ファイルのアップロードができるし、Strutsだったから
飛びついたのを覚えています。
現在はStrutsには対応していませんが
MVCが整った軽量なフレームワークです。

使用するにはeclipseとGoogle Plugin for eclipseが必要です。

「http://slim3.googlecode.com/svn」
[slim3-blank]をチェックアウトします。
※Downloadからblankをダウンロードしてインポートしても
  開発は開始できます。
現在SDKは1.3.1のようですね。

作成されたプロジェクトで右クリックを押して、
コンパイラのアノテーションのファクトリーパスを選択します。
右の画像の画面を出してjarを選択します。


まだアーリーアクセス(EA)なんですね(>_<)
完成度結構高いんですけどね。


んでプロジェクトで「war/WEB-INF/web.xml」を
開きます。
右の部分が自分の名前空間になりますから
何か適当な名前をつけましょう!

その後はプロジェクト直下にある
build.xmlを選択して右クリックで
実行を押して、下のantを選択します。





すると右の画面が出ます。

gen-controllerはコントロールを自動作成
gen-modelはモデルを自動作成してくれます。

gen-controllerで出てくるボックスに
URLを指定してあげるとその指定したURLを
操作するControllerとJSP、プラステストコードを出力してくれます。
modelはそのモデルクラスとテストコードを出力してくれます。


2010年2月9日火曜日

OAuthとTwitter4J(Slim3とFlexも)

先日Flex(AS3)でOAuth認証を行いました。
しかし、セキュリティサンドボックスの問題により、棚上げしました。
セキュリティサンドボックスも何かまとめないとですね。

って事でWeb側でTwitterにアクセスしてサービスを実現する事にしました。
結局、プロキシになっちゃいました。
まぁ挙動さえ分かってしまえばこっちのもんです。

ちなみにOAuth部分はTwitter4Jに任せてますので
その挙動を見たければsourceを添付してあげて調べてください。

※ソースは一部関数化してるものを平らにしているので
変数名とかはおかしいかも。。。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);
try {
RequestToken requestToken = twitter.getOAuthRequestToken();
String url = requestToken.getAuthorizationURL();
requestScope("url",url);
sessionScope("requestToken",requestToken);
} catch (TwitterException e) {
new RuntimeException(e);
}


まず、Twitterオブジェクトを取得してアプリケーションのキー値を設定します。
そこからURLを取得してきます。それを返します。

その後、Pinを取得して処理する場合に新たにRequestTokenを作成すると
おかしくなるのでセッションに設定しました。
※requestScope(),sessionScope()はSlim3のメソッドです。
リクエストやセッションに溜め込んでください。

そのリクエストを元にURLにアクセスします。
私の場合はFlexなので


//リンクを飛ばす
navigateToURL(new URLRequest(oauthUrl));


って感じになりました。

ここにアクセスすると横の画像のWebが別ブラウザで表示されます。
Twitterアカウントを入力すると認証され、



Pinが表示されます。
。。。。画像で表示されます。選択してコピーして
そのPinを自分のWebページなどで入力します。

。。。ここでコールバックなどをうまく使えば
多分何手かUIを改善できそうな気がするんですけどね。



私の場合はそれを元にPinを入力して再度サーバサイドで処理を行いました。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);
String pin = requestScope("pin");
RequestToken requestToken = sessionScope("requestToken");

AccessToken accessToken = null;
try {
accessToken = twitter.getOAuthAccessToken(requestToken, pin);
} catch (TwitterException e) {
throw new RuntimeException(e);
}
String token = accessToken.getToken();
String tokenSecret = accessToken.getTokenSecret();


先ほど保存しておいたRequestTokenと取得したPinをリクエストから受け取り、
AccessTokenを取得します。
それによりトークンを取得する事が必要です。

私はここでSlim3 Datastoreを使用して、トークンを永続化しています。
ちなみにですが、私が作ってるのは認証アプリなので
認証をしたUserオブジェクト(GAE)も保存しています。


その後はログインしたユーザを元に
このトークンを取得してきて処理をします。


Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(KEY, KEY_SECRET);

AccessToken accessToken = new AccessToken(data.getToken(),data.getTokenSecret());
twitter.setOAuthAccessToken(accessToken);
twitter.updateStatus(tweet);


dataは永続化したオブジェクトです。
updateStatus()はtwitter4jのつぶやく機能です。

こんな感じでサービスを作成しました。
ユーザ情報を保存したくなくて、OAuthに対応しましたが、
色々とツールがあって簡単にできるもんですね。

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月13日土曜日

ガツンとSlim3

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

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


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

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


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

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

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

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

2009年5月31日日曜日

Slim3でおーだーばい。


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

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




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


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

Slim3でユーザの検索


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

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




UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

ShopMeta shopMeta = new ShopMeta();
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ファイルを作成します。


<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

<description>Mog resource library</description>
<display-name>Mog resource</display-name>
<tlib-version>1.1</tlib-version>
<short-name>res</short-name>
<uri>http://mog.ziro.bz/resource</uri>

<function>
<description>
resource bundle get
</description>
<name>get</name>
<function-class>bz.ziro.mog.jsp.Resource</function-class>
<function-signature>java.lang.String get(java.lang.String)</function-signature>
<example>
${f:get(param)}
</example>
</function>

</taglib>


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


package bz.ziro.mog.jsp;

import java.util.ResourceBundle;

public final class Resource {

private static ResourceBundle resources = ResourceBundle.getBundle("application");

public static String get(String aKey) {
return resources.getString(aKey);
}
}


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



<%@taglib prefix="res" uri="http://mog.ziro.bz/resource"%>

${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月7日木曜日

Slim3でディレクトリを表現

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


slim3.controllerPackage=bz.ziro.mog.slim3.controller
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を利用して


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


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

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

でそれを検索して


Image image = getPersistentImage(Long.valueOf(shopId),Long.valueOf(imageId));
Blob blob = image.getImage();
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」させてもらおうと。。。
まぁ挫折の可能性は高いですが。。。