2009/12/29

mac gear boot

Mac の調子が悪くなってしまいまして
起動すると最初に歯車みたいなのがクルクル回るんですが
その途中で止まっちゃう事態が発生

ちょっと持ち運んだときになってしまったのでもしかして
ハードディスクとかハードウェアの接触に不良が? と思って
ハードディスクは経年劣化もあったしシステムリフレッシュしたかったので
交換しようとしたら大変だったんですが交換できて解決しませんでした
残念

で、最初にやるべきだったメモリの抜き挿しをしたら少し良くなって
メモリ壊れたのか? メモリも増やしちゃうか!! なんて思ってました
でもなー、歯車クルクルの裏で何起きてるんだったかなー

ってここまですっかり忘れてたんですが
あの歯車クルクルではなくコンソールの表示も見ることもできるんですよね
あのクルクル出してるのは openfirmware っていう
パソコンでいうところの BIOS みたいなやつ? の機能でして
OS X からなら nvram ってコマンドで色々とパラメータ設定できます

例えば
$ sudo nvram boot-args="-v"
ってすると
起動時に verbose = 歯車でなくて黒いコンソールで白い字 が出てきます
Mac でこの画面見るとちょっとギョっとしますが

boot-apgs をいじらなくても
起動時に Command + v すれば、その起動のときだけ verbose にできます

つわけで仕掛けたので、今度起動に失敗したら原因が分かる、かも??

sphinx doctree

2010/08/09 追記:
@shibukawa
http://blog.shibu.jp/article/40049067.html
何か作ってくれてると
ステキ!!

Sphinx ついでに
Sphinx って reStructuredText って Wiki みたいな形式で文章書いて
make すると素敵にしてくれるって仕組みらしいんですが
これで HTML 作ってみると変にスペースが空くんですよ
っていうかそもそも HTML って変なスペース空くよね
Django の概要 — Django v1.0 documentation
ほら、「チュートリアルやリファレンス用ではあり ません」って
「り」と「ま」の間に空白入っちゃってるでしょ、これ改行なの

文章書いてたら改行するでしょ? え? しないの?

HTML は英語のこと考えて作ってあるからか、
や、どちらかというとブラウザの問題なんでしょうけど
改行があると表示するときに空白として扱うんですよね
日本語だったらブラウザが無視してくれればいいだけの話なんだけど
何とかしてよ、ブラウザ

と思ったら、IE7 は空白が無い!
Firefox, Opera, Chrome は空白になるのに
お前ら IE7 見習え!! (日本語のときの改行だけね)

で、今んとこ Firefox or Chrome を使っているので
空白嫌なら改行を無くすしかないなーと思いまして
ちょっと調べてみると docutils/parsers/rst/states.py の
RSTState class の paragraph って method で
        data = '\n'.join(lines).rstrip()
って改行入れてる
どっかで parse した段落の各行を lines に入れてて
この lines は indent は削除されているみたい
で、消された改行を復元してるのがココ

やっちゃいけないとは思いつつ直接いじっちゃいました、
        data = ''.join(lines).rstrip()
そしたら、
消えたよ! 改行が消えたよ!!
ひどいね! 英文引用とかだったらどうするんだろうね!!

でね、例えば、
Sphinx で language が ja で html を build するなら
この改行を消しちまいたいわけですよ

Sphinx で language って持ってますけど
多分 po file の処理にしか使ってなくて docutils には伝えておらず
print debug で確認もしてみたけどどうやら
Sphinx から呼ばれる docutils の language は en ぽくて
en にしてあるってよりは default が en ってだけなのかなぁ

一方で docutils も language って設定項目あるんだけど
これもやっぱり po file みたいなことをしてるだけみたい
まぁ self.document.settings.language_code は引けるので
それを元に join するところを場合分けするだけなんだけど

あと、html って RSTState に伝えるのはどうするのかなぁ〜
別に html を特別扱いしなくてもいいのかな?
改行要らないよね? そこまで

language_code で分岐くらいならまぁできそうなんだけど
Sphinx から docutils の language を指定するのが面倒になって
とりあえず放置することにしました
最悪改行無しの 1 行が凄い長い rst file を書けばいいんだしね!!

Shpinx の話でなくて docutils の話だな、これ

ちなみに pTeX は改行どうしてるかっていうと
行の最後と次の行の最初の文字の種類で
空白を入れるかどうか判断してるはずなんだけど
今試したら日本語で終わって日本語が始まったら改行無視で
その他の場合は空白を入れるっぽい
正しい
句読点とか禁則処理とかまでは面倒だから調べない

sphinx math

ドキュメント作るなら Sphinx が素敵って方々から聴いていまして
まぁ、興味があったんでちょっといじってみました
参考は渋川さんの
渋日記: Pythonって何?という人のためのSphinxインストール入門
渋日記: Pythonって何?という人のためのSphinxチュートリアル
渋日記: Pythonって何?という人のためのSphinxチュートリアル[2]
もぉ手取り足取りです

設定なんてエンター連打でとりあえずちょこちょこ書いてみてたんですが
ちょっと数式打ってみたくなって思いだしました
> pngmath: include math, rendered as PNG images (y/N) [n]: n
> jsmath: include math, rendered in the browser by JSMath (y/N) [n]: n
sphinx-quickstart でどっちも n と答えてしまった!!

でまぁ拡張なんで追加できるはずじゃん、追加すればいいじゃん
って思ったんですがドキュメントとか読むの面倒だしーと思いまして
新しく Sphinx のプロジェクト立てようとして
> pngmath: include math, rendered as PNG images (y/N) [n]: y
> jsmath: include math, rendered in the browser by JSMath (y/N) [n]: y
Note: pngmath and jsmath cannot be enabled at the same time.
pngmath has been deselected.
しっかり怒られました
conf.py を diff してみると
$ diff -u /tmp/conf.py ~/myproject/conf.py
(前略)
@@ -22,7 +22,7 @@

# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.pngmath', 'sphinx.ext.jsmath']
+extensions = []

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
(後略)
名前登録するだけだった、っつーかコメントに書いてあるじゃん

png より jsmath とか格好良いかなーと思ったんですが
ググって出てきた渋川さんの翻訳
Sphinxにおける数式のサポート — Sphinx v1.0 (hg) documentation
の jsMath のとこ見たら
jsMath(と必要なフォント)はかなり巨大です
確かにフォントを用意するのは嫌だな
HTML で提供すれば十分だから今回は逃げちゃおう
ということでささっと sphinx.ext.pngmath に転向

あ、ちなみに、LaTeX 環境は当然のように整ってるんだZE!!
debian lenny なら多分 texlive-latex-base が入ってれば OK なはず

で、こんな文章書いてみました
==========
超幾何級数
==========

超幾何級数 :math:`_2F_1` とはパラメータ :math:`a, b, c, z \in\mathbb{C}` に対し

.. math::
_2F_1(a,b,c;z) &= \sum_{n=0}^\infty \frac{(a)_n (b)_n}{(c)_n n!} z^n,\\
(\alpha)_n &= \alpha \dot (\alpha+1) \cdots (\alpha + n - 1)

で定義される。但し :math:`c\not\in\mathbb{Z}_{<0}` とする。この級数は :math:`|z|<1` で絶対収束し正則関数を定義する。
そして make すると
(前略)
pickling environment... done
checking consistency... done
preparing documents... done
WARNING: dvipng command 'dvipng' cannot be run (needed for math display), check the pngmath_dvipng setting
(後略)
おぉ、dvipng ってのが要りますか、入れますとも入れますとも
debian lenny だと dvipng ってのがあったんで aptitude install dvipng
再度 make したら

こんなになりました

ってこんなスムースにはいかず LaTeX の部分で少しエラーと格闘したんですが
math:: の場合は要するに amsmath の gather 環境につっこんでいるみたい
\mathbb も使えたので amssymb も usepackage されてる
で、conf.py に pngmath_latex_preamble で preamble が書けるみたいだし
math:: に :nowrap: って付ければ段落を gather 環境に入れないみたいだし
色々好き勝手できそう

でも、数式打つのには YaTeX か AUC-TeX 使いたいな
次は jsMath?

2009/12/22

cabal-install ghc-6.12.1

GHC 6.12.1 が出たということで
IO と Unicode が仲良くなったとか噂を聴いて
インストールしてみようかなと思いました

でも、コンパイルする元気はないのでとりあえずバイナリーとってきます
http://haskell.org/ghc/dist/6.12.1/ghc-6.12.1-i386-unknown-linux-n.tar.bz2
を落としてインストールしてみました

で、cabal とか使いたいなと思ったんですが
Cabal は入ってるらしいんだけど cabal は入ってない!!
色々調べると cabal-install の 0.8 を入れるべきだそうで

あ、えっと、cabal ってのは python でいうと easy_install みたいな
Ruby でいうと gem みたいなやつです

cabal-install を入れるには network, HTTP, zlib を別途入れないとで
network が parsec を、HTTP が parsec と mtl を
更に parsec が mtl を要求しているので
mtl -> parsec -> network -> HTTP -> zlib
の順でインストールしました

で、「よーし HsOpenSSL 入れちゃうぞー」と思ったら
$ cabal install HsOpenSSL
Resolving dependencies...
cabal: cannot configure HsOpenSSL-0.6.5. It requires integer -any
There is no available version of integer that satisfies -any
あらら

2009/12/18

"/dev/shm/sysconfig" opensuse-11.2

OpenSUSE を 11.1 から 11.2 にしたら Xen が!!
vm が立たなくなってしまって
# xm create /etc/xen/vm/config.py
Using config file "/etc/xen/vm/config.py".
Error: Device 0 (vif) could not be connected. Hotplug scripts not working.
virtual な interface に繋げないとか言ってる

えー、って思って ifconfig -a とかしてみると
確かに昔あった peth0 とかが無くなっていました
Xen で interface を bridge させているので
物理 if である peth0 とそれを用いた bridge の eth0 と
両方が表示されないといけないのに、どうも上手く動いてないっぽい

Xen の bridge を立てるには
/etc/xen/scripts/network-bridge
を呼ぶようなスクリプトを Xen の設定ファイルに登録してあったので
network-bridge で直接 bridge 作ろうとしたら
どうも /dev/shm/sysconfig/xenbridges が mkdir できないらしい
/dev/shm/sysconfig が無いのね

ん〜、何で? って思ってググってみたところ
[opensuse] xend fails to create bridge on start (opensuse 11.2)
とりあえず同じ悩みを抱えてる人発見、しかも詳しく調べてくれてる
11.2 からは /dev/.sysconfig ってフォルダを使うみたい
でも、xen-tools のファイルがそれに追従してないのかな??

でまぁ、確かにそれが一番簡単そうだったので
network-bridge の mkdir の次に -p と書いてやることで
とりあえず解決はしました
ほんとは全部 /dev/.sysconfig 使うように書き換えるべきなのか??
update するときに憶えとかないと嵌りそうで怖いです...

2009/12/17

eth0 eth2 変更

OpenSUSE 使ってたんですが
ネットワークカードを挿し替えてみたら eth2 とか出てきました
これを eth0 にしたい!! んで調べました

ethデバイスの順序変更 | gmt-24.net
なるほど!
/etc/udev/rules.d/ の中に確かに色々とファイルが入っていて
MAC address 込みで設定がされてました。
一度挿すと MAC address 憶えといてコロコロ変わらないようにしてくれる
何てできた子なんでしょう、えーと、これの場合 udeb が?

automatically generated とかファイルには書いてあったんですが
手で書きかえてやって再起動で無事 interface の名前が変わりました

vmnic0 vmnic1

ESXi にコンソールからログインして
ネットワーク周りの設定を確認したいと思ったんですが
ifconfig すら入っていませんでした
ethtool はあるのに!

インターフェース名が分からないと何もできないな
eth0 じゃないのか、何なんだ、と思ってググったり
vSphere Client? 悔しいじゃないですか

で、vmnic0 vmnic1 ってのを探りあてたわけですが
何が割り振られてるのか良く分からなかったりして

esxcfg-nics とか esxcfg-vswitch とかコマンドがあって
それぞれ -l で list してくれるんですが
どんなインターフェースがあるかとかどんな名前がついてるとか
vSphere Client で見れるような情報が得られました!!
......

や、CUI っていいですよね

2009/12/15

ie 新しいタブで開く

「ここクリックしたら新しいタブで開けるといいな」
って、え、ん〜、target とかで何とかなるのかもしれないけど
でも new window 開くのであってタブ? HTML にタブって概念あり??

Ctrl+左クリック を紹介したらいけたらしいのでいいかと思ったけど
ググってみました

IE7で新規ウィンドウが常にタブで開くようにする
おー、設定項目あるじゃない!
IE も 7 にもなるとすっかりタブブラウザになってたんですね
もぉタブの無い生活なんて考えられませんもんねぇ〜

2009/12/14

s3cmd

S3 にでかーいファイルを上げようとしまして
s3fox 使ってたらどうも途中で止まってしまうし
OS X で試そうとしたんですがやっぱ何か上手くいかず
どーしよーかなーと思って彷徨っていたら
s3cmd って Python で書かれたのがあったんで試しました

Amazon S3用のコマンドラインツールs3cmd
最初に s3cmd --configure って打つと key を 2 つ聞いてきて
入力すると dot file が HOME の下にできます。
あとは get でも put でも mv でも何でもすればいいじゃない
ということで put してみたら無事に upload できました

格好つけて慣れない GUI なんか使うなって言われた気がしてきました
悲しい

2009/12/08

vmware-tools ide xp

ESXi 4 の上に XP を入れました
細かいことは良く分からずともいじれてしまうので
VM 作るのに一応カスタムで設定すると見せ掛けて
デフォルトばかりで進むということをしていました

で、インストールが終わって WMWare Tools をインストールすると
何かがエラーが起きていちタスクトレイの VMWare のロゴが
進入禁止みたいなマークで上書かれてしまっています

VMWare Tools を開いてみるとどうも HDD の部分でエラーが
あれー、Vista は SCSI だったかもしれないし
2003 とか 2008 は SCSI だったからかなぁ
と思ってググってみたんですがあんまし良さげな情報も出てきません

で、まぁ XP なら直ぐだしと思って再インストールしてやっぱりダメ
エェェェ、って思ってたんですがボーっとしてたら思い浮かびました
「そういえばこれ素の XP だから SP1 すらあたってなくね?」
エラーが出つつもライセンス認証して SP2 をあててみると
無事侵入禁止マークが取れました

解決はしたんですが、ものすごい無念

2009/12/07

vmware-bios

VMWare の VM に何か入れようとしてまして
上書きでインストールしようと思ったんですが
気付くと Windows が起動してしまっています
BIOS の画面とかにもいけない感じ

ドキュメント読む前にググっちゃうと
VMware/BIOSのセットアップ画面を出す - 俺の基地
そうか、なるほど、設定で最初の画面の出る時間が指定できるのか!

で、確かに VM の設定項目開いたら
[オプション] -> [詳細] -> [起動オプション] -> [パワーオン時起動遅延]
ってありまして
0 ミリ秒でした、そりゃ無理だ。

10000 ミリ秒にしたら、ちゃんと待ってくれたので
ESC 押して CD が選べました

2009/12/05

authrootseq.txt authrootstl.cab

インターネットってのは原理的には盗聴し放題だったり
いつどこから誰がアクセスしてくるかも分からなかったりするので
盗聴とかユーザー認証とかするのに暗号技術ってのは基本リテラシーです
新版暗号技術入門とか分かりやすい

で、Windows の場合 CryptoAPI っていう API を持っていて
(Linux だと OpenSSL がスタンダードですかね)
暗号・PKI 関係を処理してくれています
capi とか capi2 とかいうみたいです
http://msdn.microsoft.com/en-us/library/aa380255(VS.85).aspx
こっから辿れば色々分かるのかな

テクノロジーは日々進歩して
結果 XP と Vista では CryptoAPI も大きく変わっているそうで
(2008 -> 2008 R2 でも随分と変わっているらしいけど)
例えば XP も Vista もルート証明書の自動インストール機能があるのに
Internet Explorer のセキュリティ Internet Explorer 7 の EV SSL 証明書の実装
にもある通りそのタイミングが違ったりしています

というかそもそも Vista/2008 は「信頼されたルート証明機関」が
インストール直後には 10 こも無かったりするんですが
必要に応じて勝手にインストールされてしまうわけです
例えば以下がお詳しいのではないかと
自堕落な技術者の日記 : Windows 7 RCを入れてみた(その2)
自堕落な技術者の日記 : Windowsルート認証機関の更新(2009.02)

でまぁ、確かに
Microsoft ルート証明書プログラムのメンバ (2009 年 2 月)
見たらどこが信頼されてるのかは分かるかもしれないですが
違う! そうじゃない! 欲しいのは証明書なんだっ!!
つうわけでどうしてるんだかちょっと調べてみました

で、ググっちゃみたんですが良く分からない
でも確かに IE on Vista で https://mixi.jp/ なんかにアクセスしてみると
ルート証明書が沢山インストールされてるのが確認できますし
mmc 経由で削除してもまたアクセスするとまたインストールされてます


良く分からなかったらパケットキャプチャだということで
Wireshark を使ってキャプチャーしてみました
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab
http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/02FAF3E291435468607857694DF5E45B68851868.crt
どうもこの辺りをダウンロードしてるみたいで関係あるみたい

でまぁ、この辺のファイル名とかでググればそれなりに情報が出てきます
authrootseq.txt は中を見るとテキストで何かシリアルみたいなものが
いま手元にあるのだと 1401CA5837700A984D って書いてありました

authrootstl.cab は中に authroot.stl ってのが入っていて
Vista で double click すると

1401CA5837700A984Dはシーケンス番号らしいし
どうやらこいつがリストっぽい

で、最後のは証明書で der で AddTrust の自己署名でした
$ sha1sum -b 02FAF3E291435468607857694DF5E45B68851868.crt 
02faf3e291435468607857694df5e45b68851868 *02FAF3E291435468607857694DF5E45B68851868.crt
なので、URI というか file name は DER を SHA1 したものみたい

で、authroot.stl ですわ
何か見辛いなと思ったし
「PKI 関係ならどうせ ASN.1 なんでしょ?」
と試しに asn1parse してみると
$ openssl asn1parse -inform der -in authroot.stl
0:d=0 hl=5 l=77575 cons: SEQUENCE
5:d=1 hl=2 l= 9 prim: OBJECT :pkcs7-signedData
16:d=1 hl=5 l=77559 cons: cont [ 0 ]
21:d=2 hl=5 l=77554 cons: SEQUENCE
26:d=3 hl=2 l= 1 prim: INTEGER :01
29:d=3 hl=2 l= 11 cons: SET
31:d=4 hl=2 l= 9 cons: SEQUENCE
33:d=5 hl=2 l= 5 prim: OBJECT :sha1
40:d=5 hl=2 l= 0 prim: NULL
42:d=3 hl=5 l=70016 cons: SEQUENCE
47:d=4 hl=2 l= 9 prim: OBJECT :1.3.6.1.4.1.311.10.1
58:d=4 hl=5 l=70000 cons: cont [ 0 ]
63:d=5 hl=5 l=69995 cons: SEQUENCE
68:d=6 hl=2 l= 12 cons: SEQUENCE
70:d=7 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.3.9
82:d=6 hl=2 l= 9 prim: INTEGER :1401CA5837700A984D
93:d=6 hl=2 l= 13 prim: UTCTIME :091029013045Z
108:d=6 hl=2 l= 9 cons: SEQUENCE
110:d=7 hl=2 l= 5 prim: OBJECT :sha1
117:d=7 hl=2 l= 0 prim: NULL
119:d=6 hl=5 l=69939 cons: SEQUENCE
124:d=7 hl=3 l= 165 cons: SEQUENCE
127:d=8 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:A43489159A520F0D93D032CCAF37E7FE20A8B419
(以下略)
でたでた、PKCS#7 だったらしい、なるほど

AddTrust のは
(前略)
42165:d=7 hl=4 l= 261 cons: SEQUENCE
42169:d=8 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:02FAF3E291435468607857694DF5E45B68851868
42191:d=8 hl=3 l= 236 cons: SET
42194:d=9 hl=2 l= 32 cons: SEQUENCE
42196:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.29
42208:d=10 hl=2 l= 18 cons: SET
42210:d=11 hl=2 l= 16 prim: OCTET STRING [HEX DUMP]:06F9583C00A763C23FB9E065A3366D55
42228:d=9 hl=2 l= 36 cons: SEQUENCE
42230:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.11
42242:d=10 hl=2 l= 22 cons: SET
42244:d=11 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:5500530045005200540072007500730074000000
42266:d=9 hl=2 l= 36 cons: SEQUENCE
42268:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.20
42280:d=10 hl=2 l= 22 cons: SET
42282:d=11 hl=2 l= 20 prim: OCTET STRING [HEX DUMP]:ADBD987A34B426F7FAC42654EF03BDE024CB541A
42304:d=9 hl=2 l= 54 cons: SEQUENCE
42306:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.83
42318:d=10 hl=2 l= 40 cons: SET
42320:d=11 hl=2 l= 38 prim: OCTET STRING [HEX DUMP]:30243022060C2B06010401B231010201050130123010060A2B0601040182373C0101030200C0
42360:d=9 hl=2 l= 68 cons: SEQUENCE
42362:d=10 hl=2 l= 10 prim: OBJECT :1.3.6.1.4.1.311.10.11.9
42374:d=10 hl=2 l= 54 cons: SET
42376:d=11 hl=2 l= 52 prim: OCTET STRING [HEX DUMP]:303206082B0601050507030106082B0601050507030206082B0601050507030406082B0601050507030306082B06010505070308
(後略
ここら辺っぽい

1.3.6.1.4.1.311.10.11.29 っていう OID がありますが
これもググると wincrypt.h っていうファイルに
#define szOID_CERT_SUBJECT_NAME_MD5_HASH_PROP_ID            "1.3.6.1.4.1.311.10.11.29"
ってあるんで
Subject を md5 したもんでこれで捜すのかと推察
他の OID もそれぞれ興味深いんだけど、今は置いといて

つまり authroot.stl を見れば信頼されたルートの証明書の
DER での SHA1 値が分かってしまって
"SHA1 値.crt" で
http://www.download.windowsupdate.com/
を叩きまくってやったらいいんではないかと思うわけです

$ for i in `openssl asn1parse -inform der < authroot.stl | perl -ne '$a[0]=$a[1];$a[1]=$a[2];$a[2]=$a[3];$a[3]=$_;if (/1.3.6.1.4.1.311.10.11.29/) {$a[0]=~/.+:([0-9A-F]+)/; print $1 . "\n"}'`; do echo http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/$i.crt; done
なんかまぁ、これでいいのかどうかは置いといて
とりあえず何かスラズラーっと出てきました
ん〜、これで全部なんだろうか?
確認しようと思えばできるけどなぁ...

2009/12/03

Haskell import AF_INET

不要なものを import するなんて!
ってのが何原理主義なんだか分からないですが
fromMaybe だけ使いたい! って思ったら
import Data.Maybe (fromMaybe)
ってしろって色々書いてあります
素敵

AF_INET が欲しいと思ったんで
import Network.Socket (AF_INET)
ってしてみました
$ ghci af_inet.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( af_inet.hs, interpreted )

af_inet.hs:1:23: Module `Network.Socket' does not export `AF_INET'
Failed, modules loaded: none.
あら、"does not export" って言われてしまった

Prelude Network.Socket> :i AF_INET
data Family = ... | AF_INET | ...
-- Defined in Network.Socket.Internal
なるほど
AF_INET は Family っていう型の data constructor らしい
だから素直には呼べないのかな?
import Network.Socket (Family)
これは通るんだけど
$ ghci af_inet.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main ( af_inet.hs, interpreted )
Ok, modules loaded: Main.
*Main> AF_INET

<interactive>:1:0: Not in scope: data constructor `AF_INET'
そうよね、うんうん

残念ながらプログラミング Haskell にも記述が無く
色々ググっていたんですが、結局どうすればいいかっていうと
import Network.Socket (Family(AF_INET))
こうすればいいみたいでした
どこでこの記述見つけたんだかもぉ忘れちゃった

原理主義疲れる

haskell timeout

プログラミング Haskell って素敵本も買ってみて、
ちょいちょい「お勉強」してるんですが
Haskell で timeout したくなったらどうしよう!?
心配性なので事前に調べておかないと気になって仕方がありません
ググってみました

System.Timeout
timeout :: Int -> IO a -> IO (Maybe a)
何マイクロ秒待つか指定して
IO しようとして、失敗すると Nothing 返ってくるっぽい

試してみた
Prelude Network.HTTP System.Timeout> timeout (3*10^6) $ simpleHTTP $ getRequest "http://10.0.0.1/"
Nothing
Prelude Network.HTTP System.Timeout> timeout (3*10^6) $ simpleHTTP $ getRequest "http://google.com/"
Just (Right HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 05 Dec 2009 04:49:50 GMT
Expires: Mon, 04 Jan 2010 04:49:50 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
Connection: close

)
Prelude Network.HTTP System.Timeout>
何だこの最後の )Just ( の pair の ) じゃ
でもまぁ、待ててるみたいでした
Network.HTTP に timeout がある気がしないでもないけど、いつか調べよう

2009/11/27

esxi-4 patch

ESXi は最新の状態に保たれているんだろうと思っていたら
どうやらパッチなんかは何もあててないみたいでした
「他人を信じてはいけない」ということを教えてくれてるんでしょうか

というわけでパッチを、と思ったんですが方法が良く分かっていません
お前よくもまぁそんな状態で、っていうのは置いておきましょう

ネットワークエンジニアからみたITの世界やら: VMware ESXi4 にパッチをあてる
vSphere Client Host Update Utility ってのを使うみたいで
とりあえずそれ入ってないからインストール
(もしかしたら既に入っていたのかもしれないけど)
起動したら vSphere Client で使ったことのある ESXi サーバが
最初から表示されてたので選択してパッチがあるかどうか調べたり
適用したりしたら終わってしまいました

ハイパーバイザー? の update を遠隔で GUI でするっていうのが
未来やってきてるなっていう感じで受けとってしまうのは
もぉいいおっさんになった証拠なのかもしれません

2009/11/26

inax トイレタンク 水漏れ

トイレの前に行ったら水が流れつづけてて
タンクを覗いてみたら水が貯まらずにどんどん流れていくの
当たり前か、流れてるんだから

テニスボールくらいの大きさの黒いゴムの玉があって
それが穴を塞いで水が貯まるようになっていて
上から押さえつけると貯まるんですが離すとまた流れてしまいます

う〜ん、と思って色々見たんだけど分からなかったんでググりました
【公式】INAX トイレトラブル診断・部品販売
ん〜、こっちじゃなくて「水が止まらない」なんだけどな
洗浄ハンドルとフロートゴム玉を確認する
ハンドルはちゃんと戻るしなぁ
良く見たから異物も入ってないしなぁ
部品の劣化かなぁ、困ったなぁ

異物があったので取り除いたら水が貯まるようになりました

2009/11/25

svg pdf 変換

たまーにですが、Graphviz にグラフを描かせます
全く複雑なものは描かせないんですがいかんせん大きく
node の中に文字情報入れときたいので大きくなるんですが
更に拡大・縮小して楽しく閲覧したいグラフなのです
png など bitmap で描画させると読ませたアプリが死んでしまうので
pdf で吐かせて evince で見るという生活をしていました

で、どうもこの pdf の engine がタコなのか
engine に何使ってるかすら調べてないのに言うのも何ですが
evince 以外のアプリだと見れない!!
っていうか evince は poppler とやらの front-end なのか
まぁ、Adobe の Reader で読めないわけです
OS X の preview でも zoom とかできないらしいんです
困りました

で、svg でも吐けるのは知っていたので吐かせてみて
何で見るかなと思って Firefox でいけたよなと思い open
見れる、見れました、見れるんですが、拡大・縮小が遅い
あるんじゃないかと思って svg から pdf への変換ツールを探しました

SVGフォーマットを他の画像形式に変換 - ふっくんのブログっぽいサイト"
おぉ、つかここからリンクされてる
LinuxでSVGフォーマットを他の画像形式に変換 - ふっくんのブログっぽいサイト
が真に探していたもの

$ $ auto-apt search bin/rsvg-convert
usr/bin/rsvg-convert graphics/librsvg2-bin
$ sudo aptitude install librsvg2-bin
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
Reading task descriptions... Done
The following NEW packages will be installed:
librsvg2-bin
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 66.1kB of archives. After unpacking 164kB will be used.
Writing extended state information... Done
Get:1 http://ftp.jp.debian.org lenny/main librsvg2-bin 2.22.2-2lenny1 [66.1kB]
Fetched 66.1kB in 0s (92.1kB/s)
Selecting previously deselected package librsvg2-bin.
(Reading database ... 134001 files and directories currently installed.)
Unpacking librsvg2-bin (from .../librsvg2-bin_2.22.2-2lenny1_i386.deb) ...
Processing triggers for man-db ...
Setting up librsvg2-bin (2.22.2-2lenny1) ...
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
Writing extended state information... Done
Reading task descriptions... Done
$ rsvg-convert -f pdf -o graph.pdf graph.svg
で pdf ができました

Adobe Reader でも読めるお行儀の良い pdf が完成!
しかも inkscape で svg いじってから pdf とかも可能に
まぁ、なんかこの svg がそこまでいけてる感じに作られてはないんですが、でも
svg のことが好きになりました

ubuntu サービス 登録

/etc/rc?.d の下っていつも手でいじってしまうんですが
たまにはちゃんとツール使おうか、っていうか
スクリプトで for で回すのほアホかなーと思ったので
ちょっとググりました

SE奮闘記: Ubuntuでサービス一覧表示(chkconfigがないから)
そうそう、redhat 系だと chkconfig なんですよね
CentOS はよくいじってるので、名前だけは知ってました
で、Ubuntu なんで $ sudo install sysv-rc-conf

で、man を斜めに読んでみて
試しスクリプトを /etc/init.d に test-script 置いて
$ sudo sysv-rc-conf test-script on
ってしたら確かに rc{2,3,4,5}.d に symbolic が張られたんだけど S20 とかって
これは、何順なの? alphabet 順なの?

で、man 見直したら /var の下に優先順位とか憶えてるファイルがあるらしく
/var/lib/sysv-rc-conf/services を開いてみたら確かに書いてあるので
手で変更したら希望の優先順位になったんでそれ以上 man を見ませんでした
コマンドラインからもできるに違いないと思うんだけどな....

そういえば debian だと update-rc.d ってあった気がしてきたんだけど
これは使えるのかな、使えないのかな....

....が多いな

2009/11/24

boto

EC2 を外部から操作したいわけで
そうすると ec2-api-tools とか ec2-ami-tools とかあるわけですが
行けなかった bpstudy#27 の資料が
d_sea 後追いだけど、BPstudy#27 で話してきたことをブログに書いた http://d.hatena.ne.jp/d_sea/20091120/p1 スライドも張ったよ #bpstudy 12:26 PM Nov 23rd
と公開されてたので
早速見てみたら boto ってのが素敵そう

boto でググれば http://code.google.com/p/boto/ が直ぐ出ます
落として README 見たら docs か tests を見れば良いと書いてあったので
docs に行くと Make file が!
make って打ったら sphinx が無いと!!
でも
Pythonって何?という人のためのSphinxチュートリアル
を見てたので sphinx は virtualenv に入ってるので activate
無事 docs も見れました

pip で boto 入れてみて ipython 立ちあげて
In [1]: import boto

In [2]: conn = boto.connect_ec2('xxxx', 'yyyy') <- xxxx と yyyy は acces key と secret key

In [3]: instance = conn.get_all_instances()[0]

In [4]: volume = conn.get_all_volumes()[0]

In [5]: volume.attach(instances[0].id, '/dev/sdf')
みたいなことができました
もちろん instance の起動やら何やら色々できるみたいです
コマンドを長々と打つのに比べると method で色々呼べるのは楽だなぁと思いました

や、っていうか、スクリプトが組めるんで素敵だねって話なんですが
ipython の上で使うだけでもぉ大満足! でした

2009/11/21

openssl haskell context

Haskell で Socket 使って少し通信できるようになったので
SSL で通信でもしてやろうかと思いました
クライアントとして
引きつづき HsOpenSSL を使って

OpenSSL でクライアントとして接続というと
context っていうクライアント認証の情報とか SSL のバージョンとかと
あと socket を作っておいて
その二つを合わせて SSL の接続へと socket を昇格? させます

で、ググりゃそりゃリファレンスが出てくるので
OpenSSL.Session
ghci で上に従ってやってみようと思ったんですが何か上手くいかず
色々ググったりして散々悩んでみたんですが
コード書いてコンパイルしたら通ってしまいました
ghci だとダメってよりは、withOpenSSL が無くてダメだったのかな

折角なんで Firefox から ThawtePremiumServerCA って証明書を抜き
引き数に hostname を取って 443 port で SSL 通信して
サーバ証明書を取ってきて証明書の検証ができるかどうか試してみました
$ ./cert_check www.google.com
VerifyFailure
$ ./cert_check www.blogger.com
VerifySuccess
有効期限の確認も FQDN と CN の比較もしてなくて
ルート証明書の公開鍵でサーバ証明書の署名の確認してるだけですが

import System
import Data.Maybe
import Network.Socket
import Network.BSD
import OpenSSL
import OpenSSL.Session
import OpenSSL.X509
import OpenSSL.PEM
import OpenSSL.RSA
import OpenSSL.EVP.PKey

main = withOpenSSL $
do
(host:_) <- getArgs
addr <- return . head . hostAddresses =<< getHostByName host

ctx <- context
sock <- socket AF_INET Stream 0
Network.Socket.connect sock (SockAddrInet 443 addr)
ssl <- connection ctx sock
OpenSSL.Session.connect ssl
x509 <- return . fromJust =<< getPeerCertificate ssl
-- putStr =<< writeX509 x509
OpenSSL.Session.shutdown ssl Unidirectional

root <- readX509 =<< readFile "ThawtePremiumServerCA.crt"
pk <- return . fromJust . toRSAKey =<< getPublicKey root
putStrLn . show =<< verifyX509 x509 pk
where
toRSAKey :: SomePublicKey -> Maybe RSAPubKey
toRSAKey = toPublicKey

2009/11/20

haskell hostname resolve

続きまして、HTTP でも叩こうかと思いました
直に Network.Socket を叩くよ!!

ってまぁ、流石にそんなことしてる人は沢山いらっしゃいまして
いくらでもサンプルが出てくるんですがシンプルだったのは
関数型プログラミング言語Haskell Part6
2ちゃんねるの過去ログの 607 さんでした
ちなみに検索語は "import Network.Socket"

で、挙がってた sample は
import Network.Socket 
main = putStrLn =<< do
sock <- socket AF_INET Stream 0
addr <- inet_addr "66.249.89.104" >>= \x -> return $ SockAddrInet 80 x
connect sock addr
send sock "GET / HTTP/1.1\nHost: www.google.co.jp\n\n"
recv sock 10000000 >>= \x -> sClose sock >> return x
おぉぉ

IP address ってのはちょっと寂しかったので
名前を解決してやりたいなと思いもうちょっとググりました
Network.BSD
なるほど、getHostByName 使えと
上の2ちゃんのログの 604 さんが
インタフェースはCのAPIそのままだから、そっちを調べるべき。
っつってたので
C のこと分かってればいいみたいです
わたし? えぇ、分かってないですけど

> :t getHostByName
getHostByName :: HostName -> IO HostEntry
> :i HostEntry
data HostEntry
= HostEntry {hostName :: HostName,
hostAliases :: [HostName],
hostFamily :: Network.Socket.Internal.Family,
hostAddresses :: [Network.Socket.Internal.HostAddress]}
-- Defined in Network.BSD
あと、HostName は String のこと
HostEntry の中の hostAddresses に IP address が入ってるので
> getHostByName "www.google.com" >>= return . hostAddresses
[1750726978,1666840898,2472147266,1733949762]
10進でアドレス見せてくれます

つわけで、こんなん作ったら
import System
import Network.BSD
import Network.Socket

main = do (host:path:_) <- getArgs
addr <- return . head . hostAddresses =<< getHostByName host
sock <- socket AF_INET Stream 0
connect sock (SockAddrInet 80 addr)
send sock $ "GET " ++ path ++ " HTTP/1.1\nHost: " ++ host ++ "\n\n"
putStrLn =<< recv sock 100000
sClose sock
こんなん出ました
$ ./get www.ietf.org /rfc/rfc5280.txt
HTTP/1.1 200 OK
Date: Fri, 20 Nov 2009 08:10:29 GMT
Server: Apache/2.2.4 (Linux/SUSE) mod_ssl/2.2.4 OpenSSL/0.9.8e PHP/5.2.6 with Suhosin-Patch mod_python/3.3.1 Python/2.5.1 mod_perl/2.0.3 Perl/v5.8.8
Last-Modified: Wed, 07 May 2008 17:42:25 GMT
ETag: "1caf1b6-56144-7cddc240"
Accept-Ranges: bytes
Content-Length: 352580
Vary: Accept-Encoding
Content-Type: text/plain







Network Working Group D. Cooper
Request for Comments: 5280 NIST
Obsoletes: 3280, 4325, 4630 S. Santesson
Category: Standards Track Microsoft
S. Farrell
Trinity College Dublin
S. Boeyen
Entrust
R. Housley
Vigil Security
W. Polk
NIST
May 2008


Internet X.509 Public Key Infrastructure
なんでこれ途中で切れるの?
recv に渡す数字でちゃんと表示内容変化してるのに
気付いていなかったみたいです
socket が分かっていない...

"Couldn't match expected type `IO *' against inferred type"

Haskell がきれいらしいので Haskell 少し真面目にしようかなと
証明書くらい読めなきゃいけないだろうということで X.509 を読むことに

ググったら HsOpenSSL という OpenSSL の binding があり
cabal は入れてあったので
$ cabal install HsOpenSSL
でインストール終了
OpenSSL を見て
    main = withOpenSSL $
do ...
と withOpenSSL で囲むというのと
Learning After School » HsOpenSSL Update を見て
ghci には --make というオプションを与えないとダメなことを認識

とりあえず読めればいいと思ったので
PEM への PATH を最初の引数で取ってそれを解釈して吐くことにしました
HsOpenSSL 関係で使った関数は
OpenSSL.PEM.readX509 :: String -> IO X509
OpenSSL.X509.getVersion :: X509 -> IO Int
OpenSSL.X509.getVersiongetSerialNumber :: X509 -> IO Integer
OpenSSL.X509.getVersiongetNotBefore :: X509 -> IO UTCTime
OpenSSL.X509.getVersiongetNotAfter :: X509 -> IO UTCTime
OpenSSL.X509.getVersiongetIssuerName :: X509 -> Bool -> IO [(String, String)]
OpenSSL.X509.getVersiongetSubjectName :: X509 -> Bool -> IO [(String, String)]
OpenSSL.X509.getVersiongetPublicKey :: X509 -> IO SomePublicKey
OpenSSL.EVP.PKey.toPublicKey :: (PublicKey k) => SomePublicKey -> Maybe k

UTCTime ってのは Data.Time.Clock で定義されてるんだけど
Show のインスタンスなので show で文字列にできる
getIssuerName と getSubjectName の取る Bool は名前の省略するか否か
tuple は ("countryName", "JP") みたいなのが入ってる

でー、ここまでは良かったんだけど分からなかったのが公開鍵で
SomePublicKey ってのは class なんだけど
> :i SomePublicKey
data SomePublicKey where
OpenSSL.EVP.PKey.SomePublicKey :: forall k.
(PublicKey k) =>
!k -> SomePublicKey
-- Defined in OpenSSL.EVP.PKey
instance Eq SomePublicKey -- Defined in OpenSSL.EVP.PKey
instance PublicKey SomePublicKey -- Defined in OpenSSL.EVP.PKey
instance PKey SomePublicKey -- Defined in OpenSSL.EVP.PKey
> :i PublicKey
class (Eq k, Data.Typeable.Typeable k, PKey k) => PublicKey k where
fromPublicKey :: k -> SomePublicKey
toPublicKey :: SomePublicKey -> Maybe k
-- Defined in OpenSSL.EVP.PKey
instance PublicKey RSAKeyPair -- Defined in OpenSSL.EVP.PKey
instance PublicKey SomePublicKey -- Defined in OpenSSL.EVP.PKey
instance PublicKey SomeKeyPair -- Defined in OpenSSL.EVP.PKey
instance PublicKey RSAPubKey -- Defined in OpenSSL.EVP.PKey

type とか class に関する理解が不足しているのは分かりつつ
toPublicKey に SomePublicKey かましたらいいんでしょ? と思って
で、IO SomePublicKey だから bind とか使ったらいいんでしょ? と思って
pk <- getPublicKey x509 >>= toPublicKey
としてみたら
Couldn't match expected type `IO b' against inferred type `Maybe k'
と言われてしまい
これが解決できなくて検索しました

Re: [Haskell-cafe] Convert IO Int to Int: msg#00458 haskell-cafe@haskell.org
何となく分かったのは、IO の中身取り出そうとしてて、そりゃダメだ
return かましてらしたんで、かましてみたら IO で包めて通りました!
と思いきや
SomePublicKey ってののインスタンスも指定しないとダメみたいで
:: Maybe RSAPublicKey ってのを付けないと toPubicKey が上手く動かず
ん〜、理解不足、RSA 決め打ち気持ち悪い

でもまぁ、こんな感じでとりあえず中身見れるようになりました
module Main where
import System
import OpenSSL
import OpenSSL.PEM
import OpenSSL.X509
import OpenSSL.EVP.PKey
import OpenSSL.RSA
import Data.Maybe

main :: IO ()
main = withOpenSSL $
do
x509 <- OpenSSL.PEM.readX509 =<< head =<< getArgs
putStr "version: "
getVersion x509 >>= putStrLn . show . succ
putStr "serialNumber: "
getSerialNumber x509 >>= putStrLn . show
putStr "notBefore: "
getNotBefore x509 >>= putStrLn . show
putStr "notAfter: "
getNotAfter x509 >>= putStrLn . show

putStrLn ""
issuerRDNs <- getIssuerName x509 True
putStrLn "[issuer]"
mapM_ printRDN issuerRDNs
subjectRDNs <- getSubjectName x509 True
putStrLn "[subject]"
mapM_ printRDN subjectRDNs

putStrLn "[publickKey]"
somePublicKey <- getPublicKey x509
pk <- return $ fromJust (toPublicKey somePublicKey :: Maybe RSAPubKey)
putStr "e = "
putStrLn $ show $ rsaE pk
putStr "n = "
putStrLn $ show $ rsaN pk<
where
printRDN (f, s) = putStrLn (f ++ " = " ++ s)
とりあえず動いたんで満足しました

$ ./x509 www.blogger.com.crt 
version: 3
serialNumber: 154451598012349719216436864807249350442
notBefore: 2008-04-29 22:42:19 UTC
notAfter: 2010-05-26 11:11:00 UTC

[issuer]
countryName = ZA
stateOrProvinceName = Western Cape
localityName = Cape Town
organizationName = Thawte Consulting cc
organizationalUnitName = Certification Services Division
commonName = Thawte Premium Server CA
emailAddress = premium-server@thawte.com
[subject]
countryName = US
stateOrProvinceName = California
localityName = Mountain View
organizationName = Google Inc
commonName = *.blogger.com
[publickKey]
e = 65537
n = 156261988165875299258992916522864140599934684523601467326503718745802091107083682835929499666111345772555979343409161090600093388197459190695135388517589095274179717212596199311728073635629373769115406240413244621434604136126497937524426697977932393973863819806782187408995863143657362345664311920806817108659

nginx mongrel_rails

Ubuntu で Rails と思ったわけです
パッケージ使えばいいとは思うのですが
Ruby というか Rails 周りは動きが速かったりするので
追従するには手作りかなと思い Ruby から作りました
で、gem 入れて rails 入れたり他のも入れたり

rails 自体は何で動かそうかなーと思ったのですが
mongrel ってのがスタンダードだと以前聞いていたのでそれで
で、その前に流行りの nginx を置いてみることにしました

ググってみたところ mongrel_cluster ってのを使えと
Ruby on Rails: mongrel_clusterのフロントエンドに nginxを使用する
これは、サービスとして mongrel を使うならば
バックエンドが例え1プロセスだとしても使った方が良いとのことで
素直に従うことに

でも、まぁ、結局 init script はどうにかするしかないかぁ〜
自前で書くような技術も根性も無いので参考が欲しい!
Ubuntu だしパッケージの中のを見ればいいだろうと思って
apt-get には無かったけど aptitude に download ってコマンドがあったので
$ aptitude download mongrel-cluster
$ aptitude download nginx
などして deb ファイル取ってきて
ar -x とか tar xfz で中身とりだして適当にスクリプトを眺めました
そして init script も完成

良く分からなかったのが gem install mongrel_cluster で入れたら
設定ファイルが /etc/mongrel_cluster であることが前提みたいで
できるだけ Ubuntu のものと被らせたくないなと思ってたんですが
設定方法が分からなかったんで symlink で逃げることにしました
もぉ、Ubuntu の mongrel-cluster は入れれません
や、入れないけど

mongrel_cluster によって何か恩恵にあずかれたのかは良く分からず
でも、とりあえず形にする為に一旦そこは放置で

nginx が前にいますが
Rails のとあるアプリ? だけ見えるようにしたかったので
proxy_pass で飛ばすのにルールが必要かなーと思ったんですが
今度は真面目にドキュメントにあたってみたら
NginxHttpProxyModule
rewrite 使って書き換えてから proxy_pass かましてました
や、あたりまえな気が今ではしています
        location / {
root html;
rewrite ^/$ /application break;
proxy_pass http://mongrel_cluster;
}
みたいにしてみました

あと、他のアプリは別途 location 立てて auth_basic しておきました
htpasswd は apache2-utils に入ってたので入れちゃいました
別途 location 立てるのが何か無駄な気がするんだけど仕方ないのかな
auth_basic が if の中では使えないので、まぁ、仕方ないのか?

久しぶりにこの辺の設定したので凄い頭痛くなりました

2009/11/18

ec2-ami-tools ruby curl ubuntu debootstrap

EC2 の上に minimal な ubuntu 環境が欲しいと思って
まぁ debootstrap で作って tool を入れたらいいのかなと思って
検索してたら

http://ec2ubuntu.googlecode.com/svn/trunk/bin/ec2ubuntu-build-ami
イメージ作る用のスクリプトが出てきました。
っつうか
ec2ubuntu - Project Hosting on Google Code
こういうのがちゃんとあるんですね、さすが。

で、欲しかった ami も C2 and Ubuntu - Alestic.com にあるし
apt-line には universe だけあるんで multiverse をコピー&置換で追加してやれば
$ aptitude install ec2-api-tools ec2-ami-tools
とかしてツールも入れれるみたいだし
あとは、真面目に作り込むだけみたいです...。
真面目に...。

2009/11/17

"from xen to vmware"

前回までのあらすじ:
ESXi 4 をインストールしてその上で Windows Server 2003 を動かしていたが
Xen の上に移行できないのかと思い OpenSUSE 上の Xen にコピーを試みる
ESXi の上ではその都度ファイルが大きくなるような奴は使っていなかったが
ide のドライバを入れた状態の ???-flat.vmdk とやらをコピーして起動してみたら
何の変換も無しに Xen の上で動いてしまったのだった!!

Xen の上で一通り遊んだので ESXi の上に帰ろうと思いました
で、あれー、変換しないといけないのかなーと思ったので
色々入れて検索してみて vmware 何とか converter とかも入れてみて
ん〜 Xen っぽいのが無いから変換できないじゃんと悩んでいました

でも、良く考えたら前回変換しないで動いたんですよね
コピーして ESXi のコンソールを立ちあげて
古いのをリネームして Xen からもってきたのをその名前にしてやったところ
何の躊躇いもなく ESXi さんは起動してくれちゃいました
つまり分割とか何とか機能使ってなかったら普通のイメージってことなのね!?

ドキュメント読まずに勘 95% で作業してるので
良く VMWare のこと分かってないんですが
ライブマイグレーションとか今んとこ考えてなくて
検証作業がポンポン作れたり
スナップショットで便利を感じたりできればいい程度なら
Xen も VMWare も、多分 KVM とかも、コピーでイメージ使い回せるみたい
でもドライバのこと忘れないでね、という感じでした

VMWare の便利ツールのことをもう少し調べないと無駄な苦労してそうです

2009/11/14

vmware qemu-img xen bsod

ESXi 4 をいじっているわけですが
Windows Server 2003 を立てて Xen に移行してみたいなと思いました

「esxi xen 変換」でググると
無料で構築するセキュリティシステム Vmware ESXi vmdk から Oracle VM イメージ(img)への変換
qemu-img という command で disk image が変換できると出てきました。
なんだ、簡単じゃん、と思って変換して起動したらブルースクリーンに...

検索候補を続けて見たんですがどうも良く分からず
ESXi 4 は新しいし VMWare の image の version とかアレかなぁと思いながら
「vmware qemu-img xen bsod」で検索して辿り着いたのが
Selling Free Software for a Living: Converting VMWare image to SLES Xen
なるほど、IDE ドライバが無くてコケていると、それは当たり前だ

で、何が書いてあるかっていうと
Windows XP のシステム ディスクを他のコンピューターに移動した後に STOP 0x0000007B エラーが表示される
に書いてある対応を実際にやるって話で
ESXi の方で Windows のドライバのファイルをコピーして
更にコピペで作れと書いてある mergeide.reg を結合してやって
ESXi から wget でイメージ取って Xen に食わしてやったら無事に起動しました。
っていうか quem-img 要らず? ESXi が新しいから??

Xen の方で SCSI だと思わせれば良い気もするんですけど
あれ、どうやるんだろう?

2009/11/12

skype download old version linux

Skype for Linux の version が 2.1 Beta とやらになり
PulseAudio とかでないとどうも上手く動かせなくなったみたいなんですが
具体的には音が聞こえるんだけど伝えられないっていう

Linux なんて止めなさいというご意見は有り難く頂戴致しまして
今後の参考とさせて頂くのですが
目の前にある問題としてこいつを解決しなくてはいけません

で、古いのを入れれば戻るか、と思ったんですが消しちゃってたみたいで
探しました
Windows のは山ほど出てくるんですが、と思ったら
I need Older Version of Skype for Linux, Where?

http://download.skype.com/linux/skype-2.0.0.72-fc5.i586.rpm
http://download.skype.com/linux/skype-debian_2.0.0.72-1_i386.deb
あぁ、なるほど、version さえ分かってれば直で打てば良かったんですね
まぁ、最近のものだけかもしれませんけど
えぇ、もっと古いのは試していませんけど

というわけで、
古いのに戻したら安定した通話が帰ってきました
PulseAudio との戦いはどうしたものでしょうか

2009/11/11

esxi 再起動 ログ

ESXi 4 なぞいじっております
構築は他人に頼んでしまったヘタレなのですが
サーバ 1 台だけでローカルストレージの慎しい環境です
vSphere Client なんてのを教えてもらって GUI で楽々です

でも、ちょっと挙動に不安なところがあったので
ログでも参照してみようと思ったらログが無いじゃないですか
ESXi を再起動しちゃうと以前のログが見えなくなっちゃうみたいです
困った
ググった

VMwareESX/ESXi専用スレPart2
ひさしぶりに2ちゃんがひっかかりました
でもこれ USB で起動な話をしてるのかな、別かな、と思いつつ
サーバの [構成]->[ソフトウェア]->[詳細設定]->[Syslog] ってとこに
確かに Syslog.Local.DatastorePath って設定項目があって
vicfg-syslog.pl の画像を参照しつつ
設定してみてフォルダを作ってみたらログが吐き出されました

っていうか、まだ ssh で入ったこととかないんだけど
そういうことしてみちゃうべきなんでしょうか
とか、あとは、syslogd を他に立ててログ管理しろってことなんでしょうか
そろそろ動かしはじめて 3 週間なんだけど
やっと色々調べはじめてるしなぁ...

2009/10/21

"AdobeAIRInstaller.bin" "AdobeAIRSDK.tbz2"

Adobe Air ってのがあるらしくって
既存の知識で素敵なデスクトップアプリが作れるとか
まぁ既存ってのは HTML + JavaScript とか Flash とかみたいですが

で、まぁ、何だろな、試してみたいなと思ったので
ランタイムっぽいのと SDK っぽいのを Adobe からダウンロードしてみました
更にチュートリアルとか検索してみたり

でも、もぉコピペで動いちゃうような素敵なのは無いかなーと思って
タイトルの通り検索してみたら出てきました
KRAKENBEAL RECORD: AIR で Hello World
ありがたや、ありがたや

週末に試してみようと心に誓いました

2009/10/20

vista 隠しファイル 表示

vista の方が検索しやすいんですが
相変わらず 2008 のこといじってまして
そういえば XP でなら最初にやるフォルダの表示の設定
あれ変更しないと見えなくて困るじゃないかと思いまして
フォルダを開いて隅々見たんですが何も見付かりませんでした

で、ググったら出てきたのが
隠しファイルやシステムファイルを表示させる方法<Windows Vista(R)> 【動画手順付き】: dynabook.comサポート情報
すごいな、東芝、動画まで用意してるのか

まぁ、面倒なんで動画は見ないでキャプチャーをざっと見ると
コンパネを見にいけっことのようだったので見にいって
しっかり「フォルダオプション」ってのを見付けました。
隠されてるの見えるようにして、拡張子も出して、
保護されてるオペレーティングシステムファイルってのも
表示してみるようにしました

にしても、
何かカタカナの間にスペース入ってることが 2008 多いんですが
これは日本語化する際に英語の分かち書きの部分を引き摺ってるんでしょうか
なんか、ちょっと気持ち悪いよマイクロソフトちゃん

inurl:communicator/english

古いブラウザが欲しくなりました
なるべくオフィシャルっぽいところから

IE はまぁ、グレーなのしか無さそうなのでパス

Firefox は直前のシリーズのものであれば
http://mozilla.jp/firefox/locales/older/
にもあるんだけど
ftp://archive.mozilla.org/pub/mozilla.org/firefox/releases/
を見れば沢山
0.8 までなのは、それより前は firefox でなくて firebird になるからで
http://archive.mozilla.org/pub/mozilla.org/firebird/releases/
こちら。更に前には phoenix になるので
http://archive.mozilla.org/pub/mozilla.org/phoenix/releases/
にいくとありました。

Opera は
http://arc.opera.com/pub/opera/
ver 3 からあるっぽいんだけど、french とか italian とか書いてある
5 から英語もあるみたい、十分かな

Mozilla は
http://www-archive.mozilla.org/releases/
こっから辿れます、古いのは下の方にリンクが

あと、Netscape Communicator が
http://ftp.nluug.nl/netscape/communicator/english/
にあったり親とか親の親とか見てくと
http://ftp.nluug.nl/netscape/
Netscape 6 以降もあったりしました
http://ja.wikipedia.org/wiki/Netscape_(Mozillaベース)
を見ると Netscape と Mozilla の対応が分かったり

で、ついでなんで
「https://ja.www.mozilla.com/ に飛ばされると SSL のエラーが!!」
ってのに??? ってなってまして
あ、何でエラーが出るかっていうと CN=*.mozilla.com の証明書が提示されて
何で??? かっつーと「SSL/TLS で Namebase のバーチャルホスト」によると
IE 以外は * は . も match すると書いてあったから
エラーが出るってことは * に . は match しなくなったみたい

で、幾つか試してみると Firefox 3.0.12 までならエラーが出ないみたい
3.0.13 と 3.5 で CN に NULL を入れられちゃうと困っちゃう脆弱性が直されてるので
その際に * の解釈も変わったんじゃないかと推察はするけどそれ以上は調べませんでした

段々楽しくなってきてインストール厨の気持ちも分かってきたんではないかと思います

2009/10/19

"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"

みんなのホームが入ってるとこくらい別ドライブに分けておきたいでしょ?
って思うのはどうなんですかね、Windows のマナーとか良く分かってないんですけど
ちなみに Windows Server 2008 R2

最初は、「コンピュータの管理」のユーザーのとこの各ユーザーのとこ右クリックして
プロパティー見たら「プロファイル」ってタブがあるんでこれかなーと思ったら違うみたい
何か方々にユーザ向けフォルダができてしまって失敗
ちなみにデフォルトは %SystemDrive%\Users になってるんだけど
他のドライブにプロファイル設定してみたら両方にできちゃった
しかも同じタブの下の方にホームフォルダってのがあるんだけどこれが良く分からない
セキュリティーの為に使うんだみたいなこと書いてあったけどとりあえず放置

で、管理者権限で作業してみてたんだけどできちゃったフォルダが消せなくって
どうも所有者が違うので消せないらしく
しかも所有者変えるのにチェックボックスにチェック入れないと再帰的に変更してくれない
まぁそれは chown で -R しなかったってことなんで確かにそうなんだけど、ごめんなさい

さて、
ユーザー少ないからいいだろうと思ってたんだけど
これはシステムのデフォルトを変更した方が良さそうだということで
タイトルの registry の値を見付けました
こいつの下に並んでるフォルダみたいので名前が長いのが各ユーザーに対応してるらしく
中には各ユーザーのプロファイルのフォルダの名前などが書いてあるので誰のだか分かり
できちゃった人のを消しちゃってからそのユーザーで再ログオンすると初期化してもらえました

更に、
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
の中にある ProfilesDirectory とやらがシステムのデフォルトらしいので
これを好みの場所に変更してあげたら再ログオンで初期化されるプロファイルフォルダが
指定した場所にできるようになりました

っつうか、他でいうホームディレクトリ・ホームフォルダをプロファイルフォルダって言うの?
場当たりだけで何とかしようとするともぉ限界
つか、もうすこしグーグル先生とマイクロソフトちゃんが仲良くなってくれないかしら

2009/10/16

pulseaudio usb

Skype の 2.0 を使ってたんですが
2.1 が出てて Debian Lenny 用の .deb も出てたので
わーい、と思って入れてみました

で、チャットの相手が入力中なのが分かるようになって
だから何だって気もしないんだけど「うんうん」と思っていたら
どうも USB の電話みたいなやつのマイクが効かなくなってました

困ったなと思って検索してみたところ pulseaudio を使うようなことが書いてあり
http://share.skype.com/sites/linux/2009/08/skype_for_linux_21_beta.html
http://share.skype.com/sites/linux/2009/09/some_explanations.html
この辺り読んでうんうん唸ってました

pulseaudio にしたらどうやらマイクが使えるようになってるようだったんですが
何か、何かおかしいなと思っていたらどうやら本体のマイクを使っていたようで
自分のパソコンの本体にマイクが付いていることすら良く把握してませんでした
何だかなぁ

で、pavucontrol ってコマンドがありまして、
Skype の通話を始めると (テスト通話で OK)
pavucontrol の Recording ってところに何か出てくるので
そっから使いたい device を選択すれば切り替え可能のようでした

ん〜、Skype の Option で設定したいなぁ、何か間違ってるのかなぁ

2009/10/13

OOo uim

.doc とか .xls とか見れれば良いかと思っていて
OOo を入れてはあったんですが
簡単に PDF 作れればなと思って編集を開始したら
日本語が打てないことに気付きました

検索してみたところ
export SAL_USE_VCLPLUGIN=gtk
的なことがされていれば OK のようでした
でも、shift+space で toggle だったんで uim-xim が効いてる??

まぁ、入力できたからいいや、と思い
ちょちょいと PDF を作ることができました
しかも暗号化まで

2009/10/07

"ie for mac" サポート

その昔、Microsoft は Mac 向けに IE を出していました
なんとまぁ
でも、ご存じの通り今は提供されていません
しかし提供されてしまっていたのでどの程度サポートされていたのか
気になるところなので調べてみました

Microsoft、『IE for Mac』のサポートと配布の停止時期を明らかに
2005/12/31 でサポートが終了して
2006/01/31 で配布も終了していたようです
って配布の方が後って何でよ

まだ 3 年しか経っていないんですね
Chrome の OS X 版も使い物になるようになってきてるようですが
3 年後はどんなブラウザ使ってますかねぇ

2009/10/05

retweet bookmarklet

twitter で特にクライアントを使っていません
web だけです
特に不便を感じていなかったのですが
RT を手でやるのもどうかなと思いました
bookmarklet があれば、と思って調べました

Maraigue風。:[Twitter] ReTweetするためのブックマークレット
ありました
でもなんか、少し挙動が怪しい?
twitter も日々変化しているので追従しないといけないんでしょうか
しばらく使ってみようと思いました

2009/10/01

vim list 行末

ほんとに要るの? と思いつつも何となく
set number
set list
ってしてたんですが
rxvt だと doubl click で選択するときに行末の $ も選択されちゃって
や、それは嫌だなと思い Vim の方の行末表示文字を変更しようと思いました

vim で行末のスペースを可視化
あぁ、listchars か、と思って help 見ました
        Examples: >
:set lcs=tab:>-,trail:-
:set lcs=tab:>-,eol:<
:set lcs=extends:>,precedes:<
なるほど
何も考えてなかったけど < が良さそうだ
ということで設定してみました。

Vim も 7 だと行末の空白も listchars で何とかできるらしく
どんどん進歩するなぁ

2009/09/27

"import subprocess"

古い話ですが
Debian の OpenSSL のパッケージの patch にバグが混入してまして
Debian とその派生パッケージで擬似乱数生成の質がもの凄く悪くなってしまいました
OpenSSL パッケージの脆弱性とその影響について (SSH鍵、SSL証明書等)

で、秘密鍵の blacklist が作成されとりまして
openssl-blacklist という名前で package されてます

んで、
openssl-blacklist の中に openssl-vulnkey ってコマンド入ってまして
blacklist と証明書・秘密鍵・CSR を照合してくれるんですけど
これが Python で書かれてまして、つらつら眺めてました

popen2 とか知ってたんですけど、今は subprocess っての使うんですね
17.1 subprocess -- サブプロセス管理 を読んだんですけど中々頭に入らなくて
シンプルな例でもないものかと検索してみました

PyMOTW: subprocess - O'Reilly ONLamp Blog
おぉ、わかりやすい
STDIN/STDOUT/STDERR の読み書きとシグナルの投げ受けが!
あんま複雑なことするなら shell script 書けよってことだと思うんで
これくらい使えたらあとは何とでもなりそう、かな?

2009/09/26

"ieee802.11a" apple

もぉ無線 LAN が無い環境なんてありえないと思ってるわけなので
何かトラブルがあって繋がらなくなっちゃうと凄いストレスなんですが
身近に電子レンジっていうトラブルメーカーがいるんですよね

屋外で使うことなんて滅多にないっていうか今まで使ったことないので
g じゃなくって a でいいんですけど
そういえば次世代な n ってのがあったな、ありゃどっちだ? と思ったら
n はどっちもあるんだって wikipedia が教えてくれました
そしたら、是非とも a のある方を選びたい

あーでもでも、昔は apple が a なんてナンセンスみたいなこと言ってたよな
米アップル、「802.11a」を見限る
と思ったけど今出てる製品で a もサポートしてるみたいでした
家で使うなら a っつーか 5GHz がいいなぁ
新しい AP ほしいなぁ

あーでも、それって、FON とか否定してることになるのかしら

2009/09/19

vim 折り返し

エディタで CSV ファイルをいじるときってありますよね
あります、ありますでも、折り返されちゃうと何だか良く分からなくなりますよねどうやったら折り返さなくなるのかなぁ

vimで長い行が折り返されない、折り返すのをやめる方法
:set nowrap
でした。
トグルを設定する、までもないかな。

OpenOffice.org 入れましょう。

gmail パスワード

そういえば gmail ってパスワード忘れたらどうなるんだろう?
って思って検索しました

パスワードを忘れました - Gmail ヘルプ
  • A. 過去 5 日間にアカウントにログインしたことがあり、Google アカウントに予備のメールアドレスを設定している場合は、 予備のメール アドレス宛てにパスワード再設定の手順を記載したメッセージが送信されます。
  • B. 過去 5 日間にアカウントにログインしたことがあり、Google アカウントに予備のメールアドレスを設定していない場合は、 5 日経過してからパスワードを再設定してください。 5 日経過すると、セキュリティ保護用の質問に回答して、パスワードを再設定できるようになります。
  • C. アカウントを 5 日以上使用していない場合は、 セキュリティ保護用の質問に回答して、パスワードを再設定してください。
B 凄いな、メールアドレス設定してなかったら5日待てって。まじか。

というわけで、設定関係を見直しました。

google history

Chrome を使ってみています
なんか、メモリを喰うなぁって感じなのですが
それより履歴が見辛くて何をググったんだか分からなくなりそうです

で、Firefox の方が表示が好きだったんですが
Google を Web 履歴見るかなと思い
どこだったかなと検索しました

Web History
検索の履歴とそこから何見たから分かります
グーグルツールバー入れると他の履歴も見れるらしいんですけど
使ったことないし面倒なんで入れてませんでした

開くと、過去の履歴も見れました
あとは、ちゃんとログインしとけばいいのかな??

2009/09/09

パスワード 標準入力 python

パスワードをファイルに書いとくのは嫌だなーと思いまして
だったら何か別の方法で認証してもらいなさいよってことなのかもしれません
でも用意されてなかったり面倒だったり(!?)することもあるので
Python だったらどうやってパスワードの入力受けつけるかなーと

で、検索してみたら出てきましたよ
パスワードの入力 - forest book
getpass って module が用意されてました
keyboard の入力を表示させないで行の入力を受ける getpass.getpass
user name を返してくれる getpass.getuser
2つ関数が用意されてました
ん〜、細かい

そういえば、
パスワード入力の「****」は不要? 研究者の間で激しい論議
こんなのがありましたね
黙って sys.stdin.readline 使っとけってことなのかなぁ...

2009/09/08

datetime split python

>>> import datetime
>>> datetime.date('2009/10/2'.split('/'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: function takes exactly 3 arguments (1 given)
>>>
たしかに

flatten 的なことをするのか? と思ったけどそれでは結局 1 つだしな
と思い具体例を検索
結果時系列で並べると
pythonの引数にある*hogeとか**mapとか - a2c.get.diary
RE:pythonの引数にある*hogeとか**mapとか - Djangoへの片思い日記
RE:RE:*hogeとか**mapとか
ときて
>>> datetime.date(*map(int, '2009/10/2'.split('/')))
datetime.date(2009, 10, 2)
>>>
とか、そのコメント欄の Voluntas さんの
>>> from dateutil.parser import parse
>>> parse('2009/10/2').date()
datetime.date(2009, 10, 2)
>>>
とかみたい

読み返すと、確かにこりゃ SPAM blog だな
nothing new だ
まぁ、手の平で躍らされてるってことで

♪ ∧,_∧
   (´・ω・`) ))
 (( ( つ ヽ、   ♪
   〉 とノ )))
  (__ノ^(_)

analytics api python

Google Analytics のデータを Web から取るのが嫌になってて
API が用意されたのは知っていたのに放置していたんですが
そろそろ手を付けてみるかと思って検索してみました

何も知らんかったのでとりあえず検索したら
Juiced Google Analytics Python API: Juice Analytics
がひっかかったんだけど最初んとこで
Due to the release of an official Google Analytics Data Export API, this module is now deprecated. We have an alternative python module based upon the real analytics API here, and an exploring tool with an automatic code generation capability here.
って書いてあるんで
素直に飛びました
suryasev/python-degapi @ GitHub
で、gdata っての入れろって書いてあるから入れようとしてみると
$ easy_install gdata
Searching for gdata
Reading http://pypi.python.org/simple/gdata/
Reading http://code.google.com/p/gdata-python-client/
Best match: gdata 2.0.2
Downloading http://gdata-python-client.googlecode.com/files/gdata-2.0.2.zip
Processing gdata-2.0.2.zip
Running gdata-2.0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-11Yjnd/gdata-2.0.2/egg-dist-tmp-EM1MAM
zip_safe flag not set; analyzing archive contents...
Adding gdata 2.0.2 to easy-install.pth file

Installed /usr/local/lib/python2.6/site-packages/gdata-2.0.2-py2.6.egg
Processing dependencies for gdata
Finished processing dependencies for gdata
2.0.2 ってのが入って書いてあるのと全然違う

gdata って何だよ! と思って調べたら
Getting Started with the Google Data Python Library - Google Data APIs - Google Code
何もーちゃんとしたのがあるんじゃない
もの知らんと怖いなぁと思いました

とりあえずカレンダーでも読めるようになりたいヨ! と思ったので
ドキュメントを眺めつつ今年と来年の祝日を取ろうとしたんですが
import gdata.calendar.service

def getHolidays(year=2009):
cs = gdata.calendar.service.CalendarService()
q = gdata.calendar.service.CalendarEventQuery(
'japanese__ja@holiday.calendar.google.com', 'public', 'basic')
"""
>>> q.ToUri()
'http://www.google.com/calendar/feeds/japanese__ja%40holiday.calendar.google.com/public/basic'
"""
q.start_min = str(year) + '-01-01'
q.start_max = str(year) + '-12-31'
feed = cs.CalendarQuery(q)
return [i.title.text for i in feed.entry]

if __name__ == "__main__":
print " ". join(sorted(getHolidays(2009)))
print " ". join(sorted(getHolidays(2010)))
ん〜、日付の取り方が分からない
when とか入ってないし、繰り返しだから??
2009 年の春分の日も無くなってるんだよなぁ

あれ? Analytics は??
trail a trend: Google Analytics Data API を試す
trail a trend: Google Analytics Data APIを試す。続き
この辺見たらいいと思うヨ!!

2009/09/07

XP ディスク容量 アンインストール 休止状態

Windows XP がまだまだ使われていますが
パソコン使っててどこでどんだけ容量使われてるか
気になりますよね
Windows Update やら復元ポイントやらで
どんどんハードディスクが食べられていってしまいます
要らないものはどんどん消していきたいなぁと

つわけで検索すると
Windows XP簡単ディスク・ダイエット術 11のポイント
各種消してもあまり問題ないかもしれないフォルダやらファイルやらを
詳しく説明してくれていました

Xen とか VMWare で休止状態有効にしといても
あまり意味無さそうですもんね
検証環境の元みたいなのを作るのにもシンプルな構成からスタートしたいな
と思いました

2009/09/03

windows-2003 再起動

何ででしょう、シャットダウンできなくなっちゃいました
OpenOffice.org の新しいのを入れようと思っただけだったんですが
cmd 上からなら何とかなるだろうと思い検索しました

OSの再起動バッチについて - 教えて!goo
c:\>shutdown /r
で 30 秒後に再起動してくれました
c:\>shutdown /r /t 0
ってすれば即時再起動なのかな??
c:\>shutdown
オプション空打ちすればヘルプが出ます

にしても、再起動できなくなってしまった理由が気になります...

perl 配列 uniq

いまだに、使い捨てスクリプトを書こうとすると
Perl で書き始めていることがあります
何ででしょう、不思議です
何とかの魂なんでしょうか

でも、たまーに使うので色々忘れていまして
「配列の成分を unique にするのって? set ないしな」と
だったら最初から Python でも使っとけよって話なんですが
ググりました

配列(リスト)から重複を取り除く
なるほど! 一旦 hash の key として全部入れてしまえと
何となく富豪的!!

パッケージ: libarray-unique-perl (0.08-1)
それ用に module も作られてるらしいです
CPAN なくして Perl なし、ですね

ちなみに、array の要素数の数え方も調べたんですが
(それすら忘れてるならもぉ Perl を使うなと)
$#array とか使いたくないなーと思っていたら
scalar context にしたら成分数出してくれるんですね。
scalar keys %hash
とかすると %hash の要素数に
変態だなぁ、Perl、かわいい

2009/08/30

vim tab ファイル名補完

Emacs からの乗り換え派として
Vim に慣れるのが難しいのがファイル名の補完でした

Emacs や、bash の default もそうだと思うのですが
先ずは補完できるところまで補完して
選択肢が複数あるところまでいくと一旦止まり
更に補完を促すと補完候補を一覧表示します

Vim の default はどうなっているかというと
補完できる候補の最初の 1 つに補完しちゃいます
で、違う場合は補完動作を繰りかえせば次の候補にいってくれるんですが
候補が沢山あったり補完文字列が長いと
面倒だなぁと思っていました

ググりました
vimの補完をzshみたいにする - World Wide Wonderful

なるほど!
set wildmode=list:longest
これで希望っぽくなりました
でも、候補が沢山あるとリスト作るのに時間が掛かってストレスフルですね
はてさて、どうしたものでしょう

2009/08/29

"set backupdir"

お休みですし、何か気楽なことしようと思ったんですが
そういえば Vim のこと中途半端で置いてたなと思いまして
まぁ何に関しても中途半端なままなんですが
editor ってのは毎日使うもんだしなと思って Vim のこと調べることに

http://vimwiki.net/
http://vim-users.jp/
http://vimpi.net/
http://nanasi.jp/
この辺りは tips があったり設定の説明があったり設定が晒されてたり

http://www.vim.org/scripts/script.php?script_id=1334
http://www.kawaz.jp/pukiwiki/?vim
http://d.hatena.ne.jp/secondlife/20060203/1138978661
http://project-p.jp/halt/wiki/vim/plugin/surround
http://tnerual.eriogerg.free.fr/vimqrc.html
http://d.hatena.ne.jp/thinca/20090305/1236191531
ん〜、何か雑多だなこの辺は

特に何か素敵な設定見つけたよ! ってわけではないんですが
とりあえず
set hidden
って設定は新たに知りました
知らんかった
あと、text-object ってのがあるんですね
cit は change inner of tab みたいな意味で
色々できそうってのは分かりました (see :help iw, and so on)

まだ、Vim の文化が身に沁みてない気がします

2009/08/28

hyper-v XP 2000

Hyper-V という選択肢もありか、と思いまして
果たしてどんくらい古い Windows が動くのかなぁと思いました
まぁ、古いっつっても XP と 2000 が動けばいいかと思ったので検索

Hyper-V におけるゲスト オペレーティング システムのサポート

XP は SP2 から、2000 は SP4 から対応してるみたいでした
つか、これはつまり、現状サポートを維持してる OS ってことなのかな?
あー、ていうかー、Hyper-V は完全仮想化みたいですね
例え完全仮想化でもこの辺りの OS ならパフォーマンスには問題無いでしょうし
そもそもそんなハードに使うんで XP やら 2000 が触りたいのではないので
全く問題無いですね

それより、今まで興味無かったので知らなかったのですが
Hyper-V の上で Xen の DomU が動くんですね
何て変態な

2009/08/26

IIS certutil private-key

Windows で HTTPS っていうと IIS 使うと思うんですが
そうするとサイトのプロパティーからディレクトリセキュリティー選んで
証明書っての押すと CSR 作るウィザードが出てきて情報入れます

CSR 作るからには、RSA は前提として、秘密鍵が作られてるわけで
でもそれは IIS のウィザードにしっかり隠蔽されています
んで、この申請ってのは途中でキャンセルできたりするんですが
そうすると CSR は手元にあるのに秘密鍵が迷子になっちゃいます

キャンセルせずにそのまま証明書をゲットした場合にも
間違えてまた同じ CSR で新しい証明書を発行してもらった場合など
Windows の奥の方で秘密鍵と証明書の pairing が記載されてるらしく
pairing がなされてない証明書は IIS の選択肢に出てきません
(だったら古い方 export して pkcs#12 から秘密鍵取り出せ? そうなんですけど)

で、そもそも IIS のウィザードは certutil ってコマンドのフロントエンドのようで
certutil は CryptoAPI を叩くのに
Microsoft が用意してくれてるツールの 1 つなのかな?
(OpenSSL と openssl のようなもんかしら??)

で、どうやって pairing 作るんだっけなと思いまして
検索してみたら出てきた最初の blog (タイトル長いな)
Assign a private key to a new certificate after you use the Certificates snap-in to delete the original certificate in Internet Information Services - Sunday Morning Musings on IIS : The Official Microsoft IIS Site
に -repairstore を使えと書いてありました

"certutil -repairstore" とかすると日本語の情報も出てきそう
でもこれ、何だかこみいってて、自分でするのはいいけれど
他の人に「こうやって下さい」って説明するの嫌だなぁ...

2009/08/21

"Required SSLCacheServerPath missing"

Apache-SSL を忘れてました

apache 1.3 のソースと、それに合わせて apache-ssl のソースを取ってきます
バージョンを合わせましょう
で、apache のソースを展開して移動して apache-ssl をその場で展開します
中に FixPatch ってスクリプトがあるんで ./FixPatch ってして実行
patch あてるか聞かれるんで y って答えてあげます
で、あとは configure して make して make install
src に移動して make certificate ってするとオレオレ証明書も作ってくれます
apache_1.3.?/SSLconf/conf/httpsd.pem に証明書と鍵が入ってます

で、apache_1.3.?/SSLconf/conf/httpd.conf が設定サンプル
ココに SSLCacheServerPath とか設定してあるんですが
インストールした方の conf/httpsd.conf には記述が無いので
まんまだと起動できなくって "Required SSLCacheServerPath missing" って出ます
で、httpd.conf に SSLCacheServerPath はあるんですが
path が変なとこ向いてるんで bin/gcache を指してあげ
更に証明書と秘密鍵のパスも設定してあげると起動します

tar xfz apache_1.3.41.tar.gz 
cd apache_1.3.41
tar xfz ../apache_1.3.41+ssl_1.60.tar.gz
./FixPatch
./configure
make
make install
cd src/
make certificate
cd ../SSLconf/conf/
cp http* /usr/local/apache/conf
cd /usr/local/apache
(conf の中身をいろいろいじる)
./bin/httpsdctl start
SSL 部分の設定 include したら動くようになってると素敵だな
って思いました
User とか Group とか再定義できるんですかね、Log も
上書き??

apache-1.3 mod_ssl

復習大切ですよね、というわけで apache のこと復習してました

apache-1.3 の場合 mod_ssl ってのは本体とは別で配布されてます
本体も mod_ssl も展開して
./configure --with-apache=../apache-1.3.41
的なことをして設定
更に本体の方に移動して
./configure && make && make certificate && make install
的なインストールをします
設定ファイルは conf/httpd.conf に入ってまして
でも Listen するのが 8080 とか 8443 とかになってました
make certificate するときにオレオレ作ったんでそれが使われます
で、startssl

apache-2.0 の場合は本体に入っているので
./configure --enable-ssl
的なことをして設定
設定ファイルには 443 ポートでの設定が入ってる
設定ファイルは conf/ssl.conf が conf/httpd.conf から Include されてるので編集
証明書は作ってくれないのかな??

apache-2.3 の場合も本体に入ってる
設定ファイルは conf/extra/httpd-ssl.conf になってて
conf/httpd.conf からの Include は comment out されてます

にしても、apache 大きかったです

2009/08/20

ネットワークはほかのアプリケーションによって変更されました

Mac のネットワークの設定をしようと思って
「システム環境設定」から「システム環境設定」を開いたら
ネットワークはほかのアプリケーションによって変更されました
って言われました
OK を押すとまた出てきます

こ、これは前に出会ったやつだ! と思い
OK 押したその瞬間に左下の設定を lock する南京錠を押せば
設定が変更できるようになるんだったなと思ってクリック
そしたら、マウスカーソルが虹色にクルクルしたまま帰ってこなくなりました
これは困りました

とりあえずシステム終了させようとしたら強制終了の確認が出たので強制終了
も一度試してみたもののやっぱり同じ状態になったのでググりました
/Library/Preferences/SystemConfiguration/preference.plist
が悪くなってるからこいつを何とかしろって出てました
rename して退避してみたら無事設定ができるようになりました

よかった

2009/08/17

wpa wpa2 tkip ccmp

無線 LAN の設定をしてるときや
WEP や TKIP が破られたというニュースを聞く度に
どうも良く用語の理解をしていないなと思っていたので
どっかに良いまとめは無いものかとググってみました

AirMac では WPA=TKIP WPA2=AES に固定? - PB memo
暗号化アルゴリズムとしては RC4 や AES っていうのがあって
それらを使って wifi を暗号化する仕組みが WEP や CCMP で (プロトコル?)
WEP は弱かったんで少し手直ししたのか TKIP なのかな?

で、WPA と WPA2 の違いというのが、良く分からない
具体的にどこが違うのか良く分からないのですが
WPA(TKIP), WPA(CCMP), WPA2(TKIP), WPA2(CCMP) という 4 つ別のものがあって
それぞれに対応してないと接続できないようですねぇ...
で、WPA=WPA(TKIP), WPA2=WPA2(CCMP) という通り名が結構通用してる、のかな?
WPA と WPA2 の間の TKIP と CCMP の互換性の辺りが良く分からないんですが
どうも互換性無いようですねぇ

互換性を考えるといま素敵なのは WPA(CCMP) な気がするんですが
WPA(CCMP) に対応してないけど WPA2(CCMP) には対応してる機器もあるみたいなんで
中々悩ましそうです

2009/08/14

"http revision-up"

久し振りにヤマハの RTX1100 の設定のことをちょっと調べたら
ファームウェアも上がってたのでアップデートしようとしました

ヤマハのルータは何を考えてるのか分からない! ってくらい
頻繁に機能追加してくれて (仕様も変わったりするんですが)
知らない間に素敵機能が追加されてるかもしれないドキドキ感が味わえます

なのでリリースノートを遡って眺めてたら http revision-up を
定期的に行ってくれるっていう機能の追加がされていました
Rev.8.03.80リリースノート
え、なに、っていうか、http で上げれたの?

とりあえず tftp でアップデートをしてしまった後に
ちょっとググったらリリースノートを発見
Rev.8.03.37リリースノート
2006 年 3 月ですって、3 年前から存在してる機能でした
私が RTX1100 と出会う前からです...

次回は、http でやってみようかと思います
ちょっと怖いから定期的なのは今は見合せることにして

2009/08/12

x-forwarded-for combine

proxy 的なものがかまされると
apache なんかの access log が残念なことになってしまいます

Apache の log format の default は Common Log Format とかいって
"%h %l %u %t \"%r\" %>s %b"
だそうです (mod_log_config - Apache HTTP サーバ)
これは
%h でホスト名は取ってるんだけど proxy 使ってるとサーバの名前しか取れません

しかし、「x-forwarded-for と combine で FA」と耳にしたのでググってみました
[Pound][Apache]X-Forwarded-Forログ設定 : ブログシステム - BLOG.BBTUNE.COM -
なるほど、mod_log_config - Apache HTTP サーバ
%{Foobar}i サーバに送られたリクエストの Foobar: ヘッダの内容
ってのを使うんですね。
これでもぉログ取り放題です。

2009/08/08

chromium linux flash

Linux の Chromium どっすか?
みたいなことを聞かれたんですが全くいじってなかったので
試してみようかと思ってググって入れてみました

chrome linux とかで検索したら
Early Access Release Channels ‎(Chromium Developer Documentation)
ここに deb ファイルがあったんでインストール
1 つだけ足りないパッケージがあったんで aptitude で入れました
まぁ、それは、環境依存ですね

$ dpkg -L google-chrome-unstable
すると /opt に大体入ってるみたい
/etc/cron.daily/google-chrome ってのがあって
毎日最新版に update しようとしてるみたいです
自動更新嫌な場合は /etc/default/google-chrome を編集
/opt/google/chrome/google-chrome が起動スクリプトで
/opt/google/chrome/chrome が内部で呼ばれてるっぽく
設定ファイルは ~/.config/google-chrome に入ってます

設定画面を見るとテーマで GTK の設定と同調できるみたいなので
GUI は GTK を使っているのか日本語入力もスムース
twitter にも書き込めたし今これ書いてるのも chromium です

Flash が見れたらとりあえず不自由しないかな? と思い
再びググってみたところ
chromium alpha linux and flash - Google Chrome Help
I created the "plugins" directory inside the google-chrome directory and just put the file "libflashplayer.so" from Adobe there.
If you run "chromium-browser --enable-plugins" Flash works in the most recent build
とあったので
/opt/google/chrome/plugins を作ってそこに .so 入れて
--enable-plugins 付けて chromium 立ちあげたら YouTube も見れました

何だか Flash がとても安定しているような気がして
Firefox 3.5 以降で Flash 使ってると頻繁に落ちてて困ってたんで
選択肢が増えるってのは有難い話だしサクサクしてるってのも良い感じ
暫く常用してみようかなぁ〜、と思っています

[追記]
っていうか、起動したときの splash 画面に --enable-plugins しろって出てた!
package に flash がインストールされてたら、そっちを見てくれるみたいでした
わざわざ plugins 作らなくても OK か...

2009/08/07

openssl rsa "public_key"

また Ruby で CSR ですか、と思われても仕方無いのですが
今回は CSR を作りたいなというお話でして
色々ググったりして
RubyOpenSSLDigitalSignatureSample - Hironobu's Tips List
ここで秘密鍵のこと習ったり
Ruby のソース眺めたりして
結果こんな感じになりました

require 'openssl'
include OpenSSL

# RSA key pair を作る、引数は鍵長と exponent
pkey = PKey::RSA.new(1024, 65537)

# Subject 用にお名前を用意する
# oid と名前の pair を沢山渡す
# oid はどれ? という場合は http://www.alvestrand.no/objectid/2.5.4.html
# new でも渡せるし追加もできる
subject = X509::Name.new([['2.5.4.6', 'JP'], ['2.5.4.8', 'Tokyo']])
subject.add_entry('2.5.4.7', 'Chiyoda-ku')
subject.add_entry('2.5.4.10', 'example')
subject.add_entry('2.5.4.3', "www.example.com")
# subject = "/C=JP/ST=Tokyo/L=Chiyoda-ku/O=example/CN=www.example.com"

# 空の CSR を作って秘密鍵と Subject を登録
req = X509::Request.new()
req.public_key = pkey
req.subject = subject

# 最後に署名して終わり、鍵と hash 関数を与える
req.sign(pkey, OpenSSL::Digest::SHA1.new)

puts req.to_text
#Certificate Request:
# Data:
# Version: 0 (0x0)
# Subject: C=JP, ST=Tokyo, L=Chiyoda-ku, O=example, CN=www.example.com
# Subject Public Key Info:
# Public Key Algorithm: rsaEncryption
# RSA Public Key: (1024 bit)
# Modulus (1024 bit):
# 00:c3:a5:c1:63:63:0d:79:0e:94:e2:82:4f:97:97:
# 07:9a:26:86:8c:27:14:ef:99:ed:9e:9e:46:03:10:
# 9e:e9:6a:af:69:8a:11:47:29:55:c5:68:59:14:70:
# ce:6a:91:34:9a:59:98:1e:59:09:a3:f5:30:69:b6:
# bf:09:c2:24:5c:96:16:81:ef:4e:ae:51:70:0f:14:
# 03:9e:17:18:9c:c1:2c:c1:cb:5d:7f:9e:1b:4a:0d:
# 92:11:47:42:cc:71:23:54:0d:60:ec:79:4d:27:20:
# dd:f0:1f:31:06:c6:88:86:31:d5:a1:ba:91:5a:bb:
# 08:a5:29:4e:89:99:35:58:cd
# Exponent: 65537 (0x10001)
# Attributes:
# a0:00
# Signature Algorithm: sha1WithRSAEncryption
# 8b:df:fb:0f:5c:33:56:22:06:c7:1d:8d:df:a0:d3:fc:ea:ea:
# ff:bd:69:12:b5:f5:56:b2:9a:e0:38:2c:57:0e:99:33:97:93:
# 66:50:b4:68:d6:a4:9d:dc:71:77:48:1a:4c:a5:41:6a:33:29:
# 98:5a:ae:75:61:1f:0e:38:42:ab:29:e3:41:dd:bb:88:bf:d1:
# 27:2e:8e:91:c7:a8:a8:4a:f8:7c:dd:86:d5:48:94:19:a1:c0:
# 8a:bb:94:c2:c3:7b:50:7c:a2:9d:d3:45:45:59:cd:5c:d9:b6:
# a0:a6:db:13:32:75:27:3d:b6:84:a1:bb:30:6c:9b:8a:13:f7:
# ac:43


もうちょっとがんばって
  • Extension 書く
  • 日本語入れてみる
などあるかとは思いますが
まぁそういうのは追い追い

米軍 台風

台風が来ているわけですが
国内で台風情報といえば気象庁です

気象庁 | 台風情報
台風が発生している場合はクリックしていく毎に大きな画像が見えます
気象庁 | 過去の台風資料
過去の台風の進路も見せてくれます
気象庁 | 台風経路図2006年
ここから 13 号の軌跡を見て頂きますと中々強烈です
気象庁 | レーダー・降水ナウキャスト
こっちは雨の様子を過去 3 時間まで遡って見ることができます
地域毎にクリックできる場所があって
レーダー・降水ナウキャスト:宮古・八重山地方
大きくできます

が、しかし、
気象庁は正確さを求めるのか中々データが遅いです
そこで米軍のデータなんかを良く見たりします
嘉手納に基地があるからでしょうか、大切なデータなのではないかと
ググると出てくるのが
デジタル台風:台風情報 - 気象庁と米軍(アメリカ海軍)JTWC
で、リンクが貼ってあるので
Joint Typhoon Warning Center
に飛びます

台風ができてると
"Current Northwest Pacific/North Indian Ocean* Tropical Systems:"
のところに
Typhoon 09W (Morakot) Warning #12
Issued at 06/1500Z

- TC Warning Text
- TC Warning Graphic
- Prognostic Reasoning
- JMV 3.0 Data
- IR Satellite Imagery
- Satellite Fix Bulletin
みたいなのが出てます
このTC Warning Graphicを見ると
そんな大胆な! ってくらい先までの予測を出してくれます
実際、あんまり先のことはあんまりあてになりません
IR Satellite Imagery は衛星画像です

みんな、この辺りのページを見ながら
「やぁ、来そうだねぇ」「これは大きくなるかもねぇ」
なんて言っています

2009/08/04

fqdn2domain

fqdn から domain name を取り出したいと思ったんですが
.jp に限っても属性・汎用・地域とか色々あって面倒です
つうかこんなん誰かやってるっしょ! と思ってググってみました

avex-freak - fqdn2domain.pl
おぉ、いらっしゃった、Perl で
眺めてみたんですが国毎に色々なルールがあるみたいで面白かったです

で、これの Python とか Ruby 版はどこ?

configure make mysqld

SQL のこともろくに知らなかったので基礎から勉強しろと言われまして
初めてのSQLを薦められてたので買ってみたんですが
読みもせず積読ってよりは放置していたんですが
他のことに飽きたので(?)少しずつでも読もうと思いました

MySQL で SQL 入門しようぜ、先ずは SELECT からさ! という本でして
練習問題も付いてますしサイトにサンプルデータも置いてあるので
MySQL を先ず使えるようにしたらいいんだろうなと思ったのですが
折角なんでソースからと思って落としてみると 36MB あって大きい
しかもコンパイルにも中々時間が掛かって RDBMS ってのは凄いなと思いました
がんばれ MySQL

で、コンパイルしてインストールしてみました
ここでドキュメント読めばいいのに気持ちが抑え切れず
インストールされてるものつらつら眺めて mysqld なるもの発見
これを動かせばいいのかーと思って実行してみて見事にエラー

ここでドキュメント読めばいいのに気持ちが抑え切れず
configure make mysqld でググるという蛮行に出ました
MySQLをソースからインストール(RedHat9) - FreeStyleWiki
設定ファイルをコピーするのか!! とかもぉ見てられない状況の中
読み流してて mysql_install_db せずに
Table 'mysql.plugin' doesn't exist
と言われたりしつつ
無事サンプルデータのインポートができました

でも、ここで満足してはいけないわけです
ましてや飽きるなぞ以ての外、なんですが....

2009/07/30

vista ルート インポート

XP まではそんなことなかったみたいなんですが
Vista でルート証明書をインポートする場合は
「証明書の種類に基いて、自動的に証明書ストアを選択する」
を選ぶとインポート先が「中間証明機関」になっちゃうみたいです

ググったらみな手動で「信頼するルート証明機関」を選択してました
Vista/2008 のルート証明書のコントロールは中々中央集権みたいだし
細かなところで小さなミスしないように気が配られてるのかな?
って思ったらいいのかな

管理者にならないとダメみたいな記述があったんですが
物理ストアを指定したりしなければ OK でした
ユーザーアカウントのところにインストールされたんだと思います
サービスアカウントとかコンピュータアカウントのストアに入れるときは
流石に何かしら権限が必要だと思うんですが

50音順 長音 拗音

50音順で並べたいときって、ありますよね
「ジェ」と「ジー」ってどっちが先でしょう?
全てのものが一直線に並ばなくてはいけないわけですから
どんな 2 つの単語を選んでも前か後か決める仕組みがあるはず

というわけでググったんですがとりあえず Wikipedia
やっぱりいくつかパターンがあるみたいです
おぉ、JIS 規格になっているものもあるらしい
JSA Web Store - JIS X 4061:1996 日本語文字列照合順番
買わなきゃいけないの? と思ったけど
日本工業標準調査会:データベース検索-JIS検索
ありました
おぉ、何か、色々な仕掛けがされている

Wikipedia の例の最初のやつは
どうやら JIS のものをもってきてるようでした
結果「ジー」->「しい」、「ジェ」->「しえ」と変換して比較し
ジーの次にジェをもってくることにしました
JIS 準拠!

2009/07/27

windows route persistent

Windows Server 2003 の仮想マシンをいじっていまして
ネットワークカードを 1 枚足しました
合計 2 枚になったんですが片方は VPN 側で
静的にルーティングを振っておきたいと思いました

route コマンドで OK だったと思うんですが
でも、再起動すると設定が消えないようにするの忘れちゃって
cmd でヘルプ読むの嫌だなぁと思ったのでググってしまいました

route - ルーティングテーブルの表示/設定を行う
記事の日付が 2001/11/1 です
思えば遠くへ来たものです
Linux と Windows の両方の routing の設定がまとまった素敵記事でした
C:\>route -p add 192.168.99.0 mask 255.255.255.0 192.168.10.253 metric 1 if 0x1000003
こんな感じで "-p" してやると persistent らしいです

これで default gateway の設定間違えて
RDP で繋がらなくなっちゃった!
なんてことも無くなりました、よかったよかった

2009/07/26

nginx msie

別件で検索したりしてて
MSIE ってのは脳味噌腐ってるって話を思い出しました
apache の ssl.conf には
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
って設定がされてたりしますが
その前のところのコメントなんかに理由が説明されています

で、そうだよな、IE が悪いよなきっと、と
nginx ssl の悩みを解決すべく
気をとりなおして検索したら
nginx ssl_prefer_server_ciphers and MSIE 7.x core dump
って bug report を見付けました
あらら
設定を色々試していたはずなんだけどなぁ
何で見付けられなかったんでしょう

ssl_prefer_server_ciphers の on にしなければ
nginx で SSL してても IE と正常に接続できるようになりました
よかったよかった

2009/07/24

wildcard subjectaltname virtualhost

SSL と VirtualHost 関連で「どうなの?」的なことを問われたので
確か素敵まとめサイトがあったと思って検索したら
SSL/TLS で Namebase のバーチャルホスト
が出てきました
素敵!!
VhostTaskForce - CAcert Wiki
ここも素敵かな??

多分 Apache 用語ですけど
VirtualHost
1 つのウェブサーバで複数のウェブサイトを構築
IP address ベースと Name ベースのものがある
IP ベース VirtualHost
アクセスがあった IP address 毎に
サイト・コンテンツを指定して複数サイトがあるように見せる
IP address が複数必要なので場合によってはコストが高い
Name ベース VirtualHost
サーバーの名前毎にコンテンツを振り分ける VirtualHost
IP address が 1 つしかなくても複数のサイトが構築できる
HTTP 1.1 とかで Host というヘッダをクライアントは送るので
そこで判断してるんですよね?? きっと

で、こっから少し古い話

一方 SSL は TCP の接続の後にネゴシエーションするわけですが
ここにはまだ Apache 出てこないんで Host とかの内容見ません
SSL のネゴシエーションのときに分かるのは TCP までの情報なので
IP address とか port 番号とかです
なので、HTTPS でサーバが証明書を提示する際にどの証明書を提示するか
それを決める判断の基準も IP address とか port 番号しかありません

IP ベースの VirtualHost であれば IP address と port 番号毎に
1 つサイトが決まっているので証明書を提示してあげれば良いのですが
1 つの IP アドレスの下で Name ベースの VirtualHost をしてる場合
それら VirtualHost 達で 1 枚しか証明書が提示できません
なのでワイルドカードや SubjectAlternativeName などを利用して
1 枚で複数の FQDN に対応できる証明書が利用されています

古い話終わり

で、RFC 3546 で TLS 拡張で Server Name Indication ってのが定義されてるそうで
TLS レベルで接続したいサーバの名前を指定する仕組みが決められて
それ使えば Name ベースの VirtualHost でも問題無しに
1 Host 毎に 1 枚証明書を対応付けれて IP address もぉ要らないよ!
ということになっているみたいです

IE7 以降とか Fx 2 以降とか Opera 8 以上は対応してるみたいなんですが
携帯とかどうなんだろう??

更に、RFC 2817 では Upgrading to TLS という仕組みも定義されてるとか
HTTP 1.1 から TLS な世界に切り替わるみたいですが
ちょっと、ググっただけでは対応状況までは分かりませんでした

Server Name Indication が普及してくれると分かり易くていいですね

2009/07/22

epoll recv

Twisted が分からないのもそのはずで
やはり非同期ってのが良く分かっていないからなのでした
Twisted ドキュメント: Twisted による非同期プログラミング
ってのを twisted tutorial deferred で教わって
そもそも英文の方も読んだはずなのにちゃんと分かってなかったみたい

で、select とか epoll とかいう単語を
Voluntas さんに教えて頂くなどしまして
ちょっくら自分でも何か書いてみるかということで
RSS とか Atom とか取ってきてみようかなと
途中で悩んでググってみて
How epoll detect clientside close in Python? - Stack Overflow
のコードとか見たりしつつ

で、実際やってみたら HTTP の処理が面倒になっちゃったんで
まぁとりあえず epoll だけ実感できる感じで
from socket import socket, gethostbyname, error
from select import epoll, EPOLLIN, EPOLLOUT
from urlparse import urlparse

FEEDS = (
'http://d.hatena.ne.jp/Voluntas/rss2',
'http://kamo.typepad.jp/blog/index.rdf',
'http://takagi-hiromitsu.jp/diary/index.rdf',
'http://d.hatena.ne.jp/nishiohirokazu/rss2',
'http://www.nnar.org/feed/atom',
'http://d.hatena.ne.jp/CortYuming/rss2,'
'http://vim-users.jp/feed/atom/',
'http://blog.livedoor.jp/dankogai/atom.xml',
'http://d.hatena.ne.jp/Chikirin/rss',
'http://thisistanaka.blog66.fc2.com/?xml',
)

ep = epoll(1024)
sockets = []
feeds = {}

for feed in FEEDS:
feed_data = urlparse(feed)
hostname = feed_data.netloc
path = feed_data.path
s = socket()
s.settimeout(0)
try:
s.connect_ex((hostname, 80))
except:
continue

fileno = s.fileno()
feeds[fileno] = (hostname, path, s)
ep.register(fileno, EPOLLOUT)

while feeds:
for (fileno, event) in ep.poll():
s = feeds[fileno][2]
if event == EPOLLOUT:
s.send("GET %s HTTP/1.1\nHOST: %s\n\n" %
(feeds[fileno][1], feeds[fileno][0]))
ep.modify(fileno, EPOLLIN)
elif event == EPOLLIN:
s.setblocking(1)
print s.recv(1024)
del feeds[fileno]
ep.unregister(fileno)
実行する度に結果が違うはずで
それは返事が来た順番で処理できてるからなはず

FEEDS の分だけ socket 張って
epoll で監視して受けとれるようになった奴から 1KB だけデータ読んでます
Python の場合 socket object には connect_ex って method がありまして
こいつは exception ではなくて error の値を吐くんだそうです

が、connect_ex は接続先が resolve できなかったときだけ
exception 吐くという仕様となっていたので
結局 try except してしまいました

あと、ほんとは socket.fromfd とかで socket 呼んだ方がいいのかも
だけど別の場所で socket を覚えさせたりしないと
    ep.modify(fileno, EPOLLIN)
IOError: [Errno 9] Bad file descriptor
って言われたりして
unregister した瞬間に socket が葬り去られてしまってるんでしょうか
無駄に覚えさせといても動いたんですが折角なんで
socket も feeds の中に入れてみました
modify ってあったから使ってみたんだけどこれが間違ってる可能性もあり

で、更に recv するんじゃなくて socket を thread に渡したりすると
きっと凄い格好の良いことになるに違いありません
Twisted が何してるか少し分かったかも
Twisted の reactor は default だと selectreactor ってのが呼ばれてるけど
他にも色々、例えば epollreactor とかもあるみたいなので
それぞれ reactor 毎に色々してるに違いない、違いないんだけど.....

2009/07/18

"OpenSSL.SSL.WantReadError"

暫く Twisted でねばってたんですが
SSL 周りを低いところから攻めてみようと思いまして
でもちょっとは楽したいなと思いながら
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet.ssl import CertificateOptions

class MyProtocol(Protocol):
def connectionMade(self):
self.transport.socket.do_handshake()
reactor.stop()

class MyProtocolFactory(ClientFactory):
protocol = MyProtocol

if __name__ == '__main__':
f = MyProtocolFactory()
ctx = CertificateOptions()
reactor.connectSSL('www.blogger.com', 443, f, ctx)
reactor.run()
繋がったら切るってどういうことだよ!
っていうのを先ず書いてみたら
  File "test.py", line 7, in connectionMade
self.transport.socket.do_handshake()
OpenSSL.SSL.WantReadError:
例外ってしまいました

OpenSSL ってのは pyOpenSSL のことでしたが
まぁとりあえずググってみるかっつーダメな考えで
TLS connection with timeouts (and a few other difficulties) - Stack Overflow
とても丁寧な回答が投稿されてました

Twisted なのでそもそも reactor.connectSSL の socket は
timeout=30 ってのがデフォルト設定されていて
socket は non-blocking になっているので
handshake しに client hello して返事読もうとするんだけど
せっかちだからまだ返事来てなくってエラーになってるんで
落ち着いてちょっと待てってことでした
17.2.1 socket オブジェクト でも良く読めと

なので、待つことにしたら何も無しに終わるようになりました
@@ -1,10 +1,18 @@
+from time import sleep
+
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, ClientFactory
from twisted.internet.ssl import CertificateOptions
+from OpenSSL.SSL import WantReadError

class MyProtocol(Protocol):
def connectionMade(self):
- self.transport.socket.do_handshake()
+ while True:
+ try:
+ self.transport.socket.do_handshake()
+ break
+ except WantReadError:
+ sleep(0.1)
reactor.stop()

class MyProtocolFactory(ClientFactory):
なんか、ちょっと可哀そうだから sleep 入れてみた
入れないと 2000 回以上 WantReadError してました
コンピューターは速いなぁ

あ、ほんとは、
Protocol とかでなくて twisted.protocols.basic.LineReceiver とかで
line を送ったり受けとったりし始めたらいいんです
handshake なんて裏でちょちょいとやってくれます
でもほら、
Protocol と ClientFactory だけで色々試してみたいじゃないですか

2009/07/14

debian semaphore

Python で非同期だか分散だかなんかそんな辺りをうろちょろしてまして
processing とか multiprocessing とかを見てみようかなと思いました

Python 3.0 Hacks:第5回 multiprocessingモジュールによるプロセス間通信
や、まぁ、Python 2.5 とか 2.6 なんだけど試してみようとしましたら
  File "/usr/local/lib/python2.6/multiprocessing/synchronize.py", line 49, in __init__
sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 13] Permission denied
$
などと言われて普通のユーザーだと怒られます
root だと動くんだけど

エラーの文字列とかで検索してたんだけどどうもパッとしたもんが出なくって
そもそも SemLock って何だろうって思ったんだけど
そういえば semaphore ってあったな
debian で root なら OK って /dev 以下のことが permission のこと多いし
って思いながら検索してみて目についたのが
sourCEntral - fedora 7 - fedora かよっ

「POSIX セマフォの概要」を眺めはじめたわけですが

ファイルシステム経由での名前付きセマフォへのアクセス


Linux では、名前付きセマフォは仮想ファイ ル シ ス テ ム (virtual file system) 内に sem.name という形の名前で作成される。仮想ファイルシステム は通常 /dev/shm 以下にマウントされる。

おぉ、知らなかったよそんなこと
mount してないし!!

ということで mount してみたらちゃんと動きました
何で mount してなかったかって /etc/fstab で noauto になってました
ん〜、何か良く分からないから要らないと思って noauto したのかな〜と思い
"/dev/shm" fstab lenny で検索してみたら
etch/Software/Init - Debian GNU/Linux スレッドテンプレ
/dev/shm を自動で mount しない方法を紹介している...
ん〜、etch だけど、これ見てたのかなぁ......

Google 先生のおかげで解決できました、ありがとうございました...

2009/07/13

lighttpd ssl

nginx で上手くいかないので lighttpd に逃げることにしました
nginx のことは後で考えます

(2009/07/26 削除)

ググったらやっぱり色々出てきます
Webサーバ「lighttpd」でSSLを使うには - @IT
も出るし、
Lighttpd - Docs:SSL - lighty labs
も出るし。

compile は configure に --with-openssl って付けてあげれば OK
openssl の dev っぽい package があれば OK

ssl.pemfile には base64 してある証明書と秘密鍵を繋げたものを入れときます
$ cat ssl.crt ssl.key > ssl.pem
とかして ssl.pem を指定してやれば OK、絶対パスとかで
crt と key の順番はどっちでもいいらしい

ssl.ca-file には中間証明書を指定してやります
こっちも同様で複数枚にも対応してるけど
apache や nginx と違ってサーバ証明書から階層が構築できるかどうかチェックするみたい
ただ垂れ流すだけでなく、ひと手間かけてるみたいでした

redirect したいときには 設定ファイルの頭の方で mod_redirect とか呼んどけば OK
source の中に doc/lighttpd.conf って雛形があるんでそれを使いましょう

で、多分こんなんで nginx ssl と同じなはず
$SERVER["socket"] == "192.168.0.1:80" {
url.redirect = ( "^/(.*)" => "https://sample1/" )

accesslog.filename = "/www/sample1/logs/http_access.log"
}

$SERVER["socket"] == "192.168.0.1:443" {
ssl.engine = "enable"
ssl.pemfile = "/www/sample1/etc/sample1.pem"
ssl.ca-file = "/www/sample1/etc/sample1.ca-bundle"
ssl.cipher-list = "ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5"
server.document-root = "/www/sample1/httpsdocs"

accesslog.filename = "/www/sample1/logs/https_access.log"
}

$SERVER["socket"] == "192.168.0.2:443" {
ssl.engine = "enable"
ssl.pemfile = "/www/sample2/etc/sample2.pem"
ssl.ca-file = "/www/sample2/etc/sample2.ca-bundle"
ssl.cipher-list = "ALL:!EXP:!ADH:!LOW:!SSLv2:!MD5"
server.document-root = "/www/sample2/httpsdocs"

accesslog.filename = "/www/sample2/logs/https_access.log"

url.redirect = ( "^/(.*)" => "https://sample3/$1" )
}

$SERVER["socket"] == "192.168.0.2:80" {
accesslog.filename = "/www/sample2/logs/http_access.log"

url.redirect = ( "^/(.*)" => "https://sample2/$1" )
}
でもなー、nginx で上手くいかないんだよなー
なんでかなー

debug internet-explorer header

nginx ssl で redirect 設定しましたが
どうやら IE だと「Internet Explorer ではこのページは表示できません」と出てしまい
上手く表示されないことが判明しました。つうか「テストちゃんとしなさい」という話ですが。
これは困りました

で、解決すべく、とりあえず IE が何を思ってるのかを知りたいなと
Firebug みたいなのがあったよなと思って検索してみました
DebugBarで快適IEデバッグ « PHPで翻訳三昧
そうそう、DebugBar

入れてみたら HTTP(S) でのやり取りは見れたんですが
ん〜、盾のマークが出てきている気がする
My DebugBar | Doc / HTTPTab によると
"Unauthorized request returned by server (401)" ということらしい
ん〜、何じゃこりゃ
error_log を見ると
2009/07/13 15:23:28 [alert] 1987#0: worker process 1990 exited on signal 11
って出てて何か根本的に間違っている様子

ん〜、困った

dpkg pin 調べる

How to install Iceweasel 3.5 on Lenny
なんてのを知ってしまったんですよね
で、testing を使ってるんですよ
まぁ、いいかな、試してみるかな、と思って試してみました

そしたら、Window Manager が動かなくなっちゃったんですね
awesome っての使ってたんですけど
確か ~nabeken/diary/ : 今日からはじめる awesome チュートリアル を参考に
自分で package を build してたんですよね
でも何か、apt の結果に出てきてて入れちゃったりして

で、Iceweasel 入れたからといって安定してるわけでもなさそうで
Google Analytics 見たら見事に落ちてしまったので
全部元に戻してやろうと思いました
とりあえず testing 全部無しにできればいいだろうと思って検索
AptGet - Debian GNU/Linux スレッドテンプレ っすか
testing/unstable から stable にダウングレードしたい
apt-show-versions って command が紹介されてたのでインストール
$ apt-show-versions | grep unstable
これで testing から貰ってるリストが出ます

例えば awesome を stable に戻したかったら
$ apt-get -ud install awesome/stable
ってすると stable な awesome を入れようとします
で、何か依存関係が壊れちゃう場合とか
失敗したりもの凄い数の package を remove しようとしたりするので
必要そうなものを一辺に stable から入れようとしたりすると上手くいくはず

これを何度か繰りかえして無事に元の状態に戻せました
Debian ったら Awesome!!
自分で build した package を入れるときは努々気をつけましょう...