Top / 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

Site admin: kam1610, PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji. Powered by PHP 5.2.17.