読者です 読者をやめる 読者になる 読者になる

あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

Ruby

rubyのスクリプトをwindowsのショートカットから呼び出す

久々にRuby。 いつもはruby使いたいときはcygwinから呼び出してたんですが、 日常的な処理はショートカットで実行したいと思いました。

invalid multibyte char (US-ASCII)

cygwinのruby更新したら1.9.3になりまして、エラーが出るようになりました。 「invalid multibyte char (US-ASCII)」1.9ではソースのエンコードがUS-ASCIIになってるそうで、cygwinのutf-8とは違っちゃうんで、以下の記述が必要になるようです。ちゃんと直り…

Webサイトの更新を監視してメール通知する

必要に迫られて、特定の監視サイトを監視するスクリプトを作りました。 環境はLinux。面倒を省くため、system()でLinuxコマンドをバシバシ呼び出すし、定期実行はcronに任せます。サイトの一部を抽出することを”スクレイピング”というそうです。 ただ、Webで…

cygwin1.7x対応

HDDが逝ってしまいOSから何からインストールする羽目になったわけですが、cygwinが大幅アップデートされており、以前のrubyプログラムが上手く動かなくなってしまいました。 調べたところ、文字コードがUTF-8になっているそうです。なので対応としては $KCOD…

引数とリダイレクトを使うとARGFが使いづらい

ARGFは便利なのですが、挙動にクセがあります。 引数がないと、STDINと同等。よって " 引数があると、引数をファイル名として扱い、そのファイルが展開される。 なので、以下の呼び出しをすると、ARGFは同じ挙動になります。 $> non_arg.rb non_arg.rb list.…

YAMLを用いた状態の保存、復帰

require 'yaml' hash_data = { "item1" => "hoge", "item2" => "fuga", } array_data = [ 1, 2, [31, 32] ] # 保存 f = open("config.yaml", "w") f.write(YAML.dump(hash_data)) f.write(array_data.to_yaml) #YAML.dumpと同等 f.close # 復帰 # YAMLが1ブ…

Dir#glob結果の利用

p "===== unsorted ==========" Dir.glob("**"){|f| p f } p "===== sorted ==========" Dir.glob("**").sort{|lhs, rhs| File.mtime(lhs) <=> File.mtime(rhs)}.each{|f| p f }結果 $ ../test.rb "===== unsorted ==========" "a.txt" "b.txt" "c.txt" "===…

高度な置換

str = "[00-01-30] hoge" p "原文:" + str p str[/00/] = "99" # [] で簡単に置換 p str.gsub(/01/, "88") # gsubで置換. p str.gsub(/([^-])(\d\d)/, "[**") # ()で分割 p "結果 $1:" + $1 + " , $2:" + $2 # すると、結果が$1, $2...で利用できる p str.gs…

メソッドで文字列を先頭にくっつける

先日つまづいたところ。 最後にくっつけるのであればString#concatでいいんだけど、先頭に追加する方法がわからない。 そもそもメソッドに渡された引数(レシーバ?)の位置付けがイマイチわからない。 結局返り値で更新することにしてみたけど、もっとスマ…

AH-K3001Vのアドレス帳をWX320Tに移す

ヨドバシのに〜ちゃんは「付属のソフトで移せます」って言ってたのに全然移せない! AH-K3001V側の京セラユーティリティはkkcって独自バイナリじゃないとエクスポートできない! WX320TはvcardかOutlookかOutlookExpressでないとインポートできない! なんつ…

ファイルコピー(上書きしない)

sce_path = /home/hoge tgt_path = /home/fuga Dir::glob(src_path + "/*").each {|f| # fにはフルパスが入る if (FileTest.file?(f) == false) then next end if (FileTest.exist?(tgt_path + "/" + File::basename(f)) == true) then next end FileUtils.c…

シェルのコマンド実行

ls = "ls -l" system(ls) p "do ls" # systemは制御が返る exec(ls) p "dodo ls" # execは制御が返らないなんだ。簡単なことだった。popenとか使ってたのが馬鹿みたいだ。

スレッド

require "thread.rb" #for SizedQueue p Thread.main p thmain = Thread.current #mainのはず. queue = SizedQueue.new(10) #スレッド間受け渡しのためにQueueを用意. p th = Thread.start{ i = 0 p th_self = Thread.current while 1 queue.push(i) i += 1 …

FileUtils

require 'FileUtils' FileUtils.cp("txt.txt", "txt2.txt")FileUtilsはUNIXのファイル操作シェルコマンドの多くを提供する。 メソッド 概要 cd cd chmod chmod chmod_R chmod -R chown chown cmp cmp compare_file cmp identical? cmp copy_entry cp -R copy…

分岐

i = 0 begin if i == 0 #Cのif文 i += 1 elsif i > 10 #Cのelse if i -= 3 else #Cのelse i *= 2 end #endで終端する print i.to_s + "," end while i < 20 case i #Cのswitch when 0, 1 #Cのcase. ','でor条件を並べる print "i<2" when 20 print "i==20" e…

繰り返し

for i in 0..10 do #Cのfor. inでレンジを与える print "a" end print "\n" (0..10).each do |i| #レンジのメソッドで行うfor print 'b' end print "\n" i = 0 while i < 10 #Cのwhile. print i += 1 end print "\n" begin #Cのdo-while print i += 1 end wh…

文字列から数値への変換, 数値から文字列への変換

str = "31.4" p str.oct #=>25 文字列を8進数として解釈 p str.hex #=>49 文字列を16進数として解釈 p str.to_i #=>31 文字列を10進数として解釈 p str.to_f #=>31.4 文字列をfloatとして解釈 num = 31.4 p num.to_s #=>"31.4" 数値を文字列に変換to_iなどは…

ヒアドキュメント

str = <<"end_of_doc" #ヒアドキュメントの開始.終了文字列を指定している hoge1 hoge2 hoge3 end_of_doc #↑最初に指定した終了文字列.前後に空白などがあってはならない p str str = <<`end_of_command` #``でくくるとshellでの実行結果を文字列として格納 …

正規表現-バックリファレンス

str = "abcdefghijklmnop" if str =~ /(abc)/ #()でくくったものは後で使える p $1, $2 end if str =~ /((a)bc)/ #()は入れ子が可能.左から$1,$2,$3... p $1, $2, $3 end str = "abcabca" if str =~ /((a)bc)\1\2/ #\1,\2,...はその前に一致した()内正規表現…

日時、時間の扱い

#ruby 1.8.4のせいかABBR_DAYNAMESが使えないようなので用意した youbi = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] print time = Time.now #現在時刻を与える print "\n%04d/%02d/%02d (%s)\n" % [ #日時の出力 time.year, time.month, time.day,…

子プロセスの生成

is_parent = fork() #子プロセスの生成 if (is_parent) #親の場合process IDが、子の場合nilが返る Process.wait #子プロセスが終了するまで待つ p "parent : " + is_parent.to_s else p " child : " + is_parent.to_s exec("ls -l") #プログラムの起動.この…

バイナリ入出力

array1 = [1, 1.3, 2.3, 10] array2 = [1, 2, 3, 4] f = open("hoge.bin", "wb") f.write array1.pack("iffi") #01 00 00 00 66 66 A6 3F 33 33 13 40 0A 00 00 00 f.write array2.pack( "i*") #01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 f.write ar…

明示的なGC

file = "hoge.txt" open("tempfile", "wb").write open(file).read open("tempfile", "rb").each{|line| p line }2行目で書いたファイルを3行目で読もうとするが、出力されるのは途中まで。何故か。 IOは非同期*1で読み書きしており、closeされるか明示的にf…

コマンド入出力.パイプ

ls_out = `ls -l` #``内のコマンドの結果をStringとして扱う pp = open("|grep A", "r+") #openの先頭に|をつけるとパイプ入力. pp.write ls_out #モード:w,r,r+. pp.close_write #結果はwriteをcloseしないと取得できない. print pp.read pp.closeopen("|ho…

正規表現

reg = Regexp.new(/o/) # 正規表現生成 ARGF.each do |line| # if reg =~ line # 正規表現マッチ if /o/ =~ line # 正規表現直書き print line.gsub!(/o/,"*") # 全範囲置換. end end

CVSの扱い(文字分割)

str = "hoge1,ag,fupi" array = str.split(/,/) #正規表現で分割文字を指定 array.each do |word| puts word end a,b,c = str.split(/,/) #多重代入.それぞれに順番に代入される p array.join(" ") #arrayをStringに結合.分割文字' '

メソッドの作成

def func1(a,b) #defで始まる p self #親を表示 print a,b end #終わりはend func1("hoge1", "hoge2")

ブロックつきメソッド

def func3(a,b) print a + b + "\n" print yield("1fuga","2fuga") end # func3("hoge1", "hoge2"){|a,b| a.chop! + b.chop! }関数内でyield()関数を使うと、関数を呼んだときにyield()の動作自体を指定できる

classの作成, 変数の種類、継承、モジュール

class C1 #クラス名は大文字. Pi = 3.14 #大文字で始まるのは定数. @@foo_c = 0 #@@で始まるのはクラス変数. (=staticメンバ) def initialize(arg) #newの時に呼ばれる. print "initialize[" , @@foo_c , "]\n" @foo = true #@で始まるのはインスタンス変数.…

ディレクトリアクセス

# "." ".."も返る. サブディレクトリでも "hoge.txt"が返る. Dir.foreach("./") { |file| p file } # Dir.foreachと同じ Dir.entries("./").each{ |file| p file } # 一致するファイルに対して処理を行う. # **で再帰的に. (hoge/hoge.txtが返る) Dir.glob("…

変数

hoge = "Hello" # 代入 hoge2 = hoge # 変数間で代入 p hoge + "," + hoge2 #---以下、初期化済み変数-----. p "[$0]" # 実行しているファイル p $0 p "[$KCODE]" # 文字コード p $KCODE p "[RUBY_VERSION]" #rubyのバージョン p RUBY_VERSION p "[$stdin]" …

リテラル

p "string" # String p 1 # Fixnum p 1.23 # Float p [10,20,[31,32]] # Array p /hoge/ # Regexp p h = {"hoge" => 2, "fuga" => 3} # Hash リテラルでpできない.

object.method.

str = "Hello world!" p str p str.size # =>12 p str.swapcase # =>hELLO WORLD! p str.chop # 最後の1文字を削る p str.chop! # 最後の1文字を削る(オブジェクト自体に影響) p str.chop # 最後の1文字を削る

条件分岐

i = 1 while true #while(無限ループ) if i == 10 #if文 break elsif i == 9 # nop else i = i + 1 end #ifに対応 end # whileに対応 puts "loop end" puts i

コマンドライン引数の使用

# ARGVはコマンドライン引数のArrayオブジェクト. 空になるとnilが返る. # rubyコマンドの最初の-で始まらない引数がファイル名.それ以降がスクリプトの引数 p ARGV[0] #1つめの引数 while hoge = ARGV.shift # 全ての引数に対しての処理 print hoge,", " end

print, get

# print.get. puts "puts1" # 引数指定1 puts("puts2") # 引数指定2 print "print\n" # printは改行を明示的に printf "print%s\n", "2" # Cのprintfと同様 print sprintf("print%d\n", 3) # Cのsprintfと同様 print "print%d\n" % [4] # sprintfと同様 p "p…

file open

file_name = "input.txt" fd = open(file_name) # ※ while line = fd.gets # ※ puts line end fd.close end※部分は以下のようにも書ける(closeが要らなくなることもある) open(file_name) do |fd| # イテレータを使用while line = fd.gets File.foreach(file…