tag:blogger.com,1999:blog-28214553334076750752024-03-14T09:09:17.146+09:00NKY-TECH. ソフトウェア開発部~開発チーム奮闘記~<br>
C/C++, C# と WindowsAPI, DirectXしゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.comBlogger36125tag:blogger.com,1999:blog-2821455333407675075.post-56858924933176726482013-10-06T21:06:00.002+09:002013-10-06T21:06:29.524+09:00gnuplotのデータ点を白抜きにする<p>gnuplotでEPSにグラフを書き出す際, データ点を<b>「輪郭+白の塗りつぶし」</b>という書式にすることはできない (のではないかと思う). そこで, この記事では<b>point type 65辺り</b>を使ってgnuplotでグラフを描画したあと, <b>出力されるepsを直接修正する</b>ことで輪郭の中を白く塗りつぶしてみる.</p>
<p>gnuplotでは以下のような感じでグラフを描く. (GNUPLOT Version 4.6 patchlevel 3)</p>
<blockquote><pre><kbd>set term postscript eps enhanced color
set output 'out.eps'
plot ‘./data.txt’ u 1:2 w p pt 65
unset output</kbd></pre></blockquote>
<p>出力されたepsをPowershellスクリプト:</p>
<script src="http://pastebin.com/embed_js.php?i=nd8KFcvG"></script>
<p>で処理すると, pt 65, 66, … あたりの輪郭線だけのpoint typeで描画したデータ点が「輪郭+白の塗りつぶし」に変更できる.</p>
<p>※ちなみに,エラーバー付きのプロットでも大丈夫なはずです.</p>
<p>※上のスクリプトは, マイナス記号を(ハイフンでなく)正しく表示する修正も含んでいます.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-79673846905805885182013-10-03T17:23:00.000+09:002013-10-08T22:40:25.821+09:00DXライブラリをビルドしてみる<p>しばらく放置していたらEinさんのページが変わっていたのでリンク修正.開発環境も変わってたので更新してみた.</p>
<p>デスクトップにミクさんを出現させようということで, ちょっと調べてみる. ミクさんを出現させるだけなら既に沢山?やられているので, 自分でやることもないんだけれど...</p>
<p>PMD/PMXファイルを読みこめるライブラリはいろいろあるらしい.</p>
<ul>
<li><a href="http://www6.atwiki.jp/vpvpwiki/pages/288.html?guid=on">VPVP wiki: MMD周辺ライブラリ</a></li>
<li><a href="https://mmdd.codeplex.com/">MMDD for .NET</a> (←現在開発中らしいので期待!)<br />さっきgit cloneしてテストプロジェクトで試してみたら, 物理演算ONにすると頂点がどこかへ行ってしまった.</li>
</ul>
<p>3D Computer Graphicsなんて全然良くわからないので, とりあえず<a href="http://homepage2.nifty.com/natupaji/DxLib/">DXライブラリ</a>あたりから触って見ることにした.</p>
<p>が, まずライブラリをビルドすると, コンパイラに<code>unresolved external symbol __iob</code>と怒られてしまった. (覚えてないがlibpngあたりだった気がする)</p>
<blockquote>
<p><a href="http://social.msdn.microsoft.com/Forums/vstudio/en-US/1e4a4d2e-e126-46e5-a713-8a28bcd6e392/error-lnk2001-unresolved-external-symbol-iob">in sources <code>USE_MSVCRT=1</code> does fix the issue.</a></p>
</blockquote>
<p>なんかlibcに依存してコンパイルされてるのが元凶らしい, ということで依存ライブラリもまとめてビルドします. </p>
<h2>共通の設定とか</h2>
<p>基本的にはVisual Studio 2012の既定値だけど, 全部x64向けにビルドしました<br />今回は音声関係の機能は使用しないので, その辺はDxCompileConfig.hで無視するように設定しました. </p>
<h2><a href="http://www.zlib.net/">zlib</a></h2>
<ol>
<li>ソースコードをダウンロード</li>
<li>Win32スタティックライブラリの空のプロジェクトを作成</li>
<li>DLしたソースコードのうち,ルートディレクトリにある.cと.hをプロジェクトに追加</li>
<li>ビルドできるはず</li>
</ol>
<h2><a href="http://www.libpng.org/pub/png/libpng.html">libpng</a></h2>
<ol>
<li>ソースコードをダウンロード</li>
<li>Win32スタティックライブラリの空のプロジェクトを作成</li>
<li>DLしたソースコードのうち,ルートディレクトリにある.cと.h(ただし,example.cを除く)をプロジェクトに追加</li>
<li>scriptsフォルダにある<kbd>pnglibconf.h.prebuild</kbd>を<kbd>pnglibconf.h</kbd>にリネームしてプロジェクトに追加</li>
<li>先に作ったzlibのProjectDirにincludeのパスを通したらビルドできるはず</li>
</ol>
<h2><a href="http://ijg.org/">libjpeg</a></h2>
<ol>
<li>ソースコードをダウンロード</li>
<li>Win32スタティックライブラリの空のプロジェクトを作成</li>
<li>jconfig.vcをjconfig.hにリネーム</li>
<li>.c .h (Example.c, jmemdos.c, jmemmac.c 以外)をプロジェクトに追加</li>
<li>ビルドできるはず</li>
</ol>
<h2><a href="http://bulletphysics.org/wordpress/">Bullet Physics</a></h2>
<ol>
<li>ソースコードをダウンロード</li>
<li>さっきまでの同じで,空のプロジェクト→ソースファイル追加でビルドはできるはず</li>
</ol>
<p>Bullet Physicsはビルドはできるけど,そのままだとベクトルの代入操作のところでアクセス違反してしまう. アラインメントの問題だけど, <kbd>btScalar.h</kbd>に定義されている</p>
<blockquote><p><kbd>#define BT_USE_SSE</kbd></p></blockquote>
<p>をコメントアウトするとちゃんと動きました</p>
<h2>DXライブラリ</h2>
<p>これもソースファイル適当に空のプロジェクトにまとめて追加して, IncludeとLibraryのパス通します.</p>
<p><kbd>DxLib.h</kbd>の<kbd>ライブラリリンク定義</kbd>のところを適当にコメントアウトしたり, Bullet Physicsはファイル名変わってるから直したりします. するとビルドが通るので, 使えるようになります.</p>
<p>なんか今回適当で誰の役に立つのか謎ですが, こんな感じでDXライブラリ使えるようになりました.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-67307196555633941742011-11-06T15:09:00.007+09:002011-11-06T15:56:02.388+09:00WPF Toolkit - Chart コントロール<p>もっとも基本的と思われる折れ線グラフの表示を,コードから行う方法です.</p>
<blockquote><code><pre><font color="blue">using</font> System.Windows.Controls.DataVisualization.Charting;
<font color="blue">using</font> System.Windows.Media;
<font color="blue">using</font> System.Windows;</pre></code></blockquote>
<hr />
<blockquote><code><pre><font color="blue">var</font> chart = <font color="blue">new</font> <font color="steelblue">Chart</font>();
<font color="blue">var</font> points = <font color="blue">new</font> <font color="steelblue">PointCollection</font>();
points.Add(<font color="blue">new</font> <font color="steelblue">Point</font>(1, 2));
points.Add(<font color="blue">new</font> <font color="steelblue">Point</font>(2, 4));
points.Add(<font color="blue">new</font> <font color="steelblue">Point</font>(3, 3));
<font color="blue">var</font> xAxis = <font color="blue">new</font> <font color="steelblue">LinearAxis</font>() { Maximum = 10, Minimum = 0, Orientation = <font color="steelblue">AxisOrientation</font>.X };
<font color="blue">var</font> yAxis = <font color="blue">new</font> <font color="steelblue">LinearAxis</font>() { Maximum = 10, Minimum = 0, Orientation = <font color="steelblue">AxisOrientation</font>.Y };
chart.Axes.Add(xAxis);
chart.Axes.Add(yAxis);
<font color="blue">var</font> series = <font color="blue">new</font> <font color="steelblue">LineSeries</font>() { DependentValuePath = <font color="brown">"Y"</font>, IndependentValuePath = <font color="brown">"X"</font>, ItemsSource = points };
chart.Series.Add(series);</pre></code></blockquote>
<p>あとは<code>chart</code>のインスタンスをコントロールとして追加すれば,表示されるはずです.</p>
<p>参考:<a href="http://forums.silverlight.net/t/193248.aspx" target="_blank">LineSeries chart : "No suitable axis is available for plotting the dependent value"</a>の回答に依れば, <a href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=482" target="_blank">Consuming Binary Encoded WCF 4.0 Service in Silverlight 3.0 Applications </a>や<a href="http://www.silverlightshow.net/items/Silverlight-Toolkit-Overview.aspx" target="_blank">Silverlight 2 Toolkit Overview</a>が役立つそうです.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-63675023191353665592011-09-08T21:05:00.006+09:002011-09-08T21:55:06.725+09:00XML Schemaを使って,XMLをパースする<p>この記事では<a href="http://www.topografix.com/gpx.asp" target="_blank">GPX (GPS eXchange Format)</a>ファイルを読み込む方法を記述します.</p>
<p>まずは,XML Schema <a href="http://www.topografix.com/GPX/1/1/gpx.xsd" target="_blank">GPX 1.1 Schema (gpx.xsd)</a>を貰ってきます.</p>
<p><a href="http://www.microsofttranslator.com/bv.aspx?ref=SERP&br=ro&mkt=ja-JP&dl=en&lp=JA_EN&a=http%3a%2f%2fmsdn.microsoft.com%2fja-jp%2flibrary%2fx6c1kb0s(VS.80).aspx" target="_blank">XML スキーマ定義 ツール</a>を用いてXML Schemaからコードを生成します.</p>
<blockquote><kbd>xsd gpx.xsd /classes /language:cs /namespace:Gpx</kbd></blockquote>
<p>生成されたコード gpx.cs を任意のプロジェクトに組み込みます.以下のようにしてgpxファイルを読み込むことができます.</p>
<blockquote><pre><code>Gpx.<font color="steelblue">gpxType</font> gpx;
<font color="blue">using</font> (<font color="blue">var</font> file = <font color="blue">new</font> System.IO.<font color="steelblue">FileStream</font>(<font color="brown">"...\\test.gpx"</font>, System.IO.<font color="steelblue">FileMode</font>.Open))
{
<font color="blue">var</font> xmls = <font color="blue">new</font> System.Xml.Serialization.<font color="steelblue">XmlSerializer</font>(<font color="blue">typeof</font>(Gpx.<font color="steelblue">gpxType</font>));
gpx = (Gpx.<font color="steelblue">gpxType</font>)xmls.Deserialize(file);
file.Close();
}</code></pre></blockquote>
<p>参考:<a href="http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=511" target="_blank">The GPX Exchange Format</a>,<a href="http://www.profretterer.org/Classes/2010-11/Fall/ProgrammingEnvironments/Recordings/Default.aspx" target="_blank">Recordings and Documents</a></p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-40998876318469067202011-07-13T17:50:00.005+09:002011-07-13T19:45:15.370+09:00dynamicとCOMとメモリ リーク<p>C#から(「CLR上から」と言った方が良いかもしれないが)COMインタフェースを用いる場合には細心の注意を払う必要がある.</p>
<p>今回発生した問題は,Microsoft Internet Controls(<code>SHDocVw</code>名前空間)およびMicrosoft HTML Object Library(<code>mshtml</code>名前空間)を用いてInternet Explorerと相互作用するソフトウェアを開発している際に発生したメモリ リークである.</p>
<p>リークの直接的原因は,<a href="http://msdn.microsoft.com/ja-jp/library/dd264741.aspx" target="_blank"><code>dynamic</code>型</a>を用いてCOMインタフェースを管理したことにあったようだ.</p>
<h3>メモリリークを起こすコード</h3>
<blockquote><pre><code>SHDocVw.<font color="steelblue">InternetExplorer</font> ie = <font color="blue">new</font> SHDocVw.<font color="steelblue">InternetExplorer</font>();
<font color="blue">dynamic</font> doc = ie.Document;
<font color="steelblue">Marshal</font>.ReleaseComObject(doc);
<font color="steelblue">Marshal</font>.ReleaseComObject(ie);</code></pre></blockquote>
<h3>メモリリークを起こさない(と思われる)コード</h3>
<blockquote><pre><code>SHDocVw.<font color="steelblue">InternetExplorer</font> ie = <font color="blue">new</font> SHDocVw.<font color="steelblue">InternetExplorer</font>();
mshtml.<font color="steelblue">IHTMLDocument2</font> doc = ie.Document;
<font color="steelblue">Marshal</font>.ReleaseComObject(doc);
<font color="steelblue">Marshal</font>.ReleaseComObject(ie);</code></pre></blockquote>
<p>COMインタフェースのプロパティやメソッドの戻り値が<code>dynamic</code>だからと言って,<code>dynamic</code>(あるいは<code>var</code>)を用いないように注意する必要がありそうだ.</p>
<p>参考:<a href="http://ufcpp.net/study/csharp/sp4_dynamic.html#how" target="_blank">dynamic(C# によるプログラミング入門)</a>,<a href="http://blogs.msdn.com/b/cbrumme/archive/2003/04/16/51355.aspx" target="_blank">ReleaseComObject(cbrumme's WebLog)</a></p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-80245054249240484272011-06-20T17:19:00.006+09:002011-06-20T19:44:01.053+09:00Team Foundation Server 2010の導入<p>Microsoft® Visual Studio® Team Foundation Server 2010をWindows 7上に試験導入してみた.(サーバーは1台で構成)</p>
<p>構成しても,ファイアウォールが邪魔して,導入したマシン以外からは接続できなかった.</p>
<p>ファイアウォールの受信規則:<u>Team Foundation Server TFSWebSite:8080</u>の適用先プロファイルが<u>パブリック</u>のみになっていたのが原因のようでした.プロファイルの<u>プライベート</u>にチェックを入れることで,無事他のマシンからも接続できるようになった.</p>
<p>参考:<a href="http://kazu-riders.blog.so-net.ne.jp/2009-05-22-1">Team Foundation Server構築 (シングルサーバー配置) (4/5)</a></p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com1tag:blogger.com,1999:blog-2821455333407675075.post-33106350837000230362011-05-01T19:34:00.007+09:002011-05-01T23:37:18.439+09:00リボンUIを使用する<p><a href="http://msdn.microsoft.com/ja-jp/windows/ee817147.aspx" target="_blank">ハンズオン ラボ: Windows Ribbon ~ Win32 ネイティブ アプリケーションへのリボンの追加 ~</a>を読んだ方が良い.</p>
<p>MSDNにサンプル<a href="http://msdn.microsoft.com/en-us/library/dd371194(v=VS.85).aspx" target="_blank">SimpleRibbon Sample</a>があります.Visual Studio 2010 C/C++での情報です.</p>
<ol>
<li>リボンUIを採用したアプリケーションを開発するためには,最新のWindows SDK(ここではWindows7.1SDKとします)をインストールする必要があります.(VS2010に同梱されているSDKではダメです.)</li>
<li>Win32 プロジェクトを作成したら,プロジェクトのプロパティ ページの<u>構成プロパティ</u>→<u>全般</u>→<u>プラットフォーム ツールセット</u>を「Windows7.1SDK」に変更します.</li>
<li>リボンのデザイン等を定義するXMLファイル(ここではRibbon.xml)をプロジェクトに追加します.追加したXMLファイルのプロパティ ページで<u>項目の種類</u>を「カスタム ビルド ツール」に変更し,カスタム ビルド ツールのプロパティを設定します.
<table border="1">
<tr><td>コマンド ライン</td><td><kbd>uicc.exe Ribbon.xml $(IntDir)Ribbon.bml /header:$(IntDir)RibbonUI.h /res:$(IntDir)RibbonUI.rc /name:Ribbon</kbd></td></tr>
<tr><td>説明</td><td>(この説明はビルド時に出力されるようだ)</td></tr>
<tr><td>出力ファイル</td><td><kbd>Ribbon.bml;RibbonUI.rc;RibbonUI.h</kbd></td></tr>
</table>
</li>
<li>プロジェクト内のリソースファイルに<code>#include "RibbonUI.rc"</code>の一行を追加して,ビルド時に生成されるリソースファイルを埋め込むよう設定します.このとき,プロジェクトのプロパティ ページの<u>構成プロパティ</u>→<u>リソース</u>で<u>追加のインクルード ディレクトリ</u>に<code>$(IntDir)</code>(RibbonUI.rcの生成されるディレクトリ)を追加します.</li>
<li>SimpleRibbon Sampleのようなマニフェストファイルを作成します.</li>
</ol>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-32940760301072104722011-04-23T23:45:00.004+09:002011-04-23T23:52:43.066+09:00CUDAにしようか<p>しばらく放置されていたGPUコンピューティングですが,機会があって遊んでみることになりました.</p>
<p>DirectComputeを直接使って計算するには<a href="http://msdn.microsoft.com/en-us/library/bb509561(v=VS.85).aspx">HLSL(High Level Shading Language)</a>を使って開発することになるのですが,(多くの場合)そこで問題が発生します.</p>
<p>まず<code>double</code>での開発が予想以上に難しい...というのも,組み込み関数は<code>double</code>に対応していないのです.(私の実力不足と言えばそれまでですがorz)</p>
<p>たとえば指数関数を使おうとすると,ご存知の通りマクローリン展開などで適当に実装するわけにはいきません.加えて,乱数が必要な計算の場合には(基本的に)自分で実装することになりそうです.<a href="http://msdn.microsoft.com/en-us/library/bb509629(v=VS.85).aspx">noise</a>という疑似乱数生成用の組み込み関数はありますが,少々ヤバそうです.(グラフィクス関連の用途には便利だそうですが)</p>
<p>結果的に,HLSLでの開発は断念ということに.代替手段として<a href="http://www.nvidia.co.jp/object/cuda_home_new_jp.html">CUDA(NVIDIA)</a>,あるいは<a href="http://www.amd.com/US/PRODUCTS/TECHNOLOGIES/STREAM-TECHNOLOGY/Pages/stream-technology.aspx">ATI Stream(AMD)</a>などがあります.</p>
<p>新しくグラボを購入するほどではなさそうなので,CUDAを使ってみよう!</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-11094375616064110572011-02-06T21:39:00.016+09:002011-09-08T21:05:10.137+09:00Internet Explorerの自動操作<p>C#を使ってInternet Explorerを自動操作します.</p>
<p>※もちろん.NET Frameworkの使える言語ならC#以外でも同じことが行えるはずです.</p>
<p>まず,次の2つのファイルへの参照を追加します.どちらも<kbd>C:\Windows\System32<kbd>にあると思います.</p>
<ul>
<li>mshtml.tlb</li>
<li>shdocvw.dll</li>
</ul>
<p>IEの自動化に使うクラスは,<a href="http://msdn.microsoft.com/en-us/library/aa752084(v=VS.85).aspx" target="_blank">InternetExplorer Object</a>,<a href="http://msdn.microsoft.com/en-us/library/aa741322(v=VS.85).aspx" target="_blank">Interfaces and Scripting Objects</a>のリストにある<code>IHTML*</code>というクラス達になります.</p>
<p><font color="red"><del>データ型のよくわからないオブジェクトを沢山扱うことになりますので,<a href="http://msdn.microsoft.com/en-us/library/dd264741.aspx" target="_blank">dynamic</a>キーワードを使うと便利です.</del></font><a href="http://nky-tech-sdt.blogspot.com/2011/07/dynamiccom.html"><font color="red">こちらの記事を<strong>必ず</strong>確認して下さい.</font></a></p>
<p>後は,簡単な使い方をメモしておきます.</p>
<ul>
<li>インターネット・エクスプローラを起動・終了を行う.<blockquote><pre><code>SHDocVw.<font color="steelblue">InternetExplorer</font> ie = <font color="blue">new</font> SHDocVw.<font color="steelblue">InternetExplorer</font>();
ie.Visible = <font color="blue">true</font>;
ie.Quit();</code></pre></blockquote></li>
<li>ページの移動を行う.<blockquote><pre><code>ie.Navigate("http://www.bing.com/");</code></pre></blockquote>ページ移動の完了を知るには<code>ie.NavigateComplete2</code>イベントをキャッチ.</li>
<li>リンクを探して押したい.<blockquote><pre><code><font color="blue">foreach</font> (<font color="blue">dynamic</font> link <font color="blue">in</font> ie.Document.links)
{
<font color="blue">if</font> (link.href == "http://jp.msn.com/")
{
link.click();
<font color="green">// ie.Navigate(link.href); という方法もある</font>
<font color="blue">break</font>;
}
}</code></pre></blockquote></li>
<li>フォームを自動入力したい.<blockquote><pre><code><font color="blue">foreach</font> (<font color="blue">dynamic</font> form <font color="blue">in</font> ie.Document.forms)
{
<font color="blue">if</font> (form.action == <font color="brown">"/search"</font>)
{
<font color="blue">foreach</font> (<font color="blue">dynamic</font> element <font color="blue">in</font> form.Descendants)
<font color="green">//Descendantsはchildrenプロパティを使って自分で実装します</font>
{
<font color="blue">switch</font> ((<font color="blue">string</font>)element.getAttribute(<font color="brown">"name"</font>))
{
<font color="blue">case</font> <font color="brown">"q"</font>:
element.setAttribute(<font color="brown">"value"</font>, <font color="brown">"テスト"</font>);
<font color="blue">break</font>;
<font color="blue">case</font> <font color="brown">"go"</font>:
element.click();
<font color="blue">return</font>;
}
}
}
}</code></pre></blockquote></li>
</ul>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com2tag:blogger.com,1999:blog-2821455333407675075.post-52764948469455245312010-11-03T00:48:00.000+09:002010-11-03T00:48:28.384+09:00日本語でプログラミング<p>C#のプログラムを,Visual Studio 2010で書いていたのですが,なんと日本語の変数名,関数名が使えるんですね!Unicodeの夜明けってことでしょうか.</p>
<p>固有名詞とかを無理やり英語に訳さなくてよくなりました.もっと早く知ってればよかったのに~><</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-35888407538920852012010-09-29T15:22:00.000+09:002010-09-29T15:22:05.312+09:00Microsoft VPLでRS232Cを使う<p>ちょっと前の<a href="http://msdn.microsoft.com/ja-jp/magazine/ee309885.aspx" target="_blannk">MSDNマガジンに記事</a>があったのでメモ.自分で作るのは面倒という方にもおすすめ</p>
<p>ケーブルはUSBで繋がっていても,中身はRS232Cなんてことはよくあるわけで,これがあれば百人力!</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-80581478911322313922010-09-22T14:51:00.001+09:002010-09-28T01:19:51.316+09:00Visual Programming Language<p><a href="http://msdn.microsoft.com/en-us/library/bb483088.aspx" target="_blank">VPL(Microsoft Visual Programming Language)</a>とは,一言でいえば<a href="http://www.bing.com/images/search?q=%e3%81%97%e3%83%bc%e3%81%bd%e3%82%93#" target="_blank">しーぽん</a>が使っていたプログラミング言語(?)の走りだ.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/bb483088.aspx" target="_blank">MSDNのページ</a>にあるSSを見ればわかるように,たくさんのブロックを繋げてプログラムを作成することになる.1つ1つのブロックはサービスと呼ばれるクラス(みたいなもの)のインスタンスである.簡単に自作できるので,実験用の制御ソフトを作るときなどに威力を発揮すると思う.結構高度なソフトまで開発できそうなのが凄い.</p>
<p>Visual Studioと<a href="http://www.microsoft.com/japan/robotics/default.mspx" target="_blank">Robotics Studio</a>をインストールすれば,Visual Studioのプロジェクト・テンプレートにDSSというのが追加される.このテンプレートでプロジェクトを作成して,<a href="http://msdn.microsoft.com/en-us/library/dd145262.aspx" target="_blank">チュートリアル</a>をやればよい.</p>
<p>Robotics Studioは,名前の通りロボットの設計が主目的のようだが,「ロボットを作る」=「システムを作る」であるから,ロボットの作成に限らず様々なシナリオで使うことができる.</p>
<p>GPGPUの方で遊ぶ時間がなくなってしまった・・・残念orz</p>
<h4>2010/09/28追記</h4>
<p><a href="http://www.saturn.dti.ne.jp/~npaka/robotics/ccr.html" target="_blank">CCRプログラミング入門</a>:MSDNのサンプルだけではちょっと分からなかったArbiterとかPortSetとかが分かりやすく説明されている.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-52369523224475218632010-09-09T17:48:00.001+09:002011-04-23T23:53:08.212+09:00DirectComputeの注意点<p><a href="http://nky-tech-sdt.blogspot.com/2010/09/computeshader_04.html" target="_blank">ComputeShaderの基本</a>でシェーダの基本的なことは分かったが,実用に供するにはまだ足りないようだ.</p>
<h4>ドライバのタイムアウト</h4>
<p>Windows Vistaでは,GPUが2秒(既定)以内にタスクを終わらない場合,ハングと見なされてGPUのハードウェアの状態がリセットされます.(<a href="http://www.microsoft.com/japan/whdc/device/display/wddm_timeout.mspx" target="_blank">WDDM によるタイムアウトの検出と GPU の回復</a>)</p>
<p>計算にどう影響するかはわかりません.</p>
<h4>ShaderModel 5.0の制約</h4>
<p>Shader Modelのバージョン,シェーダの種類毎に色々と制限がある.(<a href="http://en.wikipedia.org/wiki/High_Level_Shader_Language" target="_blank">High Level Shader Language</a>,<a href="http://dench.flatlib.jp/shadermodel#shadermodel_50" target="_blank">HYPERでんち(shadermodel)</a>)</p>
<p>仕様書とか見つけられないTT</p>
<p>ただ,Dispatchするときの<code>X * Y * Z</code>・スレッドグループ数・シェーダのコードのサイズ,の積がある大きさを超えると正しく動作しなくなるようである(?)<br /><a href="http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld07/directxworld07_01.html" target="_blank">プログラマブル・シェーダによる積極的なGPUの活用</a>にもループ回数を大きくできないということが書かれている,関係あるかも.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-38447797173139376282010-09-04T18:03:00.058+09:002011-04-23T23:53:08.213+09:00ComputeShaderの基本<p>大体の使い方は,以下のようなものを見ればわかる.</p>
<ul>
<li>Microsoft DirectX SDK (June 2010)のサンプル:<a href="http://msdn.microsoft.com/en-us/library/ee416557(VS.85).aspx" target="_blank">BasicCompute11</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff476331(v=VS.85).aspx" target="_blank">Compute Shader Overview</a>(DirectX 11非対応デバイスを使うときの注意が書いてある)</li>
<li><a href="http://channel9.msdn.com/tags/DirectCompute-Lecture-Series/" target="_blank">DirectCompute Lecture Series</a>(最初の方だけでも見ると,GPGPUが何者かよくわかる.オススメ!)</li>
<li><a href="http://pc.watch.impress.co.jp/docs/2007/0326/kaigai346.htm" target="_blank">CPUとGPUの大きな違い</a>(GPUの特性がわかるので,参考に)</li>
</ul>
<p>私の場合は,<a href="http://slimdx.org/" target="_blank">SlimDX</a>をC#から使用して,ソフトを組むことにした.実際に計算するコードは<a href="http://msdn.microsoft.com/en-us/library/bb509561(v=VS.85).aspx" target="_blank">HLSL</a>を使って書かなくてはならないが,C言語チックな仕様なので何とかなるだろうと思う.因みに,Direct3Dを使うのはこれが初めて.</p>
<h4>スレッド・グループ</h4>
<p>スレッドグループについては<a href="http://msdn.microsoft.com/en-us/library/ff471442(v=VS.85).aspx" target="_blank">ここ(MSDN)</a>を見ると分かりやすく説明されている.また,Dispatchする際のスレッドグループ数は<a href="http://msdn.microsoft.com/en-us/library/ff476405(v=VS.85).aspx" target="_blank">MSDN</a>にはX,Y,Zそれぞれが65535以下であると記されている.(私の環境では,X = Y = 65535, Z = 1 の場合正しく動かないようだが,それついては特に記述がないような)</p>
<p>スレッドグループのサイズは,SDKのサンプルでは(1,1,1)となっている.しかしながら,この設定はパフォーマンス的によろしくないので,適度に大きくしたほうがよい.大きくしすぎるのもよくない.(設定の目安とかはよくわからないですorz)</p>
<h4>Shader Resource View(SRV)とUnordered Access View(UAV)</h4>
<p>Resource Viewとはリソースのデータ(バッファ)へのアクセス方法を規定するもので,1つのリソースに対して複数のViewを作成できる.</p>
<p>演算シェーダのデータの入出力には,このResource Viewを用いる.演算シェーダにデータを渡す方にはSRV,演算シェーダの結果を書き込む方にはUAVが使われる.</p>
<p>SRVはRead-Onlyであり,シェーダ内で書き換えることはできない.また,同じリソースを同時にSRV・UAVの両方としてシェーダに渡すことはできない.</p>
<p>UAVはランダムアクセス(Unordered Access)をするためのResource Viewであり,ReadまたはWriteのアクセスが可能である.ただし,連続したメモリ領域に書込むようにした方が効率的である.また,読み書きを同時に行う場合には<a href="http://en.wikipedia.org/wiki/Hazard_(computer_architecture)#Read_After_Write_.28RAW.29" target="_blank">RAW(read-after-write) hazard</a>に注意.</p>
<p>参考:<a href="http://msdn.microsoft.com/en-us/library/ff476900(v=VS.85).aspx" target="_blank">Introduction to a Resource in Direct3D 11</a>,<a href="http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=17c44351-dceb-4c03-96e7-ab0534d3b33a" target="_blank">DirectX 11 DirectCompute: A Teraflop for Everyone</a>,<a href="http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=453973af-8470-4e3f-96e1-69ed67a67cb4" target="_blank">Best Practices for DirectX 11 Development</a></p>
<h4>Structured BufferとRaw Buffer</h4>
<p>Structured Bufferは同じサイズの要素(構造体)の配列である.一方,Raw Bufferというのは,Byte Address Bufferのことであり,バイト・オフセットを使ってデータにアクセスするものである.詳細については,<a href="http://msdn.microsoft.com/en-us/library/ff476335(v=VS.85).aspx" target="_blank">New Resource Types</a>を確認する.</p>
<p>初めに紹介したSDKサンプルのシェーダのコードを見てもわかるとおり,Structured Bufferを使うと楽にアクセスできる.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-71151767835544814572010-09-03T14:51:00.003+09:002011-04-23T23:53:08.214+09:00DirectComputeを選択した理由<p><a href="http://ja.wikipedia.org/wiki/GPGPU" target="_blank">GPUコンピューティング</a>を行うに当たっては,DirectCompute・CUDA・OpenCLなど様々なアプローチがある.その中からDirectComputeを選んでみた理由をメモしておく.</p>
<ul>
<li>DirectComputeを使うことは,DirectXの枠組みの中でGPUコンピューティングを行うことである.<ul><li>「Support for multiple vendors」先行き不透明な時代には嬉しい.</li><li>今後XBOXでDirectComputeが使えるようになれば,非常に安価に計算機を手に入れることが可能になる?</li><li>演算結果の可視化をするにあたって,他のアプローチより少しだけ楽かもしれない?</li><li>もしかするとWindows Phoneでも使えるようになる?</li></ul></li>
<li>グラフィックカードを使うのは,ゲームとかCADがメインだと思う.ゲームはDirectXが多いし,有名なCADのソフトもDirectXを採用している.多くの人に使われるものが一番よくなっていくのではないだろうか<br />(数値計算ではCUDAが多いように思われるが・・・)</li>
</ul>
<p>※CUDAの方が倍精度浮動小数点を使った計算の関数は整っていたりするし,「このアプローチが一番素晴らしい!」というのは難しい.半分以上趣味の問題かもね</p>
<p>CPU・GPUの将来についてはIntel・NVIDIA・AMDが模索中といったところのようだ.数年後には,GPGPUなんて言葉は死語になっているかもしれないし,黄金時代を迎えているかもしれない.</p>
<p>GPGPUがあるからといって,用途の異なる従来型スーパーコンピュータの予算が削られないよう願いたい.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-82370681534052298042010-08-30T23:27:00.011+09:002011-04-23T23:53:08.216+09:00GeForceでGPGPUをするには<p>DirectComputeで倍精度浮動小数点演算をまともに行うためには,DirectX 11 Shader Model 5.0に対応したGPUが必要.GeForce系のグラボを使おうと思ったのだが,公式の製品紹介に載っているカタログスペックだけで選んではいけないらしい.</p>
<p><a href="http://pc.watch.impress.co.jp/docs/column/kaigai/20100716_380986.html" target="_blank">Fermiバージョン2と言えるGF104の正体</a>の解説によるとGTX460に載っているGF104はあまり倍精度浮動小数点計算には向いていないようだ.その1つ前のバージョン(?)のGF100の方がよいらしい.ちなみに<a href="http://www.blwisdom.com/word/key/000797.html" target="_blank">ダイの意味</a><br />
GF100はGTX465,470,480に載っている.(<a href="http://www.4gamer.net/games/099/G009929/20100202001/" target="_blank">NVIDIA,GF100の製品名を「GeForce GTX 480&470」に決定</a>,<a href="http://www.4gamer.net/games/099/G009929/20100529001/" target="_blank">“扱いやすいFermi”がようやく登場か。GeForce GTX 465を試す</a>)</p>
<p><a href="http://www.nvidia.com/object/GTX_400_architecture.html" target="_blank">GeForce GTX 400 Architecture</a>のページに白書があり,さっきのページと同じようなことも書いてありました.製品紹介ではなく,こういうのを見ればいいのか~</p>
<p><a href="http://club.coneco.net/user/10682/review/39963/" target="_blank">GPGPU (CUDA) 性能を比較・検証してみた</a>を見ると,今のところ練習用にしかならない気がする・・・<br />
とはいえ,GTX 460ですら並みのCPUでは勝てないし,コストパフォーマンスはよい.(もちろん計算の内容によってはこの限りではない)</p>
<p>NVIDIAは<a href="http://ja.wikipedia.org/wiki/GeForce#GeForce_GTX_400_Series" target="_blank">今回倍精度の演算性能を確保しきらなかったらしい</a>ので,次回作に期待したいですね.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-88746121418887283782010-08-25T16:02:00.000+09:002010-08-25T16:02:14.889+09:00Open CV 2.1.0 のインストール<h3>必要なもの</h3>
<p>リンク先から,以下のファイルをダウンロードさせてもらう.</p>
<ol>
<li><a href="http://sourceforge.net/projects/opencvlibrary/" target="_blank">OpenCV-2.1.0-win.zip</a></li>
<li><a href="http://www.threadingbuildingblocks.org/" target="_blank">Download -> Stable Release -> 最新版のwin.zip</a></li>
<li><a href="http://www.cmake.org/cmake/resources/software.html" target="_blank">Win32 Installer</a></li>
</ol>
<h3>インストール</h3>
<ol>
<li>CMakeをインストールする.</li>
<li>OpenCVとTBBのZIPアーカイブを適当に解凍する.</li>
<li>CMake GUIを起動する.</li>
<ul>
<li><u>Where is the source code:</u>にOpenCVのルートディレクトリ.(例:C:/OpenCV-2.1.0)</li>
<li><u>Where to build the binaries:</u>にはOpenCVのソリューションを配置したいディレクトリを指定.(例:C:/OpenCV-2.1.0/build)</li>
<li><u>WITH_TBB</u>にチェックを入れ,<u>Configure</u>を押す.</li>
<li>TBB_INCLUDE_DIRとTBB_LIB_DIRが見つからないと言ってくるので,パスを入力する.</li>
<li><u>Generate</u>ボタンが有効化されるので,クリックする.</li>
</ul>
<li><u>Where to build the binaries:</u>に指定したディレクトリにある<u>OpenCV.sln</u>をダブルクリックしてVisual Studioを起動.</li>
<li>必要に応じて<u>VC++ Directories</u>を設定して,ビルドする.</li>
</ol>
<p>参考:<a href="http://imagingsolution.blog107.fc2.com/blog-entry-207.html" target="_blank">OpenCV2.1の入手、ダウンロード、インストール、環境設定</a></p>
<p>2010/08/25現在の最新版は,Open CV:2.1.0,Intel TBB:3.0_20100406,CMake:2.8.2</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-34297085327999146402010-05-21T10:07:00.001+09:002010-05-21T10:11:04.119+09:00CLR4.0向けのアセンブリをPowerShellで使用する<code>powershell_ise.exe</code>(または<code>powershell.exe</code>)のあるディレクトに,<code>powershell_ise.exe.config</code>(または<code>powershell.exe.config</code>)というファイルを作成する.ファイルの内容は以下ように設定する.<br />
<blockquote>
<pre><code><configuration>
<startup <span style="color: red;">useLegacyV2RuntimeActivationPolicy</span>="<span style="color: blue;">true</span>">
<supportedRuntime <span style="color: red;">version</span>="<span style="color: blue;">v4.0</span>"/>
</startup>
</configuration></code></pre>
</blockquote>
<code>useLegacyV2RuntimeActivationPolicy</code>は必要な人だけ.(<a href="http://nky-tech-sdt.blogspot.com/2010/02/net-framework-40.html">.NET Framework 4.0で混合モードのアセンブリを読み込めない旨のエラー</a>)しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-9793935027244033632010-05-17T11:06:00.003+09:002011-12-19T13:41:20.726+09:00Magic Packetをブロードキャスト・送信するコマンドラインツール<p>マジックパケットをブロードキャストまたは送信するコマンドラインツールです.</p><h4>システム要件</h4><p>以下でダウンロードできる実行可能ファイルの動作には.NET Framework 4.0が必要です.(ソースは3.5とかと共通だと思います)</p><h4>免責・使用条件</h4><p>以下に公開されているソースコードおよび実行可能ファイルは,以下の条件に同意した場合に限り,著作権者の特別な許可なく自由に使用できます.</p><ul><li>NKY-TECH.は,このツールの使用に起因する如何なる損害に対する責任も負わないものとします.</li>
<li>このツールを公序良俗に反する行為,また違法行為に使用することはできません.</li>
</ul><h4>ダウンロード</h4><p>ソースファイル一式(Visual Studio 2010プロジェクト一式)と実行可能ファイルです.</p><iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-3c5ea8af3ff56752.skydrive.live.com/embedicon.aspx/%e3%83%96%e3%83%ad%e3%82%b0%e7%94%a8%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab/MagicPacket/MagicPacket.zip"></iframe> <iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-3c5ea8af3ff56752.skydrive.live.com/embedicon.aspx/%e3%83%96%e3%83%ad%e3%82%b0%e7%94%a8%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab/MagicPacket/MagicPacket.exe"></iframe>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-4855105821871685612010-04-17T20:27:00.004+09:002010-04-26T10:45:55.325+09:00Ubuntu上に,Eclipseを使ったFORTRAN開発環境を構築する<p>以下の方法は,2010/04/17において一般に配布されている(たぶん)最新の安定盤で行ったものです.</p>
<h2>0. Super Userのパスワード</h2>
<p>Ubuntuでは,既定でSuper Userのパスワードが設定されていないので,まず設定しておくとよい.</p>
<blockquote><code>
$ sudo su -<br />
# passwd
</code></blockquote>
<h2>1. Javaのインストール</h2>
<p><a href="http://java.com" target="_blank">http://java.com</a>から「Linux (自己解凍ファイル)」をダウンロードし,ダウンロードページにある手順に従ってインストールする.</p>
<blockquote><kbd>export PATH=$PATH:/usr/java/j2sdk1.6.0_20/bin</kbd></blockquote>
<p>と入力してパスを通し,<kbd>java -version</kbd>で確認する.</p>
<h2>2. <a href="http://www.eclipse.org/" target="_blank">Eclipse</a>のインストール</h2>
<p>Super Userで端末にログインし,以下のコマンドでインストールする.</p>
<blockquote><code>
apt-get install eclipse-platform<br />
apt-get install eclipse-pde
</code></blockquote>
<h2>3. <a href="http://wiki.eclipse.org/PTP" target="_blank">Photranプラグイン</a>のインストール</h2>
<p>Eclipseを起動して「Help」メニューの「Install New Software」を開き,「Work With」ドロップダウン・リストに以下のURIを登録する.</p>
<ul>
<li>Galileo - <a href="http://download.eclipse.org/releases/galileo" target="_blank">http://download.eclipse.org/releases/galileo</a></li>
<li>CDT - <a href="http://download.eclipse.org/tools/cdt/releases/galileo" target="_blank">http://download.eclipse.org/tools/cdt/releases/galileo</a></li>
<li>PTP - <a href="http://download.eclipse.org/tools/ptp/releases/galileo" target="_blank">http://download.eclipse.org/tools/ptp/releases/galileo</a></li>
</ul>
<ol>
<li>Galileoのリストから「General Purpose Tools」ノードを開き,「Remote System Explorer End-User Runtime」をインストールする.</li>
<li>CDTにリストされているプラグインをすべて選択してインストールする.</li>
<li>PTPのリストから,「Remote Development」<b>以外</b>をインストールする.</li>
</ol>
<h2>4. Intel Fortranコンパイラのインストール</h2>
<p>自分の使用目的にあったライセンス形態で,Intel Fortranコンパイラを入手する.<a href="http://software.intel.com/en-us/articles/non-commercial-software-development/" target="_blank">非商用の場合はこちら</a></p>
<p>まず,インストールに必要な<kbd>g++</kbd>をインストールする.</p>
<blockquote><kbd>apt-get install g++</kbd></blockquote>
<p>次に,<kbd>install.h</kbd>を端末で実行し,指示に従ってコンパイラをインストールする.</p>
<p><kbd>/home/[<i>username</i>]/.bashrc</kbd>(隠しファイル)に,次の一行を加える.(オプションはIA-32の場合のもの)</p>
<blockquote><kbd>source /opt/intel/Compiler/11.1/069/bin/ifortvars.sh ia32</kbd></blockquote>
<p>※参考:<a href="http://www.issp.u-tokyo.ac.jp/super/manual/system-b/Intel_Fdoc100/INSTALL.htm#installcompiler" target="_blank">インテル® Fortran コンパイラー 10.0 Linux* 版 インストール・ガイド</a></p>
<p>最後に,コンパイルに必要なパッケージ<a href="http://packages.debian.org/stable/base/libstdc++5" target="_blank">libstdc++5</a>をインストールする.</p>
<h2>5. Eclipseで作ったFortranプロジェクトをビルドする</h2>
<p>Eclipseを既定のランチャから起動すると,「<code>ifort</code>が見つからない」エラーが出てビルドできないので,Eclipseは端末から起動する.</p>
<p>のは不便だと思うのですが,なんとかならないものでしょうか.</p>
<h2>6. Windowsの共有フォルダをUbuntuにマウントする(2010/04/25追記)</h2>
<blockquote><code>apt-get install smbfs</code></blockquote>
<p>でパッケージをインストールし,次のコマンドでマウントする.</p>
<blockquote><code>sudo mount -t cifs -o user=[<i>ユーザー名</i>],dom=[<i>ドメイン</i>],file_mode=0777,dir_mode=0777 //[IPアドレス]/[フォルダ名] /[マウント先]</code></blockquote>
<p>マウント先のディレクトリは先に存在を確認しておかなくてはいけない(存在しない場合は作成しておく).また,<kbd>smbmount</kbd>コマンドでもマウントはできるが,permission deniedとなり書き込めない.</p>
<p>例:</p>
<blockquote><code>sudo mount -t cifs -o user=smbshare,dom=mypc,file_mode=0777,dir_mode=0777 //192.168.24.50/SharedFolder /mnt/SharedFolder</code></blockquote>
<p>アンマウントは<kbd>umount</kbd>コマンドを使う.</p>
<p>参考:<a href="http://www.jroller.com/agileanswers/entry/permission_denied_after_successfully_mounting" target="_blank">Permission denied after successfully mounting a directory with smbfs</a></p>
<p>因みに,初めはVMware Playerの機能を使ってホストと共有したフォルダをworkspaceとして使っていたが,頻繁にファイルの再読み込みを要求される上に,再読み込みを行うとファイルの中身がおかしくなってしまうので,ネットワークドライブに変更した次第.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-241241387079178442010-02-25T23:19:00.003+09:002010-02-25T23:58:09.114+09:00.NET Framework 4.0で混合モードのアセンブリを読み込めない旨のエラー<p>※記事を書いている時点では,.NET Framework 4.0はリリース候補版です.また,開発環境はVisual Studio 2010のリリース候補版です.</p>
<blockquote>
<p>Mixed mode assembly is built against version 'v1.x(or v2.x)' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.</p>
</blockquote>
<p>エラーを解決するには,アプリケーションの設定ファイル(<code>app.config</code>)を以下のように書き換えます.</p>
<blockquote>
<pre><code><configuration>
<startup <font color="red">useLegacyV2RuntimeActivationPolicy</font>="<font color = "blue">true</font>">
<supportedRuntime <font color="red">version</font>="<font color="blue">v4.0</font>"/>
</startup>
</configuration></code></pre>
</blockquote>
<p>混合モードアセンブリ(managedとunmanagedのコードを両方含んだアセンブリ)は何かと使うので,少なくともしばらくはこの設定は外せそうになさそうです.それは兎も角として,CLR 3.0はどこへ!?</p>
<p>参考:<a href="http://msdn.microsoft.com/en-us/library/bbx34a2h%28VS.100%29.aspx" target="_blank"><startup> Element</a>,<a href="http://blogs.msdn.com/jomo_fisher/archive/2009/11/17/f-scripting-net-4-0-and-mixed-mode-assemblies.aspx" target="_blank">F# Scripting, .NET 4.0 and Mixed-mode assemblies</a></p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com8tag:blogger.com,1999:blog-2821455333407675075.post-84120760665748626482009-09-12T14:05:00.004+09:002010-07-03T10:58:18.954+09:00エディットコントロールを最下行までスクロールする<p>
エディットコントロールをスクロールするには,<a href="http://msdn.microsoft.com/en-us/library/bb761635%28VS.85%29.aspx" target="_blank"><code>EM_SCROLL</code>メッセージ</a>をコントロールに送信します.
</p>
<p>
一番下の行までスクロールするには,<code>WPARAM</code>として<code>SB_BOTTOM</code>を指定します.
ただ,この<code>SB_BOTTOM</code>はMSDNライブラリには載っていないようですので,自信を持ってお勧めすることはできません.
</p>
<p>
代替の方法としては,<a href="http://msdn.microsoft.com/en-us/library/bb761586%28VS.85%29.aspx" target="_blank"><code>EM_GETLINECOUNT</code>メッセージ</a>
(または<a href="http://msdn.microsoft.com/en-us/library/bb849137%28VS.85%29.aspx" target="_blank"><code>Edit_GetLineCount</code>マクロ</a>)を用いて行数を取得し,
<code>WPARAM</code>に<code>SB_LINEDOWN</code>を指定した<code>EM_SCROLL</code>メッセージを必要な回数送信する方法が考えられます.
</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-38452300534188338122009-08-24T16:13:00.005+09:002010-07-03T10:58:35.946+09:00バージョン情報の取得<p><code>windows.h</code>をインクルードし,<code>version.lib</code>をリンクするよう設定します.</p>
<blockquote>
<pre><code><font color="blue">#include</font> <font color="maroon"><windows.h></font>
<font color="blue">#pragma comment</font> ( <font color="blue">lib</font> , <font color="maroon">"version.lib"</font> )</code></pre>
</blockquote>
<p>
バージョン情報を取得するための準備<br />
<a href="http://msdn.microsoft.com/en-us/library/ms647005%28VS.85%29.aspx" target="_blank"><code>GetFileVersionInfoSize</code>関数</a>,
<a href="http://msdn.microsoft.com/en-us/library/ms647003%28VS.85%29.aspx" target="_blank"><code>GetFileVersionInfo</code>関数</a>
</p>
<blockquote>
<pre><code><font color="green">////
// バージョン情報のサイズを取得する</font>
LPTSTR lpFileName = TEXT(<font color="maroon">"<i>module-filename</i>"</font>);
DWORD dwHandle;
DWORD cbVersionInfoSize = ::GetFileVersionInfoSize( pFileName, &dwHandle );
<font color="green">/* Error if( ! cbVersionInfoSize ) */</font>
<font color="green">////
// バージョン情報を取得する為のメモリを確保する</font>
LPVOID pVersionInfo = ::HeapAlloc( ::GetProcessHeap(), NULL, cbVersionInfoSize ) );
<font color="green">/* Error if( ! pVersionInfo ) : メモリが確保できればHeapAlloc関数でなくてもよい */</font>
<font color="green">////
// バージョン情報を取得する</font>
::GetFileVersionInfo( pFileName, dwHandle, cbVersionInfoSize, pVersionInfo );
<font color="green">/* Error if( ! <i>returned-value</i> ) */</font></code></pre>
</blockquote>
<p>
<code>VS_FIXEDFILEINFO</code>構造体を取得する<br />
<a href="http://msdn.microsoft.com/en-us/library/ms647464%28VS.85%29.aspx" target="_blank"><code>VerQueryValue</code>関数</a>,
<a href="http://msdn.microsoft.com/en-us/library/ms646997%28VS.85%29.aspx" target="_blank"><code>VS_FIXEDFILEINFO</code>構造体</a>
</p>
<blockquote>
<pre><code><font color="green">////
// VS_FIXEDFILEINFO構造体のアドレスを取得する</font>
VS_FIXEDFILEINFO* pFixedFileInfo;
UINT cbSize;
::VerQueryValue( pVersionInfo, TEXT(<font color="maroon">"\\"</font>), <font color="blue">reinterpret_cast</font><LPVOID*>(&pFixedFileInfo), &cbSize )
<font color="green">/* Error if( ! <i>returned-value</i> ) */</font></code></pre>
</blockquote>
<p>
製品バージョンとファイルバージョンは,<code>VS_FIXEDFILEINFO</code>構造体に含まれています.
ただし,<code>HIWORD( dw*MS )</code>,<code>LOWORD( dw*MS )</code>,<code>HIWORD( dw*LS )</code>,<code>LOWORD( dw*LS )</code>の順番です.
</p>
<p>バージョン情報を取得するために確保したメモリの開放を忘れないように.</p>
<p>
プロセスにロードされているモジュールのバージョン情報を取得する場合には,別の方法も使えるようです.<br />
<a href="http://tgws.fromc.jp/prog/versioninfo/" target="_blank">バージョン情報を取得しよう</a>
</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-40505276003370217332009-08-22T15:37:00.005+09:002010-07-03T10:58:18.954+09:00モーダルウィンドウの実装<p>
モーダルウィンドウの作成では,ウィンドウスタイルに<code>WS_CHILD</code>を指定してはいけない.
モーダルダイアログボックスと同様,オーナーウィンドウは存在することができる.
</p>
<p>
モーダルウィンドウを作成する関数(メソッド)の簡単な実装例を以下に示す.
</p>
<blockquote>
<pre><code><font color="blue">int</font> DoModal(HWND hWndOwner)
{
<font color="green">////
// オーナーウィンドウの存在確認</font>
<font color="blue">if</font>( hWndOwner && ! ::IsWindow(hWndOwner) )
<font color="blue">return</font> 0;
<font color="green">////
// ウィンドウの作成</font>
<font color="blue">if</font>( ! ::CreateWindow( <font color="green">/* 引数省略(WS_CHILDスタイル禁止) */</font> ) )
<font color="blue">return</font> -1;
<font color="green">////
// オーナーウィンドウの無効化</font>
::EnableWindow(hWndOwner, FALSE);
<font color="green">////
// メッセージループ</font>
BOOL bReturned;
MSG msg;
<font color="blue">while</font>( bReturned = ::GetMessage(&msg) )
{
<font color="blue">if</font>( -1 == bReturned )
<font color="blue">return</font> -1;
<font color="blue">else</font>
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
<font color="green">////
// オーナーウィンドウの有効化</font>
::EnableWindow(hWndOwner, TRUE);
::SetWindowPos(hWndOwner, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
<font color="blue">return</font> <font color="blue">static_cast</font><<font color="blue">int</font>>(msg.wParam);
}</code></pre>
</blockquote>
<p>上記のコードからも分るように,モーダルウィンドウを終了する際には,<code>WM_QUIT</code>メッセージをポストしなくてはならない.</p>
<p>これだけでもモーダルウィンドウとしては機能するが,ユーザーの便利の為に<code>WM_DESTROY</code>メッセージの処理に以下のコードを追加する.</p>
<blockquote>
<pre><code><font color="green">// hWndOwner : オーナーウィンドウのハンドル
// hWnd : モーダルウィンドウのハンドル</font>
::SetWindowPos(hWndOwner, hWnd, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);</code></pre>
</blockquote>
<p>モーダルダイアログは,自らがアイドル状態になるとき
<a href="http://msdn.microsoft.com/en-us/library/ms645422%28VS.85%29.aspx" target="_blank"><code>WM_ENTERIDLE</code>メッセージ</a>
をオーナーウィンドウに送信するが,実装しなくても動く.</p>
<p>ATL用のテンプレートクラスを作ってみたので,よかったらどうぞ.</p>
<iframe scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:240px;height:66px;margin:3px;padding:0;border:1px solid #dde5e9;background-color:#ffffff;" src="http://cid-3c5ea8af3ff56752.skydrive.live.com/embedrowdetail.aspx/%e3%83%96%e3%83%ad%e3%82%b0%e7%94%a8%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab/ModalWindow.h"></iframe>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0tag:blogger.com,1999:blog-2821455333407675075.post-45542996521521794572009-08-20T11:24:00.002+09:002009-08-20T14:45:56.613+09:00Visual C++で構造化例外を有効にする<p>構造化例外を使用するには,まずプロジェクトのプロパティを開き,以下のように設定を変更する.</p>
<ol>
<li><u>構成プロパティ</u>→<u>C/C++</u>→<u>コード生成</u>を選択する.</li>
<li><u>C++の例外を有効にする</u>の設定を<u>はい-SEHの例外あり(/EHa)</u>に変更する.</li>
</ol>
<p>この時,<u>構成</u>を<u>すべての構成</u>としておくと,デバッグ,リリースの両方の設定が更新される.</p>しゅーぽんhttp://www.blogger.com/profile/15783501871649341284noreply@blogger.com0