2011年5月4日水曜日

ユニークなファイルの名前の作り方

cgi のスクリプトを作成していて、cgi 間でテンポラリファイルを受け渡す必要が出てきた。純粋に cgi 間のデータの受け渡しであれば POST で行えばよいのだが、今回は最初の cgi が外部ソフトを呼び出してデータ(ファイル)の加工を行なわせ、その出力(ファイル)を次の cgi に渡すので、POST 経由だと周りくどい。

普通であれば、Tempfile を使えば一発なのだが、Tempfile はご丁寧にスクリプトの実行が終わると自動的にファイルを削除してくれる。そのため、次の cgi が走ったときには消されてしまっている。

苦肉の策で考えたのが下記のスクリプト。もっと良い方法がありそうなきもするけど。
temp_name = ''
  Tempfile.open('') {|f| temp_name = f.path+'.tmp'}

2010年8月19日木曜日

ワードにつけたコメントのイニシャルを変える

RubyスクリプトからOLEをつかってWordにコメントを付ける際に、
デフォルトのイニシャルから変更するには下記のようにすればよい。
 
com_idx = wdoc.Comments.Add(range, text).index
wdoc.Comments(com_idx).Initial = 'initial'
 
 
コメントのindex番号は、ファイルの最初から順番になるように常にrenumberされるため、
以下のようにコメントの数を自分でカウントする方法は、
コメントを付ける場所が行ったり来たりしたり、既にコメントが入っていた場合破綻する。
〜.each do |com_idx|
  wdoc.Comments.Add(range, text)
  wdoc.Comments(com_idx).Initial = 'initial'
end
 

キー入力を待ってポーズ

参照頁 http://lldev.jp/ruby/tips/miscellaneous.html


require 'Win32API'
kbhit = Win32API.new('msvcrt','_kbhit',[],'l')

print '続行するには何かキーを押してください'
while true
if kbhit.call != 0
break
end
end
puts "\nキーが押されました"

2010年8月13日金曜日

MeCabの辞書

当然のことながらMeCabの解析精度は使う辞書に依存する。
 
を参考に、UniDic現代語版(http://www.tokuteicorpus.jp/dist/)を使うことに。
 
ユーザー登録して、個別ファイル→unidic-mecab→unidic-mecab*_sjis.zip をダウンロード。
フォルダ dic\ipadic に中身を展開。
スタートメニュー MeCab → Recompile Shift_Jis Dictionary を実行
 
 
 
 

2010年8月12日木曜日

MeCab(形態素解析エンジン)をRuby(windows)でつかう

MeCab(http://mecab.sourceforge.net/)を、Rubyから使うことにトライ。
 
Windowsでは、mecab-rubyがうまく働かないらしい。
 
代わりに、こちら(http://nlp.sfc.keio.ac.jp/~aihara/nlp.html)にある、
dll経由でいじるスクリプトを使おうと思ったが、
どうも1.9.1では動かないらしい。。。
 
結局、こっち(file:///C:/Documents%20and%20Settings/060057/My%20Documents/ScrapBook/data/20100812121709/index.html)を参考にテンポラリファイルを介して、
いじる方法を使うことにした。
 
 
 

RubyでExcelにアクセスする

Rubyでアクセスするには XLS.rb(http://github.com/bash0C7/XLS/blob/master/xls.rb?locale=ja)を使うと、
一行ごとに'タイトル'=>'値'のハッシュが得られて便利。
 
ただ、一列目に空白セルがあるとそこで読み込みが終わってしまうので注意!
 
 
 

2010年8月11日水曜日

Rubyからパラグラフを取得する方法

すぐに忘れてしまうので、メモ
 
#! ruby -Ks
# -*- coding: cp932 -*-
require 'win32ole'
 
fso = WIN32OLE.new('Scripting.FileSystemObject')
path = fso.GetAbsolutePathName(ARGV[0])
 
word = WIN32OLE.new('Word.Application')
word.visible = false
 
doc = word.Documents.Open(path)
 
begin
  doc.Activate
  idx = 1
  doc.Paragraphs.each do |para|
    puts para.Range.Text
    puts doc.Paragraphs(idx).Range.Text
    idx += 1
    break if idx > 20
  end
  ensure
  doc.Close
  word.Quit
end