2016年時点にD言語でもウェブアプリが書きたいと思い至って試してみた記録みたいなものです。ここに書いている内容はあくまで自分個人が調査した中で構成してみたウェブアプリ開発であり一般的な開発として推奨するものではないのでご注意ください。
所感
D言語でウェブアプリケーションを書くことはできなくはないと思いますが、まだまだライブラリの練度が足りなかったりドキュメントが整備されていなかったりしてるので覚悟をもってやる必要があります。
パッケージ管理システム
多くのD言語使いはすでにご存知と思いますが、 DUB があります。以下に紹介するライブラリはいずれもここに登録されています。
設定ファイルはJSON/SDLang形式で書くことができます。( JSONフォーマットへのリンク ) 基本的に困ることはないのですが、github urlへの指定のような形を提供したくないらしく dubに登録されていないものは手元にもってくることが推奨されています。
WAF
D言語にもWAFはいくつか存在しますが、デファクトと呼べるのは vibe.d でしょう。
vibe.dはRejectedSoftwareが開発しているNon-Blocking I/O+ 協調スレッドをベースとしたWAFおよびネットワークライブラリです。コアのイベントドリブンのエンジン(バックエンドは選択可能で、デフォルトだと libevent2
が選択されています)、やDBドライバ(Redis/MongoDBがレポジトリに同梱)、dietテンプレートエンジン、さらにメールクライアントなどから構成されています。
認証などは物足りなさを感じますが、最低限ウェブアプリを作成できそうな部品は揃っている印象です。ただしSessionStoreの実装がnull参照を簡単に掴めてしまったり、仮引数のデフォルト値にnullをカジュアルに入れてくる仕様になっているので雑に実装しているとしょっちゅうSEGVに遭遇します。ウェッブ開発にはgdbは必須ですね!!
テンプレートエンジン
WAFの項で出てきたJavaScriptのjadeに影響をうけたdietの後継、 diet-ng が現在のデファクトになると思われます。これはvibe.dに標準でbundleされています。他にmustache-dなどがありますが、今回はdiet-ngを使ってみました。
dietの記法はドキュメント に詳しい記載がありますが2016/11/19時点ではString interpolationsで古い記法が紹介されていたりするので注意が必要です。ん?と思った時はgithubのレポジトリを確認するとよいかもしれません。
オフサイドルールやclass/idの指定方法、 include
など、基本的にjadeと同じような感じで書けると思います。一応semverのメジャーは1になっているんですがSPECみるとTODOのオンパレードだったりして一抹の不安はありますが今のところこれができなくてとても困る!といったことはありません。
データベースドライバ
世の中データベースは星の数ほどあり、Dから使うことのできるものもたくさんあるのですべてを網羅することは大変です。ここでは私が慣れていること、非常に広く使われていることからMySQLドライバに絞って話をすすめさせてもらいます。
dubに登録されているパッケージの中では主だったものとして mysql-native と mysql-lited の2つがあげられます。どちらもvibe.dと一緒に扱えるように設計・実装されています。
ここではより機能が揃っている mysql-lited
について取り上げます。
便利な機能でいえば、例えば MySQLRowオブジェクトから構造体へのmappingのときに Strict.yes
/ Strict.no
の選択でカラムとの対応を厳密にチェックするか否かなどを選ぶことができます。
Comment[] comments;
conn.execute("select * from comments where post_id = ? order by created_at desc", post.id, (MySQLRow row) {
comments ~= row.toStruct!(Comment, Strict.no); // Comment構造体とレコードの厳密なmappingを要求しない
});
ただしこのライブラリ0.3.15時点ではupdateクエリを発行するとassertで例外を吐いた後にSegmentation Faultで落ちます。
完全に余談なのですが、D言語のMySQLドライバは他に mysql-d というCのライブラリであるlibmysqlclientをラップしたものが存在します。これを検討に入れなかった理由というのはlibmysqlclient はブロッキングI/Oしか対応しておらず、vibe.dのようなイベントドリブンなネットワークライブラリとの相性が悪いということがあります。
One More Thing...
body
がD言語の予約語なのでカラムにbodyがあるときに困りました。どうも消される動きがあるみたいですがどうなるんですかね。