FTPからのダウンロード

30分プログラム、その88。
FTPからファイルをダウンロードするやつ。

#! /opt/local/bin/ruby -w
# -*- mode:ruby enconding:utf-8 -*-
#
# ftp_get.rb - 
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/07/23 08:53:59
# 
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Ruby itself.
#

require 'net/ftp'
host,username,password,*_= ARGV

ftp = Net::FTP.new host,username,password
ftp.passive = true
ftp.chdir 'Logs'

# 最新のログから7日前までを取得
ftp.nlst.reverse[0,7].each{|filename|
  puts filename
  
  begin 
    ftp.get filename
  rescue => e
    puts "ERROR: #{e}skip #{filename}"
  end
}

これだけだと対して、おもしろくないけど、id:mzp:20070722:ftpと組み併せると、FTPで「最近更新されたファイルは?」が実現できる。

#!/bin/sh
####################
# setting
####################
LOG_HOST=example.com
LOG_USER=foo
LOG_PASS=bar

UP_HOST=example.com
UP_USER=hoge
UP_PASS=hage

# clean
rm -f *.log

# get log file
echo "get log file"
ruby ftp_get.rb $LOG_HOST $LOG_USER $LOG_PASS

# analyze
echo "make ranking"
ruby ftp_recently.rb *.log > updates.txt

# upload
echo "upload"
ftp -n $UP_HOST <<EOF
user $UP_USER $UP_PASS
passive
binary
put updates.txt
bye 
EOF

それPra

で、FTPのリストを作る方法を書いていたんだけど、Praggerで実現したほうがいい気がしてきた。

そもそも、やりたいのは、

  • FTPにログイン
  • 更新されたファイルを調べる(ログ解析とかファイル一覧作成とか)
  • そのデータを加工する
  • FTPにアップロードする

という処理。ずばり、Praggerの処理と被っているね。

あとでプラグインを書くかも。

和暦西暦変換

最近、西暦と平成の変換が必要になることが多いけど、即座にできないのでプログラムを書いてみた。これは、正しい怠惰の使い方ですよね。

ただ、seirekiとかsyouwaという変数名を使うのはいやだったので、日本語識別子を試してみる。
日本語識別子は、-Kオプションで文字コードを指定すると使えるようになります。

$ jpdate s60
1985

$ jpdate 2006
H18
#! /opt/local/bin/ruby -w -Ku
# -*- mode:ruby enconding:utf-8 -*-
#
# jpdate.rb - 和暦 <-> 平成相互変換プログラム
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/07/23 16:27:03
# 
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Ruby itself.
#

def from_昭和(昭和)
  1900 + 昭和 + 25
end

def from_平成(平成)
  2000 + 平成 - 12
end

def to_和暦(西暦)
  case 西暦
  when 1926..1989 # 昭和
    "S#{西暦 - 1988}"
  else # 平成
    "H#{西暦 - 1988}"
  end
end

case ARGV[0]
when /\AS/i # 昭和
  puts from_昭和($'.to_i)
when /\AH/i # 平成
  puts from_平成($'.to_i)
when /\A\d/ # 西暦 
  puts to_和暦(ARGV[0].to_i)
end

ポータビリティはさておき、日本語の識別子のほうが圧倒的に分りやすいですね。
乱用さえしなければ、日本語識別子はありかもしれない。