1. yono@github

    Posted

    yono@github
Changes in title
+Ubuntu 16.04 に Ruby 1.8.5 をインストールする
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,341 @@
+年末なので Ubuntu 16.04 に Ruby 1.8.5 をインストールして動かしてみます。
+
+## 必要なライブラリをインストールする
+
+Ruby 1.8.5 をビルドするにあたって必要となるライブラリをインストールします。
+ここで一つ問題になるのが、OpenSSL0.9.8を要求される点です。
+OpenSSL1.0系ではビルドに失敗します。
+
+OpenSSL0.9.8をインストールするために古いリポジトリを使います。
+
+ $ echo 'deb http://old-releases.ubuntu.com/ubuntu lucid-security main' | sudo tee /etc/apt/sources.list.d/lucid-security.list
+ $ sudo apt-get update
+
+準備ができたのでインストールします。
+
+ $ sudo apt-get install zlib1g-dev
+ $ sudo apt-get install -t lucid-security libssl-dev
+
+その他必要となるライブラリをインストールします。
+
+ $ sudo apt-get install build-essential libyaml-dev libxml2-dev libxslt1-dev libreadline-dev
+
+## ruby-build をインストールする
+
+この辺は公式のドキュメントそのままです。
+https://github.com/rbenv/ruby-build#installing-as-a-standalone-program-advanced
+
+ $ git clone https://github.com/rbenv/ruby-build.git
+ $ cd ruby-build
+ $ sudo ./install.sh
+
+## Ruby 1.8.5 をインストールする
+
+さて ruby-build には ruby 1.8.5 の definition がいくつか用意されていますが、これはそのままでは使えません。
+※ わかってるなら Pull-Request しろという話ですがすいませんとりあえずそのまま進みます。
+
+以下は Ruby 1.8.5-p231 をインストールした際のログです。
+
+```
+$ ruby-build 1.8.5-p231 ~/ruby-1.8.5
+Downloading ruby-1.8.5-p231.tar.bz2...
+-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
+Installing ruby-1.8.5-p231...
+
+WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
+It no longer receives bug fixes or critical security updates.
+
+Installed ruby-1.8.5-p231 to /home/yono/ruby-1.8.5
+
+Downloading rubygems-1.3.7.tgz...
+-> https://dqw8nmjcqpjn7.cloudfront.net/388b90ae6273f655507b10c8ba6bee9ea72e7d49c3e610025531cb8c3ba67c9d
+Installing rubygems-1.3.7...
+
+BUILD FAILED (Ubuntu 16.04 using ruby-build 20160913)
+
+Inspect or clean up the working tree at /tmp/ruby-build.20161104233606.31970
+Results logged to /tmp/ruby-build.20161104233606.31970.log
+
+Last 10 log lines:
+Last-Modified: Fri, 23 May 2014 08:48:13 GMT
+ETag: "e85cfadd025ff6ab689375adbf344bbe"
+Accept-Ranges: bytes
+Server: AmazonS3
+X-Cache: Miss from cloudfront
+Via: 1.1 96275b125ac8a1ca0365ff6f864de90c.cloudfront.net (CloudFront)
+X-Amz-Cf-Id: vCBUe9FY2sEYl9REEnO8B3qa17peFB7nYlqidlOnoNr37jn7rCdMHQ==
+
+/tmp/ruby-build.20161104233606.31970/rubygems-1.3.7 /tmp/ruby-build.20161104233606.31970 ~
+ERROR: Expected Ruby version >= 1.8.6, is 1.8.5.231
+```
+
+rubygems のインストールに失敗しています。何故かと言うと、インストールしようとしている rubygems 1.3.7 が Ruby 1.8.6 以上を要求しているからです。
+
+https://github.com/rubygems/rubygems/blob/v1.3.7/lib/rubygems/commands/setup_command.rb#L59-L64
+
+```ruby
+ required_version = Gem::Requirement.new '>= 1.8.6'
+
+ unless required_version.satisfied_by? Gem.ruby_version then
+ alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
+ terminate_interaction 1
+ end
+```
+
+rubygems 1.3.7 未満で Ruby 1.8.6 以上を要求しないバージョンを探してみると、rubygems 1.3.5 が該当しました。
+ruby-build には Custom Definition という仕組みがあるのでそれを使って rubygems 1.3.5 をインストールするように変更してみましょう。
+https://github.com/rbenv/ruby-build#custom-definitions
+
+叩き台となる Ruby 1.8.5-p231 の definition を手元にコピーします。
+
+ $ cp ruby-build/share/ruby-build/1.8.5-p231 .
+
+中身は以下のようになっています。
+
+ $ cat 1.8.5-p231
+ require_gcc
+ install_package "ruby-1.8.5-p231" "https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2#b31a8db0a3b538c28bca1c9b08a07eb55a39547fdaad00c045f073851019639c" warn_eol auto_tcltk standard
+ install_package "rubygems-1.3.7" "https://rubygems.org/rubygems/rubygems-1.3.7.tgz#388b90ae6273f655507b10c8ba6bee9ea72e7d49c3e610025531cb8c3ba67c9d" ruby
+
+なんとなく3行目の `rubygems-1.3.7` を `rubygems-1.3.5` に変えるとよさそうです。末尾にハッシュ値が付いてるのでそれも記載する必要があります。
+
+ $ wget https://rubygems.org/rubygems/rubygems-1.3.5.tgz
+ $ sha256sum rubygems-1.3.5.tgz
+ c0928cc1ae54dedfb5f57ad3829882c1f90e42bc17bf50491aa6f93a937546ac rubygems-1.3.5.tgz
+
+これを元にして `1.8.5-p231` を修正します。
+
+ $ cat 1.8.5-p231
+ require_gcc
+ install_package "ruby-1.8.5-p231" "https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2#b31a8db0a3b538c28bca1c9b08a07eb55a39547fdaad00c045f073851019639c" warn_eol auto_tcltk standard
+ install_package "rubygems-1.3.5" "https://rubygems.org/rubygems/rubygems-1.3.5.tgz#c0928cc1ae54dedfb5f57ad3829882c1f90e42bc17bf50491aa6f93a937546ac" ruby
+
+修正した `1.8.5-p231` を使って Ruby 1.8.5 をインストールします。 `ruby-build` の引数にファイルを指定すると、そのファイルの記述を元にしてインストールが進みます。
+
+ $ ruby-build ./1.8.5-p231 ~/ruby-1.8.5
+
+ですがこのままだとエラーが出ます。
+
+```
+Downloading ruby-1.8.5-p231.tar.bz2...
+-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
+Installing ruby-1.8.5-p231...
+
+WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
+It no longer receives bug fixes or critical security updates.
+
+
+BUILD FAILED (Ubuntu 16.04 using ruby-build 20160913)
+
+Inspect or clean up the working tree at /tmp/ruby-build.20161115225857.13675
+Results logged to /tmp/ruby-build.20161115225857.13675.log
+
+Last 10 log lines:
+ from ossl.h:45,
+ from ossl_cipher.c:11:
+/usr/include/openssl/bn.h:412:5: note: previous declaration of ‘BN_pseudo_rand_range’ was here
+ int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
+ ^
+Makefile:176: ターゲット 'ossl_cipher.o' のレシピで失敗しました
+make[1]: *** [ossl_cipher.o] エラー 1
+make[1]: ディレクトリ '/tmp/ruby-build.20161115225857.13675/ruby-1.8.5-p231/ext/openssl' から出ます
+Makefile:241: ターゲット 'all' のレシピで失敗しました
+make: *** [all] エラー 1
+```
+
+半ば強引ですが openssl のヘッダファイルに手を加えます。
+`/usr/include/openssl/bn.h` の411行目と412行目をコメントアウトします。
+
+```
+$ diff /usr/include/openssl/bn.h ./bn.h
+411,412c411,412
+< int BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
+< int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
+---
+> //int BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
+> //int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
+```
+
+これでビルドが通るようになりました。
+
+```
+$ ruby-build ./1.8.5-p231 ~/ruby-1.8.5
+Downloading ruby-1.8.5-p231.tar.bz2...
+-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
+Installing ruby-1.8.5-p231...
+
+WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
+It no longer receives bug fixes or critical security updates.
+
+Installed ruby-1.8.5-p231 to /home/yono/ruby-1.8.5
+
+Downloading rubygems-1.3.5.tgz...
+-> https://rubygems.org/rubygems/rubygems-1.3.5.tgz
+Installing rubygems-1.3.5...
+Installed rubygems-1.3.5 to /home/yono/ruby-1.8.5
+```
+
+試しに動かしてみます。
+
+```
+$ ./ruby-1.8.5/bin/ruby -v
+ruby 1.8.5 (2008-06-20 patchlevel 231) [x86_64-linux]
+```
+
+はい。
+
+```
+$ ./ruby-1.8.5/bin/irb
+irb(main):001:0> newstyle_hash = {key: 'value'}
+SyntaxError: compile error
+(irb):1: odd number list for Hash
+newstyle_hash = {key: 'value'}
+ ^
+(irb):1: syntax error, unexpected ':', expecting '}'
+newstyle_hash = {key: 'value'}
+ ^
+(irb):1: syntax error, unexpected '}', expecting $end
+ from (irb):1
+ from :0
+```
+
+そうですね。
+
+```
+irb(main):002:0> oldstyle_hash = {:key => 'value'}
+=> {:key=>"value"}
+```
+
+よっしゃ。
+
+```
+$ ./ruby-1.8.5/bin/gem source --list
+*** CURRENT SOURCES ***
+
+http://gems.rubyforge.org/
+```
+
+アッ。
+
+```
+$ ./ruby-1.8.5/bin/gem source --add https://rubygems.org/
+https://rubygems.org/ added to sources
+$ ./ruby-1.8.5/bin/gem source --remove http://gems.rubyforge.org/
+http://gems.rubyforge.org/ removed from sources
+```
+
+ハイ。
+
+```
+$ ./ruby-1.8.5/bin/gem install -r rake -v 0.8.0
+Successfully installed rake-0.8.0
+1 gem installed
+Installing ri documentation for rake-0.8.0...
+Installing RDoc documentation for rake-0.8.0...
+
+$ ./ruby-1.8.5/bin/gem install -r rails -v 1.2.6
+Successfully installed activesupport-1.4.4
+Successfully installed activerecord-1.15.6
+Successfully installed actionpack-1.13.6
+Successfully installed actionmailer-1.3.6
+Successfully installed actionwebservice-1.2.6
+Successfully installed rails-1.2.6
+6 gems installed
+Installing ri documentation for activesupport-1.4.4...
+Installing ri documentation for activerecord-1.15.6...
+Installing ri documentation for actionpack-1.13.6...
+Installing ri documentation for actionmailer-1.3.6...
+Installing ri documentation for actionwebservice-1.2.6...
+Installing ri documentation for rails-1.2.6...
+Installing RDoc documentation for activesupport-1.4.4...
+Installing RDoc documentation for activerecord-1.15.6...
+Installing RDoc documentation for actionpack-1.13.6...
+Installing RDoc documentation for actionmailer-1.3.6...
+Installing RDoc documentation for actionwebservice-1.2.6...
+Installing RDoc documentation for rails-1.2.6...
+```
+
+こうして。
+
+```
+$ ./ruby-1.8.5/bin/rails blog
+ create
+ create app/controllers
+ create app/helpers
+ create app/models
+ create app/views/layouts
+ create config/environments
+ create components
+ create db
+ create doc
+ create lib
+ create lib/tasks
+ create log
+ create public/images
+ create public/javascripts
+ create public/stylesheets
+ create script/performance
+ create script/process
+ create test/fixtures
+ create test/functional
+ create test/integration
+ create test/mocks/development
+ create test/mocks/test
+ create test/unit
+ create vendor
+ create vendor/plugins
+ create tmp/sessions
+ create tmp/sockets
+ create tmp/cache
+ create tmp/pids
+ create Rakefile
+ create README
+ create app/controllers/application.rb
+ create app/helpers/application_helper.rb
+ create test/test_helper.rb
+ create config/database.yml
+ create config/routes.rb
+ create public/.htaccess
+ create config/boot.rb
+ create config/environment.rb
+ create config/environments/production.rb
+ create config/environments/development.rb
+ create config/environments/test.rb
+ create script/about
+ create script/breakpointer
+ create script/console
+ create script/destroy
+ create script/generate
+ create script/performance/benchmarker
+ create script/performance/profiler
+ create script/process/reaper
+ create script/process/spawner
+ create script/process/inspector
+ create script/runner
+ create script/server
+ create script/plugin
+ create public/dispatch.rb
+ create public/dispatch.cgi
+ create public/dispatch.fcgi
+ create public/404.html
+ create public/500.html
+ create public/index.html
+ create public/favicon.ico
+ create public/robots.txt
+ create public/images/rails.png
+ create public/javascripts/prototype.js
+ create public/javascripts/effects.js
+ create public/javascripts/dragdrop.js
+ create public/javascripts/controls.js
+ create public/javascripts/application.js
+ create doc/README_FOR_APP
+ create log/server.log
+ create log/production.log
+ create log/development.log
+ create log/test.log
+```
+
+こうじゃ。
+
+長くなりそうなのでここまでにします。
+こちらからは以上です。