休日にRuby を Hack  してきました！

こんにちはー。初めまして、yuikと申します。

えー、みなさん、いかがお過ごしでしょうか。自分は暑すぎてバテてます...😅

[Ruby Hack Challenge Holiday #5](https://rhc.connpass.com/event/131026/)に参加してきましたので！やってきたことを記事にまとめました!!

作業する環境 
VPSのUbuntu18.04にsshでつないで作業
いつもはvagrant+VirtualBoxでUbuntu環境を構築しているのですが、諸事情により今回会場に持ってきたPCにvagrant+VirtualBoxでUbuntu環境を構築できていなかったので、VPSを使いました(VPSを好奇心により契約していて助かった!!

この記事で関係する言語 : Ruby,C

#今回のRHCでやったこと
1.MRI のソースコードを clone
2.MRI のビルド、およびインストール
3.ビルドした Ruby でプログラムを実行
4.バージョン表記を変更してみよう
です。

*MRIとは、 Matz Ruby Interpreter のこと

#まずはじめに、
Ubuntuにgit、ruby、autoconf、bison、gcc (or clang, etc）、make が入っていなかったので、
```$ sudo apt-get install git ruby autoconf bison gcc make zlib1g-dev libffi-dev libreadline-dev libgdbm-dev libssl-dev```
この↑コマンドで一気にインストールする
インストールできたら
#MRI のソースコードを clone
手順
1.```$ mkdir workdir```~/workdirを作成します
2.```$ cd workdir```~/workdirに移動します
3.```$ git clone https://github.com/ruby/ruby.git```
このコマンドを実行したら、~/workdir/ruby にソースコードが clone されます

##MRI のビルド、およびインストール
1.```$ cd workdir/```  ~/workdir に移動します
2.```$ cd ruby``` ~/workdir/ruby に移動します
3.```$ autoconf```configure スクリプトの生成
4.```$ cd ..```~/workdirに移動します
5.```$ mkdir build```  ~/workdir/build を作成します
6.```$ cd build```
7.```$ ../ruby/configure --prefix=$PWD/../install --enable-shared```このコマンドにどんな意味があるのかわかってないです...申し訳ない😢
8.```$ make -j```  ビルドします。-j は並列にコンパイルなどを行うオプションです。
9.```$ make install```この時点で、../install、つまり ~/workdir/install に諸々インストールできました。

##ビルドした Ruby でプログラムを実行してみよう!!
###miniruby で実行しよう
まずはじめに ~/workdir/build の中に```$ touch test.rb```でtest.rbファイルを作ります。

<img width="343" alt="スクリーンショット 2019-07-20 14.57.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/54ce5463-b238-c81f-ce00-bb7600eee505.png">
<img width="566" alt="スクリーンショット 2019-07-20 15.07.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/f1996cfc-2a05-eacf-d95f-ebcb19d7ba72.png">
vimでtest.rbを開いて、RubyでHello Worldを書く

Hello Worldのコードが書けたら```./miniruby test.rb```で実行
<img width="396" alt="スクリーンショット 2019-07-20 14.57.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/420aeecf-40a1-8b59-ddce-054464278df6.png">
今回ビルドしたRubyで、Hello Worldのプログラムが実行できた!!🎉🎉🎉

##Rubyのソースコードをいじってみよう
####Rubyのソースコードをいじってみようってことで、まずは
<img width="566" alt="スクリーンショット 2019-07-20 16.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/d343970b-4f42-1ec2-d127-ffa347ab3ef4.png">
~/workdir/build内のmain.cをvimで開いて、最初のmain関数のところに ```printf("begin\n");``` と書く
書いたら make run (実行) させる、
<img width="468" alt="スクリーンショット 2019-07-20 16.07.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/646d2c30-b5c1-d19e-7c7e-7b6404cf5260.png">

できた!!
いま何をやったかというと、make runした時にはじめにbeginと出力させてから改行して、RubyのHello Worldのコードを実行させるという処理を書きました!!

<img width="566" alt="スクリーンショット 2019-07-20 16.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/ce7031a6-497d-ebea-4de3-14e225df3f83.png">
main.cファイルの下の行の方にあるruby_sysinit~~~みたいに書いてある方には```printf("end\n");```と書いてみました。
<img width="460" alt="スクリーンショット 2019-07-20 16.29.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/0a84bdae-bed5-3a35-f534-09f35c7e5c44.png">
実行結果はこちらです、しっかりendと出力できてます!!
#バージョン表記の修正をしてみよう
実際に Ruby を修正してみます。
ruby -v（もしくは ./miniruby -v）を実行したときに、自分のRubyだとわかるように、何か表示を変えてみます。
1.~/workdir/rubyの中にある、version.cファイルをvimで開きます。
<img width="572" alt="スクリーンショット 2019-07-21 18.16.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/75a278f6-6955-4d2c-e086-44229bac6d98.png">
2.ruby_show_version()という関数が怪しいと教材に書いてありましたので、そこに目を向けます。
3.fflush() が、出力を確定する（出力バッファを吐き出す） C の関数なので、この前に何らかの出力をすれば良いとのこと。
<img width="565" alt="スクリーンショット 2019-07-21 18.19.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/07e81282-f941-158b-4aea-ad63db45fd0d.png">
4.書くのはなんでもいいとのことなので、```fflush(stdout);```の上の行に```printf("yuik-no-Ruby\n");```と書きました。
5.```$ mv version.c ../build/```でversion.cを~/workdir/Rubyから~/workdir/buildに移動させる。
5.保存したら```$ make miniruby```でビルドします。
6.```$ ./miniruby -v```で結果を確認します。
<img width="590" alt="スクリーンショット 2019-07-21 18.40.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/92fd34e7-0d0a-0182-e616-af1035f99aa7.png">
お!!!yuik-no-Rubyって表示されてる!!
やったー!!!🎉🎉🎉


##今回覚えた豆知識的なもの
<img width="426" alt="スクリーンショット 2019-07-21 16.48.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/6c1d62cf-da65-5790-c295-fecad1b7b91d.png">
例えば~/workdir/rubyに今いるとする、それで~/workdirに移動したくなったら```cd ..```とコマンドを打つと
<img width="321" alt="スクリーンショット 2019-07-21 16.51.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/5b1207b6-9a58-17c0-df86-c4e494693599.png">
簡単に~/workdirに移動できる!!
<img width="348" alt="スクリーンショット 2019-07-21 17.01.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/99b3eb84-399c-eb21-70b3-c731f9829245.png">
こんな感じで```cd build```って打つだけで、簡単に~/workdir/buildに移動できる!!自分はいつも、```cd ~/workdir/build```みたいに全部打ち込んでました...。(この歴史的発見をした感、伝われ..!!)

####mvコマンドを覚えました!!
```$ mv version.c ../build/```でversion.cを~/workdir/Rubyから~/workdir/buildに移動させる。
<img width="452" alt="スクリーンショット 2019-07-21 18.30.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/c71dd05b-5f7f-c26d-a022-7999b3893b72.png">
すごい..~/workdir/buildでlsして確認すると移動できとる..!前に教材で勉強したけど、覚えられてなかったんですよねー、コマンド系って実際必要になってから使う場面が来ると覚えられる気がします((
####tabキーの使い方を覚えました!!
例えば~/workdir/rubyのなかのmain.cファイルをvimで編集したいってなったとします、いつもは```vim main.c```と打っていたのですが、```vim m```と打ってtabキーを押すと
<img width="495" alt="スクリーンショット 2019-07-21 18.04.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/b633bda1-f28e-cb29-936d-3abe6c2c1f92.png">
こんな感じで、最初にmがつくファイルの候補がいくつか出てくる!!これは歴史的大発見だ!!

####このような便利なコマンドを、教えていただきました! ありがとうございました!!
#今回のまとめ
Rubyをビルドできたことや自分のRubyを作れたことに感動しました。
初歩的なコマンドとかの使い方を知らなかったのですが、詳しく教えていただいて、すごく勉強になりました!
ありがとうございました!!

####記事について
https://github.com/ko1/rubyhackchallenge/blob/master/JA/2_mri_structure.md ← こちらの記事を引用させていただいている部分があります。
引用部分と自分の言葉の部分が混ざってしまいました。イベントが終わった後にko1さんに聞きに言ったら、今回はこのままでいいよ、とko1さんに言っていただきましたのでこのまま投稿します。次からは引用する部分と自分の言葉の部分を分けたいと思います。


#####初めて記事を書いたので、読みにくい部分やわかりにくかった部分もあると思いますが、最後まで読んでいただきありがとうございました!!
####先に謝っておきますが、間違ったことを書いていたら本当に申し訳ありません！！！
#####間違ったことを言っていても、許してください!!!
#####今回学んだことを生かして、プログラミングを頑張ります!!