2008/06/16

はてな
はてなダイアリーモバイルでも、はてなスターが付けられる様になった様です。
モバイル版はてなダイアリーではてなスターに対応しました - はてなダイアリー日記

本日、モバイル版はてなダイアリーではてなスターを見たり付けたりできるようになりました。

これまでモバイル版ではてなスターに対応していたサービスははてなハイクだけでしたが、はてなダイアリーでも同様に☆を閲覧したり追加したりできるようになりました。

http://d.hatena.ne.jp/hatenadiary/20080613/1213342619
モバイル端末で試した所、確かにスターが付けられます。「もしや...」と思って自分のサイトでもやってみたら...
できちゃいました。
スターを付けるURLは
http://s.hatena.ne.jp/star.add?sid={SID}&rks={RKS}&uri={記事URL}&location={元の場所}
の様なのですがモバイル端末ではログインし直す事もある為、リンク先には「ログイン」や「かんたんログイン」へのリンクが張られています。
これがあれば外部ドメインでもスターが付けられるって事ですね。
先日、blosxomでモバイル様にはてなスターを表示する為のプラグインを書いたのですが、その際に修正したフレーバに以下のリンクも付け足しました。
<a href="http://s.hatena.ne.jp/star.add?sid=&rks=&uri=$url$path/$fn.htm&location=$url$path/$fn.htm"><img src="http://s.hatena.com/images/add_bl.gif" border="0"/></a>$hatenastar_mobile::stars<br />
おそらく一度かんたんログイン等でログインすれば、はてなドメイン上のクッキーは少しの間は使える筈なので、二三個付ける場合でも再度ログインする事は無いと思います。

2008/02/21

はてな
はてなスクリーンショットに微笑むblosxomプラグイン作りました。
普段は微笑みませんが、はてなスクリーンショットに「ハイ!ポーズ!」と言われるとスマイルを振りまくのです。

以下証拠写真
はてなスクリーンショット - http://mattn.kaoriya.net
で、blosxomプラグインのソース
package hatenascreenshot;
use strict;

use vars qw($smile);
my $photo = '<img src="お好きな画像">';

sub start {
  $smile = $photo if ($ENV{'HTTP_USER_AGENT'} =~ /HatenaScreenshot/);
}

1;
あとはフレーバに$hatenascreenshot::smileを入れるだけ。
お好きな画像で微笑んでみてはどうでしょうか?

決してウンコとかは辞めましょう。
※まぁネタですから...

2007/12/18

はてな
はてなハイクが面白すぎる。
もう、いままでの様に「はてなスターは気に入った記事にしか付けない」なんて考えの人は、一度行ってみるべき。
スピード感、一発ネタ、五臓六腑に染み渡るダジャレ。
どれもこれもたまりません。
あと、手前味噌ですが昨日作った「LDRizeでpin付けたノードにMinibufferから「はてなスター」を付けるグリモン」がめちゃ便利。
LDRizeとMinibufferがあれば「j/k」で上下移動し「H S」で、はてなスターを付けられます。
※pinを付けて無くてもスターを打てる様に改良してあります。
見てるだけでも面白いですよ。

2007/10/05

はてな
擬似GM_xmlhttpRequestを使ってたので、はてなリソースしか動いてなかった。
擬似GM_xmlhttpRequestでは、はてなスターの場合だけJSONで動かすようにしたので、きっと行けると思う。
JSONデータから文字列に戻す部分はこれを使わせて頂いた。
前とそれほど変わらないけど、unsafeWindowの宣言場所を上にもってったので前回のような簡単なパッチの当て方は出来なくなった。

--- HatenaStarEverywhere.user.js.orig   Mon Oct 01 10:37:41 2007
+++ HatenaStarEverywhere.user.js    Fri Oct 05 23:08:10 2007
@@ -92,6 +92,9 @@
     ensure(window.Hatena, 'Star');
 }
 
+if (typeof unsafeWindow == "undefined") {
+    var unsafeWindow = window;
+}
 if (typeof unsafeWindow.Hatena == 'undefined'
         || typeof unsafeWindow.Hatena.Star == 'undefined'
         || !unsafeWindow.Hatena.Star.loaded) {
@@ -138,4 +141,137 @@
             GM_setValue('configExpire', '');
         }
     });
+}
+
+if (typeof(GM_setValue) != 'function') {
+  function GM_setValue(key, value) {
+    document.cookie = [
+      name, '=', escape(value),
+      ';expires=', (new Date(new Date() + 365 * 1000 * 60 * 60 * 24)).toGMTString()
+    ].join('');
+  }
+}
+if (typeof(GM_getValue) != 'function') {
+  function GM_getValue(key) {
+    var r = new RegExp('/' + name + '=([^;]*)/'), m;
+    if (m = document.cookie.match(r)) return unescape(m[1]);
+    return null;
+  }
+}
+if (typeof(GM_xmlhttpRequest) != 'function') {
+  var GM_xmlhttpRequest_Data = null;
+  function GM_xmlhttpRequest_Handler(data) {
+     GM_xmlhttpRequest_Data = toJsonString(data);
+  }
+  function GM_xmlhttpRequest(opt) {
+    if (opt.url == 'http://s.hatena.ne.jp/siteconfig.json') {
+       var s = document.createElement('script');
+       s.charset = 'utf-8';
+       s.onload = function(e) {
+          s.responseText = GM_xmlhttpRequest_Data;
+          opt.onload(s);
+         GM_xmlhttpRequest_Data = null;
+       }
+       s.src = opt.url + '?callback=GM_xmlhttpRequest_Handler';
+       document.body.appendChild(s);
+   }
+    var x=new XMLHttpRequest();
+    x.onreadystatechange=function() {
+      switch(x.readyState) {
+        case 4:
+          opt.onload(x);
+          break;
+      }
+    };
+    x.open(opt.method,opt.url,true);
+    x.setRequestHeader('Content-Type',opt.mime);
+    x.send(null);
+  }
+}
+
+/*
+ * include http://code.google.com/p/trimpath/wiki/JsonLibrary
+ * with few modify for opera.
+ */
+
+/*
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+function toJsonString(arg) {
+    return toJsonStringArray(arg).join('');
+}
+
+function toJsonStringArray(arg, out) {
+    out = out || new Array();
+    var u; // undefined
+
+    switch (typeof arg) {
+    case 'object':
+        if (arg) {
+            if (arg.constructor == Array) {
+                out.push('[');
+                for (var i = 0; i < arg.length; ++i) {
+                    if (i > 0)
+                        out.push(',\n');
+                    toJsonStringArray(arg[i], out);
+                }
+                out.push(']');
+                return out;
+            } else if (typeof arg.toString != 'undefined') {
+                out.push('{');
+                var first = true;
+                for (var i in arg) {
+                    var curr = out.length; // Record position to allow undo when arg[i] is undefined.
+                    if (!first)
+                        out.push(',\n');
+                    toJsonStringArray(i, out);
+                    out.push(':');                    
+                    toJsonStringArray(arg[i], out);
+                    if (out[out.length - 1] == u)
+                        out.splice(curr, out.length - curr);
+                    else
+                        first = false;
+                }
+                out.push('}');
+                return out;
+            }
+            return out;
+        }
+        out.push('null');
+        return out;
+    case 'unknown':
+    case 'undefined':
+    case 'function':
+        out.push(u);
+        return out;
+    case 'string':
+        out.push('"')
+        out.push(arg.replace(/(["\\])/g, '\\$1').replace(/\r/g, '').replace(/\n/g, '\\n'));
+        out.push('"');
+        return out;
+    default:
+        out.push(String(arg));
+        return out;
+    }
 }


追記
[はてな][ネット]Twitterとはてなスターは相性がいい」こちらで紹介して頂きました。
一応、私の手元で動いている物をアップします。
はてな事務局さん、問題があればご連絡下さい。
HatenaStarEverywhere.user.js

2007/10/03

はてな
どこでもスターグリースモンキーがSafariとfubに対応しました
Operaのuser.jsに対応してみました。
たぶん行けそう
patchの適応の仕方が分からない人は、下の「+」が付いてる行だけ抜き取って先頭の「+」を全部削除、その後「HatenaStarEverywhere.user.js」の一番おしりに貼り付けて保存するか、はてな側の対応を待ちましょう。
--- HatenaStarEverywhere.user.js.orig   Mon Oct 01 10:37:41 2007
+++ HatenaStarEverywhere.user.js    Wed Oct 03 12:44:20 2007
@@ -139,3 +139,37 @@
         }
     });
 }
+
+if (typeof unsafeWindow == "undefined") {
+    var unsafeWindow = window;
+}
+if (typeof(GM_setValue) != 'function') {
+  function GM_setValue(key, value) {
+    document.cookie = [
+      name, '=', escape(value),
+      ';expires=', (new Date(new Date() + 365 * 1000 * 60 * 60 * 24)).toGMTString()
+    ].join('');
+  }
+}
+if (typeof(GM_getValue) != 'function') {
+  function GM_getValue(key) {
+    var r = new RegExp('/' + name + '=([^;]*)/'), m;
+    if (m = document.cookie.match(r)) return unescape(m[1]);
+    return value;
+  }
+}
+if (typeof(GM_setValue) != 'function') {
+  function GM_xmlhttpRequest(opt) {
+    var x=new XMLHttpRequest();
+    x.onreadystatechange=function() {
+      switch(x.readyState) {
+        case 4:
+          opt.onload(x);
+          break;
+      }
+    };
+    x.open(opt.method,opt.url,true);
+    x.setRequestHeader('Content-Type',opt.mime);
+    x.send(null);
+  }
+}
追記1
すみません。はてな内リソースでしか有効にならないようです。もう少し考えてみます。(_ _;)
追記2
修正はこちら

2007/09/29

はてな
注意:os0xさんからの指摘で、ちゃんと動かないらしいです。

javascript:var d=document,t,i,l,m=[];l=d.getElementsByTagName('span');for(i=0;i<l.length;i++){if(l[i].className=='hatena-star-star-container')m.push(l[i]);}t=d.createElement('input');t.type='text';t.onblur=function(){var v=d.createElement('div');v.innerHTML=t.value;m[0].appendChild(v);m[0].removeChild(t);};m[0].appendChild(t);void(0);
  • ↑のコードをアドレスバーにゴニョゴニョゴニョ
  • 出てきたテキストボックスにゴニョゴニョゴニョ
  • フォーカスを外す為に、アドレスバーを選ぶ
  • 出来た文字列を選ぶ
  • ゴニョゴニョボタンを押す!
たまーに上手くいかない場合もある
追記1
最後に余計な文字を1個作って、それを選択せずにゴニョゴニョするとよさげ

追記2
ちょっと改良
javascript:var d=document,t,i,l,m=[];l=d.getElementsByTagName('span');for(i=0;i<l.length;i++){if(l[i].className=='hatena-star-star-container')m.push(l[i]);}t=d.createElement('input');t.type='text';t.onblur=function(){var v=d.createElement('div');v.innerHTML=' '+t.value+' ←ここまで選択';m[0].appendChild(v);m[0].removeChild(t);};m[0].appendChild(t);void(0);

追記3
あ、それでもダメな時があるね...
パターンがつかめない...orz

2007/09/28

はてな
はてなブックマークは、はてなブックマークだからしょうがないのです。
はてブ批判をすると、何故か釣りと言われる
よく考えてみよう。書き逃げのネガティブコメントを行った場合、その人は発言に責任を負わなくなってしまう。それはよくない。電車での痴漢と同じである。

idも明記されているしpermalinkもあるはてなブックマークコメントを「書き逃げ」と感じる理由がよく分からない
公開の場にテキストを書くという意味ではblogと何ら変わらない責任が発生すると思っています。

普通の人にとっては書き逃げだと思います
管理人とコメンテーターとは、とても対等とはいえないと思います。管理人はコメントを承認制にしたり、削除したりできるし。逆にコメンテーターは、邪魔臭いコメントを大量に書いて嫌がらせすることも可能です。

続きを読む...


新規投稿