さくせん:いろいろやろうぜ

いろいろなことをやって、楽しみます。

iPhone App on iPad でボタンが押せない件

Landscapeモード限定のiPhoneアプリを作成した。
Universalではない。
そのアプリをiPadで動かすと・・・ボタンが反応しない。
なぜだ、ということでエントリ。
おそらく基本的なところを見落としている気がするのだが分からない。

手順
「Single View Application」で新規プロジェクトを作成
StoryBoardでViewControllerのOrientationをLandscapeにして、UIButtonを1つ貼り付ける
プロジェクトのTARGETでSupported Interface Orientationを、
・Landscape Left
・Landscape Right
にする。


これを実行すると、
iPhone→ボタンが押せる
iPad→起動直後は、ボタンが押せない。表示はされる。

ボタンが押せない状態で、「2x」ボタンを押し、2倍表示にするとボタンが押せる。「1x」を押して戻しても押せる。
ボタンが押せない状態で、上下を逆さまにもちかえrotateが発生すると押せる。

以下、個人の考察
iPadはどちらの向きに持っていても初めはPortraitで起動する。
今回はLandscapeモードオンリーであるのだが、iPadで起動したときはPortraitモードでviewが配置されてしまい座標関係がダメ?→でもView自体は正しい位置に表示されている。UIWindowの座標関係がダメ?windowの再配置、viewの再配置が行われると正しくボタンが押せるようになる印象。rotate発生後や2xボタンを押したあとはうまく動く。

Supported Interface OrientationにPortraitを追加し、supportedInterfaceOrientationsでUIInterfaceOrientationMaskLandscapeを返すとシミュレータでは動くようになった。
しかし、実機で試すと、

  • Portraitの持ち方で起動するとボタンが押せる
  • Landscapeの持ち方で起動するとボタンが押せない

というヒントになるようなならないような現象。

あとViewControllerに
 - (BOOL)shouldAutorotate でYESを返してもダメ
 - (NSUInteger)supportedInterfaceOrientations で UIInterfaceOrientationMaskLandscapeを返してもダメ

根本原因が分からず・・・。

そして、暫定的な解決方法(かなり強引)

Supported Interface Orientationを Portrait、Upside Downに設定。
 - (BOOL)shouldAutorotateでreturn YES;
 - (NSUInteger)supportedInterfaceOrientationsでUIInterfaceOrientationMaskLandscapeを返す

これでボタンが押せるようになった・・・。
こうすることで内部的に起動時にPortraitで起動するが、supportedInterfaceOrientationでLandscapeなのでrotateが発生する・・・はず。だからうまく動く・・・?
ヘルプ。

追記
この方法でAppleへアプリを提出したところ、Reviewは通りました。
なお、SupportedInterfaceOrientationをすべてオフにしても意図した動きになります。

ローカライズしていあるアプリなのに、日本でのダウンロード数が一番多いのはなぜだ

現在、4つほどiOSアプリをAppStoreに並べていますが、どれも日本でのダウンロード数が一番多い。
4つのうち1つは、麻雀のスコアを管理するという超ニッチなアプリで外国の方が使っても意味不明であろうから納得が出来る。
だが、残りの3つ。海外でもぼちぼちダウンロードはされるが、日本の半分〜五分の1程度。少ない!
この原因についていくつかの仮説を立ててみた。

仮説1

日本のAppStore市場がそもそも大きい

これについては、アメリカが一番の市場でしょう。
少しソースは古いですが、以下のグラフを見ると一目瞭然。
http://news.mynavi.jp/photo/articles/2010/07/01/admob/images/001l.jpg

これは違いそうです。(アメリカの市場の大きさにびっくり)

仮説2

ローカライズをしているつもりでも、実際は意味不明なローカライズ

直近にリリースした「ぐるマップ」ですが全部を英語化しており、かつ公式ホームページも以下のようにローカライズしてみました。
(「自力英訳→Google Translate」で確認、微調整しつつ作成しました。)

日本語:http://mymealmap.appspot.com/
English:http://mymealmap.appspot.com/en

んで、気づきました。そもそも英語版へのアクセスが無い・・・(笑)
もちろん、アメリカのAppStoreから見ると、公式ページの英語版へ飛ぶようにしてあります。
結果、もちろんダウンロード数が増えず。

ここから考えられることは、

  • AppStoreの紹介文の時点でローカライズがヘタ。
    • 当然、公式ページにもこない
  • そもそも興味が無い

ローカライズがイマイチの可能性は捨て切れません。

仮説3

作られているアプリが日本人好み

特にどこの国に向けて作ろう、と意識しているわけではありません。
それ故、自分の嗜好が出て結果として日本人が好きそうなアプリになっている。
興味を持ってもらえなければ、公式ホームページまで来るわけもないです。

特にぐるマップは、食事の写真と位置情報を利用するアプリです。
食事の写真をパシャパシャ撮るのは日本人に多い行動なのかもしれません。
また、記録に残したいと思うのも日本人特有かもしれませんね。
というわけで、検証はできませんが、ここまで来るとこれが原因のうちの1つかも、と思ってます。

他にはどんな要因があるんでしょうか。

まずはローカライズを少し見なおしてみようかな。

もっと海外の人にアプリを使ってもらいたいものです。

SE風に書く、iPhoneアプリ「ぐるマップ」ができるまで

リリース内容

自分の食事を記録して、地図上で見ることができるアプリ「ぐるマップ」を先日リリースした。
特徴は上に書いてあるように、「自分の食事を地図上でみることができる」こと。
なんと今回は公式のWebページまで用意しました!→ぐるマップ 自分だけのグルメマップが作れるiPhone,iPod touchアプリ

きっかけ

うちの奥さまが

自分が撮った料理の写真を整理して、地図上で見たい!
旅行先のご飯とか、地図上で見ることができたら、楽しいよ!
作って!

いやいや、似たようなアプリ・・・あるだろう・・・
少し調べたんだが、

  • 食事を登録するアプリはあれど、地図へのプロットがない
  • 可愛い食事ソーシャルアプリがあるが、ユーザー登録が面倒で、地図へのプロットがない

というような具合に、見つからなかったし、ちょうど時間もあったので
「やりましょう。」
ということで開発が決まった。

SE風に行きますよ!あまりSEという呼び方は好きではありませんが。

受注

はい、上記のように受注しました。予算はゼロですね。赤字ですね。
しかし、自分の作ったものが他の人に使ってもらい喜んでもらえると嬉しいものなので良し。
きっと幸福感は増え、スキルアップもするでしょう。

要件定義

システム要件
  • 動作確認端末:iPhone4
  • OSは、OS5.0 or later
機能要件
  • ユーザーは料理の写真と、お店、料理名、コメントを記録できること
  • ユーザーは記録した食事を地図上でみることができること
非機能要件
  • アプリケーションはiPhoneらしいUIを備えていること
    • AppStoreに並べばOKとする
  • ストレスなく使えること
    • クライアントである奥さまからのOKで良し

はい、出来ましたね、簡単ですね!ハンコも沢山いりませんからね。

基本設計

画面デザイン、画面遷移、データの持ち方等は無印良品のスケッチブック(これ)に書きなぐり。
こんな感じで、全体像を書いた。

詳細設計

             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

脳内で済ませました。

コーディング and テスト and UIデザイン

ただひたすら書く。
公式ドキュメント、Google、StackOverFlow、その他個人の開発者様ブログにはお世話になりました。
コーディング→テスト→コーディング→テスト・・・
当初の画面設計で実装するが、使い勝手が悪ければ画面UIの変更。

よーし、ある程度出来たぞー。少しお客様に触ってもらいフィードバックしよう。

プロトタイプ(?)レビュー

お客様曰く

良い感じじゃん!

よしよし、順調だ。このまま仕上げれば・・・

あとさー、他の人の食事とか見れないの?

え?・・・え?

他の人がこのアプリを使って登録した写真とか見たい!
旅先とかであったら面白そうじゃん?できないの?

う、うん・・・。面白そうですね。はい。そこまでダウンロードされるかわかりませんが。
って、これ追加要件じゃね?費用・・・・(というか難しそうだしー)
でも、せっかくなので「やりましょう(2回目)」。
そのかわりリリース時期が遅れることについて承認してもらいました。

追加開発 and 再テスト

サーバーサイドはGoogle App Engineを利用して、ゴリゴリ。
結構たいへんだった。
まず、ネットワークを使ったプログラミングが初めて。POSTするのも一苦労。
ローカルのテストではうまくいくのに、サーバーにあげると日本語が化けたり。(ここと、こことか見て何とか解決。)
位置情報の検索がGAEならではの方法で特殊だったり(ここ)。

受け入れ

お客様に使ってもらい、すべての要件についてOKを頂きました!

Submit、Review、そして、Ready For Saleへ。

今回は多機能なアプリとなったので、リジェクトされるんじゃないかと不安だった。特にネットワーク周り。
色々下調べして、リジェクトの要因となるものを排除してSubmitした。
そして、一発で通った。やったね!

おわりに

このような経過で現在、無事お客様のiPhoneにはお望みのアプリが入っています。良かった、良かった。
現在もバグ修正、機能追加、使いやすさ向上に向けて毎日ちょこちょこと開発中です。
どんどん進化させていこう!

以下、App Storeへのリンクです。
ぐるマップ -食事を記録して、自分だけのグルメマップを作ろう- - Tsukasa Komiyama

ACAccountとACAccountStoreの関係

ACAccountStoreのrequestAccessToAccountsWithType:withCompletionHandler:でアクセスを要求後、ACAccountStoreのaccountsWithAccountTypeメソッドでACAccountのArrayを取得。
取得したArrayのItemにアクセスすると落ちた。
[array count]は大丈夫だが、[array objectAtIndex:0]だとダメ。
エラーメッセージはコピー忘れたが、

すでに解放済みのオブジェクトにアクセスしてる

のようなエラー。よくReleaseしすぎなオブジェクトにアクセスすると出るアレです。
ACAccountのオブジェクトなんて一度も触ってないし、releaseも一度もしてないのに!と思い少々悩んだ。

結果、エラーメッセージとドキュメント読んだら理解した。
以下、ドキュメント。

Each ACAccount object belongs to a single ACAccountStore object.

結論は、それぞれのACAccountオブジェクトはACAccountStoreオブジェクトに属していて(belong)、ACAccountStoreオブジェクトがautoreleaseで生成してたので、勝手に解放されていた、というオチ。ドキュメントはしっかり読みましょう・・・。
belongしていると、親がいなくなったら子もいなくなるのね。
AssetLibarayとAssetsもこんな関係だったのを思い出した。メモリ管理は慣れない。

NSLogで「*nil description*」と出てくるのを何とかしたい

自分で作成したクラスのインスタンスをNSLogをすると、

nil description

と出てきて、インスタンスの中身が見ることができなくてなんでだ!と困っていてググッた結果、解決したのでまとめ。
結論としては、自分で作成たクラスに「-(NSString *)description」の実装が無いからであると判明。
以下のように実装したら出てきた。

- (NSString *)description{
    return [NSString stringWithFormat:@"hogeValue:%@",self.value];
}

参考はこちら。
http://stackoverflow.com/questions/8057240/why-is-my-code-outputting-nil-description

Your -description method isn't actually returning anything.

おまえの「-description」メソッドが何も返してないからだぜ、ベイベ。みたいなかんじでしょうか。

作りつつ覚えていくという感じで楽しんでおる。

2011年の振り返りと2012年の目標

昨年は「アウトプットする」という目標のもと1年間を過ごした。
多かれ少なかれアウトプットは出来たかな。
まずは、振り返りつつ何を学んだかを書いてみる。半分趣味なので、「学んだ」というべきかは怪しい。
(何をもって「学んだ」と言うんだよ、というツッコミが聞こえてきそう。)

iPhoneアプリのリリース

2本のiPhoneアプリをリリースすることが出来た。

「闘牌の軌跡」のリリース

自分が使うものというコンセプトでアプリを作成した。麻雀のスコアを管理するアプリだ。
バージョンアップも7回ほど行った。
このアプリの作成で、

  • Xcode等の基本的な使い方
  • Cocoa-Touch,Objective-Cの基本的な使い方
  • App Storeへのリリース方法
  • バージョンアップ方法
  • 標準的なUIのiOSアプリの作成方法

が学べた。
この1つを作成することで、TabBaseのUI、TableViewのUI、各種イベント処理など1つのアプリで結構多くを知ることができた。

簡単なゲームのリリース

簡単すぎるアプリなので中身は省く。
しかし、このアプリの開発でグラフィックの作り方がある程度分かった。というのは、Pixelmatorというソフトでアプリに必要な素材の作成をしたから。
それっぽいボタンならPixelmatorで作れるようになった。また、グラフィックの大切さを感じた。画像だけで印象がかなり変わる。

Webアプリのリリース

写真共有ウェブサービスをリリースした。
今年結婚して、二次会の写真などの共有がしたかったから。他にも同様のウェブサービスがあるのになぜ作ったかというと、ユーザー登録時点で躓く人が多いから。なので、共通ID、共通パスでログインできるようにした。
Google App Engine(Python)、Flask、jQueryを使って作成。
jQueryを使ったAjaxの体感(今更だけど)やFlaskというフレームワークを使ってウェブサービスを作ったことで、次はもっと早くウェブサービスが作れるであろう!

1年を通して感じたこと

アウトプットするためには、インプットが当然必要となり、結果としてインプットが一杯できた。
アウトプット、いいよ、アウトプット。
一方で、本を読む回数は激減してしまった。本を読んで書評が出来ればアウトプットにもなって最高。

といいますか・・・

結婚をしましたね。これが一番でかい出来事でしたね。
某就職サイトにのったのも一応アウトプットなのか?受身だが。

2012年の目標

「飛躍の年」とする。こう、バイーンとジャンプをしたい。iPhoneアプリの10万ダウンロードとか?
今ある数字の100倍とかが達成出来たらないいな。ブログのアクセス数、アプリのダウンロード数、はてぶ数、友達数(これは無理かw)
毎年、具体的な目標は書いてないので今年も書かない。思い立ったらすぐ行動。
そして、今までやってきたことも継続。思考停止にならず、アウトプット。楽しみつつ1年を過ごしたい。

今年もよろしくお願いします。

保険初心者が「保険の窓口」でいろいろ勉強してきた。

自分は現在、国で用意されている保険以外の保険に加入しておらず*1、必要性をあまり感じていなかったのだが、相方が興味があるということで「保険の窓口」へ行って保険の事をいろいろ勉強してきたのでまとめる。
はじめはノリ気では無かったが、周りがみんな保険に入っているから・・・という理由で保険には入りたくないし、典型的な思考停止であるのでここは自分で学ぼうと考えた。毎月の出費になるしね。
では、以下からまとめ。個人のまとめなので、詳しくは専門家の意見を聞いてください。

「保険の窓口」とは

以下のウェブページが公式。

フランチャイズで運営されているとのこと。
特徴は、以下の点だろう。

  • 無料で相談が出来る
  • 特定の保険会社をプッシュしてくる訳ではない

ある程度、中立の立場で相談ができるので良さそう。ある会社が保険の窓口を運営しているのだが、収益は契約時の報酬か、それとも保険会社から定額を貰っているかは不明。

今回の自分の目的

  • 必要な保険の種類の見極め
  • 保険に加入する必要があるのか

まず行ったこと

ファイナンシャルプランナー(FP)と話ながら、シートへ個人情報の書き込み
保険の相談をするので、家族構成や喫煙有無、免許の種類、年収等を記入した。

保険の説明

保険は大きく分けて4つに分かれている。

  1. 医療保険
    • 病気になった時の保険
    • 出産時の帝王切開等も含まれる
    • 普通に出産した場合は国からの補助が出て収支はトントンらしい
  2. 生命保険
    • 万が一の保険
    • お葬式代
    • 生活費
  3. 貯める保険
    • よくわからなかった。興味が無かったともいう。
    • 貯める、増やすための保険
    • 老後資金
    • 教育費
  4. 将来の保険
    • 介護が必要になったときの保険

今回は、医療保険に興味があったのでそれについて詳しく話をきいた。

医療保険について

保険に入っていなかった場合、1日にどれほどの出費になるのかを考えます。

具体例:100万の治療費の場合

(ちなみに100万の治療費は、比較的重い病気の場合らしい。)
まずは、治療費について考える。

100万の治療費なので、100万

という訳ではない。まず、会社の健康保険に加入しているため、3割負担となる。

したがって、100万*30% = 30万。

保険に入っていないと、30万かよ!辛い!と思いきや、「高額医療費」というものがあり、治療費がお高くなった場合は申請すれば後からお金が戻ってくる。これは申請するしかないでしょう。
高額医療費によって、自分がいくら負担するかは計算式があるらしいのだが、FPさん曰く

だいたい、この例の場合は9万円。(21万円が返ってくる!)

おぉ、だいぶお安くなりましたね。
(ちなみにFPさんに200万の場合はどれくらいかかるかを質問したところ、11万くらいらしい。)
続けます。入院する期間によって1日あたりの出費は変わってきます。
最近は早く退院する傾向にあり、15日~30日だそうです。
だいたい、20日の入院として考えて

(治療費の自己負担の9万円 )/ 20日 = 1日あたり4500円 (以下約5000円 とします。)

なんか、思ったよりお安いですね。と思いました。
しかし、ここでは終わりません。
入院しているので、食事代がかかります。
食事代は1食=260円というように決まっているそうです。
そうすると1日あたりは

治療費5000円 + 3食 * 260円 = 5780円。約6000円です。

さらにこれだけでは終わりません。入院はお金がかかるんですね。
これ以外に雑費があります。ある学者さんが研究したらしいのだが、

平均して1日あたり1000円が必要

だそうです。内訳はテレビとかパジャマ代とか、病院によっては冷蔵庫代とか。
自分はテレビなんていらず、iPhoneがあれば十分です。って使えるのか。ってそれよりこれも通信費かかるか。でも、本があれば良い。ノートPCあればもっとよい。話がそれました。
そうすると、1日あたりの費用は、

治療費:約5000円 + 食費:1000円 + 雑費:1000円 = 7000円

となります。

さらにさらに、「差額ベット代」というものがあって、何かと言うと個室料金です。おれは一人でゆっくりしたい、と言う場合はこの「差額ベット代」がかかります。
これは、病院にもよりますが

1日あたり、3000円〜5000円。VIPルーム(?)になると、20000円〜

となります。
ここまでを全部含めると

治療費:約5000円 + 食費:1000円 + 雑費:1000円 + 差額ベット代:3000円= 10,000円

こんな感じになります。1日1万。結構お高い・・・。

どこまで保険でカバーするのか。もしくは、全額自己負担するか。

まず、上記で算出した1日あたりの入院金額は、妥当でしょうか。
差額ベット代は僕みたいな一般ピーポーにはいらないと思ったので、抜きました。
そうすると、今回の例であれば

1日あたり、7,000円の20日前後の支払い

ということになります。
保険に入る・入らないは、この1日7000円の20日前後の支払いを耐えられるかどうかの見極めとなりました。ここからは各個人の財務状況によります。
そうはいっても、やはり大事なのは保険料。
上記の例のどこまで保証するかによってもちろん保険料は変わってきます。
モデルケースで考えてみました。

  • 対象者:アラサー、いやアンダーサーティとしておく。
  • 入院時1日あたり5000円の60日間
  • 一生涯の保険
  • 支払いは60歳までに終える
  • 入院時1日目からお金の支給開始
  • 特定手術(88種類)の場合、10万円

こんな感じで保険料を算出すると、だいたい月額に2300円くらいになりました。年間で28,000円くらい。1日あたり80円。
思ったより高くないという実感。これくらいの負担なら加入しても問題ないかな。

医療保険の場合はこれがベースで、がん保険を加えてつける人も多いそうだ。
がんの場合は、国の認定が下りていない薬を使ったりすると保険が効かず、ドーンと金額が跳ね上がることもあるそう。そのような薬をいきなり使うことはなく、まずは国が認定した健康保険が適用される薬を使うらしい。

おわりに

どこの保険会社も同様の保険内容だと金額はそう変わらないです。保険の営業お姉さんがいるような企業は人件費も含まれて、少し高くなるのかなーとか思った。
さてさて、どうしましょう。今話題のライフネット生命も見て、保険料を比較してみよう。
一番は、元気でいることで、保険にかけたお金無駄になったな、ハッハッハー!!とか言う事でしょうか。

*1:自動車の任意保険は入ってる。病気した時の保険には入っていない。