Kansai Lisp User Group Evaluation Platform

# Kansai Lisp User Group Evaluation Platform
## 目的
Dockerの開発環境で、関西Lispユーザ会で発表された作品を、簡単に試せるようにする、というのが一番の目的です。
あとはそこで多少の開発ができたほうがいいかもしれませんが、豪華な開発環境を
Dockerのイメージの中に入れて、サイズを大きくするのは良くないかなと思います。
まあvimも入っていないのは良くないでしょうから、多少は入れます。

## 方向性
今のところLinuxのことしか考えていません。もっというと自分のパソコンの環境しかわかっていませんが、
要望は歓迎です。

### イメージとコンテナ
Dockerはイメージからコンテナを作り(run)、コンテナをstartしてプロセスとします。

Dockerではコンテナは毎回イメージから作り直すような運用が一般的なようですが、
ここではコンテナは消しません。残して使いまわします。
ただコンテナを消しても、開発したソースコードやホームディレクトリの設定などは消さないように、
「ホストとディレクトリを共用」します。(次節参照)

#### ホストとディレクトリを共用
「関西Lispユーザ会で発表された作品」が入っている、Gitでcloneしたディレクトリはホストにあると思いますが、
それをこの評価環境では共用します。Dockerのイメージの方には含みません。これによって、

+ たとえば評価環境内で変更したソースコードなどは、Dockerのイメージ内ではなく、ホストマシンにあるので、
  Dockerのイメージを作り直しても消えないし、ソースコードが二重管理にならない。
+ Dockerイメージに豪華な開発環境を入れる必要がなくなるし、開発自体はホストマシンで行える。

などのメリットがあるかなと思います。

ちなみに今はホストマシンでのUIDが1000、GIDが1000であることが前提になっています。
それ以外だとパーミッションの問題があると思います。Dockerfileでの設定を変更する必要が
あると思います。(useradd、groupaddでそれぞれUID、GIDを指定する)

#### ベースにするDockerイメージ
debianの最新にします。理由は特にありません。

roswellがパッケージで入っているディストリビューションを選ぶ、というやり方もあると思うのですが、
Gitで最新にするのもよかろう、ということで、パッケージで入れないことにします。

なので、ベースにするのはubuntuでもいいのですが、なんとなくdebianです。


### 入れるパッケージ
意外なことに、sbclはパッケージでは入れません。roswellで入れるので、最初に入れておく必要はないかなと思いました。

#### git
これがないと、そもそもの動機、「関西Lispユーザ会で発表された作品」を楽しむことができません。ので最優先で入れます。

#### vim
多少ファイルの中身を見たりしたいこともあるので、入れておきます。

#### xterm
これはxtermを直接使うわけではないのですが、わたしの端末環境(KDE konsole)では```resize```コマンドが
ないとkonsoleの画面サイズをわかってくれなかったので、そのために入れています。

#### build-essential
これも要りそうなので、入れておきます。

#### sudo
いりそうなので。

#### automake
roswellのインストールに必要なようです。

#### libcurl4-openssl-dev
これもroswellのインストールに必要なようです。

#### rlwrap
行編集や履歴のキー呼び出し(readline)ができるように
入れました。(ReadLine WRAP)

~/.bashrcに

```shell
alias ros='rlwrap ros'
```
という行を入れておくと行編集や履歴のキー呼び出しが有効になります。

### その他設定
#### ユーザ
klugepというユーザを作り、このユーザでDockerイメージを利用します。
パスワードも```klugep```です。sudoグループに入れているので、sudoできます。
sudoでパスワードを聞かれたら、```klugep```を入れて下さい。
セキュリティの問題があるならやめます。

## 環境構築
### Docker
これはホストマシンにパッケージで入れておいて下さい。Funtooではカーネルのパラメータを設定しなければ
いけませんでした。

### ホストと共用するディレクトリの作成
以下の2つのディレクトリを準備しておいて下さい。

#### Gitリポジトリ
~/Gitにあるものとします。以下の説明ではそれで表現します。

#### klugepのホームディレクトリ
klugepのホームディレクトリもホストマシンと共用することにします。たとえば~/klugepというフォルダを作って
おいてklugepのホームディレクトリにしておけば、そこにklugep用の.bashrcなどを置くことができます。
こうするのはホストマシンの~/.bashrcと重ならなくていいかなと思うからです。 


## 使い方
### 環境構築と起動
1. git clone https://github.com/duloxetine/klugep.git
1. cd klugep
1. docker build -t klugep . (末尾にピリオドがあります)
1. ./klugep-run (yと答えて下さい。)
1. ./klugep-start

でbashが立ち上がります。

### roswellのインストール
前の節でbashが立ち上がったところからの話です。

roswellのインストール自体は
https://github.com/roswell/roswell/wiki/Installation#building-from-source
をご参照下さい。

1. Gitの設定をしておいたほうがいいと思います。名前やメールアドレスは利用したいものを設定して下さい。

```shell
  $ git config --global user.name "John Doe"
  $ git config --global user.email johndoe@example.com
  $ cd ~/Git
```

あとは

```shell
git clone -b release https://github.com/roswell/roswell.git
cd roswell
sh bootstrap
./configure
make
sudo make install
ros setup
```

みたいになると思います。一旦ビルドできてしまったら、次回からインストールが必要な時は

```shell
  sudo make install
  ros setup
````
  でいいと思います。(この辺がイメージの中にroswellを入れておけばいいのにね、という話になります。)

### atsuageのインストール
atsuageは第5回の関西Lispユーザ会で発表された作品です。(MYAOさん作)

https://github.com/myaosato/atsuage をご参照下さい。

前の節でroswellのインストールが済んだなら、

```shell
$ ros install t-sin/rosa
$ ros install myaosato/atsuage
```
でできると思います。```PATH```に```~/.roswell/bin```が追加されていると思います。```~/.bashrc```にも変更が入ってますね。

すぐに```atsuage```コマンドが使えます。

```shell
$ cd ~
$ atsuage new-project mywebsite
$ cd mywebsite
$ atsuage dir
$ atsuage page-all
```
とすれば```pages/index.html```が出力されます。
(```atsuage dir```はプロジェクトの確認手段なので、出力のためには必要ありません。)

これがWebブラウザで見られるといいと思いますが、今のイメージには
入っていません。ただ、ディレクトリは共用しているので、ホストの
```~/klugep/mywebsite/pages/index.html```
に出力されていますので、それをWebブラウザで見ることはできます。

```shell
[ホストマシンで]
$ firefox ~/klugep/mywebsite/pages/index.html
```

### 終了
bashのプロンプトで```exit```と入力して下さい。

### また起動するときには
ホストマシンで```./klugep-start```を実行するだけです。
コンテナを作り直していなければそれで前の続きになると思います。

### もう一つshellが欲しいんだけど
ホストマシンで端末エミュレータを起動して、```klugep-start```のあるディレクトリに
移動して、```./klugep-start```を実行するだけです。


### arrp (第6回)
arrpは第6回の関西Lispユーザ会で発表された作品です。(MYAOさん作)

https://github.com/myaosato/arrp をご参照下さい。

arrpはJavascriptでできているので、まずはJavascriptの環境を整えないといけないです。
今はそこまでできていません。


### cl-ontology (第4回)
cl-ontologyは第4回の関西Lispユーザ会で発表された作品です。(tomabuさん作)

https://github.com/dbym4820/cl-ontology をご参照下さい。
いろいろ準備が必要なようですが、インストールだけなら、

```shell
$ ros install dbym4820/cl-ontology
```
でできるようですね。

### よくある質問と答え
#### 本当に「よくある」質問と「答え」なのですか?
ここはわたしが疑問に思っていることを書いているまででして、本当によくあるか、
答えが書いてあるかは疑問です。

#### なぜklugep-startでbashを起動すると```/```にいるのですか?
すみません。わかりません。ホストの~/klugepに.bash_loginを置いて、

```shell
cd ~
source ~/.bashrc
```
などと書いておけばいいかもしれません。

#### インストールされるパッケージに過不足があると思うのですが
確かに507MBにもなることですので、小さくしたほうが嬉しいかもしれません。でも
開発環境として自分のパソコンで使うので、ここから半分に減らしたとしても、そんなに嬉しくないような
気がするので、やっていません。もちろん入れておくと問題があるものを外していくことは
やったほうがいいと思います。

不足しているものは入れたほうがいいかと思いますが、開発自体はklugepの外でやったほうが
いいんじゃないかと思うのですが、いかがでしょうか。

#### ~/Gitディレクトリの使い方は?
roswellは実行ファイルのインストールなので、ソースコードは別に置いておいたほうが
やりやすいのかなと思います。
元々ソースコードを```~/Git```に置いておいたなら、klugepの中でも```~/Git```で
参照できます。 ```git pull/push```なども可能かと思います。

リポジトリのソースコードを修正して、実行してみるのは言語によっても違いがあると思いますが、
roswellなら

```shell
ros run
```
でsbclが起動します。

#### なんでzshじゃなくてbashなんですか
最強zshを入れて布教したいところですが、何となくそこまで自分を駆り立てる何かが
なかったため、bashのままです。

## 注意事項
#### Docker内のシステムへの変更は、イメージを更新すると消えてしまいます
たとえばrootになって新しいユーザを追加しても、そのコンテナのスナップショットの中だけ有効で、
元のイメージから更新(コンテナを作り直す:docker run)すると消えてしまいます。
これはDockerがいつも同じ環境を提供できることと表裏一体の話です。

したがって、Docker内のシステム領域への変更を恒久的にしたいならば、Dockerfileに変更を加えて
イメージを作り直すことになります。みんなに役立ちそうだったら、その変更点をわたしに教えてもらうと助かります。
Kansai Lisp User Group Evaluation PlatformのDockerファイルを修正します。

または変更をするスクリプトを作成して、イメージを更新したあとに、そのコマンドを実行するだけで
自分の変更が反映できるようにしてもいいと思います。


## 最後に
「Kansai Lisp User Group Evaluation Platform」と名前は付けたものの、自分が使いたいだけです。
実際に「関西Lispユーザ会で発表された作品」を開発されている方、Lisp環境を構築済みの方にはほとんど
メリットはないです。あるとしたら別の環境での動作確認ができるといえばできる、くらいでしょう。

ただこんなもんでも、どなたかにおもしろがってもらえて、「関西Lispユーザ会で発表された作品」を手軽に楽しむことが
できれば、それでいいんじゃないかと思います。