ようへい

2012年12月28日金曜日

JavaScript用 複数行文字列 → 文字列配列 変換ツール

JavaScript向けに、複数行文字列を文字列配列に変換するツールを作りました。

変換サンプル

#gbx3, #gbx4 {
    background-color: #2D2D2D;
    background-image: none;
    background-position: 0 -138px;
    background-repeat: repeat-x;
    border-bottom: 1px solid #000000;
    font-size: 24px;
    height: 29px;
    opacity: 1;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: 990;
}
.gbtb .gbts {
    background: url("//ssl.gstatic.com/gb/images/b_8d5afc09.png") repeat scroll -27px -22px transparent;
    border: 0 none;
    font-size: 0;
    padding: 29px 0 0;
    width: 1px;
}
.gbtb .gbts {
    background: url('//ssl.gstatic.com/gb/images/b_8d5afc09.png') repeat scroll -27px -22px transparent;
    border: 0 none;
    font-size: 0;
    padding: 29px 0 0;
    width: 1px;
}
['#gbx3, #gbx4 {',
'background-color: #2D2D2D;',
'background-image: none;',
'background-position: 0 -138px;',
'background-repeat: repeat-x;',
'border-bottom: 1px solid #000000;',
'font-size: 24px;',
'height: 29px;',
'opacity: 1;',
'position: absolute;',
'top: 0;',
'width: 100%;',
'z-index: 990;',
'}',
'.gbtb .gbts {',
'background: url("//ssl.gstatic.com/gb/images/b_8d5afc09.png") repeat scroll -27px -22px transparent;',
'border: 0 none;',
'font-size: 0;',
'padding: 29px 0 0;',
'width: 1px;',
'}',
'.gbtb .gbts {',
'background: url(\'//ssl.gstatic.com/gb/images/b_8d5afc09.png\') repeat scroll -27px -22px transparent;',
'border: 0 none;',
'font-size: 0;',
'padding: 29px 0 0;',
'width: 1px;',
'}'];

変換ツール



関連記事

Xperia acro HD IS12S ICS root化

オークションでIS12Sの白ロムを落としたので、root化してみる。

root化手順

以下のサイトで公開されているツールでroot化可能。
huhka.com Blogger出張所: ICSアップデート済のXPERIA acro HD用 ほぼ1クリックrooting kit
http://blog.huhka.com/2012/08/icsxperia-acro-hd-1rooting-kit.html

root取得できていない

さっそくGoogle PlayでSuper SUを入れ、Titanium Backupを入れたのだが、root取得できてないと。
Super SUを起動すると、バイナリのアップデートが必要と出るのだが、アップデートに失敗する。

しばし悩んで、Superuserを入れることにした。
するとあっけなくroot化完了。
再度Super SUを起動し、バイナリのアップデートを行うと、Superuserのroot権限許可のプロンプトが表示され、許可をするとバイナリアップデート完了。
その後はSuperuserをアンインストールしても問題なくTitanium Backup等、rootアプリが動きました。
関連記事

2012年12月14日金曜日

[スペック対決] HTC J butterfly HTL21 vs iPhone 5

ついに購入に踏み切ったHTL21。
ここで、HTL21のスペックについて改めて確認するとともに、iPhone 5とスペックで比較してみる。
あくまで私が興味がある項目かつ、比較できる項目のみでの比較です。
HTL21 iPhone 5
ディスプレイ解像度 Full HD(1920*1080) 1136*640
ピクセル密度(ppi) 440 326
CPU コア数 4 2
CPU クロック数(GHz) 1.5 1.3
GPU コア数 4 3
RAM(GB) 2 1
ROM(GB) 16 16, 32, 64
外部メモリ microSDHC(~32GB) -
メインカメラ(MP) 8 8
メインカメラF値 2.0 2.4
動画撮影(p) 1080 720
フロントカメラ(MP) 2.1 1.2
NFC ×
ワンセグ ×
バッテリー(mAh) 2020 1440
最大待受時間(H) 360 225
重量(g) 140 112
他に比較してほしい項目あればコメント等で。
関連記事

[GAE/J] Google App Engine Java SDK 1.7.4 がリリースされました

Google App Engine Java SDK 1.7.4 がリリースされました。
リリースノートは以下。
  • Traffic Splitting is now a GA feature.
  • Task Queue Statistics is now a GA feature.
  • Logs API now has the ability to fetch requests based on a list of request_ids. Currently, this only works in production and is not supported in dev_appserver.
  • The SDK now includes an IDE-friendly zip with the source for the App Engine APIs. The zip resides in <SDK_ROOT>/src/user
  • Additional support for Maven now exists through both Maven archetypes and a Maven plugin. Documentation for the new Maven support can be found at https://developers.google.com/appengine/docs/java/tools/maven
  • DISTINCT for Datastore queries is now available as an experimental feature.
  • The decommissioned Conversion API has been removed.
  • Various JSP improvements
    • JSPs are now compiled together as opposed to one by one. This improves the compilation process time.
    • JSP compiled classes are packaged in JAR files.
    • You can now avoid the upload of JSP source, which is typically not needed at runtime. This can be done via the new --delete_jsps option in the appcfg tool. By default, this option is not set.
    • You can now package all the WEB-INF/classes/* classes into jar files. This can be done via the new --enable_jar_classes option in the appcfg tools. By default, this option is not set.
  • Users can now set how many columns can be viewed in the Datastore Viewer via a drop-down menu which customizes the number of columns displayed.
  • Fixed an issue with BackendService.getCurrentInstance() returning thread ID instead of integer instance ID in production.
  • Fixed an issue with Datastore Backup failing when a schema has a very large number of properties.
  • Fixed an issue with users being unable to change Authentication Type after app creation in the Admin Console.
SdkForJavaReleaseNotes - googleappengine - Google App Engine Java SDK Release Notes - Google App Engine - Google Project Hosting
http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes
今回のリリースでは、Traffic Splittingのサポート、Task Queueの統計機能の追加、Datastore Viewerでの表示カラム数を指定できる機能の追加などが行われています。
また、JSPに関するコンパイル時間短縮等の幾つかの修正や、廃止となったConversion APIが削除されているようです。
関連記事

12/14 Android ニュースひとまとめ

サラブレッドが駆ける競馬ゲームです。

名馬を育てて人気レースで勝負!!
サラブレッドが駆ける競馬ゲームです。

自然豊かな牧場に、ダートやプールを配置して準備を整えます。
有名牧場になれば観光客がソフトクリーム屋やおみやげ屋さんに訪れます。

スタミナや瞬発力などが、特色ある品種の馬を探し出し調教を行いましょう。レースで優勝すれば賞金額がアップしていき、海外レースにも出馬できる。

競走馬を引退したお馬さんは、種馬として新たな任務をうけます。
血統の組み合わせによって大幅な能力アップが見込めるかもしれませんね。

めざせ優駿の三冠馬!
G1牧場ステークス - Google Play の Android アプリ
https://play.google.com/store/apps/details?id=net.kairosoft.android.horse_ja
カイロソフトの12月の新作がリリースされました。
見た感じ、サッカーとか、F1に似てますね。
アプリ名開発元評価価格マーケットリンク
G1牧場ステークスKairosoft Co.,Ltd
★★★★★
5.0
3
¥450
  • アプリ名のカッコ内の文字は英名のアプリ名
  • 評価のカッコ内の数値は評価数
  • 価格は記事投稿時のストア価格(アプリ内課金の価格を除く)
マカフィーは、Android搭載のスマートデバイス向けセキュリティ対策ソフト「McAfee Mobile Security」の最新版を提供開始した。

同製品は、Androidを搭載したスマートフォンやタブレットにおいて、マルウェア対策、不正サイト対策、端末の盗難および紛失対策などのセキュリティ機能を実現するソフトウェア。最新版では、アプリのロック機能を搭載。特定のアプリをPINによりロックし、使用を制限できる。

またユーザーインターフェースを一新し、同社の他製品と操作性を統一。そのほか、バッテリー使用率の改善やファイルサイズの圧縮、マルウェア対策機能の向上に取り組んだ。価格は2980円。既存ユーザーは無償でアップデートできる。
【セキュリティ ニュース】「McAfee Mobile Security」が機能強化 – アプリの不正利用対策を搭載:Security NEXT
http://www.security-next.com/035956
関連記事

2012年12月7日金曜日

[2012 秋冬] au スマートフォン 性能比較

そろそろスマートフォンを機種変しようと考えているので、2012年秋冬モデルのAndroidスマートフォンの性能比較をしてみました。
空欄は調査して随時うめていきます。
型番 メーカー 発売日 OS バージョン ディスプレイ CPU GPU RAM(MB) ROM(GB) メインカメラ(MP) 外部メモリ バッテリー 重量(g) ストラップホール 備考
タイプ サイズ(型) 解像度(dpi) 種類 コア数 クロック周波数(GHz) 容量(mAh) 最大待受時間(H)
GALAXY S III Progre SCL21 Samsung 11/2 4.0 HD SUPER AMOLED 4.8 1280*720 MSM8960 2 1.5 Adreno 225 2048 32 8.1 microSDXC 2100 340 141
HTC J butterfly HTL21 HTC 12月上旬 4.1 super LCD 3 FHD 5 1920*1080 MDM9615 + APQ8064 4 1.5 Adreno 320 2048 16 8 microSDHC 2020 360 140 -
Optimus G LGL21 LG 11/2 4.0 IPS 4.7 1280*720 APQ8064 4 1.5 Adreno 320 2048 16 13 microSDXC 2210 440 143
Xperia VL SOL21 Sony Mobile Communications 11/2 4.0 HD Reality Display 4.3 1280*720 MSM8960 2 1.5 Adreno 225 1024 16 13 microSDHC 1700 490 120
AQUOS PHONE SERIE SHL21 SHARP 11/2 4.0 S-CGSilicon 4.7 1280*720 MSM8960 2 1.5 Adreno 225 1024 16 13.12 microSDXC 2040 610 148
DIGNO S KYL21 京セラ 11/9 4.0 TFT 4.7 1280*720 MSM8960 2 1.5 Adreno 225 1024 16 8.08 microSDXC 2520 720 157
ARROWS ef FJL21 富士通 11/2 4.0 TFT 4.3 1280*720 MSM8960 2 1.5 Adreno 225 1024 8 8.1 microSDXC 1800 490 139
G'zOne TYPE-L CAL21 CASIO 11/2 4.0 IPS 4 800*480 MSM8960 2 1.5 Adreno 225 1024 8 8.08 microSDHC 1800 460 181
VEGA PTL21 Pantech & Curitel 11/2 4.0 TFT 4.3 1280*720 MSM8960 2 1.5 Adreno 225 1024 16 8 microSDXC 1810 400 134
デザイン的にはHTL21が良いんですけど、ストラップホール無いから落下が心配。
となると、SCL21かなぁ。
店頭で実機触ってみた感じではSCL21は若干液晶が黄色い。
HTL21の液晶はかなり綺麗。
ストラップホールは無いけど、ケースにストラップホールがある物を買えば良いかな。
価格次第ですが、HTL21買う可能性が高いです。
12/11
GPUのカラムを追加
関連記事

2012年12月6日木曜日

Bloggerでのデータファイル置場に関する検証と考察

Googleのブログサービス、BloggerではJavaScript、スタイルシート等の静的ファイルをサーバにアップロードする機能が無い。
つまり、これらのファイルは別のサーバにホスティングする必要がある。
ホスティングするサーバに関して検証を行い考えてみた。
あくまで個人的な考えです。

発端

私は今までGoogle App Engineにファイルをホスティングしていたのだが、先日(といっても結構前)、Google App Engineで数時間に及ぶ接続障害が発生し、私のブログが閲覧できない状態になってしまった。
これは、head内でGoogle App Engineのファイルを参照していたため。

ホスティングサービス

Google Site
無料で利用でき、かつGoogleが提供しているサービスとして、Google Siteがある。
Google Siteでは、ファイルアップロード機能も用意されているため、Google Siteにアップロードし、そのファイルをBloggerにて参照するという方法。
アップロードもGUIが用意されているため比較的簡単にできる。
また、ファイルの世代管理も可能。
Google App Engine
こちらも無料で利用できるGoogleのサービス。
少々知識は必要だが、自由度も高く、アプリケーションも開発できる。
ファイルのアップロードは、コマンドラインやEclipseなどによるデプロイという方式をとるため、手間がかかる。
また、ときどき障害が発生し、ファイルが参照できなくなる。
ファイルが参照できないと、最悪の場合、Bloggerの閲覧が不可能になる。(head内でGoogle App Engineのファイルを参照している場合など)
オンラインストレージ
Dropboxや、SugarSyncなどにファイルをアップし、パブリックリンク機能を利用する方法。
ファイル管理は楽にできる。
また、ファイルの世代管理も可能。
但し、レスポンスが悪い時もある。

検証

Google Site、Google App Engine、Dropbox、SugarSyncにファイルを置いて、レスポンス時間を計測。
head内でGoogle App Engineのファイルを参照するのは懲りたのだが、改めてどの程度の応答か確認してみる。
置くファイルは、100KB(102,400Byte)のJavaScriptファイル。
計測する環境は、以下
  • Windows 7 64bit
  • Google Chrome 23
計測は、Google Chromeのデベロッパーツール(Ctrl+Shift+I)のNetworkにて行う。
また、デベロッパーツールにて、ブラウザのキャッシュを無効化(Disable cache)した。
計測後、HARファイルとしてエクスポートし、集計しました。

単位はミリ秒です。
Google Site
(リダイレクト)
Google Site
(ファイル取得)
Google Site
(リダイレクト+ファイル取得)
Google App Engine SugarSync Dropbox
1回目 312 277 589 549 613 1295
2回目 342 269 611 512 595 1273
3回目 260 263 523 720 589 2043
4回目 271 439 710 559 565 1220
5回目 281 267 548 816 948 1463
6回目 324 240 564 669 757 1700
7回目 256 275 531 655 822 1596
8回目 294 572 866 562 1011 1336
9回目 295 315 610 561 804 1541
10回目 324 458 782 748 527 1323
平均値 296 338 633 635 723 1479
中央値 295 276 600 609 685 1400
最小値 256 240 523 512 527 1220
最大値 342 572 866 816 1011 2043
検証で分かったこと
Google Site
Google のサービス内(Blogger、Google App Engine等)からであれば、ファイルを読み込むことが可能。
ただし、直接読み込めるわけではなく、リクエスト»Auth keyの発行»リダイレクト»ファイル読込 となるため、2回目のリクエストでようやくファイルを読み込むことができる。
Google App Engineと比較すると、稼働率は高いと思う。
レスポンスで返されるファイルは、Content-Encoding:gzipとなっており、ファイルが圧縮されているため、通信量の節約が行われているので、レスポンスも早い。
Last-Modified,Etag,Cache-Control(max-age=1, must-revalidate)ヘッダによってキャッシュ制御が行われている点も良い。
Google App Engine
ファイルを直接読み込むことが可能。
Google Siteと同じようにContent-Encoding:gzipによってファイルを圧縮して返してくれる
しかし、Google Siteより稼働率は低いと思う。
ファイルに付与するヘッダや、キャッシュの有効期限を任意に設定できるという点で、自由度は高い。
SugarSync
ファイルを直接読み込むことが可能。
レスポンスは若干遅め。
Google Siteと同じようにContent-Encoding:gzipによってファイルを圧縮して返してくれる
Last-Modified,Etag,Vary(Accept-Encoding)ヘッダによってキャッシュ制御も行われる。
障害は少ない。
Dropbox
ファイルを直接読み込むことが可能。
レスポンスはかなり遅い。
なぜなら、Google Site、Google App Engine、SugarSyncと異なり、gzip圧縮してくれないため、通信量が多くなる。
他と比べて、倍の時間がかかっている。
Cache-Control:max-age=0となっているため、ファイルは常にサーバから取得される
レスポンスが遅いうえに毎回問い合わせとなるため、最悪。
障害は少ないがオススメしない。

総評

今回の検証ではGoogle Siteが一番良さげ。
早速head内で読み込んでいるファイルをGoogle App EngineからGoogle Siteに変更しました。
Dropboxは意外に残念な結果でした。

他に検証してほしいホスティングサービスがあれば、コメントにて教えてください。
ただし、パブリックリンクが取得できるホスティングサービスに限ります。
Google Drive、SkyDrive、Boxは現時点でパブリックリンクに対応していません。
関連記事

2012年12月5日水曜日

[GAE/J] slim3環境下でのエラー対処法覚え書き

先日GAE/Jのプロジェクトをslim3に移行したのですが、その際に躓いたエラーの対処法を書いておきます。

NoClassDefFoundError

エラー内容
Error for /hogehoge
java.lang.NoClassDefFoundError: Could not initialize class org.slim3.datastore.Datastore
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:69)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:192)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at org.mortbay.jetty.Server.handle(Server.java:326)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
 at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
 at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
 at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
 at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
 at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
 at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
 at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
 at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
 at java.lang.Thread.run(Thread.java:679)
対処法
GAE/Jに必要なjarがwar/WEB-INF/libに存在しない場合に発生する。
eclipseで、プロジェクトのプロパティ»Google»AppエンジンでSDKを選びなおし、war/WEB-INF/libに必要なjarを取得する。

ExceptionInInitializerError

エラー内容
Error for /hogehoge
java.lang.ExceptionInInitializerError
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:69)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:192)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at org.mortbay.jetty.Server.handle(Server.java:326)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
 at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
 at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
 at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
 at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
 at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
 at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
 at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
 at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
 at java.lang.Thread.run(Thread.java:679)
Caused by: org.slim3.util.WrapRuntimeException: An error occurred while creating a new instance of the class(org.slim3.datastore.DatastoreDelegate). Error message: com/google/appengine/api/datastore/DatastoreServiceConfig$Builder
 at org.slim3.util.ClassUtil.newInstance(ClassUtil.java:96)
 at org.slim3.datastore.Datastore.delegateClass(Datastore.java:82)
 at org.slim3.datastore.Datastore.initialize(Datastore.java:60)
 at org.slim3.datastore.Datastore.<clinit>(Datastore.java:52)
 ... 33 more
Caused by: java.lang.NoClassDefFoundError: com/google/appengine/api/datastore/DatastoreServiceConfig$Builder
 at org.slim3.datastore.AsyncDatastoreDelegate.setUp(AsyncDatastoreDelegate.java:119)
 at org.slim3.datastore.AsyncDatastoreDelegate.<init>(AsyncDatastoreDelegate.java:93)
 at org.slim3.datastore.DatastoreDelegate.<init>(DatastoreDelegate.java:63)
 at org.slim3.datastore.DatastoreDelegate.<init>(DatastoreDelegate.java:53)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
 at java.lang.Class.newInstance0(Class.java:372)
 at java.lang.Class.newInstance(Class.java:325)
 at org.slim3.util.ClassUtil.newInstance(ClassUtil.java:94)
 ... 36 more
Caused by: java.lang.ClassNotFoundException: com.google.appengine.api.datastore.DatastoreServiceConfig$Builder
 at com.google.appengine.runtime.Request.process-6576c13a5e193afa(Request.java)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
 at org.slim3.datastore.AsyncDatastoreDelegate.setUp(AsyncDatastoreDelegate.java:119)
 at org.slim3.datastore.AsyncDatastoreDelegate.<init>(AsyncDatastoreDelegate.java:93)
 at org.slim3.datastore.DatastoreDelegate.<init>(DatastoreDelegate.java:63)
 at org.slim3.datastore.DatastoreDelegate.<init>(DatastoreDelegate.java:53)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
 at java.lang.Class.newInstance0(Class.java:372)
 at java.lang.Class.newInstance(Class.java:325)
 at org.slim3.util.ClassUtil.newInstance(ClassUtil.java:94)
 at org.slim3.datastore.Datastore.delegateClass(Datastore.java:82)
 at org.slim3.datastore.Datastore.initialize(Datastore.java:60)
 at org.slim3.datastore.Datastore.<clinit>(Datastore.java:52)
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:69)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:192)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at org.mortbay.jetty.Server.handle(Server.java:326)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
 at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
 at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
 at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
 at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
 at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
 ... 1 more
対処法
src/META-INF/jdoconfig.xmlが無ければ作る。
repackaged-appengine-jakarta-standard-1.1.2.jar をwar/WEB-INF/libにコピーし、ビルドパスに通す。
jdoconfig.xmlは以下を参考に。
JDO を利用したデータストアの使用 - Google App Engine — Google Developers
https://developers.google.com/appengine/docs/java/gettingstarted/usingdatastore?hl=ja
関連記事