2015年3月13日

SQL ServerからTeradataに接続する

仕事場ではTeradata使っています

かなりの量のデータになってるみたいなんですが。
とりあえずの物置みたいです。
そんなTeradataにSQL Serverからリンクサーバー機能を使って接続する、って話。

TeradataのDeveloer Blogに書いてある

何のことは無い、実はすでに書いてあるんです。
Setup SQL Server 2008 R2 Linked Server To the Teradata Database
んで、この通りにやってみると。
リンクサーバー作るまではできるんですが、ODBCのドライバが読み込めないとのエラーが。
(スクショ撮るの忘れた… orz)
Microsoft SQL Server Error. 7303 とのこと。

答えもすでに書いてある

上記のページに実はすでにこのエラーについてコメントに書いてあって。
「すべてのTeradataのドライバを消して、64ビットだけ入れればいいよ」
とのこと。
実は、上記のページの最初にTeradataのODBCドライバがリンクされてあって、そこからドライバをダウンロードして入れたのですが、それだと32ビットのドライバもインストールされてしまうんですね。
そこで、以下の手順で再インストール。
  1. SQL Serverからリンクサーバーの情報を消す
  2. ODBCの設定を消す
  3. ODBCドライバを削除する
  4. Program Filesと(x86)からTeradataのディレクトリを消す
  5. SQL Serverのマシンを再起動(重要!)
  6. 上記ドライバをダウンロードし、解凍する
  7. 解凍してできたディレクトリ内のx64ディレクトリ内を、ICU、GSS、ODBCの順にインストールする
  8. 管理ツールのODBC データソース(64ビット)からODBCの設定を行う
  9. SQL Serverにリンクサーバーの設定をする
と。
まあ、普通にx64を再インストールすればいいだけなんですが。
これで問題なくリンクサーバーとして使えるようになります。

アクセス方法

Teradataにアクセスする方法としては、最初のリンクに書いてありますが、
select * from TD..scheme.table
という書き方でできます。
リンクサーバーの名前をTDのところに、リンクサーバー名を書くんですね。
やってみたらデータ多すぎでメモリに入らない、と言われたら、
select * from openquery(TD, ‘select * from scheme.table’)
という感じで、openquery構文を使いましょう。
’内に’を書く場合、’’と2重で書けば大丈夫です。

MySQLとのリンクサーバーを作るときの問題

以前にSQL ServerからMySQLのサーバーにリンクサーバーを作るときの方法を書いたのですが。
これが。
いろいろ間違っていて。(日本語関連とか…)
時期を見て書き直します…。

2014年12月24日

Xamarin.FormsでListViewを使う

この投稿はもしかしたらXamarinのAdvent Calendar 2014の記事になると思います。
また、かなり初心者向きです。
(社内の人の洗脳用も兼ねてますw)

ListViewを使う

前提の詳しい説明は省きますね。
ListViewってのは項目を縦に並べて選択するようなもの。
要するに、こんな感じのものです。

image

Xamarin.FormsでListView

もう、XamarinやXamarin.Formsが何であるかの説明は省いて。
簡単な使い方。

ListViewはViewなので、PageやLayoutに貼付けて使います。
iOSなら、AppDelegateにこんな感じで書くと使えます。

        ObservableCollection<string> items = new ObservableCollection<string>();
        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            Forms.Init ();

            ListView lv = new ListView() {
                ItemsSource = items,
            };
            ContentPage cp = new ContentPage () {
                Title = "ListView Test",
                Content = lv,
            };
            cp.Appearing += (object sender, EventArgs e) => {
                if (items.Count == 0) {
                    items.Add ("Test 1");
                    items.Add ("Test 2");
                    items.Add ("Test 3");
                    items.Add ("Test 4");
                    items.Add ("Test 5");
                    items.Add ("Test 6");
                }
            };
            Window = new UIWindow (UIScreen.MainScreen.Bounds);
            Window.RootViewController = new NavigationPage(cp).CreateViewController();
            Window.MakeKeyAndVisible ();

            return true;
        }

これで、こんな感じの画面に。

image

超簡単。
やってることは、

  1. Xamarin.Formsを初期化して
  2. ListViewを作って
  3. 土台になるページを作ってListViewを中に入れて
  4. 土台のページが表示されたときにListViewに表示するアイテムを追加して
  5. ウインドウを作って
  6. Navigationで土台ページを表示する

ってこと。
ObjectiveCでやってたdelegateの山はどこ行ったんだ、と。
思ってしまいます。

アイテムを選択したときに次のページへ

ListViewでアイテムを選択した際に、次のページへ遷移するようなコードは以下のようになります。
(先のソースからの変更点のみ)

            ListView lv = new ListView() {
                ItemsSource = items,
            };
            lv.ItemTapped += async (object sender, ItemTappedEventArgs e) => {
                await lv.Navigation.PushAsync(new ContentPage() {
                    Title = e.Item.ToString(),
                    Content = new ListView() {
                        ItemsSource = items,
                    },
                });
            };

アイテムをタップしたときに次のページを作って表示してます。
簡単簡単。
ここではasync~awaitを使用して、スレッド処理が行われます。

セクション表示を行う

仕切り線みたいなのです。
あれを実現するには、ListView.IsGroupingEnabledをtrueに設定し、ListView.GroupDisplayBindingにセクションラベルのプロパティをBindingし、リストのリストをListView.ItemsSourceに設定することで表示されます。

        public class GroupingItem : ObservableCollection<string>
        {
            public string SectionLabel { get; set; }
        }
        ObservableCollection<GroupingItem> items = new ObservableCollection<GroupingItem>();
        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            Forms.Init ();
            ListView lv = new ListView () {
                IsGroupingEnabled = true,
                ItemsSource = items,
                GroupDisplayBinding = new Binding("SectionLabel"),
            };
            ContentPage cp = new ContentPage () {
                Title = "ListView Test",
                Content = lv,
            };
            cp.Appearing += (object sender, EventArgs e) => {
                if (items.Count == 0) {
                    GroupingItem itm = new GroupingItem() { SectionLabel = "Section 1" };
                    itm.Add ("Test 1");
                    itm.Add ("Test 2");
                    itm.Add ("Test 3");
                    items.Add(itm);
                    itm = new GroupingItem() { SectionLabel = "Section 2" };
                    itm.Add ("Test 4");
                    itm.Add ("Test 5");
                    itm.Add ("Test 6");
                    items.Add(itm);
                }
            };
            Window = new UIWindow (UIScreen.MainScreen.Bounds);
            Window.RootViewController = new NavigationPage(cp).CreateViewController();
            Window.MakeKeyAndVisible ();
            return true;
        }

Bindingとか面倒くさくなりますが、そのBindingを適切に設定することでデータをいじくるだけで表示されるアイテムが置き換わるわけです。
(MVCとかMVVMとかいう考え方の様です。その辺は調べてください)

リストのアイテムをいじる

リスト内のアイテムは、Cellというものでできています。
一番最初のスクリーンショットは自分がQiitaのアイテム一覧を出せるようにしたアプリの画面になります。

では、最初のスクリーンショットのようなアプリを作ってみましょう。
Qiitaのアイテム一覧のJSONを取得し、ListViewで表示するものです。

        [DataContract]
        public class QiitaUser
        {
            [DataMember]
            public string name { get; set; }
        }
        [DataContract]
        public class QiitaItem
        {
            [DataMember]
            public string title { get; set; }
            [DataMember]
            public QiitaUser user { get; set; }
        }
        [CollectionDataContract]
        public class QiitaItems : ObservableCollection<QiitaItem> {};
        QiitaItems items = new QiitaItems();
        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            Forms.Init ();
            ContentPage cp = new ContentPage () {
                Title = "Qiita Items",
                Content = new ListView () {
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    HasUnevenRows = true,
                    RowHeight = 52,
                    ItemsSource = items,
                    ItemTemplate = new DataTemplate (() => {
                        Label titleLabel = new Label () {
                            HorizontalOptions = LayoutOptions.FillAndExpand,
                            VerticalOptions = LayoutOptions.Start,
                            LineBreakMode = LineBreakMode.TailTruncation,
                            FontSize = 18,
                        };
                        titleLabel.SetBinding<QiitaItem> (Label.TextProperty, i => i.title);
                        Label usernameLabel = new Label () {
                            HorizontalOptions = LayoutOptions.Start,
                            VerticalOptions = LayoutOptions.End,
                            FontSize = 12,
                        };
                        usernameLabel.SetBinding<QiitaItem> (Label.TextProperty, i => i.user.name);
                        return new ViewCell () {
                            View = new StackLayout () {
                                Padding = new Thickness(10,0,0,0),
                                Orientation = StackOrientation.Vertical,
                                Children = {
                                    titleLabel,
                                    new StackLayout() {
                                        Orientation = StackOrientation.Horizontal,
                                        Children = { usernameLabel }
                                    },
                                },
                            },
                        };
                    }),
                },
            };
            cp.Appearing += (object sender, EventArgs e) => {
#if __IOS__
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
#endif
                HttpClient client = new HttpClient ();
                client.GetStreamAsync ("http://qiita.com/api/v2/items").ContinueWith ((res) => {
                    Device.BeginInvokeOnMainThread (() => {
                        if (res.Exception == null) {
                            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(QiitaItems));
                            QiitaItems il = (QiitaItems)serializer.ReadObject(res.Result);
                            foreach(QiitaItem i in il){
                                items.Add(i);
                            }
                        }
#if __IOS__
                        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
#endif
                    });
                });
            };
            Window = new UIWindow (UIScreen.MainScreen.Bounds);
            Window.RootViewController = new NavigationPage(cp).CreateViewController();
            Window.MakeKeyAndVisible ();
            return true;
        }

ちょっと、というか、だいぶんと長くなってしまいました。
Cellの中身を自由にレイアウトするには、ViewCellを使ってStackLayoutとかと組み合わせると比較的楽にレイアウトできます。

また、中ではネットワークの処理も書いていますが、ContinueWithを使うよりもasyncawaitを使う方がスマートになります。
Exceptionの判定も面倒くさくなりますし。

JSONのパースはSystem.Runtime.SerializationにあるDataContractJsonSerializerを使用しました。
Windows8でもWindowsPhoneでも使えますので、比較的楽にマルチデバイスで作れる様になります。

あと、Xaml使うと楽なのですが、個人的に好きなShared Projectでうまく読み込んでくれなかった経験もあり、個人的にはソースでガリガリ書いています。

最後に

本当ならアイテムの長押しとかジェスチャー的なところまで書きたかったのですが
、それをするにはListViewRendererを使わないとできないということなんですね。
で、ListViewRendererはiOSでは見れるんですが、Androidはプライベートなクラスになっています。
なので、Androidで実現する方法が今のところわかっていなかったりするので…。
断念しました。

Xamarin.Formsを使うと、ネットワークからデータを読んで一覧で表示するだけならかなり簡単にできてしまいます。
一度使ってみるといいですよ♪

2014年8月19日

Visual Studio 2013の共有プロジェクトを使ってみる

そもそも共有プロジェクトって何ぞや?

普通なら、共有プロジェクトって何ぞ?
ってところから始まると思うんですが。
まあ、それはもう前提条件として。
もうすっ飛ばしてしまいます。

ソースファイルが増減しなければリンクでもよし

同じようなことは、「既存の項目」でファイルを追加する際に、「リンクとして追加」を選べばできます。
ソースファイルの増減がなければ、それでもいいかもしれません。

2014年8月18日

XamarinでAndroid用の動画プレイヤーを作ってみる

車移動の子供のお供に

週末はよく車で移動するんですが、子供用にはお古のiPhoneで動画を見せていました。
日本初代のiPhone。
病院行きます、と仮病で発売日に並んで買ったやつ。

さすがにもうバッテリーがへばりまして。
1時間近く充電して(車内充電なのでパワーが弱いのです)やっと目を覚ますという。
代替わりということで、一時代替えで正式に変わりが用意できるまで借り物のLG製のAndroid端末を据えてみました。

借り物なので無茶苦茶するわけにもいかず。
Android 2.3なのですが、Play Storeにつながらず、アプリをインストールすることもできず。
仕方なしに車内用連続再生動画プレイヤーを一晩で作ってみたのです。

…前置きが長くなってしまってすみません。

2013年12月6日

SQL ServerからMySQLのデータベースにアクセスしてみる。

Surface2が十分な速さです。

仕事場で使ってるんですけどね。
個人的にはクライアント機はもうSurface2でいいかな、という感じがします。
けどまぁ、普段でもプログラムを作ったりするんで。
やっぱりプログラムできる端末からは離れられないんですけどね。

SQL ServerからMySQL。

仕事でMySQLのデータをSQL Serverに移すことを考えました。
最終出来にはSQL Azureに持っていきたいんですけどね。
その通過点としてSQL Serverを通してみよう、と。

MySQL → SQL Server → SQL Azure

ってなことを考えたんですが…。
SQL Azure Data Sync、自動更新間隔が5分は長い。
それなら、移行のためだけにしか使えない…。
というわけで、とりあえずはデータの移行です。

2013年11月11日

OWINとNancyとRazorのサイトで多言語化。

一日に何度も更新しなくても。

何度も更新しなくても、とも思うんですが。
まあ、そういう日もあるんじゃね、ってことで。

多言語化です。

好きです。
多言語化ネタ。
そういえば昔もQtとかでアプリを作った時もひたすら多言語化を考えてた気がする。

というわけで、先のOWINとNancyとRazorの記事の続きなのですが。
実はあまり書くことはなかったりします。
それは、以前に書いたMVC4の多言語化の方法とほとんど同じなので。
すみませんが、そちらの記事を参考にしてください。

間違えていました!!(2013/11/12)

追試を行った結果、記述を間違えていたことが判明しました。
申し訳ありません。

以下、修正し直してあります。

WebRoleにOWINでNancyでRazorしてみる。

Surface Pro欲しいです。

いいですよね。
Surface。
テスト機用にSurface2は仕事場にあって、その速さは実感済みなんですけど。
Surface Pro欲しいですよ。
個人的に。

SignalRを使おうとしてみた。

SignalRを使おうとしてみたのですが、何やらOWINに移行済みとか。
んで、OWINって何ぞや?とかやってみたんですが、まあ資料の少ないことw
しばやんさんのページにはホント助けられました。
そのほかにも、いろんなところでも。

それで、OWIN調べると、いろいろ嵌る嵌る。
日本語の資料が少ないのもあるんですが。
折角なので、忘備録的に書いておこうと思いまして。

手順。

ざっと手順としては、以下になります。

  1. WebRoleのプロジェクトを作る
  2. パッケージをインストールする
  3. web.configを手直しする
  4. OWINのStartupを作る
  5. NancyのModuleを作る
  6. Razorのビューを作る

それぞれはホントにちょこちょこっと入力するだけなので、理解してしまえばHello Worldをデプロイするまで30分くらいです。

プロジェクトを作る。

ここで試した環境は、Windows8 + Visual Studio 2013です。
まあ、Visual Studio 2013 Web版でも大丈夫っぽいです。

まずは普通にCloudのプロジェクトを作ってWebRoleを追加しておきます。
その際、WebRoleはEmptyで作っておきます。
また、参照でMVCにチェックを入れておくと、後々Razorのビューを作るときにIntelisenceが効きます。

01

パッケージをインストールする。

以下の3つのパッケージをインストールします。

Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Nancy.Owin
Install-Package Nancy.Viewengines.Razor

web.configを手直しする。

以下の真ん中の行を追加しておきます。
<appSettings>
  <add key="owin:HandleAllRequests" value="true"/>
</appSettings>

また、以下の行が2重化しているので1つ削除しておきます。

<add key="webPages:Enabled" value="false" />

OWINのStartupを作る。


パッケージをインストールすると、「追加」→「新しい項目」の一覧の中に「OWIN Startupクラス」というのが増えています。
これを使ってStartupクラスを作成します。


02


Nancyのモジュールを作る。


Nancyでルーティングテーブルを作成するためにモジュールを作成します。
これは、MVCのControllerと同じようなもので、命名規則も似通っています。
クラス名はxxxModuleとして、xxxの部分を好きな名前に変えてください。


public class HomeModule : NancyModule
{
     public HomeModule()
     {
         Get["/"] = _ =>
         {
             ViewBag.Title = "Razor Page";
             return View["index"];
         };
     }
}

View[]の中がRazorのビューのファイル名になります。
また、MVCで使うときとと同じようにViewBagが使えます。


Razorのビューを作る。


プロジェクトを作るときにMVCにチェックを入れておくと、基本的なディレクトリが作成されています。
RazorのビューはMVCで使うのと同じようにViewsディレクトリに作ります。


03


Nancyのモジュールを作った際につけたクラス名xxxModuleのxxxの部分がViewsディレクトリの下に、そしてその下に拡張子.cshtmlを補う形でビューのファイルを作成します。
ビューのファイルは以下のようになります。

@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<dynamic>

@{     Layout = "Shared/_Layout.cshtml";
}

<h3>Hello, world</h3>

基本的にはMVCの時と変わらないのですが、1行目にクラス情報を書きます。
細かく言うと、ビューファイルはC#のファイルを生成し、それをコンパイルすることで動きます。
1行目はその基底クラスの宣言になるようです。
(正確には@inheritsの行)


また、<>の中はNancyのモジュールでView[]を使用した際に2番目の引数の型になります。
この辺は気が向いたらまた書くかもしれません。


Layoutを使う際には、Viewsの下からのディレクトリ・ファイル名を書きます。
ここはMVC5のRazor用にビューを作ると、”~/Views/Shared/_Layout.cshtml”の様にパスが書かれてあります。
このままではNullPointerExceptionが出ますので気を付けてください。


以上でF5とか押してデバッグをするとHello, Worldが出ます。


Azureにデプロイする際の注意点。


このままAzureにデプロイすると、エラーになります。
それは、参照ファイルが足りないから。
「参照の追加」から、「アセンブリ」「拡張」ときて、Microsoft.Web.Infrastructureを追加して、「プロパティ」からローカルコピーをTrueに変えておいてください。


とりあえず。


本当はSignalRをやってみたいんですが、調べていくうちになんとなくこんな方向に行ってしまいました。
実はその前に



  1. OWINって何ぞや
  2. NancyってNode.jsのExpress.jsっぽ
  3. OWINが発展してEdge.jsとな
  4. おおお。Node.jsでC#のコード呼び出せるのか
  5. VSのプロジェクトにするかPowerShellで作ったものを使うか…
  6. Node.jsのVSのプロジェクトめんどい
  7. じゃ、MVCでいいじゃん
  8. SignalR…OWIN… ←イマココ

的な葛藤が。
次はNancyで行くかWebApiにするかで悩みそう。

  

2013年4月24日

Androidのアプリ開発にTFSとAzureを使ってみる(3)

今回も長いです

TFSでのプロジェクト管理の軽いお作法的なことを書いてみます。
前回も長かったですが(ちゃちゃっとやれば数分でできることなのに……)、今回も長くなりそうで。
先にごめんなさいします。

ソースのチェックイン

前回、ソースファイルをTFSに登録するところまでやりました。
ここからはルーチンワーク的な作業になります。
まずはファイルのチェックインから。

チェックインは当然のことながら、「ソース管理」の画面で登録したファイルのみ行われます。
ただ、作業をしていると自然とファイルが追加されていきます。
それについては、既に登録されているディレクトリ下に追加したファイルは自動的にソース管理に追加されるようです。

すでにファイルは登録されているとして。
まずは「チームエクスプローラー」ウインドウの上部にある▼のついた部分があります。
(通常なら「ホーム▼」になっているはず)
その▼部分をクリックするとメニューが開くようになっています。
その中で、「保留中の変更」を選んでください。
下記のようになり、変更・追加したファイルが一覧になって表示されます。

050

あとはコメント欄に変更履歴なんかを書いて、「チェックイン」のボタンを押せばファイルがチェックインされます。
VSSとは違って、特にそのままチェックアウトしなおさずに変更を重ねて行っても大丈夫です。
変更のコンフリクトがあればどのファイルがコンフリクトになっているか知らせてくれますし、マージツールも起動できます。

プロジェクトの設定

▼メニュー内から「設定」を選ぶことでプロジェクトの設定を行うことができます。

051

複数人で編集する際にはこの中の「セキュリティ」「グループメンバーシップ」の設定は必須になってきます。
ユーザーはActiveDirectoryで管理されているものや、動かしているサーバー内のユーザーなどを設定することが可能で、メールアドレスが設定されているとそのまま引っ張ってこれたりもするようです。

この「設定」内の「作業項目のイテレーション」を選ぶと、ブラウザウインドウが新しく開き、イテレーションを設定することができます。
「イテレーション」とはTracなどの「マイルストーン」で、大まかな作業区割りになります。

052

項目をダブルクリックすると設定変更できます。
ここで指定できるのはイテレーション名と期日です。

053

タスクを作ってみる

タスクは「作業および見積り」です。
これはできるだけ細かく入力することをお勧めします。
まずはメイン画面作成のタスクを作ってみます。

▼メニューから「作業項目」を選びます。
すると、チームエクスプローラーのウインドウが以下のように変わりますので、「新しい作業項目」をクリックしてください。
メニューが開きますのでその中から「タスク」を選ぶことで新しいタスクを作ることができます。

056

057

このウインドウの項目を埋めていくことで行わなければいけない項目を作成します。
「状態」や「理由」は最初に作った段階では新規しか選べません。
「イテレータ」は先ほど作成したイテレータを選択することができます。
この中で仕事で使うには意外に重要なのが「最初の見積もり」です。
ここにはとりあえず何時間くらいかかりそうかを入力します。

タスクはいくつも作ることができます。
また、タスクの子供としてタスクを作成することができ、上記のウインドウ内の「実装」や「すべてのリンク」から親子関係を作成することができます。

タスクの子供はプロジェクト内に作成できるもの何でも子供として登録できます。
バグ、要望、チェックイン項目などなど。
また、「添付ファイル」でファイルを添付することもできます。
このようにしてリンク関係を作っていきます。

タスクの一覧を表示する

「チームエクスプローラー」ウインドウで「作業項目」を選んでいると、「クエリ」という欄があります。
これが登録されているタスクやバグを一覧表示する機能になります。
たとえばこの中で「担当タスク」をダブルクリックすると自分が担当者になっているタスクを一覧表示することができます。

058

もちろん、クエリはカスタマイズできます。
クエリ内の各項目で右クリックするとメニューが出てきますので、その中から「クエリの編集」を選ぶことで以下のようなウインドウが表示されます。

059

クエリの中には「マイクエリ」と「共通クエリ」があります。
これらの違いはその上の「お気に入り」と「チームのお気に入り」のどちらに登録できるか、になります。
「マイクエリ」内のクエリは「お気に入り」に、「共通クエリ」はどちらにも登録できるんです。

では、この「お気に入り」と「チームのお気に入り」の違いは、というと、「Web Access」に違いが出てきます。
「チームエクスプローラー」ウインドウ内の▼メニューで「Web Access」を選ぶと、ブラウザが立ち上がってプロジェクトの管理をすることができるんですが、このトップ画面には「チームのお気に入り」に登録されているクエリが表示されます。

「チームのお気に入り」に何も登録されていないときは

060

こんな画面ですが、登録されていると、

061

こんな風に変わります。
これは、開発のメンバーではなく管理のメンバーの場合、開発ツールを入れずにブラウザで進行状況をチェックすることができるようになっているためと思われます。
状況がわかりやすいですね。

バグを登録する

基本的にはタスクの作成と同じですが、こちらは「Web Access」で行ってみましょう。
「チームエクスプローラー」ウインドウの▼メニューから「Web Access」を選びます。
出てきたウインドウの上部、「+バグ」ボタンをクリックするとバグ登録の画面が開きます。

062

「状態」欄は新規しか選べません。
「理由」欄は新規かビルドエラーかを選択することができます。
通常、「ステップの再現」欄に再現方法を、「システム情報」欄に再現したシステムを記入します。

063

ここでの「発見されたビルド」ですが、TFSが行ったビルドが自動的にポップアップされ、入力できるようになっています。
Androidアプリの自動ビルド設定の仕方は次回にでも書こうと思ってるんです。
(というか、本当はそれが書きたかったw)

入力が終わったら、Eclipseに戻って「作業項目」のクエリから「担当のバグ」をダブルクリックして一覧表示してみてください。
下記のような一覧表示のウインドウが開きます。

064

この一覧の各アイテム上で右クリックすればメニューが開きます。
その中から「リンクされた新しい作業項目...」を選ぶことで、このバグにリンクされたタスクなどを新しく作成することができます。

065

ポップアプから「子」を選び、タスクを作成することで、関連づいたタスクを作成することができます。
こうしておくことで「担当のタスク」を見ることでやらなければいけないことの管理ができるようになるわけです。
また、デバッグ担当は開発ツールを入れることなくブラウザでバグを入力することができます。

通知機能

タスクやバグの登録・変更をメールで知らせる機能もあります。
この機能はTFSの管理ツールからメール関連の設定をしておくことが前提になります。

066

左側のツリー項目の「アプリケーション層」をクリックすると、メールの設定を行える部分があります。
ここの「通知の設定」のリンクをクリックするとメールの各種設定を行うウインドウが開きます。

067

ここでメールの送信設定を行っておいて、Eclipseの「チームエクスプローラー」の▼メニューから「設定」を選び、「通知の設定」を行うことでメールでの通知が行われるようになります。

Express版とExpressのつかない版の違い

仕事ではExpressがつかない版のTFSを使用しています。
なので、このBlogを書いてて『あれ?』と思うこともしばしばあって。
とりあえず簡単なところで違いを挙げておきます。

まず、Express版にはグラフを作成してくれる機能がないようです。
下記はExpressが無い版の「Web Access」の画面です。

100

赤いバーで表示されている部分は、予測時間や1日に割り振れる時間などをきっちり入れておくと、時間予測して表示してるのです。
予測時間が想定内であれば緑でバーが描かれるんですが…。
ここでは「予想より実際の時間がかかりすぎや」と怒られているので赤くなっています。
(バグ消化に夢中になって入力忘れてるんですな)

また、その時間予測からバーンダウンチャートを描いてくれます。
これは一定時間ごとにバックグラウンドで計算されているようで、リアルタイムには変わってくれません。
これらの機能のため、予測時間や残存時間の入力が大変重要になってくるのです。

上記のようなアバウトなグラフではなく、もっとキッチリとした画像も生成してくれます。

101

まあ、こんなチャート見せるのは恥ずかしいのですが。
終わりきってませんし(笑)

また、チーム内のタスクやバグを見やすい「ボード」という機能があります。

102

左端がバグやバックログ(Expressに無さそう!)項目で、その右の青い四角が各々タスクになっています。
青い四角の中には残存時間やタスク名、担当者の名前などが表示されていて、誰にどんな作業が残っているか、どの作業中なのか、どれを終わらせているか、どれくらいの時間がかかりそうなのか、等が一目瞭然です。

また、Webインターフェイスにもかかわらず、ドラッグ&ドロップで項目移動やクリックでの入力開始などができたりして。
そこだけでしばらく遊んでしまえるようになってたりします。

最後に

とりあえず、タスクとバグの登録関連をざっと見てみました。
基本的にはこの辺り、ルーチンワークになると思われますので、簡単に登録などができるようになっているのがうれしいです。
また、一覧も比較的簡単にクエリが書けたりしますので、いろいろ凝ったリストも表示することが可能です。

しかし、長くてすみません。
はしょりまくりで書いたつもりなんですが…。
次回はAndroidの自動ビルドをばさっくりと書きたいです。

2013年4月23日

Androidのアプリ開発にTFSとAzureを使ってみる(2)

プロジェクトとコレクション

TFSをAndroidのプロジェクトで使う前にTFSの基本的な考え方を書いておきます。
TFSではソースやタスク(Redmineでいうチケット)、バグなどを束ねているのは「プロジェクト」になるんですが、そのプロジェクトの上位に複数のプロジェクトを束ねる「コレクション」という存在があります。
つまりはこんな感じ。

  • コレクション
    • プロジェクト
      • タスク
      • タスク
      • バグ
    • プロジェクト
      • タスク
      • バグ
    • プロジェクト
  • コレクション
    • プロジェクト

この「コレクション」は「管理コンソール」アプリからしか操作出来ません。
コレクションを作成すると、内部的にはデータベースが作成され、それぞれが別管理になります。
また、Webインターフェイスでも別URLが付加されます。

「プロジェクト」下の各オブジェクト(ソース・タスク・バグ等)はそれぞれが親になったり子になったりのリンク状態を作成することができます。
そして、これらはWebインターフェイスでもEclipseのプラグインでも操作できます。

コレクションを作る

TFSをインストールをすると、DefaultCollectionというコレクションが標準で作成されています。
この下に複数のプロジェクトを作成できるので、個人で使う分には特に新しくコレクションを作成する必要はないんですが、チーム別でコレクションを分けたりしておくと便利になったりします。

まずは「管理コンソール」を立ち上げます。
すると以下の画面っぽくなってるはずなんですね。

020

右上に「コレクションの作成」のリンクがあるのでそれをクリックします。
すると、以下のようにコレクション名と説明の入力を促されるので、最低限コレクション名を入力します。
ここでこのコレクション名ですが、英数字のみで作っておくことを強くお勧めします。

021

あとはもう「次へ」と「検証」「作成」を選んでいけば、最終的に「成功!」とか言われてコレクションの作成が終了します。

028

プロジェクトの作成

さて、主に使うことになるプロジェクト、なんですが。
Eclipseから使っているとここで問題になります。

実は、Eclipse+Team explorer everywhereのみではプロジェクトを作成することができない様なのです。
TFSのWeb解説の「プロジェクトの作成」には以下のように書いてあります。

チーム エクスプローラーのみからチーム プロジェクトを作成できます。

というわけなのですが、Eclipseからは空のコレクションにプロジェクトを追加すること、ができません。
これは、以下の理由のためです。

Eclipseだとプロジェクトを作成するコレクションを選ぶ際に以下のダイアログが表示されます。

030.ng

そして、VisualStudio2012シリーズから同じコレクションを選ぶ画面を出すと、以下の画面が出てきます。

031

ここで違うのは、「チームプロジェクト」の欄がEclipseだと空であるのに対し、VisualStudioからは(選べませんが)「すべて選択」のアイテムがあるのです。
そのため、EclipseだとFinishのボタンが押せません!!VisualStudioからは「接続」のボタンが押せるのです!!
そのため、Eclipseでは空のコレクションに接続できない、ゆえにプロジェクトを作成することができない、という状態になってしまうのでした。
ここはぜひとも直してほしいです>MS

プロジェクトを作成する

仕方ありませんので、とりあえずVisualStudio2012からプロジェクトを作ることにします。
今のところ、無料のVisualStudioシリーズでもプロジェクトは作成できるようですので、そちらから作成します。

「ファイル」メニューの「新しいチームプロジェクト...」を選ぶと、以下のようなダイアログが出ます。
とりあえずプロジェクト名だけつけて「完了」を押せば、いろいろ動いて完了の画面になります。

040

041

これでプロジェクトが作成できました。
Eclipseに戻ってプロジェクトに接続します。

EclipseからTFSのプロジェクトに接続する

Eclipseから「Team foundation serverエクスプローラー」パースペクティブを開くと、以下のようなウインドウが開きます。

042

このなかの「Team Foundation Serverへの接続」を選ぶと、以下のようなウインドウが出ます。
今度はプロジェクトを選択できるようになっていて、「Finish」のボタンも押せるようになっています!

043

接続したいプロジェクトにチェックを入れて「Finish」のボタンを押せば接続し、ソースのチェックインやタスクの作成などが行えるようになります。

ソースディレクトリを指定する

プロジェクトとの接続ができれば、ソースの登録やイテレーション(マイルストーン)の登録ができるようになります。
プロジェクト進行の部分は次回に書くとして(相変わらず画像だけで長くなってしまいましたので…)。
まずは、ソースの登録をば。

接続できれば、チームエクスプローラーのウインドウの中身が以下のように切り替わります。

044

まずはここで「ソース管理エクスプローラー」のリンクを選んでください。
すると、以下のようなウインドウが開きます。

045

ここではまず、「マップされていません」というリンクをクリックしてください。
すると、どのディレクトリと関連付けるか入力するウインドウが開きます。

046

「参照」のボタンを押せばGUIでの選択ができます。
GUIで指定した場合、指定したディレクトリ内のプロジェクト名のディレクトリをマップすることになるようです。
気になるのであれば、テキスト欄の修正は可能なのでworkspaceを指定しなおしましょう。
普通にEclipseからAndroidのApplicationを作成するとworkspace下にソースが作成されるので、そのまま管理することができるようになります。

さっそくAndroidのApplicationを作成しましょう。
…とまあ、その辺の知識はあること前提として(笑)
もうすでにソースコードが上記でマップしたディレクトリ下にあること前提にします。

ソースを登録する

マップが済めばソースを登録します。
「ソース管理」ウインドウに表示されているプロジェクト名を右クリックするとメニューが出てくるので、「項目をフォルダーに追加...」を選びます。
ウインドウが出てディレクトリやファイルを追加できますので、チェックインしたいファイルやディレクトリを追加してください。

048

問題は除外設定でディレクトリの設定ができません。
なので、binやgenを取り除きたい場合は、除外の欄に「*.class;R.java;BuildConfig.java」と設定しておけばほとんどのファイルは除外できます。

とりあえず今回はここまで

な、長いです……。
すみません。
なんか毎回こう書いているような。

次回はプロジェクト管理の基本を書いてみます。

2013年4月20日

Androidのアプリ開発にTFSとAzureを使ってみる(1)

TFSについて

自分の中で今一番のトレンドといえばTFSです。
これは、Visual Studio Team Foundation Serverと言って、MicrosoftにおけるTrac+Subversionのような、ソース管理+プロジェクト管理用のツールです。
5人までならExpressバージョンもあって無料で使えたりします。

で。
自分も最近まで知らなかったのですが、MicrosoftのVisualStudioのバージョン管理、ということでVSSを思い出す方も多いと思いますが。
実はこれは大きな間違いでありまして。
TFSはVSSのバージョンアップ版でもなんでもなく、別プロダクトのようで。

VisualStudioからだけでなく、Eclipseからも接続できたりするんですね。
プロジェクト管理もMS Projectからだけでなくブラウザから使えたりして。
しかも、最近のバージョンアップでGitにも対応したりして。
かなり便利だったりします。

Eclipseからつなげられる、ということで。
実はAndroidのソース管理にも使えたりします。
(Gitも使えるようになっているので、そちら方面から攻めても大丈夫です)
Macからでも大丈夫なようです。
では早速使ってみることにします。

TFSをインストールする

実はTFS Express、2013/04/20現在、先のTFS Expressのリンクからダウンロードすることができません。(謎)
なので、VisualStudioのダウンロードページからダウンロードします。

この真ん中らへんにVisual Studio Team Foundation Server Express 2012という項目がありますので、そこの中のリンクからインストールをします。
ここに書いてあるUpdate 2というバージョンからGitが使えるようになっているようです。
インストールするとSQL Server Expressも同時にインストールされるようです。
(管理のバックエンドにSQL Serverを使用しているらしい。バックアップとかもそちらをバックアップする)

…とここまで書いておいてなんですが、個人ではこのExpressとVisualStudio使って作業するんですが、Eclipseからは仕事場で使っていて、サーバーはExpressじゃないほうのTFSなんですねぇ。
後で書く(予定)のビルド設定とかがちゃんとExpressで使えるかどうかは実はよくわからなかったりします。ゴメンナサイ orz

EclipseにTeam explorer Everywhereをインストールする

さて。
TFSとEclipseで検索すると、MSのエバンジェリストの長沢さんのBlogに行きつきます。
TFSといえば長沢さん、ということで、ここは素直に長沢さんのBlogに従います。

が。
上記の記事は少々古いので。
Eclipseのプラグインの入手先をTeam Explorer Everywhere for Team Foundation Server 2012 with Update 2こっちにします。
(実はこっちにも手順は詳しく書いてあります)

あとのインストールは長沢さんのBlogの通りなので…。
重複して書いても面白くないのでとりあえず今日はこの辺で。
また次回にでも。