<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>
<channel rdf:about="http://dsas.blog.klab.org/">
<title>DSAS開発者の部屋</title>
<link>http://dsas.blog.klab.org/</link>
<description>
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51232247.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51212649.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51210022.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51208603.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51208101.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51205186.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51201967.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51199866.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51199428.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51198643.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51196229.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51195764.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51194781.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51194343.html" />
  <rdf:li rdf:resource="http://dsas.blog.klab.org/archives/51191661.html" />
 </rdf:Seq>
</items>
</channel>

<item rdf:about="http://dsas.blog.klab.org/archives/51232247.html">
<title>(速報)SWF SpecificationがOpenになりました</title>
<link>http://dsas.blog.klab.org/archives/51232247.html</link>
<description>
以前、「SWFファイルフォーマットとライセンス 」で、SWFのファイルフォーマット仕様書の利用許諾に、SWFファイルを読み込むプログラムを作成してはいけないと書かれていることを紹介しました。


今日、Adobeから「Adobe and Industry Leaders Establish Open Screen P...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-05-01T15:37:48+09:00</dc:date>
<dc:subject>flash</dc:subject>
<content:encoded><![CDATA[<p>
以前、<a href="http://dsas.blog.klab.org/archives/51167394.html">「SWFファイルフォーマットとライセンス 」</a>で、SWFのファイルフォーマット仕様書の利用許諾に、SWFファイルを読み込むプログラムを作成してはいけないと書かれていることを紹介しました。
</p>
<p>
今日、Adobeから<a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200804/050108AdobeOSP.html">「Adobe and Industry Leaders Establish Open Screen Project」</a>というプレスリリースがあり、その中に以下の一文がありました。
</p>
<blockquote>
- Removing restrictions on use of the SWF and FLV/F4V specifications
</blockquote>
<p>
ということで、SWFの仕様書を制限無しに読むことが可能になったようです。
</p>
<p>
他にも、Flash Playerの移植レイヤが公開され、Flash Playerを移植してもライセンス料が取られなくなる等が発表されているようです。私もまだ流し読みしかしていないのですが、とても大きなニュースなのでとりいそぎ紹介させていただきました。
</p>
<p>
追記:<br/>
SWFとFLVの仕様書がこちらからダウンロードできるようになっています。<br/>
<a href="http://www.adobe.com/openscreenproject/developers/">Open Screen Project / For developers</a>
</p>
<hr>
<div style="text-align: right; margin: 1px 3px 1px 0px">@methane</div>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51212649.html">
<title>repcached-2.0リリースのお知らせと、超簡単なサンプルコード</title>
<link>http://dsas.blog.klab.org/archives/51212649.html</link>
<description>
repcached-2.0(memcached-1.2.5ベース) をリリースしましたのでお知らせします。


  http://lab.klab.org/modules/mediawiki/index.php/Repcached (日本語)
  http://repcached.lab.klab.org/ (英語)


今回の目玉はマルチマスタ構成のサポートです。
以前のバー...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-04-11T07:00:38+09:00</dc:date>
<dc:subject>repcached</dc:subject>
<content:encoded><![CDATA[<p>
repcached-2.0(memcached-1.2.5ベース) をリリースしましたのでお知らせします。
</p>
<ul>
  <li><a href="http://lab.klab.org/modules/mediawiki/index.php/Repcached">http://lab.klab.org/modules/mediawiki/index.php/Repcached</a> (日本語)</li>
  <li><a href="http://repcached.lab.klab.org/">http://repcached.lab.klab.org/</a> (英語)</li>
</ul>
<p>
今回の目玉はマルチマスタ構成のサポートです。<br>
以前のバージョンはマスタ/スレーブ構成だったので、必ずマスタへ書き込まなければいけませんでした。そのため、接続先のサーバがマスタなのかどうかをクライアントが判別しなければいけなかったり、keepalivedなどと併用するなどの工夫が必要でしたが、今回のバージョンではその必要がなくなります。両方のサーバに対してデータを書き込むことができるようになったので、かなり使いやすくなったと感じています。
</p>
<p>
repcachedはパフォーマンスを最重視しているため、レプリケーションは非同期で処理しています。したがって、setと同時にレプリケーションが完了する保証はありません。つまり、サーバAにsetした直後にサーバBからgetした場合、正しい値が返ってこない可能性があります。
</p>
<p>
しかし、memcachedのクライアントライブラリは負荷分散機能を持っていて、複数のサーバがある場合、キーのハッシュ値を元にして接続先のサーバが選択されます。そのため、同一のキーに対する操作は必ず同じサーバで処理されます。これを図にすると以下のような感じになります。
</p>
<center>
<img src="http://lab.klab.org/uploads/mediawiki/1/1c/Rep.png" alt="rep.png" height="400" width="500">
</center>
<p>
つまり、クライアントライブラリの負荷分散機能を利用すると、データを格納したサーバと同じサーバが参照されるので、非同期処理に起因するデータの不整合は発生しません。そして、すべてのデータは両方のサーバへ格納されているので、片方のサーバがダウンしてもすべてのデータが保持されます。
</P>
<center>
<img src="http://lab.klab.org/uploads/mediawiki/f/f9/Down.png" alt="down.png" height="400" width="500">
</center>
<P>
ただし、参照しようとしたサーバがダウンしていた時に、自動的にもう片方のサーバへ参照しにいくかどうかは、クライアントライブラリの実装に依存します。例えば、PHP の <A HREF="http://pecl.php.net/package/memcache">memcached extension</A> で提供される <A HREF="http://jp.php.net/manual/ja/function.Memcache-set.php">Memcache::set 関数</A>の場合は、Version3.0.0以上ならば自動的に再接続してくれますが、Version2.2.3ではエラーになってしまいます。そのような場合は、自分で再試行するなどの処理を実装する必要があるかもしれません。セッションハンドラ（session.save_handler="memcache"）を利用する場合は、バージョン2.2.3でも再接続してくれます。<BR>
※この例は後ほどご紹介します。
</p>
<p>
ダウンしていたサーバが復旧して最初にやることは、既存のサーバの全てのデータを複製（以下、まるごとこぴー）することです。その間、復旧中のサーバはクライアントからの接続を受け付けないので、誤って中途半端な状態のデータを取得してしまうことはありません。また、まることこぴーの最中でも、コピー元のサーバに対しては正常にアクセスできるので、サービスが停止してしまう心配もありません。
</p>
<center>
<img src="http://lab.klab.org/uploads/mediawiki/c/c7/Marugoto.png" alt="marugoto.png" height="400" width="500">
</center>
<p>
まるごとこぴーが完了次第、レプリケーションを再開し、両方のサーバへアクセスできるようになります。まるごとこぴーの所要時間は、ギガビットイーサの環境で10万件で3秒程度、100万件で30秒程度でした。
</p>
<h3>簡単な使用例</h3>
<hr>
<p>
　簡単な使用例として以下のコードを紹介します。セッション変数を利用して、リロードするたびにカウンタが増えていくPHPです。
セッションハンドラとしてmemcacheを使い、データの保存先にrcd1とrcd2というサーバを指定しています。rcd1とrcd2ではrepcachedを起動しておきます。
</p>
[count.php]
<pre class="PROG">&lt;?PHP
$rcd1="tcp://rcd1?persistent=1&amp;weight=1&amp;timeout=1&amp;retry_interval=15";
$rcd2="tcp://rcd2?persistent=1&amp;weight=1&amp;timeout=1&amp;retry_interval=15";
$session_save_path  = "$rcd1,$rcd2";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);
session_start();
if(empty($_SESSION['count'])){
   $_SESSION['count']=1;
} else {
   $_SESSION['count']++;
}
echo "count=".$_SESSION['count']."\n";
?&gt;
</pre>
※PHP-5.2.5 + <a href="http://pecl.php.net/get/memcache-2.2.3.tgz">memcache-2.2.3</a>で動作確認
<p>
ブラウザでこのページへアクセスすると、リロードする度にカウンタが増えていきます。
rcd1,rcd2のどちらかが動いている限りカウンタは増え続け、両方停止するとリセットします。
</p>
<p>
このように、repcached-2.0はmemcachedを2台で負荷分散するのと同じ感覚で利用できます。
すでにmemcachedを2台構成で運用しているシステムであれば、repcached-2.0に置き換えるだけで冗長構成になるかもしれません。
さすがにオリジナルのmemcachedと比べると若干パフォーマンスは落ちますが、それでも実用には支障のないレベルに仕上がっていると思いますので、もしよろしければご利用下さいませ。
</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51210022.html">
<title>Erlang Webフレームワークでデータベースを分散させる</title>
<link>http://dsas.blog.klab.org/archives/51210022.html</link>
<description>
ErlangのWebフレームワークであるErlyWebの
紹介を始めて今回が最終回になります。



これまでの記事をまとめると

 ErlyWeb:Erlangで書かれたWebフレームワーク
  ErlangのWebフレームワークであるErlyWebの紹介と、Windowsにインストールする手順を紹介
  
 E...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-04-04T17:59:07+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<p>
<a href="http://www.erlang.org/">Erlang</a>のWebフレームワークである<a href="http://erlyweb.org/">ErlyWeb</a>の
紹介を始めて今回が最終回になります。

</p>
<p>
これまでの記事をまとめると
<ol>
 <li><a href="http://dsas.blog.klab.org/archives/51189138.html">ErlyWeb:Erlangで書かれたWebフレームワーク</a>
  <div>ErlangのWebフレームワークであるErlyWebの紹介と、Windowsにインストールする手順を紹介</div>
 </li> 
 <li><a href="http://dsas.blog.klab.org/archives/51194781.html">ErlyWeb（その２）:テンプレートシステム</a>
  <div>ErlyWebのテンプレートシステムを使用した例を紹介</div>

 </li>
 <li><a href="http://dsas.blog.klab.org/archives/51199428.html">ErlyWeb:ErlyWebでmnesiaを使う</a>
  <div>Erlangの分散データベースであるMnesiaを、ErlyWebのORマッパ機能(ErlyDB)で使用する手順を紹介</div>
 </li>
 <li><a href="http://dsas.blog.klab.org/archives/51201967.html">Yawsで分散データベースMnesiaを使う</a>
  <div>ErlyWebで使用されるWebアプリケーションのYawsで、Mnesiaをテストが容易な同一ホスト中で分散データベースとして設定する手順を紹介</div>
 </li>

 <li>(この記事)Erlang Webフレームワークでデータベースを分散させる</a>
  <div>異なるホストでMnesiaを分散させて使用するための手順を紹介</div>
 </li>
</ol>
</p>
<p>
前回、同一ホスト内で分散データベースを作る練習をしてみました。<br>
異なるホスト間でデータベースを分散させる設定をするには、Windows版の
起動スクリプトの修正や、MnesiaをErlyWebで使用するための前準備、データベースのデータの移行の問題などがあり、
分散データベースの設定を前回と今回の２回に分けました。
</p>
<p>
分散したデータベースの構成変更については、ホストの構成にかかわらず同じですので、前回の記事を参考にしてみてください。

</p>

<a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%A7mnesia%E3%82%92%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%81%99%E3%82%8B%282%29">続きを読む</a><br>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51208603.html">
<title>WindowsでPython Scriptの起動用exeを用意する</title>
<link>http://dsas.blog.klab.org/archives/51208603.html</link>
<description>
MercurialやTaskCoachといったPython製ツールをWindows上で使うとき、py2exeでビルドして配布されているパッケージを利用するとインストールはとても簡単なのですが、アプリ毎にpython25.dllといったdllやPythonモジュール群が大量にインストールされるのが欠点です。

...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-04-01T17:12:48+09:00</dc:date>
<dc:subject>Python</dc:subject>
<content:encoded><![CDATA[<p>
MercurialやTaskCoachといったPython製ツールをWindows上で使うとき、py2exeでビルドして配布されているパッケージを利用するとインストールはとても簡単なのですが、アプリ毎にpython25.dllといったdllやPythonモジュール群が大量にインストールされるのが欠点です。
</p>
<p>
普段からPythonを利用している人にとっては、distutilsを利用したインストール(easy_installやsetup.py install)の方がメモリ効率の面でも起動速度等の面でも有利な筈です。僕はできるだけこちらの方法を使っていて、起動速度・最小化解除のレスポンス共に向上することが体感できます。（プラシーボ効果かもしれませんが）
</p>
<p>
ただし、Mercurialをeasy_installしたところ、hg.exeが生成されず、Pythonをインストールしたディレクトリの下のScriptsディレクトリに"#!"(shebang)を利用した起動スクリプトであるhgが生成されただけでした。また、TaskCoachも、taskcoach.pyとtaskcoach.pywがあるだけでした。もちろんこのままでも利用はできます。でも、例えばNetBeansでMercurialを利用しようとするとhg.exeの場所を指定しないといけなかったりするので、やはり起動用の実行ファイルがあったほうが便利です。
</p>
<p>
そこで、easy_install.exeのような起動用実行ファイルを作るにはどうしたら良いのだろうと、distutilsを拡張するモジュールであるsetuptoolsを調べてみました。これを使えば、非常に簡単にPythonスクリプトをexeから起動できるようになります。
</p>
<p>
起動用実行ファイルは、コマンドプロンプトを開かないWindowアプリ用とコマンドプロンプトを開くコマンドライン用の2種類があり、以下のような動作をします。</p>
<ol>
<li>起動対象スクリプトのパスを、GetModuleFileName()の結果から求めます。<br/>
パスから拡張子(.exe)を取り除いた後、Windowアプリ用なら"-script.pyw"を、コマンドライン用なら"-script.py"をつけたものが、起動対象のスクリプトになります。</li>
<li>起動対象スクリプトを開き、先頭に"#!"があるかどうかを調べます。"#!"があれば、続きを起動するPythonインタプリタとして扱い、"#!"が無ければ"python.exe"をPythonインタプリタとします。</li>
<li>引数を渡してsapwn()します。</li>
</ol>
<p>
setuptoolsをインストールしてあれば、この起動用実行ファイルが、Lib/site-packages/setuptools/の中にgui.exeとcli.exeの名前で入っています。名前から判るように、gui.exeがWindowアプリ用、cli.exeがコマンドラインアプリ用です。例えば、次のようにすれば、hg.exeとtaskcoach.exeを用意することができます。
</p>
<pre class="terminal">
C:\python\Scripts&gt;copy hg hg-script.py
C:\python\Scripts&gt;copy ..\Lib\site-packages\setuptools\cli.exe hg.exe
C:\python\Scripts&gt;copy taskcoach.pyw taskcoach-script.pyw
C:\python\Scripts&gt;vim taskcoach-script.pyw (先頭に #!C:\python\pythonw.exe を追加)
C:\python\Scripts&gt;copy ..\Lib\site-packages\setuptools\gui.exe taskcoach.exe
</pre>
<p>
同じ方法で、自作のスクリプトでもお手軽にexe化できます。これでWindowsユーザーのPythonライフが少し楽しくなればと思います。
</p>
<hr>
<div align="right">@methane</div>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51208101.html">
<title>KLab勉強会#4の資料を公開します</title>
<link>http://dsas.blog.klab.org/archives/51208101.html</link>
<description>
3/28に開催した、第4回KLab勉強会の資料を公開します。



  『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
    
    &amp;nbsp;&amp;nbsp;～ ひろせまさあき (KLab株式会社)
  
    
      発表資料 (PDF, 661 KB)
      動画: 前編、後編 (Ustream.t...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-31T17:00:18+09:00</dc:date>
<dc:subject>KLab勉強会</dc:subject>
<content:encoded><![CDATA[<p>
3/28に開催した、<a href="http://dsas.blog.klab.org/archives/51199866.html">第4回KLab勉強会</a>の資料を公開します。
</p>

<dl>
  <dt>『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
    <br>
    &nbsp;&nbsp;～ ひろせまさあき (KLab株式会社)
  <dd>
    <ul>
      <li><a href="http://log.blog.klab.org/support/20080328/DSAS-Yarikuri.pdf">発表資料</a> (PDF, 661 KB)
      <li>動画: <a href="http://www.ustream.tv/recorded/Pq5u9XvHy4llnZleAU58CA">前編</a>、<a href="http://www.ustream.tv/recorded/Dkc7dwHzfuKGLgMriqoK.bF2pLttiKm7">後編</a> (Ustream.tv)</li>
    </ul>

  <dt>『オープンソースなシステム管理フレームワーク Func』
    <br>
    &nbsp;&nbsp;～ 宮下 剛輔（株式会社paperboy&amp;co.）
  <dd>
    <ul>
      <li><a href="http://log.blog.klab.org/support/20080328/KLab_study4_func.pdf">発表資料</a> (PDF, 753 KB)
      <li><a href="http://www.ustream.tv/recorded/8LdLW6rhwKSDzmeGu0.XdAFMhzcdRUNj">動画</a> (Ustream.tv)</li>
    </ul>
  </dl>

<p>
たくさんの方にお越しいただきありがとうございました。<br>
おかげさまで、懇親会も含め盛況のうちに終わり、とても楽しい時間を過ごすことができました。
</p>

<p>
近いうちに第5回も開催したいと思っています。<br>
勉強会の内容や参加募集など、決まり次第このブログでアナウンスしますので、今後も購読していただければと思います。
</p>
]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51205186.html">
<title>KLab勉強会#4 ストリーミング配信のお知らせ</title>
<link>http://dsas.blog.klab.org/archives/51205186.html</link>
<description>
今週金曜日に開催予定のKLab勉強会#4を、Ustream.tvでストリーミング配信したいと思います。



当日(3/28)、19:00前ぐらいから下記のURLで配信する予定ですので、申し込めなかった方や遠方の方など、ご覧いただければと思います。



  http://ustream.tv/channel...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-25T15:18:19+09:00</dc:date>
<dc:subject>KLab勉強会</dc:subject>
<content:encoded><![CDATA[<p>
今週金曜日に開催予定の<a href="http://dsas.blog.klab.org/archives/51199866.html">KLab勉強会#4</a>を、Ustream.tvでストリーミング配信したいと思います。
</p>

<p>
当日(3/28)、19:00前ぐらいから下記のURLで配信する予定ですので、申し込めなかった方や遠方の方など、ご覧いただければと思います。
</p>

<ul>
  <li><a href="http://ustream.tv/channel/KLab">http://ustream.tv/channel/KLab</a>
</ul>

<hr>
(ひ)
]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51201967.html">
<title>Yawsで分散データベースMnesiaを使う</title>
<link>http://dsas.blog.klab.org/archives/51201967.html</link>
<description>ErlangはMnesiaというデータベースマネージメントシステム（DBMS）をサポートしています。
Mnesiaを使用すると、データベースのレプリケーションによって分散データベースを構築し、簡単にデータベースの冗長化を実現できます。

前回まで紹介してきたErlyWebのORマッパは...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-18T18:22:25+09:00</dc:date>
<dc:subject>Erlang</dc:subject>
<content:encoded><![CDATA[<a href="http://www.erlang.org/">Erlang</a>はMnesiaというデータベースマネージメントシステム（DBMS）をサポートしています。
Mnesiaを使用すると、データベースのレプリケーションによって分散データベースを構築し、簡単にデータベースの冗長化を実現できます。<br>

前回まで紹介してきた<a href="http://erlyweb.org/">ErlyWeb</a>のORマッパはMnesiaに対応していて
Mnesiaを使用した分散データベース上でErlyWebのORマッパを使ってWebアプリケーションを作ることができるようになります。<br>
<br>
今回は、前回説明したYawsで設定したMnesiaのデータベースを、同一ホスト内で複数のノードで使用したり、データベースを複製する手順を説明します。
異なるホスト間でのMnesiaの複製を行おうとすると、今回の環境では別の問題が発生します。これについては次回に説明する予定です。<br>
今回は、同一ホスト内で接続と複製だけ行ってみます。<br>

<p><a href="http://lab.klab.org/modules/mediawiki/index.php/Yaws%E3%81%A7%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9Mnesia%E3%82%92%E4%BD%BF%E3%81%86">
続きを読む</a></p>

(セ)
]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51199866.html">
<title>KLab勉強会#4 開催のお知らせ</title>
<link>http://dsas.blog.klab.org/archives/51199866.html</link>
<description>
第4回 KLab勉強会のお知らせです。
(過去の勉強会の資料はクラブラボのKLab勉強会まとめページにあります)



今回は『システム管理』をテーマに、ゲストスピーカとして株式会社paperboy&amp;co.の宮下氏をお迎えして、Funcというオープンソースのシステム管理フレームワ...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-17T07:30:07+09:00</dc:date>
<dc:subject>KLab勉強会</dc:subject>
<content:encoded><![CDATA[<p>
第4回 KLab勉強会のお知らせです。<br>
(過去の勉強会の資料は<a href="http://lab.klab.org/modules/mediawiki/index.php/KLab%E5%8B%89%E5%BC%B7%E4%BC%9A">クラブラボのKLab勉強会まとめページ</a>にあります)
</p>

<p>
今回は『システム管理』をテーマに、ゲストスピーカとして株式会社paperboy&co.の宮下氏をお迎えして、<a href="https://fedorahosted.org/func/" title="Func">Func</a>というオープンソースのシステム管理フレームワークについてお話ししていただきます。
</p>
<p>
また弊社からは、<a href="http://www.klab.org/dsas/" title="DSAS">DSAS</a>で実践している、効率的なシステム管理のための工夫についてお話をします。
</p>

<p>
みなさんのご参加、お待ちしております！
</p>

<h3>開催要項</h3>
<dl>
  <dt>日時
  <dd>2008/3/28 (金) 19:00-20:00 (18:30受付開始)

  <dt>場所
  <dd>KLab株式会社 第3会議室<br>
    東京都港区六本木6-10-1 六本木ヒルズ森タワー20F
(<a href="http://www.klab.org/comp/access.html">アクセス方法</a>)
  <dt>参加費
  <dd>無料

  <dt>人数
  <dd>30名程度<br>
    (定員になり次第、参加登録を締め切らせていただきます)
</dl>
<p>
※終了後に懇親会(会費制)を予定しています
</p>

<h3>セッション</h3>
<ol>
  <li>
  <dl>
    <dt>タイトル
    <dd>『オープンソースなシステム管理フレームワーク Func』
    <dt>講師
    <dd>宮下 剛輔（株式会社paperboy&co.）
    <dt>概要
    <dd>
      <p>
      Func（Fedora Unified Network Controller）というPython製のシステム管理フレームワークについて、
      </p>
      <ul>
        <li>そもそも一体どういうものなのか？
        <li>具体的にどのようにシステム管理に利用するのか？
      </ul>
      <p>
      といったことをお話したいと思います。
      </p>
    </dl>

  <li>
  <dl>
    <dt>タイトル
    <dd>『DSASのやりくり - MATRIXの秘密と効率的なシステム管理の関係』
    <dt>講師
    <dd>ひろせまさあき (KLab株式会社)
    <dt>概要
    <dd>
      <p>
      システム管理をする上で、特にサーバ台数が増え始めると大きな問題になってくることがらについて、<a href="http://www.klab.org/dsas/" title="DSAS">DSAS</a>ではどのように解決し、運用の効率化を果たしているか、その事例を紹介したいと思います。
     </p>
  </dl>
</ol>

<h3>参加方法</h3>

<div style="background: #FFFABF; border: #EF720E 2px dotted;padding-left:1em;padding-right:1em;">
<p>
参加希望者が定員に達したため、申し込みを終了しました。たくさんのご応募ありがとうございました。
<br>
参加希望のメールをいただいた方には、後日、当日のご案内をメールでお送りいたします。
<br>
万一、参加登録後に都合が悪くなってしまった場合は、当日でもかまいませんので<a href="mailto:register-study-20080328@klab.org">register-study-20080328@klab.org</a>までご連絡いただけると助かります。
</p>
<p>

また、申し込み終了後に参加希望のメールをいただいた方には、定員超過の旨、メールでご連絡いたします。今回は参加いただけませんが、次回の参加をお待ちしております。
</p>
</div>

]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51199428.html">
<title>ErlyWeb:ErlyWebでmnesiaを使う</title>
<link>http://dsas.blog.klab.org/archives/51199428.html</link>
<description>ErlyWebはErlangで書かれたウェブのフレームワークです。ErlyWebはErlangのウェブアプリケーションであるYaws上で動作します。

今回は前回の続きの３回目でErlyWebでmnesiaを使ってみます。


	第1回:ErlyWebのインストール
	Windowsへのインストール手順を紹介します...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-13T19:02:02+09:00</dc:date>
<dc:subject>Erlang</dc:subject>
<content:encoded><![CDATA[<a href="http://erlyweb.org/">ErlyWeb</a>は<a href="http://www.erlang.org/">Erlang</a>で書かれたウェブのフレームワークです。<a href="http://erlyweb.org/">ErlyWeb</a>は<a href="http://www.erlang.org/">Erlang</a>のウェブアプリケーションであるYaws上で動作します。<br>

今回は前回の続きの３回目でErlyWebでmnesiaを使ってみます。
<br>
<dl>
	<dt>第1回:<a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">ErlyWebのインストール</a></dt>
	<dd>Windowsへのインストール手順を紹介します。</dd>
	<dt>第2回:<a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88">ErlyWebのテンプレートを使ってみる</a></dt>
	<dd>ErlyWebのテンプレートシステムを使って見ます。</dd>

	<dt>第3回:ErlyWebでmnesiaを使う</dt>
	<dd>Erlangのデータベース mnesia を使ってサンプルを動作させて見ます。</dd> 
</dl>
mnesiaを使うと、簡単にデータベースのレプリケーション機能を使用することができます。まずは、<a href="http://erlyweb.org/">ErlyWeb</a>のコンポーネントでモデルを使ってErlyDBのORマッパ機能などの紹介をします。
mnesiaについては<a href="http://dsas.blog.klab.org">DSAS開発者の部屋</a>に他の記事もあるので参考にしてみてください。
<ul>
<li>
<a href="http://dsas.blog.klab.org/archives/51101784.html"> Erlang版 memcached でキャッシュデータの永続化をしてみました。</a>

</li>
<li>
<a href="http://dsas.blog.klab.org/archives/51145655.html"> Jabberサーバーをクラスタリングしてみました。</a>
</li>
</ul>

<a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%A7mnesia%E3%82%92%E4%BD%BF%E3%81%86">続きを読む</a>
<br>
(セ)]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51198643.html">
<title>repcached-1.2をリリースしました</title>
<link>http://dsas.blog.klab.org/archives/51198643.html</link>
<description>
repcached-1.2 (memcached-1.2.4ベース) を公開しましたのでお知らせします。


今回のバージョンアップは以下の2件の不具合修正になります。

 flush_allのレプリケーション時にマスタでメモリリークする可能性があったのを修正しました
 flagsパラメータがレプリケ...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-12T03:12:04+09:00</dc:date>
<dc:subject>repcached</dc:subject>
<content:encoded><![CDATA[<P>
repcached-1.2 (memcached-1.2.4ベース) を公開しましたのでお知らせします。
</P>
<P>
今回のバージョンアップは以下の2件の不具合修正になります。<BR>
<UL>
<LI> flush_allのレプリケーション時にマスタでメモリリークする可能性があったのを修正しました
<LI> flagsパラメータがレプリケーションされていなかったのを修正しました
</UL>
</P>
<P>
ダウンロードやインストール方法などの詳しい情報は、プロジェクトページをご覧ください
</P>
<ul>
  <li><a href="http://lab.klab.org/modules/mediawiki/index.php/Repcached">http://lab.klab.org/modules/mediawiki/index.php/Repcached</a> (日本語)</li>
  <li><a href="http://repcached.lab.klab.org/">http://repcached.lab.klab.org/</a> (英語)</li>
</ul>
<BR>
<H3>flagsパラメータがレプリケーションされない不具合の詳細</H3>
<HR>
memcachedプロトコルでは更新系コマンドにflagsというパラメータがあります。<BR>
<PRE CLASS="PROG">
set key 0 0 5
        ↑これ
</PRE>
本来であれば、このパラメータもレプリケーションすべきですが、以前のバージョンではバックアップで常に0をセットしてしまっていました。
<PRE CLASS="PROG">
master: set key 1 0 5  ← Masterはflags=1なのに
backup: set key 0 0 5  ← backupはflags=0になっちゃってる
</PRE>
<P>
flagsパラメータを利用していないアプリケーションには影響ありませんが、PHPのMemcache::set関数などを使ってオブジェクトを格納しているようなアプリケーションでは致命的な問題となります。例えば、以下のようなコードです。<BR>
※環境は php-5.2.5 + <A HREF="http://pecl.php.net/get/memcache-2.2.3.tgz">memcache-2.2.3.tgz</A> です。
</P>
</DL>
【ソースコード】
<PRE CLASS="PROG">
#!/usr/bin/php
&lt?PHP
$memcacheM = new Memcache;
$memcacheB = new Memcache;
$memcacheM->connect('master', 11211) or die ("connect errorM\n");
$memcacheB->connect('backup', 11211) or die ("connect errorB\n");
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcacheM->set('key', $tmp_object, false, 10) or die ("set error\n");

$get_resultM = $memcacheM->get('key');
echo "Master\n";
var_dump($get_resultM);
echo "\n";

$get_resultB = $memcacheB->get('key');
echo "Backup\n";
var_dump($get_resultB);
?&gt
</PRE>
<BR>
実行結果は以下のようになります。<BR>
<BR>
【実行結果】<BR>
<PRE CLASS="PROG"> 
Master
object(stdClass)#5 (2) {
  ["str_attr"]=>
  string(4) "test"
  ["int_attr"]=>
  int(123)
}
 
Backup
string(66) "O:8:"stdClass":2:{s:8:"str_attr";s:4:"test";s:8:"int_attr";i:123;}"

</PRE>
<P>
なんと、Masterからgetした場合はオブジェクトとして扱われているのに対し、Backupでgetすると文字列として扱われてしまっています。PHPのMemcache関数は、データをシリアライズして格納しているかどうかを判断するためにflagsを利用しているようです。もしかすると他のライブラリでも同様の問題があるかもしれませんのでご注意下さい。
</P>
<BR>
<H3>repcached-2.0の近況</H3>
<HR>
<P>
現在、memcached-1.2.5をベースにした<A HREF="http://dsas.blog.klab.org/archives/51185822.html#2.0">repcached-2.0</A>を開発中です。実装のほうはほとんど終わっていまして、今はコードを見直しながらストレステストの準備をしています。早ければ今月中、遅くとも来月の頭にはリリースできると思いますのでご期待下さいませ！
</P>
<BR>
<HR>
<P>
（や）
</P>
]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51196229.html">
<title>Flex SDKのswfutilsをハックしてみる</title>
<link>http://dsas.blog.klab.org/archives/51196229.html</link>
<description>
Flex SDKのswfutilsでswfとXMLの相互変換を試してみる
で、swfxc.jarを作成し、SWFXからSWFへの変換を試してみたところ、上手くいきませんでした。
swfxc.jarのMain-ClassであるSwfxParserクラスを中心にFlex SDKのソースを読んで、swfxcが失敗する理由を探ってみました...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-07T14:55:02+09:00</dc:date>
<dc:subject>flash</dc:subject>
<content:encoded><![CDATA[<p>
<a href="http://dsas.blog.klab.org/archives/51195764.html">Flex SDKのswfutilsでswfとXMLの相互変換を試してみる</a>
で、swfxc.jarを作成し、SWFXからSWFへの変換を試してみたところ、上手くいきませんでした。
swfxc.jarのMain-ClassであるSwfxParserクラスを中心にFlex SDKのソースを読んで、swfxcが失敗する理由を探ってみました。
</p>

<h3>eclipseの準備</h3>
<p>
まず、eclipseの準備をします。準備の手順は
<a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/development/eclipse/readme.txt">
%FLEX_SDK%/development/eclipse/readme.txt
</a>
に書いてあります。importするプロジェクトを選択する画面で、flex-swfutilsを選択してください。他にcompiler等を選ぶことができます。
</p>

<h3>SwfxParser.javaの概観</h3>
<p>
SwfxParser#main()は、SwfxParserクラスのインスタンスを生成してparse()メソッドを呼んでいます。SwfxParser#parse()は、SAXParserのインスタンスを生成して、自身をイベントハンドラとしてSAXParser#parse()を呼んでいます。SwfxParserは、DefaultHandlerクラスのstartElement(), endElement(), endDocument()メソッドをオーバーライドして、SAXのイベントを処理しています。
</p>
<p>
startElement()は以下のようになっており、XMLエレメントの名前と同じ名前で、引数にAttributesクラスを取るメソッドを探して実行します。endElement()も、引数が空のメソッドを探す以外はstartElement()と同じです。例えば、&lt;DefineSprite&gt;タグを見つけるとSwfxParser#DefineSprite(Attributes attributes)が実行され、&lt;/DefineSprite&gt;を見つけるとSwfxParser#DefineSprite()が実行されることになります。
</p>
<pre class="prog">    public void startElement(String uri, String localName,
                             String qName, Attributes attributes)
            throws SAXException
    {
        try
        {
            Method method = getClass().getMethod(qName, new Class[]{Attributes.class});
            method.invoke(this, new Object[]{attributes});
        }
        catch (NoSuchMethodException e)
        {
            warning(new SAXParseException("no start handler for " + qName, locator));
        }
</pre>
<p>
これらのイベントハンドラは、基本的に、そのタグに対応するオブジェクトを生成してtagHandlerに渡します。SwfxParser#mainはtagHandlerにTagEncoderというswfバイナリを出力するクラスのオブジェクトを登録しているので、swfファイルが出力される事になります。
</p>
<p>
他に重要な部分に、SwfxParserのメンバ変数のdictとstackがあります。Define系タグを処理するときにdictにidとオブジェクトを記憶させておいて、後にPlaceObject等を処理するときにid経由で参照先を探すのに利用します。stackは、DefineShapeとlineやcurveのようにタグとデータ構造がツリー状になっているときに使います。親タグの開始時にstack.push()し、子データを処理するときにstack.peek()で参照した親にデータを登録し、親タグの終了時にstack.pop()します。
</p>

<h3>klab.swfxをswfに変換させてみる</h3>
<p>
と、SwfxParserが理解できたところで、何でklab.swfxからklab.swfが生成できなかったかを調べてみます。
例外ハンドラを幾つか追加して調べてみたところ、dictからid=3のオブジェクトを探して見つからないために、そこで終了していました。klab.swfxのなかでid=3のオブジェクトを探したところ、DefineTextでした。SwfxParser#DefineText()メソッドが無いために、dictにid=3のDefineTextオブジェクトが登録されておらず、エラーになっています。DefineTextの部分のswfxは次のようになっています。
</p>
<pre class="prog">  &lt;DefineText id='3' bounds='(106,414),(2570,1654)' matrix='t0,0'&gt;
    &lt;textRecord  font='Verdana' height='1620' yOffset='1620' color='#00000000'&gt;
      1+1152 
    &lt;/textRecord&gt;
  &lt;/DefineText&gt;
</pre>
<p>
DefineText以外にも大量にタグのハンドラが足りてない気がするのは無視して、とりあえずこのswfxのparseに挑戦します。
まず、&lt;textRecord&gt;に対応するSwfxParser#textRecord()を作ります。楽勝･･･と思いきや、<code>font='Verdana'</code>で引っかかりました。フォントは、DefineTextの前にDefineFont2タグで定義されており、id='2'が割り当てられています。idが一意なのに対してフォント名は一意ではないので、この部分はフォント名ではなくidを参照するべきです。とりあえず、その場しのぎでごまかしたものが次のコードになります。
</p>
<pre class="prog">    public void textRecord(Attributes attributes) throws SAXParseException
    {
    	TextRecord tr = new TextRecord();
    	String fontname = getAttribute(attributes, "font"); 
    	tr.setFont(dict.getFontFace(fontname, true, false)); // set dummy value to bold and italic.
    	tr.setHeight(parseInt(getAttribute(attributes, "height")));
    	tr.setY(parseInt(getAttribute(attributes, "yOffset")));
    	tr.setColor(parseColor(getAttribute(attributes, "color")));

    	DefineText dt = (DefineText)stack.peek();
    	dt.records.add(tr);
    }
    
    public void textRecord()
    {
    }
</pre>
<p>
次はSwfxParser#DefineText()です。これは特に引っかかることなく次のように実装しました。
</p>
<pre class="prog">    public void DefineText(Attributes attributes) throws SAXException
    {
    	DefineText dt = new DefineText(stagDefineText);
    	int id = parseInt(getAttribute(attributes, "id"));

    	dt.bounds = parseRect(getAttribute(attributes, "bounds"));
    	dt.matrix = parseMatrix(getAttribute(attributes, "matrix"));

    	createCharacter(id, dt);
    	stack.push(dt);
    }
    
    public void DefineText()
    {
    	DefineText dt = (DefineText)stack.pop();
    	tagHandler.defineText(dt);
    }
</pre>
<p>
これで動くか？と思ったら、まだダメでした。引っかかったのは<code>parseRect()</code>です。swfxを生成するときは、Rect#toString()を利用していて、swfxを読み込むときにはSwfxParser#parseRect()を利用しているのですが、Rect#toString()が状況によって2種類のフォーマットを使い分けて出力していて、SwfxParser#parseRect()はその片方にしか対応していないために、parseに失敗していました。
</p>
<p>
SwfxParser#parseRect()をRect#toString()にあわせて拡張したらまた先に進めるハズです。が、ここでキレました。そもそも、Rect#toString()があまりイケてません。しかも、<code>rect.equals(parseRect(rect.toString())) == true</code>を満たすようなparseRect()がSwfxParserのメソッドというのもどうかと思います。SwfxParser#parseRect()じゃなくてRect#fromString()であるべきでは無いでしょうか？せめて同じpackageにあるべきですよね？swfxのフォーマットも含めていろいろ修正したいです。
</p>
<p>
でも、Flex SDK プロジェクトと離れたところで頑張って修正するのももったいないです。ということで、Flex SDKを使ってSWF⇔XML相互変換は一旦あきらめます。これからは、swf弄りは今までどおりswfmillを使いつつ、Flex SDKに対してはプロジェクトのforumで議論してパッチ作成という形で参加して行こうと考えています。
</p>
<p>
結局こんなオチになってしまってすみません。Flex SDKプロジェクトでswfutils.jarへのAdobe外部からの貢献が多くなれば、AdobeもSWF File Format SpecificationのEULA（swfutils.jarの修正すら不可能）を変更してくれる気になるかもしれないので、swf関係者の皆さんも一緒にFlex SDKをハックしてみましょう。
</p>
<hr>
<div align="right">@methane</div>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51195764.html">
<title>Flex SDKのswfutilsでswfとXMLの相互変換を試してみる</title>
<link>http://dsas.blog.klab.org/archives/51195764.html</link>
<description>
SWFファイルフォーマットとライセンス（その２）
で、swfutils.jarがSWFとSWFXというXMLフォーマットで相互変換できそうだとお伝えしましたが、その後相互変換に挑戦してみた経過をまとめます。


Flex SDKの用意

svn trunkのFlex SDKを用意します。（多分、sdk/bra...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-06T17:52:08+09:00</dc:date>
<dc:subject>flash</dc:subject>
<content:encoded><![CDATA[<p>
<a href="http://dsas.blog.klab.org/archives/51194343.html">SWFファイルフォーマットとライセンス（その２）</a>
で、swfutils.jarがSWFとSWFXというXMLフォーマットで相互変換できそうだとお伝えしましたが、その後相互変換に挑戦してみた経過をまとめます。
</p>

<h3>Flex SDKの用意</h3>
<p>
svn trunkのFlex SDKを用意します。（多分、sdk/branches/3.0.x を利用してもこの記事で行っている範囲では同じだと思います）
</p>
<p>
今回の例では、Windows XPで、C:\usr\flexsdk にFlex SDKをインストールしますが、皆さんの好みで適当に読み替えてください。SubversionとJDKとantはインストールされて環境変数(%PATH%, %JAVA_HOME%, %ANT_HOME%等)は適当に設定されているものとします。
</p>
<pre class="terminal">C:\&gt;cd usr\
C:\usr&gt;svn co http://opensource.adobe.com/svn/opensource/flex/sdk/trunk flexsdk
C:\usr&gt;cd flexsdk
C:\usr\flexsdk&gt;ant
C:\usr\flexsdk&gt;set FLEX_SDK=C:\usr\flexsdk
C:\usr\flexsdk&gt;set PATH=%FLEX_SDK%\bin;%PATH%
</pre>

<h3>SWFからSWFXへの変換</h3>
<p>
この段階で、SWFからSWFXへの変換はできます。ためしに、弊社のTOPページで使われているFlashを解析してみます。http://www.klab.org/images/main.swf をダウンロードして、C:\work ディレクトリ内に保存してください。
</p>
<pre class="terminal">C:\usr\flexsdk&gt;cd C:\work
C:\work&gt;swfdump -out klab.swfx main.swf
</pre>
<p>
これで、klab.swfxという名前のXMLファイルができました。
</p>
<p>
ちなみに、ここでは%FLEX_SDK%/bin/swfdump.exeという実行ファイルを利用しましたが、同じディレクトリにシェルスクリプト版のswfdumpも用意されています。シェルスクリプトのソースを読めば、swfdumpで実際に実行されるのが、<code>java -jar %FLEX_SDK%/lib/swfdump.jar </code>であることが判ります。
</p>

<h3>swfxc.jarとswfxc.batの作成</h3>
<p>
今度はSWFXからSWFへの変換をしたいのですが、こちら側のコマンドはありません。ソースコードを読むと、SwfxParser.javaを使えばできそうなので、SWFXからSWFへの変換用のjarを作ってみます。
</p>
<p>
jarの名前は、SWFX Compilerの略で、swfxc.jarにしました。%FLEX_SDK%/modules/swfutils/build.xmlを修正して、swfxc.jarを作成するようにします。次のpatchを当ててから、もう一度antを実行すれば、%FLEX_SDK%/lib/swfxc.jarができあがります。
</p>
<pre class="prog">Index: build.xml
===================================================================
--- build.xml   (revision 751)
+++ build.xml   (working copy)
@@ -60,13 +60,24 @@
                 &lt;attribute name="Class-Path" value="asc.jar swfutils.jar"/&gt;
             &lt;/manifest&gt;
         &lt;/jar&gt;
-
+        &lt;echo message="Building lib/swfxc.jar"/&gt;
+        &lt;jar file="${lib.dir}/swfxc.jar" basedir="${module.src}" includes="flash/swf/tools/swfx.xsd"&gt;
+            &lt;manifest&gt;
+                &lt;attribute name="Sealed" value="${manifest.sealed}"/&gt;
+                &lt;attribute name="Implementation-Title" value="${manifest.Implementation-Title} - SWFx Compiler"/&gt;
+                &lt;attribute name="Implementation-Version" value="${manifest.Implementation-Version}.${build.number}"/&gt;
+                &lt;attribute name="Implementation-Vendor" value="${manifest.Implementation-Vendor}"/&gt;
+                &lt;attribute name="Main-Class" value="flash.swf.tools.SwfxParser"/&gt;
+                &lt;attribute name="Class-Path" value="asc.jar swfutils.jar"/&gt;
+            &lt;/manifest&gt;
+        &lt;/jar&gt;
     &lt;/target&gt;

     &lt;target name="clean" description="clean"&gt;
         &lt;delete failonerror="false" includeEmptyDirs="true"&gt;
             &lt;fileset file="${lib.dir}/swfutils.jar"/&gt;
             &lt;fileset file="${lib.dir}/swfdump.jar"/&gt;
+            &lt;fileset file="${lib.dir}/swfxc.jar"/&gt;
             &lt;fileset dir="${module.classes}"&gt;
                 &lt;include name="**/*"/&gt;
             &lt;/fileset&gt;
</pre>
<p>
このjarを直接叩いても良いのですが、面倒なので、batファイルを作成する事にします。次のようなbatファイルを、%FLEX_SDK%/bin/swfxc.batという名前で作成してください。
</p>
<pre class="prog">java -jar %FLEX_SDK%\lib\swfxc.jar -aspath . %1 %2 %3 %4 %5 %6 %7 %8 %9
</pre>
<p>
swfxc.batができたので、ためしに先ほど作成したklab.swfxをswfに戻してみます。swfxcは引数無しで実行してもusageを出したりしてくれないのですが、
<a href="http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/modules/swfutils/src/java/flash/swf/tools/SwfxParser.java">SwfxParser.java</a>
を読むと、入力ファイル名を引数で指定し、その拡張子を.swfに変更したものを出力することがわかります。ということで、実行してみましょう。
</p>
<pre class="terminal">C:\work&gt;swfxc klab.swfx
</pre>
<p>
･･･klab.swfができません。失敗です。
</p>
<p>(続く)</p>
<hr>
<div align="right">@methane</div>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51194781.html">
<title>ErlyWeb（その２）:テンプレートシステム</title>
<link>http://dsas.blog.klab.org/archives/51194781.html</link>
<description>ErlyWebはErlangで書かれたウェブのフレームワークです。ErlyWebはErlangのウェブアプリケーションであるYaws上で動作します。

今回は前回の続きの２回目でErlyWebのテンプレートを使ってみます。


	第1回:ErlyWebのインストール
	Windowsへのインストール手順を紹介...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-04T16:30:03+09:00</dc:date>
<dc:subject>Erlang</dc:subject>
<content:encoded><![CDATA[<a href="http://erlyweb.org/">ErlyWeb</a>は<a href="http://www.erlang.org/">Erlang</a>で書かれたウェブのフレームワークです。<a href="http://erlyweb.org/">ErlyWeb</a>は<a href="http://www.erlang.org/">Erlang</a>のウェブアプリケーションであるYaws上で動作します。<br>

今回は<a href="http://dsas.blog.klab.org/archives/51189138.html">前回</a>の続きの２回目でErlyWebのテンプレートを使ってみます。
<br>
<dl>
	<dt>第1回:<a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">ErlyWebのインストール</a></dt>
	<dd>Windowsへのインストール手順を紹介します。</dd>
	<dt>第2回:ErlyWebのテンプレートを使ってみる</dt>
	<dd>ErlyWebのテンプレートシステムを使って見ます。</dd>
	<dt>第3回:ErlyWebでmnesiaを使う</dt>

	<dd>Erlangのデータベース mnesia を使ってサンプルを動作させて見ます。</dd> 
</dl>
<p><a href="http://lab.klab.org/modules/mediawiki/index.php/ErlyWeb%E3%81%AE%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88">続きを読む</a></p>
<p>(セ)</p>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51194343.html">
<title>SWFファイルフォーマットとライセンス（その２）</title>
<link>http://dsas.blog.klab.org/archives/51194343.html</link>
<description>
少し前の話になりますが、とうとうFlex 3 SDKとAIR SDKが公開されました。既にお使いの方も多いかと思います。
さて、以前「SWFファイルフォーマットとライセンス」という記事を書いたのですが、Flex 3 SDKが公開されてどうなったかの続報をお伝えします。


まず、大...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-03-03T19:44:48+09:00</dc:date>
<dc:subject>flash</dc:subject>
<content:encoded><![CDATA[<p>
少し前の話になりますが、とうとうFlex 3 SDKとAIR SDKが公開されました。既にお使いの方も多いかと思います。
さて、以前<a href="http://dsas.blog.klab.org/archives/51167394.html">「SWFファイルフォーマットとライセンス」</a>という記事を書いたのですが、Flex 3 SDKが公開されてどうなったかの続報をお伝えします。
</p>
<p>
まず、大きな変更として、オープンソースな部分が増えました。Flex 2 SDKのときはFlex FrameworkのみがMPL(Mozilla Public License)だったのですが、Flex 3 SDKになって、コンパイラ、デバッガ、SWFライブラリ等もMPLになりました。<a href="http://opensource.adobe.com/">Adobe Open Source</a> に <a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex SDK">Flex SDK プロジェクト</a> があるので、詳しくはそちらをご覧下さい。「プロジェクトページなんてどうでも良い、早くソースを見せろ」という方は、<a href="http://opensource.adobe.com/svn/opensource/flex/sdk/">Flex SDK のsvnリポジトリ</a>が &lt;http://opensource.adobe.com/svn/opensource/flex/sdk/&gt; にあるので、svn coして下さい。
</p>
<p>
で、このリポジトリを探してみたのですが、残念ながらSWF Fileformat Specificationは含まれていませんでした。その代わりswfutils.jarが想像以上にすごい事が判りました。勝手にswfを生成するためのライブラリだと思っていたのですが、swfを読み込むこともできるのです。
</p>
<p>
flexsdkのbin/ディレクトリの中には、swfdumpという、swfファイルをswfxというXMLフォーマットでダンプするツールが含まれています。この実体は <a href="http://opensource.adobe.com/svn/opensource/flex/sdk/branches/3.0.x/modules/swfutils/src/java/flash/swf/tools/SwfxPrinter.java">flash.swf.tools.SwfPrinter#main()</a>になります。なんか、swfのリバースエンジニアリング大歓迎っていう感じのツールですね(笑)
</p>
<p>
flexsdkのbin/ディレクトリに含まれてはいないのですが、swfxからswfへの変換もswfutils.jarに含まれています。<a href="http://opensource.adobe.com/svn/opensource/flex/sdk/branches/3.0.x/modules/swfutils/src/java/flash/swf/tools/SwfxParser.java">flash.swf.tools.SwfParser#main()</a>が実体なので、
<pre class="terminal">
$ java -cp $FLEX_HOME/lib/swfutils.jar flash.swf.tools.SwfxParser test.swfx
</pre>
とすると実行することができます。が、実行してみようとしてみたところ、swfx.xsdというリソースの取得に失敗して止まってしまいます。swfx.xsd自体はflexsdk/modules/swfutils/src/java/flash/swf/tools/swfx.xsd にあるので、これからJavaとJarとAntを勉強してSwfxParserを使えるjarの作成に挑戦してみます。
</p>
<p>Flex SDKの中には、コンパイラやディスアセンブラ等色々含まれていますので、swf関係者(？)な方はぜひ覗いて見てください</p>
<hr>
<div align="right">@methane</div>]]>
</content:encoded>
</item>
<item rdf:about="http://dsas.blog.klab.org/archives/51191661.html">
<title>ユニバーサルトラックバックシステム</title>
<link>http://dsas.blog.klab.org/archives/51191661.html</link>
<description>
今日のネタは，思いつきで作ったWebアプリです．どういうものか一言でというと，野良トラックバックを実現するシステムです．

通常，ある URL にトラックバックを送信したいと思っても，送信先のページがトラックバックを受け付ける仕組みを持っていなければ，送信でき...</description>
<dc:creator>klab_gijutsu2</dc:creator>
<dc:date>2008-02-27T12:37:51+09:00</dc:date>
<dc:subject>trackback</dc:subject>
<content:encoded><![CDATA[<p>
今日のネタは，思いつきで作ったWebアプリです．どういうものか一言でというと，野良トラックバックを実現するシステムです．
</p><p>
通常，ある URL にトラックバックを送信したいと思っても，送信先のページがトラックバックを受け付ける仕組みを持っていなければ，送信できません．また，自分が管理するページでトラックバックを受け付けたいと思っても，CMS や Blog のシステムなどのような，トラックバック受信をする仕組みを持っていなければなりません．
</p><p>
このシステムでは，任意の URL に対するトラックバックを受け入れるためのものです．例えば http://www.klab.org/ にはトラックバックを受信するようにはなっていませんが，このシステムを使えば，http://www.klab.org/ を対象にトラックバックを送信できます．もちろん送信したトラックバックが http://www.klab.org/ の中で見えるようにはなるわけではありませんが，このシステムにアクセスすれば，http://www.klab.org/宛に受信したトラックバックの一覧が表示されます．
</p><p>
詳しくは<a href="http://trackback.lab.klab.org/">こちらからのユニバーサルトラックバックのページから</a>どうぞ．
</p><p>
一緒にもうひとつ．
</p><p>
ユニバーサルトラックバックシステムはトラックバックを受信するためのものですが，上記のページには逆にトラックバックを送るための Bookmarklet をあわせて紹介しています．
</p><p>
通常トラックバックを送信するには Blog のシステムの機能を使用しますが，この Bookmarklet を使えばもっと手軽に，Webブラウザの機能だけでトラックバックを送信できます．ですので，「あ，このページにこの前書いたあの記事からトラックバックを送信したいな」と思った場合でも，わざわざ Blog のシステムにログインしなくても，トラックバックを送信できます．
</p><p>
ただしトラックバックの送信先によっては，この Bookmarklet を使って送信したトラックバックは拒否されることもありますので，その点はご了承下さい．
</p>]]>
</content:encoded>
</item>

</rdf:RDF>