<?xml version="1.0" encoding="utf-8"?>
 <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
 <title type="text">ppBlog official</title>
 <subtitle type="text">ppBlog official: Recent Entries</subtitle>
 <link rel="alternate" type="text/html" href="http://p2b.jp/" />
 <link rel="self" type="application/atom+xml" href="http://p2b.jp/feeds/atom1.0.xml" />
 <id>http://p2b.jp/</id>
 <author>
  <name>martin</name>
 </author>
 <updated>2010-08-28T00:06:58Z</updated>
 <generator uri="http://p2b.jp/" version="1.9.0b">ppBlog ver.1.9.0b</generator> 
 <rights>copyright (c) 2010 p2b.jp</rights> 

 <entry>
 <title type="text">記事アクセスランキングで勢いランキング</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/1282945798" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/1282945798</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　こんばんは、martinです。ppBlogでは、アクセス解析画面に「記事アクセ...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　こんばんは、martinです。</p>
<p>ppBlogでは、アクセス解析画面に「記事アクセスランキング」が組み込まれていますが、最新版(まだ配布していませんが)ではこれに「<strong>勢いランキング</strong>」も追加しました。<img src="http://p2b.jp/PIX/s2/1282945798_ranking.jpg" alt="ranking" width="500" height="239" /></p>
<p>　従来のアクセスランキングでは、記事のレビュー数のみでの評価なので古いエントリーの記事が上位に来やすいです。これに対して、「勢いランキング」は、理論上は、一日あたりのレビュー数（平均）になるので、最近のエントリーでも上位に来ることが出来、なんとなく流行のトレンドみたいなものが見えてきて、興味深いです。</p>
<p>　このサイトのサイドバーのメニューに「<a rel="internal" href="http://p2b.jp/pages/hot-articles-ranking/">人気記事ランキング</a>」があります。このリンクでも、ほぼ同じ内容のものを見ることが出来るので、興味ある方はどうぞ。タブ切り替えにしてみました。限られたスペースで、多くの情報を見せることができるので、使いどころによっては良いですね。</p>

  </div> 
 </content>
 <updated>2010-08-27T23:49:58+09:00</updated>
 <published>2010-08-27T23:49:58+09:00</published>
 </entry>

 <entry>
 <title type="text">FirefoxでのouterHTML</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201008-outerHTML-in-Firefox" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201008-outerHTML-in-Firefox</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　innerHTMLに比べると、outerHTMLを使う頻度はぐっと少ない。現状...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　<b>innerHTML</b>に比べると、<b>outerHTML</b>を使う頻度はぐっと少ない。現状、<b>IE</b>と <b>Safari</b>&amp;#44; <b>Chrome</b>&amp;#44; <b>Opera</b>が対応していて、未対応は<b>Firefox</b>だけ。使用頻度が低いメソッドに対して、Firefox向けに、長々しいスクリプトを書くのもどうかねぇ、と思ってググってみたところ、<a href="http://stackoverflow.com/questions/1700870/how-do-i-do-outerhtml-in-firefox/1701117#1701117">ナイスな投稿がありました</a>。</p>
<pre>sOuterHTML = new XMLSerializer().serializeToString(oElement);</pre>
<p>　確かに、これは理にかなってますね。outerHTML自体は、値の取得だけでなくて、設定も出来るんだけど、そういう場面はまずないだろうから、このgetterだけで十分ですね。</p>
<pre>&amp;lt;div id="Here"&amp;gt;Hello&amp;#44; &amp;lt;strong&amp;gt;really strange&amp;lt;/strong&amp;gt; World !&amp;lt;/div&amp;gt;</pre>
対して、<b>innerHTML</b>なら<pre>Hello&amp;#44; &amp;lt;strong&amp;gt;really strange&amp;lt;/strong&amp;gt; World !</pre>
が返されるし、<b>outerHTML</b>なら、<pre>&amp;lt;div id="Here"&amp;gt;Hello&amp;#44; &amp;lt;strong&amp;gt;really strange&amp;lt;/strong&amp;gt; World !&amp;lt;/div&amp;gt;</pre>
が返される。実装例としては、<pre>
function getOuterHTML(e) {
 if(e.outerHTML){ // IE&amp;#44; Webkit&amp;#44; Opera
  return e.outerHTML;
 } else { // Firefox (&amp;#44; Webkit&amp;#44; Opera)
  return  new XMLSerializer().serializeToString(e);
 }
};
</pre>
あるいは、短く<pre>
function getOuterHTML(e) {
  return e.outerHTML &amp;#124;&amp;#124; new XMLSerializer().serializeToString(e);
};
</pre>
とか。<div style="border-left: solid 4pt gold; margin: 2em; padding: 1em;"<button onclick="alert(getOuterHTML(this.nextSibling))">outerHTML</button><div id="Here">Hello&amp;#44; <strong>really strange</strong> World !</div>
</div><p>　実際には、Firefoxだと <b>xmlns="http://www.w3.org/1999/xhtml"</b> という属性が付加されるので、気になるようなら適宜省けば良いでしょう。</p>

  </div> 
 </content>
 <updated>2010-08-24T18:25:47+09:00</updated>
 <published>2010-08-24T18:25:47+09:00</published>
 </entry>

 <entry>
 <title type="text">ひとつの記事に複数の拡大画像がある場合</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/1282574381" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/1282574381</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　簡易画像ギャラリーのテスト。タイトルのような場合、ひとつの画像をクリックして、...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　簡易画像ギャラリーのテスト。タイトルのような場合、ひとつの画像をクリックして、拡大表示にした際に、ポップアップした画面の右端に矢印が表示される。それをクリックすると、同じ記事に含まれる次の画像を読み込む仕様。</p>
<p>　特に画像キャプションが付いている場合は、それも表示されるので、写真を主体に見せたい場合なんかには、好都合だと思います。</p>
<p><img src="http://p2b.jp/PIX/s2/1282574381_IMG_4128.jpg" alt="IMG_4128" width="500" height="334" title="サンチャゴ・コンポステーラへの道　その１" /><img src="http://p2b.jp/PIX/s2/1282574381_IMG_4095.jpg" alt="IMG_4095" width="500" height="334" title="サンチャゴ・コンポステーラへの道　その２" /><img src="http://p2b.jp/PIX/s2/1282574381_IMG_4156.jpg" alt="IMG_4156" width="500" height="334" title="サンチャゴ・コンポステーラへの道　その３" /><img src="http://p2b.jp/PIX/s2/1282574381_IMG_4078.jpg" alt="IMG_4078" width="500" height="334" title="サンチャゴ・コンポステーラへの道　その４" /></p>

  </div> 
 </content>
 <updated>2010-08-23T16:39:41+09:00</updated>
 <published>2010-08-23T16:39:41+09:00</published>
 </entry>

 <entry>
 <title type="text">画像なしで吹き出しみたいなもの</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201008-cute-baloon-without-images" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201008-cute-baloon-without-images</id>
 <category term="WEB DESIGN" label="WEB DESIGN" scheme="http://p2b.jp/category/web-design/" xml:lang="ja" />
 <category term="WEB DESIGN/CSS" label="WEB DESIGN/CSS" scheme="http://p2b.jp/category/web-design//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　この頃は、リッチなツールチップ（バルーンヘルプ）が増えてきたように思います。中...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　この頃は、リッチなツールチップ（バルーンヘルプ）が増えてきたように思います。中には、派手すぎて逆に分かりづらかったりするものもありますが、まぁそういうので遊んでみるのもたまには良いかなと思います。</p>
<p>　自分なりに実装するとしたら、どのようなものが良いか考えてみました。</p>
<div style="width: 80%; margin: 2em auto; border-left: solid 4pt gold; padding-left: 1em;"><ol>
<li> シンプルであること</li>
<li> 軽快であること</li>
<li> 吹き出しっぽく見せたいな</li>
<li> 角丸コーナーが良いな</li>
<li> 出来ればドロップシャドウぐらいは付けたい</li>
</ol></div>
<p>という感じで、矛盾をはらんだリストですが、これを実装するにはどんなが良いか考えてみました。</p>
<div style="width: 80%; margin: 2em auto; border-left: solid 4pt gold; padding-left: 1em;"><ol>
<li> シンプルであること　→　<span style="color:maroon;">画像ファイルを使わずにやれるか？</span></li>
<li> 軽快であること　→　<span style="color:maroon;">フェードなどのエフェクトはなしで</span></li>
<li> 吹き出しっぽく見せたいな　→　<span style="color:maroon;">あのニョロっとした尻尾みたいなのをどうやって作るか？</span></li>
<li> 角丸コーナーが良いな　→　<span style="color:maroon;">CSS3に対応していないIEはどうするか？</span></li>
<li> 出来ればドロップシャドウぐらいは付けたい　→　<span style="color:maroon;">同上</span></li>
</ol></div>
<p>　いつものように<b>CSS3</b>のサポートが貧弱な<b>IE</b>が足かせとなります。でも、IEでも同じように見せるために四苦八苦するのがweb開発の面白いところでしょう。画像を使わずに、角丸コーナーやドロップシャドウ効果を付けるには、IEのVMLやfilter機能を使うのが良いでしょう。</p>
<p>　角丸コーナーは、[g]VMLのroundrect[/g]を使って実現できます [参考記事： <a href="http://p2b.jp/200903-rounded-corner">VMLやSVGを用いた角丸コーナー</a> ]。ドロップシャドウは、IEのフィルター機能のひとつである<b>Blur</b>を使うことでOKです[参考記事：<a href="http://p2b.jp/200909-IE-CSS3-Dropshadow"> IEでCSS3のドロップシャドウを使いたい</a>]。問題は、吹出しには必須とも言える、あのしっぽみたいなやつですが、これはCSSのボーダー属性を使うことで可能です。トリッキーな（でも正統派）手法ですが、これに関して、レファレンスともいうべき<a href="http://www.howtocreate.co.uk/tutorials/css/slopes">サイトがあります</a>。このサイトは、以前から知っていていつか利用しようと思っていたんですが、ようやくお世話になる時が来ました[にこっ/]</p>
<p>　とりあえず、試験的なモデル（プロトタイプ）を作ってみて、それが意図したように実現可能であれば、それを自動化すべくスクリプト化という流れが良いでしょう。プロトタイプが、よさげな感じに仕上がったのでスクリーンショットをば。<img src="http://p2b.jp/PIX/s2/1282064255_cutePop.jpg" alt="cutePop" width="485" height="500" title="なかなか良い感じでは。FirefoxですがIEでもほぼ同じ。" /></p>
　<p style="margin: 1em auto 2em; padding: 0.5em; border: 2pt solid gold; width: 280px;"><a href="http://p2b.jp/demo/cutePop.html">実際のデモのページはこちら。</a></p>
　で、かなり手抜きですが、これを元にスクリプト実装したのが以下。<p style="margin: 1em auto 2em; padding: 0.5em; border: 2pt solid gold; width: 280px;"><a href="http://p2b.jp/demo/cuteTooltip.html">実際のデモのページはこちら。</a></p>
<p>　ppBlogで、これらをどれくらい採り入れるかは未定ですが、引き出しは多ければ多いほど良いでしょう[署名/]</p>

  </div> 
 </content>
 <updated>2010-08-17T18:57:35+09:00</updated>
 <published>2010-08-17T18:57:35+09:00</published>
 </entry>

 <entry>
 <title type="text">表示オンオフ制御周りの改良</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/1281709863" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/1281709863</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　ppBlogのoParts.jsにtweenアニメーションみたいな動きを取り入...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　ppBlogのoParts.jsにtweenアニメーションみたいな動きを取り入れてみました。まだ試作段階ですが、テーマ：Basicであれば、左側のサイドバーの展開や、ソーシャルブックアイコンで、ちょっとした動きをみることが出来ます。</p>
<p>　写真のポップアップにも。<img src="http://p2b.jp/PIX/s2/1281709863_IMG_0285.CR2.jpg" alt="IMG_0285" width="500" height="333" title="モン・サン・ミシェル" /></p>

  </div> 
 </content>
 <updated>2010-08-13T16:31:03+09:00</updated>
 <published>2010-08-13T16:31:03+09:00</published>
 </entry>

 <entry>
 <title type="text">メソッドチェーンで遅延処理をしたい</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201008-method-chain-with-delay" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201008-method-chain-with-delay</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　こんばんは、martinです。タイトル通りなんですが、要は以下のようなことを簡...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　こんばんは、martinです。タイトル通りなんですが、要は以下のようなことを<em>簡単に</em>実装したい。</p>
<pre>foo.<strong>await</strong>(2000).say("Hello&amp;#44; ").<strong>await</strong>(1500).say("world !");</pre>
<p>　まぁ<b>foo</b>という関数オブジェクトがあるとして、２秒後に<b>「Hello&amp;#44; 」</b>を出力して、そこで小休止、で1.5秒後に<b>「world !」</b>を出力すると。それをメソッドチェーンに拘ってやりたい。簡単な例を挙げてみます(<span style="color:#dc143c;">うまく行かないサンプルです</span>)。</p>
<pre>var foo = function(){}; // 関数オブジェクトを作成

foo.prototype = { // プロトタイプを設定
 say : function(s){
  alert(s);
  <b>return this</b>;
 }&amp;#44;
 await : function(ms){ // ここで遅延処理をゴニョゴニョしたい
  // var _this = this;
  // setTimeout(function(){
  // return _this; # まぁ、これはダメだけど、こんな感じでやれたらいい
  // }&amp;#44; ms);
   <b>return this</b>;
  }
}

var bar = new foo();
bar.await(2000).say("Hello"); // すぐに「Hello」が出力される</pre>
<p>　メソッドチェーンを実装するとなると、<b>return this;</b>をかまして、用意した関数オブジェクト自身を返すようにする必要があります。上のawait関数内で、setTimeoutを用いて遅延処理をしようと思いましたが、どうもうまい方法が思いつかず、とあるサイトで<a href="http://stackoverflow.com/questions/3424270/enabling-chained-method-using-delay">質問してみました</a>。すると、数分後(!)に返答があって、「<strong>それ、jQueryで出来るよっ！</strong>」と[zzz/]（そのコメントは今は消されたようなんですが)　まぁ確かにそうなんですが（なのであえて<strong>.delay</strong>という単語を選んだ）何かすごい技があって、それで解決！みたいなことを期待していたわけです（jQueryを使わずに）。</p>
<p>　２つ目に付いたコメントで、簡単に済ませる方法はなくて、何か別のキューシステム(待ち行列システム？)を用意する必要があるよ、と。やっぱりそうか。で、沢山ヒントを頂いたんで、自分なりに作ってみました。次のようなキューシステムを用意しました。</p>
<pre>
Queue = {
 entries : []&amp;#44; // 関数を登録する配列を用意
 inprocess : null&amp;#44;
 enqueue : function(entry){ // 関数を登録する
  Queue.entries.push(entry);
 }&amp;#44;
 flush : function(){ // 配列に登録された関数群を一気に実行
  if(Queue.inprocess) return; // 「待ち中」なら実行しない
  while (Queue.entries.length){
   var entry = Queue.entries.shift(); // 配列の頭から取り出す（つまり登録順）
   if(entry.toString().indexOf('await:') !== -1){ // 「待ち」のマークを見つけたら
    var ms = Number(entry.split(':')[1]);
    Queue.inprocess = setTimeout(function(){
     Queue.inprocess = null;
     Queue.flush(); // 指定時間後に処理を再開
    }&amp;#44; ms);
    return;
   }
   entry(); // 取り出された関数を実行
  }
 }
}</pre>
　こいつを最初のサンプルに適用すると以下のような感じになります。<pre>var foo = function(){};

foo.prototype = {
 say : function(s){
  Queue.enqueue(function(){ // 配列に関数を登録
   alert(s);
  });
  Queue.flush();
  return this;
 }&amp;#44;
 await : function(ms){
  Queue.enqueue('await:' + ms); // 配列に「await:2000」みたいなマークを登録
  return this;
 }
}</pre>
<p>　自分のスキルではこの程度です[zzz/] キューシステムに頼らずに自己完結できる目から鱗な手法がないですかねぇ。</p>
<p>とりあえず動作サンプルを以下に。ボタンを押すと、</p>
<pre>var bar = new foo();
 bar.await(1500).say('Hello&amp;#44; ').await(2000).say('world!');</pre>
ってのが実行されます。ここでは、ボタンを押して1.5秒後に「Hello&amp;#44; 」、更に２秒後に「world !」とボタンの右側に表示されます。<div style="margin: 2em auto; padding: 1em; border: solid 2pt gold;">
<button type="button" onclick="sayHello()">遅延実行</button><span id="H" style="font: bold 16pt Arial; padding-left: 1em;"></span>
</div>
　何か、「こうしたらいいよ」とかのアドバイスあればよろしくお願いします。
  </div> 
 </content>
 <updated>2010-08-08T01:29:59+09:00</updated>
 <published>2010-08-08T01:29:59+09:00</published>
 </entry>

 <entry>
 <title type="text">IEでもCSS3ドロップシャドウのアップデート</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201008-IE-compatible-CSS3-dropShadow" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201008-IE-compatible-CSS3-dropShadow</id>
 <category term="WEB DESIGN" label="WEB DESIGN" scheme="http://p2b.jp/category/web-design/" xml:lang="ja" />
 <category term="WEB DESIGN/CSS" label="WEB DESIGN/CSS" scheme="http://p2b.jp/category/web-design//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　こんばんは、martinです。以前、IEでもCSS3のドロップシャドウ（tex...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　こんばんは、martinです。以前、IEでもCSS3のドロップシャドウ（<strong>text-shadow</strong>や<strong>box-shadow</strong>）を使いたいということで、それを可能にするスクリプトを<a href="http://p2b.jp/200909-IE-CSS3-Dropshadow">書きました</a>。</p>
<p>　で、<a href="http://p2b.jp/1253331309#CID1280722486">コメント</a>で、<b>IE7</b>以下では、<b>text-align:center</b>を指定すると影がすごくズレるというご指摘をいただきました（<b>IE8</b>では問題ない）。調べてみると、どうも「<span style="color:#800000;">text-align:centerの指定が内包されるボックス要素にも適用されてしまう</span>」という、懐かしいIEのバグが原因のようなので、それを修正しました。ついでに、画面のリサイズ（<b>window.onresize</b>）にも対応させました。以下のスクリーンショットのように、Firefox3.6など今時のブラウザに引けを取らない感じで、ボックスシャドウやテキストシャドウが可能になります。<img src="http://p2b.jp/PIX/s2/1280874963_Firefox3.6.jpg" alt="Firefox3" width="485" height="500" title="Firefox3.6でのスクリーンショット。ChromeやOperaでもほぼ同じ。" /><img src="http://p2b.jp/PIX/s2/1280874963_IE7-compatible.jpg" alt="IE7-compatible" width="500" height="335" title="IE8で、後方互換モード（IE7相当）表示。遜色ないレベルで再現。" /></p>
<p style="margin: 1em auto 2em auto; padding: .5em; border: solid 2pt gold; width: 580px;">実際のデモのページはこちら。→http://p2b.jp/demo/CSS3dropshadow.html</p>
<p>　使い方は簡単で、CSS3なページのHEAD要素内に、IE（IE9未満）だけ読み込むような外部JavaScript（実態はHTCファイル）を記述するだけです。最新版を添付しておきますね。</p>
<pre>
 &amp;lt;!--[if lt IE 9]&amp;gt;
  &amp;lt;script type="text/javascript" src="path/to/css3shadow.htc"&amp;gt;&amp;lt;/script&amp;gt;
 &amp;lt;![endif]--&amp;gt;
</pre>
<p>　デモページにもありますが、<b>box-shadow</b>の<b>inset</b>（内側ドロップシャドウ）や複数のtext-shadow指定にも対応しています。</p>
<p><img src="http://p2b.jp/PIX/s2/1280874963_Box-shadow-inset.jpg" alt="Box-shadow-inset" width="500" height="284" title="IE7互換モードでの表示。まぁ悪くない。" /></p>
<p>　スクリプト自体はそんなに凝ってるわけではないのですが、あまり気合の入った指定をしなければ、それなりに動いてくれるかなと思います [署名/]<a href="http://p2b.jp/index.php?mode=download&amp;aim=1280874963_css3shadow.htc" title="ダウンロード:7.6 KB">[ファイル1280874963_css3shadow.htc]</a></p>

  </div> 
 </content>
 <updated>2010-08-04T00:36:03+09:00</updated>
 <published>2010-08-04T00:36:03+09:00</published>
 </entry>

 <entry>
 <title type="text">IE8でのHTML5要素有効化あれこれ</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201007-various-HTML5-enabling-scripts" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201007-various-HTML5-enabling-scripts</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　もう7月も終わりですね、martinです。相変わらず時の流れは速いもので。　こ...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　もう7月も終わりですね、martinです。相変わらず時の流れは速いもので。</p>
　このサイトのブログの基本テーマ（スキン）「Basic」では、試験的に<b>HTML5</b>を導入しています。HTML5では新しい要素が<a href="http://www.w3.org/TR/html5-diff/#new-elements">いくつか追加</a>されていますが、<b>IE9</b>未満のブラウザでは、<b>article</b>や<b>header</b>&amp;#44; <b>nav</b>などのクールで新しい要素に対するスタイルシート指定が効かない、という事が昔から知られています。これに対するアプローチとして、 <b>document.createElement</b>を使うとスタイルシートでの指定が可能になるよ、というのがよく知られています。初出は <a href="http://intertwingly.net/blog/2008/01/22/Best-Standards-Support#c1201006277">Sjoerd Visscher</a>さんあたりでしょうかねぇ。<pre>document.createElement(”article”); // 未知の要素articleに対してIEでもCSS指定が可能になる</pre>
<p>　このdocument.createElementを使うテクニックは、いろんなところで見かけることができて、有名どころでは、Remy sharp氏の<a href="http://remysharp.com/2009/01/07/html5-enabling-script/">html5.js</a>あたりですね。</p>
<p>　もっとも、このテクニックを使っただけでは、IEでHTML5化を効かせたページを印刷したときまでは反映されないので、これに対しては、<a href="http://www.iecss.com/print-protector/">IE Print Protector </a>がよく知られていると思います（<span style="color:gray;">個人的には、印刷のサポートまではあまり興味がありませんが</span>）。</p>
<p>　で、このcreateElementを使うテクニックは、ベタに書けば以下のような感じになります。</p>
<pre>// ここでは簡潔化のため、以下の6個の新要素に絞ってます。
&amp;lt;!--[if lt IE 9]&amp;gt;
var html5_elements = ["header"&amp;#44; "nav"&amp;#44; "article"&amp;#44; "section"&amp;#44; "aside"&amp;#44; "footer"]; 
for (var i = 0&amp;#44; len = html5_elements.length; i &gt; len; i++){
 document.createElement(html5_elements[i]); // 各要素に適用
}
&amp;lt;![endif]--&amp;gt;</pre>
　どこで最初に見かけたのか失念しましたが、これを一行（ワンライナー）で簡潔に済ませたスクリプトを見たときはいたく感心しました。<a href="http://dean.edwards.name/weblog/">Dean Edwards氏のブログ</a>もこうなっています。<pre>"header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".replace(/&amp;yen;w+/g&amp;#44; function(a){document.createElement(a)});</pre>
　上のポイントは、replaceメソッドの引数に関数を指定できて、その関数内では、正規表現にマッチした要素を適宜適用していく点です。ループみたいなことを勝手にやってくれる点ですね。おそらくこれ以上短くは書けないのではないかと思うのですが、息抜きに自分なりにいくつか考えてみました。<pre>"header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;').sort(function(a){return document.createElement(a)*1});</pre>
　これも、似たような発想からですね。自動でなんかやってくれるという。<pre>with("header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;')))while(length)document.createElement(pop());</pre>
　ここでは<b>with</b>構文を使ってみました。これもなかなかシンプルです。同じくwithと、<b>Enumerator</b>を使って、<pre>with(new Enumerator("header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;')))for(;!atEnd();moveNext())document.createElement(item());</pre>
　これは、ちょっと長いし、<a href="http://msdn.microsoft.com/en-us/library/6ch9zb09%28VS.85%29.aspx">Enumerator Object</a>はマイナーですかね。<p>　短さ命で、グローバル変数の汚染なんて気にしないぜっ、という向きには以下のようなものもありかと思います。</p>
<pre>s="header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;');while(s[0])document.createElement(s.pop());</pre>
<p>　<b>for</b>文関連では、</p>
<pre>for(i in s="header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;'))document.createElement(s[i]);</pre>
とか<pre>for(i=0;n="header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;')[i++];document.createElement(n));</pre>
とかですかねぇ。<p>　ちなみに、配列を作るのに、文字列に<b>split()</b>をかませるというのは、よく見かける手法です。ここでの、6個ぐらいの要素数ではあまり差は出ませんが、要素数が増えてくると、逐一ダブルクォート（or シングルクォート）で括っていくやり方と大きく差が付いてきます。</p>
<pre>var html5_elements = ["header"&amp;#44; "nav"&amp;#44; "article"&amp;#44; "section"&amp;#44; "aside"&amp;#44; "footer"]; // これより
var html5_elements = "header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".split('&amp;#44;'); // こっちが記述が短い </pre>
<p>　正規表現から配列も出来ますね。</p>
<pre>var html5_elements = "header&amp;#44;nav&amp;#44;article&amp;#44;section&amp;#44;aside&amp;#44;footer".match(/&amp;yen;w+/g);</pre>
<p>　以上、トリビアルなエントリーでした[署名/]</p>

  </div> 
 </content>
 <updated>2010-07-31T05:18:59+09:00</updated>
 <published>2010-07-31T05:18:59+09:00</published>
 </entry>

 <entry>
 <title type="text">HTML5 FileAPIの不満な点</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201007-inflexible-HTML5-File-API" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201007-inflexible-HTML5-File-API</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/JavaScript" label="開発日誌/JavaScript" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　こんにちは、martinです。なかなかまとまった時間が取れないので、ppBlo...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　こんにちは、martinです。なかなかまとまった時間が取れないので、ppBlogの最新版をリリースできずにいます[zzz/]</p>
<p>　最新版のバージョンとしては、<strong>v1.9.0</strong>を予定しています。新機能としては、<span style="color:maroon;">コメント認証機能</span>だとか、HTML5を意識したppBlogエンジンでしょうか（ちなみにテーマBasicのソースはHTML5仕様ですよ）。</p>
<p>　で、この<b>HTML5</b>なんですが。過去のエントリーでいくつかあるように、最新版では、記事投稿の際に複数ファイルアップロードが可能になっています。HTML5の<a href="https://developer.mozilla.org/en/DOM/File">FileAPI</a>を積極的に採り入れたものにしようか、それとも「レガシーな」もので実現させるか迷いましたが、とりあえず「レガシー」なバージョンで行こうと思います。理由はいくつかありますが、一番の理由は、どうもHTML5のFileAPIの使い勝手が悪い点です。</p>
<p>　ブログでの写真投稿において、一度に複数枚の写真を選択してアップロードできる点は、HTML5を使う魅力のひとつですが、この「<em>複数枚のファイルを選択</em>」というのが、どうも洗練されていない印象です。例えば、アップする写真を複数枚決めてそれをアップロードする場合を考えてみます。頭の中では、大まかに写真をのせる順番が決まっていて、ファイル選択画面から、コントールキー（<kbd>CTRL</kbd>）を押しながら、順序良く写真をいくつか選んだとします。最新のブラウザなら以下のように、<b>multiple</b>を指定するだけで、この複数枚選択という動作が可能になります。</p>
<pre>&amp;lt;input type="file" name="src[]" <strong>multiple</strong> /&amp;gt;</pre>
<p>でも、残念なことに、この<em>選んだ順序</em>というのは、<a href="https://developer.mozilla.org/en/DOM/FileList">FileList</a>には<span style="font-size: 16pt;">反映されない</span>のです。否応なしに、ファイル選択画面上で表示されている通りの順序になるようです。何か、選んだ順序を紐付けするような属性が欲しくなります。</p>
<p>　<strong>もうひとつ</strong>。選んだ複数枚のファイルは、FileList配列に収められて、あたかも配列のようにDOM操作が可能ですが、この配列は、<b>readonly</b>、つまり<a href="http://www.w3.org/TR/FileAPI/#dfn-filelist">読み取り専用</a>のようです。たとえば、ちょっと余分に画像を選んじゃったよ、という場合に、その余分なファイルだけをリストから除きたいというケースは、間違いなく出てくると思いますが、そういう操作は出来ないようです。再度、すべてのファイルを選び直す必要があります。これは、ユーザーには使い勝手が悪いですね。</p>
<p>　というわけで、上記の理由により、ppBlogでは<strong>W3C FileAPI</strong>の積極的な採用は見送りました。でも、HTML5に頼らずとも、一度に複数枚のファイルのアップロードは可能です。<b>Stickman</b>さんが、2005年に、すでにそういうギミックを<a href="http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/">見付けていました</a>。最初見たときは、目から鱗でした。やってることはすごくシンプルなんですが、まさにコロンブスの卵ですね。で、彼のスクリプトは、ppBlogにはちょっと冗長でしたので、参考にしつつ、ppBlog仕様にしました。実際のデモを見てみましょう。尚、デモでは「アップロード」ボタンは、文字通りただのボタンなので、実際にはファイルはアップロードされませんが、雰囲気は十分に伝わると思います。</p>
<p style="margin: 1.5em auto 2em auto; font-size: 16px; text-align: center; border-left: solid 4px gold; "> レガシーな複数ファイルアップロードのデモ →http://p2b.jp/demo/EasyFileUpload.html</p>
<p>　また、Firefox最新版など、File APIに十分対応しているブラウザでは、選んだ画像をサムネイル表示するようにしています。Firefoxだと以下のようなスクリーンショットです。Firefox以外では、普通に選んだ画像のファイル名が選んだ順にリスト表示されます。</p>
<p><img src="http://p2b.jp/PIX/1280233709_MFU-shot.png" alt="MFU-shot" width="500" height="361" title="Firefox3.6でのスクリーンショットです。" /></p>
<p>この部分のスクリプトは以下の感じ。</p>
<pre> if(window.File &amp;&amp; window.FileList &amp;&amp; window.FileReader){ // FileAPIに対応しているなら
  var file = el.files[0];
  if(file.type.match(/image.*/)){
   var reader = new FileReader(); // FileReader オブジェクト!
   reader.onload = function(){
    var span = d.createElement("span");
    span.innerHTML = '&amp;lt;img class="thumb" src="' + this.result + '" alt="preview" /&amp;gt; (' + Math.round(file.size / 1000) + ' KB)';
    li.insertBefore(span&amp;#44; li.lastChild);
   };
   reader.readAsDataURL(file); // 画像データの読み込み
  }
 }</pre>
<p>　レガシーなインターフェイスですが、任意のリストを削除出来ますし、HTML5仕様より却って高機能（＝使い勝手が良い）な気がします。</p>
<p>　ちなみに、デモのソースを見ていただけると分かりますが、<b>INPUT[type=file]</b>要素に、レガシーに<b>onchange</b>イベントハンドラを仕込んでいます。document.addEventListerで監視しても良いのですが、IEでは、onchangeイベントがバブルしないようで[うーむ/]</p>
<p style="color: #777; margin: 2.5em auto;">　余談ですが、「目から鱗」の語源は、新約聖書の「使徒行伝（しとぎょうでん）」中のエピソード、見えなくなっていた<a href="http://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A6%E3%83%AD">パウロ</a>（サウロ）の目からうろこのようなもの（コンタクトレンズ？）が外れて再度見えるようになったという「パウロの回心」からですね。「豚に真珠」と同様、日本とか中国由来と思いきや、新約聖書からの諺です。</p>

  </div> 
 </content>
 <updated>2010-07-27T14:28:29+09:00</updated>
 <published>2010-07-27T14:28:29+09:00</published>
 </entry>

 <entry>
 <title type="text">短縮URLの元を知る　その２</title>
 <link rel="alternate" type="text/html" href="http://p2b.jp/201006-rollout-shorten-url-part2" />
 <author>
   <name>martin</name>
 </author>
 <id>http://p2b.jp/201006-rollout-shorten-url-part2</id>
 <category term="開発日誌" label="開発日誌" scheme="http://p2b.jp/category/developement/" xml:lang="ja" />
 <category term="開発日誌/PHP" label="開発日誌/PHP" scheme="http://p2b.jp/category/developement//" xml:lang="ja" />
 <summary type="text" xml:lang="ja">　こんにちは。前回のエントリーのコメントで「生ログ」の「リンク元」にも「expa...</summary>
 <content type="xhtml" xml:lang="ja">
  <div xmlns="http://www.w3.org/1999/xhtml">
   <p>　こんにちは。前回のエントリーのコメントで「生ログ」の「リンク元」にも「expand」アイコンをとの要望がありましたので、そうしました。ついでに、短縮URLのサービスホストを判定するロジックの精度を少しばかり高めました。単に、文字列の長さのみで判定すると、<b>p2b</b>(笑)だとか、<b>twitter</b>とかも短縮URLサイトと判定してしまうので。</p>
<p>　具体的には、ホワイトリストのホスト名を配列で指定するようにして、そうでなければ「expand」アイコンを付けるという感じです。現状、以下のようになっていますが、適宜追加しても良いでしょう。</p>
<pre>&amp;#36;not_shortening_hosts = array('twitter'&amp;#44; 'www'&amp;#44; 'p2b');</pre>
<p>　これは、view.phpの78行目で指定しています。</p>
<p>　ブラックリスト方式でやろうとすると、どうやら<a href="http://code.google.com/p/shortenurl/wiki/URLShorteningServices">100以上のサイト</a>を指定する必要がありそうで、ちょっとシャレになりません。</p>
<p>　最新版を添付しておきます。<a href="http://p2b.jp/index.php?mode=download&amp;aim=1276620033_view.php" title="ダウンロード:45.6 KB">[ファイル1276620033_view.php]</a></p>

  </div> 
 </content>
 <updated>2010-06-15T18:40:33+09:00</updated>
 <published>2010-06-15T18:40:33+09:00</published>
 </entry>

</feed>