忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2006-05-03(Wednesday)

Emacsのキーバインド設定

\C-c j とタイプしたときにgoto-lineが実行されるように設定したくて、ちょっと検索。

Meadow/Emacs memo: モードとキーバインドの基礎と Elisp を参考に、

(global-set-key "\C-cj" 'goto-line)

を .emacs に追加して完了

クラスメソッドをクラスの中で呼ぶ方法

次のようにクラスメソッドをそのクラスの中で普通のメソッドとして使おうとしても、エラーになってしまった。

#!/usr/bin/ruby
class C
   def self.m
      puts "Class method"
   end

   def call
      m
   end
end

C.new.call
./test.rb:8:in `call': undefined local variable or method `m' for #<C:0x402a0dcc> (NameError)
        from ./test.rb:12

で、いくつかの呼び方で試してみるプログラムを次のように書いてテスト。

#!/usr/bin/ruby
class C
   def self.m
      puts "Class method"
   end

   def test(str)
      begin
         puts "---"
         puts str
         instance_eval(str)
      rescue NoMethodError, NameError, SyntaxError
         puts $!,$!.backtrace
      end
   end

   def do
      test("m")
      test("C.m")
      test("self.m")
      test("class.m")
      test("self.class.m")
   end
end

C.new.do

結果は以下の通り

---
m
undefined local variable or method `m' for #<C:0x402a0764>
./test.rb:11:in `instance_eval'
./test.rb:11:in `instance_eval'
./test.rb:11:in `test'
./test.rb:18:in `do'
./test.rb:26
---
C.m
Class method
---
self.m
undefined method `m' for #<C:0x402a0764>
./test.rb:11:in `instance_eval'
./test.rb:11:in `instance_eval'
./test.rb:11:in `test'
./test.rb:20:in `do'
./test.rb:26
---
class.m
(eval):1:in `instance_eval': compile error
(eval):1: syntax error
class.m
      ^
./test.rb:11:in `instance_eval'
./test.rb:11:in `instance_eval'
./test.rb:11:in `test'
./test.rb:21:in `do'
./test.rb:26
---
self.class.m
Class method

意外だったのは、オブジェクトのメソッドの中で

class.m

としてメソッドを呼び出そうとするとシンタックスエラーになった事。 「メソッドの中でのクラス定義」の処理が優先されてるのだろうか。

Tags: Ruby

モジュールを含むクラスの派生クラスでのsuper

以前も似たような事を調べたけど、改めてまとめ直してみた。

まずはサンプルプログラム

#!/usr/bin/ruby
module Mod
   def mm
      "mm in Mod"
   end
end

module Mod2
   def mm
      "mm in Mod2 & "+super
   end
end

class C
   include Mod

   def mm
      "mm in C & "+super
   end
end

class D < C
   def mm
      "mm in D & "+super
   end
end

class E < C
   include Mod
   def mm
      "mm in E & "+super
   end
end

class F < C
   include Mod2
   def mm
      "mm in F & "+super
   end
end

puts C.new.mm
puts D.new.mm
puts E.new.mm
puts F.new.mm

結果

mm in C & mm in Mod
mm in D & mm in C & mm in Mod
mm in E & mm in C & mm in Mod
mm in F & mm in Mod2 & mm in C & mm in Mod

まとめ

C : クラスの中でモジュールを include し、モジュールのメソッドと同名のメソッドを定義

superによってモジュールのメソッドが実行される

D : 派生クラスでモジュールを include しない場合

superによって基底クラスのモジュールが実行

E : 派生クラスで基底クラスと同じモジュールを include

superによって基底クラスのモジュールが実行される

F : 派生クラスで、基底クラスが include したのとは別のモジュールを include し、さらにモジュールのものと同名のメソッドを定義

superによってまず派生クラスが include したモジュールのメソッドが実行される

派生クラスが include したモジュールのメソッドが super を実行すると、基底クラスのメソッドが実行される

Tags: Ruby

2006-05-08(Monday)

(今更)'!'に対応

指摘されるまで気づきませんでしたが、MathMLライブラリは階乗の記号'!'に対応していませんでした(汗)

リポジトリ上の最新開発版では対応していますのでお急ぎの方はこちらからどうぞ。

その他の修正もあわせて、来週明け頃には各パッケージの最新版を公開する予定です。

Tags: MathML

2006-05-20(Saturday)

RAID 上の LVM で Found duplicate PV となる現象

[linux-lvm] duplicate pv.

LinuxのソフトウェアRAIDでRAID1を構築して、その上でLVMを作って運用する方法を、VMwareを使って色々と試していた。

RAID1でミラーしているディスクの片割れを初期化してからミラーリングしなおして再起動する実験をしたところ、RAID1で作った/dev/md1ではなく、これを構成する/dev/hda2がLVMのPVとして認識されてしまう現象が発生した。(md1はhda2とhdc2で作ったRAID1)

一度hda2がPVとして認識されてシステムの起動が終了してしまうと、もう一回ディスクを初期化してミラーリングしなおすところからやり直しな上、何度やってもhda2がPVとして認識されてしまう。

このときにvgdisplayコマンドを使って出たエラーメッセージが

Found duplicate PV hogehgoe

で、md1でひとまとめにせずにhda2とhdc2をバラバラに認識しているようだ。

で、このメッセージでぐぐったら上に挙げたスレッドが見つかって、曰く/etc/lvm/lvm.confの中の

md_component_detection = 0

となっているのを

md_component_detection = 1

とせよとのこと。実際に試したところ、これでうまくいった。

Tags: LVM RAID

2006-05-26(Friday)

最近

ファイルサーバの耐久性を向上させようと急に思い立って、RAIDやらLVMやらを勉強中。「VMware最高!」とか言いながら何度もOSを再インストールしたりディスクイメージを作り直したりしています。

そんな風にして拵えたメモがこれ。

RAIDを使っていてディスクを交換する場合

Linux上で、複数のディスクを組み合わせてソフトウェアRAIDを使っていて、ディスクの一つが壊れたら当然交換することになる。 交換した後のディスクを、生きているディスクと組み合わせてRAIDを復旧する方法は以下の通り

前提条件

  • OS は Debian 3.1
  • /dev/hdb1 と /dev/hdc1 を使って、/dev/md0 を構成(RAID1)
  • /hdcが壊れたとする

とりあえず生きているディスクだけで、RAIDデバイス復帰させる

# mdadm -A /dev/md0 /dev/hdb1

新しいディスクをこのRAIDデバイスに追加する

# mdadm --manage /dev/md0 --add /dev/hdc1

復帰状況は以下のようにして分かる

# watch cat /proc/mdadm
Tags: RAID

ディスクが欠けた状態のRAIDを新規に作る方法

# mdadm -C /dev/md0 -l 1 -n 2 /dev/hda1 missing

欠けている分を missing として記述するのがポイント。よく分かってない頃、これを

# mdadm -C /dev/md0 -l 1 -n 2 /dev/hda1

とか(エラーが出て失敗)

# mdadm -C /dev/md0 -l 1 -n 1 -f /dev/hda1

とか(2台で構成したRAIDの片方が無いのではなく、本当に1台だけでRAID1を構成。ディスクの追加ができない)してしまってうまくいかなかったのでメモ。

Tags: RAID

KNOPPIX 上で、LVM on RAID を認識させる方法

前提条件

  • OS は Debian 3.1
  • ソフトウェアRAIDの管理コマンド mdadm で/dev/md0, md1, md2を作成
  • LVMを使って、md0, md1, md2からボリュームグループ vg を作成(インストーラによる)
  • vg の中で論理ボリューム home, tmp, tmp, varを作成してマウントして使用(同上)

こういうマシンでKNOPPIXを使ったときに、これらの論理ボリュームをKNOPPIXで参照できるまでに必要な手順

使ったKNOPPIXはKNOPPIX 5.0 DVD(CeBIT2006)日本語版

  1. KNOPPIXを起動する
  2. su でルートになる
  3. RAID デバイスの復元
    1. "# modprobe md_mod" でmdadmの実行に必要なモジュールをロード
    2. "# mknod /dev/md0 b 9 0" などとしてデバイスファイルを作る(md1 なら "b 9 1")
    3. "# mdadm -A /dev/md0 /dev/hda1 /dev/hdd1" などとしてRAIDを復元。構成はあらかじめメモする必要がある
  4. LVM の復元
    1. "# aptitude lvm2" でLVM関係のパッケージをインストール
    2. /etc/lvm/lvm.conf の "md_component_detection = 0"を "md_component_detection = 1"に修正
    3. "# ln -s /lib/lvm-200/* /sbin/" として、リンクを張る
    4. "# vgscan -v" として、ボリュームグループ vg を構成するデバイスとして md0などが使用されていることを確認する(lvm.confを修正せずにこの手順を踏むと、md0等の代わりにそれを構成する実際のディスク(hda1など)を使用すると誤認してしまう)
    5. "# vgchange -a y"とすれば、ボリュームグループがアクティブになって、デバイスファイル(/dev/vg/homeなどの各論理ボリューム)が自動的に復元される
Tags: LVM RAID

2006-05-27(Saturday)

postfixでSMTP-AUTH

ここの補足

/etc/sasldb2 をpostfix のアカウントで参照する必要があるので、

# adduser postfix sasl

としておかないと、認証に失敗してしまう。

Tags: メモ