RubyをHackしてきました！

こんにちはー。yuikと申します。

みなさん、いかがお過ごしでしょうか。最近涼しくなってきましたね☺️

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

作業する環境 
VPSのUbuntu18.04にsshでつないで作業
しようとしましたが、なぜかVPSにSSH接続できませんでした...ので環境構築(？)などを一からやっていきます。また今回は便利なコマンドについても学んできました。

今回の作業環境
最近構築した、vagrant+VirtualBoxでUbuntu環境で作業、ちなみにgitすら入っていないまっさらな状態ですので環境構築から始めたいと思います...

関係する言語 : Ruby,C

#今回やったこと
VPSを直すというか、ssh接続できるようにするために色々やりましたが、ダメでした...
ので[前回やったこと](https://qiita.com/yuik/items/793e4cb3f20258e03b7b)をPCに入っている(？)仮想環境のUbuntuで一からやりました（）2回目の参加なので詳しく書けるところは詳しく書こうと思います。


#まずはじめに
<img width="559" alt="スクリーンショット 2019-09-01 14.45.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/6a172d5e-aa4b-7460-8d47-c62e8b5db7fa.png">
まずはじめにコマンド周りを
```$ sudo apt-get install git ruby autoconf bison gcc make zlib1g-dev libffi-dev libreadline-dev libgdbm-dev libssl-dev```
で一気にインストール

次に
```$ mkdir workdir```
でworkdirを作る
次に
```$ cd workdir```
でworkdirに移動して
<img width="545" alt="スクリーンショット 2019-09-01 14.50.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/35de14d1-c480-73c7-1ddf-3b08ef02cc6c.png">
```$ git clone https://github.com/ruby/ruby.git```
でworkdirにMRIのソースコードをclone
*MRIとは、 Matz Ruby Interpreter のこと

次に
```$ cd workdir``` でworkdirに移動
```$ cd ruby``` でworkdir/rubyに移動
```$ autoconf``` このコマンド前回も実行したんですけどどんな意味があるのかわかってないです..
```$ cd ..```で上の階層に移動する
```$ mkdir build```でworkdir/buildを作成する
```＄　cd build```でworkdir/buildに移動
```$ よくわかってないコマンドを入力して実行```...()
```$ make -j```でビルドしました
```$ make install```で/installに色々インストールされる
<img width="491" alt="スクリーンショット 2019-09-01 16.07.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/6300ee38-5910-4638-65fc-c54f03a83469.png">
```$ ../install/bin/ruby -v```でRubyがインストールされたことと、バージョンを確認しました。画像を確認するとわかると思いますがRubyのバージョンはruby 2.7.0~みたいです。

#上でビルドしたRubyでプログラムを実行してみたいと思います
Rubyをビルドした時に```miniruby```という実行ファイルができたので、それを使ってプログラムを実行したいと思います。

はじめに ~/workdir/build の中に```$ touch test.rbでtest.rb```ファイルを作ります。
<img width="374" alt="スクリーンショット 2019-09-01 16.20.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/97823cb1-a28c-aa8c-7a34-eb0474905415.png">
test.rb を作りました。
<img width="558" alt="スクリーンショット 2019-09-01 16.20.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/0fe107db-bf77-f5ab-a7d4-b8f71ebc1f00.png">
次にvimでtest.rbを開いて、RubyのHello Worldのプログラムを書きました。
(スクショする時に間違えて"これを改行してしまったみたいです...あとで気づいて直しておきました)
Hello Worldのコードが書けたら```./miniruby test.rb```で実行します
<img width="446" alt="スクリーンショット 2019-09-01 16.24.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/2d3aa290-d951-e76b-0039-6fe4a27fa1b0.png">
やったー！ビルドしたRubyでHello Worldのプログラムが実行できました！🎉

#表記の変更
ruby -vを実行したときに自分のRubyだとわかるように、何か表示を変えてみようと思います。
1.~/workdir/rubyの中にある、version.cをvimで開く
<img width="556" alt="スクリーンショット 2019-09-01 16.39.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/7ce24ee5-aae8-5fd0-2cf0-c94ecaa36100.png">
2.ruby_show_version()という関数が怪しいと教材に書いてありましたので、そこをいじってみようと思います。
3.fflush() が、出力を確定するC言語の関数なので、この前に何らかの出力をすれば良いとのこと。
<img width="501" alt="スクリーンショット 2019-09-01 16.42.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/cbdf263e-bb2e-c854-c1bf-b22558697ca1.png">
4.書くのはなんでもいいとのことなので、fflush(stdout);の上の行にprintf("yuik-no-Ruby-2\n");と書きました。
5.```$ mv version.c ../build/```でversion.cを~/workdir/Rubyから~/workdir/buildに移動させる。
5.移動できたら```$ make miniruby```で、いじったソースコードをビルドします。
6.```$ ./miniruby -v```でバージョンを確認してみます。
<img width="511" alt="スクリーンショット 2019-09-01 16.52.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/9b004c31-1414-f4b3-272f-1a438f184a73.png">
確認したら、yuik-no-Ruby-2って表示されてる!!
やったー！！🎉

####時間なので、今回はここで終わりにしたいと思います。



#今回覚えたコマンド
Ctrl + Rで過去に使ったコマンドを検索できる
↑すげぇ..すごいことを教わりました!!(ありがとうございます!!)

次に
```$ ls --version```みたいに-とかが二個つくやつあるじゃないですか
それって独自の文化を歩んできたらしいんですよね。詳しくはまだ理解してないです()

次に
```ls --help```
すると色々なコマンドの一覧が出てくることを教わりました

次に 
```$ ls | less```みたいなlessにlsを実行(?)するパイプのコマンドを教わりました
![hyoujunnnyuusyuturyoku.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465957/8458a099-5436-9bd3-2d00-40f8d15b54eb.jpeg)
(ノートに自分で教わったことを書きました)
これすごいですよね
標準入出力っていう仕組みも教わりました
すごいことを教えてくださり、ありがとうございました！！！

これも聞いた話なんですけど、linuxとかmacのコマンドとWindowsのコマンドは全く違うみたいですね.それぞれ独自の文化を歩んできたとか。まだ詳しく理解してないです...ごめんなさい🙇‍♂️

#最後に
すごいことを教えていただいたり、Rubyを実行できたりでめっちゃ楽しかったです。
Ruby Hack Challengeに参加すると色々なことが聞けていいですね、また参加したいです!!
ありがとうございました！！
雑な記事で申し訳ありません..🙇‍♂️
コマンドは[こちら](https://github.com/ko1/rubyhackchallenge/blob/master/JA/2_mri_structure.md)を参照しました!
まだ理解できていない部分もあるので、間違ったことを書いていたら本当にごめんなさい...🙇‍♂️

*投稿はEndohさんの許可を取りました。