きつねたぬきだし

ちょっとしたメモ代わりに。

【メモ】Python の除算・剰余算

あまりにも基本的なことだけれど、うっかりしちゃいそうなのでメモ。

>>> 5 // 2
2
>>> 5 / 2
2
>>> 5 % 2
1
>>> divmod(5, 2)
(2, 1)
>>>
>>> from __future__ import division
>>> 5 // 2
2
>>> 5 / 2
2.5
>>> 5 % 2
1
>>> divmod(5, 2)
(2, 1)
>>>

未来が待ち遠しいですね。

ページングの処理など、 結果と余りを使う機会は多いですね。 そんな時は divmod 。

(filled_pages, remain_rows) = divmod(row_count, rows_per_page)

単に総ページ数が知りたいだけだったら、 ceiling すれば良いでしょうけど。

VirtualBox でクローンの MAC Address を変えたい。

いっぱい山ほど環境を作っていろんな技術を試したい時、 やっぱり仮想化環境を使うと思います。

VirtualBox は気軽に使えて便利です。

一個インストールしたら、あとはクローンを作ると楽です。

実は充実した CLi もあって良いです。

MAC Address がぶつかる

作ったクローンを同じネットワークに接続して動かそうとした時、 MAC Address が衝突してしまい、片方は接続できないという問題が生じました。

VirtualBox には MAC Address を変更するチェックボックスが用意されているのですが、 ゲスト OS 側のファイルに変更前の MAC Address が書かれているので、 ゲスト OS の内と外が不整合になってしまいます。

設定

最初はいちいち MAC Address を合うように書き換えていました。 そのうち面倒になったので、 MAC Address を参照しなくて済むように変更しました。

「オフラインでも使いたい」ので、 Host-only + NAT にします。ブリッジ接続は任意にします。

  • eth0 Host-only Adapter (PCnet-Fast III)
  • eth1 NAT (Intel PRO/1000 MT Server)

後に modprobe でドライバを読み込む順序を固定化するため、 わざわざ違うアダプタにしています。 冗長なやり方のような気がします。

netinstall だとインストール時に NAT の方から取得するので、 上の構成だと最初に ifconfig したときは eth1 だけ見える感じです。 とりあえず eth0 をブート時から有効にします。

vi /etc/sysconfig/network-scripts/ifcfg-eth0

の ONBOOT を yes にします。

一応、ドライバを確認します。

$ ethtool -i eth0 | head -n 1 | cut -d' ' -f2
pcnet32
$ ethtool -i eth1 | head -n 1 | cut -d' ' -f2
e1000

確認時には ethtool -i インターフェース名 を使いました。

あとは modprobe にお任せします。

$ echo 'modprobe pcnet32' >> /etc/networks
$ echo 'modprobe e1000' >> /etc/networks

でOK。

ここまでが 「 MAC Address に依らないため」の設定です。 以下からは「 MAC Address の参照を取り除く」設定です。

/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/udev/rules.d/70-persistent-net.rules

内には MAC Address を含む行があります。 行ごとコメントアウトします。 あるいは消します。

/etc/udev/write_net_rules

write_net_rules が 70-persistent-net.rules の内容を生成しています。 write_net_rules の冒頭で exit 0 するように書き換えます。

以上で、 MAC Address を何度リセットしても、 起動時に意図どおりのネットワーク設定になります。

再起動するか、

$ udevadm control --reload-rules
$ /etc/init.d/network restart

が必要です。 どうせクローンを取るので shutdown -h now しました。

他に

SSH でつなぐ時、 仮想マシン名から IP アドレスがわかると楽です。

  • vboxnet0 をスキャンして、アクティブな IP Address のリスト
  • MAC Address → IP Address
  • VirtualBox仮想マシン名 → MAC Address。

の 3 つを組み合わせるシェルスクリプトを書いて、 仮想マシン名 → IP Address を実現しています。

明らかに効率が悪いですが、とりあえず自動化してるので平気です。 VBoxManage の help を見ても、 仮想マシン名 → IP Address の効率のよい取得方法は書いてありません。

ご存知でしたら、どなたかご助言ください。

とりあえず

いくらでも環境を切り分けられるからどんどん実験できる。 幸せ。

Wiki とか Markdown の表

引数を Markdown っぽい表にする。

$ perl -le '$_=join("|","",(map{" $_ "}@ARGV),"");print;s/[^|]/-/g;print' foo bar buzz

TSV から Markdown or Wiki Syntax っぽいものにする。

$ perl -ple 's/\t/ | /g;$_="| $_ |"'

適当に alias しておけば、シェルからぽんぽんっと使えます。 あまり alias が多いのは好きじゃないけど、これくらいならあってもいいはず。

例は table.header と table.body に alias しておくとして。

$ table.header ID Name Point

とか。

$ mysql (中略) -BN | cut -f1,3 | table.body

とか。

組み合わせるときも cat 使うとなんか shell の人っぽい。

$ cat <(table.header ID Name Point) <(mysql (中略) -BN | cut -f1,3 | table.body)

ちなみに Mac OS X な人はコピペするときは pbcopy/pbpaste を使うと良いです。

mkfifo と tee で複数の入力・出力のパイプ

はじめに

UNIX では、ほとんどありとあらゆるものをファイルとして扱うことができる。

tee コマンドについて書いてある他ブログ記事を読むと、 「ファイルに書きつつ標準出力に出す」というような 画面上でのログ確認での使い方のみ書いている記事が多い。 もっと広義の「ファイル」には「FIFO」も含む。 FIFO とは名前付きのパイプであり、ファイルとほぼ同じインターフェイスを利用する。

内容

mkfifo と組み合わせて、 2 つの出力を持つパイプを作ってみる。

$ mkfifo input1
$ mkfifo output1
$ mkfifo output2
$ tail -f input1 | tee output1 output2 2>&1 > /dev/null &

このようにすると、 別シェルで立ち上げた

$ echo `date` > input1

が、 output1, output2 の各々の、各々のオープンしているプロセスにパイプする。 このようにして複数の管に分岐する水道管工事ができる。

また、 mkfifo で作ったファイルは、名前にリダイレクトすることで、 複数のプロセスからの書き込みもできる。 複数の管から統合する水道管工事もできる。

メリット

  • 実際のファイルと違い容量を気にする必要がない。
  • /dev/null に捨てる時のように、追記の ">>" ではなく、 ">" 一個で済む。
  • 書き込みをオープンしているプロセスがない場合には適切にブロックされる。

その他

ブロッキング・ノンブロッキング などのより詳しい説明は man 4 fifo

同じ意図をより手軽に行うため、 tpipe がある http://linux.die.net/man/1/tpipe

現実にはこんな水道管工事が必要になったことはない。

シェルは文法がアレだけど、 「たった 4 行で完全なマルチプロセス・非同期なストリームを実現する」 と考えると、先人は偉大だと思う。

例えば同じことを Node.JS でやったら非常に深いコールバックだらけになる。