Twitter上でMyMiniCityの紹介発言が多くなってきたので見えなくするぐりもんを作りました
書いた人: noriaki 2007,12月22日(土) 18:30
そろそろ私の街の人口も100人を超えようとしていますが,上の画像のように大きなビルがまったく建ちません.どうみても閑静な住宅街です.本当にありg(ry
それはともかく,MyMiniCityがTwitterで流行っていることもあり,Twitterのタイムライン上にはMyMiniCityへの誘導発言が多くなっています.
自分のMyMiniCityを持つ人は,アクセスを稼いでどんどん街を発展させたいので,Twitterで紹介しまくります.さらにはURL短縮サービスを使ってアクセスをずるく稼ごうとします.
こんな発言を見ている人は,自分もMyMiniCityで街を育てている人ならば良いのかもしれませんが,あんまり興味もないのにタイムライン上がMyMiniCityであふれかえるのは耐え切れないでしょう.
そこで,MyMiniCityユーザも,MyMiniCity嫌いユーザも幸せになれるぐりもんを作りました.
hide-and-grow-myminicity.user.js
これは,Twitterのタイムライン上でMyMiniCityへのリンクを含む発言を見えなくします.さらに,バックグラウンドでそこに書かれたリンク先にアクセスし,街の発展に貢献します.
つまり,自分の街を紹介する発言がうっとうしいと思っている人に対しては,その発言を見えなくする効果を提供します.一方,発言を見えなくされてしまった人(発言者)に対しては,確実な1アクセスを提供します.
このモデルなら,どちらも幸せになれるWin-Winの関係なので,WebブラウザでTwitterを見るというみんな使うといいんじゃないかな.
「myminicityをみんなで育てるためのRubyスクリプト」や,「PHPで街を育てる」,「Ruby とか Perl とかで街を育てるComments」といったスクリプトを実行してみんなの街を発展させようという考え方はすごく良いと思うのですが,実行するインセンティブが感じられないなーということもあってこのぐりもんを作りました.
インストール
以下のリンクからインストールしてください.(要:Greasemonkey)
hide-and-grow-myminicity.user.js
追記(2007/12/26 03:00:00)
日付計算と最終アクセス時刻比較の部分にバグがありました.現在は修正されています.追記日時以前にインストールされた方は再インストールをお願いします(その際ブラウザのキャッシュを削除してからお願いします).
ちなみに,MyMiniCityへのアクセスは1日に1回だけしか効果がないので,ぐりもんの機能を使ってキャッシュを生成し,同じ人の街へのアクセスは1日1回だけ行うようにしています.
ご意見・ご感想などは,コメント・トラックバック・ブックマークコメントなどでお気軽にお寄せください.また,よければ私の街にもアクセスしてあげてください.
MyMiniCityにアクセスしない版

追記(2007/12/23 02:00:00)
とはいえ,Twitterに流れるMyMiniCity誘導発言は見えなくしたいけど,バックグラウンドで勝手にアクセスされるのはイヤだ,という方のために単にMyMiniCityへのリンクを含む発言を隠すだけのぐりもんも用意しました. MyMiniCityへのリンクを含む発言は,上の画像のようにこじんまりして目立たなくなります.
twitter-hide-myminicity.user.js
MyMiniCityの宣伝をTwitterでよくやる私としては,相互互助という感じで前述の街の発展に貢献する版を使っていただきたいな,と思っているのですが,使ってくださる人の知らないところで勝手によそのWebページにアクセスするというのはお行儀の良いものではないので,それでも良いよ!という方は街に貢献する版をご利用ください.
以下,ソースコードが続きます.
ソースコード
バックグラウンドでアクセスして街に貢献する版
// ==UserScript==
// @name Twitter - Hide and Grow MyMiniCity
// @namespace http://blog.fulltext-search.biz/
// @description Hide MyMiniCity's link included Update, and Grow including MyMiniCity in background. on Twitter
// @license The MIT License
// @version 0.1.0
// @released 2007-12-22 17:30:00
// @updated 2007-12-22 17:30:00
// @conpatible Greasemonkey
// @include http://twitter.com/home
// ==/UserScript==
// XPath
var hasMyMiniCityLinkRow = [
'self::node()/descendant::*[local-name() = "tr" or local-name() = "TR"]',
'[count(descendant::*[(local-name() = "a" or local-name() = "A")',
' and ',
'contains(@href, ".myminicity.com")',
'])>0]'
].join('');
var MyMiniCityLink = [
'self::node()/descendant::*[(local-name() = "a" or local-name() = "A")',
' and ',
'contains(@href, ".myminicity.com")]'
].join('');
// RegExp
var ExtractName = /http:\/\/([a-zA-Z0-9\-]+)\.myminicity\.com/
function hide_and_grow(context) {
context = context.length ? context[0] : context;
var rows = $x(hasMyMiniCityLinkRow, context);
var cache = eval(GM_getValue('cache', {}));
var now = new Date();
rows.forEach(function(row) {
// Hide Row had MyMiniCity link
row.style.display = 'none';
// Grow MyMiniCity in background
var links = $x(MyMiniCityLink, row);
links.forEach(function(link) {
if(ExtractName.test(link.href)) {
var name = RegExp.$1;
if(!cache[name] || (new Date(cache[name])) < now) {
GM_xmlhttpRequest({
method: 'GET',
headers: {
'Cookie': 'X-Ref-Ok=1'
},
url: link.href,
onload: function(res) {
if(res.status != 200) return;
var name = this.url.match(ExtractName)[1];
var d = now;
d.setTime(now.getTime() + 24 * 60 * 60 * 1000);
var expire = eval(GM_getValue('cache', {}));
expire[name] = d.toGMTString();
GM_setValue('cache', expire.toSource());
},
onerror: function(res) { console.log(res.status + ': ' + res.responseText); }
});
}
}
});
});
}
// Main
var i=4;
function addFilter() {
if(window.AutoPagerize && window.AutoPagerize.addFilter) {
window.AutoPagerize.addFilter(hide_and_grow);
} else if(i-- > 0) {
setTimeout(arguments.callee, 500);
}
}
hide_and_grow(document);
addFilter();
// Utility
function $x(xpath, context) {
context = context || document;
var res = document.evaluate(xpath, context, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
for(var i, nodes = [] ; i=res.iterateNext() ; nodes.push(i));
return nodes;
}
バックグラウンドでアクセスしない版
// ==UserScript==
// @name Twitter - Hide MyMiniCity
// @namespace http://blog.fulltext-search.biz/
// @description Hide MyMiniCity's link in Twitter
// @license The MIT License
// @version 0.1.0
// @released 2007-12-23 01:30:00
// @updated 2007-12-23 01:30:00
// @conpatible Greasemonkey
// @include http://twitter.com/home
// ==/UserScript==
// XPath
var hasMyMiniCityLinkRow = [
'self::node()/descendant::*[local-name() = "tr" or local-name() = "TR"]',
'[count(descendant::*[(local-name() = "a" or local-name() = "A")',
' and ',
'contains(@href, ".myminicity.com")',
'])>0]'
].join('');
var ProfileImage = [
'self::node()/descendant::*[local-name() = "img" or local-name() = "IMG"]',
'[contains(concat(" ",@class," "), " photo ")',
' and ',
'contains(concat(" ",@class," "), " fn ")]'
].join('');
var UpdateSpan = [
'self::node()/descendant::*[local-name() = "span" or local-name() = "SPAN"]',
'[contains(concat(" ",@class," "), " entry-title ")',
' and ',
'contains(concat(" ",@class," "), " entry-content ")]'
].join('');
function hide(context) {
context = context.length ? context[0] : context;
var rows = $x(hasMyMiniCityLinkRow, context);
rows.forEach(function(row) {
// Hide Row had MyMiniCity link
// * Force Hide
//row.style.display = 'none';
var img = $x(ProfileImage, row)[0];
img.src = img.src.replace('_normal.', '_mini.');
var span = $x(UpdateSpan, row)[0];
span.style.display = 'none';
});
}
// Main
var i=4;
function addFilter() {
if(window.AutoPagerize && window.AutoPagerize.addFilter) {
window.AutoPagerize.addFilter(hide);
} else if(i-- > 0) {
setTimeout(arguments.callee, 500);
}
}
hide(document);
addFilter();
// Utility
function $x(xpath, context) {
context = context || document;
var res = document.evaluate(xpath, context, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
for(var i, nodes = [] ; i=res.iterateNext() ; nodes.push(i));
return nodes;
}


