トップ «前の日(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プログラムを一部分だけ処理するようなケースではちょっと工夫が必要になる。