Hatena::Groupiphone-dev

iOS プログラミングメモ

2009-01-29 (Thu)

ネットワークへの接続チェックとか 23:23  ネットワークへの接続チェックとか - iOS プログラミングメモ を含むブックマーク

ネットワークと連携するアプリの場合は、ネットにつながらない時の事を考えたり、ネットワークエラーがあった場合にゴミが残らないようにしたり、色々配慮しないといけない点があります。

多くの場合は、まあ繋がらない時に警告出して終わりって感じですが、例えばずっと接続したままのアプリとか、状態を監視して処理してるような場合、実機テストが超絶面倒くさいです。

cqa02303 の中の人が アルミホイルを使うハック を勧めてましたけど、アルミホイルに入れると画面が見えない!!?てか、うちにあるアルミホイル巻いてちょこっと試してみたけど、うまくいきませんでした。残骸のアルミホイルが物悲しい雰囲気を醸し出しています。

というわけで、誰か、本体を振ったら Wifi のオンオフをトグルしてくれるようなライブラリを作ってください。

daoki2daoki22009/01/30 10:33電子レンジをつけるというのはどうでしょうか?
うちだと電子レンジをつけるとよく無線LANが切れるので、この手が使えるのではないかと思ってるのですが、まだ試したことはありません...

子豚子豚2009/01/30 16:36JBしていて、なおかつテストしているアプリでステータスバーが表示されているなら、
SBSettingsと言うアプリが有ります。
もしくはルーターの電源を落としてしまうのも手かもしれません;P

SkyBookのバージョンアップご苦労様です。
〓、々、のルビ配分の改善、確認しました。一段と美しくなりましたね。
今回気がついたのは「――」が漢字扱いになっており、ルビが振られている。
例)「――美≪うつく≫しく」だと「――美」に「うつく」とルビ

あと、今回のバージョンから、タップでページ遷移するとスクロールが
完了の3・4ピクセル前で止まり、数百ミリ秒後にカクッと完了する動きが、
4ページに一回くらいの頻度で見受けられます。
2chでも指摘がありましたので、環境や作品に依存した物では無い模様です。

ちびちび報告して、何だか鬱陶しいやつが粘着してやがる…って感じで済みませんw
iPhone用青空リーダーでは、まだどこもやっていない
「本文よりルビが長い場合、本文の文字間を開ける」と言う要望は、胸にしまっておきます;P

obysobys2009/01/30 16:40「エアプレーンモード」はどうでしょう?

ktakayamaktakayama2009/01/30 17:40> daoki2 さん
トラックバックでももらいましたが、電子レンジに突っ込むってのは良いかもしれないですね。
うちの電子レンジは汚すぎて、大事な iPhone さんを入れる気にはなりませんが…w。

> 子豚さん
何度もすみませんです。
タップ操作の件は、解決したものが申請済みなのでお待ちください。
手違いで不具合ありのまま出荷されてしまいました。
― の件了解です。
鬱陶しいだなんてとんでもない。
細かい問題の報告は、基本的にまるで来ないので、非常に助かっております。

SBSettings はなかなか良さそうですね。
開発用 touch で試してみたいと思います。

> obys さん
アプリを起動中にネットワークの状態を変えてテストしたいんです。

ktakayamaktakayama2009/01/30 17:47本文の文字間を開けるのは、実は昨日くらいに文庫を読んでたら見かけて「お」とか思いましたけど、処理のルール作るのが難しそうな感じですねー。
半角文字列の幅はもうちょっと詰めたいので、その辺りとからめて考えてみます。

子豚子豚2009/01/30 19:32助かるなどと言っていただけると、痛み入る限りです。
すでにお考えでもありましょうが、2倍踊り字対応も最近の流行ですね。
カスタムフォントにその文字がない場合、スペースになってしまう問題を
新たに抱える事になってしまいますが。
カスタムフォントにない文字はIPA明朝で補填、何てやったら、メモリーが大変な事になるんでしょうね。
何はともあれ、日々のブラッシュアップ、細やかなユーザーサポートには感謝の念が尽きません。

ktakayamaktakayama2009/01/30 23:49くの字点に関しては、申請中のバージョンで対応してます。
文字の補填は確かにメモリ適に厳しいですねー。
サイズをしぼったIPA明朝が作れれば楽なんですが。

子豚子豚2009/02/01 14:41すでに実装済みとは、流石です。
確かIPA明朝はファイル自体を改変した使用を認めていなかった気がします。
そうすると、補填候補文字だけのフォントを一から作らなきゃならないですね。
個人的に作成したフォントファイルが有りますが、使いますか?
実装の手間と需要のバランスが、かなりびみょーーなネタなんで後回しが吉ですがw

ktakayamaktakayama2009/02/02 12:32規約を見た感じだと、文字の改変ってわけじゃないから、大丈夫なような気もしてきますけど、どうなんでしょうね。聞いてみようと思います。

> 個人的に作成したフォントファイル
これってどんなファイルですか?
IPA の補填候補だけ抜き出したものでしたら、興味アリです。

子豚子豚2009/02/02 18:05> 個人的に作成したフォントファイル
SkyBookで普段自分が使っている教科書体に、くの字点が入っていなかったので作ったアウトラインフォントです。(ビットマップフォント非内蔵)
教科書体と明朝体の中間のような書体で、アンカーポイントは少なめに作ってあります。
作成済みは、繰り返し記号、しめ、くの字点3文字、ゆすり点、マス、いおり点、です。

IPA明朝から抜き出すだけなら5分くらいで作れちゃいますよ。
Unicode 0x3016(もしくは0x3000)~0x303D あたりで作りましょうか。

ktakayamaktakayama2009/02/03 15:12おお、ほんとうですか。僕はその辺ぜんぜんわからないので非常に助かります。
IPA さんから補填形式の利用のオーケーが出たらお願いさせて頂くかもしれません。
その時は、宜しくお願いします。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090129

2009-01-28 (Wed)

iPhone アプリ開発グループの RSS 20:13  iPhone アプリ開発グループの RSS - iOS プログラミングメモ を含むブックマーク

はてなグループの日記一覧の RSS 配信ははっきり言ってうんこで使い物にならないから使って無かったんだけど、otsune さんが素晴らしい事を書いてるのを発見してしまって情弱の僕は涙が止まりませんでした。

iPhone アプリ開発グループ用の RSS はコレ。

ブランチで開発している意味 22:37  ブランチで開発している意味 - iOS プログラミングメモ を含むブックマーク

ブランチをメインの作業環境にするとは珍しい

http://b.hatena.ne.jp/lizy/20090128#bookmark-11810540

開発環境 の件。

言われてみれば珍しいかも…と思って考えてみたら、自分の場合は trunk を「アップルへ申請中の安定版」と位置付けているからでした。

どうも、場合によってブランチを切ったりきらなかったりっていう状況が苦手なので、申請中に開発を進めたい時やリジェクトの事を考えて敢えてこうしてあります。

実を言うと、のらりくらりと開発してるプロダクトに関しては、trunk のみで作業してたりもしますけど。

いや、珍しくないぞ

そう言えばと思って trac 見てみたら、ここもブランチがメイン開発エリアですよ。珍しくないっすよ。きっと。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090128

2009-01-26 (Mon)

SMSAlert Ready for ...? 15:58  SMSAlert Ready for ...? - iOS プログラミングメモ を含むブックマーク

SMS の着信を着信音とバイブレーションで通知してくれる iPhone 用アプリケーション、SMSAlert のソースコードを公開します。MIT ライセンスです。

バックグラウンドで動作させる事が出来るんだったら、そのようにしてから公開しようと思ってたんですが、良くわからんので諦めました。ぶっちゃけ、ろくに調べてませんけどね。

アプリを起動しっ放しじゃないと着信通知してくれないので、実用性は微妙です。SBankNotify を使いたいけど、JB したくないって人に需要があるかもしれないので作ったと言うよりは、リジェクト実験って側面もあったりなかったり。

なお、画像と音声に関しては、自由なライセンスじゃあないので、ご注意ください。

AppStore で配信されないの?

SMSAlert ではプライベートフレームワークを利用しておりまして、フレームワーク名を名指しして使っちゃ駄目だよとリジェクトされました。年末から申請してて、すでに二回拒否されたので諦めました。

リジェクトについて詳しくは、Reject Database の方に書いておきます。

永久リジェクト

あんまり関係ないお話しですが、今回のアプリは AppStore で配信するのはもう諦めてるんですけど、自分のアプリ一覧のページに表示されててなんか虚しいから消したいです。

f:id:ktakayama:20090126155220p:image

全然関係ない新しいアプリを作って、申請した後、バージョンアップとかで徐々にこっそり名前を変えたりすればいいんですかね?

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090126

2009-01-24 (Sat)

宣伝 01:04  宣伝 - iOS プログラミングメモ を含むブックマーク

入門Trac with Subversion―Linux/Windows対応

入門Trac with Subversion―Linux/Windows対応

iPhone アプリケーション開発の進め方 - 私の場合 - 01:12  iPhone アプリケーション開発の進め方 - 私の場合 - - iOS プログラミングメモ を含むブックマーク

唐突にわけわからん宣伝を始めてなんじゃいって感じですが、なんとなく自分の開発環境とか進め方とか晒してみようと思ったので、その関係です。

さて、バリバリ開発してる人も、これから開発する人も、他人がどんな環境で開発しているのかは非常に気になると思います。自分の環境はかなり特殊な部類に入るでしょうが、Trac や SCM の事なんかは万人に共通するネタなので、参考になる部分もあるかと。

開発マシン

なんか PC がまじってますが、こいつは重要なマシンです。

まず Flexscan がなかなか便利でして、デジタルとアナログの両方の端子を持っています。Macmini にデジタル端子をさして、Thinkpad にはアナログの端子をつないでます。こうすると、ディスプレイの下部にあるボタン一発で切り替えが出来ます。

ThinkpadMacminisynergy を使ってキーボードとマウスを共有させてます。これでディスプレイ、キーボード、マウスが共有できて、狭い自分の部屋ですがスペースがかなり節約出来てます。

Thinkpad 関係なくね?って思うでしょうがここ大事なんです。後述します。

開発に使ってるソフトウェア

XCode とか当たり前のものは除いて、俺的三種の神器。

はい、見て分かる通り、vim でコード書いてます。ていうかマジで、vim 以外のテキストエディタを使う気はまるで起きないです。では XCode で何をやるかというと、もっぱら「ビルドと実行」ですね。ファイルの追加や削除の時も XCode を使います。コンソールから出来たら非常に楽なんですが、どうもそういう事は難しいみたいですね。

外部エディタを使えば GVim もいけますが、常時コマンドライン+vim 状態なので、GUI が絡む環境に移行出来ません。後述する特殊なエディタ環境なのも影響してるので、GVim は無しの方向で。

お次は Subversion です。最近は git とか流行りですが、Trac との関係もあってまだ Subversion がメインですね。SVK も使いながらって感じです。構成管理ツールはプログラミングには絶対必須なんで、使ってなかったらヤバいっす。

最後は Trac です。Wiki での周辺情報の管理や、チケットによる TODO、マイルストーンの管理に使ってます。無かったら多分ものすごく効率が低下する。

vim についてもっと詳しく

単なるテキストエディタなんで、好きなの使えばいいと思います。XCode のエディタは補完が便利そうなので、あえて vim を使う必要もないかと。

Subversion についてもっと詳しく

いわゆるバージョン管理をするためのツールです。コードの変更履歴がコメントと共に全て残るので、いつでも過去の状態に戻れますし、どんな変更をしてきたのかがすぐにわかります。

XCode は標準で Subversion と連携出来るので、使わないのはもったいないでしょう。僕はコマンドラインで生活してるので、XCode の連携機能は使って無いですが。

Trac についてもっと詳しく

Wiki, Subversion のデータビューワ, チケットタイプのやる事管理システム。この三つが合体したプロジェクト管理ツールです。プロジェクトの効果的な運用には欠かせません。バージョン番号や TODO をきっちり管理したい人におすすめです。

TODO 管理をちゃんとやらないで、その場しのぎで適当なバグ修正とかしてると死ねます。

MacminiThinkpad でなんちゃってデュアルディスプレイ

vim を使ってるって書いたからピンときた人もいると思いますが、コマンドライン操作をするのはもっぱら Thinkpad の画面上です。Thinkpad から SSH 経由で Macmini に接続し、その上でコードを書いてます。つまり Thinkpad の画面はエディタで、Macmini の画面は XCode や Interface Builder 、シミュレータなんかを表示させるために使うわけですね。

こんな感じ。恥ずかしいので、カットしまくりですが。

f:id:ktakayama:20090124225828j:image

左下に Macmini が置いてあります。その上にちっこいモニタがありますけど、これテレビです。7インチのテレビ。あんま使ってないけど。

MacBook 買えばいいじゃん

MacBook 買ってデュアルディスプレイでも、同じ事がより簡潔に出来ます。

今回は Macmini の方が安かったっていうのもあるんですが…。メインは Linux を搭載した Thinkpad なんで、常用してるソフトウェアの使い勝手的になかなか移行出来ないです。Mac に移行出来たら楽だとは思ってるんですがね。トラックポイントもキーボードも、なかなか捨てられませんし。

開発の進め方

進め方っていうか、ソースコードの管理手法に関する話がメインなんですけどね。

Subversion を使っているので、伝統的な trunk, branches, tags で管理しています。ざっと説明すると、通常の開発はブランチで進めます。アップルに送信する準備が出来たら trunk へマージ、ビルドして提出します。申請が通ったら、タグを切る。単純なもんです。

ブランチのルール

ブランチのルールよりも前に、バージョン番号の付け方のルールですが、「0.0.0」みたいな三桁?にしていて、便宜上「A.B.C」って呼びますが、「C」がバグ修正とかのちっこい修正、「B」が機能追加とかのちょっと大きめの変更って感じで分けてます。まだ「A」が変わるようなバージョンアップはしてませんけど、多分「B」が 9 までいったら次が 2.0.0 なのかなっと。

で、ブランチはどう運用してるのかっていうと、「B」に相当するバージョン番号毎に分けてます。基本的には、一本道で開発していくわけで、過去に戻ったり過去から分岐したるする事はないので、分ける必要もないですが、なんとなくこうしてます。

実際の名前はこんな感じです。

  • branches/1.0.x
  • branches/1.2.x
詳細な進行

開発開始から、何度か申請を行なう手順。

  • 初期プロジェクトファイルを trunk にインポート
  • trunk を branches/1.0.x にコピー
  • branches/1.0.x で開発を進める
  • 完成したら trunk へマージ
  • trunk の中身をビルドして提出
  • branches/1.0.x で次のバージョンの開発を進める
  • 申請が通った!
  • trunk を tags/1.0.0 にコピー
  • branches/1.0.x が完成したので trunk へマージ
  • trunk の中身をビルドして提出
  • trunk を branches/1.1.x にコピー
  • branches/1.1.x で次のバージョンの開発を進める
  • リジェクト (´Д`)
  • branches/1.0.x でリジェクトの対応、trunk へマージ
  • 再申請
  • 申請が通った!
  • trunk を tags/1.0.1 にコピー
  • trunk を branches/1.1.x へマージ
  • branches/1.1.x で次のバージョンの開発を進める

大体こんな感じでしょうかね。リジェクトがあった時に、1.1.x の開発が進んでればそっちで対応しちゃう事もあります。

Trac の活用

全てのアプリケーションは同一のリポジトリで管理されているので、必然的に Trac でも同一の環境で管理する事になります。

カスタムチケットに「アプリケーション」って項目を追加して、そこでチケットの分類をしています。例えばこんな感じ。

[ticket-custom]
application = select
application.label = アプリケーション
application.options = -|SkyBook|HogeFuga|NewApp

ロードマップはバージョン番号毎に作成します。他のアプリも混在している状態なので、例えば「SkyBook1.3.0」みたいにアプリケーションの名前も入れています。

ある程度先の予定が決まっている場合は、「SkyBook1.6.0」「SkyBook1.7.0」みたいなマイルストーンをいっぱい作っておいて、そこに作業内容のチケットを登録しておきます。こうしておけばやり忘れも防げるし、モチベーションアップにもつながります。

Trac はほぼチケットのために使用しています。たまに変更履歴を順番に眺めたい時に、リポジトリブラウザを使います。

総評

まとめてみて思ったけど、思ったほど特殊な事はやってないっすね。でも、iPhone の開発関係のブログなんかをチラホラみてると、それほど管理しないでやってる人が多そうな気がしたんで書いてみました。構成管理ツールくらいは使おうぜ。

鋭い人は気付いちゃったけど、「テスト」が含まれてません。誰かテストのベストソリューションについて語ってくれないかな〜。

というわけで

入門Trac with Subversion―Linux/Windows対応

入門Trac with Subversion―Linux/Windows対応

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090124

2009-01-23 (Fri)

NSEnumerator より高速列挙の方が速いのかな 17:18  NSEnumerator より高速列挙の方が速いのかな - iOS プログラミングメモ を含むブックマーク

高速列挙あんまりちゃんと覚えてなくて NSEnumerator ばっかり使ってたから全体的に Enumerator 臭でいっぱいなんですけど、どうも高速列挙の方が早そうな気がするので調べてみた次第。

ていうか、Fast Enumerator って事らしいので早くて当然なんだけど、思ったほどの違いは確認出来なかった。

test_enu: 0.102547
test_for: 0.084477

あ、そうだ、実機で確認してみたらもっと差が出るかもしんないっすね。後で試そう。

以下テストに使ったコード。こいつが悪いから性能差が確認出来なかったんだな、きっと。

@interface Hoge :NSObject {
   NSMutableArray *lists;
}

- (void) setup;
- (void) test_enu;
- (void) test_for;

@end

@implementation Hoge

- (void) setup {
   lists = [NSMutableArray array];
   int i;
   for(i = 0 ; i < 1000000; i ++) {
      [lists addObject:[NSNumber numberWithInt:i]];
   }
   [lists retain];
}

- (void) test_enu {
   NSEnumerator *enu = [lists objectEnumerator];
   id obj;
   while(obj = [enu nextObject]) {
      int hoge = [obj intValue];
      hoge;
   }
}

- (void) test_for {
   id obj;
   for(obj in lists) {
      int hoge = [obj intValue];
      hoge;
   }
}

- (void) dealloc {
   [lists release];
   [super dealloc];
}

@end

int main (int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   srand((unsigned)time(NULL));

   Hoge *hoge = [[Hoge alloc] init];
   [hoge setup];

   NSDate *start;

   start = [NSDate date];
   [hoge test_enu];
   NSLog(@"test_enu: %g", [[NSDate date] timeIntervalSinceDate:start]);

   start = [NSDate date];
   [hoge test_for];
   NSLog(@"test_for: %g", [[NSDate date] timeIntervalSinceDate:start]);

   [pool drain];
   return 0;
}

充電中かどうかの判定 20:15  充電中かどうかの判定 - iOS プログラミングメモ を含むブックマーク

USB ケーブルをつないでるかどうかの判定って、出来るのかなぁ。

自由に使えるアプリ用カメラアイコン 21:16  自由に使えるアプリ用カメラアイコン - iOS プログラミングメモ を含むブックマーク

素晴らしい。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090123

2009-01-21 (Wed)

SkyBook 1.5.1 Ready for Sale 09:41  SkyBook 1.5.1 Ready for Sale - iOS プログラミングメモ を含むブックマーク

新機能追加とバグ修正です。

zip ファイルもちゃんと読めるようになってるはずです。テキストが2つとか入ってるとダメですが。あと、画像だけってのもダメ。

次は、余白設定入れないとなー。

goo 辞書

わかんない単語が出てきた時に、その場ですぐ調べられるように辞書を開く機能を追加しました。goo を見に行くので touch ユーザには辛いですが。他の辞書アプリと連携出来ればいいんだけどなー。

単語の選択はドラッグだと誤爆が多くなりそうなので、自動で付近の漢字を取り出すようにしてみました。ふりがなとかは自分で入れないといけなくて面倒くさいけど、そんなに不都合はないんじゃないかなぁと思ってますけど、どうでしょうかね。

今回は goo にメールしてみたら画面仕様をくれって言われて、色々やり取りしました。結構問い合わせの返信も早くて好印象でした。

あと、ウェブビューなのが原因かわかりませんが、メモリ消費量がデカくて落ちるかも。

タップ操作方法の選択

自分は右利きのくせに端末は左手で操作するっていうマイノリティなので全然気付かなかったんですが、右手で操作する人には左タップで進むのは使いにくかったみたいですね。操作方法を選べるようにしました。後は、もともと入れたかった、片手操作モードも追加しまして、これは左手モードだったら画面の左側のみで前後に移動出来るっていうやつです。

壁紙の選択

壁紙が選択出来るようになりました。古紙1がなかなかいい。デザイナさんにお願いしたら、ものすごい沢山作ってきてビビりました。僕は空4がお気に入りで使ってます。

f:id:ktakayama:20090121093851p:image:w160

なんだこれ?っていうのが結構ありますけど、それはそういうコンセプトなので、楽しんでもらえたらなと。

in Review 中のアプリの AppStore への URL を知る方法 12:33  in Review 中のアプリの AppStore への URL を知る方法 - iOS プログラミングメモ を含むブックマーク

Ready for Sale になってから慌てて URL を調べてウェブサイトを更新するのは面倒だし、忘れると困るしなので、事前にわかってた方が良いはずです。

f:id:ktakayama:20090121123016j:image

これはある秘密のアプリの申請中の画面なんですが、AppDetails ってリンクあるじゃないですか? こいつをクリックすると Apple ID てのが書いてあって、これが URL に入る ID 番号になります。なるはずです。実は前から気になってるんですけど、実際にチェック出来てないので予想の域を出ないというかなんというか…。

とにかく、これが最初からわかってれば、事前に AppStore へのリンクを付けとく事が出来るよねっていうお話でした。

子豚子豚2009/01/22 23:38古い形式のXHTMLでの振り仮名問題の解消、確認しました。ありがとう御座います。

一通りの青空文庫系Appは使用していますが、振り仮名の配分の美しさはSkyBookが一番です。
細かい話なのですが、「々」が入る熟語の振り仮名が「々」の後から振られます。
化けた文字「〓」でも同じ現象が起きます。
(独自テキストファイルにて確認。青空XHTMLは未検証)
例)「時々≪ときどき≫は、」の場合、「は、」に「ときどき」と振り仮名

また、私自身も一時期はまり、某所でも大変不評を買っている点で、
"タップからリリースまでの時間が少し長いと、ページが送られない"
と言う点は、早急に修正される事を祈ります。

ktakayamaktakayama2009/01/23 00:43あれ、タップからリリースまでが長かったら何も起きないように、わざとしてたんですが不評ですか。
もしかして、直感的な操作感を阻害してるのかな…。たしかにそうかもしれないですね。

かな配分についてお褒め頂きうれしいです。
結構気をつかって位置を計算していたのですが、差が感じられるくらい違うとは。
頑張った甲斐がありました。
々や〓の件は気付きませんでした。申し訳ないです。
すぐ修正作業をしておきます。
どうもありがとうございました。

Y.KikY.Kik2009/01/23 10:09独自テキストが読めるようになったとのことで、早速購入しました。
動作も機敏で、満足しております。

独自テキストを主に表示させているのですが、
一点、気になったのですが、数字やアルファベットの表示が、回転されてしまうことがあります。
たとえば、「5歳」などは正しく(?)表示されますが、「50歳」だと、「50」だけが右に90度回転(横書き表示)されます。アルファベットも、連続すると回転されます(されないこともあります)。

このへん、何か意図があるのでしょうか?それとも不具合でしょうか?

ktakayamaktakayama2009/01/23 12:14ご購入、ありがとうございます!!
数値やアルファベットは、半角のものは横向きで表示させてます。
この辺は、もうちょっと綺麗に表示されるよう調整が必要と感じています。
中途半端でもうしわけないです…。

Y.KikY.Kik2009/01/23 22:35ご返答、ありがとうございます。
私も、半角/全角の問題かなと思って、半角文字を全部全角に直してアップしたんですが、変化がなかったんですよ。
これって、一旦読み込んだ文書は、キャッシュとかなんかで、変更は見ないんですかね?
一旦削除して、文書名を変えて読み込みなおしたら、うまくいきました。

SkyBookフォルダをシンボリックにして、他のディレクトリを参照(共有したいので)していますが、ipod touch側から削除しても、ファイル自体は削除されないんですね?

特に不自由はないので、OKですが。
すばらしいアプリに感謝です。

あと、独自テキストを表示させるとき、設定アプリを先にONして、あとからフォルダ追加とかだと認識されないような気がしましたが・・勘違い?私がフォルダ名まちがえたのかな?

ちがってたらごめんなさいです。

Y.KikY.Kik2009/01/23 22:50連続でごめんなさい。

独自テキストのフォルダを作る説明で、私の環境ではi-FunBoxをつかってますが
root(Raw File System)には Photos というディレクトリ(リンク)はありません。知っていたので、多分そこかな?と思い
/private/var/mobile/Media/Photos
に SkyBook フォルダを作りました。

同じく、「そんなフォルダないぞ??」とか迷われている人もいるのでは?

フルパスで説明いただければ幸いです。

ますます、SkyBookファンが増えることを祈念して・・

子豚子豚2009/01/23 23:31/User/Media/Photos/SkyBook/
ですよ。

Y.KikY.Kik2009/01/24 09:37子豚さん、

コメントありがとうございます。
/User って /private/var/mobile へのシンボリックリンクだったんですね。
WinSCPで見て、納得。
i-FunBOXだと、シンボリックリンクなのかどうかわからないですもんね。

ktakayamaktakayama2009/01/25 01:19Y.Kik さん

初めのキャッシュについては、そうなんです、キャッシュが強烈過ぎて、更新が反映されません。
面倒ですが、「SkyBook上で削除→SkyBookを再起動」をすると更新が反映されます。
現在申請中の新バージョンで解消される予定です。ご不便かけます。

フォルダについてのご指摘ありがとうございます。
確認して、修正しておきます。
スクリーンショットを掲載しようと思ってます。

フォルダの追加が反映されない件は、明日追試してみます。
SkyBook の再起動で反映されないのでしたら、不具合です。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090121

2009-01-19 (Mon)

はてなグループ日記にコメントできない 08:24  はてなグループ日記にコメントできない - iOS プログラミングメモ を含むブックマーク

はてなにログインしてないユーザは、はてなグループの不具合の影響でコメント出来ない状態になっていたようです。

なにやら、10日も前からこんな状態だったらしい。

ええぇ…。

直ったみたい

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090119

2009-01-18 (Sun)

UIImage の autorelease に期待して損した話 23:07  UIImage の autorelease に期待して損した話 - iOS プログラミングメモ を含むブックマーク

UIImageView の中のイメージを次々とっかえるようなコード書いたらメモリが右肩上がりになってしまって困った事になりました。UIImageView を解放してしばらくするとメモリも減るんですけど、わけわからん状態です。デカい画像の入れ替えが発生するのでメモリ不足で愛しの iPhone もクラッシュです。

サンプル

普通にスッキリ書こうとするとこんな感じでしょうかね。クラスメソッドで UIImage を作って入れ込むと。

UIImageView *imageView;

- (void) nantoka:(NSString *):imagePath) {
   imageView.image = [UIImage imageWithContentsOfFile:imagePath];
}

このクラスメソッドからインスタンスを生成する方法だと、自動的に autorelease されるわけなんですけど、厳密にメモリ管理したい場合は alloc init してから自分で release すると確実だよって、先月誰かに教えてもらいました。

それを踏まえて書き換えると。

- (void) nantoka:(NSString *):imagePath) {
   UIImage *img  = [[UIImage alloc] initWithContentsOfFile:imagePath];
   imageView.image = img;
   [img release];
}

なんつーかもう、一々冗長なんだよねぇ。

yamionpyamionp2009/01/20 23:24autoreleaseのタイミングを調整したい時は、自分でNSAutoreleasePoolのインスタンスを作成し、処理の最後にそのインスタンスをreleaseすればそのタイミングでその間のautoreleaseのオブジェクトは全て解放されます。
for( ...){
id hogePool = [[NSAutoreleasePool alloc] init];
// 処理
[hogePool release];
}
のような形にしておけばループ毎に必ず解放されることになります。
プール自体の解放を忘れないようにすれば便利な仕組みなので、コードの削減に役立つかもしれません。

ktakayamaktakayama2009/01/20 23:51ああ、確かに NSAutoreleasePool 使えば大丈夫かもしれないですね。
でも今回はループってわけでもないので、ちょっと違うかなと思います。
UIImageView の挙動が変だろって事なんで。
いま試してみたら再現出来なくて、詳しく調べられてませんが。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090118

2009-01-17 (Sat)

挿絵って 09:00  挿絵って - iOS プログラミングメモ を含むブックマーク

何種類もあるのかな…?

ファラデーの伝 に入ってる[#なんとかの挿絵()入る]みたいなの使ってると思ったけど、それが標準ってわけでもないみたいすね。工作員マニュアル読んでたら、挿絵は個別対応っぽい事が書かれていた。

というわけなので、SkyBook では [#挿絵(画像のパス)]って入れておけばオーケー。早いところ、オフィシャルサイトに説明をアップしないと。

お詫びに、今日申請する分について書いておきます。

  • タップ操作方法の選択
  • 壁紙の選択
  • 辞書

ところで、いま調べていて知ったんですけど、暗号舞踏人の謎XHTML だと挿絵が入ってるけど、zip の方には入ってないのね。SkyBook の青空文庫ダウンロード機能は、XHTML の方を見てるから画像が入ってちょっとお得。

zip が!!!! 10:22  zip が!!!! - iOS プログラミングメモ を含むブックマーク

フォルダにファイルを詰め込んで zip 圧縮した場合に表示されない不具合がありました!!

ファイルを直接圧縮すれば良いんだけど、多分普通はそんな事しないよね…!青空文庫のファイルばっかりでテストしてたから、気付きませんでした。もうしわけないです。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090117

2009-01-16 (Fri)

SkyBook 1.4.1 Ready for Sale 11:25  SkyBook 1.4.1 Ready for Sale - iOS プログラミングメモ を含むブックマーク

予想では明日リジェクトのメールが来ると思ってましたが、リリースされました。素直にうれしい。

細かい見た目の変更がちょっと入ってますが、大きい点は「青空文庫以外のテキストのダウンロードに対応」した事です。こいつは設定アプリを開いて、機能を有効にしなくちゃいけなくて隠し機能っぽい感じですけど。

将来的には Books と Files を統合しようかななんて思ってますけど、悩み中なのでこんな風になってます。そのまえに基本的機能のブラッシュアップで必要な部分があるので、それが終わってからですね。独自テキストについては、ずっと前からやるやる言ってたのに全然開発が進んでないからやるやる詐欺っぽく見えるのがいい加減嫌になったので機能だけでもと思って申請しました。

あとは、名前についてるポケット青空文庫を、ポケット文庫に変更します。

ちなみに独自のテキストですが、提供されているインターフェイスだと、URL 手入力してダウンロードって言う面倒くさい手順しかありませんが、お約束として Photos/SkyBook/ にファイルを置ける機能が入ってます。ここに入れておくと、Files のタブに USB っていうディレクトリが表示されまして、そこから見る事が出来ます。実際にテキスト閲覧が出来るのは、拡張子が txt か text のファイルと、zip のファイルです。いわゆる青空文庫形式のファイルが見れるようになってます。

試してませんが、JB してる人ならアプリの Documents ディレクトリにファイルを直接配置しても大丈夫だと思います。.prop なんてファイルが見えますけど、それは無視して平気です。理論的には大丈夫なはず。

大変なまでに遅くなりましたけど、iPhoooone さんが要望していた点 をすべて満たす事が出来ているかと思います。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090116

2009-01-13 (Tue)

マックっぽい文字の対応 16:56  マックっぽい文字の対応 - iOS プログラミングメモ を含むブックマーク

UTF8 でファイル名に濁点がついてると文字と濁点が分離しちゃって困った事になる場合があります。

例えば、「オーマイガ」って名前を付けようとすると「オーマイカ”」*1ってなっちゃうんですが、NSFileManager で fileExistsAtPath をするとどっちの場合でも TRUE が返ってきてわけわからん事になります。

ディレクトリの走査とかしようとするとすぐ出てくるんですけど、ファイル名を DB に保存したくなったりすると非常に困る。

と言うわけで、次のようにすれば濁点が仲間外れにならないようになるので、みんな幸せになれます。

NSString *before = // どこからかやってきた分離文字
NSMutableString *after = [NSMutableString stringWithString:before];
CFStringNormalize((CFMutableStringRef)after, kCFStringNormalizationFormC);

この例の場合だと、変数 after に合体後の文字列が入ります。特に戻り値を受け取ったりする必要はありません。

詳しくはこちら。

*1:表記はイメージです

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090113

2009-01-12 (Mon)

連射カメラ 10:21  連射カメラ - iOS プログラミングメモ を含むブックマーク

自分は、タッチしてる間だけ単なる連射するだけのカメラアプリ作ってみようと思ってたら fladdict さんから出た。ということで、タッチしてる間だけ撮り続ける機能はどうっすか?

あ、でも1枚の画像が合体するのかな。ちょっと違うか。

fladdictfladdict2009/01/12 12:30そのカメラもナイスですね。
被らない方向でなら、ノウハウガンガンお渡ししますよ。

ktakayamaktakayama2009/01/12 19:07マジですか!!!
今やってる SkyBook のアプデートが終わったら考えてみます。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090112

2009-01-07 (Wed)

Eye-FiiPhone アプリ版 10:32  Eye-Fi の iPhone アプリ版 - iOS プログラミングメモ を含むブックマーク

iPhoneアプリ版はカード版のユーザーには無償でダウンロード提供されます。正確なApp Storeでの提供開始日は今後改めて発表される予定。提携サービスの多さやRSS / Twitter通知といった機能から単なるiPhoneアプリとしても便利そうですが、一般ユーザーへの提供などについてはまだ不明。

ワイヤレスメモリカードのEye-Fi に iPhoneアプリ版が登場

なんでしょう、この限定配布を匂わせる記述は。こんな事って可能なんでしょうかね。アプリを起動したら、シリアル番号を入力するとか?w ちょっと気になる。

SkyBook 1.3.0 Ready for Sale 12:03  SkyBook 1.3.0 Ready for Sale - iOS プログラミングメモ を含むブックマーク

待望のフォントカスタマイズ機能が搭載されました。

あと、地味に挿絵にも対応しました。

自前のフォントを使いたい場合、i-FunBoxDiskAid でつないで /var/mobile/Media/Photos/SkyBook/fonts ディレクトリを作ってそこにフォントファイルを置いとくと、フォント選択のリストに出てきます。ttf も otf も使えます。実際の操作方法に関しては、後日サポートサイトに掲載しますが、取り急ぎ。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090107

2009-01-06 (Tue)

すげー 00:09  すげー - iOS プログラミングメモ を含むブックマーク

ほんと偉いよなぁ。俺ももっとこの世界にいろいろ還元していかないと。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090106

2009-01-05 (Mon)

ソフトバンクのテレビアプリの審査 22:02  ソフトバンクのテレビアプリの審査 - iOS プログラミングメモ を含むブックマーク

って、どうやったんだろうかね。米国じゃ日本のワンセグ入らないし、アプリの審査をどうやったのかが気になってます。やっぱソフトバンクの特別対応があったのかな。てか、そうじゃないと審査通らないよね。

そういえば、他にもワンセグがどうのってアプリもあったような。あっちはどうだったんだろう。

物理デバイスと連携するワンセグアプリは可能性を感じさせるものだけど、審査の内容如何によっては発展の可能性ないよね。いやしかし、審査通るか不透明なうちから機器は作れないよなぁ。

リジェクトされないコツ 22:03  リジェクトされないコツ - iOS プログラミングメモ を含むブックマーク

全部自前で構築したデザインにして、アップルの標準機能を完全に無視すれば、リジェクトされる確率は減るんじゃないだろうか。

嫌味じゃなくて、効率を考えるとその方が安全だと思う。

TKTK2009/01/08 06:55それは私も思ってました。
特にゲームなんかはそうですね。
設定画面などで下手にUITableViewなど使わずに、独自のデザインで実装した方がよさそうでした。

ただ、デザインするのが面倒ですが(笑)

ktakayamaktakayama2009/01/11 00:28ですよね、めんどくさいっす。
僕なんか、絵が全く書けないのでどうにもならん。
アイコンくらい書けるようになりたい…。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090105

2009-01-03 (Sat)

タイマー 21:57  タイマー - iOS プログラミングメモ を含むブックマーク

例えば0.1秒後に処理をしたい場合でも、次のような感じで NSTimer を使ってたんですが。

[NSTimer scheduledTimerWithTimeInterval:0.1f
   target:self selector:@selector(deselect:) userInfo:tableView repeats:NO];

こんな風にした方がスマートだって知りました。エリカ本に書いてあった。

[self performSelector:@selector(deselect:) withObject:tableView afterDelay:0.1f];

先日の UITableViewController のコードもこっちに直しました。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20090103

2009-01-01 (Thu)

リジェクトされた 12:01  リジェクトされた - iOS プログラミングメモ を含むブックマーク

まじすか………。

ちょっと、もう、最悪だよ……。

新年早々嫌な気分にさせてくれるぜ。

※問題点を直してすぐに再アップしたので、また数日待ちです、ごめんなさい

日本特有のアプリを審査する人は言語設定「日本語」でチェックしてるみたい 16:37  日本特有のアプリを審査する人は言語設定「日本語」でチェックしてるみたい - iOS プログラミングメモ を含むブックマーク

割とどうでもいい話ではありますけど、今朝リジェクトされて一緒にスクリーンショットが送られてきたんですが、そのスクリーンショットが日本語版のものでした。単にそれだけ。

UITableView で didSelectRowAtIndexPath した後はどこかでハイライトを解除する必要がある 17:12  UITableView で didSelectRowAtIndexPath した後はどこかでハイライトを解除する必要がある - iOS プログラミングメモ を含むブックマーク

今回リジェクトされた理由ですが、タイトルの通りです。iPhoneヒューマンインターフェイスガイドライン に以下の通りに記述があります。(※強調表示は僕がつけた)

ユーザがリスト項目を選択すると、Table Viewはフィードバックを提供します。具体的には、項目を選択できる場合、ユーザが項目を選択すると、その項目を含む行が一時的にハイライトされ、その選択が受け付けられたことを示します。その後、すぐにアクションが発生します。つまり、新しいビューが表示されるか、または項目が選択されたことを示すチェックマークが行に表示されます。Table Viewは、選択された状態を永続的には表示しないため、行はハイライトされたままにはなりません。

Table View、Text View、およびWeb View > 使用方法と動作

こんなのは API でやってくれよとグチグチ言いたいわけですけど、そうなってはいないので、この処理は自分で実装する必要があります。

行の選択をした後、他のビューに移動する場合、または移動しない場合で二通りの実装が考えられます。

まずは多いパターン、ビューの移動が発生した場合ですが、移動先から戻ってきた時に選択を解除するコードを入れておけばオーケイです。

- (void) viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
   [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
}

tableView がインスタンス変数になってる必要がありますけど、UITableViewController には漏れなく入れておくと良いかと思います。

次はビューが移動しないパターンです。設定画面とかで tableView を使ってモノを選ぶような場合に使われると思います。ここでも選択した後にハイライトを解除する必要があります。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

これでまぁうまくいくんですが、deselectRowAtIndexPath の前後で tableView#reloadData を実行すると、ハイライトの仕方が変になります。具体的にはハイライトしている間、文字の領域が白抜きになってしまって、ま、説明するの大変なので体験してみてください。気にならなければ別に問題ないし。

というわけで、僕は以下のようにして実行を遅らせる事にしました。他に綺麗な方法が思いつかなかった。

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   // do something
   [tableView reloadData];
   [self performSelector:@selector(_deselectTableRow:) withObject:tableView afterDelay:0.1f];
}

- (void) _deselectTableRow:(UITableView *)tableView {
   [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES];
}

fladdictfladdict2009/01/02 03:15これ最近の審査基準変更で、急に指摘されるようになりましたよね。
とてもウザイです。

何も知らずにテーブルビューつかったプロジェクトは、必ずリジェクトされることになりそうでなんとも。

ktakayamaktakayama2009/01/02 09:31> 必ずリジェクト
ですよねーー。
普通に使ってるだけなのに。

最近変わった点なんですか?
なかなかうまくやりくりするのは、難しいもんすね。

tmokitatmokita2009/01/05 12:47お世話になってます。
私のも12月はじめの頃に出したアプリでは通って
下旬にバージョンアップ申請したらこれでRejectされました。
ガ━━(;゚Д゚)━━ン!!

せめて最初から言ってくれよ、って感じです。

ktakayamaktakayama2009/01/05 21:58いやー、災難っすねえ。

はぁ…、しかしリジェクトされるのは仕方ないけど、リジェクト後の再審査が普通に申請したのと同じくらい時間がかかるってのは、かなりゆるせない仕様ですよね。

kurokuro2010/05/25 19:23逆に考えるんだ。。。
表示ラベルがハイライトされても変更させなくするんだ。

//セル選択時文字色
//非推奨なので、Labelがハイライトされても変更しないように設定
//cell.selectedTextColor = [UIColor blackColor];
cell.textLabel.highlightedTextColor = nil;