﻿<?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>Mon, 12 Sep 2011 16:17:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>RE: BUILD での注目点</title>
		<link>http://hidori.jp/blog/2011/09/13/359</link>
		<comments>http://hidori.jp/blog/2011/09/13/359#comments</comments>
		<pubDate>Mon, 12 Sep 2011 16:17:42 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[イベント]]></category>
		<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://hidori.jp/blog/2011/09/13/359</guid>
		<description><![CDATA[ネタ元: BUILD での注目点 « ++C++; // 未確認飛行 C ブログ BUILD 面白そう (^o^) 早くも、Windows 8 は Windows 7 よりも良いものになりそうな予感。 ということで、以下、Iネタ元読んでて思ったことなどなど。 ISO イメージのマウント ISO イメージのマウントは、Windows 7 時点でそれっぽい API が定義されていました。 この API は、API 引数でイメージの種類（＝.iso, .vhd など）を指定する仕様でしたが、Windows 7/Windows Server 2008 R2&#160; でちょっと試した範囲では、.iso イメージマウントに関しては期待通りの動作をしてくれませんでした。 Windows 7/Windows Server 2008 R2 時点では「API 的には整備されているけど、実際にはその背後でうごめくプロバイダが提供されていなくて、結局のところ利用不可」てことだった模様。 ちなみに、Widnows 8 での ISO イメージマウントがこの API によって可能となるのかなどは現時点では不明（だよね？） Protogon ファイルシステム [...]]]></description>
			<content:encoded><![CDATA[<p>ネタ元: <a href="http://ufcpp.wordpress.com/2011/09/10/build-%e3%81%a7%e3%81%ae%e6%b3%a8%e7%9b%ae%e7%82%b9/">BUILD での注目点 « ++C++; // 未確認飛行 C ブログ</a></p>
<p>BUILD 面白そう (^o^)</p>
<p>早くも、Windows 8 は Windows 7 よりも良いものになりそうな予感。</p>
<p>ということで、以下、Iネタ元読んでて思ったことなどなど。</p>
<h3><font style="font-weight: bold" face="ＭＳ Ｐゴシック">ISO イメージのマウント</font></h3>
<p>ISO イメージのマウントは、Windows 7 時点でそれっぽい API が定義されていました。</p>
<p>この API は、API 引数でイメージの種類（＝.iso, .vhd など）を指定する仕様でしたが、Windows 7/Windows Server 2008 R2&#160; でちょっと試した範囲では、.iso イメージマウントに関しては期待通りの動作をしてくれませんでした。</p>
<p>Windows 7/Windows Server 2008 R2 時点では「API 的には整備されているけど、実際にはその背後でうごめくプロバイダが提供されていなくて、結局のところ利用不可」てことだった模様。</p>
<p>ちなみに、Widnows 8 での ISO イメージマウントがこの API によって可能となるのかなどは現時点では不明（だよね？）</p>
<h3>Protogon ファイルシステム</h3>
<p>ファイルシステムがより多くのメタ情報を持つこと自体はいいことなんだけど、相互運用どーするかもちゃんと考えてねと。</p>
<p>かつて、WinFS のデモが盛んに行わていた時代に、演者に「マシン間でファイルをコピーしたらメタ情報は落ちちゃうの？」と何度か質問をしたことがあるけど、結局、真正面から答えてくれた人はひとりもいなかった。たまたまかもしれんけど ;-p</p>
<p>Windows 7 の「ライブラリ」は大好きな機能だけど、これも結構制約が多い（＝Linux ベースの NAS のフォルダなんかは事実上追加できなかったりする）のが難点。</p>
<p>あまり先取りしすぎないように気をつけてください。</p>
<h3>Windows Live ID と、クラウドを使った設定の同期</h3>
<p>Windows Live Mesh で一部できてるけど、これをもっと推し進める感じかな？</p>
<p>AD と共存できるといいんだけど…</p>
<h3>Trident</h3>
<p>IE のレンダリングエンジンは IE4 あたりからずーっと Trident って名前だったはず。</p>
<h3>Visual Studio 2012</h3>
<p>公式にはまだ製品名決まってないはず。</p>
<p>でも、「製品名に 2013 を冠するはずはない」と信じてるｗので、2012 年（年度？）中にどばっと、いろいろ製品が出てくるはず。</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2011/09/13/359/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[C#] LINQ to SQL の実行速度を３倍に加速するっ！</title>
		<link>http://hidori.jp/blog/2011/02/03/353</link>
		<comments>http://hidori.jp/blog/2011/02/03/353#comments</comments>
		<pubDate>Wed, 02 Feb 2011 17:40:04 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C# LINQ]]></category>

		<guid isPermaLink="false">http://hidori.jp/blog/2011/02/03/353</guid>
		<description><![CDATA[どーも最近、ダメな子扱いされがちな LINQ to SQL ですが、クエリ結果を（ほぼ）透過的にキャッシュすることで実行速度を約３倍に加速してみました。 使い方はひじょーにカンタン。 通常 var connectionString = Properties.Settings.Default.Database1ConnectionString; using (var db = new DataClasses1DataContext(connectionString)) { var array = db.Products.Where(__ =&#62; __.Price &#62; 500).OrderBy(_ =&#62; _.Price).Take(200).ToArray(); } みたいに書くところを var connectionString = Properties.Settings.Default.Database1ConnectionString; using (var connection = new Mjollnir.Data.SqlClient.SqlConnection(connectionString, new MemoryCache())) using (var db = new DataClasses1DataContext(connection)) { var array = db.Products.Where(__ =&#62; __.Price [...]]]></description>
			<content:encoded><![CDATA[<p>どーも最近、ダメな子扱いされがちな LINQ to SQL ですが、クエリ結果を（ほぼ）透過的にキャッシュすることで実行速度を約３倍に加速してみました。</p>
<p>使い方はひじょーにカンタン。</p>
<p>通常</p>
<pre class="brush:csharp">var connectionString = Properties.Settings.Default.Database1ConnectionString;

using (var db = new DataClasses1DataContext(connectionString))
{
    var array = db.Products.Where(__ =&gt; __.Price &gt; 500).OrderBy(_ =&gt; _.Price).Take(200).ToArray();
}</pre>
<p>みたいに書くところを</p>
<pre class="brush:csharp">var connectionString = Properties.Settings.Default.Database1ConnectionString;

using (var connection = new Mjollnir.Data.SqlClient.SqlConnection(connectionString, new MemoryCache()))
using (var db = new DataClasses1DataContext(connection))
{
    var array = db.Products.Where(__ =&gt; __.Price &gt; 500).OrderBy(_ =&gt; _.Price).Take(200).ToArray();
}</pre>
<p>のように、データベース接続を別クラスに差し替えるだけ。</p>
<p>実際には少しばかりの準備（＝プロジェクトに上記 SqlConnection の代替えクラスおよび SqlCommand の代替えクラス、キャッシュ実装クラスを追加）は必要だけど、クエリの記述や結果の扱いに変更を加えないで済むのがミソ。</p>
<p>これでどれくらいのパフォーマンス向上があるかとゆーと…</p>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top">Id</td>
<td valign="top">int</td>
</tr>
<tr>
<td valign="top">Name</td>
<td valign="top">nvarchar(100)</td>
</tr>
<tr>
<td valign="top">Price</td>
<td valign="top">int</td>
</tr>
</tbody>
</table>
<p>とゆー構成で１０００項目が登録されたテーブルに対して</p>
<pre class="brush:csharp">private static IEnumerable
<products   []> ExecuteQuery(DataClasses1DataContext db, int queries)
{
    var list = new List
<products   []>();

    for (int i = 0; i &lt; queries; i++)
    {
        list.Add(db.Products.Where(__ =&gt; __.Price &gt; 500).OrderBy(_ =&gt; _.Price).Take(200).ToArray());
    }

    return list;
}</pre>
<p>とゆータスク（queries = 10 に設定）を１００件連続して実行した場合の実行時間は以下のとおり。</p>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td>&#160;</td>
<td>１回目</td>
<td>2回目</td>
<td>3回目</td>
<td>4回目</td>
<td>5回目</td>
</tr>
<tr>
<td>通常の LINQ to SQL</td>
<td>5.453s</td>
<td>3.693s</td>
<td>2.811s</td>
<td>2.84s</td>
<td>2.827s</td>
</tr>
<tr>
<td>LINQ to SQL + サンプルキャッシュ実装</td>
<td>0.942s</td>
<td>0.909s</td>
<td>0.906s</td>
<td>0.909s</td>
<td>0.906s</td>
</tr>
</tbody>
</table>
<p>てなカンジ。</p>
<p>概ね３倍のパフォーマンス向上が見られるのでありました。</p>
<p>↑と同じ設定のタスクを ThreadPool を使って同時並行に実行すると</p>
<table border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td>&#160;</td>
<td>１回目</td>
<td>2回目</td>
<td>3回目</td>
<td>4回目</td>
<td>5回目</td>
</tr>
<tr>
<td>通常の LINQ to SQL</td>
<td>0.964s</td>
<td>0.972s</td>
<td>0.976s</td>
<td>1.004s</td>
<td>0.987s</td>
</tr>
<tr>
<td>LINQ to SQL + サンプルキャッシュ実装</td>
<td>0.277s</td>
<td>0.271s</td>
<td>0.27s</td>
<td>0.288s</td>
<td>0.269s</td>
</tr>
</tbody>
</table>
<p>とゆー結果。あれ？思ったほど伸びてない (^^;</p>
<p>実行時間そのものはマルチスレッド化によって短縮されているものの、「約３倍のパフォーマンス向上」てとこには変化ナシ…</p>
<p>サンプルではローカルのファイルアタッチ DB を相手にしているので、そのせいかな？</p>
<p>ネットワーク接続の DB なら、キャッシュヒットした時の利益はひとしおなので、もうちょっと差が出るハズ。</p>
<p>ところで、実は「LINQ to SQL のパフォーマンスを向上する」のであれば</p>
<ul>
<li>CompiledQuery を利用する </li>
<li>結果セットをキャッシュする </li>
</ul>
<p>のが定番コース。</p>
<p>なのに、なんでわざわざこんな風変わりなアプローチをしているのかとゆーと…</p>
<p>↑で挙げた代表的な２つの手法には</p>
<ul>
<li>クエリ実行のコードの書き換えが必要（＝透過的でない） </li>
<li>SqlDependency によるキャッシュエントリの効率的なエクスパイアを実行しづらい </li>
</ul>
<p>という短所があるから。</p>
<p>前者は（必要なら）我慢するとしても、後者はもうちょっとどーにかしたいところ。</p>
<p>で、今回採用した「LINQ to SQL の DataContext に、DbConnection.CreateCommand() で DbCommand.ExecuteReader メソッドの処理を外部に移譲する DbCommand 派生クラスインスタンスを返す DbConnection 派生クラスインスタンスを渡す（長っ）」という手法なら</p>
<ul>
<li>DataContext を new する時のコードをホンの少し書き換えるだけ </li>
<li>結果セットのキャッシュを SqlCommand 相当のクラス内で行うので、SqlDependency を容易に扱える </li>
</ul>
<p>となるワケ。（SqlDependency を使ったキャッシュ実装はまだ作ってないけど (^^;）</p>
<p>あと、LINQ to SQL のクエリ結果と違って、この層なら結果セットに含まれる値の型はごくシンプルなモノばかりなので</p>
<p><strong><font color="#ff0000" size="4">LINQ to SQL のクエリ結果を分散ストレージにキャッシュする</font></strong></p>
<p>なんてことも理論的には可能だったりする。</p>
<p>てか、実のところ、今回の投稿はそれを検討するため下地だったりなんかして (^^;</p>
<p>なお、サンプルプロジェクトは VS2010 で作ったけど、ターゲットは .NET3.5SP1 なので、ソースファイルを抜き出してプロジェクトを再構成すれば VS2008 でも動作するはず。</p>
<p><iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-f11bb9fd8e1bc5f9.office.live.com/embedicon.aspx/Downloads/SqlClientPlus-20110202.zip" frameborder="0" marginwidth="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2011/02/03/353/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PowerShell でジェネリックメソッドを呼び出す</title>
		<link>http://hidori.jp/blog/2011/01/17/9</link>
		<comments>http://hidori.jp/blog/2011/01/17/9#comments</comments>
		<pubDate>Sun, 16 Jan 2011 15:08:52 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[ジェネリック]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=9</guid>
		<description><![CDATA[PowerShell の長所の一つとして「.NET Framework との親和性が高い」ことが挙げられるわけですが、いかんせんジェネリックメソッドの呼び出しはちょとシンドイ。 というわけで、ジェネリックメソッド呼び出しのメンドクサさを隠蔽すべく Param( [Parameter(Mandatory=$True, HelpMessage=&#34;ジェネリックメソッドを公開する型を指定します。&#34;)] [ValidateNotNull()] [Type] $Type, [Parameter(Mandatory=$True, HelpMessage=&#34;ジェネリックメソッドの名前を指定します。&#34;)] [ValidateNotNullOrEmpty()] [String] $MethodName, [Parameter(Mandatory=$True, HelpMessage=&#34;ジェネリック型パラメータに与える Type 型の配列を指定します。&#34;)] [ValidateNotNullOrEmpty()] [Type[]] $GenericArgumentTypes, [Parameter(HelpMessage=&#34;ジェネリックメソッド呼び出しの対象となるオブジェクトインスタンスを指定します。&#34;)] [Object] $Object = $Null, [Parameter(HelpMessage=&#34;ジェネリックメソッド呼び出しの引数となる Object 型の配列を指定します。&#34;)] [ValidateNotNull()] [Object[]] $ArgumentList = @()) Trap { break } $MethodInfo = $Type.GetMethods() &#124; Where-Object {$_.Name -eq $MethodName} &#124; Where-Object {$_.IsGenericMethod} &#124; Where-Object {$MethodInfo.GetGenericArguments().Length -eq [...]]]></description>
			<content:encoded><![CDATA[<p>PowerShell の長所の一つとして「.NET Framework との親和性が高い」ことが挙げられるわけですが、いかんせんジェネリックメソッドの呼び出しはちょとシンドイ。</p>
<p>というわけで、ジェネリックメソッド呼び出しのメンドクサさを隠蔽すべく</p>
<pre class="brush:powershell">Param(
    [Parameter(Mandatory=$True, HelpMessage=&quot;ジェネリックメソッドを公開する型を指定します。&quot;)]
	[ValidateNotNull()]
	[Type] $Type,

    [Parameter(Mandatory=$True, HelpMessage=&quot;ジェネリックメソッドの名前を指定します。&quot;)]
	[ValidateNotNullOrEmpty()]
	[String] $MethodName,

    [Parameter(Mandatory=$True, HelpMessage=&quot;ジェネリック型パラメータに与える Type 型の配列を指定します。&quot;)]
	[ValidateNotNullOrEmpty()]
	[Type[]] $GenericArgumentTypes,

    [Parameter(HelpMessage=&quot;ジェネリックメソッド呼び出しの対象となるオブジェクトインスタンスを指定します。&quot;)]
	[Object] $Object = $Null,

	[Parameter(HelpMessage=&quot;ジェネリックメソッド呼び出しの引数となる Object 型の配列を指定します。&quot;)]
	[ValidateNotNull()]
	[Object[]] $ArgumentList = @())

Trap { break }

$MethodInfo = $Type.GetMethods() |
    Where-Object {$_.Name -eq $MethodName} |
    Where-Object {$_.IsGenericMethod} |
    Where-Object {$MethodInfo.GetGenericArguments().Length -eq $GenericArgumentTypes.Length} |
	Select-Object -First 1

$GenericMethodInfo = $MethodInfo.MakeGenericMethod($GenericArgumentTypes)

$GenericMethodInfo.Invoke($Object, $ArgumentList)</pre>
<p>なんてスクリプトを書いてみた。</p>
<p>使い方は</p>
<pre class="brush:powershell">Invoke-GenericMethod.ps1 -Type Linq.Enumerable -MethodName Repeat -GenericArgumentTypes Int32 -ArgumentList @(9,4)</pre>
<p>みたいな感じ。</p>
<p>これは、C# の</p>
<pre class="brush:csharp">Enumerable.Repeat&lt;int&gt;(9, 4);</pre>
<p>に相当。</p>
<p>ちょっと引数が多いけど、汎用的に仕上げたかったのでこんなモンでしょう。</p>
<p>必要に応じて</p>
<pre class="brush:powershell">Function EnumerableRepeat([Int32] $Element, [Int32] $Count)
{
    Invoke-GenericMethod.ps1 -Type Linq.Enumerable -MethodName Repeat  -GenericArgumentTypes Int32 -ArgumentList @(9,4)
}</pre>
<p>みたいなラッパ関数を書くってのも手。</p>
<p><iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-f11bb9fd8e1bc5f9.office.live.com/embedicon.aspx/Downloads/Invoke-GenericMethod-20110117.zip" frameborder="0" marginwidth="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2011/01/17/9/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>「RSS 配信」をしばらく休止します</title>
		<link>http://hidori.jp/blog/2010/08/15/7</link>
		<comments>http://hidori.jp/blog/2010/08/15/7#comments</comments>
		<pubDate>Sun, 15 Aug 2010 07:00:52 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[おしらせ]]></category>

		<guid isPermaLink="false">http://hidori.jp/?p=7</guid>
		<description><![CDATA[Web 移転にともない、http://hidori.jp/rss/ でサービスしている開発系掲示板の「RSS 配信」がしばらくの間、全面的に停止します。 ホスティングサーバ上で動作するように改訂が必要なので、再開にはかなり時間がかかりそうです。 # RSS のリクエスト URL は維持する方向で努力します。]]></description>
			<content:encoded><![CDATA[<p>Web 移転にともない、<a href="http://hidori.jp/rss/">http://hidori.jp/rss/</a> でサービスしている開発系掲示板の「RSS 配信」がしばらくの間、全面的に停止します。</p>
<p>ホスティングサーバ上で動作するように改訂が必要なので、再開にはかなり時間がかかりそうです。</p>
<p># RSS のリクエスト URL は維持する方向で努力します。</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/08/15/7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web サーバーを移転しました</title>
		<link>http://hidori.jp/blog/2010/08/15/1</link>
		<comments>http://hidori.jp/blog/2010/08/15/1#comments</comments>
		<pubDate>Sun, 15 Aug 2010 06:00:43 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[おしらせ]]></category>

		<guid isPermaLink="false">http://hidori.jp/blog/?p=1</guid>
		<description><![CDATA[ながらく自宅サーバーで hidori.jp ドメインの Web サーバーを運用してきましたが、データジャパンが運営するホスティングサービス ExpressWeb に移転しました。 まだ WordPress を入れただけなので、ぼちぼち整備していきたいと思います。]]></description>
			<content:encoded><![CDATA[<p>ながらく自宅サーバーで hidori.jp ドメインの Web サーバーを運用してきましたが、<a title="データジャパン" href="http://www.datajapan.co.jp/">データジャパン</a>が運営するホスティングサービス <a title="ExpressWeb" href="http://www.epw.jp">ExpressWeb</a> に移転しました。<br />
まだ WordPress を入れただけなので、ぼちぼち整備していきたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/08/15/1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文字列の中から数字だけ取り出すには？</title>
		<link>http://hidori.jp/blog/2010/06/04/331</link>
		<comments>http://hidori.jp/blog/2010/06/04/331#comments</comments>
		<pubDate>Fri, 04 Jun 2010 01:37:49 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://hiroakishibuki.wordpress.com/2010/06/04/%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e4%b8%ad%e3%81%8b%e3%82%89%e6%95%b0%e5%ad%97%e3%81%a0%e3%81%91%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%99%e3%81%ab%e3%81%af%ef%bc%9f</guid>
		<description><![CDATA[ネタ元: 文字列の中から数字だけ取り出すには？ 文字列に含まれた複数の数字列を取り出して連結。 もっと簡潔に…書けるかなぁ？ using System; using System.Linq; using System.Text.RegularExpressions; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { string text = &#34;あ1いう3え4お56789&#34;; Console.WriteLine( string.Concat(Regex.Matches(text, @&#34;\d+&#34;).Cast().Select(_ =&#62; _.Value).ToArray())); } } } 追記: 2010-06-04 Twitter でいくつかフィードバックを貰ったので、再考。 正規表現を使ってないので、この系統の方が性能的には有利なはず。 でも、char[] から string を得るのに string(char []) を使っているところが、ワンライナー的には許せないｗ using System; using System.Linq; using System.Text.RegularExpressions; namespace ConsoleApplication2 { class [...]]]></description>
			<content:encoded><![CDATA[<p>ネタ元: <a href="http://bbs.wankuma.com/index.cgi">文字列の中から数字だけ取り出すには？</a></p>
<p>文字列に含まれた複数の数字列を取り出して連結。</p>
<p>もっと簡潔に…書けるかなぁ？</p>
<pre class="brush:csharp">

using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = &quot;あ1いう3え4お56789&quot;;

            Console.WriteLine(
                string.Concat(Regex.Matches(text, @&quot;\d+&quot;).Cast<match>().Select(_ =&gt; _.Value).ToArray()));
        }
    }
}
</pre>
<p><strong>追記: 2010-06-04</strong></p>
<p>Twitter でいくつかフィードバックを貰ったので、再考。</p>
<p>正規表現を使ってないので、この系統の方が性能的には有利なはず。</p>
<p>でも、char[] から string を得るのに string(char []) を使っているところが、ワンライナー的には許せないｗ</p>
<pre class="brush:csharp">using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = &quot;あ1いう3え4お56789&quot;;

            Console.WriteLine(
                new string(text.Where(_ =&gt; char.IsDigit(_)).ToArray()));
        }
    }
}</pre>
<p><strong>さらに追記: 2010-06-04</strong></p>
<p>お題を消化するだけならコレが最強ｗ</p>
<p>^ による否定をすっかり忘れてたヨ…</p>
<p>あーんど、なんでもかんでも LINQ ろうと思ってはいけないね (^^;</p>
<pre class="brush:csharp">using System;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = &quot;あ1いう3え4お56789&quot;;

            Console.WriteLine(
                Regex.Replace(text, @&quot;[^\d]&quot;, string.Empty));
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/06/04/331/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>0 から 1000 までに含まれる &#8216;0&#8217; を数える</title>
		<link>http://hidori.jp/blog/2010/05/27/330</link>
		<comments>http://hidori.jp/blog/2010/05/27/330#comments</comments>
		<pubDate>Thu, 27 May 2010 09:16:33 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://hiroakishibuki.wordpress.com/2010/05/27/0-%e3%81%8b%e3%82%89-1000-%e3%81%be%e3%81%a7%e3%81%ab%e5%90%ab%e3%81%be%e3%82%8c%e3%82%8b-%e2%80%980%e2%80%99-%e3%82%92%e6%95%b0%e3%81%88%e3%82%8b</guid>
		<description><![CDATA[ネタ元: gist: 415551 &#8211; from http://d.hatena.ne.jp/os0x/20081115/1226770265- GitHub Sum() しない版。 足し算で「個数を求める」のではなく、「数える」という点を強調したつもり。 あと、ネストをするとラムダ式の引数の名前考えるのがめんどくさい (^^; ので、SelectMany() を使って、早い段階でフラットな IEnumerable に変換してしまっているのもミソ。 using System; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine( Enumerable.Range(0, 1001).SelectMany(_ =&#62; _.ToString()).Count(_ =&#62; _ == '0')); } } }]]></description>
			<content:encoded><![CDATA[<div id="msgcns!F11BB9FD8E1BC5F9!2495" class="bvMsg">
<p>ネタ元: <a href="http://gist.github.com/415551">gist: 415551 &#8211; from http://d.hatena.ne.jp/os0x/20081115/1226770265- GitHub</a></p>
<p>Sum() しない版。</p>
<p>足し算で「個数を求める」のではなく、「数える」という点を強調したつもり。</p>
<p>あと、ネストをするとラムダ式の引数の名前考えるのがめんどくさい (^^; ので、SelectMany() を使って、早い段階でフラットな IEnumerable に変換してしまっているのもミソ。</p>
<pre class="brush:csharp">using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(
                Enumerable.Range(0, 1001).SelectMany(_ =&gt; _.ToString()).Count(_ =&gt; _ == '0'));
        }
    }
}</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/05/27/330/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>勝手に競演</title>
		<link>http://hidori.jp/blog/2010/05/27/329</link>
		<comments>http://hidori.jp/blog/2010/05/27/329#comments</comments>
		<pubDate>Wed, 26 May 2010 15:38:50 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[技術情報]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://hiroakishibuki.wordpress.com/2010/05/27/%e5%8b%9d%e6%89%8b%e3%81%ab%e7%ab%b6%e6%bc%94</guid>
		<description><![CDATA[ネタ元: 夢の競演みたび そのままだと面白くないので、複数除外できるようにしてみた。 簡素さを優先するとこんな感じ。excludes を何度も舐めるのが美しくないけど。 result を何度も列挙するような場合、result.ToArray() すればいいよね。 1回しか回さないなら、これでおｋ。 using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { var source = new[] { new { Name = &#34;しゅうたん&#34;, Type = &#34;アメショ&#34; }, new { Name = &#34;ろり&#34;, Type = &#34;アメショ&#34; }, new { Name = &#34;みずきちゃん&#34;, Type = &#34;スコティ&#34; }, new [...]]]></description>
			<content:encoded><![CDATA[<p>ネタ元: <a href="http://blogs.wankuma.com/masaru/archive/2010/05/26/189423.aspx">夢の競演みたび</a></p>
<p>そのままだと面白くないので、複数除外できるようにしてみた。</p>
<p>簡素さを優先するとこんな感じ。excludes を何度も舐めるのが美しくないけど。</p>
<p>result を何度も列挙するような場合、result.ToArray() すればいいよね。</p>
<p>1回しか回さないなら、これでおｋ。</p>
<pre class="brush:csharp">using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var source = new[]
            {
                new { Name = &quot;しゅうたん&quot;,   Type = &quot;アメショ&quot; },
                new { Name = &quot;ろり&quot;,         Type = &quot;アメショ&quot; },
                new { Name = &quot;みずきちゃん&quot;, Type = &quot;スコティ&quot; },
                new { Name = &quot;マグさん&quot;,     Type = &quot;ほげ&quot; },
                new { Name = &quot;？&quot;,           Type = &quot;もげ&quot; },
            };

            var excludes = new[] { &quot;ほげ&quot;, &quot;もげ&quot; };

            var result = source.Where(_ =&gt; !excludes.Contains(_.Type));

            foreach (var item in result)
            {
                System.Console.Out.WriteLine(&quot;Name = {0}, Type = {1}&quot;, item.Name, item.Type);
            }
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/05/27/329/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【緩募】イベントのエレガントな発火</title>
		<link>http://hidori.jp/blog/2010/04/23/328</link>
		<comments>http://hidori.jp/blog/2010/04/23/328#comments</comments>
		<pubDate>Fri, 23 Apr 2010 14:17:21 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
		
		<guid isPermaLink="false">http://hiroakishibuki.wordpress.com/2010/04/23/%e3%80%90%e7%b7%a9%e5%8b%9f%e3%80%91%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%81%ae%e3%82%a8%e3%83%ac%e3%82%ac%e3%83%b3%e3%83%88%e3%81%aa%e7%99%ba%e7%81%ab</guid>
		<description><![CDATA[Name プロパティの変更を通知するイベントの場合、イベント発火は通常 // Name プロパティが変更されたことを通知します。public event EventHandler NameChanged; // NameChanged イベントを発火します。protected void OnNameChanged()&#123;    if (this.NameChanged != null)    &#123;        this.NameChanged(this, new EventArgs());    &#125;&#125; なんてしておいて this.OnNameChanged(); // NameChanged イベントを発火 とするのがお定まりなワケですが、この OnNameChanged() をもうちっとばかり美しく書きたいわけデス。 とりあえず // 指定されたイベントを発火します。public static void Fire(this EventHandler eventHandler, object sender)&#123;     if (eventHandler != null)     &#123;         eventHandler(sender, new System.EventArgs());     &#125;&#125; // 指定されたイベントを発火します。public static void Fire&#60;TEventArgs&#62;(this EventHandler&#60;TEventArgs&#62; [...]]]></description>
			<content:encoded><![CDATA[<div id="msgcns!F11BB9FD8E1BC5F9!2480" class="bvMsg">
<p><strong>Name</strong> プロパティの変更を通知するイベントの場合、イベント発火は通常</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>// Name プロパティが変更されたことを通知します。<br />public event EventHandler NameChanged;
<p>// NameChanged イベントを発火します。<br />protected void OnNameChanged()<br />&#123;<br />    if (this.NameChanged != null)<br />    &#123;<br />        this.NameChanged(this, new EventArgs());<br />    &#125;<br />&#125; </p>
</div>
</div>
<p>なんてしておいて</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>this.OnNameChanged(); // NameChanged イベントを発火</p>
</div>
</div>
<p>とするのがお定まりなワケですが、この <strong>OnNameChanged()</strong> をもうちっとばかり美しく書きたいわけデス。</p>
<p>とりあえず</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>// 指定されたイベントを発火します。<br />public static void Fire(this EventHandler eventHandler, object sender)<br />&#123;<br />     if (eventHandler != null)<br />     &#123;<br />         eventHandler(sender, new System.EventArgs());<br />     &#125;<br />&#125;
<p>// 指定されたイベントを発火します。<br />public static void Fire&lt;TEventArgs&gt;(this EventHandler&lt;TEventArgs&gt; eventHandler, object sender, TEventArgs eventArgs) where TEventArgs : EventArgs<br />&#123;<br />     if (eventHandler != null)<br />     &#123;<br />         eventHandler(sender, eventArgs);<br />     &#125;<br />&#125; </p>
</p>
</div>
</div>
<p>てな拡張メソッドを用意して</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>// NameChanged イベントを発火します。<br />protected void OnNameChanged()<br />&#123;<br />    this.NameChanged.Fire(this);<br />&#125;</p>
</div>
</div>
<p>なんて感じに書けるようにはしてみました。</p>
<p>これだと、<strong>sealed</strong> なクラスでは</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>public string Name<br />&#123;<br />    get &#123; return this.name; &#125;<br />    set &#123; this.name = value; this.NameChanged.Fire(this); &#125;<br />&#125;</p>
</div>
</div>
<p>てな感じで <strong>OnXXX</strong>() とオサラバすることもできて、なかなかイイ感じです。</p>
<p>んが、これだと <strong>EventHandler</strong> と <strong>EventHandler&lt;TEventArgs&gt;</strong> にしか対応出来ないところが微妙デス。</p>
<p>このままでは、例えば <strong>PropertyChanged</strong> イベントみたいなイベントデリゲートが定義済みのイベントには通用しなかったりするわけです。</p>
<p><strong>PropertyChanged</strong> イベントはマイブーム(笑）なので、特別に</p>
<div style="border-bottom:black 1px solid;border-left:black 1px solid;background-color:#f0f0f0;border-top:black 1px solid;border-right:black 1px solid;margin:8px;">
<div style="overflow:scroll;padding:8px;">
<p>// 指定されたイベントを発火します。<br />public static void Fire(this PropertyChangedEventHandler eventHandler, object sender, PropertyChangedEventArgs eventArgs)<br />&#123;<br />     if (eventHandler != null)<br />     &#123;<br />         eventHandler(sender, eventArgs);<br />     &#125;<br />&#125;</p>
</div>
</div>
<p>てのも書いちゃったけど、<strong>XXXEventHandler</strong> が登場する度に専用の Fire() を書くなんてのはやってらません ;-p</p>
<p>なんかいいアイデア無いでしょうか？</p>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/04/23/328/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XBOX360: Borderlands</title>
		<link>http://hidori.jp/blog/2010/03/17/327</link>
		<comments>http://hidori.jp/blog/2010/03/17/327#comments</comments>
		<pubDate>Wed, 17 Mar 2010 01:40:19 +0000</pubDate>
		<dc:creator>Hiroaki SHIBUKI</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[Xbox360]]></category>

		<guid isPermaLink="false">http://hiroakishibuki.wordpress.com/2010/03/17/xbox360-borderlands</guid>
		<description><![CDATA[久々に XBOX360 の新作をやってみた。 今回やってみたのはコレ。 Borderlands http://www.xbox.com/ja-JP/games/b/borderlands/  「RPG と FPS の融合」という煽り文句に期待と不安 (^^; を抱きつつ起動。 海外タイトルの日本語版ということで、もっとバタ臭い絵柄かと思ってたけど、意外とあっさりめな感じで好感触。 「あっち系」のテイストは残したまま、日本のアニメっぽい雰囲気もありつつで、ざっくり言うと海外版の「AKIRA」みたいな感じかな？ ゲームの世界観は「マッドマックス」や「北斗の拳」系の「荒野＋パンクな悪者」という組み合わせ。（＋ほんの少しサイバー？） とりあえずチュートリアル兼の１面だけやってみたけど、最初、何をどーすればいいかよく分からなかった (^^; 行き先はパートナーのロボットが教えてくれるし、コントローラの操作もヘルプがあるんだけど、「何が拾えるのか」とか「どこに出入口があるのか」なんてのが分かりにくいと感じた。日本製のヌルイ RPG とかやってる報い？？？ 確定申告も終わったことだし、しばらくやりこんでみよっと]]></description>
			<content:encoded><![CDATA[<div id="msgcns!F11BB9FD8E1BC5F9!2470" class="bvMsg">
<p>久々に XBOX360 の新作をやってみた。</p>
<p>今回やってみたのはコレ。</p>
<p>Borderlands<br />
<a title="http://www.xbox.com/ja-JP/games/b/borderlands/" href="http://www.xbox.com/ja-JP/games/b/borderlands/">http://www.xbox.com/ja-JP/games/b/borderlands/</a> </p>
<p>「RPG と FPS の融合」という煽り文句に期待と不安 (^^; を抱きつつ起動。</p>
<p>海外タイトルの日本語版ということで、もっとバタ臭い絵柄かと思ってたけど、意外とあっさりめな感じで好感触。</p>
<p>「あっち系」のテイストは残したまま、日本のアニメっぽい雰囲気もありつつで、ざっくり言うと海外版の「AKIRA」みたいな感じかな？</p>
<p>ゲームの世界観は「マッドマックス」や「北斗の拳」系の「荒野＋パンクな悪者」という組み合わせ。（＋ほんの少しサイバー？）</p>
<p>とりあえずチュートリアル兼の１面だけやってみたけど、最初、何をどーすればいいかよく分からなかった (^^;</p>
<p>行き先はパートナーのロボットが教えてくれるし、コントローラの操作もヘルプがあるんだけど、「何が拾えるのか」とか「どこに出入口があるのか」なんてのが分かりにくいと感じた。日本製のヌルイ RPG とかやってる報い？？？</p>
<p>確定申告も終わったことだし、しばらくやりこんでみよっと <img src='http://hidori.jp/wp/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hidori.jp/blog/2010/03/17/327/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

