Drowsy Dog's Diary

any note, any thought

2014年7月2日
by kazoo
0 comments

[android] KitKat でギャラリーから画像取得

ギャラリーから写真を取得するとき、以前の Intent.ACTION_PICK が返す URI が、

content://media/external/images/media/3951

のように返っていたのに対し、
KitKat(API Level 19) では、MediaStore.Images.Media.DATA で ContentResolver にクエリした場合、

content://com.android.providers.media.documents/document/image:3951

といった URI が返ってくる。

Android Gallery on KitKat returns different Uri for Intent.ACTION_GET_CONTENT – Stack Overflow

KitKat では、Intent に ACTION_OPEN_DOCUMENT を設定し、takePersistableUriPermission(android.net.Uri, int) を呼んでやる必要があるとのこと。

2014年6月29日
by kazoo
0 comments

[android]INSTALL_FAILED_UID_CHANGED

腹立たしいので久しぶりに書く。
NEXUS 5 にて、Eclipse からパッケージをインストールする際、唐突に以下のエラー:

[2014-06-27 17:52:18 – Xxxxxxx] Installation error: INSTALL_FAILED_UID_CHANGED
[2014-06-27 17:52:18 – Xxxxxxx] Please check logcat output for more details.
[2014-06-27 17:52:18 – Xxxxxxx] Launch canceled!

Continue Reading →

2014年2月4日
by kazoo
0 comments

[rails]アセットパイプラインのためのApache最適化設定

アセットパイプライン

「アセット」とは Web サーバ上の静的コンテンツのこと。具体的には、画像、CSS、Javascript などのファイル。

アセットパイプラインはバージョン3.1以降の Rails に備わっている機能で、主な役目はアセットを圧縮・結合すること、そしてファイルのフィンガープリントをファイル名に組込むこと。この2つの操作を「コンパイル」と呼んでいる。

は、アセットをコンパイルするコマンド。
app/assets/images/
app/assets/stylesheets/
app/assets/javascripts/
app/assets/fonts/

などにあるファイルが「プリコンパイル」される。

コンパイルによって、 app/assets/images/ 以下の画像ファイルには MD5 ハッシュをファイル名に付加して /public/assets/ にコピー。また CSS/JS は、それぞれの拡張子(.scss, .erb, .coffee など)に応じた方法でファイルが変換され、CSS や JS ごとの結合が行われた後、Minification(空白、改行、コメントの除去等)された後に gzip 圧縮される。

このようにすることで、アセットの通信量を最小化しつつ、ファイルの中身の変化に応じてファイル名自体が変わるので、ブラウザやプロキシサーバにキャッシュされていても古いファイルが替わらないという問題を避けられる。むしろ /assets/ 以下の URI へのアクセスに関しては、出来る限りキャッシュを推奨するのが望ましい。そのための HTTP リクエスト/レスポンスのヘッダ設定が以下のようになる。

キャッシュ設定

ここでは CentOS 想定。設定ファイルパス、URI は適当に読み替えてください。

/etc/httpd/sites-available/my_site

それぞれの意味はこんな感じ。

  • ExpiresActive… On にすると Expires および Cache-Control ヘッダを生成する
  • ExpiresDefault… Expires に設定するデフォルトの値。ここではアクセス日時+30日間
  • Header set Cache-Control… HTTP ヘッダの Cache-Control の値を上書きする。”public” は、ブラウザだけでなく Web プロクシにもキャッシュを許可する
  • Header unset Etag… HTTP ヘッダの ETag を削除する(レスポンスが ETag ヘッダを持たないようにする

圧縮設定

アセットパイプラインにおける CSS ファイルなどは圧縮・結合された上で /public/assets/ に配置される。そのとき、*.css, *.css.gz の2つのファイルが生成される。ミニフィケーションと結合だけが行われたものと、それをさらに gzip したもの。

現在多くの Web ブラウザでは、gzip形式で圧縮されたコンテンツをサーバから受け取って、それを展開してからレンダリングする機能を持っている。そういったブラウザは、Accept-Encoding リクエストヘッダに gzip あるいは x-gzip という文字を含む値をセットする。これを受け取った Apache や Nginx といった Web サーバは、その場でコンテンツを圧縮して送り返す。

しかし、アセットパイプラインを利用している場合はすでに圧縮されたファイルが存在しているので、この圧縮は CPU の無駄となる。なので、すでに圧縮済みのファイルを利用するような設定が以下となる。

/etc/httpd/sites-available/my_site

  • AddEncoding… 拡張子 .gz のファイルのエンコーディングが x-zip だと指定する。
  • Header set Vary Accept-Encodig… Vary ヘッダは、リクエストのヘッダによってレスポンスが変化することと、その基準となるリクエストヘッダを Web プロクシに教える。これによってたとえば gzip 圧縮に対応しているブラウザとしていないブラウザが同一のプロクシにアクセスしても問題が出ないようにできる
  • RewriteEngine on/RewriteCond… Accept-Encodingヘッダに gzip/x-gzip という文字を含むリクエストで、かつ末尾に .gz を加えた URI に対応するファイルが存在する場合、それを返す
  • <FilesMatch>…. 拡張子 .css.gz および .js.gz の MIME タイプを ForceType ディレクティブによって指定する

2014年1月31日
by kazoo
0 comments

glReadPixels()の alpha の値

めもん。

GLUTとOpenGLで描画したとある領域を glReadPixels() してフレームをキャプチャする。
データはRGBAで、透明をちゃんと読み出したいのだけど、なんか環境によってアルファの値がすべて FF になっていることがあった。

ごく単純に

だけやっても、α=0なのでキャプチャ結果は真っ黒を期待しているんだけど、実行環境によって青になったりする。

RGBA を指定しているのになんでだー?と、思ったら。

glutInitDisplayMode

GLUT_RGBA
Bit mask to select an RGBA mode window. This is the default if neither GLUT_RGBA nor GLUT_INDEX are specified.

GLUT_RGB
An alias for GLUT_RGBA.

おお。GLUT_RGB と GLUT_RGBA って同じものだったのか。。

ということで、

とするのが正解だったらしい。

2014年1月8日
by kazoo
0 comments

[php] HTTP POST のレスポンスをストリームとして扱う

※ PHPさっぱりわからん人のメモですゆえ注意。

pear の HTTP_Request2 を使って POST して、 Response body に Base64 されたバイナリデータをこんな感じに受け取っていたのだけど、

あるときこのレスポンスが数百MB になって、Response.php の中でメモリ不足で落ちるように。

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 131334946 bytes) in /usr/lib/php/pear/HTTP/Request2/Response.php on line 364

ほんで、これストリームとして扱うのはどうするんじゃろ、と調べた結果。
HTTP_Request2 のままでは無理そうな感じ。
ファイルに落とすのは stream_copy_to_stream がラクそうだった。
いろいろ自信はない。

参考:
http://stackoverflow.com/questions/20440269/how-to-get-an-http-response-as-a-stream-in-php
http://stackoverflow.com/questions/19589154/php-stream-get-all-http-request-headers