tag:blogger.com,1999:blog-6230373881726822252024-03-21T14:02:36.051+08:00Racklin's 阿土伯程式大觀園在這裡寫下我對程式設計相關的心得及筆記.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.comBlogger95125tag:blogger.com,1999:blog-623037388172682225.post-44335798816782375182013-09-12T10:51:00.001+08:002013-09-12T11:27:13.138+08:00LiveScript do keyword<p>LiveScript 眾多的語法糖衣中, <code>do</code> 算是被附加最多功能的 keyword .
所以整理一下目前已知的用法備忘。</p><h2 id="1-execute" class="wmd-title">1. execute</h2>
<p>如同 <code>do</code> 字面的意思,就是執行。後面可以跟的是 Function or Array .</p>
<h3 id="do-function" class="wmd-title">do Function</h3>
<p>如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="com"># anonymous function</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="pun">-></span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="com"># named function</span><span class="pln">
a </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-></span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> a
</span><span class="com"># declare named function and execute it</span><span class="pln">
</span><span class="kwd">do</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> f
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span></code></pre>
<p>會產生出</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="com">// anonymous function</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(){</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">})();</span><span class="pln">
</span><span class="com">// named function</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
a </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
a</span><span class="pun">();</span><span class="pln">
</span><span class="com">// declare named function and execute it</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> f</span><span class="pun">(){</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> f</span><span class="pun">();</span></code></pre>
<p>
由上列可知 <code>do</code> 非常聰明,它能依 anonymous 或是 named Function 決定產生出的 javascript 語法。</p>
<p>而 <code>do</code> 後面跟一個 anonymous 非常方便,很適合使用來將一段程式碼包起來,將變數變成區域變數(local scope variables),好處就是避免變數外漏(expose variables).</p>
<h3 id="do-array" class="wmd-title">do Array</h3>
<p>如果 <code>do</code> 後面跟著是 Array , 而 Array 內的元素是可呼叫(callable), 則 <code>do</code> 會執行 Array 內每一個元素。</p>
<p>如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="kwd">do</span><span class="pln"> </span><span class="pun">[</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">]</span></code></pre>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">a</span><span class="pun">(),</span><span class="pln"> b</span><span class="pun">(),</span><span class="pln"> c</span><span class="pun">();</span></code></pre><h2 id="2-omit-parentheses" class="wmd-title">2. omit parentheses</h2>
<p>LiveScript Coding Style 建議我們能省略 parentheses (),就量省略。所以我們可以利用 <code>do</code> 來做到。</p>
<h3 id="implicit-object" class="wmd-title">implicit object</h3>
<p>如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">func </span><span class="kwd">do</span><span class="pln">
a</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
b</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span></code></pre>
<p>會產生</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">func</span><span class="pun">({</span><span class="pln">
a</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
b</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="pun">});</span></code></pre>
<h3 id="list" class="wmd-title">list</h3>
<p>如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">func </span><span class="kwd">do</span><span class="pln">
a
b
</span><span class="com"># 經常使用在 callback, error_callback</span><span class="pln">
func </span><span class="kwd">do</span><span class="pln">
</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-></span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="pun">(</span><span class="pln">err</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-></span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span></code></pre>
<p>會產生</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">func</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 經常使用在 callback, error_callback</span><span class="pln">
func</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">data</span><span class="pun">){</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">err</span><span class="pun">){</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></code></pre><h2 id="3-backcalls" class="wmd-title">3. Backcalls</h2>
<p>由於 LiveScript backcalls ,省略了內縮,讓 async callback 程式碼較容易閱讀,也因為省略內縮,如果你某段 code 要在 backcall 後執行就無法做到,這時需要利用 <code>do</code> 。</p>
<p>如官方範例:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="kwd">do</span><span class="pln">
data </span><span class="pun"><-!</span><span class="pln"> $</span><span class="pun">.</span><span class="kwd">get</span><span class="pln"> </span><span class="str">'ajaxtest'</span><span class="pln">
$ </span><span class="str">'.result'</span><span class="pln"> </span><span class="pun">.</span><span class="pln">html data
processed </span><span class="pun"><-!</span><span class="pln"> $</span><span class="pun">.</span><span class="kwd">get</span><span class="pln"> </span><span class="str">'ajaxprocess'</span><span class="pun">,</span><span class="pln"> data
$ </span><span class="str">'.result'</span><span class="pln"> </span><span class="pun">.</span><span class="pln">append processed
alert </span><span class="str">'hi'</span></code></pre>
<p>產生:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">$</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'ajaxtest'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">data</span><span class="pun">){</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.result'</span><span class="pun">).</span><span class="pln">html</span><span class="pun">(</span><span class="pln">data</span><span class="pun">);</span><span class="pln">
$</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'ajaxprocess'</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">processed</span><span class="pun">){</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.result'</span><span class="pun">).</span><span class="pln">append</span><span class="pun">(</span><span class="pln">processed</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
alert</span><span class="pun">(</span><span class="str">'hi'</span><span class="pun">);</span></code></pre><h2 id="4-do-while-loop" class="wmd-title">4. Do while loop</h2>
<p>相容 javascript 的 do-while 迴圈語法</p>
<p>如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="kwd">do</span><span class="pln">
i</span><span class="pun">++</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> i</span><span class="pun"><</span><span class="lit">5</span></code></pre>
<p>產生:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="kwd">do</span><span class="pln">
i</span><span class="pun">++</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> i</span><span class="pun"><</span><span class="lit">5</span></code></pre>
<h2 id="5-code-block" class="wmd-title">5. code block</h2>
<p>沒什麼特別作用,如同你在 javascript 中的 {} .
如:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="kwd">do</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="kwd">do</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span></code></pre>
<p>產生:</p>
<pre style="" class="prettyprint prettyprinted"><code><span class="kwd">var</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span></code></pre>
<blockquote>
<p>Written with <a href="http://benweet.github.io/stackedit/">StackEdit</a>.</p>
</blockquote>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag:blogger.com,1999:blog-623037388172682225.post-61019114080507044812013-07-15T16:48:00.000+08:002013-07-15T16:48:41.700+08:00LiveScript - tax-free javascript由 <a href="https://twitter.com/clkao/" target="_blank">clkao</a> 在 CUSCOP 2012 介紹的 "LiveScript - tax-free JavaScript" , 我到了 2013 的 HDM 聚會,才經由他介紹才知道,一看真是驚為天人,真是才疏學淺。<br />
<br />
對於正在使用 JavaScript 或 CoffeeScript 為解決方案的朋友,可以考慮試試 LiveScript <a href="http://livescript.net/">http://livescript.net/</a> .<br />
<br />
由於目前使用者相對於 CoffeeScript 算少,所以很多工具尚很欠缺,請有志青年一起捲起袖子來開發。<br />
<br />
目前阿土伯進行的是 LiveScript JetBrains IDEs(IntelliJ , PHPStorm, WebStorm, RubyMine, PyCharm) 的支援。<br />
Source Code hosting 在 Github <a href="https://github.com/racklin/livescript-idea">https://github.com/racklin/livescript-idea</a> .<br />
<br />
<br />
clkao 精彩的 LiveScript - tax-free Javascript 簡報:<br />
<br />
<script async="" class="speakerdeck-embed" data-id="5030a6d7edfca800020280a7" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>
Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag:blogger.com,1999:blog-623037388172682225.post-36582720272561271172013-07-15T16:09:00.000+08:002013-07-15T16:58:44.044+08:00改善 Programmer 生活的 SQL 技巧在 Ruby Tuesday #24 應邀的一場 Lightning Talk.<br />
<br />
現在工程師在面對大量方便易用的 MVC Framework 之餘,也應了解 ORM 背後的機制以及 SQL 相關的技巧。<br />
<br />
錄影:<a href="http://www.youtube.com/watch?v=CnJf_KVTfA0">http://www.youtube.com/watch?v=CnJf_KVTfA0</a>
<br />
<br />
簡報檔:
<br />
<script async="" class="speakerdeck-embed" data-id="571859e0c4c00130c82d2e39027463f9" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag:blogger.com,1999:blog-623037388172682225.post-45135593663141882782011-08-30T09:15:00.000+08:002011-08-30T09:15:52.809+08:00將 jQuery 及 blogger-ext2 由 Blogger 移除了至今還有部份使用者來信問問題, 感謝大家的對 blogger-ext2 的支持及不離不棄, 不過建議大家棄了它吧!<br />
<br />
由於 blogger.com 目前已經將大部份的功能都已內建了, 所以該專案已經沒有存在的必要了, 所以建議有在使用的朋友, 請直接使用 blogger.com 內建的 "繼續閱讀" "標籤雲" "社群分享按鈕" 功能!<br />
<br />
<br />
Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag:blogger.com,1999:blog-623037388172682225.post-75396511813218004232011-04-08T23:18:00.002+08:002011-08-30T09:46:00.358+08:00為 Thinkpad T61 Debian Linux 換上 SSD由於身邊越來越多的朋友以及 Twitter 上的朋友換了 MacBook Air, 整體表現, 真的只能用 "輕""快" 二字形容. 讓我也很心動, 想把服役多年的 Thinkpad T61 換掉, 換成 MacBook Air 13" .<br />
在比較 <a href="http://www.apple.com/why-mac/compare/">MacBook Air 規格</a> 以及 <a href="http://www.thinkwiki.org/wiki/Category:T61">T61 規格</a> 後, 冷靜想想, MBA 及 T61 有著差距不大的 Intel Core 2 Duo 2.x CPU 及同樣是 Nvidia Graphic .<br />
由於目前使用的 <a href="http://www.linuxmint.com/download_lmde.php">LMDE 64</a> 加上 <a href="http://liquorix.net/">Liquorix Kernel</a> 其實也夠快了, 開機 15-20s, 程式也沒什麼太慢的感覺, 那麼, 唯一的效能爆點就在 SSD 了, 就這樣, 開始網購相關的昇級配件了. (看來短時間我不會由小黑變小銀了)<br />
<br />
<a name='more'></a><br />
<b>SSD 的選擇</b><br />
本來是要選擇號稱藍星最快的 OCZ 版 SSD, 但是在 OCZ <a href="http://www.pceva.com.cn/html/2011/storgetech_0313/215_4.html">爆出</a>了<a href="http://blog.macsales.com/9438-not-all-ssd%E2%80%99s-are-created-equal-the-story-continues">誠信</a>問題, 連大廠都這麼硬幹, 那還是買安全牌 Intel 的好了, 由於 Intel 新的 310 , 520 series 剛推出, 所以相對的 X25M series 就成了 C/P 值很高的選擇! 就決定是你了, Intel X25M .<br />
<br />
<b>解除小黑 ICH8M 封印</b><br />
由於小黑使用的 ICH8M 晶片, 其實是支援 SATA2 的, 但由於 IBM 官方的 BIOS 將它限制在 SATA1 也就是 1.5Gb/s , 所以我們需要 <a href="http://forum.notebookreview.com/lenovo-ibm/459591-t61-x61-sata-ii-1-5-gb-s-cap-willing-pay-solution-8.html#post6501443">第三方的 BIOS Patch</a> 來讓它支援 SATA2 3.0Gb/s 的速度. (注意, 使用非官方 BIOS 可能會破壞原廠保固條約, 請自行衡量)<br />
<br />
<b>Partition Alignment</b><br />
由於 <a href="http://en.wikipedia.org/wiki/Solid-state_drive">SSD</a> 的結構和傳統的硬碟差異很大, 所以在效能優化上面, <a href="https://wiki.archlinux.org/index.php/SSD#Tips_for_Maximizing_SSD_Performance">Partition Alignment</a> 就非常的重要(阿土伯機器上, 在 X25M 上會影響到 Automatic TRIM 是否生效).<br />
一開始踩到個雷, 只是簡單參考 <a href="https://wiki.ubuntu.com/MagicFab/SSDchecklist">Ubuntu SSD Checklist</a> 來設定, 利用 fdisk 來切割, 結果是錯的.!!!這是個雷!!!.<br />
如果要利用 fdisk 工具, 請參考 <a href="http://www.nuclex.org/blog/personal/80-aligning-an-ssd-on-linux">Aligning an SSD on Linux</a> 或 <a href="https://wiki.archlinux.org/index.php/SSD_Memory_Cell_Clearing#Post_Process_Observation">這裡</a><br />
. 如果不想麻煩, 就使用 gdisk (gnu fdisk) 工具, 它會自動為您對齊.<br />
<br />
<b>Automatic TRIM</b><br />
在 Linux 目前 EXT4 和 BTRFS 都可以支援 SSD 的 ATA_TRIM , 為了穩定考量, 我選擇老朋友 EXT4, 接著只要在 mount option 中加上 discard 即可.<br />
詳細可以參考這篇 <a href="https://sites.google.com/site/lightrush/random-1/howtoconfigureext4toenabletrimforssdsonubuntu">Howto</a>.<br />
一切似乎完美, 想必您和阿土伯一樣, 想知道 Automatic TRIM 是否真的有生效, <br />
可以參考這篇 <a href="https://sites.google.com/site/lightrush/random-1/checkiftrimonext4isenabledandworking">Howto</a> , 如果您利用 hdparm -I /dev/sdx 確實您的 SSD 支援 TRIM , 而在檔案刪除後, 利用 hdparm --read-sector 郤沒有得到一堆的00, 不用緊張(當然我很緊張), 檢查一下您的 Partition 是否沒有對齊, 或是查看一下您的 Linux kernel 是否 >2.6.33 .<br />
<br />
<b>Journaling</b><br />
大部份的 Linux on SSD 文件都要您關閉 journal , 可以降低 IO 的量, 增加 SSD 的壽命, 但是相對的, 對於檔案因不正常原因斷電或當機損壞機率也增加, 對於阿土伯來說, X25M 保固三年, 且如果由正常壽命 7-8 年降成 5-6 年(T61 應該不會再用三年了吧!!), 也比我的資料或程式碼損壞來的好多了, 那可是會降低阿土伯我的壽命呀~~~~<br />
<br />
<b>Performance Tuning</b><br />
這部份我調整的大致依 WIKI 上所說, 將 I/O Scheduler 改成 noop .<br />
以及將 /tmp 使用 tmpfs 代替.<br />
<br />
<br />
目前, 由 GRUB2 按下 [ENTER] 到 gdm3 出現大約是 10 秒左右, 執行相關的程式<br />
啟動時間也大幅縮短, 尤其是 Java 相關的 IDE 更是明顯..<br />
目前除了 "輕" 是先天因素沒的和 MBA 比外, 使用上速度的流暢性上, <br />
T61 又重新證明它老當益壯, 要再陪我征戰程式設計老宅這條路.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag:blogger.com,1999:blog-623037388172682225.post-64193575657967077412011-01-05T10:34:00.001+08:002011-01-20T10:57:50.108+08:00ePubConv.mobi 中文電子書簡繁轉換服務<b> <a href="http://epubconv.mobi/">http://epubconv.mobi/</a> 電子書簡繁互轉網站開張!</b><br />
<br />
由於本身是 Kindle 3 的使用者, 除了技術文件和大量免費的英文書之外.<br />
其實有不少的中文資源可以下載到書, 像是 <a href="http://www.haodoo.net/">好讀網站</a> 或是 <a href="http://www.cnepub.com/index/">掌上书苑</a> .<br />
<br />
所以相信大家和我一樣會希望能方便的在 簡->繁 或 繁->簡 將下載的 .epub 轉換, 以自己最習慣的文字閱讀.<br />
然而除了編碼的轉換外, 更支援詞庫的轉換, 因為簡體字一個字可能對映到多個繁體字(如: 干, 后)<br />
<br />
<b>功能</b><br />
<br />
* 支援多種字元編碼: GB2312 , BIG5 , UTF8<br />
* 不只編碼轉換, 更是正體和簡體中文文字翻譯: ex. 后天,皇后, 主干, 干净 - 後天,皇后, 主幹, 乾淨<br />
* 部份成語支援: ex. 独占鳌头 - 獨佔鰲頭<br />
<br />
<br />
於是我利用年假做了這個服務, 希望能方便大家能有個更愉快的閱讀體驗!<br />
當然, epub 電子書不是只有在 Kindle 上能用, iPad / Android / Windows / Linux 上都有相關的閱讀程式.<br />
<br />
<b>參考:</b><br />
手動轉換或利用 convertZ 工具, 可參考以下文章<br />
<a href="http://jeremy.tfeng.org/?p=327">如何將ePub電子書繁體化(簡體化)</a>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com9tag:blogger.com,1999:blog-623037388172682225.post-60869725135934847282010-03-02T16:10:00.008+08:002011-08-30T09:45:23.956+08:00CPU frequency selector by dmenu on Ubuntu由於目前改用 <a href="http://awesome.naquadah.org/">awesome window manager</a> 取代了 GNOME Desktop , 所以很多"好用"的 Panel Applets 不能使用了.<br />
<br />
尤其是 cpufreq-selector 這個對 Laptop 很常用的 applet 不能用, 實在很可惜.<br />
所以, 利用 dmenu (part of dwm-tools) 來刻一個簡單的 cpufreq-selector.<br />
<br />
<br />
<b>ScreenShot</b>:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTze98KrJ7wlUCl9kIC19XJtKwV8bVED7_8tmH-d64_RjYefjlqxkSyE05GDl5XA_hNEPRqQWRyDXCtl0G1ik-j-Au4SvkKolaDAqxczprbLCp7ayNLAmr8qDrdSNo3BHEdlcsNTsLxWM/s1600-h/screenshot_007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="14" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTze98KrJ7wlUCl9kIC19XJtKwV8bVED7_8tmH-d64_RjYefjlqxkSyE05GDl5XA_hNEPRqQWRyDXCtl0G1ik-j-Au4SvkKolaDAqxczprbLCp7ayNLAmr8qDrdSNo3BHEdlcsNTsLxWM/s640/screenshot_007.png" width="640" /></a></div><br />
<a name='more'></a><br />
<br />
<b>安裝 dmenu:</b><br />
<pre><code class="bash">
sudo apt-get install dwm-tools
</code>
</pre><br />
<br />
<br />
<b>撰寫 cpufreq script:</b><br />
<a href="https://docs.google.com/leaf?id=0BxRk4nzRGBJXNjlkZTIyZmQtOTYwNS00ODU4LTg1YzMtZDUxN2IwZjMyNWUz&hl=zh_TW" target="_blank">或可以由此下載.</a><br />
<pre><code class="bash">
#!/bin/sh
cur_governor=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`
avail_governors=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors`
# using dmenu to select cpu governor
cpu_governor=$(for i in $avail_governors ;do
if [ $cur_governor = $i ]; then
echo "[$i]"
else
echo $i
fi
done | dmenu -p "Select CPU Governor: "| sed "s/\[\([a-z|A-Z]*\)\]/\1/g")
if [ -n "$cpu_governor" ]; then
for cpu in `ls -d /sys/devices/system/cpu/cpu?` ; do
cpu_num=`basename $cpu | sed "s/cpu//"`
cpufreq-selector -c $cpu_num -g $cpu_governor
done
fi
</code>
</pre><br />
<br />
<br />
<b>關閉 cpufreq-selector 每次必需輸入密碼(如果你覺得煩):</b><br />
修改 /usr/share/polkit-1/actions/org.gnome.cpufreqselector.policy <br />
<pre><code class="bash">
gksudo gedit /usr/share/polkit-1/actions/org.gnome.cpufreqselector.policy
</code>
</pre><br />
找到原始:<br />
<pre><code class="xml">
<defaults>
<allow_inactive>no</allow_inactive>
<allow_active>auth_admin_keep</allow_active>
</defaults>
</code>
</pre><br />
<br />
修改成:<br />
<pre><code class="xml">
<defaults>
<allow_inactive>no</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
</code>
</pre>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag:blogger.com,1999:blog-623037388172682225.post-11039696564833065952010-02-16T21:42:00.002+08:002010-02-16T21:48:14.393+08:00新年快樂~大家久違了!<span style="font-weight:bold;">新年快樂!</span><br /><br />看著上一篇更新, 足足有一年之久了!<br />其間,除了工作的異動, 最大的改變是家中又多了一位新的成員..<br /><br />二個成員, 把阿土伯壓的沒力氣寫文章了... <br /><br />看到 Mark (<a href="http://blog.markplace.net/marks_place/11/2009/12/30/406">一灘死水</a>) 這篇, <br />不津笑了出來.. 原來新手爸媽都是一樣.. 連網誌更新變慢的藉口都相同.<br /><br />總之, 今年的目標就是能定時更新網誌.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag:blogger.com,1999:blog-623037388172682225.post-868507158675559202008-11-09T15:01:00.001+08:002008-11-09T15:01:32.386+08:00Ubuntu 8.10 at Thinkpad T61<div xmlns='http://www.w3.org/1999/xhtml'>前幾天把 <a href='http://www.ubuntu.com/' target='_blank'>Ubuntu 8.10 Desktop Edition 64Bit</a> 版本昇級.<br/>昇級方法可以參考官方的這篇說明: <a href='http://www.ubuntu.com/getubuntu/upgrading' target='_blank'>http://www.ubuntu.com/getubuntu/upgrading</a><br/><br/>基本上所有 T61 上的硬體都能正確抓到, 包含先前提到的 Intel 4965AGN wireless LED 也一併改善解決.<br/><br/>然而 nvidia driver 由於 restricted driver 內建是 177.80 , 所以踩到了一個雷.<br/><br/><span style='font-weight: bold; font-size: 110%;'><br/>無法登出或 Ctrl+Alt+Backspace:</span><br/>[G86GL] Latest NVIDIA drivers: X hangs with blank screen after logout. <br/>阿土伯採用的是延長 GDM 等待 nvidia driver 回應的時間.<br/>也就是請修改 /etc/gdm/gdm.conf 中的 GdmXserverTimeout 將它加大到 30 以上, 阿土伯目前使用 40.<br/>沒有太大問題再發生.<br/><br/><br/><span style='font-weight: bold; font-size: 110%;'>2D performance 太慢:</span><br/>nvidia driver 在 linux 上 2D 效能一直不怎麼樣, 當然官方也一直在改進, 由於 8.10 直接跳到了 177.80 版, 所以可以<br/>使用一些新的設定, 可以參考: <a href='http://www.nvnews.net/vbulletin/showthread.php?t=115916' target='_blank'>http://www.nvnews.net/vbulletin/showthread.php?t=115916</a> 討論串.<br/>或直接在 /etc/X11/xorg.conf 加入 <br/>Option "PixmapCacheSize" "1000000"<br/>Option "AllowSHMPixmaps" "0" <br/><br/>並在 ~/.gnomerc 加入<br/>nvidia-settings -a InitialPixmapPlacement=2 -a GlyphCache=1<br/><br/>可以獲得很大的改善. <br/>可以利用 firefox 打開 addons 管理視窗, 然後利用 mouse wheel scroll 看看差別有多大...<br/><br/><br/><br/><br/></div>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag:blogger.com,1999:blog-623037388172682225.post-24597638179649381472008-09-16T09:55:00.001+08:002008-09-16T09:56:39.509+08:00iGoogle Tab RSS 小工具 Bug Fixed<div xmlns='http://www.w3.org/1999/xhtml'>感謝幾位網友的提醒, 阿土伯忘了現在 iGoogle 已不建議並(禁用?) html-inline 的 content 了..<br/>所以造成了幾個小工具已不能使用.. 已修復完異.. 謝謝大家愛用..<br/><br/>什麼是 Tab RSS 請見下圖及參考說明:<br/><img src='http://racklin.googlepages.com/tabrss_tw_s.png'/><br/><br/>使用說明及介紹:<br/><a href='http://racklin.blogspot.com/2007/07/igoogle-tab-rss.html' target='_blank'>iGoogle Tab RSS 小工具</a><br/><br/><br/></div>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com1tag:blogger.com,1999:blog-623037388172682225.post-1650709989634476902008-09-01T10:56:00.002+08:002008-09-03T11:48:19.033+08:00李斯諫逐客書<div xmlns='http://www.w3.org/1999/xhtml'>學生時唸到的古文, 沒想到在現在會這麼有感覺. <br />本土/外來/挺誰/嗆誰/反誰/護誰 一再操作這樣議題昇高人民對立是否得宜...<br />政治也是一種專業, 程式設計亦然.<br />當批評別人的設計有問題時, 能謙虛的自省自己的專業, 是否也出現了相同的問題, 並容納多元的意見以及不同團隊間的合作...<br />共勉之~<br /><br />##CONTINUE##<br /><br />李斯諫逐客書 李 斯<br /> 秦宗室大臣皆言秦王曰:「諸侯人來事秦者,祇為其主遊間秦耳,請一切逐客。」李斯<br />議亦在逐中。斯乃上書曰:「臣聞吏議逐客,竊以為過矣。」<br /> 「昔穆公求士,西取由余於戎,東得百里奚於宛,迎蹇叔於宋,求丕豹,公孫支於晉。<br />此五子者,不產於秦,而穆公用之,井國二十,遂霸西戎。孝公用商鞅之法,移風易俗,民<br />以殷盛,國以富彊,百姓樂用,諸侯親服獲楚,魏之師,舉地千里,至今治強。惠王用張儀<br />之計,拔三川之地,西井巴蜀,北收上郡,南取漢中。包九夷,制鄢郢,東據成皋之險,割<br />膏腴之壤,遂散六國之從,使之西面事秦,功施到今。昭王得范雎,廢穰侯,逐華陽,強公<br />室,杜私門,蠶食諸侯,使秦成帝業。此四君者,皆以客之功。由此觀之,客何負於秦哉!<br />向使四君卻客而不內,疏士而不與,是使國無富利之實,而秦無強大之名也。」<br /> 「今陛下致昆山之玉,有隨和之寶,垂明月之珠,服太阿之劍,乘纖離之馬,建翠鳳之<br />旗,樹靈鼉之鼓:此數寶者,秦不生一焉,而陛下說之,何也?必秦國之所生然後可,則是<br />夜光之璧,不飾朝廷;犀象之器,不為玩好;鄭衛之女,不充後官;而駿馬駃騠,不實外廄<br />;江南金錫不為用;西蜀丹青不為采。所以飾後官,充下陳,娛心意,說耳目者,必出於秦<br />然後可,則是宛珠之簪,傅璣之珥,阿縞之衣?錦繡之飾,不進於前;而隨俗雅化,佳冶窈<br />窕,趙女不立於側也。夫擊甕叩缶,彈箏搏髀,而歌呼嗚嗚快耳者,真秦之聲也;鄭衛桑間<br />,韶虞武象者,異國之樂也。今棄擊甕而就鄭衛,退彈箏而取韶虞,若是者何也?快意當前<br />,適觀而已矣。今取人則不然,不問可否,不論曲直,非秦者去,為客者逐,然則是所重者<br />在乎笆樂珠玉,而所輕者在乎人民也。此非所以跨海內,致諸侯之術也。」<br /> 「臣聞地廣者粟多,國大者人眾,兵強者士勇。是以<b><font color='#990000'>泰山不讓士壤,故能成其大;河海<br />不擇細流,故能就其深;王者不卻眾庶,故能明其德。是以地無四,方民無異國,四時充美<br />,鬼神降福</font></b>。此五帝,三王之所以無敵也。今乃棄黔首以資敵國,卻賓客以業諸侯,使天下<br />之士退而不敢西向,裹足不入秦,此所謂『藉寇兵而齎盜糧』者也。」<br /> 「<b><font color='#990000'>夫物不產於秦,可寶者多;士不產於秦,而願忠者眾。今逐客以資敵國,損民以益讎<br />,內自虛而外樹怨於諸侯,求國無危,不可得也</font></b>。」<br /> 秦王乃除逐客之令,復李斯官。<br />大意:<br /> (一)自「秦宗室大臣皆言秦王曰」至「竊以為過矣」<br /> 說明逐客為過。<br /> (二)自「昔穆公求士」至「而秦無強大之名也」<br /> (舉繆公、孝公、惠王、昭王例)說明客有功於秦(暗示逐客為不智)。<br /> (三)自「今陛下致昆山之玉」至「致諸侯之術也」<br /> 說明逐其民人而取其色樂珠玉,非王霸者之所為(以色樂珠玉之取襯客之去為不<br /> 合理)。<br /> (四)自「臣聞地廣者粟多」至「此所謂藉寇兵而齎盜糧者也」<br /> 說明卻客而為他國所用,非秦之福(以逐客資敵業諸侯說明爭取人才的重要性)<br /> 。<br /> (五)自「夫物不產於秦」至「不可得也」<br /> 說明逐客則國危。<br /> (六)自「秦王乃除逐客之令」至「復李斯官」<br /> 記敘李斯復官。</div>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag:blogger.com,1999:blog-623037388172682225.post-74928878036808110492008-08-18T11:29:00.003+08:002008-08-18T17:42:09.130+08:00GREUtils 1.1 in trunk<div xmlns='http://www.w3.org/1999/xhtml'><div style='padding: 0pt 3em 1.2em 0pt;' id='wikicontent'>GREUtils 1.1 已經 update 到 http://greutils.googlecode.com/svn/trunk 中, 有興趣參考 Source Code 或使用, 請利用 svn checkout .<br/><br/>GREUtils 是一個 XULRunner / Firefox extensions Javascript Utilities Libraries.<br/>1.0 到 1.1 基本上是全面改寫, GREUtils 1.1 提供以下功能:<br/><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><font color='#990000'><b>Dialog utilities (all XPCOM implemented, can use in javascript code modules)</b></font><br/></li><li>Controller and CommandDispatcher<a href='http://code.google.com/p/greutils/w/edit/CommandDispatcher'>?</a> Helper </li><li><b><font color='#990000'>Cryphto Hash Utilities – md5 / sha1 /sha256 </font></b></li><li><b><font color='#990000'>JSON encode / decode use XPCOM implemented (VERY FASTer then json.org's javascript version)</font></b></li><li><b><font color='#990000'>Threading – Native Multi-Threading support </font></b></li><li><b><font color='#990000'><a href='http://developer.mozilla.org/en/docs/Using_JavaScript_code_modules' target='_blank'>JavaScript code modules</a> support</font></b><br/></li></ul><br/>其它改變:<br/><ul><li>GREUtils 1.1 全部改寫了 1.0 的 inline document , 由 <a href='http://www.scriptdoc.org/' target='_blank'>ScriptDoc</a> 改成了 <a href='http://code.google.com/p/jsdoc-toolkit/' target='_blank'>jsdoc</a> 格式, 以方便產生出 API Reference.</li><li>Makefile for linux user , 以方便產生 minified / packed / jsmodues / jsdoc 等 distribution files.</li><li><b><font color='#990000'>singleton support</font></b></li><li><b><font color='#990000'>inherits / namespace</font></b> support (many idea and source from goog javascript libraries).</li></ul>Project URL: <span style='font-size: 130%;'><a href='http://code.google.com/p/greutils/'>http://code.google.com/p/greutils/</a></span><br/><br/>API References: <span style='font-size: 130%;'><a href='http://greutils.googlecode.com/svn/trunk/jsdoc/index.html' target='_blank'>http://greutils.googlecode.com/svn/trunk/jsdoc/index.html</a></span><br/><br/></div></div>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag: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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com6tag: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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com1tag: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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9YIaw257OBJ-w5krtWj697AaiwNneoBovOj5tsynySoujsrfVwaWVYNgTCZHR0o2xs3iWCekQ755GojBo7sDkooY4sIT6NGLB-ppTIoWoSxmHkNzVl4KPrHrpnqE05b4UcirLJUb6YI/s1600-h/Nimbus.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9YIaw257OBJ-w5krtWj697AaiwNneoBovOj5tsynySoujsrfVwaWVYNgTCZHR0o2xs3iWCekQ755GojBo7sDkooY4sIT6NGLB-ppTIoWoSxmHkNzVl4KPrHrpnqE05b4UcirLJUb6YI/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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com4tag: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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCYs38cCguouYpWgZk5WFcetsjsTWjx-QPFvAPee39uxaveVKIKsxk51HA428-tZa2IoxW_aTn2dw_tE4b4_LeknZsKiOcXy8hAxp7Dbwult4Z8Dgoz5cTPM1K6rCF1SMaVdY6XxHQiOQ/s1600-h/ttt.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCYs38cCguouYpWgZk5WFcetsjsTWjx-QPFvAPee39uxaveVKIKsxk51HA428-tZa2IoxW_aTn2dw_tE4b4_LeknZsKiOcXy8hAxp7Dbwult4Z8Dgoz5cTPM1K6rCF1SMaVdY6XxHQiOQ/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 />以上, 是目前阿土伯安裝的心得, 陸續調適, 再行增加整理.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com10tag: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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com15tag: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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-2SKZhqPBPlUt3hor_3n4Qgn44pto0AYI92aMEbyLRhTxiqOt_WNZdVvlzxkG3U1_qpyF1bxxOrHok98J2RPsCjLeKu8uJAS4F4QRwATOlB3E-3VPsVmj-WUfsQyyYthGHU2omiVP7Pc/s1600-h/main.png"><img style="cursor:pointer; cursor:hand;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-2SKZhqPBPlUt3hor_3n4Qgn44pto0AYI92aMEbyLRhTxiqOt_WNZdVvlzxkG3U1_qpyF1bxxOrHok98J2RPsCjLeKu8uJAS4F4QRwATOlB3E-3VPsVmj-WUfsQyyYthGHU2omiVP7Pc/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 />歡迎大家來信/留言討論, 一同成長.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com10tag: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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag: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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBdLEUPXQNWo0H5-zeMcfb4_AsLhUrL9ZwAlgmW7qdSQsFMQQ4LLPI7r28BqrweN1BCd429vYfpX0WNNdwTPlaEehmdJG7Z8iLUVr_hYY2LntCk83N6fwe92NnbVsQ13gjr8wfuS3xY0/s1600-h/web_screen1.png"><img style="cursor: pointer; width: 469px; height: 255px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDBdLEUPXQNWo0H5-zeMcfb4_AsLhUrL9ZwAlgmW7qdSQsFMQQ4LLPI7r28BqrweN1BCd429vYfpX0WNNdwTPlaEehmdJG7Z8iLUVr_hYY2LntCk83N6fwe92NnbVsQ13gjr8wfuS3xY0/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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFoTD2XbTCA3V4sD_dKrlrKJSTTDQzOHlefmZcz4uMuSNc1iH3dJxW82dT3Pq_77NtWXW_O_5kErvAzJXgC9z-FmkJt6GaGntfwHYWCWb3mySMAj3xxRhdvbrQpXo6ygqYuPOTfypF46k/s1600-h/web_screen2.png"><img style="cursor: pointer; width: 457px; height: 204px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFoTD2XbTCA3V4sD_dKrlrKJSTTDQzOHlefmZcz4uMuSNc1iH3dJxW82dT3Pq_77NtWXW_O_5kErvAzJXgC9z-FmkJt6GaGntfwHYWCWb3mySMAj3xxRhdvbrQpXo6ygqYuPOTfypF46k/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="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUp7Rk7B50j6DQm8VqDpjSv6cNt3ST6Ksy7_phJoW_KWKNQjForGii6gc6UVvccsd0uJc_3-GDb1WiJ5Pobfcrrsd2QAVmicyU3U4BgwcG19S13xe8kr2FAU6fy-wF7DD2yD-ujs53D4/s1600-h/web_screen3.png"><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbUp7Rk7B50j6DQm8VqDpjSv6cNt3ST6Ksy7_phJoW_KWKNQjForGii6gc6UVvccsd0uJc_3-GDb1WiJ5Pobfcrrsd2QAVmicyU3U4BgwcG19S13xe8kr2FAU6fy-wF7DD2yD-ujs53D4/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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com4tag: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 />以及和各位網路高手交流, 教學相長...Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com0tag: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 />歡迎大家來信或留言討論...Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com4tag: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 的匿稱讓我看到.... )Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com2tag: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 了.. 這部份要怎麼改都行.Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com1tag: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>Anonymoushttp://www.blogger.com/profile/00734471337083697849noreply@blogger.com3