<?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/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>

  <item>
    <title>「The Cove」を観た。</title>
    <link>http://torus.jp/diary/x200909/the-cove.rd.html</link>
    <description>&lt;p&gt;先月の終わりの話ですが、カハラモールにある映画館で「&lt;a href=&quot;http://thecovemovie.com/&quot; class=&quot;external&quot;&gt;The Cove&lt;/a&gt;」という映画を観てきた。すごかった。「オーシャンズ 11」を地でいくようなドキュメンタリーでした。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&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;p&gt;でも、現地の人は威嚇して証拠のためにビデオで撮影するだけで、手を出したり、間違えて銛でさしたりしないところが平和だなと思いました。&lt;/p&gt;
&lt;p&gt;ぼくもこの映画を見て、初めてイルカ漁のやり方を知りました。ぼくはてっきり船で沖に出かけて網か何かで引っ掛けるのかと思っていたんですが、実際には、狭い入り江（cove）にイルカの群れを誘い込み、周りを網で囲んで出られないようにしてから、銛で突っついて殺すというやりかたでした。なので映像は結構グロテスクです。血が苦手な人にはお勧めしません。&lt;/p&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/x200907/northshore-shrimp.rd.html</link>
    <description>&lt;p&gt;この週末はいろいろ充実していました。土曜日は午前中に散髪をして、午後から同僚の人にノースショアに連れて行ってもらいました。ぼくはまだ観てないんだけど「モヤモヤさまぁ〜ず」っていうテレビ番組で、ノースショアの知る人ぞ知るコーヒー屋さんが紹介されていたそうで、そこへ行きながら途中でいろいろと寄り道をしました。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;p&gt;ノースショアの名物料理はカフク海老のガーリック炒めです。GIOVANNI'S っていうトラックで売っているのが元祖で、似たお店はたくさんありますが、今のところ GIOVANNI が一番みたいです。メニューは、普通のガーリックシュリンプと辛いソースで炒めたのがあります。あと、レモンバターっていうのもあるみたいだけど、まだ試した事はありません。で、今回はぼくは辛いのを食べました。かなり辛かったです。が、だんだん慣れてくるとおいしいです。&lt;/p&gt;
&lt;p&gt;あと、ハレイワ・アート・フェスティバルっていうのの張り紙がしてあったので、そこもちょこっと寄ってみたり、「モヤモヤさまぁ〜ず」で紹介されたという「Old Sugar Mill」というワイアルア・コーヒーのお店でかき氷を食べたりしました。&lt;/p&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/x200907/tsukemen.rd.html</link>
    <description>&lt;p&gt;今日、近所のラーメン屋でつけ麺を食べた。最近は和食ブームなのか、ハワイにもおいしい和食屋さんがたくさんできています。このラーメン屋も単なるラーメン屋じゃなくてわざわざ「家系（IEKEI）」と銘打っていて、神奈川県出身の人も納得のラーメンを出したりしています。でもこういうお店が必ずしもローカルの人に受けるとは限らないので、つぶれないようにたまにみんなで食べにいきます。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;p&gt;実は少し前まで、日本ではつけ麺で有名だった「大勝軒」がハワイにもあったんだけど、ここはあんまりおいしくなくて、少し前についにつぶれました。で、その後にできたのが、こんどはうどんをメインの和食屋さんです。ここもおいしいらしい。ハワイでうどんといえば、「JIMBO」というお店が有名ですが、ここはちょっと高くて、しかも最近さらに値上げしたので、最近はみんないくのを嫌っていたところでした。&lt;/p&gt;
&lt;p&gt;それとは全然関係ないけど、ここ 2 週間くらいずっと体調が悪くて、たまに会社を休んだりしていたんだけど、どうやらその主な原因は扇風機のようだった。最近たまに夜が暑いので、扇風機を買って来て、つけたまま寝ていたんだけど、それがいけなかったらしい。よく扇風機をつけたまま寝ると死ぬとか言う人がいたけど、それも嘘じゃないかもしれない。扇風機を天井に向けて直接風が体にしていたんだけど、それでも喉が乾燥してしまうみたい。&lt;/p&gt;
&lt;p&gt;はじめはなんで具合が悪いのかぜんぜん見当がつかなくて、もうよっぽど疲れがたまって来たのかと思っていたんですが、まだそこまではいってないみたい。&lt;/p&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>Lua のコルーチンの使い方〜基本編〜</title>
    <link>http://torus.jp/memo/x200907/lua-coroutine.rd.html</link>
    <description>&lt;p&gt;Lua のコルーチンはとても便利ですが、意外とあんまり使われていないようなので、簡単な使い方をまとめてみたいと思います。&lt;/p&gt;
&lt;hr class=&quot;seemore&quot; /&gt;



&lt;h2&gt;基本&lt;/h2&gt;
&lt;p&gt;Lua コルーチンは、関数に対して「途中で抜けて、あとで戻る」ための機能を追加した物です。&lt;/p&gt;
&lt;h3&gt;coroutine.yield&lt;/h3&gt;
&lt;p&gt;コルーチンの中心的な機能である「途中で抜ける」には coroutine.yield という関数を使います。&lt;/p&gt;
&lt;pre&gt;function ex1 ()
   coroutine.yield &quot;HELLO!&quot;
   coroutine.yield &quot;HELLO AGAIN!!&quot;
   return &quot;SEE YOU!&quot;
end
&lt;/pre&gt;

&lt;p&gt;こんな風に使うと、関数の途中で抜けてそのときに、返り値として &quot;HELLO!&quot; や &quot;HELLO AGAIN!!&quot; という文字列を返します。&lt;/p&gt;
&lt;p&gt;ただし、ここで定義した ex1 という関数はこのままでは「ただの関数」なので、この yield は使えません。そこで、「ただの関数」を「コルーチン」へ格上げしてあげなければいけません。&lt;/p&gt;
&lt;h3&gt;coroutine.wrap&lt;/h3&gt;
&lt;p&gt;coroutine.wrap という関数を使うと、「ただの関数」を「コルーチンとして使える関数」へ変換してくれます。&lt;/p&gt;
&lt;pre&gt;local ex1_co = coroutine.wrap (ex1)
&lt;/pre&gt;

&lt;p&gt;こんなふうにすると、ex1_co はただの関数と同じように呼び出し、返り値として yield された値を受け取る事ができます。なので、&lt;/p&gt;
&lt;pre&gt;print (ex1_co ())
&lt;/pre&gt;

&lt;p&gt;とすると、「HELLO!」という文字列が印字されます。&lt;/p&gt;
&lt;pre&gt;print (ex1_co ())
&lt;/pre&gt;

&lt;p&gt;もう一度よびだすと、今度は「HELLO AGAIN!!」とでてくるはずです。ex1 が途中から実行されているのがこれで確認できます。&lt;/p&gt;
&lt;pre&gt;print (ex1_co ())
&lt;/pre&gt;

&lt;p&gt;さらにもう一度呼び出すと、もう yield はないので、関数そのものの返り値を受け取ります。つまり「SEE YOU!」という出力を得ます。これを見るとわかるように、関数の返り値と yield で関数の途中で返された値は、基本的に同じように受け取る事ができます。&lt;/p&gt;
&lt;p&gt;ここで、コルーチンは最後まで実行されてしまったので、もう一度呼び出すとエラーがです。&lt;/p&gt;
&lt;pre&gt;print (ex1_co ()) -- error!
&lt;/pre&gt;

&lt;p&gt;エラーメッセージはこんな感じです。&lt;/p&gt;
&lt;pre&gt;lua: ex1.lua:13: cannot resume dead coroutine
stack traceback:
        [C]: in function 'ex1_co'
        ex1.lua:13: in main chunk
        [C]: ?
&lt;/pre&gt;

&lt;p&gt;dead という状態のコルーチンを resume できないというエラーです。詳しくは Lua のリファレンスマニュアルを参照してください。&lt;/p&gt;
&lt;h2&gt;ジェネレータとして使う&lt;/h2&gt;
&lt;p&gt;コルーチンとループと組み合わせると、データ列の要素をつぎつぎに返すような関数を作る事ができます。これはちょうど Python の「ジェネレータ」のような使い方ができます。&lt;/p&gt;
&lt;p&gt;ありがちな例ですが、呼び出すごとにフィボナッチ数を返すようなコルーチンを作ってみます。フィボナッチ数とは、数列の一種で、それぞれの要素の値が「前の要素と前の前の要素の和」として定義されているという物です。ただし、1 番目の 2 番目の要素はそれぞれ 0、1 と決まっています。&lt;/p&gt;
&lt;p&gt;関数の本体は次のようになります。&lt;/p&gt;
&lt;pre&gt;function ex2 ()
   local a = 0
   local b = 1

   coroutine.yield (a)
   coroutine.yield (b)

   while true do
      local newval = a + b
      a = b
      b = newval
      coroutine.yield (newval)
   end
end
&lt;/pre&gt;

&lt;p&gt;はじめの 2 つの yield では、あらかじめ決められた 0 と 1 という値が返され、それ以降は while を使った無限ループでひたすら値を計算して yield しています。これを見ると数学的な定義にかなり近い形で関数が定義できることがわかると思います。&lt;/p&gt;
&lt;p&gt;ex1 と同じように呼び出します。&lt;/p&gt;
&lt;pre&gt;local ex2_co = coroutine.wrap (ex2)
&lt;/pre&gt;

&lt;p&gt;としておいて、&lt;/p&gt;
&lt;pre&gt;print (ex2_co ())
&lt;/pre&gt;

&lt;p&gt;を何度も呼び出すと、その度にフィボナッチ数が次々に出力されます。&lt;/p&gt;
&lt;h2&gt;次回予告&lt;/h2&gt;
&lt;p&gt;サンプルコードは&lt;a href=&quot;http://gist.github.com/141352&quot; class=&quot;external&quot;&gt;Gist&lt;/a&gt;にも載せました。&lt;/p&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>Gauche on iPhone</title>
    <link>http://torus.jp/memo/x200906/gauche-on-iphone.html</link>
    <description>&lt;P&gt;Building Gauche 0.8.14 running on iPhone.&lt;/P&gt;
&lt;hr class=&quot;seemore&quot; /&gt;


&lt;H2 id=&quot;H-z4m19p&quot;&gt;Getting Boehm GC
&lt;/H2&gt;&lt;P&gt;You need the newest version of Boehm GC with this patch:
&lt;A href=&quot;http://www.hpl.hp.com/hosted/linux/mail-archives/gc/2009-June/002811.html&quot;&gt;http://www.hpl.hp.com/hosted/linux/mail-archives/gc/2009-June/002811.html&lt;/A&gt;
&lt;/P&gt;&lt;P&gt;Grab the newest source code (bdwgc) from CVS head.  For more detail refer here:
&lt;A href=&quot;http://www.hpl.hp.com/personal/Hans_Boehm/gc/&quot;&gt;http://www.hpl.hp.com/personal/Hans_Boehm/gc/&lt;/A&gt;
&lt;/P&gt;&lt;P&gt;Then, replace gc folder in Gauche source code with the CVS head version of bdwgc.
&lt;/P&gt;&lt;H2 id=&quot;H-1b6r4nv&quot;&gt;Building Gauche
&lt;/H2&gt;&lt;P&gt;Configure gauche with following options:
&lt;/P&gt;&lt;PRE&gt;./configure \
--enable-threads=none \
--host=arm-apple-darwin9 \
--target=arm-apple-darwin9 \
CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.0 \
CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp \
CXXCPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp \
CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.0 \
AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar \
RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib \
NM=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/nm \
CFLAGS=&quot;-arch armv6 -pipe -std=c99 -Wno-trigraphs -fpascal-strings \
-fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 \
-miphoneos-version-min=2.0 -gdwarf-2 \
-I/Library/iPhone/include \
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk&quot; \
LDFLAGS=&quot;-arch armv6 -pipe -std=c99 -gdwarf-2 \
-I/Library/iPhone/include \
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.0.sdk&quot; \
CXXFLAGS=&quot;-arch armv6 -pipe -std=c99 -Wno-trigraphs -fpascal-strings \
-fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 \
-miphoneos-version-min=2.0 -gdwarf-2 \
-I/Library/iPhone/include \
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk \
host_alias=arm-apple-darwin9 target_alias=arm-apple-darwin9 \
--no-create --no-recursion&quot;
&lt;/PRE&gt;&lt;P&gt;&lt;A href=&quot;http://gist.github.com/131842&quot;&gt;http://gist.github.com/131842&lt;/A&gt;
&lt;/P&gt;&lt;P&gt;Then, do make.
&lt;/P&gt;&lt;P&gt;これで libgauche.dylib ができますが、実行時にこの dylib をリンクさせる方法がないので、ar コマンドを使って静的なライブラリを作り、Xcode のプロジェクト設定で静的にリンクするようにしました。
&lt;/P&gt;&lt;P&gt;Now, you got the libgauche.dylib, but this can't be linked dynamically to your iPhone App.  (see &lt;A href=&quot;http://landonf.bikemonkey.org/code/iphone/iPhone_Framework_Support.20081202.html&quot;&gt;iPhone Framework Support - Shipping Libraries&lt;/A&gt; by Landon Fuller.) So remove libgauche.dylib and create static library instead by following command line:
&lt;/P&gt;&lt;PRE&gt;/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar crus libgauche.a \
core.o vm.o compaux.o macro.o code.o error.o class.o prof.o collection.o \
boolean.o char.o string.o list.o hash.o treemap.o bits.o port.o write.o read.o \
vector.o weak.o symbol.o keyword.o gloc.o compare.o regexp.o signal.o \
parameter.o module.o proc.o number.o bignum.o load.o paths.o promise.o repl.o \
autoloads.o system.o stdlib.o extlib.o exclib.o syslib.o moplib.o intlib.o \
compile.o scmlib.o objlib.o ../gc/.libs/*.o
&lt;/PRE&gt;&lt;H2 id=&quot;H-otj9b2&quot;&gt;Making Gauche Framework
&lt;/H2&gt;&lt;P&gt;Execute the framework.sh script like this:
&lt;/P&gt;&lt;PRE&gt; ./framework.sh 0.8.14
&lt;/PRE&gt;&lt;H3 id=&quot;H-m4aigo&quot;&gt;Embedding a Framework into your App
&lt;/H3&gt;&lt;P&gt;Here is a nice tutorial video: &lt;A href=&quot;http://rentzsch.com/cocoa/embeddedFrameworks&quot;&gt;rentzsch.com: Embedded Cocoa Frameworks&lt;/A&gt;.
Thanks Jonathan!
&lt;/P&gt;&lt;H2 id=&quot;H-1yayzka&quot;&gt;Calling Gauche API from your Application
&lt;/H2&gt;&lt;P&gt;Include header files:
&lt;/P&gt;&lt;PRE&gt;#define GAUCHE_API_0_8_8
#import &amp;lt;Gauche/gauche.h&amp;gt;
&lt;/PRE&gt;&lt;P&gt;Initialize Gauche object:
&lt;/P&gt;&lt;PRE&gt; Scm_Init(GAUCHE_SIGNATURE);
&lt;/PRE&gt;&lt;P&gt;Then, evaluate scheme expressions:
&lt;/P&gt;&lt;PRE&gt; NSString *e = [NSString stringWithFormat:@&quot;(with-output-to-string (lambda () (write %@)))&quot;, expr];
 
 ScmEvalPacket pack;
 int n = Scm_EvalCString([e cStringUsingEncoding:NSUTF8StringEncoding], SCM_OBJ(Scm_UserModule()), &amp;amp;pack);
&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>

  </channel>
</rss>