Rails要らず、CGIとRubyでソースコードをフローチャートにするツール作成

きっかけは怠惰なお気持ちでした。ということで、こんなの作ってみました。よかったら、ご覧ください。
---
######  要は、<font color="Red">フォームに入力されたRubyのソースコードを、フローチャートにしてくれる</font>、というもの。
![class_worker.gif](https://qiita-image-store.s3.amazonaws.com/0/367758/fe016e54-b1e6-1a79-7672-4650c280f46d.gif)

#### 具体的には、以下のソースコードが

```rb

class Worker
    def initialize(hungry:)
      @hungry = hungry
    end

    def next_action
      if hungry?
        :eat
      else
        :work
      end
    end

    def hungry?
      @hungry
    end
  end
```
#### こんな画像になって出てくる。
![source_code.png](https://qiita-image-store.s3.amazonaws.com/0/367758/2cf508c2-fedb-76bc-ac3a-81ee470f5a99.png)
ソースコードのフローチャート化のために、RubyのGem[visualize_ruby](https://github.com/zeisler/visualize_ruby)とグラフ描画してくれる[Graphviz](http://melborne.github.io/2014/02/27/gviz-posts/)を使っています。
#### きっかけは怠惰なお気持ちでした(T_T)
- 業務の中で仕様書になっていないソースコードを読んで、読んで、理解して、フローチャートにして、要件詰めて、また読んでが面倒に思えた。
    - 読むだけなら、まだいいんですが、他の人と共有とかを考えると可視化していく必要があった
    - １回ならいいんだけれど、いろんなところでそれが発生していた
    - どんどん変化していく類のものだったときに、仕様書にしてもメンテされない

##### あと普段Railsを使うことが多いのですが、乳離というか、Rails離れもしたいというお気持ちでした
- Railsにはいつもお世話になっており、細かいことを気にしなくても、ワタシが気持ちよく働ける環境を作ってくれています
    - が、いっぽうで、それゆえに根本的なRubyという言語やWebサービスがどう動いているのかの理解が浅いままになっちゃているな、とも思うようになった。
    - ミニマムでやりたいことだけをやるとしたときに、なにがあればいいんだろうかっていうのも知りたかった。恥ずかしながら、たぶんRailsなしでは飛べない小鳥ですので。

##### フローチャートに自動でしてくれるやついないかなって探していたら、街角でばったり出くわしたのが[visualize_ruby](https://github.com/zeisler/visualize_ruby)でした。
- 有り難いと思いながら、卑屈な人間なので
    - 簡単に自分の環境で実装ができたのですが、環境依存とかで設定が面倒だなって思い
    - コンソールからイジルの、絶対みんなできないよ〜って思い

### そうだ！環境に依存しないDockerでRailsを使わない(CGIとRuby)でブラウザからフォーム入力ができて、描画してくれるツールを作ってみようと決心したのでした。
こちらが該当のリポジトリ、名付けて**[VisualizeSrc](https://github.com/taishinagasaki/visualize_src)！！**
ざっくり取り上げると、以下のような構成で作ってみました。詳細な中身はリポジトリをご覧ください。基本的には、リポジトリを各人のローカル開発環境にpullしてもらって、ビルドしてもらえればlocalhostのport80で動くような設定をしています。

#### ファイル構成
```bash

/var配下の処理スクリプト達
├── www
│   ├── cgi-bin
│   │   ├── Gemfile
│   │   ├── Gemfile.lock
│   │   ├── result.rb ...フォームから値を受け取ってモジュールに渡す
│   │   ├── source_code.png ...作成される画像データ
│   │   └── visualize_mod.rb ...画像を作るモジュール
│   └── html
│       └── form.cgi ...フォームから入力値を受け取る

/etc配下の設定ファイル達
├── conf
│   ├── httpd.conf ... PortやAliasの設定
├── conf.d
│   ├── cgi-enabled.conf ... CIGでRubyファイルが処理できるように設定

ちなみにrbenvを使って管理しており、Gemは以下のパスへ
/usr/local/rbenv/versions/2.3.8/lib/ruby/gems/2.3.0/gems/
```

#### 環境
    - Dockerfile
    - CENTOS:7
    - Apache
        - 変更した設定(Dockerでイメージビルドするときに差し替えました)
            - httpd.conf
            - cgi-enabled.conf
    - Ruby:2.3.8
        - 使ったライブラリ
            - parser
            - visualize_ruby
    - 詳細はDockerfileを！

#### 使い方はこんな感じ。
１. 該当リポジトリを各環境へpull　

```
git pull https://github.com/taishinagasaki/visualize_src.git
```

２. Docker imageの作成　

```
docker build -t repository_name/image_name:tag_name . --no-cache=true
```

３. できたイメージを確認

```
docker images
```

４. dockerのイメージは以下の特権モードで起動する。ポートは80と80を繋げる。　

```
docker run --privileged -d -p 80:80 --name container_name repository_name/image_name:tag_name /sbin/init
```

５. containerが立ち上がっていることを確認する。statusがUPになればOK。　

```
docker start <container_id>
```

６. 立ち上がっていればcontainer idを指定して起動　

```
docker exec -it <container_id> /bin/bash
```

７. apacheの起動　

```
systemctl start httpd
```

８. apacheの起動を確認　

```
systemctl start httpd
```
９. ブラウザから　`localhost/form.cgi`へアクセス
使い方は該当リポジトリのREADME.mdに記載しております。

#### 各工程と、助けてくれた資料達
| 作業内容                 | 資料名     |
|:---------------------------------|:------------------|
|ApacheのインストールからCGI設定まで|[Apache httpd : インストール設定](https://www.server-world.info/query?os=CentOS_7&p=httpd&f=1)|
|RubyをCGIで動かす設定まで|[Apache httpd : Ruby を利用する](https://www.server-world.info/query?os=CentOS_7&p=httpd&f=4)|
|フォーム入力値をRubyファイルで受け取る|[[Linux][Ruby]ApacheでRubyのCGIを動かす方法](http://d.hatena.ne.jp/shunsuk/20080318/1205842317)|
|Dockerでsystemctlを使えるようにする|[CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する](https://qiita.com/yunano/items/9637ee21a71eba197345)|
|Dockerでイメージ作ってコンテナを立ち上げる|[Dockerコマンドメモ](https://qiita.com/curseoff/items/a9e64ad01d673abb6866)|

---
#### ハマったこと
*[Shebang](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_(Unix))*という、インタプリタの指定にハマってしまいました。
> シバンまたはシェバン (英: shebang) とはUNIXのスクリプトの #! から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。

恥ずかしながらShebagの存在すら知らず、インストールしたgemを一括で取り込むためにrequire 'bundler/setup'を実行しても延々とエラーが出続ける、というもので、これに関してはデバッグ方法もわからずでした。ググってもなかなかなく、根本的な理解がなってないな〜ということを改めて知りました。
~~また後日、投稿したいと思います。~~
<font color="Red">[追記: 2019/03/02]</font> [`require': cannot load such fileエラーをインタプリタ指定から探る ~ファイル１行目のshebang設定~](https://qiita.com/taishinagasaki/items/47726b33e7a9a0666f1d)...shebang設定について言及

#### まだできてないこと/TODO
- Web化してもいいかなっておもったんですがセキュリティ周りの設定が間に合わず(怖かったので)、またの機会に持ち越しとしました。
- DockerfileのCMD複数指定を実現する。
    - CMDでshell scriptを指定してあげるとできるとおもっていたが、できず。
    - どうにかやってみたい。
- VIMで環境を整えたい。

#### 学び
- Railsから離れたり、いつも使っている高機能エディタから離れることでより根本理解が深まった印象。
- MW(Apache)やOS層も普段は殆ど触らないので勉強することが多かった。
- 実はQiita投稿も初めてなので、その他「初めて」が多くてよかった。

#### 次にやりたいこと
- TODOを潰す
- Dappに触ってみる

お読み頂きありがとうございました。
なにか間違っていたり、ベターな方法がある場合はご教示いただけると幸いです。