Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
   [VB] [VB6] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [開発] [CE] [LTSA] [自動化] [Qt] [OCaml] [TOOLS]
   [3Dプリンタ] [RAA] [Forge]   [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [Java] [EA] [マクロ]

2007-12-13

warn

08:52 | warn - Rubyの魔神 を含むブックマーク はてなブックマーク - warn - Rubyの魔神 warn - Rubyの魔神 のブックマークコメント

warn(mesg)

ruby 1.8 feature

mesg と改行を順番に $stderr に出力します。組み込み変数 $VERBOSE が nil のときは何も出力しません。

$stderr.print mesg, "\n" unless $VERBOSE.nil?

と同じです。nil を返します。

http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4#warn

$VERBOSE

冗長メッセージフラグです。Rubyインタプリタへの -vオプションでセットされます。

ruby 1.8 feature

警告レベルは三段階あり、それぞれ以下の通りです。

* nil: 警告を出力しない

* false: 重要な警告のみ出力(デフォルト)

* true: すべての警告を出力する

コマンドラインオプション -W[level] でレベルを指定できます。それぞれ、-W0, -W1, -W2 (or -W) が対応します。 -v や -w を指定した場合は -W2 と同じです。

nil, false 以外を設定すると値は true になります。

http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%CA%D1%BF%F4#a.24VERBOSE

warn でメッセージを出して -w をつけてデバッグ

Rubyで複数のプログラムを起動する方法

10:08 | Rubyで複数のプログラムを起動する方法 - Rubyの魔神 を含むブックマーク はてなブックマーク - Rubyで複数のプログラムを起動する方法 - Rubyの魔神 Rubyで複数のプログラムを起動する方法 - Rubyの魔神 のブックマークコメント

systemでプログラムを起動するとそのプログラムが終了するまで、制御が返ってこない

例 ペイントを終了するとメモ帳が起動する

  system 'c:\\windows\\system32\\mspaint.exe'
  system 'c:\\windows\\system32\\notepad.exe'

複数のプログラムを一度に起動したいときはThreadで起動するといいみたい。

例 ペイントとメモ帳が同時に起動する

require 'Thread'

t1=Thread.new{
  system 'c:\\windows\\system32\\mspaint.exe'
}

t2=Thread.new{
  system 'c:\\windows\\system32\\notepad.exe'
}

puts "Hit [Enter] key"
gets

仕事で毎日同じ複数のプログラムの起動とフォルダを開くのが面倒だったので、スクリプトで一度に全部起動できるようにしてみた。

※フォルダはstartコマンドで開いた。

system 'start c:\\windows'


ついでに朝一で必ず開くメーラー、ブラウザ、勤怠簿(EXCEL)を開くスクリプトも作ってみた。

Excelファイルもstartコマンドで開ける。

system 'start c:\\windows\\xxx.xls'

ファイル操作

12:01 | ファイル操作 - Rubyの魔神 を含むブックマーク はてなブックマーク - ファイル操作 - Rubyの魔神 ファイル操作 - Rubyの魔神 のブックマークコメント

chdir

Dir.chdir("C:\\temp")

ファイルのコピー

require 'FileUtils'
FileUtils.cp(srcFile, destFile) if not FileTest.exist? destFile

ファイルの有無の確認

if not FileTest.exist? destFile

フォルダがなければ作成

MailDir = './inbox/'
Dir::mkdir(MailDir) if not FileTest::directory?(MailDir)

OptionParser の使い方

14:40 | OptionParser の使い方 - Rubyの魔神 を含むブックマーク はてなブックマーク - OptionParser の使い方 - Rubyの魔神 OptionParser の使い方 - Rubyの魔神 のブックマークコメント

OptionParser の使い方

OptionParser はコマンドライン引数のオプションを取りだします。

require 'optparse'

opt = OptionParser.new

opt.on('-a') {|v| p v }

opt.on('-b') {|v| p v }

opt.parse!(ARGV)

p ARGV

ruby sample.rb -a foo bar -b baz

# => true

true

["foo", "bar", "baz"]

チュートリアルはこちら

standard
require 'optparse'
OptionParser.new {|opt|

  opt.on('-a') {|v| p v }
  opt.on('-b VAL') {|v| p v }
  opt.on('-c [OPTION]') {|v| p v }
  
  opt.parse!(ARGV)
}
p ARGV

パラメーター -a foo bar -b baz -c hoge

結果

true
"baz"
"hoge"
["foo", "bar"]

1.「あり・なし」のスイッチ的オプションは opt.on('-a') {|v| p v }

2.「引数付き」オプションは opt.on('-b VAL') {|v| p v } ※VALは任意の文字列

3.「省略可能引数付き」オプションは opt.on('-c [OPTION]') {|v| p v } ※[]で囲む

POP3によるメール受信

16:12 | POP3によるメール受信 - Rubyの魔神 を含むブックマーク はてなブックマーク - POP3によるメール受信 - Rubyの魔神 POP3によるメール受信 - Rubyの魔神 のブックマークコメント

indoxというフォルダを作り、その中に1,2,…という名前で受信メールを保存する

pop.rb

#!/usr/local/bin/ruby -Ks
require 'net/pop'
require 'thread'
require 'pstore'

MailDir = './inbox/'
Dir::mkdir(MailDir) if not FileTest::directory?(MailDir)

counter = PStore.new(MailDir+'counter')
counter.transaction do
  if counter['counter'].nil? then
    counter['counter'] = 1
  end
end

begin
  recvMail = Thread.new do
    i = 0
    while true
      counter.transaction do
        i = counter['counter']
      end
      
      Net::POP3.delete_all( 'xxx.sakura.ne.jp', 110,'xxx@xxx.sakura.ne.jp', 'xxx' ) do |m|
        File.open( MailDir + i.to_s, 'w' ) {|f|
            f.write m.pop
        }
        counter.transaction do
          i += 1
          counter['counter'] = i
          puts i
        end
      end
      sleep 10
      print 'r'
    end
  end
rescue
  p $! 
end
#while true
#end

recvMail.join
gets

tmailのサンプルで添付ファイルをデコード

コマンドラインで

extract-attachments.rb 1 などとやると添付ファイルがデコードされる

ファイル名が復元されないのが残念

ExcelWordを追加して保存をバイナリ("wb")に変えた

extract-attachments.rb

#
# extract-attachments.rb  -- Extracts attachment(s) from the message.
#
# Usage: ruby extract-attachments.rb mail mail...
#

require 'tmail'

def main
  idx = 1
  ARGV.each do |fname|
    TMail::Mail.load(fname).parts.each do |m|
      m.base64_decode
      File.open("#{idx}.#{ext(m)}", 'wb') {|f|
        f.write m.body
      }
      idx += 1
    end
  end
end

CTYPE_TO_EXT = {
  'image/jpeg' => 'jpeg',
  'image/gif'  => 'gif',
  'image/png'  => 'png',
  'image/tiff' => 'tiff',
  'application/vnd.ms-excel' => 'xls',
  'application/msword' => 'doc'
}

def ext( mail )
  CTYPE_TO_EXT[mail.content_type] || 'txt'
end

main

[Ruby]TMailの添付ファイルの名前の取り出しとActionMailerの添付ファイルの名前付けCommentsAdd Star

TMailの添付ファイルの名前の取り出しとActionMailerの添付ファイルの名前付け - もち

実験してみます

良く分かりませんでしたorz

Tmailで受信した添付ファイルをファイル名付きで保存する方法

17:46 | Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 を含むブックマーク はてなブックマーク - Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 Tmailで受信した添付ファイルをファイル名付きで保存する方法 - Rubyの魔神 のブックマークコメント

これですね。 Index: lib/tmail/textutils.rb =================================================================== --- lib/tmail/textutils.rb (revision 3674) +++ lib/tmail/textutils.rb (working copy) @@ -199,8 +199,7 @@ def decode_RFC2231(str) m = RFC2231_ENCODED.match(str) or return str - NKF.nkf(NKF_FLAGS[$KCODE], - m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr }) + to_kcode(m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr }) end end いまのところ次のバージョンをリリースする目途がたってないので、 申し訳ありませんがとりあえずローカルパッチでしのいでください。

[ruby-list:43320

lib/tmail/textutils.rbに上記変更をして

190行目より

    def decode_RFC2231(str)
      m = RFC2231_ENCODED.match(str) or return str
#      NKF.nkf(NKF_FLAGS[$KCODE],
#              m.post_match.gsub(/%[\da-f]{2}/in) {|s| s[1,2].hex.chr })
      to_kcode(m.post_match.gsub(/%[\da-f]{2}/in) {|s| s [1,2].hex.chr })
    end

extract-attachments.rbに「$KCODE="SJIS" 」「 file = m.disposition_param('filename')」を入れるとTmailで添付ファイル名をきれいに変換してくれました(^-^)

使い方 extract-attachments.rb (上記「POP3によるメール受信」の pop.rbで受信したファイル名)

extract-attachments.rb

#
# extract-attachments.rb  -- Extracts attachment(s) from the message.
#
# Usage: ruby extract-attachments.rb mail mail...
#

require 'tmail'

$KCODE="SJIS" 

def main
  idx = 1
  ARGV.each do |fname|
    email=TMail::Mail.load(fname)
    email.parts.each do |m|
      m.base64_decode
      file =  m.disposition_param('filename')
      file = "#{idx}.#{ext(m)}" if file.nil?
      
      File.open(file, 'wb') {|f|
        f.write m.body
      }
      idx += 1
    end
  end
end

CTYPE_TO_EXT = {
  'image/jpeg' => 'jpeg',
  'image/gif'  => 'gif',
  'image/png'  => 'png',
  'image/tiff' => 'tiff',
  'application/vnd.ms-excel' => 'xls',
  'application/msword' => 'doc'
}

def ext( mail )
  CTYPE_TO_EXT[mail.content_type] || 'txt'
end

main
トラックバック - http://ruby.g.hatena.ne.jp/garyo/20071213