背景
rubyで遅延評価のため、ブロック付きメソッド(内部でyieldを呼ぶメソッド)を作ることがある。
例えばこんなの
def aaa(list) do
list.each do |x|
yield x
end
end
遅延評価のときは、
aaa([1,2,3]) do |x|
puts x
end
とすればよいだろう。
ところが、 . . . 本文を読む
背景
メッソドチェインは便利(?)だけど、チェインの構成要素を単体テストするときに困る。
そこでブロックをlambdaなどで変数化したいと思うが、そのlambda内でyieldしたいときがある。
例えば、
a = lambda { |t,x|
(1..t).each {
yield x
}
}
a.call(10000, 'abc') { |x|
p . . . 本文を読む
背景
guardという、自動テストなどを走らせることが出来る環境がある。
Guardfileというものに、どれを監視して実行させるか書くことが出来る。
これが結構優れていていて、変更のあったファイル名の一部を利用したテストファイルを実行するというようなルールが書けるので
無駄なテストを走らせることがない。
自分は rspec を使っているので、Guard::RSpecを導入しよう . . . 本文を読む
背景
rubyで重み付きルーレット選択をする時のワンライナー。
rubyでルーレット
rubyにprefix sumまたはscan(mapとreduceが合わさったような関数)が用意されていればいいが、ないので、sumの部分は外出しで、次のように書いた。
ruby -e 'r=rand;s=0;p [0.1,0.3,0.6].map.with_index{|a,i|[s+=a,i]}. . . . 本文を読む
背景
[true,true].reduce(:||)
などとすると、「NoMethodError: undefined method `||' for true:TrueClass」
と怒られる。
[true,true].reduce(:|)
とすると(縦棒一本)、「true」が返ってきて、はて?と思ってしまう。
結論
エラーにも有るように、||はメソッドではない . . . 本文を読む
背景
使わない人は滅多に使わないcutコマンドだが、cut -f1,2,3,5 みたいにフィールドを指定するだけで、便利に使える。
だがとても残念なことに、フィールドの順序は決められない。例えば、cut -f5,3,2,1としても、cut -f1,2,3,5として扱われる。
対処方法
結論からすると、cut コマンドでフィールドの順序を変える方法はない。
rubyのワンライナー
くそっ . . . 本文を読む
背景
0に非常に近い実数値は、指数関数表現で問題なく表される。
一方、確率など扱う場合など、1に非常に近い値も扱うこともあるが、その場合、丸められてしまう。
例えば、
irb> 1.0-0.0000000000000001
=> 1.0
など。その場合、1-xのxだけを計算すればよいのだが、対数(log)を計算した時がある。
そんなとき、そのまま入れても、
irb> M . . . 本文を読む
背景
複数のマシンで同じコマンドを実行したい、そんなときに限り、sudoでパスワード聞かれ、面倒に。検索したところ、expectを使ったものが見付かった(参考:Rubyで exptect や ptyを使ってパスワードを自動入力する)。
かなりやりたいことと近かったが、expectで待ち構えるパターンが複数のときが分からなかったため、rubyのexpectのソースを参考に次のように
作成した。 . . . 本文を読む
rubyでxmlを検索するとREXMLが出てくるが遅い。
そこでLibXMLに移植したがそのメモ。
移植のためのコードレベルの対応表。
処理内容
REXML
LibXML
ライブラリ読み込み
require 'rexml/document'
require 'libxml'
include LibXML
. . . 本文を読む
rubyで線形関数の最小二乗法(linear least squares)の関数を、[Ruby] 最小二乗法で配列内の値の傾きを得る関数と今日の最小二乗法を参考に書いてみた。というより、むしろ、今日の最小二乗法にrubyだと難しいみたいなことが書いてあったので書いてみた。
def linear_least_squares(list)
b = c = d = e = 0.0
lis . . . 本文を読む
巨大なテキストファイル(例えば500M、すみません、それほど巨大ではありません。)をランダムソート(例えばsort -R)しようとするとソートのアルゴリズムが走るためか、非常に時間がかかる。ところがランダムソートは厳密にはソートする必要がないはずである。そこでバケットソートのバケツをランダムに行うことを提案する。その方法は、複数の一時ファイルを作成し、それらのファイルにランダムに格納し、それを結合 . . . 本文を読む
文字列の出現数のカウントする手段としてよくcutなどと組み合わせて、 sort | uniq -c などが用いられるが、sortしなければならないので、ちょっと時間がかかる。そこでrubyのワンライナー
ruby -ne 'BEGIN{$h=Hash.new(0)};END{$h.each{|kv|puts kv.join("\t")}};$h[$_.chomp]+=1'
注意としては s . . . 本文を読む
結論 rubyでandとor(できればnotなんかも)は使ってはいけない。
理由論理演算子を使った式を見て頂きたい。
irb> true || true && false
=> trueこれは想定通り。ではandとorを使った場合はどうか。
irb> true or true and false
=> false
ぐはー。結果が違う。
なぜなら、&&と||に . . . 本文を読む
perlなどでは正規表現のオプションで、"g"というグローバルマッチ(global match)のオプションがある。rubyにはそのようなオプションがないが、正規表現とString#scanを使うことで同様のコードを実現できる。
文字列.scan(/正規表現/) do |マッチした文字列|
処理…
end下記はirbでの実行例。irb> 'This is the pen.'.scan(/th\ . . . 本文を読む
apacheのログはダブルクォートがあったり、かぎかっこ[]があったりと色々と面倒である。これをsplitの正規表現で表すと、"([^"]+)"|(\[[^\]]+\])|(\S+となる。これはダブルクォートは外してある。この場合、空白文字が残ってしまうので、reduce([]){|s,e|(e==" ")?s:s+[e]}で除去し、また最初を取り除くため、[1..-1]を追加する必要がある。実際 . . . 本文を読む