まさ@ブログ書き込み中

まさ@ブログ書き込み中

まさの旅、英語、プログラミング、プライベートについて、色々記録しています。

【謝罪】後輩にドヤ顔でRubyについて教えようと思っていたらGemとかBundlerとかHomebrewとか全く自分で説明できなかったからしっかり違いを説明する

 

みなさんこんばんは。

 

今日は慎重に言葉を選びながら、誠意をもってこの記事を書いていきたいと思っています。

 

今回書く内容は、皆さんも既にご存知の、あの件についてです。

僕がプログラマーとしても年齢としても後輩にあたる福地くんに先輩風を吹かせてRubyについて教えようとしていたら、早速答えられなかったあの件についてです。

ええ、ええ。

 

僕がSinatraをつかってLINEを作ったという件に関して記事を書こうと思っていましたが、この件が最優先だと判断しました。

 

では何が起こったのかを、僕の内面も赤裸々に書き記しながら時系列に沿ってお話させていただきます。

 

 

頼れる先輩でありたい

僕は周りの人に支えられてここまでやってきました。

 

お金もない、知識もない、経験もない僕は数々の先輩たちに助けられてここまで成長できました。

 

プログラミング学習においても素晴らしい記事を書いてくださった坂内さん、コーチのさぼさん、先輩の樹里さんがいます。

 

そのような人になりたいと思うことは自然なことだと思います。

 

まずそのことをわかっていただきたいです。

 

 

直属の後輩である福地を助けてあげたい

そんな中、僕にもプログラミングに関する後輩ができました。

 

僕が完全なる初心者(Complete Beginner略してCB)であることは認めますが、福地くんはそんな僕よりもプログラミングにおける経験が浅く、究極の初心者(Ultimate Beginner略してUB)なのです。

 

ましてや彼が少し開発に迷っていたらぜひ何か手伝えることはしてあげたいと思うのは、自然の道理だと思います。

 

そうして僕は福地の開発の進捗について聞きながら僕がわかる点についてはアドバイスしようとイオンモールライカムに行ったのでした。

 

 

福地の「GemとBundlerとHomebrewとrbenvの違いを教えてください」に戦慄が走る

スターバックスでアイスティーを買い、落ち着いたところで僕は「どうしたどうした、なんでも教えてあげよう」と先輩風を吹かせながら「どうしたの?と聞いてみました。

 

すると

 

福地:「実は、初歩的なことでわっていないことが多くて困っているんです。例えばGemとかBundlerとかHomebrewとかrbenvとかの違いとかも全然で」

 

まさ:(絶句)

 

そう、僕も具体的にはわかっていなかったのです。あの便利なライブラリ?拡張機能的なやつだとは思っていましたが・・・。

 

頭の中ではわからないことをはぐらかす方法を考えていました。「へえ、ふんふん、へえそうなんだー、あーむずかしいよね、わかるわぁー、わかるわぁー。でもまずは自分で調べることが大切だと思うよ」的なアレです。

 

まあでも実際は正直に

 

まさ:「俺もわからん、記事にするわ」

 

と福地に言って人知れず涙をのんだのでした。

 

 

前置き長くなったけど本題に入る

前置き長いなと思った皆さん、安心してください。僕もそう思っていたところです。

 

というわけで、GemとかBundlerとかHomebrewとかrbenvの違いについて書いていきたいと思います。

 

端的にいうと、

 

  • rbenvはRubyのバージョンを切り替えてくれるやつ
  • GemはRubyで使われるライブラリで、RubyGemsはGemを管理するツール
  • Bundler はRubyのライブラリ管理ツールで、Gemを一気にインストールし、バージョンも揃えてくれる
  • HomebrewとはMac OS X上で様々なソフトウェアの導入を単純化するパッケージ管理システムのひとつ

 

小難しい用語が出てきている上になんだか同じこと言っているように見えるので、もう少し具体的に説明していきます。

 

用語:ライブラリとパッケージ

パッと調べた限り良さそうな説明が見つからなかったので、一応このように定義(というか僕が理解)しておきます。

 

ライブラリとは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。

 

Rubyで言うとclassやmethodを定義したものというべきでしょうか?

 

パッケージとは、実行ファイルや設定ファイル、ライブラリetcを一つのファイルとしてまとめているもの。

 

ということだそうな。

では、上に箇条書きにした項目一つ一つを詳しくみていきたいと思います。

 

rbenvとは単機能なコマンドラインツール

コマンドラインツールとはGUIに対するCUI(キャラクターユーザーインターフェース)のことですが、rbenvを使ってRubyのバージョン切り替えができます。

 

僕ら(プログラマーの皆さん)はTerminalまたはiTermなどで文字を打って自分のPCを利用すると思いますが、rbenvをインストールしておけば

 

rbenv hoge

 

のように打って何かをインストールしたりチェックしたり出来ると思います。それこそがrbenvの便利なところだというわけですね。

 

rvm(Ruby Version Manager)というコマンドツールもありますが、rvmは

rbenvとは違ってRubyのインストールやアンインストールも行うことができます。

 

言い換えると、rbenvはRubyのインストール機能はついていません。rbenvでRubyを簡単にインストールする場合はruby-buildが必要になります。

 

rbenvは単機能でプラグイン等を入れることによって機能を追加できます。そのため、rbenv本体はrvmよりも軽量でコンパクトだそうな。

 

GemはRubyで使われるライブラリやアプリケーションの形式のこと

GemはRubyで使われるライブラリやアプリケーションのことで、Gemを個別インストールする際には

 

gem install hoge

 

と書くと思いますが、これはRubyGemsというパッケージ管理ツールを使っているみたいです。

ちなみに、僕はこれをインストールした覚えがなかったのですが、どうやらRuby1.9より新しいバージョンのRuby本体をインストールすると標準で付いてくるそうです。

 

また、Gemfileというものを作って自分が使うGemを明記しておくことがあります。そのメリットは参照元のサイトによると

 

  1. アプリの動作に必要なパッケージが明示的になる
  2. このファイルさえ再配布してしまえば、他の環境でも一度にインストールすることができる(バージョンも含めて同じものを)
  3. 同じパッケージでもバージョンの違いを区別して管理することができる

の三点だと認識しています。

 

の三点が挙げられるそうです。

また、Gemfileの一番上にはこのように

source "https://rubygems.org"

と書いていますが、それはまさにあのRubyGemsのことだったのですね。

 

Gemfileに書かれている内容を一気にインストールしてくれるのがBundler

上の小見出しに書かれている通りです(笑)

 

しかし、Bundlerといえばまだ理解出来ていない点は、僕(まさ)のLINEならぬMINEのプログラムにもさぼさんが「これでおk」と書いてくれた

require "bundler"
Bundler.require

の点でしょうか。

 

さぼさんの説明では「これでGemfileに書いてあるGem全てを読み込んでくれる」そうですが、例えばHerokuなどのPaaS側(?)もこれを理解してくれるのでしょうか・・・?

 

これについては疑問が解消され次第記事を書きます。

 

HomebrewはRuby以外のたくさんのソフトウェアの導入を助けてくれる便利なシステム

rbenvもGemもBundlerも全部Rubyの話だったので当初は僕もHomebrewはRubyに関係するものかな、と思っていましたが全く違った(笑)

 

ちなみに僕はHomebrewを使って以下のソフトウェアをインストールしてるみたいです。

f:id:masaincebu:20170526013435p:plain

 

あっ、rbenvやruby-buildもありますね。mysqlpostgresqlやgitはこちらからインストールしたのかもしれませんね(アホみたいにテキトーにコマンド叩いているので重複して別の方法でインストールしていることもある)。

 

 

感想

眠いけど有意義なまとめ記事が書けたと思います。

 

福地よ、こういうことらしいぞ。これでわかった?

 

あ、何か間違っていたら指摘の方よろしくお願いします。 

 

 

参考サイト

rbenvやrvmについて

「Rubyを始めよう!・・・・rbenv? gem? rvm?」 - Qiita

 

GemとBundlerについて特にわかりやすい

頭が弱すぎてruby + rbenv + gem + bundle + (+rails)の仕組みが理解できない・・・ | KentaKomai Blog

 

Bundlerについてもっと知りたいなら

あらためてBundlerに関して理解する - Qiita

 

Homebrewについて

homebrewとは何者か。仕組みについて調べてみた - Qiita