LoginSignup
10
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-01

きっかけは怠惰なお気持ちでした。ということで、こんなの作ってみました。よかったら、ご覧ください。

要は、フォームに入力されたRubyのソースコードを、フローチャートにしてくれる、というもの。

class_worker.gif

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


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
ソースコードのフローチャート化のために、RubyのGemvisualize_rubyとグラフ描画してくれるGraphvizを使っています。

きっかけは怠惰なお気持ちでした(T_T)

  • 業務の中で仕様書になっていないソースコードを読んで、読んで、理解して、フローチャートにして、要件詰めて、また読んでが面倒に思えた。
    • 読むだけなら、まだいいんですが、他の人と共有とかを考えると可視化していく必要があった
    • 1回ならいいんだけれど、いろんなところでそれが発生していた
    • どんどん変化していく類のものだったときに、仕様書にしてもメンテされない
あと普段Railsを使うことが多いのですが、乳離というか、Rails離れもしたいというお気持ちでした
  • Railsにはいつもお世話になっており、細かいことを気にしなくても、ワタシが気持ちよく働ける環境を作ってくれています
    • が、いっぽうで、それゆえに根本的なRubyという言語やWebサービスがどう動いているのかの理解が浅いままになっちゃているな、とも思うようになった。
    • ミニマムでやりたいことだけをやるとしたときに、なにがあればいいんだろうかっていうのも知りたかった。恥ずかしながら、たぶんRailsなしでは飛べない小鳥ですので。
フローチャートに自動でしてくれるやついないかなって探していたら、街角でばったり出くわしたのがvisualize_rubyでした。
  • 有り難いと思いながら、卑屈な人間なので
    • 簡単に自分の環境で実装ができたのですが、環境依存とかで設定が面倒だなって思い
    • コンソールからイジルの、絶対みんなできないよ〜って思い

そうだ!環境に依存しないDockerでRailsを使わない(CGIとRuby)でブラウザからフォーム入力ができて、描画してくれるツールを作ってみようと決心したのでした。

こちらが該当のリポジトリ、名付けてVisualizeSrc!!
ざっくり取り上げると、以下のような構成で作ってみました。詳細な中身はリポジトリをご覧ください。基本的には、リポジトリを各人のローカル開発環境にpullしてもらって、ビルドしてもらえればlocalhostのport80で動くような設定をしています。

ファイル構成


/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を!

使い方はこんな感じ。

1. 該当リポジトリを各環境へpull 

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

2. Docker imageの作成 

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

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

docker images

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

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

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

docker start <container_id>

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

docker exec -it <container_id> /bin/bash

7. apacheの起動 

systemctl start httpd

8. apacheの起動を確認 

systemctl start httpd

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

各工程と、助けてくれた資料達

作業内容 資料名
ApacheのインストールからCGI設定まで Apache httpd : インストール設定
RubyをCGIで動かす設定まで Apache httpd : Ruby を利用する
フォーム入力値をRubyファイルで受け取る [Linux][Ruby]ApacheでRubyのCGIを動かす方法
Dockerでsystemctlを使えるようにする CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する
Dockerでイメージ作ってコンテナを立ち上げる Dockerコマンドメモ

ハマったこと

Shebangという、インタプリタの指定にハマってしまいました。

シバンまたはシェバン (英: shebang) とはUNIXのスクリプトの #! から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。

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

まだできてないこと/TODO

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

学び

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

次にやりたいこと

  • TODOを潰す
  • Dappに触ってみる

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

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9