<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Like@Lunatic &#187; JavaScript</title>
	<atom:link href="http://likealunatic.jp/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://likealunatic.jp</link>
	<description>Naoki Sekiguchi&#039;s personal Web site.</description>
	<lastBuildDate>Sun, 05 Feb 2012 01:46:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JavaScriptの変数についての考察</title>
		<link>http://likealunatic.jp/2011/06/js_variable.php</link>
		<comments>http://likealunatic.jp/2011/06/js_variable.php#comments</comments>
		<pubDate>Mon, 06 Jun 2011 11:25:10 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/?p=753</guid>
		<description><![CDATA[最近、Code Complete第2版という本を読んでいて、「変数の使用（第10章）」がとても為になる内容だったので、会社のチームメンバーに少しそのことについて話したら、JavaScriptについて興味深い話をすることができた。 <a href="http://likealunatic.jp/2011/06/js_variable.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近、<a href="http://www.amazon.co.jp/gp/product/489100455X/ref=as_li_qf_sp_asin_tl?ie=UTF8&#038;tag=likealunatic-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=489100455X">Code Complete第2版</a><img src="http://www.assoc-amazon.jp/e/ir?t=likealunatic-22&#038;l=as2&#038;o=9&#038;a=489100455X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />という本を読んでいて、「変数の使用（第10章）」がとても為になる内容だったので、会社のチームメンバーに少しそのことについて話したら、JavaScriptについて興味深い話をすることができた。</p>

<p>第10章の内容について、議論の対象となった部分を引用する。</p>

<blockquote>
<h3>10.3 変数の初期化のガイドライン</h3>
<h4>変数は最初に使用する場所の近くで初期化する</h4>
<section>
<h5>リスト10-2: 悪い初期化（Visual Basic）</h5>
<pre><code>' すべての変数を宣言する
Dim accountIndex As Integer
Dim total As Double
Dim done As Boolean

' すべての変数を初期化する
acountIndex = 0;
total = 0.0
done = False
...

' accountIndexを使用するコード
...

' totalを使用するコード
...

' doneを使用するコード
While Not done
...</code></pre>
</section>
&#8230;中略
<p>リスト10-2の例では、done変数を宣言した後、done変数を使用するコードが実行されるまでに、done変数が変更される可能性がある。</p>
&#8230;中略
<p>もう1つの問題は、すべての初期化を1か所にまとめると、done変数は最後の方でしか使用されないにもかかわらず、すべての変数がルーチン全体で使用されるという印象を与えることだ。</p>
&#8230;中略
<p>これは、「関連する作業を1つにまとめる」という近接の法則の一例である。</p>
</blockquote>

<p>なるほどなるほど。しかし僕は普段の業務でプログラミング言語らしきものはJavaScriptしか使わないので、JavaScriptに置き換えて考えよう。</p>

<pre><code>var accountIndex = 0,
    total = 0,
    done = false;
// accountIndexを使用するコード
...

// totalを使用するコード
...

// doneを使用するコード
while(!done) {
    
}
...</code></pre>

<p>これが本書で「悪い例」とされているコードをJavaScriptに置き換えたコードだ。しかし関数の先頭で <code>var hoge = 0, fuga = false;</code> のようにして変数をまとめて宣言（＆初期化）するのはJavaScriptではよく見られるコードだ。あの<a href="http://code.jquery.com/jquery-1.6.1.js">jQuery</a>ですらそのような記法を多用している。<br />
<a href="http://www.amazon.co.jp/gp/product/4873113911/ref=as_li_tf_tl?ie=UTF8&#038;tag=likealunatic-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4873113911">JavaScript: The Good Parts</a><img src="http://www.assoc-amazon.jp/e/ir?t=likealunatic-22&#038;l=as2&#038;o=9&#038;a=4873113911" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />によると</p>

<blockquote>
<p>ほとんどの言語では、変数は一般的に最初に利用される場所で定義するのが最も良い方法だ。しかしこれは、ブロックスコープを持たないJavaScriptでは好ましくない。すべての変数は、それぞれの関数の先頭で定義したほうが良い。</p>
</blockquote>

<p>とある。そう、JavaScriptはブロックスコープを持たない（{}でくくられた部分限定の変数スコープ）といういわゆる変態言語であり、変数のスコープを生成するのは関数ブロックのみだ。それが理由で、変数はまとめて関数の先頭で宣言するという記法がベストプラクティスとされている。</p>

<p>さてしかし、Code Complete第2版による「変数は最初に使用する場所の近くで初期化する」ほうがよいという理屈の続きはこうだ。</p>

<blockquote>
<h4>10.4.1 変数の参照はまとめて</h4>
<p>変数を参照してから次に参照するまでのコードは、「脆弱性の窓」（無防備な時間帯）である。その窓では、新しいコードが追加されたり、何気なく変数が変更されたり、変数に含まれていなければならない値が忘れられてしまったりする。変数の参照は、常に近いところにまとめて局所化するのが望ましい。</p>
&#8230;中略
<p>これを測定する方法は、変数の「<strong>持続間隔</strong>」を計算することである。</p>
&#8230;中略
<section>
<h5>リスト10-6: 1と0の持続間隔（Java）</h5>
<pre><code>a = 0;
b = 0;
c = 0;
b = a + 1;
b = b / c;</code></pre>
</section>
<p>この場合、bの1つ目の参照と2つ目の参照の間にコードが1行あるので、その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、<del>その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、</del>その持続間隔は0である。</p>
&#8230;中略
<p>リスト10-6では、bの<strong>平均持続間隔</strong>は (1 + 0) / 2 = 0.5 である。変数の参照を近くにまとめると、コードの読み手がコードをセクションごとに読んでいけるようになる。</p>
&#8230;中略
<br />
<h4>10.4.2 変数の「寿命」はできるだけ短く</h4>
<p>変数の持続間隔に関連して、変数の「<strong>寿命</strong>」という概念がある。変数の寿命とは、変数が存続する期間内に存在するステートメントの合計である。</p>
&#8230;中略
<p>変数の持続間隔とは異なり、変数の寿命は、最初に参照されてから最後に参照されるまでの変数の使用回数を計算に入れない。変数が最初に1行目で参照され、最後に25行目で参照された場合、変数の寿命は25（ステートメント）である。</p>
&#8230;中略
<p>変数の持続間隔と同様に、変数の寿命もできるだけ短くする、つまりステートメントの数を少なくすることが目標となる。持続間隔と同様に、ステートメントの数を少なくすると、脆弱性の窓が小さくなるという利点がある。</p>
&#8230;中略
<p>寿命を短くするもう1つの利点は、コードを正確に把握できることである。変数に10行目で値を代入し、45行目まで使用しない場合、2つの参照の間に空いている空間は、変数がその間に使用されていることを暗示する。</p>
&#8230;中略
<p>変数の寿命が短いと、コードが読みやすくなる。読み手が一度に頭に入れなければならないコードの行数が少なければ少ないほど、コードは理解しやすい。</p>
</blockquote>

<p>変数には「<strong>平均持続間隔</strong>」と「<strong>寿命</strong>」という概念があるという。そしてそれらが短くなった方がコードの読み手にとって読みやすいコードになるという。</p>

<p>去年、僕がとある案件で数千行に及ぶJavaScriptを書いた際、最も頭を悩ませたのはコードを頭に入れることだった。機能を追加・修正するために一度に頭に入れなければならないコードが多すぎたため、開発が進めば進む程、コードの修正は困難を極めた。</p>

<p>プログラミング初心者が誰しも一度はぶつかる壁なのかもしれない。コードの分割をはじめとする、コードの設計の重要性を肌で感じた瞬間だった。<br />
だからこそ、上記の「読み手が一度に頭に入れなければならないコードの行数が少なければ&#8230;」というくだりに深く納得したのだった。</p>

<p>さて、ではJavaScriptにおいて「<strong>変数の寿命を短くする</strong>」ことと「<strong>関数の先頭ですべての変数を宣言する</strong>」ことは両立するのだろうか？これについて隣席の<a href="http://twitter.com/keiskey">@keiskey</a>の意見はこうだった。</p>

<blockquote>関数1つの長さ自体を短くしてしまうのがいいのでは。<a href="http://code.google.com/intl/ja/closure/library/">Google Closure Library</a>のコードを見ていると、中身が2行しかないメソッドに長々とした名前が付いていたりする。そんな長い名前を付けるんだったら直接コードを書いてしまえばいいやん、と思うけど、「変数の寿命」のポリシーをもって書かれていると考えると合点がいく。</blockquote>

<p>なるほど&#8230;と再び納得するとともに、「この話、共有してよかった」と思った。</p>

<p>例えば上述（リスト10-2）のコードを一つの関数だと考えるとこうなる。</p>

<pre><code>function Account() {
    var accountIndex = 0,
        total = 0,
        done = false;
    // accountIndexを使用するコード
    ...

    // totalを使用するコード
    ...

    // doneを使用するコード
    while(!done) {
        
    }
    ...
}</code></pre>

<p>この関数をクラス風に書き直し、機能分割するとこういう感じになる。</p>

<pre><code>function Account() {
    // コンストラクタ
    ...
}
Account.prototype = {
    getAccountIndex: function() {
        var accountIndex = 0;
        // accountIndexを使用するコード
        ...
        return accountIndex;
    },
    getTotal: function() {
        var total = 0;
        // totalを使用するコード
        ...
        return total;
    },
    checkStatus: function() {
        var done = false;
        // doneを使用するコード
        while(!done) {
            ...
        }
    }
}</code></pre>

<p>prototypeにぶら下げたメソッド1つ1つを短くまとめて上手に機能分割することが、限りなく正解に近いのではないかと思った次第。</p>

<p>僕はプログラマと呼ばれる職種ではないのだけれど、プログラミングに関わる人間として、こういった考察はとてもおもしろいと感じる。また何か同じような話があったら書いていきたい。</p>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2011/06/js_variable.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSONがinvalidでもjQuery.getJSON()はエラーを吐かない</title>
		<link>http://likealunatic.jp/2010/05/getjson.php</link>
		<comments>http://likealunatic.jp/2010/05/getjson.php#comments</comments>
		<pubDate>Fri, 21 May 2010 05:51:13 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/?p=681</guid>
		<description><![CDATA[記事のタイトルで言いたいことは言い切っちゃているんですけれども。 jQuery 1.4.2 の $.getJSON() 、もしくは $.ajax() でリクエストしたJSONファイルがinvalidだった場合、エラーは吐 &#8230; <a href="http://likealunatic.jp/2010/05/getjson.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>記事のタイトルで言いたいことは言い切っちゃているんですけれども。<br />
jQuery 1.4.2 の <a href="http://api.jquery.com/jQuery.getJSON/">$.getJSON()</a> 、もしくは <a href="http://api.jquery.com/jQuery.ajax/">$.ajax()</a> でリクエストしたJSONファイルがinvalidだった場合、エラーは吐きませんが<strong>コールバック関数が実行されません</strong>。</p>

<p class="ref"><a href="http://forum.jquery.com/topic/jquery-getjson-callback-not-firing-12-1-2010">[jQuery] getJSON callback not firing? &#8211; jQuery Forum</a></p>

<p>なんでinvalidなのかと調べたところ・・・、JSONでは文字列は必ずダブルクォートで囲まないといけないことが判りました。シングルクォートではダメです。それからオブジェクトリテラルの左のオペランドにも、ダブルクォート省略不可！あー、なんか初歩的なところでつまづいています。</p>

<blockquote cite="http://json.org/">
<p>A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. </p>
<p class="site"><a href="http://json.org/">http://json.org/</a></p>
</blockquote>

<p>何しろエラーが出ないので、何が悪いのかわかりにくいです＞＜ これで2時間はハマってしまった・・・。。</p>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2010/05/getjson.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhoneのiPodアプリ風見出しインターフェースをJSで作ってみた</title>
		<link>http://likealunatic.jp/2009/11/08_iphoneh.php</link>
		<comments>http://likealunatic.jp/2009/11/08_iphoneh.php#comments</comments>
		<pubDate>Sun, 08 Nov 2009 03:10:53 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2009/11/iphone%e3%81%aeipod%e3%82%a2%e3%83%97%e3%83%aa%e9%a2%a8%e8%a6%8b%e5%87%ba%e3%81%97%e3%82%a4%e3%83%b3%e3%82%bf%e3%83%bc%e3%83%95%e3%82%a7%e3%83%bc%e3%82%b9%e3%82%92js%e3%81%a7%e4%bd%9c%e3%81%a3.php</guid>
		<description><![CDATA[iPhoneにプリインストールしてあるiPodアプリのインターフェースを再現するJavaScriptです。要jQuery。 <a href="http://likealunatic.jp/2009/11/08_iphoneh.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昨日の<a href="http://twitter.com/Sugamo_css">Sugamo.css</a>で発表したコネタをポストします。</p>

<p><a href="http://likealunatic.jp/sample/iphoneh/">デモ：iPhoneのiPodアプリ風のインターフェースを再現するJS</a><br />
<a href="http://likealunatic.jp/sample/iphoneh/iphoneh.js">JSファイル：iPhoneのiPodアプリ風のインターフェースを再現するJS</a></p>

<p>これはiPhoneにプリインストールしてあるiPodアプリのインターフェースを再現するJavaScriptです。要jQuery。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="スクリーンショット：iPhoneのiPod風のインターフェースを再現するJS" src="http://likealunatic.jp/images/2009/11/08_iphonehss.gif" width="400" height="250" class="mt-image-none" style="" /></span></p>

<p>iPodアプリで曲目リストやアーティストのリストを閲覧する際、「あ行」「か行」「さ行」みたいに並んでいるリストをスクロールしていくと、「あ行」のリストを見ているときは「あ」という見出しが画面上部に固定され、現在見ているリストがどの見出しに属するものなのかが見て分かるようになっています。つまり見出しがスクロールアウトされず、スクロールに着いてくる形になっているわけです。おそらく、一つのリストがとても長い場合は特に効果を発揮するかと思います。地味ですが確実にユーザビリティは向上するだろうという、粋な効果です。さすがApple。<br />
何を言っているかよく分からない、という人はとりあえずデモを見てください・・・。</p>

<p><span id="more-99"></span></p>

<div class="section">
<h3>使い方</h3>
<p>(X)HTMLは「見出し＋リスト（内容）＋それらを包むDIV」っていう構造になっていればOKです。内容部分はリストじゃなくても可。デモだと下記のようになっています。</p>
<pre><code>&lt;div class=&quot;genre&quot;&gt;
&lt;h3 class=&quot;header&quot;&gt;&lt;span&gt;A&lt;/span&gt;&lt;/h3&gt;
&lt;div class=&quot;body&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Aで始まるアーティスト&lt;/li&gt;
&lt;li&gt;Aで始まるアーティスト&lt;/li&gt;
&lt;li&gt;Aで始まるアーティスト&lt;/li&gt;
&lt;li&gt;Aで始まるアーティスト&lt;/li&gt;
&lt;li&gt;Aで始まるアーティスト&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>必要なJSファイルを読み込んだ後、<br />
<code>$(対象の見出しを指定するセレクタ).iphoneH();</code><br />
をドキュメントロード後に呼び出すように記述します。</p>
<pre><code>&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;iphoneh.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function() {
$('h3.header').iphoneH();
});
&lt;/script&gt;</code></pre>
<p>理屈を言えば、親DIVを基準に、見出しを<code>position:absolute</code>にして<code>top</code>の値をscrollイベントでいじっています。</p>
<p>見出しや内容部分は適当にスタイリングしましょう。デモだと元ネタが分かりやすいようにiPodアプリ風にまんまスタイリングしました。見出し部分に透過pngを使っていますが、IE6対策でどうのこうのとかはやっていません。</p>
<p>他のデザインに当てはめたときに正常に動くかはよく分からないです。多分その辺に突っ込みどころはたくさんあると思いますが（以下略</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2009/11/08_iphoneh.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LightBox系スクリプト 16選</title>
		<link>http://likealunatic.jp/2009/06/24_lightbox16.php</link>
		<comments>http://likealunatic.jp/2009/06/24_lightbox16.php#comments</comments>
		<pubDate>Tue, 23 Jun 2009 16:10:36 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Lightbox]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2009/06/lightbox%e7%b3%bb%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97%e3%83%88-16%e9%81%b8.php</guid>
		<description><![CDATA[Lightbox系スクリプトの情報が一覧表になっているThe Lightbox Clones Matrixという素晴らしいサイトがあります。ここから自分なりに一通り見て回って、クオリティ的に使えそうなものをピックアップしてみました。 <a href="http://likealunatic.jp/2009/06/24_lightbox16.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Lightbox系スクリプトの情報が一覧表になっている<a href="http://planetozh.com/projects/lightbox-clones/">The Lightbox Clones Matrix</a>という素晴らしいサイトがあります。ここから一通り見て回って、自分なりに使えそうなものをピックアップしてみました。<del datetime="2009-06-25">ほとんど勢いでまとめたものなので、情報としての正確性は低いかもしれませんが、ご容赦を。</del>半分は自分用ってノリです。</p>

<p>自分はLightbox系のスクリプトを選ぶ時、そのサイトに予め組み込まれている（組み込む予定の）JSライブラリで使えるかどうかを基準に選ぶことが多いです。なので、必要とするJSライブラリ別にカテゴライズして並べています。</p>

<div class="section">
<h3>ライブラリ不要</h3>
<div class="section">
<h4><a href="http://highslide.com/">Highslide JS</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/highslidejs.jpg"><img alt="Highslide JS" src="http://likealunatic.jp/assets_c/2009/06/highslidejs-thumb-300x240-67.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>-</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、インライン、インラインフレーム、Ajax、Flash</dd>
<dt>対象指定：</dt>
<dd>class属性＆onclick属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by-nc/2.5/deed.ja">CCライセンス 表示-非営利 2.5 一般</a><br />
非商用：無償、商用-1サイト：29ドル、商用-無制限：179ドル</dd>
<dt>備考：</dt>
<dd>表示コンテンツのドラッグ移動が可能。Inline／Ajax／Iframe表示時には右端ドラッグでサイズ変更が可能。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://www.ibegin.com/labs/ibox/">iBox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/ibox.jpg"><img alt="iBox" src="http://likealunatic.jp/assets_c/2009/06/ibox-thumb-300x240-68.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>-</dd>
<dt>対応形式：</dt>
<dd>画像、Ajax、インライン、Youtube動画などのムービー</dd>
<dt>対象指定：</dt>
<dd>rel属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://www.ibegin.com/labs/ibox/#license">無償</a></dd>
<dt>備考：</dt>
<dd>アニメーションがなく軽量。使い勝手はThickboxみたいな感じ。</dd>
</dl>
</div>
</div>

<div class="section">
<h3>jQuery</h3>
<div class="section">
<h4><a href="http://fancy.klade.lv/">FancyBox</a> <span class="memo">→オススメ</span></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/fancybox.jpg"><img alt="FancyBox" src="http://likealunatic.jp/assets_c/2009/06/fancybox-thumb-300x240-64.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>jQuery、jQuery Easing（オプション）</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、インライン（Flashなど含む）、Ajax、Iframe</dd>
<dt>対象指定：</dt>
<dd>jQueryセレクタ、rel属性（画像ギャラリー指定時）、class属性（インラインフレーム指定時）</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>jQuery Easingプラグインなしだと、ズームアニメーション時のイージング効果がなしになる。</dd>
</dl>
</div>
<del datetime="2009-06-25" title="2009年6月25日 掲載削除">
<div class="section">
<h4><a href="http://orderedlist.com/articles/fancyzoom-meet-jquery">FancyZoom(jQuery)</a></h4>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>jQuery</dd>
<dt>対応形式：</dt>
<dd>画像、インライン（Flashなど含む）</dd>
<dt>対象指定：</dt>
<dd>jQueryセレクタ</dd>
<dt>ライセンス：</dt>
<dd>不明</dd>
<dt>備考：</dt>
<dd>ウィンドウのシャドウ部分などの透過pngパーツが、IE6では透過gifで代用されており見た目が落ちる。</dd>
</dl>
</div>
</del>
<div class="section">
<h4><a href="http://leandrovieira.com/projects/jquery/lightbox/">jQuery lightBox plugin</a> <span class="memo">→オススメ</span></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/jquery_lightbox.jpg"><img alt="jQuery lightBox plugin" src="http://likealunatic.jp/assets_c/2009/06/jquery_lightbox-thumb-300x240-70.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>jQuery</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー</dd>
<dt>対象指定：</dt>
<dd>jQueryセレクタ</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by-sa/2.5/br/deed.jaCC">ライセンス 表示-継承 2.5 ブラジル</a></dd>
<dt>備考：</dt>
<dd>UIは本家Lightboxと全く同じ。裏の仕組みがjQueryで動くようにアレンジされたLightbox。jQueryセレクタの指定に複数要素が該当する場合、自動的に画像ギャラリーモードになる模様。<a href="http://leandrovieira.com/projects/jquery/lightbox/#extend">本家Lightboxとは違って色々なパラメーターがあり、カスタマイズができる</a>。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://www.no-margin-for-errors.com/projects/prettyPhoto-jquery-lightbox-clone/">prettyPhoto</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/prettyphoto.jpg"><img alt="prettyPhoto a jQuery lightbox clone" src="http://likealunatic.jp/assets_c/2009/06/prettyphoto-thumb-300x240-74.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>jQuery</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、Flash、RealMedia、インラインフレーム</dd>
<dt>対象指定：</dt>
<dd>rel属性、href属性のパラメータ、jQueryセレクタ、オプションでtitle属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by/2.5/deed.ja">CCライセンス 2.5</a></dd>
<dt>備考：</dt>
<dd>対応形式のメディアそれぞれを混合したギャラリー表示が可能。デフォルトのスタイルは黒いUI。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://jquery.com/demo/thickbox/">ThickBox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/thickbox.jpg"><img alt="Thickbox" src="http://likealunatic.jp/assets_c/2009/06/thickbox-thumb-300x240-78.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>jQuery</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、インライン、インラインフレーム、Ajax</dd>
<dt>対象指定：</dt>
<dd>class属性、title属性、href属性のパラメータ</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>jQueryを使うLighbox系スクリプトの代表的な存在。多様な形式に対応。アニメーションはしないが、その分軽快に動作する。</dd>
</dl>
</div>
</div>

<div class="section">
<h3>Prototype.js <ins datetime="2009-06-25">+ script.aculo.us</ins></h3>
<del datetime="2009-06-25" title="2009年6月25日 掲載削除">
<div class="section">
<h4><a href="http://orderedlist.com/articles/fancyzoom-meet-prototype">FancyZoom</a></h4>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>Prototype.js、script.aculo.us</dd>
<dt>対応形式：</dt>
<dd>インライン</dd>
<dt>対象指定：</dt>
<dd>href属性</dd>
<dt>ライセンス：</dt>
<dd>不明</dd>
<dt>備考：</dt>
<dd>対象のインラインコンテンツのIDをhref属性で指定できる・・・だけ？ウィンドウのシャドウ部分などの透過pngパーツが、IE6では透過gifで代用されており見た目が落ちる。</dd>
</dl>
</div>
</del>
<ins datetime="2009-06-25" title="2009年6月25日 掲載追加">
<div class="section">
<h4><a href="http://www.huddletogether.com/projects/lightbox2/">Lightbox2</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/lightbox2.jpg"><img alt="Lightbox2" src="http://likealunatic.jp/assets_c/2009/06/lightbox2-thumb-300x240-97.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>Prototype.js、script.aculo.us</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー</dd>
<dt>対象指定：</dt>
<dd>rel属性、title属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by/2.5/deed.ja">CCライセンス 表示 2.5 一般</a></dd>
<dt>備考：</dt>
<dd>元祖Lightbox。オプション設定などはないが、使い方は単純明快。</dd>
</dl>
</div>
</ins>
<div class="section">
<h4><a href="http://www.nickstakenburg.com/projects/lightview/">Lightview</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/lightview.jpg"><img alt="Lightview" src="http://likealunatic.jp/assets_c/2009/06/lightview-thumb-300x240-71.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>Prototype.js、script.aculo.us</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、Flash、QuickTime、Ajax、インラインフレーム、インライン</dd>
<dt>対象指定：</dt>
<dd>class属性、title属性、rel属性</dd>
<dt>ライセンス：</dt>
<dd>非商用の場合、<a href="http://creativecommons.org/licenses/by-nc-nd/3.0/deed.ja">CCライセンス:表示-非営利-改変禁止 3.0 Unported</a><br />
商用の場合、<a href="http://creativecommons.org/licenses/by-nd/3.0/deed.ja">CCライセンス:表示-改変禁止 3.0</a><br />
有償。非商用（1ドメイン）：3$、非商用（制限なし）：$15、商用（1ドメイン）：49$、商用（制限なし）：$295</dd>
<dt>備考：</dt>
<dd>多機能Lightbox。有償だけあってクオリティは高いが、たくさんのオプションがあるので使いこなすのは骨が折れるかも。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://www.wildbit.com/labs/modalbox/">ModalBox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/modalbox.jpg"><img alt="ModalBox" src="http://likealunatic.jp/assets_c/2009/06/modalbox-thumb-300x240-72.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>Prototype.js、script.aculo.us</dd>
<dt>対応形式：</dt>
<dd>プレーンHTML（文字列）、DOMノード</dd>
<dt>対象指定：</dt>
<dd>href属性、title属性、onclick属性</dd>
<dt>ライセンス：</dt>
<dd>不明</dd>
<dt>備考：</dt>
<dd>画面上部からニョロっとオーバーレイボックスが出現する。導入説明が親切。</dd>
</dl>
</div>
</div>

<div class="section">
<h3>MooTools</h3>
<div class="section">
<h4><a href="http://bertramakers.com/moolabs/imagezoom.php">ImageZoom</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/imagezoom.jpg"><img alt="ImageZoom" src="http://likealunatic.jp/assets_c/2009/06/imagezoom-thumb-300x240-69.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>MooTools</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー</dd>
<dt>対象指定：</dt>
<dd>rel属性、オプションでtitle属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by-sa/3.0/deed.ja">CCライセンス 表示-継承 3.0 Unported</a></dd>
<dt>備考：</dt>
<dd>対応形式が画像のみと少ないが、ズームするアニメーションがお洒落。拡大状態を複数開けるのが個性的。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://www.phatfusion.net/multibox/">phatfusion</a> <span class="memo">→オススメ</span></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/phatfusion.jpg"><img alt="phatfusion" src="http://likealunatic.jp/assets_c/2009/06/phatfusion-thumb-300x240-73.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>MooTools v1.11</dd>
<dt>対応形式：</dt>
<dd>画像、Flash、QuickTime、WindowsMedia、RealMedia、MP3、Ajax、インラインフレーム、インラインHTML</dd>
<dt>対象指定：</dt>
<dd>スクリプト、rel属性、title属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>対応形式のメディアそれぞれを混合したギャラリー表示が可能。デフォルトのスタイルだとUIが黒い。この辺はスクリプト呼び出し時のオプションでカスタマイズ可能。多機能でクオリティ高し。</dd>
</dl>
</div>
<ins datetime="2009-06-25" title="2009年6月25日 掲載追加">
<div class="section">
<h4><a href="http://www.coders.me/ejemplos/sexy-lightbox/">SexyLightBox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/sexy_lightbox.jpg"><img alt="SexyLightbox" src="http://likealunatic.jp/assets_c/2009/06/sexy_lightbox-thumb-300x240-96.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>MooTools</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー</dd>
<dt>対象指定：</dt>
<dd>スクリプト、class属性、rel属性、title属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>画面上部からビヨーンと登場するという、変わったアニメーションが特徴的。公式サイトの字が読めない。.meというドメインがモンテネグロのドメインなので、モンテネグロのサイト・・・？</dd>
</dl>
</div>
</ins>
<div class="section">
<h4><a href="http://www.digitalia.be/software/slimbox">Slimbox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/slimbox.jpg"><img alt="Slimbox" src="http://likealunatic.jp/assets_c/2009/06/slimbox-thumb-300x240-76.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>MooTools 1.2</dd>
<dt>対応形式：</dt>
<dt>対象指定：</dt>
<dd>スクリプト、rel属性、title属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>UIはLightboxと全く同じ。Slimというだけあってライトウェイトであることがウリらしい。スクリプトの書き方次第でダイレクトにSlimboxを呼び出すことも可能。jQueryバージョンもあるとのこと（http://www.digitalia.be/software/slimbox2）。</dd>
</dl>
</div>
<div class="section">
<h4><a href="http://gueschla.com/labs/smoothbox/">Smoothbox, Thickbox for mootools</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/smoothbox.jpg"><img alt="Smoothbox, Thickbox for MooTools" src="http://likealunatic.jp/assets_c/2009/06/smoothbox-thumb-300x240-77.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>MooTools</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、インライン、インラインフレーム、Ajax</dd>
<dt>対象指定：</dt>
<dd>class属性、title属性、href属性のパラメータ</dd>
<dt>ライセンス：</dt>
<dd><a href="http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license">MITライセンス</a></dd>
<dt>備考：</dt>
<dd>ThickboxのMooTool版。UIはThickBoxと同じ。IE8には非対応だった（オーバーレイ部分が真っ黒に）。</dd>
</dl>
</div>
</div>

<div class="section">
<h3>YUI</h3>
<div class="section">
<h4><a href="http://thecodecentral.com/2008/01/01/yui-based-lightbox-final">YUI Based Lightbox</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/yui_lightbox.jpg"><img alt="YUI Lightbox" src="http://likealunatic.jp/assets_c/2009/06/yui_lightbox-thumb-300x240-79.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>YUI</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー</dd>
<dt>対象指定：</dt>
<dd>スクリプト、id属性（img要素）</dd>
<dt>ライセンス：</dt>
<dd><a href="http://creativecommons.org/licenses/by-sa/3.0/deed.ja">CCライセンス 表示-継承 3.0 Unported</a></dd>
<dt>備考：</dt>
<dd>コントロールパネルを表示されたり、画像のキャプションを入れるボックスを表示されたり。画像表示領域と、キャプションはドラッグで移動可能。</dd>
</dl>
</div>
</div>

<div class="section">
<h3>その他</h3>
<div class="section">
<h4><a href="http://www.shadowbox-js.com/">Shadowbox.js</a></h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://likealunatic.jp/images/2009/06/shadowbox.jpg"><img alt="Shadowbox.js" src="http://likealunatic.jp/assets_c/2009/06/shadowbox-thumb-300x240-75.jpg" width="300" height="240" class="mt-image-none" style="" /></a></span></p>
<dl class="squarelist">
<dt>必要ライブラリ：</dt>
<dd>基本的には不要（※）<br />
※JSライブラリ（Adapter）を先に読み込ませると自動的に感知して、それと一緒に動作するようになる（らしい）。Adapterとして使えるのは Prototype、jQuery、MooTools (requires 1.2 Core)、Dojo Toolkit、Yahoo! User Interface Library (requires yahoo-dom-event.js)、Ext (requires ext-core.js)。</dd>
<dt>対応形式：</dt>
<dd>画像、画像ギャラリー、イメージマップ、Flash、各種ムービー、インラインフレーム、インライン、フォーム等</dd>
<dt>対象指定：</dt>
<dd>スクリプト、rel属性、title属性</dd>
<dt>ライセンス：</dt>
<dd><a href="http://www.shadowbox-js.com/LICENSE">Shadowbox.js License</a><br />
→有償。Single Developer: $20.00、Multiple Developer: $50.00</dd>
<dt>備考：</dt>
<dd>超高機能。アニメーションは控えめで上質感を感じさせる。スクリプト呼び出し時に引数として様々なオプションを指定可能。</dd>
</dl>
</div>
</div>

<p><span id="more-86"></span></p>

<div class="postscript">
<h3>追記</h3>
<dl class="disclist">
<dt><ins datetime="2009-06-25">2009年6月25日</ins></dt>
<dd><ins datetime="2009-06-25"><a href="http://orderedlist.com/articles/fancyzoom-meet-prototype">FancyZoom(Prototype)</a>と<a href="http://orderedlist.com/articles/fancyzoom-meet-jquery">FancyZoom(jQuery)</a>を削除。
<a href="http://www.huddletogether.com/projects/lightbox2/">Lightbox2</a>と<a href="http://www.coders.me/ejemplos/sexy-lightbox/">SexyLightBox</a>を追加。各ライセンス表記にリンクを追加</ins></dd>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2009/06/24_lightbox16.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LineNumberWriterを0.4にバージョンアップ</title>
		<link>http://likealunatic.jp/2009/06/16_linenumberwriter04.php</link>
		<comments>http://likealunatic.jp/2009/06/16_linenumberwriter04.php#comments</comments>
		<pubDate>Tue, 16 Jun 2009 04:56:11 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[LineNumberWriter]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2009/06/linenumberwriter%e3%82%920-4%e3%81%ab%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%a2%e3%83%83%e3%83%97.php</guid>
		<description><![CDATA[1年以上放置していたので今更感がありますが、LineNumberWriterをバージョンアップしました。今回から、変換対象のコード内でタグが使えるようになります。例えば以下のように、strong要素やspan要素などを挿 &#8230; <a href="http://likealunatic.jp/2009/06/16_linenumberwriter04.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1年以上放置していたので今更感がありますが、<a href="http://likealunatic.jp/2008/04/04_linenumberwriter.php">LineNumberWriter</a>をバージョンアップしました。今回から、変換対象のコード内でタグが使えるようになります。例えば以下のように、<code>strong</code>要素や<code>span</code>要素などを挿入することが可能です。（※）</p>

<pre><code><strong>&lt;strong&gt;で囲んでみました</strong>
<span style="color:#F33">&lt;span style=&quot;color:#F33;&quot;&gt;で囲んでみました</span></code></pre>

<p>※もちろん(X)HTMLの文法的にcode要素に含められない内容（ブロック要素など）は含めちゃダメですよ。</p>

<p>今度<a href="http://archiva.jp/web/sugamo_css/sugamo_css.html">Sugamo.css</a>という企画に参加することにしたので、何かプライベートワークをやっていかなきゃいけないような気になり、とりあえずコレのバージョンアップでも、と着手しました。<br />
実は前からタグが使えるようにしたくてちょくちょくいじってはいたんですが、IEの独自仕様でまた色々とつまづいてしまい、挫折しちゃってたんです。でもまぁ最近、良いアイデアが浮かんだのでどうにか形になった、という。</p>

<p><a href="http://likealunatic.jp/2008/04/04_linenumberwriter.php">ダウンロードしようなどという奇特な方はこちらからどうぞ。</a></p>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2009/06/16_linenumberwriter04.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Memo]:visitedクラスを利用した行動ターゲティング広告</title>
		<link>http://likealunatic.jp/2008/11/12_visitedlink.php</link>
		<comments>http://likealunatic.jp/2008/11/12_visitedlink.php#comments</comments>
		<pubDate>Wed, 12 Nov 2008 01:54:40 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2008/11/memovisited%e3%82%af%e3%83%a9%e3%82%b9%e3%82%92%e5%88%a9%e7%94%a8%e3%81%97%e3%81%9f%e8%a1%8c%e5%8b%95%e3%82%bf%e3%83%bc%e3%82%b2%e3%83%86%e3%82%a3%e3%83%b3%e3%82%b0%e5%ba%83%e5%91%8a.php</guid>
		<description><![CDATA[とても興味深い内容だったのでメモ。 行動ターゲティング広告はどこまで許されるのか&#160;インターネット-最新ニュース:IT-PLUS visited疑似クラスのビーコンを拾うサービスが登場 個人で使うドリコム式行動タ &#8230; <a href="http://likealunatic.jp/2008/11/12_visitedlink.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>とても興味深い内容だったのでメモ。</p>

<ul class="disclist">
<li><a href="http://it.nikkei.co.jp/internet/news/index.aspx?n=MMITbe000015102008">行動ターゲティング広告はどこまで許されるのか&nbsp;インターネット-最新ニュース:IT-PLUS</a></li>
<li><a href="http://bakera.jp/ebi/topic/3298">visited疑似クラスのビーコンを拾うサービスが登場</a></li>
<li><a href="http://d.hatena.ne.jp/Hamachiya2/20081029/visited">個人で使うドリコム式行動ターゲティング広告</a></li>
</ul>

<p><a href="http://hamachiya.com/junk/visited.html">id:Hamachiya2さんのデモ</a>のソースを見るとCSSの:visited擬似クラスと、JavaScriptを併用した形で、動的にコンテンツを入れ替える方法が分かります。</p>

<p>まずCSSで:visited擬似クラスに別のスタイルを書いておいて</p>

<pre><code>a {
display: block;
height: 22px;
overflow: hidden;
}
a:visited {
height: 16px;
}</code></pre>

<p>JavaScriptの以下のようなコードで、訪問の有無を調べています。</p>

<pre><code>var defHeight = 22;
var visHeight = 16;
...中略...
// 引数にはa要素ノードを入れる
// その高さがデフォルトでない（既訪問リンク）ならtrueを返す
// その高さがデフォルト（未訪問リンク）ならfalse返す
function checkVisited(elm) {
return (elm.offsetHeight != defHeight);
}</code></pre>

<p>実行はwindow.onloadのイベントで。なるほど。</p>

<p>自らの意図しない情報が、このように簡単に取得されてしまうのかと思うと、気持ちが悪いな・・・と思うと同時に、簡単であるが故に防ぎようがないと思いました。</p>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2008/11/12_visitedlink.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LineNumberWriter開発メモ</title>
		<link>http://likealunatic.jp/2008/04/05_linenumberwriter.php</link>
		<comments>http://likealunatic.jp/2008/04/05_linenumberwriter.php#comments</comments>
		<pubDate>Sat, 05 Apr 2008 09:59:09 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[LineNumberWriter]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2008/04/linenumberwriter%e9%96%8b%e7%99%ba%e3%83%a1%e3%83%a2.php</guid>
		<description><![CDATA[LineNumberWriterを作るに当たって気づいた点やその他補足など。自分で書いていて改めて気付きましたけど、かなりの欠陥品です...orz <a href="http://likealunatic.jp/2008/04/05_linenumberwriter.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="/2008/04/04_linenumberwriter.php">LineNumberWriter</a>を作るに当たって気づいた点やその他補足など。自分で書いていて改めて気付きましたけど、かなりの欠陥品です&#8230;orz</p>

<div class="section">
<h3>基本設計</h3>
<p>行番号を振るための処理は、基本的に<a href="http://code.google.com/p/syntaxhighlighter/">syntaxhighlithter.js</a>とほとんど同じ。というか、syntaxhighlighter.jsを参考にして作りました。</p>
<p>処理の流れとしては、</p>
<ol class="decimallist">
<li>まずページ内に&lt;pre&gt;&lt;code&gt;とマークアップされている部分を取得します。</li>
<li><del datetime="2008-04-07T22:29+09:00" title="2008年4月7日 削除">それら個々を&lt;ol&gt;&lt;li&gt;番号順リストのマークアップに変換します。</del><ins datetime="2008-04-07T22:29+09:00" title="2008年4月7日 追記">それら個々を&lt;ol&gt;&lt;li&gt;番号順リストのマークアップに変換したものと、そのままのもの（プレーンテキスト）、それぞれ二つづつを生成します。プレーンテキストの方はデフォルトで非表示にします</ins></li>
<li>奇数行と偶数行のli要素それぞれに別のclass属性値を設定します。</li>
<li><ins datetime="2008-04-07T22:29+09:00" title="2008年4月7日 追記">変換後のコードとプレーンテキストとを切り替えるヘッダー部分を生成します。</ins></li>
<li><del datetime="2008-04-07T22:29+09:00" title="2008年4月7日 削除">最後にdiv要素で包みます（後でスタイルを整える都合）。</del><ins datetime="2008-04-07T22:29+09:00" title="2008年4月7日 追記">最後にこれらをdiv要素内に書き出し、元の&lt;pre&gt;&lt;code&gt;部分と差し替えます。</ins></li>
</ol>
<pre><code>&lt;pre&gt;&lt;code&gt;function sample() {
alert(&quot;sample&quot;);
}&lt;/code&gt;&lt;/pre&gt;</code></pre>
<p>これが</p>
<pre><code>&lt;div class=&quot;LNW&quot;&gt;
&lt;div class=&quot;header&quot; style=&quot;display:none&quot;&gt;
&lt;a href=&quot;#&quot; class=&quot;ctrl1&quot;&gt;with line number&lt;/a&gt;
&lt;span class=&quot;ctrl2&quot;&gt;plain text&lt;/span&gt;
&lt;/div&gt;
&lt;div class=&quot;header&quot;&gt;
&lt;span class=&quot;ctrl1&quot;&gt;with line number&lt;/span&gt;
&lt;a href=&quot;#&quot; class=&quot;ctrl2&quot;&gt;plain text&lt;/a&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li class=&quot;odd&quot;&gt;function&amp;nbsp;sample()&amp;nbsp;{&lt;/li&gt;
&lt;li class=&quot;even&quot;&gt;&amp;nbsp;&amp;nbsp;alert(&amp;quot;sample&amp;quot;);&lt;/li&gt;
&lt;li class=&quot;odd&quot;&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;pre style=&quot;display:none&quot;&gt;&lt;code&gt;function sample() {
alert(&quot;sample&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</code></pre>
<p>こうなります。</p>
</div>

<p><span id="more-46"></span></p>

<div class="section">
<h3>改行をどうやって拾うか</h3>
<p>取得したDOM要素のinnerHTMLプロパティから拾えれば全く問題なかったんです。innerHTMLから改行を拾う処理はこんな感じ。</p>
<pre><code>var str = codeElement.innerHTML;
str = str.replace(/\r?\n/g, "\r");</code></pre>
<p>で、splitメソッドで分割して、li要素に突っ込んでいけばOKと思っていました。</p>
<pre><code>var line = str.split("\r");
var i,l,li;
for(i=0,l=line.length; i&lt;l; i++) {
li = document.createElement("li");
li.innerHTML = line[i];
}</code></pre>
<p>ところが、、WinIEがどうやっても改行を拾ってくれません。innerHTMLにした瞬間に全部改行が消えてしまう・・・！</p>
<p>そこで、取得した要素のコード部分をテキストノードとして拾い、そのnodeValueから拾ったら、うまくいきました。ただしこのやり方だと、テキストノード以外のノード（要素ノードとか）が混じっていると処理が複雑になりすぎてしまう・・・。ここで壁にぶち当たります。</p>
<p>「今の自分にはこりゃ作れない」という気になってきたので気分を切り替え、そういう仕様と割り切っていっそのこと<em>タグを使用不可にすればいいじゃん</em>と考えました。取得したDOM要素内には常にテキストノードだけが入っている状態なら良いわけですから。</p>
</div>

<div class="section">
<h3>Safariのヘンなところ発見</h3>
<p>コードの一行目に含まれているのが改行のみの場合、Safariがその改行を拾ってくれません。一行目が改行だけってシチュエーションがまずないので、これもスルーしています。</p>
<p>次のようになるべきコードが</p>
<pre><code>  &lt;ol&gt;
&lt;li class=&quot;odd&quot;&gt;&lt;/li&gt;
&lt;li class=&quot;even&quot;&gt;function&amp;nbsp;sample()&amp;nbsp;{&lt;/li&gt;
&lt;li class=&quot;odd&quot;&gt;&amp;nbsp;&amp;nbsp;alert(&amp;quot;sample&amp;quot;);&lt;/li&gt;
&lt;li class=&quot;even&quot;&gt;}&lt;/li&gt;
&lt;/ol&gt;</code></pre>
<p>Safariでは次のようになります。</p>
<pre><code>  &lt;ol&gt;
&lt;li class=&quot;odd&quot;&gt;function&amp;nbsp;sample()&amp;nbsp;{&lt;/li&gt;
&lt;li class=&quot;even&quot;&gt;&amp;nbsp;&amp;nbsp;alert(&amp;quot;sample&amp;quot;);&lt;/li&gt;
&lt;li class=&quot;odd&quot;&gt;}&lt;/li&gt;
&lt;/ol&gt;</code></pre>
</div>

<div class="section">
<h3>ブラウザ振り分け処理</h3>
<p>WinIEだけ別処理にしたいので振り分けます。確かWinIEだけ実装している、document.allオブジェクトを利用してみました。が、Operaもひっかかってきた（Operaもdocument.allを実装していた）ので、Operaだけが実装しているwindow.operaオブジェクトをさらに利用します。</p>
<pre><code>if(document.all &amp;&amp; !window.opera) {
WinIE用の処理
} else {
その他のブラウザ用の処理
}</code></pre>
<p>ホントはもっとスマートなやり方があると思います・・・。</p>
</div>

<div class="section">
<h3>半角スペースの変換問題</h3>
<p>いっぽう、WinIE以外のブラウザではinnerHTMLから改行が拾えるからタグ使えるんじゃね？と思っていたら、別の問題にぶち当たりました。次に問題となったのは半角スペースです。</p>
<p>まず前提として、コードのインデントなどに使われる半角スペースを拾い、&amp;nbsp;へと変換する処理を行っています。タグに属性値をセットしている場合、この処理で属性名前の半角スペースを拾われてしまい、ヘンテコな状態に変換されてしまいました。</p>
<pre><code>sample text
&lt;a href=&quot;sample.html&quot;&gt;sample text&lt;/a&gt;
sample text</code></pre>
<p>これが</p>
<pre><code>sample&amp;nbsp;text
&amp;nbsp;&amp;nbsp;&lt;a&amp;nbsp;href=&quot;sample.html&quot;&gt;sample&amp;nbsp;text&lt;/a&gt;
&amp;nbsp;&amp;nbsp;sample&amp;nbsp;text</code></pre>
<p>こうなっちゃいました。<br />
というわけで、結局タグは使えない仕様で行くことに決定。</p>
</div>

<div class="section">
<h3>CSSでも&#8230;</h3>
<p>CSSを書く段階になってもWinIEに苦しめられます。</p>
<p>横に長いコードを詰め込んだときにスクロールバーを出すためにoverflow:autoを設定するわけですが、スクロールバーが出た状態のWinIEがとてもヘン。それから、ol要素にoverflow設定をするとIE6で幅がヘンなことに。syntaxhighlighter.jsを参考に、全体をdiv要素で包み、そちらにoverflow設定をするこにしました。</p>
<p>また、横スクロールバーが出た際にWinIEは、スクロールバーの高さ分をそのボックスの高さに含めてしまう模様。そしてそのせいで、横スクロールバーが出ると同時に、縦スクロールバーも出てしまう・・・。</p>
<p>横長なコードのくせに1行か2行しかない場合が最悪で、コードが横スクロールバーに隠れてしまい、ロクに見ることができなくなってしまいます。これはお話にならない！というわけでWinIEだけハックで下paddingを設定し、スクロールバー分の高さを稼ぎました。これによって縦スクロールバーが出なくなり、コードの閲覧性は上がりました。が、スクロールバーが出た時に下marginが狭くなるという副作用が・・・。もうここでお手上げとなりました。</p>
</div>

<p>CSSが書ける方であれば、linenumberwriter.cssのソースコードをいじれば、変換後のスタイルを自由に変更できます。お気に入りのスタイルにどうぞ。</p>

<p><del datetime="2008-04-07T22:29+09:00" title="2008年4月7日 削除">div.LNWの上下のmargin、color、font-size辺り、それから各要素のbackground-colorやborder辺りがいじりどころだと思います。</del><ins datetime="2008-04-07T22:29+09:00" title="2008年4月7日 追記">0.2にバージョンアップするに当たり、CSSも大分見直しました。</ins></p>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2008/04/05_linenumberwriter.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LineNumberWriter &#8211; syntaxhighlighter風のJavaScriptを書いてみた</title>
		<link>http://likealunatic.jp/2008/04/04_linenumberwriter.php</link>
		<comments>http://likealunatic.jp/2008/04/04_linenumberwriter.php#comments</comments>
		<pubDate>Fri, 04 Apr 2008 13:46:29 +0000</pubDate>
		<dc:creator>seckie</dc:creator>
				<category><![CDATA[Web Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[LineNumberWriter]]></category>

		<guid isPermaLink="false">http://likealunatic.jp/wptest/2008/04/linenumberwriter-syntaxhighlighter%e9%a2%a8%e3%81%aejavascript%e3%82%92%e6%9b%b8%e3%81%84%e3%81%a6%e3%81%bf%e3%81%9f.php</guid>
		<description><![CDATA[サンプルコードを装飾するSyntaxHighlighter風のJavaScriptを書いてみました。行番号が付き、1行おきに背景色が付くというだけのものですので、syntaxはhighlightされません。よって、SyntaxHighlighterとは名乗れないので、LineNumberWriterと名乗ることにします。 <a href="http://likealunatic.jp/2008/04/04_linenumberwriter.php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近いろんなところで見かけるようになった<a href="http://code.google.com/p/syntaxhighlighter/">syntaxhighlighter.js</a>。文法が分かりやすいようにコードがカラーリングされ、行番号が付いてとてもコードが見やすいです。導入を検討しようかと思ったのですが、(X)HTML的に文法違反になるのは許せないなーと思い、違った形のものをJavaScriptで書いてみました。当サイトに導入済みです。次のような見た目になります。</p>

<pre><code>function sample() {
alert(&quot;sample&quot;);
}</code></pre>

<p>ただし、私が作ったのはSyntaxHighlighterではありません。<em>行番号が付き</em>、<em>1行おきに背景色が付く</em>だけのものです。<em>syntaxはhighlightされません</em>。よって、SyntaxHighlighterとは名乗れないので、<strong>LineNumberWriter</strong>と名乗ることにします（これ、果たして妥当な英語なんでしょうか・・・）。</p>

<p>もし使ってみたいという方がおりましたらご自由に使ってみてくださいまし。下記リンクからzipファイルでダウンロードできます。</p>

<p><a href="/lib/linenumberwriter_0.4.1.zip" onclick="pageTracker._trackPageview('/downloads/linenumberwriter_041');"><strong title="2009-10-15">linenumberlighter Ver.0.4.1</strong></a></p>

<p><del datetime="2009-06-16">勢いで作ったものなので、バージョンは0.1ということにします。それから一応、</del>ライセンスは<a href="http://www.opensource.org/licenses/mit-license.php">MITライセンス</a>としておきますね。<ins datetime="2008-04-05">（2008年4月5日追記）<a href="/2008/04/04_linenumberwriter.php#LNWupdate">更新履歴</a>を付けるようにしました。</ins></p>

<p><span id="more-45"></span></p>

<div class="section">
<h3>動作確認済みブラウザ</h3>
<ul class="disclist">
<li>Windows IE6 / 7 / <ins datetime="2009-06-16" title="2009年6月16日 追記">8</ins></li>
<li>Windows Firefox2 / <ins datetime="2009-06-16" title="2009年6月16日 追記">3</ins></li>
<li>Windows Opera<ins datetime="2009-06-16" title="2009年6月16日 追記">9.6</ins></li>
<li><ins datetime="2008-04-07" title="2008年4月7日 追記">Windows Safari3.1</ins></li>
<li><ins datetime="2009-06-16" title="2009年6月16日 追記">Windows Google Chrome2</ins></li>
<li>Mac Safari3</li>
<li>Mac Firefox2 / <ins datetime="2009-06-16" title="2009年6月16日 追記">3</ins></li>
<li>Mac Opera<ins datetime="2009-06-16" title="2009年6月16日 追記">9.6</ins></li>
</ul>
</div>

<div class="section">
<h3>使い方</h3>
<p>ダウンロードしたzipファイルを解凍すると、<em>linenumberwriter.js</em>と<em>linenumberwriter.css</em>が入っています。この2つを両方とも(X)HTMLファイルから読み込んでください。例えば次のようなコードをhead要素内に記述し、呼び出します。</p>
<pre><code>&lt;script type="text/javascript" src="/js/linenumberwriter.js"&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/css/linenumberwriter.css&quot; media=&quot;screen,projection&quot; /&gt;</code></pre>
<p>前項JSを呼び出した後で、<code>window.onload</code>イベントなどで<code>LNW.write();</code>というメソッドを呼び出してあげます。（その他にも<code>window.onload</code>イベントで呼び出しているメソッドがあったら、イベントを上書きしないようご注意ください）</p>
<pre><code>window.onload = function() {
LNW.write();
}</code></pre>
<p>(X)HTML内の<em><code>&lt;pre&gt;&lt;code&gt;</code>から<code>&lt;/code&gt;&lt;pre&gt;</code>まででマークアップされているコードが自動的に変換の対象となります</em>。</p>
</div>

<div class="section">
<h3>使用上の注意&amp;既知の不具合</h3>
<ul class="disclist-comment">
<li>現在の仕様では<code>&lt;pre&gt;&lt;code&gt;</code>でマークアップしてしまうと、強制的に変換対象となってしまいますので、ページ内で例外的なスタイルを作れません。</li>
<li><del datetime="2009-06-16"><code>&lt;pre&gt;&lt;code&gt;</code>内では<strong>タグが使えません</strong>。具体的には<em>コードの一部をstrong要素で強調する</em>といった使い方や、<em>コードの一部をspan要素でマークアップして色を付ける</em>といった使い方はできません。これも仕様です。<br />
もしタグを使ってしまうと一部コードが非表示になってしまうなどして、表示が崩れます。</del><br />
<ins datetime="2009-06-16" title="2009年6月16日 追記">0.4にアップデートするに当たり、<code>&lt;pre&gt;&lt;code&gt;</code>内でタグが使用できるようになりました。</ins></li>
<li>一行目に改行のみが含まれている場合、Safariではその改行を拾ってくれません。</li>
<li>コードが表示エリアをはみ出した場合、スクロールバーが表示されますが、行の背景色がはみ出した部分に付きません。</li>
<li>IEではスクロールバーが表示されてしまうと、いろいろとヘンなことに・・・（それをハックでごまかしています。。）</li>
</ul>
</div>

<div class="section">
<h3><a name="LNWupdate" id="LNWupdate">更新履歴</a></h3>
<ul>
<li><ins datetime="2009-10-15">2009年10月15日 &#8211; 0.4.1にアップデート<br />
空白行が「nbsp;」と出力されてしまう不具合を修正しました。</ins></li>
<li><ins datetime="2009-06-16">2009年6月16日 &#8211; 0.4にアップデート<br />
変換対象内（<code>&lt;pre&gt;&lt;code&gt;</code>内）でタグを使えるようにしました。コードの一部をstrong要素で強調したり、span要素で囲んで特定のスタイルを適用するといったことが可能となります。</ins></li>
<li><ins datetime="2008-04-07">2008年4月7日 &#8211; 0.2にアップデート<br />
タブっぽいリンクをクリックすることによって、プレーンテキストと切り替えられるようにしました。Firefoxでコードをコピペした時にリストマーカー部分がくっついてくるのが鬱陶しかったため、この機能をつけました。Firefoxではコピペしたい時は、プレーンテキストに切り替えてからコピペしましょう。</ins></li>
<li><ins datetime="2008-04-05">2008年4月5日 &#8211; 0.1.1にアップデート<br />
WinIEで&amp;（アンパサンド）の変換処理がおかしかった点を修正しました。</ins></li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://likealunatic.jp/2008/04/04_linenumberwriter.php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

