2011年10月28日金曜日

[Java][Maven] 今さらかもだけどMaven入門してみた(1) - メリット、環境構築


今回は、最初にデバイス制御側を作っておいて、少し間があってからデータ取得側を作る、ってスケジュールで細かいこと忘れそう+ユニットテストとか再ビルドとか繰り返す必要がありそう、ということでやってみようかなと。
そういう目的からテスト管理ツール>CIツール(Jenkins)>Maven、って調べて行ってたどり着いた。


■Mavenを使うと嬉しいとき

1. 開発プロセスでの細々とした作業(プロジェクト作成、ライブラリの配置、テストツールの設定、テストレポートの作成など)に時間をかけたくないとき。
大概のステップは、何も準備をしていなくても、
mvn (フェーズ名)
ってすれば、とりあえず何かしらの成果物ができる。そこから、自分のやりたいことに合わせて設定ファイルを作ればいい。

2. ビルド作業を自動化したいとき。
ビルドツールの役割そのままだけど。
何人かビルドする人がいる、開発期間に間が空く、という時、一度設定すれば2度目以降は全く同じようにできる。

3. プロジェクトのディレクトリ構成を考えるのに時間をかけたくないとき。
プロジェクトのディレクトリ構成を考えなくていいし、他のプロジェクトを読むのも簡単になる。それに、Jetty, GAE, Scalaなど、メジャーなターゲットなら大抵プロジェクト構成が提供されているから、スタートしやすくなる。

4. 社内や、個人でもいいけど、自前で作ったライブラリを共有する複数のプロジェクトがあって、そのライブラリが更新されたりするとき。
Mavenローカルレポジトリを作れば、全員がそこに置かれているライブラリの最新版を使うことになるので、プロジェクトごとに違うバージョンのライブラリを使ってて何がなにやら、という状況にならなくて済む。
一番お世話になる機会はなさそうだけど、実現したら一番強力な機能かもしれない。


■環境構築

今回は、自前リモートリポジトリ作成はなし(リポジトリへの配備もなし)、プロキシ設定もなしです。

MavenはもともとSnow Leopardにインストールされているし、EclipseプラグインもEclipse Indigoにm2eが同梱されていた。Mavenのバージョンは最新だった(Maven 3.0.3)ので、環境構築作業はとりあえず何もせずにスタート。


■エントリー時の注意点
Maven 1.xとMaven 2.x/3.xは互換性が無いので、情報収集するときにはMaven 1.xのものでないかどうか注意!
コマンドがmavenだったり、プロジェクト設定ファイルがproject.xmlだったりしたらMaven 1.x(Maven 2.x/3.xではそれぞれmvn, pom.xml)。

2011年10月18日火曜日

[Java][Maven] log4jをdependencyに追加しようとしたらMissing artifactエラーになった

まずはmvnコマンドでプロジェクト作成、Eclipseにインポートしたまではよかったのだけど、試しに、とlog4jをAdd dependencyダイアログからPOMに追加したら、
Missing artifact log4j:log4j:bundle:1.2.16 
と言われた。ちなみにそこのdependencyタグはこんな感じ。
<dependency> 
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version> 
   <scope>compile</scope>
   <type>bundle</type>
 </dependency>
けっこう探した結果、全く同じ問題が解決していた人がいたので、同様に解決。
http://maven.40175.n5.nabble.com/log4j-log4j-bundle-1-2-16-Bundle-or-JAR-td3281135.html

typeタグ(依存関係の種別を書いておく)をbundleでなくてjarにした。
bundleで探せてないってことは、どこかのパスが通ってないのが原因のような気がするけど、それがどれか(まだ)分からないから、とりあえずJarでもいいや。。

2011年9月16日金曜日

Android Monkey ツールを試してみた


MonkeyツールはランダムなUIイベントを発生させて、アプリケーションのストレステストとかを行えるツール。

とりあえず以下を参考にコマンド打ってみた。

http://www.taosoftware.co.jp/blog/2009/04/android_monkey.html
https://sites.google.com/site/androidtestclub/translation/dev-guide/developing/tools/09-developing-tools-monkey

$ adb shell monkey -p com.your.package --throttle 1000 -v 500

なぜかOperaがクラッシュしてすぐに止まった。。

:Monkey: seed=0 count=500
:AllowPackage: com.your.package
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 15.0%
//   3: 25.0%
//   4: 15.0%
//   5: 2.0%
//   6: 2.0%
//   7: 1.0%
//   8: 15.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10000000;component=com.your.package/.MyActivity;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.your.package/.MyActivity } in package com.your.package
:Sending Pointer ACTION_MOVE x=-4.0 y=2.0
:Sending Pointer ACTION_UP x=0.0 y=0.0
// CRASH: com.opera.browser (pid 3808)
// Short Msg: java.lang.UnsatisfiedLinkError
// Long Msg: java.lang.UnsatisfiedLinkError: logD
// Build Label: samsung/SC-01C/SC-01C/SC-01C:2.2/FROYO/OMKB1:user/release-keys
// Build Changelist: OMKB1
// Build Time: 1297069177000
// java.lang.UnsatisfiedLinkError: logD
// at com.opera.common.CommonNatives.logD(Native Method)
// at com.opera.common.Log.d(Unknown Source)
(中略)
//
** Monkey aborted due to error.
Events injected: 23
:Dropped: keys=0 pointers=0 trackballs=0 flips=0
## Network stats: elapsed time=7480ms (0ms mobile, 7480ms wifi, 0ms not connected)
** System appears to have crashed at event 23 of 500 using seed 0

が、その後は快調!
イベント回数5000、スロットル(イベント発生間隔)1000ミリ秒で実行した所、
20分以上アプリを動かしつづけてくれました。

$ adb shell monkey -p com.your.package --throttle 1000 -v 5000
:Monkey: seed=0 count=5000
:AllowPackage: com.your.package
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 15.0%
//   3: 25.0%
//   4: 15.0%
//   5: 2.0%
//   6: 2.0%
//   7: 1.0%
//   8: 15.0%
(中略)
Events injected: 5000
:Dropped: keys=2 pointers=2 trackballs=0 flips=0
## Network stats: elapsed time=1274086ms (0ms mobile, 1274086ms wifi, 0ms not connected)
// Monkey finished

2011年6月14日火曜日

[Android] SDカードへのパスの取得方法

SDカードには外部SDカードと内部SDカードがある機種がある。
Samsung端末などがそう。

こういった端末だと、Environment.getExternalStorageDirectory()して取得したSDカードへのパスは、内部パスになる。
それに対して、PCから直接見える場所が、外部パス。
Galaxy Tabの場合,内部パスが/mnt/sdcard、外部パスが/mnt/sdcard/external_sd。

外部パスは、adb shellで、
printenvコマンドで環境変数を出力すると、$EXTERNAL_STORAGEで設定されている。
$EXTERNAL_STORAGEの設定とファイルマネージャから確認できる外部パスは、下記の記事および手元の端末での確認ではすべて合致しているけれど、公式のドキュメントはないので、保証はない、という状態。
確認した端末は、次の3機種。

---
Galaxy Tab
内部SDカード:/mnt/sdcard/ (Environment.getExternalStorageDirectory)
外部SDカード:/mnt/sdcard/external_sd (ファイルマネージャ,adb shell)
環境変数EXTERNAL_STORAGE:/mnt/sdcard/external_sd

Camangi FM600
内部SDカード:/mnt/sdcard (Environment.getExternalStorageDirectory)
外部SDカード:/mnt/sdcard(ファイルマネージャ,adb shell)
環境変数EXTERNAL_STORAGE:/mnt/sdcard

VIA U07AV
内部SDカード:/sdcard (Environment.getExternalStorageDirectory)
外部SDカード:/sdcard(ファイルマネージャ,adb shell)
環境変数EXTERNAL_STORAGE:/sdcard
ちなみにmnt以下にはlocaldiskのみ
---

http://groups.google.com/group/android-group-japan/browse_thread/thread/53deac144d256b27/bdc76c63092ac990?hl=ja
http://blog.tappli.com/article/44620525.html
http://wlog.flatlib.jp/?itemid=1486

2011年6月2日木曜日

端末スリープ時に発生するConfigurationChange

端末スリープ時およびスリープからの復帰時に発生するConfigurationの変更は、orientationだけ。

スリープ時には、実際の端末の向きと関係なく、決まった方向にorientationが変更されるみたい。
この時のorientationの向きは、端末によって異なる。

手元の端末では、
Galaxy TabではORIENTATION_PORTRAIT - Constant Value: 1 (0x00000001)に、
Camangi FM600dではORIENTATION_LANDSCAPE - Constant Value: 2 (0x00000002)になった。

原則、AndroidManifestのactivityタグでscreenOrientationを設定していても、この設定変更は発生する。
(screenOrientationで設定した向きと端末のスリープ時の向きの設定が同じなら、向きが変わったことにならないので発生しない。)

2011年5月30日月曜日

Couldn't create directory for SharedPreferences

急にSharedPreferencesが読み書きできなくなって焦ったら、
何のことはない、AndroidManifestのsharedUserIdを変えたんだった。。。
ディレクトリ作ったのと違うユーザでアクセスしようとしてるんだから、できる訳ないよ。。

2011年4月25日月曜日

EditText長押し時に選択ダイアログを表示させないようにする

何もしないonLongClickメソッドを持つonLongClickListenerを作ってセットする。