<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I wish I could give you meaningful additions</description><title>STONEDSOUL</title><generator>Tumblr (3.0; @stonedsoul)</generator><link>http://stonedsoul.org/</link><item><title>X04HT (Touch Diamond) のカスタマイズ</title><description>&lt;p&gt;今になって 705NK から X04HT に機種変更した。もっさりしてるのと電池が持たないのは覚悟の上で、見た目と大きさ、画面の解像度、ホーム画面の見た目で決めた。docomo のやつにしなかったのは、i-mode のメールアドレスが取れないのと、携帯用のサイトが見れないらしいから。ポケットの中でごろごろしないのがいい。&lt;/p&gt;

&lt;h3&gt;インストールしたソフト&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://d.hatena.ne.jp/wasa_bi/20090727/1248697542"&gt;wasabi&lt;/a&gt; - 携帯サイト用ブラウザ。&lt;a href="http://blog.livedoor.jp/x04ht/archives/188205.html"&gt;設定方法&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www2r.biglobe.ne.jp/~tascal/download/pocketpc/tre.htm"&gt;TRE&lt;/a&gt; - レジストリエディタ&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://m.google.co.jp/gmm"&gt;Google Map&lt;/a&gt; - X04HT のブラウザでアクセス。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://hp.vector.co.jp/authors/VA004474/wince/soft5.html#touchkeysip"&gt;touchkeysip&lt;/a&gt; - gesture10key に必要&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.geocities.co.jp/lauhangwoo/zero3/gesture10key.html"&gt;gesture10key&lt;/a&gt; - フリック入力を可能にする。&lt;a href="http://imaran.seesaa.net/article/111393783.html"&gt;参考&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://forum.xda-developers.com/showthread.php?t=405749"&gt;Diamond TF3D Config Setup&lt;/a&gt; - Touch FLO 3D のチューニング&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://forum.xda-developers.com/showthread.php?t=412418"&gt;S2U2&lt;/a&gt; - スライドしてロックを解除&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.google.com/mobile/sync/"&gt;Google Sync for your phone&lt;/a&gt; - Gmail や Google Calendar などと sync&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://ultrapop.jp/?q2chwm"&gt;q2chwm&lt;/a&gt; - 2ch ブラウザ&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://blog.livedoor.jp/x04ht/archives/288051.html"&gt;SDKCerts.cab &amp; CameraRc.dll.0411.mui&lt;/a&gt; - カメラ消音 (CameraRc.dll.0411.mui を windows フォルダに入れて、SDKCerts.cab をインストール)。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.microsoft.com/windowsmobile/en-us/downloads/facebook.mspx"&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://forum.xda-developers.com/showthread.php?t=438418"&gt;REAL Dimond-style Calculator&lt;/a&gt; - 計算機のスキン。IPC Black Dialer ENG.cab を本体側にインストール&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://code.google.com/p/pocketwit/"&gt;pocketwit&lt;/a&gt; - Microblog client (twitter, identi.ca, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://soft.wince.ne.jp/soft/Detail/IrisBrowser/PID4330/"&gt;iris browser&lt;/a&gt; - iphone 用のページを表示(Yahoo! とか)。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=E3821449-3C6B-42F1-9FD9-0041345B3385&amp;displaylang=ja"&gt;.NET Compact Framework 3.5&lt;/a&gt; - ToneBox に必要。Macでインストールする方法は下を参照。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.adobe.com/products/flashplayer_pocketpc/downloads/player.html"&gt;Flash 7 Player&lt;/a&gt; - ToneBox に必要。&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.freewarepocketpc.net/ppc-download-tonebox.html"&gt;ToneBox&lt;/a&gt; - &lt;a href="http://lab.andre-michelle.com/tonematrix"&gt;ToneMatrix&lt;/a&gt;のようなソフト。ToneBox.exe を直接実行する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;その他の設定&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;メール着信時バイブの長さ設定 (&lt;a href="http://imaran.seesaa.net/article/111654054.html"&gt;参考&lt;/a&gt;) - HKEY_LOCAL_MACHINE\Software\Arcsoft\ArcSoft MMS UA\Config\UI の Ringtoneplaysec&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www012.upp.so-net.ne.jp/wasabi/090826/x04ht_perf_custom.txt"&gt;X04HT パフォーマンス改善法&lt;/a&gt; - の (1) - (3) を実施&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;.NET Compact Frameworkのインストール&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://programmershigh.org/~marvel/blog/?p=72"&gt;.NET Compact Framework 2.0をMac OS Xを母艦に導入する&lt;/a&gt; を参考に、以下の手順でインストールした。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="http://wakaba.c3.cx/s/apps/unarchiver.html"&gt;The Unarchiver&lt;/a&gt;で msi を解凍する。&lt;/li&gt;
&lt;li&gt;その中にある cfflies.cab を The Unarchiver で解凍する。&lt;/li&gt;
&lt;li&gt;その中にある F_.wm.armv4i.cab.B9F092F9_68DA_4CEB_BB8B_5BC56F898FEA を NETCFv35.wm.armv4i.cab にリネーム。&lt;/li&gt;
&lt;li&gt;X04HT に移して cab を実行。&lt;/li&gt;
&lt;/ol&gt;</description><link>http://stonedsoul.org/post/436738910</link><guid>http://stonedsoul.org/post/436738910</guid><pubDate>Tue, 09 Mar 2010 21:20:51 +0900</pubDate></item><item><title>JavaScript のちょっとした関数 (メモ)</title><description>&lt;p&gt;あると便利かなあと思ったやつをネットで検索して自分向けにちょっと変えた。&lt;/p&gt;

&lt;h3&gt;URL のパラメータを取得(してオブジェクトに格納)&lt;/h3&gt;

&lt;p&gt;URL をパラメータで渡せるようにした(&lt;a href="http://snipplr.com/view/15638/query-string-parsing-in-javascript/"&gt;参照元&lt;/a&gt;)。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * parse query string for given URL or current location
 * @see    &lt;a href="http://snipplr.com/view/15638/query-string-parsing-in-javascript/"&gt;http://snipplr.com/view/15638/query-string-parsing-in-javascript/&lt;/a&gt;
 * @param  {string} URL
 * @return {object} Parameters (key-value)
 */
var parseQueryString = function(sUrl){
    var oParams = {},
        sQuery  = sUrl ? sUrl.split("?")[1] : window.location.search.substring(1);

    if (sQuery) {
        sQuery.replace(/([^?=&amp;]+)(=([^&amp;]*))?/g,
            function( $0, $1, $2, $3 ){
                oParams[ $1 ] = $3;
            }
        );
    }

    return oParams;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;マルチバイト文字を 2 byte と数えてカットする SubStr みたいな関数&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://oshiete1.watch.impress.co.jp/qa5076682.html"&gt;参照元&lt;/a&gt;は String オブジェクトを拡張してたのを
ただの関数にした。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * return true if given character is multibyte. if the given argument
 * is more than one character, it uses the first character of the string
 * @see    &lt;a href="http://oshiete1.watch.impress.co.jp/qa5076682.html"&gt;http://oshiete1.watch.impress.co.jp/qa5076682.html&lt;/a&gt;
 * @param  {string}  Char that can be get by String.charAt()
 * @return {boolean} true if it's multibyte
 */
var isMultiByte = function(sChar){
    var sCharCode = sChar.charCodeAt(0);
    // Range of single byte chars
    // Unicode : 0x0 〜 0x80, 0xf8f0, 0xff61 〜 0xff9f, 0xf8f1 〜 0xf8f3
    if ( (sCharCode &gt;= 0x0 &amp;&amp; sCharCode &lt;= 0x80)
         || (sCharCode == 0xf8f0) 
         || (sCharCode &gt;= 0xff61 &amp;&amp; sCharCode &lt;= 0xff9f) 
         || (sCharCode &gt;= 0xf8f1 &amp;&amp; sCharCode &lt;= 0xf8f3) ) {
        return false;
    } else {
        return true;
    }
};

/**
 * custom substr function that counts multi-byte character as 2 bytes.
 * @require  isMultiByte()
 * @see    &lt;a href="http://oshiete1.watch.impress.co.jp/qa5076682.html"&gt;http://oshiete1.watch.impress.co.jp/qa5076682.html&lt;/a&gt;
 * @param  {string} String to be extracted
 * @param  {number} Index where to start the extraction
 * @param  {number} Length (optional) number of characters to extract
 * @return {string} Extracted text
 */
var doubleByteSubStr = function(sString, nIndex, nLength){

    // find start index by byte
    for (var i=0, len=0; len &lt; nIndex; i++) {
        len = isMultiByte(sString.charAt(i)) ? len+2 : len+1;
    }
    var nIndexBytes = i;

    // find length for substr by byte
    len = 0;
    while(nLength &gt; len) {
        len = isMultiByte(sString.charAt(i)) ? len+2 : len+1;
        i++;
    }

    var nLengthBytes = i - nIndexBytes,
        sExtracted   = sString.substr(nIndexBytes, nLengthBytes);

    return sExtracted;
};
&lt;/code&gt;&lt;/pre&gt;</description><link>http://stonedsoul.org/post/417269534</link><guid>http://stonedsoul.org/post/417269534</guid><pubDate>Sun, 28 Feb 2010 18:12:31 +0900</pubDate></item><item><title>ToDo List Update</title><description>&lt;p&gt;&lt;a href="http://app.stonedsoul.org/todo.html"&gt;ToDo List&lt;/a&gt; を更新した。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;簡単なデータの Import/Export 機能を付けた&lt;/li&gt;
&lt;li&gt;データ内のプロパティ名に typo があったので修正した (udpated -&gt; updated)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もし以前に ToDo List にデータを入れていたら、更新日がおかしなプロパティ名で保存されていると思う。
これによって変な動きをすることがあるかもしれないので、その場合は一度 Export してデータを修正して、
Import (1つ目のオプションを選択)したら直ると思う。&lt;/p&gt;

&lt;p&gt;Import の 1 つ目のオプションは、ブラウザに保存されてるデータを削除してから、データを読み込む。
2 つ目のオプションは、同じ ID の ToDo があった場合は、更新日の新しい方で上書きする。&lt;/p&gt;

&lt;hr&gt;
&lt;p&gt;I updated &lt;a href="http://app.stonedsoul.org/todo.html"&gt;ToDo List&lt;/a&gt; application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added simple Import/Export feature&lt;/li&gt;
&lt;li&gt;Fix typo (udpated -&gt; updated) in property name of task data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you already have task data, it must contain wrong property name, it might cause of
some strange behaviors. You might want to export your data and correct wrong property
“udpated” to “updated”, and then import with the first option - replace data.&lt;/p&gt;

&lt;p&gt;The second option (merge) overwrite tasks in the same id by the latest updated date.&lt;/p&gt;</description><link>http://stonedsoul.org/post/417267903</link><guid>http://stonedsoul.org/post/417267903</guid><pubDate>Sun, 28 Feb 2010 18:11:09 +0900</pubDate></item><item><title>The Soft Spot on the Behance Network via Daily Inspiration #422...</title><description>&lt;img src="http://30.media.tumblr.com/tumblr_kx9pjmaxmV1qzp52uo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://www.behance.net/Gallery/The-Soft-Spot/396298"&gt;The Soft Spot on the Behance Network&lt;/a&gt; via &lt;a href="http://abduzeedo.com/daily-inspiration-422"&gt;Daily Inspiration #422 | Abduzeedo | Graphic Design Inspiration and Photoshop Tutorials&lt;/a&gt;&lt;/p&gt;</description><link>http://stonedsoul.org/post/368746418</link><guid>http://stonedsoul.org/post/368746418</guid><pubDate>Wed, 03 Feb 2010 22:30:58 +0900</pubDate></item><item><title>Google Apps のサブドメインに "www" を使う</title><description>&lt;p&gt;Google Page Craetor の終了に伴い、下のページに書いたように静的ファイルのホスティングを
Google App Engine に移行した。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stonedsoul.org/post/124523028/page-creator-app-engine"&gt;静的ファイルのホスティングをPage CreatorからApp Engineに移行&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;移行の際、GAE には “www” というサブドメインを割当て、Page Creator の使用を停止した(無効にした)。
それで問題なく動いていたのだが、去年の 12 月に Google が Page Creator のコンテンツを Google Sites 
に移行させてからおかしくなった。&lt;/p&gt;

&lt;p&gt;Page Creator で作ったページが Sites に復活し、GAE で使っているサブドメイン “www” を割当てられたので、
コンテンツが移行された後、GAE にホスティングしたファイルにアクセスできなくなった。さらに
Sites の web address mapping から “www” を削除して、Page Creator から移行されたページを削除しても、
GAE の方には “www” でアクセスできなくなったままだった。&lt;/p&gt;

&lt;p&gt;最近になって、下の Help トピックを見つけて解決できたので、メモしておく。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://groups.google.co.jp/group/hosted-the-basics-jp/browse_thread/thread/2c50f4070b89d16d?pli=1"&gt;Google Sites で作成したサイトの URL に、サブドメイン www が割り当てられない&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一言で言うと、一度 “www” をスタートページのサブドメインにしてから、別のものにすれば
他のアプリケーション (GAE など) で使えるようになる。&lt;/p&gt;

&lt;p&gt;実際にやった手順は以下の通り。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Google Sites の Web Address Mapping から “www” を削除 (Page Creator のコンテンツも削除した)&lt;/li&gt;
&lt;li&gt;DNS の設定から、”www” を削除 (これと、4 は必要ないかもしれない)&lt;/li&gt;
&lt;li&gt;スタートページのサブドメインに “www” を割り当てる&lt;/li&gt;
&lt;li&gt;DNS の設定で “www” の CNAME レコードに “ghs.google.com.” を割り当てる&lt;/li&gt;
&lt;li&gt;スタートページのサブドメインを他のものに変更 (“start” など)&lt;/li&gt;
&lt;li&gt;GAE の Web Address Setting で “www” を設定 (&lt;a href="http://www.example.com"&gt;www.example.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;</description><link>http://stonedsoul.org/post/350457659</link><guid>http://stonedsoul.org/post/350457659</guid><pubDate>Sun, 24 Jan 2010 17:25:01 +0900</pubDate></item><item><title>Using "www" for subdomain of Google Apps</title><description>&lt;p&gt;Due to temination of Google Page Creator, I moved hosting of static files to Google App Engine
as I wrote the following article.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stonedsoul.org/post/119905770/migrating-static-contents-from-page-creator-to-app"&gt;Migrating static contents from Page Creator to App Engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I moved to App Engine, I set up “www” to the subdomain for GAE. And I disable Page Creator
on my Google Apps Account. It has worked as expected… until Google migrate page creator contents
to Google Sites last December.&lt;/p&gt;

&lt;p&gt;Google revived my Page Creator contens in Google Sites, and assigned “www” as the subdomain
of Google Apps, that prevented access to my GAE contents. Moreover, even though I removed
“www” from web address mapping of Sites, I couldn’t resolve the problem to access to my
GAE contens with subdomain “www’.&lt;/p&gt;

&lt;p&gt;Now I could fix the problem lately, according to the following help topic (Japanese) of Google Apps,
here is the notes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://groups.google.co.jp/group/hosted-the-basics-jp/browse_thread/thread/2c50f4070b89d16d?pli=1"&gt;Google Sites で作成したサイトの URL に、サブドメイン www が割り当てられない&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, to use “www” as submain of Google Apps, assign “www” to Start Page,
and then change subdomain of Start Page, asign “www” to another Apps.&lt;/p&gt;

&lt;p&gt;Here is the exact steps to assign “www” to GAE in my case.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove “www” from Google Sites addresss mapping (removed page creator contents from Sites too)&lt;/li&gt;
&lt;li&gt;Remove “www” from my DNS settings (You might not need this step and step 4)&lt;/li&gt;
&lt;li&gt;Assign “www” to Start Page of my Google Apps&lt;/li&gt;
&lt;li&gt;Set up “www” to CNAME record (points to “ghs.google.com.”)&lt;/li&gt;
&lt;li&gt;Change subdomain of Start Page (e.g., “start” or something)&lt;/li&gt;
&lt;li&gt;Assign “www” to GAE (web address setting)&lt;/li&gt;
&lt;/ol&gt;</description><link>http://stonedsoul.org/post/350456450</link><guid>http://stonedsoul.org/post/350456450</guid><pubDate>Sun, 24 Jan 2010 17:23:58 +0900</pubDate></item><item><title>Interesting To-Do list applications</title><description>&lt;p&gt;I saw an article about TeuxDeux which is simple to-do list application on the web.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://teuxdeux.com/"&gt;TeuxDeux&lt;/a&gt; (via &lt;a href="http://www.nickfinck.com/blog/entry/simple_experiences_in_web_applications_teuxdeux/"&gt;Nick Finck Blog&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I saw another article (Japanese) about a scheduler applciation which has similar looking to TeuxDeux.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=332&amp;lang=ja"&gt;山積みスケジューラ&lt;/a&gt; (via &lt;a href="http://bizmakoto.jp/bizid/articles/0912/18/news080.html"&gt;誠 Biz.ID：仕事の優先度が付けられない人へ――「時刻表示のないスケジューラ」のススメ (1/2)&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.xfytec.com/community/modules/mydownloads/singlefile.php?lid=332&amp;lang=ja"&gt;山積みスケジューラ&lt;/a&gt; is one of template for &lt;a href="http://www.justsystems.com/jp/products/xfy_planner/"&gt;xfy Planner&lt;/a&gt;. The schedular doesn’t have time schedule, but it has the estimated time for a task, and you pile the task by date. You can see the screenshot of the tool in the middle of &lt;a href="http://bizmakoto.jp/bizid/articles/0912/18/news080.html"&gt;the article&lt;/a&gt;. As you can see, each date has total time of all task for the date, each task has estimated time and the task block height is different based on the estimated time.&lt;/p&gt;

&lt;p&gt;According to the article, you can devide one large task into some pieces at any time, so you don’t have to consider all of small tasks when you add a large task (schedule.)&lt;/p&gt;

&lt;p&gt;I think it a good concept that shows the time estimate of a task visually and allow you to devide it. It’s not only useful for scheduling but reviewing your tasks.&lt;/p&gt;</description><link>http://stonedsoul.org/post/328570953</link><guid>http://stonedsoul.org/post/328570953</guid><pubDate>Mon, 11 Jan 2010 20:05:28 +0900</pubDate></item><item><title>"Deeply understanding their customers is what allows successful companies to think five years ahead..."</title><description>“Deeply understanding their customers is what allows successful companies to think five years ahead of the market and develop products and services that revolutionize the way we live our lives.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a href="http://www.uxmatters.com/mt/archives/2010/01/research-is-communication.php"&gt;Research Is Communication :: UXmatters&lt;/a&gt; via &lt;a href="http://www.inspireux.com/2010/01/04/deeply-understanding-customers-allows-companies-to-develop-products-that-revolutionize-the-way-we-live-our-lives/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+Inspireux+%28inspireUX%29"&gt;Deeply understanding customers allows companies to develop products that revolutionize the way we live our lives | inspireUX - words to inspire user experience designers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(拙訳) 顧客を深く理解する事こそが、企業を、5年先のマーケットを見据えた、私たちの生活に革命をもたらすようなサービスや製品を開発することへと導く。&lt;/p&gt;&lt;/em&gt;</description><link>http://stonedsoul.org/post/324943338</link><guid>http://stonedsoul.org/post/324943338</guid><pubDate>Sat, 09 Jan 2010 20:04:08 +0900</pubDate></item><item><title>ブラウザのローカルストレージを使った ToDo List</title><description>&lt;p&gt;&lt;a href="http://developer.yahoo.com/yui/2/"&gt;YUI2&lt;/a&gt; にクライアントサイドのストレージ (ブラウザのローカルストレージ) を扱う &lt;a href="http://developer.yahoo.com/yui/storage/"&gt;Storage Utility&lt;/a&gt; があるので、それを使って簡単な ToDo List を作ってみた。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://app.stonedsoul.org/todo.html"&gt;ToDo List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;データはブラウザのストレージに保存されるので (HTML5 のローカルストレージか、Gears、または Flash のストレージ)、サーバ側には何も送られない。当たり前だが、ブラウザを超えてデータは引き継がれない (Firefox で編集したデータは Safari では見れない)。
動作は、Safari 4、Firefox 3.5、IE8、Chrome で確認した。コードはまた来年にでも、もう少しきれいなものに書き直したい。&lt;/p&gt;

&lt;p&gt;YUI の &lt;a href="http://developer.yahoo.com/yui/storage/"&gt;Storage Utility&lt;/a&gt; を使うと、データを同じメソッドで (上に書いた 3 つの内のいずれかのストレージに) key - value の形で簡単に保存できる。この ToDo List では、ToDo リストの JSON データを YUI の &lt;a href="http://developer.yahoo.com/yui/json/"&gt;JSON Unility&lt;/a&gt; で文字列にして (YAHOO.lang.JSON.stringify(json_data) でできる)、取り出した時は parse して (YAHOO.lang.JSON.parse(json_data) で parse) 使っている。&lt;/p&gt;

&lt;p&gt;その他の特徴としては、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ToDoリストのアイテムは Drag &amp; Drop で並べ替え&lt;/li&gt;
&lt;li&gt;Delete した直後なら、Undo できる&lt;/li&gt;
&lt;li&gt;Completed リスト(完了した項目)はまとめて削除できる(Undo できない)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;あと、機能とは関係ないけど、画像を一切使ってない。グラデーションは下のツールで生成したコードを使った。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cyokodog.web.fc2.com/cyokolab/html/gradient_css_generator.html"&gt;Gradient CSS Generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://stonedsoul.org/post/305801809</link><guid>http://stonedsoul.org/post/305801809</guid><pubDate>Tue, 29 Dec 2009 16:28:45 +0900</pubDate></item><item><title>ToDo List application with local storage</title><description>&lt;p&gt;I created simple todo list application with &lt;a href="http://developer.yahoo.com/yui/storage/"&gt;Storage Utility&lt;/a&gt; of &lt;a href="http://developer.yahoo.com/yui/2/"&gt;YUI2&lt;/a&gt;. The storage utility make you easy to handle client side storage (local storage engine in modern browser.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://app.stonedsoul.org/todo.html"&gt;ToDo List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The data is stored in storage of browser (i.e. local storage of HTML5, Geas or storage of Flash), your browser won’t send your todo item data. Of course you can’t use a todo item with different browser. For example, todo item A that is save in Firefox won’t be appeared in Safari. I checked the tool on Safari 4, Firefox 3.5, IE8 and Chrome. I would like to rewrite the code to be better one in near future.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://developer.yahoo.com/yui/storage/"&gt;Storage Utility&lt;/a&gt; allows you to save key-value data to local storage (either one of three storage engine above) with the same method. The ToDo List saves JSON strings that is converted by YAHOO.lang.JSON.stringify() and the JSON string is parsed by YAHOO.lang.JSON.parse() when they are loaded.&lt;/p&gt;

&lt;p&gt;And other features are&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ordering list item by drag &amp; drop&lt;/li&gt;
&lt;li&gt;able to undo deleted item right after deletion&lt;/li&gt;
&lt;li&gt;able to clear completed items (you can’t undo it)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though this is not a feature, but I don’t use any image file for the UI. Gradation color is generated by the following tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://cyokodog.web.fc2.com/cyokolab/html/gradient_css_generator.html"&gt;Gradient CSS Generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://stonedsoul.org/post/305800219</link><guid>http://stonedsoul.org/post/305800219</guid><pubDate>Tue, 29 Dec 2009 16:27:33 +0900</pubDate></item><item><title>ブランドを生み出す環境の力</title><description>&lt;p&gt;&lt;a href="http://noteandpoint.com/"&gt;Note &amp; point&lt;/a&gt; で見た Ologie, LLC のプレゼン資料 &lt;a href="http://noteandpoint.com/2009/12/the-power-of-branded-work-environments/"&gt;The Power Of Branded Work Environment&lt;/a&gt; に書かれていた内容に、
その他のことにも当てはまるような事があったので、メモしておく。&lt;/p&gt;

&lt;p&gt;35 ページからの How Can We Maximize Success? (きれいな図などもあるのでプレゼンの資料を見た方がわかりやすいか)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;目的を明確に定義する&lt;/li&gt;
&lt;li&gt;戦略を表す&lt;br/&gt;
—- Long Term (5-10 Years) … Inspiration —-&lt;br/&gt;
Values (価値、自分たちの信じるもの)&lt;br/&gt;
Mission (ミッション、なぜ自分たちが存在するのか)&lt;br/&gt;&lt;br/&gt;
—- Medium Term (3-5 Years) —-&lt;br/&gt;
Vision (ビジョン、進むべき方向)&lt;br/&gt;&lt;br/&gt;
—- Short Term (1-3 Years) … Action —-&lt;br/&gt;
Strategy (戦略、どのようにしてたどり着くか)&lt;br/&gt;
Tactics (戦術、何をすべきか)&lt;br/&gt;&lt;br/&gt;
&lt;/li&gt;
&lt;li&gt;共同作業的なプロセスを作る (様々なレベル、立場、部署の人を巻き込む)&lt;/li&gt;
&lt;li&gt;プロジェクトの特性を定義する (オフィスのデザインをする会社のプレゼンなので、オフィスに関するプロジェクトでの例が p.39 に出ている。どういうタイプのプロジェクトなのか、を明確にすることなのではないか)&lt;/li&gt;
&lt;li&gt;戦略を総括的な形で表す(? 原文: Translate the strategy in a holistic way. オフィス環境と製品などは若干異なるかもしれないが、成果物には戦略が反映されている、または成果物から戦略が読み取れるようなものになっているかどうか、と解釈した)&lt;/li&gt;
&lt;li&gt;学習し、進化させる (実行 -&gt; 評価 -&gt; 教育 -&gt; 進化、のサイクルを繰り返す)&lt;/li&gt;
&lt;/ol&gt;</description><link>http://stonedsoul.org/post/296679765</link><guid>http://stonedsoul.org/post/296679765</guid><pubDate>Wed, 23 Dec 2009 20:33:50 +0900</pubDate></item><item><title>onChange のタイミング</title><description>&lt;p&gt;チェックボックスの状態が変わったら任意の処理をするような JavaScript を書いてたら、
IE と他のブラウザで動きが違ったのでネットで解決策を探してみた。Firefox なんかは
チェックボックスの状態が変わった瞬間、 IE は状態が変わった後にチェックボックスから
フォーカスが外れたら onChange イベントが発生するようだ。&lt;/p&gt;

&lt;p&gt;IE の動きは何か直感的じゃないと思ったけれど、別に間違ってないらしい。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.w3.org/TR/html4/interact/scripts.html"&gt;http://www.w3.org/TR/html4/interact/scripts.html&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The onchange event occurs when a control loses the input focus and its value has been modified since gaining focus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;参考にしたサイト:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/argius/20090126/1232978170"&gt;IEのonchangeは使いにくい - argius note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lhorie.blogspot.com/2007/04/fixing-ie7-onchange-bug-on-checkboxes.html"&gt;//todo: think of better title: fixing the IE7 onchange bug on checkboxes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://norman.walsh.name/2009/03/24/jQueryIE"&gt;jQuery, .change() notification, and IE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いくつかサイトを見てみたけど、IE の時だけチェックボックスをクリックした時に一旦チェックボックスからフォーカスを外し、
もう一度フォーカスする、というのが良さそうだった。以下 YUI を使ったサンプルコード。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=utf-8 /&gt;
    &lt;title&gt;checkbox test&lt;/title&gt;
    &lt;!-- Combo-handled YUI JS files: --&gt;
    &lt;script type="text/javascript" src="http://yui.yahooapis.com/combo?2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;input type="checkbox" name="check-test-1" id="check-test-1" value="1" /&gt; checkbox 1&lt;/li&gt;
    &lt;li&gt;&lt;input type="checkbox" name="check-test-2" id="check-test-2" value="1" /&gt; checkbox 2&lt;/li&gt;
&lt;/ul&gt;

&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
var onChangeCheckbox = function(oEvent){
    alert("checkbox changed");
};

YAHOO.util.Event.onDOMReady(function(){
    YAHOO.util.Event.addListener("check-test-1", "change", onChangeCheckbox);
    YAHOO.util.Event.addListener("check-test-2", "change", onChangeCheckbox);

    // for IE
    if (YAHOO.env.ua.ie &gt; 0) {
        var oCB2 = document.getElementById("check-test-2");
        YAHOO.util.Event.addListener(oCB2, "click", function(oEvent){
            oCB2.blur();
            oCB2.focus();
        }, oCB2);
    }
});

//]]&gt;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;1 つ目のチェックボックスは onChange しかイベントリスナーを登録してないので、
IE と Firefox ではイベントが発生するタイミングが違う。&lt;/p&gt;

&lt;p&gt;別に onClick にすればいいじゃん、とも思ったけど、onClick だとクリックしたままポインタをずらしたり
(チェックボックスは変更されない)、ラジオボタンの場合は既に選択されている方をクリックしたりしても
イベントが発生するので、意図しない動きになるかもしれない(この点を踏まえてれば問題ないだろうが)。&lt;/p&gt;</description><link>http://stonedsoul.org/post/291619951</link><guid>http://stonedsoul.org/post/291619951</guid><pubDate>Sun, 20 Dec 2009 19:56:22 +0900</pubDate></item><item><title>数値文字参照を元の文字に変換するブックマークレット</title><description>&lt;p&gt;こんな感じ。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;javascript:(function(){function g(el,l){for(var i=0;i&lt;l;i++){var s=el[i].selectionStart;var e=el[i].selectionEnd;if(s!=e){el[i].selectionStart=0;el[i].selectionEnd=0;return el[i].value.substr(s,e-s);}}return '';}var s=window.getSelection().toString();if(s.length&lt;=0){var el=document.getElementsByTagName('textarea');s=el?g(el,el.length):false;if(!s){el=document.getElementsByTagName('input');s=g(el,el.length);}}var r=s.replace(/&amp;#[0-9]+;/g, function(m){return String.fromCharCode(m.replace(/&amp;#|;$/g,''));});var p=prompt(s,r);})();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;変換したい文字を選択して実行。下のページを参考に、テキストエリアの中の文字列にも対応した。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.akatsukinishisu.net/itazuragaki/js/get_selected_text.html"&gt;bookmarkletで選択文字列を取得することを考える - 徒書&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そこで言われている&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;「最後にフォーカスされたフレーム(またはテキスト入力エリア)」を取得するような方法があったらよいなと思ったのですが、自分ではそれを見つけることができませんでした。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;は、テキストエリアの文字列を取得したら selectionStart と selectionEnd を 0 にすることで対処してみた。以下、改行を入れてちょっと見やすくしたもの。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(function(){
    function g(el,l){
        for(var i=0; i&lt;l; i++){
            var s = el[i].selectionStart;
            var e = el[i].selectionEnd;
            if(s != e){
                el[i].selectionStart = 0;
                el[i].selectionEnd   = 0;
                return el[i].value.substr(s, e-s);
            }
        }
        return '';
    }
    var s = window.getSelection().toString();
    if(s.length &lt;= 0){
        var el = document.getElementsByTagName('textarea');
        s = el ? g(el, el.length) : false;
        if(!s){
            el = document.getElementsByTagName('input');
            s  = g(el, el.length);
        }
    }
    var r = s.replace(/&amp;#[0-9]+;/g, function(m){
        return String.fromCharCode(m.replace(/&amp;#|;$/g,''));
    });
    var p = prompt(s, r);
})();
&lt;/code&gt;&lt;/pre&gt;</description><link>http://stonedsoul.org/post/280172145</link><guid>http://stonedsoul.org/post/280172145</guid><pubDate>Sat, 12 Dec 2009 20:43:06 +0900</pubDate></item><item><title>Firefox Add-ons and Scripts for Tumblr</title><description>&lt;p&gt;Japanese heavy users of Tumblr seems to use &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey&lt;/a&gt;
and the following Greasemonkey scripts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://userscripts.org/scripts/show/8551"&gt;AutoPagerize&lt;/a&gt; - It loads next page contents when you scroll down to the bottom of the page.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://userscripts.org/scripts/show/11759"&gt;Minibuffer&lt;/a&gt; - It gives you command-line operation. (This is required for LDRize and ReblogCommand.)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://userscripts.org/scripts/show/11562"&gt;LDRize&lt;/a&gt; - You can scroll to next/previous post with “j”, “k” key.  You can mark a post with “p” key and open all marked posts with “o” key.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://coderepos.org/share/log/lang/javascript/userscripts/reblogcommand.user.js?rev=head"&gt;ReblogCommand&lt;/a&gt; - You can reblog with just pressing “t” key. (Press “Shift” + “t” to reblow with comments.)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://coderepos.org/share/changeset/34487"&gt;Tumblr Dashboard jk disable&lt;/a&gt; - Prevent go to page top when you scroll down to the bottom with “j” key by AutoPagerize. (You can install the script from &lt;a href="http://svn.coderepos.org/share/lang/javascript/userscripts/tumblr_dashboard_jk_disable.user.js"&gt;here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install follwoing user style sheet for &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2108"&gt;Stylish&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://userstyles.org/styles/15857"&gt;A Smart Dashboard is Mine&lt;/a&gt; - This makes your own post collapse and tranclucent in your dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://userstyles.org/styles/5359"&gt;Dashboard Blockquooooote Brushup&lt;/a&gt; - This makes nested blockquote post more readable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And other Add-on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://wiki.github.com/to/tombloo/home_en"&gt;tombloo&lt;/a&gt; - You can posts many services at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press “j” to read forward your dashboard, press “k” to back to previous post&lt;/li&gt;
&lt;li&gt;When you want to reblog a post, just press “t”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;References (Japanese websites):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://crossbreed.jp/archives/200911270105.php"&gt;革新的な情報収集ツール「tumblr」をやってみるべし(CROSSBREED クロスブリード！)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://uessai-text.tumblr.com/post/261516911/firefox-tumblr"&gt;http://uessai-text.tumblr.com/post/261516911/firefox-tumblr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://stonedsoul.org/post/280156348</link><guid>http://stonedsoul.org/post/280156348</guid><pubDate>Sat, 12 Dec 2009 20:17:33 +0900</pubDate></item><item><title>YUI を使ったアコーディオンメニュー</title><description>&lt;p&gt;YUI を使ってアコーディオンメニューを実装するサンプルはいくつかあるけど、どうやってるのか
知りたかったので自分でも作ってみた。&lt;/p&gt;

&lt;p&gt;参考までに、最近見つけたものをいくつか。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bubbling-library.com/eng/api/docs/widgets/accordion/examples"&gt;YUI Widget: Accordion Manager - Examples - JavaScript Bubbling Library - YUI Library Extension for Event-Driven Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.i-marco.nl/weblog/yui-accordion/"&gt;YUI AccordionView Widget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.notoptimal.net/2008/06/simple-yui-powered-accordion-widget.html"&gt;Notoptimal Dev: A Simple YUI-Powered Accordion Widget&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;どんなことをするか&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ページを読み込んだ時に、アコーディオンのコンテンツを隠す&lt;/li&gt;
&lt;li&gt;メニューをクリックした時にアコーディオンのコンテンツを表示する (開いてれば閉じる)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;使い方&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://developer.yahoo.com/yui/2/"&gt;Yahoo UI Library&lt;/a&gt; の YAHOO, Dom, Event, Animation ユーティリティが必要&lt;/li&gt;
&lt;li&gt;対象となるコンテンツ全体を ‘accordion’ という class 名のタグで囲む&lt;/li&gt;
&lt;li&gt;メニューのラベルは ‘ac-label’ という class 名と、ユニークな id を付ける&lt;/li&gt;
&lt;li&gt;アコーディオンのコンテンツは ‘ac-content’ という class 名にし、id はラベルの id プラス ‘-conent’ にする&lt;/li&gt;
&lt;li&gt;ac-content には ‘overflow: hidden;’ というスタイルを適用する&lt;/li&gt;
&lt;li&gt;対象となるコンテンツの親となるエレメントの id を引数にして、関数を実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=utf-8 /&gt;
    &lt;title&gt;Accordion Widget&lt;/title&gt;
    &lt;style type="text/css"&gt;
    .ac-content {
        overflow: hidden;
    }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body id="bd"&gt;
&lt;div class="accordion"&gt;
    &lt;h2 id="accordion1" class="ac-label"&gt;Accordion 1&lt;/h2&gt;
    &lt;p id="accordion1-content" class="ac-content"&gt;
    Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus
    &lt;/p&gt;

    &lt;h2 id="accordion2" class="ac-label"&gt;Accordion 2&lt;/h2&gt;
    &lt;p id="accordion2-content" class="ac-content"&gt;
    Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus
    &lt;/p&gt;
&lt;/div&gt;

&lt;!-- Combo-handled YUI JS files: --&gt;
&lt;script type="text/javascript" src="http://yui.yahooapis.com/combo?2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js&amp;2.8.0r4/build/animation/animation-min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="yui-accordion.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
YAHOO.util.Event.onDOMReady(
    var logger    = new YAHOO.widget.LogReader(null, {
        height: "20em",
        width:  "20em",
        top:    "0px",
        right:  "0px"
    });

    var myWidget  = YAHOO.myWidget;
    var accordion = myWidget.accordion("bd");
});
//]]&gt;
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;yui-accordion.js&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;YAHOO.namespace("myWidget");

/**
 * accordion widget
 * @require yahoo, dom, event, animation, logger (optional)
 * @param  {string} RootNodeId of accordion object
 * @return {object} Accordion object
 */
YAHOO.myWidget.accordion = function(sRootNodeId){
    var Anim  = YAHOO.util.Anim,
        Dom   = YAHOO.util.Dom,
        Event = YAHOO.util.Event;

    var aAccordionEl = Dom.getElementsByClassName("accordion", "div", sRootNodeId);
    YAHOO.log(aAccordionEl.length + " accordion elements found");

    /**
     * toggle accordion menu
     * @param {object} Event (click)
     * @param {string} AccordionId (of the element)
     */
    var toggle = function(oEvent, sAccordionId){
        YAHOO.log("toggle function called for '" + this.firstChild.data + "' with [" + oEvent + ", " + sAccordionId + "]");

        if ( oAccordion[sAccordionId]["state"] === "expanded" ) {
            collapse(sAccordionId);

        } else if ( oAccordion[sAccordionId]["state"] === "collapsed" ) {
            expand(sAccordionId);
        }
    };

    /**
     * expand accordion contents
     " @param {string} AccordionId
     */
    var expand = function(sAccordionId){
        YAHOO.log("expand accordion contents of " + sAccordionId);
        oAccordion[sAccordionId]["expand"].animate();
        oAccordion[sAccordionId]["state"] = "expanded";
    };

    /**
     * collapse accordion contents
     * @param {string} AccordionId
     */
    var collapse = function(sAccordionId){
        YAHOO.log("collapse accordion contents of " + sAccordionId);
        oAccordion[sAccordionId]["collapse"].animate();
        oAccordion[sAccordionId]["state"] = "collapsed";
    };

    var oAccordion = {};
    for (var i=0, l=aAccordionEl.length; i&lt;l; i++) {
        var aAcLabelEl = Dom.getElementsByClassName("ac-label", null, aAccordionEl[i]);

        for (var j=0, len=aAcLabelEl.length; j&lt;len; j++) {
            var oAcLabel        = aAcLabelEl[j];
            var sAcId           = oAcLabel.id;
            var sAcContentId    = sAcId + "-content";
            var oAcContent      = document.getElementById(sAcContentId);

            // define animation
            var oAcAnimExpand   = new YAHOO.util.Anim(sAcContentId, {
                height: { 
                    from: 0, 
                    to: oAcContent.offsetHeight
                }
            }, 0.25, YAHOO.util.Easing.easeOut);
            var oAcAnimCollapse = new YAHOO.util.Anim(sAcContentId, {
                height: { to: 0 }
            }, 0.25, YAHOO.util.Easing.easeOut);

            oAccordion[sAcId] = {
                "content":  oAcContent,
                "expand":   oAcAnimExpand,
                "collapse": oAcAnimCollapse
            };

            Event.addListener(oAcLabel, "click", toggle, sAcId);
            YAHOO.log("click event is assigned to accordion #" + (j+1) + ": " + oAcLabel);
            collapse(sAcId); // close accordion contents
        }
    }

    return oAccordion;
};
&lt;/code&gt;&lt;/pre&gt;</description><link>http://stonedsoul.org/post/243373810</link><guid>http://stonedsoul.org/post/243373810</guid><pubDate>Sat, 14 Nov 2009 15:25:14 +0900</pubDate></item><item><title>Accordion menu with YUI</title><description>&lt;p&gt;There are some according widget with YUI, but I created very simple accordion menu widget
for myself to know how to implement it with YUI.&lt;/p&gt;

&lt;p&gt;For your reference, I list some accordion widgets that I found laterly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bubbling-library.com/eng/api/docs/widgets/accordion/examples"&gt;YUI Widget: Accordion Manager - Examples - JavaScript Bubbling Library - YUI Library Extension for Event-Driven Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.i-marco.nl/weblog/yui-accordion/"&gt;YUI AccordionView Widget&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.notoptimal.net/2008/06/simple-yui-powered-accordion-widget.html"&gt;Notoptimal Dev: A Simple YUI-Powered Accordion Widget&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What’s the script doing&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When a page load, it collapses accordion contents.&lt;/li&gt;
&lt;li&gt;When you click a label of accordion, it expands its content (collapse if it’s expanded.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;How to use&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It requires YAHOO, Dom, Event and Animation utility of &lt;a href="http://developer.yahoo.com/yui/2/"&gt;Yahoo UI Library&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You need to wrap target contents with class name ‘accordion’.&lt;/li&gt;
&lt;li&gt;Label of accordion must have class name ‘ac-label’ and its own id.&lt;/li&gt;
&lt;li&gt;Accordion contents must have class name ‘ac-content’ and the id must be id of ac-label + ‘-content’.&lt;/li&gt;
&lt;li&gt;You need to specify css ‘overflow: hidden;’ to ac-content.&lt;/li&gt;
&lt;li&gt;Execute the function with root node id. It look for target elements under the specified node.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;HTML&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=utf-8 /&gt;
    &lt;title&gt;Accordion Widget&lt;/title&gt;
    &lt;style type="text/css"&gt;
    .ac-content {
        overflow: hidden;
    }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body id="bd"&gt;
&lt;div class="accordion"&gt;
    &lt;h2 id="accordion1" class="ac-label"&gt;Accordion 1&lt;/h2&gt;
    &lt;p id="accordion1-content" class="ac-content"&gt;
    Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus
    &lt;/p&gt;

    &lt;h2 id="accordion2" class="ac-label"&gt;Accordion 2&lt;/h2&gt;
    &lt;p id="accordion2-content" class="ac-content"&gt;
    Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus
    &lt;/p&gt;
&lt;/div&gt;

&lt;!-- Combo-handled YUI JS files: --&gt;
&lt;script type="text/javascript" src="http://yui.yahooapis.com/combo?2.8.0r4/build/yahoo-dom-event/yahoo-dom-event.js&amp;2.8.0r4/build/animation/animation-min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="yui-accordion.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
YAHOO.util.Event.onDOMReady(
    var logger    = new YAHOO.widget.LogReader(null, {
        height: "20em",
        width:  "20em",
        top:    "0px",
        right:  "0px"
    });

    var myWidget  = YAHOO.myWidget;
    var accordion = myWidget.accordion("bd");
});
//]]&gt;
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;yui-accordion.js&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;YAHOO.namespace("myWidget");

/**
 * accordion widget
 * @require yahoo, dom, event, animation, logger (optional)
 * @param  {string} RootNodeId of accordion object
 * @return {object} Accordion object
 */
YAHOO.myWidget.accordion = function(sRootNodeId){
    var Anim  = YAHOO.util.Anim,
        Dom   = YAHOO.util.Dom,
        Event = YAHOO.util.Event;

    var aAccordionEl = Dom.getElementsByClassName("accordion", "div", sRootNodeId);
    YAHOO.log(aAccordionEl.length + " accordion elements found");

    /**
     * toggle accordion menu
     * @param {object} Event (click)
     * @param {string} AccordionId (of the element)
     */
    var toggle = function(oEvent, sAccordionId){
        YAHOO.log("toggle function called for '" + this.firstChild.data + "' with [" + oEvent + ", " + sAccordionId + "]");

        if ( oAccordion[sAccordionId]["state"] === "expanded" ) {
            collapse(sAccordionId);

        } else if ( oAccordion[sAccordionId]["state"] === "collapsed" ) {
            expand(sAccordionId);
        }
    };

    /**
     * expand accordion contents
     " @param {string} AccordionId
     */
    var expand = function(sAccordionId){
        YAHOO.log("expand accordion contents of " + sAccordionId);
        oAccordion[sAccordionId]["expand"].animate();
        oAccordion[sAccordionId]["state"] = "expanded";
    };

    /**
     * collapse accordion contents
     * @param {string} AccordionId
     */
    var collapse = function(sAccordionId){
        YAHOO.log("collapse accordion contents of " + sAccordionId);
        oAccordion[sAccordionId]["collapse"].animate();
        oAccordion[sAccordionId]["state"] = "collapsed";
    };

    var oAccordion = {};
    for (var i=0, l=aAccordionEl.length; i&lt;l; i++) {
        var aAcLabelEl = Dom.getElementsByClassName("ac-label", null, aAccordionEl[i]);

        for (var j=0, len=aAcLabelEl.length; j&lt;len; j++) {
            var oAcLabel        = aAcLabelEl[j];
            var sAcId           = oAcLabel.id;
            var sAcContentId    = sAcId + "-content";
            var oAcContent      = document.getElementById(sAcContentId);

            // define animation
            var oAcAnimExpand   = new YAHOO.util.Anim(sAcContentId, {
                height: { 
                    from: 0, 
                    to: oAcContent.offsetHeight
                }
            }, 0.25, YAHOO.util.Easing.easeOut);
            var oAcAnimCollapse = new YAHOO.util.Anim(sAcContentId, {
                height: { to: 0 }
            }, 0.25, YAHOO.util.Easing.easeOut);

            oAccordion[sAcId] = {
                "content":  oAcContent,
                "expand":   oAcAnimExpand,
                "collapse": oAcAnimCollapse
            };

            Event.addListener(oAcLabel, "click", toggle, sAcId);
            YAHOO.log("click event is assigned to accordion #" + (j+1) + ": " + oAcLabel);
            collapse(sAcId); // close accordion contents
        }
    }

    return oAccordion;
};
&lt;/code&gt;&lt;/pre&gt;</description><link>http://stonedsoul.org/post/243354383</link><guid>http://stonedsoul.org/post/243354383</guid><pubDate>Sat, 14 Nov 2009 15:02:00 +0900</pubDate></item><item><title>JavaScript のスピードアップ (Google Tech Talk)</title><description>&lt;p&gt;最近 Google Tech Talk の &lt;a href="http://www.youtube.com/watch?gl=JP&amp;v=mHtdZgou0qU"&gt;Speed Up Your JavaScript&lt;/a&gt; を見たので、 今後のためにメモしておく。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.nczonline.net/"&gt;Nicholas C. Zakas&lt;/a&gt; さんがプレゼンテーションの中で次の4つの点について説明している。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;スコープ管理&lt;/li&gt;
&lt;li&gt;データアクセス&lt;/li&gt;
&lt;li&gt;ループ&lt;/li&gt;
&lt;li&gt;DOM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;スコープ管理&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;ローカル変数を使う (変数などはローカル変数に保存して使う)&lt;/li&gt;
&lt;li&gt;“with” ステートメントをさける。また “try-catch” を使う時は注意 (これらはスコープチェインの先頭にオブジェクトを追加する)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;#1の例: ローカル変数を使用&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function func1(){
    var doc = document;
    var header  = doc.getElementById('header');
    var content = doc.getElementById('content');
    // do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;データアクセス&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;リテラルとローカル変数が一番早い (ローカル変数を使う)&lt;/li&gt;
&lt;li&gt;オブジェクトのプロパティの階層が深くなるほど時間がかかる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;#1の例:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function process(data){
    var count = data.count;
    var item  = data.item;
    for (var i=0; i&lt;count; i++){
        processData(item[i]);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;ループ&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;for-each、 for-in を避ける&lt;/li&gt;
&lt;li&gt;一回のイテレーションでの処理を減らす (これには条件式やインクリメントなども含む)&lt;/li&gt;
&lt;li&gt;イテレーションの回数を減らす&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;#2の例:&lt;/p&gt;

&lt;p&gt;次のコードは&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var len = values.length;
for (var i=len; i--){
    //do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;下のコードよりも早い&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for (var i=0; i&lt;value.length; i++){
    // do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;DOM&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;DOM は document が変更された時に更新される (オブジェクトにアクセスする度にクエリが実行される)&lt;/li&gt;
&lt;li&gt;長さやアイテムをローカル変数に保存する&lt;/li&gt;
&lt;li&gt;アイテムに頻繁にアクセスする場合は、ローカルの配列にコピーする&lt;/li&gt;
&lt;li&gt;ノードの追加、削除の回数を減らす (例えば document.fragment を使う)&lt;/li&gt;
&lt;li&gt;‘style’ プロパティを変更しない (class を定義し、className を変更する)&lt;/li&gt;
&lt;li&gt;レイアウト情報へのアクセスを減らす (2回以上アクセスするなら、ローカル変数に保存する)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;#1の例: 以下は無限ループ&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var divs = document.getElementByTagName('div');
for (var i=0; i&lt;divs.length; i++){
    var div = document.createElement('div');
    document.body.appendChild(div);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;#3の例:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function array(items){
    try {
        return Array.prototype.concat.call(items);
    } catch (ex) {
        var i      = 0,
            len    = items.length,
            result = Array(len);
        while (i&lt;len){
            result[i] = items[i];
            i++;
        }
        return result;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;#4の例:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var list = document.getElementById('list');
var fragment = document.createDocumentFlagment();
for (var i=0; i&lt;10; i++){
    var item = document.createElement('li');
    item.innerHTML = 'Option #' + (i+1);
    fragment.appendChild(item);
}
list.appendChild(fragment);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上記は将来的にブラウザのJSエンジンが改善された場合、不要になるかもしれないが、現時点で有効なテクニック。&lt;/p&gt;

&lt;p&gt;その他、参考になるページ (&lt;a href="http://www.nczonline.net/blog/"&gt;Nicholas C. Zakas’s blog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/"&gt;Speed up your JavaScrpt, Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/20/speed-up-your-javascript-part-2/"&gt;Speed up your JavaScrpt, Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/27/speed-up-your-javascript-part-3/"&gt;Speed up your JavaScrpt, Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/"&gt;Speed up your JavaScrpt, Part 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://stonedsoul.org/post/216134323</link><guid>http://stonedsoul.org/post/216134323</guid><pubDate>Sun, 18 Oct 2009 16:49:00 +0900</pubDate></item><item><title>Speed up your JavaScript (Google Tech Talk)</title><description>&lt;p&gt;I watched Google Tech Talk Video - &lt;a href="http://www.youtube.com/watch?gl=JP&amp;v=mHtdZgou0qU"&gt;Speed Up Your JavaScript&lt;/a&gt; yesterday. I take a note of some points of the technic here for my study.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.nczonline.net/"&gt;Nicholas C. Zakas&lt;/a&gt; showed 4 points for speed up in the presentation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scope Management&lt;/li&gt;
&lt;li&gt;Data access&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;DOM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scope Management&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use Local Valiables. (Store a valiable to a local valiable.)&lt;/li&gt;
&lt;li&gt;Avoid “with” statement. Be careful “try-catch”. (Both add an object to scope chain)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example of #1: Using local valiable&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function func1(){
    var doc = document;
    var header  = doc.getElementById('header');
    var content = doc.getElementById('content');
    // do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Data access&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Literal &amp; Local Valiables are fastest (use local valiables)&lt;/li&gt;
&lt;li&gt;Deeper object property is slower&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example of #1:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function process(data){
    var count = data.count;
    var item  = data.item;
    for (var i=0; i&lt;count; i++){
        processData(item[i]);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Loops&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Avoid for-each, for-in&lt;/li&gt;
&lt;li&gt;Less work per iteration (includes condition evaluation and incrementing/decrementing)&lt;/li&gt;
&lt;li&gt;Less number of iteration&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example of #2:&lt;/p&gt;

&lt;p&gt;The following code is faster&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var len = values.length;
for (var i=len; i--){
    //do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;than below.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;for (var i=0; i&lt;value.length; i++){
    // do something
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;DOM&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;DOM is updated when document is changed (the query re-runs when the object is accessed)&lt;/li&gt;
&lt;li&gt;Store length, items in local valiables&lt;/li&gt;
&lt;li&gt;Copy items in local (regular) array if it’s frequently used&lt;/li&gt;
&lt;li&gt;Less node add/remove (use document.fragment, for example)&lt;/li&gt;
&lt;li&gt;Avoid changing ‘style’ property (define class and change className instead)&lt;/li&gt;
&lt;li&gt;Minimize access to layout information (store it in local valiables if it’s accessed more than once)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example of #1: The following loop is infiite&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var divs = document.getElementByTagName('div');
for (var i=0; i&lt;divs.length; i++){
    var div = document.createElement('div');
    document.body.appendChild(div);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Example of #3:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function array(items){
    try {
        return Array.prototype.concat.call(items);
    } catch (ex) {
        var i      = 0,
            len    = items.length,
            result = Array(len);
        while (i&lt;len){
            result[i] = items[i];
            i++;
        }
        return result;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Example of #4:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var list = document.getElementById('list');
var fragment = document.createDocumentFlagment();
for (var i=0; i&lt;10; i++){
    var item = document.createElement('li');
    item.innerHTML = 'Option #' + (i+1);
    fragment.appendChild(item);
}
list.appendChild(fragment);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These technics may not be effective in future for browsers that have more optimising JS engine, but it’s effective for now.&lt;/p&gt;

&lt;p&gt;Other references (on &lt;a href="http://www.nczonline.net/blog/"&gt;Nicholas C. Zakas’s blog&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/"&gt;Speed up your JavaScrpt, Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/20/speed-up-your-javascript-part-2/"&gt;Speed up your JavaScrpt, Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/01/27/speed-up-your-javascript-part-3/"&gt;Speed up your JavaScrpt, Part 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/"&gt;Speed up your JavaScrpt, Part 4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://stonedsoul.org/post/216133639</link><guid>http://stonedsoul.org/post/216133639</guid><pubDate>Sun, 18 Oct 2009 16:48:24 +0900</pubDate></item><item><title>via 10/GUI | Blog | Nick Finck | UX/IA Pro, Speaker, and...</title><description>&lt;object type="application/x-shockwave-flash" width="400" height="220" data="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;server=vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF"&gt;&lt;param name="quality" value="best" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="scale" value="showAll" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;server=vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF" /&gt;&lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=6712657&amp;server=www.vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="220"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;via &lt;a href="http://www.nickfinck.com/blog/entry/10_gui/#When:22:47:46Z"&gt;10/GUI | Blog | Nick Finck | UX/IA Pro, Speaker, and Community Cultivator.&lt;/a&gt;&lt;/p&gt;</description><link>http://stonedsoul.org/post/211939220</link><guid>http://stonedsoul.org/post/211939220</guid><pubDate>Tue, 13 Oct 2009 21:45:33 +0900</pubDate></item><item><title>"実現すべきなのは、ひとりが使い始めたら、周りはまったく何もしなくても、当人とその友だち全員の役に立つ仕掛けだ。"</title><description>“実現すべきなのは、ひとりが使い始めたら、周りはまったく何もしなくても、当人とその友だち全員の役に立つ仕掛けだ。”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;p&gt;&lt;a href="http://ittousai.org/jwz_groupware_bad.html"&gt;jwz: グループウェア、ダメ！ ‐ Groupware Bad&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(original sentence)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The trick you want to accomplish is that when one person is using your software, it suddenly provides value to that person and their entire circle of friends, without the friends having had to do anything at all.&lt;/p&gt;
&lt;/blockquote&gt;&lt;/em&gt;</description><link>http://stonedsoul.org/post/203418783</link><guid>http://stonedsoul.org/post/203418783</guid><pubDate>Sun, 04 Oct 2009 00:18:06 +0900</pubDate></item></channel></rss>
