FLAGS

筆者おかあつ 大きな区分 記事の区分 記事の一覧 検索 ツイート

2009年7月11日土曜日

今日はやりたいこと、全部やった (mixi05-u459989-200907110628)

ミクシ内で書かれた旧おかあつ日記を紹介します。
今日はやりたいこと、全部やった
2009年07月11日06:28
僕が好きな人にfugaさんという人がいる。 お会いした事はないのだけど、文章がムチャムチャうまくて短い日記なのにいつも面白い事を書く人だと思う。

この間こういう日記を書かれていた。

気の持ちよう
http://mixi.jp/view_diary.pl?id=1188504608&owner_id=7189913&comment_count=6

読んで、そういえばそうだよなぁ、という事を思った。



仕事がどうにも難しくてまた行き詰まってきている。 それであちこちの関連する記事を読みまくって頭がいっぱいになった。 今日も朝からそれ系の記事を読んで疲れてきた。

いつもだとこうやって「うーん」とうなったきり進まずコンピューターの前に座って煮詰まり、面白くない日記を書いては、「うーん」とうなり、何度も何度もメールチェックしてメールが来ていない事を確認しては「うーん」とうなり...という息抜きの合間に仕事をするとでもいうような本末転倒な状況になる。 だから、今日は煮詰まる前に出かけて食事に行こうと思った。


fugaさんの日記によると、「運がついている」と感じる人には法則があるのだそうで「やりたいと思った事はやる」とか「普段と同じことはしない」とか「今日は運がついているぞ」と念じるとかそういうようなことだった。 それが漠然と頭に残っていた。 今日は何も考えずにやりたいことをやろう、と思った。

大体僕は今バンコクにいる。 近代的な割りに異様に物価が安い国である。 多少ムチャをしても一日の生活費が3000円を上回る事はない。 それなのに僕は一日300円とかそういう切り詰めた生活をしている。 最安値の店を知り抜いてその店だけに集中して通っている。 人間、我慢しないといくらでも浪費をすると思う。 だからゆとりがあっても節約しないといけない、と思う。

しかし、これはある意味貧乏性ともいえる。 だから今日くらいは普段食べない店にドンドン入り、普段行かない場所にドンドン行こうと思った。

とりあえずおきてからはちょっとだけ技術系のドキュメントを読んだ。 それから出かけてあちこちに行った。

今日最初に行ったのは東急だ。 東急に行くためにはスクンヴィットどおりをわたらなければならないのだが、しかし今日はどういうわけかすさまじい渋滞だった。 ピクリとも動かない大渋滞だった。

そばによく見かけるおじさんがいて、「渋滞、渋滞」といっていたのが聞こえた。 それで思ったのだけど、これが雨が降ってきたときみんながよく言うセリフ「雨降り、雨降り」という言い方と同じだなと思った。思ったのだけど、この辺の人にとって渋滞というのは雨降りと同じ天候のようなものなんではないだろうか。 天候というものは人間の手では解決できない。 バンコクの渋滞は相変わらずまったく解決する気配も無いけど、タイ人にとって渋滞というのは天気のようなものなので、そもそも解決しようとか思ってないんじゃないか、とかそんな事を思った。

東急には実に庶民的な食堂がついている。 僕はここが好きだ。 ここでクワイティアオ(タイラーメン)を食べた。 また、ここには35バーツ(100円ちょっと)でスムージーが食べられる店がある。 35バーツで3種類の果物を選んでミキサーしてくれる。 この店はお勧めだ。

昨日はサイアムパラゴンでスムージーを食べた。 ここでは70バーツ(210円ちょっと)でスムージーを食べられる店がある。 70バーツというのは相当高い値段で、果物もちょっと良い果物を使ってしゃれた入れ物に入れて出てくる。 とはいえ東急のヤツと大差ないので、やっぱり東急のほうがお勧めだ。

しかし、まぁいずれにしても、日本で食べる半額かそれ以下だ。 僕はタイ人じゃなくて日本人なんだから好きなほうを食べればいい、ともいえる。 僕は普段普通のタイ人が食べないようなものは食べないようにしているし、タイ人と同じ感覚でいる努力をしている。 だがしかし、最近、とあるタイ人に「それは確かにえらいが、そこまでくると、もはやケチの領域に入りつつある」と評されたので、ちょっと考えを改めつつある。

食べ終わって、何も考えず、サイアムスクエアをブラブラしはじめた。 意識して普段行かない場所へ行こうと思った。 ま、とりあえず、7イレブンのサイアム店に行った。 ここも僕のお勧めである。 ここはつい最近出来たばかりなのだが、この店がすごいところは、焼き立てパンを売っている事だ。 この店はどういうわけかベーカリーがついてて、その場でパンを焼いている。 これが安い。 20バーツ(60円ちょっと)で焼きたてパンが食べられるのだ。

しかも、ここにはスタバばりの本格エスプレッソマシーンがおいてある。 このコーヒーがウマすぎだ。 しかも25バーツ(75円)なのだ。 75円でスタバばりのエスプレッソが飲めるというのは、革命的だと思う。

惜しむらくはこのセブンには当然席が無い事だ。 しかし向かい側がTRUEのインターネットカフェになっていて、窓際が段差になっているのだ。 この段差に座れる。 みんなここで座ってたむろしている。 ここでコーヒーを飲むのはひとつの贅沢だと僕は思う。 贅沢だけどパン・エスプレッソ合わせても200円以下で楽しめる。

ここに行った。 それからまたブラブラした。 サイアムスクエアというのは改めて見てみると実に面白い場所だ。 あちこちからスピーカーの音楽が流れてくる。 街全体がなんか遊園地のような雰囲気なのだ。 またすさまじい量の服屋が立ち並んでおり、それがまたなかなか手ごろな値段で売っている。 どうも僕は買い物に興味が無くていつも通り過ぎるだけなのだけど、今日はズンズン入って行った。 買わなくても雰囲気は楽しい。


サイアムパラゴンに行った。 今日はなんか円のレートがどういうわけか格段によくなっている事に気がついた。とりあえず両替した。 ムチャムチャ混んでた。 だけど待ち時間も気兼ねせず外に出てブラブラした。 向かい側にはアルファロメオの代理店がある。 中にかっこいい車がとまっていたのでこれを眺めた。 僕は車が好きだ。 その向かいにはフェラーリの代理店もある。 一台でマンションが10件ぐらい買える値段のかっこいい車が止まっている。 そうこうしていたら、銀行の係りの人がわざわざ呼びに来てくれた。 なんかちょっとうれしかった。

紀伊国屋にも入った。 ここは洋書を扱っているのだけど、この洋書がまた安い。 ここでブラブラしはじめた。 そうしたら僕が好きなカクミチオという物理学者のポピュラーサイエンス本の新刊が出ているのを見つけた。 これをゲット。 更に、僕にとって非常に重要な本=カクミチオの24次元・ワームホール・何とかかんとか、という本がペーパーバックで売られているのを見つけた。 僕はこの本を持っているのだけど、ハードカバーで持ち運びが便利でない。 これも買う事にした。 2冊で3000円ちょっと。 これも日本じゃこの値段じゃ買えないよな、と思った。 (そういえば、僕が初めてカクミチオの本を買ったのも日本の紀伊国屋だった。 紀伊国屋はカクミチオが好きなんだろうか。)

僕はカクミチオの本でラマヌジャンという数学者の話を知った。僕はラマヌジャンが大好きだ。 大変な天才数学者だけど、大変な貧しい環境にいたのだそうで、ラマヌジャンの話を読むたびに何か涙が出そうになる。

あとサイアムパラゴン内のマックカフェにも入った。 (僕はどうもコーヒーばかり飲んでいると思うが、コーヒーがすきなのだから仕方が無い)

なんかサウナに入りたくなった。 サウナに行くためには電車やバイタクを乗り継がなければならない。 普段だと我慢する場面なのだけど、今日は我慢するのを辞めることにしていたので、行く事にした。 節約するといっても、電車代75円・バイタク代60円、合わせても135円である。 それくらいの無駄遣い、いいじゃないか。

で、サウナに行った。 久しぶりだった。 久しぶりのサウナは実に体の芯まで効く。 すごくリラックス出来た。 サウナ代は540円ぐらいだ。

サウナから出て歩いていたらバイタクに声をかけられた。 「どこ行くんですか?」 大通りまで行きます、といって素早くバイタクに乗る。 いつもだとここから大通りまで30分排気ガスにまみれて歩くのだけど、我慢しない事にした。

この後プロンポンにある日本食に行ったのだけど、12時を回ってしまって、閉店してしまっていた。 で、スクンヴィットの行きつけのイサーン屋台に行って食事をした。 その後アラブ街に行って水タバコを吸って帰った。

今日はいい一日だった。



最近、何かよくいろいろな人に話しかけられる。 何なんだろうか。 僕はどう見たって日本人だし、いつも大きなかばんをしょってるし、どう見たってタイ人には見えないと思うのだけど、よくタイ語で話しかけられる。 歩き方とかそういう雰囲気で僕がタイ語が話せるのがわかるのだろうか。

それで、「あれ?タイ人じゃないですよね?」とか「タイ語下手ですね」とか言われる。 これはたぶんいいことだと思う。 「タイ語上手ですね」って言われるのは、あくまでも僕が外人に見えるのにタイ語が話せるのがものめずらしくて言われるのだと思う。 しかし下手ですね、っていわれるのは、あくまでもタイ人として話しかけられているからで、良い傾向だと思う。

タイで外人がタイ語を話すと、いきなり爆笑されたり、いきなりムッとされたり、いきなり無視されたり、いろいろな反応を受ける。(タイ人は外人好きだけど、タイ語が話せる外人は嫌い。) 最初のころはこれが慣れなくて、いちいち気分を害していたけど、最近はもう慣れた。 いろいろな反応を受けてもすべて無視するのがポイントだと思う。 あくまでもタイ人と同じ感じ良さで対応する。 相手がいくら感じ悪かろうが、タイ人として普通の「タイ的気遣い」を貫く。 すると「あぁこいつは外人じゃないのか」という風になって、普通にタイ人として対応してくれるようになる。

たぶん一番難しいのは、タイ人と同じ気遣いを保つ事だと思う。 これは、タイ語以上に大切だと思う。

たとえばこういうことがある。 タイ人は怒りを抑えられる精神力を持つ事がよい人の条件であるらしい。 これが慣れないとなかなか出来ない。 そういえば、タイの電車にはテレビがついていて年中コマーシャルが流れているのだけど、こないだその広告の中にこういうのがあった。

高級車を乗り回すお金持ちがいる。 そこにカブが走ってきてドアミラーと衝突、見事に破損、ドアミラーが道路に落ちる。 金持ち運転手、外に出てきてドアミラーを拾う。 そしてカブの運転手に歩み寄る。 恐れおののくカブの運転手。 すると金持ち運転手、怒鳴るかと思いきや、カブの後ろのゴミ箱にミラーを捨てて何も言わずに立ち去る。 金持ちの運転手は実は車の中で○○社のお茶を飲んでいた、というオチだった。 要するに 「○○社のお茶を飲むと気持ちが落ち着く」という広告だった。

これを見て思ったのだけど、とにかく何が起ころうとも怒りをコントロールできるというのが、大人のタイ人のあるべき姿であるようだ。 ちゃぶ台返し・激怒の文化である日本とは正反対だと思う。

だから、タイ人がどんなに無礼な事をしても、怒らないのが大切だと思う。 それがいかにタイ人の常識と照らしても大変な無礼である場合であっても、とにかく許して笑顔で対応することが大切ではないだろうか。

ま、でも、「あ、こいつ絶対あれ落とすぜ」「あ!落とす落とす!」「あーほらやっぱ落とした」みたいな無用心な失敗をする人は大勢いる。 そういう時はその人がその問題をやらかす前に、こちらから未然に対応しして防ぐようにする。 気がつかないでその人が失敗して被害をこうむったら、それは気がつかなかったこちらの責任と心得て、絶対にその人に怒らない。 まぁ怒っても絶対に責任は取ってくれないし、言ったら言っただけ気分が悪くなるだけで損だということもあるけど。

そんなことが大切であるような気がする。



もうねむいがこれだけは書こうと思う。

Javaのコアライブラリに String.intern() メソッドというものがある。 この intern 処理というのは、実はStringクラス以外でもものすごく大切な処理だということがわかった。

他にも CountDownLatch とか ReentrantLock とか ReadWriteLock とかいった、非同期処理用のライブラリの使い方も、だいぶ腑に落ちるようになった。 また fairness という大切な概念も理解した。

日本人でこれの使い方を100%理解している人って、果たしているんだろうか、と思う。 すごく大切だけど、これらの使い方を日本語で説明しているのをあまり見た事が無い。

FileLockは かなり危なげのあるオブジェクトだという事もわかった。 このオブジェクトは出来れば使わないほうがよさそうだ。


きちんと頭に問題をインプットする事は大切だ。 だけど、リラックスしないで詰め込むだけだと、理解に到達しない。 理解に到達しないと、応用が思いつかない。

きちんと散歩して、サウナに入ったりしてリラックスして、頭が働く状況を作る事は、ものすごく大切だと思った。

日によってプログラミングがはかどったり、はかどらなかったり、いろいろあるけど、プログラミングがうまくいくかどうかは、実はパソコンの前に座ったときにすでに結果が出ているような気がする。

パソコンの前に座るまでの過程が大切なんだと思う。

もう少し推敲してから寝たいけど、今日はもう疲れたので、寝ようと思う。おやすみなさい。
コメント一覧
おかあつ   2009年07月11日 15:09
intern 処理をするときに切っても切れない縁にあるのが WeakHashMap だけど、これは原理的に言ってそのままストレートに使う事は出来ない。ストレートに使うとどうしてもレースコンディションという難しい問題が発生する。 これは設計の悪さではなく、原理的にそういうものだからだ。レースコンディションを防ぐためには、どうしてもきちんとガベージコレクタと同期を取りながら処理を行う必要が出てくる。 これが難しい。

WeakReferenceについて
http://d.hatena.ne.jp/Ewigkeit/20080823/1219463052

この人が一秒待つとうまくいく、といっているのがまさにそれだ。

そのためには WeakHashMap がやっているように 自分でキューを管理しなければいけない。 その方法とは... (続く)
おかあつ   2009年07月11日 17:11
わかった、謎が解けた。

1. ガベージコレクタはおそらく別スレッドで動いている。
2. System.gc() は ガベージコレクタを開始するのみ。
3. ReferenceQueue の poll() メソッドは その時点で expunge 処理すべきWeakReferenceがあればそれを返す。 無ければ null を返す。
4. ガベージコレクタは別スレッドで動いているため、gc() を呼び出した後すぐにpollをチェックするとレースコンディションが発生する。 poll() はタイミングによって null を返すときもあり、非nullを返す事もある。

だから

5. 確実にデータを受け取るために remove メソッドがある。 こちらはデータが来るまでブロック(待ち)が発生するため、null は返らない。
おかあつ   2009年07月11日 17:18
ひとつだけ思うのだけど、この事、どこにも書いてない。 英語版のドキュメントも含め、APIドキュメントにはさわりがサラっと書かれているだけで、それがいったいどうやって使われるものなのか何も書いてない。

WeakHashMap のソースを読んで解析した。
おかあつ   2009年07月11日 17:33
1. remove() も poll() も 待つか待たないかの違いだけで どちらもキューからオブジェクトの削除を行う。
2. Deque の peekのようにキューから削除せずにチェックだけ行う事は出来ない。
3. remove(0) は remove() と同じ動作を行う。 つまりオブジェクトが見つかるまで無限にブロックする。
4. remove(1) は ほぼ poll() と同じ動作となる。
おかあつ   2009年07月11日 17:34
よーし! 長年の謎が解けてすっきりした! さて! 食事に行くか。
おかあつ   2009年07月11日 19:05
上の話は 要するに intern処理用のキャッシュを WeakReferenceと ReferenceQueue を使って作ればよい、という話なのだけど、これはつまり自作のWeakHashMap を作るのと等価だと気づいた。

すぐに思いつくのは WeakHashMap とすることなのだけど、これだと WeakHashMap 自体が参照を持ってしまうため、WeakHashMapとして正しく働かなくなってしまう。

しかし、
if ( map.get() == null ) {
map.put( ... )
}

とすると、レースコンディションが起こる可能性がある。 こういう場所でレースコンディションが起こってしまうと問題を見つけるのはほぼ不可能といっても過言で無い。 デバッグ作業は想像を絶する難しい作業を強いられる。


上のコメントを書いてからレースコンディションが恐ろしく、悩みこんでしまった。
だけどこういう記事を見つけた。

Race Conditions
As you examine the entries() code, you may question whether the cache accounts for potential race conditions with the garbage collector. After all, if the garbage collector is running at the instant the entries() method is trying to determine which items are still available, isn't that an error? The answer is no. To understand why, you should first know that Reference objects are cleared automically. That is, if the Reference.get() method returns a non-null value that the application immediately uses, the garbage collector will not clear out the object. Put another way, the garbage collector performs the test and clear operations on the Reference as an indivisible, uninterruptible operation.

要するに 出てきた値が 非null であるということは、ここにすでにひとつ参照が出来たという事で、この値は絶対にガベージコレクトされないから、心配ないという事だ。

http://java.sys-con.com/node/36023

そういえば以前そういうことを考えた事があったが、忘れていた。

とにかくこの辺の話題は直感的でないので、それが本当に正しいかを検証するのに大変な時間がかかる。

 
出展 2009年07月11日06:28 『今日はやりたいこと、全部やった』