Ruby 1.8.7 / Rails 2.3.5 の環境作成とRspec導入

Ruby 1.8.7 / Rails 2.3.5 の環境作成とRspec導入 - 山田備忘録

↑これの続き。今回はRuby1.8.7が入っている前提で、Rails2.3.5/RSpec1.3.1を入れていきます。

$ gem install rake -v 0.8.7
# 入ったらrailsを入れる。
$ gem install rails -v 2.3.5
$ rbenv rehash
$ rails -v
Rails 2.3.5

※古いRailsにはrake0.8.7を入れるといいらしい↓

Rails 2.*系で「rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)」エラー | GENDOSU@NET

必要であればsqliteも入れる。

$ gem install sqlite3-ruby -v 1.2.5

ちなみにバージョン指定しないと、

/usr/bin/gcc -I. -I. -I/home/vagrant/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/x86_64-linux -I. -DHAVE_SQLITE3_INITIALIZE -DHAVE_SQLITE3_BACKUP_INIT -DHAVE_SQLITE3_COLUMN_DATABASE_NAME -DHAVE_SQLITE3_ENABLE_LOAD_EXTENSION -DHAVE_SQLITE3_LOAD_EXTENSION -DHAVE_SQLITE3_OPEN_V2 -DHAVE_SQLITE3_PREPARE_V2 -DHAVE_TYPE_SQLITE3_INT64 -DHAVE_TYPE_SQLITE3_UINT64 -I/home/vagrant/.rbenv/versions/1.8.7-p374/include   -I/home/vagrant/.rbenv/versions/1.8.7-p374/include  -fPIC -g -O2     -c aggregator.c
In file included from ./aggregator.h:4:0,
             from aggregator.c:1:
./sqlite3_ruby.h:15:27: fatal error: ruby/encoding.h: No such file or directory
 #include <ruby/encoding.h>
                       ^
compilation terminated.
make: *** [aggregator.o] Error 1

とか言って激しく怒られる。

ここまででプロジェクトを新規作成できる。

$ rails sample_prj
# rails new sample_prjではない✗

/home/vagrant/.rbenv/versions/1.8.7-p374/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:55: uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)

とか言って怒られるときは、

$ gem update --system 1.5.3

してみる。 ある程度新しいRubygemsとある程度古いRailsではこういう怒られ方をするらしい。 Railsの方を上げるのが本来だと思うけども、今回は古いRails環境を作るのが目的なので、Rubygemsの方を下げちゃう。 詳しくは

ruby on rails - Uninitialized constant ActiveSupport::Dependencies::Mutex (NameError) - Stack Overflow

プロジェクトのディレクトリに移動して、rspecプラグインをインストール&準備。

$ script/plugin install git://github.com/dchelimsky/rspec.git -r 'refs/tags/1.2.9'
$ script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 'refs/tags/1.2.9'
$ script/generate rspec

これで使用できました。

ところで、このバージョンのRSpecは↓みたいな古風な書き方をしないといけない。 間違ってもexpect(~~)みたいな今風な書き方をしてはいけない。

describe User do
  before(:each) do
    @invalid_attributes = {}
    @valid_attributes = {:name => 'hoge'}
  end

  it "should create a new instance given valid attributes" do
    User.create!(@valid_attributes)
  end

  it "should be invalid without name" do
    User.new(@invalid_attributes).valid?.should be false
  end
end

古いものを動かすには古いもので揃えてあげないといけないんだなーと思いました(低レベルな感想)。

Ruby 1.8.7 / Rails 2.3.5 の環境作成とRspec導入

大人の事情で超レトロな環境が必要になったのでメモ。 大した内容ではないんですが、あまりに古くてドキュメントも情報も欠乏気味だったので。

導入したいもの Ruby 1.8.7 Ruby on Rails 2.3.5 RSpec 1.3.1 およそ令和時代とは思えないラインナップをお楽しみ下さい。

途中までは最新だろうが何だろうが同じなので、ココらの記事を参考に進めます。

qiita.com

とりあえず既存のRubyが無いことを確認。

[vagrant@localhost ~]$ ruby -v
-bash: ruby: command not found

gitをインストール

[vagrant@localhost ~]$ sudo yum install git
[vagrant@localhost ~]$ git --version
git version 1.8.3.1

rbenvとruby-installをインストール

[vagrant@localhost ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
[vagrant@localhost ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
[vagrant@localhost ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[vagrant@localhost ~]$ source ~/.bash_profile
[vagrant@localhost ~]$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
[vagrant@localhost ~]$ rbenv -v
rbenv 1.1.2-2-g4e92322

↑ここまで最新と同じ手順です。

ここで、使用できるバージョンを確認します。

[vagrant@localhost ~]$ rbenv install -l
・・・
1.8.7-preview1
1.8.7-preview2
1.8.7-preview3
1.8.7-preview4
1.8.7
1.8.7-p17
1.8.7-p22
1.8.7-p71
1.8.7-p72
1.8.7-p160
1.8.7-p173
1.8.7-p174
1.8.7-p248
1.8.7-p249
1.8.7-p299
1.8.7-p301
1.8.7-p302
1.8.7-p330
1.8.7-p334
1.8.7-p352
1.8.7-p357
1.8.7-p358
1.8.7-p370
1.8.7-p371
1.8.7-p373
1.8.7-p374
1.8.7-p375
・・・

とお目当ての1.8.7でも大量に出てきてしまいます。 今回は勿論商用環境に導入するわけではないので、パッチレベルなんて気にせず、とりあえずベースのを・・・ということで、'1.8.7'を選択したいところですが・・・

[vagrant@localhost ~]$ rbenv install 1.8.7
Downloading ruby-1.8.7.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.bz2
・・・(中略)・・・
math.c:37:13: error: missing binary operator before token "("
 #elif define(ERANGE)
             ^
make: *** [math.o] Error 1

などと表示されて、うまくいきません。

このエラーは、p374で解消されているらしい(https://makandracards.com/makandra/53455-fix-for-ruby-1-8-7-installation-error)ので、おとなしくp374を導入することにする。 ※ちなみにこのパッチはSSL関係の重要なアップデートも入ってるらしく、どちらにしろp374以上がオススメのよう。

[vagrant@localhost ~]$ rbenv install 1.8.7-p374
Downloading ruby-1.8.7-p374.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.bz2
ossl_pkey_ec.c:815:29: error: ‘EC_GROUP_new_curve_GF2m’ undeclared (first use in this function)
                 new_curve = EC_GROUP_new_curve_GF2m;
                             ^
ossl_pkey_ec.c:815:29: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [ossl_pkey_ec.o] Error 1
make[1]: Leaving directory `/tmp/ruby-build.20190527132249.10087/ruby-1.8.7-p374/ext/openssl'
make: *** [all] Error 1

今度はまた別の場所でエラー。 何分パッチがないとうまく行かないらしいので、パッチを適用します。 参考→https://qiita.com/kakipo/items/482b32b0c2ec0f9d113c

[vagrant@localhost ~]$ vi patch.diff
# リンク先にあるファイルをコピペして作る。
[vagrant@localhost ~]$ cat patch.diff | filterdiff -x ChangeLog -x test/openssl/test_pkey_ec.rb | rbenv install --patch 1.8.7-p374
# patchコマンドが無いと叱られたら↓やってから再度実行すればOK。
[vagrant@localhost ~]$ sudo yum install patchutils patch
[vagrant@localhost ~]$ rbenv rehash
[vagrant@localhost ~]$ rbenv global 1.8.7-p374
[vagrant@localhost ~]$ ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]

やっとこさRubyがインストールされる。

長くなったのでRails/RSpecのインストールは記事を分けます。

Subversion(svn)で外部参照ファイルを含む差分を表示する。(2)

これで。

 

svn di -r head

svn pg -vR svn:externals | grep ^"\s\s\s\s" | awk '{print $1}' | xargs svn di -r head

 

前の記事とタイトルを合わせるために2行になってしまいました。

1行目はよくあるHEADリビジョンとの差分一覧、2行目が、「外部参照ファイルのみの」HEADリビジョンとの差分一覧ということになります。

 

前の記事では、-r headをつければHEADリビジョンとの差分を取得できて便利!と書いたのですが、これには致命的な問題がありました。

というのも、前記事のコマンドはsvn stでMフラグ(もしくはAフラグ)が立っているファイルにdiを取るものでした。

そのため、ローカルで編集がないファイル(=BASEリビジョンから差分がないファイル)は、HEADリビジョンとの差分があっても表示されないという欠点があります。

 

今回は、どうしてもHEADとの差分を取りたいので、とりあえず1行で収めることを諦めて、せめて外部参照は外部参照でひとまとめにして差分を取れる、というところで妥協した結果です。

見ての通りgrepで無理やり必要な行を絞り込んでいるので、svnのバージョンやexternalsの書き方によっては動作しないかもしれません。

(当方環境はsvn1.9.7で確認しています。)

 

使用したい環境で`svn pg -vR svn:externals`を出力して、必要に応じてgrepの絞り込みを調整してみるとイイかもしれません。

 

外部参照が手に負えない程貼られているっていうのは、そもそもリポジトリ構成がおかしいんじゃないか?という気もするんですけども(ぼやき)。

Subversion(svn)で外部参照ファイルを含む差分を表示する。

これで。

 

svn st -q | grep '^[AM]' | cut -c9- | xargs svn diff

version control - svn diff doesn't show modified external files - Stack Overflow


外部参照を多く含むリポジトリからチェックアウトして、どのディレクトリが外部参照なのかも怪しいまま編集し、いざコミットする段になって差分チェックができずに困った場合のために。

 

リンク元でも一部説明がありますが、svnの外部参照ファイルをローカルでいじった場合、`svn di(ff)`では表示されてくれませんし、`svn ci`でもコミットされません。
こうした外部参照ファイルの差分の表示やコミットは、`svn di FILEPATH`や`svn ci FILEPATH`と明示的にファイルパスを明示してあげないとできないみたいです。

一方で、`svn st(atus)`を使用すると、実ファイルでも外部参照でも関係なく編集済(M)フラグが立ちます。
これを使用して編集したファイルを特定し、それぞれのファイルを`svn di FILEPATH`で指定してあげているのが上記のコマンドです。

上記コードの一番最後の`svn diff`はよくある`svn diff -r head`(ヘッドリビジョンとの差分表示)とかに変更して使用することもできますし、なかなか使い勝手もよさそう。

外部参照を多く含むソースをいじるときに便利そうです。



そもそも外部参照を手元でぐちゃぐちゃイジるのはいかがなものなのだろうか??(疑問)

[20181202追記]
この方法で-r headをつけると、HEADとの差分があっても、BASEとの差分がない場合に表示されない問題点があります(BASEとの差分があれば、正しくHEADとの差分が出力されますが)。
この問題を回避するためには、

Subversion(svn)で外部参照ファイルを含む差分を表示する。(2) - 山田備忘録

こっちを使ってみてください。

ChromeDriverを使ってJavaScriptのテストをしようとしたらハマったよ

せっかくなので備忘録的に書いておきます。

 

ちょっと時間があったのでRSpectを真面目に勉強しようと、「Everyday Rails - RSpec による Rails テスト入門」とかいうのを買って、いそいそと進めておりました。

 

leanpub.com

基本ができてないままその都度調べてやっちゃうと、どんどん自己流に走ってしまっちゃうので、ちょっと本腰を入れて基本からやってみようということで。

 

サンプルコードもGitHubから落とせるし、少しずつ順を追って説明してくれるので、RailTutorialを一巡した程度の知識でも、難なく読める内容で、いい感じでした、6章でハマるまでは。

 

6章途中では、

Capybara/Selenium-webdriver/Chrome-driverを用いて、Javascriptのスペックを記述するのですが、本のコードをそのまま写経しても・・・

 

Capybara::DriverNotFoundError:
no driver called :selenium_chrome was found, available drivers: :rack_test, :selenium

 

と怒られて一向にテストしてくれません。対応はというと。

 

①そもそもChromeが入っていない。

明らかにDriverが無いよ感満載なので、ちょっと考えてみたところ、根っからのFireFox教の俺のPCにChromeなんていう異教徒がいるわけがない、ということに気づきました。

こんなところで宗教戦争をしてても仕方がないので、

CentOS7でselenium、Chrome Web Driveのインストール方法 - Qiita

こんな感じの記事(一番上のパラグラフです)を見つつ、インストール。

ま、こんなドジっ子はそうそういませんってか。

 

②なんかドライバが登録されてない。

①をやっても結局上手くいかないのでよくよくエラーメッセージを読んでみると、’selenium_chrome’なんてもの知らない、的なオーラが漂ってます。

ドライバを追加するには、/spec/support/capybara.rbに、

Capybara.register_driver :selenium_chrome do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

を入れてあげることで、ちゃんと認識してくれるみたいです。

↓こっからパチってきました。

GitHub - willnet/capybara-readme-ja: Capybara の README 和訳

 

GUI出力の設定をする。

①②をやったところ、今度は、

Selenium::WebDriver::Error::UnknownError:
unknown error: Chrome failed to start: exited abnormally
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
(Driver info: chromedriver=2.43.600233 (523efee95e3d68b8719b3a1c83051aa63aa6b10d),platform=Linux 3.10.0-229.el7.x86_64 x86_64)

といって怒られてしまいました。

よく考えると、今回はVagrant仮想マシン上で作業してたので、GUIに接続するときにうまくいかないみたいです(適当)。

ここで、一旦ホストに戻って、Vagrantfileに、

config.ssh.forward_x11 = true

とかいう呪文を下の方にでも書いておいてあげると、なぜかいけるみたいです。

 

上記①〜③でなんとかイイ感じにテストが終わりました。

時間があるときにでももう少し調べてみたいです。

 

お役に立てれば幸いです。

Ruby認定資格試験silver合格記録

(※この記事は記事は8月頃に投稿したと思ってたら操作を誤って

下書き保存されてた分です。)

 

別に大したことではないんですが、よくこういった記事を見かけるので、自分でも書いてみようということで。

 

前職で引き継ぎ期間中に、若干人員過剰気味だったこともあって、資格の取得を決意しました。

スケジュールとしては、

5月頃・・・試験予約&書籍購入

6月頃・・・書籍流し読み&概要掴み

7月~・・・真面目に暗記&不明点の見直し

最終3日・・・問題形式で確認

7月20日・・・試験

といった、相当余裕を持ちつつ、ダラけたスケジュール感でした。

 

購入したのはこの本。ブックオフにあまり状態のよくない中古本が1000円くらいでおいてあったので、即買いしました。

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応 (EXPERT EXPASS)

 

 

かなりダラけながらの勉強でしたが、88点という可もなく不可もなくな点数で合格することができました。

 

やってみて感じたことは、暗記の多さです。

「調べりゃ出てくるような知識の詰め込みに意味があるのか?」という疑問もなくはなかったのですが、基礎的な部分ばかりなので、いちいち調べる手間が省けてコーディングが早くなると考えれば、悪くない方法なのかもしれません(特にRubyでは開発スピードの早さも強みのようなので)。

 

折角なので、試験対策的に重要な部分を列挙してみました(これを参考にして落ちても責任はとりませんが)。

 

・公式教科書の2~5章を理解、教科書に乗ってるメソッドは暗記するくらいの勢いで。

・文字列、配列、ハッシュの問題が非常に多い、ここら辺は各メソッドを含めて全力で詰め込む。

・破壊的か非破壊的かは重要、silverの問題範囲で「!の付かない破壊的メソッド」はそう多くないので、確実に暗記。

・同じ働きをするメソッドがしばしば問われる(map/collect, find/detect,find_all/selectなど)。

・ローカル変数のスコープが以外とややこしいので注意。

・ファイルオープン時のオプション(r/w/a)は頻出の模様。

 

見知らぬ先輩方のブログとかその他サイトとかも拝見させていただいてたので、ご参考までに。

Ruby技術者認定試験Silver version 2.1 必勝合格法

・全般的に参考にさせていただきました。

Rubyにおけるローカル変数のスコープ規則 - m-kawato@hatena_diary

・変数のスコープ回りの理解に。

Ruby「!」以外の破壊的メソッド一覧まとめ | WEB-TENNA

・単純な暗記ですが、こんな所で点数落としたらもったいないです。

library _builtin (Ruby 1.8.7)

・組み込みライブラリのリファレンス。公式教科書では、メソッドの引数や省略した場合の動作などはほとんど書かれていないので、問題とかで疑問点があればリファレンスを確認した方がよいです。

 

試験時間の詳細などはサイトなどで確認していただければと思いますが、時間は相当余ると思います(自分の時は全問2週+見直ししても余裕で余りました)。

あと、試験結果は直ぐに出るみたいで、試験室から出ると受付のオバサンが紙を渡してくれました。

 

受験料が若干高いのがネックですが、これからRubyを始める方には丁度良いレベル・分量かなーといった感じでした。

 

SEになると決めてから。

初めての投稿です。

基本的には備忘録的に使っていこうと思っております。

腐っても上場企業を名乗っていた前の会社を辞め、社員数およそ50人のとあるIT会社に転職を決めて2ヶ月。

確かに前職は福利厚生もそれなりにあって、待遇も悪くない、安定した生活を約束されていました。
それらをかなぐり捨てでも、自分の生きたい道を選ぶのは、臆病な自分には相当なハードルではありました。

自分の力で生きたい、その一心で、覚悟を決めました。

辛いこともあると思う、やめたいと思うこともあると思う。
それでも、自分で決めた道を自分で歩いていかなければいけない。
むしろ、それをするために、新しい世界に飛び込んだはずだったから。

~~~~~~~~~~~~~

一昨日、初出社でした。

まず上司に言われたのは、「居場所の確保」。
コミュ力皆無の自分にとっては、相当な難題と見えます。

「職場 居場所 確保 転職」と、安直なキーワードで先生に尋ねてみると、思った通り、たくさんのサイトが引っかかってきます。

会社に自分の居場所を作るための方法!出世にも年収にも影響する - 転職のコツhttp://tenshoku.pattei.com/ibasho-tenshoku/

上のサイトの中では、「グループに属する」ことも居場所確保の一手段であるらしい。

幸か不幸か、我が社においても社内イベント的な物を企画するグループがあるらしく、新入社員は強制的に参加させられるようです。

個人的には、あんまりそういうの、得意じゃないし、っていうか苦手だし、可能な限り避けて生きてきてる節があるんですが。

イベント企画→グループ所属→居場所の確保→仕事が進めやすい!!

という図式で見れば、そう悪いことではないのかもしれません。

技術でモノを言わせれば、それはSEとしての本望なんでしょうけど、何たって、未経験入社の自分がベテランのオジサンたちに勝てるわけがない(今は)。

まずは、「居場所の確保」と「技術の勉強」の両輪で進めていこうと、何となく思案しております。

書き始めて思いましたけど、人様のブログのリンクとか貼っていくと、簡単でしかも備忘録としても役立ちそう。

「リンクを貼るときは管理人にメール!!」とかいう「ネチケット」って、流石にもう廃れてますよね??

万が一マズいことあったら、連絡ください、すぐ消しますんで。

明日も頑張ります。