2012年12月4日火曜日

子育て日記:エバーチェンジング興味

 長男の最近の興味は昆虫と組み立て系だ。少し前までのあの戦隊モノブームは1年で消滅しつつある。
 今年の夏にカブトムシを飼ってクワガタムシを採って、それ以来昆虫図鑑を毎日のように読んでいる。もう冬だから虫がいないのに、、。来年の夏までには一旦消失して、また復活する可能性が高いと見た。
 あと、レゴとか何かを組み立てるのは好きみたいだ。2〜3歳の頃はブロックとか積み木とかにほとんど興味を示さなかったのに、いつの間にか最近は放っておくとレゴで武器を作ったり、乗り物を作ったりして遊んでいる。
 僕も小学生時代は昆虫も組み立ものも大好きだったし、やっぱり男の子は自然にそうなるんだろうか。不思議な感じがする。
(あ、次男はもちろんお兄ちゃんのマネをしてレゴで遊んでいる。食べものが大好きなこと以外は長男と路線は同じ)


2012年11月4日日曜日

なぜExcelの条件付き書式は分かりづらいのか考えてみた。

 仕事でExcelを使い始めてからかれこれ15年以上になろうか。ちょっとしたデータのまとめ(計算と資料化、視覚化)には日常的なツールとして最も利用頻度が高いのだが、条件付き書式だけは使い慣れない。そう、偶数行と奇数行を塗り分けたり、完了したタスクの行だけ灰色にしたりする「あの機能」である。
 日常的に使う機能ではないものの、少なく見積もっても年に5〜6回は使うし、それだけやってれば自然に覚えられるはずが、毎回うまく動かずネットで答え探しをすることになる。シェルスクリプトとか他のスクリプト言語の場合、使用頻度はもっと少ないが身体に染み込んでいるのかあまり苦労することがない。
 なぜExcelの条件付き書式は分かりづらいのか?
・表計算ソフト特有の「表面的に見えるデータ」と「裏で持つ式や書式」の相違が直感的にわかりにくいこと。
・関数の場合は、インプットとアウトプットが明確なので頭で理解しやすいが、条件付き書式はインプットの範囲とアウトプットの範囲がわかりにくいこと。
・そもそも表計算ソフトはシート全体の範囲が不明確で、セルという最小単位でデータを扱うこと。入力データを総体として扱いたくても、結局入力したデータのセルを利用者が識別しながら個別に扱うしかできないこと。
→だから仕様書作成ツール、文書作成ツールとして使うような不思議な人達がいるのであろうか。

2012年10月4日木曜日

映画「スケッチ・オブ・ミャーク」を見た

 今日は朝から健康診断で午後はお休みだったので、東京都写真美術館で映画を見てきた。「スケッチ・オブ・ミャーク」という沖縄の宮古島の伝統的な唄を主題にした音楽ドキュメンタリーでした。
 この映画の目的は後継していくのが困難な状況にある宮古島の音楽をなるべく有りのまま残すこと、またその音楽を世の中に知ってもらうことです。これら二つのねらいは見事に達成されていると思います。
 音楽を文字で表現して伝えることは難しいのですが、北米のゴスペルとブルース(70年ぐらいまで?)のような生活と切り離せない土着の音楽といった印象を持ちました。ライ・クーダーが沖縄本島より南に行ったような感じとでも言えばいいのか。
 とても良くできたドキュメンタリーなので、伝統音楽の紹介でありながら、決して見るものを飽きさせない趣向が音楽的にも映像的にも凝らされています。

2012年10月3日水曜日

島田和夫さん急死

解散した憂歌団のドラマーだった島田和夫さんが昨日お亡くなりになりました。
大学時代にはなんどか憂歌団のライブは見に行きましたが、近所のお兄ちゃんたちが奏でるブルースは身近な存在でありながら心が震えるバンドでした。いつでも再結成してくれそうな期待をしてたからショックですね。
私にとっては大阪の誇りの一つだった憂歌団。木村のボーカルだけでもダメ、勘太郎のギターだけでもダメで花岡、島田の4人でボチボチゆるーくやってる雰囲気が良かったということか。今にして思えば。合掌。

2012年8月25日土曜日

筒井康隆著「旅のラゴス」を読んだ。濃厚傑作一人旅小説。

 1986年刊行の筒井康隆のSF小説。文庫本で約220頁。主人公ラゴスの50年に渡る旅行記。
 初めて読んだが傑作であることは間違いない。文章が必要十分な情報のみから構成され、余計な説明や描画がない、とても濃厚な小説である。これまで読んできた小説が国語の教科書だとすれば、この小説は数学の論文と思わせるレベルのドライで引き締まった文章である。
 また、SF小説に分類されているが、サバイバル、冒険、旅、人類史、など様々な要素が詰まっている。強いて言うならば「旅に人生をかける男の小説」という感じか。一人旅の経験者には迷わず推薦できる。
 筒井康隆の小説をよく読んだのは高校生時代で最後に読んだ「パプリカ」以来の約20年ぶりだったが、こんな本に遅ればせながら出会えてラッキーだったと思う。他の本も読みなおして見よう。

2012年8月15日水曜日

アメリカ出張(1996/08-09)

記憶の断片

テーマ

はじめての海外出張でカリフォルニアに行った。アメリカ本土訪問は4度めだった。

時期

1996年8月15日頃〜9月5日頃。当時私は29歳。

覚えていること

  • 夏休みの帰省中いきなり当時の部長が実家に電話してきて「夏休み明けからシリコンバレーに研修に行ってもらう。」と連絡があった。目的はデータウェアハウス用のDBMS製品の研修に出て技術を習得し、日本で評価すること。
  • 私はデータウェアハウスについて全く知識がなかったので行きの飛行機の中で資料を読んでいる状態だった。「こんな状態でしかも英語の研修なんてわかるはずないのに、、」と思っていた。
  • 同行したのは、入社当時からの関西弁の上司と別部署の先輩の二人。関西弁の上司には滞在中に相当振り回された。というか、時差ボケに付き合わされて真夜中にテープレコーダー片手に研修内容の復習会をするのは正直やめて欲しかった。しかも、結局「昼間聞いてわからんことは夜聞いてもわからん!」とのことで、夜中にさみしがりやの上司の付き合いをしているだけであった。(この製品は評判が良くてその後にけっこう本格的なビジネスになったが。。)
  • 研修先の会社があったのは、ロスガトスという住宅地で、ロスガトスロッジというホテルに滞在した。研修先の赤レンガの建物までは毎朝徒歩で移動した。
  • 英語での研修は、約2週間ちょっと続いた。最初の2日ぐらいは営業向けのトレーニングで、とても早口の英語でついていけなかった。ただし、後半は技術者向けのトレーニングで英語がわからなくても、やっていることはあまり難しくなかった。(一番わからなかったのは、マシン実習の際に口頭で伝えられたアカウント名とパスワードだった。これを英語で尋ねるのが一苦労だった。情けない。)研修にはアメリカ東海岸やメキシコ、ヨーロッパなどいろいろな国の人が参加していたが、技術系の人は国籍に関係なく同じような内気な雰囲気を持っていることが印象的だった。
  • 研修会場には常時コーヒー、パン、クッキーなどがあり、いつでもつまんでも良いというのがとてもアメリカ的でカリフォルニア的だった。
  • 研修の合間に会社の研究所に立ち寄って同期の友達に会ったり、スタンフォード大学に行ったりして少し楽しいこともあった。
  • 小学校の時に訪問したロスアンゼルスの友達の家に電話してみたらお母さんが出て友達はサンディエゴの海軍で働いているとのことで、週末にサンディエゴに飛んだ。野球を見に行って、駐車場でバーベキューをした。さらに友達が仕事をしている時間帯に国境を超えてメキシコのティファナに数時間行ってみた。ティファナは物騒な雰囲気で、裏道を歩いていたら私の前にいた青年がいきなり若者二人にハガイジメにされた財布を抜かれていた。この時はさすがに驚いた。ティファナはアメリカの若者がハメを外しに行く場所(メキシコは20歳から酒が飲めるが、アメリカは21歳からという理由で)で観光するようなところではないと知ったのは後のことだった。
  • そういえば、タイガー・ウッズという天才ゴルファーがもうすぐプロデビューするとのことで話題になっていたのを思い出した。ドジャースにいた野茂投手も当時はホットな話題だった。
1:アメリカ合衆国 〒95030 カリフォルニア ロス・ガトス ロス・ガトス=サラトガ・ロード 50
2:アメリカ合衆国 カリフォルニア サンディエゴ
3:メキシコ バハ・カリフォルニア ティフアナ
4:アメリカ合衆国 〒95030 カリフォルニア ロス・ガトス ロス・ガトス=サラトガ・ロード 50

2012年8月14日火曜日

カリフォルニアの夏休み(1978/07-08)

記憶の断片

テーマ

小学3年生ごろアメリカから一人転校してきた。近所に住んでいたこともあり仲が良くなったが、その後けっこうすぐに帰国してしまった。5年生の時に夏休みの40日間ずっとアメリカにいた。

時期

1978年7月20日頃〜1978年8月30日頃。当時私は11歳。

覚えていること

  • 初めての海外で見るもの聞くこと全てが目新しいことばかりで、カリフォルニアのスカッとした気候は喘息持ちの私にもすぐに慣れることができた。気候的には私がこれまで体験した中で、カリフォルニアが1位、大連が2位だ。
  • 友達の家にいるときはほぼ毎日レドンドビーチで泳いでいた。毎日飽きもせず海で泳いだり、カニをつかまえたり、とにかく楽しかった。
  • 当時まだ日本で上映する前だった(かな?)スターウォーズをドライブインシアターで見て感激した。友達に通訳してもらっていたが、英語なんてわからなくても十分に楽しめた。
  • アメリカ特有のゴムのような菓子やはじけるキャンディーなどもの珍しいかったが、これが食べ物??という違和感の方が強かった。
  • YMCAのキャンプに4〜5日ぐらい参加したが、東洋人は僕達だけでまわりの子供達やリーダーから珍しがられた記憶がある。
  • 旅の途中で家族と合流してラスベガス・グランドキャニオンに行った。グランドキャニオンに行くときのセスナが怖かったこと!
  • なんかサンフランシスコで金門橋を見た記憶もある。フィッシャーマンズワーフで食事した。
  • ロサンゼルス在住の友達とはその後私が社会人になって1996年にサンディエゴで再開をはたした。お調子者の山下くん元気にしてるかな。

1:アメリカ合衆国 カリフォルニア ロサンゼルス
2:アメリカ合衆国 ネバダ ラスベガス
3:アメリカ合衆国 〒86023 アリゾナ Grand Canyon,, Village Loop Rd, Grand Canyon
National Park, グランド・キャニオン国立公園
4:アメリカ合衆国 カリフォルニア ロサンゼルス
5:アメリカ合衆国 ハワイ ホノルル

2012年8月12日日曜日

中国東南部の旅(1996/12-1997/01)

記憶の断片

テーマ

96年の年末にひょんなことから(当時の部長の命令で)2週間も休みを取らされた。急だったので、以前北京を訪れて印象の良かった中国に行って見ることにした。

時期

1996年12月20日〜1997年1月3日。当時私は29歳。

覚えていること

  • ほぼ何も覚えていないが、インドのような刺激的な旅ではなかった。日本人旅行者とも全く会わなかった。
  • 外国人として周りからジロジロ見られたり、気を使ってもらったりすることが全くなかったのは初めてのことだった。中国語が喋れなくても全く外国人と思われないのが不思議だった。旅行中はすべて筆談で事足りた。
  • 温州で現地の民宿みたいなところに格安で泊めてもらうことになったが、部屋に入ってから外国人であることがわかり、外国人向けの営業許可がないから泊められないと謝られた。なんていうか、普通に日本人同士なんかと同じ感覚でコミュニケートできることがわかる。
  • 不思議なぐらい何を食べたか覚えていない。まずかったこともないのだが、取り立てて美味しくもなかったんだと思う。(中国南方の食事は僕の好みじゃないのかも。)
  • 厦門はなんだか暑く、埃っぽい都市だった。
  • 2回めの中国はこんなものだったが、2000年の秋から仕事で頻繁に北京や上海などを訪れるようになり、どんどん中国への印象が良くなっていった。
1:中華人民共和国 上海
2:中華人民共和国 浙江省 寧波市
3:中華人民共和国 浙江省 温州市
4:中華人民共和国 福建省 福州市
5:中華人民共和国 福建省 廈門市
6:中華人民共和国 上海

2012年8月8日水曜日

シベリア鉄道の旅(1990/7-8)

記憶の断片

テーマ

ほぼ記憶の彼方にあった旧ソビエト連邦の旅を思い出してみる。シベリア鉄道で一緒だった日本人とか誰かに見てもらえることはほぼないだろうが。

時期

1990年7月下旬〜1990年8月中旬。当時私は23歳。

覚えていること

  • それまでアメリカしか行ったことがなかったが、初めてついたアジアの街は北京だった。空港を出て市内に出るタクシーの中で白樺林を見ながら妙に親近感を覚えた。直感的にこの街に自分は何か縁があると思った。予想は的中して2004年から北京駐在になったわけだが。
  • シベリア鉄道(北京〜モンゴルのルート)の食堂車は中国、モンゴルではご当地の食にありつけて悪くなかったのだが、ソビエトに入ると毎日ボルシチと酸っぱいパンばかりでいい加減いやになった。
  • 当時のソ連は末期の時代で激しいインフレと物不足でどこの街に行っても買い物のために市民が行列をなしていた。
  • たしかヤロスラブリでだったと思うが、街で行列に出くわしてロシア人に紛れて買ったヨーグルトと牛乳の中間の飲み物はうまかった。ちょっと舌がしびれる感じで絶妙だった。暑い国では飲むのはヤバそうだが。
  • 外国人は特別な通貨を使うために激しく物価が安かった。また、外国人が泊まるホテルにはなぜかモノがあふれていて、たらふく食べてウォッカを飲んでも150円ぐらいしかかからなかった記憶がある。
  • ロシア人には英語は通じなかった。モスクワでブルース好きの青年と話をした記憶がある。
  • サンクトペテルブルクではエルミタージュ美術館を見た。ピカソの絵を独り占めしたり、すごく贅沢な空間だった。でも、なぜか道路には信号がなく、道路を渡るのは命がけだった。(2004-2008年に住んでいた中国よりもはるかに危険だった。)

1:中華人民共和国 北京 朝陽区
2:モンゴル ウランバートル
3:ロシア イルクーツク
4:ロシア クラスノヤルスク地方 クラスノヤルスク
5:ロシア ケメロヴォ ノボクズネツク
6:ロシア ノヴォシビルスク ノボシビルスク
7:ロシア キーロフ ヤロスラブリ
8:ロシア モスクワ
9:ロシア サンクトペテルブルク
A:イギリス ロンドン

2012年7月27日金曜日

owari no kisetsu: レイ・ハラカミ一周忌

レイ・ハラカミ氏が突然お亡くなりになって今日で1年になる。
 生前に氏の音楽を熱心に聞いていたわけではないが、yanokamiで初めて聞いた時に受けた時のショックは大きかった。お亡くなりになった後に数枚のアルバムを買って聞き、あの時にうけたショックが何だったのかと考え、氏の音楽を聞くたびにやはり同じ衝動が続いているのでここに書き綴りたい。
 テクノや電子音楽についてはほとんど知識がなく、またアンビエント音楽とか前衛的な音楽についてもほぼ全く知識がないので、彼の音楽がどこまでがオリジナルなのか全くわからない。だが、個人的な感想としては、氏の音楽の印象は以下のとおりある。

1.リズムにワクがない
 氏の音楽はまずリズムを捉えるワクが異なるように思う。私が従来主に聞いてきた音楽であるブルース、R&Bからソウル・ミュージック、ロックやジャズ、ブラジル音楽など多種多様な音楽(うた)には基本的にリズムを形作る要素がどこか固定化されている(ドラム、ベース、リズム・ギターなど)のだが、氏の音楽の場合はそこに全くワクがない。これは氏がソロで作品を作っていることによるものかもしれないが、逆に私の聞いてきた音楽ではソロの場合に限ってリズムのワクがほとんど固定化されてしまっている傾向があった。また、リズムのワクがないにもかかわらず、音楽の流れを作るリズムはキープされており、奇をてらった前衛音楽のような音楽をぶつ切りにしてしまうこともない。だから、集中して音楽を聞く場合も「ながら聞き」のときでも常に心地よいように感じることができる。
2.メロディとフィルの振れ幅が大きい
 氏の音色は独特のクスミを帯びた陰影を感じさせるもので、私の大好きなジム・ホールのギターの音色を思い出させる。マッチに灯った火のように境界線が曖昧なボヤッとした感覚と煌めく炎のようなキラキラとした感覚の両方を感じさせる。また、メロディやフィルは時にオモチャのようなチープさを散りばめつつ、根幹には浮遊感という衣をまとった芯の強さ(時には厭世的だったりシニカルだったりもする)を持っている。つまり、リズムの上にのっかる部分はカラフルで巨大な振り子のように常に安定感を保ちつつ常に変化し続けるのである。

 つまるところ私にとってレイ・ハラカミ氏の音楽は、モノクロ映画のような既成の音楽のワクを完全に取っ払い、異なる次元で奏でられる未来の音楽を覗き見せてくれるタイムマシンのように感じる。そういう意味ではレイ・ハラカミは時を超越してしまったのだから1回忌なんてどうでもいいことか。

2012年7月24日火曜日

制約を楽しもう

人間というものはセルラーオートマトンみたいなものである。あるルールに従って物質が取り込まれ、化学的に変化し、排出される。あるルールに従って移動する。それ以上でもそれ以下でもない。コンウェイのライフゲームより少しルールが難しいかもしれないが。
 また、人間はなんだかんだ言ってもルールが好きな生物で、OSIのネットワーク階層モデルよろしく物質のルールの上に生物学的なルールや道徳的ルールや社会規範的ルールや親しい人間観の暗黙のルールのようなものまで作ってしまっている。
 なんだかちっぽけなセルラーオートマトンの上で、ちっぽけなルールを組み上げているだけなんだから、あまり物事がうまくいかないからといって真剣に悩む必要はないように思う。
 色々な制約を楽しもう。

・給料という制約
・小遣いという制約
・歳をとって物忘れが多くなったという制約
・子育てという制約
・何を食べてもあまり美味しくないという制約
・なにか最近目がよく見えないという制約
・ギターが上手に弾けないし、練習する時間もないという制約
・世の中のためになっている気がしないという制約
・牛丼屋が近所にないという制約
・海外に行きたいけど最近機会がないという制約
・忌野清志郎や高田渡が既にこの世にいないという制約
・肩と腰が痛いという制約
・プログラム言語を覚えてもすぐに忘れるという制約
・嫁さんに優しく接しなきゃと思う制約
・人一倍よく眠る家系だという制約
・ビールが飲みたいが、日常的に飲めるのは第三のビールだという制約

2012年7月21日土曜日

子育て日記:1号は空手初昇級、2号は会話可能に

ボーズ1号(5歳2ヶ月)は1年半ほど前から空手に通っていたが、先日ようやく昇給してオレンジ帯となった。幼稚園に入る前から通わせていたとはいえ、なかなか昇給しないので気をもんでいたがついに念願の白帯脱出を達成。昇級試験そのものは礼儀や簡単な型と組手だけなので比較的容易そうだったが、これまでの1年半は長かった。最初の1年は完全に遊びに行っているつもりで、本人がまともに空手をやることがわかりだしたのが最近のことでそれから少しずつ真面目に取り組むようになってきた。スロースターターだが、まずは1歩踏み出した感じである。
ボーズ2号(2歳1ヶ月)は目覚しく言葉を覚える時期になってきた。1ヶ月前は自分の希望を伝えるだけだったのが、今週は会話になりはじめた。昨日の夕食後のデザートタイムの嫁さんとの会話。
2号 :ねえ。どうしてオカアシャンのカステラは2号のより大きいの?
嫁さん:それはね。2号がさっきヨーグルトを飲んだからよ。
2号 :オカアシャンはビールを飲んだでしょう?
まともすぎる会話に隣の部屋で聞いていた僕は笑ってしまった。2号が論理的に言い負かすようになる日も近いのだろうか。頼もしい限りである。

吉田武著「素数夜曲-女王陛下のLISP-」購入

以前から相当気になっていた吉田武の数学書の新刊が出ていたのでついに買ってしまいました。約900頁の分厚い高い本(厚さの割には安いけど)です。
大学時代から図書館でよく読んでいたダグラス・ホフスタッター著「ゲーデル・エッシャー・バッハ」の現代版といった印象で、本書の後半はLISP(方言のSchemeの実装Gauche)を使って実際にコンピュータを使って実験できるようになっています。本を読む時間がないとか、分厚い本なので本棚が重みに耐えられないとか、お金がないとか、そんなことは関係なく衝動的に神の手によって買わされたようなものです。
 さっと見た感じは色々なエピソードが散りばめられており、ある程度の数学知識と関数型言語の知識があれば最初から読まなくても途中から部分的に読んでも十分に楽しめそうな内容です。そういう意味では結城浩の「数学ガール」シリーズとは違う読み方ができるでしょう。
 よし、夏休みの宿題として8月末までに読むぞ!

村上春樹著「アフターダーク」を読んだ。夜明け前。

2004年9月発表の約三百頁の長編小説。ある日の深夜から始発が出るまでの間に都会の真ん中で過ごす人々を描いたもの。
この作品はその後の「海辺のカフカ」や「1Q84」など逆順に読んだので「アンダーグラウンド」後のスタイルを模索する過渡期的な作品という印象を受けた。タイトルからしてジャズの曲名を使用しており、従来の村上春樹の立ち位置から始めて、少しずつダークなものや説明のつかない奇妙なことを散りばめて、最終的には薄っすらとした明るさのようなものを匂わせて終わっている。「アフターダーク」の意味が、深夜と早朝の2重のことを指していることが最後になってわかる。
 終盤の明け方のストーリー展開部分は無理に明るい方向にもっていっているような印象もあり、そういう意味でも「海辺のカフカ」への途中ステップだと考える。また、2005年発表の「東京奇譚集」と同じくこの頃の村上作品は安っぽく奇妙なことや偶然的なことを模索していた時期ではないかと思った。

2012年7月18日水曜日

人を率いる者の心得(備忘録)

私が社会人になったばかりの頃の配属先のA部長は豪快な人だった。九州男児で、まさに侍のごとく、豪快に仕事をし豪快に酒を飲む人だった。汎用コンピュータの黎明期とも呼べる時代から常にプロジェクトの現場で過ごしてきていた。私が入社してからは、とにかく激しく燃え盛る現場を責任者として点々としている印象しか記憶にない。
 A部長は数年前に色々な無理がたたって退職することもなく鬼籍に入られたが、残された言葉の中で特に印象深かったのはプロジェクトリーダーの心得七箇条である。以下に個人的な備忘録として書くが、内容としては業界や組織の規模に関係なく人を率いる人にとって普遍的なものなので誰かの参考になるかもしれない。
  1. 危機感の共有
  2. 現場現物主義の徹底
  3. 少数精鋭
  4. 自己管理
  5. 数字への執着
  6. 攻めの姿勢
  7. 優しさと思いやり

2012年7月12日木曜日

ベーシスト松永孝義さん死去

本日、ベーシストの松永孝義さんが亡くなりました。享年54。
松永さんといえば私が大学生の頃にMute Beatのベーシストとして知りました。Mute Beatはトランペットの小玉さんを中心としたレゲエバンドでロック少年もかなり注目をしていた個性的なバンドでした。シンプルなインストゥルメンタル音楽の中に美しさと強烈なメッセージがあり、そのサウンドの最底辺にヘビー級の松永さんのベースが鳴っていました。神戸のライブハウスに見に行った時もジャージ姿でベースを演奏する求道者のような松永さんがとても印象的でした。その後、私の趣味はブルースの方に向かってしまったので松永さんのベースをあまり聞く機会がありませんでしたが、ずっと気になる存在ではありました。(今日まで知りませんでしたが「タカダワタル的」に出ていたそうですね。)合掌。

PowerShell+Google Mapで旅行ルート地図を作成

PowerShell覚え書き

背景

先日昔行ったインド旅行のことを書いていたらついでに地図も作りたくなりました。

お題

場所名のリストからGoogle Static Mapを使用して、旅行ルート地図を作成する。

$route=@"
place,country
ニューデリー,インド
アーグラー,インド
ジャイプル,インド
ウダイプル,インド
ボンベイ,インド
ゴア,インド
パナジ,インド
マンガロール,インド
コチン,インド
カニャークマリ,インド
トリバンドラム,インド
マドライ,インド
マドラス,インド
カルカッタ,インド
ダージリン,インド
カトマンズ,ネパール
ポカラ,ネパール
ヴァラナシ,インド
ニューデリー,インド
"@

function address2latlng($address)
{
    $encoded_address=[System.Uri]::EscapeDataString($address)
    $google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                            $encoded_address+"&sensor=false&language=ja"

    $enc = [System.Text.Encoding]::GetEncoding("utf-8")
    $bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
    $xml=[XML]$enc.getString($bytes)
    $xml.GeocodeResponse.result|
        %{ @{ lat=$_.geometry.location.lat;lng=$_.geometry.location.lng;address=$_.formatted_address} }
}

function browse-url($uri)
{
    $ie = new-object -com internetexplorer.application
    $ie.navigate($url)

    while($ie.ReadyState -ne 4){}
    $ie.visible = $true    
}

function get-label($num)
{
    #google Static Mapsではラベルは1ケタの英数字のみ
    $a = [char[]](([int][char]'0')..([int][char]'9'))
    $a += [char[]](([int][char]'A')..([int][char]'Z'))
    $a[$num % $a.length]
}

$route|
    convertFrom-csv|
    % {
        $ad = $_.place + "," + $_.country
        address2latlng $ad
        sleep -milliseconds 200 #アクセスが集中すると緯度経度が取得できないため
    }|
    % -begin {
        $pc=0
        $url="http://maps.google.com/maps/api/staticmap?size=1024x1024"
        $markers=""
        $path="&path=color:black|weight:3"
    }`
    {
        $pc++
        [char]$label=get-label $pc #場所番号からラベルを作成
        #マーカー設定
        $markers +="&markers=size:mid|label:" +$label + "|"+ $_.lat + "," + $_.lng
        #パス設定
        $path += "|" + $_.lat + "," + $_.lng
        #ラベルと地名出力
        $label + ":" +$_.address
    }`
    -end {
        $url += $markers + $path + "&sensor=false"
        browse-url $url
    }



結果

インド一周旅行(1990/12-1991/2)

1:インド デリー ニューデリー
2:インド ウッタル・プラデーシュ アーグラ
3:インド ラージャスターン ジャイプル
4:インド ラージャスターン ウダイプル
5:インド マハーラーシュトラ ムンバイ CritiCare Hospital Multispeciality Hospital & Research Centre
6:インド マハーラーシュトラ ムンバイ
7:インド ゴア
8:インド ゴア パナジ
9:インド カルナータカ マンガロール
A:インド ケーララ コーチン
B:インド タミル・ナードゥ カンニヤークマリ
C:インド ケーララ ティルヴァナンタプラム
D:インド 〒625022 タミル・ナードゥ マドゥライ・エアポート・ターミナル (IXM)
E:インド タミル・ナードゥ チェンナイ
F:インド 西ベンガル コルカタ
G:インド 西ベンガル ダージリン
H:ネパール 〒44600 カトマンズ
I:ネパール 〒33700 ポカラ
J:インド ウッタル・プラデーシュ ワーラーナシー
K:インド デリー ニューデリー



2012年7月10日火曜日

インド一周(1990/12/初旬-1991/2/中旬)

記憶の断片

テーマ

私は物忘れの激しい家系でもあるし、歳も歳なので昔のことは加速的に忘れていく。忘れる前に覚えていることを少しメモする。人さまに見せることではないかもしれないが、ひょんなことから興味を持つ人が将来出てくるかもしれないのでここに書く。
今回は昔行ったインド一周旅行(ネパール含む)のルートを書く。

時期

1990年12月初旬〜1991年2月中旬の約2ヶ月半。当時私は23歳。

ルート(時計と逆周りルート)

ニューデリー:エアインディアで夜中に着いて明くる朝起きたら道端に牛がいた。
→アーグラー:ジョンレノンが亡くなってちょうど10年だった。ニューデリーから乗った電車で強引に荷物を盗まれかけた記憶がある。
→ジャイプル:猛烈な下痢に襲われ駅のリタイアリングルームで3日ほど寝ていた。となりのインド人にタオルを盗まれてなぜか激怒した。
→ウダイプル:のんびりしていた記憶あり。
→ボンベイ:バックマージン目当てのホテルの客引きに激怒した。乞食多し。後ろから近づいてくる人は信用しないが、前からやってくる人を無条件に信じることにした。
→ゴア:90年のクリスマスは(アンジュナ?カラングート?)ビーチでパーティーに参加。これが後にゴアトランスと呼ばれていたとはつゆ知らず。アッパー系の音楽で異様な踊りをする西洋人に圧倒された。
→パナジ:運悪くキリスト教の街のクリスマス期間のためホテルもリタイアリングルームも見つからず街で声をかけられたインド人の民家に宿泊。ぼられた。日本人の一人旅の青年と同行。
→マンガロール:同じく日本人青年の同行して1泊。何もない街だから久しぶりにちゃんと眠れた。
→コチン?:違ったかな?怪しい。ケーララ州だったような。
→カニャークマリ:91年の初日の出を拝む。日本人多し。初日の出ツアーらしき日本人の団体はちょっと異様だった。ニューエイジ系だったかな。
→(トリバンドラム)コーバラムビーチ:なにか楽しかった記憶がある。こじんまりしたキレイなビーチでインド人たちがいなくて、日本人の若者や中年のカップルなど感じのよい人たちとの出会いがあった。なぜか帰国後すぐに梅田のレコード屋でばったりあった人もいたなぁ。そういえば南インドでは同じパターンで移動している日本人が多かった気がする。そうだ。日本から持っていった村上龍の「海の向こうで戦争が始まる」を読んでいたが、まさに湾岸戦争開始かその直前だったので感慨深かった記憶がある。
→マドライ:南インドの仏教寺院はインパクトがあった。
→マドラス:南インドのカレーは美味しかった。
→カルカッタ:マドラスからの列車は2泊3日だった。ボロボロになってサダルストリートにたどり着いた。蔵前仁一の本の世界が本当にそこにあった。大衆食堂で食べる普通の料理が美味しいことに気がついた。これが最大の収穫か。
→ダージリン:チベット文化というかチベット料理うまし。急激な気候の変化に耐えられず、けっこうきつい喘息にかかった。一人でホテルでいるだけでもつらかった。
ネパール国境の町:地名はなんだったっけ。たしかダージリンかシリグリからネパールのカトマンズまでの通しのバスチケットを買って、途中一泊が国境の街の最悪に汚いホテルだった。部屋に入ってあまりの汚さに驚き、蚊取り線香をつけたら狭い部屋の床に層になるぐらい(おそらく数百匹の)蚊が死んでもっと驚いた。汚すぎて眠れなかったのは後にも先にもこのホテルぐらい。サダルの安宿が高級ホテルに見えるレベル。
→カトマンズ:インド人不信からの開放の地。緊張感が途切れて逆に散財するぐらい。ボーダナートに自転車で行った。なぜか日本人の女性と一緒だったけど、女性とは縁がないはずなのに誰だったっけ?ネパールのダルバーツもうまかった。
ポカラ:景色最高。気候最高。ヒマラヤを見ながらジャーマンベーカリーでクロワッサンを食べた。神を信じたことはないが、ヒマラヤにはなにか絶対的な存在を認めざるを得ない迫力となにかに守られているような安らぎを感じた。その後の人生でもポカラ以外でそういう体験はない。
ヴァラナシ:一気にインドの喧騒の真っ只中にダイビング。客引き、野良動物、極悪インド人、普通のインド人、観光インド人、外国人、とにかく人だらけ生物だらけ。ガンガーには死体もあるし、一種の修行のような街とも言えた。でも、意外と楽しめた。ネパールで骨休めをしていたからか、旅の終盤だからかわからないけど、少し客観的に楽しんでいた気がする。バングラッシーを飲んでも効き目なしだった。相性の問題か。
ニューデリー:ふりだしの街。オールドデリーに行ってスパイスを買った。帰国前にルピーをすべて使い果たしたのに、飛行機が突然キャンセルされ急遽ホテルを延泊したが、お金がなくてボールペンと小型電卓を売りに行った。なぜか私は機嫌が悪く、メインバザールにあるホテルの屋上から下に向かって人参を投げていた。なんで怒ってたんだろうか。たぶん最後にやっぱり悪徳インド人にだまされたんだろうな。でも、人参はどこで入手したんだろう。謎だ。

1:インド デリー ニューデリー
2:インド ウッタル・プラデーシュ アーグラ
3:インド ラージャスターン ジャイプル
4:インド ラージャスターン ウダイプル
5:インド マハーラーシュトラ ムンバイ
6:インド マハーラーシュトラ ムンバイ
7:インド ゴア
8:インド ゴア パナジ
9:インド カルナータカ マンガロール
A:インド ケーララ コーチン
B:インド タミル・ナードゥ カンニヤークマリ
C:インド ケーララ ティルヴァナンタプラム
D:インド  タミル・ナードゥ マドゥライ
E:インド タミル・ナードゥ チェンナイ
F:インド 西ベンガル コルカタ
G:インド 西ベンガル ダージリン
H:ネパール  カトマンズ
I:ネパール  ポカラ
J:インド ウッタル・プラデーシュ ワーラーナシー
K:インド デリー ニューデリー

2012年7月2日月曜日

高田渡さん宅で泊めていただいたこと

ここ数年ときどき夜中に高田渡さんの歌が聞きたくなる。レコードもCDも持っていないので毎度Youtubeの映像を探して見ている。昨日もそんな感じで毎度のごとく「ブラザー軒」や「生活の柄」などの名曲を聞き、いつもどおり感動に浸った。こんなに心に響く日本語の歌を優しく力強くユーモアたっぷりに唄える人はいないなぁと。昔のことを思い出したのでメモしておく。
私が大学を卒業をした頃はバブル経済の全盛期で私のように大学を卒業して海外を放浪している者でも簡単に就職できてしまう時代だった。内定をもらったあと約3ヶ月インド放浪の旅に行き、帰ってきて会社に行くまでの2ヶ月ぐらいの間にたまたま兄の作成する映画撮影の手伝いのようなことをやっていた。(たしか91年2〜3月頃。)吉祥寺を舞台にし、ほとんど素人だけで作った映画だったが、兄が吉祥寺の飲み屋でよく見かける高田渡さんに交渉して出演してもらうことができた。地味な白黒映画だったのでほとんど世に知られることはなかったが、渡さんは気に入ってくれ本人のライブのMCでもジョークたっぷりに映画の紹介してくれたりした。主人公の父の役で映画の途中で死んでしまう設定だったが、照れながらも真剣に演技をして本当に実に良い味を出していた。
映画の撮影が一段落して編集に入る前だったと思うが、一度渡さん宅に兄弟二人で泊めてもらったことがあった。吉祥寺ののろで飲んで盛り上がってしまい、最終電車も出てしまったので渡さんが「うちに来たら良い。」と言ってくださり三鷹にあるおうちにうかがうことになった。(Youtubeでなぎら健壱氏が高田渡さん宅に行って一緒に歌っている映像があったが、同じアパートだと思う。)記憶がおぼろげだが、3人で夜更けまで飲み井の頭公園で散歩をしたりして三鷹のアパートについたのは夜中の3時前ぐらいだったと思う。私は途中で力尽きて寝てしまったが、完全にできあがってしまっている渡さんは家でも焼酎を飲みギターを弾いたり(ギターも本当にうまい)バンジョーを弾いたり、と全く眠たそうな素振りも見せず、そのまま朝が来て焼酎の牛乳割りを飲んでいるのを見た時にはさすがに驚いた。酔いが回ってくると、「そうはイカのキン☓☓」とか「固形物を食べなくてもちゃんと☓☓☓が出るんだよ」とかシモネタばかりだったのだが。。
そういう渡さんもその後はテレビCMに出たり、リバイバルブームがあったり、体調を崩され入院したり、いろいろとあり早くお亡くなりになったが、昨今の原発問題や経済問題に対する日本のイカれてしまった状況をもしも高田渡さんが生きていたらどのように嘆いたかと深く思う今日この頃である。

2012年6月25日月曜日

Powershellで2点間の距離計算

PowerShell覚え書き

背景

 個人的お遊びです。地球上の2地点間の距離を計算してみたくなりました。

お題

 地球上の2地点について、Google Geocoding APIで住所から緯度経度を取得し、その距離(キロメートルとマイル)を計算して表示する。

param( [String]$address1="関西国際空港",[String]$address2="北京国際空港")

$radius = 6378.137 #地球の赤道半径(単位:キロメートル)

function address2latlng([String]$address)
{
    $encoded_address=[System.Uri]::EscapeDataString($address)
    $google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                            $encoded_address+"&sensor=false&language=ja"

    $enc = [System.Text.Encoding]::GetEncoding("utf-8")
    $bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
    $xml=[XML]$enc.getString($bytes)
    $xml.GeocodeResponse.result|
        %{ @{ lat = $_.geometry.location.lat; lng = $_.geometry.location.lng; address = $_.formatted_address} }
}

function sin($r){[math]::sin($r)}
function cos($r){[math]::cos($r)}
function acos($r){[math]::acos($r)}
function d2r($d){ $d /180 * [math]::pi } #degreeからradianに変換

function distance($latlng1,$latlng2)
{
    $x1 = d2r $latlng1["lng"] ;$y1 = d2r $latlng1["lat"]
    $x2 = d2r $latlng2["lng"] ;$y2 = d2r $latlng2["lat"]

    $delta_x = $x2 - $x1
    $radius * (acos ( (sin $y1) * (sin $y2) + (cos $y1) * (cos $y2) * (cos $delta_x) ) )
}

$l1 = address2latlng $address1
$l2 = address2latlng $address2
$d = distance $l1 $l2

$l1;$l2;
$d.ToString() + "km"
($d/1.609334).ToString() + "mi"


結果

    Name Value
    ---- -----
    address 日本, 〒549-0001 大阪府泉佐野市泉州空港北1 関西国際空港
    lat 34.4348875
    lng 135.2443930
    address 中華人民共和国 北京 朝陽区 首都国际机场 (PEK)北京首都国際空港 (PEK) 邮政编码: 100621
    lat 40.0753910
    lng 116.5921350
    1763.70556211725km
    1095.92263763597mi


メモ

  • 2点間の距離についてはこのページを参考にしました。この計算は地球が完全な球形と仮定している(今回は赤道半径を使用)ので、実際とは誤差が出るそうです。(極半径は赤道半径より約21km小さいので、計算結果は極に近づくほど実際より少し大きめになる)
  • 関西国際空港と北京国際空港の場合にはマイレージ表とほぼ一致するのですが、成田国際空港と北京国際空港ではけっこう(10マイル以上)誤差が出ました。計算の誤差なのか、マイル計算が前提とする空港の緯度経度がgeocoding apiの結果と違うのかは不明です。おそらく後者なんでしょうね。(数10mから1km以下のような短距離については特に誤差が確認できなかった。)
  • 距離計算の式を完結にするために三角関数のラッパー関数を定義しましたが、単純に[math]の関数を呼び出しているだけなので冗長な気がします。javaのimportのようなやり方はないものか。
  • 手元のマシンではdistance関数1回あたり2.3msかかっている。遅いが、[system.math]の問題か。


2012年6月20日水曜日

Geocoding APIで緯度経度を取得

PowerShell覚え書き

背景

 完全に時代錯誤かもしれませんが、これまで個人的にWEB APIと無縁でした。遊びはじめたら色々とあるので、とりあえず基本的なことからメモしておきます。(本当はGoogle Mapsで色々やってみたいのですが、時間がかかりそうなので。)

お題

 Google Geocoding APIで住所から緯度経度を表示する。

param( [String]$address="千代田区北の丸公園")

$encoded_address=[System.Uri]::EscapeDataString($address)
$google_geocode_api_uri="http://maps.googleapis.com/maps/api/geocode/xml?address="+
                        $encoded_address+"&sensor=false&language=ja"

$enc = [System.Text.Encoding]::GetEncoding("utf-8")
$bytes=(New-Object System.Net.WebClient).DownloadData($google_geocode_api_uri)
$xml=[XML]$enc.getString($bytes)
$xml.GeocodeResponse.result|
    %{ "lat:"+$_.geometry.location.lat+" lng:"+$_.geometry.location.lng+
    " address:"+$_.formatted_address }
    


結果

lat:35.6905448 lng:139.7546424 address:日本, 東京都千代田区北の丸公園

メモ

 リクエスト送信は最初System.Net.WebClient.DownloadData(URI)でやっていたのですが、日本語データが含まれる場合にXMLへのキャストに失敗(XmlDocumentに変換できません。)したために上記の方法に変更しました。
 また、上記ではXMLで結果を受け取っていますがGeocoding APIとしてはJSON形式(推奨)でも受け取る事が可能です。PowerShell3ではJSON対応のコマンドレットが追加される予定ですので、いずれはJSONで実装したいと思います。

2012年6月19日火曜日

子育て日記:流血の日々

この1ヶ月ぐらいの間にボーズ2号(ほぼ2歳)が立て続けにケガをした。幸いどちらも大したことはなかったが、2歳でこうだと先が思いやられる。
 一回目は例によってお年ごろのイヤイヤの最中に私の部屋に泣き叫びながら入ってきて、飛び跳ねた拍子に机の角の尖ったところに眉間を強打し、どかっと流血した。7〜8ミリ程度の小さな切り傷であったが顔の目立つところなので幼児向けの大きな病院に連れて行ったが、傷の形がスパっと切ったというより凹んだような形なので縫うことができないとのことだった。このまま消えてなくなってくれれば良いのだが、最悪はブルースハープの名手リトル・ウォルターのような三日月傷になるかもしれない。喧嘩っ早い人間にならなければ良いのだが、、。
 二回目は一人で静かに遊んでいる時にいきなり「ギャー、イタイ、イタイ!」と叫びだしたのが発端だった。その時は嫁さんも私もどこが痛いのかよくわからずとりあえず泣き止んだので放っていたのだが、翌日になって片耳の穴が血だらけであることがわかった。どうも、プラスチック製のおもちゃの部品で自分の耳の穴をホジホジしていて、耳から抜くとき?にケガをした模様である。日曜日だったが、開いている耳鼻科を探して連れて行ってお医者様に見てもらったところ幸い鼓膜には別状なさそうという結果であった。ただ炎症を起こしているため現在も抗生物質を飲ませているところである。
 それにしても、ボーズ1号と比較しても2号は行動が大胆なので暫くは厳戒態勢の日々をこれからも敷かざるを得ない。やれやれ。よろしく頼むよ。ボーズ2号。

2012年6月15日金曜日

スポイルされないこと

縁があって今日は中学高校時代の同級生と卒業以来26年ぶりに会い食事をしてきた。私の人生の中でもこれだけ長いあいだ連絡も取っていなかった人と会うことは初めてのことであり、なにか書いておこうと思う。
 彼も私も6年間寮生活をしていた。全寮制の学校ではなく実家が学校まで遠い生徒だけが寮に入って、文字通り寝食を共にする生活だった。学校はスパルタ式教育などと呼ばれていた厳格な校風であり、学校生活も寮生活も当時としてもかなり尋常ではない厳しい(軍隊の時代にタイムトリップしたような)環境で育てられていた。誰でも1年に数回は先生や先輩に殴られていたし、そのようなことは日常生活の一部だった。ただ今にして考えると学校や寮の先生達は第二次世界大戦を直接経験した世代であり、我々生徒たちは戦時中の日本人が持っていたある種の美意識を教育されていたのかもしれない。
 6年間の途中で増えたり減ったりしたが寮の同級生は全部で15名ほどであり、多感な時代だから馬鹿なことも相当やったし趣味のことでお互いに影響を与え合っていたが、内心では1日も早く寮からも学校からも離れたいとおそらく全員が考えていただろう。(Jimi Hendrixの演奏が有名な)Bob Dylanの名曲All Along the Watchtowerの始まりが"There must be some kind of way out of here."だったが、まさにそういう心境で無限に続くかのような長い日々を送っていた。だから同級生たちは同じ戦場で戦った者同士のような結束感を持つと同時に、思い出したくない過去を背負わされていたんだと思う。
 そのような寮や学校での生活の中で得たことは人それぞれ違うだろうが、久しぶりに悪友とあって改めて認識したのは結局「けっして誰にも社会にも自分はスポイルされない」という信念を持って卒業したということである。長く生きれば当然山あり谷ありではあるが、そういうコアな部分は忘れないようにしたいと思う今日の夜でした。

2012年6月13日水曜日

Google Chart APIでQRコードを表示してみた

PowerShell覚え書き

背景

 GoogleのAPIを見ていたらChart APIというのが結構充実していた。世界地図とか各国の地図とかも表示できるらしい。今回はQRコードを表示してみました。こじんまりと。

param( [String]$uri="http://flyerback.blogspot.jp/")

$encoded_url=[System.Uri]::EscapeDataString($uri)
$google_chart_api_uri="http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl="+$encoded_url

$ie = new-object -com internetexplorer.application
$ie.navigate($google_chart_api_uri)

while($ie.ReadyState -ne 4){}
$ie.visible = $true    



結果

 新しくInternetExplorerが起動され、以下のとおり表示されました。


2012年6月12日火曜日

Powershellでお天気API(非公式)の使用

PowerShell覚え書き

背景

 iGoogleのお天気ガジェットで使用している非公式のgoogle Weather APIがあるということで、使ってみました。とりあえず、メモしておきます。

$location="東京都武蔵野市"
$encoded_location=[System.Uri]::EscapeDataString($location)
$google_weather_uri="http://www.google.com/ig/api?weather="+$encoded_location+"&hl=ja"
$xml=[XML](New-Object System.Net.WebClient).DownloadString($google_weather_uri)

"【場所】"
$xml.xml_api_reply.weather.forecast_information.city.data

"【現在】"
$xml.xml_api_reply.weather.current_conditions|
    %{ "気温:"+$_.temp_c.data+"度 "+$_.humidity.data+" "+$_.wind_condition.data+" 天気:"+$_.condition.data }

"【予報】"
$xml.xml_api_reply.weather.forecast_conditions|
    %{ $_.day_of_week.data+"曜日 気温:"+$_.low.data+"度~"+$_.high.data+"度 天気:"+$_.condition.data }

実行結果

【場所】
Musashino, Tokyo
【現在】
気温:16度 湿度 : 88% 風: 北 10 m/s 天気:弱い雨
【予報】
火曜日 気温:15度~22度 天気:雨
水曜日 気温:16度~24度 天気:雨の可能性
木曜日 気温:16度~24度 天気:ところにより晴れ
金曜日 気温:16度~26度 天気:ところにより晴れ


メモ

 $locationのところに指定している場所名はどこまで対応しているのか不明です。

子育て日記:時間感覚を覚える(戦隊モノ大好き幼児向け?)

ボーズ1号(5歳1ヶ月)は、どうも数字と時間に弱いように思うが、新たな方法で少し良くなってきた。
 1から100までを口頭で数えるのはだいぶ前からできていて、数字も100までは書けるのだが、「101」を書きなさいといってもうまく書けない。また、ずっと言っているが時間の読み方がわからない。3時(おやつの時間)と7時30分(見たいテレビの始まる時間)と9時(寝る時間)だけは読めるのだが、どうも形で覚えているだけである。おそらく、数字を知識としてまる覚えしているだけで数字の感覚というものがないようだ。
 そこで最近編み出した方法、必殺「あいぼう」である。現在テレビでやっている戦隊モノのゴーバスターズにはそれぞれのヒーローは相棒と呼ばれる機械とペアとなって活動する。うちの場合はキッチンタイマーを相棒として使用し、歯を磨くとき、ご飯を食べるとき、等々いろいろな場面で相棒と一緒に生活するようにさせたところ、時間感覚を覚え始めたようだ。また、だらだらご飯をたべることもなくなったし、今のところ効果絶大である。(でも、これって子供だましなのかなぁ。子供ってシタタカだからわかってるだろうなぁ。)
 偶然見つけたやり方とはいえ、このまま改善していってくれたら良いのだが。ま、要は子育てに銀の弾はないので、臨機応変に親も頭を絞ってやっていくのが大事ということか。

2012年6月11日月曜日

Powershellのスクリプトブロックと変数スコープに関する疑問

PowerShell覚え書き

背景

 先日PowerShellのクロージャを試してみましたが、結局スクリプトブロック内外の変数のスコープがいまひとつ腑に落ちなかったので少し検証してみました。結論は特にないのですが、自分のメモとして残します。

1.再帰呼出しでの階乗関数

function factorial1([int]$n)
{
    if ( $n -eq 1 ) {return $n}
    $n * (factorial1 ($n-1))
}

factorial1 5      # => 120
factorial1 100    # => 9.33262154439441E+157
factorial1 170    # => 7.25741561530799E+306
factorial1 171    # => +∞
factorial1 300    # => +∞
factorial1 998    # => +∞
factorial1 999    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 ごく普通の再帰呼び出し関数です。(末尾再帰になってません。)170!までは計算できましたが、[double]の精度を超えると無限大になりました。また、関数呼び出しの深さの最大値が1000までという制約があるために、998!より大きくなるとエラーが発生しました。

2.スクリプトブロックを使用した再帰呼出しの階乗関数

function factorial2_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $script:f}
        $script:f = $script:f * $i
        factorial2_helper ($i-1)
    }
    &$block $n
}

function factorial2([int]$n)
{
    $script:f=1
    factorial2_helper $n
}

factorial2 5      # => 120
factorial2 100    # => 9.33262154439441E+157
factorial2 170    # => 7.25741561530799E+306
factorial2 171    # => +∞
factorial2 300    # => +∞
factorial2 498    # => +∞
factorial2 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 スクリプトブロックにして、結果を保持する変数fを使うようにしました。関数をまたがって参照するので、変数fはスクリプトスコープです。また、関数呼び出しはスクリプトブロック化することで2倍に増えています。

3.クロージャに変更

function factorial3_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $script:f}
        $script:f = $script:f * $i
        factorial3_helper ($i-1)
    }.GetNewClosure()
    &$block $n
}

function factorial3([int]$n)
{
    $script:f=1
    factorial3_helper $n
}

factorial3 5      # => $null
factorial3 100    # => $null
factorial3 170    # => $null
factorial3 171    # => $null
factorial3 300    # => $null
factorial3 498    # => $null
factorial3 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 単純にクロージャにしたところご覧の通りエラーとなります。直接の理由はスクリプトスコープである変数fが参照できないためなんでしょうが、なぜクロージャの場合には同一スクリプト内なのに変数参照ができないのか不明です。

4.グローバルスコープに変更

function factorial4_helper([int]$n)
{
    $block={
        param($i)
        if ( $i -eq 1) {return $global:f}
        $global:f = $global:f * $i
        factorial4_helper ($i-1)
    }.GetNewClosure()
    &$block $n
}

function factorial4([int]$n)
{
    $global:f=1  #ここはscriptスコープでも結果は同じ
    factorial4_helper $n
}

factorial4 5      # => 120
factorial4 100    # => 9.33262154439441E+157
factorial4 170    # => 7.25741561530799E+306
factorial4 171    # => +∞
factorial4 300    # => +∞
factorial4 498    # => +∞
factorial4 499    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 変数fのスコープをグローバルにしたらさすがに動きましたが、クロージャにしてもグローバル変数を直接さわっているのでナンセンスです。(もともとあまり意味はないんですけど。)

5.結果を持つ引数の追加

function factorial5_helper($i,$res)
{
    if ( $i -eq 1) {return $res}
    $res = $res * $i
    factorial5_helper ($i-1) $res
}

function factorial5($n)
{
    factorial5_helper $n 1
}

factorial5 5      # => 120
factorial5 100    # => 9.33262154439441E+157
factorial5 170    # => 7.25741561530799E+306
factorial5 171    # => +∞
factorial5 300    # => +∞
factorial5 997    # => +∞
factorial5 998    # => 呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。
 スクリプトブロックをやめて末尾再帰になるようにしましたが、実測した感じではどうも末尾再帰の実装(ジャンプ)にはなってなさそうな雰囲気でした。

結論

 クロージャから参照・更新可能な変数スコープはやっぱりわかりません。スクリプトスコープの変数でも参照できないことがあることということで、難しいですね。

2012年6月10日日曜日

100分de名著「変身(カフカ)」を見た

NHKのテレビ番組でフランツカフカ著「変身」を観たのでメモ。

1912年にプラハで執筆された短編小説(日本語でも約110頁)である。番組ではカフカの人物像や当時の出来事を明確にすることで、なぜこの不思議な小説が名著となったのかを明かしていく。
カフカは小説家として暮らしていたのではなく、大都会に住む裕福なサラリーマンであり、仕事の傍ら小説を書いていた。趣味と言うにはかなり本格的だが、晩年病気をするまでずっとそのスタイルを続けていた。しかし、小説の内容はどれも夢も希望もなく、ひたすら現状から逃げたいとか自分の欲することが永遠に実現されないといった所謂「絕望モノ」ばかりであった。もちろんハッピーエンドでもない。しかも、リアリズムな表現ではなく、荒唐無稽なあり得ないような設定で物語を構成する。
番組では結局カフカは全く希望のない完全な絕望を描くことで、読者の共感を誘ってきたのであり、自分の持つ弱さを理解することで普通の人には気がつかないようなことも気がつくことができるのだというようなことを結論づける。
私なりの観点で書く。現在の日本は戦後の好景気を支えた世代も既に引退し、経済、社会ともに混迷を極めており、自分がどうなっていくのか見えない漠然とした不安を抱えた時代である。このような時代にはいったいどのようなストーリーが有効なのだろうか。
1.現実逃避、日和見主義型のイージーなハッピーな世界
2.仮想現実や仮想組織の世界に身を委ね、現実とは別のその檻の中に住まう世界
3.戦後日本人のように燃える意思を持ち世界に立ち向かう世界
だいたいの場合はこのいずれかのように考える。しかし、カフカの場合には新しい価値観を提供しているように思われる。ある意味でチープなトリックに見えてしまうぐらいの迷いや絕望の世界を作ることで、自分の持つ人間性をありのままに再認識させているのである。私の経験でいうとインドの放浪旅というのと似ている。


2012年6月8日金曜日

PowerShellのイベント処理

Powershell覚え書き

背景

Powershellでイベント処理ができないかと思い実験してみた。実際にやりたいことは、例えばログ解析処理をする常駐型のスクリプトがあった場合に、入力元のファイルが定期的に切り替わったり、定期的に集計結果を出力したい場合に常駐プロセスに対して、切り替わりのイベントを伝える手段がないかということです。

お題

Powershellにeventというものがあるので使ってみた。
function loop
{
    while ($true) {
        write-host("Runnnig..")
        sleep 1
        if ( !$running ) {break}     
    }
    write-host("out of loop!!")
}

$running = $true

#タイマーイベント登録
$timer = New-Object System.Timers.timer
$timer.interval = 10e3 #10 seconds
#$timer.enabled=$true
Register-ObjectEvent -InputObject $timer -EventName Elapsed `
    -SourceIdentifier Timer_test -Action {write-host("Timer Elapsed:");$global:running= $false} >$null
$timer.start()

#ループ
loop

unregister-event timer_test

簡単に解説

 タイマーイベントを10秒毎に発生させ、フラグ($running)を使ってメイン処理のループの処理を止めさせようとした。 

結果

 とりあえず動かせたが、変数のスコープで強引なことをやらないといけなかった。メインの処理もイベントの処理も確かに動いているのだが、イベント側で実行しているローカルスコープやスクリプトスコープで$runningを$falseに設定しても、メインの処理には反映されなかった。とりあえず、globalスコープとしたが、反則かなぁ。
 ネットの情報を見てもこんなことをやっている例が見つかってません。どなたかまともなやり方をお分かりの方がいらっしゃれば情報いただけると幸いでございます。

2012年6月5日火曜日

PowerShellのパイプライン処理の並列性

PowerShell覚え書き

背景

ここ数週間PowerShellを少し触ってみて、動作中になにか違和感を覚えた瞬間が何度かありました。どうもパイプラインとプロセス/スレッドの対応関係が関連していそうなのでミニ検証をしてみます。PowerShell3にはワークフローや並列処理の記述が増えるということなので、まだシンプルなうちに根本的なところで理解を深めておきたいと思います。おそらく同じような検証をやっている人はたくさんいるでしょうけど、ネット上で検索してもうまく見つからなかったので。

パイプライン処理の並列性

UNIXのシェルスクリプトの場合には複数のコマンドをパイプラインでつなぐと、各コマンドのプロセスが起動され複数のデータを並列的に処理しますが、PowerShellではどうでしょうか。例えば、以下の処理時間は何秒でしょうか。
1..3|%{sleep 1;$_ }|%{sleep 5;$_}
これはUNIXの場合には約16秒(=1+5*3)なのですが、PowerShellの場合にはMeasure-Commandで実測すると約18秒になりました。
えっ、嘘でしょうと私も疑ったのですが、結果から見る限りそれが正しいようです。つまりPowerShellの場合にはパイプライン部分が並列的に処理はなされていないということになってしまいます。
例えば、データA、B、Cに対して処理ステップ1、2、3を実行するとした場合(各ステップの処理時間が同じ長さで、集約処理はしないと仮定)を図で表すとこういうことです。

想定:

=====================>時間
A1 → A2 → A3
_____B1 → B2 → B3
__________C1 → C2 → C3

実際:

====================================>時間
A1 → A2 → A3
______________B1 → B2 → B3
____________________________C1 → C2 → C3


追加検証

それでも信じられないので以下も試してみましたが、確かに上記の通りでした。また、さらにbegin,endの実行タイミングも想定と異なりました。
function step([int]$num,[int]$interval)
{
    begin{
        write-host((&"get-date").tostring() +" start(" + $num.tostring() +")")
    }
    process{ 
        write-host ((&"get-date").tostring() +" step(" + $num.ToString() +") " +$_ + " |")
        sleep $interval
        write-host ((&"get-date").tostring() +" step(" + $num.ToString() +") " +$_ + " V")
        "[" + $_ + "]"
    }
    end {
        write-host((&"get-date").tostring() +" finished(" + $num.tostring() +")")
    }
}

("A","B","C")|step 1 3| step 2 2 | step 3 1 
実行結果
2012/06/05 21:26:04 start(1) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 start(2) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 start(3) #=>beginは最初にまとめて実行される
2012/06/05 21:26:04 step(1) A |
2012/06/05 21:26:08 step(1) A V
2012/06/05 21:26:08 step(2) [A] |
2012/06/05 21:26:10 step(2) [A] V
2012/06/05 21:26:10 step(3) [[A]] |
2012/06/05 21:26:11 step(3) [[A]] V
[[[A]]]
2012/06/05 21:26:11 step(1) B |
2012/06/05 21:26:14 step(1) B V
2012/06/05 21:26:14 step(2) [B] |
2012/06/05 21:26:16 step(2) [B] V
2012/06/05 21:26:16 step(3) [[B]] |
2012/06/05 21:26:17 step(3) [[B]] V
[[[B]]]
2012/06/05 21:26:17 step(1) C |
2012/06/05 21:26:20 step(1) C V
2012/06/05 21:26:20 step(2) [C] |
2012/06/05 21:26:22 step(2) [C] V
2012/06/05 21:26:22 step(3) [[C]] |
2012/06/05 21:26:23 step(3) [[C]] V
[[[C]]]
2012/06/05 21:26:23 finished(1) #=>endは最後にまとめて実行される
2012/06/05 21:26:23 finished(2) #=>endは最後にまとめて実行される
2012/06/05 21:26:23 finished(3) #=>endは最後にまとめて実行される

結論

PowerShellのパイプライン記号の処理についてはいわゆる複数プロセスや複数スレッドでの並列処理ではなく、単一スレッドによる逐次処理である(少なくともそうなる場合がある)としか考えられない。これは私としてはショックです。オーマイガー!アイヤー吃驚了!
当初はモナドシェルと呼ばれていたPowerShellのことですから、関数型言語固有の理由があるのかもしれません。どなたか誤りがあればぜひご指摘くださいませ。

2012年6月2日土曜日

数学部の思い出

一昨日、結城浩著「数学ガール/ガロア理論」を購入しまだ読んでないが、昔のことを思い出した。個人的なメモとして残しておく。

 私は中学高校6年間は寮生活を送っていた。一貫教育の学校に入っていていたためそれが中学時代か高校時代かも覚えがないのだが、スポーツも特に好きでなく基本的には帰宅部のようなものだった。それでも短期間だが2つのクラブ・サークルに関わった。
当時アップルⅡやPC-8001が発売されたばかりで、コンピュータ系のサークルが当時まだなかったので、寮の友人(淡路島出身)とコンピュータを少し知っている先生を巻き込んで新しくサークルを創立した。当然学校にはPCが1台もなく、代わりに親に買ってもらったポケットコンピュータを使ってのサークル活動だった。私としてはとにかくプログラムが動くだけで楽しい時代で無目的に遊んでいるだけだったので、友人と意見が合わず結局あまりサークル活動らしいことはしなかったと記憶している。ホームページによるとその後もそのサークルが残っていて、今ではプログラミング全国大会に出場して優秀な成績を残しているそうだ。
 もうひとつは、多少の問題があるかもしれないが既に時効になっているので書いておく。クラブの名前は「数学部」である。ある日、寮の悪友(尼崎出身)が部屋に来て私に言った。「サークル活動じゃ学校からお金が出ないんやけど、クラブ活動やったら毎年お金がもらえるらしいで。数学部はいまメンバーがおらんから、オレが部長になる。お前は数学ができるから部員になれ。活動なんかせんでええ。予算を山分けにして小遣いにしようや。」数学はできないが悪知恵だけははたらく友人である。私も「なんもせんでええんやったら」と思って部員になった。
 実際に部員になり部の予算が分かったが、たしか年間でたった3千円か5千円ぐらいだったように記憶している。(ジュースの一本ぐらいはおごってもらったかもしれないけど、)その金は当然悪友の懐に入った。それで終わりだったらまだ良かったのだが、後から判明した事実があった。それは文化系のクラブの場合に文化祭で出展する必要があるということである。それも、文化祭の3日ほど前にである。各クラブごとに教室をひとつ借りてそこに出展するのだから、それなりにテーマを決めて展示をしなければならない。時間もないし知識もないので、図書室にあったガロアの本(ブルーバックスだったかな?)を元にガロアをテーマにすることになった。とりあえず、僕は画用紙にマジックでその内容を書き写すことにしたのだが、文字だけの展示だと地味すぎるということで悪友はまたひとつひらめいたらしく、「そや。美術部に顔だけの石膏像があったやろ。あれを持ってきて「ガロア」って書いて貼っておこう。」ということになった。たしかギリシャ時代のヒゲモジャの中年男性の石膏像だったはずだが、まあいいだろうということで、美術室に借りに行き、教室の入口近くの机に仰々しく黒い布を引いてその上に石膏像を置き、悪友が紙に「ガロア」と大書した。数学部としてはこの石膏像を展示の中心に持ってきたのである。
 ところが文化祭ギリギリになって判明したのは、ガロアが20歳で夭折しているということだった。ショックだった。石膏像はどうみても20歳の天才少年からはほど遠いではないか。いまさら石膏像をどけるわけにも行かず、そのまま文化祭は執り行われたのだった。結果的にはマイナーな数学部の展示にはほとんど誰も来ず、たまに見に来た先生もガロアの石膏像には目もくれていなかった。幽霊部員ならぬ幽霊クラブの二人としては安堵したのだった。

 さて、これから「数学ガール/ガロア理論」をきちんと読もう。クラブ活動の一環として。

2012年5月31日木曜日

子育て日記:勉強が始まった。イヤイヤまっさかり。

ボーズ1号

  • ボーズ1号(約5歳)は相変わらず戦隊モノの日々だ。ゴーカイジャーからゴーバスターズに変わってすぐに落ち着くことを期待していたが、いまだに過去の戦隊モノのことのばかり考えている。
  • 昨年の夏頃からひらがなを書けていたが、文字のサイズも形もバラバラでほとんど読めたものではなかった。数カ月前から近所の塾に通わせ、毎日宿題をやるようになったら、かなりまともになってきた。要は、文字を構成する基本的な要素(縦棒、横棒、丸、曲がりなど)を書くことができていなかったということだ。手塚治虫もマルをうまく書けなくなった時に引退を考えたと言っていたはずだが、文字を書く前に線を書けなければダメだったのだ。
  • どうも数字に弱いように見える。言葉では1から100までと更に100以上も言えるのだが、3桁の数字は書けない。いまだ時計も読めない。論理的に思考することが、苦手なのかな。すこしずつ何とかしていこう。
  • しかし、私が小さい頃は幼稚園時代に文字も数字も習った覚えがない。全部小学校からだったように記憶している。下手に早く勉強をしてしまうと小学校に入った時にサボりぐせがついて、逆効果なんてことにならなければ良いが。ま、私も先生の話を聞くのは苦手(集中時間が極端に短い。興味があることに目移りする。)だったから、教科書を勝手に読んで勝手に理解しているようなことが多かったのでなんとかなるだろうが。

ボーズ2号

  • ボーズ2号はもうすぐ「魔の2歳」で反抗期まっさかりだ。とにかくお母さんへばりが強く、イヤイヤでよく泣くものだから嫁さんもいつも爆発している。
  • 言葉の方は順調に色々と覚えつつあるようで、お兄ちゃんの言葉をいつも真似ているし、「主語+目的語+述語」の形であれば少し希望を伝えられるようになった。助詞はまだ入らないが。日本語の発音は1号よりもうまい気がする。声が太いのもあるが、「し、ち、き」とか言えているように思う。(ただし、1号は2歳まで外国にいたので聴力が相当良いようだ。日本語にない発音をなんなくできたりする。)

2012年5月30日水曜日

東京奇譚集(村上春樹)を読んだ

2005年に刊行された村上春樹著「東京奇譚集」を読んだのでとりあえず感想文。

 5つの短編から構成され、共通することは以下のとおり。
  • 主人公の身の周りに起きた偶然や奇妙な出来事があり、それをきっかけに主人公が少し救われること
  • 必ずしも東京周辺を舞台としているわけではないが、主人公が東京居住者であること
 村上春樹としては何か完成形を作るための試行錯誤的な作品のように思われる。ただ、90年代以降テーマにしてきた物語による癒しというのが確実に形になってきている感触がよくわかり、現実世界を生きている読者としては心の癒しとまではいかないが、一種のリラックスした気分になれたのは事実。
 作者は「アンダーグラウンド」で現代の日本人はジャンクをかき集めて作った物語によって心のバランスを保つしかないのではないかといっていたのが、最近読んだ「海辺のカフカ」と同様に今作品もその延長上にあることが確認できた。今後の作品に更に期待していきたい。(1Q84をもう一度読みなおそうかな。。)
 また、作者が意図しているかどうか不明だが、短篇集の中に具体的な名前(人の名前、地名、曲名、などなど)や事象がたくさん書かれているので、読んでいる側は物語のどこかに自分とのなんらかの共通項(登場人物の名前や地名、年齢など色々な部分で)を見つけられる可能性が高い。そのため読者が(若干の)感情移入がしやすいという効果があるのではないだろか。著名に「東京」を付すことで想定読者を限定しているので余計に著者がそのような効果をねらったと考えるのは私の考え過ぎか。
 最後に「品川猿」が最も印象深く感じた。主人公は女性であるが、色々な点で不思議なほど私の個人的経験や最近身の回りで起きたことと符合しており、ストーリーはまさにジャンクなのだがなぜかストーリーに引きこまれ、適切なエンディングもあり、読んでいる間は現実世界と小説の世界がつながっているかのような感覚でした。

Powershellクロージャあり〼。その2

PowerShell覚え書き


お題

前回のブログでPowerShellのクロージャ機能を使ってみました。せっかくなので、バリエーションとして一つの環境(クロージャ)を複数の関数から共有するようなサンプルを作りました。(Paul GrahamのANSI Common Lispからのパクリです。)前回と同じくアキュムレータなのですが、リセット機能ありのバージョンです。
function Accum()
{
$i=0
$closure={
        $obj = New-Object PSObject
        
        $fn = { $script:i = 0 }
        Add-Member -inputobject $obj -membertype scriptmethod -name reset -value $fn

        $fn = {$script:i++ ;$i }
        Add-Member -inputobject $obj -membertype scriptmethod -name stamp -value $fn

        return $obj
    }.GetNewClosure()
    return &$closure
}

$a=Accum #疑似コンストラクタ

"stamp => "+$a.stamp()
"stamp => "+$a.stamp()
"stamp => "+$a.stamp()
"reset "+$a.reset()
"stamp => "+$a.stamp()
"stamp => "+$a.stamp()


実行結果は以下の通り。
    stamp => 1
    stamp => 2
    stamp => 3
    reset
    stamp => 1
    stamp => 2


メモ

  • 着想はGetNewClosure()はブロックの持つメソッドなので、ブロック内でオブジェクトを作って複数のメソッドを用意すれば環境を複数のインターフェース間で共有できるということです。
  • 関数Accum内でクロージャ定義だけでなく、&でのクロージャ呼び出しを返しているので、利用者側には一種のオブジェクトのように見え、メソッドの呼び出しもスムーズです。
  • クロージャを使うことでカプセル化ができたので、オブジェクト指向的な使い方ができますね。(誰かのブログでclass定義用のライブラリを作っている人がいましたが、クロージャを使ってたのかな。。)
  • ブロック内の変数のスコープの書き方が面倒な点は相変わらずです。なにかよい方法はないのか。


クロージャで面白いことがまだできそうです。どこかでもう少し他のサンプルを作りたいと考えています。

2012年5月29日火曜日

Powershellクロージャあり〼。その1

PowerShell覚え書き


お題

PowerShell2.0からクロージャ機能があるとのことで、アキュムレータを作ってみました。

function Accum([int]$init)
{
    $i=$init
    { $script:i++; $i}.GetNewClosure()
#    return { $script:i++; return $i}.GetNewClosure() #ちゃんとreturnをつけるとこうなる。
}

"`$i=" + $i #スクリプトスコープ

"Get Accumlator init=100"
$a=Accum 100

"call by `&"
1..3|%{ &$a }

"`$i=" + $i #スクリプトスコープ

"set `$i = 1000"
$i=1000
"call by `&"
1..3|%{ &$a }

"call by `."
1..3|%{ . $a }

"`$i=" + $i #スクリプトスコープ


実行結果は以下の通り。
    $i=
    Get Accumlator init=100
    call by &
    101
    102
    103
    $i=
    set $i = 1000
    call by &
    104
    105
    106
    call by .
    107
    108
    109
    $i=1000


メモ

  • クロージャ作成方法はご覧のとおりスクリプトブロックのGetNewClosure()メソッドの呼び出しです。
  • クロージャのブロック内で「$script:i++」とスコープを指定しているのは親ブロック側の変数を変更してやるためです。ただし、本当は親ブロックの変数なのでスクリプトスコープにする必要はないのですが、Set-Variableでやるのも面倒でこうしました。実行結果の通りスクリプト内で$iに値を設定しても影響を受けないので、クロージャ内の環境に保持されているはずです。
  • 「$a=Accum 100」で変数$aにクロージャを代入(変数を束縛?)して、その後そのクロージャを呼び出していますが、PowerShellの場合にその呼び出し方は2種類あるようです。
    1. 「&$a」 ヘルプのabout_functionsにはこちらが書かれていて、ネット上もそのようにやっている例が散見されました。一般的にはこちらを使用することが多いようです。(追記:&はローカルコンピュータ上のInvoke-Commandと同義で、スクリプト ブロックの文字列をコマンドとして評価または実行する)
    2. 「. $a」 いわゆるソース呼び出しなのですが、こちらも確かにクロージャとして動作しています。また、こちらの呼び出し方の場合にはクロージャのスコープが親スコープと同一となるようで上述したscriptスコープの指定がなくても動くみたいです。ソース呼び出しの場合にはスコープが変わるというのは言われてみればそうかもしれません。でも、クロージャのスコープ自体は不思議なものですね。


とりあえずクロージャが動くようなので、どこかでもう少し別のサンプルを作りたいと考えています。

関連記事

クロージャあり〼その2

加筆


  • クロージャという言葉を調べてみると、無名関数のことをクロージャと呼んだりしている場合もあり、上記の説明では「環境を含んだ関数」という意味で記述しているので厳密な意味についてはご勘弁を。
  • マーチン・ファウラーは無名関数にせよ環境込みの関数にせよ「意識しなくてもいいぐらいに手軽にクロージャを使えること」が大事だと書いていた。そういう意味ではPowerShellのクロージャは合格点がもらえるレベルかどうか疑問です。今のところ。
  • 2012年5月28日月曜日

    Powershellでアクセスログ統計作成(MSMQとジョブ版)その1

    Awk好き技術者の書いたPowerShell

    背景

     以前のブログでWEBサーバのアクセスログ統計を取るスクリプトを作成しましたが、処理時間の問題がありました。サーバログを1日単位等でバッチ的に処理をするのは時間的に厳しく、PowerShellが適用できない場合がありそうということです。今回はその続きとして発想を変えてみたいと思います。(なにもそこまでPowerShellに肩入れすることはないのですが、乗りかかった船なのでちょっとだけ。。)
    • バッチ処理ではなく、常駐型にする。(特に重い部分だけでも随時処理しておけば使用に耐えうる。)
    • 最近はWebサーバが複数台構成になることが多いので、WEBサーバでできることはそれぞれのサーバで処理する。
    • 最終的な集計結果をまとめる処理は別のマシンで処理する。
    • サーバ間のデータの連携はWindowsServerに標準搭載されるMicrosoftMessageQueuing(MSMQ)を使用する。
     ま、簡単に言うと個人的にMSMQとPowerShellのジョブの機能を使ってみたかっただけです。
     いきなり全部やろうとすると、うまくいかないので段階的に進めていきます。

    お題(ステップ1)

     シングルサーバ構成で良いので、MSMQを使ってプログラム間でログ的なオブジェクトを引き渡すようなプログラムを作成します。今回はログデータではなく単純なCSV形式のデータとします。基本的な流れは以下のとおり。
    1. MSMQ作成
    2. MSMQへのメッセージ送信
    3. MSMQからのメッセージ受信
    4. MSMQ削除
    [void][Reflection.Assembly]::LoadWithPartialName("System.Messaging")
    
    $quename=".\private$\SampleQueue"
    $musicians=@"
    name,part,type
    Joao Girlberto,Guitar,Genius
    U-Zhaan,Tabla,Well-Trained,
    Jeff Beck,Guitar,Genius
    吾妻光良,Guitar,Well-Trained
    Kassin,Bass,Talented
    Harry Hosono,Bass,No Type
    "@
    
    "==================================================================="
    if ([System.Messaging.MessageQueue]::Exists($quename)){
      "delete old queue"
      [System.Messaging.MessageQueue]::Delete($quename)
    }
    
    "create a new queue"
    $q = [System.Messaging.MessageQueue]::Create($quename)
    
    $q.SetPermissions("everyone", 
        [System.Messaging.MessageQueueAccessRights]::FullControl,            
        [System.Messaging.AccessControlEntryType]::Set)
    
    "==================================================================="
    $q2 = New-Object System.Messaging.MessageQueue $quename
    
    $msg = New-Object System.Messaging.Message "SampleMessage"
    $msg.label = "Sample Message"
    
    "Send Messages to MSMQ"
    $musicians|
        convertFrom-csv|
        % { convertTo-xml $_ }|
        % {
            $msg.body=$_
            "SEND: " + $msg.body.objects.object.property[0].innerText
            $q2.send($msg)
        }
    
    "==================================================================="
    function ConvertFrom-Xml($xml) {
        foreach ($object in @($xml.objects.object)) {
            $PSObject = New-Object PSObject
            foreach ($property in @($object.property)) {
                $PSObject |
                Add-Member NoteProperty $property.name $property.innerText
            }
            $PSObject
        }
    }
    
    "Receive Messages from MSMQ"
    $q3 = New-Object System.Messaging.MessageQueue $quename
    $ts = New-Object TimeSpan 3e7    # wait timer 3 seconds
    
    1..$q3.GetAllMessages().length |
    %{
        $rmsg = $q3.receive($ts)
        
        #[System.Xml.XmlDocument]$xml=$rmsg.body    
        $rmsg.BodyStream.Position = 0
        $sr = New-Object System.IO.StreamReader( $rmsg.BodyStream )
        [System.Xml.XmlDocument]$xml=$sr.ReadToEnd()
    
        ConvertFrom-Xml $xml
    }|
    ? {( $_.part -eq "guitar" )}|
    Select name
    
    "==================================================================="
    "Delete Queue"
    [System.Messaging.MessageQueue]::Delete($quename)
    
    

    ちょっとだけ解説

    • MSMQはOSのデフォルト(今回はWindowsServer2008)ではインストールされないので、機能の追加が必要ですのでご注意ください。
    • キューの操作はSystem.Messaging.MessageQueueの該当メソッドを使用するだけなので比較的簡単です。
    • 入力データであるCSV形式のヒアドキュメントをimport-csvで読み込んで、XMLに変換してキューに登録しています。オブジェクトをそのままシリアライズするような方法が見当たらなかったので。でも、こうしておけばサーバマネージャから直接キューの内容が見れるのでかえって良かったです。(JSONでもできそう。)
    • オブジェクトをXMLに変換するコマンドレットConvertTo-XMLはありましたが、受信時に必要となる逆の機能が見つからなかったので簡単な関数ConvertFrom-XMLを作りました。
    • すべてのメッセージを受信したあと、パイプラインでWhereやSelectをやってみました。具体的には、ヒアドキュメントで定義されたミュージシャンのうちギターに該当する4名の名前が表示されます。


    感想

    • MSMQの操作はあっけないぐらい簡単でした。ここれはスタンドアロン環境でやっていますが、複数サーバ間でもおそらく難しくないでしょう。
    • 一番苦労したのが、MSMQからのメッセージの取り出しの部分です。メッセージのボディ($rmsg.body)が$nullになってしまい、MessageQueue.FormatterとしてXMLやBinaryなどでやってもNGでした。けっきょく代替手段としてBodyStreamを使って読み込んでいます。何か良い方法はないのでしょうかね。
    • 今回は簡単なデータだったのでパフォーマンスのことは考えていません。
    • まずはCSVデータについて動いたので、次回はIISアクセスログで同様のことをチャレンジします。ただし、いつになるか不明ですが。

    2012年5月22日火曜日

    PowerShellでtail -fのようなことをやってみた

    PowerShell覚え書き

    お題

    PowerShellでUnix上のtail -fみたいなことができるかやってみる。(目的はログファイルの垂れ流し)
    param( [Parameter(Mandatory=$true)][String]$filename)
    
    $lines = (gc $filename).length
    gc $filename -wait |
        % -begin {$i=0} {if( $i -ge ($lines - 10)) {$_} ; $i++}
    
    

    解説

  • とりあえず最後の10行だけ表示して、そのあとGet-Contentの-waitパラメータでパイプラインを開きっぱなしにしました。
  • パイプライン処理のところでAWKの組み込み変数NRに相当するものがないので、変数でカウントしました。(この機能が本当にないのなら将来追加されることに期待。)

    結果

    動かしてみたところ、うまくいった!と思ったら、ファイルの最後の行が改行文字で終わっていないと無駄に空白行がはいってしまうことが発覚しました。(最後の標準出力の部分の問題かと思い、pipelineでOut-GridViewとかやってみてもダメでした。)
    Get-Contentがパイプラインで次に渡す際に自動的に改行文字を入れているように見えるのですが、そんな仕様なのか-waitのバグか微妙なところです。
    とりあえず、ログファイルの垂れ流しには十分なので、これでおしまい。
  • 2012年5月20日日曜日

    過去形ってなんや?

    自然言語のド素人が考えてみた

    背景

    shiroさんのブログを読んで、何年か前に中国語を学んだ時に引っかかっていた日本語での過去形とは何を意味するのか改めて考えてみました。自然言語については体系だった学術研究はされているでしょうが、私は完全に門外漢なので素人なりに考えてみたことを書きとめておきます。

    過去形に関する個人的な疑問点

    中国語の基礎で「了(le)」という表現を学んだ際に以下のような2通りの使われ方があると教科書にありました。(詳しくは、動詞の直後の場合と文末の場合で異なったり、意外性のニュアンスがあったりしますが、詳細は忘れました…というかサバイバルのための勉強だったので細かく覚えているはずがない。)

  • 状態の変化を意味する。
  • 動作の完了を意味する。
  • 中国語学習者にとって後者はいわゆる過去形なのでわかりやすいのですが、前者は多少わかりにくいニュアンスを含んでいます。例えば、「下雨了」というと「さっきまで降ってなかったのに今雨が降ってきた」という状態の変化を意味するという感じです。
    実際にいくつかの前者の例文があったのですが、不思議なことにそれらの例文を日本語に訳すといわゆる過去形になってしまうものがかなりあることに気が付きました。例えば日本語に訳すとこんな例文です。
    「明日の朝、雨が降ったらタクシーで病院に行こう。」
    「結局あの服は買わないことにした。」
    「トイレットペーパーがなくなった。」
    確かにこれらの場合は現在や未来のことを日本語でも「過去形」で表現しています。はて、どうしてだろうと思い始めたのがかれこれ8年前です。

    「よろしかったでしょうか?」に対する世間の批判

    自然言語は現実の世界で使用されている限り変化し続けるものなのですが、共通に使われる言語であるが故に急激に使用頻度が増えてしまった表現については批判的な意見が出てくるのが面白いところです。「日本語よ、お前も苦労してるな」と言ってあげたいぐらいに集団的アレルギー反応を起こすこともあります。(コンピュータ言語でもはやりのフレーズとかありそうですね。)
    数年前にコンビニ店員等によく使われるようになり、その後世の中の批判を浴び少しずつ頻度が減ってきている感がある「よろしかったでしょうか?」(例:お箸、一膳で〜。)という表現があります。批判された理由はこんな感じです。

  • 終わっていないことを過去形で言うのは気持ち悪い。
  • 謙遜したつもりかもしれないが、逆に他人に責任を押し付けているようで妙にイラツイてしまう。
  • 昔から一部では使われていた表現なのですが、確かにアルバイト社員が取ってつけたかのように言うと悪い印象を与えるようです。アルバイト社員が定形文句として言っているか、正社員がニュアンスを込めて言っているのかは言葉を聞く立場の人にはわからないという部分がそもそもの誤解のような気もします。

    仮説

    仮にですが、日本語の過去形表現も中国語と同じく、元来「状態の変化」を含んでいると考えても良いように思います。そうすれば、中国語の「了」と日本語の関係も素直に理解できるし、コンビニのでの「よろしかったでしょうか」も「何も購入していない → 購入する(お金を払うことで商品の所有権を得る)」の状態変化として理解できます。上記の幾つかではこの仮説が問題なさそうに思います。また、そのニュアンスを加えることによって話す側には「(状態変化を理解していることを相手に示すことで)丁寧に話している」意味を追加しているというのが最近のトレンドとなりつつあると。とりあえず、現時点ではそう仮定しておき今後また思い出したら検証したいと思います。

    -------

    追記

    日本語の過去形でよく使う例を思いついたので追加。「この中に☓☓な人がいます。さて、どの人でしょうか?」のようなクイズで答えを言う時に「答えはAさんでした!!」というように過去形で言うのは馴染みがあります。これは、答えが不明な状態から答えが確定した状態への変化と解釈できますね。やっぱり過去形って過去と言うよりも状態遷移を表すのかなあ。

    2012年5月19日土曜日

    Powershellで青空文庫から欲しい作品を一括取得する

    Awk好き技術者の書いたPowerShell

    背景

     最近は少し大人になったのか日本の古い小説を読みたいなと思うことがあります。中学高校時代にはもちろんある程度は読んでいたのですが、 元来国語が苦手だったので以降一切読んでませんでした。
     ということで、青空文庫からある作者の作品をダウンロードするスクリプトを書いてみました。
    param( [Parameter(Mandatory=$true)][String]$author)
    $aozoraListExt_SJIS_URI= "http://www.aozora.gr.jp/index_pages/list_person_all_extended.zip"
    
    function Unzip-Files([string]$zip,[string]$dest)
    {
        $shellApplication = new-object -com shell.application 
        $zipPackage = $shellApplication.NameSpace($zip) 
        $destinationFolder = $shellApplication.NameSpace($dest) 
    
        # CopyHere vOptions Flag # 4 - Do not display a progress dialog box. 
        # 16 - Respond with "Yes to All" for any dialog box that is displayed. 
        $destinationFolder.CopyHere($zipPackage.Items(),20) #zipファイルを指定のフォルダに解凍
    }
    
    function Download-AozoraFile([string]$uri)
    {
        $zipfile = [System.IO.Path]::GetTempFileName() |
            Rename-Item -NewName { $_ -replace 'tmp$', 'zip' } –PassThru
            #拡張子がzipでないとshell.applicationでエラーになるため拡張子変更
        $unzipDestination = $zipfile -replace '.zip',''
        mkdir $unzipDestination >$null
    
        (New-Object System.Net.WebClient).DownloadFile($uri,$zipfile)
        Unzip-Files $zipfile $unzipDestination
        gci $unzipDestination  |
            %{ cat $_.PSPath  -encoding String } #SJISからUTF8に変換
    
        rm -r $zipfile,$unzipDestination >$null
    }
    
    mkdir $author >$null 2>&1 #作者名でフォルダ作成
    "#全作品リスト取得中"
    Download-AozoraFile $aozoraListExt_SJIS_URI|
        convertFrom-csv | #作品リストの読み込み
        ? {($_.姓+$_.名 -eq $author) -and ($_.テキストファイルURL -match "^http.*\.zip$")} |
        % {
            $outputFile=$author + "\" + $_.作品名 + ".txt"
            Download-AozoraFile $_.テキストファイルURL > $outputFile
            $outputFile
        }
    

    解説

    • 青空文庫のサイトには全作品に関するcsvがダウンロードできるので、そのファイルから作者名で作品を絞込み、該当するテキスト版の作品ファイルをそれぞれダウンロードしています。
    • Powershellにはzip/unzipの機能がないために、Windowsの機能を使用しました。なんでないんでしょうね。
    • PowershellのconvertFrom-csvやimport-csvの制約として、文字コードがUTF8前提となっているのでSJISからコード変換しています。
    • 一時ファイルは[System.IO.Path]::GetTempFileName()で作成できましたが、一時ディレクトリは自分で名前を作りました。なにかよい方法がないかな。
    • 書き捨てのスクリプトなので異常系など考えていませんので悪しからず。


    感想

     苦戦したものの、メインのところはなんとか頑張ってパイプラインで処理するようにできました。(作品リスト取得以降は絞り込みやデータのダウンロードなどすべて並列に処理するので結構早いです。
     今回は作者名で作品のtxt版を一括ダウンロードしましたが、青空文庫の作品リストには作品や著者のカナや英名、底本に関する情報、入力者や公開日や作者の生年没年なども記載されています(もちろんXHTML版のURIもあり)ので、色々な使い方があると思います。
     あとOut-GridViewコマンドレット(PS3では拡張されているらしい)を使って作品一覧を表示したり、Write-Progressコマンドレットでダウンロード状況を表示したりできますが、いまひとつパッとした使い方が思いつかなかったので止めておきました。

    2012年5月16日水曜日

    Powershellのパイプライン処理の時間計測

    Awk好き技術者の書いたPowerShell

    背景

     先日、WEBサーバのアクセスログの統計解析のスクリプトを書いてみて、書き心地はなかなか悪くなかったのですがパフォーマンスがかなり問題になりました。
    とりあえず、続きにパイプライン処理の性能をざっくり把握したいと考えてちょっとやってみました。

    お題

     文字列を含んだファイルを開いて、パイプラインで渡す時間を計測する。用意するファイルは100万文字☓1行〜1文字☓100万行の数パターンとする。
    $maxSize= 1e6
    $file=".\test_" + $pid + ".txt"
    
    function test-performance([int]$length,[int]$repeat)
    {
        1..$repeat | %{ "Z" * $length } > $file
        $totalSec = (Measure-Command { cat $file | %{ $_ } > $null}).TotalSeconds
        "{0:###,###}文字×{1:###,###}行:{2:##0.00}秒 -> {3:##0.000}ミリ秒/行" -f $length,$repeat,$totalSec,($totalSec /$repeat * 1000)
        rm $file
    }
    
    for ($i = $maxSize ; $i -ge 1 ; $i /= 10){
        test-performance $i ($maxSize / $i)
    }
    

    解説

     評価の対象は { cat $file | %{ $_ } > $null}の処理時間。

    結果

    • 1,000,000文字×1行:0.01秒 -> 14.701ミリ秒/行
    • 100,000文字×10行:0.02秒 -> 1.731ミリ秒/行
    • 10,000文字×100行:0.03秒 -> 0.306ミリ秒/行
    • 1,000文字×1,000行:0.14秒 -> 0.142ミリ秒/行
    • 100文字×10,000行:1.17秒 -> 0.117ミリ秒/行
    • 10文字×100,000行:11.57秒 -> 0.116ミリ秒/行
    • 1文字×1,000,000行:112.65秒 -> 0.113ミリ秒/行
    • ※環境:Xeon E5506@2.13GHz ☓2プロセッサ、メモリ2GB、WindowsServer2008 SP1 (32bit)

    やってみてわかったこと

  • やはり1万件を超えるようなデータの読み込み&パイプライン処理については慎重に考えるべき。
  • (書き捨てのスクリプトのつもりが、遅くてチューニングに時間がかかってしまうなんてことになるかも。)
  • 上記計測の趣旨とは異なりますが、件数の多いテストファイルの作成には読み込み以上に時間がかかった。大量にデータを書き出す処理は更に要注意。
  • 2012年5月14日月曜日

    PowershellでWEBサーバのアクセスログ統計1

    Awk好き技術者の書いたPowerShell

    背景

     Windows環境で開発をしていると「こんなのUnix環境だったらスクリプトを書いてすぐなのになぁ。。」ってなことが時々あります。MS系OSもバッチ,WSH,PowerShellと変わってきて、PowerShell3.0では性能も相当改善されるので今後はいわゆるスクリプト言語として適用される場面も増えそうな気配がします。(ほんとうにyet another script languageですね!!)
     私はこれまでPowerShellをバッチファイルの代わりにしか使用していませんでしたが、今回はもっとUnix的な考え方で使ってみることにしました。
    たまたま最近IISのアクセスログ統計を作る機会があったのですが、その際はcygwin+bash+gawk+sedで終わらせてしまいました。今回はその雛形部分をPowerShell2.0で作ってみました。

    お題

  • IISのアクセスログからPV数をカウントする。画像ファイルやHTTPの戻りステータスが200だけを対象とする。結果は日本標準時の日付別で表示する。
  • bashとawkでいつもやっているパイプライン処理はなるべく変えない。
  • パフォーマンスはあまり期待しない。でも極力優先する。

  • $yesterday=(Get-Date).addDays(-1).ToString("yyMMdd") 
    $yesterdayMonth=(Get-Date).addDays(-1).ToString("yyMM") 
    $inputFiles=".\input\u_ex"+$yesterday+".log"  #IISのログファイルを指定する(ここでは昨日データ)
    
    #入力するアクセスログファイルのカラム名を配列として定義する。
    $fields=
    -split ("DATE TIME SV_NAME SV_IP METHOD URL_STEM URL_QUERY PORT USERNAME CL_IP U_AGENT HOST " + 
    "STATUS SUB_STATUS WIN32_STATUS TIME_TAKEN" )
    
    #カラム名の配列の逆引き用に連想配列を定義する。("SV_IP"→配列番号3みたいに。)
    $fieldIndex = $fields |% -begin{$i=0;$h=@{}} {$h.$_=$i++} -end{$h}
    
    #日時分秒を日本標準時に変換 
    function ConvertTo-JST
    {
        Process{
            $col=$_.split()
            $newDateTime=-split (Get-Date ($col[$fieldIndex.DATE] + " " + $col[$fieldIndex.TIME])).addHours(9).ToString('yyyy/MM/dd HH:mm:ss')
            $col[$fieldIndex.DATE]=$newDateTime[0]
            $col[$fieldIndex.TIME]=$newDateTime[1]
            $col -join " "
        }
    }
    
    #アクセスログからパラメータ指定されたカラムのみを選択し空白区切りの文字列として返す
    function Select-Columns
    {
        Begin{
            for ($i=0; $i -lt $args.length; $i++){
                if ( $fieldIndex[$args[$i]] -eq $null ){
                     #ここでパラメータチェックする(未実装)異常終了ってどうするの?
                }
            }
        }
        Process{
            $cols=$_.split();$new_cols=@()
            for ($i=0; $i -lt $args.length; $i++){$new_cols += $cols[$fieldIndex[$args[$i]]]}
            $new_cols -join " "
        }
    }
    
    #同一文字列でカウントし、結果を新しいカラムとして追加
    function Add-Counter
    {
        Begin{
            $count=@{}
        }
        Process{
            $count[$_] ++
        }
        End{
            foreach ( $key in $count.Keys){
                $key + " " + $count[$key]
            }
        }
    }
    
    #日別PV数レポート作成
    function Out-Report1()
    {
        $outputFile=".\report\SAMPLE_REP1_DAILY_PV_" + $yesterdayMonth + ".txt"
        (Get-Date).ToString() + " " + $outputFile
        
        #cat $inputFiles -ReadCount 1000|% {$_}| #1回あたりの読み込み件数を増やすと約10%早くなった
        cat $inputFiles |
            ? {$_.split().length -eq $fields.length}| #カラム数が合わない行は取り除く
            ? {$_.split()[$fieldIndex.URL_STEM] -notmatch ".*\.(gif|jpg|png|css|js)$"}| #抽出条件:画像ファイルやcss,js以外
            ? {$_.split()[$fieldIndex.STATUS] -match "^200$"}| #抽出条件:STATUS OKだけ
            ConvertTo-JST| #日時分秒を日本標準時に変換 
            Select-Columns "HOST" "PORT" "DATE" | #レポート対象項目の選択
            Add-Counter| #同一行で集計しカウンター(COUNT)を追加
            sort >>$outputFile
    }
    
    (Get-Date).ToString() + " Start"
    Out-Report1 #日別PV総数
    (Get-Date).ToString() + " Finished!"
    

    ちょっとだけ解説

  • ログファイルのフォーマット定義は最初の部分でグローバル変数$fieldsと$fieldIndexでやっている。
  • 統計のメイン処理は関数Out-Report1でパイプ処理でやっている。

  • やってみてわかったこと

    【良かったこと】
  • 若干表記の違いはあるけど、shellスクリプトの気持ちで書けた。PowerShellの流儀としてはログフォーマット定義はグローバル変数でなく、オブジェクトのプロパティ(Set-MemberでNotePropertyでやる)の方が自然なんでしょうが、やってみたらとんでもなく遅くなり結果的にベタな文字列処理になったのが少し不満なところです。でも、連想配列、配列、Begin、End、パターンマッチングなどはが自然にあり、楽しかったです。はい。
  • 枠組みとしてはできたので、ちょっと直せば以下の様な色々なパターンの統計もできますね。(実際にいくつかやりましたが、あまりこらなければどれも簡単)
    1. PV数の多いページのURLとそのアクセス回数
    2. 時間帯別や曜日別のPV数
    3. HTTTPStatusが400番台だったページの多かったものを表示(リンク修正漏れチェックなどで使用)
    4. 一日あたりのユニークユーザ数(クライアントIPやUSERNAMEから判断)
    5. ページ別のレスポンス時間(平均、最大、最小、標準偏差)
    6. PV数が多いブラウザの種類とバージョン(UserAgentで判断)
    7. PV数が多いOSの種類とバージョン(UserAgentで判断)
    【改善すべき点】
  • レスポンス性能がとても悪い。
    • 環境としては2年ほど前に購入したXeon E5506@2.13GHz ☓2コア、メモリ2GB、WindowsServer2008 SP1 (32bit)でやりましたが、結果は以下のとおり。
    • 入力ファイルサイズ150MB(55万件) → 処理にかかった時間3分40秒 ※Cygwin+bash+gawkでやったら10倍以上早かった。
    • 根本的原因はどうもGet-Content(=cat)の処理が遅いことパイプライン処理でのオブジェクトの引渡しが遅いことと文字列をsplitして判断していることのようで改善は難しいのですが、統計処理の初期データを作成するところを別にしてやり、不要データの削除(および、ブラウザやOSの種別の判断など)を事前にやっておけば、数十秒の応答時間になりそうです。事前処理はGet-Contentの-waitパラメータを使って、バックグラウンドジョブとしてリアルタイムに事前処理をやることもできます。(これはこれでおもしろそうですね。ジョブは他のマシンで動作させることもできるので複数台のWEBサーバで同時に動かすことも可能です。)
    • Windows8に搭載される予定のPowerShell3.0ではパフォーマンスは格段に良くなっているのでそちらにも期待しましょう。
  • グローバル変数の扱いが悩ましい。
    • ログファイルのフォーマットをグローバルスクリプトスコープの変数に格納しましたが、実際の統計処理のパイプラインの流れの中では表示項目を絞ったり、カウンタを追加したりして、フォーマットは変化します。Set-Memberでやればオブジェクトの属性としてもたせられるのですが、パフォーマンスが悪いのでそれも難しい。なにか他にいいやり方がないか思考中です。
     ま、個人的にいうと数万件以上のデータに対する逐次処理である程度の処理性能(数秒とか数分とか)を求めるのであれば、PowerShell2を何も考えずに使うのは今のところ少し厳しいかなという感じです。ただし、せっかく面白い機能が色々とあり、PS3での性能改善のこともあるので余裕があったら今のうちに色々と遊んでおくのは良いかなと思います。パイプライン処理は40年?も前から実装されている機能ですが、マルチコア環境の分散処理に向いていたりして今後もまだ有望な処理方式です。将来はパイプライン処理を使ってオンライン業務を構築する日なんかも来るかもしれませんしね。

    関連ページ

     パイプライン処理の時間計測で単純な文字列のパイプライン処理時間計測をやりましたので参考まで。
     パイプライン処理の並列性でパイプライン処理が並列に処理されていない(ことがある)ことを書きました。

    2012年5月13日日曜日

    ドナルド・ダック・ダン死去

    本日R&Bベーシストのドナルド・ダック・ダンが亡くなりました。享年70。しかも東京で。昨日までブルーノートで演奏していたとのことですが、急な知らせで驚きました。オー、ジーザス。
    私は高校〜大学時代に60年代から70年代のソウルやR&Bをよく聞いていました。その中でもスタックスレーベルといえば老舗中の老舗で、ダックダンのいたブッカーT&MG'Sをバックに歌うオーティスレディングは大好きでした。黒人のR&Bを世界に知らしめた彼らの功績は本当に偉大です。また、管楽器やスティーブ・クロッパーのギターと一緒に弾く彼のぶっといフェンダープレシジョンベース(弦を張り替えたことがないといいう逸話がありましたね。)の音は、最高にかっこ良いソウル・ミュージックの演出家だったと思います。ぶっとい音楽は永遠に不滅です。
    合掌。

    2012年5月10日木曜日

    Why I sing the blues

    40歳代中頃にもなってナゼに?

    こんにちは。tesです。
    30年前、私が中学生のころシャープのポケットコンピュータで初めてBASICのプログラムを書いて動いた時って本当にワクワクしました。 高校生になり、兄のエレキギターを勝手に借りてCCRのプラウド・メアリーのイントロをひけるようになった時も。 大学生になって大学間でインターネットがつながっていることを知り実際にマシン間でファイル転送ができた時も。
    その後もインドに行ったり、中国に住んだり、システムエンジニアをやったり、結婚して子供ができたり、ワクワクすることがたくさんあったわけです。

    でも、ふりかえってみたら持って生まれた性格か私はそういう初期衝動みたいな純粋なものを表現することを全くやって来ませんでした。簡単にいうとこれまでの人生はROM状態だったわけです。
    さあ、人生の後半戦、ボチボチそんなワクワクを残していきます。この文章を書いてブログに投稿されること自体が既にワクワクです。