タグ

ブックマーク / amachang.hatenablog.com (25)

  • JavaScript で XPath の構文木を考えてみる。 - IT戦記

    またまた パーサーブームの続編です。 昨日は数式のパーサーを作って、帰り道にいろいろ考えたんですけど、普通の言語で考えると構文木って結構複雑になるんじゃないかなあって思いました。 で、横断歩道で明日 XPath の構文木を考えてみようと思ったわけです。 では、仕様と見比べながら XPath の構文木の構造を考えてみましょう。 仕様読むの大嫌いなんですけど、がんばります。 仕様のリンク xpath cover page - W3C まず、冒頭に The primary syntactic construct in XPath is the expression. An expression matches the production Expr. http://www.w3.org/TR/xpath#section-Introduction とあるので、 XPath 全体は Expr である

    JavaScript で XPath の構文木を考えてみる。 - IT戦記
    rikuba
    rikuba 2011/09/12
  • WebKit の CSS の字句解析部分を JavaScript に移植しました - IT戦記

    これを JS に移植しました。 http://svn.webkit.org/repository/webkit/trunk/WebCore/css/tokenizer.flex ポイント それなりに汎用的な Flex みたいなものを作ったので、その部分は CSS 以外にも使えると思います。 あと、定義を文字列で書かずに正規表現オブジェクトで書くのでバックスラッシュをエスケープせずに書けます。ですので、ほとんどの箇所は WebKit の tokenizer の定義をコピーするだけで済みました。 その辺のアイデアは JavaScript で構文解析: Days on the Moon を参考にしました あと http://svn.coderepos.org/share/lang/actionscript/ascss/src/css/CSSLexer.as id:gyuque さんの ASCSS

    WebKit の CSS の字句解析部分を JavaScript に移植しました - IT戦記
    rikuba
    rikuba 2011/09/12
  • JavaScript1.7 の yield を使って、非同期処理を同期処理のように書く方法 - IT戦記

    経緯 id:kazuhooku さんが一年前にやってたことですが Kazuho@Cybozu Labs: JavaScript/1.7 で協調的マルチスレッド 今日やっと挙動が理解できたのと、 Weave のソースを読んでいたらこのテクニックをバリバリ使っていて「ちょwwおまwww」ってなったので、自分でも作ってみようと思いました。 ほとんど id:kazuhooku さんのと同じものなので、既出です><当にありがとうございました>< まず、 yield とは何か yield とは、 JavaScript 1.7 から導入された機能です。 以下に yield の細かい挙動を示しておきます。 function f() { // なんかの処理 yield; // ... (1) // なんかの処理 yield; // ... (2) // なんかの処理 } var g = f(); // こ

    JavaScript1.7 の yield を使って、非同期処理を同期処理のように書く方法 - IT戦記
  • サイボウズで学んだこと - IT戦記

    はじめに 2010 年 9 月 15 日を持ちまして、サイボウズ・ラボを退職いたしたました。 報告も兼ねて、久しぶりにブログを書いてみたいと思います。 (写真はゆうすけべーさんです) この会社に入って、たくさんの学びと思い出がありました。 その一つ一つをまとめていければ、素晴らしい記事になるのかもしれませんが、僕は文章が苦手です。 ですので、うまく退職のエントリを書き上げることができません。 言葉にできない。そんな感じです。 なので、このエントリはサイボウズ・ラボやサイボウズ社の仲間たちへのありがとうの気持ちをこめて、自分らしく最後まで JavaScript のことを書きたいと思います。 サイボウズでの最後の仕事 僕にとって、サイボウズでの最後の仕事は「JavaScript で新しいユーザーインタフェースを作ること」でした。 そして、その中で始めて複数人による大規模な JavaScrip

    サイボウズで学んだこと - IT戦記
  • 要素固有の ID を取得する - IT戦記

    IE では element.uniqueID というのがある。 これは、要素に固有の番号を付けたものだ。 これが結構便利で、 var seen = {}; for (var i = 0; i < elemenets.length; i ++) { if (seen[elements[i].uniqueID]) elements.splice(i, 1); else seen[elements[i].uniqueID] = true; } みたいな感じで、使うことができる。 他のブラウザ 他のブラウザにはこれがないので、結構不便。 で、 getter で出来るじゃんって思ってググってみたら。 Dean Edwards さんがもう作ってた。さすが http://dean.edwards.name/moz-behaviors/src/ HTMLElement.prototype.__define

    要素固有の ID を取得する - IT戦記
  • 要素が document につながっているかを高速に調べる方法 - IT戦記

    とある要素が document につながっているかどうかを調べたい! とりあえず、ほとんどすべてのブラウザで出来る方法としては、 parentNode で確認することができますね。 function isElementInDocument(node) { do { if (node === document) { return true; } } while (node = node.parentNode) return false; } でも 前の例だとちょっと遅いので contains や、 compareDocumentPosition を使うといいです! コードにすると以下のような感じ function isElementInDocument(node) { if (document === node) { return true } else if (document.compa

    要素が document につながっているかを高速に調べる方法 - IT戦記
  • Firefox に outerHTML を実装する - IT戦記

    outerHTML について outerHTML とは Mozilla 系のブラウザ以外のすべてのブラウザで使える要素の HTML が文字列として取得できるプロパティです。 alert(document.body.outerHTML); // => body の HTML がすべて見える(例:<body><h1>It works!</h1></body>) というわけで 以下のコードを書いてみました。 if (!('outerHTML' in document.createElement('div'))) { HTMLElement.prototype.__defineGetter__('outerHTML', function() { return this.ownerDocument.createElement('div').appendChild(this.cloneNode(tru

    Firefox に outerHTML を実装する - IT戦記
  • Web 標準的な CSS の値変換方法(px → em など)(訂正あり) - IT戦記

    はじめに W3C の仕様に CSS の値を変換が可能なオブジェクトが定義されていることに気がついたのでメモしておきます。 まず CSSStyleDeclaration オブジェクトを取得する 例えば、 var decl = element.style; または、 var decl = getComputedStyle(element, ''); http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration CSSStyleDeclaration オブジェクトから getPropertyCSSValue という関数を使って CSSValue オブジェクトを取得する var val = decl.getPropertyCSSValue('width') http://www.w3.org/TR/DOM-Level

    Web 標準的な CSS の値変換方法(px → em など)(訂正あり) - IT戦記
  • IT戦記 - Safari 3 に実装された、当たっている CSS ルールを全て抽出できる getMatchedCSSRules が凄い

    今日は、まだまだ Safari 3 が熱い! window オブジェクトを走査していたら、またしても面白そうな関数を見つけてしまった。 その名も getMatchedCSSRules !!! まずはデモをご覧ください 以下のブックマークレットを任意のサイトで実行すると、コンテンツの下に DOM Inspector のような要素が出現します。 そこで、要素を開いていくと Safari の場合は、どの CSS ルールが当たっているかを見る事ができます。 javascript:(function(){var d=document,s=d.createElement('script');s.className='css-inspector-script';d.body.appendChild(s);s.src='http://amachang.art-code.org/cssInspector.j

    IT戦記 - Safari 3 に実装された、当たっている CSS ルールを全て抽出できる getMatchedCSSRules が凄い
  • hCalendar を使って予定を公開しよう! - IT戦記

    はじめに みなさん、こんばんわ! さてさて最近のことですが、 Google の検索結果にイベントや予定へのリンクが表示されるようになりましたね!(まだ、英語版だけですけどね^^;) ASCII.jp:Google、リッチスニペットでイベントの日時や場所表示に対応 以下のような感じで表示されるみたいです! ウェブページの中に書かれた「予定」や「イベント」などを Google 先生が理解して表示しているんですね! この予定やイベントはどうやって探してるの? Google は hCalendar という形式のデータを読んで、予定やイベントを探しているようです。 というわけで、今日はこの Google が使っている hCalendar というものが「どういうもので」「どうやって活用すればいいか」を実例を交えながら紹介したいと思います。 hCalendar って何? hCalendar とは「カレン

    hCalendar を使って予定を公開しよう! - IT戦記
  • Windows IME に関する発見 - IT戦記

    はじめに Windows IME って「半角/全角」で ON OFF をトグルさせるじゃないですか。 あれって不便ですよね。理由としては 今 ON か OFF かを自分で覚えなきゃいけない キーが遠い などです。 で、発見した Shift+「無変換」で OFF。 「カタカナ/ひらがな」で ON。 が出来ることを知った。 このキーを覚えておけば、今 ON でも OFF でも一発で自分の好きな状態に出来るので、便利。

    Windows IME に関する発見 - IT戦記
  • 文字の情報を調べるためのブックマークレット - IT戦記

    ウェブで見かけた文字が、やたら気になることがあるので 作ってみました javascript:location.href = 'http://www.fileformat.info/info/unicode/char/' + (function(r){ var n = r.startContainer; var p = r.startOffset; return (n.nodeType == 3) ? n.nodeValue.charAt(p) : n.childNodes[p].textContent.charAt(0); })(getSelection().getRangeAt(0)).charCodeAt(0).toString(16) + '/index.htm'; void(0); 使い方は簡単 気になる文字を選択してブックマークレットを実行するだけ! 対応ブラウザ HTML5 t

    文字の情報を調べるためのブックマークレット - IT戦記
  • Firebug を「カクカク化」して $x の第 2 引数でコンテキストノードを指定できるようにする。 - IT戦記

    twitter の id:ZIGOROu と id:ku0522 の会話で $x の第 2 引数コンテキストノード指定出来たらいいよねーって話しがあって 作ろうと思って 作ったら id:os0x さんが先に作ってて http://d.hatena.ne.jp/os0x/20071213/1197515856 実装もほとんど同じだったので凹みつつ まあ、もったいないので晒そうとか思った。 で 今回は「チョコチョコいじれる化」しないでやる方法でやってみましょう。 題して 「拡張機能内に自分用の拡張空間を作っとく化」略して「カクカク化」 カクカク化で Firebug を拡張する手順は以下のようになります。 Firebug の拡張機能用のディレクトリに行く 環境 Firebug の拡張機能用のディレクトリ WinVista C:\Users\[ユーザ名]\AppData\Roaming\Mozil

    Firebug を「カクカク化」して $x の第 2 引数でコンテキストノードを指定できるようにする。 - IT戦記
  • Firefox の拡張機能をふとした時に手元でチョコチョコいじれるようにしとくと楽しい - IT戦記

    この記事で Firebug ハッキング Tips を纏めたい Firebug に一行追記して右クリックで XPath をコピペ出来るようにする。 - IT戦記 とか言ってたけどその前に、 僕は Firebug だけじゃなくて、 だいたいの拡張機能で、簡単に「チョコチョコいじれる化」というのをしてるのでそれを書いてみます。 チョコチョコいじれる化とは jar ファイルを解凍しておいてすぐ書き換えられるようにしとくこと。 「チョコチョコいじれる化」しとくと気付いたときにちょっと JS や XML や CSS を追加するだけで、いろいろ改造できて楽しい。 「でも、 Firefox が壊れる可能性があるじゃん><」って? チッチッチ、ナンセンスだよメーン そんなの拡張機能のディレクトリを削除しちゃえば元通りさ Don't be scared! iKnow!で英語。ちょっとの努力で、大きな成果を。

    Firefox の拡張機能をふとした時に手元でチョコチョコいじれるようにしとくと楽しい - IT戦記
  • IT戦記 - Math.floor を使わずに小数を整数にする

    少数を整数にしたいような場合 たとえば、 0 - 9 のランダムな整数が欲しい場合 普通はこう書く var value = Math.floor(Math.random()*10); Math.floor を使わない場合はこう書く var value = ~~(Math.random()*10); 「~」は補数を求める単項演算子で、オペランドを整数変換するので二回やることでオペランドを整数化できるのです。 まとめ でも、もっといい方法があるかも。 皆様なら「どう書く?」のでしょうか。

    IT戦記 - Math.floor を使わずに小数を整数にする
    rikuba
    rikuba 2009/10/22
    ~~n / n|0
  • IT戦記 - arguments を直接的に配列化

    Own Properties は同じだからプロトタイプだけ入れ替える (Firefox Only) id:cheesepie:20070129:1170012588 を見ていて思いつきました。 arguments.__proto__ = Array.prototype; ちなみにクロスブラウザなやり方 3 つ // 1 for(var i = 0, args = []; i < arguments.length; i ++) args[i] = arguments[i]; // 2 arguments = Array.apply(null, arguments); // 注意: コメント欄参照 // 3 for(var n in Array.prototype) arguments[n] = Array.prototype[n]; 別に配列化しなくても配列の関数は使えます 配列のプロトタイ

    IT戦記 - arguments を直接的に配列化
  • IE8 速攻徹底レビュー - IT戦記

    こ、この日記、徐々に増えている・・・ というわけで IE8 の新機能、発見したら即更新 window.sessionStorage window.globalStorage キター!!!!! See Also HTML Standard See Also DOM Storage - DOM | MDN hashchange イベントに対応(HTML5 のメーリングリストで名前を揉めてた気がするけど) online offline イベントに対応 XDomainRequest (なぜ、 XMLHttpRequest level 2 にしなかったのかと(ry window.postMessage(cross-document messaging) キター!! See Also HTML Standard Selectors API キタキタキタキタキタキターーーーーーーーーーーーーーーーーーー

    IE8 速攻徹底レビュー - IT戦記
    rikuba
    rikuba 2009/10/10
    XDomainRequest
  • getComputedStyle について調べてたら深みにハマったのでメモ - IT戦記

    getComputedStyle とは!? ある要素にどんなスタイルが当たっているかを計算してくれる。便利な関数。 使いかたはめっちゃ簡単! var style = getComputedStyle(element, ''); alert(style.fontSize); // 14px alert(style.color); // rgb(0, 0, 0) ちなみに第二引数は疑似要素の style を取りたい場合に使います。通常は空文字列でいい。 でも、 getComputedStyle はこのままでは IE, Safari では動かない。 Safari では window(グローバル領域) に getComputedStyle は定義されてなくて、 document.defaultView だけに getComputedStyle が定義されている。 ちなみに、 Firefox, Op

    getComputedStyle について調べてたら深みにハマったのでメモ - IT戦記
  • XPath に文字列を埋め込むときの注意 - IT戦記

    よく、以下のように XPath に文字列を埋め込む事があります document.evaluate('//*[@class="' + text + '"]', document, null, 7, null); まあ、僕もよくこんなコード書くんですけど。 でも、これって text が外部から来るものだったら、意図通りの動作をしないんですよね たとえば、以下のような例です。 var text = '"] | /hoge/fuga/piyo | .["'; document.evaluate('//*[@class="' + text + '"]', document, null, 7, null); というわけで 任意の文字列を XPath の式に変換する JavaScript を書いてみた 以下で試せます http://amachang.sakura.ne.jp/misc/xpath_es

    XPath に文字列を埋め込むときの注意 - IT戦記
  • HTML5 のセクションアウトラインを取得する JavaScript - IT戦記

    id:vantguarde さんが HTML5 のセクション 3 箇条を書かれて紹介しています スタイルシートやスクリプトの都合には使わないこと。それらにはdivを使うこと。 article, aside, navが適切な場合には、そちらを使こと。 セクションの先頭に見出しが自然に存在してない場合には使わないこと。 sectionの使い方とセクション三箇条 - vantguarde - web:g すばらしいですね! 便乗して セクションのアウトラインを求める JavaScript(YAPC 前夜祭で紹介したやつ)を公開します http://amachang.sakura.ne.jp/misc/outliner.js この JavaScript は 以下のアルゴリズムをそのまま JavaScript で実装したものになっています 4.4.11.1 Creating an outline

    HTML5 のセクションアウトラインを取得する JavaScript - IT戦記