日本で原発から一番遠い場所
朝ブクマのエントリを眺めていたら、というエントリが上がっていた。
まあ、ハイパーなんとかさんにそんなに興味は無いんだけれど、実際のところ一番遠いところはどこだろうと思って昼休みマッピングしてみた。
reactor.html
上のリンク先で、距離を変えながらマッピングできるようにしてある
原発は台湾にもあるよ。という話かと思っていたんだが、台湾の原発から西表島ままでは 250km もある。よって原発から 250 km 圏内を描画してみると、こうなる。
北海道東部と、沖縄を除いてほとんど本州にいる場所はない。
ちなみに米軍の退去基準の80km だとこうなる
すべての原発に同時に異常が起きることは確率的にありえないので、この地図に大した意味は無い。
それでも、原発から離れたければ北海道か沖縄が良いのではないだろうかと思った次第。
Android SDK+Titaniumのインストール方法復習
Titaniumの記事が載りました!
gihyo.jpでもTitaniumについての記事を連載(http://gihyo.jp/dev/serial/01/titanium)させていただいているのですが、先日 Web+DB Press さんでも Titanium の記事を掲載させてもらいました。
http://gihyo.jp/magazine/wdpress/archive/2011/vol61
自分の担当分は Android についての解説でAndroidのIntentなどを駆使する方法を説明しています。
さて、TitaniuもAndroid も開発速度が早くインストール方法などがあっという間に変わってくるので、現在の状況を記述しておきます。Web+DB Press の捕捉です。
Android SDKインストール
まずは、SDKを http://developer.android.com/sdk/index.html からダウンロードします。ダウンロードが完了したら、解凍するだけでほぼ準備完了です。
自分の場合は解凍後、名前も変えて
/Users/kurain/AndroidSDK
というようなディレクトリにしています。
設置が終わったら、このディレクトリ以下にある tools/android をシェルから起動します。Finderからだと失敗することがあります。
android が起動すると、sdkのダウンロードとインストールが行えます。
こんな感じで、availabe package からSDKを選んでインストールします。この図では選択されていないのですが、"SDK Android Platform 1.6, API 4, version 3"も選択しておいてください。次期 Titanium 1.7.0 からサポート外になるはずなのですがまだ必要なようです。
adbにリンクをはる
これでインストールは終了なのですが、Titanium を使うに当たってもう一つ必要なことがあります。
いままで、android のデバッグツールである adb は Android SDKディレクトリ(以下[AndroidSDK])以下の tools にあったのですが、現在のバージョンではplatform-tools 以下に移動しています。そのためこのままではTitaniumが正しく動作しません。そこで、シンボリックリンクを貼ることで解決します。
ln -s [AndroidSDK]/platform-tools/adb [AndroidSDK]/tools/adb #[AndroidSDK]は各自置き換えてご利用ください。
これで、Titaniumがきちんと動くようになるはずです。
Androidのセットアップ方法は、
http://guides.appcelerator.com/en/getting_started.html#preparing_for_android_development
にも詳しく載っていますので、問題に当たった場合はこちらも参照してください。
個人でもGoogleAppsは便利だと気がついた
自分の持ってるドメインで mail サーバーを運用したいなーと思ったときに、VPSとか自宅サーバーよりも安定していて高機能だという事に気がついて設定した次第。
どうやって設定すればいいかは、google apps のアカウントを作れば懇切丁寧なチュートリアルがでるし、日本語の解説サイト(http://mage8.com/mymail.html)もあるので導入は超簡単。
これで、email 送りまくる web サービスも安心して作れるわー。
ということで、Email::Sender を使ってメールを送ってみる
use strict; use warnings; use Email::Sender::Simple qw(sendmail); use Email::Simple; use Email::Simple::Creator; use Email::Sender::Transport::SMTP; my $email = Email::Simple->create( header => [ To => '"Xavier Q. Ample" <x.ample@example.com>', From => '"Bob Fishman" <orz@example.mil>', Subject => "don't forget to *enjoy the sauce*", ], body => "This message is short, but at least it's cheap.\n", ); my $transport = Email::Sender::Transport::SMTP->new({ host => 'smtp.gmail.com', port => 465, ssl => 1, sasl_username => 'username@your.domain', sasl_password => 'yourpass' }); eval { sendmail($email, { transport => $transport }); }; if ($@) { my $error = $@; warn $error->message };
mac の人は http://www.riverturn.com/blog/?p=239 を参考に postfix で relay できるはずなのだが、まだ、うまくいっていない。
Phonegap と Titaniumを比較してみた
お久しぶりです。長らく放置してしまった Phonegap と Titanium Mobile の比較について書きたいと思います。
また、今週の水曜日 11/24 のはてな技術勉強会#2(http://d.hatena.ne.jp/hatenatech/)で Titanium について話しますので、お近くの方は是非はてな本社にお越しくださいませ。Titanium界隈で有名なid:donayamaさんも来られるようなのでドキドキですね!
色々ある XCode 以外の開発環境
前前回のTitaniumが楽しすぎてやばい - kurainの壺では、Titanium Mobile という Appcelerator が開発している iPhone アプリ開発環境を紹介しましたが、Titanium 以外にも iPhoneアプリを開発する環境はいくつか存在していて、有名なところでは Adobe Fash CS5 (Adobe AIR | Deploy applications) が対応しています。開発打ち切りのニュース(Adobe、Flash CS5のiPhone OS向けツールの開発を打ち切り | マイナビニュース) もありましたが、復活したみたいですね。
他にも、Phone Gapや Corona という開発環境があって、こちらの二つは Titanium と同様に iPhone だけでなく Android など他のモバイルデバイスでの開発にも対応しています。
ということで 今回は PhoneGap と比較するのですが、すでに英語の比較記事(iphone - Comparison between Corona, Phonegap, Titanium - Stack Overflow)がありますので、そちらも合わせて御覧ください。
また最初に謝っておきますが、PhoneGap を最初に使ったのは今年のはじめなので(最近の情報も確認はしていますが)微妙にアップデート出来ていないかもしれません。ツッコミ募集中。
PhoneGapを使ってみる
PhoneGap は XCode のテンプレートとして配布されているので、ダウンロードしてインストールが終わると、XCode の Project 作成画面で PhoneGap が選択できるようになります。これを選択すると、普通に iPhone アプリのプロジェクトが生成され、必要最低限の状態でエミュレータを起動できるようになります。
アプリケーションの実装は、プロジェクトの中のwwwディレクトリにある index.html を編集して行います。
Titanium との違い
PhoneGap も Javascriptで開発が行えるのですが、Titanium と大きく違うのは、ベースとなる HTML ファイルが存在すること。PhoneGap は HTML ファイルをアプリ内の WebView で描画することアプリを動かしています。よって基本的に書いていく Javascript のコードは所謂 Webアプリケーションと同じように DOM を操作したり、Canvas を使って図形の描画をしたりという事がメインになっていきます。
一方 Titanium は Javascript で書いて、ネイティブのコードに変換しています。よって固有のオブジェクトやメソッドを呼び出してアプリケーションを構成していくことになります。これは大きな違いです。
画面遷移の描画も両者には違いがあります。例えば Navigationコントロールを使って画面が右へ右へ遷移していく動作を iPhoneアプリ では良く見かけます。これを Titanium ではネイティブのナビゲーションコントロールを利用しているように見えますが、PhoneGapではCSSを用いて実現しています。未確認
HTML+Javascriptだけで大丈夫か?
HTMLだけでは、Cameraコントロールとか、加速度の取得とかどうするんだ。と疑問に思われそうですが、ここは当然そういったデバイス固有の昨日にアクセスできるオブジェクトが存在しています。
navigator.accelerometer.getCurrentAcceleration(accelerometerSuccess, accelerometerError);
のようなコードで加速度値を取ることができるようになっています。(引数はcallback function)
実行速度
TitaniumとPhoneGapを比較すると、ネイティブアプリに変換されるいる分 Titanium のほうが早いように思えます。しかし、iPhone4になりWebViewもだいぶ高速に表示されるようになっていますし、CSSによるアニメーションをGPUを使って支援する機能も WebView には搭載されているように見えます。実際のところどのくらい速度に差があるのかはつくってみないと分からなそうです。
PhoneGap or HTML5
お気づきの方も多いと思いますが、PhoneGapはWebアプリケーションをそのまま iPhone アプリに変換しているだけというようなところがあります。HTML構造の変更などは必要だと思いますが、同じようなことを HTML5 で構成した Webアプリケーションでも実現できます(デバイスのセンサー類は使えませんが)。とすれば Browser Storage などを駆使すればオフラインで動作する Webアプリケーションで事足りるかもしれません。違うのは App Store に載せられるかどうかという点だけです。
この点は非常に重要な違いですが Google は Web Application向けの課金も初めているわけで、Appleもそのうち何か良い仕組みを用意してくれないかなあーと個人的には思う次第です。
Titaniumが楽しすぎるのでAndroidも注文した!
Androidもちゃんとやりたいので、Froyoの機種を注文しました。
たくさんのブックマークありがとうございます。ブックマークチームにずっと在籍しているのに、こんなにブックマークを頂いたのは始めてです。
PhoneGapとの違いについては近日中にUpします。
栗ご飯をつくっていたら、時間がなくなってしまった。。。
Titaniumが楽しすぎてやばい
id:naoya さんの記事で気づいた Titanium ですがあまりに楽しいのでここ1週間ほど暇があればコードを書いています。そろそろ、プロダクトレベルのモノが仕上がりそうなので AppStore に提出したいところ。
ただし、iPhoneとAndoridアプリが一気に作れる、とか思ってさわると結構機種依存のコードを書く必要に迫られるので期待を裏切られます。ロジックのコードが共通化できるぐらいに考えていたほうが気楽だと思います。それでも、Cで書いてiPhone,Androidで共通化するよりはよっぽどらくだと思いますが。
最近は iPhone で動くことだけを考えて、実装しているので、今回は
- Objective-C で実装している時との比較
- はまりどころ
- PhoneGap との違い
をメモしておきます。
Objective-Cと比べて良い
メモリ管理不要
もうこれだけで、僕は移行したくなります。デストラクタも書かなくてよいし。
逆にいえば、細かいメモリの管理は難しいかもしれないですね。計測してないですが。
ちなみに計測するときは、Titanium で作った Project に Xcode プロジェクトがあるので、そいつをコンパイルして、Instruments と一緒に起動すればメモリ使用量なども計測できます。
call backが簡単
iOS SDK 4 でブロックが渡せるメソッドが出てきたとは言え、
imageView.addEventListener('load',fucntion(e){Ti.API.debug('image loaded');});
とか1行で書けるわけないですし。
開発サイクルがwebっぽい
とりあえず、書いて試して、の繰り返しがかなり早くできます。これは書き換えてから起動までが、かなり高速だからかと思います。
コードが短い
短くてすむということは、Objective-Cの用にに、ファイルも、クラスもたくさん作ってみたいなことが要らないわけで管理や見通しが楽になります。大体1ビュー1ファイルでも酷いことにはならないと思います。ModelとControllerを厳密に分ける必要性を感じない。
作っていて楽しい
Objective-Cが楽しくないわけじゃないのだけれども、あまりにサクサク作れるので不思議な高揚感が湧いてくる感じ。
Objective-Cと比べて悪い
ゲームとか、低レベルAPI叩くようなアプリを作成しないならあまり悪い点が思いつかない。しいてあげるなら、あるいは業務で使うならいかが問題かと思います。
使える外部ライブラリは減る。というより無くなる。
自分でラッパーをかけば使そう。でもメジャーなものは、既に中で使われているので案外必要に迫られないです。ASIHTTPRequest とか GDataのXMLParser とか。
詰まった時に自分で直せるきがしない
ちょっと前のバージョンまで、けっこう致命的なバグが残ってたみたいで、TitaniumのQ&Aを読んでると、バージョンあげると直ると書いてあることは多いです。かといってTitaniumの不具合を自分でパッチ書いて治すというのはちょっと大変かも。そういうバグに当たった時にどう対処するかが非常に問題になりそうです。
はまりポイント
バージョンアップも結構早いし、日本語ドキュメントは少ないしとハマるところは結構あります。
APIドキュメントよりKitchinSinkを見たほうが良い
当たり前といえば当たり前なのですが、開発ブランチの1.4.2や1.5.0などでは、WebにあるAPIドキュメントには書いてあるのメソッドやオブジェクトがなくなってることがあります。デモアプリのKitchinSinkの最新版は、Titaniumの最新版で動くようになっているので、こちらを見たほうが正確です。やりたいことが決まったら、KitchinSinkに近い実装がないか探す、コードを読む。という手順が良いと思います。
xhrでhtmlをとってきて DOM を作りたい。
ここから先は、自分がはまった細かい実装ポイント。
Titanium には document ノードが無いので、 HTML から DOMを簡単につくれません。
var xhr = Ti.Network.HTTPClient(); xhr.onload = function(){var xml = this.responseXML};
とやれば xml のパースはできますが、htmlだとエラーです。(parserはGDataの
XMLParserだし。)
速度を気にしないなら、YQLを使うほうが楽です
Ti.Yahoo.yql( "select * from html where url = 'http://b.hatena.ne.jp/' and xpath=\"//link[@type='application/rss+xml']\"", function(e){Ti.API.debug(e insetanceof 'Array' ? e.link[0].href : e.link.href )} )
みたいな感じで、サイトの rss がどこにあるか取れたりします。
画像をwebから取得したけどサイズがわからない
var window = Ti.UI.createWindow(); var imageView = Ti.UI.createImageView({ image:'http://htn.to/motemen', width:320 }); window.add(imageView); window.open;
で良しなに、画像を撮ってきて表示してくれるはずなのですが、これだとアスペクトがおかしくなります。ローカルにある画像なら大丈夫なのですが、リモートの画像だとうまくいきません。そんな時は、onloadイベントで、
imageViwe.onload(e){Ti.API.debug(imageView.toImage().width)};
とかやると、リモート画像の元の解像度が取れるので、そこから調整してやるといいと思います。ちなみにtoImageをonloadよる前によぶと表示領域にリサイズした画像が取れたりするので注意が必要です!
もっと書きたいこともあるし、すごい興奮してるのですが明日も早いので寝よう!!
だれか雑誌連載させて!と思うぐらい楽しい!
Titaniumビルド手順まとめ
id:naoya もすなるという Titanium を試してみようと思ったら色々とはまったのでまとめておきます。少なくとも僕の環境ではiOS 4.1以上の SDK を利用していると Titanium のダウンロードだけではダメで、自分での build が必要です。というわけで以下ではビルド方法から解説します。
今回は iPhone と Android を同時に開発するのが目的なので Mac の人だけが対象です Windows のひとはさようなら。
追記
id:maxy さんからコメントで
http://builds.appcelerator.com.s3.amazonaws.com/index.html
からダウンロード出来るのを教えてもらいました!コミット毎?でビルドされてて便利!
必要環境
- OSX Snow Leopard
- X code with iOS SDK 4.1 (4.2 beta2 ではうまく動きませんでした)
- Macports のインストール (homebrew とかでも大丈夫だとは思いますが)
セットアップ
Titanium の セットアップ前に Xcode のインストールは済ませておきましょう。開発者向けに4.2 Beta が手に入りますが、試したところ駄目だったので 4.1 がおすすめです。
http://developer.android.com/sdk/index.html
から、最新の OSX 向け SDK をダンロードします。その後、適当な所に解凍します。それから、コマンドラインで
sudo ln -s /Path/TO/Your/Android-SDK /opt/android-sdk
という感じでシンボリックリンクを貼っておきます。ビルドするときに必須です。
つぎに、コマンドラインから、次のコマンドを打って管理ツールを起動します。
/Path/TO/Your/Android-SDK/tools/android
左ペインの "Avairable Package" をクリックして、その後右ペインのリストにある、三角形をクリックしてこんなリストを出します。
この画面はセットアップが終わってる状態なので、出てないのですが
が選択できるので、選択した上で "Install Selected" をクリックしてSDKをインストールしましょう。
Titaniumの独自ビルド
Titanium を
http://developer.appcelerator.com/get_started
からダウンロードしてインストールするだけで、もう使えるはずなのですが、僕の環境(iOS SDK 4.1)ではうまく動かなくて、Titanium Mobile を自分でビルドする必要がありました。
というわけで、git でソースを取ってきます。
cd ~/src git clone http://github.com/appcelerator/titanium_mobile.git
で展開した、ディレクトリに入って、
scons
します。
scons がないときは
この、scons がクセモノで、pythonで書かれたmakeのようなものなのですが port でのインストールがよくこけます。依存しているdb46がよくこけます。
もしコケたときは
sudo port clean --all -f db46 sudo port selfupdate sudo port install scons
などするとうまくいきます。
これで scons が無事動けば、
~/src/titanium_mobile/dist
に、mobilesdk-1.5.0-osx.zip が生成されています。これを解凍して、中に含まれるmobilesdk/osx/1.5.0 を
/Library/Application Support/Titanium/mobilesdk/osx
にコピーすれば終了です。Titanium のプロジェクトの設定で、この新しい sdk を選択できるようになります。
これで、Titanium での開発が楽しめるはず!
http://github.com/appcelerator/KitchenSink.git
から、KitchenSinkプロジェクトをダウンロードして、Titaniumでビルドすると、使えるUIのショーケースが動かせます。個人的には、
'BaseUI' > 'Views' > 'TableView'
に pull to refresh という最近流行りのテーブルを引っ張って内容を更新するUIが入っていたのがとても印象的でした。
JSでサクッと書いて、まずはモックを作ってみるという用途にも使えそうです。この週末にでもなにかつくってみようかな。