2010-02-22

Protocol Buffersをビルド~リンクするメモ

Cの構造体のようなものをそのままシリアライズしたくなったのでProtocol Buffersを試してみようと思います。
http://code.google.com/intl/ja/apis/protocolbuffers/docs/overview.html

Protocol BuffersはまだDebianパッケージにはなってないようなのでソースからビルドします。
ソースは以下から
http://code.google.com/p/protobuf/downloads/list

とりあえず現在最新バージョンの2.3.0を落として普通にビルドしてみます。
wget http://protobuf.googlecode.com/files/protobuf-2.3.0.tar.gz
tar xzf protobuf-2.3.0.tar.gz
cd protobuf-2.3.0
./configure
make
make check
sudo make install

以上がうまくいっていれば、
protoc --version
でバージョンが表示されるはずですが、どうやらライブラリのリンクがうまくいかないようです。
% protoc --version
protoc: error while loading shared libraries: libprotobuf.so.6: cannot open shared object file: No such file or directory

ちなみに使用環境は、
% uname -a
Linux chameleon 2.6.26-2-amd64 #1 SMP Thu Feb 11 00:59:32 UTC 2010 x86_64 GNU/Linux

こんな時は、make install した時に表示される以下のようなメッセージ従ってリンク先のパスを設定します。
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

上の方法の他に/libにシンボリックリンクを張ったりでもたぶん大丈夫ですが、バイナリファイルにリンク情報を埋め込んでやる方が安全です。
(本来は/etc/ld.so.conf で設定されているはず。当環境では/usr/local/lib をみるようにすで設定されてたけど、なぜかリンクエラーになる。原因不明。)

リンク情報を埋め込むには、MakefileのLDFLAGSの行に以下のようにしてリンカオプションを渡してやります。
LDFLAGS = -Wl,-rpath,/usr/local/lib

ちなみに、Makefileは複数ありますが、編集するのは protobuf-2.3.0/src/Makefile だけでOKです。

LDFLAGSを設定したらsrc以下だけ再度ビルド、protobuf-2.3.0/src/.libs/ 以下に生成されているバイナリをobjdumpして正しいRPATHが入っていればOKです。
$ objdump -p .libs/protoc | grep RPATH
  RPATH       /usr/local/lib

再度インストールして、きちんとバージョンがでればOKです。
$ protoc --version
libprotoc 2.3.0

2010-02-21

Bloggerでfaviconとかを設定するメモ

なんとなくアイコンとかマスコットとか、見た目のイメージは重要だと思ったのでいろいろ変えてみました。

faviconの設定方法は旧Bloggerと現Bloggerによってテンプレートが違うのでやり方も異なるようです。
現Bloggerのテンプレートは単にheadタグの間においただけではデフォルトのアイコンに書き換えられてしまいます。

そこで、</b:skin> と </head> の間に

<link href="faviconのURL" rel="shortcut icon"></link>
<link href="faviconのURL" rel="icon"></link>

を書く必要があります。

faviconは下で探しました。
http://www.favicon.cc/?action=icon_list

ぴったりのアイコンとかマスコットを探すのはなかなか難しいですね。
とくにfaviconはあんまり凝ったのにするとなんか安っぽい感じになるし、根拠もなく文字ベースのアイコンを使っても結局なにをアピールしたいのかよく分からなくなってしまいます。


テンプレートはいろいろ試してみましたが、結局なるべくミニマルなのを探して自分でカスタマイズするのがベターという結論に達しました。
最初から完成しているテンプレートはカスタマイズがしにくいにので、いまいち愛着がわきづらいです。
ちなみにベースにしたテンプレートは以下から拾ってきました。
http://www.blogcrowds.com/resources/blogger-templates/

2010-02-20

Solarisで自動起動するプログラムを制御するメモ

KVMでSolarisが使えるようになったのはいいものの、X Windowが立ち上がっているとメモリの消費が激しくてもっさりした動作になってしまいます。
わざわざ仮想マシンでブラウザ使ったりすることもないので、X Windowはデフォルトで立ち上がってほしくありません。

Debianでは/etc/init.d/で制御できますが、SolarisではSMFという仕組みがあるようです。
http://sy2920.s151.xrea.com/solaris/smf.html

とりあえずsvcsコマンドでサービスの情報を見てみます。
$ svcs | head
STATE          STIME    FMRI
legacy_run      6:57:56 lrc:/etc/rc2_d/S20sysetup
legacy_run      6:57:57 lrc:/etc/rc2_d/S47pppd
legacy_run      6:57:57 lrc:/etc/rc2_d/S72autoinstall
legacy_run      6:57:57 lrc:/etc/rc2_d/S73cachefs_daemon
legacy_run      6:57:57 lrc:/etc/rc2_d/S81dodatadm_udaplt
legacy_run      6:57:57 lrc:/etc/rc2_d/S89PRESERVE
legacy_run      6:57:57 lrc:/etc/rc2_d/S98deallocate
disabled        6:55:22 svc:/system/xvm/ipagent:default
online          6:54:44 svc:/system/svc/restarter:default
 今回無効にしたいのはX Windowですが、親プロセスの名前が分からないのでpstreeをしてみます。
 |-+- 01059 root /usr/sbin/gdm-binary
 | \-+- 01060 root /usr/sbin/gdm-binary
 |   |--- 01081 root /usr/openwin/bin/fbconsole -n -d :0
 |   |--- 01061 root /usr/X11/bin/Xorg :0 -depth 24 -nolisten tcp -audit 0 -br
 |   \--- 01084 gdm /usr/lib/gdmgreeter
どうやらgdmなんとか、というサービスを殺せば良いようです。
$ svcs -l gdm
fmri         svc:/application/graphical-login/gdm:default
name         GNOME Display Manager
enabled      true
state        online
next_state   none
state_time   2010年02月20日 07時55分03秒
logfile      /var/svc/log/application-graphical-login-gdm:default.log
restarter    svc:/system/svc/restarter:default
contract_id  100
dependency   require_all/none svc:/system/filesystem/local (online)
dependency   require_all/error svc:/milestone/multi-user:default (online)
dependency   require_all/none svc:/milestone/sysconfig (online)
dependency   optional_all/none svc:/system/xvm/vnc-config (online)
dependency   require_all/none svc:/application/font/fc-cache (online)
dependency   require_all/none svc:/system/utmp (online)
dependency   require_all/none svc:/system/hal (online)
dependency   optional_all/none svc:/application/opengl/ogl-select (online)
dependency   optional_all/none svc:/application/desktop-cache/mime-types-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/desktop-mime-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/pixbuf-loaders-installer (online)
dependency   optional_all/none svc:/application/desktop-cache/icon-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/gconf-cache (online)
dependency   optional_all/none svc:/application/desktop-cache/input-method-cache (online)


svcadmでgdmをdisableします。
$ sudo svcadm disable gdm

きれいにX Windowが死にました。
ちなみに使っているSolarisのバージョンではデフォルトでプロセス監視デーモンが起動しているみたいで、単にgdmをkillしただけでは、自動的に再起動がかかってしまいます。

Linux(Debian Lenny) KVMの仮想マシン用ネットワーク設定

前回KVMでOpenSolarisをセットアップしましたが、ネットワーク設定については省略していたので一応メモしておきます。

とは言っても基本的にはここに書いてあるとおりにすればOKです。
http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-lenny-server


ネットワーク設定は、Debianの場合は/etc/network/interfaces ファイルを編集して行います。たぶんUbuntuでも同様です。
参考までに設定内容をさらしておきます。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet manual

auto virbr0
iface virbr0 inet static
   address 192.168.1.50
   network 192.168.1.0
   netmask 255.255.255.0
   broadcast 192.168.1.255
   gateway 192.168.1.1
   bridge_ports eth0
   bridge_fd 9
   bridge_hello 2
   bridge_maxage 12
   bridge_stp offk

 仮想マシンを作成する際に、ネットワーク接続設定で共有物理装置を選択してここの設定で作成したブリッジを使用するようにします。
また、親機はLANで192.168.1.50にIP固定してますが、仮想マシンの方でもIPを固定したい場合は仮想マシン側で設定する必要があります。
最近のほとんどのOSではインストール時にデフォルトでDHCPが使われるので、IP固定する必要が無い場合は仮想マシン側で特に設定する必要はありません。

上記の設定をして、
% sudo /etc/init.d/networking restart

として、ifconfigすればvirbr0が追加されているのが確認できます。
% sudo ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 00:1b:fc:b5:d7:16
          inet6アドレス: fe80::21b:fcff:feb5:d716/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2941586 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:4429749 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:783148810 (746.8 MiB)  TXバイト:5767081060 (5.3 GiB)
          割り込み:254 ベースアドレス:0x4000

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:97752 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:97752 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:131654783 (125.5 MiB)  TXバイト:131654783 (125.5 MiB)

virbr0    Link encap:イーサネット  ハードウェアアドレス 00:1b:fc:b5:d7:16
          inetアドレス:192.168.1.50 ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: 2001:c90:1440:3692:21b:fcff:feb5:d716/64 範囲:グローバル
          inet6アドレス: fe80::21b:fcff:feb5:d716/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:2638912 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:4277438 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0
          RXバイト:271638921 (259.0 MiB)  TXバイト:5737162576 (5.3 GiB)

ここで仮想マシンを立ち上げると、以下のように vnet が追加されていきます。
vnet0     Link encap:イーサネット  ハードウェアアドレス 00:ff:ea:f3:9d:56
          inet6アドレス: fe80::2ff:eaff:fef3:9d56/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:64 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:306 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:500
          RXバイト:7259 (7.0 KiB)  TXバイト:59290 (57.9 KiB)
以上で設定は終わりです。
一応仮想マシン側の方も確認してみます
$ ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
rtls0: flags=1004843 mtu 1500 index 2
        inet 192.168.1.15 netmask ffffff00 broadcast 192.168.1.255
lo0: flags=2002000849 mtu 8252 index 1
        inet6 ::1/128
rtls0: flags=2000841 mtu 1500 index 2
        inet6 fe80::5652:ff:fe34:e14/10
rtls0:1: flags=2080841 mtu 1500 index 2
        inet6 2001:c90:1440:3692:5652:ff:fe34:e14/64

こまかい内容はよく分かりませんが、とりあえずDHCPで192.168.1.15が割り当てられているようです。

2010-02-14

Linux(Debian Lenny)のKVMでOpenSolarisを動かすメモ

前回、仮想環境について調査を行った結果(http://taksatou.blogspot.com/2010/02/virtualbox-vs-vmware-vs-kvm-on-linux.html )KVMが良さそうだったので、実際に導入してみました。

当初はCUIだけで行くつもりでしたが、virt-managerを使えば簡単にできそうだったし、仮想環境をインストールしたときの感動が欲しかったのでGUIでやることにしました。

参考:http://wiki.debian.org/KVM#Lenny
http://www.linux-kvm.org/page/HOWTO1
http://www.howtoforge.com/virtualization-with-kvm-on-a-debian-lenny-server

今回利用した環境は以下です。KVMをフルで利用するにはそれなりに新しいバージョンのカーネルが必要なようです。少なくとも2.6.18以上である方が良いようです。(http://www.linux-kvm.org/page/Choose_the_right_kvm_%26_kernel_version)
% uname -a
Linux chameleon 2.6.26-2-amd64 #1 SMP Wed Aug 19 22:33:18 UTC 2009 x86_64 GNU/Linux

また、CPUのハードウェアの仮想化もサポートしている必要があります
egrep '(vmx|svm)' --color=always /proc/cpuinfo
でvmxかsvmが見つかればOKです。

以上問題なければパッケージをインストールします。
sudo aptitude install kvm virt-manager
今回はGUIのマネージャーを使ってみようと思うので、virt-managerをインストールします。硬派にCUIだけで行きたい人は代わりにlibvirt-binをインストールします。(virt-managerをインストールすればlibvirt-binもインストールされます)


バーチャルマシンを一般ユーザ権限で動かすためにユーザグループに追加します。
sudo adduser `id -un` libvirt
(グループを追加したら一旦ログインし直す必要があります。)

ここで、ちゃんとKVMがインストールできたか確認してみます。
% virsh -c qemu:///system list
virsh Id Name State
----------------------------------

うまくできていればこのように表示されるはずです。
ここまでできればあとはGUIでほぼすべてできます。

まずコンソールからvirt-managerを起動します。
% virt-manager

すると仮想マシンマネージャーというウィンドウが立ち上がります。
日本語化されてるので雰囲気で大体分かると思いますが、以下のような手順で設定します。WindowsのVirtualPCとかとほぼ同様なはずです。



新規をクリックします。


名前をつけます。


細かいことはよく分かりませんが、完全仮想化しか選択できないようになってました。
今回はKVMを使いますが、QEMUをつかえばSPARCとかPPCも使えます。


インストール方法を選択します。今回はディスクイメージから入れます。


ディスクイメージのファイルパスを設定するか、インストールメディアを挿入します


ストレージファイルの割り当てサイズと置く場所を決めます。
とりあえず8Gで、「今、仮想ディスク全体を割り当てますか?」というチェッ クは外しておきました。


ネットワーク設定をします


メモリとCPU割り当てを決めます。後からでも変えられるのでとりあえずデフォルトでいきます。


確認して完了を押します


新しくできた仮想マシンを開きます


LinuxでSolarisが動いています。

簡単ですね。

VirtualBox vs VMware vs KVM on Linux

自宅の開発環境を仮想化したくなってきたので仮想化技術について調査を行いました。

まず仮想化技術一般については下を参照。
http://itpro.nikkeibp.co.jp/article/lecture/20061228/258010/
http://www.atmarkit.co.jp/flinux/rensai/kvm01/kvm01a.html

今回仮想化するにあたっての条件は、
  • Linux(Debian Lenny)上で動く
  • 導入が楽
  • デスクトップ環境は不要
です。というわけで主に以下の3つを調べることにしました。
  • VMware Server
  • VirtualBox
  • KVM

検索してみたらこれらについて実際にベンチマークをとった人がいたようです。
http://forum.virtualbox.org/viewtopic.php?f=1&t=21314&sid=627b4d97f3252a9fe8813305c6f072d3
http://ezjd.blogspot.com/2009/08/virtualbox-vs-vmware-server-vs-kvm-part.html

ここらへんにのってるのは半年ほど前の情報ですが、
ざっとまとめると
  • 速さ:KVM>VMware Server≒VirtualBox
  • 安定性:VMware Server≒VirtualBox>KVM
  • ゲストOS上のクロックは高負荷時にずれることがあるので、測定結果はあまり信用しない方がいい
という感じっぽいです。

また、便利さという観点からみると調べた限りでは以下のような感じでした。
  • VirtualBoxのドキュメントはなかなか良いっぽい
  • VMware ServerのDebianパッケージはないけどVirtualBoxとKVMはある

以上を総合的に考えるとVirtualBoxのポイントが若干高いですが、デスクトップ環境は別にいらないし、速いほうがうれしいのでKVMを導入することに決めました。

2010-02-01

あえて自分に不快感を与えることで作業効率を上げるLifehack - zsh プロンプト編 -


作業をしているとついつい時間を忘れてしまいがちです。
特に深夜に作業をしている時は、気づいたら明け方だったなんてことはよくあります。

体力的にも精神的にも深夜の作業はよくありません。
そんな深夜の作業を避けるためにはどうしたらよいでしょうか?

答えは簡単です。
深夜になると作業が不快になる仕組みをつくればばよいのです。
そうすれば必然的にモチベーションが下がってあきらめムードになります。
朝起きてやろうという意志がでてくるはずです。

どういうときに作業が不快になるかというと、シェルやエディタが思い通りにうごかなかったり、文字化けしたり見づらい文字が表示されるときなど、色々あります。

今回はとりあえず手始めとして、深夜になるとプロンプトが見づらくなってくる設定を書きました。
プロンプトが見づらいのは不快です。
設定の中身はこんな感じです。

COLOR_LIST=(60 55 57 63 109 111 117 116 115 114 113 112 184 178 172 166 160 124 125 126 127 128 129 93)
preexec () {
    PROMPT="%B%(?..[%?] )%b%{^[[38;5;"$COLOR_LIST[`date | awk -F"[ :]" '{print $7}'`]"m%}%n@%U%m%%%u%{^[[m%} "
}

※注
dateコマンドの出力結果に依存します。環境に合わせて適当に変更してください。
コマンドを打つたびにスクリプトが走ることになるので環境によってはもっさりするかもしれません。

設定の中身は単にpreexecを使ってコマンドを実行するたびに時間に対応する色を再設定しているだけです。
COLOR_LISTの色をうまく調整すれば不快度は自由に設定できます。
深夜の色を背景色と近い色にしておけば自然と不快感が得られます。
ここの例で使っている色はとりあえず適当に選んだだけなので深夜でもそこそこ見やすい色ですが、モニタにあわせて絶妙にやる気がなくなる色を探す必要があります。

もっとアグレッシブに標準出力の文字すべてを見えなくすることもできなくはないですが、さすがにそれはやり過ぎです。あまりやり過ぎると設定ファイルをもとに戻すという無意味な結果になってしまう恐れがあります。

まあそもそもエディタで作業をしてる間はプロンプトの色には気づかないので無意味と言えば無意味ですが、要は気持ちの問題です。

ZenBackWidget