<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>A Day in the Life</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/" />
    <link rel="self" type="application/atom+xml" href="http://www.nk0206.com/life/atom.xml" />
    <id>tag:www.nk0206.com,2013-06-04:/life//2</id>
    <updated>2015-06-06T05:15:00Z</updated>
    <subtitle>WEBの技術系情報(CSS/HTML/jQuery/MT)をメインに書いています。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 6.1.1</generator>

<entry>
    <title>JavaScriptで前ページから受け取ったパラメータ先へリダイレクトする</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2014/04/js-redirect.html" />
    <id>tag:www.nk0206.com,2014:/life//2.1965</id>

    <published>2014-04-19T09:53:21Z</published>
    <updated>2015-06-06T05:15:00Z</updated>

    <summary> この記事で使うイベントやメソッドなど setTimeout() setInte...</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="javascript" label="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2014/14-04-19-redirect.jpg"><img src="http://www.nk0206.com/life/assets_c/2014/04/14-04-19-redirect-thumb-650xauto-660.jpg" alt="JavaScriptで前ページから受け取ったパラメータ先へリダイレクトする"></a></p>
                ]]>
        <![CDATA[<div class="edit">
<p>この記事で使うイベントやメソッドなど</p>
<p><code>setTimeout()<br>
setInterval()<br>
clearInterval()<br>
location.href</code></p>
</div>

<p>リンク元のhrefの値に<code>./redirect.html?page=result.html&amp;amp;anchor=demo</code>のように、?でパラメータを付与します。pageの値がリンク先、anchorがリンク先の特定のアンカーへ飛ばす必要がある場合に付与します。anchorが不要の場合は<code>?page=result.html</code>のみにします。</p>

<h2>まずは箱を用意</h2>

<p>まずは箱と値（変数の設定）を用意します。 <br />
cntはリダイレクトするまでの秒数（ミリ秒）でdispCntは1000で割って秒数に変換します。queryPrmはパラメータを格納する変数（配列）です。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
</pre>

<h2>クエリを取得</h2>

<p>クエリを取得して変数に入れます。クエリは<code>location.search</code>で取得出来ます。substring(1)で文字を切り出し、split('&amp;')でパラメータごとに切り分けます。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');
</pre>

<h2>連想配列に値を格納し、リダイレクト先に設定</h2>

<p>queryには複数の値が入っている場合があるので、forループを使って先ほど用意した箱queryPrmに格納して行きます。 <br />
queryにはpage=result.html, anchor=demoのような形で値が入っているので = で分解し、=の前の値をハッシュとした連想配列にします。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');

for(i = 0; query[i]; i++) {
  var hashes = query[i].split('='); // =の前をハッシュとする
  queryPrm[hashes[0]] = hashes[1]; // 連想配列に入れる
}
</pre>

<p>これでqueryPrm.page(queryPrm['page'])がリンク先で、queryPrm.anchor(queryPrm['anchor'])があった場合はリンク先のアンカーとして設定出来ました。変数linkUrlにリンク先として格納します。queryPrm['anchor']がある場合と無い場合でリンク先が異なるのでif文で分岐します。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');

for(i = 0; query[i]; i++) {
  var hashes = query[i].split('='); // =の前をハッシュとする
  queryPrm[hashes[0]] = hashes[1]; // 連想配列に入れる
}

var linkUrl = queryPrm.page;
if(queryPrm.anchor) {
  linkUrl = queryPrm.page + '#' + queryPrm.anchor; // anchorがある場合
}
</pre>

<h2>指定した秒数後にリンク先に飛ぶようにする</h2>

<p>指定した秒後に何か処理を行いたい場合はsetTimeoutメソッドを利用します。setTimeoutの使い方はこんな感じです。</p>

<pre class="code" lang="javascript">
// #1
setTimeout(メソッド, ミリ秒数);
// #2
setTimeout(function() {
    Do something
}, ミリ秒数)
</pre>

<p>#1のパターンは予めあるメソッドを利用する場合に利用します。今回は#2のパターンを利用して、指定した秒後に<code>function() {}</code>にかかれた処理を行うようにします。 <br />
JavaScriptで特定のURLにリダイレクトするには<code>location.href = URL</code>と書きます。ですので、下記のようなコードになります。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');

for(i = 0; query[i]; i++) {
  var hashes = query[i].split('='); // =の前をハッシュとする
  queryPrm[hashes[0]] = hashes[1]; // 連想配列に入れる
}

var linkUrl = queryPrm.page;
if(queryPrm.anchor) {
  linkUrl = queryPrm.page + '#' + queryPrm.anchor; // anchorがある場合
}

setTimeout(function() {
  location.href = linkUrl;
}, cnt);
</pre>

<h2>指定した秒数をカウントダウン表示するメソッドを作る</h2>

<p>それではカウントダウン表示するメソッド、countDown()を作ります。パラメータにミリ秒数を渡すとその間だけカウントダウン表示するようにします。</p>

<pre class="code" lang="javascript">
function countDown(cnt) {
  Do someting
}
</pre> 

<p>指定した時間、ある処理を繰り返したい場合はsetIntervalメソッドを利用します。使い方はsetTimeoutと似ており、メソッドとミリ秒数をパラメータとすれば指定したミリ秒数の間処理を繰り返してくれます。 <br />
ここでは変数timerにsetIntervalで行う処理を格納しておきます。</p>

<pre class="code" lang="javascript">
function countDown(cnt) {
  var timer = setInterval(function () {
    Do someting
  }, 1000);
}
</pre>

<p>繰り返す処理は、パラメータcntをデクリメント(--)、idがcountの内容をcntの値で書き換え(innerHTML)、cntが0になったら処理を終了（clearInterval）します。  </p>

<pre class="code" lang="javascript">
function countDown(cnt) {
  var timer = setInterval(function () {
    cnt --; // cntをデクリメント
    document.getElementById('count').innerHTML = cnt;
    if(cnt == 0) {
      clearInterval(timer); // cntが0になったら処理を終了
    }
  }, 1000);
}
</pre>

<p>これで指定した秒数をカウントダウン表示するメソッドcountDownが出来たので、このメソッドを呼び出します。</p>

<pre class="code" lang="javascript">
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');

for(i = 0; query[i]; i++) {
  var hashes = query[i].split('='); // =の前をハッシュとする
  queryPrm[hashes[0]] = hashes[1]; // 連想配列に入れる
}

var linkUrl = queryPrm.page;
if(queryPrm.anchor) {
  linkUrl = queryPrm.page + '#' + queryPrm.anchor; // anchorがある場合
}

setTimeout(function() {
  location.href = linkUrl;
}, cnt);

countDown(dispCnt);

function countDown(cnt) {
  var timer = setInterval(function () {
    cnt --;
    document.getElementById('count').innerHTML = cnt;
    if(cnt == 0) {
      clearInterval(timer);
    }
  }, 1000);
}
</pre>

<h2>指定した秒数まてない人のためにすぐに移動する手段を用意する</h2>

<p>ここは非常に簡単です。getElementByIdで所得したhrefをlinkUrlで上書きします。</p>

<pre class="code" lang="javascript">
var clickElem = document.getElementById('go-page');
clickElem.href = linkUrl;
</pre>

<p>これで完成です。完成したコードは下記のようになります。</p>

<p class="codeHeadline">リンク元HTMLコード</p>

<pre class="code" lang="html">
&lt;div class=&quot;page&quot;&gt;
  &lt;h1&gt;Redirect Demo&lt;/h1&gt;
  &lt;p&gt;&lt;a href=&quot;./redirect.html?page=result.html&amp;amp;anchor=demo&quot; target=&quot;_blank&quot;&gt;ここをクリック&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre>

<p class="codeHeadline">リダイレクト側コード</p>

<pre class="code" lang="javascript">
&lt;div class=&quot;page&quot;&gt;
  &lt;h1&gt;Redirect Demo&lt;/h1&gt;
  &lt;p&gt;&lt;span id=&quot;count&quot;&gt;3&lt;/span&gt;秒後に別ページにリダイレクトします。&lt;/p&gt;
  &lt;button&gt;&lt;a href=&quot;./&quot; id=&quot;go-page&quot;&gt;すぐに移動する&lt;/a&gt;&lt;/button&gt;
&lt;/div&gt;
&nbsp;
&lt;script&gt;
var cnt = 3000;
var dispCnt = cnt / 1000;
var queryPrm = new Array;
var query = location.search.substring(1).split('&');

for(i = 0; query[i]; i++) {
  var hashes = query[i].split('=');
  queryPrm[hashes[0]] = hashes[1];
}

var linkUrl = queryPrm.page;
if(queryPrm.anchor) {
  linkUrl = queryPrm.page + '#' + queryPrm.anchor;
}

setTimeout(function() {
  location.href = linkUrl;
}, cnt);

countDown(dispCnt);

function countDown(cnt) {
  var timer = setInterval(function () {
    cnt --;
    document.getElementById('count').innerHTML = cnt;
    if(cnt == 0) {
      clearInterval(timer);
    }
  }, 1000);
}

var clickElem = document.getElementById('go-page');
clickElem.href = linkUrl;
&lt;/script&gt;
</pre>

<p><a href="http://www.nk0206.com/demo/redirect/" class="btn demo"><span>View Demo</span></a></p>
]]>
        
    </content>
</entry>

<entry>
    <title>MAMP3＋MovableTypeをMavericksに入れた</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2014/04/mamp3-movabletype-mavericks.html" />
    <id>tag:www.nk0206.com,2014:/life//2.1964</id>

    <published>2014-04-06T02:14:18Z</published>
    <updated>2014-04-06T02:18:07Z</updated>

    <summary>まずはMAMP3＋XCode＋X11(XQuartz) MAMP3を下記サイトよ...</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Web" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mamp" label="mamp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movabletype" label="movabletype" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webサーバー" label="webサーバー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2014/14-04-06-mamp1.jpg"><img src="http://www.nk0206.com/life/assets_c/2014/04/14-04-06-mamp1-thumb-650xauto-659.jpg" alt="MAMP3＋MovableTypeをMavericksに入れた"></a></p>
                ]]>
        <![CDATA[<h2>まずはMAMP3＋XCode＋X11(XQuartz)</h2>

<p>MAMP3を下記サイトよりダウンロードしてインストール。 <br />
<a href="http://www.mamp.info/en/">MAMP</a></p>

<p>XcodeはApp Storeからインストール。Command Line ToolsはXcodeを開いて[ Xcode ]→[ Open Developer Tool ]→[ More Developer Tools ]とたどり、ブラウザが開くのでCommand Line Tools(OSX Mavericks) for Xcodeをクリックしてインストール。 <br />
ターミナルからインストールする場合は下記コマンド。</p>

<pre class="code">
xcode-select --install
</pre>

<p>X11(XQuartz)を下記サイトよりダウンロードしてインストール。 <br />
<a href="http://xquartz.macosforge.org/landing/">XQuartz</a></p>

<h2>次はMacPorts</h2>

<p>Homebrewにしようと思ったのですが、やっぱり慣れてるMacPortsにしました。ダウンロードしてインストールして初期化します。 <br />
<a href="http://www.macports.org/">MacPorts</a></p>

<pre class="code">
echo 'export PATH=$PATH:/opt/local/bin:/opt/local/sbin/' >> ~/.bashrc
echo 'export MANPATH=$MANPATH:/opt/local/man' >> ~/.bashrc
echo 'source ~/.bashrc' >> ~/.bash_profile
sudo port -d selfupdate
sudo port -d sync
</pre>

<h2>必要なモジュールをインストール</h2>

<h3>PerlMagick</h3>

<p>MovableTypeで使用するImageMagickはPerl版なのでPerlMagickをインストール</p>

<pre class="code">
sudo port install perlmagick
</pre>

<p>Perlのパス(/usr/bin/perl)をMacPortsのディレクトリ（/opt/local/bin/）に置き換えます。</p>

<pre class="code">
cd /usr/bin/
sudo mv perl perl.bak
sudo ln -s /opt/local/bin/perl /usr/bin/perl
</pre>

<h3>DBモジュール</h3>

<p>ここから毎度@BUNさんの<a href="http://gabs.cc/blog/bun/topic20090608-1456.php">Mac OS Xのローカル環境(MAMP+MacPorts)で
Movable Typeを動かしてみよう - 準備編</a>を参考に</p>

<pre class="code">
sudo port install p5-dbi
sudo port install p5-dbd-mysql
sudo port install p5-dbd-sqlite
sudo port install p5-dbd-sqlite2
sudo port install p5-dbd-pg
</pre>

<h3>その他のモジュール</h3>

<pre class="code">
sudo port install p5-gd
sudo port install p5-crypt-dsa
sudo port install p5-archive-zip
sudo port install p5-xml-atom
sudo port install p5-mail-sendmail
</pre>

<h2>VirtualHostとVirtualBox &amp; modern.ie</h2>

<p>MAMPのhttpd.confを編集します。572行目ぐらいのhttpd-vhosts.confを有効にします。</p>

<pre class="code">
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
</pre>

<p>これでhttpd.confではなく、httpd-hosts.confにVirtualHostの設定を書くことが出来ます。あとはこのブログの過去記事<a href="http://www.nk0206.com/life/2010/07/mampvirtualhost.html">VirualHostの設定</a>を参考に。</p>

<p>仮想環境はOracleの<a href="https://www.virtualbox.org/">VirtualBox</a>を利用することにします。ブラウザ確認だけならmodern.ieを入れるだけで良いと判断したので... <br />
VirtualBox &amp; modern.ieのインストールはStocker.jpさんの<a href="http://stocker.jp/diary/modern_ie/">Macでも無料でIE確認するためのModern.IEが想像以上に快適だった</a>を参考にさせて頂きました。 <br />
modern.ieはWindows8 - IE11を入れて、IE11〜8までの確認はDevelopper Toolで確認することにしました。</p>

<p>以上で新しいMacでローカル環境構築終了です。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>JavaScriptでNEWマークを自動的に追加する</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2014/03/addnew.html" />
    <id>tag:www.nk0206.com,2014:/life//2.1963</id>

    <published>2014-03-30T02:36:30Z</published>
    <updated>2014-04-01T08:54:53Z</updated>

    <summary>個人的にはNEWマークなんていらないでしょと思うのですが、まだまだ更新したらNEWマークつけてよなんて事はよく言われるのでは無いでしょうか？しかもいつまでNEWマークつけてんの？3日たったら消してよなんて言われることも多いのでは無いでしょうか（苦）？  JavaScriptのDateオブジェクトを使えば簡単に自動化出来ます。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2014/14-03-30-addnew.png"><img src="http://www.nk0206.com/life/assets_c/2014/03/14-03-30-addnew-thumb-650xauto-658.png" alt="JavaScriptでNEWマークを自動的に追加する"></a></p>
                ]]>
        <![CDATA[<div class="edit">
<p>この記事で使うイベントやメソッドなど</p>
<p><code>.next();</code><br>
<code>.append();</code><br>
<code>.text();</code><br>
<code>.split();</code><br>
<code>$('.foo').each(function() { Do Something });</code><br>
<code>.getTime()</code></p>
</div>

<h2>Dateオブジェクト</h2>

<p>new Date()で現在の日付、時刻のオブジェクトを生成することが出来ます。よく使うDateオブジェクトのメソッドを紹介しておきます。</p>

<pre class="code" lang="javascript">
var today = new Date(); // 現在の日付、時刻のオブジェクト生成
var yy = today.getFullYear(); // 現在の年号を4桁で取得
var mm = today.getMonth(); // 現在の月を取得（0〜11）
var dd = today.getDate(); // 現在の日を取得
var day = today.getDay(); // 現在の曜日を取得（0〜6）
</pre> 

<p>Dateオブジェクトに年月日のパラメータを与えると、その年月日のDateオブジェクトが生成されます。注意する点は、Dateオブジェクトでの月は0〜11と言う点です。0が1月、1が2月なので、getMonthで取得した値に1を足すと正確な月になります。なので<code>new Date()</code>のパラメータに月を与える時は1を引いた数にします。</p>

<pre class="code" lang="javascript">
var setDay = new Date(2014, 3, 1); // 2014年4月1日のDateオブジェクト生成
</pre>

<p>JavaScriptの日時は1970年1月1日0時からのミリ秒数として計られています(それ以前はマイナスの数値)。1日は86,400,000ミリ秒で計算されます。 <br />
Dateオブジェクトを生成した後、.getTime()メソッドを利用すると、指定した年月日の経過ミリ秒数が求まります。</p>

<pre class="code" lang="javascript">
var today = new Date(); // 現在の日付、時刻のオブジェクト生成
var sec = today.getTime(); // 現在の年月日を経過ミリ秒数で取得
</pre>    

<p>以上の知識があれば、今回のJavaScriptで自動的にNEWマークを追加する事が出来ます。</p>

<h2>仕様</h2>

<ol class="basic1">
<li>更新情報のHTMLはdl>dt+ddの形式でマークアップします。</li>
<li>dtには更新年月日を、ddには更新内容が入ります。</li>
<li>更新した日から3日間NEWマークを付けます。</li>
</ol>

<p class="mb0">実装する考え方ですが、</p>

<ul class="basic1">
<li>今日の日付と更新日の差分を取る</li>
<li>3日経っていなければNEWマークを付加</li>
<li>3日経っていれば何もしない</li>
</ul>

<p>以上で実装出来ます。</p>

<p class="codeHeadline">HTML Code</p>

<pre class="code" lang="html">
&lt;dl class="box__info"&gt;
    &lt;dt&gt;2014-03-29&lt;/dt&gt;
    &lt;dd&gt;&lt;a href="javascript:;"&gt;○○○を更新しました&lt;/a&gt;&lt;/dd&gt;
&lt;dl&gt;
</pre>

<h2>JavaScript(&amp;jQuery)</h2>

<p>それではJavaScriptのコードを作っていきます。 <br />
まずはNEWマークを付ける日数をミリ秒数に変換、現在の年月日のDateオブジェクトを生成してミリ秒数に変換します。</p>

<p class="codeHeadline">JavaScript Code</p>

<pre class="code" lang="javascript">
$(function() {
    var distance = 3 * 86400000; // 3日間のミリ秒数で求める
    var today = new Date(); // 現在の年月日のDateオブジェクトを生成
    var baseTime = today.getTime(); // 現在の年月日のミリ秒数を求める
}); 
</pre>

<p>次にdtに記述された日数をフックにするため.text()を利用して取得します。今回は年月日の区切り記号にハイフンを利用しているので、.split('-')で分割し、配列に入れます。これらはdtの数だけ繰り返さなければならないのでeachメソッドを利用して繰り返します。</p>

<p class="codeHeadline">JavaScript Code</p>

<pre class="code" lang="javascript">
$(function() {
    var distance = 3 * 86400000; // 3日間のミリ秒数で求める
    var today = new Date(); // 現在の年月日のDateオブジェクトを生成
    var baseTime = today.getTime(); // 現在の年月日のミリ秒数を求める

    $('dl.box__info dt').each(function() {
        var textVal = $(this).text(); // dtに記述された年月日を取得
        var dateArr = textVal.split('-'); // 年月日に分けて配列に入れる
    });
}); 
</pre>

<p>所得した年月日を利用してDateオブジェクトを生成し、ミリ秒数を求めます。そして、現在の日時との差分を取って3日経っているかを調べ、条件と一致していればNEWマークを付けます。</p>

<p class="codeHeadline">JavaScript Code</p>

<pre class="code" lang="javascript">
$(function() {
    var distance = 3 * 86400000; // 3日間のミリ秒数で求める
    var today = new Date(); // 現在の年月日のDateオブジェクトを生成
    var baseTime = today.getTime(); // 現在の年月日のミリ秒数を求める

    $('dl.box__info dt').each(function() {
        var textVal = $(this).text(); // dtに記述された年月日を取得
        var dateArr = textVal.split('-'); // 年月日に分けて配列に入れる

        var entryDay = new Date(dateArr[0], dateArr[1]-1, dateArr[2]); // dtに記述された年月日のDateオブジェクトを生成
        var entryTime = entryDay.getTime(); // ミリ秒数を求める
        var dist = baseTime - entryTime; // 現在の年月日（ミリ秒数）との差分
        // 3日経っていなければNEWマークを付ける
        if(dist <= distance) {
            $(this).next('dd').append('&lt;i class="icon__new"&gt;NEW&lt;/i&gt;');
        }
    });
}); 
</pre>

<p>以上です。非常に簡単に実装出来ますね。応用すればいろいろなパターンに利用出来ると思います。 <br />
それにしてもNEWマークいらねー。</p>

<p><a href="http://www.nk0206.com/demo/jquery/jq.addnew/" class="btn demo"><span>View Demo</span></a></p>

<p>プラグイン版はGithubに置いてあります。</p>

<p><a href="https://github.com/poundhound/jq.addnew/archive/master.zip" class="btn download"><span>Download</span></a></p>

<p>Graphic:<a href="http://www.webdesignhot.com/">Web Design Hot</a></p>
]]>
        
    </content>
</entry>

<entry>
    <title>config.rbを使わずにGruntfile側でcompassのコンパイルを制御する</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2014/02/gruntfile-config.html" />
    <id>tag:www.nk0206.com,2014:/life//2.1962</id>

    <published>2014-02-07T15:46:43Z</published>
    <updated>2014-02-07T16:27:26Z</updated>

    <summary>ディレクトリ構成 Project │   ├─node_module │ │ G...</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="compass" label="compass" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="grunt" label="grunt" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2014/14-02-08-grunt.jpg"><img src="http://www.nk0206.com/life/assets_c/2014/02/14-02-08-grunt-thumb-650xauto-657.jpg" alt="config.rbを使わずにGruntfile側でcompassのコンパイルを制御する"></a></p>
                ]]>
        <![CDATA[<p class="codeHeadline">ディレクトリ構成</p>

<pre class="code">
Project
│  
├─node_module
│
│ Gruntfile.coffee
│ package.json
│   
└─htdocs
   │ 
   │ index.html
   │      
   ├─css
   │   style.min.css
   │      
   ├─img
   │   sprite-xxxx.png
   │   img-photo01.jpg
   │      
   ├─js
   │   project-name.js
   │          
   └─src
      ├─sass
      │   style.scss
      │     
      ├─css
      │   style.css
      │      
      ├─img
      │   │ sprite-xxxx.png  
      │   │ img-photo01.jpg
      │   │   
      │   └─src
      │      icon-aaa.png
      │      icon-bbb.png  
      │      
      └─js
          aaa.js
          bbb.js
</pre>

<p>srcフォルダが作業フォルダになります（srcフォルダは公開しない前提）。Gruntで自動化する流れと使用するモジュールは以下のようになります。  </p>

<ol class="basic1">
<li>grunt-contrib-compass  
src/sass内の.scssファイルをsrc/css内にコンパイルします。</li>
<li>grunt-contrib-cssmin  
src/css内の.cssファイルををminifyし、css内に書き出します。</li>
<li>grunt-pngmin  
compassで書きだされたスプライト画像はsrc/img内に書きだされます。最適化してimg内に書き出します。同様に単発の.pngファイルも最適化してimg内に書き出します。</li>
<li>grunt-contrib-imagemin  
src/img内のJpeg画像やGif画像を最適化してimg内に書き出します。</li>
<li>grunt-contrib-concat  
src/js内の.jsファイルを1ファイルに結合してjs内に書き出します。</li>
<li>grunt-contrib-uglify  
js内に書きだされた.jsファイルを圧縮して.min.jsとリネームします。</li>
</ol>

<p>Grantfile.coffeeは以下のようになります（.jsより.coffeeの方が見やすいのでCoffeeScriptで書いています）。</p>

<pre class="code">
module.exports = (grunt) ->

    grunt.loadNpmTasks 'grunt-contrib-watch'
    grunt.loadNpmTasks 'grunt-contrib-compass'
    grunt.loadNpmTasks 'grunt-contrib-uglify'
    grunt.loadNpmTasks 'grunt-contrib-concat'
    grunt.loadNpmTasks 'grunt-contrib-cssmin'
    grunt.loadNpmTasks 'grunt-contrib-imagemin'
    grunt.loadNpmTasks 'grunt-pngmin'
    grunt.loadNpmTasks 'grunt-styleguide'

    grunt.initConfig
        pkg: grunt.file.readJSON 'package.json'
        paths:
            srcDir: 'htdocs/src/'
            distDir: 'htdocs/'

        # Sassをコンパイル
        compass:
            dev:
                options:
                    httpPath: '/'
                    basePath: '<%= paths.srcDir %>'
                    cssDir: 'css/'
                    sassDir: 'sass/'
                    imagesDir: 'img/'
                    javascriptDir: 'js/'
                    environment: 'development'

        # CSSを圧縮
        cssmin:
            minify:
                expand: true
                cwd: '<%= paths.srcDir %>css/'
                src: '**/*.css'
                dest: '<%= paths.distDir %>css/'

        # JPEG, GIF画像を圧縮
        imagemin:
            dynamic:
                options:
                    optimizationLevel: 3
                files: [
                    expand: true
                    cwd: '<%= paths.srcDir %>img/'
                    src: '**/*.{jpg, gif}'
                    dest: '<%= paths.distDir %>img/'
                ]

        # PNG画像を圧縮
        pngmin:
            compile:
                options:
                    ext: '.png'
                files: [
                    expand: true
                    cwd: '<%= paths.srcDir %>img/'
                    src: '**/*.png'
                    dest: '<%= paths.distDir %>img/'
                ]

        # JSファイルを結合
        concat:
            files:
                src: ['<%= paths.srcDir %>js/*.js']
                dest: '<%= paths.distDir %>js/<%= pkg.name %>.js'

        # JSファイルを圧縮
        uglify:
            options:
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
            compose:
                src: '<%= paths.distDir %>js/<%= pkg.name %>.js'
                dest: '<%= paths.distDir %>js/<%= pkg.name %>.min.js'

        # タスクをWatch
        watch:
            css:
                files: ['<%= paths.srcDir %>sass/*.scss', '<%= paths.srcDir %>css/*.css']
                tasks: ['compass:dev', 'cssmin']

            image:
                files: ['<%= paths.srcDir %>img/**/*.{png,jpg,gif}']
                tasks: ['imagemin:dynamic', 'pngmin']

            js:
                files: ['<%= paths.srcDir %>js/*.js', '<%= paths.distDir %>js/<%= pkg.name %>.js']
                tasks: ['concat', 'uglify:compose']

    grunt.registerTask 'default', ['watch']
</pre>

<p>パスは何らかで変更になった場合一括で変わってほしいので、変数に入れています。srcDirが作業フォルダへのパス、distDirが公開フォルダへのパスです。 <br />
config.rbに書いていた内容をgrunt-contrib-compassのoptionで設定していますが、config.rbと微妙に名前が違います（sass<em>dirがsassDirなど）。ハマったのがproject</em>pathでgrunt側だとbasePathになるんですね。</p>

<p>いやぁ...やっぱり自動化って素敵！</p>
]]>
        
    </content>
</entry>

<entry>
    <title>プロキシ環境下でnpm install</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2014/01/npm-install.html" />
    <id>tag:www.nk0206.com,2014:/life//2.1961</id>

    <published>2014-01-28T14:17:38Z</published>
    <updated>2014-01-28T14:24:49Z</updated>

    <summary>gruntを利用するにはnode.jsを入れる必要があります。こちらはnode....</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="grunt" label="grunt" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2014/14-01-28-npm-install-01.jpg"><img src="http://www.nk0206.com/life/assets_c/2014/01/14-01-28-npm-install-01-thumb-650xauto-656.jpg" alt="プロキシ環境下でnpm install"></a></p>
                ]]>
        <![CDATA[<p>gruntを利用するにはnode.jsを入れる必要があります。こちらは<a href="http://nodejs.org/">node.jsのサイト</a>のサイトからダウンロードしてインストールするだけなので簡単ですが、gruntを入れるには黒い画面を使わなければ行けません。 <br />
WindowsではWindowsキー＋Rキーでファイル名を指定して実行のウィンドウを開いてcmdと入れるとコマンドプロンプトが開きます。Macではアプリケーション、ユーティリティと辿り、ターミナルをクリックでそれぞれ黒い画面が開きます。</p>

<p>通常の環境では<code>npm install -g grunt-cli</code>と叩けば問題無いのですが、プロキシ環境下ではエラーが出てインストール出来ません。 <br />
色々とググって試したのですが、全然うまく行きませんでした...が、下記の方法でインストール出来ました。</p>

<pre class="code">
npm config set registry http://registry.npmjs.org/
npm config set proxy http://proxy.mycompany.com:8080
npm config set https-proxy https://proxy.mycompany.com:8080
</pre>

<p>proxy.mycompany.comにはプロキシサーバーのURL、:8080にはポート番号を入れます。 <br />
これで<code>npm install -g grunt-cli</code>と叩いてインストール出来ました。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Sassメモ</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/12/sass-memo.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1957</id>

    <published>2013-12-18T15:45:14Z</published>
    <updated>2013-12-25T15:33:23Z</updated>

    <summary>Sass記法のメモ。サンプルコードを主にネスト、親セレクタの参照、extend、プレースホルダ、mixin、if else、forなどを簡単に説明します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="HTML/CSS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sass" label="Sass" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2013/sass-memo.png"><img src="http://www.nk0206.com/life/assets_c/2013/12/sass-memo-thumb-650xauto-650.png" alt="Sassメモ"></a></p>
                ]]>
        <![CDATA[<h2>ネスト</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
main {
    margin-bottom: 3em;
    p {
        line-height: 1.4;
        margin-bottom: 1em;
    }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
main {
  margin-bottom: 3em;
}
main p {
  line-height: 1.4;
  margin-bottom: 1em;
}
</pre>

<p>Sassの最もベーシックな書き方だと思います。ネストで書くことによって見通しの良いCSSが書けますが、ネストのしすぎに注意。かえって見辛いコードになる可能性もあります。</p>

<h2>親セレクタ参照</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
a {
    text-decoration: none;
    &:hover {
        text-decoration: underline;
    }
}

.box {
    margin-bottom: 2em;
    background-color: #999;
    .top & {
        background-color: #eee;
    }
    &.info {
        background-color: #fff;
    }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
a {
  text-decoration: none;
}
a:hover {
  text-decoration: underline;
}
.box {
  margin-bottom: 2em;
  background-color: #999;
}
.top .box {
  background-color: #eee;
}
.box.info {
  background-color: #fff;
}
</pre>

<p>擬似セレクタの場合は&amp;:hoverのように書きます。親セレクタを参照したい場合は.top &amp;のように「参照する親セレクタ &amp;」と書きます。&amp;の後にセレクタを続ければ連結セレクタで出力します。</p>

<h2>変数と演算</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
$base-margin: 3em;

div {
    margin-bottom: $base-margin;
    p {
        line-height: 1.4;
        margin-bottom: $base-margin / 2;
    }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
div {
  margin-bottom: 3em;
}
div p {
  line-height: 1.4;
  margin-bottom: 1.5em;
}
</pre>

<p>ベースとなるカラーコードやmarginの値を変数に入れると便利です。変数は演算もできます。 <br />
小数点以下の処理を丸めたい場合はround()で四捨五入、ceil()で切り上げ、floor()で切り捨てとなります。</p>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
$base-margin: 5em;

div.round {
    margin-bottom: round($base-margin / 2);
}
div.ceil {
    margin-bottom: ceil($base-margin / 2);
}
div.floor {
    margin-bottom: floor($base-margin / 2);
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
div.round {
  margin-bottom: 3em;
}
div.ceil {
  margin-bottom: 3em;
}
div.floor {
  margin-bottom: 2em;
}
</pre>

<p>平澤さんのブログに非常にわかりやすい記事があります。<a href="http://css-happylife.com/archives/2012/0126_0001.php">変数と演算で効率的に</a></p>

<h2>mixn</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
@mixin clearfix {
    *zoom: 1; // lte ie7
    &:after {
        content: '';
        display: block;
        clear: both;
    }
}

.cf {
    @include clearfix;
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.cf {
  *zoom: 1;
}
.cf:after {
  content: '';
  display: block;
  clear: both;
}

</pre>

<p>@mixinは複数のプロパティをまとめて1つのプロパティのように扱います。@mixin mixin名 { prop: value; } を セレクタ { @include mixin名; } で呼び出します。 <br />
@mixinはパラメータを設定して柔軟に呼び出す事ができます。その場合は、@mixin mixin名(パラメータ) { prop: パラメータ; } をセレクタ { @include mixin名(パラメータ); } で呼び出します。 <br />
Compassなんかを使ってる場合、下のサンプルコードのようにCSS Sprite用のmixinとか作っておくと便利。</p>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
//スプライト画像の作成
$s1: sprite-map("/img/sprite/*.png", $spacing:20px, $layout: vertical);
//$name スプライト前の画像名
//$sorutes sprite-mapを指定
@mixin sprite-background($name, $sprites) {
  background: sprite-url($s1)no-repeat;
  background-position: sprite-position($sprites, $name);
  width: image-width(sprite-file($sprites, $name));
  height: image-height(sprite-file($sprites, $name));
}
//mixin呼び出し
.icon-config {
    @include sprite-background("Evernote", $s1);
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.icon-Evernote {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -52px;
  width: 32px;
  height: 32px;
}
</pre>

<p>/img/spreite/にpng画像を放り込んでおいてスプライト用のmixinを呼び出せば自動でスプライト画像を書き出してくれるのでもうCompass抜きでCSSスプライトは考えられません...</p>

<h2>extend</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
.box-main {
    margin: 1em;
    padding: 0.5em 1em;
    border: 1px solid #999;
    background-color: #ddd;
}

.box-sub {
    @extend .box-main;
    background-color: #eee;
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.box-main, .box-sub {
  margin: 1em;
  padding: 0.5em 1em;
  border: 1px solid #999;
  background-color: #ddd;
}
.box-sub {
  background-color: #eee;
}
</pre>

<p>セレクタを継承してまとめて記述してくれます。けれども後述のプレースホルダを使った方が余計な記述が減る場合も。</p>

<h2>プレースホルダ</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
//このセレクタは@extendで呼び出されない限り出力されない
%box-style {
    margin: 1em;
    padding: 0.5em 1em;
    border: 1px solid #999;
}

.box-main {
    @extend %box-style;
    background-color: #ddd;
}
.box-sub {
    @extend %box-style;
    background-color: #999;
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.box-main, .box-sub {
  margin: 1em;
  padding: 0.5em 1em;
  border: 1px solid #999;
  background-color: #ddd;
}
.box-sub {
  background-color: #999;
}
</pre>

<p>プレースホルダは%セレクタ名で記述します。@extend %セレクタ名で呼び出されない限り、CSSは出力されません。 <br />
先述のextendはあくまでも継承ですので、継承元のセレクタに継承したくないプロパティがあっても当然のように継承してしまうので、余計なCSSが増える可能性があります。 <br />
ですのでプレースホルダで共通のプロパティを用意して、それぞれのセレクタで個別のプロパティを書いたほうが効率が良いです。</p>

<h2>@if @else</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
$ie7: false;

@if($ie7) {
    //$ie7: trueの場合
    .box {
        display: inline-block;
        *display: inline;
        *zoom: 1;
    }
} @else {
    .box {
        display: inline-block;
    }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.box {
  display: inline-block;
}
</pre>

<p>Sassはプログラミング言語でよく使われる条件分岐であるif〜elseを利用できます。サンプルコードでは変数$ie7でIE7をサポートするかしないか（true/false）で.boxのプロパティを変えています。 <br />
if関数に関しては昨年のAdvent Calendarの<a href="http://jmblog.jp/archives/1017">Sassのif関数</a>が参考になります。</p>

<h2>@for</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
//スプライト画像の作成
$s1: sprite-map("/img/sprite/*.png", $spacing:20px, $layout: vertical);
//$name スプライト前の画像名
//$sorutes sprite-mapを指定
@mixin sprite-background($name, $sprites) {
  background: sprite-url($s1)no-repeat;
  background-position: sprite-position($sprites, $name);
  width: image-width(sprite-file($sprites, $name));
  height: image-height(sprite-file($sprites, $name));
}

//アイコン名を配列にセット
$socialList : Evernote, Facebook, Flickr, Github;

//length(配列名)で配列の長さを取得 nth(配列名, n)で配列名のn番目の要素を取得
@for $i from 1 through length($socialList){
  .icon-#{nth($socialList, $i)} {
    @include sprite-background(#{nth($socialList, $i)}, $s1);
  }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.icon-Evernote {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -52px;
  width: 32px;
  height: 32px;
}
.icon-Facebook {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -156px;
  width: 32px;
  height: 32px;
}
.icon-Flickr {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -104px;
  width: 32px;
  height: 32px;
}
.icon-Github {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 0;
  width: 32px;
  height: 32px;
}
</pre>

<p>if文同様、for文もプログラミング言語でよく使われます。サンプルコードでは先述のCSSスプライト用mixinを呼び出す箇所でfor文を使えば非常に短いコードで書けます。 <br />
サンプルコードではwidth, height, backgroundが重複していますが、mixinを分けてプレースホルダでincludeして...と言った書き方にすればさらにきれいなCSSを出力できます。
配列と値の取得に関しては<a href="http://cutupworks.ldblog.jp/archives/12353077.html">Sass(Scss)配列と値の取得</a>が参考になります。</p>

<h2>@each</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
//スプライト画像の作成
$s1: sprite-map("/img/sprite/*.png", $spacing:20px, $layout: vertical);
//$name スプライト前の画像名
//$sorutes sprite-mapを指定
@mixin sprite-background($name, $sprites) {
  background: sprite-url($s1)no-repeat;
  background-position: sprite-position($sprites, $name);
  width: image-width(sprite-file($sprites, $name));
  height: image-height(sprite-file($sprites, $name));
}

@each $socialList in Evernote, Facebook, Flickr, Github {
  .icon-#{$socialList} {
    @include sprite-background($socialList, $s1);
  }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.icon-Evernote {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -52px;
  width: 32px;
  height: 32px;
}
.icon-Facebook {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -156px;
  width: 32px;
  height: 32px;
}
.icon-Flickr {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 -104px;
  width: 32px;
  height: 32px;
}
.icon-Github {
  background: url(/img/sprite-scc43fbc7aa.png) no-repeat;
  background-position: 0 0;
  width: 32px;
  height: 32px;
}
</pre>

<p>ループ処理はfor文以外にeach文も使えます。先述のfor文をeachに置き換えるとかなりわかりやすいコードで書けます。
for文では繰り返す数を指定しなければならないのですが、each文は配列の値分だけ繰り返してくれるので、length()やnth()と言ったfunctionを使わないですみます。 <br />
ベンダープリフィックスを付加するmixinのサンプルでeach文はよく見かけますね。不要なベンダープリフィックスはmixinの方で削除すればいいのでとても便利です。</p>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
$prefixPattern: '-webkit-', '-moz-', '-ms-', '-o-', '';

@mixin prefix($prop, $value) {
  @each $prefix in $prefixPattern {
    #{$prefix}#{$prop}: $value;
  }
}
.round-corner {
  @include prefix(border-radius, 5px);
}
.transition {
  @include prefix(transition, 0.5s);
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
.round-corner {
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  -ms-border-radius: 5px;
  -o-border-radius: 5px;
  border-radius: 5px;
}
.transition {
  -webkit-transition: 0.5s;
  -moz-transition: 0.5s;
  -ms-transition: 0.5s;
  -o-transition: 0.5s;
  transition: 0.5s;
}
</pre>

<h2>@function</h2>

<p class="codeHeadline">Sass</p>

<pre class="code" lang="css">
$base-margin: 3em;

@function mg-half() {
  @return $base-margin / 2;
}

@function mg-thrid() {
  @return $base-margin / 3;
}

@function mg-quater() {
  @return $base-margin / 4;
}


section {
  margin-bottom: $base-margin;

  h1 {
    margin-bottom: mg-thrid();
  }

  p {
    margin-bottom: mg-half();
  }

  dl {
    margin: 0 mg-thrid() mg-half();
    dt {
      margin-bottom: mg-quater();
    }
    dd {
      margin-bottom: mg-thrid();
    }
    dd + dd {
      margin-bottom: mg-quater();
    }
  }
}
</pre>

<p class="codeHeadline">CSS</p>

<pre class="code" lang="css">
section {
  margin-bottom: 3em;
}
section h1 {
  margin-bottom: 1em;
}
section p {
  margin-bottom: 1.5em;
}
section dl {
  margin: 0 1em 1.5em;
}
section dl dt {
  margin-bottom: 0.75em;
}
section dl dd {
  margin-bottom: 1em;
}
section dl dd + dd {
  margin-bottom: 0.75em;
}
</pre>

<p>@functionは独自のファンクション（関数）を作る事ができます。@function内で実行された内容を@returnで返します。 <br />
サンプルコードではベースとなるmarginに対して2分の1、3分の1、4分の1の独自ファンクションを作り、それぞれのセレクタ内で呼び出してます。 <br />
@functionは@mixinほど使用頻度は少ないと思われますが、あれやりたい...なんて思った時に@functionでできる場合もあるので頭の片隅に入れておくと良いと思います。</p>
]]>
        
    </content>
</entry>

<entry>
    <title>jQuery スクロールに追従するサイドバー</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/12/jquery-fixed-side-bar.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1956</id>

    <published>2013-12-17T14:54:49Z</published>
    <updated>2013-12-17T15:26:10Z</updated>

    <summary>最近はあまり見なくなりましたが、スクロールに追従（スクロールしても固定）するサイドバーをjQueryで書く案件があったのでブログの記事にしておきます。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2013/jq-fixed-img-01.jpg"><img src="http://www.nk0206.com/life/assets_c/2013/12/jq-fixed-img-01-thumb-650xauto-647.jpg" alt="jQuery スクロールに追従するサイドバー"></a></p>
                ]]>
        <![CDATA[<div class="edit">
<p>この記事で使うイベントやメソッドなど</p>
<p><code>.scrollTop();</code><br>
<code>.css('prop', 'value');</code><br>
<code>$(window).scroll(function() { Do Something });</code></p>
</div>
<p>ヘッダーとフッターがあり、メインのコンテンツとサイドバーがある簡単な2カラムレイアウトで考えます。（都合上サイドバーは.side-barの中に追従するコンテンツを入れるといった入れ子のマークアップをします。）</p>
<p class="photo"><a href="http://www.nk0206.com/life/images/2013/jq-fixed-img-02.png"><img alt="jq-fixed-img-02.png" src="http://www.nk0206.com/life/assets_c/2013/12/jq-fixed-img-02-thumb-200x155-648.png" width="200" height="155" class="mt-image-none" style="" /></a></p>
<p>このレイアウトで追従して欲しいサイドバーの追従範囲はコンテンツの高さです。スクロールしてヘッダーが見えなくなった場所でサイドバーをページ上部に固定します。追従を解除する場所はフッターがサイドバーの最下部に到達した場所です。</p>
<p>まずは各要素の高さをそれぞれ変数に入れましょう。追従する範囲となるサイドバーの高さをコンテンツの高さと揃えます。合わせて追従を解除する場所（ヘッダーの高さとコンテンツの高さを足した値から追従するサイドバーの高さを引いた値）も変数に入れます。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
    //各要素の高さ
    var headerHeight = $('.page-header').height();
    var contentsHeight = $('.page-body').height();
    var fixedSideBarHeight = $('#fixed-side-bar').height();

    //サイドバーの高さをコンテンツの高さと揃える
    $('.side-bar').css('height', contentsHeight);

    //追従を解除する場所
    var scrollStopPos = headerHeight+contentsHeight-fixedSideBarHeight;
});
</pre>
<p>スクロールイベントが始まると、どれだけスクロールしたかを監視します。どれだけスクロールしたかのスクロール量はjQueryのメソッドである<code>.scrollTop()</code>で求めることができます。  <br/>
追従を開始する場所と解除する場所に来たらそれぞれjQueryでCSSのプロパティを変更します。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
    //各要素の高さ
    var headerHeight = $('.page-header').height();
    var contentsHeight = $('.page-body').height();
    var fixedSideBarHeight = $('#fixed-side-bar').height();

    //サイドバーの高さをコンテンツの高さと揃える
    $('.side-bar').css('height', contentsHeight);

    //追従を解除する場所
    var scrollStopPos = headerHeight+contentsHeight-fixedSideBarHeight;

    //イベント開始
    $(window).scroll(function() {
        //スクロール量
        var scrollVal = $(window).scrollTop();
    });
}); 
</pre>
<p>ここからはif〜else if〜else文で条件を指定していきます。  <br/>
if 追従区間 { 追従 } else if 追従解除位置 { 追従解除 } else { 通常 } と言う条件になります。</p>
<p>追従区間はスクロール量 > ヘッダーの高さ かつ 追従解除する場所 > スクロール量になります。
この条件になったら<code>.css()</code>で<code>position: fixed; top: 0;</code>にします。</p>
<p>追従解除位置はスクロール量 > 追従解除する場所になります。  <br/>
この条件になったら<code>position: absolute; bottom: 0</code>にします。</p>
<p>通常（追従範囲外）の場合は<code>position: static;</code>とします。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
    //各要素の高さ
    var headerHeight = $('.page-header').height();
    var contentsHeight = $('.page-body').height();
    var fixedSideBarHeight = $('#fixed-side-bar').height();

    //サイドバーの高さをコンテンツの高さと揃える
    $('.side-bar').css('height', contentsHeight);

    //追従を解除する場所
    var scrollStopPos = headerHeight+contentsHeight-fixedSideBarHeight;

    //イベント開始
    $(window).scroll(function() {
        //スクロール量
        var scrollVal = $(window).scrollTop();

        //追従区間
        if(headerHeight &lt; scrollVal &amp;&amp; scrollStopPos &gt; scrollVal) {
            $('#fixed-side-bar').css({
                'position': 'fixed',
                'top': '0'
            });
        //追従解除
        } else if(scrollStopPos &lt; scrollVal) {
            $('#fixed-side-bar').css({
                'position': 'absolute',
                'top': '',
                'bottom': '0'
            });
        //デフォルト
        } else {
            $('#fixed-side-bar').css('position', 'static');
        }
    });
});
</pre>
<p><a href="http://www.nk0206.com/demo/jquery/jq.fixed/" class="btn demo"><span>View Demo</span></a></p>]]>
        
    </content>
</entry>

<entry>
    <title>和田静香さん発、選挙ステッカーに参加</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/07/go-vote.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1950</id>

    <published>2013-07-10T14:54:26Z</published>
    <updated>2013-07-10T15:02:04Z</updated>

    <summary>先日行われた都議会選挙の投票率は過去2番目に低い43.50％でした。昨年行われた...</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Diary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2013/go_vote.png"><img src="http://www.nk0206.com/life/assets_c/2013/07/go_vote-thumb-650xauto-642.png" alt="和田静香さん発、選挙ステッカーに参加"></a></p>
                ]]>
        <![CDATA[<p>先日行われた都議会選挙の投票率は過去2番目に低い43.50％でした。昨年行われた都知事選で62.60％、同時に行われた衆院選は59.32％となかなか投票率はあがりません。</p>
<p>そんな中、ライターの和田静香さんがツイッターで呼びかけたのが選挙ステッカーでした。アメリカじゃ、ビヨンセやケイティ・ペリーも選挙に行ったら「VOTED!」とステッカーを貼ってるよ！とツイートすると、様々なクリエーターが参加しだしました。<br /> なんと吉田戦車さんまで参加してびっくり！</p>
<p>そんな訳で僕も少しでも投票率があがるようにと選挙ステッカーを作ってみました。もちろん犬ですが、今回はノリゾー犬を使わずに新たにパグのイラストを書き下ろしました。</p>
<p>何パターンか作ったのですが、やはりiPhoneなどのスマフォが貼りやすいかな？と思い、5cm×5cm（吹き出し入りは5cm×7cm）で青バージョンと黄バージョンの2色展開で作りました。</p>
<ul class="basic1">
<li><a href="https://www.dropbox.com/s/5sniis84qilrjxs/go_vote02_b.pdf">青バージョン(リンク先PDF)</a></li>
<li><a href="https://www.dropbox.com/s/cu7q9z37zwlezqk/go_vote02.pdf">黄バージョン(リンク先PDF)</a></li>
</ul>
<p>よろしければiPhoneに貼ってみてください。</p>
<dl class="linkage">
<dt>togetter</dt>
<dd><a href="http://togetter.com/li/525542" class="oslink">#選挙ステッカー</a></dd>
<dd><a href="http://togetter.com/li/528080" class="oslink">#選挙ステッカー その2だよ</a></dd>
<dd><a href="http://togetter.com/li/531254" class="oslink">選挙ステッカーどれがいい？</a></dd>
</dl>]]>
        
    </content>
</entry>

<entry>
    <title>制作環境を整えるステップのメモ</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/06/production-environment.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1948</id>

    <published>2013-06-09T06:13:08Z</published>
    <updated>2013-12-19T15:55:34Z</updated>

    <summary>XAMPPやMAMPを入れて、Compassをインストール、SassをCSSにコンパイル出来るようにするまでのローカル環境構築を、Windowsの場合とMacの場合の両方をメモしておこうと思います。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Web" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mamp" label="MAMP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webサーバー" label="webサーバー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2013/production-environment.jpg"><img src="http://www.nk0206.com/life/assets_c/2013/06/production-environment-thumb-650xauto-640.jpg" alt="制作環境を整えるステップのメモ"></a></p>
                ]]>
        <![CDATA[<h2>1.XAMPP または MAMP をダウンロードする</h2>
<p>Windowsなら<a href="http://www.apachefriends.org/jp/xampp-windows.html" class="oslink">XAMPP</a>、Macなら<a href="http://www.mamp.info/" class="oslink">MAMP</a>をダウンロードする。Macでも好みによってはXAMPPを利用するのももちろん有り。</p>
<h2>2.Vertual Hostの設定とhostsへの追記</h2>
<p>http://hoge.localhost/でアクセス出来るようにVertual Hostの設定とhostsへの追記をする。</p>
<h3>Vertual Host</h3>
<p>XAMPPはhttpd-vhosts.confを編集。場所はC:\xampp\apache\conf\extra<br /> MAMPはhttpd.confを編集。場所はMAMP/conf/apache</p>
<h3>hosts</h3>
<p>hostsにドメイン名を記述。WindowsはC:\WINDOWS\system32\drivers\etcにあり、Macは/private/etc/にある。</p>
<p>設定の方法は過去記事参照<a href="http://www.nk0206.com/life/2010/07/mampvirtualhost.html">MAMPでVirtualHostを設定する</a></p>
<h2>3.Rubyのインストール</h2>
<p>Windowsは標準でRubyが入っていないので<a href="http://rubyinstaller.org/downloads/" class="oslink">RubyInstaller</a>からダウンロードしてきてインストール。コマンドたたいてインストールの確認をする。</p>
<pre class="code">ruby -v </pre>
<h2>4.Compassのインストール</h2>
<p>コマンドラインよりインストール。</p>
<pre class="code">gem update --system
gem install compass </pre>
<p>プロキシ越しの場合</p>
<pre class="code">gem install compass -r -p http://proxy.hoge.jp:ポート番号 </pre>
<p>インストールの確認</p>
<pre class="code">compass -v</pre>
<h2>5.Compassの設定</h2>
<h3>config.rbを作成</h3>
<p>該当ディレクトリにconfig.rbの名前でファイルを作成し、下記を記述。</p>
<pre class="code">http_path = "/"
css_dir = "shared/css"
sass_dir = "shared/sass"
images_dir = "/"
javascripts_dir = "shared/js"
output_style = (environment == :production) ? :compressed : :expanded
line_comments = (environment == :production) ? :false : :true</pre>
<p>CSSやSASSのパスなどは環境によって変更</p>
<h3>バッチファイルの作成</h3>
<p>sassファイルの変更を監視するバッチファイルを作成。<br /> 開発環境用はexpanded形式、本番環境用はcompact形式でコンパイルする。<br /> 拡張子はWindows用は.batでMac用は.command</p>
<h4>Windows</h4>
<p class="mb00">本番.bat</p>
<pre class="code">compass watch -e production</pre>
<p>開発.bat</p>
<pre class="code">compass watch</pre>
<h4>Mac</h4>
<p>本番.command</p>
<pre class="code">#!/bin/bash
htdocs=$(dirname $0)
cd $htdocs
compass watch -e production</pre>
<p>開発.command</p>
<pre class="code">#!/bin/bash
htdocs=$(dirname $0)
cd $htdocs
compass watch</pre>
<p>以上でとりあえずWordpressやMovable TypeをローカルにインストールしてSassを使って制作する環境が整う。</p>]]>
        
    </content>
</entry>

<entry>
    <title>久々にブログリニューアルしました</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/06/blog-renewal-2013.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1947</id>

    <published>2013-06-03T15:44:10Z</published>
    <updated>2013-06-09T14:31:55Z</updated>

    <summary>2013年6月、ひさびさにブログのデザインをリニューアルしました。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Diary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
                <p class="photo2"><a href="http://www.nk0206.com/life/images/2013/blog-ren.png"><img src="http://www.nk0206.com/life/assets_c/2013/06/blog-ren-thumb-650xauto-639.png" alt="久々にブログリニューアルしました"></a></p>
                ]]>
        <![CDATA[<p>ドメイン所得してMovable Typeを使い始めたのが2006年。当初は青と言うカラーテーマはあったのですが、犬と言うテーマはまだありませんでした。（その頃はクマだった）<br/>
しばらくして青と犬と言うテーマに決めて青いシルエットの犬のイメージでアバター〜ブログ〜名刺と統一して来ました。</p>

<p>変わる事の無かった犬のシルエットを今になって「もっとちゃんとした犬のイラストに変更したい」と思い、何パターンも書いて気に入ったイラストをメインイメージにチェンジしました。</p>

<p>ブログも同一デザインに！と思ってはいてもなかなか時間がとれず、アバターを変更してから結構日数が経ってしまいましたが、ようやっとリデザイン出来ました。</p>

<p>今回はシルエットでなく、イラストをきっちり書いたのでやはりRetna Displayでもきれいに見えて欲しい！なのでSVGを利用しました。<br>
アイコン関連は今までPhotoshopで書いてたのですが、<a href="http://fortawesome.github.io/Font-Awesome/" class="oslink">Font Awesome</a>のアイコンフォントを使わせてもらいました。タイトルフォントは<a href="http://www.dafont.com/code.font" class="oslink">Code</a>を使わせてもらいました。</p>

<p>今まではデザインするにあたって、Photoshopで簡単なカンプを作ってたのですが、今回は作らずにブラウザでデザインする手法で作っていきました。スマフォ画面をメインに、PC用にCSSを書き加えていくと言った手法をとりました。</p>

<p>書きたいと思っていた記事もたくさんあるのですが、こちらもなかなか書けず...<br>
リニューアルを期にまたちょいちょいと記事を書いて行こうと思いますので宜しくお願いいたします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>VMWare Fusion＋MAMP MacのlocalhostをWindowsでも確認する</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2013/01/vmware-fusion-mamp.html" />
    <id>tag:www.nk0206.com,2013:/life//2.1945</id>

    <published>2013-01-29T15:19:46Z</published>
    <updated>2013-06-09T10:44:47Z</updated>

    <summary>普段MAMPのApacheを利用してローカル環境を構築しています。WordpressやMovableTypeを利用しているので、それぞれにバーチャルホストを設定しています。例えばwordpress.localhostやmovabletype.localhostでアクセス出来るように設定しているのですが、VMWare FusionにインストールしたWindowsで確認するには少々手こずったのでメモがてら記事にします。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="Web" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mamp" label="MAMP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webサーバー" label="webサーバー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        <![CDATA[
            <p class="photo"><a href="http://www.nk0206.com/life/2013/01/img/mamp_vmwarefusion.jpg"><img src="http://www.nk0206.com/life/assets_c/2013/01/mamp_vmwarefusion-thumb-200xauto-633.jpg" alt="VMWare Fusion＋MAMP MacのlocalhostをWindowsでも確認する"></a></p>

            ]]>
        <![CDATA[<p>普段MAMPのApacheを利用してローカル環境を構築しています。WordpressやMovableTypeを利用しているので、それぞれにバーチャルホストを設定しています。<br /> 例えばwordpress.localhostやmovabletype.localhostでアクセス出来るように設定しているのですが、VMWare FusionにインストールしたWindowsで確認するには少々手こずったのでメモがてら記事にします。</p>
<div class="edit">
<p>環境<br /> OS 10.7.5 / MAMP 1.9.1 / VMWare Fusion4.1.3 / Windows XP</p>
</div>
<p>バーチャルホストの設定に関しては以前<a href="http://www.nk0206.com/life/2010/07/mampvirtualhost.html">MAMPでVirtualHostを設定する</a>と言う記事を書きましたので必要があればこちらを参照してみて下さい。</p>]]>
        <![CDATA[<p>まずはMAMPのhttpd.confにポートを追加します。通常はListen 80かListen 8888になっていると思いますが、もう一つポートを追加してあげます。僕の場合は8000と言うポートを追加しました。</p>
<pre class="code">Listen 80
# 8000ポートを新規追加
Listen 8000
</pre>
<p>次にバーチャルホストの設定。80ポートはMacから、8000ポートはVMWare Fusion上からアクセスするために追加します。<br /> DocumentRootは僕の場合はホームの直下にhtdocsを置いているのでこのような設定にしています。</p>
<pre class="code">&lt;VirtualHost *:80&gt;
DocumentRoot "/Users/MyName/htdocs/hoge"
ServerName hoge.localhost
&lt;/VirtualHost&gt;

&lt;VirtualHost *:8000&gt;
DocumentRoot "/Users/MyName/htdocs/hoge"
ServerName hoge.localhost
&lt;/VirtualHost&gt;
</pre>
<p>/private/etc/hostsにも忘れずに書き加えます。（privateフォルダは不可視フォルダなのでShift＋Command＋Gキーで移動します。）</p>
<pre class="code">127.0.0.1 hoge.localhost
</pre>
<p>MacのIPアドレスを調べます。ユーティリティ/システム情報.appを起動させてネットワークのIPv4アドレスを調べてメモっておきます。</p>
<p>MAMPを再起動させてMac側の設定は終わりです。</p>
<p>VMWare FusionのWindows側に移ります。</p>
<p>C:\WINDOWS\system32\drivers\etcとたどり、hostsファイルをメモ帳などで開きます。（hostsファイルは念のためにバックアップを取っておきます。）</p>
<p>先ほどメモったIPアドレス＋半角スペース＋Macで設定したバーチャルホストのServerNameを記述します。</p>
<pre class="code">XXX.XXX.X.X hoge.localhost
</pre>
<p style="margin-bottom: .5em;">VMWare Fusionのネットワーク設定をブリッジ（自動検出）にします。</p>
<p style="margin-bottom: .5em; text-align: center;"><a href="http://www.nk0206.com/life/2013/01/img/vmwarefusion_network.jpg"><img alt="VMWare Fusionのネットワーク設定" src="http://www.nk0206.com/life/assets_c/2013/01/vmwarefusion_network-thumb-540x253-635.jpg" width="540" height="253" class="mt-image-none" /></a></p>
<p>これでhttp://hoge.localhostへとアクセス出来るようになります。</p>
<p>ああ...大変だった...</p>]]>
    </content>
</entry>

<entry>
    <title>jQueryタブプラグインでリンク元にパラメータを与えて開くタブを制御する</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/05/jquery-tab05.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1943</id>

    <published>2012-05-25T15:55:34Z</published>
    <updated>2013-06-09T14:15:31Z</updated>

    <summary>jQueryタブプラグインをURLにパラメータを付けて特定のタブが開いた状態へリンクを貼れるように改修いたしました。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        
        <![CDATA[<p>特定のタブが開いている状態でリンクをさせたい時は無いでしょうか？例えば3番目のタブがアクティブになっている状態に...などです。</p>
<p>4回に渡ってタブプラグインを改修していきましたが、今回はURLにパラメータを付けて特定のタブが開いた状態へリンクを貼れるように改修いたしました。（正確には書いてもらった...）</p>
<p>詳しい解説は今回は省きますが、内容はURLに付いたパラメータを解析するメソッドを用意し、パラメータに応じて開くタブを制御しています。タブ数は4つまで対応するようになっています。</p>]]>
        <![CDATA[<h2 class="level2">使い方</h2>
<p class="mb0">オプションで用意しているプロパティは以下の通り</p>
<dl class="basic1">
<dt>targetID</dt>
<dd>初期値 #tab</dd>
<dd>タブメニューと表示・非表示するブロックを梱包するdivのID名を指定</dd>
<dt>tabElement</dt>
<dd>初期値 .tab-list li</dd>
<dd>タブメニューを指定</dd>
<dt>boxElement</dt>
<dd>初期値 .tab-box</dd>
<dd>表示・非表示するdivのクラス名を指定</dd>
<dt>defaultOpenTab</dt>
<dd>初期値 0</dd>
<dd>最初に開くタブのインデックスを指定</dd>
<dt>paramNam</dt>
<dd>初期値 tab</dd>
<dd>URLに付加するパラメータの値で?と=の間の名前を指定<br /> URLに対し?tab=のようなパラメータを指定</dd>
<dt>tabName01〜tabName04</dt>
<dd>初期値 tab01〜tab04</dd>
<dd>URLに付加するパラメータで=の後の値を指定<br /> URLに対し?tab=tab01のようなパラメータを指定</dd>
</dl>
<p>初期値のままで使う場合はリンク元のhref属性にhoge.html?tab=tab02と指定した場合、2番目のタブが開いた状態、hoge.html?tab=tab03と指定した場合、3番目のタブが開いた状態で表示されます。</p>
<p><a href="http://www.nk0206.com/demo/jquery/tab04-01.html" class="btn demo"><span>View Demo</span></a></p>
<p>ソースコードはGithubに置いてあります。</p>
<p><a href="https://github.com/poundhound/jq.tab" class="oslink">github poundhound/jq.tab</a></p>]]>
    </content>
</entry>

<entry>
    <title>jQueryタブプラグインで最初に表示されるタブを選択出来るようにする</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/05/jquery-tab04.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1941</id>

    <published>2012-05-12T16:48:50Z</published>
    <updated>2012-05-12T16:52:02Z</updated>

    <summary>jQueryタブプラグインの4回目の記事です。今回はn番目のタブが選択された状態を初期値として設定出来るように改修します。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        
        <![CDATA[<p>jQueryを使ったタブメニューの第4回目です。（しつこい）</p>
<p>前回はjQuery Cookie プラグインを使ってタブの表示状態を保持するように改修しました。<br />
今回は最初に表示されるタブを選択出来るように改修します。</p>
]]>
        <![CDATA[<p>今回のコードの完成形です。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">
(function($) {
	$.fn.tabs = function(options) {
		var o = $.extend({
			targetID: '#tab',
			tabElement: '.tab-list li',
			boxElement: '.tab-box',
			defaultOpenTab: 0
		}, options);
	
		$(o.tabElement, o.targetID).each(function() {
			
			var selectedTab = $.cookie(o.targetID + 'selectedTab');
			if (selectedTab) {
				$(o.boxElement, o.targetID).not(':eq(' +selectedTab+')').hide();
				$(o.tabElement, o.targetID).eq(selectedTab).addClass('selected');				
			} else {
				$(o.boxElement, o.targetID).hide().eq(o.defaultOpenTab).show();
				$(o.tabElement, o.targetID).eq(o.defaultOpenTab).addClass('selected');
			}
			
			$(this).click(function(){
				var tabIndex = $(o.tabElement, o.targetID).index(this);
				$.cookie(o.targetID + 'selectedTab', tabIndex);
				$(o.tabElement, o.targetID).removeClass('selected');
				$(this).addClass('selected');
				$(o.boxElement, o.targetID).hide().eq(tabIndex).addClass('selected').fadeIn();
			});
			
		});
		return this;
	};
})(jQuery);
</pre>
<p>前回と違うのは7行目と17、18行目だけです。</p>
<p>何をやっているかと言うと7行目に最初に選択されているタブをオプションとして設定します。0が1番目、1が2番目になります。（初期値は0とします）</p>
<p>17行目は以前のコードでは『1番目の内容以外を非表示』としていたのを『n番目の内容以外を表示』に変更します。<br />
まずは全ての内容を.hide()で非表示にして、.eq(<span class="code">n番目</span>)を.show()で表示します。<br />
18行目は.eq(n番目)のタブ（liタグ）に.addClass()します。</p>
<p>これでn番目のタブが選択された状態を初期値として設定出来るようになります。</p>
<p>GithubデビューしたのでGithubにコードを置いておきました。宜しければご自由にお使いください。</p>
<p><a href="https://github.com/poundhound/jq.tab" class="oslink">github poundhound/jq.tab</a></p>]]>
    </content>
</entry>

<entry>
    <title>bodyに指定するfont-sizeやfamilyなど</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/05/body-font-size-family.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1940</id>

    <published>2012-05-07T16:48:41Z</published>
    <updated>2012-05-07T16:58:17Z</updated>

    <summary>bodyに記述するfont-size、font-familyの一例。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="HTML/CSS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ie対策" label="IE対策" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        
        <![CDATA[ <p>以前エントリーした記事、<a href="http://www.nk0206.com/life/2009/06/ie8ie7ie6ffms-pmac-safariff.html">IE8とIE7はメイリオ、IE6/FFはMS Pゴシック、Mac Safari/FFはヒラギノ角ゴを表示</a>から早くも3年近く経っている事にびっくりしました。ブラウザに関する事情は大きく変わってIEの最新版は9で現役のIEは6〜9（IE6を排除するサイトもだいぶ増えましたが）加えてChromeのシェア上昇、Safariは5に、Firefoxに至っては12！でブラウザが乱立する状態になっています。<br />
これだけブラウザの進化が早いと出来る限りハックは使わず...と言うのが安全策だと思います。<br />
どうしても使う場合は極力シンプルに！と言う事で以前はセレクタハックを使っていたのですが、プロパティに記述するハックに切り替えてます。</p>
<p>※基本bodyに指定するフォント関連でのみ使用し、他の場所では極力ハックは使わないようにしています。決してハックを推奨する記事ではありません。</p>]]>
        <![CDATA[<p class="codeHeadline">CSS Code</p>
<pre class="code" lang="css">body {
	font-family: Verdana, Arial, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ W3", Osaka, "ＭＳ Ｐゴシック", sans-serif;
	font-size: 13px;
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
	font-size: 82%\9;
	_font-family: Verdana, Arial, "ＭＳ Ｐゴシック", sans-serif;
	_vertical-align: baseline;
	color: #333;
}
body:not(:target) {
	font-family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
	font-size: 82%\9;
}
</pre>
<p>\9ハックはIE8以下のブラウザにスタイルを適用するハックです。IE9はこのハックは適用されませんので<code>:not(:target) { color: #333\9; }</code>と記述する事によりIE9に適用されます。<br />
_ハックはIE6のみに適用されるハックです。</p>
<p>セレクタハックを使うより記述がシンプルだと思います。ちなみに僕はSassを使っているので、こんな形で記述しています。</p>
<pre class="code" lang="css">@mixin font-main {
	font: {
		family: Verdana, Arial, Hiragino Kaku Gothic Pro, "ヒラギノ角ゴ W3", Osaka, "ＭＳ Ｐゴシック", sans-serif;
		size: 13px;
	}
}
@mixin font-ie {
	font: {
		family: Verdana, Arial, "メイリオ", Meiryo, "ＭＳ Ｐゴシック", sans-serif\9;
		size: 82%\9;
	}
}
@mixin font-lte-ie6 {
	_font-family: Verdana, Arial, "ＭＳ Ｐゴシック", sans-serif;
	_vertical-align: baseline;
}

body {
	@include font-main;
	@include font-ie;
	@include font-lte-ie6;
	color: #333;
	
	&amp;:not(:target) {
		@include font-ie;
	}
}
</pre>
<p>これがコンパイルされると先述したCSSコードになります。</p>]]>
    </content>
</entry>

<entry>
    <title>指定した秒数ごとに画像がスライドするカルーセル</title>
    <link rel="alternate" type="text/html" href="http://www.nk0206.com/life/2012/03/jquery-carousel01.html" />
    <id>tag:www.nk0206.com,2012:/life//2.1939</id>

    <published>2012-03-27T16:38:54Z</published>
    <updated>2012-04-24T16:18:05Z</updated>

    <summary>jQueryカルーセルの作成方法を解説した記事です。</summary>
    <author>
        <name>poundhound</name>
        
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jquery" label="jQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.nk0206.com/life/">
        
        <![CDATA[<p>jQueryを使ったカルーセルプラグインはたくさんあるのであまり困る事は無いと思いますが、試しに自分で作ってみたので2回に分けてカルーセルの作り方を記事にします。</p>
<p>1回目は指定した秒数ごとに画像がスライドする無限ループのカルーセルを作ります。2回目は無限ループに加え、ボタンを画像分用意し、クリックするとボタンに対応した画像が表示されると言ったものに改造して行きます。（余裕があれば3回の記事にし、プラグイン化しようと思います。）</p>
<p>プログラムの流れは下記のような流れに従って作ります。</p>
<ul class="basic1">
<li>画像の数や幅などの初期設定を行う。</li>
<li>画像が左にスライドするアニメーションを作る。</li>
<li>このアニメーションをメソッド化する。</li>
<li>指定した秒数でこのメソッドを実行させる。</li>
</ul>]]>
        <![CDATA[<p>まずデモで完成形をご覧ください。</p>
<p class="viewDemo"><a href="http://www.nk0206.com/demo/jquery/carousel01.html"><span>View Demo</span></a></p>

<p>それではコードを解説して行きます。</p>
<h2 class="level2">HTML</h2>
<p>HTMLは下記のようなソースコードになります。</p>
<p class="codeHeadline">HTML Code</p>
<pre class="code" lang="html">&lt;div id="carousel"&gt;
	&lt;div class="window"&gt;
		&lt;div class="images"&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo01.jpg" width="360" height="270" alt="" /&gt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo02.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo03.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo04.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo05.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
				&lt;li&gt;&lt;img src="img/img_c-photo06.jpg" width="360" height="270" alt="" /&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
</pre>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel04.png"><img alt="カルーセルの説明図04" src="http://www.nk0206.com/life/images/2012/fig_carousel04.png" width="580" height="130" class="mt-image-none" /></a></p>

<p>図にするとこんな感じです。div#carouselの中にdiv.windowがあります。div.windowの役目は画像を表示する領域の指定です。画像（img要素）はul liでマークアップし、div.imagesで包みます。このdiv.imagesを一定時間ごとに左へスライドさせます。</p>
<h2 class="level2">初期設定</h2>
<p>まずは初期設定です。ここでは使い回しそうな値を変数に入れておきます。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	var carousel = $('div.images');
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li');
	var imageWidth = carouselLi.find('img').width();
});
</pre>
<p>初期設定ではそれぞれの値を変数に入れておきます。</p>
<dl class="basic1">
<dt>var carousel</dt>
<dd>スライドさせる画像リストを梱包するdiv。（実際にスライドさせるdiv）</dd>
<dt>var carouselUl</dt>
<dd>画像リストul要素。</dd>
<dt>var carouselLi</dt>
<dd>画像リストli要素。</dd>
<dt>var imageWidth</dt>
<dd>画像（img要素）の幅。指定した秒ごとにこの幅分スライドする。<br />
</dd>
</dl>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel05.png"><img alt="カルーセル説明図05" src="http://www.nk0206.com/life/images/2012/fig_carousel05.png" width="580" height="109" class="mt-image-none" /></a></p>
<p>今回作るカルーセルは画像を無限にスライドさせます。無限ループをすると言う事は、最後の画像が表示されたら画像リストを元の位置（座標0,0）に戻す必要があります。<br />
この際に画像リストが1組しかないと、最後の画像が左にスライドする事無く元の位置に戻るため、きれいなアニメーションになりません。<br />
この状態を回避するにはもう1組の画像リストを用意し、2組目の画像リストが表示された時にdiv.images（var carousel）を元の位置に戻してあげればいいわけです。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel06.png"><img alt="カルーセル説明図06" src="http://www.nk0206.com/life/images/2012/fig_carousel06.png" width="580" height="88" class="mt-image-none" /></a></p>
<p>要素を複製するには<strong>.clone()</strong>メソッドを利用します。そして複製した要素をdiv.imagesに追加します。要素を追加するには<strong>.appendTo()</strong>を利用します。</p>
<p>これでdiv.imagesには2つのul要素を内包しました。このdiv.imagesには幅をセットします。幅を指定するには<strong>.css('property', 'value')</strong>を利用します。<br />
幅の値は(画像の幅 × 画像の数) × 2で求めらるので次のようなコードになります。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
carousel.css('width', carouselLi.length * imageWidth * 2); //幅を設定
</pre>
<h2 class="level2">アニメーションの作成</h2>
<p>いよいよアニメーションの部分に入ります。画像の幅分左にスライドするアニメーションを作ります。アニメーションは下図のようにdiv.images（carousel）を指定した秒ごとにimgの幅分（imageWidth）スライドすると言うものです。</p>
<p>表示領域のdiv.windowにはCSSでposition: relative;を記述してます。この左端を起点にdiv.imagesをposition: absolute;で絶対配置し、jQueryのanimateメソッドでleftプロパティを操作します。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel07.png"><img alt="カルーセル説明図07" src="http://www.nk0206.com/life/images/2012/fig_carousel07.png" width="580" height="91" class="mt-image-none" /></a></p>
<p>animateメソッドは<strong>.animate(params, [duration], [easing], [callback])</strong>のような書式になります。paramsにはcssのプロパティを、durationにはアニメーションの動作時間をミリ秒で、または'slow'や'normal'、'fast'などのキーワードで、easingにはイージングを指定します（easingプラグインを入れてない場合は'liner'か'swing'のみ）。callbackにはアニメーションが終わった後に実行するメソッドを指定します（コールバック関数と言います）</p>
<p>まずは左に画像の幅分スライドするアニメーションを記述します。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
</pre>
<p>これだけでは1回しかアニメーションは実行されません。常にアニメーションをさせるには<strong>setInterval()</strong>を利用します。<br />
setIntervalを利用すると指定した秒数ごとに実行するメソッドを呼び出す事が出来ます。setIntervalは次のような書式になります。
</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">setInterval(function() {
	Do something
},ミリ秒);
</pre>
<p>先ほど記述したアニメーションをメソッド化してDo somethingの所で指定した秒数ごとに呼び出すようにしましょう。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">function carouselAnimate() {
	carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
}

setInterval(function() {
	carouselAnimate();
},2000);
</pre>
<p>これで2000ミリ秒毎にcarouselAnimate()が呼び出されるので、2000ミリ秒毎にdiv.images（carousel）がimageWidth分左にスライドして行きます。</p>
<p>さて、ここまでのコードを1度まとめて見てみましょう。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {

	//初期設定
	var carousel = $('#images');
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li');
	var imageWidth = carouselLi.find('img').width();
	
	carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
	carousel.css('width', carouselLi.length * imageWidth * 2); //幅を設定
	
	//スライドアニメーション
	function carouselAnimate() {
		carousel.animate({'left' : '-=' +(imageWidth)}, 'slow'});
	}
	
	//指定した秒数ごとの処理
	setInterval(function() {
		carouselAnimate();
	},2000);
	
});
</pre>

<h2 class="level2">無限ループの動作を作る</h2>
<p>さて、このままではdiv.imagesは永遠に左にスライドし続けてしまいます。さきほどちょっと触れた無限ループの動作を作って行きます。</p>
<p> スライドアニメーションを無限ループにするためには複製した2組目の画像リストの1番目の画像が表示された後直後に、div.images（carousel）を元の位置（座標0,0）に戻してあげます。</p>
<p><a href="http://www.nk0206.com/life/images/2012/fig_carousel08.png"><img alt="カルーセル説明図08" src="http://www.nk0206.com/life/images/2012/fig_carousel08.png" width="580" height="138" class="mt-image-none" /></a></p>
<p>そのためには複製された2組目の画像の1枚目を特定する必要があります。そのためにはカウントアップする変数を用意して、表示領域に表示されている画像が何枚目かを特定します。仕組みは下記のようになります。</p>
<ol class="basic1">
<li>初期値0の変数countを用意。</li>
<li>アニメーションメソッド<span class="code">carouselAnimate</span>()が1回実行されるたびにcounterの値に1を足す。</li>
<li><strong>counterの値を画像の枚数（<span class="code">carouselLi</span>）で割って余りが0になれば複製した要素の1枚目になる。</strong></li>
<li>div.images（carousel）の座標を元の位置に戻す。</li>
<li>countを0に戻す。</li>
</ol>
<p>この動作を繰り返せば無限ループが実現出来ます。<br />
現在まで出来たコードに変数countを追加し、3の条件を判定するメソッドを追加します。そしてアニメーションメソッドのcarouselAnimate()の中で呼び出される.animate()のコールバック関数で条件判定のメソッドを実行します。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	var count = 0; //カウンター
	
	===== 中略 =====
	
	function carouselAnimate() {
		count ++; //アニメーションする度にカウンター変数を1ずつ加算して行く
		carousel.animate({'left' : '-=' +(imageWidth)}, 'slow',
			//コールバック関数で条件メソッドを呼び出す
			function(){
				positionInit();
		});
	}
	
	//現在の表示されている画像を判別するメソッド
	function positionInit() {
		if(!(count % imageLength)) { //カウンターの数を画像の数で割った余りがゼロなら
			carousel.css({'left': 0}); //div#imagesを左端に戻す
			count = 0; //カウンターを初期化
		}
	}
});
</pre>

<p>これで無限ループするカルーセルが出来上がりました。長くなりましたが完成したコードは下記のようになります。</p>
<p class="codeHeadline">jQuery Code</p>
<pre class="code" lang="js">$(function() {
	
	//初期設定
	var count = 0; //カウンター
	var carousel = $('#images'); //カルーセルする画像が梱包されているdiv
	var carouselUl = carousel.children();
	var carouselLi = carouselUl.find('li'); //カルーセルする画像リスト
	var imageWidth = carouselLi.find('img').width(); //画像の幅
	var imageLength = carouselLi.length; //画像の数
	
	carouselUl.clone().appendTo(carousel); //カルーセルする画像リストを複製して要素に追加
	carousel.css('width', carouselLi.length * imageWidth * 2); //カルーセルする画像リストの横幅を設定
	
	//アニメーション
	function carouselAnimate() {
		count ++; //アニメーションする度にカウンター変数を1ずつ加算して行く
		carousel.animate({
			'left' : '-=' +(imageWidth)
		}, 'slow',
			function(){
				positionInit()
			}
		);
	}
	
	//現在の表示されている画像を判別するメソッド
	function positionInit() {
		if(!(count % imageLength)) { //カウンターの数を画像の数で割った余りがゼロなら
			carousel.css({'left': 0});
			count = 0;
		}
	}
	
	setInterval(function() {
		carouselAnimate();
	},2000);
	
});
</pre>
<p>説明も長く、難しかったかもしれませんが、仕組みを知ると色々と応用が効いてくると思います。デモをダウンロード出来るようにしておきますので是非試して見てください。</p>
<p class="download"><a href="http://www.nk0206.com/download/calousel01.zip"><span>Download</span></a></p>]]>
    </content>
</entry>

</feed>
