Playにリリースしました。これはiOS版らじおぱバージョン2の仕様を元にAndroidアプリとしてスクラッチから開発したものです。kawauso.comとしては初のAndroidアプリとなります。AndroidiOS版との違いが重要だと思いますのでその観点でポイントを列挙します。設定でプレイヤーのバッファーサイズを変更する機能は省きました。お気に入りの共有機能は(以前から通知機能との兼ね合いが難しかったこともあり)省きました。スワイプ動作による画面遷移は(Androidにはバックボタンがあること、スワイプジェスチャーの認識に難があったことにより)省きました。お気に入りサウンドのファイル自体を入れ替える機能は採用せず、Androidシステムに登録されている通知サウンドを自由に選択できるようにしました。iOSのAirDropに類する機能は省きました。アーカイブが途中で終了してもその時点までのアーカイブは残るようになりました。Vorbisを再生できるようになりました。内蔵プレイヤーがAACおよびその派生フォーマットを再生できるか否かはデバイスに依存します。携帯電話網での再生ビットレート上限値(128kbps)の制限を(Androidは特に制約が無いようですので)はずしました。携帯電話網での自動アーカイブ抑制処理をはずしました。基本的な目標としてiOS版の機能と使用感をなるべく再現したいというのがありましたが、それについては(ずいぶん苦労はしましたが)まずまず出来たのではないかと思います。PlayがiOSと比べてどのような点が優れていてどのような点が劣っているかいろいろと知ることができました。これについてはまた機会を改めてエントリーを書ければと思います。このソフトウェアの動作や仕様について、プログのコメントやメールにてぜひお知らせください。kawausoもう一ヶ月前の話なんですがiOSアプリらじおぱを更新しバージョン2.0.4としてリリースしました。このリリースでの変更点は以下のとおりです。アーカイブファイルの表示を修正しました。7バックグラウンドトランスファー機能はまだ非公開の制限や動作仕様が多く、仕様リクエストは出しているものの広範な状況に対応する機能として改善されるためには少し時間がかかりそうです。Androidを作らせる直接の動機になったりしたんですが^^;。X上でのインストール方法について書きました。Emacsの設定の話に入る前にWindows上でのインストール方法についても書いておきましょう。packというパッケージを使うのが簡単だと思います。現在の最新はemacs-24.2-20121208.exeとなっています。ダウンロードして実行してみましょう。\Users\kawauso\Downloads\emacs-24.2-20121208.exe展開されたフォルダにあるEmacs起動プログラムを実行してみます。\Users\kawauso\Downloads\emacs-24.2-20121208\bin\runemacs.exeOKですね。Linux上でのインストール方法について書いてもよかったのですけれど、各ディストリビューション標準の方法を用いればLinuxユーザーにとっては特に難しい話はないと思いますので割愛します。Emacsは日本語および日本語入力との長い戦いの歴史を持っていますが(^^;)ここまで紹介した方法でインストールしたものであれば特に意識する必要はないかなと思います。MacPorts版のデフォルトの設定では日本語が以下のように表示されることと思います。これでも特に問題は無いのですが、日本語(いわゆる全角文字)が英数(いわゆる半角文字)の倍の幅にそろえられている方が都合がよい場合も多いでしょう。pack版の方はデフォルトでそろえられています。)その設定を行うためにはEmacsのフォント設定についての少し難しい知識が必要になりますが、最も簡単に行うには以下の設定を行うことだと思っています。ProNに置き換えています。4行目はその全角フォントの幅が英数フォントに対してちょうど2倍に当たるように調整しています。この設定をして表示がどうなるか見てみましょう。無事幅がそろいましたね。次回はやっとEmacsの設定の話になります(^^)。kawauso別のテーマに行こうと思いましたがもう少しだけ変わらない変数をテーマにしたいと思います。Objective-Cローカル変数ほど頻度は高くはありませんが、インスタンス変数も初期値を設定した後インスタンスが消滅するまで値が変わらない場合があります。Objective-Cのインスタンス変数にconstをつけるとどうなるでしょうか。値を設定することができません。Objective-Cでは変わらないインスタンス変数は実現できないようです。しても実現したい場合はそれに近い方法として@propertyで宣言しreadonly属性をつけるなどとして工夫するしかなさそうです。SwiftSwiftのletではどうでしょうか。Title"}インスタンス変数に相当するものはSwiftではプロパティとなりますがletをつけても値を設定することが可能です。}}と値をinit()(イニシャライザ、初期化子)の中で設定することも可能です。Swiftのletの方が遥かに柔軟に値を設定することができるようですね。依存関係をともなう初期化Swiftで依存関係をともなうような複雑な初期化でもプロパティにletをつけることが可能かどうか。具体的なコードで見てみましょう。}}クラスAuthorはクラスBookのインスタンスをプロパティとして保持し、init()の中で値を設定しています。クラスBookも自分を生成したクラスAuthorのインスタンスをinit()の引数で受け取っています。これをコンパイルしようとするとクラスAuthorのinit()でエラーになります。init()でself(インスタンス自身)を参照しているのですが、プロパティbookがまだ初期化されていないためエラーになったようです。Typesにありました。Type(オプショナルな型)という非常に重要な考え方があります。オプショナルな型は通常の型と違い、値がnilをとることを許します。逆にいえばSwiftでは通常の型で宣言した場合、値がnilをとることを許していません。これはObjective-Cでは無かった区別で、プログラムがより安全になる反面、その選択には注意が必要になります。表記方法は簡単で通常の型に対してその後ろに?をつければ(対応する)オプショナルな型になります。オプショナルな型を使って先ほどのコードを書き直してみましょう。book:Book?にしただけですが、これによりクラスAuthorのinit()でのコンパイルエラーが無くなりました。何もしなくてもプロパティbookにはnilが設定されるようになったからです。このままだと少し不便なことがあります。プロパティbookをオプショナルな型で宣言してしまったがために、その後bookを参照する度に値がnilかどうか条件判定するはめになります。bookはletがついていてかつinit()で値を設定していますのでnilにはなることは無く、条件判定は全く不要です。Type)と呼ぶようです)。これでわずらわしい条件判定を意識しないで参照できるようになります。念のため再度書き直してみましょう。変わらない変数の話は終わりにして次回はやっと別のテーマに移ろうと思います。kawausoObjective-Cはconstをつけることによって、Swiftはletによって変わらない変数を表現できることがわかりました。変わらない変数は変えることができないが故に1回で値を設定しなければならないという大きな制約があります。その制約が具体的にどのようなものかコードで見てみましょう。Objective-C通常のローカル変数を使った以下のようなコードがあったとします。Title"に設定し直しています。このような設定処理は実際のプログラムによく現れますが、もし変数titleの値がその後変更されるものでなければ、変わらない変数として宣言して処理を行いたいところです。書き直してみましょう。Title");一時変数を別に用意し、三項演算子(?)を用いることによってなんとか変数titleに1回で値を設定することができました。実はこのような設定処理は気のきいたプログラミング言語においては例えば以下のように簡潔に記述することが可能です。Title")を返すタイプのプログラミング言語の場合です。残念ながらCを親に持つObjective-Cではこの記述はできません。Swift新言語Swiftでは気のきいた記述が可能になっているかどうか早速テストしてみましょう。残念ながらSwiftでもOR演算子は論理値を返し、Objective-Cから変わりないようです。LanguageのInitializationの章にこのような例が載っています。}()値を生成するための複雑な処理をクロージャで記述し、即実行することで値を取得し設定しています。クロージャはこのような使い方もできて便利ですね。これが書ければSwiftで値を設定するのに困ることはなさそうです。4以降使えるようになりました。Blocksを用いてObjective-C版を書き直してみましょう。}();見事に値を設定することができました。この程度の複雑さですと大した恩恵はありませんが、処理が複雑になればなるほどBlocksを利用した値の設定の手法は有用になっていくでしょう。変わらない変数についての話はこれぐらいとして、次回はまた別のテーマでSwiftを見ていきたいと思います。Commonsこのブログはクリエイティブ・コモンズでライセンスされています。