<?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>69log</title>
	<atom:link href="http://kazu69.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://kazu69.net/blog</link>
	<description>福岡でweb関係の仕事してます</description>
	<lastBuildDate>Wed, 28 Dec 2011 14:36:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>スマートフォン対応でよく使うhtml、css、javascriptのまとめ</title>
		<link>http://kazu69.net/blog/memo/1023/</link>
		<comments>http://kazu69.net/blog/memo/1023/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 08:42:51 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[html css javascript ios android mobile]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=1023</guid>
		<description><![CDATA[スマートフォン(ios、android)向けのウェブサイト・ウェブアプリを作る際に個人的によく使うhtml、css、javascriptの備忘録。 html関連 ■headタグ内での設定 ■viewportについて wi [...]]]></description>
			<content:encoded><![CDATA[<p>スマートフォン(ios、android)向けのウェブサイト・ウェブアプリを作る際に個人的によく使うhtml、css、javascriptの備忘録。<br />
<span id="more-1023"></span></p>
<h2>html関連</h2>
<hr />
<h3>■headタグ内での設定</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- //デバイスサイズにあわせて表示領域を変更する --&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;

&lt;!-- //電話番号のリンクを無効化 --&gt;
&lt;meta name=&quot;format-detection&quot; content=&quot;telephone=no&quot;&gt;

&lt;!-- //ホーム画面用アイコン --&gt;
&lt;link rel=&quot;apple-touch-icon&quot; href=&quot;icon.png&quot;&gt;

&lt;!-- //ホーム画面用アイコンの光沢を無効化する --&gt;
&lt;link rel=&quot;apple-touch-icon-precomposed&quot; href=&quot;icon.png&quot;&gt;

&lt;!-- //iPadホーム画面用アイコン --&gt;
&lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;72x72&quot; href=&quot;touch-icon-ipad.png&quot;&gt;

&lt;!-- //iPhone4ホーム画面用アイコン --&gt;
&lt;link rel=&quot;apple-touch-icon&quot; sizes=&quot;114x114&quot; href=&quot;touch-icon-iphone4.png&quot;&gt;

&lt;!-- //splash画像の設定 --&gt;
&lt;link rel=&quot;apple-touch-startup-image&quot; href=&quot;startup.png&quot;&gt;

&lt;!-- //homeボタンから起動時にfull screen modeで起動 --&gt;
&lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot;&gt;

&lt;!-- //full screen mode起動時のステータスバーの色の変更 --&gt;
&lt;meta name=&quot;apple-mobile-web-app-status-bar-style&quot; content=&quot;black&quot;&gt;
</pre>
<hr class="dotted">
<h3>■viewportについて</h3>
<ul>
<li>width:ビューポート（可視領域）の幅(初期値980px)</li>
<li>initial-scale:倍率の初期値、minimum-scale:倍率の最小値、maximum-scale:倍率の最大値</li>
<li>user-scalable:拡大縮小の可否</li>
<li>コンテンツより小さいviewport widthやheightを設定しても設定値は適用されない</li>
</ul>
<p>例えば、device-width=320pxでinitial-scale=0.5の場合は、表示領域 320px/0.5px = 640pxで算出、<br />
device-width=320px、width=400px、コンテンツ450pxであれば、initial-scale = 320/450で横幅450pxのドキュメントを描写される。</p>
<hr class="dotted">
<h3>■Tel URI、Sms URIの設定</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- //リンクをクリックで電話をかける --&gt;
&lt;a href=&quot;tel:00000000000&quot;&gt;00000000000&lt;/a&gt;

&lt;!-- //リンククリックでsms --&gt;
&lt;a href=&quot;sms:00000000000&quot;&gt;sms&lt;/a&gt;

&lt;!-- //smsの送信秋複数 --&gt;
&lt;a href=&quot;sms:00000000000,1111111111&quot;&gt;sms複数&lt;/a&gt;

&lt;!-- //smsの本文追加 --&gt;
&lt;a href=&quot;sms:00000000000,1111111111?body=%83e%83X%83g%83%81%83b%83Z%81%5b%83W&quot;&gt;smsメッセージ&lt;/a&gt;
</pre>
<hr class="dotted">
<h3>■inputタグ関連</h3>
<pre class="brush: xml; title: ; notranslate">
&lt;input autocorrect=&quot;off&quot; autocomplete=&quot;off&quot; autocapitalize=&quot;off&quot;&gt;
</pre>
<ul>
<li>autocorrect:スペルチェック機能</li>
<li>autocomplete:自動補完</li>
<li>autocapitalize:先頭文字を大文字にする</li>
</ul>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;number&quot; value=&quot;001&quot;&gt;
</pre>
<ul>
<li>iOS5以上の場合、inputのnumber属性値の場合、「００１」は「１」の数値形式に変換される。</li>
<li>同様に「1000」は「1,000」の数値形式に変換される</li>
<li>ソフトウェアキーボードを数値入力形式で表示させたいならばtel属性値を付与するかJavaScriptで回避</li>
</ul>
<h2 style="margin-top:45px;">css関連</h2>
<hr />
<h3>■position:fixed関連</h3>
<p>position:fixed はiOS5、Android2.2以降が対応。<br />
ただし</p>
<ul>
<li>Androidではviewportにuser-scalable=noの指定がないとposition:fixedが動かない</li>
<li>iOS5ではURLに#がついた状態だと挙動が不安定</li>
<li>iOS5で他ページに遷移した後に、戻るボタンでページにもどると表示位置がずれる</li>
<li>Androidではuser-scalable=noとposition: fixedを使用すると、-webkit-transformが動かなくなる</li>
</ul>
<p>ちなみに、iOSがposition:fixをサポートしているかの判定は、<a href="https://gist.github.com/1221602" target="_blank">Modernizr position fixed checkのコード</a>から</p>
<pre class="brush: jscript; title: ; notranslate">
var isSupported;

    if ( typeof document.body.scrollIntoViewIfNeeded === 'function') {

        (function () {
            var container     = document.body,
                elem          = document.createElement('div'),
                orgHeight     = container.style.height,
                orgScrollTop  = window.pageYOffset,
                testScrollTop = 20;

            elem.style.cssText = 'position:fixed;top:0px;height:10px;';

            container.appendChild(elem);
            container.style.height = '2048px';

            window.setTimeout(function() {
                elem.scrollIntoViewIfNeeded();
                isSupported = !(window.pageYOffset === testScrollTop) || !(window.pageYOffset === testScrollTop+1);
                alert(isSupported);
                container.removeChild(elem);
                container.style.height = orgHeight;

                window.scrollTo(0, orgScrollTop);
            }, 1000);

            window.scrollTo(0, testScrollTop);
        }());

    }

   return isSupported;
</pre>
<p>という感じで判定できそうです。</p>
<hr class="dotted">
<h3>■overflow:scroll関連</h3>
<p>overflow:scrollはiOSは<strong>２本指スクロール</strong>(わかりにくい)、Androidはoverflow:hiddenとして扱われます。iOS5の場合は、</p>
<pre class="brush: css; title: ; notranslate">
-webkit-overflow-scrolling: touch;
</pre>
<p>で1本指スクロールが可能です。Androidの場合は現状、JavaScriptなどで回避するか別のアプローチが必要の様子。<br />
overflow-scrollingは将来的にAndroidでもサポートされるかもしれないので、個人的には、</p>
<pre class="brush: jscript; title: ; notranslate">
if(&quot;overflowScrolling&quot; in document.body.style || &quot;webkitOverflowScrolling&quot; in document.body.style || &quot;MozOverflowScrolling&quot; in document.body.style) {
  //対応しているときの処理
}
else {
  //対応してないときの処理
}
;
</pre>
<p>という感じで分岐したりしてます。</p>
<hr class="dotted">
<h3>■Media Queries</h3>
<p>デバイスの向きによって、スタイルを変更する場合、インラインなら</p>
<pre class="brush: css; title: ; notranslate">
/*縦向き*/
@media all and (orientation: portrait) {
    body {
       /* your styles */
    }
}

/*横向き*/
@media all and (orientation: landscape) {
    body {
       /* your setting here */
    }
}  
</pre>
<p>読込むcssファイルを変更する場合は</p>
<pre class="brush: xml; title: ; notranslate">
/*縦向き*/
&lt;link rel=&quot;stylesheet&quot; media=&quot;all and (orientation: portrait)&quot; href=&quot;portrait.css&quot;&gt;

/*横向き*/
&lt;link rel=&quot;stylesheet&quot; media=&quot;all and (orientation: landscape)&quot; href=&quot;landscape.css&quot;&gt;
</pre>
<p>デバイスの画面サイズや解像度によってもスタイルを変更できます。</p>
<pre class="brush: css; title: ; notranslate">
/* 画面サイズ〜480pxの端末のときに */
@media only screen and (max-width: 481px) {
  /* CSS goes here */
}

/* 画面サイズ481px〜1024pxの端末が縦（portrait）のときに */
@media only screen and (max-width: 480px) and (max-device-width: 1024px) and (orientation:portrait) {
  /* CSS goes here */
}

/* 画面サイズ481px〜1024pxの端末が横（landscape）のときに */
@media only screen and (max-width: 480px) and (max-device-width: 1024px) and (orientation:landscape) {
  /* CSS goes here */
}

/* 画面サイズ1025〜の端末が横（landscape）のときに */
@media only screen and (max-width: 480px) and (max-device-width: 1024px) and (orientation:landscape) {
  /* CSS goes here */
}

width: 1025px〜の端末のときに */
@media only screen and (max-width: 1025px) {
  /* CSS goes here */
}

/* iphone4 iphone4s */
@media (-webkit-min-device-pixel-ratio: 2),
             (min--moz-device-pixel-ratio: 2),
             (min-resolution: 300dpi) {
  body{ your styles here }
}  

/* andoroid */
@media (-webkit-max-device-pixel-ratio: 1.5),
             (max--moz-device-pixel-ratio: 1.5),
             (max-resolution: 299dpi) {
  body{ your styles here }
}
</pre>
<hr class="dotted">
<h3>■そのほかの設定</h3>
<p>そのほか、細かい設定などなど。</p>
<pre class="brush: css; title: ; notranslate">
/* タップ時のハイライトカラー*/
-webkit-tap-highlight-color:#f00;

/*テキストの選択をキャンセルする場合*/
-webkit-user-select:none;

/*リンクの長時間タップでリンク内容をポップアップで表示させない場合*/
-webkit-touch-callout: none;
</pre>
<p>などが主なものになります。</p>
<h2 style="margin-top:45px;">JavaScript関連</h2>
<hr />
<h3>■URLバーを隠す</h3>
<p>ウェブページを表示した際にURLバーを隠すことができます。(厳密には1pxだけwindowをスクロールさせる)</p>
<pre class="brush: jscript; title: ; notranslate">
//1000ミリ秒の遅延を設定しているのはページの読込が完了するまでの十分な時間として設定してます。
setTimeout(function(){  window.scrollTo(0,1);},1000);

//jQueryなどだとページ読込み完了時に呼んでやるのもありです。
$(function(){
window.scrollTo(0,1);
});
</pre>
<hr class="dotted">
<h3>■メディアクエリ・解像度関連</h3>
<p>cssのメディアクエリのjavascript版のような感じで、window.matchMediaを使うとデバイス画面サイズごとに処理を分岐できます。</p>
<pre class="brush: jscript; title: ; notranslate">
if ( window.matchMedia(&quot;only screen and (max-width: 480px&quot;)).matches ) {
     // For Mobile
} else if (window.matchMedia(&quot;only screen and (min-width: 481px) and (max-width: 1024px)&quot;).matches ) {
     // For Tablet
} else {
     // For PC
}
</pre>
<p>同じように、デバイスの解像度も取得できます。</p>
<pre class="brush: jscript; title: ; notranslate">
if( window.devicePixelRatio == 2 )
{
  //iphone4,iphone4s
}
else if( window.devicePixelRatio == 1.5 )
{
  //Android
}
else
{
  //others
}
</pre>
<p>また、フルスクリーンモードで起動しているかも検出できます。</p>
<pre class="brush: jscript; title: ; notranslate">
if(!window.navigator.standalone)
{
    //your method
}
</pre>
<hr class="dotted">
<h3>■通信状態の取得</h3>
<p>Android2.2以降からは接続状態も検出できます。</p>
<pre class="brush: jscript; title: ; notranslate">
/*
Browser Object Model

navigator = {
  connection: {
    &quot;type&quot;: &quot;4&quot;,
    &quot;UNKNOWN&quot;: &quot;0&quot;,
    &quot;ETHERNET&quot;: &quot;1&quot;,
    &quot;WIFI&quot;: &quot;2&quot;,
    &quot;CELL_2G&quot;: &quot;3&quot;,
    &quot;CELL_3G&quot;: &quot;4&quot;
  }
};
*/

switch (navigator.connection.type ) {
case 0:
//unknown
case 1:
//ETHERNET
break;

case 2:
//WIFI
break;

case 3:
//CELL_2G
break;

case 4:
//CELL_3G
break;

}
</pre>
<p>オンラインかどうかの検出もできて、以下のようになります。</p>
<pre class="brush: jscript; title: ; notranslate">
if (window.navigator.onLine)
{
    //online
}
else
{
    //offline
}
</pre>
<hr class="dotted">
<h3>■touchイベント関連</h3>
<p>touch、gestureイベントは次のようになります。</p>
<pre class="brush: jscript; title: ; notranslate">
//スクリーンにタッチ
document.addEventListener(&quot;touchstart&quot;, touchHandler, false);

//タッチ後、指を動かす
document.addEventListener(&quot;touchmove&quot;, touchHandler, false);

//タッチ後、指を離す
document.addEventListener(&quot;touchend&quot;, touchHandler, false);

//タッチ後、指をスライドさせた(タッチをキャンセルした)
document.addEventListener(&quot;touchcancel&quot;, touchHandler, false);

//2本以上の指を使ってスクリーンにタッチ
document.addEventListener(&quot;gesturestart&quot;, gestureHandler, false);

//指が動く
document.addEventListener(&quot;gesturechange&quot;, gestureHandler, false);

//どちらかの指がスクリーンから離れる
//ちなみにこの後、残りの指を離すとtouchendが発生
document.addEventListener(&quot;gestureend&quot;, gestureHandler, false);
</pre>
<hr class="dotted">
<h3>■デバイスの向き関連</h3>
<p>デバイスの向きも検出できます。</p>
<pre class="brush: jscript; title: ; notranslate">
//90度ごとに向きが変更された場合に発生
window.addEventListener(&quot;orientationchange &quot;, orientationEvent, true);

//細かい回転量の取得
//返される値は
//alpha:0～360(degrees)
//beta:-180～180(degrees)
//gamma:-90～90(degrees)
window.addEventListener(&quot;deviceorientation&quot;, orientationEvent, true);

//デバイスの加速度と回転データを取得
window.addEventListener('devicemotion', deviceMotionHandler, false);
</pre>
<p>このあたりは<a href="http://www.html5rocks.com/en/tutorials/device/orientation/" target="_blank">html5rocks</a>が詳しくです。</p>
<hr class="dotted">
<h3>■Media capture API</h3>
<p>Andoroidはhtmlからユーザーがアップロードできるコンテンツを細かく制御できます。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!-- regular file upload (Android 2.2+) --&gt;
&lt;input type=&quot;file&quot;&gt;&lt;/input&gt;

&lt;!-- opens directly to the camera (Android 3.0+) --&gt;
&lt;input type=&quot;file&quot; accept=&quot;image/*;capture=camera&quot;&gt;&lt;/input&gt;  

&lt;!-- opens directly to the camera in video mode (Android 3.0+) --&gt;
&lt;input type=&quot;file&quot; accept=&quot;video/*;capture=camcorder&quot;&gt;&lt;/input&gt;  

&lt;!-- opens directly to the audio recorder (Android 3.0+) --&gt;
&lt;input type=&quot;file&quot; accept=&quot;audio/*;capture=microphone&quot;&gt;&lt;/input&gt;  
</pre>
<hr class="dotted">
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/memo/1023/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS animationでRPG風戦闘シーン</title>
		<link>http://kazu69.net/blog/memo/1010/</link>
		<comments>http://kazu69.net/blog/memo/1010/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 04:59:19 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[css animation]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=1010</guid>
		<description><![CDATA[cssのアニメーションにfirefox5から対応したということで、復習してみた。 cssアニメーションプロパティ アニメーションのキーフレームを示す名前 animation-name : name; 1 回のアニメーショ [...]]]></description>
			<content:encoded><![CDATA[<p>cssのアニメーションにfirefox5から対応したということで、復習してみた。<br />
<span id="more-1010"></span><br />
cssアニメーションプロパティ<br />
<code><br />
アニメーションのキーフレームを示す名前<br />
animation-name : name;</p>
<p>1 回のアニメーションの長さ(秒,ミリ秒)<br />
animation-duration :.10s;</p>
<p>アニメーションの進め方を設定します。これは加速曲線を定義。アニメーションのイージング機能を定義する感じ(ease,linear,ease-in,ease-out,ease-in-out)<br />
animation-timing-function: ease-in-out;</p>
<p>要素が読み込まれてからアニメーション開始までの遅延時間(秒,ミリ秒)<br />
animation-delay : 10s;<br />
アニメーション完了後に、逆方向のアニメーションを行い、交互にくり返すかの設定<br />
animation-direction: normal;</p>
<p>アニメーション完了後に、実行前や実行後、その両方のスタイルを適用するかを設定<br />
animation-fill-mode: forwards;</p>
<p>アニメーションを一時停止したり、再開したりすることができる。アニメーションの状態を判定できるプロパティ<br />
animation-play-state: running;</p>
<p>アニメーションの繰り返し回数を設定(無限に繰り返す場合はinfinite )<br />
animation-iteration-count: 1;*/<br />
</code></p>
<p>実際には各プロパティにはvendor prefixが必要。<br />
アニメーションは状態毎にイベントを発火するので、<br />
<code><br />
//アニメーション開始イベント<br />
e.addEventListener("animationstart", listener, false);</p>
<p>//アニメーション終了イベント<br />
e.addEventListener("animationend", listener, false);</p>
<p>//アニメーションが1周するごとに発生<br />
e.addEventListener("animationiteration", listener, false);<br />
</code><br />
のように取得可能。<br />
こちらもvendor prefixが必要でwebkitAnimationEnd,mozAnimationStartなどとしないといけない。</p>
<p>で、簡単に作ったのが以下。ゲーム風の表現も全然可能ですね。</p>
<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/NT3v9/8/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>css animationをサポートしてないブラウザだと動かないです。実用にはここでjQeuryなどでアニメーションさせたりするといいかな。<br />
css animationのほうがjvascriptでの表現より軽く、負荷も少ない。</p>
<p>cssを書くのが大変なので、scssやless使ってやると楽になりそう。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/memo/1010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ES5で追加されたJavaScriptのforEach</title>
		<link>http://kazu69.net/blog/memo/996/</link>
		<comments>http://kazu69.net/blog/memo/996/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 05:15:28 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=996</guid>
		<description><![CDATA[ECMA-262の第5版(ES5)のまとめ記事見てたらArrayオブジェクトにforEachが追加されてた。 ということで、個人的なメモ。 array.forEach(callback[, thisObject]); 配 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ibm.com/developerworks/jp/web/library/wa-ecma262/?cmp=dw&#038;cpb=dwwdv&#038;ct=dwrss&#038;cr=dwrss&#038;ccy=jp&#038;csr=052011" target="_blank">ECMA-262の第5版(ES5)のまとめ記事</a>見てたらArrayオブジェクトにforEachが追加されてた。<br />
ということで、個人的なメモ。<br />
<span id="more-996"></span><br />
<code><br />
array.forEach(callback[, thisObject]);<br />
</code><br />
配列の各要素にたいしてcallback関数を実行できます。<br />
thisObjectは、callbackを実行時にthisとして使用するオブジェクト。</p>
<p>さらにECMA-262に対応してないブラウザにはprototypeで拡張してやればネイティブのメソッドとして使える。<br />
<code><br />
if (!Array.prototype.forEach)<br />
{<br />
  Array.prototype.forEach = function(fun /*, thisp*/)<br />
  {<br />
    var len = this.length;<br />
    if (typeof fun != "function")<br />
      throw new TypeError();</p>
<p>    var thisp = arguments[1];<br />
    for (var i = 0; i < len; i++)<br />
    {<br />
      if (i in this)<br />
        fun.call(thisp, this[i], i, this);<br />
    }<br />
  };<br />
}<br />
</code></p>
<p>ということで、サンプル<br />
<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/jjANQ/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p><a href="https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/forEach" target="_blank">Mozilla Developer Network forEach</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/memo/996/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQueryのDeferred Objectとは。</title>
		<link>http://kazu69.net/blog/memo/973/</link>
		<comments>http://kazu69.net/blog/memo/973/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 02:40:36 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[memo]]></category>
		<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[jquery javascript]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=973</guid>
		<description><![CDATA[jQuery1.5から導入されていたDeferred Objectについて、詳しく理解していなかったので調べてみたところ、すてきな機能っぽいのでまとめてみた。 そもそもDeferred Objectとはなにか？ jQue [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery1.5から導入されていた<a href="http://api.jquery.com/category/deferred-object/">Deferred Object</a>について、詳しく理解していなかったので調べてみたところ、すてきな機能っぽいのでまとめてみた。<br />
<span id="more-973"></span><br />
そもそもDeferred Objectとはなにか？</p>
<blockquote><p>
jQuery.Deferred(), introduced in version 1.5, is a chainable utility object that can register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.
</p></blockquote>
<p>callback queuesに複数のcallbackを登録できてるオブジェクトで、同期・非同期の処理の成功と失敗を中継する。と言った感じ。</p>
<p>Deferredオブジェクトは<a href="http://wiki.commonjs.org/wiki/Promises/A" target="_blank">CommonJSのPromises/A</a>をもとに設計されていて、生成されてからunresolved -> pending -> resolved or rejected という具合に状態をたどります。<br />
それぞれの状態を監視して、pending、resolveもしくはreject時に登録した関数を実行します。</p>
<p>ajaxの処理やウィジェット同士の通信などオブジェクトの状態に応じて、レスポンス精度の高いアプリケーションを作る際にDeferredオブジェクトを利用するといいらしい。<br />
実際にアニメーション系のメソッドやajax系のメソッドなどのオブジェクトもDeferredオブジェクトを返してくれるようになってるので、これまでと違い</p>
<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/6rx9F/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>となります。いままでよりすっきりして見通しがいい気がします。また、メソッドチェーンで書けるというところもいい感じです。<br />
というわけで、Deferredオブジェクト簡単に使ってみる。</p>
<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/TjpvN/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
<code><br />
//Deferred object<br />
var df = $.Deferred();</p>
<p>//resolve、rejectにかかわらずに実行<br />
df.always(func)</p>
<p>//resolve時に実行されるメソッド指定<br />
.done(func)</p>
<p>//reject時に実行されるメソッド指定<br />
.fail(func)</p>
<p>//経過中に実行されるメソッド指定<br />
.progress(func);<br />
</code></p>
<p>細かく制御できるのがいい感じです。<br />
また処理が完了するまでqueueにしておき、完了時に処理を進める(遅延処理)できるということも特徴です。</p>
<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/RySM2/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p><code><br />
//Deferred object<br />
var df = $.Deferred();</p>
<p>//resolve/reject時の前に実行されるメソッド指定<br />
.pipe(func)</p>
<p>//Deferred Promise object<br />
//将来的にresolve, reject, progressなどのstateに<br />
//変更されるDeferred object<br />
.promise()</p>
<p>//resolve,reject,progress時の処理を登録<br />
.then(resolve func, reject func, progress func)</p>
<p>//複数のDeferred objectが処理されるまで遅延する<br />
$.when(Deferred objects)<br />
</code></p>
<p>ざっくりまとめてみたけど、便利だな。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/memo/973/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lessでよく使うスニペット</title>
		<link>http://kazu69.net/blog/tec/963/</link>
		<comments>http://kazu69.net/blog/tec/963/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 13:53:33 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[sass scss less]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=963</guid>
		<description><![CDATA[css拡張メタ言語Less。個人的によく使うスニペットの備忘録。 /*round box*/ .border-radius (@topLeft: 0,@topRight: 0,@bottomLeft: 0,@bottom [...]]]></description>
			<content:encoded><![CDATA[<p>css拡張メタ言語<a href="http://lesscss.org/" target="_blank">Less</a>。個人的によく使うスニペットの備忘録。<br />
<span id="more-963"></span><br />
<code><br />
/*round box*/<br />
.border-radius (@topLeft: 0,@topRight: 0,@bottomLeft: 0,@bottomRight: 0){<br />
    -webkit-border-radius: @arguments;<br />
    -moz-border-radius: @arguments;<br />
    -mes-border-radius:@arguments;<br />
    border-radius: @arguments;<br />
}<br />
/*  useage<br />
   .someclass {<br />
        .border-radius(3px, 3px, 3px, 3px);<br />
    }<br />
*/</p>
<p>/*box shadow*/<br />
.boxshadow (@x:0,@y:0,@blur:0,@color:#000) {<br />
    -webkit-box-shadow:  @arguments;<br />
    -moz-box-shadow:  @arguments;<br />
    -o-box-shadow:  @arguments;<br />
    -ms-box-shadow:  @arguments;<br />
    box-shadow:  @arguments;<br />
}<br />
/*  useage<br />
   .someclass {<br />
        .boxshadow (1px, 1px, 1px, rgba(0, 0, 0, 0.5));<br />
    }<br />
   .insetclass {<br />
        .boxshadow (1px, 1px, 1px, rgba(0, 0, 0, 0.5), inset);<br />
    }<br />
*/</p>
<p>/*text shadow*/<br />
.textshadow (@x:0,@y:0,@blur:0,@color:#000) {<br />
    -webkit-text-shadow:  @arguments;<br />
    -moz-text-shadow:  @arguments;<br />
    -o-text-shadow:  @arguments;<br />
    -ms-text-shadow:  @arguments;<br />
    text-shadow:  @arguments;<br />
}<br />
/*  useage<br />
   .someclass {<br />
        .textshadow (1px, 1px, 1px, rgba(0, 0, 0, 0.5));<br />
    }<br />
*/</p>
<p>/*background gradient*/<br />
.background-gradient(@start: #000,@end: #000) {<br />
    background: @end;<br />
    filter: e("progid:DXImageTransform.Microsoft.gradient(startColorstr='")@start e("', endColorstr='") @end e("')");<br />
    background: -webkit-gradient(linear, left top, left bottom, from(@start), to(@end));<br />
    background: -moz-linear-gradient(top, @arguments);<br />
    background-image: linear-gradient(top, @arguments);<br />
    background-image: -o-linear-gradient(top, @arguments);<br />
    background-image: -webkit-linear-gradient(top, @arguments);<br />
    background-image: -ms-linear-gradient(top, @arguments);<br />
}<br />
/*  useage<br />
   .someclass {<br />
        .background-gradient(#eee, #fff);<br />
    }<br />
*/</p>
<p>/*box center*/<br />
.box-center {<br />
    display: block;<br />
    margin: 0 auto;<br />
}<br />
</code></p>
<p>IEのactivexコントロール利用時にLessがパースエラーを起こすので<br />
<code><br />
/*<br />
Less escape code : e('escape this code')<br />
*/<br />
filter: e("progid:DXImageTransform.Microsoft.gradient(startColorstr='")@start e("', endColorstr='") @end e("')");<br />
</code><br />
のようにエスケープコードを使って回避できます。<br />
さらにエスケープコード内で変数を使用する場合は、<br />
<code><br />
e(%("some IE stuff here, first color %s, second color %s", @color1, @color2))<br />
/* 最初の%sが@color1に、次の%sが@color2に置き換わります */<br />
</code></p>
<p>どうしてもvendor prefixを繰り返し書くのが面倒。<br />
<code><br />
.vendor-prefix(@prop, @val) {<br />
    -moz-@prop:@val;<br />
    -webkit-@prop:@val;<br />
    -o-@prop:@val;<br />
    -ms-@prop:@val;<br />
    @prop:@val;<br />
}<br />
</code><br />
のようるようにならないかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/tec/963/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.7から追加された.on() と .off()がとても便利</title>
		<link>http://kazu69.net/blog/tec/940/</link>
		<comments>http://kazu69.net/blog/tec/940/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 09:15:06 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[jquery javascript]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=940</guid>
		<description><![CDATA[jQuery1.7がリリースされたのですが、今回追加されたevent apiのon()、off()がとても便利で、on()でイベントを登録し、off()でイベントを削除するするということで、これまでより直感的です。 ev [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.jquery.com/2011/11/03/jquery-1-7-released/" target="_blank">jQuery1.7</a>がリリースされたのですが、今回追加されたevent apiのon()、off()がとても便利で、on()でイベントを登録し、off()でイベントを削除するするということで、これまでより直感的です。<br />
<span id="more-940"></span><br />
event apiとしてはこれまで、<a href="http://api.jquery.com/bind/" target="_blank">bind</a>、<a href="http://api.jquery.com/live/" target="_blank">live</a>、<a href="http://api.jquery.com/delegate/" target="_blank">delegate</a>が存在していました。今回追加されたon()は、bindやdelegateと置き換わる機能となります。</p>
<p><code><br />
$(elements).on(events [, selector] [, data], handler);<br />
$(elements).off(events [, selector] [, data], handler);<br />
</code></p>
<p>例えば使い方としてとしては<br />
<code><br />
var sayHello = function (event) { alert("Hello "+event.data.name); }<br />
$("button").on("click", { name: "kazu69" }, sayHello);<br />
</code><br />
<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/ubTYU/2/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
のように、これまでのbindやliveのように使用できる。<br />
また、<br />
<code><br />
var sayHello = function (event) { alert("Hello "+event.data.name); }<br />
$("div").on("click", 'span', { name: "kazu69" }, sayHello);<br />
</code><br />
<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/4kcqH/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
のようにselectorオプションを使うとdelegateのように使用する事もできる(引数の順序が違うけど)<br />
<code><br />
$(elements).on(events-map [, selector] [, data]);<br />
$(elements).off(events-map [, selector] [, data]);<br />
</code><br />
またeventMapを利用する事で複数のイベントを登録する事ができます。<br />
たとえば、<br />
<code><br />
$('input[type=text]').on({<br />
    focus: function() {<br />
        $('div').empty().append('focus');<br />
    },<br />
    blur: function() {<br />
        $('div').empty().append('blur');<br />
    }<br />
});<br />
</code><br />
<iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/kazu69/zkfx5/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe><br />
とすると、簡潔にまとめる事も可能です。<br />
off()についてもon()とおなじく<br />
<code><br />
$('.parent a').unbind('click');<br />
$('.parent a').off('click');<br />
</code><br />
という具合にunbindと置き換える事ができ、<br />
<code><br />
$('.parent a').die('click');<br />
$('.parent').off('click', 'a');<br />
</code><br />
<code><br />
$('.parenta').undelegate('a', 'click');<br />
$('.parent').off('click', 'a');<br />
</code><br />
のようにdieやundelegateを置き換える事も可能です。</p>
<p>ちなみにこれまでのevent apiも使用できます。<br />
でも、これからはon()、off()を使う方がいいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/tec/940/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebSockets(pusher)とbackbornjsで簡単なチャットつくってみた</title>
		<link>http://kazu69.net/blog/tec/930/</link>
		<comments>http://kazu69.net/blog/tec/930/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 04:13:49 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[html5 socket backbornjs javascript]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=930</guid>
		<description><![CDATA[websocketで何かしてみたくて、さらにbackbornjsも触りたかったということで、ircのようなチャットを作ってみました。 今回はWebsocketを簡単にウェブサイトに組み込めるpusherを使って、フロント [...]]]></description>
			<content:encoded><![CDATA[<p>websocketで何かしてみたくて、さらに<a href="http://documentcloud.github.com/backbone/" target="_blank">backbornjs</a>も触りたかったということで、ircのようなチャットを作ってみました。<br />
<span id="more-930"></span><br />
今回はWebsocketを簡単にウェブサイトに組み込める<a href="http://pusher.com/" target="_blank">pusher</a>を使って、フロントエンドだけで実装しました。</p>
<p>簡単なチャットくらいしかできませんが、こんな感じです。</p>
<p>後ほど作り方まとめたい。</p>
<p><a href="http://kazu69.heteml.jp/html5/websocket/" target="_blank">http://kazu69.heteml.jp/html5/websocket/</a></p>
<p>位置情報とからめてみるってのもおもしろそうだ。<br />
今回のようにpusherを使えば裏側の実装の必要もないため、簡単にリアルタイムウェブサービスができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/tec/930/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ios5のsafariでinput typeのnumberの仕様が変わっていた</title>
		<link>http://kazu69.net/blog/tec/925/</link>
		<comments>http://kazu69.net/blog/tec/925/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 00:29:45 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ios mobile safari]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=925</guid>
		<description><![CDATA[備忘録です。 ios5のsafariでinput type numberの仕様が変かわってました。 今までは、input type numberに 「0001」や「1000」などを入力しても、特に変換などはされませんでし [...]]]></description>
			<content:encoded><![CDATA[<p>備忘録です。<br />
ios5のsafariでinput type numberの仕様が変かわってました。<br />
<span id="more-925"></span><br />
今までは、input type numberに 「0001」や「1000」などを入力しても、特に変換などはされませんでしたが、<br />
ios5のsafariでは、「0001」は「1」に、「1000」は「1,000」という数値形式で処理されます。</p>
<p>郵便番号などのフォームでinput type numberを利用している場合は、バリデーションに引っかかると思うので<br />
注意が必要です。</p>
<p>input type numberを使うメリットはソフトウェアのキーボードがinput typeによって最適なものに切り替わる点です。<br />
取り急ぎの解決策として、数字入力させたいのでinput type telに修正したり、jsでごにょごにょして対応してます。</p>
<p>その他変更点は <a href="http://davidbcalhoun.com/2011/new-mobile-safari-stuff-in-ios5-position-fixed-overflow-scroll-new-input-type-support-web-workers-ecmascript-5" target="_blank">http://davidbcalhoun.com/2011/new-mobile-safari-stuff-in-ios5-position-fixed-overflow-scroll-new-input-type-support-web-workers-ecmascript-5</a> にまとまってました。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/tec/925/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS拡張言語SASSとLESSを触ってみる</title>
		<link>http://kazu69.net/blog/tec/853/</link>
		<comments>http://kazu69.net/blog/tec/853/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 03:00:28 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[tec]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[scss less rails]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=853</guid>
		<description><![CDATA[大規模なwebアプリケーションを構築する際にCSS自体の管理も煩雑になりがち。ベンダープレフィックスなどの記述自体も面倒になってきたので、それらを解決する一つの方法として『SASS』と『LESS』を検討してみました。 両 [...]]]></description>
			<content:encoded><![CDATA[<p>大規模なwebアプリケーションを構築する際にCSS自体の管理も煩雑になりがち。ベンダープレフィックスなどの記述自体も面倒になってきたので、それらを解決する一つの方法として『<a href="http://sass-lang.com/" target="_blank">SASS</a>』と『<a href="http://lesscss.org/" target="_blank">LESS</a>』を検討してみました。<br />
<span id="more-853"></span><br />
両者の違いは<a href="http://dxd8.com/archives/217/" target="_blank">CSS拡張メタ言語「SCSS(Sass)」と「LESS」の比較</a>に細かくまとめたれています。</p>
<p><strong>LESSを使ってみた</strong><br />
LESSはJavaScriptでコンパイルするので、LESSファイルとコンパイラーのJSを読み込めば使用できる。<br />
<code></p>
<link rel="stylesheet/less" type="text/css" href="style.less">
<script type="text/javascript" src="less-1.1.3.min.js"></script><br />
</code></p>
<p>style.lessに<br />
<code><br />
@color: #4D926F;<br />
#header {<br />
  color: @color;<br />
}<br />
h2 {<br />
  color: @color;<br />
}<br />
</code><br />
としてやると</p>
<p><code><br />
#header {<br />
  color: #4D926F;<br />
}<br />
h2 {<br />
  color: #4D926F;<br />
}<br />
</code><br />
とコンパイルされる感じ。<br />
Mixinやネストのほか演算、関数も少し使える。</p>
<p><strong>SASSを使ってみた</strong></p>
<p>とりあえず、rubyがインストールしてる条件で<br />
<code><br />
gem install sass<br />
</code><br />
でSASSをインストール。<br />
style.scssファイルに<br />
<code><br />
$blue: #3bbfce;<br />
$margin: 16px;<br />
.content-navigation {<br />
  border-color: $blue;<br />
  color:<br />
    darken($blue, 9%);<br />
}<br />
.border {<br />
  padding: $margin / 2;<br />
  margin: $margin / 2;<br />
  border-color: $blue;<br />
}<br />
</code><br />
として、<br />
<code>sass style.scss style.css</code><br />
でコンパイルすると<br />
<code><br />
.content-navigation {<br />
  border-color: #3bbfce;<br />
  color: #2b9eab;<br />
}<br />
.border {<br />
  padding: 8px;<br />
  margin: 8px;<br />
  border-color: #3bbfce;<br />
}<br />
</code><br />
でコンパイルされます。<br />
SassでHTML記号や日本語を使う場合は、@charset &#8220;UTF-8&#8243; を文頭につけておくとコンパイル後のcssも文字コードが予期しないものにならないっぽい。</p>
<p>毎回、コンパイルすのも面倒なので<br />
<code><br />
sass --watch style.scss:style.css<br />
</code><br />
watch オプションをつけておけばscssファイル編集とともにcssも変更されます。終了する時は Ctrl+c。これは便利です。<br />
ディレクトリを指定すれば、ディレクトリ単位で監視もできます。</p>
<p><code><br />
sass --style compressed --watch style.scss:style.css<br />
</code><br />
style compressedオプションをつけてやればminifyもしてくれます。これも便利。<br />
SASSの場合、関数で定数の演算を扱える、条件分岐や繰り返しも使えるのでLESSより柔軟です。</p>
<p>あと、<a href="http://haml-lang.com/" target="_blank">Haml</a>をインストールしておけば<br />
<code>css2sass style.css</code><br />
とすることで既存のCSSをSASSに変換できるっぽいので、既存環境をSASS化することもできそう。</p>
<p>最近railsを触ってることもあってSASSのほうが気になりました。</p>
<p>個人的な感想では、SASSはrubykのコンパイルが必要だけど、機能が豊富で柔軟に使用できる。環境構築さえしてしまえば、後は非常にやりやすかった。<br />
<a href="http://compass-style.org/" target="_blank">Compass</a>というSASSフレームワークが便利そう。</p>
<p>LESSは導入が容易。<a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter Bootstrap </a>などにも導入されている。JavaScriptでコンパイルするので、環境などの構築は不要。文法がひと癖あり、SASSにくらべて制限がある。小規模な案件やモバイルウェブアプリ、node.jsを使うときには便利じゃないかな。という感じでした。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/tec/853/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Steve Jobs</title>
		<link>http://kazu69.net/blog/days/894/</link>
		<comments>http://kazu69.net/blog/days/894/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 13:37:16 +0000</pubDate>
		<dc:creator>kazu69</dc:creator>
				<category><![CDATA[days]]></category>
		<category><![CDATA[mac apple]]></category>

		<guid isPermaLink="false">http://kazu69.net/blog/?p=894</guid>
		<description><![CDATA[Apple共同設立者で前CEOのSteve Jobs氏が亡くなりました。 彼は、多くの製品と沢山の夢を与えてくれました。]]></description>
			<content:encoded><![CDATA[<p>Apple共同設立者で前CEOのSteve Jobs氏が亡くなりました。<br />
<span id="more-894"></span><br />
<img src="http://kazu69.heteml.jp/net-kazu69/blog/wp-content/uploads/2011/10/t_hero.jpg" alt="Steve Jobs" title="t_hero" width="600" height="401" class="alignnone size-full wp-image-897"><br />
彼は、多くの製品と沢山の夢を与えてくれました。</p>
]]></content:encoded>
			<wfw:commentRss>http://kazu69.net/blog/days/894/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

