<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>ハタさんのブログ</title>
<link>http://blog.xole.net/index.php</link>
<pubDate>Sun, 07 Sep 2008 00:46:05 </pubDate>
<description>
ハタさんのブログ - RSS 2.0 (Really Simple Syndication).
</description>
<item>
<title>kunitさんと飲み</title>
<link>http://blog.xole.net/article.php?id=710</link>
<pubDate>Sun, 07 Sep 2008 00:46:05 +09:00</pubDate>
<description>
SeasarConferenceでしたが、ほぼ午前中の一コマとLTの途中からしかでてません。すいません。んで、夜になってから kunit さんとお話してきた。

話してきた内容ってのは、ほぼ僕が日頃気になっていることでして。
順不同...</description>
<content:encoded>
<![CDATA[<p>
<a href="http://event.seasarfoundation.org/sc2008autumn/">SeasarConference</a>でしたが、ほぼ午前中の一コマとLTの途中からしかでてません。すいません。<br />んで、夜になってから <a href="http://d.hatena.ne.jp/kunit/">kunit さん</a>とお話してきた。</p>

<p>話してきた内容ってのは、ほぼ僕が日頃気になっていることでして。<br />
順不同で抜粋すると</p>

<ul>
<li>設計勉強会について
  <ul>
  <li>設計勉強会いきたかったー</li>
  <li>てか、設計勉強会なのに、実装っぽい話題がトップはどうよ？</li>
  <li>しかし、PHPで設計勉強会というトピックがでてきたのは凄いこと</li>
  <li>2回め以降にも期待</li>
  </ul>
</li>
<li>もくもく会
  <ul>
  <li>もくもく会っていいっすね</li>
  <li>やっぱり少しでも集中する時間をどこかにあるといい</li>
  <li>わざわざもくもく会に参加するよりも、もくもくするだけなので、スタバでもいい。</li>
  </ul>
</li>
<li>RESTについて
  <ul>
  <li>RESTfulな設計って、クライアント側からみると、やっぱサーバは M(MVC的に考えて) だよね？んで、そこのフレームワークって煩雑すぎじゃね？</li>
  <li>REST的にリソースの国際化の概念てあるんすか？(http://jp.hoge.com/ と http://hoge.com/jp/の違いってどうなる？)</li>
  <li>RESTfulなフレームワークってどんなのっすか？</li>
  <li>PHPはステートフルにするほうが難しいじゃん</li>
  </ul>
</li>
<li>symfonyについて
  <ul>
  <li>やっぱPropelてアレですよねぇ</li>
  <li>sfBrowserはよく出来てる仕組みだと思うけど、やっぱ Unit なんですよね...</li>
  <li>selenuimも結局ブラウザな...</li>
  <li>S2Dao の Lite 実装な話題とか(これは twitter だっけ?) の続き</li>
  </ul>
</li>
<li>DBレイヤーとかDBアクセスとかについて
  <ul>
  <li>propel てやっぱり、なんとなく古いよーな(やっぱり torque なんだよね)</li>
  <li>どう抽象化する？</li>
  <li>抽象化とパフォーマンスはホントにトレードオフか</li>
  <li>drupal は、ほぼ全てが関数ベースだけど、ネーミングルールだけで上手いことモジュール分けができてる。パフォーマンスはそんなに悪くないんす</li>
  <li>でも、ま、ふつーはクラスベースですよね。</li>
  <li>RDB(というかTable)に国際化の概念てどうする(ja/enは分けてない?)</li>
  </ul>
</li>
<li>テストについて
  <ul>
  <li>テストどうしてます？</li>
  <li>AcceptanceTest がしやすい仕組みのフレームワークとか</li>
  <li>お客さんと意識合わせができて、テストもそのままできると便利なのは分かってるけど、ツール無いっす</li>
  <li>やっぱExcelで管理できると便利よねー(国内は)</li>
  <li>S2Buri とか JBoss Rule な話とか</li>
  </ul>
</li>
<li>ほか
  <ul>
  <li>コンテナ世代と密結合世代</li>
  <li>AOPとかフレームワークを(作ったりとかして)知ると別の視点が見えてくる</li>
  <li>ぶっちゃけ Maple4 はいつでるんすか？</li>
  <li>何かのニーズがあるけど、何かとニッチな事について</li>
  <li>ビューとかレイヤーとかブロックみたいのとか</li>
  <li>5.3はホントに5.3ていうバージョンでいいのか(笑)</li>
  </ul>
</li>
<li>色々雑談とか</li>
</ul>

<p>ってことで、細かい部分の内容は忘れた。(しかも、上のは主がどっちかわかりずらいし...)<br />でも、PHP っぽい話とは少し違って、設計とかその辺の情報を少し交換できたのはよかった。<br />ここでゲットした情報は少しずつ展開していきたいと思います。為になります。</p>

<p>でも、やっぱり僕はPropelが苦手です</p>]]>
</content:encoded>
</item><item>
<title>Symfony で ActionScript(AMF) と通信する</title>
<link>http://blog.xole.net/article.php?id=709</link>
<pubDate>Thu, 04 Sep 2008 01:54:13 +09:00</pubDate>
<description>PHP と ActionScript が通信するためのライブラリとして AMFPHP とかが有名ですが、名前空間とかライセンスとか色々な部分が気になるので、SabreAMF を Symfony に乗っけて動かしてみるテスト

ちなみに、...</description>
<content:encoded>
<![CDATA[<p>PHP と ActionScript が通信するためのライブラリとして <a href="http://www.amfphp.org/">AMFPHP</a> とかが有名ですが、名前空間とかライセンスとか色々な部分が気になるので、<a href="http://osflash.org/sabreamf">SabreAMF</a> を Symfony に乗っけて動かしてみるテスト</p>

<p>ちなみに、既に <a href="http://www.symfony-project.org/plugins/sfAmfPlugin">sfAMFPlugin</a> っていうプラギンも同様のアプローチなのですが、こいつだと README に書いてあるコードが何故か動かないです。<br />
↓こんなの</p>

<pre class="php">
<span class="keyword" >class</span> amfAMFAction <span class="keyword" >extends</span> sfAction
{
  <span class="keyword" >public</span> <span class="keyword" >function</span> execute(<span class="vars" >$request</span>)
  {
    <span class="vars" >$this</span>-&gt;setLayout(false);

    <span class="vars" >$gateway</span> = <span class="keyword" >new</span> sfAmfGateway;
    <span class="vars" >$response</span> = sfContext::getInstance()-&gt;getResponse();
    <span class="vars" >$response</span>-&gt;setContent(<span class="vars" >$gateway</span>-&gt;service());
    <span class="keyword" >return</span> sfView::NONE;
  }
}</pre>

<p>上記コードだと、SabreAMF_Server の __construct 中にある</p>

<pre class="php">
<span class="keyword" >public</span> <span class="keyword" >function</span> __construct() {

   <span class="vars" >$data</span> = <span class="func" >file_get_contents</span>(<span class="string" >'php://input'</span>);
   <span class="keyword" >if</span> (!<span class="vars" >$data</span>) <span class="keyword" >throw</span> <span class="keyword" >new</span> Exception(<span class="string" >'No valid AMF request received'</span>);
   :
   :
   :</pre>

<p>のコードにて、<code>if(!$data)</code> の評価に失敗して例外となるようです。<br />
詳しい原因は掴んでいないですが、どうも <code>ob_start()</code> が関係している様子(素で通信したときと、上記コードで動かしたときとだと、content-length が結構違うってのも気になりますが...)</p>

<pre class="php">
<span class="keyword" >function</span> hoge(){
    <span class="vars" >$data</span> = <span class="func" >file_get_contents</span>(<span class="string" >'php://input'</span>);
    <span class="keyword" >if</span>(!<span class="vars" >$data</span>) {
        <span class="func" >echo</span> <span class="string" >'hello world'</span>;
    } <span class="keyword" >else</span> {
        <span class="func" >echo</span> <span class="string" >'no valid'</span>;
    }
}

<span class="comment" >// ob_start();</span>
ob_start(<span class="string" >''</span>);

hoge();
<span class="vars" >$result</span> = ob_get_contents();
ob_clean();

assert(<span class="vars" >$result</span> == <span class="string" >'hello world'</span>); </pre>

<p>タイミングなのかなんなのかわからないですが、ob_start() と ob_start('') の動きが微妙に違うらしい<br />
(てか、似たようなのがあった - <a href="http://d.hatena.ne.jp/e-kuroda/20070818/1187446917">IE6でダウンロード - ekurodaの日記</a>)</p>

<p>(中略)</p>

<p>ということで、Controller を作って、そこでやってしまうことにした。<br />
例外処理とかも結構ハンドリングできるようになって便利。</p>

<pre class="php">
<span class="keyword" >class</span> fmServiceController <span class="keyword" >extends</span> sfFrontWebController
{
  <span class="keyword" >public</span> <span class="keyword" >function</span> forward(<span class="vars" >$moduleName</span>, <span class="vars" >$actionName</span>, <span class="vars" >$parameters</span> = <span class="keyword" >array</span>())
  {
     :
     : <span class="comment" >// 何か色々書く</span>
     :
    <span class="vars" >$actionInstance</span> = <span class="vars" >$this</span>-&gt;getAction(<span class="vars" >$moduleName</span>, <span class="vars" >$actionName</span>);
     :
     : <span class="comment" >// もう少し書く</span>
     :
    <span class="vars" >$server</span> = <span class="keyword" >new</span> SabreAMF_CallbackServer;
    <span class="vars" >$server</span>-&gt;onInvokeService = <span class="keyword" >array</span>(<span class="vars" >$actionInstance</span>, <span class="string" >'service'</span>);
    <span class="vars" >$server</span>-&gt;<span class="func" >exec</span>();
  }
}</pre>

<p>んで、Action とか</p>

<pre class="php">
<span class="keyword" >class</span> amfAction <span class="keyword" >extends</span> fmServiceAction
{
  <span class="keyword" >public</span> <span class="keyword" >function</span> service(<span class="vars" >$service</span>, <span class="vars" >$method</span>, <span class="vars" >$data</span>)
  {
    :
    : <span class="comment" >// 色々やって</span>
    :
    <span class="keyword" >return</span> <span class="vars" >$results</span>;
  }
}</pre>

<p>こんな感じ。</p>

<p>routing.ymlとかはこんな感じでいけるかな</p>
<pre class="php">amf_request:
  url: /:module/gateway.amf
  param: {action: amf}

json_request:
  url: /:module/:id.json
  param: {action: json}
</pre>

<p>また、ActionScript 自体はこんなもので試してみました。</p>

<pre class="java">&lt;?xml version=<span class="string" >"1.0"</span> encoding=<span class="string" >"utf-8"</span>?&gt;
&lt;mx:Application xmlns:mx=<span class="string" >"http://www.adobe.com/2006/mxml"</span> initialize=<span class="string" >"init()"</span>&gt;
    &lt;mx:Script&gt;
        &lt;![CDATA[
        <span class="keyword" >import</span> mx.controls.Alert;
        <span class="keyword" >import</span> mx.collections.ArrayCollection;
        <span class="keyword" >import</span> mx.rpc.events.ResultEvent;
        <span class="keyword" >import</span> flash.net.NetConnection;
        <span class="keyword" >import</span> flash.net.Responder;
        <span class="keyword" >import</span> flash.net.ObjectEncoding;
        <span class="keyword" >import</span> mx.utils.ObjectUtil;

        <span class="keyword" >private</span> function init():<span class="keyword" >void</span> {
            var connection:NetConnection = <span class="keyword" >new</span> NetConnection;
            connection.objectEncoding = ObjectEncoding.AMF3;
            connection.addEventListener(NetStatusEvent.NET_STATUS, function(e:NetStatusEvent):<span class="keyword" >void</span> {
               trace(ObjectUtil.toString(e));
            });
            connection.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):<span class="keyword" >void</span> {
                trace(ObjectUtil.toString(e));
            });
            connection.addEventListener(AsyncErrorEvent.ASYNC_ERROR, function(e:AsyncErrorEvent):<span class="keyword" >void</span> {
                trace(ObjectUtil.toString(e));
            });

            connection.connect(<span class="string" >'http://test.server/service_dev.php/hoge/gateway.amf'</span>);
            connection.call(<span class="string" >'HelloWorld.getData'</span>, <span class="keyword" >new</span> Responder(onResult, onFault));
            connection.close();
        }
        <span class="keyword" >private</span> function onResult(result:Object):<span class="keyword" >void</span> {
            dataGrid.dataProvider = <span class="keyword" >new</span> ArrayCollection;
            <span class="keyword" >for</span>(var i:uint = <span class="number" >0</span>; i &lt; result.length; ++i){
                dataGrid.dataProvider.addItem({
                    <span class="string" >'AAA'</span>: result[i].AAA,
                    <span class="string" >'BBB'</span>: result[i].BBB,
                    <span class="string" >'CCC'</span>: result[i].CCC
                });
            }
        }
        <span class="keyword" >private</span> function onFault(fault:Object):<span class="keyword" >void</span> {
            trace(ObjectUtil.toString(fault));
        }
        ]]&gt;
    &lt;/mx:Script&gt;
    &lt;mx:Panel layout=<span class="string" >"absolute"</span>&gt;
        &lt;mx:DataGrid id=<span class="string" >"dataGrid"</span>&gt;
            &lt;mx:columns&gt;
                &lt;mx:DataGridColumn headerText=<span class="string" >"aaa"</span> dataField=<span class="string" >"AAA"</span>/&gt;
                &lt;mx:DataGridColumn headerText=<span class="string" >"bbb"</span> dataField=<span class="string" >"BBB"</span>/&gt;
                &lt;mx:DataGridColumn headerText=<span class="string" >"ccc"</span> dataField=<span class="string" >"CCC"</span>/&gt;
            &lt;/mx:columns&gt;
        &lt;/mx:DataGrid&gt;
    &lt;/mx:Panel&gt;
&lt;/mx:Application&gt;
</pre>

<p>とりあえず、<code>ob_start</code> 中(?)の <code>php://input</code> 値が取得できるようになるまで、これで進めることにする。</p>]]>
</content:encoded>
</item><item>
<title>syslog にログを叩き込む</title>
<link>http://blog.xole.net/article.php?id=708</link>
<pubDate>Thu, 28 Aug 2008 23:02:47 +09:00</pubDate>
<description>phpのsyslog関数だと、リモートのsyslogサーバに書き込めない(?)ので、こんな感じで逃げるテスト


class LoggerSyslog {

    private $ident;
    private $opt...</description>
<content:encoded>
<![CDATA[<p>phpのsyslog関数だと、リモートのsyslogサーバに書き込めない(?)ので、こんな感じで逃げるテスト</p>

<pre class="php">
<span class="keyword" >class</span> LoggerSyslog {

    <span class="keyword" >private</span> <span class="vars" >$ident</span>;
    <span class="keyword" >private</span> <span class="vars" >$opt</span>;
    <span class="keyword" >private</span> <span class="vars" >$facility</span>;

    <span class="keyword" >private</span> <span class="vars" >$ip</span> = <span class="string" >'127.0.0.1'</span>;
    <span class="keyword" >private</span> <span class="vars" >$port</span> = 514;

    <span class="keyword" >public</span> <span class="keyword" >function</span> __construct(<span class="vars" >$ident</span>, <span class="vars" >$opt</span>, <span class="vars" >$facility</span>){
        <span class="vars" >$this</span>-&gt;ident = <span class="vars" >$ident</span>;
        <span class="vars" >$this</span>-&gt;opt = <span class="vars" >$opt</span>;
        <span class="vars" >$this</span>-&gt;facility = <span class="vars" >$facility</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> setIp(<span class="vars" >$ip</span>){
        <span class="vars" >$this</span>-&gt;ip = <span class="vars" >$ip</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> setPort(<span class="vars" >$port</span>){
        <span class="vars" >$this</span>-&gt;port = <span class="vars" >$port</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> write(<span class="vars" >$message</span>, <span class="vars" >$priority</span>){
        <span class="vars" >$socket</span> = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        socket_set_nonblock(<span class="vars" >$socket</span>);
        <span class="keyword" >if</span>(socket_connect(<span class="vars" >$socket</span>, <span class="vars" >$this</span>-&gt;ip, <span class="vars" >$this</span>-&gt;port)){
            <span class="comment" >//$data = '&lt;' . ($this-&gt;facility | $priority) . '&gt;' . $this-&gt;ident . ': ' . $message;</span>
            <span class="vars" >$data</span> = <span class="string" >'&lt;'</span> . self::makePriority(<span class="vars" >$this</span>-&gt;facility, <span class="vars" >$priority</span>) . <span class="string" >'&gt;'</span> . <span class="vars" >$this</span>-&gt;ident . <span class="string" >': '</span> . <span class="vars" >$message</span>;
            socket_write(<span class="vars" >$socket</span>, <span class="vars" >$data</span>, <span class="func" >strlen</span>(<span class="vars" >$data</span>));
        }
        socket_close(<span class="vars" >$socket</span>);
    }

    <span class="keyword" >private</span> <span class="keyword" >static</span> <span class="keyword" >function</span> makePriority(<span class="vars" >$facility</span>, <span class="vars" >$priority</span>){
        <span class="keyword" >return</span> (<span class="vars" >$facility</span> &amp; SyslogFacility::LOG_FACMASK) | <span class="vars" >$priority</span>;
    }

}</pre>

<p>んで、facility は何かってーと、これ</p>

<pre class="php">
<span class="keyword" >interface</span> SyslogFacility {
    <span class="comment" >// kernel messages</span>
    <span class="keyword" >const</span> LOG_KERN = 0;
    <span class="comment" >// random user-level messages(1 &lt;&lt; 3)</span>
    <span class="keyword" >const</span> LOG_USER = 8;
    <span class="comment" >// mail system(2&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_MAIL = 16; 
    <span class="comment" >// system daemons(3&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_DAEMON = 24;
    <span class="comment" >// security/authorization(4&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_AUTH = 32;
    <span class="comment" >// internal syslogd use(5&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_SYSLOG = 40;
    <span class="comment" >// line printer subsystem(6&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LPR = 48;
    <span class="comment" >// network news subsystem(7&lt;&lt;3)</span>

    <span class="keyword" >const</span> LOG_NEWS = 56;
    <span class="comment" >// UUCP subsystem(8&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_UUCP = 64;
    <span class="comment" >// clock daemon(15&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_CRON = 120;
    
    <span class="comment" >// reserved for local use(16&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL0 = 128;
    <span class="comment" >// reserved for local use(17&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL1 = 136;
    <span class="comment" >// reserved for local use(18&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL2 = 144;
    <span class="comment" >// reserved for local use(19&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL3 = 152;
    <span class="comment" >// reserved for local use(20&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL4 = 160;
    <span class="comment" >// reserved for local use(21&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL5 = 168;
    <span class="comment" >// reserved for local use(22&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL6 = 176;
    <span class="comment" >// reserved for local use(23&lt;&lt;3)</span>
    <span class="keyword" >const</span> LOG_LOCAL7 = 184;
    
    <span class="comment" >// mask to extract facility</span>
    <span class="keyword" >const</span> LOG_FACMASK = 0x03F8;
}
</pre>

<p>同様に、priority はこんなの</p>

<pre class="php">
<span class="keyword" >interface</span> SyslogPriority {
    <span class="comment" >// system is unusable</span>
    <span class="keyword" >const</span> LOG_EMERG = 0;
    <span class="comment" >// action must be taken immediately</span>
    <span class="keyword" >const</span> LOG_ALERT = 1;
    <span class="comment" >// critical conditions</span>
    <span class="keyword" >const</span> LOG_CRIT = 2;
    <span class="comment" >// error conditions</span>
    <span class="keyword" >const</span> LOG_ERR = 3;
    <span class="comment" >// warning conditions</span>
    <span class="keyword" >const</span> LOG_WARNING = 4;
    <span class="comment" >// normal but significant condition</span>
    <span class="keyword" >const</span> LOG_NOTICE = 5;
    <span class="comment" >// informational</span>
    <span class="keyword" >const</span> LOG_INFO = 6;
    <span class="comment" >// debug-level messages</span>
    <span class="keyword" >const</span> LOG_DEBUG = 7;
    <span class="comment" >// mask to extract priority</span>
    <span class="keyword" >const</span> LOG_PRIMASK = 0x0007;
}</pre>

<p>これだけで使うのなら、こうなる</p>

<pre class="php">
<span class="vars" >$syslog</span> = <span class="keyword" >new</span> LoggerSyslog(<span class="string" >'syslogtest'</span>, null, SyslogFacility::LOG_USER);
<span class="vars" >$syslog</span>-&gt;write(<span class="string" >'hoge foo bar'</span>, SyslogPriority::LOG_INFO);
</pre>

<p>もし、<a href="http://coderepos.org/share/browser/lang/php/misc/Logging">Appenderが必要なLogger</a>の場合、こんなAppenderを用意すればいいかと</p>

<pre class="php">
<span class="keyword" >class</span> SyslogAppender <span class="keyword" >implements</span> Appender {

    <span class="keyword" >private</span> <span class="vars" >$ident</span>;
    <span class="keyword" >private</span> <span class="vars" >$opt</span>;
    <span class="keyword" >private</span> <span class="vars" >$facility</span>;

    <span class="keyword" >private</span> <span class="vars" >$ip</span> = <span class="string" >'127.0.0.1'</span>;
    <span class="keyword" >private</span> <span class="vars" >$port</span> = 514;

    <span class="keyword" >public</span> <span class="keyword" >function</span> __construct(<span class="vars" >$ident</span>, <span class="vars" >$opt</span>, <span class="vars" >$facility</span>){
        <span class="vars" >$this</span>-&gt;ident = <span class="vars" >$ident</span>;
        <span class="vars" >$this</span>-&gt;opt = <span class="vars" >$opt</span>;
        <span class="vars" >$this</span>-&gt;facility = <span class="vars" >$facility</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> setIp(<span class="vars" >$ip</span>){
        <span class="vars" >$this</span>-&gt;ip = <span class="vars" >$ip</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> setPort(<span class="vars" >$port</span>){
        <span class="vars" >$this</span>-&gt;port = <span class="vars" >$port</span>;
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> append(LoggingEvent <span class="vars" >$event</span>){
        <span class="vars" >$level</span> = <span class="vars" >$event</span>-&gt;getLevel();
        <span class="vars" >$priority</span> = SyslogPriority::LOG_PRIMASK;
        <span class="keyword" >switch</span>(<span class="vars" >$level</span>-&gt;toInt()){
        <span class="keyword" >case</span> LogLevel::ALL_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_EMERG;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::DEBUG_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_DEBUG;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::INFO_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_DEBUG;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::WARN_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_WARNING;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::ERROR_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_ERR;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::FATAL_INT:
            <span class="vars" >$priority</span> = SyslogPriority::LOG_CRIT;
            <span class="keyword" >break</span>;
        <span class="keyword" >case</span> LogLevel::OFF_INT:
        <span class="keyword" >default</span>:
            <span class="keyword" >return</span>;
        }
        <span class="vars" >$this</span>-&gt;write(<span class="vars" >$event</span>-&gt;getMessage(), <span class="vars" >$priority</span>);
    }

    <span class="keyword" >public</span> <span class="keyword" >function</span> write(<span class="vars" >$message</span>, <span class="vars" >$priority</span>){
        <span class="vars" >$socket</span> = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        socket_set_nonblock(<span class="vars" >$socket</span>);
        <span class="keyword" >if</span>(socket_connect(<span class="vars" >$socket</span>, <span class="vars" >$this</span>-&gt;ip, <span class="vars" >$this</span>-&gt;port)){
            <span class="vars" >$data</span> = <span class="string" >''</span>;
            <span class="vars" >$data</span> .= <span class="string" >'&lt;'</span> . self::makePriority(<span class="vars" >$this</span>-&gt;facility, <span class="vars" >$priority</span>) . <span class="string" >'&gt;'</span>;
            <span class="vars" >$data</span> .=  <span class="vars" >$this</span>-&gt;ident . <span class="string" >': '</span> . <span class="vars" >$message</span>;
            socket_write(<span class="vars" >$socket</span>, <span class="vars" >$data</span>, <span class="func" >strlen</span>(<span class="vars" >$data</span>));
        }
        socket_close(<span class="vars" >$socket</span>);
    }

    <span class="keyword" >private</span> <span class="keyword" >static</span> <span class="keyword" >function</span> makePriority(<span class="vars" >$facility</span>, <span class="vars" >$priority</span>){
        <span class="keyword" >return</span> (<span class="vars" >$facility</span> &amp; SyslogFacility::LOG_FACMASK) | <span class="vars" >$priority</span>;
    }

}</pre>

<p>このケースだとこんな風になる($identはlogger::nameでもいいのかも)</p>

<pre class="php">
<span class="vars" >$logger</span> = <span class="keyword" >new</span> Logger;

<span class="vars" >$logger</span>-&gt;addAppender(<span class="keyword" >new</span> SyslogAppender(<span class="string" >'logsample'</span>, 0, SyslogFacility::LOG_USER));
<span class="vars" >$logger</span>-&gt;info(<span class="string" >'%s %s %d'</span>, <span class="string" >'hello'</span>, <span class="string" >'world'</span>, 777);
</pre>

<p>やっぱログは、ログの集計とか面倒だからどこかのリモートログサーバに書き込んで、そこで一元管理したいよね。っていうお話し。<br />
syslog-ngなんかを立てて、そこに叩き込めばなんとかならないかな?(TCPもあることだし)</p>]]>
</content:encoded>
</item><item>
<title>Testing_FIT を試す</title>
<link>http://blog.xole.net/article.php?id=707</link>
<pubDate>Thu, 14 Aug 2008 22:36:38 +09:00</pubDate>
<description>Acceptance Testの為にTesting_FITを使ってみた。

UnitTestのツールは沢山あるけど、AcceptanceTestという形で探すと、なかなか少ないもんです。
少し前の記事だと、GANCHIKU.com &amp;...</description>
<content:encoded>
<![CDATA[<p>Acceptance Testの為に<a href="http://pear.php.net/package/Testing_FIT">Testing_FIT</a>を使ってみた。</p>

<p>UnitTestのツールは沢山あるけど、AcceptanceTestという形で探すと、なかなか少ないもんです。<br />
少し前の記事だと、<a href="http://www.ganchiku.com/2007/06/using_testing_fit.html">GANCHIKU.com &raquo; Testing_FITを使ってみる。</a>があったけど、少し状況が変わっているみたいなので、それまでのログ</p>

<h3>インストール</h3>
<p>まだ、stable リリースが行われていないので、beta 版のインストールを行うことにする</p>

<pre class="javascript">yusuke.hata.local: ~&gt; sudo pear install channel:<span class="comment" >//pear.php.net/Testing_FIT-0.2.2</span>
downloading Testing_FIT-0.2.2.tgz ...
Starting to download Testing_FIT-0.2.2.tgz (29,584 bytes)
.........done: 29,584 bytes

install ok: channel:<span class="comment" >//pear.php.net/Testing_FIT-0.2.2</span>
</pre>

<h3>ディレクトリ構成</h3>
<pre>
fit/
 + fixture/
     + CalculateDiscount.php
 + spec/
     + CalculateDiscount.html
 + impl/
     + Discount.php
     + SampleDiscount.php
</pre>

<h3>HTML用意</h3>

<p>テストをこなす上で、その仕様が書かれたHTMLを用意します。これは僕等開発者が用意するんではなく、お客さんとかに用意してもらうらしい。</p>

<pre class="javascript">&lt;!DOCTYPE html <span class="keyword" >public</span> <span class="string" >"-//w3c//dtd html 4.0 transitional//en"</span>&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;TestCase1&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;td colspan=<span class="string" >"2"</span>&gt;CalculateDiscount&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;amount&lt;/td&gt;
                &lt;td&gt;discount()&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;0.00&lt;/td&gt;
                &lt;td&gt;0.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;100.00&lt;/td&gt;
                &lt;td&gt;0.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;999.00&lt;/td&gt;
                &lt;td&gt;0.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;1000.00&lt;/td&gt;
                &lt;td&gt;0.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;1010.00&lt;/td&gt;
                &lt;td&gt;50.50&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;1100.00&lt;/td&gt;
                &lt;td&gt;55.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;1200.00&lt;/td&gt;
                &lt;td&gt;60.00&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;2000.00&lt;/td&gt;
                &lt;td&gt;100.00&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/table&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>

<p>&lt;table&gt; タグの一行めに書かれた(上の例だとCalculateDiscount) Fixture が、実行される Fixture というネーミングルールになる<br />
つまり、CalculateDiscount という Fixture クラスを作成しなければならない</p>

<p>また、データ項目の宣言は Fixture の次の行に行う(ここでは、amount と discount)<br />
&lt;th&gt; タグで宣言せずに、&lt;td&gt; タグとして宣言すること</p>

<h3>Fixture 作成</h3>

<p>実際のテストを行うFIT。public でプロパティを設定しているけど、ここには、HTML上のデータがマッピングされる</p>

<pre class="php">&lt;?php
 
<span class="keyword" >class</span> CalculateDiscount <span class="keyword" >extends</span> Testing_FIT_Fixture_Column {
    <span class="comment" >/**
     * @var string
     */</span>
    <span class="keyword" >public</span> <span class="vars" >$amount</span>;

    <span class="keyword" >private</span> <span class="vars" >$discount</span>;

    <span class="keyword" >public</span> <span class="keyword" >function</span> __construct(){
        parent::__construct();
        <span class="vars" >$this</span>-&gt;discount = <span class="keyword" >new</span> SampleDiscount;
    }

    <span class="comment" >/**
     * @return string
     */</span>
    <span class="keyword" >public</span> <span class="keyword" >function</span> discount(){
        <span class="keyword" >return</span> <span class="vars" >$this</span>-&gt;discount-&gt;getDiscount(<span class="vars" >$this</span>-&gt;amount);
    }
}</pre>

<p>今回は、SampleDiscount の実装クラスを利用してテストを行う<br />
html 上 &lt;td&gt; で書かれた項目名と同じプロパティを Fixtrue クラス内に宣言し、<br />
プロパティドキュメントに @var 宣言を行って、型のタイプを記述する</p>

<p>また、項目名の最後に <code>( )</code> と記述されているものは、処理メソッドになるので、public のメソッドとして宣言し、値を返却する<br />
メソッドドキュメントとして、@return 宣言を行い、型のタイプを記述する</p>

<h3>実装クラス定義</h3>

<p>こんなのを用意した</p>
<pre class="php">&lt;?php

<span class="keyword" >interface</span> Discount {
    <span class="keyword" >public</span> <span class="keyword" >function</span> getDiscount(<span class="vars" >$amount</span> = <span class="string" >'0.00'</span>);
}
</pre>

<pre class="php">&lt;?php

<span class="keyword" >class</span> SampleDiscount <span class="keyword" >implements</span> Discount {
    <span class="keyword" >public</span> <span class="keyword" >function</span> getDiscount(<span class="vars" >$amount</span> = <span class="string" >'0.00'</span>){
        <span class="keyword" >return</span> null;
    }
}
</pre>


<h3>runner作成</h3>

<p>ちょっと汚いが、こんな感じで runner を用意</p>

<pre class="php">&lt;?php
<span class="func" >ini_set</span>(<span class="string" >'display_errors'</span>, 0);
<span class="keyword" >require_once</span> <span class="string" >'Testing/FIT/Loader.php'</span>;

Testing_FIT_Loader::loadClass(<span class="string" >'Testing_FIT_Fixture'</span>, <span class="string" >'Testing_FIT_Runner'</span>);
Testing_FIT_Loader::loadClass(<span class="string" >'Testing_FIT_Fixture_Column'</span>);

Testing_FIT_Loader::addClassDir(dirname(<span class="keyword" >__FILE__</span>) . <span class="string" >'/impl'</span>);
Testing_FIT_Loader::addClassDir(dirname(<span class="keyword" >__FILE__</span>) . <span class="string" >'/fixture'</span>);
Testing_FIT_Loader::loadClass(<span class="string" >'CalculateDiscount'</span>, <span class="string" >'Discount'</span>, <span class="string" >'SampleDiscount'</span>);

<span class="vars" >$runner</span> = <span class="keyword" >new</span> Testing_FIT_Runner;
<span class="vars" >$iter</span> = <span class="keyword" >new</span> RecursiveIteratorIterator(<span class="keyword" >new</span> RecursiveDirectoryIterator(dirname(<span class="keyword" >__FILE__</span>) . <span class="string" >'/spec'</span>));
<span class="keyword" >foreach</span>(<span class="vars" >$iter</span> <span class="keyword" >as</span> <span class="vars" >$file</span>){
    <span class="keyword" >if</span>(<span class="vars" >$file</span>-&gt;isDir()){
        <span class="keyword" >continue</span>;
    }
    <span class="vars" >$path</span> = <span class="vars" >$file</span>-&gt;getPathName();
    <span class="vars" >$runner</span>-&gt;run(<span class="vars" >$path</span>, <span class="string" >'-'</span>);
}
</pre>

<p>runメソッドの第二引数に '-' と指定しているのは、output の出力を行わない(?) という指定になる。</p>

<h3>実行</h3>

<p>このままでは、実行しても失敗となる</p>
<a href="http://blog.xole.net/resources/16.jpg">
<img src="http://blog.xole.net/resources/16.jpg" />
</a>


<h3>Sampleクラスの修正</h3>
<p>本来なら、これを修正する時点でおかしい気がするが、まぁ、サンプルなのでクラスの修正を行って動きを確認</p>

<pre class="php">&lt;?php

<span class="keyword" >class</span> SampleDiscount <span class="keyword" >implements</span> Discount {
    <span class="keyword" >public</span> <span class="keyword" >function</span> getDiscount(<span class="vars" >$amount</span> = <span class="string" >'0.00'</span>){
        <span class="keyword" >return</span> <span class="string" >'0.00'</span>;
    }
}
</pre>

<p>これを実行すると、以下のように色付けが変更される</p>

<p>
<a href="http://blog.xole.net/resources/17.jpg">
<img src="http://blog.xole.net/resources/17.jpg" />
</a>
</p>

<p>最終的に以下のように修正し、すべて期待通りの動きと確認されたらOK(サンプルなので、実際はちゃんとレビューとかしないといけないけど)</p>

<pre class="php">&lt;?php

<span class="keyword" >class</span> SampleDiscount <span class="keyword" >implements</span> Discount {
    <span class="keyword" >private</span> <span class="vars" >$results</span> = <span class="keyword" >array</span>(
        <span class="string" >'1010.00'</span> =&gt; <span class="string" >'50.50'</span>,
        <span class="string" >'1100.00'</span> =&gt; <span class="string" >'55.00'</span>,
        <span class="string" >'1200.00'</span> =&gt; <span class="string" >'60.00'</span>,
        <span class="string" >'2000.00'</span> =&gt; <span class="string" >'100.00'</span>
    );
    <span class="keyword" >public</span> <span class="keyword" >function</span> getDiscount(<span class="vars" >$amount</span> = <span class="string" >'0.00'</span>){
        <span class="keyword" >if</span>(<span class="func" >is_null</span>(<span class="vars" >$amount</span>) || !<span class="func" >is_string</span>(<span class="vars" >$amount</span>) || !<span class="func" >is_numeric</span>(<span class="vars" >$amount</span>)){
            <span class="keyword" >return</span> <span class="string" >'0.00'</span>;
        }
        <span class="keyword" >if</span>(!isset(<span class="vars" >$this</span>-&gt;results[<span class="vars" >$amount</span>])){
            <span class="keyword" >return</span> <span class="string" >'0.00'</span>;
        }
        <span class="keyword" >return</span> <span class="vars" >$this</span>-&gt;results[<span class="vars" >$amount</span>];
    }   
}
</pre>

<p>
<a href="http://blog.xole.net/resources/18.jpg">
<img src="http://blog.xole.net/resources/18.jpg" />
</a>
</p>


<h3>まとめ</h3>
<p>FITについては、沢山の資料があるんで省略。</p>

<p>ちなみに、<a href="http://www.slideshare.net/nashjain/acceptance-test-driven-development-350264">Acceptance Test Driven Development</a>なんて言葉もあるようで、AcceptanceTestについてはもう少し知ることが多そう。<br />
ってか、こういったことを便利(簡単)に行えるツールを誰か作って(とかいう</p>

<h3>TODO</h3>
<ul>
<li>wiki 形式とか csv 形式、excel 形式などで使えるようにすると便利かと</li>
<li>Fixture クラスの再利用ができないので、もう少し利用方法を考える</li>
<li>日本語でテストケースを書いてもいいような方法を考える</li>
<li>コンテナとかと連携できるように考える</li>
</ul>

<p>wiki形式とかで書けるようになれば、あっち側の学習コストが下がって良いかも。<br />
暇な時に挑戦しよう</p>

<div class="amazon-item-box" style="display: block; padding: 0; border: 1px solid  #999; margin: 8px;  -moz-border-radius: 10px;">
<div class="amazon-item-image" style="display: block; padding: 10px; float: left;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/0321269349/lilydaselfish-22/ref=nosim" target="_blank">
<img src="http://ecx.images-amazon.com/images/I/51TkZgx6qiL._SL160_.jpg" alt="Fit For Developing Software: Framework For Integrated Tests (Robert C. Martin)" title="Fit For Developing Software: Framework For Integrated Tests (Robert C. Martin)" style="border: none; display: inline; vertical-align: bottom;" />
</a>
</div>
<dl class="amazon-item-info" style="display: block; margin-left: 10px; padding: 0 8px 0 10px; font-size: 10pt; line-height: 110%;">
<dt class="amazon-item-name" style="display: block; margin-bottom: 5px; line-height: 120%;">
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/0321269349/lilydaselfish-22/ref=nosim" target="_blank" title="Fit For Developing Software: Framework For Integrated Tests (Robert C. Martin)">Fit For Developing Software: Framework For Integrated Tests (Robert C. Martin)</a>
</dt>
<dd>
<ul class="amazon-item-info-list" style="list-style-type: none; padding-left: 0px; line-height: 120%;">
<li>発売元: Prentice Hall</li>
<li>レーベル: Prentice Hall</li>
<li>スタジオ: Prentice Hall</li>
<li>メーカー: Prentice Hall</li>
<li>価格: ￥ 6,659</li>
<li>発売日: 2005/07/08</li>
<li>売上ランキング： 34095</li>
<li>おすすめ度 <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-3-0.gif" alt="3.0">
</li>
</ul>
</dd>
</dl>
<p class="amazon-item-footer" style="clear: left; text-align: right; font-size: x-small; padding: 4px 10px 4px 10px; line-height: 100%; background-color: #f0f0f0;">posted with <a href="http://socialtunes.net">Socialtunes</a> at 2008/08/14<br />
</p>
</div>]]>
</content:encoded>
</item><item>
<title>php.ini をもう少し活用する</title>
<link>http://blog.xole.net/article.php?id=706</link>
<pubDate>Sun, 10 Aug 2008 23:29:40 +09:00</pubDate>
<description>phpのコンパイルオプションに--disable-allとかして、extensionで管理している人向け。自分の整理メモ


php の configure オプションで、--with-config-file-scan-dir=/etc...</description>
<content:encoded>
<![CDATA[<p>phpのコンパイルオプションに<code>--disable-all</code>とかして、extensionで管理している人向け。自分の整理メモ</p>

<p>
<a href="http://jp.php.net/configure">php の configure オプション</a>で、<code>--with-config-file-scan-dir=/etc/php.d</code>と指定していると、<code>/etc/php.d/xml.ini</code>とかの ini ファイルとかを読み込んでくれるので、これつかって少し php.ini を整理します。</p>

<p>例えば、<a href="http://cvs.php.net/viewvc.cgi/php-src/php.ini-recommended?revision=1.228&view=markup">php.ini-recommended には沢山の設定値が記述</a>されていて、正直読みづらいです。<br />
なので、必要なモジュール単位に分けて管理。</p>

<p>mbstringだけでいくとこんな感じ(/etc/php.d/mbstring.ini)</p>
<pre class="javascript">extension=mbstring.so

[mbstring]
; language for internal character representation.
mbstring.language = Japanese

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
mbstring.internal_encoding = UTF-8
</pre>

<p>他にも、項目の多い session とか、xdebug なんかもこの方法で管理すると、少し楽ができるかと思います。<br />
(php.iniには、error_reportingとかextension_dirの設定だけにして読むのを少なくする)</p>

<p>ちなみに、<code>--with-config-file-scan-dir=/etc/php.active</code>とかって指定して、<code>/etc/php.d</code>自体には、各モジュールの ini ファイルを沢山配置し、<code>/etc/php.active</code>には必要なファイルだけ <code>ln -s</code> で管理するとモジュールの読み込みとかの管理が少し楽になるかも。</p>

<p>というメモ</p>]]>
</content:encoded>
</item><item>
<title>就職しました。</title>
<link>http://blog.xole.net/article.php?id=705</link>
<pubDate>Fri, 01 Aug 2008 23:36:21 +09:00</pubDate>
<description>2008年8月1日に、都内のベンチャーに就職しました。
長いこと(2年くらい ?) PHP から遠ざかっていましたが、また PHP 界隈に復帰します。
よろしくお願いします。...</description>
<content:encoded>
<![CDATA[<p>2008年8月1日に、都内のベンチャーに就職しました。<br />
長いこと(2年くらい ?) PHP から遠ざかっていましたが、また PHP 界隈に復帰します。<br />
よろしくお願いします。</p>]]>
</content:encoded>
</item><item>
<title>ニートになりました。</title>
<link>http://blog.xole.net/article.php?id=704</link>
<pubDate>Thu, 31 Jul 2008 18:34:34 +09:00</pubDate>
<description>報告(誰に?)が送れましたが
2008年6月30日付けでサラリーマンを辞め、ニートの仲間入りしました。
一人前のニートになるべく頑張ります。よろしくお願いします。...</description>
<content:encoded>
<![CDATA[<p>報告(誰に?)が送れましたが<br />
2008年6月30日付けでサラリーマンを辞め、ニートの仲間入りしました。<br />
一人前のニートになるべく頑張ります。よろしくお願いします。</p>]]>
</content:encoded>
</item><item>
<title>Log4Io を作ってみた。</title>
<link>http://blog.xole.net/article.php?id=703</link>
<pubDate>Sat, 26 Jul 2008 20:52:56 +09:00</pubDate>
<description>Log4Io を作ってみた。
ref http://coderepos.org/share/browser/lang/io/Log4Io/io


使い方は、Log4** とほぼ同じで、こんな感じ

Log4Io

logge...</description>
<content:encoded>
<![CDATA[<p>Log4Io を作ってみた。<br />
ref <a href="http://coderepos.org/share/browser/lang/io/Log4Io/io">http://coderepos.org/share/browser/lang/io/Log4Io/io</a>
</p>

<p>使い方は、Log4** とほぼ同じで、こんな感じ</p>

<pre class="javascript">Log4Io

logger := Log4Io getLogger(<span class="string" >"sample"</span>)
logger addAppender(Log4Io ConsoleAppender <span class="keyword" >with</span>)
logger setLevel(Log4Io Level INFO)
<span class="keyword" >if</span>(logger isDebugEnabled) then (
    logger debug(<span class="string" >"debug"</span>)
)
<span class="keyword" >if</span>(logger isInfoEnabled) then (
    logger info(<span class="string" >"info"</span>)
)
<span class="keyword" >if</span>(logger isWarnEnabled) then (
    logger warn(<span class="string" >"warn"</span>)
)
</pre>

<p>これを実行するとこんな感じ。</p>

<pre>==&gt; 2008-07-26 20:48:50 JST INFO sample - info
==&gt; 2008-07-26 20:48:50 JST WARN sample - warn</pre>

<p>また、Lobby に log4ioLogger を設置しているので、こちらはそのまま使えます。</p>
<pre class="javascript">Log4Io

<span class="comment" >// lobby log4ioLogger</span>
log4ioLogger error(<span class="string" >"hoge"</span>)
log4ioLogger info(<span class="string" >"foo"</span>)
log4ioLogger warn(<span class="string" >"bar"</span>)</pre>

<p>こっちは、こんな感じに出力される</p>

<pre>==&gt; 2008-07-26 20:48:50 JST ERROR Log4Io - hoge
==&gt; 2008-07-26 20:48:50 JST INFO Log4Io - foo
==&gt; 2008-07-26 20:48:50 JST WARN Log4Io - bar</pre>

<p>ほとんど log4js からパクったけど、Log4J 並みの細かいことも作れそう。<br />
ただ、パッケージとかが無い分だけ色々と面倒なのだけど。。。</p>]]>
</content:encoded>
</item><item>
<title>Io の clone でハマる</title>
<link>http://blog.xole.net/article.php?id=702</link>
<pubDate>Sat, 26 Jul 2008 20:42:29 +09:00</pubDate>
<description>clone したときは、init メソッドが呼ばれて、そこで必ず初期化しないとダメだということ
以下のコードだと、オブジェクトの値が clone されるんだね

Hoge := Object clone do(
    values...</description>
<content:encoded>
<![CDATA[<p>clone したときは、init メソッドが呼ばれて、そこで必ず初期化しないとダメだということ<br />
以下のコードだと、オブジェクトの値が clone されるんだね</p>

<pre class="javascript">Hoge := Object clone <span class="keyword" >do</span>(
    values := List clone
    <span class="keyword" >with</span> := method(name,
        c := self clone
        c values append(name)
        c
    )
)

a := Hoge <span class="keyword" >with</span>(<span class="string" >"a"</span>)
b := Hoge <span class="keyword" >with</span>(<span class="string" >"b"</span>)
a values println
==&gt; list(a, b)</pre>

<p>これってつまり js だと、以下のコードと同じってことか。</p>
<pre class="javascript">
<span class="keyword" >var</span> Hoge = <span class="keyword" >function</span> (){};
Hoge.prototype = {
    values: [],
    <span class="keyword" >with</span>: <span class="keyword" >function</span>(name){
        <span class="keyword" >var</span> c = <span class="keyword" >new</span> Hoge
            c.values.push(name)
        <span class="keyword" >return</span> c
    }
};

<span class="keyword" >var</span> a = Hoge.prototype.<span class="keyword" >with</span>(<span class="string" >"a"</span>)
<span class="keyword" >var</span> b = Hoge.prototype.<span class="keyword" >with</span>(<span class="string" >"b"</span>)
print(a.values)
==> (a, b)
</pre>

<p>ということで、Io のコード及び、js のコードを直すなら、こんな感じになる。<br />
# って基礎中の基礎か</p>

<p>Io</p>
<pre class="javascript">Hoge := Object clone <span class="keyword" >do</span>(
    init := method(
        self values := List clone
    )
    <span class="keyword" >with</span> := method(name,
        c := self clone
        c values append(name)
        c
    )
)

a := Hoge <span class="keyword" >with</span>(<span class="string" >"a"</span>)
b := Hoge <span class="keyword" >with</span>(<span class="string" >"b"</span>)
a values println
==&gt; a
b values println
==&gt; b</pre>

<p>js</p>
<pre class="javascript">
<span class="keyword" >var</span> Hoge = <span class="keyword" >function</span> (){<span class="keyword" >return</span> <span class="keyword" >this</span>.init.apply(<span class="keyword" >this</span>)};
Hoge.prototype = {
    init: <span class="keyword" >function</span> (){
        <span class="keyword" >this</span>.values = []
    },
    <span class="keyword" >with</span>: <span class="keyword" >function</span>(name){
        <span class="keyword" >var</span> c = <span class="keyword" >new</span> Hoge
            c.values.push(name)
        <span class="keyword" >return</span> c
    }
};

<span class="keyword" >var</span> a = Hoge.prototype.<span class="keyword" >with</span>(<span class="string" >"a"</span>)
<span class="keyword" >var</span> b = Hoge.prototype.<span class="keyword" >with</span>(<span class="string" >"b"</span>)
alert(a.values)
==&gt; a
alert(b.values)
==&gt; b</pre>

<p>慣れは怖い</p>]]>
</content:encoded>
</item><item>
<title>メモリを4GBに増設した</title>
<link>http://blog.xole.net/article.php?id=701</link>
<pubDate>Fri, 25 Jul 2008 20:16:15 +09:00</pubDate>
<description>



増設したといっても、結構前に増設してたんだけど、メモリが 1GB から 4GB になると結構快適に過ごせてます。
購入は上海問屋 → 【楽天市場】[送料\210〜]【相性保証付】[個数限定特価] ノートパソコン用メモリ DDR...</description>
<content:encoded>
<![CDATA[<p>
<img src="http://blog.xole.net/resources/pict.png" />
</p>

<p>増設したといっても、結構前に増設してたんだけど、メモリが 1GB から 4GB になると結構快適に過ごせてます。<br />
購入は上海問屋 → <a href="http://item.rakuten.co.jp/donya/70069-ss/">【楽天市場】[送料\210〜]【相性保証付】[個数限定特価] ノートパソコン用メモリ DDR2 PC2-5300 2GB：上海問屋セレクト SODIMM DDR2 PC2-5300 2GB [メ1]：上海問屋</a>
<br />
安いっすね。もっと早くに買っておけば良かった。</p>]]>
</content:encoded>
</item>
</channel>
</rss>