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もだな。
この際だから、色々な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リリースマネジメントの歴史。その歩みを歴代の担当者たちが振り返る
実際に携った方は大変な苦労が有ったんですね。ご苦労様です。で、その成果が節々に出てると思うんだけど、普段お世話になる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を頼りにリサーチしてみる。
これを見ると、単純に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が融通ないんだか。。。落とし穴は何処にあるか、想像もつかんぞ。