『Ruby警官から警告を受けろ』環境構築チュートリアル(超初心者向け)

(6/1 環境構築の説明を書き直しました。誤りがありましたら是非ご指摘ください。ここには書かれていないハマリ点とその回避方法の情報も歓迎します。)

はじめに

Ruby警官から警告を受けろ Lv1』 https://codeiq.jp/ace/tbpgr_badge/q883

Ruby警官から警告を受けろ Lv2』 https://codeiq.jp/ace/tbpgr_badge/q884

oO(これ、面白そうなんだけど、なんか準備がいろいろ大変そうだなあ… あまり大変じゃないのならやってみたいんだけど、実際どうなんだろう…)

そんなことを思っている人、多いと思います。私もそうでした。でも、実際は意外と簡単ですよ。特に5月27日に出題者様が32ビット版の環境を用意してくださってからは、私の Celeron M のような廉価な CPU でも、問題なく環境構築できるようになりました。必要なのは、

  • Windows (7 及び Vista で確認済み)
  • 2~3GB の HDD 空き容量
  • 1~2時間ほどの作業時間

といったところです。え、2時間もかかるのかって? ダウンロードするものが全部で 700MB ほどありますので、環境にもよりますが、私のようにネット代をケチって ADSL 接続にしていたりすると、どうしても時間がかかってしまいますね… まあ、作業時間の半分がダウンロード待ち時間、残りも後述の vagrant up というコマンドの待ち時間です。

必要なモノの紹介

とは言っても、やっぱり不安で踏み切れないと思います。私の場合、今思えば、不安を感じていた最大の要因は、必要とされるモノの正体がわからない、というところにありました。そこで、これらのモノの正体を簡単に紹介したいと思います。

まずは、自分で用意する必要のない(自動で準備される)モノです。

Ruby

これはさすがにいいですよね。 Ruby スクリプトを実行するための処理系です。バージョンが指定されていますが、自動で準備されるので、気にしなくて構いません。そもそも、書いたスクリプトは、実行するのではなく、静的解析するだけですので、処理系のことはまったく気にする必要がありません。

rubocop

Ruby スクリプトを静的解析して警告を出してくれるツールのです。この rubocop で警告をわざと多く出すのが、この問題の目的です。 rubocop の出す警告の種類は設定で変更することができ、問題の Lv1 用と Lv2 用とで異なる設定が用意されています。

rspec

書いたスクリプトが 100文字以下という条件を満たすか、 rubocop の警告数がバッジの目標数に届いているか、といったチェックをやってくれるツールです。解答スクリプトを書いて rspec を実行すれば、内部で自動的に rubocop が呼ばれて、どのバッジが取得できるか判定してくれます。なので、環境構築後の作業ルーチンは、解答スクリプトの修正と rspec の実行との繰り返しです。

Ubuntu

「俺 Windows だし…」と、これで腰が引けている人が多いのではないかと思いますが、心配いりません。読み進めていただければわかりますが、すべて Windows 上で実行できます。とは言っても、上記の Ruby, rubocop, rspecUbuntu 上に用意されますので、 Linux のシェル(bash)の知識が多少必要です。 cd とか ls とかの基本コマンドを使えるのに加えて、 vi でスクリプトの書き換えができると作業が格段に捗ります。

そして、以下は自分で用意する必要があるモノです。

VirtualBox

仮想マシンの実行環境です。これで Windows 上で Ubuntu を実行します。上記の rubocop や rspec は、 VirtualBox 上の Ubuntu で実行されることになります。 VirtualBox の入手方法は、後で紹介する出題者様の「環境構築について」に書かれています。

Vagrant

設定通りの VM仮想マシン)を全自動で構築してくれるコマンドラインツールです。この問題では、指定のバージョンの Ruby, rubocop, rspec をセットアップした UbuntuVM をコマンド一発で作ってくれます(ただし数十分かけて)。 Vagrant の入手方法も、出題者様の「環境構築について」に書かれています。

Git (または ZIP 展開ツール

出題者様がこの問題用に用意した各種ファイル(Vagrant の設定ファイルや各レベル用の作業環境)を取得するために Git というツールが必要ですが、なければ zip ファイルをダウンロードして展開するのでも構いません(私はそうしました)。

SSH クライアント

VirtualBox 上で実行されている Ubuntu に接続するために SSH が必要です(Vagrant から呼ばれます)。Git をインストールするとついてくるようですが、私はたまたま Cygwin 使いなので持っていました。

環境構築

さて、環境構築の具体的なやり方ですが、出題者様の「環境構築について」と「環境構築支援ツール」の README.md に素直に従うのが吉です。

「環境構築について」
http://d.hatena.ne.jp/tbpg/20140520/1400595738

「環境構築支援ツール」(GitHub リポジトリ
https://github.com/tbpgr/codeiq_vagrant_for_rubocop

「環境構築について」の「ホストOSにVagrantVirtualBox環境がないが、これから入れようとしている場合」に基づいて、下準備やハマり点などを補足しつつ説明します。ホスト OS としては、とりあえず Windows Vista 32bit 版を仮定しますので、適宜読み替えてください。

SSH クライアントをインストール

「環境構築について」には明示されていませんが、作成した VM に接続するために VagrantSSH クライアントを要求しますので、先に準備しておきましょう。

SSH クライアントは、 Windows ネイティブ版でも Cygwin 版でも構いません。普段 Cygwin を使っている人は、http://www.cygwin.com/ の setup-86.exe で追加するのが最も簡単です。ただし、 VagrantCygwin ターミナル上で実行する必要があります。

どうせならネイティブの SSH がいいという方は、 Git をインストールすれば一緒に付いてくるようです(未確認)。もちろん OpenSSH など SSH 単独で提供されているものを入手しても構いません(未確認)。または  TeraTermPuTTY など GUISSH クライアントでも構いませんが、この場合には後述の vagrant ssh コマンドが利用できないため、自分で VM に接続することになります。

VirtualBox のインストール

https://www.virtualbox.org/wiki/Downloads からインストーラ(100MB程度)をダウンロードできます。 Windows 用は「VirtualBox 4.3.12 for Windows hosts - x86/amd64」一択なので、迷うことはないと思います。ダウンロードしたものを実行すると、ネットワークドライバなどのデバイスドライバWindows にびしばしとインストールされますが、驚かないようにしましょう。

環境変数 PATH に VirtualBox のパスを追加

VirtualBoxVagrant から呼び出されるため、 VirtualBox のパスが環境変数 PATH に含まれている必要がありますが、 VirtualBoxインストーラは PATH の設定をしてくれませんので、自分でやる必要があります。 VirtualBox のパスは、デフォルトのインストール設定では C:\Program Files\Oracle\VirtualBox です。

念のため、環境変数の設定の仕方を説明しておきます。エクスプローラで「コンピュータ」を右クリックして「プロパティ」を選択(または、ショートカット [Win]+[Pause/Break])で「システム」ウィンドウを開きます。その中に「システムの詳細設定」というのがありますのでクリックすると別のウィンドウが開きます。その中の下のほうに「環境変数」というボタンがありますのでクリックします。すると「ユーザの環境変数」「システムの環境変数」という上下2段のボックスが現れますので、下側の「システムの環境変数」のボックスの中から「Path」という項目を選択して、ボックスの下の「編集」ボタンをクリックします。「変数名」「変数値」という項目が表示されますので、「変数値」の文字列の最後に「;」(半角セミコロン)を追加し、その後に VirtualBox のパスを追加してください。このとき、最初から設定されている文字列を誤って消したり書き換えたりしないよう、くれぐれもご注意ください。

Vagrant のインストール

http://www.vagrantup.com/downloads.html からインストーラ(200MB程度)をダウンロードできます。こちらも Windows 用は「WINDOWS Universal (32 and 64-bit)」一択なので、迷うことはないと思います。

支援ファイルの取得

出題者様が用意してくれた、この問題用の支援ファイルを、上記「環境構築支援ツール」(GitHubリポジトリ)から取得します。「支援」と言いつつ、問題挑戦に不可欠なファイルが含まれていますので、 Vagrant を使うつもりのない剛の者も、とりあえず一式取得しましょう。

取得は、 Git でリポジトリを clone する方法と、 ZIP ファイルをダウンロードして展開する方法がありますが、ここでは後者を説明します。「環境構築支援ツール」ページの右端にある「Download ZIP」というボタンをクリックして ZIP ファイルをダウンロードし、適当なフォルダに展開してください。

32bit 版 Ubuntu を利用するための設定

ダウンロードした支援ファイルは、そのままの状態では、 64bit 版 Ubuntu を利用する設定になっていますので、 32bit 版 Ubuntu を利用するように変更します。 Vagrantfile というファイルの

config.vm.box = "precise64"

という行を

config.vm.box = "precise32"

に書き換えればOKのようです(「ようです」というのは、私がやったときには確か書き換えるべき行が2行指定されていたはずで、現状を未確認なので)。

Vagrantfile の書き換えは、やらなくても動く可能性はありますが、やれば確実にハマリ要因が減ります。特に、 Celeron M など一部の廉価 CPU では 64bit 版 UbuntuVM が動かないため、この場合には必須の作業になります。

VM の構築及び起動

コマンドプロンプトCygwinSSH を使う予定の場合には Cygwin ターミナル)を開き、 ZIP を展開したフォルダに移動して、そこで

vagrant up

を実行します。初回実行時には、まず VM が作成されます。このとき、 300MB 程度のファイルのダウンロードに引き続いて、数十分の構築作業が行われますので、気長に待ちましょう。

構築が終わると、引き続いて VM が起動します(2回目以降に VM を起動するときも vagrant up です)。ここで VM が起動せずエラーが表示される場合には、  VirtualBox GUIOracle VM VirtualBox マネージャー)から VM を起動してみましょう。そこで「VT-x is not available. (VERR_VMX_NO_VMX).」と表示される場合には、 64bit 版 Ubuntu が動かない環境でそれを動かそうとしている可能性が大です。こうなってしまった場合には、一旦 vagrant destroyVM を削除し、その後 Vagrantfile を 32bit 用に書き換え、再度 vagrant up しましょう。

VM に接続

上記に引き続き、同じディレクトリで vagrant ssh を実行します(PuTTY 等を利用する場合には、 vagrant ssh で表示されるエラーメッセージに従って、自分で接続します)。

これで問題に挑戦する準備が整いました。

別の方法

このように、 VirtualBox のインストールと Vagrant のインストールと Git の clone さえすれば、あとは vagrant up 一発で必要な環境が全て整うように、出題者様がすべて用意してくださっているのです。しかし、 VirtualBoxVagrant がそれぞれ巨大でディスク容量を食ううえに、 vagrant up の初回の実行は非常に時間がかかります。最初に「2~3GB」「1~2時間」と書いたのは、この辺りの事情のためです。

そこで、ここまでのコストをかけたくないという人は、もっと簡易に環境を構築することも、一応できます。問題を解いてチェックするために絶対に必要なのは rubocop と rspec だけなので、これを Windows に直接インストールしてしまえばいいのです。

それぞれの方法の特徴を比較してみます。

VirtualBox + Vagrant + Ubuntu を利用する方法

利点

  • 適切なバージョンの Ruby, rubocop, rspec が自動で準備される
  • 出題者様の採点環境と同じ環境でローカルチェックができる
  • 環境を汚さなくて済む(特に Windows にインストールされている Ruby のバージョンを変えなくて済む)

欠点

  • ディスク容量を食う
  • セットアップに時間がかかる
  • Linux の知識が多少必要

Windows に直接 Ruby + rubocop + rspec をインストールする方法

利点

  • 比較的素早くセットアップできる
  • Ruby が既にインストールされていれば利用できる

欠点

  • 採点環境と異なるので、事前に正確な結果がわからない
  • Ruby, rubocop, rspec のバージョンが指定のものと異なる場合にも結果に影響しうる

さらに別のやり方として、 Vagrant は使わないけど VirtualBox + Ubuntu は使う、というハイブリッド的な方法もあります。私は、やむを得ずそのやり方にしましたが、 32bit 版 Ubuntu の環境が提供された今となっては、真似しても得はないと思います。詳しく知りたい方は、奮闘記をご覧ください。

奮闘記 http://tails.hatenablog.jp/entry/2014/05/27/034208

おわりに

この問題の締め切りは6月9日です。本稿を公開した時点ではまだまだ日数がありますので、尻込みをしていた方も、是非挑戦してみてください。(追記:締め切られました。このブログエントリは2014年のものです。)

出題者様へ:

いろいろサポートしていただいたのに、奮闘記とか書いてしまって、すみませんでした! 挑戦者増えるといいですね(^^)