otsune's SnakeOil RSSフィード

python -c "print''.join([chr(x) for x in 111&1101,110+~-~11,10^11*11,110+~-~11,-~101,-~11^11*11,~-110,111&11*11,11+11+10,11|~-0110,1-~11^11*11,10^11*11,-~11^11*11,110,101])"

2011-02-10

Togetter自id採用率Greasemonkeyを修正した

Togetter自id採用率Greasemonkeyを修正した - otsune's SnakeOil  を含むブックマーク はてなブックマーク - Togetter自id採用率Greasemonkeyを修正した - otsune's SnakeOil  Togetter自id採用率Greasemonkeyを修正した - otsune's SnakeOil  のブックマークコメント

元ネタは http://d.hatena.ne.jp/Pasta-K/20100321/1269164746 で。

TogetterのHTMLが変化したのに追随してquerySelectorで書きなおしただけ。

// ==UserScript==
// @name          Togetter List Owner Post Counter
// @namespace     http://d.hatena.ne.jp/Pasta-K
// @include       http://togetter.com/li/*
// ==/UserScript==

var mastername = document.querySelector('.icon_author').innerHTML;
var list = document.querySelectorAll('.list_body');
var i,c,postuser;
var all = list.length;
c=0;
for(i=0; i<list.length; i++){
    postuser=list[i].querySelector('div.status > a').innerHTML;
    if(mastername==postuser){
        c++;
    }
}
var par=(c/all*100).toFixed(1);
var addElem=document.createElement('span');
addElem.innerHTML=("自id採用率<br>"+par+"%<br>("+c+"/"+all+")");
var infoElem=document.querySelector('div.info_box_left');
infoElem.insertBefore(addElem,infoElem.lastChild);

https://gist.github.com/818934

インストールは https://gist.github.com/raw/818934/e4a28799dbad0a389c73ad8ce44a8551d92e817d/togetter_list_owner_post.user.js にてできます

トラックバック - http://subtech.g.hatena.ne.jp/otsune/20110210

2011-02-02

Togetterフィルターを手直ししてみた

Togetterフィルターを手直ししてみた - otsune's SnakeOil  を含むブックマーク はてなブックマーク - Togetterフィルターを手直ししてみた - otsune's SnakeOil  Togetterフィルターを手直ししてみた - otsune's SnakeOil  のブックマークコメント

http://d.hatena.ne.jp/mEGGrim/20101019/1287684499 が元ネタ

// ==UserScript==
// @name TogetterFilter
// @namespace TogetterFilter
// @description Togetterを任意のユーザー名を用いてフィルタリング
// @include http://togetter.com/*
// ==/UserScript==

// ここにフィルタリングしたいユーザーのIDを''で囲い、,で区切って記述して下さい
var blackListArray = ['carejinzaibank', 'ptotjinzaibank', 'nursejinzaibank'];

var blackList = new RegExp('^(?:' + blackListArray.join('|') + ')$', 'g');

// AutoPagerizeで増えた分ではない、1ページ目のフィルタリング
    filter(document);

// AutoPagerizeにfilterをイベントとして追加
// 要AutoPagerize(version 0.40 以降)、jAutoPagerize(Rev: 33889+ 以降)
// 参考URL: http://d.hatena.ne.jp/os0x/20090829/1251556449
document.body.addEventListener('AutoPagerize_DOMNodeInserted',function(evt){
    var node = evt.target;
    filter(node);
}, false);

function filter(node) {
    if(document.URL.match(/^http:\/\/togetter\.com\/li\/\d+/)) {
        filterTweets(node);
    } else {
        filterLists(node);
    }
}

function filterTweets(node) {
    //各まとめページの発言をフィルタリング
    column = document.evaluate(
        '//div[@class="list_body"]/div[@class="status"]/a[starts-with(@href, "http://twitter.com")]', 
        node, null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    );
    for (var i = 0; i < column.snapshotLength; i++) {
        thisLink = column.snapshotItem(i);
        if(thisLink.innerHTML.match(blackList)) {
            //display = 'none'にしてフィルタリング
//            thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
            thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1;
        }
    }

    // コメント欄をフィルタリング
    column = document.evaluate(
        '//div[@class="status"]/a[@class="twttrname"]', 
        node, null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    );

    for (var i = 0; i < column.snapshotLength; i++) {
        thisLink = column.snapshotItem(i);
        if(thisLink.innerHTML.match(blackList)) {
            //display = 'none'にしてフィルタリング
//            thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
            thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1;
        }
    }
}

function filterLists(node) {
    column = document.evaluate(
        //*のtwitterまとめ, でまとめ主のIDを検索してフィルタリング
        //        "/html/body/div/div[3]/div/div/div/ul/li/div/div[2]/div/a",
        '//div[@class="info_infomation"]/a[contains(concat(" ", @class, " "), " icon_author ")]', 
        node, null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null
    );
    for (var i = 0; i < column.snapshotLength; i++) {
        thisLink = column.snapshotItem(i);
        if(thisLink.innerHTML.match(blackList)) {
            //display = 'none'にしてフィルタリング
//            thisLink.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
            thisLink.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1;
        }
    }
}

display = 'none';だとフィルターが動いてるかどうかが実感できないので透明度10%でうっすら表示にしてみた。

XPathつかってるところはQuerySelectorに書き換えればもうすこしスッキリするかもなぁ。

インストールは https://gist.github.com/raw/807319/92717e85c5260f6bd001a3af3448710ca7d52c10/togetterfilter.user.js

追記

querySelectorで書きなおした

// ==UserScript==
// @name TogetterFilter
// @namespace TogetterFilter
// @description Togetterを任意のユーザー名を用いてフィルタリング
// @include http://togetter.com/*
// ==/UserScript==

// ここにフィルタリングしたいユーザーのIDを''で囲い、,で区切って記述して下さい
var blackListArray = ['carejinzaibank', 'ptotjinzaibank', 'nursejinzaibank'];

var blackList = new RegExp('^(?:' + blackListArray.join('|') + ')$', 'g');

// AutoPagerizeで増えた分ではない、1ページ目のフィルタリング
    filter(document);

// AutoPagerizeにfilterをイベントとして追加
// 要AutoPagerize(version 0.40 以降)、jAutoPagerize(Rev: 33889+ 以降)
// 参考URL: http://d.hatena.ne.jp/os0x/20090829/1251556449
document.body.addEventListener('AutoPagerize_DOMNodeInserted',function(evt){
    var node = evt.target;
    filter(node);
}, false);

function filter(node) {
    if(document.URL.match(/^http:\/\/togetter\.com\/li\/\d+/)) {
        filterTweets(node);
    } else {
        filterLists(node);
    }
}

function filterTweets(node) {
    //各まとめページの発言をフィルタリング
    var items = document.querySelectorAll(
        'div.list_body > div.status > a[href^="http://twitter.com"]'
        );
    for (var i = 0; i < items.length; i++) {
        var thisLink = items[i];
        if(thisLink.innerHTML.match(blackList)) {
            gone(thisLink);
        }
    }

    // コメント欄をフィルタリング
    var items = document.querySelectorAll(
        'div.status > a.twttrname'
        );

    for (var i = 0; i < items.length; i++) {
        var thisLink = items[i];
        if(thisLink.innerHTML.match(blackList)) {
            gone(thisLink);
        }
    }
}

function filterLists(node) {
    var items = document.querySelectorAll(
        'div.info_infomation > a.icon_author'
        );
    for (var i = 0; i < items.length; i++) {
        var thisLink = items[i];
        if(thisLink.innerHTML.match(blackList)) {
            gone(thisLink);
        }
    }
}

function gone(item){
    //display = 'none'にしてフィルタリング
    // item.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
    item.parentNode.parentNode.parentNode.parentNode.style.opacity = 0.1;
}

追記

https://gist.github.com/807644 にでforkリファクタリング版があります

トラックバック - http://subtech.g.hatena.ne.jp/otsune/20110202

2010-10-22

Google AJAX Language APIを使って翻訳(WebService::Simple版)

Google AJAX Language APIを使って翻訳(WebService::Simple版) - otsune's SnakeOil  を含むブックマーク はてなブックマーク - Google AJAX Language APIを使って翻訳(WebService::Simple版) - otsune's SnakeOil  Google AJAX Language APIを使って翻訳(WebService::Simple版) - otsune's SnakeOil  のブックマークコメント

http://perl.g.hatena.ne.jp/ishiduca/20101020/1287575268 を見て。

WebService::Simpleで書いてみた。

#!/usr/bin/perl 
use strict;
use warnings;

use WebService::Simple;
use Encode;

my $text = join " ", @ARGV;

my $googletrans = WebService::Simple->new(
    base_url => 'http://ajax.googleapis.com/ajax/services/', 
    response_parser => 'JSON', 
    params => {v => '1.0', langpair => 'ja|en'}, 
);

my $response = $googletrans->get(
    'language/translate', { q => $text}
);

print encode_utf8($response->parse_response->{responseData}->{translatedText}), "\n";
トラックバック - http://subtech.g.hatena.ne.jp/otsune/20101022