<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>qrone.org</title>
      <link>http://www.qrone.org/</link>
      <description></description>
      <language>en-US</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Mon, 25 Feb 2008 21:01:22 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=3.2</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>次世代 Yahoo! メール ベータ版 リリース &amp; 募集開始</title>
         <description><![CDATA[<p>入社以来長いこと作ってきたプロダクトがやっとベータリリースされました。<br />
長かった…</p>

<p>新しい Yahoo! メールベータ版は、Flash/Flex 2 を利用してます。もう使ってみた方もいらっしゃると思いますがいかがでしょうか。特徴とかは公式を見ていただければと思います。</p>

<p>Flash を選んだ理由は、やはりその早さ。確かに ActiveX はインストールがどうのという問題も孕んでますが、実際には 98% ぐらいの人がインストールされている Windows を超えるシェアを持つ世界最強のプラットフォームです。</p>

<p>なぜ Flash か？</p>

<p>しかし、Flash が Ajax より圧倒的に優れている点は二つ。<br />
ここを述べさせてください。</p>

<p>一つは、Loader を用いて Flash を入れ子にできること</p>

<p>これによって Ajax では困難だった「ロード中」のほとんどなく、起動も早いアプリケーションを容易に作ることができます。</p>

<p>Ajax で同等のことを実現するには JavaScript の段階ロードを行いますがロードしなければならないコードを自らファイル分けする必要があります。もちろん Ajax でもクラス事に JavaScript ファイルを分けて段階的にロードさせることはできますが、1000～2000 もの大量のクラスを作るフロントエンド UI プログラミングでは、このクラス事のロードではファイルの読み込みのオーバーヘッドが掛かりすぎます。またロードプログラムを手で書かないといけないのもです。</p>

<p>Flex はその点極めて優秀な階層ロードが可能です。何も手を加えなくても必要なクラスだけをロードして実行してくれますし、ブロック事に SWF をいくつも生成することでダウンロード容量を減らすことができます。</p>

<p>* もう一つはクラスプラットフォーム性の高さ</p>

<p>通常 Ajax でプログラムする際にはすべてのコードを ４～６つのブラウザ（Win IE6/IE7/FF2 Mac FF2/Safari）でテストする必要があります。特にブラウザにイレギュラーな作業を強要するアプリケーション開発においては表示崩れなどを排除し、あらゆるブラウザで同一の結果を得るように開発するのは極めて困難です。</p>

<p>一つの解決は Ext のような UI ライブラリを利用することですが、今回はデザインに対する要求を満たせない為、不可能でした。</p>

<p>* Flash の弱点</p>

<p>私が思うに Flex 2 の最大の弱点は初回の起動速度があまりにも遅いことです。一瞬で起動するアプリケーションを作ろうとしても PC 環境によっては、 <mx:Application> タグのみのアプリケーションですらローディング画面が表示されます。これはアプリケーション規模が大きくなってくるごとに重大な問題に発展します。</p>

<p>これは Flex 2 を利用した際の最大の問題でした。これの解決する方法は一つ、起動直後に見える部分をすべてローディング画面として作ること。preloader として作られた部分は非常に高速に起動直後に表示されるのでこれは使えます。</p>

<p>しかしこれには問題があり preloader 作成の際に与えられる stage と起動後に与えられる stage が異なるのです。この為、preloader で作られた部品を長いこと活用しようというのは残念ながらあまり現実的ではありません。</p>

<p>そしてもう一つが MXML をすべて捨てる方法です。ActionScript 3 だけですべてを作る選択ですね、これはすべてをコントロールできるので非常に高速に起動するアプリケーションを作ることができます。しかしこれは Flex 2 を利用する最大のメリットを潰すことでもあり、通常大変になりすぎるのでアプリケーション開発にはお勧めできません。</p>

<p>SWFLoader や Module を利用したコンポーネント分離も考えられますが、そもそものルートアプリケーションを相当に小さくしてもロードの遅さは免れえません。</p>

<p>* 最後に</p>

<p>探さないでください（笑</p>]]></description>
         <link>http://www.qrone.org/2008/02/_yahoo.html</link>
         <guid>http://www.qrone.org/2008/02/_yahoo.html</guid>
         <category>Flex 2</category>
         <pubDate>Mon, 25 Feb 2008 21:01:22 +0900</pubDate>
      </item>
            <item>
         <title>Flex 2 / ActionScript 3 Super Tips</title>
         <description><![CDATA[<div class="QrONEWiki"> AS3 にはメタデータタグと呼ばれるものがあって、これを使うとイベントだとかスタイルだとかの定義をしておいて asdoc でドキュメント化することが出来たりするんですが、このメタデータタグの Bindable を使うと、変数の更新をチェックすることができます<br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="keyword">public</span><span class="normal"> </span><span class="keyword">class</span><span class="normal"> A</span><span class="cbracket">{</span><br/><span class="normal">    </span><span class="symbol">[</span><span class="normal">Bindable</span><span class="symbol">]</span><br/><span class="normal">    </span><span class="keyword">public</span><span class="normal"> </span><span class="keyword">var</span><span class="normal"> str</span><span class="symbol">:</span><span class="normal">String</span><span class="symbol">;</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> 定義はこんな感じ、こうしておくとこの変数の更新時に propertyChanged イベントが飛ぶようになります。<br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="keyword">var</span><span class="normal"> a</span><span class="symbol">:</span><span class="normal">A </span><span class="symbol">=</span><span class="normal"> </span><span class="keyword">new</span><span class="normal"> A</span><span class="symbol">;</span><br/><span class="normal">a</span><span class="symbol">.</span><span class="function">addEventListener</span><span class="symbol">(</span><span class="normal">PropertyChangeEvent</span><span class="symbol">.</span><span class="normal">PROPERTY_CHANGED</span><span class="symbol">,</span><span class="normal"> </span><br/><span class="normal">    </span><span class="keyword">function</span><span class="symbol">(</span><span class="normal">e</span><span class="symbol">:</span><span class="normal">PropertyChangeEvent</span><span class="symbol">):</span><span class="type">void</span><span class="cbracket">{</span><br/><span class="normal">        </span><span class="keyword">if</span><span class="symbol">(</span><span class="normal">e</span><span class="symbol">.</span><span class="normal">property </span><span class="symbol">==</span><span class="normal"> </span><span class="string">"str"</span><span class="symbol">)</span><span class="cbracket">{</span><br/><span class="normal">            </span><span class="function">trace</span><span class="symbol">(</span><span class="string">"str has changed!"</span><span class="symbol">);</span><br/><span class="normal">        </span><span class="cbracket">}</span><br/><span class="normal">    </span><span class="cbracket">}</span><span class="symbol">);</span><br/> <br/><span class="normal">a</span><span class="symbol">.</span><span class="normal">str </span><span class="symbol">=</span><span class="normal"> </span><span class="string">"Hello"</span><span class="symbol">;</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> こんな感じですね。CollectionEvent と一緒に用いれば、大体の変数の中身の変更は外側からキャッチできるので、どこかにデータを格納しておいて、そこに Bindable をばーっとつけておいて、それをチェックしながら UI を更新するという感じです。<br/> <br/> setter getter を使う場合にはこんな感じ・・・<br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="keyword">public</span><span class="normal"> </span><span class="keyword">class</span><span class="normal"> A</span><span class="cbracket">{</span><br/><span class="normal">    </span><span class="keyword">private</span><span class="normal"> </span><span class="keyword">var</span><span class="normal"> _str</span><span class="symbol">:</span><span class="normal">String</span><span class="symbol">;</span><br/> <br/><span class="normal">    </span><span class="symbol">[</span><span class="normal">Bindable</span><span class="symbol">]</span><br/><span class="normal">    </span><span class="keyword">public</span><span class="normal"> </span><span class="keyword">function</span><span class="normal"> get </span><span class="function">str</span><span class="symbol">():</span><span class="normal">String</span><span class="cbracket">{</span><br/><span class="normal">        </span><span class="function">trace</span><span class="symbol">(</span><span class="string">"get Invoked."</span><span class="symbol">);</span><br/><span class="normal">        </span><span class="keyword">return</span><span class="normal"> _str</span><span class="symbol">;</span><br/><span class="normal">    </span><span class="cbracket">}</span><br/><span class="normal">    </span><span class="keyword">public</span><span class="normal"> </span><span class="keyword">function</span><span class="normal"> set </span><span class="function">str</span><span class="symbol">(</span><span class="normal">value</span><span class="symbol">:</span><span class="normal">String</span><span class="symbol">):</span><span class="type">void</span><span class="cbracket">{</span><br/><span class="normal">        </span><span class="function">trace</span><span class="symbol">(</span><span class="string">"set Invoked"</span><span class="symbol">);</span><br/><span class="normal">        _str </span><span class="symbol">=</span><span class="normal"> value</span><span class="symbol">;</span><br/><span class="normal">    </span><span class="cbracket">}</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> 変数の代入時に、getter が二度前後に呼ばれるようになり、変数が変更されたかどうかのチェックがなされるようになるので、getter の呼ばれる回数には注意が必要です。<br/> <br/> ちなみに、Bindable をつけておくと MXML で自動更新もされるようになります。<br/> 便利ですね。<br/> <br/> <br/> </div>   <!-- QrONEParserSource // ZIP compressed data of the source text. Base64:eNqdVW1v00gQ/u5fseRTKqH2w33rm5Qr1QGCu4py0qHTqTLxUiwsJ7LdIIQqde2+UldcgZbrVdCivtA2aqhExHGlND9mYrf8C2bWdmNHOXTCspTN7uzMMzPPMy6M/sBAVEG8A+8NuA3w5sA7oQW9RyD2guUTEEfg+uAuguuCqIHwQeBiC8QuTAkQz+Xps+bnBohZvALuNnhr4L0Hbx7EJu0IvPuv9IlH1damqAW1v89O9/E6iJfkUDwBMY0LptpaqYjg3oK3AO4heDsEUToN/FUQawQIY5MjP5g7Dl/tgNgA90l85D6nu7hGuBFKhN45yRr7UTc19a7BWSaPKRFsL4QrZBGu18PVI4LpCXARkwfuuzYQMt4SiFPcV5R+jdv6uDnYXyxpnBmqOT6Qu65W1NGipZed3KBSnrhr6EVWNFTbZoXHCsPn9wTIH/JvbFJRLWY7Vu+oY+nmeJ/S30M+B/t74hCKElcR20jdQDwH4fQGiL+SzGdT1X0q0VI52rIL17CrVVa2SmVuOY+G7iNmrrFsO/0vW+sgPoA7L71iLw9kzSlpmHL/R96UjdpbYAPM5A9ZoU9Ru1VNG65w07mh2w43uZUfyWCQZ90jt34ZGb51+87Y0NXCzz8NX7nMZI3uTZhFRy+Zed7b4VZXb6Wka1Fx6dHv5Xl3kiEbGGA5LGyuq2VAj2OpRZ6nE3ZftVkxKsSlXFffhdmkXE3iDsInQ/R0lRtGKdepPe1diYl5iAUbKhkGlwlIvEj4vebHqbN/UA/Vsxd7JAZUFyqQyPi2+TnTt+bHw/PjaryzXsf+B9urgahLvUWq2SKqImcjbhJba7QmXuxLFixSE1uKeBZunpzVl9rUKO1fSftqRiyEDG/SMECs2yCWO1yT4yErnJfEG5SMu8B+vUaOYoHFipJ5i9lMuYhcNnccbrHx6OdCrMFmPfhzPh5kbbX2PkXvdyqybOkV1eFSg2NpEX5DrwklCScJN98V32rRLKYYGVwzK6UHXOtO08vizoRlyoDR5mRH/3bsv6IaEzyO0c74hMytSOlAYxF3pYMkUofxckG4T1vBzE40KLC5SR+E3zz2g+PdYGEpOEW2VrNfjeyoaE1VP6HtiuT4hiTjvjSWPM0wxpeMWenks0XqC0C1NIJg/bWMR/QI3++F008pdmPmfFekuAXijQzRiHLLsjzNbBqg7OZvN2/Q1+l87iBYXEk+D+5/IEwNyOZpI5jfT48ABZ+v4wbpVg== --> ]]></description>
         <link>http://www.qrone.org/2007/04/flex_2_actionscript_3_super_ti.html</link>
         <guid>http://www.qrone.org/2007/04/flex_2_actionscript_3_super_ti.html</guid>
         <category>Flex 2</category>
         <pubDate>Tue, 10 Apr 2007 03:29:44 +0900</pubDate>
      </item>
            <item>
         <title>プログラミング言語製作始めました</title>
         <description><![CDATA[<div class="QrONEWiki"> んー、ここで宣言するより、2ch とかで宣言した方がいいんですかね？<br/> <br/> 作ろうとしてるのは Groovy なんかに似た、メタ言語と呼ばれるものです、コンパイルすることで他の言語に変換されるものですね。具体的には JavaScript 2.0 + ECMAScript for XML を IE/FireFox/Safari/Opera で動作するような、JavaScript 1.X 系に変換するようなコンパイラを目指そうと思ってます。<br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="keyword">class</span><span class="normal"> A </span><span class="keyword">extends</span><span class="normal"> B</span><span class="cbracket">{</span><br/><span class="normal">    </span><span class="keyword">public</span><span class="normal"> </span><span class="keyword">function</span><span class="normal"> </span><span class="function">C</span><span class="symbol">(</span><span class="normal"> a</span><span class="symbol">:</span><span class="normal">Number</span><span class="symbol">,</span><span class="normal"> b</span><span class="symbol">:</span><span class="normal">A </span><span class="symbol">)</span><span class="cbracket">{</span><br/><span class="normal">        </span><span class="keyword">super</span><span class="symbol">.</span><span class="function">C</span><span class="symbol">(</span><span class="normal">a</span><span class="symbol">,</span><span class="normal">b</span><span class="symbol">);</span><br/><span class="normal">        </span><span class="keyword">var</span><span class="normal"> c</span><span class="symbol">:</span><span class="normal">Number</span><span class="symbol">;</span><br/><span class="normal">        </span><span class="keyword">return</span><span class="normal"> a</span><span class="symbol">;</span><br/><span class="normal">    </span><span class="cbracket">}</span><br/><span class="cbracket">}</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> こんなんを・・・<br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="normal">A</span><span class="symbol">.</span><span class="keyword">prototype</span><span class="symbol">.</span><span class="normal">C </span><span class="symbol">=</span><span class="normal"> </span><span class="keyword">function</span><span class="symbol">(</span><span class="normal"> a</span><span class="symbol">,</span><span class="normal"> b </span><span class="symbol">)</span><span class="cbracket">{</span><br/><span class="normal">    </span><span class="function">super_C</span><span class="symbol">(</span><span class="normal">a</span><span class="symbol">,</span><span class="normal"> b</span><span class="symbol">);</span><br/><span class="normal">    </span><span class="keyword">var</span><span class="normal"> c</span><span class="symbol">;</span><br/><span class="normal">    </span><span class="keyword">return</span><span class="normal"> a</span><span class="symbol">;</span><br/><span class="cbracket">}</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> みたいな感じに変換する感じですかね。んで、次のステップとして Obfuscate もかませます、また、HTML ごと変換できるようになるとさらにいいでしょう、要は、HTML/CSS/JavaScript で出来ているユーザーに送るファイル郡をバイナリファイルとみなしてサイズやリクエスト数を最低限に抑え、解読しにくいようにして送るということですね。<br/> <br/> こちらの開発している状況そのままでユーザーに送るのは・・・ということです。<br/> とりあえず、javacc を使う予定。</div>   <!-- QrONEParserSource // ZIP compressed data of the source text. Base64:eNqNVFtPE1EQft9fceITRNIqjwgktQEvEXnAB97MdtliDXabbUsghqTnbIXSgtwE5CZpQMBWigkRQ2nhx0y7bZ/8C86cbi8YTNycbM7OznzzzZxvDog1sAoQ48DX5Dou5w6qJzHgWyBSIBIgkvi3W3vDgJ8AT7V5bALftzcugS8Aj9MSFE+R5Hb6u7CvKKXiLohF4LMyGiOOCJbngJ+xJ6ZhTE4jbkZGojlbKhQQlOhYaRA3mKaa+YKh5RW0/wCxIEkJCSAzoac4BwvXCohDsLIOcSoFEx6XrjbQuYGTLR/O20s7wNfvgOKnEBPlD79KxbXKNtaTJY7P1Ul1RDMDoQjrdj1g99mAd8jjGPyGyUaHXjAQq+zZgHswYOqDxpR7RPWrZsA9HNJNlVG7UuvUhWZDqRcZJN4G/dA1yirnV20EbzvfKvEb5qvs5OyFOeB79c7aMdwcUHP5teyKUJTeMT0cGA/2K72aMaazCTU43nevlfNev6JNqOEw8zB9KqIHx8Ls8XuF4ROK+iYCGvNHg1okYASZt4OpPS+j73y62cV8PR7WWfejJxzFKl3eDrXL1/moaZ1UTaY5IS2rqUeiZpCpdcuMMqP0uokaMnQ3uCp0cCQGKQmxCtZVff1PPR5XyDQiRmQ6pLu8rK9ZAfJH4g3akvJroswanCXf+rZF8h/0bkifJPeMHcfN57/OrGFsjQEehjMYMW5/T5PexCVYs2BZYG02x4IN+/zRsKZGdCZVmZJHudM4UC43NBlPX5Hk+CeaCicxJlts00tWti8loVHo89IiB5Q8N0HMkVuMV48Q9cyBdHtHRtxtkiThzuXtva9SVXHCs47oqhAX9ObZGo0eGjFDuj56NZpZPLJl+ZkEK9P+V9K5IWrONfCT7CIPIk6e4gzEiexMwl7HSV+1d2Ol4sfa1jLmspMrwBNE+figmjmVCAi4JIk1iyZYhxXliku7cw80B7wuMZ6WfcnVNlKVrbzDSFZZSV7Y51xOVk72/Jqi7yxd3mJNhd6dExPSB16iXFAJfBureItt1jS6N0pF7MhsKZ8o5/CH+ANR6xJQ --> ]]></description>
         <link>http://www.qrone.org/2006/08/post.html</link>
         <guid>http://www.qrone.org/2006/08/post.html</guid>
         <category></category>
         <pubDate>Tue, 22 Aug 2006 23:47:51 +0900</pubDate>
      </item>
            <item>
         <title>iecanvas.htc</title>
         <description><![CDATA[<p>/*----------------------------------------------------------------------------\<br />
|                                IE Canvas 1.0                                |<br />
|-----------------------------------------------------------------------------|<br />
|                          Created by Emil A Eklund                           |<br />
|                        (http://eae.net/contact/emil)                        |<br />
|-----------------------------------------------------------------------------|<br />
| Implementation of the canvas API for Internet Explorer. Uses VML.           |<br />
|-----------------------------------------------------------------------------|<br />
|                      Copyright (c) 2005 Emil A Eklund                       |<br />
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|<br />
| This program is  free software;  you can redistribute  it and/or  modify it |<br />
| under the terms of the MIT License.                                         |<br />
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|<br />
| Permission  is hereby granted,  free of charge, to  any person  obtaining a |<br />
| copy of this software and associated documentation files (the "Software"),  |<br />
| to deal in the  Software without restriction,  including without limitation |<br />
| the  rights to use, copy, modify,  merge, publish, distribute,  sublicense, |<br />
| and/or  sell copies  of the  Software, and to  permit persons to  whom  the |<br />
| Software is  furnished  to do  so, subject  to  the  following  conditions: |<br />
| The above copyright notice and this  permission notice shall be included in |<br />
| all copies or substantial portions of the Software.                         |<br />
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|<br />
| THE SOFTWARE IS PROVIDED "AS IS",  WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |<br />
| IMPLIED,  INCLUDING BUT NOT LIMITED TO  THE WARRANTIES  OF MERCHANTABILITY, |<br />
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |<br />
| AUTHORS OR  COPYRIGHT  HOLDERS BE  LIABLE FOR  ANY CLAIM,  DAMAGES OR OTHER |<br />
| LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT, TORT OR  OTHERWISE,  ARISING |<br />
| FROM,  OUT OF OR  IN  CONNECTION  WITH  THE  SOFTWARE OR THE  USE OR  OTHER |<br />
| DEALINGS IN THE SOFTWARE.                                                   |<br />
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|<br />
|                         http://eae.net/license/mit                          |<br />
|-----------------------------------------------------------------------------|<br />
| Dependencies: canvas.js           - For initialization of canvas elements   |<br />
|-----------------------------------------------------------------------------|<br />
| 2005-12-27 | Work started.                                                  |<br />
| 2005-12-29 | First version posted.                                          |<br />
| 2006-01-03 | Fixed bug in moveTo and lineTo,  arguments where not converted |<br />
|            | to int which could cause IE to enter an endless loop. Disabled |<br />
|            | antalias for fillRect to better comply with the Mozilla, Opera |<br />
|            | and possibly  Safari  implementations where  using fillRect is |<br />
|            | about the only way to raw non antialiased lines.               |<br />
|-----------------------------------------------------------------------------|<br />
| Created 2005-12-27 | All changes are in the log above. | Updated 2006-01-03 |<br />
\----------------------------------------------------------------------------*/</p>

<public:component>
	<public:method name="getContext" />
	<public:attach event="oncontentready" onevent="initCanvas()"/>
</public:component>

<p><script language="JScript"></p>

<p>	function getContext() {<br />
		return element.context;<br />
	}</p>

<p>	function initCanvas() {<br />
		element.context = new IECanvasContext();<br />
		element.style.position = 'relative';<br />
		element.style.display  = 'block';<br />
		element.style.overflow = 'hidden';<br />
	}</p>

<p></p>

<p>	function IECanvasContext() {<br />
		this.fillStyle = 'black';<br />
		this.globalAlpha = 1.0;<br />
		this.globalCompositeOperation = '';<br />
		this.lineCap = '';<br />
		this.lineJoin = '';<br />
		this.lineWidth = '0';<br />
		this.miterLimit = '';<br />
		this.shadowBlur = '';<br />
		this.shadowColor = '';<br />
		this.shadowOffsetX = '';<br />
		this.shadowOffsetY = '';<br />
		this.strokeStyle = 'black';<br />
		this._path = '';<br />
		this._stateStack = new Array();<br />
		this._offsetX = 0;<br />
		this._offsetY = 0;<br />
		this._rotation = 0;<br />
	};</p>

<p>	IECanvasContext.prototype.save = function() {<br />
		var o;</p>

<p>		o = new Object();<br />
		this._copyState(this, o);<br />
		this._stateStack.push(o);<br />
	};</p>

<p>	IECanvasContext.prototype.restore = function() {<br />
		var o, n;</p>

<p>		n = this._stateStack.length - 1;<br />
		if (n < 0) { return; }</p>

<p>		o = this._stateStack[n];<br />
		this._copyState(o, this);<br />
		this._stateStack.splice(n, 1);<br />
	};</p>

<p>	IECanvasContext.prototype._copyState = function(oFrom, oTo) {<br />
		oTo.fillStyle     = oFrom.fillStyle;<br />
		oTo.lineCap       = oFrom.lineCap;<br />
		oTo.lineJoin      = oFrom.lineJoin;<br />
		oTo.lineWidth     = oFrom.lineWidth;<br />
		oTo.miterLimit    = oFrom.miterLimit;<br />
		oTo.shadowBlur    = oFrom.shadowBlur;<br />
		oTo.shadowColor   = oFrom.shadowColor;<br />
		oTo.shadowOffsetX = oFrom.shadowOffsetX;<br />
		oTo.shadowOffsetY = oFrom.shadowOffsetY;<br />
		oTo._offsetX      = oFrom._offsetX;<br />
		oTo._offsetY      = oFrom._offsetY;<br />
		oTo._rotation     = oFrom._rotation;<br />
	};</p>

<p>	IECanvasContext.prototype.rotate = function(r) {<br />
		var MAX = Math.PI * 2;</p>

<p>		this._rotation += r;<br />
		while (this._rotation > MAX) { this._rotation = MAX - this._rotation; }<br />
	};</p>

<p>	IECanvasContext.prototype.scale = function() { };</p>

<p>	IECanvasContext.prototype.translate = function(x, y) {<br />
		this._offsetX += x;<br />
		this._offsetY += y;<br />
	};</p>

<p>	IECanvasContext.prototype.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {<br />
		if (this._path) { this._path += ' '; }</p>

<p>		this._path += 'qb' + cp1x + ',' + cp1y + ',' + cp2x + ',' + cp2y + ',' + x + ',' + y;<br />
	};</p>

<p><br />
	IECanvasContext.prototype.clip = function() { };</p>

<p>	IECanvasContext.prototype.beginPath = function() {<br />
		this._path = '';<br />
	};</p>

<p>	IECanvasContext.prototype.closePath = function() {<br />
		if (this._path) { this._path += ' '; }<br />
		this._path += 'x';<br />
	};</p>

<p>	IECanvasContext.prototype.lineTo = function(x, y) {<br />
		if (this._path) { this._path += ' '; }<br />
		this._path += 'l' + parseInt(x) + ',' + parseInt(y);<br />
	};</p>

<p>	IECanvasContext.prototype.moveTo = function(x, y) {<br />
		if (this._path) { this._path += ' '; }<br />
		this._path += 'm' + parseInt(x) + ',' + parseInt(y);<br />
	};</p>

<p>	IECanvasContext.prototype.stroke = function() {<br />
		var o, s, cosa, sina, cx, cy, x, y;</p>

<p>		if (!this._path) { return; }</p>

<p>		this._path += ' e';</p>

<p>		o = element.ownerDocument.createElement('v:shape');<br />
		o.fillColor = 'none';<br />
		o.filled = false;<br />
		o.strokeColor = this.strokeStyle;<br />
		o.stroked = true;<br />
		//o.weight = this.lineWidth;<br />
		o.coordsize = element.offsetWidth + ',' + element.offsetHeight;<br />
		o.style.position = 'absolute';<br />
		o.style.left = this._offsetX;<br />
		o.style.top = this._offsetY;<br />
		o.style.width = element.offsetWidth;<br />
		o.style.height = element.offsetHeight;<br />
		o.path = this._path;</p>

<p>		s = element.ownerDocument.createElement('v:stroke');<br />
		s.opacity = this.globalAlpha;<br />
		//Append<br />
		s.weight = this.lineWidth;<br />
		s.endcap="round";<br />
		o.appendChild(s);</p>

<p>		if (this._rotation) {<br />
			r = element.ownerDocument.createElement('v:group');<br />
			r.style.position = 'absolute';<br />
			r.style.left = 0;<br />
			r.style.top = 0;<br />
			r.style.width = element.offsetWidth;<br />
			r.style.height = element.offsetHeight;<br />
			r.coordsize = o.coordsize;<br />
			r.style.rotation = Math.round((this._rotation * 180) / Math.PI);<br />
			r.style.rotationCenter = '0,0';<br />
			r.appendChild(o);<br />
			element.appendChild(r);</p>

<p>			cosa = Math.cos(this._rotation);<br />
			sina = Math.sin(this._rotation);<br />
			cx = element.offsetWidth / 2;<br />
			cy = element.offsetHeight / 2;</p>

<p>			x = ( cx*(1-cosa) + cy*sina);<br />
			y = (-cx*sina     + cy*(1-cosa));</p>

<p>			r.style.left = x * -1;<br />
			r.style.top = y * -1;<br />
		}<br />
		else { element.appendChild(o); }<br />
	};</p>

<p>	IECanvasContext.prototype.fill = function() {<br />
		var o, f, r;</p>

<p>		if (!this._path) { return; }</p>

<p>		this._path += ' e';</p>

<p>		o = element.ownerDocument.createElement('v:shape');<br />
		o.fillColor = this.fillStyle;<br />
		o.strokeColor = this.strokeStyle;<br />
		o.stroked = false;<br />
		o.weight = this.lineWidth;<br />
		o.coordsize = element.offsetWidth + ',' + element.offsetHeight;<br />
		o.style.position = 'absolute';<br />
		o.style.left = this._offsetX;<br />
		o.style.top = this._offsetY;<br />
		o.style.width = element.offsetWidth;<br />
		o.style.height = element.offsetHeight;<br />
		o.path = this._path;</p>

<p>		f = element.ownerDocument.createElement('v:fill');<br />
		f.opacity = this.globalAlpha;<br />
		o.appendChild(f);</p>

<p>		if (this._rotation) {<br />
			r = element.ownerDocument.createElement('v:group');<br />
			r.style.position = 'absolute';<br />
			r.style.left = 0;<br />
			r.style.top = 0;<br />
			r.style.width = element.offsetWidth;<br />
			r.style.height = element.offsetHeight;<br />
			r.coordsize = o.coordsize;<br />
			r.style.rotation = Math.round((this._rotation * 180) / Math.PI);<br />
			r.style.rotationCenter = '0,0';<br />
			r.appendChild(o);<br />
			element.appendChild(r);</p>

<p>			cosa = Math.cos(this._rotation);<br />
			sina = Math.sin(this._rotation);<br />
			cx = (element.offsetWidth) / 2;<br />
			cy = (element.offsetHeight) / 2;<br />
			x = ( cx*(1-cosa) + cy*sina);<br />
			y = (-cx*sina     + cy*(1-cosa));</p>

<p>			r.style.left = x * -1;<br />
			r.style.top = y * -1;<br />
		}<br />
		else { element.appendChild(o); }<br />
	};</p>

<p>	IECanvasContext.prototype.arcTo = function(x1, y1, x2, y2, radius) {<br />
		// not implemented in gecko, not implemented here<br />
	};</p>

<p>	IECanvasContext.prototype.quadraticCurveTo = function(cpx, cpy, x, y) {<br />
		if (this._path) { this._path += ' '; }</p>

<p>		this._path += 'qb' + cpx + ',' + cpy + ',' + x + ',' + y;<br />
	};</p>

<p>	IECanvasContext.prototype.arc = function(x, y, radius, startAngle, endAngle, clockwise) {<br />
		var xi, yi, x1, y1, x2, y2, x3, y3, x4, y4;</p>

<p>		if (this._path) { this._path += ' '; }</p>

<p>		xi = parseFloat(x);<br />
		yi = parseFloat(y);</p>

<p>		x1 = xi - radius;<br />
		y1 = yi - radius;</p>

<p>		x2 = xi + radius;<br />
		y2 = yi + radius;</p>

<p>		x3 = xi + (Math.cos(startAngle) * radius);<br />
		y3 = yi + (Math.sin(startAngle) * radius);</p>

<p>		x4 = xi + (Math.cos(endAngle) * radius);<br />
		y4 = yi + (Math.sin(endAngle) * radius);</p>

<p>		x3 = Math.round(x3);<br />
		y3 = Math.round(y3);<br />
		x4 = Math.round(x4);<br />
		y4 = Math.round(y4);</p>

<p>		this._path += 'ar' + x1 + ',' + y1 + ',' + x2 + ',' + y2 + ',' + x3 + ',' + y3 + ',' + x4 + ',' + y4;<br />
	};</p>

<p><br />
	IECanvasContext.prototype.rect = function(x, y, w, h) {<br />
		var x1, y1, x2, y2;</p>

<p>		x2 = x + w;<br />
		y2 = y + h;</p>

<p>		x1 = Math.round(x);<br />
		y1 = Math.round(y);<br />
		x2 = Math.round(x2);<br />
		y2 = Math.round(y2);</p>

<p>		this._path += 'm' + x1 + ',' + y1;<br />
		this._path += ' l' + x2 + ',' + y1;<br />
		this._path += ' l' + x2 + ',' + y2;<br />
		this._path += ' l' + x1 + ',' + y2;<br />
		this._path += ' x'<br />
	};</p>

<p>	IECanvasContext.prototype.strokeRect = function(x, y, w, h) {<br />
		var o, s;</p>

<p>		o = element.ownerDocument.createElement('v:rect');<br />
		o.fillColor = 'none';<br />
		o.filled = false;<br />
		o.strokeColor = this.strokeStyle;<br />
		o.stroked = true;<br />
		o.weight = this.lineWidth;<br />
		o.style.position = 'absolute';<br />
		o.style.left = this._offsetX + x;<br />
		o.style.top = this._offsetY + y;<br />
		o.style.width = w;<br />
		o.style.height = h;</p>

<p>		s = element.ownerDocument.createElement('v:fill');<br />
		s.opacity = this.globalAlpha;<br />
		o.appendChild(s);</p>

<p>		element.appendChild(o);<br />
	};</p>

<p>	IECanvasContext.prototype.clearRect = function(x, y, w, h) { };</p>

<p><br />
	IECanvasContext.prototype.fillRect = function(x, y, w, h) {<br />
		var o, f;<br />
		<br />
		if ((x == 0) && (y == 0) && (w == element.offsetWidth) && (h == element.offsetHeight) && (this._offsetX == 0) && (this._offsetY == 0) && (this.globalAlpha == 1)) {<br />
			while (element.firstChild) { element.removeChild(element.lastChild); }<br />
		}</p>

<p>		o = element.ownerDocument.createElement('v:rect');<br />
		o.fillColor = this.fillStyle;<br />
		o.filled = true;<br />
		o.stroked = false;<br />
		o.weight = 0;<br />
		o.style.position = 'absolute';<br />
		o.style.left = this._offsetX + x;<br />
		o.style.top = this._offsetY + y;<br />
		o.style.width = w;<br />
		o.style.height = h;<br />
		o.style.antialias = 'false';</p>

<p>		f = element.ownerDocument.createElement('v:fill');<br />
		f.opacity = this.globalAlpha;<br />
		o.appendChild(f);</p>

<p>		element.appendChild(o);<br />
	};</p>

<p>	IECanvasContext.prototype.addColorStop = function() { };<br />
	IECanvasContext.prototype.createLinearGradient = function() { };<br />
	IECanvasContext.prototype.createPattern = function() { };<br />
	IECanvasContext.prototype.createRadialGradient = function() { };</p>

<p>	IECanvasContext.prototype.drawImage = function() { };<br />
	IECanvasContext.prototype.drawImageFromRect = function() { };</p>

<p></script><br />
</p>]]></description>
         <link>http://www.qrone.org/2006/04/iecanvashtc.html</link>
         <guid>http://www.qrone.org/2006/04/iecanvashtc.html</guid>
         <category></category>
         <pubDate>Wed, 26 Apr 2006 17:47:29 +0900</pubDate>
      </item>
            <item>
         <title>s3</title>
         <description><![CDATA[<p><html><br />
<head><br />
<script type="text/javascript" src="qrx/qrxml.js"></script>  <br />
<SCRIPT lang="JavaScript"><br />
var divTemp = null;</p>

<p>function init(){<br />
	var div = document.getElementById("outHTML");<br />
	divTemp = div.innerHTML;<br />
	div.innerHTML = "";<br />
	div.style.display = "";<br />
}</p>

<p>function upread(){<br />
	alert(document.frames("ifm").document.body.innerHTML);<br />
	// QrXML.loadXML(, null, onXmlLoad, onXmlError);<br />
}</p>

<p>function rread(){<br />
	redirectLoad(document.getElementById("rrssurl").value);<br />
}</p>

<p>function read(){<br />
	load(document.getElementById("rssurl").value);<br />
}</p>

<p>function redirectLoad(url){<br />
	QrXML.load("qrx/qr-redirector.php?url=" + url, null, onXmlLoad, onXmlError);<br />
}</p>

<p>function load(url){<br />
	QrXML.load(url, null, onXmlLoad, onXmlError);<br />
}</p>

<p>function onXmlLoad(doc, param){<br />
	var docEle = doc.documentElement;<br />
	var nodelist;<br />
	var i;<br />
	var out = "";</p>

<p>	var ele = findFirstChild(docEle, "channel");<br />
	if(ele != null){<br />
		nodelist = ele.childNodes;<br />
		for(i=0;i<nodelist.length;i++){<br />
			if(nodelist.item(i).nodeName == "item"){<br />
				out += renderItem(nodelist.item(i));<br />
			}<br />
		}<br />
	}</p>

<p>	nodelist = docEle.childNodes;<br />
	for(i=0;i<nodelist.length;i++){<br />
		if(nodelist.item(i).nodeName == "item"){<br />
			out += renderItem(nodelist.item(i));<br />
		}<br />
	}<br />
	document.getElementById("outHTML").innerHTML = out;<br />
}</p>

<p>function onXmlError(str, reason){<br />
	alert("load error");<br />
}</p>

<p>function renderItem(itemNode){<br />
	var rtitle = getTextContent(findFirstChild(itemNode, "title"));<br />
	var rdesc  = getTextContent(findFirstChild(itemNode, "description"));<br />
	var rlink  = getTextContent(findFirstChild(itemNode, "link"));</p>

<p>	rdesc = rdesc.replace(/<[^>]*>/g,"");<br />
	if(rdesc.length > 150){<br />
		rdesc = rdesc.substring(0,150) + "...";<br />
	}</p>

<p>	var rtext = divTemp;<br />
	rtext = rtext.replace(/\$title/g, rtitle);<br />
	rtext = rtext.replace(/\$description/g, rdesc);<br />
	rtext = rtext.replace(/\$link/g,  rlink);<br />
	return rtext; <br />
}</p>

<p>function getTextContent(node){<br />
	if(node == null) return "";<br />
	var nodelist = node.childNodes;<br />
	var i;<br />
	var text = "";<br />
	for(i=0;i<nodelist.length;i++){<br />
		if(nodelist.item(i).nodeName == "#text" ||<br />
		   nodelist.item(i).nodeName == "#cdata-section" ){<br />
			text += nodelist.item(i).nodeValue;<br />
		}<br />
	}<br />
	return text;<br />
}</p>

<p>function findFirstChild(node, name){<br />
	var nodelist = node.childNodes;<br />
	var i;<br />
	for(i=0;i<nodelist.length;i++){<br />
		if(nodelist.item(i).nodeName == name){<br />
			return nodelist.item(i);<br />
		}<br />
	}<br />
	return null;<br />
}</p>

<p>//--></SCRIPT><br />
<style></p>

<p></style><br />
</head><br />
<body onload="init();"></p>

<p><iframe width="500" height="50" frameborder="0" border="0" scrolling="no" src="index.xml" id="ifm"></iframe><input type="submit" value="Read Uploaded RSS" onclick="upread();"></p>

<div style="margin:10px;">
<input type="text" size="50" id="rrssurl" value="index.xml"><input type="submit" value="Redirect Read RSS" onclick="rread();">
</div>
<div style="margin:10px;">
<input type="text" size="50" id="rssurl" value="index.xml"><input type="submit" value="Read Local RSS" onclick="read();">
</div>

<div id="outHTML" style="display:none;">
<a href="$link">$title</a></br>
<div style="font-size:9pt;margin:5px;">$description</div>
<div style="font-size:9pt;margin:5px;color:green;">$link</div>
</br>
</div>

<p></body><br />
</html></p>]]></description>
         <link>http://www.qrone.org/2006/04/s3.html</link>
         <guid>http://www.qrone.org/2006/04/s3.html</guid>
         <category></category>
         <pubDate>Wed, 26 Apr 2006 17:04:17 +0900</pubDate>
      </item>
            <item>
         <title>s6</title>
         <description><![CDATA[<p><html><br />
<head><br />
<script type="text/javascript" src="qrx/qrxpcom.js"></script> <br />
<script type="text/javascript" src="qrx/qrcpicker.js"></script> <br />
<script type="text/javascript" src="iecanvas.js"></script><br />
<SCRIPT lang="JavaScript"></p>

<p>var prevPoint;<br />
var cPoint;<br />
var inited = false;<br />
var nowTool = "draw";<br />
var selectedColor = "#000000";<br />
var selectedBgColor = "#FFFFFF";</p>

<p>function init(){<br />
	if(!inited){<br />
		inited = true;<br />
		ieCanvasInit();<br />
		cPoint = QrXPCOM.getDivPoint(document.getElementById("test2"));<br />
	}<br />
}</p>

<p>function k_setcolor(color){<br />
	selectedColor = color;<br />
	document.getElementById("myRect").style.borderColor = selectedColor;<br />
}</p>

<p>function k_setbgcolor(color){<br />
	selectedBgColor = color;<br />
	document.getElementById("myRect").style.background = selectedBgColor;<br />
}</p>

<p>function k_move(e){<br />
	var p = QrXPCOM.getMousePoint(e);<br />
	if(p!=null){<br />
		if(nowTool == "draw" || nowTool == "erase"){<br />
			if(prevPoint && e.button % 2 == 1){<br />
				ctx.beginPath();<br />
				ctx.moveTo(prevPoint.x-cPoint.x,prevPoint.y-cPoint.y);<br />
				ctx.lineTo(p.x-cPoint.x, p.y-cPoint.y);<br />
				ctx.stroke();<br />
			}<br />
		}else if(started && nowTool == "rect"){<br />
			drawMyRect(p,false);<br />
		}<br />
		<br />
		prevPoint = p;<br />
	}<br />
}</p>

<p>var started = false;<br />
var startPoint;<br />
function k_down(e){</p>

<p>	if(nowTool == "rect"){<br />
		started = true;<br />
		var p = QrXPCOM.getMousePoint(e);<br />
		startPoint = p;<br />
		drawMyRect(p,false);</p>

<p>	}else{<br />
		<br />
		ctx = document.getElementById('test2').getContext('2d');<br />
		ctx.lineCap = "round";<br />
		if(nowTool == "erase"){<br />
			ctx.strokeStyle = selectedBgColor;<br />
			ctx.lineWidth = 15;<br />
		}else{<br />
			ctx.strokeStyle = selectedColor;<br />
			ctx.lineWidth = 1;<br />
		}<br />
	}<br />
}</p>

<p>function k_up(e){<br />
	if(started && nowTool == "rect"){<br />
		started = false;<br />
		QrXPCOM.setDivSize(document.getElementById("myRect"), 0,0);<br />
	<br />
		var p = QrXPCOM.getMousePoint(e);<br />
		drawMyRect(p,true);<br />
	}<br />
}</p>

<p>function k_out(e){<br />
	<br />
}</p>

<p>function k_clear(){<br />
	ctx = document.getElementById('test2').getContext('2d');<br />
	ctx.fillStyle = "#FFFFFF";<br />
	ctx.fillRect(0,0,500,250);<br />
}</p>

<p>function drawMyRect(p, real){<br />
	var div = document.getElementById("myRect");<br />
	<br />
	var top;<br />
	var left;<br />
	var w;<br />
	var h;<br />
	<br />
	if(startPoint.x < p.x){<br />
		left = startPoint.x;<br />
		w = p.x - startPoint.x;<br />
	}else{<br />
		left = p.x;<br />
		w = startPoint.x - p.x;<br />
	}<br />
	<br />
	if(startPoint.y < p.y){<br />
		top = startPoint.y;<br />
		h = p.y - startPoint.y;<br />
	}else{<br />
		top = p.y;<br />
		h = startPoint.y - p.y;<br />
	}<br />
	<br />
	if(real){<br />
		ctx = document.getElementById('test2').getContext('2d');<br />
		ctx.fillStyle = selectedBgColor;<br />
		ctx.fillRect(left-cPoint.x-1, top-cPoint.y-1, w, h);<br />
		ctx.strokeStyle = selectedColor;<br />
		ctx.strokeRect(left-cPoint.x-1, top-cPoint.y-1, w, h);<br />
		div.style.display = "none";<br />
	}else{</p>

<p>		if(startPoint.x > p.x || startPoint.y > p.y){<br />
			w++;<br />
			h++;<br />
		}<br />
		QrXPCOM.setDivPoint(div, left, top);<br />
		QrXPCOM.setDivSize(div, w, h);<br />
		if(div.style.display == "none")<br />
			div.style.display = "";<br />
	}<br />
}</p>

<p>function btnOver(tool){<br />
	if(nowTool != tool){<br />
		document.getElementById(tool).className = "btnOver";<br />
	}<br />
}</p>

<p>function btnOut(tool){<br />
	if(nowTool != tool){<br />
		document.getElementById(tool).className = "btnNormal";<br />
	}<br />
}</p>

<p>function btnDown(tool){<br />
	if(nowTool != tool){<br />
		document.getElementById(nowTool).className = "btnNormal";<br />
		document.getElementById(tool).className = "btnDown";<br />
		nowTool = tool;</p>

<p>	}<br />
}</p>

<p>function setIdClass(id,cls){<br />
	document.getElementById(id).className = cls;<br />
}</p>

<p>//--></SCRIPT><br />
<style></p>

<p>.btnNormal{<br />
	font-size:9pt;<br />
	padding:3px;<br />
	border: solid 1px #eee;<br />
	background-color:#eee;<br />
	cursor : default;<br />
}</p>

<p><br />
.btnDown{<br />
	font-size:9pt;<br />
	padding:3px;<br />
	border: inset 1px #eee;<br />
	background-color:#eee;<br />
	cursor : default;<br />
}</p>

<p>.btnOver{<br />
	font-size:9pt;<br />
	padding:3px;<br />
	border: outset 1px #eee;<br />
	background-color:#eee;<br />
	cursor : default;<br />
}</p>

<p><br />
</style><br />
</head><br />
<body onload="init();" topmargin="0" leftmargin="0"></p>

<p><br />
<div id="myRect" style="position:absolute;height:1px;width:1px;border:solid 1px black; </p>

<p>background-color:white;z-index:100;" <br />
onmouseup="k_up(event);" ></div><br />
<div id="myGrass" style="position:absolute;height:100%;width:100%;z-index:99;" <br />
onmousemove="k_move(event);" onmousedown="k_down(event);" onmouseup="k_up(event);" </p>

<p>onmouseout="k_out(event);"></div></p>

<div style="margin:10px;">
<div style="margin:4px;">

<table border="0"><tr>
<td>
<div class="btnDown" id="draw" 
onmouseover="btnOver('draw')"
onmouseout="btnOut('draw')"
onmousedown="btnDown('draw')"
>draw</div>
</td>

<p><td><br />
<div class="btnNormal" id="erase" <br />
onmouseover="btnOver('erase')"<br />
onmouseout="btnOut('erase');"<br />
onmousedown="btnDown('erase');"<br />
>Erase</div><br />
</td></p>

<p><td><br />
<div class="btnNormal" id="rect" <br />
onmouseover="btnOver('rect')"<br />
onmouseout="btnOut('rect');"<br />
onmousedown="btnDown('rect');"<br />
>Rect</div><br />
</td></p>

<p><br />
<td><br />
描画色：<br />
<script><br />
var cp = new QrColorPicker("#000000");<br />
cp.onChange = function(color){<br />
	k_setcolor(color);<br />
}<br />
cp.render();<br />
</script><br />
</td></p>

<p><td><br />
背景色：<br />
<script><br />
var cp = new QrColorPicker("#FFFFFF");<br />
cp.onChange = function(color){<br />
	k_setbgcolor(color);<br />
}<br />
cp.render();<br />
</script><br />
</td><br />
<td><br />
<div class="btnNormal" id="clr"<br />
onmouseover="setIdClass('clr','btnOver');"<br />
onmouseout="setIdClass('clr','btnNormal')";<br />
onmousedown="setIdClass('clr','btnDown');"<br />
onmouseup="setIdClass('clr','btnNormal');"<br />
onclick="k_clear();"<br />
>Clear</div><br />
</td></p>

<p></tr></table></p>

</div>

<p><br />
<div style="width:500px;height:250px;z-index:-1;border:solid 1px black;" ><br />
<canvas id="test2" width="500" height="250"></canvas><br />
</div></p>

</div>
</body>
</html>]]></description>
         <link>http://www.qrone.org/2006/04/s6.html</link>
         <guid>http://www.qrone.org/2006/04/s6.html</guid>
         <category></category>
         <pubDate>Wed, 26 Apr 2006 13:44:31 +0900</pubDate>
      </item>
            <item>
         <title>SWT からのドラッグをウインドウを非アクティブのままやる</title>
         <description><![CDATA[<div class="QrONEWiki"> いわゆる Java ですが、今のところ VM の関係上なかなかクライアントサイドでは開発者向けのソフトとか専門家向けのソフト以外は作られていないような感じですね。　専門家向きだと、 Eclipse SWT + Java ということになるわけなんですが・・・<br/> <br/> SWT を使っていると思うのが、もっと Win32 API のコアな部分に触れるのも面白いんじゃね？　というそういう話しだったりします。今回やってみるのはシェルをちょっといじってウインドウをドラッグするときに背面のままでいけるようにならないっすか？　っていうやつ。<br/> <br/> <img src="http://www.qrone.org/main/uploads/drag.png" style="margin:3px;" border="0" align="center"<br/> <br/> <br/> こんな感じで、裏側の青くなってるやつから表のウインドウにドラッグするときに裏側のウインドウが、正面に来ないようになるっていうやつです。今 Java でファイラーを作ってるわけですが、それが上の画像です。もうちょっとうまく動くようになったらこれも公開したいですね。<br/> <br/>  <div class="QrDesignSkin"> <div class="normal" style="margin:10px;width:100%;"><div class="layerA"><div class="layerB"><div class="layerC"><div class="layerD"><div class="layerE"><div class="layerF"><div class="layerG"><div class="layerH"><div class="layerI"><div class="layerJ" align="left"> <pre><tt><span class="preproc">package</span><span class="normal"> org</span><span class="symbol">.</span><span class="normal">eclipse</span><span class="symbol">.</span><span class="normal">swt</span><span class="symbol">.</span><span class="normal">widgets</span><span class="symbol">;</span><br/> <br/><span class="preproc">import</span><span class="normal"> org</span><span class="symbol">.</span><span class="normal">eclipse</span><span class="symbol">.</span><span class="normal">swt</span><span class="symbol">.</span><span class="normal">internal</span><span class="symbol">.</span><span class="normal">win32</span><span class="symbol">.</span><span class="normal">LRESULT</span><span class="symbol">;</span><br/><span class="preproc">import</span><span class="normal"> org</span><span class="symbol">.</span><span class="normal">eclipse</span><span class="symbol">.</span><span class="normal">swt</span><span class="symbol">.</span><span class="normal">internal</span><span class="symbol">.</span><span class="normal">win32</span><span class="symbol">.</span><span class="normal">OS</span><span class="symbol">;</span><br/> <br/><span class="keyword">public</span><span class="normal"> </span><span class="keyword">class</span><span class="normal"> ShellEx </span><span class="keyword">extends</span><span class="normal"> Shell</span><span class="cbracket">{</span><br/><span class="normal">	</span><span class="keyword">public</span><span class="normal"> </span><span class="function">ShellEx</span><span class="symbol">(</span><span class="normal">Display display</span><span class="symbol">,</span><span class="normal"> </span><span class="type">int</span><span class="normal"> style</span><span class="symbol">)</span><span class="cbracket">{</span><br/><span class="normal">		</span><span class="keyword">super</span><span class="symbol">(</span><span class="normal">display</span><span class="symbol">,</span><span class="normal">style</span><span class="symbol">);</span><br/><span class="normal">	</span><span class="cbracket">}</span><br/><span class="normal">	</span><br/><span class="normal">	LRESULT </span><span class="function">WM_MOUSEACTIVATE </span><span class="symbol">(</span><span class="type">int</span><span class="normal"> wParam</span><span class="symbol">,</span><span class="normal"> </span><span class="type">int</span><span class="normal"> lParam</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span><br/><span class="normal">		</span><span class="keyword">return</span><span class="normal"> </span><span class="keyword">new</span><span class="normal"> </span><span class="function">LRESULT </span><span class="symbol">(</span><span class="normal">OS</span><span class="symbol">.</span><span class="normal">MA_NOACTIVATE</span><span class="symbol">);</span><br/><span class="normal">	</span><span class="cbracket">}</span><br/><span class="cbracket">}</span></tt></pre </div></div></div></div></div></div></div></div></div></div></div></div> <br/> JNI を使わないでも出来てしまうのが SWT の凄いところですが、Windows でしか動かなくなってしまいますが上のようなコードを書くと一発です。少々変な挙動をするかもしれないので、もう少ししっかり修正すべきなんでしょうがとりあえずこうやると、マウスダウンだけでは正面に来なくなります。<br/> <br/> 使い方は、 new Shell() とかやってるところを new ShellEx() にするだけですね。ちなみにパッケージ見て貰えればわかりますが、org.eclipse.swt.widgets 内に追加しないとうまく動きません、まぁ、swt.jar をいじれとかそういうわけじゃなくてそこにあるように作ればいいだけですけどね。<br/>  <h4>Win32 関数の在処</h4> org.eclipse.swt.internal.win32.OS<br/> <br/> ここに、大体 SWT 内で使われている全 Win32 API や、定数とかが用意されています。ドキュメントには載っていないのでソースコードをひっぱってくるといいと思います。<br/> <br/> で・・・<br/> <br/> org.eclipse.swt.internal.win32.LRESULT<br/> <br/> 同じ階層にはこんな感じで、構造体が一つ一つクラスになっています。簡単ですね。同じような感じで win32.OS クラスをどんどん拡張してやればどんな派手なことでもカスタマイズド SWT でやれることになりますね。デバッグまで Java 側でできるというすばらしさです。</div>   <!-- QrONEParserSource // ZIP compressed data of the source text. Base64:eNqNVltPG0cUfmZ/xShPoFa21L41JBJqeUgUQlRIeIiiaItXjltjXNvUiapIO7PGxKypAwQISQiQOLYJjTG5tBAg/jHjNfZT/0LPObNrr0UviSwzzp491+/7zkiekaIgRVYKm13Wf9GZ5GXJ1yXPS5M3juYlr0pekXxZigV2YwQeV9urLxp10TiAZ68lt91vsSetHSmKUryQ1jtpPZDiA/60cuRxr71qn65/bJmzzsNFyRfRrziR1gpaYgDbqYn2qulU/zhr0Dh65RRXwUnj5JkUOSnykpckpI6hoQDwkIVzM7Mp+WOvgDfSFNI0e90uSL6F4UzOhiejkXjSYGMT4+wLr/YKec1ivXjexQjCxhZhRnBe7vbHOlIfTUMXUiw1TuqSv3RTg7d4pWlukLeq6qcUggwqbCIS+/orNnTtEqM632HX+Ou2VXEegPluq1zCItEHPBXtjRen6yfkdRkrFBaU99fxJpTnS1mFwnNrZ1/yNSoVom1KMU8/P2HipoCpOk+fS5Hxkq27gfieFH9KUZbWLlQj+bYUcypfcvvYtRclmus7HC2el/AAs7csKWoYgkqnXu+2rDwkT84/0adMrhapqWpsqsc5d5YYArpre9V57QRLTLgI+WvazZuRqXD/nVQq/k0wmE6nAz8npmNGYDoRDk7pkVhwJh6d1kPJYCihhwPxWHjg1i1N0wjEyz04MXnrZcHh7xHVG1BxgbJQVdpuQMR2rrVdoVH0lg65/0fpnuczbyEUmm9eUmN2mxuvemHsYe5s6Qp5NMAuV4EgYpv8QxrHhMJnvhIUcLuURpggffLE3+rpoyPHKnQ8E0CzvZPP0twKjr2C/fEn6YIrR40FtApn9negOWFtkzLvMhH6PxgykpFw7OLg5HTIYFE9Fr5wDss4d1GL65M/6WGDwQQDhuJlIJlOBdKRUNhIJc9rWmQqPp1InTGIxFJGIqZHwRIIFbjy/fDY9Svj5z/TfHQMPMdnfohGJtlkVE8m2dgdIxodvsuMuykjFnJ//6r1uUbu4/7vIsl4VL/HQurvlwwcs2TqXtQYAOO+5EzcSPR7D9X/n9f67mt9Wp+bIpsYuT0yen1seOjb8Us3hsaHWT/6SF/TE/qU8hel8wBDjwkjNZOIsZiRZp6D/tGxwMjQ7aujngcV4r42GMQGXxwMuv2G1l++eskTKFHwmFbGic19JACWPIFwxYpUEY7OXIZs3Q3gRxJIWGg6nVQLYw0FHBGi1oGPR67fjCs/HvA6oo3iB7hFaiw1nx7Qu5XGgQnLogNLp7YoYXEUUSSa+XUMhPqk6GYTaNcI1aqwqqK2AjO+izmsUT5gPN+oV4F9lMwhUbUj62sE+yzWBxWjaoIHyPMJ7QOioSI4OLeeE68PpWXiAdiNcqu4tneG3dQQdOhqsKbRssg0Vw9RdmEd4WgJXv0Dag/ZXYV2VYUmIJa6poBENN71WrHlIzutPyAyRq+TUi2STO2TShy0SmBfar2tYYHYuhohw+4mSUP+F0IyJzuLElc/cea3qLevPZj45WKBzk+xvag8cOZwQD8/6glGM6S9IvJuxb4d5kmX2naqhSUyWKaKhX+F0L2AiuAKr/5OwGHHE6EL8E/tXrjFNFdqCPFnFWeupGn/qxVqg6jwJneK5cbJMvGEmlF2ydW5mwjbme1Z9DBOeK36hMKqcvOnjyrNDFS24rvTuBAhSryR1itpbbs3Kqx7r3Wc8+0GH+LxtnSMiPQxSvK3ZLzvvVLwwOTymm4oGR8uaad0bjafp7ea5jyE9B+3n/zm7BdVmv+4bZtlu21uQd9IB2C9F9W3d3s89G2Wnmac1radhZ6rnYp49u7HvHGxrlPsww5lg99Ne9s5/kCoLRGlFXB23HTff2rmlIqpOyDKpBS75KdOtId0P0J7XY0suz6wr/5bY4dHxERrTloPvXsC3oPUBqcbQpk+C77JZOnFGu3WNUSHp4R/A8le5CE= --> ]]></description>
         <link>http://www.qrone.org/2006/03/swt.html</link>
         <guid>http://www.qrone.org/2006/03/swt.html</guid>
         <category></category>
         <pubDate>Thu, 23 Mar 2006 16:46:46 +0900</pubDate>
      </item>
            <item>
         <title>Winny の技術はスゴイのか</title>
         <description><![CDATA[<div class="QrONEWiki"> P2P 系のソフトで世界的にも最優秀だと思われる Winny<br/> <br/> 現在裁判係争中ですが、日本のインターネット創始者であり IPv6 の父である村井純はどうやら肯定派ということらしく弁護に回ったようです。まぁ、当然と言うところでしょうか。<br/> <br/>  <h4>Winny開発者の裁判に村井教授が証人として出廷、検察側の主張に異議</h4> by INTERNET WATCH<br/> <a href="http://internet.watch.impress.co.jp/cda/news/2006/02/16/10925.html">http://internet.watch.impress.co.jp/cda/news/2006/02/16/10925.html</a><br/> <div  style="float:right"> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=qroneorg-22&o=9&p=8&l=as1&asins=4756145485&fc1=000000&IS2=1&lt1=_blank&lc1=0000ff&bc1=000000&bg1=ffffff&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe> </div><br/> <br/> 右に Winny 関連書籍の "Winny の技術" っていう本を紹介してあるんですが、なんていうかファイル共有のやり方ではなくて、Winny の技術的側面からみた分析です。まぁ、ソフト的には賛否両論あるんでしょうが、技術者としてこの技術を知らないのは基本的に話しになりません。<br/> <br/> 海外では P2P 系のこの Winny 技術のことを BitTorrent というわけですが、大量にアクセスの集中するダウンロードファイルなんかを P2P で配布すればアクセスが滞らないジャン　というわけで、将来的にはヤフーなんかの固定系のページもこうやって配布されるようになるかもしれませんね。<br/> <br/>  <h4>OperaとFirefox、それぞれBitTorrentをサポートへ</h4> by CNET Japan<br/> <a href="http://japan.cnet.com/news/media/story/0,2000047715,20085161,00.htm">http://japan.cnet.com/news/media/story/0,2000047715,20085161,00.htm</a><br/> <br/> もちろんこちらは著作権には留意した仕様・・・というより、ネット上に普通に公開されているものぐらいしか交換できないはずですし多分検索機能もないと思われます。あくまでファイル交換ではなくてファイルダウンロードの最適化という面だけで考えているのでしょう。<br/> <br/> 技術的には、ＰＣ同士を網の目のように接続していくわけですが、同じような系統のファイルを持っている人や求めている人同士が近くなるように接続し直していくという仕組みですね。ファイルを転送するときは直結ですがファイルを検索するときは自分に繋がっているノードに検索を依頼してそのノードも更にそのノードに繋がっているノードに検索を依頼していくというものです。<br/> <br/> 繋がっている全ノードではなく親ノードだけに転送しているそうで、以外と不思議な構造ですね。どのファイルがどのＰＣにあるかという情報はどんどん溜めていくそうです。ファイル自体も細切れにして転送しますしよく考えられてはいますが・・・<br/> <br/> </div>   <!-- QrONEParserSource // ZIP compressed data of the source text. Base64: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 --> ]]></description>
         <link>http://www.qrone.org/2006/02/winny.html</link>
         <guid>http://www.qrone.org/2006/02/winny.html</guid>
         <category></category>
         <pubDate>Fri, 17 Feb 2006 12:03:01 +0900</pubDate>
      </item>
            <item>
         <title>Ruby on Rails</title>
         <description><![CDATA[<div class="QrONEWiki"> 最近のウェブ開発の流行というと、Ajax / Flash FAMES 系統のリッチクライアント技術なわけですがそれにも多少関係して <a href="http://www.rubyonrails.org/">Ruby on Rails</a> というのが注目を集めています、2005/12 に Ver1.0 が出ているのでまだ執筆時点ではまだそれほど遅れを取っていません。<br/> <br/> <img src="http://www.qrone.org/main/15minutes.gif" style="margin:3px;" border="0" align="center"<br/> <br/> <a href="http://media.rubyonrails.org/video/rails_take2_with_sound.mov">Ruby on Rails - １５分でブログが出来るスクリーンキャスト (English)</a><br/> <br/> 英語ですがこんなの。<br/> 真面目に、それなりに動くブログが１５分程度で作れています。<br/> <br/> 現状のウェブ開発で重要なのは、安定性、次に開発効率、そして最後に実行速度といったところでしょうか。安定して動作しないのは論外として実行速度だけなら多分 C++ CGI とかで作ればいいわけなんですけど、現状スクリプトの実行速度で困ることは（大規模開発でも）滅多にありません。<br/> <br/> そこで、開発効率、なわけですが、これが重要。 Java Servlet と php だと体感でも製作時間に４倍ぐらいの時間の差があると思います。もちろん、php が圧倒的に早いです。実際に出来るものが同じだとするならば php でやれば４倍作れるわけで・・・、単純計算で 75% も再利用できない限り Java 有利にはならず、Java で以前作ったのを苦労して再利用するよりは php で同じのを作り直す方が早い計算です。<br/> <br/> これが、Ruby on Rails だと超加速をするというわけですね、一応このデモを見た限りでは慣れてさえしまえば、php の更に数倍の速度です。この速度なら顧客と話をしながら要求を仕様書にまとめる時間で、その場で完成品を納品して帰ってこれます。<br/> <br/> php で最も時間がかかるのは実はスクリプト部分よりもデータベースクエリ製作と HTML の記述。その両方をほぼ全て全自動で Rails が作ってくれます。問題があるとすれば言語が Ruby だっつーことでせっかく今まで C++ Perl Java php と覚えてきたのに Ruby を更に覚えないといけないですね。<br/> <hr size="10" width="10" style="margin:20px;"> 要は プログラムのクラスと DB が一対一対応しているわけですが、以前の OR マッピング系統のシステムとは違い DBMS 側のテーブルを見てそれに反応してフレームワーク側が自動的に、各テーブルごとに配列と対応させてくれて、更に追加削除変更のフォームを作ってくれます。<br/> <br/> ここで面白いのが Rails は、フォームを自動生成するわけではなく、そもそも各テーブルは追加削除変更を必ずするものという前提で、その機能がすでについています。なんとそれに加えて、特定の項目が未記入を許さない場合の、未記入で投稿されたときのエラーやエラー場所のハイライトまでやってくれます。投稿完了時には投稿しましたメッセージも出ます。<br/> <br/> 　MySQL のテーブルを一つ作る<br/> 　→この時点でテーブルの追加削除変更ができる状態でデプロイされる<br/> 　→挙動の変更が必要な部分について改良を加える<br/> <br/> 　MySQL のテーブルを追加する<br/> 　→どのテーブルとどのキーで結ばれるのか等をプログラムで指定する<br/> 　→この時点で配列のデータ行から結ばれたテーブルのデータ行が参照できるようになる<br/> 　→元のテーブルから参照先テーブルの行を追加するフォームなどを作る<br/> <br/> こういう流れでしょうか。<br/> <br/> まず、RDB のテーブルを作り、それに対する基本的な処理が自動的に作られるというのが基本的な Rails の仕組み。その処理を改良したりテーブル間の基本的な結合方法などをプログラムで指定して、例えばブログなら、エントリーがコメントを複数持つ (has_many) みたいなそんなシンボルを割り当てるというそう言う流れです。<br/> <br/> シンボルをたくさん暗記する必要がありますが、確かに効率的です。プログラムの基本的に書かなければいけない構造を全てシンボルにしてまとめ、各クラスにシンボルを設定しまくるだけで動作するということでしょう。あとは全部フレームワークが処理をするというそういうことになりますね。<br/> <br/> 綺麗な見た目とか細かい挙動を指定するのはこのフレームワークの目指すところではないと言うことでデザインを要求されない業務用に向いています。<br/> <br/> うーんこれを、Java で実現するならアノテーションでしょうか。</div>   <!-- QrONEParserSource // ZIP compressed data of the source text. Base64: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 --> ]]></description>
         <link>http://www.qrone.org/2006/02/ruby_on_rails.html</link>
         <guid>http://www.qrone.org/2006/02/ruby_on_rails.html</guid>
         <category></category>
         <pubDate>Fri, 03 Feb 2006 13:25:10 +0900</pubDate>
      </item>
      
   </channel>
</rss>
