2010年11月1日月曜日

Wander Alone Like Rhinoceros Horn

多忙な過去2年間が過ぎ、荷を降ろしてみると、見過ごしていた(あるいは故意に目を逸らしていた?)様々な事柄が眼に飛び込んでくる。そして、2年の月日は、諸々の事象を眺める私の眼そのものをも変容させていた。変容は、フィジカル、メタフィジカル、両面に及んでいる。回復された視力、衰えた肉体、削ぎ落とされた関心、獲得した視座。

過去に書いた文章を読み直すと、自分の変化と世界の変化が響き合うとともに軋み合い、交錯に眩暈を覚える。たとえば4年前にAJAXやFlashを題材にして書いた記事では、Webページがアプリになる可能性を考察していた。その可能性の一端は現在HTML5として実現している。ただし、HTML5には技術的に新しいことは何もなく、政治的理由により遅れてやってきた標準化にすぎない。また、同じく2006年に、今回と同じく過去を回顧している文章では、「無駄な部分を省いたコミュニケーションの需要は残るはずであり、むしろ参入障壁が十分に低ければシンプルなものがリッチなものを出し抜く可能性が十分にある」と書いており、こちらはTwitterとして顕在化してきた。しかし2006年の時点では、巨大なデータを合成してシンプルなインターフェイスに落とし込む処理を、自分では全くイメージできなかった。

8bit時代のビデオゲームは、表現能力を欠いたことにより洋の東西を問わない普遍性を獲得した。21世紀的なシンプルさの形式が普遍性を備えるには、世界中のユーザーの要求に即座に応答できるシステムを背後に組織化しなければならない。スマートフォン、クラウド... ハードウェアにいくつセンサーやプロセッサーが導入されようが、ソフトウェアデザインは本質的に自由だ。その広すぎる可能性の中から、有限の資源に応じた、核心を衝く着想が常に求められている。

この2年間は、専らWebブラウザーの発展に注目してきた。Jargon Fileにも載っている用語でwheel of reincarnation(輪廻)というものがある。ある処理に特化したプロセッサ(たとえばGPU)をCPUから分離した場合に、後年そのプロセッサの汎用計算性能が強化されるにつれ結局はCPU上でソフトウェア実装した方が効率的になり、再度CPUに吸収される...というサイクルが反復されることを指して輪廻と呼ぶ。Webブラウザーも、PCの本質的な機能であるということになれば、OSに統合されるのが望ましい。ところが、政治的事情からWindowsではそうはなっていない。iOSやAndroid、Chrome OSでは統合されているというのにWindowsではそうはなっていないというのは笑うしかない。どちらが望ましいのだろうか。一つだけ明らかなのは、私は自由なソフトウェアを支持するということである。つまり、iOSの現状が、競争を排除するようなものであるとすれば、私はそれを忌避するし、Apple社の製品は購入しない。私にとってのiPhoneとは、Androidの健全な発展を促す触媒でしかない。

Webブラウザーに関して、直近の動きで一番注目しているのはChromelessだ。XULがHTMLに溶け出している。自分が欲しかったコンセプトがそのままプロジェクトになっていて、嬉しかった。他に興味深かったのは、Beyond3Dで教えてもらった、EAによるPS3/Xbox360へのWebKit移植のベースに利用されていたOrigyn Web Browser。現在サイトが落ちているようなのでEA側のコードしか見ることは出来ない。EA側コードは、Paul Pedriana氏によるEASTL実装を含む(ドキュメントにはBoost.Intrusiveみたいなコンテナーが入っていると書かれているが見つからなかった)。

次に向けて、学ばなければならないことは山ほどある。

2010年10月12日火曜日

Dissecting WebKit2 Implementation as of October 2010

WebKit2 was first disclosed to the public in April 2010. Now half a year has passed, has there been any noticeable progress? This time I delve into the WebKit2 from the source-code point of view.

First let me recap what WebKit2 actually is and how it's related to the current WebKit with the official high level design document as the reference.

For those who are not very familiar with WebKit, it may be confusing that WebKit as a whole contains a part that shares the same WebKit name. WebKit as the framework has 3 major components - WebKit, WebCore, and JavaScriptCore - as you see in the source directory. WebCore is the layout engine that parses an HTML5 web page into a DOM tree and renders a render tree created out of a DOM tree with CSS information computed on each node. In addition to the abstract or platform-agnostic parts, it contains platform-specific implementations such as graphics and I/O if necessary. JavaScriptCore is the JavaScript engine. Google Chrome swaps it with its own V8 engine whereas Safari uses JavaScriptCore under the name Nitro. JavaScriptCore/V8 bindings to DOM live in the bindings directory in the WebCore. A WebKit user controls WebCore through a high-level API set which is differently implemented for each platform. The WebKit directory contains such an API set. For example, the Windows version of Safari implements it by COM classes in C++ in the win directory while the Mac version does it with Objective-C in the mac directory. Due to some dependency on proprietary libraries owned by Apple found in the Windows implementation for Safari, WebKit embedders should try other API layer implementations such as Gtk+ or Qt unless adopting Chromium suits the need.

2010年9月11日土曜日

Preliminary Look into libevent 2 for Windows

The libevent library is probably best known by its use in memcached. memcached is one of the key components of LAMP stack though the recent trend seems to instead highlight NoSQL solutions where typical RDBMS and memcached are replaced with more optimized and dedicated systems. The importance of libevent is not affected at all since libevent itself is not tied to applications that use it and NoSQL solutions can be constructed with libevent too. Other clients of libevent include Tor. libevent is crucial for its cross-platform availability. After all, one of the developers of libevent is Nick Mathewson who is also the head honcho behind the Tor project.

My interest in libevent comes from my own program, DICE. From the beginning of the development in 2002, its I/O is fully optimized to Windows and I/O Completion Ports (IOCP) without using any middleware or libraries. It's old and not often updated, but works flawlessly. However, replacing it with a decent OSS library can be a good chance to make it more simple and robust. The concern from the performance point of view is the only obstacle left, but libevent 2 is supposed to come with the IOCP support. That was the news that let me start the evaluation.

The libevent version for this article is 2.0.7 RC. I built it with Visual Studio 2010 (VC10). Since I wanted to use the debugger to trace its flow, I built it as the debug version by changing the CFLAGS compiler options /Ox to /Od /MDd /Zi in the Makefile.nmake in the main directory and the test directory. 'nmake -f Makefile.nmake' produces the libevent.lib static library.

Before building a project with libevent, you need to manually copy WIN32-Code\event2\event-config.h to include\event2\event-config.h. Then add libevent.lib to the linker input (if you use socket, ws2_32.lib too), and add libevent and libevent\include directories to the include directory.

Then I wrote a test code with its evhttp 'Event-driven HTTP servers' functions. It's a simple Web server that shows requested URI and quits if /quit is requested. It listens to the port 8080.

2010年8月26日木曜日

js-ctypes実装に見るlibffiの利用(& Windows-MSVCでのビルド法)

Firefox 3.6から入った、chrome権限のJavaScriptから外部バイナリコンポーネントのネイティブ関数を呼び出す機構であるjs-ctypesの実装が、libffiに基づいているということだったので、昔見たときはlibffiはVisual C++はサポートしてなかった記憶があったがFirefoxでビルドできるんだったら単体でもいけるよねーということでjs-ctypesのソースを追いつつ試してみた。

結果から先に述べると、若干手間を要するものの問題なくビルドでき、closureも利用できた。ここでいうclosureとは、呼び出された際にユーザー指定コールバック関数(元の呼び出しに使われたlibffiフォーマットの引数データが渡ってくる)を起動してくれる関数コードを、ユーザーが動的に指定したシグニチャで、ランタイムに実行可能メモリ上に構築してくれるlibffiのAPIが用意されているので、それを利用して作成したバイナリコードを指す。

js-ctypes実装の構造は至極直截的で、JSのオブジェクトとネイティブオブジェクトのバインダとしてのCTypesクラスと、dll/so/dylibみたいなバイナリコンポーネントのラッパーのLibraryクラスから成っている。Library::Declareでシンボルからバイナリ内の関数アドレスを得るときは、PR_FindFunctionSymbolを呼ぶ。これはNSPRの関数で、Windows上では、なんのことはないGetProcAddressが呼ばれる。なんでlibffiなんてものが必要かというと、荒っぽく言ってしまえば、Cでは関数ポインタを宣言しておけばコンパイラが良きに計らってくれるところ、動的言語で同じことをランタイムに行うために、その辺の呼び出し規約上のお膳立てをlibffiが整えてくれるというわけだ。

上述のclosureは、js-ctypesでは、ネイティブコード側にJavascriptの関数をコールバックとして渡す時に利用されている。Javascript関数オブジェクトに関連づけたclosureを作成し、それが呼び出された場合にはCClosure::ClosureStubが呼び出され、関連づけられていたJavascript関数オブジェクトが実行されるようになっている。closureは、コールバック用のプロキシとして働いており、この利用法自体は、libffiの実装内でffi_prep_closure_locの実体がFFI_INIT_TRAMPOLINE呼び出しで、closure用のメモリ領域が「トランポリン」と呼ばれていることからわかるように、想定の範囲内と言える。

Windowsアプリのメッセージハンドラ=ウィンドウプロシージャとしておなじみのWindowProcコールバックは、js-ctypesでは以下のように表現される。

var WNDPROC = ctypes.FunctionType(ctypes.stdcall_abi, ctypes.int, [ctypes.voidptr_t, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t]).ptr;


Windows APIの呼び出し規約はWINAPI(__stdcall)なのでstdcall_abiが指定されている。これを元にしてlibffiがclosureを作成し、closureが起動されるとjs-ctypesが再度Javascriptの関数に戻して実行してやる。これが何を意味するかというと、js-ctypesがあればJavascriptでWindowsアプリのイベント駆動モデルすらも代替できる、つまりMFCとかイラネーよなということになる。これだけ強力なら、Firefox 4のGecko 2がfrozenインターフェイスを破棄してjs-ctypesを媒介にXPCOMを脱構築するという流れも必然であると納得できる。

Windows上でのVisual Studio 2010(VC10)を使ったlibffiのビルド手順としては、以下になる:

2010年7月11日日曜日

新BitTorrentプロトコルµTPを実装するlibutpソースコードの概観

5月21日に、libutpソースコードがMITライセンスで公開された。libutpとは、µTP (Micro Transport Protocol)と呼ばれるプロトコルの実装ライブラリである(BitTorrent.orgではBEP 29として提案され、IETFではLEDBATとして提案された)。今回は、そのコードを見てみたい。

libutpを公開したのはBitTorrent, Inc.で、彼らが配布するBitTorrentクライアントμTorrentのバージョン1.8 betaがµTPを最初に実装した。BitTorrent, Inc.が元々持っていたオリジナルのBitTorrent実装(Mainline)は、Pythonで書かれたソフトウェアとして有名だが、μTorrentはC++で実装されたWindows用ソフトウェアである。μTorrentはスウェーデン人のLudvig Strigeus氏が開発したが、2006年にBitTorrent, Incに買収されている。μTorrentが登場したとき、備えている機能に比して、GUIアプリにしては(パックされている可能性を勘案しても)きわめて小さいバイナリサイズに感心した。プログラマの力量を誇示するかのようなコンパクトで尖ったソフトウェアだったので、後日の買収のニュースには、落ち着くところに落ち着いたなと感じたのを記憶している。

従来のBitTorrentによるファイル転送がTCPを経由して行われていたのに対し、µTPは、UDP上に構築されたプロトコルを用いる。既にDHTやトラッカーのプロトコルにはUDPが利用されていた(ただしμTorrentによる実装はかなり後になった)が、µTPは、トランスポートプロトコルとしてもUDP上に構築した独自プロトコルを利用する。

BitTorrentクライアントが実装したDHT(分散ハッシュテーブル)は、Kademliaというアルゴリズムの実装で、トラッカーに依存しないリソース探索が可能となった。Gnutellaライクな、しかしより構造化された分散キー管理により、トラッカーがダウンしていても目的のリソースを保持するピアのリストを得られる。ネットワークの単一障害点を無くすという建前だが、違法にアップロードされたデータを配布するトラッカーが検挙されつつあった情勢に対抗するものという見方もあった。

今回のµTP実装は、ネットワークの反応が悪くなってきた場合に、自動的に他のトラフィックに道を譲ることで輻輳を防ぐのが目的とされている。オンラインゲームなどのリアルタイム性が重視されるアプリケーションでは一定のレイテンシ以下にping値が収まっていることが要求されるが、TCPのFIFOキューではサイズの大きいP2Pパケットが転送される場合にジッターが発生しやすくサービスの品質に影響を及ぼす。現在のTCPでは、輻輳制御アルゴリズムとして、CUBIC TCP(Linux)、Compound TCP(Windows)が用いられている。µTPは、BitTorrentのアップロード時に起こりやすい輻輳を特に回避するという目的に適う制御アルゴリズムを、UDP上で実装したものということになる。現在、P2Pアプリケーションを対象としてISPによるトラフィックシェイピングが行われているが、これに対しての回答ともいえるだろう。

前置きは以上で、以下コードを見ていく。libutpは、Windows用のdllとして公開されており、VC9用のソリューションが添付されている。utp.defに公開されているCのAPI関数は以下である。

2009年12月14日月曜日

Quid Pro Quo

One thing that I don't like about scripting languages is usage of bizarre identifiers. Statically compiled languages don't care about verbose identifiers, but scripting languages often employ abbreviated names to gain run-time performance and typing speed.

my ( $x, $y ) = $self->invoke(
 +{
  METHOD => 'foo',
  PARAM => 'bar',
 },
 ''
);


In this Perl snippet, I had no idea what "+{}" stands for. It looks like some kind of hash, but not sure. Googling it didn't bring good results since Google doesn't recognize a string made only of non-alphabetical characters such as braces and math operators.

To figure out its meaning I wasted so much time by trying many different words in Google. Anyway here's the answer:
or to force an anon hash constructor use +{:
  1. @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs comma at end
to get a list of anonymous hashes each with only one entry apiece.
It's embedded in perlfunc and I couldn't find any other references in the official documents.

I had a hard time with Ruby too when the last argument for a method has an ampersand (&) prepended. In the Japanese version of the Ruby manual, it's obscurely explained in a single line. It's very hard to find since there's no word for an ampersand in Japanese. It has no English version but The Ruby Programming Wikibooks has a related part which is a lot better with examples.

The ampersand (&)


The ampersand operator can be used to explicitly convert between blocks and Procs in a couple of cases. It is worthy to understand how these work.

Remember how I said that although an attached block is converted to a Proc under the hood, it is not accessible as a Proc from inside the method ? Well, if an ampersand is prepended to the last argument in the argument list of a method, the block attached to this method is converted to a Proc object and gets assigned to that last argument:

def contrived(a, &f)
     # the block can be accessed through f
     f.call(a)

     # but yield also works !
     yield(a)
 end

 # this works
 contrived(25) {|x| puts x}

 # this raises ArgumentError, because &f
 # isn't really an argument - it's only there
 # to convert a block
 contrived(25, lambda {|x| puts x})

Regarding manuals, MSDN is still the best place. Don't know what "=>" means in C#? OK search it in the C# operators. It's the lambda operator introduced in C# 3.0. Since I always code with a language specification on my side when it's not C++, the quality of reference documents can be directly reflected in productivity.

2009年9月1日火曜日

C++ Dependency Injection (or the next best thing) on Windows

Dependency Injection (DI) is one of the recent buzz phrases within the design pattern community after Martin Fowler picked it up with another related concept Inversion of Control (IoC) in 2004. Since then, it became popular in Java lightweight frameworks where adding late binding was seen as a critical step for upping productivity.

The core value of DI is basically represented in these 2 points:
  1. Testability. DI makes testing easy by enabling loosely coupled components that are easily replaced with mock objects.
  2. Dependency control. When you deploy a DI framework instead of using the Factory Method pattern, dependency can be managed outside of components.
The first point is rather obvious. To understand the second point, I recommend you to browse the Google Giuce lightweight Java DI framework for its video presentation and documents. It illustrates the necessity of such a framework for Java in a straightforward way. Particularly, Giuce appears to be a neat implementation of DI where you don't need to manage XML configuration files unlike other frameworks. Just like inner DSL, dependency is handled in type-safe Java code even though it ditches type-safe factories scattered in code.

But, as Ruby and other dynamic languages gets more attention, the relative mind share of DI seems to get smaller. In Ruby, you can swap methods of instances dynamically at the side of a test class. The dynamic nature of Ruby can enable whole other tricks dependent on it such as ActiveRecord.

So what about DI? Is it just a glorified abstract factory? Unfortunately, there still have to be environments where DI makes things a lot easier. Not just Java, but other static language, such as C++. Since my programming history is MS-Windows-centric, my interest toward DI is its applicability for Windows app development. DI is a lot discussed in the context of Java/.NET enterprise development, but its necessity would be even higher in C++ development on Windows as long as other requirements such as performance permit.