d2
おー、タイトルもその場編集できるー
「日記を書く」をクリックしたとき、タイトルの input 要素までスクロールしてほしい。
おー、タイトルもその場編集できるー
「日記を書く」をクリックしたとき、タイトルの input 要素までスクロールしてほしい。
ここ最近日記を書いていないということは、ここ最近何も考えていないということだと思う。考えようとするときは、文章にするし、文章にするときは、日記にする。日記をふりかえって、書いていないところがあるなら、そこは何も考えていないところだ。
なんだか、どうも、「浮き足立っている」感じがする。落ちつきがない。客観的じゃない。綺麗なことも考えてない。ぜんぜんだめだ。ぜんぜんだめだ、と書いて安心しちゃだめだ。
からまれたら、どうするのがいいんだろう……実際のところ、ネットだから、リアルだから、という差はだんだんなくなっていくし (なぜならネットがリアルの延長にあるから)、誰もがネットを使いはじめると、だんだん、嫌な人、決定的に合わない人とも出会いやすく、からまれやすくなる。今のところ、mixi とか、そういう部分でしか目立たないけれど、増えていく。実際に、そういったところ以外でもいることはいる。(例えば nicovideo なんかでも感じることができる)
徹底的な無視、といっても、SPAM 行為と一緒で、どうしてもすりぬけてくるものがある。そういう人達を、確実にどうにかする方法は、今のところないように思える。からまれたら終わり。いじめと同じだ……
安全なところから、他人を凹ませて、外に出れなくして、喜ぶ人、というのが、一定数いる。なんらかのタイミングで、自分さえ、そうなるかもしれない。気付かないうちに、既になっているかもしれない。素晴しい人は死んでいく。未来を感じない。
一年のまとめ、みたいなのをやろうと思っているけど、なんだか、結局やらないで終わりそうで、まずい。いろいろあったけど、不確定なことが多くて、どうしよもない。
とりあえず 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 ?
啓蒙的な、主張が多い長文書いてる日記/ブログで、本文部分に font-size: 80% のスタイルがあたってると、そういうところになんで気を配らないんだろうと思うなぁ。
あと、何度も書いてるけど「~なんだが。」ってのは、ちゃんとした積み上げがない人が使うと本当にダサい……
どうでもいいけど↓の「jsm メモ」を、用語も何もしらない気持ちで読むとなんか笑ってしまう。
userChrome.js に対して拡張機能にまとめるメリットがいまいちわかってない……
デメリット
あと拡張機能の content とかを content.jar とかに圧縮してるけど、あれのメリットがよくわからない。書きかえにくくなって嫌だ……chrome.manifest も書きかえないといけないし……
なんか小数点以下の扱いに問題ありそう (縮小時だけ)
コンパイル時間はともかく、実行時間が replace による簡単な置換の2倍程度まではやくなった。
COUNT = 500;
var t = "aaaa<%=s.foo%>bbbbb<%=s.bar%>ccc";
var e = EJS(t);
var f = EJS(t, {useWith:true});
var m = {foo:"test", bar:"foobar"};
var b = [
function compile () {
EJS(t);
},
function processing () {
e.run(m);
},
function processing_with_with () {
f.run(m);
},
function replace () {
t.replace(/<%=s\.(\w+)%>/, function (_,a) {
return m[a];
});
}
];
for (var i = 0; i < b.length; i++) {
var fun = b[i];
print(fun.name);
var res = 0;
for (var j = 0; j < COUNT; j++) {
var now = (new Date).getTime();
fun();
res += (new Date).getTime() - now;
}
print(res + "ms / " + (res/COUNT) + "ms");
};Spidermonkey compile 283ms / 0.566ms processing 25ms / 0.05ms processing_with_with 37ms / 0.074ms replace 12ms / 0.024ms Rhino compile 5094ms / 10.188ms processing 500ms / 1ms processing_with_with 670ms / 1.34ms replace 279ms / 0.558ms
ejs.js の高速化より Spidermonkey と Rhino の速度差のほうに驚いた
replace の正規表現に g がついてないから、実際は replace はもうすこし遅いですね
必須拡張機能のうち、自分で書けそうなやつで userChrome.js にできそうなやつは自分で書いたほうがいいですね。バージョンアップで動かなくなったら自分で直せるし (拡張機能になってると直すのめんどい……)、ノウハウたまるし……
だんだんインストールしてる拡張が減っていきます。
last_char = s.charAt(s.length - 1)何が解りにくいって、どの単語が変数でどの単語がプロパティでどの単語がメソッドで…という区別が付かない。
区別がつかなくても読めはするはず? (むしろ、どれがプロパティで……どれがメソッドで……っていうのは定義とか考えるとめんどくさいよなぁ……)
このコードでまず重要なのは、s が何であるか、ということだけだから、そこから読めば疲れないんじゃないかなぁ。
last_char はこの行で代入されているので、この先を読むにあたっては、この行さえ理解できれば、この前でどんな使われかたをされていようが関係ないし、先を読むのに必要なだけなのでとりあえず無視できる。charAt, length は、s のプロパティアクセスなのだから (ドット演算子があるから)、s が何かわかればそれのリファレンスを読めばなにかわかる。このコードだけから推測すれば、charAt がある標準オブジェクトは String しかないので s は String だと思われる (s は String の s だとおもうし、last_char に代入してることからも、s は String だなぁというのが想像できる)
自分がこの行を読むときのプロセスは (かなり冗長にかくと)
脳内スタック多い人はもっと別の読みかたできそうだよあぁ……
XUL で UI つくりたいなぁってちょっと思ったんです。なんかいろいろやったんですがこうしたら一応できた。なんかもっと、スマートな方法がありそうだけど……
function openChromeWindow (xml, opts) {
// create temporary content dir.
var t = IO.getFile("Temp", "content" + Math.random() * 0xffff);
t.createUnique(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0700);
// write manifest
var f = IO.getFile("PrefD", "extensions");
f.append("{1280606b-2510-4fe0-97ef-9b5a22eafe64}"); // userchromejs
f.append("chrome.manifest");
var prev = read(f);
write(f, "content userchromejs file://" + t.path + "/\n");
// write chrome xul
var c = t.clone();
c.append("temp.xul");
c.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0700);
write(c, xml.toXMLString());
// refresh chrome registry
Components.classes["@mozilla.org/chrome/chrome-registry;1"]
.getService(Components.interfaces.nsIChromeRegistry)
.checkForNewChrome();
// open
window[opts.fun || "openDialog"]("chrome://userchromejs/content/temp.xul", opts.name || "temp", opts.opts || "chrome");
// remove temp files and restore original
t.remove(true);
write(f, prev);
// refresh chrome registry
Components.classes["@mozilla.org/chrome/chrome-registry;1"]
.getService(Components.interfaces.nsIChromeRegistry)
.checkForNewChrome();
function read (f) {
var res = "", str, strm = IO.newInputStream(f, "text");
while (str = strm.readString(4096)) res += str;
strm.close();
return res;
}
function write (f, str) {
var strm = IO.newOutputStream(f, "text");
strm.writeString(str);
strm.close();
}
}こんなふうにつかう
default xml namespace = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
openChromeWindow(
<window>
<script type="application/javascript">
const prefs = Components.classes["@mozilla.org/preferences;1"]
.getService(Components.interfaces.nsIPrefBranch);
alert(prefs.getCharPref("browser.startup.homepage"));
</script>
</window>
);
nsIScriptableIO は XPCOM 直接使うよりは遙かにマシだけれど、なんかいまいちだよなぁ……さらにラッパを書きたくなるよ……
こう書きたい
var content = IO.openFile(f, "read text");
// 上と同じ
var content = IO.openFile(f, "read text", function (stream) {
var res = [];
while (str = strm.readString(4096)) res.push(str);
return res.join("");
}); // 自動で close
IO.openFile(f, "write text", "content");
// or
IO.openFile(f, "write text", function (stream) {
stream.writeString("content");
}); // 自動で closeなんであんなインターフェイスなんだろ……
E4X はデフォルトだと pi ノードを無視する。無視してほしくないときは
XML.ignoreProcessingInstructions = false;
する必要がある。でもって、これ true にしようが false にしようが
xml = <?xml-stylesheet href=""?>
<window/>;みたいなのは syntax エラーなので、こうする必要がある。
xml = <> <?xml-stylesheet href=""?> <window/>; </>;