ページ

2014/05/18

Objective-Cコードのフォーマットチェック

Objective-CにはLintツールとして既にOCLintがあるが、
OS Xでなくても手軽にチェックできる仕組みが
欲しいと考えて作ってみた。
fint

以前にRun Scriptを利用して簡単なチェックができる
というエントリを書いたが、これをツールとして整備したもの。

例えば以下のように、普通のビルドエラーと同じように表示できる。

enter image description here

ちなみにツールはGo言語製。
Go言語環境をセットアップしてあれば、以下でインストールできる。

go get github.com/ksoichiro/fint

lint用のTARGETを追加し、Build Phaseを追加してRun Scriptにfintを
呼び出す設定を記述する。
以下は、設定例。

enter image description here

コマンドラインからも実行可能。

enter image description here

2014/05/11

Android Gradle PluginでJaCoCoを有効にしてテストするとjava.lang.VerifyError発生 (2)

|

Android Gradle PluginでJaCoCoを使ったカバレッジ計測を試したが
java.lang.VerifyErrorが発生したというエントリを書いた。

どうやらこの影響が及ぶのはリフレクションだけではないらしく、
通常のIntentによる起動が失敗した。
以下のようなパターンで、testCoverageEnabled = trueとなった
ビルドでインストールしたアプリがjava.lang.VerifyErrorによりクラッシュした。

まずAndroidManifest.xml。
途中は省略するが、トップ画面からメニューを開き
「About」の項目をタップするとAboutActivityが開き
アプリの概要が表示される、というもの。

<application
:
        <activity
                android:name=".AboutActivity"
                android:label="@string/title_activity_about" />
</application>

トップ画面のMainActivityでは以下のように書いている。

    @Override
    public boolean onOptionsItemSelected(final MenuItem menu) {
        int id = menu.getItemId();
        if (id == R.id.menu_about) {
            startActivity(new Intent(getApplicationContext(),
                AboutActivity.class));
            return true;
        }
        return false;
    }

これが、通常のビルドなら問題なかったが上記の通り
カバレッジ計測を有効にしたら失敗した。
(自動テストでなく手動で動かしても同様)

実際のプロジェクトで利用するにはまだ問題がありそうだ。。。

AndroidライブラリSimpleAlertDialog

|

少し前に作ったものの、紹介エントリを書いていなかったことに気づき今更ながら書いてみる。。。
SimpleAlertDialog-for-Androidという、
Androidでダイアログを簡単に作成できるライブラリを公開しています。
SimpleAlertDialog-for-Android

この手のライブラリは色々あるが、特長は以下の通り(READMEから抜粋)。

  • APIレベル4 (Android 1.6 Donut)からレベル19 (Android 4.4 KitKat) で利用可能です。
  • Holoスタイルのダイアログを全てのバージョンで使えます。
  • AlertDialog.Builderのようにシンプルなインタフェースです。
  • 基本的なイベントをハンドリングするコールバックが用意してあります。
  • ダイアログのライフサイクルは、親となるActivityやFragmentと同期しているため、IllegalStateExceptionに悩まされることはありません。
  • APIレベル11以上での通常のActivityと、android-support-v4ライブラリのFragmentActivityの両方をサポートしています。

デモアプリのダウンロードはこちらから

Android Gradle PluginでJaCoCoを有効にしてテストするとjava.lang.VerifyError発生

AndroidFormEnhancerは、Eclipseでの利用も可能にしているものの
基本的にはAndroid Studioで開発し、Gradleでビルドしている。
テストカバレッジを上げるために少しでも多くのテストを書こうとしているが
connectedAndroidTestタスクを実行しているときに
特定のクラスでjava.lang.VerifyErrorが発生する。
(未解決です)

com.androidformenhancer.helper.ActivityFormHelperTest > testInit[test(AVD) - 4.2.2] FAILED
java.lang.VerifyError: com/androidformenhancer/internal/ValidationManager
at com.androidformenhancer.helper.FormHelper.setValidationManager(FormHelper.java:356)
:library:connectedAndroidTest FAILED

FAILURE: Build failed with an exception.

2014/05/10

android update sdkのfilterで指定できる項目名の確認方法

|

Travis CIでビルドする場合などでは
コマンドラインでAndroid SDKをアップデートする必要がある。
この場合、

android update sdk --filter platform-tools

などとすると、必要な項目だけをフィルタリングしてインストールすることができる。

これまで、filterに使える名前として、ブログなどで使われている例を
そのまま試していたものの、新しい項目をインストールしたくなった場合
他に何の項目が使えるのかが分からず
.travis.ymlに何と書いてよいか分からず困った。

これを解決するには、以下で確認する。

android list sdk --all --extended

StackEditからのBlogger投稿でラベルを指定

|

StackEditではFront-matterが使えるということで、以下のようにすればBloggerへラベル付きで投稿できる(内容は前のエントリの冒頭)。

---
tags: ["Android", "Gradle", "Android Studio"]
---

Android Gradle Pluginでは、`sourceSets`として以下のようなものが指定できる。

Android Gradle Pluginにおけるresとresourcesフォルダ

|

Android Gradle Pluginでは、sourceSetsとして以下のようなものが指定できる。

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

ディレクトリ構造を変えたくて上記を変更しようとしたとき、
上記のうちresresourcesは何が違うのか?という点が
すぐには分からなかったのでメモ。
Gradle Plugin User Guideには以下のように書いてある。

To replace the default source folders, you will want to use srcDirs
instead, which takes an array of path. This also shows a different way
of using the objects involved:

sourceSets {
    main.java.srcDirs = ['src/java']
    main.resources.srcDirs = ['src/resources']
}

For more information, see the Gradle documentation on the Java plugin
here.

sourceSetsで設定できるものはすべてAndroidプラグイン独自のものなのではなくJavaプラグイン由来のものとAndroid独自のものがある。
つまり、resources.srcDirsはJavaでいうリソースなので
.propertiesファイルなどを配置するディレクトリのこと。

なので、Androidでいうリソースファイル(resフォルダ以下のXMLなど)の配置は
sourceSets.main.res.srcDirsで設定するのが正しい。

2014/05/06

StackEditで投稿してみる(3)

|

StackEditでMarkdown形式で編集し、シンプルなHTMLを投稿した上で
CSSによるデザイン調整ができればかなり良い。
preタグ、codeタグは何とか表示できたので次は引用。

引用するとblockquoteタグとpタグが入るようだが、
pタグは行単位に入るのか?

というのを確認したかった。

追記:
上記を一度投稿して確認してみると、blockquoteの後にpタグは1つしか入らなかった。
この前提でレイアウト調整してみよう。

Written with StackEdit.

StackEditで投稿してみる(2)

|

投稿された内容がどうなっているのかなと編集画面を開いたところ、色々変換されてしまったらしい。

レイアウト調整のためにタグの関係などを確認してテンプレート編集画面で調整していたのだが
なぜか反映されず、どうなっているんだ?と改めて投稿編集画面を開いてみると、
タグの構造が変わっている。。。

<p>タグがなくなり、すべての行末が<br />タグに変わっていた。

追記:
改めてブログを再読み込みしてみると修正されていた。。
テンプレートをいじっていたのが原因か??

Written with StackEdit.

StackEditで投稿してみる

|

Bloggerへの投稿でMarkdownを使えたら良いな、と思い調べてみると
StackEditが良いというのを見つけたので試してみた。

Bloggerだとソースコードを貼付けたい場合に「作成」ビューで貼れば問題なく表示はできるが、
スペースをすべて&nbsp;に変換したりとかなり無駄ができている。
「HTML」ビューならHTMLコードを書くことで対応できるが非常に面倒。

これがStackEditだとMarkdownなのでインデント(4スペース分下げる)で
ソースコード表示(というか引用?)になるが、これをBloggerへHTMLとして投稿すると
<pre><code>というタグで囲まれた形に変換されるらしい。
このタグをカスタマイズしたCSS(テンプレートを編集)でデザイン調整すれば良いかもしれない。

コードはこんな感じ:

public static void main(String[] args) {
    System.out.println("Hello, world!");
}

Bloggerはともかく、StackEditで編集した内容はDropBoxやGoogle Driveとも連携できるし
スタイルがついた状態でPDFに出力したりもできるようなので使い道がいろいろありそう。

2014/05/05

[Android][Gradle] ライブラリプロジェクトのJaCoCoでのカバレッジ計測

|
Android Studioがリリースされて以来、Gradleプラグインをしばらく使っていたものの androidプラグインがjavaプラグインと共存できないせいでいろいろとできないことがあった。

その一つが、カバレッジの計測。 4月末のAndroid Gradle Plugin 0.10.0のリリースでJaCoCoのサポートが追加され、ついにandroidプラグインでもカバレッジ計測ができるようになった。
http://tools.android.com/tech-docs/new-build-system

気づいて早速使おうとしたものの、上記ページに書かれている他は
ほとんど書かれているところがなくうまく動かず。。。
また、動かそうとしたのが単純なAndroidアプリケーションプロジェクトでなく
ライブラリプロジェクトであり、Eclipse互換の構造を保とうとしながら
作っていたせいかもしれない。

今回は、そんな条件であってもJaCoCoによるカバレッジ計測を可能にし、
Travis CIでビルドしてCoverallsでカバレッジを表示するところまで試してみた
という内容。※長いです。

2014/05/02

[Docker] boot2dockerでの共有フォルダ設定を忘れずに実行する

|
boot2dockerがすごく便利。
でも共有フォルダの設定が現時点ではまだサポートされていないようで・・
上記のREADMEでもfolder sharingはAdvanced Usageとして書かれている。
上記で紹介されているのが次のPull Requestで説明されている方法。
https://github.com/boot2docker/boot2docker/pull/284

boot2docker initで入るイメージではなく、手を入れたisoに差し替えた上で、
vboxsfを使うようにコマンドを実行しなければならない。
これはboot2dockerを起動するたびに実行しなければいけないようなので
.zshrcに以下のように書いてみた。

boot2dockerが起動していなければ起動して共有フォルダ設定まで行い、 すでに起動していた場合は、共有フォルダ設定できていないかもしれないので 手動でコピー&ペーストで設定できるようにコマンドを表示しておく。

[Docker][Android] AndroidアプリでHTTP通信を含むコードをDockerコンテナ内で完結させて自動テスト

|
前回の続きで、DockerでAndroidの自動テストを試してみる。

前回は単純なテストケース(中身がないといってもいい)だったが、
実際のAndroidアプリなら大抵の場合は通信が発生するもの。

以下のサンプルでは、DockerでHTTPサーバ(Node.js)を立て、
そのコンテナにAndroid SDK+エミュレータのコンテナを接続することで
すべてDocker上で完結したテストを実行する。
https://github.com/ksoichiro/android-tests/tree/master/docker-http-client

(自分が知らないだけかもしれないが)
従来なら、外部のWeb APIなどと接続するテストは
API基盤側との事情ですぐにできなかったりしたが、
上記のやり方ならAPIのインタフェースさえ分かっていれば(決まっていれば)
開発初期からテストできる。
(開発用の公開サーバを用意しなくても)
外部環境を含めて常に同じ状態を再現してテストできる、というのはうれしい。
しかも、Dockerが使える環境さえあれば
PCのセットアップに時間をかけたりしなくても すぐに同じ構成でのテストが実行できる。

[Docker][Android] DockerでAndroidエミュレータを動かしGradleによるビルド&テストを実行

|
前のエントリで書いたように、Dockerを使ってAndroidのテストをすることができる。
さらに色々なパターンのテストを試していこうと
Vagranfile, Dockerfileに続きAndroidのテスト集を作成(以前からあったがいくつか追加)。
https://github.com/ksoichiro/android-tests

以下は、Docker上のAndroidエミュレータでテストをする例。
https://github.com/ksoichiro/android-tests/tree/master/docker-emulator
比較のために通常のGradleによるインストールなども記載してるが
メインはサイトの test.sh の実行部分。
ここでAndroidエミュレータセットアップ済みのコンテナを使って
Gradleラッパーによる端末テストを実行する。
テストが本当に実行されていることが分かるように、
わざと失敗するテストにしてある。

気をつけないといけないのが local.properties の存在。
JenkinsでDockerを使ったビルドをする場合なら考慮する必要のないことだが、
通常のIDE( or Gradle)でのビルドとDockerでのビルドを同じ
ファイルに対して実行する場合、local.propertiesに定義された
Android SDKのパスがそれぞれ異なるため、どちらかで動くようにすると
どちらかのビルドが失敗してしまう。
上記スクリプト(test.sh)では、Gradleラッパーの実行前に local.properties を
リネームしてから実行し、終了後に戻すようなことをしている。

[Docker] Dockerfileのサンプル

|
勉強のために、そしてCIやら色々使い方を考えるためにテンプレートとして
リポジトリを作成。
https://github.com/ksoichiro/dockerfiles
さらに最後には index.docker.io に登録してみた。

以下その内容。

OpenJDK7

Javaが使えるというだけですが・・。
https://github.com/ksoichiro/dockerfiles/tree/master/openjdk7
こちらに登録中。
https://index.docker.io/u/ksoichiro/openjdk7/
"docker pull ksoichiro/openjdk7" でプルできます。

Android

Android SDKが使えるコンテナ。Jenkinsでのビルドに使えそう。
https://github.com/ksoichiro/dockerfiles/tree/master/android
こちらに登録中。
https://index.docker.io/u/ksoichiro/android/
"docker pull ksoichiro/android" でプルできます。

Android + エミュレータ

Android SDKとエミュレータ(ARM)が使えるコンテナ。
https://github.com/ksoichiro/dockerfiles/tree/master/android-emulator
エミュレータを実行するスクリプトはENTRYPOINTになっているだけなので、
docker runしてからしばらくは起動待ち。。。
それでも、ホスト側の環境を汚さずにAndroid上でのテストができるので
これもCIに使えそう。
(頻繁な実行は厳しいが・・・)

こちらに登録中。
"docker pull ksoichiro/android-emulator" でプルできます。

エミュレータについては、例えばGradleでビルドしているプロジェクトなら
以下のように使える。

cd /path/to/project
docker run -t -i -v `pwd`:/workspace ksoichiro/android-emulator start-emulator "./gradlew connectedAndroidTest"

VOLUMEとWORKDIRの設定がしてあり、dockerのコンテナ内では/workspaceがプロジェクトフォルダになる。
/opt/android-sdk-linuxにインストールされたAndroid SDKを使って/workspaceのプロジェクトをGradleでビルド・テストすることになる。

[Vagrant] 開発環境用のテンプレート

|
Vagrantfileやセットアップ用のスクリプトを
テンプレートとしてGitHubにいくつか登録してみた。
https://github.com/ksoichiro/vagrant-templates

セットアップは基本的にすべてシェルスクリプト。
(結果的に、Dockerで書きたくなったときに移植しやすいので良かったかも)

Ubuntu上でDockerが使えるテンプレート

Macならboot2dockerがあるのでメリットはないが、
Windowsでも使えるようにしたい場合に役立つかも?
https://github.com/ksoichiro/vagrant-templates/tree/master/templates/precise64-docker

Ubuntu上でGitLabが使えるテンプレート

英語、かつバージョンは固定です。
https://github.com/ksoichiro/vagrant-templates/tree/master/templates/precise64-gitlab

Ubuntu上でAndroid SDKが使えるテンプレート

こちらもバージョンは固定なものの、少し変更すれば他のバージョンでもすぐに使える。
ホストOSにAndroid開発環境がなくてもアプリがビルドできる。
Dockerの方が使えそう。
https://github.com/ksoichiro/vagrant-templates/tree/master/templates/precise64-android

Ubuntu上でAndroidエミュレータが使えるテンプレート

上のAndroid SDKにエミュレータを追加したもの。
エミュレータはARMなので遅いです。
https://github.com/ksoichiro/vagrant-templates/tree/master/templates/precise64-android-emulator

VIM(日本語利用可)が使えるテンプレート

実行環境用途だけでなく編集もしたい、という場合の参考に。
https://github.com/ksoichiro/vagrant-templates/tree/master/templates/precise64-vim-jp

上記はすべて Ubuntu Precise 64bitの base image から作っているもので、
vagrant up && vagrant stop && vagrant package してできた box を以下からダウンロードできるようにしてみた。
http://customboxes.herokuapp.com/

[GitLab] GitLab6.6.4〜6.7.5 日本語化パッチ

|

GitHubでのような開発がしたい!ということでGitLabを利用。
日本語には対応していないだが、英語に抵抗のあるメンバーもいるのでどうしても日本語化しておきたい・・・
ということで(かなり強引な感じの)日本語化のパッチを作成した。
https://github.com/ksoichiro/gitlab-i18n-patch

追記(2014/05/11)
現時点で最新の6.8.1にも対応しています。


以前はインストールするのも大変だったが、今では
GitLab Omnibus Packageというパッケージが出ており
これで簡単にインストールできるようになっている。
https://www.gitlab.com/downloads/
CentOS, Ubuntu, Debianに対応している。

これをサーバにインストールして、gitlab-ctl reconfigureなどすれば
GitLabは(ほぼ)セットアップ完了。

上記の日本語化パッチは、この中のアプリ部分である gitlab-rails に適用する。

# cd /opt/gitlab/embedded/service/gitlab-rails
# patch -p1 < ~/app_ja.patch

基本的にはこれを実行して gitlab-ctl restart すればOK。
すでに稼働させている環境の場合は、public/assetsにあるキャッシュを更新しなければならないので以下も必要。

# cd /opt/gitlab/embedded/service/gitlab-rails
# rm -rf public/assets
# export PATH=$PATH:/opt/gitlab/embedded/bin
# rake assets:precompile RAILS_ENV=production

普通に使っていて見える部分を日本語化することを目的にしており、
動かなくなっている部分もあるかもしれないので、
もし利用してみたい方がいれば自己責任でご利用ください。

なお、各種文言の一部はDBに保存されたりするものもあるので、
日英が混ざった感じになることにも注意。

[Docker] <none>のimageを一括削除

|

Dockerでいろいろ試していたら、いつの間にかREPOSITORY, TAGが "<none>"のimageばかりに。。。
名前のついていないイメージを削除する方法:

docker rmi $(docker images | grep "" | awk '{ print $3 }')

Containerを削除する方法:

docker rm $(docker ps -a -q)