2008/05/30


追記
最新のWeb::Scraperでは"Web::Scraper::user_agent"でユーザエージェントが変更出来る様になっています。

昨日書いたエントリ「WWW::MechanizeとXPathでtwitterのfriendsを全部取ってみる」のはてなブックマークでotsune氏から
「Web::Scraper/eg/twitter-friends.pl」
というコメントを貰いました。
ただ、この「Web::Scraper/eg/twitter-friends.pl」は、アンカーのrel属性でcontactとなっている物を並べており、私のようなfollowerが少ない人ならばいいのですが、多い人だと100人超えてしまいます。
結果、100人以上取得出来ない事になります。

以上、おしまい!...というのもアレなので...

無理やり感たっぷりですが、Web::Scraperを使ってみました。
ログインしないと、friendsが辿れないのでそこはWWW::Mechanizeに任せ、LWP::UserAgentを継承しているのを利用して、Web::Scraperの__uaを置き換えました。(ウホ!無理やり)
何か他に、キレイなやり方ないですかねぇ...

#!/usr/local/bin/perl

use warnings;
use strict;
use WWW::Mechanize;
use Web::Scraper;
use YAML;

my $username = 'your_username';
my $password = 'your_password';

my $m = WWW::Mechanize->new(timeout => 10);
$m->add_header('Accept-Encoding', 'identity');
$m->get('http://twitter.com/login');
$m->submit_form(
    form_number => 1,
    fields    => {
        username_or_email  => $username,
        password           => $password,
    },
    button    => 'commit',
);

undef &Web::Scraper::__ua;
*Web::Scraper::__ua = sub {
    $m;
};
my $twitter = scraper {
    process 'tr.vcard',
        'friends[]' => scraper {
            process 'td strong a', nick => 'TEXT';
            process 'td.thumb img', image => '@src';
            process 'td.thumb img', name => '@alt';
            process 'td strong a', description => '@title';
            process 'td.thumb a', url => '@href';
        };
    result 'friends';
};

my $num_page = 1;
while (1) {
    my $uri  = URI->new("http://twitter.com/friends/?page=$num_page");
    my $friends = $twitter->scrape($uri);
    %$friends or last;
    $num_page++;
    warn Dump $friends;
}
Posted at by




全然難しくない話
filtered feed for coderepos
CodeReposフィードにはcategoryにshare配下のパスが埋め込まれている様なので、これをマッチングに使ってるだけです。
"Search Text"には"lang/javascript"とか"lang/python"とか入力します。
これで"lang/javascript"以下だけ欲しい人とか、"lang/perl"以下だけ欲しい人とか、"poem"だけ欲しい人とかがウォッチしやすくなるのかな? ちなみに正規表現でやるまでもなかいかな...と思って単純マッチングにしてあります。正規表現がお好み人はcloneして変更して下さい。
Pipes: Filtered Feed for CodeRepos
Posted at by



2008/05/28


「はてなスター」の置かれている位置によっては思いっきり誤爆してしまうhatenaStar.jsですが、皆さんのご不満を軽減すべく誤爆確認機能をつけました。これまで :hatenastar 1 としていた場面で :hatenastar 1? とすると、つけようとしている「はてなスター」がブリンクします。
点灯している「はてなスター」を見て、「あぁ、あそこに付けるんだな」と思って頂ければと思います。
あとは安心して":↑<bs>"でコマンドヒストリを出してバックスペースで"?"を消し :hatenastar 1 と実行して下さい。
hatenaStar.js
Posted at by



2008/05/27


追記
検索順位が変ってしまったようです。

おそらくこれ、Technoratiがやりたかった事のはず。

- Yahoo! Search Results
http://www.yr-bcn.es/demos/microsearch/

microsearch [Wiki]

Using microformats

We support two kinds of microformats: hCard and hCalendar. hCard is used to add personal information to your webpage, hCalendar is used to add events. You can use the hCard creator and the hCalendar creator to create the code that you will need to insert into your webpage.

http://www.yr-bcn.es/dokuwiki/doku.php?id=microsearch#using_microformats
1段目の引用部にあるリンクで、「mattn」と検索してみて下さい。おそらく10秒から20秒程かかりますが検索結果が現れるかと思います。他の検索サービスと違う事に気付いた方、すばらしい。
そう、microformatsを使ってるのです。このサイト「Big Sky」に埋め込まれたmicroformatsの内、「hCard」と呼ばれる物(ここでは「Osaka, Japan」)を使用して地図上の大阪付近に「mattn」とプロットしているのです。
microsearch
2段目の引用部

Using microformats

hCardとhCalendarという、2種類のmicroformatsをサポートしています: hCardとは、貴方のウェブページに個人情報を加えるのに用いられ、hCalendarはイベントを加えるのに使用されます。 これらをウェブページに追加するには挿入するにはhCard CreatorFOAF-a-matic -- Describe yourself in RDFを使う事でコードを生成出来ます。

から、Yahooもmicroformatsに何かしらの期待を持っている事が伺えます。いずれ検索メタデータとして扱っていこうという事でしょうか。
リンク先には、今後GRDDLへの対応も予定されているので、ちょっとYahooが面白い事をやってくれそうな気がしてきました。
Posted at by



2008/05/26


以前、「Big Sky :: 意外と知られていないvimのtips(calendar.vimの日記機能をGoogle Calendarと同期させる)」という記事を書いたのですが、どうやらこれを完成品にまで作り上げてくれた人が居るようです。
見たところ、私のソースを流用されてはいなさそうですが仕組みは似通っています。
diaryvgc - Google Code

Synchronism Python Script between VIM Calendar diary and Google Calendar .

DiaryVGC == Diary Vim Google Calendar

http://code.google.com/p/diaryvgc/
私の場合はファイルの存在や更新時刻で動作しますが、こちらはログファイルを使った全て。また私の様に「--- Google Calendar ---」という文字列で対象ファイルを絞ったり、イベント期間を設定出来たりはしません。
私の場合は「--- Google Calendar ---」という文言を見付けて、それだけを対象ファイルとしていますが、こちらはログファイルを使った全て。
ただ、中国の方のようでコード内にcp936やらgb2312といったエンコーディング名がちらほら。
適当にpatch当てて、動くまでは確認しました。
Index: diaryvgc.py
===================================================================
--- diaryvgc.py (revision 4)
+++ diaryvgc.py (working copy)
@@ -257,15 +257,15 @@
                             if sys.platform[:3] == 'win':
                                 try:
                                     diaryinfo = open(tfile).read()
-                                    info_done = unicode(diaryinfo,'cp936')
+                                    info_done = unicode(diaryinfo,'mbcs')
                                     #print "=============win===UTF8=============="+tfile
                                 except Exception,ex:
-                                    diaryinfo = codecs.open(tfile,'r','gb2312').read()
+                                    diaryinfo = codecs.open(tfile,'r','mbcs').read()
                                     info_done = diaryinfo.encode("utf-8")
                                     #print "============win====GB2312=============="+tfile
                             else:
                                 try:
-                                    diaryinfo = codecs.open(tfile,'r','gb2312').read()
+                                    diaryinfo = codecs.open(tfile,'r','mbcs').read()
                                     info_done = diaryinfo.encode("utf-8")
                                     #print "=============notwin===GB2312=============="+tfile
                                 except Exception,ex:

使い方は
diaryvgc.py --user your-gmail-id --pw your-pass-word --dir /path/to/vim/diary で更新です。
追記
よくみたら場所で「China」がデフォルトになってますね。
使う人は適当に「Japan」とかに書き換えるのが良いかと...

自分が作った物が何かしらの形で流用されるってのは、うれしいですね。
Posted at by




先日、Open Tech Pressの連載コラム「Vimマスターへの道」の中に「Vim/gVimをユーザフレンドリなエディタに変えるCream」という記事を見つけました。
Creamは以前から知っており、Creamの作者から「calendar.vim」の取り込み可否を尋ねられた事があります。現在は少し古いバージョンがCreamにバンドルされています。
上記本文中に、「...例えばカレンダ機能を追加するCalendarプラグインが使えないと自分は生きていけないと語っていた者と何回か出会ったことがある。」の文言を見つけた時には正直嬉しかったです。
ただ、Calendarに付属している日記機能は現状メモ書き用途にしか使えず、現状のCalendarは単なるカレンダでしかありません。何かとリンクする訳でもなく、このデータを使ってvimと連携する事もありません。しいて言うならば日記ファイルがあるとcalendar.vimで日付が点灯するくらいです。

vim_calendar1

今日は、あまりvimと関係しないかも知れませんが、このcalendar.vimとGoogle Calendarのスケジュールを同期するプログラムをご紹介したいと思います。
Google Calendarは、Googleが無償で提供するカレンダアプリケーションです。
携帯からも使用でき、ホビーユーザからヘビーユーザまで満足出来るアプリケーションです。
Google CalendarにはAPIが公開されており、Googleのアカウントをお持ちで開発経験のある方ならば自前のアプリケーションからGoogle Calendarに対してアクセスする事が出来ます。
今回はPythonを使用しますのでgdata-python-clientから「gdata.py-1.0.5.tar.gz」をダウンロードしました。
calendar.vimでは、ホームディレクトリに置かれた「diary」というディレクトリ(変更可能)から年月日をそれぞれディレクトリに分割した構成で拡張子「.cal」のファイルを管理します。
この「.cal」ファイルにGoogle Calendarのスケジュールを取得し、書き込みたいと思います。
gdata-python-clientでは、Googleアプリケーションのデータストレージ(gdata)に対する認証からカレンダへのアクセスまで行ってくれます。
認証は以下の手順で行います。
cal_client = gdata.calendar.service.CalendarService()
cal_client.email = myemail
cal_client.password = mypasswd
cal_client.source = "Google-Calendar_Python_Sample-1.0"
cal_client.ProgrammaticLogin()
これで、GData認証サービスへのトークン取得、認証までが完了しています。
そして以下がカレンダへのアクセスです。今回は当月から3ヶ月分のスケジュールを取得しています。
today = datetime.date.today()
query = gdata.calendar.service.CalendarEventQuery("default", "private", "full", "")
query.start_min = str(today + relativedelta(day=1))
query.start_max = str(today + relativedelta(months=+3,day=1,days=-1))
feed = cal_client.CalendarQuery(query)
for i, an_event in enumerate(feed.entry):
  for a_when in an_event.when:
    print an_event.title.text, a_when.start_time, a_when.end_time
今回は、横着して月始めと月末の計算に便利な「dateutil」を使用しています。
これで、当月の一日から、2ヵ月後の月末までのイベントオブジェクト(feed)が取得出来ましたので、これをcalendar.vimの日記ファイルとリンクします。
def update_schedule(path, an_event, a_when):
    dir = os.path.dirname(path)
    if not os.path.isdir(dir):
        os.makedirs(dir)
    lines = []
    resep = re.compile("^" + schedule_sep + "$")
    has_data = False
    if os.path.isfile(path):
        fp = open(path)
        for line in fp.readlines():
            if resep.search(line):
                has_data = True
            lines.append(line)
    if not has_data:
        lines.append("%s\n" % schedule_sep)
    lines.append("%s - %s\n" % (
        a_when.start_time.replace("-", "/"),
        a_when.end_time.replace("-", "/")))
    lines.append("\t%s\n" % an_event.title.text.encode("utf-8", "replace"))
    print "updating schedule of '%s'" % path
    fp = open(path, "w")
    fp.writelines(lines)
    fp.close()
schedule_sepは「--- Google Calendar ---」というセパレータを示し、「.cal」ファイルの下部からデータが開始します。
データは、「開始日付 - 終了日付」の次の行にイベント名をインデントした以下の形式にしています。 --- Google Calendar ---
2007/09/25 - 2007/09/26
    休暇予定
上記update_scheduleでは、セパレータ以降にGoogle Calendarから取得した開始日付、終了日付、タイトルを書き込んでいます。

ただ、このアプリケーションを何度も実行すると同じデータが繰り返し追加される事になりますので、update_scheduleと同様の処理でセパレータ以降をクリアするremove_scheduleを実装し # clean exising schedules
for i, an_event in enumerate(feed.entry):
  for a_when in an_event.when:
    remove_schedule(datetime2diary(a_when.start_time))

# append newer schedules
for i, an_event in enumerate(feed.entry):
  for a_when in an_event.when:
    update_schedule(datetime2diary(a_when.start_time), an_event, a_when)
とする事で毎回データを作り直しています。
これをあとは、プログラム引数からユーザIDとパスワードを貰い、動作するアプリケーションとして仕上げれば以下のようなCalendarの画面が出来上がります。

vim_calendar2

一応、Windows版のPython2.5で検証してますが、おそらく2.4でも動作するかと思います。
このアプリケーションには、まだ更新する機能がありませんが、ぼちぼち暇を見つけて更新して行こうかと思います。

ダウンロード:

Posted at by



2008/05/23


I wrote a plugin which moved the focus along the input fields.
When the web page has multiple <input> or <textarea> fields,
the focus walks the input fields by pressing A-i (or M-i).

http://www.pqrs.org/tekezo/tmp/vimperator/walk-input.js

It seems there was no similar function in the core code, would you merge this?

Regards,
Takayama Fumihiko.
http://www.mozdev.org/pipermail/vimperator/2008-May/001497.html
便利。<M-i>で順に入力フィールドへフォーカスが飛ぶ。
Dotan Cohenから「TABとどう違うの?」って返信への返信通り、"gi"だと届かないフィールドへフォーカスを飛ばすのはTABの押しすぎで指がつる。
使わせて頂く事にしよう。

tekezo++
Posted at by




Perlハブサイトコアメンバーに訊きたい質問 - [51]注目!パソコンの使い方-はてなダイアリー

Perl日本人ユーザーハブサイト(Perl-users.jp - 日本のPerlユーザのためのハブサイト) が立ち上がり、他言語でもユーザーハブサイトができ、挙句の果てにはRailユーザーハブサイトまでできた模様。

これまでいくつものPerlユーザーハブサイトをコピペしてPerlを使ってきた立場から今回のサイトが末永く続くように運営に関わろうとする篤い志の方へその志の大きさを客観的に示してもらえるよう質問を用意しました。プロフィールページがあったら少しはサイトも長く続くかと考えています。

質問の順番も重要でしょうから、追加・改変はご自由に、コピペして100の質問のようにご利用ください。

http://d.hatena.ne.jp/Akira51/20080523/1211500311

  • rubyは好きですか?
  • pythonは好きですか?
  • perl命と言いながらjava-jaに参加してませんか?
  • 織田祐二は好きですか?
  • 今日のパンツは何色ですか?
Posted at by



2008/05/19


lomoさんが言ってた
caramel*vanilla » Twitterユーザーにタグ付けするWebサービスが欲しい
共通点のあるユーザーを効率的に探したい
... 誰かなんとかしてくれませんか?
http://caramel-tea.com/2008/05/twitter_tagging/
を作ってみた。まだ途中でlomoさんが要望してる機能の内
caramel*vanilla » Twitterユーザーにタグ付けするWebサービスが欲しい
  • 誰でも自由にユーザーページを登録できる
  • 誰でも自由にユーザーにタグをつけられる
  • Bookmarkletかなにかで今見ているTwitterのユーザーページを登録する仕組みを作る
  • 既存のタグに対して+-して数をカウントする
  • ユーザーごとの個別ページにはタグクラウドを表示する
  • ユーザーごとの個別ページにはアイコンと最新発言を表示する
  • ユーザーごとの個別ページからFollowできるようにする
  • GreasemonkeyなどでTwitterのユーザーページにもタグクラウドを表示させる
  • ユーザーごとの個別ページにはそのユーザーにタグをつけたユーザーのアイコンを表示させる
  • 付けられたタグが似たユーザーのアイコンを表示させる
  • タグごとのランキングページを生成する
  • ユーザーページとランキングページのRSSを配信する
http://caramel-tea.com/2008/05/twitter_tagging/
までしか出来てない。
まぁとりあえず動いてるんで遊んでやって下さい。
なお、ログインするためにはtwitterでログインしている必要があります。お気を付けて。
「add User」でユーザを追加して、ユーザページにて「add Tags」でタグが追加出来ます。ログイン状態であればユーザページ上のタグにマウスを当てると「+-」が表示されます。
Tagtter - Find twitter's fun on tag cloud!
まだbetaですし、データ構造も変えるかもしれないので、今後変更削除してしまうかもしません。ご了承下さい。

Enjoy!
Posted at by



2008/05/13


これまで本サイトの画像の扱いはblosxomのimagerefという、自作ながらお粗末なプラグインを使っていました。
私としては、記事本文に記述される画像へのパスはサイトのURLとは切り離して考えるべきと思っているので、以下のプラグインを使っています。

imageref
# Bloxsom Plugin:ImageRef
# Author: Yasuhiro Matsumoto
# Version: 0.1

package imageref;
use strict;
my $images_url = "http://mattn.kaoriya.net/images";
sub start {1}
sub story {
    my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;
    $$body_ref =~ s@<!--\s+imageref\s+thumb:([^:\. ]*)(\.\S+)?\s+-->@<a href="$images_url/$1$2" rel="shadowbox"><img src="$images_url/$1-thumb$2" alt="$1" border="0" /></a>@ig;
    $$body_ref =~ s@<!--\s+imageref\s+thumb:([^:]+?):([^:\. ]*)(\.\S+)?\s+-->@<a href="$images_url/$2$3" rel="shadowbox"><img src="$images_url/$2-thumb$3" alt="$1" border="0" /></a>@ig;
    $$body_ref =~ s@<!--\s+imageref\s+([^:\. ]*)(\.\S+)?\s+-->@<img src="$images_url/$1$2" alt="$1" border="0" />@ig;
    $$body_ref =~ s@<!--\s+imageref\s+([^:]+?):([^:\. ]*)(\.\S+)?\s+-->@<img src="$images_url/$2$3" alt="$1" border="0" />@ig;
    1;
}
1;
※今回の修正を含んだソースです。
※少しvimの色付け変ですね...
これを使うと、記事本文に
以下の画像を見てください。<br />
<!-- imageref パンダ:panda.png -->
と書くことで
<img src="http://mattn.kaoriya.net/images/panda.png" alt="パンダ" border="0"/>
というHTMLが出力されます。例えばサイトの引越しや画像格納パスの変更で全ての記事に手直しをする必要が無くなる訳です。

また、このプラグインでは 以下の画像を見てください。<br />
<!-- imageref thumb:パンダ:panda.png -->
と書く事で <a href="http://mattn.kaoriya.net/images/panda.png"><img src="http://mattn.kaoriya.net/images/panda-thumb.png" alt="パンダ" border="0"/></a>
と変換してくれる為、使い手側は「panda.png」とサムネイル画像「panda-thumb.png」を用意しておけばいい事になります。
実際は、「panda.png」から「panda-thumb.png」への画像変換は手作業で convert panda.png -resize 300x200 panda-thumb.png
※convertはImageMagick付属コマンド
とやってるのですが、ここも本当はオートメーション化したいと思っています。

で、今回はこのプラグインを紹介したかったのではなく、jQueryでサムネイル画像から実画像への表示をビジュアルに表現してくれる「Shadowbox」というプラグインを導入しました。
mjijackson » Shadowbox 1.0 released
なぜ導入に至ったかというと、このimagerefプラグインを少し修正すれば簡単にShadowboxが使えるのでは無いかと思ったからです。
Shadowboxを使うためには、jqueryのロードは必要になります。そして初期化処理として <script type="text/javascript"><!--
$(document).ready(function() {
    Shadowbox.init();
});
--></script>
というコードを書き、あとは
<a src="xxx-big.jpg">
  <img src="xxx-small.jpg"/>
</a>
となっている部分に「rel="shadowbox"」を足して
<a src="xxx-big.jpg" rel="shadowbox">
  <img src="xxx-small.jpg"/>
</a>
とすれば良し。
class属性ではなく、rel属性を使っているので少し気味が悪い気もしますがそんなの気にしない。

今回はこれをimagerefが勝手に出力してくれる様に修正したまでです。

これでいつも通りにimagerefを使えば
<blockquote>
    <!-- imageref thumb:giraffe-photo.jpg -->
</blockquote>

キリン
となる訳です。
ちなみにこのShadowbox、画像だけでなく
twtter - mattn
といったインラインHTMLやFlash、動画もサポートしている様です。結構手軽に導入出来る割に得られる効果が大きいかもしれません。
一度使って見られてはどうでしょうか?

関連記事
MOONGIFT: » クールに表示「Shadowbox.js」:オープンソースを毎日紹介

追記
shadowboxやめてjquery.lightbox(balupton edition)にしました。
Posted at by




そろそろNabeAtzzにも飽きてきたので、エドはるみグリモン作ってみた。
Firefoxで閲覧中に現れる「ing」とか「グ」に反応してエドはるみが登場します。 Googleでsomethingとか検索してしまったら鬱陶しい事間違いありません。
edo-good
動作画面はこのような画面になります。
good-goo-goo-goo-good.user.js
ぜひご活用下さい。
Posted at by



2008/05/11


twitterを辞めてwassrに移ってしまった皆様、常にwassrだけ常駐されておられる皆様、こんにちわ。
vimperatorでtwitter出来るvimperator plugin「twitter.js」を改造してwassr出来る「wassr.js」を作ってみたよ。
機能としては
  • ステータス更新
  • ステータス参照
  • TODO管理
  • 足跡参照
が出来ます。まずステータス参照は「twitter.js」と同じく :wassr
ステータス更新は :wassr wassrかわいいよwassr
TODOは :wassr -todo
で一覧表示 :wassr -todo+ かめはめ波を発射する
でTODO追加。
追加後のID一覧が表示されます :wassr -todo- XXXXXXX
で削除。
XXXXXXXはTODOのID :wassr -todo* XXXXXXX
で開始 :wassr -todo/ XXXXXXX
で停止 :wassr -todo! XXXXXXX
で完了となります。TODOのIDは補完が効くので<tab>で選んで下さい。
また :wassr -footmark
で足跡の一覧も見れます。
オプションは :wassr<tab> で候補が出ます。
よろしければどぞ。
wassr.js

wassrかわいいよwassr
Posted at by



2008/05/09


元々はきゃーさん所で知った「小粋空間: サイドメニュー折りたたみの動作遅延対処」をパクってやってたんですが、良く考えたらこのサイトってjQuery使ってたなぁ...と
$.each({
    tags : true,
    category : true,
    archives : true,
    comments : false,
    trackbacks : false
}, function(i) {
    var f = $('#' + i + 'name');
    f.click(function() {
        $('span', this).html(($('#' + i + 'list').css('display') != 'none') ? '▼' : '▲');
        $('#' + i + 'list').toggle('fast');
    }).css('cursor', 'pointer').append('<span>▲</span>');
    if (this == true) f.click();
});
すんなり少量のコードになりました。jQuery++
Posted at by




twitter検索しまくり - noreplyのブログ
twitter_viewで,fとかすると今表示されてるステータスをfav
http://d.hatena.ne.jp/noreply/20080503/1209785708
twitter_viewってtwitteViewer.jsの事だったんだろうかと悩み中...
Posted at by



2008/05/02


以前、「Big Sky :: 意外と知られていないvimのtips(vimでソースコードをHTML化するコツ)」という記事を書いて、なかなか好評だったのですが(前のサーバで公開した記事なので反響は見えませんが)、vimでHTMLを編集しておられる方って結構多いと感じました。
私もしかり、このブログにおいても全てvimで編集しています。
ソースコードは上記リンクに記した通り「:TOhtml」を使い、その他はほぼ全て打ち込んでいます。ただ別のサイトにある記事やリンクを引用する場合、少し手間が発生します。例えば
<a href="http://example.com">サンプル</a>
とタイプする場合、ブラウザのアドレスバーからURLを、さらにブックマーク画面を出してタイトルをコピーして上の様な記述に置き換えるとなるとキーボードだけで操作出来なかったりして少し煩わしい感じがしますね。オーサリングツールやmarkdown等で楽する事も出来ますがちょっとした更新で、しかもvimが使いたいなんて場合もありますよね。
また、ブラウザは起動していないけどURLならもう知ってるなんて場合、タイトル抜き出すのが大変なんて思っていませんか?
今日は私が使っているvimスクリプトを紹介してみます。
まずソース let g:Anchorize_Format = '<a href="%s" class="external" target="_blank">%s</a>'
function! Anchorize_TITLE(url)
  silent! split _FETCHTITLE_
  silent! exec "0r!curl -s ".a:url
  if executable('nkf')
    if &enc == 'utf-8'
      silent! %!nkf -X8
    elseif &enc == 'cp932'
      silent! %!nkf -Xs
    endif
  endif
  silent! %join!
  silent! %g/^\s*$/d _
  silent! %s/^.\{-}<title[^>]*>\([^<]\+\)<\/title>.*/\1/i
  let ret = getline('.')
  silent! bw!
  if exists('Anchorize_Format')
    let format = Anchorize_Format
  else
    let format = '<a href="%s">%s</a>'
  endif
  return printf(format, a:url, ret)
endfunction
function! Anchorize_URL(v)
  let url = input('URL:')
  if len(url)
    if exists('Anchorize_Format')
      let format = Anchorize_Format
    else
      let format = '<a href="%s">%s</a>'
    endif
    if a:v
      silent! normal! gvs
      let word = getreg('"')
      exec "normal! a".printf(format, url, word)
    else
      let word = expand('<cword>')
      exec "normal! ciw".printf(format, url, word)
    endif
  endif
endfunction
nnoremap <leader>,u :call Anchorize_URL(0)<cr>
vnoremap <leader>,u :<c-w>call Anchorize_URL(1)<cr>
vnoremap <leader>,U s<c-r>=Anchorize_TITLE(getreg('"'))<cr><esc>
これをanchorize.vimとかでpluginディレクトリに放り込むとインストール完了。
使い方は、まず 今日もGoogleで検索 の「Google」という部分を「http://www.google.co.jp/」へのリンクにしたい場合には「Google」の部分までカーソルを移動して <leader>,u 「<leader>」は何も設定していなければ「¥」になっているかと思います。
とタイプすると URL: というプロンプトが出るのでここに URL:http://www.google.co.jp/ とタイプしてENTERを押すと 今日も<a href="http://www.google.co.jp/">Google</a>で検索
と変換されます。また空白を含んだ、例えば「Google Search」の様な場合「Google Search」をビジュアル選択して「<leader>,u」とすれば同じ動作になります。
さらに例えば 今日もhttp://b.hatena.ne.jp/でホットエントリ というテキストのURL部分をビジュアル選択し、今度は <leader>,U 「U」は大文字
とタイプすると 今日も<a href="http://b.hatena.ne.jp/">はてなブックマーク - ソーシャルブックマーク</a>でホットエントリ
と変換してくれます。
急いでネタ記事をアップしたいvimmerには重宝するのではないかと思います。なお、動作にはnkfというフィルタコマンドが必要です。Windowsであれば「nkf win32」あたりで検索すればヒットするかと思います。ちなみに、vimrc等でAnchorize_Formatという変数を let g:Anchorize_Format = '<a href="%s" class="external" target="_blank">%s</a>'
等といった感じに編集する事も出来るので、class属性を常に付けたい人にも使えるかと思います。
元々公開するつもりも無かったスクリプトなので、拡張性ありませんがよろしければどうぞ。
Posted at by




vimperator otsuneさんが以前、「Firefox 3.0b5とvimperator0.6とAutoPagerizeとLDRizeとMinibufferとldr_cooperation.jsを組み合わせると快適過ぎる - otsune's SnakeOil - subtech」で紹介していたvimperator、もうインストールしてしまった人はいるだろうか。
まだインストールしていない人は、今後vimperaorでウェブブラウジングが実際にどの様に変っていくかが知りたいかと思います。
Firefoxをvimぽくする拡張、vimperatorを入れると、まさしくFirefoxがvimぽくなる。このぽくが重要。vimのままを期待している人は拍子抜けするかもしれない。でも、キーボードしか触りたくないユーザにとってvimperatorは心地よい操作感を与えてくれると思います。
一般的な使い方は「ナレッジエース - Firefoxをキーボード操作できるプラグイン「Vimperator」の使い方」が参考になるかと思います。
ここでは通常のウェブブラウジング以外の操作がどの様に変るかをご紹介したいと思います。
例えば通常以外の操作を以下の様に大別してみます。
  • Googleでの検索
  • ソーシャルブックマークへポスト
  • twitter
  • はてなスター

Googleでの検索

vimperatorではテキスト選択もキーボードで行う。「i」を押してキャレットが表示されるので「hjkl」で移動したり「0」や「$」で行頭や行末に、「gg」や「G」でページの先頭やページの末尾に移動する。選択したくなったら「v」を押して選択モードに移り、同じく「hjkl」等で移動後「y」でyank(コピーの意味)出来ます。 さらに単語を検索もキーボードで。例えば上のGoogle検索結果で「firefox」を検索するならば /firefox<ENTER> と入力します。「firefox」という単語がハイライトされvimの様に「n」で次の検索単語へジャンプ出来る。リンクの上までジャンプし「ENTER」を押すとリンク先にもジャンプ出来ます。
そして肝心な検索ですが、vimperatorには既に数多くのpluginが作られており、その中の一つに「googlesuggest.js」があります。
この「googlesuggest.js」を使えば先ほどyankした単語を簡単に検索出来ます。
:google <s-insert><ENTER> 「<s-insert>」はSHIFTを押しながら「INSERT」キー。「<c-v>」(CTRLを押しながらvでもok) とすればGoogleの検索結果が出来ます。ただ、そこまでしなくても「googlesuggest.js」を使えば :google fire<tab> とすれば :google firefox と補完してくれます。
「googlesuggest.js」はcodereposからダウンロード出来るので「~/.vimperator/plugin」(Windowsなら「%USERPROFILE%¥vimperator¥plugin¥」)にコピーすれば完了(ブラウザ再起動「:restart」が必要)。

ソーシャルブックマークへのポスト

これもvimperator pluginで行う。使うのは「direct_bookmark.js」でインストール方法は「googlesuggest.js」と同じ。
ブックマークしたいページを見付けたら :sbm タグやコメントを付けたいならば「はてな方式」で :sbm [vimperator]それvimperatorで出来るよ といった感じに。現状既に「はてなブックマーク」、「del.icio.us」、「livedoor clip」に対応しています。タグは補完が可能でサーバからタグ一覧を再取得するには
:btags さらにブックマークエントリページに行きたいならば :bentry 「:bentry h」で「はてなブックマーク」に...といった感じ

twitter

twitterは「twitter.js」を使う。
:twitter とすればfollowerのステータスが表示されます。
vimperator-twitter
ステータスを更新したければ :twitter 声が小さい!おいっす! とでもすればいい。

はてなスター

「hatenaStar.js」を使う。使い方は :hatenastar 現状豪快仕様プラグインでページ内の全ての「はてなスター」をクリックする為、「はてなスター」がいっぱい付いたページで実行するとエライ事になるので注意。
既にid:retletさんがやってしまってますが...
一応、何番目の「はてなスター」かを引数でも指定出来るので :hatenastar 1 とかしとくとブラウザが爆発する心配もありません。

その他、色んなvimperator pluginがあるので興味ある方は試してみてはどうでしょうか。
coderepos にあるvimperator plugin
また「ldr_cooperation.js」を使えばgreasemonkeyのminibufferと共存する事も出来るので、キーボードだけでブラウザを操作したい人には「ウマー」な環境が出来上がるかと思います。

Firefox 3のリリース時に、「えっvimperatorで出来ないの?」なんて事にならない様、vimperator plugin開発者の皆様、頑張っていきましょう。
Posted at by



2008/05/01


幾らかのサーバにしか対応出来ていませんが、とりあえずリリース。
現在
  • はてなダイアリー
  • はてなグループダイアリー
  • ライブドアブログ
  • Seesaa ブログ
  • Nowa
に対応出来ています。入力欄にpermalinkを入力して「Generate RSS」をクリックするとフィードが表示されます。
BeautifulSoupを使っているので、あまり白熱したコメント欄だとサーバが火を噴くかもしれません。
また過激な議論、18才未満に相応しく無いもの等は、強制でフィード出力を停止する場合があります。

CommentRSS
よろしかったら使ってみて下さい。
Posted at by




日頃よりご愛好頂きありがとうございます。まぐれです。
おそらくまもなくランキングから消え去りますので、記念に...
feed-meter-297-20080501
Posted at by