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++で解いてみた。となったら、最大フロー…