こんにちはー。初めまして、yuikと申します。
えー、みなさん、いかがお過ごしでしょうか。自分は暑すぎてバテてます...😅
Ruby Hack Challenge Holiday #5に参加してきましたので!やってきたことを記事にまとめました!!
作業する環境
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.$ autoconfconfigure スクリプトの生成
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ファイルを作ります。
vimでtest.rbを開いて、RubyでHello Worldを書く
Hello Worldのコードが書けたら./miniruby test.rbで実行

今回ビルドしたRubyで、Hello Worldのプログラムが実行できた!!🎉🎉🎉
Rubyのソースコードをいじってみよう
Rubyのソースコードをいじってみようってことで、まずは
~/workdir/build内のmain.cをvimで開いて、最初のmain関数のところに ```printf("begin\n");``` と書く
書いたら make run (実行) させる、
できた!!
いま何をやったかというと、make runした時にはじめにbeginと出力させてから改行して、RubyのHello Worldのコードを実行させるという処理を書きました!!
main.cファイルの下の行の方にあるruby_sysinit~~~みたいに書いてある方には```printf("end\n");```と書いてみました。
実行結果はこちらです、しっかりendと出力できてます!!
# バージョン表記の修正をしてみよう
実際に Ruby を修正してみます。
ruby -v(もしくは ./miniruby -v)を実行したときに、自分のRubyだとわかるように、何か表示を変えてみます。
1.~/workdir/rubyの中にある、version.cファイルをvimで開きます。
2.ruby_show_version()という関数が怪しいと教材に書いてありましたので、そこに目を向けます。
3.fflush() が、出力を確定する(出力バッファを吐き出す) C の関数なので、この前に何らかの出力をすれば良いとのこと。
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```で結果を確認します。
お!!!yuik-no-Rubyって表示されてる!!
やったー!!!🎉🎉🎉
今回覚えた豆知識的なもの
例えば~/workdir/rubyに今いるとする、それで~/workdirに移動したくなったら```cd ..```とコマンドを打つと
簡単に~/workdirに移動できる!!
こんな感じで```cd build```って打つだけで、簡単に~/workdir/buildに移動できる!!自分はいつも、```cd ~/workdir/build```みたいに全部打ち込んでました...。(この歴史的発見をした感、伝われ..!!)
mvコマンドを覚えました!!
$ mv version.c ../build/でversion.cを~/workdir/Rubyから~/workdir/buildに移動させる。

すごい..~/workdir/buildでlsして確認すると移動できとる..!前に教材で勉強したけど、覚えられてなかったんですよねー、コマンド系って実際必要になってから使う場面が来ると覚えられる気がします((
tabキーの使い方を覚えました!!
例えば~/workdir/rubyのなかのmain.cファイルをvimで編集したいってなったとします、いつもはvim main.cと打っていたのですが、vim mと打ってtabキーを押すと

こんな感じで、最初にmがつくファイルの候補がいくつか出てくる!!これは歴史的大発見だ!!
このような便利なコマンドを、教えていただきました! ありがとうございました!!
今回のまとめ
Rubyをビルドできたことや自分のRubyを作れたことに感動しました。
初歩的なコマンドとかの使い方を知らなかったのですが、詳しく教えていただいて、すごく勉強になりました!
ありがとうございました!!
記事について
https://github.com/ko1/rubyhackchallenge/blob/master/JA/2_mri_structure.md ← こちらの記事を引用させていただいている部分があります。
引用部分と自分の言葉の部分が混ざってしまいました。イベントが終わった後にko1さんに聞きに言ったら、今回はこのままでいいよ、とko1さんに言っていただきましたのでこのまま投稿します。次からは引用する部分と自分の言葉の部分を分けたいと思います。