スポンサーリンク

2012年12月28日金曜日

GooglePlay始めました

勉強のために始めたAndroidアプリが成長し、一応のレベルに達したのでGooglePlayで公開してみました。ボイスレコーダーアプリです。録音にメモを着けることができ、3gpp(圧縮)とPCM(非圧縮)録音を簡単に切り替えられます。無料なのでよかったら使ってみてください。

お遊び程度に参考書のサンプルコードを動かしてみたことはありましたが、本格的なAndroidアプリを作るのは初めての経験でした。元は参考書に載っていた1ページにも満たない音声録音のサンプルコードだったのが、いろいろいじり廻して、拡張に拡張を繰り返した末、最終的に25個の独立したクラスにまでなりました。(内部クラスや無名クラスまで入れればこの倍くらいにもなるでしょう。)

実際一人でアプリを作るとなると、参考書をなぞっただけでは学び取れない、実に様々な知識が必要になります。ラジオボタンを横に並べるのにあんなに苦労するとは…

Javaプログラムを楽しむ以外にも、Gitでバージョン管理してみたり、GIMPでアプリケーションアイコンを作ってみたり、実に楽しい一時でした。

さて次は何作ろっかなっと。

2012年12月22日土曜日

憶えていますか?今年の重大ニュース「ヒッグス粒子の発見」

12月に入り、今年の重大(十大)ニュースがいろいろなところで取り上げられるようになってきましたが、今年7月のヒッグス粒子の発見がランクインしているのを見たことがありません。そんなニュースがあったこと自体忘れてる人が多いでしょう。

今年の科学分野では山中教授のiPS細胞(のノーベル賞受賞)が大きな話題でしたが、それに勝るとも劣らないニュースだと個人的には思います。しかしいかんせん、iPS細胞の分かりやすさに比べるとヒッグス粒子の方は恐ろしく難解で、専門の研究者以外、ちゃんと意味を理解できている人がほとんどいないと思うので、まあ仕方ない面もあるでしょう。万物に質量を生み出している粒子って何よ?

高校で習った陽子、中性子、電子あたりまでは素粒子モデルは非常にシンプルで、石頭でも理解できたのですが、それより先の微細構造に入ると、フェルミ粒子やボース粒子、クォークやレプトンといった聞き慣れない粒子が山ほど出てきて、もう頭がついていきません。

さて、日経サイエンス2013年1月号では「ヒッグス粒子の先へ」といったテーマで特集が組まれています。
最初の特集記事は、今まで物質の最小単位であると思われていたクォークや電子も、ひょっとすると更に内部に微細構造があるかもしれないというもの。そこで思い浮かんだのが、手塚治虫「火の鳥 未来編」の中でシーン。主人公が物質の微細構造に入り込んでいくと素粒子の中に生物のようなものが住んでいて、更にその細胞を構成する素粒子のようなものが存在するというように、この宇宙は無限の階層構造になっているといったシーンです。現実もそれに近い構造があるかもしれないと考えると、なんだかすごくワクワクしてきます。

特集記事の二つ目は、万有引力はこの宇宙どこにいっても普遍的に働く法則だと思われてきましたが、本当にそうなの?といった記事です。地球や月といった天体規模では恐ろしいほど正確に、重力の逆二乗則が成り立つことが実際に観測されていますが、逆に1mm程度の微少距離では、これがほとんど確認されていません。これは重力が他の力、つまり電磁気力や強い力、弱い力(いつも思うのですが、なんて安易なネーミングなんだ)に比べて極端に弱いからだそうです。意外ですね。我々が生活する上で、一番身近に感じるのが重力なのに、これが1mm程度の距離で観測されていないなんて。まあとにかく、重力は惑星や恒星等の天体規模に物質が集まらないと観測できないので、1mm程度では観測が非常に困難ということのようです。この1mm以下の距離で逆二乗則が破れているかもしれない、もし破れていれば、超弦理論でいうところの剰余次元(我々が認識できる3次元以外の次元)が確認できるかもしれない、ということです。何れにしろ、1mm程度の肉眼でも認識できる程度で万有引力の法則が破れているかもしれなくて、今まで誰もそれに気づかなくて観測すらされなかった、というのはまさに灯台下暗しです。



2012年8月25日土曜日

Androidプログラミング ArrayAdapter について

Androidプログラミンをやっていて、気づいた点のメモ。

配列データを ListView に表示する場合、一般的には配列から ArrayAdapter (またはそのサブクラス)インスタンスを作って、それを ListView に設定します。
例えば次のような配列があったとします。
String[] arrayData = {"apple", "banana", "grape", "Lemon"};
ArrayAdapter にはコンストラクタがいくつもあって、例えば上の配列から ArrayAdapter インスタンスを作るにも何通りかの方法があります。

方法1
ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(this, R.layout.rawdata, arrayData);
この方法はコンストラクタで配列を与えています。別の方法として以下の様なやり方もあります。

方法2
ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(this, R.layout.rowdata);
for (String str : arrayData) {
    adapter.add(str);
}

この方法はコンストラクタでは入れ物だけを作って、後から add() メソッドで配列データを追加していきます。

最初はどちらの方法もまったく同じだと思っていました。どちらかというとコードがすっきりする方法1をよく使っていました。しかしこの二つは大きな違いがあったのです。

何が違うかというと、方法1で作った ArrayAdapter は、引き渡した配列データの要素は内部的には List<T> のかたちで保存されているのに対し、方法2の場合 ArrayList<T> のかたちで保存されているのです。(型パラメータTは今回の場合 String)

この違い分かりますか?大きな違いは ArrayList<T> は要素を削除・追加出来るのに対し、List<T> はできないということです。このことにより、ArrayAdapter の remove() や clear() メソッドを呼び出すと、方法1のアダプタでは例外(UnsupportedOperationException)が発生します。方法2のアダプタでは正しく削除されます。

結局、内容がダイナミックに変化する ListView には方法2 を使えということのようです。反対に固定的で変化しない ListView はどちらを使っても良いのですが、変化しないことの安全性を確保するのであれば、方法1 を使うのが良いでしょう。

これ、結構重要な違いだと思うのですが、Javadocには何も書かれていません。ソースコードを追いかけて気がつきました。Android の Javadoc にはこういう重要なことが平気で書かれていないので、注意が必要です。