<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ScriptBrowserK 作者のブログ</title>
    <link>http://koz.scriptbrowserk.com/</link>
    <description>ScriptBrowserK 作者のブログ</description>
    <language>ja</language>
    <copyright>&#169;Akiyoshi Kozuka</copyright>
    <category>Weblog</category>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>http://www.scriptbrowserk.com/images/SbkBanner180.png</url>
      <title>ScriptBrowserK 作者のブログ</title>
      <link>http://koz.scriptbrowserk.com/</link>
    </image>
    <item>
 <title>GALAXY S(SC-02B)に Xi の SIM カードを差してみた</title>
 <link>http://koz.scriptbrowserk.com/smartphone/XiGalaxyS.html</link>
<description><![CDATA[<div class="section"> 
          <h3>GALAXY S (SC-02B)に Xi の SIM カードを差したときの設定</h3>
          <div class="section2">
            <p>GALAXY S(SC-02B)に、Xi の SIM カードを差してみた。</p>
            <p>普段は L-09C を使用しているのだが、以下の設定を行えば、データ通信専用端末として動作することを確認。</p>
            <p>［設定］→［無線とネットワーク］→［モバイルネットワーク］→［アクセスポイント名］［メニューボタン］［新規APN］で下記内容を設定する。</p>
            <ul class="ulList">
              <li>APN         : mopera.net</li>
              <li>                ユーザー名	: mopera のユーザーID</li>
              <li>                パスワード	: mopera のパスワード</li>
            </ul>
            <p>備忘録としてメモ。</p>
          </div>
        </div>]]></description>
 <category>スマートフォン</category>
 <pubDate>Fri, 30 Sep 2011 15:18:01 +0900</pubDate>
</item><item>
 <title>Delphi で *.obj ファイルをリンクすると E2065 が表示される場合の対処方法</title>
 <link>http://koz.scriptbrowserk.com/Delphi/DelphiE2065.html</link>
<description><![CDATA[
        <div class="section"> 
          <h3>結論</h3>
          <div class="section">
            <p>Delphi で、複数の *.obj ファイルをリンクしたときに E2065 が表示される場合は、シンボルを external 宣言すれば OK。</p>
            <p>obj ファイルの並び順によってエラーが発生したりしなかったりする。 原因は不明。</p>
          </div>
          <h3>例</h3>
          <div class="section">
            <p>Delphi で、下記のように *.obj ファイルをリンクした場合に、</p>
            <div class="proglist">
              <pre class="code">{$L test1.obj}<br />{$L test2.obj}</pre>
            </div>
            <p>『E2065: forward または external 宣言された 'function1' が見つかりません 』と表示された場合は、下の行を追加する。</p>
            <div class="proglist">
              <pre class="code">
<span class="CDKeyword">procedure</span> function1; <span class="CDKeyword">external</span>;</pre>
            </div>
          </div>
        </div>
        ]]></description>
 <category>Delphi</category>
 <pubDate>Tue, 2 Aug 2011 15:58:00 +0900</pubDate>
</item><item>
 <title>Nucleus Ver 3.64 + NP_CustomURL で複数ブログ運用時の注意点</title>
 <link>http://koz.scriptbrowserk.com/nucleus/Nucleus364Tips.html</link>
<description><![CDATA[        <div class="section"> 
          <p>私は Nucleus で複数のブログを別々のパスで運用しています。</p>
          <p>今回 Nucleus Ver 3.41 から Ver 3.64 にバージョンアップしてみたら、NP_CustomURL が上手く動作しなくなりました。</p>
          <p>調べてみると、globalfunctions.php 内の selectBlog 関数の中で $blogid 変数のチェックが追加になったのが原因でした。<br />
            トレースすると selectBlog を呼び出す時点で blogid が設定されているために blogid が更新されません。</p>
          <div class="proglist">
            <pre class="code">
<span class="CDphp"><span class="CDComment">  // Ver 3.41 の selectBlog 関数</span>
  $blogid = getBlogIDFromName($shortname);</span></pre>
          </div>
          <div class="proglist">
            <pre class="code">
<span class="CDphp"><span class="CDComment">  // Ver 3.64 の selectBlog 関数</span>
  <span class="CDKeyword">if</span> (!$blogid) {
    $blogid = getBlogIDFromName($shortname);
  }</span></pre>
          </div>
          これを回避するには、index.php 内で selectBlog 関数を呼び出す前に $blogid 変数をクリアすれば良いようです。
          <div class="proglist">
            <pre class="code">
<span class="CDphp"><span class="CDtag-delimiter">&lt;?php</span>
<span class="CDComment">// index.php</span>
$CONF = <span class="CDKeyword">array</span>();
$CONF[<span class="CDString">'Self'</span>] = <span class="CDString">''</span>;
<span class="CDKeyword">include</span>(<span class="CDString">'config.php'</span>);  <span class="CDComment">// config.php へのパス</span>
$blogid = NULL;         <span class="CDComment">// 追加</span>
selectBlog(<span class="CDString">'blogname'</span>);
selector();
<span class="CDtag-delimiter">?&gt;</span></span>
</pre>
          </div>
        ほかの人の参考になるかも知れないので一応メモ。</div>
        ]]></description>
 <category>Nucleus</category>
 <pubDate>Wed, 27 Jul 2011 20:54:32 +0900</pubDate>
</item><item>
 <title>GMail の受信ボックスの古いメールを削除するには</title>
 <link>http://koz.scriptbrowserk.com/etc/gmaildelold.html</link>
<description><![CDATA[      <p>GMail の受信ボックス内の古いメールを削除するには下記の手順を実行します。</p>
      <p>受信ボックス外に移動したメールは削除されないので、不要なメールを削除するのに便利です。</p>
      <ol>
        <li>in:inbox before:2011/3/1 で検索。日付は毎回修正する。</li>
        <li>          メール一覧のヘッダ部分のチェックボックスで「すべて」を選択。</li>
        <li>          表示されているメールが全て選択される。<br />
          さらに、メール一覧の上部に下記メッセージが表示される。<br />
          『このページ内のスレッド 20 件すべてが選択されています。 ［この検索条件に一致するすべてのスレッドを選択］』</li>
        <li>［この検索条件に一致するすべてのスレッドを選択］をクリック。</li>
        <li>          「この検索結果のすべてのスレッドが選択されています。 選択を解除」と表示される。</li>
        <li>          「削除」を実行する。 </li>
      </ol>
]]></description>
 <category>一般</category>
 <pubDate>Wed, 30 Mar 2011 10:06:21 +0900</pubDate>
</item><item>
 <title>Office 2010 のデフォルトの暗号化アルゴリズム（暗号化強度）</title>
 <link>http://koz.scriptbrowserk.com/etc/office2010Enc.html</link>
<description><![CDATA[      <p>情報を探すのに結構手間取ったので、メモ的に保存。</p>
      <h5>Office 2010 のデフォルトの暗号化アルゴリズム（暗号化強度）</h5>
      <div class="section2">
        <p>        AES 128, SHA1, CBC</p>
      </div>
      <h5>情報元：</h5>
      <div class="section2">
        <p>「<a href="http://technet.microsoft.com/ja-jp/library/cc179125.aspx" target="_blank">Office 2010 の暗号化の設定を計画する</a>」　（http://technet.microsoft.com/ja-jp/library/cc179125.aspx）</p>
        <p>以下、引用です。<br />
          「Office 2010 では、暗号化の実行に関する設定を変更できますが、Open XML 形式ファイル (.docx, .xslx, .pptx など) を暗号化する場合、既定の設定 — AES (Advanced Encryption Standard)、128 ビットのキーの長さ、SHA1、および CBC (暗号ブロック チェーン ) — によって強い暗号化が提供されるので、ほとんどの組織にはこの設定が最適です。」</p>
      </div>
]]></description>
 <category>一般</category>
 <pubDate>Tue, 29 Mar 2011 18:22:30 +0900</pubDate>
</item><item>
 <title>「Java言語で学ぶデザインパターン入門マルチスレッド編」を Delphi に移植してみた</title>
 <link>http://koz.scriptbrowserk.com/Delphi/ThreadPattern.html</link>
<description><![CDATA[    <h3>１．概要</h3>
    <div class="booksC">
      <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=kozdonsplace-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4797331623&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="No" marginwidth="0" marginheight="0" frameborder="0"></iframe>
    </div>
    左の「Java言語で学ぶデザインパターン入門マルチスレッド編（結城浩著）」（著者のHP）で紹介されている
      デザインパターンを Delphi 2010 に移植してみました。
    <p>非常に分かりやすい本なので、マルチスレッドを使う初心者・中級者にお勧めです。</p>
    <p>今回は、TSyncObjBase というクラスに Java のスレッド排他制御をエミュレートするためのメソッドを Delphi で実装しました。そのクラスを継承すると Java のソースを少し修正するだけで動作するので移植が楽です。</p>
    <p class="clearboth">●TSyncObjBase に実装したメソッド</p>
    <ul class="ulList">
      <li> Notify</li>
      <li> NotifyAll</li>
      <li> Wait</li>
      <li>EnterSyncronize （synchronized メソッドのエミュレート用）</li>
      <li>        ExitSyncronize （synchronized メソッドのエミュレート用）<br />
        <span class="stitle">（補足）</span>Java で synchronized なメソッドを移植する場合に、メソッドの先頭と末尾で EnterSyncronize と ExitSyncronize を呼び出します。</li>
    </ul>
    <p>Delphi 2010 以外のバージョンでは、TQueue を TList で置き換えるなどの修正を行えば動作すると思います。</p>
    <p>排他制御に Mutex を使用していますが、critical section（こちらの方が速い）に置き換えても実装できると思います。</p>
    <p>今回は、Guarded Suspension と Worker Thread の２つのデザインパターンを移植しました。TSyncObjBase を使用すれば、多分他のデザインパターンも簡単に移植できると思います。</p>
    <p>改善点やバグなどがあれば、指摘して頂けると嬉しいです。</p>
    <table class="hc">
      <tr>
        <td><img src="../images/hcThreadPattern.png" alt="ライブタスクバープレビュー" width="398" height="306" /></td>
        </tr>
      <tr>
        <td class="HcTitle"><span class="ulList">スクリーンショット</span></td>
        </tr>
    </table>
    <h3>２．著作権・ライセンスについて</h3>
    <p>      書籍の Java ソースの著作権は結城氏にあります。</p>
    <p>Delphi のソースのライセンスですが、書籍の Java ソースを移植した部分は、zlib/libpng License です。私がゼロから実装した部分については自由に使って頂いてかまいません。但し、無保証です。</p>
    <p>      詳細は、各 unit 毎の先頭部分のコメントを参照してください。</p>
    <h3>３．ダウンロード</h3>
    <p>全ソースと実行ファイル：<a href="http://www.scriptbrowserk.com/dl/ThreadPatterm.zip">ThreadPattern.zip</a> （396KB）</p>
    <h3>４．ソースコード（抜粋）</h3>
    <p>下記にソースのポイントとなる部分を紹介します。</p>
    <h4>TSyncObjBase のソース</h4>
    <div class="proglist">
<pre class="code">
<span class="CDKeyword">const</span>
  ciWaitIntervalMSec = 100; <span class="CDComment">// 待機時に Terminated をチェックする間隔</span>

<span class="CDKeyword">type</span>
  <span class="CDComment">// EnterSyncronize, Wait メソッド内での Terminate による中断時に発生する例外</span>
  <span class="CDComment">// （Terminate は Java の interrupt に相当）</span>
  EInterrupt = <span class="CDKeyword">class</span>(Exception);

  <span class="CDComment">// EnterSyncronize, Wait メソッド内での待機中にエラーが発生した場合の例外</span>
  EWaitFor = <span class="CDKeyword">class</span>(Exception);

  <span class="CDComment">// synchronized でないメソッドで wait, notify, notifyAll を呼び出した場合の例外</span>
  EIllegalMonitorState = <span class="CDKeyword">class</span>(Exception);

  <span class="CDComment">// Java のスレッドの排他制御をエミュレートするためのオブジェクト</span>
  TSyncObjBase = <span class="CDKeyword">class</span>(TObject)
  strict <span class="CDKeyword">private</span>
    FtlstWaitThread : TThreadList;
    FMutexLock      : TMutex;

    <span class="CDKeyword">class</span> <span class="CDKeyword">threadvar</span> FiLockCount : integer;
  <span class="CDKeyword">private</span>
  <span class="CDKeyword">public</span>
    <span class="CDComment">// 下の２つは Java の synchronized メソッドをエミュレートするためのルーチン</span>
    <span class="CDComment">// メソッドの先頭と末尾で EnterSyncronize と ExitSyncronize を呼び出します。</span>
    <span class="CDKeyword">procedure</span> EnterSyncronize;  <span class="CDComment">// メソッド内で最初に呼び出す</span>
    <span class="CDKeyword">procedure</span> ExitSyncronize;   <span class="CDComment">// メソッド内で最後に呼び出す</span>

    <span class="CDKeyword">procedure</span> Notify;     <span class="CDComment">// Java と同等のメソッド</span>
    <span class="CDKeyword">procedure</span> NotifyAll;  <span class="CDComment">// Java と同等のメソッド</span>
    <span class="CDKeyword">procedure</span> Wait;       <span class="CDComment">// Java と同等のメソッド</span>

    <span class="CDKeyword">constructor</span> Create;
    <span class="CDKeyword">destructor</span> Destroy; <span class="CDKeyword">override</span>;
  <span class="CDKeyword">end</span>;

<span class="CDKeyword">implementation</span>

<span class="CDKeyword">type</span>
  TDummyThread = <span class="CDKeyword">class</span>(TThread)
  <span class="CDKeyword">end</span>;

<span class="CDKeyword">constructor</span> TSyncObjBase.Create;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">inherited</span>;

  FMutexLock      := TMutex.Create(FALSE);
  FtlstWaitThread := TThreadList.Create;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">destructor</span> TSyncObjBase.Destroy;
<span class="CDKeyword">begin</span>
  FreeAndNil(FMutexLock     );
  FreeAndNil(FtlstWaitThread);

  <span class="CDKeyword">inherited</span>;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TSyncObjBase.EnterSyncronize();
<span class="CDKeyword">var</span>
  WaitResult : TWaitResult;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">while</span> (TRUE) <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
    WaitResult := FMutexLock.WaitFor(ciWaitIntervalMSec);
    <span class="CDKeyword">if</span> (TDummyThread(TThread.CurrentThread).Terminated = TRUE) <span class="CDKeyword">then</span> <span class="CDKeyword">begin</span>
      <span class="CDKeyword">raise</span> EInterrupt.Create(<span class="CDString">''</span>);
    <span class="CDKeyword">end</span>;

    <span class="CDKeyword">if</span> (WaitResult = wrSignaled) <span class="CDKeyword">then</span>
      break;

    <span class="CDKeyword">if</span> (WaitResult &lt;&gt; wrTimeout) <span class="CDKeyword">then</span> <span class="CDKeyword">begin</span>
      <span class="CDKeyword">raise</span> EWaitFor.Create(IntToStr(Ord(WaitResult)));
    <span class="CDKeyword">end</span>;
  <span class="CDKeyword">end</span>;

  Inc(FiLockCount);
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TSyncObjBase.ExitSyncronize();
<span class="CDKeyword">begin</span>
  Assert(FiLockCount &gt; 0);

  FMutexLock.Release();
  Dec(FiLockCount);
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TSyncObjBase.Wait();
<span class="CDKeyword">var</span>
  iCntr         : integer;
  iLockCountNow : integer;
  event         : TSimpleEvent;
  WaitResult    : TWaitResult;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">if</span> (FiLockCount = 0) <span class="CDKeyword">then</span>
    <span class="CDKeyword">raise</span> EIllegalMonitorState.Create(<span class="CDString">''</span>);

  iLockCountNow := FiLockCount;

  event := TSimpleEvent.Create(FALSE);
  <span class="CDKeyword">try</span>
    Self.FtlstWaitThread.Add(event);

    <span class="CDComment">// EnterSyncronize の多重呼び出しに対応するため、ExitSyncronize を複数実行。</span>
    <span class="CDComment">//   ※EnterSyncronize の多重呼び出しのテストは行っていません。</span>
    <span class="CDKeyword">for</span> iCntr := 0 <span class="CDKeyword">to</span> iLockCountNow - 1 <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
      Self.ExitSyncronize();
    <span class="CDKeyword">end</span>;

    <span class="CDKeyword">while</span> (TRUE) <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
      WaitResult := event.WaitFor(ciWaitIntervalMSec);
      <span class="CDKeyword">if</span> (TDummyThread(TThread.CurrentThread).Terminated = TRUE) <span class="CDKeyword">then</span> <span class="CDKeyword">begin</span>
        Self.EnterSyncronize();
        <span class="CDKeyword">raise</span> EInterrupt.Create(<span class="CDString">''</span>);
      <span class="CDKeyword">end</span>;

      <span class="CDKeyword">if</span> (WaitResult = wrSignaled) <span class="CDKeyword">then</span>
        break;

      <span class="CDKeyword">if</span> (WaitResult &lt;&gt; wrTimeout) <span class="CDKeyword">then</span> <span class="CDKeyword">begin</span>
        <span class="CDKeyword">raise</span> EWaitFor.Create(IntToStr(Ord(WaitResult)));
      <span class="CDKeyword">end</span>;
    <span class="CDKeyword">end</span>;

  <span class="CDKeyword">finally</span>
    FreeAndNil(event);

    <span class="CDKeyword">for</span> iCntr := 0 <span class="CDKeyword">to</span> iLockCountNow - 1 <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
      Self.EnterSyncronize();
    <span class="CDKeyword">end</span>;
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TSyncObjBase.NotifyAll();
<span class="CDKeyword">var</span>
  lstTmp : TList;
  iCntr: Integer;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">if</span> (FiLockCount = 0) <span class="CDKeyword">then</span>
    <span class="CDKeyword">raise</span> EIllegalMonitorState.Create(<span class="CDString">''</span>);

  lstTmp := FtlstWaitThread.LockList();
  <span class="CDKeyword">try</span>
    <span class="CDKeyword">for</span> iCntr := 0 <span class="CDKeyword">to</span> lstTmp.Count - 1 <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
      Assert(TObject(lstTmp[iCntr]) <span class="CDKeyword">is</span> TSimpleEvent);

      TSimpleEvent(lstTmp[iCntr]).SetEvent();
    <span class="CDKeyword">end</span>;
    lstTmp.Clear();
  <span class="CDKeyword">finally</span>
    FtlstWaitThread.UnlockList();
    lstTmp := <span class="CDKeyword">nil</span>;  <span class="CDComment">// 念のため</span>
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TSyncObjBase.Notify();
<span class="CDKeyword">var</span>
  lstTmp : TList;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">if</span> (FiLockCount = 0) <span class="CDKeyword">then</span>
    <span class="CDKeyword">raise</span> EIllegalMonitorState.Create(<span class="CDString">''</span>);

  lstTmp := FtlstWaitThread.LockList();
  <span class="CDKeyword">try</span>
    <span class="CDKeyword">if</span> (lstTmp.Count &gt; 0) <span class="CDKeyword">then</span> <span class="CDKeyword">begin</span>
      SetEvent(THandle(lstTmp[0]));
      lstTmp.Delete(0);
    <span class="CDKeyword">end</span>;
  <span class="CDKeyword">finally</span>
    FtlstWaitThread.UnlockList();
    lstTmp := <span class="CDKeyword">nil</span>; <span class="CDComment">// 念のため</span>
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;


<span class="CDKeyword">end</span>.
</pre>      
    </div>
    <h4>Guarded Suspension のソース</h4>
    <div class="proglist">
<pre class="code">
<span class="CDKeyword">type</span>
  TRequest = <span class="CDKeyword">class</span>(TObject)
  strict <span class="CDKeyword">private</span>
    FstrName : <span class="CDKeyword">string</span>;
  <span class="CDKeyword">public</span>
    <span class="CDKeyword">constructor</span> Create(<span class="CDKeyword">const</span> strName : <span class="CDKeyword">string</span>);
    <span class="CDKeyword">function</span> getName(): <span class="CDKeyword">string</span>;
    <span class="CDKeyword">function</span> AsString(): <span class="CDKeyword">string</span>; <span class="CDComment">// ログ出力用のテキストを返す</span>
  <span class="CDKeyword">end</span>;

  TRequestQueue = <span class="CDKeyword">class</span>(TSyncObjBase)
  strict <span class="CDKeyword">private</span>
    FQueue: TQueue&lt;TRequest&gt;;
  <span class="CDKeyword">public</span>
    <span class="CDKeyword">constructor</span> Create();
    <span class="CDKeyword">destructor</span> Destroy; <span class="CDKeyword">override</span>;

    <span class="CDKeyword">function</span> getRequest(): TRequest;         <span class="CDComment">// synchronized メソッド</span>
    <span class="CDKeyword">procedure</span> putRequest(request: TRequest); <span class="CDComment">// synchronized メソッド</span>
  <span class="CDKeyword">end</span>;

  TClientThread = <span class="CDKeyword">class</span>(TThreadBase)
  strict <span class="CDKeyword">private</span>
    FRequestQueue: TRequestQueue;
  <span class="CDKeyword">private</span>

  <span class="CDKeyword">public</span>
    <span class="CDKeyword">constructor</span> Create(RequestQueue: TRequestQueue; <span class="CDKeyword">const</span> strName: <span class="CDKeyword">string</span>);
    <span class="CDKeyword">procedure</span> Execute(); <span class="CDKeyword">override</span>;
  <span class="CDKeyword">end</span>;

  TServerThread = <span class="CDKeyword">class</span>(TThreadBase)
  strict <span class="CDKeyword">private</span>
    FRequestQueue: TRequestQueue;
  <span class="CDKeyword">public</span>
    <span class="CDKeyword">constructor</span> Create(RequestQueue: TRequestQueue; <span class="CDKeyword">const</span> strName: <span class="CDKeyword">string</span>);
    <span class="CDKeyword">procedure</span> Execute(); <span class="CDKeyword">override</span>;
  <span class="CDKeyword">end</span>;

<span class="CDKeyword">implementation</span>

<span class="CDKeyword">constructor</span> TRequestQueue.Create;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">inherited</span>;

  FQueue := TQueue&lt;TRequest&gt;.Create;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">destructor</span> TRequestQueue.Destroy;
<span class="CDKeyword">begin</span>
  FreeAndNil(FQueue);

  <span class="CDKeyword">inherited</span>;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">function</span> TRequestQueue.getRequest(): TRequest; <span class="CDComment">// synchronized メソッド</span>
<span class="CDKeyword">begin</span>
  EnterSyncronize();
  <span class="CDKeyword">try</span>
    <span class="CDKeyword">while</span> (FQueue.Count = 0) <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
      wait();
    <span class="CDKeyword">end</span>;
    Result := FQueue.Dequeue();

  <span class="CDKeyword">finally</span>
    ExitSyncronize();
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TRequestQueue.putRequest(Request: TRequest); <span class="CDComment">// synchronized メソッド</span>
<span class="CDKeyword">begin</span>
  EnterSyncronize();
  <span class="CDKeyword">try</span>
    FQueue.Enqueue(request);
    notifyAll();
  <span class="CDKeyword">finally</span>
    ExitSyncronize();
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;

<span class="CDComment">{ TRequest }</span>

<span class="CDKeyword">constructor</span> TRequest.Create(<span class="CDKeyword">const</span> strName: <span class="CDKeyword">string</span>);
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">inherited</span> Create;

  FstrName := strName;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">function</span> TRequest.getName: <span class="CDKeyword">string</span>;
<span class="CDKeyword">begin</span>
  Result := FstrName;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">function</span> TRequest.AsString: <span class="CDKeyword">string</span>;
<span class="CDKeyword">begin</span>
  Result := <span class="CDString">'[ Request '</span> + FstrName + <span class="CDString">' ]'</span>;
<span class="CDKeyword">end</span>;

<span class="CDComment">{ TClientThread }</span>

<span class="CDKeyword">constructor</span> TClientThread.Create(RequestQueue: TRequestQueue; <span class="CDKeyword">const</span> strName: <span class="CDKeyword">string</span>);
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">inherited</span> Create(strName);

  FrequestQueue := requestQueue;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TClientThread.Execute;
<span class="CDKeyword">var</span>
  i       : integer;
  request : TRequest;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">for</span> i := 0 <span class="CDKeyword">to</span> 10 - 1 <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
    request := TRequest.Create(<span class="CDString">'No.'</span> + IntToStr(i));

    OutputLog(Self.<span class="CDKeyword">Name</span> +  <span class="CDString">' requests '</span> + request.AsString());

    FrequestQueue.putRequest(request);

    sleep(random(500));
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;


<span class="CDComment">{ TServerThread }</span>

<span class="CDKeyword">constructor</span> TServerThread.Create(RequestQueue: TRequestQueue; <span class="CDKeyword">const</span> strName: <span class="CDKeyword">string</span>);
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">inherited</span> Create(strName);

  FrequestQueue := requestQueue;
<span class="CDKeyword">end</span>;

<span class="CDKeyword">procedure</span> TServerThread.Execute;
<span class="CDKeyword">var</span>
  i       : integer;
  request : TRequest;
<span class="CDKeyword">begin</span>
  <span class="CDKeyword">for</span> i := 0 <span class="CDKeyword">to</span> 10 - 1 <span class="CDKeyword">do</span> <span class="CDKeyword">begin</span>
    request := FrequestQueue.getRequest();

    OutputLog(#9#9#9#9 + Self.<span class="CDKeyword">Name</span> +  <span class="CDString">' handles '</span> + request.AsString());

    sleep(random(1000));
  <span class="CDKeyword">end</span>;
<span class="CDKeyword">end</span>;
</pre>      
    </div>
]]></description>
 <category>Delphi</category>
 <pubDate>Wed, 18 Aug 2010 14:19:14 +0900</pubDate>
</item><item>
 <title>Delphi 2010 で SQLite3 を使用する</title>
 <link>http://koz.scriptbrowserk.com/Delphi/Delphi_SQLite3.html</link>
<description><![CDATA[<div class="contentbody">
    <p>Delphi 2010 で SQLite3 を使用したくなって、調べてみました。</p>
    <p>実際に使用できるまでの情報が入手できたのは下の２種類。</p>
    <ol>
      <li><a href="http://www.ch-werner.de/sqliteodbc/" target="_blank">SQLite ODBC Driver</a><br />
      Kazuyoshi Kakihara さんが、<a href="http://kzworks.at.webry.info/200908/article_41.html" target="_blank">日本語対応版</a>を公開されています。</li>
      <li><a href="http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3" target="_blank">A simple Delphi wrapper for Sqlite 3</a></li>
    </ol>
    <p>ODBC を使用すると ADO 経由で Delphi 標準のデータベースコンポーネントが使用できるので、今回は ODBC Driver 日本語対応版を使用させて頂くことにしました。</p>
    </div>]]></description>
 <category>Delphi</category>
 <pubDate>Fri, 22 Jan 2010 17:10:12 +0900</pubDate>
</item><item>
 <title>Windows 7, Vista で、ルータを超えてファイル共有する</title>
 <link>http://koz.scriptbrowserk.com/etc/VistaShareOverVpn.html</link>
<description><![CDATA[    <p>設定を見つけるのに苦労したので公開しておきます。</p>
    <p>      Windows 7, Vista でルータを超えて（サブネットの異なる）パソコン同士でファイル共有（パスワード保護共有）を行うには、Windows ファイアウォールで「Netlogon サービス」を例外に追加する必要があるようです。</p>
    <p>以下、Windows 7 の場合の設定手順です。</p>
    <ol>
      <li>コントロール パネルの Windows ファイアウォールを開く。</li>
      <li> 画面の左上の「Windows ファイアウォールを介したプログラムまたは機能を許可する」をクリックする。</li>
      <li>        「設定の変更」ボタンをクリックする</li>
      <li>        「許可されたプログラムおよび機能」欄の「Netlogon サービス」の「ホーム／社内（プライベート）」欄をチェックする。</li>
      </ol>
    <p>※2009/09/22 Windows 7 に対応するために全面更新</p>
]]></description>
 <category>一般</category>
 <pubDate>Wed, 10 Jun 2009 15:39:58 +0900</pubDate>
</item>
  </channel>
</rss>
