<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
  <title>MASATOの開発日記</title>
  <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/" />
  <modified>2008-06-16T15:01:49Z</modified>
  <tagline>ソフト開発のTipsや自作ソフトウェアのリリース案内。</tagline>
  <id>tag:www.sutosoft.com,2006:/room//2</id>
  <generator url="http://www.movabletype.org/" version="3.2-ja-2">Movable Type</generator>
  <copyright>Copyright (c) 2008, MASATO</copyright>
  <entry>
    <title>平成20年度 春期 情報処理技術者試験 成績照会</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000535.html" />
    <modified>2008-06-16T15:01:49Z</modified>
    <issued>2008-06-16T23:58:00+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.535</id>
    <created>2008-06-16T14:58:00Z</created>
    <summary type="text/plain">平成20年度 春期 情報処理技術者試験 成績照会
テクニカルエンジニア（データベース）試験
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>感想</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
平成20年度 春期 情報処理技術者試験 成績照会<br />
テクニカルエンジニア（データベース）試験
</p>
]]>
      <![CDATA[<p>
受験番号 DBXXX - XXXX の方は，不合格です。
</p>
<ul>
<li>午前試験のスコアは，690 点です。</li>
<li>午後I試験のスコアは，540 点です。<li>
<li>午後II試験の採点結果はありません。</li>
</ul>

<p>
<a href="http://www.sutosoft.com/room/archives/000406.html">去年</a>から全然進歩していません。
午後Iは全然時間が足りません。きびしー。
</p>


]]>
    </content>
  </entry>
  <entry>
    <title>OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000532.html" />
    <modified>2008-05-30T15:42:54Z</modified>
    <issued>2008-05-31T00:39:27+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.532</id>
    <created>2008-05-30T15:39:27Z</created>
    <summary type="text/plain">OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細― という本を読みました。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>書評</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<a href="http://www.amazon.co.jp/gp/product/4274065731?ie=UTF8&tag=sutosoftdiary-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4274065731">OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―</a><img src="http://www.assoc-amazon.jp/e/ir?t=sutosoftdiary-22&l=as2&o=9&a=4274065731" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
という本を読みました。
</p>
]]>
      <![CDATA[<p>
OpenSSLという広く使われているSSLライブラリの解説書です。対象バージョンは0.9.6と0.9.7のようです。<br />
現時点の最新バージョンはOpenSSL 0.9.8なので、ちょっと古いバージョンについての本になります。
</p>

<p>
私はOpenSSLを使ったことがないので、解説書としてどうか、というのは良く分かりませんが、
それでもたくさん参考になるところがありました。
</p>

<p>
本書は、OpenSSLの使い方以外にも、セキュリティが必要な情報を扱うアプリケーションを開発するときに注意しなければならないことを学べます。
<br />
例えば、乱数シード取得方法です。乱数シードを得る方法はなにがあるのか、またそれらの方法が実際のところどれだけ安全かを説明するために結構なページが費やされていました。
ほかにも、証明書検証や証明書リボケーションを厳密にやろうとすると、容易ではないことが良く分かりました。
<br />
こうした点は、OpenSSLを使うかどうかに関わらず、アプリケーション開発時に厄介事となることです。
</p>

<p>
本書は、セキュリティが必要な情報を扱うアプリケーション開発に関わる予定がある人にお勧めの一冊です。
<br />
本書を一読しておけば、そうしたアプリケーションを開発するときの厄介事が分かるので、予め備えておくことができます。
備えておいたからといって上手く捌けるとも限りませんが、備えがないよりはマシでしょう。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>boost 1.35.0のBoost.Thread</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000516.html" />
    <modified>2008-04-07T18:27:14Z</modified>
    <issued>2008-04-08T03:18:52+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.516</id>
    <created>2008-04-07T18:18:52Z</created>
    <summary type="text/plain">boost 1.35.0では、Boost.Threadが結構強化されたようですので、Boost.Threadのドキュメントを読んでみたのですが、残念ながらThread Priorityの制御にはまだ対応していないようです。
Thread制御のコードをWin32APIではなくboostで書きたいのですが、これができないために移行できずにおります。
早く対応して欲しいなぁ・・・。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<a href="http://www.boost.org/users/news/version_1_35_0">boost 1.35.0</a>では、Boost.Threadが結構強化されたようですので、<a href="http://www.boost.org/doc/libs/1_35_0/doc/html/thread.html">Boost.Thread</a>のドキュメントを読んでみたのですが、残念ながらThread Priorityの制御にはまだ対応していないようです。<br />
Thread制御のコードをWin32APIではなくboostで書きたいのですが、これができないために移行できずにおります。
早く対応して欲しいなぁ・・・。<br />
</p>]]>
      
    </content>
  </entry>
  <entry>
    <title>boost 1.35.0インストール(Visual C++ 2008)</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000515.html" />
    <modified>2008-04-06T15:44:05Z</modified>
    <issued>2008-04-04T00:41:56+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.515</id>
    <created>2008-04-03T15:41:56Z</created>
    <summary type="text/plain">boost 1.35.0がリリースされました。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
<tr><td>ライブラリ</td><td>boost 1.35.0</td></tr>
</table>

<p>
boost 1.35.0がリリースされました。<br />
<a href="http://www.boost.org/users/news/version_1_35_0">boost Version 1.35.0</a>
</p>

]]>
      <![CDATA[<p>
待望のVisual Studio.NET 2008サポートはこうなっていました。
</p>
<blockquote>
Supported Compilers<br />
 In addition the following compilers should be well supported, but weren't part of out release criteria for 1.35:<br />
Microsoft Visual C++ 9 (Visual Studio .NET 2008). 
</blockquote>
<p>
なんか微妙です。でもライブラリのビルドはできましたのでやり方を以下に書いておきます。
</p>

<ol>
<li><a href="http://www.boost.org/users/download/">Boost Downloads</a>からboost_1_35_0.tar.gzをダウンロードして展開。<br />
以下展開先のLICENSE_1_0.txtがあるディレクトリを[boostルート]と書きます。</li>
<li>同じく<a href="http://www.boost.org/users/download/">Boost Downloads</a>boost-jam-3.1.16-1-ntx86.zipをダウンロードして展開。<br />
展開してできたbjam.exeは[boostルート]にコピーしておきます。</li>
<li>スタートメニューから、
Microsoft Visual Studio 2008→Visual Studio Tools→Visual Studio 2008 コマンド プロンプト<br />
でコマンドプロンプトを開きます。</li>
<li><code>cd [boostルート]<code><br />で[boostルート]に移動します。</li>
<li><code>bjam --toolset=msvc link=static,shared runtime-link=static,shared release debug stage</code><br />
で全構成をビルド。時間がかかるので風呂にでも入って待ちましょう。</li>
<li>[boostルート]をVisual Studio 2008のインクルードディレクトリに追加し、
[boostルート]\stage\lib をライブラリディレクトリに追加します。<br />
以上で完了です。
</ol>
]]>
    </content>
  </entry>
  <entry>
    <title>増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000513.html" />
    <modified>2008-03-26T12:01:01Z</modified>
    <issued>2008-03-24T23:42:43+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.513</id>
    <created>2008-03-24T14:42:43Z</created>
    <summary type="text/plain">「増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編」という本を読みましたので感想などを書いてみます。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>書評</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
「<a href="http://www.amazon.co.jp/gp/product/4797331623?ie=UTF8&tag=wwwsutosoftco-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4797331623">増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編</a><img src="http://www.assoc-amazon.jp/e/ir?t=wwwsutosoftco-22&l=as2&o=9&a=4797331623" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」
という本を読みましたので感想などを書いてみます。
</p>
]]>
      <![CDATA[<p>
本書は、マルチスレッドソフトウェアで頻繁に使用される12種類のソフトウェアパターンの紹介と、
JavaのサンプルコードやTipsを集めた本です。
</p>

<p>
本書には、synchronized、wait、notifyの使い方など、タイトル通りJava特有の部分もありますが、
パターンのコンセプトや利点・欠点などは言語を問わない共通の部分もありました。
私はC++ユーザなので、後者を特に興味深く読ませて頂きました。
</p>

<p>
本書で紹介されているパターンは、<a href="http://www.amazon.co.jp/gp/product/4797311126?ie=UTF8&tag=wwwsutosoftco-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4797311126">オブジェクト指向における再利用のためのデザインパターン</a><img src="http://www.assoc-amazon.jp/e/ir?t=wwwsutosoftco-22&l=as2&o=9&a=4797311126" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
にあるような応用的なものというよりも、
マルチスレッドソフトウェアを作るために必須となる基本的なものでした。
</p>

<p>
例えば、本書記載のSingle Threaded Executionパターンは、クリティカルセクションのことなので、
これを使わずにマルチスレッドソフトウェアを作ることは無理でしょう。
Thread-Per-Message又はWorker Threadパターンも少なくとも片方は必須になるでしょうし、
安全に終了するマルチスレッドソフトウェアを書こうとしたらTwo-Phase Terminationパターンは必須になります。<br />
その他のパターンも基本的なものが多く、まともに動作するマルチスレッドソフトウェアを作ったことがある人は、
ほとんどのパターンを使ったことがあると思います。<br />
最後に紹介されているActive Objectパターンはちょっと大掛かりなので使ったことがない人も居るでしょうが、
分散プログラミングをやったことがある人にはお馴染みの構成でしょう。
</p>

<p>
よって、今までマルチスレッドソフトウェアを作ったことがないという人にはお勧めの一冊です。
言語を問わず使えると思います。
</p>

<p>
マルチスレッドに関わったことがある人にとっては、新しいノウハウを提供できるという本ではないと思いますが、
それでも、共通の語彙を得られるという点でお勧めできます。<br />
特に、マルチスレッドソフトウェアについての解説記事を書く方にお勧めです。<br />
例えば、「メインのスレッドがこの処理を実行するためのオブジェクト作り、それを裏で動いているスレッドに渡して実行する方式です」
という長い分かり難い説明が、「Worker Threadパターンです」という説明で終わります。<br />
</p>

<p>
他にも、クラス名や関数名を本書の内容と合わせると、分かりやすいコードになると思いますので、
命名に悩んでいるマルチスレッドソフトウェア開発者にもお勧めです。<br />
</p>

<p>
なお、本書記載のパターンのC++による実装方法については、以下のページが参考になると思います。<br />
<a href="http://d.hatena.ne.jp/melt_slinc/19990201/p1">デザインパターン（マルチスレッド）まとめ</a>
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>boost::function + bindの破壊力</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000508.html" />
    <modified>2008-03-15T13:17:07Z</modified>
    <issued>2008-03-15T22:09:53+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.508</id>
    <created>2008-03-15T13:09:53Z</created>
    <summary type="text/plain">boost::functionとboost::bindの組み合わせは結構強力なようです。以下のコードをコンパイルしてみると・・・</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual Studio 2008 Professional Edition</td></tr>
<tr><td>ライブラリ</td><td>boost 1.34.1</td></tr>
</table>

<p>
<code>boost::function</code>と<code>boost::bind</code>の組み合わせは結構強力なようです。
以下のコードをコンパイルしてみると、
</p>
]]>
      <![CDATA[<pre><span class="keyword">#include</span> &lt;boost/bind.hpp&gt;
<span class="keyword">#include</span> &lt;boost/function.hpp&gt;

<span class="keyword">class</span> A
{
<span class="keyword">public</span>:
  <span class="keyword">void</span> f(<span class="keyword">int</span>) {}
};

<span class="keyword">void</span> main()
{
  A a;
  boost::function&lt;<span class="keyword">void</span> (<span class="keyword">int</span>)&gt; Func = boost::bind(&amp;A::f, &amp;a);
}
</pre>

<p>
以下のようなメッセージを確認できます。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080315_vc2008down.png" width="499" height="230" alt="VS 2008" />
<br />
一撃必殺。
</p>

<p>
以下のように最後の<code>_1</code>を忘れなければ問題ないようです。
</p>
<pre>
boost::function&lt;<span class="keyword">void</span> (<span class="keyword">int</span>)&gt; Func = boost::bind(&amp;A::f, &amp;a, _1);
</pre>
]]>
    </content>
  </entry>
  <entry>
    <title>boost::function その３</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000505.html" />
    <modified>2008-03-11T13:56:53Z</modified>
    <issued>2008-03-11T22:46:12+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.505</id>
    <created>2008-03-11T13:46:12Z</created>
    <summary type="text/plain"><![CDATA[前回の続きです。
前回はFuncオブジェクトにObjectへのポインタを渡していましたが、今回はboost::shared_ptr&lt;Object&gt;を渡してみました。]]></summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
</table>

<p>
<a href="http://www.sutosoft.com/room/archives/000503.html">前回</a>の続きです。<br />
<a href="http://www.sutosoft.com/room/archives/000503.html">前回</a>は<code>Func</code>オブジェクトに<code>Object</code>へのポインタを渡していましたが、今回は<code>boost::shared_ptr&lt;Object&gt;</code>を渡してみました。</p>
]]>
      <![CDATA[<pre><span class="keyword">void</span> Test3B(<span class="keyword">void</span>)
{
  boost::function&lt;<span class="keyword">void</span> ()&gt; Func;
  {
    boost::shared_ptr&lt;TestClass&gt; Object(<span class="keyword">new</span> TestClass);
    Func = boost::bind(&amp;TestClass::Test, Object);
  }
  Func();
}</pre>

<p>コンパイルは問題なし。<code>boost::shared_ptr</code>も使えるんですね。<br />
実行結果は以下の通り。
</p>

<pre>Constructed this=00387600
Func this=00387600
Destructed this=00387600</pre>

<p>
<code>Func</code>が<code>boost::shared_ptr<Object></code>を保持しているようです。
<a href="http://www.sutosoft.com/room/archives/000503.html">前回</a>のようにデストラクタが先に実行されることはなく、<a href="http://www.sutosoft.com/room/archives/000502.html">前々回</a>のように<code>Object</code>のコピーがたくさん発生することもありません。完璧。
</p>

<p>
<code>boost::function</code>と<code>boost::shared_ptr</code>を使うと、
継承を使わなくても多態性を実現できるようです。<br />
GoFのパターンに応用すると実装が簡潔にできそうです。
特に<a href="http://www.google.co.jp/search?q=Command+%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">Commandパターン</a>とは相性が良いのではないかと思います。
</p>

<p>
以上。続きません。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>boost::function その２</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000503.html" />
    <modified>2008-03-11T13:55:28Z</modified>
    <issued>2008-03-10T23:29:16+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.503</id>
    <created>2008-03-10T14:29:16Z</created>
    <summary type="text/plain">前回の続きです。
前回はFuncオブジェクトにObjectそのものを渡していましたが、今回はポインタを渡してみました。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
</table>

<p>
<a href="http://www.sutosoft.com/room/archives/000502.html">前回</a>の続きです。<br />
<a href="http://www.sutosoft.com/room/archives/000502.html">前回</a>は<code>Func</code>オブジェクトに<code>Object</code>そのものを渡していましたが、今回はポインタを渡してみました。
</p>]]>
      <![CDATA[<pre><span class="keyword">void</span> Test2B(<span class="keyword">void</span>)
{
  boost::function&lt;<span class="keyword">void</span> ()&gt; Func;
  {
    TestClass Object;
    Func = boost::bind(&amp;TestClass::Test, &amp;Object);
  }
  Func();
}</pre>

<p>
<code>Object</code>のスコープ外で<code>Func()</code>を実行してみました。<br />
実行結果は以下の通り。
</p>

<pre>Constructed this=0012FE5B
Destructed this=0012FE5B
Func this=0012FE5B</pre>

<p>
デストラクタの後にメンバ関数<code>Test</code>が呼び出されているようです。これは問題ありそうです。
やっぱりスコープ外で実行してはいけなかったようです。
しかし、スコープ内で実行する場合であれば、<a href="http://www.sutosoft.com/room/archives/000502.html">前回</a>のように大量のコピーが発生しない分、今回の方が良いでしょう。
</p>

<p><a href="http://ja.wikipedia.org/wiki/Observer_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">GoFのObserverパターン</a>を実装するときに使うと便利そうです。<br />
例えば、<code>Subject</code>の<code>Attach</code>関数を、<code>void Attach(boost::function&lt;<span class="keyword">void</span> ()&gt;</code>にしておくと、
<code>Observer</code>側は面倒な階層構造を持つ必要がなくなります。
</p>

<p>
<a href="http://www.sutosoft.com/room/archives/000505.html">次回</a>に続きます。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>boost::function その１</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000502.html" />
    <modified>2008-03-10T14:33:23Z</modified>
    <issued>2008-03-09T21:11:09+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.502</id>
    <created>2008-03-09T12:11:09Z</created>
    <summary type="text/plain">boostにはFunctionというライブラリがあります。
一言でいうと強化型関数ポインタですが、結構多機能です。
特にメンバ関数周りの機能が充実していて、以下のようにメンバ関数を格納した上に呼び出すこともできます。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
</table>

<p>
boostにはFunctionというライブラリがあります。
一言でいうと強化型関数ポインタですが、結構多機能です。
特にメンバ関数周りの機能が充実していて、以下のようにメンバ関数を格納した上に呼び出すこともできます。
</p>
]]>
      <![CDATA[<pre>boost::function&lt;<span class="keyword">void</span> ()&gt; Func;
TestClass Object;
Func = boost::bind(&amp;TestClass::Test, Object);
Func();</pre>

<p>
最後の行では、<code>Object</code>を使わないでメンバ関数を呼び出しています。
こんなことをして大丈夫なのか気になりましたので調べてみました。
</p>

<pre><span class="keyword">class</span> TestClass
{
<span class="keyword">public</span>:
  TestClass(<span class="keyword">void</span>) {printf(&quot;Constructed this=%p\n&quot;, <span class="keyword">this</span>);}
  TestClass(<span class="keyword">const</span> TestClass&amp; Test) {printf(&quot;Copy this=%p from=%p\n&quot;, <span class="keyword">this</span>, &amp;Test);}
  ~TestClass(<span class="keyword">void</span>) {printf(&quot;Destructed this=%p\n&quot;, <span class="keyword">this</span>);}
  <span class="keyword">void</span> Test(<span class="keyword">void</span>) {printf(&quot;Func this=%p\n&quot;, <span class="keyword">this</span>);}
};

<span class="keyword">void</span> Test1(<span class="keyword">void</span>)
{
  boost::function&lt;<span class="keyword">void</span> ()&gt; Func;
  {
    TestClass Object;
    Func = boost::bind(&amp;TestClass::Test, Object);
  }
  Func();
}</pre>

<p>
<code>Object</code>のスコープ外で<code>Func()</code>を実行してみました。<br />
実行結果は以下の通り。
</p>

<pre>Constructed this=0012FE5B
Copy this=0012FD54 from=0012FE5B
Copy this=0012FC28 from=0012FD54
Copy this=0012FB20 from=0012FC28
Copy this=0012FC4F from=0012FB20
Destructed this=0012FB20
Destructed this=0012FC28
Copy this=0012FD5C from=0012FC4F
Destructed this=0012FC4F
Destructed this=0012FD54
Copy this=0012FC10 from=0012FD5C
Copy this=0012FB00 from=0012FC10
Copy this=0012F9F8 from=0012FB00
Copy this=0012F8E0 from=0012F9F8
Copy this=0012F7D8 from=0012F8E0
Copy this=0012F6C0 from=0012F7D8
Destructed this=0012F6C0
Destructed this=0012F7D8
Destructed this=0012F8E0
Copy this=0012F8DC from=0012F9F8
Copy this=0012F7B0 from=0012F8DC
Copy this=0012F67C from=0012F7B0
Copy this=0012FC48 from=0012F67C
Destructed this=0012F67C
Destructed this=0012F7B0
Destructed this=0012F8DC
Destructed this=0012F9F8
Destructed this=0012FB00
Destructed this=0012FC10
Copy this=0012FBE0 from=0012FC48
Destructed this=0012FC48
Copy this=0012FE70 from=0012FBE0
Destructed this=0012FBE0
Destructed this=0012FD5C
Destructed this=0012FE5B
Func this=0012FE70
Destructed this=0012FE70</pre>

<p>たくさんコピーが行われているようです。ちょっとびっくり。
<code>Func()</code>実行時の出力は<code>Func this=0012FE70</code>です。
デストラクタは一番最後に呼び出されているようですので、<code>Func()</code>実行時はオブジェクトは存在するようです。<br />
おそらく、<code>Func</code>オブジェクトが<code>Object</code>のコピーを保持しているのでしょう。
</p>

<p>
<a href="http://www.sutosoft.com/room/archives/000503.html">次回</a>に続きます。
</p>

]]>
    </content>
  </entry>
  <entry>
    <title>WM_ENTERSIZEMOVEとWM_EXITSIZEMOVE</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000500.html" />
    <modified>2008-03-02T12:15:20Z</modified>
    <issued>2008-03-02T21:08:55+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.500</id>
    <created>2008-03-02T12:08:55Z</created>
    <summary type="text/plain">本記事は過去に書いた記事の焼き直しです。

Windowsアプリケーションの中には、ウィンドウのサイズ変更に時間がかかるものがあります。
代表的なものは画像ビューアです。画像の拡大縮小を綺麗にやろうとすると時間がかかるからです。
この時間がかかる処理をOnSize(WM_SIZEのハンドラ)に書くと、ウィンドウのサイズ変更がもっさりとしたアプリケーションになってしまいます。
本日紹介する方法は、サイズ変更のもっさり感を解消するための方法です。 </summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>C/C++,WIN32</td></tr>
</table>

<p>
本記事は<a href="http://www.sutosoft.com/room/devdiary/20040501.html">過去に書いた記事</a>の焼き直しです。
</p>

<p>
Windowsアプリケーションの中には、ウィンドウのサイズ変更に時間がかかるものがあります。<br />
代表的なものは画像ビューアです。画像の拡大縮小を綺麗にやろうとすると時間がかかるからです。<br />
この時間がかかる処理を<code>OnSize</code>(<code>WM_SIZE</code>のハンドラ)に書くと、ウィンドウのサイズ変更がもっさりとしたアプリケーションになってしまいます。<br />
本日紹介する方法は、サイズ変更のもっさり感を解消するための方法です。
</p>
]]>
      <![CDATA[<p>
まずは軽くて適当なサイズ変更処理を用意します。
例えば画像ビューアではニアレストネイバー法による拡大縮小処理が良いでしょう。<br />
Windowsでは、サイズ変更前に<code>WM_ENTERSIZEMOVE</code>が送られてきて、サイズ変更後に<code>WM_EXITSIZEMOVE</code>が送られてくるので、
このメッセージの間に<code>WM_SIZE</code>が送られてきた場合は、軽くて適当なサイズ変更処理を実施します。
そして、<code>WM_EXITSIZEMOVE</code>で重くて正確なサイズ変更処理を実施するのです。<br />
これでユーザがウィンドウフレームをドラッグしているときは軽いサイズ変更処理が行われるので、もっさり感はなくなります。
</p>

<p>
これらのメッセージを使うときの注意点を挙げます。
</p>

<ul>
<li><code>WM_ENTERSIZEMOVE</code>と<code>WM_EXITSIZEMOVE</code>は、ウィンドウを移動するときにも送られてきます。
よって、<code>WM_EXITSIZEMOVE</code>を受け取ったときはサイズ変更が実際に発生したかどうか判定するべきです。</li>
<li>システムメニューからサイズを変更した場合など、<code>WM_ENTERSIZEMOVE</code>無しに<code>WM_SIZE</code>が送られてくるときもあります。
このときは、正確なサイズ変更処理を行うべきです。</li>
</ul>

<p>
コードを以下に示します。上記注意点もケアされています。<br />
ウィンドウメッセージの処理は、ご使用のライブラリの作法に合わせて変えて下さい。
</p>

<pre>// グローバル変数orウィンドウクラスのメンバ変数
bool SizeChanging_;
bool SizeChanged_;

// WM_SIZEのハンドラ
LRESULT OnSize(UINT, WPARAM, LPARAM, BOOL&amp;)
{
  if (!SizeChanging_) {
    // 重たくて正確なサイズ変更処理
  }else {
    SizeChanged_ = true;
    // 軽くて適当なサイズ変更処理
  }
  return 0;
}

// WM_ENTERSIZEMOVEのハンドラ
LRESULT OnEnterSizeMove(UINT, WPARAM, LPARAM, BOOL&amp;)
{
  SizeChanging_ = true;
  SizeChanged_ = false;
  return 0;
}

// WM_EXITSIZEMOVEのハンドラ
LRESULT OnExitSizeMove(UINT, WPARAM, LPARAM, BOOL&amp;)
{
  SizeChanging_ = false;
  if (SizeChanged_) {
    // 重たくて正確なサイズ変更処理
  }
  return 0;
}</pre>
]]>
    </content>
  </entry>
  <entry>
    <title>Visual Studio 2008のマルチスレッドデバッグ機能</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000498.html" />
    <modified>2008-03-02T12:07:31Z</modified>
    <issued>2008-02-29T00:01:19+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.498</id>
    <created>2008-02-28T15:01:19Z</created>
    <summary type="text/plain">本日はVisual Studio 2008のマルチスレッドデバッグ機能を紹介します。
従来のVisual Studioからあった機能ですが、ほんのちょっとだけ進化しているようです。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008(Standard Edition以上)</td></tr>
</table>

<p>
本日はVisual Studio 2008のマルチスレッドデバッグ機能を紹介します。<br />
従来のVisual Studioからあった機能ですが、ほんのちょっとだけ進化しているようです。
</p>
]]>
      <![CDATA[<h4>Visual Studio 2008のマルチスレッドデバッグ機能</h4>

<p>
まずは従来からある機能を紹介します。
Visual Studio 2008でマルチスレッドアプリケーションをデバッグ実行すると、
以下のようなスレッドウィンドウを見ることができます。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20080229_threaddebug1.png" width="940" height="644" alt="マルチスレッドデバッグその1" />
<br />
大体見た目通りの機能です。
それぞれのスレッドのIDや名前、実行中の場所を表示してくれます。
<br />
この場合は、メインスレッドが<code>DibInfo::CreateDib</code>を実行中で、ワーカースレッドが<code>DibBox::Load</code>を実行中であることが分かります
(DibInfoがなんであるかとかそういうのは気にしないで下さい)。
</p>

<p>
スレッドウィンドウのワーカースレッドをクリックすると、以下のようになります。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20080229_threaddebug2.png" width="940" height="644" alt="マルチスレッドデバッグその2" />
<br />
ワーカースレッドの実行中の場所のソースコードが表示され、呼び出し履歴もワーカースレッドのものになります。
</p>

<p>
スレッドウィンドウを右クリックすると、以下のようなメニューが表示されます。
<br />
<img src="http://www.sutosoft.com/room/archives/images/20080229_threaddebug3.png" width="940" height="644" alt="マルチスレッドデバッグその2" />
<br />
スレッドの凍結(=SUSPEND)やフラグ設定ができます。
フラグ設定はVisual Studio 2008の新機能です。フラグを設定すると、設定されていないスレッドと簡単に区別できるようになります。<br />
スレッドがたくさんあり、注目したいスレッドを絞り込みたいときに便利そうです。上記の例のようにスレッドが2つのときはなんの役にも立ちませんが。<br />
「16進数で表示」を選ぶとスレッドIDが16進数で表示されます。これもたぶんVisual Studio 2008の新機能です。
新機能というにはしょぼいですが、スレッドIDを16進数でデバッグ出力するようなコードと相性が良いです。
</p>

<p>
Visual Studio 2008のマルチスレッドデバッグ機能はこれで全てのようです。
特定のスレッドだけのステップ実行機能は欲しいと思ったのですが、無いようです(なんでやねん)。
<br />
他のスレッドを全て凍結させてからステップ実行すれば実現できますが、面倒です。
</p>

<p>
以上で紹介はお終いです。<br />
今までより進化したのかどうか微妙なところです。<br />
まだ使い込んでいないので安定性は分かりません。<br />
Visual Studio 6.0やVisual Studio.NET 2003では、マルチスレッドアプリデバッグ中に開発環境が落ちる(反応しなくなる)ことが
良くありました。改善されているのを期待したいところです。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>Unicodeアプリケーションでファイルオープン</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000496.html" />
    <modified>2008-03-02T12:07:40Z</modified>
    <issued>2008-02-27T00:15:44+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.496</id>
    <created>2008-02-26T15:15:44Z</created>
    <summary type="text/plain">Visual Studio 2008を買ってからほぼ毎日ちょっとずつ触っていますが、GUIが今まで使っていたVisual Studio.NET 2003とあんまり変わらないので慣れるのは早そうです。
まだboostが公式に2008に対応していないあたりがちょっと辛いですが。
</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
</table>

<p>
Visual Studio 2008を買ってからほぼ毎日ちょっとずつ触っていますが、GUIが今まで使っていたVisual Studio.NET 2003とあんまり変わらないので慣れるのは早そうです。
<br />
まだboostが公式に2008に対応していないあたりがちょっと辛いですが。
</p>
]]>
      <![CDATA[<h4>Unicodeアプリケーションでファイルオープン</h4>

<p>
C++では、昔は半角文字は1バイト、全角文字は2バイトと可変長になっており、文字列処理が大変面倒でした。
JavaやC#では、半角文字も全角文字も1文字2バイト固定になっていて、大変羨ましく感じたものでした。<br />
そこで、C++でも文字を扱うときは<code>wchar_t</code>を使い、1文字を固定長にしようとしてみたことがあります。
文字列は<code>std::wstring</code>を使えば問題なかったのですが、標準ライブラリを使ったファイルI/Oに問題がありました。
Visual Studio.NET 2003の<code>std::fstream</code>の<code>open</code>メンバは、<br />
<code>open(const char *_Filename, (略)</code><br />
しかありませんでした。<code>wchar_t</code>ベースのファイル名を<code>std::fstream</code>に渡すことができなかったのです。<br />
そこで仕方がなく、<code>WideCharToMultiByte</code>を使って<code>char</code>ベースの文字列に変換したり、別のライブラリを使ったりしていますた。
</p>

<p>
これが、Visual Studio 2008では解決されています(Visual Studio 2005の時点で既に解決されていたみたいです)。<br />
<code>std::fstream</code>に<br />
<code>open(const wchar_t *_Filename, (略)</code><br />
というメンバが追加されました。これでファイル名をwchar_tベースで管理できます。ありがたいことです。
ようやくUnicodeアプリケーションのファイルI/Oに標準ライブラリを使えるようになりました。
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>Visual Studio 2008のインテリセンス</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000495.html" />
    <modified>2008-03-02T12:07:54Z</modified>
    <issued>2008-02-26T00:04:37+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.495</id>
    <created>2008-02-25T15:04:37Z</created>
    <summary type="text/plain">Visual Studio 2008のインテリセンスは、Visual Studio.NET 2003に比べて良くなっています。(Visual Studio 2005は持ってないので比較できません)
特にboostを使ったコードが書きやすくなっています。例を数点紹介します。</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<table>
<tr><td>開発環境</td><td>Visual C++ 2008</td></tr>
<tr><td>ライブラリ</td><td>boost 1.34.1</td></tr>
</table>

<p>
Visual Studio 2008のインテリセンスは、Visual Studio.NET 2003に比べて良くなっています。(Visual Studio 2005は持ってないので比較できません)<br />
特にboostを使ったコードが書きやすくなっています。例を数点紹介します。
</p>
]]>
      <![CDATA[<h4>boost::shared_ptr</h4>

<p>
<code>boost::shared_ptr</code>越しでもちゃんとメンバ一覧が表示されます。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is1.png" width="329" height="301" alt="boost::shared_ptrその1" />
</p>

<p>
<code>boost::shared_ptr</code>自身のメンバもばっちり<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is2.png" width="329" height="415" alt="boost::shared_ptrその2" />
</p>

<h4>boost::tuple</h4>

<p>
<code>boost::tuple</code>も問題ありません。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is3.png" width="466" height="360" alt="boost::tupleその1" />
</p>

<p>
メンバ関数テンプレートなので、<code>&lt;&gt;</code>を入れろということまで教えてくれます。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is4.png" width="766" height="298" alt="boost::tupleその2" />
</p>

<p>
<code>boost::tuple</code>と<code>boost::shared_ptr</code>が組み合わさっていても問題なし。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is5.png" width="488" height="318" alt="boost::tupleその4" />
</p>

<h4>透明化</h4>

<p>
こんなおまけ機能もあります。候補ウィンドウ表示中に、Ctrlを押すとウィンドウが半透明になります。というよりほとんど見えなくなります。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is6.png" width="488" height="318" alt="透明化" />
<br />
これは<a href="http://www.atmarkit.co.jp/fdotnet/dotnettips/708isensetrans/isensetrans.html">Visual Studio 2008の新機能らしい</a>です。
コードが混み合っている時は便利かもしれません。
</p>

<h4>補足</h4>

<p>
なお、Visual Studio.NET 2003では、上記のインテリセンスは全てこのメッセージで拒否されました。<br />
<img src="http://www.sutosoft.com/room/archives/images/20080226_is7.png" width="381" height="17" alt="Visual Studio.NET 2003" />
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>libjpeg高速化改造版の使い方(Visual Studio 2008)</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000493.html" />
    <modified>2008-02-19T15:44:08Z</modified>
    <issued>2008-02-18T01:27:48+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.493</id>
    <created>2008-02-17T16:27:48Z</created>
    <summary type="text/plain">ソフトウェア工房αさんがリリースしているlibjpeg高速化改造版をVisual Studio 2008で使う方法を調べましたので、まとめておきます。
(正式名称はIndependent JPEG Group&apos;s JPEG software release 6b with x86 SIMD extension for IJG JPEG library version 1.02)</summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<a href="http://cetus.sakura.ne.jp/softlab/">ソフトウェア工房α</a>さんがリリースしている<a href="http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html">libjpeg高速化改造版</a>をVisual Studio 2008で使う方法を調べましたので、まとめておきます。<br />
(正式名称はIndependent JPEG Group's JPEG software release 6b with x86 SIMD extension for IJG JPEG library version 1.02)<br />
(<a href="http://www.sutosoft.com/room/archives/000436.html">Visual C++.NET 2003の場合はこちら</a>)
</p>
]]>
      <![CDATA[<p>
必要なもの
<ul>
<li>Visual Studio 2008(Visual C++ 9.0)</li>
<li>NASM(nasm-2.02rc2-win32.zip)。<a href="http://sourceforge.net/project/showfiles.php?group_id=6208">SourceForge.net The Netwide Assembler</a>からダウンロード可能。</li>
<li>libjpeg高速化改造版ソースコード(jpegsrc-6b-x86simd-1.02.tar.gz)。<a href="http://cetus.sakura.ne.jp/softlab/jpeg-x86simd/jpegsimd.html">libjpegの高速化改造版のページ</a>からダウンロード可能</li>
<li>プロジェクトファイル一式。<a href="http://www.sutosoft.com/room/archives/products/20080218_libjpegx.lzh">ダウンロードはこちら</a></li>
</ul>
</p>

<p>
手順
<ol>
<li>NASMを適当なフォルダに展開します。</li>
<li>ツール→オプション→プロジェクトおよびソリューション→VC++ ディレクトリ→ディレクトリを表示するプロジェクト→実行可能ファイル にNASMを展開したフォルダのパスを追加します。</li>
<li>プロジェクトファイル一式をjpeglib.hと同じ場所に置きます。</li>
<li>libjpegx.slnを開いて全構成をビルドします。lib-vc90フォルダ以下にC++ランタイムに合わせた4種類のlibファイルが作成されます。</li>
</ol>
</p>

<p>
libjpeg高速化改造版の機能は、jpeglib.hを#includeすると使えるようになります。<br />
</p>
]]>
    </content>
  </entry>
  <entry>
    <title>libjpegの使い方(Visual Studio 2008)</title>
    <link rel="alternate" type="text/html" href="http://www.sutosoft.com/room/archives/000492.html" />
    <modified>2008-02-19T16:01:25Z</modified>
    <issued>2008-02-17T00:47:43+09:00</issued>
    <id>tag:www.sutosoft.com,2008:/room//2.492</id>
    <created>2008-02-16T15:47:43Z</created>
    <summary type="text/plain">IJGが配布しているIJG JPEG library(libjpeg、jpeglib、jpeg-6bと呼ばれることもあるようです)をVisual Studio 2008で使う方法を調べましたので、まとめておきます。 </summary>
    <author>
      <name>MASATO</name>
      <url>http://www.sutosoft.com/room/</url>
      <email>masato@mb.kcom.ne.jp</email>
    </author>
    <dc:subject>技術メモ</dc:subject>
    <content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.sutosoft.com/room/">
      <![CDATA[<p>
<a href="http://www.ijg.org/">IJG</a>が配布しているIJG JPEG library(libjpeg、jpeglib、jpeg-6bと呼ばれることもあるようです)をVisual Studio 2008で使う方法を調べましたので、まとめておきます。
<br />
(<a href="http://www.sutosoft.com/room/archives/000435.html">Visual C++.NET 2003の場合はこちら</a>)
</p>
]]>
      <![CDATA[<p>
必要なもの
</p>
<ul>
<li>Visual Studio 2008(Visual C++ 9.0)</li>
<li>IJG JPEG library ソースコード(jpegsrc.v6b.tar.gz)。<a href="http://www.ijg.org/">IJG</a>からダウンロード可能</li>
<li>プロジェクトファイル(libjpeg.vcproj)。<a href="http://www.sutosoft.com/room/archives/products/20080217_libjpeg.lzh">ダウンロードはこちら</a></li>
</ul>

<p>
手順
</p>
<ol>
<li>libjpeg.vcprojをjpeglib.hと同じ場所に置きます。</li>
<li>libjpeg.vcprojを開いて全構成をビルドします。lib-vc90フォルダ以下にC++ランタイム毎の4種類のlibファイルが作成されます。</li>
</ol>

<p>
Visual C++.NET 2003はC++ランタイムが6種類あったのですが、2008ではシングルスレッド用のランタイムがなくなり、4種類になったようです。
</p>

<p>
libjpegの機能は、jpeglib.hを#includeすると使えるようになります。<br />
このとき、標準的なヘッダ(windows.hなど)と干渉を起こすことがありますが、以下のように書くと回避できます。
<pre>#define XMD_H
#undef FAR
extern &quot;C&quot; {
#include &lt;jpeglib.h&gt;
}</pre>
</p>

<p>
以上です。
</p>
]]>
    </content>
  </entry>

</feed>