2012年3月23日金曜日

CGRect、CGSize、CGPointについて

どうも、俺@絶賛開発中です。
今日は(も)Objective-Cについてです。最近はアプリ(iOS/Android)関連の仕事が多いですね。

Objective-Cで開発してるとよくCGRectやCGPoint、CGSizeなどといったクラス(構造体)を使います。
これについてメモメモ。
ゲームアプリなど座標を細かく管理する開発では必須の知識です。

■CGRect
オブジェクトの座標とサイズを管理します。
// 座標(100, 100)の位置に横50 x 縦50のサイズを表すCGRect
CGRect rect = CGRectMake(100, 100, 50, 50);


■CGPoint
オブジェクトの座標を管理します。
//座標(200, 100)の位置を表すCGPoint
CGPoint point = CGPointMake(200, 100);


■CGSize
オブジェクトのサイズを管理します。
// 横200 x 縦100のサイズを表すCGSize
CGSize size = CGSizeMake(200, 100);


またこれらをコンソール上にログ出力する場合は、

CGRect rect = CGRectMake(0, 0, 30, 30);
NSLog(@"%@", rect);
のようにしても出力されません。

座標情報やサイズをログ出力させるには、
NSStringFromCGRect()
NSStringFromCGPoint()
NSStringFromCGSize()
これらを使います。

CGPoint point = CGPointMake(100, 200);
NSLog(@"%@", NSStringFromPoint(point));


以上でぇぇぇえぇす。

2012年3月13日火曜日

NSStringのstringByAppendingPathComponent注意

どうも、俺@仕事中です。
Objective-Cでゲームとか開発してると、ユーザのちょっとしたデータをファイルに保存したりしますよね。

その時のコードでエラー起こしてしまったので、対処法をメモ。

間違いソースがこれです。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex: 0];
self.filePath = [directory stringByAppendingPathComponent: @"hoge.plist"];
self.filePathは保存するファイルのパスを格納するNSStringなクラス変数です。

これだとstringByAppendingPathComponentメソッドは結果をautoreleaseしている(と思う)ので、
ココの処理を抜けた時点でself.filePathはリリースされてしまう(はず)。
別のメソッドでself.filePathを使おうとしても、リリースされたオブジェクトにアクセスしようとしてEXC_BAD_ACCESSになっちゃう。


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *directory = [paths objectAtIndex: 0];
self.filePath = [[NSString alloc] initWithString: [directory stringByAppendingPathComponent: @"hoge.plist"]];
にしてやれば、self.filePathを自身のdeallocメソッド内でreleaseすることが出来る!


以上でぇぇえぇす。

2012年3月6日火曜日

Autoingestion.classを使うとjavax.net.ssl.SSLHandshakeExceptionが出ちゃう

どうも、俺@残業中です。

iPhoneアプリの販売データを取得するため、AppleはAutoingestion.classなるものを用意してくれてます。
iTunesConnectのSales and TrendsにあるデータをTSVデータとしてDLできます。
わざわざHTMLをスクレイピングしなくて良いですね!
ドキュメントはココ
とても分かりやすい参考サイトは iTunesConnectからアプリダウンロード数レポートを自動取得する方法 - zaru blog がとても分かりやすいです!

ところが、僕の開発環境だと、このプログラムを実行させるとタイトルの通り

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
になっちゃいます。ほとんどの人は関係ないと思いますが。。
今日はその解決法をばめもめも。

javaのkeytoolというコマンドを使って、証明書をインポートすれば良いそうです。
あまりjavaには明るくない俺なりに調べてみたのですが、
どうやら[SSLHandshakeException]信頼できない証明書のサイトと無理矢理接続する方法にあるように、
Javaで信頼できないSSL証明書を使ってHTTPコネクションを貼ろうとした場合に出る例外のようです。
AppleからのAutoingestion.classがどういう実装になっているのか調べてみれば分かるかもしれませんが、
とりあえず今回は解決優先ということで、「Sales And Trends」データを取得しにいくサーバへSSL通信するときの証明書が怪しいのでは?という仮説を立てて対応することにしました。

つまり、接続先の証明書をkeytoolを使ってインポートすれば良いのです。
証明書はhttps://itunesconnect.apple.comのものだと思います。
つまり、Autoingestion.classはitunesconnect.apple.comへ接続しにいっているはず。
(多分。。。tcpdumpとかでパケットを監視してないので嘘だったらごめんなさい。今度調べます。)

なので、FireFox(僕Mac版FireFox使ってます)とかで上記URLを叩き、
アドレスバーの左側(緑色になっているはず)をクリック>詳細を表示>「セキュリティ」タブ>証明書を表示...>「詳細」タブ>書き出す...
の操作を行えば証明書を取得できます。

この証明書ファイルを、開発サーバのjavaへ組み込みます。

$ keytool -import -keystore /usr/local/jdk1.6.0_16/jre/lib/security/cacerts -storepass changeit -file /path/to/証明書ファイル
これでOK。
-keystore は俺の環境での値を書きましたが、環境に合わせて書き換えて下さい。
-storepass はデフォルトでchangeitです。
-file は先程FireFoxから取得した証明書ファイルへのパスです。
何とこれでサーバのjava(/path/to/jdk/jre/lib/security/cacerts)に証明書データがインポートされ、
「信頼できる証明書」として扱われます。
オレオレ証明書を作成した場合などで使えますね!

keytoolについてはJava/keytool - 備忘録に詳しく書かれています。


これでAutoingestion.classを使えば、悩み解決されます!

$ java -cp . Autoingestion username password vendorid Sales Daily Summary `date +%Y%m%d -d "2 days ago"`

.gzファイルがDLされます!

以上でぇぇぇえぇす。

2012年3月3日土曜日

無料iPhoneアプリ「なむぞう」リリースしました!

どうも、俺@スノボから帰ってきました。
今回はちょっと技術ネタから外れますが。。。

さてさて、やっとiPhoneアプリ「なむぞう」をリリースすることができました^^

http://itunes.apple.com/jp/app/namuzou/id499190444?mt=8







デザインも自分で担当したため、オシャレなUIとまではなりませんでしたが
配色サンプルを色々試して何回も試行錯誤しながらUI全体の色イメージをつくっていきました。

あと、どうでも良いですが
アイコン画像にいるイモムシのようなやつが「なむぞう」というキャラクターという設定です。


リリース直後にGameCenterにつながらない不具合が見つかったり、その他色々。。。。
初めてのアプリ開発で色々戸惑いも多かったですが、もう大丈夫です!!


紹介動画です^^
http://www.youtube.com/watch?v=yxUu9crJtas
動画編集ソフトやYoutubeの機能を駆使してつくりました!


Objective-Cについて、色々とスキルを身につけられましたが
それと同様にドローソフトや動画編集ソフトの使い方に詳しくなれました。



以上でぇぇぇぇす。