ニコニコ動画のプレミアム会員になった

ニコニコ動画には、会員制じゃない頃からお世話になってるくせに、ずーっと無料で利用させていただいてたので、これはいけないと思って遂に昨日プレミアム登録した。

マイリスト数もとっくに限界を迎えていたので上限の増加は嬉しい、そして何より過去ログが見られるのが一番嬉しかった!
http://www.nicovideo.jp/watch/sm9 の最初の頃のコメントなんかは涙なしには見られない…!

携帯で支払おうと思ったけど、メールアドレスに『 + 』なんて文字を使っちゃってるせいか、それとも未だに vodafone ドメインだからか、何が原因かはわからないけど、何故か登録できなかったのでウェブマネー使ってみた。

あと、スクリーンショットを撮ってて気がついたけど、生年月日を一年間違って登録してた…そして修正できない…orz

「ボッチが何か言ってる」の被はてブランキング

おー、これは面白い!
被はてブランキングと、そのブックマークレット

早速やってみた!…けど、ブックマーク数に 1 が並んでて悲しくなったので、とりあえず 2 回以上ブクマしてくれているユーザーさんを出してみた。

順位 ブックマーカー ブックマーク数 タグ
1 id:Ubuntu 3 netwatch(1)
2 id:hotch_botch 3 はてな(2) greasemonkey(1) 勝ち組(1)
3 id:ekken 2 ekken(1) tool(1) はてブ(1)
4 id:maezono 2

id:Ubuntu 伝説は伊達じゃない。

はてなブックマークのエントリーページで id コ−ルコメントを明示化する Greasemonkey

id:ekken さんのブログのエントリー、僕が「あったら良いな」と思うはてなブックマークの機能のまとめ にこんなことが書かれていた。

idコールしたコメントは、コールした側からは分かりやすいけど、コールされた側からは分かりにくい。idコールをメール通知設定にしているユーザーはともかくも、そうではないユーザーや当事者以外には分かりにくいので、ブックマークコメント一覧に「コールされたことが分かりやすくなる何か」があると良いなぁ。

うん、確かにこれはあったら便利そう。

と、いうわけで

早速、はてなブックマーク新バージョンで動くグリモンを作ってみた!

// ==UserScript==
// @name           Hatena Bookmark Reply
// @namespace      http://www.ohaco.jp
// @include        http://b.hatena.ne.jp/entry/*
// @version        1.0
// ==/UserScript==

(function() {
  var bookmarked_user = document.getElementById('bookmarked_user');
  var allSpan = bookmarked_user.getElementsByTagName('span');

  for (i = 0; i < allSpan.length; i++ ) {
    if (allSpan[i].className == 'comment') {
      if(allSpan[i].innerHTML.match(/id:[0-9a-zA-Z_\-]+/)) {
        var replyId = allSpan[i].innerHTML.match(/id:[0-9a-zA-Z_\-]+/)[0].substr(3);
        var callId = allSpan[i].parentNode.getElementsByTagName('a')[1].innerHTML;

        if(document.getElementById('bookmark-user-' + replyId)) {
          var replyLi = document.getElementById('bookmark-user-' + replyId);

          if(!document.getElementById( 'hatena_bookmark_reply_' + replyId)) {
            var replyChild = document.createElement('div');
            replyChild.setAttribute('id', 'hatena_bookmark_reply_' + replyId);
            replyChild.innerHTML = '&nbsp;Reply&nbsp;:&nbsp;';
            replyChild.style.display = 'inline';
            replyLi.appendChild(replyChild);
          }

          var replyAnchor = document.createElement('a');
          replyAnchor.setAttribute('href', location.href.split('#')[0] + '#bookmark-user-' + callId);

          var callIcon = document.createElement('img');
          callIcon.setAttribute('src', allSpan[i].parentNode.getElementsByTagName('img')[0].src);
          callIcon.setAttribute('title', callId);

          replyAnchor.appendChild(callIcon);
          document.getElementById( 'hatena_bookmark_reply_' + replyId).appendChild(replyAnchor);
        }
      }
    }
  }
})();

これを使うとこうなります。

Reply の右側にあるアイコンをクリックすると、そのユーザーのブクマコメまで移動します。

インストールはここから

http://userscripts.org/scripts/show/36666

Sleipnir + SeaHorse でも動きました。

ホントは昨日の夜に公開しようと思ってたんだけど、作ってる途中で はてブベータが 503 になって泣きそうになった。あと、使っていて変な所とかがあったら教えてください><

追記

はてブが正式リリースされたので修正しました! URL が変わっただけですが。

IT業界のえがちゃん って結局何だったの?

反応したら負けなのかもしれない。
でも、色々とやりとりを見た結果、なんだか書かずにいられない気持ちになってしまったので書く。

IT業界のえがちゃんを知ったきっかけ

まず最初に、僕が IT業界のえがちゃんを知ったのは、このエントリがきっかけ。
http://anond.hatelabo.jp/20080914185134

問題なのは、彼が作っているWebサービス自体である。
「これはウザい」と思ってしまうようなものばかりだ。

こんなことが書かれていたもんだから、一体どれほどウザいんだろうと思ってググってみた。そして彼がリリースしたサービスを見て回った。

その結果として僕が最初に感じたのは「確かに作ってるサービスはスパムチックでウザい部分もあるけど、作ってる人は勢いもあるし面白そうな人だなー」という感じだった。

だから

一昨日、 id:amachang さんのエントリーを読んだ時にも僕はブコメでこう書いた。

個人的には面白い人だと思ってるし期待もしてる。だけど、作ってるものを見るとどうも詰めが甘いというか、何かもったいない感じがするんだよなぁ。

さらに、今後を期待して えがちゃんの為にid:HolyGrail さんもエントリーを書いてくれた。これを見て、僕はホントにインターネットっていうのは素晴らしいなと思った。普通に生きてたら、ココまで色々言ってくれる人はなかなかいないよ。
「どんだけあったけぇんだよ、みんな」と思った。モロに批判的な人もいたけど、そういう人も含めて。
「こんなにも思ってくれる人がいて、えがちゃん良かったなぁ」とさえ思ったんですよ。

だけど

昨日の id:Hamachiya2 さんのエントリー でのコメントを見て愕然とした。

えーっと、誤解を与えてしまったら非常に申し訳ないのですが
単純に今まで、色々な人にXSSについて攻められていて

「なぜそんな悪いことなの??」

と思っていたのですが、今まで1番わかり易くとても参考になりました。
ありがとうございました!

まず、今まで XSS をさんざん指摘されていたのに、それのどこがダメなのか知らなかったという事に驚いた。僕は、てっきり知っていて放置しているのかと思っていた(それはそれで大問題だけど)。自分で調べようとかは思わなかったのだろうか?

あと、本人は「なるほど、XSSとはそういう事だったのですね!」とか言って喜んでるっぽいけど、それだいぶズレてると思うよ。ちょっと他のところにも書いたんだけど、このエントリーは「はじめての XSS」とか、そういう為に書かれたものでは無いと思うから。

きっと id:Hamachiya2 さんが伝えたかった事は伝わらなかったんだろうなぁ。

色々と言及してくれた人たちの気持ちも無駄になってしまったような気がして、とても悲しかった。

それでも僕は

一度は期待を抱いてしまった人だし、イイところを探そうと思って色々見て回ったんです!そしたら、こんなエントリーを書いてたんです!
ttp://blog.livedoor.jp/ikiradio/archives/51043067.html (諸事情により先頭の h は抜いてあります。)*1

そして、今猛烈にそんな自分が
嫌いになりそうですし
後ろめたい気がしてなりません!!!
なんか、正直もっと胸を張って
「僕は間違ったことをやってない!」
と言える男で在りたかったなと後悔しています。

「お前は正義だよ!頑張れ!」と言われて
ちょっと後ろめたい気持ちになることって凄くつらい。
「なんか友達に胸張って自慢できるサービスがないじゃん」
って凄くかっこ悪い。

色々と気にかかる事も書いてあったけど、どうやら えがちゃんなりに色々と反省もしてるっぽかったし、僕はやっぱり今後も えがちゃんの事を温かい目で見守ろうと思ったんです><

そしたら

これかよ
ttp://blog.livedoor.jp/ikiradio/archives/51043181.html

今は直したみたいだけど『はてブで「これはえがい」タグが付くと〜』の部分は、最初ははてブで「アンチgoodhome」タグが付くと〜』と書いてあった。

胸張って自慢できるようにしようと思った結果がコレ?こんなことして後悔しない?後ろめたくない?
もう過去最高レベルのガッカリだよ。

僕が『IT業界のえがちゃん』こと永上裕之氏に圧倒的に足りないと思うもの

強いて一つだけ挙げるとすれば、それは想像力だと思う。自分の行動や言動によって周りの人がどう思うかとか、少しは考えなよ。

と、まあこんなこと書いちゃったけど

僕はどちらかというと周りを気にし過ぎちゃって何も行動できないようなタイプなので、こういう空気を読まずに突き進んじゃう人って少し羨ましかったりもする。

*1:冷静になって見てみると Hamachiya2 さんのエントリーよりもコッチの方が早いっぽいなぁ

mixi 日記ページで本人のコメントをハイライト表示する Greasemonkey


さっき mixi 見てて気づいたんですけど、mixi公認タレント・アーティストの方々の日記ページでは本人のコメントは赤くハイライト表示されるみたいなんです!きっと、一般ユーザーよりもコメントの数が多いから本人のコメントが埋もれないように目立たせるためなんじゃないかと思います。

でもこれ、正直言うと一般ユーザーのページでも欲しいですよね!?あった方が絶対便利だと思うんです!

と、いうわけで

グリモン作りました><

// ==UserScript==
// @name           Mixi Owner Highlight
// @namespace      http://www.ohaco.jp
// @include        http://mixi.jp/view_diary.pl*
// @version        1.0.0
// ==/UserScript==

(function() {
  var ownerId = document.getElementsByName('owner_id')[0].value;
  var allDt = document.getElementsByTagName('dt');

  var reg = new RegExp('show_friend.pl.\?id=' + ownerId + '$');

  for (i = 0; i < allDt.length; i++ ) {
    if (allDt[i].className == 'commentTitle') {
      if (allDt[i].getElementsByTagName('a')[0].getAttribute('href').match(reg)) {
        allDt[i].style.background = '#ffdad3';
      }
    }
  }
})();

インストールはココから

http://userscripts.org/scripts/show/34813

地味だけど

便利ダナー。

B くんがギャンブルで得たもの

Pくんがギャンブルで得たものと失ったもの - ハックルベリーに会いに行く
これを読んだら、なんだか無性に書きたくなったので書く。

B くんの話。

B くんは不真面目な高校生だった。部活はそれなりに頑張っていたけど、勉強はほとんどしなかった。そんな状態で進学など出来るハズもなく(というか進学する気などサラサラ無かった)、卒業間近になっても進路は未定で担任の先生を困らせたりもしていた。

そのうち高校を卒業し、晴れて無職となった。しかし、無職を選んだのには理由があった。

B くんには夢があった。

中学、高校とバンドを組んでいた B くんは、それで飯を食いたいと思っていたのだ。高校を卒業する数ヶ月前からバイトをし、新しいギターを買うためのお金を貯めたりもしていた。

ある日、B くんはバイトで貯めたお金を全部持って御茶ノ水へ向かった。目的はもちろん楽器を買うためだ。B くんのお目当てはギブソンレスポール。しかし、楽器店に入るなり B くんはガックリと肩を落とした。お金が足りなかった。

足りない金額は、だいたい1万円くらいだったろうか、ギターの値段を考えれば、その差はわずかなものである。届きそうで届かない金額。しかし、足りないものは足りない。

グッとグレードを落としてエピフォンにしようか…とも思ったりした。だけど、さすがにそれは B くんのプライド*1が許さなかった。楽器屋の店員さんに、後日お金を貯めてからもう一度来る事を告げて、その日は帰った。

次の日、 B くんの足はパチンコ屋へと向かっていた。足りない分をギャンブルで補うつもりだったのだ。1万円の臨時収入を得る方法はそれしかなかった。次の月の給料を待つという選択肢はなかった。ダメ人間だったからだ。パチンコを打った事がなかった B くんは、とりあえずテレビのパチンコ番組で見たことがあったルパン3世の台に座った。

どんどん吸い込まれていくパチンコ玉を見て Bくんに何とも言えない感覚が襲う。

「これがギャンブルか…」

下手をしたら増やすどころか全財産を失うかもしれないと思った B くんは、つぎ込むのは5000円までというルールを決めた。当時やっていたバイトが時給740円だったので、その時の B くんからしたら5000円でもかなりの大金だった。

そんな大金が、ものの十数分で無くなろうとしている。 B くんは激しく後悔していた。

しかし、金額にしたらあと200円程度だろうか、上皿の玉もなくなりかけていた時にそれは来た。

大当たりだ。

残念ながらその大当たりは単発だったが、 B くんは一回の大当たりが5000円以上になることくらいは知っていたので、今までの負けがなくなったことに心の底から安心した。

その大当たりの後、少し打って換金した。ちょうど5000円になった。 B くんとパチンコの出会いはこんな感じだった。よく『ビギナーズラック』とかいうけど、そんなものはなかった。

それから数カ月

B くんはバンドを組むことなど忘れたかのように、毎日パチスロばかり打っていた。

B くんが狂ったように打ち続けていたのは『花火百景』という台だった。当時パチスロを打っていた人なら知っていると思うけど、この台はしっかり目押しを行えば、設定 1でも機械割*2が 100% を超えるという台だった。

あのパチンコとの出会いの数日後にバイト先の人にパチンコを打った話をしたら、その人もよくパチンコやパチスロを打つ人だったらしく、最近は花火百景を打って勝っているという話を聞いて自分もそれをやってみようと思ったのだった。

しかし、B くんはその花火百景を打って負け続けていた。設定1を下回るボーナス確率でしかボーナスを引けないツキの悪さもあったが、そもそも目押しのレベルが勝てる域に達していなかったのではないかと思う。それでも本人は勝てると信じて打ち続けた。

財布の中身は空っぽなのが当たり前になっていた。ギターどころか弦も買えなかった。いつの間にかバンドをやろうという気持ちも消えていた。頭の中はスロットの事ばかり、完全にジャンキーだった。

このままではマズいと思い、B くんはギャンブルをやめる事に決めた。しかし B くんは負けず嫌いだったので、どうせなら勝ってやめることにした。今思うと、これは完全にダメ人間がする思考だと思う。ほとんどの人はこうして泥沼にハマっていくのだ。

しかし、それから B くんは勝ち続けた。「やめてやる!」と心に決めた日から、今までに発揮したことのない集中力でパチスロ関連の本を読み漁り、勝つための立ち回りを頭に入れて誘惑に負けずその立ち回りをひたすら実践したのだった。

パチスロで勝てるようになってからは財布に1万円札が何枚も入っているのは当たり前で、買いたいものをいくら買っても毎月入ってくるバイトの給料には手をつけていないという信じられないような状態だった。

そのうち B くんは「バイトよりもパチスロのほうが儲かるじゃないか」と思い始めた。収支を見てみても月々のバイトの給料とパチスロの収支はそれほど差がなかった。パチスロに専念した方が儲かる事を確信した B くんはバイトを辞めた。

そこからの収支は、それはもう相当なものだったと思う。

財布はいつもパンパンだった。パチスロで勝ってお金が入りきらなくなると、家の本棚に挟んである封筒に何枚か移したりしていた。B くんにとって『パチスロを打つ』という事は、娯楽でもギャンブルでもなく、お金を得るためにする事だった。

そうやってパチスロを打っているうちに、B くんはあることに気付く。

これは『投資』だ

「今やっているこの行為は、いわゆる『投資』というやつなんじゃないか?」

勝てる台を探して、その台にお金をつぎ込み、つぎ込んだ金額よりも多いリターンを得る。これは投資そのものだった。パチスロでもつぎ込んだ金額のことを投資金額とか言うけど、それはカッコつけたりしているわけではなく、ホントにそのままの意味だったことにその時気付いた。

B くんの興味は次第にパチスロから投資へと移っていった。パチスロではどんなに頑張っても掛けられる額が決まっているので上限が低いと考えたからだ。そして Bくんが次の投資対象に選んだのは株式だった。すぐさまライブドア証券に口座を開いた*3

しかし、株式市場の大人たちはパチンコ屋にいる大人たちよりも何枚も上手だった。B くんは思うように結果が出せず、株で損をしては、それをパチスロで取り返すというような事を何度も繰り返していた。結局、またメインでパチスロを打つハメになっていた。

そして、パチスロでの勝ちも、そう長くは続かなかった。冬が来たのだ。

ここでの冬というのは『パチスロの冬の時代』とか、そういう意味ではなく正真正銘の冬、四季の冬である。B くんはフットワークを活かして何件ものパチンコ屋を回って、勝てる台を見つけては打つというスタイルで収支をあげていたのだが、外が寒くなるにつれて遠出するのがイヤになったので近場の店で済まそうとした。その結果、収支が激減したのである。

再び、パチスロ以外の投資対象を探すことになった。寒いのはイヤなので、我慢して遠出するという選択肢は無かった。ダメ人間だったから。

そしてある時、B くんはダメ人間なりの考えで、最も信頼出来る投資対象を見つけた。

それは『自分自身』だった。

自分自身に投資する。投資が失敗したらそれは全部自分のせいであって、誰のせいにも出来ない究極の自己責任。投資を成功させるには自分が頑張るしかない。逆に言えば自分が頑張りさえすればその投資は成功するという、これ以上ないくらい最高の投資対象だった。

残る問題は、その自分自身への投資として何にお金を使うかだったが、それはすぐに見つかった。

ちょうどその頃、寒くて家にこもっていたので毎日パソコンでインターネットばかりしていて、面白いサイトを見て回るうちに「自分にもこういったサイトが作れないか」と思うようになっていた。アフィリエイトというモノの存在も知っていて、それで稼げるかもしれないという思惑もあったので、 HTML を習得することにした。

それからは1冊で数千円もする HTML のリファレンス本やサンプル本などを何冊も買い、毎日コーディングする事にのめり込んだ。そのうち CSS の存在も知り、自分の思い通りのサイトが作れる事に夢中になった。その甲斐あってか、半年後に地元の IT企業に就職することも出来た。きっと、今までの投資の中では一番の成功だったと思う。アフィリエイトは全然ダメだったけど。

ギャンブルをやっている人に話を聞くと、どうやら勝ち負けに関係なくギャンブルを始めたことに後悔している人が多いみたいだ。「今までに車が何台も買えるくらい負けてる」とか「負けてはいないけど時間の無駄だった」とか。

でも、僕はギャンブルを始めた事、あの時にルパン3世を打った事は全く後悔していない。僕がギャンブルを通して得たものは、誰かに教えてもらおうと思っても到底理解できない、自分が経験して初めてわかる貴重なものだと思うから。

*1:真冬の水たまりに張った氷のような薄いプライド

*2:IN 枚数に対する OUT 枚数の割合。たとえば機械割が110%の台の場合、3000枚(1000ゲーム分)投入すると3300枚の払い出しが期待できる。

*3:その時、19歳だった未成年の B くんが口座を開ける証券会社は確かココくらいしかなかった

IE の attachEvent では this が使えない?

mixi エコーの返信をポップアップ表示する GreasemonkeyIE でも使えるようにしようと思って修正していたんですが、ちょっと attachEvent の辺りで若干ハマってしまったのでメモメモ。

とりあえず

変更前のソースはこんな感じ。

// ==UserScript==
// @name           Mixi Echo Popup
// @namespace      http://ohaco.jp/
// @include        http://mixi.jp/recent_echo.pl*
// @version        1.0.0
// ==/UserScript==

(function() {
  var allAnchor = document.getElementsByTagName("a");
  var overlay = document.getElementById('overlay').style;

  for (i = 0; i < allAnchor.length; i++ ) {
    if (allAnchor[i].getAttribute('href').match(/list_echo\.pl.*&post_time=/)) {
      allAnchor[i].addEventListener('mouseover', function(){popupDisplay(this)}, true)
    }
  }

  function popupDisplay(obj) {
    var popup, status, reply, trash, close;
    var url = obj.getAttribute('href').replace("list_echo", "view_echo");

    var httpRequest = new XMLHttpRequest();
    httpRequest.open('GET', url, true);
    httpRequest.send('');
    httpRequest.onreadystatechange = function() {
      if (httpRequest.readyState == 4) {
        var res = httpRequest.responseText;
        var start = res.indexOf('<div class="echoStatus clearfix">');
        var end = res.indexOf('<div class="echoQuestionnaire">');

        if (start != -1) {
          res = res.slice(start,end);
          res = res.replace("echo_member_id_1", "echo_member_id_100");
          res = res.replace("echo_post_time_1", "echo_post_time_100");
          res = res.replace("echo_nickname_1", "echo_nickname_100");
          res = res.replace("echo_body_1", "echo_body_100");

          popup = document.createElement("div");
          popup.innerHTML = res;
          popup.style.position = 'absolute';
          popup.style.margin = '-118px 0 0 0';
          popup.style.padding = '10px 0';
          popup.style.height = '88px';
          popup.style.overflow = 'hidden';
          popup.style.zIndex = '1';
          popup.style.background = '#fff';
          popup.style.border = 'solid 1px #999';
          popup.addEventListener('mouseover', function(){close = false;}, true);
          popup.addEventListener('mouseout', function(){close = true;}, true);

          var popupDiv = popup.getElementsByTagName('div');

          for (i = 0; i < popupDiv.length; i++ ) {
            if (popupDiv[i].className == 'status') {
              status = popupDiv[i];
              status.style.marginTop = '0';
              status.style.fontSize = '12px';
              status.getElementsByTagName('span')[0].style.fontSize = '11px';
            }
          }

          var popupAnchor = popup.getElementsByTagName('a');

          for (i = 0; i < popupAnchor.length; i++ ) {
            if (popupAnchor[i].className == 'reply') {
              reply = popupAnchor[i];
              reply.removeAttribute('onclick');
              reply.setAttribute('onclick', 'show_echo_reply_layer(event, 100)');
            }
            if (popupAnchor[i].className == 'trash') {
              trash = popupAnchor[i];
              trash.style.display = 'none';
            }
          }

          overlay.display = 'block';
          overlay.opacity = 0;
          close = true;

          obj.parentNode.insertBefore(popup, obj.parentNode.firstChild);
          document.addEventListener('click', function(){
            if(close) {
              obj.parentNode.removeChild(popup);
              overlay.display  = 'none';
            }
          }, true)
        } else {
          alert('\u8A72\u5F53\u3059\u308B\u30A8\u30B3\u30FC\u304C\u3042\u308A\u307E\u305B\u3093\uFF1E\uFF1C');
        }
      }
    }
  }
})();

冒頭の for 文の部分で addEventListener を使ってアンカーのマウスオーバーイベントを追加していますが、 IE では addEventListener が使えないので、代わりに attachEvent を使うように書きかえなくてはいけません。

IE 等の addEventListener が使えないブラウザの場合は attachEvent を使うように変更

とりあえず、特に何も考えずに下のように変更してみましたが…(一部抜粋)

  for (i = 0; i < allAnchor.length; i++ ) {
    if (allAnchor[i].href.match(/list_echo\.pl.*&post_time=/)) {
      if (document.addEventListener) {
        allAnchor[i].addEventListener('mouseover', function(){popupDisplay(this);}, true);
      } else if (document.attachEvent) {
        allAnchor[i].attachEvent('onmouseover', function(){popupDisplay(this);});
      }
    }
  }

うーん、動きません><
addEventListener の方では this で、ちゃんとマウスオーバーイベントが発生したアンカーの要素が渡されるんですが attachEvent の方だと、どうも this では上手く渡せないみたいです。

いろいろ調べてみた結果

IE 様には event.srcElement というものがあるらしいので、それを使ってみました!
以下、テストスクリプト

// ==UserScript==
// @name           Mixi Echo Popup
// @namespace      http://ohaco.jp/
// @include        http://mixi.jp/recent_echo.pl*
// ==/UserScript==

(function() {
  var allAnchor = document.getElementsByTagName("a");
  for (i = 0; i < allAnchor.length; i++ ) {
    if (allAnchor[i].href.match(/list_echo\.pl.*&post_time=/)) {
      if (document.addEventListener) {
        allAnchor[i].addEventListener('mouseover', function(){popupDisplay(this);}, true);
      } else if (document.attachEvent) {
        allAnchor[i].attachEvent('onmouseover', function(){popupDisplay(event.srcElement);});
      }
    }
  }

  function popupDisplay(obj) {
    alert(obj.getAttribute('href')); // http://mixi.jp/list_echo.pl?id=自主規制&post_time=自主規制
  }
})();

おー、ちゃんと渡せてるっぽい!

結局

IE の attachEvent 内の this が何を指しているのかはわかりませんでした><
他にも IE 用に書きかえないといけない部分がいっぱいありそうだなぁ…