hirax.net::Keywords::「スクリプト」のブログ



2009-06-04[n年前へ]

rubyscript2exe.rb の Frozen String error 

Rubyスクリプトを単独で動作可能なアプリケーションにしてくれるのが RubyScript2Exe(rubyscript2exe.rb)だが(参考記事)、Rubyのバージョンによっては"Frozen String error"を吐いて、動かない場合がある。そんな場合は、 rubyscript2exe.rb and Frozen String errorより、rubyscript2exe.rbの621行目

#$0.replace(File.expand_path("./init.rb"))
$_0=File.expand_path("./init.rb")  
alias $__0 $0  
alias $0 $_0  
に変える。これで動くようになる。($0はスクリプトの起動パスを示す"定"数です)

Windows VISTAとXPの「バッチファイルの動き方」の違い 

 Windowsでファイルを加工するスクリプトを作り、処理するファイルをドラッグアンドドロップして使うことができるように、バッチファイル(*.bat)を書いた。つまり、たとえば、こんなようなバッチファイルを書いた。

perl hoge.pl %1
 ところが、こんなバッチファイルを使おうとすると、Windows VISTA では意図した通りに動くのに、Windows XPでは動かないのである。

 その原因を追いかけてみると、バッチファイルを起動したときの挙動がWindowsのバージョンによって異なっていることが原因だった。あるいは、コマンドプロンプトのカレントディレクトリがどうなっているかを、私が意識していなかったことに原因があった。

 どういうことかと言うと、Windows VISTA では、バッチファイルをダブルクリックした時には、そのバッチファイルがあるディレクトリを「カレントディレクトリ」として起動したコマンドプロンプト内でバッチファイルに書かれた内容が処理される。ところが、バッチファイルにファイルをドラッグアンドドロップすると、そのバッチファイルは「ドラッグアンドドロップしたファイルがあるディレクトリ」をカレントディレクトリとして、コマンドプロンプトが起動し処理が行われる、という挙動になる。

 しかし、Windows XP では、『バッチファイルをダブルクリックすると、そのバッチファイルがあるディレクトリを「カレントディレクトリ」として起動したコマンドプロンプト内でバッチファイルに書かれた内容が処理される』というところまでは同じなのだが、バッチファイルにファイルをドラッグアンドドロップした場合には、そのバッチファイルは"C:\Documents and Settings\ユーザ名"をカレントディレクトリとして起動したコマンドプロンプト内で処理されるのである。そういう違いがVISTAとXPのバッチファイルの間にはあった。

 先のバッチファイルの場合、バッチファイルから呼ばれるスクリプトが、「バッチファイルがあるディレクトリがカレントディレクトリである」ことを前提としていたので、Windows VISTA では動くのに、Windows XPでは動かない、ということが起きた。

 いつものように、「思い込み」は危険だと思うと同時に、コマンドプロンプトやバッチファイルの沼も結構奥が深そうだ・・・と今さらながら感じたのである。このコマンドプロンプトやバッチファイルの「沼」に足を踏み入れてみるべきか、あるいは近寄らないようにするべきか・・・それが問題で思い悩んでいる。

2009-06-22[n年前へ]

ドラッグ&ドロップしたファイルからデータを抽出するRubyスクリプト・サンプル 

 「ささやかだけれど、役に立つこと」が、きっとあるだろう、と思っています。本屋に行けば、たくさんHOW TO本が溢れています。けれど、意外に、HOW TO本という割には、そこにはスローガンのような曖昧なことしか書かれていないことも多い、と感じることがあります。あるいは、Geek好みではあるけれど、そうでない人を想定読者にしていない本も多いように思います。

 今日は、「(Windowsで)ドラッグ&ドロップしたテキスト・ファイル中から特定の行・列を抽出するスクリプト」のRubyサンプルを書いてみました。つまりは、誰でもすぐに書ける使用例です。・・・とはいえ、実験データの解析をしようとすると、必要になることが多そうなサンプルです。

 けっしてすごいことができるわけではありませんが、意外にこんなスクリプトを実際に使い・役立てて、そして自分で道具を作り始めることのきっかけのひとつになる可能性もあるかもしれないと思い、書いてみました。

 下のスクリプトは、HEADER_LINE_NUMで定義した行より後の行から、(スペースで区切った時の)2・3列目だけを抽出したcsvファイルを作ります。もしも、1,9行目をコメントにして、2,10行目をコメントアウトすると、pickupLineで定義した行からだけデータを抽出します。何だか、こんな説明を書くことも、少し気恥ずかしく感じてしまうようなサンプルですが、けれど、意外にこういう入門の入門の情報が「ささやかだけれど、役に立つこと」なのかもしれないと思い、ふと仕立ててみました。

HEADER_LINE_NUM=5
#pickupLine=[23,24,26,28]
ARGV.length.times{ |i|
  data=[]
  filename=ARGV[i]
  open(filename) {|file|
    lineNum=1
    file.readlines.each{|line|
      if lineNum>HEADER_LINE_NUM
#      if pickupLine.include?(lineNum)
        lineData=line.split(' ')
        data<<[ lineData[2], lineData[3] ] 
      end
      lineNum+=1
    }
  }
  isFirst=true
  f=File.open(filename.gsub('.txt','')+'.csv','w')
  data.each{|l|
    if isFirst
      f.puts 'a,b' # print caption
      isFirst=false
    end
    f.puts l[0].to_s+','+l[1].to_s    
  }
  f.close
}

2009-08-03[n年前へ]

エクセル2007で綺麗なグラフ動画を作る 

 Microsoft Excel 2007 を使うと、割に綺麗な色のグラフ(チャート)を作ることができる。少しカスタマイズすれば、こんな具合に科学技術プレゼン用のグラフができあがる。

 綺麗なグラフを簡単に作ることができるのなら、今度はその綺麗なグラフを動画で眺める「綺麗なグラフ動画(チャート)」を作ってみたくなった。そこで、まずは、次のようなRubyスクリプトで「グラフ(チャート)を回転させたようすを写した連番JPEG静止画像群」を作ってみた。

excel=WIN32OLE.new("excel.application")
・・・
excelchart=excel.Charts.Add()
・・・
i=1000
0.step(359,3) do |rot|
  excelchart.rotation=rot  
  excelchart.Export( 'c:\\images\\'+i.to_s+'.jpg', 'JPG');
  sleep(0.05)
  i+=1
end

 そして、JPG to AVIを使い、JPEG画像群をAVI動画ファイルに変換した。それが、下の動画である。ひと昔前、いや、ふた昔前なら高価な専用ソフトが生成するような動画を簡単に作ることができることを意識すると、少し不思議な気分になる。

2009-08-24[n年前へ]

(恥を忍んで)RC形式でエクセルを使うスクリプトを書いた 

 エクセルは便利だが、LEGOブロックのようなものだ。舞うを掴んだ手を動かし、ワークシートの上で泥臭い作業をしているうちに、いつしか何らかの機能を持ったものができあがる。時間はかかるが、確かに何かができあがる。しかし、どうしようもなく、再利用しづらく、行き当たりばったり感が否めない。

 かといって、スクリプト言語で作業をしようとすると、何らかの機能を実現する「ライブラリ」を探したり、あるいは、教科書を広げ関数機能を実装する手間が必要になったりする。もちろん、サラサラとコードを書きおろすことができる人は別だが、エクセルもスクリプト言語も色々な解析手法自体も苦手な人間には、そういった作業がどうしても必要になると同時に、何ともシンドく感じてしまう。

 今日、データ解析をするRubyスクリプトを書くときに「(CSVファイルを介して)エクセルの機能」を使った瞬間には、さすがに「これは情けないな」と自分でも思った。どういうことかというと、たとえて言うならば、配列の標準偏差を計算するために、こんなスクリプト(a.rbと名付けておこう)を書いたわけである。

num=100
num.times{ datum << rand()*100 }
puts 'STDEV,=STDEV(R[1]C:R['+(num+1).to_s+']C)'
datum.each{ |v|  puts ','+v.to_s }
 そして、
ruby a.ruby > a.csv
a.csv
とすることで、(たとえば)100個の配列の標準偏差を計算したのだ。つまり、「何らかの機能を実現する関数を実装・探す」のが面倒くさくて、エクセルにその作業をさせるスクリプトを書きなぐったのである。・・・実に情けないとしか言いようがない話だ。

 ・・・ちなみに、こんな風に黒魔術師”マイクロソフト エクセル”の力に頼ったスクリプトを書くときには、セルの位置指定方法は「RC形式」にしておくのが、楽でいい。もちろん、こんな情けなく・小汚い作業はしないのが一番なのは、言うまでもない当たり前のコンコンチキなのである。当たり前だのクラッカーなのである。



■Powered by yagm.net