open-uriにtimeoutを設定する方法

require 'open-uri'
require 'resolv-replace'
require 'timeout'
TIMEOUT = 3
begin
  timeout(TIMEOUT) do
    open(url) do |f|
      # 処理
    end
  end
rescue TimeoutError => e
  # タイムアウト時の例外処理
rescue => e
  # その他の例外処理
end
  • timeout による割り込みはRubyのThreadによって実現されており、C言語レベルで実装されRuby のスレッドが割り込めない処理では無効なので、SocketでDNSの名前解決に時間がかかった場合にタイムアウトしない。そのため、resolvライブラリを使うようにresolv-replaceでメソッドの書き換えを行う。
  • タイムアウト時のTimeoutErrorはStandardErrorのサブクラスではないので、捕捉するためには明示的に捕捉するクラス(TimeoutError)をrescueに指定する必要がある。

open-uriにtimeoutを設定する方法 | やむにやまれず

mysqldumpで出力したファイルのインポートで error at line xxx: unknown command '\z'

mysqldumpで出力したダンプファイルをmysqlでインポート中に、

error at line 301: unknown command '\z'

というエラーになった。
エラーに出ているダンプファイルの301行目は、longblobのカラムを持つテーブルへのデータのINSERT。
mysqldumpで --hex-blob オプションを付けて出力するようにすると、エラーを回避できた。
ただしダンプしたファイルのサイズは大きくなる。
Mysqldump and Error "Unknown command '\0′" | Mister Nerd's Blog
MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump -- データベースバックアッププログラム

--hex-blob
16進変換表記法を使用しているバイナリカラムをダンプします(例えば、'abc'は0x616263となります)。影響を受けるデータタイプはBINARY、VARBINARY、BLOB、そしてBITになります。

CentOSにbash-completionをインストール

CentOSのyumにはbash-completionがないので、ソースからインストールした。
Bash-Completion
から、最新のソースをダウンロードしてインストール。

$ tar xjvf bash-completion-2.0.tar.bz2
$ cd bash-completion-2.0
$ ./configure
$ make
$ sudo make install

~/.bashrc

# Use bash-completion, if available
[[ $PS1 && -f /usr/local/share/bash-completion/bash_completion ]] && \
    . /usr/local/share/bash-completion/bash_completion

Gitのbash_completionは、Gitのソースの/contrib/completion/git-completion.bash、
Subversionのbash_completionは、Subversionのソースの/tools/client-side/bash_completion
にあるので、/usr/local/share/bash-completion/completions/ にそれぞれgit、svnという名前で保存すればよい。