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

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

マイリスト数もとっくに限界を迎えていたので上限の増加は嬉しい、そして何より過去ログが見られるのが一番嬉しかった!
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

地味だけど

便利ダナー。

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 用に書きかえないといけない部分がいっぱいありそうだなぁ…

マイミクシィの最新日記を7件表示するだけの URL

mixi のソースを見てたら、こんな URL を発見したのでメモメモ。

http://mixi.jp/ajax_new_diary.pl?friend_id=

friend_id にマイミクの誰かの ID を渡してあげると、その人の最新日記が最大で7件表示されます。そんだけ。


高橋名人の最新日記)

mixi は、これをどこで使ってるのか

この簡素なページはココで使われています。
http://mixi.jp/new_friend_diary.pl
リストの名前の右側にある本のアイコンをクリックするとピョコっと出てくるやつです。

うーん

グリモン作ったりする時に使えるかなー
あと、足跡を付けずにマイミクの過去日記のタイトルを確認したりする、極めて限定的な用途にも使えるっ…!*1

*1:あしあと付かないかどうか確認したわけじゃないけど、さすがにこの URL では付きませんよね、多分。