﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HIDORI on The Web</title>
	<atom:link href="http://hidori.jp/feed" rel="self" type="application/rss+xml" />
	<link>http://hidori.jp</link>
	<description>マネージコードしか書きたくない</description>
	<lastBuildDate>Sun, 20 May 2012 14:26:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Pseudo Live SDK version 0.6.1.1 をリリースしました</title>
		<link>http://hidori.jp/blog/2012/05/20/512</link>
		<comments>http://hidori.jp/blog/2012/05/20/512#comments</comments>
		<pubDate>Sun, 20 May 2012 08:28:04 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[ダウンロード]]></category>
		<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Hotmail]]></category>
		<category><![CDATA[Pseudo Live SDK]]></category>
		<category><![CDATA[SkyDrive]]></category>
		<category><![CDATA[Windows Live ID]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=512</guid>
		<description><![CDATA[Pseudo Live SDK version 0.6.1.1 をリリースしました。 Pseudo Live SDK は、WPF や Windows.Forms, コンソールアプリケーションをサポートする Live SDK クローンです。 Live SDK の “Managed API” のサポート対象は Windows 8 の Metro スタイルアプリケーションと Windows Phone アプリケーションであり、Windows 7 やそれ以前の環境で動作する一般的なデスクトップアプリケーション（WPF や Windows.Forms, コンソールアプリケーション）はサポート対象外です。 Pseudo Live SDK は、 Windows 7 などで動作するそれら「対象外」のアプリケーションに対して、Live SDK の “Managed API” 相当の API を提供します。Pseudo Live SDK を使用すれば、オリジナルの Live SDK と同じように、アプリケーションから [...]]]></description>
			<content:encoded><![CDATA[<p>Pseudo Live SDK version 0.6.1.1 をリリースしました。</p>
<p>Pseudo Live SDK は、WPF や Windows.Forms, コンソールアプリケーションをサポートする <a href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=28195">Live SDK</a> クローンです。 </p>
<p>Live SDK の “<a href="http://msdn.microsoft.com/en-us/library/live/hh533665.aspx">Managed API</a>” のサポート対象は Windows 8 の Metro スタイルアプリケーションと Windows Phone アプリケーションであり、Windows 7 やそれ以前の環境で動作する一般的なデスクトップアプリケーション（WPF や Windows.Forms, コンソールアプリケーション）はサポート対象外です。</p>
<p>Pseudo Live SDK は、 Windows 7 などで動作するそれら「対象外」のアプリケーションに対して、Live SDK の “Managed API” 相当の API を提供します。Pseudo Live SDK を使用すれば、オリジナルの Live SDK と同じように、アプリケーションから SkyDrive に保存されたファイルや Hotmail のアドレス帳、カレンダーなどの情報にアクセスすることが出来ます。 </p>
<h2>主な変更点</h2>
<p>今回のリリースにおける、主な変更点は以下のとおりです。 </p>
<ul>
<li>T4 によるコード生成を導入 </li>
<li>単体テストを増強 </li>
<li>&quot;BeginGet&quot; および &quot;EndGet&quot; の使用方法を紹介する、 &quot;MeConsoleApplication2&quot; サンプルを追加 </li>
<li>LiveConnectClientAsyncResult.WaitHandle のリークを修正。@dilbert_124 さんに感謝 </li>
<li>LiveConnectItem.LiveConnectItem のバグを修正 </li>
<li>LiveOperationProgress.ProgressPercentage のバグを修正 </li>
<li>クラス名やメンバ名など、いくつかのスペルミスを修正 ;-p </li>
</ul>
<h2>ダウンロード</h2>
<p>Pseudo Live SDK は、以下よりダウンロードすることが出来ます。</p>
<ul>
<li><a href="http://PseudoLiveSDK.codeplex.com/">Codeplex (Pseudo Live SDK project home)</a>
<ul>
<li><a href="http://pseudolivesdk.codeplex.com/downloads/get/381201">ソースコード（クラスライブラリ＋単体テスト＋サンプル）</a> </li>
<li><a href="http://pseudolivesdk.codeplex.com/downloads/get/381202">バイナリ（クラスライブラリのアセンブリ＋サンプルの実行ファイル）</a> </li>
<li><a href="http://pseudolivesdk.codeplex.com/downloads/get/381203">NuGet パッケージ</a> </li>
</ul>
</li>
<li><a href="http://nuget.org/packages/PseudoLiveSDK">NuGet Gallary (NuGet パッケージのみ)</a> </li>
</ul>
<h2>インストール</h2>
<p>あなたのプロジェクトで Pseudo Live SDK を利用するためには、以下を手順を実行します。</p>
<ul>
<li>PseudoLiveSDK-0.6.1.1-bin.zip をダウンロード </li>
<li>上記ファイルを解凍して、Mjollnir.Live.dll を取り出す </li>
<li>Mjollnir.Live.dll を、あなたのプロジェクトの「参照設定」に追加する </li>
</ul>
<p>NuGet が利用可能なら、Pseudo Live SDK のインストールはもっとずっと簡単です。</p>
<p>NuGet Package Console で以下のコマンドを実行すると、プロジェクトに Pseudo Live SDK が追加されます。</p>
<pre class="brush:powershell">Install-Package PseudoLiveSDK</pre>
<p>あるいは、NuGet Package Manager が導入済みなら、”NuGet official package source” から “Pseudo Live SDK” を検索して、インストールを行なってください。</p>
<h2>動作環境</h2>
<p>Pseudo Live SDK は、以下の環境で動作することを願って作成されています。</p>
<ul>
<li>Windows XP SP3 以上, Windows 7, Windows 8 Consumer Preview </li>
<li>.NET Framework 3.5 SP1, .NET Framrwork 4.0 (Client Profile は対象外） </li>
<li>WPF, Windows.Forms, コンソールアプリケーション </li>
</ul>
<h2>技術情報</h2>
<p>以下より、Live SDK 関連の技術情報を参照することが出来ます。 </p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/live/hh533665.aspx">Managed API</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/live/hh243648">REST reference</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/20/512/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pseudo Live SDK version 0.6.0.1 をリリースしました</title>
		<link>http://hidori.jp/blog/2012/05/17/492</link>
		<comments>http://hidori.jp/blog/2012/05/17/492#comments</comments>
		<pubDate>Wed, 16 May 2012 15:23:12 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[ダウンロード]]></category>
		<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Hotmail]]></category>
		<category><![CDATA[Pseudo Live SDK]]></category>
		<category><![CDATA[SkyDrive]]></category>
		<category><![CDATA[Windows Live ID]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=492</guid>
		<description><![CDATA[Pseudo Live SDK version 0.6.0.1 をリリースしました。 Pseudo Live SDK は、WPF, Windows.Forms および Console Application をサポートする Live SDK クローンです。 オリジナルの Live SDK は WPF, Windows.Forms および Console Application のサポートを含んでいませんが、Pseudo Live SDK は WPF, Windows.Forms および Console Application をすべてサポートします。 Pseudo Live SDK はオリジナルの Live SDK と同じく、アプリケーションへの Windows Live ID によるシングルサインオン (SSO) の統合や、SkyDrive, Hotmail, Windows Live Messanger 内のデータにアクセスを行うための [...]]]></description>
			<content:encoded><![CDATA[<p>Pseudo Live SDK version 0.6.0.1 をリリースしました。</p>
<p>Pseudo Live SDK は、WPF, Windows.Forms および Console Application をサポートする <a href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=28195">Live SDK</a> クローンです。</p>
<p>オリジナルの Live SDK は WPF, Windows.Forms および Console Application のサポートを含んでいませんが、Pseudo Live SDK は WPF, Windows.Forms および Console Application をすべてサポートします。</p>
<p>Pseudo Live SDK はオリジナルの Live SDK と同じく、アプリケーションへの Windows Live ID によるシングルサインオン (SSO) の統合や、SkyDrive, Hotmail, Windows Live Messanger 内のデータにアクセスを行うための API を提供します。</p>
<h2>主な変更点</h2>
<p>今回のリリースにおける、主な変更点は以下のとおりです。</p>
<ul>
<li>SyncronizationContext を導入、イベントハンドラ内での &quot;Invoke&quot; や &quot;BeginInvoke&quot; が不要に </li>
<li>&quot;BeginGet&quot; や &quot;EndGet&quot; など、APM (非同期プログラミングモデル) 型のメソッドを追加 </li>
<li>単体テストを増強 </li>
<li>サンプルを更新。新たに &quot;SkyDriveWindowsFormsApplication1&quot; サンプルを追加。 </li>
</ul>
<p>以下のスクリーンショットは、Pseudo Live SDK に含まれている &quot;SkyDriveWindowsFormsApplication1&quot;&#160; サンプルのものです。</p>
<p><a href="http://hidori.jp/wp/wp-content/uploads/2012/05/2012-05-16-01.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2012-05-16-01" border="0" alt="2012-05-16-01" src="http://hidori.jp/wp/wp-content/uploads/2012/05/2012-05-16-01_thumb.png" width="644" height="439" /></a></p>
<h2>ダウンロード</h2>
<p>Pseudo Live SDK は、以下よりダウンロードすることが出来ます。</p>
<ul>
<li><a href="http://PseudoLiveSDK.codeplex.com/">Pseudo Live SDK project home</a> </li>
<li><a href="https://skydrive.live.com/redir.aspx?cid=f11bb9fd8e1bc5f9&amp;resid=F11BB9FD8E1BC5F9!563&amp;parid=root">SkyDrive</a>
<ul>
<li>ソースファイル（クラスライブラリ＋単体テスト＋サンプル）          <br /><iframe height="120" src="https://skydrive.live.com/embed?cid=F11BB9FD8E1BC5F9&amp;resid=F11BB9FD8E1BC5F9%2118968&amp;authkey=AAfFKPNkMDYgod8" frameborder="0" width="98" scrolling="no"></iframe></li>
<li>バイナリ（クラスライブラリのアセンブリ＋サンプルの実行ファイル）          <br /><iframe height="120" src="https://skydrive.live.com/embed?cid=F11BB9FD8E1BC5F9&amp;resid=F11BB9FD8E1BC5F9%2118969&amp;authkey=APCDpDEJ909SPKo" frameborder="0" width="98" scrolling="no"></iframe></li>
</ul>
</li>
</ul>
<h2>概要</h2>
<p>Pseudo Live SDK には、以下のクラスが含まれています。</p>
<ul>
<li>SignInDialog は、Windows Live ID によるサインイン ダイアログを表示します。 </li>
<li>LiveConnectSession は、セッション情報をカプセルします。 </li>
<li>LiveConnectClient は、SkyDrive や otmail, Windows Live Messenger 内のデータにアクセスします。 </li>
<li>EventArgs 派生クラス、etc &#8230; </li>
</ul>
<h2>動作環境</h2>
<p>Pseudo Live SDK は、以下の環境で作動することを願って作成されています。</p>
<ul>
<li>Windows XP SP3 以上, Windows 7, Windows 8 Consumer Preview </li>
<li>.NET Framework 3.5 SP1, .NET Framrwork 4.0 (Client Profile は対象外） </li>
<li>WPF, Windows.Forms, Console Application </li>
</ul>
<h2>技術情報</h2>
<p>以下より、Live SDK 関連の技術情報を参照することが出来ます。</p>
<ul>
<li><a href="http://www.microsoft.com/en-us/download/details.aspx?id=28195">Live SDK</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/live/hh533665.aspx">Managed API</a> </li>
<li><a href="http://msdn.microsoft.com/en-us/library/live/hh243648">REST reference</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/17/492/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lock と戻り値の受け取りを簡潔に</title>
		<link>http://hidori.jp/blog/2012/05/12/468</link>
		<comments>http://hidori.jp/blog/2012/05/12/468#comments</comments>
		<pubDate>Sat, 12 May 2012 04:28:12 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=468</guid>
		<description><![CDATA[またまた、ボクのキライなパターンである var value = default(int); lock (context) { value = context.GetValue(); } みたいなコードを書かねばならない局面がやってきました。 でもそんなコードは書きたくない！書きたくないものは書きたくない！ ということで、いつも通り という小さなクラスを書きました。 これを使えば、前出のイヤンな感じのコードは var value = Lock.Invoke(context, () =&#62; { context.GetValue(); }); のような、お好みのスタイルで書くことができます。 メデタシ (^o^)]]></description>
			<content:encoded><![CDATA[<p>またまた、ボクのキライなパターンである</p>
<pre class="brush:csharp">var value = default(int);

lock (context)
{
    value = context.GetValue();
}</pre>
<p>みたいなコードを書かねばならない局面がやってきました。</p>
<p>でもそんなコードは書きたくない！書きたくないものは書きたくない！</p>
<p>ということで、いつも通り</p>
<script src="https://gist.github.com/2664114.js"></script><noscript><p><a href="https://gist.github.com/2664114">Gist</a> のソースを見る。</p></noscript>
<p>という小さなクラスを書きました。</p>
<p>これを使えば、前出のイヤンな感じのコードは</p>
<pre class="brush:csharp">var value = Lock.Invoke(context, () =&gt;
{
    context.GetValue();
});</pre>
<p>のような、お好みのスタイルで書くことができます。</p>
<p>メデタシ (^o^)</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/12/468/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pseudo Live SDK version 0.5.0.3 をリリースしました</title>
		<link>http://hidori.jp/blog/2012/05/12/464</link>
		<comments>http://hidori.jp/blog/2012/05/12/464#comments</comments>
		<pubDate>Fri, 11 May 2012 18:11:48 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[ダウンロード]]></category>
		<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Hotmail]]></category>
		<category><![CDATA[Pseudo Live SDK]]></category>
		<category><![CDATA[SkyDrive]]></category>
		<category><![CDATA[Windows Live ID]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=464</guid>
		<description><![CDATA[Pseudo Live SDK version 0.5.0.3 をリリースしました。 Pseudo Live SDK は、Windows.Forms, WPF, および Console Application をサポートする Live SDK クローンです。 オリジナルの Live SDK は Windows.Forms, WPF, および Console Application のサポートを含んでいませんが、Pseudo Live SDK は Windows.Forms, WPF, および Console Application をサポートします。 Pseudo Live SDK はオリジナルの Live SDK と同じく、アプリケーションへの Windows Live ID によるシングルサインオン (SSO) を統合や、SkyDrive, Hotmail, Windows Live Messanger 内のデータにアクセスを行うための [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://hidori.jp/blog/2012/05/06/382">Pseudo Live SDK</a> version 0.5.0.3 をリリースしました。</p>
<p>Pseudo Live SDK は、Windows.Forms, WPF, および Console Application をサポートする <a href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=28195">Live SDK</a> クローンです。</p>
<p>オリジナルの <a href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=28195">Live SDK</a> は Windows.Forms, WPF, および Console Application のサポートを含んでいませんが、Pseudo Live SDK は Windows.Forms, WPF, および Console Application をサポートします。</p>
<p>Pseudo Live SDK はオリジナルの Live SDK と同じく、アプリケーションへの Windows Live ID によるシングルサインオン (SSO) を統合や、SkyDrive, Hotmail, Windows Live Messanger 内のデータにアクセスを行うための API を提供します。</p>
<h2>ダウンロード</h2>
<p>Pseudo Live SDK は、以下よりダウンロードすることが出来ます。</p>
<p>Pseudo Live SDK project home    <br /><a title="http://psedolivesdk.codeplex.com/" href="http://PseudoLiveSDK.codeplex.com/">http://PseudoLiveSDK.codeplex.com/</a></p>
<h2>概要</h2>
<p>Pseudo Live SDK には、以下のクラスが含まれています。</p>
<ul>
<li>LiveAuthDialog は、Windows Live ID によるサインインのためのダイアログを表示します。 </li>
<li>LiveConnectSession は、Windows Live ID セッションをカプセルします。 </li>
<li>LiveConnectClient は、SkyDrive や otmail, Windows Live Messenger 内のデータにアクセスします。 </li>
<li>EventArgs 派生クラス、etc &#8230; </li>
</ul>
<h2>動作環境</h2>
<p>Pseudo Live SDK は、以下の環境で作動することを願って作成されています。</p>
<ul>
<li>Windows XP SP3 以上, Windows 7, Windows 8 Consumer Preview </li>
<li>.NET Framework 3.5 SP1, .NET Framrwork 4.0 (Client Profile は対象外） </li>
</ul>
<h2>技術情報</h2>
<p>以下より、技術情報を参照することが出来ます。</p>
<ul>
<li>Live SDK      <br /><a href="http://www.microsoft.com/en-us/download/details.aspx?id=28195">http://www.microsoft.com/en-us/download/details.aspx?id=28195</a> </li>
<li>Managed API      <br /><a href="http://msdn.microsoft.com/en-us/library/live/hh533665.aspx">http://msdn.microsoft.com/en-us/library/live/hh533665.aspx</a> </li>
<li>REST reference      <br /><a href="http://msdn.microsoft.com/en-us/library/live/hh243648">http://msdn.microsoft.com/en-us/library/live/hh243648</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/12/464/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Task の完了待ちを簡潔に</title>
		<link>http://hidori.jp/blog/2012/05/10/447</link>
		<comments>http://hidori.jp/blog/2012/05/10/447#comments</comments>
		<pubDate>Thu, 10 May 2012 05:51:01 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[T4]]></category>
		<category><![CDATA[非同期プログラミング]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=447</guid>
		<description><![CDATA[TPM な API のテストを書いていて、 var client = new LiveConnectClient(session); var task = client.Get("me"); task.Wait(); var result = task.Result; // 実行結果の評価 のようなコード＝タスクの完了待ち合わせと処理結果の取得を大量に書く羽目になりました。 塵も積もれば。。。で、こんなんいくつも書くとかイヤすぎです。 書きたいことだけを簡潔に書きたい！ ということで なんてのを書いてみました。 async, await ではあまにりに大規模なコンパイラの暗躍があるので、テストプロジェクトで使うならこれくらいスケスケの作りの方が、なにかと都合がよかったり。 で、これを使うと「Task 完了の待ち合わせと処理結果の取得」は var result = client.Get("me").Await(); // 実行結果の評価 のように書けます。 これはかなりシンプルになりますネ！ ちなみに、テストプロジェクトで使うことはなさそーですが、Task.Start() と Task.Wait() のオーバーロードをサポートするバージョンも T4 を使って書いてみました。]]></description>
			<content:encoded><![CDATA[<p>TPM な API のテストを書いていて、</p>
<pre class="brush:csharp">var client = new LiveConnectClient(session);

var task = client.Get("me");

task.Wait();

var result = task.Result;

// 実行結果の評価</pre>
<p>のようなコード＝タスクの完了待ち合わせと処理結果の取得を大量に書く羽目になりました。</p>
<p>塵も積もれば。。。で、こんなんいくつも書くとかイヤすぎです。</p>
<p>書きたいことだけを簡潔に書きたい！</p>
<p>ということで</p>
<script src="https://gist.github.com/2651087.js"></script><noscript><p><a href="https://gist.github.com/2651087">Gist</a> のソースを見る。</p></noscript>
<p>なんてのを書いてみました。</p>
<p>async, await ではあまにりに大規模なコンパイラの暗躍があるので、テストプロジェクトで使うならこれくらいスケスケの作りの方が、なにかと都合がよかったり。</p>
<p>で、これを使うと「Task 完了の待ち合わせと処理結果の取得」は</p>
<pre class="brush:csharp">var result = client.Get("me").Await();

// 実行結果の評価</pre>
<p>のように書けます。</p>
<p>これはかなりシンプルになりますネ！</p>
<p>ちなみに、テストプロジェクトで使うことはなさそーですが、Task.Start() と Task.Wait() のオーバーロードをサポートするバージョンも T4 を使って書いてみました。</p>
<script src="https://gist.github.com/2651279.js"></script><noscript><p><a href="https://gist.github.com/2651279">Gist</a> のソースを見る。</p></noscript>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/10/447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>バイト配列の組立を簡潔に</title>
		<link>http://hidori.jp/blog/2012/05/09/422</link>
		<comments>http://hidori.jp/blog/2012/05/09/422#comments</comments>
		<pubDate>Tue, 08 May 2012 16:37:47 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=422</guid>
		<description><![CDATA[「文字列の組み立てを簡潔に」と似たような感じのノリ。 たとえば var bytes = default(bytes[]); using (var stream = new MemoryStream()) { using (var writer = new StreamWriter(stream)) { writer.WriteLine("ROCK'N ROLL!"); } bytes = stream.ToArray(); } みたいのは というクラスを定義しておくと var bytes = ByteArrayFactory.Create(stream => { using (var writer = new StreamWriter(stream)) { writer.WriteLine("ROCK'N ROLL!"); } }); のように書けて、大変気持よいデス。 # 別に using がキライなわけじゃないんだけど、どうしてこーなるんだろう？ (^^;;;]]></description>
			<content:encoded><![CDATA[<p><a href="http://hidori.jp/blog/2012/05/08/403">「文字列の組み立てを簡潔に」</a>と似たような感じのノリ。</p>
<p>たとえば</p>
<pre class="brush:csharp">var bytes = default(bytes[]);

using (var stream = new MemoryStream())
{
    using (var writer = new StreamWriter(stream))
    {
        writer.WriteLine("ROCK'N ROLL!");
    }

    bytes = stream.ToArray();
}</pre>
<p>みたいのは</p>
<script src="https://gist.github.com/2650982.js"></script><noscript><p><a href="https://gist.github.com/2650982">Gist</a> のソースを見る。</p></noscript>
<p>というクラスを定義しておくと</p>
<pre class="brush:csharp">
var bytes = ByteArrayFactory.Create(stream =>
{
    using (var writer = new StreamWriter(stream))
    {
        writer.WriteLine("ROCK'N ROLL!");
    }
});
</pre>
<p>のように書けて、大変気持よいデス。</p>
<p># 別に using がキライなわけじゃないんだけど、どうしてこーなるんだろう？ (^^;;;</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/09/422/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>非同期呼び出しの待ち合わせを簡潔に</title>
		<link>http://hidori.jp/blog/2012/05/08/417</link>
		<comments>http://hidori.jp/blog/2012/05/08/417#comments</comments>
		<pubDate>Tue, 08 May 2012 14:33:22 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[非同期プログラミング]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=417</guid>
		<description><![CDATA[「非同期呼び出しを行い、すぐさまその完了を待ち合せたいたい」ことって、ありますよね？ ボクはあります。 昨夜、非同期メソッドのテストを書いていて、そういう状況になりました。 よく使うパターンは var client = new LiveConnectClient(session); using (var signal = new ManualResetEventSlim(false)) { client.GetCompleted += (s, e) =&#62; { // 完了後の処理 signal.Set(); }; client.GetAsync(address); signal.Wait(); } なわけですが、似たような記述を何個も書いていると滅入ってきます。 この局面における重点事項は「非同期呼び出しの完了を待ち合わせる」ことであって、ManulResetEventSlim のインスタンス生成とか、その Wait() とか、余分なことは極力意識したくないわけです。 書きたいことだけを、簡潔に書きたい！（ｗ そこで、以下のようなクラスを定義します。 これを使うと、「非同期呼び出しの完了を待ち合わせ」問題は &#160; var client = new LiveConnectClient(session); Syncronized.Invoke(signal =&#62; { client.GetCompleted += (s, e) =&#62; { // 完了後の処理 signal.Set(); [...]]]></description>
			<content:encoded><![CDATA[<p><strong>「非同期呼び出しを行い、すぐさまその完了を待ち合せたいたい」</strong>ことって、ありますよね？</p>
<p>ボクはあります。</p>
<p>昨夜、非同期メソッドのテストを書いていて、そういう状況になりました。</p>
<p>よく使うパターンは</p>
<pre class="brush:csharp">var client = new LiveConnectClient(session);

using (var signal = new ManualResetEventSlim(false))
{
    client.GetCompleted += (s, e) =&gt;
    {
        // 完了後の処理
        signal.Set();
    };

    client.GetAsync(address);
    signal.Wait();
}</pre>
<p>なわけですが、似たような記述を何個も書いていると滅入ってきます。</p>
<p>この局面における重点事項は「非同期呼び出しの完了を待ち合わせる」ことであって、ManulResetEventSlim のインスタンス生成とか、その Wait() とか、余分なことは極力意識したくないわけです。</p>
<p>書きたいことだけを、簡潔に書きたい！（ｗ</p>
<p>そこで、以下のようなクラスを定義します。</p>
<p><script src="https://gist.github.com/2651034.js"></script><noscript><p><a href="https://gist.github.com/2651034">Gist</a> のソースを見る。</p></noscript><br />
これを使うと、「非同期呼び出しの完了を待ち合わせ」問題は</p>
<p>&nbsp;</p>
<pre class="brush:csharp">var client = new LiveConnectClient(session);

Syncronized.Invoke(signal =&gt;
{
    client.GetCompleted += (s, e) =&gt;
    {
        // 完了後の処理
        signal.Set();
    };

    client.GetAsync(address);
});</pre>
<p>のように、ごく簡潔に記述することが出来ます。</p>
<p>これで、単調なテストの記述もいくらか低減されるとゆーものですｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/08/417/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文字列の組み立てを簡潔に</title>
		<link>http://hidori.jp/blog/2012/05/08/403</link>
		<comments>http://hidori.jp/blog/2012/05/08/403#comments</comments>
		<pubDate>Tue, 08 May 2012 07:23:46 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=403</guid>
		<description><![CDATA[BCL には、文字列を組み立てを支援する StringBuilder クラスが含まれています。 機能的にはこれで不満はありませんが、複数の文字列を並行して組み立てる場合には複数の StringBuilder クラスのインスタンスを使うことになり、それらの変数名をどうするかなどの非常に深刻な問題が発生します。 たとえば var sb1 = new StringBuilder(); sb1.Append(&#34;ほげ&#34;); sb1.Append(&#34;ほげ&#34;); var sb2 = new StringBuilder(); sb2.Append(&#34;ほげ&#34;); sb2.Append(&#34;ほげ&#34;); var head = sb1.ToString(); var tail = sb2.ToString(); のような打算的な解決はノーグッドです。 var sbHead = new StringBuilder(); sbHead.Append(&#34;ほげ&#34;); sbHead.Append(&#34;ほげ&#34;); var sbTail = new StringBuilder(); sbTail.Append(&#34;ほげ&#34;); sbTail.Append(&#34;ほげ&#34;); var head = sbHead.ToString(); var tail = sbTail.ToString(); も本質変わらずで、美しさに欠けています。 感覚的には [...]]]></description>
			<content:encoded><![CDATA[<p>BCL には、文字列を組み立てを支援する StringBuilder クラスが含まれています。</p>
<p>機能的にはこれで不満はありませんが、複数の文字列を並行して組み立てる場合には複数の StringBuilder クラスのインスタンスを使うことになり、<strong><font color="#ff0000">それらの変数名をどうするか</font></strong>などの非常に深刻な問題が発生します。</p>
<p>たとえば</p>
<pre class="brush:csharp">var sb1 = new StringBuilder();

sb1.Append(&quot;ほげ&quot;);
sb1.Append(&quot;ほげ&quot;);

var sb2 = new StringBuilder();

sb2.Append(&quot;ほげ&quot;);
sb2.Append(&quot;ほげ&quot;);

var head = sb1.ToString();
var tail = sb2.ToString();</pre>
<p>のような打算的な解決はノーグッドです。</p>
<pre class="brush:csharp">var sbHead = new StringBuilder();

sbHead.Append(&quot;ほげ&quot;);
sbHead.Append(&quot;ほげ&quot;);

var sbTail = new StringBuilder();

sbTail.Append(&quot;ほげ&quot;);
sbTail.Append(&quot;ほげ&quot;);

var head = sbHead.ToString();
var tail = sbTail.ToString();</pre>
<p>も本質変わらずで、美しさに欠けています。</p>
<p>感覚的には</p>
<pre class="brush:csharp">var head = default(string);

{
    var sb = new StringBuilder();

    sb.Append(&quot;ほげ&quot;);
    sb.Append(&quot;ほげ&quot;);

    head = sb.ToString();
}

var tail = default(string);

{
    var sb = new StringBuilder();

    sb.Append(&quot;ほげ&quot;);
    sb.Append(&quot;ほげ&quot;);

    tail = sb.ToString();
}</pre>
<p>が理想に一番近いものの、かえってコードが長くなっているのは大きなマイナスです。</p>
<p>head や tail の初期化が無駄な点も気になります。（「var を使わない」という選択は却下ｗ）</p>
<p>そもそも、この局面における最重点事項は「head, tail という２つの文字列を組み立てること」であって、StringBuilder のインスタンス生成みたいな些事はできる限り意識したくありません。</p>
<p>もっと簡潔に、書きたいことだけを書きたい！（ｗ</p>
<p>そこで、以下のようなファクトリメソッドを定義します。</p>
<script src="https://gist.github.com/2651023.js"></script><noscript><p><a href="https://gist.github.com/2651023">Gist</a> のソースを見る。</p></noscript>
<p>これを使うと、「複数の文字列の組立」問題は</p>
<pre class="brush:csharp">var head = StringFactory.Create(sb =&gt;
{
    sb.Append(&quot;ほげ&quot;);
    sb.Append(&quot;ほげ&quot;);
});

var tail = StringFactory.Create(sb =&gt;
{
    sb.Append(&quot;ほげ&quot;);
    sb.Append(&quot;ほげ&quot;);
});</pre>
<p>のように、ごく簡潔に記述することができます。</p>
<p>ヤル気倍増ですネｗ</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/08/403/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pseudo Live SDK 制作開始</title>
		<link>http://hidori.jp/blog/2012/05/06/382</link>
		<comments>http://hidori.jp/blog/2012/05/06/382#comments</comments>
		<pubDate>Sat, 05 May 2012 19:02:47 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[ダウンロード]]></category>
		<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Hotmail]]></category>
		<category><![CDATA[Pseudo Live SDK]]></category>
		<category><![CDATA[SkyDrive]]></category>
		<category><![CDATA[Windows Live ID]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=382</guid>
		<description><![CDATA[SkyDrive for Windows が公開されたことで、刺激を受けました。 「Live SDK を使えば、ユーザプログラムから SkyDrive を操作することが出来る」というのは、以前から知識としては知っていたため、早速 Live SDK をダウンロードしてみました。 んがしかし、Live SDK の中を見てびっくり。「Windows Forms のサポートが含まれていない」という衝撃の事実が発覚。 それにしても、まだ正式リリースされてもいない Windows 8 Metro Style アプリケーション向けのライブラリが含まれてるってゆーのに、歴史ある Windows Forms サポートが含まれてのはなんとも… 企業戦略だとしても、ちょっと厳しすぎな気が ;-p なんてことを言っても今更どーにもなりそーもないので、気を取り直して Windows コンソールアプリケーション Windows Forms アプリケーション そしてたぶん WPF アプリケーションでも利用可能な Live SDK 「もどき」を作ることにしました。 ライブラリ実装のお手本は、本家 Live SDK の Windows Phone 向けライブラリです。 LiveAuthClient クラスによる認証部分は、そのまま移植してもいいことなさそうなので、完全オリジナルとしました。 LiveConnectSession, LiveConnectClient クラスによる REST API へのアクセスについては、できる限りオリジナルと同じような動作を目指すこととします。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://apps.live.com/skydrive">SkyDrive for Windows</a> が公開されたことで、刺激を受けました。</p>
<p>「<a href="http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&amp;id=28195">Live SDK</a> を使えば、ユーザプログラムから SkyDrive を操作することが出来る」というのは、以前から知識としては知っていたため、早速 Live SDK をダウンロードしてみました。</p>
<p>んがしかし、Live SDK の中を見てびっくり。「Windows Forms のサポートが含まれていない」という衝撃の事実が発覚。</p>
<p>それにしても、まだ正式リリースされてもいない Windows 8 Metro Style アプリケーション向けのライブラリが含まれてるってゆーのに、歴史ある Windows Forms サポートが含まれてのはなんとも…</p>
<p>企業戦略だとしても、ちょっと厳しすぎな気が ;-p</p>
<p>なんてことを言っても今更どーにもなりそーもないので、気を取り直して</p>
<ul>
<li>Windows コンソールアプリケーション </li>
<li>Windows Forms アプリケーション </li>
</ul>
<p>そしてたぶん WPF アプリケーションでも利用可能な Live SDK 「もどき」を作ることにしました。</p>
<p>ライブラリ実装のお手本は、本家 Live SDK の Windows Phone 向けライブラリです。</p>
<p>LiveAuthClient クラスによる認証部分は、そのまま移植してもいいことなさそうなので、完全オリジナルとしました。</p>
<p>LiveConnectSession, LiveConnectClient クラスによる REST API へのアクセスについては、できる限りオリジナルと同じような動作を目指すこととします。</p>
<p>で、とりあえずなんとか</p>
<ul>
<li>LiveAuthDialog クラスによるサインイン </li>
<li>LiveConnectClient.GetAsync() メソッドによるコンテンツ取得 </li>
<li>LiveConnectClient.DownloadAsync() メソッドによるコンテンツ取得 </li>
</ul>
<p>まで出来たので、ソリューションを SkyDrive で公開します。</p>
<p><iframe height="120" src="https://skydrive.live.com/embed?cid=F11BB9FD8E1BC5F9&amp;resid=F11BB9FD8E1BC5F9%2117818&amp;authkey=AOsOMG3yrU3uriw" frameborder="0" width="98" scrolling="no"></iframe></p>
<h2>サインイン</h2>
<p>サインインには、LiveAuthDialog クラスを使用します。</p>
<p>以下は、LiveAuthDialog クラスによるサインインのサンプルコードです。</p>
<pre class="brush:csharp">var session = default(LiveConnectSession);

using (var dialog = new LiveAuthDialog())
{
    dialog.ClientId = &quot;&lt;Your Client ID&gt;&quot;;
    dialog.Scopes = new[] { &quot;wl.signin&quot; };
    dialog.RedirectUri = new Uri(&quot;http://oauth.live.com/desktop&quot;);
    dialog.Locale = &quot;ja&quot;;

    if (dialog.ShowDialog() != DialogResult.OK)
    {
        if (dialog.Error != null)
        {
            Console.WriteLine(dialog.Error.Message);
        }
        else
        {
            Console.WriteLine(&quot;操作がキャンセルされました。&quot;);
        }

        return;
    }

    session = dialog.Session;
}</pre>
<p>LiveAuthDialog クラスは、Windows Forms ダイアログの典型的な実装です。</p>
<p>インスタンス生成した後にパラメータ設定を行い、ShowDialog() メソッドでサインインダイアログの表示を行います。</p>
<p><a href="http://hidori.jp/wp/wp-content/uploads/2012/05/2012-05-06-01.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2012-05-06-01" border="0" alt="2012-05-06-01" src="http://hidori.jp/wp/wp-content/uploads/2012/05/2012-05-06-01_thumb.png" width="483" height="484" /></a></p>
<p>サインインを正常に完了すると、Session プロパティに有効な LiveConnectSession クラスのインスタンスが返ります。</p>
<p>サインインを完了する前にサインインダイアログを閉じたり、認証エラーが発生した場合などに、ShowDialog() は DialogResult.Cancel を返します。</p>
<p>認証エラーが発生した場合、Error プロパティにはエラーの詳細を示す例外オブジェクトが返ります。</p>
<h2>LiveConnectClient クラスのインスタンス生成</h2>
<p>SkyDrive に保存されたファイルなど、Windows Live のコンテンツ操作には LiveConnectClient クラスを使用します。</p>
<p>LiveConnectClient クラスは、Live Connect REST API の汎用ラッパです。LiveConnectClient クラスが公開する GetAsync(), DownloadAsync() などのメソッドを利用して、Windows Live のコンテンツ操作を行います。</p>
<p>以下は、LiveConnectSession クラスのインスタンスを使用して LiveConnectClient クラスのインスタンスを作成するサンプルコードです。</p>
<pre class="brush:csharp">var connect = new LiveConnectClient(session);</pre>
<h1>LiveConnectClient.GetAsync() によるアカウント情報の取得</h1>
<p>LiveConnectClient.GetAsync() メソッドは、SkyDrive に保存されたファイルのメタ情報の取得など、JSON 形式の応答を返す API&#160; 呼び出しに適しています 。</p>
<p>GetAsync() メソッドは非同期 API であるため、GetCompleted イベントを使用して、GetAsync() メソッドの実行完了を待ち合わせます。</p>
<p>以下は、LiveConnectClient.GetAsync() メソッドによるアカウント情報取得のサンプルコードです。</p>
<pre class="brush:csharp">var result = default(IDictionary);

using (var signal = new ManualResetEventSlim(false))
{
    connect.GetCompleted += (s, e) =&gt; { result = e.Result; signal.Set(); };
    connect.GetAsync(&quot;me&quot;);

    signal.Wait();
}

foreach (var key in result.Keys)
{
    Console.WriteLine(string.Format(&quot;{0}={1}&quot;, key, result[key]));
}</pre>
<h1>LiveConnectClient.DownloadAsync() によるアカウント情報の取得</h1>
<p>LiveConnectClient.DownloadAsync() メソッドは、SkyDrive に保存されたファイル本体など、Live Connect REST API からの応答をバイトストリームで受け取りるのに適しています。</p>
<p>DownloadAsync() メソッドは非同期 API であるため、DownloadCompleted イベントを使用して、DownloadAsync() メソッドの実行完了を待ち合わせます。</p>
<p>また、DownloadProgressChanged イベントを使用して、バイトストリームのダウンロードの進捗を知ることも可能です。</p>
<p>以下は、LiveConnectClient.DownloadAsync() メソッドによるアカウント情婦取得のサンプルコードです。</p>
<pre class="brush:csharp">var result = default(Stream);

using (var signal = new ManualResetEventSlim(false))
{
    connect.DownloadCompleted += (s, e) =&gt; { result = e.Result; signal.Set(); };
    connect.DownloadProgressChanged += (s, e) =&gt; Console.WriteLine(&quot;{0}/{1} - {2}%&quot;, e.BytesRecieved, e.TotalBytesToRecieve, e.ProgressPercentage);
    connect.DownloadAsync(&quot;me&quot;);

    signal.Wait();
}

using (var stream = new MemoryStream())
{
    result.CopyTo(stream);
    Console.WriteLine(stream.ToArray().Length);
}

result.Close();</pre>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/06/382/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dictionary&lt;TKey, TValue&gt;.ContainsKey() とかの「モヤっ」</title>
		<link>http://hidori.jp/blog/2012/05/03/364</link>
		<comments>http://hidori.jp/blog/2012/05/03/364#comments</comments>
		<pubDate>Thu, 03 May 2012 05:09:28 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=364</guid>
		<description><![CDATA[拡張メソッドを使った小ネタです。 Dictionary&#60;TKey, TValue&#62; を使っていて if (dictionary.ContainsKey(&#34;key1&#34;)) hoge.Value1 = dictionary[&#34;key1&#34;]; if (dictionary.ContainsKey(&#34;key2&#34;)) hoge.Value2 = dictionary[&#34;key2&#34;]; みたいな感じのコードを書いていて、なんとなく「モヤっ」とした気持ちになりました。 そこで public static void InvokeIfContainsKey( this IDictionary&#60;TKey, TValue&#62; source, TKey key, Action&#60;TValue&#62; action) { if (source.ContainsKey(key)) { action(source[key]); } } という拡張メソッドを定義して、前出のコードを dictionary.InvokeIfContainsKey(&#34;key1&#34;, value =&#62; hoge.Value1 = value); dictionary.InvokeIfContainsKey(&#34;key2&#34;, value =&#62; hoge.Value2 = value); のように書きかえました。 で、少しだけ「モヤっ」が解消。 # 決して記述が短くなったわけではない点に注意 (^^;;;]]></description>
			<content:encoded><![CDATA[<p>拡張メソッドを使った小ネタです。</p>
<p>Dictionary&lt;TKey, TValue&gt; を使っていて</p>
<pre class="brush:csharp">
  if (dictionary.ContainsKey(&quot;key1&quot;)) hoge.Value1 = dictionary[&quot;key1&quot;];
  if (dictionary.ContainsKey(&quot;key2&quot;)) hoge.Value2 = dictionary[&quot;key2&quot;];</pre>
<p>みたいな感じのコードを書いていて、なんとなく「モヤっ」とした気持ちになりました。</p>
<p>そこで</p>
<pre class="brush:csharp">
public static void InvokeIfContainsKey(
    this IDictionary&lt;TKey, TValue&gt; source, TKey key, Action&lt;TValue&gt; action)
{
  if (source.ContainsKey(key))
  {
    action(source[key]);
  }
}</pre>
<p>という拡張メソッドを定義して、前出のコードを</p>
<pre class="brush:csharp">
dictionary.InvokeIfContainsKey(&quot;key1&quot;, value =&gt; hoge.Value1 = value);
dictionary.InvokeIfContainsKey(&quot;key2&quot;, value =&gt; hoge.Value2 = value);</pre>
<p>のように書きかえました。</p>
<p>で、少しだけ「モヤっ」が解消。</p>
<p># 決して記述が短くなったわけではない点に注意 (^^;;;</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2012/05/03/364/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

