Docomo専用のAPIをAndroidで動くように実装するガラケーの物理キーを画面に表示して押せるようにするiアプリをAndroid(DalvikVM)上で動作可能な形に変換するできそうだ。先行した、関連したものiアプリ変換機。iアプリをAndroidアプリに変換しようという人はすでにいた。renacentiaiアプリ、S!アプリをAndroidアプリに自動変換――NSW、無料の試用サイトを公開とか。どれもアーカイブ目的じゃない。なにより私が気になるのは「ソースコード」が必要ってところ。それじゃあ製作者しかAndroidアプリに変換できない。iアプリの開発環境を入れたWindowsでは、iアプリを動かすことができる。(どうやってアプリを入手するかは別の話)最後につくります。プログラムでメモリー・リークが発生するのでしょうか?その通りです。http://www.ibm.com/developerworks/jp/java/library/j-leaks/メモリはリークするかまとめ相互参照は問題ない。問題なのはライフサイクルの不一致。Javaは「メモリリーク」しないJavaはすごい。参照できなくなったメモリ領域を自動的に開放してくれる。C/C++のようなメモリリークは起こらない。Javaがメモリリークしない理由なにを解放するか。参照できなくなったメモリ領域とは、どのようなものだろう。Javaではうまいことなっているのだが、まずはすごーく素朴なものを考えてみよう。そのオブジェクトの参照されている数を記録しておき、0になったら破棄するというのはどうだろう。これをリファレスカウンタ方式という。理解しやすくするため、3つのオブジェクト「キミ」と「ゴリラ」と「バナナ」を考えよう。解放が上手くいく場合キミはメインクラスなので被参照数が1ある。(キミの被参照数=1)キミはゴリラを見ている。(ゴリラの被参照数=1)ゴリラはバナナを見ている。(バナナの被参照数=1)これですべてのオブジェクトは解放されない。ここで、ゴリラが要らなくなったとしよう。キミはゴリラから視線を外す。すると、誰にも見られていないゴリラが解放される。続いて、誰にも見られていないバナナが解放される。ゴリラとバナナは正しく解放できた。解放が失敗する場合さて、ここで問題だ。バナナがゴリラを見ていたら、何が起こるだろう。キミがゴリラへの視線を外しても、ゴリラとバナナの被参照数は1となり、解放されないのだ!もうゴリラはいらないのに、ゴリラは居座り続けるし、なにより、バナナも残ってしまう。相互参照とは、バナナとゴリラが残ること、である。JavaのGCさて、JavaのGCはいかにして上記の問題を解決するのだろうか。それはルートオブジェクトの導入である。http://ja.wikipedia.org/wiki/マーク・アンド・スイープまずキミに色を塗る。キミの見ているもの、つまりゴリラに色を塗る。ゴリラの見ているバナナに色を塗る。適当なタイミングで色が塗られていないものを解放する。これならバナナがゴリラを見ていてもゴリラが二度塗りされるだけだ。いわゆる二度塗りゴリラだ。キミがゴリラから視線を外せばゴリラもバナナも色塗りされずに解放される。純粋なキミは、「え、じゃあみんなこれやればいいじゃん」と思うだろう。リファレスカウンタ方式に比べて処理が重いとかダメなところもあるので一概には言えない。Javaで起こるメモリリークってなに端的に言えば、ライフサイクルの不一致だ。メンバー間の音楽性の不一致によって解散するバンドも数多い。そのなかでもう使わないのに参照し続けているものがあるのではないか。部屋の隅にある小5のときに書いた文集だ。友達のやつは読んだし、自分のも読んだし、あの子のも読んだ。中学の時に読み返して、なんでこんなこと書いたんだと不思議に思った。小6ならまだしも、小5である。読むことはないだろう。子どもに見せるため?親の小5の文集を見たことがあるか?結婚相手はいるのか?頭は大丈夫か?それはいわばゴミなのだ。Garbageなのだ。Collectされるべきなのだ。キミから参照されているためにこのゴミはお母さんによって片付けられることはない。(なお、お母さんがマーク・アンド・スイープ方式を採用しているかは議論の余地が残る)AndroidではAndroidではAndroidの用意してくれたフレームワークという舞台上でキミのイカしたActivityやServiceその他を踊らせていくことになる。このフレームワークの生存期間は(たいてい)キミのアプリが起動している期間と等しい。やっかいなことにもっと長いものもある。タイマー処理にゴリラを参照させると、そのタイマーが解放されるまでゴリラはメモリ上に残る。これがもしActivityだとすると、ActivityはViewをたくさん持っているし、画像も持ってるかもしれないしメモリが大きいので問題になる。あと、タイマーの時間にもよる。タイマーが24時間後だったらやばい。24時間ゴリラがメモリ上にいるのだ!!!危ない!!!Androidでは何がどれくらいの長さ保持されているかが不明瞭なため、こういったメモリリークが起こりやすい。ライフサイクルを一致させろ。Activityで使うもの(ゴリラ)はActivityに持たせる。すればActivityが解放されるタイミングでそれ(ゴリラ)も解放される。ライフサイクル、つまりいつ作られて、いつ要らなくなるかという世界で閉じた作りになっていれば、メモリリークは怖くないのだ。共有2014年2月10日月曜日AndroidでOpenCVを使う「これがあったら便利だよね」ってのを、どっかのおっさんが用意してくれる。それがOpenCVだ。http://gori-naru.blogspot.jp/2012/11/opencv.htmlOpenCV画像をいじりたい人が使うライブラリ。だいたい無料で使い放題。Androidで使うのはマジカンタンだからあ、やったほうがよくね?笑AndroidでOpenCVを使うとりまダウンロード。OpenCVはいろんなOS用で動くのだ!wa-iもちろんここではAndroid版をダウンロードする。いい感じのトコに解凍する。ダウンロードディレクトリとかじゃないほうがいい。Eclipse起動してくれ。これAndroidライブラリプロジェクトだよ。