ふと
userscripts.org をコマンドラインから更新するためのツール user.js みたいなのをつくるとしたら、はたして JS on Rhino と rubygems だとどっちのほうがいいんだろう、とおもった。(gem のほうがいいとおもう)
そういえば、Opera は公式みたいなところに user.js 配布するところあるのかな
埋め込み Rakefile
rake が、あるファイルの、うめこまれた Rakefile を解釈する、みたいな機能をもってると便利だよなぁ
rake -f foo.user.js publish
とかできるようになるとうれしい。
と、まで書いたところで、Rakefile ってただの ruby スクリプトだから工夫したらできるよなと思ってやってみた。
ようは user.js でもあり ruby でもあるコードをかけばいい
// ; <<EOF # Embed Rakefile
// ==UserScript==
// @name Vox Editing with WYSIWYG or HTML alternately
// @namespace http://lowreal.net/
// @include http://www.vox.com/compose*
// ==/UserScript==
ここに JS コード
/*
EOF
# ↑ ここまでヒアドキュメント
# ここに Ruby コード。
# ただし */ は書けないので正規表現リテラルかくときは注意しないといけない
desc "upload to userscripts.org"
task :release do
foo...bar....
end
# ↓ JS のコメントアウトをとじる
# */Ruby では // はコメントではなく正規表現リテラル。ヒアドキュメントで JS コードをスキップさせてる。
もちろん、このままだと DRY じゃなくてダサいので、rubygems とかに userscripts.org を操作するライブラリをあげて (rubyforge みたいな)、それを使うようにたらよさそう。(require "userjs/raketasks" みたいな)
でもこれ壮絶にキモいからやめたほうがいい…… (正気にもどった)
Rakefile にする必要も別にない。なにがやりたかったんだろう……
XHR/GM_xhr でバイナリ (\0 をふくむ) はできない……
\0 があるとそこでとめられてしまう……
無駄になったコードこぺ
function multipart(data) {
var ret = [], boundary = createBoundary();
for (var k in data) if (data.hasOwnProperty(k)) {
var list = data[k];
for (var i = 0; i < list.length; i++) {
var obj = list[i];
if (obj.filename) {
ret.push(
'--' + boundary,
'Content-Disposition: file; name="'+k+'"; filename="'+obj.filename+'"',
'Content-Type: '+obj.contentType,
'',
obj.content
);
} else {
obj = String(obj);
ret.push(
'--' + boundary,
'Content-Disposition: form-data; name="'+k+'"',
'',
obj
);
}
}
}
ret.push('--' + boundary + '--', '');
return {
contentType : "multipart/form-data; boundary=" + boundary,
data: ret.join("\r\n")
};
function createBoundary () {
return "B"+Math.floor(0x1000000 + Math.random() * 0xffffff).toString(16);
}
}
canvas
AS3 と自分との相性がことごとく悪いので canvas でかるくおえかきツールみたいなのをつくってみたけど、うまく実装できないなぁ。undo したいから、直近の数パスは保存しておかないといけない。canvas は直接書いてしまうから (オブジェクトをおいていくわけじゃない)、自分で再描画をコントロールしないといけない。でもって、書きはじめてから生成されたパスを、mousemove ごとに毎回全部再描画すると、割とすぐに重くなって使えない。
toDataURL つかってスナップショットをとりながら描画するようにしてみたけど、なんかこのへんでつかれた。ボタンとか作るのめんどいし、あまりにもクロスブラウザじゃないすぎる……
わりとどうでもいいけど toDataURL って名前おかしくないのかな。Locater じゃないと思う。
なんか toDataURL のよびだしが二回目以降 Security Error になる……
JS: コンテナとしての Object のキーの列挙
常にこう書くことにした。
for (var k in obj) if (obj.hasOwnProperty(k)) {
alert(obj[k]);
}今までは
for (var k in obj) {
if (!obj.hasOwnProperty(k)) continue;
alert(obj[k]);
}とか書いてたけど、! を書くのを忘れて、いったりきたりしてしまうのでめんどかった。
ちなみに
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
alert(obj[k]);
}
}はインデントが増えるから嫌だ。
hasOwnProperty は長いけど、慣れれば (主に autocomplpop.vim のおかげで) 気にならない。
ruby1.8.6
もうほんとどうしよもないところでハマったりするので Mac でも 1.8.6 を常用することにした……
sudo rm -rf /usr/lib/ruby/gems sudo port install ruby exec zsh (パスとおしなおし) wget http://rubyforge.org/frs/download.php/29548/rubygems-1.0.1.tgz tar xzvf rubygems-1.0.1.tgz cd rubygems-1.0.1 sudo ruby setup.rb sudo gem install resh
BridgeSupport の WebKit のところでおわた……
/opt/local/bin/ruby install.rb config --build-universal=yes (in /Users/cho45/project/rubycocoa/src) install.rb: entering config phase... create ext/rubycocoa/extconf.rb create framework/GeneratedConfig.xcconfig create framework/src/objc/Version.h create tests/Makefile ---> framework create /Users/cho45/project/rubycocoa/src/framework/src/objc/osx_ruby.h ... create /Users/cho45/project/rubycocoa/src/framework/src/objc/osx_intern.h ... BSROOT="/Users/cho45/project/rubycocoa/src/framework/bridge-support" CFLAGS="-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" /opt/local/bin/ruby build.rb Generating BridgeSupport metadata for: WebKit ... ./gen_bridge_metadata.rb:1800:in `compile_and_execute_code': Can't compile C code... aborting (RuntimeError) command was: gcc /tmp/src-0-28704.m -o /tmp/bin-0-28704 -F"/System/Library/Frameworks" -framework WebKit -framework Foundation -include /tmp/src-0-28704.h 2>/tmp/log-0-28704 /usr/bin/ld: /System/Library/Frameworks/WebKit.framework/WebKit load command 20 unknown cmd field collect2: ld returned 1 exit status from ./gen_bridge_metadata.rb:1051:in `collect_types_encoding' from ./gen_bridge_metadata.rb:521:in `collect' from build.rb:101 from build.rb:50:in `measure' from build.rb:101 from build.rb:62:in `each' from build.rb:62 config failed hook /Users/cho45/project/rubycocoa/src/framework/post-config.rb failed: 'system BSROOT="/Users/cho45/project/rubycocoa/src/framework/bridge-support" CFLAGS="-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" /opt/local/bin/ruby build.rb' failed try 'ruby install.rb --help' for usage rake aborted! Command failed with status (1): [/opt/local/bin/ruby install.rb config --bu...] /Users/cho45/project/rubycocoa/src/rakefile:26 (See full trace by running task with --trace)
misc/bridgesupport/build.rb で WebKit はずして継続してるけど、Chemr がビルドできなくなりそうだなぁ……どうしたらいいんだろ……Leopard じゃないとだめなのかなぁ……
jsm メモ
- 謎な環境で eval される。
- Component.classes とかはもちろんあるけど、IO はない。alert もない (めんどす)
- Components.utils.import の第二引数を省略すると、現在の名前空間に import される (これどうやってるんだろ)
- ( http://d.hatena.ne.jp/ku0522/20071227/1198720903 )
- 第二引数かかないとこっちが汚染される?
- resource Protocol の setSubstitution に http: を指定して import しようとすると失敗する?
- セキュリティ的な問題?
- 単になんか他の部分でヘマしてる?
- ( http://mxr.mozilla.org/firefox/source/js/src/xpconnect/loader/mozJSComponentLoader.cpp#1409 ローカルファイル決めうち)
- なんか instanceof がうまくいかない
- 謎な環境なせいで prototype のオブジェクトが別になってる?
とりあえず File のユーティリティをちょこっと (名前空間とかまだちゃんと考えてないのでサンプル程度に) 書いてみた。なんかすぐ影響力のでかい人 (海外の) とかが別の作りそうで気がすすまない (無駄になる気がする)
Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.getProtocolHandler("resource")
.QueryInterface(Components.interfaces.nsIResProtocolHandler)
.setSubstitution("coderepos.org", IO.newURI("file:///Users/cho45/coderepos/platform/gecko/jsm/"));
// .setSubstitution("coderepos.org", IO.newURI("http://svn.coderepos.org/share/platform/gecko/jsm/"));
Components.utils.import("resource://coderepos.org/file.jsm");
var file = IO.getFile("Temp", "test.txt")
File.write(file, "foobar");
alert(File.read(file)); //=> foobar
File.open("/tmp/hoge.txt", "write text", function (stream) {
stream.writeString("foobarbaz");
});これテストコードどうやって書けばいいんだ…… MozRepl ?
✖
どうでもいいけど↓の「jsm メモ」を、用語も何もしらない気持ちで読むとなんか笑ってしまう。