近所のセブンイレブンに見慣れないビールが置いてあるので買ってみる。
キリン まろやか酵母。 東京、神奈川のセブンイレブンでテスト販売中とのこと。
無濾過で白っぽく濁ったビール。銀河高原ビールの小麦のビールを、もっとずっとおとなしくした感じでしょうか。 炭酸もきつくなく、クリーミーな舌あたりでするっと飲める。あとにじんわりと、小麦を使ったビール特有(?)の甘み。
暑い日に喉が渇いて帰ってきて、さあビールビール! うぐうぐうぐ。という飲み方をすると、多分物足りない。 一杯目には普通のビールですっきり呑んで、二杯目以降にこれ、だといいんじゃないでしょうかね。
本格的に売って欲しいです。
北海道旅行3日目。
起きるといい天気。だが予報では午後から崩れるとのこと。
ホテルの部屋からの眺めはなかなか。いいんだけど、釈然としない感も残る。誤魔化されないぞ > 層雲閣グランドホテル
朝食もバイキング。うまくも何ともない、というか、マカロニサラダをこれだけまずく作れるのもすごいことだ。 ご飯と生卵はおいしかったけど。
チェックアウト。一人¥13,000。部屋はともかく、あの食事でこれだけ取るかね。
ロープウェイ山麓駅の1階でコインロッカーに荷物を詰めて、ロープウェーで5合目まで登る。 今年の北海道の紅葉はあまりよくない、ということを聞いていたのだが、確かに。 色づく前に、枯れたような茶色になってる木々が多い。
5合目からリフトに乗り継いで、7合目まで。リフトで昇っていくと、ずんずん気温が下がっていくのが分かる。 終点付近ではうっすら雪が見え始め、吐く息が白くなる。紅葉もちょうどここらあたりが最盛期。
7合目 (1600m附近) 到着。ここから一時間ほどで頂上 (1900m)。 ロープウェイとリフトで気軽にここまで来られるので、安易に軽装で更に登っていこうとする人がいて、小屋のおっちゃんにたしなめられている。 北海道の2000mってのは本州の3000m級に相当するのだぞ。足元の雪が見えないのかね。
...
7合目に数十分滞在の後、リフトで下りる。下りるときは角度が付いててちょっと恐い。 しかも体が冷えかけているので、やたらと長く感じる・・・
ロープウェイの山頂駅の近くで、シマリス発見。誰かからもらったキャラメルのようなものをカリカリと齧っている。 すっかり餌づけされてしまっているようで、人を見つけるととりあえず近寄っていってアピール。 餌をもらえないと分かるとダッシュで逃げる。・・・あさましいというか。まあ、餌づけした人間が悪いのだけど。
...
レンタサイクルで自転車を借りて、小函まで片道6kmほどのサイクリング。 途中でぽつぽつ雨が降りだす。行って帰って一時間弱。
レストラン「銀河」(ペンション「銀河」の食堂を、昼間はレストランとしてあけている) で、豚丼(¥700)、醤油ラーメン(¥700)。豚丼は帯広あたりの名物。 薄切りのロース肉と玉葱が、甘辛い醤油ダレで炒めてある。うめえ。 ラーメンは豚骨系のダシに醤油ダレ。旭川ラーメンっぽいスープの白濁具合 (悪い意味でなく)。 ちょっとダシが薄めかとも思うが、熱々のスープと麺のバランスはなかなか。ラーメン専門店ではないとは思えないほど。
層雲峡温泉唯一の公共浴場、「黒岳の湯」で汗を流して、ビール一本。 畳敷きの休憩所でごろごろしてバスを待つ。入浴料¥600だけど、いいですよここは。 昨日の国際ホテルの風呂よりゆったりできる。露天風呂もサウナもあるし。
層雲峡 15:40 のバスで上川駅へ。上川から旭川まで特急。旭川 17:10 着。 なんだか旭川がものすごく都会に見えるんですけど(笑)。
昨日の夕食があまりにもあんまりだったので、今日はまともなものを。 書店で旭川の飲食店ガイドを立ち読みして、「海老と地酒の店 伊勢」(三条通7丁目) という居酒屋へ。 イカそーめん、サンマ刺身、ツブ貝刺身、毛ガニ、シシャモなど。 イカとサンマ、シシャモはまあ普通。ツブが旨い。カニは毛ガニで、甲幅8cmほどのものが丸ごとで¥1,800。 これは大当たり。「カニを食ったー」と十分堪能できるほどの量と味。これは原価ギリギリじゃないかね。
さすがに観光客に見えたのか、店主(板前さん)が話しかけてきて世間話。 店主はもとは東京で板前をやっていて、7年前に旭川でこの店を開いたのだそうな。 神奈川から来た、というと嬉しそう(?)であった。
最後にイクラ丼(¥1,000)。新物、自家漬けのイクラで、箸でちょっと乱暴に扱うと粒が弾けてしまうほど柔らかい。 旨い旨い。
...
ついつい店主と話し込んでしまって、美瑛 (美馬牛駅) に向かう富良野線の時間がギリギリ。 慌てて駆け込む。男女の高校生がなにやら話をしているのを聞きつつ。
相席になった男子高校生3人組の後ろから、「あ、お兄ちゃんだ」との声。 妹 (これも高校生) らしい。途中はそれぞれの友人と一緒にいたのだが、下車駅では妹が兄のところへやってきて、兄の友人達に「さようなら」と丁寧に頭を下げて、一緒に下りていった。 仲のいい兄弟ですな。ほのぼの。
美馬牛駅で下車。街頭がほとんどなくて、真っ暗。道が見えん・・・ と、どっちに歩けばいいのか地図を見ていると、待合室を掃除していたおばあちゃんが道を教えてくれる。 ありがたい。
今夜の宿は、「バリアフリーの宿 出会いの郷 とぅもろう」というペンション。
北海道旅行2日目。
朝 6:15 に網走着。とりあえず待合室で時間を潰して、コンビニで買った朝食。
網走バスの定期観光、サンゴ草コースに乗車。乗客が自分らだけだったらどうしよう・・・ と少々心配だったが、11名ほど乗車した模様。バスガイドさんが喋る喋る。マシンガントーク。 時折混じる北海道弁がいいですなあ。
何にもなくてだだっ広い能取岬を経由して、網走に来た最大の目的、サンゴ草群落地へ。 あまり天候がよくなく、太陽が時折雲の切れ間からのぞくぐらい。 晴れていれば、サンゴ草の赤と空の青さが素晴らしいんだろうけど。 ちと残念。
オホーツク流氷館へ。ここは-18℃で流氷を保存しているという。そこではバナナで釘が打てます。
続いて「博物館 網走監獄」へ。ここのガイドのおばちゃんが、これまたよく喋る。 マシンガンじゃなくてガトリング砲トーク。重量級だがすさまじい連射速度。
ここは実際に使われていた監獄を移築したり、再現したりして展示がしてあるのだが。 建物の中にある人形がちょっとリアル過ぎて、恐い。特にタコ部屋。 木造のほったて小屋に、丸太を枕にして数十人が寝せられている光景を再現。 その人形が怪我してたり、髪の毛抜けてたり。そこまでやるか。
資料館では刑務所の食事が紹介してあって、ガイドのおばちゃん曰く、
「ここでは今でも 米:麦 = 8:2 の麦飯なんです」と。すいません。うちのご飯も 8:2 の麦飯です・・・
# でも押麦って結構高いのよ。安い米よりも高い。
3時間半の観光バスツアー終了。引きずり回されて疲れたが、普通のパックツアーなんかに参加したら朝から夜までこの調子なのか。 自分ではそういうツアーには絶対行かないので分からないけど。ますますそんなツアーには行かん、という思いを強くしてみたり。
...
昼飯時なので、網走の街中をぶらぶら歩いて店を探す。 しかし、めちゃくちゃ人通りがない。一応祝日の真っ昼間なのだが、15分ほど歩いてすれ違ったのが高校生の数名組、だけ。 あ、人だ。と思って見ると、さっき定期観光バスで一緒だった人だったりする。 さびれまくりだわ・・・
「鮨勝」という店に入る。こじんまりとしたお鮨屋さん。「寿司 鍋物 丼物 天ぷら 鮨勝」と割り箸袋には書いてありました。
連れ合いはランチの天丼 (梅) ¥600、自分は海鮮丼¥2,000 とカニの鉄砲汁¥1,000 を注文。
# 自分が¥3,000 で連れ合いが¥600 だと、いじめてるみたいだな。すまん。
海鮮丼。ホタテがうまい。甘みが濃くて、とろりとして。鉄砲汁は直径4cm、長さ5cmほどのタラバ足の関節部分が4つ、ごろりと入っている。 こんな太いカニの足は食ったことがないぞ。詰まっている身はジューシーで濃密。ああ幸せ。
網走 13:30 の特急で上川へ。車窓から写真。連れ合いは例によって寝ております。
# この旅行を通して、連れ合いは15分以上何かに乗った場合は、確実に寝ていた。
上川からバスで層雲峡まで。30分。層雲峡に着いてさっそく本日の宿、 層雲閣グランドホテルへ。 が、チェックインしようとすると、なぜかロビーの喫茶店に案内され、「予約課長」なる人物が登場。 嫌な雰囲気が・・・と思っていると案の定。「予約の手違いで部屋が用意できない」だと!? ついては「層雲峡国際ホテル」に部屋を確保したのでそちらにご宿泊いただきたい、だとぉ!? ぶち殺すぞコラ。
これが計画的なのか、本当に手違いなのか真相は藪の中だが。 団体客 (のなかの数名) を追い出すよりはフリーの二人客を追い出す方が楽だろうし、とばっちりを食らったのかもしれんが。ふざけるなこの野郎。
封筒に入った一万円を渡される。こんなもので誤魔化されると思うなよボケ。
...
ということで、移動。通された部屋は、和室8畳、ベッドルーム10畳、テレビは29型という、無意味に豪華な部屋。
・・・これは数日後、北海道新聞を読んで判明することなのだが。振り返られたこの国際ホテル、経営団体(本間興行グループ)が経営破綻していて、民事再生法を申請中だったのである。 それが明らかになった6月下旬以降、客足が激減しているとのこと。だから部屋があいてたのね。
食事。フロントで「バイキング」という単語を耳にしたときから、いやあな予感はしていたのだが。 冷凍タコ焼き。人をバカにするのもいいかげんにしろ。ローストビーフ。味をつけた厚紙かこれは。 イカ刺し。ここが北海道であることを忘れさせてくれるイカ刺し。
サービスなのかなんなのか、カニ (食う気もしない) と小鍋のすき焼き (いちおう食った) がついてはいたが。 層雲閣グランドホテルのメニューとは比べるべくもない。 ちょっとだけ口をつけて、訳のわからんロシアンショー (ボリショイバレエ団???) が始まる前に、逃げ出すように退出。ああもう。
満たされぬ空腹を癒すべく、外に出てみる。が、飲食店はそもそも数軒しかないうえに、夜はラーメン屋しか開いていない。 結局、酒屋でビールと日本酒、鮭トバ、干し貝柱などを買って帰る。部屋で飲む。あーあ。
北海道旅行1日目。
朝9時羽田発の ANA で千歳へ。てことで5時半に起きて、7時出発。
二子新地の駅で、デジカメ (LUMIX) を忘れたことに気づく。 ACアダプタをくれぐれも忘れないように・・・と鞄に詰めておいて、本体のほうを忘れるという。マヌケ。 時間的にギリギリなので取りにも戻れず。なーんかいきなりミソがついたようで。
...
飛行機は4年ぶりか? 足が地についてないってのは嫌なものですな(笑)
...
千歳に無事着陸。かつて6回ほど北海道に来たことはあるが、飛行機で降り立ったのは初めて。 東京から1時間半で北海道。はるばるやってきたという気がしないので、いまいち盛り上がらないのだが。 まあ、窓の外の光、大気の透明度は確かに北海道。
千歳空港駅で「北海道ペアきっぷ」普通車用を購入。¥43,220 で、大人二人、道内の JR の特急、急行の普通車指定席が乗り放題。7日間有効。
札幌へ。デジカメがないと気軽に写真が撮れないので (<堕落)、札幌ヨドバシで SONY の Cyber-shot U10 を購入。一台だけ在庫があったピンク色モデル。¥24,800。いきなり予定外の出費だが、まあ、新しいカメラを買うとそれはそれで心が弾むので良しとしよう(?) 64MB のメモリースティックと、メモリースティック用 PC カードアダプタも購入。
ヨドバシでカメラ買って、ドトールでコーヒーを飲む。これでは、新宿あたりにいるのと変わらない。
小樽へ移動。昼飯に鮨。寿司。すし。鮨屋通りの 旭寿司 本店 へ。 けちって後悔するのもなんなので、「おまかせにぎり」¥4,800 を注文。
おまかせにぎり。
上段左から、アワビ、中トロ、ヒラメ。
ぼたん海老(卵つき)、数の子、サーモン、ホタテ、トリガイ、エンガワ。
シャコ、ウニ、イクラ、卵焼き。
ネタが全体に、柔らかい。ふにゃっとした感じ。新鮮で活きがよくてプリップリですよ!・・・というのとはちょっと違う。 んーん。アワビ、ボタン海老、ウニ、トリガイあたりがよかったかねえ。 数の子は生まれてこのかた、それほど (値段の割に)旨いと思った経験がない。
12カンでは少々食い足りないのだが、更に¥3,000とかのにぎりを頼むのも、何だか違う気がする。 いくら丼とかちらし寿司を頼むのは更に違う気がするし。結局、そのまま店を出る。 ¥3,000 ぐらいのにぎりにしておけばよかったかなあ。
...
小樽運河をぶらぶら歩く。まさに観光地。
ひとしきり歩いて、小樽運河食堂 ラーメン工房 へ。 小腹が空いているので、一人で 大勝軒に。 他のところより空いていたし、池袋の大勝軒にも行ったことがないし、ということで。
中華そばを注文。・・・ひどいなこれは。 麺の表面がぬるぬるしていてスープが絡まない。 スープも妙にダシが薄くて旨味が全然感じられない。 (それほど空腹でなかったことを加味しても) はっきりいって不味い。 ここ最近食ったラーメンの中でも、下から何番目か、という不味さだぞこれは。
池袋の大勝軒で食ったことがないので、これで大勝軒を判断するわけにはいかない。
東京に帰ったら絶対に行ってみなくては。
# 変な宿題を背負ってしまった・・・
...
連れ合いに引っ張られて土産物屋めぐり。初日から土産物見てどうするよ。
北一ガラスで見たガラスのレリーフは良かった。 厚みのある板状のガラスを裏から凹に彫り込んであって、光を当てると像が立体的に浮かび上がる。 小さいものなら¥3,000 ぐらいから。
JR で札幌に戻る。途中、車窓から綺麗な夕焼け。連れ合いは眠っているので起こさなかった。
札幌へ戻ると、既に日はとっぷり暮れて。大通り公園、旧北海道庁を徒歩でまわって、サッポロビール園へタクシーで。
ビール園の建物に入ると、もうホール全体がジンギスカンだらけで、どわーーーんと煙っている。 ビール呑むのに最高のシチュエーションですな。ラムもビールも旨い旨い。 昼の¥4,800の寿司よりも、¥1,300 のジンギスカンの方に幸せを感じてしまうのは、なんなのか。貧乏舌か (苦笑)。 まわりの雰囲気、ビールの力も重要ね。
体中、ジンギスカンの匂いがしみついてしまう。 今晩は夜行列車だから風呂に入れないのに (笑)
札幌駅へ戻り、「オホーツク9号」を待つ。待合所のテレビで「あるある大辞典」。 「低インシュリンダイエットで『ご飯よりパスタが良い』というのでパスタばっかり食べていたら太った (単に炭水化物の取り過ぎ)」・・・アホか。
寝酒にサッポロクラシック 350ml を2本。ああ北海道。
夕方から渋谷へ。「はなまるうどん」でうどんを食おうかと行ってみるが、ざっと50人以上の大行列。 断念。土曜の食事時だものなあ。
UNIQLO でジーンズを買う。置いてあるサイズの中で、ウェストがもっとも ( 1 ) くて、股下がもっとも ( 2 )
いものを購入。
・ ( 1 ) ( 2 ) に当てはまる漢字を入れよ (5点)
渋谷センター街奥 (駒形どぜうの近く) の博多天神でラーメン。ここの天神、駅前 (東急プラザ裏) の店と比べると、なんだか味が落ちる気がする。客が少ないからか。店員の活気もない感じ。
...
業務連絡。
9/22 〜 9/29 まで、北海道旅行 (+ 帰省) に行ってきます。 その間、酒日記の更新はありません。 メールは読みますが。
では、ごきげんよう。
「シーサーズ」が満員だったので、道玄坂の「丸八」。某編集さんと、売れる本ありませんかねえ、とか。
ここは田酒が¥580なのがいいですね。
そのあと例によって山家。7時まで。
週末からの北海道旅行にどのカメラを持っていこうかと思案中。 なんとなく、手持ちの全てのカメラをいじくってしまう深夜4時。
・・・ (順不同) 改めて数えてみるとえらい数だな。完動品だけで15個。
しかしここ半年、銀塩でまともに撮ったのは (人に頼まれた) 結婚式撮影だけ。ああ。
相変わらず HTML::Template を多用しているのだが。
単純に
<TMPL_VAR name="hoge">
として値を展開すると、その値がそのまま出力される (当たり前だ)。 が、ここで不用意に CGI を作る人がいて、
$tp = HTML::Template->new(***); $query = CGI->new; $tp->param( hoge => $query->param('hoge') );
のように、受け取ったパラメータを処理せずにテンプレートに渡すと、あっさりと XSS
(クロスサイトスクリプティング) 脆弱性が発生してしまう。
# そんなことする奴はバカ、というのは実に正しいのだが・・・
これはテンプレート側で、
<TMPL_VAR name="hoge" escape="html">
と、HTMLエスケープをしてやることで防げるのだが、すべての箇所に escape="html" を入れるのも繁雑。ということで、default_escape をオプションとして設定すると、 何も指定しない場合 escape が default_escape になる、という patch を書いてみた。
これで、escape が未指定の場合は default_escape で処理される。
use HTML::Template; my $tmpl =<<END; default : <TMPL_VAR name="hoge"> html : <TMPL_VAR name="hoge" escape="html"> url : <TMPL_VAR name="hoge" escape="URL"> 0 : <TMPL_VAR name="hoge" escape=0> "0" : <TMPL_VAR name="hoge" escape="0"> '0' : <TMPL_VAR name="hoge" escape='0'> END my $tp = HTML::Template->new( scalarref => \$tmpl, default_escape => 'html', ); $tp->param( hoge => '<hoge fuga="aaa">' ); print $tp->output;
実行結果
default : <hoge fuga="aaa"> html : <hoge fuga="aaa"> url : %3Choge%20fuga%3D%22aaa%22%3E 0 : <hoge fuga="aaa"> "0" : <hoge fuga="aaa"> '0' : <hoge fuga="aaa">
default_escape を指定して、かつ escape したくない場合は明示的に escape="0" とすれば、そのまま出力される。
...
さてさて、これを本家 HTML::Template に反映させてもらうには、英語でメールを書いて patch を送らなくては。 とりあえず sourceforge.net にアカウントを作って、HTML::Template の ML には参加。ちょっと様子見。
日曜日に買ったスニーカー (というか、アウトドアシューズか。Timberland の)。 夕食時に素足ではいて小一時間ほど歩いたら、アキレス腱の部分の皮膚がむけた。痛い。 ・・・鬱、というか腹立たしいというか。
靴下をはけば問題なさそうだが、ここ数年、出社後は靴下を脱いでスリッパにはきかえて、退社時まで素足、という運用形態をとっているのだ。 困ったのう。
...
帰宅後、自宅のキーボード掃除。
愛用の IBM Space Sever II の キートップをすべて外したところ。 最下段は昨日掃除したのでちょっときれい。
写真だと綿埃がたまってるぐらいにしか見えないが、綿棒でその埃を拭うと、ねっとりした嫌ァな感触とともに、なにか茶色いものが綿棒の先に付着する。 ・・・このキーボードを使い始めて2年間、キーボードの前でビールを呑んだり日本酒を呑んだり焼酎を呑んだりなんだりかんだり。細かい飛沫が積もり積もってこうなったのかね。 ああ気持ち悪い。
ウェットティッシュと綿棒で掃除。外したキートップも、一つ一つウェットティッシュで拭く。
午後に起きて、ごろごろ。 自家漬けのいくら醤油漬けでいくら丼。うまいうまい。北海道旅行の前に堪能。いいのかね。
...
二子玉川の「牛鉄」へ。前回来店時は 見事な放置プレイを食らわされた のだが、今回は果たして。
塩ネギタン、骨つきカルビ、味噌ハラミ、セロリキムチ、白菜キムチ、サンチュ、チジミ。 生ビール。一通り食って、生ビールをもう一杯注文。・・・ビールが来ない。
なんだかなあ、と思いつつビールを持って来させて、追加で塩豚カルビ、中落ちカルビ、野菜焼き盛り合わせ (野菜は、いつもは初回の注文で頼むのだが忘れてた) を注文。・・・野菜が来ない。
確認するとやはり注文が入っていなかったようなので、キャンセル。退店。
...
一年ぐらい前まではこんなことはなかったのに。 なんだか店員が少ないような気もする。 狂牛病騒ぎのころに合理化を進めすぎて、それに店員の能力が追いついていない、のかなあ。
味と値段には何の文句もないのだけど。
# 二人でこれだけ食って¥5,500。
hirax.net の、君の歌は僕の歌 - 竹内まりやの「平方根」 - を読んだ。ふむ。竹内まりやの音程を下げると山下達郎風に、鬼束ちひろの音程を下げると平井堅風にきこえるそうな。 おもしろい。
手持ちの音源でなにか面白くなるものはないかなあ・・・と、Winamp + PaceMaker で女性ボーカルものの音程を下げて遊んでいたところ、発見。 Cocco の音程を下げると、SPITZ になる。
SPITZ を上げると Cocco になるか、というとさにあらず。
どこのオカマか、という声になるのであった。
風邪は一応快復。
吉祥寺東急の北海道物産展に「マジックスパイス」 が出店しているので、食べに行く。去年、渋谷東急に来てたときには行けなかったので。
「チキン」の「極楽」(辛さ7段階の上から3番目)を注文。スープカレーと銘打つだけあって、もろにスープ。 チキンの骨つきモモが一本、野菜やらスパイスの破片らしきものが浮いている。 スパイスが、すっと香る。味は確かに辛いのだが、あとにビリビリ残る辛さではなく、飲み込むとまた次の一口が欲しくなる。止まらん。 チキンはスプーンだけでほろほろ崩せる柔らかさ。
正直、蒙を開かれるカレーであった。というか、普通のカレーとは別料理な気が。
...
吉祥寺をぶらぶら。スニーカー買ったり紅茶飲んだり。
その後新宿へまわって中古カメラ市 (京王百貨店)。 だが、もうカメラ関係の物欲がすっかり萎えて (というか、買っても使わないのが目に見え過ぎて) いるので、ざっと一巡りして終了。なんだか悲しい。
...
渋谷へ。「魚耕」で、生筋子 (二腹 ¥680)、大羽いわし (25cmほど。4羽¥800。 写真)、ヒラメ (30cmほど。¥700ちょい。 写真) を購入。
あとは枝豆とか昨日の残りのマカロニサラダとか。
朝9時帰宅。寝る。
夕方、連れ合いが実家から帰ってきたので一緒に夕食。 が、食っている途中でなんとなく具合が悪くなる (別に食事のせいではない)。 寒かったのにタオルケット一枚で寝ていたので、風邪をひいたらしい。
酒を呑まずに、寝る。何ヶ月ぶりかしらん。
毎週毎週、シーサーズ、山家コース。
最後まで残ったのは4人。うち一人は先週、午前6時に山家から呑みにやってきた後輩の女の子(23歳未婚)。
8時ごろ店をでて、「こんな時間まで呑んでていいの?」 と訊ねてみたところ、「いいんです。生きてるって感じがするから」とのこと。 山家に生きがいを感じるのはちょっとやばいと思います。はい。
...
山家(やまが、と読む)というのは、渋谷の駅近く、マークシティーのそばにある24時間営業の居酒屋。
もう場末感たっぷり。ただ、案外料理は不味くない。串焼きとか煮込みとかうまいし、ヘタな安居酒屋チェーン店よりよっぽどマシ。
山家に入るのはさんざん他で呑んだあとのダメ押しなので、味がよくわからなくなってることが多いが。
朝4時ごろに一旦客が減るものの、それから6時、7時と客が増えていく。つーか電車あるんだから帰れよみんな (自分を含めて)。
# たまに TOKIO が来る。
夕食に、セルフうどんの「はなまるうどん」渋谷店に行ってみる。 最近東京進出した、100円かけうどん。
午後7時半頃到着。店の入口から、外に10名ほどの行列。店内で、注文するまでにも10名ほど並んでいる。 約15分で注文受け付けまで到達。 セルフといっても自分で麺をゆがいたり、ダシをかけたりできるわけではなく、トレーを持ってうどんを注文→天ぷら、おでんなどのサイドメニューを自由に選ぶ →会計、という流れ。学食みたいなもの。
最初なのでまずはシンプルに。かけ(小)¥100 と、ざる(小)¥280を注文。 かけうどんには揚げ玉、おろし生姜、削り節、ゴマがトッピングし放題。すなわち、実質たぬきうどんに昇格する。
天ぷらなどが棚に並んでいるので、そこから「ちくわ磯辺揚げ (¥90)」と「小えびかき揚げ(¥120)」を取る。 会計。 ¥(100 + 280 + 90 + 120) * 1.05(消費税) = ¥619。案外かかったな(笑)
かけうどん。小とはいえ、普通の立ち食いの丼よりも気持ち小ぶりなぐらいで、小食な人ならこれでも大丈夫かも、というぐらい。 つゆは関西系の、薄口でダシのしっかり効いたもの (一見薄味でクセがないので飲み干したら、あとから喉が渇いた。塩は意外に強めかも)。 うどんは太め。角が尖っていて、コシがすごくあるわけではないけどモチモチ感は十分。 スーパーで売っている、パック入りのゆでめんなんかを想像しちゃダメですよ。
ざるうどん。つけ汁は気持ち醤油が強いかなあ、というかんじだが、これも素直でいい味。 うどんも締まってていい。
ちくわ磯辺揚げは、20cm弱のちくわを縦に2つに割ったもの。大きい。 小えびかき揚げは、直径8cmほどか。小えびといっても乾燥桜えびではなく、もうちょっと大きくて歯ごたえがある。 山家の「川海老唐揚げ」を小ぶりにした・・・といっても山家に行ったことのない、ごくごくまともな人々には分からんか。
というところで。
気になったのは、入口〜注文〜会計の行列。 自分が店内にいる間は入口の行列は絶えなかったのだが、店内の着席率は50%いかないぐらい。 十分過ぎるほどの余裕がある。注文〜会計の部分がボトルネックになっている。 ここを並列化して流せればいいのだが。
見ていて一番時間がかかっているのは、注文してからうどんを受け取るまで。そこが一系統しかない。
しかも厨房のレイアウト的にそこを二重化 (両サイドに配置するとか) するのは難しそう。
その後のトッピング、会計を並列化しても無駄だしなあ。会計はちょっと客席を削れば簡単に二重化できるのだけど。
うーん。
# 俺が悩んでどうする
次回は「かまたま」「しょうゆ」あたりを攻めてみようかね。 そうそう。うどんの薬味としてのおろし生姜。重要。
昨日の続き。Ruby でスレッドを使った ab (Apache Bench) もどきを作ってみる。
Ruby は初めて使うので、おそらく作法的に変なことをしているであろう サンプルスクリプト。 ソースは以下。(Ruby は Kondara-2.1 附属の、ruby 1.6.5 (2001-09-19) [i586-linux])
#!/usr/bin/ruby require 'net/http' require 'getoptlong' opts = {} opts_p = GetoptLong.new( [ "--c", "-c", GetoptLong::REQUIRED_ARGUMENT ], [ "--n", "-n", GetoptLong::REQUIRED_ARGUMENT ], [ "--u", "-u", GetoptLong::REQUIRED_ARGUMENT ] ) opts_p.each do |opt, arg| opts[opt] = arg end url = opts["--u"].to_s proto, host, path = url.split("/+", 3) path = "/" + path threads = [] total_requests = 0 success = 0 failed = 0 count = opts["--c"].to_i counts = (1 .. count).to_a limit_requests = opts["--n"].to_i start_time = Time.now for i in counts threads << Thread.new(host) { |host| while total_requests < limit_requests h = Net::HTTP.new(host, 80) resp, data = h.get(path, nil) if resp.code == "200" success = success + 1 else failed = failed + 1 end total_requests = total_requests + 1 end } end threads.each { |aThread| aThread.join } end_time = Time.now t = end_time - start_time requests_per_second = sprintf('%.2f', total_requests / t.to_f) puts "Concurrency Level: #{count}" puts "Time taken for tests: #{t.to_f} seconds" puts "Complete requests: #{success}" puts "Falied requests: #{failed}" puts "Requests per second: #{requests_per_second} [#/sec] (mean)"
特に GetoptLong の使い方は絶対間違っている気がするが・・・
起動方法などは昨日の fake_ab.pl と同じ。
$ ./fake_ab.rb -c 10 -n 1000 -u http://aqua/
とする。
...
fake_ab.pl と、fake_ab.rb、本物の ab で実行してみた結果 (-c 10 -n 1000) の Requests per second を以下に。
/index.html.dist (静的ファイル) Perl 236.42 Ruby 124.18 ab 343.05 /index.shtml (SSI html) Perl 178.88 Ruby 106.28 ab 229.52 /cgi-bin/printenv.cgi (環境変数を出力するだけの mod_perl CGI) Perl 110.07 Ruby 88.74 ab 118.72 /cgi-bin/index.cgi?rm=view (PostgreSQL に接続して数十レコードを閲覧する mod_perl CGI) Perl 12.56 Ruby 12.28 ab 12.53
(サーバ側の負荷が)軽い場合は ab > Perl > Ruby 。 重い場合は ab == Perl >= Ruby 。これだけ見ると、この処理 (標準モジュールでの HTTP GET) に関しては Ruby は Perl より重い、と結論付けたくなるのだが、gkrellm で、クライアント側の転送量を観察していると、 なぜか Ruby の時だけ output が多いことに気がつく。
ethereal でパケットキャプチャしてみたところ、Ruby は http://aqua/ を GET するにあたって、 DNS に AAAA レコードと A レコードをリクエストしている。Perl と ab は、A レコードしか引いていない。 もしかして、Ruby が遅いのはこれが原因?
ということで、名前を引かなくていいように URL を IP アドレスで指定した結果。
/index.html.dist (静的ファイル) Perl 244.24 Ruby 191.55 ab 328.84 /index.shtml (SSI html) Perl 197.33 Ruby 191.64 ab 222.57 /cgi-bin/printenv.cgi (環境変数を出力するだけの mod_perl CGI) Perl 113.77 Ruby 107.18 ab 122.09 /cgi-bin/index.cgi?rm=view (PostgreSQL に接続して数十レコードを閲覧する mod_perl CGI) Perl 12.50 Ruby 12.42 ab 12.19
Perl と Ruby の差が接近。つまり、Ruby の IPV6対応な名前解決が足を引っ張っていたらしい。 ベンチマークって、こういうことがあるから簡単に結論づけてはいけないわけですな。 奥が深い。
今月の UNIX USER を読んでいたら、「Perl5.8 の新機能」で ithread (インタープリタ・スレッド) が使えるようになったとのこと。 これで「ruby ならスレッドが簡単に使えますよ」とか言われて悔しい思いをすることがなくなるかも! (謎)
...
まずは Perl 5.8.0 のインストール。既存の Perl を壊さないように、/usr/local/perl-5.8 以下にインストールする。
$ tar zxvf perl-5.8.0.tar.gz $ cd perl-5.8.0 $ ./Configure -de -Duseithreads \ -Dcc=gcc_2_95_3 \ -Dprefix=/usr/local/perl-5.8 \ -Uinstallusrbinperl $ make $ make test $ sudo make install
-Uinstallusrbinperl を指定しておかないと、既存の /usr/bin/perl が上書きされちゃうので注意。
$ /usr/local/perl-5.8/bin/perl -V:useithreads useithreads='define';
となれば、ithread が有効になってインストールされている。
...
さて、スレッドを使ったサンプルアプリということで、ab (Apache Bench)もどきを作ってみる。 ソースは こちら
#!/usr/local/perl-5.8/bin/perl use strict; use threads; use threads::shared; use LWP::Simple; use Getopt::Std; use Time::HiRes qw(tv_interval gettimeofday); my %opts; getopt('cnu', \%opts); my $total_request : shared = 0; # $total_request は共有変数 my $success : shared = 0; # $success は共有変数 my $failed : shared = 0; # $failed は共有変数 sub request { my ($url) = @_; while($total_request < $opts{n}){ if(get($url)){ # LWP::Simple:get でドキュメントを取得 lock($success); # $success をロック $success++; }else{ lock($failed); $failed++; } { lock($total_request); $total_request++; } threads->yield; # CPUを開放、他のスレッドに使わせる } } my $start_time = [gettimeofday]; # 開始時間設定 my @t; foreach my $i(1 .. $opts{c}){ # -c で指定した数だけスレッドを起動 $t[$i] = threads->new(\&request, $opts{u}); } foreach my $i(1 .. $opts{c}){ # すべてのスレッドが終了するまで待つ $t[$i]->join; } my $end_time = tv_interval($start_time); # 実行時間を求める my $request_per_second = sprintf("%.2f", $total_request / $end_time); print <<END; Concurrency Level: $opts{c} Time taken for tests: $end_time seconds Complete requests: $success Failed requests: $failed Requests per second: $request_per_second [#/sec] (mean) END
で、これを
$ ./fake_ab.pl -c 10 -n 1000 -u http://aqua/
として実行する。 -c は同時実行スレッド(多重度)、-n は総リクエスト回数。
Concurrency Level: 10 Time taken for tests: 5.65637 seconds Complete requests: 1009 Failed requests: 0 Requests per second: 178.38 [#/sec] (mean)
このような出力を得る。ab の出力を、部分的にパクってみた。
...
取得する URL をいろいろ変えて、本家 ab との Requests per second を比較してみると、以下のとおり。
/ (ssi な HTML) ... (1) fake_ab.pl : 178.38 ab : 234.25 /cgi-bin/printenv.cgi (環境変数を表示するだけの mod_perl CGI) ... (2) fake_ab.pl : 105.95 ab : 121.58 /cgi-bin/index.cgi?rm=view (PostgreSQL に接続して数十レコードを閲覧する mod_perl CGI) ... (3) fake_ab.pl : 5.68 ab : 5.55
ab は C で書かれてコンパイルされた実行ファイルなので、動作が速い。 それに比べると Perl で実装された fake_ab.pl は遅いので、 単純な HTML を GET するような場合 (1) は、サーバの速度を最大限に引き出せていない。
が、比較的重い CGI (mod_perl) を実行するような場合 (3) なら、クライアントの速度差が無視できるので、 ほぼ同一の結果が得られる。
ふむ。なかなか簡単。
自宅メインマシンの Duron800 を、マザーごと Mobile Athlon 1400+ に載せかえ。
マザー、CPU、メモリ以外のパーツはそのままざっくり載せかえて、とりあえず起動は問題なし。 が、負荷を長時間かけると落ちる (画面がブラックアウト)。
どうも、メモリクロックを 166MHz に設定すると負荷がかかったときに落ちるらしい。 CPU使用率100%を数分続けたぐらいでは大丈夫だが、例えば mozilla の RPM をビルドして数十分以上 100% の負荷がかかるようだと、ほぼ確実に落ちる。 PC2700 (DDR333) なメモリなのだから 166 で行けるはずなんだが。
メモリクロックを 100, 133, 166 に設定して、それぞれ hdbench 0.14.1 (Linux版) でベンチを実行した結果が以下。
FLOAT INTGR MEMRY 100MHz 97760 121915 29969 133MHz 97799 119529 29913 166MHz 98514 123447 32508
166 > 100 >= 133、という結果。100 が 133 より若干良い結果になったのは、 Mobile Athlon は FSB が 100MHz なので、メモリと同期しているほうが有利。ということだろう。 「午後のこ〜だ」で実際のアプリでの性能を計測してみても、同様の傾向。
166 と 100 にしても実アプリでは 5% も違わないので、結局 100 に設定。
内部の写真。 Zalman の 扇形銅製 CPU ヒートシンクから、お手製ダクト + Silencer Fan (8cm、7V駆動)で暖まった空気を吸いだして、ケース外に直接排気。 チップセットのファンとヒートシンクはマザー附属のものではなく、別に買ってきたもの。これもファンは7V駆動。
...
上記構成で、vcore 1.25V (規定は1.3V) にして、高負荷状態でCPU温度が 49℃〜52℃ (外気温25℃前後)。 Duron800 の時とほとんど変わらない騒音レベルで実クロック1.5倍。 パフォーマンスもクロックなり。まずまずか。
昼過ぎから新宿へ。
歌舞伎町の和歌山ラーメン「和歌山っ子」へ。
自分はネギラーメン、連れ合いはあっさりラーメン + ぶためし(小) のセット。
ネギラーメン、スープはこってり濃厚で粘度が高い、いかにも和歌山ラーメン (って、他に和歌山ラーメンは「まっち棒」でしか食べたことがないのに偉そうに)。 麺がちょっと柔らかすぎて、ふにゃふにゃ。惜しい。
連れ合いのあっさりラーメンは、濃厚さがなく、どちらかというと東京ラーメンっぽいダシ。 いや、ダシというか、化学調味料が強すぎ。
...
秋葉原へ。
コムサテライト3号店で、Mobile Athlon 1400+ (25W) と、PC2700 512MB DDR-SDRAM(CL2.5) を購入。 User's Side で、Albatron の KX-400+ というマザーを購入。
朝8時帰宅。寝る。
夕方起きるが、胃の調子がかなりおかしい。重たいというか、はっているというか。
...
冷蔵庫には特に食い物もないようだし、夕食の買い出しでもしようと二子玉川の Presse へ。 最初は何か作ろうと思っていたのだが、歩き回っているうちに面倒くさくなって、結局 「純連」の味噌ラーメンを購入。モヤシと万能ネギも。
家に帰ってラーメンの袋を見ると、「じゅんれん」とふりがなが。 「純連」と書いて「すみれ」と読むのじゃなかったっけ? 今までずっとそう思いこんでたので、冷汗をかきながら Google で検索してみる。
All About Japan の記事によると 紆余曲折があったらしく。長男と三男がそれぞれ「じゅんれん」と「すみれ」をやっているそうな。複雑だなあ。
シーサーズ。なんでか恐怖漫画の企画会議。
その後山家。朝6時、山家から飲み会に参加する女の子あり。拍手(笑)
酔っぱらって何がなんだか、次元 (1次元2次元3次元・・・) の話など。 端から聞いていたら変な集団だと思われたに違いない。
Template-Toolkit 続き。
Template-Toolkit をいじっていて、なんだか動作がもっさりしているような気がしたのでベンチマークを取ってみる。
ベンチマークスクリプトは
#!/usr/bin/perl use Benchmark; use HTML::Template; use Template; use strict; my $prefix = $ARGV[0]; my %vars = ( test_val => join('', (0..9, "a".."z", "A".."Z")), test_loop => [ { val => 1 }, { val => qq|酒日記 | }, { val => "http://sake-nikki.dyndns.org/cgi-bin/index.cgi?rm=hogehoge" }, ], test_if => (rand > 0.5) ? 1 : 0, ); sub test_tt { my $tt = Template->new({ INCLUDE_PATH => "./", }); my $output; $tt->process($prefix. "test.tt", \%vars, \$output) or die $tt->error; } sub test_tp { my $tp = HTML::Template->new( filename => $prefix. "test.tp", global_vars => 1, die_on_bad_params => 0, ); my $output; $tp->param(%vars); $output = $tp->output; } timethese(100, { 'HTML::Template ' => \&test_tp, 'Template-Toolkit' => \&test_tt, });
こんな感じ。テンプレートは test.tt (Template-Toolkit用) が
test_val=[% test_val %] [% FOREACH l = test_loop %] val=[% l.val %] val_html=[% l.val | html %] [% END %] [% IF test_if %]true[% ELSE %]false[% END %]
で、test.tp (HTML::Template) は、
test_val=<TMPL_VAR name="test_val"> <TMPL_LOOP name="test_loop"> val=<TMPL_VAR name="val"> val_html=<TMPL_VAR name="val" escape="html"> </TMPL_LOOP> <TMPL_IF name="test_if">true<TMPL_ELSE>false</TMPL_IF>
これ。動作としては同等品。更に
を用意。
...
ベンチマーク結果
test.t[tp] HTML::Template : 0 wallclock secs ( 0.42 usr + 0.01 sys = 0.43 CPU) @ 232.56/s (n=100) Template-Toolkit: 2 wallclock secs ( 1.83 usr + 0.02 sys = 1.85 CPU) @ 54.05/s (n=100) large_test.t[tp] HTML::Template : 4 wallclock secs ( 4.74 usr + 0.01 sys = 4.75 CPU) @ 21.05/s (n=100) Template-Toolkit: 12 wallclock secs (11.85 usr + 0.08 sys = 11.93 CPU) @ 8.38/s (n=100) real_test.t[tp] HTML::Template : 1 wallclock secs ( 1.75 usr + 0.03 sys = 1.78 CPU) @ 56.18/s (n=100) Template-Toolkit: 5 wallclock secs ( 4.40 usr + 0.05 sys = 4.45 CPU) @ 22.47/s (n=100) huge_test.t[tp] HTML::Template : 267 wallclock secs (266.37 usr + 0.08 sys = 266.45 CPU) @ 0.38/s (n=100) Template-Toolkit: 139 wallclock secs (138.85 usr + 0.27 sys = 139.12 CPU) @ 0.72/s (n=100)
huge では Templat-Toolkit が HTML::Template を上まわるものの、それ以外では惨敗。 HTML::Template の圧勝。
両者ともに、一旦コンパイルしたテンプレートをキャッシュすることで高速化ができる (特に mod_perl 環境で有効) ので、キャッシュを有効にして再度ベンチマークを取ってみる。 具体的には、
my $tt = Template->new({ INCLUDE_PATH => "./", + COMPILE_DIR => "/var/tmp/tt/", + COMPILE_EXT => ".ttc", }); my $tp = HTML::Template->new( filename => $prefix. "test.tp", global_vars => 1, die_on_bad_params => 0, + cache => 1, );
としてキャッシュを有効にする。結果は以下。
test.t[tp] HTML::Template : 0 wallclock secs ( 0.24 usr + 0.00 sys = 0.24 CPU) @ 416.67/s (n=100) Template-Toolkit: 0 wallclock secs ( 0.71 usr + 0.02 sys = 0.73 CPU) @ 136.99/s (n=100) large_test.t[tp] HTML::Template : 3 wallclock secs ( 3.67 usr + 0.00 sys = 3.67 CPU) @ 27.25/s (n=100) Template-Toolkit: 3 wallclock secs ( 2.94 usr + 0.03 sys = 2.97 CPU) @ 33.67/s (n=100) real_test.t[tp] HTML::Template : 0 wallclock secs ( 0.65 usr + 0.01 sys = 0.66 CPU) @ 151.52/s (n=100) Template-Toolkit: 2 wallclock secs ( 1.30 usr + 0.02 sys = 1.32 CPU) @ 75.76/s (n=100) huge_test.t[tp] HTML::Template : 274 wallclock secs (274.28 usr + 0.01 sys = 274.29 CPU) @ 0.36/s (n=100) Template-Toolkit: 35 wallclock secs (33.95 usr + 0.24 sys = 34.19 CPU) @ 2.92/s (n=100)
簡単にまとめると、
というところでしょうか。HTML::Template のほうがシンプルな分、速度的には有利な感じ。 Template-Toolkit が明らかに高速だった huge_ は、実際の Web アプリケーションではまずありえない (特殊な) テンプレートだし。
長い間、PHP でページ生成 → wget で静的ファイルに落とす → 自作FTPクライアントでサーバに PUT、 という流れで酒日記を更新していたのだが。 やっと重い腰を上げて、PHP でページ生成している部分を Perl の CGI::Application + Template-Toolkit で実装しなおし。
昨日からぼちぼち進めて、ほぼ完了。
今回、いつも使っている HTML::Template ではなくて Template-Toolkit を使ってみたのだが、
<select> [% FOREACH per = per_loop %] <option value="[% per %]"[% IF per == article.per %] selected[% END %]>[% per %]</option> [% END %] </select>
こんなふうに、テンプレート側で条件分岐の条件を設定できたり、
<h3>換算酒量</h3> <table> [% USE autoformat(form => '>>>>>.<<', numeric => 'AllPlaces') %] <tr><td>エタノール換算</td><td><b>[% x = s.total_alc_sum / 1000; autoformat(x) %]</b> ([% x = x / s.days; autoformat(x) %] /day)</td></tr>
簡単な演算やフォーマットの設定ができたりで、非常に便利。
ただ、強力さにまかせてロジック (MVC モデルでいうところの M と C の部分) に絡むところをいじりだすと、
ヘタに作った PHP のようにメンテ不能に陥りそうだけど。
# ちゃんとルールを作って運用、制作しなくては。
連れ合いの友人の、結婚式二次会招待状葉書作製。MS-Word で。
最初は Star Suite でやろうとしたのだが、どうも印刷がうまくいかないので断念。
家には Word97 しかないが、別にそれでも問題はない。 ただ、葉書印刷ウィザードの郵便番号欄が5桁だったのにはちょっと笑った。 7桁になったのって、ずいぶん前のような気がしていたのだけど。
'97 って、5年前だ。
酒日記2周年。多謝。