CommonLispで家庭内メモ共有システム(MyEvernote)を構築した話
自宅でEvernoteのようなメモ管理システムを構築してみました。
そのバックエンドとしてCommonLispを採用したので記録も兼ねて記事にしておきます。
ソースはgithubで公開してます。
動作している画面はこんな感じです。
開発動機
外部のサービスに依存していないメモ管理システムが欲しいというのが開発動機です。
Evernoteなどのクラウドシステムにはプライベートな情報を記述しておきたくないです。
個人用途なので以下の機能はばっさり切り捨てています
- 認証システム
- タグ付けシステム
- リマインダ
それぞれの理由としては、
- 認証システム
- Apacheなどで認証してもらえば十分である。:
- タグ付け
- 知識を蓄えておくためのものではないのでタグ付けが必要になるほどの大量のメモは取らない。:
- リマインダ
- タスク管理システムやスケジューラではない。:
と言った感じです。
マシン構成
サーバとして動いているマシンは以下のスペックです。今回のために用意したマシンではなくもともと自宅で動いているサーバマシンです。
OS | Debian 6.0 |
CPU | Core i3-540 |
メモリ | 4GB |
動いてるもの | nginx,Apache2,SQLite3 |
開発方法
サーバマシンにSSHでログインしてscreen上のSLIMEで開発してます。
この環境だとログアウトしてもSBCLは動作し続けてくれるのでデーモン化などしなくても
手軽に使えます。SLIMEのバッファで評価してあげれば即座にサーバの動作も変わってくれて
楽です。
MyEvernoteサーバの詳細
サーバ内部のプロセス同士の連携は以下のようなイメージになります。
認証はApacheにDigest認証をやってもらうことにしました。
ツッコミが入りそうなところとしては、リバースプロクシが多段になっているのは、最近nginxを入れたばかりなため手が回らなかったためですね。
サーバの内部のクラス間の連携はこんな感じで実装してます。
今回はこのニコニコ動画のこの開発手法に感銘を受けたので
キャラクター名がクラス名です。
どうみてもゲームのキャラ紹介にしか見えませんが仕様です。
基本的に難しいことはおこなっていないのでソースを読んでもらえば何をしているのかすぐわかるかと思います。
ややこしいことを行なっている箇所としては
- ユーザ名をHTTPのリクエストから取り出している所
- clackのPOSTメッセージから本体を取り出している所
くらいでしょうか。
MyEvernoteクライアントの詳細
サーバが適当にJSONを返してくるので、それをDataTableに整形して表示するだけです。
特に新しい試みはおこなっていないので、詳細は省きます。
こっちはものすごくコードが汚いので読まないほうが良いと思いますw
ハマった点
SQLiteがやたらとエラーを返して落ちる。
どうもupdateとかisertの処理の直後にselectを発行すると、busy_errorを返すようです。
SQLiteはこのあたりを呼び出す側に押し付けるような仕組みとなっているので仕方がないですが
使い物になりません。
ソースをいろいろ眺めているとcl-sqliteにはこれのための対処のオプションがあるようです。
ただ、cl-dbiからはこれを使うことが想定されていないようなので、独自に拡張して対処しました。
なお、この修正は本家にも取り込まれました。
Datatablesのtwitter bootstrap対応
メモ表示の部分にDatatablesを使ったのですがtwitter bootstrap対応するには
いろいろ修正が必要なようで手間がかかりました。
以下に情報があって助かりました。
http://www.datatables.net/blog/Twitter_Bootstrap_2
まとめと今後の予定
Common Lispでサービスを作るという事を初めて試みて見ましたが、割と快適だったように思います。
SLIMEによるところが大きいですが、書いてその場でどうなるかをすぐ試せるのは良いですね。
やり残している作業としては、インストール方法とか書いてなかったり使われていないコードが残っていたりするのでその整備を行ないたいところ。