- 追加された行はこの色です。
- 削除された行はこの色です。
- Ruby へ行く。
* Rubyおぼえがき [#p53ffbf8]
Rubyでしょっちゅー忘れるコトのメモ
** 正規表現 [#e80498d7]
マッチ直後の結果は
$~
に格納されてる.
$~[0]
とかで参照可能.
** 連番置換 [#i9951294]
num= 100;
file= open("sample.txt")
text= file.read();
while true
/#\{[^\}]+\}/ =~ text;
if($~ == nil)
break;
end
if($~ != nil)
pb= $~[0];
# p pb;
text= text.gsub(pb, format("%03d", num));
num+= 1;
end
end
print text;
file.close();
** ftp関連 [#hde520ed]
require "net/ftp";
ftp= Net::FTP.new;
ftp.connect("192.168.xxx.xxx");
ftp.login;
ftp.passive= true;
ftp.chdir("sataraid1/disk1/...");
ftp.nlst; # 文字列配列が返る
あとは
URI.encode(STRING)
とかも覚えておくと便利.
ftp.list
でファイル一覧.以下スペース区切り.
+ ディレクトリ?[ "-" or "d" ]
+ 数値 \d
+ user
+ group
+ size
+ mon
+ day
+ time or year
+ file or name
** コマンドライン引数 [#m117519c]
ARGV[0] : プロンプトで入力された引数一個目から
$0 : コマンド名も拾える(Cの**argvと同じ)
** 何に使うのか [#je2db468]
1.upto(33){| x |
hex= format("%02x", x);
dec= format("%02d", x);
puts "http://sample.com/" + dec + "_" + hex + ".jpg";
}
** 何に使うのか(2) [#i1085201]
require "open-uri";
require "net/http";
prefix= "";
baseURLlist= [
];
baseDomain= "www.hoge.org";
0.upto(baseURLlist.length - 1){|i|
url= baseURLlist[i];
# ディレクトリの存在チェック
# ダウンロード先ファイルパス生成
outdir= url.split("/");
outdir= outdir[outdir.length - 2];
outdir= prefix + "/" + outdir;
if(FileTest.exist?(outdir) == false)
# ディレクトリ生成
Dir::mkdir(outdir);
Net::HTTP.start(baseDomain, 80) {|http|
response= http.get( url.sub("http://" + baseDomain, "") );
response.body.each_line{ |line|
filenum= line.scan(/>.+\.jpg</);
if(filenum.length > 0) # jpgファイル名を指定している行
filenum= filenum[0];
filenum= filenum.slice(1, filenum.length-2);
filenum= filenum.gsub(" ", "%20");
imgurl= url.sub(/\/index\.html$/, "/" + filenum);
imgurl= imgurl.sub("http://" + baseDomain, "");
puts imgurl;
# ダウンロード処理
File.open(outdir + "/" + filenum,"wb") do |f|
f.print http.get(imgurl).body
end
end
}
}
else # 既にディレクトリがあるとき
puts outdir + " already exist";
end
}
** カレントディレクトリのflacファイルをmp3に一括変換する [#d269f940]
マルチプロセスでマルチコアのメリットを活かす
#!/usr/bin/ruby
require("open3");
cmd= "flac --decode --stdout " +
"\"_inFile_\" | " +
"/home/who/src/lame-3.99.5/frontend/lame " +
"-V 5 -b 128 " +
"- " +
"\"_outFile_\"";
maxProcNum = 4;
coreUseFlag = [];
procFileName = [];
myStdIn = [];
myStdOut = [];
myStdErr = [];
myWaitThr = [];
0.upto(maxProcNum-1){|i|
coreUseFlag [i]= false;
procFileName[i]= "";
myStdIn [i]= nil;
myStdOut [i]= nil;
myStdErr [i]= nil;
myWaitThr [i]= nil;
}
files= [];
printf("proc for files: \n");
Dir::glob("*.flac"){|f|
files.push(f);
printf(" %s\n", f);
}
controllerThreadState= true;
# controller thread ########################################
Thread.fork {
while(true)
# assign one process
cix= coreUseFlag.index(false)
if( cix != nil )
if(files.size() > 0)
# raise proccess
fileName= files.pop();
cmdbuf= cmd.gsub("_inFile_", fileName );
cmdbuf= cmdbuf.sub("_outFile_", fileName.sub(/\.flac$/, ".mp3") );
# printf(":::: command :::: %s\n", cmdbuf);
printf(":::: run : %s\n", fileName);
myStdIn[cix],
myStdOut[cix],
myStdErr[cix],
myWaitThr[cix] =
*Open3.popen3( cmdbuf );
# check flag
coreUseFlag[cix] = true;
procFileName[cix]= fileName;
else
# printf("no more target file\n");
end
else
# printf("no empty slot.\n");
end
# check wait thread
aliveThread= false;
0.upto(myWaitThr.size()-1){|i|
if(myWaitThr[i] != nil)
aliveThread= true;
# printf("%s\n", myStdOut[i].getbyte() );
# printf("%s\n", myStdErr[i].readbyte() );
if(myWaitThr[i].alive? == false)
coreUseFlag[i]= false;
printf( ">>>> file: %s \n is done\n", procFileName[i]);
myStdOut[i].close();
myStdErr[i].close();
myStdIn[i].close();
myWaitThr[i] = nil;
end
else
# printf("myWaithThr[%d] is empty\n", i)
end
}
# myWaitThr are all nil and
# no more file?
if((aliveThread == false) &
(files.size() == 0))
break;
end
# output stream
sleep(1);
end
controllerThreadState= false;
}
# wait for controller thread
while(true)
sleep(1);
if(controllerThreadState == false)
break;
end
end