雄也の?日坊主日記

2004|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|
2006|05|
2007|04|05|09|10|11|
2008|04|05|08|10|11|

2008-11-13


2008-11-12

_ [管理] boron.rubyist.netスワップ喰い潰す

boronが落ちてますと連絡が入り,一時対応した.

一時対応

うーん,pingは通るのにSSHはconnectできない.

現地に行ってディスプレイを接続すると明らかに異常を示す画面であった. 「Free swap = 0KB」とあるのでスワップを喰い潰したのか.

キーボードでも一切操作はできないので

  1. Alt+SysRq+s,Alt+SysRq+s,Alt+SysRq+s*1
  2. Alt+SysRq+u
  3. Alt+SysRq+b

で強制的に再起動した.

とりあえず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を増やす

/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回なのは気分です


2008-10-28

_ [software] OpenVPNの--script-security level

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

2008-08-23

_ [Ruby] PerlとRubyの間になにがあるのかを調べる

画期的なプログラムを開発したのでMasaruに投稿しておいた.


2008-08-07

_ [Ruby] 音声ファイルの長さを調べるためのプログラム作成

音声ファイルの長さを調べるためのコマンドラインプログラムを探したけど,なかったので作った.

背景

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

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

うん,多少長いファイルでもちゃんと取得できるようだ. 完成〜.よかった.よかった.


2008-05-04

_ [Debian] apt-get update

久しぶりにapt-get updateする.

以下のようになった.

% sudo apt-get upgrade
...
アップグレード: 995 個、新規インストール: 0 個、削除: 0 個、保留: 227 個。
...
% sudo apt-get dist-upgrade
...
アップグレード: 162 個、新規インストール: 93 個、削除: 82 個、保留: 39 個。

2008-04-20

_ [software] GNU Emacsへ戻る

このほど,XEmacsからGNU Emacsへ戻した.

これまでは,複数の仮想端末で別々なフレームなのに同じEmacsが使えるためにXEmacsを選んでいた*1. しかし,実はEmacsをGNU Screen上で動かして表示したい仮想端末ごとにscreen -xで出せばいよいという結論に達した.

*1  GNU Emacsだと,自分が確認する限りでは一つの仮想端末上で動いているEmacsに,ファイルを開かせることしかできない.


2008-04-11

_ [管理][Debian] kusanagi.j96.orgをEtchにアップグレード

作業するのがえらく遅くなってしまった. 作業自体は特に問題なく終わった.

リリースノートに書いてあるアップグレードの章がうまくまとまっているからだと思う.

所要時間は1時間57分だった.


2007-11-02

_ mbx形式メイルフォルダの復旧

ここ数ヶ月メイラを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からメイルを救出することを考えた.

MH形式への変換

簡単なフォーマットでメイルを救出したあとで,IMAP経由で扱える形に変換といった手段である.

以下の手順で救出することを考えた.

  1. MH形式へ変換する.
    1. mbxtomh-lazyというスクリプトを書いた.
    2. 以下のコマンドで変換する.

      % mbxtomh-lazy inbox.broken temporary
  2. MH形式からmbox形式へ変換する.

    % sudo apt-get install nmh
    % mv temporary ~/Mail
    % /usr/bin/mh/packf +temporary -file temporary.mbox
  3. mbox形式からmbx形式へ変換する.

    % sudo apt-get install uw-mailutils
    % mv temporary.mbox ~/
    % mailutil copy temporary.mbox temporary.mbx

手順を考えるにあたってicatがあればicatでmbx→mbox変換がすぐにできただろうが今のUW IMAPにはない.

とりあえずメイルを救出することはできた... ところがしかし,この方法では未読/既読やタグ(laterとか)といったメタ情報は失われてしまう.

やっぱフォーマット理解して直さないとだめかもしんない.

壊れたmbxファイルを直す

もう少し調べて以下がわかった.

  1. mbx形式は先頭2048バイトがmbx全体のヘッダ
  2. それ以降が<メタ情報><メイル><メタ情報><メイル>
  3. メタ情報には後述のメイルサイズとフラグも入っている.

通常はメタ情報のメイルサイズから次のメタ情報の位置を計算する.ひょっとしたら,メタ情報にあるメイルサイズと,実際のメイルサイズがくい違っているのではないかと考え,正規表現マッチでメタ情報を捉えて調べてみるとその通りだった.

そこで,正規表現マッチでメタ情報を捉えて実際のメイルサイズを計算し,くい違っていたらメタ情報を書換えて記録するスクリプトを書いた.作成したスクリプトをrepair-mbx-sizeとして置いておく.

以下のようにして救出した.

  1. 実行してメタ情報修正後の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.
  2. diffでメタ情報のみの変更でメイルに変更がないことを確認する. 数はそんなにないので目視確認.

    % diff --text -u inbox.broken temporary | lv -Ij
  3. IMAPサーバに作成したファイルtemporaryを移動させてIcedoveで見る.

今度は未読/既読,タグ情報もうまく復活できた.サイズが狂っていた9通のメイルも特に問題なくIMAP経由で取得できた.

完璧ではないんだろうけど,多くは取り戻すことができたと考える.


2007-10-27

_ [Ruby] Ruby認定試験直前勉強会

第15回オープンソースサロン Ruby認定試験直前勉強会で僭越ながらしゃべっていました.

  1. 松江市の方から説明,自分から問題について簡単な説明を行う.
  2. 19:13まで用意した問題をやってもらう.
  3. 19:20まで休憩
  4. 19:20から赤枠問題の解説.
  5. 19:58から座談モード
  6. 20:26からまとめ

最初はびしっと問題だが,だんだんと参加者同士で話しやすい雰囲気になってほっとした.

今日配った解答・解説を公開しました.

  • <URL:http://projects.netlab.jp/ruby-test/answers.html>

参加した方々,問題作成作業,会場準備,ウェブページ準備に携わった方々,お疲れ様でした.

明日はどんな試験が出るんだろうなあ.


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>