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

2012年10月15日月曜日

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年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月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の話をするかはわかりませんが、なんか話します。

ワクワクだね!!