2000-12-25 (Mon)
_ SCSI disk error
このマシン(www.shugo.net/www.modruby.net)でまたSCSI disk errorが起きていた。 この間SCSIカードを変えたけど、やっぱりだめだったらしい。しくしく。 カードはあまってたけどディスクはないのです。
_ 請求書
車の修理代の請求が来ていた。8400円なり。しくしく。 (今日は泣いてばっかりだな。)
2003-12-25 (Thu)
_ ruby 1.8.1
ついに出た。駆け込みで色々修正があったようなので、問題が残っていな いかちょっと不安だ。
と思いつつruby-devをチェックしていると、
<URL:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/22395>
うーん、Tkが動かないのか。
2017-12-25 (Mon)
_ Ruby 2.5.0へのアップグレード
Ruby 2.5.0がリリースされたので、この日記をRuby 2.5.0にアップグレードした。
今のところtDiaryの動作はとくに問題なさそうだが、2.5.0のバグっぽい挙動を見つけてしまったような……。
_ モジュールのrefineのバグ
モジュールをrefineした際のバグをいくつか直したつもりだったが、以下のケースでusing D
していないのにrefineしただけで挙動が変わってしまうようだ。
module A def foo puts "A#foo" super end end class B def foo puts "B#foo" end end class C < B include A def foo puts "C#foo" super end end module D refine A do def foo end end end C.new.foo
using D
した時にsuperでBを辿れないのは仕方ないかなと思っていたのだが、using D
してないのにこうなるのはちょっとまずい……。
とりあえず、Bug #14232として登録しておいた。
2019-12-25 (Wed)
_ Textbringer 1.0.2リリース
※Textbringer Advent Calendar 2019の参加記事です。
Ruby 2.7.0がリリースされたので、Textbringer 1.0.2をリリースした。
変更点:
- isearch_quoted_insertの追加(インクリメントサーチ中にC-qで次に入力した特殊文字を検索できるようにするため)
- define_keyやヘルプでESCの代わりにM-記法を使うようにした
- indent_new_comment_line_commandの追加(平成Ruby会議01でライブコーディングした機能)
- find_alternate_fileの追加(ただしEmacsと違って現在のバッファはkillせず残す)
- Rubyモードのインデントのバグの修正
最後のが一番つらいやつで、平成Ruby会議の時も当日の朝にライブコーディングの練習をしていたらバグに気づいて修正していた。
デモの練習しようと思ったらTextbringerバグってるんだけど……
— Shugo Maeda (@shugomaeda) December 13, 2019
TextbringerのRubyモードでは、インデントの計算をする時にまず最初にカーソル位置から一番近いclassやdef、ifなどを探してそこからカーソル位置までのトークンをRipperで切り出す。例えば、
module Foo
class Bar
def foo
if bar
end
end
end
の最後のendの行でC-iすると
if bar
end
end
end
の部分のトークンを切り出し、ifの行のインデント位置からendの対応関係を見てインデントを計算する。 ところが、Ripper.lexは2番目のendで文法エラーを検出して最後のendはトークンとして返してくれない。
そこでTextbringer 1.0.2では途中で文法エラーになったら残りの部分を繰り返しRipperに食わせて最後までトークンを切り出すようにした。
また、
if bar
end
}
のように {
との対応が取れていない }
があると、 :on_rbrace
ではなく :on_embexpr_end
として返ってくるのでそのあたりも修正した。
Ripperは正しいRubyプログラムを先頭から食わせるような使い方では便利だが、テキストエディタのように正しくないかもしれないRubyプログラムを一部分だけ処理するようなケースではちょっと工夫が必要になる。
2020-12-25 (Fri)
_ Ruby 3.0.0へのアップグレード
Ruby 3.0.0がリリースされたので日記をアップグレードした。
最初以下のエラーで起動しなかったがGemfileにwebrickを追加したら解決した。
/home/shugo/app/jit/vendor/bundle/ruby/3.0.0/gems/tdiary-5.1.4/lib/tdiary/rack/auth/basic.rb:2:in `require': cannot load such file -- webrick/httpauth/htpasswd (LoadError)
mongodbがRuby 3.0.0に対応していないようなのでMatzにっきはしばらく様子見。
2022-12-25 (Sun)
_ ...
を*, **, &
の構文糖にすると言ったな、あれは嘘だ
Ruby Advent Calendar 2022の25日目の記事です。
昨日は羽角さんのirb.wasmの入力メソッドをSTDIOからRelineへ改修した話でした。
前回のあらすじ
前回の記事で、
Ruby 3.2で
*
と**
が導入されましたが、当初は...
と併用されることを想定しておらず、すこしいびつな仕様になっていました。...
は*, **, &
の構文糖であるというシンプルな仕様に修正しました。
と言っていました。ところが……
遅くなった?
松田さんから*, **
や...
による委譲が遅いというissueが報告されました。
forwardableを使った場合に比べて2倍以上遅いとのこと。forwardableが何でそんなに速いかというとruby2_keywordsを使っているからで、前回の記事でも書いたようにFeature #19134の修正前は
def foo(...)
bar(...)
end
は
ruby2_keywords def foo(*, &)
bar(*, &)
end
の構文糖でした。正直ruby2_keywordsという盲腸みたいな機能で速いのはずるいと思うんですが……。
修正案
実際のアプリケーションではそれほど影響はなさそうな気もしましたが、Railsでたくさん使われているらしいということで、修正案として、...
と*
/**
の併用を禁止するという提案をしました。
&
についても禁止してもいい気もしますが、Ruby 3.1で併用できていて互換性の問題があるということでこちらはそのまま。
ささださんによる最適化
リリースまで時間もないので上記の修正を行うつもりでまつもとさんの返事を待っていたところ、ささださんが最適化してみるのでちょっと待って、ということになり、休暇中のはずのささださんによってpull requestが作成されました。
f(*a, *kw)
の呼び出し規約を変えるという結構インパクトのある修正で、リリースまで12日しかなくてYJITチームの何名かはもうすぐ休暇に入ってしまうという話もあり、Ruby 3.2での導入は見送られました。
この最適化自体は、...
の仕様をどうするかに関わらず有用なので、おそらくRuby 3.3で取り込まれると思います。
修正
ということで、結局修正案のとおり、...
と*
/**
の併用を禁止するように修正しました。
修正中、以下の部分が最初抜けていてテストが通らずはまりましたが、元のなかださんのコードでは#define idFWD_KWREST 0
していたのでこの#ifdef
は不要だったという罠でした。
args_forward : tBDOT3
{
/*%%%*/
+#ifdef FORWARD_ARGS_WITH_RUBY2_KEYWORDS
+ $$ = 0;
+#else
$$ = idFWD_KWREST;
+#endif
/*% %*/
/*% ripper: args_forward! %*/
}
今回の修正でFORWARD_ARGS_WITH_RUBY2_KEYWORDS
が#define
されていなければruby2_keywordsを使わなくなったので、Ruby 3.2でささださんの最適化が入ったらそうするとよいように思います(が多分忘れる)。
まとめ
Ruby 3.2で...
を*, **, &
の構文糖にすると言っていましたが、そうはなりませんでした。