hack my life
最近androidの開発をするのに、eclipseが定番ですが、eclipseが重くていやなので、非eclipse環境で開発するためのまとめです。ちなみに環境はMac OS Xですが、基本的にはどの環境でもいけると思います。

事前準備


必要なモノはandroidSDKとantを準備します。

android SDK
ここから入手ダウンロードして適当なフォルダに展開しておきます。展開したディレクトリ/toolsにパスを通しておきます。
ちなみに、Mac OS Xではこれだけだと、肝心なandroidの各バージョンのパッケージが入ってないので、tools/androidを実行して、立ち上がったウィンドウ > Avalable Packages必要なパッケージ(まぁ全部いれちゃっていいです)をインストールしておきましょう。

ant
antはJakartaプロジェクトで配布されているjava環境のビルドツールです。makeみたいなものですね。Mac OS XではXCode入れていればすでに入っていると思います。ほかの環境だったら、ここから入手してください。

プロジェクト作成

android create projectコマンドを使います
android create project
--target ターゲットID
--name プロジェクト名
--path /path/to/project
--activity アクティビティ名
--package パッケージ名

ターゲットIDはandroidで定義されるAPIレベルを指定します。どんな指定をすれば良いかは、android list targetコマンドで確認できます。

ex) android create project --target 4 --name sampleproj --path ./ --activity ExampleApp --package net.hackmylife.sampleproj



ビルド

ビルドはantを使います。antではデバック用とリリース用に分かれていて、デバック用のパッケージをビルドするときは

ant debug
と打てば自動でビルドされます。ちなみにantでビルドするためにはbuild.xmlが必要ですが、android create project で作れば自動的に生成してくれます。(eclipseで作ったプロジェクトは生成されてなかった)


リリース用のパッケージは
ant release
で生成できます。がこのままだと、インストール時に署名がないと怒られます。androidでは署名の入っていないapkはemulatorにすらインストールできません。先のant debugでビルドした場合は自動でデバック用の署名をいれてくれますが、androidマーケットでは配布できません。リリース用に署名をする必要があります。

署名のしかた

keytoolコマンドで生成できます。

keytool -genkey -v
-keystore キーストア名
-alias 別名
-keyalg 生成アルゴリズム
-validity 有効期限(日)

一つ大事な点として、androidマーケットにだすためには、キーストアの有効期間の終了日が2033年10月22日以降になるようにしないといけません。10000日以上が推奨されているようです。

ex) keytool -genkey -v -keystore hackmylife.keystore -alias hackmylife -keyalg RSA -validity 10000

コマンドを入力するとパスワードとロケーションをきかれます。特に注意する点はありません。
keystoreができたらjarsignerで署名をします。

jarsigner -verbose -keystore キーストア名 ビルドするアプリ名 キーストアのエイリアス

ちなみに、keytoolとjarsignerはandroidの独自ツールではなくjava付属のツールです。

ex ) jarsigner -verbose -keystore hackmylife.keystore MyApp.apk hackmylife

署名が必要なのは、あくまでreleaseパッケージのみです。debugパッケージはantでビルドするときに、debug.keystoreで署名してくれるので、手動で署名する必要はありません。が、ごくまれにemulatoreにdebugパッケージをおインストールしようとすると、署名がされていないとエラーになることがあります。ML等でもちょくちょく報告があるみたいですが、emulator側のバグのようで、一度インストールされているパッケージを明示的にアンインストールすると良いようです。それでもだめな場合は、バーチャルデバイスを一度作り直すしかないようです。



emulatorの環境作成(avd作成)



androidのemulatorは各バージョンごとの仮想デバイスを作成する必要があります。
android create avd
-n 仮想デバイス名
-t ターゲットID

前にも出てきましたが、どのandoroidのバージョンがどのターゲットIDかはandroid list targetsでみれます。

ex) android create avd -n avd7 -t 7

emulatorを起動する際に、仮想デバイスが複数ある場合はデバイス名を指定する必要があります。

ex) emulator -avd avd7

emulatorや実機にインストール



インストールはadbコマンドを使います
adb -e install MyApp.apk

adbコマンドに-eオプションを指定すると、emulatorにインストールします。
実機いインストールするのはとても簡単で、実機をUSBで接続し、-eオプションの代わりに-dオプションを指定するだけです。あっさりインストールできます。このあたりはiPhoneよりかなり簡単ですね。



ログの確認

adb -e logcat

こちらも同じくオプションで取得先を変更できます。もちろんgrep等でフィルタすることも可能です。

とりあえずこのあたりがあれば、プロジェクト作成から、実機での動作確認まではいけると思います。
eclipseが重くてヤダなーと思っている人はコマンドラインからの開発に乗り換えるとかなり快適です。
といってもemulatorだけはどうにもならないので、そこだけは我慢が必要です。eclipse経由で使っていたときよりは安定している気がしますが、どうなんでしょうね?

エロアプリがOKな事だろjk

とまぁ釣りな事いっておいて、携帯はiPhoneでタブレットをAndroidにするのが良いのかなーと思う今日この頃。
iPhone4 ≒ iPad nano 3Gって思うことにしました。

ごきげんよう

愛用されている方も多いエネループに限定パッケージがでてました。

8本の単三電池が8本とも違うカラーリング!
これがまたオシャレでカワイイのです。
取りあえず一つ購入しておきました。

SANYO NEW eneloop tones 充電式ニッケル水素電池(単3形8色カラーパック) HR-3UTGA-8TN
三洋電機 (2009-12-12)
売り上げランキング: 43
おすすめ度の平均: 5.0
5 1億個突破記念 10万個限定の eneloop tones
5 わかりやすい
5 電池を見せる工夫をした製品が増えることを期待します
最近Google AnalyticsのMobile版がひっそりと始まりましたね。
ホントにひっそりで、場所がわかり辛いのですが、

https://www.google.com/analytics/settings/check_status_profile_handler


ここの、

  1. Instructions for adding tracking
  2. Advancedタブ
  3. 1 What are you tracking?
  4. A site built for a mobile phone
を選択するとでてきます。

導入方法 Perl編

  1. 「2 Paste code on your mobile site」のコードをviewから呼び出せるところに準備
  2. htmlあたりに<img src="[% google_analytics_get_image_url() %]">書く
  3. 「3 Copy this file to your root directory」にあるga.plをcgi起動出来るように設定するか、同様の内容を作る

さっそく導入してみたんですが、どうもsessionの同定が出来てないっぽいです。
別集計で出したUUが2,000ぐらいなのに、Analyticsだと10,000になっていたりします。
なんでかと思い調べたところ・・・

# Generate a visitor id for this hit.
# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.
sub get_visitor_id {
  my ($guid, $account, $user_agent, $cookie) = @_;

  # If there is a value in the cookie, don't change it.
  if ($cookie ne "") {
    return $cookie;
  }

  my $message = "";
  if ($guid ne "") {
  # Create the visitor id using the guid.
    $message = $guid . $account;
  } else {
  # otherwise this is a new user, create a new random id.
    $message = $user_agent . get_random_number();
  }

  my $md5_string = md5_hex($message);

  return "0x" . substr($md5_string, 0, 16);
}

ん?

# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.

あれ、docomo以外みてくれてない・・

というわけで修正しました。独自でやってもできるけどキャリア判別とかが煩雑だったので、HTTP::MobileAgent使っています。0.27以降がdocomoID対応なんで、それ以降を使います。


--- ga.pl	2009-11-12 21:27:23.000000000 +0900
+++ ga.pl.new	2009-11-12 21:22:04.000000000 +0900
@@ -6,6 +6,7 @@
 use Digest::MD5 qw(md5_hex);
 use LWP::UserAgent;
 use URI::Escape;
+use HTTP::MobileAgent;
 use strict;
 
 # Tracker version.
@@ -59,9 +60,10 @@
   }
 
   my $message = "";
-  if ($guid ne "") {
-  # Create the visitor id using the guid.
-    $message = $guid . $account;
+  my $user_id = _get_user_id();
+  if ($user_id ne "") {
+  # Create the visitor id using the uesr_id.
+    $message = $user_id . $account;
   } else {
   # otherwise this is a new user, create a new random id.
     $message = $user_agent . get_random_number();
@@ -192,4 +194,14 @@
   write_gif_data($new_cookie, $utm_url);
 }
 
+sub _get_user_id {
+    my $agent = HTTP::MobileAgent-&gt;new; 
+    return $agent-&gt;user_id
+        if $agent-&gt;is_docomo;
+    return (split('_', $ENV{HTTP_X_UP_SUBNO}, 2))[0]
+        if $agent-&gt;is_ezweb;
+    return substr($ENV{HTTP_X_JPHONE_UID}, 1, length($ENV{HTTP_X_JPHONE_UID}))
+        if $agent-&gt;is_vodafone;
+}
+
 track_page_view();


当て方はga.plと上のga.pl.patchを同じディレクトリに置いて

$ patch -p0 < ga.pl.patch


このパッチでは、端末ID送信しない設定の端末とか、端末ID送信しないwillcomとかをスルーしちゃいます。厳密に計測するには、アプリケーション側で端末IDみて、なければユニークなID(session id)とかを使うべきですが、これだけでもそこそこの制度がでるので、さっくりやりたい人はこっちで良いと思います。

YAPC Asia 2009に参加してきました。

今回のYAPCではAnyEvent,PSGI,Coro,リアルタイムWeb辺りがポイントだったかと思います。
見た物のなかから一部をピックアップして書いておきます。

Yoichiro Tanaka - ‎Webエンジニアのためのmixiアプリ開発ガイド‎

mixiアプリの解説でperlの話しはあまり出てませんでした。
が、個人的には非常に面白かった。mixiアプリを全然チェックしてなかったのですが、
feedとかJSONのAPIあれば簡単に作れてしまう所が良い感じ。

実装的にはXMLのファイルの中のCDATAセクションにjsを書いて、OpenSocialのライブラリを使って、API接続してゴニョっとする感じ。
マイミクやコミュの情報を使うには独自のAPIを使わないとダメ。OpenSocial準拠ではるけれど、各サービスによって独自APIを使っているので、
簡単に移植と言うわけにはいかないそうですけど、mixiの1700万ユーザーというのはやはり魅力。

家にかえってから、思わず勢いで作ってしましました。そのうち別記事として書いてみたいと思います。

Tokuhiro Matsuno (‎tokuhirom‎) - ‎PSGI - Perl Server Gateway Interface‎

コレが、Perlの話しとしては今年の2大トレンドのウチの一つじゃないでしょうか?
PSGIは表題にあるとおり、Perl Server Gateway Interfaceの略で、実装ではなく、あくまで仕様とのこと。

要するに、「Webサーバーやフレームワークが新しく出る度に、コードを書書くのはやめよう」という、Rack/WSGIの思想をPerlで作ろうというもの。
同じ思想でHTTP::Engineが思い浮かぶと思うんですが、HTTP::Engineは仕様+実装+インターフェースが含まれていて、
みんなに使ってもらうには、余分な実装が含まれ過ぎていた事が原因でなかなか浸透しないようで、HTTP::Engineから仕様を切り出してまとめたものだそうです。

このセッションでは、PSGIの概念だけでなく、実際にPSGIに準拠した実装であるPlackによるデモも行われました。
CatalystでかかれたコードをMojoで動かしたり、fastCGIで動かしたりとなかなか面白いデモでした。

Plack::Impl::Sledgeが非常に欲しいですね。

Tatsuhiko Miyagawa (‎miyagawa‎) - ‎Event programming fun with AnyEvent and Coro‎

AnyEventの解説。これが今年のトレンドのもう一つですね。ちょっと前から非常に興味があったんですが、今回のYAPCでも何度となく出ていました。
要するにPerlでEventプログラミングをするためのmoduleです。PerlにはPOEとかEVとかIO::Poll、IO::Async等々色々なmoduleがあるのですが、
AnyEventはどんなEvent系モジュールでも対応できる実装があります。AnyEventには独自のメインループを持っておらず、上記のmoduleをと組み合わせて使います。

AnyEventのメリットはシンプルで非常にわかり易いインターフェースで、POEなどのややこしい構文を書くことなくプログラミングできます。
AnyEventとCoroを使ったプログラミングがかなりアツイんですが、AnyEvent自体の説明が結構ボリュームがあって、Coroの説明は省略されていました。(後述のmalaさんのセッションでCoroの話しがあったから?)

Kazuhiro Osawa (‎Yappo‎) - ‎Key Value Store with O/R Mapper

Data::Modelのお話。いわゆるORMなんですが、Data::Modelは近年のORMとはちょっと違っていますね。実際使うためのチューンが大量にされている感じ。
基本的には、薄く早くと作られたORMで(JOINす削られている)という徹底ぶり。cacheもテーブル名やカラム名をアルファベット1文字や数値に書き換えてキャッシュする事で、サイズを節約してたりするようです。

個人的には一番使ってみたいORMだけど、癖があるので、使いどころをちゃんと考えないと、いけないので、業務でつかうのはちょっとためらう感じ。

Atsushi Kobayashi (‎nekokak‎) - ‎simple or mapper DBIx::Skinny

こちらもORM。Data::Modelと同じく薄く、薄くと意識してつくられたDBM。
実は、DBICが生成するSQLが非常にパフォーマンスがわるいそうで、もっとシンプルで計量なSQLをそのまま実行したい。という思想から作ったそう。
大分安定してそうだし、現在のORMの感覚でつかえそうなので、実際に仕事でつかうなら、コレを使ってみたいです。

Masahiro Nagano (‎kazeburo‎) - ‎大規模画像配信を支えるPerl‎

mixiさんでの画像配信の仕組み。BlogとかでもServer構成がかかれているので、目新しいといより、「ああ、そうですよねー」という感想。
mixiではクオリティと速度を勘案してlmlib2を採用しているそう。弊社のモバイルチームでも最近画像配信系を一新しようと思っているんですけど、
うちもlmlib2で行こうとおもっていたので、妙に納得しちゃいました。

Tokuhiro Matsuno (‎tokuhirom‎) - ‎Asynchronous Database Queries with Perl‎

ここでもAnyEventでてましたね。シリアルでSQL投げると、全部の実行時間の合計が実行時間になってしまうので、重いSQL何個かなげるなら、非同期で処理しちゃおうという話。
PostgreSQLだと非同期に処理するのはDBD::Pgでいけるらしいのですが、DBD::MySQLは非同期で処理できないので、libdrizzleを使うといいらしい。
機会があれば是非使ってみたいところです。

ma la (‎mala‎) - ‎Asynchronous Programming for (A)synchronous Communication‎

AnyEvent+Coroあたりの話しがメイン。以前Shibuya.pmでlivedoor Readerのインターフェース側の話しをされていたのですが、
今回は内部の話し。crawlerのパフォーマンスチューニングにAnyEvent+Coroでシングルプロセスないで、IO非同期化したほうが、
プロセスを沢山あげるよりパフォーマンスが良かったという話しから、非同期プログラミンの今後ロードマップまでするどい視点で考察されてました。

今回のAnyEvent期を総括するようなセッションで、一番面白かったセッションでした。40分のセッションだったのですが、内容盛りだくさんだったので、
後3回ぐらいは動画と資料を眺めてみたいと思いました。

見たセッションのなかからいくつかピックアップして書いてみました。
Lightning Talkでも面白いかったセッション沢山ありました。また後で書いてみたいと思います。

今回のYAPCも非常に刺激的で面白かったです。見れなかったセッションにも面白い物が沢山あったようで、
あとで動画で見させていただこうと思っています。

アドセンス

MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore
MoMAstore
MoMAstore
MoMAstore

Photos

  • vimparator3.png
  • vimparator2.png
  • vimparator1.png
  • CA350288.JPG
  • CA350256.JPG
  • CA350344.jpg
  • keynote08_2.jpg
  • keynote08.png
  • malanoche.jpg