中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

rubyでブロック付きメソッドからArrayを取得

2015-06-23 11:38:27 | ruby
背景 rubyで遅延評価のため、ブロック付きメソッド(内部でyieldを呼ぶメソッド)を作ることがある。 例えばこんなの def aaa(list) do list.each do |x| yield x end end 遅延評価のときは、 aaa([1,2,3]) do |x| puts x end とすればよいだろう。 ところが、 . . . 本文を読む

rubyのlambda内でyieldする

2015-05-29 15:03:15 | ruby
背景 メッソドチェインは便利(?)だけど、チェインの構成要素を単体テストするときに困る。 そこでブロックをlambdaなどで変数化したいと思うが、そのlambda内でyieldしたいときがある。 例えば、 a = lambda { |t,x| (1..t).each { yield x } } a.call(10000, 'abc') { |x| p . . . 本文を読む

Guard::RSpec が無反応だった時やったこと

2015-05-15 10:37:32 | ruby
背景 guardという、自動テストなどを走らせることが出来る環境がある。 Guardfileというものに、どれを監視して実行させるか書くことが出来る。 これが結構優れていていて、変更のあったファイル名の一部を利用したテストファイルを実行するというようなルールが書けるので 無駄なテストを走らせることがない。 自分は rspec を使っているので、Guard::RSpecを導入しよう . . . 本文を読む

rubyで重み付きルーレット選択(乱択)のワンライナー

2015-01-06 13:36:39 | ruby
背景 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]}. . . . 本文を読む

cutコマンドのフィールドの順序

2014-07-08 19:07:48 | ruby
背景 使わない人は滅多に使わないcutコマンドだが、cut -f1,2,3,5 みたいにフィールドを指定するだけで、便利に使える。 だがとても残念なことに、フィールドの順序は決められない。例えば、cut -f5,3,2,1としても、cut -f1,2,3,5として扱われる。 対処方法 結論からすると、cut コマンドでフィールドの順序を変える方法はない。 rubyのワンライナー くそっ . . . 本文を読む

1に近い値の対数の近似

2014-02-17 15:01:37 | ruby
背景 0に非常に近い実数値は、指数関数表現で問題なく表される。 一方、確率など扱う場合など、1に非常に近い値も扱うこともあるが、その場合、丸められてしまう。 例えば、 irb> 1.0-0.0000000000000001 => 1.0 など。その場合、1-xのxだけを計算すればよいのだが、対数(log)を計算した時がある。 そんなとき、そのまま入れても、 irb> M . . . 本文を読む

複数のマシンで実行しパスワードを求められたら入力するスクリプト

2014-01-15 18:11:55 | ruby
背景 複数のマシンで同じコマンドを実行したい、そんなときに限り、sudoでパスワード聞かれ、面倒に。検索したところ、expectを使ったものが見付かった(参考:Rubyで exptect や ptyを使ってパスワードを自動入力する)。 かなりやりたいことと近かったが、expectで待ち構えるパターンが複数のときが分からなかったため、rubyのexpectのソースを参考に次のように 作成した。 . . . 本文を読む

rubyで線形関数の最小二乗法(linear least squares)

2013-11-12 13:46:47 | ruby
rubyで線形関数の最小二乗法(linear least squares)の関数を、[Ruby] 最小二乗法で配列内の値の傾きを得る関数と今日の最小二乗法を参考に書いてみた。というより、むしろ、今日の最小二乗法にrubyだと難しいみたいなことが書いてあったので書いてみた。 def linear_least_squares(list) b = c = d = e = 0.0 lis . . . 本文を読む

巨大なテキストファイルを高速に「シャッフル」するrubyワンライナ

2013-09-10 15:38:57 | ruby
巨大なテキストファイル(例えば500M、すみません、それほど巨大ではありません。)をランダムソート(例えばsort -R)しようとするとソートのアルゴリズムが走るためか、非常に時間がかかる。ところがランダムソートは厳密にはソートする必要がないはずである。そこでバケットソートのバケツをランダムに行うことを提案する。その方法は、複数の一時ファイルを作成し、それらのファイルにランダムに格納し、それを結合 . . . 本文を読む

rubyでグローバルマッチをするときはString#scanを使う。(修正)

2011-04-15 16:10:21 | ruby
perlなどでは正規表現のオプションで、"g"というグローバルマッチ(global match)のオプションがある。rubyにはそのようなオプションがないが、正規表現とString#scanを使うことで同様のコードを実現できる。 文字列.scan(/正規表現/) do |マッチした文字列| 処理… end下記はirbでの実行例。irb> 'This is the pen.'.scan(/th\ . . . 本文を読む

apacheのログをtsv形式にするsplitの正規表現とワンライナー

2011-03-02 14:14:32 | ruby
apacheのログはダブルクォートがあったり、かぎかっこ[]があったりと色々と面倒である。これをsplitの正規表現で表すと、"([^"]+)"|(\[[^\]]+\])|(\S+となる。これはダブルクォートは外してある。この場合、空白文字が残ってしまうので、reduce([]){|s,e|(e==" ")?s:s+[e]}で除去し、また最初を取り除くため、[1..-1]を追加する必要がある。実際 . . . 本文を読む