babu_babu_babooのごみ箱

2010-06-22

方言で

12:24

「むつける」

「いじけて、不機嫌になる」です


こそっと、LIMIT_DAY 直しておきました。

<!DOCTYPE html>
<title></title>
<style type="text/css">
body { background : black; color: red; }
p { font-size:200%; }
p.cm { font-size: 400%; color: green; }
p.cm2 { font-size: 100%; color: yellow; }
<style type="text/css">
</style>

<body>

<p id="mess">有効期限は、初めてページを閲覧してから2日です</p>
<p class="cm">花火大会開催中!!</p>
<p class="cm2">(出場者募集中、商品はなんと「黒豆10粒」)</p>

<script type="text/javascript"><!--
(function (doc) {

  function addDay ( day, date ) {
    if( 'number' !== typeof day ) day = 0;
    if( 'object' !== typeof date ) date = new Date;
    return (date.setDate( date.getDate() + day ), date);
  }

  function getCookie ( name ) {
    name = encodeURIComponent( name ).replace( /([.*()]) /g, '\\$1' );
    var value = doc.cookie.match( RegExp( name + '\\s*=\\s*(.*?)(?:[\\s;,]|$)' ) );
    return value ? decodeURIComponent( value[1] ): '';
  }

  function setCookie ( name, value, day, path, domain ) {
    return doc.cookie = encodeURIComponent (name) + '=' + encodeURIComponent (value) +
      '; ' + 'expires=' + ( addDay(day) ).toUTCString () + '; ' + (path ? 'path=' + encodeURI (path) + '; ': '') +
      (domain ? 'domain=' + encodeURI (domain) + '; ': '');
  }
  function padding ( n ) { return n < 10 ? '0' + n: n; }

  //_________________________
  
  var COOKIE_NAME = 'myCount';
  var LIMIT_DAY = 2;
  var SHELF_LIFE = 10;
  var TIMEOUT_MESS = 'おとといきやがれぇ〜!';

  var node = doc.getElementById( 'mess' );
  var targetDay = parseInt( getCookie( COOKIE_NAME ) );

  if( !targetDay ) {
    targetDay = addDay( LIMIT_DAY ).getTime();
    setCookie( COOKIE_NAME, targetDay + '', SHELF_LIFE );
  }

  (function () {
    var text = '花火点火まであと、';
    var s = (targetDay - (new Date).getTime()) / 1000 |0;

    if (s < 0)
      text = TIMEOUT_MESS;

    else {
      text += padding( s / 86400 |0) + '日と' +
        padding( s % 86400 / 3600 |0) + '時間' +
        padding( s % 3600 / 60 |0) + '分' +
        padding( s % 60 |0) + '秒です';
      setTimeout (arguments.callee, 1000);
    }

    node.firstChild.nodeValue = text;
  })();
})(this.document);

//-->
</script>


&lt;< 2010/06/22 19:06 むずせぇなや。

think49 さんに異次元レス、
・encodeURI(s) は、s を「URI として機能するよう」エスケープする。
・encodeURIComponent(s) は、s を「URIComponent として埋め込めるよう」エスケープする(それ自体が URI として機能するとは限らず、元の形に戻す責任はアプリ側が負う)。
Cookie のドメイン指定は(相対)URI として機能させねばならないので、ここで encodeURIComponent() を使ってはいけません。babu_babu_baboo さんが encodeURI() を用いたのは正しい判断です。

※ついでに、Date#toGMTString も ECMAScript からは外れ、toUTCString に置き換わっています。少なくとも 2000 年以降に書かれた JS 関連文書で、(un)?escape、Date#toGMTString、String#substr、RegExp.$1 を無批判に用いているものは、不用意と言わざるをえません。

それと、
> id="aaa bbb"
・ (NO-BREAK SPACE)は " "、"\A0 " です。"\20 " ではありません。
・XHTML のスキーマが @id を ID としているなら、" " は妥当性違反です。
・HTML5 ならば id 属性値に " " を含めても可です。

ついでに、
> id属性値は "&;" を許可していないので、実体参照、数値参照も使えません
・SGML/XML の枠組みに従う限り、引用符で括られた属性値は実体参照を展開するので「使えます」。展開後の値に "&"、";" が含まれている場合、あるいは引用符で括られていない場合は駄目ですが。
・2008 年に出た XML 1.0 第 5 版で Name の文字種制限が大幅に緩和されています。Letter、BaseChar など [84] 以降の生成規則は廃止されました。
・CSS 2.1 の ID およびクラスセレクタは、"\80" 以降の文字(non-ASCII)を全てエスケープなしで使えます。エスケープの必要があるのは主に、CSS ファイルの文字コードでは表現できない文字を書き入れるときです。
もちろん、これらは規定上の話であり、実装がどうなっているかは別の話です。jQuery で使われている Sizzle など、ほとんどの自前セレクタエンジンは、この辺かなりイイカゲンです。

&lt;< 2010/06/22 19:12 実体参照が通るんか。さすがはてな、意味わからん。
&<>"'&Uumul;@

babu_babu_baboobabu_babu_baboo 2010/06/22 22:01 あらためて、encodeURI とか encodeURIComponent をながめました。
知らないことが多いなぁ。

それにしても、LIMIT_DAY は、ミスった。まぁ〜毎回のことだけど。
以前より丁寧に書くようにしてるのに、ミスる。
それに投稿の文字数制限はきつい。
分割するのが面倒です。

でもね、つこっむところは、「黒豆10粒」でしょ。^^;


> 実体参照が通る
< さんの投稿者名は「&lt;」でメールが来ますよ。慣れましたけど。

FujillinFujillin 2010/06/23 20:55 ちはっ!

>それにしても、LIMIT_DAY は、ミスった
あら捜しをしたわけではないよ。(ねんのため)

たまたま、斜め読みをして「おとといきやがれぇ〜!」を出してみるかと10秒前にセットしようとしたら…
 ・えぇ〜ぃ。 0.01日とか入れたらどうなるんだぁ?
 ・あれっ、何も変わらん。 おっと!いちいちクッキー消さなきゃなんないんだ。めんどくせ〜!!
 ・クッキーはどこにあんだよ。一括消去なら簡単だけど、そういうわけにもいかないしなぁ…
 ・やっぱり、小数点以下を時分秒に換算してくれるかも、ってのは甘いのね。
なんて遊んでいたら、傍にあった「var LIMIT_DAY = 2」が目にとまったってわけ。

その前のほうで、babu_babooさんとZさんとの「ぼそっと」会話があったので、んじゃ、ついでに「ぼそっと2」をと思って投稿したら、知らん間にthink49さんの「どすん」が入っていたという次第。
まぁ、私のは蚊が舐めた(刺すまでいかない)くらいのもんだから「むつける」ことにはならんでしょ。

改めてそのあたりを見てみたら( addDay )
 return (date.setDate( date.getDate() + day ), date);
って普通に
 date.setDate( date.getDate() + day );
 return date;
って書いたほうが、文字数少なくないかい?
(インデントのスペースとか改行コードもカウントするなら別だけど…)


>でもね、つこっむところは、「黒豆10粒」でしょ
いやいや。 黒豆は貴重品。
換算するとなんと1000ポイントにもなるのだから、これはもう豪華な商品でやんす。

babu_babu_baboobabu_babu_baboo 2010/06/23 21:29 毎度ぉ。

全然、不機嫌になっていませんのご安心を!
そういうミスは日常茶飯事なのは、みなさんがご存知でしょ!(^^;

「むつける」ね〜。
あれは think49 さんが投稿する前に「むつける」を説明用に書いておいたのだ!
もしかして、俺がむつけてるとでも?勘違いがいなさらないようにね。

そこのお題で、zeff さんの反応が謙虚だったので、
対抗して書いてみようと思ったのだ。墓穴を掘ってしまったが。

> date.setDate( date.getDate() + day );
> return date;
確かにこっちの書き方だよね。
このどうでもいいような部分は、手抜きして1行で済ませようとする癖があるんだろうなぁ〜

今日は、コンポタージュ味のソフトクリームを買って食べたら腹が下った。


<さんって、東北生まれの宇宙人だったのか?
日本語、英語、コンピュータ言語、そして方言にも精通してるとか?恐るべし。
「むずせぇなや」は、意味がわからなかった。

babu_babu_baboobabu_babu_baboo 2010/06/23 22:32 ごめん!勝手に削除した。

&lt;< 2010/06/24 10:34 んね、んねっすわ think49 さん、
> HTML5では " " を使える
> CSSでidセレクタのエスケープは \A0 (NO-BREAK-SPACE)

私がコメントを修正しなかったせいですが、違います。

・&nbsp;(NO-BREAK SPACE)は "&#xA0"、"\A0 " です。"\20 " ではありません。
・XHTML のスキーマが @id を ID としているなら、"&#xA0" は妥当性違反です。
・HTML5 ならば id 属性値に "&nbsp;" を含めても可です。

これで話が通じると思います。そもそも、NO-BREAK SPACE (U+00A0) と SPACE (U+0020) は別の文字です。
※ LaTeX だと改行されたくない空白として "~" を埋め込みますが(Mr.~Hoge)、NO-BREAK SPACE まさにこの機能を持つ文字です。

think49 さんは No.6 の記事で <div id="aaa&nbsp;bbb"> と NO-BREAK SPACE を埋め込んでいるのですから、CSS 側で受けるべきは "#aaa\20 bbb" のような SPACE ではなく、"#aaa\A0 bbb" のように NO-BREAK SPACE であるはずです。
※なお、CSS のエスケープ文字の後ろには空白が許されます。これは単に後ろの文字とくっつくのを避けるためで("#aaa\20bbb" だと "\20bbb" というシーケンスに解釈されてしまう)、文字を元に戻すときには無視されます。

HTML5 の id 属性値に空白文字を含めてはなりませんが、"&#xA0;" は空白文字ではないので使えます。しかし、HTML4/XHTML1 の ID に "&#xA0;" は許容されません。最初から SPACE の話はしておらず、あくまで NO-BREAK SPACE の話なのです。

そういうわけで、HTML5 の <div id="aaa&nbsp;bbb"> に対するセレクタ "#aaa\A0 bbb" を正しく書けば、IE6 でもきちんと解釈します。

だもんで、
> /^(?![a-zA-Z][0-9a-zA-Z_\-]*$)/
このチェックは不要です。
※と言うより、そこは妥当性検証する場面ではありません……やるならもっと前段階です。

> body.aaa .aaa, body.bbb .bbb { display: block; }
これはなくても大丈夫だと思います。"*.aaa"、"*.bbb" にマッチする要素がブロックとは限りませんし、そもそも display: none するセレクタにマッチしない要素は、それぞれの初期値をとるはずです。

話の流れ的にソースか仕様を見れば分かると安直に考えてたので、かえって話をややこしくしていまいました。申し訳ない。

※さーて、このコメントの実体参照はどうなるか?

¥..&lt;&”--’]]&gt;../`¥..<&”--’]]>../` 2010/06/24 10:42 > だもんで、……このチェックは不要です。
すみません、焦り過ぎて別の事項をゴッチャにしてしまいました。この部分はとりあえず撤回するので読み飛ばして下さい。

ついでに名前を変えてみました。

think49think49 2010/06/25 04:23 だたら嬉しい。

なかなかレス出来なくて足踏みしていても、丁寧にアドバイスしてくれる<さんが好きですw

---------

<さん、改め、¥..<&”--’]]>../`さん

> Cookie のドメイン指定は(相対)URI として機能させねばならないので、ここで encodeURIComponent() を使ってはいけません。babu_babu_baboo さんが encodeURI() を用いたのは正しい判断です
domain指定だから、encodeURI() で正しいのですね。

[javascript]document.cookieのお勉強
http://blog.wonder-boys.net/?p=208

> ※ついでに、Date#toGMTString も ECMAScript からは外れ、toUTCString に置き換わっています。少なくとも 2000 年以降に書かれた JS 関連文書で、(un)?escape、Date#toGMTString、String#substr、RegExp.$1 を無批判に用いているものは、不用意と言わざるをえません。
Date#toGMTString 以外は覚えていました。Dateオブジェクトはまだ使い慣れてない感じです。

> 最初から SPACE の話はしておらず、あくまで NO-BREAK SPACE の話なのです。
ちょっと時間がかかってしまいましたが、検証は終わり、ほぼ理解できたと思います。
http://vird2002.s8.xrea.com/test/NO-BREAK_SPACE.html
http://vird2002.s8.xrea.com/test/NO-BREAK_SPACE.xhtml

やや自信がないのは、

> ・XHTML のスキーマが @id を ID としているなら、"&#xA0" は妥当性違反です。

の解釈。
これはXML1.0規定の「ID型」を指しているとみて、問題ないでしょうか?
XHTML1.0では「id属性 = XMLのID型」との記述があり、それなりの自信を持っていますが、XHTML5は資料が少なく、関連性を明確にするまでは至りませんでした。

> ついでに名前を変えてみました。
あ…。TAG IndexでCSV変換器のコードをレスしてくれた方と名前が同じ…!
いろいろなところでお世話になってます。m(_ _)m

---------

> babu_babu_baboo 2010/06/23 22:32
> ごめん!勝手に削除した。
全文コピーしておけば良かったです…。OTL

babu_babu_baboobabu_babu_baboo 2010/06/25 11:45 ひゅぅ〜!ひゅぅ〜!

とうとう、告っちまったかぁ〜!?(^^;

これからも、俺(達)は、あたたかく見守ってるぜぇ〜。
それとも「ちょっとまったぁ〜」があるとか。
「ごめんなさい」があるとか。



> 全文コピー
あ〜。なんでもないことだから。

&lt;< 2010/06/26 06:28 think49 さん、
> XHTML5 ではスキーマがid属性値をID型として扱う
XHTML5 はスキーマを提供しません。第三者スキーマを用います。例えば、
http://syntax.whattf.org/
ここのスキーマ(dev.w3.org でも用いられている)では、
attribute xml:id { xsd:NCName }
attribute id { w:ID } # xsd:string { pattern = "\S+" }
ここで xsd:ID を用いていない理由を考えてみて下さい(xml:id 規定 D.3 と比べて下さい)。XML 応用はデータと妥当性検証を切り離せること、それゆえ XML 草創期から「スキーマなしデータ」と「スキーマありデータ」の非互換問題があったこと(いわゆるボヘミアン闘争)、だから WHATWG および HTML5 は、データと妥当性検証を切り離すどころか、SGML 以上に両者を「融合」させる道を選んだこと(特に DOM との関係)、結果として HTML/DOM はブラウザと一体化し、「Hypertext Markup Language」ではなく「HTML: The Markup Language」として独自の道を歩き出したこと、HTML5 は XHTML 構文を用意はするが、XML の領域には深入りを避けていること。止まらなくなりそうなのでこの辺で。

> 名前
戻しました。あの名前はエスケープがちゃんとできているかチェックするときに(個人的に)使っています。やばそうな文字を全角化とは、なるほど、ズレてます。"<" がメールで実体参照化されているというのも、間違った「サニタイズ」でエスケープのタイミングを誤っているからに他ならず、なかなか興味深いですね(非笑)。

think49think49 2010/06/26 18:59 理解した範囲で更新しました。
http://vird2002.s8.xrea.com/test/NO-BREAK_SPACE.html


<さん

> ここで xsd:ID を用いていない理由を考えてみて下さい(xml:id 規定 D.3 と比べて下さい)。
ふむふむ…。

D.3 With RELAX NG Validation - xml:id Version 1.0
http://www.w3.org/TR/xml-id/#with-relax-ng-validation
NCName - Namespaces in XML 1.0 (Third Edition)
http://www.w3.org/TR/REC-xml-names/#NT-NCName

> XML 応用はデータと妥当性検証を切り離せること、それゆえ XML 草創期から「スキーマなしデータ」と「スキーマありデータ」の非互換問題があったこと(いわゆるボヘミアン闘争)
ここから想像するに、既存のXHTML文書との互換性を重視した結果ではないでしょうか?

XHTML1.0 では、id属性はID型。
「スキーマなしデータ」はデフォルトの属性型を参照するので、「スキーマありデータ」でもID型を指定すれば、「スキーマなしデータ」との互換性を確保できる。
一方、xml:id属性はXHTML1.0でデフォルトの属性型が指定されていない。従って、互換性を考慮する必要はなく、NCName を指定した。

HTML5 は私が今まで仕様を読んだ限りでは、既存の HTML4.01, XHTML1.0文書 に少なからず配慮しており、互換性には特に気を配っています。
XHTML1.1 では後方互換性を無視して XML に傾倒しましたが、XHTML に対応しない IE8- の影響力は大きく、HTMLをWebの世界から排除するほどの普及には至りませんでした。
そこで、「HTML5 を作ろう」という動きが出てくるわけですが、対する XHTML2.0 は廃案となり、XHTML5 として仕様が再定義されることになりました。
「HTMLからXHTMLへ」ではなく、HTMLもXHTMLも同じ速度で進化する道を選択します。

(X)HTML5 は名前からも想像できるように、 HTML4.01 からのアップデートです。
「空要素を / で閉じても良い」など、XHTMLにも配慮はありますが、使用できる要素,属性は HTML4.01 を基盤としたもの。
ですので、HTML5 では可能な限り、HTML4.01 で使われている要素(属性)を残し、「非推奨要素, 非推奨属性, CSSで定義されるべき要素,属性」は廃止するものの、そのほとんどは HTML4.01 と互換性があります。

結論としては、XHTML5 も HTML5 と同じように、既存の XHTML1.x文書 との互換性を確保できるような配慮があったのだと思います。

# …というような内容を http://www.tagindex.com/cgi-lib/q1bbs/patio.cgi?mode=view&no=4561 で回答しようとしているのですが、上手くまとまりません。
# HTML4.01, XHTML1.0, HTML5 のコードを例示して、「それぞれの移行スタンスを明確にしよう」としているのですがXML系の知識が足りなく上手く説明できないという…。
# 互換性はまあ分かるんですが、「XHTMLを使うならXMLの機能を使うべきでしょ」ってところで、「じゃあ、どんなXMLの機能があるの?」と頭を抱えています。(苦笑)

> いわゆるボヘミアン闘争
大雑把にしか読み解いていませんが、XHTML5はボヘミアンへの道を辿ったということになるのでしょうか。

ボヘミアン … スキーマを指定しても、指定しなくても良い
貴族 … スキーマは指定しなければならない

個人的には互換性を考えれば、その選択は必然だったと思います。
貴族派を支持すれば、ボヘミアン派のXHTML文書を排除することになり、XHTML1.1 の二の舞になる気がしますね…。

@IT:XMLにおける「ボヘミアンと貴族の階級闘争」を読み解く
http://www.atmarkit.co.jp/fxml/tanpatsu/24bohem/01.html

think49think49 2010/06/26 19:09 > XHTML に対応しない IE8- の影響力は大きく
「Content-Type: application/xhtml+xml」の互換性の話です。
「『Content-Type: text/html』なら、HTMLと変わらない」ってところを上手く説明できれば、と思っているのですが…。

&lt;< 2010/06/26 20:11 > 貴族派を支持すれば
HTML5 はinfoset ありきの仕様ですから、完璧な左うちわの貴族ですよ。
※だから、表に出すための構文はとりあえず置いておいて、スキーマと一体化した DOM ありきの仕様になっているのではないですか。

think49think49 2010/06/26 20:57 <さん

> HTML5 はinfoset ありきの仕様ですから、完璧な左うちわの貴族ですよ。
あら…。良く理解しないで口にすべき内容ではなかったですね。
ボヘミアンについては、もう少し読んでみます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証