Shibuya.js Technical Talk #2 竹迫 良範

サーバサイド JavaScript の
歴史と未来
Shibuya.js Technical Talk #2
竹迫 良範
<[email protected]>
前回のshibuya.js#1の振り返り
最後に生き残るのはJavaScriptかもな
JavaScriptのこれまでの10年とこれからの10年
これまでの10年でクライアントサイドを征覇した
これからの10年でどこまで領域を広げるか
etoさん基調講演
2006/06/30
#02
2
クライアントサイドは制覇した
2006/06/30
#02
3
昔:サーバサイドのプログラミング言語
Java
#02
PHP
2006/06/30
Perl
クライアントサイド
(ブラウザ)
Ruby
サーバサイド
(Webサーバ)
JavaScript
4
今:サーバサイド言語でJavaScript生成
#02
JavaScript
Java
2006/06/30
RJS
とか
PHP
クライアントサイド
(ブラウザ)
Perl
本居宣長の方法
Ruby
サーバサイド
(Webサーバ)
GWT
J2S
5
未来:JavaScriptで全部書く!
Java
PHP
Perl
夏目漱石の方法
Ruby
サーバサイド
(Webサーバ)
JavaScript
クライアントサイド
(ブラウザ)
2006/06/30
#02
6
これからの時代は
サーバサイド
JavaScript
2006/06/30
#02
7
これまでの
サーバサイドJavaScript
商用プロダクト編
サーバサイドJavaScriptの有名どころ
Microsoft IIS
ASP (Active Server Page)
いろいろ
VBScript / PerlScript / Jscript …
LiveWire JavaScript から発展
Netscape Enterprise Server
iPlanet
Sun Java System Web server
BroadVision
One-To-One Enterprise
2006/06/30
#02
9
2006/06/30
#02
10
DreamArts ひびき®シリーズ
http://hibiki.dreamarts.co.jp/index.html
2006/06/30
#02
11
DreamArts ひびき®シリーズ
サーバサイドJavaScriptを採用
パッケージ製品である「ひびき」に対する
顧客要望別プラグインを JavaScript で記述
JavaScript処理系
Rhino + Velocity (Java)
2006/06/30
#02
12
DreamArts ひびき®シリーズ
プラグインで可能なこと
API を利用した内部データへのアクセス
JDBCコネクションプールによるDBアクセス
製品で提供されている拡張ポイントを利用して
製品仕様を変更する
トランザクション内のフックにより
他のシステムとのデータリアルタイム連携
製品内に保持しているデータのグラフ化
2006/06/30
#02
13
DreamArts ひびき®シリーズ
サンプルプログラム
function service(request, response) {
var hibikidb = Hibiki.getDatabaseSession();
var isdb = Hibiki.getDatabaseSession('isdb');
if (hibikidb == null || isdb == null) {
log.fatal("Failed to check my DB server!");
return sendError(response);
}
var f = new java.io.File(Hibiki.getDataDirectory()
+ "/health-check.dat");
if (!f.exists()) {
log.fatal("Failed to check my file server!");
return sendError(response);
}
return "/success.vm";
}
2006/06/30
#02
/*
* ロードバランサから監視する場合のヘルスチェックリスナーサンプル
* 正常に稼働している場合には、/success.vm の内容が送信される。
* データベースおよびファイルのどちらかに異常がある場合には、
* HTTPステータスコード500を返して終了する。- sendError()
*/
14
INSUITE®セキュリティアダプタ
http://www.insuite.jp/merit/security.html
2006/06/30
#02
15
INSUITE®セキュリティアダプタ
サーバサイドJavaScriptを採用
Apache2 の挙動を JavaScript でコントロール
mod_perl や mod_python などと同じ
Apache2 の各種ハンドラを JavaScript で記述
LDAP認証やリバースプロキシ、SSL証明書の
取り扱いなどの組み込みオブジェクトを用意
JavaScript処理系
SpiderMonkey + Apache2
2006/06/30
#02
16
INSUITE®セキュリティアダプタ
サンプルプログラム
SSL以外でリクエストされた場合に
SSLにリダイレクトする
$ cat redirect_to_https.js
Apache.translateName = function {
if (request.uri.match("^/images/(.*)")) decline();
if (request.uri.match("^/i/(.*)") ||
request.uri.match("^/_/(.*)")) decline();
redirect("https://" + request.hostname + request.uri);
}
2006/06/30
#02
17
未踏ソフトウェア編
サーバサイドJavaScriptの実装
#02
http://www.ipa.go.jp/about/jigyoseika/04fy-pro/mito/2004-861a.pdf
2006/06/30
19
2006/06/30
#02
20
2006/06/30
#02
21
Mayaa – JavaServer Templates
2006/06/30
#02
22
Mayaa の位置づけ
a
2006/06/30
#02
23
Java系オープンソースの
サーバサイド JavaScript
いくつか紹介
Sarugau JS(さるごーJS)
サーバサイドDHTMLエンジン
Java上で動作する JavaScript と DIコンテナを
使ったプレゼンテーション層用のフレームワーク
JavaScript処理系
Rhino (Java)
サーバサイドDHTML
Rhino のラップドファクトリ機構を利用
ブラウザの innerHTML, style などのDOM拡張
2006/06/30
#02
25
Sarugau JS(さるごーJS)
2006/06/30
#02
26
firecat – JavaScript WebServer
処理系
W3C Jigsaw (HTTP) + FESI (ECMAScript)
ライセンス
LGPL
http://betaworks.netbeans.jp/Wiki.jsp?page=Firecat
2006/06/30
#02
27
firecat – JavaScript WebServer
サンプルプログラム
<%@page content_type="text/html; charset=Shift-JIS"%>
<%
var msg = "あなたのIPアドレスは";
var remote_ip = request.getRemoteAddr();
msg = msg + remote_ip;
%>
<%=msg%>
2006/06/30
#02
28
その他
mod_gcj / Rhinola
Rhino + GCJ4.0 + Apache mod_gcj
http://mod-gcj.sourceforge.net/rhinola.html
Helma - Javascript Web Application
Framework
Rhino + Jetty
Helma License version 2.0
http://www.helma.org/
2006/06/30
#02
29
今年の新たな動き
JSAN関連
2006/06/30
#02
31
Oku Kazuho @ Cybozu Labs
サーバサイドで JavaScript の単体テスト
JSAN の Test.Simple を
Windows Scripting Host (WSH) に移植
Test-Simple-WSH.patch
runtests.js
Windows のコマンドプロンプトで
JavaScript ライブラリのテストが動く
> cscript.exe runtests.js testsrc.js
2006/06/30
#02
32
Oku Kazuho @ Cybozu Labs
JSAN-ASP.patch
ASP で JSAN を使うパッチ (2006/3/24)
<script language="JavaScript" src="JSAN.js" runat="server"></script>
<script language="JavaScript" runat="server">
JSAN.use("Digest.MD5", ":all");
Response.write(md5Hex("hello"));
</script>
2006/06/30
#02
33
これからの時代は
サーバサイド
JavaScript
2006/06/30
#02
34
プロジェクト AJAJA(仮称)
本日初公開
プロジェクトAJAJA(仮称)
 AJAJA
 Asynchronous JavaScript and JavaScript/ASP
 最初の動機(構想)
 ブラウザ上で動く JavaScript と、ウェブサーバで動く
JavaScript とを相互に通信させることで、JavaScript
のみによる Ajax なシステムを作れるようにしてみよう
 開発者
 西田圭介さん (+アルファギークな仲間達)
 フリープログラマ
 OpenCOBOLの開発者
 Gonzuiの開発者でもある
 某商用VPNソフトウェアの開発者
2006/06/30
#02
36
プロジェクトAJAJA(仮称)
オープンソースな JavaScript/ASP の実装
IIS の記法がそのまま使える(過去の資産の継承)
処理系
SpiderMonkey
CGI で提供
/usr/bin/asp_js コマンド
SQLite3標準サポート
use('SQLite');
db = new SQLite('sample.db');
2006/06/30
#02
37
サンプルプログラム
hello.asp
<%@ Language=JavaScript %>
<%
var hello = "Hello world";
%>
<html>
<head>
<title><%= hello %></title>
</head>
<body>
<h1><%= hello %></h1>
</body>
</html>
2006/06/30
#02
38
実行処理系のベンチマーク
CPU: Pentium 4 3GHz
OS: RHEL4 Update 3 (Linux 2.6.9-34)
JS は SpiderMonkey を DEBUG モードでビルド
JS(OPT=1)は SpiderMonkey を BUILD_OPT=1 でビルド
2006/06/30
#02
39
プロジェクト AJAJA(仮称)
JavaScript/ASP デモ
[ソース]
2006/06/30
#02
41
デモ製作:haltさん
 JavaScript/ASP demo – Simple BBS
2006/06/30
#02
42
Yet Another Demo
2006/06/30
#02
43
ただいま空前の素数ブーム
LL Ring キミならどう書く 2.0
前哨戦 Round 1
お題「100までの整数から素数を列挙せよ」
Brainf*ckで100までの素数を列挙してみるテスト
2006/06/30
#02
45
2006/06/30
#02
46
2006/06/30
#02
47
function BF(str){
this.code = []; this.output = []; this.input = []; this.data = [];
this.pc = this.sp = 0;
this.debug = 0;
this.step = function(){
var op = bf.code[this.pc];
if (bf.debug){
document.writeln([op, bf.sp, bf.pc].join(","));
}
switch (op) {
case '<' : bf.sp--; break;
case '>' : bf.sp++; break;
case '+' : if(!bf.data[bf.sp]) bf.data[bf.sp] = 0;
bf.data[bf.sp]++ ; break;
case '-' : if(!bf.data[bf.sp]) bf.data[bf.sp] = 0;
bf.data[bf.sp]--; break;
case '.' : bf.output.push(bf.data[bf.sp]) ; break;
case ',' : bf.data[bf.sp] = bf.input.shift() ; break;
case '[' : if (bf.data[bf.sp]) break;
nest = 1;
while(nest){
bf.pc++;
nest += bf.code[bf.pc] == '[' ? +1
: bf.code[bf.pc] == ']' ? -1
: 0;
}
break;
case ']' : nest = 1;
while(nest){
bf.pc--;
nest -= bf.code[bf.pc] == '[' ? +1
: bf.code[bf.pc] == ']' ? -1
: 0;
};
#02
bf.pc--;
2006/06/30
48
Brainf*ck への応用
./Brainfuck.js
function BF(str)の定義
./demo.asp
クライアントサイド
<script src=“Brainfuck.js”></script>
サーバサイド
<% use(‘Brainfuck’) %>
2006/06/30
#02
49
サーバ/クライアントで.jsを共有
有名なJavaScriptライブラリをサーバサイドでも
prototype.js
MotchiKit
JSANモジュール
JavaScriptライブラリをみんなでshare
Validationロジックの共通化
フォームの入力値のチェック
数値、文字列の長さ
DRYの原則(Don’t Repeat Yourself)
2006/06/30
#02
50
ToDo
やりたい事
ToDo
Apacheモジュール欲しい
最初に作ったのは mod_aspjs だが路線変更
スレッドまわりとか GC とかきちんと
ライブラリの充実
サーバサイドのJSANモジュール
SSI -> SSJ Extension
業務で使えるテンプレートエンジン
サーバサイドでDHTML
DOM操作、innerHTML のサポートとか…
2006/06/30
#02
52
近日公開予定
http://ajaja.alphageek.jp
2006/06/30
#02
53
共同開発者
募集中
(svn公開します)
2006/06/30
#02
54
サーバサイド JavaScript の
歴史と未来
ご清聴ありがとうございました