らじおぱ for iOS バージョン2.1.0リリース

in Ladiopa

iOSアプリらじおぱを更新しバージョン2.1.0としてリリースしました。 このリリースでの変更点は以下のとおりです。

  • iOS 8に対応するための内部的な変更を行いました。

らじおぱのアーカイブ機能が利用しているiOS 7バックグラウンドトランスファー機能はiOSに導入された機能の中でも非常に不安定なもので、この機能を呼び出しているがためにらじおぱが起動しなくなるなどの障害を起こしました。 この機能の問題と改善のために何度かAppleに働き掛けましたが、おそらくそれとは無関係に(^^;)iOS 8になる際にこの機能にも一応手が入り改定されたようです。 ということでらじおぱがiOS 8上で動く場合は一応改定された方の機能を呼び出すように対応しました。 それ以外の機能上の変更はありません。

ちなみにiOS 8.1まで待ったのはiOS 8.0時代の統合開発環境(Xcode)の出来が良くなく、それまでの特にiPadアプリをそれまで通りの形でビルドし仕上げることができなかったためです(LineアプリiPad版の表示切れとかまさにこの直撃を受けていましたね)。 iOS 8.1時代になっても完全になったとはいい難いですが開発環境の対応にはある程度見切りをつけて、アプリ側で回避する手をいくつか講じてリリースすることにしました。

今回のアプリ審査期間は9日間でした。 iOS、OS X新リリースがらみで混んでいるかもしれませんね。

ではでは〜。

Leave a Reply

*


らじおぱ for Android バージョン2.0.0リリース

in Ladiopa

有償Androidアプリらじおぱ for Androidを開発しバージョン2.0.0としてGoogle Playにリリースしました。 これはiOS版らじおぱバージョン2の仕様を元にAndroidアプリとしてスクラッチから開発したものです。 そしてkawauso.comとしては初のAndroidアプリとなります。

らじおぱ for Android

iOS版との違いが重要だと思いますのでその観点でポイントを列挙します。

  • 設定でプレイヤーのバッファーサイズを変更する機能は省きました。
  • お気に入りの共有機能は(以前から通知機能との兼ね合いが難しかったこともあり)省きました。
  • スワイプ動作による画面遷移は(Androidにはバックボタンがあること、スワイプジェスチャーの認識に難があったことにより)省きました。
  • お気に入りサウンドのファイル自体を入れ替える機能は採用せず、Androidシステムに登録されている通知サウンドを自由に選択できるようにしました。
  • iOSのAirDropに類する機能は省きました。
  • アーカイブが途中で終了してもその時点までのアーカイブは残るようになりました。
  • 内蔵プレイヤーがOgg Vorbisを再生できるようになりました。
  • 内蔵プレイヤーがAACおよびその派生フォーマットを再生できるか否かはデバイスに依存します。
  • 携帯電話網での再生ビットレート上限値(128kbps)の制限を(Androidは特に制約が無いようですので)はずしました。
  • 携帯電話網での自動アーカイブ抑制処理をはずしました。
基本的な目標としてiOS版の機能と使用感をなるべく再現したいというのがありましたが、それについては(ずいぶん苦労はしましたが)まずまず出来たのではないかと思います。

今回の開発でAndroid SDK(ソフトウェア開発キット)やGoogle PlayがiOSと比べてどのような点が優れていてどのような点が劣っているかいろいろと知ることができました。 これについてはまた機会を改めてエントリーを書ければと思います。

このソフトウェアの動作や仕様について、プログのコメントやメールにてぜひお知らせください。 ではでは。

Leave a Reply


らじおぱバージョン2.0.4リリース

in Ladiopa

もう一ヶ月前の話なんですがiOSアプリらじおぱを更新しバージョン2.0.4としてリリースしました。 このリリースでの変更点は以下のとおりです。

  • アーカイブファイルの表示を修正しました。

らじおぱのアーカイブ機能が利用しているiOS 7バックグラウンドトランスファー機能はまだ非公開の制限や動作仕様が多く、仕様リクエストは出しているものの広範な状況に対応する機能として改善されるためには少し時間がかかりそうです。

そしてそれがらじおぱ for Androidを作らせる直接の動機になったりしたんですが^^;。

Leave a Reply


Emacs入門 #2 WindowsとMac OS X

in Emacs

前回はGNU EmacsのMac OS X上でのインストール方法について書きました。 Emacsの設定の話に入る前にWindows上でのインストール方法についても書いておきましょう。

これもまたいろいろな方法があると思いますが、最近だとgnu packというパッケージを使うのが簡単だと思います。 現在の最新はemacs-24.2-20121208.exeとなっています。 早速ダウンロードして実行してみましょう。

\Users\kawauso\Downloads\emacs-24.2-20121208.exe

展開されたフォルダにあるEmacs起動プログラムを実行してみます。

\Users\kawauso\Downloads\emacs-24.2-20121208\bin\runemacs.exe
Screen Shot 2014-11-20 at 16.11.49

OKですね。

さらにLinux上でのインストール方法について書いてもよかったのですけれど、各ディストリビューション標準の方法を用いればLinuxユーザーにとっては特に難しい話はないと思いますので割愛します。

Emacsは日本語および日本語入力との長い戦いの歴史を持っていますが(^^;)ここまで紹介した方法でインストールしたものであれば特に意識する必要はないかなと思います。 ただしMacPorts版のデフォルトの設定では日本語が以下のように表示されることと思います。

Screen Shot 2014-11-21 at 08.10.07

これでも特に問題は無いのですが、日本語(いわゆる全角文字)が英数(いわゆる半角文字)の倍の幅にそろえられている方が都合がよい場合も多いでしょう。(ちなみにWindowsのgnu pack版の方はデフォルトでそろえられています。)

その設定を行うためにはEmacsのフォント設定についての少し難しい知識が必要になりますが、最も簡単に行うには以下の設定を行うことだと思っています。

  (set-fontset-font t 'japanese-jisx0213-1 (font-spec :family "Hiragino Kaku Gothic ProN"))
  (set-fontset-font t 'japanese-jisx0213-2 (font-spec :family "Hiragino Kaku Gothic ProN"))
  (set-fontset-font t 'katakana-jisx0201 (font-spec :family "Hiragino Kaku Gothic ProN"))
  (add-to-list 'face-font-rescale-alist '("Hiragino " . 1.2))

1行目と2行目でEmacsが用いるデフォルトの全角日本語フォントを、3行目で半角片仮名フォントを全てHiragino Kaku Gothic ProNに置き換えています。 4行目はその全角フォントの幅が英数フォントに対してちょうど2倍に当たるように調整しています。

この設定をして表示がどうなるか見てみましょう。

Screen Shot 2014-11-21 at 08.26.21

無事幅がそろいましたね。

でもちょっと待ってください、どうやって設定を反映させたのでしょうか? 次回はやっとEmacsの設定の話になります(^^)。

Leave a Reply


Can I Swift? その4 – 変わらないプロパティ

in Swift

別のテーマに行こうと思いましたがもう少しだけ変わらない変数をテーマにしたいと思います。

変わらないインスタンス変数 in Objective-C

ローカル変数ほど頻度は高くはありませんが、インスタンス変数も初期値を設定した後インスタンスが消滅するまで値が変わらない場合があります。 ではObjective-Cのインスタンス変数にconstをつけるとどうなるでしょうか。

@implementation Book {
    NSString * const title = @"Default Title";
}

Parse Issue: Expected ';' at end of declaration list 値を設定することができません。 Objective-Cでは変わらないインスタンス変数は実現できないようです。 どうしても実現したい場合はそれに近い方法として@propertyで宣言しreadonly属性をつけるなどとして工夫するしかなさそうです。

変わらないプロパティ in Swift

Swiftのletではどうでしょうか。

class Book {
    let title:String = "Default Title"
}

インスタンス変数に相当するものはSwiftではプロパティとなりますがletをつけても値を設定することが可能です。さらに

class Book {
    let title:String

    init() {
        self.title = "Default Title"
    }
}

と値をinit()(イニシャライザ、初期化子)の中で設定することも可能です。 Swiftのletの方が遥かに柔軟に値を設定することができるようですね。

依存関係をともなう初期化

Swiftで依存関係をともなうような複雑な初期化でもプロパティにletをつけることが可能かどうか。具体的なコードで見てみましょう。

class Author {
    let bestsellerTitle:String = "Bestseller Title"
    let book:Book

    init() {
        self.book = Book(author:self)
    }
}

class Book {
    let title:String = "Default Title"

    init(author:Author) {
        self.title = author.bestsellerTitle
    }
}

クラスAuthorはクラスBookのインスタンスをプロパティとして保持し、init()の中で値を設定しています。 一方クラスBookも自分を生成したクラスAuthorのインスタンスをinit()の引数で受け取っています。

これをコンパイルしようとするとクラスAuthorinit()でエラーになります。 Swift Compiler Error: Variable 'self.book' used before being initialized init()self(インスタンス自身)を参照しているのですが、プロパティbookがまだ初期化されていないためエラーになったようです。

この初期化問題の解決に役立ちそうな記述がドキュメントThe Swift Programming LanguageInitializationの節Optional Property Typesにありました。

SwiftにはOptional Type(オプショナルな型)という非常に重要な考え方があります。 オプショナルな型は通常の型と違い、値がnilをとることを許します。 逆にいえばSwiftでは通常の型で宣言した場合、値がnilをとることを許していません。 これはObjective-Cでは無かった区別で、プログラムがより安全になる反面、その選択には注意が必要になります。 表記方法は簡単で通常の型に対してその後ろに?をつければ(対応する)オプショナルな型になります。

オプショナルな型を使って先ほどのコードを書き直してみましょう。

class Author {
    let bestsellerTitle:String = "Bestseller Title"
    let book:Book?

    init() {
        self.book = Book(author:self)
    }
}

class Book {
    let title:String = "Default Title"

    init(author:Author) {
        self.title = author.bestsellerTitle
    }
}

書き直すといってもlet book:Booklet book:Book?にしただけですが、これによりクラスAuthorinit()でのコンパイルエラーが無くなりました。 何もしなくてもプロパティbookにはnilが設定されるようになったからです。

しかしこのままだと少し不便なことがあります。 プロパティbookをオプショナルな型で宣言してしまったがために、その後bookを参照する度に値がnilかどうか条件判定するはめになります。 bookletがついていてかつinit()で値を設定していますのでnilにはなることは無く、条件判定は全く不要です。

Swiftはこのように文法上はオプショナルな型であることを必要とするものの、処理上はオプショナルな型であることを不要とする場合、?の代わりに!を用いてオプショナルな型を宣言することができます(この型は無条件で開封されるオプショナルな型(Implicitly Unwrapped Optional Type)と呼ぶようです)。 これでわずらわしい条件判定を意識しないで参照できるようになります。 念のため再度書き直してみましょう。

class Author {
    let bestsellerTitle:String = "Bestseller Title"
    let book:Book!

    init() {
        self.book = Book(author:self)
    }
}

class Book {
    let title:String = "Default Title"

    init(author:Author) {
        self.title = author.bestsellerTitle
    }
}

これでOKです。

変わらない変数の話は終わりにして次回はやっと別のテーマに移ろうと思います。 ではでは。

Leave a Reply