<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="http://d.hatena.ne.jp/os0x/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/os0x/rss">
<title>0xFF</title>
<link>http://d.hatena.ne.jp/os0x/</link>
<description>0xFF</description>

<dc:creator>os0x</dc:creator>
<dc:date>2012-02-11T09:49:12+09:00</dc:date>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://d.hatena.ne.jp/os0x/20111024/1319474699"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/os0x/20111004/1317719921"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/os0x/20110626/1309108647"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/os0x/20110621/1308627048"/>
<rdf:li rdf:resource="http://d.hatena.ne.jp/os0x/20110617/1308280740"/>
</rdf:Seq>
</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/os0x/20111024/1319474699">
<title>WEB+DB PRESS Vol.65にCoffeeScriptの記事を書きました</title>
<link>http://d.hatena.ne.jp/os0x/20111024/1319474699</link>
<description> WEB+DB PRESS Vol.65｜gihyo.jp … 技術評論社 今回は「CoffeeScriptから学ぶJavaScriptプラクティス」と題して、CoffeeScriptが生成するJavaScriptについて、どうしてこういったJavaScriptになるのかという点を中心に解説しました。 CoffeeScriptには様々なJavaScriptの(バ</description>

<content:encoded><![CDATA[
<div class="section">
<p><a href="http://gihyo.jp/magazine/wdpress/archive/2011/vol65">WEB+DB PRESS Vol.65｜gihyo.jp … 技術評論社</a></p>
<p>今回は「CoffeeScriptから学ぶJavaScriptプラクティス」と題して、CoffeeScriptが生成するJavaScriptについて、どうしてこういったJavaScriptになるのかという点を中心に解説しました。</p>
<p>CoffeeScriptには様々なJavaScriptの(バッド)ノウハウが詰め込まれています。生成されるJavaScriptを読んでいると、「やっぱりそうなるよね」と思わせることが多くてニヤニヤしてしまいます。</p>
<p>そもそも、CoffeeScriptは生成されるJavaScriptの読みやすさにかなり気を使っている点が、CoffeeScriptを気に入っている一番の理由です。(その点、Dartは…)</p>
<p>今回も結構苦労しましたが、なかなか面白い記事に仕上がったと思うので、手にとって頂ければ幸いです。</p>
<div class="hatena-asin-detail">
  <a href="http://www.amazon.co.jp/dp/477414830X/?tag=hatena_st1-22&ascsubtag=d-nyjn"><img src="http://ecx.images-amazon.com/images/I/51dLc08hXZL._SL160_.jpg" class="hatena-asin-detail-image" alt="WEB+DB PRESS Vol.65" title="WEB+DB PRESS Vol.65"></a>
  <div class="hatena-asin-detail-info">
    <p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/dp/477414830X/?tag=hatena_st1-22&ascsubtag=d-nyjn">WEB+DB PRESS Vol.65</a></p>
    <ul>
      
      <li><span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/%C5%B7%BF%D2%BA%B8%C0%D0" class="keyword">天尋左石</a>,<a href="http://d.hatena.ne.jp/keyword/%CA%C1%C2%F4%C1%EF%C2%C0%CF%BA" class="keyword">柄沢聡太郎</a>,<a href="http://d.hatena.ne.jp/keyword/%BE%AE%CC%EE%BD%A4%BB%CA" class="keyword">小野修司</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C3%A5%AF" class="keyword">ミック</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%DF%A4%E4%A4%B1%A4%F3" class="keyword">みやけん</a>,<a href="http://d.hatena.ne.jp/keyword/%C4%B9%CC%EE%B2%ED%B9%AD" class="keyword">長野雅広</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%CB%A4%BF%A4%DE" class="keyword">おにたま</a>,<a href="http://d.hatena.ne.jp/keyword/%C3%E6%C5%E7%C1%EF" class="keyword">中島聡</a>,<a href="http://d.hatena.ne.jp/keyword/%C0%B6%BF%E5%CE%BC" class="keyword">清水亮</a>,<a href="http://d.hatena.ne.jp/keyword/%B3%D1%C5%C4%C4%BE%B9%D4" class="keyword">角田直行</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%DE%A4%C1%A4%E42" class="keyword">はまちや2</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%E7%C4%CD%B9%B0%B5%AD" class="keyword">大塚弘記</a>,<a href="http://d.hatena.ne.jp/keyword/%BE%BE%BF%AE%B2%C5%C8%CF" class="keyword">松信嘉範</a>,<a href="http://d.hatena.ne.jp/keyword/%C8%C4%B3%C0%B5%AE%CD%B5" class="keyword">板垣貴裕</a>,<a href="http://d.hatena.ne.jp/keyword/%CA%A1%B2%AC%C7%EE" class="keyword">福岡博</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%E7%CF%C2%C5%C4%BD%E3" class="keyword">大和田純</a>,<a href="http://d.hatena.ne.jp/keyword/%C7%F2%C5%DA%B7%C5" class="keyword">白土慧</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%C0%C5%C4%BE%BB%B8%E3" class="keyword">太田昌吾</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%B8%A4%E5%A4%F3%A4%A4%A4%C1%A1%F9%A4%AB%A4%C8%A4%A6" class="keyword">じゅんいち☆かとう</a>,<a href="http://d.hatena.ne.jp/keyword/WEB%2BDB%20PRESS%CA%D4%BD%B8%C9%F4" class="keyword">WEB+DB PRESS編集部</a></li>
      
      <li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%B5%BB%BD%D1%C9%BE%CF%C0%BC%D2" class="keyword">技術評論社</a></li>
      
      <li><span class="hatena-asin-detail-label">発売日:</span> 2011/10/22</li>
                                                      <li><span class="hatena-asin-detail-label">メディア:</span> 大型本</li>
      <li><span class="hatena-asin-detail-label">購入</span>: 11人 <span class="hatena-asin-detail-label">クリック</span>: 131回</li>
      <li><a href="http://d.hatena.ne.jp/asin/477414830X" target="_blank">この商品を含むブログ (8件) を見る</a></li>
    </ul>
  </div>
  <div class="hatena-asin-detail-foot"></div>
</div>

</div>
]]></content:encoded>
<dc:creator>os0x</dc:creator>
<dc:date>2011-10-25T01:44:59+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/os0x/20111004/1317719921">
<title>IE8のレンダリングモードと特定文字列によるクラッシュバグ</title>
<link>http://d.hatena.ne.jp/os0x/20111004/1317719921</link>
<description> こんにちは、だいぶ久しぶりなブログ更新です。昨日、IE8のおもしろバグを発見してしまったので、さらしものにみなさんと共有したいと思います。 早速今回のバグの再現コードをみてみましょう。 &#60;!DOCTYPE html&#62;&#1835;&#60;br&#62;１日 再現ページ たったこれだけ</description>

<content:encoded><![CDATA[
<div class="section">
<p>こんにちは、だいぶ久しぶりなブログ更新です。昨日、IE8のおもしろバグを発見してしまったので、<del>さらしものに</del>みなさんと共有したいと思います。</p>
<p>早速今回のバグの再現コードをみてみましょう。</p>
<p><pre class="syntax-highlight"><span class="synComment">&#60;!DOCTYPE html&#62;</span><span class="synSpecial">&#1835;</span><span class="synIdentifier">&#60;</span><span class="synStatement">br</span><span class="synIdentifier">&#62;</span>１日</pre></p>
<p><a href="http://dl.dropbox.com/u/21313342/ie-text-bug.html">再現ページ</a></p>
<p>たったこれだけです。JavaScriptはおろか、CSSすらありません。ただのHTMLです。これだけでIE8の標準モードのレンダリングが壊れ、強制的に互換モードにフォールバックされます。</p>
<p>さらに次のようにmetaタグ(もしくはレスポンスヘッダ)でX-UA-CompatibleにIE=8やIE=edgeを指定して、標準モードでのレンダリングを強制していた場合はフォールバックが働かないので真っ白なページが表示されてしまいます。</p>
<p><pre class="syntax-highlight"><span class="synComment">&#60;!DOCTYPE html&#62;</span><br><span class="synIdentifier">&#60;</span><span class="synStatement">meta</span><span class="synIdentifier"> </span><span class="synType">http-equiv</span><span class="synIdentifier">=</span><span class="synConstant">"X-UA-Compatible"</span><span class="synIdentifier"> </span><span class="synType">content</span><span class="synIdentifier">=</span><span class="synConstant">"IE=8"</span><span class="synIdentifier">&#62;</span><span class="synSpecial">&#1835;</span><span class="synIdentifier">&#60;</span><span class="synStatement">br</span><span class="synIdentifier">&#62;</span>１日<br><span class="synIdentifier">&#60;</span><span class="synStatement">p</span><span class="synIdentifier">&#62;</span>IE8では真っ白なページになる</pre></p>
<p><a href="http://dl.dropbox.com/u/21313342/ie-text-bug-edge.html">再現ページ(IE=Edge指定)</a></p>
<p>このバグはIE8(正確にはWindows XPのIE8)だけで発生しており、IE6, 7, 9などでは発生しません。IE9のIE8モードでも発生しないので、MS的には修正済みなのか、たまたま直ったのかは、よくわかりません。</p>
<p>ちなみに、&#1835;というのはWindowsでは<a href="http://f.hatena.ne.jp/os0x/20111004181507" class="hatena-fotolife"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/os0x/20111004/20111004181507.png" alt="f:id:os0x:20111004181507p:image" title="f:id:os0x:20111004181507p:image" class="hatena-fotolife"></a>のように表示され、<a href="http://f.hatena.ne.jp/os0x/20111004181508" class="hatena-fotolife"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/os0x/20111004/20111004181508.png" alt="f:id:os0x:20111004181508p:image" title="f:id:os0x:20111004181508p:image" class="hatena-fotolife"></a>のような顔文字によく使われています。これと１日のような普通の文字の組み合わせで発生するので、実際に起こり得る組み合わせです。</p>
<p>今回は、このバグが発生するページと発生しないページの差分からなんとか原因を特定できましたが、正直予想し得ないバグですね。もっと追えば、より短い文字列で発生するかもしれませんし、全く別の文字列パターンでも発生するかもしれません。その辺は文字コードやWindows・IEのアレコレに詳しい方に勝手に期待しています。</p>
</div>
]]></content:encoded>
<dc:creator>os0x</dc:creator>
<dc:date>2011-10-04T18:18:41+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/os0x/20110626/1309108647">
<title>AutoPatchWorkのサーバー周りのこと</title>
<link>http://d.hatena.ne.jp/os0x/20110626/1309108647</link>
<description> 地味に色々と調整しているのでまとめておきます。見よう見まねの継ぎ接ぎばかりですが…。 AutoPatchWorkはwedata(About - wedata)のAutoPagerize用SITEINFOを使わせて頂いていますが、wedataのサーバーは負荷に弱いので、SITEINFOは自前のサーバー(といっても安心のheteml</description>

<content:encoded><![CDATA[
<div class="section">
<p>地味に色々と調整しているのでまとめておきます。見よう見まねの継ぎ接ぎばかりですが…。</p>
<p>AutoPatchWorkはwedata(<a href="http://wedata.net/help/about">About - wedata</a>)のAutoPagerize用SITEINFOを使わせて頂いていますが、wedataのサーバーは負荷に弱いので、SITEINFOは自前のサーバー(といっても安心のhetemlですが)に置いています。</p>
<p>hetemlサーバーでcronを設定して1時間に1回、SITEINFOを更新するようにしていて、AutoPatchWorkユーザーは一日に1回hetemlサーバーからSITEINFOを取得しています。</p>
<p>ただ、AutoPagerizeのSITEINFOは2MB近くあるので、1万人が毎日アクセスしたら転送量が20GBに達します(全員が毎日更新にくるわけではないので、実際はもっと少ないですが)。hetemlの転送量は「目安として 1日 20GB まで」(2011年6月27日時点。ちなみに以前は10GBだった)で、ChromeのAutoPatchWorkユーザーだけで6万人以上いるので余裕でアウトです(といっても、一度問い合わせてみたところ、目安を超えたら即制限がかかるようなことはないそうです)。</p>
<p>ただ、容量を節約するポイントは色々あって、まずオリジナルのSITEINFOは次のようなJSONデータです。</p>
<pre class="syntax-highlight">
<span class="synIdentifier">{</span>
  <span class="synConstant">&#34;name&#34;</span>: <span class="synConstant">&#34;Google Search&#34;</span>,
  <span class="synConstant">&#34;resource_url&#34;</span>: <span class="synConstant">&#34;http:</span><span class="synSpecial">\/\/</span><span class="synConstant">wedata.net</span><span class="synSpecial">\/</span><span class="synConstant">items</span><span class="synSpecial">\/</span><span class="synConstant">472&#34;</span>,
  <span class="synConstant">&#34;updated_at&#34;</span>: <span class="synConstant">&#34;2011-04-24T23:09:52+09:00&#34;</span>,
  <span class="synConstant">&#34;created_by&#34;</span>: <span class="synConstant">&#34;swdyh&#34;</span>,
  <span class="synConstant">&#34;database_resource_url&#34;</span>: <span class="synConstant">&#34;http:</span><span class="synSpecial">\/\/</span><span class="synConstant">wedata.net</span><span class="synSpecial">\/</span><span class="synConstant">databases</span><span class="synSpecial">\/</span><span class="synConstant">AutoPagerize&#34;</span>,
  <span class="synConstant">&#34;data&#34;</span>: <span class="synIdentifier">{</span>
    <span class="synConstant">&#34;pageElement&#34;</span>: <span class="synConstant">&#34;id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">search</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/</span><span class="synConstant">div[ol or div]|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">res</span><span class="synSpecial">\&#34;</span><span class="synConstant">)[not(@role)]</span><span class="synSpecial">\/</span><span class="synConstant">div[ol or div]|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">ofr</span><span class="synSpecial">\&#34;</span><span class="synConstant">)&#34;</span>,
    <span class="synConstant">&#34;url&#34;</span>: <span class="synConstant">&#34;^https?:</span><span class="synSpecial">\/\/</span><span class="synConstant">[^.</span><span class="synSpecial">\/</span><span class="synConstant">]+</span><span class="synSpecial">\\</span><span class="synConstant">.google(?:</span><span class="synSpecial">\\</span><span class="synConstant">.[^.</span><span class="synSpecial">\/</span><span class="synConstant">]{2,3}){1,2}</span><span class="synSpecial">\/</span><span class="synConstant">(?:c(?:se|ustom)|search|webhp|#)&#34;</span>,
    <span class="synConstant">&#34;nextLink&#34;</span>: <span class="synConstant">&#34;id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">pnnext</span><span class="synSpecial">\&#34;</span><span class="synConstant">)|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">navbar navcnt nav</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/\/</span><span class="synConstant">td[span]</span><span class="synSpecial">\/</span><span class="synConstant">following-sibling::td[1]</span><span class="synSpecial">\/</span><span class="synConstant">a|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">nn</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/</span><span class="synConstant">parent::a&#34;</span>,
    <span class="synConstant">&#34;exampleUrl&#34;</span>: <span class="synConstant">&#34;http:</span><span class="synSpecial">\/\/</span><span class="synConstant">www.google.com</span><span class="synSpecial">\/</span><span class="synConstant">search?q=AutoPagerize</span><span class="synSpecial">\r\n</span><span class="synConstant">http:</span><span class="synSpecial">\/\/</span><span class="synConstant">www.google.com</span><span class="synSpecial">\/</span><span class="synConstant">cse?cref=http%3A%2F%2Fwww.guha.com%2Fcref_cse.xml&#38;q=firefox&#38;sa=Search&#38;siteurl=www.google.co.jp%2Fcse%2Fdocs%2Fcref.html</span><span class="synSpecial">\r\n</span><span class="synConstant">http:</span><span class="synSpecial">\/\/</span><span class="synConstant">www.google.co.jp</span><span class="synSpecial">\/</span><span class="synConstant">custom?q=firefox</span><span class="synSpecial">\r\n</span><span class="synConstant">http:</span><span class="synSpecial">\/\/</span><span class="synConstant">www.google.com</span><span class="synSpecial">\/</span><span class="synConstant">webhp?hl=en#hl=en&#38;expIds=17259,18167,25901,25980,26440,26459,26512&#38;sugexp=ldymls&#38;tok=So3knfbAtc2kJy-W-lXiWw&#38;xhr=t&#38;q=autopagerize&#38;cp=10&#38;pf=p&#38;sclient=psy&#38;safe=off&#38;site=webhp&#38;aq=f&#38;aqi=g5&#38;aql=&#38;oq=autopageri&#38;gs_rfai=&#38;pbx=1&#38;fp=6052204b889acdd8&#34;</span>
  <span class="synIdentifier">}</span>,
  <span class="synConstant">&#34;created_at&#34;</span>: <span class="synConstant">&#34;2008-04-16T12:35:37+09:00&#34;</span>
<span class="synIdentifier">}</span>
</pre>

<p>実際に使うのはdataの中身で、さらにexampleUrlなどはデバッグ用なので、普段は使用しません。つまり、こうできます。</p>
<pre class="syntax-highlight">
<span class="synIdentifier">{</span>
<span class="synConstant">&#34;pageElement&#34;</span>: <span class="synConstant">&#34;id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">search</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/</span><span class="synConstant">div[ol or div]|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">res</span><span class="synSpecial">\&#34;</span><span class="synConstant">)[not(@role)]</span><span class="synSpecial">\/</span><span class="synConstant">div[ol or div]|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">ofr</span><span class="synSpecial">\&#34;</span><span class="synConstant">)&#34;</span>,
<span class="synConstant">&#34;url&#34;</span>: <span class="synConstant">&#34;^https?:</span><span class="synSpecial">\/\/</span><span class="synConstant">[^.</span><span class="synSpecial">\/</span><span class="synConstant">]+</span><span class="synSpecial">\\</span><span class="synConstant">.google(?:</span><span class="synSpecial">\\</span><span class="synConstant">.[^.</span><span class="synSpecial">\/</span><span class="synConstant">]{2,3}){1,2}</span><span class="synSpecial">\/</span><span class="synConstant">(?:c(?:se|ustom)|search|webhp|#)&#34;</span>,
<span class="synConstant">&#34;nextLink&#34;</span>: <span class="synConstant">&#34;id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">pnnext</span><span class="synSpecial">\&#34;</span><span class="synConstant">)|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">navbar navcnt nav</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/\/</span><span class="synConstant">td[span]</span><span class="synSpecial">\/</span><span class="synConstant">following-sibling::td[1]</span><span class="synSpecial">\/</span><span class="synConstant">a|id(</span><span class="synSpecial">\&#34;</span><span class="synConstant">nn</span><span class="synSpecial">\&#34;</span><span class="synConstant">)</span><span class="synSpecial">\/</span><span class="synConstant">parent::a&#34;</span>
<span class="synIdentifier">}</span>
</pre>

<p>これだけで1.9MBから715KBまで節約できます(ただ、元のデータを引けなくなるので、IDだけ追加しています)。結構節約できますが、まだ3万ユーザー程度しかカバーできません。</p>
<p>これにgzipを加えてみます。cronバッチの中でgzファイルを静的に作成して、.htaccessで次のように指定します。</p>
<pre>
RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}&#92;.gz -s
RewriteRule ^(.+)$ $1.gz
AddEncoding x-gzip .gz
</pre>


<ol>
<li>Accept-Encodingにgzipが含まれていて、</li>
<li>リクエストされたファイル名+.gzなファイルが存在したら、</li>
<li>URLを.gzつきに書き換え、</li>
<li>ファイルタイプをjsonとして強制する</li>
</ol>
<p>という指定です。</p>
<p>AddEncoding x-gzip .gz はレスポンスヘッダにContent-Encoging: gzipをつけて、ブラウザにgzipとして解釈させるようにしている(のだと思うのですが、あまり自信ない…)</p>
<p>gzip効果で、1.9MBのファイルは355KBに、715KBのファイルは152KBまで節約されます。</p>
<p>152KBならすくなくとも13万ユーザーまで大丈夫です。</p>
<p>実際、今のところ1日の転送量は8GB程度に抑えられています。</p>
<p>ついでにhetemlがmod_expiresにも対応していたので、ExpiresByTypeなんかも加えて、 <a href="http://ss-o.net/json/">http://ss-o.net/json/</a> の .htaccess はこんな感じになっています。</p>
<pre>
Options +Indexes
Header append Access-Control-Allow-Origin: &#42;

ExpiresActive on
ExpiresByType application/json &#34;access plus 12 hours&#34;
ExpiresByType application/x-javascript &#34;access plus 2 days&#34;
&#60;Files ~ &#34;&#92;.json&#34;&#62;
  ForceType &#34;application/json; charset=utf-8&#34;
&#60;/Files&#62;

RewriteEngine on
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}&#92;.gz -s
RewriteRule ^(.+)$ $1.gz
AddEncoding x-gzip .gz

IndexIgnore .htaccess &#42;.bak &#42;.gz
IndexOptions FancyIndexing HTMLTable NameWidth=&#42; XHTML
</pre>

</div>
]]></content:encoded>
<dc:creator>os0x</dc:creator>
<dc:date>2011-06-27T02:17:27+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/os0x/20110621/1308627048">
<title>WEB+DB PRESS Vol.63からJavaScriptの連載始めました</title>
<link>http://d.hatena.ne.jp/os0x/20110621/1308627048</link>
<description> WEB+DB PRESS Vol.63｜gihyo.jp … 技術評論社 id:uupaaさんの後任な感じで、JavaScript周りのホットな話題・最新情報を中心に、書いていこうと思っています。 初回は例によってデバッグ周りの話を書きました。といってもまだブログでは触れていないスマートフォンでのデバ</description>

<content:encoded><![CDATA[
<div class="section">
<p><a href="http://gihyo.jp/magazine/wdpress/archive/2011/vol63">WEB+DB PRESS Vol.63｜gihyo.jp … 技術評論社</a></p>
<p><a href="http://d.hatena.ne.jp/uupaa/">id:uupaa</a>さんの後任な感じで、JavaScript周りのホットな話題・最新情報を中心に、書いていこうと思っています。</p>
<p>初回は例によってデバッグ周りの話を書きました。といってもまだブログでは触れていないスマートフォンでのデバッグ方法や、<a href="http://d.hatena.ne.jp/os0x/20110120/1295546286"> prototype.jsからjQueryに移行するたったひとつの冴えたやりかた - 0xFF</a>でちょっとだけ触れたonerrorの具体的な使い方などを解説しています。よろしければ手にとってみてください。<ins>って発売は24日でした…紛らわしい書き方してしまってごめんなさい。。</ins></p>
<div class="hatena-asin-detail">
  <a href="http://www.amazon.co.jp/dp/4774146781/?tag=hatena_st1-22&ascsubtag=d-nyjn"><img src="http://ecx.images-amazon.com/images/I/6185vgv12hL._SL160_.jpg" class="hatena-asin-detail-image" alt="WEB+DB PRESS Vol.63" title="WEB+DB PRESS Vol.63"></a>
  <div class="hatena-asin-detail-info">
    <p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/dp/4774146781/?tag=hatena_st1-22&ascsubtag=d-nyjn">WEB+DB PRESS Vol.63</a></p>
    <ul>
      
      <li><span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/%C3%DD%C7%F7%CE%C9%C8%CF" class="keyword">竹迫良範</a>,<a href="http://d.hatena.ne.jp/keyword/%CF%C2%C5%C4%C2%EE%BF%CD" class="keyword">和田卓人</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%B8%A4%E5%A4%F3%A4%A4%A4%C1%A1%F9%A4%AB%A4%C8%A4%A6" class="keyword">じゅんいち☆かとう</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%C0%C5%C4%BE%BB%B8%E3" class="keyword">太田昌吾</a>,<a href="http://d.hatena.ne.jp/keyword/%BE%AE%CC%EE%BD%A4%BB%CA" class="keyword">小野修司</a>,<a href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C3%A5%AF" class="keyword">ミック</a>,<a href="http://d.hatena.ne.jp/keyword/%C5%E8%C5%C4%CD%B5%C6%F3" class="keyword">嶋田裕二</a>,<a href="http://d.hatena.ne.jp/keyword/%B8%C4%A1%B9%B0%EC%C8%D6" class="keyword">個々一番</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%DF%A4%E4%A4%B1%A4%F3" class="keyword">みやけん</a>,<a href="http://d.hatena.ne.jp/keyword/%C0%B6%BF%E5%CE%BC" class="keyword">清水亮</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%AA%A4%CB%A4%BF%A4%DE" class="keyword">おにたま</a>,<a href="http://d.hatena.ne.jp/keyword/%C3%E6%C5%E7%C1%EF" class="keyword">中島聡</a>,<a href="http://d.hatena.ne.jp/keyword/%B3%D1%C5%C4%C4%BE%B9%D4" class="keyword">角田直行</a>,<a href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%DE%A4%C1%A4%E42" class="keyword">はまちや2</a>,<a href="http://d.hatena.ne.jp/keyword/%BE%E5%C3%AB%CE%B4%B9%A8" class="keyword">上谷隆宏</a>,<a href="http://d.hatena.ne.jp/keyword/%C0%C4%CC%DA%BD%D3%B2%F0" class="keyword">青木俊介</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%E7%C4%CD%C3%CE%CD%CE" class="keyword">大塚知洋</a>,<a href="http://d.hatena.ne.jp/keyword/%C0%B8%C8%F8%B9%E4%BB%CE" class="keyword">生尾剛士</a>,<a href="http://d.hatena.ne.jp/keyword/%C2%E7%CF%C2%C5%C4%BD%E3" class="keyword">大和田純</a>,<a href="http://d.hatena.ne.jp/keyword/WEB%2BDB%20PRESS%CA%D4%BD%B8%C9%F4" class="keyword">WEB+DB PRESS編集部</a></li>
      
      <li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%B5%BB%BD%D1%C9%BE%CF%C0%BC%D2" class="keyword">技術評論社</a></li>
      
      <li><span class="hatena-asin-detail-label">発売日:</span> 2011/06/24</li>
                                                      <li><span class="hatena-asin-detail-label">メディア:</span> 大型本</li>
      <li><span class="hatena-asin-detail-label">購入</span>: 18人 <span class="hatena-asin-detail-label">クリック</span>: 404回</li>
      <li><a href="http://d.hatena.ne.jp/asin/4774146781" target="_blank">この商品を含むブログ (22件) を見る</a></li>
    </ul>
  </div>
  <div class="hatena-asin-detail-foot"></div>
</div>

<h4>あわせて読みたい</h4>
<div class="hatena-asin-detail">
  <a href="http://www.amazon.co.jp/dp/4873114934/?tag=hatena_st1-22&ascsubtag=d-nyjn"><img src="http://ecx.images-amazon.com/images/I/51-ThZ6FRfL._SL160_.jpg" class="hatena-asin-detail-image" alt="ウェブオペレーション ―サイト運用管理の実践テクニック" title="ウェブオペレーション ―サイト運用管理の実践テクニック"></a>
  <div class="hatena-asin-detail-info">
    <p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/dp/4873114934/?tag=hatena_st1-22&ascsubtag=d-nyjn">ウェブオペレーション ―サイト運用管理の実践テクニック</a></p>
    <ul>
      
      <li><span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/John%20Allspaw" class="keyword">John Allspaw</a>,<a href="http://d.hatena.ne.jp/keyword/Jesse%20Robbins" class="keyword">Jesse Robbins</a>,<a href="http://d.hatena.ne.jp/keyword/%B3%D1%C0%AC%C5%B5" class="keyword">角征典</a></li>
      
      <li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%A5%AA%A5%E9%A5%A4%A5%EA%A1%BC%A5%B8%A5%E3%A5%D1%A5%F3" class="keyword">オライリージャパン</a></li>
      
      <li><span class="hatena-asin-detail-label">発売日:</span> 2011/05/14</li>
                                                      <li><span class="hatena-asin-detail-label">メディア:</span> 大型本</li>
      <li><span class="hatena-asin-detail-label">購入</span>: 9人 <span class="hatena-asin-detail-label">クリック</span>: 818回</li>
      <li><a href="http://d.hatena.ne.jp/asin/4873114934" target="_blank">この商品を含むブログ (39件) を見る</a></li>
    </ul>
  </div>
  <div class="hatena-asin-detail-foot"></div>
</div>

<div class="hatena-asin-detail">
  <a href="http://www.amazon.co.jp/dp/4798029599/?tag=hatena_st1-22&ascsubtag=d-nyjn"><img src="http://ecx.images-amazon.com/images/I/41eQ1UKh7JL._SL160_.jpg" class="hatena-asin-detail-image" alt="NoSQLデータベースファーストガイド" title="NoSQLデータベースファーストガイド"></a>
  <div class="hatena-asin-detail-info">
    <p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/dp/4798029599/?tag=hatena_st1-22&ascsubtag=d-nyjn">NoSQLデータベースファーストガイド</a></p>
    <ul>
      
      <li><span class="hatena-asin-detail-label">作者:</span> <a href="http://d.hatena.ne.jp/keyword/%BA%B4%A1%B9%CC%DA%C3%A3%CC%E9" class="keyword">佐々木達也</a></li>
      
      <li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a href="http://d.hatena.ne.jp/keyword/%BD%A8%CF%C2%A5%B7%A5%B9%A5%C6%A5%E0" class="keyword">秀和システム</a></li>
      
      <li><span class="hatena-asin-detail-label">発売日:</span> 2011/04</li>
                                                      <li><span class="hatena-asin-detail-label">メディア:</span> 大型本</li>
      <li><span class="hatena-asin-detail-label">購入</span>: 7人 <span class="hatena-asin-detail-label">クリック</span>: 759回</li>
      <li><a href="http://d.hatena.ne.jp/asin/4798029599" target="_blank">この商品を含むブログ (20件) を見る</a></li>
    </ul>
  </div>
  <div class="hatena-asin-detail-foot"></div>
</div>

</div>
]]></content:encoded>
<dc:creator>os0x</dc:creator>
<dc:date>2011-06-21T12:30:48+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/os0x/20110617/1308280740">
<title>君は3つのリロードを知っているか？</title>
<link>http://d.hatena.ne.jp/os0x/20110617/1308280740</link>
<description> はい、今さら聞けないウェブ開発者の基礎知識のお時間です。 ブラウザには3つの読み込みモードがあることはご存知ですか？ 2つくらいはわかるけど、3つ目が出てこないって方は少なくないかもしれません。 リロード 一番オーソドックスなのがブラウザのリロードボタンを押し</description>

<content:encoded><![CDATA[
<div class="section">
<p>はい、今さら聞けないウェブ開発者の基礎知識のお時間です。</p>
<p>ブラウザには3つの読み込みモードがあることはご存知ですか？</p>
<p>2つくらいはわかるけど、3つ目が出てこないって方は少なくないかもしれません。</p>

<ol>
<li>リロード

<ul>
<li>一番オーソドックスなのがブラウザのリロードボタンを押したときの挙動ですね。普通ですね。</li>
</ul>
</li>
<li>スーパーリロード

<ul>
<li>ブラウザによっては、スーパーリロードという機能を備えています。IEの場合Ctrl+F5(Ctrl+更新ボタン)、Firefoxの場合Ctrl+F5(Shift+更新ボタン)、Chromeの場合Shift+更新ボタン(Ctrl+Shift+R)などでスーパーリロードを呼び出すことができます。スーパーですね。</li>
</ul>
</li>
<li>ページ遷移(リフレッシュ)

<ul>
<li>3つ目はちょっと良い名前が思いつかないのですが、リロードではなく、通常の画面遷移での読み込みのことです。アドレスバーにフォーカスしてenterするといった方法で実現できます。むしろこれこそが普通です。</li>
</ul>
</li>
</ol>
<p><a href="http://d.hatena.ne.jp/edvakf/">id:edvakf</a>さん曰く、Operaにはリクエストを投げずに更新するRefresh Displayというアクションがあるらしい。確かにリフレッシュというのは適切な名前な気がする。</p>
<p>それぞれどう違うのか、特に1つ目と3つ目はどう違うのか不思議でしょうか？</p>
<p>ちゃんとリクエストの様子を眺めてみると違いがよく分かります。</p>
<h4>リロード</h4>
<p><a href="http://f.hatena.ne.jp/os0x/20110617120324" class="hatena-fotolife"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/os0x/20110617/20110617120324.png" alt="f:id:os0x:20110617120324p:image" title="f:id:os0x:20110617120324p:image" class="hatena-fotolife"></a></p>
<h4>スーパーリロード</h4>
<p><a href="http://f.hatena.ne.jp/os0x/20110617120326" class="hatena-fotolife"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/os0x/20110617/20110617120326.png" alt="f:id:os0x:20110617120326p:image" title="f:id:os0x:20110617120326p:image" class="hatena-fotolife"></a></p>
<h4>ページ遷移</h4>
<p><a href="http://f.hatena.ne.jp/os0x/20110617120325" class="hatena-fotolife"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/o/os0x/20110617/20110617120325.png" alt="f:id:os0x:20110617120325p:image" title="f:id:os0x:20110617120325p:image" class="hatena-fotolife"></a></p>
<p>リロードは大元のHTMLを受け取ったら、そのページ内のリソースについてレスポンスヘッダを確認しに行っています。その結果304 Not Modifiedが帰ってきて、実際にはキャッシュを使っています。</p>
<p>対してスーパーリロードはキャッシュに関係なく、すべてのリソースを取得しなおしています。</p>
<p>そしてページ遷移時は、キャッシュがあり、Expireが効いている場合はそもそもリクエストを送っていません。完全にローカルキャッシュだけを使っています。</p>
<p>(ちなみに、ページを進んで(ブラウザの戻る機能で)戻ったときは大元のHTMLを含めてキャッシュが使われたりします。)</p>
<p>なお、当然ですがすべてのブラウザがこの3つのモードを持っているわけではありません。Operaにはスーパーリロードに相当する手段がなさそう(知らないだけかもしれませんが)だったりします。</p>
<p>というわけで、3つのリロードの違いを意識して、開発時に使い分けるのがウェブ開発者のたしなみです。</p>
</div>
]]></content:encoded>
<dc:creator>os0x</dc:creator>
<dc:date>2011-06-17T12:19:00+09:00</dc:date>
</item>
</rdf:RDF>

