Wednesday, July 31, 2013

gnupack(emacs-24.x)でw3mを使う

私は Windows 上では長らく Meadow を使っていたのだが、Meadow は emacs-22系であるほか、IME回りでたまに落ちることがあったので、そろそろ乗り換えるか…ということで、最近 emacs-24系ベースの gnupack (11.00) に移行してみた。
(もちろん、Meadow の開発者の皆さまには、とても^2感謝しております!これまでどうもありがとうございました!)
移行作業自体は、ほぼ無問題だったのだが、HTMLメールのレンダリングに使っていた emacs-w3m 関連で微笑^H小な TIP があったのでメモ。

emacs-w3m の最新リリース版は 1.4.4 であり、以下からダウンロードできる。

http://emacs-w3m.namazu.org/#download

しかし、リリース版では emacs のバージョンごとに処理を分けている部分が emacs-21 系までしか対応しておらず、

http://emacs-w3m.namazu.org/ml/msg08719.html

にあるようなエラーが出てしまう。(上記は、なんと2006年の記事だ!)
そして、emacs-24 系の現行 gnupack (11.00)環境で、上記の記事で紹介されている work around で逃げようとすると、今度は emacs lisp に非互換があるらしく、やはりうまくいかないのだった。

さて、どうしようか…と調べていたところ、上記の emacs-w3m ダウンロードページに記載のある CVS リポジトリにある開発最新版では、w3m-e19.el や w3m-e20.el や w3m-e21.el といったファイルが w3m-ems.el という名前で統合されており、emacs-24 系でも問題なく使えそうなことがわかった。

そうすると、後は組み込んで使うだけなのだが、ここで問題が一点。
CVSの開発版でも、ドキュメントには emacs (gnupack) の環境定義ファイル(.emacs)
から

   (require 'w3m-load)

して使うべし…と書いてあるのだが、本記事執筆時点の CVS リポジトリからは w3m-load.el が消えてしまっている!

さて、どうするのが正しいのだろうか...と考えたのだが、この記事

http://d.hatena.ne.jp/minazoko/20110307/1299516952

を参考に、「emacs-w3m のリリース版には w3m-load.el あるから、これをコピってくればいいんじゃね?」と安易に考えてやってみたところ、何の問題もなく動いたのだった(笑)

本来はきちんと追求するべきなのだが、いろいろばたばたしている折でもあり、とりあえずここまでとした。

Wednesday, July 24, 2013

書評: Software Defined Storage with OpenStack Swift


"Software Defined Storage with OpenStack Swift", Joe Arnold

昨今は、なんでもかんでも Software Defined ほげほげな世の中になってしまった。
本書でいう Software Defined な Storage は、Amazon でいうところの S3 に相当する Object Storage のことである。

著者の Joe Arnold 氏は、元CloudScaling所属で、現在は SwiftStack という自分の会社をやっている人である。SwiftStackには、Swift の PTL の John Dickinson も合流し、今、オブジェクトストレージ系では一押しのベンチャーではないかと思う。

この本は、要するに OpenStack Swift を使ってオブジェクトストレージの基盤を構築・運用するにあたり、SwiftStack のコントローラを使うと、うまくSoftware Define Storage のCプレーンの制御を実現できますよ…というストーリーで構成されている。

したがって、(残念ながら)オープンソース版のSwiftを使ってシステムを作って運用するのにあたって、この本の手順の通りに Swift を運用すればよいというわけでは「ない」。 しかし、それでも著者の豊富なSwift案件対応経験に基づいた、非常に示唆に富んだ本である。

本書の構成は以下の通りである。

1. 背景とSwiftの概要
2. Swiftの動産
3. Swiftの使い方
4. Swiftのインストール
5. SwiftStack コントローラによる Software Definrd Storage
6. SwiftStack クラスタの設定
7. SwiftStack クラスタの運用
8. SwiftStackと他コンポーネントのインテグレーション
9. テストとベンチマーク
10. チューニング

タイトルの Software Defined Storage ひ関連するくだりは、5章まで出てこない。しかも SDN について一般的に言われるのと同様に、制御面を分離して、集中制御しましょうと言っているだけである。ここで注意が必要なのは、オープンソースの Swift は制御される側であって、制御面にいるのは SwiftStack 社のコントローラだということだ。

Swift はシンプルで割り切った設計で、動きも理解しやすい。しかし、お客さんのデータを預かって、しかもそれなりな規模で運用するのに必要なノウハウを持つことと、ただ動かすのとは別次元の問題である。これを解決するのが SwiftStack のコントローラ…というわけだ。

Swift について、ring ファイル作成時の留意事項のレベルで理解している読者、具体的には例えば part_power と全体キャパシティの関係を理解している読者は、6章以降から読めば、システムの設計・構築・運用にあたって、充分に有意義な知見、またはヒントを得ることができるだろう。例えば、ストレージノード(account/container/object)のHDD故障の時とノード故障の時の挙動の違いや、留意事項、対処について解説した文献がこれまであっただろうか?その他、運用時に見るべき指標など、なぜこの本に書かれていることがベストプラクティスなのか、考えながら読むと、とても高いレベルまで達することができるように思う。
自分としても、この本を読んではじめて気が付いたことはたくさんあるので、具体的にまとめて公開したいところなのだが、それをやってしまうと「おっと誰か来...」てしまうので、このくらいにしておく。

Swift について学ぶところからはじめる読者は、英文は平易な上に分量もそんなに多くないので、普通に先頭から通読するのを薦めたい。

だいぶ不完全燃焼感があるのだが、このくらいで。

Saturday, May 11, 2013

Virtual Ethernet Tunnel (veth) の組を知りたい

Linux には、OpenVZ由来の Virtual Ethernet Tunnel (veth) というものがある。

名前が示す通り、仮想的な Ethernet Interface の組を作成して、つないでくれる。

これは、VMやContainerを動かす時に便利な機能なのだが、たくさん veth I/F を作っていると、へたをすると、どれが veth なのか?とか、どれとどれが対応するのかわからなくなる。

ip コマンドなどで調べられればいいのだが、ざっと調べた限り発見できなかった。

しかたないので、ソースの

  ./driver/net/veth.c

を軽く調べてみると、以下をの通り、ethtool で veth 特有の統計情報を出力しているらしい。


 39 /*
 40  * ethtool interface
 41  */
 42
 43 static struct {
 44     const char string[ETH_GSTRING_LEN];
 45 } ethtool_stats_keys[] = {
 46     { "peer_ifindex" },
 47 };

peer_ifindex という統計値を出力しているドライバは、少なくとも現状は他に存在しないようだ。

なお、調査を行ったのは CentOS 6.4 で、バージョンはこんな感じ。

# modinfo veth
filename:       /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/veth.ko
alias:          rtnl-link-veth
license:        GPL v2
description:    Virtual Ethernet Tunnel
srcversion:     84BEC28E0EAB8E31E4CACC2
depends:
vermagic:       2.6.32-358.el6.x86_64 SMP mod_unload modversions


それで、実際にやってみた結果が以下。

まず、調査対象のサーバでは以下のようなインタフェースが作成されている。


# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:ba:96:73 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:ba:96:7d brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:ba:96:87 brd ff:ff:ff:ff:ff:ff
5: br-eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
    link/ether 00:0c:29:ba:96:7d brd ff:ff:ff:ff:ff:ff
6: br-int: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether b2:48:56:9c:8f:43 brd ff:ff:ff:ff:ff:ff
10: qbr88886a31-17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
31: phy-br-eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether e6:f1:56:69:fb:f2 brd ff:ff:ff:ff:ff:ff
32: int-br-eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 76:a5:94:6e:ff:f6 brd ff:ff:ff:ff:ff:ff
42: qbr30aed268-b6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 8e:4c:83:bf:36:df brd ff:ff:ff:ff:ff:ff
43: qvo30aed268-b6: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether d2:c1:85:94:31:83 brd ff:ff:ff:ff:ff:ff
44: qvb30aed268-b6: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 8e:4c:83:bf:36:df brd ff:ff:ff:ff:ff:ff
45: tap30aed268-b6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
    link/ether fe:16:3e:b1:6c:03 brd ff:ff:ff:ff:ff:ff

実際は qvo30aed268-b6 と qvb30aed268-b6 が veth で組になっているのだが、この出力ではわからない。

ソース調査の結果からは、ethtool -S でかたっぱしから統計情報を出力してやると、veth だけpeer_ifindex が出力され、相手がわかるはずである。

# ethtool -S  qvo30aed268-b6
NIC statistics:
     peer_ifindex: 44

# ethtool -S qvb30aed268-b6
NIC statistics:
     peer_ifindex: 43

…ということで、少なくとも、上記の2つがペアになっていることはわかった。

他のデバイスについては何も表示されないものと期待できるのだが、代表的なところをやってみると、以下の通り。

Linux Tun/Tap

# ethtool -S  tap30aed268-b6
no stats available


OpenvSwitch で作成した bridge
# ethtool -S  br-int
no stats available

生の ethernet カード
# ethtool -S  eth0
no stats available

brctl で作成した bridge
# ethtool -S  qbr88886a31-17
no stats available


ということで、最低限の目的は遂げることができるようだ。


Monday, May 6, 2013

MySQLの権限設定について


DBMSについてはずぶの素人の告白…というか、メモということで。
(たぶん誤解が入っているはずなので、ご指摘いただけると幸いです...)

さて、自分が使っているソフトが制御データを永続化するためにRDBMSを使っていることも多いと思う。
ご多分にもれず、自分がいじっているOpenStackの各種サービスくんたちもRDBMS(通常はMySQL)に依存しまくりである。

で、まず最近ようやく気が付いたのだが、GRANT を使ってユーザに対してアクセス権を与える時の以下のような注意がある(らしい。なにか誤解があるような気がするのだが...)

まず、

  mysql> create database mydb;

データベースを作るのはいいとして、ユーザ作成/アクセス権限を付与する時に

  mysql> grant all privileges on mydb.* to 'user1'@'%' identified by 'PASSWORD';

としただけでは、実は localhost は含まれないので、localhost(127.0.0.1)でアクセスする可能性もあるなら

  mysql> grant all privileges on mydb.* to 'user1'@'locahost' identified by 'PASSWORD';

も必要というのが1つ。

さらに、ここから誤解が入っている気がしてならないのだが、
上記ではアクセス権は細粒度でやったほうがいいかな?ということで、
データベース名 mydb を指定し、データベース単位での権限を設定しているつもり。

この場合、

  mysql> use mysql
  mysql> select * from mysl.user where user='user1'\G;

とかしてみると、権限が軒並み N になっているのが気になるのだが、
自ホストから(localhost ではなくて) IP やホスト名でアクセスできない。

…ので、上述の grant 文2行に加えて、

  mysql> grant all privileges on mydb.* to 'user1'@'DB_HOST_NAME' identified by 'PASSWORD';

が必要になる。
DB_HOST_NAME は MySQL がまさに動作しているホストのホスト名である。

一方、grant 文の 'on DB_NAME.TABLE_NAME' を指定する際に '*.*' とすると
データベース単位から(MySQLインスタンス内)グローバルになるわけだが、
権限が軒並み Y に変わり、アクセスできるようになる。


さて、何が足りない(or 誤解な)のだろう?

追記
バージョンは、古いのだけど CentOS6.4/EPEL6付属の MySQL 5.1系の話。

Sunday, March 31, 2013

えぼりゅーしょん3


この話の続き。

まだ python のプログラムはいじっていなくて、データ処理の話。

家系図は書いてみたので、次は genes のクラスタ分析をしたらどうなるか?…ということで、Rを使ってひとしきりやってみた結果。

1000updateかけた後、生存animal数 152、死亡animal数 466、残plant数 53、生存animalの平均年齢(update) 197.4、生存animalの平均保持 energy 88.5…という状態がお題。

生存animalを対象にすると、genes は8要素のベクターなので、これが152個あることになる。練習としては、まあたいしたことはないデータ量だ。

まず、階層型クラスタリングの R の hclust を使って書いてみたのがこれ。


ふーん、と思いつつ、このへんを参考にk-meansでクラスタ数2~15で変化させながら、あたりをみてみたのがこれ。

クラスタ数5くらいでいいのかしら?と思いながら分類させてみたのがこれ。


実は、Rをそれっぽく使ってみたのは初めてだったのだが、データ入出力はいまいち使い勝手が悪い(or 整理されていない)な…というのが感想だったりする。

まあ、そもそも論として、この環境で種の分化ってどう定義するの?なんて話もあるわけだし、先は長い...

Saturday, March 30, 2013

python 版 mysqlbench

python の練習の続き。

やっている仕事の関係上、python から RDBMS、特に MySQL を触る必要があることが多い(多かった...?)のだが、練習がてら、まずは素直に python-mysqldb を使い、pgbench のMySQL移植の mysqlbench を、さらに python に移植してみた。
なお、mysqlbench のオリジナルは PostgreSQLの石井さんが作った TPC-Bライクなスタンドアロン型のベンチマークツール pgbench であることは言うまでもない。

現状版がこれ↓


で、移植元は、お名前がわからないのが残念なのだが日本の MySQL ユーザ会の有志の方が作成されたこれ↓である。



まず、移植元の mysqlbench の実行結果がこんな感じなのに対して、
(微妙にエラーが出ているのは愛嬌)

$  ~/mysqlbench-0.1/mysqlbench  -U username -P password -h 192.168.1.1 -c 10 -t 1000 pgbench
starting vacuum...OPTIMIZE TABLE tellers: Commands out of sync; you can't run this command now
DELETE FROM history: Commands out of sync; you can't run this command now
OPTIMIZE TABLE history: Commands out of sync; you can't run this command now
end.
all connection OK
go
 end.

transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 1
number of clients                     . . : 10
number of transactions per client         : 1000
number of transactions actually processed : 10000/10000
tps (include connections establishing)  . : 264.557585
tps (exclude connections establishing)  . : 264.608737


今回の python 移植版はこんな感じになる。

$ python python-mysqlbench.py -U username -P password -h 192.168.1.1 -c 10 -t 1000 -D pgbench
all threads completed
transaction type                    . . . : TPC-B (sort of)
scaling factor                      . . . : 1
number of clients                     . . : 10
number of transactions per client         : 1000
number of transactions actually processed : 10000/10000
tps (include connections establishing)  . : 270.410621
tps (exclude connections establishing)  . : 270.462350


だいたい誤差くらいの範囲で同じ値が出るようになったようだ。

まだエラー処理が足りない(特に SQL 発行部分をちゃんと try ~ exception にしていない部分があるの)と、コマンドラインシンタックスが微妙に違う(dbname の指定方法とか...)とか、いろいろあるのだが、それはまあぼちぼちということで。(そういうわけで、まだβ版です...)

なお、また「pep8 でエラーがでるじゃねえか」とワカモノから怒られるような気がするのだが、以下の通り移植元のURLを記載した行と、大元の石井さんのPostgreSQL用のC実装のファイルヘッダに含まれる $Id$ 行がひっかかる。

$ pep8  python-mysqlbench.py
python-mysqlbench.py:9:80: E501 line too long (112 characters)
python-mysqlbench.py:24:80: E501 line too long (86 characters)

まあ、これはしかたないよねぇ...ということで。

Thursday, March 28, 2013

えぼりゅーしょん2

またこの話の続き。

今度は、これ↓

https://github.com/thatsdone/junkbox/blob/master/python/evolution.py

をもう少しいじって、animal に id をつけ、parent のidと誕生/死亡のタイミングをトラッキングできるようにしてみた。

で、やりたいのは、クラスタリングとか、そういう処理をできるようにした上で、いずれは genes まわりの仕組みを入れ替え可能にしてGAっぽくして評価してみたい…という話になるのだが、まずは id と parent を記録できるようにしたので、exact な家系図をかいてみましょうという話。

graphviz をつかって素直にプロットしただけなので、いまいちみにくいのだが、1000 update かけた時点で、生きている animal を黄色、すでに死んでしまった animal を青でいろづけして書いてみた結果がこれ。

現状は、genes が効いてくるのは turn のところで、ほぼランダムな効果でしかないようになっているので、もうすこし均一になるかも…と、思ったのだが、それでも淘汰が働いているせいか、クラスタっぽく分かれてきているようだ。噂の種の分化(?)を見るためには genes の距離関数はどうしようか…とか、TODOはあれこれ広がるのだが、まだしばらく遊べそうだということで...w