You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
![Slim3プロジェクトをJava7で開発できるようにした。@zaki50 さんありがとう。 仕事のプロジェクトなので、全体貼るのがめんどくさいのでdiffだけぺとんちょ。](https://cdn-ak-scissors.b.st-hatena.com/image/square/1ef26f6cb4349557952890dbe3e567f7f98dc151/height=288;version=1;width=512/https%3A%2F%2Fgithub.githubassets.com%2Fassets%2Fgist-og-image-54fd7dc0713e.png)
Slim3のリポジトリがGoogle CodeからGithubに以降になったようです。 Slim3/slim3 · GitHub 今までMavenでSlim3プロジェクトを作ることが多かったのですが、今までのやりかたはこんなでした。 $ mvn archetype:generate -DarchetypeCatalog=http://slim3.googlecode.com/svn/trunk/repository $ cd projectname $ mvn eclipse:eclipsegithubに以降になったことで、この方法では今後古いものしか取れなくなりそうですね。なので、Githubではどうしましょうか?の手順です。 まずは、Cloneします。 $ git clone https://github.com/Slim3/slim3.git私の環境では、/Users/thoriki
slim3ではエラーのハンドリングを各ActionクラスがhandleErrorを@Overrideすることで制御できるようだ。 とりあえず今は下記のようにしてエラーがGAE環境で発生した場合はerrorのIndexControllerに飛ばすようにしている。 ローカル環境ではExceptionの内容を画面で表示したいのでRuntimeExceptionUtil.convert(error)でそのままエラーとしている。 今後はローカル環境の場合はデベロッパー用のエラー専用画面を作成して開発をもっとよりよく容易にしたいところ。 protected boolean isLocal(){ return ServletContextLocator.get().getServerInfo().indexOf("Development") >= 0; } @Override protected Nav
先日、slim3-1.0.6がリリースされました。たくさん機能追加がありますが、最近の自分的に嬉しい機能のひとつにController内でInputStreamが使えるissue62への対応があります。 Support for Controller#createRequestHandler(): http://code.google.com/p/slim3/issues/detail?id=62 この機能を使用する際のテストケースの書き方の例を書いておこうと思います。あと、ついでにMetaクラスにJson->Model、Model->Jsonを行うユーティリティメソッドが追加されているのでそれも使っています。@takawitterさんの仕事です、ありがとうございます、便利です。 まずはController Httpメソッドとリクエストパラメータによって追加・修正・削除と1件返却、リスト返却
Slim3 のタイムゾーンの挙動が複雑なことに気が付いた。 FrontController では、タイムゾーンは UTC に設定されている。 TestCase から FrontController で設定されているタイムゾーンはローカル時間。 この場合、自分は日本時間に設定しているので、JST で設定されている。 TestCase で使う Controller のタイムゾーンはローカル時間。 この場合も JST で設定されている。しかし、org.slim3.util.DateUtil 利用した際のタイムゾーンは UTC になる。 org.slim3.util.DateUtil を利用すると、web.xml で設定している時間帯に自動的に変換される。 FrontController のタイムゾーンの挙動 コントローラー側の記述。 public class TimezoneController
国内で国内向けのアプリケーションを作っている限りは、タイムゾーンを意識することはほとんどありません。しかし、Google App Engine等を利用する場合、多国対応のアプリケーションを作るためにはタイムゾーンを正しく扱うことが必要不可欠です。というわけで、タイムゾーンをGAE/Slim3を使う場合に考慮すべき事をまとめました。 デフォルトのタイムゾーン Javaの場合、システムで持つデフォルトのタイムゾーンがあり、普段は暗黙的に利用されています。開発環境とプロダクション環境ではデフォルトのタイムゾーンが異なります。 開発環境 +0900 Asia/Tokyo プロダクション環境 +0000 UTC ※開発環境のタイムゾーンはシステムに依存します。 デフォルトのタイムゾーンを指定する GAE上を使うけどアプリケーションは国内向けであるのであれば、デフォルトのタイムゾーンを変更するのが簡単
(2/7更新) (2/26更新) (12/22更新 @Jsonはフィールド直接指定になりました) Slim3 JSON機能のドキュメントを書き始めました。まだ非公式なものですが、ひと通り書き終わったら公式へのマージを提案する予定です。でも、公式は英語なんですよね。どうしたものか。まぁ、いきなり下手な英語で書くより、まずは日本語でちゃんと書いたほうが良いはず。 というわけで、下記ドキュメントの草案です。若干改行が変ですが、evernoteに書きなぐってexportしたものを貼っつけてるためだと思います。これにあとJSON入出力のカスタマイズ方法を書いて一段落とする予定です。(書きました!) 概要 Slim3のJSON機能は、モデル(@org.slim3.datastore.Modelアノテーションが付加されたクラス)のJSON変換機能を提供します。JSON変換は、org.slim3.data
前回のエントリーはバグってました。修正版をアップします。 単純なカウンター import java.io.Serializable; import java.util.ConcurrentModificationException; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.slim3.datastore.Attribute; import org.slim3.datastore.Datastore; import org.slim3.datastore.EntityNotFoundRuntimeException; import org.slim3.datastore.Model; import org.slim3.util.Date
前回まで、slim3 の画面遷移制御用コンポーネントである ”Controller”について触れてきました。 今回は、この Controller から呼び出される/を呼び出す JSP の開発手順、およびその際の注意事項について見ていきます。 1.あらかじめ用意されているもの slim3-blank をインストールする際、あらかじめ以下のものが用意されています。 ベースとなる JSP 部品 CSS これらをベースに、自動生成した JSP(後述)に修正を加えていく形で、JSP を開発していくことになります。 なお、slim3-blank のインストール時に用意されているファイルについては、slim3のプロジェクト構成をご覧下さい。 (1)ベースとなるJSP部品 war ディレクトリ下に、以下の4つの JSP 部品が用意されています。 JSP ファイル名 内容 header.jsp ヘッダー:タ
Google App EngineにはTransactionは1つのEntity Group内でしかできないという制限があります。詳しくは、App EngineのEntityGroupを理解しよう - yvsu pron. yasを参照してください。 そうするとある口座から別の口座にお金を振込むような送金のパターンで、Transactionを利用することができません(すべての口座を1Entity Groupに押し込むと更新がぶつかって現実的ではないから)。送金パターンで整合性を保つためには、理論的には次のようになります。 http://songofcloud.gluegent.com/2009/11/blog-post_18.html 実装するとこんな感じ。 http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engi
リストプロパティpersonKeysへのINフィルタを、プロパティlatestFavDateによるソートで並べ替えようとしたら頭がこんがらがったのでメモしておきます。 List<Boke> favBokes = Datastore.query(meta).filter(meta.personKeys.in(keys)).sort(meta.latestFavDate.desc).asList(); 最初はこれでいいかと思ったけど、上記のケースはカスタムインデックスが必要でした。 リストプロパティでカスタムインデックスを作ってしまうと、値のぶんだけインデックスが作られてしまうので、インデックス爆発の危険が大きい(はず)。 このへん、どういうインデックスが必要なのかスプレッドシートなどで実際に書いてみないと、自分の手には負えませんでした。頭の中だけで組み立てようとしたら、インデックスより先に自
これまでの記事はこちら。 JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part1 - Jupitris on Laboratory JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part2 - Jupitris on Laboratory JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part3 - Jupitris on Laboratory JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part4 - Jupitris on Laboratory 今回は、JSONICのRESTサーブレットで、デフォルト以外のメソッドの定義の仕方について。 ここでいうデフォルトとは、WebサービスAPI (JSONIC 1.3)の下表で定義されている状態をいいます。 HTTP
以前は「Struts の Action を書くだけの簡単なお仕事」しかしてなかったので色々と鬼門が多い… 最近は AppEngine + Slim3 で細々と Web アプリを組んでるんだけど、HttpServlet を継承したクラスなんて書いたことないお…といった感じでハマってます。 というわけで色々試したり調べたりアドバイスをいただいて書いたことをメモ。 今日は AppEngine で BigTable にストアしたデータからフィードを生成して出力しました。 まず、通常のサーブレットであればこんな感じ(jdom使ってます import java.io.IOException; import java.io.Writer; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest
<project> <properties> <pirka.version>0.3.0</pirka.version> <pirka-slim3.version>0.2.0</pirka-slim3.version> <scenic3.version>0.4.2</scenic3.version> <slim3.rootPackage>【Your rootPackage】</slim3.rootPackage> </properties> <repositories> <repository> <id>maven.deathmarch.jp</id> <name>The Deathmarch Maven2 Repository</name> <url>http://maven.deathmarch.jp/maven2</url> <snapshots> <enabled>true</ena
Search this site Recent Entries Recent Comments Recent Trackbacks 需要があるかどうか分かりませんが作ってみました。俺得万歳 before public class SomeTest{ @Test public void ignoreOnlyProduction(){ if(AppEngineUtil.isProduction()){ return; } // 本番サーバだけでは動かしたくないテスト } @Test public void ignoreOnlyDevelopment(){ if(AppEngineUtil.isDevelopment()){ return; } // 開発サーバだけでは動かしたくないテスト } } after import net.sue445.s3tiger.Slim3; @RunWith(S
slim3ではGAEの環境に依存するような単体テストもかなり簡単に行う事ができます。例えば、Bigtableへのアクセスはテストの実行毎にリセットされる、グローバルトランザクションに対応など至れりつくせりです。 ところが、画像を加工してサムネイルを作る時などに使用する ImagesServiceですが、これを単体テストで実行しようとすると例外が発生します。内部的には、画像の作成や一部の軽い処理はImplで行っているようですが、拡大縮小などの変換処理は各アプリでやるのではなく、外部サービスとして呼び出しているようです。これらのテスト環境でのエミュレートは、org.slim3.tester.AppEngineTesterのmakeSyncCallで行っていますので、ここを少しカスタマイズすることでImagesServiceもエミュレートできるようになります。 以下、簡単なサンプルになります。
Google App Engineでは、500バイト以上のバイトの配列や文字列を格納する型として、BlobやTextを用意しています。これらの型を使うときには、フィールドの型は、BlobやTextにし、getter, setterメソッドは、byteの配列やStringにしておくと、モデルを使う側は、500バイトの制限を気にせず、常にbyteの配列やStringでアクセスできるのでお勧めです。 @Persistent private Blob xxxBlob; public byte[] getXxx() { if (xxxBlob == null) { return null; } return xxxBlob.getBytes(); } public void setXxx(byte[] xxx) { xxxBlob = new Blob(xxx); } @Persistent pri
CoolなURIでJSONを返すURLはどう表現するか 内部的には「/user/get?id=12345&type=json」となるようなURI(idが12345のユーザ情報のJSON形式)を、Cool URIではどのように表現するのが適切か悩んでいた。「/user/json/12345」や「/user/12345/json」はなんか違う気がするし。 そしたら「Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESSプラスシリーズ)」にその答えが書いてあった。 例えば1つのリソースをHTMLとテキストとJSONで表現できる場合には、それぞれ「.html」「.txt」「.json」という拡張子を付けてここの表現を分けると良いでしょう。 「Webを支える技術」 p.062 先述の例で言えば、「/user/12345.json」となる。なるほど確かにこれはしっ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く