« 2008年01月 | メイン | 2008年03月 »

2008年02月 アーカイブ

2008年02月06日

Rubyでtypoしたときに「ひぎぃ」と言わせる

但しMacOSX限定。
#小文字で始まるtypoの場合
#  *a => 第1引数     : typoメソッド名
         第2引数以降 : typoメソッドの引数
#  &b => typoメソッドのブロック
def method_missing(*a, &b)
  `say higgy`
end

#大文字で始まるtypoの場合
#  a  => typoクラス名
class Module
  def const_missing(a)
    `say higgy`
  end
end
ついでに、数値の場合。
class Fixnum
  def inspect
    `say higgy`
  end
end

class Float
  def inspect
    `say higgy`
  end
end
こちらは数値の出力を全て上書きするみたいだ。
しかもirb限定らしい。
(inspectがirbの機能)
計算結果がでなくなる副作用あり。
さらに、ついでに作ってみた。
class Fixnum
  def inspect
    puts 'あなたはこんな簡単な計算にもirbを使うのですか。なんてお馬鹿さんなんでしょう...。'
  end
end

class Float
  def inspect
    puts 'あなたはこんな簡単な計算にもirbを使うのですか。なんてお馬鹿さんなんでしょう...。'
  end
end
かなり腹が立つ。
追記
日本語がまともに表示されなかった...。

2008年02月07日

[.inputrc]は[readline]のなんなのかとその調査過程で得られたもの

機能のひぎぃのentryで日本語が表示されなかったので、@ujihisaにやり方を聞いた。
userのhomeにある[.inputrc]の中に文字コードを指定したりするらしいのだが、このファイルがなんなのかよくわからなかったので調べてみた。
答えは簡単に見つかって、[readline]が読み込むファイルとのこと。
[.bashrc]や[.zshrc]の名前から何らかの設定だとは思っていたが、inputって部分からは[readline]が思いつかなかった。
そもそもreadlineとは何かもよく知らないのでまた調べてみた。
これによると、[readline]はCUIアプリケーションに対して入力支援機能を提供するLibraryとのことである。
つまり、ヒストリ機能やキーバインド等、CUIアプリケーションの作者が実装しなくても、[readline]にリンクを張っておけば良いということらしい。
更に読み進めると、[libedit]というものもあることを知った。
([.inputrc]がここにも書いてありましたとさ。)
[readline]はGPLライセンスらしい。LGPLではない。つまりリンクを張ってmakeしてしまうとbuildされたアプリケーションもGPLになってしまうということ。
これを嫌ったNetBSD界隈で作成されたのが[readline]と互換性を持った[libedit]らしい。
運の良いことにこの直後、@yharaから偶然にも[rlwrap]を教えてもらった。
本当に運が良い。
[readline]にリンクしていないCUIアプリケーションをwrappingし、[readline]を使えるようにしてしまうらしい。
例えば、[gosh]を[rlwrap]でラップして起動したい場合、
rlwrap gosh
となる。
個人的な見解ではあるけども[rlwrap]の使用方法から考えると、[readline]にリンクしてGPLライセンスに縛られなくても[rlwrap]を経由することで[readline]の機能を使えるということではないだろうか。
つまり、本来なら[readline]<=>[CUIアプリケーション]には明示的なリンクが張られ、[CUIアプリケーション]はGPLライセンスとなる。
しかし、[readline]<=>[rlwrap]に明示的なリンクをさせることで[rlwrap]はGPLライセンスとなるが、[rlwrap]<=>[CUIアプリケーション]は使用者が任意に行う為に、[CUIアプリケーション]はどのようなライセンスでも可能なのではないだろうか。
私がMIT派とかGPL派とか関係なく、この仕組みを考えて実装したアイディアに驚いた。