タグ「Toys」による検索結果 67

Search Form

Bookmarklet: deliciousのブックマークページに飛ぶ

javascript:void(location.href="http://delicious.com/url?url="+location.href);

delicious表示

既出かもしれない。

http://delicious.com/help/bookmarkletsに書いてあった。


コメント一覧のJSONはhttp://feeds.delicious.com/v2/json/url?count=100&url=${url}から取得できるみたいだけど書いてない。

counthttp://delicious.com/help/feedsにあるようにデフォルト15で最大値100。

jsonrssにすればRSS 2.0で取得できる。

JSONだとユーザ名が取れないのでRSS 2.0をみたほうが良さげ。

ginc

ginc

Google Ajax Search APIでインクリメンタル検索。

上部の検索ボックスに入力したあと500msで検索します。

IE、Opera9.2では動きません。


まあ、ただインクリメンタル検索を作ってみたかっただけ……

回文作成補助フォーム

Bookmarklet: HTMLエスケープするリンク(+引用)生成

javascript:(function(l,t,s){var h=function(s){return s.replace(/[&<>"']/g,function(m){return ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[m];});},r='<a href="'+h(l)+'">'+h(t)+'</a>'+(s?'<blockquote cite="'+h(l)+'" title="'+h(t)+'"><p>'+h(s).replace(/(\r\n|\r|\n)+/g,'<br>')+'</p></blockquote>':'');prompt(r,r);})(location.href,document.title,String(getSelection()));

makelink


<a href="${url}">${title}</a><blockquote cite="${url}" title="${title}"><p>${selection}</p></blockquote>

こんな感じのHTMLタグを作るブックマークレット(選択範囲が空ならa要素のみ)。

文字数的にもwindow.getSelection的にも多分Firefox限定。

各文字列をHTMLエスケープするところがポイント。

Copy URL+でもできるっぽいけど、なんかもうめんどくさいのでブックマークレットにした。


blockquote要素の内容モデルは

HTML 4.01 Strict
(%block;|SCRIPT)+
HTML 4.01 Transitional
(%flow;)*
HTML 5(ドラフト)
Flow content
XHTML 1.0 Strict
%Block;
XHTML 1.0 Transitional
%Flow;
XHTML 1.1
(Heading | Block | List)*
XHTML 2.0(ドラフト)
(PCDATA | Text | Heading | Structural | List)*

とかいう感じになっているらしいので、p要素つき。

feedgen.appjet.net

http://feedgen.appjet.net/

URLと正規表現からRSS 2.0を作るサービス。


たとえばこのブログなら(フィードあるから意味ないけど)

url
http://mayokara.info/note/
re
<h2 class="entrytitle entry-title"><a[^>]+>([\s\S]+?)</a></h2>\s*<div class="entrybody entry-content">([\s\S]+?)</div>(?=\s*<ul class="entryinfo">)
title
1
description
2

http://feedgen.appjet.net/?url=http%3A%2F%2Fmayokara.info%2Fnote%2F&re=%3Ch2+class%3D%22entrytitle+entry-title%22%3E%3Ca%5B%5E%3E%5D%2B%3E%28%5B%5Cs%5CS%5D%2B%3F%29%3C%2Fa%3E%3C%2Fh2%3E%5Cs%2A%3Cdiv+class%3D%22entrybody+entry-content%22%3E%28%5B%5Cs%5CS%5D%2B%3F%29%3C%2Fdiv%3E%28%3F%3D%5Cs%2A%3Cul+class%3D%22entryinfo%22%3E%29&title=1&description=2

こんな感じ。

改行を含む全ての文字[\s\S]や、最小マッチ*?+?、先読み(?=...)を使うのがコツ。


optionalなパラメータは

  • html要素の(xml:)lang属性
  • title要素
  • meta要素(めんどくさいのでcontent属性が後ろに書かれているもののみ)

から補完します。

charsetも元のHTTPヘッダとmeta要素を調べて、見つかれば送信します。

MIME Typeはapplication/rss+xml。

追記

RRRS - ’ellaneous

頂いたパッチ(とほぼ同等のコード)を適用しました。ありがとうございます。

  • DateLast-Modifiedが送られてこなかったとき、エラーになっていたのを修正
  • title、descriptionの自由度向上
    • 1 hoge 2 fuga 3$1hoge$2fuga$3になる(前後のスペースは除去)

コードはこちら。

http://appjet.com/app/971183202/source

Greasemonkey: tish.user.js

tako3.comからJSONを取得の図

tish.user.js

tinyshell.user.jsを書き換えたもの。

シェルっぽい何か。

注意

  • Minibuffer(+LDRize)との併用不可
    • ショートカットキーが競合
    • &にしようかと思ったけどSHIFT同時押しが使いづらいのでやめた
  • コマンドの移植度が微妙
    • 実装したもの:cat cd clear cut date echo exit expr find go google grep hatena head inspect jot logout ls maketoc open parse printf prompt pwd rm save sed seq settimer sort tac tail tee tr uniq up wc wget xargs
    • seqが自然数でしか使えなかったり、sedがエディタになってなかったり、いろいろ

起動方法など

:ALT+xで起動。

clearコマンドもしくはCTRL+Lでクリア。

TAB2回で候補表示。候補が1つだけのときはTAB1回で補完。

ファイルシステムもどき

$ pwd
http://mayokara.info/note/
$ cat links|head > outfile
$ cat outfile
http://mayokara.info/note/
http://mayokara.info/note/1
http://mayokara.info/note/view/325
http://mayokara.info/note/view/257
http://mayokara.info/note/search/tag/個人的メモ
http://mayokara.info/note/search/tag/JavaScript
http://mayokara.info/
http://mayokara.info/note/view/325
http://mayokara.info/note/view/325#comment
http://mayokara.info/note/view/325#trackback
$ cat feeds
http://mayokara.info/note/rss2
$ cat //h2/a/@href
http://mayokara.info/note/view/325
http://mayokara.info/note/view/324
http://mayokara.info/note/view/323
http://mayokara.info/note/view/322
http://mayokara.info/note/view/321
http://mayokara.info/note/view/320
http://mayokara.info/note/view/319
http://mayokara.info/note/view/318
http://mayokara.info/note/view/317
http://mayokara.info/note/view/316

text,links,images,stext,slinks,simages,feeds,next,prevなどは読み込み専用で、現在のページ/選択範囲に対するさまざまな情報を返す。

スラッシュを含む指定はXPathとみなされる。

書き出したファイルはコマンド履歴とは異なり、そのタブを開いている間しか参照できない。

wget & parse

$ cat feeds
http://mayokara.info/note/rss2
$ cat feeds|wget -i -|parse //item/link
wget: waiting for response... http://mayokara.info/note/rss2
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:38:15 GMT
wget: Server: Apache
wget: Last-Modified: Sat, 23 Aug 2008 11:33:34 GMT
wget: Content-Type: text/xml;charset=UTF-8
wget: Content-Encoding: gzip
wget: Content-Length: 13016
http://mayokara.info/note/view/325
http://mayokara.info/note/view/324
http://mayokara.info/note/view/323
http://mayokara.info/note/view/322
http://mayokara.info/note/view/321
http://mayokara.info/note/view/320
http://mayokara.info/note/view/319
http://mayokara.info/note/view/318
http://mayokara.info/note/view/317
http://mayokara.info/note/view/316
http://mayokara.info/note/view/315
http://mayokara.info/note/view/314
http://mayokara.info/note/view/313
http://mayokara.info/note/view/312
http://mayokara.info/note/view/311

wgetでresponseTextを取得し、parseでXPathを用いて抽出。

wget -i - -l3とすれば、標準入力の3行目を読み込む。

parse -jで入力をJSONとみなし、DOMツリーに変換する。

tako3.comからデータを取得

$ echo http://tako3.com/json/likely/ `pwd`|tr -d " "|wget -i -|parse -j //jsonarray|tee tako3|cat -n
wget: waiting for response... http://tako3.com/json/likely/http://mayokara.info/note/
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:43:25 GMT
wget: Server: Apache
wget: Content-Type: text/plain
wget: Transfer-Encoding: chunked
     1  http://mayokara.info/blog/
     2  http://mayokara.info/
     3  http://d.hatena.ne.jp/mayokara384/
     4  http://mayokara.info/note/
$ open tako3 -l3

現在のロケーションに関する情報をtako3.comから取得する。

番号を振る前のデータをtako3というファイルにtee。

open tako3 -l3で3行目を開く。

echo ...|tr -d " "の代わりにprintf "%s%s" http://tako3.com/json/likely/ `pwd`でも可。

しょぼいカレンダーから直近の番組データを取得

$ wget "http://cal.syoboi.jp/rss.php?titlefmt=$(StTime) $(ChName) $(Title)"|parse //x:item/x:title|head
wget: waiting for response... http://cal.syoboi.jp/rss.php?titlefmt=$(StTime)%20$(ChName)%20$(Title)
wget: HTTP/1.x 200 OK
wget: Date: Sat, 23 Aug 2008 11:44:53 GMT
wget: Server: Apache/2.2.3 (Unix) PHP/5.2.5
wget: X-Powered-By: PHP/5.2.5
wget: Cache-Control: no-cache, must-revalidate
wget: Expires: Mon, 26 Jul 1997 05:00:00 GMT
wget: Content-Type: text/xml; charset=UTF-8
wget: Transfer-Encoding: chunked
08/23 21:00 文化放送(1134) A&G超RADIO SHOW~アニスパ!~
08/23 22:30 TOKYO MX 鉄腕バーディー DECODE
08/23 22:30 キッズステーション NARUTO -ナルト- 疾風伝
08/23 23:00 BS11デジタル 鉄腕バーディー DECODE
08/23 23:00 文化放送(1134) A&Gメディアステーション こむちゃっとカウントダウン
08/23 23:30 BS11デジタル ウルトラヴァイオレット コード044
08/24 00:00 tvk アニメTV
08/24 00:00 BS11デジタル 真ゲッターロボ 世界最後の日
08/24 00:30 tvk 薬師寺涼子の怪奇事件簿
08/24 01:00 tvk 狂乱家族日記

RSS1.0ではデフォルト名前空間があるのでXPathにx:が必要。

Twitterの「フォロー中」にリストされているユーザIDを取得

$ pwd
http://twitter.com/XXXXXX
$ inspect
inspect: 'id("friends")/span[@class="vcard"][1]/a[@class="url"][1]'
$ cat id("friends")//a/@href|cut -d / -f 4
XXXXXX
XXXXXX
XXXXXX
...

inspectでXPathを調べる。左/右クリックで終了。

@href、@srcはAbsolute URLに変換して返される(場当たり的対応)。

外部ファイルによる操作

// ==UserScript==
// @name           dot_tishrc
// @namespace      http://mayokara.info/
// @description    .tishrc
// @include        http://*
// ==/UserScript==

(function(){

var Shell = window.Tish;
if (!Shell) return;

Shell.addAlias('tako3', 'printf "%s%s" http://tako3.com/json/likely/ `pwd`|wget -i -|parse -j //jsonarray|tee tako3|cat -n');

Shell.addCommand("hitori-goto", function(STDIN, ARGV, $0){
    if (ARGV.length > 0) {
        var callback = function(res){
            Shell.println($0 + ": " + res.status + " " + res.statusText);
        };
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://hitori-goto.appspot.com/say",
            data: "comment=" + encodeURIComponent(ARGV.join(" ")),
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            onload: callback,
            onerror: callback,
        });
        Shell.println($0 + ": waiting for response...");
    } else {
        return Shell.exec("wget http://hitori-goto.appspot.com/rss2|parse //item/title", "");
    }
});

})();

エイリアスやコマンドを追加できる。

cd、go/open

cdは引数のURLを開く。go/openは標準入力あるいはファイル内のURLを開く。

googleとかhatenaとか

$ google --code printf
http://www.google.com/codesearch?q=printf
$ hatena id:mayokara384
http://d.hatena.ne.jp/mayokara384/
$ hatena b:id:mayokara384
http://b.hatena.ne.jp/mayokara384/

URLを作って返すだけ。

「ads-display-none」というデータベースをwedataに作った

アイテム - データベース: ads-display-none - wedata

ads-display-none

御察し下さい。


どなたでも自由に編集していただいて構いませんが、データベース名の頭3文字を良くお読みになった上、余計なものが含まれないようお願いします。

ブログパーツや単なるサイドバー、フッターなどは対象外です。

「tinyshell.user.js」更新 & hitori-gotoコマンド

Greasemonkey: tinyshell.user.js - mayokara note

仕様変更しまくりました。

  • 標準入力をコマンド関数の引数に
    • 変数名もそれっぽく変更
    • STDINは文字列
    • ARGVは引数の配列
      • \s+で区切られるので無視したいときはjoinする
      • クオート考慮してない……考慮するように修正済
    • STDOUTは返り値、自動的に文字列にされる
    • throw "error message"で文字列をSTDERRに出力して終了
  • window.TinyShell.printlnを追加
    • 遅延して文字列を出力できるように
  • その他cosmetic changes

hitori-gotoコマンド

こんな感じで拡張できます、という例。

// ==UserScript==
// @name           TinyShell extends
// @namespace      http://mayokara.info/
// @description    add some commands to TinyShell
// @include        http://*
// ==/UserScript==

(function(){

var Shell = window.TinyShell;
if (!Shell) return;

Shell.addCommand("hitori-goto", function(STDIN, ARGV, $0){
    var showStatus = function(response){
        Shell.println($0 + ": " + response.status + " " + response.statusText);
    };
    if (ARGV.length > 0) {
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://hitori-goto.appspot.com/say",
            data: "comment=" + encodeURIComponent(ARGV.join(" ")),
            headers: { "Content-type": "application/x-www-form-urlencoded" },
            onload: showStatus,
            onerror: showStatus,
        });
    } else {
        GM_xmlhttpRequest({
            method: "GET",
            url: "http://hitori-goto.appspot.com/rss2",
            onload: function(response){
                showStatus(response);
                var rss = new XML(response.responseText.replace(/^<\?xml\s.*?\?>/, "")), ary = [];
                for each (var title in rss.channel.item.title) {
                    ary.push(title);
                }
                Shell.println(ary.slice(0,15).join("\n"));
            },
            onerror: showStatus,
        });
    }
    Shell.println($0 + ": waiting for response...");
});

})();
$ hitori-goto test
hitori-goto: waiting for response...
hitori-goto: 200 OK

Greasemonkey: tinyshell.user.js

標準出力を表示の図

tinyshell.user.jsGreasemonkey: tish.user.js - mayokara note

標準出力を書き出せるMinibuffer的な以下略。

Minibufferとの差異

  • 標準出力を表示できる
  • 付属コマンドが違う
  • 補完機能がしょぼい
    • 一応TABを押せば全コマンドから絞り込みをかけた結果が出ます
  • コマンドの返り値が配列ではなく文字列

使用例

中身を読めばわかります。

任意のユーザのはてなダイアリーからはてなブックマークへ移動

$ pwd|sed s/d./b./|go

ページ内検索

$ grep JavaScript

簡易電卓

$ calc sin(1)*cos(1)

searchやhashやサブドメインを削ったりしてくれるParent Directory

$ up

cd

$ cd /note/view/1

URLを指定して新しいタブを開く

$ echo http://hitori-goto.appspot.com/|open

参考にしたもの

Minibuffer – Userscripts.org

追記

イマイチだったところをいろいろ修正。

「hitori-goto」を作った

http://hitori-goto.appspot.com/

Google App Engineで掲示板を作った。

特徴

  • コメントしかいらない
  • 24時間で消える
    • データベースには残るけど、これは犯罪予告とかが億が一あったときのための保険
  • 1min=10px換算でコメントとコメントの間に隙間が空く
    • 元ネタ:blog.8-p.info
    • 最新のコメントがどれくらい前のものなのか、コメントとコメントの間にどれくらいの時間的隔たりがあるのかわかる
  • どうせ誰も書いてくれないだろうから、Twitter代わりにでも使う予定
    • please write anything to this

Python触った感想

  • 正規表現使うだけでimport reとかありえん