tag:blogger.com,1999:blog-6230373881726822252008-07-26T23:56:03.874+08:00Racklin's 阿土伯程式大觀園Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comBlogger85125tag:blogger.com,1999:blog-623037388172682225.post-89596615693221468862008-07-04T00:33:00.009+08:002008-07-08T09:41:28.438+08:00Threading in Firefox 3<div xmlns='http://www.w3.org/1999/xhtml'>Firefox 3 (Gecko 1.9) 新增了許多特色 (<a href='http://developer.mozilla.org/en/docs/Firefox_3_for_developers#New_developer_features_in_Firefox_3' target='_blank'>詳見</a> ), 其中一項重要的特色, 便是導入了 Thread Manager 機制.<br /><br />##CONTINUE##<br /><br />在 Firefox 3 以前, 我們要讓 Javascript 程式在背景執行, 最簡單的方式便是利用 setTimeout / setInterval 方式:<br /><br /><pre><code><br />function backgroundTask() {<br /> // Perform a small amount of work<br /> <br /> window.setTimeout(arguments.callee, 100);<br /> }<br /> <br /> window.setTimeout(backgroundTask, 100);<br /></code></pre><br />以上的方式雖然可以把程式丟到背景執行, 然而, 它依然只是在主執行緒(mainThread)中, 以非同步的方式執行.<br /><br />Firefox 3 後, 導入了 Thread Manager , 讓我們可以撰寫平台相關的真正多執行緒程式. <br /><br />要實作多執行緒 Javascript 程式,本身必須是 XPCOM Object, 且實作 nsIRunnable 介面(和 Java Thread 很像不是嗎?).<br />詳細範例可參考 <a target='_blank' href='http://developer.mozilla.org/en/docs/The_Thread_Manager'>Thread Manager </a> 和 <a target='_blank' href='http://developer.mozilla.org/en/docs/nsIThreadManager'>nsIThreadManager</a> .<br /><br /><b>Thread Utils:</b><br />雖然 Firefox 3 已經大大簡化了多執行緒程式的寫作方式(且很有 Java 風格), 但就 Javascript 來說, 就顯的有些麻煩, 我們要為每一個要執行的程式, 一一實作成 XPCOM Object 也是一件很煩人的事..<br />阿土伯在 GREUtils Rewriting 計劃中, 為 Threading 做了一些封裝, 讓您可以比較容易且直覺的使用 Firefox 3 所帶來的 Multi-Threading 這份大禮.<br /><br />有關 Thread 部份的 Code 如下, 已修改過可以獨立運作於 GREUtils 整個專案之外:<br /><pre><code><br />/**<br /> * Thread - is simple and easy use Thread Manager APIs libraries for GRE (Gecko Runtime Environment).<br /> * ONLY Work with Firefox 3 or XULRunner 1.9<br /> * <br /> * @public <br /> * @name GREUtils.Thread<br /> * @namespace GREUtils.Thread <br /> */<br />var GREUtils = GREUtils || {};<br /><br />GREUtils.Thread = {<br /> <br /> _threadManager: Components.classes["@mozilla.org/thread-manager;1"]<br /> .getService(Components.interfaces.nsIThreadManager),<br /> <br /> _mainThread: null,<br /> <br /> _workerThread: null,<br /> <br /> reportError: function(err){<br /> Components.utils.reportError(err);<br /> }<br />};<br /><br /><br />/**<br /> * getThreadManager <br /> * <br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThreadManager <br /> */<br />GREUtils.Thread.getThreadManager = function(){<br /> return this._threadManager;<br />};<br /><br /><br />/**<br /> * getMainThread<br /> *<br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThread main thread <br /> */<br />GREUtils.Thread.getMainThread = function(){<br /> if (this._mainThread == null) {<br /> this._mainThread = GREUtils.Thread.getThreadManager().mainThread;<br /> <br /> // extends magical method to worker thread<br /> // this._workerThread.dispatchMainThread = GREUtils.Thread.dispatchMainThread;<br /> }<br /> return this._mainThread;<br />};<br /><br /><br />/**<br /> * dispatchMainThread<br /> *<br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThreadManager <br /> * @param {Object} aRunnable<br /> * @param {Object} aType<br /> */<br />GREUtils.Thread.dispatchMainThread = function(aRunnable, aType) {<br /> var mainThread = GREUtils.Thread.getMainThread();<br /> var aType = aType || mainThread.DISPATCH_NORMAL;<br /> try {<br /> mainThread.dispatch(aRunnable, aType);<br /> }catch (err) {<br /> GREUtils.Thread.reportError(err);<br /> }<br />};<br /><br /><br />/**<br /> * dispatchWorkerThread<br /> * <br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThreadManager <br /> * @param {Object} workerThread<br /> * @param {Object} aRunnable<br /> * @param {Object} aType<br /> */<br />GREUtils.Thread.dispatchWorkerThread = function(workerThread, aRunnable, aType) {<br /> var aType = aType || workerThread.DISPATCH_NORMAL;<br /> try {<br /> workerThread.dispatch(aRunnable, aType);<br /> }catch (err) {<br /> GREUtils.Thread.reportError(err);<br /> }<br />};<br /><br />/**<br /> * getWorkerThread in pool<br /> * <br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThread worker thread <br /> */<br />GREUtils.Thread.getWorkerThread = function(){<br /> // get presist work thread <br /> // will not create new worker thread<br /> if (this._workerThread == null) {<br /> this._workerThread = GREUtils.Thread.getThreadManager().newThread(0);<br /> <br /> // extends magical method to worker thread<br /> // this._workerThread.dispatchMainThread = GREUtils.Thread.dispatchMainThread;<br /> }<br /> return this._workerThread;<br />};<br /><br /><br />/**<br /> * createWorkerThread - create new worker thread.<br /> * <br /> * @public<br /> * @static<br /> * @function <br /> * @return {Object} nsIThread worker thread <br /> */<br />GREUtils.Thread.createWorkerThread = function(){<br /> // create new worker thread<br /> var worker = GREUtils.Thread.getThreadManager().newThread(0);<br /> <br /> // extends magical method to worker thread<br /> //worker.dispatchMainThread = GREUtils.Thread.dispatchMainThread;<br /> <br /> return worker;<br />};<br /><br /><br />/**<br /> * CallbackRunnableAdapter<br /> *<br /> * @public<br /> * @class <br /> * @param {Object} func<br /> * @param {Object} data<br /> */<br />GREUtils.Thread.CallbackRunnableAdapter = function(func, data) {<br /> this._func = func;<br /> this._data = data;<br />};<br /><br />GREUtils.Thread.CallbackRunnableAdapter.prototype = {<br /><br /> get func() {<br /> return this._func;<br /> },<br /> <br /> set func(func){<br /> this._func = func || null;<br /> },<br /><br /> get data() {<br /> return this._data;<br /> },<br /> <br /> set data(data){<br /> this._data = data || null;<br /> },<br /><br /> run: function() {<br /> try {<br /> if (this.func) {<br /> if(this.data) this.func(this.data);<br /> else this.func();<br /> }<br /> } catch (err) {<br /> Components.utils.reportError(err);<br /> }<br /> },<br /> <br /> QueryInterface: function(iid) {<br /> if (iid.equals(Components.Interfaces.nsIRunnable) || iid.equals(Components.Interfaces.nsISupports)) {<br /> return this;<br /> }<br /> throw Components.results.NS_ERROR_NO_INTERFACE;<br /> }<br />};<br /><br /><br />/**<br /> * WorkerRunnableAdapter<br /> *<br /> * @public<br /> * @class<br /> * @param {Object} func<br /> * @param {Object} callback<br /> * @param {Object} data<br /> */<br />GREUtils.Thread.WorkerRunnableAdapter = function(func, callback, data) {<br /> this._func = func;<br /> this._callback = callback;<br /> this._data = data;<br /><br /> if(arguments.length == 2 ) {<br /> this._data = callback;<br /> this._callback = null; <br /> }<br />};<br /><br />GREUtils.Thread.WorkerRunnableAdapter.prototype = {<br /><br /> get func() {<br /> return this._func;<br /> },<br /> <br /> set func(func){<br /> this._func = func || null;<br /> },<br /><br /> get callback() {<br /> return this._callback;<br /> },<br /> <br /> set callback(callback){<br /> this._callback = callback || null;<br /> },<br /><br /> get data() {<br /> return this._data;<br /> },<br /> <br /> set data(data){<br /> this._data = data || null;<br /> },<br /><br /> run: function() {<br /> try {<br /> var result = null;<br /> if (this.func) {<br /> if(this.data) result = this.func(this.data);<br /> else result = this.func();<br /> }<br /> <br /> if (this.callback) {<br /> GREUtils.Thread.dispatchMainThread(new GREUtils.Thread.CallbackRunnableAdapter(this.callback, result));<br /> } <br /> } catch (err) {<br /> Components.utils.reportError(err);<br /> }<br /><br /> },<br /> <br /> QueryInterface: function(iid) {<br /> if (iid.equals(Components.Interfaces.nsIRunnable) || iid.equals(Components.Interfaces.nsISupports)) {<br /> return this;<br /> }<br /> throw Components.results.NS_ERROR_NO_INTERFACE;<br /> }<br />};<br /><br /><br />/**<br /> * createWorkerThreadAdapter<br /> *<br /> * @public<br /> * @static<br /> * @function<br /> * @param {Object} workerFunc<br /> * @param {Object} callbackFunc<br /> * @param {Object} data<br /> */<br />GREUtils.Thread.createWorkerThreadAdapter = function(workerFunc, callbackFunc, data) {<br /><br /> return new GREUtils.Thread.WorkerRunnableAdapter(workerFunc, callbackFunc, data); <br />};<br /></code></pre><br /><br />使用方式:<br />利用 GREUtils.Thread.getMainThread() 可以取得主執行緒.<br />利用 GREUtils.Thread.createWorkerThread() 產生一個新的執行緒.<br /><br />WorkerThreadAdapter:<br />則是用以簡化自行撰寫 worker / callback 二個 XPCOM Object, 取而代之的是二個 Function handle 以及要傳入 worker thread 的資料.<br /><br /><pre><code><br />var worker = GREUtils.Thread.createWorkerThread();<br />var execute = GREUtils.Thread.createWorkerThreadAdapter(<br /> /* worker function */<br /> function(data) {<br /> var result = 0;<br /> var i = 0;<br /> <br /> while(i <= data) { <br /> result += i;<br /> i++;<br /> }<br /> return result;<br /> },<br /> /* callback function */<br /> function(result) {<br /> alert('sum = ' + result);<br /> },<br /> /* data to worker function */<br /> 10000<br />);<br /><br />GREUtils.Thread.dispatchWorkerThread(worker, execute);<br /></code></pre><br /><br /><br /><b>註1:</b><br />Firefox3 的 Thread 由於是以 XPCOM 實作, 所以您只能用於 extension addons 寫作或是 XULRunner 專案中, 如果您需要在一般 Web Application 中使用多執行緒, 可以參考 <a href="http://code.google.com/apis/gears/">Google Gears</a> 的 WorkerPool 實作.<br /><br /><b>註2:</b><br />請特別注意 The Thread Manager 那篇的這句重要的警告.<br /><span style="font-style:italic; color:red">Note: The DOM is not thread safe. You must not access the DOM or user interface from background threads. Doing so will likely crash.</span><br />其中要再注意的是, alert() 也是 DOM global scope 哦, 如果您在 background threads 用了 alert(), Firefox 3 也是會當給你看地.<br /><br /><br />忙裡偷閒寫下本篇, 內容有點雜亂簡單, 但還是希望對大家有幫助.<br /></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-17416946603716027152008-05-20T05:35:00.006+08:002008-05-21T11:57:00.027+08:002國中生毆童 踹肚打到見血<div xmlns='http://www.w3.org/1999/xhtml'><div style=''>今天在 udn 聯合新聞網看到了一則讓我很生氣, 也難過很久的新聞..<br/>"<a href='http://udn.com/NEWS/SOCIETY/SOC1/4346636.shtml' target='_blank'>2國中生毆童 踹肚打到見血</a>" 無法想像的是二名國三生, 怎麼可以忍心對一個 7 歲的幼童下此重手.<br/>由於該生事後已關閉部落格, 巡著 udn 的留言, 有人將影片放了出來, 我流淚了(阿土伯的小土仔目前1歲半)..<br/><br/>聽到那男童淒厲哭喊, 而二名國三生居然嘻嘻哈哈的繼續打他... <br />##CONTINUE##<br /><br/><a href='http://pic.wretch.cc/icon/flvplayer.swf?autoStart=true&amp;file=http://p.yimg.com/wretch.yimg.com/ycs_888/804/d/dk3hiphop/2/1957213317.flv' target='_blank'><br/>"影片"</a> <a href="http://video.google.com/videoplay?docid=8470757766379425531" target="_blank">"影片備份"</a> 請三思再點來看... 會讓人整個人火氣大一天.<br/><br/>其中之一已道歉了 http://www.wretch.cc/blog/dk3hiphop <br/>抓圖如下:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/SDHzNBD8LFI/AAAAAAAAALk/NmO2A58QCXE/s1600-h/Screenshot-%E2%96%A9+%E2%98%9E+%E5%BE%AE%E7%AC%91+%E2%80%A6+%E4%BD%A0%E4%B8%80%E7%9B%B4%E9%83%BD%E5%9C%A8+%E2%98%9C+%E2%99%A5+-+%E8%AB%8B%E5%A4%A7%E5%AE%B6%E5%86%8D%E7%B5%A6%E6%88%91%E4%B8%80%E6%AC%A1%E8%87%AA%E6%96%B0%E7%9A%84%E6%A9%9F%E6%9C%83!+-+Mozilla+Firefox+3+Beta+5.png"><img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_CYDba-CpZ2k/SDHzNBD8LFI/AAAAAAAAALk/NmO2A58QCXE/s320/Screenshot-%E2%96%A9+%E2%98%9E+%E5%BE%AE%E7%AC%91+%E2%80%A6+%E4%BD%A0%E4%B8%80%E7%9B%B4%E9%83%BD%E5%9C%A8+%E2%98%9C+%E2%99%A5+-+%E8%AB%8B%E5%A4%A7%E5%AE%B6%E5%86%8D%E7%B5%A6%E6%88%91%E4%B8%80%E6%AC%A1%E8%87%AA%E6%96%B0%E7%9A%84%E6%A9%9F%E6%9C%83!+-+Mozilla+Firefox+3+Beta+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5202206449538444370" /></a><br /><br/>然而, 再追蹤至其好友部落格 http://www.wretch.cc/blog/a24695129/24063545 , 其言行讓我火大....<br/>抓圖如下:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CYDba-CpZ2k/SDHzbRD8LGI/AAAAAAAAALs/so8oBMvxyyE/s1600-h/Screenshot-%E3%80%80%E4%B8%80%E8%BC%A9%E5%AD%90%E7%9A%84%EF%BC%82%E5%8F%8B%E6%83%85%EF%BC%82+-+%E3%80%80%E9%B4%BB%E8%BB%92%E3%80%80*+-+Mozilla+Firefox+3+Beta+5.png"><img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_CYDba-CpZ2k/SDHzbRD8LGI/AAAAAAAAALs/so8oBMvxyyE/s320/Screenshot-%E3%80%80%E4%B8%80%E8%BC%A9%E5%AD%90%E7%9A%84%EF%BC%82%E5%8F%8B%E6%83%85%EF%BC%82+-+%E3%80%80%E9%B4%BB%E8%BB%92%E3%80%80*+-+Mozilla+Firefox+3+Beta+5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5202206694351580258" /></a><br/><br/>我真的生氣了, 虐童的行為還可以友情相挺咧...<br />該生資料, 在 udn 中已經有人查出來了, 我花了時間寫信到教育部,因為我希望他們受到應有的處罰,國三生, 已經不小了, 該為自己的行為負責. <br/><br/></div></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-4929914405240173012008-05-11T14:09:00.002+08:002008-05-11T14:10:51.129+08:00Processing.js<div xmlns='http://www.w3.org/1999/xhtml'><a href='http://ejohn.org/blog/processingjs/' target='_blank'>Processing.js</a>. jQuery 作者 <a href='http://ejohn.org/blog/' target='_blank'>John Resig</a>’s 將 <a href='http://processing.org/' target='_blank'>processing.org</a> Java implementation's Processing Language port to JavaScript and Canvas.<br/> <br/>而且實測, 在 Firefox 3 執行的很完美, 真是有夠強.<br/><br/>有興趣的可以玩玩 Processing.js 的 <a href='http://ejohn.org/apps/processing.js/examples/basic/' target='_blank'>Basic Demo</a>. <br/>和 processing.org java 版的 <a href='http://processing.org/learning/basics/' target='_blank'>Basic Demo</a>.<br/>只能說..太酷了..<br/><br/>其中有幾樣和 Processing Language 無關的 javascript 實作, 也很值得研究.<br/><br/><ul><li><b>Types and type casting</b></li><li><b>Classes</b></li><li><b>Method overloading and multiple constructors</b></li><li><b>Inheritance</b></li></ul><br/></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-23601164851213554092008-05-02T10:10:00.003+08:002008-05-02T10:33:20.029+08:00Nimbus Theme on Ubuntu 8.04<div xmlns='http://www.w3.org/1999/xhtml'><br /><a href='https://nimbus.dev.java.net/' target='_blank'>Nimbus</a> ( 各組件詳細 <a href='https://nimbus.dev.java.net/spec/index.html' target='_blank'>Nimbus SPEC</a> ) 是 Sun Solaris Desktop 預設的就相當有質感的 Theme . 在未來的 JDK 6u10 中也將加入 Nimbus LookAndFeel.<br />所以利用這次重裝 Ubuntu 8.04 之餘, 順便把 Nimbus GTK2 engine 以及 Icons-theme 加入 Ubuntu 8.04 中.<br /><br />阿土伯目前的 Ubuntu ScreenShot:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/SBp44WXyE0I/AAAAAAAAAK8/UEVkDdWG7c4/s1600-h/Nimbus.png"><img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_CYDba-CpZ2k/SBp44WXyE0I/AAAAAAAAAK8/UEVkDdWG7c4/s320/Nimbus.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5195598029598626626" /></a><br /><br /><b><big>Compile and Install:</big></b><br />首先請先確認您有安裝打包 dpkg 相關的開發環境<br /><pre><code><br />sudo apt-get install fakeroot dpkg-dev devscripts icon-naming-utils<br /></code></pre><br />接下來就是下載 Nimbus 最新的 0.0.9 Source, 以及 deb 的 patch 包.<br /><pre><code><br />wget -c http://dlc.sun.com/osol/jds/downloads/extras/nimbus-0.0.9.tar.bz2<br />wget -c http://zap.tartarus.org/~ds/debian/dists/sid/main/source/nimbus_0.0.6-1.diff.gz<br /></code></pre><br /><br /><b><big>Compile:</big></b><br /><pre><code><br />tar xf nimbus-0.0.9.tar.bz2<br />cd nimbus-0.0.9<br />zcat ../nimbus_0.0.6-1.diff.gz | patch -p1<br />chmod +x debian/rules<br />debchange -v 0.0.9-1<br />sudo apt-get build-dep<br />fakeroot dpkg-buildpackage -us -uc<br /></code></pre><br />在一陣等待後, 您應該會在您的家目錄得到二個deb, (gtk2-engines-nimbus_0.0.6-1_i386.deb / nimbus-icon-theme_0.0.6-1_all.deb )<br /><br /><b><big>安裝 Nimbus dpkg:</big></b><br /><pre><code><br />sudo dpkg -i nimbus-icon-theme_0.0.6-1_all.deb<br />sudo dpkg -i gtk2-engines-nimbus_0.0.6-1_i386.deb<br /></code></pre><br />您應該可以在外觀設定看到 Nimbus 嘍.<br /><br /><b><big>懶人包:</big></b><br />OK!OK! 阿土伯了解大家的痛苦, 懶人包在此, 請直接下載這二個 deb , 然後依照安裝方式安裝即可.<br /><a target='_blank' href='http://racklin.googlepages.com/gtk2-engines-nimbus_0.0.6-1_i386.deb' title='Click to view this file' class='tr_pseudo-link'>gtk2-engines-nimbus_0.0.6-1_i386.deb(45K)</a><br /><a target='_blank' href='http://racklin.googlepages.com/nimbus-icon-theme_0.0.6-1_all.deb' title='Click to view this file' class='tr_pseudo-link'>nimbus-icon-theme_0.0.6-1_all.deb(9M)</a><br /><br /></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-41823792448245259912008-04-29T15:31:00.012+08:002008-05-05T23:52:50.198+08:00安裝 Ubuntu 8.04 於 Thinkpad T61 雜記前幾天把 <a target="_blank" href="http://www.ubuntu.com/">Ubuntu 8.04 Desktop Edition</a> 版本裝在 lenovo Thinkpad T61 上面.<br />安裝上算是例來版本最順暢的版本, 不用調整 acpi / sata 設定, 一路安裝到底就可以完成安裝嘍.<br />基本上所有 T61 上的硬體都能正確抓到, 而 nvidia driver 也只需透過 restricted driver 確認的動作便完成了. <br />當然, 尚許多美中不足的地方需要調效,本篇並不是安裝教學,請參考官方或網路上為數眾多之教學文件.<br /><br /><span style="font-weight: bold; font-size: 110%;">Wireless LED 不會亮:</span><br />雖說 Intel 4965AGN 的 wireless driver 正確掛上, 且亦可以正確使用, 但是主機上那個 wireless led 不會亮, 就是那麼讓人爽度下降. <br />所以我們需要自己更新 intel compat wireless driver. (當然, 除了 T61 其它品牌 notebook 亦可照作).<br />首先先到 http://linuxwireless.org/ 下載最新的 driver, <a href="http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2">link here</a>.<br />解壓後, 請修改 config.mk 加入 LED 的 options.<br /><pre><code><br />CONFIG_IWL3945_LEDS=y<br />CONFIG_IWLWIFI_LEDS=y<br /></code></pre><br />然後 sudo make install 即可完成更新,由於網路 module 使用中, 通常需要重開.<br />您就會看到您主機上的 wireless LED 開始可愛的一閃一閃了.<br /><br /><span style="font-weight: bold; font-size: 110%;">Trackpoint 中間鍵</span><br />加入以下幾行在 /etc/X11/xorg.conf 的 mouse 設定中:<br /><pre><code><br /> Option "Device" "/dev/input/mice"<br /> Option "Protocol" "ImPS/2"<br /> Option "ZAxisMapping" "4 5"<br /> Option "Emulate3Buttons" "true"<br /> Option "EmulateWheel" "true"<br /> Option "EmulateWheelButton" "2"<br /></code></pre><br /><br /><span style="font-weight: bold; font-size: 110%;">中文輸入法的更換:</span><br />雖然我對 SCIM 沒有好惡問題, 但是經過半天的使用, 發現 pidgin 在輸入字時, <br />會始整個視窗 hang 住一下, 然後久久才取得 focus .<br />一開始以為是 compiz 特效問題, 後來發現是 scim 怪怪的, 沒有去深究為什麼, 換成 gcin 試試.<br />於是改裝套件庫中的 gcin gcin-qt3-immodule, pidgin 果然不會卡卡的.<br />但是另一個問題接著而來, 那就是部份程式在結束時會有 segment fault 問題發生, Firefox / MySQL Query Browser 都會.<br />所以,又要展開昇級的動作, 由於 hardy 套件庫內的版本只到 1.3.7 版本. 新的穩定版是 1.3.9 可以解決這個問題. <br />於是我們使用 debian etch 套件庫來更新, 請參考 <a target="_blank" href="http://www.calno.com/moto/gcin/">http://www.calno.com/moto/gcin/</a> 將 <br /><code><br />deb http://www.calno.com etch-backports main <br /></code><br />加入您 Synaptic 第三方套件列表中->更新套件.<br />即可完成 1.3.9 版本的安裝, 現在 firefox / MySQL Query Browser 可以正常使用了.<br /><br /><span style="font-weight: bold; font-size: 110%;">中文字體 AA 小字不好看:</span><br />由於 Ubuntu 8.04 內建已經使用文泉驛正黑體, 由於 wqy-zenhei 內建含了點陣的明體,所以小字會使用到點陣字.<br />所以我們需要關掉它. (<a target="_blank" href="http://wenq.org/?ZenHei">詳見官網</a>).<br />請下載官網中的 <a href="http://wenq.org/upload/44-wqy-zenhei.conf">[44-wqy-zenhei.conf]</a> , 並換掉系統中的 /etc/fonts/conf.d/44-wqy-zenhei.conf . <br />在此, 由於官網的 match 只用了 "WenQuanYi Zen Hei" 如果在選字時用了 "文泉驛正黑" 的中文 family name 將不會生效, 建議您將<br />44-wqy-zenhei.conf test 部份改成如下:<br /><pre><code><br /> <test qual="any" name="family"><br /> <string>WenQuanYi Zen Hei</string><br /> <string>文泉驿正黑</string><br /> <string>文泉驛正黑</string><br /> </test><br /></code></pre><br /><br /><span style="font-weight: bold; font-size: 110%;">CPU 時脈調整</span><br />預設的 CPU freq 模式是 Ondemand, 會自動依 CPU 使用情況調整 CPU 時脈, 但是常常會造成程式 delay 或切換過慢的問題. 所以我們需要讓 cpufreq-selector 可以調整時脈.<br /><pre><code><br />sudo dpkg-reconfigure gnome-applets<br /></code></pre><br />回答 YES , 讓 cpufreq-selector 擁有 SUID root 權限. 將 cpufreq-selector 加入面版,現在可以很容易依需要調整 CPU 時脈.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_CYDba-CpZ2k/SBq1zGXyE1I/AAAAAAAAALE/Chl36IyJuU8/s1600-h/ttt.png"><img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_CYDba-CpZ2k/SBq1zGXyE1I/AAAAAAAAALE/Chl36IyJuU8/s400/ttt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5195665009613607762" /></a><br /><br /><span style="font-weight: bold; font-size: 110%;">Suspend / Hibernate Support</span><br />讓 fn+f4 suspend 以及 fn+f12 能正常作業.<br />修改 /etc/default/acpi-support<br /><pre><code><br />ACPI_SLEEP=true<br />ACPI_HIBERNATE=true<br />ACPI_SLEEP_MODE=mem<br />MODULES="e1000 iwl4965 nvidia"<br />HIBERNATE_MODE=platform<br /></code></pre><br />其中的 modules 則是 "removed before suspend and reloaded on resume" 所以可以有效解決 resume 畫面一片白/無線網路不能連等問題(至少阿土伯電腦沒再出現過了).<br /><br /><span style="font-weight: bold; font-size: 110%;">讓 Ubuntu 更好用:</span><br />當然, 不能忘了 <a target="_blank" href="http://rt.openfoundry.org/Foundry/Project/Download/?Queue=852">lazybuntu</a> 最新的 0.1.5 版也支援 hardy 了.<br /><br />以上, 是目前阿土伯安裝的心得, 陸續調適, 再行增加整理.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-17092175036804091752008-03-10T09:38:00.004+08:002008-03-10T10:59:42.757+08:00另人遺憾的 Google AuthSub API 有感<div xmlns='http://www.w3.org/1999/xhtml'>身為一個 Google Fans 及 Programmer, 對於參與開發的 Web Application , 總是極力希望能直接整合 Google Services. 甚而連 User Singup 都不用了, 直接使用 Google Account 或 OpenID 進行 Authenticate , 然後直接使用我們的服務..<br /><br />然而 Google Account API 中的 AuthSub API 似乎不能把它拿來當 Account Identification 用. 因為它無法傳回 UID (username / hash or anythings).<br /><br /><font color='#CC0000'><b>如果我們要拿來識別自己的 local user, 看來只能使用 ClientLogin, 要使用者填入 username (gmail) / password ,.....<br />這...是怎樣, 在現在釣魚網站這麼多, 而又是一個新創網站而言, 要使用者填入它的 Google username / password 是幾乎不可能的吧...</b></font><br /><br />建議不用改變太多, 至少擴充一下 AuthSubTokenInfo 多傳一行 user_hash or UID 應該沒有安全性上考量吧.. 查了一下 Groups , 很多開發者有和阿土伯相同的困擾, 就差最後一點功夫, 很遺憾的, Google 缺少了它....<br /><br />現在我們的 Service 放棄了 Google Login 的功能, 阿土伯身為 GFans , 好不甘心呀~~~~<br /><br />建議:<br />一. 不改變現有任何 API , 但對於同一個 Username 對於同一個 next 同一個 scope 操作, 回傳同一個<br />session token , 因為目前 session token 並不會失效, 所以我們可以 "暫時" 拿來當同一個使用者的識別之用.<br /><br />二. 只改變 AuthSubTokenInfo , 目前有的三行資訊, 多加入一行 user_hash or anything 可以反映相同使用者的資訊都可... <br /><br />Google Groups: <a target='_blank' href='http://tinyurl.com/2yr8hx'>http://tinyurl.com/2yr8hx</a><br /></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-22763229069822350022008-02-26T10:36:00.014+08:002008-02-26T11:57:28.648+08:00GRE 開發三: Step by Step 桌面程式快速開發XULRunner + jQuery + GREUtils = Quick Application Platform.<br /><br />本篇將利用範例的方式, 一步一步展示如何快速撰寫一個 Windows / Linux / MacOS 上的桌面應用程式, 您會發現利用 XULRunner (Gecko) 寫 Application 是那麼的容易. 這也是前二篇阿土伯專案中選用 XULRunner 而暫時排處 JavaFX 的原因.<br />基本上和設計 FireFox Extensions 差不多, 但本篇著重在撰寫 standalone application.<br />##CONTINUE##<br /><span style="font-weight: bold;font-size:130%;" >XULRunner 安裝:</span><br />XULRunner 的官方網址在 <a href="http://developer.mozilla.org/en/docs/XULRunner">http://developer.mozilla.org/en/docs/XULRunner</a> , 而各個 build 好的<br />binary 可在此 FTP 下載 <a href="http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/1.8.1.3/contrib/">http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/1.8.1.3/contrib/</a><br />在這邊我們下載 xulrunner-1.8.1.3.en-US.win32-20080128.zip , 然後 解壓到 C:\ <br /><br /><span style="font-weight: bold;font-size:130%;" >下載 GREUtils 範例</span>:<br />請到 <a href="http://code.google.com/p/greutils/">http://code.google.com/p/greutils/</a> , 下載 helloworld 範例 <a href="http://greutils.googlecode.com/files/greutil-helloworld.zip">http://greutils.googlecode.com/files/greutil-helloworld.zip</a><br />然後一樣解壓到 C:\ <br /><br /><span style="font-weight: bold;font-size:130%;" >執行 GREUtils 範例</span>:<br />請開啟 Command Prompt (執行->cmd.exe), 然後鍵入 <pre><code><br />c:\xulrunner\xulrunner.exe c:\greutil-helloworld\application.ini <br /></code></pre><br /><br /><span style="font-weight: bold;font-size:130%;" >執行畫面</span>:<br />OK~ 您應該可以看到如下的畫面. Linux / MacOS 執行方式及結果應該亦是相同. <br />應為跨平台亦是 Gecko 的特色之一, 且由於使用 XUL/XHTML/CSS 所以各平台執行結果及承現是一致的.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/R8OAtSXZsII/AAAAAAAAAI8/o4T3VtcANIc/s1600-h/main.png"><img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_CYDba-CpZ2k/R8OAtSXZsII/AAAAAAAAAI8/o4T3VtcANIc/s400/main.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5171118312663920770" /></a><br /><br /><span style="font-weight: bold;font-size:130%;" >開發環境</span>:<br />XULRunner + jQuery + GREUtils 為此範例的主要環境. <br />XULRunner 開發細節在此不多作解釋, 請見官網文件. 您可以把它想像成 JavaRuntime 之類的環境, Firefox / ThunderBird 便是架構在 XULRunner 之上.<br /><br />jQuery 我們的老朋友嘍, 所有 javascript 和 XUL/XHTML 的互動, 都是利用它來實現, 也就是您原來在 Web 中所使用的技巧(Ajax/DOM/XHR), 都可以搬到 Application 來用嘍.<br />這樣您有沒有信心大增, 即使您熟悉的是 Web Programming, 現在不用學 Java / VB / VC .... VX 就可以寫一些(簡單?)的應用程式嘍.<br /><br />GREUtils 它是阿土伯封裝的一個簡易框架, 讓您可以容易的開發 XULRunner 應用程式.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >application.js</span>:<br />application.js 負責配製 Preferences , Initialize , 期望您在此僅撰寫這二件事, 相關的程式, 請將它寫到 Controller 中. <br />以下為 initialize 片斷 <pre><code><br /> // init controller<br /> GREUtils.include_once('appController.js', window);<br /> GREUtils.include_once('mainController.js', window);<br /> GREUtils.include_once('charsetController.js', window);<br /> GREUtils.ControllerHelper.appendController(AppController, this);<br /> GREUtils.ControllerHelper.appendController(MainController, this);<br /> GREUtils.ControllerHelper.appendController(CharsetController, this);<br /></code></pre><br /><br /><span style="font-weight: bold;font-size:130%;" >xxxController.js</span>:<br />Controller 提供相關的 action 實作. 由於 GREUtils 封裝了 CommandDispatcher , 所以您只要擴展<br />GREUtils.ControllerAdapter , 您可以僅實作您的 action commands , 它會自動處理 supportsCommand / isCommandEnabled / doCommand / onEvent 等相關細節.<br />其中 init 為 Controller initialize function , 它會傳入 Application, 讓您可以在您的 Controller 中處理 Preferences 以及 Application wide function.<br /><br /><span style="font-weight: bold;font-size:130%;" >jQuery</span>:<br />您可以在 Controller , 利用 jQuery 處理畫面上的任何元素, 所以相當容易直覺, 就如同您在設計 Web.<br /><pre><code><br /> charsetCmdConvert1: function() {<br /> jQuery("#charsetList1").each(function(i) {<br /> var cs = this.selectedItem.label;<br /> var input_text = jQuery("#utf8MsgBoxInput").val();<br /> var out = GREUtils.Charset.convertCharset(input_text, 'UTF-8', cs);<br /> jQuery("#utf8MsgBoxoutput").val(out);<br /> });<br /> }<br /></code></pre><br /><br /><span style="font-weight: bold;font-size:130%;" >Append DOM Object</span>:<br />如果您發現您直接利用 jQuery.append 等相關的 DOM 操作, 和您想的不一樣, 別感到驚訝.<br />因為在 XULRunner 中, XUL 和 HTML 的 Namespace 是不同的.<br />所以您可以利用 GREUtils.domXULString / GREUtils.domHTMLString 來處理.<br />如 明確的指定您要加入一個 XUL 的 Label Object: <pre><code><br />jQuery("#testContainer").append( GREUtils.domXULString("<label value='test'/>" ));<br /></code></pre><br /><br /><span style="font-weight: bold;font-size:130%;" >Debug</span>:<br />程式執行起來, 會為您 Popup Error Console 供您 Debug, 當然, 您也可以在 AppController.js <br />中拿掉它... 您更可以自行安裝 FireBug 為您的 Debuger.<br /><br /><span style="font-weight: bold;font-size:130%;" >其它..</span>:<br />有關利用 3rd extensions 和提供您的 application add-ons 在下次有機會阿土伯再行解說.<br />歡迎大家來信/留言討論, 一同成長.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-40871141564376185692008-02-25T11:17:00.006+08:002008-02-25T19:08:39.918+08:00GREUtils 1.0 Release<div id="wikicontent" style="padding: 0pt 3em 1.2em 0pt;">GREUtils 是一個輔助您在設計 Firefox extensions 或設計 XULRunner 程式的一個工具程式.<br /><br /><ul><li>封裝了幾個常用的 XPCOM 功能, 讓您可以更方便更直覺的叫用它們.</li><li>封裝了 Dialog / Preferences / Sound 等常用 XPCOM.</li><li>封裝了 Charset Convert , 您可以利用 Function 進行 charset convert, 如同 php .<br /></li><li>亦加入了如同 PHP 的 include / include_once 的特色, 讓您的程式可以更 MVC , 只有在需要的時侯, 引入適當的 javascript 及模組.</li><li>封裝了 Controller 和 CommandDispatch , 讓您的程式有一個良好易於寫作的MVC 架構.<br /></li></ul><br /><p>今年比較忙, 一直沒有更新 Blog, 包含之前希望提供給大家的 Gecko 開發工具包, 也一直沒有時間整理(阿土伯很早 2007/09 就投到 google code 開放出來了).</p> <p><s>還是沒有時間為大家寫完完整的說明及 Sample code</s>, 怕一拖下去沒完沒了,<br />先放出來讓大家使用, 或請大家幫我寫一下 Sample Code 吧~~ :D</p><p><span style="color: rgb(255, 0, 0);">已補上 hello world 的 xulrunne rsample application, 利用了所有 GREUtils 的特性.</span><br /><span style="color: rgb(255, 0, 0);">您可以把 helloworld application 當成您專案的 blank application 來用.</span><br /></p><p><br /></p>大家先看 Source code 或 javadoc 理解一下. 希望對您在撰寫 extension / xulrunner 上有幫助.<br /><span style="font-size:130%;"><br />專案位址: <a href="http://code.google.com/p/greutils/">http://code.google.com/p/greutils/</a></span><br /><p>##CONTINUE##<br /></p><p>GREUtils is simple and easy use APIs libraries for GRE (Gecko Runtime Environment). </p><p>It provides: </p><ul><li>Object extend function </li><li>include / include_once specified URL script. </li><li>XPCOM utilities </li><li>Charset Convert </li><li>Preferences Services </li><li>File IO </li><li>Dialog utilities </li><li>Controller and CommandDispatcher<a href="http://code.google.com/p/greutils/w/edit/CommandDispatcher">?</a> Helper </li></ul> </div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-79510389484526459642007-12-27T13:09:00.000+08:002007-12-27T13:26:26.914+08:00跟不上年代的年代售票系統先前沒有使用年代售票系統的經驗, 但年代售票應該算是國內藝文活動最大票務系統了吧????<br />現在是 2007 年底了.. 幫幫忙, 沒看這麼沒跟上年代的線上票務系統了... <br />只是一個江惠個人演唱會, 就能搞死, 那年代還能辦什麼大型活動, 提供線上訂票...<br />在承接服務之前, 請先加強自身服務的品質及能力, 讓消費者有愉快的購票體驗..<br />而不是 "不得不" 來向年代買票的無奈..<br />##CONTINUE##<br />由於 12/27 為江<a href="http://www.wretch.cc/blog/jodychiang&article_id=13427876">惠演唱會門票開賣日</a>. <br />由於看江惠演唱會是母親大人的心願, 所以幾乎是全家年輕人動員上網訂票守侯, 怎知整個<br />年代售票系統從 12 點開始到 1 點多, 整個網站呈現空白頁面出不來的狀況...<br />受不了之餘, 打去金石堂要電話訂票... 更火了, 原來金石堂也是透過年代網路訂票系統, 所以也是 hang 住狀態, 無法提供代訂服務...<br /><br />心情差到極點, 不好意思在此寫下無意義之抱怨文. 文章都寫完了, 系統還是進不去... orz<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/R3M2tju0XeI/AAAAAAAAAHU/bvlIrRDjmfA/s1600-h/Screenshot.png"><img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_CYDba-CpZ2k/R3M2tju0XeI/AAAAAAAAAHU/bvlIrRDjmfA/s400/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5148518955328232930" /></a>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-59782427624678884662007-11-24T11:02:00.000+08:002007-11-26T12:08:29.626+08:00iGoogle BossKey 暗黑老板鍵小工具由於 iGoogle 提供的小工具已經非常非常的多元化.. 舉凡<a href="http://www.google.com.tw/ig/directory?q=%E6%8A%95%E8%B3%87%E7%B5%84%E5%90%88&root=%2Fig&igtab=test&dpos=top&url=http://bizyotw.ig.googlepages.com/Stock.xml">股市投資組合</a>, <a href="http://www.google.com.tw/ig/directory?q=game&root=%2Fig&igtab=test&dpos=top">打電動</a>, 看新聞, 聊天, 看<a href="http://www.google.com.tw/ig/directory?q=diggirl&root=%2Fig&igtab=test&dpos=top">美女圖</a>, 都可以在 iGoogle 中全部搞定... 嘿嘿..<br />頁面停留在 iGoogle 中, 已不見得是用功好學在努力找資料了... 這時就需要 iGoogle <a href="http://zh.wikipedia.org/wiki/%E8%80%81%E9%97%86%E9%8D%B5">老板鍵</a> 功能.<br /><br />這是在 <a href="http://racklin.blogspot.com/2007/11/gtdd2007.html">GTDD2007</a> 當天下午分組程式設計時寫的小工具(<a href="http://spreadsheets.google.com/pub?key=pYjS1RAcmRhu1ClNT-3s_Jg&gid=0">編號 30</a>), 可能太害羞還是氣氛的關係, 很少人在各組間走動觀摩討論... 所以得票數一票 :( (還是同桌投的..呵呵)<br />阿土伯把它補完整一點並加上設定、多國語.. 放出來和大家分享..<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">功能:</span></span><br /><ul><li>隱藏 iGoogle 的畫面</li><li>帶入 傳統 Google 搜尋頁面</li><li>自動在搜尋欄位中填入設定關鍵字</li></ul><br /><span style="color: #fff; background-color: #fff;">##CONTINUE##</span><br /><span style="font-size:130%;"><span style="font-weight: bold;">說明:<br /><br /></span></span>暗黑<a href="http://zh.wikipedia.org/wiki/%E8%80%81%E9%97%86%E9%8D%B5">老板鍵</a>小工具說明, 要用情境模式來示範解說.. 大家就了解了.<br /><br />話說阿土伯上班正努力的用功........... 看盤/看圖/打電動..<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_CYDba-CpZ2k/R0eYc0saT-I/AAAAAAAAAGk/F91KTCbdW7w/s1600-h/web_screen1.png"><img style="cursor: pointer; width: 469px; height: 255px;" src="http://bp2.blogger.com/_CYDba-CpZ2k/R0eYc0saT-I/AAAAAAAAAGk/F91KTCbdW7w/s400/web_screen1.png" alt="" id="BLOGGER_PHOTO_ID_5136241520988016610" border="0" /></a><br /><br />這時老板突然走了過來, 看的正精彩,關掉瀏覽器實在太可惜了(等會要重執行).<br />趕快使用暗黑老板鍵...(F10). 畫面馬上變成:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/R0eZvEsaT_I/AAAAAAAAAGs/lll-D0wYeNk/s1600-h/web_screen2.png"><img style="cursor: pointer; width: 457px; height: 204px;" src="http://bp3.blogger.com/_CYDba-CpZ2k/R0eZvEsaT_I/AAAAAAAAAGs/lll-D0wYeNk/s400/web_screen2.png" alt="" id="BLOGGER_PHOTO_ID_5136242934032257010" border="0" /></a><br /><br />老板問: 阿土伯你在做什麼...<br />阿土伯: 報告老板, 我正準備要在 Google 搜尋上查詢有關 google 的相關新聞, 研究 google 的成功模式能不能應用在公司上面.... (呼~~ 要臉不紅氣不喘的回答, 小朋友不要學, 大哥哥是練過的)<br /><br />OK~~ 大致上軟體就是這麼用的....<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">設定畫面:</span></span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CYDba-CpZ2k/R0eaZUsaUAI/AAAAAAAAAG0/_JHFRXXo6tM/s1600-h/web_screen3.png"><img style="cursor: pointer;" src="http://bp0.blogger.com/_CYDba-CpZ2k/R0eaZUsaUAI/AAAAAAAAAG0/_JHFRXXo6tM/s400/web_screen3.png" alt="" id="BLOGGER_PHOTO_ID_5136243659881730050" border="0" /></a><br /><br /><span style="font-weight: bold;"><br />加入您的 iGoogle:<br />請點取 Add to Google 直接加入您的 iGoogle 中.<br /></span><a href="http://www.google.com/ig/add?hl=zh-TW&moduleurl=http://racklin.googlepages.com/bosskey.xml&source=imag"><br /><img src="http://www.google.com.tw/webmasters/add-to-google-plus.gif" border="0" /><br /></a><br /><span style="font-size:130%;"><span style="font-weight: bold;">原始程式及小工具 URL:</span></span><br />http://racklin.googlepages.com/bosskey.xml<br /><br />PS.<br /><blockquote>像這樣的暗黑小工具投到目錄中不知道能不能審核通過..<br />對不起 kevin, 不小心又弄了一支 html-inline gadget, gtdd2007 當日苦口婆心希望大家寫 html type gadget...<br /></blockquote>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-32952028059752330712007-11-23T17:46:00.000+08:002007-11-23T17:50:39.861+08:00gtdd2007 感想昨天參加了 Google Taipei Developer Day 2007 收獲很多..<br />最大的收獲就是阿土伯有榮幸能和眾多網路名人一聚, 如 <a href="http://blog.qing.tw/">qing</a> , <a href="http://www.pocketshark.com/blog/page/tempo">tempo</a>,<br /><a href="http://blog.xdite.net/">xdite</a>, <a href="http://bawbaw-hu.blogspot.com/">Bawbaw.hu</a>, 以及一群年輕、專業又有活力的 <a href="http://www.funp.com/">funp</a> 團隊.<br /><br />也非常感謝 Google 評審團對阿土伯設計的小工具支持及肯定, 讓我有幸獲得 "<a href="http://www.google.com.tw/events/gadgetawards/winners.html">工程師特別獎</a>" 的殊榮...<br />,對我而言,無疑是最大的鼓勵,更加深我在開發以及程式開放分享上熱忱。<br /><br />也希望未來能開發/開放更多的小程式小工具和大家分享..<br />以及和各位網路高手交流, 教學相長...Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-17030722993406515102007-11-13T16:44:00.000+08:002007-11-13T17:23:03.081+08:00GRE 開發備註二阿土伯手上專案終於完工了, 並 Release 給客戶以及交付生產線試用了.<br /><br />看看最後一篇文章, 足足隔了一個多月(手腳變慢了 = =), 各位朋友, 久違了..<br /><br />近期會整理一下及發表阿土伯在開發 Gecko / XULRunner Application 時, 所開發的一些 Utilities Libraries.<br /><br />這篇主要介紹及回答為什麼當時阿土伯要用 GRE 而不是 Java RCP(eclipse RCP / netbeans RCP...etc,)<br /><br />##CONTINUE##<br /><br /><span style="color: rgb(255, 0, 0);font-size:130%;" >GRE/XULRunner 特色<br /><br /></span><span style="font-weight: bold;font-size:100%;" >* Cross Platform - </span><br />只要是有 mozilla or firefox 都可以執行您的 Application. 這部份的特色和阿土伯喜愛的 Java 一樣可愛.<br /><br /><span style="font-weight: bold;font-size:100%;" >* Gecko Rendering Engine - </span><br />有了 Gecko Rendering Engine, 可以用大家最熟悉的 HTML 技術來開發富豐的 GUI.<br />更可以內崁 Flash Object 來開發更炫麗 GUI.<br />當然, 你要內崁 Java Applet 來開發 GUI 也可以.<br /><br /><span style="font-weight: bold;font-size:100%;" >* Javascript</span><br />使用 Javascript 來開發 Application. 任何您原來在 Web 上開發的技巧都可以直接使用.<br />再加上豐富大量的 3rd-party Libraries (jQuery / Dojo / YUI) + Firebug 開發效率及入門門檻低.<br /><br /><span style="font-weight: bold;font-size:100%;" >* XUL / XML / XBL / SOAP</span><br />做為 Rich Client Platform , XUL+XBL 配合的讓人讚賞.. 而 XBL 讓您利用 CSS Selector 的方式, 讓 XUL / HTML 可以<br />binding 到 Content / Properties / Methods / Events / Style .<br />這部份讓您對於開發 XUL 有很大的彈性.<br />在部份的應用下, 可以開發類似於 jsp / jsf 的 custom tag .<br /><br /><span style="font-weight: bold;font-size:100%;" >* XPCOM</span><br />透過 XPCOM, 可以讓 javascript 使用原生的方法.<br />利用 XPCOM 開檔 , 網路連線 , 資料庫操作等.<br />亦可以自行利用 C++ 或 javascript 實作自己的 XPCOM , 有點像 JNI.<br /><br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);font-size:130%;" >心得</span><br />對於一個中/大型的 Application 專案, 建議採用 Java RCP.<br />對於一個小型的 Application 專案或設計專案 Prototype 時, 這時利用 GRE/XULRunner 是在適合不過的了..<br />(大專案也行啦.... firefox/thunderbird 就是, 它們可不是小專案呀...)<br /><br />而且...... 還有一個當初我採用的最大原因....... <span style="font-weight: bold; color: rgb(204, 0, 0);font-size:180%;" >懶</span>....<br />若是利用 Java RCP, 每次換個客戶,換個 UI , 或是加點小功能..工作就會再回到我們手上來...<br />用了 Gecko.. 現在變成美術設計的事了, 除非 XPCOM / XBL 有問題, 才需要 debug 及維護.<br />這下子, 原來 "軟體部門" 的專案變成了 "設計部門" 的專案... 這才是太極最高奧義呀~<br /><br />歡迎大家來信或留言討論...Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-16762251386133035642007-09-28T12:03:00.000+08:002007-09-28T12:13:22.969+08:00ifunP 推推王點播台 問題修正由於 <a href="http://funp.com/">funp.com</a> 改版, 在 RSS 上做了部份修改.<br />link tag 的 URL 變更, 所以造成 ifunP <span style="color: rgb(255, 0, 0);">無屁可 fun</span> 的情況發生. 目前已修正完成並上傳.<br /><br /><span style="font-weight: bold;">您無需重新安裝, 在幾小時後 Google Cache 重整後您即可使用到新版的 ifunP.<br /><br /></span><span style="font-weight: bold;">當然, 您急著用可以利用以 URL 新增的方式, 在 URL 中加個亂數.</span><br /><span style="font-weight: bold;">如 http://racklin.googlepages.com/ifunp.xml?200709271100 這樣也可以跳過 Google Cache 用到即時更新的版本</span>...<br /><br />由於目前閉關趕專案中, 未能即時發現問題並改正, 造成不便在此請大家見諒...<br />感謝 <a href="http://blog.markplace.net/">mark</a> 的強勢提醒告知(利用 IM 的匿稱讓我看到.... )Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-53051912732434502302007-09-17T10:10:00.000+08:002007-09-17T11:01:49.479+08:00GRE 開發備註一整整花了一個星期閉關搞 <a href="http://developer.mozilla.org/en/docs/GRE">GRE</a> . 這裡的 GRE 不是指英文的 GRE普通測驗. 而是 Gecko Runtime Environment.<br /><br />源起:<br />由於手上一個 CASE 的需求是需要為公司的硬體週邊做一個檢測程式, 而這些週邊含 Serial Port(RS232) / Parallel Port(IEEE 1284) / USB 裝置 / 以及部份數位 TTL信號.<br />而這些裝置希要提供 Win32 / Linux(趨勢) 上測試通過. <br />且這支測試程式還有另一個任務, 就是 Open Source C++ 部份的 API 給買裝置回去整合的廠商參考實作. <br />本來想用 Java + JNI 把它解決掉, 因為要 Release 的廠商多, 每一家要有自己的版本及 Logo, 所以要一家一家改 JForm 有點麻煩, 本來試試 <a href="https://openjfx.dev.java.net/">JavaFX</a> 來動態搞, 不熟再加上第二個原因.<br />廠商的工程師都是使用 C++ , 用 Java+JNI 等於我還是要再寫一份 C++ 的 Sample 給廠商.<br /><br />最主要的是.....想玩玩 GRE , 於是... 整個架構如下..<br /><br /><a href="http://developer.mozilla.org/en/docs/XUL">XUL</a>/XHTML -> Javascript -> <a href="http://developer.mozilla.org/en/docs/XPConnect">XPConnect</a> -> <a href="http://developer.mozilla.org/en/docs/XPCOM">XPCOM</a>(C++ or Javascript)<br /><br />##CONTINUE##<br />所以, 除了最底層的裝置操作用 C++ 實作, 且這部份的 Code 剛好就是要給廠商的 Sample Code. <br />其它的 GUI 部份及全部的程式流程, 只要在 XUL/XHTML 中寫寫 Javascript , 而 jQuery 部份修改也能操作 XUL ... <br />所以每個客戶的程式界面要多炫就能有多炫,還可以給個 Flash 單介面和動畫 Splash 呢。<br /><br />卻被 Win32 平台搞死:<br />在 Linux 下開發很順利, 整個實作過程和原始概念差不多, 也開發的很愉快..<br />沒想到原本以為最容易的 Win32 平台, 由於開始想用 GRE 前沒做太多功課, 卻是惡夢的開始.<br /><br />阿土伯是打算使用 VC++ 2005 express edition 來 make , 怎麼搞就是一堆 error.<br />後來看到 <a href="http://developer.mozilla.org/en/docs/Windows_Build_Prerequisites">Windows Build Prerequisites</a> 差點昏倒, 原來 Gecko 1.8 在 VC++ 2005 express 是 NO .. 問題剩下最後一哩路了, 總不改用 "原版A拷 VC6 / VC7.1" 呀~~<br />查了很多, <a href="http://marilab.hp.infoseek.co.jp/buildfx/vc8.html">日本人寫的這篇</a>還算詳細, 雖然整個 mozilla 還是無法 build 出來, 但 extensions 及 sdk 都還沒問題. 給使用 VC++ 2005 express 的大家參考.<br /><br /><br />建議參考資料:<br /><a href="http://developer.mozilla.org/en/docs/XULRunner">XULRunner</a> - 一個可以單獨運作的 gecko 開發包, 如果沒有一定要 embed gecko , 由這個開始會很舒服.<br /><a href="http://xpcomviewer.mozdev.org/">XPCOMViewer</a> - 一個用來 Browse XPCOM 的工具, 您可以看到 Gecko 中一大堆實用的 XPCOM Interface.<br /><a href="http://developer.mozilla.org/en/docs/XPCOM:Strings">XPCOM Strings</a> / <a href="http://developer.mozilla.org/en/docs/XPCOM_array_guide">XPCOM Array</a> / <a href="http://developer.mozilla.org/en/docs/XPCOM_hashtable_guide">XPCOM Hashtable</a> - 這也是讓阿土伯最無力的文件之一, 資料有點老舊, 如果你是直接使用 Gecko-SDK 而不是由 seamonkey-src 來 build 你的專案, 你會發現文件中說的 class 在 SDK 中都不存在, 因為 frozen / unfrozen API 的關係. 建議直接花時間看看 SDK 中的 .h 看看有什麼 Class 比較快.<br />這部份等結案後再來整理...<br /><br />總之... 忙到爆... 但希望這個工做完.. 以後就能涼到爆....<br />因為, 不管什麼程式, 都只剩下 XUL/XHTML + Javascript 了.. 這部份要怎麼改都行.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-9907396223804678142007-08-27T15:06:00.000+08:002007-08-27T16:11:28.385+08:00AOP for jQuery就在寫 <a href="http://racklin.blogspot.com/2007/08/jquery-114-release.html">jQuery 1.1.4</a> 那篇介紹文的同時, 逛了一下 jQuery plugins , 看到了一個很有意思的專案.<br /><a href="http://code.google.com/p/jquery-aop/">jQuery AOP</a> , 看起來是一個新的專案,作者於 2007/08/17 上傳第一個 <a href="http://jquery-aop.googlecode.com/files/jquery-aop-1.0.zip">release</a> 檔案.<br /><br />aspect-oriented programming (<a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming">AOP</a>) 在 Java 中有幾個流行的 AOP 實作, <a href="http://www.eclipse.org/aspectj/">AspectJ</a> , <a href="http://aspectwerkz.codehaus.org/">AspectWerkz </a>和 <a href="http://labs.jboss.com/jbossaop/">JBossAOP</a>, 所以有關 AOP 的介紹, 請看上面四個 Link, 不在此重覆說明.<br /><br />而 jQuery AOP 則是實作了 before / after / around 三個 advice, 雖然名為 jQuery AOP, 其實並未使用到 jQuery 的任何特性及功能, 所以即使您沒有使用 jQuery , 依然可以小改一下 code 來使用哦, 所以一定要堆的啦.<br /><br />##CONTINUE##<br />我們可以很容易的利用 javascript 的 Function.apply() 來 hook function 或 object(<a href="http://racklin.blogspot.com/2007/02/blogger-hack-tip-1-hacking-blogger.html">Blogger Hack Tip#1</a>) , 所以實作起來相當的輕巧, 只有 943 bytes.<br /><br />舉一個實例:<br />任何程式語言, 在程式寫作過程中, 我們少不了要 Log , 然而 Log 的動作和程式本身實際的業務邏輯無關, 若是為每一個業務操作的 function / method 前後都加上 Logger.log('message'), 對於程式本身而言.. 太過於難看(bad smell).<br />所以這時我們可以藉由 Dynamic proxy 或 AOP framework 來改善這個 bad smell.<br /><br />使用 jQuery AOP 在 javascript 中使用 after / before / around advices 變的很簡單:<br /><br />例1 對 native object 切入:<br /><pre><code><br />jQuery.aop.before( {target: String, method: 'replace'},<br />function(regex, newString) {<br /> alert("About to replace string '" + this + "' with '" + newString + "' using regEx '" + regex + "'");<br />}<br />);<br />"Hello World".replace("Hello", "Hello jQuery");<br /></code></pre><br /><br />例2 對 global function 切入:<br /><pre><code><br />function testEcho ( arg) {<br /> alert('testEcho: ' + arg);<br />}<br />jQuery.aop.before( {target: window, method: 'testEcho'},<br />function(arg) {<br /> alert("About to testEcho arguments is " + arg);<br />}<br />);<br /></code></pre><br /><br />例3 對 instance object 切入:<br /><pre><code><br />var TestObj = function (name) {<br /> this.name = name;<br />};<br />TestObj.prototype.hello = function (arg) {<br /> alert(this.name + ':' + arg);<br />};<br />var rack = new TestObj('rack');<br />jQuery.aop.before( {target: rack, method: 'hello'},<br />function(arg) {<br /> alert("before "+ this.name +" say " + arg);<br /> }<br />);<br />rack.hello('hello');<br /></code></pre><br /><br />其它各位依此類堆.... 有了 jQuery AOP , javascript 也能寫的很優雅嘍.<br /><span style="font-style: italic;">(都已經 Hook Blogger了, 之前怎麼沒想到順便弄一個 plugin , 唉~~ sense 不足.. 被搶頭香了 :D )</span>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-64644004815026600052007-08-27T09:24:00.001+08:002007-08-27T11:34:37.999+08:00jQuery 1.1.4 ReleasejQuery 1.1.4 出來了 <a target="_blank" href="http://jquery.com/blog/2007/08/24/jquery-114-faster-more-tests-ready-for-12/" rel="tag">jQuery 1.1.4: Faster, More Tests, Ready for 1.2</a> , 這將會是 1.1 系列的最後一版, 下一版本會跳到 1.2 了.<br />雖然被 jaceju 的 <a href="http://blog.roodo.com/jaceju/archives/4004605.html">[JavaScript] jQuery 推出 1.1.4 版</a> 搶了頭香 :D ,<br />阿土伯還是介紹一下, 並以一些比較技術部份簡介一下.<br />##CONTINUE##<br /><h3>Speed Improvements</h3><br />在三個基本常用的操作上, ID selectors, tag name selectors, 和 each() 迴圈處理上, 速度有大幅的提昇.<br /><br /><h3>Any Name jQuery</h3><br />jQuery 在前面的版本, 只使用了二個 global variables , 就是 $ 和 jQuery, 現在 1.1.4 後, 您可以將這二個變數也換掉, 並和其它 3rd party 的 Library 整合,果如他在 Google 的演說一樣, (<a href="http://racklin.blogspot.com/2007/08/john-resig-building-javascript-library.html">阿土伯這篇有介紹</a>), 這版就加入了, 它帶來了二個好處:<br /><br />1. <span style="font-weight: bold;">你可以在同一網頁使用不同版本的 jQuery</span>:<br />這個功能, 或許猛一看, 你會認為為什麼有這樣的需求??<br />然而, 如果您的 Library 是運用在其它大量 3rd party library 的場合, 這個功能將會是很大的相容性保證.<br /><blockquote>如:<br />1. 阿土伯的 Blogger-Ext 它會運用在 blogspot.com 上的, 然而很多網誌作者已自行擴充了很多功能, 也可能使用其它版本的 jQuery, 這時這個功能將能保證不會有相容性問題.<br /><br />2. 使用 Firefox 的使用者一定知道 Firefox 有很多的 extensions 可以使用, 包含 Greasemonkey 等, extensions 作者可能用到了 jQuery 來設計 js , 如果這時網頁也使用 jQuery, 這時這個功能將保證不會和網頁有相容問題.<br /></blockquote>2. <span style="font-weight: bold;">您可以將 jQuery 整合進其它 Namespace 中</span>:<br />同上, 你更能將 jQuery 整進你 Library 的一部份, 一同發表, 這時, 您可以維護一份您自己使用的版本, 即使網頁作者換了別的版本 jQuery, 你的程式也不會發生相容性的問題.<br /><br />也就是未來版本的 BloggerExt , 阿土伯可以將它整進 <span style="font-weight: bold; color: rgb(255, 102, 0);">BloggerExt.jQuery</span> 或 <span style="font-weight: bold; color: rgb(255, 102, 0);">BloggerExt.$</span> , 這樣 BloggerExt 將對任何網誌有最大的相容性以及最低的侵入性.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">jQuery 在設計之初, 就有良好的設計模式以及未擴充任何 Native Objects , 這時就派上很大的用途.</span></span><br /><pre><code><br />// With the Dojo Toolkit<br />dojo.jquery = jQuery.noConflict(true);<br />dojo.jquery("#elem div").slideDown("slow");<br />// or with Yahoo UI<br />YAHOO.query = jQuery.noConflict(true);<br />YAHOO.query("span.hidden").removeClass("hidden");<br /></code></pre><br /><br /><h3>.slice()</h3><br />對於 jQuery 的 objects , 我們可以使用如同標準 <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice">Javascript arrays slice() function</a>.<br />這個 Function 太優了, 它讓 jQuery 操作和 Javascript Array 有一致的操作介面.<br />所以, 理所當然的 .eq() , .lt() , .gt() 就被捨棄掉了. 因為可以用 .slice() 取代它.<br /><br /><h3>Bug Fixes</h3><br />53 個 1.1.3.1 版本的問題修正, 詳見 <a href="http://dev.jquery.com/report/16">the bug tracker</a> , 相當多的修正, 希望不會太快出現 1.1.4.1 :q<br /><br /><h3>Local Variables:</h3>一樣同他在 Google Tech Talk 上建議的良好習慣, 這版 1.1.4 便是將自己放在<br /><pre><code><br />(function(){<br />// your code<br />})();<br /></code></pre><br />中.<br /><br /><h3>Blogger-ext2 使用方式</h3><br />所以有使用 Blogger-ext2 的朋友, 只要將<br /><pre><code><br /><script type="text/javascript" src="http://blogger-ext2.googlecode.com/files/jquery-1.1.4.pack.js"></script><br /></code></pre><br />即可完成 jQuery 的昇級動作..Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-38145382381633412862007-08-24T22:46:00.000+08:002007-08-27T12:42:54.672+08:00John Resig 談 Building a JavaScript Library<a target="_blank" href="http://ejohn.org/" rel="tag">John Resig</a> (<a target="_blank" href="http://jquery.com/" rel="tag">jQuery</a> 的發起人) 在 <a href="http://video.google.com/videosearch?q=type%3Agoogle+engEDU&page=1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lv=0&so=1">Google Tech Talk</a> 談如何建立一個 JavaScript Library:<a target="_blank" href="http://ejohn.org/blog/building-a-javascript-library/">Building a JavaScript Library</a>,包含影片及投影片。<br /><br />對於每一位有心學好 Javascript 的 Programmer 都該花點時間看一下, 除了介紹 jQuery 外,包含很多設計 Javascript Library 的實用技巧及觀念, 即使您不是使用 jQuery 也該看一看.<br />##CONTINUE##<br />阿土伯對於實作(Implementaion)上的實務技巧簡單筆記:<br /><br /><ul><li>使用 Local variables / 盡可能使用最少的 Global Variables<br />這部份是所有語言都共通的良好習慣, 讓您的程式碼及變數, 作用在最小的 Scope 中.<br />或盡可能宣告最少的 Global Variables.<br />在 Javascipt 中這個 Wrapper 寫法, 應當成基本程式習慣, 尤其是如果您的 javascript 會和其它大量的 javascript 一起運作時, (如阿土伯寫在 iGoogle 的 html-inline gadget ):<br /><pre><code><br />(function(){<br />// your code<br />})();<br /></code></pre><br />或<br /><pre><code><br />(function(){<br />// your code<br />}).call(this);<br /></code></pre><br /><br />(參考: <a href="http://racklin.blogspot.com/2007/03/blogger-hack-tip-2-javascript-code.html">Blogger Hack Tip #2 - Javascript Code Style</a>)<br /></li><li>Namespacing<br />如果一定要讓自己的 Library 使用到 Global Variables 時, 請使用 Namespace.<br />如:(Dojo, Yahoo UI, jQuery, BloggerExt)</li><li>利用 Namespace 和其它 Library 相容並存或合作.<br />這是 Namespacing 的擴展應用, 當您的 Library 僅作用在單一 Namespace 時, 您可以將自己的 Library 掛在別的 Library 下. 如 BloggerExt.proccess(); YamUtils.BloggerExt.proccess();<br /></li><li>Don't Extend Native Objects<br />其中, 這點和阿土伯的理念一拍即合, 也是我在 2007/02 之後的所有專案換到 jQuery 的原因. ( 參考: <a href="http://racklin.blogspot.com/2007/01/jquery-javascript-framework.html">jQuery: 又一個非常優秀的 JavaScript Framework.</a> )</li></ul>上述 John Resig 所說的技巧, 也都全部應用在新版本的<a href="http://racklin.blogspot.com/2007/08/jquery-114-release.html"> jQuery 1.1.4, 請參考這篇</a> 中, 有興趣的朋友可以看看 jQuery source code.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-78006483440082837092007-08-23T10:52:00.000+08:002007-08-23T16:01:26.283+08:00ifunP 推推王點播台 / 推文貼紙 支援 funP.com alpha4 嘍就在 funP 展開了 alpha4 改版的<a href="http://pushfun.blogspot.com/2007/08/funp-alpah4-is-coming-soon.html">夏日傳說</a> , 在 2007.08.22 上線嘍!!<br />由於 Alpha4 的改版, 阿土伯愛放屁(<a href="http://racklin.blogspot.com/2007/07/igoogle-funp.html">ifunP</a>)放不出來了..<br />以及<a href="http://racklin.blogspot.com/2007/08/blog-post.html">推推王 堆文貼紙加強版</a> 變的不好看(高度不夠, 原 55 現在 69)..<br />所以都一併更版, 讓阿土伯的小工具也有個美好的夏日傳說...<br /><br />##CONTINUE##<br />ifunP 點播台更新版本:<br />您不需要重新安裝, 由於 iGoogle 會 cache , 應該在 1 - 2 天或更短的時間內即可使用到最新的版本.<br />當然, 若您等不及, 請先將小工具移除, reload Browser , 再加入一次小工具應該就能直接用到更新的版本.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/Rsz5pmAL7sI/AAAAAAAAADg/Ea04Ji5o350/s1600-h/2007-08-23_105908.png"><img style="cursor: pointer;" src="http://bp3.blogger.com/_CYDba-CpZ2k/Rsz5pmAL7sI/AAAAAAAAADg/Ea04Ji5o350/s320/2007-08-23_105908.png" alt="" id="BLOGGER_PHOTO_ID_5101726970875211458" border="0" /></a><br /><a href="http://racklin.blogspot.com/2007/07/igoogle-funp.html">ifunP 點播台 功能介紹及說明</a><br /><br />funP 推文貼紙:<br />您不需要改版任何語法, 已利用原檔案覆蓋更新..<br />若您是自行下載至其它位置, 請您再下載回去.<br /><a href="http://racklin.blogspot.com/2007/08/blog-post.html">推推王 推文按鈕貼紙 加強版介紹及說明</a>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-30587099024910441932007-08-21T10:17:00.001+08:002007-08-21T10:33:49.336+08:00+1 for ClosuresJava7 即將導入 closure 語法, 這個在 Ruby 中非常精巧方便的特性, 即將導入 Java 中, 在許多論壇上造成很大的激辯.<br /><br />對於 Java 是一個成長中的語言. 它會一直的進步以及導入新的語法及特性. 然而, 其中平衡點的拿捏真的就很重要了.<br /><br />Java6 中的 Scripting Language 介面, 以及 JRuby 的成熟, 已經可以讓您在 JVM 中使用 javascript / python / ruby , 其實我們有很多方式可以混合開發應用在我們的專案中.<br /><br />Java7 中導入了 closure 雖可以讓程式語法精簡且較為優雅, 然而, 它變的太 Ruby.<br />阿土伯我不想喝著一杯 "走味的咖啡" 呀~ 即始它鑲上了紅寶石~<br />不過..............<br />##CONTINUE##<br />如果有辣妹站台, 那阿土伯也要加入支持 closure 進入 java7 嘍.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_lfuDZjhLbAM/RsjUjleoCfI/AAAAAAAAACU/IXyIrODh2nM/s1600-h/P8180010.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_lfuDZjhLbAM/RsjUjleoCfI/AAAAAAAAACU/IXyIrODh2nM/s320/P8180010.jpg" alt="" id="BLOGGER_PHOTO_ID_5100560285818161650" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_lfuDZjhLbAM/RsjU8VeoCgI/AAAAAAAAACc/ZRh0eqEGef0/s1600-h/P8180004.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_lfuDZjhLbAM/RsjU8VeoCgI/AAAAAAAAACc/ZRh0eqEGef0/s320/P8180004.JPG" alt="" id="BLOGGER_PHOTO_ID_5100560711019923970" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_lfuDZjhLbAM/RsjVTVeoChI/AAAAAAAAACk/7OAqSfZZogg/s1600-h/P8180009.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_lfuDZjhLbAM/RsjVTVeoChI/AAAAAAAAACk/7OAqSfZZogg/s320/P8180009.jpg" alt="" id="BLOGGER_PHOTO_ID_5100561106156915218" border="0" /></a><br />無關人身攻擊... 不過這位太重量級了, 會讓 java7 的包袱更沈重, 那就免了唄....<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_lfuDZjhLbAM/RsjVuVeoCiI/AAAAAAAAACs/lTnXY4GyHf4/s1600-h/P8180012.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_lfuDZjhLbAM/RsjVuVeoCiI/AAAAAAAAACs/lTnXY4GyHf4/s320/P8180012.jpg" alt="" id="BLOGGER_PHOTO_ID_5100561570013383202" border="0" /></a><br /><br />原文: <a href="http://codetojoy.blogspot.com/2007/08/closures-are-hot.html"><span style="font-weight: bold;"></span>Closures Are Hot</a><br />原文: <a class="entry-title-link" target="_blank" href="http://blogs.sun.com/jag/entry/1_for_closures"><span style="font-weight: bold;"></span>+1 for Closures</a>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-71493267786229056002007-08-14T11:17:00.000+08:002007-08-14T11:41:19.364+08:00blogger_ext2.js 0.6.3 / 0.7.2 修正版發表<div xmlns="http://www.w3.org/1999/xhtml"><br /><font style="font-weight: bold;">0.6.3 / 0.7.2 修正版本發表:</font><br />主要是阿土伯將大家列給我的已知問題修正, 沒有新的功能加入:<br /><br /><font style="font-weight: bold;">changelog:</font><br />* 較新/舊的文章 換頁到第三次後, 表情符號及繼續閱讀功能失效. (fixed)<br />* 表情符號效能修正, 若該內容無符號則不處理. (fixed)<br />* registerHook API 修正 (fixed)<br /> - 使用 Hook API 的 plugin 發生換頁問題, 將一併獲得解決.<br /><br />##CONTINUE##<br />0.6.3 版 all-in-one script <pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/files/blogger_ext2-0.6.3.pack.js' type='text/javascript'></script><br /></code></pre><br /><br />0.6.3 版 核心 script <pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/files/blogger_ext2-core-0.6.3.pack.js' type='text/javascript'></script><br /></code></pre><br /><br />0.7.2 版 目前在 svn 中, 所以不用改變. 隨時會引用到最新版本.<br /><br /><br /><font style="font-weight: bold;"> 表情符號修正版 </font><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/files/plugin_replace_smiley-0.2.pack.js' type='text/javascript'></script><br /></code></pre><br /><br />詳細使用說明:<br /><a href="http://racklin.blogspot.com/2007/01/blogger-jquery-way.html">0.6 版</a><br /><a href="http://racklin.blogspot.com/2007/07/bloggerext2js-070-beta.html">0.7 版</a><br /><br />讓大家久侯了, Sorry and Thanks.<br /><br />Technorati Tags: <a rel="tag" href="http://technorati.com/tag/Blogger" class="performancingtags">Blogger</a>, <a rel="tag" href="http://technorati.com/tag/Javascript" class="performancingtags">Javascript</a>, <a rel="tag" href="http://technorati.com/tag/Programming" class="performancingtags">Programming</a></div>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-11534105084574424452007-08-13T16:21:00.001+08:002007-08-14T11:51:50.506+08:00黑米小按鈕 加強版利用 HEMiDEMi 官方 javascript 改良了一下, 提供一個以 DOM 操作為主的版本.歡迎官方直接引用.<br /><br />加強了以下三點:<br />1. 解決在各 Blog 平台上部份網誌會造成畫面一片白的問題.<br />2. 一顆/多顆 按鈕語法統一.<br />3. 支援 Blogger-ext2, 在 Blogger 系統中換頁, 小按鈕依然能生效.<br />##CONTINUE##<br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >解決畫面一片白:</span><a href="http://groups.google.com/group/blogger-ext2/browse_thread/thread/7cc9108631119f1e?hl=zh-TW"></a><br />其實這個問題同 "推推王 推文按鈕貼紙" , 加了 黑米小按鈕 貼紙後, 有時畫面會一片白. [<a href="http://www.flickr.com/photos/nextplayer/483462607/" target="_blank">出現空白頁</a>]<br />這在 Blogger 系統最為明顯, 因為 Blogger 系統的 Sidebar, 換頁都是使用 javascript 動態 產生, 所以只要在 onload 前, 黑米小按鈕的 javascript 執行到, 而黑米小按鈕的 javascript 僅利用 document.write 產生一個 iframe.這時的 document 就僅剩下一個 iframe , 所以您會得到一片白.<br />請大家忘了 document.write 這個 n 年前的遺產吧.. 以 DOM 來提供小工具.<br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >按鈕語法統一:</span><br />使用此一加強版, 不再分一個按鈕或多個按鈕, 您只要使用單一的語法即可. 而語法中也看不到 javascript , 只是一個 div 的語法, 您可以輕輕鬆鬆放入 黑米小按鈕.<br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >使用方式:</span><br />放在網頁 <head> 位置加入 或 加入 html/javascript 網頁元素:<br />程式碼:<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/hemidemi_bookmark_button2.js' ></script><br /></code></pre><br /><br />放在按鈕位置的<br />程式碼:<br /><pre><code class="html"><br /><div class="hemi_button" style="font-size:0px;"><span style="color: rgb(255, 0, 0);" >網址</span></div><br /></code></pre><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">如果不打就直接用貼紙所在頁面的網址.</span><br /><br /><span style="color: rgb(0, 0, 153);font-size:130%;" ><span style="font-weight: bold;">就是這麼容易, 不管幾顆都是一樣.</span></span><br /><br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >如何在 Blogger 系統中使用:</span><br />1.範本 => 版面配置 => 修改 HTML => 勾選「展開小裝置範本」 => 在 </head> 前加入<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/hemidemi_bookmark_button2.js' ></script><br /></code></pre><br />2. 找到 <p><data:post.body/><p> 在 <p><data:post.body/><p> 前加入按鈕語法<br /><pre><code class="html"><br /><div style='float:right; margin-left:10px; font-size:0px;' class="hemi_button"><data:post.url/></div><br /></code></pre><br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >如何在天空(yam) 系統中使用:</span><br />1.管理者後台 => 功能設定 => 個人資料 => 部落格描述: 中填入<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/hemidemi_bookmark_button2.js' ></script><br /></code></pre><br />2. 在發表網址時, 在 "追加內容" 加入按鈕語法<br /><pre><code class="html"><br /><div style='float:right; margin-left:10px; font-size:0px;' class="hemi_button"></div><br /></code></pre><br />3. <a href="http://blog.yam.com/racklin/article/8502611" target="_blank">sample</a>.<br /><br />詳細參數及使用說明可參考 <a href="http://www.hemidemi.com/blog/?p=114" target="_blank">[功能] 黑米小按鈕</a><br /><br />PS. 推推王推文按鈕也是存在相同的問題. <a href="http://racklin.blogspot.com/2007/08/blog-post.html" target="_blank">請看這裡</a>.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-38721012426077720662007-08-13T14:37:00.000+08:002007-08-13T15:30:58.238+08:00ifunP 推推王點播台 可直接推文嘍在修改 <a href="http://racklin.blogspot.com/2007/08/blog-post.html">推推王 推文按鈕貼紙 加強版</a> 之餘, 順便把阿土伯考慮很久的 <a href="http://racklin.blogspot.com/2007/07/igoogle-funp.html">ifunP 點播台</a> 加上了直接推文功能. 現在大家可以直接在 iGoogle 中利用 ifunP 點播台小工具直接推文嘍.<br /><br /><a href="http://racklin.blogspot.com/2007/07/igoogle-funp.html">ifunP 點播台 功能介紹及說明</a>.<br /><br />希望大家會喜歡.<br />##CONTINUE##<br />有圖有真相:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_CYDba-CpZ2k/Rr_9I9hMPMI/AAAAAAAAADY/REGYO-ZBWBo/s1600-h/2007-08-13_143525.png"><img style="cursor: pointer;" src="http://bp0.blogger.com/_CYDba-CpZ2k/Rr_9I9hMPMI/AAAAAAAAADY/REGYO-ZBWBo/s320/2007-08-13_143525.png" alt="" id="BLOGGER_PHOTO_ID_5098071633601248450" border="0" /></a><br /><br /><br /><span style="font-style: italic;font-size:100%;" >PS. 考慮原因我在 <a href="http://twitter.com/racklin/statuses/175493012">這裡</a> 有 唸到, 我是覺得大家還是要連回 funP 原始網站, 支持原網站才對.<br />怕加了直接推文會影響 funP 的流量.. 那就不是阿土伯的本意了..<br />後來想想, 應該影響不大, 大部份的人不會看到 "標題" 就 "推" 下去的, 還是會連回去看才對.<br /></span>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-77340103295193813412007-08-13T09:50:00.000+08:002007-08-14T11:51:46.562+08:00推推王 推文按鈕貼紙 加強版利用推推王官方 javascript 改良了一下, 提供一個以 DOM 操作為主的版本.歡迎官方直接引用.<br /><br />加強了以下二點:<br />1. 解決在各 Blog 平台上部份網誌會造成畫面一片白的問題.<br />2. 一顆/多顆 按鈕語法統一.<br />3. 支援 Blogger-ext2, 在 Blogger 系統中換頁, 小按鈕依然能生效.<br /><br />##CONTINUE##<br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >解決畫面一片白:</span><a href="http://groups.google.com/group/blogger-ext2/browse_thread/thread/7cc9108631119f1e?hl=zh-TW"></a><br />由於已有許多網友反應, 加了 推推王 推文按鈕貼紙 後, 有時畫面會一片白.<br /><a href="http://leelevis.blogspot.com/2007/08/blogger.html" id="title_a_16386" onclick="return preview('http://leelevis.blogspot.com/2007/08/blogger.html',16386)">在Blogger加入推推王按鈕導致不明反白的解法</a> , <a href="http://groups.google.com/group/blogger-ext2/browse_thread/thread/12d5cc8283fce87e?hl=zh-TW">問題2</a>, <a href="http://groups.google.com/group/blogger-ext2/browse_thread/thread/7cc9108631119f1e?hl=zh-TW">問題3</a><br />這在 Blogger 系統最為明顯, 因為 Blogger 系統的 Sidebar, 換頁都是使用 javascript 動態 產生, 所以只要在 onload 前, 推推王的 javascript 執行到, 而推推王的 javascript 僅有三行, 也就是利用 document.write 產生一個 iframe.這時的 document 就僅剩下一個 iframe , 所以您會得到一片白.<br />請大家忘了 document.write 這個 n 年前的遺產吧.. 以 DOM 來提供小工具.<br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >按鈕語法統一:</span><br />使用此一加強版, 不再分一個按鈕或多個按鈕, 您只要使用單一的語法即可. 而語法中也看不到 javascript , 只是一個 div 的語法, 您可以輕輕鬆鬆放入 推推王推文按鈕.<br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >使用方式:</span><br />放在網頁 <head> 位置加入 或 加入 html/javascript 網頁元素:<br />程式碼:<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/funp_button2.js' ></script><br /></code></pre><br /><br />放在按鈕位置的<br />程式碼:<br /><pre><code class="html"><br /><div class="funp_button" style="font-size:0px;"><span style="color: rgb(255, 0, 0);">網址</span></div><br /></code></pre><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">如果不打就直接用貼紙所在頁面的網址.</span><br /><br /><span style="color: rgb(0, 0, 153);font-size:130%;" ><span style="font-weight: bold;">就是這麼容易, 不管幾顆都是一樣.</span></span><br /><br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >如何在 Blogger 系統中使用:</span><br />1.範本 => 版面配置 => 修改 HTML => 勾選「展開小裝置範本」 => 在 </head> 前加入<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/funp_button2.js' ></script><br /></code></pre><br />2. 找到 <p><data:post.body/><p> 在 <p><data:post.body/><p> 前加入按鈕語法<br /><pre><code class="html"><br /><div style='float:right; margin-left:10px; font-size:0px;' class="funp_button"><data:post.url/></div><br /></code></pre><br />style 說明可參考 <a href="http://nobodysearch.blogspot.com/2007/07/funp-button-on-blogger.html">funP Button On Blogger</a><br /><br /><span style="font-weight: bold; color: rgb(255, 102, 0);font-size:130%;" >如何在天空(yam) 系統中使用:</span><br />1.管理者後台 => 功能設定 => 個人資料 => 部落格描述: 中填入<br /><pre><code class="html"><br /><script src='http://blogger-ext2.googlecode.com/svn/trunk/3rd/funp_button2.js' ></script><br /></code></pre><br />2. 在發表網址時, 在 "追加內容" 加入按鈕語法<br /><pre><code class="html"><br /><div style='float:right; margin-left:10px; font-size:0px;' class="funp_button"></div><br /></code></pre><br />3. <a href="http://blog.yam.com/racklin/article/8502611" target="_blank">sample</a>.<br /><br /><br />PS. 黑米小按鈕也是存在相同的問題. <a href="http://www.hemidemi.com/bookmark/info/608787#comment_83786" target="_blank">請看這篇留</a>.Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-1784217508842559742007-08-10T15:01:00.000+08:002007-08-10T17:39:26.469+08:00iGoogle 自動翻譯小工具真有趣剛才在使用 <a href="http://www.google.com.tw/ig/directory?hl=zh-TW&url=dictionary.xml">iGoogle 自動翻譯</a> 小工具, 試著想把一篇英文技術文件轉成中文, 看看會不會看的快一點, 發現翻出來好有趣.. 真是讓阿土伯充滿驚奇呀~~<br /><br />惡搞玩玩看, 輸入 <span style="font-weight: bold; color: rgb(0, 0, 153);">Rack Lin</span>, Rack = 機架(電腦述語), Lin = 林<br />##CONTINUE##<br />所以 <span style="font-weight: bold; color: rgb(0, 0, 153);">Rack Lin</span> = 機架林 嘍.. 嘿嘿.... 這麼容易讓你猜中, 就不是 Google 了.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_CYDba-CpZ2k/RrwOddhMPII/AAAAAAAAAC4/34DF3jcoGgw/s1600-h/2007-08-10_145905.png"><img style="cursor: pointer;" src="http://bp3.blogger.com/_CYDba-CpZ2k/RrwOddhMPII/AAAAAAAAAC4/34DF3jcoGgw/s400/2007-08-10_145905.png" alt="" id="BLOGGER_PHOTO_ID_5096964777579396226" border="0" /></a><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">答案是: 林齒條 , 齒條咧... 讓阿土伯好想哭....</span><br /><br />輸入: <span style="font-weight: bold; color: rgb(0, 0, 153);">I am Rack Lin</span> 應該是我是林齒條嘍, 嘿嘿.... 就說這麼容易讓你猜中, 就不是 Google 了嘛.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_CYDba-CpZ2k/RrwO9NhMPJI/AAAAAAAAADA/1qO-lnoGqdc/s1600-h/2007-08-10_145937.png"><img style="cursor: pointer;" src="http://bp2.blogger.com/_CYDba-CpZ2k/RrwO9NhMPJI/AAAAAAAAADA/1qO-lnoGqdc/s400/2007-08-10_145937.png" alt="" id="BLOGGER_PHOTO_ID_5096965323040242834" border="0" /></a><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">答案是: 我機架林.... 又正常了?聽起來舒服點...</span><br /><br />來惡搞一下小土仔的名子吧: <span style="font-weight: bold; color: rgb(0, 0, 153);">Shine Lin</span> 是 發光林, 陽光林, 或閃耀林 嗎???<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_CYDba-CpZ2k/RrwPb9hMPKI/AAAAAAAAADI/k9YUsJVJWKQ/s1600-h/2007-08-10_150006.png"><img style="cursor: pointer;" src="http://bp1.blogger.com/_CYDba-CpZ2k/RrwPb9hMPKI/AAAAAAAAADI/k9YUsJVJWKQ/s400/2007-08-10_150006.png" alt="" id="BLOGGER_PHOTO_ID_5096965851321220258" border="0" /></a><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">答案是: 林光輝 ... 好個菜市場名呀~~~</span><br /><br />輸入: <span style="font-weight: bold; color: rgb(0, 0, 153);">I am Shine Lin</span> 應該是我是林光輝嘍...<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_CYDba-CpZ2k/RrwPvNhMPLI/AAAAAAAAADQ/MbQJsUTxUZs/s1600-h/2007-08-10_150032.png"><img style="cursor: pointer;" src="http://bp2.blogger.com/_CYDba-CpZ2k/RrwPvNhMPLI/AAAAAAAAADQ/MbQJsUTxUZs/s400/2007-08-10_150032.png" alt="" id="BLOGGER_PHOTO_ID_5096966182033702066" border="0" /></a><br /><span style="color: rgb(255, 0, 0); font-weight: bold;">答案是: 我照林... 哇咧... 這是啥....</span><br /><br /><span style="font-weight: bold;font-size:130%;" >Google 自動翻譯小工具, 我真是猜不透您呀~~~</span> :)Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comtag:blogger.com,1999:blog-623037388172682225.post-19339985250442719042007-08-08T17:20:00.000+08:002007-08-08T17:47:43.913+08:00iGoogle Easy Layout 更新~由於 iGoogle Render Html 於 2007/08/08 做小改版, 導致原 EasyLayout 無法作用, 阿土伯已於第一時間配合改版, 已能相容目前的 iGoogle 了.<br /><br /><span style="font-weight: bold; color: rgb(255, 0, 0);">阿土伯已上傳更新版本, 所以您無需重裝小工具, 然而由於 iGoogle 會 Cache 小工具, 所以請您耐心等侯, 小工具會於 Cache 失效時, 自動套用新版本.</span><br /><br />使用說明, 請見 <a href="http://racklin.blogspot.com/2007/07/igoogle-easy-layout.html" target="_blank">EasyLayout</a> 簡介.<br /><br />PS. iGoogle 會對此一部份改版, 是否意味著, 未來 iGoogle 將內建調整欄位的功能.. 樂見其成 :D<br />PS2. 出現了 c_4 又意味著有四欄的配置?<br />##CONTINUE##<br />技術部份:<br />原 iGoogle Render Html Layout: 所以 EasyLayout 僅需覆寫 CSS Style 重定義 c_1, c_2, c_3 即可.<br /><pre><code><br /><div id="c_1" class="yui-u" style="display: block;"><br /><div id="c_2" class="yui-u" style="display: block;"><br /><div id="c_3" class="yui-u" style="display: block;"><br /></code></pre><br />新 iGoogle Render Html Layout: c_1,c_2,c_3 width 強制出現在 HTML 中, 又取代了 EasyLayout CSS Style , 所以輔以 DOM 方式設定屬性.<br /><pre><code><br /><div id="c_1" class="yui-u" style="width: 32%; display: block;"><br /><div id="c_2" class="yui-u" style="width: 32%; display: block;"><br /><div id="c_3" class="yui-u" style="width: 32%; display: block;"><br /></code></pre>Rack Linhttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com