ruby

ruby内でwgetとconvert(imagemagick)を使って中間ファイルを作らずにmimeエンコードする方法

cygwin内のrubyだとpipeがつかえないので外部プログラム呼出で逃げる >> url='http://www.google.co.jp/intl/ja/images/google_sm.gif' => "http://www.google.co.jp/intl/ja/images/google_sm.gif" >> puts [`wget -q -O - #{url} | convert -quality 30 -r…

デコメールをrubyから送る方法

rubyでおくるとき - 計算機と戯れる日々では色つき文字や画像を添付する送り方をアップしていなかったことに今日気がついた。なんのための備忘録だろうか(笑ということでさらす。 #!/usr/bin/ruby require 'net/smtp' Net::SMTP.start( 'smtpServerAddress'…

rubyでクイックソートを書いてみる。

そういえば今までrubyでは .sortをつかって知らない振りをしていたんだがrubyで書くとどうなるかやってみる。 >> def qsort(x) x.size<2?x:(y=x.shift;z=x.partition{|i|i<y};[qsort(z[0]),y,qsort(z[1])]) end => nil >> qsort([3,4,5,1,1,2]) => [[[], 1, [[], 1, [2]]], 3, [[], 4, [5]]] >> def </y};[qsort(z[0]),y,qsort(z[1])])>…

irbのプロンプトをシンプルにする。

以前から気になっていたんだが、irbのプロンプトに余計なものが出過ぎていたので.irbrcを以下のようにした。 IRB.conf[:PROMPT_MODE] = :SIMPLEこうするとマニュアルの記述はirbの出力だったことがわかる。 $ irb >> 1+2 => 3 >>

(続)Arrayオブジェクトにもの申す

1.7からのArray#fetchが未チェックだったことが判明。 (ありがとうございます>id:winebarrel さん)ということで、書き直す。 #!/usr/bin/ruby class Array def [](i) self.fetch(i) end end a=Array[1,2,3] puts a[0] # =>1 puts a[2] # =>3 puts a[3] # =…

例外が怒っても安心して終了するには

例外の書き方 begin raise if ... ... raise "a" resuce 例外クラス ...処理 rescue 例外クラス ...処理 rescue ....上の例外以外のもの時実行される else ....例外が起きなかったとき実行される ensure ...最期に必ず事項される。(後処理) endgetsとちが…

Arrayオブジェクトにもの申す

irb(main):001:0> [1,2,3][3] => nil何故、例外を起こさない!!*1と、いうことで例外を起こすようにArray#[]を再定義してみる。 #!/usr/bin/ruby class Array def [](i) raise IndexError unless self.size>i.abs self.at(i) end end a=Array[1,2,3] puts a…

正規表現でマッチした文字列だけすぐほしいとき

結論 マッチデータ全体がほしいとき /Regexp/=~str&&$& 部分がほしいときには /Regexp/=~str&&$n 恥 マッチが失敗することを考慮するときにはto_a[1]を投げれば良かったんじゃないか でも、短いしperlでも使える。よしとしよう。 $ perl -e 'print "abc"=~/.…

テーブル作るぞ

0> [["label","t1","t2","t3"],["A",1,2,3],["B",4,5,6],["C",7,8,9]].inject([]){|r,a|r==[]?r.push(a):a.each_with_index{|v,i|i==0?r.push(v):puts([r[0][i],r[-1],v].join(","))};r} t1,A,1 t2,A,2 t3,A,3 t1,B,4 t2,B,5 t3,B,6 t1,C,7 t2,C,8 t3,C,9 =>…

集計データを通常のテーブルに変換する

集計データを通常のテーブルに直す為のプログラムを考える。まず元データを用意する。 $ echo -e "title,label1,label2,label3\nA,1,2,3\nB,4,5,6\nC,7,8,9\nD,10,11,12" title,label1,label2,label3 A,1,2,3 B,4,5,6 C,7,8,9 D,10,11,12ファイル書けって説…

レコードを作る。

a1,a2,a3,b1,b2,b3,c1,c2,c3 d1,d2,d3,e1,e2,e3,f1,f2,f3 ...以上のデータが a.txtに入っているとして cat a.txt|sed 's/,/\n/g'|ruby -e 'while !STDIN.eof? ; print [gets,gets,gets].map{|i|i.chop}.join(","),"\n" ; end'でよい。例 $ seq 12|ruby -e 'w…

スロットを一バイトづつずらしながらターゲットの数値を探す。

コマンドラインの精進のためのネタとしてやってみることにする。もちろん目的はHPをマックスにすること。 ひとつのセーブデータしかない状態にする。 HPが271のデータをメモリカードデータから探す。 ひさしぶりのunpack $ cat epsxe000.mcr| ruby -e 'a=STD…

DBみたいにして遊ぶ

最近、コマンドラインが大好きで…最期のとかSQLみたいな気が…しないな(笑 echo -eをおぼえて良かった。 配列の添字が0,1,2なのがちょっと寂しいぐらいか。 $ echo -e "1 2 3\n4 5 6\n7 8 9" 1 2 3 4 5 6 7 8 9 $ echo -e "1 2 3\n4 5 6\n7 8 9" | ruby -ane…

一行どころの話じゃない(笑 やっぱ、短いプログラムにはLLの方が有利だな… $ ruby -e 'puts ARGV.join(" ")' $ ruby -e 'puts ARGV.join(" ")' aaa aaa $ ruby -e 'puts ARGV.join(" ")' "aaa bbb" aaa bbb $ ruby -e 'puts ARGV.join(" ")' "aaa bbb" ccc …

やっぱこっちの方が慣れてるな。一分かからなかった。 $ ruby -e 'ARGV.each{|i|print open(i).read}' $ ruby -e 'ARGV.each{|i|print open(i).read}' a.txt b.txt foo bar buzz buzz bar foo

FizzBuzz解いてみた。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。ちゃんとしたプログラマであれば、これを実行するプログ…

コマンドラインでコマンドかファイルかを判断する。

まあ、いつか使えるかもしれないので残しておく。 irb(main):018:0> s="ls aaa|cat bbb|echo aP";a,*d=s.split(/\||;/).map{|i|i.split(/\s/)}.pop;if /(.*)P/.match(a) then ["command",$1] else until /(.*)P/.match(d.shift); end; ["file",$1] ;end => […

パターンマッチ

なんか、昔気がついていた気がするんだが最近組まなくなって久しかったので忘れていた気がする。 /./=~cgi['a'] /./.match(cgi['a'])でやると1.8系列では全部通る。1.6ではcgiを組まないこと。理由としては、1.8.1のCGI::QueryExtension::Valueクラスでの=~…

日本語を含む文字列を指定バイト以内で切り出す

karoに教えてもらった require 'jcode' $KCODE="euc" def foo(s,n); s.chop! while(s.size>n); s; end; foo('abcあいうdef',6)なんかこれの為だけに先頭で関数宣言するのも格好悪いし(教えてもらってなんたる言いぐさ)、ループで書き直してみた s='abcあい…

whileの返値のなぞ

前エントリによりlispと比較しながらrubyのwhileの謎を追究してみる(若干)lisp(gosh)の場合は以下のように、if,whileともに最後に評価した式の値を返す。 gosh> (if #t 'true 'false) true gosh> (if #f 'true 'false) false gosh> (while #f 'dammy) #tと…

中間ファイルを作らずに外部コマンドでフィルタを実行する

io.close_writeしないとio.readでとまってしまう。 io = IO.popen("convert -resize 100x100 - gif:- ","r+") io.write(File.open("aaa.jpg") io.close_write print [io.read].pack("m") #output base64

daemon

rubyでdaemonを作るためには #!/usr/bin/ruby -Ke exit if fork #ここからdaemonの動き Process.setsid sleep 10 exitどうも1.9から Process.daemonが使えるようだ。