Title

2012年4月の投稿一覧

新しい子育てアプリをリリースしました「添い寝アラーム」

前々からちょっと書いていましたが、新しいアプリをリリースしました。

そもそも、ComicGlassの開発するために子どもを寝かしつけてから時間を取っていたのですが、子どもと一緒に寝てしまうんですよね。

この「子どもと一緒に寝てしまう」問題は多くの親が「そうそう!」って頷く問題なわけですが、それをなんとかしようというアプリです。アプリ名は「添い寝アラーム」です。

スクリーンショットはこんな感じ。

添い寝アラームスクリーンショット1

まず、最初にやったのは「暗闇でも止められるアラーム」です。
普通のアラームアプリは画面を見て止めますよね?
あれだと、もしまだ子どもが寝ていなかったりするときに画面を点灯させなければならないのが困るのです。
そういうわけで、加速度センサを利用し、iPhoneを軽く叩くとアラームがスヌーズになるアラームアプリを作りました。

しかし、これでやってみるとアラーム時間を何分後くらいに設定すればいいのかが難しい。
絵本を読み聞かせている途中になってしまったり、まだ子どもが起きていてしゃべっている最中や、ゴロゴロ転がっている(子どもはよく動きます)途中にアラームがなってしまったりします。

そこでアラーム時間の自動設定方法の開発に取り組みました。
使えるのはマイクと加速度センサ。

連日データを収集し、毎秒どのくらいのデータを取得し、どのように信号処理したらいいのかを試験しました。
少しでも楽に使えたらいいなーと思いながら毎回すこしづづ改善をした結果、それなりに良い感じになってきたので、本格的にアプリにしてみました。
(最初に時点では完全自分用で公開するつもりはなかったのですが)

添い寝アラームスクリーンショット2

最終的に、iPhoneの接近センサー、バイブレーター、マイク、スピーカー、加速度センサ、と、かなり内蔵デバイスを多く使うアプリになりました。
技術的な話をすれば、普通じゃありえないような頻度でAudioSessionを切り替えていたりと色々勉強になりました。

簡単に書きますと、
まずAudioSessionを切り替え、マイク入力を有効にします。

        AudioSessionInitialize(NULL, NULL, NULL, NULL);
        UInt32 category = kAudioSessionCategory_PlayAndRecord;
        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
                                sizeof(UInt32),
                                &category);
        AudioSessionSetActive(YES);

それで音声をモニタリング。

加速度センサは60Hzで取得して微分して使っています。

音声と加速度の認識処理の部分は説明できないので省きますが、完璧な検出はやはり無理なので、アラームタイミングを長くしたり短くしたりすることでだいたい目的の動作が得られるようになっています。

アラームタイミングになると、オーディオセッションをマナーモードでも音が出るようにPlaybackに切り替えてバイブレーターを鳴らします。
(録音モードのままだとスピーカーの音量が自動的に抑えられてしまうというのもあります)

もう一つ苦労したのが、スヌーズのやり方です。
iPhoneを軽く叩いた事を検出すればいいだけなので一見簡単そうなのですが、同時にバイブレーターが動作しているというのが問題でした。
iPhoneを置いている場所(の硬さ)によってバイブレーター→謎の伝達関数→加速度センサの値が全然違うんですよね。

そこで、最初の一定時間は「謎の伝達関数」を推定する処理を行い、その後軽く叩いた動作を検出するようにしています。
最初の着想は簡単だったのですが、調整がとにかく大変でした・・・。

子育て中で、「寝てしまう!」問題にお困りの方がいらっしゃいましたら是非お試しくださいませ。

↓こちら
添い寝アラーム - RR Soft

Retina用@2xがついた画像から半分の解像度の画像を自動生成

iOSでは通常の画像(image.png)と、解像度が倍のRetina用画像(image@2x.png)を両方用意しないといけませんが、すごく面倒です。

そこでimage@2x.pngを入れるとimage.pngを自動生成するアプリケーションを作ってみました。
奇数の大きさを持つファイルや@2xが名前についていないファイルは何もしません。
また、既にファイルが存在している場合は上書きします。

remove@2x

縮小は4画素を平均して1画素を作る方法で計算しています(画素平均法)。
輝度の端数は切り捨てです。
png画像のみ対応。需要があればjpegも対応しますが、ひとまずこれで。

ダウンロード

何かありましたらコメントかtwitter(@rhotta)までお願いします。


Xcode4.3にしたらFileMargeが見つからない

↓ココにあります。
/Applications/Xcode.app/Contents/Applications/FileMerge.app

XcodeのメニューのOpen Developer Toolからも起動可能。

MacOSでも@2xのついたファイルのscaleが2.0になってしまう件

MacOSX(Lion)上で、NSImage – initWithContentsOfFileで画像ファイルを読み込んだ時、ファイル名に@2xがついているとNSImage.sizeの大きさが半分になっていることがある怪現象に遭遇しました。
ルールはわかりませんが、@2xがついていても半分にならないときもあり、すごい謎。

iOSで使うUIImageならば、@2xが付いているとRetina用画像ということで解像度倍なのですが、MacOSにはRetinaという概念はないはずなので@2xというファイル名で何かが変わるのは変だと思うのですが・・・。

なお、下記のようなコードでCGImageからサイズを取得すると正しいサイズが取得できます。

+ (NSSize)getImageSize:(NSImage*)image{
    CGImageRef cgImage = [image CGImageForProposedRect:nil context:nil hints:nil];
    NSSize imageSize;
	imageSize.width = CGImageGetWidth(cgImage);
	imageSize.height = CGImageGetHeight(cgImage);
    return imageSize;
}

という事はつまり、UIImageで言うところのscaleが2.0になっている、という事なのでしょうが、NSImageにはscaleプロパティが無いのでわかりません。

噂のRetinaMacOSXへの布石なのか、ただのバグなのか、はたまた僕の理解不足なのかわかりませんが、とにかく謎です。
分かる方いらっしゃいましたら教えて下さい。

環境はMacOS SDK 10.7,MacOS Lionです。

カレンダー

2012年4月
 1
2345678
9101112131415
16171819202122
23242526272829
30  

▲Pagetop