RubyKaigi2018 で現存する最古の Ruby をフロッピーディスクに入れて配布します

id:mizukmb です。こんにちは。

昨日紹介した 📖ステッカー帳 に引き続き、 RubyKaigi2018 でお配りするノベルティを紹介します。

来る RubyKaigi2018 にて、 Misoca ではノベルティとして Ruby 0.49 のソースコードが入ったフロッピーディスク を配ります。

こちらの紹介と、 Ruby 0.49 のビルド方法や実際に動かしてみた内容について書きたいと思います。

フロッピーディスク 💾

f:id:mizukmb:20180528162226j:plain

外観はこんな感じで、 RubyKaigi2018 仕様のジャケットと一緒にケースに入っています。ケースは自立するので飾ることができます。かっこ良いですね。

こちらのフロッピーディスクですが、実際に読み込むことができ、中には Ruby 0.49 のソースコードが入っています。

Ruby 0.49 はこちらで公開・配布されています。 ftp://ftp.ruby-lang.org/pub/ruby/1.0/

Ruby 0.49 をビルドしてみる

実際に Ruby 0.49 をビルドします。以下の環境で試しました。

フロッピーディスクを読み込む

会社にフロッピーディスクドライブを内蔵した PC が無かったため、 Amazon で外付けドライブを購入します。

ドライバにフロッピーディスクを入れると、「ウィーン, カシャ...カシャ...」という音と共に読み込まれます。オフィスで作業していたところ、懐しさからかこの音を聞きに多くの社員が私のデスクに立ち寄ってました。

読み込みに成功すると、 ruby というディレクトリがあると思います。これが ruby 0.49 のソースコードになります。適当なローカルストレージにコピーしてください。

macOS High Sierra でビルド

UbuntuRuby 0.49 をビルドしている記事があるので、こちらを参考にしながら macOS でもビルドします。

Ruby 0.49 をビルドする

現環境ではそのままビルドできないようです。有志が公開しているパッチをあてて make できるようにします。

github.com

上記パッチは 32bit バイナリを想定されているようなので、クロスコンパイルできる gcc を用意します。

macOS に標準搭載されている llvm-gcc ではクロスコンパイルできないので非 llvmgcc をインストールします。

こちらの記事を参考に gcc-7.2.0 をインストールしました。 1

marssky99.com

gcc の make に非常に時間がかかりました (2時間半くらい) 。気長に待ちます。

その後、以下のようにパッチを当てて Ruby 0.49 を make します。

$ cd /path/to/ruby # 事前にフロッピーディスクから ruby ディレクトリを適当な場所にコピーしてください
$ curl https://raw.githubusercontent.com/charliesome/historical-rubies/master/ruby-0.49.patch -LO
$ patch -p1 < ruby-0.49.patch
$ ./configure
$ make CFLAGS="-w -Wno-return-type -m32" CC=/path/to/built/bin/gcc7.2.0 # gcc のパスは適宜変更してください
(snip)
-n Loading ruby ...
done
rm parse.c
$ ./ruby -v
ruby - version 0.49 (18 Jul 94)

18 Jul 94 というのが時代を感じますね。ちなみに94年といえば私はまだ1歳で当時の事は何も覚えていません。

Ruby 0.49 で遊ぼう

ビルドに成功したので遊んでみます。素朴な fizzbuzz を実行します。

こんな感じに書いてみました。

class FizzBuzz
  def self.call(num)
    for n in 1..num
      case 0
      when n % 15
        print('FizzBuzz')
      when n % 5
        print('Buzz')
      when n % 3
        print('Fizz')
      else
        print(n)
      end
    end
  end
end

FizzBuzz.call(15)

実行結果

$ ./ruby scripts/fizzbuzz.rb
12Buzz4FizzBuzz78BuzzFizz11Buzz1314FizzBuzz

for n in 1..num ~ end1.upto(num) とか書けそうですが動きませんでした。

$ cat upto.rb
num=10

1.upto(10) do |n|
  print(n)
end

$ ./ruby upto.rb
upto.rb:3: syntax error
upto.rb:5: syntax error

恐らく upto メソッドが無いからだと思われますが、エラーメッセージから得られる情報が少ないのでソースコードを見る必要がありそうですね。

他にもソースコードsample/ ディレクトリに、テスト用に書かれたと思われるサンプルコードがいくつかあるので、そちらも実際に動かしたり眺めたりしてみると良さそうですね。

🙌RubyKaigiで会いましょう

フロッピーディスクは RubyKaigi 2018 に参加する社員が持ち歩いてますので、声を掛けていただければお渡しします。会場やドリンクアップで弊社員とお会いした時は是非お手に取ってみてください 💾

📖ステッカー帳もご用意しましたので、そちらもよろしくお願いします。

それでは RubyKaigi 2018 で会いましょう!

One more thing

当たりフロッピーディスクがいくつかあるらしい…… 👀

f:id:mizukmb:20180529112213j:plain

お楽しみに!


  1. 執筆時点の gcc 最新バージョンは 8.1 ですが、より確実にビルドできる方法を優先し記事内のバージョンに合わせました。