ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2013年4月18日木曜日

Androoidの開発の面倒なところとか

何箇所か言えって言われたらすぐに出てきますが、解決できる部分に関しては何とかして行きたいって考えでイロイロやってます。

以前作ったのは、コマンドラインから端末のスクリーンンショットを撮影するスクリプト。

adbscreen
https://github.com/numa08/adbscreen

monkeyrunnerを利用して、シェルスクリプトと組み合わせてスクショの撮影を行います。

最近はバイナリのインストールやデバッグ時にIntentを投げたり、Android端末からフォームに入力したりをすべてコマンドラインから済ませようとする癖がついて(マウスや端末に手を伸ばすのが面倒)きたので、開発PCに接続している端末全てに同じ操作を行うスクリプトをチョイッと書いた。


ちゃんとデバッグしてないけど、だいたい動く。

こういうのをまとめてAndroidのデバッグサポートスクリプトとかにしたいなー?って考えるけど、たぶんadbのコードをいじって拡張するのが正解だと思う。



2012年10月17日水曜日

【アップデート】タイムキーパードラ娘



タイムキーパードラ娘をアップデートしました。

Android app on Google Play


技術的な面では、今回はFragmentを活用し携帯電話とタブレットでそれぞれのレイアウトを適用しています。

ロジックも改修を加えました。以前のバージョンは、見かけ上問題なく動いていましたが、実は車輪の再発明を行なってしまっていました。

今後のメンテナンス性を考慮して、極力AndroidのAPIを利用しています。

デザイン面も、俺にしては頑張りました。

リリースするアプリでDraw9Patchを利用したのは今回が始めてですね。

来るべきAndroid4.0時代(というか、はよ来い)に向けてのアプリとなっています。

ただ、恥ずかしいのはJavaの知識がなかった際に、作成、公開をしたアプリなので

パッケージ名に大文字が含まれているんですよね。ちょっと、そこダサい。

今から変えられないしなぁ。

2012年9月10日月曜日

JenkinsでAndroidのユニットテスト+リリースビルドまで自動化


そういえば、LinuxでJenkinsを動かしてAndroidのビルドとかやってたけど、

記事にまとめて無かったや。

やったこと
・前準備色々
・Jenkinsの設定をする(OS:ScientificLinux)
・Androidのアプリのプロジェクトを複数のOS,ディスプレで自動でデバッグビルドする
・Androidのアプリのテストプロジェクトを自動でビルドし、実行する
・Androidのアプリのプロジェクトをリリースビルドして、回収する。
・テストのカバレッジを←文字化け発生する


前準備
・ライブラリ群のインストール
yum -y install glibs-devel.i686 zlib-devel.i686 libstdc++-devel.686

何よりもここが面倒くさかった。

・antのインストール
#wget http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.3-bin.tar.gz
#tar xzf apache-ant-1.8.3-bin.tar.gz
#mv apache-ant-1.8.3 /usr/

・Androidプロジェクトを作る
ディレクトリの構成を
-Root--AppProject
--TestProject
--hoge.keystore

としておくと色々捗ります。

JenkinsやJDKのインストールは終わっているということにしましょう。

・Jenkinsの設定。
今回は、Gitのリポジトリをポーリングします。
・公開鍵の作成
#sudo -u jenkins ssh-keygen -t rsa
#sudo -u jenkins cat /var/lib/jenkins/.ssh/id_rsa.pub

こうして出来上がった公開鍵は、自分の環境に合わせて鍵の登録とかやっちゃってください。

・プラグインのインストール
Jenkins Gti Plugin
Android Emulator Plugin
をインストールします。

・AndroidSDKの設定
Jenkins→設定 から
プラグインがインストールされていると、現れる
Android
の項目。
AndroidSDK root:/var/lib/jenkins/tools/android-sdk を入力
Automatically install Android components when required にチェック





・antの設定
Ant項目の
名前:ant1.8.3
ANT_HOME:/usr/apache-ant-1.8.3

キャプチャは1.8.4

・プロジェクトを作る
新規ジョブの作成 から
ジョブ名:なんか適当
マルチ構成のビルド を選択

ソースコード管理システム
Git
Repository URL: git@hogehoge
Branches to build **
リポジトリブラウザ:自動

URL抜いたから赤字出てる。気にしないで。

ビルドトリガ
SCMをポーリング
スケジュール;1-59 * * * *

毎秒確認ってことですね。

マトリクスの設定
値の追加→ユーザ定義
名前:OS
値:2.3.3 3.0

名前:display
値:WVGA HVGA WXGA

名前:density
値:170 240



組み合わせフィルタ
フィルター:(!(OS!="3.0"&&display=="WXGA"))&&(!(OS!="2.3.3"&&display=="HVGA"))&&(!(density=="170"&&OS!="2.3.3"&&display!="HVGA"))&&(!(OS=="3.0"&&(display=="WVGA"||display=="HVGA")))







ビルド環境
Run an Android emulator during buildにチェック
Run emulator with properties にチェック

Android OS version:${OS}
Screen density:${density}
Screen resolation:${display}
Device locale:ja_JP


Common emulator options
Show emulator window のチェックを外す

これ付いてると詰むよ

ビルド
#アプリをサーバーのantでビルドできるように設定する。
ビルド手順の追加→シェルの実行
cd ${WORKSPACE}
export PATH=$PATH:/var/lib/jenkins/tools/android-sdk/tools:/usr/apache-ant-1.8.3/bin

echo Update Project
android update project -p ./ProjectName
echo Update Test Project
android update test-project -p ./ProjectName -m ${WORKSPACE}/Appname

echo Setting Release
cd ${WORKSPACE}/ProjectNamer
echo "key.store=${WORKSPACE}/hoge.keystore" >> ant.properties
echo "key.store.password=hogehoge" >> ant.properties
echo "key.alias=hoge" >> ant.properties
echo "key.alias.password=hogehoge" >> ant.properties

秘密の情報無いよな・・・

#アプリのデバッグビルドを行う
ビルド手順の追加→Antの呼び出し
使用するAnt:ant1.8.3
ターゲット:clean debug install
ビルドファイル:${WORKSPACE}/ProjectName/build.xml
#テストプロジェクトのビルドと実行を行う
使用するAnt:ant1.8.3
ターゲット:clean emma debug install test
ビルドファイル:${WORKSPACE}/TestPorject/build.xml
#リリースビルドを行う
使用するAnt:ant1.8.3
ターゲット:clean release
ビルドファイル:${WORKSPACE}/ProjectName/build.xml
ビルド後の処理
ビルド後の処理を追加→成果物を保存
保存するファイル:**/ProjectName/bin/*release.apk


うぉーなげぇ

プロジェクトのトップに戻ると、構成マトリクスができています。
フィルタの設定を確認するには、要素の上にマウス持って行ってリンクが貼られてたら、
フィルタされてない場所ってことみたいです。

さて、Android4.0.3からAPI(CPU?)を洗濯する必要があるわけですが、
エミュレーター設定のABIの項目に変数を入れても、
エミュレーター作成時にうまく読み込んでくれないみたいです。

というわけで、多分4.0系統は別のプロジェクトにしちゃうのが正解なんじゃないですかねぇ?

多分。


2012年8月26日日曜日

スマ勉関東#20 に参加した


休講情報のスクレイピングは、誰でもやるんだなぁと

スマートフォン勉強会#関東20に参加してきました。

開催日前日の23:30くらいにいきなり登録して、LT登壇までさせていただけるとは・・・酢酸先生には

足を向けて寝られませんね。

@icchucさんの「夏期講習 WindowsPhone7開発トライアスロン傾向と対策」


セカンダリタイルを使うWindowsPhoneトライアスロン第2弾の対策。

タイル作れるよーとか、WEBから画像取ってこれるよーとか、適当に更新できるよーとかそんな話。

相変わらず、WindowsPhoneって制限厳しいよなぁとかちょっと思いました。

ただ、コードはそんなに冗長にならないってのはいいと思います。Javaとは何だったのか・・・


@nullpooさんの「東京電機大学 学生ポータルサイトUNIPAからの情報抽出と再利用」


残念な学生ポータルサイト「UNIPA」の情報のスクレイピングと再利用の話。

どのへんが残念か、それはもう全体的に・・・

なぜか新しいウィンドウで表示されるログインページや、暗号化されていない通信内容、

統一されていない情報の書式などもう、お役所仕事って感じの残念さ。

休講情報をスクレイピングして、APIとしてアクセスできるようにしたり、マイニングして休講を予想(予報)

したりなんてこと。

休講情報のスクレイピング自体は、自分も試したことがあって、ヘッダーが定義されてない残念なHTMLを解析してましたが、

懇親会の話の流れ的に「あるだけまし」という・・・恐ろしい世界やで。

夏休みでテストができないということなので、その辺はアルアルって感じのネタですね。



tmytさんの「某Music Unなんとかみたいなことがしたい」


まあ、普通一家に一台くらいはあるサーバーを活用して、自前の音楽配信サービスを作ろうと言う話。

非常に面白いと思います、思いますが、実はグレーだったような気がします。うろ覚え。自前のVPNを利用していたとしても、

その場に音楽のファイルがない状態で視聴可能な状態を作るのはJasrac的に駄目だったような。

まあ、かなり理不尽なアレですけど。

いつの日か、この辺をもっとオープンにできるような社会にしたい・・・。


次の片山さんのセキュリティの話は割愛。

で、LT

自分はNexusQの使い方の提案というか、妄想を語って来ました。

「NexusQを銭湯で使えないかなぁ」って話。

資料自体は即興で作ったものですが、ネタ自体はずっと考えていたことです。

まあ、立ちはだかるものは多いですよ。

でも、騒いでもいい銭湯ってあっても良いと思うんですよね。騒いでもいい映画鑑賞会なんてものもあるんだから。

節度と、適度な制限、ルールがあればなんとかなる気がする・・・。銭湯経営事業に手を延ばすことがこの先

あるのかわかりませんが。


で、懇親会で酢酸先生に言われてしまいました「次回はスピーカーをお願いします^^」

やった

人前で話すのは好きです。

NexusQの話を拡張させるか、あるいは最近ハマってるTDDの話をするかはわかりませんが、なんか話します。

ワクワクだね!!

2012年8月12日日曜日

[Androidアプリ]多機能日付計算機アップデート


JavaのHTTP通信は残念だと思った・・・。

という訳で多機能日付計算機をアップデートしました。

DLはこちらから。

https://play.google.com/store/apps/details?id=jp.teres.numa.DateCalculator

前から実装をしたかった「土日祝日を取り除いた、平日のみの計算」をようやく実装しました。

と言っても、「期間計算」の方だけですが・・・。日数計算の方は明日からやります。

実装は簡単で、Googleカレンダーの「日本の祝日」からJSONで祝日を貰い引き算しているだけ。

土日の除去は、目的の日に達するまでの間ひたすら足し算(または引き算)をしているだけ。

そんな訳で、パーミッションに access.internet を追加してます。

通信部分の実装は、APIを叩くのではなくライブラリ AQuery を利用。

http://code.google.com/p/android-query/

AjaxのXMLHttpRequest風にコードを書けるので楽です。

ただ、JavaなのにJS風の書式を挟むことになるのでその辺理解しておかないとあっという間に納豆コードを生み出す原因になりそう。

便利は便利です。やっぱり、わかりきっている処理を書いて冗長なコードを生み出すのは嫌なので。

そのために、例えば通信部分のオレオレライブラリとか作ってもいいんですけどね。

という訳で、是非ダウンロードして使ってみてくださいな。

ちなみに、今バグを見つけてしまいました・・・orz

明日直す・・・直すよ・・・

2012年7月4日水曜日

ADK2012がやってきた

GoogleI/O二日目のセッション"ADK2.0"に参加すると、引換券が貰える。それをGear Pick Up(おみやげ配ってた所)に持って行くと、ADK2012をもらうことができた。

引換券表

引換券裏
 前回のADKはArduinoMegaをベースに色々とセンサーを乗せたものだったが、今回は明確に目覚まし時計となっている。

目覚まし時計

ご開帳

別アングル
 目覚まし時計としての他、オーディオファイルの再生機能も持っているらしい。

本体内部にセンサー類が搭載されていて、NFCや加速度センサー、温度センサー、光センサーなどが利用可能。

制御用のアプリケーションも配布されている。ADK2012

起動画面。BluetoothかUSBで接続する。

スタート画面。色々な機能にアクセスできる。

アラーム設定画面。

LEDの色の設定画面。
なお、目覚まし時計ADK単体で設定が可能だし、オーディオファイルの再生はAndroid4.1以降の端末ならBluetoothでファイルを送信して再生することが可能。


ソースコードやIDEは既に公開されている。Arduinoを搭載しているのでProcessingが利用可能だが、セッションではCを利用していた。

端末とはBluetoothかUSBで接続をするが、USBの場合は両方の端子がMicroBとなっているケーブルを利用する。

無線による通信のサポートがここまで行き届いているのは有難い限り。

しかし、気になるのはアナログ、デジタルI/Oポートが無い点。今回はADK単体とAndroidで完結する物作りに制限されるということだろうか。

あるいは、ボードを取り外すことができるのか?

サンプルコードを読んだりしてなんかやろうと考えてます。NFC使いたい。

今後の販売などのアナウンスはまだ出てないようです。でも、その内出るのではないかな?

しかし、所詮Arduinoなので適当なボードとシールドを買ってくれば同等のものが実装可能なハズ。そういうアプローチで「ADK2012俺Ver」とかやるのも、面白いのかもしれません。

2012年6月28日木曜日

JellyBeansがやってきた #io12 #io12j

おはようございます、numa08です。Google IO 12で配布されたGalaxyNexusとNexus7にAndroid4.1 JBが降って来ました。

jbのロック画面。ロック解除とカメラの起動に加えて、GoogleNowを立ち上げられる。



GoogleNowの起動画面。特に設定することなくすぐ利用可能。

USBデバッグのアイコンの形状が変わりました。

これはNexus7。Android4.1が搭載されている。

手元に、API依存を強く引き起こしそうなアプリが無いので詳細な検証は行えないのですが、とりあえず降ってきた報告だけ。
日本でも今夜辺りには配布されるのではないでしょうか・・・?

2012年6月16日土曜日

Jenkinsを一般ユーザーで動かす

LinuxでJenkinsを動かすと、ユーザー jenkins が作成され、専用のホームディレクトリなどが生成されてその上で動作をする。

Linuxのデーモン達と同じ様な感じ。

ただ、今回は一般ユーザー numanuma08 で動作をさせたいと思う。

その目的は、Androidのエミュレーターの実行画面を見たいから。

ユーザー jenkins を一般ユーザーにするのもアリかもしれないけど、 なんかイヤなので。

以下、手順

/etc/sysconfig/jenkins の設定

JENKINS_USER="numanuma08"
JENKINS_PORT="8010"
JENKINS_ARGS="--prefix=/jenkins"


/etc/httpd/conf.d/jenkins.conf の設定


Order allow,deny
Allow from all
ProxyPass http://localhost:8010/jenkins
ProxyPassReverse http://localhost:8010/jenkins



パーミッションの変更

chown -R numanuma08 /var/lib/jenkins
chown -R numanuma08 /var/log/jenkins
chown -R numanuma08 /var/cache/jenkins

パスを通す

AndroidSDK


Jenkinsの管理→Global properties

からパスを通す必用あり。

Ant


自動インストールを選択しても実行されなかった。Antのパスを指定する必要あり。

一般ユーザーで動かしているからだろうか、様々な不具合が目に付く。

プラグイン関連がもう、火を拭きまくっていてヤバイ。

明日に続く。

2012年6月12日火曜日

JennkinsOnWindowsでAndroid #Jenkins









昨日に引き続きJenkinsの設定。Linuxの時と違う部分が割りとあって、案外キツイ。

まず、そもそもエミュレーターが起動しない。コレに関しては未だに原因不明。コンソールの出力を見るに


$ "F:\Program Files\Android\android-sdk/platform-tools/adb.exe" start-server
$ "F:\Program Files\Android\android-sdk/tools/emulator.exe" -snapshot-list -no-window -avd hudson_ja-JP_240_WVGA_android-10
[android] Starting Android emulator and creating initial snapshot
[android] Erasing existing emulator data...
$ "F:\Program Files\Android\android-sdk/tools/emulator.exe" -no-boot-anim -ports 57373,57374 -prop persist.sys.language=ja -prop persist.sys.country=JP -avd hudson_ja-JP_240_WVGA_android-10 -no-snapshot-load -no-snapshot-save -wipe-data -no-window
WARNING: Data partition already in use. Changes will not persist!
WARNING: SD Card image already in use: C:\Users\numanuma08\.android\avd\hudson_ja-JP_240_WVGA_android-10.avd/sdcard.img
ko:Snapshot storage already in use: C:\Users\numanuma08\.android\avd\hudson_ja-JP_240_WVGA_android-10.avd/snapshots.img
* daemon not running. starting it now on port 57206 *
* daemon started successfully

どうも、"emulator.exe"が二回呼び出されてエミュレーターが起動していなような?

とりあえず、エミュレーターの起動は置いておいて、apkファイルを吐き出すため、デバッグビルドとテストのビルドの設定を先に。


antの設定


どうやら、antの自動インストールはうまく起動しないみたい。公式サイト(http://ant.apache.org/) からant.1.8.3をダウンロードして、適当なフォルダに解凍。
Jenkinsの管理→システム設定→ant から、ANT_HOMEを設定。

バージョンがちょっと古いのは、開発機のantのバージョンに合わせているため。まあ、開発機のバージョン上げてもいいんだけども・・・。


JAVA_HOMEの設定


Windowsの環境変数%JAVA_HOME%を読みこんでくれるものと思っていたけど、どうやらそうでもないみたい。Linuxでは勝手に読み込んでくれたんだけどなぁ?

antと同じく
Jenkinsの管理→システム設定→JDK からJAVA_HOMEを設定

環境変数に注意


さて、各プロジェクトの設定に移るわけだけど、androidプロジェクトなので

android update project -p %WORKSPACE%\ProjectPath


の様に環境変数を使って、プロジェクトのパスを指定する必要がある。ただ、この時の環境変数けど

 バッチファイル:%WORKSPACE%

Jenkinsの設定:$WORKSPACE

と、Jenkinsの方はLinux,ライクな設定方法になっていた。だが、フォルダの区切り文字は\(バックスラッシュ)なので

ant でビルド の項目で、build.xml のパスを

$WORKSPACE\ProjectPath\build.xml

とする必要がある。面倒くさい...

Windowsバッチファイルのあれこれ


AndroidプロジェクトとAndroidTestプロジェクトを同じバッチファイル内でUpdateしようとするとなぜか失敗する。



これは落ちる


  • AndroidプロジェクトのUdate
  • 何か処理
  • AndroidTestプロジェクトのUpdate

としないと通らなかった。
これは通る



とは言え、まだまだ問題は残っていて、そもそもテストの実行ができないとかもう色々と・・・。

エミュレーターの実行ができない件に関しては、原因が分からない・・・。

環境完成の先は長いです・・・。

2012年6月11日月曜日

WindowsにJenkinsを入れてCI #Jenkns

散歩していたら思いついた。

非力なメインサーバーでJenkinsを入れて、ビルドをするよりも実はCorei7-2600Kなメディアサーバーさんでビルドすればいいんじゃね?

Windowsに入れることが、なんか色々とハードル高そうだけど、わりとやってる人がいるっぽいので挑戦。

Windows上でJenkinsを動作、Linuxで動いているGitリポジトリからプロジェクトをクローンし、antでビルドする感じ。

インストール

インストール自体は簡単。公式サイト(http://jenkins-ci.org/)から、インストール用のファイルをダウンロードしてきて、実行するだけ。

色々と設定

とりあえず、URLを変更。ちなみに、今回は
F:\/Program Files/

にインストールしたので。

F:\Program Files\Jenkins\jenkis.xml

を開いて

 <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>



  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --prefix=/jenkins --httpPort=80</arguments>

これで http://localhost/jenkins でアクセスできるようになる。

次いで、実行ユーザーの変更。

タスクマネージャー→サービス→サービス から Jenkins を選び プロパティ

ログオンタブで アカウント を設定する。


Gitと言うか、SSHでリポジトリにアクセスするためのユーザに設定。

ちなみに、gitはCygwinのgitを使っています。

 この辺まで来たら再起動。サービス画面から停止、開始でも良いけどコマンドでやるなら

NET STOP Jenkins

NET START Jenkins

とする。

次に、Jenkinsの設定をブラウザから行う。

JenkinsのWorkspaceはデフォルトでは

インストールしたフォルダ\jobs 以下に作られるらしい。Program File なんてスペースの入ったフォルダの下で作業しようものなら、何が起こるか分からんので変更。

システムの管理→高度な設定


から、適当な場所を選択する。

プラグイン

使っているプラグインは

Jenkins git plugin : https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin

android emulator plugin : https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin

それぞれインストールしたら、パスの設定なんかをやっておく。Android SDK や Gitのインストールは省略。

とりあえずこんなもん。

現状

残念ながらこれでビルドをしようとすると失敗する。エミュレーターの立ちあげでコケてる感じがする。

スペック不足はたぶん無いので、プロジェクトの設定かなと疑ってみる。

まあ、気長にやっていきましょうかね。

2012年5月31日木曜日

[Jenkins]Androidのエミュレータが動かない[iptables]

JenkinsのAndroid Emulator Plugin を利用して、CIをしているが

今日、なぜかエミュレータが立ち上がらない不具合が発生した。


$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server
[android] Starting Android emulator
[android] Erasing existing emulator data...
$ /var/lib/jenkins/tools/android-sdk/tools/emulator -no-boot-anim -ports 47334,36406 -prop persist.sys.language=en -prop persist.sys.country=US -avd hudson_en-US_800_WVGA_android-8 -no-snapshot-load -no-snapshot-save -wipe-data -no-window
WARNING: Cache partition already in use. Changes will not persist!
emulator: warning: opening audio output failed

ERROR: Timeout after 5 seconds
[android] Emulator did not appear to start; giving up
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb disconnect localhost:36406
[android] Stopping Android emulator
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb kill-server
Archiving artifacts
Finished: NOT_BUILT

結局、原因はiiptablesの設定だった。

adb の待ちポートへのアクセスをlocalhostを含めて全て遮断していたためだった。

3時間くらいこれで詰まった・・・馬鹿らしい・・・。

まあ、今後同じ様な問題に出会った際の対応はこれでできたと、そうしておこう。

2012年5月27日日曜日

【Android】BluetoothChatをAndroid4.0で試す【Bluetooth】

テスト用端末はNexus S (Android4.0.4)

接続先のPC(bluecove)をサーバーに、NexsusSをクライアントとして試します。

そのままのコードを動かすと下記のような問題が発生した。

  •     ActionBarのテキストを変更できない。
  •     UUIDの初期設定が異なっている
   
そのため、コードの修正を行う。とは言え、ちょっとコメントアウトするだけだけど。

ActionBarの設定
BluetoothChat.java(252行目あたり)

 private final void setStatus(int resId) {
  final ActionBar actionBar = getActionBar();
  // actionBar.setSubtitle("un connect");
 }

 private final void setStatus(CharSequence subTitle) {
  final ActionBar actionBar = getActionBar();
  // actionBar.setSubtitle(subTitle);
 }



レイアウトのxmlを見てないからアレだけど、ActionBarが表示されてない? まあ、面倒なので出さないことにします。

UUIDの設定

 // private static final UUID MY_UUID_SECURE =
 // UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
 private static final UUID MY_UUID_SECURE = UUID
   .fromString("00001101-0000-1000-8000-00805F9B34FB");


今回はSECUREの方を変更しましたが、場合によってはINSECUREを変更かも。

サーバーのコードは、サンプルで公開されている、SPP Server Source Codeそのまま。

以上の設定でどうにか動きました。ただ、サーバーは接続が切れるまで待ち状態なのでそのへん適当に弄る必要があります。

結構面倒くさいなぁ。手持ちの端末が無いので、4.x以上でしかテストできないからアプリ作ってもほぼ自分用かな。

ゆっくりソースを読んでいきます。

2012年4月29日日曜日

第2回Androidテスト祭り #atecfes2

今回は、"第2回Androidテスト祭り"に参加してきました。アマチュア開発者なんか、空気じゃね? みたいな不安はありましたが、まあいつもどおり気にせず突撃。一人継続的インテグレーションもやってるし、大丈夫だろう、的な。

最初は、長谷川氏の挨拶から。

テスト部は活動として、Testterを叩き台にしてユニットテストを行ったり、@ITでAndroidテスト入門を掲載誌たりしているとのこと。

そして、第1回テスト祭りではV字モデルの下層の話。設計工程の作りこみが重要と言うテーマだったそうです。

今回の第2回テスト祭りは上層の話として、セキュリティ、受け入れテスト、CI,リモートテストの話がメインとなるとのこと。

その後、東海大学の濱本先生から説明が。今回の会場である東海大学高輪キャンパスは情報通信学部の拠点でIT系産業への即戦力の育成を行なっているのだとか。

さて、最初の講演者はタオソフトウェアの谷口氏。Androidのセキュリティ本を書かれた方だそうです。

内容もセキュリティの話で、例えば次の様な内容。

    .apk内のリソースは簡単に抜き出すことができる
    アプリ間の通信を悪用することができる
    正しいパーミッションを設定しましょう
    避けたいパーミッションの組み合わせを理解しましょう
    Intent発行時のログに注意しましよう
   
現状の問題点として、開発者の知識不足が挙げられていました。Android独特のセキュリティの仕組みを理解できていないと大変なことになる、と。

次は、討論と言うことで受け入れテストのガイドラインを作成しようという話。

まあ、受け入れテストって何ですか? ってレベルなんですけどねorz

要は、Androidの様々なプラットフォームでの動作の保証とか、怪しい動きをしない保証とか、みたいです。多分。

そのガイドラインの参考として、AppStoreやAppHubのガイドラインを参考にするのは良いんじゃないかな? とも。

さて、討論と言うことでベンダーはテスト部の方、そしてユーザとして電通の社員の方が登壇されていました。

とは言え、電通はクライアントであると同時に発注元でもあるのでちょっと特殊らしいのですが。

挙げられた質問と解答のまとめを。

Q.Android開発は、どんなに頑張っても全ての端末に対応できない。そこで、後からサポートする形のビジネスモデルはありか

A.技術力の高い開発元とパートナーとなるのならば、その方式は有り

Q.発注元のAndroidアプリ受け入れの現場に、どんな問題意識があるのか

A.発注元はスマホのアプリで何が出来るのかよく分かっていない。Android,iPhoneが一緒だと思っている。受託側が率先して提案をしたり、イメージや動く物を見せる必要がある。

Q.受入れ試験、機能、非機能要件の定義はどうやっているのか。開発プロセスは回っているのか。

A.現状、うまくいっていない。
アプリ開発はマーケターが関わる必要がある。クリエィティブな感覚と、テクノロジーな感覚の両方が必用。
この新しい領域を表す言葉がない。魅力の指標のようなものがないので、なんとかしたい。


ざっとまとめるとこんな感じ。ぶっちゃけ、電通の人は話し方は面白いけど、話の内容がまとまってない感じがしてちょっと辛かった。

ただ、最期の今まで黙認知とされていた部分の指標を作ろうという試みは面白そう。俺が見つけた研究では、電化製品のマニュアルの難しさをビー玉を用いて表現するという物があり、それに似たようなものを感じた。

仮に成功すると
・難易度を指標にしたコストの予測
・技術者のレベルがはっきりとする
・クリエイターのレベルもはっきりとする

と言ったメリットがあるのではないだろうか。もちろん、簡単にはいかないだろうし、数字を狙いに行く方法にシフトしてしまう可能性もあるけれど。

さて、次はJenkinsの導入ライブ。

ぶっちゃけ、設定はhttp://jenkins.android-tec.orgを参考にすればいいそうです。

これは、俺が先日3日ばかりかけてどうにか動けるようにした、Jenkinsさん。いや、大変だった。

複数のデバイスを対象にしたビルドとテストができることを知ってちょっと感動。とは言え、試すほどの環境があるわけでもないけど・・・

次はLT

個人の開発でもテストの効率化を行なって行きましょうという話。

ただ、テストをする時はテストの目的をはっきりとさせる必用があるという事。

例えば、バージョンアップをするのか、実デバイスが必用かどうか、試験工数はどうか、対応予定端末はどうか、など。

その上で、様々なテスティングフレームワークを使い分ける必用があるという。

割りと俺は、最近テストに興味がでてきたのでJUnitを使ったりしてそれっぽいことを

次はJenkinsとGerritの話。Gerritはgit上のソースコードレビューシステムらしい。Google製。

しかし、Jenkinsはともかくとして一人ソースレビューは辛いものが・・・

最期のセッションは、三大リモートテストサービスとして
NTTDocomo
ソニックス;Scirocco Cloud
化とマックス:リモートスマホレンタル

のお話。いずれも一長一短がありと言うこと。アマチュアの利用者としては、ScirrocCloudが無料で使えるのがおいしいのですけどねw

ちなみに、動作が最も速いのはリモートスマホレンタルでした。

さて、クロージングセッションは松木さんから。

ここで俺にとっては衝撃の事実

チェック=予め知っているものを確認する「作業」

テスト=知らないものを”わかる”ための「技術」
     何がわからなくて、何が知りたいのかを定義しないといけない


ま じ で

俺がずっとやってきたのはチェックだったのか・・・oh...

このあとの懇親会では、色んな人に声をかけかけられ

Android勉強会の宣伝をやってきました。濱本先生、興味を持って下さってありがとうございます。

そのうち、企業の人とか教授とかになんかお願いしたいなー とか

2012年4月11日水曜日

ADTr18へのアップデートとか、NexusSがAndroid4.0になったとか





Android4.0搭載の端末欲しいなぁって思ってました。

Galaxy Nexus欲しいなぁって思っていたら、NexusSに4.0のアップデートが来ました。

で、寝ぼけて間違えてアップデートしてしまいましたorz

お陰様で、先日作ったアプリが早速動作しない不具合が露見。

いや、実は問題で2.3系統以外で動かすとアクションバーが正しく動作しないことは既知の問題だった。しかし、Android4.0端末からのマーケットへのアクセスが少ないこと等が、

デベロッパーコンソールの統計情報から分かっていたので無視していた問題だった。

自分自身が、それで困ることになろうとはorz
Android2.3 アクションバーが表示される
Android4.0 アクションバー表示されない






















おいおいアップデートをしていこうと思っています。

次に、ADTのバージョンがr18にアップデートされました。

既に記事にもなっている通りエミュレータがGPUアクセラレーションに対応。エミュレータの実行速度をより高速にすることができたんだとか。

早速設定。

Using th Android Emulator | Android Developers

上記を参考に、エミュレータを作成する。



  • TargetをAndorid4.0.3(API Level15)かそれ以上に設定する
  • グラフィックアクセラレータを使うには、Hardware セクションで Newをクリック、GPU emulator を選択しYesを設定
  • その他の設定
    •     この時、ShapshotをEnableにしてはいけない。

しかし、起動することなく強制終了してしまう。

現時点で手に入れた情報の限りでは、同様の症状が発生している人が多い。と言うか、うまくいっている報告が無い。

一応、今後の為に開発用マシンのハードウェア構成を晒しておく。

CPU:Intel Corei7 920
M/B:MSI X58A-GD45
Graphicks:nVidia GeForce 560Ti,nVidia GeForce 460
Windows 7 64bit SP1

2012年4月3日火曜日

[リリース]簡単帳簿[作った]




今回リリースしたアプリの機能は非常にシンプルなもの。

買い物をしたら、商品名と値段を入力し表示する。ただそれだけ。

コード的にも、そんなだいそれたことを行なっているわけではない。あえて言うなら、DatePickerを日にち部分のみ表示しないように手を加えたレベル。







こだわりポイントは、ActionBarを採用したこと。今まではLinerLayoutを使ってそれっぽいものを実装していただけだったけど今回はAndroid3.0以降でもちゃんとActionBarとして認識されるActionBarを利用した。

とは言え、サンプルコードで与えられているActionbarCompatを流用しただけなんだけどね・・・。

あと、開発のプロセスとして継続的インテグレーションっぽいことを取り入れた。JenkinsとGitを使ってビルドとテストが通るまで眠らないあの日々・・・。

結論としては、一人継続的インテグレーションのメリットって・・・?な感じだけど、とは言え将来的に利用する日が訪れた時にいい事があるかなぁって感じ。

あと、珍しくCPUを回す作業なので今まで半分寝ていたサーバーを上手く活用できたかな、と。

という訳で、GooglePlayで公開中なのでぜひともダウンロードしていただきたいものです。

ダウンロードはこちらから

2012年3月2日金曜日

[JUnit]DatePickerをテストケースから操作する[Android]

Androidのテストでは、ウィジェットの操作はUIのスレッドで動作させる必用があるとのこと。

今回は、DatePickerを操作する。ソースは以下。

  activity = getActivity();

  fromDate = (DatePicker) activity.findViewById(R.id.from_data);
  toDate = (DatePicker) activity.findViewById(R.id.to_data);
  activity.runOnUiThread(new Runnable() {

   @Override
   public void run() {
    // TODO Auto-generated method stub
    fromDate.init(fromY, fromM, fromD, null);
    toDate.init(toY, toM, toD, null);
   }
  });
アクティビティのインスタンスから、runOnUiThreadを使ってUIのスレッドでの動作を行わせるとのこと。

今夜はリファクタリング的なことをやって、無駄に増えていった処理用のクラスを纏めていました。


リファクタリングとは、外部から見た時の挙動が変わってはいけない、とのこと。この本に書かれていた。

多分、クラスを分ける必用があるんだろうなぁとは思うけれど、どう分ければいいのかがよく分かっていなくて、後から見返すとかなりアレなことになっていることが多い。

2012年2月26日日曜日

【JUnit】データベースを操作するテスト【試してみた?】



先日作ったByte配列に変換したりその逆にしたりするメソッドを利用して、データベース周りを実装する。

割りと、参考サイトを見ていると実装の方法は同じなので今回つまった部分とか。

Blob型で保存をするので、PupSQLiteなどのビューアを利用してもデータの内容の確認ができない。そこで、正しくデータが保存できているのか等を確認するために、JUnitを利用することにする。

Byte配列とは出るけど、内容確認は無理




1:データベース操作クラスのテスト
  • データを挿入するinput
  • 削除するdelete
  • 全てのデータを得るfindAll
  • 任意のデータを得るfindById

それぞれのテストの実装は次の通り。
public class PartyDaoTest extends AndroidTestCase {
 DbHelper helper;
 PartyDao dao;

 Party party; //保存対象のデータ

 public PartyDaoTest() {
 }

 protected void setUp() throws Exception {
  super.setUp();

  helper = new DbHelper(getContext());
  dao = new PartyDao(helper.getReadableDatabase());

  setData();
 }


 protected void tearDown() throws Exception {
  super.tearDown();
 }

 public void testInsert() {
  assertNotNull("Should be not null if save data", dao.insert(party));
 }

 public void testFindAll() {
  dao.insert(party);
  
  assertTrue("Should be returned bigger than one.",
    dao.findAll().size() > 1);
 }

 public void testDelete() {
  assertNotNull("Shoudl be not null", dao.delete((int) dao.insert(party)));
 }

 public void testFindById() {
  int id = (int) dao.insert(party);
  Party p = dao.findById(id);
  
  assertEquals(party.getDate(), p.getDate());
 }
}

問題なくテストも成功するから多分、大丈夫。

2:利用するActivityのテスト

保存対象のデータ'Party'を新たに作ったIntentにputし,setActiviyIntentでActivityに渡す。

testSaveData()で、実際のテストを行なっている。ちなみに、テスト対象のsaveData()メソッドは、データを保存すると返り値としてデータのIDを返すと言う物。
public class SelectMemberActivityTest extends
  ActivityInstrumentationTestCase2<テスト対象のActivity> {

 Party party; //保存対象のデータ
 SelectMemberActivity mActivity;

 public SelectMemberActivityTest() {
  super("パッケージ名", テスト対象のActivity.class);

 }

 protected void setUp() throws Exception {
  super.setUp();
  Intent intent = new Intent(getInstrumentation().getContext(),
    テスト対象のActivity.class);
  party = setData();
  intent.putExtra("store_data", party);

  setActivityIntent(intent);
 }

 protected void tearDown() throws Exception {
  super.tearDown();
 }

 public void testSaveData() {
  assertNotNull("データを保存する.返り値がNull以外で成功とする", getActivity().saveData());
 }
}

さて、この簡単な実装だけど最初コンストラクタになぜか引数がついていてRuntimeExceptionが発生してた。気づいて修正するのにほぼ1日かかったって言うね・・・。ココみて直した。

さて、興味があるのでJUnitとか使ってますけど、決して今の開発スタイルはTDDとは言えないと思います。

そもそも、今回書いたテストも正しいテストと言えるのか分からない。その辺りは勉強なんだけど。

今風のソフトウェア開発の本を読めば多分書いてあるんだろうね。まあ、実践も一緒にやっていきたい所ではあるけれど。

多分今回書いたのはこのスライドで言うところの学習テストに当たるのかな。初めて使う機能だもんね、しっかりと抑えておきたい所ではある。

2012年2月24日金曜日

【Android】オブジェクトをByte配列にしたりその逆したり【作ったよ】

現在製作中のAndroidアプリでデータベースを利用することになっている。

カラムをいちいち作ってもいいんだけど、割りとクラスの構成が面倒くさいのでBlob型で保存することにした。

という訳で、オブジェクトをByte配列に変換したり戻したりするメソッドを実装しますか。

Byte配列に変換
 public byte[] toByte() {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  try {
   ObjectOutputStream oos = new ObjectOutputStream(baos);
   oos.writeObject(this);
  } catch (IOException e) {
   // TODO: handle exception
   return null;
  }
  return baos.toByteArray();
 }


バイト配列から変換
 public static Party byteToParty(byte[] b) {
  Party p = null;
  try {
   p = (Party) new ObjectInputStream(new ByteArrayInputStream(b))
     .readObject();
  } catch (OptionalDataException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (StreamCorruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return p;
 }


JUnit使って動作確認。テストケースはこれで。
 public void testToByte() {
  byte[] b = party.toByte();
  assertNotNull(b);
 }

 public void testByteToParty() {
  byte[] b = party.toByte();
  Party p = Party.byteToParty(b);
  assertEquals(p.getDate(), date);
  assertEquals(p.getTime(), time);
  assertEquals(p.getPlace(), place);
  assertEquals(p.getperson(), person);
  assertEquals(p.getKeyword(), keyword);
  assertEquals(p.getPlaceBy(), placeBy);
 }

問題なくテストを通ったから良いでしょう。

2012年2月17日金曜日

【Monaca】駅索リベンジ【作った】


最寄り駅を選択して、前と次の駅を出す
Monacaを使って、駅索をリベンジしてみることにした。

JSによるプログラミングはTitaniumを使ったことがあるけれど、

アレとは違って、HTML5によって記述するタイプ

スクリーンショットは左。

今回利用したWebAPIはHeartRails Express

まあ、駅に関してやりたい事が大抵やれるのでは無いかと思われ。

前回作った駅索のトレース+パワーアップ的なことをやっていくつもり。

明日のデブサミでMonacaの人に 作りました~ って自慢するんだー



2012年2月5日日曜日

【Android】複数のメールアドレスに対して送信するIntentを作りたい

Intentから、メールを送信するのはやり方としては様々なサイトに書かれていましたが、複数のメールアドレスに対して送る方法が無かったのでメモ。

具体的には、extra data を EXTRA_EMAILに、そしてToアドレスをStringの配列にする必用があったとのこと。

参考にしたサイトはこちら

今作っているアプリは、ListViewで選択をしたメールアドレスに対してメールを送信するので

1.ArrayListにToアドレスを保存

2.配列に変換

3.putExtra

な感じ。

コードは以下。
ArrayList toList = new ArrayList();
    Intent intent = new Intent(Intent.ACTION_SEND);
    for (Member member : memberList) {
     if (member.isJoin()) {
      toList.add(member.getMail());
     }
    }
    intent.putExtra(Intent.EXTRA_EMAIL,
      (String[]) toList.toArray(new String[0]));
    intent.putExtra(Intent.EXTRA_TEXT, "メール本文");
    intent.putExtra(Intent.EXTRA_SUBJECT, "メールタイトル");
    intent.setType("message/rfc822");
    startActivity(Intent.createChooser(intent,
      "choose email client"));


当然だけど、putExtraはArrayList型を引数にしてあげても動く。お陰で詰まってた。ArrayListでも大丈夫だろう、と勘違い。