becomingの日記
becoming
Hatena::Blog
hatenablog://blog/17680117127122018534
amachangのXPath機能テストで、JavaのXPathAPIのテストをしてみた。
hatenablog://entry/17680117127122018607
2007-11-19T00:33:19+09:00
2019-05-08T09:00:16+09:00 本当は、HTMLを取得して、解析しようと思ったが、xhtmlじゃないので、DocumentBuilderでの解析に失敗するので、対処するのが面倒なのと、HttpClientとか使うと依存が増えるので、とりあえず、該当箇所だけ引っぱり出してテストしてみた。 package xpath; import com.sun.org.apache.xpath.internal.XPathAPI; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.Inpu…
<p>本当は、HTMLを取得して、解析しようと思ったが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/xhtml">xhtml</a>じゃないので、DocumentBuilderでの解析に失敗するので、対処するのが面倒なのと、HttpClientとか使うと依存が増えるので、とりあえず、該当箇所だけ引っぱり出してテストしてみた。</p>
<pre class="code lang-java" data-lang="java" data-unlink><span class="synPreProc">package</span> xpath;
<span class="synPreProc">import</span> com.sun.org.apache.xpath.internal.XPathAPI;
<span class="synPreProc">import</span> java.io.BufferedReader;
<span class="synPreProc">import</span> java.io.IOException;
<span class="synPreProc">import</span> java.io.InputStream;
<span class="synPreProc">import</span> java.io.InputStreamReader;
<span class="synPreProc">import</span> java.util.Arrays;
<span class="synPreProc">import</span> java.util.LinkedHashMap;
<span class="synPreProc">import</span> java.util.LinkedList;
<span class="synPreProc">import</span> java.util.List;
<span class="synPreProc">import</span> java.util.Map;
<span class="synPreProc">import</span> java.util.regex.Matcher;
<span class="synPreProc">import</span> java.util.regex.Pattern;
<span class="synPreProc">import</span> javax.xml.parsers.DocumentBuilder;
<span class="synPreProc">import</span> javax.xml.parsers.DocumentBuilderFactory;
<span class="synPreProc">import</span> javax.xml.parsers.ParserConfigurationException;
<span class="synPreProc">import</span> javax.xml.transform.TransformerException;
<span class="synPreProc">import</span> junit.framework.TestCase;
<span class="synPreProc">import</span> org.w3c.dom.Document;
<span class="synPreProc">import</span> org.w3c.dom.Node;
<span class="synPreProc">import</span> org.w3c.dom.traversal.NodeIterator;
<span class="synPreProc">import</span> org.xml.sax.SAXException;
<span class="synType">public</span> <span class="synType">class</span> XPathCoverageTest <span class="synType">extends</span> TestCase{
<span class="synType">public</span> <span class="synType">void</span> test_checkCoverage() {
<span class="synStatement">try</span> {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(<span class="synConstant">true</span>);
DocumentBuilder builder = factory.newDocumentBuilder();
<span class="synComment">// 解析対象のHTMLの読み込み</span>
Document doc = builder.parse(getClass().getResourceAsStream(<span class="synConstant">"test.html"</span>));
<span class="synComment">//テスト対象のケース取得</span>
Map<String, List<String>> testData = readData(<span class="synConstant">"testData.txt"</span>);
<span class="synStatement">for</span> (String key : testData.keySet()) {
<span class="synType">long</span> start = System.currentTimeMillis();
<span class="synComment">// NodeIteratorの取得</span>
NodeIterator nl = XPathAPI.selectNodeIterator(doc, key);
<span class="synType">long</span> processTime = System.currentTimeMillis() - start;
Node node;
List<String> nodeList = <span class="synStatement">new</span> LinkedList<String>();
<span class="synStatement">while</span> ((node = nl.nextNode()) != <span class="synConstant">null</span>) {
nodeList.add(node.getNodeName());
}
<span class="synType">boolean</span> isValid = testData.get(key).equals(nodeList);
<span class="synStatement">if</span> (isValid) {
System.out.println(<span class="synConstant">"[ok]"</span> + key + <span class="synConstant">" "</span> + processTime + <span class="synConstant">"ms"</span>);
} <span class="synStatement">else</span> {
System.out.println(<span class="synConstant">"[ng]"</span> + key + <span class="synConstant">" "</span> + processTime + <span class="synConstant">"ms"</span>);
System.out.println(<span class="synConstant">"expected : "</span> + testData.get(key)
+ <span class="synConstant">", value : "</span> + nodeList.toString());
}
}
} <span class="synStatement">catch</span> (SAXException e) {
} <span class="synStatement">catch</span> (IOException e) {
} <span class="synStatement">catch</span> (ParserConfigurationException e) {
} <span class="synStatement">catch</span> (TransformerException e) {
}
}
<span class="synComment">/**</span><span class="synSpecial">左側の空白文字削除用パターン</span><span class="synComment">*/</span>
<span class="synType">private</span> <span class="synType">final</span> Pattern LEFT_TRIM_PATTERN = Pattern.compile(<span class="synConstant">"^[</span><span class="synSpecial">\\</span><span class="synConstant">s ]+"</span>);
<span class="synComment">/**</span><span class="synSpecial">右側の文字削除用パターン</span><span class="synComment">*/</span>
<span class="synType">private</span> <span class="synType">final</span> Pattern RIGHT_TRIM_PATTERN = Pattern.compile(<span class="synConstant">"[</span><span class="synSpecial">\\</span><span class="synConstant">s ,]+$"</span>);
<span class="synComment">/**</span><span class="synSpecial">パラメーター解析用パターン</span><span class="synComment">*/</span>
<span class="synType">private</span> <span class="synType">final</span> Pattern PARAMTER_PATTERN = Pattern.compile(<span class="synConstant">"^</span><span class="synSpecial">\\</span><span class="synConstant">['(.+)',</span><span class="synSpecial">\\</span><span class="synConstant">s'(.+)'</span><span class="synSpecial">\\</span><span class="synConstant">]"</span>);
<span class="synType">private</span> String[] parse(String params) {
params = LEFT_TRIM_PATTERN.matcher(
RIGHT_TRIM_PATTERN.matcher(params).replaceAll(<span class="synConstant">""</span>)).replaceAll(
<span class="synConstant">""</span>);
List<String> paramList = <span class="synStatement">new</span> LinkedList<String>();
Matcher matcher = PARAMTER_PATTERN.matcher(params);
<span class="synStatement">if</span> (matcher.matches()) {
<span class="synStatement">for</span> (<span class="synType">int</span> i = <span class="synConstant">0</span>; i < matcher.groupCount(); i++) {
paramList.add(matcher.group(i + <span class="synConstant">1</span>));
}
}
<span class="synStatement">return</span> (String[]) paramList.toArray(<span class="synStatement">new</span> String[paramList.size()]);
}
<span class="synComment">/**</span>
<span class="synComment"> *</span><span class="synSpecial"> テスト用データ読み込み</span>
<span class="synComment"> * </span><span class="synSpecial">@param</span><span class="synIdentifier"> dataFileName</span>
<span class="synComment"> * </span><span class="synSpecial">@return</span>
<span class="synComment"> */</span>
<span class="synType">private</span> Map<String, List<String>> readData(String dataFileName) {
InputStream input = <span class="synConstant">null</span>;
Map<String, List<String>> data = <span class="synStatement">new</span> LinkedHashMap<String, List<String>>();
<span class="synStatement">try</span> {
input = getClass().getResourceAsStream(dataFileName);
BufferedReader reader = <span class="synStatement">new</span> BufferedReader(<span class="synStatement">new</span> InputStreamReader(
input));
<span class="synStatement">while</span> (reader.ready()) {
String[] params = <span class="synConstant">null</span>;
<span class="synStatement">if</span> ((params = parse(reader.readLine())).length == <span class="synConstant">2</span>) {
data.put(params[<span class="synConstant">0</span>], Arrays.asList(params[<span class="synConstant">1</span>].split(<span class="synConstant">" "</span>)));
}
}
} <span class="synStatement">catch</span> (IOException e) {
} <span class="synStatement">finally</span> {
<span class="synStatement">if</span> (input != <span class="synConstant">null</span>) {
<span class="synStatement">try</span> {
input.close();
} <span class="synStatement">catch</span> (IOException e) {
}
}
}
<span class="synStatement">return</span> data;
}
}
</pre><p>テスト対象のデータ(testData.txt)。<a href="http://amachang.art-code.org/xpath_functional_test/">http://amachang.art-code.org/xpath_functional_test/</a>から、機能テスト用のデータ部分だけ抽出。</p>
<pre class="code" data-lang="" data-unlink> ['.//blockquote/*', 'br p font'],
['.//blockquote/child::*', 'br p font'],
['.//blockquote/parent::*', 'center'],
['.//blockquote/descendant::*', 'br p del ins font'],
['.//blockquote/descendant-or-self::*', 'blockquote br p del ins font'],
['.//blockquote/ancestor::*', 'html body div center'],
['.//blockquote/ancestor-or-self::*', 'html body div center blockquote'],
['.//blockquote/following-sibling::*', 'h3 h4'],
['.//blockquote/preceding-sibling::*', 'h1 h2'],
['.//blockquote/following::*', 'h3 dfn a h4 sub sup span abbr q'],
['.//blockquote/preceding::*', 'head title script dl dt dd h1 em strong h2 b s'],
['.//blockquote/self::*', 'blockquote'],
['.//blockquote/attribute::id/parent::*', 'blockquote'],
['.//blockquote/@id/parent::*', 'blockquote'],
['.//*[blockquote]', 'center'],
['.//*[child::blockquote]', 'center'],
['.//*[parent::blockquote]', 'br p font'],
['.//*[descendant::blockquote]', 'div center'],
['.//*[descendant-or-self::blockquote]', 'div center blockquote'],
['.//*[ancestor::blockquote]', 'br p del ins font'],
['.//*[ancestor-or-self::blockquote]', 'blockquote br p del ins font'],
['.//*[following-sibling::blockquote]', 'h1 h2'],
['.//*[preceding-sibling::blockquote]', 'h3 h4'],
['.//*[following::blockquote]', 'dl dt dd h1 em strong h2 b s'],
['.//*[preceding::blockquote]', 'h3 dfn a h4 sub sup span abbr q'],
['.//*[self::blockquote]', 'blockquote'],
['.//*[@id]', 'div dl dt dd center h1 em strong h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'],
['.//*[attribute::id]', 'div dl dt dd center h1 em strong h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'],
['.//blockquote/text()', 't:blockquoteText1: t:blockquoteText2'],
['.//blockquote/comment()', 'c:blockquoteComment'],
['.//blockquote/processing-instruction()', 'p:pi'],
['.//blockquote/processing-instruction("pi")', 'p:pi'],
['.//blockquote/node()', 'c:blockquoteComment t:blockquoteText1: br t:blockquoteText2 p p:pi font'],
['.//blockquote/p', 'p'],
['.//blockquote/*', 'br p font'],
['.//*[child::* and preceding::font]', 'h3 h4 span'],
['.//*[not(child::*) and preceding::font]', 'dfn a sub sup abbr q'],
['.//*[preceding::blockquote or following::blockquote]',
'dl dt dd h1 em strong h2 b s h3 dfn a h4 sub sup span abbr q'],
['.//blockquote/ancestor::* | .//blockquote/descendant::*', 'html body div center br p del ins font'],
['.//*[.="sub"]', 'sub'],
['.//*[@title > 12 and @class < 15]', 'br p del ins font'],
['.//*[@title != @class]',
'div dl dt dd center em strong b s blockquote br p del ins font dfn a sub sup span abbr q'],
['.//*[((@class * @class + @title * @title) div (@class + @title)) > ((@class - @title) * (@class - @title))]',
'dl h1 h2 s blockquote br p font h3 dfn a h4 sub sup span abbr q'],
['.//*[@title mod 2 = 0]', 'dl dd h1 strong b blockquote p ins h3 a sub span q'],
['.//blockquote/child::*[last()]', 'font'],
['.//blockquote/descendant::*[position() < 4]', 'br p del'],
['id(.//font/@face)', 'strong q'],
['.//*[name(.) = "sub"]', 'sub'],
['.//*[name() = "sub"]', 'sub'],
['.//blockquote/child::*[2]', 'p'],
['.//blockquote/descendant::*[4]', 'ins'],
['.//blockquote/descendant-or-self::*[4]', 'del'],
['.//blockquote/ancestor::*[2]', 'div'],
['.//blockquote/ancestor-or-self::*[2]', 'center'],
['.//blockquote/following-sibling::*[1]', 'h3'],
['.//blockquote/preceding-sibling::*[1]', 'h2'],
['.//blockquote/following::*[4]', 'h4'],
['.//blockquote/preceding::*[4]', 'strong'],
['.//*[starts-with(.,"s")]', 'strong s h4 sub sup'],
['.//*[string(@title - 1) = "0"]', 'div'],
['.//*[string() = "sub"]', 'sub'],
['.//*[string(.) = "sub"]', 'sub'],
['.//*[concat(.,..) = "subsubsup"]', 'sub'],
['.//node()[concat(.,..,../..) = "bbbs"]', 't:b'],
['.//*[starts-with(.,"s")]', 'strong s h4 sub sup'],
['.//*[substring-before(.,"u") = "s"]', 'h4 sub sup'],
['.//*[substring-after(.,"on") = "t"]', 'blockquote font'],
['.//*[substring(.,2,1) = "u"]', 'h4 sub sup'],
['.//*[substring(.,2) = "up"]', 'sup'],
['.//*[contains(.,"b")]', 'div center h2 b blockquote h4 sub span abbr'],
['.//*[string-length() = 3]', 'del ins dfn sub sup'],
['.//*[string-length(.) = 3]', 'del ins dfn sub sup'],
['.//*[.=translate(normalize-space(" s u b ")," ","")]', 'sub'],
['.//*[normalize-space()="q"]', 'q'],
['.//*[boolean(@title - 1) = false()]', 'div'],
['.//*[not(@title - 1) = true()]', 'div'],
['.//*[lang("it")]', 'q'],
['.//*[number(@title) < number(@class)]', 'div dl center blockquote span'],
['.//*[sum(ancestor::*/@title) < sum(descendant::*/@title)]',
'div dl center h1 h2 blockquote p h3 h4 span'],
['.//*[floor(@title div @class) = 1]',
'h1 em strong h2 b s br p del ins font h3 dfn a h4 sub sup abbr q'],
['.//*[ceiling(@title div @class) = 1]', 'div dl center h1 h2 blockquote h3 h4 span'],
['.//*[round(@title div @class) = 1]',
'dl h1 h2 b s blockquote br p del ins font h3 dfn a h4 sub sup span abbr q'],
['.//*[blockquote]', 'center']</pre><p>テスト用HTMLは、解析でエラーにならないように、scriptの中を抜いただけ。</p>
<pre class="code" data-lang="" data-unlink><html>
<head>
<title>XPath Test</title>
<script>
</script>
</head>
<body><div id="n1" title="1" class="26" xml:lang="en"><dl id="n2" title="2" class="3"><dt id="n3" title="3" class="1">dt</dt><dd id="n4" title="4" class="2">dd</dd></dl><center id="n5" title="5" class="22"><h1 id="n6" title="6" class="6"><em id="n7" title="7" class="4">em</em><strong id="n8" title="8" class="5">strong</strong></h1><h2 id="n9" title="9" class="9"><b id="n10" title="10" class="7">b</b><s id="n11" title="11" class="8">s</s></h2><blockquote id="n12" title="12" class="15"><!--blockquoteComment-->blockquoteText1:<br id="n13" title="13" class="10"/>blockquoteText2<p id="n14" title="14" class="13"><del id="n15" title="15" class="11">del</del><ins id="n16" title="16" class="12">ins</ins></p><?pi name="value"?><font id="n17" title="17" class="14" face="n8 n26">font</font></blockquote><h3 id="n18" title="18" class="18"><dfn id="n19" title="19" class="16">dfn</dfn><a id="n20" title="20" class="17">a</a></h3><h4 id="n21" title="21" class="21"><sub id="n22" title="22" class="19">sub</sub><sup id="n23" title="23" class="20">sup</sup></h4></center><span id="n24" title="24" class="25"><abbr id="n25" title="25" class="23">abbr</abbr><q id="n26" title="26" class="24" cite="n8 n17" xml:lang="it">q</q></span></div></body>
</html></pre><p>以下、実行結果。<br />
環境は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacOS%20X">MacOS X</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Leopard">Leopard</a>)のJDK1.5。</p>
<pre class="code" data-lang="" data-unlink>[ok].//blockquote/* 34ms
[ok].//blockquote/child::* 7ms
[ok].//blockquote/parent::* 5ms
[ok].//blockquote/descendant::* 6ms
[ok].//blockquote/descendant-or-self::* 5ms
[ok].//blockquote/ancestor::* 5ms
[ok].//blockquote/ancestor-or-self::* 8ms
[ok].//blockquote/following-sibling::* 7ms
[ok].//blockquote/preceding-sibling::* 5ms
[ok].//blockquote/following::* 8ms
[ok].//blockquote/preceding::* 6ms
[ok].//blockquote/self::* 3ms
[ok].//blockquote/attribute::id/parent::* 4ms
[ok].//blockquote/@id/parent::* 3ms
[ok].//*[blockquote] 1ms
[ok].//*[child::blockquote] 3ms
[ok].//*[parent::blockquote] 1ms
[ng].//*[descendant::blockquote] 1ms
expected : [div, center], value : [html, body, div, center]
[ng].//*[descendant-or-self::blockquote] 1ms
expected : [div, center, blockquote], value : [html, body, div, center, blockquote]
[ok].//*[ancestor::blockquote] 5ms
[ok].//*[ancestor-or-self::blockquote] 1ms
[ok].//*[following-sibling::blockquote] 1ms
[ok].//*[preceding-sibling::blockquote] 1ms
[ng].//*[following::blockquote] 2ms
expected : [dl, dt, dd, h1, em, strong, h2, b, s], value : [head, title, script, dl, dt, dd, h1, em, strong, h2, b, s]
[ok].//*[preceding::blockquote] 1ms
[ok].//*[self::blockquote] 1ms
[ok].//*[@id] 2ms
[ok].//*[attribute::id] 1ms
[ng].//blockquote/text() 3ms
expected : [t:blockquoteText1:, t:blockquoteText2], value : [#text, #text]
[ng].//blockquote/comment() 2ms
expected : [c:blockquoteComment], value : [#comment]
[ng].//blockquote/processing-instruction() 2ms
expected : [p:pi], value : [pi]
[ng].//blockquote/processing-instruction("pi") 2ms
expected : [p:pi], value : [pi]
[ng].//blockquote/node() 5ms
expected : [c:blockquoteComment, t:blockquoteText1:, br, t:blockquoteText2, p, p:pi, font], value : [#comment, #text, br, #text, p, pi, font]
[ok].//blockquote/p 2ms
[ok].//*[child::* and preceding::font] 4ms
[ok].//*[not(child::*) and preceding::font] 6ms
[ok].//blockquote/ancestor::* | .//blockquote/descendant::* 2ms
[ok].//*[.="sub"] 2ms
[ok].//*[@title > 12 and @class < 15] 3ms
[ok].//*[@title mod 2 = 0] 5ms
[ok].//blockquote/child::*[last()] 2ms
[ok].//blockquote/descendant::*[position() < 4] 2ms
[ng]id(.//font/@face) 3ms
expected : [strong, q], value : []
[ok].//*[name(.) = "sub"] 4ms
[ok].//*[name() = "sub"] 1ms
[ok].//blockquote/child::*[2] 2ms
[ok].//blockquote/descendant::*[4] 1ms
[ok].//blockquote/descendant-or-self::*[4] 2ms
[ok].//blockquote/ancestor::*[2] 5ms
[ok].//blockquote/ancestor-or-self::*[2] 2ms
[ok].//blockquote/following-sibling::*[1] 2ms
[ok].//blockquote/preceding-sibling::*[1] 2ms
[ok].//blockquote/following::*[4] 4ms
[ok].//blockquote/preceding::*[4] 2ms
[ok].//*[starts-with(.,"s")] 2ms
[ok].//*[string(@title - 1) = "0"] 3ms
[ok].//*[string() = "sub"] 1ms
[ok].//*[string(.) = "sub"] 2ms
[ok].//*[concat(.,..) = "subsubsup"] 2ms
[ng].//node()[concat(.,..,../..) = "bbbs"] 2ms
expected : [t:b], value : [#text]
[ok].//*[substring-before(.,"u") = "s"] 2ms
[ok].//*[substring-after(.,"on") = "t"] 1ms
[ok].//*[substring(.,2,1) = "u"] 3ms
[ok].//*[substring(.,2) = "up"] 1ms
[ng].//*[contains(.,"b")] 2ms
expected : [div, center, h2, b, blockquote, h4, sub, span, abbr], value : [html, body, div, center, h2, b, blockquote, h4, sub, span, abbr]
[ok].//*[string-length() = 3] 1ms
[ok].//*[string-length(.) = 3] 1ms
[ok].//*[.=translate(normalize-space(" s u b ")," ","")] 2ms
[ok].//*[normalize-space()="q"] 2ms
[ng].//*[boolean(@title - 1) = false()] 3ms
expected : [div], value : [html, head, title, script, body, div]
[ng].//*[not(@title - 1) = true()] 4ms
expected : [div], value : [html, head, title, script, body, div]
[ok].//*[lang("it")] 2ms
[ok].//*[number(@title) < number(@class)] 2ms
[ok].//*[ceiling(@title div @class) = 1] 3ms</pre><p>結構、サポートされているのも多いので、<a href="http://people.apache.org/~andyc/neko/doc/html/">ぬこたん</a>とか、多少汚いHTMLでもパースしてくれるものを使えば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%3A%3AScraper">Web::Scraper</a>相当のものを作れそうな感じ。<<追記>><br />
<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>環境のJDK1.5.0_12だと以下のような結果。なんか<a class="keyword" href="http://d.hatena.ne.jp/keyword/OSX">OSX</a>でかかった時間と大分違うのが気になるところ。</p>
<pre class="code" data-lang="" data-unlink>[ok].//blockquote/* 78ms
[ok].//blockquote/child::* 16ms
[ok].//blockquote/parent::* 16ms
[ok].//blockquote/descendant::* 0ms
[ok].//blockquote/descendant-or-self::* 15ms
[ok].//blockquote/ancestor::* 0ms
[ok].//blockquote/ancestor-or-self::* 16ms
[ok].//blockquote/following-sibling::* 16ms
[ok].//blockquote/preceding-sibling::* 15ms
[ok].//blockquote/following::* 16ms
[ok].//blockquote/preceding::* 0ms
[ok].//blockquote/self::* 15ms
[ok].//blockquote/attribute::id/parent::* 0ms
[ok].//blockquote/@id/parent::* 16ms
[ok].//*[blockquote] 0ms
[ok].//*[child::blockquote] 16ms
[ok].//*[parent::blockquote] 0ms
[ng].//*[descendant::blockquote] 0ms
expected : [div, center], value : [html, body, div, center]
[ng].//*[descendant-or-self::blockquote] 0ms
expected : [div, center, blockquote], value : [html, body, div, center, blockquote]
[ok].//*[ancestor::blockquote] 0ms
[ok].//*[ancestor-or-self::blockquote] 0ms
[ok].//*[following-sibling::blockquote] 0ms
[ok].//*[preceding-sibling::blockquote] 0ms
[ng].//*[following::blockquote] 0ms
expected : [dl, dt, dd, h1, em, strong, h2, b, s], value : [head, title, script, dl, dt, dd, h1, em, strong, h2, b, s]
[ok].//*[preceding::blockquote] 0ms
[ok].//*[self::blockquote] 0ms
[ok].//*[@id] 0ms
[ok].//*[attribute::id] 0ms
[ng].//blockquote/text() 15ms
expected : [t:blockquoteText1:, t:blockquoteText2], value : [#text, #text, #text]
[ng].//blockquote/comment() 0ms
expected : [c:blockquoteComment], value : [#comment]
[ng].//blockquote/processing-instruction() 0ms
expected : [p:pi], value : [pi]
[ng].//blockquote/processing-instruction("pi") 32ms
expected : [p:pi], value : [pi]
[ng].//blockquote/node() 0ms
expected : [c:blockquoteComment, t:blockquoteText1:, br, t:blockquoteText2, p, p:pi, font], value : [#comment, #text, br, #text, p, #text, pi, font]
[ok].//blockquote/p 0ms
[ok].//*[child::* and preceding::font] 0ms
[ok].//*[not(child::*) and preceding::font] 15ms
[ok].//blockquote/ancestor::* | .//blockquote/descendant::* 0ms
[ok].//*[.="sub"] 0ms
[ok].//*[@title > 12 and @class < 15] 0ms
[ok].//*[@title mod 2 = 0] 16ms
[ok].//blockquote/child::*[last()] 0ms
[ok].//blockquote/descendant::*[position() < 4] 0ms
[ng]id(.//font/@face) 0ms
expected : [strong, q], value : []
[ok].//*[name(.) = "sub"] 0ms
[ok].//*[name() = "sub"] 16ms
[ok].//blockquote/child::*[2] 0ms
[ok].//blockquote/descendant::*[4] 0ms
[ok].//blockquote/descendant-or-self::*[4] 0ms
[ok].//blockquote/ancestor::*[2] 0ms
[ok].//blockquote/ancestor-or-self::*[2] 15ms
[ok].//blockquote/following-sibling::*[1] 0ms
[ok].//blockquote/preceding-sibling::*[1] 0ms
[ok].//blockquote/following::*[4] 0ms
[ok].//blockquote/preceding::*[4] 16ms
[ok].//*[starts-with(.,"s")] 0ms
[ok].//*[string(@title - 1) = "0"] 0ms
[ok].//*[string() = "sub"] 0ms
[ok].//*[string(.) = "sub"] 0ms
[ok].//*[concat(.,..) = "subsubsup"] 0ms
[ng].//node()[concat(.,..,../..) = "bbbs"] 16ms
expected : [t:b], value : [#text]
[ok].//*[substring-before(.,"u") = "s"] 0ms
[ok].//*[substring-after(.,"on") = "t"] 0ms
[ok].//*[substring(.,2,1) = "u"] 15ms
[ok].//*[substring(.,2) = "up"] 0ms
[ng].//*[contains(.,"b")] 0ms
expected : [div, center, h2, b, blockquote, h4, sub, span, abbr], value : [html, body, div, center, h2, b, blockquote, h4, sub, span, abbr]
[ng].//*[string-length() = 3] 0ms
expected : [del, ins, dfn, sub, sup], value : [script, del, ins, dfn, sub, sup]
[ng].//*[string-length(.) = 3] 16ms
expected : [del, ins, dfn, sub, sup], value : [script, del, ins, dfn, sub, sup]
[ok].//*[.=translate(normalize-space(" s u b ")," ","")] 0ms
[ok].//*[normalize-space()="q"] 0ms
[ng].//*[boolean(@title - 1) = false()] 16ms
expected : [div], value : [html, head, title, script, body, div]
[ng].//*[not(@title - 1) = true()] 0ms
expected : [div], value : [html, head, title, script, body, div]
[ok].//*[lang("it")] 0ms
[ok].//*[number(@title) < number(@class)] 0ms
[ok].//*[ceiling(@title div @class) = 1] 0ms</pre>
becoming
antコンパイルターゲットの共通化
hatenablog://entry/17680117127122018998
2007-10-18T17:42:19+09:00
2019-05-08T09:00:21+09:00 久しぶりに、antのビルドファイルを書いたので、備忘録がてらにメモ。 下のような感じで、あらかじめコンパイルする対象やライブラリをパスでまとめる。 <!--メインのコンパイル対象ディレクトリ--> <path id="compile.main.src"> <pathelement path="${dir.src.main}" /> </path> <!--テスト実行時の対象ディレクトリ--> <path id="compile.test.src"> <pathelement path="${dir.src.main}" /> <pathelement path="${dir.src.test}…
<p>久しぶりに、antのビルドファイルを書いたので、備忘録がてらにメモ。<br />
下のような感じで、あらかじめ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>する対象やライブラリをパスでまとめる。</p>
<pre class="code lang-ant" data-lang="ant" data-unlink> <span class="synComment"><!--メインのコンパイル対象ディレクトリ--></span>
<span class="synIdentifier"><</span><span class="synStatement">path</span><span class="synIdentifier"> </span><span class="synType">id</span>=<span class="synConstant">"compile.main.src"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">pathelement</span><span class="synIdentifier"> </span><span class="synType">path</span>=<span class="synConstant">"${dir.src.main}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"></</span><span class="synStatement">path</span><span class="synIdentifier">></span>
<span class="synComment"><!--テスト実行時の対象ディレクトリ--></span>
<span class="synIdentifier"><</span><span class="synStatement">path</span><span class="synIdentifier"> </span><span class="synType">id</span>=<span class="synConstant">"compile.test.src"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">pathelement</span><span class="synIdentifier"> </span><span class="synType">path</span>=<span class="synConstant">"${dir.src.main}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"><</span><span class="synStatement">pathelement</span><span class="synIdentifier"> </span><span class="synType">path</span>=<span class="synConstant">"${dir.src.test}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"></</span><span class="synStatement">path</span><span class="synIdentifier">></span>
<span class="synComment"><!--ビルド時のライブラリ指定--></span>
<span class="synIdentifier"><</span><span class="synStatement">path</span><span class="synIdentifier"> </span><span class="synType">id</span>=<span class="synConstant">"compile.main.classpath"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">fileset</span><span class="synIdentifier"> </span><span class="synType">dir</span>=<span class="synConstant">"${dir.lib}"</span><span class="synIdentifier"> </span><span class="synType">includes</span>=<span class="synConstant">"*.jar"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"></</span><span class="synStatement">path</span><span class="synIdentifier">></span>
</pre><p>次に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>用の共通ターゲットを用意する。javacの設定は、状況に合わせる。<br />
1.5系の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Eclipse">Eclipse</a>を起動している状態で、1.4系のビルドを行う場合、forkをonにしないと、正常にビルドできない為、個人的には、いつもforkはonに設定してます。</p>
<pre class="code lang-ant" data-lang="ant" data-unlink> <span class="synComment"><!--コンパイル用共通ターゲット--></span>
<span class="synIdentifier"><</span><span class="synStatement">target</span><span class="synIdentifier"> </span><span class="synType">name</span>=<span class="synConstant">"compile"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">mkdir</span><span class="synIdentifier"> </span><span class="synType">dir</span>=<span class="synConstant">"${dir.work}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"><</span><span class="synStatement">javac</span><span class="synIdentifier"> </span><span class="synType">destdir</span>=<span class="synConstant">"${dir.work}"</span><span class="synIdentifier"> </span><span class="synType">fork</span>=<span class="synConstant">"on"</span><span class="synIdentifier"> </span><span class="synType">encoding</span>=<span class="synConstant">"UTF-8"</span><span class="synIdentifier"> </span><span class="synType">source</span>=<span class="synConstant">"1.4"</span><span class="synIdentifier"> </span><span class="synType">debug</span>=<span class="synConstant">"on"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">classpath</span><span class="synIdentifier"> </span><span class="synType">refid</span>=<span class="synConstant">"${classpath.refid}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"><</span><span class="synStatement">src</span><span class="synIdentifier"> </span><span class="synType">refid</span>=<span class="synConstant">"${src.refid}"</span><span class="synIdentifier"> /></span>
<span class="synIdentifier"></</span><span class="synStatement">javac</span><span class="synIdentifier">></span>
<span class="synIdentifier"></</span><span class="synStatement">target</span><span class="synIdentifier">></span>
</pre><p>あとは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>用共通ターゲットにparamで上記で作成したパスを指定して、antcallを使って呼び出すようにする。</p>
<pre class="code lang-ant" data-lang="ant" data-unlink> <span class="synIdentifier"><</span><span class="synStatement">target</span><span class="synIdentifier"> </span><span class="synType">name</span>=<span class="synConstant">"compile.main"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">antcall</span><span class="synIdentifier"> </span><span class="synType">target</span>=<span class="synConstant">"compile"</span><span class="synIdentifier">></span>
<span class="synIdentifier"><</span><span class="synStatement">param</span><span class="synIdentifier"> </span><span class="synType">name</span>=<span class="synConstant">"src.refid"</span><span class="synIdentifier"> </span><span class="synType">value</span>=<span class="synConstant">"compile.main.src"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"><</span><span class="synStatement">param</span><span class="synIdentifier"> </span><span class="synType">name</span>=<span class="synConstant">"classpath.refid"</span><span class="synIdentifier"> </span><span class="synType">value</span>=<span class="synConstant">"compile.main.classpath"</span><span class="synIdentifier">/></span>
<span class="synIdentifier"></</span><span class="synStatement">antcall</span><span class="synIdentifier">></span>
<span class="synIdentifier"></</span><span class="synStatement">target</span><span class="synIdentifier">></span>
</pre><p>それにしても、antは引数を引き渡しが面倒くさくてしょうがない。</p>
becoming
先頭行の削除
hatenablog://entry/17680117127122019153
2007-09-27T02:04:57+09:00
2019-05-08T09:00:23+09:00 最初は、先頭行の削除だったら、headで一行目取得して、削除すりゃいいやと思ったんだが、よく考えたら、該当する行全部削除してしまう可能性がある。というわけで、普通にPerl使って、ワンライナーにするとこんな感じ。 perl -i -ne 'print if $. > 1' file でも、moreで開始地点を指定して、出力渡せば、同じことができる。 more +2 file1 > file2 でも、職場で試したときはうまくいったが、どうも家のPC(Mac OSX)だと、どうも表示上は先頭行は見えないが、バッファには先頭行ももっているみたいなので、期待した動作にはならない。 やっぱりPerlが一…
<p>最初は、先頭行の削除だったら、headで一行目取得して、削除すりゃいいやと思ったんだが、よく考えたら、該当する行全部削除してしまう可能性がある。というわけで、普通に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>使って、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EF%A5%F3%A5%E9%A5%A4%A5%CA%A1%BC">ワンライナー</a>にするとこんな感じ。</p>
<blockquote>
<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/perl">perl</a> -i -ne 'print if $. > 1' file</p>
</blockquote>
<p>でも、moreで開始地点を指定して、出力渡せば、同じことができる。</p>
<blockquote>
<p>more +2 file1 > file2</p>
</blockquote>
<p>でも、職場で試したときはうまくいったが、どうも家のPC(Mac OSX)だと、どうも表示上は先頭行は見えないが、バッファには先頭行ももっているみたいなので、期待した動作にはならない。<br />
やっぱり<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>が一番確実なのかな。</p>
becoming
出張Shibuya.js24
hatenablog://entry/17680117127122019246
2007-09-17T23:34:30+09:00
2019-05-08T09:00:24+09:00 土曜日に、出張 Shibuya.js 24に行ってきました。このところの仕事の状況的に、もやもやしていたところだったので、刺激になることが一杯でした。以下、大雑把なメモと感想。 メイントーク INSIDE Gecko (id:gyuqueさん) Firefoxで、実際の画面が描画されるまでのフローの説明。 Firefox3.0からは、すべてDisplayListによる描画になるそう。 実際のツリーが作成されていく部分を視覚化しているところが、凄かった。実際に、自分でプログラムで描画させるようにして、動かして、視覚化しているそう。 AutoPagerize (id:swdyhさん) Grease…
<p>土曜日に、<a href="http://shibuyajs.org/articles/2007/08/24/Shibuya-js-24" title="出張 Shibuya.js 24">出張 Shibuya.js 24</a>に行ってきました。このところの仕事の状況的に、もやもやしていたところだったので、刺激になることが一杯でした。</p><p>以下、大雑把なメモと感想。</p>
<div class="section">
<h4>メイン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A1%BC%A5%AF">トーク</a></h4>
<div class="section">
<h5>INSIDE <a class="keyword" href="http://d.hatena.ne.jp/keyword/Gecko">Gecko</a> (<a href="http://blog.hatena.ne.jp/gyuque/">id:gyuque</a>さん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>で、実際の画面が描画されるまでのフローの説明。</li>
<li>Firefox3.0からは、すべてDisplayListによる描画になるそう。</li>
</ul><p>実際のツリーが作成されていく部分を視覚化しているところが、凄かった。実際に、自分でプログラムで描画させるようにして、動かして、視覚化しているそう。</p>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/AutoPagerize">AutoPagerize</a> (<a href="http://blog.hatena.ne.jp/swdyh/">id:swdyh</a>さん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/GreaseMonkey">GreaseMonkey</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/AutoPagerize">AutoPagerize</a>の説明。</li>
<li>GoogleAutoPager+SITEINFO</li>
<li>機械+<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%B8%B9%E7%C3%CE">集合知</a>のパターン</li>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a>のほうで、SITEINFOを管理。</li>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a>のSITEINFOは、1日でキャッシュする作りになっている。</li>
</ul><p>セキュリティ面の質問があがっていたが、対策はする予定はないそう。基本的に、ユーザーの善意に任せる感じ。</p>
</div>
<div class="section">
<h5>新世代ブラウザのクロス開発まとめ (<a href="http://blog.hatena.ne.jp/amachang/">id:amachang</a>さん)</h5>
<ul>
<li>ContentEdditableの説明(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a>のロゴをYahooに置き換えるのを実演)。</li>
<li>オフラインの切り替えができる(セッションストレージとか、グロー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EB%A5%B9">バルス</a>トレージに私用できるのではとのこと)。</li>
<li>要素の座標が取得しやすくなる。</li>
<li>JavaScript1.8</li>
</ul><p>なぜか、Mozilla24なのに、Safari3とIE8に期待とのこと。それはさておき、ブラウザ周りはやっぱり足並みが揃わないなあという感じ。</p>
</div>
<div class="section">
<h5>JSの JSによる JSのための マルチスレッド (D.Makiさん)</h5>
<ul>
<li>マルチスレッドをトランポリンスタイルで実装</li>
<li>コードは1万3千行ぐらい</li>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>をセルフ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>して、トランポリンスタイルに書き換えることで、マルチスレッドを実現</li>
</ul><p>コードが増えて、実行速度がかなり遅くなるが、基本的に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ajax">Ajax</a>は、通信のコストの方が高いので、あまり気にしていないとのこと。<br />
詳細は、<a href="http://jsthread.sourceforge.net/">http://jsthread.sourceforge.net/</a>で。</p>
</div>
</div>
<div class="section">
<h4>Lightning Talks</h4>
<div class="section">
<h5>ECMAScript4 リファレンス実装 (Yu Kobayashiさん)</h5>
<ul>
<li>Standard-MLでリファレンス実装</li>
<li>ECMAScript3とActionScript3.0の上位互換</li>
<li>リファレンス実装は80%ぐらいで、全然使えない。</li>
<li>リファレンス策定メンバーに、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a>がいない。</li>
</ul><p>リファレンス実装には、Standard-MLが使われているのに、驚き。あと、仕様策定で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Microsoft">Microsoft</a>次第だったりするそう。<br />
リファレンス実装は、<a href="http://www.ecmascript.org/">http://www.ecmascript.org/</a>から、ダウンロードできます。</p>
</div>
<div class="section">
<h5>5分でわかる <a class="keyword" href="http://d.hatena.ne.jp/keyword/Photoshop">Photoshop</a> の正しい使いかた (<a href="http://blog.hatena.ne.jp/cho45/">id:cho45</a>さん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Photoshop">Photoshop</a>操作。</li>
<li>コマンド操作で、位置調整とか、画像の複製とか。</li>
</ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PhotoShop">PhotoShop</a>を操作するという派手なものだったので、多分一番盛り上がっていた。<br />
<iframe width="420" height="315" src="https://www.youtube.com/embed/YUdVO2qW3qA?wmode=transparent" frameborder="0" allowfullscreen></iframe></p>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>つまみぐい (<a href="http://blog.hatena.ne.jp/send/">id:send</a>さん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/jQuery">jQuery</a>の高速化部分についてのお話。</li>
<li>$関数まわりの高速化。</li>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>のキャッシュをしている。</li>
<li>引数がないときは、applyではなく、callを呼ぶことで高速化。</li>
</ul><p><iframe width="420" height="315" src="https://www.youtube.com/embed/arUUI0KldqA?wmode=transparent" frameborder="0" allowfullscreen></iframe></p>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/SHA-1">SHA-1</a>の高速化tips (へるみさん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/SHA-1">SHA-1</a>の高速化から、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Javascript">Javascript</a>の高速化についてのお話。</li>
<li>ループより、全部逐次コードを実行の方が速い。</li>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/IE">IE</a>だと、ループの際のメモリ確保が違う。</li>
</ul>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/Facebook">Facebook</a>.JS (kawa.netさん)</h5>
<ul>
<li><a class="keyword" href="http://d.hatena.ne.jp/keyword/FaceBook">FaceBook</a>アプリについて</li>
<li>まだまだFBJSには、バグが多く、なかなか使い物にならない。</li>
<li>日本語の情報が少ない。</li>
</ul>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>.GIF/USBミサイルランチャー (<a href="http://blog.hatena.ne.jp/TAKESAKO/">id:TAKESAKO</a>さん)</h5>
<ul>
<li>画像のバイナリデータの中に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Javascript">Javascript</a>を埋め込んで、実行。</li>
<li>LiveConnectで、USBミサイルランチャーを制御。</li>
<li>でも、LiveConnectは、Firefox2.0から削除される予定。</li>
</ul>
</div>
<div class="section">
<h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/ustream">ustream</a> で <a class="keyword" href="http://d.hatena.ne.jp/keyword/JSONP">JSONP</a> Loader (malaさん)</h5>
<ul>
<li>ustreamerで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%B9%A5%BF%A1%BC">はてなスター</a>使っているのに、突っ込め。というか、ソース見ろ。</li>
<li>Bloom Filter</li>
</ul>
</div>
</div>
becoming
FIFO
hatenablog://entry/17680117127122019346
2007-09-06T01:03:03+09:00
2019-05-08T09:00:25+09:00 新人の女の子に、FIFOの話を振るのはどうなのかという話を隣の人に振ったら、隣の人もよく分かってなかった。というわけで、名前付パイプを使って、説明しようとしたけど、使い方がいまいち自分でも分かってなかった...。おかげで、勉強になった。しかし、Javaから入った人だと、標準入出力周りとか、プロセスについて、疎い人が多いような気がする。まず、名前付パイプの作成。 mkfifo fifo 適当なループで、名前付パイプに書き出し。 while true; do; echo "fifo test"; done | tee fifo & あとは、tailなりで、fifoを確認。けど、ここまで書いて思った…
<p>新人の女の子に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/FIFO">FIFO</a>の話を振るのはどうなのかという話を隣の人に振ったら、隣の人もよく分かってなかった。というわけで、名前付パイプを使って、説明しようとしたけど、使い方がいまいち自分でも分かってなかった...。おかげで、勉強になった。しかし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>から入った人だと、標準入出力周りとか、プロセスについて、疎い人が多いような気がする。</p><p>まず、名前付パイプの作成。</p>
<blockquote>
<p> mkfifo <a class="keyword" href="http://d.hatena.ne.jp/keyword/fifo">fifo</a></p>
</blockquote>
<p>適当なループで、名前付パイプに書き出し。</p>
<blockquote>
<p> while true; do; echo "<a class="keyword" href="http://d.hatena.ne.jp/keyword/fifo">fifo</a> test"; done | tee <a class="keyword" href="http://d.hatena.ne.jp/keyword/fifo">fifo</a> &</p>
</blockquote>
<p>あとは、tailなりで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/fifo">fifo</a>を確認。</p><p>けど、ここまで書いて思ったが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/FIFO">FIFO</a>の実装例だけ説明して、別に名前付パイプ説明する必要ないわな。</p>
becoming
Firefoxアドオン
hatenablog://entry/17680117127122019429
2007-09-04T01:28:51+09:00
2019-05-08T09:00:26+09:00 職場のPCが起動しなくなったので、代替機に環境を移行しなくてはいけないので、備忘録がてらに。 FireBug https://addons.mozilla.org/firefox/1843/ 開発用の定番。 Tab Mix Plus https://addons.mozilla.org/firefox/1122/ Firefox2.0になってセッションマネージャがデフォルトになったおかげで、若干必要性が下がった感もあるが、とりあえず。 Live HTTP Headers ブラウザのリクエストヘッダ、サーバからのレスポンスヘッダを確認。 http://livehttpheaders.mozdev…
<p>職場のPCが起動しなくなったので、代替機に環境を移行しなくてはいけないので、備忘録がてらに。</p>
<div class="section">
<h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/FireBug">FireBug</a></h4>
<p><a href="https://addons.mozilla.org/firefox/1843/">https://addons.mozilla.org/firefox/1843/</a><br />
開発用の定番。</p>
</div>
<div class="section">
<h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Tab%20Mix%20Plus">Tab Mix Plus</a></h4>
<p><a href="https://addons.mozilla.org/firefox/1122/">https://addons.mozilla.org/firefox/1122/</a><br />
Firefox2.0になってセッションマネージャがデフォルトになったおかげで、若干必要性が下がった感もあるが、とりあえず。</p>
</div>
<div class="section">
<h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Live%20HTTP%20Headers">Live HTTP Headers</a></h4>
<p>ブラウザのリク<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%B9">エス</a>トヘッダ、サーバからのレスポンスヘッダを確認。<br />
<a href="http://livehttpheaders.mozdev.org/">http://livehttpheaders.mozdev.org/</a></p>
</div>
<div class="section">
<h4>User Agent Switcher</h4>
<p>文字通り、ユーザーエージェント切り替え。<br />
<a href="https://addons.mozilla.org/firefox/59/">https://addons.mozilla.org/firefox/59/</a></p>
</div>
<div class="section">
<h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/IE">IE</a> Tab</h4>
<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/IE">IE</a>のレンダラーで開く<br />
<a href="https://addons.mozilla.org/firefox/1419/">https://addons.mozilla.org/firefox/1419/</a></p>
</div>
<div class="section">
<h4>Text Link</h4>
<p>リンクの張られていないURLをダブルクリックで開く<br />
<a href="https://addons.mozilla.org/firefox/1939/">https://addons.mozilla.org/firefox/1939/</a></p>
</div>
<div class="section">
<h4>Html Validator</h4>
<p>HTMLのバリデートを行う。難点は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でしか使えない点。<br />
<a href="https://addons.mozilla.org/firefox/249/">https://addons.mozilla.org/firefox/249/</a></p>
</div>
<div class="section">
<h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/All-in-One%20Gestures">All-in-One Gestures</a></h4>
<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%A6%A5%B9%A5%B8%A5%A7%A5%B9%A5%C1%A5%E3">マウスジェスチャ</a>設定。個人的には、「←↑」でページの一番上、「←↓」でページの一番下にいくように設定すると、結構便利。<br />
<a href="https://addons.mozilla.org/ja/firefox/addon/12">https://addons.mozilla.org/ja/firefox/addon/12</a></p>
</div>
<div class="section">
<h4>View Cookies</h4>
<p>ページ情報に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cookie">Cookie</a>の表示項目が追加。<br />
<a href="https://addons.mozilla.org/firefox/315/">https://addons.mozilla.org/firefox/315/</a></p>
</div>
<div class="section">
<h4>Dictionary Tooltip</h4>
<p>デフォルトは英々辞書だが、あらかじめ<a class="keyword" href="http://d.hatena.ne.jp/keyword/wikipedia">wikipedia</a>とかに設定しておいても便利。<br />
<a href="https://addons.mozilla.org/firefox/1171/">https://addons.mozilla.org/firefox/1171/</a></p>
</div>
<div class="section">
<h4>Internote</h4>
<p>ブラウザの表示画面に貼れる付箋紙みたいなの。Stickiesに近い感じ。<br />
<a href="https://addons.mozilla.org/ja/firefox/addon/2011">https://addons.mozilla.org/ja/firefox/addon/2011</a></p>
</div>
<div class="section">
<h4>SwiftTab</h4>
<p>SafariStand風に「,」と「.」でタブ移動させる用。キーの上書きはURLの入力欄にも影響するので、割り当てるキーによっては、設定しないほうがよいかと。<br />
<a href="http://heygom.com/extensions/swifttabs">http://heygom.com/extensions/swifttabs</a></p>
</div>
<div class="section">
<h4>Twitterfox</h4>
<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>用アドオン。<br />
<a href="http://www.naan.net/trac/wiki/TwitterFox">http://www.naan.net/trac/wiki/TwitterFox</a></p>
</div>
becoming