ひげろぐ

技術者として仕事人としての思うところや覚え書きやらです
Home      Profile      Works     
2010-07-29

Android開発環境の構築

備忘メモ。
IDEを使う気は今のところないのでシェルとVimでがんばる方針。
開発マシンはUbuntu 9.10 or Mac(Snow Leoperd)。

手順は以下。

* Java環境の整備
* Android SDKをインストール
* AVD(仮想デバイス)を作る
* プロジェクトを作る
* Hello worldしてみる

Java環境の整備

MacはSnow Leoperdに最初から入ってるやつを使う。
Ubuntuは以下のコマンドでインストール。antも入れておく。

$ sudo apt-get install sun-java6-jdk ant

64bit版の場合はia32-libsというパッケージもいるらしい。

Android SDKをインストール

以下のページからそれぞれのプラットフォームに対応したものを落とす。

落としたものを展開。
展開されたディレクトリ名には「-mac_86」とか「-linux_86」とか書いてあるけども、パス設定を共通にしたいのでその部分を取り除いて/opt/local以下に置く。

その上でandroid-sdk/toolsにパスを通す。激しく手動。

$ export PATH=/opt/local/android-sdk/tools:$PATH

.zshrcにも書いておく。

ここまでやった時点で

$ android

とコマンドを実行すると「Android SDK and ADV Manager」なるGUIが立ち上がる。
左メニューからInstalled Packageを選択して「Update all」するといろいろと落ちてくる。

これで一応SDKのインストールは完了。

AVD(仮想デバイス)を作る

仮想デバイスはいわゆるシミュレータ。
実機がなくてもAndroidアプリの動作確認ができる。

AVDの作成は上記のGUIでもできるがコマンドラインでも簡単にできる。

$ android create avd -n A16 -t 4

-nは –name の略。
適当に任意の仮想デバイス名をつける。

-tは –target の略。
仮想デバイスのOSバージョンごとに決まっているIDを指定するのだが、これは連番で振られているようだ。
どのIDがどのバージョンに対応しているかはGUIでの作成を見たら表示順でなんとなくわかる。たぶんどこかにまとまっているのだろうけど。

作成した仮想デバイスは以下のコマンドで起動できる。

$ emulator -avd A16

起動にはちょっと時間がかかる。

まあここまではIDEに依存しているわけではないので、GUIでもいいでしょう。

プロジェクトを作る

EclipseなどのIDEを使わない場合はコマンドラインで。従ってここからはコマンドライン必須。

$ android create project -n HelloWorld -t 4 -p /path/to/project --a HelloWorld -k com.example.Hello

これでできた。
オプションの詳細はDeveloping In Other IDEs | Android Developers参照。

Hello worldしてみる

作ったプロジェクトのディレクトリに移動してコードを書く。
コードは以下のチュートリアル通りに。

Hello, World | Android Developers

仮想デバイスで動かすときだけ以下のコマンド。
このantタスクはデバイスにアプリをインストールするためのadbというコマンドをラップしてくれているっぽい。

$ ant install

これで仮想デバイスにインストールされたアプリを起動すると、感動のHelloWorldが!

なおデバイスを起動しておかないとインストールできないので注意。

これで環境構築はおしまい。
あとはSDKのドキュメントなど読んでアプリ開発がんばる。

参考

ほか公式のDev Guideにいろいろとまとまっている。

2010-07-28

最近の個人的なiPhoneやらXperiaやら周辺の通信環境

今年になってからモバイルの通信環境についていろいろ検討していた。

現状はこうなった。

  • iPhone 4 パケットし放題フラット
  • Pocket Wifi ギガデータプラン
  • Xperia auから乗り換えてネット利用を一切やめた

Pocket Wifi分増えたけども、電話用の端末でのネット利用をやめたことで通信エンゲル係数はほぼ変わらず。

iPhoneとPocket Wifi

iPhoneに関してはiPhone 4予約時の縛りで使っても使わなくてもパケット通信料が4,410円。
そんなわけでPocket Wifiとの併用でiPhoneの通信費を抑えるという目論見は露と消えた。

実はiPhoneの通信をPocket Wifi経由にすると言うのは一時期やってみていたのだが、実際やってみるとiPhoneで通信を始める前にPocket Wifiの電源を入れなくてはならないというのは致命的に不便だった。
iPhoneの使い勝手が激しくスポイルされてしまい、正直その手間をなくすのに月3,000円くらいだったら払ってやるよ、といったレベル。
なのでiPhone 4予約時にパケットし放題フラットの契約縛りの文言を見ても迷わず予約した。

Pocket Wifiは宙に浮いてしまった形とも言えるが、外出時にiPadやノートPCを持って行く場合に積極的に使っている。
プランは今後の様子を見て調整していくつもり。

電話回線と実験機としてのXperia

Xperiaは電話用のdocomo回線のためと、Android開発にも最近興味があるので、実機確保としてゲット。
山間部でのバイクの故障や事故などの可能性を考えるとSoftbank一本化はちょっと厳しい。
OSが2.1にアップグレードされるというウワサをあてにして買ったので、もしアップグレードされなかったらちょっと悲しい。
ネットワークはWifiのみで利用している。

ガラケーでなくなってしまったため、キャリアからの通信のみに制限しているモバイルサイトは見られなくなってしまったが、出先での情報検索などはiPhoneにすでにシフトしていたので個人的な利用に不便はない。
仕事的にも簡単な表示確認だったら実機はなくてもできるし、逆に本格的に実機確認しようと思ったら自分が持っている一機種だけじゃどうせ焼け石に水なので問題はない。

・・・とか思ってたら携帯ソーシャルアプリがらみの仕事なんかではちょっと不便だったのがやや誤算ではあった。

にしても久々に店頭で携帯の契約とかしたけれど、料金プランとか口頭で説明されても理解不能。複雑すぎです。
いらんオプションもいろいろと勧めてくるし、通信費安くした分をそういうところでがんばって回収しようとしているのかな?とか思った。

2010-07-22

iOS開発で遭遇した謎のエラーたち

メモをあげておく。
基本をちゃんと理解してれば謎ではないんでしょうが。

unrecognized selector sent to instance hogehogeっつってるけど
  • 定義されてないメソッド、またはinterfaceで公開されてないメソッドを使った
  • 対象のオブジェクトを使った覚えがない場合はポインタが意図してないアドレスを見てる

後者はメモリ周りで以下のように適当にやってると起こる。

  • まだ使われているオブジェクトを解放してるかもしれない releaseしすぎ
  • またはautorelease対象を解放してるかもしれない releaseしすぎ

プロパティへの代入はセッターでretainされてるかされてないかちゃんと意識すること。

error: expected specifier-qualifier-list before ‘HogeController’
  • クラスが見つからないようだ
  • フレームワークとか他のクラスのヘッダファイルとかインポートし忘れてないか確認
  • 忘れてないのにアレだったら@classを使うとなんとかなるかもしれない

@classが必要なケースはいろいろとインポートしていて順序の前後関係がごちゃごちゃしている時?
よくわからず。

ユニバーサルプロジェクトがiPhoneで動いてくれません
  • 「データフォーマッタが一時的に使用できなくなっています。」って言われてもなんのことだか
  • UIKitをWeak LinkingにするとかNSClassFromStringを使うとかして解決
  • 参考:http://useyourloaf.com/blog/2010/6/21/symbol-not-found-errors-in-universal-apps.html
  • 参考:http://d.hatena.ne.jp/KishikawaKatsumi/20100625/1277476249
何も言わずに止まりやがる
  • コントローラのViewを作り忘れてるのにそれにaddSubviewとかいけませんよね
2010-07-08

RubyのoauthでSignature検証

なんかサンプルコードが見つからなかったので書いておく。

OAuth::Signitureというクラスが利用できる。

require 'oauth'

def verify(request)
  consumer = OAuth::Consumer.new(
    'SOME CONSUMER KEY', 'SOME CONSUMER SECRET',
    :site => 'http://api.example.com'
  )

  headers = oauth_headers(request)
  signature = OAuth::Signature.build(request) do
    [headers['oauth_token_secret'], consumer.secret]
  end

  signature.verify
end

def oauth_headers
  headers = {}
  request.env['HTTP_AUTHORIZATION'].split(',').each{|item| k, v = item.split('='); headers[k.strip] = v.gsub(/"/, '')}
  headers
end

OAuth::Signature.buildの部分は

signature = OAuth::Signature.build(request) 

だったり

signature = OAuth::Signature.build(request) do
  [nil, consumer.secret]
end

でよかったりすることもあると思いますよ。

コード解説

requestって何者

requestはRailsのコントローラ内で使えるものをそのまま渡せる。

Sinatraなどの場合もrequestという名前で定義されているものを基本そのまま渡せるが、以下のrequireが必要。

require 'oauth/request_proxy/rack_request'

requestは内部的にOAuth::RequestProxy::Baseのサブクラスに適宜変換される模様。

oauth_headersメソッド

oauth_headersメソッドはoauth_token_secretが取れなかったので作ったメソッド。

他のoauth_tokenなどの値はOAuth::RequestProxyを使うと取得できる。

request_proxy = OAuth::RequestProxy.proxy(request)
request_proxy.oauth_token
request_proxy.signature

などで取れるんだけど、なんでかoauth_token_secretは取れず。

自前でSignatureを求める

ついでにSignature Base Stringから自分で求めてみる方法も。

Signatureがどうしても一致しない場合の原因究明をする場合などに、自前でやる方法は把握しておくと役に立つ。
# というかRubyのoauthのドキュメントが整備不足なのでこのあたり自前実装している人が多いような気がする。

require 'openssl'
require 'oauth'

def my_signature(consumer, request)
  headers = oauth_headers(request)
  signature = OAuth::Signature.build(request) do
    [headers['oauth_token_secret'], consumer.secret]
  end

  digest = OpenSSL::Digest::Digest.new("sha1")
  secret = "#{escape(consumer.secret)}&#{escape(headers['oauth_token_secret'])}"
  signature_string = Base64.encode64(OpenSSL::HMAC.digest(digest, secret, signature.signature_base_string)).chomp.gsub(/\n/, "")
end

def escape(value)
  URI.escape(value.to_s, /[^a-zA-Z0-9\-\.\_\~]/) # Unreserved characters -- must not be encoded
end 

# oauth_headersは略

上記コードの自前Signatureを求めるあたりはroauthから拝借した。

Signature Base String求めるとこは手抜きして既存のOAuth::Signatureを使ったもので。
まあSignature Base Stringがおかしい場合は目視でわかるので、自分でSignature計算する前にまずはそこを見てみればいいのかも。

copyright brass.to | powered by WordPress ME