はてなキーワード: Observerとは
なぜ『The End of the Tour』は、本当は私の友人デヴィッド・フォスター・ウォレスについての映画ではないのか
グレン・ケニー
⸻
1997年の晩秋、私はデヴィッド・フォスター・ウォレスから一本の電話を受けた。
当時私が勤めていた雑誌『Premiere』で、彼が寄稿したデヴィッド・リンチについてのエッセイを編集していたのだが、その編集作業の間じゅう、ウォレスは実に穏やかで礼儀正しかった。(三度目に会うまでは、彼は私を「ミスター・ケニー」と呼び続けていた。)
しかし、その日の彼は、今にも取り乱しそうな声だった。
友人の一人が、映画『Mr. Jealousy』について紹介するNPRの番組を聴いていたところ、その作品に出演している俳優の一人が、自分の演じたキャラクターの着想源としてウォレスの名前を挙げていたというのだ。
ウォレスはひどく動揺していた。
しかも彼の住んでいる場所の近くでは、そのインディペンデント映画は上映されていなかった。
そこで彼は私に頼みごとをした。
「その件を調べてきてくれないか」と。
⸻
一日か二日後、私は彼を安心させることができた。
映画の中でクリス・アイゲマンが演じる人物は、どの点を見てもウォレスを真似しているわけではなかったからだ。
さらに私は(どうやってだったか覚えていないが)そのNPRの放送自体も確認した。
すると、彼の名前が引き合いに出されたのも、ごく一般的な文脈だったことが分かった。
アイゲマンは、自分が演じたのは「時代の代弁者」とでもいうべき男性作家のタイプだと説明し、その例としてウォレスとジェイ・マキナニーの二人を挙げていただけだった。
しかもマキナニーは、公のイメージという点では、ウォレスとはほとんど正反対と言っていい人物である。
⸻
このことを伝えたとき、ウォレスが大きく安堵のため息をついた。
その様子はいまでも鮮明に覚えている。
⸻
そのやり取りを、私は先週ふと思い出した。
ウォレスの長年の編集者であり友人でもあったマイケル・ピーチュが、新作映画『The End of the Tour』について『ロサンゼルス・タイムズ』に寄せた声明を読んだからだ。
ピーチュはこう書いていた。
「もしこの映画の企画が彼の生前に持ち込まれていたら、デヴィッドはそんな話は笑い飛ばして部屋から追い出していただろう。」
しかし、その声明が掲載されたにもかかわらず、『ロサンゼルス・タイムズ』はその記事に、
「『The End of the Tour』はいかにして、とてもデヴィッド・フォスター・ウォレスらしい映画になったのか」
という見出しを付けた。
記事の内容も、映画と、ウォレスを演じたジェイソン・シーゲルをひたすら称賛するものだった。
一方で、ピーチュやその他の関係者が表明していた異議については、形式的に少し触れられているだけである。
まるで、「公平性のために反対意見も載せておきました」という、面倒なジャーナリズム上の義務を嫌々果たしているかのような書き方だった。
⸻
第2回
この手のことは、最近ではもはや驚くような話ではなくなってしまった。
2008年にウォレスが自ら命を絶って以来、私が気づいたことが一つある。
それは、自称「デヴィッド・フォスター・ウォレスのファン」の多くは、実際に彼を知っていた人々の話には、ほとんど価値を認めていないということだ。
例えば、Jonathan Franzenが、亡き友人について、苦しみをにじませながらも容赦のない率直な見解を語ったり文章にしたりすると、ウォレスのファンたちはたちまち反発する。
インターネットには、
といったコメントが並ぶ。
⸻
この傾向は、『The End of the Tour』をめぐる報道でも繰り返された。
『Although Of Course You End Up Becoming Yourself: A Road Trip With David Foster Wallace(もちろん最後には自分自身になってしまうのだけれど――デヴィッド・フォスター・ウォレスとのロードトリップ)』
の映画化が発表されたとき、デヴィッド・フォスター・ウォレス・トラストは反対の意思を表明した。
するとライターのMaria Bustillosは、かつてウォレスが本に書き込んでいた母親に関するメモを再掲載し、それほど深い洞察もないまま「ウォレス研究家」のような立場を装っていた人物だが、The Awl に
「死者は同意できない(The Dead Cannot Consent)」
彼女は、「トラスト」という存在を、まるでオーウェル小説に出てくるような巨大で匿名の組織であるかのように扱っていた。
しかし実際には、それはウォレスが2004年から亡くなるまで結婚していた妻、カレン・グリーンが代表を務める小さな団体にすぎない。
それにもかかわらず、バスティージョスは鼻で笑うようにこう書いた。
「もし彼が自殺していなかったなら、この映画に同意したかどうかなどという、悲しく、理解しがたい問いについて、なぜわざわざ推測する必要があるのだろう。」
⸻
私は、その問いは少なくともカレン・グリーンにとっては、決して「理解しがたい」ものではないと思う。
また、ウォレスの文芸エージェントだったボニー・ネイデルにとっても、そしてもちろんピーチュにとっても同じだ。
彼らにとって、ウォレスが何を望み、何を望まなかったかという問題は、抽象的な知的議論ではなかった。
昔から、そして今もなお、極めて現実的で個人的な問題なのである。
⸻
2011年、カレン・グリーンは Observer 紙のインタビューで、人々にこう訴えようとしていた。
「ジャーナリズムがジャーナリズムであることは分かっていますし、人々は『私が彼の遺体を発見した』という話を何度でも読みたがるのかもしれません。でも、それはデヴィッドその人でもなければ、彼の作品でもありません。」
そして続けてこう語っている。
「そういう扱い方をすると、彼は『有名人の作家』という存在に変えられてしまう。それは、彼の中の一番大切な部分からすれば、きっと顔をしかめるようなことだったと思います。」
⸻
こうした人たちは、自分たちが知っていたウォレスという人間と、ファンたちが奇妙なほど「自分たちのもの」と思い込んでいるウォレス像との間で、常に板挟みになってきたのである。
⸻
私は、カレン・グリーンやマイケル・ピーチュ、あるいはボニー・ネイデルほど深くデヴィッド・フォスター・ウォレスを知っていたわけではない。
それでも、生前の彼について文章を書く際に「私の友人」と呼んでも、彼が嫌がることはない程度には親しかった。
『A Supposedly Fun Thing I’ll Never Do Again(楽しいことのはずが、二度とやりたくない)』
の謝辞の中で、私に
「The Mollifier(なだめ役)」
というあだ名まで付けてくれている。
⸻
1998年には、ラスベガスで開かれたAVNアワードを取材するため、私はデイヴ(ウォレス)と週末を共に過ごした。
彼はその体験を後に
というエッセイにまとめている。
という名前で登場させていた。
⸻
『Big Red Son』となる原稿を『Premiere』誌が編集した際、その扱いに彼は激怒し、後に『Consider the Lobster』の注で、その編集を**「bowdlerized(検閲・無害化されてしまった)」**と書いた。
そして、その表現はまったく正確だった。
私たちは主に電話で話していたが、2004年以降になると、会話の多くは、お互いが人生の伴侶と出会えた幸運について語ることになっていった。
私は昼間の仕事を失ったことについて長々と愚痴をこぼしたが、彼はとても励ましてくれた。
その年の9月、彼は亡くなった。
⸻
第3回
そうした、比較的限られた立場から見ても、『The End of the Tour』は私には失笑ものだった。
私は映画評論を書く際、歴史的事実に忠実でない作品であっても擁護してきたことが少なくない。
映画というものは、それぞれが独立した一つの世界であり、その世界の中で評価されるべきだ――良くも悪くも、そう考えてきたからだ。
しかし、そのような距離を置いた姿勢は、この映画を初めて観た瞬間に吹き飛んでしまった。
⸻
この作品は、1996年の5日間を舞台に、デヴィッド・リプスキー(演じるのはジェシー・アイゼンバーグ)と、デヴィッド・フォスター・ウォレス(演じるのはジェイソン・シーゲル)の、脚色された人物像を描いている。
さらに物語は、2008年を舞台にした場面で始まり、同じく2008年の場面で締めくくられる。
そこではリプスキーがウォレスの死と、その残したものについて振り返っている。
⸻
多くの点で、ごく典型的なインディペンデント映画であるこの作品を観終えた私は、あまりに腹が立ち、その夜はほとんど眠れなかった。
ベッドの中で、ジェイソン・シーゲルのウォレス像を最も的確に表す言葉は何かということばかり考え続けていた。
そしてようやく思いついた表現が、
「死者を食い物にした自己顕示(ghoulish self-aggrandisement)」
だった。
⸻
私にとって、この演技を思い浮かべると連想されるのは、キャプテン・ビーフハートの曲の一節である。
「俺は、自分の骨の上に乗っかっている奴らのことを思う。」
⸻
もっと個人的な感情を脇へ置いて、この映画を見ようと努めてみることもある。
たとえば、
「90年代に二人の男が作家としてあれこれ語り合い、その何年か後、一人が自殺する」
という映画として見たとしても、『The End of the Tour』はやはり物足りない。
⸻
彼の演技を「ウォレスが憑依したようだ」と評する人もいる。
しかし私には、とてもそうは思えない。
むしろ、「ほら、ここが重要ですよ」と大げさに指し示す演技の連続に見える。
ここで一つ癖を見せ、
あそこでまた別の癖を見せる。
額にはしわを寄せ続ける。
を一生懸命考えながら演じているのが透けて見える。
⸻
すべて後景へ退き、
前面に押し出されるのは、
だけである。
⸻
彼が冗談を言っている場面でさえ、その人物には明るさも、軽やかさもない。
「死んだほうがましだ」
あるいは
「君は本当に私になりたいとは思わないだろう」
まるで観客の脇腹を肘で突きながら、
「ほら、彼は将来自殺するんですよ」
と念押ししているようにしか見えない。
⸻
ウォレスの自殺という出来事が、亡くなる12年も前から彼の人生のすべてに影を落としていた
と主張してやまない。
⸻
しかも、シーゲルが演じるウォレスは、本当の意味で「暗い」人物ですらない。
ただ、
「なんとなく悲しそうな人」
なのである。
⸻
自らを去勢してしまう代わりに、ポルノに徹底的に没頭してみたらどうか――
そんな極端な発想を平然と口にするようなウォレスは、『The End of the Tour』には一度も姿を現さない。
また、
あの恐ろしく入り組んだ短編小説『Octet』を書いた作家も、ここには存在しない。
その作品は、
という、目が回るような結末で始まる。
⸻
この映画が向けられているのは、
かつて流行した**『Wear Sunscreen(日焼け止めを塗れ)』**の現代版――人生の教訓集――として愛読しているような人々なのだ。
そして、
『ロサンゼルス・タイムズ』の記事でも繰り返されていたように、
⸻
だが、ウォレスが嫌っていたのは、
そこに描かれるウォレスは、
ジョン・バースについて語るより、
アラニス・モリセットについて語るほうが楽しそうな人物なのである。
⸻
「この映画は、ウォレス自身の言葉を使いながら、なおウォレスの思想を裏切っている」
と書いていた。
私は、その指摘はほとんど完全に正しいと思う。
⸻
第4回(完結)
そして結局のところ、この映画を二度観終えてもなお、私自身が知っていたウォレスと、この映画が描くウォレスとの食い違いを、私はどうしても埋めることができなかった。
『Although Of Course You End Up Becoming Yourself(もちろん最後には自分自身になってしまうのだけれど)』の冒頭で、リプスキーはウォレスの話し方をこう描写している。
「語尾の g を飲み込み、『wouldn’t』を『wudn’t』、『didn’t』を『dudn’t』、『isn’t』を『idn’t』、『something』を『sumpin』と言う、どこにでもいるスポーツマン風のアクセント。」
シーゲルは、このリプスキーの描写をそのまま演技に取り入れている。
しかし、私の記憶では、デイヴはもっと正確で、ほとんど改まった話し方をしていた。
現在分詞の語尾に付く g も、落とすことなく、静かに、しかしきちんと発音していたのである。
⸻
がっしりしていて、
ぎこちなくよろめくように歩き、
肘を不器用に動かし、
いつも少し小さめの服を無理に着ている。
私が覚えているデイヴは、体格こそ立派だったが、同時にほとんど身軽で、しなやかささえ感じさせる人物だった。
⸻
それでも映画のラストで、シーゲルが大げさなくらいひどい踊りを披露する場面は、まるでネオンサインのようにはっきりと、この映画の考え方を示している。
つまり、
「あまりにも純粋で、あまりにも神聖だったがゆえに、この世界ではうまく生きられなかった天才」
⸻
同じことは、先ほど触れたアラニス・モリセットの話にも表れている。
リプスキーの本には、
「もし彼女に会えたらどうする?」
というやり取りが実際に載っている。
そのときのウォレスの返答は、有名人という存在や、セレブリティ文化の力学に対して懐疑的ではあるものの、決して間の抜けたものではない。
ところが脚本家ドナルド・マーグリーズがその場面を書き換え、シーゲルが演じると、
(Beaky Buzzard――アメリカのアニメに登場する、頭は悪くないが極端に間が抜けたハゲワシのキャラクターを引き合いに出している。)
⸻
一方、ジェシー・アイゼンバーグが演じるリプスキーは、最初はやや自虐的な描かれ方をしている。
地方に住むウォレスのもとへ押しかけてくる、押しの強い都会人。
天才性、
名声、
そうしたものを欲しがりながら、
なぜ当のウォレス本人が、それらに対して複雑な感情を抱いているのか理解できない男として描かれる。
⸻
映画の最後でリプスキーをより立派な人物として浮かび上がらせるための仕掛けにすぎないことが分かる。
彼は生き残った作家として、
NPRで。
行く先々で。
まるでジョニー・アップルシード(※アメリカ開拓時代にリンゴの種をまいて各地を歩いた伝説的人物)のように。
⸻
……私だけなのだろうか。
彼の死は、彼を知っていた者たちにとって、今なお生々しい傷なのである。
⸻
それはウォレスを窒息させるような敬意だ。
「見てくれ。」
「こんなに立派な追悼作品なんだ。」
「どうして君は、こんなものを望まなかったんだ?」
「どうして受け入れなかったんだ?」
と懇願しているように思える。
⸻
だが、その問い自体が間違っている。
なぜなら、この映画に関わった誰一人として、
ウォレスが持っていたような、容赦のない鋭い自己認識をもって「これ」を見ていないからである。
結局は**「有名人の作家さん」**という肖像を作り上げただけだった。
⸻
「まだ早すぎる(Too soon.)」
――まったく、その通りなのである。
1997年の晩秋、私はデヴィッド・フォスター・ウォレスから一本の電話を受けた。
当時私が勤めていた雑誌『Premiere』で、彼が寄稿したデヴィッド・リンチについてのエッセイを編集していたのだが、その編集作業の間じゅう、ウォレスは実に穏やかで礼儀正しかった。(三度目に会うまでは、彼は私を「ミスター・ケニー」と呼び続けていた。)
しかし、その日の彼は、今にも取り乱しそうな声だった。
友人の一人が、映画『Mr. Jealousy』について紹介するNPRの番組を聴いていたところ、その作品に出演している俳優の一人が、自分の演じたキャラクターの着想源としてウォレスの名前を挙げていたというのだ。
ウォレスはひどく動揺していた。
しかも彼の住んでいる場所の近くでは、そのインディペンデント映画は上映されていなかった。
そこで彼は私に頼みごとをした。
「その件を調べてきてくれないか」と。
⸻
一日か二日後、私は彼を安心させることができた。
映画の中でクリス・アイゲマンが演じる人物は、どの点を見てもウォレスを真似しているわけではなかったからだ。
さらに私は(どうやってだったか覚えていないが)そのNPRの放送自体も確認した。
すると、彼の名前が引き合いに出されたのも、ごく一般的な文脈だったことが分かった。
アイゲマンは、自分が演じたのは「時代の代弁者」とでもいうべき男性作家のタイプだと説明し、その例としてウォレスとジェイ・マキナニーの二人を挙げていただけだった。
しかもマキナニーは、公のイメージという点では、ウォレスとはほとんど正反対と言っていい人物である。
⸻
このことを伝えたとき、ウォレスが大きく安堵のため息をついた。
その様子はいまでも鮮明に覚えている。
⸻
そのやり取りを、私は先週ふと思い出した。
ウォレスの長年の編集者であり友人でもあったマイケル・ピーチュが、新作映画『The End of the Tour』について『ロサンゼルス・タイムズ』に寄せた声明を読んだからだ。
ピーチュはこう書いていた。
「もしこの映画の企画が彼の生前に持ち込まれていたら、デヴィッドはそんな話は笑い飛ばして部屋から追い出していただろう。」
しかし、その声明が掲載されたにもかかわらず、『ロサンゼルス・タイムズ』はその記事に、
「『The End of the Tour』はいかにして、とてもデヴィッド・フォスター・ウォレスらしい映画になったのか」
という見出しを付けた。
記事の内容も、映画と、ウォレスを演じたジェイソン・シーゲルをひたすら称賛するものだった。
一方で、ピーチュやその他の関係者が表明していた異議については、形式的に少し触れられているだけである。
まるで、「公平性のために反対意見も載せておきました」という、面倒なジャーナリズム上の義務を嫌々果たしているかのような書き方だった。
この手のことは、最近ではもはや驚くような話ではなくなってしまった。
2008年にウォレスが自ら命を絶って以来、私が気づいたことが一つある。
それは、自称「デヴィッド・フォスター・ウォレスのファン」の多くは、実際に彼を知っていた人々の話には、ほとんど価値を認めていないということだ。
例えば、Jonathan Franzenが、亡き友人について、苦しみをにじませながらも容赦のない率直な見解を語ったり文章にしたりすると、ウォレスのファンたちはたちまち反発する。
インターネットには、
といったコメントが並ぶ。
⸻
この傾向は、『The End of the Tour』をめぐる報道でも繰り返された。
『Although Of Course You End Up Becoming Yourself: A Road Trip With David Foster Wallace(もちろん最後には自分自身になってしまうのだけれど――デヴィッド・フォスター・ウォレスとのロードトリップ)』
の映画化が発表されたとき、デヴィッド・フォスター・ウォレス・トラストは反対の意思を表明した。
するとライターのMaria Bustillosは、かつてウォレスが本に書き込んでいた母親に関するメモを再掲載し、それほど深い洞察もないまま「ウォレス研究家」のような立場を装っていた人物だが、The Awl に
「死者は同意できない(The Dead Cannot Consent)」
彼女は、「トラスト」という存在を、まるでオーウェル小説に出てくるような巨大で匿名の組織であるかのように扱っていた。
しかし実際には、それはウォレスが2004年から亡くなるまで結婚していた妻、カレン・グリーンが代表を務める小さな団体にすぎない。
それにもかかわらず、バスティージョスは鼻で笑うようにこう書いた。
「もし彼が自殺していなかったなら、この映画に同意したかどうかなどという、悲しく、理解しがたい問いについて、なぜわざわざ推測する必要があるのだろう。」
⸻
私は、その問いは少なくともカレン・グリーンにとっては、決して「理解しがたい」ものではないと思う。
また、ウォレスの文芸エージェントだったボニー・ネイデルにとっても、そしてもちろんピーチュにとっても同じだ。
彼らにとって、ウォレスが何を望み、何を望まなかったかという問題は、抽象的な知的議論ではなかった。
昔から、そして今もなお、極めて現実的で個人的な問題なのである。
⸻
2011年、カレン・グリーンは Observer 紙のインタビューで、人々にこう訴えようとしていた。
「ジャーナリズムがジャーナリズムであることは分かっていますし、人々は『私が彼の遺体を発見した』という話を何度でも読みたがるのかもしれません。でも、それはデヴィッドその人でもなければ、彼の作品でもありません。」
そして続けてこう語っている。
「そういう扱い方をすると、彼は『有名人の作家』という存在に変えられてしまう。それは、彼の中の一番大切な部分からすれば、きっと顔をしかめるようなことだったと思います。」
⸻
こうした人たちは、自分たちが知っていたウォレスという人間と、ファンたちが奇妙なほど「自分たちのもの」と思い込んでいるウォレス像との間で、常に板挟みになってきたのである。
⸻
私は、カレン・グリーンやマイケル・ピーチュ、あるいはボニー・ネイデルほど深くデヴィッド・フォスター・ウォレスを知っていたわけではない。
それでも、生前の彼について文章を書く際に「私の友人」と呼んでも、彼が嫌がることはない程度には親しかった。
『A Supposedly Fun Thing I’ll Never Do Again(楽しいことのはずが、二度とやりたくない)』
の謝辞の中で、私に
「The Mollifier(なだめ役)」
というあだ名まで付けてくれている。
⸻
1998年には、ラスベガスで開かれたAVNアワードを取材するため、私はデイヴ(ウォレス)と週末を共に過ごした。
彼はその体験を後に
というエッセイにまとめている。
という名前で登場させていた。
⸻
『Big Red Son』となる原稿を『Premiere』誌が編集した際、その扱いに彼は激怒し、後に『Consider the Lobster』の注で、その編集を**「bowdlerized(検閲・無害化されてしまった)」**と書いた。
そして、その表現はまったく正確だった。
私たちは主に電話で話していたが、2004年以降になると、会話の多くは、お互いが人生の伴侶と出会えた幸運について語ることになっていった。
私は昼間の仕事を失ったことについて長々と愚痴をこぼしたが、彼はとても励ましてくれた。
その年の9月、彼は亡くなった。
そうした、比較的限られた立場から見ても、『The End of the Tour』は私には失笑ものだった。
私は映画評論を書く際、歴史的事実に忠実でない作品であっても擁護してきたことが少なくない。
映画というものは、それぞれが独立した一つの世界であり、その世界の中で評価されるべきだ――良くも悪くも、そう考えてきたからだ。
しかし、そのような距離を置いた姿勢は、この映画を初めて観た瞬間に吹き飛んでしまった。
⸻
この作品は、1996年の5日間を舞台に、デヴィッド・リプスキー(演じるのはジェシー・アイゼンバーグ)と、デヴィッド・フォスター・ウォレス(演じるのはジェイソン・シーゲル)の、脚色された人物像を描いている。
さらに物語は、2008年を舞台にした場面で始まり、同じく2008年の場面で締めくくられる。
そこではリプスキーがウォレスの死と、その残したものについて振り返っている。
⸻
多くの点で、ごく典型的なインディペンデント映画であるこの作品を観終えた私は、あまりに腹が立ち、その夜はほとんど眠れなかった。
ベッドの中で、ジェイソン・シーゲルのウォレス像を最も的確に表す言葉は何かということばかり考え続けていた。
そしてようやく思いついた表現が、
「死者を食い物にした自己顕示(ghoulish self-aggrandisement)」
だった。
⸻
私にとって、この演技を思い浮かべると連想されるのは、キャプテン・ビーフハートの曲の一節である。
「俺は、自分の骨の上に乗っかっている奴らのことを思う。」
⸻
もっと個人的な感情を脇へ置いて、この映画を見ようと努めてみることもある。
たとえば、
「90年代に二人の男が作家としてあれこれ語り合い、その何年か後、一人が自殺する」
という映画として見たとしても、『The End of the Tour』はやはり物足りない。
⸻
彼の演技を「ウォレスが憑依したようだ」と評する人もいる。
しかし私には、とてもそうは思えない。
むしろ、「ほら、ここが重要ですよ」と大げさに指し示す演技の連続に見える。
ここで一つ癖を見せ、
あそこでまた別の癖を見せる。
額にはしわを寄せ続ける。
を一生懸命考えながら演じているのが透けて見える。
⸻
すべて後景へ退き、
前面に押し出されるのは、
だけである。
⸻
彼が冗談を言っている場面でさえ、その人物には明るさも、軽やかさもない。
「死んだほうがましだ」
あるいは
「君は本当に私になりたいとは思わないだろう」
まるで観客の脇腹を肘で突きながら、
「ほら、彼は将来自殺するんですよ」
と念押ししているようにしか見えない。
⸻
ウォレスの自殺という出来事が、亡くなる12年も前から彼の人生のすべてに影を落としていた
と主張してやまない。
⸻
しかも、シーゲルが演じるウォレスは、本当の意味で「暗い」人物ですらない。
ただ、
「なんとなく悲しそうな人」
なのである。
⸻
自らを去勢してしまう代わりに、ポルノに徹底的に没頭してみたらどうか――
そんな極端な発想を平然と口にするようなウォレスは、『The End of the Tour』には一度も姿を現さない。
また、
あの恐ろしく入り組んだ短編小説『Octet』を書いた作家も、ここには存在しない。
その作品は、
という、目が回るような結末で始まる。
⸻
この映画が向けられているのは、
かつて流行した**『Wear Sunscreen(日焼け止めを塗れ)』**の現代版――人生の教訓集――として愛読しているような人々なのだ。
そして、
『ロサンゼルス・タイムズ』の記事でも繰り返されていたように、
⸻
だが、ウォレスが嫌っていたのは、
そこに描かれるウォレスは、
ジョン・バースについて語るより、
アラニス・モリセットについて語るほうが楽しそうな人物なのである。
⸻
「この映画は、ウォレス自身の言葉を使いながら、なおウォレスの思想を裏切っている」
と書いていた。
私は、その指摘はほとんど完全に正しいと思う。
そして結局のところ、この映画を二度観終えてもなお、私自身が知っていたウォレスと、この映画が描くウォレスとの食い違いを、私はどうしても埋めることができなかった。
『Although Of Course You End Up Becoming Yourself(もちろん最後には自分自身になってしまうのだけれど)』の冒頭で、リプスキーはウォレスの話し方をこう描写している。
「語尾の g を飲み込み、『wouldn’t』を『wudn’t』、『didn’t』を『dudn’t』、『isn’t』を『idn’t』、『something』を『sumpin』と言う、どこにでもいるスポーツマン風のアクセント。」
シーゲルは、このリプスキーの描写をそのまま演技に取り入れている。
しかし、私の記憶では、デイヴはもっと正確で、ほとんど改まった話し方をしていた。
現在分詞の語尾に付く g も、落とすことなく、静かに、しかしきちんと発音していたのである。
⸻
がっしりしていて、
ぎこちなくよろめくように歩き、
肘を不器用に動かし、
いつも少し小さめの服を無理に着ている。
私が覚えているデイヴは、体格こそ立派だったが、同時にほとんど身軽で、しなやかささえ感じさせる人物だった。
⸻
それでも映画のラストで、シーゲルが大げさなくらいひどい踊りを披露する場面は、まるでネオンサインのようにはっきりと、この映画の考え方を示している。
つまり、
「あまりにも純粋で、あまりにも神聖だったがゆえに、この世界ではうまく生きられなかった天才」
⸻
同じことは、先ほど触れたアラニス・モリセットの話にも表れている。
リプスキーの本には、
「もし彼女に会えたらどうする?」
というやり取りが実際に載っている。
そのときのウォレスの返答は、有名人という存在や、セレブリティ文化の力学に対して懐疑的ではあるものの、決して間の抜けたものではない。
ところが脚本家ドナルド・マーグリーズがその場面を書き換え、シーゲルが演じると、
(Beaky Buzzard――アメリカのアニメに登場する、頭は悪くないが極端に間が抜けたハゲワシのキャラクターを引き合いに出している。)
⸻
一方、ジェシー・アイゼンバーグが演じるリプスキーは、最初はやや自虐的な描かれ方をしている。
地方に住むウォレスのもとへ押しかけてくる、押しの強い都会人。
天才性、
名声、
そうしたものを欲しがりながら、
なぜ当のウォレス本人が、それらに対して複雑な感情を抱いているのか理解できない男として描かれる。
⸻
映画の最後でリプスキーをより立派な人物として浮かび上がらせるための仕掛けにすぎないことが分かる。
彼は生き残った作家として、
NPRで。
行く先々で。
まるでジョニー・アップルシード(※アメリカ開拓時代にリンゴの種をまいて各地を歩いた伝説的人物)のように。
⸻
……私だけなのだろうか。
彼の死は、彼を知っていた者たちにとって、今なお生々しい傷なのである。
⸻
それはウォレスを窒息させるような敬意だ。
「見てくれ。」
「こんなに立派な追悼作品なんだ。」
「どうして君は、こんなものを望まなかったんだ?」
「どうして受け入れなかったんだ?」
と懇願しているように思える。
⸻
だが、その問い自体が間違っている。
なぜなら、この映画に関わった誰一人として、
ウォレスが持っていたような、容赦のない鋭い自己認識をもって「これ」を見ていないからである。
結局は**「有名人の作家さん」**という肖像を作り上げただけだった。
⸻
「まだ早すぎる(Too soon.)」
――まったく、その通りなのである。
A Background Independent Algebra in Quantum Gravity
"We propose an algebra of operators along an observer's worldline as a background-independent algebra in quantum gravity."
訳:我々は、ある観測者の世界線(worldline)に沿った演算子の代数を、量子重力における背景独立な代数として提案する。
解説: 「世界線」とは、観測者が時空を旅する道筋。「演算子の代数」とは、観測者が体験できる物理量(エネルギー、位置、情報など)を記述する数学的枠組み。「背景独立」とは、時空の形があらかじめ決まっていないことを意味する。
要するに:「宇宙全体」ではなく、「ある観測者が見ている現実」だけを記述する枠組みを考える。それが量子重力の本質を捉えるカギかもしれない、という発想だ!
"In that context, it is natural to think of the Hartle-Hawking no boundary state as a universal state of maximum entropy, and to define entropy in terms of the relative entropy with this state."
訳:この文脈では、「ハートル=ホーキングの無境界状態(no-boundary state)」を最大エントロピーの普遍的な状態と考えるのが自然であり、エントロピーをこの状態との相対エントロピー(relative entropy)で定義することができる。
解説:ハートル=ホーキング状態とは、宇宙の初期状態として提案された、始まりがない、境界のない量子状態。これは、最も無情報で中立的な「宇宙の基準状態」とみなせる。相対エントロピーとは、ある状態がこの基準状態とどれだけ異なるか(情報があるか)を測る量。
つまり: この「無境界状態」を「宇宙の情報ゼロの状態(真っ白なキャンバス)」とみなし、他の状態との情報の違いでエントロピーを測る。
"In the case that the only spacetimes considered correspond to de Sitter vacua with different values of the cosmological constant, this definition leads to sensible results."
訳:もし考慮する時空がすべて、異なる宇宙定数を持つde Sitter空間の真空状態に対応するならば、このエントロピーの定義は理にかなった結果をもたらす。
解説:de Sitter空間とは、宇宙定数が正である膨張する宇宙の理想的モデル。宇宙定数が違えば、「宇宙の大きさ」や「未来の運命」が異なる。そのそれぞれの状態を比べると、エントロピー(情報の違い)も整合的に定義できる。
つまり:この枠組みでは、「宇宙のエントロピーとは何か?」という問いに、de Sitter宇宙を例にして明快な答えが得られるという主張じゃ!
このアブストラクトはこう言っておる。
「時空そのものを前提にするのではなく、観測者が感じる現実=世界線に沿った演算子たちの代数を使って宇宙を記述しよう。
その中で、最大無情報状態=ハートル=ホーキング状態を基準に、エントロピー(情報の量)を定義する。
特にde Sitter宇宙を考えると、この定義はきちんと意味を持ち、現実に即した結論を出してくれるぞ!
Programming proficiency necessitates a comprehensive understanding of multifaceted concepts, paradigms, and philosophies that underpin the art and science of software development. The Unix philosophy, with its emphasis on modularity, simplicity, and composability, serves as a foundational ethos for elegant code design. This philosophy advocates for creating small, focused programs that excel at singular tasks, facilitating the construction of complex systems through the judicious composition of these atomic units.
Proficient programmers must possess an encyclopedic knowledge of algorithms and data structures, enabling them to architect solutions with optimal time and space complexity. This encompasses a deep understanding of sorting algorithms (e.g., quicksort, mergesort), searching techniques (binary search, depth-first search), and advanced data structures (red-black trees, B-trees, Fibonacci heaps) The ability to analyze algorithmic efficiency using Big O notation is paramount for creating scalable solutions.
OOP principles—encapsulation, inheritance, and polymorphism—form the bedrock of modern software architecture. Mastery of design patterns (e.g., Singleton, Factory, Observer) and SOLID principles is crucial for creating maintainable and extensible codebases.
The FP paradigm, with its emphasis on immutability and pure functions, offers a powerful approach to managing complexity and facilitating parallel execution. Proficiency in higher-order functions, currying, and monads is essential for leveraging FP's full potential.
Expertise in language-specific advanced features, such as C++'s template metaprogramming or Python's metaclasses, allows for the creation of highly generic and reusable code. Understanding compiler theory and the ability to write domain-specific languages (DSLs) further expands a programmer's capabilities.
In an era of multi-core processors and distributed systems, mastery of concurrent programming models (e.g., actor model, communicating sequential processes) and parallel algorithms is indispensable. This includes proficiency in lock-free data structures, memory models, and synchronization primitives.
A deep understanding of computer architecture, operating systems, and memory management enables the creation of highly optimized, low-level code. This encompasses knowledge of cache coherence protocols, CPU pipeline optimization, and assembly language programming.
In an increasingly interconnected world, a thorough grasp of cryptographic principles, secure coding practices, and common attack vectors (e.g., buffer overflows, SQL injection) is crucial for developing robust and secure systems.
Proficiency in distributed version control systems (e.g., Git) and collaborative development practices (code reviews, continuous integration) is essential for effective team-based software development.
Advanced testing methodologies, including property-based testing, fuzzing, and formal verification techniques, are indispensable for ensuring software reliability and correctness.
In conclusion, the pantheon of programming knowledge extends far beyond mere syntax mastery. It encompasses a rich tapestry of theoretical concepts, practical skills, and philosophical approaches that, when harmoniously integrated, enable the creation of elegant, efficient, and robust software systems. The relentless pursuit of this multifaceted expertise is the hallmark of a truly accomplished programmer.
これを改善してってお願いした。何書いてあるかわからないけど動いたよ。
https://anond.hatelabo.jp/20240125203115
// ==UserScript== // @name 増田ミュート(白塗り版) // @namespace http://tampermonkey.net/ // @version 2024-06-26 // @description ミュートワードを含む最小限の範囲を白塗りにする // @author You // @match https://anond.hatelabo.jp/* // @icon https://www.google.com/s2/favicons?sz=64&domain=hatelabo.jp // @grant none // ==/UserScript== (function() { 'use strict'; const muteWords = [ "弱者男性", "弱男", "弱者", "婚活", "男", "女", "年収", "下方婚", "発達障害", "発達", "ハッタツ", "ハッタショ", "ハッタショ", "競プロ", "競技プログラミング", "AtCoder", ]; function whiteoutElement(element) { element.style.backgroundColor = 'white'; element.style.color = 'white'; element.style.textShadow = 'none'; element.style.cursor = 'default'; element.style.userSelect = 'none'; // テキスト選択を防止 element.style.borderBottom = '1px dashed #ccc'; // 枠線を追加してテキストがあることを示す // リンクの場合、クリックを無効化 if (element.tagName === 'A') { element.style.pointerEvents = 'none'; element.removeAttribute('href'); } // 子要素にも適用 Array.from(element.children).forEach(child => { child.style.backgroundColor = 'white'; child.style.color = 'white'; child.style.textShadow = 'none'; }); // ツールチップを追加 element.title = 'この内容にはミュートワードが含まれています'; } function shouldMute(text) { return muteWords.some(word => { const parts = word.split(''); const regex = new RegExp(parts.map(char => `${char}\\s*`).join(''), 'i'); return regex.test(text); }); } function findSmallestMuteableElement(element) { if (element.nodeType === Node.TEXT_NODE) { return shouldMute(element.textContent) ? element.parentElement : null; } if (element.tagName === 'PRE' || element.tagName === 'CODE') { return shouldMute(element.textContent) ? element : null; } for (let child of element.childNodes) { const result = findSmallestMuteableElement(child); if (result) return result; } return shouldMute(element.textContent) ? element : null; } function processElement(element) { const muteableElement = findSmallestMuteableElement(element); if (muteableElement) { whiteoutElement(muteableElement); } } function processAllElements(root = document.body) { const walker = document.createTreeWalker( root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, null, false ); let node; while (node = walker.nextNode()) { if (node.nodeType === Node.ELEMENT_NODE) { processElement(node); } else if (node.nodeType === Node.TEXT_NODE && node.parentElement) { processElement(node.parentElement); } } } function handleClickEvent(event) { setTimeout(() => { processAllElements(event.target); }, 100); } // 初回実行 processAllElements(); // クリックイベントの監視 document.body.addEventListener('click', handleClickEvent); // DOM変更の監視 const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { if (mutation.type === 'childList') { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) { processAllElements(node); } }); } else if (mutation.type === 'characterData') { processElement(mutation.target.parentNode); } }); }); observer.observe(document.body, { childList: true, subtree: true, characterData: true }); })();
Actually, it turned out I DO feel like spending 40min or at least 20min of my life. I'm rather fascinated. In the first video, he says "I'm not taking a view as many people did, in the early days of quantum mechanics that it's the conscious Observer looking at the system". NOTE, it's "Observing", not "Measuring" and he DOES NOT take the view of "the conscious Observer looking at the system".
Now do you really want me to continue in English or do you want to read it in Japanese?
お気持ち表明がブームらしいので某声なしPaPの私もお気持ち表明がしたくなってしまいました。
こちらでは私の抱いている夢見りあむへその声の実装についての考えを適当に書き並べたのと+αについて述べていきたいと思います。
まず結論から言うと、声はついていいと言うかぶっちゃけ然るべきだと思います。
おそらくテコ入れとして4年?ぶりに実装された新アイドル。4年は短いようで長く、その間に社会は大きくかわってしまいました。2014年って前回のパズドラのハローキティコラボよりも前なんですよ。そう考えると先カンブリア時代と大差ないレベルの過去です。
そしてデレマスは利益を出すために存在しているシステムの一部でしかないので、売れそうなキャラを売り出そうとしますでしょう。かつての俺嫁オタクは減少し私みたいな地雷持ちCP過激派が跋扈する(それでもまだ比率は俺嫁系の方が上かもしれない)今7人中4人が既に相手のいる状態で実装されていたり、数年前より大分盛況している配信をしているキャラだったり、Twitterで調べたら出てきそうなやばいやつだったり、諦観を持った農家だったり。
今様のキャラクターを実装し、人気を出させ、マンネリ化を防ぐテコ入れと収入をかねようとしたのかな、炎上覚悟で。
だから夢見りあむは声がつくのは普通だしぶっちゃけ既にサプぼ用意しててこれで一枠ボイスつけなくて済むラッキーwwwwwwみたいなことを運営が思っててもおかしくない。スケジュールとかたいへんだもんね。
逆にかつて実装されたキャラクターは、それこそ先カンブリア時代の化石かガラパゴスの生物かのような「今それある?」みたいなキャラ付けが多いと思うんです。かつてウケていた色物も受けない時代なんです。況や嘗てウケなかったものをやです。
というかそれについては人数が多いのが原因ですね。好きな人には申し訳ないけどなんの魅力も感じられないようなキャラとかいます。まあ190もいたら属性が分散してニッチなスピアが、所謂色物が出てくるのも当たり前だし、私に刺さらないだけかもしれないけど。
だから、ガラパゴスのなかでも希少な存在(需要は少ない)に今総選挙県内が狙えるかと言うと、言わずもがな。Vo200でアイドルCに挑むようなものだと思います。絶望の具現化かよ。
ただ、その中でこの時代でも戦えているのが多くの声付きと圏内で上がってきているアイドルだと思います。なぜ戦えているのか、それは需要があると運営様に判断されているからです。
時の流れは速いもので、南極環流も驚きの速さで進んでいきます。それにつれて客層の嗜好も変わります。
また、人間は成長を好みます。WJから歴史小説まで、まんがタイムきららすら成長を描きます。
結果、ゲーム運営はキャラクターを成長し発展させなければならなくなります。客がついてこないのでは利益も何も無いので。しかし運営にも限界があり、単位時間で出来る仕事Wには上限値が存在します。
だから、重心を人気キャラに置いて少しは利益を増やそうとします。種の少ない植木鉢にそれぞれ肥料を撒くよりは広大な大根畑にバーっとやった方が自分に都合がいい。
要は運営が環境、アイドルが種の地球がモバマスです。ただし絶滅はさせられない。炎上という名のスーパープルームに全てを滅ぼされなかねないし。
ここまでの話を纏めると、新種の適応した生命体に勝つのは難しいから夢見りあむに声がつくのも普通ってことです。
1つ目はうわめっちゃぴんくです。祇園にどピンクなマカロンショップを開いたところを想像したような色だなと思いました。
2つ目にこいつ本当に95あんのかよです。90くらいじゃない?盛ってない?
3つ目にこいつ楽そうだなです。
O-Ki-Mo-Chi-No Observer!と化していた私はどっかで見かけたこれに賛同したのですが、夢見りあむは詰みをそこまで重く捉えてなさそうなんですよね。突然来た訳でもないゆっくりとした詰みに面している時点で多分色々甘く見ていたんだと思います。それは、あまりにも面倒で理想的なメンタルです。ダイヤモンドに巻き付けたうどんが切れただけでこのスポンジはザコメンタルを名乗っています。極めて健康的で羨ましい限りです。そしてなりふり構わず構って貰おうとします。周りの目を気にしないという才能です。これはメンタルに接着剤を吹くようなそれの機能を持ちます。ゾウムシメンタル。
本当にそうですよね。百城千代子もあと2年したら飽きられるらしいですし。そもそもこの発言に石を投げると押すのをやめた瞬間ガトリングになって返ってくるの怖いです。人間いつかは飽きます。
次に、「みんな頑張ってるのにこいつはちやほやされたいだけ」みたいな旨の批判。
実装されて2ヶ月程度でそれを判断するとしたらモバマスは多分半分くらい消えるんじゃないですかね。初発舌打ちのあの人とかモチベも目的も持ってなかったですからね。
「うちの担当は頑張ってるのに」ならいいんです。最初からアイドルになりたかった頑張る人とかスネークならその発言は正しい。しかし、「みんな」はいけない。その時点でその批判に効力はないです。回転攻撃中の瘴気の魔人に通常攻撃してるようなものです。自称雑魚でも吹けば飛ばせます。
他にもいろいろあるが、オタクがちょろいのは自然の摂理なのでそれもOK。他になんか答えてほしいのがあったらコメントにでも書いてくれれば続編が出ます。そんなに見る人間いないか。
で、総選挙に与えている影響ですが、どうでもいいです。
なんとも言えない状況、それだけ。
ただ言えるのは、ぶっちゃけ夢見りあむにはほぼチートに近い性質があることだけ。炎上してしまったりなんだり、すればするほど票が増えていきます。あれ?やばくないこれ?
つまるところそういう意味でも勝てない。心底マジみっともないと思うがこれは無理。夢見りあむには勝てない。少なくとも話題性においては勝てないことは明らかなのだ。だから多くのファンは圏内入れば幸運としか思えない。そんなレベル。
あとこれも借り受けだが、りあむガチ勢が少ないのもある。人が集まれば変人も増え、変な目線も増える。結果外部に害をもたらすこともある。りあむにはまだそれがない。りあむを批判するのはネタになるし、自担を賞賛する横でライバルを貶めるような厄介もりあむ本人以外は多分いない。だから誰もがそれを心地よく玩具にできる。
夢見りあむは幸せだ。他人の喜怒哀楽を餌に巨大化し、本人はそれに何かを思うこともないからだ。
そんなふうに楽に過ごしたいものだ。
実証重視の方々にとっては「物語」の代表に見えるであろう精神分析系の心理療法も、ちゃんと効果が確認されるようになってきたたことです。
それこそ、そのエビデンス(論文)でも提示されればいいんじゃないですかね。
この辺りのこと?
Jonathan Shedler,"The efficacy of psychodynamic psychotherapy."(American Psychologist 2010)
Falk Leichsenring,Sven Rabung,"Effectiveness of Long-term Psychodynamic Psychotherapy: A Meta-analysis"(JAMA 2008)
精神分析医のフィーリス曰く(1)、フロイト派のセラピーはビクトリア時代の人たちには、うまく機能していたが20世紀半ば以降、人々の「性格の鎧」の質が変わり、セラピーはうまく機能せずに行き詰まって失敗することが多かった。
フロイト派の精神分析法は、「幼少期の体験が成人してからの人格の基礎となる」というものが骨子の一つ(2)だが、そのことに大打撃を与える調査が出てきた。1990年代にマシュマロ実験の文献を詳しく調べたマーティン・セリグマンは、幼年期のできごとが成人してからの人格に影響を与えるということは、ひどい心的外傷や栄養失調があった場合にはありうるかもしれないが、それ以外では有力な証拠がほとんどないと結論づけている(3)。子供時代と成人してからの性質に、ごくわずかな相関は認められるが、それは主に遺伝的(生まれつきの)性質、つまり概して明るいとか気難しいといった性質の反映として説明できるという。
また心理学者のバウマイスター一同がフロイトの提唱する理論的メカニズムの数々を現代の文献と付き合わせて検証したところ、最も最悪な理論が昇華説だということが判明した(4)。そもそも昇華説には根拠がない上、事実はその逆だと考えられる理由が多いからだ。
もちろん、フロイトの理論は示唆的で興味深いものが多いし、余談だが「快感原則の彼岸」については現代思想の中ではかなり重要な位置づけになっている。ラカンも執拗にこの論文にこだわるわけだしね。
それに、フロイトの批判をしたバウマイスターは、フロイトの提唱する説でエネルギーが重要な位置に置かれていることに敬意を表して、フロイトが使っていた自己を指す言葉「自我(エゴ)」を使って、「自我消耗」という言葉を「人の思考や感情や行動を規制する能力が減る現象」に名付けた。自我消耗に関しては、後に脳波記録検査法(EEG)で脳内の前帯状皮質におけるスパイク発火(エラー関連陰性電位)が対応する脳機能であることが確認された(5)。
著名な心理学者であるスティーブン・ピンカーは、 今回で言えば「人生全体」「物語の蓄積」「人生の深み」といったことで、科学の基本的研究方略である「単純化(simplify)」を退けようとしていることに苦言を呈している(6)。 研究の対象をとなる複雑な現象をいろいろなレベルに単純化し、いろいろなレベルごとに 解明していくことを拒んで、複雑な現象をありのままに理解しようとしていたのでは研究はいつまでたっても現状に停滞したままになる。単純化を嫌って、複雑な現象を複雑なままで捉えようとする人文系学問に多く見られるのこうした研究方略を、ピンカーは完全な正確さを求めて「原寸大の地図」 を作った愚かな地図職人を描いたホルヘ・ルイス・ボルヘス(Jorge Luis Borges)の寓話で批判している。
現代心理学の始まりがブント(Wilhelm Wundt: 1832-1920)のライプチヒ大学での心理学実験室創設とされるように、そのスタートから科学を目指したものだった(7)。 人文学の科学化と言っても、物理学や化学の実験を導入するのではなく、心理学の実験手法や神経科学の実験手法(EEG、fMRIなど)を取り入れればいいのである。また、国際的な科学的心理学の学会APS(Association for Psychological Science)の会長だったカシオッポはこうした点に注目し、心理学が科学と他の文系の学問とのハブとなるべきであると主張している(8)。
個人的には、人生全体からの人間理解やフロイト理論の人間理解よりも、人類史からの人間理解(進化心理学)(9)や神経科学からの人間理解の方(10)がより多くのことと整合性が有ると思うし、「物語」を一切考慮しないで休職者の約53%を予測したリシテア(11)といったことの研究に心理学がより一層取り組んでいくことを願ってるわ。
▼出典
(1)Allen Wheelis,"The Quest for ldentity"(New York: Norton,1958).
(2)Sigmund Freud,"Drei Abhandlungen zur Sexualtheorie(『性理論三篇』)"(1905)
(3)M.E.P.Seligman,"What You Can Change and What You Can't :The Complete Guide to Succesful Self-Improvement"(New York:Alfred A.Knopf,1993).
(4)Roy F. Baumeister,Karen Dale,Kristin L. Sommer,"Freudian Defense Mechanisms and Empirical Findings in Modern SocialPsychology: Reaction Formation, Projection, Displacement, Undoing, Isolation, Sublimation, and Denial"(Journal of Personality,1998)
(5)Michael Inzlicht,Jennifer N. Gutsell,"Running on Empty: Neural Signals for Self-Control Failure",(Psychological Science 2007)
(6)Pinker, S."Science Is Not Your Enemy: An impassioned plea to neglected novelists, embattled professors, and tenure-less historians." (New Republic, 2013)
(7)Bringmann, W. G., Bringmann, N. J., & Ungerer, G. A."The establishment of Wundt's laboratory: An archival and documentary study." (W. G. Bringmann, & R. D. Tweney (Eds.), Wundt studies: A centennial collection (pp. 123-157). Toronto: Hogrefe. 1980)
(8)John Cacioppo,"Psychology is a Hub Science"(Observer 2007)
(9)Martin Daly, Margo Wilson,"How evolutionary thinking inspires and disciplines psychological hypotheses." Pp. 15-22 in XT Wang & YJ Su, eds., Thus spake evolutionary psychologists.(Peking University Press,2011)
(10)一例を挙げれば、心の理論(Theory of mind)における神経科学の役割とか。サイモン・バロン=コーエンが有名だろうが、研究は色々有りすぎて挙げきれない。
(11)HR テクノロジーで、人や組織のパフォーマンスの最大化を図る 「リシテア/AI 分析」サービスを販売開始(https://www.hitachi-solutions.co.jp/company/press/news/2016/1201.pdf)
元増田です。ありがとうございます。
ここの所は、今回の例ではいまいち見えづらい気がする。
たしかに、そうですね…
攻撃を支持した時点で刀をふりあげて、そのあいだに毒でモンスターが死んだら、納刀する、のような場合では、モデル・ビューの関連が密になる例になるでしょうか。
これは知りませんでした。基本クラスのレベルでObserverパターンがサポートされる!しかもタイプセーフ…
Mac OS X のCocoaフレームワークにも KVO という同様の仕組みがありますが、型のチェックは自分でする必要があります。
MOVEは望まれなかった子 - the sea of fertility
詳細はこちら
http://d.hatena.ne.jp/Monar/20080312
http://blog.livedoor.jp/dankogai/archives/50827276.html
そして、こっから私の意見。
アルファブロガーという定義をあまりにも小飼さんやその他の人たちに都合のいいものに勝手に定義していないでしょうか。
アルファブロガーの定義をGIGAZINEやショコタンを除外して省く様に定義しておけば、確かに絶対にGIGAZINEはアルファになれるはずもありません。
GIGAZINEは世界的に見ればまちがいなく、小飼何某よりも影響力の大きいブロガーです。
本の書評ばっかり書いてる人が自分をアルファだと語ってるようじゃ世界の笑いものです。
様々なジャンルのニュースを紹介してとんでもないアクセス数を叩き出すGIGAZINEというサイトと、
本の書評だけを紹介する井の中のサイト、どっちがアルファでしょうか。
どっちも自分が有意義と思ったものを宣伝行為をするブログという点では同じだと思いますが。
小飼さんだけを書きましたが、いじりやすかったからです。他のブログも同じテーマでGIGAZINEがアルファブロガーでない理由を
小飼さん以上に熱く語っています。なぜ定義がおかしいと気が付かないのでしょうか。
そっくりそのままコピペ
http://d.hatena.ne.jp/Monar/20080312
2008-03-12 Observer紙が選ぶ!世界のブログ50選にGIGAZINEがランクインしてる件 CommentsAdd Star
The world’s 50 most powerful blogs
これによると、
Gigazine is the most popular blog in Japan
だそうですよ!
ちなみにこのランキングが掲載された別冊子には10位にランクインしたGawker, Manhattan Media News and Gossipのニック・デントンのインタビューも載ってます。
/* Ten */
if (typeof(Ten) == 'undefined') {
Ten = {};
}
Ten.NAME = 'Ten';
Ten.VERSION = 0.06;
/* Ten.Class */
Ten.Class = function(klass, prototype) {
if (klass && klass.initialize) {
var c = klass.initialize;
} else if(klass && klass.base) {
var c = function() { return klass.base[0].apply(this, arguments) };
} else {
var c = function() {};
}
c.prototype = prototype || {};
c.prototype.constructor = c;
Ten.Class.inherit(c, klass);
if (klass && klass.base) {
for (var i = 0; i < klass.base.length; i++) {
var parent = klass.base[i];
if (i == 0) {
c.SUPER = parent;
c.prototype.SUPER = parent.prototype;
}
Ten.Class.inherit(c, parent);
Ten.Class.inherit(c.prototype, parent.prototype);
}
}
return c;
}
Ten.Class.inherit = function(child,parent) {
for (var prop in parent) {
if (typeof(child[prop]) != 'undefined' || prop == 'initialize') continue;
child[prop] = parent[prop];
}
}
/*
// Basic Ten Classes
**/
/* Ten.JSONP */
Ten.JSONP = new Ten.Class({
initialize: function(uri,obj,method) {
if (Ten.JSONP.Callbacks.length) {
setTimeout(function() {new Ten.JSONP(uri,obj,method)}, 500);
return;
}
var del = uri.match(/\?/) ? '&' : '?';
uri += del + 'callback=Ten.JSONP.callback';
if (!uri.match(/timestamp=/)) {
uri += '&' + encodeURI(new Date());
}
if (obj && method) Ten.JSONP.addCallback(obj,method);
this.script = document.createElement('script');
this.script.src = uri;
this.script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(this.script);
},
addCallback: function(obj,method) {
Ten.JSONP.Callbacks.push({object: obj, method: method});
},
callback: function(args) {
// alert('callback called');
var cbs = Ten.JSONP.Callbacks;
for (var i = 0; i < cbs.length; i++) {
var cb = cbs[i];
cb.object[cb.method].call(cb.object, args);
}
Ten.JSONP.Callbacks = [];
},
MaxBytes: 8000,
Callbacks: []
});
/* Ten.XHR */
Ten.XHR = new Ten.Class({
initialize: function(uri,opts,obj,method) {
if (!uri) return;
this.request = Ten.XHR.getXMLHttpRequest();
this.callback = {object: obj, method: method};
var xhr = this;
var prc = this.processReqChange;
this.request.onreadystatechange = function() {
prc.apply(xhr, arguments);
}
var method = opts.method || 'GET';
this.request.open(method, uri, true);
if (method == 'POST') {
this.request.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
}
var data = opts.data ? Ten.XHR.makePostData(opts.data) : null;
this.request.send(data);
},
getXMLHttpRequest: function() {
var xhr;
var tryThese = [
function () { return new XMLHttpRequest(); },
function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
];
for (var i = 0; i < tryThese.length; i++) {
var func = tryThese[i];
try {
xhr = func;
return func();
} catch (e) {
//alert(e);
}
}
return xhr;
},
makePostData: function(data) {
var pairs = [];
var regexp = /%20/g;
for (var k in data) {
var v = data[k].toString();
var pair = encodeURIComponent(k).replace(regexp,'+') + '=' +
encodeURIComponent(v).replace(regexp,'+');
pairs.push(pair);
}
return pairs.join('&');
}
},{
processReqChange: function() {
var req = this.request;
if (req.readyState == 4) {
if (req.status == 200) {
var cb = this.callback;
cb.object[cb.method].call(cb.object, req);
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText);
}
}
}
});
/* Ten.Observer */
Ten.Observer = new Ten.Class({
initialize: function(element,event,obj,method) {
var func = obj;
if (typeof(method) == 'string') {
func = obj[method];
}
this.element = element;
this.event = event;
this.listener = function(event) {
return func.call(obj, new Ten.Event(event || window.event));
}
if (this.element.addEventListener) {
if (this.event.match(/^on(.+)$/)) {
this.event = RegExp.$1;
}
this.element.addEventListener(this.event, this.listener, false);
} else if (this.element.attachEvent) {
this.element.attachEvent(this.event, this.listener);
}
}
},{
stop: function() {
if (this.element.removeEventListener) {
this.element.removeEventListener(this.event,this.listener,false);
} else if (this.element.detachEvent) {
this.element.detachEvent(this.event,this.listener);
}
}
});
/* Ten.Event */
Ten.Event = new Ten.Class({
initialize: function(event) {
this.event = event;
},
keyMap: {
8:"backspace", 9:"tab", 13:"enter", 19:"pause", 27:"escape", 32:"space",
33:"pageup", 34:"pagedown", 35:"end", 36:"home", 37:"left", 38:"up",
39:"right", 40:"down", 44:"printscreen", 45:"insert", 46:"delete",
112:"f1", 113:"f2", 114:"f3", 115:"f4", 116:"f5", 117:"f6", 118:"f7",
119:"f8", 120:"f9", 121:"f10", 122:"f11", 123:"f12",
144:"numlock", 145:"scrolllock"
}
},{
mousePosition: function() {
if (!this.event.clientX) return;
return Ten.Geometry.getMousePosition(this.event);
},
isKey: function(name) {
var ecode = this.event.keyCode;
if (!ecode) return;
var ename = Ten.Event.keyMap[ecode];
if (!ename) return;
return (ename == name);
},
targetIsFormElements: function() {
var target = this.event.target;
if (!target) return;
var T = (target.tagName || '').toUpperCase();
return (T == 'INPUT' || T == 'SELECT' || T == 'OPTION' ||
T == 'BUTTON' || T == 'TEXTAREA');
},
stop: function() {
var e = this.event;
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
} else {
e.cancelBubble = true;
e.returnValue = false;
}
}
});
/* Ten.DOM */
Ten.DOM = new Ten.Class({
getElementsByTagAndClassName: function(tagName, className, parent) {
if (typeof(parent) == 'undefined') {
parent = document;
}
var children = parent.getElementsByTagName(tagName);
if (className) {
var elements = [];
for (var i = 0; i < children.length; i++) {
var child = children[i];
var cls = child.className;
if (!cls) {
continue;
}
var classNames = cls.split(' ');
for (var j = 0; j < classNames.length; j++) {
if (classNames[j] == className) {
elements.push(child);
break;
}
}
}
return elements;
} else {
return children;
}
},
removeEmptyTextNodes: function(element) {
var nodes = element.childNodes;
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
node.parentNode.removeChild(node);
}
}
},
nextElement: function(elem) {
do {
elem = elem.nextSibling;
} while (elem && elem.nodeType != 1);
return elem;
},
prevElement: function(elem) {
do {
elem = elem.previousSibling;
} while (elem && elem.nodeType != 1);
return elem;
},
scrapeText: function(node) {
var rval = [];
(function (node) {
var cn = node.childNodes;
if (cn) {
for (var i = 0; i < cn.length; i++) {
arguments.callee.call(this, cn[i]);
}
}
var nodeValue = node.nodeValue;
if (typeof(nodeValue) == 'string') {
rval.push(nodeValue);
}
})(node);
return rval.join('');
},
onLoadFunctions: [],
loaded: false,
timer: null,
addEventListener: function(event,func) {
if (event != 'load') return;
Ten.DOM.onLoadFunctions.push(func);
Ten.DOM.checkLoaded();
},
checkLoaded: function() {
var c = Ten.DOM;
if (c.loaded) return true;
if (document && document.getElementsByTagName &&
document.getElementById && document.body) {
if (c.timer) {
clearInterval(c.timer);
c.timer = null;
}
for (var i = 0; i < c.onLoadFunctions.length; i++) {
c.onLoadFunctions[i]();
}
c.onLoadFunctions = [];
c.loaded = true;
} else {
c.timer = setInterval(c.checkLoaded, 13);
}
}
});
/* Ten.Style */
Ten.Style = new Ten.Class({
applyStyle: function(elem, style) {
for (prop in style) {
elem.style[prop] = style[prop];
}
}
});
/* Ten.Geometry */
Ten.Geometry = new Ten.Class({
initialize: function() {
if (Ten.Geometry._initialized) return;
var func = Ten.Geometry._functions;
var de = document.documentElement;
if (window.innerWidth) {
func.getWindowWidth = function() { return window.innerWidth; }
func.getWindowHeight = function() { return window.innerHeight; }
func.getXScroll = function() { return window.pageXOffset; }
func.getYScroll = function() { return window.pageYOffset; }
} else if (de && de.clientWidth) {
func.getWindowWidth = function() { return de.clientWidth; }
func.getWindowHeight = function() { return de.clientHeight; }
func.getXScroll = function() { return de.scrollLeft; }
func.getYScroll = function() { return de.scrollTop; }
} else if (document.body.clientWidth) {
func.getWindowWidth = function() { return document.body.clientWidth; }
func.getWindowHeight = function() { return document.body.clientHeight; }
func.getXScroll = function() { return document.body.scrollLeft; }
func.getYScroll = function() { return document.body.scrollTop; }
}
Ten.Geometry._initialized = true;
},
_initialized: false,
_functions: {},
getScroll: function() {
if (!Ten.Geometry._initialized) new Ten.Geometry;
return {
x: Ten.Geometry._functions.getXScroll(),
y: Ten.Geometry._functions.getYScroll()
};
},
getMousePosition: function(pos) {
// pos should have clientX, clientY same as mouse event
if ((navigator.userAgent.indexOf('Safari') > -1) &&
(navigator.userAgent.indexOf('Version/') < 0)) {
return {
x: pos.clientX,
y: pos.clientY
};
} else {
var scroll = Ten.Geometry.getScroll();
return {
x: pos.clientX + scroll.x,
y: pos.clientY + scroll.y
};
}
},
getElementPosition: function(e) {
return {
x: e.offsetLeft,
y: e.offsetTop
};
},
getWindowSize: function() {
if (!Ten.Geometry._initialized) new Ten.Geometry;
return {
w: Ten.Geometry._functions.getWindowWidth(),
h: Ten.Geometry._functions.getWindowHeight()
};
}
});
/* Ten.Position */
Ten.Position = new Ten.Class({
initialize: function(x,y) {
this.x = x;
this.y = y;
},
subtract: function(a,b) {
return new Ten.Position(a.x - b.x, a.y - b.y);
}
});
/*
// require Ten.js
**/
/* Ten.SubWindow */
Ten.SubWindow = new Ten.Class({
initialize: function() {
var c = this.constructor;
if (c.singleton && c._cache) {
return c._cache;
}
var div = document.createElement('div');
Ten.Style.applyStyle(div, Ten.SubWindow._baseStyle);
Ten.Style.applyStyle(div, c.style);
this.window = div;
this.addContainerAndCloseButton();
document.body.appendChild(div);
if (c.draggable) {
this._draggable = new Ten.Draggable(div, this.handle);
}
if (c.singleton) c._cache = this;
return this;
},
_baseStyle: {
color: '#000',
position: 'absolute',
display: 'none',
zIndex: 2,
left: 0,
top: 0,
backgroundColor: '#fff',
border: '1px solid #bbb'
},
style: {
padding: '2px',
textAlign: 'center',
borderRadius: '6px',
MozBorderRadius: '6px',
width: '100px',
height: '100px'
},
handleStyle: {
position: 'absolute',
top: '0px',
left: '0px',
backgroundColor: '#f3f3f3',
borderBottom: '1px solid #bbb',
width: '100%',
height: '30px'
},
containerStyle: {
margin: '32px 0 0 0',
padding: '0 10px'
},
// closeButton: 'close.gif',
closeButton: 'http://s.hatena.com/images/close.gif',
closeButtonStyle: {
position: 'absolute',
top: '8px',
right: '10px',
cursor: 'pointer'
},
_baseScreenStyle: {
position: 'absolute',
top: '0px',
left: '0px',
display: 'none',
zIndex: 1,
overflow: 'hidden',
width: '100%',
height: '100%'
},
screenStyle: {},
showScreen: true,
singleton: true,
draggable: true,
_cache: null
},{
screen: null,
windowObserver: null,
visible: false,
addContainerAndCloseButton: function() {
var win = this.window;
var c = this.constructor;
var div = document.createElement('div');
win.appendChild(div);
Ten.Style.applyStyle(div, c.containerStyle);
this.container = div;
if (c.handleStyle) {
var handle = document.createElement('div');
Ten.Style.applyStyle(handle, c.handleStyle);
win.appendChild(handle);
this.handle = handle;
}
if (c.closeButton) {
var btn = document.createElement('img');
btn.src = c.closeButton;
btn.alt = 'close';
Ten.Style.applyStyle(btn, c.closeButtonStyle);
win.appendChild(btn);
new Ten.Observer(btn, 'onclick', this, 'hide');
this.closeButton = btn;
}
if (c.showScreen) {
var screen = document.createElement('div');
Ten.Style.applyStyle(screen, Ten.SubWindow._baseScreenStyle);
Ten.Style.applyStyle(screen, c.screenStyle);
document.body.appendChild(screen);
this.screen = screen;
new Ten.Observer(screen, 'onclick', this, 'hide');
}
},
show: function(pos) {
pos = (pos.x && pos.y) ? pos : {x:0, y:0};
with (this.window.style) {
display = 'block';
left = pos.x + 'px';
top = pos.y + 'px';
}
if (this.screen) {
with (this.screen.style) {
display = 'block';
left = Ten.Geometry.getScroll().x + 'px';
top = Ten.Geometry.getScroll().y + 'px';
}
}
this.windowObserver = new Ten.Observer(document.body, 'onkeypress', this, 'handleEscape');
this.visible = true;
},
handleEscape: function(e) {
if (!e.isKey('escape')) return;
this.hide();
},
hide: function() {
if (this._draggable) this._draggable.endDrag();
this.window.style.display = 'none';
if (this.screen) this.screen.style.display = 'none';
if (this.windowObserver) this.windowObserver.stop();
this.visible = false;
}
});
/* Ten.Draggable */
Ten.Draggable = new Ten.Class({
initialize: function(element,handle) {
this.element = element;
this.handle = handle || element;
this.startObserver = new Ten.Observer(this.handle, 'onmousedown', this, 'startDrag');
this.handlers = [];
}
},{
startDrag: function(e) {
if (e.targetIsFormElements()) return;
this.delta = Ten.Position.subtract(
e.mousePosition(),
Ten.Geometry.getElementPosition(this.element)
);
this.handlers = [
new Ten.Observer(document, 'onmousemove', this, 'drag'),
new Ten.Observer(document, 'onmouseup', this, 'endDrag'),
new Ten.Observer(this.element, 'onlosecapture', this, 'endDrag')
];
e.stop();
},
drag: function(e) {
var pos = Ten.Position.subtract(e.mousePosition(), this.delta);
Ten.Style.applyStyle(this.element, {
left: pos.x + 'px',
top: pos.y + 'px'
});
e.stop();
},
endDrag: function(e) {
for (var i = 0; i < this.handlers.length; i++) {
this.handlers[i].stop();
}
if(e) e.stop();
}
});
/* Hatena */
if (typeof(Hatena) == 'undefined') {
Hatena = {};
}
/* Hatena.User */
Hatena.User = new Ten.Class({
initialize: function(name) {
this.name = name;
},
getProfileIcon: function(name) {
if (!name) name = 'user';
var pre = name.match(/^[\w-]{2}/)[0];
var img = document.createElement('img');
img.src = 'http://www.hatena.ne.jp/users/' + pre + '/' + name + '/profile_s.gif';
img.alt = name;
img.setAttribute('class', 'profile-icon');
img.setAttribute('width','16px');
img.setAttribute('height','16px');
with (img.style) {
margin = '0 3px';
border = 'none';
verticalAlign = 'middle';
}
return img;
}
}, {
profileIcon: function() {
return Hatena.User.getProfileIcon(this.name);
}
});
/* Hatena.Star */
if (typeof(Hatena.Star) == 'undefined') {
Hatena.Star = {};
}
/*
// Hatena.Star.* classes //
**/
if (window.location && window.location.host.match(/hatena\.com/)) {
Hatena.Star.BaseURL = 'http://s.hatena.com/';
} else {
Hatena.Star.BaseURL = 'http://s.hatena.ne.jp/';
}
Hatena.Star.Token = null;
/* Hatena.Star.User */
Hatena.Star.User = new Ten.Class({
base: [Hatena.User],
initialize: function(name) {
if (Hatena.Star.User._cache[name]) {
return Hatena.Star.User._cache[name];
} else {
this.name = name;
Hatena.Star.User._cache[name] = this;
return this;
}
},
_cache: {}
},{
userPage: function() {
return Hatena.Star.BaseURL + this.name + '/';
}
});
/* Hatena.Star.Entry */
Hatena.Star.Entry = new Ten.Class({
initialize: function(e) {
this.entry = e;
this.uri = e.uri;
this.title = e.title;
this.star_container = e.star_container;
this.comment_container = e.comment_container;
this.stars = [];
this.comments = [];
},
maxStarCount: 11
},{
flushStars: function() {
this.stars = [];
this.star_container.innerHTML = '';
},
bindStarEntry: function(se) {
this.starEntry = se;
for (var i = 0; i < se.stars.length; i++) {
if (typeof(se.stars[i]) == 'number') {
this.stars.push(new Hatena.Star.InnerCount(se.stars[i],this));
} else {
this.stars.push(new Hatena.Star.Star(se.stars[i]));
}
}
if (se.comments && !this.comments.length) {
for (var i = 0; i < se.comments.length; i++) {
this.comments.push(new Hatena.Star.Comment(se.comments[i]));
}
}
this.can_comment = se.can_comment;
},
setCanComment: function(v) {
this.can_comment = v;
},
showButtons: function() {
this.addAddButton();
this.addCommentButton();
},
addAddButton: function() {
if (this.star_container) {
this.addButton = new Hatena.Star.AddButton(this);
this.star_container.appendChild(this.addButton);
}
},
addCommentButton: function() {
if (this.comment_container) {
this.commentButton = new Hatena.Star.CommentButton(this);
this.comment_container.appendChild(this.commentButton.img);
}
},
showStars: function() {
var klass = this.constructor;
// if (this.stars.length > klass.maxStarCount) {
// var ic = new Hatena.Star.InnerCount(this.stars.slice(1,this.stars.length));
// this.star_container.appendChild(this.stars[0]);
// this.star_container.appendChild(ic);
// this.star_container.appendChild(this.stars[this.stars.length - 1]);
// } else {
for (var i = 0; i < this.stars.length; i++) {
this.star_container.appendChild(this.stars[i]);
}
},
showCommentButton: function() {
if (this.can_comment) {
this.commentButton.show();
if (this.comments.length) this.commentButton.activate();
} else {
// this.commentButton.hide();
}
},
addStar: function(star) {
this.stars.push(star);
this.star_container.appendChild(star);
},
addComment: function(com) {
if (!this.comments) this.comments = [];
if (this.comments.length == 0) {
this.commentButton.activate();
}
this.comments.push(com);
},
showCommentCount: function() {
this.comment_container.innerHTML += this.comments.length;
}
});
/* Hatena.Star.Button */
Hatena.Star.Button = new Ten.Class({
createButton: function(args) {
var img = document.createElement('img');
img.src = args.src;
img.alt = img.title = args.alt;
with (img.style) {
cursor = 'pointer';
margin = '0 3px';
padding = '0';
border = 'none';
verticalAlign = 'middle';
}
return img;
}
});
/* Hatena.Star.AddButton */
Hatena.Star.AddButton = new Ten.Class({
base: ['Hatena.Star.Button'],
initialize: function(entry) {
this.entry = entry;
this.lastPosition = null;
var img = Hatena.Star.Button.createButton({
src: Hatena.Star.AddButton.ImgSrc,
alt: 'Add Star'
});
this.observer = new Ten.Observer(img,'onclick',this,'addStar');
this.img = img;
return img;
},
ImgSrc: Hatena.Star.BaseURL + 'images/add.gif'
},{
addStar: function(e) {
this.lastPosition = e.mousePosition();
var uri = Hatena.Star.BaseURL + 'star.add.json?uri=' + encodeURIComponent(this.entry.uri) +
'&title=' + encodeURIComponent(this.entry.title);
if (Hatena.Star.Token) {
uri += '&token=' + Hatena.Star.Token;
}
new Ten.JSONP(uri, this, 'receiveResult');
},
receiveResult: function(args) {
var name = args ? args.name : null;
if (name) {
this.entry.addStar(new Hatena.Star.Star({name: name}));
//alert('Succeeded in Adding Star ' + args);
} else if (args.errors) {
var pos = this.lastPosition;
pos.x -= 10;
pos.y += 25;
var scroll = Ten.Geometry.getScroll();
var scr = new Hatena.Star.AlertScreen();
var alert = args.errors[0];
scr.showAlert(alert, pos);
}
}
});
/* Hatena.Star.CommentButton */
Hatena.Star.CommentButton = new Ten.Class({
base: ['Hatena.Star.Button'],
initialize: function(entry) {
this.entry = entry;
this.lastPosition = null;
var img = Hatena.Star.Button.createButton({
src: Hatena.Star.CommentButton.ImgSrc,
alt: 'Comments'
});
img.style.display = 'none';
this.observer = new Ten.Observer(img,'onclick',this,'showComments');
this.img = img;
},
ImgSrc: Hatena.Star.BaseURL + 'images/comment.gif',
ImgSrcActive: Hatena.Star.BaseURL + 'images/comment_active.gif'
},{
showComments: function(e) {
if (!this.screen) this.screen = new Hatena.Star.CommentScreen();
this.screen.bindEntry(this.entry);
var pos = e.mousePosition();
pos.y += 25;
this.screen.showComments(this.entry, pos);
},
hide: function() {
this.img.style.display = 'none';
},
show: function() {
this.img.style.display = 'inline';
},
activate: function() {
this.show();
this.img.src = Hatena.Star.CommentButton.ImgSrcActive;
}
});
/* Hatena.Star.Star */
Hatena.Star.Star = new Ten.Class({
initialize: function(args) {
if (args.img) {
this.img = args.img;
this.name = this.img.getAttribute('alt');
} else {
this.name = args.name;
var img = document.createElement('img');
img.src = Hatena.Star.Star.ImgSrc;
img.alt = this.name;
with (img.style) {
padding = '0';
border = 'none';
}
this.img = img;
}
new Ten.Observer(this.img,'onmouseover',this,'showName');
new Ten.Observer(this.img,'onmouseout',this,'hideName');
if (this.name) {
this.user = new Hatena.Star.User(this.name);
this.img.style.cursor = 'pointer';
new Ten.Observer(this.img,'onclick',this,'goToUserPage');
}
if (args.count && args.count > 1) {
var c = document.createElement('span');
c.setAttribute('class', 'hatena-star-inner-count');
Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
c.innerHTML = args.count;
var s = document.createElement('span');
s.appendChild(img);
s.appendChild(c);
return s;
} else {
return this.img;
}
},
ImgSrc: Hatena.Star.BaseURL + 'images/star.gif'
},{
showName: function(e) {
if (!this.screen) this.screen = new Hatena.Star.NameScreen();
var pos = e.mousePosition();
pos.x += 10;
pos.y += 25;
this.screen.showName(this.name, pos);
},
hideName: function() {
if (!this.screen) return;
this.screen.hide();
},
goToUserPage: function() {
window.location = this.user.userPage();
}
});
/* Hatena.Star.InnerCount */
Hatena.Star.InnerCount = new Ten.Class({
initialize: function(count, e) {
this.count = count;
this.entry = e;
var c = document.createElement('span');
c.setAttribute('class', 'hatena-star-inner-count');
Ten.Style.applyStyle(c, Hatena.Star.InnerCount.style);
c.style.cursor = 'pointer';
c.innerHTML = count;
new Ten.Observer(c,'onclick',this,'showInnerStars');
this.container = c;
return c;
},
style: {
color: '#f4b128',
fontWeight: 'bold',
fontSize: '80%',
fontFamily: '"arial", sans-serif',
margin: '0 2px'
}
},{
showInnerStars: function() {
var url = Hatena.Star.BaseURL + 'entry.json?uri=' +
encodeURIComponent(this.entry.uri);
new Ten.JSONP(url, this, 'receiveStarEntry');
},
receiveStarEntry: function(res) {
var se = res.entries[0];
var e = this.entry;
if (encodeURIComponent(se.uri) != encodeURIComponent(e.uri)) return;
e.flushStars();
e.bindStarEntry(se);
e.addAddButton();
e.showStars();
}
});
/* Hatena.Star.Comment */
Hatena.Star.Comment = new Ten.Class({
initialize: function(args) {
this.name = args.name;
this.body = args.body;
}
},{
asElement: function() {
var div = document.createElement('div');
with (div.style) {
margin = '0px 0';
padding = '5px 0';
borderBottom = '1px solid #ddd';
}
var ico = Hatena.User.getProfileIcon(this.name);
div.appendChild(ico);
var span = document.createElement('span');
with(span.style) {
fontSize = '90%';
}
span.innerHTML = this.body;
div.appendChild(span);
return div;
}
});
/* Hatena.Star.NameScreen */
Hatena.Star.NameScreen = new Ten.Class({
base: [Ten.SubWindow],
style: {
padding: '2px',
textAlign: 'center'
},
containerStyle: {
margin: 0,
padding: 0
},
handleStyle: null,
showScreen: false,
closeButton: null,
draggable: false
},{
showName: function(name, pos) {
this.container.innerHTML = '';
this.container.appendChild(Hatena.User.getProfileIcon(name));
this.container.appendChild(document.createTextNode(name));
this.show(pos);
}
});
/* Hatena.Star.AlertScreen */
Hatena.Star.AlertScreen = new Ten.Class({
base: [Ten.SubWindow],
style: {
padding: '2px',
textAlign: 'center',
borderRadius: '6px',
MozBorderRadius: '6px',
width: '240px',
height: '120px'
},
handleStyle: {
position: 'absolute',
top: '0px',
left: '0px',
backgroundColor: '#f3f3f3',
borderBottom: '1px solid #bbb',
width: '100%',
height: '30px',
borderRadius: '6px 6px 0 0',
MozBorderRadius: '6px 6px 0 0'
}
},{
showAlert: function(msg, pos) {
this.container.innerHTML = msg;
var win = Ten.Geometry.getWindowSize();
var scr = Ten.Geometry.getScroll();
var w = parseInt(this.constructor.style.width) + 20;
if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
this.show(pos);
}
});
/* Hatena.Star.CommentScreen */
Hatena.Star.CommentScreen = new Ten.Class({
base: [Ten.SubWindow],
initialize: function() {
var self = this.constructor.SUPER.call(this);
if (!self.commentsContainer) self.addCommentsContainer();
return self;
},
style: {
width: '280px',
height: '280px',
overflowY: 'auto',
padding: '2px',
textAlign: 'center',
borderRadius: '6px',
MozBorderRadius: '6px'
},
handleStyle: {
position: 'absolute',
top: '0px',
left: '0px',
backgroundColor: '#f3f3f3',
borderBottom: '1px solid #bbb',
width: '100%',
height: '30px',
borderRadius: '6px 6px 0 0',
MozBorderRadius: '6px 6px 0 0'
},
containerStyle: {
margin: '32px 0 0 0',
textAlign: 'left',
padding: '0 10px'
},
getLoadImage: function() {
var img = document.createElement('img');
img.src = Hatena.Star.BaseURL + 'images/load.gif';
img.setAttribute('alt', 'Loading');
with (img.style) {
verticalAlign = 'middle';
margin = '0 2px';
}
return img;
}
},{
addCommentsContainer: function() {
var div = document.createElement('div');
with (div.style) {
marginTop = '-3px';
}
this.container.appendChild(div);
this.commentsContainer = div;
},
showComments: function(e, pos) {
var comments = e.comments;
if (!comments) comments = [];
this.commentsContainer.innerHTML = '';
for (var i=0; i<comments.length; i++) {
this.commentsContainer.appendChild(comments[i].asElement());
}
if (e.starEntry && !e.can_comment) {
this.hideCommentForm();
} else {
this.addCommentForm();
}
var win = Ten.Geometry.getWindowSize();
var scr = Ten.Geometry.getScroll();
var w = parseInt(this.constructor.style.width) + 20;
if (pos.x + w > scr.x + win.w) pos.x = win.w + scr.x - w;
this.show(pos);
},
bindEntry: function(e) {
this.entry = e;
},
sendComment: function(e) {
if (!e.isKey('enter')) return;
var body = this.commentInput.value;
if (!body) return;
this.commentInput.disabled = 'true';
this.showLoadImage();
var url = Hatena.Star.BaseURL + 'comment.add.json?body=' + encodeURIComponent(body) +
'&uri=' + encodeURIComponent(this.entry.uri) +
'&title=' + encodeURIComponent(this.entry.title);
new Ten.JSONP(url, this, 'receiveResult');
},
receiveResult: function(args) {
if (!args.name || !args.body) return;
this.commentInput.value = '';
this.commentInput.disabled = '';
this.hideLoadImage();
var com = new Hatena.Star.Comment(args);
this.entry.addComment(com);
this.commentsContainer.appendChild(com.asElement());
},
showLoadImage: function() {
if (!this.loadImage) return;
this.loadImage.style.display = 'inline';
},
hideLoadImage: function() {
if (!this.loadImage) return;
this.loadImage.style.display = 'none';
},
hideCommentForm: function() {
if (!this.commentForm) return;
this.commentForm.style.display = 'none';
},
addCommentForm: function() {
if (this.commentForm) {
this.commentForm.style.display = 'block';
return;
}
var form = document.createElement('div');
this.container.appendChild(form);
this.commentForm = form;
with (form.style) {
margin = '0px 0';
padding = '5px 0';
// borderTop = '1px solid #ddd';
}
//if (Hatena.Visitor) {
// form.appendChild(Hatena.Visitor.profileIcon());
//} else {
// form.appendChild(Hatena.User.getProfileIcon());
//}
var input = document.createElement('input');
input.type = 'text';
with (input.style) {
width = '215px';
border = '1px solid #bbb';
padding = '3px';
}
form.appendChild(input);
this.commentInput = input;
var img = this.constructor.getLoadImage();
this.loadImage = img;
this.hideLoadImage();
form.appendChild(img);
new Ten.Observer(input,'onkeypress',this,'sendComment');
}
});
/* Hatena.Star.EntryLoader */
Hatena.Star.EntryLoader = new Ten.Class({
initialize: function() {
var entries = Hatena.Star.EntryLoader.loadEntries();
this.entries = [];
for (var i = 0; i < entries.length; i++) {
var e = new Hatena.Star.Entry(entries[i]);
e.showButtons();
this.entries.push(e);
}
this.getStarEntries();
},
createStarContainer: function() {
var sc = document.createElement('span');
sc.setAttribute('class', 'hatena-star-star-container');
sc.style.marginLeft = '1px';
return sc;
},
createCommentContainer: function() {
var cc = document.createElement('span');
cc.setAttribute('class', 'hatena-star-comment-container');
cc.style.marginLeft = '1px';
return cc;
},
scrapeTitle: function(node) {
var rval = [];
(function (node) {
if (node.tagName == 'SPAN' &&
(node.className == 'sanchor' ||
node.className == 'timestamp')) {
return;
} else if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
return;
}
var cn = node.childNodes;
if (cn) {
for (var i = 0; i < cn.length; i++) {
arguments.callee.call(this, cn[i]);
}
}
var nodeValue = node.nodeValue;
if (typeof(nodeValue) == 'string') {
rval.push(nodeValue);
}
})(node);
return rval.join('');
},
headerTagAndClassName: ['h3',null],
getHeaders: function() {
var t = Hatena.Star.EntryLoader.headerTagAndClassName;
return Ten.DOM.getElementsByTagAndClassName(t[0],t[1],document);
},
loadEntries: function() {
var entries = [];
//var headers = document.getElementsByTagName('h3');
var c = Hatena.Star.EntryLoader;
var headers = c.getHeaders();
for (var i = 0; i < headers.length; i++) {
var header = headers[i];
var a = header.getElementsByTagName('a')[0];
if (!a) continue;
var uri = a.href;
var title = '';
// Ten.DOM.removeEmptyTextNodes(header);
var cns = header.childNodes;
title = c.scrapeTitle(header);
var cc = c.createCommentContainer();
header.appendChild(cc);
var sc = c.createStarContainer();
header.appendChild(sc);
entries.push({
uri: uri,
title: title,
star_container: sc,
comment_container: cc
});
}
return entries;
}
},{
getStarEntries: function() {
var url = Hatena.Star.BaseURL + 'entries.json?';
for (var i = 0; i < this.entries.length; i++) {
if (url.length > Ten.JSONP.MaxBytes) {
new Ten.JSONP(url, this, 'receiveStarEntries');
url = Hatena.Star.BaseURL + 'entries.json?';
}
url += 'uri=' + encodeURIComponent(this.entries[i].uri) + '&';
}
new Ten.JSONP(url, this, 'receiveStarEntries');
},
receiveStarEntries: function(res) {
var entries = res.entries;
if (!entries) entries = [];
for (var i = 0; i < this.entries.length; i++) {
var e = this.entries[i];
for (var j = 0; j < entries.length; j++) {
var se = entries[j];
if (!se.uri) continue;
if (encodeURIComponent(se.uri) == encodeURIComponent(e.uri)) {
e.bindStarEntry(se);
entries.splice(j,1);
break;
}
}
if (typeof(e.can_comment) == 'undefined') {
e.setCanComment(res.can_comment);
}
e.showStars();
e.showCommentButton();
}
}
});
/* Hatena.Star.WindowObserver */
Hatena.Star.WindowObserver = new Ten.Class({
initialize: funct