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