<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>C#たんっ！</title>
	<atom:link href="http://csharptan.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://csharptan.wordpress.com</link>
	<description>言語擬人化十二人によるサバイバルゲーム勃発！</description>
	<lastBuildDate>Mon, 30 Jan 2012 08:03:16 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='csharptan.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>C#たんっ！</title>
		<link>http://csharptan.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://csharptan.wordpress.com/osd.xml" title="C#たんっ！" />
	<atom:link rel='hub' href='http://csharptan.wordpress.com/?pushpress=hub'/>
		<item>
		<title>あとがたりっ！</title>
		<link>http://csharptan.wordpress.com/2011/12/26/%e3%81%82%e3%81%a8%e3%81%8c%e3%81%9f%e3%82%8a%e3%81%a3%ef%bc%81/</link>
		<comments>http://csharptan.wordpress.com/2011/12/26/%e3%81%82%e3%81%a8%e3%81%8c%e3%81%9f%e3%82%8a%e3%81%a3%ef%bc%81/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 01:09:11 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=175</guid>
		<description><![CDATA[25日間、画像が1枚もないってどーゆーことー？ ゴチャゴチャやかましいぞ！外野 こっちはでっかいコストかけてやってんだぞ どれだけの覚悟決めてここに書いてると思ってんだ そんな苦労も知らないで ボケナスどもぉ … 髪型の元ネタのパロディがどうしてもやりたかったのね？ あんた、完全に元ネタの2Pカラーになってるけども… はい、すみません。 いつも通り、ほんの出来心だったんです。 ていうか、24日のは何なの？なんで私が一人だって決めつけるわけ？ えっ？ えっ！？ えっ？ （くそー、VBたんまで…） でもほんと、このブログこの後どうするのー？ どうしましょう？ ノープラン？ Exactly（その通りでございます） ブログって、継続的にやらないとPV伸びなくない？ エレス コレクート（君は正解だ！！） それでも考えなし？ ええ、そんな余裕ございませんでした。 勿体ないですよね、ずっとは無理だし、単発なら原稿料もらえるところに出したいし！ ぶっちゃけるわね、あんた。 まあ、ここの使い道はまたおいおい考えます。 考えますというか、なんかまた唐突に思いついたら。 えーっと、最後に、読者の皆様に感謝の言葉を。 思いっきりガチで、容赦なく長文でしたが、お付き合いいただいてありがとうございます。 一発ネタは一旦の終了となりますが、C#たんは不滅です。始まりの魔法使いのごとく不滅です。 コンゴトモヨロシクお願いいたします！<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=175&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<table style="border-collapse:collapse;" border="0">
<col style="width:114px;" />
<col style="width:469px;" />
<tbody valign="top">
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_1.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>25日間、画像が1枚もないってどーゆーことー？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_2.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ゴチャゴチャやかましいぞ！外野
</p>
<p>こっちはでっかいコストかけてやってんだぞ
</p>
<p>どれだけの覚悟決めてここに書いてると思ってんだ
</p>
<p>そんな苦労も知らないで
</p>
<p>ボケナスどもぉ</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_3.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>…
</p>
<p>髪型の元ネタのパロディがどうしてもやりたかったのね？
</p>
<p>あんた、完全に元ネタの2Pカラーになってるけども…</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_4.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>はい、すみません。
</p>
<p>いつも通り、ほんの出来心だったんです。</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_5.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ていうか、24日のは何なの？なんで私が一人だって決めつけるわけ？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_6.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>えっ？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_7.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>えっ！？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_8.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>えっ？
</p>
<p>（くそー、VBたんまで…）</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_9.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>でもほんと、このブログこの後どうするのー？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_10.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>どうしましょう？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_11.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ノープラン？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_12.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>Exactly（その通りでございます）</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_13.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ブログって、継続的にやらないとPV伸びなくない？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_14.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>エレス コレクート（君は正解だ！！）</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_15.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>それでも考えなし？</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_16.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ええ、そんな余裕ございませんでした。
</p>
<p>勿体ないですよね、ずっとは無理だし、単発なら原稿料もらえるところに出したいし！</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_17.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>ぶっちゃけるわね、あんた。</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_18.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>まあ、ここの使い道はまたおいおい考えます。
</p>
<p>考えますというか、なんかまた唐突に思いついたら。</p>
</td>
</tr>
<tr>
<td style="padding-left:7px;padding-right:7px;">
<p><img src="http://csharptan.files.wordpress.com/2011/12/122611_0108_19.png?w=490" alt="" /></p>
</td>
<td style="padding-left:7px;padding-right:7px;">
<p>えーっと、最後に、読者の皆様に感謝の言葉を。
</p>
<p>思いっきりガチで、容赦なく長文でしたが、お付き合いいただいてありがとうございます。
</p>
<p>一発ネタは一旦の終了となりますが、C#たんは不滅です。始まりの魔法使いのごとく不滅です。
</p>
<p>コンゴトモヨロシクお願いいたします！</p>
</td>
</tr>
</tbody>
</table>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/175/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/175/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/175/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=175&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/26/%e3%81%82%e3%81%a8%e3%81%8c%e3%81%9f%e3%82%8a%e3%81%a3%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_2.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_3.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_4.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_5.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_6.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_7.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_8.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_9.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_10.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_11.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_12.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_13.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_14.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_15.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_16.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_17.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_18.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122611_0108_19.png" medium="image" />
	</item>
		<item>
		<title>C#っ！ to the future</title>
		<link>http://csharptan.wordpress.com/2011/12/25/c%e3%81%a3%ef%bc%81-to-the-future/</link>
		<comments>http://csharptan.wordpress.com/2011/12/25/c%e3%81%a3%ef%bc%81-to-the-future/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 00:59:42 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=153</guid>
		<description><![CDATA[ネタ切れネタ切れって 言いたい事言いやがって ネタなんて最初からねーんだよ！ ブロガーが消費してんのは 寿命だけだオラ！ （意訳: ネタ要素薄くてごめんなさい。）   最後に、この無謀な25日間の内容から、要点を抜き出しましょう。将来の方向性の示唆にもなると思います。 上昇傾向 初日に、C#の歴史を振り返ってみました。 1日目: C#っ！   最初は政治的（SUNとの利害関係） 、経済的（DelphiのアーキテクトであるAnders Hejlsbergがマイクロソフトに引き抜かれてる）な理由で始まったC#ですが、3.0、4.0とバージョン アップを重ね、非常に素晴らしい言語に育ちました。まだまだ伸びるでしょう。 こんな話もあります: C#がC++に迫る &#8211; 12月プログラミング言語人気 1企業の調査なので、まあ、話半分にとらえるべきかもしれませんが、C#はずっと伸び続けています。 昔だったらJavaなどが採用されそうだったような状況で、C#が採用される場面も出てきています。Unity、PlayStation Suiteと、ゲーム向け開発プラットフォームでの採用が続きました。 6日目: ゲームとC# ちなみに、日本においても、C#関連のホームページのアクセス数や、書籍の売り上げ、伸びてきているようです。 データ処理と非同期 C# 3.0以降の進化の方向性は、データ処理と非同期処理に焦点が当たっています（C# 2.0までは、いわば基礎固めと言った感じで、既存言語と比べてそれほど目新しいことはしていません）。 9日目: 2種類のLINQ 10日目: 非同期I/O待ち   非同期処理は、これからもまだまだ進歩していく分野でしょう。データ処理においても、ネットワーク越しに別のサーバーからデータを取ってくることが多く、非同期I/Oが重要です。 広い範囲の視野持ってほしい この25日間で、非常に広い範囲の話をしてきました。.NET自身が広い範囲をカバーしているというのもあります。 25日目: .NET関連技術   内部に踏み込んだ話もいくつかしました。 7日目: 値型 8日目: ジェネリック 13日目: コレクションの内部実装 17日目: .NETの中間言語   設計パターンみたいな話もしました。 14日目: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=153&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>ネタ切れネタ切れって 言いたい事言いやがって ネタなんて最初からねーんだよ！ ブロガーが消費してんのは 寿命だけだオラ！
</p>
<p>（意訳: ネタ要素薄くてごめんなさい。）
</p>
<p>
 </p>
<p>最後に、この無謀な25日間の内容から、要点を抜き出しましょう。将来の方向性の示唆にもなると思います。
</p>
<h2>上昇傾向<br />
</h2>
<p>初日に、C#の歴史を振り返ってみました。
</p>
<ul style="margin-left:39pt;">
<li>1日目: <a href="http://csharptan.wordpress.com/2011/12/01/">C#っ！</a>
		</li>
</ul>
<p>
 </p>
<p>最初は政治的（SUNとの利害関係） 、経済的（DelphiのアーキテクトであるAnders Hejlsbergがマイクロソフトに引き抜かれてる）な理由で始まったC#ですが、3.0、4.0とバージョン アップを重ね、非常に素晴らしい言語に育ちました。まだまだ伸びるでしょう。
</p>
<p>こんな話もあります:
</p>
<ul style="margin-left:39pt;">
<li><a href="http://news.mynavi.jp/news/2011/12/15/026/index.html">C#がC++に迫る &#8211; 12月プログラミング言語人気</a>
		</li>
</ul>
<p>1企業の調査なので、まあ、話半分にとらえるべきかもしれませんが、C#はずっと伸び続けています。
</p>
<p>昔だったらJavaなどが採用されそうだったような状況で、C#が採用される場面も出てきています。Unity、PlayStation Suiteと、ゲーム向け開発プラットフォームでの採用が続きました。
</p>
<ul style="margin-left:39pt;">
<li>6日目: <a href="http://csharptan.wordpress.com/2011/12/06/">ゲームとC#</a>
		</li>
</ul>
<p>ちなみに、日本においても、C#関連のホームページのアクセス数や、書籍の売り上げ、伸びてきているようです。
</p>
<h2>データ処理と非同期<br />
</h2>
<p>C# 3.0以降の進化の方向性は、データ処理と非同期処理に焦点が当たっています（C# 2.0までは、いわば基礎固めと言った感じで、既存言語と比べてそれほど目新しいことはしていません）。
</p>
<ul style="margin-left:39pt;">
<li>9日目: <a href="http://csharptan.wordpress.com/2011/12/09/">2種類のLINQ</a>
		</li>
<li>10日目: <a href="http://csharptan.wordpress.com/2011/12/10/">非同期I/O待ち</a>
		</li>
</ul>
<p>
 </p>
<p>非同期処理は、これからもまだまだ進歩していく分野でしょう。データ処理においても、ネットワーク越しに別のサーバーからデータを取ってくることが多く、非同期I/Oが重要です。
</p>
<h2>広い範囲の視野持ってほしい<br />
</h2>
<p>この25日間で、非常に広い範囲の話をしてきました。.NET自身が広い範囲をカバーしているというのもあります。
</p>
<ul style="margin-left:39pt;">
<li>25日目: <a href="http://csharptan.wordpress.com/2011/12/25/">.NET関連技術</a>
		</li>
</ul>
<p>
 </p>
<p>内部に踏み込んだ話もいくつかしました。
</p>
<ul style="margin-left:39pt;">
<li>7日目: <a href="http://csharptan.wordpress.com/2011/12/07/">値型</a>
		</li>
<li>8日目: <a href="http://csharptan.wordpress.com/2011/12/08/">ジェネリック</a>
		</li>
<li>13日目: <a href="http://csharptan.wordpress.com/2011/12/13/">コレクションの内部実装</a>
		</li>
<li>17日目: <a href="http://csharptan.wordpress.com/2011/12/17/">.NETの中間言語</a>
		</li>
</ul>
<p>
 </p>
<p>設計パターンみたいな話もしました。
</p>
<ul style="margin-left:39pt;">
<li>14日目: <a href="http://csharptan.wordpress.com/2011/12/14/">規約、実装、アルゴリズム</a>
		</li>
<li>16日目: <a href="http://csharptan.wordpress.com/2011/12/16/">動的処理</a>
		</li>
<li>24日目: <a href="http://csharptan.wordpress.com/2011/12/24/">メタプログラミング</a>
		</li>
</ul>
<p>
 </p>
<p>そして、プログラミングはあくまでも手段であって目的ではありません。広く使える手段となる.NETでは、広い目的を果たせます。5日目には、統計の話なんかもしました。
</p>
<ul style="margin-left:39pt;">
<li>5日目: <a href="http://csharptan.wordpress.com/2011/12/05/">統計数学</a>
		</li>
</ul>
<p>
 </p>
<p>どれも重要なことだと思って、25個の話を書きました。
</p>
<p>覚えることが多くて大変と思うかもしれないですが、今、.NETに限らず、IT技術者に求められている必要な知識だと思います。
</p>
<p>今は、分業化も進んでいて、各個人が直接必要となる範囲は狭いかもしれませんが、協業相手との円滑なコミュニケーションのためにも、概要くらいは広く知る心構えを持ってください。
</p>
<h2>共通ライブラリ<br />
</h2>
<p>何回かは、.NETのライブラリの紹介などもしました。
</p>
<ul style="margin-left:39pt;">
<li>2日目: <a href="http://csharptan.wordpress.com/2011/12/02/">文字列処理っ！</a>
		</li>
<li>3日目: <a href="http://csharptan.wordpress.com/2011/12/03/">正規表現</a>
		</li>
<li>4日目: <a href="http://csharptan.wordpress.com/2011/12/04/">書式設定</a>
		</li>
<li>12日目: <a href="http://csharptan.wordpress.com/2011/12/12/">コレクション</a>
		</li>
</ul>
<p>ほんの一角しか紹介できませんでしたが、.NETには様々なライブラリがあります。
</p>
<p>18日目に話しましたが、今は、言語を覚えることよりも、ライブラリを覚えることの方が重要、かつ、大変です。
</p>
<ul style="margin-left:39pt;">
<li>18日目: <a href="http://csharptan.wordpress.com/2011/12/18/">ネイティブと.NET</a>
		</li>
</ul>
<p>1つのライブラリを、いろんな言語から利用できるというのは非常に大事です。これは、.NETだけでなく、他の環境でも言えることでしょう。ネイティブと.NETでの共通利用、静的言語（C#やVBなど）と動的言語（IronPythonなど）との間の相互運用も重要です。
</p>
<h2>銀の弾丸はない<br />
</h2>
<p>「AかBかどっちがいい？」みたいな質問の答えは、だいたい、「両方」もしくは「中間」になります。
</p>
<ul style="margin-left:39pt;">
<li>18日目: <a href="http://csharptan.wordpress.com/2011/12/18/">ネイティブと.NET</a>
		</li>
<li>19日目: <a href="http://csharptan.wordpress.com/2011/12/19/">WindowsとCUI</a>
		</li>
</ul>
<p>
 </p>
<p>GUIかCUIかと言われたら、両方。
</p>
<p>静的か動的かと言われたら、両方。
</p>
<p>ネイティブかマネージかと言われたら、両方。
</p>
<p>ウェブかクライアントかと言われたら、両方。
</p>
<p>OOPか関数型かと言われたら、両方。
</p>
<p>
 </p>
<p>それが現実です。
</p>
<p>重要なのは、AとBそれぞれ、適切な利用場面がどこか、そして、選べるかどうかです。
</p>
<h2>ツール連携<br />
</h2>
<p>コンパイル時と実行時では、コンパイル時にエラーが発覚してくれた方が、エラーを発見しやすいです。Visual Studioに至っては、コンパイル時どころか、タイピングしたそばからコードが解析されて、リアルタイムにエラー内容が見えます。それが静的な言語のよさでもあります。
</p>
<p>一方、動的言語と呼ばれるようなタイプのプログラミング言語は、スクリプティングやメタプログラミングしやすいという利点があります。
</p>
<p>ここで再び、「AかBか？」と聞かれたら、両方！ C#も、動的な特性や、スクリプティング、メタプログラミングの方向に進歩しようとしています。
</p>
<ul style="margin-left:39pt;">
<li>15日目: <a href="http://csharptan.wordpress.com/2011/12/15/">スクリプティング</a>
		</li>
<li>16日目: <a href="http://csharptan.wordpress.com/2011/12/16/">動的処理</a>
		</li>
<li>24日目: <a href="http://csharptan.wordpress.com/2011/12/24/">メタプログラミング</a>
		</li>
</ul>
<p>
 </p>
<p>しかしそれでも、基本方針は、可能な限り静的（コンパイル時）処理、そして、Visual Studioとの連携ありきです。先だって、<a href="http://msdn.microsoft.com/ja-jp/roslyn">Roslyn</a>で、Visual Studioとの連携を深めようとしています。
</p>
<p>
 </p>
<p>スクリプト（文字ベースの操作）であっても、GUIの補助により生産性を高めることができます。
</p>
<ul style="margin-left:39pt;">
<li>19日目: <a href="http://csharptan.wordpress.com/2011/12/19/">WindowsとCUI</a>
		</li>
</ul>
<p>
 </p>
<p>また、C#という言語に新しい機能を入れるにあたっては、ライブラリやVisual Studioまで含めた視点で、慎重に考える必要があります。
</p>
<ul style="margin-left:39pt;">
<li>11日目: <a href="http://csharptan.wordpress.com/2011/12/11/">新機能が入るまで</a>
		</li>
</ul>
<p>
 </p>
<h2>クロス ターゲットな&#8221;コア&#8221;<br />
</h2>
<p>「AもBも」といろいろ求められる昨今、クロス ターゲット、run anywhereに作れる部分と、そうでない部分をきっちりと分離しましょう。
</p>
<ul style="margin-left:39pt;">
<li>20日目: <a href="http://csharptan.wordpress.com/2011/12/20/">ロジックを分けましょう</a>
		</li>
<li>21日目: <a href="http://csharptan.wordpress.com/2011/12/21/">それでもクロス ターゲット</a>
		</li>
</ul>
<p>
 </p>
<p>「これはクロス ターゲットに利用可能だろう」と思っていたものが、実はそうでなかったりもするので少し注意が必要です。
</p>
<p>10年も前だと、ファイル読み書き（.NETでいうと<span style="font-family:Consolas;">System.IO.File</span>クラス）が非ポータブルだなんて思いもしなかったものです。今だと、ファイル読み書きはセキュリティ的なお荷物です。
</p>
<h2>開発プロセス<br />
</h2>
<p>Visual Studioは、個人のコーディング → 個人のテスト → 開発チームの連携 → 統制・開発・運用含めた連携 と進歩してきています。
</p>
<ul style="margin-left:39pt;">
<li>22日目: <a href="http://csharptan.wordpress.com/2011/12/22/">単体テスト</a>
		</li>
<li>23日目: <a href="http://csharptan.wordpress.com/2011/12/23/">個人からチームへ</a>
		</li>
</ul>
<p>
 </p>
<p>「ツールに使われてるみたいで嫌」と思うかもしれませんが、ツールの補助は、ある意味教科書みたいなものです。素直に従ってればいいというものでもありませんが、少なくとも、なぜツールがそうなっているかは考えてみた方がいいでしょう。
</p>
<p>色々余計な負担になることもあります。しかし、必要なことを色々端折って始めるのは簡単ですが、後からつらくなることが多々あります。いわば、負債と引き換えに歩を進めているようなものです。リリース後の継続運用・継続開発が重要になっている昨今、負債をしょい続けていいものかどうか、良く考える必要があります。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/153/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/153/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/153/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=153&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/25/c%e3%81%a3%ef%bc%81-to-the-future/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>
	</item>
		<item>
		<title>.NET関連技術</title>
		<link>http://csharptan.wordpress.com/2011/12/25/net%e9%96%a2%e9%80%a3%e6%8a%80%e8%a1%93/</link>
		<comments>http://csharptan.wordpress.com/2011/12/25/net%e9%96%a2%e9%80%a3%e6%8a%80%e8%a1%93/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 15:03:38 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=151</guid>
		<description><![CDATA[C#たんは最初から最後までクライマックスだぜ！   この記事は、C# Advent Calendarの方の25日目です！ 私の1人Advent Calendarの方は、そっちはそっちで書きます！ 今日は、C#や.NETと、その周辺のキーワードを網羅的に紹介していこうかと思います。 .NET周辺キーワード 軽く図にしてみました。   コア クロス ターゲットに使える部分です。.NET Frameworkの標準ライブラリの中でも、基礎中の基礎。 Text/RegularExpressions: テキスト処理と正規表現 Collections: コレクション LINQ: データ列の加工や集計（.NET 3.0以降） Math: 数学関数 Numerics: BigInteger（任意精度整数）とComplex（複素数）（.NET 4以降） IO: ファイルなどの入出力 Net: ネットワーク アクセス Reflection: 実行時型情報 Expressions: 式ツリー（ラムダ式をデータ化）、動的コード生成 Task: 同時実行（並列処理、非同期処理） Service Model: サービス化（システムの備品化、疎結合化） MEF (Managed Extensibility Framework): プラグイン拡張   クライアント いわゆるビュー、プレゼンテーション層技術、GUIフレームワークです。XNA以外は、同じスタイルで開発（XAML+C#、Visual StudioやBlendによるRAD開発）できます。ただし、GUIのクロス プラットフォーム開発は割かし幻想で、ターゲットごとに微妙に差があります。 WPF: デスクトップ向け Silverlight（ブラウザー): ブラウザー [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=151&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>C#たんは最初から最後までクライマックスだぜ！
</p>
<p>
 </p>
<p>この記事は、<a href="http://atnd.org/events/21988">C# Advent Calendar</a>の方の25日目です！ 私の1人Advent Calendarの方は、そっちはそっちで書きます！
</p>
<p>今日は、C#や.NETと、その周辺のキーワードを網羅的に紹介していこうかと思います。
</p>
<h2>.NET周辺キーワード<br />
</h2>
<p>軽く図にしてみました。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122411_1503_net1.png?w=490" alt="" />
	</p>
<p>
 </p>
<h2>コア<br />
</h2>
<p>クロス ターゲットに使える部分です。.NET Frameworkの標準ライブラリの中でも、基礎中の基礎。
</p>
<ul style="margin-left:39pt;">
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.text.aspx">Text</a>/<a href="http://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.aspx">RegularExpressions</a>: テキスト処理と正規表現
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.collections.generic.aspx">Collections</a>: コレクション
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.linq.aspx">LINQ</a>: データ列の加工や集計（.NET 3.0以降）
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.math.aspx">Math</a>: 数学関数
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.numerics.aspx">Numerics</a>: BigInteger（任意精度整数）とComplex（複素数）（.NET 4以降）
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.io.aspx">IO</a>: ファイルなどの入出力
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.net.aspx">Net</a>: ネットワーク アクセス
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.reflection.aspx">Reflection</a>: 実行時型情報
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.linq.expressions.aspx">Expressions</a>: 式ツリー（ラムダ式をデータ化）、動的コード生成
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.threading.tasks.aspx">Task</a>: 同時実行（並列処理、非同期処理）
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.servicemodel.aspx">Service Model:</a> サービス化（システムの備品化、疎結合化）
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/system.componentmodel.composition.aspx">MEF </a>(Managed Extensibility Framework): プラグイン拡張
</li>
</ul>
<p>
 </p>
<h2>クライアント<br />
</h2>
<p>いわゆるビュー、プレゼンテーション層技術、GUIフレームワークです。XNA以外は、同じスタイルで開発（XAML+C#、Visual StudioやBlendによるRAD開発）できます。ただし、GUIのクロス プラットフォーム開発は割かし幻想で、ターゲットごとに微妙に差があります。
</p>
<ul style="margin-left:39pt;">
<li><a href="http://msdn.microsoft.com/ja-jp/netframework/aa663326">WPF</a>: デスクトップ向け
</li>
<li>
<div><a href="http://www.microsoft.com/ja-jp/silverlight/default.aspx">Silverlight</a>（ブラウザー): ブラウザー プラグインとして提供。FireFoxや、Safari上でも動きます
</div>
<ul>
<li>デスクトップ向けの.NETと比べると、使えるライブラリが少ないです
</li>
<li>コアの部分は使えます
</li>
</ul>
</li>
<li>Silverlight（Windows Phone 7）: <a href="http://www.microsoft.com/ja-jp/windowsphone/">Windows Phone 7</a>向け。
</li>
<li><a href="http://msdn.microsoft.com/en-us/windows/apps/">Metro/WinRT</a>: Windows 8なタブレット端末向け（現在、早期プレビュー版）
</li>
<li>
<div><a href="http://ja.wikipedia.org/wiki/Microsoft_XNA">XNA</a>: アクション性の高いゲーム向けのフレームワーク
</div>
<ul>
<li>イベント駆動型ではなく、メッセージ ループを直接書く
</li>
<li>Windows PC、Xbox 360、Windows Phone 7上で動きます
</li>
</ul>
</li>
</ul>
<p>
 </p>
<p>加えて、ASP.NETでは、HTMLをサーバー上で生成して、クライアント側はブラウザーを使って表示というパターンもあります。HTML5にも対応しています。最近はjQueryに投資しているようです。
</p>
<h2>通信<br />
</h2>
<p>WCFは、.NETにおけるサービス化の要です。ネットワークをまたいで、インターフェイスのメソッドを呼び出すようなプロキシの役割を担います。
</p>
<p>元々は、いろんなタイプの通信プロトコルを統一的に扱うためのものでしたが、最近はHTTPを使ったウェブ サービスに最も注力しています。
</p>
<p>昔は、<a href="http://www.w3.org/TR/soap12-part0/">SOAP</a>というメッセージ交換プロトコルを主軸にしていましたが、今は、<a href="http://ja.wikipedia.org/wiki/REST">REST</a>形式のプロトコルである<a href="http://www.odata.org/">OData</a>を主軸としています。<a href="http://ja.wikipedia.org/wiki/Extensible_Markup_Language">XML</a>だけでなく、<a href="http://www.json.org/json-ja.html">JSON</a>にも対応しています。
</p>
<h2>アプリ サーバー<br />
</h2>
<p>処理の大部分をサーバー上で行うようなアプリを開発するためのフレームワークとして、ASP.NETがあります。
</p>
<p>サーバー上でHTMLを生成してブラウザーで表示する場合もあれば、ウェブ サービス化しておいてクライアント アプリから呼び出す場合もあります。
</p>
<ul style="margin-left:39pt;">
<li>
<div>ASP.NET Web Forms: 通信層を隠ぺいして、デスクトップ アプリと同じ感覚でウェブ アプリを作れます
</div>
<ul>
<li>内部を隠ぺいしすぎて不評というのもあったりします
</li>
</ul>
</li>
<li>
<div><a href="http://www.atmarkit.co.jp/fdotnet/scottgublog/20100811aspnetmvc3/aspnetmvc3.html">ASP.NET MVC</a>: .NET以外の言語のウェブ フレームワークに多い、MVC構造を採用したフレームワーク
</div>
<ul>
<li>HTTPを下手に隠ぺいするのはやめて、規約ベースでURLと処理の対応付けします
</li>
</ul>
</li>
</ul>
<p>
 </p>
<p>特に、ASP.NET MVCでは、HTMLの生成用のテンプレート部分に、aspx形式と、<a href="http://www.atmarkit.co.jp/fdotnet/scottgublog/20100714razor/razor.html">Razor</a>形式（拡張子cshtmlかvbhtml）を選べます。Razorでは、<span style="font-family:Consolas;">&lt;%%&gt; </span>のような不恰好なコード ブロックではなく、<span style="font-family:Consolas;">@</span> を使って簡潔にコードを書けます。
</p>
<h2>データ アクセス<br />
</h2>
<p>C#などの.NET言語からデータベースにアクセスするためのフレームワークとして、ADO.NETというものがあります。
</p>
<p>特に、.NET 4から標準に入った、ADO.NET <a href="http://msdn.microsoft.com/ja-jp/library/bb399567.aspx">Entity Framework</a>というものを使うと、ER図的なデータ設計モデルからデータベースや、エンティティ クラス（.NET側からデータベースにアクセスするために使うクラス）を作ったりすることもできます。
</p>
<ul style="margin-left:39pt;">
<li>Database-First: データベースからエンティティ クラスを生成します
</li>
<li>Visual-Model-First: Visual Studio上で、ER図（Entity Relationship Diagram）的なGUIを使ってエンティティを設計し、データベースやエンティティ クラスを生成します
</li>
<li><a href="http://www.atmarkit.co.jp/fdotnet/scottgublog/20100726codefirst/codefirst.html">Code-First</a>: 素のクラス（何も継承しないし、内部に何も特別な処理を書かない、純粋にデータを表すクラス）から、データベースやエンティティ クラスを生成します
</li>
</ul>
<h2>サーバー インフラ<br />
</h2>
<ul style="margin-left:39pt;">
<li>
<div><a href="http://www.atmarkit.co.jp/fdotnet/special/winworkflow/winworkflow_01.html">WF </a>(Windows Workflow Foundation): フローチャート的な処理手順を、GUI上で編集して実行できます
</div>
<ul>
<li>SharePointサーバーやTFSのカスタマイズに使えます
</li>
<li>次期バージョンでは、バッチ処理をWFで書いて、<a href="http://technet.microsoft.com/ja-jp/scriptcenter/dd742419">PowerShell</a>から起動というようなこともできるようになります
</li>
</ul>
</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/ee748475.aspx">WIF </a>(Windows Identity Foundation): 認証基盤
</li>
</ul>
<h2>サーバー製品<br />
</h2>
<p>サーバー アプリを作るなら、それを動かすためのサーバー製品が必要になります。オン プレミス（On Premise: 自前でハードウェアを持って自前で管理する）版と、クラウド（PaaS、管理もお任せ）版の両方が提供されています。
</p>
<ul style="margin-left:39pt;">
<li>Windows Server/Window Azure: OS
</li>
<li>SQL Server/SQL Azure: データベース サーバー
</li>
<li>AppFabric: サーバー間の連携や、アクセス制御を担うインフラ
</li>
</ul>
<p>サーバー管理は、<a href="http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97">RDP</a>（リモート デスクトップ接続）か<a href="http://technet.microsoft.com/ja-jp/scriptcenter/dd742419">PowerShell</a>を使います。繰り返しになりますが、GUIにもCUIにもそれぞれいいところがあって、両方需要があります。Azure（のVM Role）ではクラウド相手ですらRDP管理できます。
</p>
<p>また、Office製品と連携する業務基盤である<a href="http://sharepoint.microsoft.com/">SharePoint</a>というサーバー製品もあります。OfficeやSharePointのカスタマイズも、Visual Studioと.NETを使ってできます。
</p>
<h2>開発インフラ<br />
</h2>
<p>.NETと言えば、強力な統合開発環境。
</p>
<ul style="margin-left:39pt;">
<li>Visual Studio: 説明不要かと思います。.NETの生産性の高さの原動力
</li>
<li><a href="http://www.atmarkit.co.jp/fdotnet/introtfs/introtfs01/introtfs01_01.html">TFS </a>(Team Foundation Server): バージョン管理、作業項目管理、継続的インテグレーションなどを行うためのサーバー製品
</li>
<li>Team Foundation Service: TFSのSaaS版。Azure上で稼働（現在、<a href="http://tfspreview.com/">プレビュー版</a>）
</li>
</ul>
<p>Visual Studioは、2010から、拡張が簡単になりました。<a href="http://www.atmarkit.co.jp/fdotnet/scottgublog/20100510vs2010extman/vs2010extman.html">拡張マネージャー</a>というものを使って、サード パーティ製のVisual Studio拡張を簡単にインストール可能です。拡張を作る側は、<a href="http://msdn.microsoft.com/ja-jp/library/aa985039.aspx">Visual Studio SDK</a>というものを使います。
</p>
<p><a href="http://msdn.microsoft.com/ja-jp/roslyn">Roslyn</a>で一番期待されているのも、Visual Studio拡張によるメタプログラミングです。
</p>
<p>現状だと、ビルド時コード生成によるメタプログラミングでは、<a href="http://blogs.msdn.com/b/hirosho/archive/2007/09/11/t4-template.aspx">T4テンプレート</a>を使います。
</p>
<h2>コミュニティ<br />
</h2>
<h3>ライブラリ<br />
</h3>
<p>現在では、約2年周期の大きなアップデート（Vistaから7にとか、Visual Studio 2008から2010にとか）の合間合間にも、オープン ソースで広くフィードバックを厚めながら新機能を提供しています。
</p>
<p>コードの公開には<a href="http://www.codeplex.com/">CodePlex</a>というオープン ソース コミュニティ向けサイトを利用しています。
</p>
<p>いくつか例を挙げましょう。
</p>
<ul style="margin-left:39pt;">
<li><a href="http://silverlight.codeplex.com/">Silverlight Toolkit</a>
		</li>
<li><a href="http://azuretoolkit.codeplex.com/">Azure Toolkit</a>
		</li>
<li><a href="http://ajaxcontroltoolkit.codeplex.com/">Ajax Control Toolkit</a>
		</li>
</ul>
<p>マイクロソフト公式のもの以外にも、コミュニティ ベースのToolkitもあります。
</p>
<ul style="margin-left:39pt;">
<li><a href="http://wpftoolkit.codeplex.com/">Extended WPF Toolkit</a>
		</li>
</ul>
<p>その他、CodePlexには有用なオープン ソース ライブラリがたくさんあるので、サイト内をいろいろ検索してみてください。
</p>
<p>こうして作られたライブラリ（マイクロソフト公式の追加ライブラリや、コミュニティ ベースのもの）は、最近だと、<a href="http://nuget.org/">NuGet</a>という、オンライン ギャラリー ＋ Visual Studio拡張を通して、簡単にプロジェクトから参照できます。
</p>
<h3>情報提供<br />
</h3>
<p>マイクロソフトの開発者向け製品に関する情報は、<a href="http://msdn.microsoft.com/">MSDN</a>（Microsoft Developer Network）というサイトに集約されています。
</p>
<ul style="margin-left:39pt;">
<li>
<div><a href="http://msdn.microsoft.com/ja-jp/library/default.aspx">ライブラリ</a>: APIリファレンスなど、学習コンテンツ
</div>
<ul>
<li>初心者が学ぶには詳しすぎてしんどいなんて話もありますが、網羅性と詳細さは非常に良いです
</li>
<li>日本からは、「英語の情報があるってことは、まだ日本語未対応なんでしょ。そんな情報要らない」というフィードバックと「英語でもいいから最新の情報もらえないと困る」というフィードバックが半々で、途方に暮れているそうです
</li>
<li>「機械翻訳でもいいから早く」と「機械翻訳とか役に立たねー」も半々
</li>
</ul>
</li>
<li>
<div><a href="http://blogs.msdn.com/">ブログ</a>: 社員によるブログ
</div>
<ul>
<li>最新の情報はだいたいここ（の本社社員の記事、もちろん英語）から出てきます
</li>
</ul>
</li>
<li>
<div><a href="http://msdn.microsoft.com/ja-jp/magazine/">マガジン</a>: 毎月刊行される情報サイト
</div>
<ul>
<li>元々は本当に紙の冊子も販売されてた
</li>
</ul>
</li>
<li><a href="http://social.msdn.microsoft.com/Forums/">フォーラム</a>: フォーラム（掲示板）形式で、質問や意見/要望を受け付けています
</li>
<li>
<div><a href="http://code.msdn.microsoft.com/">Code Recipe</a>: コード付きのサンプル/解説置き場
</div>
<ul>
<li>元々は公式コンテンツしかなかったですが、今ではユーザー投稿（誰でも可能）を受け付けています
</li>
</ul>
</li>
</ul>
<h2>多様化<br />
</h2>
<p>C#やVBだけが.NETじゃなく、マイクロソフトだけが.NET提供しているわけではなく、PCだけが.NETの対象ではありません。
</p>
<ul style="margin-left:39pt;">
<li>
<div>DLR (Dynamic Language Runtime): .NET上に動的言語を実装するための基盤
</div>
<ul>
<li>マイクロソフトの寄与度が高いものでいうと、<a href="http://ironpython.codeplex.com/">IronPython</a>が提供されています
</li>
<li>その他、IronRubyなど、いくつかの動的言語がDLR化されています
</li>
<li>DLR上に実装された動的言語からは.NETのライブラリを利用でしますし、動的言語側で作ったクラスなども、C# 4.0のdynamicキーワードなどを使って相互運用可能です
</li>
</ul>
</li>
<li>
<div><a href="http://www.mono-project.com/">mono</a>: オープン ソースな.NET実装です
</div>
<ul>
<li>Mac向けやLinux向け、iOS向けやAndroid向けなども提供されています
</li>
<li><a href="http://unity3d.com/">Unity</a>や<a href="http://www.scei.co.jp/corporate/release/110915b.html">PlayStation Suite</a>などのゲーム開発フレームワークでも採用されています
</li>
</ul>
</li>
<li>
<div><a href="http://msdn.microsoft.com/ja-jp/robotics/default.aspx">Robotics Studio</a>: C#などを使ってロボットを制御
</div>
<ul>
<li>日本語での解説記事: <a href="http://www.saturn.dti.ne.jp/~npaka/robotics/index.html">Microsoft Robotics Studioメモ</a>
				</li>
<li>有名な例でいうと、自動掃除機の<a href="http://irobot-jp.com/">ルンバ</a>や、<a href="http://www.legoeducation.jp/mindstorms/">LEGOマインドストーム</a>などが対応しています
</li>
</ul>
</li>
<li>
<div><a href="http://www.microsoft.com/en-us/netmf/default.aspx">.NET Micro Framework</a>:組み込み機器向け.NET
</div>
<ul>
<li>OSすら載せたくないような低フットプリント機器向けに、.NETの最低限の機能だけを提供
</li>
<li>オープン ソース提供されています
</li>
<li><a href="http://www.microsoft.com/download/en/details.aspx?id=5868">Porting Kit</a>を使って特定のハードウェア向けにカスタマイズすることもできます
</li>
<li>
<div>元から対応しているハードウェア基盤の購入もできます
</div>
<ul>
<li><a href="http://www.netduino.com/">netduino</a>
						</li>
</ul>
</li>
<li>モジュールの組み合わせでプロトタイプ作成ができる、<a href="http://research.microsoft.com/en-us/projects/gadgeteer/">.NET Gadgeteer</a>というプロジェクトも
</li>
</ul>
</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/151/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=151&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/25/net%e9%96%a2%e9%80%a3%e6%8a%80%e8%a1%93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122411_1503_net1.png" medium="image" />
	</item>
		<item>
		<title>メタプログラミング</title>
		<link>http://csharptan.wordpress.com/2011/12/24/%e3%83%a1%e3%82%bf%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/</link>
		<comments>http://csharptan.wordpress.com/2011/12/24/%e3%83%a1%e3%82%bf%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 01:50:23 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=148</guid>
		<description><![CDATA[C++たんがまた今年も一人パーティ用のケーキとシャンパン買ってましたが、皆様いかがお過ごしでしょうか。   さて、本日はメタプログラミングがテーマです。 パターン プログラミングには、「こういう場面はこう書くべきです」というようなパターンがつきものです。 この手のパターンは、昨日も少し話したような一種の「失敗しないための教科書」です。守らないと、アプリの欠損を招く確率を跳ね上げます。それはもう、たいそう跳ね上げます。 ある種のパターンは、ライブラリ化することで回避できたりします。しかし、ライブラリにできないパターンというのもあって、そういうものは、ちゃんとパターンを覚えてコードを書かないといけません。 ということで、言語構文を一通り覚えたら、次は、パターン本を読んで全部覚えろと言われるわけです。 しかし、それを社内すべてのエンジニアに期待できるのかというと、なかなか難しいのが実情です。そして、悪貨は良貨を駆逐する。しっかり勉強してる人が、わかってない人のコードに疲弊して、ばかばかしくなって辞めていくわけです（※末尾に補足あり）。 パターンを言語機能化 ライブラリ化しにくいパターンも、言語機能として何らかのサポートを加えることで回避できることがあります。 「このパターン通りに書け」だと意識の高い人しか実践してくれませんが、「この文法使うと便利だよ」なら割とみんな使ってくれます。 C#にはそんな、パターンだったものを文法化したものがいくつかあります。 イベント いわゆるイベント駆動型のプログラムを作る場合、オブザーバー パターンというものを使います。C#のイベント構文を使わずに書くと、以下のようなパターンになります。 object _progressSync = new object();Action&#60;int&#62; _progress; // イベント ハンドラーの登録public void AddProgressHandler(Action&#60;int&#62; handler){    lock (_progressSync)        _progress += handler;} // イベント ハンドラーの解除public void RemoveProgressHandler(Action&#60;int&#62; handler){    lock (_progressSync)        _progress -= handler;} デリゲート（マルチキャスト可能な関数オブジェクト）の概念を持っていない言語だと、もうちょっとめんどくさいパターンになります。 C#の場合、オブザーバー パターンに相当する機能は、イベント構文という専用の構文があって、1行で書けます。 public event EventHandler&#60;int&#62; Progress; これで、上記のコードと同じ挙動が得られます（具体的な実装はちょっと違いますが）。 イテレーター データ処理、例えば、データ列の中から特定の条件を満たす要素だけを取り出すというような処理を考えてみましょう。一般に、この手の処理にはイテレーター パターンというものを使います。これも、C#の専用の言語機能に頼らず書くと、以下のようになります。 class WhereEnumerator&#60;T&#62; : IEnumerator&#60;T&#62;, IEnumerable&#60;T&#62;{    IEnumerator&#60;T&#62; _e;    Func&#60;T, bool&#62; _cond;    public WhereEnumerator(IEnumerator&#60;T&#62; e, Func&#60;T, bool&#62; cond)    {        _e = e;        _cond = cond;    }     public T Current { get { return _e.Current; } }     public bool MoveNext()    {        while (_e.MoveNext())            if (_cond(_e.Current))                return true;        return false;    }     public IEnumerator&#60;T&#62; GetEnumerator()    {        return this;    } // 一部省略} public static IEnumerable&#60;T&#62; Where&#60;T&#62;(IEnumerable&#60;T&#62; source, Func&#60;T, bool&#62; cond){    return new WhereEnumerator&#60;T&#62;(source.GetEnumerator(), cond);} C#にはイベント構文というものがあって、このパターンを劇的に簡素化できます。以下の通りです。 public static IEnumerable&#60;T&#62; Where&#60;T&#62;(IEnumerable&#60;T&#62; source, Func&#60;T, bool&#62; cond){    foreach (var x in source)        if (cond(x))            yield return x;}   それでもまだまだパターン そんなC#でも、まだまだパターンを書かないといけないことは多いです。 あるオブジェクトのあるプロパティの値が変化したことを、他のオブジェクトに伝えたいことがあります。データベース エンティティ変更追跡とか、GUIへの反映なんかが主だった例です。 この場合、結構面倒なコードを書く必要があります。例えば、XとYという2つのプロパティを持つだけの単純なクラスすら、以下のようになります。 class Point : INotifyPropertyChanged{    private int _x;    public int X    {        get { return _x; }        set { _x = value; RaisePropertyChanged(&#8220;X&#8221;); }    }     private int _y;    public int Y    {        get { return _y; }        set { _y = value; RaisePropertyChanged(&#8220;Y&#8221;); }    }     public event PropertyChangedEventHandler PropertyChanged;     private void RaisePropertyChanged(string name)    {        var d = PropertyChanged;        if (d != null)            d(this, new PropertyChangedEventArgs(name));    }}   メタプログラミング こういう時、例えば、以下のような簡素なクラスから、先ほどのようなパターンで煩雑化したクラスを自動生成したかったりします。 class PointDefinition{    int X;    int Y;}   こういう発想を、プログラムからプログラムを作るという意味で、メタプログラミング（meta-programming）と呼びます。 こういうのは、動的言語と呼ばれるようなタイプのプログラミング言語が得意とするところです。 まあ、C#でも、少し煩雑ですが、動的コード生成で対処できないことはないです。が、以下のような理由で敬遠されます。 なんだかんだ言って結構煩雑 この手の処理なら、コンパイル時コード生成でもできるんだから、動的（実行時）に生成したくない [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=148&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>C++たんがまた今年も一人パーティ用のケーキとシャンパン買ってましたが、皆様いかがお過ごしでしょうか。
</p>
<p>
 </p>
<p>さて、本日はメタプログラミングがテーマです。
</p>
<h2>パターン<br />
</h2>
<p>プログラミングには、「こういう場面はこう書くべきです」というようなパターンがつきものです。
</p>
<p>この手のパターンは、昨日も少し話したような一種の「失敗しないための教科書」です。守らないと、アプリの欠損を招く確率を跳ね上げます。それはもう、たいそう跳ね上げます。
</p>
<p>ある種のパターンは、ライブラリ化することで回避できたりします。しかし、ライブラリにできないパターンというのもあって、そういうものは、ちゃんとパターンを覚えてコードを書かないといけません。
</p>
<p>ということで、言語構文を一通り覚えたら、次は、パターン本を読んで全部覚えろと言われるわけです。
</p>
<p>しかし、それを社内すべてのエンジニアに期待できるのかというと、なかなか難しいのが実情です。そして、悪貨は良貨を駆逐する。しっかり勉強してる人が、わかってない人のコードに疲弊して、ばかばかしくなって辞めていくわけです（※末尾に補足あり）。
</p>
<h3>パターンを言語機能化<br />
</h3>
<p>ライブラリ化しにくいパターンも、言語機能として何らかのサポートを加えることで回避できることがあります。
</p>
<p>「このパターン通りに書け」だと意識の高い人しか実践してくれませんが、「この文法使うと便利だよ」なら割とみんな使ってくれます。
</p>
<p>C#にはそんな、パターンだったものを文法化したものがいくつかあります。
</p>
<h3>イベント<br />
</h3>
<p>いわゆるイベント駆動型のプログラムを作る場合、オブザーバー パターンというものを使います。C#のイベント構文を使わずに書くと、以下のようなパターンになります。
</p>
<p style="background:white;"><span style="color:blue;font-size:10pt;"><span style="font-family:Consolas;">object<span style="color:black;"> _progressSync = <span style="color:blue;">new<span style="color:black;"> <span style="color:blue;">object<span style="color:black;">();<br /><span style="color:#2b91af;">Action<span style="color:black;">&lt;<span style="color:blue;">int<span style="color:black;">&gt; _progress;</p>
<p><span style="color:green;">// </span></span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">イベント</span><span style="color:green;"><span style="font-family:Consolas;"> </span><span style="font-family:ＭＳ ゴシック;">ハンドラーの登録</span><span style="color:black;"><span style="font-family:Consolas;"><br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> AddProgressHandler(<span style="color:#2b91af;">Action<span style="color:black;">&lt;<span style="color:blue;">int<span style="color:black;">&gt; handler)<br />{<br />    <span style="color:blue;">lock<span style="color:black;"> (_progressSync)<br />        _progress += handler;<br />}</p>
<p><span style="color:green;">// </span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">イベント</span><span style="color:green;"><span style="font-family:Consolas;"> </span><span style="font-family:ＭＳ ゴシック;">ハンドラーの解除</span><span style="color:black;font-family:Consolas;"><br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> RemoveProgressHandler(<span style="color:#2b91af;">Action<span style="color:black;">&lt;<span style="color:blue;">int<span style="color:black;">&gt; handler)<br />{<br />    <span style="color:blue;">lock<span style="color:black;"> (_progressSync)<br />        _progress -= handler;<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>デリゲート（マルチキャスト可能な関数オブジェクト）の概念を持っていない言語だと、もうちょっとめんどくさいパターンになります。
</p>
<p>C#の場合、オブザーバー パターンに相当する機能は、イベント構文という専用の構文があって、1行で書けます。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">public<span style="color:black;"> <span style="color:blue;">event<span style="color:black;"> <span style="color:#2b91af;">EventHandler<span style="color:black;">&lt;<span style="color:blue;">int<span style="color:black;">&gt; Progress;<br />
</span></span></span></span></span></span></span></span></p>
<p>これで、上記のコードと同じ挙動が得られます（具体的な実装はちょっと違いますが）。
</p>
<h3>イテレーター<br />
</h3>
<p>データ処理、例えば、データ列の中から特定の条件を満たす要素だけを取り出すというような処理を考えてみましょう。一般に、この手の処理にはイテレーター パターンというものを使います。これも、C#の専用の言語機能に頼らず書くと、以下のようになります。
</p>
<p style="background:white;"><span style="color:blue;font-size:10pt;"><span style="font-family:Consolas;">class<span style="color:black;"> <span style="color:#2b91af;">WhereEnumerator<span style="color:black;">&lt;T&gt; : <span style="color:#2b91af;">IEnumerator<span style="color:black;">&lt;T&gt;, <span style="color:#2b91af;">IEnumerable<span style="color:black;">&lt;T&gt;<br />{<br />    <span style="color:#2b91af;">IEnumerator<span style="color:black;">&lt;T&gt; _e;<br />    <span style="color:#2b91af;">Func<span style="color:black;">&lt;T, <span style="color:blue;">bool<span style="color:black;">&gt; _cond;<br />    <span style="color:blue;">public<span style="color:black;"> WhereEnumerator(<span style="color:#2b91af;">IEnumerator<span style="color:black;">&lt;T&gt; e, <span style="color:#2b91af;">Func<span style="color:black;">&lt;T, <span style="color:blue;">bool<span style="color:black;">&gt; cond)<br />    {<br />        _e = e;<br />        _cond = cond;<br />    }</p>
<p>    <span style="color:blue;">public<span style="color:black;"> T Current { <span style="color:blue;">get<span style="color:black;"> { <span style="color:blue;">return<span style="color:black;"> _e.Current; } }</p>
<p>    <span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">bool<span style="color:black;"> MoveNext()<br />    {<br />        <span style="color:blue;">while<span style="color:black;"> (_e.MoveNext())<br />            <span style="color:blue;">if<span style="color:black;"> (_cond(_e.Current))<br />                <span style="color:blue;">return<span style="color:black;"> <span style="color:blue;">true<span style="color:black;">;<br />        <span style="color:blue;">return<span style="color:black;"> <span style="color:blue;">false<span style="color:black;">;<br />    }</p>
<p>    <span style="color:blue;">public<span style="color:black;"> <span style="color:#2b91af;">IEnumerator<span style="color:black;">&lt;T&gt; GetEnumerator()<br />    {<br />        <span style="color:blue;">return<span style="color:black;"> <span style="color:blue;">this<span style="color:black;">;<br />    }<br /><span style="color:green;">    // </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">一部省略</span><span style="color:black;font-family:Consolas;"><br />}</p>
<p><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:#2b91af;">IEnumerable<span style="color:black;">&lt;T&gt; Where&lt;T&gt;(<span style="color:#2b91af;">IEnumerable<span style="color:black;">&lt;T&gt; source, <span style="color:#2b91af;">Func<span style="color:black;">&lt;T, <span style="color:blue;">bool<span style="color:black;">&gt; cond)<br />{<br />    <span style="color:blue;">return<span style="color:black;"> <span style="color:blue;">new<span style="color:black;"> <span style="color:#2b91af;">WhereEnumerator<span style="color:black;">&lt;T&gt;(source.GetEnumerator(), cond);<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>C#にはイベント構文というものがあって、このパターンを劇的に簡素化できます。以下の通りです。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">public<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:#2b91af;">IEnumerable<span style="color:black;">&lt;T&gt; Where&lt;T&gt;(<span style="color:#2b91af;">IEnumerable<span style="color:black;">&lt;T&gt; source, <span style="color:#2b91af;">Func<span style="color:black;">&lt;T, <span style="color:blue;">bool<span style="color:black;">&gt; cond)<br />{<br />    <span style="color:blue;">foreach<span style="color:black;"> (<span style="color:blue;">var<span style="color:black;"> x <span style="color:blue;">in<span style="color:black;"> source)<br />        <span style="color:blue;">if<span style="color:black;"> (cond(x))<br />            <span style="color:blue;">yield<span style="color:black;"> <span style="color:blue;">return<span style="color:black;"> x;<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>
 </p>
<h2>それでもまだまだパターン<br />
</h2>
<p>そんなC#でも、まだまだパターンを書かないといけないことは多いです。
</p>
<p>あるオブジェクトのあるプロパティの値が変化したことを、他のオブジェクトに伝えたいことがあります。データベース エンティティ変更追跡とか、GUIへの反映なんかが主だった例です。
</p>
<p>この場合、結構面倒なコードを書く必要があります。例えば、XとYという2つのプロパティを持つだけの単純なクラスすら、以下のようになります。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">class<span style="color:black;"> <span style="color:#2b91af;">Point<span style="color:black;"> : <span style="color:#2b91af;">INotifyPropertyChanged<span style="color:black;"><br />{<br />    <span style="color:blue;">private<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> _x;<br />    <span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> X<br />    {<br />        <span style="color:blue;">get<span style="color:black;"> { <span style="color:blue;">return<span style="color:black;"> _x; }<br />        <span style="color:blue;">set<span style="color:black;"> { _x = <span style="color:blue;">value<span style="color:black;">; RaisePropertyChanged(<span style="color:#a31515;">&#8220;X&#8221;<span style="color:black;">); }<br />    }</p>
<p>    <span style="color:blue;">private<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> _y;<br />    <span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> Y<br />    {<br />        <span style="color:blue;">get<span style="color:black;"> { <span style="color:blue;">return<span style="color:black;"> _y; }<br />        <span style="color:blue;">set<span style="color:black;"> { _y = <span style="color:blue;">value<span style="color:black;">; RaisePropertyChanged(<span style="color:#a31515;">&#8220;Y&#8221;<span style="color:black;">); }<br />    }</p>
<p>    <span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">event<span style="color:black;"> <span style="color:#2b91af;">PropertyChangedEventHandler<span style="color:black;"> PropertyChanged;</p>
<p>    <span style="color:blue;">private<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> RaisePropertyChanged(<span style="color:blue;">string<span style="color:black;"> name)<br />    {<br />        <span style="color:blue;">var<span style="color:black;"> d = PropertyChanged;<br />        <span style="color:blue;">if<span style="color:black;"> (d != <span style="color:blue;">null<span style="color:black;">)<br />            d(<span style="color:blue;">this<span style="color:black;">, <span style="color:blue;">new<span style="color:black;"> <span style="color:#2b91af;">PropertyChangedEventArgs<span style="color:black;">(name));<br />    }<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>
 </p>
<h2>メタプログラミング<br />
</h2>
<p>こういう時、例えば、以下のような簡素なクラスから、先ほどのようなパターンで煩雑化したクラスを自動生成したかったりします。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">class<span style="color:black;"> <span style="color:#2b91af;">PointDefinition<span style="color:black;"><br />{<br />    <span style="color:blue;">int<span style="color:black;"> X;<br />    <span style="color:blue;">int<span style="color:black;"> Y;<br />}<br />
</span></span></span></span></span></span></span></span></p>
<p>
 </p>
<p>こういう発想を、プログラムからプログラムを作るという意味で、メタプログラミング（meta-programming）と呼びます。
</p>
<p>こういうのは、動的言語と呼ばれるようなタイプのプログラミング言語が得意とするところです。
</p>
<p>まあ、C#でも、少し煩雑ですが、動的コード生成で対処できないことはないです。が、以下のような理由で敬遠されます。
</p>
<ul style="margin-left:39pt;">
<li>なんだかんだ言って結構煩雑
</li>
<li>
<div>この手の処理なら、コンパイル時コード生成でもできるんだから、動的（実行時）に生成したくない
</div>
<ul>
<li>コンパイル時にエラーがわからない（実行して初めてわかる）のが嫌
</li>
<li>性能を落とすのが嫌
</li>
</ul>
</li>
</ul>
<p>
 </p>
<p>なので、「C#にも、C言語の#defineみたいな置換マクロが欲しい」みたいな意見も時々聞きます。ただ、C#の場合には、Visual Studioとの連携も必要なので、マクロ（単純な文字列置換）では難しいです。もし導入しても、Visual Studioの補助が受けれなくなるデメリットの方が大きいです。
</p>
<h3>T4テンプレート<br />
</h3>
<p>C#でのメタプログラミングは、本格的にやるなら<a href="http://msdn.microsoft.com/ja-jp/roslyn">Roslyn</a>を待った方がいいかもしれません。
</p>
<p>まあ、今現在の次善の策としては、T4テンプレート（Text Template Transformation Toolkit）というものを使うのがいいでしょう。コンパイル時のコード生成用のツールで、Visual Studio 2010からは標準で入っています。
</p>
<p>結構慣れるまでが大変、かつ、そんなに使いやすい文法でもないんですが、以下のような感じです。
</p>
<p style="background:white;"><span style="color:black;font-family:Consolas;font-size:10pt;">using System.ComponentModel;</p>
<p>public class &lt;#= Def.Class #&gt; : INotifyPropertyChanged<br />{<br />&lt;#<br />foreach (var p in Def.Properties)<br />{<br />#&gt;<br />    private &lt;#= p.Type #&gt; _&lt;#= p.Name #&gt;;<br />    public &lt;#= p.Type #&gt; &lt;#= p.Name #&gt;<br />    {<br />        get { return _&lt;#= p.Name #&gt;; }<br />        set { _&lt;#= p.Name #&gt; = value; RaisePropertyChanged(&#8220;&lt;#= p.Name #&gt;&#8221;); }<br />    }</p>
<p>&lt;#<br />}<br />#&gt;<br />    public event PropertyChangedEventHandler PropertyChanged;</p>
<p>    private void RaisePropertyChanged(string name)<br />    {<br />        var d = PropertyChanged;<br />        if (d != null)<br />            d(this, new PropertyChangedEventArgs(name));<br />    }<br />}<br />
</span></p>
<p>これで、簡素な定義クラスから、煩雑なパターン生成できます。上記のテンプレートを<span style="font-family:Consolas;">NotifyPropertyChanged.ttinc</span>というファイル名で作ったとして、それとは別に、以下のようなテンプレートを作ります。
</p>
<p style="background:white;"><span style="color:black;font-family:Consolas;font-size:10pt;">&lt;#@ template debug=&#8221;false&#8221; hostspecific=&#8221;false&#8221; language=&#8221;C#&#8221; #&gt;<br />&lt;#@ output extension=&#8221;.cs&#8221; #&gt;<br />&lt;#<br />var Def = new<br />{<br />    Class = &#8221;Point&#8221;,<br />    Properties = new[]<br />    {<br />        new { Type = &#8221;int&#8221;, Name = &#8221;X&#8221; },<br />        new { Type = &#8221;int&#8221;, Name = &#8221;Y&#8221; },<br />    },<br />};<br />#&gt; <br />&lt;#@include file=&#8221;NotifyPropertyChanged.ttinc&#8221; #&gt;<br />
</span></p>
<p>その結果、先ほど作ったようなPointクラスが自動生成されます。
</p>
<h2>メタプログラミングする上で<br />
</h2>
<p>メタプログラミングするに当たっては、難儀な問題がいろいろあったりします。いくつか説明していきましょう。
</p>
<h3>覚えるコスト<br />
</h3>
<p>メタプログラミングは、既存の言語の文法の中に、別の文法を作るようなものです。新しい言語を覚えるコストが余計にかかります。
</p>
<h3>ツールとの連携<br />
</h3>
<p>「パターンを覚えるにしても、新しい文法を覚えるにしても、（あるいはライブラリでやるなら）新しいクラスやメソッドを覚えるにしても、覚える量には変わりがないじゃないか」と思うかもしれません。
</p>
<p>一般にはその通りなんですが、C#の場合、Visual Studioという強力な補助ツールがあるわけです。クラスやメソッドの追加の場合、Visual Studioの補完を使えます。しかし、新しい文法を考える場合、Visual Studioまで対応させるのは結構難しいです。
</p>
<p>先ほどのT4テンプレートが微妙なのも、Visual Studioの補助がいまいちだからというのが大きいです。
</p>
<h3>読みやすさと書きやすさ<br />
</h3>
<p>プログラミングという作業では、書きやすさよりも、読みやすさの方が大事です。書いた本人とは違う人がコードを読む機会が多いです。また、自分の書いたコードであっても、ちょっと前のことはすぐに忘れます。
</p>
<p>メタプログラミングも、後から読んで困るほどの省略はしてはいけません。
</p>
<p>まあ、煩雑なパターン コードよりは読みやすいはずなので、変な略語とかだけ使わなければ大丈夫でしょう。
</p>
<h3>なんでもはやろうとしない<br />
</h3>
<p>メタプログラミングは、汎用プログラミング言語の構文に漏れるような、ある特定の領域に対して特化した構文を作るのに使います。
</p>
<p>「特定の領域に絞る」というのは非常に重要です。メタプログラミングで何でもはやろうとしないでください。それは、汎用言語構文の役割です。
</p>
<h2>補足<br />
</h2>
<p>
 </p>
<h3>悪貨に駆逐されないために<br />
</h3>
<p>本題と外れるのでいったんスルーしましたが。
</p>
<p>「ダメな人のコードにできる人が疲弊する」というので、本当にまずいのは、組織的な問題の部分です。組織運用の在り方から考えなおす必要があります。
</p>
<p>「ダメの人のコード」というように、個人に帰着した問題になっている時点でアウトです。コード レビューなどを通してダメなコードをはじく仕組みを、チーム全体でやっていく必要があります。コードの責任を個人のものにしてはいけません。その責任はチームで持つべきです。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/148/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=148&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/24/%e3%83%a1%e3%82%bf%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>
	</item>
		<item>
		<title>個人からチームへ</title>
		<link>http://csharptan.wordpress.com/2011/12/23/%e5%80%8b%e4%ba%ba%e3%81%8b%e3%82%89%e3%83%81%e3%83%bc%e3%83%a0%e3%81%b8/</link>
		<comments>http://csharptan.wordpress.com/2011/12/23/%e5%80%8b%e4%ba%ba%e3%81%8b%e3%82%89%e3%83%81%e3%83%bc%e3%83%a0%e3%81%b8/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 10:26:41 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=146</guid>
		<description><![CDATA[今日のテーマは共同開発です。   非常に大事というか、会社に入ると当たり前な話なわけですが。あんまり学校の授業では出てこないみたいで、学生さんには欠けがちな視点みたいですねぇ。 視野の広がり Visual Studioというのはソフトウェア開発の生産性を上げるためのツールです。ソフトウェア開発と言っても、いろんな視点があって、いろんな機能提供があります。以下の絵は、Visual Studioの新機能追加の歴史のようなものです。 この視点の変化（というか、視野の広がり）は、Visual Studioに限らず、ソフトウェア開発の現場一般に言えることでしょう。視野は、個人からチームへ、開発チームからビジネス全体へと広がっています。 .NET以外の世界でいうと、 エディター（Eclipseなど） ソースコード管理（SubversionやGit） 進行管理（TracやRedmine） 継続的インテグレーション（Jenkinsなど） など、多くのツールを組み合わせて実現します。 Express版 昨日のテストの話でもしましたね、初心者だと無償のExpress版で十分だと。それは、初心者だとだいたい、個人視点に収まるからです。前節の図で言うと、「開発者」に位置する機能は、Express版でもかなり網羅しています（単体テスト機能はないですが）。 一方、図中の右に行くほど、Visual Studioの上位エディションにしかない機能が増えます。 アプリのライフサイクル管理 開発チームという視点から、ビジネス全体へと視野が広がっているのには、時代の変化という背景もあります。 パッケージ売りから継続運用への変化 昔は、一度リリースしてしまったらもうおしまい（あるいは、バージョン アップまで結構間が空く）でしたが、今は、ウェブなどで、継続的に要望が入り、継続的に開発を行う必要があります アジャイル開発 最初に要望を聞いて終わりではなく、細かい単位で要望や優先度の見直しが行われるようになっています そもそも、世情の変化も早く、要望自体が短期間で変化します 開発チームだけで閉じていては、世情の変化に迅速に対応することができず、ビジネスの機会を失います。 アプリは、開発だけがすべてではありません。開発の前段階の要求の洗い出し、リリース後の運用、さらに、フィードバックを受けての次段階の検討まで含めたライフサイクルの管理が必要です。この考え方に対して、ここ数年で、ALM（Application Lifecycle Management）という呼び名も生まれました。 ビジネスにかかわる関係各者 開発チームからビジネス全体へという話をもう少し掘り下げてみましょう。 プロジェクトが大きくなればなるほど分業化が進むわけですが、以下のようなポジションに分かれることになります。 統制 意思決定者です 何を作る、何を優先する、何にどれだけのお金を投資するなどの最終判断を下します 受託開発の場合だと、顧客との折衝なども含まれます 開発 アプリ開発も、いろいろな人員の協業で成り立っています （狭義に）開発 実際にアプリを設計し、コーディングします 進行管理 チーム内の開発状況に遅れがないか、あるなら解決方法は何かなど、チームの進行状況の管理や他チーム/統制との折衝を行います テスト 開発者本人のテスト記述では漏れるような第3者視点でのテスト、結合テスト、手動テストなどを行います UX（ユーザー体験）デザイン 人文科学的視点や、美術的な視点からアプリの操作性や外観を設計します 運用 アプリ公開後、継続的にサーバーの管理や不具合報告、エンド ユーザーからのフィードバック受け付けなどを行います   個別の視点、個々人の戦術的な視点だけではプロジェクトは成功しません。全体を戦略的に眺める視点が必要です。 広い範囲全体を眺めるというのは、言うほどたやすいことではありません。ソフトウェア開発に対する要求が高度化するにつれ、この全体の把握を補助するツールの存在が重要になっています。 TFS [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=146&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>今日のテーマは共同開発です。
</p>
<p>
 </p>
<p>非常に大事というか、会社に入ると当たり前な話なわけですが。あんまり学校の授業では出てこないみたいで、学生さんには欠けがちな視点みたいですねぇ。
</p>
<h2>視野の広がり<br />
</h2>
<p>Visual Studioというのはソフトウェア開発の生産性を上げるためのツールです。ソフトウェア開発と言っても、いろんな視点があって、いろんな機能提供があります。以下の絵は、Visual Studioの新機能追加の歴史のようなものです。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122311_1026_1.png?w=490" alt="" />
	</p>
<p>この視点の変化（というか、視野の広がり）は、Visual Studioに限らず、ソフトウェア開発の現場一般に言えることでしょう。視野は、個人からチームへ、開発チームからビジネス全体へと広がっています。
</p>
<p>.NET以外の世界でいうと、
</p>
<ul style="margin-left:39pt;">
<li>エディター（Eclipseなど）
</li>
<li>ソースコード管理（SubversionやGit）
</li>
<li>進行管理（TracやRedmine）
</li>
<li>継続的インテグレーション（Jenkinsなど）
</li>
</ul>
<p>など、多くのツールを組み合わせて実現します。
</p>
<h3>Express版<br />
</h3>
<p>昨日のテストの話でもしましたね、初心者だと無償のExpress版で十分だと。それは、初心者だとだいたい、個人視点に収まるからです。前節の図で言うと、「開発者」に位置する機能は、Express版でもかなり網羅しています（単体テスト機能はないですが）。
</p>
<p>一方、図中の右に行くほど、Visual Studioの上位エディションにしかない機能が増えます。
</p>
<h2>アプリのライフサイクル管理<br />
</h2>
<p>開発チームという視点から、ビジネス全体へと視野が広がっているのには、時代の変化という背景もあります。
</p>
<ul style="margin-left:39pt;">
<li>
<div>パッケージ売りから継続運用への変化
</div>
<ul>
<li>昔は、一度リリースしてしまったらもうおしまい（あるいは、バージョン アップまで結構間が空く）でしたが、今は、ウェブなどで、継続的に要望が入り、継続的に開発を行う必要があります
</li>
</ul>
</li>
<li>
<div>アジャイル開発
</div>
<ul>
<li>最初に要望を聞いて終わりではなく、細かい単位で要望や優先度の見直しが行われるようになっています
</li>
<li>そもそも、世情の変化も早く、要望自体が短期間で変化します
</li>
</ul>
</li>
</ul>
<p>開発チームだけで閉じていては、世情の変化に迅速に対応することができず、ビジネスの機会を失います。
</p>
<p>アプリは、開発だけがすべてではありません。開発の前段階の要求の洗い出し、リリース後の運用、さらに、フィードバックを受けての次段階の検討まで含めたライフサイクルの管理が必要です。この考え方に対して、ここ数年で、ALM（Application Lifecycle Management）という呼び名も生まれました。
</p>
<h2>ビジネスにかかわる関係各者<br />
</h2>
<p>開発チームからビジネス全体へという話をもう少し掘り下げてみましょう。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122311_1026_2.png?w=490" alt="" />
	</p>
<p>プロジェクトが大きくなればなるほど分業化が進むわけですが、以下のようなポジションに分かれることになります。
</p>
<ul style="margin-left:39pt;">
<li>
<div>統制
</div>
<ul>
<li>意思決定者です
</li>
<li>何を作る、何を優先する、何にどれだけのお金を投資するなどの最終判断を下します
</li>
<li>受託開発の場合だと、顧客との折衝なども含まれます
</li>
</ul>
</li>
<li>
<div>開発
</div>
<ul>
<li>アプリ開発も、いろいろな人員の協業で成り立っています
</li>
<li>（狭義に）開発
</li>
<li>実際にアプリを設計し、コーディングします
</li>
<li>
<div>進行管理
</div>
<ul>
<li>チーム内の開発状況に遅れがないか、あるなら解決方法は何かなど、チームの進行状況の管理や他チーム/統制との折衝を行います
</li>
</ul>
</li>
<li>
<div>テスト
</div>
<ul>
<li>開発者本人のテスト記述では漏れるような第3者視点でのテスト、結合テスト、手動テストなどを行います
</li>
</ul>
</li>
<li>
<div>UX（ユーザー体験）デザイン
</div>
<ul>
<li>人文科学的視点や、美術的な視点からアプリの操作性や外観を設計します
</li>
</ul>
</li>
</ul>
</li>
<li>
<div>運用
</div>
<ul>
<li>アプリ公開後、継続的にサーバーの管理や不具合報告、エンド ユーザーからのフィードバック受け付けなどを行います
</li>
</ul>
</li>
</ul>
<p>
 </p>
<p>個別の視点、個々人の戦術的な視点だけではプロジェクトは成功しません。全体を戦略的に眺める視点が必要です。
</p>
<p>広い範囲全体を眺めるというのは、言うほどたやすいことではありません。ソフトウェア開発に対する要求が高度化するにつれ、この全体の把握を補助するツールの存在が重要になっています。
</p>
<h2>TFS<br />
</h2>
<p>チーム全体の共同作業を支援するため、（クライアント アプリである）Visual Studioの他に、サーバー製品も提供されています。それが、<a href="http://www.microsoft.com/japan/visualstudio/products/2010-editions/team-foundation-server/overview">TFS</a>（Team Foundation Server）です。
</p>
<p>Visual Studioとの連携（Visual Studio上からのソースコードや作業項目管理）に加えて、<a href="http://sharepoint.microsoft.com/ja-jp/Pages/default.aspx">SharePoint</a>ベースの管理ポータル ウェブ サイトを持っています。
</p>
<p>今後は、Azure上に構築され、オン デマンドに使えるクラウド版TFS、Team Foundation Serviceも提供される予定です（現在、<a href="http://tfspreview.com/">招待性のベータ版</a>）。
</p>
<h2>Visual Studio 2010/TFSの機能<br />
</h2>
<p>現状のVisual Studioが持っている機能を簡単に紹介しておきましょう。「ビジネス全体」の視点の機能は現在も拡充途中で、次期バージョンでもいろいろと新機能が入る予定です。
</p>
<h3>コーディング<br />
</h3>
<ul style="margin-left:39pt;">
<li>コードの補完
</li>
<li>リアルタイムなビルド/エラー検知
</li>
<li>コードの構文ハイライト
</li>
<li>検索
</li>
<li>
<div>リファクタリング
</div>
<ul>
<li>メソッド化、フィールドからプロパティの生成、変数/メンバー名変更
</li>
</ul>
</li>
<li>
<div>メンバー生成
</div>
<ul>
<li>先にメソッドなどを使う側のコードを書いて、そこから未実装のメンバーを作る
</li>
</ul>
</li>
</ul>
<h3>デバッグ<br />
</h3>
<ul style="margin-left:39pt;">
<li>
<div>ステップ実行
</div>
<ul>
<li>1行ずつ実行しながら、変数の状態などの変化を見る
</li>
</ul>
</li>
<li>
<div>ブレイク ポイント
</div>
<ul>
<li>特定の行を通った時に1度実行を止める
</li>
</ul>
</li>
<li>
<div>デバッグ情報の履歴保持（IntelliTrace）
</div>
<ul>
<li>デバッグ実行時の状態変化の履歴を、チーム内の別の誰かにそのまま渡して再現する機能
</li>
</ul>
</li>
</ul>
<h3>コード分析<br />
</h3>
<ul style="margin-left:39pt;">
<li>
<div>メトリック（metric: 測定基準、数値化した指標）計算
</div>
<ul>
<li>バグを起こしがちなソースコードを判定するための指標を出す
</li>
</ul>
</li>
<li>
<div>プロファイリング
</div>
<ul>
<li>性能分析
</li>
</ul>
</li>
</ul>
<h3>テスト<br />
</h3>
<ul style="margin-left:39pt;">
<li>単体テストの生成
</li>
<li>
<div>テストの選択的実行
</div>
<ul>
<li>現在カーソルのあるメソッドに関連する部分だけとか、修正した部分だけとか
</li>
</ul>
</li>
<li>
<div>テストの自動実行
</div>
<ul>
<li>TFS上で、ソースコードのコミット直後や、所定の時間にテストを実行
</li>
<li>テストに通っていないコードをソースコード管理サーバーに反映させないということも可能
</li>
</ul>
</li>
<li>
<div>多環境テスト
</div>
<ul>
<li>仮想マシン上にいろいろな環境を構築して、その上でのテスト実行
</li>
</ul>
</li>
<li>手動テストの作業項目管理/バグ レポート
</li>
<li>UIの自動テスト
</li>
<li>負荷テスト
</li>
</ul>
<h3>進捗管理<br />
</h3>
<ul style="margin-left:39pt;">
<li>作業項目管理
</li>
<li>
<div>状況の可視化
</div>
<ul>
<li>作業項目の消化度合い
</li>
<li>残りのバグ数
</li>
<li>各種メトリック
</li>
</ul>
</li>
</ul>
<h2>補足<br />
</h2>
<p>
 </p>
<h3>失敗の教科書<br />
</h3>
<p>教科書的なプロジェクト管理/評価指標や、ツールによるその補助を軽視していませんか？
</p>
<p>「これをやれば成功する」なんてものがないのは明白です。そんなのがあればみんなやります。しかし、「ここを外したら失敗する」みたいなものは、結構あります。教科書は、「成功するためのもの」ではなくても、「失敗しないためのもの」ではありえます。それをおろそかにして、失敗していませんか？
</p>
<p>Visual Studioは、Premium版以上を買うと、様々なメトリックを計算して出してくれます。これもその「失敗しないためのもの」の一種です。数字を良くすればプロジェクトが成功するというものではないですが、数字が悪いほどプロジェクト失敗の確率が上がります。
</p>
<h3>統計的な研究あり<br />
</h3>
<p>各種メトリックと、プロジェクトの欠陥に関する統計的な研究も、Microsoft Researchから出ていたりします。
</p>
<ul style="margin-left:39pt;">
<li><a href="http://research.microsoft.com/en-us/news/features/nagappan-100609.aspx">Exploding Software-Engineering Myths</a>
		</li>
</ul>
<p>ここでは、プロジェクトの欠陥の指標として、「リリース後に発見されたバグの数」と各種メトリックの適合率を求めているようです。Visual Studioが計算してくれるようなコードがらみのメトリックとは、大まかに、70～80％くらいの適合率が出ているようです。
</p>
<p>そして、実は、組織的なメトリック（何社かかわっているかとか、チーム内のエンジニアの人数とか、ちょっとだけかかわって辞めていったエンジニアの人数とか）の方が重要で、コードがらみのメトリックよりもプロジェクト欠陥との適合率が高い（85％程度）という報告もあります。
</p>
<p>また、地理的な距離よりも、組織的な距離の方が如実に欠陥に現れるそうです。何kmも離れた場所にいる同社同僚の方が、すぐ隣の他社出向社員よりも、心理的には「近い」とか。
</p>
<h3>マイクロソフト内の開発プロセス<br />
</h3>
<p>マイクロソフトは、社内の開発プロセスがどういう風になっているかもオープンにしていたりします。
</p>
<ul style="margin-left:39pt;">
<li>参考: <a href="http://www.publickey1.jp/blog/10/post_107.html">マイクロソフトにおけるアジャイル開発はこんな風に進められている</a>
		</li>
</ul>
<p>
 </p>
<p>マイクロソフトでは、例えば<a href="http://blogs.msdn.com/b/somasegar/archive/2010/04/08/dogfooding-vs-2010-and-net-4.aspx">Visual Studioという製品だけを取ってみても3500人以上</a>の人間が開発にかかわっています。これだけの人数を一括して管理できるわけはなくて、以下のような分散管理になっています。
</p>
<ul style="margin-left:39pt;">
<li>
<div>10人程度のチームに分かれています
</div>
<ul>
<li>進行管理1名、開発5名以下、テスト5名以下
</li>
</ul>
</li>
<li>
<div>開発手法はそれぞれのチームが自由にやっていい。ただし、
</div>
<ul>
<li>報告を義務付け
</li>
<li>コミット前にクオリティ チェックがある
</li>
</ul>
</li>
</ul>
<p>そして、分散した開発状況全体を把握するために、TFSの可視化機能が使われています。また、開発とテストの比率がほぼ1対1なことも注目に値するでしょう。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/146/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=146&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/23/%e5%80%8b%e4%ba%ba%e3%81%8b%e3%82%89%e3%83%81%e3%83%bc%e3%83%a0%e3%81%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122311_1026_1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122311_1026_2.png" medium="image" />
	</item>
		<item>
		<title>単体テスト</title>
		<link>http://csharptan.wordpress.com/2011/12/22/%e5%8d%98%e4%bd%93%e3%83%86%e3%82%b9%e3%83%88/</link>
		<comments>http://csharptan.wordpress.com/2011/12/22/%e5%8d%98%e4%bd%93%e3%83%86%e3%82%b9%e3%83%88/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 01:01:17 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=142</guid>
		<description><![CDATA[プログラミング始めたての初心者、特に学生さんが相手だったりする場合、いつもこう言っています: Visual Studio、まずは無料版のExpressでいいですよ。商用利用も可能です。C#に関していうと、コンパイラーの性能制限みたいなのもないです。   さて、じゃあ、こんな疑問も浮かぶかと思います: なんで有償版があるの？それでなんでみんなProfessionalを買うの？   その答えの1つが、今日お話しする単体テストです。ということで、今日のお話は、Express版では試せなかったり…。逆に、普段からProfessionalよりも上のグレードを使いこなしてる人には少し退屈かも。 下準備: 今回のテスト対象 今日はベタに、簡単な計算をするメソッドを作って、それの単体テストをしてみましょう。 とりあえず、物自体（つまり、テストの対象）を作ります。UIも何もなし、ライブラリだけ作りましょう。名前は、取り合えず、適当にMyMathとかつけておきます。   プロジェクトを作ると、Class1.csというファイルができていると思います。まず、こいつをCalculator.csにリネームしてください。 ソリューション エクスプローラーでリネームすると、ファイル名だけじゃなく、中のクラスもClass1からCalculatorに変わるはずです。 まあ、簡単な例ということで、ただ単に足し算するだけのAddメソッドでも作ってみましょうか。Calculatorクラス内に、以下のようなコードを追加してください。 public static int Add(int x, int y){    return x + y;}   テスト プロジェクト/テスト メソッドを作ってみよう そして、このAddメソッドを右クリック。コンテキスト メニュー内に、「単体テストの作成」というのがあるので、これをクリックしてください。 以下のようなダイアログ画面が出てくるので、OKを押しましょう。 初回は、「テスト用のプロジェクトを作りますか？」みたいなメッセージが出てくるはずなので、適当な名前を付けて「はい」を押してください。今回は、手抜きもいいところですが、デフォルトでつく名前、TestProject1のままで行きます。   以下のようなテスト用メソッドができてるはずです。 [TestMethod()]public void AddTest(){    int x = 0; // TODO: 適切な値に初期化してください    int y = 0; // TODO: 適切な値に初期化してください    int expected = 0; // TODO: 適切な値に初期化してください    int actual;    actual = Calculator.Add(x, y);    Assert.AreEqual(expected, actual);    Assert.Inconclusive(&#8220;このテストメソッドの正確性を確認します。&#8220;);} テストになるように、中身を書き換えます。まあ、例えば以下のような感じ。 [TestMethod()]public void AddTest(){    Assert.AreEqual(3, Calculator.Add(1, 2)); // 本当のテストでは、もっとバリエーション持たせましょうね} テストで満たすべき条件を、Assertクラスの各種メソッドを使って書いていきます。この例の場合は、AreEqual、つまり、第1引数と第2引数の値が一致していないといけないという条件です。 テストを走らせてみよう まあ、この例程度ならテストが通って当然ではありますが… なんにしても、本当にテストが通るか、確認してみましょう。 メニューから[テスト]→[実行]→[ソリューションのすべてのテスト]を選ぶか、Cntrl+R, Aとショートカット キーを押してください。 今回は単純なテストが1個だけなので、一瞬でテストが終わると思います。「テスト結果」ウィンドウが現れます。 成功です！ こまめにテストを走らせると、安心してコードを書き換えられます。 Test First さて、こんな話もあります: テストを先に書け。 「テストがない」という状況を根絶するための工夫です。 実践してみましょう。まず、テスト クラス内（先ほどのAddTestメソッドの下にでも）に、以下のようなメソッドを追加してください。 [TestMethod()]public void GcdTest(){    var testData = new[]    {        new { X = 100, Y = 15, Z = 5 },        new { X = 144, Y = 81, Z = 9 },        new { X = 13*11*4, Y = 13*9*5, Z = 13 },        new { X = 1024, Y = 999*2, Z = 2 },        new { X = 13*11, Y = 9*8, Z = 1 },        new { X = 360, Y = 80, Z = 40 },        new { X = 10, Y = 10, Z = 10 },    };     foreach (var item in testData)    {        Assert.AreEqual(item.Z, Calculator.Gcd(item.X, item.Y));        Assert.AreEqual(item.Z, Calculator.Gcd(item.Y, item.X));    }} 最大公約数（greatest common divisor、略してGCD）を求める想定で、先にテストだけ書きました。この時点では、まだGcdメソッドも作っていないです。 メソッドがないので当然エラーになるわけですが、Visual [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=142&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>プログラミング始めたての初心者、特に学生さんが相手だったりする場合、いつもこう言っています:
</p>
<p>Visual Studio、まずは無料版のExpressでいいですよ。商用利用も可能です。C#に関していうと、コンパイラーの性能制限みたいなのもないです。
</p>
<p>
 </p>
<p>さて、じゃあ、こんな疑問も浮かぶかと思います:
</p>
<p>なんで有償版があるの？それでなんでみんなProfessionalを買うの？
</p>
<p>
 </p>
<p>その答えの1つが、今日お話しする単体テストです。ということで、今日のお話は、Express版では試せなかったり…。逆に、普段からProfessionalよりも上のグレードを使いこなしてる人には少し退屈かも。
</p>
<h2>下準備: 今回のテスト対象<br />
</h2>
<p>今日はベタに、簡単な計算をするメソッドを作って、それの単体テストをしてみましょう。
</p>
<p>とりあえず、物自体（つまり、テストの対象）を作ります。UIも何もなし、ライブラリだけ作りましょう。名前は、取り合えず、適当にMyMathとかつけておきます。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_1.png?w=490" alt="" />
	</p>
<p>
 </p>
<p>プロジェクトを作ると、<span style="font-family:Consolas;">Class1.cs</span>というファイルができていると思います。まず、こいつを<span style="font-family:Consolas;">Calculator.cs</span>にリネームしてください。
</p>
<p>ソリューション エクスプローラーでリネームすると、ファイル名だけじゃなく、中のクラスも<span style="font-family:Consolas;">Class1</span>から<span style="font-family:Consolas;">Calculator</span>に変わるはずです。
</p>
<p>まあ、簡単な例ということで、ただ単に足し算するだけの<span style="font-family:Consolas;">Add</span>メソッドでも作ってみましょうか。<span style="font-family:Consolas;">Calculator</span>クラス内に、以下のようなコードを追加してください。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">public<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> Add(<span style="color:blue;">int<span style="color:black;"> x, <span style="color:blue;">int<span style="color:black;"> y)<br />{<br />    <span style="color:blue;">return<span style="color:black;"> x + y;<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>
 </p>
<h2>テスト プロジェクト/テスト メソッドを作ってみよう<br />
</h2>
<p>そして、この<span style="font-family:Consolas;">Add</span>メソッドを右クリック。コンテキスト メニュー内に、「単体テストの作成」というのがあるので、これをクリックしてください。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_2.png?w=490" alt="" />
	</p>
<p>以下のようなダイアログ画面が出てくるので、OKを押しましょう。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_3.png?w=490" alt="" />
	</p>
<p>初回は、「テスト用のプロジェクトを作りますか？」みたいなメッセージが出てくるはずなので、適当な名前を付けて「はい」を押してください。今回は、手抜きもいいところですが、デフォルトでつく名前、<span style="font-family:Consolas;">TestProject1</span>のままで行きます。
</p>
<p>
 </p>
<p>以下のようなテスト用メソッドができてるはずです。
</p>
<p style="background:white;"><span style="color:black;font-size:10pt;"><span style="font-family:Consolas;">[<span style="color:#2b91af;">TestMethod<span style="color:black;">()]<br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> AddTest()<br />{<br />    <span style="color:blue;">int<span style="color:black;"> x = 0; <span style="color:green;">// TODO: </span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> y = 0; <span style="color:green;">// TODO: </span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> expected = 0; <span style="color:green;">// TODO: </span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> actual;<br />    actual = <span style="color:#2b91af;">Calculator<span style="color:black;">.Add(x, y);<br />    <span style="color:#2b91af;">Assert<span style="color:black;">.AreEqual(expected, actual);<br />    <span style="color:#2b91af;">Assert<span style="color:black;">.Inconclusive(<span style="color:#a31515;">&#8220;</span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">このテストメソッドの正確性を確認します。</span><span style="color:#a31515;font-family:Consolas;">&#8220;<span style="color:black;">);<br />}<br />
</span></span></span></p>
<p>テストになるように、中身を書き換えます。まあ、例えば以下のような感じ。
</p>
<p style="background:white;"><span style="color:black;font-size:10pt;"><span style="font-family:Consolas;">[<span style="color:#2b91af;">TestMethod<span style="color:black;">()]<br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> AddTest()<br />{<br />    <span style="color:#2b91af;">Assert<span style="color:black;">.AreEqual(3, <span style="color:#2b91af;">Calculator<span style="color:black;">.Add(1, 2));<br />
														<span style="color:green;">// </span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">本当のテストでは、もっと<span style="color:green;">バリエーション持たせましょうね</span></span><span style="color:black;font-family:Consolas;"><br />}<br />
</span></span></p>
<p>テストで満たすべき条件を、<span style="font-family:Consolas;">Assert</span>クラスの各種メソッドを使って書いていきます。この例の場合は、<span style="font-family:Consolas;">AreEqual</span>、つまり、第1引数と第2引数の値が一致していないといけないという条件です。
</p>
<h2>テストを走らせてみよう<br />
</h2>
<p>まあ、<span style="font-family:ＭＳ 明朝;">この例程度ならテストが通って当然ではありますが…</span> なんにしても、本当にテストが通るか、確認してみましょう。
</p>
<p>メニューから[テスト]→[実行]→[ソリューションのすべてのテスト]を選ぶか、<span style="font-family:Consolas;">Cntrl+R, A</span>とショートカット キーを押してください。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_4.png?w=490" alt="" />
	</p>
<p>今回は単純なテストが1個だけなので、一瞬でテストが終わると思います。「テスト結果」ウィンドウが現れます。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_5.png?w=490" alt="" />
	</p>
<p>成功です！
</p>
<p>こまめにテストを走らせると、安心してコードを書き換えられます。
</p>
<h2>Test First<br />
</h2>
<p>さて、こんな話もあります: テストを先に書け。
</p>
<p>「テストがない」という状況を根絶するための工夫です。
</p>
<p>実践してみましょう。まず、テスト クラス内（先ほどの<span style="font-family:Consolas;">AddTest</span>メソッドの下にでも）に、以下のようなメソッドを追加してください。
</p>
<p style="background:white;"><span style="color:black;font-family:Consolas;font-size:10pt;">[<span style="color:#2b91af;">TestMethod<span style="color:black;">()]<br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> GcdTest()<br />{<br />    <span style="color:blue;">var<span style="color:black;"> testData = <span style="color:blue;">new<span style="color:black;">[]<br />    {<br />        <span style="color:blue;">new<span style="color:black;"> { X = 100, Y = 15, Z = 5 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 144, Y = 81, Z = 9 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 13*11*4, Y = 13*9*5, Z = 13 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 1024, Y = 999*2, Z = 2 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 13*11, Y = 9*8, Z = 1 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 360, Y = 80, Z = 40 },<br />        <span style="color:blue;">new<span style="color:black;"> { X = 10, Y = 10, Z = 10 },<br />    };</p>
<p>    <span style="color:blue;">foreach<span style="color:black;"> (<span style="color:blue;">var<span style="color:black;"> item <span style="color:blue;">in<span style="color:black;"> testData)<br />    {<br />        <span style="color:#2b91af;">Assert<span style="color:black;">.AreEqual(item.Z, <span style="color:#2b91af;">Calculator<span style="color:black;">.Gcd(item.X, item.Y));<br />        <span style="color:#2b91af;">Assert<span style="color:black;">.AreEqual(item.Z, <span style="color:#2b91af;">Calculator<span style="color:black;">.Gcd(item.Y, item.X));<br />    }<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>最大公約数（greatest common divisor、略してGCD）を求める想定で、先にテストだけ書きました。この時点では、まだ<span style="font-family:Consolas;">Gcd</span>メソッドも作っていないです。
</p>
<p>メソッドがないので当然エラーになるわけですが、Visual Studioを使っていると、エラー個所に以下のようなスマート タグが現れるはずです。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_6.png?w=490" alt="" />
	</p>
<p>この「メソッド スタブを生成します」を選んでみましょう。<span style="font-family:Consolas;">Calculator</span>クラス内に、以下のようなメソッドが自動生成されます。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">public<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:blue;">object<span style="color:black;"> Gcd(<span style="color:blue;">int<span style="color:black;"> p, <span style="color:blue;">int<span style="color:black;"> p_2)<br />{<br />    <span style="color:blue;">throw<span style="color:black;"> <span style="color:blue;">new<span style="color:black;"> <span style="color:#2b91af;">NotImplementedException<span style="color:black;">();<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>じゃあ、実装しましょうか、最大公約数。以下の通り。戻り値の型も、<span style="font-family:Consolas;">object</span>から<span style="font-family:Consolas;">int</span>に変えておきましょう。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">public<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> Gcd(<span style="color:blue;">int<span style="color:black;"> x, <span style="color:blue;">int<span style="color:black;"> y)<br />{<br />    <span style="color:blue;">while<span style="color:black;"> (<span style="color:blue;">true<span style="color:black;">)<br />    {<br />        <span style="color:blue;">var<span style="color:black;"> r = x % y;<br />        <span style="color:blue;">if<span style="color:black;"> (r == 0) <span style="color:blue;">return<span style="color:black;"> y;<br />        x = y;<br />        y = r;<br />    }<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>再びテストを実行して、成功を確認しましょう。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122211_0101_7.png?w=490" alt="" />
	</p>
<h2>Expressの場合: せめてテスト用のコンソール アプリを<br />
</h2>
<p>この、Visual Studio組み込みの単体テストのいいところは、
</p>
<ul style="margin-left:39pt;">
<li>
<div>どの範囲のテストを実行するか選んだりもできる
</div>
<ul>
<li>今、エディター上でカーソルのあるメソッドのテストだけ実行するとか
</li>
<li>前回失敗したところだけ実行とかも
</li>
</ul>
</li>
<li>チーム開発機能と組み合わせて、テストに通ったソース コードしか、管理サーバーにコミット（commit: 約束する、制約する。この場合、「ちゃんとできたから責任もってサーバーに反映するね」という意味）できないようにできる
</li>
</ul>
<p>等々あります。
</p>
<p>
 </p>
<p>まあ、そこまでやらずとも、とりあえずテスト コードを書くだけなら、適当にコンソール アプリでも作って、そこにテストを書けば大丈夫です。この方法なら、Visual C# Expressでもテストが書けます。
</p>
<h3>NUnit<br />
</h3>
<p>ちなみに、<a href="http://nunit.org/">NUnit</a>という、オープンソースな単体テスト フレームワークもあって、こいつはExpress版にも対応しているそうなので、ぜひとも導入を検討してみてください。
</p>
<h2>privateメンバーのテスト<br />
</h2>
<p>さて、privateなメンバーのテストはどうしましょう？プログラミング言語によっては、「privateだとテストできなくなるし、全部publicで作ればいいんじゃない？」なんていう人もいるみたいです。
</p>
<p>が、Visual Studioではそんな心配不要です。Visual Studioが、リフレクションを使ってprivateメンバーに無理やりアクセスするAccessorクラスというのを作ってくれます。
</p>
<p>例えば、<span style="font-family:Consolas;">Calculator</span>クラスに以下のようなメソッドを追加してみましょう。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">private<span style="color:black;"> <span style="color:blue;">static<span style="color:black;"> <span style="color:blue;">int<span style="color:black;"> PrivateMul(<span style="color:blue;">int<span style="color:black;"> x, <span style="color:blue;">int<span style="color:black;"> y)<br />{<br />    <span style="color:blue;">return<span style="color:black;"> x * y;<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>こいつを、右クリックして「単体テストの作成」すると、以下のようなテスト メソッド（と、Accessor）が作られます。
</p>
<p style="background:white;"><span style="color:black;font-size:10pt;"><span style="font-family:Consolas;">[<span style="color:#2b91af;">TestMethod<span style="color:black;">()]<br />[<span style="color:#2b91af;">DeploymentItem<span style="color:black;">(<span style="color:#a31515;">"MyMath.dll"<span style="color:black;">)]<br /><span style="color:blue;">public<span style="color:black;"> <span style="color:blue;">void<span style="color:black;"> PrivateMulTest()<br />{<br />    <span style="color:blue;">int<span style="color:black;"> x = 0; <span style="color:green;">// TODO: </span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> y = 0; <span style="color:green;">// TODO: </span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> expected = 0; <span style="color:green;">// TODO: </span></span></span></span><span style="font-family:ＭＳ ゴシック;">適切な値に初期化してください</span><span style="font-family:Consolas;"><br />    <span style="color:blue;">int<span style="color:black;"> actual;<br />    actual = <span style="color:#2b91af;">Calculator_Accessor<span style="color:black;">.PrivateMul(x, y);<br />    <span style="color:#2b91af;">Assert<span style="color:black;">.AreEqual(expected, actual);<br />    <span style="color:#2b91af;">Assert<span style="color:black;">.Inconclusive(<span style="color:#a31515;">&#8220;</span></span></span></span></span></span></span></span></span></span><span style="font-family:ＭＳ ゴシック;">このテストメソッドの正確性を確認します。</span><span style="color:#a31515;font-family:Consolas;">&#8220;<span style="color:black;">);<br />}<br />
</span></span></span></p>
<p><span style="font-family:Consolas;">Calculator_Accessor</span>というクラスが自動生成されていて、こいつは、<span style="font-family:Consolas;">Calculator</span>のprivateメンバーを、リフレクションを使って無理やりpublicにアクセスできるようにしたものです。
</p>
<h2>便利ツール<br />
</h2>
<p>最後に、単体テストで使える便利ツールを紹介しておきましょう。
</p>
<h3>Pex<br />
</h3>
<p>メソッドの中身に応じてテスト コードを生成してくれるVisual Studioアドインです。テスト漏れが起きないように、きわどいケースなんかを生成してくれます。
</p>
<p>（メソッドの中身を気にせず、仕様を元に「このメソッドはこうあるべき」みたいなテストを書くことをブラック ボックス テストと言います。一方、Pexのように、中身を想定して、はまりがちなテスト ケースを書くことをホワイト ボックス テストと言います。）
</p>
<ul style="margin-left:39pt;">
<li><a href="http://research.microsoft.com/en-us/projects/pex/">Pex and Moles &#8211; Isolation and White box Unit Testing for .NET</a>
		</li>
</ul>
<h3>Moles<br />
</h3>
<p>Pexの付属品なんですが、標準ライブラリ内のメソッドを自作のものに置き換えてしまう機能を提供するツールです。
</p>
<p>例えば、<span style="font-family:Consolas;">DateTime.Now</span>のような、常に違う値を返すメソッドを、所望の値を返すように書き換えてしまうというような使い方ができます。
</p>
<h3>Moq<br />
</h3>
<p><a href="http://csharptan.wordpress.com/2011/12/16/%e5%8b%95%e7%9a%84%e5%87%a6%e7%90%86/">動的処理</a>の回で書きましたが、テストのお供にモック（mock: 模造品）生成フレームワークがあります。
</p>
<p>代表例は<a href="http://code.google.com/p/moq/">Moq</a>などです。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/142/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=142&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/22/%e5%8d%98%e4%bd%93%e3%83%86%e3%82%b9%e3%83%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_2.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_3.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_4.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_5.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_6.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122211_0101_7.png" medium="image" />
	</item>
		<item>
		<title>それでもクロス ターゲット</title>
		<link>http://csharptan.wordpress.com/2011/12/21/%e3%81%9d%e3%82%8c%e3%81%a7%e3%82%82%e3%82%af%e3%83%ad%e3%82%b9-%e3%82%bf%e3%83%bc%e3%82%b2%e3%83%83%e3%83%88/</link>
		<comments>http://csharptan.wordpress.com/2011/12/21/%e3%81%9d%e3%82%8c%e3%81%a7%e3%82%82%e3%82%af%e3%83%ad%e3%82%b9-%e3%82%bf%e3%83%bc%e3%82%b2%e3%83%83%e3%83%88/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 00:49:45 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=133</guid>
		<description><![CDATA[Write once, run anywhereだって？まずはそのふざけた幻想をぶち殺す！   まあ、全部は無理です、全部は。ただ、だからこそ、どこでも使えるコードと、どこでもは使えないコードは分けて考えましょう。 昨日は、UI層（ビュー）からロジックを分離しましょうという話をしましたが、ビューがrun anywhereしにくい部分だからというのもあります。 ロジック部分の分離 前に、こんな絵を描きました。 この絵の趣旨は、 処理の中核的なロジック部分は、GUI部分とは分離して作りましょう。 文字ベースでも使えるように作るのがコツです。 という話でした。 こうして分離した純粋なロジック部分は、かなりクロス ターゲットに作れるはずです。 いっそ、プロジェクトを分けて作ってしまうのがおすすめです。 これくらい徹底しないと、ほっとくとすぐにビューやコントローラーにロジックを書いちゃう人が出てきます。何度言ってもすぐに。   ちなみに、C#以外への移植が必要な場面（あるいはその逆、他言語からC#への移植）もあるかと思います。その場合でも、中核ロジックだけきっちり分離してある方が、移植は楽でしょうねぇ。 &#8220;ターゲット&#8221; &#8220;クロス&#8221;の話をする前に、クロスにしたい&#8221;ターゲット&#8221;についてさらっと。いくつかの視点があります。 プラットフォーム OSやデバイス、何を使うか マウス/タッチ操作か、スクリプトか わざわざ覚えなくても使いやすいのはGUI 操作を記録しておいたり、一括処理したりしやすいのはCUI サーバーかクライアントか どちら側で処理するか 当たり前ですが、ターゲットが変われば書かなきゃいけないコードも変わります。しかし、そのターゲットごとに書かなきゃいけないコードと、どれでも共通して使えるコードはしっかり分けて作りましょう。 例え、当初予定として、単一のターゲットしか予定になかったとしてもです。 予定は変わるものです 普段から癖をつけておくことで、必要になった時にあわてないようにしましょう これが意識できれば、自然とテストしやすいコードにもなります   ロジックの分離の効用 いくつか、効用が得られる状況を見ていきましょう。 UIは陳腐化が激しい まあ、デバイス自体も変わりますから。この数年、ここまで急激にスマホが伸びると思っていなかった人も多いんじゃないでしょうか。気が付いたらコロッと変わっています。 当然、既存アプリをスマホに対応させてくれなんて要望も多いんじゃないでしょうかねぇ。予想できない勢いで、そういう要望がどんどん出てきます。 そして、UI層まで含めたクロス プラットフォーム開発が現実的でないとなると、ロジックをきっちり分離しておかないと痛い目を見ます。 ユーザーの手動操作ばかりじゃない システムに、プログラム的にアクセスしたい場合も多いです。 CUI提供 サービス化 CUI提供 まず、CUIに関してですが、CUIの回で説明した通り、サーバー アプリなどでは、GUIとCUIを両方提供することが望まれます。今、おすすめなのは、PowerShellのCmdlet化してしまうことです。 サービス化 サービス化というのは、システム全体を1枚板に作るんじゃなくて、部品ごとに切り分けて作ってプログラム的に呼べるようにしておくことです。それぞれの部品を「サービス」と呼びます。代表的なのは、ウェブ越しのサービスを呼べるようにしておく「ウェブ サービス化」でしょう。今だと、いわゆるREST APIにしておくのが無難だと思います。 前述の通り、UIは陳腐化が激しく、割と頻繁に作り直しや追加の要件がでます。そして、その時に、元と同じ開発者を使えるとは限らないのです。部品の切り出しをしておかないと、引き継ぎのコストも跳ね上がります。 あるいは、システム開発会社に依頼するほどでもない、ほんのちょっとしたツールが欲しくなることもあるでしょう。サービスAPIがちゃんと公開されていたら、案外内製も簡単だったりします。 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=133&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Write once, run anywhereだって？まずはそのふざけた幻想をぶち殺す！
</p>
<p>
 </p>
<p>まあ、全部は無理です、全部は。ただ、だからこそ、どこでも使えるコードと、どこでもは使えないコードは分けて考えましょう。
</p>
<p>昨日は、UI層（ビュー）からロジックを分離しましょうという話をしましたが、ビューがrun anywhereしにくい部分だからというのもあります。
</p>
<h2>ロジック部分の分離<br />
</h2>
<p>前に、こんな絵を描きました。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122111_0049_1.png?w=490" alt="" />
	</p>
<p>この絵の趣旨は、
</p>
<ul>
<li>処理の中核的なロジック部分は、GUI部分とは分離して作りましょう。
</li>
<li>文字ベースでも使えるように作るのがコツです。
</li>
</ul>
<p>という話でした。
</p>
<p>こうして分離した純粋なロジック部分は、かなりクロス ターゲットに作れるはずです。
</p>
<p>いっそ、プロジェクトを分けて作ってしまうのがおすすめです。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122111_0049_2.png?w=490" alt="" />
	</p>
<p>これくらい徹底しないと、ほっとくとすぐにビューやコントローラーにロジックを書いちゃう人が出てきます。何度言ってもすぐに。
</p>
<p>
 </p>
<p>ちなみに、C#以外への移植が必要な場面（あるいはその逆、他言語からC#への移植）もあるかと思います。その場合でも、中核ロジックだけきっちり分離してある方が、移植は楽でしょうねぇ。
</p>
<h2>&#8220;ターゲット&#8221;<br />
</h2>
<p>&#8220;クロス&#8221;の話をする前に、クロスにしたい&#8221;ターゲット&#8221;についてさらっと。いくつかの視点があります。
</p>
<ul style="margin-left:39pt;">
<li>
<div>プラットフォーム
</div>
<ul>
<li>OSやデバイス、何を使うか
</li>
</ul>
</li>
<li>
<div>マウス/タッチ操作か、スクリプトか
</div>
<ul>
<li>わざわざ覚えなくても使いやすいのはGUI
</li>
<li>操作を記録しておいたり、一括処理したりしやすいのはCUI
</li>
</ul>
</li>
<li>
<div>サーバーかクライアントか
</div>
<ul>
<li>どちら側で処理するか
</li>
</ul>
</li>
</ul>
<p>当たり前ですが、ターゲットが変われば書かなきゃいけないコードも変わります。しかし、そのターゲットごとに書かなきゃいけないコードと、どれでも共通して使えるコードはしっかり分けて作りましょう。
</p>
<p>例え、当初予定として、単一のターゲットしか予定になかったとしてもです。
</p>
<ul style="margin-left:39pt;">
<li>予定は変わるものです
</li>
<li>普段から癖をつけておくことで、必要になった時にあわてないようにしましょう
</li>
<li>これが意識できれば、自然とテストしやすいコードにもなります
</li>
</ul>
<p>
 </p>
<h2>ロジックの分離の効用<br />
</h2>
<p>いくつか、効用が得られる状況を見ていきましょう。
</p>
<h3>UIは陳腐化が激しい<br />
</h3>
<p>まあ、デバイス自体も変わりますから。この数年、ここまで急激にスマホが伸びると思っていなかった人も多いんじゃないでしょうか。気が付いたらコロッと変わっています。
</p>
<p>当然、既存アプリをスマホに対応させてくれなんて要望も多いんじゃないでしょうかねぇ。予想できない勢いで、そういう要望がどんどん出てきます。
</p>
<p>そして、UI層まで含めたクロス プラットフォーム開発が現実的でないとなると、ロジックをきっちり分離しておかないと痛い目を見ます。
</p>
<h3>ユーザーの手動操作ばかりじゃない<br />
</h3>
<p>システムに、プログラム的にアクセスしたい場合も多いです。
</p>
<ul style="margin-left:39pt;">
<li>CUI提供
</li>
<li>サービス化
</li>
</ul>
<h4>CUI提供<br />
</h4>
<p>まず、CUIに関してですが、CUIの回で説明した通り、サーバー アプリなどでは、GUIとCUIを両方提供することが望まれます。今、おすすめなのは、PowerShellのCmdlet化してしまうことです。
</p>
<h4>サービス化<br />
</h4>
<p>サービス化というのは、システム全体を1枚板に作るんじゃなくて、部品ごとに切り分けて作ってプログラム的に呼べるようにしておくことです。それぞれの部品を「サービス」と呼びます。代表的なのは、ウェブ越しのサービスを呼べるようにしておく「ウェブ サービス化」でしょう。今だと、いわゆるREST APIにしておくのが無難だと思います。
</p>
<p>前述の通り、UIは陳腐化が激しく、割と頻繁に作り直しや追加の要件がでます。そして、その時に、元と同じ開発者を使えるとは限らないのです。部品の切り出しをしておかないと、引き継ぎのコストも跳ね上がります。
</p>
<p>あるいは、システム開発会社に依頼するほどでもない、ほんのちょっとしたツールが欲しくなることもあるでしょう。サービスAPIがちゃんと公開されていたら、案外内製も簡単だったりします。
</p>
<h4>ほぼ自動<br />
</h4>
<p>CUI提供にしろサービス化にしろ、中核ロジックをきっちりライブラリ化してあれば、作るのは非常に簡単です。コマンドや、ウェブ サービスAPIのURLと、プログラム コードの間でかなり単純なマッピングをするだけです。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/122111_0049_3.png?w=490" alt="" />
	</p>
<p>というか、このマッピング作業は完全自動化できるレベルです。
</p>
<h3>単体テスト<br />
</h3>
<p>ロジックの分離は、テストのしやすさにも影響します。前節の通り、プログラム的に扱いやすいようになっているはずなので、テストの自動化もしやすいです。
</p>
<p>そして、ロジックを分けましょうの回で説明した通り、テストをしないと死にます。あとから確実に泣きをみます。
</p>
<h3>サーバーとクライアント<br />
</h3>
<p>このご時世、処理はサーバー上で行って、クライアントは表示だけにすることも多いです。
</p>
<p>ところが、常にネットにつながっているわけじゃない。特に、最近はスマホが流行りですし、通信状況がコロコロ変わります。また、些細なことでいちいちサーバー上に問い合わせていたら、応答性が悪くてストレスフルになったり、帯域圧迫したりという問題もあるでしょう。
</p>
<p>そこで、特にゲームなんかだと多いんですが、サーバーと同じ処理をクライアント上でも行うことがあります。ここで1つ注意点としては、処理をクライアント側に移すんじゃなくて、両方で2重に処理する必要があります。クライアント上で計算した結果はあくまでキャッシュ的な扱いで、本当にサーバー側と不整合がないか、どこかで同期をとる必要があります。あるいは、ゲームだと深刻な問題になりますが、クライアントだけで処理してしまうと、いわゆるチート プレイがし放題です。
</p>
<p>こういうとき、どちらでも使える状態でライブラリ化してあれば、何の苦労もありません。単一コードを、2つのプロジェクトから参照するだけです。
</p>
<p>まあ、現実は…HTMLアプリとかでクライアントがJavaScriptになってしまうと、その夢はもろくも崩れ去るわけですが…。とはいえ、前述の通り、移植をするにしても、ロジックを分離してる方が楽です。
</p>
<p>
 </p>
<p>少し余談。ひどいものだと、仕様書もくそもなくて、「Flashが仕様みたいなものだから、Flash開発担当の人に聞いて同じものを実装して」みたいな話も…ざらに。
</p>
<h2>まとめ<br />
</h2>
<p>いろんなターゲットがあります。
</p>
<ul style="margin-left:39pt;">
<li>UI技術の入れ替わり
</li>
<li>GUIかCUIか
</li>
<li>サーバー処理かクライアント処理か
</li>
</ul>
<p>UIまで含めたクロス ターゲットは非現実でも、中核となる処理はだいたいどのターゲットでも動くはず、とういか、動くように作れるべき。
</p>
<p>テストもしやすくなりますし、もし別の言語に移植する必要があるときも、ずいぶん楽になると思います。
</p>
<p>どのターゲットに対しても使える処理は、独立したライブラリとして作ることをお勧めします。
</p>
<p>
 </p>
<h2>補足<br />
</h2>
<p>今回も何点か補足。
</p>
<h3>Portable Class Library<br />
</h3>
<p>.NET Frameworkといっても、参照可能なクラス ライブラリの範囲が変わる、プロファイル（profile）というものを何種類か持っています。
</p>
<p>どのプロファイルからでも使えるライブラリを作るためには、Portable Class Libraryという特別なプロジェクトを作る必要があります。
</p>
<ul style="margin-left:39pt;">
<li>Visual Studio 2010では、<a href="http://visualstudiogallery.msdn.microsoft.com/b0e0b5e9-e138-410b-ad10-00cb3caf4981">Portable Library Tools</a>という拡張を入れる必要があります（拡張マネージャーからインストール可能）
</li>
<li>次期バージョンのVisual Studioには標準搭載される予定です
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/gg597391.aspx">Portable Class Libraryで使えるクラス一覧</a>
		</li>
</ul>
<p>今回説明したような、「中核ロジックを独立させたライブラリ」を作るなら、このPotable Class Libraryを使うのがいいでしょう。
</p>
<h3>C#→JavaScript<br />
</h3>
<p>Googleは結構、JavaからJavaScriptコードを生成してるんでしたっけ？まあ、ですよねー。
</p>
<p>.NET界隈でも、C#からJavaScriptコードを生成するようなツールが結構あります。有名なものでは、<a href="http://projects.nikhilk.net/ScriptSharp">Script#</a>など。
</p>
<h3>サービスのメタデータ交換<br />
</h3>
<p>サービス化するということは、ある誰かがサービスを作って、別のある誰かがそのサービスを参照することになります。そして、通常、両者がソースコードを共有することはないので、「ソース コード → サービスAPI化」のマッピングとは逆に、「サービスAPI → ソース コード」のマッピングもほしかったりします。
</p>
<p>そのために、「このサービスはこんなAPI、こんなデータを公開しています」というような情報（メタデータ）も公開したいです。ちゃんとこのメタデータが公開されていれば、サービスの利用側が非常に楽になります。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/133/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=133&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/21/%e3%81%9d%e3%82%8c%e3%81%a7%e3%82%82%e3%82%af%e3%83%ad%e3%82%b9-%e3%82%bf%e3%83%bc%e3%82%b2%e3%83%83%e3%83%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122111_0049_1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122111_0049_2.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122111_0049_3.png" medium="image" />
	</item>
		<item>
		<title>ロジックを分けましょう</title>
		<link>http://csharptan.wordpress.com/2011/12/20/%e3%83%ad%e3%82%b8%e3%83%83%e3%82%af%e3%82%92%e5%88%86%e3%81%91%e3%81%be%e3%81%97%e3%82%87%e3%81%86/</link>
		<comments>http://csharptan.wordpress.com/2011/12/20/%e3%83%ad%e3%82%b8%e3%83%83%e3%82%af%e3%82%92%e5%88%86%e3%81%91%e3%81%be%e3%81%97%e3%82%87%e3%81%86/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 01:51:09 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=127</guid>
		<description><![CDATA[本日はちょっとしたホラー話です。警告しても警告してもなくならないエンドレスな物語。 エターナル フォース ブリザード！ 効果: プロジェクトは死ぬ ビューとモデルの分離 みなさん、ちゃんとビューは薄く作っていますか？ビューやコントローラーにロジックを詰め込んじゃっていませんか？ まして、.aspx/.cshtml/.php/.jsp なんかのHTMLテンプレート部分にロジックを書いちゃっていませんか？ まあ、「ビューとモデルの分離」と言われてわかる人は、そりゃ分離しますわね。問題は、言われても何のことかわからない人。というか、わかってない人がプロジェクトに含まれている場合。 HTMLテンプレート中のロジック ASP.NET MVCのRazorエンジン、便利ですね。軽くもう、C#スクリプトですよこれ。C#書き放題！ とかやってて後から泣くわけですね。例えば、以下のようなコードを書いて。 @using System.Linq; @{ &#160;&#160;&#160; ViewBag.Title = &#34;ホーム&#160;ページ&#34;; } &#60;p&#62; @{ &#160;&#160;&#160; Sample[] items = ViewBag.Items; &#160;&#160;&#160; var i = items.First(); &#160;&#160;&#160; if (i != null) &#160;&#160;&#160; {&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;span&#62;@i.Name&#60;/span&#62; &#160;&#160;&#160; } } &#60;/p&#62; 「Itemsの先頭要素が、あれば表示したい」というつもりのコードです。つもり。LINQに慣れた人なら気づくと思うんですが、Itemsが0要素の時、このコードは例外を起こして止まります。よく見るあれ、 アプリケーションでサーバー エラーが発生しました。 あれが起きます。 問題はこの行ですね。 &#160;&#160;&#160; var [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=127&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>本日はちょっとしたホラー話です。警告しても警告してもなくならないエンドレスな物語。</p>
<p>エターナル フォース ブリザード！</p>
<p>効果: プロジェクトは死ぬ</p>
<h2>ビューとモデルの分離   <br /></h2>
<p>みなさん、ちゃんとビューは薄く作っていますか？ビューやコントローラーにロジックを詰め込んじゃっていませんか？</p>
<p>まして、.aspx/.cshtml/.php/.jsp なんかのHTMLテンプレート部分にロジックを書いちゃっていませんか？</p>
<p>まあ、「ビューとモデルの分離」と言われてわかる人は、そりゃ分離しますわね。問題は、言われても何のことかわからない人。というか、わかってない人がプロジェクトに含まれている場合。</p>
<h2>HTMLテンプレート中のロジック   <br /></h2>
<p>ASP.NET MVCのRazorエンジン、便利ですね。軽くもう、C#スクリプトですよこれ。C#書き放題！</p>
<p>とかやってて後から泣くわけですね。例えば、以下のようなコードを書いて。</p>
<p style="background:white;"><span style="color:black;font-size:10pt;"><span style="font-family:consolas;"><span style="background-color:yellow;">@</span><span style="color:blue;">using<span style="color:black;"> System.Linq;           <br /><span style="background-color:yellow;">@{</span>            <br />&#160;&#160;&#160; ViewBag.Title = <span style="color:#a31515;">&quot;</span></span></span></span><span style="font-family:ｍｓ ゴシック;">ホーム</span><span style="color:#a31515;"><span style="font-family:consolas;">&#160;</span><span style="font-family:ｍｓ ゴシック;">ページ</span><span style="font-family:consolas;">&quot;<span style="color:black;">;           <br /><span style="background-color:yellow;">}</span></span>
<p><span style="color:blue;">&lt;<span style="color:maroon;">p<span style="color:blue;">&gt;<span style="color:black;">                   <br /><span style="background-color:yellow;">@{</span>                    <br />&#160;&#160;&#160; <span style="color:#2b91af;">Sample<span style="color:black;">[] items = ViewBag.Items;                       <br />&#160;&#160;&#160; <span style="color:blue;">var<span style="color:black;"> i = items.First();                           <br />&#160;&#160;&#160; <span style="color:blue;">if<span style="color:black;"> (i != <span style="color:blue;">null<span style="color:black;">)                                   <br />&#160;&#160;&#160; {&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:blue;">&lt;<span style="color:maroon;">span<span style="color:blue;">&gt;<span style="color:black;"><span style="background-color:yellow;">@</span>i.Name<span style="color:blue;">&lt;/<span style="color:maroon;">span<span style="color:blue;">&gt;<span style="color:black;">                                                   <br />&#160;&#160;&#160; }                                                    <br /><span style="background-color:yellow;">}</span>                                                    <br /><span style="color:blue;">&lt;/<span style="color:maroon;">p<span style="color:blue;">&gt;<span style="color:black;">                                                           <br /></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>       </span></span></span></p>
<p>「Itemsの先頭要素が、あれば表示したい」というつもりのコードです。つもり。LINQに慣れた人なら気づくと思うんですが、Itemsが0要素の時、このコードは例外を起こして止まります。よく見るあれ、</p>
<p><span style="font-family:ｍｓ ゴシック;color:red;font-size:14pt;">アプリケーションでサーバー エラーが発生しました。     <br /></span></p>
<p>あれが起きます。</p>
<p>問題はこの行ですね。</p>
<p style="background:white;"><span style="color:black;font-size:10pt;"><span style="font-family:consolas;">&#160;&#160;&#160; <span style="color:blue;">var<span style="color:black;"> i = items.First(); <span style="color:green;">// First</span></span></span></span><span style="font-family:ｍｓ ゴシック;">は、要素がないとき例外発生</span><span style="font-family:consolas;">       <br /></span></span></p>
<p>正しくは、<span style="font-family:consolas;">FirstOrDefault</span>って書かないとダメです。</p>
<h3>さらに悪いことに   <br /></h3>
<p>「こんなのすぐに気づくよ」と思うかもしれません。しかし…これの悲劇は…</p>
<p>以下のような状況を想像してください。</p>
<ul style="margin-left:39pt;">
<li>
<div>このコードは自分で書いたものではありません       </div>
<ul>
<li>バージョン管理をしていて、updateをしたときに、他人の書いたコートが混ざったものです         </li>
</ul>
</li>
<li>
<div>ローカル実行では問題が出ませんでした       </div>
<ul>
<li>たまたま、自分の使っていたテスト データは要素0なデータが含まれていませんでした         </li>
</ul>
</li>
<li>
<div>ところが本番でだけエラーが出ました       </div>
<ul>
<li>再現条件がわからず、小一時間悩むことに         </li>
<li>そしてしばらくしてから気づく「あれ、私こんなコード書いたっけ？」         </li>
</ul>
</li>
</ul>
<p>とかいうのが起こりうる現実。</p>
<h2>問題と対策   <br /></h2>
<p><span style="font-family:consolas;">First</span>メソッドの仕様がどうとか以前の問題で、テストの自動化の習慣がないことが最大の問題ですね。あと、レビューをきっちり回すプロセスの欠如。</p>
<p>そして、テストの習慣がついてたら、cshtml中にロジックを書くのなんてもってのほか。</p>
<h3>GUIのテストは難しい   <br /></h3>
<p>一般に、GUIはテストがしにくいです。Coded UIテスト（プログラムでで「ボタンを押した」とかのイベントを起こして、ユーザー操作を疑似的に再現してUIのテストをする手法）なんかもなくはないですが。多くの場合、手作業確認になります。</p>
<p>前述の、「0要素の場合の確認が漏れ、本番環境でエラー」なんかも、手作業確認だから漏れるわけです。</p>
<h3>あくまでテンプレート   <br /></h3>
<p>cshtmlなどのファイルは、あくまでHTMLを生成するためのテンプレートです。</p>
<p>デスクトップ アプリに関してはこのAdvent Calendarでもちょこっとだけ話しましたが、以下のような、データ バインディングという仕組みを使って、UIからデータを分離します。</p>
<p><img alt="" src="http://csharptan.files.wordpress.com/2011/12/122011_0151_1.png?w=490" /></p>
<p>UI側の記述では、「ここにXを表示したい」というような印だけを入れておきます。</p>
<p>cshtmlでも、やるべきことは同じで、この手の印にあたるコードだけを書くべきです。</p>
<p><img alt="" src="http://csharptan.files.wordpress.com/2011/12/122011_0151_2.png?w=490" /></p>
<p>となると、書けることは限られてきます。cshtml中に残るC#コードは以下の程度なはずです。</p>
<ul style="margin-left:39pt;">
<li>一覧表示のためのforeachステートメント     </li>
<li>プロパティ参照（<span style="font-family:consolas;">@item.X</span>など）      </li>
<li>ごくごく簡単な分岐（例えば、0の時だけフォントや文字を変えたいとか）     </li>
</ul>
<h3>そしてテストを   <br /></h3>
<p>分離したデータの側は、単体テストを掛けれるはずです。掛けなきゃいけません。</p>
<p>今回話したようなちょっとしたコードですら、後から悩まされるわけです。テストなしで自信を持って書き換えられますか？</p>
<p>性能問題が出ているコードで、「たぶんここ直せば改善しそう。コード直すのは30分ほどなんですけども。テストがないからちょっと触れないですねぇ。」というもよく聞く話。納期が近づいてからでは遅いんです。最初から、テストを書く習慣を身に着けておかないと。</p>
<p>「スピードが大事なんでテストをしっかりやる時間がないんです」とか言って手を抜いて、あとから苦しむことになって、結局余計に時間がかかるなんてのもよく聞く話。よく聞く話で、よく警告話も耳にするのに、なぜか繰り返される悲劇。</p>
<h2>まとめ   <br /></h2>
<ul style="margin-left:39pt;">
<li>テストがないと後で死ぬ     </li>
<li>ビューにロジック書くとテストできなくて死ぬ     </li>
</ul>
<p>Visual Studioを使ったテストの話も、残りのAdvent Calendarのどこかでしましょうか。</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=127&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/20/%e3%83%ad%e3%82%b8%e3%83%83%e3%82%af%e3%82%92%e5%88%86%e3%81%91%e3%81%be%e3%81%97%e3%82%87%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122011_0151_1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/122011_0151_2.png" medium="image" />
	</item>
		<item>
		<title>WindowsとCUI</title>
		<link>http://csharptan.wordpress.com/2011/12/19/windows%e3%81%a8cui/</link>
		<comments>http://csharptan.wordpress.com/2011/12/19/windows%e3%81%a8cui/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 03:16:54 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=123</guid>
		<description><![CDATA[今日はCUIの話をします。 GUIじゃなくてCUI。グイじゃなくてキュイ。グラフィカルじゃなくて、キャラクター。マウスやタッチ操作じゃなくて、全部文字！ なんか鳴き声みたいですけどキュイ。ウェブで「キュイ」で画像検索したらたぶん吹き出しそうな結果が出てきますけど、キュイ。 アップデートしてますか？ みんな、自分の専門外のことについては驚くほど古い知識のまま更新されずにいます。10年前の話を平気でしてきます。きっと、10光年離れた場所から観測しています。 なので、「Windowsはコマンド プロンプトが使いにくいから…」なんてぼやく人がいても、その人を責めることはできないでしょう。 今はPowerShellがあるのに！ PowerShell 正規表現の回とかでもさらっと出しましたが、改めてご紹介いたしましょう。ザNEWコマンド ライン！！ PowerShell。 2006年に登場し、Windows 7やWindows Server 2008には標準搭載されています。 以下のような感じで使います（配色は私の好みで白背景に変えています）。 完全に文字だけのコマンド ラインに加えて、コード補完や色付け表示もしてくれるPowerShell ISE（Integrated Scripting Environment）も付属しています。 次期バージョンではISEのUIを一新するようですねぇ。今、CTP2（コミュニティ向け技術プレビュー版の第2版）ですが、以下のような感じになっています。コード補完回りが大幅強化されるようです。   GUI vs CUI 昨日に引き続き、「どっちがいいか？」という質問です。答えは「両方」！ GUIとCUI、それぞれいいところがあります。 やっぱり、初見のとっつきやすさでいうとグラフィカルな方がわかりやすいです。それに、可視化ってのも大事です。サーバーの状態などを一目瞭然に把握できるような、素敵UIはあった方がいいです。 一方で、繰り返し同じ処理をするような場合は、スクリプト言語を使った操作をしたいです。それに、GUIを付けるというのは、OSのサイズを大きくしますし、セキュリティ アップデートの頻度も増えます。GUIがなくて済むなら、なしで済ませたいです。前述の可視化なんかも、例えばサーバー クラスターだったりすると、クラスター管理している1台だけが持っていれば事足りたりしますし。 ということで、今のWindowsは、GUIにもCUIにも、両方に本気です。GUIに本気なのは当たり前として、CUIもおろそかにしていません。 コマンド ラインにもGUIを欠かさない もうすでに紹介していますが、PowerShellには、コードの補完や色付けをしてくれる便利なGUI、PowerShell ISEがあります。 手元のGUIありのクライアントOSでスクリプトを書いて、リモートのGUIなしサーバーOSで実行しましょう。 というか、PowerShellはリモート操作機能も備えていたり（手元のPowerShellコンソールでコマンドをたたいて、リモート上でジョブを動かす）。 PowerShell、急拡大中 PowerShellも登場から5年くらい経ち、だいぶこなれてきましたね。基礎がこなれたところで、応用が急速に進んでいます。 Windows Server 8 Window Serverの次期バージョン、今はコードネームでWindows Server 8なんて呼ばれていますが、Windows Server 8の方針としては、サーバー上で動くアプリは「GUIなしが必須」だそうです。 GUIの提供とともに、PowerShellのコマンド（Cmdlet（コマンドレット）といいます）の提供が必須です。 Windows Server 8自身の管理も、Cmdletでできるよう、大量のCmdletが追加されています。 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=123&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>今日はCUIの話をします。
</p>
<p>GUIじゃなくてCUI。グイじゃなくてキュイ。グラフィカルじゃなくて、キャラクター。マウスやタッチ操作じゃなくて、全部文字！
</p>
<p>なんか鳴き声みたいですけどキュイ。ウェブで「キュイ」で画像検索したらたぶん吹き出しそうな結果が出てきますけど、キュイ。
</p>
<h2>アップデートしてますか？<br />
</h2>
<p>みんな、自分の専門外のことについては驚くほど古い知識のまま更新されずにいます。10年前の話を平気でしてきます。きっと、10光年離れた場所から観測しています。
</p>
<p>なので、「Windowsはコマンド プロンプトが使いにくいから…」なんてぼやく人がいても、その人を責めることはできないでしょう。
</p>
<p>今はPowerShellがあるのに！
</p>
<h2>PowerShell<br />
</h2>
<p>正規表現の回とかでもさらっと出しましたが、改めてご紹介いたしましょう。ザNEWコマンド ライン！！ PowerShell。
</p>
<p>2006年に登場し、Windows 7やWindows Server 2008には標準搭載されています。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui1.png?w=490" alt="" />
	</p>
<p>以下のような感じで使います（配色は私の好みで白背景に変えています）。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui2.png?w=490" alt="" />
	</p>
<p>完全に文字だけのコマンド ラインに加えて、コード補完や色付け表示もしてくれるPowerShell ISE（Integrated Scripting Environment）も付属しています。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui3.png?w=490" alt="" />
	</p>
<p>次期バージョンではISEのUIを一新するようですねぇ。今、CTP2（コミュニティ向け技術プレビュー版の第2版）ですが、以下のような感じになっています。コード補完回りが大幅強化されるようです。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui4.png?w=490" alt="" />
	</p>
<p>
 </p>
<h2>GUI vs CUI<br />
</h2>
<p>昨日に引き続き、「どっちがいいか？」という質問です。答えは「両方」！ GUIとCUI、それぞれいいところがあります。
</p>
<p>やっぱり、初見のとっつきやすさでいうとグラフィカルな方がわかりやすいです。それに、可視化ってのも大事です。サーバーの状態などを一目瞭然に把握できるような、素敵UIはあった方がいいです。
</p>
<p>一方で、繰り返し同じ処理をするような場合は、スクリプト言語を使った操作をしたいです。それに、GUIを付けるというのは、OSのサイズを大きくしますし、セキュリティ アップデートの頻度も増えます。GUIがなくて済むなら、なしで済ませたいです。前述の可視化なんかも、例えばサーバー クラスターだったりすると、クラスター管理している1台だけが持っていれば事足りたりしますし。
</p>
<p>ということで、今のWindowsは、GUIにもCUIにも、両方に本気です。GUIに本気なのは当たり前として、CUIもおろそかにしていません。
</p>
<h3>コマンド ラインにもGUIを欠かさない<br />
</h3>
<p>もうすでに紹介していますが、PowerShellには、コードの補完や色付けをしてくれる便利なGUI、PowerShell ISEがあります。
</p>
<p>手元のGUIありのクライアントOSでスクリプトを書いて、リモートのGUIなしサーバーOSで実行しましょう。
</p>
<p>というか、PowerShellはリモート操作機能も備えていたり（手元のPowerShellコンソールでコマンドをたたいて、リモート上でジョブを動かす）。
</p>
<h2>PowerShell、急拡大中<br />
</h2>
<p>PowerShellも登場から5年くらい経ち、だいぶこなれてきましたね。基礎がこなれたところで、応用が急速に進んでいます。
</p>
<h3>Windows Server 8<br />
</h3>
<p>Window Serverの次期バージョン、今はコードネームでWindows Server 8なんて呼ばれていますが、Windows Server 8の方針としては、サーバー上で動くアプリは「GUIなしが必須」だそうです。
</p>
<p>GUIの提供とともに、PowerShellのコマンド（Cmdlet（コマンドレット）といいます）の提供が必須です。
</p>
<p>Windows Server 8自身の管理も、Cmdletでできるよう、大量のCmdletが追加されています。
</p>
<h3>Cmdlet拡充中<br />
</h3>
<p>Windows Server 8に限らず、マイクロソフトのサーバー製品関連はCmdlet提供が当たり前になってきています。次のバージョンで、軒並みCmdlet化されそうです。
</p>
<ul style="margin-left:39pt;">
<li>
<div>SQL Server 2012
</div>
<ul>
<li>すでに、2012年中のリリースが確定したようで、SQL Server 2012という名称でリリース候補版が出ています
</li>
<li>SQL Server Management Studio中に「PowerShellを起動」メニューがあったり
</li>
<li><span style="font-family:Consolas;">ls Tables</span> とかのコマンドでテーブル操作できたり
</li>
</ul>
</li>
<li>
<div>Windows Azure
</div>
<ul>
<li><a href="http://wappowershell.codeplex.com/">Windows Azure PowerShell Cmdlets</a>というものが提供されています
</li>
<li><a href="http://msdn.microsoft.com/en-us/library/hh689725(v=VS.103).aspx">Node.js向けのCmdlet</a>まで公開されていたり
</li>
</ul>
</li>
<li>
<div>Team Foundation Server
</div>
<ul>
<li><a href="http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f">Team Foundation Server Power Tools</a>の最新版にはCmdletが付いてくるようです
</li>
</ul>
</li>
</ul>
<h2>コマンドが主軸 ＋ オブジェクト指向も<br />
</h2>
<p>今までも、スクリプトでのOS管理というと、VBS、JSあったわけですが。PowerShellはあくまでコマンド ベースなのと、.NET統合が特徴的です。
</p>
<h3>コマンド ベース<br />
</h3>
<p>非開発者向け・IT管理者向けだと、コマンド形式の方が良いみたいですね。なので、主軸がコマンドにあります。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui5.png?w=490" alt="" />
	</p>
<p>PowerShell専用のCmdletと呼ばれるコマンドだけでなく、今まで通りの、単なるコンソール アプリも呼び出せます。
</p>
<h3>.NET統合<br />
</h3>
<p>一方で、ちょっと込み入った処理をしたいときには、C#的なオブジェクト指向なプログラムを書くこともできます。ライブラリ的には、.NET Frameworkのクラスをそのまま使えます。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui6.png?w=490" alt="" />
	</p>
<h3>モード切り替え<br />
</h3>
<p>PowerShellは、2系統の文法（に加えて、文字列中も特殊な処理が入るので、実質3系統）が混ざってて、状況に応じて切り替わっていたりします。
</p>
<ul style="margin-left:39pt;">
<li>
<div>コマンド モード
</div>
<ul>
<li>文字列から始めると、コマンドと解釈されます
</li>
<li>以降、引用符なしで文字列を受け付けます
</li>
<li><span style="font-family:Consolas;">- </span>付きの文字はオプション
</li>
</ul>
</li>
<li>
<div>式モード
</div>
<ul>
<li>$から始めると式モードと解釈されます
</li>
<li>
<div>以降、PerlっぽいようなC#っぽいようなOOP言語になります
</div>
<ul>
<li>if, switch, while, do-while, for, foreachなども使えます
</li>
<li><span style="font-family:Consolas;">.</span> でメソッド呼び出し、引数には<span style="font-family:Consolas;">()</span>必要、文字列には引用符必要
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>
 </p>
<p><span style="font-family:Consolas;">(</span> や <span style="font-family:Consolas;">=</span> の直後には、モードの再選択が行われます（<span style="font-family:Consolas;">=</span> の直後を文字列から始めると、コマンドと解釈されます）。
</p>
<h2>オブジェクト パイプライン<br />
</h2>
<p>コマンド モードであっても、.NETオブジェクトが中心的な役割りを担います。Cmdlet（PowerShell専用のコマンド）は、.NETオブジェクトを入出力に使います。
</p>
<p>一般的なコマンド ラインと同じく、<span style="font-family:Consolas;">|</span> （パイプ演算子）を使って複数のコマンドをつなげますが、つないだコマンドが両方Cmdletの場合、データが.NETオブジェクトのまま渡ります。
</p>
<p>例えば、以下の例を見てください。
</p>
<p><img src="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui7.png?w=490" alt="" />
	</p>
<p><span style="font-family:Consolas;">ls</span>コマンド（<span style="font-family:Consolas;">Get-ChildItem</span>というコマンドのエイリアスです。Unixコマンドっぽいエイリアスが結構な数用意されています）の結果は、<span style="font-family:Consolas;">DictionaryInfo</span>型の配列になっています。次の<span style="font-family:Consolas;">select</span>コマンドで、その.NET型の配列をそのまま受け取って、最初の1項目だけ返します。その結果に対して、.NETの<span style="font-family:Consolas;">object.GetType()</span>メソッドを呼んでいるので、結果は、<span style="font-family:Consolas;">DictionaryInfo</span>を表す<span style="font-family:Consolas;">Type</span>型インスタンスになります。
</p>
<p><span style="font-family:Consolas;">IsPublic IsSerial Name           BaseType <br />&#8212;&#8212;&#8211; &#8212;&#8212;&#8211; &#8212;-           &#8212;&#8212;&#8211;<br />True     True     DirectoryInfo  System.IO.FileSystemInfo<br />
</span></p>
<p>
 </p>
<h3>オブジェクト パイプラインでデータ処理<br />
</h3>
<p>オブジェクト パイプラインは、ある意味、C#のLINQ的な機構です。
</p>
<p>冒頭の、PowerShellの画面キャプチャ中に移っているのがまさにその例だったりします。再掲すると以下の通り。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">cat<span style="color:black;"><br />
				<span style="color:red;">$file<span style="color:black;"> |<br /><span style="color:blue;">foreach<span style="color:black;"> { <span style="color:#009999;">[regex]<span style="color:black;">::Split(<span style="color:red;">$_<span style="color:black;">, <span style="color:#a50021;">&#8216;\s+&#8217;<span style="color:black;">) } |<br /><span style="color:blue;">where<span style="color:black;"> { <span style="color:red;">$_<span style="color:black;"> } |<br /><span style="color:blue;">group<span style="color:black;"> |<br /><span style="color:blue;">sort<span style="color:black;"><br />
																						<span style="color:#6600cc;">Count<span style="color:black;"> -Descending |<br /><span style="color:blue;">select<span style="color:black;"><br />
																										<span style="color:#6600cc;">Count<span style="color:black;">, <span style="color:#6600cc;">Name<span style="color:black;"> -First <span style="color:#a50021;">10<span style="color:black;"> |<br /><span style="color:blue;">foreach<span style="color:black;"> { <span style="color:#a50021;">&#8216;{1, -12}: {0}&#8217;<span style="color:black;"><br />
																																				<span style="color:gray;">-f<span style="color:black;"><br />
																																						<span style="color:red;">$_<span style="color:black;">.Count, <span style="color:red;">$_<span style="color:black;">.Name }<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="font-family:Consolas;">foreach</span>や<span style="font-family:Consolas;">where</span>などは、Cmdletとして提供されている1種のデータ処理コマンドです。ちなみに、前段からの入力は、<span style="font-family:Consolas;">$_</span> という暗黙的な変数に格納されます。
</p>
<p>これで、<span style="font-family:Consolas;">$file</span>（ファイルのパスを表す文字列）の内容を読んで、単語を集計して、頻度が高いもの10個を、書式指定して表示します。
</p>
<p>C#で書くと以下のような感じに。
</p>
<p style="background:white;"><span style="color:blue;font-family:Consolas;font-size:10pt;">var<span style="color:black;"> q =<br />    <span style="color:blue;">from<span style="color:black;"> line <span style="color:blue;">in<span style="color:black;"> <span style="color:#2b91af;">File<span style="color:black;">.ReadLines(file)<br />    <span style="color:blue;">from<span style="color:black;"> word <span style="color:blue;">in<span style="color:black;"> <span style="color:#2b91af;">Regex<span style="color:black;">.Split(line, <span style="color:#a31515;">@&#8221;\s+&#8221;<span style="color:black;">)<br />    <span style="color:blue;">where<span style="color:black;"> !<span style="color:blue;">string<span style="color:black;">.IsNullOrEmpty(word)<br />    <span style="color:blue;">group<span style="color:black;"> word <span style="color:blue;">by<span style="color:black;"> word <span style="color:blue;">into<span style="color:black;"> g<br />    <span style="color:blue;">orderby<span style="color:black;"> g.Count() <span style="color:blue;">descending<span style="color:black;"><br />    <span style="color:blue;">select<span style="color:black;"> <span style="color:blue;">new<span style="color:black;"> { Count = g.Count(), Name = g.Key };</p>
<p><span style="color:blue;">foreach<span style="color:black;"> (<span style="color:blue;">var<span style="color:black;"> x <span style="color:blue;">in<span style="color:black;"> q.Take(10))<br />{<br />    <span style="color:#2b91af;">Console<span style="color:black;">.WriteLine(<span style="color:#a31515;">&#8220;{1, -12}: {0}&#8221;<span style="color:black;">, x.Count, x.Name);<br />}<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/123/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/123/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/123/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=123&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/19/windows%e3%81%a8cui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui1.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui2.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui3.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui4.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui5.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui6.png" medium="image" />

		<media:content url="http://csharptan.files.wordpress.com/2011/12/121911_0316_windowscui7.png" medium="image" />
	</item>
		<item>
		<title>ネイティブと.NETと</title>
		<link>http://csharptan.wordpress.com/2011/12/18/%e3%83%8d%e3%82%a4%e3%83%86%e3%82%a3%e3%83%96%e3%81%a8-net%e3%81%a8/</link>
		<comments>http://csharptan.wordpress.com/2011/12/18/%e3%83%8d%e3%82%a4%e3%83%86%e3%82%a3%e3%83%96%e3%81%a8-net%e3%81%a8/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 01:12:51 +0000</pubDate>
		<dc:creator>C#たん</dc:creator>
				<category><![CDATA[Advent Calendar]]></category>

		<guid isPermaLink="false">http://csharptan.wordpress.com/?p=112</guid>
		<description><![CDATA[DynamicのついでにILの話したついでに、ネイティブと.NETの対比の話もしましょうか。   ここでいうネイティブは、実CPUのネイティブ コード（を直接出力するC++などの言語）のことです。 ネイティブか.NETか、それが問題だ 嘘です。 「AかB、どっちがいい？」って質問の答えは、往々にして「両方」です。残念ながら。毎回毎回、「これ1つですべてを解決！」みたいな銀の弾丸を期待しては、毎回毎回、夢物語に終わるのです。 アプリは.NET（C#とか）で書いた方が楽。それは間違いないです。一方で、インフラ的なところ、データベースやらGUIフレームワークみたいなのの内部はネイティブで書いた方が楽。場合によってはネイティブで書かざるを得ません。極度のパフォーマンスが必要な場面では、.NETで書く方が却って大変になることが多いです。 結局、適材適所としか言いようがないです。じゃあ、それぞれどこが適所なんでしょう？それぞれの利点/欠点をまとめてみましょう。 3つの視点 .NET Frameworkが持っている性質を3つに分けて考えてみます。 共通型システム メモリ管理の自動化 CPU独立な中間言語   ネイティブとマネージ（managed: .NET Frameworkに管理されているという意味）の対立構造で描かれることが多くて、マネージ コードが持つこの3つの性質はまとめて説明されることが多いですが、互いに独立（にもできる）概念です。 共通型システムを持つことはネイティブな言語でも重要だと思いますし、メモリ管理が手動な中間言語があってもいいと思います。 共通型システム .NETのライブラリは、C#からでもVBからでも、なんなら、PowerShellやIronPythonなどからでも共通利用可能です。これが可能なのは、共通型システム（common type system）という、型の取り扱いに関する規格を持っているからです。 一番大事 個人的には、.NETの性質のなかで一番大事なものだと思います。 今はもう、ライブラリやフレームワークなくしてアプリなんて作れません。.NETやJavaを見ての通り、標準ライブラリの時点で膨大な量のライブラリがあり、さらに、第3者提供のライブラリも山ほど見つかります。 これだけ大量のライブラリがあって、使いこなすことが要求されると、プログラミング言語自体を覚えることよりも、ライブラリを覚えるコストの方がはるかに大きいです。逆にいうと、ライブラリさえ共通利用できるなら、言語の違いなんて微々たるものです。 Windows 8 Windows 8で、共通型システムの適用範囲が広がります。.NETのメタデータ規格を流用して、ネイティブやJavaScriptでも型を共通利用できるようになります。 Windows 8では、今までのWPFのようなものが、ネイティブ コードで書きなおされました。しかし、新しい共通型システムのおかげで、.NETから見ると、今までと何の変りもなくWPFとまったく同じ感覚で使えます。 利点/欠点 まとめ 共通型システムの利点 ライブラリの学習が楽になります 実行に関係ないメタデータを持つことで: 動的コード生成できる セキュリティに関する情報も持てる 共通型システムの欠点 メタデータの分、プログラム サイズが大きくなる 標準規格に縛られる .NETとかJava仮想マシンの型システムはOOP前提なわけですが、他のパラダイムを使いたいときにネックにならないか？ Java仮想マシンはジェネリックや値型を持っていないのが結構なネックに 「nullを許さない参照型」が欲しかったりするけども、今から追加するにはコストが大きすぎる メモリ管理自動化 あなたのやりたいことはメモリ管理ですか？ メモリ管理自体が目的になることはないわけですが、その割に、メモリ管理は非常に大変です。 今となっては、むしろ、メモリの自動管理機構を持っていない言語の方が珍しくなってしまいましたねぇ。 マネージ [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=112&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>DynamicのついでにILの話したついでに、ネイティブと.NETの対比の話もしましょうか。
</p>
<p>
 </p>
<p>ここでいうネイティブは、実CPUのネイティブ コード（を直接出力するC++などの言語）のことです。
</p>
<h2>ネイティブか.NETか、それが問題だ<br />
</h2>
<p>嘘です。
</p>
<p>「AかB、どっちがいい？」って質問の答えは、往々にして「両方」です。残念ながら。毎回毎回、「これ1つですべてを解決！」みたいな銀の弾丸を期待しては、毎回毎回、夢物語に終わるのです。
</p>
<p>アプリは.NET（C#とか）で書いた方が楽。それは間違いないです。一方で、インフラ的なところ、データベースやらGUIフレームワークみたいなのの内部はネイティブで書いた方が楽。場合によってはネイティブで書かざるを得ません。極度のパフォーマンスが必要な場面では、.NETで書く方が却って大変になることが多いです。
</p>
<p>結局、適材適所としか言いようがないです。じゃあ、それぞれどこが適所なんでしょう？それぞれの利点/欠点をまとめてみましょう。
</p>
<h2>3つの視点<br />
</h2>
<p>.NET Frameworkが持っている性質を3つに分けて考えてみます。
</p>
<ul style="margin-left:39pt;">
<li>共通型システム
</li>
<li>メモリ管理の自動化
</li>
<li>CPU独立な中間言語
</li>
</ul>
<p>
 </p>
<p>ネイティブとマネージ（managed: .NET Frameworkに管理されているという意味）の対立構造で描かれることが多くて、マネージ コードが持つこの3つの性質はまとめて説明されることが多いですが、互いに独立（にもできる）概念です。
</p>
<p>共通型システムを持つことはネイティブな言語でも重要だと思いますし、メモリ管理が手動な中間言語があってもいいと思います。
</p>
<h2>共通型システム<br />
</h2>
<p>.NETのライブラリは、C#からでもVBからでも、なんなら、PowerShellやIronPythonなどからでも共通利用可能です。これが可能なのは、共通型システム（common type system）という、型の取り扱いに関する規格を持っているからです。
</p>
<h3>一番大事<br />
</h3>
<p>個人的には、.NETの性質のなかで一番大事なものだと思います。
</p>
<p>今はもう、ライブラリやフレームワークなくしてアプリなんて作れません。.NETやJavaを見ての通り、標準ライブラリの時点で膨大な量のライブラリがあり、さらに、第3者提供のライブラリも山ほど見つかります。
</p>
<p>これだけ大量のライブラリがあって、使いこなすことが要求されると、プログラミング言語自体を覚えることよりも、ライブラリを覚えるコストの方がはるかに大きいです。逆にいうと、ライブラリさえ共通利用できるなら、言語の違いなんて微々たるものです。
</p>
<h3>Windows 8<br />
</h3>
<p>Windows 8で、共通型システムの適用範囲が広がります。.NETのメタデータ規格を流用して、ネイティブやJavaScriptでも型を共通利用できるようになります。
</p>
<p>Windows 8では、今までの<a href="http://msdn.microsoft.com/ja-jp/netframework/aa663326">WPF</a>のようなものが、ネイティブ コードで書きなおされました。しかし、新しい共通型システムのおかげで、.NETから見ると、今までと何の変りもなくWPFとまったく同じ感覚で使えます。
</p>
<h3>利点/欠点 まとめ<br />
</h3>
<p><span style="color:#548dd4;">共通型システムの利点</span>
	</p>
<ul style="margin-left:39pt;">
<li>ライブラリの学習が楽になります
</li>
<li>
<div>実行に関係ないメタデータを持つことで:
</div>
<ul>
<li>動的コード生成できる
</li>
<li>セキュリティに関する情報も持てる
</li>
</ul>
</li>
</ul>
<p><span style="color:#d99594;">共通型システムの欠点<br />
</span></p>
<ul style="margin-left:39pt;">
<li>メタデータの分、プログラム サイズが大きくなる
</li>
<li>
<div>標準規格に縛られる
</div>
<ul>
<li>.NETとかJava仮想マシンの型システムはOOP前提なわけですが、他のパラダイムを使いたいときにネックにならないか？
</li>
<li>Java仮想マシンはジェネリックや値型を持っていないのが結構なネックに
</li>
<li>「nullを許さない参照型」が欲しかったりするけども、今から追加するにはコストが大きすぎる
</li>
</ul>
</li>
</ul>
<h2>メモリ管理自動化<br />
</h2>
<p>あなたのやりたいことはメモリ管理ですか？
</p>
<p>メモリ管理自体が目的になることはないわけですが、その割に、メモリ管理は非常に大変です。
</p>
<p>今となっては、むしろ、メモリの自動管理機構を持っていない言語の方が珍しくなってしまいましたねぇ。
</p>
<h3>マネージ ヒープ<br />
</h3>
<p>.NETのように、ガベージ コレクション（garbage collection）機能によって管理されたメモリをマネージ ヒープ（managed heap）と言います。
</p>
<p>マネージ ヒープは以下のような性質があります。
</p>
<ul style="margin-left:39pt;">
<li>
<div>マネージ ヒープは、全体としてのスループット的には非常に性能がいいです
</div>
<ul>
<li>ヒープ（動的なメモリ確保）が必要なら、素直にマネージ ヒープに任せる方がいいです
</li>
<li>ただ、処理負荷がある1点に集中してしまうことがあります
</li>
</ul>
</li>
<li>
<div>手動管理ではそもそもヒープを使わないような最適化が可能ですが、自動管理の場合はそういう最適化がしにくいです
</div>
<ul>
<li>下手なことをすると、ガベージ コレクションの仕事を阻害して、かえって遅くなります
</li>
</ul>
</li>
<li>
<div>マネージ ヒープは、確保できる物理メモリ量が多めにある時に良い性能を発揮します
</div>
<ul>
<li>省メモリ環境は苦手です
</li>
<li>物理メモリを目いっぱい使うようなキャッシュ処理は苦手です
</li>
</ul>
</li>
</ul>
<p>
 </p>
<h3>管理外リソース<br />
</h3>
<p>さて、プログラムで使うリソースは、何もメモリばかりではありません。ファイルやグラフィック、ネットワーク接続なんかもあります。これらのリソース管理は、結局自前で行う必要があります。
</p>
<p>最悪、メモリの自動解放のタイミングで一緒にこの手のリソースを解放してもいいんですが、無駄に多くのリソースを使ってしまうので、場合によってはかなり性能を落とします。
</p>
<h3>管理されててもメモリ リーク<br />
</h3>
<p>ガベージ コレクションは、「誰からも参照されていないゴミを見つけて解放する」というような仕組みで動いています。なので、「本当はもう不要になったのに、誰かがずっと参照しっぱなし」みたいなことをすると、結局、不要なメモリが残り続けます。
</p>
<p>イベント駆動なプログラム（GUIアプリなんかだとイベント駆動がほぼ必須）では、参照関係が複雑になりがちで、誰が誰を参照しているかがわからなくなりがちです。参照を外し忘れてメモリ リークしてしまうことも多いです。
</p>
<h3>利点/欠点 まとめ<br />
</h3>
<p><span style="color:#548dd4;">メモリ自動管理の利点</span>
	</p>
<ul style="margin-left:39pt;">
<li>やりたいことに集中できる
</li>
<li>セキュリティ ホールを作りにくい
</li>
<li>ヒープの性能（スループット）が良い
</li>
<li>メモリ以外のリソースの管理は結局自前
</li>
</ul>
<p><span style="color:#d99594;">メモリ自動管理の欠点</span>
	</p>
<ul style="margin-left:39pt;">
<li>
<div>自前管理との相性があまり良くない
</div>
<ul>
<li>部分的に自前管理で性能上げようとかすると逆効果になりがち
</li>
<li>そもそもヒープ利用を避ける最適化もしづらい
</li>
</ul>
</li>
<li>ガベージ コレクション発生時に一時的に応答悪くなることがある
</li>
</ul>
<h2>中間言語<br />
</h2>
<p>昨日、中間言語（IL: intermediate language）の説明をしました。要は、いったんCPU非依存な形式で配布しておいて、実行時に実CPUのネイティブ コードに変換します。
</p>
<h3>クロスCPU<br />
</h3>
<p>.NETは、結構いろいろな環境で動くことを想定しています。デスクトップ向けのWindows以外にも、Windows Phone 7はARMですし、Xbox 360のCPUはPowerPCベースです。SilverlightにはMac版もあります。今は、monoもあるので、Linuxなどでも動きます。
</p>
<p>同じOSであっても異なるCPUに対応しないといけません。いわゆる32ビット版（x86）と64ビット版（x64）がありますし、Windows 8ではARMプロセッサーにも対応します。
</p>
<p>アプリを作る側からしても、それぞれのCPU向けにコンパイルして配布するのは結構面倒です。
</p>
<p>コンパイラーを作る側の視点だと中間言語の重要性はもっと増します。プログラミング言語（C#とかVB）の専門家と、CPU毎の最適化の専門家に分かれて作業ができます。プログラミング言語の専門家は中間言語を作るところまで、CPU最適化の専門家は中間言語から先だけ気にすればよくなります。
</p>
<h3>セキュリティ<br />
</h3>
<p>中間言語は、命令がかなり高級で、セキュリティ的な検証がしやすいです。.NETの場合は、署名を入れて検証したり、メタデータに必要な権限の情報も入れておけるので、かなり強固なセキュリティ保証ができます。
</p>
<h3>性能の良し悪し<br />
</h3>
<p>平均的な状況では、.NETのコードでもネイティブの8～9割の性能が出るといわれています。ただ、ほんとに状況次第です。ネイティブの方が数倍早くなるような状況もありますし、.NETの方が早くなることもあります。
</p>
<p>標準C++の範囲のコードならともかく、インライン アセンブラーを使ったCPU依存の最適化を駆け出すと、明らかにネイティブの方が早くなります。そこまでコストをかけてでも性能が必要な場合、.NETは使えません。
</p>
<p>また、最近だと、大規模データ処理を、GPUを使って行うような手法（GPGPU: General-purpose computing on GPU）なんかもありますが、これも過度に環境依存するので、.NETからは直接活用しにくいです。
</p>
<h3>利点/欠点 まとめ<br />
</h3>
<p><span style="color:#548dd4;">中間言語の利点</span>
	</p>
<ul style="margin-left:39pt;">
<li>
<div>配布が容易
</div>
<ul>
<li>1バイナリでいろんなCPU向けに配布可能
</li>
</ul>
</li>
<li>命令長が短く、プログラム サイズが小さくなる
</li>
<li>セキュリティ保証しやすい
</li>
</ul>
<p><span style="color:#d99594;">中間言語の欠点</span>
	</p>
<ul style="margin-left:39pt;">
<li>
<div>多少、性能が犠牲に
</div>
<ul>
<li>JITが挟まる
</li>
<li>CPUに過度に依存する（SIMD系命令とかGPGPUとか）最適化が無理
</li>
</ul>
</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/csharptan.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/csharptan.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/csharptan.wordpress.com/112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=csharptan.wordpress.com&amp;blog=29909903&amp;post=112&amp;subd=csharptan&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://csharptan.wordpress.com/2011/12/18/%e3%83%8d%e3%82%a4%e3%83%86%e3%82%a3%e3%83%96%e3%81%a8-net%e3%81%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/4eaebe4c68e3431214aa58a55bf1f28d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">csharptan</media:title>
		</media:content>
	</item>
	</channel>
</rss>
