2010/12/02

GDDJ-09をAndroid 2.2 (Froyo)化

以下のサイトから必要なファイルをダウンロードして、SDカードのルートに置く。
Host PC上で以下のコマンドを実行。

$ adb shell
# su
# flash_image recovery /sdcard/recovery-RA-sapphire-v1.7.0G.img
# reboot recovery

Android端末のHomeボタンを押しながら電源をOn。
  1. Wipe -> Wipe data/factory reset
  2. Flash zip from sdcard -> update-cm-6.0.0-DS-signed.zip
  3. Flash zip from sdcard -> gapps-mdpi-tiny-20101020-signed.zip
  4. Reboot system now
日本語化のためにMorelocale 2をインストール

2010/10/20

DataMapper.finalize

Sinatraと組み合わせて使うために、OR Mapperの1つであるDataMapperの勉強をしている。

まずはじめ、DataMapperを単体で使うテストコードを書いてみようと思ったのだが、どうにも正しく動作せずにはまった。原因は、DataMapper.finalizeの呼び出しを忘れていたためだった。

公式ページのGetting started with DataMapperには、belongs_toを使ってモデルが宣言されている場合、明示的にDataMapper.finalizeを呼んであげないと初期化できない、と書かれている。

はじめにちゃんとドキュメント読まないとダメだな。

2010/10/17

Sinatra + DataMapper: undefined method `auto_migrate!'

Sinatraを使ってみようと以下の記事の中で紹介されていたコードを動かしてみた。
すると、

$ ruby migration.rb 
migration.rb:7: undefined method `auto_migrate!' for DataMapper:Module (NoMethodError)
とエラーになってしまった。

調べてみると、migrations.rbに以下の1行を追加すればよいことが分かった。

require 'dm-migrations'

これで動作するようになった。

2010/07/24

AndroidからLighttpdにPOSTできない問題

AndroidからLighttpdにHTTP POSTすると、417エラー(Expectation failed error)が返ってきてしまう問題にはまった。調べてみると、Lighttpd 1.4では"Expect: 100-continue"に対応していないため、エラーになるようだ。

Lighttpd - Feature #1017: 'Expect' header gives HTTP error 417 - lighty labs

この問題を回避するためには、以下のようにすればよい。

HttpPost post = new HttpPost(url);
post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE,false);

はじめ、RubyのWEBrickを使ってプロトタイプ用にローカルにWebサーバーを起動していたけど、どうもHTTP POSTの処理が遅いのでCygwinのLighttpdに乗り換えたらこの問題にはまった。パフォーマンスの問題がなければ、WEBrickの方がお手軽でいいんだけどなぁ。

2010/07/08

日本のお天気レーダー アップデート 日別ダウンロード数

iOS 4で正しく動作しない問題があって、久しぶりにiPhone版「日本のお天気レーダー」をアップデート。

iTunes Connectという開発者向けのサイトでは、アプリの新規ダウンロード数、アップデートのダウンロード数が、それぞれ国別で分かるので、試しに公開後1週間のアップデートのみのダウンロード数を集計してみた。



アップデートをダウンロードするのは、アプリを使い続けているアクティブユーザーのみと考えれば、現時点で実際にアプリを使っている人は2万人ぐらいいる、と考えていいのかもしれない。累計のダウンロード数(アップデートは除く)は4万ぐらいなので、アクティブユーザー率はだいたい50%ぐらい。ちなみに、アクティブユーザー率はAndroid版アプリでも同じぐらい。

集計してみて驚いたのが、公開初日にアップデートするユーザーが多いこと。自分の場合、毎日App Storeを開いてアップデートすることはないのだけれど、結構みんなマメにアップデートするものなのかな。

ただ、今回のアップデートは正しく起動しないという致命的な問題のバグフィックスだったため、通常の機能追加のアップデートだったら、もっと緩やかにダウンロードされたのかもしれない。比較のために、次回アップデートのダウンロード数も集計してみよう。

2010/06/14

iPhone/iPadのSafariからTwitter for iPhone (Tweetie)でつぶやくブックマークレット

iPadのSafariでブラウジングすることが増えてから、SafariからTwitter for iPhone (Tweetie)にページタイトルとURLを送ってつぶやきたくなったので、ブックマークレットを書いてみた。

javascript:window.location='tweetie://post?message='+encodeURIComponent(document.title+' '+window.location)

TweetieのヘルプにあるブックマークレットはURLにしか対応してない。
調べてみたら、Tweetieのプロトコルは以下に書かれていた。
ページタイトルはdocument.titleで取得できるが、日本語のページタイトルにも対応するためには、messageに渡す文字列を、encodeURIComponent()を使ってエンコードする必要がある。

Twitterのつぶやきでよく、"これはすごい" の後にリンクだけ張られていることがあるけど、そういう時に自分はリンクをクリックすべきかで悩む事が多い。特に、短縮リンクになっていて、どこのサイトのページなのかも分からなかったり、外出先でiPhoneを使っている時に、クリックしてちょっと時間が経ってから、実は大したことないサイトが表示された時のがっかり感は相当なもの。

なので自分はリンクを張るときには、なるべくオリジナルのページタイトルも一緒につぶやくようにしてる。

2010/05/05

Squeezebox Touchの日本語化

Squeezebox Touchの標準のフォントでは日本語を表示できない。そこで、内蔵されているフォントを入れ替えることで日本語を表示できるようにしてみた。

参考にしたのは以下のサイト
まず、上記ページにもある通り、以下のページからフォント(arisaka.zip)を入手。
Squeezebox TouchのHomeメニューから、Settings > Advanced > Remote Login > Enable SSHをチェックすると、IPアドレスとパスワードが表示されるのでメモしておく。

メモしたIPアドレスと、パスワードを使って以下のコマンドを実行。([IP Address]の部分を、メモしたIPアドレスに置き換える)必要に応じてオリジナルのフォントのバックアップを取っておく。

$ scp ARISAKA.ttf root@[IP Address]:/usr/share/jive/fonts/FreeSans.ttf
$ scp ARISAKA.ttf root@[IP Address]:/usr/share/jive/fonts/FreeSansBold.ttf

その後、Squeezebox Touchを再起動すれば、日本語表示が可能に。

Squeezebox Touchを日本語化

2010/02/13

アプリ内からメールを送信するにはMFMailComposeViewController

iPhoneアプリを終了させずにメールを送信するには、MFMailComposeViewControllerを使えばOK。

サンプルコード(MailComposer)を見れば簡単に実装できる。MessageUI.frameworkを追加するのを忘れずに。

ただし、iPhone OS 3.0以降でしか使えません。

2010/02/07

日本のお天気レーダー、東京アメッシュと東京電力 雨量・雷観測情報に対応

先日リリースしたiPhoneアプリ「日本のお天気レーダー」をアップデートしました。
今回新たに、以下の2つのサイトの画像を表示できるようになりました。
東京近郊に住んでいる方には、東京アメッシュの方がより詳細な画像が見られて便利です。また、東京電力のサイトの画像では、雷雲・落雷の情報も確認できるので、用途に応じていろいろ使い分けが可能です。

また、アニメーション表示機能も追加しました。初め、シークバーでサクサク表示できれば、アニメーション表示はいらないかな、考えていましたが、やっぱりあると見やすくて便利な機能です。あと、片手でもズーム率を変更できるように、ズーム用ボタンを追加しました。

2010/01/19

iPhoneアプリ: 「日本のお天気レーダー」をリリース

日本各地のお天気レーダー画像を、iPhoneでサクサク表示可能なアプリを作ってみました。


 以前リリースしたAndroidアプリの中で、最も人気の高かったアプリ「日本のお天気レーダー」をまず移植してみました。まだまだ実装したい機能はたくさんあるのですが、まずはシンプルな実装で一度リリースしてみて、反応を見てみようと思います。

昨年の夏にiPhone 3GSを購入してから、iPhoneアプリを作ってみたいなぁとずっと思っていました。ただ、Objective-Cになかなか慣れることができなかったり、iPhone Developer Programへの登録をためらったりと、何度も入門に挫折しましたが、新年一発目の個人開発ネタとして、iPhoneアプリの開発に再チャレンジしてみました。

Android版とやっていることは同じで、Webから画像をダウンロードして、ローカルにキャッシュしたJPEGファイルを表示しているだけなのですが、やはりiPhoneの方が画像の切り替えがかなりスムーズ。同じアプリをiPhoneとAndroidの両方のプラットフォームに実装してみると、それぞれの特徴が分かって楽しいですね。

それにしても、やはりアプリの公開に関してはAndroidの方が圧倒的に簡単で手間いらず。Androidの方は自分の鍵を作ってアプリの署名をして、あとはアップロードするだけでもうすぐにAndroid Marketでダウンロード可能になります。

それに対して、iPhoneの方はいろいろとアプリ毎に設定が必要で、何とも手間がかかる。しかも、アプリをアップロードしてから実際にApp Storeで公開されるまでには、審査のために数日かかる。今回は3日でRedy for Saleとなり、以前に比べるとだいぶ早くなったようですが、やっぱりできるだけ早く公開できる方が気分的にいい。

Androidアプリの時は、Android Market上での露出の機会を増やすために、細かくアップデートを繰り返しましたが、iPhoneアプリの場合は、ある程度変更をまとめてアップデートした方が良さそう。

これからいろいろ試行錯誤してみます。

2010/01/06

UIImageのクロップの方法(How to crop a UIImage)

UIImageのクロップ(切り出し)方法が分からずにいろいろネットで調べてみたところ、以下の方法が最もシンプルなようだ。

- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
    CGImageRef imageRef = CGImageCreateWithImageInRect(
                            [imageToCrop CGImage], rect);
    UIImage *cropped =[UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    
    return cropped;
}

というメソッドを定義してあげた場合、

UIImage *croppedImage = [self imageByCropping:originalImage
                          toRect:CGRectMake(left, top, width, height)];

てな感じで呼んであげればOK。