読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

SIerから日本マイクロソフトへ転職しました

Other

2月17日付で富士通の子会社のSIerを退職しました。2月20日から日本マイクロソフトで働きはじめました。 ということで振り返りを。

富士通の子会社に入社

2005年に富士通の子会社に入社しました。確か当時1500人規模だったと記憶しています。 新宿に拠点を構えて、中部、大阪にも支社がある感じです。

そんなところで何をしてきたかというと、半年間みっちりJavaでWebアプリケーション開発を行う研修をしました。 当時はまだVisual Studioとかは企業向けでは無償ではなくてSharpDevelop?とかExpressEditionがではじめたかも?というくらいでした。それを使ってチャットアプリケーションを作って同期にばらまいて、授業中にチャットでわからないところとか質問し合ってたのはいい思い出です。

研修が終わり配属されたのは全社の技術支援を行うような感じの部門。(ちなみに配属先希望の選択肢にはなかった) そこで待ち受けてたのは社内向けJava用Webアプリケーションの開発をすることになりました。

Spring Framework, Hibernateを使った感じのライブラリで、IDEがまさかのSun Java Studio Creator(現在はNetBeansに吸収されて消滅した感じ)。 渋い感じのチョイスだなと思ってました。

既存のDBのスキーマを読み取ってHibernate関連のファイルを自動生成する処理が気に入らなかったので、velocityというテンプレートエンジンを使うように作り替えたりしました。

割と好きにさせてもらえたので当時のリーダーの人には感謝してますし、当時の目標でもありました。途中でいなくなっちゃったけど。

あとは、プロジェクトで何かしら問題が起きたら手伝いに行くとかということをしてました。 DataTableの性能が出ない問題とか、サーバーサイドExcelオートメーションとか辛い問題もありましたが、性能改善とか設計レビューとかそいうのもやってました。あと技術相談とか。

3日のはずが…

そんなこんなで過ごしていたら「クラウドに興味のある人?」という問いが上司から来たので「はーい!」と手をあげたら3日間の教育にぶち込まれることが決まりました。しかも対象は幹部社員クラスの人たちらしい…。やだなぁと思い4連休へ突入したのでした。

4連休明けて会社に戻ってくると3日間の教育は別の人が割り当てられてました。 何があったのか聞いてみると、大田くんには2年間の教育に行ってもらうと言われて??????となりました。

そんなこんなで2年間のクラウドの教育をするという壮大な計画に巻き込まれてしまいました。 ただし、これはあくまで部署として推薦するだけで会社として1名選出する過程で別の部署の人を推すので大田くんがなることはないと言われたのを今でも覚えてます。その日の夕方「大田くんに決まったよ」と言われました。

2年間の本社勤務

ということで電車だけで1時間30分くらいかかる通勤生活が2年間決まりました。 富士通のクラウドの勉強や商談支援などをしてたのですが、当時富士通が富士通のデータセンターにAzureをホストしてたのもあって、それをやりたいやりたいオーラを出してたら、1年たった頃にチームがえがあってそちらに移してもらえました。 そして、さらに半年後なぜかチームリーダーに…。嫌だと言ったのに!!

ここでは、大企業のスピード感(遅い)というものを肌を持って感じました。関係者が増えれば増えるほど色々なしがらみができて意思決定や資料のレビューなどに時間がかかるんだなぁ大変なんだなぁと思いました。

でも、本当にすごい人もいるんだなというのもここで学びました。 マネジメントがきちんとできる人のもとでのチームの作業はとてもやりやすかったですし、Windows系をガチでやってる人スゲェ…というものや、ハードの世界もちょろっとのぞき見しました。振り返ってみるといい経験でした。

パッケージ製品の面倒をみる

出向も無事終わり、戻ってくると共通技術をみる部門は無くなって、その後継の部門に配属という感じになりました。 そこで待ち受けてたのはExcel方眼紙とのにらめっこ。

ちょっと、ここでやる気がマジでなくなって転職を考えたりもしましたが踏みとどまりました。

今と同じようなお仕事が始まる

その後、チーム移動をしてもらってドローンを見たり、UnityしたりAzureしたりして今に至ります。

ドローンは、ARDroneを使ってカメラ画像から地面に貼り付けた色付きガムテープを認識してその上を移動して端っこまで行くと折り返すというのを作ったりしてました。 100万円以上する馬鹿でかいディスプレイの前でやったのが怖かったです。緊急ホバリングボタンを割と押しまくってことなきを得た感じではありました。

最後の我儘

人権がない開発環境(メモリ8GB + HDD)でお仕事してたのですが、その開発環境のリース期限が切れるということで、どんなマシンがいい?と聞かれた時に駄目もとでSurface Bookがいいって言ったのですが、リースの係りの人がめっちゃ頑張ってくれて1月31日に納品されてしまいました。

普通は富士通製のしかダメなんだけどね…本当に頑張ってくれてありがとうございましたという感想しか出て来ません。

納品されたときには辞めるということを伝えていたので上司のもとに行ってしまいました。

PCのリースの切り替えと転職活動は丁度平行で進んでいて、落ちた場合に満足できる環境で仕事したいと思って言って見た我儘でしたが、本当に実現してしまうとは思ってませんでした。結果は転職してしまうことになってしまいました。

大きめのSIerのいいところ

何と言っても新入社員研修がちゃんとあるというのがいいですね。半年間。そのあとも仮配属という形をとっていて本配属まで色々な経験を積ませてもらえます。いきなり配属されると何十年も1つの部署しか知らないっていう人も多くなるので若いうちに色々経験させておこうという試みみたいです。

部署によると思いますが、私の場合は色々な経験を積ませてもらいました。 プロジェクト支援から、社内FWのメンテや、技術資料の整備、プロジェクト体験諸々です。

まぁ人によっては10年間同じ分野のプロジェクトにどっぷりという人もいるので、一概には言えないですが、私の場合は割と好きなことをさせてもらえたと思っています。ここら辺は、入る会社というよりも配属と上司がどんな人かという運が大きいと思います。

あと、教育も色々揃ってたりするので、その気になればいろんな教育を受けることもできますし、富士通向けセミナーとかいうのも大きな会社さんがやってくれるので、そういうところで技術のキャッチアップをすることもできます。まぁここら辺は、一般公開されてるイベントとかセミナーに積極的に参加するのでも構わないと思うんですが、社内で開催されているということで仕事として参加しやすいというのはあるかもしれませんね。

あと、本当に色々なことを会社全体で見たらやっているので、積極的に動いていれば多分いろんなことに出会える確率は高いのではないかと思います。

大きめのSIerのダメなところ

何でしょうね。動きは遅い気がします。 企画がなかなか通らなくて、実装にしわ寄せがきたりとかそういうめんどくさいことはありますね。

Microsoft MVP

日本マイクロソフトで働くことになるということで、Microsoft MVPも卒業することになります。(社員はMVPになれないので) Microsoft MVPも6年やってきてて、そろそろベテランとは行かないまでも、中堅どころなのかな?と思うようになってきてたので、丁度いい引き際なのかもしれません。

Microsoft MVPは、過去1年間のコミュニティ活動などを申請して、それを評価してもらって受かると1年間Microsoft MVPを名乗っていいという表彰制度です。あくまで過去1年間の活動に対する評価なので、MVPになったからと言って何か責任が発生したりするわけではありません。

当然、更新しようと思ったら、7月に申請して更新をしないといけないので、それなりのコミュニティ活動などをしないといけないというのはあります。

Microsoft MVPになって良かったのは、本を書く機会に恵まれたというところでしょうか。id:ch3cooh393 先生に、Windows 8のストアアプリの本を書かないかと誘われた時はうれしかったというのを覚えています。Windows store appの本の中では割と売れた本っぽいので満足満足。

https://www.amazon.co.jp/Windows8ストア-アプリ開発入門-大田-一希/dp/4798035440

あと、私は割とコミュ障なのでMVPだということで人に話しかけてもらえるのが割とありがたかったです。 そうでもないと、誰とも話さずに勉強会が終わるとかいうのもザラなので…。

Global Summit

Microsoft MVPの数ある特典の中で一番でかいのがこれです。

1年に1度、マイクロソフト本社でNDAセッションを3日間ぶっ通しで聴ける貴重な機会です。 まぁ全部英語なので、英語できない私にとっては80%くらい情報は素通りしてしまうのですが…。 英語できるようにならないとなぁ。

ちなみに、NDAなもんでMicrosoft MVPがGlobal Summitに行くとNDAじゃないご飯とかパーティのことばかり写真をあげたりツイートしたりするので、アメリカにパーティしに行ってるように見えるのは仕様です。

日本マイクロソフト

ということで、日本マイクロソフトで働くことになりました。 プレミアムフィールドエンジニアというところで働くことになります。 プレミアムサポートのお客様相手のお仕事になるらしいので、私を引っ張り出そうとするとプレミアムサポートを結んで、営業にお願いすればいいのかしら? よくわかんないですね。

まぁ中でいろんなことやって行くことになると思うので楽しみです。

最後に

今までお仕事一緒にしてくれた人達からは、学ぶことがたくさんあり未熟な大学院卒業したての新社会人を、ここまで育ててくれたことに感謝でいっぱいです。 これで、途切れることなく、何かしらで絡むことができたらいいなぁと思っています。

これからも、日々学ぶこと、そしてそれをアウトプットすることを目標に頑張って行きたいと思います。

ということで私の退職エントリはこれでおしまい。最後まで見てくれてありがとうございました!

ReactiveProperty v3.5.0をリリースしました

ReactiveProperty

IFilteredReadOnlyObservableCollectionのフィルタ条件をリフレッシュするRefreshメソッドを追加しました。 これで、フィルター条件を途中で変えることができます。

WPFでは無事動いてるのですがUWPとXamarinがちゃんと動くか未知です。というのもRefreshしたあとに要素がある状態というのを許してるかどうかというのがあります。

www.nuget.org

Xamarin.FormsでBotFrameworkのDirectLineを試す

Xamarin Bot

自分用メモです。(雑です)

PCLを辞めます。 .NET Standardにプロジェクトを変換します。

以下をプロジェクトに追加する。

  • Micrsoft.Bot.Connector.DirectrLine
  • Microsoft.Rest.ClientRuntime

こんな感じに書けば動いた!とりあえず

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="PrismUnityApp4.Views.MainPage"
             Title="MainPage">
  <StackLayout HorizontalOptions="Center" VerticalOptions="Center">
    <Button Text="Send"
            Command="{Binding SendCommand}" />
    <Button Text="NewConversation"
            Command="{Binding NewConversationCommand}" />
    <Label Text="{Binding Message}" />
  </StackLayout>
</ContentPage>

C#

using Microsoft.Bot.Connector.DirectLine;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Linq;

namespace PrismUnityApp4.ViewModels
{
    public class MainPageViewModel : BindableBase, INavigationAware
    {
        private static readonly string Secret = "DirectLine の シークレット";
        private static readonly string Id = "okazuki";

        private Conversation Conversation { get; set; }

        public DelegateCommand SendCommand { get; }

        public DelegateCommand NewConversationCommand { get; }

        private string message;

        public string Message
        {
            get { return this.message; }
            set { this.SetProperty(ref this.message, value); }
        }

        public MainPageViewModel()
        {
            this.SendCommand = new DelegateCommand(Send);
            this.NewConversationCommand = new DelegateCommand(() => this.Conversation = null);
        }

        private async void Send()
        {
            var client = new DirectLineClient(Secret);
            if (this.Conversation == null)
            {
                this.Conversation = await client.Conversations.StartConversationAsync();
            }

            var activity = Activity.CreateMessageActivity() as Activity;
            activity.From = new ChannelAccount { Id = Id };
            activity.Text = "Hello world";
            var response = await client.Conversations.PostActivityAsync(this.Conversation.ConversationId, activity);
            var activities = await client.Conversations.GetActivitiesAsync(this.Conversation.ConversationId);
            var result = activities.Activities.FirstOrDefault(x => x.ReplyToId == response.Id);

            this.Message = result?.Text;
        }

        public void OnNavigatedFrom(NavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(NavigationParameters parameters)
        {
        }
    }
}

ReactivePropertyでXAMLで.Valueのつけ忘れを教えてくれるReSharperプラグイン

ReactiveProperty

ガチでありがたいことに、よく頂く要望に対するプラグインを作っていただけました。 残念ながら私は、R#先生を使ってないので試せないですがR#を使ってる方はぜひ試してみてください。

resharper-plugins.jetbrains.com

WPFでWindowが閉じられたときにViewModelの後始末メソッドを呼ぶ

WPF XAML

そういう動きをするビヘイビアを作ればOKです。こんな感じで。

public class ViewModelCleanupBehavior : Behavior<Window>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.Closed += this.WindowClosed;
    }

    private void WindowClosed(object sender, EventArgs e)
    {
        (this.AssociatedObject.DataContext as IDisposable)?.Dispose();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.Closed -= this.WindowClosed;
    }
}

使い方はこんな感じ。

<Window x:Class="CloseAndDisposeSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CloseAndDisposeSample"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <i:Interaction.Behaviors>
        <local:ViewModelCleanupBehavior />
    </i:Interaction.Behaviors>
    <Grid>
    </Grid>
</Window>

これでMainWindowViewModelがIDpsopsableを実装していれば、Windowが閉じられたときにDisposeメソッドが呼び出されます。

めでたしめでたし。

Xamrin.FormsでBLEのアドバタイズパケットを拾おう(要はビーコン)

Xamarin

ということで、Xamarin.FormsでBLEやってみようと思います。 スキャンして、近くのパケット拾って来るのがゴールくらいにしておきましょう。

BLEを使おうとすると、ネイティブのコードを書かないといけないのですが、幸いにもプラグインのリストにBluetooth LEの文字があります。

github.com

こいつですね。

github.com

www.nuget.org

ということで、Acr.BleパッケージをXamarin.Formsのプロジェクトに追加します。

このAcr.BleですがReactive Extensionsに依存しています。なんてこったいいじゃないですか。 対応Rxのバージョンは2.5なので、Xamarin.Formsでも安心して使えます(最新のRxは.NET Standardじゃないと入らない雰囲気)

Androidのプロジェクトで以下のパーミッションを追加します。

  • Bluetooth
  • BluetoothAdmin
  • AccessCoarseLocation

iOSはplistにこれを追加しておけばいいみたいです。

<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>なんかメッセージ</string>

今回は手抜きで画面には出さずにDebug.WriteLineで表示させるだけにします。Pageに以下のようなコードを追加します。

using System;
using System.Diagnostics;
using System.Reactive.Linq;
using Acr.Ble;
using Xamarin.Forms;

namespace BleDemo
{
    public partial class BleDemoPage : ContentPage
    {
        public BleDemoPage()
        {
            InitializeComponent();

            BleAdapter.Current.Scan().Subscribe(result =>
            {
                Debug.WriteLine($"{result.Device.Name}:{result.Device.Uuid}:{result.Rssi}");
            });
        }
    }
}

これだけ。

これで実行すると以下のような結果が得られます。ちなみにBluetoothをOFFにしてるとScanメソッドがnullを返すみたいなので要注意。

SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-60
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-58
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-57
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-58
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-60
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-61
SensorTag:00000000-0000-0000-0000-b4994c6430c4:-59

いい感じなのかな。

Xamarin.Formsでグラフを描こう(OxyPlot)

Xamarin

WPFでグラフを描けるライブラリを探してたらOxyPlotというのを見つけました。 見つけたと思ったら、こいつXamarin.Formsでもできるぞ!?ということで試して見ました。

NuGetの追加

以下のパッケージを追加します。

  • OxyPlot.Xamarin.Forms

初期化

以下のコードをXamarin.Forms.Forms.Init()の後に追加します。

PlotViewRenderer.Init();

画面構築

画面にPlotView部品を置きます。そしてModelプロパティをバインドします。

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:OxyApp"
    xmlns:oxy="clr-namespace:OxyPlot.Xamarin.Forms;assembly=OxyPlot.Xamarin.Forms"
    x:Class="OxyApp.OxyAppPage">
    <ContentPage.BindingContext>
        <local:OxyAppPageViewModel />
    </ContentPage.BindingContext>
    <oxy:PlotView Model="{Binding Model}" />
</ContentPage>

ViewModelの構築

ViewModelでグラフのモデルを構築します。

using System;
using OxyPlot;
using OxyPlot.Series;

namespace OxyApp
{
    public class OxyAppPageViewModel
    {
        public PlotModel Model { get; }

        public OxyAppPageViewModel()
        {
            this.Model = new PlotModel { Title = "Hello OxyPlot" };
            this.Model.Series.Add(new LineSeries
            {
                Points =
                {
                    new DataPoint(0, 10),
                    new DataPoint(1, 20),
                    new DataPoint(2, 15),
                    new DataPoint(3, 40),
                }
            });
        }
    }
}

Seriesにグラフの種類を表すSeries(今回の場合は折れ線グラフ)を追加していく形になります。DataPointをPointsに追加することで折れ線のデータを指定できます。

実行して動作確認

こんな感じで表示されます。

f:id:okazuki:20170116083107p:plain

感想

パッと触った感じ、なかなかいいんじゃないんでしょうか?? ライセンスもMITで扱いやすそう。

2016年に最も読まれた記事 TOP10 世間はDataTableと戦っている

Other

2017年も始まってしばらく経ったので2016年の振り返りをして見たいと思います。 ということで、2016年に最も読まれた記事TOP10でも見て見たいと思います。

1位

blog.okazuki.jp

あっはい。

世間は、まだDataTable全盛期なんでしょうか。2009年に書いてる記事がNo1でした。

2位

blog.okazuki.jp

WPF!!

DataTableと比べて大分進化した気がします。2014年の記事ですね。 コレクションをデータバインドするのは、基本ですので是非抑えたいところ。

3位

blog.okazuki.jp

スマホでListView的な表記が流行ってるとはいえDataGridの人気も根強いみたいです。 そういえば、エクセルソフトさんでDataGridのセッションしたりしたなぁ

4位

blog.okazuki.jp

小ネタですね。 まぁヒープに無慈悲にインスタンス作りまくるので、あまり大きなサイズのデータではやりたくないところですが、知りたいことって多いですよね。

5位

blog.okazuki.jp

Excelを出力したいというネタも根強いのでしょう。 何故かNPOIの公式サイトから、Japanese Documentationとしてリンクが貼られてるこのブログ記事が5位にランクインしました。

6位

blog.okazuki.jp

これは何ででしょうね? スクロールが上手くいかないことが多いんでしょうか。

7位

blog.okazuki.jp

WPFで複雑なレイアウトを組むならこのGridですよね。 ということで、こいつが7位にランクインしました。

8位

blog.okazuki.jp

ComboBoxも地味に使うコントロール。WPFではテンプレート使えばかなりリッチな見た目できますよね。

9位

blog.okazuki.jp

多分、Windows Formsから来た人がつまづくであろうポイントの1つですね。 これは重要なので抑えておきましょう!!

10位

blog.okazuki.jp

WPFもルーティングイベントとかあって特殊な感じですよね。 この挙動を知ってるか知らないかで細かな動きの制御ができるかどうかとかが関わって来たりします。

まとめ

来年はDataTableの記事を超えるものを書きたいな。

Microsoft Azure ServiceFabricで複数のサービスで設定値を共通化したい

Azure

同じDBに繋ぐときとか一か所で設定を終えたいですよね。 ということで手順を備忘録的に残しておこうと思います。基本的には以下に書いてあることです。

Service Fabric での複数の環境の管理 | Microsoft Docs

Step1

サービスのプロジェクト/PackageRoot/COnfig/Settings.xmlに設定値を書く。これは設定を共通化したいプロジェクトが2個あったら2個ともにやります。

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <!-- これは StateManager のレプリケーターにより使用されます。-->
  <Section Name="ReplicatorConfig">
    <Parameter Name="ReplicatorEndpoint" Value="ReplicatorEndpoint" />
  </Section>
  <!-- これは StateManager のレプリケーション トラフィックをセキュリティで保護するために使用されます。-->
  <Section Name="ReplicatorSecurityConfig" />

  <!-- ここで、カスタム構成セクションとパラメーターを追加します。-->
  <!--
  <Section Name="MyConfigSection">
    <Parameter Name="MyParameter" Value="Value1" />
  </Section>
  -->

  <!-- これを追加 -->
  <Section Name="UserDatabase">
    <Parameter Name="ConnectionString" Value="" />
  </Section>
</Settings>

Valueにはなんか書いてもかまいませんが、どうせ後で上書きされるので適当な値を突っ込んでおきましょう。

Step2

アプリケーションのプロジェクトのApplicationPackageRoot/ApplicationManifest.xmlのServiceManifestImportのConfigOverridesで先ほどの設定をオーバーライドする定義を追加します。これも2サービスあったら2つぶんやります。

Valueのところでかっこで囲っているのがパラメータ名になります。

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
  <ConfigOverrides>
    <!-- こんな感じ -->
    <ConfigOverride Name="Config">
      <Settings>
        <Section Name="UserDatabase">
          <Parameter Name="ConnectionString" Value="[ConnectionString]" />
        </Section>
      </Settings>
    </ConfigOverride>
  </ConfigOverrides>
  <!-- ServicePackage から ServiceManifest をインポートします。ServiceManifestName と ServiceManifestVersion は、
     ServiceManifest.xml ファイルで定義されている ServiceManifest 要素の [Name] 属性と [Version] 属性と 
     一致しなければなりません。-->
</ServiceManifestImport>

そして、同じファイルのParametersタグに先ほど追加したかっこで囲ったパラメータ名のパラメータを追加します。

<Parameters>
  <Parameter Name="Stateful1_MinReplicaSetSize" DefaultValue="3" />
  <Parameter Name="Stateful1_PartitionCount" DefaultValue="1" />
  <Parameter Name="Stateful1_TargetReplicaSetSize" DefaultValue="3" />
  <Parameter Name="Stateless1_InstanceCount" DefaultValue="-1" />
  <!-- これを追加 -->
  <Parameter Name="ConnectionString" DefaultValue="DefaultConnectionString" />
</Parameters>

Step3

アプリケーションのプロジェクトのAplicationParametersフォルダの下にある構成単位のxmlファイルの中身を構成に合わせて設定します。 Local.Node1.xmlやLocal.Node5.xmlの場合はローカルDBの接続文字列とか、Cloud.xmlはSQL Databaseとかいった感じです。

こんな風になります。

<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/Application1" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Stateful1_PartitionCount" Value="1" />
    <Parameter Name="Stateful1_MinReplicaSetSize" Value="1" />
    <Parameter Name="Stateful1_TargetReplicaSetSize" Value="1" />
    <Parameter Name="Stateless1_InstanceCount" Value="1" />
    <!-- これを追加 -->
    <Parameter Name="ConnectionString" Value="Node1ConnectionString" />
  </Parameters>
</Application>

Step4

定義は完了です。あとはコードからの参照方法ですが以下のようなコードで出来ます。

this.Context
  .CodePackageActivationContext
  .GetConfigurationPackageObject("Config")
  .Settings
  .Sections["UserDatabase"]
  .Parameters["ConnectionString"]
  .Value

長いですね。記述場所はStatefulやStatelesの中になります。Contextにアクセスできれば何処で書いてもOKです。