Aug 28, 2006

VMware Server 1.0.1で遊んでみる

先週はいろいろあってVMware Serverばかりいじっていた。

(簡単に説明しておくと…)VMware ServerはVMware GSX Serverの後継で、サーバー向け仮想化ソフトウェアの一つ。もう少し噛み砕いて言うと、通常の仮想化ソフトウェアに、それをホストOSから操作するためのAPIと、そのAPIを使って実現された(と思しき)リモートコントロール用サービスを追加したような製品だ。先月上旬に正式にVMware Server 1.0.0の無償での提供が開始され、今月中旬に最初のアップデート版である1.0.1がリリースされたところ。VMware第五世代のVM間でのmobilityが保証されているので、VMware Workstation 5.xやPlayer 1.x、ESX Server 3.xとの間でほとんど変更なしにVMイメージを交換できる。

いやなんていうか、こんな便利なものが無償で公開されていていいのか、というくらい便利だ。

私は手持ちのノートPC上のWorkstation 5.5.2を開発環境として利用するか、適当なリモートマシンに開発環境を作ってVNCサーバを立ち上げておいてノートPCのVNCクライアントから接続して利用するか(sshで済ますことも多いが)してきた。前者だと2つ3つとVMを同時に立ち上げるのはリソース的に苦しい。後者だとリモートマシンの個数に制約される。もちろん、リモートマシン上でWorkstationやPlayerを動かす方法もあるにはあるが、ホストノードにVNCなりsshなりでログインして実行制御した上でゲストノードにログインして…というのは面倒過ぎて手を出すのが躊躇われた。

VMware Serverを使うと、手元のWindowsマシンにインストールしたVMware Server Consoleから、リモートマシン上のVMの制御がtransparentにできてしまう。つまりは、Workstation/PlayerではConsoleとVMが同じ手元のPCで動作するけれども、ServerではVMだけをリモートマシンにサービスさせて手元のWindowsマシンはThin Clientとして動作させられるということだ。サービスするリモートマシンを増やせばVMの数についてはスケールする。また、もちろんServer Consoleを動作させているマシン自体にVMをサービスさせることもできて、その場合はVMware Workstationと大差ない使用感となる。


さて、個人的に興味を持ってやっていたのは、多数のホスト上に複数のVMを立ち上げた環境下で、任意のVMをVLANでgroupingするという遊び。ESX ServerだとVMwareが実現するVirtual Switch自体が802.1Q taggingに対応しているので何も考える必要はないのだが、ServerやWorkstation/PlayerにおけるVirtual Switchは"dumb hub"に過ぎない。だから、vconfigコマンドを使って作ったVLAN interfaceをVirtual Switchにブリッジ接続してやる必要がある。ちょっと面倒くさいけれども、Xenでも同じようなVirtual Switch abstractionを実現しているのでやることは一緒なわけ。

例えば、こんな感じ。まず、ホストノードでVLAN interfaceを作ってupしておく。

/sbin/vconfig add eth0 100
/sbin/vconfig add eth0 101
/sbin/vconfig add eth0 102
...
/sbin/ifconfig eth0.100 0.0.0.0 up
/sbin/ifconfig eth0.101 0.0.0.0 up
/sbin/ifconfig eth0.102 0.0.0.0 up
...

次にVLAN interfaceがブリッジ接続するVMnet (Virtual Switch)を作る。

/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge1.pid /dev/vmnet1 eth0.100
/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge2.pid /dev/vmnet2 eth0.101
/usr/bin/vmnet-bridge -d /var/run/vmnet-bridge3.pid /dev/vmnet3 eth0.102
...

次にホストが接続するスイッチの設定をする。802.1Q対応のスイッチならたいてい同じことができるが、ここではDell PowerConnectの設定例を示す。

vlan database
 vlan 1 name DefaultVlan media ethernet state active
 vlan 100 name vmnet1 media ethernet state active
 vlan 101 name vmnet2 media ethernet state active
 vlan 102 name vmnet3 media ethernet state active
(snipped)
!
interface ethernet 1/1
 switchport allowed vlan add 1 untagged
 switchport native vlan 1
 switchport allowed vlan add 100-109 tagged
!
interface ethernet 1/2
 switchport allowed vlan add 1 untagged
 switchport native vlan 1
 switchport allowed vlan add 100-109 tagged
!
(snipped)

こうすると同じタグに対応付けられたVMnetを使用するVM間でしか通信できなくなる。あとは好きなように各VMの使用するVMnetを切り替えればよい。tagged frameは4バイト大きくなるのでその分MTUを調整したりする必要があると思うけれどそのあたりの説明は省略。

ついでに書いておくと、VMnetの切り替えは外部から行うことができる。VMが起動していない状態ならば、vmxファイルを以下のように書き換えれば、次回以降の起動ではその内容が反映される。

ethernet0.connectionType = "custom"
ethernet0.vnet = "vmnetX"

VMが動作している状態ならば(VMwareToolsがインストールされていてvmware-guestdが動作しているという条件付きだが)、より簡単にホストマシン上から切り替えることができる。私が気が付いている方法は2つ。

1つはsetconfigでパラメータを変更後、suspend & resumeする方法で、以下のコマンド列を実行すればよい。

$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.connectionType custom
$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.vnet vmnetN
$ /usr/bin/vmware-cmd /path/to/vm.vmx suspend
$ /usr/bin/vmware-cmd /path/to/vm.vmx start

suspendの代わりにstopでもよいが、shutdown & bootするのでとても時間がかかる。

もう1つは、やはりsetconfigで設定変更後、VMのEthernetデバイスをdetach & attachするという方法。これが一番速い。

$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.connectionType custom
$ /usr/bin/vmware-cmd /path/to/vm.vmx setconfig ethernet0.vnet vmnetN
$ /usr/bin/vmware-cmd /path/to/vm.vmx disconnectdevice Ethernet0
$ /usr/bin/vmware-cmd /path/to/vm.vmx connectdevice Ethernet0

また、vmware-cmdはネットワーク越しにVMwareServerを叩くこともできるので、ネットワーク上に分散するVM群のVMnetを「中央集中的に」切り替えることも当然できる。


他には、ホストにiSCSI initiatorを設定してVMのディスクイメージをやっすくでっち上げたiSCSIストレージサーバ上に置いて、general public向け"Boot from SAN"を実現するのとかどうよ、と思っている。大抵の場合、ブートシステム自体が高速なディスクアクセスを要求するわけではないので問題はないのではないか、と。高速・大容量なディスクが本当に必要ならSANを(どのみちVMであってもなくても必要なのだから)用意すればよいわけだから。

Aug 18, 2006

メッド・コミュニケーションズって。

今日職場のPHSにメッド・コミュニケーションズという会社のおばちゃんから電話があった。というか、「このPHSに外から架けられるのを今日はじめて知ったよ、ぉぃ」というくらいなのだが。

エアコンの掃除がどうこう、という他愛もない(悪徳の香り漂う)営業電話だったわけだが、驚いたのは電話の主が私が誰か知らずにかけてきているということだ。とても気になったので、おばちゃんのつまらない営業の内容はさておき、どういうシステムなのか訊いてみた。それによると、個人情報保護法対策として名簿屋から名簿を買うのではなく、機械的に電話番号を生成して順番に架けている、だから電話の相手が誰なのかは分からない、12,3年この手法でやっている、ということらしい。

面白いけどそんなのあり? 体力勝負?

...とか書いていたら隣席の同僚にもメッドから電話が...意味ねえよ。

ちょっと調べてみた。

ガチで行政処分も受けたことがある会社らしい(シスコムからメッドへ今年3月に社名変更)。

東京都公式ホームページ/訪問販売で高額な浄水器や掃除機を販売する事業者を行政処分

電話の営業手法はどうかと思うが、ネットも有効活用しているっぽい(Yahoo! BBも取り扱ってる)。社長ブログがあったり。

佐々木洋寧の日記■□■ステークホルダーからたくさんのありがとうを集めるメッドコミュニケーションズにしたい メッドコミュニケーションズ株式会社 社長ブログ

お客様の声を公開していたり。...どうしてもハガキの筆跡の互換性が結構高めに見えてしまうが...気のせいだ。

メッドコミュニケーションズ -お客様の声-毎月お客様からたくさんのハガキを頂戴しております。

もう何を売ってる会社なのか。

Yahoo!ショッピング - メッドオンラインショッピング

XML-Atom-GDataClient

Tatsuhiko Miyagawa / XML-Atom-0.22 - search.cpan.orgのXML::Atom::ClientをGoogle Data API対応にするモジュールを作ってみた。

ogawa - Revision 642: /trunk/XML-Atom-GDataClient

私はPerlモジュールの命名規則や標準的なコーディング規則を知らないので、問題があったらコメントください。

以下は簡単な使用例。

#!/usr/bin/perl
use strict;
use XML::Atom::GDataClient;
use XML::Atom::Entry;
use XML::Atom::Person;
 
my $api = XML::Atom::GDataClient->new;
$api->username('username@gmail.com');
$api->password('password');
$api->service('blogger'); # using Blogger service
 
my $entry = XML::Atom::Entry->new(Version => 1);
$entry->title('Hello');
$entry->content('Hello, World!');
my $author = XML::Atom::Person->new(Version => 1);
$author->name('Foo Bar');
$author->email('foo@gmail.com');
$entry->author($author);
 
my $postURI = 'http://beta.blogger.com/feeds/###################/posts/full';
my $editURI = $api->createEntry($postURI, $entry);

実はcreateEntryしか動作確認していません。現状でupdateEntryやdeleteEntryに失敗するのは、Blogger Data API側の問題のようなので、修正されたらもう少し突っ込んで調べてみるつもりです。

追記: このモジュールを使ってOgawa::Buzz: Blogger Data APIでちょっと触れた、comment用のpostURIに対してcreateEntryできるかどうかというのを確認してみました。

結果は"400 Bad Request"が返ってくるが、entryとしては保存されるというものでした。しかし、親entryのページのレンダリングに失敗するようになってしまいます。おそらくcommentにはcomment用の拡張schemaがあるのでしょう。ともかく、こうなってしまうと該当commentだけを削除する手段はないので、親entryごと削除するしかありません。

…実験はほどほどに。

Aug 16, 2006

Blogger Data API

Google Blogger(Blogger: Create your Blog Now -- FREE)が新しくなっていたっぽいので、作り直してみた。

smallCaps

レイアウトをDrag & Dropで変更できるようになったとか、アクセス制御やラベル(タグ)をサポートしたとか、フィード配信でいろいろできるようになったとか、あたりが見た目の変更点。少し使った限りでは、(1) 各ページにあるべきブログのトップページへのリンクがない超分かりにくい、(2) アップロードした画像ファイルを削除する方法がない(ような気がする、かなりそんな気がする)、(3) 日本語ラベルが正しく機能しない、(4) テンプレートを切り替えたときにレイアウトマネージャが不穏な動きをする、というあたりが気になった。

なのだが、やはり目玉は、Google Calendarと同様、Google data API (GData)に対応したBlogger Data APIだ。

Ogawa::Buzz: Google Calendar data API

やっぱこれだよね!

ざっくり見た限り、commentsを操作するAPIについて言及していないようだ。commentsにもpostsと同様にGData feedが定義されているので、同じように操作できるのかもしれない。

このあたりがクリアになりかつ時間があれば、Movable Typeのダンプ形式からBloggerにコンバートするツールを作ってみようかな。

簡単なテストコード。Ogawa::Buzz: Google Calendar data APIとの違いは、ClientLogin Requestのservice名を「blogger」するっていうだけ。

#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use Encode;
use constant GAUTH_URL => 'https://www.google.com/accounts/ClientLogin';
 
my $email = 'user@gmail.com';
my $passwd = 'passwd';
my $feed_url = 'http://beta.blogger.com/feeds/###################/posts/full';
 
my $entry = <<'ENTRY';
<entry xmlns='http://www.w3.org/2005/Atom'>
  <published>2006-06-09T10:27:00.000-07:00</published>
  <updated>2006-06-09T10:31:55.120-07:00</updated>
  <title type='text'>Marriage!</title>
  <content type='xhtml'>
    <div xmlns="http://www.w3.org/1999/xhtml">
      <p>Mr. Darcy has <em>proposed marriage</em> to me!</p>
      <p>He is the last man on earth I would ever desire to marry.</p>
      <p>Whatever shall I do?</p>
    </div>
  </content>
  <author>
    <name>Elizabeth Bennet</name>
    <email>liz@gmail.com</email>
  </author>
</entry>
ENTRY
Encode::_utf8_off($entry);
 
my $ua = LWP::UserAgent->new();
my $auth = $ua->post(GAUTH_URL, {
    Email => $email,
    Passwd => $passwd,
    source => 'companyName-applicationName-versionID',
    service => 'blogger'
});
my($auth_token) = $auth->content =~ m/Auth=(.+)/;
 
my $req = HTTP::Request->new(POST => $feed_url);
$req->header('Authorization', 'GoogleLogin auth=' . $auth_token);
$req->content_type('application/atom+xml');
$req->content_length(length $entry);
$req->content($entry);
my $res = $ua->request($req);
print $res->status_line . "\n";
 
if ($res->is_redirect && $res->header('Location')) {
    $req->uri($res->header('Location'));
    print $ua->request($req)->status_line . "\n";
}

Aug 15, 2006

最近の中日戦の楽しみ方

早々にマジック40が点灯してしまい、理不尽なドラゴンズバッシングが目に余る今日この頃、中日ファンの皆様はいかがお過ごしだろうか。見方によっては消化試合と言えなくもない残り49試合だが、90勝くらいして完膚なきまでに他球団を叩き潰すのを観るのもよし、記録などディテイルで楽しむのもよし。

私が特に注目しているのは、一つには落合監督の言動だ。

同一カードを3連勝しておきながら、うかうか「このカードは3連敗でも良かった」みたいなことを漏らして相手のダメージを最大化しかねない(「しかねない」と言っているのであってそういう発言を「した」わけではない、多分)。ベンチの中での姿は、銭湯の脱衣所のテレビで野球観戦しているオヤジのような風情を醸し出している。いつも誰よりもリラックスした言動を見せる監督を見るだけでどれほど多くの人々の心が癒されることか(笑)。

そんな落合監督が大好きな私だが、最近も面白い。

スポーツナビ | ニュース | ブラウン 怒りは敗戦よりも日本球界
スポーツナビ | ニュース | 落合監督激怒「バカにするな」
スポーツナビ | ニュース | ブラウン監督“批判発言”謝らん

阪神系のデイリースポーツが部数を伸ばすために泥仕合を仕込んでいるのが見え見えなのに、落合監督はわざわざ口プロレスに参入して部数維持をアシストしてくれている。やはりバットで超一流の人は釣竿を持たせても超一流だ。今後の推移を生暖かく見守りたい。

もう一つ注目しているのは先発投手陣。

中日には6人先発投手が揃っているので、どの先発投手も高々週に一回登板すればよい。一番登板数の多い川上でも現時点で19試合しか登板しておらず、広島・黒田よりも3試合も少ない。この事実は投手の防御率レースに、他球団にはない競争要素を加えてくれる。なぜなら防御率レースに残るためには、全146試合で少なくとも規定投球回数の146回は投げる必要があるからだ。

すでに151回投げている川上(今すぐ怪我をして残り試合に登板しなくても防御率リーダーを獲れるかもしれない)は除外するものとして、残り49試合で各先発投手には平均8試合の登板チャンスがあると考えられる。すると、5投手の一試合あたりの必要投球回数は下の表のようになる。

投球回数残り必要回数一試合あたりの必要回数
山本昌110 2/335 1/34 1/3 *
佐藤充100 2/345 1/35 2/3
朝倉健太92 2/353 1/36 2/3
マルティネス92546 2/3 *
中田賢一559111 1/3 *

* 端数は切り捨て。

山本は当確、中田は論外(数字上は補回試合を投げ切り続ければ可能)だが、佐藤がボーダー、朝倉・マルがボーダーのちょい下あたり。朝倉は今日を含めて9試合チャンスがあるかもしれないのだがそれでも平均6回は必要だ(ありゃ今日はマルが先発―朝倉の登板がすっ飛ばされた)。1試合炎上すると1試合完投しないことには決して埋め合わせることができない、ひょっとしたら炎上しても投げ続けなければならない、そんなヒリヒリ感、イタタマレナサが私たち中日ファンを待ち受けている!

Aug 14, 2006

TagSupplementals Plugin 0.03公開

Movable Type 3.3以降でサポートされた「タグ」に便利機能を追加・拡張するTagSupplementals Plugin(Ogawa::Buzz: TagSupplementals Plugin公開)を約2か月ぶりにアップデートしました。

追加した機能は、以下の3つ。これでTagwireにはあった機能がほぼすべてポートできたはずです(性能の点はひとまずおいておくとして)。

  • encode_urlplusグローバルフィルタ。Tagwireにあったやつ。
  • 現在の「タグ」が最後に使われた時刻を表示するMTTagLastUpdated変数タグ。TagwireのMTTagDate相当。
  • MT-Searchで検索された「タグ」のリストを表示するMTSearchTagsコンテナタグ。TagwireにあったMTXSearchTagsのMT-Search版。

2番目のMTTagLastUpdated変数タグは、使用回数ではなく、使われた時刻が新しい「タグ」を強調表示するのに役に立つでしょう。今回、MTTagDateという名前にしなかったのは、「MTTagXX」という名前でSix Apartが機能追加する際に名前の衝突を起こしやすいからあまり自明なものを使うのも却って望ましくないだろう、という観測に基づいています。面倒ですが悪しからず。

3番目のMTSearchTagsコンテナタグは、単純ですが思いがけず便利に使えるかもしれない機能です。例えば、MTRelatedTagsコンテナタグと組み合わせて、「検索対象のタグ」に関連したタグをリストしたりすることができます。「検索結果」テンプレートに以下を追加するだけで実現できます。

<MTIfTagSearch>
<ul class="search-tags-list">
 <MTSearchTags>
 <li><a href="<$MTTagSearchLink$>" rel="tag"><$MTTagName$></a>
   <ul class="related-tags-list">
     <MTRelatedTags>
     <li><a href="<$MTTagSearchLink$>" rel="tag"><$MTTagName$></a></li>
     </MTRelatedTags>
   </ul>
 </li>
 </MTSearchTags>
</ul>
</MTIfTagSearch>

他にもこんな機能があったらなという希望があったらコメント・トラックバックでお知らせください。簡単に実現できる機能から順に気まぐれに更新していきます。

TagSupplementals - ogawa - 「タグ」機能を追加・拡張するプラグイン。 - Google Code

Aug 7, 2006

Widget for Google AJAX Search API

Google AJAX Search APIってのがあったんだな。まったくスルーしていた。あまり使われていないのかしら。

Movable Type 3.3のWidget Managerから簡単にプラグインする方法を少し考えてみた。私は3.3に移行していないし、Widget Managerを使う予定もないので(MTIncludeがあるから不必要ではないか、と)、例によって「試してない・やればできるにきまってる」メソッドである。

まず、Google AJAX Search API - Sign UpでサインアップしてAPI Keyを取得する。取得したAPI Keyはちらしの裏にでもメモしておくこと。

次にMovable Type 3.3のテンプレート・モジュールを作る。テンプレート名は「Widget: Google AJAX Search」とし、以下のコードを保存する。冒頭のYour API KeyのところにはさっきのAPI Keyを転記しておくこと。

<MTSetVar name="GoogleAJAXSearchAPIKey" value="Your API Key">
<div class="module-archives module">
  <h2 class="module-header">Google AJAX Search</h2>
  <div class="module-content">
    <script src="http://www.google.com/uds/api?file=uds.js&amp;v=0.1&amp;key=<MTGetVar name="GoogleAJAXSearchAPIKey">" type="text/javascript"></script>
    <style type="text/css">
      @import "http://www.google.com/uds/css/gsearch.css";
      .gsc-control { width: auto; }
    </style>
    <script language="Javascript" type="text/javascript">
    //<![CDATA[
    var gsc_onload = function() {
      var searchControl = new GSearchControl();
      var siteSearch = new GwebSearch();
      siteSearch.setUserDefinedLabel("<$MTBlogHost encode_js="1"$>");
      siteSearch.setUserDefinedClassSuffix("siteSearch");
      siteSearch.setSiteRestriction("<$MTBlogHost encode_js="1"$>");
      searchControl.addSearcher(siteSearch);
      searchControl.addSearcher(new GwebSearch());
      searchControl.draw(document.getElementById("google-ajax-search"));
    };
    if (window.addEventListener) {
      window.addEventListener('load', gsc_onload, false);
    } else if (window.attachEvent) {
      window.attachEvent('onload', gsc_onload);
    }
    //]]>
    </script>
    <div id="google-ajax-search"></div>
  </div>
</div>

あとはWidget Managerの管理画面から適当なWidget Setに「Google AJAX Search」Widgetをdrag'n dropして保存した後、再構築すればよい。

動作風景。

見ての通り、サイト内検索結果とWeb検索結果が表示されるようにしてある。ローカル検索・ビデオ検索なども追加可能なので、カスタマイズしたい場合にはGoogle AJAX Search API Documentationを参照のこと。

Aug 3, 2006

「ゲド戦記」のあまりの前評判につき。

ジブリの「ゲド戦記」の前評判。

Yahoo!ムービー - ゲド戦記

残念ながら、逆にものすごく興味を持ってしまった(笑)

ジブリの「ゲド戦記」を100%愉しむためには、やはり何はなくともまずは原作を読まなくては(ニヤリ)とか思ってしまった。折りよく先月末から2日にかけて高知への出張があり、出張費を抑えるために鉄道(品川~岡山[のぞみ]、岡山~高知[特急南風])を使うことにしていたため、たっぷり時間はあった。何と言っても片道6時間、往復12時間だからね。

移動中、仕事をしがてら合間に読んでいたら、品川に着く頃には3巻まで読了。

各巻ともテーマが明確で物語も単純。語り方自体も滑らかなので、確かに原作に根強いファンがいることは理解できるわな。ファンタジー小説としては文句なく面白いし。ただ、近代精神を啓蒙主義的な立場から論じたり批判したりする文学・映画は大概飽きたというのが正直なところ。自分探しとか成長物語というテーマも、善悪・正邪・光影・聖俗の二元論やその均衡も(あるいは中和も、中和の後の涅槃も)、「陳腐な構図」と言ってしまえばそれまでだ。子供向けにはよいだろうけれど。

残りはぼちぼち読むこととして、あとは映画が愉しみなばかりだ。昔観た「ナウシカ」も(ファンには申し訳ないけれども)たいがいな映画だったが、それに勝るとも劣らない、じゃなくて余裕で無四球完封するクラスのクソ映画を期待している。大林宣彦みたいな映画監督もいて何やらその道の大家になっているのだから、宮崎吾朗の2作目、3作目にも期待が高まる。否応なく。

そうそう、ゲド戦記にインスパイアされた気配もある、あしべゆうほの「クリスタル☆ドラゴン」って、ボニータ(秋田書店)でまだ連載続いているのね。細川智栄子の「王家の紋章」もプリンセス(秋田書店)で続いてる。「秋田」は時間の流れ方がおかしいなあ。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com