はてなキーワード: F4とは
Excelというキーワードがやたらブクマ集めるようなので今使っているExcelスキル晒すわ。
正直言ってショートカットキー知らなくても大体これでなんとかなる。
オプションから追加してもいいし、やりたい処理のボタンを右クリックして追加してもいい。
俺が追加してるのは下記の通り。
・シートの行を挿入
・シートの行を削除
・シートの列を挿入
・シートの列を削除
Ctrl + Shift + 「+」とかはセルの挿入とかいう余計なダイアログボックス出るのでNG。
正直言ってセルの結合なんて使いたくないけど元のフォーマットに合わせるために使わざるを得ない場合がある。
・その他の罫線
罫線操作に役立つ。
Excel方眼紙で図を作る際にも役立つ。
連続データのダイアログボックスが出現。単純に値を増やすだけもできるしオートフィルもできる。
範囲選択したセルを切り取って挿入する。切り取ったセル分だけシフトするので便利。
前回行った書式設定を行う。最近知ったが便利っぽいので今後使っていきたい。
「Excel (やりたいこと) ショートカットキー」でググる。
大体出るが、たまに出ないことがあってYahoo知恵なんとかでありません的な情報が得られるのでそのときはクイックアクセスツールバーかVBAで補う。
リブート版『ファンタスティック・フォー』が駄作でない理由(ネタバレなし感想) カゲヒナタのレビュー
気持ちはわかる。
俺も「『クロニクル』のジョシュ・トランクが監督!」と聞いてワクワクとときめきをおぼえ、
公開後、実写版『デビルマン』がアメリカ侵略したかと思われるほどの大炎上に怯えたクチだ。
で、正直、観た時の印象は「世の中の91%(RT調べ)から総スカン食らうほどダメってわけじゃないだろ。アメリカ人きびしすぎ」。
しかし、「思ったほど酷くはない」でも、F4が駄作であることは変わりないと思う。
びっくりしたことに、本作の主人公たちは人生がうまくいっていないダメな若者で、わりと性格も悪いのです(作中で、彼らは「Kids」と呼ばれています)
まず、「主人公たちは人生がうまくいっていないダメな若者」ではあんまりない。
研究所を放り出されていたドゥームや、厳格な親に反発したがるジョニーなんかは当てはまるかもしれない。
が、主人公はバクスターに入学(就職?)した時点で「それまでコケにされてきた天才的な才能が正当に認められた」わけで、事実ここいつは終始ずっとノーテンキというか、あんまりグツグツした情念めいたものを燃やしていない。青春を超エンジョイしている。別にそれはそれでいいけど、マイルズ・テラーのあのアンニュイさを活かしきった『セッション』のあとだけにやけにもったいない。『クロニクル』アゲインを期待していた観客もそこで肩透かしをくわされる。
ケイト・マーラも親と弟の板挟み、ドゥームとテラーとの三角関係、コソボ出身という暗い過去、などなどドラマになりそうな設定が顔を覗かせるものの、びっくりするくらい本編に活かされてない。そもそも何考えてる人かよくわからない。観る人によったら、中盤までジョニーと姉弟だって気づかないんじゃないか? テラーとの恋愛要素も、テラー視点でうすら青春っぽく描かれるだけで、特に深くもならない。
中盤前半まるまる出番のないベンくんに至っては書きこみもクソもない。最序盤でこそゴミ山の底辺家庭で育ったという劣悪な家族・養育環境が思わせぶりに描かれるものの、その後一切言及はない。なんでテラーと仲良くしてんのかもわかんない。信頼関係がどうやって育まれてきたかもわかんないのでザ・シングになってからの「大親友に裏切られた辛さ」みたいなものが薄く感じる。傍目には、ひさしぶりにあった古いクラスメイトに怪しい宗教に勧誘されてのこのこひっかかった、頭のよわいかわいそうな人にしかみえない。
ドゥームもドゥームでバックボーンがよくわからない。出てきたときからフードかぶってちょっと気難しいギークを気取っている童貞野郎にしか見えない。ドゥームという希代の悪役へ至らせるトラウマイベントに欠けている。研究所を叩きだされた経緯もむしゃくしゃしてとりあえずロックなことをしてみた、程度のマインドっぽい。尾崎豊か。
とりあえずケイト・マーラが好きで、マーラとテラーの仲を快く思っていないみたいな描写はあるものの、二人の仲は決定的なところまで行ってない。しかも、「俺の女にちょっかい出すんじゃねえ」的な釘をテラーにさそうとしたら、逆にテラーから「あの機械もうできたよ」と言われて「えっマジで」とばかりに盛り上がる。女にそこまで執着なさそう。
じゃあテラーに対する嫉妬心なのかといえば、そこも開発チームとして一致団結する過程でうやむやになってしまう。
総合するに、なんでこいつが地球を滅ぼしたがっているのか、なぜ異次元に永住したがっているのかがわからない。異次元エネルギーの影響で頭おかしくなった、で済むかもしれないが、それは「人間ドラマ中心のF4」としてどうなんだ。
ついでにいえば、クリストファー・ミンツ=プラッセをちょっとだけ細くしたような絶妙なムカツキおフェイスがどこかヘタレっぽくて、情けない。
唯一、バックボーンやコンフリクトの描写(病院での父親との衝突シーンや能力使用に関する言い争い)に成功したヒューマントーチだが、せっかくそうやって高めた緊張を爆発させるシーンがない。問題を劇的に乗り越えるシーンがない。
「壁」だった父親が唐突に殺されて、「兄弟仲良く……」と言い残して死ぬだけだ。え? これまでの親子喧嘩はそれでオールオッケーなの? もったいない。
要するに全体的に人物への書き込みが不足している。死ね死ねパワーを充填し損なっている。リア充デビューを果たした主人公、脳内で一人相撲を繰り返してるだけの童貞悪役(まあテラーも童貞だろうけど)、何を考えているかわからないヒロイン、中折れしたブラック・コックのような黒人枠、影が薄いだけのかわいそうな親友。これが今回のF4の面々である。到底、ハーレム少女漫画で活躍できそうなバイタリティーはない。
こうじゃなかった。『クロニクル』はこうじゃなかった。ちゃんと主要キャラ三人それぞれの書きこみができていて、そのうえでの関係性がちゃんと……まあいい。これはF4だ。
ジョシュ監督自身が「デヴィッド・クローネンバーグ的に人間の肉体が変化していく場面を描きたいんだ」と言っていたとおり、作中では「これホラーだろ!」と思いたくなるシーンがあります。
あー。うん。これはできてた。なんでクローネンバーグやりたかったのかわからんけど、できてた。超こわかった。能力ゲットシーンだけじゃなくて頭パーンも爽快感込みで。
いや……でもさ。俺たちはホラー映画観に来たわけじゃなくねえ? 百歩譲ってさ、暗いヒーロー映画自体は否定しないよ? みんな『ダークナイト』大好きでしょ? おれだって実は『マン・オブ・スティール』そこまで嫌いじゃないよ? グロシーンばっちこーいだよ?
でも、だから、なに? ホラー描写ができてるから、なに? それがF4の本筋とどう絡んでくるの? 「自分たちが変わっていくことへの恐怖」? いや、おまえらそれかなーり早い段階で適応してたよね? いきなり「一年後……」とかつってたよね? そこ書かないの? 変わっていくプロセスを見せたかったんでしょ? なんで変わってしまった自分に適応する/できない/やっぱするプロセス書かないの? なんでスーツきりゃ全部オッケーなの?
これはジョシュ監督のデビュー作にして、高い評価を得た『クロニクル』と同様です。
『クロニクル』は「能力を持ってしまったがゆえの悲劇」が描かれており、本作では「能力を持ったという運命を受け入れなければならないという試練」が前面に押し出されています。
「運命を受け入れる」か。良いセリフだな。でも、それ、ドゥームさんの前でもおなじこと言えんの?
え? 言っちゃうの? マジで? 「こうなったのもたぶん運命なんだ」って? 本人の目の前で????
たしかに、みんな能力を持ってしまったことにどうやって向き合えばいいのか、その葛藤はありました。
けど、『X-MEN』なんかと違ってその葛藤が全部あいつらの内部で完結してるし、しかも特に真摯に向き合うことなく、ラストバトルのテラーさんによる安い演説一発(本当にここはとってつけた感がすごい。それまでのテラーのキャラとも合ってない)で解消されてしまうので、本当にこいつら悩んでたのかよ、と白けてしまう。
この映画見てると「ああー技術者って大人になってもガキくせえバカばっかで、酒に酔った勢いでうっかり世界滅ぼしかけたりもするんだなー、害悪だなー」って気分にしかなんないよ? 脚本からは科学者や技術者に対する悪意しか伝わってこないよ? テラーが劇中具体的に技術で世界に貢献した例って、レジの故障を直したくらいじゃない?
テクノクラート讃歌なら『ベイマックス』のほうがよほどポジティブなメッセージ性を与えてるぞ? 科学っていいなあ! 研究室っていいなあ! になれるぞ??
細々書いてきたけど、こんなものは全部些末なダメさにすぎない。「時間配分に失敗している」せいでもない。ましては「暗いから」でもない。
本作が駄作である最大の理由、それはラストバトルにおける勝利のロジックのなさだ。
ラスボスであるドゥームさんは異次元世界では神に等しい力を持つ。地形を変形させるなんてお手の物。まさに最強クラスの敵だ。
しかもリブート前のドゥームさんを知る我々にとって彼は「F4の宿敵」として広い認知を得ている。
こんなもやしみたいなシリーズ一作目でうかうかと殺されるような敵ではないはずだ。
それがである。
ドゥームさんはビックリパンチ一発でやられる。しょぼい。イモータン・ジョー様もびっくりのあっさりさでぶっとばされる。イモータンさまはそれでもみんなの心のV8をいつまでももやしつづけるであろうが、この偽クリストファー・ミンツ=プラッセの最期はせいぜい鮫入りの水槽に落ちたどっかのヴィランと混同される程度でしかなかろう。
もうちょっと説明すれば、このビックリパンチはいわば友情の団結ビックリパンチ、少年漫画的な元気玉であるはずなのだが、バラバラだったチームが団結するまでの流れがおざなりというか、雑さ極まっているのであんまり元気そうに見えない。
しかも、既にドゥームさんに対して一ダウンを奪った直後の攻撃である。そう、ドゥームさんは圧倒的なパワーと地の利を得ているにもかかわらず、ラストバトルに於いてはあんまり圧倒しないのだ。とりあえず序盤は筋肉バカ二人を撃破し押せ押せムードにはなるものの、ケイト・マーラごときのバリアに手こずる始末。もうちょっとがんばれ。
このバトルさえ、ラストバトルさえよければせめて駄作よばわりはまぬがれえたかもしれない。
序盤のダルさやルックに反したノーテンキさも、中盤の物語運びである程度までは取り返せていた。
あとはクライマックスで盛り上げるだけで40点程度は獲得できていたはずなのだが……。
それでも、ギリギリ次回作が楽しみな程度のクオリティではある。増田はトランク監督を応援しています。マーラもルーニーではなくケイト派です。
あ、そうそう。本作で唯一良かった点をあげるとしたらケイト・マーラの着ているスーツのビッチビチぷりですね。エロいことこのうえない。監督、ラバースーツAVとかにフェティッシュを感じてるんだと思う。そういうのが好きな人は60点いくとおもう。
以上。
Surface Pro 3を買ったので感想をメモ。
買った理由は、海外での仕事用にOffice付きで持ち運びが便利なノートPCが欲しかったからです。
Microsoftとしては、
「タブレットにもノート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%)でした。タイプカバーはほぼポイントで買えます。
遅くなりましたが、レポります。もうウンザリという方は、そっと、Backspaceキーを押して頂ければ。
けど、ALT+→を押して頂けると、やっぱこの画面に戻ってきてしまうんですよね。その場合は、ALT+←を押してくれれば
やっぱり戻ります。けど、Shift+Backspaceを押して頂ければ?、そうやっぱりこの画面になります。
では、Ctrl+Shift+Tを押してみましょうね。これは直前に閉じたタブを開いてくれるショットカットキーです。
つまり、私が次に言いたいことが分かりますね。Crtl+Wを押してみましょうか。あれ、この画面が消えてしまう!
でも、Ctrl+Shift+Tを押せば大丈夫です。うっかり、Crtl+F4を押してても大丈夫です。
では、Crtl+Eを押して、はてブオフと入力してみましょうか。あれ、急に不快な気持ちが押し寄せてきましたね。
けど、大丈夫、上記のテクニックを思い出して、秒速でタブを消すか、戻りましょう。
○朝の話
朝目が覚めたとき、隣の人が自分のことを警察に通報した声が聞こえて、捕まるんじゃないか? という恐怖感でいっぱいになってしまった。
30分ほど慌ただしく身辺整理をしていたが、ふと薬を飲むことを思いつき飲んでからしばらくすると。
何を恐怖していたんだ? と冷静になれた。
そもそも、何で隣の人の声がそこまで詳しく聞こえたのか、警察に捕まる所以なんと何もないなど、ツッコミ所が多すぎた。
やっぱりデパスは最高だぜ!
○ハッピーウォーズ
まあ何にしろ一週間無事に終えれてよかったよかった。
○洗濯
朝食のまえに洗濯。
○朝食
○お薬
レキソタンが本当によく効く。
よく感じていた「天井が落ちて来る感じ」も極端に少なくなった。
○ポケモン
悪タイプで砂にかからない、バルジーナ、ノクタス、ワルビアル、キリキザンを入れる予定。
イッシュ地方のポケモンが多く、僕はBW時代にほとんどやってなかったので新鮮な感じ。
ポケモンはこの考えている時間が一番楽しかったりもするかも(笑)
○Warface
現代戦争物のFPSは苦手だけど、無料なのでチュートリアルまでプレイ。
うーんなんか普通。
僕はネットゲームで僧侶をするのが大好きなので、メディックには興味があるけど、
とりあえず新しい世界を生成した。
早速村を発見し、取引を持ちかけるとなるほど色々な村人がいて意味があるようだ。
とはいえ、マインクラフトは実績コンプまでやったしなあ、これからも遊ぶかはフレンド次第って感じかな。
○ブランチ
目玉焼きって日本が誇る素晴らしい料理のひとつだよなあ、と常々思う。
○お薬
○午後の予定
急にJRPGがやりたい欲が出てきたので、ブルードラゴン辺りをやろうかなあ。
お、面白い!
キャラクタもわかりやすい造形で、猪突猛進に知的に紅一点、これこれこういうのがやりたかったんですよ私。
ブルードラゴンのコマンドRPGで程よくアクションしたい欲がわいたので再開。
悔恨の予言者を倒すのは珍しく工夫が必要そうに思えてそうでもなかった。
まあFPSならこの程度で十分。
それにしても本当に道に迷うゲームだなあ。
だいぶ前のことなので結構忘れてるけど。
買ったのはHHKBPro2。OSはWindowsVista
背面のスイッチをいじってキーを変える。
http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html
左◇ | Fn |
右◇ | Win |
Delete | Backspace |
左◇あたりに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
どこかで見た設定をベースにいじったような気がしますがどこのがベースか忘れた。
自分は左◇キーを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を繋いだ時は上の設定、普通のキーボードを繋いだ時は下の設定に切り替えてやってます。
USBメモリを挿したい時もここ。
重量が結構ある。
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();}});}});})();
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
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:
ネットハックかよ!
ちなみに最後のだけホント。
うは、PC98の時代から使ってるけどF4知らなかったw
そんな言葉を見て、裁判員制度ならぬ執行人制度があったらどんな感じだろうかと思ったので、そんな話を書こうとメモ帳を開いた。
まず最初はどうしよう。とりあえずは呼び出し状が届くところからかな。それじゃ名前はどうしよう。ただの手紙じゃ普通だし呼び出し状もニュアンスが違う。赤紙みたいなインパクトがあるのがいいなっと考え、黒い紙、黒紙なんかがいいんじゃないかな。字面的にクロカミとかにしたら何か今風だし。そうは思ったものの、クロカミなんてのはすでに誰かが使ってるかもっと思ったので検索してみた。
クロカミ。競走馬。クロカミ。競走馬。クロカミ。競走馬。なんだ、クロカミっていう名前の馬がいるだけかと安心してスクロールしたら、Amazonの検索結果があった。何だこれと開いてみると国民から無作為で死刑執行人が選ばれるようになり選ばれた死刑執行人の元に届く手紙の名前がクロカミ。そんな本があるらしい。
だだ被りだった。Alt + F4を押してメモ帳を閉じた。でもなんか悔しかったのでこれを書いた。あんまり反省してない。まあ安易だったし仕様がないか。それにしてもレビューを読むと裁判員制度以前に思いついたらしい。やっぱり本職の人はすごいね。
これは某ギークコミュニティの面々が、自分たちの生い立ちをとってもバイアスのかかった視点で限りなく少ない症例の中から統計的に分析した結果です。
もし、あなたがギークになりたいのならば、これから書かれる様々な情報はティッシュペーパーくらいの有益性があるでしょう。
ギークを目指すのならば、少なくともこれから書かれる事項を実践すべきです。
あなたは高校生以上ですか?
もしそうであるなら、パソコンのキーボードを覗き込んでみましょう。
キーボードというのはボタンがいっぱいついている板みたいなものです。
もし、あなたのパソコンがノートパソコンの場合、画面ではない場所を念入りに探してみてください。
きっと見つかるはずです。
キーボードをみつけたら新しい一歩の始まりです。
これからあなたは生まれ変わります。
手始めにスペースバー(唯一何も書いていないボタン)の近くにAltというボタンがあるので探してみてください。
それを見つけたら、キーボードの左上にESCと書いてあるボタンのならびにF4と書いてあるボタンを捜しましょう。
見つかりましたか?
F4とAltですよ!
今のあなたにはすごく難しいかもしれません。
しかし、新しい世界への扉を開く鍵になります。
何が起きるかは自分の目で確かめてください。
きっとびっくりしますよ(^o^)ワーイ
そんなお金は無い?
それは困りました。
世の中にはファーストフードやコンビニ、居酒屋の店員など、あなたに適正がある様々なアルバイトがあります。
大変かもしれませんがアルバイトはがんばりましょう。
今時Shift_JISでプログラミングするバカな奴はいないだろうけど折角まとめたので公開
@ | [ | \ | ] | ^ | _ | ` | { | | | } | ~ | |
---|---|---|---|---|---|---|---|---|---|---|---|
40 | 5B | 5C | 5D | 5E | 5F | 60 | 7B | 7C | 7D | 7E | |
81 | ー | ― | ‐ | / | \ | ?? | + | ?? | ± | × | |
82 | ・ | ・ | ・ | ・ | ・ | ・ | A | ・ | ・ | ・ | ・ |
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 | 髜 | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
40 | 5B | 5C | 5D | 5E | 5F | 60 | 7B | 7C | 7D | 7E | |
@ | [ | \ | ] | ^ | _ | ` | { | | | } | ~ |
# ちなみに「??」って表示されてるのはまー外字部分だしそんなに気にしなくていいかと
これらの文字コードには気をつけること。
特に2バイト目が5C(\)ものは要注意。
"や'と引っ付くのでまともにプログラミングできない。
print '予定表'; print "無能";
特にPerlの場合は文字列中に展開できる構文が多いのもあり、色々なエラーを出せるので注意が必要だ。
print qq[夕焼け小焼け]; # 「夕」の2バイト目でエラー print "警察24時!"; # @24という変数とみなされる
また、正規表現でも厄介な問題が起きまくるので注意すべし。
my $str = 'ダ'; print 'match' if $str =~ /_/; # マッチしちゃう
こういう様々な理由からShift_JISでプログラミングをしてはいけないわけだ。
だからUTF8を使うべきだ。UTF8が無理でもせめてEUC-JPのどちらかでプログラミングすることをオススメする。
まーEUC-JPはEUC-JPでShift_JISと一部文字コードが重なっているので正直扱いにくいのでやっぱりUTF8を強く推奨する。
名門の筋やら素封家やらの子弟が入学する事で知られる英徳学園高校に、何の因果か入学してしまった一般庶民の牧野つくし。学校はF4(Flower 4―“花の四人組”)を名乗る道明寺司・花沢類・西門総二郎・美作あきらに牛耳られていた。F4は世界にも通用する程のセレブの御曹司。F4に逆らえる人は1人もいなかった。ある日、友達を守る為にF4に刃向かったつくしはF4に赤札を貼られ、学校全体からいじめのターゲットにされてしまう。しかし正義感の強いつくしは“やられたらやり返す、それがあたしのポリシー!”とばかりに立ち向かって行く。道明寺司は牧野つくしのことを好きになってしまい、それからはつくし一途でそればかり。…いじめられ続け騙され続けた牧野つくしの人生がこのF4によって変わり始めた。激貧の牧野つくし、大金持ちのF4、この正反対な人達が生み出す恋愛ストーリー。
「学園は○○に牛耳られていた」とか、設定に時代を感じるんだが。
/* 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