« 2009年8月 | トップページ | 2009年11月 »

2009年10月

2009年10月31日 (土)

windowsでgemで入れたコマンドがすべてin `load': no such file to load になる

WindowsのRuby実行環境としてActiveScriptRuby 1.8.7(p174) with-winsock2 
をインストール。
環境変数PATHにC:/Program Files/ruby-1.8/binを追加し再起動
(環境変数の設定を反映させるため。)

C:\>gem --version
1.3.4

C:\>gem install rake
Successfully installed rake-0.8.7
1 gem installed
Installing ri documentation for rake-0.8.7...
Installing RDoc documentation for rake-0.8.7...

C:\>rake --version
C:/Program Files/ruby-1.8/bin/rake:18:in `load': no such file to load --
C:/Program Files/ruby-1.8/lib/ruby/gems/1.8/gems/rake-0.8.7/bin/rake"
(LoadError)
        from C:/Program Files/ruby-1.8/bin/rake:18

疑問:
え!? rake 入れたばっかりなのに、なんでno such file?
答え:
実はgemのversion 1.3.4には実行ファイルへのパスにスペースが含めないバグ
があるせいで、実行できない。

疑問:
ruby consoleだと、rakeがちゃんと動作する。なんで!?
答え:
ruby consoleはコマンドプロンプト立ち上げ時に環境変数PATHの先頭に
C:\PROGRA~1\ruby-1.8\bin;を追加している。PROGRA~1という
ディレクトリ名にはスペースが含まれないため、gemのバグを回避している。

疑問:
C:\PROGRA~1って何?
答え:
8.3形式の短いファイル名を表示させる に記述されている通り、Windowsは、
昔のDOSに対応できるよう、ディレクトリやファイル名に自動的に8.3形式の
別名を割り振り、どちらの名前を指定しても同じ動作になる。

疑問:
で、rakeを実行するにはどうすればいいの?
答え:
・環境変数PATHにC:/Program Files/ruby-1.8/binではなく、
C:\PROGRA~1\ruby-1.8\binを追加する。(消極的解決法

・gemをversion1.3.5にアップデートする。(積極的解決法

疑問:
gemってどうやってアップデートするの?
答え:

C:\>gem install rubygems-update
Bulk updating Gem source index for:
http://gems.rubyforge.org/
Succeccfully installed rubygems-update-1.3.5
1 gem installed

C:\>set PATH=C:\PROGRA~1\ruby-1.8\bin;%PATH%

C:\>update_rubygems

新しいコマンドプロンプトを立ち上げ、rakeが実行できるか確認する。


C:\>rake --version
rake, version 0.8.7


CONGRATULATION!!

| | コメント (0) | トラックバック (0)

2009年10月25日 (日)

Amazon S3にバックアップをする

会社でサーバのファイル郡をAmazon S3にバックアップすることになり、その
ためのツールをRubyで作成しました。
会社の了解を得て、オープンソースにしていいことになったので、rubyforgeに
登録しました。ただ、Windowsでは動作しません。
S3Backup:http://rubyforge.org/projects/s3backup/

S3Backupについて

概要
S3Backupツールとは、指定したディレクトリ以下をAmazon S3にバックアップ
/リストアするためのツールです。

特徴としては下記があります。

圧縮
Amazon S3にアップロードする際に各ディレクトリを圧縮するため、通信帯域や保存領域を節約することができます。

暗号化
設定によりアップロードするファイルを暗号化させることもできます。

差分バックアップ
バックアップが前回バックアップした時と内容が変わらないディレクトリは、
アップロードしないため、通信帯域や時間を節約することができます。

レジューム
通信エラー等で途中でバックアップが中断されても、次回実行時に前回
送信に成功したディレクトリはほとんど再送信されません。(効率化のため
毎回ではなく、10ディレクトリに1回レジューム用の情報を更新しています。)

※注
ディレクトリの内容が変わったかどうかの判断は下記によります。
・ファイルの追加
・ファイルの削除
・ファイルの更新日付の変更
・ファイルのサイズの変更
・シンボリックファイルのリンク先の変更

インストール
sudo gem install s3backup

設定ファイル
S3Backupツールのバックアップ・リストアの実行には下記の内容がyamlフォーマットで書かれた設定ファイルを予め準備しておく必要があります。

bucket: "バケット名"
directories:
- "バックアップもしくはリストア対象のディレクトリへの絶対パス"
- "ディレクトリへの絶対パス(複数ある場合は以降続ける)"
access_key_id: 'Amazon access_key_id'
secret_access_key: 'Amazon secret_access_key'
password: 'ファイルを暗号化する際のパスワード(任意)'
salt: '16文字のHex文字列(8Byte)passwordが指定されている場合のみ必要'
buffer_size:バッファーサイズのbyte数(任意)
max_retry_count送信失敗時に再送する回数(任意)
proxy_host:プロキシサーバのアドレス(任意)
proxy_port:プロキシサーバのポート(任意)
proxy_user:プロキシサーバのログイン名(任意)
proxy_password:プロキシサーバのパスワード(任意)
log_level:
ログの出力レベル(任意)
temporary: 圧縮・展開用の一時ディレクトリ(任意)

設定の説明
bucket

任意のファイルを登録できるコンテナ。指定されたbucketがなかった場合は作成される。Amazon S3内で一意である必要。

directories
バックアップもしくはリストアしたいディレクトリ。複数指定できる。またリストアの場合はバックアップされているディレクトリの配下なら任意のディレクトリを指定できる。リストア時にdirectoriesを指定しない場合は、指定したbucketにバックアップされたすべてのディレクトリがリストアされる。

access_key_id
Amazonより渡されたユーザーごとのid

secret_access_key
Amazonより渡されたユーザーに対する秘密のパスワード

password

AES-CBC-256形式でファイルを暗号化する際のパスワード。なお、設定されていない場合は暗号化しない

salt
AES-CBC-256形式でファイルを暗号化する際のSalt。16文字のHex文字列(8Byte)。passwordが指定されている場合のみ必要'

buffer_size
デフォルト32M ディレクトリを圧縮した後、BUF_SIZEに分割し、送信する。最大5G。

max_retry_count
デフォルト20 送信が失敗した際にリトライする回数。

proxy_host
プロキシサーバのアドレス(プロキシサーバ使用時のみ)。

proxy_port
プロキシサーバのポート(プロキシサーバ使用時のみ)。

proxy_user
プロキシサーバへのログイン名(プロキシサーバ使用時かつログイン必須の場合のみ)。

proxy_password
プロキシサーバへのログインのパスワード(プロキシサーバ使用時かつログイン必須の場合のみ)。

log_level
debug,info,warn,errorのどれかを選択することでログの出力レベルを変更する。デフォルトはinfo

temporary
バックアップ対象のディレクトリを圧縮した際にできる一時ファイルやファイル情報用の一時dbを置くディレクトリ。デフォルトは/tmp

コマンドシンタックス

バックアップの場合
s3backup
[-f 設定ファイル] [-v デバッグメッセージの出力] [-l ログのパス] [-h ヘルプメッセージ]

  • 設定ファイル 設定しない場合はカレントディレクトリのbackup.ymlを読み込む。
  • デバックメッセージ バックアップ対象のディレクトリのファイルツリー構成と更新があったファイル名を出力
  • ログのパス 設定しない場合は標準出力に出力されます
  • ヘルプ ヘルプメッセージが出力されます

リストアの場合
s3backup -r [-f 設定ファイル] [-v デバッグメッセージの出力] [-l ログのパス] [-o 出力ディレクトリ] [-h ヘルプメッセージ]

  • 設定ファイル 設定しない場合はカレントディレクトリのbackup.ymlを読み込む。
  • デバックメッセージ バックアップ対象のディレクトリのファイルツリー構成と更新があったファイル名を出力
  • ログのパス 設定しない場合は標準出力に出力されます
  • 出力ディレクトリ リストア先のディレクトリを指定します。 設定しない場合はカレントディレクトリに出力されます。
  • ヘルプ ヘルプメッセージが出力されます

2010/1/27 追記
本当すみません。passwordを設定していない場合に動作しませんでした。
あとCtrl-C等でバックアップを途中で中断した時に、次回続きから実行できるresume機能をオプションにし、デフォルトでoffにしました。(バックアップ対象が百Gを越えるディレクトリツリーの場合に、メモリを使いすぎるため)

2010/2/13 追記
レジューム機能を必須とするようにしたため、resumeの設定の記述の削除
ログの出力レベルを指定するlog_levelの設定を追加
新たに一時ディレクトリを指定するtemporaryの設定を追加

| | コメント (3) | トラックバック (0)

2009年10月10日 (土)

WindowsでgvimでTwitter

香り屋 さんでdownloadできるwindowsのgvim上でTwitterを行うための手順。
仕事中も作業をしながら、ちょこっとTLが見れる。

  1. もし、cURLがない場合は、香り屋さんでcurl.exeをdownloadし、gvim.exeと同じディレクトリに置く。
  2. もし、rubyがインストールされていない場合は、ActiveScriptRuby からdownloadし、インストール
  3. TwitVim をdownloadし、downloadしたファイルをgvim上で開いた状態で、 :source %を実行することでインストール。
  4. $HOME\_gvimrcに下記を追記。
    let twitvim_login
    = "ユーザー名:パスワード"
    let twitvim_count
    = 1から200までのTL数
  5. Windowsの場合は、文字化けするため、$VIMRUNTIME\plugin\twitvim.vimを下記のように修正

1336c1336,1361
<     let s = substitute(s, '&#\(\d\+\);','\=nr2char(submatch(1))', 'g')
---
>     let s = substitute(s, "'","''", 'g')
>     ruby << EOF
> str = VIM.evaluate("s")
> def ucs2_to_utf8(c)
>   raise if c < 0
>   return sprintf("%c", c) if c <= 0x7F
>   if c <= 0x07FF
>       c1 = 0b1100_0000 | (c >> 6)
>       c2 = 0b1000_0000 | (c & 0b111111)
>       return sprintf("%c%c", c1, c2)
>   end
>   if c <= 0xFFFF
>       c1 = 0b1110_0000 | (c >> 12)
>       c2 = 0b1000_0000 | ((c >> 6) & 0b111111)
>       c3 = 0b1000_0000 | (c & 0b111111)
>       return sprintf("%c%c%c", c1, c2, c3)
>   end
>   raise
> end
> require 'nkf'
> out = str.gsub(/&#\d+;/) do |m|
>   ucs2_int = m[2 .. -2].to_i
>   NKF.nkf("-W -s",ucs2_to_utf8(ucs2_int))
> end
> VIM.command("let s='%s'" % out)
> EOF

以上

gvim上で:FriendsTwitterを実行することにより、TLが表示される。
詳細は:help twitvim.txt を実行すること。

注意
let twitvim_enable_ruby = 1にしないこと
本来はRubyをインストールしている状態でlet twitvim_enable_ruby = 1に
すれば、cURL(外部コマンド)の代わりにRubyで処理されるため、TLの表示が
高速になるのだが、:help twitvim.txtにもあるとおり、Windowsのvimでの
Rubyの実行はバグのため、ソケットまわりの処理がすべてエラーになる。
http://www.mail-archive.com/vim_dev@googlegroups.com/msg03713.html
なので、Twitterから受信したUCS-2のコードをWindows用にSJISに変換する
ためのみに、Rubyを使用している。

謝意
ucs2_to_utf8の関数は下記のサイトに掲載されていたものをそのまま使用
しました。感謝しています。
http://d.hatena.ne.jp/elm200/20080709/1215558613

| | コメント (0) | トラックバック (0)

« 2009年8月 | トップページ | 2009年11月 »