Fw: eroga.aurifero.us

エロゲー画像をスライドショーするサイト作った/楽

eroga.aurifero.us

えろげサンプル画像ローダー。18禁。

読み込み待ちのストレスをjQueryアニメーションで軽減というのが良い。


原画スタッフの名前で検索できなかったのがちょっと残念ではあるけど、まあ、それはそれ。

というかDMMのラインナップ、偏ってるなあ。

追記

ブランド・原画家からも検索できるようになっていた。

JavaScript: document.evaluate、nodeValue、デフォルト名前空間

$gを更新した。

それ絡みで気付いたことのメモ。

nodeValueとtextContent

tmp = xp.snapshotItem(i);
ret[i] = tmp.nodeValue || tmp.textContent;

第3引数にtypeofがobjectとなる引数を与えた場合の挙動を改良。


DOM:element.nodeValue - MDC

//a/@hrefのようにしてAttribute Nodeを集めたとき、それらのnodeValueプロパティを参照すると属性値(href属性の値)が得られる。

Element Nodeのときはnullになるので、この場合はtextContentをみる。

$g('//a', document, {})
// -> アンカーテキスト
//    ["mayokara note", "Older >", ...]
$g('//a/@href', document, {})
// -> href属性値
//    ["http://mayokara.info/note/", "http://mayokara.info/note/1", ...]

で、こういうことができる。

ただしa要素のhrefプロパティから取得した場合とは違い、Absolute URIにはならない。

Relative URIで書かれているものは、そのまま。

デフォルト名前空間について

var doc = context.ownerDocument || context, defaultNamespaceURI = (/xml$/).test(doc.contentType) ? doc.documentElement.getAttribute("xmlns") : "";
var resolver = function(prefix){
    return doc.createNSResolver(context).lookupNamespaceURI(prefix) || defaultNamespaceURI;
};

XHTMLのみを対象とするのならhttp://www.w3.org/1999/xhtml決め打ちで良いのだけど、RSS 1.0を(GM_)XMLHttpRequestで取得してDOMParserに食わせたものにXPathを使いたいときはhttp://purl.org/rss/1.0/を返す必要がある。

Atomであればhttp://www.w3.org/2005/Atom

そういうときのための修正。


デフォルトリゾルバは XML 文書のデフォルト名前空間を処理しません。

Introduction to using XPath in JavaScript - MDC # XML 文書のデフォルト名前空間を実装する

createNSResolverはdcやらrdfやらに引っ掛らなかったときにデフォルト名前空間のURIを返さない。nullが返る。

なので、documentElementのxmlns属性を見て、それを返すようにする。

namespaceURIプロパティは、RSS 1.0のようにdocumentElementのnodeNameがrdf:RDFのときxmlns:rdfのURIを返してくるので使えない。


デフォルト名前空間を含め、名前空間の接頭辞は宣言している要素とその子孫で有効ですが、子孫要素で同じ接頭辞(あるいはデフォルト)の名前空間が宣言されると、その内部では新しい宣言によって結びつきが上書きされます。

XML名前空間の簡単な説明 # デフォルト名前空間

厳密にはcontextから(取得されるノードから?)遡って調べなければならないのだけど、手を抜いた。

やるとすれば、contextの兄弟ノードとして適当なノードをinsertして、それのnamespaceURIプロパティを取るのが楽そう。


ついでに、きちんとcreateNSResolverを使うようにした(dc:dateなどのため)。

余録:Firefox2のDOMParser

RSS 1.0を食わせたとき、documentElementの子要素以下のノードが取れない。

Bugzillaにあたってみたけど、探すのに不得手なせいで見つけられなかった。

Firefox3だとちゃんと取れる模様。

JavaScript: appendChild, cloneNode, extractContents, cloneContentsとイベントリスナ

DocumentFragmentとdisplay:none、documentに直接追加する場合の速度比較 - 素人がプログラミングを勉強するブログ

Array.forEach(document.getElementsByTagName("a"), function(v){
    v.addEventListener("mouseover", function(){alert(1);}, false);
});
var df = document.createDocumentFragment();
df.appendChild(document.body);
document.documentElement.appendChild(df);

// (mouseover) -> alert
Array.forEach(document.getElementsByTagName("a"), function(v){
    v.addEventListener("mouseover", function(){alert(1);}, false);
});
var df = document.createDocumentFragment();
df.appendChild(document.body.cloneNode(true));
document.documentElement.replaceChild(df, document.body);

// (mouseover) -> none
Array.forEach(document.getElementsByTagName("a"), function(v){
    v.addEventListener("mouseover", function(){alert(1);}, false);
});
var r = document.createRange();
r.selectNode(document.body);
document.documentElement.appendChild(r.extractContents());

// (mouseover) -> none
Array.forEach(document.getElementsByTagName("a"), function(v){
    v.addEventListener("mouseover", function(){alert(1);}, false);
});
var r = document.createRange();
r.selectNode(document.body);
document.documentElement.replaceChild(r.cloneContents(), document.body);

// (mouseover) -> none

Firefox2(Win)でのみの結果。

Range#extractContentsだとイベントリスナが消えるが、df.appendChildで一旦移して戻すやり方なら消えず、問題なく使えるということらしい。


これは知らなかった。

このやり方と比較してどうこう言っていたわけではないし、Jintrickさんの指摘がこれを指していたとは思わないけど、これを知らなかったために不正確な発言になっていたという点については訂正します。

Re: そういうのも認めるよ

Re: 間違いを指摘 (agenda)

(糞)議論について (agenda)

あなたの勝手な思い込み・勘違いを私の間違いにされては困りますし、迷惑で不愉快です。

Re: 間違いを指摘 - mayokara note

と書いたら

基本、agendaは「不愉快」だから。エンターテイメントじゃないんだし愉快な文章なんて書いていられるか。

(糞)議論について (agenda)

と、ブログ自身あるいは文体について不愉快だと書いたことになっている。

「あなたの勝手な思い込み・勘違いを私の間違いにされては」「困る」「迷惑」「不愉快だ」って書いたんですけど。

別に伝言ゲームじゃないんですけどねえ。


他にも

include *で使う限り何回再描画が行なわれるかは「不明」だ。

「不明」だから「たとえば」と書き、具体的な回数を出したのですが。

何なら「不明なほど多くの回数の修正に対して」と置き換えてもらっても構いませんよ。文意は変わりません。

歓迎しているが、歓迎するというのは、肯定するということではないし、必ず反応するということでもない。そして「聞く耳」というのは、何でもかんでも肯定することではない。

「肯定しろ」とも「必ず反応しろ」とも書いていません。

「聞く耳を持て」と書いただけで「何でもかんでも肯定しろ」なんて一言も言っていません。

というか、言われなくてもわかっています。誰に言っているんですか?

「聞く耳を持て」という言葉の意味がきちんと伝わっているのか疑問です。

そんなカテゴリはない。

『「意見交換、批判等」が正しいカテゴリ名だ』という指摘を、そんな堂々と言われても。

「揚げ足取り」という言葉の意味に合意が取れているのかも疑問です。


わざとやってるんですかね。

冒頭の件のように私が言っていないことを私の瑕疵として非難されるのが「不愉快」と書いたのであって、別に文体だのタイトルの「Re:」だの「agenda」の運営方針だのには一言も触れた覚えはないのですが。

どうも私の答えではなく自分の期待する答えに対して演説しているようですが、そんなものは相手をおいて議論をする以前の問題では?


で、結局元の文章をどう修正すればあなたのような人間にケチをつけられない文章になったんですかね。

「ドキュメントに修正を加えるならば」のくだりは文全体にかかっています(日本語にブレースがないのが残念)。

「修正」の意味に合意が取れていない可能性を考え、その点補足も入れましたし、どんな場合でも代替しうるものではないことも強調しました。

これは『「ビューとの分離」と書いているので~』の点に対する補足のつもりだったんですけどねえ。


リンクについては「無断リンク禁止」と同程度に「無断リンクなし言及禁止」をしょうもないものだと思っているし、「リンクを張る自由」と同じように「あえてリンクを張らない自由」もあるという立場なので、そこを非難されてもという感じ。

  • 一連の流れを正確に追っていないし、口を挟める立場ではない
  • 一部分のみに対する言及で、全体に対するものではない
  • 特にリアクションを求めている記述ではない

から張らなかっただけで。

「俺様に口出しする輩は許さん」ってのならわかります。そう書いてもらえれば。


あと、別記事にして非難たらたらってのもダサくてかっこわるいと思いますよ、私は。

言いたいことはリンクして言えといいながら、一般論に託けてブツクサ言うのは支離滅裂としか思えない。

「曖昧な文章でぼそぼそっと批判されるのは腹立つ」曖昧な文章でぼそぼそっと批判している。

これが、あなたの言う「笑える芸」というやつなんですかね。自虐芸も含むのでしょうか。


私はあなたの勘違いのせいで「読めていない」だの「間違いを指摘」だの「愉快な文章なんて書いていられるか(以下略)」だの言われるのが嫌なだけなんですけどねえ。

どうして言ってもいないことを次から次へと私の不理解にされなければならないのでしょうか。

追記

突っ込まれているのに答えていない箇所があったので追記。

この文章から、1回2回の違いにこだわる点を"「神経質すぎるし、本末転倒」"と書きましたを読み取れということらしい。

Re: 間違いを指摘 (agenda)

文章力がなくてすみませんね。

これは書いた時点では違う意味で、私としては「修正する場面において、bodyの中身を全部入れ替えるようなやり方は~」という意図でした。

じゃあ何で「後出しで」回数を出しているんだという話ですが、これは「間違いの指摘」が「2回よりは1回のほうがいい」だというのを受け、あなたが補足を読んでいるのを前提に、当初の意図に加え「回数を比較することを考えても同じように考えている」と説明するのが指摘に対して求められている回答であると考えたためです。

書いた時点では回数について(認識してはいましたが)重要視していたわけではなく(回数の話をそもそも出していない)、ゆえにあなたが回数を話に出してもそれが私の「間違いの指摘」であるとは判断できませんでした。

なので実際に「修正するという状況においてはbody要素の総入れかえ自体を否定(個人的な印象として本末転倒であると表現)」しています。

で、あなたがスクリプトを持ち出したくだりを見て強調部が伝わっていないものと思い、補足で「破棄するのなら置き換えれば良い」「どんな場合でもというわけではない」と付けたのですが、理解するのが無理というのならそうなのでしょう。


これだけ書けば理解できる文になりますかね。

Re: 間違いを指摘

Re: body要素書き換え (agenda)

間違いを指摘(※)

※body要素書き換え (agenda)の前半ね。詳しく書いたほうが良かったか?

どこが間違いの指摘になっているのかさっぱりわかりませんでした。

詳しく書いたほうがあなたには良かったようなので、詳しく書いておきます。

以下「あなた」はJintrickさんを指します。

説明

  • そもそも「一回の再描画にまとめられない」場合の話をしています
    • 「ドキュメントに修正を加えるならば~」の前置きを読みましたか?
    • 「修正」が単なる操作の意味でないことも書きました
    • 2回より1回のほうが良いのは確かですが、あくまでそれが有効な場合の話です
    • 有効でない場合の話をしています
    • 言い換えれば、イベントハンドラ含むツリーを保持する必要がある場合の話をしています
  • 「再フローが二回起こる」ことは承知の上
    • 「EfficientJavaScript」を示している時点で言うまでもないことだと思っていました
    • あなたに指摘されずともわかっていますし、その前提での話です
    • そこを理解せずに「間違いを指摘」などと言われても困りますし、何故一方的に「読めていない」と判断しているのかがそもそも不明です
    • また、たとえば10~20回の修正に対する、1回2回の違いにこだわる点を「神経質すぎるし、本末転倒」と書きました
  • extractして(1)insertしたら(2)、表示されているDOMツリーの変更は2回となるように思います
    • document.bodyをRange#extractContents
    • 画面が真っ白になるはずです
    • document.body以下のツリーも空になっています
    • 再描画がいつ行なわれるかは別ですが、extractなら再描画は起こらずdisplayなら起こるという挙動は何かで定義されているのでしょうか?
    • この点を考えても、displayスタイルを操作する方法が間違いであるとは思いません
    • 「EfficientJavaScript」での例はcloneNodeしてreplaceChildしているので1回となっています
    • あなたの例とは別物ですし、この方法も「イベントハンドラに依存しているときもこの方法をとるべきでない」とされています
    • 前述したようにイベントハンドラを保持する必要がある場合の話をしているので、この点からもやはり間違いであるとは思いません
    • ちなみに「文書ツリーの変更は, まず再フローにつながる」とも書かれています
  • 例が不適切であると指摘することを揚げ足取りと言われても、元々がその点について言及した記述なので反応しようがありません
    • 本題はタイトルだけですか?
    • 自分の意図しない指摘は全て揚げ足取りですか?
    • 「反論、ちゃちゃ入れは歓迎する」と口では言いながら、聞く耳を持たないのでは話になりません
    • 「意見交換」とのカテゴリで「人格攻撃」を始めるようでも話になりません

まとめ

あなたの勝手な思い込み・勘違いを私の間違いにされては困りますし、迷惑で不愉快です。

Re: body要素書き換え

議論ごっこに興味はないのですが、補足だけ。


body要素書き換え (agenda)

1) コンテンツの構造を全書き換えし、かつ 2) 専用のインターフェイスを作るのに、

body要素書き換え (agenda)

ドキュメントに修正を入れるんであれば、

つれづれ 2008.07.17 - mayokara note

DOMツリーを破棄する前提であれば置き換えれば良いと思いますが、そのケースは私のいう「修正」の意図するところではありません。

文書ツリーを多数回変更するときはDocument Fragmentを経由する (agenda)を読んで、文書ツリーを多数回変更するときは、どんな場合でもDocument Fragmentを使うべきだ、と思い込んでしまった方がいたとしたら申し訳ないことをしたし、配慮が足りていなかったと思う。

Re: 僕があまりDocumentFragmentを使っていない理由 (agenda)

とあるのと同じように、どんな場合でもDocument Fragmentを避けるべきだとは言っていません。あくまで

この事例でDocument Fragmentを経由する

文書ツリーを多数回変更するときはDocument Fragmentを経由する (agenda)

やり方を好まないと言っただけです。


やたらそこに拘るのは何なんだろう。

body要素書き換え (agenda)

適切でない例だからではないでしょうか。

「tinyshell.user.js」更新 その3

Greasemonkey: tinyshell.user.js - mayokara note

  • 補完機能の改良
    • 候補が一つだけのとき続けてTABで補完
  • xargs実装
    • 対応オプション:-0
  • find実装
    • 対応オプション:-type -name -path -print0 (-print)
  • wc実装
    • 対応オプション:-c --bytes -m --chars -l --lines -L --max-line-length -w --words
  • maketoc実装
  • content、selected-text、selected-linksstext、slinks実装
    • document.body.textContent、選択範囲のテキスト、href群を返す
    • grepはcontentと繋がなくてもcontentを補う
    • Minibufferの実装を参考にしました
  • その他細かい修正

$ pwd
http://www.hatena.ne.jp/
$ find . -type d
company/
guide/
help/
info/
rule/
$ find . -type d -print0|xargs -0 open
# -> 全部開く

$ cat slinks
http://q.hatena.ne.jp/1216560689
http://q.hatena.ne.jp/1216596677
http://q.hatena.ne.jp/1216665689
http://q.hatena.ne.jp/1216745310
http://q.hatena.ne.jp/1216623542
$ cat slinks|open
# -> 全部開く(xargs使わなくてもできる)

selected-links、selected-textはコマンド名が長い上に補完が効かないので適当に略すかも。

略した。もっと直感的なコマンド名ないかなあ。

メモ

sort uniq cut less head tail overrideMimeTypeでwget?

cygmonkeyとかにすればよかったな……いや、名前負けするからダメか。

あとは行数制限……

Bookmarklet: アダプター

マイクロソフト製品ならびにサービスにおける外来語カタカナ用語末尾の長音表記の変更について

javascript:document.body.innerHTML=document.body.innerHTML.replace(/([ァ-ヶー]{2,}[ァ-ヶ])ー?/g,"$1ー");undefined

アダプター

スタッフーがエディターにコピペー。

-er/-or/-arで終わってるとき限定だからアレだなあ。

「tinyshell.user.js」更新 その2

Greasemonkey: tinyshell.user.js - mayokara note

  • 引数のクオート、バックスラッシュによるエスケープにとりあえず対応
  • コマンド関数の第3引数に$0を追加
    • コマンド名が入っている
    • ログの出力用
  • sedの挙動を変更
    • sed s/hoge/fuga/g
    • 頭のsを必須に
    • フラグはJavaScriptと同じ
  • grepの挙動を変更
    • grep ^http
    • スラッシュなし
    • -iまたは--ignore-caseで大文字小文字を区別しない

追記

  • lsコマンドを実装
    • ls -al view/
    • ページ内のa要素から適当なhrefを抽出して出力
    • 対応オプション:-a --all -l -r --reverse -R --recursive -1
  • window.TinyShell.getoptsを実装

コマンド文字列とどう接すればいいのかわからないよ。

window.TinyShell.getopts

  • 第1引数 argumentsオブジェクト
  • 第2引数 値が必須なオプションの配列(省略可)
  • オプションは必ず値の前に指定する
    • 指定しないとエラー
  • 第2引数で値を必須にしたら必ず値が必要
    • 存在しないとエラー
  • 判定厳しめ
  • 独自実装
    • あらかじめ受けつけるオプション群を全部指定するとかめんどい
    • パターンに合ってさえいればどんなオプション名でも保持する
    • 未実装のオプションを受けとったときエラーにしたい場合は、optionsをforで回して自分で判定
// コマンド関数内で実行、argumentsにはSTDIN,ARGV,$0が入っている
// echo -abc -d 20 --long-option1 --long-option2 40 --long-option3=60 value1 value2
var [options, values] = window.TinyShell.getopts(arguments, ["-d", "--long-option2", "--long-option3"]);
/* ->
options === {
    "-a": true,
    "-b": true,
    "-c": true,
    "-d": "20",
    "--long-option1": true,
    "--long-option2": "40",
    "--long-option3": "60",
}
values === [
    "value1".
    "value2",
]
*/

JavaScript: コマンド文字列からC言語のargv相当を取得する

Core JavaScript 1.5 Reference:Global Objects:String:split - MDC

String.prototype.splitの罠 - 素人がプログラミングを勉強するブログ

String#splitの挙動と後方参照を利用すればできそう。

matchだとgフラグ立てたとき括弧の中身まで取れない。

正攻法だとRegExp#execでgフラグ立ててwhileなんだろうけど、while使いたくないし一時変数も用意したくないし1個1個pushとかもいや。

yフラグも同上。

var str = "grep \"ho\\\"ge\" 'fu\\'ga' piyo \"hello work!\"";
str
// -> "grep "ho\"ge" 'fu\'ga' piyo "hello work!""
str.split(/(["']?)((?:\\.|[^\\])*?)\1(?:\s+|$)/)
   .filter(function(v,i){ return (i%3 === 2); })
   .map(function(v){ return v.replace(/\\(["'\\])/g, "$1"); })
// -> ["grep", "ho"ge", "fu'ga", "piyo", "hello work!"]

追記

$ echo he\llo
hello
$ echo "he\llo"
he\llo
$ echo he\"llo
he"llo
$ echo 'he\"llo'
he\"llo

Cygwinでやってみたんだけど、何か上のじゃだめっぽい……