2013年11月10日日曜日

[android]ファイル圧縮による通信量の削減

NTT docomo様ご提供の「AndroidTMアプリ作成ガイドライン~効率的な通信制御に向けて~」を読みました。


PDF内の「3.4.5. ファイル圧縮による通信量の削減」をやってみました。
携帯ネットワークの効率的な利用に対して、私にもすぐに貢献できそうだとおもったからです。
(まあ、私のアプリの通信なんて微々たるものだとはおもいますが……)
PDF内のサンプルコードHTTP GET時にGZIP要求を行うクラス(AsyncHttpGet2)の内容そのままです。

HttpResponseインスタンスを得るところまでをちょっと変更させてもらうと、
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("WEB APIのリクエストURL");
Header[] headers = new Header[2];
headers[0] = new BasicHeader("Accept-Encoding", "gzip, deflate");
headers[1] = new BasicHeader("User-Agent", "my program (gzip)");/** ★ */
httpGet.setHeaders(headers);
HttpResponse response = httpClient.execute(httpGet);
/** responseがGZIP圧縮されている場合は、GZIPInputStreamで受け取る */
/** PDFのサンプルコードがとても参考になります! */

★の("User-Agent", "my program (gzip)")は通信するサーバによっては不要だとおもいます。
Google様のWEB APIを使うときは必要なようです。
たとえばYouTube Data APIには、gzipを含むUser-Agentの指定が必要なことが明記されています。
gzipを含んだUser-Agentを指定しないと、GZIP圧縮された返戻を得られませんでした。
Google App Engineで作った自作のWEB APIでも同様だったので、Google様で共通の仕様なのかもしれません。




2013年11月6日水曜日

GAE(Java)のプロジェクトが変になった



SDKが初期化できないとかなんとかという現象でした。

ちょうどこことかここにあるような内容と同じ現象でした。
cleanができない、プロジェクトに赤いびっくりマーク(!)が表示される……
泣きそうでした。


なにを契機におかしくなったのかは不明です。
なんとか復活できましたので、その内容をメモしておきます。

【環境】
パソコン: iMac 21.5-inch, Late 2012
    プロセッサ 2.7GHz Intel Core i5
                メモリ 8 GB 1600 MHz DDR3
OS: Mac OSX 10.9 Mavericks
Eclipse: バージョン4.2.2
Java: Java 6

【対処概要】
Java 7をインストールする。
Warning: The App Engine SDK no longer supports Java 6. Applications that use Java 6 need to be migrated to Java 7. Existing applications that use the Java 6 runtime are still supported, but this support will be removed in a future release.
なのだそうです。

【メモ】
1. JDK 7のインストール
ここを参考にさせていただきました。ありがとうございます。
「(4) 環境変数を設定する」はやっていないです。よくわからなかったので。
「(5) システムのJavaを設定する。」もやっていないです。
そのかわり、java -versionとかjavac -versionとかやったら、
Java 7(1.7.0_45)に変わっていることは確認しました。
(※)MacでのJava Preferencesは、ここにあるようです。
 ある時点から、アプリケーション->ユーティリティ配下ではなくなったようです。
  リンゴマーク(左上)→システム環境設定…


2. プロジェクトを修正する
・右クリック(※) ⇒ Properties -> Google -> App Engine
 Use specific SDKを正しいものに選びなおす。

・右クリック ⇒ Properties -> Java Build Path -> Librariesで×マークになっているものを
 Removeする。
 ⇒ プロジェクト欄の赤いびっくりマーク(!)は消えました。
   しかし、Project -> Cleanしてもまだなにやらエラーがでていました。
     あと一歩です!
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/google/appengine/tools/enhancer/Enhance : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)


・JREの設定
 ⇒ こちらがJava 6のままだったから不都合が起きていたようです。

      Eclipse(※) -> 環境設定… -> Java -> Insitalled JREs
     (※)リンゴの隣です。Windows PCの場合は、Window -> Preferencesだったとおもいます。
      jre6にチェックがついていました。
      Searchボタンを押すと、jre7が見つかったので、チェックをつけてOK。

だいたいこんな感じで、再びcleanや実行、deployができるようになりました!

他にはORACLE様のFAQが参考になりそうなのでリンクを紹介しておきます。

(※)生粋のMacユーザさん達は右クリックなんてしないのですかね。
私はマウスの設定で右クリックを有効にしています。慣れた操作なので、私にはしっくりきます。




2013年10月31日木曜日

OSX MavericksにHAXMをインストールしてエミュレータを起動すると……(android)

Intel(R) Hardware Accelerated Execution Manager(HAXM)は13/10/31現在、Mac OS X 10.7 Lionまでのサポートのようです。
READMEみたいなファイルをみて、それは知っていたのですが、まあ大丈夫だろうとおもって、OSX Mavericksにインストールしてみました。
失敗しました……

HAXMをOSX Mavericksにインストールして、androidエミュレータを起動しようとすると、Macがフリーズしました。
こんなのはじめてです……
お気をつけください。
3時間ほど放置しましたが、画面中央下部にインジケーターがまわりつづけ、マウスは反応せず、Command + Option + Escも効かず、嫌でしたが買ってからはじめて、泣く泣く電源ボタン長押しをしました。
iMac 21.5-inch, Late 2012です。

再起動後はアンインストールとディスクユーティリティで、ディスクの検証とかをしておきました。
上記のリンクにアンインストール方法が書いてあります。
念のため、AVD Managerでエミュレータを消して(※)、作成しなおしました。
今度は無事、エミュレータの起動ができました。とりあえずよかったです。

このへんの話は、stackoverflowでも話題がでていました。
公式見解(やりとり)はこちら

(※)Macがフリーズするまえに、起動しようとしていたデバイスのdeleteができませんでした。電源ボタンを押し強制終了したことによる影響かとおもいます。こちらを参考にして、~/.android/avd配下の.iniファイルと*.avdフォルダを消しました。

追記(2013/11/7)
hotfixがでていました。私はまだインストールしていないです。
http://software.intel.com/en-us/articles/intel-hardware-accelerated-execution-manager/




2013年10月14日月曜日

Alt+P

「現在他のプロセスによって書き込みが禁止されています。」

ドットインストール様を利用させていただいて、HTMLの勉強をしています。

OSはWindows7、エディタはサクラエディタを使用していましたところ、
なんだかわからないタイミングで「現在他のプロセスによって書き込みが禁止されています。」と表示されて保存ができなくなるのです。
ウィルス感染? とか焦っていると、Alt+Pで解決しました。

こちらのページを参考にさせていただきました。
ありがとうございました。



2013年9月22日日曜日

JavaScript勉強

aaa
をお使いですね。


東京五輪開幕まで残り
test
です。


  • 2020/07/24までの残りの時間を計算しています。
  • JavaScriptは月を0-11で表すのですね。
  • Chromeだと、右クリック->ページのソースを表示でソースが見れるのですね。
デルカへ

2013年9月7日土曜日

[GAE]テキストファイルを読み込む

Google App Engineにテキストファイルを置いておいて、それを読み込みたいことってありますよね? ありませんかね。。。

ファイル書き出しはできないけれど、読み出しはできるみたいなことは書いてあるのですが、どこにどうおいて、ファイルパスはどうなるのかがいまいちわかりませんでした。
今日わかりました。
どうでもよい話ですが、私の失敗談をひとつご披露。
わからない間は、String data = "……"; で、ものすごい長い文字列を書いていました……
その文字列の中に"とかエスケープしないといけない文字があったりするので、生データをエスケープするためのプログラムを書いたりしていました……
その変換プログラムがバグだらけで、データが増えるたびに、変換プログラムで不都合が発生して……
まあ、たぶんGAEにテキストファイルを置きたいという時点で根本を間違えている気がしないでもないのですが…… とまれ、余談でした。


まずファイルは、war/ の下に格納します。
たとえば、war/data/test.txt みたいな感じです。

読み出し処理は、

ServletContext context = super.getServletContext(); // HttpServletインスタンスです

URL url = context.getResource("/data/test.txt"); // warから下のパスで書きます。

FileInputStream is = new FileInputStream(url.getPath());

FileInputStreamのインスタンスが得られたここから先は、「とほほのJava入門」様がとても参考になります。
よく参考にさせてもらっています。ありがとうございます!

追記
ここに似た話が書いてありました。



  デルカへ


2013年9月6日金曜日

[android]HTTP GETする

ドコモからiPhoneがでる(?)らしく、早くiOSアプリのほうをなんとかしたいのですが、これまでのことをまとめておきたくて私がよく使う手を公開します。

HTTP GETして、Stringが欲しいことってよく(?)ありますよね。
WEB APIでレスポンスがJSONで返ってくるというのはよくあるようにおもいます。

TorifukuHttpClient.Decoder decorder = new TorifukuHttpClient.Decoder() {
@Override
public Object decode(TorifukuHttpClient client,
InputStream is) {
return client.convertString(is, "SJIS");
}
};
TorifukuHttpClient client = new TorifukuHttpClient();
String text = (String) client.getContent("http://google.com", decorder);


画像をダウンロードして、Bitmapにしたいこともよく(?)ありますよね。

TorifukuHttpClient.Decoder decorder = new TorifukuHttpClient.Decoder() {
@Override
public Object decode(TorifukuHttpClient client,
InputStream is) {
return BitmapFactory.decodeStream(is);
}
};
TorifukuHttpClient client = new TorifukuHttpClient();
Bitmap bmp = (Bitmap) client.getContent("https://lh4.googleusercontent.com/--dq8niRp7W4/URquVgmXvgI/AAAAAAAAAbs/-gnuLQfNnBA/s1024/A%252520Song%252520of%252520Ice%252520and%252520Fire.jpg", decorder);

ところで、TorifukuHttpClient て何だ? という話ですが、すでに使いやすいとってもすばらしいApache HTTP Clientを私がよく使う形にしてまとめたクラスです。
GitHubで公開しています。

  デルカへ