八発白中

はてなブログに引越しました。

Common LispでWebAppの開発に必要なN個のこと

PerlでWebAppの開発に必要なN個のこと - Islands in the byte streamCommon Lisp版です。

あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずCommon Lispについて知っていることを書いた。←ここまで引用

Perl版と異なるのは、これは昔よく使われていたけど今は使うべきじゃないみたいなのも書きました。

パッケージマネージャ

Quicklispを使います。Common Lispで開発しようと思ったら処理系の次にこれが必要です*1。ここ数年のCommon Lispの環境変化はQuicklispに依るところがとても大きいです。

ライブラリごとにバージョンの管理をする機能は今のところ無いけれど、以下の記事でShellyを使ってQuicklisp自身をプロジェクトごとに分離することはできました。

※追記 (2014/10/21): qlotというプロジェクトローカルにQuicklispを分離できるツールを作りました。→ プロジェクトのCommon Lispライブラリ管理ツール「qlot」を作りました - 八発白中

アプリケーションサーバ

WebサーバへのインターフェイスとしてClackが使えます。今サポートしているバックエンドはHunchentoot、Apache2、FastCGIの3つです。*2

Clackを使うメリットは、アプリケーションを変更することなく環境によってWebサーバを使い分けることができるということです。開発時はセットアップの楽なHunchentootを使っておいて、本番ではnginxをフロントに置いてFastCGIで運用するのが最もパフォーマンスが良いです。

他には、Hunchentootを生で使う派も存在します。teepeedee2という最速を謳うWebサーバもありますが、使ったことがないのでわからないです*3。開発も止まっているみたいだし使わなくてもよさそうです。Hunchentootをさらにダイエットさせたtootというサーバもありますが、リリース当初使ったときにあまり品質が良くなかったのでそれから使っていません。今はどうか知らないです。

最近Wookieという非同期型のWebサーバが出てきました。cl-asyncの作者が作っていて、個人的には注目しています。9月10日現在はQuicklisp申請中。

データベース

Common LispではCL-DBIというライブラリがRDBMSへのインターフェイスです。実態はcl-mysqlとcl-postgresqlsqliteを同じインターフェイスで使えるようにするというライブラリです。

CL-DBIのラッパーやSQLの生成ライブラリは存在しないので、自分でSQLを書く必要があります *4

その他、Common LispではObjectStoreが好まれるのかライブラリが多いです。CLSQL、Elephant、Rucksack、AllegroCache (商用)など。AllegroCacheは使ったことがないのでわからないけど、個人的にはその他3つはあまりおすすめしません。品質が悪い。

ビューのレンダリング

テンプレートエンジンは2種類あって、HTMLをベースに拡張言語で書くものか、S式からHTMLを生成するものがあります。

HTMLをベースにするものはCL-EMBとcl-closure-templateが良さそう。どちらも一長一短があります。

S式から生成するものは、CL-WHOが良く使われています。もっとわかりやすいインターフェイスを目指してCL-Markupというものもあります。

HTTPクライアント

Drakmaくらいかな。HTTPSが必要無いならtrivial-httpというライブラリも使えます。

テストフレームワーク

大量にあって、どれが代表的だとは言いづらい状況。

観測範囲ではFiveAMが一番人気があり、その後継を謳うEosも使われるようになってきているようです。

※追記 (2014/10/21):
現在ではEosは非推奨になり、FiveAMの利用が推奨されています。

僕はTAP (Test Anything Protocol) で出力してほしいので、CL-TEST-MORE*5を使っています。今調べたらtestbildというのもTAPで出力してくれるそう。

Webアプリケーションフレームワーク

どうしても流行り廃りがあるWebアプリケーションフレームワークですが、最近の人気度で言えばCavemanとRESTAS、ningleとかでしょうか。Clackを直接使う人もいるようです。RESTASの作者がロシア人なので、ロシア近辺や欧州ではRESTASは知名度があるようです。

古くからあるものだと、Weblocksというものもあります。これは継続ベースのフレームワークで、今紹介した中で最も重いフレームワーク。一度開発が止まっていたけど、メンテナが入れ替わって今はメンテナンスされているようです。

*1:その次はSLIME??

*2:追記: 2014/10/21現在ではさらにWookieに対応し、Apache2が非推奨になっています。

*3:個人的な不安点はストリーミング配信などはできなさそうだし、並列アクセス捌けるのかなーとか

*4:Postmodern付属のs-sqlというライブラリがSQLを生成する機能があるが、PostgreSQLのみサポートしているので完全ではなさそう

*5:追記: 2014/10/21現在、proveという名前に変更され、TAP以外の出力にも対応しています。