2012年12月30日日曜日

2012年のまとめと来年に向けて

2012年も残すところ1日となったので、まとめ記事なんぞを書いてみます。

Jenkinsの年でした


もともと、自分用の備忘録としてスタートしたブログでしたが、思いの外
多くの方に閲覧をしていただいて驚いています。

そんな中、最も閲覧数が多かった記事がこちら。

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

思えば、今年は色々なところでキーワードとしてJenkinsのことを話して、聞いて
いたように思えます。

最初に使ったのは多分Androidテスト祭りに参加をした後あたりから。

第2回Androidテスト祭り #atecfes2

Linuxでとりあえず導入→マシンのスペック不足でビルド時に落ちる
→Windowsで導入→バグ(?)でうまくビルドできない

などとまあ、苦難の連続でしたが最終的に記事にまとめることができました。

ちなみに、閲覧数上位2位3位が

WindowsにJenkinsを入れてCI #Jenkns
Jenkinsを一般ユーザーで動かす

となっていて、やたらとJenkinsの使い方説明ブログみたいに
なっています。

今年はJenkinsの年だったのかなと言えなくもない。

自分自身で今年面白いことが書けた、できたなぁと思うのが次の2つ。

Root化したAndroid端末とFacebookアプリ
WindowsPhoneとJenkinsの話 #sumaben

一つ目は、Root化ってコワイねーな話。
使う側が気をつけるのはもちろん、作る側もサポート外
だなんて、言ってられないことをもっといろんな人に
知ってほしいところ。

2個めはまたもJenkinsですが、日本語のブログで類似なことを
やってる人が(当時は)見つからなかったのがちょっと嬉しい。

来年からのこのブログ


来年のこととか考えてないなぁ。べつに、一昨年も考えて
いなかったわけだし・・・

ブログの方針とかは変わらないと思います。日々、自分がやったこと
をまとめる感じ。

つまり、自分が「あれ?これってどうやるんだっけ?」と思った時に
見返すことで思い出したり、ヒントになるようなブログにするのが第一。

じゃあ、訪問された方がハッピーになるにはどうすればいいのかって考えると、
固定の読者になっていただくと言うよりも、検索でたどり着いた有象無象の1ページの
1つとカウントしてもらえるのが嬉しいかな。

毎回やってることが違うんだから、当然そうなる。
というわけで、俺も極力参考にしたページとか本とか、ググりワードを
紹介するようにして次の情報への足がかりになるように努めます。

別にこのブログで収益をあげようとかは考えていないので、別にそれで
いいかな?って。

来年からの俺

お金稼げるようになりたいです(白目

言語としてはScalaを引き続き。Rubyも引き続き。

フレームワークはiOSとかPlay Frameworkとか。

ツールはant,maven,sbt...と今は思っていますが、
何が起こるかわかりませんからね。

というか最近はテストの効率化とかデバッグの効率化の
勉強ばっかりなので、そっち方面で強くなりたいですね。

以上、それでは皆様よい年末、年明けをお過ごしください。
また来年もよろしくお願いしますね。

2012年12月4日火曜日

Root化したAndroid端末とFacebookアプリ


Rootとってる人、取ろうと思ってる人はちょっと気にしてほしいこと。

はじめに


結論から言うと、Root化端末を知識のない人間が使うとものすごい危険
です。

なぜなら、たとえばFacebookのアプリはユーザー情報やフレンドの情報を
暗号化を行わないで保存しているから。

これの何が危険かというとROOTを取った端末の場合だと、とくに
制限もなくFacebookアプリのデータベースにアクセスされる可能性が
あるのです。

普通に使っている分には別にいいけど、そうじゃないことしてる人は
気を付けた方が良いよねっ!って話。

実践


では、具体例として友人一覧の情報を取得する方法をコードを交えて。

今回のターゲットは
/data/data/com.facebook.katana/databases/users_db2

この中に友人の名前やメールアドレス、電話番号などが入っていました。

Step.1:ファイルのパーミションを変更する

Androidのアプリは基本的に、自分のアプリのDBに対しては自分からしかアクセス
できないようにできます。

FBアプリも例には漏れず。しかし、結局はLinuxのファイルパーミションを利用して
管理をしているので、su権限でchmodを実行すればなんの問題もないです。

これがRoot化端末の怖いところ。普通はアクセスできないファイルにアクセス
できる可能性がある。

Step.2  SQLiteDatabaseあたりを利用してDBにアクセスする。


ファイルのフルパスを指定してあげれば、簡単にアクセスできます。
あとは煮るなり焼くなりご自由に状態。

ちなみに、コードはこんな感じ。


実行結果


こんなに丸見え!

まとめ


ROOT化端末の場合、ユーザが意図しないタイミングで見られたくないデータを
見られる可能性があるから、気を付けよう。

ROOT化するよー!って人
危険性を本当に理解してください。困るのはあなただけでなく、あなたの
友達かもしれません。

開発者の方
ROOT化端末によって、予期せぬデータ流出が起こることを知っておいてください。
確かにROOT化端末はサポート対象外ですが、そのおかげで不幸になるのは、あなた
個人や会社です。

最後に


ちなみに、このネタは先日開催された「Androidセキュリティハッカソン」でやってきた
ネタです。

もっと早くに思いつけば、アドベントカレンダーのネタになったのに・・・

2012年10月27日土曜日

Rubyで乱択アルゴリズム

Rubyの勉強してます。
会社で昼休みに昼飯を選ぶアプリを作っているのですが、
DBから取得した昼飯リストの中から、なんかいい方法で
選択できないかなー? と情報を漁っていると
弾さんのブログで良い情報があったので、Rubyで書いてみました。



実行結果は
$ ruby weight_random.rb | sort | uniq -c | sort -r
とかで計測します。とりあえず、1000回回すと
となったので、まあ悪くない結果だと思います。
しかし、一番結果の上位に出てくるのがうさだとは、どういうことにょ!?
目からビィーーーーム!!

2012年10月17日水曜日

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



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

Android app on Google Play


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

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

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

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

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

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

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

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

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

2012年10月15日月曜日

Dentoo.LTとは #dentoolt

すまべんの翌日は、Dentoo.LTに参加してきた。

全日に急にネタを変えて、ニンジャスレイヤーの音読をやってきた。

うん、楽しかった。

そのままの勢いで、本来のネタだった学務情報システムでも遊んできた。

忙しかった。

発表を聞きながら、ふぁぼりながら、つぶやきながらスライド作る

というか、ネタを実装する。

DOMの解析やって、リンク増やすだけだから大したことは無いのだけれど

まあ、忙しくて楽しかった。

またやりたいですね。

スライド公開するけど、誰得??



WindowsPhoneとJenkinsの話 #sumaben

Jenkinsさんは良いんだよ!!

みんなも会社で使ってよ!!

WindowsPhoneも端末が増えてくるから、きっと今から準備しておくと役立つよ!!

という話をすまべんでやってきた。



やたらと強力なMsBuildの使い方は、@ITを参考にした。

MSBuild完全攻略(前編) .NETビルド・エンジン「MSBuild」使いこなし術

MSBuild完全攻略(後編) ビルド・エンジン「MSBuild」を思いのままに操る技

という訳で、お家Jenkinsをもっと進めていきます

じゃなくて、会社で導入してみたいです。

2012年10月8日月曜日

Jenkinsで、WindowsPhoneのリリースビルド+ユニットテストを自動化


1.目的

Jenkinsを利用してプロジェクトのビルド、テストを自動化し素早い問題対応と、
常にビルド可能、実行可能なソリューションが存在する状態を作る。

そうすることで、チーム開発の進捗の管理や、モチベーション維持へと繋がる。

2.導入

今回はWindowsPhoneアプリのプロジェクトを、Jenkinsを使ってビルド、ユニットテストを
行う。Androidやその他のJava、あるいはスクリプト言語系のプロジェクトで導入の実績を
よく聞くJenkinsだが、.Netなフレームワークでもできるんだよ。

3.準備

3-1実行対象のプロジェクトを作る

作りましょう

3-2テストプロジェクトを作る

作り方は、僕の以前のPost


@okazuki さんの

http://d.hatena.ne.jp/okazuki/20110911/1315724390

を参考にしましょう。

3-3自動ビルド、ユニットテストの環境を作る


MsBuildの設定をします。基本的に、一個前のPost

http://numa08.blogspot.jp/2012/10/msbuildwindows-phone.html

を使えば良いです。

でも、今回はMsBuildのタスクを一部変更しました。Clean,Releaseはやりたかったので、そこを追加。

コードは以下。




3-4ビルドサーバー、リポジトリの準備


ビルドサーバーを準備します。

当然、Windowsじゃないとだめです。

VisualStudioを設定し、Jenkinsをインストール。GitやSuvbersionなどのバージョン管理システムも導入。

バージョン管理システムとして、Team Foundation Serverも利用できるっぽいですが未確認です。
(ちなみに、僕自身はSuvbersionも使ったこと無い)

3-5 csproj参照のパスに注意する

Global Assembly Cacheに登録していないアセンブリをプロジェクトの参照に追加する場合、

csproj(vbproj)の参照のパスの設定で、

対象のアセンブリが、ローカルな保存領域にある場合は相対パスで、

ネットワーク上にある場合は絶対パスで記述されるらしいです。

http://msdn.microsoft.com/ja-jp/library/ms998208.aspx

これを知らなくて詰んでた。

今回、テストプロジェクトの生成のために
"Microsoft.Silverlight.Testing.dll"
 と
 "Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll"

の少なくとも2つを追加しているわけですが、ビルドサーバーからこのファイルが見える状態になるように

設定する必要があるわけです。

僕の場合、いつもネットワークドライブ上にプロジェクトのフォルダを作って作業をしていたので、見事にこれがハマった。

csprojを任意に設定するか、ビルドサーバーからもアクセスできる場所にファイルを置くか、まあその辺設定しましょう。

3-7Jenkinsの設定をする
わりと、酢酸先生( @ch3cooh )のこの投稿が便利です。

http://d.hatena.ne.jp/ch3cooh393/20120126/1327510696

Jenkinsの管理->プラグインの管理 と進みJenkins MsBuild Plugin を探し、インストールします。

Jenkinsの管理->システムの管理->MsBuild の中で、MsBuildのパスの設定を行います。

ジョブの生成から、フリースタイルのプロジェクトを選んでリポジトリの設定を行います。

ビルドトリガの設定をしたら、ビルド手順を次のように設定します

Build a Visual Stduio Project or solution using MSBuild

MSBuild Build File $(WORDKSPACE)\(your project)\msbuild.proj

Command Line Arguments /t:Clean,Teset,Release

成果物の保存
**\Bin\Release\*.xap,**\EmulatorTestResult*.txt

以上で設定終わり。

最後に、ビルドサーバーでWindowsPhoneのエミュレーターを立ちあげておきましょう。

4.所感

エミュレーター重いわ!!

こんなに重いと思ってなかった。いつも、メインマシンでやってたからわからなかった・・・

WindowsPhoneの開発でだってJenkinsが使えるんだよっ!! ってことが伝えられればそれで良いんです。

2012年10月4日木曜日

MsBuildでWindows Phone のビルドとテストを自動化


MsBuildって便利ですね しみじみ

自動化は男のロマン。

と言うことで、WindowsPhoneプロジェクトの

-ビルド
-テスト
-結果の回収

を自動で行おうと思います。ゆくゆくは、Jenkinsを利用したCIへと繋がります。

今回は、http://blogs.msdn.com/b/francischeung/archive/2012/01/03/running-windows-phone-unit-tests-via-msbuild.aspx

の内容ホボそのまま。

一連の自動化の流としては
1.ビルド実行
2.エミュレーターへのインストール
3.テスト実行
4.テスト結果を エミュレーターの分散ストレージに保存
5.テスト結果をローカルにコピー

1.プロジェクトを作る

作りましょう

2.テストプロジェクトを作る

以前の投稿 http://numa08.blogspot.jp/2012/09/windowsphonerx_19.html や、@okazuki さんの

http://d.hatena.ne.jp/okazuki/20110911/1315724390

あたりを参考にテストプロジェクトを作りましょう。

3.ログをファイルに出力する

ファイルと言っても、エミュレーター上の分散ストレージです。

テストプロジェクトに次のコードを追加します。

その上で、テストプロジェクトのMainPage.xaml.csを次のように変更します。

4.MsBuildタスクのプロジェクトを作る

ソリューションに新しい VisualC# クラスライブラリ を作成します。

参照に、
Microsoft.Build
Microsoft.Build.Engine
Microsoft.Build.Framework
Microsoft.Build.Task.v4.0
Microsoft.Build.Utilities.v4.0

を追加。次に、
"C:\Program Files (x86)\Common Files\microsoft shared\Phone Tools\CoreCon\10.0\Bin\Microsoft.Smartdevice.Connectivity.dll"

を参照に追加します。

5.タスクを書く。

MsBuildって本当に強力だなぁとしみじみ。

ぶっちゃけ、次のコードのコピペで動きますけど、もっともっとカスタマイズすると楽しいと思います。



6.MsBuildファイルを書く

こちらは、テストプロジェクトのUUIDやファイルパスなどを指定する必要があります。

さっき作ったprojファイルから見た相対パスらしいので、それに合わせてxapファイルのパスを適切に設定します。

ProductGuidはテストプロジェクトの WMAppManifest.xml のAppタグOriductIDの値を使います。


7.実行する

エミュレーターを立ち上げた状態で MsBuild msbuild.proj としてやれば、自動的にプロジェクトのビルドと、
テストの実行が走ります。

最後に、EmulatorTestResult-$(GUID)-.txtが吐き出されていれば成功。



何が凄いって、テストに失敗するとテストに失敗すると、例外を検知してMsBuildが失敗を返すところ。

これは便利です。Jenkinsの場合、ビルドの成功失敗は取れてましたけど、テストの成功失敗は別で管理してました。

あー、でもこのテストの失敗は無視ー とかそういう状態も発生するわけか。まあ、その辺はタスクのカスタムでなんとかなるんだと思います。


思いますよ。そのうちやります。

2012年10月3日水曜日

ダウンロード済みのアセンブリをビルドする

MsBuildで自前のタスクをビルドしようとした際に出たエラー

エラー    1    アセンブリ ファイルパス\プロジェクト名.dll を読み込めませんでした。このアセンブリは Web からダウンロード済みである可能性があります。アセンブリが Web からダウンロード済みである場合は、ローカル コンピューター上に存在する場合でも Web ファイルであることを示すフラグが設定されています。フラグにより、このようなアセンブリをプロジェクトで使用されることがないようにできます。フラグの設定は、ファイルのプロパティを変更することで変更できます。信頼できるアセンブリについてのみブロックを解除してください。詳細については、http://go.microsoft.com/fwlink/?LinkId=179545 を参照してください。

前もこれ出たな・・・

回避方法のメモ


"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe.config"

のRuntimeセクションに


<loadFromRemoteSources enabled="true" />


を追加する。


これだけ。
基本的にネットワーク上のアセンブリやダウンロードしたそれをビルドの際に読み込まないのは、ライセンス的な絡みがあって仕方ないらしい。


あと、なによりもTeam Foundation Serverを利用させようという意図もあるとのこと。


まあ、そういう会社なんだけど、そうやって儲けてるしサポートも受けられるんだから仕方ない。
仕方ないのです。









2012年9月19日水曜日

WindowsPhoneの非同期なRxをユニットテスト



コールバックメソッドを利用することよりも、Rxによってメソッドチェーンを記述することで、

コードが分散せず一貫したコードが書けるように思えます。

もちろん、ユニットテストは必要なのですがいかんせんWindowsPhoneはテストフレームワークが公式に

提供されているわけでは無いらしく、色々と面倒くさいです。

どうにか、記述する方法を発見したので公開。と言っても、neueccさんのところで公開されていますが・・・。

1.WindowsPhone7.1のプロジェクトを作る


作りましょう。

2.テスト対象のコードを記述する。


今回は、引数のURLにアクセスを行いページの内容をstringで取得するメソッドを用意しました。


3.テストプロジェクトを作成する。


3.1. 


まずは、WindowsPhone7.1のプロジェクトを作ります。

3.2. 


http://www.jeff.wilcox.name/2011/06/updated-ut-mango-bits/ で配布されているファイルをダウンロードし、参照に追加します。

3.3. 


テスト対象のプロジェクトを参照に追加します。

3.4.


 http://blog.richardszalay.com/2011/08/08/writing-asynchronous-unit-tests-with-rx-and-the-silverlight-unit-testing-framework/
こちらに記述されている WorkItemTestScheduler  と ObservableExtensions を追加します。

4. テストを記述する


今回は次のコードを用いてURLに適切にアクセスができているのかを確認します。


Assert.IsNotNull() とちょっと手を抜いていますが・・・。


5. 実行する

ソリューションを右クリックし、「スタートアッププロジェクトの設定」を選び、

テストプロジェクトをスタートアッププロジェクトに設定します。



Ctrl+F5でデバッグなし実行を行います。テスト結果は次のように出力されます。格好いいですね。

成功したパターン
失敗したパターン

6.所感

このやり方を発見するまでに時間がかかってしまった。結局やりたいことは例によってテストやビルドの自動化。

http://blogs.msdn.com/b/francischeung/archive/2012/01/03/running-windows-phone-unit-tests-via-msbuild.aspx

このサイトを見る限りMSBuildを利用して、コマンドラインからテストの実行ができるらしい? ので、いつもどおり

Jenkinsさんと組み合わせてCI環境を作るところまでやりたいです。

2012年9月10日月曜日

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


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

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

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


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

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

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

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

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

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

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

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

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

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





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

キャプチャは1.8.4

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

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

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

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

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

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

名前:display
値:WVGA HVGA WXGA

名前:density
値:170 240



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







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

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


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

これ付いてると詰むよ

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

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

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

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

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


うぉーなげぇ

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

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

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

多分。


2012年9月7日金曜日

C# + LINQでJSONをパースする


foursquareの'explore'のレスポンスのJSONを、Linq To Jsonを使ってパースします。ちなみにWindowsPhone。

シリアライズすれば早いのに・・・とか言わない。

またパースにはJSON.netを使います。http://json.codeplex.com/

必要なのは、'venue'データだけなので、先に保存用のクラスを作っておきます。

namespace ConflimJsonParser
{
    public class Venue
    {
        public string name { get; set; }
        public string address { get; set; }
        public string crossStreet { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string country { get; set; }
        public string cc { get; set; }
        public double lat { get; set; }
        public double lng { get; set; }
        public string id { get; set; }
    }
}



で、パースの部分。

ちなみに元のJSONは https://developer.foursquare.com/docs/explore#req=venues/explore%3Fll%3D40.7,-74 をみておいてください。

namespace ConflimJsonParser
{
    public class MyParser
    {
        private string json = "省略";
        public void parse()
        {
            var str = JObject.Parse(json).SelectToken("response.groups").ToString();
            var venues = JArray.Parse(str).SelectMany(groups => groups["items"])
                .Select(items => items["venue"]).Select(venue =>
                {
                    var location = venue["location"];
                    return new Venue()
                    {
                        name = (string)venue["name"],
                        id = (string)venue["id"],
                        address = (string)location["address"],
                        crossStreet = (string)location["crossStreet"],
                        city = (string)location["city"],
                        state = (string)location["state"],
                        country = (string)location["country"],
                        cc = (string)location["cc"],
                        lat = (double)location["lat"],
                        lng = (double)location["lng"],
                    };
                });

            foreach (var venue in venues)
            {
                Debug.WriteLine(venue.name);
            }

        }

    }
}


やってみて

LINQいいよLINQ。

まとまったデータが欲しいならシリアライズしろ。

データというか、モジュールの結合が密接になっているように思います。そのへんがオブジェクト指向じゃないってことかな。

実は今回のコードは今作っているアプリからの引用なんだが、どうもなぁ。

この部分は、IObservable<string>を引数に取るメソッド内で利用される。そのため、かなりコードが違うものになっているのだ。

そりゃあ、引数が違えば実装が変わってくるのは一緒だけどここまで違うの!? って思うくらいの違い。

なんか再利用性が低いなーみたいなことを思ってしまってます。俺のスキルが足りないだけと言われたらそれまでだけど。

とは言え、Rxを使えば非同期処理もすっきり書けたり、コードを追いかけるのも楽になったりといいことも多いわけで。

まあ、ゆっくりと勉強していきますね。

2012年8月26日日曜日

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


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

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

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

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

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


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

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

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

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


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


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

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

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

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

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

したりなんてこと。

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

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

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



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


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

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

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

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

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


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

で、LT

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

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

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

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

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

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

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


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

やった

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

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

ワクワクだね!!

2012年8月12日日曜日

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


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

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

DLはこちらから。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2012年7月25日水曜日

Tomcat7 on ScientificLinux6

背景


最近、Rubyの勉強を行なっている。で、Rubyと言えばRailsと思い立った。

実は、CRubyではなくJRubyでコードを書いている。そのため、RailsもTomcatなどのJavaアプリケーション・サーバーで走らせることになる。

動かすだけが目的であるならば、GoogleAppEngineだって、JRrubyやRailsが動くのでそれでも良い。

しかし、先日さくらのVPSのりようを開始したりで手元に環境が揃っているため、自前でアプリケーション・サーバーを用意することにした。

動作させるOSはScientificLinux6。ちなみに、すでにJenkinsが動作しているサーバーであるため、ポートが重なったりしないよう気をつけなければならない。


手順


  • JDKのインストール
  • tomcatのインストール
  • tomcatの設定
  • apacheの設定


JDKのインストール


大事なのは、インストール作業よりも環境変数の登録。


# vim ~/.bashrc
export JAVA_HOME=/usr/java/default
export PATH="$PATH":$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar


#source .bashrc

tomcatのインストール


#wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-7/v7.0.29/bin/apache-tomcat-7.0.29.tar.gz
#tar xzf apache-tomcat-7.0.29.tar.gz
#mv apache-tomcat-7.0.29 /usr/local/tomcat
#rm -rf apache-tomcat-7.0.29.tar.gz

tomcatの設定

#vim /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=$CLASSPATH:/$CATALINA_HOME/common/lib

起動スクリプトの記述

#vim /etc/rc.d/init.d/tomcat

#!/bin/bash

# Tomcat7: Start/Stop Tomcat 7
#
# chkconfig: - 90 10
# description: Tomcat is a Java application Server.

. /etc/init.d/functions
. /etc/sysconfig/network
source /etc/profile.d/tomcat.sh

TOMCAT_USER=tomcat
LOCKFILE=/var/lock/subsys/tomcat

RETVAL=0
start(){
        echo "Starting Tomcat7: "
        su - $TOMCAT_USER -c "$CATALINA_HOME/bin/startup.sh"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $LOCKFILE
        return $RETVAL
}

stop(){
        echo "Shutting down Tomcat7: "
        $CATALINA_HOME/bin/shutdown.sh
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        return $RETVAL
}

case "$1" in
        start)
        start
        ;;
        stop)
        stop
        ;;
        restart)
        stop
        start
        ;;
        status)
        status tomcat
        ;;
        *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac
exit $?

apacheの設定


ポートの変更

#vim /usr/local/tomcat/conf/server.xml
#http://server:8080 でのアクセスを禁止する
#コメントアウト
      
#AJPのポートを変更する

#8009 -> 8020 に変更

AJPの設定

#vim /etc/httpd/conf.d/prozy_ajp.conf
ProxyPass /tomcat/ ajp://localhost:8020/
デーモンの起動

#/etc/rc.d/init.d/httpd restart
#/etc/rc.d/init.d/tomcat start

サービスの登録

#chkconfig --add tomcat
#chkconfig tomcat on
というわけで、次はRails

2012年7月23日月曜日

mydns.jpに繋がらなくなった


mydns.jpに繋がらなくなった。


事の発端

先日、mydns.jpからメールが来た。

IPアドレスの通知が10日間確認できません。
※注意
・一週間以上IPアドレスの通知がないと、エラーサイトに誘導します。
・一ヶ月以上ご利用がないと、全てのデータを削除しますのでご注意ください。


ipアドレスの通知は、30分おきにwgetコマンドでログインページにアクセスすることで行なっている。

確かに、mydns.jpのログを見るとアクセス履歴がない。どうやら、サーバーからmydns.jpへの接続がうまく行ってないらしい。


結論

悪さをしていたのは、iptablesだった。一度

/etc/rc,d/init.d/iptables stop


で止めた上で

ping www.mydns.jp


を叩いたら繋がった。一先ず、接続許可リストにwww.mydns.jpを加えて問題解決。しかし、色々と腑に落ちない。

やったこと

まずは、pingを試してみる。

ping www.mydns.jp


は勿論、直接IPアドレスをターゲットにしたりもしたけどどうやら駄目。

次はtraceroute

見事に途中まで行って繋がらなくなっている。

この辺で困る。

routeコマンドでルーティングテーブル眺めたり、/etc/hostsとか/etc/resolver.confを眺めるも特に問題無さそう。

というか、mydns.jpにのみ繋がらない。

この辺で、@masawada君に頼んで彼のtracerouteの結果を見せてもらった。

どうも、mydns.jpの直前までは繋がっているらしい。と言うことはルーティングテーブルやDNSの設定ではないなー

って感じで悩んでて、ふとファイアーウォールかなー?と。

そういう訳で、iptablesの設定を変更してどうにか解決。

原因??


なんで、mydns.jpが弾かれていたのか結局謎。

接続拒否リストに載っていたとかってこともないし、特にブロックする設定にしていたわけでもない。

以前発生した似たような現象で、許可していない場所から、場所へのアクセスを全て弾く設定をしてしまっていたことがあったけど、今回はそういう事もない。

ただ1点気になるのはiptablesの設定ファイルの中に書いた

iptable -A INPUT -t filter -p tcp --syn -j DROP


コレが俺の思っている以上に強力なのではないだろうか。特に設定をしていないtcpパケットは弾くっていう意味で書いているつもりだけど、ぜんぜん違うのでは・・・?

iptables -L


を叩くと

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  jpn.www.mydns.jp     anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  www.MyDNS.JP         anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
DROP       all  --  usa.www.mydns.jp     anywhere
DROP       all  --  asia.www.mydns.jp    anywhere
DROP       all  --  www.MyDNS.JP         anywhere
DROP       all  --  eu.www.mydns.jp      anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere            udp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nnsp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nnsp

ってなって、mydns.jpをDROPしてるし・・・?わからん・・・。わからんけど、今日は寝る。

2012年7月14日土曜日

Chrome Tech Night #3に参加したっ!

Google Japanオフィスに初めて潜入しました。





内容は、Google I/Oで行われたセッションの日本語訳。詳細は、Googleのブログを。

http://googledevjp.blogspot.jp/2012/07/chrome-tech-talk-night-3.html

ちなみに、僕自身はChrome Extensionは昨年のDevQuizで書いた経験しかありませんw

まずは、現状のChromeの話。

セキュリティ系統の話となると、パーミッションを設定してそれに同意した上でユーザはExtensionを導入するというシステムになっています。

丁度、Androidのアプリと同じ様な感じでしょうか。

しかしながら、現状では必要以上のパーミッションを要求するものや、システム上機能を有効利用できていないものが多くあるとのこと。

これらが生み出す問題は悪意のあるExtensionが公開されてしまう、ということよりもExtensionを利用することによって脆弱性が生み出されてしまうことの方が大きいそうです。

Extensionのコードを介して、WEBサイトに対してXSS攻撃が可能となったりするそうです。

さらに、APIももっと細かく提供することを考えているそうです。

これらのことが目指しているのは、開発者の意図をもっとはっきりとさせると言うこと。

つまり、「このExtensionを使うと、こういうことができるよ」から更に踏み込んで「この機能を実装するために、この仕組み(パーミッション)を利用するよ」

ということが分かるということかな、と。そう考えると、パーミッションの細分化やAPIの提供に加えて、App Storeでパーミッション毎に注釈なんかが付けられると嬉しいですね。

さて、それも踏まえて今後のことですが、現在Extensionの開発に必用なManifestファイルのversion1を利用しているアプリは2013年末に向けて使えなくなるそうです。

ベンダーは、アップデートと今後の開発はvesion2で行いなさいと言うこと。

今まで開発をしてこなかった僕は、勝ち組ということでしょうかね。


引き続いてChorme Appの未来の話。

これらの実装はまだ行われておらず、App Storeでの公開はできないとのことですが、とは言えwktkする内容でした。

Chrome APPはWEBアプリらいくなHosted APPと、ウィジェットらいくなPackaged APPに分けられるそうですが、話の感じとしてPackaged APPに力が入っている感じでした。

今後はアプリを Chromeの起動→アプリの起動、ではなくてWindowsならスタートメニュー、MacならDockから起動できるように、

さらにブラウザの外枠を外したUIや複数ウィンドウへの対応更に、アプリ内で踏んだリンクは新しいブラウザで起動するようにするなど、ブラウザの枠を超えた存在を作るそうです。

まるで、Adobe Airですね。ネィティブのSilverRightでもイイかもしれませんが?

さらに、オフラインへの対応の強化。これは、オフライン状態への自動的な切り替えや、オンライン時の自動同期などの提供です。

そして、盛り上がったのが新しいAPIの提供。例えば、ハードウェアへの直接的なアクセス。今までもWEBカメラは利用できていましたが、更にBluetoothやUSBデバイスへのアクセスが可能に。

そして、TCP,UDPを利用したネットワークへのアクセスなど思いの外下層レイヤのAPIの提供が実装されていてびっくりでした。

実際にGoogleI/Oではデモで、LEGO MINDSTORMをPCに接続したゲームパッドから、Chromeを介してBluetoothで操作するものが動いていたそうです。

さらに、どなたかの質問で挙げられたのが、TCPやUDPでアクセスできるのであればlistenポートを作ってしまえばサーバーアプリケーションを作成することが出来るのではないかというもの。

詳細はドキュメントを読んでくださいということでしたが、Chromeがサーバーになれば例えば本格的なWEBサーバーと言うよりも、集まった仲間同士で何かをやるグループウェア的な使い方ができるかもしれません。

というか、各種IRCやチャットサービスの利用やSSHの利用なんかも実装できますね。すでにExtensionで提供されているものもありますが、もっとセキュアな実装で再登場するかもしれませんん。公開鍵認証使えるとか。

さてセッション終了後は懇親会。皆さんテンションが高くて!!

何人かの方とお話をしましたが、どうもGoogleが目指しているものは「プラットフォームとしてのChrome」何じゃないかということでした。

アプリを動かすのもChrome、WEBページを見るのもChrome、そしてもしかしたらサーバーも・・・?

IE6なんて、今となっては残念なブラウザもありますが「ブラウザって何?」なユーザに対して「このアプリを利用するには、Chromeを入れる必用があります」

と、説明をするなんてアプローチが可能になるってことでしょうかね。

それはそれでアレですけど・・・

モバイル版のChromeも配信され、Extensionは使えないものの盛り上がっている今、明るくてwktkなセッションを聞くことができてほんとうに楽しかったです。

ChromeNote や ChromeBoxでOSとしてのChromeも今後どんどん盛り上がっていくと更に楽しいと思います。

僕も、Extensionを書いたりしてCommitしていきたいですね。

最後に、Extensionの開発などで利用できるサイトのURLを4個ほど貼り付けておきます。

Google Chrome -- Google Developers
https://developers.google.com/chrome/

Google Chrome Extensions -- Google Code
https://developer.chrome.com/trunk/apps/about_apps.html

Google Chrome -- GitHub
https://github.com/GoogleChrome

HTML5ROCKS
http://www.html5rocks.com/ja/

2012年7月12日木曜日

僕もNginx+Wordpressだっ!



先日のこと。



こんな流れでnginx使ってWEBサーバーを立てることになった。インストールと設定のメモを記述。

環境はさくらVPSで動く、ScientificLinux6。

公式でバイナリパッケージが配布されているので、yumを使ってインストールが可能。

参照先リポジトリの設定。
#vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/6/$basearch/
gpgcheck=0
enabled=1

インストール
#yum -y  --enablerepo=nginx install nginx

php-fpmのインストール

リポジトリの追加
#rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi 
#rpm -ivh http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/epel/6/i386/epel-release-6-7.noarch.rpm
#rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm  

URLの変更
#vim /etc/yum.repos.d/remi.repo

mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror


mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror

インストール
#yum install -y php php-fpm php-devel php-cli php-xml php-mysql php-mbstring php-gd --enablerepo=remi

nginxの設定ファイルの編集
#vim /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    server_tokens off;
    gzip  on;

    server {
            listen 80;
            server_name _;

            root /usr/local/www/yoriko.mydns.jp;
            index index.php index.html index.htm;
            charset utf-8;

            access_log /var/log/yoriko.access.log;
            error_log /var/log/yoriko.error.log;

            location = /robots.txt { access_log off; log_not_found off;}
            location = /favicon.ico { access_log off; log_not_found off;}

            location ~*\.php$ {
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
                    fastcgi_param SCRIPT_FILENAME
                    $document_root$fastcgi_script_name;
                    fastcgi_intercept_errors on;
                    include fastcgi_params;
            }

            location ~/\. {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    }
    include /etc/nginx/conf.d/*.conf;
}

php-fpmの設定ファイルの編集
#vim /etc/php-fpm.d/www.conf

user = nginx
group = nginx
pm = static
php_admin_flag[expose_php] = off

デーモンの起動
#/etc/rc.d/init.d/nginx start
#/etc/rc.d/init.d/php-fpm start
ひとまずこの手順で、phpがブラウザで動作します。あとは、普通にWordPressをインストールするだけ。

ただ、.htaccessとか無いのでパーマリンクの設定などをどうするのかは要調査です。

2012年7月4日水曜日

ADK2012がやってきた

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

引換券表

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

目覚まし時計

ご開帳

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

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

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

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

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

アラーム設定画面。

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


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

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

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

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

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

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

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

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

2012年6月28日木曜日

JellyBeansがやってきた #io12 #io12j

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

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



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

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

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

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

2012年6月16日土曜日

エミュレーターの画面を出力するディスプレイの設定

エミュレーターを実行するディスプレイを設定する。

Jenkinsの管理→Global properties
で、環境変数
DISPLAY=:0.0

に設定しておく。

とりあえず、こんだけ。これで、Jenkinsの動いているマシンで、エミュレーターを表示できる。


ローカルのマシンで、xhostを立ちあげてそこで表示できるようにしようかなとも思ったけど、常にxhost立ち上がっている訳でもないし、たぶんそれはやりすぎ。

確認したい時だけ、確認できるようになっていれば良いと思う。それが、Jenkinsの目指す所であるはずだし。

X Window System の設定は色々と面倒くさい。

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

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

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

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

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

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

以下、手順

/etc/sysconfig/jenkins の設定

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


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


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



パーミッションの変更

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

パスを通す

AndroidSDK


Jenkinsの管理→Global properties

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

Ant


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

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

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

明日に続く。

2012年6月14日木曜日

さようなら、VMWareServer

節電の夏がやって来くる。

 正直な話、昨年の我が家の9月の電気代は結構酷かった。

ほぼ1か月間アメリカに旅行に行っていて家に居ないにもかかわらず、 請求された電気代が、家に居る時とほぼ同じだった。

 理由は明快で
  •  メインサーバー 
  • メディアサーバー 
  • サーキュレーター 
  • 換気扇
が、常時稼動していたためだ。

今年は、夏の間も家にいる。となると、対策を講じるべきかと思う。電気代も値上がるみたいだし。

という訳で、サーバーの一本化を行おうと考えた。メディアサーバーは、テレビ番組の録画を行うサーバーで、Windowsが動いている。

こいつに一本化するのが早道かな、と。

メインサーバーは、VMWareESXiを利用していくつかのLinuxが動いている。これらを、VMWare Vsphere Converter を利用して再利用可能な形に変換する必要がある。

とは言え、大した手間でもない。

変換対象の仮想マシンの電源を切り(!)、件のツールを動かすだけだ。

ただ、変換後にどのVMWareソリューションで動かすのかは大事なところだ。


最初は、VMWareServer2で動かすことを考えていた。しかし、もう随分前に更新もストップしたこれは、対応しているOSも時代遅れのもの。

案の定、ScientificLinux6 64bitの動作は不可能だった。

結局、VMwarePlayerでその場しのぎ。

管理が面倒であるが、仕方ないのかなぁ。

テスト対象のデバイスを自動的に選択する Jenkins

先日から困っている、JenkinsのAndroid Emulator Pluginの不具合。

原因の特定もできず、解消の見込みも無いまますでに3日くらい経過してしまった。

このままうなり続けていても、ただいたずらに時間が経過するだけなので、別の手段を用いることにする。

そもそも、Jenkinsを利用する理由の一つは、自動的に様々な端末(エミュレーター)での動作をさせることが可能であるからである。

自動化大事だよ、自動化って話。

で、自動化したい項目をまとめると次の2点。

  1. エミュレーターの作成
  2. テストの実行
どちらも、簡単なスクリプトで実現できそうである。

一つ目に関しては。マルチ構成のプロジェクト設定にすれば、OSのバージョン、画面のサイズなどを変数として宣言することが出来る。バッチファイルの中で呼び出してあげればそれで終わり。

 二つ目も、

adb devices


コマンドから、動作中のエミュレーター、デバイスの一覧を取得できることから

adb devices | awk 'NR>1 {print $1}'


なんて やれば(多分)デバイスの一覧を取得できるのでうまう使ってやればいい。

結局、既存の問題はプラグインが悪いのか俺が悪いのかは不明。

しかし、どうも動いている人もいるから、なんともなぁ・・・。


プラグインのソースコードを眺めることも含めて検証を行いたいけど、まあこれで上手く行きそうなのでいいかな?って。

まあ、そんな分けでCIを周りに勧めていきたいとは思うけど、Androidの開発やってるの俺くらいだしなぁ・・・。

2012年6月12日火曜日

JennkinsOnWindowsでAndroid #Jenkins









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

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


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

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

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


antの設定


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

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


JAVA_HOMEの設定


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

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

環境変数に注意


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

android update project -p %WORKSPACE%\ProjectPath


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

 バッチファイル:%WORKSPACE%

Jenkinsの設定:$WORKSPACE

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

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

$WORKSPACE\ProjectPath\build.xml

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

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


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



これは落ちる


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

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



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

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

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

2012年6月11日月曜日

WindowsにJenkinsを入れてCI #Jenkns

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

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

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

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

インストール

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

色々と設定

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

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

F:\Program Files\Jenkins\jenkis.xml

を開いて

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



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

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

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

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

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


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

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

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

NET STOP Jenkins

NET START Jenkins

とする。

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

JenkinsのWorkspaceはデフォルトでは

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

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


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

プラグイン

使っているプラグインは

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

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

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

とりあえずこんなもん。

現状

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

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

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