Ruby

nil safeなmethod chainをどう書くか

rubyを書くときはmethod chainでつなげていくことが多いと思いますが、途中でnilが出てきたとき困ってしまいます。例えば str.split("/").last.split(".").last のようなコードがあったときにstrに空文字が入ると途中でnilが出てきて死にます。clojureだとni…

木構造に対してイテレータを作る

Rubyistなら知ってて当然みたいな内容かもしれませんが、自分で作るのはたぶん初めてのように思うのでメモ。本当はC++で同様のことがやりたいのだが、Rubyのほうがぱっとやるには早いのでとりあえずRubyにて。状況、モチベーションRubyにしろ、C++にしろコン…

はてな記法で書いたテキストをローカルでプレビューする

ホテルのネットが絶望的に遅くて、はてな(グループ)にLogを書くときに非常にストレスフルなわけなのでして、どうにかしないと死ぬ。前も似たような感じで、ローカルはてなダイアリーっぽいことをやってた。 が、検索とかいらないので、とにかくプレビューだ…

動的にメンバ変数を生やす

メタプログラミングのメモ。 # -*- coding: utf-8 -*- class MyClass; end hash = {:test => "テストだよ"} MyClass.class_eval do hash.each_pair do |k, v| define_method(k) { v } end end my_class = MyClass.new puts my_class.test メタプログラミング…

メタプログラミングRubyをさらっと読んだ

さらっと、というよりは一発では分かりそうになかったので、というほうが正しいw。ちなみに本書を読む前の自分が持ってた知識レベルは動的ディスパッチ*1とevalの初歩ってくらいです。メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KA…

sinatraが動かなくなったので、でっちあげで動くようにする

年次大会の優秀発表賞を受賞したのを自分のホームページに書くかーと思ってさくらの自分のホームページを更新したりしていて、あれこれしていたら動かなくなったorz。先週末潰しても解決できず、今日やっと解決したのでメモ的に残しておく。明らかに対処法と…

メソッドの動的呼び出し

自分用メモ。単語のポジネガをぱっと見で確認するのに結果を色付きで見れると便利。Rubyでそういうgemを作っている人がいたので使わせてもらう。 GitHub - defunkt/colored: Colors in your terminal. Unmaintained. require "colored" puts "this is red".r…

Ruby ベストプラクティスのメモ書き

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック作者: Gregory Brown,高橋征義,笹井崇司出版社/メーカー: オライリージャパン発売日: 2010/03/26メディア: 大型本購入: 9人 クリック: 307回この商品を含むブログ (48件) を見る知らんこ…

Kindle用にPDFを取ってこさせる

pdfのtitleを適切に付けさせないと何のファイルか分けが分からなくなるのがkindleの欠点なので。 # -*- coding: utf-8 -*- require 'mechanize' require 'rss' require 'pp' agent = Mechanize.new rss = RSS::Parser.parse(ARGV.shift) prefix = "" prefix …

自分用メモ

現実逃避。mecab-ipadic-2.7.0-20070801/char.defとかを見つつ。16進数とかで漢字の範囲がどこからどこまでというような内容のが入っている。この辺詳しくないので、Rubyで確認。 (0x2E80..0x2EF3).each{|c|puts [c].pack("U")} この辺を頑張れば、文字種を…

LZ78方式符号化をRubyで実装、を改良

Trieちゃんと使ったので、それなりの速度になりました。100MBくらいのテキストが40MBくらいまで縮んだかと思えば、2.8MBのテキストが2.6MBにしかならなかったりと圧縮したいテキストの性質によって圧縮率が全然違う感じでした。WEB+DB PRESS Vol.54によると…

LZ78方式符号化をRubyで実装

してみたはいいけど、激しく遅い。なんでかなーと思って調べているとWEB+DB PRESS Vol.54にid:naoyaさんのPerlでの実装が載ってた。位置どこどこに何があったかを記録しておくような辞書を容易しておくようだ。そりゃ遅くなるな。。。なお、辞書はTrieでやる…

TokyoTyrantのRubyバインディングがMacでうまく動かないのではまってた

TokyoTyrantをMacで使ってて、以下のコードを実行するとinsertもlook upもうまくいかなかった。 # -*- coding: utf-8 -*- require 'tokyotyrant' db = TokyoTyrant::RDB::new # データベースオブジェクトを生成 db.open("localhost", 1979) # データベースサ…

Ruby1.9とTokyoCabinet

Ruby1.9でTokyoCabinetを使っていて、UTF-8な文字列をTokyoCabinetのHDB(ハッシュデータベース)につっこんでいって、getするとASCII-8BITで返ってくるということで大分はまっていた(Ruby1.9だと文字コード(String#encoding)まで一致しないと同じ文字列だと見…

Local Hatena Searchが紹介されてた

Local Hatena Searchはローカルにあるファイルを読み込んでブログ風に表示するソフトウェアだ。記法ははてな記法を使い、Sinatraを使ってWebブラウザ用に表示する。検索機能があるので過去のメモを掘り起こしたりするのも容易だ。 ローカルでもはてな記法で…

scanのブロックの引数

Ruby1.8からRuby1.9に変えてからGitHub - iwadon/text-hatena: A Ruby library for Hatena notationが動かなくなったので原因を調べてた。Ruby1.9だと下のようなコードはsyntax errorで死ぬんだけど、1.8だと通る。 l.scan(/([^\|]+)\|/) do |$_, *| if sub!…

Rubyとマルチバイト文字列

Ruby1.9に乗り変えようとしたら、案の定マルチバイト文字列の付近ではまっているのでメモ。初めてのRubyとか見つつ。 Ruby1.8 文字列は単なるバイト列 $KCODE対応しているメソッドは$KCODEの値によって振舞いを変えることがある String#inspectとか 正規表現…

pack&unpackの処理速度

DBとかに保存するために配列(数値が入ってる)をスカラーに圧縮したい。"joinしてsplit"するのと"packしてunpack"だと後者が絶対早いよなーとか思ったけど、どれくらい早いのか気になったので調べてみた。配列はランダムに作ったほうがいいのかな、、、と思い…

さくらインターネットでsinatraを動かそうとしたらはまった

というのはぐぐればいくらでも出てきそうな感じですが、それでもはまる僕はなんなんですかね。ということで設定とか。基本的にはSinatraをCGIでもThin等のアプリサーバでも使えるようにする書き方 - 思っているよりもずっとずっと人生は短い。と同じなんだけ…

UTF-8単位で1文字とか

Rubyならeach_charでいいんでしょうが、C++でそれと同じようなことをしようと思ったらよく分からなかったので。WEB+DB PRESS Vol.53のp108付近(検索エンジンのところ)のことをやりたかった。キモは (byte & 0xC0) == 0x80 の部分で まずUTF-8の符号方式では…

ollのRuby bindingを書いてみた

「ollはテキストファイル食わせれば、すぐ実行できるし必要ないかなー」とか思いながらも気がついたらなんか作ってました。 GitHub - syou6162/oll-ruby: wrapper for oll(http://code.google.com/p/oll/) READMEにも書いたけど oll = Oll.new("CW") oll.add…

ObjectSpace.define_finalizer

DBを閉じるetcがきちんとされることを保証したいが、RubyにはC++っぽいデストラクタがあるのかよく分からなかったので調べてみた。こんな感じで、できるっぽい。 class Bar attr_accessor :hoge def Bar.callback(file) proc { puts "bar" puts file } end d…

ローカルはてなもどきなアプリをリリースしました

ここで書いてたやつです。自分で使ってて使い勝手がよかったので、リリースしてみることにしました。githubからダウンロードしてください。 GitHub - syou6162/local_hatena_search: ローカルにあるはてな記法のテキストファイルをBlog風に表示&検索ができる…

最近はてなが遅い気がするので

なんか最近やたらと遅くないですか、、、ということでどうにかしないと日常生活に支障をきたす恐れがあるので、どうにかする*1。自分ははてダラを使って日記を書いているので、ローカルに全部テキストは持っている。ということで、このテキストを使ってロー…

wmaファイルをmp3に一括変換

オーディオ(ICレコーダー/リニアPCMレコーダー/ラジオサーバー) | オリンパスというICレコーダーを使っていて、結構音拾えるし、専用のケーブルなくても充電できたりで便利に使っている。しかしながら、保存されるファイル形式がwmaなので、macでは再生…

Dropboxから画像を集めてくる

某懇親会の画像をDropboxにおいてもらったのはいいのですが、クリックしながら収集とか死にそうだったので、ちょめちょめと書きました。 # -*- coding: utf-8 -*- require 'rubygems' require 'mechanize' require 'hpricot' agent = WWW::Mechanize.new (0.…

PRMLのfigureをゆーっくり落としてくる

ネットに繋がらないところでゼミの準備とかをしていて、「あ、PRMLのこの図を今の資料に入れたい!でも、ネットつながらねー」ということが時々あるので、じわじわと落としてくるスクリプトを書いた。寝る前にでも走らせておいてください。くれぐれもゆーっく…

MeCabで切った後の複合名詞に対して、部分文字列の組み合わせを考える

完全一致はしないけど、部分文字列で見ると専門用語があるという感じなので、分類したいデータは取りうる部分文字列の組み合わせの要素、ということになる。 def comb_of_substr(a) (1..a.length).map{|b| a.enum_cons(b).map{|c| c } }.inject([]) {|z, x| …

分類問題のための教師データの作成

6月の間は出現頻度と連接頻度に基づく専門用語抽出にある論文の考え方にそって、C++とかRubyで実装していた。しかし、どうも精度や再現率が低い。id:theclaさんに結果を見せてみたところ「おしいのは結構あるんだけどねえ」という感じで、(精度とかを測る時…

フォードファルカーソン法をRubyで実装

グラフに対する基本的な問題として 最小全域木 最短路問題 最大フロー の3つがあると思う。で、最小全域木は離散最適の課題としてPrim法を使って解いてみたし、最短路問題はベルマンフォードのアルゴリズムをRubyとC++で解いてみた。となったら、最大フロー…

ベルマンフォードのアルゴリズムで実行される結果も逐次表示

離散最適化理論の課題が出ていたので、ベルマンフォードのアルゴリズムを実装してみることにした。アルゴリズムが実行されていく様子の例もレポートに貼ろうと思ったんだけど、アルゴリズムはもうあるんだから、その様子をruby-graphvizとかで吐けばいいじゃ…

はてダラのテキストを検索する

恐らくこのブログを一番検索しているのはid:syou6162なんだけど、毎回http://d.hatena.ne.jp/syou6162から検索するのは面倒すぎる。日記ははてダラで書いているので、テキストはローカルにある。じゃあ、grepで探せよ、という話なんだけど、htmlで表示してく…

指標を全部実装してみた

この前の続き。先週の水曜で大体作ってしまっていたんだが、使い方ミスっててバグってると勘違いしていたorz。 出現頻度と連接頻度に基づく専門用語抽出 - Seeking for my unique color. とりあえずpneの1985年分のテキストを食わせて、それぞれの指標で上位…

トポロジカルソートのベンチマークらしきもの

離散最適化理論の課題を提出し終わったので、貼ってみるテスト。トポロジカルソートのためのところは前にちょちょいと書いたんですが 説明用の図 巨大なグラフを作る用の関数 計算時間をplotするための関数 などなどの付近も書いたので、貼ってみます。例を…

深いコピー?

なんかメモ。 tmp = ["hoge","fuga"] list =[tmp,"piyo"] pp list tmp.clear pp list 実行結果。 [["hoge", "fuga"], "piyo"] [[], "piyo"]

出現頻度と連接頻度に基づく専門用語抽出

この前の続き。先週の週末にやるつもりだったけど、暇がなかった。 MeCabで区切った単語を再びつなげる - yasuhisa's blog 前回の流れとしては 専門用語を一つの単語として取ってくるのは難しい MeCabを使うと細かくなりすぎる 専門用語には名詞のsequenceが…

系列アライメントのアルゴリズムをRubyで実装した

動的計画法分かんない しかも、なんか一次元じゃなくて二次元っぽいから怖い>< と思ってgkbrしていた次回アルゴリズムデザインのゼミで担当の系列アライメント(p246 6.6)のアルゴリズムですが、ミスドでホットカフェオレを3杯くらいおかわりしていたら結構…

コスト最小法によるViterbiアルゴリズムを実装してみた

前回は単語数最小法によるViterbiアルゴリズムを使って、「猫はうろうろ」を形態素解析しました。 www.yasuhisay.info 単語数最小法では、単語の品詞などは見ておらず、ただただ単語数を最小にするように動的計画法であるViterbiを動かしていきます。品詞を…

猫はうろうろ

にゃーにゃー、ではなくてw。情報学類(今名前変わったんだっけか)のほうで出ている自然言語処理の講義ほうで、形態素解析をするための「wikipedia:ビタビアルゴリズム(Viterbi algorithm)」というのを勉強しました(GWの前くらいに)。なんか全然分かっていな…

ダイクストラ法による最短路検索

昨日までに書いていたグラフはコストとかそういうの考えていなかったんだけど、ダイクストラをやろうということでコストも考えることにしました。ダイクストラでedgeとそこまでの距離のhashを作りながら、そこまでのを記憶しておくhashも用意。最短路を探す…

トポロジカル順序付け

トポロジカル順序付けは有向無閉路グラフ(directed acyclic graph)について定義されるものである。閉路がない有向グラフだと必ず順番のようなものを付けることができる。具体的にどういうものに使えるか、というと 仕事の順番 服を着る順番 講義科目の履修順…

全ての連結成分の集合を求める

有向グラフにおける連結成分の集合みたいなのがどうだったか忘れたので、無向グラフ化(両方を有向にするっぽい感じで)して考えることにした。 # -*- coding: utf-8 -*- require 'pp' require 'set' class Graph def initialize(edges) @edges = edges @nodes…

幅優先探索→深さ優先探索でした><

バックトラックとかしなくていいので、結構簡単にできた。 # -*- coding: utf-8 -*- require 'pp' class Graph def initialize(edges) @edges = edges @nodes = Hash.new{|h,k| h[k] = []} end def add_edge(edge) @edges.push edge unless @edges.index(edg…

グラフを扱うためのライブラリを覗いてみる

index グラフの勉強だけじゃなくてRubyの勉強にもなりそうなソースだなーと思ったので、メモしておく。ファイルは2つとなっていて把握しやすい。 graph.rb graph_algorithm.rb graph.rb module Graphとclass DirectedHashGraph、DirectedHashGraphを拡張した…

分割統治法の中のcounting inversionsを実装してみた

アルゴリズムデザインのゼミでmiyaga50が「counting inversions」について発表していた。 マージソートな考え方を使っているアルゴリズム 協調フィルタリングのようなランキングを使うようなシステムで使われる 嗜好がどれくらい違うかを測る尺度に使える メ…

Ruby&Perlでマージソート

数学的基礎とデータ構造 (アルゴリズムイントロダクション)のp28付近にあるマージソートをRubyでそのまま書きくだす簡単なお仕事。2行で書けるとかそんなの知るか。 require 'pp' def merge_sort(a, p = 1, r = a.length) def merge(a, p, q, r) n1 = q - p …

専門用語の辞書の加工

こんな感じになっている辞書から zygoma (解剖)頬骨 zygomatic 頬骨の zygomycete (生物)接合菌 zygomycosis (病名)接合菌症 zygote 接合体, 接合子 zygote nuclei (解剖)《複》接合体核 zygote nucleus (解剖)接合体核 zygotene 合糸期, ザイゴテ…

PNEのtxtからkeywordを引っこ抜く

専門用語の辞書を作りたい。そう考えるとPNEのkeywordとかはそのまま辞書の単語として登録できそうなので、引っこ抜いてくることにした。原型はここを参考にしつつ。 年ごとに頻度の高い単語をファイルに出力する - Seeking for my unique color. nkfにファ…

単語の登場回数がどういう分布をしているか見てみる

今日は講習会があっていたので、蛋白質核酸酵素のほうを調べるお仕事ができていなかったので、電車の中で書いてみる*1。単語の登場回数というのはたぶんlong tailをしているんだろうなーというのは予想がつくんだけど、どのくらいlong tailなのかを調べてみ…

いわゆる車輪の再開発をしていたようだ

卒論で頭がおかしくなっているらしい。普通に考えたらなんで自分で作るのか意味不明なんだけど、考えた時は書いた後だった。Text::Hatenaとかではてな記法をhtmlに変換してから、hprictで必要な要素を貫き出してもっかいText::Hatenaで加工してやればよいだ…