<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="../../../../../css/rss/feedRss2.xsl" media="screen" type="text/xsl"?>

<rss version="2.0"> 
  <channel> 
    <title>C++　フリーでぷろぐらみんぐ</title>  
    <link>http://ameblo.jp/nana-2007-july/</link>  
    <description>逆引きリファレンス</description>  
    <language>ja</language>  
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="self" href="http://feedblog.ameba.jp/rss/ameblo/nana-2007-july/rss20.xml" type="application/rss+xml"/>  
    <item> 
      <title>目次</title>  
      <description><![CDATA[<p>
 <p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10036010464.html"><strong>はじめに</strong></a>
 </font><font size="3"><br />
</font><font size="3"><strong><a href="http://ameblo.jp/nana-2007-july/entry-10039508098.html">サンプルについて</a>
 </strong></font></p>
<p><font size="3"><strong><a href="http://ameblo.jp/nana-2007-july/entry-10084103646.html">エラーについて</a>
 </strong></font></p>
<p><font size="3"><strong><a href="http://ameblo.jp/nana-2007-july/entry-10100992969.html">VC++でのコンパイルについて</a>
 <br />
</strong></font></p>
<p><strong><font size="3"><br />
</font></strong></p>
<p><font size="3"><strong>【準備編】</strong></font><br />
</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10035988461.html"><font size="3">・どのプログラム言語を学んだらいいの？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10035999963.html"><font size="3">・C++をWindowsでフリーで開発するには？</font></a>
 <font size="3"><br />
</font><a href="http://ameblo.jp/nana-2007-july/entry-10036000826.html"><font size="3">・DevC++をインストールするには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036006484.html"><font size="3">・wxDevC++をインストールするには？</font></a>
 <font size="3"><br />
</font><a href="http://ameblo.jp/nana-2007-july/entry-10036290582.html"><font size="3">・どんな本を参考にしたらいいの？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10086692721.html">・Dev-C++やwxDev-C++でWindowsのDLLを使用するには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10101317623.html">・VC++でDLLから.libファイルを作成するには？</a>
 <br />
<br />
</font></p>
<p><br />
</p>
<p><br />
</p>
<p><font size="3"><strong>【C++編】</strong></font></p>
<p><img height="16" alt="星" src="http://stat.ameba.jp/blog/ucs/img/char/char2/112.gif" width="16" /><font size="3"><strong>文字処理</strong></font><br />
<a href="http://ameblo.jp/nana-2007-july/entry-10036104516.html"><font size="3">・区切り文字を分割するには？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037110517.html"><font size="3">・複数の文字のうち、いずれかの文字が最初に現れる位置を検索するには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036854839.html"><font size="3">・HTMLのタグを分解するには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036924781.html"><font size="3">・HTMLのタグを分解するには？</font></a>
 <font size="3">（セパレータの拡張） <br />
</font><a href="http://ameblo.jp/nana-2007-july/entry-10037136119.html"><font size="3">・HTMLタグの閉じ忘れをチェックするには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10038434220.html"><font size="3">・正規表現を使用するには？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037531052.html"><font size="3">・やってはいけない、switchで文字列を使用する方法とは？</font></a>
 <font size="3"><br />
</font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10090506649.html">・マルチバイト文字を扱うには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10098557843.html">・数字や文字列を次々に連結してstringに出力するには？</a>
 </font></p>
<br />
<p><br />
</p>
<p><img height="16" alt="星" src="http://stat.ameba.jp/blog/ucs/img/char/char2/112.gif" width="16" /><font size="3"><strong>ストリーム処理</strong></font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10036381872.html"><font size="3">・独自で作成したクラスを cout &lt;&lt; できるようにするには？</font></a>
 <font size="2"><br />
</font></font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10040003590.html">・ファイルのサイズを取得するには？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037433743.html"><font size="3">・ファイルの内容をstringに入れるには？</font></a>
 <font size="3"><br />
</font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10040009407.html">・ファイルの内容を効率よくstringに入れるには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10104246843.html">・出力ストリーム（coutなど）でsetfill()などの有効範囲を関数内だけにするには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10104294377.html">・ストリームの読み込み位置を自由に変えるには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10104732073.html">・入出力ストリームをイテレータで扱うには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html">・ログ出力を実装する上での注意点とは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10118972301.html">・ファイルロックをするには？(boostのfile_lock)</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10121445374.html">・ログ出力クラスを作成するには？</a>
 </font></p>
<p><br />
<br />
</p>
<p><img height="16" alt="星" src="http://stat.ameba.jp/blog/ucs/img/char/char2/112.gif" width="16" /><font size="3"><strong>配列処理</strong></font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036937673.html"><font size="3">・vectorやlistにnewしたクラスを入れるには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037718266.html"><font size="3">・vectorやlistをソートするには？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037814047.html"><font size="3">・独自のクラスをvectorやlistでソートするには？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10041342046.html">・キーから値を検索するには？　（連想配列）</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10091225141.html">・連想配列（ハッシュ）を作るには？</a>
 </font></p>
<br />
<br />
<p><img height="16" alt="星" src="http://stat.ameba.jp/blog/ucs/img/char/char2/112.gif" width="16" /><font size="3"><strong>コードの書き方</strong></font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036131923.html"><font size="3">・違う型どうしを自由に変換するには？</font></a>
 <font size="3"><br />
</font><a href="http://ameblo.jp/nana-2007-july/entry-10036138155.html"><font size="3">・template　を利用したクラスの外で、friend関数のコードを書くには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036147223.html"><font size="3">・ユーザに処理の順番を自由に変更させるには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036269366.html"><font size="3">・関数内で引数の値を変更させないようにするには？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10039776699.html">・存在するオブジェクトの数を数えるには？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036388642.html"><font size="3">・派生クラスで、何度も同じ処理を書かなくても良いようにするには？</font></a>
 <font size="3"><br />
</font></p>
<p><font size="3">　（もしくは、コードの書き忘れを防ぐには？）</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10040193274.html"><font size="3">・ユーザに機能追加を自由にさせるには？</font></a>
 <br />
</p>
<p><font size="3">・</font><a href="http://ameblo.jp/nana-2007-july/entry-10084448588.html"><font color="#0066cc" size="3">templateで一部の型以外の使用を禁止するには？</font></a>
 <br />
<font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10084474982.html">・型を気にせずに使用できるクラスを作るには？</a>
 </font><br />
</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036866080.html"><font size="3">・メモリリークを起こりにくくするには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036737919.html"><font size="3">・関数を抜けるまでの処理時間を計るには？</font></a>
 <font size="3"><br />
</font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10089815465.html">・自作のイテレータを作成するには？</a>
 </font></p>
<p><font size="3"><br />
</font></p>
<br />
<p><img height="16" alt="星" src="http://stat.ameba.jp/blog/ucs/img/char/char2/112.gif" width="16" /><font size="3"><strong>WEB処理</strong></font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037557399.html"><font size="3">・WEBの処理部分とデザイン部分を分けるには？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10038276664.html"><font size="3">・WEBの処理部分とデザインを分けるサンプルの補足</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10039540927.html">・MVCを実現するには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10041338197.html">・MVCを実現するには？（サンプルその２）</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10102823568.html">・windowsでWEBをするには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10105374443.html">・GETやPOSTのデータを取得するには？</a>
 </font><br />
</p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10105686166.html">・POST/GETデータをアンエスケープするには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10106261596.html">・CGIセッションを実現するには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10112570031.html">・WEBデザイン（View）の拡張サンプル</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10116603938.html">・補足：WEBデザイン（View）の拡張サンプル</a>
 </font></p>
<p><br />
</p>
<p><br />
</p>
<p><font size="3"><strong>【C++データベース（DB）編】</strong></font><br />
<font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10085065122.html">・C++ でPostgresと接続するには？<br />
</a>
</font><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10086686152.html">・C++ でMySQLと接続するには？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10085936253.html"><font size="3">・PostgreSQLのデータを取得するには？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10086108905.html">・DBの種類を気にせずにコードを書くには？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10086132472.html">・「DBの種類を気にせずに・・・」のヘッダ分解版　（１つ上の記事を.hと.cppに分解）</a>
 </font><br />
</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10087019755.html"><font size="3">・MySQLの接続クラスを追加するには？</font></a>
 <br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><strong><font size="3">【C++GUI編】</font></strong></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036174789.html"><font size="3">・コンパイルはどうやってやればいいの？（GUIアプリの場合）</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036474633.html"><font size="3">・wxDev-C++のフォントと予約語の色を変えるには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036502162.html"><font size="3">・メニューバーでファイルを開く機能を追加するには？</font></a>
 <br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><br />
</p>
<p><font size="3"><strong>【ドキュメント自動作成編】</strong></font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036479052.html"><font size="3">・関数ヘッダからドキュメントを作るには？　（javadocのように）</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036694631.html"><font size="3">・doxygenでドキュメント作成するには？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036593248.html"><font size="3">・doxygenとは？　⇒使用上の注意点は？良く使用するタグは？</font></a>
 </p>
<p><br />
<br />
</p>
<p><br />
<font size="3"><strong>【言葉の説明】</strong></font><br />
</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036099791.html"><font size="3">・Boostとは？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036593248.html"><font size="3">・doxygenとは？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10104386742.html">・HTTP通信とは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10091379057.html">・MD5とは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10088268504.html">・namespace（名前空間）とは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10123025929.html">・POSIXとは？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10037599796.html"><font size="3">・shared_ptrとは？</font></a>
 <font size="3"><br />
</font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10078272385.html">・循環参照とは？　（shared_ptr）</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10039631297.html">・Springとは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10117588039.html">・SQLインジェクションとは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10084842974.html">・templateの特殊化とは？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036144565.html"><font size="3">・typedefとは？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10116615494.html">・Viewとは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10038342175.html">・virtualとは？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036204502.html"><font size="3">・wxDev-C++とは？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036205712.html"><font size="3">・wxWidgetsとは？</font></a>
 <font size="3"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036126921.html"><font size="3">・イテレータとは？</font></a>
 </p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10105093250.html">・クッキーとは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10037680575.html">・コンストラクタで書かれるコロン「：」って何？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10099593812.html">・バイナリモード、テキストモードとは？（ファイルのオープンモード）</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10090461288.html">・ハッシュとは？</a>
 </font></p>
<p><font size="3"><a href="http://ameblo.jp/nana-2007-july/entry-10101742259.html">・文字コード（の特徴）とは？</a>
 </font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036009862.html"><font size="3">・漏補とは？</font></a>
 <font size="3"><br />
</font></p>
<p><br />
</p>
<p><br />
<br />
</p>
<br />
<br />
<br />
<br />
<br />
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10035986784.html</link>  
      <pubDate>Sun, 03 Aug 2008 11:36:11 +0900</pubDate> 
    </item>  
    <item> 
      <title>POSIXとは？</title>  
      <description><![CDATA[<p>
 <p>UNIXベースのOSが備えるべき機能です。</p>
<p>つまり、POSIXで定義された機能はUNIXベースのOSであればどれでも使用できることになります。</p>
<p>LinuxでもほとんどPOSIXの要件は満たしているようです。（すべてかどうかは分かりませんが。。）</p>
<br />
<br />
<p>POSIX認定された機能を使用するとUNIX系のさまざまなOSに移行しやすいので便利です。</p>
<br />
<p>POSIXの機能として具体的には、mkdir()やsleep()などの関数が存在します。</p>
<p>似たような関数はWindows用の関数でも存在しますが、微妙に名前が違ったり、引数の数が意味が違ったりします。</p>
<p>これは注意点かと思います。</p>
<br />
<br />
<p>【WindowsとPOSIXを区別なく使用するには？】</p>
<p>たぶん、WindowsとPOSIXを隠蔽化してシームレスにディレクトリ作成の関数などを使用したくなると</p>
<p>思います。</p>
<p>このためには、一番いいのはBoostを使用することだと思います。</p>
<br />
<p>ディレクトリなどの操作であれば、以下のものがあります。</p>
<p>　・path.hpp</p>
<p>　・operations.hpp</p>
<p>　・error_code.hpp</p>
<br />
<p>　これらは、ディレクトリやファイルをイテレータで扱ったり、存在をチェックしたりでき、かなり便利な形で</p>
<p>　隠蔽化してくれています！</p>
<br />
<p>ただし、コンパイルが必要です。</p>
<br />
<br />
<p>＜自分で何とかしたい場合＞</p>
<p>もし自分で必要な関数だけ隠蔽化したければ、<strong><font color="#ff0000">&quot;boost/config.hpp&quot;</font></strong>をincludeしましょう。</p>
<p>Boostのライブラリで、コンパイルは必要ありません。</p>
<p>これは、環境がWindowsかどうかを教えてくれる定義を提供してくれます。</p>
<p>具体的には、以下のような感じで使用します。</p>
<br />
<br />
<strong><font color="#ff0000">#if (defined BOOST_WINDOWS) &amp;&amp; !(defined BOOST_DISABLE_WIN32)</font></strong><br />
　#include &lt;windows.h&gt; <br />
　#include &lt;direct.h&gt;<br />
<strong><font color="#ff0000">#else</font></strong><br />
　#include &lt;unistd.h&gt;<br />
　#include &lt;sys/stat.h&gt;<br />
<strong><font color="#ff0000">#endif</font></strong><br />
<br />
<p>これでコンパイル時にWindowsなら上２つをincludeして、違えば下２つをincludeします。</p>
<p>資料が少なくて正確なところはわかりませんが、上記の感じで使用できると思います。</p>
<br />
<br />
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10036099791.html"><font color="#3c559d" size="2">・Boostとは？</font></a>
 <font size="2"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10121445374.html"><font color="#3c559d" size="2">・ログ出力クラスを作成するには？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10106273393.html">・CGIセッションのサンプル</a>
 　←セッションファイルの削除の部分で使用しています<br />
<a href="http://e-words.jp/w/POSIX.html" target="_blank">・IT用語辞典</a>
 </p>
<p><a href="http://www.atmarkit.co.jp/aig/03linux/posix.html" target="_blank">・@ITでの説明</a>
<br />
</p>
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10123025929.html</link>  
      <pubDate>Sun, 03 Aug 2008 09:02:27 +0900</pubDate> 
    </item>  
    <item> 
      <title>ログ出力クラスを作るには？</title>  
      <description><![CDATA[<p>
 <p>以前の記事で、ログ出力は難しい問題ということを書きました。</p>
<br />
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font color="#3c559d" size="2">・ログ出力を実装する上での注意点とは？</font></a>
 <font size="2"><br />
</font></p>
<br />
<p>そうはいっても、ある程度動くものを作ってみないことには感じもつかめません。</p>
<br />
<p>ここでは、WindowsやPOSIXの環境で使用できそうなログクラスを作ってみようと思います。</p>
<br />
<br />
<p>さて、boostにファイルロッククラスはありますが、ログ出力への使用は難しそうです。</p>
<p>そこでここではディレクトリ作成によるファイルロックを使用してサンプルを作ってみようと思います。</p>
<br />
<br />
<p>ファイルは<a href="http://nana-2007-july.up.seesaa.net/cpp/stl_log.zip" target="_blank">こちら</a>
 。</p>
<br />
<p>すぐに遊べるようにDev-C++とVC++2008のプロジェクトも入れてみました。</p>
<p>以下のファイルをダブルクリックしてみてください。</p>
<p>ビルド後にデバッグを起動するか、作成したexeを直接起動してみてください！</p>
<br />
<p>　Dev-C++　　⇒　stl_log/Project1.dev<br />
　VC++2008　⇒　stl_log/log_vcprj/log.sln</p>
<p><br />
<br />
</p>
<p>【サンプル（mainのみ抜粋）】</p>
<p>#include &lt;cstdlib&gt;<br />
#include &lt;iostream&gt;</p>
<p><br />
//#include &lt;crtdbg.h&gt;</p>
<p>#include &quot;boost/progress.hpp&quot; </p>
<p>#include &quot;NLog.h&quot;</p>
<p><br />
using namespace nana;</p>
<p><br />
<font color="#ff0000"><strong>//ログファクトリへの登録</strong><br />
</font>void initLogMap()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LogFactory::setLog(0, LogPtr(new Log(Log::INFO, &quot;main&quot;, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogFileWriterAutoPtr(new DelayFileWriter&lt;FileLock&gt;(&quot;testlog.txt&quot;))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;LogFactory::setLog(1, LogPtr(new Log(Log::ERR, &quot;log&quot;, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogFileWriterAutoPtr(new DelayFileWriter&lt;FileLock&gt;(&quot;testlog.txt&quot;))))<br />
&nbsp;&nbsp;&nbsp;&nbsp;);<br />
};</p>
<br />
<p><br />
int main()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;// メモリリーク検出<br />
&nbsp;&nbsp;&nbsp;&nbsp;//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;initLogMap();</p>
<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000">//ログファクトリから取得してみる</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;LogPtr log0 = LogFactory::getLog(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;log0-&gt;info(&quot;ファクトリーから取得&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;log0-&gt;flush();</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong><font color="#ff0000">//直接ログオブジェクトを作成してみる</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;Log log(Log::INFO, &quot;main&quot;, LogFileWriterAutoPtr(new DelayFileWriter&lt;FileLock&gt;(&quot;testlog.txt&quot;)));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;progress_timer pro;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;1; ++i){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.err(&quot;エラーです&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(&quot;情報です&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warning(&quot;警告です&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.printf(Log::INFO, &quot;%d, %s 正常終了しました。いえーい&quot;, 12, &quot;がんばれよ&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;log.flush();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;system(&quot;PAUSE&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</p>
<br />
<br />
<p>【出力】</p>
<p>2008/07/29 13:59:07 [INFO] [main] ファクトリーから取得<br />
2008/07/29 13:59:07 [ERR] [main] エラーです<br />
2008/07/29 13:59:07 [INFO] [main] 情報です<br />
2008/07/29 13:59:07 [INFO] [main] 12, がんばれよ 正常終了しました。いえーい<br />
</p>
<p><br />
</p>
<p><br />
</p>
<p>【Logクラスの一部を抜粋】</p>
<p><br />
<strong><font color="#ff0000">#if (defined BOOST_WINDOWS) &amp;&amp; !(defined BOOST_DISABLE_WIN32)</font></strong></p>
<br />
<p>inline void sleep(const long&amp; msec){<br />
::Sleep(static_cast&lt;DWORD&gt;(msec));<br />
};</p>
<br />
<p><strong><font color="#ff0000">#else</font></strong></p>
<br />
<p>inline void sleep(const long&amp; msec){<br />
::usleep(static_cast&lt;useconds_t&gt;(msec*1000));<br />
};</p>
<br />
<p><strong><font color="#ff0000">#endif</font></strong></p>
<p><br />
</p>
<p>ファイルのロックはディレクトリにより実現しました。</p>
<p>ディレクトリによるロックの実現を阻むものに、mkdir()、sleep()関数がC++言語標準に存在しないことを</p>
<p>以前の記事で挙げました。</p>
<p>ここではmkdir()、sleep()関数が存在する、WindowsとPOSIXに対象をしぼりました。</p>
<p>しかし、そのmkdir()やsleep()も、微妙に関数名や引数が違います。</p>
<p>それをどのように吸収するかというと、上記コードです<img height="16" alt="グッド！" src="http://stat.ameba.jp/blog/ucs/img/char/char2/187.gif" width="16" /></p>
<br />
<p>WindowsかPOSIXかをコンパイラに認識させ、実装の記述を変えるための工夫です。</p>
<p><strong><font color="#0000ff">&quot;boost/config.hpp&quot;</font><font color="#ff0000">をincludeすることで上記のように#ifで関数の内容を</font></strong></p>
<p><strong><font color="#ff0000">変えることができます！</font></strong></p>
<br />
<p><br />
<br />
</p>
<p>【説明】</p>
<p>システムがディレクトリを作成する時に排他をするので、同名のディレクトリを作成しようとするとエラーにします。</p>
<p>これを利用した方法でファイルロックを実現しています。</p>
<p>エラーはプログラムで捕捉できるので、ロック用のディレクトリを作成してみてエラーになれば、既に存在することが分かります。（つまり、ファイルがロックされていることが分かります）</p>
<br />
<p>ロックされていた場合は、200ミリ秒ほどsleepしてその後に再度ロックを試みます。</p>
<br />
<p><br />
<strong>＜ログ出力の方法＞</strong></p>
<p>Log.hファイルを見てみましょう。</p>
<p>ファイルロックの方法を決めても、ログ出力のためにはいくつか選択肢があります。</p>
<p>今回は、以下の２つの方法を提供しています。</p>
<br />
<p>　<strong><font color="#0000ff">①SimpleFileWriter</font></strong></p>
<p>　　ログ出力のたびに、ロック⇒ファイルオープン⇒書き込み⇒ファイルクローズ⇒アンロック、をします。</p>
<br />
<p>　<strong><font color="#0000ff">②DelayFileWriter</font></strong></p>
<p>　　ログ出力は一時ファイルを作成して書き込みます。flush()関数などが呼ばれたときに、</p>
<p>　　一時ファイルの内容をログファイルに書き込みます。</p>
<br />
<br />
<p>まず①の方法での良いところは、必ず時系列でメッセージが出力されるということです。</p>
<p>デメリットは、どのスレッドやプロセスから出力されたかが分かりにくいことと、</p>
<p>毎回ファイルオープンとクローズをするので遅いということです。</p>
<br />
<p>②の良いところは、ログオブジェクトごとにメッセージがまとまるので、ある画面の処理メッセージが連続で出力されることと、①よりも処理が速いことです。</p>
<p>デメリットは、他のスレッドなどの処理メッセージを時系列で把握しにくいでことす。</p>
<br />
<br />
<p><strong>＜クラス＞</strong></p>
<p>おおまかに以下のクラスがあります。</p>
<p>・ファイルロッククラス（FileLock）　・・・ファイルをロックするクラスです。</p>
<p>・ファイル書き込みクラス（XxFileWriter）・・・ロッククラスを内部に保持し、ロックから書き込みまでを担当します。</p>
<p>・ログクラス(Log)　・・・ファイル書き込みクラスを内部に保持し、ログ書き込みに必要なロック処理などを</p>
<p>　　　　　　　　　　隠蔽して使いやすいインタフェースを提供します。</p>
<p>　　　　　　　　　　また、ログレベルの機能もこのクラスが担当します。</p>
<br />
<br />
<strong>使用例：</strong><br />
<p>Log log(Log::INFO, &quot;main&quot;, LogFileWriterAutoPtr(new <strong><font color="#0000ff">DelayFileWriter</font></strong>&lt;<strong><font color="#0000ff">FileLock</font></strong>&gt;(&quot;testlog.txt&quot;)));</p>
<br />
<p>書き込みクラス（DelayFileWriter）はSimpleFileWriterrクラスと入れ替えられます！</p>
<p>入れ替えて遊んでみてください。<br />
</p>
<p>また、ファイルロッククラス（FileLock）や書き込みクラスは、自由に拡張できます。</p>
<p>他にも色々作ってみましょう！（＾＾）</p>
<br />
<br />
<p><strong>＜ログファクトリー＞</strong></p>
<p>将来性を考えてみると、スレッドごとやプロセスごとに別々にログオブジェクトが取得できると</p>
<p>ファイルロックの問題を解決できそうです。</p>
<p>そのためには、１つのオブジェクトからログを取得できるようにすると良いと思います。</p>
<p>そこで、ここではそこまで実装しませんが、とりあえずLogFactoryクラスを作成しました。</p>
<p>ログファクトリーは使用しなくても大丈夫です。</p>
<p>サンプルのmainを参考にしてみてください。<br />
<br />
</p>
<p>もっと詳しくは、doxygenでドキュメントを作成してみてくださいね。<img height="16" alt="音譜" src="http://stat.ameba.jp/blog/ucs/img/char/char2/038.gif" width="16" /></p>
<br />
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font size="2">・ログ出力を実装する上での注意点とは？</font></a>
 <font size="2"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118972301.html"><font size="2">・ファイルロックをするには？(boostのfile_lock)</font></a>
 <font size="2"><br />
</font></p>
<a href="http://ameblo.jp/nana-2007-july/entry-10036099791.html"><font color="#3c559d" size="2">・Boostとは？</font></a>
 <br />
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10121445374.html</link>  
      <pubDate>Tue, 29 Jul 2008 22:00:12 +0900</pubDate> 
    </item>  
    <item> 
      <title>Boostのfile_lockクラスの和訳メモ</title>  
      <description><![CDATA[<p>
 <p>自分用のメモです。</p>
<p><a href="http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock.file_lock_not_thread_safe" target="_blank">この説明</a>
 のてきとう訳です。</p>
<p>自分の場合いつも意訳しないと英語を理解できないので、余計な言葉を<strong><font color="#ff0000">想像で</font></strong>補って訳を作ります。</p>
<p>ちなみに自分の高校時代の英語の成績は5段階で下から2番目です（＾＾）</p>
<p>あくまで自分用のメモですので、正確なところは各自でお調べください。<img height="16" alt="シラー" src="http://stat.ameba.jp/blog/ucs/img/char/char2/145.gif" width="16" /></p>
<br />
<br />
<p>【訳：　Caution: Synchronization limitation】</p>
<p>・１つのfile_lockクラスが、同一のプロセスで動作している２つのスレッドを同期しようとする場合、</p>
<p>　動作不定になります。</p>
<p>・1つのプロセスが、同一のファイルを指す2つのfile_lockクラスを使用する場合、動作不定になります。</p>
<br />
<br />
<p>最初の制限は、主にPOSIXから来るものです。POSIXのファイルハンドルはプロセス単位の属性であり、<br />
スレッド単位の属性ではないからです。<br />
これが意味するところは、もし１つのスレッドがファイルロックオブジェクトを使ってファイルをロックしてしまうと、<br />
（同じプロセスの）他のスレッドもそのファイルをロックしているように振舞うということです。<br />
Windowsのファイルロックのメカニズムは、一方で、スレッドの同期の保障を提供します。<br />
（POSIXの場合にはスレッドごとに別々にロックの所有権を持てなかったのに対して、）<br />
Windowsの場合、あるスレッドが（他のスレッドによって）すでにロックされたファイルをロックしようとするとブロックされることになります。</p>
<br />
<br />
<p>2つ目の制限は、Windowsでは、ファイルロックの同期状態の情報が、ファイル記述子１つだけに結び付けられる、という事実に起因します。<br />
これが意味するところは、もし（１つのプロセスで）2つのファイルロックオブジェクトが同一のファイルを指すように作成されたなら、同期は保障されないということです。<br />
POSIXの場合、2つのファイル記述子が１つのファイルをロックするために使用されて、<br />
そのうちの１つの記述子がクローズされたなら、呼び出しているプロセスがセットしたすべてのファイルロックは、クリアされます。</p>
<p><br />
</p>
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font color="#3c559d" size="2">・ログ出力を実装する上での注意点とは？</font></a>
 <font size="2"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118972301.html"><font color="#3c559d" size="2">・ファイルロックをするには？(boostのfile_lock)</font></a>
 <font size="2"><br />
</font></p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A8%98%E8%BF%B0%E5%AD%90" target="_blank">ファイル記述子</a>
 （Wiki）</p>
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10119478045.html</link>  
      <pubDate>Thu, 24 Jul 2008 06:17:54 +0900</pubDate> 
    </item>  
    <item> 
      <title>ファイルロックをするには？(boostのfile_lock)</title>  
      <description><![CDATA[<p>
 <p>ログ出力などしようと思えばファイルのロックをしたくなります。</p>
<br />
<p>この記事は、<a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font color="#3c559d" size="2">ログ出力を実装する上での注意点とは？</font></a>
 <font size="2">の続きです。</font></p>
<p><font size="2"><br />
</font></p>
<p><font size="2">ファイルのロックは難しい問題です。</font></p>
<p><font size="2">ここでは、Boostのfile_lockを使用したロックを実現してみます。</font></p>
<p><font size="2"><br />
</font></p>
<p><font size="2"><br />
</font></p>
<p><font size="2">【準備】</font></p>
<p><font size="2">まず、boostのfile_lockクラスは、コンパイルの必要がありません。</font></p>
<p><font size="2">しかし、ちょっとバグがあります。</font></p>
<p><font size="2">修正方法をまとめましたので、参考にして修正してみてください。</font></p>
<p><font size="2">　<a href="http://ameblo.jp/nana-2007-july/entry-10118738018.html">boostのfile_lockのコンパイルエラーの回避方法</a>
 </font></p>
<p><font size="2"><br />
</font></p>
<p><font size="2"><br />
</font></p>
<p>【サンプル】</p>
<p>#include &lt;cstdlib&gt;<br />
#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
#include &lt;fstream&gt;<br />
#include &lt;stdexcept&gt;</p>
<br />
<p><br />
#include &lt;boost/interprocess/sync/file_lock.hpp&gt;<br />
#include &lt;boost/date_time/posix_time/posix_time.hpp&gt;</p>
<p><br />
using namespace std;<br />
using namespace boost;<br />
using namespace boost::posix_time;<br />
using namespace boost::interprocess;</p>
<p><br />
int main()<br />
{<br />
<font color="#ff0000"><strong>&nbsp;&nbsp;&nbsp;&nbsp;//This throws if the file does not exist or it can't<br />
&nbsp;&nbsp;&nbsp;&nbsp;//open it with read-write access!<br />
</strong></font></p>
<p><font color="#ff0000"><font color="#000000"><br />
</font><font color="#ff0000"><strong>&nbsp;&nbsp;&nbsp;&nbsp;//ロックしたファイルは書き込みできないのでロック用のファイルを書き込みと別に作成。</strong></font><font color="#000000"> <br />
&nbsp;&nbsp;&nbsp;&nbsp; ofstream ofs_t(&quot;_lock_myfile.txt&quot;, ios_base::app);<br />
&nbsp;&nbsp;&nbsp;&nbsp; ofstream ofs(&quot;myfile.txt&quot;, ios_base::app);</font><br />
</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;try{ <br />
<strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* </font></strong></p>
<p><strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; コンストラクタではロックされません。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OSにファイルロック機構があるか？ファイルは存在するか？のみチェックします。 </font></strong></p>
<p><strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interprocess::<strong><font color="#0000ff">file_lock</font></strong> flock(&quot;_lock_myfile.txt&quot;);</p>
<br />
<p><strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ファイルロックできるまでに待つ時間を5秒にします。 </font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptime pt = second_clock::universal_time();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt += seconds(5);<br />
<br />
<strong><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp; //ファイルロックを試みます。5秒以内にロックできなければ例外を発生させます。</font></strong> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!<strong><font color="#0000ff">flock.timed_lock</font></strong>(pt)) throw runtime_error(&quot;lock is failed.&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ofs &lt;&lt; &quot;fasfas&quot; &lt;&lt; endl;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system(&quot;PAUSE&quot;);</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;}catch(exception&amp; e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; e.what() &lt;&lt; endl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;system(&quot;PAUSE&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</p>
<br />
<br />
<p>【実験】</p>
<p>以下のように実験してみてください。</p>
<p>サンプルでは、ロックを掛けたままPAUSEするようにしています。</p>
<p>ですので、exeを実行したら、もう一回exeを実行してください。</p>
<p>2回目の実行では、すぐにPAUSEされません。</p>
<p>それは、1回目のexe実行のロックを解除されるのを待っているのです。</p>
<p>待っている時間は5秒です。</p>
<p>5秒経ったら勝手に終了します。</p>
<p>そうしたら、何かキーを押して1回目の実行プロンプトを閉じてください。</p>
<br />
<p>そして、ファイル「myfile.txt」を開いてみてください。</p>
<p>2回exeを実行しているので、2行のデータが出力されるはずですが、2回目がロックされて出力できないので</p>
<p>1行しか出力されていません！</p>
<br />
<p>ロックが確認できましたよね！（＾＾）</p>
<br />
<br />
<p>【説明】</p>
<p>まず最初に、予想外の動きをしていたことを書いておきます。</p>
<br />
<p>上のサンプルを見ていただくと分かると思いますが、ファイルロックしているのは書き込みファイル「myfile.txt」ではなく、「_lock_myfile.txt」です。</p>
<p>なぜかというと、理由は分からないのですが、ロックしたファイルを書き込みできなかったからです。</p>
<p>これはバグなのか、Windowsの仕様なのかは分かりません。</p>
<p>ですので、ロック用のファイルを作成して、それをロックしました。</p>
<br />
<p>これでもファイルに同時に書き込まれることがないのは分かるでしょうか？</p>
<p>プログラムがみんな同じファイルをロックできるまで待っているので、</p>
<p>ファイルに書き込むプログラム以外はロック解除されるまで待っているのです。</p>
<p>こういうことも良くやることです。</p>
<br />
<p>さて、ではロックを実施するクラスの説明に移ろうと思います。</p>
<br />
<br />
<p><strong>＜コンストラクタ＞</strong></p>
<p>interprocess::<strong><font color="#0000ff">file_lock</font></strong> flock(&quot;_lock_myfile.txt&quot;);</p>
<br />
<p>クラスを作成します。</p>
<p>コンストラクタはファイルの存在チェックと、ロック機構があるか？をチェックしているようです。</p>
<p>コンストラクタを起動するだけではファイルはロックされません。</p>
<p>注意点としては、ファイル存在チェック、ロック機構存在チェックでエラーになると</p>
<p>interprocess_exception　例外が発生します。</p>
<p>これは、exceptionから派生している例外クラスです。</p>
<br />
<br />
<p><strong>＜ptimeについて＞</strong></p>
<p>これは、時間を扱う汎用的なクラスで、ファイルロックと直接関係の無いクラスです。</p>
<p>POSIXを利用しているようです。簡単に時間の加減算ができます。</p>
<p>すみませんが、ここではあまり深く説明しません。</p>
<br />
<br />
<p><strong>＜timed_lock()関数＞</strong></p>
<p>if(!<strong><font color="#0000ff">flock.timed_lock</font></strong>(pt)) throw runtime_error(&quot;lock is failed.&quot;);</p>
<br />
<p>ロックを掛け、所有権を取得する関数です。 </p>
<p>他の誰かがロックを先に掛けている場合は、ロックが解除されるまで待ちます。</p>
<p>引数に時間を渡すことができ、指定の時刻までにロックが取得できないとロックをあきらめます。</p>
<p>引数の型はptimeです。</p>
<p>返り値は、成功時にtrueとなります。</p>
<p>何かエラーが発生した場合は、interprocess_exceptionが投げられます。</p>
<br />
<br />
<p><strong>＜lock()関数＞</strong></p>
<p>ここでは使用していませんが、もう一つのロックを掛ける関数です。</p>
<p>ただし、他の誰かが先にロックを掛けていた場合、その人がロックをはずすまで待ち続けます。</p>
<p>ちょっとけなげなロックです。</p>
<p>何かエラーが発生した場合は、interprocess_exceptionが投げられます。</p>
<br />
<br />
<p><strong>＜unlock()関数＞</strong></p>
<p>明示的にロックを解除する関数です。</p>
<p>ちなみにクラスが破壊されるときに自動でロック解除されます。</p>
<br />
<br />
<br />
<p>【補足】</p>
<p>このBoostのfile_lockクラスは、POSIXとWindowsの環境で使用できるようです。</p>
<p>2つの間のファイルロックなどのプログラミングの仕方は違うのですが、それらの違いを吸収したのが</p>
<p>file_lockクラスです。</p>
<p>使い方は吸収できましたが、どうも、それぞれの動作機構などまで吸収できなかったようです。</p>
<p>そのため、使用するときは以下のことを守って欲しいようです。</p>
<br />
<p>①１つのプロセスについて、file_lockオブジェクトの使用はファイル１つにつき１つだけにしてください。</p>
<p>②同じスレッドが、ロックしたファイルをロック解除するようにしてください。</p>
<p>③std::fstreamを使用してロックしたファイルに書き込む場合、そのファイルのロックをすべて解放するまで</p>
<p>　ファイルのクローズをしないでください。</p>
<br />
<br />
<p>※<a href="http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock.file_lock_not_thread_safe" target="_blank">この説明</a>
 のTo sum upを和訳しただけですが、英語はさっぱりなので間違っていたらすみません。<img height="16" alt="あせる" src="http://stat.ameba.jp/blog/ucs/img/char/char2/029.gif" width="16" /></p>
<p>正確には英語の説明を参照ください。</p>
<p><br />
</p>
<p><strong>　<font color="#0000ff">この内容が事実とすると、WEB用のログ出力には使用できないことになります。</font></strong></p>
<p><strong><font color="#0000ff">　なぜなら、Apacheなどは１つのプロセスを起動してそこから複数のスレッドを作り、</font></strong></p>
<p><strong><font color="#0000ff">　CGIを実行するからです。</font></strong></p>
<p><font color="#0000ff"><strong>　つまり、①に反することになります。</strong><br />
</font></p>
<br />
<br />
<p>【おまけ】</p>
<p>英語だれか訳してくれるとうれしいなー。</p>
<p>というわけで、いろいろ頑張ってコマ送り的な読み方をすると、</p>
<p>OSによっては、ファイルのある位置からある位置までをロックする、といったことができるようです。</p>
<p>今のバージョン（boost1.35）では実装しませんでしたが、Comming　Soon的なことが書かれているようです。</p>
<p>ほんとかな<img height="16" alt="はてなマーク" src="http://stat.ameba.jp/blog/ucs/img/char/char2/040.gif" width="16" /></p>
<br />
<br />
<p>日本語で説明したサイトや文献が全然なく、この記事の内容は少し不安です。</p>
<p>すみませんが正確な情報はBoostのサイトで取得をお願いします。</p>
<p>もうしわけないです<img height="16" alt="しょぼん" src="http://stat.ameba.jp/blog/ucs/img/char/char2/144.gif" width="16" /></p>
<br />
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font color="#3c559d" size="2">・ログ出力を実装する上での注意点とは？</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10121445374.html"><font color="#3c559d" size="2">・ログ出力クラスを作成するには？</font></a>
<font size="2">&nbsp;</font></p>
<p>・<a href="http://ameblo.jp/nana-2007-july/entry-10118738018.html"><font size="2">boostのfile_lockのコンパイルエラーの回避方法</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10119478045.html">・Boostのfile_lockクラスの和訳メモ</a>
 </p>
<p><a href="http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock" target="_blank">Boostのファイルロックの説明</a>
 </p>
<a href="http://www.boost.org/doc/libs/1_35_0/doc/html/boost/interprocess/file_lock.html"><font color="#3c559d">Boostのfile_lockのリファレンス</font></a>
 <br />
<a href="http://www.atmarkit.co.jp/flinux/rensai/apache16/apache16b.html" target="_blank">Apacheとプロセスについてちょっと書いてある記事</a>
 <br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10118972301.html</link>  
      <pubDate>Tue, 22 Jul 2008 19:45:20 +0900</pubDate> 
    </item>  
    <item> 
      <title>boostのfile_lockのコンパイルエラーの回避方法</title>  
      <description><![CDATA[<p>
 <p>Boostのfile_lockはincludeするとそのままではコンパイルエラーになります。（ver.1.35）</p>
<p>もおー。困った子ねー。</p>
<br />
<p>ということで、回避方法を書いてみようと思います。</p>
<p>ただ、正式なHPなどに書いてあったものを見たわけではなく、いろいろ参考に独自に自分で試した結果なので間違っているかもしれないです。</p>
<p>ご了承ください。</p>
<br />
<br />
<p>対象：</p>
<p>Boostバージョン1.35のfile_lockに関わる箇所のみの修正です。</p>
<br />
<br />
<p>【ファイルの修正方法】</p>
<p>①文字化けの修正</p>
<p>　interprocess/detail/config_begin.hpp<br />
　　⇒20行目　non ・DLL-interfaceの・を削除する</p>
<p>　interprocess/errors.hpp<br />
　　⇒13,14行目　などの・やウの半角のような文字を削除する</p>
<br />
<p><br />
②コードの修正（file_lock.hppだけです）　interprocess/sync/file_lock.hpp</p>
<br />
<p>　●165行目あたり：　同じ関数定義が2度記述されているのでコメントアウトする。</p>
<p>　<strong><font color="#ff0000">/* </font></strong><br />
<font color="#0000ff">bool timed_acquire_file_lock<br />
(file_handle_t hnd, bool &amp;acquired, const boost::posix_time::ptime &amp;abs_time)<br />
{</font></p>
<p><font color="#0000ff">　　・・・中略</font></p>
<br />
<font color="#0000ff">}</font><br />
　　<strong><font color="#ff0000">*/←232行目あたり</font></strong> 
<p><font color="#0000ff">/// @endcond</font></p>
<p>　</p>
<p><br />
　●133,164行目あたり：　以下を追記<br />
　<font color="#0000ff">// relinquish current time slice</font><br />
<strong><font color="#ff0000">#if (defined BOOST_WINDOWS) &amp;&amp; !(defined BOOST_DISABLE_WIN32)</font></strong><br />
<font color="#0000ff">winapi::sched_yield();</font><font color="#0000ff"><br />
<strong><font color="#ff0000">#else<br />
::sleep(0);</font></strong><br />
</font><strong><font color="#ff0000">#endif</font></strong></p>
<br />
<br />
<p>　●271行目あたり：　detail:: を削除する<br />
　<font color="#0000ff">if(!timed_acquire_file_lock(m_file_hnd, result, abs_time)){</font></p>
<br />
<p>　●307行目あたり：　detail:: を削除する<br />
　<font color="#0000ff">if(!timed_acquire_file_lock_sharable(m_file_hnd, result, abs_time)){</font></p>
<p><br />
　●212行目あたり：　detail:: を追記する<br />
　<font color="#0000ff">if(!<strong><font color="#ff0000">detail::</font></strong>try_acquire_file_lock_sharable(hnd, acquired))</font></p>
<p>　</p>
<p>　●150行目あたり：　detail:: を追記する<br />
<font color="#0000ff">　if(!<strong><font color="#ff0000">detail::</font></strong>try_acquire_file_lock_sharable(hnd, acquired))<br />
</font><br />
　●119行目あたり：　detail:: を追記する<br />
<font color="#0000ff">　if(!<strong><font color="#ff0000">detail::</font></strong>try_acquire_file_lock(hnd, acquired))</font><br />
</p>
<br />
<p><br />
</p>
<p>これで動くはずです。たぶん。</p>
<p>記載漏れはないと思うのだけどな。（ちょっと不安）</p>
<p><br />
<br />
<br />
参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118463927.html"><font color="#3c559d" size="2">・ログ出力を実装する上での注意点とは？</font></a>
<font size="2">&nbsp;</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118972301.html"><font color="#3c559d" size="2">・ファイルロックをするには？(boostのfile_lock)</font></a>
<font size="2">&nbsp;</font></p>
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10118738018.html</link>  
      <pubDate>Tue, 22 Jul 2008 19:45:03 +0900</pubDate> 
    </item>  
    <item> 
      <title>ログ出力を実装する上での注意点とは？</title>  
      <description><![CDATA[<p>
 <p>Javaにはログ出力のクラスが標準で存在し、またApacheから別の強力なライブラリも提供されています。</p>
<p>うらやましいですね。</p>
<br />
<p>でも、C++には標準でログ出力クラスのようなものは存在しません。</p>
<br />
<p>それでも昔は、ファイルに書き出すだけなのでそんなに難しくないから自作すればいいじゃない、と高を括ってました。</p>
<p>すみませんでした。今は違います。</p>
<br />
<p>「だれか標準でどの環境でも使用できるログ出力クラスを作ってください！どうかお願いします<img height="16" alt="星空" src="http://stat.ameba.jp/blog/ucs/img/char/char2/122.gif" width="16" />」</p>
<p>と短冊に書いてしまうほどです。（笑）</p>
<br />
<p>ここでは、どんなところが難しいのかを書いてみようと思います。</p>
<br />
<br />
<p>【ログ出力の実装における注意点】</p>
<p><strong><font color="#0000ff">ロックを掛けないとファイルが壊れる</font></strong></p>
<p>　初心者ですとイメージできないかも知れないですね。</p>
<p>　ファイルを2つのスレッドから同時にオープンして、同時に書き込むとファイルが壊れてしまいます。</p>
<p>　「そもそも2つのスレッドから同時にオープンなんてレアケースでしょ！」って思います？</p>
<p>　でも、WEBはこのケースですよ。</p>
<p>　CGIのプログラムを書いているとついついシングルスレッドのように錯覚しますが、</p>
<p>　実際にはApacheなどがいくつもスレッドを立ち上げて、IEなどのクライアントからの要求を同時に</p>
<p>　受け付けます。</p>
<p>　ですので、ログファイルに複数のスレッドから同時にアクセスされることを考慮しないといけません。</p>
<br />
<p><strong>補足：</strong></p>
<p>ちなみにファイルへの同時書き込みでファイルが壊れる現象は、別にログ出力だけに見られるものでは</p>
<p>ありません。</p>
<p>例えばOracleを２つ立ち上げて、１つが落ちてしまったときにもう一つに切り替えて、断時間を少なくするケースでも見られます。</p>
<p>サーバは２つ立ててハードディスクは１つを共有するということができるのですが、</p>
<p>切り替えのプログラムなどがファイルロックをしていないと、タイミングによってはOracle２つから同時に書き込まれて、ファイル（REDOファイル等）が壊れるのは良くあることです。</p>
<p>SEはこの辺は十分勉強してプログラムを作らないといけませんよね。大変ですけど・・・。<img height="16" alt="天使" src="http://stat.ameba.jp/blog/ucs/img/char/char2/157.gif" width="16" /></p>
<br />
<br />
<p><strong><font color="#0000ff">システムでファイルロックを実装していない環境がある</font></strong></p>
<p>　じゃあ、ファイルロックを掛ければいいだけじゃない！と思いますよね？</p>
<p>　それがまた罠があります。</p>
<p>　システムからファイルロックを提供されていない環境があるのです。</p>
<p>　例えばWindows98やMeです。</p>
<p>　Linux系でもあるかもしれないです。</p>
<br />
<br />
<p><strong><font color="#0000ff">ファイルロックがC++標準に存在しない</font></strong></p>
<p>　上の事情が関係していると思うのですが、C++標準ではファイルロック関数やクラスが存在しません。</p>
<p>　つまり、さまざまなコンパイラでコンパイルが通るようにしようと考えた場合、困ってしまいます。</p>
<p>　もう、Windows限定としてしまえば問題は無いかもしれないですが。。</p>
<br />
<br />
<p><strong><font color="#0000ff">ディレクトリ作成を利用したファイルロック</font></strong></p>
<p>　さて、じゃあシステムで用意されない環境ではファイルロックを実現する方法はないのでしょうか？</p>
<p>　逃げ道はなくもありません。</p>
<p>　良くやる手は、ディレクトリ作成における排他機能を利用するのです。</p>
<p>　ディレクトリを作成することはおそらくどのOSでもでき、C標準ではないですがmkdir()という関数もあります。</p>
<p>　しかも、同じ名前のディレクトリを作成しようとするとエラーになったことを教えてくれます。</p>
<p>　これを利用します。</p>
<p>　</p>
<p>　bool lockfile(const string&amp; filename){</p>
<p>　　string lock(&quot;_&quot;);</p>
<p>　　lock += filename;</p>
<p>　　if(<font color="#0000ff"><strong>mkdir</strong></font>(lock.c_str())) return false;</p>
<p>　　return true;</p>
<p>　}</p>
<br />
<p>　こんな感じです。</p>
<p>　ロックを解除するときは、ディレクトリを削除すればよいですよね。（＾＾）</p>
<br />
<p>　ディレクトリを作成する分、遅くなります。</p>
<p>　が、最近のHDDは速いし、これで十分でしょ、って思います。</p>
<p>　ロックに関してはシステムによるファイルロックとスピード以外には遜色ないかも知れません。</p>
<br />
<p>　</p>
<p><strong><font color="#0000ff">ロックに失敗したとき</font></strong></p>
<p>　でも、問題はそう単純ではないのです。</p>
<p>　ログ出力以外ではロックに失敗した場合、「他の人が編集してます」というエラーを出してプログラムを</p>
<p>　終了しても良いかも知れません。</p>
<p>　しかしログ出力の場合、ロックが解除されるのを待って書き込まないといけません。</p>
<p>　このままでは、他のスレッドが先にファイルをロックしていたときに、ロック解除するまで</p>
<p>　待ってくれないのです。</p>
<p>　普通は、一定時間sleepしてもう一度ロックに挑戦して、書き込みをします。</p>
<p>　3回くらい失敗したらもうあきらめてエラー処理に移したりします。</p>
<br />
<p>　でも、sleepさせる関数がC標準には存在しません。</p>
<p>　もしforループで何百万回とかまわせば少しは時間を稼げ、その間に他のスレッドの処理が終わり、</p>
<p>　ロックが解除される可能性はあります。</p>
<p>　しかしこの方法は異常に負荷が上がってしまう可能性があるのです。</p>
<p>　</p>
<p>　</p>
<br />
<p>こんな風にログ出力の機能というのは、いろいろな問題が絡んでいて泣きそうです。</p>
<p>環境に合わせて作っていくしかないのでしょうね。きっと。</p>
<br />
<p>助け舟としては、Boostが提供してくれる<strong>file_lock.hpp</strong>があります。</p>
<p>今日調べて実験した限りでは、ロック解除待ちもしてくれるようです。</p>
<p>ただし、Boostの古いバージョンでは存在しません。バージョン1.35(現最新)以降を参照してみてください。</p>
<br />
<p>　<font color="#0000ff">08.07.23追記：</font>　</p>
<p>　Boostのfile_lockは、WEBなどのマルチスレッドでのログ出力には向かなそうです。</p>
<p>　詳しくは、下の参考の「ファイルをロックするには？」を読んでみてください。<br />
<br />
</p>
<p>とりあえずここでは、<strong><font color="#ff0000">「難しい問題」</font></strong>ということが分かってもらえるとうれしいです！</p>
<p><br />
<br />
</p>
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10118972301.html"><font color="#3c559d" size="2">・ファイルロックをするには？(boostのfile_lock)</font></a>
 </p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10121445374.html">・ログ出力クラスを作成するには？</a>
 <font size="2"><br />
</font></p>
<p><a href="http://www.boost.org/doc/libs/1_35_0/doc/html/boost/interprocess/file_lock.html">Boostのfile_lockのリファレンス</a>
 </p>
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10118463927.html</link>  
      <pubDate>Mon, 21 Jul 2008 09:57:52 +0900</pubDate> 
    </item>  
    <item> 
      <title>SQLインジェクションとは？</title>  
      <description><![CDATA[<p>
 <p>セキュリティ関連でよく言われますよね。</p>
<p>でも、インジェクションの脆弱性はSQLだけではないのです。</p>
<br />
<p>まず、インジェクションという言葉の意味ですが、「注入」と言う意味です。</p>
<br />
<p><strong><font color="#0000ff">何を注入するかと言うと、「悪意」です（笑）</font></strong></p>
<br />
<p>はい。</p>
<p><strong><font color="#ff0000">簡単に言うと、プログラム上に不備があり、注入された悪意をはじけないとセキュリティホールになります。</font></strong></p>
<br />
<p>以下、具体的に見ていきましょう。</p>
<br />
<br />
<p><strong>【SQLインジェクション】</strong></p>
<p>例えば、ログインのIDとパスワードを認証することを考えます。</p>
<p>ユーザが入力したIDとパスワードを受け取ったところから考えてみましょう。</p>
<p>DBにSQL文でそのIDとパスワードが存在するかチェックに行きますよね？</p>
<br />
<p>＜入力＞</p>
<p>ID：　nana</p>
<p>PW：　july</p>
<br />
<p>＜SQL＞</p>
<p>ostringstream sql;</p>
<p>sql &lt;&lt; &quot;select id, pw from user where id='&quot; &lt;&lt; ID &lt;&lt; &quot;' and pw='&quot; &lt;&lt; PW  &lt;&lt; &quot;'&quot;;</p>
<br />
<p><strong><font color="#0000ff">このプログラム、問題あるでしょうか？</font></strong></p>
<br />
<p>おおありです！<img height="16" alt="とかげ" src="http://stat.ameba.jp/blog/ucs/img/char/char2/001.gif" width="16" /></p>
<p>ユーザがPWに「' or 0=0」と入力したらどうなるでしょう？</p>
<p>上のプログラムで作成されるSQL文は以下のようになります。</p>
<br />
<p>select id, pw from user where id='nana' and pw='' or <strong><font color="#ff0000">0=0</font></strong></p>
<br />
<p>赤字がキーポイントです。</p>
<p>意味は、idフィールドが&quot;nana&quot;でpwフィールドが空文字の場合、</p>
<p>もしくは0が0と等しい場合、のレコードを返しなさい、となります。</p>
<br />
<p>当然ながら0と0はいつでも等しいので、全レコードを返すことになります。</p>
<br />
<p>これが先ほど言った<strong><font color="#0000ff">「悪意」</font></strong>です。</p>
<br />
<br />
<p>解決策は、プレースホルダを使用するか、自分でSQLエスケープをすることです。</p>
<p>Javaの場合、JDBCのようなものがDB間の違いを吸収してくれます。</p>
<p>でもC++の場合、そのようなものは無いのでDBの提供するライブラリによって、プレースホルダがあったりなかったりします。</p>
<p>基本的には自分でSQLエスケープすることになるかと思います。</p>
<br />
<p>あとで、漏補で補足事項を書こうと思います。</p>
<br />
<br />
<p><strong>【OSコマンドインジェクション】</strong></p>
<p>これは、system（）関数にユーザが入力した値を使用する場合などにおきます。</p>
<p>良くある例では、sendmail を引き合いに出します。</p>
<p><a href="http://www.thinkit.co.jp/cert/tech/7/5/4.htm">http://www.thinkit.co.jp/cert/tech/7/5/4.htm</a>
</p>
<br />
<p>ここでは、ファイルをダウンロードさせる例を考えてみましょう。</p>
<p>WEBでユーザがファイル名のリンクを押すと、filename=sample.txt　などの引数が送信され、</p>
<p>そのファイルをダウンロードすることを考えます。</p>
<br />
<p>string file=&quot;sample.txt&quot;; 　←ユーザ入力した値</p>
<p>ifstream(file.c_str());</p>
<br />
<p><strong><font color="#0000ff">このプログラム、問題あるでしょうか？</font></strong></p>
<p> </p>
<p>おおありです！<img height="16" alt="台風" src="http://stat.ameba.jp/blog/ucs/img/char/char2/162.gif" width="16" /></p>
<br />
<p>引数の値はユーザ側で改ざんして送信することができます。</p>
<p>改ざんした値が、../../../passwd.txtなどだったらどうでしょうか？</p>
<p>もしパスワードファイルがあればダウンロードできてしまします。</p>
<p>もちろんファイルのパスが分かっていることが前提となりますが、WEBサーバのOSと使用しているWEBサーバが分かるとたいていどこに何があるか分かってしまいます。</p>
<p>なので、とても危険なのです。</p>
<br />
<p>ピリオドやスラッシュ（/）、\を入力したらエラーではじくようにしましょう！</p>
<p> </p>
<p> </p>
<p>他にもセキュリティに関する注意点はいくつもあります。</p>
<p>十分調べてプログラム設計しておきましょう！</p>
<p> </p>
<br />
<br />
<p>【<a href="http://ameblo.jp/nana-2007-july/entry-10036009862.html"><font color="#3c559d">漏補</font></a>
 】</p>
<p>漏：</p>
<p>SQLのプレースホルダについてです。</p>
<p>プレースホルダを使用するとシングルクォートなどをエスケープしてくれて、インジェクションの攻撃から守ってくれます。</p>
<p>ただ、like　を使用する場合、難があります。</p>
<p>具体的にSQLを書いてみましょう。memoというフィールドが入力した単語を含むレコードを検索します。</p>
<br />
<p>select * from t_contents where memo like ?</p>
<br />
<p>では、%が無いのでだめです。　（?はプレースホルダです。）</p>
<p>例えば、ナナという文字を入力した場合上記のSQL文は以下のようになります。</p>
<br />
<p>select * from t_contents where memo like 'nana'</p>
<br />
<p>フィールドがnanaと完全一致するレコードしかひっかかりませんよね？</p>
<br />
<br />
<p>補：</p>
<p>これにはテクニックがあるのですが、結局自分でエスケープしないといけません。</p>
<p>以下のようにします。</p>
<br />
<p>select * from t_contents where memo like '%' || ? || '%'</p>
<br />
<p>意味、分かるでしょうか？</p>
<p>リプレース後のSQL文は以下のようになります。</p>
<br />
<p> select * from t_contents where memo like '%' || 'nana' || '%'</p>
<br />
<p>||は文字列連結なので、SQLの中で　like '%nana%' としているのと同じです。</p>
<p>これなら分かりますよね？</p>
<br />
<p>でもこれでは不十分です。</p>
<br />
<p>例えば「100%ジュース」という単語を含むレコードを探したい場合どうなるでしょうか？</p>
<p>上記と同じくリプレース後のSQLのlikeの部分だけ抜き出してみると、以下のようになります。</p>
<br />
<p>　like '%100%ジュース%'</p>
<br />
<p>これだと、100 とジュースが含まれるレコードが抽出されてしまいます。</p>
<p>なので、%と_をエスケープする必要があります。</p>
<p>(likeではこの２つが特殊文字です)</p>
<br />
<p>プレースホルダに代入する前にlikeエスケープをして、それから上記の　like '%' || ? || || '%' に代入しましょう。</p>
<br />
<br />
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10117588039.html</link>  
      <pubDate>Fri, 18 Jul 2008 19:31:58 +0900</pubDate> 
    </item>  
    <item> 
      <title>Viewとは？</title>  
      <description><![CDATA[<p>
 <p>WEBやGUIアプリなどでよく言われる、MVCのうちのVを表すものです。</p>
<p>MVCそれぞれの意味は、以下のようになると思います。</p>
<br />
<p>M・・・モデル。　簡単にいうとデータです。</p>
<p>V・・・ビュー。　簡単にいうと見た目です。WEBで言うとHTMLといったところです。</p>
<p>C・・・コントローラー。　簡単に言うと、モデルを生成・処理したり、ビューに渡したりする全体の面倒見役です。</p>
<br />
<br />
<p>WEBではよくMVCと言われますが、普通のGUIのアプリでも良く使われる単語です。</p>
<p>WEBの専売特許というわけではありません。</p>
<br />
<br />
<p>さて、件のビューです。</p>
<br />
<p>WEBの話をしますと、</p>
<p>Javaでは、JSP、JSTLなどスタンダードなものがあります。</p>
<p>しかし、C++ではあまりスタンダードなものは無いと思います。</p>
<p>おそらく各自で独自に作成しているのではないでしょうか。</p>
<br />
<br />
<p>これだけだと記事として寂しいので、ちょっとGoogleで見つかったライブラリを紹介しておきます。</p>
<br />
<br />
<p>●<a href="http://code.google.com/p/google-ctemplate/" target="_blank">Google Ctemplate</a>
 </p>
<p>グーグルさんが公開しているライブラリです。</p>
<p>{{NAME}}で表された文字列を置換するようです。</p>
<p>このあたりが参考になるかもしれません。</p>
<p>　<a href="http://kdl.weblogs.jp/open/2008/07/google-ctemplat.html">http://kdl.weblogs.jp/open/2008/07/google-ctemplat.html</a>
 </p>
<p>　<a href="http://www.argv.org/~chome/ctemplate.html">http://www.argv.org/~chome/ctemplate.html</a>
 </p>
<br />
<br />
<p>●<a href="http://labs.preferred.jp/azarac/">Azarac</a>
 </p>
<p>ある会社さんが公開しているライブラリです。</p>
<p>JSPに近い動作のようです。</p>
<p>JSPの場合、初めてアクセスのあったJSPファイルは、Java言語のソースファイルに変換され、</p>
<p>そのソースファイルをコンパイルします。そして、コンパイルされた実行ファイルを実行する感じです。</p>
<p>ですので、1番最初のアクセスは遅いのですが、そのあとは実行ファイルが起動するだけなので</p>
<p>速くなります。</p>
<p>しかも、普通にJavaでコンパイルされたものを実行するので文字列を置換するより速くなります。</p>
<br />
<p>このAzaracも同じような動きをするようです。</p>
<p>詳しくはリンクを読んでみてください。</p>
<br />
<br />
<br />
<p>ちなみにC++勉強のためにこのブログでも作成しています。</p>
<p>よければ見て、遊んでみてください。</p>
　　<a href="http://ameblo.jp/nana-2007-july/entry-10112570031.html">WEBデザイン（View）の拡張サンプル</a>
 <br />
<br />
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10116603938.html"><font color="#3c559d" size="2">・補足：WEBデザイン（View）の拡張サンプル</font></a>
 <font size="2"><br />
</font></p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10039540927.html"><font color="#3c559d" size="2">・MVCを実現するには？</font></a>
 <font size="2"><br />
</font></p>
<br />
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10116615494.html</link>  
      <pubDate>Tue, 15 Jul 2008 21:32:39 +0900</pubDate> 
    </item>  
    <item> 
      <title>補足：WEBのデザイン（View）の拡張サンプル</title>  
      <description><![CDATA[<p>
 <p>前回の記事<a href="http://ameblo.jp/nana-2007-july/entry-10112570031.html"><font color="#3c559d" size="2">・WEBデザイン（View）の拡張サンプル</font></a>
 <font size="2">では、デザインとロジックを分ける例を見てみました。</font></p>
<p><font size="2">実際に作業効率を考える場合、これでは半分を埋めたにすぎません。</font></p>
<p><font size="2">デザインとロジックを分ける理由は、主に以下のものになると思います。</font></p>
<p><font size="2">　①保守性を上げる　（コンパイルなしにデザインを変更できる）</font></p>
<p><font size="2">　②デザイナーとプログラマーが同時に開発作業ができる</font></p>
<p><font size="2"><br />
</font></p>
<p><font size="2">前回の記事では①は満たしているけど、②は満たすとは限りません。</font></p>
<p><font size="2">その理由と解決方法を</font><font size="2">以下で見てみます。</font></p>
<p><font size="2"><br />
</font></p>
<p><strong><br />
</strong></p>
<p><strong>【デバッグツールについての補足】</strong></p>
<p>デバッグツールは、<br />
デザインファイルとデータファイルから出力ファイルを作成するツールです。<br />
DesignStyleを使用するとデザイン(view)とロジックを分離できます。<br />
しかし、DesignStyle::output() に代入するデータ(DesignData)は、<br />
ロジック内で作成することになります。<br />
つまり、ロジック部分が作成されコンパイルされないうちはデザインファイルの記述に間違いが無いかを確かめられず、<strong><font color="#ff0000">デザイナーはプログラマが開発を終えるのを待たないといけません</font></strong>。<br />
デバッグツールは、そんな問題を解決します。</p>
<br />
<p>debugtool.exe [引数1] [引数2] [引数3]</p>
<br />
<p>[引数1] ...データファイルパス。デフォルトdata.txt<br />
[引数2] ...スタイルファイルパス。デフォルトstyle.txt<br />
[引数3] ...結果出力ファイルパス。デフォルトout.txt</p>
<p><br />
※このファイルと同じディレクトリにexeファイルをコピーすればお試しできます。<br />
　（デフォルト値が働くので引数なしでとりあえず動作するはずです。）</p>
<br />
<p><br />
【ツールの仕様】<br />
データファイルからデザインデータ(DesignData)を作成します。<br />
次にスタイルファイルを読み込み、作成したデータでoutput()を呼びます。<br />
結果は、結果出力ファイルに出力します。</p>
<br />
<p><br />
【データファイルの仕様】<br />
使用できるタグとその意味。<br />
サンプルdata.txtを参照してください。</p>
<p>・data データ(DesignDataSub&lt;string&gt;)を表します。<br />
　　　　属性：name・・・データ名を指定します。<br />
　　　　属性：value・・・データを指定します。</p>
<p>・vec 配列（DesignDataVector）を表します。配列の要素は、配下にeleタグをおいて指定します。<br />
　　　　属性：name・・・データ名を指定します。</p>
<p>・ele 配列の配下の要素を表します。このタグの配下には、data, vec, mapなどを指定できます。<br />
　　　　<br />
・map マップ(DesignDataMap)を表します。配下には、data, vec, mapなどを指定できます。</p>
<br />
<p><br />
</p>
<p>【デバッグ用のデータファイルのサンプル】</p>
<p>&lt;data name=&quot;animal&quot; value=&quot;dog&quot;/&gt;<br />
&lt;data name=&quot;remarks&quot; value=&quot;備考です。</p>
<p>何か？&quot;/&gt;<br />
&lt;vec name=&quot;mails&quot;&gt;<br />
　&lt;ele&gt;<br />
　　&lt;data name=&quot;subject&quot; value=&quot;お疲れ様です&quot;/&gt;<br />
　　&lt;data name=&quot;addres&quot; value=&quot;<a href="mailto:nana@ne.jp%22/">nana@ne.jp&quot;/</a>
 &gt;<br />
　&lt;/ele&gt;<br />
　&lt;ele&gt;<br />
　　&lt;data name=&quot;subject&quot; value=&quot;お疲れ様です２&quot;/&gt;<br />
　　&lt;data name=&quot;addres&quot; value=&quot;<a href="mailto:nana@ne.jp%22/">nana@ne.jp&quot;/</a>
 &gt;<br />
　&lt;/ele&gt;<br />
　&lt;ele&gt;<br />
　　&lt;data name=&quot;subject&quot; value=&quot;お疲れ様です３&quot;/&gt;<br />
　　&lt;data name=&quot;addres&quot; value=&quot;<a href="mailto:nana@ne.jp%22/">nana@ne.jp&quot;/</a>
 &gt;<br />
　&lt;/ele&gt;<br />
　&lt;ele&gt;<br />
　　&lt;data name=&quot;subject&quot; value=&quot;お疲れ様です４&quot;/&gt;<br />
　　&lt;data name=&quot;addres&quot; value=&quot;<a href="mailto:nana@ne.jp%22/">nana@ne.jp&quot;/</a>
 &gt;<br />
　　&lt;map name=&quot;m&quot;&gt;<br />
　　　&lt;data name=&quot;bb&quot; value=&quot;ほほー&quot;/&gt;<br />
　　&lt;/map&gt;<br />
　&lt;/ele&gt;<br />
&lt;/vec&gt;<br />
</p>
<br />
<br />
<p>【スタイルファイルのサンプル】</p>
<p>&lt;html&gt;</p>
<br />
<p>&lt;table border=&quot;1&quot;&gt;<br />
<font color="#0000ff">&lt;nana:for-each select=&quot;mails&quot; cnt-var=&quot;$i&quot;&gt;</font><br />
　<font color="#0000ff">&lt;nana:set name=&quot;$mod&quot; select=&quot;$i&quot; format=&quot;mod(2)&quot;/&gt;</font><br />
<br />
　&lt;tr&gt;<br />
　　&lt;td bgcolor=&quot;<font color="#0000ff">&lt;nana:if select=&quot;$mod&quot; cmp=&quot;eq&quot; value=&quot;0&quot;&gt;</font>red<font color="#0000ff">&lt;/nana:if&gt;&lt;nana:if select=&quot;$mod&quot; cmp=&quot;eq&quot; value=&quot;1&quot;&gt;</font>blue<font color="#0000ff">&lt;/nana:if&gt;</font>&quot; &gt;<br />
　　<font color="#0000ff">&lt;nana:value-of select=&quot;$i&quot; /&gt;</font>&lt;/td&gt;<br />
　　&lt;td&gt;<font color="#0000ff">&lt;nana:value-of select=&quot;/remarks&quot; escape=&quot;html&quot;/&gt;</font>&lt;/td&gt;<br />
　　&lt;td&gt;<font color="#0000ff">&lt;nana:value-of select=&quot;address&quot;/&gt;</font>&lt;/td&gt;<br />
　　&lt;td&gt;<font color="#0000ff">&lt;nana:value-of select=&quot;subject&quot;/&gt;</font>&lt;/td&gt;<br />
　&lt;/tr&gt;<br />
<font color="#0000ff">&lt;/nana:for-each&gt;</font><br />
&lt;/table&gt;</p>
<br />
<p><font color="#0000ff">&lt;nana:value-of select=&quot;/mails[3]/m/bb&quot; /&gt;</font> </p>
<p>&lt;/html&gt;</p>
<br />
<br />
<p>【サンプルの出力結果例】<br />
<br />
&lt;html&gt;</p>
<p>&lt;table border=&quot;1&quot;&gt;</p>
<p><br />
&lt;tr&gt;<br />
　&lt;td bgcolor=&quot;red&quot; &gt;<br />
　0&lt;/td&gt;<br />
　&lt;td&gt;備考です。&lt;br/&gt;何か？&lt;/td&gt;<br />
　&lt;td&gt;&lt;/td&gt;<br />
　&lt;td&gt;お疲れ様です&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
　&lt;td bgcolor=&quot;blue&quot; &gt;<br />
　1&lt;/td&gt;<br />
　&lt;td&gt;備考です。&lt;br/&gt;何か？&lt;/td&gt;<br />
　&lt;td&gt;&lt;/td&gt;<br />
　&lt;td&gt;お疲れ様です２&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
　&lt;td bgcolor=&quot;red&quot; &gt;<br />
　2&lt;/td&gt;<br />
　&lt;td&gt;備考です。&lt;br/&gt;何か？&lt;/td&gt;<br />
　&lt;td&gt;&lt;/td&gt;<br />
　&lt;td&gt;お疲れ様です３&lt;/td&gt;<br />
&lt;/tr&gt; <br />
&lt;tr&gt;<br />
　&lt;td bgcolor=&quot;blue&quot; &gt;<br />
　3&lt;/td&gt;<br />
　&lt;td&gt;備考です。&lt;br/&gt;何か？&lt;/td&gt;<br />
　&lt;td&gt;&lt;/td&gt;<br />
　&lt;td&gt;お疲れ様です４&lt;/td&gt;<br />
&lt;/tr&gt;</p>
<p>&lt;/table&gt;</p>
<br />
<p>ほほー </p>
<p>&lt;/html&gt;</p>
<p><br />
</p>
<br />
<p>詳しくは、実際にプログラムを動かしてみてください。</p>
<br />
<br />
<br />
<br />
<p><strong><font color="#ff0000">そう。</font></strong></p>
<p><strong><font color="#ff0000">大きな開発時には、こういうツールを作るところまで気を配って開発をした方がいいと思います！</font></strong></p>
<br />
<br />
<p>参考：</p>
<p><a href="http://ameblo.jp/nana-2007-july/entry-10112570031.html"><font color="#3c559d" size="2">・WEBデザイン（View）の拡張サンプル</font></a>
 </p>
<a href="http://ameblo.jp/nana-2007-july/entry-10116615494.html"><font color="#3c559d" size="2">・Viewとは？</font></a>
 <font size="2"><br />
</font><br />
<br />
<br />
 
</p>]]></description>  
      <link>http://ameblo.jp/nana-2007-july/entry-10116603938.html</link>  
      <pubDate>Tue, 15 Jul 2008 21:15:22 +0900</pubDate> 
    </item> 
  </channel> 
</rss>

