ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

2013年8月26日月曜日

build ruby-2.0 with visual c++ 2012

native tools コマンドプロンプトで

ruby1.9\bin, gnuwin32\bin にパスを通す。
(bison, sed, ruby が必要。ref: README.win32)

> git clone https://github.com/ruby/ruby.git ruby-2.0
> cd ruby-2.0
> win32\configure.bat
> vi win32\Makefile.sub
XCFLAGS に -I./win32 を追加
> vi ext\ripper\Makefile
INCFLAGS に -I../../win32 を追加
> nmake -f win32\Makefile
> nmake -f win32\Makefile install

win32 のディレクトリ内で nmake をすると LNK2019 とかで止まる

参考:http://blog.livedoor.jp/blackwingcat/archives/1757321.html


追記:
これだけだと ext/openssl がコンパイルされない
openssl が無いと gem がこける
gem が無いと ruby 本体もうまく働かないっぽい

2008年6月10日火曜日

uploader cgi

知り合いにこないだの写真送ってとメールしたら、CD-Rで送るねと返信が来た。いやいや、オンラインで頼むよといったらオーバーフローしてしまったようだ。説明するのはめんどくさいので自宅のサーバにuploaderを置いて、ここにアップロードして!と頼むことにした。

そんな感じでコードは下に。ダウンロード用のリンクはあえて作ってない。悪意のあるファイル名を入力されたら不安だけど、まぁ大丈夫でしょう…。これより凝ったことしようと思ったらrailsかな。
#!/usr/bin/env ruby
require 'cgi'
require 'kconv'
DataDir='data'
MaxSize=250*1024*1024
StoreLimit=20*1024*1024*1024
PageTitle='file uploader'

def commify(numstr)
int, frac = *numstr.split('.')
int = int.gsub(/(\d)(?=\d{3}+$)/,'\\1,')
int << '.' << frac if frac
return int
end

cgi=CGI.new

print cgi.header("type"=>"text/html", "charset"=>"Shift_JIS")
puts '<html>'
puts '<head>'
puts "<title> #{PageTitle} </title>"
puts '</head>'
puts '<body>'
puts "<h1>#{PageTitle}</h1>"

fb = Dir.glob(DataDir+'/*')
total=0
if fb.length > 0
fb.each{|f|
total+=File.stat(f).size
}
end

if (cgi['file'] != "")
file = cgi['file'].original_filename.chomp
if file.length>0
file = file.toutf8
file.gsub!(/\\/,'/')
file.gsub!(/\s/,'_')

if total+cgi.content_length>StoreLimit
print 'sorry. disk full. cannot upload the file.'
elsif cgi.content_length<MaxSize
ofn = sprintf("%s/%d.%s.%s",DataDir,$$,Time.now.to_f.to_s,File.basename(file))
begin
f = open(ofn,"wb")
rescue
print 'upload failed with unexpected error. please contact to server administrator.'
else
f.write cgi['file'].read
print 'upload succeessfully completed: '
print file.kconv(Kconv::SJIS,Kconv::UTF8)
ensure
f.close
end
else
print 'filesize error. you can upload up to '+MaxSize.to_s+'Bytes'
end
print '<hr />'
end
end

puts '<form method="POST" enctype="multipart/form-data">'
puts 'file: <input type="file" name="file" size="50">'
puts '<input type="submit" name="upload" value="upload">'
puts '</form>'
puts '<hr>'

files = Dir.glob(DataDir+'/*')
if files.length > 0
puts 'uploaded files:<br />'
puts '<table border=4>'
print '<tr><th>'
print 'date uploaded'
print '</th><th align=right>'
print 'file name'
print '</th><th align=right>'
print 'bytes'
puts '</th></tr>'
files.each{|f|
s = File.stat(f)
print '<tr><td>'
print s.ctime
print '</td><td align=right>'
print CGI.escapeHTML(f.sub(/\A#{DataDir}\/[0-9]+\.[0-9]+\.[0-9]+\./,'').kconv(Kconv::SJIS,Kconv::UTF8))
print '</td><td align=right>'
print commify(s.size.to_s)
puts '</td></tr>'
}
puts '</table>'
else
puts 'no files uploaded'
end

puts '<a href="./"> refresh </a>'
puts '</body>'
puts '</html>'

2008年5月30日金曜日

rubyでメールを送る

時間のかかるスクリプトとか、タスクスケジューラとかで動かしてるスクリプトとかは、終了時にメールを飛ばすようにできると無事に終わったことが確認できてうれしい。そんなわけでやり方を調べてみた。追加ライブラリを拾ってきたりとかしたくないので、標準のNet::SMTPでやる。ActionMailerでも使ったらいいのにね。
仕様は、本文に適当なメッセージを入れてログファイルを添付する。ログはテキストだから本文に貼り付けてもいいのだがせっかくだから添付の仕方を調べてみた。ただ、ヘッダのMIMEエンコードはめんどくさかったのでSubjectにはASCIIしか使わないことにした。コードは下の方に。
net/smtpだとヘッダを1から全部かかなきゃならんのが大変。multipartの肝はboundary。ヘッダには境界として使う文字列を記入。無駄にsha1とか使ってるがランダムな文字列である必要も毎回変化する必要もなく、本文中に出てこないならなんでもいい(使えない記号とか70文字までとかのルールはある)。実際にメール中で境界としてかくときは、ヘッダで指定したboundaryの頭に--をくっつける。そして、メールの最後には頭とおしりの両方に--をくっつけたboundaryを置く。というルールになっているようです。
参考:http://suika.fam.cx/~wakaba/-temp/wiki/wiki?boundary
自分しか使わないからさぼってるけどFile.openの例外はちゃんと拾うべきですね。

#!/usr/bin/ruby -Ks
require 'kconv'
require 'net/smtp'
require 'digest/sha1'

LogFile='log.txt'
MailFrom='mailfrom@example.com'
MailTo='mailto@example.com'
MailSubject=File.basename($0)+' finished'
SMTPHost='smtp.example.com'
SMTPPort=25
HELODomain='myhostname.example.com'
Boundary=Digest::SHA1.hexdigest(Time.now.to_f.to_s)
EncodeBlocksize=45

def send_mail
tmp=Array.new
tmp<<sprintf("Message-ID: <%f_%d@%s>",Time.now.to_f,$$,HELODomain)
tmp<<'Date: '+Time.now.strftime("%a, %d %b %Y %X")+' +0900 (JST)'
tmp<<'From: '+MailFrom
tmp<<'To: '+MailTo
tmp<<'Subject: '+MailSubject
tmp<<'MIME-Version: 1.0'
tmp<<'Content-Type: multipart/mixed; boundary='+Boundary
tmp<<''
tmp<<'--'+Boundary
tmp<<'Content-Type: text/plain; charset=ISO-2022-JP'
tmp<<'Content-Transfer-Encoding: 7bit'
tmp<<''
tmp<<Time.now.to_s.tojis
tmp<<'おわったよー'.tojis
tmp<<''
tmp<<'--'+Boundary
tmp<<'Content-Type: application/octet-stream;'
tmp<<' name="'+File.basename(LogFile)+'"'
tmp<<'Content-Disposition: attachment;'
tmp<<' filename="'+File.basename(LogFile)+'"'
tmp<<'Content-Transfer-Encoding: base64'
tmp<<''
File.open(LogFile){|fin|
src=fin.readlines.join('')
enc=[src].pack('m')
tmp<<enc
}
tmp<<'--'+Boundary+'--'
mailbody=tmp.join("\n")
Net::SMTP.start(SMTPHost,SMTPPort,HELODomain){|smtp|
smtp.send_mail mailbody,MailFrom,MailTo
}
end

send_mail

2007年1月17日水曜日

ファイルからshift-jisの行を抽出

※前のblogから記事を移動。元の公開日:2007/01/17(水) 02:09:45

---

とあるソフトウェアの英語版を配布することになったということで、プログラムの中の日本語を英語に直さなきゃならんらしい。
・メニュー
・ツールバーのポップアップヒント
・ステータスバーに表示するメッセージ
・ダイアログボックス
・ヘルプ、バージョン情報
・メッセージボックス
あたりだろうか。
だいたいはリソースの中だろうけどソースのどこかに散らばってるのもあるよね・・・

ってなわけでとりあえず一覧を作ってみるスクリプトをrubyで書いてみた。
SJISの行でなおかつ"を含んでいたら(コメントよけ)ファイル名・行番号と共に出力する。
指定ファイルがバイナリファイルだったら何もしない。

require 'nkf'

#CODES = {
# NKF::UNKNOWN => "UNKNOWN", # 0
# NKF::JIS => "JIS", # 1
# NKF::EUC => "EUC", # 2
# NKF::SJIS => "SJIS", # 3
# NKF::BINARY => "BINARY", # 4
# NKF::ASCII => "ASCII", # 5
# NKF::UTF8 => "UTF8", # 6
# NKF::UTF16 => "UTF16", # 7
#}

while file = ARGV.shift
port = open(file)
str = port.read
next if NKF.guess(str) == NKF::BINARY
port.close
num = 0
IO.foreach(file){|line|
code = NKF.guess(line)
num = num + 1
#print file + "(" + num.to_s + "): " + CODES.fetch(code).to_s + "\n"
if code == NKF::SJIS
if line.include?("\"")
print file + "(" + num.to_s + "):" + line
end
end
}
end

やってみたら結果291行・・・
多少はコメント行も残ってるけど、手作業で直すのしんどいなぁ。