tamuraです。 Clack Meetup #1に行ってきました。
CommonLispは趣味でたまに使います。Clackは以前会社のツールを作るときに使いました。Caveman1がCavemanと名乗っていたころです。
一部の資料はconnpassにアップされてあります。 Clack Meetup #1
はじめに
- 設備の説明
- 全員で自己紹介
自己紹介で出た「今現在やっている言語」等をちろっとまとめるとこんな感じでした。 Javaは私です。
- CommonLisp
- Python
- Ruby
- Clojure
- PHP
- DB
- Java
1. Clack: glue for web apps
by サムライト株式会社 深町英太郎さん
Clackとは
- web application environment
- webサーバを抽象化しよう
web appをコンポーネント化しよう
こんな感じで値を3つ返す式を渡せば動く
serverは色々と選べる
(clackup (lambda (env) '(200 (:content-type "text/plain") ("hello world"))) :server :hunchentoot)
アプリケーションとサーバをつなぐ
Clackに載せることでどのサーバでも動かせるようになる
- (開発はHunchentoot、運用はnginxとか)
Composability
- core applicationのまわりにいろいろMiddlewareを追加していける
- (JavaのWebアプリでいうところのfilterとかのイメージ)
CommonLispのライブラリの歴史
- 大きく4つの時代に分けて説明
- Quicklisp以前はもはや石器時代
- Quicklispが出てきてマシになった
- 最近ではデータベース接続もいろいろ出てきた
- 現在
- ningle, caveman2
- cl-dbi, sxql, datafly, integral
- woo
- CIM/Roswell, qlot
- Practical Common Lisp in Web
by サムライト株式会社 Rudolph Millerさん
CommonLisp
- あまりwebアプリで採用されていない。なぜか?
言語を選ぶ際の基準って・・・
- 言語自身の力
- CommonLispは
- 高度な抽象化が可能
- 速度も問題なし
- 開発環境
- CommonLispは
- SLIMEあるよ!
- ライブラリ
- CommonLispは
- ある?
- あまりないかも
ライブラリがない中でサムライトではどうやって開発しているか?
実際に作ってみた
- twitterみたいなやつ
- フレームワーク
- (CommonLisp)caveman2
- (Ruby)rails
getting started
- rails
- caveman2
- どっちも同じくらい簡単に作成ができた
model
- rails
- 標準のやり方
- cl(integral)
- defclass で定義 (これはすごい)
relationship
- rails
- belongsto, hasone, has_many
- cl(integral)
- リレーション定義なし
rails と integral のベンチ比較
- integralがrailsの2倍速い (2倍しか速くない)
controller
- rails
- 標準のやり方
- caveman2
- アノテーションですっきり書ける
- functionとして定義されるのでテストしやすい!
view(テンプレート)
- rails
- いっぱいある
- caveman2
- すくなくとも6個のライブラリがある (意外とある!)
deploy
- rails
- 普通に
- caveman2
- 困る点
- 処理系がない
- 実装バージョンが違う
- quicklispライブラリのバージョンが違う
- どうしているか?
- roswell
- sbclのインストールが楽にできる
- スクリプト可能
- clackup –server woo app.lisp
- qlot
- ローカルでライブラリをもてる
httpアクセスでベンチ
- railsの2倍の速さ
3. 既存のテンプレートエンジンの問題点と再設計、あるいは Arrows (a.k.a Zenekindarl) について
by κeen (@blackenedgold) さん
template engine
- 引数を計算し
- テンプレートに引数を渡し
- レスポンスをレンダリングし
- レスポンスをサーバに返す
レンダリングの問題点
- 結合した文字列はその後使われることはない
- 大きな文字列を作るとGCに負荷がかかる
SBCLのGC
- 世代別CopyGC
- alloc_spaceに入らない大きさの場合アロケーションが遅い
以下のようなテンプレートの場合、 header が出る前までをいったんクライアントに返したら?
クライアントのレンダリング完了までの時間を短縮できるのでは?
<html> <head> ...... </head> <body> <header>{{ header }}</header> ...
Arrows
- 現在開発中のテンプレートエンジン
- 複数のテンプレートが選べる
- 複数のバックエンドが選べる
今後
- 遅延評価
- 並列化
- 非同期
- HTMLの縮小
まとめ
- 既存のテンプレートエンジンは非効率
- 新しいテンプレートエンジンを設計した
懇親会+LT
別件(サバフェス)があったので懇親会には参加せずに帰ってしまいました。
感想
一言で言うと「CommonLispアツいなー」でした。CommonLispでWebをやる、というのを本気で変えようとしているのが伝わってきました。
Quicklispはもうちょっと使いやすくなるといいなーと思います。JavaのMavenとかClojureのClojarsに慣れると、バージョン指定ができないQuicklispはちょっと不安になります。
インターネット広告関連の仕事に関係している関係とかいろいろな関係で、この日おじゃましたサムライトは設立時から知っていたのですが、ちょっと前にCommonLispの仕事があると聞いて「なぜ?」と 思ったことがありました。今後も要チェックな会社です。
まったくCommonLispと関係ないのですが、Railsをやったことがないので、Railsの手軽さにちょっと心惹かれました。
私の会社にもSICPを読んだりSchemeを実装したりする人がいるので、そういう隠れLisperたちとなにかやっていきたいなーと思った次第です。