2008年 06月 30日

どこにリンクされているのか、それっぽくわかるようにする

	def title(url)
		uri = URI(url)
		@ua.get(uri)

		text = ""
		case
		when uri.fragment
			fragment =  @ua.page.root.at("//*[@name = '#{uri.fragment}']") || @ua.page.root.at("//*[@id = '#{uri.fragment}']")

			text = fragment.inner_text + fragment.following.text + fragment.parent.following.text
		when uri.to_s =~ %r|^http://h.hatena.ne.jp/[^/]+/\d+|
			text = @ua.page.root.at("#main .entries .entry .list-body div.body").inner_text
		else
			text = @ua.page.root.at("//title").inner_text
		end
		text.gsub!(/\s+/, " ")
		text.strip!
		NKF.nkf("-w", text).split(//)[0..30].join
	rescue Exception => e
		@log.debug ["title:", e.inspect]
		""
	end

はてスタ IRC ストリームつかってて、URL だけだとどこにスターついたのかよくわからないので、こういうのをカマして、リンクされた周辺の文字列をひろっています。結構うまいこといきます。@ua は WWW::Mechanize で @log は Logger です。

ハイクを特別扱いしてるのは、はてスタ IRC ストリームのチャンネルで発言するとハイクに投稿されるようになっているため、ちょっと優遇してる感じです。

.zshrc 再編

.zshrc は単体でどっかのサーバに転送してもいいような感じにして、作業環境では ~/.zsh/mine.zshrc を読むようにした。

でもって作業環境ではないホストに入っているときは prompt 変えるようにした。

下が作業環境で、うえはどっかべつのところ。rprompt にホスト名表示させても全く見ないし、プロンプトの形が同じだととても混乱するので大きく変えた。REMOTE ってついてるのは (リモートの作業環境もあるから変だけど)、単純に強調

2008年 06月 29日

re.pl ~/.re.pl/repl.rc

# ~/.re.pl/repl.rc
# vim:set ft=perl:
Devel::REPL::Script->current->_repl->load_plugin($_) for qw/Colors MultiLine::PPI Packages FancyPrompt OutputCache LexEnv/;
Devel::REPL::Script->current->_repl->load_plugin($_) for qw/Completion CompletionDriver::Keywords CompletionDriver::LexEnv/;
Devel::REPL::Script->current->_repl->fancy_prompt(sub {
    my $self = shift;
    sprintf '%03d%s >_<x< ',
        $self->lines_read,
        $self->can('line_depth') ? ':' . $self->line_depth : ''; 
});

なんかでも補完効かないんだよね……

2008年 06月 28日

サイトごとにパスワード変えたい

どうするのがいいかなー

  • マスターパスワード一個は覚える
  • サイトごとに違うパスワードに
  • 出先や、環境が違っても生成できるように
  • サイト一個だけパスワードを変更したい場合にできるように

単純に location.host + master-pass を JS で SHA1 かけるのがお手軽っぽい。けどそれだとサイト一個だけパスワード変更ができない。

  • マスターパスワードを何個か覚えて、サイトごとに全部試す
    • 割と普通の方法
  • サイトごとに追加の文字列をどっかにもっておく
    • どこに置くか

ふつうにマスターパスワードいくつか覚えるのがよさそう。変にがんばってもしかたない。


あと問題点は

  • SHA1 だと長すぎて登録できないサービスがある
Digest::SHA1.hexdigest("")
#=> "da39a3ee5e6b4b0d3255bfef95601890afd80709"

[Digest::SHA1.digest("")].pack("m")
#=> "2jmj7l5rSw0yVb/vlWAYkK/YBwk=\n"

してできるだけ頑張ったあと先頭いくらかかなぁ……

http://svn.coderepos.org/share/lang/javascript/bookmarklets/passon.bookmarklet.js

CodeRepos に置いてみました。SHA1 (光成さん作) も Base64 (弾さん作) もライブラリつかったので頭つかわないで書けた! スバラシス

CodeRepos においておけば出先のときでもまずどこに置いてあるか忘れないし、svn だから変更がトラッキングしやすいしいいかなぁ的な

いくつかのサイトは既にこれつかって変えてみた。

  • prompt でマスターパスワードを入力するのは表示されてしまうのでまずい。
  • ページ内のパスワード入力フォームをそのまま使うように
  • フォーカスされている input の内容をマスターパスワードとして使い、パスワードをつくって input 要素にもどしてる
  • 文字数制限があってダメなときは、でてきた生成ずみパスワードの prompt に数字で文字数を入れると削って入れなおす

生成済みパスワードは人間が即座に覚えられるようなものじゃないので prompt だしてる。

prompt に出すのも録画環境だったりするとやっぱちょっとアレなので、クリップボードに入れるようにしてみた。

パスワードに制限がかかってるサイトは、そんなに多くはないみたいなので個別にブックマークレットに入れておくことにした。

2008年 06月 26日

Test::WWW::Mechanize つかうより mechanize + RSpec のほうが (おれは) 高速で書けるなぁ…… Mechanize のメソッドとか HTTP::Response とかがどうしても覚えられない…… HTTP サーバ介さないぶん早いんだろうけど、最終的には HTTP サーバ経由したテストはするしなぁ……

2008年 06月 24日

IRB でのデモを楽にする

.irbrc にかく

require "rubygems"
require "irb/completion"
require "wirble"

Wirble.init
Wirble.colorize


data  = <<EOS.split(/\n/)
require "future"
class Foo
  def omoi(n)
    sleep n
    n
  end
end
f = Foo.new
f.omoi(1)
f.async.omoi(1); nil
r = f.async.omoi(5); nil
r
r = f.async.omoi(3); nil
r
omois = (1..5).map {|i|
  f.async.omoi(i).async.tap { p [:ok, i] }
}; nil
EOS

Readline.completion_proc = proc {|word|
	if word.empty?
		[ data.shift ]
	else
		IRB::InputCompletor::CompletionProc.call(word)
	end
}
Readline.completion_append_character = ""
Readline.completion_case_fold = true

こんな風にすると、行頭で [TAB] をおして [RET] をくりかえすことでシナリオを喋りながら進行でき、かつ結果がリアルタイムに表示され、必要であれば [TAB] を押さずにコードをはさめるのでライブデモに便利です。

といっても、やっぱライブデモはタイプも含めでデモな感じがするのでちょっと寂しい感じになるのは否めないのですが!

~/sketch

~/tmp/test.* を ~/sketch にうつした。殴り書きのコードをいままで ~/tmp/test.rb とかに書いていたんだけど、~/tmp はやっぱ定期的にさっぱり消したいのでわけた。あと補完しやすいように test っていうファイル名をやめてファイルタイプをファイル名にした。

2008年 06月 23日

Firefox3 + Firebug 1.2.0b3 でハマった

なんかよくわからないんだけど

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
	<head>

		<script type="text/javascript" src="uuu.js"></script>
		<script type="text/javascript" src="test.js"></script>
		<script type="text/javascript" src="foobar.js"></script>
	</head>
	<body>

	</body>
</html>
// uuu.js

typeof(console);

/*
 * typeof(console) を src でよみこんだスクリプトでやるとダメ
 * typeof(window["console"]); もだめ
 *
 */
// test.js
(function() {
	var scripts = document.getElementsByTagName('script');
	var script  = scripts[scripts.length - 1];
	alert(script.src);
})();

こうすると alert で test.js が alert されない。なぜか script.src が undefined になってしまう。Firebug を Disabled にすれば大丈夫。これ困る……

alert(window.__lookupGetter__("console"));

してみると

function () {
    return window.loadFirebugConsole();
}

ってなってる。

console を参照できるかどうか試すコードを書きたいなら

if (
	(
	 typeof(window["__lookupGetter__"]) == "function" &&
	 typeof(window.__lookupGetter__("console")) == "undefined" && typeof(window["console"]) == "undefined"
	) ||
	typeof(window["console"]) == "undefined"
) {
	alert("console is undefined");
}

と書いたほうがいいっぽいなぁ。もちろん Firebug の変更によってまただめになるだろうから、とても adhoc すぎてウンコなんだけど……

はてスタ IRC ストリーム

http://coderepos.org/share/browser/lang/ruby/net-irc/trunk/examples/hatena-star-stream.rb

はてなスターが付き次第 IRC に通知するのをつくりました。

  • ついたURL
  • つけた人
  • 引用コメント (あれば)

が通知されるようになります。

これメモリくいすぎるので書きなおします

外部ファイルハッシュにしてみた。なおったかな

2008年 06月 20日

freenode のアカウントのメタデータ

何かに使えるかもなー

# 現在ログイン中のアカウントにメタデータ追加
/msg NickServ@fn set property <name> <value>

# nick で指定したユーザのメタデータを取得
/msg NickServ@fn taxonomy <nick>

例えば OpenID の claimed_id を登録させるようにして、IRC ログの自動認証とかかなぁ。

  1. (ユーザ) /msg NickServ@fn set property OpenID http://www.lowreal.net/ しておく
  2. (ユーザ) IRC ログのページで nick を宣言する。
  3. (サーバ) taxonomy で、宣言された nick の OpenID claimed_id を取得する
  4. (サーバ/ユーザ) ユーザをその OpenID の URL 使って認証させる (普通に OpenID Auth)
  5. (サーバ) 認証できれば、そのユーザが現在 JOIN しているチャンネルのログが見れる

こんなことするほど IRC log は重要じゃないけど、ほかになんか面白いことできないかなぁ