さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

CommonLispで家庭内メモ共有システム(MyEvernote)を構築した話

自宅でEvernoteのようなメモ管理システムを構築してみました。
そのバックエンドとしてCommonLispを採用したので記録も兼ねて記事にしておきます。
ソースはgithubで公開してます。

動作している画面はこんな感じです。

f:id:sakura-1:20130606140606p:plain

開発動機

外部のサービスに依存していないメモ管理システムが欲しいというのが開発動機です。
Evernoteなどのクラウドシステムにはプライベートな情報を記述しておきたくないです。

個人用途なので以下の機能はばっさり切り捨てています

  • 認証システム
  • タグ付けシステム
  • リマインダ

それぞれの理由としては、

認証システム
Apacheなどで認証してもらえば十分である。:
タグ付け
知識を蓄えておくためのものではないのでタグ付けが必要になるほどの大量のメモは取らない。:
リマインダ
タスク管理システムやスケジューラではない。:

と言った感じです。

開発環境

CommonLispの処理系はSBCLを選びました。Emacs+SLIMEで開発してます。

使用したライブラリ

  • clack
  • cl-dbi
  • cl-json

マシン構成

サーバとして動いているマシンは以下のスペックです。今回のために用意したマシンではなくもともと自宅で動いているサーバマシンです。

OS Debian 6.0
CPU Core i3-540
メモリ 4GB
動いてるもの nginx,Apache2,SQLite3

開発方法

サーバマシンにSSHでログインしてscreen上のSLIMEで開発してます。
この環境だとログアウトしてもSBCLは動作し続けてくれるのでデーモン化などしなくても
手軽に使えます。SLIMEのバッファで評価してあげれば即座にサーバの動作も変わってくれて
楽です。

MyEvernoteサーバの詳細

サーバ内部のプロセス同士の連携は以下のようなイメージになります。
認証はApacheにDigest認証をやってもらうことにしました。
ツッコミが入りそうなところとしては、リバースプロクシが多段になっているのは、最近nginxを入れたばかりなため手が回らなかったためですね。

f:id:sakura-1:20130606144818p:plain


サーバの内部のクラス間の連携はこんな感じで実装してます。
今回はこのニコニコ動画この開発手法に感銘を受けたので
キャラクター名がクラス名です。

f:id:sakura-1:20130606142926p:plain

どうみてもゲームのキャラ紹介にしか見えませんが仕様です。
基本的に難しいことはおこなっていないのでソースを読んでもらえば何をしているのかすぐわかるかと思います。

ややこしいことを行なっている箇所としては

  • ユーザ名を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によるところが大きいですが、書いてその場でどうなるかをすぐ試せるのは良いですね。

やり残している作業としては、インストール方法とか書いてなかったり使われていないコードが残っていたりするのでその整備を行ないたいところ。