dovecot 2.x で SSL が応答なしになって困った。

というか、半日こいつでつぶしました。

/etc/dovecot/conf.d にある、 10-ssl.conf をいじるわけですが、
この際、

NG :

ssl_cert = /tmp/server.crt
ssl_key = /tmp/server.key
ssl_ca = /tmp/ca.pem

だとエラーで、

OK :

ssl_cert = </tmp/server.crt
ssl_key = </tmp/server.key
ssl_ca = </tmp/ca.pem

だとおっけーなんだそうな。

要は、小なり記号「<」をつけろということらしい。

某所からのメール。

ディジタル署名が失効しているときって、こんなことになるんだなぁ、とふと思った今日この頃。

(Windows Live メールにて)

 

普通に開くと、「デジタル署名がかかってます」という案内が出ますが、
上の部分に「デジタルIDの署名は失効しています」というメッセージが。

image

 

先に進むと、

絶対振り込み詐欺系の画面だろと、
突っ込みを入れたくなるようなデザインの

「セキュリティ警告」画面が表示されます。

image

image

証明書を見てみると、有効期限が切れていることがわかります。

 

そんなこんなで、有効期限が切れた状態の証明書を使って、ディジタル署名をしてメールを送ると、
こんな感じで、受け取り側があんまりいい印象を受けるメールではなくなってしまうので、
気をつけたいところですね。

Hybrid MBR を GPT / MBR ディスクに変換する。

みむらです。

普通、GPT ディスクを MBR ディスクに直したりっていうのは、
ディスクの内容飛ばせーとか言われるんですが、面倒くさいのでいいのないかなーと探していたらありました。

ってことで、この先は Linux + CUI の世界ですが、

もしGUI で Windows で完結させたい人は、たぶん
窓の杜 – 【NEWS】米Paragon、BIOS-MBRからUEFI-GPTへWindows環境を移行できる「Migrate to UEFI」

この辺使うと幸せになれるんじゃないでしょうか。使ったことないので、保証はできません・・。

 

説明に入る前に Hybrid MBR とはなんぞやということですが、

簡単に言うと、本来 GPT ディスクは MBR の部分に、
「よくわからないけど、ディスクの全ては使われてるよ!」 という情報を書いて、
GPTの部分に本来のデータを書き込んでおきます。

ですが、GPT わけわからんなシステムの場合、これだと非常にまずいわけで、
そこで、MBR 領域に「ここからここまでが、起動領域、あとはしらん!」 みたいに有効な情報を書いておき、
いい感じにしてしまおうというものです。

ただ、GPT と MBR でデータの整合性がちゃんととれるのかというところで問題があり、
あんまりやらない方がいいのですが、古いシステムで使う場合や、 Mac で Windows を動かす場合に必要な用です。

 

で、この記事でやろうとしていることは、
どっちか一つにしよう! ということで、 GPT か MBR に一本化してしまおうと言うことです。

もちろん、後述する gdisk コマンドを使えば、相互にこれらを行き来できますが、
この記事の内容もそうですが、この操作によって、データを失っても私は責任を持てません。

やるのであれば、必ずバックアップを取った上で行ってください。


使うのは 「 gdisk 」というソフトウェアです。
往年の fdisk コマンドの GPT 版ととらえて、問題無いと思います。

(作業機は Linux Mint 12 を想定していますが、 Ubuntu でも動作すると思われます。)
(Fedora, CentOS などの Redhat 系は、適宜読み替えて頂ければ、問題ないかと思われます。)

 

1.gdisk をインストール。

$sudo aptitude install gdisk

追記:

debian であれば、 backports に転がっているようです。 ( ほっそーさんありがとうございます! )

(確認環境: debian squeeze)

 

2.gdisk を起動する。

この際、 /dev/ 以下のどのデバイスファイルが操作したい対象のディスクを指しているか

知っておく必要があります。

少し触れておきますと、

大抵が sd? というように、先頭2文字が sd で始まるファイルが割り当てられていることが多く、

1番目の接続が sda, 2番目が sdb というように名前が振られています。

また、IDE 接続の場合は、 sd ではなく hd となり、 hda, hdb となっている可能性があります。

(ただ、IDE 接続でも sd で始まる場合が多いようです。前は見かけたのですがやはり libata の関係ですかね。

その他、ソフトウェア RAID

マザーボード上で提供されている RAID や、

Windows の場合は、コンピュータの管理から設定できる RAID など、

RAID コントローラを経由せずに、ソフトウェアで提供されている RAID

を使っている場合、

/dev/mapper/ 以下にいい感じでデバイスファイルが用意されている場合があります。

その場合は、そのファイルを使用してください。

・・・よくわからない場合や、

実際に RAID を使っていてよくわからない人は、ここから先は特に自己責任でお願いします。

 

例: /dev/sda が対象のHDD の場合。

$ sudo gdisk /dev/sda

なお、この先の記述は 対象HDD が /dev/sda である場合を想定しています。

適宜対象環境に併せて、読み替えてください。

Hybrid MBR から GPT にする場合は 3.1 
Hybrid MBR から MBR にする場合は 3.2

単なるMBR ディスクから GPT にする場合は 3.3

にそれぞれ記述しましたので、ご参照ください。

(純粋な GPT ディスク から MBR ディスクにする場合も、 3.2 で紹介する方法が使えます。)

 


3.1 Hybrid MBR から GPT ディスクにする。

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: hybrid
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with hybrid MBR; using GPT.

Command (? for help): q

GPT が present になっていることを確認し、 q を打ち、いったん閉じる。

$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1

このようにコマンドを打ち(数値は小さくするのはいいですが、大きくするのはNG) MBR を消す。

$ sudo gdisk /dev/sda

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with corrupt MBR; using GPT and will write new
protective MBR on save.

MBR が not present となり、削除されたことがわかる。

Command (? for help): w

w を打って Enter

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed, possibly destroying your data? (Y/N): Y

Y を打って Enter

あとは再起動すれば完了となります。

 


3.2 Hybrid MBR から MBR にする。

2 にて起動した状態のまま、

Command (? for help): r

r を打って Enter

Recovery/transformation command (? for help): g
Sorted GPT partitions and their current conversion status:
                                      Can Be
Number    Boot    Size       Status   Logical   Code   GPT Name
(なにかでる)

g を打って Enter

Type partition to change, 0 to accept, -1 to abort: 0

Converted 3 partitions. Finalize and exit? (Y/N): Y
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.

数字の 0 を打って Enter,  そして 次で Y と打つことで、変換が完了し、

再起動すると適用されます。

 


3.3 MBR から GPT への変換。

MBR から GPT への変換は危険なにおいがするのですが、うーむ。

というのも、

GPT 形式のディスクは MBR 領域(ディスク先頭)と GPT 領域(ディスク末端)の両方を持っていますが、

MBR 形式のディスクは MBR 領域しか持っていないため、どうするのだろう。と。

末端のデータが壊れないのかなぁ、と心配だったりします。

$ sudo gdisk /dev/sda

GPT fdisk (gdisk) version 0.6.14

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present

MBR : MBR only となっていることから、 MBR ディスクであることがわかる。

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed, possibly destroying your data? (Y/N): Y
OK; writing new GUID partition table (GPT).
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

w を押して Enter, Y を押して Enter

これで GPT ディスクに変換されます。

銀行丸めと四捨五入。

というわけで、端数の丸め処理についてです。

端数処理ということで、たぶん思いつくのは、

  • 切り捨て
  • 切り上げ
  • 四捨五入

こんなところではないかと思います。

ここで、テストデータとして

11.4, 11.5, 11.6, 12.4, 12.5, 12.6

という6つのデータを用意します。
それぞれの処理についてですが、通り下記のようになります。

データ 切り捨て 切り上げ 四捨五入
11.4 11 12 11
11.5 11 12 12
11.6 11 12 12
12.4 12 13 12
12.5 12 13 13
12.6 12 13 13

 

C や C# そして Ruby や Java などでは、実数を整数に丸める際、
単純にキャストしますと切り捨てますが、

round 関数で丸める際に、挙動が異なります。

Python:
image

Ruby:
image

C#: (自作のシェル経由でごめんなさい)
image

 

C や Ruby, Java では四捨五入がデフォルトで行われますが、
C# では、銀行丸めがデフォルトで行われます。

正式名称は 「最近接偶数への丸め」と言いますが、
「銀行丸め」のほか、「JIS丸め」「ISO丸め」とも言われます。

[Wikipedia の解説記事]

JIS丸めとは?
http://homepage1.nifty.com/s_miyake/hp/jisround.htm

JIS Z 8401
http://www.jisc.go.jp/app/pager?id=94037

 

上の記事の文章を用いて、簡単に説明すれば、

N桁で丸める場合
第N桁が偶数なら 5以下は切り捨て。それ以外は切り上げ。
第N桁が奇数なら 5未満は切り捨て。それ以外は切り上げ。

 

この挙動について、
11.5 と 12.5 という2つの値を整数値に丸めるという場合で説明しますと、

まず 11.5 の場合。
整数値に丸めるので、整数第1位に丸めることになります。

この場合、整数第1位の値は 1 となり、「奇数」です。
次にこの一つ下の値を参照し、 5 であるため、奇数で5未満でないため切り上げ。

よって、 12 となります。

 

次に 12.5 の場合。

同様に整数第1位の値を見ると 2 となり「偶数」です。
一つ下の値は 5 であるため、偶数で5以下のため切り捨て。

よって、12 となります。

 

ただどうしてこういう丸め方をしているかというと、
主に銀行や統計などにおいて、誤差を小さくするために用いられています。

整数に丸める時の注意 – DiaryException
http://d.hatena.ne.jp/LaclefYoshi/20110430/1304138274

こちらの記事におもしろい実験結果がありますので、参照して頂けたら。

 

上記ブログで用いられている R という言語は、統計に特化した処理系ですので、
やはり誤差を抑えるために、銀行丸めが行われているものと思われます。

 

というわけで、先ほどの結果に、銀行丸めと合計を追加すると以下のようになります。

 

データ 切り捨て 切り上げ 四捨五入 銀行丸め
11.4 11 12 11 11
11.5 11 12 12 12
11.6 11 12 12 12
12.4 12 13 12 12
12.5 12 13 13 12
12.6 12 13 13 13

 

というわけで、統計やトレードなどを行う場合はありがたいわけですが、
どうしても四捨五入を行わなければならない場合があります。

その場合は、Math.Round(val) としているところを、

Math.Round(val, MidpointRounding.AwayFromZero);

とすることで解決可能です。

image

 

ではではー!

distcc と ccache でビルド高速化

みむらです。

複数台のマシンをお持ちの方、絶対いらっしゃいますよね。
ついでに、隅っこで寝てるとかそういうパターン、絶対ありますよね。

ということで、そういうマシンをコンパイルの際に利用して、是非とも効率よくパワーを使いましょう。

ついでに、ccache を有効にして、キャッシュしましょうという、そんなお話。

追記ですが、 Mac OS X にはこれがなにやら、標準で入っているそうです。
Mac マシンを大量にお持ちの方は、是非ともやってみるといいんじゃないでしょうか!


ということで、カーネルを並列ビルドすることを例にして、使い方。 (Linux Mint 12 でテストしてます。)

 

1.distcc と ccache をインストール。

$ sudo aptitude install distcc ccache

 

2./etc/default/distcc を修正する。

$ sudo vim /etc/default/distcc

# 書き換えるのは下記3点

# 動作を許可させる
STARTDISTCC="false" -> STARTDISTCC="true"

# 接続可能ホストを設定する。
ALLOWEDNETS="127.0.0.1" -> ALLOWEDNETS="192.168.1.0/24"

# リスナとなる NIC の IP アドレスを入力
LISTENER="127.0.0.1" -> LISTENER="192.168.1.200"

 

3. distcc を起動する。

$ sudo service distcc start

 

4. (操作マシン側にて) 接続先のホストを、 DISTCC_HOSTS に設定

(例 192.168.1.200 と 192.168.1.201 が処理マシンだった場合 )

$ export DISTCC_HOSTS="localhost 192.168.1.200 192.168.1.201"

 

5.ビルド

# configure を行う場合
$ CC="ccache distcc gcc" CXX="ccache distcc g++" ./configure

# make を行う場合
#
# なおこの場合、物理コア数の2倍を同時実行数に指定すると、
# なんかいい感じらしいです。
#
# http://distcc.googlecode.com/svn/trunk/doc/web/faq.html
#
# 今回の場合は、各ノードに 4スレッドの CPU が乗っていて、
# 自分と、それ以外の2台のマシンがあると仮定。
#

$ make -j 24 CC="ccache distcc gcc" CXX="ccache distcc g++" HOSTCC="ccache distcc gcc" HOSTCXX="ccache distcc g++"

たぶん、HOSTCC と HOSTCXX の指定は、カーネルビルドの時ぐらいしかいらない気がしなくも。

ついでに、 configure で CC と CXX 指定したら、 make 時はいらなそうな。

とりあえず、自分の備忘録ってことで。メモメモ。

 

追記事項としては、

ビルド環境のコンパイラとかインクルードファイルとかは一緒にしておいた方がいいよということ。

あわせておかないと、面倒なことになるようです。

ソフト面だけ合っていれば問題なさそうなので、ハードウェア面は、プロセッサのアーキテクチャが違うとか、

そういう系を除けば大丈夫だと思います。