« 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派とか関係なく、この仕組みを考えて実装したアイディアに驚いた。

2008年02月10日

進法指定の判断方法

複数のプログラミング言語を使っていると数値の進法指定がどれがどれだかわからなくなる。そうゆうときには110/2を計算。36か44が返ってくれば8進法、136か88が返ってくれば16進法、1が返ってくれば2進法となる。まあ指定方法そのものを忘れているときには役にはたたないけど。
JavaScriptの例
(0x110/2);              //=>136
(0x110/2).toString(16); //=>"88"
(0110/2);               //=>36
(0110/2).toString(8);   //=>"44"

JavaScriptは13進法や17進法も扱える

あまり知られていないみたいだが、JavaScriptは2進法・8進法・10進法・16進法以外にも扱える進法がある。13進法とか17進法とか。8進法の"077"や16進法の"0xff"のような記述方法はないが、2進法から36進法が扱える。
parseIntの例
parseInt(110,2)         //=>6
parseInt(110,3)         //=>12
parseInt(110,4)         //=>20
parseInt(110,5)         //=>30
parseInt(110,6)         //=>42
parseInt(110,7)         //=>56
parseInt(110,8)         //=>72
parseInt(110,9)         //=>90
parseInt(110,10)        //=>110
parseInt(110,11)        //=>132
parseInt(110,12)        //=>156
parseInt(110,13)        //=>182
parseInt(110,14)        //=>210
parseInt(110,15)        //=>240
parseInt(110,16)        //=>272
parseInt(110,17)        //=>306
parseInt(110,18)        //=>342
parseInt(110,19)        //=>380
parseInt(110,20)        //=>420
parseInt(110,21)        //=>462
parseInt(110,22)        //=>506
parseInt(110,23)        //=>552
parseInt(110,24)        //=>600
parseInt(110,25)        //=>650
parseInt(110,26)        //=>702
parseInt(110,27)        //=>756
parseInt(110,28)        //=>812
parseInt(110,29)        //=>870
parseInt(110,30)        //=>930
parseInt(110,31)        //=>992
parseInt(110,32)        //=>1056
parseInt(110,33)        //=>1122
parseInt(110,34)        //=>1190
parseInt(110,35)        //=>1260
parseInt(110,36)        //=>1332
toStringの例
(5).toString(2);        //=>101
(11).toString(3);       //=>102
(19).toString(4);       //=>103
(29).toString(5);       //=>104
(41).toString(6);       //=>105
(55).toString(7);       //=>106
(71).toString(8);       //=>107
(89).toString(9);       //=>108
(109).toString(10);     //=>109
(131).toString(11);     //=>10a
(155).toString(12);     //=>10b
(181).toString(13);     //=>10c
(209).toString(14);     //=>10d
(239).toString(15);     //=>10e
(271).toString(16);     //=>10f
(305).toString(17);     //=>10g
(341).toString(18);     //=>10h
(379).toString(19);     //=>10i
(419).toString(20);     //=>10j
(461).toString(21);     //=>10k
(505).toString(22);     //=>10l
(551).toString(23);     //=>10m
(599).toString(24);     //=>10n
(649).toString(25);     //=>10o
(701).toString(26);     //=>10p
(755).toString(27);     //=>10q
(811).toString(28);     //=>10r
(869).toString(29);     //=>10s
(929).toString(30);     //=>10t
(991).toString(31);     //=>10u
(1055).toString(32);    //=>10v
(1121).toString(33);    //=>10w
(1189).toString(34);    //=>10x
(1259).toString(35);    //=>10y
(1331).toString(36);    //=>10z

2008年02月18日

デブサミに行ってきた

なんか某女史がえらく注目されているので細々と報告。
Web系・Java系・Ruby系をメインで見てきました。いやぁ、良いですね。関西にもこんなイベント欲しいです。OSCやKOFも良いんだけど、デブサミみたいな雰囲気のイベントが欲しい。OSCやKOFがいらないってわけじゃないですよ。デブサミみたいな路線のイベントも欲しいって話です。
amachangがKanasan.JSに参加していた関係で、デブサミ後の(非公式の)打ち上げに参加させてもらいました。関東勢は横の繋がりも強いようで羨ましくなってしまいました。
懇親会の席では思ってもいなかった人に再会。なんと関西のセキュリティ勉強会である「まっちゃ139勉強会」でお会いしたhasegawayosuke氏。最初、「あれ、この人の顔見た事がある。顔知っているだけでなく、話した事ある。誰だろう。」って思ってしまった。あんなところで会うとは全く予想していなかったとはいえなんて失礼な。帰りの新幹線も一緒でたっぷりとお話をさせてもらいました。
今回のデブサミの収穫は、技術的な点もさることながら、関東勢との繋がり、そして関西も勉強会とかユーザグループとか横の繋がりをもっと密にしないといけないなと実感したこと。
参加した皆様、お疲れさまでした。お会いした皆様、ありがとうございました。

自分の無知さ加減

デブサミには"Joel Spolsky"という人が来ていたらしい。なんかとても著名な人らしいが知らなかった。写真を見るとどこかで見た事がある程度。
この間まで"Paul Graham"も知らなかった。けど、"Paul Graham"のエッセイの一覧を見たら読んだ事のあるものが結構あった。
SICP(Structure and Interpretation of Computer Programs/邦題:計算機プログラムの構造と解釈)も知らなかったし、HtDP(How to Design Programs)も最近知った。
う〜〜ん。自分の知識が多少偏っているのか、それとも全然足りてないのか。前者であれば良いけど後者だと...。
まわりの人はほぼ全員が知っていたしなぁ...。

第23回 Ruby/Rails勉強会@関西に参加してきた

表題の通りRuby勉強会に参加してきた。
okkezさんとチカホリさんによる「Ruby初心者向けレッスン第17回」の演習。
時間内にできるだけ解こうとした為、ものすごく汚いcodeになってしまった。
とりあえず晒す。
九九の表
s=""
printf "    |"
s+=    "----+"
(1..9).to_a.each do |y|
  printf "%3d",y.to_s
  s+="---"
end
puts ""
puts s

(1..9).to_a.each do |x|
  printf "%3d |",x.to_s
  (1..9).to_a.each do |y|
    printf "%3d",(x*y).to_s
  end
  puts ""
end
100マス計算
op="+"

xx=(1..9).sort_by{rand}
yy=(1..9).sort_by{rand}

s=""
printf "  "+op+" |"
s+=    "----+"
xx.to_a.each do |x|
  printf "%3d",x.to_s
  s+="---"
end
puts ""
puts s

yy.to_a.each do |y|
  printf "%3d |",y.to_s
  xx.to_a.each do |x|
    printf "%3d",(x.send(op,y)).to_s
  end
  puts ""
end
ここまでで時間切れ。
帰ってから100マス計算をリファクタリング。というか再実装。
100マス計算:再実装版
operator        = ARGV[0].to_s

unless (/^[-+*\/%]$/ =~ operator)
  puts "wrong parameter: operator is only +-*/%"
  exit
end

x               = (1..9).sort_by{rand}
y               = (1..9).sort_by{rand}

def display100Math x,y,operator,display

  digit           = 2
  separate        = " "
  vertical_line   = "|"
  horizontal_line = "-"
  cross_line      = "+"

  print separate * (digit - operator.size)
  print operator
  print separate
  print vertical_line
  x.to_a.each do |xx|
    print separate
    print separate * (digit - xx.to_s.size)
    print xx
  end
  puts ""

  print horizontal_line * digit
  print horizontal_line
  print cross_line
  x.size.times do
    print horizontal_line
    print horizontal_line * digit
  end
  puts ""

  y.to_a.each do |yy|
    print separate * (digit - yy.to_s.size)
    print yy
    print separate
    print vertical_line
    if display
      x.to_a.each do |xx|
        answer = yy.send(operator,xx)
        print separate
        print separate * (digit - answer.to_s.size)
        print answer
      end
    end
    puts ""
  end
end

display100Math x,y,operator,false
puts
display100Math x,y,operator,true
誰か添削してぇ〜〜。

2008年02月19日

Ruby勉強会@関西にTBできない

なぜかRuby勉強会@関西にトラックバックできない。まいった。
追記:20080220
TrackBackって書いてあったから必死に送ってたんだけど、よくよく見たらwikiだった。
よくわからないんだけど、TBに対応したwikiって事?
Google

タグ クラウド