<?xml version="1.0" encoding="euc-jp"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>torus solutions!   </title>
    <link>http://torus.jp</link>
    <description>Blosxom 2 をまだ使っています。</description>
    <language>ja</language>

  <item>
    <title>日本一時帰国の感想。</title>
    <link>http://torus.jp/diary/x201008/tokyo-impression.md.html</link>
    <description>&lt;p&gt;8 月 14 日から同 25 日まで、1 年半ちょっと振りに日本へ帰った。主な目的は就労ビザの延長のため、アメリカ大使館で面接を受ける事でした。スケジュールが直前まで決まらずさいごまでばたばたした旅程でしたが、今回はいろいろと思うところがあったのでまとめてみます。&lt;/p&gt;

&lt;h2&gt;電子マネー&lt;/h2&gt;

&lt;p&gt;日本ではもう完全に当たり前になった Suica や PASMO のような電子マネーですが、改めて便利さと人々への浸透の深さに驚いた。もちろん、ぼくがハワイに来る前からこれらの電子マネーはみんな当たり前の様に使ったいたんだけど、今年の夏、ついにセブンイレブンでも Suica が使えるようになった事に、ちょっとした時代の流れを感じた。これまでもセブンイレブンは（中身は Suica と同じの）nanaco というカードを発行していて、ぼくも持っているけど、ついに Suica、PASMO の勢いにおされた形になった。&lt;/p&gt;

&lt;p&gt;ぼくが自分用に Suica を作ったのは確か 2003 年くらいで、2005 年に一度盗まれて再発行してもらったので、ペンギンの絵が描いてあるちょっと新しいバージョンです。Suica は、最初は JR 東日本の一部の駅の改札機でしか使えなくて、駅内のキオスクなどで使うのは Suica イオカードという、ペイメント機能付きのカードでなくてはいけなかった記憶がある。&lt;/p&gt;

&lt;p&gt;それからしばらくして、地下鉄や一部の私鉄・バスで使える PASMO が登場した。しかも、たしか初めから Suica と PASMO は互換性があり、PASMO 用の改札機で Suica も使えたように思う。&lt;/p&gt;

&lt;p&gt;2008 年の暮れに一時帰国したときに、西武池袋線の駅のホームで、きゃっきゃと雑談をしている学校の制服を着た女の子が、まったく自然に PASMO で自動販売機の支払いをしているのを見て驚いた。まだ Suica も無かった頃「電子マネー」という概念が語られ始めた時は、彼女たちからは最も離れた場所に位置していたのに。&lt;/p&gt;

&lt;p&gt;Suica や PASMO を使って自販機で買い物するときは、支払いをする「前」に商品を選ぶので、従来とは操作の手順が違うんだけど、意外とすんなり受け入れられたようだ。&lt;/p&gt;

&lt;h2&gt;鉄道&lt;/h2&gt;

&lt;p&gt;これもいまさらなんですが、東京の地下鉄網には改めて感心させられた。特に副都心線を使うと西武池袋線沿線から渋谷まで 1 本で行けてしまう。便利すぎる。あと、たぶん、すべての地下鉄の駅で NTT コミュニケーションズの無線 LAN アクセスポイントが使えるので、iPhone のデータローミングを使ってなかったぼくはすごく助かった。&lt;/p&gt;

&lt;p&gt;ぼくが関西から東京に移った 2000 年頃はちょうど大江戸線が開通したときで、それから 10 年もしない間に副都心線が開通し、いまだに進化を止めない勢いを感じます。&lt;/p&gt;

&lt;p&gt;それから、JR 山手線の一部でも、プラットホームに人が誤って飛び込まないように扉付きの「柵」が出来ていたのを確認した。まだ山手線の全駅ではないみたいだけど、ぼくはああいう過保護なサービスが大好きだ。コストもかかるだろうから作るのは大変だろうけど、あれで救われる人の命もそれなりにあるんじゃないだろうか。しかし、あれをもしハワイにでも作ろうものなら、すぐに落書きで汚されてしまうだろうけど、東京の地下鉄や JR の駅の柵はぼくが見た限りみんなきれいだった。&lt;/p&gt;

&lt;p&gt;ハワイ（というかオアフ島）には、バスとタクシーしか公共の交通機関がない。ホノルルの市バスは日本から来た人からするとお世辞にもきれいで使いやすいとは言えないけど、どういうわけかあれがアメリカで一番の公共交通機関に選ばれたらしい。さすがにそれは無いと思うけど。&lt;/p&gt;

&lt;p&gt;ハワイのバスで嫌なのは、全体的に薄暗くて汚い、バス停に街灯も何も無くホームレスや物乞いがいて怖い、値段が高い（少し前から断続的に値上げが続いていて今ではどこからどこまで乗っても $2.50）こと。ハワイにも鉄道を造る計画があってテレビでもたまに取り上げられるけど、まだ何十年も先の話になりそう。&lt;/p&gt;

&lt;h2&gt;低価格飲食店チェーン&lt;/h2&gt;

&lt;p&gt;今回の帰国では、少し意識して、安いチェーンのお店で食事をとるようにした。ぼくは以前は和民とかの安い居酒屋のメニューがあまりにもまずかったので、全体的にそういう低価格帯のお店は避けてた。貧乏な人はこういうまずい物だけを食べさせられ、おいしい物の味を知らずにこういう低質な店にお金をむしり取られてかわいそうとさえ思っていた。&lt;/p&gt;

&lt;p&gt;しかし今回行ったところは大体はおいしくて、しかもサービスがまともだった。行ったのは 100 円回転寿司の「くら寿司」と「スシロー」、うどんの「丸亀製麺」、中華の「日高屋」、バーの「プロント・イルバール」。特にサービスが良いと思ったのは日高屋とくら寿司でした。&lt;/p&gt;

&lt;p&gt;くら寿司は、注文をほぼすべて機械のパネルで受け、皿を数えるのもほぼ機械化していて、しかも生ビールを注ぐのまで機械でセルフサービスで出来るようになっている。ここまで機械化すると、人間が接客する部分はテーブルへの案内と会計くらいなので、そこをきちんとやりさえすれば客は店員に対して嫌な思いをしなくてすむ。&lt;/p&gt;

&lt;p&gt;それから、日高屋はぼくが東京にいるときから 290 円ラーメンとしてたくさんあったけど、どうせまずいだろうと思って、それまで入った事が無かった。だけど、入ってみると生ビールはあるし、単品でおつまみがいろいろ注文できるし、それなりに調理しているみたいでレトルトっぽくないし、接客も比較的まともだし、かなりすすんでいると思った。&lt;/p&gt;

&lt;p&gt;店員はチップももらわずに低賃金でこんなにちゃんと働いている。それは、ネガティブに考えればまあネガティブなんだけど、そのかわり彼らは一定の教育を受けられ、それは次の仕事に生かす事が出来るし、店としてもいちいち自分で接客マニュアルなんかを作る必要がないから失敗が少ないのだろう。&lt;/p&gt;

&lt;p&gt;日本人はソフトウェアを作るのが苦手というけど、これらのお店のマニュアルや店員の教育プログラムは世界的な基準で見ても相当にレベルが高いんじゃないだろうか。ただ、それと同時に、こういうサービスをたくさんの店舗で一定の質を保って提供できるのは、おそらくは、客の質もそれなりに一定だからだとも感じた。&lt;/p&gt;

&lt;p&gt;たとえばハワイとかだと、いろんな人種の人がいるし、アメリカ人の白人だけでもいろんな極端な性格の人がいるので、画一的な接客マニュアルで対応するのは難しいのかもしれない。日本みたいに低価格のサービスがここまで先鋭化した背景には、単一の民族しかいない事がうまく働いたんじゃないだろうか、とか思った。そういう意味で、新しいサービスを開発し試験的に始めてみるには、日本はいい環境なのかもしれない。&lt;/p&gt;

&lt;h2&gt;携帯電話&lt;/h2&gt;

&lt;p&gt;ハワイだとバスに乗ったりすると iPhone を使っている人がすごく多いのに気がつく。アメリカには昔からスマートフォンというカテゴリーがあって、ブラックベリーとか Windows モバイルとかそういう多機能携帯はすでに昔からあった。ただ、やっぱりこういうのはちょっとオタクやビジネスマン向けのような扱いだったみたいで、iPhone は、スマートフォンを持つほどじゃないけど、今までの電話しか出来ない携帯電話ではちょっと満足できないという人にうまく届いたんじゃないかと想像しています。&lt;/p&gt;

&lt;p&gt;しかし東京では iPhone を使っている人はあまり見かけなかった。あたりまえだけど、iPhone に付いている機能はほとんどすべて、日本で数千円で買える携帯電話に当たり前の機能として付いているものばかりだ。最新型の iPhone 4 で「前面にカメラが付いてテレビ電話ができます」なんて言っているのを聞いても、日本の感覚だと「どこが新しいの？」で終わってしまうレベルだ。&lt;/p&gt;

&lt;h2&gt;まとめ&lt;/h2&gt;

&lt;p&gt;たまにテレビとかで、日本人が自虐的に「日本人は便利さと引き換えに心の豊かさを失った」とかいうのを見かけるけど、たぶんそんな事は無い。これだけ便利になると周りの人との利害の衝突（ホームレスに小銭を要求されて嫌な思いをするとか、マナーの悪い人種の人たちがいるところへ行かないといけないとか）が少ないので、精神的にも前向きに暮らしていけると思う。&lt;/p&gt;

&lt;p&gt;日本の便利さは確かに「異常」と言えるかもしれないけど、ぼくみたいにこれからソフトウェアとかでサービスを開発する立場からすれば、こういうぬるま湯に入っていないと見えない潜在的なストレスや需要はやっぱりあると思う。だから、これから 10 年くらい先の世界標準を先取りするつもりで、このぬるま湯にしっかり浸かっておくのも悪くはないんじゃないかな。&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>SWIG を使った Lua バインディングの作り方。（前編）</title>
    <link>http://torus.jp/memo/x201008/lua-binding-with-swig.md.html</link>
    <description>&lt;p&gt;LibXML の tree ライブラリの Lua バインディングを作ってみました。実際にやってみると途中でいろいろ躓きましたが最終的にはシンプルな形にできたのでやり方をまとめてみました。&lt;/p&gt;

&lt;p&gt;今回制作した SWIG のインターフェイスファイルやその他のファイルはひとつの &lt;a href=&quot;http://gist.github.com/328590&quot;&gt;Gist&lt;/a&gt; にまとめたのでご自由にご覧ください。&lt;/p&gt;

&lt;h2&gt;SWIG のインターフェイスファイル&lt;/h2&gt;

&lt;p&gt;SWIG のインターフェイスファイルで、モジュール名、ヘッダファイルのインクルードの指定と、ラッパーを作りたい関数のプロトタイプ宣言を書きます。基本的には、&lt;code&gt;%include&lt;/code&gt; ディレクティブを使ってヘッダファイルをそのままインクルードしてやれば動きます。&lt;/p&gt;

&lt;h3&gt;単純なラッパ&lt;/h3&gt;

&lt;p&gt;インターフェイスファイルの基本的な記述方法は、C/C++ のヘッダファイルと同じです。したがって、単純に &lt;code&gt;%include&lt;/code&gt; ディレクティブを使ってヘッダファイルをインクルードしてしまえば、一応インターフェイスファイルができたことになります。たとえば、LibXML2 の tree.h に対するインターフェイスファイルの一番簡単な形は次のようになるでしょう。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%module libxml2

%{
  #include &amp;lt;libxml2/libxml/tree.h&amp;gt;
  #include &amp;lt;stdio.h&amp;gt;
%}

%include &amp;lt;/usr/include/libxml2/libxml/xmlexports.h&amp;gt;
%include &amp;lt;/usr/include/libxml2/libxml/xmlversion.h&amp;gt;
%include &amp;lt;/usr/include/libxml2/libxml/tree.h&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最初の行の &lt;code&gt;%module&lt;/code&gt; は、Lua からライブラリ API を呼び出すためのモジュール名を指定します。ここでは、&lt;code&gt;libxml2.&lt;/code&gt;&lt;em&gt;funcname&lt;/em&gt;&lt;code&gt;()&lt;/code&gt; のような形で呼び出したいので &lt;code&gt;libxml2&lt;/code&gt; というモジュール名にしました。&lt;/p&gt;

&lt;p&gt;次に &lt;code&gt;%{&lt;/code&gt; から &lt;code&gt;%}&lt;/code&gt; までに書かれている部分は、生成されるラッパーのソースコードにそのまま書き出されます。実際に生成されたソースコードを覗いてみるとこの様子が確認できます。&lt;/p&gt;

&lt;p&gt;そして次の行以降に並んでいる &lt;code&gt;%include&lt;/code&gt; ディレクティブが、このインターフェイスファイルの本体部分です。&lt;code&gt;%include&lt;/code&gt; は、単に指定されたファイルをこの位置に展開するだけです。&lt;code&gt;%include&lt;/code&gt; で読み込まれるファイルはインターフェイスファイルの構文で書かれている必要がありますが、ヘッダファイルに書かれている関数宣言の書き方がそのままインターフェイスファイルでも使えるので、このような手抜きができます。&lt;/p&gt;

&lt;h3&gt;SWIG 起動&lt;/h3&gt;

&lt;p&gt;さて、ここまでできたら実際に SWIG を起動してラッパーを生成してみましょう。シェルのコマンドラインから次のように入力してください。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;swig -lua libxml2.i
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;そうすると、libxml2_wrap.c というファイルが生成されます。これを通常の LibXML2 のアプリケーションと同じようにコンパイル、リンクすると Lua のモジュールができます。ただ、語述するようにこれでは役に立たないので、具体的なビルド方法については後回しにします。&lt;/p&gt;

&lt;h3&gt;typemap&lt;/h3&gt;

&lt;p&gt;組み込み型や std::string のような基本的な型については、SWIG が自動的に Lua の対応する型に変換してくれます。しかし、ライブラリ固有の型についてはどのように Lua のデータに変換するかを教えてあげる必要があります。&lt;/p&gt;

&lt;p&gt;SWIG では、このデータ型の変換のために &lt;code&gt;%typemap&lt;/code&gt; というディレクティブを使って変換の方法を指示します。&lt;/p&gt;

&lt;h4&gt;パターンマッチ&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;%typemap&lt;/code&gt; では、関数の入出力の型と仮引数名をつかって、Lua の値へのマッピングのやり方を記述します。通常、C の関数プロトタイプ宣言では仮引数の名前は意味を持ちませんが、SWIG はこれを型を補うための重要な情報として活用します。これらの情報をパターンとして記述して、SWIG はこのパターンとそれぞれの関数プロトタイプ宣言を比較し、どのようなラッパーを適用するかを決めるのです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;%typemap(in, numinputs=0) (xmlChar ** mem, int * size) (xmlChar *temp, int templen) {
  &amp;#036;1 = &amp;amp;temp;
  &amp;#036;2 = &amp;amp;templen;
}

%typemap(argout) (xmlChar ** mem, int * size) {
  // Append output value &amp;#036;1 to &amp;#036;result
  lua_pushlstring (L, *&amp;#036;1, *&amp;#036;2);
  SWIG_arg ++;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;この例では、まず &lt;code&gt;xmlChar ** mem, int * size&lt;/code&gt; の部分がパターンで、このパターンにマッチする引数を持つ関数に対して、その下に書いた処理を実行します。このパターンはたとえば、次のような関数プロトタイプ宣言にマッチします。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;XMLPUBFUN void XMLCALL
                xmlDocDumpFormatMemory  (xmlDocPtr cur,
                                         xmlChar **mem,
                                         int *size,
                                         int format);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここで、&lt;code&gt;xmlChar **mem&lt;/code&gt; と &lt;code&gt;int *size&lt;/code&gt; がこの順番で出てきていることに注意してください。また、同じ型でも、別の仮引数名を使った次のような関数にはマッチしません。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;XMLPUBFUN void XMLCALL
                xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc,
                                         xmlChar **doc_txt_ptr,
                                         int * doc_txt_len,
                                         const char *txt_encoding,
                                         int format);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;xmlChar**&lt;/code&gt; 型の仮引数の名前が &lt;code&gt;mem&lt;/code&gt; ではないことに注意してください。&lt;/p&gt;

&lt;p&gt;さて、&lt;code&gt;%typemap&lt;/code&gt; ディレクティブの中身をもう少し見てみます。最初の &lt;code&gt;%typemap&lt;/code&gt; では、まず &lt;code&gt;in&lt;/code&gt; と書いて、与えられた引数を入力として使うことを宣言しています。次の &lt;code&gt;numinputs=0&lt;/code&gt; は、「この引数は Lua からの引数を消費しませんよ」っていう意味ですが、あとで詳しく説明します。&lt;/p&gt;

&lt;p&gt;次に続く &lt;code&gt;(xmlChar ** mem, int * size)&lt;/code&gt; はすでに説明したように、ラッパーを適用したい関数のパターンです。&lt;/p&gt;

&lt;p&gt;そして、その次の &lt;code&gt;(xmlChar *temp, int templen)&lt;/code&gt; は、ラッパー関数内で使うローカル変数の宣言です。&lt;/p&gt;

&lt;p&gt;説明するよりも、実際に生成されたラッパー関数の中身を見るほうが分かりやすいので、ちょっとのぞいてみましょう。たとえば、すでに出てきた &lt;code&gt;xmlDocDumpFormatMemoryEnc&lt;/code&gt; のラッパー関数は次のようになりました。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static int _wrap_xmlDocDumpFormatMemory(lua_State* L) {
  int SWIG_arg = 0;
  xmlDocPtr arg1 = (xmlDocPtr) 0 ;
  xmlChar **arg2 = (xmlChar **) 0 ;
  int *arg3 = (int *) 0 ;
  int arg4 ;
  xmlChar *temp2 ;
  int templen2 ;

  {
    arg2 = &amp;amp;temp2;
    arg3 = &amp;amp;templen2;
  }
  SWIG_check_num_args(&quot;xmlDocDumpFormatMemory&quot;,2,2)
  if(!SWIG_isptrtype(L,1)) SWIG_fail_arg(&quot;xmlDocDumpFormatMemory&quot;,1,&quot;xmlDocPtr&quot;);
  if(!lua_isnumber(L,2)) SWIG_fail_arg(&quot;xmlDocDumpFormatMemory&quot;,2,&quot;int&quot;);

  if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&amp;amp;arg1,SWIGTYPE_p__xmlDoc,0))){
    SWIG_fail_ptr(&quot;xmlDocDumpFormatMemory&quot;,1,SWIGTYPE_p__xmlDoc);
  }

  arg4 = (int)lua_tonumber(L, 2);
  xmlDocDumpFormatMemory(arg1,arg2,arg3,arg4);

  {
    // Append output value arg2 to result
    lua_pushlstring (L, *arg2, *arg3);
    SWIG_arg ++;
  }
  return SWIG_arg;

  if(0) SWIG_fail;

fail:
  lua_error(L);
  return SWIG_arg;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;順を追ってみてみます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;static int _wrap_xmlDocDumpFormatMemory(lua_State* L) {
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lua が処理できる関数の型は、必ず &lt;code&gt;lua_State*&lt;/code&gt; をとって &lt;code&gt;int&lt;/code&gt; を返します。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  int SWIG_arg = 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;SWIG_arg は、引数のカウンタです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  xmlDocPtr arg1 = (xmlDocPtr) 0 ;
  xmlChar **arg2 = (xmlChar **) 0 ;
  int *arg3 = (int *) 0 ;
  int arg4 ;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これらは、Lua から渡された引数を C の値に変換するときの受け皿となります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  xmlChar *temp2 ;
  int templen2 ;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここで、1 つめの &lt;code&gt;%typemap&lt;/code&gt; に書いた変数宣言を思い出してください。あれはここにそのまま書かれます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  {
    arg2 = &amp;amp;temp2;
    arg3 = &amp;amp;templen2;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;そしてさらに、1 つ目の &lt;code&gt;%typemap&lt;/code&gt; の中身がそのままここにコピーされます。ただし、&lt;code&gt;&amp;#036;1&lt;/code&gt; が &lt;code&gt;arg2&lt;/code&gt; に、&lt;code&gt;&amp;#036;2&lt;/code&gt; が &lt;code&gt;arg3&lt;/code&gt; に変換されていることに注意してください。&lt;/p&gt;

&lt;p&gt;ここからしばらくは、SWIG が自動生成するラッパーコードです。基本的には型のマッピングです。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  SWIG_check_num_args(&quot;xmlDocDumpFormatMemory&quot;,2,2)
  if(!SWIG_isptrtype(L,1)) SWIG_fail_arg(&quot;xmlDocDumpFormatMemory&quot;,1,&quot;xmlDocPtr&quot;);
  if(!lua_isnumber(L,2)) SWIG_fail_arg(&quot;xmlDocDumpFormatMemory&quot;,2,&quot;int&quot;);

  if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&amp;amp;arg1,SWIGTYPE_p__xmlDoc,0))){
    SWIG_fail_ptr(&quot;xmlDocDumpFormatMemory&quot;,1,SWIGTYPE_p__xmlDoc);
  }

  arg4 = (int)lua_tonumber(L, 2);
  xmlDocDumpFormatMemory(arg1,arg2,arg3,arg4);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最後の行で、実際に &lt;code&gt;xmlDocDumpFormatMemory&lt;/code&gt; 関数を呼び出しています。しかし、この関数は &lt;code&gt;arg2&lt;/code&gt; と &lt;code&gt;arg3&lt;/code&gt; を出力変数として使うので、これらの値を今度は Lua の値に変換して Lua に返してやる必要があります。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  {
    // Append output value arg2 to result
    lua_pushlstring (L, *arg2, *arg3);
    SWIG_arg ++;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ここで、2 つ目の &lt;code&gt;%typemap&lt;/code&gt; が登場です。ここで &lt;code&gt;SWIG_arg&lt;/code&gt; という変数をインクリメントしています。これは、Lua に返す値の数を表します。ちなみに &lt;code&gt;lua_pushlstring&lt;/code&gt; は文字列を Lua に渡すための関数ですが、第 3 引数には文字列の長さをバイト数で渡すので、文字列中にヌルバイト &lt;code&gt;'\0'&lt;/code&gt; を含んでいても正しく渡すことができます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  return SWIG_arg;

  if(0) SWIG_fail;

fail:
  lua_error(L);
  return SWIG_arg;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;残りは SWIG が生成するコードです。特に &lt;code&gt;SWIG_arg&lt;/code&gt;（返り値の数）を返している事に注意してください。&lt;/p&gt;

&lt;h2&gt;つづく&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;%native&lt;/code&gt; ディレクティブを使った低レベルな関数の定義や、Lua モジュールのビルド方法など、書くつもり。&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>Lightweight Language Tiger Lightening Talk: Lua でわくわくゲーム開発。</title>
    <link>http://torus.jp/memo/x201007/ll-lt-lua-game-development.md.html</link>
    <description>&lt;p&gt;&lt;a href=&quot;http://ll.jus.or.jp/2010/&quot;&gt;Lightweight Language Tiger&lt;/a&gt; で行われた、ライトニングトークセッション
「&lt;a href=&quot;http://ll.jus.or.jp/2010/program/lt&quot;&gt;LL Tiger &gt; LTの虎&lt;/a&gt;」
で、CryENGINE2 上で Lua を使ってゲーム開発をする手順をビデオにまとめて発表させていただきました。&lt;/p&gt;

&lt;h2&gt;動画&lt;/h2&gt;

&lt;p&gt;実際に上映させていただいた前編：&lt;/p&gt;

&lt;p&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://ext.nicovideo.jp/thumb_watch/sm11581150&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://www.nicovideo.jp/watch/sm11581150&quot;&gt;【ニコニコ動画】LLTiger LT: Lua でわくわくゲーム開発（前半）&lt;/a&gt;&lt;/noscript&gt;&lt;/p&gt;

&lt;p&gt;一回戦で敗退してしまったために上映できなかった後編：&lt;/p&gt;

&lt;p&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://ext.nicovideo.jp/thumb_watch/sm11580483&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href=&quot;http://www.nicovideo.jp/watch/sm11580483&quot;&gt;【ニコニコ動画】LLTiger LT: Lua でわくわくゲーム開発（続き）&lt;/a&gt;&lt;/noscript&gt;&lt;/p&gt;

&lt;p&gt;今回のライトニングトーク（LT）のルールでは、8 チームがトーナメント形式で競い合い、それぞれ対戦に勝ったチームが次の発表を許されるということになってました。で、ぼくは初戦で負けてしまったので、後編は上映できませんでした。&lt;/p&gt;

&lt;p&gt;ここで紹介している方法は、CryENGINE2 という高価な商用のゲームエンジンを使用しているにもかかわらず、個人的な使用においては完全に無料で実現できます。なので、ゲーム開発に興味のある学生やニートのみなさんにも見ていただければと思います。&lt;/p&gt;

&lt;h2&gt;スクリプトのソースコード&lt;/h2&gt;

&lt;p&gt;ここで Lua スクリプトのソースコードを公開しています。
&lt;a href=&quot;http://github.com/torus/Luna-Landa-on-CryENGINE2&quot;&gt;torus / Luna-Landa-on-CryENGINE2&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;参考 URL&lt;/h2&gt;

&lt;p&gt;ビデオ中で紹介した各ウェブサイトの URL をここにも記載しておきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://crysisdemo.com/&quot;&gt;Crysis Demo Download Live Countdown October 26th 2007 PC EA Games&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://crymod.com/portal.php&quot;&gt;Crytek's Official Modding Portal | Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.bluemars.com/wiki/index.php/Blue_Mars_Game_Programming&quot;&gt;Blue Mars Game Programming - Blue Mars Developer Guidebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;それから、時間の都合で紹介できなかったサイトもあげておきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.atari.com/arcade/lunar_lander&quot;&gt;Lunar Lander(TM) | Atari Video Games&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>Lua で apply。</title>
    <link>http://torus.jp/memo/x201007/apply-in-lua.md.html</link>
    <description>&lt;p&gt;JavaScript や Scheme には、配列を引数の並びとして関数に適用する apply という関数がありますが、Lua にはそれに相当する関数はありません。で、しばらく悩んでいたんですが、少し前に同等のことをする方法があるのに気がつきました。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.lua.org/manual/5.1/manual.html#pdf-unpack&quot;&gt;unpack&lt;/a&gt; という関数を使います。unpack は、配列をとってその配列の中身を多値として返します。これをつかうと、apply 相当の動作はこんな風にかけます。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;func (unpack (array))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;JavaScript ではこんな感じ：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;func.apply (this, array)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>Markdown のテストー。</title>
    <link>http://torus.jp/test/markdown.md.html</link>
    <description>&lt;h2&gt;てすとですよ。&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Bird&lt;/li&gt;
&lt;li&gt;McHale&lt;/li&gt;
&lt;li&gt;Parish&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt; Rocks!!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sub start {
    others-&amp;gt;regist_fetch ('.md', \&amp;amp;_fetch);
    1;
 }

sub _fetch {
    my (&amp;#036;fh, &amp;#036;path_file, &amp;#036;title_ref, &amp;#036;body_ref, &amp;#036;raw_ref) = @_;

    chomp(&amp;#036;&amp;#036;title_ref = &amp;lt;&amp;#036;fh&amp;gt;);

    if (&amp;#036;body_ref) {
    &amp;#036;&amp;#036;body_ref = Markdown(join '', &amp;lt;&amp;#036;fh&amp;gt;);
    }

    &amp;#036;raw_ref and &amp;#036;&amp;#036;raw_ref = &amp;#036;&amp;#036;title_ref . &quot;\n&quot; . &amp;#036;&amp;#036;body_ref;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;このサイトの Blosxom は、&lt;a href=&quot;http://torus.jp/doc/blosxom/fetch.html&quot;&gt;少し拡張が加えてある&lt;/a&gt;ので、それにあわせて修正して使っています。&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>重複している写真ファイルを一気に消す。</title>
    <link>http://torus.jp/memo/x201001/removing_duplicated_photos.rd.html</link>
    <description>&lt;p&gt;携帯電話やデジカメから PC に写真を転送するときに、間違えて同じ写真を何度も読み込んでしまって、無駄なデータがたくさんできてしまってました。しかも、それらのファイルは、フォルダもファイル名も全然違う事があって、簡単にはまとめて消せません。なので、Perl で簡単なスクリプトを書いて重複ファイルの洗い出しをしました。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;h2&gt;スクリプト&lt;/h2&gt;
&lt;p&gt;スクリプトは以下の通りです。Mac OS X 10.6.2 に付属の Perl 5.10.0 を使いました。追加の CPAN モジュールは、たぶん入れてません。&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/env perl

use strict;
use warnings;

use Fcntl;
use NDBM_File;
use File::Find ();

my $len = 64;
my %table;

tie(%table, 'NDBM_File', 'table', O_RDWR|O_CREAT, 0666)
    or die &quot;Couldn't tie NDBM file 'filename': $!; aborting&quot;;

File::Find::find (sub {
    my $file = $_;
    if (-f $file) {
        my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
            $atime,$mtime,$ctime,$blksize,$blocks) = stat($file);

        my $head;
        open IN, &quot;&amp;lt; $file&quot;;
        read IN, $head, $len;
        $head .= $size;

        if ($table{$head}) {
            print qq(cmp &quot;$File::Find::name&quot; &quot;$table{$head}&quot; &amp;amp;&amp;amp; echo &quot;$File::Find::name&quot;\n);
        } else {
            $table{$head} = $File::Find::name;
        }
    }
                  }, @ARGV);
&lt;/pre&gt;

&lt;p&gt;ファイルの先頭 64 バイトを読み取って、それとファイルサイズをキーにして、ハッシュテーブルにファイルを登録していきます。写真のメタデータ（EXIF 情報）はファイルの先頭付近にあるので、大体これで区別できるかなと思ってますが、本当に 64 バイトというサイズが最適かは分かりません。&lt;/p&gt;
&lt;h2&gt;動作&lt;/h2&gt;
&lt;p&gt;で、このスクリプトを実行すると、すぐにファイルを消すのではなくてさらにシェルスクリプトを出力します。そのシェルスクリプトで、今度は UNIX の cmp コマンドを実行して、きちんとファイル全体を比較した上で、最終的に消去すべきファイルの一覧を出力するという 3 段構成になってます。&lt;/p&gt;
&lt;h2&gt;iPhoto での問題&lt;/h2&gt;
&lt;p&gt;で、実際にこれをつかって写真を消したんですが、iPhoto でみると、消したはずのサムネイルが残ったままになってたり、サムネイルがない代わりにその部分が空白になってしまいました。これはどうやったらなおるんだろう？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/torus/4246798823/&quot; class=&quot;external&quot;&gt;iPhoto のサムネイルが空白になってるスクリーンショット。&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>Opakapaka: 純粋な CGI プロセスだけでうごくリアルタイムチャット。</title>
    <link>http://torus.jp/memo/x200912/opakapaka.rd.html</link>
    <description>&lt;p&gt;少し前から Gauche を使って、チャットの CGI を作っていましたが、なんとなく動くようになったので &lt;a href=&quot;http://github.com/torus/opakapaka/&quot; class=&quot;external&quot;&gt;Opakapaka と名付けて公開します&lt;/a&gt;。少しタイプし辛い名前なので既に後悔していますが、まぁ開発コードだからいいや。ちなみにオパカパカとはハワイでよく食べられる白身の魚の名前です。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;純粋に CGI スクリプトだけで動作します。なので、Apache や lighttpd などの CGI をサポートするウェブサーバがあれば、それ以外にデーモンプロセスやデータベースなどを起動する必要がありません。&lt;/p&gt;
&lt;p&gt;Comet あるいは long poll と呼ばれるテクニックを使っていて、（ほぼ）リアルタイムでチャットをする事ができます。&lt;/p&gt;
&lt;p&gt;すべてピュアな Gauche で書かれています。クライアント側で動作する JavaScript も、サーバ側で Gauche スクリプトが生成します。&lt;/p&gt;
&lt;h2&gt;動機&lt;/h2&gt;
&lt;p&gt;便利なウェブチャットのサービスだった &lt;a href=&quot;http://lingr.com/&quot; class=&quot;external&quot;&gt;Lingr&lt;/a&gt; がなくなってしまったので。&lt;/p&gt;
&lt;h2&gt;ダウンロードとインストール&lt;/h2&gt;
&lt;p&gt;Git コマンドを使って、github.com からソースコードをダウンロードしてください。シェルから次のように入力すると、最新のソースコードが取得できます。&lt;/p&gt;
&lt;pre&gt;git clone git://github.com/torus/opakapaka.git
&lt;/pre&gt;

&lt;p&gt;このソースコードをウェブサーバ上において、ウェブサーバのプロセスがフォルダに書き込みできるように chmod または chown しておきます。&lt;/p&gt;
&lt;p&gt;これで完了です。ウェブブラウザから index.html にアクセスしてください。&lt;/p&gt;
&lt;h2&gt;特徴&lt;/h2&gt;
&lt;h3&gt;データファイル&lt;/h3&gt;
&lt;p&gt;チャットのデータはすべて S 式で記述され、テキストファイルに保存されます。このファイルが一定サイズに達すると、新しいファイルが作られます。最新のデータファイルには、CGI のディレクトリからシンボリックリンクが張られます。&lt;/p&gt;
&lt;p&gt;Opakapaka はデーモンプロセスを持たないために、メモリ内にデータを保持する事ができません。これにより、デーモンプロセスを管理する手間がなくなるので使うのが楽になりますが、たくさんのアクセスを高速に処理するのには向いていません。&lt;/p&gt;
&lt;p&gt;このデータ保存形式はあくまでも手軽さを追求した結果の選択ですが、将来必要があれば、データを保持するデーモンプロセスを作ってもいいかなと思っています。&lt;/p&gt;
&lt;h3&gt;データ読み出しプロセス（pull.cgi）&lt;/h3&gt;
&lt;p&gt;CGI のプロセスが起動されると、最新のデータファイルを監視して、更新が発生したらクライアントにデータを送り、プロセスを終了します。データファイルが更新されるまでは、最大で 30 秒間なにもしないで待ち続けます。&lt;/p&gt;
&lt;h3&gt;データ書き込みプロセス（push.cgi）&lt;/h3&gt;
&lt;p&gt;クライアントからチャットのデータが送られてくると、最新のデータファイルにチャットの内容を追記します。この際、同時に複数のクライアントから書き込みがあってもファイルが壊れないように、アドバイザリロックを使用しています。&lt;/p&gt;
&lt;h3&gt;クライアントサイドスクリプト（script.cgi）&lt;/h3&gt;
&lt;p&gt;クライアントサイドの描画はほぼすべて JavaScript でおこなっていますが、このスクリプトも S 式で記述され、実行時に JavaScript のソースコードに変換されます。&lt;/p&gt;
&lt;p&gt;Scheme で JavaScript のコードを生成する部分はいろいろと悩んでいて、最初の方に作ったマクロベースの API と、あとから思いついた関数型の API がまざっていて、この部分はかなりソースコードがぐちゃぐちゃです。&lt;/p&gt;
&lt;p&gt;S 式から JavaScript を生成する API は &lt;a href=&quot;http://wiki.github.com/torus/opakapaka/js-module-reference&quot; class=&quot;external&quot;&gt;Wiki にまとめたので&lt;/a&gt;良かったら見てみてください。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;/p&gt;
&lt;pre&gt;(js `(window.onblur = (function
                       ()
                       ,unread-count = 0 //
                       ,active = false //
                       window.onfocus = (function
                                         ()
                                         ,d .. title = ,orig-title //
                                         ,active = true //) //) //))
&lt;/pre&gt;

&lt;p&gt;のような Scheme のコードによって、次のような JavaScript のコードが生成されます：&lt;/p&gt;
&lt;pre&gt;window.onblur = function () {
    $G370 = 0;
    $G371 = false;
    window.onfocus = function () {
	$G368.title = $G372;
	$G371 = true;
    };
};
&lt;/pre&gt;

&lt;p&gt;ここで、いくつかの内部変数が $G370 というような名前に変換されていますが、これは Scheme コードの別の場所で gensym を使って一意な識別子を作っているためです。このように gensym を使う事で、入れ子のマクロのような複雑なコード生成も安全にできます。&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>ハワイで車を買う話。</title>
    <link>http://torus.jp/diary/x200911/getting-car.rd.html</link>
    <description>&lt;p&gt;数週間前に、ついに自動車を手に入れました。2005 年製、日産の SENTRA というモデルです。色は白です。週末になんどか、おどおどしながらも近所をドライブしてみたりしました。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;h2&gt;中古車を探す&lt;/h2&gt;
&lt;p&gt;アメリカは日本に比べると中古車がすごく高いらしい。ぼくは日本で車を持っていなかったので比較はできないんですが、アメリカでは 10 年ものの 10 万キロ以上走ったような車でも、平気で数千ドルの値段がつきます。&lt;/p&gt;
&lt;p&gt;アメリカで中古車を買うときは、ディーラーへ行って買うか、個人で売買するかどちらかを選びます。いずれも、ネットでかなりの情報が手に入ります。ぼくの場合は、アロハストリートというハワイに住む日本人向けのコミュニティサイトの掲示板を見て、今の車を売ってくれた人に連絡しました。&lt;/p&gt;
&lt;p&gt;とにかく値段の大きな買い物なので、言葉が通じない相手だと騙されたりしないか不安なのと、「日本人は車を大事にする」という噂を信じて、日本人から買う事に決めました。&lt;/p&gt;
&lt;p&gt;ハワイに限らず、海外のいろいろなところで、日本人のコミュニティというのはあるみたいですが、ぼくはハワイに来るまでは、いまいちその意義がよくわかりませんでした。なんでせっかく外国へ行くのに、また日本人だけで集まる必要があるのかな、と。でもやっぱり実際に来てみると、日本人の視点でアドバイスがもらえるのはとても貴重だなと思います。&lt;/p&gt;
&lt;p&gt;ただ、ハワイの場合は、少し年配の人になると日系二世（つまり両親が日本人）の人でも、日本語が全くわからない人もいます。これは昔は日本人は差別を受けていて、当時の日本人労働者は子どもたちが少しでも現地になじむように、わざと日本語を教えずに家の中でも英語を話そうとつとめていたからだと聞きました。&lt;/p&gt;
&lt;h2&gt;車を買う&lt;/h2&gt;
&lt;p&gt;基本的な中古車の相場はネットで調べると一発ででてくるので、だいたいそれにあわせて、車の状況などを考慮して値段を交渉します。相手は日本人だし、わりといい人だったので、それほどこじれる事もなく話がまとまりました。&lt;/p&gt;
&lt;h2&gt;車両登録&lt;/h2&gt;
&lt;h2&gt;保険の契約&lt;/h2&gt;
&lt;p&gt;（あとで書く。）&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>ハワイで運転免許を取る話。</title>
    <link>http://torus.jp/diary/x200910/drivers-license.rd.html</link>
    <description>&lt;p&gt;先週の月曜日にめでたく、ハワイ州の自動車の運転免許を取得しました。日本にいる間も免許は持っていなくて車なんか一度も運転したことがなかったんですが、なんとか試験に合格できました。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;h2&gt;仮免許&lt;/h2&gt;
&lt;p&gt;まずデリンハム（Dillingham）の試験場に行って、筆記試験を受けます。筆記試験が通ると、その場で仮免許証を発行してもらえます。で、仮免を持っていると、助手席に免許取得後 3 ヶ月以上の人を乗せていれば公道を走ってもいいというすごい決まりがあります。&lt;/p&gt;
&lt;p&gt;で、その筆記試験ですが、今年（2009 年）のはじめあたりまでは日本語の問題もあったそうですが、その後制度が改訂されて、英語のみになりました。試験問題は『イエローページ・ジャパン』というその辺で配っている無料の情報誌に全問載っているので、それを見て勉強します。ただ、イエローページには日本語の問題しか載ってなかったので、受験のときだけ頭を切り替えて英語で受けました。問題の日本語の文章が英語の直訳だったので、特に英語の表現で悩む事はありませんでした。&lt;/p&gt;
&lt;p&gt;イエローページ以外にも試験問題を入手する方法はいろいろあるみたいです。ぼくは、受験の数日前に、同僚の人に頻出問題がチェックしてあるバージョンの問題集をもらって、重要な問題だけ何度かおさらいしました。&lt;/p&gt;
&lt;p&gt;筆記試験を受けて、80% 以上合っていれば合格です。実際の試験は 30 問だけです。ぼくは 1 問だけ間違ってしまいました。問題をよく読まないで選択肢だけ見て答えちゃった。&lt;/p&gt;
&lt;h2&gt;個人教習&lt;/h2&gt;
&lt;p&gt;アメリカには自動車の教習所というのありません。で、ぼくの場合は、自動車の個人教習をやっている日本人の人に依頼して、1 回 2 時間のレッスンを全部で 6 回受けました。レッスンと試験に使う車は貸してもらえました。&lt;/p&gt;
&lt;p&gt;最初の 2 回は、あんまり車が走っていないカカアコ（Kakaako）公園の前の道で習いました。ここで右左折や一旦停止の練習などをやって、その次からはもういきなりロードテストのコースで練習です。テストコースにはもちろん信号などもあるし、結構交通量が多いので、どきどきしながらレッスンを受けました。&lt;/p&gt;
&lt;p&gt;ぼくは方向音痴なので、いつまでたってもコースが把握できずに困っていたんですが、ネットを探していたら親切に Flash を使ってコースの解説をしてくれているページを発見しました。
&lt;a href=&quot;http://www.hawaiilovesyou.com/drivingtestmap.html&quot; class=&quot;external&quot;&gt;Hawaii Loves You ハワイ運転免許取得サービス　路上テストコースをフラッシュとマップで解説&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なかなかうまく運転ができなかったので、レッスンの度に胃が痛くて憂鬱でした。で、5 回目のレッスンの後、まだ少し自信がなかったので、もう 1 回追加してもらって、怒られながらもなんとか一通り運転できるようになりました。&lt;/p&gt;
&lt;h2&gt;ロードテスト&lt;/h2&gt;
&lt;p&gt;試験は月曜日の朝 8:00 からでした。試験の日は 6:45 に迎えにきてもらって、テストコースを 2 周回って最終確認し、それからテストを受けました。&lt;/p&gt;
&lt;p&gt;アメリカのロードテストは、自分の車で受けることになっています。ぼくのときは優しい女性の試験官で、たぶんちょっとおまけしてもらってぎりぎり 15 点で合格でした。点が多いほど悪くて、15 点がボーダーなのです。ロードテストが終わって駐車場に駐車すると、3 カ所あったマイナスポイントの説明を受けました。&lt;/p&gt;
&lt;p&gt;まあ何にしても合格したので、その後すぐに免許費用を払って、その場で写真を撮って、すぐに免許証が発行されました。&lt;/p&gt;
&lt;h2&gt;費用&lt;/h2&gt;
&lt;p&gt;レッスンは 1 回 $110（ただし最初の 2 回は $120、チップ含まず）、試験当日の立ち会いとかの費用が $270、受験料が $8、免許証発行費用は $24 でした。なんだかんだ言って $1,000 を超えましたが、日本で取るのに比べればそれでもだいぶ安いんじゃないかな。&lt;/p&gt;
&lt;h2&gt;車を手に入れる&lt;/h2&gt;
&lt;p&gt;まだぼくは車を持っていないので、これから自動車屋さんを回ったり、だれか車を譲ってくれる日本人を探したりして車を手に入れる予定です。アメリカでは中古車の値段が高いのですが、&lt;a href=&quot;http://www.kbb.com/&quot; class=&quot;external&quot;&gt;Kelley Blue Book&lt;/a&gt; というウェブサイトで中古車の値段の相場が調べられるので、それを見ながらぼったくられないように気をつけます。また、
&lt;a href=&quot;http://www.carfax.com/&quot; class=&quot;external&quot;&gt;CARFAX&lt;/a&gt;
という自動車の事故歴などを照会できるサービスがあるので、そういうのを見て事故車をつかまされないようにするといいらしいです。&lt;/p&gt;
&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  <item>
    <title>Flash と Flex の連携</title>
    <link>http://torus.jp/memo/x200909/flex-and-flash.html</link>
    <description>&lt;p&gt;Flash で作ったムービークリップを Flex に埋め込んで、メソッドを呼び出す手順。
&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;


&lt;h2 id=&quot;H-jcntl3&quot;&gt;動機
&lt;/h2&gt;&lt;p&gt;Flex でロジックを実装し、見た目はデザイナーに Flash で作ってほしい。
&lt;/p&gt;&lt;h2 id=&quot;H-ljic89&quot;&gt;手順
&lt;/h2&gt;&lt;p&gt;すべて ActionScript 3.0 を使って記述する必要がある。
&lt;/p&gt;&lt;h3 id=&quot;H-az1jc6&quot;&gt;フォルダ階層
&lt;/h3&gt;&lt;p&gt;まとめると、フォルダ階層はこんな感じ：
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;main.mxml
&lt;/li&gt;&lt;li&gt;view/
&lt;ul&gt;&lt;li&gt;view.fla
&lt;/li&gt;&lt;li&gt;symbol.swc
&lt;/li&gt;&lt;li&gt;SymbolClass.as
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;H-1dn2855&quot;&gt;Flash
&lt;/h3&gt;&lt;p&gt;Flash でシンボルを定義し、クラスも定義して、さらに中にメソッドを定義したりする。
ここでは、SymbolClass という名前のクラスを定義するとする。
&lt;/p&gt;&lt;p&gt;このシンボルには、hoge_mc というインスタンス名のついたシンボルインスタンスが配置してあって、ActionScript はたとえばこんな感じ。
&lt;/p&gt;&lt;pre&gt; package {
     import flash.display.MovieClip;
 
     public dynamic class SymbolClass extends MovieClip {
         public function GetHoge():MovieClip {
             trace (&quot;GetHoge: &quot; + hoge_mc);
             return hoge_mc;
         }
     }
 }
&lt;/pre&gt;&lt;p&gt;このシンボルを SWC ファイルとして書き出す。ここでは symbol.swc というファイル名で書き出す。
&lt;/p&gt;&lt;p&gt;このとき、シンボルのクラスを定義する .as ファイルは Flex からは読み込まないようにしたいので、mxml よりも 1 段階深いフォルダに Flash 関連のファイルを入れておく。
ここでは view というフォルダをこのために作っている。
&lt;/p&gt;&lt;h3 id=&quot;H-miy4tf&quot;&gt;MXML
&lt;/h3&gt;&lt;p&gt;メインの MXML ファイルを main.mxml とする。
MXML 内の ActionScript から、SWC ファイル内のシンボルのインスタンスを作るには、単に
&lt;/p&gt;&lt;pre&gt;    var x:SymbolClass = new SymbolClass ();
&lt;/pre&gt;&lt;p&gt;とすればよい。必要な定義はすべて SWC に含まれているので import とかは必要ない。
&lt;/p&gt;&lt;h3 id=&quot;H-7hfsjb&quot;&gt;MXML のコンパイル
&lt;/h3&gt;&lt;p&gt;mxmlc コマンドの -include-libraries オプションで SWC ファイルを指定する。
&lt;/p&gt;&lt;p&gt;ただし、ここで view フォルダを -source-path に入れないこと。
mxmlc のソース検索パスに view を含めてしまうと、Flash で SWC を生成するときに、暗黙のうちに定義されるメンバにアクセスできなくなる。
&lt;/p&gt;&lt;h2 id=&quot;H-yxc85o&quot;&gt;その他
&lt;/h2&gt;&lt;h3 id=&quot;H-13p1mqe&quot;&gt;SWC 出力の自動化（訂正あり）
&lt;/h3&gt;&lt;p&gt;Flash で SWC を出力するのは結構めんどくさいので、JavaScript を使って自動化する。
&lt;/p&gt;
&lt;pre&gt; var itemArray = fl.getDocumentDOM().library.items;
 var index = fl.getDocumentDOM().library.findItemIndex (&quot;symbol&quot;); // シンボル名
 fl.getDocumentDOM().library.items[index].
    exportSWC(&quot;file://C|/Users/toru/src/hoge/view/symbol.swc&quot;); // 出力ファイル名
&lt;/pre&gt;&lt;p&gt;このスクリプトは &lt;a bitly=&quot;BITLY_PROCESSED&quot; href=&quot;http://svn.eionet.europa.eu/projects/FlashLibrary/browser/trunk/MapComponentsV5/jsfl/export2swc.jsfl&quot;&gt;http://svn.eionet.europa.eu/projects/FlashLibrary/browser/trunk/MapComponentsV5/jsfl/export2swc.jsfl&lt;/a&gt; を参考にしました。
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;訂正&lt;/em&gt;：実はこんなことをする必要はなくて、publish settings で、export SWC という項目をチェックすればいいだけでした。
&lt;/p&gt;&lt;h2&gt;Comments&lt;/h2&gt;
&lt;div class=&quot;comments-content&quot;&gt;
    &lt;div id=&quot;tpc_thread&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_title&quot;&gt;&lt;/div&gt;
    &lt;div style=&quot;display:none;&quot; id=&quot;tpc_post_message&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot;&gt;
        var TPConnect = {};

        TPConnect.tpc_url = '';
        TPConnect.tpc_title = document.getElementById('tpc_post_title').innerHTML;
        TPConnect.tpc_message = document.getElementById('tpc_post_message').innerHTML;
    &lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/embed.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://static.typepad.com/.shared/js/profile/blogside.js&quot;&gt;&lt;/script&gt;
    &lt;noscript&gt;&lt;a href=&quot;http://profile.typepad.com/services/embed/tpc/6a01156e9dbc2b970c01156f96e7e1970b/thread&quot;&gt;View the entire comment thread.&lt;/a&gt;&lt;/noscript&gt;
&lt;/div&gt;
&lt;!-- END TypePad Connect --&gt;
</description>
  </item>

  </channel>
</rss>