Jan 28, 2007

AirMac Extremeベースステーション

iPhone騒ぎでスルーしていたけど、新しいAirMac Extremeベースステーションって地味だけど良い製品じゃないかよ。

今自宅ではBuffalo WER-AMG54と、5年くらい前に購入したプラネックスのUSBプリントサーバの組み合わせで、802.11a無線LAN+プリンタ共有環境を構成している。無線LANステーション自体は802.11b→802.11b/g→802.11a/b/gという具合にテクノロジーがアップデートされるたびに大体買い換えているのだけど、プリントサーバの方はそうでもない。確かにUSB 2.0対応のプリンタが増えてきたけど、1.0/1.1のプリントサーバで事足りないわけでもない(写真を印刷するわけでなし)。だからむやみやたらと長生きしてしまって困る。…いや困っちゃいないんだけど、正確には。

ともあれ、AirMac Extremeベースステーションだとそれが1つの小箱でできるわけだね。しかもNASとしても使えてしまう。これは一粒で3度おいしい。

あ、そうそう、AirMac Extremeって16.5cm×16.5cmでMac miniと同寸法なので、Mac mini用に発売されたUSBハードディスク箱、例えばPHD-MM250IUH Macmini用外付HDドライブ250GBとかと組み合わせられるんじゃないかな。しかも、USBハブ内蔵タイプならそのままプリンタも繋げられるし、言うことないじゃん。

Jan 26, 2007

Exif JSONサービス

デジタルカメラなどで撮影した画像ファイルに含まれるExifメタ情報を取得し、JSON形式で出力するサービスを作ってみました。

JSON形式で取得する

JSON形式でExif情報を取得する場合には以下の形式のURLをGETします。

http://as-is.net/exif/json?url=<Image-URL>

戻り値はJSON形式のExif情報です。

{"FocalLengthIn35mmFormat":28,"ThumbnailOffset":8096,"WhiteBalance (1)":"Auto",
"Model":"DMC-LX2","FlashpixVersion":"0100","ShutterSpeed":"1/100",
"ShootingMode":"Program","TravelDay":"n/a","ResolutionUnit":"inches",
"FocalLength35efl":"6.3mm (35mm equivalent: 28.0mm)",...}

JSONP形式で取得する

引数callbackにコールバック関数名を指定してGETすると、

http://as-is.net/exif/json?url=<Image-URL>&callback=<callback_func>

指定された名前の関数呼び出しを生成します。

callback_func({"FocalLengthIn35mmFormat":28,"ThumbnailOffset":8096,"WhiteBalance (1)":"Auto",
"Model":"DMC-LX2","FlashpixVersion":"0100","ShutterSpeed":"1/100",
"ShootingMode":"Program","TravelDay":"n/a","ResolutionUnit":"inches",
"FocalLength35efl":"6.3mm (35mm equivalent: 28.0mm)",...});

また、引数varに変数名を指定してGETすると、

http://as-is.net/exif/json?url=<Image-URL>&var=<var_name>

指定された「変数名.data」にJSONデータを格納し、「変数名.onload」関数の呼び出しを生成します。

if (typeof(var_name) == 'undefined') test = {};
var_name.data = {"FocalLengthIn35mmFormat":28,"ThumbnailOffset":8096,"WhiteBalance (1)":"Auto",
"Model":"DMC-LX2","FlashpixVersion":"0100","ShutterSpeed":"1/100",
"ShootingMode":"Program","TravelDay":"n/a","ResolutionUnit":"inches",
"FocalLength35efl":"6.3mm (35mm equivalent: 28.0mm)",...};
if (typeof(var_name.onload) == 'function') var_name.onload(var_name.data);

注意点

  • URLをキーにしてExif情報を1日間キャッシュします。
  • 対象画像ファイルの先頭約30KB分をPartial GETしてExif情報を抽出しています。なので、巨大なサムネイルデータをExifとして持つような画像ファイルには対応できません。なぜ「約30KB分」なのかと言うと「私が持っているDMC-LX2ではそれくらいの長さが必要だから」です。うまく取得できないデータがあったらご連絡ください。
  • アプリケーションはそのうち書きます。

Jan 24, 2007

本日の戦い: VMware Server 1.0.1と Kernel 2.6.19

今週、Fedora Core 6のUpdatesでkernel-2.6.19-1.2895.fc6がリリースされていたのだけれど、これとVMware Server 1.0.1の相性が最悪だ。今まで気軽にyum -y updateしていたけれど、怖くなってしまった。

まず、Linux 2.6.19でvmnetカーネルモジュールがコンパイルできない。このことは割と広く知られていて、Index of /bits/2.6.19-rc5にあるパッチやvmware-any-any-update106.tar.gz(VMTN Discussion Forums: VMWare Server Install Problem ...)を使えばよいということになっている。カーネルモジュールのコンパイル自体は恙無く行えるのだが、まったくまともに動作しない。

現象としては、起動してしばらくは正常に動作しているようなのだが、やがて外部からホスト、ゲストともネットワークが不通になる。ホスト上で/etc/init.d/network restartすると回復するのだが、またしばらくすると不通になる。

また、「rtc: lost some interrupts at 4096Hz.」というカーネルメッセージが出まくり、ゲストの時計が狂うという現象もある(ゲストをSMPで動かしたせいではない)。これに関しては、VMWare rtc: lost some interruptsに一応の解決方法は示されているのだが、性能を犠牲にすることになる。また、仮に解決したとしてもネットワークの問題が解決しなければ使い物にならない。

どうしようもないのでひとまず、

kernel-2.6.18-1.2869.fc6.x86_64.rpm
kernel-devel-2.6.18-1.2869.fc6.x86_64.rpm
kernel-headers-2.6.18-1.2869.fc6.x86_64.rpm
kernel-xen-2.6.18-1.2869.fc6.x86_64.rpm
kmod-nvidia-1.0.9631-1.2.6.18_1.2869.fc6.x86_64.rpm (*)
xorg-x11-drv-nvidia-1.0.9631-1.lvn6.x86_64.rpm (*)

をダウンロードしてきて(*を付けたものは私の環境に依存したモジュール)、びくびくしながら、

# rpm --force -Uvh *.rpm
# /sbin/chkconfig httpd.vmware off (MUIをインストールしている場合)
# /sbin/chkconfig vmware off
# reboot
 (...)
# vmware-config.pl

...何とか復帰できたもんね。ついでに/etc/yum.confにも速攻でこう書いておいた。

exclude=kernel* kmod-nvidia* xorg-x11-drv-nvidia

Jan 21, 2007

My Favorite Things

金曜日仕事で煮詰まり切っていると、

そうだ アメ横、行こう。

というフレーズとMy Favorite Thingsが頭の中で鳴り始めて……止まなくなったので、ついつい伊勢音で鰹節削りと本枯節を衝動買い。職人気質の店主との会話がそこはかとなくスリリングで楽しかった。

家に帰ってシャコシャコ鰹節を削っているとただそれだけで落ち着くし、白米にかけるだけで何杯でもいける(…人はそれを猫飯と呼ぶ)。

Jan 18, 2007

Litebox / Lightboxの使い方

yujiroさんとこのLiteboxやLightboxの記事で、配布されているJavaScriptファイルやCSSファイルを修正されていますが、それだとオリジナルのLitebox, Lightboxが更新されるたびに同じことをしなくてはならなくなります。

小粋空間: Litebox 1.0 の rel 属性を自動付与する

それは面倒だ、美しくないと思ってしまったので、このエントリーではもう少しスマートなやり方を書いておきます。何かの参考になる場合もあるでしょう。

まず、スタイルシートはそもそも上書きして使うものです。下のようなスタイルシートをlightbox.custom.cssとか適当な名前で生成しておき、lightbox.cssより後に読み込まれるようにしておけばオリジナルに対する変更は必要ありません(あるいはちょっと面倒くさくなりますが、スタイルシートに相当するDOM操作をJavaScriptで書くこともできますね)。

#prevLink, #nextLink{
	background: transparent url(/path/to/images/blank.gif) no-repeat;
}
#prevLink:hover, #prevLink:visited:hover {
	background: url(/path/to/images/prevlabel.gif) left 15% no-repeat;
}
#nextLink:hover, #nextLink:visited:hover {
	background: url(/path/to/images/nextlabel.gif) right 15% no-repeat;
}

また、同様にJavaScriptへの変更についても分離できます。なぜなら、変数はスコープ内であれば後からいくらでもオーバーライドすることができますし、rel="lightbox"属性をアンカー要素に追加するためのLightbox.prototype.initializeへの変更もinitLightbox関数が呼ばれる前に変換するようにすれば必要のないことだからです(厳密に言えばDOM treeを二度トラバースする分だけは非効率になります)。

具体的には以下のようなJavaScriptファイルをlitebox-1.0.custom.jsとか適当な名前で生成しておき、litebox-1.0.jsより後に読み込まれるようにしておけばよいわけです。

//
// オリジナルの変数をオーバーライド
//
fileLoadingImage = "/path/to/images/loading.gif";
fileBottomNavCloseImage = "/path/to/images/closelabel.gif";
//
// オリジナルのinitLightbox関数をオーバーライド
//
initLightbox = function() {
	addRelLightboxAttribute('content');
	myLightbox = new Lightbox();
};
// 
// rel="lightbox"属性をanchor要素に付加
//
addRelLightboxAttribute = function(id) {
	if (!document.getElementsByTagName) { return; }
	var ele;
	if (id) {
		ele = $(id);
		if (!ele) { return; }
	} else {
		ele = document.body;
	}
	var anchors = ele.getElementsByTagName('a');
	for (var i = 0; i < anchors.length; i++) {
		var anchor = anchors[i];
		if (anchor.getAttribute('href').match(/jpg$|gif$|png$/)) {
			var rel = String(anchor.getAttribute('rel'));
			if (!rel.toLowerCase().match('lightbox')) {
				anchor.setAttribute('rel', rel ? rel+' lightbox' : 'lightbox');
			}
		}
	}
};

上記スクリプト中のaddRelLightboxAttribute関数は、rel="lightbox"属性をアンカー要素に追加するもので、引数のidを持つ要素内のアンカー要素のみを変換の対象とします。引数を省略するとdocument.bodyを対象に変換を行います。また、元のコードにはrel="lightbox"以外のrel属性がアンカーに付与されている場合に正しく変換されない問題がありましたが、その対処もしてあります。

というわけで、利用するときには下のようにすればよいわけです。

<html>
<head>
...
<link rel="stylesheet" href="css/lightbox.css" type="text/css" media="screen" />
<link rel="stylesheet" href="css/lightbox.custom.css" type="text/css" media="screen" />
<link rel="stylesheet" href="css/style.css" type="text/css" media="screen" />
<script type="text/javascript" src="js/prototype.lite.js"></script>
<script type="text/javascript" src="js/moo.fx.js"></script>
<script type="text/javascript" src="js/litebox-1.0.js"></script>
<script type="text/javascript" src="js/litebox-1.0.custom.js"></script>
</head>
<body onload="initLightbox()">
<div id="content">
...
</div>
</body>
</html>

必ずこういう手法を採らなければならないというわけではありませんが、導入方法の説明が容易なんじゃないかなと思います。

NVIDIA GPU PC + FC6でCompizを使う

Linux初心者なので、思い出しメモ。

Ogawa::Buzz: AMD Athlon 64 X2 5000+でちと遊ぶ。

で書いていた、マザーボードがM2N-SLI Deluxe (nForce570 SLI)で、ビデオカードがNVIDIA GeForce 7600GSで、OSがFedora Core 6のマシンで、3Dデスクトップ環境Compiz遊びをするときの設定。わざわざ条件を多く列挙したけれど、マザーボードでは何でもいいし、ビデオカードがもう少しお高いGeForce 7600GTや7900, 7950GTでも話は同じだと思う。

Fedora Core 6で3D GUI環境Compizを使うには(NVIDIA編) - @ITには、livna-testingリポジトリからyum installしてもじゃもじゃ、/etc/X11/xorg.confを編集してもじゃもじゃ、と書いてあったのだが、今現在はlivnaリポジトリから1.0.9631のxorg-x11-drv-nvidiaとkmod-nvidiaがインストールできるので、以下のように一気呵成に実行。

# rpm -ivh http://rpm.livna.org/livna-release-6.rpm
# yum -y install xorg-x11-drv-nvidia
# yum -y install compiz (compizがまだインストールされていない場合)
# reboot

再起動してきたら自動的にNVIDIA GPUを認識しているはずなので、System > Preferences > Desktop Effectsを選択して、「Enable Desktop Effects」というボタンをクリックするだけ。超簡単。

Compizで何ができるかというと↓のビデオを参照。

Video - Compiz


あとLinux初心者なのでよく分からないのだけど、gnome-system-monitorっていうの?なんかちょっとすごい。ちょっとすごいっていうか、かなりすごい。何がすごいかって言うと、モニタリングデータを破棄しないのかRSSをどんどん消費していくってこと。これってプロセスモニターとして使っている人はいるのかな?

Jan 11, 2007

prototype.jsを用いたフォントサイズ変更スクリプト

Movable Typeを触っている時間がとれないのですが、新年に入ってからちょっとばかしテンプレートとスタイルシートを変更して、ほぼ一カラム、ほぼfont-size: 100%で表示されるようにしました。要はレイアウトとか考えるのを最小限に留めようと思ったわけです。不得手なデザインをこれ以上考える必要がないという私個人の精神衛生上の利点に加え、読者の目にも優しくなりました。

結論: でかフォントは人を健康にします。

それだけだとなんなので、prototype.js (Prototype JavaScript Framework: Class-style OO, Ajax, and more)を使ってフォントサイズ変更スクリプト(クッキー保存機能付き)を実現してみました。これまでprototype.jsを全然使ったことがなかったのでその練習も兼ねて。

まず、prototype.jsとcookiemanager.jsをダウンロードして適当なディレクトリに置きます。prototype.jsは上記リンクから、cookiemanager.jsはCookie Manager | Javascript Code | All Things Webbyから、それぞれダウンロードできます。

次に下記の内容をfontchanger.jsとか適当なファイル名で保存します。

// FontChanger
// Copyright (c) 2007 Hirotaka Ogawa
// REQUIRES: prototype.js, cookiemanager.js
FontChanger = Class.create();
FontChanger.prototype = {
  id: null,
  cookieManager: null,
  cookieName: 'body.style.fontSize',
  initialize: function(id) {
    this.id = id || 'fontChanger';
    this.cookieManager = new CookieManager();
    var fontSize = this.cookieManager.getCookie(this.cookieName);
    if (fontSize) document.body.style.fontSize = fontSize;
  },
  setCookieShelfLife: function(days) {
    this.cookieManager.cookieShelfLife = days;
  },
  change: function(fontSize) {
    document.body.style.fontSize = fontSize;
    this.cookieManager.setCookie(this.cookieName, fontSize);
  },
  reset: function() {
    document.body.style.fontSize = '';
    this.cookieManager.clearCookie(this.cookieName);
  },
  show: function() {
    var id = this.id;
    document.writeln([
'<div id="' + id + '">',
'文字の大きさ: ',
'<span style="cursor: pointer; font-size: 80% ;" id="' + id + '-small" >小</span>',
'<span style="cursor: pointer; font-size: 100%;" id="' + id + '-medium">中</span>',
'<span style="cursor: pointer; font-size: 120%;" id="' + id + '-large" >大</span>',
'</div>'
    ].join("\n"));
    Event.observe($(id + '-small' ), 'click', this.onClickSmall.bind(this));
    Event.observe($(id + '-medium'), 'click', this.onClickMedium.bind(this));
    Event.observe($(id + '-large' ), 'click', this.onClickLarge.bind(this));
  },
  onClickSmall:  function(e) { this.change('80%' ); },
  onClickMedium: function(e) { this.change('100%'); },
  onClickLarge:  function(e) { this.change('120%'); }
};
// Bootstrap
FontChanger.start = function(id) {
  var fontChanger = new FontChanger(id);
  fontChanger.show();
};

でもって使うときは、

<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="cookiemanager.js"></script>
<script type="text/javascript" charset="utf-8" src="fontchanger.js"></script>
<script type="text/javascript">FontChanger.start('fontChanger');</script>

とHTMLファイルに記述してやれば、このページの右上のようなフォントサイズ変更機能が追加されます。ちなみにFontChanger.startに渡している引数は生成される表示部分の要素IDを意味します。

FontChanger.start('id');

と呼び出すと、

<div id="id">
文字の大きさ: 
<span style="cursor: pointer; font-size: 80% ;" id="id-small" >小</span>
<span style="cursor: pointer; font-size: 100%;" id="id-medium">中</span>
<span style="cursor: pointer; font-size: 120%;" id="id-large" >大</span>
</div>

が生成されます。つまり、スタイルの改変はスタイルシートで行えます。

以下、注意点。

  • document.body.style.fontSizeを変更しているだけです。スタイルシートでもっとぐちゃぐちゃfont-sizeを指定している場合には、それなりの変更が必要になります。
  • 言うまでもなく、Artistic License/GPLv2。改変・再配布はご自由に。
  • fontchanger.jsの読み込み時にcharset="utf-8"オプションを指定してありますが、これは私がこのファイルをutf-8で保存しているからです。他のcharsetで保存した場合には他の適切なcharsetを指定する必要があります。

…問題はこの演習だけでは私がprototype.jsに習熟するには不十分だということ。

2007-01-23追記:
setCookieShelfLifeというメソッドを追加しておきました。FontChanger.startに以下のように追加しておくと、90日間有効なクッキーが保存されます。何もしないと365日間有効なクッキーが保存されるようになっています。

FontChanger.start = function(id) {
  var fontChanger = new FontChanger(id);
  fontChanger.setCookieShelfLife(90);
  fontChanger.show();
};

Jan 10, 2007

iPhoneはいいねっ!!

アップル iPhone発表 - Engadget Japanese

iPhoneいいですね、実にいいです。Appleが良いとか悪いとかではなくて、何というか、一社で垂直統合してモノ作りに取り組めばこんなカッコいいものだって作れるんだっていうことを示してくれたこと、がとても嬉しいんです。ずーっと失望し続けてきた携帯電話端末に対して何だか希望がわいてきました。

一方で、日本の携帯電話みたいに通信事業者が指導的立場に立って垂直統合の各パートをメーカーが担当する方式では、iPhoneに追いつくのはそう簡単じゃないだろうなと、ネガティブになる私もいるわけです。松下、東芝、京セラ、シャープ、カシオ、富士通、三洋などなどの中の人も本当はiPhoneのようなモノが作りたいのでしょうし、プラットフォーム屋さんの中の人もブラウザだけじゃなくてちゃんとプラットフォームで商売したいのでしょうし、実際それだけの実力はあると思っています。が、今の「各社のコアコンピタンスを生かしてWin-Win」的な枠組みの背後には、一社で垂直統合可能なプレイヤーが(キャリアを含めて)誰もいないという、悲惨な状況が隠されているような気がしてなりません。それに引き換え、iPhoneとAppleの晴れがましいことと言ったら…。

Tociyuki::Diary - iPhone の発表しかないのに失望した!

せっかくモバイル仕様の MacOS X を作ったのなら、それを搭載したモバイル Mac を iPhone と同時に発表しても良かったのではないでしょうか。

Good Point!

ですが、Cingular二年契約でも599USDするiPhone 8GBから電話機能を除いただけのMac PDAのお値段はいったいおいくらになるでしょうか?

2倍くらい? そこまで行かなくとも4桁にはなりそうな気もします。

かたや8GBのiPod nanoが249USD。上位機種というにはあんまりな価格差があります。もちろんMac PDAはたくさん作れば値段は下がります。ハードディスクを搭載したとしても599USDを下回ることはおそらく可能でしょう。可能でしょうけれど、結果としてiPhoneが売れなくなってしまってはAppleがこの携帯電話端末事業に参入した意味がなくなります。

とは言え、私も期待しています。

Jan 9, 2007

貧乏人のためのboot-from-SANの後日談

Ogawa::Buzz: 貧乏人のためのboot-from-SAN (1) 導入編の続きで、「(4) 性能比較編」を書くつもりだったのだが、その前にもうちょっとpreciseな測定を行って共著で論文を出しておこうということになり、昨年末あたりDownload VMware Server - EULAを読んでみていたら大変なことが分かってしまった。

3.3 Restrictionsの後半に、

You may use the Software to conduct internal performance testing and benchmarking studies, the results of which you (and not unauthorized third parties) may publish or publicly disseminate; provided that VMware has reviewed and approved of the methodology, assumptions and other parameters of the study. Please contact VMware at benchmark@vmware.com to request such review.

と書いてある。簡単に訳すと、

あなたはこのソフトウェア(VMware Server)を使って内部的に性能試験やベンチマーク調査を行うことができます。また、あなた(と許可されたサードパーティ)は、その調査結果を、出版・公表することができます。ただし、VMwareがその調査の方法・前提条件・その他パラメータをレビューし承認した場合に限ります。このレビューを要求するにはVMware(benchmark@vmware.com)にコンタクトしてください。

今から言うよ!死語言うよ!

がびーん。

ま、まあブログにベンチマーク結果を載せるくらいなら(後から削除できるので)大目に見てもらえるだろうけど、論文だとか雑誌の記事だとか書籍だとかでは正規の手続きを踏まないとまずい。明らかにまずい。

そういうわけで同僚が調査の方法・前提条件・その他パラメータなどを添付した測定データを添付してVMwareに問い合わせてみたところによると、final manuscriptを送ってくれとか言われてしまった始末。

け、けどね、日本語の論文の場合VMwareはレビューできるのかいな。できないから英訳しろって言われたらやるけど、それって日本語のfinal manuscriptとは逐一異なるものになるわけで正確にはレビューを受けたことにはならないと思われる。一方で仮に日本語のfinal manuscriptを渡すことができたとして、VMwareがそれを日本語のエキスパートに翻訳させてレビューするのだとすると、3日でやれって言っても無理な話だよね。じゃあ最初から英語で書いとけってことなんだけど、

面倒くさい。

ていうか、英語にしろ日本語にしろ一本書くたびにレビューしてもらわなきゃならないかと思うと頭痛い。こういうときどうしたらいいの?
>同業者(特にこういうことがありがちっぽい中央林間にある外資系企業の研究所の中の人とか)

Jan 8, 2007

Google Bloggerで独自ドメインブログがより簡単に

何やらGoogle Bloggerで、(従来のFTPを使った方法ではなく)DNSのCNAMEレコードを使って独自ドメインのブログを実現する機能が追加されたようだ。

Blogger ヘルプ : How do I use a custom domain name on my blog?

これはOgawa::Buzz: Gmail for your domainを試験利用中というエントリーで仄めかしておいた方法と同じだね。

例えば、独自ドメイン「domain.name」を取得しているものとする(厳密にはdomain.nameゾーンを自由に編集できるものとする)。このとき「http://blogger.domain.name/」というURLで(Bloggerの)ブログを公開したければ、まずDNSのdomain.nameゾーンに、

blogger  CNAME  ghs.google.com

というエントリーを加え、次にBloggerの管理画面で「設定 > 公開中」の設定を「カスタム ドメインで公開」するよう変更するだけでよい。あとはblogger.domain.nameへのリクエストは全部ghs.google.comがハンドルしてよきにはからってくれる。


率直に言うと、まだPyra Labsだった頃から提供されていた、「FTPを使ってファイルをBloggerサーバからユーザサーバにコピーすることで独自ドメインのブログを実現するよ」っていう方法は、ちょっとあり得ないくらい阿呆すぎた。このサービスを利用するためだけに、ユーザは、望みもしないのにサーバ上でFTPサーバを動作させなくてはならなかったし、そのログインアカウントをPyra/Googleに教える必要があった。

それに比べると今回提供されたCNAMEレコードを使う方法はずっとスマートで、DNSのレコード以外のすべてをGoogleにホストさせてしまえる。とても楽ちんだ。

欠点があるとすれば、この方法ではすでに利用しているURLのサブディレクトリにブログを配することができないことと、CNAMEレコードの編集が幾分難しいこと。前者はどうしようもないが、後者はGoogle Apps for your domainあたりの流れをウォッチしている分には、GoogleがeNom registrarになるかそこそこ大手のeNom registrarと協業するか(買うか)して、もう少しtransparentなサービスとして提供してくれるようになる可能性はあると思っている。

で、前も書いたけど、これと同じ方法ははてなダイアリーや他のブログサービスでも実現できるはず。なんでやらないんだろうね。

Jan 6, 2007

2007年も明けました。

みなさま明けましておめでとうございます。

年末年始ですが、富士を観たり、

牧之原くんだりでカツ丼食ったり、浜松でPCの設定をしたり、

岐阜に移動しては、建て替え中の実家を観たり、

北海道から送ってきたカニを食ったり、千代保稲荷に出かけてドテ焼き食べたり、栄まで出かけて30分行列してまで山本屋で味噌煮込みを食べたり、

矢場町を経て大須観音まで足をのばして、

パーツ屋を覘いたり、矢場とんの行列を観たりして、「栄~大須と連なるエリアはいまや渋谷をしのぐ商圏に成長したよね」という同行者の言に感慨に耽ったり、

東京に戻っては、秋葉原に行ってさしたる買い物をしたわけでもないのにぐったりとし、ついでに浅草寺に詣で、

ぜんざいを食ったりしていたら、

休暇が終わってしまいました orz

About Me

My Photo

つくばで働く研究者LV15

Total Pageviews

Amazon

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