Rubyおぼえがき †Rubyでしょっちゅー忘れるコトのメモ 正規表現 †マッチ直後の結果は $~ に格納されてる. $~[0] とかで参照可能. 連番置換 †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関連 †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 でファイル一覧.以下スペース区切り.
コマンドライン引数 †ARGV[0] : プロンプトで入力された引数一個目から $0 : コマンド名も拾える(Cの**argvと同じ) 何に使うのか †1.upto(33){| x | hex= format("%02x", x); dec= format("%02d", x); puts "http://sample.com/" + dec + "_" + hex + ".jpg"; } 何に使うのか(2) †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に一括変換する †マルチプロセスでマルチコアのメリットを活かす #!/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 |