Changes の基準
外部から見える変更 (書くことないときはリファクタリングしてどうなったかだけ) かな
外部から見える変更 (書くことないときはリファクタリングしてどうなったかだけ) かな
http://subtech.g.hatena.ne.jp/cho45/20080102/1199257680 の Perl 版です。最低限うごくようになったところでコミットして #CodeRepos の方々にお世話になりながらリファクタリングをしました (ありがとうございます)。(Path::Class++) コマンドラインツールは Yappo さんが書いてくれました (Yappo++)。
テストとか一通り書いて 0.01 をリリースしました。が既にあれげなところの修正が入ったので 0.02 をリリースしました。
一通り本家 ShipIt の感じもつかめてよかった。MANIFEST の確認を怠っていたら .svn をふくんでリリースしてしまってめっさあせる……
プロトタイプだけ書いて放置していたら PHP 版が先に! はやい!
新年早々、いろいろと気を引き締めなさいと言われているようなことが (直接的ではないけど)、あって、少し緊張する。
http://d.hatena.ne.jp/rubikitch/20080107/rakeargs をみてて、使えるようになったノカーとか思いつつ、このままだとちょっと使えないなぁと思ったので、Rakefile で対応できる範囲でつかいやすくしてみた
def args(hash)
name = hash.keys.first
args = hash[name]
task name, *args
end
desc "foo task"
args :foo => [:bar, :baz]
task :foo do |t,a|
p t.arg_names
p a.bar
p a.baz
end
desc "bar task"
task :bar do |t|
puts "this is bar."
end
# ARGV は Rakefile が実行される時には既に rake 自体への引数は全てとりのぞかれている
Rake.application.top_level_tasks.replace(ARGV.map {|a|
name, vals = *a.split(/@/, 2)
vals ? "#{name}[#{vals}]" : a
})これで
$ rake 'foo[aaa,bbb]' (in /Users/cho45/tmp) [:bar, :baz] "aaa" "bbb" $ rake foo@aaa,bbb (in /Users/cho45/tmp) [:bar, :baz] "aaa" "bbb"
になって、どっちでもいけるようになる。
あと引数の宣言の DSL がめちゃくちゃわかりにくいと思うのでオレオレメソッドを定義してみた (あの DSL で、後ろに書いてあるのが引数だと想像できる人はどれほどいるんだろう……)。先に args の宣言がくるのはちょっとキモいけど、task メソッドうわがきせずやるとこんなもんなのかなぁ。
でもそんなに引数めちゃくちゃとりたいケースってないのかもしれない……
いまさらだけど別に ARGV みなくても top_level_tasks.map! でいいのだった。(最初は ARGV をもっといじくるコードを書いてたなごり)
ref. http://d.hatena.ne.jp/higeorange/20080107/1199710820
String.prototype.repeat = function (n, sep) {
if (n < 1) return "";
return Array(n).join(this + (sep || "")) + this;
};
print("hoge".repeat(-1, '+')); //=> ""
print("hoge".repeat(0, '+')); //=> ""
print("hoge".repeat(1, '+')); //=> "hoge"
print("hoge".repeat(3, '+')); //=> "hoge+hoge+hoge"
print("fuga".repeat(4, '-')); //=> "fuga-fuga-fuga-fuga"
print("foo".repeat(4)); //=> "foofoofoofoo"
Ruby は標準添付の yaml で、Perl は YAML::Syck にします。でもって、Syck のオプションを
$YAML::Syck::ImplicitTyping = 1; $YAML::Syck::SingleQuote = 1;
にするとたぶん互換になるみたいです。ImplicitTyping は POD にも「こうすると互換になるよ」って書いてあるやつです。SingleQuote は 8 進数みたいな文字列 (/0[0-7]+/) をよみかきするときに必要になります。
use strict;
use warnings;
use Data::Dumper;
sub p { print Dumper shift }
use YAML::Syck;
p YAML::Syck::Load(YAML::Syck::Dump({foo=>"0100"}));
p YAML::Syck::Dump({foo=>"0100"});
$VAR1 = {
'foo' => '0100'
};
$VAR1 = '---
foo: 0100
';
$YAML::Syck::ImplicitTyping = 1;
$YAML::Syck::SingleQuote = 1;
p YAML::Syck::Load(YAML::Syck::Dump({foo=>"0100"}));
p YAML::Syck::Dump({foo=>"0100"});
$VAR1 = {
'foo' => '0100'
};
$VAR1 = '---
"foo": \'0100\'
';
$YAML::Syck::ImplicitTyping = 1;
$YAML::Syck::SingleQuote = 0;
p YAML::Syck::Load(YAML::Syck::Dump({foo=>"0100"}));
p YAML::Syck::Dump({foo=>"0100"});
$VAR1 = {
'foo' => 64
};
$VAR1 = '---
foo: 0100
';
use YAML;
p YAML::Load(YAML::Dump({foo=>"0100"}));
p YAML::Dump({foo=>"0100"});
$VAR1 = {
'foo' => '0100'
};
$VAR1 = '---
foo: 0100
';
use YAML::XS;
p YAML::XS::Load(YAML::XS::Dump({foo=>"0100"}));
p YAML::XS::Dump({foo=>"0100"});
$VAR1 = {
'foo' => '0100'
};
$VAR1 = '---
foo: 0100
';Ruby の YAML.load の挙動は YAML::Syck の $YAML::Syck::ImplicitTyping = 1; のときの挙動と一緒です。すなわちクオートしない /0[0-7]+/ は8進数の数値になります。YAML.dump は数値っぽい文字列を自動でクオートします。
require "yaml"
p YAML.load(<<EOS) #=> {"foo"=>64}
---
foo: 0100
EOS
p YAML.load(<<EOS) #=> {"foo"=>"0100"}
---
foo: "0100"
EOS
puts YAML.dump({"foo" => "0100"})
# ---
# foo: "0100"
#
puts YAML.dump({"foo" => "aaa"})
# ---
# foo: aaaaポイントは結局のところ
みたいですね。あと、Perl しか使わない場合でも、$YAML::Syck::ImplicitTyping = 1 で使うときは必ず $YAML::Syck::SingleQuote = 1; も指定しないとデータがこわれてしまうみたいです。
Perl については調べきれてないかもしれないです (Syck 以外でもクオートできるのかな……)。もしかするともっといい方法があったりするのかもしれない……
よびわけにこまったので shipit.rb とよぼう……
をやんないとだけど、ここにこんなふうに書いてる時点でやる気ないよなぁ (今ちょっと svk をつかっていないので、svk 使うようになったらすぐに実装する感)
というかさっきまで全くオリジナルの ShipIt のコードを読んでなかった (Shipit::Step::Twitter だけ先に読んで処理を想像してた) ことに気付いてあわてて読んだ (全部じゃないけど)……アイデアだけでふくらませて考えてた。やばい…… CPAN はオンラインで簡単にソースよめていいなぁ。rubyforge も直接見れるリンクがほしい。
ちなみに shipit.rb で initialize と prepare にわけたのは、initialize っていう名前が Ruby 的に特別な名前なので、あんまり準備をするっていうイメージがないからです。instance_variable_set するなら initialize とわけたのは正解かなぁ (new すると initialize が走ってしまうので instance_variable_set するタイミングがない)
http://coderepos.org/share/changeset/4139
state には対応した。instance_variable_set はちょっと黒い気がしたので (みえないうちにセットされてしまうので)、いまのうちに initialize の仕様を変えることにした。
require "rubygems"
require "mechanize"
require "pit"
config = Pit.get("hatena.ne.jp", :require => {
"username" => "username of hatena",
"password" => "password of hatena",
"diaryurl" => "http://d.hatena.ne.jp/[your id]/"
})
agent = WWW::Mechanize.new
page = agent.get "https://www.hatena.ne.jp/login?backurl=http%3A%2F%2Fd.hatena.ne.jp%2F"
form = page.forms.first
form["name"] = config["username"]
form["password"] = config["password"]
page = agent.submit(form)
raise "Login failed.." unless page.forms.empty?
page = agent.get "http://h.hatena.ne.jp/"
rkm = page.forms.last["rkm"]
page = agent.post config["diaryurl"], {
"rkm" => rkm,
"title" => "test",
"body" => "test test from mechanize",
}
p pageinplace edit の API をたたく。g.hatena もおなじでできる (URL だけかえる)。はてなはサブアカでも更新できるので、スクリプトから更新するときは、専用のサブアカ作ってパスワード設定するほうがすこしだけ安全かも。
RKM ははてな全体で共通みたいなのでてきとうなところからとってきてる。ハイクだと URL にユーザ名が入らなくて手軽っぽい (config に id じゃなくてメールアドレスいれてもいけるとかいう意味で)。
shipit.rb の Step にしようとおもったけど微妙だったのでやめた……(ハイクへの通知だとサブアカでの発言になってしまう)
http://subtech.g.hatena.ne.jp/cho45/20070923/1190498279 というのを書いたけど、もういっこ考えてみた。
javascript:["foobar",0].sort(function(a){alert(a)});void(0);最初に一文字入ってしまうけどそこそこいい感じ。二つまでは任意の引数がわたせる (三つ以上は二回以上よばれる)
javascript:["foo","bar"].sort(function(a,b){alert([a,b])});void(0);二文字以上とかになると普通に s="foobar";(function(){})(s); とかやればいいけどグローバル変数つかうのはなんか気持ち悪いよなぁ。
script 挿入
javascript:["url",0].sort(function(a){document.body.appendChild(s=document.createElement("script"),s.type="text/javascript",s.charset="utf-8",s.src=a)});void(0);javascript:["url",0].sort(function (a) {
document.body.appendChild(
s = document.createElement("script"),
s.type="text/javascript",
s.charset="utf-8",
s.src=a
)
});
void(0);
replace のほうがマシかなぁ。一文字あるだけで違う
Fx3 on Mac のテーマになるらしいやつをちょっとつかってみる ( https://addons.mozilla.org/en-US/firefox/addon/6050 )
けど、縦置きのタブは全く考慮されていないので (そりゃそうだけど) スタイルあてなおした
@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
.tabbrowser-tabs * {
width: 100% !important;
}
.tabs-stack {
width: 10em !important;
padding: 5px 0 0 0 !important;
border-style: solid !important;
border-width: 1px 0 0 0 !important;
border-color: #444 !important;
background:#797979 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH8AAAATCAIAAAA26UVlAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFlJREFUWMPt1MENwEAIA0GSrumXKjjZpIhIx2e3hLHkJzODbjUzks453V1VLyKX9WfGtqSIQH9nAPTX9G3bRn/zfNBfDn300Sf00Sf00Sf00Sf00Sf00ae/fcgdNtGP2RYEAAAAAElFTkSuQmCC") repeat-y top right !important;
}
.treestyletab-splitter {
background: #b3b2b3 !important;
border-style: solid;
border-width: 0 1px 0 0 !important;
border-color: #4e4e4e !important;
}
tab .tab-icon {
margin: 0 0 0 0 !important;
}
tab .tab-text-stack {
padding: 6px 4px 4px !important;
}
tab {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAaCAIAAADqseFyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAANxJREFUKM91kk2yhCAQg3NaWeNKrzEqiPzNUV93AwpjvY8QAlT1KtCz1jOhK3PdZFDTNClak1KsgpIXxJgi78QHe7oz8otvE3LKrNx5E1KFLonuqQPfnP8bi2fIayy6Gb9jEXvScEMMsSl0mYXgA6vgB4f3wTfCbRJwuYt1XUMQpz9HekF/Du507iTE2J1rgq2cwyHAMFa2tZKtZEowh2EZU0MnHPtBokVns10eDuzb/qjQrtg+28DnCZCOcF9i7UvpDp8o9erbdlcNtZXSUj23jkrAsqxLYR1tWf8AJr2Qe2DQNzkAAAAASUVORK5CYII=") repeat-x top left !important;
border: none !important;
padding: 0 0 0 0 !important;
height: 26px !important;
}
tab .tab-image-left {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAaCAIAAADnr5E1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXtJREFUOMt9VO1ygyAQ9GnjpNOaMRM10TdoZvKjMQLKRyp90N4BCpemWU9Y4kLWkyM7/YNyDygD9uHOnuogNjlcmzzH8ABC1E1TH4/Hy+UyilEppZXWCnsdQmWJtKnregSI8W6MjxV+mKUGOOeCi6DT2sAFLfIQUb3b7UC9PogLuzkeqboAc0abdDFDzUR1UaBaShkMaDrnwUnh1p6maXXskQ6J73meMXcubRHJkPj+sVZJ9SKIbztbuWJyIUlLfFtrpwiZdIHTta0F3zFGSsbxUS0Q8Owp/qrh23MhMLjjbjeEXwRRQwYZZ8zd7EnPqPp7ZgMbBsZcLGRwBMaMfJ27uQ+34UUkO7YsIUfwdzdEf+t7bJD6BsdRXVWVr5r+2mP0fSQLJ5UGZYaZ5QKcXr+uEQuP6q5tXa3V588zpM3Xogp16Ws02YNd1/nqhJL7+Hh/227zTb5WvkdUt7B4255a9FPXzeFQ4RmCp8VypuyT86RNiJ+Eb4JzY/MLtC97An2cRbkAAAAASUVORK5CYII=") no-repeat top left !important;
width: 10px !important;
}
tab .tab-image-right {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAaCAIAAAABhlpxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAASVJREFUKBUFwdGRU0cUQMG+0lSZYp2PSQuihE+cyoqVtHpvDt3z/fsPMpjRee7X6/X8fN4/7rfbbf35c5shjcluH8fxeDwfjwfWt/++UYbGnOfxeH7ePz7e399///97XS7DIIPpcr3M5TJzGawCwJBSBCsBgyallLBmZkBgZmZmZmYGSwIABIKVAKCQJKwKAGpv7XaFJQCgbAKsyhAYUSXBSsKQVISE1c5QMNrtXdUOK2lGKClVCUsoKFOVIli7DQAVaScsxSSGLWpHYRUCGVVRBWu3jWmQtmqn3cYSSRC7qAQrQQykShLW29c3xIg5zuN6Xeo4Dqyfv35iBuRsn6/j+fm83x9Yb2//mgQzzt3r9Xm5Xpnb7ba+fPkHAPbelxk5zxN/Ab8bI0CpEO7fAAAAAElFTkSuQmCC") no-repeat top left !important;
width: 10px !important;
}
tab[selected="true"] {
color: #000 !important;
border: none !important;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAaCAIAAADqseFyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUKM9jyMzKTAeCDAhGQQx+uAHD5k2bcaFRuVE5DLndu3bjQnjTWUYGKGkiJVEoBwgYKnEDAAQjv6hLimGWAAAAAElFTkSuQmCC") repeat-x top left !important;
height: 26px !important;
}
tab[selected="true"] .tab-image-left {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAaCAIAAADnr5E1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPpJREFUOMuV1N1uwiAUB3CfcAXcRXspaTLpOGS6FCP1NWYfo0m/aPHlZEuNaaru8A9w9Qs5J+GwOt5iisKfWh++93sAJTLx4bOd9l+2q+M9JtcaQG44j+P47VEmXZxO+qCFEGmann/OVVU1dbNckzbGgFJZltV1Y63t2u6V1nnOOS/L0tOHbqa/drskSdqmfXbrTPsaKGWv6V1/SskY67sepUFKyqjtLUpLr2mgHuyA1YTQcRhxGoAQgtXgdUTc6JCVQBRFzjnk3dLri7tguwzTvkusVkqt1+/YusPeYNj7Dpud5Vz6jpfrpn+/h9nMM0afz3xRhP4n/+cKjYKqgQhXyaIAAAAASUVORK5CYII=") no-repeat top left !important;
width: 10px !important;
}
tab[selected="true"] .tab-image-right {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAaCAIAAAABhlpxAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEFJREFUKM9jSE/PwIMY/PAChs2bNuNBo9Kj0tST3r1rNx5EKKWmQ0EGEMCYUAwEDJWooLy8vLCwMCsrKyEhAagbALBg8EPs/C58AAAAAElFTkSuQmCC") no-repeat top left !important;
width: 10px !important;
}色とか改訂されて使えなくなりそうだ
memo
いまいち使えない感……
XPCOM 叩いたほうがよさそうだ……
Organizer で place: をかきかえても反映されないので、変更したらブックマークをつくりなおす必要があった。
mozStrage たたくしかないのかなぁ。でも自力で open したら壊れそうだ。
Thunderbird のスレッド時のソート法がどうしても気になりだして拡張を入れたりしたのだけど、結局やりたいのは Gmail みたいな表示だったので、だったら Gmail そのまま使えばいいよなぁという話でした。(今までは IMAP 経由) それと、Thunderbird は Fx ほど userChrome.js を使って拡張する気になれないので、Greasemonkey で拡張できるならそのほうが楽かなぁとかいうのもあります。
公式の Gmail Notifier だとマルチアカウントに対応してないので Fx の拡張をいれてみた。Fx3 b2 にも対応してた。