<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>岩田 雅樹 のブログ</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/masaki/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/masaki/feed.xml</link>
    <description>エバンジェリスト岩田のブログ</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:23:11 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>連載一時休止のお詫び</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/23</link>
      <pubDate>Sat, 23 Apr 2011 00:28:46 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/04/23/23/</guid>
      <description><![CDATA[今回の震災・津波被害は本当に言葉にしがたいものがあります。謹んで災害のお見舞いを申し上げます。私も昔、原子力工学専攻と呼ばれていた専攻に所属していたこともあり、福島の二次的な人災には心を痛めております...]]></description>
      <content:encoded><![CDATA[<p>今回の震災・津波被害は本当に言葉にしがたいものがあります。謹んで災害のお見舞いを申し上げます。<br />私も昔、原子力工学専攻と呼ばれていた専攻に所属していたこともあり、福島の二次的な人災には心を痛めております。<br />一日も早い情報公開と復興をお祈りしております。</p>
<p>私も、節電協力のためマシンを稼動しっぱなしにすることができず、3つの話題の大型連載予定だった記事を書けずにおります。<br />省エネPCでの再考になるかと思いますが、ご理解のほどどうぞよろしくお願いいたします。</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows 7 / Windows Server 2008 R2 はなぜ軽いのか – Kernel Mode からの視点 (1)</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/windows-7-windows-server-2008-r2-kernel-mode-1</link>
      <pubDate>Fri, 25 Feb 2011 03:34:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/25/windows-7-windows-server-2008-r2-kernel-mode-1/</guid>
      <description><![CDATA[「機能を削っただけ」なーんて言われていますが、本当はそうではないんですよね&hellip;。そんなわけで Windows 7...]]></description>
      <content:encoded><![CDATA[<p>「機能を削っただけ」なーんて言われていますが、本当はそうではないんですよね&hellip;。<br />そんなわけで Windows 7 の魅力を連載でお伝えしていこうと思います。(不定期更新)</p>
<p>まずはスクリーンショットをざーっと並べてみました。メモリ使用量が減っているのがおわかりいただけるでしょうか？<br />また、Windows Server 2008 と Windows Server 2008 R2 で CPU の使い方が微妙に変わっています。</p>
<p>実はこれらの数字の読み方にもコツがあるんです。次回からなぜ軽くなったのか、コツとは何かについて取り上げたいと思います。</p>
<p>(って、今回はなにもなし？)</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20Enterprise%20Core_2.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20Enterprise%20Core_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Windows Server 2008 Enterprise Core" border="0" alt="Windows Server 2008 Enterprise Core" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20Enterprise%20Core_thumb.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20Enterprise%20Core_thumb.png" width="644" height="484" /></a> </p>
<p>Windows Server 2008 Enterprise Edition x64 (Server Core)</p>
<p>&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20R2%20Enterprise%20Core_2.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20R2%20Enterprise%20Core_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Windows Server 2008 R2 Enterprise Core" border="0" alt="Windows Server 2008 R2 Enterprise Core" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20R2%20Enterprise%20Core_thumb.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%20Server%202008%20R2%20Enterprise%20Core_thumb.png" width="644" height="484" /></a> </p>
<p>Windows Server 2008 R2 Enterprise Edition (Server Core)</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%207%20RTM%20x86_4.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%207%20RTM%20x86_4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Windows 7 RTM x86" border="0" alt="Windows 7 RTM x86" src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%207%20RTM%20x86_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/Windows7KernelMode_DD5A/Windows%207%20RTM%20x86_thumb_1.png" width="643" height="484" /></a> </p>
<p>Windows 7 Enterprise Edition x86 (Forefront Client Security など一通り入れています)</p>]]></content:encoded>
    </item>
    <item>
      <title>RemoteFX を有効にした仮想マシンに接続できない場合の対処</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/remotefx</link>
      <pubDate>Thu, 24 Feb 2011 17:36:39 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/24/remotefx/</guid>
      <description><![CDATA[さっそく RemoteFX...]]></description>
      <content:encoded><![CDATA[<p>さっそく RemoteFX を試してみようとしたものの、接続に失敗して困り果てていました。最新の統合コンポーネントをインストールしたのになぜ？と思っていたらファイアーウォールの設定に問題があったようです。</p>
<p>Network and Sharing Center の Windows Firewall &rarr; Advanced Settings &rarr; Inbound Rules を確認したところ、</p>
<p><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/3583.RemoteFX-TCP-In.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93/3583.RemoteFX_2D00_TCP_2D00_In.png" border="0" /></p>
<p>Remote Desktop - RemoteFX (TCP-In) の項目が増えていました。既定では無効にされているようです。<br />接続に失敗するようでしたら、一旦 RemoteFX 3D Video Adapter を削除し、設定を確認してみてはいかがでしょうか。</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>そろそろ User Mode Scheduler と DirectCompute を使ってみようか (1)</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/user-mode-scheduler-directcompute-1</link>
      <pubDate>Thu, 24 Feb 2011 04:56:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/24/user-mode-scheduler-directcompute-1/</guid>
      <description><![CDATA[1年半前に紹介したものの放置しっぱなしだった、User Mode Scheduler 再びです。
実は Windows 7 RTM, Windows 2008 R2 RTM における UMS...]]></description>
      <content:encoded><![CDATA[<p>1年半前に紹介したものの放置しっぱなしだった、<a href="https://blogs.msdn.com/b/masaki/archive/2009/08/12/windows-7-ums-user-mode-scheduler.aspx">User Mode Scheduler</a> 再びです。</p>
<p>実は Windows 7 RTM, Windows 2008 R2 RTM における UMS (User Mode Scheduler) には yield時にリソースリークが起きる可能性があり、そのことが Microsoft Visual Studio 10.0/VC/crt/src/UMSFreeVirtualProcessorRoot.cpp にも書かれています。</p>
<p>関連する事項として &ldquo;Visual Studio 2010 SP1 Interim Fix List - Jason Zander's WebLog - Site Home - MSDN Blogs&rdquo; でも触れられている通り、   <br /><a title="https://blogs.msdn.com/b/jasonz/archive/2010/12/20/visual-studio-2010-service-pack-1-beta-feedback.aspx" href="https://blogs.msdn.com/b/jasonz/archive/2010/12/20/visual-studio-2010-service-pack-1-beta-feedback.aspx">https://blogs.msdn.com/b/jasonz/archive/2010/12/20/visual-studio-2010-service-pack-1-beta-feedback.aspx</a></p>
<p>Visual Studio 2010 VC++ Concurrent Runtime libraries leak memory<br /> <a title="https://connect.microsoft.com/VisualStudio/feedback/details/560544" href="https://connect.microsoft.com/VisualStudio/feedback/details/560544">https://connect.microsoft.com/VisualStudio/feedback/details/560544</a></p>
<p>も解消される見込みとなりました。これで安心して UMS を活用できるようになったわけです。</p>
<p>また、素晴らしいタイミングで AMD の E-350, E-240, C-50 そして、C-30 (DirectX 11 対応、シェーダー数 80) が発表されました。これは RADEON HD5450 に相当するものらしいのですが、RADEON HD4850 を購入してファンの騒音が許せず、HD3450 を使い続けていた私としては複雑な気分でもありますが&hellip;。<br />あれだけ CPU の周波数の向上は鈍化傾向にあると言い続けておきながら、TDP の限界に挑むとは思いもよらず。2011年のパフォーマンスデスクトップは 4物理コアまたは、4論理コア (SMT) + CPU 内蔵グラフィックスといった傾向になるのでしょうか。</p>
<p>さておき、ついに内蔵グラフィックスでも DirectCompute を利用したり、CPU側でも UMS による軽量な並列化が可能になったりと、ネイティブもまだ捨てたものじゃないな～？といった状態がようやく実現されつつあります。<br /><a href="https://blogs.msdn.com/b/masaki/archive/2011/02/23/msdn-magazine-parallel-computing-1.aspx" target="_blank">MSDN Magazine Jan.2011 「データ処理: 並列処理とパフォーマンス」に思うこと (1)</a> も、ちまちまと進めて参りますが、CPU と GPU が 1つの石に載るこの時代も取り上げないわけにはいきませんよね。</p>
<p>お財布が厳しいところですが、E-350 あたりを入手して、CPU + APU の可能性について探っていこうと思います。</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure が無料で使える！？</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/windows-azure</link>
      <pubDate>Wed, 23 Feb 2011 04:18:57 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/23/windows-azure/</guid>
      <description><![CDATA[並列ネタなど、少し踏み込んだ話題ばかりになってしまいそうなので閑話休題。
私もこっそり自腹で Extra Small (XS) Instance に VM Role を上げて Remote...]]></description>
      <content:encoded><![CDATA[<p>並列ネタなど、少し踏み込んだ話題ばかりになってしまいそうなので閑話休題。</p>
<p>私もこっそり自腹で Extra Small (XS) Instance に VM Role を上げて Remote Desktop で運用していたりしますが、なんと Windows Azure Platform 導入特別プランが Extra Small Instance 750時間、ストレージ 500MB、SQL Azure 1GB (3か月) が 6月末まで無料！<br /><a href="https://www.microsoft.com/windowsazure/offers/popup/popup.aspx?lang=ja&amp;locale=ja-JP&amp;offer=MS-AZR-0001P">https://www.microsoft.com/windowsazure/offers/popup/popup.aspx?lang=ja&amp;locale=ja-JP&amp;offer=MS-AZR-0001P</a></p>
<p><a href="https://www.microsoft.com/windowsazure/offers/popup/popup.aspx?lang=ja&amp;locale=ja-JP&amp;offer=MS-AZR-0001P"></a>NoSQL について一言言いたい今日この頃なのですが、このお試し期間を逃す手はありません、ぜひお試しを。<br /><a href="https://mocp.microsoftonline.com/site/default.aspx">https://mocp.microsoftonline.com/site/default.aspx</a></p>
<p>お手元に SQL Server の管理コンソールも Visual Studio もない場合には SQL Server 2008 R2 評価版を導入するというのも一つの手です。<br /><a href="https://msdn.microsoft.com/ja-jp/evalcenter/ff459612">https://msdn.microsoft.com/ja-jp/evalcenter/ff459612</a></p>
<p>Windows Azure に必要な情報は MSDN から。<br /><a href="https://msdn.microsoft.com/ja-jp/ff380142">https://msdn.microsoft.com/ja-jp/ff380142</a>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>MSDN Magazine Jan.2011 「データ処理: 並列処理とパフォーマンス」に思うこと (1)</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/msdn-magazine-jan-2011-12358</link>
      <pubDate>Tue, 22 Feb 2011 22:56:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/22/msdn-magazine-jan-2011-12358/</guid>
      <description><![CDATA[表題の記事 (https://msdn.microsoft.com/ja-jp/magazine/gg535673.aspx)...]]></description>
      <content:encoded><![CDATA[<p><span>表題の記事</span> (<a href="https://msdn.microsoft.com/ja-jp/magazine/gg535673.aspx">https://msdn.microsoft.com/ja-jp/magazine/gg535673.aspx</a>) <span>ですが少し不思議に思うところがあるので掘り下げて考えてみたいと思います。</span></p>
<p><span>この記事においては</span> UTF-8 <span>でエンコードされた非常に巨大なタブ区切りファイル</span> (906,055,326 Bytes, 7,582,271<span>行</span>) <span>に記された、山の名前と標高、国名から特定の条件で抽出を行う処理を</span> C#, Native <span>において比較しています。しかし、結論やベンチマークの結果にはいささか疑問が残ります。今回はこの例を用いて、並列化における問題点について考えてみたいと思います。</span></p>
<p><span></span><span>並列化を行う際に最も重要なことは、何がボトルネックになっているか、並列化可能な個所の調査です。表題の記事では最終節「確認していない問題」において</span></p>
<p><span>・プロファイリング</span><span> </span><span>ツールや</span> Visual Studio 2010 <span>ツールを使用して、パフォーマンスのボトルネックを特定および削除できるかどうか。</span></p>
<p><span>と記載されているので、まずは記事の図</span>3, 4 <span>のコードをプロファイリングしてどのような問題があるのか調査してみたいと思います。</span></p>
<p><span>なお、環境は</span> Phenom II X4 940 (3.0GHz), RAM 12GB, Windows Server 2008 R2, .NET Framework 4.0 (<span>特に指定のない場合、既定のの</span> Workstation, Concurrent GC) Any CPU (x64) <span>です。</span><span>実行時間の計測には</span> Stopwatch <span>と</span>Process.GetCurrentProcess().TotalProcessorTime <span>を用いています。</span>Workstation GC <span>では既定のスレッドプールのサイズが十分な量ではない</span> (<span>初期値</span> 4) <span>のでスレッドプールの最小値を</span> 16 <span>に指定してあります。</span>&nbsp;</p>
<p style="text-align: center" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/5342.image001_6B7E5B22.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/5342.image001_5F00_6B7E5B22.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image001" border="0" alt="image001" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/8004.image001_thumb_097C6917.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/8004.image001_5F00_thumb_5F00_097C6917.png" width="485" height="293" /></a></p>
<p style="text-align: center" align="center"><span>図</span>1 <span>記事のコードの実行時間</span></p>
<p><span><span>まずは実行時間を見てみましょう。</span>左軸が、</span>WithDegreeOfParallelism() <span>に指定している最大並列度、左縦軸がプログラムの実行時間</span> (ms)<span>、右縦軸がプロセッサ実行時間</span><span> </span>(ms) <span>です。</span>AsParallel() <span>を指定せずに通常の</span> LINQ <span>として実行したものを便宜的に</span> DOP = 0 <span>としてプロットしています。計測は各最大並列度毎に</span> 5<span>回行い、最も実行時間の短かったものをプロットしています。</span>5<span>度の計測における差は実行時間の</span> 1% <span>程度でした。また、対象となるファイルは約</span> 900MB<span>もの容量がありますが、全てキャッシュに載った状態での実行結果となります。</span></p>
<p><span>さて、図</span>1<span>から読み取れるように、期待に反して並列度を上げても実行時間は変わらないどころか、純粋に直列のクエリとして実行した結果が最も速いという結果が得られました。一方で並列度を上げると総</span>CPU<span>使用時間はマシンに搭載されている</span> 4<span>コア分、およそ</span> 3.7<span>倍にまで膨れ上がっています。これは何故でしょうか？</span></p>
<p><span>プログラムを単純な部分に分解して問題を調べてみましょう。</span><span>まずは入力部分に着目してみたいと思います。</span></p>
<p style="line-height: normal; margin-bottom: 0pt; background: #d9d9d9"><span style="font-family: consolas; color: #2b91af; font-size: 10.5pt">Parallel</span><span style="font-family: consolas; font-size: 10.5pt">.ForEach( <br /></span><span style="font-family: consolas; font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <span style="color: #2b91af">File</span>.ReadLines(inFile), <br /></span><span style="font-family: consolas; font-size: 10.5pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">new</span> <span style="color: #2b91af">ParallelOptions</span>() { MaxDegreeOfParallelism = dop }, <br /></span><span style="font-family: consolas; font-size: 10.5pt">&nbsp;&nbsp;&nbsp; _ =&gt; { });</span></p>
<p style="text-align: center" align="center"><span>図</span>2 <span>単純な行の読み出し</span> (<span>並列</span>)&nbsp;</p>
<p style="line-height: normal; margin-bottom: 0pt; background: #d9d9d9"><span style="font-family: consolas; color: blue; font-size: 10.5pt">foreach</span><span style="font-family: consolas; font-size: 10.5pt"> (<span style="color: blue">var</span> line <span style="color: blue">in</span> <span style="color: #2b91af">File</span>.ReadLines(inFile)) <br /></span><span style="font-family: consolas; font-size: 10.5pt">&nbsp;&nbsp;&nbsp; ;</span></p>
<p style="text-align: center" align="center"><span>図</span>3 <span>単純な行の読み出し</span> (<span>直列</span>)</p>
<p><span>図</span>2<span>、</span>3 <span>のプログラムを実行した結果を図</span>1<span>と同様にプロットしてみます。</span></p>
<p style="text-align: center" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/8081.image002_73464DC4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/8081.image002_5F00_73464DC4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image002" border="0" alt="image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/7411.image002_thumb_5905E4A0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/7411.image002_5F00_thumb_5F00_5905E4A0.png" width="485" height="293" /></a></p>
<p style="text-align: center" align="center"><span>図</span>4 <span>単純な行の読み出しの結果</span></p>
<p><span>図</span>1 <span>と同様の傾向が図</span>4 <span>から読み取れることがわかります。元のプログラムの実行時間の</span> 7<span>割以上が図</span>2<span>に示すコードで占められていることから、今回の並列化における最大の問題点は読み出しにあると推定することが可能でしょう。</span></p>
<p><span>ここで、</span>Visual Studio 2010 <span>の強力なプロファイラーの出番です。全体像を把握するために、まずは同時実行プロファイリングにより動作の様子を調べ、サンプリングでどの箇所にボトルネックが生じているのか調べてみます。</span></p>
<p><span>オリジナルのコードを最大並列度</span> 16 <span>で実行した様子を図</span>5 <span>に示します。</span></p>
<p style="text-align: center" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/7870.image003_3EC57B7C.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/7870.image003_5F00_3EC57B7C.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image003" border="0" alt="image003" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/5736.image003_thumb_4D3051D4.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/5736.image003_5F00_thumb_5F00_4D3051D4.jpg" width="244" height="211" /></a></p>
<p style="text-align: center" align="center"><span>図</span>5 <span>同時実行プロファイリングの結果</span></p>
<p><span>これではわけがわからないので拡大表示してみます。</span></p>
<table style="border-bottom-style: none; border-right-style: none; border-collapse: collapse; border-top-style: none; border-left-style: none" class="MsoTableGrid" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="padding-bottom: 0in; padding-left: 5.4pt; width: 226.35pt; padding-right: 5.4pt; padding-top: 0in;" valign="top" width="302">
<p style="text-align: center; line-height: normal; margin-bottom: 0pt" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/2100.image004_0BB59F7B.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/2100.image004_5F00_0BB59F7B.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image004" border="0" alt="image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/0647.image004_thumb_2A8C1359.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/0647.image004_5F00_thumb_5F00_2A8C1359.jpg" width="168" height="244" /></a></p>
<p style="text-align: center; line-height: normal; margin-bottom: 0pt" align="center"><span>図</span>5<span>プロファイリングの結果</span> (<span>拡大図</span>)</p>
</td>
<td style="padding-bottom: 0in; padding-left: 5.4pt; width: 226.35pt; padding-right: 5.4pt; padding-top: 0in;" valign="top" width="302">
<p style="text-align: center; line-height: normal; margin-bottom: 0pt" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/5415.image005_3E38FCED.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/5415.image005_5F00_3E38FCED.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image005" border="0" alt="image005" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/8547.image005_thumb_55F03453.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/8547.image005_5F00_thumb_5F00_55F03453.png" width="235" height="244" /></a></p>
<p style="text-align: center; line-height: normal; margin-bottom: 0pt" align="center"><span>図</span>6 <span>実行全体に占める状態の割合</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><span>図</span>6 <span>の表示されているタイムライン</span><span> </span><span>プロファイルの結果から、実行が占める割合から</span> 16<span>並列の</span> 24% <span>である</span> 4<span>コア分は消費されていることがわかります。実際、図</span>5 <span>の様子からも並列にプログラムは実行されているようです。しかし、プログラムの実行時間は冒頭で述べたとおり、全く高速化されていません。</span></p>
<p><span>これは、改行位置が前回の取得結果に依存するため、</span>ReadLines() <span>を並列に実行することができないためです。したがって実行状態は</span> 1/16 <span>になってもおかしくないはずですが、どうやら行いたい処理の他に重たい何かが走っているようです。そこで、サンプリング</span><span> </span><span>プロファイリングによって問題を特定してみたいと思います。</span></p>
<p style="text-align: center" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/4834.image006_3AD76545.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/4834.image006_5F00_3AD76545.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image006" border="0" alt="image006" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/1033.image006_thumb_62BA64A4.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/1033.image006_5F00_thumb_5F00_62BA64A4.jpg" width="512" height="484" /></a></p>
<p style="text-align: center" align="center"><span>図</span>7 <span>サンプリング</span><span> </span><span>プロファイルの結果</span></p>
<p><span>この結果より、最も</span> CPU <span>時間を消費している関数は</span> DynamicPartitionerForIEnumerable.InternalPartitionEnumerator.GrabNextChunk(int) <span>が呼び出している</span> JITutil_MonContention, File.&lt;InternalReadLines&gt;.MoveNext() <span>であることがわかります。</span></p>
<p>GrabNextChunk(int) <span>をクリックして関数の詳細を表示してみましょう。</span></p>
<p style="text-align: center" align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/2275.image007_0DB252AA.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/2275.image007_5F00_0DB252AA.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image007" border="0" alt="image007" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/27/93/metablogapi/1780.image007_thumb_0B9553E1.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-27-93-metablogapi/1780.image007_5F00_thumb_5F00_0B9553E1.jpg" width="644" height="308" /></a></p>
<p style="text-align: center" align="center"><span>図</span>8 <span>関数の詳細</span></p>
<p>File.ReadLines() <span>が返す</span> IEnumerable&lt;string&gt; <span>に対して、動的な負荷分散のため複数の結果を格納した新しい</span> IEnumerable&lt;string&gt; <span>を生成しようと試みていることがわかります。しかし、関数の中身をよく見ると、</span>GrabNextChunk() <span>の占める割合</span> 98.4% <span>の内訳として</span> File.&lt;InternalReadLines&gt;.MoveNext() <span>が占める割合は</span>22.6%<span>、つまりプログラム全体のたった</span> 22.2% <span>であり、競合の調停のための関数である</span> JITutil_MonContention, JIT_MonenterWorker_InlineGetThread_PatchLevel <span>の</span>2<span>つの関数によってプログラム全体の</span> 73.7% <span>の時間が費やされていることがわかります。これが、並列度を上げることによって</span> CPU <span>消費時間が増加する一方で実行時間はほとんど変わらない原因です。</span></p>
<p><span>このようにプロファイラーを用いることで非常に簡単に問題を特定することが可能になります。</span></p>
<p><span>次回は並列にファイルを読み込む方法について検討し、元記事の結論について検討したいと思います。10倍速くらいにはできるでしょう。</span></p>
<p>&nbsp;</p>
<p>※ 追記) 踏み込んだ内容になるため、全5部程度の構成でお送りしたいと思います。<br />もしよろしければ RSS での購読をお勧めいたします。&nbsp;</p>
<p><a href="https://blogs.msdn.com/b/masaki/rss.aspx">https://blogs.msdn.com/b/masaki/rss.aspx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Server 2008 R2 / Windows 7 SP1 RTM 一般配布開始</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/windows-server-2008-r2-windows-7-sp1-rtm</link>
      <pubDate>Wed, 16 Feb 2011 18:47:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2011/02/16/windows-server-2008-r2-windows-7-sp1-rtm/</guid>
      <description><![CDATA[今更ですが、あけましておめでとうございます。
先日アナウンスされた Windows Server 2008 R2 SP1 が MSDN Subscriber...]]></description>
      <content:encoded><![CDATA[<p>今更ですが、あけましておめでとうございます。</p>
<p><a title="https://windowsteamblog.com/windows/b/bloggingwindows/archive/2011/02/09/announcing-availability-of-windows-7-and-windows-server-2008-r2-sp1.aspx" href="https://blogs.msdn.com/controlpanel/blogs/posteditor.aspx/先日アナウンスされた">先日アナウンスされた</a> Windows Server 2008 R2 SP1 が <a href="https://msdn.microsoft.com/ja-jp/subscriptions/default.aspx">MSDN Subscriber</a> 向けに配布開始されました！<br /><a href="https://www.microsoft.com/downloads/details.aspx?FamilyID=c3202ce6-4056-4059-8a1b-3a9b77cdfdda&amp;displayLang=ja">一般向けにも配布開始されています。&nbsp;</a></p>
<p>これで Windows Server 2008 R2 の新機能、Dynamic Memory, RemoteFX が正式に使えるようになりますね。<br />クライアントである Windows 7 と共通の Service Pack となりますが、Service Pack なしでも十分に安定しているため、新機能を活用されたい方以外は今すぐ適用する必要はないかと思います。</p>
<p>Service Pack 1 に含まれる Hotfix などの一覧は&nbsp;<a href="https://www.microsoft.com/downloads/details.aspx?FamilyID=61924cea-83fe-46e9-96d8-027ae59ddc11&amp;displayLang=ja">https://www.microsoft.com/downloads/details.aspx?FamilyID=61924cea-83fe-46e9-96d8-027ae59ddc11&amp;displayLang=ja</a>&nbsp;から。</p>
<p>Windows Update での自動更新を一時的に避けたい方は <a href="https://www.microsoft.com/downloads/details.aspx?FamilyID=d7c9a07a-5267-4bd6-87d0-e2a72099edb7&amp;displayLang=ja">Windows Service Pack ブロック ツールキット</a>&nbsp;をご検討ください。</p>
<p>※ 一般配布開始に合わせて内容を修正しました。</p>]]></content:encoded>
    </item>
    <item>
      <title>CLR/H 47 資料公開</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/clrh-47</link>
      <pubDate>Fri, 30 Apr 2010 00:40:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2010/04/30/clrh-47/</guid>
      <description><![CDATA[こちらもだいぶ前の話になるのですが、CLR/H 第47回で並列プログラミングの話をしてきました。内容は、予告では PLINQ...]]></description>
      <content:encoded><![CDATA[<P>こちらもだいぶ前の話になるのですが、CLR/H 第47回で並列プログラミングの話をしてきました。内容は、予告では PLINQ だったのですが、タスクベースでの並列化・スループット向上に焦点を当てた、並列プログラミングの考え方となっています。</P>
<P>・CLR/H (Community for Learning and Research) 第47回勉強会の資料について <BR><A title=https://clr-h.jp/forums/p/473/3500.aspx href="https://clr-h.jp/forums/p/473/3500.aspx" mce_href="https://clr-h.jp/forums/p/473/3500.aspx">https://clr-h.jp/forums/p/473/3500.aspx</A></P>
<P>また、<A href="https://msdn.microsoft.com/ja-jp/samplecode.recipe.aspx" mce_href="https://msdn.microsoft.com/ja-jp/samplecode.recipe.aspx">CodeRecipe</A> のほうでも TPL などのコンテンツが増量されています。(C#, VB のサンプルコードあり)</P>
<UL>
<LI><A href="https://msdn.microsoft.com/ja-jp/netframework/ff606459.aspx" mce_href="https://msdn.microsoft.com/ja-jp/netframework/ff606459.aspx">並列プログラミング - TPL によるデータの並列処理</A></LI>
<LI><A href="https://msdn.microsoft.com/ja-jp/netframework/ff608214.aspx" mce_href="https://msdn.microsoft.com/ja-jp/netframework/ff608214.aspx">並列プログラミング - TPL によるタスクの並列処理</A></LI>
<LI><A href="https://msdn.microsoft.com/ja-jp/netframework/ff602883.aspx" mce_href="https://msdn.microsoft.com/ja-jp/netframework/ff602883.aspx">並列プログラミング - PLINQ</A></LI></UL>
<P>こちらも参照していただき、CLR/H さんで講演した、今までのデータ並列ではなく、タスク並列の考え方を取り入れてプログラミングしてみてはいかがでしょう？</P>
<P>(slide 11)</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_4.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_4.png" mce_href="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_4.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=Models border=0 alt=Models src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_thumb_1.png" width=404 height=304 mce_src="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Models_thumb_1.png"></A> </P>
<P>(slide 15) # しっかし、UMS 好きだなあ、自分</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_8.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_8.png" mce_href="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_8.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=UMS border=0 alt=UMS src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_thumb_3.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_thumb_3.png" width=404 height=304 mce_src="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/UMS_thumb_3.png"></A> </P>
<P>(slide 32 分割アルゴリズム)</P>
<P><A href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_4.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_4.png" mce_href="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_4.png"><IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=Partitioner border=0 alt=Partitioner src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/BlogFileStorage/blogs_msdn/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_thumb_1.png" original-url="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_thumb_1.png" width=404 height=304 mce_src="https://blogs.msdn.com/blogfiles/masaki/WindowsLiveWriter/CLRH47_EA7E/Partitioner_thumb_1.png"></A> </P>
<P mce_keep="true">&nbsp;</P>
<P>続きは <A href="https://clr-h.jp/forums/p/473/3500.aspx" mce_href="https://clr-h.jp/forums/p/473/3500.aspx">CLR/H</A> さんで！</P>]]></content:encoded>
    </item>
    <item>
      <title>日経ソフトウエア 6月号に寄稿しました</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/6</link>
      <pubDate>Fri, 30 Apr 2010 00:26:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2010/04/30/6/</guid>
      <description><![CDATA[ご無沙汰しています。最近はばたばたしていて blog の投稿量がめっきり減ってしまいました。
さておき、1年弱にわたって Windows 7...]]></description>
      <content:encoded><![CDATA[<P>ご無沙汰しています。最近はばたばたしていて blog の投稿量がめっきり減ってしまいました。</P>
<P>さておき、1年弱にわたって Windows 7 をネタに<A href="https://blogs.msdn.com/tsmatsuz" mce_href="https://blogs.msdn.com/tsmatsuz">松崎</A>と連載を行ってきましたが、連載の総集編として20ページにわたり特集記事を書きました。Windows 7 の機能を使ったプログラミングについて一通り網羅していますので、ぜひお読みいただけたらと思います。(立ち読みじゃなくて買ってね！ちなみに特集1 はAndroidです…。) </P>
<P><SPAN style="FONT-FAMILY: メイリオ; COLOR: black; FONT-SIZE: 10pt; mso-themecolor: text1; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang=EN-US><A href="https://itpro.nikkeibp.co.jp/NSW/index.html"><SPAN lang=EN-US><SPAN lang=EN-US><FONT color=#0000ff>日経ソフトウエア</FONT></SPAN></SPAN></A></SPAN></P>
<P><SPAN style="FONT-FAMILY: メイリオ; COLOR: black; FONT-SIZE: 10pt; mso-themecolor: text1; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang=EN-US>Amazon.co.jp で買っちゃう -&gt;<BR></SPAN><SPAN style="FONT-FAMILY: メイリオ; COLOR: black; FONT-SIZE: 10pt; mso-themecolor: text1; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang=EN-US><A href="https://www.amazon.co.jp/dp/B003H2ECHA/">https://www.amazon.co.jp/dp/B003H2ECHA/</A></SPAN></P>]]></content:encoded>
    </item>
    <item>
      <title>意外と知られていない Windows のエラーコードの数々</title>
      <link>https://docs.microsoft.com/archive/blogs/masaki/windows</link>
      <pubDate>Thu, 04 Mar 2010 05:56:00 GMT</pubDate>
      <dc:creator><![CDATA[jhmasuji]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/masaki/2010/03/04/windows/</guid>
      <description><![CDATA[MSDN検索術が公開されたのでそれに合わせてメモなど。開発者の皆様は (私もそうなのですが･･･)...]]></description>
      <content:encoded><![CDATA[<P><A title="MSDN 検索術" href="https://msdn.microsoft.com/ja-jp/kensaku.aspx" target=_blank mce_href="https://msdn.microsoft.com/ja-jp/kensaku.aspx">MSDN検索術</A>が公開されたのでそれに合わせてメモなど。<BR>開発者の皆様は (私もそうなのですが･･･) 毎日のようにとんでもない量のエラーメッセージを目にされていると思います。</P>
<P>ところで、これらのエラーメッセージ、エラーコードがどのような区分になっているかご存知でしょうか？今回は、よく目にするものと、その見分け方について簡単にご紹介させていただきたいと思います。</P>
<P>エラーを正しく理解することは正確な報告を可能にし、また問題解決にも役立ちます。</P>
<P>1. .NET Framework における例外</P>
<P>こちらは (見た目は) わかりやすいですよね。例えば何か存在しないファイルを開こうとすると…</P>
<P>Unhandled Exception: System.IO.FileNotFoundException: Could not find file 'C:\Demos\ExceptionDemo\bin\Debug\何か。'.<BR>File name: 'C:\Demos\ExceptionDemo\bin\Debug\何か。'<BR>&nbsp;&nbsp; at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)<BR>…<BR>&nbsp;&nbsp; at System.IO.StreamReader..ctor(String path, Boolean detectEncodingFromByteOrderMarks)<BR>&nbsp;&nbsp; at ExceptionDemo.Program.Main(String[] args) in C:\Demos\ExceptionDemo\Program.cs:line 12 
<P>このような例外が発生すると思います。全ての例外は System.Exception クラスを継承しなければならないため、System.Exception クラスを通して、 
<P>Data …追加情報。この例では空のコレクション<BR>HelpLink …ヘルプへの URN。この例では null<BR>InnerException …この例外を発生させる元となった例外。この例では null<BR>Message …例外の説明。この例では “Could not find file 'C:\Demos\ExceptionDemo\bin\Debug\何か。'.”<BR>Source …例外を投げたアプリケーションやオブジェクト。この例では “mscorlib” つまり、.NET Framework の基本ライブラリ<BR>StackTrace …例外が投げられるまでの呼び出しの流れ。この例では “at System.IO… ~ Program.cs:line 12”<BR>TargetSite …例外を投げたメソッド。この例では {Void WinIOError(Int32, System.String)}</P>
<P>さらに、今回は System.Exception –&gt; … –&gt; System.IO.FileNotFoundException と継承されているので、FileNotFoundException 内の</P>
<P>FileName …ファイル名。この場合は @”C:\Demos\ExceptionDemo\bin\Debug\何か。”</P>
<P>などが利用できます。さて、問題解決には何が重要になるでしょうか？「例外が発生した！」と報告しても誰にも原因はわからないですよね。<BR>例外の場合、例外の種類、StackTrace と引数が重要になります。どの関数を呼んだ事で例外が発生したのかを知り、呼び出した関数への引数に問題がなかったかがわかれば再現させることが容易になります。例えばこの場合ですと、</P>
<P>「Program.cs の 12行目、System.IO.StreamReader..ctor(String path, Boolean detectEncodingFromByteOrderMarks) の呼び出しにおいて System.IO.FileNotFound が発生、引数には “何か。” が与えられていた。」と報告すれば、「”何か。” という存在しないファイルを読み出そうとしたのだな」ということが確実に相手に伝わります。</P>
<P>複雑な問題においては、InnerException にも着目しましょう。根本的な原因がそこに書かれている場合もあります。フォーラムなどで質問する際には例外に含まれる情報を活用いただければと思います。</P>
<P mce_keep="true">&nbsp;</P>
<P>2. Win32, COM におけるエラーコード</P>
<P>.NET における例外はこのくらいにして Win32, COM (Component Object Model) においてはどのようなエラーが生じるのでしょうか。Native のプログラムを書いていると 0xC0000005 というエラーコードに遭遇することが多いと思いますが、これは Win32 における一般保護例外、つまりアクセスできない領域に対するエラーのコードです。はて、なぜこんなに長いエラーコードになっているのでしょう？実はエラーコードの先頭には意味がついています。エラーコードの 32bit の中身を分解すると以下のようになります。</P>
<P>Win32 の場合</P>
<P>| Severity Code (2bit) | Customer code flag (1bit) | Reserved (1bit) | Facility Code (12bit) | Code (16bit) |</P>
<P>COM の場合</P>
<P>| Severity Code (1bit) | Reserved (4bit) | Facility Code (11bit) | Code (16bit) |</P>
<P>ここで、Severity Code は重要度を表しています。Win32 の場合、00b が成功、01b が情報を含むもの、10b が警告、11b がエラーとなっています。Windows が返すエラーには Customer Code Flag は設定されていないので先頭 4bit …つまり、16進数表記をした際の最初の一文字がエラーコードの重要度となります。0xC0000005 は ‘C’ で始まっているので 0xC = 1100b つまりエラーを示しています。ただ、警告や情報は滅多に見かけないので 0xC0123456 といったエラーコードを目にすることになります。</P>
<P>一般保護例外 0xC0000005 は、Severity = 11b から「エラー」であり、Code = 5 (ERROR_ACCESS_DENIED) から「Access is denied. (アクセスが拒否された)」ことが読み取れるのです。</P>
<P>さて、COM の場合は先頭が少し異なりますよね？ Severity Code が 1bit となっています。なので COM のエラーコード (HRESULT) は 0x80123456 といった形になります。</P>
<P>ここがポイントです！つまり、たいていの場合、0xC で始まっているものは Win32 のエラーコード、0x8 で始まっているものは COM のエラーコードという見分け方ができるのです。もし 10進数でエラーコードが –1073741824 のような負の大きな値で –1 始まりのものは Win32, –2147483648 のような –2 始まりのものは COM のエラーコードである可能性が高いです。</P>
<P>これは電卓をプログラマモード (関数モード) にすることで変換することが可能です。エラーコードを検索しても出てこない場合には、16進数のコードを 10進数に直してみる、あるいはその逆を行うことで解決策が引っかかる可能性が高くなります。</P>
<P>また、下位 16bit にエラーの内容を示すコードが入っているため、そこだけ抜き出して Error Lookup ツールなどを利用すると何かヒントが得られるかも知れません。</P>
<P mce_keep="true">&nbsp;</P>
<P>3. 一般的なエラーコード</P>
<P>C言語の関数の結果、またイベントログに記載されるエラーコードは、このような長いエラーコード形式ではないのでせいぜい数千までの値を取ることが多いと思います。そのような場合には 16進数で検索せず、10進数で検索するほうがよい結果が得られる可能性が高いと思います。Windows SDK に含まれる、WinError.h を開いて検索するというのも一つの手です。</P>
<P mce_keep="true">&nbsp;</P>
<P>まとめ。</P>
<P>例外など、型情報が得られるものについては例外の種類を見分ける。</P>
<P>8&nbsp;で始まっている、または –21… という大きな負の値なら COM のエラーコードであることを疑う。<BR>C&nbsp;で始まっている、または –10… という大きな負の値なら Win32 のエラーコードであることを疑う。<BR>覚えられる範囲の数字なら一般的なエラーコードを疑う。</P>
<P>もしかしたら 10進数で負の値になっているものは 16進数に変換することで解決策が見つかるかも知れません。</P>
<P>このように、ちょっとした見分けかたを覚えておくだけでもエラーコードからより多くの情報、または検索に頼った問題解決のヒントが得られます。</P>
<P># 訂正しました。mayukiさん、つーささん、ありがとうございます！</P>]]></content:encoded>
    </item>
  </channel>
</rss>