boronが落ちてますと連絡が入り,一時対応した.
うーん,pingは通るのにSSHはconnectできない.
現地に行ってディスプレイを接続すると明らかに異常を示す画面であった. 「Free swap = 0KB」とあるのでスワップを喰い潰したのか.
キーボードでも一切操作はできないので
で強制的に再起動した.
とりあえずSSHによるログインと日本Rubyの会Wikiが見えることを確認した.
ログを見てみたがスワップを喰い潰した原因はよくわからなかった.
原因がわかっていないのでまた同じようなことが起こるかもしれない. 場当たりな延命ということでスワップは2GBから4GBへ増やしておきました.
% sudo dd if=/dev/zero of=/var/swap.bin bs=128M count=16 % sudo chmod go= /var/swap.bin % sudo mkswap /var/swap.bin % sudo vi /etc/fstab <「/var/swap.bin none swap sw 0 0」を追加> % sudo swapon -a
/homeの残りが1GBだったので+3GBしておいた.
LVMの残りもあと1.64GBなんで,そろそろディスクの増設を考えないといけないかな.
% df -h ... /dev/mapper/vol-home 30G 30G 692M 98% /home ... % sudo lvextend --size=+3G /dev/vol/home % sudo xfs_growfs /home % df -h ... /dev/mapper/vol-home 33G 30G 3.7G 89% /home ...

*1 syncが3回なのは気分です
APTでopenvpnパッケージを2.1~rc11-1に上げるとそのままではVPN接続ができなかったが,設定を追加することで解決することができた.
/var/log/syslogを確認すると以下のログが吐かれていた.
... Oct 28 22:41:57 yoshiyuki ovpn-<host>[15998]: openvpn_execve: external program may not be called due to setting of --script-security level Oct 28 22:41:57 yoshiyuki ovpn-<host>[15998]: script failed: external program fork failed Oct 28 22:41:57 yoshiyuki ovpn-<host>[15998]: Exiting ...
/usr/share/doc/openvpn/NEWS.Debian.gzを確認すると,2.1~rc9-3からデフォルトは組み込みコマンドのみを許可していて,外部プログラムの起動の場合はscript-securityを2に設定するようになったらしい.
By default (script-security 1) it will only allow the execution of built-in commands (ip, ifconfig, route,...). If you require the execution of external commands, such as /etc/openvpn/update-resolv-conf, you'll have to include the following option in your configuration file: script-security 2
自分はVPN接続時に/etc/openvpn/<host>.upを,切断時に/etc/openvpn/<host>.downを実行するようにしている(外部プログラム起動). そのため,/etc/openvpn/<host>.confに以下を追加することで接続できるようになった.
script-security 2
音声ファイルの長さを調べるためのコマンドラインプログラムを探したけど,なかったので作った.
Beep Media Playerとかで一つ一つファイルを開けばわかるんだけど,ファイルがいっぱいだとGUIのツールは面倒だ.
画像ファイルの縦横サイズはfileコマンドで取れたりするので,音声ファイルの長さも取れないかなあと思ったが...
% file 'ACIDMAN - Loop - 01 - type A.mp3' ACIDMAN - Loop - 01 - type A.mp3: Audio file with ID3 version 2.3, MP3 encoding
うーん,取れん.
探し方が悪いのかもしれないけど,めぼしいコマンドはないようなので作ってみた.
ruby-audioinfoというライブラリでMP3ファイルやOgg,FLAC,...の情報が取れる. これは,各種ライブラリをラップして共通のインターフェースを用意してくれるライブラリなんだけど目的に十分かなっている.
インストールは以下でできる.
# gem install ruby-audioinfo
ということでruby-audioinfoを使って長さを取得してみた.
% cat ./getaudiolength
#! /usr/bin/env ruby
begin
require "audioinfo"
rescue LoadError
require "rubygems"
require "audioinfo"
end
ARGV.each do |filename|
AudioInfo.open(filename) do |info|
puts([filename, info.length].join(": "))
end
end
% ./getaudiolength 'ACIDMAN - Loop - 01 - type A.mp3'
ACIDMAN - Loop - 01 - type A.mp3: 214
おお,取れる取れる. 実質5行で書けた. これは6行のrequireよりも短い.
...ってでも得られる結果は秒精度なのか!?
1/10秒精度ぐらいまでは出してくれてもいいんじゃないかと考えて調べてみる.
audioinfo.rbを読むと,以下のようにわざわざto_iメソッドで秒単位にしていることがわかった.
class AudioInfo
...
VERSION = "0.1.4"
...
attr_reader :artist, :album, :title, :length, :date
...
def initialize(fn, encoding = 'utf-8')
...
case @extension
when 'mp3'
@info = Mp3Info.new(fn, :encoding => @encoding)
...
@length = @info.length.to_i
なお,この場合にバックエンドとして使われるruby-mp3infoではFloatで入っている. どんな音声ファイルでもAudioInfo#lengthはIntegerにしたかったとか,なにか作者の設計思想があるのかと思ってしまう.
しかしながら,FLACの場合はFloatが入るようだ.
when 'flac' @info = FlacInfo.new(fn) ... @length = @info.streaminfo["total_samples"] / @info.streaminfo["samplerate"].to_f
せっかくなんだからあえてto_iして精度を落とさなくてもいいんじゃないだろうか. 作者にはto_iしないでくださいと懇願しよう.
この場はAudioInfo#length_as_floatなるメソッドを追加して解決することにした.
修正後のものは以下のようになった. メソッド名の都合上to_fを呼んでいる.
% cat ./getaudiolength
#! /usr/bin/ruby
begin
require "audioinfo"
rescue LoadError
require "rubygems"
require "audioinfo"
end
class AudioInfo
def length_as_float
return (@info.respond_to?(:length) ? @info.length : @length).to_f
end
end
ARGV.each do |filename|
AudioInfo.open(filename) do |info|
puts([filename, info.length_as_float].join(": "))
end
end
% ./getaudiolength 'ACIDMAN - Loop - 01 - type A.mp3'
ACIDMAN - Loop - 01 - type A.mp3: 214.3346875
% ./getaudiolength 'ACIDMAN - green_chord - 13 - toward.mp3'
ACIDMAN - green_chord - 13 - toward.mp3: 632.8946875
うん,多少長いファイルでもちゃんと取得できるようだ. 完成〜.よかった.よかった.
このほど,XEmacsからGNU Emacsへ戻した.
これまでは,複数の仮想端末で別々なフレームなのに同じEmacsが使えるためにXEmacsを選んでいた*1. しかし,実はEmacsをGNU Screen上で動かして表示したい仮想端末ごとにscreen -xで出せばいよいという結論に達した.
*1 GNU Emacsだと,自分が確認する限りでは一つの仮想端末上で動いているEmacsに,ファイルを開かせることしかできない.
ここ数ヶ月メイラをMewからIcedoveにしてIMAPを使用しているのだが,INBOXが突然読めなくなってしまった.
Icedoveは以下のメッセージを出力する.
The current command did not succeed. The mail server responded: SELECT failed: Unable to parse internal header at 181712145: T).
他のフォルダは問題なく読めているので,INBOXが壊れてしまったのだろう.
さしあたって壊れたINBOXはinbox.brokenに名前を変え,新しいINBOXにメイルが届くことを確認してinbox.brokenからメイルを救出することを考えた.
簡単なフォーマットでメイルを救出したあとで,IMAP経由で扱える形に変換といった手段である.
以下の手順で救出することを考えた.
以下のコマンドで変換する.
% mbxtomh-lazy inbox.broken temporary
MH形式からmbox形式へ変換する.
% sudo apt-get install nmh % mv temporary ~/Mail % /usr/bin/mh/packf +temporary -file temporary.mbox
mbox形式からmbx形式へ変換する.
% sudo apt-get install uw-mailutils % mv temporary.mbox ~/ % mailutil copy temporary.mbox temporary.mbx
手順を考えるにあたってicatがあればicatでmbx→mbox変換がすぐにできただろうが今のUW IMAPにはない.
とりあえずメイルを救出することはできた... ところがしかし,この方法では未読/既読やタグ(laterとか)といったメタ情報は失われてしまう.
やっぱフォーマット理解して直さないとだめかもしんない.
もう少し調べて以下がわかった.
通常はメタ情報のメイルサイズから次のメタ情報の位置を計算する.ひょっとしたら,メタ情報にあるメイルサイズと,実際のメイルサイズがくい違っているのではないかと考え,正規表現マッチでメタ情報を捉えて調べてみるとその通りだった.
そこで,正規表現マッチでメタ情報を捉えて実際のメイルサイズを計算し,くい違っていたらメタ情報を書換えて記録するスクリプトを書いた.作成したスクリプトをrepair-mbx-sizeとして置いておく.
以下のようにして救出した.
実行してメタ情報修正後のmbxファイルを作成する.
% repair-mbx-size inbox.broken temporary miss-matched size mail[417]: header (2096) != mail size (8530) miss-matched size mail[1472]: header (3430) != mail size (25876) miss-matched size mail[1734]: header (3499) != mail size (11175) miss-matched size mail[1749]: header (4006) != mail size (11121) miss-matched size mail[2264]: header (1902) != mail size (21567) miss-matched size mail[3158]: header (3147) != mail size (5085) miss-matched size mail[6782]: header (3705) != mail size (4660) miss-matched size mail[6975]: header (3977) != mail size (4725) miss-matched size mail[8120]: header (3566) != mail size (5531) wrote 31115 mails.
diffでメタ情報のみの変更でメイルに変更がないことを確認する. 数はそんなにないので目視確認.
% diff --text -u inbox.broken temporary | lv -Ij
今度は未読/既読,タグ情報もうまく復活できた.サイズが狂っていた9通のメイルも特に問題なくIMAP経由で取得できた.
完璧ではないんだろうけど,多くは取り戻すことができたと考える.
第15回オープンソースサロン Ruby認定試験直前勉強会で僭越ながらしゃべっていました.
最初はびしっと問題だが,だんだんと参加者同士で話しやすい雰囲気になってほっとした.
今日配った解答・解説を公開しました.
参加した方々,問題作成作業,会場準備,ウェブページ準備に携わった方々,お疲れ様でした.
明日はどんな試験が出るんだろうなあ.
Debian | LOOX T70HN | Linux | Rails | Rast | Ruby | TYPE T VGN-TZ90HS | boat | hardware | music | p | snowboard | software | surfing | tDiary | その他 | ボウリング | 映画 | 家族 | 会社 | 管理 | 丸藤 | 高専 | 散歩 | 仕事 | 自分 | 鼕
"Yuya.Nishida." / 西田 雄也 <yuya at j96 dot org>