サンプルの実行
サンプルソースを実行するには、まず最初にNetKernelをダウンロードする必要があります。http://www.1060.org/download/にアクセスし、最新版(現在、3.3.1)を手に入れ、インストールします。
次に、http://bosatsu.net/examples/devx/より「NetKernel-Concurrency.zip」ファイルを手に入れます。
このファイルをNetKernelモジュールの「workbench」ディレクトリにコピーし、解凍します。NetKernelを開始した後、下記の各URLをクリックしてテストを起動します。以下は、BeanShellの非常に基本的な機能を呼び出す例です。
// Read in a file
main()
{
// ffcpl: basically means file: here
output = context.source("ffcpl:/devx/foo.xml");
resp = context.createResponseFrom(output);
context.setResponse(resp);
}
次を試します。http://localhost:8080/workbench/devx/file.bsh
// Fetch a document on the Web
main()
{
output = context.source("http://bosatsu.net/foaf/brian.rdf");
resp = context.createResponseFrom(output);
context.setResponse(resp);
}
次を試します。http://localhost:8080/workbench/devx/web1.bsh
// Fetch an image on the Web using a more robust HTTP client
main()
{
req = context.createSubRequest("active:httpGet");
req.addArgument("url", "http://www.funnydog.net/images/cocktail-kitten.jpg");
output = context.issueSubRequest(req);
resp = context.createResponseFrom(output);
context.setResponse(resp);
}
次を試します。http://localhost:8080/workbench/devx/web2.bsh
// Style some XML
main()
{
req = context.createSubRequest("active:xslt");
req.addArgument("operator", "ffcpl:/devx/style.xsl");
req.addArgument("operand", "ffcpl:/devx/foo.xml");
output = context.issueSubRequest(req);
resp = context.createResponseFrom(output);
context.setResponse(resp);
}
次を試します。http://localhost:8080/workbench/devx/xslt.bsh
BeanShellの使用
BeanShellから警告が出ないようにしてください。これはシステムのプロトタイプを作成したり、低レベルの機能をスクリプトとして記述したりするために利用できますが、ここでは基本的な機能の表示に使います。
しかし、NetKernelのディスパッチ機構には、儀式的な面が強くあります。これは、GroovyやClojureのようなもっと動的な言語を使えば簡単に修正できます。例として、GeonamesのWebサービスを呼び出し、XMLの結果を出力するGroovyコードを示します(David FeeneyとJean-Francois Cloutierに感謝)。これは追加的なインフラストラクチャを準備しなければ使えません。この例は、メタプログラミングの技術によって、NetKernelでの作業を減らして、より本質的な形式にできることを示しています。
def result = xmlAspect {xml ->
xml.places {
def results = WebService.search(searchArgs).toponyms
results.each { t ->
xml.location {
xml.place(t.geonameId)
xml.name(t.name)
}
}
}
}
context.respond(result, "text/xml", false)
動的な言語と動的な環境の組み合わせは強力なツールとなります。
