old ruby

DNS

ある朝、Windowsを使おうとしたら(= Web or VMware)firefoxが繋らなかった、と素人丸出しのサポ依頼。そんじゃググル様のブラウザーはどうよ? やっぱり繋らない。

そんじゃ、2nd PC にしてるリナはどうよ? やっぱり繋がりませーん。

DNSがひけないかもよ。両PC共、DHCPで使ってるからなあ。こういう時はリナ機をいじってみよう。少なくともWindowsよりはよく知ってるからね。

sakae@deb:~$ cat /etc/resolv.conf
nameserver xx.xx.xx.xx

某プロバイダーから降ってきたやつ。冗長性なし。だったら、ググル様の 8.8.8.8 も追加してみろ。ああ、動いた。

じゃ、面倒臭いWindowsもだな。

Windows10 – DNSサーバーを変更する方法

この際だから、色々なDNSをプチ調べておく。

sakae@deb:~$ ping -c 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=18.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=16.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=16.4 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=114 time=16.2 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=114 time=16.8 ms

--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 16.001/16.709/18.192/0.785 ms
--- 208.67.222.222 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 15.276/16.605/19.199/1.518 ms

--- 1.1.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 16.345/18.041/21.460/1.861 ms

パッ・パッ・パッ・パッ(8.8.8.8)でもいいけど、漢の人なら、パッ・パッ・ヨイ・ヨイ(8.8.4.4)もお勧め。いづれもググル様につつぬけね。AIで傾向分析してるんだろうな。ただより高いものは無いって、昔から言われてるじゃん。

irb

リリースの案内を見てたら、見逃していた亊が有ったので確認。

irb(main):003:0> measure
TIME is added.
=> nil
irb(main):004:0> load 'zfib.rb'
102334155
processing time: 3.742942s
irb(main):005:0> measure
                 measurePress Alt+d to read the full document
                        .measure

                        (from ruby core)
                        Implementation from Benchmark
                        ----------------------------------------
                          measure(label = "") { || ... }

                        ----------------------------------------
                          :

measureで、実行時間が表示されるとな。任意のスクリプトを実行するにはロードすれば良い。なんだかschemeと同じだな。

補完が効いてくれるのはありがたい。 Tab, Shift+Tab で補完候補の指定。補完が完了した所でマニュアルが出て来る。

old ruby 1.4.6

前回たまたま見付たOpenBSDのportsのruby群、やけに古い版数のものもあるなと思って中身を点検したら、残念ながら2.6以下は空になってた。よって、2.7 3.0 3.1がportsのお世話になって、スイスイとコンパイル出来る亊になる。

その点、FreeBSDだと、2.5から3.2まで、少しは広いレンジでサポートしてたよ。

でも、古い奴を現代に再現しようと、にわか後古学者になろうとすると、下記へ行って材料を取って來る亊が必要になる。

https://cache.ruby-lang.org/pub/ruby/

昔は、1.6 のようにマイナーバージョンが偶数なやつは安定版、1.7みたいに奇数は開発版って、分てたんだけど、いつの間にか無くなったの。

懐しいやつを取ってきてOpenBSDでコンパイルしたら、膨大なエラーが出て来た。あの頃はCLNAGなコンパイラーなんて無かったからなあ。ああ、あの頃ってのは

sakae@deb:/tmp/ruby-1.4.6$ head ChangeLog
Wed Aug 16 15:30:58 2000  Yukihiro Matsumoto  <matz@ruby-lang.org>

        * stable version 1.4.6 released.
         :

Y2Kのど真ん中だったんすね。

んで、Debianでどうかと試したら、やっぱり駄目。

dln.c: In function ‘dln_load’:
dln.c:1506:5: warning: implicit declaration of function ‘rb_loaderror’ [-Wimplicit-function-declaration]
 1506 |     rb_loaderror("%s - %s", dln_strerror(), file);
      |     ^~~~~~~~~~~~
   :
gcc -g -O2 -I. -I. -I/usr/local/include -c main.c
gcc -g -O2 -rdynamic main.o dmyext.o libruby.a -ldl -lcrypt -lm   -o miniruby
/usr/bin/ld: libruby.a(eval.o): in function `rb_class_of':
   :
collect2: error: ld returned 1 exit status
make: *** [Makefile:90: miniruby] Error 1

てな具合に、討死しました。ソースがあるからって安心は出来無いのさ。その頃のOSとか開発環境まで用意がないとね。ソースがあればってのは幻想ですよ。

まあ、たとえれば、秘蔵の映画をVHSで録画しといた、余生は映画三昧だな、と思っていたら、VHSのビデオ・デッキが無くなっていたって亊。

stdlib

cgi.rb debug.rb tmpfile.rb とかにお世話になってたな。何せrubyを使う理由はWEBサーバーでcgiしたいでしたからねぇ。時代が変ってもrubyを使う理由はRailsの土台になってるからでしょ。

あれ、この頃からprofile.rbとかtracer.rbなんかも同梱されてんだね。

ext

sakae@deb:/tmp/ruby-1.4.6/ext$ ls -d */
curses//  etc//    gdbm//  nkf//  readline//  socket//    tk//
dbm//     fcntl//  md5//   pty//  sdbm//      tcltklib//  Win32API//

懐しいtcltkが有るじゃないですか。簡単に使えるGUIだったな。それから、gdbmにもお世話になったな。今で言ったら、NO-SQLなデータベースね。もっと別な表現だと、key-value-store。そんなに気取らないで、永続的なhashで通じるよ。カレンダーアプリを作る時、gdbm,sdbm,ndbm,bdbのどれが良いか喧喧諤諤だったなあ。

FreeBSDの /usr/ports/databases/rubygem-dbmに親切な説明があった。

The DBM class provides a wrapper to a Unix-style Database Manager
library.

Dbm databases do not have tables or columns; they are simple key-value
data stores, like a Ruby Hash except not resident in RAM. Keys and
values must be strings.

The exact library used depends on how Ruby was compiled. It could be
any of the following:

 * The original ndbm library is released in 4.3BSD. It is based on dbm
  library in Unix Version 7 but has different API to support multiple
  databases in a process.
 * Berkeley DB versions 1 thru 6, also known as BDB and Sleepycat DB,
  now owned by Oracle Corporation.
 * Berkeley DB 1.x, still found in 4.4BSD derivatives (FreeBSD,
  OpenBSD, etc).
 * GDBM, the GNU implementation of dbm.
 * QDBM, another open source reimplementation of dbm.

All of these dbm implementations have their own Ruby interfaces
available, which provide richer (but varying) APIs.

WWW: https://github.com/ruby/dbm

そう言えば、gauche本でも同じ題材を扱っていたな。永続的なhashは何を使ってた? fsdbmでデータベースの扱いに慣れて貰って、MySQLって所へ誘導してる。fsdbmって余り聞き慣れないけど、普通にみんな使ってるよ。ファイル名をキーに内容をバリューに対応。なんでもデータベースって、究極のDBだ。細かい亊は、ファイルシステムdbm

old ruby 2.2.2

何となく、こういうのを選んでみた。ニャン・ニャン・ニャンと語呂が良かったってのは内緒だぞ。現代に近付いているなって感覚。

gmake[2]: Entering directory '/tmp/ruby-2.2.2/ext/openssl'
compiling ossl_ssl_session.c
In file included from ossl_ssl_session.c:5:
./ossl.h:58:10: fatal error: 'openssl/asn1_mac.h' file not found
#include <openssl/asn1_mac.h>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.

ext/openssl省いてあげたら、何となくコンパイルが最後まで走って Generating RI format into tmp/ruby-2.2.2.ext/rdoc…が出て来た。テストはあちこち、BUGふんじゃったってなってたけど。

で、大体いつ頃の時代の代物? ChangeLogの先頭が Mon Apr 13 22:11:21 2015 ってなってた。

stdlib

libの下の*.rbを数えたら、64ヶあった。rubygems.rb webrick.rb rake.rb なんてのが入ってきているんで、Railsで火がついたのかな。それから、数学関係のそれが充実してるな。python対策なのかしらん。

改めて、 Ruby on Rails の歴史を調べてみたよ。随分昔から有るんだね。Rails陣営からのきつい要求で、rubyがどんどんと改良された風に思えるんだけど、どうよ。

NEWSを見ると

* Continuation
  * callcc is obsolete. use Fiber instead.

えっ、一瞬schemeかと思ってしまったぞ。doc/NEWS-* で、歴代の仕様を確認するのもありだな。

NEWS-1.8.7に

* vendor_ruby directory

 A new library directory named `vendor_ruby' is introduced in
 addition to `site_ruby'.  The idea is to separate libraries
 installed by the package system (`vendor') from manually (`site')
 installed libraries preventing the former from getting overwritten
 by the latter, while preserving the user option to override vendor
 libraries with site libraries. (`site_ruby' takes precedence over
 `vendor_ruby')

 If you are a package maintainer, make each library package configure
 the library passing the `--vendor' option to `extconf.rb' so that
 the library files will get installed under `vendor_ruby'.

ext

sakae@deb:/tmp/ruby-2.2.2/ext$ ls -d */
bigdecimal//    dl//      json//      pty//       stringio//  win32ole//
continuation//  etc//     mathn//     racc//      strscan//   zlib//
coverage//      fcntl//   nkf//       rbconfig//  syck//
curses//        fiber//   objspace//  readline//  syslog//
date//          fiddle//  openssl//   ripper//    thread//
dbm//           gdbm//    pathname//  sdbm//      tk//
digest//        io//      psych//     socket//    win32//

fiber fiddle なんてのは、今でも有名だな。tk君も元気だ。後、コンパイルを完了させる為opensslを消してしまったけど、大事な一員なのね。

debian様で

コンパイルすると、OpenBSDと同様のext/opensslの所で引掛った。いつもBUGで話題を振り撒いてくれるから、足が速くなってるんだな。rm -rf ext/openssl して、無かったことにしてコンパイルを継続。最終的なテスト結果。

test succeeded
PASS all 1009 tests
./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./bootstraptest/runner.rb" --ruby="ruby --disable-gems"   ./KNOWNBUGS.rb
2022-05-02 05:05:33 +0900
Driver is ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]
Target is ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]

KNOWNBUGS.rb  PASS 0
No tests, no problem

最後の語句がふるってますなあ。昔のRuby会議の土産にトートバッグがついていた。No Ruby, No Lifeってロゴ入り。スーパーへの買物とか図書館へ行く時の本入れに重宝してますよ。

rubyの変遷

Ruby変更履歴

試行錯誤と改善を続けたRubyリリースマネジメントの歴史。その歩みを歴代の担当者たちが振り返る

実際に携った方は大変な苦労が有ったんですね。ご苦労様です。で、その成果が節々に出てると思うんだけど、普段お世話になるlibの下のスクリプトと、extの下にある外部拡張の個数を数えてみたい。

その為には、tar玉を何個もDLして来る? いいえ、もっと良い手が有るよ。 ruby.git から、歴史をそっくりと頂いてくる。

そして、下記のようにすれば、任意のverへ飛んでいける。連休なんで、時間旅行するのもいいぞ。頻繁にあちこちを飛び回るなら、goto ver でワープ出来るようにスクリプトにしちゃうのが楽だ。

旅行は無目的もいいけど、案内があった方が、きっと楽しい。地層年代のカタログを下調べするのがお勧め。たとえば、pthreadはいつ頃入ったかしらべるなら

ob$ grep pthread -l doc/ChangeLog-*
doc/ChangeLog-1.8.0
doc/ChangeLog-1.9.3
     :
doc/ChangeLog-YARV

初めて出現したのは、1.8.0頃って分る。なお、過去は自由に飛び回れるけど、現代への戻り方を知らないと時代に取り残される。masterがmaster-keyになってるぞ。大事な呪文だから、絶対に忘れるな。

sakae@deb:/tmp/ruby$ git tag
sakae@deb:/tmp/ruby$ git fetch origin v1_4_6
sakae@deb:/tmp/ruby$ git checkout v1_4_6

これをスクリプトにしちゃえ。rubyの亊を書いているんだから、ruby語にしろってのはご容赦。一発芸だから、何でもOKってのが心情です。

#! /bin/sh
for ver in `git tag | egrep '_0$'`
do
    git fetch origin $ver > /dev/null 2>&1
    git checkout $ver     > /dev/null 2>&1
    ext=`find ext -maxdepth 1 -type d | wc -l`
    lib=`ls lib/*.rb | wc -l`
    echo $ver "\t" $lib "\t" $ext
done

走らせた結果を、少々手直し。

ver      lib     ext
====================
v1_0     34      10
v1_4_0   46      15
v1_5_0   47      15
v1_6_0   47      15
v1_8_0   72      27
v1_9_0_0 64      29
v1_9_1_0 67      31
v1_9_2_0 67      35
v1_9_3_0 65      37
v2_0_0_0 66      35
v2_1_0   65      37
v2_2_0   64      36
v2_3_0   63      37
v2_4_0   62      36
v2_5_0   59      35
v2_6_0   60      35
v2_7_0   55      36
v3_0_0   53      35
v3_1_0   50      32

大変革期は、1.8から1.9の時代なんだな。これに加えて、カーネルになる、*.[ch]の個数や行数を並列表示させると面白いぞ。

きっと並列実行が得意な方々が、デーモン君に扮して、夜こっそり実現してくれるに違いない。我乍ら、面倒な亊は他人にすがる、惡い癖が顔をだしてるな。

rubyの館

色々なバージョンのrubyを集めたrubyの館を作りたい。で、問題は切り換えだな。こういう用途は多分にあるはず。ちらほら耳にしてた、rbenvを頼りにリサーチしてみる。

rbenv を利用した Ruby 環境の構築

ruby-build

これを見ると、単純にPATHを切り換えているだけかな。

面白そうなruby-buildをgitしてきた。shareの中に材料の指示がされてた。たとえば、1.9.0-0

require_gcc
install_package "yaml-0.1.6" "http://pyyaml.org/download/libyaml/yaml-0.1.6.tar.gz#7da6971b4bd08a986dd2a61353bc422362bd0edcc6\
7d7ebaac68c95f74182749" --if needs_yaml
install_package "ruby-1.9.0-0" "https://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.0-0.tar.bz2#7995fdb2879cbb67b1ae4b5bbdf5460\
f70221598086f4e48e15fa5f48f2866e3" warn_eol standard
install_package "rubygems-1.3.7" "https://rubygems.org/rubygems/rubygems-1.3.7.tgz#388b90ae6273f655507b10c8ba6bee9ea72e7d49c3\
e610025531cb8c3ba67c9d" ruby

yamlとrubygemsは別にお取り寄せして、コンパイルしろ、だな。前にやった2.2.2のopenssl問題も、これを使えば解決。但しセキュリティーBUGを持ち込む亊になる。

install_package "openssl-1.0.2u" "https://www.openssl.org/source/openssl-1.0.2u.tar.gz#ecd0c6ffb493dd06707d38b14bb4d8c2288bb7\
033735606569d8f90f89669d16" mac_openssl --if has_broken_mac_openssl
install_package "ruby-2.2.2" "https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.bz2#f3b8ffa6089820ee5bdc289567d365e5748\
d4170e8aa246d2ea6576f24796535" warn_eol ldflags_dirs standard verify_openssl

前回やったやつも列挙されてたぞ。artichoke-dev 有名人だな。

case $(uname -s) in
Linux)
  install_package "artichoke-nightly" "https://github.com/artichoke/nightly/releases/latest/download/artichoke-nightly-x86_64-unknown-linux-gnu.tar.gz" artichoke
  ;;

MRIからGCを根絶するにはrustです。ruby 4.0 で、4x4 って目標をかかげ、rust化しませんか > matz様及びruby開発陣ご一行様。

sakae@deb:/tmp/ruby-build/bin$ ./ruby-build -l
2.6.10
2.7.6
3.0.4
3.1.2
jruby-9.3.4.0
mruby-3.0.0
rbx-5.0
truffleruby-22.1.0
truffleruby+graalvm-22.1.0

ruby-build公認のお勧めruby。mrubyぐらいまでは知ってるけど、後は初見だなあ。

–disable-gems

こんなオプションが有るの、今頃気が付いた。gemって、いろいろガチャガチャやってるから、それを嫌いな人向けなんだな。確かに、前回debug.gemでトレースした時、膨大なステップを踏んでたぞ。

このオプションを付けたらどうなる。まずは前回のおさらい。test.rbの冒頭から Tracer.on してます。

sakae@deb:/tmp/t$ ruby -r tracer test.rb
#0:test.rb:2::-: require 'tracer'
#0:<internal:/usr/local/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:36:Kernel:>: -
#0:<internal:/usr/local/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:37:Kernel:-: -
  :
#0:<internal:/usr/local/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:167:Kernel:<: -
#0:test.rb:3::-: class A
#0:test.rb:3::C: class A       
 :
sakae@deb:/tmp/t$ ruby --disable-gems -r tracer test.rb
test.rb:in `require': cannot load such file -- tracer (LoadError)

tracer自身がgemになってるから、見付からないんだな。

sakae@deb:/usr/local/lib/ruby/gems/3.1.0/gems/tracer-0.1.1$ sudo cp lib/tracer.rb /usr/local/lib/ruby/site_ruby/

こんな亊していいものか? まあ、安定してるんでいいと思うよ。

sakae@deb:/tmp/t$ ruby --disable-gems -r tracer test.rb
#0:test.rb:1::-: Tracer.on
#0:test.rb:2::-: require 'tracer'
#0:test.rb:3::-: class A
 :

Debian wifiは不安定

ruby.gitをtarで固めて、Windows10側のOpenBSDで確認しよう。 で、debianにあるやつをWSLからscpしたら、何度実行しても半分ぐらい転送した所でpeerがキレましたって言われる。

DebianのWiFiは、昔から不安定。時々溜りこんでしまう亊があるんだ。本当にDebianが惡いか検証の為、FreeBSDに変更して転送してみる。

sakae@atom:~/tmp$ scp fb:gitruby.tar .
gitruby.tar                                  100%  364MB   2.0MB/s   03:01

問題無いなあ。wifiなハードは、dmesgでは、こんな報告。元々はWindows 7が入っていたノーパソなんで、ハードは十分に枯れているはずなんだけど。後でぐぐってみるか。

iwn0: <Intel WiFi Link 5100> mem 0xf2200000-0xf2201fff irq 19 at device 0.0 on pci2

で、上で書いた一発芸をFreeBSDで実行すると、echoは言われた通りの挙動だった。

v1_0 \t 34 \t 10
v1_4_0 \t 46 \t 15
  :

OpenBSDも多分同じだろね。リナが親切過ぎるんだか、BSDが融通ないんだか。。。落とし穴は何処にあるか、想像もつかんぞ。


This year's Index

Home