- < Newer
- Older >
Bookmarklet: deliciousのブックマークページに飛ぶ
javascript:void(location.href="http://delicious.com/url?url="+location.href);
既出かもしれない。
http://delicious.com/help/bookmarkletsに書いてあった。
コメント一覧のJSONはhttp://feeds.delicious.com/v2/json/url?count=100&url=${url}から取得できるみたいだけど書いてない。
countはhttp://delicious.com/help/feedsにあるようにデフォルト15で最大値100。
jsonをrssにすればRSS 2.0で取得できる。
JSONだとユーザ名が取れないのでRSS 2.0をみたほうが良さげ。
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 ({"&":"&","<":"<",">":">",'"':""","'":"'"})[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()));
<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
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
で
こんな感じ。
改行を含む全ての文字[\s\S]や、最小マッチ*?・+?、先読み(?=...)を使うのがコツ。
optionalなパラメータは
- html要素の(xml:)lang属性
- title要素
- meta要素(めんどくさいのでcontent属性が後ろに書かれているもののみ)
から補完します。
charsetも元のHTTPヘッダとmeta要素を調べて、見つかれば送信します。
MIME Typeはapplication/rss+xml。
追記
頂いたパッチ(とほぼ同等のコード)を適用しました。ありがとうございます。
- Date、Last-Modifiedが送られてこなかったとき、エラーになっていたのを修正
- title、descriptionの自由度向上
- 1 hoge 2 fuga 3が$1hoge$2fuga$3になる(前後のスペースは除去)
コードはこちら。
Greasemonkey: tish.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
御察し下さい。
どなたでも自由に編集していただいて構いませんが、データベース名の頭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
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
参考にしたもの
追記
イマイチだったところをいろいろ修正。
「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とかありえん
- < Newer
- Older >

