メンテ奉行

備忘録はもともと自分がrubyの勉強のために書き散らかした奴で今見ると(そんなに進歩してないけど)これはどうよ?みたいなコードもあると思う.

コメント欄の下に出てるgoogleでの検索と思われるurlを見ると,それなりに備忘録の内容目当てで来る人がいるらしい.urlを辿ってみると本家や逆引きrubyを差し置いてトップに来てたりしているものまである.

多少は時間をみて書き足したほうがいいかもなぁ.

wiki奉行とか(BTSの)チケット奉行とかほんとすごいよね.

編集距離のライブラリ化

入力した単語と数万語の辞書とで総当りで編集距離を計算させてみたら,30秒以上掛かったので,cで書き直してライブラリ化してみた.

同じ処理で0.7秒前後まで縮まった.繰り返し使うなら,手間は掛かってもライブラリ化する価値はあるなあ.

参考にしたページ:
Ruby拡張ライブラリ作成チュートリアル
Rubyの拡張ライブラリの作り方 - アホメモ - Seesaa Wiki(ウィキ)


ただ,挙動を見ていると,編集距離ってナイーブすぎる気がする.

ぱっと思いつくのは,置き換える文字によって距離を変える(pとb,fとvの置換は距離0.7とする,母音同士の置き換えは距離0.5とする)とか脱落は追加より距離が小さい(distance(x,y)!=distance(y,x)となる可能性がある)とか.

編集距離

レーベンシュタイン距離または編集距離で検索をするとそのものズバリなWe retire raa.ruby-lang.orgが見つかる.

使い方は簡単:

require 'text'
p Text::Levenshtein.distance( 'hello', 'hollow')
#=> 2


2007-12-18 - 新言語 Xtalを作る日記から,丁稚な日々のゴルフサポート(goruby?)みたいにしたらどうか?と思って改造.

候補選択がバカすぎる.lengthの代わりにlenって打ったら,gemを呼び出すという恐ろしいことになった.打ち間違えても適当に補完して正しいメソッドを呼び出すというより,意図的に間違わない限り正しいメソッドを呼び出さない.

自分の足を撃ち抜きたい人向け.

require 'text/levenshtein'

class Object
  def get_candidate( x, ys)
    return x if ys.index(x)
    ys.sort_by{|y| Text::Levenshtein.distance( x, y) }[0]
  end

  def method_missing m, *a, &b
    t = get_candidate(m.to_s, public_methods + private_methods)
    puts "[Did you mean: #{t}]"
    t ? __send__(t, *a, &b) : super
  end
end

a = %w[abc def hij klm]
put a.siz

#=>[Did you mean: size]
#=>[Did you mean: puts]
#=>4


追記:すでにやってる人がいたんですね→Matzにっき(2007-07-23)

ウィルス疑惑

念のために全ディスクを検索中だけど…

Jotti's malware scanでの検査結果:

I-worm/Nuwar.Lって出るのAVGだけだし誤検出で確定なような.

tccを動かすたびに,AVGを停止させているので不便でしょうがない.

もちろん,アンチウィルスソフトを止めるのは自己責任で.

tcc(3)

まったく何も分ってないけど,適当にコードを切り貼りしたらforの中で変数を宣言できるようになった.

しかしコンパイル早いなー.tccで改造したtccコンパイルしなおして,それでテスト用のソースをコンパイルしても一瞬で終わるよ.

続きを読む

tcc(2)

もしかして…と思ったら,やはりこれもコンパイルできない.

int main( void)
{
    for(int i=0;i<10;i++) {
        printf("%d\n", i);
    }
    return 0;
}

ANSI C grammar (Yacc)を見ると,forの初期化部には式だけで宣言は書けないことになってる.それが標準だったのか.

ちゃんとソースを読み込めば,そのくらいの拡張は簡単にできそうな気もするけど.

tcc

tccのnext_nomacro1を読んでいて気づいたんだけれど,

int foo;

int main( void)
{
f\
o\
o = 1;

    printf("foo %d\n", foo);
}

こんな書き方が許されていたのか…


以前にc.yを読んでいて気づいた変態的な書式

int main( void)
{
    int i;

    for(i=0;i<5;i++) {
        for( static int j=0;j<i*2;j++) {
            printf("%d,%d\n", i,j);
        }
    }
    return 0;
}

コンパイルできなかった.



今日になって突然,tccコンパイルした実行ファイルがウィルス認定を受けるようになってしまった.アンチウィルスソフトを変えないとダメかも.
vcでコンパイルしたtccは大丈夫だけど,そのtccでhello,world!とかをコンパイルしてもウィルス扱いされる.これが噂に聞くTrusting Trustアタックてやつ?