トップ «前の日(12-24) 最新 次の日(12-26)» 追記   RSS 1.0 FEED  

Journal InTime


2000-12-25 (Mon)

_ SCSI disk error

このマシン(www.shugo.net/www.modruby.net)でまたSCSI disk errorが起きていた。 この間SCSIカードを変えたけど、やっぱりだめだったらしい。しくしく。 カードはあまってたけどディスクはないのです。

_ 請求書

車の修理代の請求が来ていた。8400円なり。しくしく。 (今日は泣いてばっかりだな。)

_ 最適化?

Array#&の話の続き。

普通最適化によって仕様と動作が変わったらまずいのだけど、まつもとさんの場合は 仕様の方を変えちゃえばいいんだな、ということに気付いた。


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のバグっぽい挙動を見つけてしまったような……。

Tags: Ruby

_ モジュールの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として登録しておいた。

Tags: Ruby

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の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にっきはしばらく様子見。

Tags: Ruby tDiary

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で...*, **, &の構文糖にすると言っていましたが、そうはなりませんでした。