GAE/Jの画像APIにハマりまくる

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年2月16日 火曜日 1時06分47秒

ハマりまくったので、雑多なメモだけ残す。
まず、ImagesServiceFactory.makeCropの4つの引数は、
画像位置を割合で表したものである。
例えば、幅100の画像において、(50,50)から(75,75)の正方形を
切り取ろうとしたら、

ImagesServiceFactory.makeCrop(0.5, 0.5, 0.75, 0.75);

としてCropを作成する必要が有る。全く直感的ではない。
どんな大きさの画像にも対応するためなんだろうが、そんな工夫はいらない。
だったら6引数にして、最初に画像の幅と高さ、残り4つに割合表記じゃない
座標を入れさせてほしい。

次に、Cropを使ってapplyTransformすると、元画像の大きさが変わってしまう。

ImagesService imagesService = ImagesServiceFactory.getImagesService();
Image image = <何かしら、Imageを取得する>;
imagesService.applyTransform(ImagesServiceFactory.makeCrop(0.5, 0.5, 0.75, 0.75),image);

ってやると、前と後ではimageが異なるものになっていた。
何でだ?納得できない。
だったら、戻り値で返さないで欲しい。返してくるから、元画像が守られると思い込んでしまうんだろうが!

APIドキュメント読めとか、素人みたいな事言うな!!
APIドキュメント読まなくてもわかるAPI作れ!!!

Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)
著者/訳者:(株)グルージェント
出版社:技術評論社( 2009-09-10 )
Amazon価格:¥ 2,604
ISBN-10 : 4774139858
ISBN-13 : 9784774139852

Blobstoreは有料です

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2010年1月2日 土曜日 1時37分55秒

今、Google App Engine Java(GAE/J)を弄っているんだが、その中で気付いた事を書く。
画像など、ファイルを効率的に扱う「Blobstore」なる
機能が有るんだが、実はそいつはまだ試験段階で、しかも課金を有効にしないと使えないらしい。
ローカルの試験環境だと使えるのでつい使いがちだが、本番では使えない。

使うと、以下のようなエラーになる。
Blobstoreは、「mediastore」というデモで使われているんだが、
これをまねて作るのは、よした方が良さそうだ。

Uncaught exception from servlet
java.lang.ClassCastException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException cannot be cast to javax.servlet.ServletException
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
    at org.apache.jsp.xxx_jsp._jspService(xxx_jsp.java:NN)←この部分に、Blobstoreを使おうとした所が入る
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:238)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
    at org.mortbay.jetty.Server.handle(Server.java:313)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5233)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363)
    at com.google.net.rpc.impl.Server$2.run(Server.java:838)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:536)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:793)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:368)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:448)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:466)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:759)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:205)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:394)
    at java.lang.Thread.run(Unknown Source)

Unexpected exception from servlet: java.lang.ClassCastException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException cannot be cast to javax.servlet.ServletException

Beginning Java Google App Engine
著者/訳者:Kyle Roche Jeff Douglas
出版社:Apress( 2009-12-21 )
Amazon価格:¥ 3,567
ISBN-10 : 143022553X
ISBN-13 : 9781430225539

Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)
著者/訳者:(株)グルージェント
出版社:技術評論社( 2009-09-10 )
Amazon価格:¥ 2,604
ISBN-10 : 4774139858
ISBN-13 : 9784774139852

Eclipse Galileoのupdateでエラーが出るので回避

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年9月26日 土曜日 16時12分52秒

前回のエントリで出ていたエラー群だが、回避方法が判明。
というか、もしかしてMacって全体的にそうなのか?

回避方法は簡単で、ユーザディレクトリ以下に実行ファイルをおくとか
そんなもん。
これでCyberduckも動いたからなぁ。

Eclipse Galileoのあまりの駄目さに、福山もガリレイも怒り心頭だろ

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年9月25日 金曜日 22時31分12秒

Eclipseの最新版、GalileoをMacにインストールして、
早速色々とアップデートしようとしたんだが、色々改悪されてた。
まず、アップデートのUIがFirefoxに続いてゴミ化していた。
なんか、以前のようなサイト毎に選択できる方が全然よかったんだが。



ガリレオ DVD-BOX
Amazon価格:¥ 17,500

ガリハバラ!(DVD付) / Array
コロムビアミュージックエンタテインメント( 2009-07-22 )
定価:¥ 1,785

(続きを読む...)

久々のStaxで、Antのコンパイル時文字コードにハマる

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年8月22日 土曜日 1時27分55秒

久しぶりにStax触ったら大分バージョンが上がってて、最新は0.3.7だった。
DL用リンクは全く無くて、WikiからDL可能な0.3.5を実行したら、
もっと新しいのがあるとか言われて0.3.6をDLし出す。
そのとき出てくるURLをコピーしてブラウザに貼って、6になってる所を7に変えてみると
DLできる。
http://stax-downloads.s3.amazonaws.com/sdk/stax-sdk-0.3.7-dist.zip

で、ゲットしてコンパイルしたら文字化けしまくる。

警告:この文字は、エンコーディング MS932 にマップできません。

どうも日本語WindowsだとMS932になってしまうらしい。
プロジェクトフォルダ内にあるstax-build.xmlを書き換える。

<target name="compile" depends="init" description="compile the source ">
    <javac encoding="utf-8" srcdir="${src}" destdir="${build}" classpathref="webapp.classpath" />
    <copy todir="${build}">
        <fileset dir="${src}" excludes="**/*.java" />
    </copy>
</target>

javacタグに「encoding="utf-8"」を追記してやる。
これで、UTF-8でコンパイルしてくれる。

目下の問題は、以下2点。
1.Web上に上げといたRSSが、いつの間にか文字化けしてない。
2.最新版でコンパイルしなおしたRSSが、動かない

クラウドコンピューティング―技術動向と企業戦略
著者/訳者:森 洋一
出版社:オーム社( 2009-05-12 )
Amazon価格:¥ 1,680
ISBN-10 : 4274502325
ISBN-13 : 9784274502323

Staxで今度こそRSSフィードを纏め上げる(後は文字コード問題)

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月6日 水曜日 1時14分32秒

前回のエントリで脆くも砕け散ってしまったお勉強テーマである、
俺が所有する、現在アクティブな4つのブログのRSSフィードを、
Stax+Wicketで纏めようと言う試みがようやく形になってきた。

こちらにその結果がある。

まぁ、5月5日時点では見ての通り日本語が無茶苦茶ですよ。
ただ、これはStax+Wicket+ROMEの連携には、まったく関係の無い
別の所にある問題なので、RSSフィードを出す方法はわかった。

と言うことで、解説を書きまーす。

なお、今回は
Javaウェブフレームワーク「Wicket」の使い方 RSS Readerを作る その2 - フィードの取得と表示
を参考にした。
(続きを読む...)

Wicketで、ResponseからOutputStreamを取り出せるのはWebApplicationからgetHomePageしたクラスだけっぽい?

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月4日 月曜日 2時40分37秒

Wicketやっててちょっとつまづいたんだが、
ROME使ってRSSを作る時、最終的にはWebPage#onRender

@Override
protected void onRender(MarkupStream markupStream) {
    Response resp = this.getResponse();
    resp.setContentType("application/xml; charset=UTF-8");
    PrintWriter pw = new PrintWriter(resp.getOutputStream());
    SyndFeedOutput sfo = new SyndFeedOutput();
    try {
        sfo.output(this.getFeed(), pw);
    } catch (IOException e) {
        throw new RuntimeException("Error Streaming Feed",e);
    } catch (FeedException e) {
        throw new RuntimeException("Error Streaming Feed",e);
    }
}

ってしてたんだが、これだと不味いっぽい事に気づいてきた。
どうも、WicketApplicationの子クラス(Wicketで最初に呼ばれる奴)の、
getHomePageの戻り値として渡されるWebPageの子クラス(以降、トップページと呼ぶ)しか、これが出来ないっぽい。
どうも、

Response resp = this.getResponse();

で戻ってくるクラスが違うらしく、しかも、トップページ以外のページ、例えば

<!--HomePage.html-->
<a wicket:id="LinkPage">リンクしまーす</a>

/* HomePage.javaコンストラクタ内 */
this.add(new PageLink("LinkPage",LinkedPage.class));

みたいにしてリンクされるページ(以降リンク先ページ)で得られるResponseの実クラスが、
何とgetOutputStream()をサポートしていない、
BufferedHttpServletResponseなるクラスらしいのだ。
ちなみに、トップページの時はWebResponse が戻ってくる模様。
(続きを読む...)

Staxでライブラリだけ変えてdeployするときは。

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月3日 日曜日 4時00分18秒

多分、アプリの下のdistってフォルダの中身を空にしないと、
変更が反映されない。
ソースを変えたら流石に反映されると思うけど、WEB-INF/libだけ
変えても、反映されなかった。

怪しかったらそこを消すことって事で覚えよう。

Stax+Wicketで自サイトのRSSを一纏めにしようとしたが、全然そうならなかった。

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月3日 日曜日 3時06分24秒

とりあえず、Staxで何をしようかと逡巡していたのだが、
探してたらWicketでRSSを出すと言う試みがあったので、
俺もそれを真似てみようかと思った。
目標は、俺の持ってる各サイトのフィードの統合。

と言うことで、今回はこのサイトと、

WicketでRSSフィードを発行するといえばROMEです。

今回は単純に、

http://example.org/feed

にアクセスされたときにフィードを返すようなPageを実装します。
WicketでRSSフィードを発行する « murakumo

後このサイトを頼りに、RSSフィードを作ってみる。

Merry Christmas and a Happy New Year to all you folks out there. Here's a belated Christmas gift for all you Wicket developers out there.

I've been adding RSS feeds to my Wicket application based on the example Wicket RssPage found on the wiki, and thought it was very restrictive in what it could do. There are a ton of Java libraries out there to build rss feeds, and this RssPage was yet another solution.
code_poet : Wicket FeedPage

で、結論から言うと結構大変だった上に予想と違うものが出来た。
でも勢いで公開だー!

このページの「最初のRSS」の方ね。
http://feedsample.tarotarorg.staxapps.net/
(続きを読む...)

Staxの大事なのにすぐ教えてくれなくなるコマンド2つ

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月3日 日曜日 2時38分15秒

Staxのコンソールに、アプリを作ってからデプロイするまでの間だけ出る、
以下2つのコマンドの解説が実は常に出てほしいくらい大事なのだが、
なぜか一回デプロイしたら消えてしまうので、こちらにメモッておく。

まず、Webで作ったアプリをローカルに落としてくるコマンド

stax getapp -a tarotarorg/<アプリ名> -u tarotarorg -p [password]

で、ローカルで作ったアプリをデプロイするコマンド

stax deploy -u tarotarorg -p [password]

次ページへ »

HTML convert time: 4.548 sec.