「F4」を含む日記 RSS

はてなキーワード: F4とは

2016-12-11

今のノートパソコンはctrl+F5押さないとリロードできないんだけど

間違ってctrl+F4押すとタグが閉じるので非常に面倒臭い

2016-05-07

ブクマ大量に貰えるらしいのでExcelテクニック晒す

Excelというキーワードがやたらブクマ集めるようなので今使っているExcelスキル晒すわ。

Excel2010で動作確認済み。一応ググったら出るはず。

クイックアクセスツールバー(Alt + 数字キー)

正直言ってショートカットキー知らなくても大体これでなんとかなる。

オプションから追加してもいいし、やりたい処理のボタン右クリックして追加してもいい。

俺が追加してるのは下記の通り。

・シートの行を挿入

・シートの行を削除

・シートの列を挿入

・シートの列を削除

Ctrl + Shift + 「+」とかはセルの挿入とかいう余計なダイアログボックス出るのでNG

セルを結合して中央揃え

正直言ってセルの結合なんて使いたくないけど元のフォーマットに合わせるために使わざるを得ない場合がある。

・その他の罫線

罫線操作に役立つ。

Excel方眼紙で図を作る際にも役立つ。

Alt +「o」→ 「h」→「r」

シート名変更。別にマウスでカチカチやらなくてもできる。

Alt +「e」→「m」「c」

シートの移動またはコピー別にマウス使わなくてもできる。

Alt + 「e」→「l」

シートの削除。別にマウス(以下略

(範囲選択した上で)Alt + 「i」→「e」→「s」

連続データダイアログボックスが出現。単純に値を増やすだけもできるしオートフィルもできる。

(範囲選択した上で)Shift押しながらマウスドラッグ

範囲選択したセルを切り取って挿入する。切り取ったセル分だけシフトするので便利。

F4

前回行った書式設定を行う。最近知ったが便利っぽいので今後使っていきたい。

繰り返し行う作業が増えたらやること

Excel (やりたいこと) ショートカットキー」でググる

大体出るが、たまに出ないことがあってYahoo知恵なんとかでありません的な情報が得られるのでそのときはクイックアクセスツールバーVBAで補う。

2016-03-16

マーケティングこわい。

Googleは使わない、SEO対策しているか

http://jp.techcrunch.com/2016/03/03/istagram-genking/

WEBバナー最近検索した内容がバレるんだもんなー。

記事見てたら思い出したよ、

会社の同僚と調べ物をしてて、

「あ、この情報じゃないか?」ってPC見せた時だよ。

DODAバナー出ちゃったその刹那に、

ALT+F4 押して「あ、ごめん消しちゃった」って言った事。

それ以来、転職とかエロい事とかヤマしい検索する時はgoogle使わなくなりました。

2015-10-11

それでも『ファンタスティック・フォー』が駄作なワケ。

リブート版『ファンタスティック・フォー』が駄作でない理由(ネタバレなし感想) カゲヒナタのレビュー

気持ちはわかる。

俺も「『クロニクル』のジョシュ・トランク監督!」と聞いてワクワクとときめきをおぼえ、

公開後、実写版デビルマン』がアメリカ侵略たかと思われるほどの大炎上に怯えたクチだ。

で、正直、観た時の印象は「世の中の91%(RT調べ)から総スカン食らうほどダメってわけじゃないだろ。アメリカ人きびしすぎ」。

しかし、「思ったほど酷くはない」でも、F4が駄作であることは変わりないと思う。

(1)人間ドラマを深く描いた内容になっている

これが自分いちばん気に入った要素。

びっくりしたことに、本作の主人公たちは人生がうまくいっていないダメ若者で、わりと性格も悪いのです(作中で、彼らは「Kids」と呼ばれています

前半では彼らの精神的な幼さ、そのように人間になった理由が丹念に描かれています



 まず、「主人公たちは人生がうまくいっていないダメ若者」ではあんまりない。

 研究所を放り出されていたドゥームや、厳格な親に反発したがるジョニーなんかは当てはまるかもしれない。

 が、主人公バクスター入学就職?)した時点で「それまでコケにされてきた天才的な才能が正当に認められた」わけで、事実ここいつは終始ずっとノーテンキというか、あんまりグツグツした情念めいたものを燃やしていない。青春を超エンジョイしている。別にそれはそれでいいけど、マイルズ・テラーのあのアンニュイさを活かしきった『セッション』のあとだけにやけにもったいない。『クロニクルアゲインを期待していた観客もそこで肩透かしをくわされる。

 ケイト・マーラも親と弟の板挟み、ドゥームとテラーとの三角関係コソボ出身という暗い過去、などなどドラマになりそうな設定が顔を覗かせるものの、びっくりするくらい本編に活かされてない。そもそも何考えてる人かよくわからない。観る人によったら、中盤までジョニーと姉弟だって気づかないんじゃないか? テラーとの恋愛要素も、テラ視点でうすら青春っぽく描かれるだけで、特に深くもならない。

 中盤前半まるまる出番のないベンくんに至っては書きこみもクソもない。最序盤でこそゴミ山の底辺家庭で育ったという劣悪な家族・養育環境が思わせぶりに描かれるものの、その後一切言及はない。なんでテラーと仲良くしてんのかもわかんない。信頼関係がどうやって育まれてきたかもわかんないのでザ・シングになってからの「大親友に裏切られた辛さ」みたいなものが薄く感じる。傍目には、ひさしぶりにあった古いクラスメイトに怪しい宗教勧誘されてのこのこひっかかった、頭のよわいかわいそうな人にしかみえない。

 

 ドゥームもドゥームでバックボーンがよくわからない。出てきたときからフードかぶってちょっと気難しいギークを気取っている童貞野郎しか見えない。ドゥームという希代の悪役へ至らせるトラウマイベントに欠けている。研究所を叩きだされた経緯もむしゃくしゃしてとりあえずロックなことをしてみた、程度のマインドっぽい。尾崎豊か。

 とりあえずケイト・マーラが好きで、マーラテラーの仲を快く思っていないみたいな描写はあるものの、二人の仲は決定的なところまで行ってない。しかも、「俺の女にちょっかい出すんじゃねえ」的な釘をテラーにさそうとしたら、逆にテラから「あの機械もうできたよ」と言われて「えっマジで」とばかりに盛り上がる。女にそこまで執着なさそう。

 じゃあテラーに対する嫉妬心なのかといえば、そこも開発チームとして一致団結する過程でうやむやになってしまう。

 総合するに、なんでこいつが地球を滅ぼしたがっているのか、なぜ異次元永住したがっているのかがわからない。異次元エネルギーの影響で頭おかしくなった、で済むかもしれないが、それは「人間ドラマ中心のF4」としてどうなんだ。

 ついでにいえば、クリストファー・ミンツ=プラッセちょっとだけ細くしたような絶妙なムカツキおフェイスがどこかヘタレっぽくて、情けない。

 唯一、バックボーンコンフリクト描写病院での父親との衝突シーンや能力使用に関する言い争い)に成功したヒューマントーチだが、せっかくそうやって高めた緊張を爆発させるシーンがない。問題を劇的に乗り越えるシーンがない。

 「壁」だった父親が唐突に殺されて、「兄弟仲良く……」と言い残して死ぬだけだ。え? これまでの親子喧嘩はそれでオールオッケーなの? もったいない

 要するに全体的に人物への書き込みが不足している。死ね死ねパワーを充填し損なっている。リア充デビューを果たした主人公脳内一人相撲を繰り返してるだけの童貞悪役(まあテラーも童貞だろうけど)、何を考えているかからないヒロイン、中折れしたブラック・コックのような黒人枠、影が薄いだけのかわいそうな親友。これが今回のF4の面々である。到底、ハーレム少女漫画活躍できそうなバイタリティーはない。

 こうじゃなかった。『クロニクル』はこうじゃなかった。ちゃんと主要キャラ三人それぞれの書きこみができていて、そのうえでの関係性がちゃんと……まあいい。これはF4だ。

(2)かなり怖いホラー演出がある

ジョシュ監督自身が「デヴィッド・クローネンバーグ的に人間の肉体が変化していく場面を描きたいんだ」と言っていたとおり、作中では「これホラーだろ!」と思いたくなるシーンがあります



 あー。うん。これはできてた。なんでクローネンバーグやりたかったのかわからんけど、できてた。超こわかった。能力ゲットシーンだけじゃなくて頭パーンも爽快感込みで。

はい、この時点で明るく楽しいヒーローものを期待する人は素直に回れ右なのがわかりますね。



 いや……でもさ。俺たちはホラー映画観に来たわけじゃなくねえ? 百歩譲ってさ、暗いヒーロー映画自体否定しないよ? みんな『ダークナイト』大好きでしょ? おれだって実は『マン・オブ・スティール』そこまで嫌いじゃないよ? グロシーンばっちこーいだよ?

 でも、だから、なに? ホラー描写ができてるから、なに? それがF4の本筋とどう絡んでくるの? 「自分たちが変わっていくことへの恐怖」? いや、おまえらそれかなーり早い段階で適応してたよね? いきなり「一年後……」とかつってたよね? そこ書かないの? 変わっていくプロセスを見せたかったんでしょ? なんで変わってしまった自分適応する/できない/やっぱするプロセス書かないの? なんでスーツきりゃ全部オッケーなの?

(3)能力を持ってしまった「悲哀」が描かれている

これはジョシュ監督デビュー作にして、高い評価を得た『クロニクル』と同様です。

クロニクル』は「能力を持ってしまったがゆえの悲劇」が描かれており、本作では「能力を持ったという運命を受け入れなければならないという試練」が前面に押し出されています



運命を受け入れる」か。良いセリフだな。でも、それ、ドゥームさんの前でもおなじこと言えんの?

え? 言っちゃうの? マジで? 「こうなったのもたぶん運命なんだ」って? 本人の目の前で???

しかに、みんな能力を持ってしまったことにどうやって向き合えばいいのか、その葛藤はありました。

けど、『X-MEN』なんかと違ってその葛藤が全部あいつらの内部で完結してるし、しか特に真摯に向き合うことなく、ラストバトルのテラーさんによる安い演説一発(本当にここはとってつけた感がすごい。それまでのテラーのキャラとも合ってない)で解消されてしまうので、本当にこいつら悩んでたのかよ、と白けてしまう。

(4)世の中の「日陰者」な技術者に対して尊いメッセージが込められいる。

主人公成長物語とこのメッセージは密接に絡み合っており、そこは確かな感動がありました。



 ??? 

 この映画見てると「ああー技術者って大人になってもガキくせえバカばっかで、酒に酔った勢いでうっかり世界滅ぼしかけたりもするんだなー、害悪だなー」って気分にしかなんないよ? 脚本から科学者技術者に対する悪意しか伝わってこないよ? テラーが劇中具体的に技術世界に貢献した例って、レジ故障を直したくらいじゃない?

 テクノクラート讃歌なら『ベイマックス』のほうがよほどポジティブメッセージ性を与えてるぞ? 科学っていいなあ! 研究室っていいなあ! になれるぞ??



F4ダメだった真の理由

 細々書いてきたけど、こんなものは全部些末なダメさにすぎない。「時間配分に失敗している」せいでもない。ましては「暗いから」でもない。

 本作が駄作である最大の理由、それはラストバトルにおける勝利のロジックのなさだ。

 ラスボスであるドゥームさんは異次元世界では神に等しい力を持つ。地形を変形させるなんてお手の物。まさに最強クラスの敵だ。

 しかリブート前のドゥームさんを知る我々にとって彼は「F4の宿敵」として広い認知を得ている。

 こんなもやしみたいなシリーズ一作目でうかうかと殺されるような敵ではないはずだ。

 倒されるにしても、それなりの理由けがあってしかるべきだ。

 それがである

 ドゥームさんはビックリパンチ一発でやられる。しょぼい。イモータン・ジョー様もびっくりのあっさりさでぶっとばされる。イモータンさまはそれでもみんなの心のV8をいつまでももやしつづけるであろうが、この偽クリストファー・ミンツ=プラッセ最期はせいぜい鮫入りの水槽に落ちたどっかのヴィラン混同される程度でしかなかろう。

 

 もうちょっと説明すれば、このビックリパンチはいわば友情の団結ビックリパンチ、少年漫画的な元気玉であるはずなのだが、バラバラだったチームが団結するまでの流れがおざなりというか、雑さ極まっているのであんまり元気そうに見えない。

 しかも、既にドゥームさんに対して一ダウンを奪った直後の攻撃である。そう、ドゥームさんは圧倒的なパワーと地の利を得ているにもかかわらず、ラストバトルに於いてあんまり圧倒しないのだ。とりあえず序盤は筋肉バカ二人を撃破し押せ押せムードにはなるものの、ケイト・マーラときバリアに手こずる始末。もうちょっとがんばれ。

 このバトルさえ、ラストバトルさえよければせめて駄作よばわりはまぬがれえたかもしれない。

 序盤のダルさやルックに反したノーテンキさも、中盤の物語運びである程度までは取り返せていた。

 あとはクライマックスで盛り上げるだけで40点程度は獲得できていたはずなのだが……。

 それでも、ギリギリ次回作が楽しみな程度のクオリティではある。増田トランク監督を応援していますマーラルーニーではなくケイト派です。

 あ、そうそう。本作で唯一良かった点をあげるとしたらケイト・マーラの着ているスーツビッチビチぷりですね。エロいことこのうえない。監督ラバースーツAVとかにフェティッシュを感じてるんだと思う。そういうのが好きな人は60点いくとおもう。

 以上。

2015-07-29

メモ帳ExcelF4みたいな繰り替えしないの?

そんな機能があったら作業が捗るときがあるのになぁ。

1行飛ばしで行消すとかそういう作業、とかいろいろ

繰り返しが簡単にできる機能みたいなの、

タッタカタッタカキーボードリズミカルに叩くしかないのか?

2015-05-14

http://anond.hatelabo.jp/20150514220653

あれでもアルゴリズム変わって短くなったってのを知らない新参も出てくるようになったんだなあ。

もしかして君、F4押すたびに新しいの出てこないと癇癪起こすタイプかな?

2014-08-24

Surface Pro 3感想

Surface Pro 3を買ったので感想メモ

買った理由は、海外での仕事用にOffice付きで持ち運びが便利なノートPCが欲しかたからです。

Microsoftとしては、

タブレットにもノートPCにもなる。コレさえあれば何もいらない」

というような感じの触れ込みで、発売後も概ね好評のようです。

私としても概ね満足です。ノートPCとしては。

Surface Pro 3は正直、タブレットにはなりません。

既に私はNexus7を持っていて、本とか読んだりしますが、12インチタイプカバー合わせて1Kgくらいあるモノで読書をしようとは思いません。

また、操作感は間違いなくPCのソレであり、タブレットスマホのようなシンプル操作という感じはありません。どう考えても普通Windows操作になります

ついでに言うと、「タイプカバー」は曲者です。ノートPCとして使う際は「薄くてクールキーボード」と受け取れなくもありませんが、タブレットとして使う場合邪魔しかたありません。普通カバーのように後ろに折れば良いように一瞬思いますが、裏でキーボードが押せてしまうわけで、最終的に外します。

PCなので、スマホタブレットのように別PCに保存してある動画画像USB転送、みたいなことは出来ません。あくまPCネットワーク転送です。(別に困りませんが、操作感が違うので一瞬「?」となりました)

Surface Pro 3ノートPCとしては優秀です。私が買ったのはi5の128GBモデルですが、SSD/i5/メモリ4Gで仕事をする上ではなんら問題ないスペックです。ハードとしては。ノートPCとしては軽くて持ち運びも便利。キーボードは若干押しにくく、画面の裏でつっかえ棒的なもので画面を支える構造は、あぐらをかいて作業したい私としては文句の一つも言いたくなりますが、とりあえず自助努力で解決します。

ハードとしては」という言い方をしたのは、搭載されているWindows8.1がクソだからです。

私はWindows8以降は殆ど触って来なかったのですが、今回触ってヒドイものだという印象しかありませんでした。どこかの謳い文句で聞いた「直感的」という言葉意味を疑うレベルSkypeの設定をしようと思って、右の画面外から左にスワイプしようという発想がどこから生まれるのだろうか?さらアプリの終了のGUI操作が未だに不明。Skype終了はどうすればいいんだろうか?画面上部を持って下に移動させればいいような話を聞いたけど上手くいかず、今のところAlt+F4で終了させていますスタート画面なるものアプリを探しにくくて仕方ないので、ランチャを導入。そうなると最初スタート画面が出てくるのも意味が無いのでディスクトップが表示されるように変更。その他諸々気になるところもありますが、その都度ツールを入れたりバッチを組んだり、自作ツールを作ったりすればWindows7レベル生産性まで持って行けると思います

というわけで、軽くて薄い「ノートPC」が欲しくて、Windows8に慣れている人ならSurface Pro 3オススメです。

ちなみにヤマダ電機で定価(MSとの契約で値下げ出来ないとの事)12万円+ポイント11%(10%+フレッツ光の説明を聞くと1%)でした。タイプカバーはほぼポイントで買えます

2014-08-13

はてブオフ会にいってきた

遅くなりましたが、レポります。もうウンザリという方は、そっと、Backspaceキーを押して頂ければ。

けど、ALT+→を押して頂けると、やっぱこの画面に戻ってきてしまうんですよね。その場合は、ALT+←を押してくれれば

やっぱり戻ります。けど、Shift+Backspaceを押して頂ければ?、そうやっぱりこの画面になります


では、Ctrl+Shift+Tを押してみましょうね。これは直前に閉じたタブを開いてくれるショットカットキーです。

まり、私が次に言いたいことが分かりますね。Crtl+Wを押してみましょうか。あれ、この画面が消えてしまう!

でも、Ctrl+Shift+Tを押せば大丈夫です。うっかり、Crtl+F4を押してても大丈夫です。


では、Crtl+Eを押して、はてブオフ入力してみましょうか。あれ、急に不快な気持ちが押し寄せてきましたね。

けど、大丈夫、上記のテクニックを思い出して、秒速でタブを消すか、戻りましょう。


Ctrl+Shift+Deleteで、一時の気の迷いすらなかったことにするのが良いかもしれませんね。

心のCtrl+Shift+Deleteはどこにあるんですか?ですって、そんな都合の良いものはないのです。

2014-04-04

[]4月4日

○朝の話

朝目が覚めたとき、隣の人が自分のことを警察通報した声が聞こえて、捕まるんじゃないか? という恐怖感でいっぱいになってしまった。

30分ほど慌ただしく身辺整理をしていたが、ふと薬を飲むことを思いつき飲んでからしばらくすると。

何を恐怖していたんだ? と冷静になれた。

そもそも、何で隣の人の声がそこまで詳しく聞こえたのか、警察に捕まる所以なんと何もないなど、ツッコミ所が多すぎた。

やっぱりデパスは最高だぜ!


ハッピーウォーズ

ログインボーナストレジャーマップで終わり。


ナイキキネクトトレーニング

今日は休憩時間が多くてだいぶ楽だった。

ただ腕立ての姿勢から始まる運動スクワットがむーりぃーだ。

まあ何にしろ一週間無事に終えれてよかったよかった。

今後は、日水金の週三日体制スケジュールで行う予定。


洗濯

朝食のまえに洗濯

洗濯家事の中でも好きな部類なので楽しい


○朝食

昨日の夜、夜中に卵掛けご飯を食べる暴挙に出てしまい、

まったくお腹が空かないので、みそ汁だけ飲む。


○お薬

レキソタンが本当によく効く。

昨日といい今日といい、全くそわそわした不安感がなく。

よく感じていた「天井が落ちて来る感じ」も極端に少なくなった。


ポケモン

悪統一砂ダブルPTを考え中。

バンギラス(@メガ石)を軸に、

タイプで砂にかからない、バルジーナノクタスワルビアルキリキザンを入れる予定。

イッシュ地方ポケモンが多く、僕はBW時代ほとんどやってなかったので新鮮な感じ。

今はメインとなるメガバンギの技構成を考えているところ。

ポケモンはこの考えている時間が一番楽しかったりもするかも(笑)


○Warface

基本無料FPS

現代戦争物のFPSは苦手だけど、無料なのでチュートリアルまでプレイ

うーんなんか普通

僕はネットゲーム僧侶をするのが大好きなので、メディックには興味があるけど、

普通すぎて、世界観が好きなHalo4でいいやって感じ。


マインクラフト

大型アップデートで色々かわったみたいなのでリプレイ

とりあえず新しい世界を生成した。

早速村を発見し、取引を持ちかけるとなるほど色々な村人がいて意味があるようだ。

今までは村人に特に意味がなかったからこれは嬉しい。

はいえ、マインクラフトは実績コンプまでやったしなあ、これからも遊ぶかはフレンド次第って感じかな。


ブランチ

松屋ソーセージエッグ定食

目玉焼きって日本が誇る素晴らしい料理ひとつだよなあ、と常々思う。

○お薬

レキソタンのお時間

けど、ちょっと早いので腹ごなしに散歩してから飲む予定。

○午後の予定

急にJRPGがやりたい欲が出てきたので、ブルードラゴン辺りをやろうかなあ。


ブルードラゴン

お、面白い

F4〜6で育った世代にはこりゃハマるわ。

キャラクタもわかりやすい造形で、猪突猛進知的に紅一点、これこれこういうのがやりたかったんですよ私。

ストーリーガン無視して影を徹底的に育てたくなるねw

とりあえず一時間ほどプレイして休憩中。


Halo2

ブルードラゴンコマンドRPGで程よくアクションしたい欲がわいたので再開。

今日は「チャプター9 悔恨」をクリア

悔恨の予言者を倒すのは珍しく工夫が必要そうに思えてそうでもなかった。

まあFPSならこの程度で十分。

それにしても本当に道に迷うゲームだなあ。

次のチャプター10からはまたコブナント側なので楽しみ。

2013-12-20

「F35」旧型の主力機の代替検討

「F35」旧型の主力機の代替検討

http://www3.nhk.or.jp/news/html/20131218/k10013915281000.html

先日、既に引退が始まってるF4の代わりにF35を買うって話が決まったわけですが、F15の代わりもF35にする、ってニュース

将来的にF2とF35とだけになっちゃうの?

いまの時勢みてるかぎり、F2の代替F35になりそうな気がする。F35の対抗馬の話ってぜんぜんないし。

F35がトラブったり飛行停止になったら戦闘機無し?

怖すぎる・・・。

航空自衛隊の中のひとが気にしてないはずないし、

ほんと真意が気になる。

将来的にF22が輸出解禁になる可能性が潰れたってことなのか。

心神実用化に目処がつかないのか。

2013-07-19

これだけは覚えておくべきっていうExcelショートカット

Ctrl+D 選択範囲を下方向にフィルコピー

Ctrl+R 選択範囲を右方向にフィルコピー

F2 選択中のセル編集状態に

F4, Ctrl+Y 直前の処理を現在の選択範囲に対して繰り返す

(行や列を選択して)Ctrl+ '-' 行や列を削除して詰める

(行や列を選択して)Ctrl+ '+' 行や列を挿入

Ctrl+矢印 端のセルまでカーソル移動

Ctrl+Shift+矢印 現在セルから端のセルまで一括選択

2010-06-13

ノートパソコンの画面の明るさ設定

Fnキー+F5,Fnキー+Homeで画面の輝度を上げる(明るくする)

Fnキー+F4,Fnキー+Endで画面の輝度を下げる(暗くする)

取扱説明書を読まないタイプなのでこの機能に気づくのに10ヶ月かかった。

輝度調整をやろうとして「ノートパソコン バックライト 設定」というキーワードでググったが何も見つからなかった。

同じような人のためにバックライトという単語を入れておこう。

2009-01-20

窓使いの憂鬱HHKB

だいぶ前のことなので結構忘れてるけど。

買ったのはHHKBPro2。OSはWindowsVista

買ってまずしたこと

背面のスイッチをいじってキーを変える。

http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html

左◇Fn
右◇Win
DeleteBackspace

左◇あたりにFnを割り振らないと右小指でしかFnを押せなくて面倒。

DeleteよりBackspaceの方が使用頻度が高いので変更。(Fn+DeleteでDeleteを押したことになります)

パソコン側の設定

ノートPC(日本語Windows)で英語配列HHKBを使う時はUSJPを入れるのが限りなく正解に近い。

http://www.trinityworks.co.jp/software/USJPPro/index.php

デスクトップPCではドライバ英語キーボードに設定すればいい。

ノートPCでUSJPを入れていて、USJPにはおまけ機能でいくらかのキーの組み合わせを設定できるので

デスクトップPCでも同じにするためにとりあえず窓使いの憂鬱を入れた。

Vista対応版

http://slashdot.jp/~kazu2/journal/411746

設定はこんな感じにした。

include "104.mayu"

key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key C-Space = $ToggleIME

逆に普通日本語配列キーボードを似非HHKBにする設定。

どこかで見た設定をベースにいじったような気がしますがどこのがベースか忘れた。

自分は左◇キーをFnキーに設定して使っているので無変換キーをFnキーにするとちょうどよくなる。

include "104.mayu"

mod control += CapsLock
def subst *CapsLock = *LControl
key S-Pause = CapsLock

def key 無変換 = 0x7b
mod mod0 = 無変換
key *S-M0-K = *S-Home
key *S-M0-Comma = *S-End
key *S-M0-Apostrophe = Right 
key *S-M0-Semicolon = Left
key *S-M0-LeftSquareBracket = Up
key *S-M0-Solidus = Down
key *S-M0-L = *S-PageUp
key *S-M0-FullStop = *S-PageDown
key M0-R = F5
key C-D = Delete
key C-H = BackSpace
key C-M = Enter
key *S-M0-_1 = F1
key *S-M0-_2 = F2
key *S-M0-_3 = F3
key *S-M0-_4 = F4
key *S-M0-_5 = F5
key *S-M0-_6 = F6
key *S-M0-_7 = F7
key *S-M0-_8 = F8
key *S-M0-_9 = F9
key *S-M0-_0 = F10
key *S-M0-HyphenMinus = F11
key *S-M0-EqualsSign = F12

def key JisBackslash = 0x7d
key JisBackslash = Backslash
key S-JisBackslash = $VERTICAL_LINE

key C-Space = $ToggleIME

HHKBを繋いだ時は上の設定、普通キーボードを繋いだ時は下の設定に切り替えてやってます。

どうでもいいこと

2つあるUSBポートが結構便利。

無線マウスレシーバをここに挿してます。

USBメモリを挿したい時もここ。

重量が結構ある。

レッツノート(1.5kg)とこれを一緒に持ち歩くととても重いのと体積が増えるので最近は置きっぱなしなことが多い。

2008-12-17

SP

javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.sp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.sp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[0]+"|"+m.music_list[i].diff[1]+"|"+m.music_list[i].diff[2]+"],"+x.level[0]+","+x.score[0]+","+t[x.flag[0]]+","+x.level[1]+","+x.score[1]+","+t[x.flag[1]]+","+x.level[2]+","+x.score[2]+","+t[x.flag[2]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();

(たぶん)DP用

javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.dp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.dp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[3]+"|"+m.music_list[i].diff[4]+"|"+m.music_list[i].diff[5]+"],"+x.level[3]+","+x.score[3]+","+t[x.flag[3]]+","+x.level[4]+","+x.score[4]+","+t[x.flag[4]]+","+x.level[5]+","+x.score[5]+","+t[x.flag[5]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();

2008-07-23

OpenSSH の Fingerprint を AA にする新機能を試してみた

OpenSSH に "Fingerprint ASCII Visualisation" という機能がついたらしい

http://www.st.ryukoku.ac.jp/~kjm/security/memo/2008/07.html#20080722_OpenSSH

多分。サーバの公開鍵の Fingerprint をアスキーアート化して、そのビジュアルを覚えてサーバなりすましを防ぎましょう!という技術だと思います。但しexperimental。

とりあえず手元で make してみる

$ tar -zxvf openssh-5.1p1.tar.gz
$ cd openssh-5.1p1
$ ./configure
$ make

Macでも問題なくmakeできた。

VisualHostKey オプションデフォルトオフなのだけど、設定変えるのが面倒なので ssh に -o "VisualHostKey yes" オプションをつけて起動してみる。接続先は普段使ってるホストで。

$ ./ssh -o "VisualHostKey yes" ***.###.%%%

結果、こんな風に表示された。

Host key fingerprint is 
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''"::::::::::`''>93:e6:d0:6b:75:6d:22:be:d8:7f:11:ad:50:dc:16:6f<
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ     __   _____   ______
 |::::ノ   ヽ、ヽr-r'"´  (.__    ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7   'r ´          ヽ、ン、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7 ,'==─-      -─==', i
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ   !Y!""  ,___,   "" 「 !ノ i |
,'  ノ   !'"    ,___,  "' i .レ'    L.',.   ヽ _ン    L」 ノ| .|
 (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /
,.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´

Password:

確かにFingerprintがAAで出てきた。これは覚えやすい。

別のホストにも接続...

$ ./ssh -o "VisualHostKey yes" ***.###.%%%

結果

Host key fingerprint is ff:fb:f0:43:c4:85:9f:70:16:7d:d8:f1:7d:dc:79:53
      ,,,,,,pxxvxxg,,,,_
   ,,df(^"゛ g、    ^゜゜lq
  〈!   ,,dl゜゛   ./==x]t,,_
   ]l.__,,g[,,,,,,,,,,,,,,p4"   .l[^k
   ][「,,pr=t、`、  ____ .l[ ]
  g" ][_  ]!  ./「゜^゜9,,「n,,]
 4゜ .。、.\イ   ゜lk ,,g[  .l]
 ]l. 〈^゜ltn4,,,,_        ]
 ヨ。. ゜ll._   ゜"9n......./ff  ]
  ヨ、.\q,,,,____   ,,gf゛ gl゜
   ^9nnxxxxx゜゜゜゜゜゜゜゜゜゜xvtf"゛

Password:

なんかこわい!

$ ./ssh -o "VisualHostKey yes" ***.###.%%%

結果

Host key fingerprint is 36:fc:e6:85:b7:f5:22:7e:45:f4:d8:5d:5d:f4:83:86
+--[ RSA 1024]----+
|                 |
|.. .o  .         |
|...o.            |
|    . o . .      |
|   + E + * +     |
|  o +   S =      |
| . . o   o .     |
|  ... o * o      |
|     . .         |
+-----------------+

Password:

ネットハックかよ!





ちなみに最後のだけホント。

2008-06-11

http://anond.hatelabo.jp/20080611093824

性能/費用のバランス的に「Polar F6」あたりが妥当なところかな、と思います。

うん、ちょうど良いと思います。

ランニングもしないならば、この機種がベストじゃないかなー。

F4よりF5の方が良いね。

混信防止機能はいらないけれど、過去履歴が残るのは記録大好き増田にとっては大事。

OwnZoneはちょっと使うの難しい…。

自分ではなんか220-年齢と大して替わらない値が毎回設定されたよ。

これからも頑張ってねー。

2008-05-29

http://anond.hatelabo.jp/20080528175013

うは、PC98の時代から使ってるけどF4知らなかったw

死刑存置論者よ、殺すというなら自分の手で殺せ」

そんな言葉を見て、裁判員制度ならぬ執行人制度があったらどんな感じだろうかと思ったので、そんな話を書こうとメモ帳を開いた。

まず最初はどうしよう。とりあえずは呼び出し状が届くところからかな。それじゃ名前はどうしよう。ただの手紙じゃ普通だし呼び出し状もニュアンスが違う。赤紙みたいなインパクトがあるのがいいなっと考え、黒い紙、黒紙なんかがいいんじゃないかな。字面的にクロカミとかにしたら何か今風だし。そうは思ったものの、クロカミなんてのはすでに誰かが使ってるかもっと思ったので検索してみた。

クロカミ。競走馬。クロカミ。競走馬。クロカミ。競走馬。なんだ、クロカミっていう名前の馬がいるだけかと安心してスクロールしたら、Amazonの検索結果があった。何だこれと開いてみると国民から無作為で死刑執行人が選ばれるようになり選ばれた死刑執行人の元に届く手紙の名前がクロカミ。そんな本があるらしい。

だだ被りだった。Alt + F4押しメモ帳を閉じた。でもなんか悔しかったのでこれを書いた。あんまり反省してない。まあ安易だったし仕様がないか。それにしてもレビューを読むと裁判員制度以前に思いついたらしい。やっぱり本職の人はすごいね。

2008-05-17

How to become a Japanese GEEK? その1

はじめに

これは某ギークコミュニティの面々が、自分たちの生い立ちをとってもバイアスのかかった視点で限りなく少ない症例の中から統計的に分析した結果です。

もし、あなたがギークになりたいのならば、これから書かれる様々な情報はティッシュペーパーくらいの有益性があるでしょう。

ギークを目指すのならば、少なくともこれから書かれる事項を実践すべきです。

あなたは高校生以上ですか?

あなたは高校生以上ですか?

もしそうであるなら、パソコンキーボードを覗き込んでみましょう。

キーボードというのはボタンがいっぱいついている板みたいなものです。

大抵のパソコンには付属してします。

もし、あなたのパソコンノートパソコンの場合、画面ではない場所を念入りに探してみてください。

きっと見つかるはずです。

キーボード新世界への入り口

キーボードをみつけたら新しい一歩の始まりです。

これからあなたは生まれ変わります。

手始めにスペースバー(唯一何も書いていないボタン)の近くにAltというボタンがあるので探してみてください。

とっても重要ボタンなので覚えておきましょうね!

それを見つけたら、キーボードの左上にESCと書いてあるボタンのならびにF4と書いてあるボタンを捜しましょう。

見つかりましたか?

この二つのボタンを同時に押してみてください。

F4とAltですよ!

今のあなたにはすごく難しいかもしれません。

しかし、新しい世界への扉を開く鍵になります。

何が起きるかは自分の目で確かめてください。

きっとびっくりしますよ(^o^)ワーイ

そしてギタータバコお酒を買いに出かけてください。

タバコお酒を買うのはなるたけ深夜が望ましいです。

流行音楽を聴いてみたり、バイクに乗るのも良いでしょう。

そんなお金は無い?

それは困りました。

これはあなたの人生を豊かにするために大変重要なことです。

もしもお金が無かったらアルバイトをするのもオススメです。

世の中にはファーストフードコンビニ居酒屋の店員など、あなたに適正がある様々なアルバイトがあります。

大変かもしれませんがアルバイトはがんばりましょう。






楽しい人生の始まりです。G

2008-03-03

Shift_JISにおける危険な文字まとめ

今時Shift_JISプログラミングするバカな奴はいないだろうけど折角まとめたので公開

2バイト目がアスキーコードど丸被りしているものを列挙する

@[\]^_`{|}~
405B5C5D5E5F607B7C7D7E
81 ????±×
82
83
84АЪЫЬЭЮЯклмн
85
86
87??????????????
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97輿
98
99
9A
9B
9C忿
9D
9E
9F
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED????
EE??
EF
F0??????????????????????
F1??????????????????????
F2??????????????????????
F3??????????????????????
F4??????????????????????
F5??????????????????????
F6??????????????????????
F7??????????????????????
F8??????????????????????
F9??????????????????????
FA????
FB????????
FC
405B5C5D5E5F607B7C7D7E
@[\]^_`{|}~

縦軸が1バイト目で、範囲は81ー9F、E0ーFC

横軸が2バイト目で、アスキーコードを含むもの。

# ちなみに「??」って表示されてるのはまー外字部分だしそんなに気にしなくていいかと

これらの文字コードには気をつけること。

特に2バイト目が5C(\)ものは要注意。

"や'と引っ付くのでまともにプログラミングできない。


 print '予定表';
 print "無能";

上記コードPerlでもPHPでもエラーとなる。

特にPerlの場合は文字列中に展開できる構文が多いのもあり、色々なエラーを出せるので注意が必要だ。


 print qq[夕焼け小焼け]; # 「夕」の2バイト目でエラー
 print "警察24時!";     # @24という変数とみなされる

また、正規表現でも厄介な問題が起きまくるので注意すべし。


my $str = 'ダ';
print 'match' if $str =~ /_/; # マッチしちゃう

こういう様々な理由からShift_JISプログラミングをしてはいけないわけだ。

だからUTF8を使うべきだ。UTF8が無理でもせめてEUC-JPのどちらかでプログラミングすることをオススメする。

まーEUC-JPEUC-JPShift_JISと一部文字コードが重なっているので正直扱いにくいのでやっぱりUTF8を強く推奨する。

プログラ増田のあなぐら

2007-08-09

http://anond.hatelabo.jp/20070808232538

Wikipediaより転載

名門の筋やら素封家やらの子弟が入学する事で知られる英徳学園高校に、何の因果か入学してしまった一般庶民の牧野つくし学校F4(Flower 4―“花の四人組”)を名乗る道明寺司花沢類西門総二郎美作あきらに牛耳られていた。F4は世界にも通用する程のセレブ御曹司F4に逆らえる人は1人もいなかった。ある日、友達を守る為にF4に刃向かったつくしはF4に赤札を貼られ、学校全体からいじめターゲットにされてしまう。しかし正義感の強いつくしは“やられたらやり返す、それがあたしのポリシー!”とばかりに立ち向かって行く。道明寺司牧野つくしのことを好きになってしまい、それからはつくし一途でそればかり。…いじめられ続け騙され続けた牧野つくし人生がこのF4によって変わり始めた。激貧の牧野つくし、大金持ちのF4、この正反対な人達が生み出す恋愛ストーリー

いじめっ子と言うよりも番長みたいなものなのかな?

「学園は○○に牛耳られていた」とか、設定に時代を感じるんだが。

2007-07-19

/* 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


  
ログイン ユーザー登録
ようこそ ゲスト さん