February 2008

February 21, 2008

[自分メモ]xen環境 ubuntu6.06 dapper上にCentOS4

CentOS4をdomainUとして、Xen環境を作成した時のメモです。
基本的にはdebianをDomainUとして作成する場合と同様の手順になります。
違いはベースシステムのインストール方法です。
debianの場合はdebootstrapを用いましたが、CentOSではyumを使います。
ubuntuではapt-getyumをインストールできます。
$ sudo apt-get install yum

/etc/yum.confは次のようになっています。
[main]
cachedir=/var/cache/yum
debuglevel=2
logfile=/var/log/yum.log
pkgpolicy=newest
distroverpkg=centos-release
tolerant=1
exactarch=1
retries=20
obsoletes=1
gpgcheck=1
[base]
name=CentOS-4 - Base
mirrorlist=http://mirrorlist.centos.org/?release=4&arch=i386&repo=os
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#released updates
[update]
name=CentOS-4 - Updates
mirrorlist=http://mirrorlist.centos.org/?release=4&arch=i386&repo=updates
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

イメージファイルをマウントしたら、以下のコマンドでCentOSのベースシステムをインストールできます。
$ sudo yum -y --installroot=/path/to/mnt groupinstall core base

--installrootには絶対パスを記述する必要があります。

インストール後に編集すべきファイルとしては、
・etc/fstab
・etc/hosts
・etc/sysconfig/network
・sysconfig/network-scripts/ifcfg-ethx
・etc/yum.conf
あたりでしょうか。
それ以外は、debianをDomainUとして作成する場合と同様の手順でOKだと思います。


matssaku at 04:42|PermalinkComments(0)TrackBack(0)clip!Linux | Xen

February 16, 2008

[Scala]その4 数値はオブジェクト

チュートリアルを進めます。
A Scala Tutorial for Java programers
ScalaではJavaのintのようなプリミティブ型は存在しません。
整数型も実数型も全てがオブジェクトです。
また、+, *といった演算子は、実はメソッド呼出しに対応しています。
まずは単純な例からです。
1 + 2

上の例は、次のように書き換えることができます。
1.+(2)

これは、オブジェクト1のメソッド+を、引数に2を渡して呼び出していることになります。
Scalaでは引数が1つの場合は、メソッド呼出しの.()を省略できるため、
1.+(2)
1 + 2

は等価な式になります。
同様に
1 + 2 * 3 / x
1.+(2.*(3./(x)))
と表すことができます。

matssaku at 03:32|PermalinkComments(0)TrackBack(0)clip!Scala 

February 09, 2008

[自分メモ]xen環境 DomainUをイメージファイルで作るリスク

ちなみに、xenのDomainUの作成方法として、ddでイメージファイルを作る方法とDomainU用のパーティションを別途用意してインストールする方法がありますが、信頼性が要求される場面では、DomainU用のパーティションを用意してインストールするべきです。
イメージファイルは結構壊れます。
わたし自身、DomainUの再起動時にエラー+fsckで大量のファイルがlost+found行き、という事態に何度か遭遇しました。

matssaku at 00:54|PermalinkComments(0)TrackBack(0)clip!Xen | Linux

[自分メモ]xen環境 ubuntu6.06 dapper上にdebian etch

ソフトウェア開発の過程では効率化のために
・開発・デバッグ用
・テスト用
・顧客向けデモ用
の様に、プロジェクトの中で複数のホストを用意したい場合がよくあります。
ただ、開発に使えるリソースは限られるため、要求に応じて複数台のマシンを用意、というわけにはなかなかいきません。
そんな時にXenは非常に便利です。
職場ではUbuntu6.06 dapper-server版の上に
・Ubuntu
・debian
・CentOS
など、色々なOSを載せて活用しています。
Domain0の設定、およびUbuntuをDomainUとして用いる場合の手順はこちら(英語)が参考になります。
以下はUbuntu6.06 dapper-server版をDomain0、debian etchをDomainUとして作成した時のメモです。

1. まず、Xen仮想マシンのイメージファイルの元をddコマンドで作成します。ここではルートパーティション10GBとswapパーティション1GBを作成します。
# dd if=/dev/zero of=root bs=1M count=10000
# dd if=/dev/zero of=swap bs=1M count=1000

2. 作成したイメージファイル上にファイルシステムを構築します。
# mkfs.ext3 root
# mkswap swap

3. ルートパーティション用イメージファイルをマウントし、debootstrapコマンドを用いてdebianのベースシステムをインストールします。
# mkdir mnt
# mount root mnt -o loop
# debootstrap etch mnt http://ftp.jp.debian.org/debian/

4. 作成したベースシステム上にモジュールファイルをコピーしておきます。(必須かどうかは不明)
# cp -a /lib/modules/2.6.19-4-server/ ./mnt/lib/modules/

5. 作成したベースシステム上のファイルを編集し、環境設定を行います。必要なのは
(1)etc/hostname
(2)etc/hosts
(3)etc/network/interfaces
(4)etc/fstab
あたりだと思います。(1)〜(3)は、作成したい仮想マシン環境に合わせて適切に設定します。
fstabの内容は以下の通り。
proc /proc proc defaults 0 0
/dev/sda1 / ext3 defaults,errors=remount-ro 0 1
/dev/sda2 none swap sw 0 0

6. イメージファイルをアンマウントします。
# umount mnt

7. DomainU起動用の設定ファイルを用意します。私の環境の場合は以下のファイルをxen00.cfgとして作成しました。
# Debian etch.
kernel = "/boot/vmlinuz-2.6.19-4-server"
ramdisk = "/boot/initrd.img-2.6.19-4-server"
builder='linux'
memory = 512
name = "xen00"
vcpus = 1
vif = [ '' ]
disk = [ 'file:/etc/xen/images/xen00.d/root,ioemu:sda1,w',
'file:/etc/xen/images/xen00.d/swap,ioemu:sda2,w',
]
root = "/dev/sda1 ro"
memory、nameは任意の値に設定できます。diskのパスはイメージファイルの場所に合わせて設定して下さい。

8. いよいよDomainUを起動します。
# xm create -c xen00.cfg
起動に成功した場合は、DomainUのコンソールに移行します。
起動メッセージに続いてログインプロンプトが表示されます。
起動直後は最小構成の状態です。
sshなど、必要なソフトはapt-getで別途インストールする必要があります。
xenコンソールからは、ctrl + ]で抜けることができます。
DomainUの起動・終了については、
$ man xm
を確認します。

以下は発生したトラブルです。

トラブルその1.
xenコンソール:
xm create -c
xm console
で操作したとき、viの動作がおかしい。
具体的には、コロン(:)のキーが使えないのです。これはコンソールエミュレータ(Poderosa)のせいなのかもしれませんが、原因がわかりませんでした。
とりあえずxenコンソールではnanoを使うことにしました。

トラブルその2.
sshログイン時
stdin is not a tty
と表示され、入力内容が表示されない。
どうやらudevをインストールする必要があるようです。
# apt-get install udev


トラブルその3.
udevインストール後、再起動するとネットワークインタフェースが起動しない。エラーメッセージは
SIOCSIFADDR: No such device

どうやら、udevが勝手にネットワークインタフェースの名前を変えてしまうようです。
# ifconfig -a
の内容に合わせて
/etc/network/interfacesの内容を書き換えるか、udevの設定ファイル/etc/udev/rules.d/z25_persistent-net.rulesを編集し、
# ifup インタフェース名
を実行する必要があります。

matssaku at 00:41|PermalinkComments(0)TrackBack(0)clip!Xen | Linux

February 01, 2008

[自分メモ]PDFの構造

PDFの構造が少しわかったのでメモしておきます。
(Adobeの仕様をちゃんと読んだわけでは無いので、不正確だと思います。)
PDFは大きく分けると
・Header
・オブジェクトデータ
・クロスリファレンステーブル
・Trailer
の各部分から構成されるようです。
(この順番で並んでいることが多いようです。)
この内、オブジェクトデータが実際の文書、およびレイアウトの内容を保持しています。
オブジェクトデータは文字型、配列型、辞書型など様々な型を持つオブジェクトが複数集まることによって構成されています。
各オブジェクトには固有の番号があてられていて、この番号をオブジェクト同士が相互に参照しあい、全体としてツリー構造を形成しています。
クロスリファレンステーブルは各オブジェクトのファイル内での位置情報、すなわち、
何番のオブジェクトが何バイト目に存在する
という情報を保持しています。
PDFファイルはエディタで開くと一見テキストデータのように見えますが、普通のテキストエディタで編集することはできません。
テキストエディタによる編集では、改行コードの変更などによって、バイト数が変化してしまい、クロスリファレンステーブルの位置情報が狂ってしまうことがあるからです。

クロスリファレンステーブルが壊れてしまった場合には
pdftk
というツールで修復できる場合があります。




matssaku at 00:40|PermalinkComments(0)TrackBack(0)clip!雑記 

[自分メモ]IEでPDFをインライン表示するとデータが壊れる?

reportlabを使用したPDF出力で発生した問題ですが、reportlabがスレッドセーフでないのとは別の問題のようです。 「PDFに空白ページが発生する」 という報告を受けたのですが、当初はどうにも原因がわかりませんでした。 送付頂いたpdfデータには確かに空白のページが含まれています。 それで、データの中身を調べてみるとどうやらxref、クロスリファレンステーブルの指定位置がずれているようなのです。 ただ、サーバから返却しているデータには問題が無いはずで、なぜそんなことが発生するのかが全くわかりません。 色々試してみた結果、 ・サーバで作成したデータは、クライアントに送付する直前の段階では問題が無い。 ・IE内で表示した時には空白ページが生じてしまう。それをブラウザメニューで保存すると、xrefが不正な状態のファイルが保存される。 ・Firefoxなど、他のブラウザでは問題なく表示される。 ・IEの右クリックメニュー、「対象をファイルで保存」で保存した場合は、正しいファイル(サーバが送付したデータ)が保存される。 といった条件から、 IEでPDFファイルをインライン表示した時にデータが壊れる という結論を出したのですが、そんなことってあり得るのでしょうか。 google検索してもそれらしい報告は無いですし、ちょっと謎です。 生成したPDFのどこか(xref以外の部分)がおかしい為にIEのAdobeReaderプラグインが修復しようとした結果、という可能性もありますが・・・。 とりあえず、HTTPResponseの inlineattachmentに変えて必ずダウンロード保存として頂くことにしました。

matssaku at 00:10|PermalinkComments(0)TrackBack(0)clip!雑記