Ceramicを試してみる

# Ceramicとは
[Ceramic](https://github.com/ceramic/ceramic)とは，Electronを元に動作する，CommonLispのデスクトップアプリケーション設計用ライブラリだそうです．

[Electron](https://github.com/electron/electron)とは，node.jsとHTML5でマルチプラットフォーム(Mac OS，Linux，Windows)のデスクトップアプリを構築するための実行環境です．

CeramicもといElectronはまだまだ発展途上の技術で，これからもっと流行ってくるんじゃないかなぁ，と思ったのでフォローしてます．

Electronに関してはいい感じの記事がかなりあるのでそちらをご参照のこと．

# 本稿の目的

本稿では特に難しいことをするつもりはなく，日本語の記事がほとんど無いので，いっちょ書いてみるか，くらいの気持ちです．

基本的には公式サイトに書いてることの一部を試してみるというスタンスでやります．

# 前提(環境)

- Emacsを導入済み
- Quicklispを導入済み
- CommonLispに関する本当に基本的な知識は獲得済み

# Ceramicの導入

Ceramicの導入にはQuicklispが使えます．
最新版を使いたければ，いつも通り，quicklisp/local-projectsディレクトリの直下にGithubからチェックアウトすれば使えます．

```shell-session
# Mac OSの場合
git clone https://github.com/ceramic/ceramic.git ~/quicklisp/local-projects
```

Ceramicを起動する準備ができましたので，早速Quicklispからライブラリを呼んでみましょう．

```lisp
CL-USER> (ql:quickload :ceramic)
To load "ceramic":
  Load 1 ASDF system:
    ceramic
; Loading "ceramic"
..
(:CERAMIC)
```

はい，読み込めましたね．

Ceramicを使うために関係するファイルをダウンロードする必要があるそうです．
その作業をまとめてやってくれるのが

```lisp
(ceramic:setup)
```
コマンドです．実行すればダウンロードが開始します．

# Ceramicを使用する

Ceramicアプリの実行の流れとしては

- Webサーバーを立ち上げる
- Electronプロセスを起動する
- Ceramic(Electron)ウィンドウを設計する

を行った後

- Ceramicウィンドウを表示する

という手順のようです．

今回は，公式ページとは異なりますが，Hunchentootを使ってWebサーバーを立てるやり方でやってみたいと思います．

# 簡単なコード

```lisp:test.lisp
(ql:quickload '(:ceramic :hunchentoot :cl-who))

(ceramic:setup)

;; アクセプタのセット
(defvar *ceramic-server* (make-instance 'hunchentoot:easy-acceptor :port 25252))

;; サーバーの立ち上げ，停止用コマンド
(defun start-server ()
  
  ;; ルーティングテーブルの設定
  (setf hunchentoot:*dispatch-table*
	(list (hunchentoot:create-regex-dispatcher "^/$" 'index)))

  ;; Webサーバーの起動
  (hunchentoot:start *ceramic-server*))

;; サーバーの停止用コマンド
(defun stop-server ()
  (hunchentoot:stop *ceramic-server*))


;; テスト用のページ記述（CL-WHO)
(defun index ()
  (cl-who:with-html-output (*standard-output* nil :indent t :prologue t)
    (:html
     (:head
      )
     (:body
      (:p "Ceramic test")))))

;; Ceramicアプリを実行
(defun run ()

  (ceramic:interactive)
  (start-server)
  (let ((window
	  (ceramic:make-window :url "http://localhost:25252")))
    (ceramic:show-window window)))
```

# 実行

```lisp
CL-USER> (load "test.lisp")
To load "ceramic":
  Load 1 ASDF system:
    ceramic
; Loading "ceramic"

To load "hunchentoot":
  Load 1 ASDF system:
    hunchentoot
; Loading "hunchentoot"

To load "cl-who":
  Load 1 ASDF system:
    cl-who
; Loading "cl-who"

Creating Ceramic directories...
Downloading a copy of Electron...Downloading "https://github.com/atom/electron/releases/download/v0.28.1/electron-v0.28.1-darwin-x64.zip" (Unknown size)
#P"/path/to/test.lisp"

CL-USER> (run)
127.0.0.1 - [2017-02-02 04:50:58] "GET / HTTP/1.1" 200 189 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Ceramic/Electron/0.1 Chrome/43.0.2357.65 Electron/0.28.1 Safari/537.36"
"{\"cmd\":\"show-window\",\"name\":\"urn:uuid:63969317-86df-49cb-a054-a8bba4ffb3e8\"}"

```

![スクリーンショット 2017-02-03 3.28.01.png](https://qiita-image-store.s3.amazonaws.com/0/117467/ba46f979-5c97-ffcd-9b1b-2e7fc9d9f839.png)

なんのことはない，くだらないホーム画面ができました

# まとめ

というわけでCeramicを使ってみました．

今回WebサーバをHunchentootで立てたりと，少し独自のやり方でやってますが，[公式ページ](http://ceramic.github.io/)にあるコードをそのまま実行すればTwitterアプリ的なものが起動しますので，簡単に試したい人はそちらをそのまま実行すればいいかと思います．

実際に使っていると，やはりElectronでできることが全てできるという現状には無いようですが，これからに期待が高まる面白い技術だと思います．

以前，僕が投稿した，[「CommonLispでGUIアプリケーションを構築する」](http://qiita.com/dbym4820/items/2c2831bf6d08e581512f)では，Tcl/TkのラッパーライブラリであるLtkを用いてGUIアプリを実装しようと思ってましたが，このCeramicのほうが柔軟かつ簡単な実装ができそうです．

# 今後のライブラリ使用予定
個人的な興味としては，デスクトップに自作の人工知能マスコットを置きたいな〜(しめじ的な，カイルくん的な)，と妄想しているので，試してみたいと思います．

日本語だけじゃなく，英語でもそれほど感想とかが多くない印象なので，もし使った人がいたら，意見の共有とかできればうれしいですね．