2012年4月19日木曜日

VMWare Fusion3 のネットワーク

VMWare Fusion はなんでだかしらないけど、Windows上のVMWare Workstation にあるネットワーク周りの設定ができない。Workstationでは、たとえば、NATのインターフェイスを追加して、別のネットワークを、なんてことも簡単にできるのだが、VMWare Fusionではできない。

DHCPのないNATネットワークが欲しくて、どうにかできないかと思って検索したら こんなページを見つけた。直接設定ファイルをいじってインターフェイスを追加する。さらに、VMXファイルを直接編集してネットワークインターフェイスを切り替えるという面倒くささ。

DHCP のないNATの追加

作業は、/Library/Application Support/VMware Fusion/で行う。

まずVMWareのサービスを止める。

> sudo ./boot.sh --stop

vmnet7 ディレクトリの作成

デフォルトでは vmnet1, vmnet8 というディレクトリがある。それぞれホストオンリーとNATに対応している。 新たにNATを作る場合にはvmnet8をテンプレートにすればいい。まず、vmnet8ディレクトリをコピー。
> sudo cp -r vmnet8 vmnet7
で、vmnet7/nat.confを編集。ネットワークアドレスは重ならないように、device名も適当に。
[host]
ip = 192.168.2.2
netmask = 255.255.255.0
device = /dev/vmnet7
vmnet7/nat.mac もいじる。ユニークであればいいので、下の方を適当に変えればいいはず。

networking ファイルの修正

answer VNET_7_DHCP no 
answer VNET_7_HOSTONLY_NETMASK 255.255.255.0
answer VNET_7_HOSTONLY_SUBNET 192.168.2.0
answer VNET_7_NAT yes
answer VNET_7_VIRTUAL_ADAPTER yes
こんなふうに追記。DHCP no としているのでDHCP がたたない。subnetのネットワークは、nat.confと整合するように注意。 VMWareのサービスを再起動して終了
> sudo ./boot.sh --start

VM側の設定

これもGUIからはできない。テキストエディタでVMXファイルを編集。デフォルトのNAT(vmnet8)だったものをvmnet7にするには、
ethernet0.connectionType = "nat"
となっているのを、下のように書きなおす。
ethernet0.connectionType = "custom"
ethernet0.vnet = "vmnet7"

結果

このとおりにやってみて、vmnet7というDHCPのないネットワークを作り、VMから参照させるところまではうまくいったのだが、どうもNATがうまく機能してくれない。ホストオンリーになってしまっている。まあ、いいか。。 と思ったら動いているようだ。。。いつのまに。

2011年12月29日木曜日

python の時間関連ライブラリ

Javaの時間関連ライブラリもたいがい使いにくいが、Pythonのも使いにくい。 多分問題なのは、時刻表現のコアになるタプル形式にタイムゾーンの情報が無いことだろう。 タプル形式を経由するとタイムゾーン情報が欠落するのでローカルタイムで扱っていたのか、GMTなのかわからなくなる。 ちなみにタプル形式にはDay light saving time(サマータイム)かどうかのフラグはある。なんなんだ。

今回はまったのはGMTのdatetime型からepoch秒数を求める場所。タプルにするとタイムゾーンが落ち、

time.mktime(tuple)
とすると、ローカルタイムで解釈されるので、9時間ずれる。。。

色々ググって

calendar.timegm(tuple)
とするといいということがわかった。これはGMTで解釈してくれるので大丈夫、とのこと。

しかし、なんだかなあ。。Javaのように、epochからのミリ秒表現をコアにするほうが合理的だと おもうのだが。

Google Storage public linkの更新遅延

Google storageは、プライベートリンクとパブリックリンクが作れるんだけど、 ドキュメントを更新してもパブリックリンクの中身がなかなか更新されない。。 プライベートのほうはすぐに更新されるのに。 中身を消してもパブリックリンクからはしばらくアクセスできる。正確にはわからないが、おそらく1時間程度は アクセスできてしまうもよう。
こちらの記事には、CacheのExpireの問題ではないかということだが、ブラウザのキャッシュの問題ではないことは 確認できている。想像するに、パブリックリンクのほうはプロキシかなんかになっていて、このプロキシのなかで キャッシュされているのではないか。その場合、デフォルトで1時間キャッシュされることになる。
間違えてパブリックにしてしまった場合、一度でもアクセスするとキャッシュされてしまうので、すぐにパブリックを消しても、1時間は公開状態が続いてしまうので、結構要注意。

Google SitesでJavaScript

Google Sites のページはHTMLで編集できるのだけど、危険なタグは全部削り落とされてしまうので、javascriptが使えない。

検索してみたところ、 こちらのページ が引っかかった。要するにガジェットとしてどこかにおいておいて、そのガジェットへの参照をGoogle Sitesに置く、ということ。 ガジェットにするには、HTMLフラグメントの前と後ろにおまじないを書いてXMLにするだけ。 ちょっとめんどうだけど、よく考えると、こちらのほうがワークフロー的に自動化しやすい。

たしかにJavaScriptは動くのだけど、なんか初期値がおかしい。具体的にはdisplay noneに指定しているエレメントが表示されている。よくわからないので放置。

追記:上記の不具合は単なるミスで問題なく動作することがわかった。めでたしめでたし。

2011年12月16日金曜日

mac os Xにstatic route を登録

に書いてあった。 一時的に変更するには
sudo route add 192.168.1.0/24 -interface vmnet8
とかやればいい。 恒久的に変更するには、
  • ディレクトリ/Library/StartupItems/AddRoute を堀る。
    sudo mkdir /Library/StartupItems/AddRoute
    
    ここに二つファイルをつくる。
  • StartupParameters.plist を作る。
    {
     Description = \"Add static routing tables\";
     Provides = (\"AddRoutes\");
     Requires = (\"Network\");
     OrderPreference = \"None\";
    }
    
  • AddRoutes を作る。
    #!/bin/sh
    . /etc/rc.common
    
    StartService ()
    {
            ConsoleMessage "Adding Static Routing Tables"
    sudo route add 192.168.1.0/24 -interface vmnet8
    
    }
    
    StopService ()
    {
            return 0
    }
    
    RestartService ()
    {
            return 0
    }
    
    RunService "$1"
    
    これに実行権限を与えておく。
    sudo chmod +x /Library/StartupItems/AddRoute/AddRoutes
    
なんというか面倒くさいことだなあ。なんでVMwareが自動的にやってくれないんだろう。

2011年12月12日月曜日

python からgmail でメイル送信

面倒かな、と思って検索したらこちらに全部書いてあった。ありがたや、ありがたや。
# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
import getpass

def create_message(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

def send_via_gmail(from_addr, to_addr, msg, passwd):
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(from_addr, passwd)
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

if __name__ == '__main__':
    from_addr = 'hoge@gmail.com'
    to_addr = 'target@example.com'
    passwd=getpass.getpass("password for %s:" % (from_addr))
    msg = create_message(from_addr, to_addr, u'テスト', u'本文', 'ISO-2022-JP')
    send_via_gmail(from_addr, to_addr, msg, passwd)

2011年11月22日火曜日

cassandora 1.0 で YCSB

  • ベンチマークツール YCSBは 公式には多分まだ1.0をサポートしていない。db/cassandora-1.0というディレクトリはない。 けど試したところ、どうも0.8用の設定で動く模様。
  • YCSBを動作させるにはテーブルスキーマを設定しなければならない。0.6ではstorage.xmlというファイルで静的に設定することができたが、これは0.7以降はできなくなっている。xml対yamlという話ではなく、0.7からは動的にスキーマが変更できるようになったため静的に設定できるべきではなくなった、ということらしい(出典)。
  • したがって、動的にスキーマを入れなければならないが、これにはcassandra-cliを使う。基本的にはインタラクティブに使うツールのようだが、ファイルを指定すればバッチで実行される。
    create keyspace usertable
        with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'
        and strategy_options = {replication_factor:1};
    use usertable;
    create column family data;
    
    このようなファイルをsetup.cas として用意しておいて
    > cassandra-cli -h localhost -p 9160 -f setup.cas
    
    とすればよい。