<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>hanai</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/" />
    <link rel="self" type="application/atom+xml" href="http://blog.s2factory.co.jp/hanai/atom.xml" />
    <id>tag:blog.s2factory.co.jp,2008-02-14:/hanai//2</id>
    <updated>2010-04-07T07:15:08Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.27-ja</generator>

<entry>
    <title>flashでencrypt、perlでdecrypt</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2010/01/flashencryptperldecrypt.html" />
    <id>tag:blog.s2factory.co.jp,2010:/hanai//2.221</id>

    <published>2010-01-27T15:12:58Z</published>
    <updated>2010-04-07T07:15:08Z</updated>

    <summary>SSLが使えない時などにWebブラウザーとバックエンド間で暗号化したデータをやり...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="crypt" label="crypt" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        SSLが使えない時などにWebブラウザーとバックエンド間で暗号化したデータをやり取りしたい場合はどうすればいいのでしょうか? 今回はWebブラウザー側としてflash、バックエンド側としてperlを用いることにして、flashで暗号したデータをperlで復号する場合を考えてみます。暗号アルゴリズムはBlowfishでモードはCBCで利用します。
        <![CDATA[flash用の暗号ライブラリはいくつかあるようですが<a href="http://code.google.com/p/as3crypto/">As3 Crypto</a>が良さそうです。データを暗号するAS3コードは以下のようになります。

<pre class="prettyprint">
private function encrypt():void {
    var plainStr:String = "生文字列";
    var keyStr:String = "e602f3c05b191eb50390c4d234b9feb0";
    var key:ByteArray;
    var data:ByteArray;
    key = Hex.toArray(keyStr);
                  
    data = Hex.toArray(Hex.fromString(plainStr));

    var pad:IPad = new PKCS5;
    var cipher:ICipher = Crypto.getCipher("blowfish-cbc", key, pad);
    pad.setBlockSize(cipher.getBlockSize());
    cipher.encrypt(data);
    var resultStr:String = Hex.fromArray(data);

    var ivmode:IVMode = cipher as IVMode;
    var ivStr:String = Hex.fromArray(ivmode.IV);
}
</pre>

<code>plainStr</code>が暗号したい平文で<code>keyStr</code>が128ビット長の鍵です。<code>resultStr</code>に暗号データ、<code>ivStr</code>にIV(Initialization Vector)が、それぞれ16進表記の文字列としてセットされるのでこれをバックエンドに送信します。

一方、バックエンドのperlでは送信された暗号文字列(<code>$encrypted</code>)とIV(<code>$iv_str</code>)を受け取ったら以下のように復号します。

<pre class="prettyprint">
use Crypt::CBC;

my $key = pack("H*", 'e602f3c05b191eb50390c4d234b9feb0');

my $iv  = pack("H*", $iv_str);
my $encoded = pack("H*", $encrypted);

my $cipher = Crypt::CBC-&gt;new( -key    =&gt; $key,
                              -keysize =&gt; 16,
                              -literal_key =&gt; 1,
                              -cipher =&gt; "Blowfish",
                              -header =&gt; 'none',
                              -iv     =&gt; $iv,
                            );

my $plain = $cipher-&gt;decrypt(pack("H*", $encrypted));
</pre>

鍵は以下のように長さ(上の場合は16バイト==128ビット)を決め適当なものを用意すればよいのですが、perl 側のCrypt::CBCのコンストラクターに渡す<code>keysize</code>をその鍵の長さ(バイト数)にしておかないとうまく復号できません。

例えば自分の好きな文字列「this is a pen」を用いて<code>unpack("H*", "this is a pen")</code>(perlの場合)して得られた<code>7468697320697320612070656e</code>だと13バイトなので0を6つ付けて<code>7468697320697320612070656e000000</code>として16バイトの鍵とするなどします。

当然のことながら鍵は大切にしまっておきましょう。]]>
    </content>
</entry>

<entry>
    <title>Apache新バージョンとSNI</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2009/07/apache-and-sni.html" />
    <id>tag:blog.s2factory.co.jp,2009:/hanai//2.181</id>

    <published>2009-07-29T01:46:01Z</published>
    <updated>2009-07-29T02:09:47Z</updated>

    <summary>Apache webサーバーのバージョン2.2.12が出ましたね。マイナーリリー...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="apache" label="apache" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[<p><a href="http://www.apache.org/dist/httpd/Announcement2.2.html">Apache webサーバーのバージョン2.2.12が出ました</a>ね。マイナーリリースなので大きな変更はもちろんないのですが、このバージョンから<a href="http://www.ietf.org/rfc/rfc4366.txt">SNI</a>が実装されたので、これをサポートするブラウザーとの組合せになりますが、これまで一般的には利用不可能であったSSL環境におけるname-based virtual hostingが可能になります。まだ手元で試したわけではないのですが。</p>

<p>SNIは、Mozilla Firefox 2.0以上、Mac版Safari 3.2.1以上、Google Chrome、Opera 8.0以上、Vista上のIE7.0以上で利用可能なようです。ブラウザーが限られることから不特定多数がアクセスする可能性のあるWebサイトではまだまだ利用しにくいのですが、それでもないよりはぜんぜん良いですね。</p>]]>
        
    </content>
</entry>

<entry>
    <title>最近のperl6事情</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2009/05/recent-perl6-status-200905.html" />
    <id>tag:blog.s2factory.co.jp,2009:/hanai//2.138</id>

    <published>2009-05-27T09:02:47Z</published>
    <updated>2009-05-28T08:56:08Z</updated>

    <summary>本業がなんだかんだと忙しく更新をサボっているうちに前回から5か月も経ってしまいま...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        本業がなんだかんだと忙しく更新をサボっているうちに前回から5か月も経ってしまいました。その間ほとんど世の中の動きについていけてないのですが先日Parrot 1.2.0/Rakudo development realease #17がアナウンスされたので遊んでみました。
        <![CDATA[こちらがボンヤリとしているうちに<code>parrot</code>/<code>rakudo</code>まわりにはそこそこ動きがあったようで、手元で<code>perl6</code>処理系が動くようになるのにえらく手間取りました。以下、Mac OS X 10.5.7での結果です。

<h2>parrotのビルド</h2>
parrotのビルドは以前とそれほど変っていません。ソースtarballを取ってくるか、subversionリポジトリからチェックアウトしてビルドするだけです。
<pre>
$ svn co https://svn.parrot.org/parrot/trunk parrot
$ cd parrot
$ perl Configure.pl
Parrot Version 1.2.0 Configure 2.0
Copyright (C) 2001-2009, Parrot Foundation.

Hello, I'm Configure. My job is to poke and prod your system to figure out
how to build Parrot. The process is completely automated, unless you passed in
the `--ask' flag on the command line, in which case I'll prompt you for a few
pieces of info.

Since you're running this program, you obviously have Perl 5--I'll be pulling
some defaults from its configuration.

init::manifest -      Check MANIFEST.....................................done.
init::defaults -      Set Configure's default values.....................done.
.........
.........
Okay, we're done!

You can now use `gmake' to build your Parrot.
After that, you can use `gmake test' to run the test suite.

Happy Hacking,
        The Parrot Team

$ make
Compiling with:
xx.c
/usr/bin/gcc-4.0 -I./include -I/opt/local/include -fno-common -no-cpp-precomp -pipe -I/usr/local/include -I/opt/local/include -pipe -fno-common -Wno-long-double -DHASATTRIBUTE_CONST -DHASATTRIBUTE_DEPRECATED -DHASATTRIBUTE_MALLOC -DHASATTRIBUTE_NONNULL -DHASATTRIBUTE_NORETURN -DHASATTRIBUTE_PURE -DHASATTRIBUTE_UNUSED -DHASATTRIBUTE_WARN_UNUSED_RESULT -falign-functions=16 -fvisibility=hidden -funit-at-a-time -maccumulate-outgoing-args -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wdisabled-optimization -Wendif-labels -Wextra -Wformat -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wmissing-braces -Wmissing-field-initializers -Wno-missing-format-attribute -Wmissing-include-dirs -Wpacked -Wparentheses -Wpointer-arith -Wreturn-type -Wsequence-point -Wno-shadow -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default -Wtrigraphs -Wundef -Wunknown-pragmas -Wno-unused -Wvariadic-macros -Wwrite-strings -Wbad-function-cast -Wdeclaration-after-statement -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wnonnull -DDISABLE_GC_DEBUG=1 -DNDEBUG -O3 -DHAS_GETTEXT -Wno-shadow -DHAVE_COMPUTED_GOTO -I. -o xx.o -c xx.c
perl tools/build/vtable_extend.pl
......
......
c++ -o pbc_info \
    src/pbc_info.o \
    -L/Volumes/repository/work/svn/parrot/blib/lib -L/Volumes/repository/work/svn/parrot/blib/lib -lparrot -lpthread -lm -L/opt/local/lib  -licuuc -licudata -lpthread -lm -lm -lutil -lgmp -lreadline -lintl -undefined dynamic_lookup -L/opt/local/lib  
$
</pre>
これで<code>parrot</code>という実行ファイルができているはずです。

<h2>rakudoのビルド</h2>
<code>rakudo</code>は以前は<code>parrot</code>のソースツリーに入っていましたが、いつのまにやら独自のリポジトリに移っていました。こちらは<code>subversion</code>ではなく<code>git</code>を使っています。
<pre>
$ git clone git://github.com/rakudo/rakudo.git
......
$ cd rakudo
$ perl Configure.pl \
    --parrot-config=&lt;path&gt;/&lt;to&gt;/parrot/parrot_config
......
Reading configuration information from parrot_config ...
Died at Configure.pl line 104.
$
</pre>
うまくいきません。<br />調べてみると<code>parrot_config --dump</code>の出力を読むところでコケているようです。手で起動してみると確かにダメです。
<pre>
$ cd ../parrot
$ ./parrot_config --dump
......
......
execcapable => '0'
flex_version => ''[1]    10491 bus error  ./parrot_config --dump
$
</pre>
この現象はMac OS Xだからなのかもしれませんが<code>rakudo</code>関係のメーリングリストを検索してみたら<code>Linux</code>でもそういうことが起きると言ってる人がいるようです。<code>FreeBSD 7.2</code>では問題ありません。

<code>parrot_config</code>のソース(<code>PIR</code>で書かれてます)を見てみたりもしたのですがよくわかりません。あれこれ調べてみても結局よくわからなかったのですが、ふと<code>parrot</code>のビルド時に<code>perl Configure.pl --optimize</code>と、<code>--optimize</code>オプションをつけてみたところ<code>parrot_config --dump</code>もコケなくなりました。このオプションは<code>perl5</code>のコンパイルオプションを<code>parrot</code>のコンパイル時にも使うというものらしいのですがなぜこれでコケなくなるのかは、そこまで追えていないのでよくわかりません。

<code>parrot_config</code>がコケなくなったので気を取り直して再度<code>rakudo</code>をビルドします。

<pre>
$ perl Configure.pl --parrot-config=../parrot/parrot_config

Reading configuration information from ../parrot/parrot_config ...

Creating Makefile ...
Cleaning up ...

You can now use 'gmake' to build Rakudo Perl.
After that, you can use 'gmake test' to run some local tests,
or 'gmake spectest' to check out (via svn) a copy of the Perl 6
official test suite and run its tests.

sb254$ make
/Volumes/repository/work/svn/parrot/parrot  /Volumes/repository/work/svn/parrot/runtime/parrot/library/PGE/Perl6Grammar.pbc \
	    --output=src/gen_grammar.pir --encoding=utf8 \
	    src/parser/grammar.pg src/parser/grammar-oper.pg
/Volumes/repository/work/svn/parrot/parrot  /Volumes/repository/work/svn/parrot/compilers/nqp/nqp.pbc --output=src/gen_actions.pir \
	    --encoding=fixed_8 --target=pir src/parser/actions
......
......

/usr/bin/gcc-4.0 -o perl6.o -I/Volumes/repository/work/svn/parrot/include -I/opt/local/include -fno-common -no-cpp-precomp  -pipe -I/usr/local/include -I/opt/local/include -pipe -fno-common -Wno-long-double  -DHASATTRIBUTE_CONST  -DHASATTRIBUTE_DEPRECATED  -DHASATTRIBUTE_MALLOC  -DHASATTRIBUTE_NONNULL  -DHASATTRIBUTE_NORETURN  -DHASATTRIBUTE_PURE  -DHASATTRIBUTE_UNUSED  -DHASATTRIBUTE_WARN_UNUSED_RESULT  -falign-functions=16 -fvisibility=hidden -funit-at-a-time -maccumulate-outgoing-args -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment -Wdisabled-optimization -Wendif-labels -Wextra -Wformat -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wmissing-braces -Wmissing-field-initializers -Wno-missing-format-attribute -Wmissing-include-dirs -Wpacked -Wparentheses -Wpointer-arith -Wreturn-type -Wsequence-point -Wno-shadow -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default -Wtrigraphs -Wundef -Wunknown-pragmas -Wno-unused -Wvariadic-macros -Wwrite-strings -Wbad-function-cast -Wdeclaration-after-statement -Wimplicit-function-declaration -Wimplicit-int -Wmain -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wnonnull -DDISABLE_GC_DEBUG=1 -DNDEBUG -O3 -DHAS_GETTEXT -c perl6.c
Compiled: perl6.o
c++ -o perl6 perl6.o /Volumes/repository/work/svn/parrot/src/parrot_config.o -L/Volumes/repository/work/svn/parrot/blib/lib -L/Volumes/repository/work/svn/parrot/blib/lib -lparrot   -undefined dynamic_lookup -L/opt/local/lib -lm -lutil -lgmp -lreadline -lintl -lpthread -lm -L/opt/local/lib  -licuuc -licudata -lpthread -lm
Linked: perl6
$ 
</pre>

<code>perl6</code>という実行ファイルができているはずです。動かしてみると、、、
<pre class="prettyprint">
$ ./perl6 -e "say 'hello';"
hello
$
</pre>

無事動きました。

わかってしまえば30分もあればできることですが今回はナゾの<code>bus error</code>のために<code>perl6</code>をビルドするまでにかなり労力を使ってしまいました。次回(いつだ?)はこの<code>perl6</code>でもっと遊んでみたいと思います。
<br /><br />
(追記)
<code>rakudo</code>のビルド時のconfigurationで<code>--gen-parrot</code>というオプションを付けると適切なバージョンの<code>parrot</code>のソースをリポジトリからチェックアウトしてビルドし、その<code>parrot</code>を使って<code>rakudo</code>をビルドしてくれますが、この時に<code>--gen-parrot-option</code>で<code>parrot</code>のビルド時に与えるオプションを指定できることに気がつきました。すなわち、<code>rakudo</code>で遊びたいだけという場合はチェックアウトした<code>rakudo</code>のソースツリーで
<pre>
$ perl Configure.pl --gen-parrot \
    --gen-parrot-option="--optimize"
</pre>
とするだけですね。]]>
    </content>
</entry>

<entry>
    <title>mod_parrot</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2009/01/mod-parrot.html" />
    <id>tag:blog.s2factory.co.jp,2009:/hanai//2.114</id>

    <published>2009-01-09T04:17:42Z</published>
    <updated>2009-01-09T05:10:11Z</updated>

    <summary>先日mod_parrotのバージョン0.5がリリースされました。ここのところBB...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="apache" label="apache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="parrot" label="parrot" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl6" label="perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[先日<a href="http://www.parrot.org/mod_parrot">mod_parrot</a>の<a href="http://www.smashing.org/jeff/node/49">バージョン0.5</a>がリリースされました。ここのところBBCやActiveStateがアドバイザリーボードに加わりなんとなく勢いが出てきた感じのする<a href="http://www.parrot.org/">Parrot</a>界隈ですが、mod_parrotなんていうものも開発されていたことは全く知りませんでした。どれぐらい動くものなのかよくわかりませんがとにかく遊んでみましょう。]]>
        <![CDATA[まず<code>parrot</code>をビルドします。
<pre class="prettyprint">
$ svn co https://svn.perl.org/parrot/trunk parrot
$ cd parrot
$ perl Configure.pl
$ make
</pre>

次に<code>mod_parrot</code>をビルドします。
<pre class="prettyprint">
$ svn co https://svn.perl.org/parrot-modules/mod_parrot/trunk mod_parrot
$ cd mod_parrot
$ perl Configure.pl --parrot-build-dir=/home/hanai/work/svn/parrot --apxs=/usr/local/apache2/bin/apxs
$ make
</pre>

<code>mod_parrot</code>ビルド時に<code>--parrot-build-dir</code>で<code>parrot</code>のビルドディレクトリを指定します。また<code>make</code>時にはヘッダーファイルがないとかリンクするライブラリが見つからないなどのエラーが環境によって出ます(<code>Mac OS X 10.5</code>/<code>FreeBSD 7.1R</code>ではどちらも確実に出た)ので適宜<code>CFLAGS</code>や<code>LIBS</code>に書いてやります。<code>make</code>は<code>GNU make</code>が必要なようです。

<code>make</code>が成功すれば次は<code>make test</code>ですが、<code>Mac OS X 10.5</code>でも<code>FreeBSD 7.1R</code>でもうまくいきませんでした。ひとまずテストは無視して<code>make install</code>でインストールします。

<code>make install</code>により<code>Apache</code>の設定ファイルに

<pre class="prettyprint">
LoadModule parrot_module      modules/mod_parrot.so
</pre>

という行が追加されるはずですが、なければ自分で追加します。さらに

<pre class="prettyprint">
ParrotInit /Users/hanai/work/svn/mod_parrot/lib/mod_parrot.pbc
ParrotLibPath /Users/hanai/work/svn/mod_parrot/lib:/Users/hanai/work/svn/parrot/runtime/parrot/library
ParrotLoadImmediate ModParrot/HLL/pir.pbc
</pre>

のように<code>mod_parrot</code>関係の設定を自分の環境に合わせて加え<code>Apache</code>を再起動してみます。

<pre class="prettyprint">
freebsd71$ sudo apachectl restart
Starting apache22.
invoke() not implemented in class 'Undef'
current instr.: 'parrot;ModParrot;Apache;Module;add' pc 50 (lib/ModParrot/Apache/Module.pir:142)
called from Sub '__onload' pc 467 (lib/ModParrot/HLL/pir.pir:70)
freebsd71$
</pre>

<pre class="prettyprint">
macosx$ sudo apachectl restart
macosx$
</pre>

<code>Mac OS X</code>では<code>Apache</code>が動いてくれますが<code>FreeBSD 7.1R</code>は動いてくれません。<code>FreeBSD</code>ではまだ動かないのかもしれません。とりあえず<code>Mac OS X</code>で先に進みます。

<code>mod_parrot/eg</code>の下にいくつかサンプルコードがあるので動かしてみます。再度<code>Apache</code>の設定ファイルを編集して、

<pre class="prettyprint">
ParrotLoad /Users/hanai/work/svn/mod_parrot/eg/pir/handler.pir
&lt;Location /testhandler&gt;
     SetHandler parrot-code
     ParrotHandler Handler
&lt;/Location&gt;
</pre>

という行を追加します。これで<code>/testhandler</code>へアクセスすると<code>PIR</code>で書いたハンドラーが動くはずです。

<code>Apache</code>を再起動してみると、、、なんと動いてくれません!!

<pre class="prettyprint">
macosx$ sudo gdb /opt/local/apache2/bin/httpd
(gdb) run -X
Starting program: /opt/local/apache2/bin/httpd -X
Reading symbols for shared libraries +++++++++.. done
Reading symbols for shared libraries . done
......
......
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x8fe06178 in __dyld__ZN4dyld10loadPhase3EPKcRKNS_11LoadContextEPSt6vectorIS1_SaIS1_EE ()
(gdb) bt
#0  0x8fe06178 in __dyld__ZN4dyld10loadPhase3EPKcRKNS_11LoadContextEPSt6vectorIS1_SaIS1_EE ()
#1  0x8fe069ac in __dyld__ZN4dyld10loadPhase1EPKcRKNS_11LoadContextEPSt6vectorIS1_SaIS1_EE ()
#2  0x8fe06a73 in __dyld__ZN4dyld10loadPhase0EPKcRKNS_11LoadContextEPSt6vectorIS1_SaIS1_EE ()
#3  0x8fe06c1c in __dyld__ZN4dyld4loadEPKcRKNS_11LoadContextE ()
#4  0x8fe0ac10 in __dyld_NSCreateObjectFileImageFromFile ()
#5  0x93e359a7 in NSCreateObjectFileImageFromFile ()
#6  0x010d261a in Parrot_dlopen (filename=0x0) at dl.c:129
#7  0x010712b5 in get_path (interp=0x41aa30, lib=0x0, handle=0xbffff1fc, wo_ext=0x7de144, ext=0x0) at src/dynext.c:232
#8  0x01071e6d in Parrot_load_lib (interp=0x41aa30, lib=0x0, initializer_unused=0x0) at src/dynext.c:613
#9  0x01009d14 in Parrot_loadlib_p_s (cur_opcode=0x7f3128, interp=0x41aa30) at core.ops:1330
#10 0x010d7464 in runops_slow_core (interp=0x41aa30, pc=0x7f3128) at src/runops_cores.c:228
#11 0x01093bdf in runops_int (interp=0x41aa30, offset=0) at src/interpreter.c:984
#12 0x01094660 in runops (interp=0x41aa30, offs=0) at src/inter_run.c:108
#13 0x010948e7 in runops_args (interp=0x41aa30, sub=0x7da980, obj=0x8b8b78, meth_unused=0x0, sig=0x5bcc2c "v", ap=0xbffff3ec ">h[") at src/inter_run.c:248
#14 0x01094f31 in Parrot_runops_fromc_arglist (interp=0x41aa30, sub=0x7da980, sig=0x5bcc2c "v", args=0xbffff3ec ">h[") at src/inter_run.c:545
#15 0x01078e0b in Parrot_call_sub (interp=0x41aa30, sub=0x7da980, signature=0x5bcc2c "v") at src/extend.c:936
#16 0x005b8de9 in modparrot_call_sub ()
#17 0x005b69d6 in init_ctx ()
#18 0x005b6ae2 in modparrot_startup ()
#19 0x005b97f4 in modparrot_cmd_load_immediate ()
#20 0x00003b61 in invoke_cmd ()
#21 0x000045d0 in ap_walk_config ()
#22 0x00005647 in ap_process_config_tree ()
#23 0x00008e21 in main ()
</pre>

時間がなくなったのでとりあえずここまでです。せっかく<code>mod_parrot</code>で遊べるかと思いましたが動かすことができませんでした。リリース版のソースではなく<code>subversion</code>リポジトリからチェックアウトしたものをビルドしたのが悪いのかもしれませんし、開発している人たちと同じ環境なら動くのかもしれません。後日もう少し追いかけてみたいと思います。]]>
    </content>
</entry>

<entry>
    <title>じ、辞書が......</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/09/broken-skk-dic.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.94</id>

    <published>2008-09-14T06:45:17Z</published>
    <updated>2008-09-14T13:35:15Z</updated>

    <summary>メインマシンをMacにして以来、AquaSKKのおかげで常にSKKを使うことがで...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="skk" label="skk" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[メインマシンをMacにして以来、<a href="http://aquaskk.sourceforge.jp/">AquaSKK</a>のおかげで常に<a href="http://openlab.jp/skk/index-j.html">SKK</a>を使うことができるという幸せな生活に満足していましたが、昨日あたりからどうも調子がおかしいことに気がつきました。漢字への変換を行ってもフツーの候補は出ずヘンな候補ばかり出てくるのです。例えば「盛況」と書きたくて「せいきょう」とタイプして変換すると、「成卿」という文字が第一候補に出てきます。第一どころかこれが唯一の候補です。一体何が起こったのでしょう?]]>
        <![CDATA[<p>変換がおかしいということは、まあフツーに考えれば辞書がおかしくなったのだろうと想像がつきます。<a href="http://www.gnu.org/software/emacs/emacs.html">Emacs</a>内ではddskkを使っていますが辞書は <a href="http://aquaskk.sourceforge.jp/">AquaSKK</a>のskkservを使うようにしています。なので<a href="http://aquaskk.sourceforge.jp/">AquaSKK</a>の辞書を疑ってみます。</p>
<p>私の場合様々な辞書を登録してありますが、基本的な単語は配布物に同梱されている<code>SKK-JISYO.[SML]</code>に入っています。これは<a href="http://aquaskk.sourceforge.jp/">AquaSKK</a>環境設定の辞書のところを見るとSKK自動更新辞書として設定されています。実際の辞書ファイルの在処は<code>~/Library/AquaSKK/SKK-JISYO.L</code>です。早速このファイルを調べてみると、日付が2008.09.13 12:22となっておりこの時間に更新されたことがわかります。ここまでは問題ありませんがこのファイルのサイズはなんと2.4KB程度になっています。辞書がここまで小さいということはないはずです。実際に中身を見てみると辞書ファイルの先頭のコメント文だけが60行ほどあるだけです。</p>
<p>これまたどうしたことだろうと<code><a href="http://openlab.jp/skk/skk/dic/">http://openlab.jp/skk/skk/dic/</a></code>にアクセスしてみると、ここでもやはり中身がなくなっています。</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/hanai/photos/truncated_jisyo.png"><img alt="truncated_jisyo.png" src="http://blog.s2factory.co.jp/hanai/photos/truncated_jisyo-thumb-200x200.png" width="200" height="200" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></a></span>

<p>理由はわかったので<a href="http://openlab.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1">中身がある<code>SKK-JISYO.L</code></a>を取ってきてこれを使うようにしたので私の問題は解消したのですが一体何が起っているのでしょう?</p>

<p>(追記) 今日の18時すぎに復活したようです。</p>]]>
    </content>
</entry>

<entry>
    <title>遊べるperl6処理系</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/08/perl6-to-run.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.89</id>

    <published>2008-08-29T04:25:04Z</published>
    <updated>2008-08-29T05:22:57Z</updated>

    <summary>なかなか出ない本当に出るのかどうかもわからないperl6ですが、それでも少しは動...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="perl6" label="perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[なかなか出ない本当に出るのかどうかもわからないperl6ですが、それでも少しは動きがあるようで、<a href="http://github.com/viklund/november/tree/master">November</a>というperl6で書かれたWikiエンジンも出てきました。<br />
もちろん何やら動いとるでという程度のものですが、それでも動くものがあって遊べるとなるとだいぶ気分的に違います。]]>
        <![CDATA[perl6の処理系といえば<a href="http://www.pugscode.org/">Pugs</a>が有名だと思いますが、よく知りませんがあまり開発は進んでなさそうに見えます。一方、perl6のVMとなる<a href="http://www.parrotcode.org/">Parrot</a>(Parrotはperl6だけでなくいろいろなものを動かせますが)のソースツリーには<a href="http://rakudo.org/">Rakudo</a>というperl6の実装が入っており、<a href="http://github.com/viklund/november/tree/master">November</a>はこのRakudoで動くようになっています。早速動かしてみましょう。<br />
<br />
Parrotのビルドは以下のように割と簡単にできます。<br />
<br />
<pre>
$ svn co https://svn.perl.org/parrot/trunk parrot
$ cd parrot
$ perl Makefile.PL
Parrot Version 0.7.0 Configure 2.0
Copyright (C) 2001-2008, The Perl Foundation.

Hello, I'm Configure. My job is to poke and prod your system to figure out
how to build Parrot. The process is completely automated, unless you passed in
the `--ask' flag on the command line, in which case I'll prompt you for a few
pieces of info.

Since you're running this program, you obviously have Perl 5--I'll be pulling
some defaults from its configuration.

init::manifest -      Check MANIFEST.....................................done.
init::defaults -      Set Configure's default values.....................done.
.....
.....
You can now use `gmake' to build your Parrot.
After that, you can use `gmake test' to run the test suite.

Happy Hacking,
        The Parrot Team

$ make
Compiling with:
xx.c
.....
.....
c++ -o pbc_merge \
    src/pbc_merge.o \
    src/parrot_config.o \
    -L/Users/hanai/work/svn/parrot/blib/lib -L/Users/hanai/work/svn/parrot/blib/lib -lparrot -lpthread -lm -L/opt/local/lib  -licuuc -licudata -lpthread -lm -lm -lutil -lgmp -lreadline -lpcre -framework OpenGL -framework GLUT -lcrypto -lintl  -undefined dynamic_lookup -L/opt/local/lib  
4$ ls -l parrot
-rwxrwxr-x  1 hanai  staff  33888 Aug 29 13:56 parrot*
$ 
</pre>

perl6も簡単です。

<pre>
$ cd languages/perl6
$ make perl6
../../parrot  /Users/hanai/work/svn/parrot/runtime/parrot/library/PGE/Perl6Grammar.pbc \
            --output=src/gen_grammar.pir \
            src/parser/grammar.pg src/parser/grammar-oper.pg
.....
.....
c++ -o perl6 perl6.o /Users/hanai/work/svn/parrot/src/parrot_config.o -L/Users/hanai/work/svn/parrot/blib/lib -L/Users/hanai/work/svn/parrot/blib/lib -lparrot   -undefined dynamic_lookup -L/opt/local/lib -lm -lutil -lgmp -lreadline -lpcre -framework OpenGL -framework GLUT -lcrypto -lintl -lpthread -lm -L/opt/local/lib  -licuuc -licudata -lpthread -lm
Linked: perl6
$ ls -l perl6
-rwxrwxr-x  1 hanai  staff  1684544 Aug 29 14:02 perl6*
$ 
</pre>

Parrotがビルドできれば<a href="http://github.com/viklund/november/tree/master">November</a>を動かすのは簡単です。

<pre>
$ git clone git://github.com/viklund/november.git
$ cd november/p6w
$ PARROT_DIR=~/work/svn/parrot  ./test_wiki.sh                             
Content-Type: text/html

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;
    &lt;head&gt;
.....
.....
$
</pre>

このようにソースツリーをチェックアウトして<code>p6w</code>ディレクトリにあるtest_wiki.shが動けばひとまず動いてると考えていいようです。ただ、perl6プログラムをソースのままで動かすのは非常に遅いため、<code>p6w/Makeifle</code>の<code>PARROT_DIR</code>を自分の環境にあうように変更して<code>make</code>し、中間コードにしておきます。
<pre class="prettyprint">
$ pwd
/Users/hanai/work/git/november/p6w
$ vi Makefile
$ make
/Users/hanai/work/svn/parrot/parrot /Users/hanai/work/svn/parrot/languages/perl6/perl6.pbc --target=pir Impatience.pm  > Impatience.pir
/Users/hanai/work/svn/parrot/parrot /Users/hanai/work/svn/parrot/languages/perl6/perl6.pbc --target=pir HTML/Template.pm  > HTML/Template.pir
/Users/hanai/work/svn/parrot/parrot /Users/hanai/work/svn/parrot/languages/perl6/perl6.pbc --target=pir CGI.pm  > CGI.pir
/Users/hanai/work/svn/parrot/parrot /Users/hanai/work/svn/parrot/languages/perl6/perl6.pbc --target=pir Wiki.pm  > Wiki.pir
$
</pre>
これで体感はかなり速くなるでしょう。あとは<code>wiki.sh</code>の中の<code>PARROT_DIR</code>を自分の環境にあわせて変更し、ブラウザーから叩けるようにすればよいだけです。

<a href="http://github.com/viklund/november/tree/master">November</a>を動かしてみるのは比較的簡単でした。これから遊んでみようと思います。]]>
    </content>
</entry>

<entry>
    <title>flashによるファイルアップロードと認証に関するジレンマ</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/08/fileupload-from-flash-with-auth.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.84</id>

    <published>2008-08-14T08:20:03Z</published>
    <updated>2008-08-14T09:42:51Z</updated>

    <summary>S2ファクトリーではWebサイトを制作するとともにサイトを管理するためのCMSを...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        S2ファクトリーではWebサイトを制作するとともにサイトを管理するためのCMSを作ることがよくあります。さらに、一年ほど前からはCMSのユーザーインターフェイスをflashにすることが増えてきました。ところがここで大きな問題が生じてしまいました。flashによるファイルアップロードとWebサイトにおける認証との相性が悪いのです。この記事ではそのあたりを整理してみます。
        <![CDATA[CMSはWebサイトの内容を変更するためのツールなので使う人を制限するためになんらかの認証機構を入れます。よく使うのはBasic認証ですが、困ったことにファイルアップロードの機能が使えないことがあります。以下にまとめてみました(flash playerはWindowsもMac OS Xも最新の9.0.124.0を利用)。

<dl>
  <dt>Windows XP</dt>
  <dd>IE 6, Firefox 3.0.1, Opera 9.51すべてで問題なし。ただし、IE6はサイトにアクセスする際に一度Basic認証を通ればそれで済むが、FirefoxとOperaではファイルアップロード時に再度Basic認証を求められる。</dd>

  <dt>Mac OS X</dt>
  <dd>Safari 3.1.2, Firefox 3.0.1, Opera 9.51すべてで問題あり。ファイルアップロード不可能</dd>
</dl>

要するにWindows XPでは大丈夫だけどMac OS Xではダメということがわかりました。なぜダメなのか調べてみます。Basic認証を要求するURLに対してMac OS Xで動くブラウザーからファイルアップロードをした場合、Webサーバーのログは以下のようになっています。

<pre class="prettyprint">
xxx.xxx.xxx.xxx - - [14/Aug/2008:10:39:22 +0900]
  "POST /protected/foo.cgi HTTP/1.1" 401 401 "-"
  "Adobe Flash Player 9"
</pre>

一方Windows XPのIE 6からでは

<pre class="prettyprint">
xxx.xxx.xxx.xxx - username [14/Aug/2008:10:44:38 +0900]
  "POST /protected/foo.cgi HTTP/1.1" 200 20 "-"
  "Shockwave Flash"
</pre>

となっており、Windows XPのFirefox 3/Opera 9.51からだと

<pre class="prettyprint">
xxx.xxx.xxx.xxx - - [14/Aug/2008:10:48:14 +0900]
  "POST /protected/foo.cgi HTTP/1.1" 401 401 "-"
  "Shockwave Flash"
xxx.xxx.xxx.xxx - username [14/Aug/2008:10:48:25 +0900]
  "POST /protected/foo.cgi HTTP/1.1" 200 20 "-"
  "Shockwave Flash"
</pre>

です。これらのログを見れば何が起きているのかだいたい想像できます。<br />
<br />
Mac OS XでもWindowsでもflashによるファイルアップロードを行う場合、HTTPリクエストを発行するのはブラウザーではなくflash player自身になっていると考えられます(本当にそうなのかはわかりませんが便宜上そう考えてもよいように見える)。通常のフォームコンポーネントであればブラウザーに任せているようですがファイルアップロードだけは処理が違うようです。<br />
<br />
さらにMac OS Xのflash playerの場合、Basic認証のことをまったく考えていないようで、リクエストを発行して返事が401(Unauthorized)であればそこであきらめています。IE 6の場合、恐らくブラウザーとflash playerが他よりもより密に会話ができるのでしょう。リクエストを発行する時にブラウザーが知っているcredentialをもらってそれを投げてきています。一方、同じWindowsでもFirefox/Operaの場合は挙動が変ります。まずflash playerは認証がかかってないつもりでリクエストを投げてきますがサーバーからは当然401(Unauthorized)が返ります。するとflash playerはユーザー名とパスワードを入力するためのダイアログを出しユーザーに入力をうながします。そして再度credentialつきのリクエストを発行し、無事にBasic認証を通るというわけです。<br />
<br />
Mac OS X用のflash playerがそのうちこの問題に対応してくれるのかどうかよくわかりませんが、ひとまず使えないことがわかりました。自分たちの作るアプリケーションレイヤーでなんとかする必要があります。<br />
<br /><br />
次に、淡い期待をもってSSLによるクライアント認証を試してみました。Basic認証よりはいろいろと面倒だという点はありますが、よりセキュアな運用を求められている場合には有効かもしれません。<br />
<br />
いきなり結論を書きますが、Basic認証よりも悲惨な結果におわりました。まともに使えそうだったのはIE 6だけで、Windows版のFirefox/Operaも今回はダメでした。Macはいわずもがなな上にSafari 3.1.2のクライアント認証がいまいち安定しないという問題までありました。<br />
<br />
というわけで、Windows と IE しか使わない環境であればあまり気にする必要はありませんがそれ以外の環境では認証に関してはアプリケーションレベルでの対策が必要であるということがわかりました。<br />
<br />
ちなみに、向かいの <a href="http://blog.s2factory.co.jp/yoshizu/">seagirl</a> によるとflash player 10では選択したファイルの内容をバイト列で受け取ることができるようになるためそのままPOSTしてやればいいのではないかということです。flash player 10が出たら早速試してみたいところです。]]>
    </content>
</entry>

<entry>
    <title>LCD2枚を縦で使ってみる</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/06/lcd2.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.66</id>

    <published>2008-06-27T05:09:16Z</published>
    <updated>2008-06-27T05:41:33Z</updated>

    <summary> 諸事情によりEIZOのS2431Wを2枚買ってもらったのですが折角なので縦に並...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/hanai/photos/R0012135.jpg" rel="lightbox" title="S2431W x 2"><img src="http://blog.s2factory.co.jp/hanai/photos/R0012135-thumb-200x266.jpg" width="200" height="266" alt="R0012135.jpg" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></a></span>
諸事情によりEIZOのS2431Wを2枚買ってもらったのですが折角なので縦に並べてみました。我々プログラマーはモニターは縦に長いほうがいいのではないかと常々思っていたのですが実際にこうして実行してみるといくつか問題点が明かになります。
]]>
        まず横幅。縦にすると多くの人には普通に横長に置いた時よりも余計に細く感じます。これまでは1920x1200のLCDを1枚使っていたので2枚の合計幅は2,400pxと広くなっているわけですが、境目にはフレームが激しく自己主張をしているのでつながっている感じがしません。そのせいもあってか横幅が広くなったという感じがしません。
次が縦が長いことによる弊害。縦に長くなった分をめいっぱい活用しようとEmacsも縦長にしてみたのですが、特にたまったメールを処理している時(Mewを使っています)などは非常に辛く感じました。なぜなのか最初わからなかったのですが、ミニバッファがかなり下のほうにあるためでした。今までほとんど意識していなかったのですがEmacsを使っているとミニバッファを頻繁に見ます。Mewではメールの一覧は画面の上の方にあります。メールをフォルダーに移動する時には移動先のフォルダー名がミニバッファに表示されるため、私の疲れきった哀れな目は画面の上のほうから最下部へと長い長い旅をすることになります。フォルダー名を確認したらまた視線を上へ移動しなければなりません。そういうわけで目がとても疲れることがわかりました。
ミニバッファ用のフレームを別に作り、そのフレームを画面の上部に置いてみるということもやってみました。習慣というのは恐ろしいものでミニバッファを見る必要がある時、視線は勝手に下のほうへ移動します。そしてミニバッファが見つからず上へ移動することになり余計ストレスがかかることがわかりました。
もう一つ、ビデオカードがNVIDIA GeForce 7300GT(VRAM256MB)なのですが、1920x1200を2枚だとこのカードでは少々辛そうで、全体的にもっさりとした動きになった気がします。もう少し性能の良いビデオカードが必要かもしれません。これは縦2枚にしたこととは関係ないですね。

とりあえずメールを読むフレームはあまり縦長にせず、プログラムを編集するフレームだけ縦長にしてみましたが、さてこれでどうなるでしょう。もしかすると横長2枚にせざるを得ないかもしれませんがまあその時はその時です。
    </content>
</entry>

<entry>
    <title>FreeBSDでTamarinをビルド</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/04/freebsdtamarin.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.46</id>

    <published>2008-04-25T04:54:54Z</published>
    <updated>2008-04-25T05:36:41Z</updated>

    <summary>年度末のハリケーンに翻弄され、引越しでバタバタとしているうちにえらく間があいてし...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="freebsd" label="freebsd" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[年度末のハリケーンに翻弄され、引越しでバタバタとしているうちにえらく間があいてしまいました。今回はFreeBSDでAVMPlusを動かしてみるという話です。<br />
向いにいる<a href="http://blog.s2factory.co.jp/yoshizu/">seagirl</a>が<a href="http://www.mozilla-japan.org/projects/tamarin/">Tamarin</a>と戯れ始めたのですが、S2Fではほとんどのホストを<a href="http://www.freebsd.org/">FreeBSD</a>で運用しているため、FreeBSDでTamarinがビルドできるといろいろと都合が良いというのがそのキッカケです。]]>
        <![CDATA[もう少し苦労するかなと思っていたのですがビルドツリーの構成がよくできているのかほんの少し手を入れるだけでできてしまいました(パッチファイルへは記事の最後でリンクしています)。試した環境は<code>FreeBSD 7.0-RC3 i386</code>です(実は普段使っている <code>FreeBSD 8.0-CURRENT amd64</code> という環境ではソースのチェックアウトさえできませんでした)。

<pre class="prettyprint">
$ hg clone http://hg.mozilla.org/tamarin-central tamarin-central
$ cd tamarin-central
$ patch -p1 &lt; tamarin-freebsd.patch
$ mkdir objdir-debug
$ cd objdir-debug 
$ python ../configure.py --enable-shell
Generating /usr/home/hanai/tmp/tamarin-central/objdir-debug/MMgc-config.h...
Generating /usr/home/hanai/tmp/tamarin-central/objdir-debug/Makefile...
$ gmake
/usr/home/hanai/tmp/tamarin-central/build/rules.mk:62: MMgc.thing.pp: No such file or directory
/usr/home/hanai/tmp/tamarin-central/build/rules.mk:62: avmplus.thing.pp: No such file or directory
/usr/home/hanai/tmp/tamarin-central/build/rules.mk:62: shell.thing.pp: No such file or directory
Writing shell.thing.pp: doesn't exist
Building shell.thing.pp
Writing avmplus.thing.pp: doesn't exist
Building avmplus.thing.pp
Writing MMgc.thing.pp: doesn't exist
Building MMgc.thing.pp
test -d MMgc/ || mkdir -p MMgc/
g++ -E -DAVMPLUS_CDECL -DHAVE_PTHREAD_NP_H -DAVMPLUS_IA32 -DMMGC_INTERIOR_PTRS -DUNIX -DAVMPLUS_UNIX -DSOFT_ASSERTS -DLINUX    -fno-exceptions -Werror -Wall -Wno-reorder -Wno-switch -Wno-invalid-offsetof -Wno-uninitialized -Wno-strict-aliasing -fmessage-length=0 -finline-functions -finline-limit=65536 -fno-rtti -fno-exceptions  -Os    -I/usr/home/hanai/tmp/tamarin-central -I/usr/home/hanai/tmp/tamarin-central/MMgc -I/usr/home/hanai/tmp/tamarin-central/core -I/usr/home/hanai/tmp/tamarin-central/codegen -I/usr/home/hanai/tmp/tamarin-central/pcre  /usr/home/hanai/tmp/tamarin-central/MMgc/MMgc.cpp > MMgc/MMgc.ii
......
</pre>

これで<code>shell/avmshell</code>という実行ファイルが作られますので<code>ABC</code>なデータを食わせてやります。非常に簡単なコードは動いているようですがホントにきちんと動くかどうかはテストが必要でしょう。<br />
パッチ: <a href="/hanai/tamarin-freebsd.patch">tamarin-freebsd.patch</a>]]>
    </content>
</entry>

<entry>
    <title>QtConcurrent 〜S2Fお茶会より〜</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/02/qtconcurrent-s2f.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.28</id>

    <published>2008-02-28T13:28:52Z</published>
    <updated>2008-02-28T14:23:26Z</updated>

    <summary>S2ファクトリーではほぼ毎週お茶会と称してメンバーの誰かが何かネタを拾ってきて1...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="c" label="C++" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="お茶会" label="お茶会" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[S2ファクトリーではほぼ毎週お茶会と称してメンバーの誰かが何かネタを拾ってきて1時間ほどプレゼンテーション(というほど改まったものではありません)を行います。
今日のお茶会は私でしたが<a href="http://labs.trolltech.com/page/Projects/Threads/QtConcurrent">QtConcurrent</a>について、少し触ってみた印象などを紹介してみました。]]>
        <![CDATA[<a href="http://labs.trolltech.com/page/Projects/Threads/QtConcurrent">QtConcurrent</a>は、<a href="http://labs.trolltech.com/page/Overview">Trolltech Labs</a>のプロジェクトで、マルチコアシステムでも自動的にスケールするアプリケーションを簡単に書くことができるフレームワークを目指して開発が行われてきました。昨年の11月23日にQt本体に取り込まれたようで、確かに<a href="http://doc.trolltech.com/4.4beta/classes.html">4.4のドキュメント</a>に入っているようです。<br />
なぜ<a href="http://labs.trolltech.com/page/Projects/Threads/QtConcurrent">QtConcurrent</a>かというのは、ここ半年ほどあるクライアントに依頼されたプロジェクトで、ひたすらWebのログ解析を行い集計するということをやっているのですが、手軽に使える<a href="http://labs.google.com/papers/mapreduce-osdi04-slides/index.html">MapReduce</a>の実装がないかなあとなんとなく探しているうちに見つかったというわけです。<a href="http://labs.trolltech.com/page/Projects/Threads/QtConcurrent">QtConcurrent</a>にはマルチコアなスタンドアローンシステムで手軽に使える簡略版MapReduceの実装が入っています。ソースは<a href="http://labs.google.com/papers/mapreduce-osdi04-slides/index.html">サイト</a>に書いてあるようにSubversionリポジトリからチェックアウトするかzipボールをダウンロードするかします。<br />
<pre class="prettyprint">
$ svn checkout svn://labs.trolltech.com/svn/threads/qtconcurrent qtconcurrent
$ cd qtconcurrent/examples/wordcount
$ qmake wordcount.pro
$ make
</pre>
としてやれば、あるディレクトリ (サンプルでは <code class="prettyprint">../../../../../qt/src/corelib</code> と埋め込まれている) 以下の<code>.cpp</code>もしくは<code>.h</code>ファイルから単語の出現頻度を集計するプログラムがビルドされます。もちろんあらかじめQt 4.2もしくは4.3を入れておく必要があります(MacPortsではqt4-mac)。<br />
このサンプルプログラムでは、<code>main</code>関数の
<pre class="prettyprint">
QStringList files = findFiles("../../../../../qt/src/corelib", QStringList() << "*.cpp" << "*.h");
</pre>
でディレクトリ以下のソースファイルのパスを<code>files</code>という<code>QStringList</code>変数に入れてやり、この変数を<code>mappedReduced</code>関数に与えています。
<pre class="prettyprint">
WordCount total = mappedReduced(files, countWords, reduce);
</pre>
<code>mappedReduced</code>関数は第一引数で受け取ったリストを適当に分割し、そのシステムのコア数に応じて作られる複数のスレッドに渡します。各スレッドでは第二引数で指定する<code>map</code>関数(上では<code>countWords</code>)が実行されます。<br />
すべてのスレッドが終了したら、第三引数の<code>reduce</code>関数が呼ばれ、各スレッドの<code>countWords</code>が生成した出力をマージするという作業が行われ、最終的な結果が得られます。
サンプルプログラムでは、同じ処理を一つのスレッドで行う関数も用意されており、処理に要した時間を比較することができるようになっています。私のメインマシンであるMacPro(Quad Core)で実行してみたところ(他にもCPUを使うプロセスがテキトーに動いています)
<pre class="prettyprint">
$ ./wordcount.app/Contents/MacOS/wordcount qt-mac-opensource-src-4.3.3 
finding files 
5298 files 
single thread 44772 
MapReduce 16595 
MapReduce speedup x 2.69792
</pre>
と、2.7倍速く処理がおわりました(ディレクトリをコマンドライン引数で指定できるように少しいじってあります)。<br />
MacProにある4つのコアをうまく使えないかなあと思っていたので少し期待がもてそうです。これからいろいろなデータを処理してみようと思っています。<br />
ちなみに、肝心のプロジェクトのほうは数千万件のデータを処理するのですが、<a href="http://www.PostgreSQL.org/docs/8.3/static/release-8-3.html">PostgreSQL 8.3</a>が結構な性能を発揮してくれるため今のところそちらで処理しています。長らくC++を書いていないため、<a href="http://labs.trolltech.com/page/Projects/Threads/QtConcurrent">QtConcurrent</a>をすぐに仕事に利用するというのは無理だという事情もありますが。]]>
    </content>
</entry>

<entry>
    <title>フレームの透明度を設定する</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/02/post-1.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.12</id>

    <published>2008-02-18T13:17:56Z</published>
    <updated>2008-02-19T03:30:39Z</updated>

    <summary>ついでなのでもう一つEmacsネタを書いておきます。少し前に知合いからCarbo...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="emacs" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[<p>ついでなのでもう一つEmacsネタを書いておきます。少し前に知合いからCarbon Emacsでフレームの透明度を設定する方法を聞かれました。Mac OS Xをメインマシンにする以前は半透明なんて見づらいだけだろうにと思っていたのですが、適度な透明度を設定することでより便利になることがわかり最近はわりと透けた状態で仕事をしています。<br />
</p>]]>
        <![CDATA[<p>20071106版以前の <a href="http://homepage.mac.com/zenitani/emacs-j.html">Carbon Emacs パッケージ</a> では "Help &gt; Carbon Emacs Package" メニューで透明度を設定できました ("Save Changes..."をしても保存されないので一時的な設定ですが) が、20080120版ではメニューが整理され透明度の設定はなくなったようです。</p>

<p>フレームの透明度は<code>set-alpha</code>関数で設定できますがフレームのデフォルトの透明度は<code>default-frame-alist</code>に<code>alpha</code>の設定を加えておけばいいようなので、<code>~/.emacs.el</code>に</p>

<pre class="prettyprint">
(add-to-list 'default-frame-alist '(alpha . (0.95 0.75)))
</pre>

<p>と書いておきます。<code>alpha</code>に二つの数字が設定されていますが、一つめはアクティブな時の値で二つめは非アクティブな時の値です。</p>]]>
    </content>
</entry>

<entry>
    <title>elscreenを使ってみる</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/02/elscreen.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.8</id>

    <published>2008-02-16T15:11:14Z</published>
    <updated>2008-02-18T03:38:46Z</updated>

    <summary>長らくEmacsを端末エミュレーター内で使ってきましたがメインマシンをMac O...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="emacs" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[<p>長らくEmacsを端末エミュレーター内で使ってきましたがメインマシンをMac OS Xにして以来そのやり方がもう一つしっくりこない(256色が出せてGNU screen + Emacsがまともに使える端末エミュレーターが見つからない)ため、最近はもっぱら<a href="http://homepage.mac.com/zenitani/emacs-j.html">Carbon Emacs パッケージ</a>を利用しています。<a href="http://www.morishima.net/~naoto/software/elscreen/">elscreen</a>はずいぶん前にその存在を知りつつもあまりそそられなかったのですが、ふと使ってみたところえらく便利になって感激しています。Emacs 23にはmulti-ttyサポートというのが入っているそうで期待してしまいます。どういう機能なのかもう一つわかっていないのですが。先日MacPortsで<a href="http://emacs-app.sourceforge.net/">emacs-app</a>というのを入れてみたけど動いてくれなかったので、今度はFreeBSDのemacs-develを入れてみようかと思っています。</p>]]>
        
    </content>
</entry>

<entry>
    <title>新兵器</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/hanai/2008/02/post.html" />
    <id>tag:blog.s2factory.co.jp,2008:/hanai//2.7</id>

    <published>2008-02-15T05:09:51Z</published>
    <updated>2008-02-15T05:20:30Z</updated>

    <summary>イメージソースのryuta君がブラジル土産のコーヒー豆を持ってきてくれました。ち...</summary>
    <author>
        <name>花井</name>
        
    </author>
    
    <category term="office" label="office" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/hanai/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/hanai/photos/R0012088.jpg" rel="lightbox" title="Vitantonio V2 コーヒーミル V2-CM"><img alt="R0012088.jpg" src="http://blog.s2factory.co.jp/hanai/photos/R0012088-thumb-200x266.jpg" width="200" height="266" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></a></span>イメージソースのryuta君がブラジル土産のコーヒー豆を持ってきてくれました。ちょうど良い機会なので電動のコーヒーミルを購入してみました。いつでも香り高いコーヒーを飲むことができそうです。]]>
        
    </content>
</entry>

</feed>

