「降水確率」の定義について(降水確率と雨量には関連がない件について)

天気予報のアプリを作るに当たって天気予報関連の言葉の定義を見ていたわけこの中でも「降水確率」というのは面倒な概念だった。
気象庁から引証すると、
気象庁|予報用語 予報の名称

降水確率
a)予報区内で一定の時間内に降水量にして1mm以上の雨または雪の降る確率(%)の平均値で、0、10、20、…、100%で表現する(この間は四捨五入する)。
b)降水確率30%とは、30%という予報が100回発表されたとき、その内のおよそ30回は1mm以上の降水があるという意味であり、降水量を予報するものではない。

さらに、

降水確率0%
降水確率が5%未満のこと。降水確率は1mm以上の降水を対象にしているので、1mm未満の降水予想である場合は「降水確率0%」でもよい。ただし、実用上の見地からは雨または雪の降りにくい状態に用いることが好ましい。

と、ある。
まず雨の降る確率であって、雨量ではないというところ。霧雨でも土砂降りでもそんなのは関係なく1mm以上で降水確率。
次に確率は四捨五入。心理として「45%の確率で雨」と「54%の確率で雨」はずいぶん違うけど、これもひっくるめて「50%の確率で雨」となる。
そして極めつけは降水確率0%だった時。これは「雨が降らない」ではなくて、5%未満というだけ。だから予報として
「今日の天気は晴れ、降水確率は0%です」
という場合でも実際は5%未満の確率で雨が降るというわけで、上記定義に合わせると
「0%と100回発表されたとき、0-4回は1mm以上の雨が降る」
ということになる。
難しい…。

iPhoneのカレンダー設定を和暦にしていると、日付と曜日がずれる問題が起こる

この辺で詳しく説明されているのだけれども、全然知らなかった。そして踏んだ。
日本語環境では、NSDateFormatterでフォーマットした日付がおかしい - 24/7 twenty-four seven
NSDateFormatter - 文字列と日付の変換 - 強火で進め
一般->言語設定->カレンダーで西暦以外(和暦orタイ仏歴)を選択していると、NSDateFormatterでフォーマットする年が平成yyyy年とかになるらしい。
つまり、和暦に設定した状態でこんな感じのプログラムに_dateとして「2011/6/13」を与えた場合、

  NSString* _dateOfFirstStr = _date;
  NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
  [dateFormatter setDateFormat:@"yyyy/MM/dd"];
  NSDate* _dateFirst = [dateFormatter dateFromString:_dateOfFirstStr];
  NSCalendar *calendar = [NSCalendar currentCalendar];
  NSDateComponents *c = [calendar components:NSWeekdayCalendarUnitfromDate:_dateFirst];
  NSInteger weekday = [c weekday];

weekdayは1で日曜日。
なぜかというと、yyyy年が平成の扱いだから、ここでは平成2011年と指定されているので、平成2011年(!)=西暦3999年(!!!)。3999年のカレンダーを見てみると

> cal 6 3999
      6月 3999
日 月 火 水 木 金 土 
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

で、13日は日曜日。デバッグしていて数字を見ていても2011のままだから、これは気がつかない…。
この問題は、id:nakamura001 氏のソースを参考にして、NSDateFormatterのLocaleをen_USにすると回避できる。

  NSString* _dateOfFirstStr = _date;
  NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
  [dateFormatter setDateFormat:@"yyyy/MM/dd"];
  [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]];
  NSDate* _dateFirst = [dateFormatter dateFromString:_dateOfFirstStr];

こんな感じ。これは知らないと直せない…ちょっと辛かった。
調べてみると英語圏のアプリでは対応されていないことが多いっぽい。日本語のアプリでもカレンダーの設定を西暦にしてね、という書いてるアプリもある。
これは…誰か得なんだろうか…。

Push通知を組み合わせたアプリの大変なところ

今回「降水確率」ではiOSのPush通知機能を使ったアプリを作ったことが評価につながったと思っています。この"Push通知"、ユーザとしてとても便利なんだけどデベロッパー側は結構大変。
なぜか。odawaraが考える理由は次の3つ。

  1. 独自のサーバーが必要
  2. 通知は失敗することがある
  3. 実運用の情報が少ない

まず独自のサーバが必要な点。
Push通知を行うためには必ずサーバが必要になる。これの運用が必要になるから単純に面倒なんですよね。アプリを販売してそれっきりとは行かないから手離れが良くない。また固定費がかかる。今回は低スペック低価格のサーバを使い、その上で十分なユーザー数を裁けるように重たい処理をCで書いたりしてチューニングを施している。
次は通知の安定性の問題。
モバイル端末に対してサーバー側からデータを送信するので、端末側で受信できない場合がある(電源が切れているとか長い時間圏外にいたetc)なので、Push通知のみに頼ってしまうと運悪く情報が古いままになってしまう。このときのリカバリ方法を考えなければならない。今回はユーザが自らアプリを起動して情報を更新してもらうことで、これを避けることが出来るようにした。ちょっとユーザに頼りすぎな気がして、ちょっと申し訳ない…
最後に実運用の情報が少ない点。
Push通知が一番使われているアプリといえば、Twitterクライアントだと思うんだけど、Twitterクライアントのバックエンドのデザインて公開されていない(といかodawaraは知らない)。PHPフレームワークはあるけれど、規模が大きくなったり逆に小さくてよい場合にちょっと扱いにくい。その辺は実際に運用してノウハウを溜めていくしかないのかも。
とまぁそんな感じでちょっと大変。だけどそれに勝る便利さが提供できればよいと思っているので、今回は頑張りましたとさ(笑)

降水確率がAppStoreの総合ランキングで9位に!

わーい。わーい。わーい。

http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
(まぁ最大瞬間風速の可能性がありますがね…)
今日はAppBankさんで、紹介して頂けたようです。
降水確率: 今日傘いる?が即わかる。アイコン上に降水確率を表示してくれるアプリ。 | AppBank – iPhone, スマホのたのしみを見つけよう
うれしい!ありがとうございます!

降水確率がAppStoreの天気カテゴリでついに1位に!

わーい。わーい。

http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
そしてカテゴリのトップを取ると、iOSのAppStoreでカテゴリアイコンになれるというオマケがありまして…

なってる!記念にスクリーンショット(笑)
調べてみると、
iPhoneのゲームで超有名なRucKyGAMESさんに紹介してもらったり、
ラッキーゲームス on Twitter: "バッヂで降水確率表示だとっ http://bit.ly/lD7NN8"
アプリレビューサイトAppleFan!さんで紹介してもらったようです。
【降水確率】ホーム画面に降水確率を表示出来る、便利な天気予報アプリ。
皆様ありがとうございます!
さて、サーバサーバ…。

降水確率がAppStoreの天気カテゴリで3位になった

わーい。

http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
24時間経たずに3位になったみたい。みなさんありがとうございます。
とはいえ、天気カテゴリの有料は上位の2つ(CelsiusとWeather HD)が強いんで、これ以上はもうちょっとがんばらないと難しいかなという感じ。
それよりも、ユーザーが増えてきたときのサーバーサイドにちょっと不安があるんで、サービスレベル落とさずにやっていきたいというが優先かな。
iPhoneの有料アプリって買ってしばらく経つと使えなくなったり、サービスが不安定になって使えなくなる奴が結構あるので…あれは良くないよね。商業的にどうなのかは知らないけど。

iPhone向けアプリ「降水確率」をリリースしました

http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
「気温が見れるアプリがあるのに、なんで降水確率が見れないわけ?」
という疑問の下、誰にでも出来そうだけどなぜか存在していない、
「その日の降水確率をホームアイコンのバッジに表示する"だけ"」
というアプリを作成しました。こんなアプリ誰がうれしいんだ?という意見が多々あるかと思うんですが、主にodawaraがうれしいです(他にももう少し喜んでくれる人が居るとうれしいな…)
(一応)日本人であるodawaraが作っているのでiOSの天気アプリにありがちな、

  1. 場所が謎(空港しか選べない、地名が英語表記)
  2. 設定したけど表示されない(iOSの標準アプリだと"釧路"が見れないんだぜ)
  3. よくわかんないけど動かない

などの点を改善しています。あ、115円の有料アプリです。
入れてみるとこんな感じで表示されます。
http://click.linksynergy.com/fs-bin/click?id=TE52uZMvz34&subid=&offerid=94348.1&type=10&tmpid=3910&RD_PARM1=http%3A%2F%2Fitunes.apple.com%2Fjp%2Fapp%2Fid441048839%3Fmt%3D8
バッジの更新は、6、12、18時を目安に行われます。
こういう類のものは、作ってみて初めてわかる面倒な部分というのがいろいろとあるものでして、odawaraもやってみて気がついたことがそれなりにあったので、そのうちメモついでに書いておこうかと思っています。