Top / Ruby

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

でファイル一覧.以下スペース区切り.

  1. ディレクトリ?[ "-" or "d" ]
  2. 数値 \d
  3. user
  4. group
  5. size
  6. mon
  7. day
  8. time or year
  9. file or name

コマンドライン引数

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
Link: MenuBar(152d) ,
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.