Team Foundation Service の Build サーバは Windows Azure SDK 1.8 対応済み #tfsug

更新

2012/12/13 Use the hosted build controller in VS - Team Foundation Serviceで、Azure SDK 1.8が対応したので解決しました。

Team Foundation Service で Windows Azure プロジェクトをビルドしようとするとエラーが発生しビルドできません。。

環境

現象

ビルド要求をキューに入れて実行するとエラーが発生します。

C:\a\src\y_kajikawa\Documents\Visual Studio 2012\Projects\PhotoShareApp\PhotoShare.Web.Azure\PhotoShare.Azure.ccproj (64): The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Windows Azure Tools\1.8\Microsoft.WindowsAzure.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

プロジェクトファイルの以下の箇所でエラーが出ているようです。

 <!-- 中略 -->
  <!-- Import the target files for this project template -->
  <PropertyGroup>
    <VisualStudioVersion Condition=" '$(VisualStudioVersion)' == '' ">10.0</VisualStudioVersion>
    <CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\1.8\</CloudExtensionsDir>
  </PropertyGroup>
  <Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
</Project>


Team Foundation Service はまだAzure SDK 1.8 に対応していないのかそれとも正しい設定があるのか。
継続して調べます。

原因

現時点 2012/11/16 では、Azure SDK 1.8 はまだインストールされていませんでした。

(@__Black さんありがとうございます!)

以下、Team Foundation Service の Build Server にインストールされているソフトウェアが掲載されているページです。
Use the hosted build controller in VS - Team Foundation Service

まだ Azure SDK 1.7 まで。
早めに対応してくれると幸せだなー。
回避策はないので当分待ちます。

Windows Azure Service Bus でオンプレミスと連携する Oct-2012版

Windows Azure のサービスの一つである Service Bus でオンプレミスと連携をするサンプルを作成しようとしてますが Azure の更新速度が早いため、サンプルの用語と環境が最新とは異なり自分がやる時に苦労したのでまとめました。

今回は 10行でズバリ!! [C#] Windows Azure サービス バスでオンプレミス/クラウド間の通信を行う in C#, HTML, XML の Service Bus のサンプルを以下の環境で実施します。

環境

サービス バスを使用する準備: 名前空間の作成

管理ポータルにログインして「サービスバス」→下に表示される「新規」をクリックします。
f:id:kaji_3:20121113213653p:plain

作成するサービスバスのIDを入力し登録します。今回は「hogehogehoge」にします。
f:id:kaji_3:20121113213811p:plain

開発環境の構成

参考にする記事では RelayConfiguraionInstaller.exe を実行していますがSDK1.8には入っていません。
(参考:Release Notes for the Service Bus October 2012 Release
Nugetから Service Bus のプロジェクト(NuGet Gallery | Windows Azure Service Bus 1.8.0.0)をインストールしてくれ、とのこと(意訳)なのでプロジェクトを作成後、インストールします。

アプリケーションのプロジェクトの作成 (オンプレミス/サービス側)

Windows Azure アプリケーションのプロジェクトの作成 (クラウド/クライアント側)

両方一緒にやります。
「ファイル」→「新しいプロジェクト」→「Visual C#」→「Cloud」→「Windows Azure クラウドサービス」を選択。プロジェクト名を「AzureServiceBusSample」にします。
f:id:kaji_3:20121113215011p:plain

「OK」をクリックすると何を作成するか選択するダイアログが出るので「Web Role」を選択し名前を「ServiceBusClient」にします。
f:id:kaji_3:20121113215235p:plain

Azure に作成するので混乱しますが、クラウド⇔オンプレミス連携の「クラウド側」に当たるものです。

次にオンプレミス側のサービスを作成します。
「ファイル」→「新しいプロジェクト」→「Visual C#」→「コンソールアプリケーション」
f:id:kaji_3:20121113215650p:plain
「ServiceBusOnpremiseService」にします。

WindowsAzure.ServiceBus のインストール

パッケージコンソールを起動し、作成した2つのプロジェクトに対し以下のコマンドを実行します。

PM> Install-Package WindowsAzure.ServiceBus

これにより、ServiceBus用のDLLへの参照、および、Web.config、App.configへの必要な設定が追記されます。

サービス バスを使用するサービス コードの実装 (オンプレミス/サービス側)

ServiceBusOnpremiseServiceプロジェクトに以下の内容の SampleService.cs を追加します。

using System;
using System.ServiceModel;

namespace ServiceBusOnpremiseService
{
    // WCF サービス コントラクトの定義 
    [ServiceContract(Namespace = "http://schemas.example.com/sample")]
    public interface ISampleService
    {
        [OperationContract]
        string Echo(string message);
    }

    // WCF サービスの実装 
    class SampleService : ISampleService
    {
        public string Echo(string message) 
        { 
            // コンソールに出力 
            Console.WriteLine("Echo: '{0}'", message);
            return message; 
        }
    } 
}

サービス バスを使用するための構成情報の追加 (オンプレミス/サービス側)

App.config を編集します。以下の内容を下に追記します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <!-- 追記ここから -->
    <!-- サービスの構成 -->
    <services>
      <service name="ServiceBusOnpremiseService.SampleService">
        <endpoint contract="ServiceBusOnpremiseService.ISampleService" binding="netTcpRelayBinding"
                  bindingConfiguration="NetTcpRelayEndpointConfig"
                  behaviorConfiguration="SBEndpointBehavior" />
      </service>
    </services>

    <!-- Windows Azure サービスバス用のバインディングの構成 -->
    <bindings>
      <netTcpRelayBinding>
        <binding name="NetTcpRelayEndpointConfig">
          <security relayClientAuthenticationType="RelayAccessToken" />
        </binding>
      </netTcpRelayBinding>
    </bindings>

    <!-- Windows Azure サービスバス用のエンドポイント ビヘイビアの構成 -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="SBEndpointBehavior">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="owner"
                            issuerSecret="rhX4nDF7wOSwOWrUbIHh22cXHC+bMZyaMdc2KBcDy3E="/>
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <!-- 追記ここまで -->
    <extensions>
~省略~

issuerName、issuerSecretは、作成したService Busのものを設定しましょう。
確認方法は、管理ポータル→「サービスバス」で対象のサービスバスを選択し「アクセスキー」をクリック。
f:id:kaji_3:20121113223527p:plain

表示されるアクセスキーをコピーし、設定します。
f:id:kaji_3:20121113223540p:plain

なお、この App.config を設定すると以下の警告が表示されます。
behaviorExtensions,bindingElementExtensions に追加してあるのですが認識できていないためのようです。
警告が出ても動くのでこのまま進みます。
(誰が正しい設定方法があれば教えていただきたいです)

  • transportClientEndpointBehavior
要素 'behavior' には無効な子要素 'transportClientEndpointBehavior' が含まれています。必要とされる要素は 'clientVia, callbackDebug, callbackTimeouts, clear, clientCredentials, transactedBatching, dataContractSerializer, dispatcherSynchronization, remove, synchronousReceive, webHttp, enableWebScript, endpointDiscovery, soapProcessing' です。
  • netTcpRelayBinding
要素 'bindings' には無効な子要素 'netTcpRelayBinding' が含まれています。必要とされる要素は 'basicHttpBinding, basicHttpsBinding, customBinding, msmqIntegrationBinding, netHttpBinding, netHttpsBinding, netPeerTcpBinding, netMsmqBinding, netNamedPipeBinding, netTcpBinding, wsFederationHttpBinding, ws2007FederationHtCtpBinding, wsHttpBinding, ws2007HttpBinding, wsDualHttpBinding, netTcpContextBinding, wsHttpontextBinding, basicHttpContextBinding, mexHttpBinding, mexHttpsBinding, mexNamedPipeBinding, mexTcpBinding, webHttpBinding, udpBinding' です。

サービス ホスト コードの実装 (オンプレミス/サービス側)

ServiceBusOnpremiseServiceプロジェクトの Program.cs を編集します。
エンドポイントのURLは、自分が作成したServiceBusのものを設定しましょう。

using System;
using System.ServiceModel;
using Microsoft.ServiceBus;

namespace ServiceBusOnpremiseService
{
    class Program
    {
        static void Main(string[] args)
        {
            // サービスバスの接続モードの設定 
            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
            // サービスバスに公開するエンドポイント URL を生成 
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", "hogehogehoge", "Sample");

            // WCF サービスホストを生成 
            ServiceHost host = new ServiceHost(typeof(SampleService), address);
            // WCF サービスホストを開始 
            host.Open();

            Console.WriteLine("Press ENTER to exit...");
            Console.ReadLine();

            // WCF サービスホストを終了 
            host.Close();
        }
    } 
}

サービス バスを使用するクライアント コードの実装 (クラウド/クライアント側)

ServiceBusClientプロジェクトに SampleServiceClient.cs を以下の内容で作成します。

using System.ServiceModel;

namespace ServiceBusClient
{
    // WCF サービス コントラクトの定義 
    [ServiceContract(Namespace = "http://schemas.example.com/sample")]
    public interface ISampleService
    {
        [OperationContract]
        string Echo(string message);
    }

    // クライアント チャンネルの定義 
    interface ISampleChannel : IClientChannel, ISampleService { }
}

また、Webフォーム「WebForm.aspx」を以下の内容で作成します。

  • WebForm.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="ServiceBusClient.WebForm" %>
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
        <h2>Windows Azure ServiceBus Sample</h2> 
        Message: <asp:TextBox ID="MessageTextBox" runat="server" /> 
        <asp:Button ID="PostButton" runat="server" Text="POST"  
            onclick="PostButton_Click" /><br /> 
        <hr /> 
        Echo: <asp:Label ID="EchoLabel" runat="server" /> 
    </div> 
    </form> 
</body> 
</html>
  • WebForm.aspx.cs
using System;
using System.ServiceModel;
using Microsoft.ServiceBus;

namespace ServiceBusClient
{
    public partial class WebForm : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void PostButton_Click(object sender, EventArgs e)
        {
            // サービスバスに登録されているサービスのエンドポイント URL を作成 
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", "hogehogehoge", "Sample");

            // WCF クライアント チャンネル ファクトリーを生成 
            ChannelFactory<ISampleChannel> channelFactory =
                new ChannelFactory<ISampleChannel>("SampleService", new EndpointAddress(address));
            // サービス呼び出し用の WCF クライアント チャネルを生成 
            ISampleChannel client = channelFactory.CreateChannel();

            // サービスバス接続されているサービスを呼び出す 
            EchoLabel.Text = client.Echo(MessageTextBox.Text);

            // チャンネルならびにチャンネル ファクトリーを破棄 
            client.Close();
            channelFactory.Close();
        } 
    }
}

サービス バスを使用するための構成情報の追加 (クラウド/クライアント側)

Web.config の 下に以下を追記します。

  <system.serviceModel>
    <!-- 追記ここから -->
    <!-- Windows Azure サービスバス用のバインディングの構成 -->
    <bindings>
      <netTcpRelayBinding>
        <binding name="NetTcpRelayEndpointConfig">
          <security relayClientAuthenticationType="RelayAccessToken" />
        </binding>
      </netTcpRelayBinding>
    </bindings>

    <!-- Windows Azure サービスバス用のエンドポイント ビヘイビアの構成 -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="SBEndpointBehavior">
          <transportClientEndpointBehavior credentialType="SharedSecret">
            <clientCredentials>
              <sharedSecret issuerName="owner"
                            issuerSecret="rhX4nDF7wOSwOWrUbIHh22cXHC+bMZyaMdc2KBcDy3E="/>
            </clientCredentials>
          </transportClientEndpointBehavior>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <!-- クライアントの構成 -->
    <client>
      <endpoint name="SampleService"
                contract="ServiceBusClient.ISampleService"
                binding="netTcpRelayBinding"
                bindingConfiguration="NetTcpRelayEndpointConfig"
                behaviorConfiguration="SBEndpointBehavior" />
    </client>
  <!-- 追記ここまで -->
    <extensions>

ローカル環境での動作確認

ServiceBusOnpremiseService をデバッグ実行します。
設定が正しくサービスバスに接続していれば以下の画面が表示されます。
f:id:kaji_3:20121113225621p:plain

管理ポータル→「サービスバス」→「作成したサービスバス」をクリックすると以下のように接続がされリレーが存在する事を確認できます。
f:id:kaji_3:20121113230150p:plain

次に、ServiceBusClient をデバッグ実行します。
WebForm.aspx を参照するURLを開きます。
そして、テキストボックスに「メッセージ」と入力し「POST」ボタンを押します。
f:id:kaji_3:20121113225926p:plain

するとサービス側には「メッセージ」が表示されクライアント側にはメッセージが返信されます。
f:id:kaji_3:20121113230337p:plain

Windows Azure 上への配置と動作確認

ServiceBusClient を Azure Web ロールにデプロイすれば動作します。
Azure Web ロールは元記事でも省略されているのでがんばってください。

最後に

以外に簡単に Service Bus が利用できることがわかりました。
あと、Toolのバージョンアップで手順が大分簡略化できる事もわかりましたが。。
日本語のドキュメントが少ないので今後も最新化+英語記事を実践したらブログに書こうとおもいます。

Win7 x64 で Entity Framework 利用時「指定されたストア プロバイダが構成内に見つからないか、無効です」が発生する(解決)

環境

現象

Windows XP(x32)環境でビルドしていたODP.NET利用のWebアプリ(プラットフォームターゲット Any CPU)ビルド時、以下のエラーが発生。発生個所は edmx ファイル。

エラー175:指定されたストア プロバイダが構成内に見つからないか、無効です 

英語だと、

error 175: the specified store provider cannot be found

調査

英語で調べてみると Entiry Framework の Issue に上がってました。現時点では対応されていないようですね。
Entity Framework - View Issue #171: EdmGen: Error using EdmGen 4.0 with Oracle11g DAC (Win 7 x64)

回避方法

Issueに以下の回避方法がありますがこれは edmx を再作成するためのものであり作成済みのものを使えるようにするものではありません。

  • open Visual Studio Command Prompt with admin privileges
  • cd %frameworkdir32%\%frameworkversion32%
  • copy edmgen.exe edmgen32.exe
  • corflags /force /32bit+ edmgen32.exe

私が実施した対応としては、64bit Oracle Client+ Oracle DataAccess Component をアンインストールした後、32bitをインストールしました。
その結果、エラーが出ずにビルドできるようになりました。

認定スクラムマスター研修への参加とこれからのこと

10/18,19大阪にて認定スクラムマスター研修へ会社の同僚と3人で参加してきました。研修に参加して感じた事をまとめてみます。

背景

部署には色々な問題が存在していてその解決方法の一つとして「アジャイルな開発」が注目されています。ただ、実践経験者が部署にいない事、私がやった案件がスクラムマスターを正しく理解していないからフラジャイルになった事(参考初めてのアジャイル開発を終えてのふりかえり - kaji_3's blog)から一度講習を受けて知識を補填するため、参加する事となりました。また予算の都合がついて3人で参加する事となりました。

参加前会社にて

研修前に参加メンバーと部署にスクラムを導入する課題を話し合い、多数の課題がある事が明確になりましたが、実践者に伺って参考にしてみたかったものは以下の3点です。

契約

前回の案件は色々模索して作業請負で実施していましたがどうやっているのか。

全体の見積

スコープが定まりませんが、顧客から見積金額の提示を求められた場合にどうやるのか。

スプリントを回す前にやるべき事は何か

スプリントを回す方法は書籍などから吸収しやすいのですが、スプリントを回す前に何をするべきなのか。

研修で得た気づき

アジャイルだけで語ってしまうとぼんやりしてしまう

アジャイルは状態(終わった後に出来たという事)であり、スクラムは手段。アジャイルについて話すと抽象的な話になってしまい、腹に落ちないという事。(研修の中では「アジャイルは心意気、スクラムは方法」という言葉も参加者から聞けました)会社でアジャイルと言った時に聞いていた皆さんの顔が「?」だった原因に今更気づきました。。

役割、セレモニーへの理解が足りなかった

役割(PO,SM,チーム)、セレモニー(スプリントプランニング,デイリースクラム,スプリントレビュー,ふりかえり)について丸暗記で「何故それをするのか」を理解できていない事がわかりました。実践者の方々と話す事で役割、セレモニーが具体的になった事が起因していると思います。

目的と手段を勘違いしない

正直「スクラムを導入するため」に参加したわけですが、自分たちがここに来れた理由は「アジャイル開発」への期待があり、期待の元になっている問題を解決する事に価値があるのであり「スクラムを導入する」だけでは価値は産まれないという事。

これからのこと

研修の最後に立てた誓いは以下の通り!

個人として

  1. 【明日】得たことをアウトプットする(このエントリ)
  2. 【来週】上司への共有
  3. 【来月】部署への共有

チームとして

  1. 【明日】自分で復習をする
  2. 【来週】自分のチームに共有し、導入を検討する
  3. 【来月】自分のチーム外に得た事を共有する

最後に

大変勉強になりました。自分が見よう見まねで案件で実践して疑問点がいくつかありましたが講師の方々、参加者の方々と話す事で参加前の疑問も答えが出せました。または、案件がない状況で「アジャイルな開発」を推進しようとすると「目的」と「手段」を取り違えてきたのかもしれないと反省しました。会社の抱える問題と向きあってもう一度どう進めるか考えていきたいと思います。

Team Foundation Server をチームで使う前にするべき10のこと #tfsug

TFSを実業務で使って早4回になります。
そんな4回でチームで使う前に準備しておけばよかった orz と反省する点があるので自戒も込めてまとめてみました。

前提

  • TFS2010
  • 筆者経験のプロジェクト導入規模は1〜20人
  • バージョン管理と自動ビルドのみ導入

1.保存可能なデータ容量を把握しておく

特に SQL Server Express を使っている方ですが、SQL Server 2008 Express は4GBが保存可能な容量の上限です。SQL Server 2008 R2 Express は10GBです。
(参考:
SQL Server 2008 R2 Express Database Size Limit Increased to 10GB - SQL Server Express WebLog - Site Home - MSDN Blogs
)
ソース管理に、ソースだけではなくドキュメント、開発ツールも保存したくなりますが SQL Server のエディションを確認した上で管理するものを決めましょう。 SQL Server Express Edition ではメモリ、プロセスについても制限があります。チーム規模が大きくなるようなら SQL Server Express Edition は避けるのが無難です。

2.Power Tools はサーバ、クライアントの両方にインストールしておく

TFSでこんな事できるかな(エクスプローラーからソース管理、バックアップ設定等)を調べるとPower Tools だと出来る、という事があります。プロジェクト内でソフトウェアのインストールを依頼できる場面は最初の一回に抑えたいので最初からインストールしておきましょう。Power Tools はこちらからダウンロードできます。
Team Foundation Server Power Tools December 2011 extension

3.バックアップを検証しておく

Team Foundation Server のバックアップ にどうやるか書いてありますが、PowerTools で簡単なバックアップ設定ができます。TFSのデータの保存先はSQL Server なので 知識があれば高度なバックアップ設定ができます。バックアップを取ったらリストアできるか検証しておきましょう。

4.ブランチガイドを読んでブランチ計画を考える

Visual Studio Team Foundation Server Branching and Merging Guide - Download: v1 - Visual Studio 2010 (Japanese)
にプロジェクトの特定に合わせてどのようにブランチを利用べきかのガイドがあります。(翻訳者の皆様ありがとうございます!)後から分岐用のフォルダを作成するとフォルダ構成がわかりづらくなりますのでこのガイドに沿って作成するのが良いです。あと、チームメンバーに分岐、マージをどうやるか展開する時にガイドに沿っていればガイドを見せる事で簡単な教育できます。

5.ゲートチェックインは最初から導入する

「最新版取ったらビルドできないんだけど。。」という言葉を撲滅するためにゲートチェックインを導入しましょう。この現象が起きやすいのはチームに余裕がない場合です。こんな時こそゲートチェックインだ!と思うのですが余裕がない状態で運用を変更するのはチームに負荷がかかります。なので最初から導入しておきましょう。

6.有償ツールのライセンスを準備しておく

よくGrapecityさんのツールを使わせて頂いてます。当然ですがライセンス情報がないとビルドしても動きません。ビルドサーバのライセンスというのは忘れがちなのでちゃんと準備しておきましょう。

7.自動ビルド→デプロイ+パッケージ作成の仕組みは作っておく

プロジェクトの途中で「ちょっと動作確認をしてみたい」と言われる事が多々あります。TFSでは自動ビルドからデプロイするのが簡単なので最初から検証環境へのデプロイの仕組みを作っておきましょう。Webアプリ限定で手前味噌ですが過去エントリを参考にどうぞ。
TFSの自動ビルドでWebアプリのデプロイ、配布パッケージの作成を同時に行う #tfsug - kaji_3's blog

8.プロジェクト警告の設定をしておく

ビルド結果をメールで通知できるようプロジェクト警告の設定をしておきましょう。手順はこちら→警告の設定

9.シェルブ機能をちゃんと教えておく

チェックインしていないソースの共有方法としてシェルブがあります。「プロジェクトの共有フォルダに置いておいたから」という言葉も撲滅しましょう。

10.認証情報をコントロールパネルから設定させる

「TFSに接続する度に認証ダイアログが出るんだけど」と言われます。ドメインを利用していれば問題ないのですがそうではない場合は、資格情報を保存させましょう。この資格情報設定 Win7, Xp, Vista でそれぞれ違うので各OSのサポートページのリンクを貼っておきます。


TFS 2012 からはExpress Edition も出ていますがある程度の規模になると「購入」をするはずです。TFSを周りにつかった人がいなくてアドバイスが貰えなかったばっかりに期待した効果がでないのは本当にもったいない!思い稚拙ながら自分の経験から10個上げてみました。これが誰かの助けになれば幸いです。
あと、ツッコミ、もっとこうすればいいよ!があれば是非お願いしますm(__)m