SwiftでOS XのCGContextを取得する

Swiftについて、知ってる本で読んだのレベルからさわったことがあるのレベルにそろそろ移行しなければと思い立ち、簡単なアプリを作ってみることにしました。

しかも、iOSではなくOS Xで。

XcodeでMac用アプリの新規プロジェクトを選ぶと作られるテンプレートは、AppDelegateクラス、ViewControllerクラスにStoryboard + Auto Layoutと、ほとんどiOSと一緒のものでした。これならiOSのノウハウが使えるに違いないと思いつつ、さらにカスタムビューを作ってdrawRectで円を描画してみようとしたら、これがまたどうやってSwiftでOS Xのグラフィックスコンテキストを取得するのか全然わからないという。

Stack Overflowやら英語圏の方のブログとかをさまよって色々と試すも、参考にしたコードはビルドエラーやらランタイムエラーやらが出て簡単には解決に至らず、諦めて一旦放置することに。

“SwiftでOS XのCGContextを取得する” の続きを読む

サッポロレスキューマップが1.1.661になります

先日ひっそりとリリースした拙作のサッポロレスキューマップですが、新しいバージョンが完成したので先ほどAppleのアプリ審査に提出しました。あと1〜2週間ほど経てば iTunes App Store から新バージョンをダウンロードできるのではないかと思います。ちなみに、現行バージョンのダウンロードは こちらからです。

アプリの紹介動画を、WordPressに設置してあるサポートブログに置こうと思ったら動画アップロードは有料の機能だったので、このサイトに置きます。ついでにHTML5の動画タグとかに挑戦してみました。

OS X YosemiteとiPhoneがあればQuickTime Playerを使って動画撮影は簡単にできるものの、そこからHTML5レディな動画に変換するのに、ffmpegをインストールしたり細かいパラメータを調整したりとか、けっこう面倒くさいですね。

ADTにAntが入ってない件

最新のEclipse ADTをダウンロードしてインストールしたら、Antが入っていなかった。そんなに使わないけど。

  1. Help から Install New Software… を選択
  2. Work with で Juno – http://download.eclipse.org/releases/juno を選択
  3. リストから General Purpose Tools を開く
  4. 子リストから Eclipse Plug-in Development Environment を選択
  5. NextそしてFinishとクリックしてインストール

これでAntでビルドできるようになりました。そんなに使わないけど。
めでたしめでたし。

staffがmacportsになっちゃってる件

OS X MavericksでMacPortsを使っているわけですが(homebrew? 聞こえないーアーアー)、ふと、ターミナルで`ls -l`を実行したら、ファイルのグループ名がstaffだったはずが全部macportsになっておりました。

ネットで探し回った結果、https://trac.macports.org/ticket/41039 辺りを読むと、どうやらグループIDが衝突しているのが原因っぽいです。

と言うわけでターミナルから、open “/System/Library/CoreServices/Directory Utility.app”でディレクトリユーティリティを開いて、その中のディレクトリエディタの”表示”で”Groups”を選択し”ノード”を”/Local/Default”を選択すると、macportsというエントリが見えるので選択します。管理ユーザーで認証した後、PrimaryGroupIDが20になっているのを502に書き換えて保存すると、少し間を置いてstaffの表示が復活しました。

めでたしめでたし。

NSMutableDictionaryもどき

値を登録したときの順番を維持してくれるNSMutableDictionaryもどきを作りました。
ソースコード一式はgithubに置いておきます。

Appleのドキュメントによると「NSDictionaryからサブクラスを作るのはよく考えろ、コンポジションで済むならそれにすべきだ。」と書かれていたのでNSMutableDictionaryから継承せずにNSMutableDictionaryにあったメソッドをそのままコピーしてくると言う暴挙に出ております。そのお陰で、NSMutableDictionaryとの互換性は最低限のものしかないです。

これは明らかに車輪の再発明ですね。

GHUnitで非同期とビューのテスト

iOS/Macのテスト用フレームワーク GHUnit を使って、非同期通信して得た情報をビューに設定するテストを書きたいなぁと思って調べてみると案外そんな部品は用意されていなかったので、フォークしてテストケース基盤のクラスを追加してみました。(ちなみにgithubでのリポジトリのフォークは始めてです)

追加したのは、 GHAsyncViewTestCase というクラス。
元からある GHAsyncTestCase クラスと GHViewTestCase クラスの両方の機能を合成したものです。

とりあえずそれっぽく動く物が出来上がったのでソースコード一式を github に置いておきます。フレームワークのビルドとテスト用アプリへの組込方法はオリジナルの GHUnit と同じです。

実際のテストの書き方はこの辺りを参考にしてください。
ビューの検査は GHAsyncVerifyView マクロを使います。非同期実行は prepare メソッド、notify メソッド、waitForStatus メソッドを使います。

NSURLConnectionと進捗監視

斯く斯く然々やんごとなき理由により、GCDのディスパッチキューに入れたブロックの中で、NSURLConnectionクラスの同期通信メソッド(sendSynchronousRequest:returningResponse:error:とか)を使ってしかもコンテンツダウンロードの進捗状況を監視する必要に迫られました。

素直に非同期通信のメソッドを使えばいいじゃないかという話もありますが、通信を含んだ前後延々と続く一連の処理が細切れに呼ばれると困るので…。と言うわけで試行錯誤した結果、とりあえずそれっぽく動く物が出来上がったのでソースコード一式を github に置いておきます。

使い方は、

URLConnection *connection = [[URLConnection alloc] init];
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *result = [connection sendSynchronousRequestWithProgressReport:request returningResponse:&response error:&error progressHandler:^BOOL(float progress) {
    return YES;
}];

な感じ。

全然関係ないですが、Xcode 5で作ったプロジェクトをダブルクリックして開こうとしたときに、Xcode 6 ベータ版を別にインストールしてあると、そのベータ版が優先的に起動するので困ります。