<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3820505248564293539</id><updated>2024-08-29T12:49:04.324+09:00</updated><category term="Android"/><category term="Maven"/><category term="Git"/><category term="Java"/><category term="Jetty"/><category term="Heroku"/><category term="IntelliJ"/><category term="Jenkins"/><category term="Redmine"/><category term="Gerrit"/><category term="Google Guice"/><category term="Gradle"/><category term="RoboGuice"/><category term="Ruby"/><category term="lime-mvc"/><title type='text'>u1aryzの備忘録とか</title><subtitle type='html'>ゆる〜くいきます。動作保証はいたしません。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-6433818912303906937</id><published>2013-08-25T17:46:00.000+09:00</published><updated>2013-08-25T17:49:18.880+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>mvn eclipse:eclipseでソースコードとJavadocをダウンロードしてくれるsettings.xml</title><content type='html'>&lt;pre&gt;mvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true
&lt;/pre&gt;
ってやるとEclipseプロジェクトファイルを作ってくれるのと同時に依存ライブラリのソースコードとJavadocをダウンロードしてくれるんだけど、-DdownloadSources=true -DdownloadJavadocs=trueって毎回書くのはめんどい。&lt;br /&gt;
コマンドのエイリアス作ったり、pom.xmlに書いたりすれば解決するけど、なんとなくどちらも気持ち悪かったので、
settings.xmlに記載したった。&lt;br /&gt;
&lt;br /&gt;

&lt;script src=&quot;https://gist.github.com/u1aryz/6332671.js&quot;&gt;&lt;/script&gt;

&lt;br /&gt;
これで以下のコマンドを打つだけでソースコードとJavadocをダウンロードしてくれるはず！
&lt;pre&gt;
mvn eclipse:eclipse
&lt;/pre&gt;

&lt;style type=&quot;text/css&quot;&gt;
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
.gist pre {
  color: #888;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/6433818912303906937/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/08/mvn-eclipseeclipsejavadocsettingsxml.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/6433818912303906937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/6433818912303906937'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/08/mvn-eclipseeclipsejavadocsettingsxml.html' title='mvn eclipse:eclipseでソースコードとJavadocをダウンロードしてくれるsettings.xml'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-8717465903490602340</id><published>2013-08-11T16:20:00.000+09:00</published><updated>2013-08-11T16:27:38.733+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>ListAdapterのgetViewが呼び出される階層を調べてみた</title><content type='html'>ListViewを継承して独自のカスタムViewを作ろうとしてた時に必要になったので、
ListAdapterのgetViewが呼び出される階層を調べてみた。

&lt;pre&gt;
android.widget.ListAdapter#getView
↑
android.widget.AbsListView#obtainView
↑
android.widget.ListView#makeAndAddView
↑
android.widget.ListView#fillDown
↑
android.widget.ListView#fillGap
↑
android.widget.AbsListView#trackMotionScroll
↑
android.widget.AbsListView#scrollIfNeeded
↑
android.widget.AbsListView#onTouchEvent
&lt;/pre&gt;

まだ続いてるけどここまでわかればOKでしょ。
ちなみにこれ4.2.2の挙動ね。

&lt;style type=&quot;text/css&quot;&gt;
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/8717465903490602340/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/08/listadaptergetview.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8717465903490602340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8717465903490602340'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/08/listadaptergetview.html' title='ListAdapterのgetViewが呼び出される階層を調べてみた'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-5555019955940981943</id><published>2013-06-08T17:14:00.000+09:00</published><updated>2013-06-08T17:14:55.933+09:00</updated><title type='text'>githubをMavenリポジトリとしてAndroidライブラリプロジェクト(aar)をデプロイして使用する</title><content type='html'>&lt;h3 class=&quot;title&quot;&gt;序章&lt;/h3&gt;

&lt;p&gt;Android StudioとGradleのビルドシステム(Plugin)が正式にリリースされ、個人的に気になっていたAndroidライブラリプロジェクトの扱いについて調べてみた。新しいGradleのビルドシステムではライブラリプロジェクトはaar(Android archive)という1つのアーカイブで配布することが可能になった。aarファイルは拡張子によって判別され、フォーマットはzip形式である。(aarファイルについての詳細はまた今度。)従来はライブラリプロジェクトを使用するためにプロジェクト一式が必要だったけど、1つのアーカイブを参照するだけで使用出来るようになるので再利用しやすくなったってこと。&lt;/p&gt;

&lt;p&gt;※ちなみにこれまでもandroid-maven-pluginというサードパーティ製のプラグインを使用することで解決されてきたのだけど、個人的には正式にサポートされたというのが大きい。&lt;/p&gt;

&lt;p&gt;現時点ではビルドシステムのソースコードを見る限り、aarを参照する方法は&quot;External module dependencies&quot;タイプしかサポートされていない。これはどこかのリポジトリに配置されたモジュールを参照するということ。Gradleでは様々なリポジトリ形式に対応しているので、それらの形式(MavenとかIvyとか)でaarをデプロイする必要がある。&lt;/p&gt;

&lt;p&gt;注意したいのはただ単にローカルファイルシステム上に配置されたaarを参照出来ないという点である。以下はNGパターン。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dependencies {
    compile files(&#39;path/to/some/a.aar&#39;, &#39;path/to/some/b.aar&#39;)
    compile fileTree(dir: &#39;path/to/some&#39;, include: &#39;*.aar&#39;)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;GradleでもMavenリポジトリ形式が一般的っぽいのでとりあえずaarをMavenリポジトリ形式でgithubにアップロードして使用出来るか試してみた。結果何事もなく出来たので手順を公開しておく。&lt;/p&gt;

&lt;h3 class=&quot;title&quot;&gt;環境&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Android Studio 0.1.1&lt;/li&gt;
&lt;li&gt;Mac OS X 10.8.3&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class=&quot;title&quot;&gt;デプロイ編&lt;/h3&gt;

&lt;p&gt;まずはAndroid Studioを使用して新規プロジェクトを作成する。こんな感じ。Eclipseユーザーにはわかりづらいかもしれないけど、Android Studioで新規プロジェクトを作成する場合はプロジェクト=アプリではなく、モジュール=アプリとなる。つまり、1つのプロジェクト内にライブラリモジュールや本体アプリモジュール、テストアプリモジュールを配置していくことになる。慣れればこっちのがわかりやいかもね。ちなみにEclipseでbuild.gradleファイルをエクスポートしてAndroid Studioでインポートする場合は上記の通りではない。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiivPVyXSz8MyjovwbCtr48ek-eUlHjtvcpBOj9NZrGAUonAFmFM4wMHFqwroMXyyfNMAMyC3J3LRNhyphenhyphenDDczyPBlu-VZuadr14EKkWuscenaSW-hwV69r-I1vaWDSKR55VI54vB7O9hCWzu/s1600/as1.png&quot; width=&quot;600&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ナビ通り進めていくと以下のようなbuild.gradleを含んだプロジェクトが作成される。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj36-By2O0W2K1seiJ2R995Ohp80UM8Mwx_HGyUYu7qn5_5Ywv7EIYNKnwxxBGMVSDCJiT_lWd2J5r4wvVAZZNdHjxlG9Eq4zItVGfc_fOC2nGs-orV_m4PZDRXz1_yWmBahA1r5UdZifcf/s1600/as2.png&quot; width=&quot;800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;現時点でのAndroid Studioは「Mark this project as a library」にチェックを入れてもライブラリプロジェクトとして扱ってくれないらしい。。なので手動で修正。(ソースコードを見る限りそのうち直ると思う。)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apply plugin: &#39;android&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;の箇所を以下に変更。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apply plugin: &#39;android-library&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;試しにaarが作成されるか、ターミナルを起動してビルドしてみる。aarはデバッグ版はassembleDebug、リリース版はassembleReleaseのGradleタスクで作成される。プロジェクト配下で以下のコマンドを実行。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cd &amp;lt;project_home&amp;gt;
$ ./gradlew assembleRelease
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;以下ファイルが生成されていればOK。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ find . -name &#39;*.aar&#39;
./library/build/libs/library.aar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;続いて、Mavenプラグインを使用してMavenリポジトリ形式でデプロイするためlibrary/build.gradleに追記する。Mavenプラグインについては&lt;a href=&quot;http://gradle.monochromeroad.com/docs/userguide/maven_plugin.html&quot;&gt;ここ&lt;/a&gt;を参照。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// プロジェクトルート配下のrepositoryディレクトリにデプロイする
def deployTo = new File(rootDir, &quot;repository&quot;)

// Mavenプラグインの利用を宣言
apply plugin: &#39;maven&#39;

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: &quot;file://${repos.absolutePath}&quot; // デプロイ先
            pom.version = &#39;0.0.1&#39; // ライブラリバージョン
            pom.groupId = &#39;com.u1aryz&#39; // グループ名
            pom.artifactId = &#39;sample-lib&#39; // アーティファクト名
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ターミナルに移ってプロジェクト配下で以下のコマンドを実行。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./gradlew uploadArchives
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;プロジェクト配下のrepositoryディレクトリに以下のようにファイル群が出来ていれば成功。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ls -laR repository
total 0
drwxr-xr-x   3 u1aryz  staff  102  6  1 02:01 .
drwxr-xr-x  18 u1aryz  staff  612  6  1 02:01 ..
drwxr-xr-x   3 u1aryz  staff  102  6  1 02:01 com

repository/com:
total 0
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 .
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 ..
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 u1aryz

repository/com/u1aryz:
total 0
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 .
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 ..
drwxr-xr-x  6 u1aryz  staff  204  6  1 02:01 sample-lib

repository/com/u1aryz/sample-lib:
total 24
drwxr-xr-x  6 u1aryz  staff  204  6  1 02:01 .
drwxr-xr-x  3 u1aryz  staff  102  6  1 02:01 ..
drwxr-xr-x  8 u1aryz  staff  272  6  1 02:01 0.0.1
-rw-r--r--  1 u1aryz  staff  298  6  1 02:09 maven-metadata.xml
-rw-r--r--  1 u1aryz  staff   32  6  1 02:09 maven-metadata.xml.md5
-rw-r--r--  1 u1aryz  staff   40  6  1 02:09 maven-metadata.xml.sha1

repository/com/u1aryz/sample-lib/0.0.1:
total 936
drwxr-xr-x  8 u1aryz  staff     272  6  1 02:01 .
drwxr-xr-x  6 u1aryz  staff     204  6  1 02:01 ..
-rw-r--r--  1 u1aryz  staff  457944  6  1 02:09 sample-lib-0.0.1.aar
-rw-r--r--  1 u1aryz  staff      32  6  1 02:09 sample-lib-0.0.1.aar.md5
-rw-r--r--  1 u1aryz  staff      40  6  1 02:09 sample-lib-0.0.1.aar.sha1
-rw-r--r--  1 u1aryz  staff     422  6  1 02:09 sample-lib-0.0.1.pom
-rw-r--r--  1 u1aryz  staff      32  6  1 02:09 sample-lib-0.0.1.pom.md5
-rw-r--r--  1 u1aryz  staff      40  6  1 02:09 sample-lib-0.0.1.pom.sha1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このファイル群を構成そのままでまるまるgh-pagesブランチにコミットしてgithubにプッシュする。以下のようになっていればOK。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdYViKmrTYaJgQk8aIDFymHqaUgeTw-_DHhvKZNLngf0jZ4NxetmbRYRDTq2BdU9Bt6zJa-Z4ba91Ez4hNf8lTjaioDhU4qqws5ppMSBgZ7bCVBKh-Y1Ji50YBnxVbucWyu4VkfZ3LTov4/s1600/github.png&quot; width=&quot;800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ここまで手順通りに進んでいれば以下の記述をbuild.gradleに追記するだけでaarを参照することが出来る。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;repositories {
    maven { url &#39;http://&amp;lt;githubユーザー名&amp;gt;.github.com/&amp;lt;githubリポジトリ名&amp;gt;/repository&#39; }
}

dependencies {
    compile &#39;com.u1aryz:sample-lib:0.0.1&#39;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;※Mavenリポジトリと言ってもただのファイル群なので、プロジェクト配下でなくてもいいけど、その場合はmavenのurlは変わる。&lt;/p&gt;

&lt;h3 class=&quot;title&quot;&gt;ビルド編&lt;/h3&gt;

&lt;p&gt;今度はgithubにデプロイしたライブラリプロジェクトを参照してビルドしてみる。自分でデプロイしたものを参照したい場合は適宜読み替えて。ここでは俺がデプロイしたやつを使用するでよ。&lt;/p&gt;

&lt;p&gt;新規プロジェクトを作成してもいいけど、めんどいのでさっき作成したSampleLibraryプロジェクトにAndroid Applicationモジュールを追加する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android StudioでFile -&gt; New Module…を選択&lt;/li&gt;
&lt;li&gt;Android Applicationを選択してNext&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSn5y5UVcYdAB_sI1dZJZTvi-rS21_cC0p_YD53VF5fvfvV-WnMICwnDccgds-yNdAt1tuiye44uK-pIc2auDitWjgwIi0MkmJ68W6hgTJd-lCfWm5cJoJ-ys_1z5-OqhcSTJhKyVl_MiR/s1600/as3.png&quot; width=&quot;600&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;ナビ通り進めて作成されたmainモジュールのbuild.gradleにrepositoriesとdependenciesを追記する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;buildscript {
    repositories {
        maven { url &#39;http://repo1.maven.org/maven2&#39; }
    }
    dependencies {
        classpath &#39;com.android.tools.build:gradle:0.4&#39;
    }
}

// 追記
repositories {
    maven { url &#39;http://u1aryz.github.com/Android-NewPopupMenu/repository/release&#39; }
}

apply plugin: &#39;android&#39;

dependencies {
    compile files(&#39;libs/android-support-v4.jar&#39;)
    compile &#39;com.u1aryz:android-newpopupmenu-lib:1.0.1&#39; // 追記
}

android {
    compileSdkVersion 17
    buildToolsVersion &quot;17.0.0&quot;

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 16
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;プロジェクトを開き直すとAndroid Studioがbuild.gradleを読みなおして以下のようにExternal Librariesに追加されているはずや。(これはちょっとめんどい)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAGYLYVEirvz0O65azFAxZZLztTLa0TSpkMoRH7sVtfEqy93m7c-bRAD5S8OnycM_yQbQxi1GFEDpRlaggFGDTpegJcbfhD39lg6LKvg-sLU2Y_InAKxFB8BxJAx6cftWqdlBUiWR1vDUs/s1600/as4.png&quot; width=&quot;600&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;あとは今まで通りライブラリプロジェクトを使用出来る。&lt;/p&gt;

&lt;h3 class=&quot;title&quot;&gt;終章&lt;/h3&gt;

&lt;p&gt;自分で手を入れる必要のないライブラリプロジェクトを使用したい場合は、この方法のがスマートだね。例えば、ActionBarSherlockとかを使用したい場合とか。ちなみにActionBarSherlockは4.3.2でGradle対応するのでmavenCentralにアップされるのが待ち遠しいね〜。&lt;/p&gt;

&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/5555019955940981943/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/06/githubmavenandroidaar.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5555019955940981943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5555019955940981943'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/06/githubmavenandroidaar.html' title='githubをMavenリポジトリとしてAndroidライブラリプロジェクト(aar)をデプロイして使用する'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiivPVyXSz8MyjovwbCtr48ek-eUlHjtvcpBOj9NZrGAUonAFmFM4wMHFqwroMXyyfNMAMyC3J3LRNhyphenhyphenDDczyPBlu-VZuadr14EKkWuscenaSW-hwV69r-I1vaWDSKR55VI54vB7O9hCWzu/s72-c/as1.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-7058441129450358405</id><published>2013-05-25T14:02:00.000+09:00</published><updated>2013-05-25T14:02:44.041+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="IntelliJ"/><title type='text'>Android StudioでRecent Projectのリストをクリアする</title><content type='html'>Android Studioでいろいろ触りまくっているとRecent Projectがいっぱいになってすごい邪魔になる。IntelliJだとRecent Projectをクリアするメニューがあるんだけど、Android Studioだと見つからなかった。なので、無理やりRecent Projectをクリアする方法をメモ。基本的にはIntelliJで無理やりやる方法と一緒。ちなみにMacね。&lt;br /&gt;
&lt;br /&gt;
以下のファイルを開く&lt;br /&gt;
&lt;pre&gt;/Users/&amp;lt;username&amp;gt;/Library/Preferences/AndroidStudioPreview/options/other.xml
&lt;/pre&gt;
&lt;br /&gt;
んで以下のあたりのrecentPathsのlistの中身を消す。&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;component name=&quot;RecentProjectsManager&quot;&amp;gt;
  &amp;lt;option name=&quot;recentPaths&quot;&amp;gt;
    &amp;lt;list&amp;gt;
      &amp;lt;option value=&quot;$USER_HOME$/AndroidStudioProjects/SampleUseLibrary&quot; /&amp;gt;
    &amp;lt;/list&amp;gt;
  &amp;lt;/option&amp;gt;
  &amp;lt;option name=&quot;names&quot;&amp;gt;
    &amp;lt;map&amp;gt;
      &amp;lt;entry key=&quot;$USER_HOME$/AndroidStudioProjects/SampleUseLibrary&quot; value=&quot;&quot; /&amp;gt;
      &amp;lt;entry key=&quot;$USER_HOME$/dev/github/ActionBarSherlock/actionbarsherlock-samples/fragments&quot; value=&quot;&quot; /&amp;gt;
    &amp;lt;/map&amp;gt;
  &amp;lt;/option&amp;gt;
  &amp;lt;option name=&quot;lastPath&quot; value=&quot;$USER_HOME$/AndroidStudioProjects/SampleUseLibrary&quot; /&amp;gt;
&amp;lt;/component&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
以下が修正後。
&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;component name=&quot;RecentProjectsManager&quot;&amp;gt;
  &amp;lt;option name=&quot;recentPaths&quot;&amp;gt;
    &amp;lt;list&amp;gt;
    &amp;lt;/list&amp;gt;
  &amp;lt;/option&amp;gt;
  &amp;lt;option name=&quot;names&quot;&amp;gt;
    &amp;lt;map&amp;gt;
      &amp;lt;entry key=&quot;$USER_HOME$/AndroidStudioProjects/SampleUseLibrary&quot; value=&quot;&quot; /&amp;gt;
      &amp;lt;entry key=&quot;$USER_HOME$/dev/github/ActionBarSherlock/actionbarsherlock-samples/fragments&quot; value=&quot;&quot; /&amp;gt;
    &amp;lt;/map&amp;gt;
  &amp;lt;/option&amp;gt;
  &amp;lt;option name=&quot;lastPath&quot; value=&quot;$USER_HOME$/AndroidStudioProjects/SampleUseLibrary&quot; /&amp;gt;
&amp;lt;/component&amp;gt;
&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/7058441129450358405/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/05/android-studiorecent-project.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7058441129450358405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7058441129450358405'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/05/android-studiorecent-project.html' title='Android StudioでRecent Projectのリストをクリアする'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-5511153566908876764</id><published>2013-01-03T21:43:00.001+09:00</published><updated>2013-01-03T21:43:48.605+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Androidで「Unknown error merging manifest」</title><content type='html'>AndroidでライブラリプロジェクトのAndroidManifest.xmlをメインプロジェクトに自動でマージさせるにはproject.propertiesにmanifestmerger.enabled=trueを加えるだけで良い。
しかし、メインプロジェクトのandroid:targetSdkVersionがライブラリプロジェクトより低いと以下のようなエラーメッセージが表示される。

&lt;pre&gt;
Unknown error merging manifest
&lt;/pre&gt;

もっとわかりやすいメッセージを表示してほしいよね。

&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/5511153566908876764/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/01/androidunknown-error-merging-manifest.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5511153566908876764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5511153566908876764'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/01/androidunknown-error-merging-manifest.html' title='Androidで「Unknown error merging manifest」'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-7427842623988085230</id><published>2013-01-02T01:44:00.000+09:00</published><updated>2013-01-02T21:12:52.398+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gradle"/><title type='text'>GradleでSlim3 + JPPのビルドスクリプトを書いてみた</title><content type='html'>Android(アプリ)も新しいビルドシステムとしてGradleを採用したこともあって、流行りに流行りまくっているGradleを試してみた。とりあえず会社でよく使うSlim3 + JsonPullParserのビルドスクリプトを書いてみた。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Gradleでaptを処理する場合はAntタスクを使うらしい。そんでもってSlim3はJava1.5のaptでJPPはJava1.6のaptを使う必要があるらしいので、これまためんどい。&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src=&quot;https://gist.github.com/4428306.js&quot;&gt;&lt;/script&gt;

実はこれ、javacのバグによってエラーメッセージが誤って報告されるので気持ち悪い。&lt;br /&gt;
もっと良い方法があったら誰か教えて(´・ω・`)&lt;br /&gt;
&lt;br /&gt;
参考資料）&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/kimukou_26/20121015/1350272877&quot; target=&quot;_blank&quot;&gt;jsonpullparser(JPP)のant対応&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/int128/20120813/1344854664&quot; target=&quot;_blank&quot;&gt;GradleでAPT (Annotation Processing Tool) を使う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kinjouj.hatenablog.jp/entry/20121219/1355890620&quot; target=&quot;_blank&quot;&gt;gradleでslim3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://exceptionblend.wordpress.com/2012/08/27/gradle-java6-annotation-processing/&quot; target=&quot;_blank&quot;&gt;[gradle] Java6 Annotation Processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://stackoverflow.com/questions/6431026/generating-jpa2-metamodel-from-a-gradle-build-script&quot; target=&quot;_blank&quot;&gt;Generating JPA2 Metamodel from a Gradle build script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.oracle.com/javase/jp/6/technotes/tools/windows/javac.html&quot; target=&quot;_blank&quot;&gt;javac - Java プログラミング言語コンパイラ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;style type=&quot;text/css&quot;&gt;
pre span {
  color: #000;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/7427842623988085230/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2013/01/gradleslim3-jpp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7427842623988085230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7427842623988085230'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2013/01/gradleslim3-jpp.html' title='GradleでSlim3 + JPPのビルドスクリプトを書いてみた'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-2921905266115444899</id><published>2012-06-03T22:06:00.000+09:00</published><updated>2012-06-03T22:06:29.719+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><title type='text'>さくらVPSのUbuntu10.04(64bit)にgitolite(g3)をインストール</title><content type='html'>Ubuntu11ならaptitudeで簡単にインストール出来るみたいだけど、&lt;br /&gt;
Ubuntu10.04の場合、アレコレちょっとめんどかったのでインストールログを残しておくことにした。&lt;br /&gt;
(それとg3のインストール方法を紹介している日本語のサイトがなかったという理由も)&lt;br /&gt;
&lt;br /&gt;

&lt;h3 class=&quot;title&quot;&gt;
git-coreのインストール&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre&gt;$ sudo apt-get install git-core&lt;/pre&gt;
&lt;br /&gt;

&lt;h3 class=&quot;title&quot;&gt;
セットアップ準備&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
1人目のgitolite管理者ユーザーの鍵を予め作成しておく。
&lt;br /&gt;
&lt;pre&gt;$ ssh-keygen -t rsa&lt;/pre&gt;
&lt;br /&gt;
gitoliteユーザーを作成する。
&lt;br /&gt;
&lt;pre&gt;$ sudo adduser gitolite&lt;/pre&gt;
&lt;br /&gt;
gitoliteユーザーから参照出来る場所に公開鍵を配置する。(あとで削除してね)
&lt;br /&gt;
&lt;pre&gt;$ cp -p .ssh/id_rsa.pub /tmp/ubuntu.pub&lt;/pre&gt;
&lt;br /&gt;

&lt;h3 class=&quot;title&quot;&gt;
gitoliteのインストール / セットアップ
&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
gitoliteユーザーで行う。
&lt;br /&gt;
&lt;pre&gt;$ sudo su - gitolite&lt;/pre&gt;
&lt;br /&gt;
githubからクローン
&lt;br /&gt;
&lt;pre&gt;$ git clone git://github.com/sitaramc/gitolite&lt;/pre&gt;
&lt;br /&gt;
gitoliteインストール
&lt;br /&gt;
&lt;pre&gt;$ gitolite/install&lt;/pre&gt;
&lt;br /&gt;
gitoliteのセットアップを行う。(WARNING出るけど気にしない)
&lt;br /&gt;
&lt;pre&gt;$ export PATH=$HOME/gitolite/src:$PATH
$ gitolite setup -pk /tmp/ubuntu.pub
$ exit
&lt;/pre&gt;
&lt;br /&gt;

&lt;h3 class=&quot;title&quot;&gt;
管理用リポジトリをクローン&lt;/h3&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
セットアップ時に指定した公開鍵のユーザーで管理用リポジトリをクローンする。&lt;br /&gt;
&amp;nbsp;(ここでは同サーバなのでlocalhost)
&lt;br /&gt;
&lt;pre&gt;$ git clone gitolite@localhost:gitolite-admin.git
&lt;/pre&gt;
&lt;br /&gt;

リポジトリを追加する場合はgitolite-admin/conf/gitolite.conf
にrepoを追加してプッシュするだけ。&amp;nbsp;
&lt;br /&gt;
ユーザーを追加する場合はgitolite-admin/keydir配下に公開鍵を
追加してプッシュするだけ。&amp;nbsp;
&lt;br /&gt;
これでリポジトリを追加する作業がgitosisより楽になったー

&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/2921905266115444899/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/06/vpsubuntu100464bitgitoliteg3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/2921905266115444899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/2921905266115444899'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/06/vpsubuntu100464bitgitoliteg3.html' title='さくらVPSのUbuntu10.04(64bit)にgitolite(g3)をインストール'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-4958344418964733774</id><published>2012-05-18T22:31:00.000+09:00</published><updated>2012-05-19T00:59:49.182+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>さくらVPSのUbuntu10.04(64bit)にgit + maven + Jenkinsな環境構築をしてAndroidのCIが出来るまでのメモ</title><content type='html'>Androidに限らずgit + Jenkins + mavenな環境はよく使うと思うけど、初回のビルドはだいたいこける。&lt;br /&gt;
環境が整備出来ていないという理由でね。&lt;br /&gt;
ということでAndroidプロジェクトがCI出来るまでにやったことをメモしておく。&lt;br /&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
Ubuntuインストール・設定&lt;/h3&gt;
&lt;br /&gt;
&lt;a href=&quot;http://d.hatena.ne.jp/mickey24/20110210/sakura_vps&quot; target=&quot;_blank&quot;&gt;さくらVPSにカスタムOSのUbuntu 10.04をインストール+セキュリティ設定などをした時のメモ&lt;/a&gt;&lt;br /&gt;
を参考にインストール・設定を行う。&lt;br /&gt;
(ここではsshのport変更はやってない)&lt;br /&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
Jenkinsインストール&lt;/h3&gt;
&lt;br /&gt;
Jenkinsをインストールするとjenkinsユーザーが自動で作成されるけどなんとなく先に作っておいた。&lt;br /&gt;
&lt;pre&gt;$ sudo adduser jenkins&lt;/pre&gt;
インストールは&lt;a href=&quot;http://pkg.jenkins-ci.org/debian/&quot; target=&quot;_blank&quot;&gt;ここ&lt;/a&gt;を参考に行う。&lt;br /&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
ビルド環境構築&lt;/h3&gt;
&lt;br /&gt;
openjdk-6-jdkとmavenをインストールする。&lt;br /&gt;
&lt;pre&gt;$ sudo apt-get install openjdk-6-jdk&lt;/pre&gt;
mavenインストールは&lt;a href=&quot;http://discursive.com/2011/04/21/installing-maven-3-from-a-binary-deb-on-ubuntu/&quot; target=&quot;_blank&quot;&gt;ここ&lt;/a&gt;を参考に行う。&lt;br /&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
Android SDKインストール&lt;/h3&gt;
&lt;br /&gt;
まず、32ビット版のソフトを動かすためにia32-libsをインストールする。(ハマりポイント)&lt;br /&gt;
&lt;pre&gt;$ sudo apt-get install ia32-libs
&lt;/pre&gt;
&lt;br /&gt;
jenkinsユーザーから実行出来るようにする必要があるのでjenkinsユーザーで行う。&lt;br /&gt;
&lt;pre&gt;$ mkdir -p /var/lib/jenkins/tools
$ cd /var/lib/jenkins/tools
$ wget http://dl.google.com/android/android-sdk_r18-linux.tgz // バージョンは適宜変更
$ tar zxvf android-sdk_r18-linux.tgz
$ ./android-sdk-linux/tools/android update sdk -u
&lt;/pre&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
gitosisインストール・設定&lt;/h3&gt;
&lt;br /&gt;
まず、gitosisをインストールする。今までapt-getで今回はaptitudeだけど気にしないw&lt;br /&gt;
&lt;pre&gt;$ sudo aptitude install gitosis
&lt;/pre&gt;
&lt;br /&gt;
gitosisの初期化の際に一人目の管理者の公開鍵が必要なのでgitosisユーザーから見える箇所に配置する。&lt;br /&gt;
(ここでは同サーバー内のubuntuユーザーを一人目の管理者とする)&lt;br /&gt;
&lt;pre&gt;$ cp -p /home/ubuntu/.ssh/id_rsa.pub /tmp/.
$ sudo su - gitosis
$ gitosis-init &amp;lt; /tmp/id_rsa.pub
&lt;/pre&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
gitリポジトリ作成&lt;/h3&gt;
&lt;br /&gt;
gitosis管理者ユーザーで管理情報リポジトリをクローンする。(クローン済みならpullする)&lt;br /&gt;
&lt;pre&gt;$ git clone gitosis@ホスト名:gitosis-admin.git&lt;/pre&gt;
&lt;br /&gt;
gitosis.confを修正する。(XXXXは任意ユーザー)&lt;br /&gt;
&lt;pre&gt;[gitosis]
loglevel=DEBUG

[group gitosis-admin]
writable = gitosis-admin
members = XXXX

[group リポジトリ名]
writable = リポジトリ名
members = XXXX jenkins
&lt;/pre&gt;
&lt;br /&gt;
修正が終わったらjenkinsユーザーのssh公開鍵をkeydir配下に配置する。&lt;br /&gt;
(ssh公開鍵はパスフレーズなしで作成)&lt;br /&gt;
コミットしてプッシュしたら実際にリポジトリを作成する。&lt;br /&gt;
&lt;pre&gt;$ cd /srv/gitosis/repositories
$ sudo mkdir リポジトリ名.git
$ cd リポジトリ名.git
$ sudo git init --bare --shared=true
$ sudo chown -R gitosis:gitosis ./
&lt;/pre&gt;
&lt;br /&gt;
jenkinsユーザーまたはmembersに記載した任意のユーザーから以下コマンドを実行してクローン出来ることを確認する。&lt;br /&gt;
&lt;pre&gt;$ git clone gitosis@ホスト名:リポジトリ名.git&lt;/pre&gt;
&lt;br /&gt;


&lt;h3 class=&quot;title&quot;&gt;
Jenkinsセットアップ&lt;/h3&gt;
&lt;br /&gt;
jenkinsユーザーがGitリポジトリと通信するためknown_hostsに追加する必要がある。(重要)&lt;br /&gt;
(ここではGitリポジトリとJenkinsが同サーバ)&lt;br /&gt;
&lt;pre&gt;$ sudo -u jenkins ssh gitosis@localhost // yesを答える&lt;/pre&gt;
&lt;br /&gt;
続いてクローン時に必要になるgitconfigの設定を行う。&lt;br /&gt;
&lt;pre&gt;$ sudo su - jenkins
$ git config --global user.email &quot;jenkins@jenkins-server&quot;
$ git config --global user.name &quot;jenkins&quot;
&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;http://your-jenkins-server:8080/&quot; target=&quot;_blank&quot;&gt;http://your-jenkins-server:8080&lt;/a&gt;にアクセスする。&lt;br /&gt;
Jenkinsの管理 -&amp;gt; プラグインの管理から以下の３つを選択してインストールする。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Git plugin&lt;/li&gt;
&lt;li&gt;Android Emulator Plugin&lt;/li&gt;
&lt;li&gt;Android Lint Plugin&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
続いてJenkinsの管理 -&amp;gt; システムの設定から以下を設定する。&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Android&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Android SDK root : /var/lib/jenkins/tools/android-sdk-linux&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Maven&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Name : Default(任意)&lt;/li&gt;
&lt;li&gt;MAVEN_HOME : /usr/local/maven&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;


&lt;h3 class=&quot;title&quot;&gt;
ビルドしてみる&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
上記で作成したリポジトリにプロジェクトを追加してプッシュする。&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://github.com/akquinet/android-archetypes&quot; target=&quot;_blank&quot;&gt;android-archetypes&lt;/a&gt;のandroid-with-testを使用してプロジェクトを作成する。&lt;/div&gt;
&lt;div&gt;
正常に作成出来たらリポジトリにプッシュする。(Jenkinsからクローン出来るように)&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;mvn archetype:generate \
&amp;nbsp; -DarchetypeArtifactId=android-with-test \
&amp;nbsp; -DarchetypeGroupId=de.akquinet.android.archetypes \
&amp;nbsp; -DarchetypeVersion=1.0.8 \
&amp;nbsp; -DgroupId=your.group \
&amp;nbsp; -DartifactId=your-project-name \
&amp;nbsp; -Dpackage=your.package
&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://your-jenkins-server:8080/&quot; target=&quot;_blank&quot;&gt;http://your-jenkins-server:8080&lt;/a&gt;にアクセスし新規ジョブ作成よりMaven2/3プロジェクトのビルドのジョブを作成する。&lt;br /&gt;
&lt;br /&gt;
ソースコード管理システムでGitを選択し、Repository URLにgitosis@ホスト名:リポジトリ名.gitを入力する。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBM7eTGue4FCXjwoYfXwIeFFveD_PMRKJLTV-OBMYPJNQp6ZwwCeMmSwYb6ThzhgGRgXmYBjxTBK7KSYksd1Y7VUKZjrDkAhHJQV-Kc0fHBoTS_oLdEiootBHsgu3Pbgex5u1QU9Srm7Hw/s1600/maven_android_1.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBM7eTGue4FCXjwoYfXwIeFFveD_PMRKJLTV-OBMYPJNQp6ZwwCeMmSwYb6ThzhgGRgXmYBjxTBK7KSYksd1Y7VUKZjrDkAhHJQV-Kc0fHBoTS_oLdEiootBHsgu3Pbgex5u1QU9Srm7Hw/s1600/maven_android_1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
ビルドのルートPOMにリポジトリから見たルートのpom.xmlのパスを入力する。
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
ゴールとオプションにinstallを入力する。&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4NthGg_86xP-FIe81Glkc5zW6UlphA_fN5oOlCq2tVpbRPF-sim7HQVj963RTFavjnK9qTTvEuOqEbuBrfT1RlJf-m86oBw2wbNijYz6TLALynaOxkSlJzH5VNfIftPzQv3_7FCmnjDFj/s1600/maven_android_2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4NthGg_86xP-FIe81Glkc5zW6UlphA_fN5oOlCq2tVpbRPF-sim7HQVj963RTFavjnK9qTTvEuOqEbuBrfT1RlJf-m86oBw2wbNijYz6TLALynaOxkSlJzH5VNfIftPzQv3_7FCmnjDFj/s1600/maven_android_2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
ビルド環境の&quot;Run an Android emulator during build&quot;にチェックを入れ、エミュレーターの設定項目を入力する。
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&quot;Show emulator window&quot;のチェックを外す。(重要)&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Adj_PVKCDxy0lHhXI6OJ6juGP8s7tZTB1N8uokyPYgccQ7K_YI2Q6-Fvp4sh5cAIsvroxmTT-PZmAC0TVwsmTI4JjCznA36ukv5NSFW1gf9B7LkaSqNYVd8zXZknAJO6DE9rS6ZWQBmt/s1600/maven_android_4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9Adj_PVKCDxy0lHhXI6OJ6juGP8s7tZTB1N8uokyPYgccQ7K_YI2Q6-Fvp4sh5cAIsvroxmTT-PZmAC0TVwsmTI4JjCznA36ukv5NSFW1gf9B7LkaSqNYVd8zXZknAJO6DE9rS6ZWQBmt/s1600/maven_android_4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
ビルド後の処理の追加をクリックして成果物を保存を選択する。
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
保存するファイルにメインプロジェクトのapkを指定すればいい。&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmoIj70ImYP-aOV4CBdsupSbwW0fjsgVI8zErHUOLJC13qLikQwsnaT4qtj033PkZVqaL3vyk3yn1Xclyq1tGRbYFkiEfOf6HvkPL3c86TifpMJ6O1dAsaUH2eKwnVf1immiY6tEFvGo3s/s1600/maven_android_5.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmoIj70ImYP-aOV4CBdsupSbwW0fjsgVI8zErHUOLJC13qLikQwsnaT4qtj033PkZVqaL3vyk3yn1Xclyq1tGRbYFkiEfOf6HvkPL3c86TifpMJ6O1dAsaUH2eKwnVf1immiY6tEFvGo3s/s1600/maven_android_5.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
保存、ビルド実行して&quot;Finished: SUCCESS&quot;がコンソールに出力されればOK。
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
最後に成果物としてapkが存在していれば完了〜&lt;/div&gt;

&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/4958344418964733774/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/05/vpsubuntu100464bitgit-maven.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/4958344418964733774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/4958344418964733774'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/05/vpsubuntu100464bitgit-maven.html' title='さくらVPSのUbuntu10.04(64bit)にgit + maven + Jenkinsな環境構築をしてAndroidのCIが出来るまでのメモ'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBM7eTGue4FCXjwoYfXwIeFFveD_PMRKJLTV-OBMYPJNQp6ZwwCeMmSwYb6ThzhgGRgXmYBjxTBK7KSYksd1Y7VUKZjrDkAhHJQV-Kc0fHBoTS_oLdEiootBHsgu3Pbgex5u1QU9Srm7Hw/s72-c/maven_android_1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-8505993328839633026</id><published>2012-03-06T23:43:00.002+09:00</published><updated>2012-03-07T10:18:47.068+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>android-maven-pluginのライフサイクル</title><content type='html'>android-maven-pluginのcomponents.xmlで定義されているライフサイクルを表にまとめてみた。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;packagingがapkの場合(通常のAndroidアプリケーション)&lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;articlesection&quot;&gt;&lt;table&gt;&lt;thead&gt;
&lt;tr&gt;       &lt;th style=&quot;width: 14em;&quot;&gt;phase&lt;/th&gt;       &lt;th style=&quot;width: 17em;&quot;&gt;goal&lt;/th&gt;     &lt;/tr&gt;
&lt;/thead&gt;   &lt;tbody&gt;
&lt;tr&gt;       &lt;td&gt;generate-sources&lt;/td&gt;       &lt;td&gt;android:generate-sources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-resources&lt;/td&gt;       &lt;td&gt;resources:resources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;compile&lt;/td&gt;       &lt;td&gt;compiler:compile&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-classes&lt;/td&gt;       &lt;td&gt;android:proguard&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-test-resources&lt;/td&gt;       &lt;td&gt;resources:testResources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;test-compile&lt;/td&gt;       &lt;td&gt;compiler:testCompile&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;test&lt;/td&gt;       &lt;td&gt;surefire:test&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;prepare-package&lt;/td&gt;       &lt;td&gt;android:dex&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;package&lt;/td&gt;       &lt;td&gt;jar:jar, android:apk&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;install&lt;/td&gt;       &lt;td&gt;install:install&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;pre-integration-test&lt;/td&gt;       &lt;td&gt;android:internal-pre-integration-test&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;integration-test&lt;/td&gt;       &lt;td&gt;android:internal-integration-test&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;deploy&lt;/td&gt;       &lt;td&gt;deploy:deploy&lt;/td&gt;     &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;packagingがapklibの場合(Androidライブラリ)&lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;articlesection&quot;&gt;&lt;table&gt;&lt;thead&gt;
&lt;tr&gt;       &lt;th style=&quot;width: 13em;&quot;&gt;phase&lt;/th&gt;       &lt;th style=&quot;width: 15em;&quot;&gt;goal&lt;/th&gt;     &lt;/tr&gt;
&lt;/thead&gt;   &lt;tbody&gt;
&lt;tr&gt;       &lt;td&gt;generate-sources&lt;/td&gt;       &lt;td&gt;android:generate-sources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-resources&lt;/td&gt;       &lt;td&gt;resources:resources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;compile&lt;/td&gt;       &lt;td&gt;compiler:compile&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-classes&lt;/td&gt;       &lt;td&gt;android:proguard&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;process-test-resources&lt;/td&gt;       &lt;td&gt;resources:testResources&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;test-compile&lt;/td&gt;       &lt;td&gt;compiler:testCompile&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;test&lt;/td&gt;       &lt;td&gt;surefire:test&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;package&lt;/td&gt;       &lt;td&gt;jar:jar, android:apklib&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;install&lt;/td&gt;       &lt;td&gt;install:install&lt;/td&gt;     &lt;/tr&gt;
&lt;tr&gt;       &lt;td&gt;deploy&lt;/td&gt;       &lt;td&gt;deploy:deploy&lt;/td&gt;     &lt;/tr&gt;
&lt;/tbody&gt; &lt;/table&gt;&lt;/div&gt;&lt;br /&gt;
components.xml見るとprepare-packageフェイズでandroid:emmaを呼び出しているように見えるけど&lt;br /&gt;
android:emmaゴールなんて見つからんぞー！？&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
.articlesection table {
  border: 1px #333333 solid;
  border-collapse: collapse;
  padding: 0em 0.6em;
}
.articlesection th, .articlesection td {
  border: 1px #333333 solid;
  padding: 0em 0.6em;
  font-size: 1.2em;
}
.articlesection th {
  color: black;
  background-color: #b01f00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/8505993328839633026/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/03/android-maven-plugin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8505993328839633026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8505993328839633026'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/03/android-maven-plugin.html' title='android-maven-pluginのライフサイクル'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-3861088116212963255</id><published>2012-03-04T19:12:00.001+09:00</published><updated>2012-03-04T23:54:13.286+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IntelliJ"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>MacOS XにIntelliJとmavenで開発環境構築しようと思ったら...</title><content type='html'>Mavenとの相性が良いというのを聞きつけてIntelliJを使い始めてそっこーエラーに遭遇。&lt;br /&gt;
Maven Moduleからarchetypeを選択してプロジェクトを作成しようとするとコンソールらしきところに&lt;br /&gt;
[FATAL_ERROR] Cannot start Maven: No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system.&lt;br /&gt;
&lt;br /&gt;
環境変数のM2_HOMEが設定されてないよ的なメッセージが表示される。&lt;br /&gt;
.bash_profileに設定して読み込んでIntelliJを再起動してみても変わらず。&lt;br /&gt;
色々調べた結果、Mac OSのアプリケーションはbashで設定してる環境変数は読めないということがわかった。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;解決方法&lt;/h3&gt;&lt;br /&gt;
/etc/launchd.confを作成&lt;br /&gt;
&lt;pre&gt;sudo vi /etc/launchd.conf
&lt;/pre&gt;&lt;br /&gt;
内容&lt;br /&gt;
※ /usr/share/mavenの箇所は適宜読み替えて&lt;br /&gt;
&lt;pre&gt;setenv M2_HOME /usr/share/maven
&lt;/pre&gt;&lt;br /&gt;
Mac再起動&lt;br /&gt;
〜終わり〜&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/3861088116212963255/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/03/macos-xintellijmaven.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3861088116212963255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3861088116212963255'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/03/macos-xintellijmaven.html' title='MacOS XにIntelliJとmavenで開発環境構築しようと思ったら...'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-5961259233003443970</id><published>2012-02-19T01:10:00.001+09:00</published><updated>2012-02-19T01:14:51.705+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>AndroidのSpinner内のテキストってselector効かなくね？</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvdeFX4o1ipfnW5xbKsqTc_28dImjdfiM8ofmKxhauR3HAmS-MCoqXQs-T4BEF_jXFg1TsPuj9TVoKDzg7Q1HfsvCxddIxDke11LjJtbdgpnldpva_gF3n8jgTIOs1MDZXhXhqZgR5TNbs/s1600/spinner.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;134&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvdeFX4o1ipfnW5xbKsqTc_28dImjdfiM8ofmKxhauR3HAmS-MCoqXQs-T4BEF_jXFg1TsPuj9TVoKDzg7Q1HfsvCxddIxDke11LjJtbdgpnldpva_gF3n8jgTIOs1MDZXhXhqZgR5TNbs/s400/spinner.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
上記のように条件によってSpinnerを選択不可にしたいパターンはよくあると思う。&lt;br /&gt;
ついでにSpinner内のテキストの色も選択 / 選択不可に応じて色を変えたい場合もあるだろう。&lt;br /&gt;
通常の例に沿って下記のようなセレクタとスタイルを用意してテキストカラー変更を試みてみた。&lt;br /&gt;
color/spinner_text.xml&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;selector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &amp;gt;
    &amp;lt;item android:state_enabled=&quot;false&quot; android:color=&quot;@android:color/darker_gray&quot; /&amp;gt;
    &amp;lt;item android:color=&quot;@android:color/black&quot; /&amp;gt;
&amp;lt;/selector&amp;gt;
&lt;/pre&gt;values/styles.xml&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;resources&amp;gt;
    &amp;lt;style name=&quot;Theme&quot; parent=&quot;@android:style/Theme&quot;&amp;gt;
        &amp;lt;item name=&quot;android:spinnerItemStyle&quot;&amp;gt;@style/SpinnerItem&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;

    &amp;lt;style name=&quot;SpinnerItem&quot; parent=&quot;@android:style/Widget.TextView.SpinnerItem&quot;&amp;gt;
        &amp;lt;item name=&quot;android:textColor&quot;&amp;gt;@color/spinner_text&amp;lt;/item&amp;gt;
    &amp;lt;/style&amp;gt;
&amp;lt;/resources&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
だけど、なぜか選択不可状態の色が反映されず...&lt;br /&gt;
ということで代替案で対応させてみたのが下記。&lt;br /&gt;
SpinnerActivity.java&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class SpinnerActivity extends Activity implements
        OnCheckedChangeListener {

    private Spinner mSpinner;
    private RadioGroup mRadioGroup;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mSpinner = (Spinner) findViewById(R.id.spinner);
        String[] brands =
                new String[] { &quot;LARK&quot;, &quot;Seven Stars&quot;, &quot;MILD SEVEN&quot;, &quot;etc&quot; };
        ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(this,
                android.R.layout.simple_spinner_item, brands);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(adapter);

        mRadioGroup = (RadioGroup) findViewById(R.id.group);
        mRadioGroup.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        RadioButton radioButton = (RadioButton) findViewById(checkedId);
        if (radioButton.isChecked()) {
            spinnerControl(checkedId);
        }
    }

    /**
     * Spinnerの選択状態を制御する
     * @param checkedId
     */
    private void spinnerControl(int checkedId) {

        int color = Color.BLACK;
        switch (checkedId) {
        case R.id.yes:
            mSpinner.setEnabled(true);
            break;

        case R.id.no:
            mSpinner.setEnabled(false);
            color = Color.GRAY;
            break;
        }
        // SpinnerからTextViewを取り出してテキストカラーを設定
        TextView textView = (TextView) mSpinner.getChildAt(0);
        textView.setTextColor(color);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        int checkedId = mRadioGroup.getCheckedRadioButtonId();
        spinnerControl(checkedId);
    }
}
&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBDbSqwA4r2xw3gGzhc7j_Z5Yt0_G2SLBZtF8AiGfYUEcCeB0jg97JfKTPqgH31IHmsOtC8Pc-BSgSUOIy_UoeZHcMcONH2h-TRXoUZLtM9mi4OOrKIvCca9gyA8qFs6AanLie77rDmayC/s1600/spinner2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;133&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBDbSqwA4r2xw3gGzhc7j_Z5Yt0_G2SLBZtF8AiGfYUEcCeB0jg97JfKTPqgH31IHmsOtC8Pc-BSgSUOIy_UoeZHcMcONH2h-TRXoUZLtM9mi4OOrKIvCca9gyA8qFs6AanLie77rDmayC/s400/spinner2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
はい完成。ポイントは50行目〜51行目。&lt;br /&gt;
誰かセレクタで出来た人いたらやり方おせ〜て〜。</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/5961259233003443970/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/02/androidspinnerselector.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5961259233003443970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/5961259233003443970'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/02/androidspinnerselector.html' title='AndroidのSpinner内のテキストってselector効かなくね？'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvdeFX4o1ipfnW5xbKsqTc_28dImjdfiM8ofmKxhauR3HAmS-MCoqXQs-T4BEF_jXFg1TsPuj9TVoKDzg7Q1HfsvCxddIxDke11LjJtbdgpnldpva_gF3n8jgTIOs1MDZXhXhqZgR5TNbs/s72-c/spinner.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-3616969354740177924</id><published>2012-02-18T21:17:00.001+09:00</published><updated>2012-02-19T00:10:08.874+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>パッケージが更新された(バージョンが上がった)時のBroadcastについて</title><content type='html'>パッケージが更新された場合、PACKAGE_REMOVED→PACKAGE_ADDED→PACKAGE_REPLACED&lt;br /&gt;
の順番でBroadcastが投げられる。&lt;br /&gt;
個人的には違和感ありまくりなんだけど、内部的には一旦削除してから追加していて&lt;br /&gt;
このような挙動になっているんだと思う。(確かめてはないけど...)&lt;br /&gt;
&lt;br /&gt;
しかし、パッケージ更新時のみPACKAGE_REMOVEDやPACKAGE_ADDEDの処理を&lt;br /&gt;
スキップしたいことはあると思う。そんな時は以下のようにインテントからデータを&lt;br /&gt;
抜き出して判定してやればいい。&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class PackageMonitor extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        // パッケージ更新の場合はスキップ
        if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
            return;
        }

        if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
            // パッケージが追加された時にしたい処理
        } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
            // パッケージが削除された時にしたい処理
        }
    }

}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/3616969354740177924/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/02/broadcast.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3616969354740177924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3616969354740177924'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/02/broadcast.html' title='パッケージが更新された(バージョンが上がった)時のBroadcastについて'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-1066263013829080376</id><published>2012-02-10T23:48:00.000+09:00</published><updated>2012-02-10T23:48:10.951+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>RenamingDelegatingContextを使ってみた</title><content type='html'>昨年(2011年)の8月に開催された&lt;a href=&quot;https://sites.google.com/site/androidtestclub/atecfes/1st&quot; target=&quot;_blank&quot;&gt;Androidテスト祭り&lt;/a&gt;で@ussy00さんの発表を聞いてRenamingDelegatingContextの存在を&lt;br /&gt;
知ってから結構経ってしまったけど、ようやく仕事でDBを使う機会が出来たので使ってみた。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;なにが出来るの？&lt;/h3&gt;&lt;br /&gt;
RenamingDelegatingContextを使うことでテスト用のプレフィックスのついたSQLiteファイルが用意され、&lt;br /&gt;
毎回クリーンなデータベース環境が手に入る。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;使ってみる&lt;/h3&gt;&lt;br /&gt;
一応テスト対象のクラス等も紹介しておく。&lt;br /&gt;
&lt;br /&gt;
Employee.java(DTO的な何か。必要に応じてシリアライズ可能に。)&lt;br /&gt;
※ ゲッター/セッター、import省略&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class Employee {

    public static class EmployeeColumns {

        public static final String ID = &quot;_id&quot;; // 社員ID

        public static final String NAME = &quot;name&quot;; // 社員名

        public static final String DEPARTMENT = &quot;department&quot;; // 部署
    }

    public static final String TABLE_NAME = &quot;employee&quot;;

    private int id;
    private String name;
    private String department;
}
&lt;/pre&gt;&lt;br /&gt;
テーブル構成も簡単にしてみた。&lt;br /&gt;
DatabaseHelper.java(ヘルパー)&lt;br /&gt;
※ import省略&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = &quot;company.db&quot;;
    private static final int DATABASE_VERSION = 1;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(&quot;CREATE TABLE &quot; + Employee.TABLE_NAME + &quot;(&quot; +
                Employee.EmployeeColumns.ID + &quot; INTEGER PRIMARY KEY AUTOINCREMENT,&quot; +
                Employee.EmployeeColumns.NAME + &quot; TEXT NOT NULL,&quot; +
                Employee.EmployeeColumns.DEPARTMENT + &quot; TEXT NOT NULL&quot; +
                &quot;)&quot;);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}
&lt;/pre&gt;&lt;br /&gt;
EmployeeDao.java(データベースアクセスクラス。今回のテスト対象クラス。)&lt;br /&gt;
※ import省略&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class EmployeeDao {

    private DatabaseHelper mHelper;

    public EmployeeDao(Context context) {
        mHelper = new DatabaseHelper(context);
    }

    /**
     * 部署を条件に社員一覧を取得する。
     * 順不同
     * @param department
     * @return 社員一覧 0件の場合は空のリスト
     */
    public List&amp;lt;Employee&amp;gt; getEmployeeByDepartment(String department) {
        List&amp;lt;Employee&amp;gt; employees = new ArrayList&amp;lt;Employee&amp;gt;();
        SQLiteDatabase db = mHelper.getReadableDatabase();

        try {
            Cursor c = db.query(Employee.TABLE_NAME,
                    new String[]{ EmployeeColumns.ID,
                            EmployeeColumns.NAME,
                            EmployeeColumns.DEPARTMENT },
                    EmployeeColumns.DEPARTMENT + &quot; = ?&quot;,
                    new String[]{ department }, null, null, null);
            c.moveToFirst();
            while (!c.isAfterLast()) {
                Employee employee = new Employee();
                employee.setId(c.getInt(c.getColumnIndex(EmployeeColumns.ID)));
                employee.setName(c.getString(c.getColumnIndex(EmployeeColumns.NAME)));
                employee.setDepartment(c.getString(c.getColumnIndex(EmployeeColumns.DEPARTMENT)));
                employees.add(employee);
                c.moveToNext();
            }
            c.close();
        } finally {
            db.close();
        }
        return employees;
    }
}
&lt;/pre&gt;&lt;br /&gt;
そして今回のポイントとなるテストクラス。&lt;br /&gt;
EmployeeDaoTest.java&lt;br /&gt;
※ import省略&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;public class EmployeeDaoTest extends AndroidTestCase {

    private static final String TEST_PREFIX = &quot;test_&quot;;
    private DatabaseHelper mHelper;
    private RenamingDelegatingContext mContext;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mContext = new RenamingDelegatingContext(getContext(), TEST_PREFIX);
        // テストメソッド毎に空のテスト用DBを用意
        mHelper = new DatabaseHelper(mContext);
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        mHelper.close();
    }

    /**
     * getEmployeeByDepartmentのテスト
     */
    public void testGetEmployeeByDepartment() {
        // RenamingDelegatingContextを渡してテスト用DBを使用する
        EmployeeDao dao = new EmployeeDao(mContext);
        List&amp;lt;Employee&amp;gt; employees = dao.getEmployeeByDepartment(&quot;人事部&quot;);
        assertNotNull(employees);
        // これ以降のテストは省略
    }
}
&lt;/pre&gt;&lt;br /&gt;
ソースを見ればわかると思うけど手順は簡単で&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Context と文字列を渡してRenamingDelegatingContextを生成&lt;/li&gt;
&lt;li&gt;生成したRenamingDelegatingContextを渡してヘルパーを生成&lt;/li&gt;
&lt;/ul&gt;以上。&lt;br /&gt;
&lt;br /&gt;
これを実行すると。。。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCTxB1EirgnCUhYBUSXGLUZ9xLdgnyG-j6KXqicXivk3Fz9cl_fEju6-gRjW6SxINi7GPY3xdoggdZIYxqKt85AifXDEqVCLeH7VhtZIhznV2u0JphaGgJnJ6WlyT3ErKL5eU7uXYTR2ye/s1600/RenamingDelegatingContext.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCTxB1EirgnCUhYBUSXGLUZ9xLdgnyG-j6KXqicXivk3Fz9cl_fEju6-gRjW6SxINi7GPY3xdoggdZIYxqKt85AifXDEqVCLeH7VhtZIhznV2u0JphaGgJnJ6WlyT3ErKL5eU7uXYTR2ye/s1600/RenamingDelegatingContext.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;テスト用のDBがちゃんとあるね。&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/1066263013829080376/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/02/renamingdelegatingcontext.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/1066263013829080376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/1066263013829080376'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/02/renamingdelegatingcontext.html' title='RenamingDelegatingContextを使ってみた'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCTxB1EirgnCUhYBUSXGLUZ9xLdgnyG-j6KXqicXivk3Fz9cl_fEju6-gRjW6SxINi7GPY3xdoggdZIYxqKt85AifXDEqVCLeH7VhtZIhznV2u0JphaGgJnJ6WlyT3ErKL5eU7uXYTR2ye/s72-c/RenamingDelegatingContext.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-3219709903992373262</id><published>2012-01-26T22:56:00.002+09:00</published><updated>2012-01-27T00:22:53.204+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>AndroidでDBの存在確認</title><content type='html'>AndroidでDBの存在確認の仕方は他にもあるけど、&lt;br /&gt;
データベースの保存場所がストレージであれば「/data/data/パッケージ名/databases/DB名」&lt;br /&gt;
に保存されるのでファイルの存在確認するのが手っ取り早い。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;String DB_NAME = &quot;test.db&quot;;

File file = new File(context.getDatabasePath(DB_NAME).getPath());
boolean dbExists = file.exists();
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/3219709903992373262/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/01/androiddb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3219709903992373262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3219709903992373262'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/01/androiddb.html' title='AndroidでDBの存在確認'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-7202809039598556269</id><published>2012-01-11T23:20:00.002+09:00</published><updated>2012-02-19T00:04:10.500+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Androidでステータスバー(通知バー)を起動する</title><content type='html'>ステータスバーとか通知バーとかいろんな言い方あるけど、とにかくコレのこと↓&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQOqMOavS4JK0j9rB-jrNWEvHZab-mZcuxpuAls9dtWKz9zzy84j3JQK8cCzvA61cr6ZanOGmp589hq6FyPtldELXkUohsN6eMV0JCfRVMs8264Wmhj8js5yJW8T694Au5szkvIQO5Qsl/s1600/notification.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQOqMOavS4JK0j9rB-jrNWEvHZab-mZcuxpuAls9dtWKz9zzy84j3JQK8cCzvA61cr6ZanOGmp589hq6FyPtldELXkUohsN6eMV0JCfRVMs8264Wmhj8js5yJW8T694Au5szkvIQO5Qsl/s320/notification.png&quot; width=&quot;192&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
これを起動するのにちょいと手間がかかる。かかるといってもたいしたことはないけど。&lt;br /&gt;
まず、AndroidManifest.xmlに下記パーミッションを追加。&lt;br /&gt;
&lt;pre&gt;&amp;lt;uses-permission android:name=&quot;android.permission.EXPAND_STATUS_BAR&quot; /&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
あとはこんな感じのソースを書いて呼べばOK。&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;private void showNotifications() {
    try {
        Object service = getSystemService(&quot;statusbar&quot;);
        if (service != null) {
            Method expand = service.getClass().getMethod(&quot;expand&quot;);
            expand.invoke(service);
        }
    } catch (Exception e) {
    }
}
&lt;/pre&gt;&lt;br /&gt;
ちなみにHideなAPI使ってるのでいきなり使えなくなるかも？&lt;br /&gt;
&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/7202809039598556269/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/01/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7202809039598556269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7202809039598556269'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/01/android.html' title='Androidでステータスバー(通知バー)を起動する'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifQOqMOavS4JK0j9rB-jrNWEvHZab-mZcuxpuAls9dtWKz9zzy84j3JQK8cCzvA61cr6ZanOGmp589hq6FyPtldELXkUohsN6eMV0JCfRVMs8264Wmhj8js5yJW8T694Au5szkvIQO5Qsl/s72-c/notification.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-4781349772531322506</id><published>2012-01-05T19:56:00.000+09:00</published><updated>2012-01-05T19:56:20.940+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><title type='text'>twitter4jを使用してツイートするサンプルをHeroku上で動かす</title><content type='html'>RailsでHeroku上にTwitterサービスを作り始める場合&lt;a href=&quot;http://kray.jp/blog/twitter_service_in_1hours/&quot; target=&quot;_blank&quot;&gt;「１時間でツイッターサービスを作ろう！」&lt;/a&gt;の記事が参考になる。&lt;br /&gt;
Railsもいいけど最近Androidでも活躍しているtwitter4jを使ってみたかったのでtwitter4jを使用して&lt;br /&gt;
ツイートをポストするWebアプリをHeroku上にデプロイしてみた。&lt;br /&gt;
twitter4jの作者である@yusukeさんのサンプルソースを流用するのでだいたい30分くらいで出来る。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;事前準備&lt;/h3&gt;&lt;ul&gt;&lt;li class=&quot;item&quot;&gt;Gitインストール&lt;/li&gt;
&lt;li class=&quot;item&quot;&gt;Maven 3インストール&lt;/li&gt;
&lt;li class=&quot;item&quot;&gt;Herokuのアカウント作成&lt;/li&gt;
&lt;li class=&quot;item&quot;&gt;herokuコマンドインストール&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Herokuアプリケーションの作成&lt;/h3&gt;&lt;pre&gt;$ heroku create --stack cedar
Creating blazing-mist-9962... done, stack is cedar
http://blazing-mist-9962.herokuapp.com/ | git@heroku.com:blazing-mist-9962.git
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Twitterサービスの登録&lt;/h3&gt;&lt;br /&gt;
&lt;a href=&quot;https://dev.twitter.com/apps/new&quot; target=&quot;_blank&quot;&gt;https://dev.twitter.com/apps/new&lt;/a&gt;にアクセスして今回作成するサービスの情報を入力し登録する。&lt;br /&gt;
Callback URLはHerokuアプリケーションの作成時に表示されたURL + callback&lt;br /&gt;
&lt;br /&gt;
Name(アプリケーション名)：u1aryzの備忘録とか(任意)&lt;br /&gt;
Description(アプリケーションの説明)：Herokuからtwitter4jを使用してツイートをポストするサンプル。(任意)&lt;br /&gt;
WebSite(ウェブサイトURL)：http://u1aryz.blogspot.com/(任意)&lt;br /&gt;
Callback URL(コールバックURL)：http://blazing-mist-9962.herokuapp.com/callback&lt;br /&gt;
&lt;br /&gt;
登録し終わったらSettingsからApplication TypeをRead and Writeに変更。&lt;br /&gt;
Consumer keyとConsumer secretは後で使用するのでメモ。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;twitter4jのサンプルソースをダウンロード&lt;/h3&gt;&lt;br /&gt;
GitHubで公開されているtwitter4jのサンプルソースをダウンロードする。&lt;br /&gt;
&lt;a href=&quot;https://github.com/yusuke/sign-in-with-twitter&quot; target=&quot;_blank&quot;&gt;yusuke / sign-in-with-twitter&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Heroku(Jetty)用に修正＆追加&lt;/h3&gt;&lt;br /&gt;
pom.xml(修正)&lt;br /&gt;
&lt;pre&gt;&amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
↓変更
&amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;

&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;
  &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
↓変更
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
pom.xml(追記)&lt;br /&gt;
&lt;pre&gt;dependenciesの子ノードに下記を追加
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jetty-webapp&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;7.4.5.v20110725&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;taglibs&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;standard&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.1.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jsp-2.1-glassfish&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.1.v20100127&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;

build,pluginsの子ノードに下記を追加
&amp;lt;plugin&amp;gt;
  &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;appassembler-maven-plugin&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;
  &amp;lt;executions&amp;gt;
    &amp;lt;execution&amp;gt;
      &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;
      &amp;lt;goals&amp;gt;
        &amp;lt;goal&amp;gt;assemble&amp;lt;/goal&amp;gt;
      &amp;lt;/goals&amp;gt;
      &amp;lt;configuration&amp;gt;
        &amp;lt;assembleDirectory&amp;gt;target&amp;lt;/assembleDirectory&amp;gt;
        &amp;lt;programs&amp;gt;
          &amp;lt;program&amp;gt;
            &amp;lt;mainClass&amp;gt;twitter4j.examples.signin.StartServer&amp;lt;/mainClass&amp;gt;
            &amp;lt;name&amp;gt;webapp&amp;lt;/name&amp;gt;
          &amp;lt;/program&amp;gt;
        &amp;lt;/programs&amp;gt;
      &amp;lt;/configuration&amp;gt;
    &amp;lt;/execution&amp;gt;
  &amp;lt;/executions&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
StartServer.java(新規)&lt;br /&gt;
&lt;pre class=&quot;java&quot; name=&quot;code&quot;&gt;package twitter4j.examples.signin;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class StartServer {

    public static void main(String[] args) throws Exception {

        Server server = new Server(Integer.valueOf(System.getenv(&quot;PORT&quot;)));
        WebAppContext context = new WebAppContext(&quot;src/main/webapp&quot;, &quot;/&quot;);
        context.setDescriptor(&quot;WEB-INF/web.xml&quot;);
        server.setHandler(context);

        server.start();
        server.join();
    }

}

&lt;/pre&gt;&lt;br /&gt;
twitter4j.properties(修正)&lt;br /&gt;
twitter4j.oauth.consumerKeyとtwitter4j.oauth.consumerSecretにそれぞれ上記で登録した内容を入れる。&lt;br /&gt;
入力したらファイル自体をプロジェクト直下に移動する。&lt;br /&gt;
&lt;br /&gt;
Procfile(新規)&lt;br /&gt;
下記内容でプロジェクト直下に作成する。&lt;br /&gt;
&lt;pre&gt;web: sh target/bin/webapp&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Herokuにデプロイ&lt;/h3&gt;&lt;br /&gt;
デプロイといってもソースをプッシュするだけ。&lt;br /&gt;
&lt;pre&gt;$ cd プロジェクトディレクトリ
$ git init
$ git add .
$ git commit -m &quot;Generate twitter app.&quot;
$ git remote add heroku git@heroku.com:blazing-mist-9962.git
$ git push heroku master
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;ツイートしてみる&lt;/h3&gt;&lt;pre&gt;$ heroku open&lt;/pre&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9QjFLIGTRu1w182sAFJOpkZ-uRCqMxSeOFbKKOt22lWuqDNbFVfedCldIvGa1GRQQxXuzZTCEIqO_IMp9oVVKPPalYCg1b-YKiAI7EBpnBXVsTP-Gdfdhc7cdHHrZwo3SYL6RcFHHkVMD/s1600/twitter4j_on_heroku1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;437&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9QjFLIGTRu1w182sAFJOpkZ-uRCqMxSeOFbKKOt22lWuqDNbFVfedCldIvGa1GRQQxXuzZTCEIqO_IMp9oVVKPPalYCg1b-YKiAI7EBpnBXVsTP-Gdfdhc7cdHHrZwo3SYL6RcFHHkVMD/s640/twitter4j_on_heroku1.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;ログイン後、コールバックURLが呼ばれ下記のようなページが表示される。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlMy1UC7FisG-5s0OJxLnoL16q-OYMsl1q315G-QrRfxStP6Luead9wtQzWZtj4Mq0K3zvLHns3vFEiQuUXX8MvMzCAdPg-0W4ulNDWqNUMs15cLjT7Vrq9WCJw6jMh5SRprO7sUQx0tl/s1600/twitter4j_on_heroku2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;123&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKlMy1UC7FisG-5s0OJxLnoL16q-OYMsl1q315G-QrRfxStP6Luead9wtQzWZtj4Mq0K3zvLHns3vFEiQuUXX8MvMzCAdPg-0W4ulNDWqNUMs15cLjT7Vrq9WCJw6jMh5SRprO7sUQx0tl/s640/twitter4j_on_heroku2.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;公式Twitterで確認出来る通り、ツイート出来ていることがわかる。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0dvjw7mtevxRb7iSqCOFoBbwt27rZ6TOEGiHEKkA64Y8P7svbsxaKkhWKXAW7Czy7HYmMYea8_E-MdbJbtFrHqvGF6Ix5-swPOyORC_V0FfDhkv9zD_MHwgBuk3nrRz5kr7hHo6eUMod/s1600/twitter4j_on_heroku3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;207&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0dvjw7mtevxRb7iSqCOFoBbwt27rZ6TOEGiHEKkA64Y8P7svbsxaKkhWKXAW7Czy7HYmMYea8_E-MdbJbtFrHqvGF6Ix5-swPOyORC_V0FfDhkv9zD_MHwgBuk3nrRz5kr7hHo6eUMod/s640/twitter4j_on_heroku3.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/4781349772531322506/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2012/01/twitter4jheroku.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/4781349772531322506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/4781349772531322506'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2012/01/twitter4jheroku.html' title='twitter4jを使用してツイートするサンプルをHeroku上で動かす'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9QjFLIGTRu1w182sAFJOpkZ-uRCqMxSeOFbKKOt22lWuqDNbFVfedCldIvGa1GRQQxXuzZTCEIqO_IMp9oVVKPPalYCg1b-YKiAI7EBpnBXVsTP-Gdfdhc7cdHHrZwo3SYL6RcFHHkVMD/s72-c/twitter4j_on_heroku1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-8012578215760918237</id><published>2011-12-26T15:02:00.005+09:00</published><updated>2011-12-27T12:22:24.288+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><title type='text'>Androidでファイルの入出力</title><content type='html'>汎用的なユーティリティー系の処理はその都度書いていては時間の無駄なので&lt;br /&gt;
ファイルの入出力の処理をコピペ出来るようにここに貼付けておく。&lt;br /&gt;
ちなみにファイルの入出力先は「/data/data/パッケージ名/files/」&lt;br /&gt;
&lt;br /&gt;
FileUtils.java&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package yourpackage;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;

public class FileUtils {

    /**
     * ファイルへ文字列を書き込み
     * @param context
     * @param str ファイル出力文字列
     * @param fileName ファイル名
     */
    public static void writeFile(Context context, String str, String fileName) {
        writeBinaryFile(context, str.getBytes(), fileName);
    }

    /**
     * ファイルへバイナリデータを書き込み
     * @param context
     * @param data バイトデータ
     * @param fileName ファイル名
     */
    public static void writeBinaryFile(Context context, byte[] data, String fileName) {
        OutputStream out = null;
        try {
            out = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            out.write(data, 0, data.length);
        } catch (Exception e) {
            // 必要に応じて
//            throw e;
        } finally {
            try {
                if (out != null) out.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * ファイルから文字列を読み込む
     * @param context
     * @param fileName ファイル名
     * @return 文字列 ファイルがない場合はnull
     */
    public static String readFile(Context context, String fileName) {
        String str = null;
        byte[] data = readBinaryFile(context, fileName);
        if (data != null) {
            str = new String(data);
        }
        return str;
    }

    /**
     * ファイルからバイナリデータを読み込む
     * @param context
     * @param fileName
     * @return バイトデータ ファイルがない場合はnull
     */
    public static byte[] readBinaryFile(Context context, String fileName) {
        // ファイルの存在チェック
        if (!(new File(context.getFilesDir().getPath() + &quot;/&quot; + fileName).exists())) {
            return null;
        }

        int size;
        byte[] data = new byte[1024];
        InputStream in = null;
        ByteArrayOutputStream out = null;

        try {
            in = context.openFileInput(fileName);
            out = new ByteArrayOutputStream();
            while ((size = in.read(data)) != -1) {
                out.write(data, 0, size);
            }
            return out.toByteArray();
        } catch (Exception e) {
            // エラーの場合もnullを返すのでここでは何もしない
        } finally {
            try {
                if (in != null) in.close();
                if (out != null) out.close();
            } catch (Exception e) {
            }
        }

        return null;
    }
}

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/8012578215760918237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8012578215760918237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/8012578215760918237'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/android.html' title='Androidでファイルの入出力'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-7279462393557764863</id><published>2011-12-16T03:57:00.115+09:00</published><updated>2012-01-04T23:48:04.732+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Heroku"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>RubyでHerokuにデプロイするまでのメモ for Mac OS X (Snow Leopard)</title><content type='html'>Ruby使ったことないけどHerokuを使いたいがためにRailsを勉強することになった。&lt;br /&gt;
ちなみにHerokuは現在Node.js, Clojure, Java, Python, Scalaもサポートしているので&lt;br /&gt;
Railsじゃなくてもいいだろってツッコミがありそうだけど、もともとRubyのPaaSなので。&lt;br /&gt;
ということで環境構築からHerokuでデプロイするまでの流れをメモ。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;事前準備&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Xcodeインストール&lt;/li&gt;
&lt;li&gt;MacPortsインストール&lt;/li&gt;
&lt;li&gt;Gitインストール&lt;/li&gt;
&lt;li&gt;Herokuのアカウント作成&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;MacPortsアップデート&lt;/h3&gt;&lt;pre&gt;$ export PATH=$PATH:/opt/local/bin/ # MacPortsのパスを通す
$ sudo port -d selfupdate
$ sudo port -d sync
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;RVM(Ruby Version Manager)インストール&lt;/h3&gt;&lt;pre&gt;$ bash &lt; &lt;(curl -sk https://rvm.beginrescueend.com/install/rvm)
$ echo &#39;[[ -s &quot;$HOME/.rvm/scripts/rvm&quot; ]] &amp;&amp; source &quot;$HOME/.rvm/scripts/rvm&quot;&#39; &gt;&gt; ~/.bash_profile
$ source .bash_profile
$ rvm --version

rvm 1.10.0 by Wayne E. Seguin (wayneeseguin@gmail.com) [https://rvm.beginrescueend.com/]
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Rubyインストール&lt;/h3&gt;&lt;br /&gt;
Herokuでのサポートされている1.9.2をインストール。&lt;br /&gt;
Macにもともと入っているRubyは1.8.7なので別途インストールする必要がある。&lt;br /&gt;
&lt;pre&gt;$ rvm pkg install readline
$ rvm install 1.9.2 --with-readline-dir=$HOME/.rvm/usr
$ rvm use 1.9.2 --default
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;必要なパッケージのインストール&lt;/h3&gt;&lt;pre&gt;$ gem install rails
$ gem install sqlite3
$ gem install heroku
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;プロジェクト作成&lt;/h3&gt;&lt;pre&gt;$ mkdir project
$ cd project
$ rails new herokuapp
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;ひな形を作成してマイグレーションを実行&lt;/h3&gt;&lt;br /&gt;
どうせならHello World的なやつではなくscaffoldを使ってみる。&lt;br /&gt;
&lt;pre&gt;$ cd herokuapp
$ rails g scaffold Product title:string description:text image_url:string price:decimal
$ rake db:migrate
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;ローカルで実行&lt;/h3&gt;&lt;br /&gt;
ローカルでアクセスしてみる。&lt;br /&gt;
&lt;pre&gt;$ rake routes
    products GET    /products(.:format)          {:action=&gt;&quot;index&quot;, :controller=&gt;&quot;products&quot;}
             POST   /products(.:format)          {:action=&gt;&quot;create&quot;, :controller=&gt;&quot;products&quot;}
 new_product GET    /products/new(.:format)      {:action=&gt;&quot;new&quot;, :controller=&gt;&quot;products&quot;}
edit_product GET    /products/:id/edit(.:format) {:action=&gt;&quot;edit&quot;, :controller=&gt;&quot;products&quot;}
     product GET    /products/:id(.:format)      {:action=&gt;&quot;show&quot;, :controller=&gt;&quot;products&quot;}
             PUT    /products/:id(.:format)      {:action=&gt;&quot;update&quot;, :controller=&gt;&quot;products&quot;}
             DELETE /products/:id(.:format)      {:action=&gt;&quot;destroy&quot;, :controller=&gt;&quot;products&quot;}

$ rails s
&lt;/pre&gt;ブラウザで&lt;a target=&quot;_blank&quot; href=&quot;http://localhost:3000/products&quot;&gt;http://localhost:3000/products&lt;/a&gt;にアクセス。&lt;br /&gt;
正常にアクセス出来たら次へ。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Heroku用に修正&amp;追加&lt;/h3&gt;&lt;br /&gt;
Herokuは無料の範囲だとPostgreSQLを使うことになるのでGemfileの内容を下記のように書き換える。&lt;br /&gt;
&lt;pre&gt;gem &#39;sqlite3&#39;
↓
gem &#39;pg&#39;
&lt;/pre&gt;&lt;br /&gt;
必要なパッケージをインストールしてGitのローカルリポジトリへコミット。&lt;br /&gt;
&lt;pre&gt;$ sudo port install postgresql84
$ sudo ln -s /opt/local/bin/psql84 /usr/bin/psql
$ gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
$ bundle install
$ RAILS_ENV=production bundle exec rake assets:precompile
$ git init
$ git add .
$ git commit -m &quot;Generate rails app.&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Herokuへデプロイ&lt;/h3&gt;&lt;br /&gt;
一番最初にHerokuアプリを作成する場合、emailとパスワードの入力を求められるので入力する。&lt;br /&gt;
&lt;pre&gt;$ heroku create
Enter your Heroku credentials.
Email: u1aryz.d@gmail.com
Password: 
Creating fierce-autumn-9435... done, stack is bamboo-mri-1.9.2
http://fierce-autumn-9435.heroku.com/ | git@heroku.com:fierce-autumn-9435.git
Git remote heroku added

$ git push heroku master
$ heroku rake db:migrate
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;デプロイされたWebアプリへアクセス&lt;/h3&gt;&lt;pre&gt;$ heroku open&lt;/pre&gt;これでブラウザが立ち上がるはずなので、urlにルートのパス(/products)を追加してアクセス。&lt;br /&gt;
最初はだいぶ手こずったけど次からは楽ちん。&lt;br /&gt;
便利な時代になったなー。&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/7279462393557764863/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/rubyheroku-for-mac-os-x-snow-leopard.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7279462393557764863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7279462393557764863'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/rubyheroku-for-mac-os-x-snow-leopard.html' title='RubyでHerokuにデプロイするまでのメモ for Mac OS X (Snow Leopard)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-7937221772129230162</id><published>2011-12-14T06:33:00.004+09:00</published><updated>2011-12-14T09:25:51.401+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Jetty"/><category scheme="http://www.blogger.com/atom/ns#" term="Redmine"/><title type='text'>Redmine1.3.0をJettyで動作出来たときの各バージョン</title><content type='html'>RedmineをJetty上で動作させる手順は&lt;a target=&quot;_blank&quot; href=&quot;http://d.hatena.ne.jp/mistat/20101207/1292525059&quot;&gt;「RedmineをJettyで動かす覚え書き。」&lt;/a&gt;に詳しく書かれている。&lt;br /&gt;
しかし、gemとかRails、Rackなどその他いろいろなバージョンを合わせないと動作しないので&lt;br /&gt;
Jetty上でRedmine1.3.0を動作出来たときの各バージョンを記録しておく。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;JRubyのバージョン&lt;/h3&gt;&lt;pre&gt;$ jruby -v
jruby 1.6.5 (ruby-1.8.7-p330) (2011-10-25 9dcd388) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_26) [linux-amd64-java]
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;gemのバージョン&lt;/h3&gt;&lt;pre&gt;$ jruby -S gem -v
1.3.7
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;その他のバージョン&lt;/h3&gt;&lt;pre&gt;$ jruby -S gem list

*** LOCAL GEMS ***

actionmailer (2.3.14)
actionpack (2.3.14)
activerecord (2.3.14)
activerecord-jdbc-adapter (1.2.1)
activerecord-jdbcsqlite3-adapter (1.2.1)
activeresource (2.3.14)
activesupport (2.3.14)
bouncy-castle-java (1.5.0146.1)
i18n (0.4.2)
jdbc-sqlite3 (3.7.2)
jruby-jars (1.6.5)
jruby-openssl (0.7.4)
jruby-rack (0.9.8)
rack (1.1.2)
rails (2.3.14)
rake (0.8.7)
rubygems-update (1.3.7)
rubyzip (0.9.5)
sources (0.0.1)
warbler (1.1.0)
&lt;/pre&gt;&lt;br /&gt;
ちなみにgem、Rails、warbler、jruby-rackを上記のバージョンを指定してインストールしたら動作出来た。&lt;br /&gt;
Rubyわからんと苦労するわー。&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/7937221772129230162/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/redmine130jetty.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7937221772129230162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/7937221772129230162'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/redmine130jetty.html' title='Redmine1.3.0をJettyで動作出来たときの各バージョン'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-585881049897238783</id><published>2011-12-12T08:01:00.008+09:00</published><updated>2011-12-13T00:26:15.628+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Jetty"/><title type='text'>jetty8でBASIC認証</title><content type='html'>jettyでBASIC認証する必要があったので忘れずメモ。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;jetty側の設定&lt;/h3&gt;&lt;br /&gt;
まず認証レルムの設定ファイルを用意する。&lt;br /&gt;
用意すると言ってもデフォルトで$JETTY_HOME/etc/realm.propertiesが存在するのでこちらを利用する。&lt;br /&gt;
下記のフォーマットで記述する。&lt;br /&gt;
&lt;pre&gt;username: password[,rolename ...]&lt;/pre&gt;暗号化する場合は種類に応じてOBF:、MD5:、CRYPT:のプレフィックスを付与する。&lt;br /&gt;
暗号化する場合は下記のようにして生成する。&lt;br /&gt;
&lt;pre&gt;$ java -cp lib/jetty-xxx.jar:lib/jetty-util-xxx.jar org.mortbay.jetty.security.Password ユーザー名 パスワード&lt;/pre&gt;しかし、なぜか$JETTY_HOME/lib内にorg.mortbay.jetty.security.Passwordクラスが見つからなかったので&lt;br /&gt;
下記２つをダウンロードして生成する。&lt;br /&gt;
&lt;pre&gt;$ cd &amp;lt;workディレクトリ&amp;gt;
$ wget http://www.java2s.com/Code/JarDownload/jetty-core-6.1.14.jar.zip
$ wget http://www.java2s.com/Code/JarDownload/jetty-util-6.1.18.jar.zip
$ unzip jetty-core-6.1.14.jar.zip
$ unzip jetty-util-6.1.18.jar.zip
$ java -cp jetty-core-6.1.14.jar:jetty-util-6.1.18.jar org.mortbay.jetty.security.Password jetty password
password
OBF:1v2j1uum1xtv1zej1zer1xtn1uvk1v1v
MD5:5f4dcc3b5aa765d61d8327deb882cf99
CRYPT:je5/ATIGzeDQw
&lt;/pre&gt;&lt;br /&gt;
続いてjetty.xmlに認証レルムを使用する設定を追記する。&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;Configure id=&quot;Server&quot; class=&quot;org.eclipse.jetty.server.Server&quot;&amp;gt;
…
    &amp;lt;Call name=&quot;addBean&quot;&amp;gt;
      &amp;lt;Arg&amp;gt;
        &amp;lt;New class=&quot;org.eclipse.jetty.security.HashLoginService&quot;&amp;gt;
          &amp;lt;Set name=&quot;name&quot;&amp;gt;User Realm&amp;lt;/Set&amp;gt;
          &amp;lt;Set name=&quot;config&quot;&amp;gt;
            &amp;lt;!-- 上記で用意した認証レルムの設定ファイルを指定 --&amp;gt;
            &amp;lt;SystemProperty name=&quot;jetty.home&quot; default=&quot;.&quot;/&amp;gt;/etc/realm.properties
          &amp;lt;/Set&amp;gt;
          &amp;lt;Set name=&quot;refreshInterval&quot;&amp;gt;0&amp;lt;/Set&amp;gt;
        &amp;lt;/New&amp;gt;
      &amp;lt;/Arg&amp;gt;
    &amp;lt;/Call&amp;gt;
…
&amp;lt;/Configure&amp;gt;
&lt;/pre&gt;Webアプリケーション毎に認証レルムを指定したい場合は下記のようにする。&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;Configure class=&quot;org.eclipse.jetty.webapp.WebAppContext&quot;&amp;gt;
  &amp;lt;Set name=&quot;contextPath&quot;&amp;gt;/jetty&amp;lt;/Set&amp;gt;
  &amp;lt;Set name=&quot;war&quot;&amp;gt;&amp;lt;SystemProperty name=&quot;jetty.home&quot; default=&quot;.&quot;/&amp;gt;/webapps/jetty&amp;lt;/Set&amp;gt;
…
  &amp;lt;Get name=&quot;securityHandler&quot;&amp;gt;
    &amp;lt;Set name=&quot;loginService&quot;&amp;gt;
      &amp;lt;New class=&quot;org.eclipse.jetty.security.HashLoginService&quot;&amp;gt;
            &amp;lt;Set name=&quot;name&quot;&amp;gt;User Realm&amp;lt;/Set&amp;gt;
            &amp;lt;Set name=&quot;config&quot;&amp;gt;
              &amp;lt;SystemProperty name=&quot;jetty.home&quot; default=&quot;.&quot;/&amp;gt;/etc/realm.properties
            &amp;lt;/Set&amp;gt;
      &amp;lt;/New&amp;gt;
    &amp;lt;/Set&amp;gt;
  &amp;lt;/Get&amp;gt;
…
&amp;lt;/Configure&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Webアプリケーション側の設定&lt;/h3&gt;&lt;br /&gt;
web.xmlにBASIC認証用の設定を追記する。&lt;br /&gt;
&lt;pre class=&quot;xml&quot; name=&quot;code&quot;&gt;&amp;lt;web-app…
…
  &amp;lt;security-constraint&amp;gt;
    &amp;lt;web-resource-collection&amp;gt;
      &amp;lt;web-resource-name&amp;gt;Authentication of BASIC&amp;lt;/web-resource-name&amp;gt;
      &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/web-resource-collection&amp;gt;
    &amp;lt;auth-constraint&amp;gt;
      &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;
    &amp;lt;/auth-constraint&amp;gt;
  &amp;lt;/security-constraint&amp;gt;
  &amp;lt;login-config&amp;gt;
    &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;
    &amp;lt;realm-name&amp;gt;User Realm&amp;lt;/realm-name&amp;gt;
  &amp;lt;/login-config&amp;gt;
  &amp;lt;security-role&amp;gt;
    &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;
  &amp;lt;/security-role&amp;gt;
…
&amp;lt;/web-app&amp;gt;
&lt;/pre&gt;ちなみに$JETTY_HOME/etc/webdefault.xmlに記述すれば一律で設定可能。&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/585881049897238783/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/jetty8basic.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/585881049897238783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/585881049897238783'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/jetty8basic.html' title='jetty8でBASIC認証'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-2091574422226081530</id><published>2011-12-11T03:34:00.011+09:00</published><updated>2011-12-13T00:31:40.718+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Jetty"/><title type='text'>jetty8でport80起動</title><content type='html'>さくらVPSにUbuntu 10.04 LTSをインストールしたので、Jettyをインストールしてみた。&lt;br /&gt;
Jettyはサイズも小さくWebサーバの機能も十分あるのでJettyのみで運用することにした。&lt;br /&gt;
Jettyはデフォルトだとポートは8080なので80に変更して起動することにする。&lt;br /&gt;
&lt;br /&gt;
Jetty起動ユーザー：jetty&lt;br /&gt;
インストールディレクトリ：/usr/local/jetty&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;jettyユーザー作成&lt;/h3&gt;&lt;pre&gt;$ sudo useradd -m jetty&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;jetty8インストール&lt;/h3&gt;&lt;pre&gt;$ cd &amp;lt;workディレクトリ&amp;gt;
$ wget http://dist.codehaus.org/jetty/jetty-hightide-8.1.0/jetty-hightide-8.1.0.RC1.zip
$ unzip jetty-hightide-8.1.0.RC1.zip
$ sudo mv jetty-hightide-8.1.0.RC1 /usr/local/jetty
$ sudo chown -R jetty:jetty /usr/local/jetty
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;jettyの設定&lt;/h3&gt;&lt;br /&gt;
/usr/local/jetty/etc/jetty.xmlを修正&lt;br /&gt;
&lt;pre&gt;&amp;lt;Call name=&quot;addConnector&quot;&amp;gt;
      &amp;lt;Arg&amp;gt;
          &amp;lt;New class=&quot;org.eclipse.jetty.server.nio.SelectChannelConnector&quot;&amp;gt;
            &amp;lt;Set name=&quot;host&quot;&amp;gt;&amp;lt;Property name=&quot;jetty.host&quot; /&amp;gt;&amp;lt;/Set&amp;gt;
            &amp;lt;Set name=&quot;port&quot;&amp;gt;&amp;lt;Property name=&quot;jetty.port&quot; default=&quot;8080&quot;/&amp;gt;&amp;lt;/Set&amp;gt;
↓
&amp;lt;Call name=&quot;addConnector&quot;&amp;gt;
      &amp;lt;Arg&amp;gt;
          &amp;lt;New class=&quot;org.eclipse.jetty.server.nio.SelectChannelConnector&quot;&amp;gt;
            &amp;lt;Set name=&quot;host&quot;&amp;gt;&amp;lt;Property name=&quot;jetty.host&quot; /&amp;gt;&amp;lt;/Set&amp;gt;
            &amp;lt;Set name=&quot;port&quot;&amp;gt;&amp;lt;Property name=&quot;jetty.port&quot; default=&quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;80&lt;/span&gt;&quot;/&amp;gt;&amp;lt;/Set&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
/usr/local/jetty/start.iniを修正&lt;br /&gt;
--execのコメントを外す&lt;br /&gt;
-Djava.library.path=lib/setuidを追加する&lt;br /&gt;
&lt;pre&gt;# --exec
# -Dorg.apache.jasper.compiler.disablejsr199=true
↓
--exec
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;-Djava.library.path=lib/setuid&lt;/span&gt;
# -Dorg.apache.jasper.compiler.disablejsr199=true
&lt;/pre&gt;&lt;br /&gt;
OPTIONSにsetuidを追加&lt;br /&gt;
&lt;pre&gt;OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations,jta,jdbc
↓
OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus,annotations,jta,jdbc&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;,setuid&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
etc/jetty-setuid.xmlを追加&lt;br /&gt;
&lt;pre&gt;#===========================================================
# Configuration files.
# For a full list of available configuration files do
#   java -jar start.jar --help
#-----------------------------------------------------------
etc/jetty-jmx.xml
etc/jetty.xml
↓
#===========================================================
# Configuration files.
# For a full list of available configuration files do
#   java -jar start.jar --help
#-----------------------------------------------------------
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;etc/jetty-setuid.xml&lt;/span&gt;
etc/jetty-jmx.xml
etc/jetty.xml
&lt;/pre&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;jettyの起動&lt;/h3&gt;&lt;pre&gt;$ cd /usr/local/jetty/
$ sudo java -jar start.jar
&lt;/pre&gt;これで目的は達成。&lt;br /&gt;
ちなみにJetty起動時に停止用のパラメーターを指定しておけば停止用のコマンドで停止可能。&lt;br /&gt;
&lt;br /&gt;
起動&lt;br /&gt;
&lt;pre&gt;$ sudo java -DSTOP.PORT=停止ポート -DSTOP.KEY=停止パスワード -jar start.jar
e.g.
$ sudo java -DSTOP.PORT=8079 -DSTOP.KEY=jetty -jar start.jar
&lt;/pre&gt;停止&lt;br /&gt;
&lt;pre&gt;$ sudo java -DSTOP.PORT=停止ポート -DSTOP.KEY=停止パスワード -jar start.jar --stop
e.g.
$ sudo java -DSTOP.PORT=8079 -DSTOP.KEY=jetty -jar start.jar --stop
&lt;/pre&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;※注意&lt;/span&gt;&lt;br /&gt;
起動ユーザーがjettyじゃない場合はjetty-setuid.xmlの下記の箇所に修正が必要。&lt;br /&gt;
&lt;pre&gt;&amp;lt;Configure id=&quot;Server&quot; class=&quot;org.mortbay.setuid.SetUIDServer&quot;&amp;gt;
  &amp;lt;Set name=&quot;startServerAsPrivileged&quot;&amp;gt;false&amp;lt;/Set&amp;gt;
  &amp;lt;Set name=&quot;umask&quot;&amp;gt;2&amp;lt;/Set&amp;gt;
  &amp;lt;Set name=&quot;username&quot;&amp;gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;jetty&lt;/span&gt;&amp;lt;/Set&amp;gt;
  &amp;lt;Set name=&quot;groupname&quot;&amp;gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: red;&quot;&gt;jetty&lt;/span&gt;&amp;lt;/Set&amp;gt;
&lt;/pre&gt;&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/2091574422226081530/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/jetty8port80.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/2091574422226081530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/2091574422226081530'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/jetty8port80.html' title='jetty8でport80起動'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-6249518341172174110</id><published>2011-12-08T03:48:00.000+09:00</published><updated>2011-12-08T03:48:42.847+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gerrit"/><title type='text'>Gerrit起動時に「** ERROR: GERRIT_SITE not set」</title><content type='html'>Gerrit起動時や停止時に使用するgerrit.shを実行する際、以下のようなエラーが出る場合がある。&lt;br /&gt;
&lt;pre&gt;** ERROR: GERRIT_SITE not set
&lt;/pre&gt;下記のようにシェルの配置先まで移動して実行すると発生する。&lt;br /&gt;
&lt;pre&gt;cd &amp;lt;Gerritインストールディレクトリ&amp;gt;/bin
./gerrit.sh start
&lt;/pre&gt;↓こんな感じでエラーが解消されるはず。&lt;br /&gt;
&lt;pre&gt;cd &amp;lt;Gerritインストールディレクトリ&amp;gt;
./bin/gerrit.sh start
&lt;/pre&gt;Gerrit使おうと思ってる人はたいていシェルの中身見たりデバッグしたりして&lt;br /&gt;
すぐ解消するんでしょうけど。。&lt;br /&gt;
&lt;br /&gt;
理由が知りたい人はシェル内のこのあたり見たりデバッグしてみたりすればわかると思う。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;##################################################
# Try to determine GERRIT_SITE if not set
##################################################
if test -z &quot;$GERRIT_SITE&quot; ; then
  GERRIT_SITE_1=`dirname &quot;$0&quot;`
  GERRIT_SITE_1=`dirname &quot;$GERRIT_SITE_1&quot;`
  if test -f &quot;${GERRIT_SITE_1}/${GERRIT_INSTALL_TRACE_FILE}&quot; ; then 
    GERRIT_SITE=${GERRIT_SITE_1} 
  fi
fi
&lt;/pre&gt;&lt;style type=&quot;text/css&quot;&gt;
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/6249518341172174110/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/gerrit-error-gerritsite-not-set.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/6249518341172174110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/6249518341172174110'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/gerrit-error-gerritsite-not-set.html' title='Gerrit起動時に「** ERROR: GERRIT_SITE not set」'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-468993463412864637</id><published>2011-12-04T01:42:00.004+09:00</published><updated>2011-12-06T02:21:23.110+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Jenkins"/><title type='text'>Gitで中央リポジトリにプッシュしたらJenkinsビルドを実行させる</title><content type='html'>Jenkinsにはコミットを検出して更新があったときにビルドを実行する機能を持っているが&lt;br /&gt;
これは定期的にポーリングしているためJenkinsのビルドが始まるまでにタイムラグが発生する。&lt;br /&gt;
プッシュされたタイミングで即時にJenkinsビルドを実行させるにはGitフックを使用する。&lt;br /&gt;
&lt;br /&gt;
(Git Pluginのインストールは省略)&lt;br /&gt;
Gitフックを使用するにはhooksディレクトリに適切なファイル名で配置する。&lt;br /&gt;
ここでは中央リポジトリにプッシュしたタイミングでJenkinsビルドを実行させるという想定なので&lt;br /&gt;
post-updateファイルを作成し、中央リポジトリのhooksディレクトリ直下に配置する。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;python&quot;&gt;#!/bin/sh
wget -q &quot;http://[Jenkinsトップ画面のアドレス]/job/[ジョブ名]/build?delay=0&quot;

if [ &quot;$?&quot; -eq 0 ]; then
  echo &quot;Jenkins build run.&quot;
else
  echo &quot;Jenkins build failed.&quot;
fi
&lt;/pre&gt;作成したら実行権限をつけ忘れずに。&lt;br /&gt;
&lt;pre&gt;chmod +x post-update&lt;/pre&gt;上記スクリプトを見るとわかる通りwgetでジョブ実行のURLを叩くだけ。&lt;br /&gt;
ちなみにJenkinsのセキュリティが有効になっている場合は認証トークンの設定が必要。&lt;br /&gt;
上記のURLに下記を追加。&lt;br /&gt;
&lt;pre&gt;&amp;token=[認証トークン]&lt;/pre&gt;もちろんシェルスクリプトじゃなくてもpythonでもrubyでもお好きなのでどうぞ。&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/468993463412864637/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/12/gitjenkins.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/468993463412864637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/468993463412864637'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/12/gitjenkins.html' title='Gitで中央リポジトリにプッシュしたらJenkinsビルドを実行させる'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-3509439085438924851</id><published>2011-11-28T16:37:00.004+09:00</published><updated>2011-12-14T09:12:24.492+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google Guice"/><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="lime-mvc"/><title type='text'>lime-mvcを使ってみた</title><content type='html'>久々にWebアプリを作る機会があったのでlime-mvcを使ってみた。&lt;br /&gt;
今のところ(2011/11/28現在)あまり知名度がなく、日本語の記事など一切存在していないので&lt;br /&gt;
今後の参考にメモ。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/lime-mvc/&quot;&gt;lime-mvc - http://code.google.com/p/lime-mvc/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;lime-mvcとは&lt;/h3&gt;Google Guiceを拡張して作られたMVCパターンのフレームワーク。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;セットアップ&lt;/h3&gt;lime-mvcはMavenリポジトリから利用可能になっているのでpom.xmlに下記を追加するだけ。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.zdevra&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;lime-velocity&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;0.2.0.rc2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;3.0.1&amp;lt;/version&amp;gt;
  &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;!-- ViewとしてJSPを使う場合は必要 --&amp;gt;
&amp;lt;!-- Velocity等を使用する場合は不要 --&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;
  &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
lime-mvcを使用する場合、MvcModuleのconfigureControllersをオーバーライドして&lt;br /&gt;
URLパターンとコントローラーのマッピングを行う。&lt;br /&gt;
これはアプリケーション起動時に呼ぶ必要があるため、GuiceServletContextListenerを継承して&lt;br /&gt;
デプロイメントディスクリプタ(web.xml)にリスナーとして登録する必要がある。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;public class WebAppContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MvcModule() {
            @Override
            protected void configureControllers() {
                // URLパターンとコントローラーのマッピングを行う
                control(&quot;/samples/*&quot;).withController(WebAppController.class);
            }
        });
    }
}
&lt;/pre&gt;&lt;br /&gt;
Guiceは上記リスナーでマッピングしたデータをGuiceFilterでキャッチしてDispatchするので&lt;br /&gt;
ここではすべてのリクエストに対してGuiceFilterを通す設定をweb.xmlに記述する。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;filter&amp;gt;
  &amp;lt;filter-name&amp;gt;guiceFilter&amp;lt;/filter-name&amp;gt;
  &amp;lt;filter-class&amp;gt;com.google.inject.servlet.GuiceFilter&amp;lt;/filter-class&amp;gt;
&amp;lt;/filter&amp;gt;

&amp;lt;filter-mapping&amp;gt;
  &amp;lt;filter-name&amp;gt;guiceFilter&amp;lt;/filter-name&amp;gt;
  &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;

&amp;lt;listener&amp;gt;
  &amp;lt;listener-class&amp;gt;jp.u1aryz.products.samples.lime.listener.WebAppContextListener
  &amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
/helloworld/(.*)というパスに対してリクエストがあった場合にdoActionメソッドを呼び出し&lt;br /&gt;
main.jspに転送する場合のコントローラーは下記の通りとなる。&lt;br /&gt;
メソッドの戻り値をデータとしてビューに渡すことが出来る。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;@Controller
public class WebAppController {

    @Path(&quot;/helloworld/(.*)&quot;)
    @ModelName(&quot;msg&quot;)
    @ToView(&quot;main.jsp&quot;)
    public String doAction(@UriParameter(1) String name) {
        return &quot;Hello World &quot; + name + &quot;!&quot;;
    }
}
&lt;/pre&gt;&lt;br /&gt;
coreタグライブラリでModelNameアノテーションより指定された変数名で出力することにより、&lt;br /&gt;
JSPで表示することが出来る。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;c:out value=&quot;${msg}&quot; /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
コンテキストパスが&quot;/&quot;の場合は&lt;a target=&quot;_blank&quot; href=&quot;http://localhost:8080/samples/helloworld/hoge&quot;&gt;http://localhost:8080/samples/helloworld/hoge&lt;/a&gt;でアクセスすれば&lt;br /&gt;
下記のように出力されるはず。&lt;br /&gt;
&lt;pre&gt;Hello World hoge!&lt;/pre&gt;&lt;br /&gt;
ほかにもlime-mvcはビューとしてJSilverやVelocity、Freemarkerを使えるので&lt;br /&gt;
Velocity使いとしてはありがたや〜。&lt;br /&gt;
&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/3509439085438924851/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/11/lime-mvc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3509439085438924851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/3509439085438924851'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/11/lime-mvc.html' title='lime-mvcを使ってみた'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3820505248564293539.post-467683860914147348</id><published>2011-11-20T17:23:00.002+09:00</published><updated>2011-12-06T00:49:00.574+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android"/><category scheme="http://www.blogger.com/atom/ns#" term="Maven"/><title type='text'>いつからかEclipse上でAndroidプロジェクトのMavenビルドが出来なくなったので…</title><content type='html'>久々にMavenを使用してAndroidアプリを作成しようと思ったらなぜかビルドが出来ない。。&lt;br /&gt;
ADTやらSDKを更新したタイミングで使えなくなったのだろうと思い、いろいろ思考錯誤してみた。&lt;br /&gt;
そしてようやくビルドが出来る環境を作成する手順が確立出来たので忘れずメモ。&lt;br /&gt;
&lt;br /&gt;
ちなみに私の環境は以下の通り。&lt;br /&gt;
Mac OS X 10.6.8&lt;br /&gt;
ADT 15 &amp;amp; SDK15&lt;br /&gt;
Maven 3.0.3&lt;br /&gt;
Eclipse Indigo&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;m2eのインストール&lt;/h3&gt;[Help] -&amp;gt; [Install New Software...]&lt;br /&gt;
プルダウンからIndigoのアップデートサイトを選択しCollaborationを展開する。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHa5Go4U6Dm9RrUXGIiPqAHUBOFCEcqAl7UxhtCNrTFsSglll0wH24W8xhyOGIsncJtGwII7WEaxoNjdNleJdmJBlo0bM0XZ8k70efk_GNe-VL-F2rZ5Zw59vX8tuYfvc_dlbmJLfc8cgU/s1600/m2e-android.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;388&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHa5Go4U6Dm9RrUXGIiPqAHUBOFCEcqAl7UxhtCNrTFsSglll0wH24W8xhyOGIsncJtGwII7WEaxoNjdNleJdmJBlo0bM0XZ8k70efk_GNe-VL-F2rZ5Zw59vX8tuYfvc_dlbmJLfc8cgU/s640/m2e-android.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;「Maven Integration for Eclipse」と「slf4j over logback loggind」にチェックし、-&amp;gt; [Next]&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfQ_HIZNNUVASfZvBblqNsoBfAFXclzCHSzSaMpYVkIRFonRdMpDrK-YboqO1S2U9YNK0LQxnPbS23wnSFtFMxyGxBPTbBc7YeQHZfgZE1oqOqewN6dqIeaeEYfsAvY3vzbPqjufUeF8bB/s1600/m2e-android2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;389&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfQ_HIZNNUVASfZvBblqNsoBfAFXclzCHSzSaMpYVkIRFonRdMpDrK-YboqO1S2U9YNK0LQxnPbS23wnSFtFMxyGxBPTbBc7YeQHZfgZE1oqOqewN6dqIeaeEYfsAvY3vzbPqjufUeF8bB/s640/m2e-android2.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;あとは指示通り進んでインストール完了後Eclipseを再起動。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;m2e-androidのインストール&lt;/h3&gt;[Help] -&amp;gt; [Eclipse Marketplace...]&lt;br /&gt;
「m2e-android」と検索すると「Android Configuration for M2E」がヒットするので&lt;br /&gt;
Installボタンをクリックし指示通り進んでインストール完了後Eclipseを再起動。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga0Xc_dysi0AtkKBRLvsiWjAbbnUjud0Vyn8TIKc8EdG5NhgpTed1nB51_yhfn6o-bi17bfcd2iB_lUJu8oSvo1mY4hBN-eqoGlGbYLQIqXY45Fm0XQW_O_3tj5zZXOhmyrVeAycKzBbBn/s1600/m2e-android3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;500&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga0Xc_dysi0AtkKBRLvsiWjAbbnUjud0Vyn8TIKc8EdG5NhgpTed1nB51_yhfn6o-bi17bfcd2iB_lUJu8oSvo1mY4hBN-eqoGlGbYLQIqXY45Fm0XQW_O_3tj5zZXOhmyrVeAycKzBbBn/s640/m2e-android3.png&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;Archetypeの追加&lt;/h3&gt;[New] -&amp;gt; [Project...] -&amp;gt; [Maven Project]&lt;br /&gt;
Workspace locationに任意の場所を指定 -&amp;gt; [Next] -&amp;gt; [Add Archetype...]&lt;br /&gt;
下記のような画面になるので各項目を入力 -&amp;gt; [OK]&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKkyUZrOA17qmwp_BrfP0fJtTfEG7VWHrY8oBdqi9MZHXaqai22oug48pLEOTwrCOYdPzXYbwDy4QqwQcAzVdyhOnJEI4EvMRcPYSMxEr9PPmrwO0REFjdYFlT3GbckIDaRJP5eEzQoqlR/s1600/m2e-android4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKkyUZrOA17qmwp_BrfP0fJtTfEG7VWHrY8oBdqi9MZHXaqai22oug48pLEOTwrCOYdPzXYbwDy4QqwQcAzVdyhOnJEI4EvMRcPYSMxEr9PPmrwO0REFjdYFlT3GbckIDaRJP5eEzQoqlR/s400/m2e-android4.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Archetype Group Id: de.akquinet.android.archetypes&lt;br /&gt;
Archetype Artifact Id : android-quickstart&lt;br /&gt;
Archetype Version: 1.0.6&lt;br /&gt;
Repository URL: 空白&lt;br /&gt;
上記で追加したandroid-quickstartを選択しAndroidプロジェクトを作成する。&lt;br /&gt;
&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;m2e connectorのインストール&lt;/h3&gt;Androidプロジェクトを作成すると、下記画面のようにpom.xmlにエラーマークがつくので&lt;br /&gt;
POMエディターで開く。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhfvDZKeoNVUBhTLiSHUA-A6XoRjKx0v32TADMASvdoSoh3Gkn6bd9VN3qnHx212SIHGAQCOYKrXFgRZUOAj4LGOgGSLZcJdrZGy2AgB2s8UlP61CE3xy4MmpRNEczqVEC45aWmRJTnGv8/s1600/m2e-android5.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;335&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhfvDZKeoNVUBhTLiSHUA-A6XoRjKx0v32TADMASvdoSoh3Gkn6bd9VN3qnHx212SIHGAQCOYKrXFgRZUOAj4LGOgGSLZcJdrZGy2AgB2s8UlP61CE3xy4MmpRNEczqVEC45aWmRJTnGv8/s400/m2e-android5.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;pom.xmlを開くと上記に赤くメッセージが表示されるのでその箇所をクリック。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX4V8h78OuGT8V4W9i6wvpOIkJ3U8pGW9acmssz3COTwgFPjZ-IdlQC7PyhIBAzcmI6wH9l9Z-hU2Ad_GO36kudI6aFe6sscUI71bOa-dcvVwKcfBHDDYg5Pwi7qQN6uDREQ4Rnhv2oE-8/s1600/m2e-android6.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX4V8h78OuGT8V4W9i6wvpOIkJ3U8pGW9acmssz3COTwgFPjZ-IdlQC7PyhIBAzcmI6wH9l9Z-hU2Ad_GO36kudI6aFe6sscUI71bOa-dcvVwKcfBHDDYg5Pwi7qQN6uDREQ4Rnhv2oE-8/s640/m2e-android6.png&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;/div&gt;下記のような黄色いウィンドウが表示されるので「Discover new m2e connectors」をクリック。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgayNdQfmjyX9onqunr5HTvltt7SRDOkgoNOiCg60lnOFAydyEr3vFT_HcDRr0sXeN5Tcoqvwk-SE1iyXOI6Aosn4h7JeYnlXcipZ0VDQQGTmYjjM5S6ZC49NjKFLPdaphFydMohofL_js6/s1600/m2e-android7.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;135&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgayNdQfmjyX9onqunr5HTvltt7SRDOkgoNOiCg60lnOFAydyEr3vFT_HcDRr0sXeN5Tcoqvwk-SE1iyXOI6Aosn4h7JeYnlXcipZ0VDQQGTmYjjM5S6ZC49NjKFLPdaphFydMohofL_js6/s400/m2e-android7.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;m2e Marketplaceなるものが開くので「Application」と「Maven」にチェックをし、&lt;br /&gt;
「Lifecycle Mappings」と「embedded maven runtimes」をインストールしEclipseを再起動。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwfchLbi3oF6q1RYoQPTHsDVuiI1Oj3vLOlWKtPjqPe8KvAgiX-TL7mJRkl-oejxbYKUKRN2L3m6x65MEQfxpBvF-EHKUg1OADf0-w5L58OVefPNGV4ysYf0VpvxsUxaq3RWUAJdKapP6f/s1600/m2e-android8.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;500&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwfchLbi3oF6q1RYoQPTHsDVuiI1Oj3vLOlWKtPjqPe8KvAgiX-TL7mJRkl-oejxbYKUKRN2L3m6x65MEQfxpBvF-EHKUg1OADf0-w5L58OVefPNGV4ysYf0VpvxsUxaq3RWUAJdKapP6f/s640/m2e-android8.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3 class=&quot;title&quot;&gt;pom.xmlの修正&lt;/h3&gt;&lt;pre&gt;&amp;lt;artifactId&amp;gt;maven-android-plugin&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.8.4&amp;lt;/version&amp;gt;
↓
&amp;lt;artifactId&amp;gt;android-maven-plugin&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;3.0.0-alpha-14&amp;lt;/version&amp;gt;
&lt;/pre&gt;以上でEclipse上でAndroidプロジェクトのMavenビルドが出来るようになるはず。&lt;br /&gt;
&lt;br /&gt;
ちなみにpom.xmlの全体はこんな感じ。&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;jp.u1aryz.products.hoge&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;HogeSample&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;
  &amp;lt;packaging&amp;gt;apk&amp;lt;/packaging&amp;gt;
  &amp;lt;name&amp;gt;HogeSample&amp;lt;/name&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;com.google.android&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;android&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.1.2&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;finalName&amp;gt;${project.artifactId}&amp;lt;/finalName&amp;gt;
    &amp;lt;sourceDirectory&amp;gt;src/main/java&amp;lt;/sourceDirectory&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;com.jayway.maven.plugins.android.generation2&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;android-maven-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.0.0-alpha-14&amp;lt;/version&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;sdk&amp;gt;
            &amp;lt;!-- SDKのパスはsettings.xmlで定義していれば不要 --&amp;gt;
            &amp;lt;path&amp;gt;&quot;your ANDROID_HOME&quot;&amp;lt;/path&amp;gt;
            &amp;lt;platform&amp;gt;7&amp;lt;/platform&amp;gt;
          &amp;lt;/sdk&amp;gt;
          &amp;lt;manifest&amp;gt;
            &amp;lt;debuggable&amp;gt;true&amp;lt;/debuggable&amp;gt;
          &amp;lt;/manifest&amp;gt;
        &amp;lt;/configuration&amp;gt;
        &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;
      &amp;lt;/plugin&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;2.3.2&amp;lt;/version&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;
          &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;style type=&quot;text/css&quot;&gt;
h3.title {
font-size: 16px;
font-weight: normal;
margin: 0;
line-height: 1.2;
padding: 2px 0 0 5px;
border-left: solid 4px #c62b00;
}
pre {
  margin: 1em 1em 1em 0.6em;
  padding: 2px 2px 2px 6px;
  background-color: #444;
  width: auto;
  overflow-x: auto;
  overflow-y: hidden;
  display: block;
  font-family: monospace;
  white-space: pre;
  color: #F0F0F0;
}
&lt;/style&gt;</content><link rel='replies' type='application/atom+xml' href='http://u1aryz.blogspot.com/feeds/467683860914147348/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://u1aryz.blogspot.com/2011/11/eclipseandroidmaven.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/467683860914147348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3820505248564293539/posts/default/467683860914147348'/><link rel='alternate' type='text/html' href='http://u1aryz.blogspot.com/2011/11/eclipseandroidmaven.html' title='いつからかEclipse上でAndroidプロジェクトのMavenビルドが出来なくなったので…'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/04183361496884046293</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHa5Go4U6Dm9RrUXGIiPqAHUBOFCEcqAl7UxhtCNrTFsSglll0wH24W8xhyOGIsncJtGwII7WEaxoNjdNleJdmJBlo0bM0XZ8k70efk_GNe-VL-F2rZ5Zw59vX8tuYfvc_dlbmJLfc8cgU/s72-c/m2e-android.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>