ようへい

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
関連記事

2012年11月27日火曜日

Nexus 7 (Android 4.2 JOP40C) での root 取得

Android 4.2がフルサポートされた Nexus Root Toolkit v1.6.0 がリリースされたので、Nexus 7で改めてrootを取得してみました。

USBデバッグを有効にする

rootの取得にはUSBデバッグを有効にする必要があります。
USBデバッグの切り替えは、開発者向けオプション画面から設定可能です。
Android 4.2では、デフォルトで開発者向けオプションが表示されていません。
そのため、USBデバッグを有効に設定することができません。
開発者向けオプションを表示させるには、設定»タブレット情報»ビルド番号を何回かタップすることで、デベロッパーモードとなり、開発者向けオプションが表示されます。
開発者向けオプションが表示されたら、USBデバッグを有効にしましょう。

Nexus Root Toolkit

ほとんど自動で Unlock / root 取得ができるツールです。
ダウンロード
こちらからダウンロードし、インストールします。
Nexus Root Toolkit v1.6.0 | WugFresh
http://www.wugfresh.com/nrt/
Nexus 7 (Android 4.2 JOP40C) での root 取得
Unlock
まず、デバイスのUnlockを行います。
Nexus Root Toolkitを起動し、Unlockをクリックし、画面にしたがってUnlockを行います。
Unlock後は、デバイスが初期化されるので注意しましょう。
デバイスが起動したら、再びUSBデバッグを有効にしておきましょう。
Root
次に、Rootを取得します。
Root取得時に、Custom Recoveryも併せてインストールする場合はCustom Recoveryにチェックを入れて、Rootをクリックします。
ここでインストールするCustom Recoveryは、Nexus Root ToolkitOptions画面から選ぶことも可能です。
無事root取得完了です。
Nexus Root Toolkitの作者さんに感謝です。
Nexus 7 (Android 4.2 JOP40C) での root 取得
関連記事

[GAE/J] deploy 時の Conflict エラー対処

deploy をしようと思ったらこんなエラーがコンソールに出た。
Preparing to deploy:
 Created staging directory at: 'C:\Users\User\AppData\Local\Temp\appcfg3567309257153504140.tmp'
 Scanning for jsp files.
 Scanning files on local disk.
 Initiating update.
com.google.appengine.tools.admin.HttpIoException: Error posting to URL: https://appengine.google.com/api/appversion/create?app_id=hoge&version=1&
409 Conflict
Another transaction by user hogehoge is already in progress for app: hoge, version: 1. That user can undo the transaction with "appcfg rollback".
appcfg rollback をしてトランザクションをロールバックしろと。
手順はこんな感じ。
>cd "C:\Program Files\eclipse_4.2\plugins\com.google.appengine.eclipse.sdkbundle_1.7.3\appengine-java-sdk-1.7.3\bin"
>appcfg.cmd rollback "D:\workspace\hoge\war"
Reading application configuration data...
11 27, 2012 10:38:01 午後 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
情報: Successfully processed D:/workspace/hoge/war\WEB-INF/appengine-web.xml
11 27, 2012 10:38:01 午後 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
情報: Successfully processed D:/workspace/hoge/war\WEB-INF/web.xml
11 27, 2012 10:38:01 午後 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
情報: Successfully processed D:/workspace/hoge/war\WEB-INF/cron.xml
11 27, 2012 10:38:01 午後 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
情報: Successfully processed D:/workspace/hoge/war\WEB-INF/queue.xml
11 27, 2012 10:38:01 午後 com.google.apphosting.utils.config.IndexesXmlReader readConfigXml
情報: Successfully processed D:/workspace/hoge/war\WEB-INF/datastore-indexes.xml
Beginning server interaction for hoge...
0%  on backend null.
Email: ******@gmail.com
Password for ******@gmail.com:
Success.
Cleaning up temporary files...
これで deploy できるようになりました。
関連記事

2012年11月20日火曜日

ブラウザごとの閉じられたウィンドウオブジェクトの違い

window.openでウィンドウを開き、開いたウィンドウを閉じた場合、ブラウザによって閉じたウィンドウオブジェクトに対する処理が異なっていた。
リファレンス等に書かれていないようなので、メモ。
具体的には、以下のような処理を行った際の結果が異なる。
var wo = window.open("about:blank","hoge");

開いたウィンドウを閉じる
alert(typeof wo.name);

検証プログラム

以下で、実際の動きを確認できます。
ウィンドウチェックを行うと、テキストボックス内に、windowのステータスがdumpされます。

Internet Explorer 9の場合

閉じられたウィンドウのnameプロパティにアクセスしようとすると、エラーが発生する。
アクセスが拒否されました。
エラーnumberは-2147024891
閉じられたウィンドウオブジェクトのnameプロパティにはアクセスできないようだ。

Mozilla Firefox 17の場合

閉じられたウィンドウのnameプロパティの値はnullオブジェクトとなる。

Google Chrome 23の場合

閉じられたウィンドウのnameプロパティの値はstringオブジェクトとなる。
stringの値は""だった。

Opera 12の場合

閉じられたウィンドウのnameプロパティの値はstringオブジェクトとなる。
stringの値は""だった。
と、まぁ気にしない人にはどうでもいい情報でした。
関連記事

[Tasker] ネットワーク接続回復Task (ウィジェット/ショートカット用)

ネットワーク接続を回復するためのTask
Wifi
Off
Mobile Data
Off
Wait
5
Wifi
On
Wait
5
Mobile Data
On
Popup
再接続完了再接続完了
間に入れているWaitはなんとなく。
auで1Xの回線をつかんでしまった時などに行うと回復できる可能性があります。
これをTaskerのショートカットやウィジェットでホームに置いておけばいつでも再接続できます。
関連記事

2012年11月10日土曜日

Nexus 7 交換になりました

発端

数日前からタッチパネルが全く反応しなくなりました。
その後、ファクトリーリセットや、OEM Unlockによる初期化を試しましたが効果なし。
スタートアップの言語選択画面から進まなくなりました。orz
こんな状態です。
ということでまずはASUSに問い合わせしてみました。

ASUS

ASUSへは以下のフォームから問い合わせる。
ASUS Online Service
http://vip.asus.com/eservice/techserv.aspx 製品ジャンルはEee Padを選択。
すると、製品名でNexus 7を選択できる。

問い合わせから1日経過して返事が来ました。
対応遅いな。
しかも返事は以下のような返事。
logroid 様

このたびはお問合せいただきありがとうございます。

下記の件でございますが、ハードウェア的な問題の可能性が高く、現物検査に出す必要があると思われます。
詳細に関しては、コールセンターへご相談いただきますようお願いいたします。

『ASUSコールセンター』
サポート受付電話番号:0800-123-2787(通話料無料)
※携帯電話やPHSなど、サポート受付電話番号をご利用できない場合には、こちら(047-390-5630/通話料お客様負担)の電話番号におかけください。
受付時間:
平日: 9:00~18:00
土日: 9:00~17:00
※祝祭日、年末年始、夏期休暇中は休業となります。

発送先の住所は下記となります。
住所:〒279-0032 千葉県浦安市千鳥10-6 信濃運輸4F
宛先:ASUS Japan 修理サービスセンター 宛

お手数をお掛けして申し訳ありませんが、どうぞ宜しくお願い致します。

カスタマーサポート担当
解決にならないし・・・しかも現物検査?
おいおい、どんだけ時間かける気だよ。
そして書いてある電話番号に電話してみました。
すると、窓口の人はハードウェア的な問題じゃないとか、もう一度ファクトリーリセットしてくれとか言う。
いやいや、ファクトリーリセットやったし。
メールではハードウェア的な問題って言ってたのに、対応が一貫してない。
ハードウェア的な問題だと認める気がないようなので、適当に流して電話切りました。
サポートには言えないけど、ブートローダーでもタッチ反応してないんだから、OSとかアプリが影響してるとは思えない。
じゃあ、購入元のGoogleに連絡とって見るか。

Google

問い合わせは以下の電話番号から。
Google Play 端末サポートへの電話

Google Play チームへのお問い合わせは、0120-950-065 までお電話でお願いいたします。サポートは、月曜~金曜の午前 9 時~午後 6 時までご利用いただけます。
土曜だったのですが、普通につながりました。
窓口の人がスキルがあまり無いのか、ディスプレイが一切反応しないって言ってるのに、アプリ一覧から家のマークのアイコンをタップして設定画面に・・・とか言い出したので、いやいや、ディスプレイが一切反応しないんですよと。
事情を話すと、ハードウェア的な問題だと考えられるため、交換させていただきたいと。
また、OEM Unlockしてますと言ったのですが、よく分かっていないようでした。
それはロック画面のことですか? でしたら指で鍵のマークをスライドしていただいて・・・とかw。
申し訳なさそうに下手な対応でした。
交換方法とかはメールで送ると。
待つこと数十分、メールが来ました。
お客様

先ほどはお電話にてお問い合わせいただきありがとうございます。
また、ご不便をおかけ致しましたこと、お詫びもうしあげます。
誠に申し訳ございませんでした。
以下手順にて、交換手続きを行っていただきますようお願いいたします。
ご不明点がございましたら、お問い合わせください。

*重要*

元の端末を返品してください。
ご利用いただいていた端末を Google のサービス センターに返送していただく必要があります。交換品のご到着から 21 日以内に、Google のサービス センターに元の端末をお送りいただけなかった場合は、端末の正規価格分の追加料金が発生することになりますので、ご注意ください。
また、デビット カードご利用の場合、ご注文後、即時引き落としになる可能性があり、残高が充分でない場合、ご注文がキャンセルされてしまうことがございますので、併せてご注意いただきますようお願い致します。

保証範囲をご確認ください。
Google のサービス センターで元の端末の破損が保証外と判断された場合は、端末の正規価格を上限とした追加料金が発生します。交換品を注文して端末を調査に送付する前に、Nexus 7 のパッケージに同梱の保証書をご覧になるか、
www.asus.co.jp にアクセスして、ASUS の限定保証の詳細をご確認ください。

ご返品の際は、発送時の梱包材をご使用いただくことをおすすめします。荷物として受け取ったすべての商品(端末、AC アダプタ、USB ケーブル、スタートアップガイド、保証書)のご返品に際し、梱包した商品が箱の中で動かないように、必要に応じて梱包材を追加するなどして固定していただけますようお願い申し上げます。

返品のための準備の方法について詳しくは、
ヘルプセンター( http://support.google.com/googleplay/bin/answer.py?hl=ja&answer=2462890)をご覧ください。


1. 交換品をお受け取りいただくには、パソコンで下記のリンクをクリックしてください(モバイルからはご利用いただけません)。
アクセスすると、交換品が既に入ったお客様用のカートが表示されます。
ただし、カートにアクセスするには最初の購入時に使用したアカウントでログインする必要がありますのでご注意ください。
URL をクリックしていただくと、表示される画面右端に Complete Your Purchase ボタンがありますので、必ずそのボタンをクリックしてください。
クリックしていただければ、交換品の手配が完了いたします。

https://checkout.google.com/customer/gadget/buy.html?**********************************************************************************************************************************************

お客様のクレジット カードに、交換品の正規価格の引き落としが一時的に設定されます。これは、お客様のカードの信用限度の一定額を数日間留保するために行うものです。21 日以内に元の端末を送付いただき、端末の破損が保証の対象であることが確認された場合、請求は行われません。 

2. 添付の返品保証書 (RMA) の PDF ファイル を印刷します。

3. 返品保証書 (RMA)を 元の端末と一緒に箱に同梱します。

4. 修理返品リクエスト ページ (https://efulfillment.sakura.ne.jp/returnsolutions/nexus) 
    より、必要事項を記入し、配送業者の手配をします。

5. リクエスト フォームを提出後、確認メールが届きます。メールの記載事項に従ってご返送ください。

注意:プリンタをお持ちでない場合には、コンビニエンス ストアやインターネット プリント サービスなどを利用し、印刷をおこなってください。

今後とも Google Play をよろしくお願いいたします。

Google Play チーム 石坂
早速交換品の手配。
するとメールが届く。
ご購入ありがとうございます。
Google Play で購入した商品の交換のご注文を承りました。交換商品の注文はクレジット カードの明細にご利用金額として表示されますが、通常の場合、端末の代金、税金、送料などの請求は行われません。

欠陥のある商品を返送する手順についてはメールをご確認ください。この注文に対する請求が行われないよう、欠陥のある商品は速やかに返送してください。請求が行われないようにするには、返送する商品がご注文の日付から 21 日以内に到着するようにします。修理サービス センターによる検査の後、問題の原因が保証の対象と確認されれば、交換商品の端末についての請求は行われません。
追加料金?
koeeee
とりあえず、追加料金かからないことを祈り、交換品の手配をしました。
ドキドキ。
対応がすべて終わったら、続きを書きたいと思います。
交換になって何が切ないかって言うと、液晶保護シートが無駄になったこと。
高かったのに・・・。
関連記事

2012年11月6日火曜日

VirtualBox 4.2 での ホスト(Windows)・ゲスト(CentOS)間通信方法

VirtualBox 4.2でVM環境構築する際にハマったのでメモ。

要件

  • ゲストからインターネットに接続できること
  • ホストからゲストへ接続できること
ということで、ネットワークアダプタは、NATが適切であると思われる。

インストール

適当なOS(私はCentOSを使用しました)をインストールする。
必要に合わせ以下を行う。
SELinux の無効化
# /usr/sbin/setenforce 0
# vi /etc/sysconfig/selinux
SELINUX=disabled
Firewall の無効化
# /sbin/service iptables stop
# /sbin/chkconfig iptables off
Sendmail の無効化
# /sbin/service sendmail stop
# /sbin/chkconfig sendmail off
yum のproxy設定
# vi /etc/yum.conf
proxy=http://proxy.example.com:8080

固定IP化

現在割り振られているIPアドレスの確認
# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:08:F5:6B
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe08:f56b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:53 errors:0 dropped:0 overruns:0 frame:0
          TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:6539 (6.3 KiB)  TX bytes:13857 (13.5 KiB)
          Base address:0xd010 Memory:f0000000-f0020000
ルーティング(デフォルトゲートウェイ)の確認
# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        *               255.255.255.0   U         0 0          0 eth0
169.254.0.0     *               255.255.0.0     U         0 0          0 eth0
default         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
確認内容をもとに設定
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=**:**:**:**:**:**
ONBOOT=yes
IPADDR=10.0.2.15
NETMASK=255.255.255.0
GATEWAY=10.0.2.2
ネットワークサービスの再起動
# /sbin/service network restart
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:
eth0 のIP情報を検出中... 完了。
                                                           [  OK  ]
一応確認
# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:08:F5:6B
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe08:f56b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:310 errors:0 dropped:0 overruns:0 frame:0
          TX packets:282 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26939 (26.3 KiB)  TX bytes:45933 (44.8 KiB)
          Base address:0xd010 Memory:f0000000-f0020000

ホスト→ゲスト間ssh接続

さて問題はここから。
ゲストOSのIPは固定できたので、固定したIPにホストのターミナルから接続を行う。
Connection refused
ありゃ・・・
サーバまでパケット届いてるのかなぁと思い、tcpdumpでパケットをキャプチャしてみても、1パケットも飛んできていない。
# tcpdump port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

0 packets captured
0 packets received by filter
0 packets dropped by kernel
どうしたものか。

ポートフォワーディング

仮想マシン側のネットワークの設定に、ポートフォワーディングというのがある。
ホストのポートを、ゲストのポートにマッピングできる。
以下のように設定。
(smtp、httpは必要に応じて設定)
名前 ホスト ポート ゲスト ポート
ssh 10022 22
smtp 10025 25
http 10080 80
設定後、localhost の 10022 に対してターミナルで接続するとうまくいった。
関連記事

2012年11月2日金曜日

11/2 Android ニュースひとまとめ

 Android端末は2008年に最初の製品が登場して以来、シェアを伸ばし続けており、市場成長のけん引役。出荷台数の前年同期比伸び率は91.5%となり、市場全体の伸び率46.4%を大きく上回っている。

 スマートフォンのOS別出荷台数で2位となったのは米Appleの「iOS」。同OSを搭載するiPhoneの出荷台数は2690万台、市場シェアは14.9%だった。Androidには大差をつけられたが、2桁の市場シェアを持つOSはAndroid以外ではiOSしかなく、世界のスマートフォン市場はこの二つのOSでほぼ9割を占める2強体制となっている。
ニュース - 2012年Q3の世界スマホ市場、Android出荷台数が1.3億台超、シェア75%に:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20121102/434541/
Androidのシェア圧倒的ですね。
期間を限定しなくてもiOSといい戦いになっているんじゃないでしょうか。
新スマートフォンを続々と展開するファーウェイが、また新たなハイエンドAndoroidスマートフォン Honor 2 を発表した。シングルコアプロセッサ搭載の初代Honorから進化したHonor 2は、自社製のK3V2 1.4GHz クアッドコアプロセッサ、2GB RAM、8GBの内蔵ストレージを搭載する。

背面の裏面照射センサ採用8MPカメラは、連写や1080pのフルHD動画撮影に対応。microSDスロットも備える。前面カメラは1.3MP。

ディスプレイは 4.5インチ1280 x 720 IPS液晶。初代Honor の解像度が245ppiだったのに対し、Honor 2では iPhone の Retina ディスプレイとほぼ同じ326ppiへと飛躍的に向上している。

ほか Bluetooth 3.0、802.11b/g/n WiFi、GPSなど。GSMとWCDMA 5バンド対応。Android バージョンは4.0。
Huawei Honor 2 発表、「72時間駆動」の4コアAndroid携帯。4.5型326ppi 液晶採用 - Engadget Japanese
http://japanese.engadget.com/2012/11/01/huawei-honor-2-4-1-4ghz-k3v2-2gb-ram-4-5-326ppi
ストレージは小さいように見えますが、その他のスペックはかなり高め。
価格もかなり抑え目になっています。
国内メーカーも見習ってほしいな・・・。
関連記事

2012年11月1日木曜日

Google Play での 通貨表記について

Google Playにアクセスするツールを作っていて行き詰ったので、メモ。

¥表記で価格が取れない

アメリカにサーバを置いているクラウドサービス上からGoogle Playにアクセスすると、通貨表記が USD になってしまう。
URLパラメタに hl=ja を追加しても JPY で表示できない。
IPアドレスで判定されてしまっているようだ。
インターネット上にもこのような情報が少ない為、Googleのサポートに聞いてみた。

通貨表記の条件

Googleからの回答によると、以下の条件で通貨表記を決定しているとの事。
  1. Googleアカウントにログインしており、アカウントが、Google Walletのアカウントを作成済みなら、Google Walletでの国の通貨表記
  2. 上記に該当しない場合は、SIMカードでの国コード。SIMカードが無い場合は、アクセス元のIPから判断した国
つまり、アメリカにサーバを置いているクラウドサービスからGoogle Playにアクセスすると、IPから判定されUSD表記になってしまうという事。
また、URLパラメタ等でJPY表記にすることを強制できないようです。

対処方法

結局、クラウド環境から、日本のプロクシを介してGoogle Playにアクセスするという方法にしました。
USDをJPYに変換しようとも思ったのですが、変換結果がGoogle PlayでのJPYの値と異なるとまずいので・・・。
URLパラメタで制御できたりすれば一番良いんですけど。
関連記事

Androidアプリのセール情報チェックツール開発中!!

Androidアプリのセール情報チェックツールを開発しています。
現在クラウド環境にてデバッグ運用中です。
うまく動いている事が確認できましたら、セール情報をTwitter等でつぶやくようにしたいと思います。
そこで、セール価格をチェックしてほしいアプリ等ありましたら、コメントやTwitterにてGoogle Play上でのURLをご連絡いただきたいと思います。
アプリデベロッパーの方で、自分のアプリのセール情報をチェックしてほしい方も歓迎です。
実際にチェックツールでのチェックリストに追加するかは、こちらで判断します。
以下の条件にあてはまるアプリはチェックリストに追加しない可能性があります。
  • 無料アプリ
    チェックする意味が無い為、チェックリストから除外します。
  • インストール無料、アプリ内課金あり
    チェックツールで取得できるのはGoogle Playに表示された価格のみです。よって、アプリ内課金での価格は取得できません。誤解を招く事を避ける意味でチェックリストから除外します。
  • アダルトな内容のアプリ
  • 国や宗教の主張が含まれているアプリ
  • 著作権を侵害しているアプリ
    模造、キャラクターの無許可使用等
  • 評価が極端に低いアプリ
  • 評価数が少ないアプリ
  • ユーザに誤解を与えるアプリ
    実装されていない機能を謳っている詐欺アプリや、有名アプリに似せた名前のアプリ
  • その他、私個人の独断と偏見
チェックツールの大まかな仕様は以下です。
  • 1日4回チェック(登録アプリの増加によっては、回数を変更します)
  • チェック時間帯は原則、7時、12時、17時、22時
    いずれもJSTでの時刻
  • セールと判断する条件は、通常販売価格未満の価格であった場合
また、日毎に投稿しているアプリセール情報の記事に、チェックツールでのセール情報も記載する予定です。
関連記事

2012年10月31日水曜日

ruby_apk v0.4.1 を試す

Androidのパッケージファイル(apk)をAndroid SDK無しで解析できるRuby Gemが公開されたようなので試してみました。

準備

Ruby 1.9 系のインストーラをダウンロードしインストールする。
rubyinstaller-1.9.3-p286.exe をダウンロードしました。
RubyForge: Ruby Installer for Windows: ファイルリスト
http://rubyforge.org/frs/?group_id=167 コマンドプロンプトを起動する。
プロクシ環境配下の場合は、プロクシ設定を行う。
>set http_proxy=proxy.example.com:8080
色々入れる前にアップデート
>gem update --system --platform=mswin32
Latest version currently installed. Aborting.
rubyzipのインストール
>gem install rubyzip --platform=mswin32 --verbose
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
200 OK
Installing gem rubyzip-0.9.9
Downloading gem rubyzip-0.9.9.gem
GET http://rubygems.org/gems/rubyzip-0.9.9.gem
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/gems/rubyzip-0.9.9.gem
200 OK
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example_filesystem.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/example_recursive.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/gtkRubyzip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/qtzip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/write_simple.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/samples/zipfind.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/constants.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/deflater.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/dos_time.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/inflater.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/ioextras.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/null_input_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/pass_thru_compressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/pass_thru_decompressor.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/settings.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/tempfile_bugfixed.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_central_directory.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_entry.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_extra_field.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_file.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_input_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_streamable_directory.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zip_streamable_stream.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/lib/zip/zipfilesystem.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/README.md
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/NEWS
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/TODO
c:/Ruby193/lib/ruby/gems/1.9.1/gems/rubyzip-0.9.9/Rakefile
Successfully installed rubyzip-0.9.9
1 gem installed
Installing ri documentation for rubyzip-0.9.9...
rdoc --ri --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/rubyzip-0.9.9/ri lib --title rubyzip-0.9.9 Documentation --quiet
Installing RDoc documentation for rubyzip-0.9.9...
rdoc --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/rubyzip-0.9.9/rdoc lib --title rubyzip-0.9.9 Documentation --quiet
インストールを確認
>gem list --local

*** LOCAL GEMS ***

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.4)
rubyzip (0.9.9)
ruby_apkインストール
>gem install ruby_apk --platform=mswin32 --verbose
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/ruby_apk-0.4.1.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/ruby_apk-0.4.1.gemspec.rz
200 OK
GET http://rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/quick/Marshal.4.8/rubyzip-0.9.9.gemspec.rz
200 OK
Installing gem ruby_apk-0.4.1
Downloading gem ruby_apk-0.4.1.gem
GET http://rubygems.org/gems/ruby_apk-0.4.1.gem
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/gems/ruby_apk-0.4.1.gem
200 OK
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/.rspec
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Gemfile
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Gemfile.lock
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/LICENSE.txt
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/README.md
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/Rakefile
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/VERSION
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/apk.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/axml_parser.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/access_flag.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/dex_object.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/info.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/dex/utils.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/manifest.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/resource.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/android/utils.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/lib/ruby_apk.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/ruby_apk.gemspec
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/apk_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/axml_parser_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample.apk
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_AndroidManifest.xml
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_classes.dex
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_resources.arsc
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/data/sample_resources_utf16.arsc
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/access_flag_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/dex_object_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/info_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex/utils_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/dex_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/manifest_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/resource_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/ruby_apk_spec.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/spec_helper.rb
c:/Ruby193/lib/ruby/gems/1.9.1/gems/ruby_apk-0.4.1/spec/utils_spec.rb
Successfully installed ruby_apk-0.4.1
1 gem installed
Installing ri documentation for ruby_apk-0.4.1...
rdoc --ri --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/ruby_apk-0.4.1/ri lib LICENSE.txt README.md --title ruby_apk-0.4.1 Documentation --quiet
Installing RDoc documentation for ruby_apk-0.4.1...
rdoc --op c:/Ruby193/lib/ruby/gems/1.9.1/doc/ruby_apk-0.4.1/rdoc lib LICENSE.txt README.md --title ruby_apk-0.4.1 Documentation --quiet
インストールを確認
>gem list --local

*** LOCAL GEMS ***

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.4)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.4)
ruby_apk (0.4.1)
rubyzip (0.9.9)
よし、準備が整った。

実行

こんなコードを書いて、適当なapkをくわせる。
require 'ruby_apk'

apk = Android::Apk.new(ARGV.first)
m = apk.manifest
puts "package_name: #{m.package_name}"
puts "version_name: #{m.version_name}"
出力結果
package_name: com.blogspot.logroid
version_name: 2.2
SDK無しで情報取れるのは良いんだけど、まだまだ解析がイマイチ。
apktoolでデコードするとこんな感じのAndroidManifest.xmlが取り出される。
※先頭から一部を抜粋
<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="220000" android:versionName="2.2" android:installLocation="internalOnly" package="com.blogspot.logroid"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16" />
    <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" android:xlargeScreens="true" />
    <application android:label="@string/app_name" android:icon="@drawable/icon" android:name="TestApplication" android:hardwareAccelerated="true">
        <provider android:name=".provider.TestProvider" android:exported="false" android:authorities="com.blogspot.logroid.Test">
            <grant-uri-permission android:pathPrefix="/" />
        </provider>
apk_rubyではこんなxmlが取り出される。(manifest.to_xmlの結果)
<manifest xmlns:android='http://schemas.android.com/apk/res/android' android:versionCode='220000' android:versionName='2.2' android:installLocation='1' package='com.blogspot.logroid'>
    <uses-sdk android:minSdkVersion='7' android:targetSdkVersion='16'/>
    <supports-screens android:anyDensity='true' android:smallScreens='true' android:normalScreens='true' android:largeScreens='true' android:resizeable='true' android:xlargeScreens='true'/>
    <application android:label='@0x7f0b0016' android:icon='@0x7f0200dc' android:name='TestApplication' android:hardwareAccelerated='true'>
        <provider android:name='.provider.TestProvider' android:exported='true' android:authorities='com.blogspot.logroid.Test'>
            <grant-uri-permission android:pathPrefix='/'/>
        </provider>
android:labelが@0x7f0b0016となってしまっている。
これでは、リソースから、実態を参照することが出来ない。
ちなみにリソースも、name属性と値をペアで取る事ができず、取ることが出来るのは値のみでした。
name属性分からないから、実態と照らし合わせることが出来ない。
残念。
今のところ、比較的まともに取得できるのは、AndroidManifest.xmlのみのようです。
今後に期待です。
関連記事

2012年10月30日火曜日

10/30 Android ニュースひとまとめ

Google が 新 Nexus タブレット Nexus 10 を正式に発表しました。メーカーは事前のうわさどおりサムスン。対角10インチ(10.055インチ)で2560 x 1600 WQXGA という、圧倒的解像度のディスプレイが特徴です。ピクセルの細かさを表すppi (pixel per inch)は約300。たとえば「人間の網膜の限界を超えた」とうたうアップル iPad Retina ディスプレイモデルは9.7インチ2048 x 1536ピクセルで約264ppi。

そのほかの仕様はサムスン Exynos 5250プロセッサ (Cortex-A15 デュアルコア1.7GHz駆動 + Mali T604 GPU)、2GB RAM、16GBまたは32GB ストレージ。802.11b/g/n WiFi (MIMOアンテナ+HT40)、Bluetooth 4.0、NFC、5MPカメラ、1.9MPフロントカメラ。ほかGPUや電子コンパス、ジャイロ、マイクロUSB端子、マイクロHDMI出力。

本体サイズは263.9 x 177.6 x 8.9mm、重さ603g。プラットフォームはもちろん最新のAndroid 4.2を搭載します。バッテリーは9000mAh リチウムポリマー。
Google Nexus 10発表、10型2560 x 1600画面のAndroid 4.2タブレット。3万6800円から - Engadget Japanese
http://japanese.engadget.com/2012/10/29/google-nexus-10-10-2560-x-1600-android-4-2-3-6800/
公然の秘密だった Google の次期 Nexus スマートフォン Nexus 4 が正式発表を迎えました。事前情報のとおり、メーカーはLG。4.7インチ1280 x 768 IPS Plus 液晶にクアッド " Krait " コア1.5GHz の Snapdragon S4 Pro プロセッサ、2GB RAMなどを搭載しており、すでに発表済みのLG製ハイエンド Optimus G の兄弟機にあたります。

そのほか仕様は8GB または16GB ストレージ、背面8MP / 前面1.3MPカメラ、3G(WCDMA / HSPA+)、2100mAhバッテリー、NFC、ワイヤレス充電など。重量は139g。

OSは Nexus 4、Nexus 10と同時に発表された最新版 Android 4.2 Jelly Bean 。
Google Nexus 4 発表。4.7型1280 x 768に4コアKrait 、Android 4.2搭載のLG製スマートフォン - Engadget Japanese
http://japanese.engadget.com/2012/10/29/google-nexus-4-4-7-1280-x-768-4-krait-android-4-2/
最新プラットフォーム Android 4.2、新スマートフォン Nexus 4、10型2560 x 1600タブレット Nexus 10 と同時に、Google が 7型タブレット Nexus 7 の新機種を発表しました。ひとつはすでに店頭で見つかっていたストレージ32GB (WiFi) 版。事前情報のとおり、価格は従来の16GBモデルと同じ249ドル。16GBモデルが下がって199ドル。

さらに、32GBストレージと3G(HSPA+)モバイルデータ通信に対応したモデルも新たに加わりました。価格は299ドル。こちらは米英やオーストラリア、フランス、ドイツ、スペインの Google Play Storeで11月13日から販売予定。

一方日本のGoogle Play では、32GB(WiFi)版が2万4800円で追加されています。16GB版はそのまま199ドル。
32GB版 Nexus 7 は2万4800円、WiFi + 3Gの32GB版は299ドル - Engadget Japanese
http://japanese.engadget.com/2012/10/29/32gb-nexus-7-2-4800-3g-32gb-299/
いろいろ発表されましたが、ホッとしたのは32GB版Nexus 7の値段。
後悔しなくて済みましたw
Nexus 10 の特徴は、なんといってもタブレットで最高という2560 x 1600ピクセル300ppi の高解像度ディスプレイ。またプロセッサ Exynos 5250も、CPUが最新マイクロアーキテクチャ Cortex-A15のデュアルコア1.7GHz、GPUがMali T604クアッドコアなど、高解像度をドライブするためにいちいちヒャッハー!なハイエンド仕様を備えています。

10インチ級は相手に事欠かない激戦区ではありますが、もっとも普及しているタブレット iPad の最新型 (4代目) iPad Retina ディスプレイモデル を基準として、価格も仕様も挑戦的で今年末商戦のライバルとなるアマゾン Kindle Fire HD 8.9と、Nexus 10 のメーカーでもあるサムスンのAndroid人気モデル Galaxy Note 10.1 を比較対象に選びました。
Google Nexus 10 対 iPad (4代目)、Kindle Fire HD 詳細スペック比較 - Engadget Japanese
http://japanese.engadget.com/2012/10/29/google-nexus-10-10/
そして、Nexus 10のスペック。
iPadを凌駕するスペックとなっています。
そして価格も抑え目。
さすがGoogle!!
Google先生万歳!!
・マルチユーザー

ユーザーを切り替えて、ホーム画面やウィジェット、アプリ、写真、メールなどを分けて利用可能。同一アプリでもデータがユーザごとに分けられるため、たとえばゲームならスコアやセーブもユーザ別になる。ユーザーは再起動やログアウトの手順なく即座に切り替えられる。タブレット限定。
Android 4.2 発表。マルチユーザや Photo Sphere 撮影、無線ディスプレイMiracastなど - Engadget Japanese
http://ftf.japanese.engadget.com/2012/10/29/android-4-2-photo-sphere-miracast/
うわさされていたマルチユーザもお披露目となりました。
タブレットを家族で共有するという人には嬉しい機能ですね。
Google has officially indicated that there are now more 700,000 apps in the Google Play Store,
ついにGoogle Play上のアプリが70万を超えたらしいです。
またセールやらないかなぁ・・・w
関連記事

2012年10月24日水曜日

10/24 Android ニュースひとまとめ

 Amazon.co.jpは24日、電子書籍リーダー「Kindle Paperwhite」と、タブレット端末「Kindle Fire HD(7インチモデル)」「Kindle Fire」の日本国内での予約販売を開始した。出荷開始予定は、Kindle Paperwhiteが11月19日、Kindle Fire HDとKindle Fireが12月19日。また、日本向けの「Kindleストア」も10月25日にオープンする。

 製品ラインナップは、Kindle PaperwhiteがWi-Fi版とWi-Fi+3G版、Kindle Fire HDとKindle FireはWi-Fi版のみ。価格は、Kindle PaperwhiteのWi-Fi版が8480円、Wi-Fi+3G版が1万2980円。Kindle Fire HDの16GBモデルが1万5800円、32GBモデルが1万9800円。Kindle Fireが1万2800円。
Amazon「Kindle」を日本でも11月発売、「Kindleストア」は10月25日オープン -INTERNET Watch
http://internet.watch.impress.co.jp/docs/news/20121024_568193.html
私のところにも発売の通知が来ました。
Android端末だからといって飛びついてはいけません。
Kindleはあくまで電子ブックリーダーデバイスであって、Nexus 7のようなデバイスとは異なります。
また、Google playもrootをとらないと利用できません。
一般の購入者がそれを知らずに買ってしまうような気がしてなりません。
関連記事

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

Google App Engine Java SDK 1.7.3がリリースされました。
リリースノートは以下。
  • We encourage you to try and test your application using Java 7 and the App Engine SDK. Note that Java 7 is not a supported runtime.
  • Java 7 Features that we encourage you to try in dev appserver:
    • Strings in switch
    • Binary integral literals and underscores in number literals
    • Multi-catch and more precise rethrow
    • Improved type inference for generic instance creation (diamond)
    • try-with-resources statement
    • Simplified varargs method invocation
  • Java 7 features that are NOT supported:
    • All new Java 7 classes (the Google App Engine whitelist has not been updated yet)
    • Method Handles
    • Invoke Dynamic bytecode
  • InetAddress name resolution now displays UnknownHostException instead of a runtime exception error when the host is unknown.
  • Datastore Index stats now report type instead of representation-type.
  • Class Loading Priority can now be granted to specific JAR files by adding class-loader-config element in appengine-web.xml file. This is an experimental feature.
  • Queries with transactions are now fully checked for consistency in Remote API.
  • Global Consistent Indexes are now deprecated in the Search API.
  • ListResponse<Document> listDocuments(ListRequest) has been deprecated and replaced with GetResponse<Document> getRange(GetRequest) in the Search API.
  • ListIndexesReponse listIndexes(ListIndexesRequest) has been deprecated and replaced with GetResponse<Index> getIndexes(GetIndexesRequest) in the Search API.
  • getField(String) has been deprecated and aliased to getFields(String) in the Search API.
  • AddResponse Index.add() has been deprecated and renamed to PutResponse Index.put() in the Search API.
  • RemoveResponse Index.remove() has been deprecated and renamed to DeleteReponse Index.delete() in the Search API.
  • Users can now change authentication options after app creation
  • Fixed an issue with Channel API breaking when using urlfetch service. This issue was limited to the SDK.
  • Fixed an issue with ResponseRewriterFilter not being threadsafe when using Remote API.
SdkForJavaReleaseNotes - googleappengine - Google App Engine Java SDK Release Notes - Google App Engine - Google Project Hosting
http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes
Java 7に関するアップデートのようです。
Java 7からサポートされているランタイムは未サポートとのことなので、Java 7にするのはもう少し待ったほうが良いのかなぁ。
関連記事

2012年10月22日月曜日

10/22 Android ニュースひとまとめ

 ソニーは10月22日、販売を一時停止しているAndroidタブレット「Xperia Tablet S」の販売再開を11月中旬より順次行うと発表した。対象製品は「SGPT121JP/S」「SGPT122JP/S」「SGPT123JP/S」の3モデルだ。

 これらは一部製品において、製造上の不具合によりディスプレイパネルと本体背面に隙間が生じ、仕様上の防滴性能(IPX4相当)を維持できない可能性があると判明。10月5日に販売を一時停止していた。
ソニー、販売一時停止中の「Xperia Tablet S」を11月中旬より販売再開 - ITmedia PC USER
http://www.itmedia.co.jp/pcuser/articles/1210/22/news102.html
国産タブレットェ・・・。
ソニーの技術力ワロタ。
AOSテクノロジーズは、Android搭載スマートフォンやタブレット端末に対応したフィルタリングソフトの最新版「ファイナルスマホセキュリティv.2.0」を発売した。

同製品は、クラウド技術を活用し、閲覧しようとするウェブをリアルタイムに解析、アクセスを制御できるAndroid端末向けウェブフィルタリングソフト。
【セキュリティ ニュース】「ファイナルスマホセキュリティ」がアプリ制御に対応:Security NEXT
http://www.security-next.com/034684
え、クラウド上でページスキャンするの?
レスポンス大丈夫なのかな・・・。
関連記事

2012年10月21日日曜日

10/21 Android ニュースひとまとめ

日本のロジテック(Logitec)の子会社 ロジテック INA ソリューションズが、WiFi 機能搭載のポータブル DVD ドライブ LDR-PS8WU2BKWをウェブ直販限定で発売します。特徴はDVDの映像を無線で直接スマートフォンやタブレットに飛ばして視聴できること。

iOS / Android 端末に専用の視聴用アプリ「Logitec WiFi DVD」をインストールして、ドライブと無線LANで接続することで、DVD / CD の映像・音楽などを視聴できるようになります。本体背面には USB2.0の端子(A型)も装備しており、光学ディスクのほか USB メモリ内の写真・動画などもワイヤレス視聴が可能です。

またDVD-R などへの書き込みにも対応しており、スマートフォンやタブレット端末に保存している写真や動画を、PC を経由せず直接ディスクに記録することも可能。ただし WiFi 経由で DVDに 書き込むときは、バッファアンダーラン防止のためキャッシュ用USB メモリを挿しておく必要があります。
iOS / Android端末で直接DVDが見られるWiFi搭載DVDドライブ、ロジテック直販限定 6980円 - Engadget Japanese
http://japanese.engadget.com/2012/10/19/ios-android-dvd-wifi-dvd/
Android端末等をDVDプレイヤーにできます。
これは良いですね~。
一応、PCのドライブとしても使えるようです。
価格がもう少し安ければ良いんですが・・・。
世界シェアNO.1のスマートフォンOSと言えばAndroid。そのキャラクターである「ドロイド君」も可愛らしく、キャラグッズが作られるほどの人気である。

そのドロイド君がなんと古代中国にいたという。ドロイド君古代バージョン画像は「原来古代就有安卓!」という名でアップされいる。訳すと「古代にはすでにドロイド君がいた!」という意味である。

ドロイド君にソックリの青銅器は、中国版Twitter・Weiboにアップされたものである。博物館かどこかで展示されたもののようだ。

丸みを帯びたフォルムに直線的な手足。ちょうどバンザイをしたポーズだ。触覚もあり、色もどことなくドロイド君っぽくはある。
古代中国の青銅器がどう見ても「ドロイド君」だと話題に | ロケットニュース24
http://rocketnews24.com/2012/10/21/257653/
これは、確かにドロイド君。
パクリ大国だけど、こればっかりは認める。
関連記事

2012年10月18日木曜日

10/18 Android ニュースひとまとめ

購入したらまず残りストレージを見て「アタリ」かどうか確認するタブレット Nexus 7 の話題。米小売大手 Staples のビジネスユーザー向けポータルで、容量32GB版の Nexus 7 が見つかっています。値札は16GB版よりもなぜか微妙に安い248.37ドル。

Google ブランドのASUS製タブレット Nexus 7は、米国では8GB 199ドルと16GB 249ドルの2商品 (SKU) 構成で、 日本向けには16GB 1万9800円の1SKUのみで販売されています。が、16GBを購入してなにげなく設定画面を開いたらユーザーエリアがなぜか「合計容量 27.58GB」だった との報告があり、どんな手違いで紛れ込んだのかはさておき、32GB版が存在することそのものは確認されていました。
Google Nexus 7 の32GB版を Staples が掲載。16GB版と同等価格 - Engadget Japanese
http://japanese.engadget.com/2012/10/17/google-nexus-7-32gb-16gb/
まぁ、2000円クーポンつきで買えたので良しとしよう。
と思わないとやってられない。
Google が Android 関連イベントの開催を告知しました。招待状にある文句は「The playground is open.」。基本オープンで Google Play (非オープン)がある Androidらしい言葉です。日時は米国東海岸時間で10月29日朝10時、日本時間では29日夜23時くらい。

中身としては開発者向けのアップデートのほか、次期 Nexus 端末の発表が期待できます。これまでたびたびうわさになってきたのは、日本でも各キャリアから買える LG Optimus G の兄弟機といわれる LG E960 " Mako "。E960は真偽不明ながら「with Google」 ロゴつきのプロトタイプとされる写真まであり、画面サイズから 命名 Nexus 4 説があります (4.7インチなのに)。
Google、10月29日にAndroidイベントを開催。新 Nexus 発表? - Engadget Japanese
http://japanese.engadget.com/2012/10/17/google-10-29-android-nexus
噂されていたNexus 4の発表となるのか。
次のNexusはどこ製なのか。
リークどおりLGでしょうかね。
関連記事

2012年10月17日水曜日

Firefox での CDATA の扱い

Firefox 17 beta1 に更新したところ、とあるGreasemonkeyスクリプトが動かなくなった。
スクリプト内部で使用している、CDATAが、Firefox 17ではsyntax errorとなっていた。
警告: E4X は非推奨となりました。 この機能は、Firefox 16 において content 向けにはデフォルトで無効となり、Firefox 17 では chrome 向けにもデフォルトで無効となる予定です。 そして、Firefox 18 において削除される予定となっています。 代わりに、DOMParser/DOMSerializer や非ネイティブの JXON アルゴリズムを使用してください。
JavaScript
E4X が無効化されました

 Bug 778851 – Turn javascript.options.xml.content off by default

ECMAScript for XML (E4X) は非推奨となり、Firefox 17 で無効化されました。隠し設定 javascript.options.xml.content の値を true に変更すれば有効になりますが、Firefox 18 Firefox の近い将来のバージョン (当初 Firefox 18 とされていましたが現状未定のようです) では実装そのものが完全に削除される予定です。
Firefox 17 のサイト互換性に関わる修正のまとめ | Mozilla Developer Street (modest)
https://dev.mozilla.jp/2012/10/firefox-17-site-compatibility/
これによると、ECMAScript for XML (E4X) は、Firefox 17ではデフォルトで無効、Firefox 18で削除予定らしい。
about:configで有効にできるみたいですけど、一時しのぎにしかならないな。
Greasemonkeyのページにも書いてあった。
E4X is deprecated. It will stop working in phases, Firefox 16 through 18.
Multi Line Strings - GreaseSpot Wiki
http://wiki.greasespot.net/Multi_Line_Strings
こうなると、CDATAで実装していたようなヒアドキュメントをJavaScriptで実装する手段が無いな・・・。
ということで、CDATAを文字列の配列に変換するスクリプトを作りました。
詳しくは以下のページを参照ください。

JavaScript内の CDATA → 文字列配列 変換スクリプト - ログろいど

しかし、これからGreasemonkey内にスタイルシート埋め込む時の手間が増えるな・・・。
何かいい方法無いだろうか。
その後
SpiderMonkey から E4X サポートが削除されました。
Firefox 21 ベータ版リリースノート
http://www.mozilla.jp/firefox/21.0/releasenotes/
Firefox 21で正式に削除となるようです。
関連記事