<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>thegiive</title>
    <description></description>
    <link>http://thegiive.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>AK47 與 M16</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/119979" style="color:red;">http://thegiive.javaeye.com/blog/119979</a>&nbsp;
          发表时间: 2007年09月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家好，我是 thegiive，我正在服國防役新訓，先跟大家打個招呼。最近一直沒時間碰 Ruby on Rails ，不過軍中倒是花了點時間研究步槍。賢者總是說到「觸類旁通」這件事情，我也剛好從步槍這種殺人兵器中，看到了一些東西，很值得軟體開發借鏡。在此先警告一下，我只是在陳述輕兵器設計哲學之間的比較，並非鼓吹輕兵器，戰爭等東西，如果認為槍枝是邪惡不能被提及之人，請勿進入本文。<br /><br />我研究的東西，就是號稱 20世紀最偉大的武器 AK47 ，跟屈居第二的 M16 的之間的瑜亮之爭。<br /><br />AK47 是由<a href="http://zh.wikipedia.org/w/index.php?title=%E8%98%87%E8%81%AF&amp;variant=zh-tw" title="蘇聯">蘇聯</a>槍械設計師<a href="http://zh.wikipedia.org/w/index.php?title=%E7%B1%B3%E5%93%88%E4%BC%8A%E5%B0%94%C2%B7%E5%AD%A3%E8%8E%AB%E8%B4%B9%E8%80%B6%E7%BB%B4%E5%A5%87%C2%B7%E5%8D%A1%E6%8B%89%E4%BB%80%E5%B0%BC%E7%A7%91%E5%A4%AB&amp;variant=zh-tw" title="米哈伊尔·季莫费耶维奇·卡拉什尼科夫">米哈伊爾·季莫費耶維奇·卡拉什尼科夫</a>設計的<a href="http://zh.wikipedia.org/w/index.php?title=%E8%87%AA%E5%8A%A8%E6%AD%A5%E6%9E%AA&amp;variant=zh-tw" title="自动步枪">自動步槍</a>。這款武器號稱槍中之王，很多第三世界國家的戰爭都看到他的身影。可以說是哪裡有戰爭，那裡就有  AK47。有這樣一句話：「<a href="http://zh.wikipedia.org/w/index.php?title=%E7%BE%8E%E5%9C%8B&amp;variant=zh-tw" title="美國">美國</a>出口的是<a href="http://zh.wikipedia.org/w/index.php?title=%E5%8F%AF%E5%8F%A3%E5%8F%AF%E6%A8%82&amp;variant=zh-tw" title="可口可樂">可口可樂</a>，<a href="http://zh.wikipedia.org/w/index.php?title=%E6%97%A5%E6%9C%AC&amp;variant=zh-tw" title="日本">日本</a>出口的是<a href="http://zh.wikipedia.org/w/index.php?title=%E7%B4%A2%E5%B0%BC&amp;variant=zh-tw" title="索尼">Sony</a>電器，而<a href="http://zh.wikipedia.org/w/index.php?title=%E8%98%87%E8%81%AF&amp;variant=zh-tw" title="蘇聯">蘇聯</a>出口的是AK47。」<br /><br />這不是沒有原因的。 AK47 當初設計的哲學，就是為了「<span style="font-weight: bold;">簡單</span>」。他被設計成為任何民眾，在沒有人教導，沒有任何工具，依舊可以在三個小時之內可以徒手拆解結合，並且裝子彈射擊，由此可以知道他的「簡單」，到底是簡單到什麼程度。<br /><br />再來因為俄羅斯環境氣候糟糕，他將內部機構組織設計為較粗糙，這代表不容易因為沙土，泥水進去而導致不能擊發，也就是他當初就是為了設計為可以<span style="font-weight: bold;">穩定</span>的擊發子彈，就算再惡劣的環境也是如此。後來因為 AK47 大流行，參加了許多場戰爭，擁有相當多的實戰測試，導致他的擊發穩定性更上一層樓。有人戲稱「AK47 掉到泥水中，沒關係甩一甩，繼續打」。<br /><br />但是當初社記者因為為了「簡單」，「穩定」，損失了些許射擊準度。導致 300M 外射擊準度很差。<br /><br />M16 系列是屬於美國系統，他當初設計的哲學就是為了<span style="font-weight: bold;">擁有穩定的設計準度</span>，以及<span style="font-weight: bold;">良好的射擊距離</span>。所以他採取相當巧妙的設計（我們輕兵器教官是這樣講的，我沒有研究很深），但是越精巧的系統代表<span style="font-weight: bold;">容錯率越低</span>， 第一版 M16 對於環境的容忍程度較差，很容易因為環境因素導致卡彈。美軍在沙漠風暴之中，就常聽說美軍為了避免沙子進入槍口，用保險套套住槍口，形成一種很詭異的情況。<br /><br />綜合比較兩者優劣，很明顯的 M16 在射擊準度上面優於 AK47 許多，但是耐用度上面，第一版的 M16 可以說是遠遠輸了 AK47，一直到 M16A2 才比較好一點，不過還是輸給 Ak47 。<br /><br />使用率上面，AK47遠遠的贏過 M16，傳說 AK47 有一億隻之多。造成 AK47 大流行的原因很多，<br /><ol><li>一來是因為構造簡單，上手簡單，士兵幾乎不用訓練就可以擊發，所以許多第三世界國家喜歡使用 AK47。</li><li>再來就是因為構造簡單，容易仿造，所以很多國家都自己仿冒 AK47，傳說十支 Ak47 只有一支是正版的 AK47。</li><li>再來就是如果你有看軍火之王這部片子，裡面講到蘇聯瓦解，許多將軍失去以前的榮光，為了錢，他們將軍火庫裡面成千上萬的 AK47 盜賣給軍火商，導致黑市 AK47 大流行，既便宜又好用。</li><li>最後雖然 AK47 不準，但是第三國家沒有資源去花時間訓練士兵射擊準度，所以使用 AK47 根本沒差<br /></li></ol><br />這裡必須要提一件題外話，如果你看過血鑽石這部片子，就知道他們是怎麼訓練娃娃兵的。而娃娃兵雖然知識水準不高，但是因為 AK47 實在是使用上太簡單了，所以導致軍閥隨隨便便訓練娃娃兵，他們都可以上手，拿槍來殺人， AK47 的簡單某種程度導致娃娃兵的大流行。這是讓我每次看到都覺得很荒謬的一件事情。<br /><br />真正決定 AK47 王者地位的戰役就是越戰。越南一方使用 AK47，美軍使用 M16。越戰是叢林戰為主，叢林戰的攻擊射程可能根本不到 10 m ，在叢林 AK47 跟 M16 射擊射程都是一樣的，也就是 M16 的強項射擊距離跟經準度就跟廢了一樣。再加上叢林環境太過惡劣了，M16的低容錯率造成大量卡彈的發生，很多美軍屍體旁邊都有卡彈的 M16，代表他們是因為卡彈才死去的。到後來，甚至出現許多美軍將自己 M16 放在一旁，反而使用搶來的 Ak47 來打越南軍的怪現象。<br /><br />事後想想，AK47 早就已經實戰好幾年了，那時的穩定度以經是 3.0 版。M16 在越戰時穩定度還是 1.0 Pre release 版。再來剛好遇到 M16 強項被極小化，所以才會遇到被 AK47 八的那麼慘的情況。<br /><br />雖然剛剛講了那麼多 M16 的壞現象，但是他依舊美軍最佳的利器。因為美軍戰爭時需要「減少傷亡」，減少傷亡最好的方式就是拉遠戰鬥，所以 Ak47 只能較近距離的特性依舊不適合美軍。也就是說，沒有最好的槍枝，只有最適合這次任務的槍枝。<br /><br />所謂的簡單就是美，在 AK47 留下的最好的證明。簡單的設計容易修改，複製。產品正確率也較高。並且容易上手就容易造成流行。軟體又何嘗不是如此。<br /><br />穩定性的重要，在輕兵器的領域優先權是相當高的，畢竟子彈往身上跑過來的時候，誰都不希望自己手上的槍枝卡彈。越戰時，AK47就在這個領域上面遠遠勝過 M16，也為這次比試留下了勝利。當某個領域的要求穩定性，已經高到一個很重要的程度時，我們應該選擇比較穩定的設計，而非功能比較強大的設計。<br /><br />最後，沒有最好的槍枝，只有最合適這次任務的槍枝。同樣的，沒有最好的軟體，只有最符合這次任務需求的軟體。<br /><br />我們在這些輕兵器的歷史中，是不是看到許多軟體開發的影子呢。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/119979#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 01 Sep 2007 15:07:02 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/119979</link>
        <guid>http://thegiive.javaeye.com/blog/119979</guid>
      </item>
      <item>
        <title>Fedora Core 6 上安裝 beast (3)</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/115415" style="color:red;">http://thegiive.javaeye.com/blog/115415</a>&nbsp;
          发表时间: 2007年08月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          覺得 pound + lighttpd 太麻煩嗎？又翻到一個應該不錯的選擇，<br />是一個俄國人寫的 http server, 也具有 reverse proxy 和<br />load balancing 的能力。<br /><br />godfat ~ 3.2$ port info nginx<br />nginx 0.5.29, www/nginx (Variants: universal, dav, flv, mail, ssl)<br />http://nginx.net/<br /><br />Nginx ("engine x") is a high-performance HTTP(S) server and reverse proxy,<br />as well as an IMAP/POP3 proxy server. Nginx was written by Igor Sysoev for<br />Rambler.ru, Russia's second-most visited website, where it has been running<br />in production for over two and a half years. Igor has released the source<br />code under a BSD-like license. Although still in beta, Nginx is known for<br />its stability, rich feature set, simple configuration, and low resource<br />consumption.<br /><br />這個字實在是很難記…不過討論翻來翻去，他 serve static file 的效能和<br />lighttpd 在伯仲之間，而 load balancing 是正常可用的。所以與其使用<br />pound + lighttpd, 單用 nginx 可以簡化一些流程。我想缺點就是設定上<br />還是比 pound 複雜些，不過我個人是覺得比 lighttpd 簡單了。另外 nginx<br />好像沒有 windows 版，而 pound 和 lighttpd 都有 windows 版，<br />我想這對某些情況可能也是個考量吧？<br /><br />雖然之前因為英文文件太少所以不太流行，但最近似乎還算有蠻多人推薦的，<br />而且這在俄國好像還蠻廣泛被使用的，試試應該無妨。<br /><br />sudo yum install nginx<br /><br />跟 lighttpd 一樣，一起丟到 beast 目錄下比較容易管理。<br />cp /etc/nginx/nginx.conf \<br />/home/YOUR_NAME/projects/beast/stable-1.0/config/nginx.conf<br />cp /etc/nginx/mime.types \<br />/home/YOUR_NAME/projects/beast/stable-1.0/config/mime.types<br />前者是 config 檔，後者是 mime-type 設定檔，會被 include 進去。<br /><br />nano config/nginx.conf<br />=======================<br />user&nbsp;YOUR_NAME&nbsp;YOUR_NAME;<br />worker_processes&nbsp;1;<br />pid&nbsp;/home/YOUR_NAME/projects/beast/stable-1.0/tmp/pids/nginx.pid;<br /><br />error_log&nbsp;/home/YOUR_NAME/projects/beast/stable-1.0/log/nginx_error.log;<br /><br />events&nbsp;{<br />&nbsp;&nbsp;worker_connections&nbsp;1024;<br />}<br /><br />http&nbsp;{<br />&nbsp;&nbsp;include&nbsp;/home/YOUR_NAME/projects/beast/stable-1.0/config/mime.types;<br />&nbsp;&nbsp;default_type&nbsp;application/octet-stream;<br /><br />&nbsp;&nbsp;log_format&nbsp;main&nbsp;'$remote_addr&nbsp;-&nbsp;$remote_user&nbsp;[$time_local]&nbsp;$request&nbsp;'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'"$status"&nbsp;$body_bytes_sent&nbsp;"$http_referer"&nbsp;'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'"$http_user_agent"&nbsp;"$http_x_forwarded_for"';<br /><br />&nbsp;&nbsp;access_log&nbsp;/home/YOUR_NAME/projects/beast/stable-1.0/log/nginx_access.log&nbsp;main;<br /><br />&nbsp;&nbsp;sendfile&nbsp;on;<br />&nbsp;&nbsp;keepalive_timeout&nbsp;65;<br /><br />&nbsp;&nbsp;gzip&nbsp;on;<br />&nbsp;&nbsp;gzip_min_length&nbsp;1100;<br />&nbsp;&nbsp;gzip_buffers&nbsp;4&nbsp;8k;<br />&nbsp;&nbsp;gzip_types&nbsp;text/plain&nbsp;text/html&nbsp;text/xhtml&nbsp;text/css&nbsp;text/javascript;<br /><br />&nbsp;&nbsp;upstream&nbsp;mongrel&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;127.0.0.1:2000;<br />&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;127.0.0.1:2001;<br />&nbsp;&nbsp;&nbsp;&nbsp;server&nbsp;127.0.0.1:2002;<br />&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;server&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;80;<br />&nbsp;&nbsp;&nbsp;&nbsp;server_name&nbsp;localhost;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;~&nbsp;^/(images|javascripts|stylesheets)/&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;/home/YOUR_NAME/projects/beast/stable-1.0/public<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expires&nbsp;30d;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;/&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header&nbsp;X-Real-IP&nbsp;$remote_addr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header&nbsp;X-Forwarded-For&nbsp;$proxy_add_x_forwarded_for;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_set_header&nbsp;Host&nbsp;$http_host;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_redirect&nbsp;off;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy_pass&nbsp;http://mongrel;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />=======================<br /><br />其實還有一大堆設定我省略掉了，可以自己上官網或 google 找其他的設定。<br />啟動：<br />sudo nginx -c config/nginx.conf<br />關閉：<br />sudo kill `cat tmp/pids/nginx.pid`<br /><br />我用這個去跑 YSlow, 應該是設定的關係，分數從 62 =&gt; 75...<br />但當然以我測試機的超低流量來看，就算直接用 mongrel 應該也是瞬間反應…
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/115415#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 22 Aug 2007 09:41:15 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/115415</link>
        <guid>http://thegiive.javaeye.com/blog/115415</guid>
      </item>
      <item>
        <title>Fedora Core 6 上安裝 beast (2)</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/112709" style="color:red;">http://thegiive.javaeye.com/blog/112709</a>&nbsp;
          发表时间: 2007年08月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          不喜歡 apache 嗎？apache 沒辦法用 mod_proxy_balancer 嗎？沒關係，我找到另外一個不錯的方式了，是 pound + lighttpd. 如果不想用 apache 的話，上一篇的 httpd 相關的東西都不要灌，改灌：<br /><br />sudo yum install Pound<br />sudo yum install lighttpd<br /><br />我是覺得這邊分大小寫很沒意義，不過 yum 就是這樣﹍。<br /><br />pound 是什麼？<br />The Pound program is a reverse proxy, load balancer and HTTPS front-end for<br />Web server(s). Pound was developed to enable distributing the load among<br />several Web-servers and to allow for a convenient SSL wrapper for those<br />Web servers that do not offer it natively.<br /><br />lighttpd 我想大家都知道，一個非常快速的 http server, 只不過他的 mod_proxy 似乎有很多問題，以致於沒辦法用他。所以這部份用 pound 當前端解決這個問題，流程變成：<br /><br />http request =&gt; pound =&gt; lighttpd or mongrel cluster<br /><br />安裝好後，先來設定 pound, 不過 https 就先暫時略過不管。<br />sudo nano /etc/pound.cfg<br />=========================<br />User "pound"<br />Group "pound"<br /><br />ListenHTTP<br />&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;0.0.0.0<br />&nbsp;&nbsp;&nbsp;&nbsp;Port&nbsp;80<br />End<br /><br />Service<br />&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;"/(images|stylesheets|javascripts)/"<br />&nbsp;&nbsp;&nbsp;&nbsp;BackEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;127.0.0.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port&nbsp;&nbsp;&nbsp;&nbsp;1999<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />&nbsp;&nbsp;&nbsp;&nbsp;Session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;BASIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;300<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />End<br /><br />Service<br />&nbsp;&nbsp;&nbsp;&nbsp;BackEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;127.0.0.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port&nbsp;&nbsp;&nbsp;&nbsp;2000<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />&nbsp;&nbsp;&nbsp;&nbsp;BackEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;127.0.0.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port&nbsp;&nbsp;&nbsp;&nbsp;2001<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />&nbsp;&nbsp;&nbsp;&nbsp;BackEnd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;127.0.0.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port&nbsp;&nbsp;&nbsp;&nbsp;2002<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />&nbsp;&nbsp;&nbsp;&nbsp;Session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;BASIC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;300<br />&nbsp;&nbsp;&nbsp;&nbsp;End<br />End<br />=========================<br />前面的設定是把 host/images, host/stylesheets, host/javascripts 這三個 url 下的 request 都丟給 port 1999 處理，也就是等會 lighttpd 要使用的 port. 這邊使用 regex, 可以自由設定自己要的規則。假使未來 user 要使用 file_column, 可以再加個 user/avatar 之類的。<br /><br />下面的則是全部丟給 mongrel_cluster 處理。設定上應該比 apache 簡單地多。可以先測試看看，先把 lighttpd 的部份 comment 起來，啟動 pound 試試：<br />sudo pound<br /><br />照理說這樣就能使用了。不行的話加個 config 檔路徑給他：<br />sudo pound -f /etc/pound.cfg<br /><br />這邊我是在想要不要把 config 也放到 beast 裡面，不過 pound 應該只會有一個，所以我想還是放到 /etc 下好了。停止 pound 的方式：<br />sudo kill `sudo cat /var/run/pound.pid`<br /><br />製作 lighttpd 設定檔：<br />nano config/lighttpd.conf<br />==========================<br />server.modules = ( <br />  "mod_access",<br />  "mod_accesslog"<br />)<br /><br />server.port = 1999<br />server.bind = "127.0.0.1"<br />server.document-root = "/home/YOUR_NAME/projects/beast/stable-1.0/public"<br /><br />server.username  = "YOUR_NAME"<br />server.groupname = "YOUR_NAME"<br />server.pid-file  = "/home/YOUR_NAME/projects/beast/stable-1.0/tmp/pids/lighttpd.pid" <br />server.errorlog  = "/home/YOUR_NAME/projects/beast/stable-1.0/log/lighttpd_error.log" <br />index-file.names = ( "index.html", "default.html" )<br />accesslog.filename = "/home/YOUR_NAME/projects/beast/stable-1.0/log/lighttpd_access.log"<br /><br /># mimetype mapping<br />mimetype.assign             = (<br />  ".rpm"          =&gt;      "application/x-rpm",<br />  ".pdf"          =&gt;      "application/pdf",<br />  ".sig"          =&gt;      "application/pgp-signature",<br />  ".spl"          =&gt;      "application/futuresplash",<br />  ".class"        =&gt;      "application/octet-stream",<br />  ".ps"           =&gt;      "application/postscript",<br />  ".torrent"      =&gt;      "application/x-bittorrent",<br />  ".dvi"          =&gt;      "application/x-dvi",<br />  ".gz"           =&gt;      "application/x-gzip",<br />  ".pac"          =&gt;      "application/x-ns-proxy-autoconfig",<br />  ".swf"          =&gt;      "application/x-shockwave-flash",<br />  ".tar.gz"       =&gt;      "application/x-tgz",<br />  ".tgz"          =&gt;      "application/x-tgz",<br />  ".tar"          =&gt;      "application/x-tar",<br />  ".zip"          =&gt;      "application/zip",<br />  ".mp3"          =&gt;      "audio/mpeg",<br />  ".m3u"          =&gt;      "audio/x-mpegurl",<br />  ".wma"          =&gt;      "audio/x-ms-wma",<br />  ".wax"          =&gt;      "audio/x-ms-wax",<br />  ".ogg"          =&gt;      "application/ogg",<br />  ".wav"          =&gt;      "audio/x-wav",<br />  ".gif"          =&gt;      "image/gif",<br />  ".jpg"          =&gt;      "image/jpeg",<br />  ".jpeg"         =&gt;      "image/jpeg",<br />  ".png"          =&gt;      "image/png",<br />  ".xbm"          =&gt;      "image/x-xbitmap",<br />  ".xpm"          =&gt;      "image/x-xpixmap",<br />  ".xwd"          =&gt;      "image/x-xwindowdump",<br />  ".css"          =&gt;      "text/css",<br />  ".html"         =&gt;      "text/html",<br />  ".htm"          =&gt;      "text/html",<br />  ".js"           =&gt;      "text/javascript",<br />  ".asc"          =&gt;      "text/plain",<br />  ".c"            =&gt;      "text/plain",<br />  ".cpp"          =&gt;      "text/plain",<br />  ".log"          =&gt;      "text/plain",<br />  ".conf"         =&gt;      "text/plain",<br />  ".text"         =&gt;      "text/plain",<br />  ".txt"          =&gt;      "text/plain",<br />  ".dtd"          =&gt;      "text/xml",<br />  ".xml"          =&gt;      "text/xml",<br />  ".mpeg"         =&gt;      "video/mpeg",<br />  ".mpg"          =&gt;      "video/mpeg",<br />  ".mov"          =&gt;      "video/quicktime",<br />  ".qt"           =&gt;      "video/quicktime",<br />  ".avi"          =&gt;      "video/x-msvideo",<br />  ".asf"          =&gt;      "video/x-ms-asf",<br />  ".asx"          =&gt;      "video/x-ms-asf",<br />  ".wmv"          =&gt;      "video/x-ms-wmv",<br />  ".bz2"          =&gt;      "application/x-bzip",<br />  ".tbz"          =&gt;      "application/x-bzip-compressed-tar",<br />  ".tar.bz2"      =&gt;      "application/x-bzip-compressed-tar"<br /> )<br />==========================<br />我很想省略 mime-type 設定，不過不設的話 firefox 好像會有問題。safari 和 opera 是 ok 的，IE 我沒得測就沒測了。反正要設就是了，有沒有問題不影響。只是希望 lighttpd 能內建這些設定﹍。<br /><br />啟動 lighttpd<br />sudo lighttpd -f config/lighttpd.conf<br /><br />這樣就算大功告成了！剛剛有測試 pound 的話記得改回原本設定並重新啟動。比較詳細的介紹與說明可以參考這篇：<br /><a href="http://www.aidanf.net/rails/configuring-pound-with-lighttpd-and-mongrel" target="_blank">Configuring pound with lighttpd and mongrel.</a><br /><br />*<br /><br />summary:<br /><br />用到的 server:<br /><br />(1)<br />apache2.2 =&gt;<br />reverse proxy + load balancer + serve static files<br /><br />(2)<br />pound =&gt; reverse proxy + load balancer<br />lighttpd =&gt; serve static files<br /><br />(3)<br />mongrel_cluster =&gt; setup mongrel cluster<br />mongrel =&gt; serve beast<br /><br />結果就是 ((1) or (2)) + (3)<br /><br />操作 apache:<br />啟動：sudo apachectl start<br />停止：sudo apachectl stop<br />重啟：sudo apachectl restart<br /><br />操作 pound:<br />啟動：sudo pound -f /etc/pound.cfg<br />　或：sudo /etc/init.d/pound start<br /><br />停止：sudo kill `sudo cat /var/run/pound.pid`<br />　或：sudo /etc/init.d/pound stop<br /><br />重啟：sudo /etc/init.d/pound restart<br /><br />操作 lighttpd:<br />啟動：sudo lighttpd -f config/lighttpd.conf<br />　或：sudo /etc/init.d/lighttpd start<br /><br />停止：sudo kill `cat tmp/pids/lighttpd.pid`<br />　或：sudo /etc/init.d/lighttpd stop<br /><br />重啟：sudo /etc/init.d/lighttpd restart<br /><br />操作 mongrel_cluster:<br />啟動：sudo mongrel_rails cluster::start<br />停止：sudo mongrel_rails cluster::stop<br />重啟：sudo mongrel_rails cluster::restart<br /><br />操作 postgresql:<br />啟動：sudo pg_ctl start<br />停止：sudo pg_ctl stop<br />重啟：sudo pg_ctl restart
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/112709#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 15 Aug 2007 13:16:53 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/112709</link>
        <guid>http://thegiive.javaeye.com/blog/112709</guid>
      </item>
      <item>
        <title>Fedora Core 6 上安裝 beast</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/112296" style="color:red;">http://thegiive.javaeye.com/blog/112296</a>&nbsp;
          发表时间: 2007年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我選擇 apache2.2 + mongrel_cluster + postgresql<br /><br />安裝 apache 和其他的東西。<br />sudo yum install httpd<br />sudo yum install httpd-devel<br />sudo yum install openssl<br />sudo yum install readline<br /><br />安裝 ruby<br />sudo yum install ruby<br />sudo yum install ruby-devel<br />sudo yum install ruby-libs<br />sudo yum install rdoc<br />sudo yum install irb<br /><br />安裝 postgresql<br />sudo yum install postgresql<br />sudo yum install postgresql-devel<br />sudo yum install postgresql-libs<br />sudo yum install postgresql-server<br /><br />初始化 postgres<br />sudo mkdir -p /var/db/postgresql81/defaultdb<br />sudo chown postgres:postgres /var/db/postgresql81/defaultdb<br />sudo -u postgres initdb -D /var/db/postgresql81/defaultdb<br />sudo -u postgres pg_ctl -D /var/db/postgresql81/defaultdb \<br />-l /var/db/postgresql81/defaultdb/postgres.log start<br /><br />拿來抓 beast... 捨 svn 取 svk 因為我討厭一堆 .svn<br />sudo yum install perl-SVK<br /><br />sudo yum install rubygems<br /><br />至少要用這些 gem<br />sudo gem install rails -y<br />sudo gem install mongrel_cluster -y<br />sudo gem install redcloth -y<br />sudo gem install ruby-openid -y<br />sudo gem install ruby-postgres -y<br /><br />建立目錄。<br />mkdir -p ~/projects/beast<br />cd ~/projects/beast<br /><br />用 svk 抓不會有一堆 .svn 礙眼。<br />svk mirror //mirror/beast \<br />http://svn.techno-weenie.net/projects/beast/branches/stable-1.0/<br />svk sync -s HEAD //mirror/beast<br />cd stable-1.0<br /><br />產生讓 beast 用的資料庫。<br />sudo -u postgres createdb beast_prod<br /><br />設定資料庫設定檔。<br />cp config/database.example.yml config/database.yml<br /><br />nano config/database.yml<br />=========================<br />production:<br />&nbsp;&nbsp;database: beast_prod<br />&nbsp;&nbsp;adapter: postgresql<br />&nbsp;&nbsp;host: localhost<br />&nbsp;&nbsp;username: postgres<br />&nbsp;&nbsp;password:<br />=========================<br /><br />初始化 beast 資料庫。<br />rake db:schema:load RAILS_ENV=production<br /><br />非常囉唆的 cluster 設定，user 可以開 mongrel,<br />不過因為我懶所以用自己的帳號跑。<br />sudo mongrel_rails cluster::configure -e production \<br />-p 2000 -N 3 -c /home/YOUR_NAME/projects/beast/stable-1.0 \<br />-a 0.0.0.0 --user YOUR_NAME --group YOUR_NAME<br /><br />啟動 mongrel_cluster 吧。<br />sudo mongrel_rails cluster::start<br /><br />接著是 apache2.2 的 mod_proxy_balancer 的設定，<br />如果 mod_proxy_balancer 沒有啟動記得把他打開。<br /><br />建立 balancer 導向 port 2000~2002<br />sudo nano /etc/httpd/conf/httpd.conf<br />=====================================<br />&lt;Proxy balancer://YOUR_BALANCER&gt;<br />&nbsp;&nbsp;BalancerMember http://YOUR_ADDRESS:2000<br />&nbsp;&nbsp;BalancerMember http://YOUR_ADDRESS:2001<br />&nbsp;&nbsp;BalancerMember http://YOUR_ADDRESS:2002<br />&lt;/Proxy&gt;<br /><br />Listen 80<br />&lt;VirtualHost *:80&gt;<br />&nbsp;&nbsp;ServerAdmin YOUR_EMAIL<br />&nbsp;&nbsp;ServerName YOUR_ADDRESS<br />&nbsp;&nbsp;ProxyPass / balancer://YOUR_BALANCER/<br />&nbsp;&nbsp;ProxyPassReverse / balancer://YOUR_BALANCER/<br />&nbsp;&nbsp;ProxyPreserveHost on<br />&nbsp;&nbsp;ErrorLog /home/YOUR_NAME/projects/beast/stable-1.0/log/apache_error.log<br />&nbsp;&nbsp;CustomLog /home/YOUR_NAME/projects/beast/stable-1.0/log/apache_access.log combined<br /><br />&nbsp;&nbsp;ProxyPass /images !<br />&nbsp;&nbsp;ProxyPass /stylesheets !<br />&nbsp;&nbsp;ProxyPass /javascripts !<br />&nbsp;&nbsp;Alias /images /home/YOUR_NAME/projects/beast/stable-1.0/public/images<br />&nbsp;&nbsp;Alias /stylesheets /home/YOUR_NAME/projects/beast/stable-1.0/public/stylesheets<br />&nbsp;&nbsp;Alias /javascripts /home/YOUR_NAME/projects/beast/stable-1.0/public/javascripts<br />&lt;/VirtualHost&gt;<br />=====================================<br /><br />接著啟動 apache 就 ok 了。<br />sudo apachectl start<br /><br />最後來設定 beast 的 smtp, 如果想用 gmail 寄信的話，<br />我之前試過兩個方式，一個是使用 msmtp,<br />另一個是有人有寫一小段 ssl smtp 的 patch, 可以參考這裡：<br /><a href="http://www.stephenchu.com/2006/06/how-to-use-gmail-smtp-server-to-send.html">http://www.stephenchu.com/2006/06/how-to-use-gmail-smtp-server-to-send.html</a><br /><br />nano config/environment.rb<br />加入：<br />===========================<br />ActionMailer::Base.smtp_settings = {<br />&nbsp;&nbsp;:address =&gt; "smtp.gmail.com",<br />&nbsp;&nbsp;:port =&gt; 587, <br />&nbsp;&nbsp;:domain =&gt; 'YOUR_DOMAIN',<br />&nbsp;&nbsp;:user_name =&gt; "YOUR_GMAIL_ACCOUNT",<br />&nbsp;&nbsp;:password =&gt; 'YOUR_GMAIL_PASSWORD',<br />&nbsp;&nbsp;:authentication =&gt; :plain<br />}<br />===========================<br /><br />nano app/models/user_mailer.rb<br />===============================<br />@from = 'YOUR_GMAIL_ACCOUNT@gmail.com'<br />===============================<br />我不是很確定這一步要不要做，我猜不做會被 gamil 擋掉。<br /><br />接下來把那段程式碼 copy 到可以被 require 的地方，我是放在 lib 下：<br />nano lib/smtp_tls.rb<br />接著把他 require 進去：<br />nano config/environment.rb<br />===========================<br />require 'smtp_tls'<br />===========================<br /><br />sudo mongrel_rails cluster::restart<br />註冊一下試試寄信吧！如果失敗的話，那篇連結裡有個 workaround:<br /><br />nano lib/smtp_tls.rb<br />=====================<br />rescue EOFError<br />&nbsp;&nbsp;;<br />rescue OpenSSL::SSL::SSLError =&gt; e<br />&nbsp;&nbsp;puts('Unexpected Exception: ' + e.message + ' : ' +<br />&nbsp;&nbsp;&nbsp;&nbsp;e.backtrace.join("\n") )<br />end<br />=====================<br /><br />我之前用是沒有這個問題，但在這台 fedora 上卻有這個問題，<br />也許是要更新 openssl 的版本？不管如何，加入上面那段暫時可用。<br /><br />結論：<br />還是 macports 好用，速度快，更新快，只是 build 要很久就是了。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/112296#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Aug 2007 14:48:43 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/112296</link>
        <guid>http://thegiive.javaeye.com/blog/112296</guid>
      </item>
      <item>
        <title>ludy 0.0.4 released</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/111516" style="color:red;">http://thegiive.javaeye.com/blog/111516</a>&nbsp;
          发表时间: 2007年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          花了一點時間再測試了一下 curry 的實做，i am glad to announce that ludy 0.0.4 is released. 原本的 Proc#curry 被改名為 Proc#__curry__, 我很想把他<br />deprecate 掉，但是後來的 Kernel#curry 也有運用到該實做，是有在考慮把他從 public 改到 private, 但考慮到也許還有用處，還是暫時放在 public 下，以後如果發現真的沒用了，會改到 private 下。<br /><br />現在的用法是：<br /><br />multiply = lambda{|l,r| l*r}<br /><br />double = multiply.curry[2]<br />assert_equal 8, double[4]<br />assert_equal 6, double[3]<br /><br />xd = multiply['XD', 5]<br />assert_equal 'XDXDXDXDXD', xd<br /><br />assert_equal 29, :+.to_proc.curry[18][11]<br />assert_equal (0..4).to_a, lambda{|a,b,c,d,e|[a,b,c,d,e]}.curry[0][1][2][3][4]<br /><br />只要呼叫到了 Kernel#curry, 且 caller 本身回應（respond_to?）:call 和 :[], 則回傳一個 curry function, 這樣就可以有更強的 consistency, 不需要注意什麼時候使用 () 而什麼時候使用 [], 請一律使用 function call/[], 不用擔心參數是否足夠，足夠時就會回傳真正的答案，否則再度傳回 curry function.<br /><br />所以其實我是在想，以下兩者是否相同？<br />class Array; include Curry; end<br />func1 = [].cfoldr<br />func2 = [].method(:foldr).curry<br />func1 == func2 # =&gt; true? or false?<br /><br />我的希望是相同，當然。只是我直接換上這樣的實做似乎有點問題，這個狀況可能在 0.0.5 中解決，使 curry module 和 kernel#curry 也能夠擁有該有的一致性。<br /><br />另一個棘手問題是 ruby 的 block, 乍看很好用，實際上也是，但是卻造成了很大的不一致。這一點也真的是很難搞定，之前的 this 就有碰上這樣的大問題，使用 yield 似乎無法產生正確的 call stack.<br /><br />*<br /><br />最後則是 0.0.4 上的實做問題，由於 :*.to_proc 的這個 proc 無法預測其正確的 arity, 就像 :message_that_you_never_know.to_proc 也不可能能知道他的 arity 是多少一樣，這造成了難以判斷何時該回傳正確的值而非另一個 curry function. 我是想要從 Symbol#to_proc 去竄改，不過這會碰上另外兩個問題：<br /><br />1. 會跟其他人的實做衝突<br />2. caller 和 arity 是合併在一起的，意味還沒 call 之前都不會知道 arity, 這樣我就沒辦法強迫 Symbol#to_proc 能產生正確的 arity.<br /><br />所以我只好用另外一個很愚蠢的方式：trial &amp; error.<br />begin # let's try if arguments are ready<br />&nbsp;&nbsp;self.__send__ :orig_call, *args, &amp;block<br />rescue ArgumentError # oops, let's curry it<br />&nbsp;&nbsp;method(:call).to_proc.__send__ :__curry__, *args<br />end<br /><br />效率問題就別提了，我真的覺得這樣很蠢，可是好像也想不到更好的方式。<br /><br />所以 0.0.4 就只暫時強化了 curry 的實做，離完善還有很大的一段距離。雖然心血來潮度極高，但好像還算有進展？<br /><br />gem install ludy<br />to see detail.
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/111516#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Aug 2007 17:00:06 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/111516</link>
        <guid>http://thegiive.javaeye.com/blog/111516</guid>
      </item>
      <item>
        <title>ludy 0.0.3 released</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/109907" style="color:red;">http://thegiive.javaeye.com/blog/109907</a>&nbsp;
          发表时间: 2007年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          睽違已久，忽然心血來潮多加了幾個東西。<br />in CHANGES:<br />==============================<br />ludy 0.0.3, 2007.08.07<br /><br />1. ludy_ext:<br />  added:<br />    1. Proc#curry<br />    2. Proc#compose<br />    3. Proc#chain<br />    4. Symbol#to_proc<br />    5. Array#foldl<br />    6. Array#foldr<br />    7. Array#filter<br /><br />  removed:<br />    1. Fixnum#collect # see tc_ludy_ext.rb#test_fixnum_collect for reason<br /><br />  info:<br />    1. ruby2ruby has NilClass#method_missing return nil,<br />       so i can't just make it return blackhole<br /><br />2. module Curry:<br />  see test/tc_curry.rb for usage<br /><br />see unit test for usage<br />==============================<br />雖然說請看 unit test 來揣摩用法，不過這樣真的有點無趣，所以還是來稍微介紹一下。這次之所以忽然心血來潮想做，是因為看到James Edward Gray II 的 higher-order ruby 專欄：<br /><a href="http://blog.grayproductions.net/articles/category/higher-order-ruby" target="_blank">http://blog.grayproductions.net/articles/category/higher-order-ruby</a><br />第六篇的：Currying, 他的 curry 實做：<br /><pre>class Proc<br />  def curry(&amp;args_munger)<br />    lambda { |*args| call(*args_munger[args]) }<br />  end<br />end</pre><br />老實講，不是說看不懂，可是我不明白為什麼要寫得那麼複雜，乍看之下實在看不太出來。丟掉他的實做，我試著做了一個：<br /><pre>class Proc<br />  def curry *pre<br />    lambda{ |*post| self[*(pre + post)] }<br />  end<br />end</pre><br />就我自己測試起來，效果是一樣的，我認為應該簡潔易懂多了。可是這根本不太像 curried function 吧？內心吶喊著。不過在看我後來寫的 curry module 之前，先來簡單介紹一下 currying.<br /><br />在 lambda caculus 中，每個 function 都只能有一個 argument, 這是因為 lambda caculus 是一種極簡的語言，用來研究某些模型的語言。但是如果 function 只能吃一個 argument, 有很多事是會做不到的。於是我們可以靠著 tuple 把許多的 argument 包成一個 argument, 例如在 Haskell 中，tuple 就是 (1,2,3), 用括號括起來的就是 tuple. 所以上面的 (1,2,3) 是一個有三個值的 tuple, 可以把他視為一個值。<br /><br />比方說有個 function 叫 power, 像是：power 2, 10 會回傳 1024. uncurried function 就會是 power (2, 10), 他吃一個有兩個元素的 tuple, 吐出一個 1024 的值。可是如果是這樣使用的話，其實是很不方便的。有一個方法可以讓 function 依然只吃一個 argument, 但是又不需要使用 tuple, 可以一個值一個值傳入，那就是 curried function.<br /><br />在 functional programming 中，function 的地位極高，不管在做什麼事，幾乎都是在操作 function. 這也就是所謂的 higher-order function, 操作 function 的 function, 或是產生 function 的 function 諸如此類。curried function 的效果就是當所吃入的 argument 不足時，他會再吐出另一個 function 去吃其他 argument，直到 argument 足夠時才會吐出結果。<br /><br />power 2 的回傳會是一個 function, 他記住了 2, 當他再吃一個 argument 後，則會再把 2 拿出來跟 argument 做運算。所以 power 的 type 會是：<br />power :: Int -&gt; Int -&gt; Int<br />結合順序是從右邊開始，所以是吃一個 Int, 吐出 (Int -&gt; Int), 也就是吃一個 Int 吐出一個 Int 的 function. 可以想成這樣：<br /><br />power2 = power 2<br />result = power2 10<br />result # =&gt; 1024<br /><br />也就是說，可以把他看成是一個會不斷記憶 argument 的 function. 看看 James Edward Gray II 的範例：<br /><pre>multiply = lambda { |l, r| l * r }<br />double   = multiply.curry { |args| args + [2] }<br />triple   = multiply.curry { |args| args &lt;&lt; 3 }<br /><br />multiply[5, 2]    # =&gt; 10<br />double[5]         # =&gt; 10<br />triple[5]         # =&gt; 15<br />triple["Howdy "]  # =&gt; "Howdy Howdy Howdy "</pre><br />所以他的實做其實很簡單，就是用一個 array 記憶 arguments,<br />最後再 prepend 到最後的 arguments 裡。<br /><pre>class Proc<br />  def curry(&amp;args_munger)<br />    lambda { |*args| call(*args_munger[args]) }<br />  end<br />end</pre><br />不過我覺得不用寫得那麼複雜，所以改寫為：<br /><pre>class Proc<br />  def curry *pre<br />    lambda{ |*post| self[*(pre + post)] }<br />  end<br />end</pre><br />這裡利用了 ruby 的 lambda 有 closure 的特性，把 *pre 紀錄下來，再把他 prepend 到 post 上，最後再呼叫原本的自己（self）。<br /><br />可是這樣不完整，因為你必須明確表達你需要做 curry, 而 Haskell 的 curried function 是可以讓你忽略這件事的。<br /><br />lambda{|a,b,c,d,e|}.curry(1).curry(2).curry(3).curry(4).carry(5)<br /><br />這樣不煩死才怪。我希望能用：<br /><br />lambda{|a,b,c,d,e|}[1][2][3][4][5]<br />也能使用：<br />lambda{|a,b,c,d,e|}[1,2][3][4,5]<br /><br />可惜我暫時還沒找到好做法 XD 目前暫時僅提供可以 mixin 的 module, 大概是這樣用：<br /><br />class Array; include Curry; end<br /><br />接著 array 所有以字母開頭的 method 會多個 curried 版，prefix c. i.e., map =&gt; cmap; foldr =&gt; cfoldr<br /><br />func1 = [1,2,3].cfoldr[:-.to_proc]<br />assert_equal 2, func1[0]<br /><br />做法其實很簡單，就只是檢查參數夠了沒，不夠就重新 curry 一份，夠了就呼叫原始 method. 我原本一直不希望前綴 c, 而以相同名字命名之，然後原本的名字改為：orig_method. 可惜不管怎麼試都失敗，原因不是很清楚，但這種 side-effect 超大的動作，會失敗其實也不怎麼奇怪吧，我想。雖然我總覺得以正常呼叫法而言，應該是沒什麼差才對，也許我有哪裡寫錯了，只是還沒發現而已。<br /><br />*<br /><br />至於其他新增的東西，這裡也稍微介紹一下。首先 Array#filter 只是 select 的 alias, Array#foldl 也只是 inject 的 wrapper. Array#foldr 稍微複雜些，不過概念上只是類似反過來的 inject 而已。Symbol#to_proc 大家應該都很熟，連 active_support 裡面也有。只是單純的 message/method 轉換而已。<br /><br />比較需要提的應該是 Proc#compose 和 Proc#chain. 前者就是數學上的 compose, facets 裡其實也有，不過手癢還是自己做了一份。他有點類似反向的 inject, 很容易做出來。至於 chain, 這是模仿 C++ 的 loki 中的 functor 中的 chain. 效果很單純，就是把 function 串起來而已。這拿來做 callback 應該還算方便，例如：<br /><br />button.on_click = menu.method(:popup).chain button.method(:hide)<br />接著當按鈕被按下去後，選單就會彈出，且按鈕自動隱藏。<br />至於 arguments 和 returns 呢？arguments 會統一給所有人。<br />f1.chain(f2)['XD']<br />這樣 f1 和 f2 都會接到 'XD' 這個 argument. return 則會蒐集成一個 array 並 flatten 回去。<br />[f1 的結果, f2 的結果, f3 的結果,...]<br />如果 f3 的結果是 array, 則會依序儲存：<br />[..., f3 的結果1, f3 的結果2, f4 的結果, ...]<br /><br />這樣做的原因是要讓 chain 還能繼續 chain 而不會出現非常恐怖的 nested array.<br />f1.chain(f2).chain(f3).chain(f4)<br />但是其實可以這樣 chain:<br />f1.chain(f2, f3, f4)<br />結果和上面的會是相同的。<br /><br />在 chain 之間的 travel 還沒做，下次有機會時會做。<br /><br />gem install ludy # to see detail<br /><br />ruby 寫起來真的很簡潔，很多功能 10 行內都能解決。<br /><br />2007.08.07
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/109907#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 07 Aug 2007 06:09:16 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/109907</link>
        <guid>http://thegiive.javaeye.com/blog/109907</guid>
      </item>
      <item>
        <title>Active Scaffold Upload Branch</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/108719" style="color:red;">http://thegiive.javaeye.com/blog/108719</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我真的被 rails plugin 嚇到了。這幾天試著做 web development, 大家應該都知道我跟這個領域不太熟吧？可是，忽然間我覺得，這樣幾乎什麼都能做了。三個 plugin, 依照我嘗試的時間順序：<br /><br />1. <a href="http://www.kanthak.net/opensource/file_column/" target="_blank">FileColumn</a><br />2. <a href="http://wiki.rubyonrails.org/rails/pages/LoginGenerator" target="_blank">LoginGenerator</a><br />3. <a href="http://wiki.activescaffold.com/wiki/show/Active+Scaffold+Upload+Branch" target="_blank">Active Scaffold Upload Branch</a><br /><br />由於一開始使用 FileColumn 碰到了點問題，所以我有稍微 trace 他的 code, 基本上這個 plugin 我覺得算是小玩具，很簡單的小功能，居然沒內建到 rails 中我覺得有點奇怪。畢竟 binary file 一般都是存到 file system 而非 db 中吧？搭配 rmagick 的感覺還算不錯，可惜 helper 似乎不太健全，雖然堪用了。<br /><br />接下來碰到需要 auth 的部份，懶得自己寫，因為只是小地方需要，並不真正屬於我目前所要寫的東西的一部份。重新發明輪子我覺得不是問題，但如果只是想到旁邊的便利商店買罐飲料卻因此得重新發明輪子，呃，這是成本考量與優先序的問題啊。<br /><br />於是試了一下 LoginGenerator, 發現﹍。嗯，還真的是很方便。雖然他是個 gem, 但是 generate 出來之後就沒有 dependency 了，而且要自己改什麼也都很容易。於是 auth 的部份也解決了，畢竟我只是要最簡單的 auth.（雖然他安全性做得如何我就不清楚了，沒有仔細看他的程式碼）<br /><br />到這裡，我都還不覺得怎麼樣。第三個 ActiveScaffold 就真的嚇到我了。因為那真的是非常完整的實做。rails 內建的 scaffold 實在陽春過頭，（儘管陽春過頭了，第一次看到還是著實相當驚豔，現在有種鄉巴佬進城的感覺）除非是最簡單的資料，不然碰上 association 或是 file column, 全部都沒辦法應付。當然，我是可以自己去改自己去擴充，但同樣是成本與優先序的問題，一定得需要用別人的東西。<br /><br />先是找到了 scaffold extensions, 其實我是比較欣賞這種模式。不要產生一堆程式碼，要改什麼，利用 ruby 的 dynamic 機制就好了。只是他文件實在不多，看來看去要擴充好像還滿有難度的，而且雖然號稱支援 association, 卻是﹍。我只能說真的很難用，不過是多個 link 出來罷了，是比沒有好啦，但是應該會邊用邊想打人吧？<br /><br />接下來我乾脆直接 google file column + scaffold 算了。就找到了 Active Scaffold Upload Branch, which is evolved from ajax scaffold. 他的 file column 範例，呃，問題一大堆，有些根本就寫錯了，害我試半天試不出來，有點火大。想說調查一下他的 form 到底是怎麼回事，卻發現他居然整個是用 ajax 寫的，所以 rails 有錯誤不見得會回傳，而且 form 也因為動態產生而無法顯示！<br /><br />幸好有 firefox 的 web developer 這個 add-on, 裝了很久卻很少在用，帶有僥倖的心情找了一下，發現他的 display 功能非常強大，舉凡頁面上出得來的，全部都能顯示。然後才發現，active scaffold 額外產生了一個 record 去存，這樣的話下面這一行就明顯不正確了！<br />&lt;%= file_column_field 'entry', 'file' %&gt;<br />我還是頭一次看到範例有這麼嚴重錯誤的，太相信他結果找錯誤找半天。:( 害我又一直懷疑到 file column 和 rmagick 上，看半天覺得應該沒錯才對。而且這一個 method 也不知道是幹嘛的：<br />　def file_form_column(record, input_name)<br />　　file_column_field 'record', :file<br />　end<br />不是明明就有 partial 了嗎？還是這可以取代 partial? 存疑，不管了。<br /><br />總而言之，現在不只是 file column 的 image upload 沒問題，要自訂欄位也沒問題，版面上又相當漂亮，不會因為拉扯而變形，排序、搜尋等等，也都相當不錯。最重要的是，他的 association 模式跟我所需要的幾乎完全一致！可以同步修改，可以隱藏，可以追加，所有基本功能似乎都有了。<br /><br />本來昏昏欲睡的我，看到這邊實在是很興奮，這東西就算要直接拿來用，都夠格了。而且我相信有什麼不足的話，要修改也容易得很。這有一大半要感謝 Ruby :)<br /><br />老實講，我真想知道硬幹派的 php programmer 看到這些會有什麼想法。一個 phpBB 我看隨便寫一寫說不定就跑出來了﹍。搞不好再過不久，寫網站就真的是只要呼叫 =&gt; 修改 =&gt; 呼叫 =&gt; 修改就結束了。這還真的是很恐怖的一件事。不過同時這也代表著，我們應該把眼光放遠點了。來做個 YouOS 吧！！ XD<br /><br />==<br /><br />最後我還想講一件事，就是寫程式寫這麼久，從來沒碰過幾次時程預估是太長的。但寫 rails 這兩次，很明顯我都估太長了。而且縮短的程度也是非常的多！我想除了要感謝 library 的強大外，雖然我還沒引進 unit test, 只用了人工 test, debug 難度就已經沒有很高了，大部份的錯誤都不會很難抓。當然，這有一個很大的原因是我現在在寫的東西難度很低，可是在這麼不熟悉的情況下，我覺得能夠這樣就真的是非常厲害的了。<br /><br />另一方面其實我是覺得寫 Flash 有趣得多，難度也高得多。但 Flash debug 真的是會讓人想抓狂的一件事﹍。不知道有沒有什麼好用的 debug tool? 不然寫 Flash 永遠進度落後實在是很煩。<br /><br />==<br /><br />script/plugin install http://opensvn.csie.org/rails_file_column/plugins/file_column/trunk<br /><br />gem install login_generator<br />script/generate login<br /><br />svn export http://activescaffold.googlecode.com/svn/branches/upload vendor/plugins/active_scaffold_upload<br /><br />有時候真不知道用 rubygems 好還是 rails plugin 好，但我想比較不穩定的東西，用後者應該是會好很多吧？self contained 這種事，有時候還滿重要的。<br /><br />鄉巴佬全文完。<br /><br />2007.07.28
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/108719#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 16:36:10 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/108719</link>
        <guid>http://thegiive.javaeye.com/blog/108719</guid>
      </item>
      <item>
        <title>[心得] RubyCocoa</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/106221" style="color:red;">http://thegiive.javaeye.com/blog/106221</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          轉自 ptt MacDev 板<br /><br />作者 godfat (godfat 真常) 看板  MacDev<br />標題 [心得] RubyCocoa<br />時間 Tue Jul 24 21:40:20 2007<br />──────────────────<br /><br />嫌 objective-c 太難用嗎？還在等 obj-c 2.0 嗎？先試試 RubyCocoa 吧 XD<br />http://rubycocoa.sourceforge.net/<br /><br />[quote]<br />It lets you write full-stack Cocoa applications in Ruby. It is also possible to write a Cocoa application that mixes Ruby and Objective-C code.<br />[/quote]<br /><br />how to install?<br />有灌 macports 的話：（當然，xcode 是一定要灌的）<br />sudo port install ruby<br />sudo port install rb-rubygems（非必要，但建議）<br />sudo port install rb-cocoa<br /><br />文件放在：<br />/Developer/Documentation/RubyCocoa<br /><br />範例放在：（相當豐富）<br />/Developer/Examples/RubyCocoa<br /><br />我這裡有一個簡化的 hello world, 可以小瞥一下：<br /><br />require 'osx/cocoa'<br />include OSX<br /><br />app = NSApplication.sharedApplication<br /><br />hello = NSWindow.alloc.initWithContentRect_styleMask_backing_defer [200.0, 300.0, 100.0, 100.0], 15, 2, 0<br />hello.setTitle 'Hello'<br /><br />btn = NSButton.alloc.initWithFrame [10.0, 10.0, 80.0, 80.0]<br />hello.contentView.addSubview btn<br />btn.setTitle 'Hello World!'<br />btn.setAction 'stop:'<br />btn.setBezelStyle 4<br /><br />hello.display<br />hello.orderFrontRegardless<br /><br />app.run<br /><br />另外可以順便請教一下，如何讓視窗在按下 X 時關閉而不是隱藏嗎？我沒寫過 obj-c（XD）, 昨天文件翻來翻去找不到要怎麼做<br /><br /><br /><br />另一方面，如果只是要做 GUI 而不需要 call mac 的 api 的話，個人強力推薦 QtRuby<br /><br />sudo port install qt4-mac（這個會 build 很久）<br />sudo port install cmake<br /><br />QtRuby 沒有這麼方便的安裝法，要到<br />http://rubyforge.org/projects/korundum/<br />抓 qt4-qtruby, 然後進到目錄下：<br /><br />cmake .<br />make<br />sudo make install<br /><br />於是就可以正常使用 QtRuby 了，hello world 如下：<br /><br />require 'qt'<br />include Qt<br />app = Application.new ARGV<br />hello = PushButton.new "Hello World!"<br />hello.resize 100, 30<br />hello.show<br />app.exec<br /><br /><br /><br />Qt 是什麼？<br />http://trolltech.com/products/qt<br />是我用過最棒的 GUI toolkit, 使用 C++ 語言。可用 GPL 授權或用商業授權（很貴），二擇一（這是 Qt 唯一被批評的點）<br /><br />Ruby 是什麼？<br />http://ruby-lang.org/<br />是我用過最方便的 programming language, 使用 Ruby license（很自由）歡迎來 ptt Ruby 板參觀 :p<br /><br /><br /><br />Mac OS 10.5 將搭載 Ruby 1.8.6 + Rails 1.2.3, 想試試 Rails 寫網站嗎？<br />sudo gem install rails<br />不需要等 10.5 就可以輕鬆試驗了 XD<br />http://rubyonrails.org/<br /><br />==<br /><br />發完神經了，有傷眼請見諒 XD<br /><br />--<br /><pre>#!/usr/bin/ruby          [露比] /Programming (Kn|N)ight/            看板《Ruby》<br /># if a dog nailed extra legs that          http://www.ptt.cc/bbs/Ruby/index.html<br /># walks like an octopus, and                            Welcome ~Ruby@ptt~<br /># talks like an octopus, then       ◢█◣            http://www.ruby-lang.org/<br /># we are happy to treat it as       █                http://www.ruby-doc.org/<br /># if it were an octopus.            ◥  ◤            http://www.rubyforge.org/</pre>--<br />※ 發信站: 批踢踢實業坊(ptt.cc)<br />◆ From: 220.135.28.18
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/106221#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 14:37:42 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/106221</link>
        <guid>http://thegiive.javaeye.com/blog/106221</guid>
      </item>
      <item>
        <title>Ruby GUI</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/104246" style="color:red;">http://thegiive.javaeye.com/blog/104246</a>&nbsp;
          发表时间: 2007年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [begin edited]<br /><br /> 作者  godfat (godfat 真常)                                        看板  Ruby <br /> 標題  Re: [心得] GUI                                                         <br /> 時間  Sun Jul 22 18:13:32 2007                                               <br />───────────────────────────────────────<br /><br />說是這樣說，不過真正開始測試的時候，我發覺﹍<br /><br />1. wxRuby<br />實在有點難用﹍有一堆不該有的參數要傳來傳去﹍放棄<br /><br />2. FXRuby<br />mac 上其實是可以用啦﹍只是需要 X11, 不能用 Aqua<br />結果就是﹍對 user 來說很難用，放棄<br /><br />3. QtRuby<br />結果還是得回到 QtRuby...<br />cmake .<br />make<br />sudo make install<br /><br />測試了一下，正常可用 Qt4<br />不過市面上的文件好像以 Qt3 為多就是了<br /><br />嘖，沒有 port install qtruby 真的很可惜<br />這樣以後要升級或是反安裝就比較麻煩了<br />不知道當初安裝的 source 是不是要留下來以便反安裝作業<br /><br />--<br />--<br />※ 發信站: 批踢踢實業坊(ptt.cc) <br /><br />[end edited]<br /><br />關於 computer science 這個領域，除了程式語言（programming language）與物件導向（object-oriented）外，再下一個興趣大概就是使用者圖形介面了吧（GUI）. 所以我一直想找個自己喜歡的 toolkit 來用，在 C++ 中無非就是 Qt4 了，不過在 Ruby 中，似乎沒有一個比較完美的 solution, 一個個來看。<br /><br />在這之前，我先說明一下我用過的 C/C++/Java GUI toolkit.<br /><br />1. MFC, 學校在教如何剪貼 MFC code, 我是叛逆份子，所以一個字都沒聽進去。不用別人說很糟，光看第一眼就覺得很糟，更何況他又是被罵得半死的東西。<br /><br />2. wxWidgets, 這算是我第一個使用的 GUI toolkit, 基本上，我認為這真的是個很強大的東西，沒話說。不過最令人嘖嘖稱奇的應該是他跨平台的能力，如果我沒記錯的話，他跨的平台好像比 Java 還多！不過因為風格問題，我不是很喜歡。基本上，我認為 wxWidgets 的風格有些過於老舊，寫起來感覺不是很好。Ruby binding 叫 wxRuby.<br /><br />3. Qt, 我想正是因為 wxWidgets 跟我不太合，所以才繼續找下去。不料找到 Qt4, 我認為這應該是接近完美的 solution 了。有人說，Qt 至少領先其他人十年，也許這麼講並不為過。最令人詬病的，大概就是你只能從 GPL 或超昂貴的商業 solution 兩種 license 中選一種。其實我不覺得這對我來說會是很大的困擾，open source 沒什麼不好，雖然 GPL 是有點太激進了些。Ruby binding 叫 QtRuby.<br /><br />4. GTK+, 這個其實我不只沒用過，甚至連看都沒看過。理由很簡單，就是我不想用 C 想用 C++. 當然我知道 GTK+ 評價不錯，也有 Glade 和 win32 的 port, 只是似乎沒有足夠的推力讓我去嘗嘗看。<br /><br />5. Swing, 會碰這個完全只是因為需要用 Java. 我個人是覺得他跟 wxWidgets 各有千秋，但同樣遠遜於 Qt. 不過也許這樣比較並不太公平，Java 天生就是沒 C++ 強。所以 Qt 遠勝可能是理所當然的？Ruby 要用可以使用 JRuby.<br /><br />6. Ultimate++, 其實這個我沒用過，不過看起來是不錯。沒去試主要有三個原因，一，他綁 IDE, 這個我很不爽。二，他的命名法我不能接受。三，Qt 很好。XD 其實你去看他的網站，他有一個範例程式，並用各種 toolkit 來實做。我個人認為這個動作滿不誠懇的，他有故意挑其他人弱點的嫌疑。而且各 toolkit 做到的東西明顯有差異，這樣比並不公平。不誠懇，不喜歡。<br /><br />7. Notus/VCF, 這兩樣 toolkit 都有一個很大的特色，就是 template template and template... 基本上用 C++ 當然是要用 template 啊！！不過知道這兩樣東西時我已經有一段時間沒碰 GUI 了，所以並沒有仔細調查這兩個 toolkit 感覺如何。但我想如果沒辦法接受 Qt 的話，這兩套 toolkit 值得一看。<br /><br />8. .NET/mono, 這個其實我只用過 Visual C++ 2005 Express 稍微拉了一下介面，感覺還不錯，但直接寫起程式不知道是什麼感覺。Ruby 要用的話，或許可以試試 IronRuby, 不過我個人對 .NET 沒什麼好感，就不去試了。<br /><br />9. VCL, Borland 的招牌，我用過 Turbo C++ Explorer, 感覺是﹍基本上我覺得沒有 .NET 好的感覺。而且要跨平台恐怕有點難，所以就不考慮了。更何況這些好像也不算 open source 的吧？<br /><br />10. FOX, 這個是我最沒聽過的 toolkit, 是去找 Ruby GUI 時才發現他的存在，所以我一點都不知道他的狀況究竟如何。評價似乎是不錯，而且好像很年輕。只是呢﹍FXRuby 似乎沒有 mac 的 port, 而我也已經有點懶得用 C++ 寫 GUI 了，所以還是暫時跳過吧﹍。基本上沒有跨 win32/x11/aqua 三大系統的 toolkit, 我就沒什麼興趣試了。<br /><br />本來只想隨意講一點的，不知不覺就扯多了。接下來看 Ruby 能使用的東西：<br /><br />1. tk, 沒記錯的話，這個被 ruby 內建起來了。不過似乎是用過的都說爛，所以還是不要多考慮吧？<br /><br />2. FXRuby, FOX 的 ruby binding, 評價相當不錯，唯一的缺點也許是還沒有 mac 版的樣子？我想未來應該值得繼續關切，雖然我還沒看過他程式寫起來像什麼樣子。要試用的話，除了需要安裝 FOX, FXRuby 就：gem install fxruby<br /><br />3. wxRuby, wxWidgets 的 ruby binding, 我是看到有人批評寫起來像在寫 C++, 這應該算是一個滿大的缺點，不過看在他功能強大，跨平台能力驚人的份上，還是值得試試看吧。要試用的話，除了需要安裝 wxWidgets, wxRuby 就：gem install wxruby<br /><br />4. QtRuby, Qt3 與 Qt4 的 ruby binding, 基本上評價仍然是相當地好，唯一的兩大缺點，第一個是沒有 gem, 不能 gem install qtruby, 第二個是在 windows 上要安裝似乎非常困難，沒有簡單的方法。但我相信假以時日，這兩個問題都能夠解決（嗚嗚）。<br /><br />5. Swing, 要灌 JRuby, 我的 macports 似乎找不到 jruby, 我又不想從 sun 的網站抓下來灌，再說，我也沒喜歡過 swing 過，所以就懶得試了。<br /><br />6. Mono, 我有灌 mono, 不過不是很清楚能不能用 IronRuby 之類的東西存取，之所以寫在這，算是做個筆記，說不定可以使用這樣。<br /><br />7. GTK+, 我不是很確定有沒有 ruby binding, 但我想應該會有才是。不試的理由同上，所以也只是暫時筆記。<br /><br />Ruby 的 GUI 比較有名的大概就這幾個了吧。其實我是一直想試 QtRuby 的，雖然 windows 上似乎不太容易使用，但相信假以時日一定可以的。而讓我卻步最大的問題點在於，不能用 gem 安裝，macports 也找不到 QtRuby. 也就是說，我得親自 ./configure make make install, 但我不喜歡這樣，管理不便。所以我決定還是暫時放下他，等他有 gem 或是 port 時再說吧！<br /><br />FXRuby 因為沒用過 FOX, 所以也還是放著再說。更何況據說是沒有 mac 版，那我試屁啊﹍。所以左右思量之下，我還是決定先試 wxRuby! 安裝方便，強大的跨平台能力，雖然是 C++ style 而非 the ruby way, 但對我來說 C++ style 也不是那麼地令人排斥，也許有點詭異，但我覺得也可以用自己想要的方式重新 wrap 一次，對 ruby 來說那是如此簡單的事！<br /><br />so have a try with wxRuby!<br /><br />this is the hello world:<br /><br /><pre>require 'rubygems'<br />require 'wx'<br /><br />class HelloWorld &lt; Wx::App<br />  include Wx<br />  def on_init<br />    helloframe = Frame.new nil, -1, "Hello World"<br />    StaticText.new helloframe, -1, "Hello World"<br />    helloframe.show<br />  end<br />end<br /><br />HelloWorld.new.main_loop</pre><br /><br />sudo port install wxwidgets<br />sudo gem install wxruby
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/104246#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jul 2007 16:17:20 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/104246</link>
        <guid>http://thegiive.javaeye.com/blog/104246</guid>
      </item>
      <item>
        <title>閉關百日</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/104247" style="color:red;">http://thegiive.javaeye.com/blog/104247</a>&nbsp;
          发表时间: 2007年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          即日起，本人即將到關西營區閉關百日，休養生息以及盡男生該盡的義務，大概今年十一月回來。新兵訓練出來後，就是國防役的生活啦。<br /><br />對了，因為新訓好像可以看點書，所以預計會帶本練功秘笈進去練功<br />HTTP：The Definitive Guide<br /><a href="http://bp1.blogger.com/_8vS0KjIsbko/RqLLewHCCdI/AAAAAAAAAIw/GNUcUCTXeII/s1600-h/1565925092_cat.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp1.blogger.com/_8vS0KjIsbko/RqLLewHCCdI/AAAAAAAAAIw/GNUcUCTXeII/s320/1565925092_cat.gif" id="BLOGGER_PHOTO_ID_5089854258052991442" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a>前陣子太忙了，都沒時間看書練鍊基本功好像也不錯。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/104247#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jul 2007 03:22:29 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/104247</link>
        <guid>http://thegiive.javaeye.com/blog/104247</guid>
      </item>
      <item>
        <title>Passion</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/100227" style="color:red;">http://thegiive.javaeye.com/blog/100227</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天我的一個好朋友告訴我「我好像失去了程式設計的熱情了。」我聽著這句話，突然覺得我蠻幸福。<br /><br />要說我從來沒有這種感嘆是騙人的。上上次擁有這種想法的時候，我那時正被論文跟 PHP 搞的很疲憊，剛好遇到 Ruby on Rails ，那種超乎想像的設計讓我完全掉入這個世界，也重新找回程式真正的熱情。<br /><br />上次出現這樣的想法的時候，剛好是前陣子案子太忙，事情多到我想殺人。一連串的忙碌讓我忘記了寫程式帶給我的快樂，只是一直感覺到累累累。Ruby on Rails 的東西也是這樣，成長的很快，但是我是不是跟著他一起成長呢？還是一直原地踏步呢？我到底追求的是什麼呢？我得到了什麼呢？<br /><br />很幸運，這種疲憊感很快的就不見了，因為我接了這個 Case ，<a href="http://jonescup.roodo.com/">29屆瓊斯盃網站</a><br /><a href="http://jonescup.roodo.com/images/agents/A3/header.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://jonescup.roodo.com/images/agents/A3/header.gif" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" /></a>小時候，我看著東方，阿龍，阿三等人在瓊斯盃奮鬥，現在呢？我以官網製作者的身份，坐在場邊看著中華隊在場上奮鬥。不一樣的我，一樣為中華隊加油的心情。我為了這個案子，連續熬夜好幾個晚上，連 Blog  都沒時間寫了，就是為了呈現一個最好的瓊斯盃網站。這麼堅持的理由不是因為專業，只是因為我是一個運動迷，我是一個中華隊的球迷，我要為他們加油。<br /><br />累是超級累，但是我找回了失去的「Passion」。一個專門屬於我的 Passion。不瞞各位，我 7/23 就要進去軍中新訓三個月，在進去軍中之前可以做出一個這們有意義的東西，真的很開心。<br /><br />一年前我開了這個 Blog ，也是這樣的熱情不是嗎？<br /><br />我以身為 Ruby on Rails 使用者自豪，我以身為第29屆瓊斯盃官網製作者自豪。不管你是誰，用什麼語言，什麼 Framework，別忘記你的熱情，千萬要對你的工作感到自豪。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/100227#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 10:57:54 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/100227</link>
        <guid>http://thegiive.javaeye.com/blog/100227</guid>
      </item>
      <item>
        <title>ruby facets</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/99201" style="color:red;">http://thegiive.javaeye.com/blog/99201</a>&nbsp;
          发表时间: 2007年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          老實講，ruby 有一個地方真討厭，那就是每次都把我想做的東西做完了。有了 ruby, 我不覺得還有需要再自己弄一個程式語言，做得比我想像中的還好。唯一的缺點大概只有 lib 還不夠多，但有了 facets 的話，那也真的是差不多了。<br /><a href="http://facets.rubyforge.org/">http://facets.rubyforge.org/</a><br />該有的幾乎都有了，差的只剩下一些小東西。如果早點發現這東西，大概就不會想弄 ludy 了吧。<br /><br />不過想用 facets 有點麻煩，例如我想用 Array#shuffle, 就必須<br />require 'rubygems'<br />require 'facets'<br />require 'array/shuffle'<br />這麻煩到爆炸了吧！！不過有個好東西：<br /><br />require 'rubygems'<br />require 'facets/automatic'<br /><br />接下來，就放心使用 Array#shuffle 吧！因為 automatic 會自動幫你 require... 我沒去看他的實做，但我猜是建 table 吧。有一個小缺點，例如你想這樣做：<br /><br />[1,2,3].shuffle.map &amp;:to_s<br /><br />很不幸，這樣會失敗。shuffle 可以正常自動 require, 但是 Symbol#to_proc 不能藉由這個方法自動 require. 如果你寫：<br /><br />[1,2,3].shuffle.map &amp;:to_s.to_proc<br /><br />這樣是 ok 的，automatic 可以自動 require 該 require 的東西。問題大概出在，&amp;:to_s 是 implicit call, automatic 偵測不到。所以第一次使用，還是必須明確說明需要用到 Symbol#to_proc, 接下來就可以快樂地使用<br /><br />[1,2,3].shuffle.map &amp;:to_s<br /><br />了。或是前面自己手動 require:<br /><br />require 'rubygems'<br />require 'facets'<br />require 'facets/automatic'<br /><br />第二行的 require 可以讓你使用 Symbol#to_proc, 所以就可以直接寫：<br /><br />[1,2,3].shuffle.map &amp;:to_s<br /><br />快去安裝 facets 吧！！<br />gem install facets<br />另一個 ruby web framework nitro 0.41.0 也有用到 facets !! 雖然是用 1.4.5 版的，而現在最新的 facets 是 1.8.54（以 2007.07.08 為準的最新版本）有機會也可以試試 nitro<br />gem install nitro<br />官方網站是：<br /><a href="http://www.nitroproject.org/">http://www.nitroproject.org/</a><br />缺點非常明確！幾乎沒有文件 XD 我很少看到一個東西的文件可以少到這樣。<br /><br />不多說了，我現在頭痛就算了，眼睛也很痛。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/99201#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Jul 2007 14:22:28 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/99201</link>
        <guid>http://thegiive.javaeye.com/blog/99201</guid>
      </item>
      <item>
        <title>Rails 取名的一些禁忌</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/94416" style="color:red;">http://thegiive.javaeye.com/blog/94416</a>&nbsp;
          发表时间: 2007年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天寫 Rails 寫到一半，突然發現出現<br /><blockquote>wrong number of arguments (0 for 1)</blockquote>然後整個 controller 裡面的頁面都出現同一個 Error。之前寫的同一個controller, 裡面正常的頁面全部都不能 work，全部都覆蓋在這個Error之下。<br /><br />經過<a href="http://lists.rubyonrails.org/pipermail/rails/2006-May/038922.html">這一個文章</a>的講法　，我發現到我的 controller 裡面有個 action 叫做 <span style="font-weight: bold;">send</span>，這是 ActionController 裡面的 function，Ruby 以為我要 Overridden 這個 function，所以才有這種情況。<br /><span style="font-weight: bold;"><br />有些錯誤不實際去做還真的不知道，Rails 有一些取名的禁忌，都記載在<a href="http://wiki.rubyonrails.com/rails/pages/ReservedWords">這頁</a>，這裡列出一些常犯的method name , 這些是絕對不能取的<br /><ul><li>display</li><li>format</li><li>load</li><li>send</li><li>system</li><li>process<br /></li><li>timeout </li></ul>有些名字是 DB 裡面的column不能取的<br /><ul><li>notify <a href="http://dev.rubyonrails.org/ticket/62"></a></li><li>open<br /></li><li>quote</li><li>type</li></ul></span>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/94416#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Jun 2007 06:11:07 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/94416</link>
        <guid>http://thegiive.javaeye.com/blog/94416</guid>
      </item>
      <item>
        <title>淺談 Comet PUSH Server 架構</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/94113" style="color:red;">http://thegiive.javaeye.com/blog/94113</a>&nbsp;
          发表时间: 2007年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近有機會碰到 Comet 或是 PUSH Server 這類的技術，剛好一直覺得之前寫的 <a href="http://lightyror.thegiive.net/2006/11/comet-for-ruby-on-rails-and-mongrel.html">Comet For Ruby on Rails and Mongrel</a>不夠有感覺，所以再寫一次。這裡先得講一聲，我的認知就是 Comet == Server PUSH ，有錯請告知。<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">HTTP 統治網路界</span></span><br /><br />簡單來說，一般的 Socket Programming 都是保持一個雙向的連線，可以送可以收。但是 HTTP Design 為了以下理由，設計方向為單向的。<ol><li>提高 Server 處理效能</li><li>方便作 cache，Proxy 容易融入<br /></li><li>方便作 Server Farm</li><li>網路發展初期，實體硬體狀況不佳，很容易造成 connection lose，單向傳輸可以有效避免瞬斷</li></ol>我跟你 request ，你回我 HTML ，交易完成，connection close，This is HTTP。<br /><br />如果以 HTTP 當初設計的初衷「<span style="font-weight: bold;">文件交換</span>」來看，我們發現到他設計的非常的好，也相當成功的在當初糟糕的網路環境下成功的生存下來。但是就是因為 HTTP 設計太成功了，導致現在網路業者一股腦兒將各式各樣的 App 放在 HTTP 的架構上，想要用當初只是為了文件交換的協定，變成一個包山包海的協定，自然產生很多問題。<br /><br />HTTP 最大的問題在於<span style="font-weight: bold;">即時性</span>。<br /><br />要解決 HTTP 的即時性的問題，有 Polling 跟  Server PUSH 這兩種方式。<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Polling</span></span><br /><br />我們想要做到即時傳訊，Server 端觸發 Client 事件等等功能，以現行的 HTTP 架構下，都得利用 Polling 的方式來做到。Polling 其實也就是現在的 RSS Reader 的作法，RSS Reader 會每過半個小時，或是一個小時去問對方 Server 有沒有新文章。用 Polling來作即時性的功能，最大的好處在於容易寫，因為他完全符合 HTTP 的架構，但是最大的壞處在於不夠即時。以 RSS Reader 來說，每過一個小時去問有沒有新文章，代表的意思就是有一整個小時的空窗期，你得每過一個小時才知道有沒有新文章。<br /><br />以 RSS Reader 的屬性來說，採用 Polling 有很多好處<br /><ol><li>我其實不需要知道立刻知道有多少新文章，使用者對於 RSS 的即時性需求沒那麼高</li><li>Blog 系統多變，與其設定一個各 Blog 系統共通的 Socket 協定，不如設定一個共通的文件交換格式來的簡單</li></ol>但是如果使用聊天室，即時訊息傳遞，Polling 就不是一個好主意了。聊天最怕不夠即時，所以必須加快 Polling Interval，但是會帶來「提高 Server 負載」的後果。你一分鐘 Polling 一次，跟一小時一次，前者的負載是後者的 60 倍。等於你用負載換來即時性。這個在人一多的情況下會造成相當大的負擔。<br /><br />因為 Polling 在某些地方不是那麼的好，所以才有 Server PUSH 機制出現。<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Server PUSH</span></span><br /><br />Server PUSH 是建構在建立一個不中斷的 Socket Connection 下面。一個作法是使用 iframe ，送出的header中要把content-type設為” multipart/x-mixed-replace”，來保持一個不間斷的 HTTP Connection。另外一個作法就是用 Flash 來跟 Server 建立一個 xmlsocket。保持一個不中斷的 Connection ，代表 Server 有新訊息就可以直接傳給 Client，不用等待 Client 過來 request。<br /><br />這樣可以帶來的好處就是，Server 有狀態更新才會有網路傳輸，如果沒有狀態更新，就不會浪費資源。而 Polling 是不管有沒有狀態更新，都得花上固定的網路傳輸成本，當然就會比較浪費資源。<br /><br />舉個例子，考試成績快出來了，你每個小時都從宿舍去公佈欄看成績出來了沒，假設成績沒那麼快出來，你自然會花上許多無意義的時間在宿舍到公佈欄之間的往返上面（ Polling ）。但是如果老師有你的手機（不斷線的 Connection ），成績公佈老師就打電話給你，告訴你的成績（Server Push）。這樣不是好多了嗎？<br /><br />但是你會問，假設老師打電話給你，你在收不到訊號的地方怎麼辦？假設班上人數太多，老師不是就會打電話打到手軟？<br /><br />這剛好講到 Server PUSH 的壞處，第一個壞處是假設 Client 網路不好，connection 造成瞬斷，那麼你的訊息就會消失不見了。另外一個壞處就是，持續性的 connection 很難做到 Load Sharing機制，通常大家都只會跟同一台  PUSH Server 作連接，這台 PUSH Server 在人一多就會產生大負載度的問題。這當然有辦法解決，只是這就已經要討論到很深的地方了。<br /><br />雖然 Server PUSH 不是萬能的。不過整體來說，以傳遞「<span style="font-weight: bold;">即時性需求高的訊息來說</span>」，PUSH Server 帶來的好處絕對會比 Polling 來的好，這倒是無庸置疑的。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/94113#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Jun 2007 12:52:50 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/94113</link>
        <guid>http://thegiive.javaeye.com/blog/94113</guid>
      </item>
      <item>
        <title>About Me</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/93721" style="color:red;">http://thegiive.javaeye.com/blog/93721</a>&nbsp;
          发表时间: 2007年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我是誰？<br /><br />我叫 thegiive，網頁程式設計師一名，喜歡簡捷有力的東西。Ruby 是我最愛的語言，Ruby on Rails 是目前最好的網頁設計框架。要聯絡我請寄信到<a href="http://www.thegiive.net/image.png/image-full.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://www.thegiive.net/image.png/image-full.jpg" border="0" alt="" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" /></a>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/93721#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 24 Jun 2007 04:24:13 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/93721</link>
        <guid>http://thegiive.javaeye.com/blog/93721</guid>
      </item>
      <item>
        <title>Active Resource 已經打包成 GEM 了</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/93549" style="color:red;">http://thegiive.javaeye.com/blog/93549</a>&nbsp;
          发表时间: 2007年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Rails 1.2 的最新力作 Active Resource 已經是 beta 的 gem 了，以後安裝的人就不用每次都用 svn 下載了。<br /><br />安裝方式就是 <br /><blockquote><br />gem install activeresource —source http://gems.rubyonrails.org<br /></blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/93549#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 23 Jun 2007 08:53:57 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/93549</link>
        <guid>http://thegiive.javaeye.com/blog/93549</guid>
      </item>
      <item>
        <title>SliceHost 入手</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/93275" style="color:red;">http://thegiive.javaeye.com/blog/93275</a>&nbsp;
          发表时间: 2007年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我是程式設計師，工作以外的日子，我希望能夠有一台 Server 讓我搞一些小玩意，那我該怎麼辦。<br /><br />通常大家會推薦 Share Web Hosting。但是仔細想想我們對 Share Web Hosting 第一個印象是什麼？大家一起用一台 Apache，一起用一台 MySQL，好擠呀。想用啥新服務不行，要等公司覺得有商業立基再說，好煩呀。想開個其他 PORT 來跑東西，不行。想幹嘛...不行，不行，不行。敝公司覺得你想要搞垮我們，所以你不可以。充其量，這些 Share Web Hosting 公司只是為了一般不了解架站的大眾而服務。但是像我們這種可以獨立控制一台 Linux 的人，就是不爽。<br /><div><br /></div><div> </div><div dragover="true">那 Dedicated Server 呢？我們看看 <a href="http://www.godaddy.com/gdshop/hosting/build.asp?isc=gooh2002aa&amp;display=dedicated">Godaddy 的價碼</a>，最經濟方案 63.00美金一個月。嗯嗯恩....我爸不是李嘉誠，我們也不是要搞公司，也只好重重拿起廣告單，輕輕的放下。<br /><br />我們發現到市面上只有兩個選擇。很便宜的 Web Hosting 跟很貴的 Dedicated Server。可是中間有一個<br /><blockquote><span style="font-style: italic;">想要一台</span><span style="font-style: italic;">便宜又方便的</span><span style="font-style: italic;"> Server 玩玩</span></blockquote>的斷層。我們已經厭倦了 Web Hosting 的不自由，但是又沒有 Dedicated Server的需求。以前這樣的需求只能夠自己架站。但是架站的網路，電源，機房等等問題又讓我們卻步。我們是 RD ，我們想玩 Server ，但是不想碰硬體的東西。<br /><br />這時候 <a href="http://www.slicehost.com/"> slicehost</a>  這樣的 <a href="http://en.wikipedia.org/wiki/Vps">Virtual Private Server</a> 服務就是我們的解藥，當你付錢給 slicehost 後，他會給你一台 Linux 機器讓你玩，你可以 ssh 進去，你有 Root 權限，你有獨立 IP，你擁有一整台機器可以玩，而且價錢是剛好坐落在 Web Hosting 跟 Dedicated Server 中間，等於你每個月花20~30美金的價碼請一個專職網管幫你管機器，什麼硬碟壞掉，CPU 燒掉，主機板進水等等事情都不用煩惱，你只需要寫你的程式即可。<br /><br />至於他還有很多優點<br /><br /><span style="font-weight: bold;">第一個</span>是 SliceHost 有 5種 Linux 可以自由選擇，Ubuntu，Gentoo，CentOS，Debian，Fedora，你可以自由的選擇你想要的 OS。而且這裡有一個小插曲，我一開始選錯了 OS ，本來想說要寄信給 SliceHost 公司請他們換 OS，沒想到他們提供了 rebuild slice 的功能，你可以線上就把你的 Server OS 換掉。而且這個功能等於是當你被破台的時候，還是可以重灌 OS。<br /><br /><span style="font-weight: bold;">第二個</span>是因為他是 Ruby on Rails 寫的後台。並且網頁提供一個 <a href="http://antony.lesuisse.org/qweb/trac/wiki/AjaxTerm">AJAX Term</a> console mode，當你機器 reboot 的時候，你可以看到你的 Linux 正在重開的畫面，或是當你重灌 Linux 的時候，你可以看到目前重灌的進度，有你在機房修機器的 fu~~~（註1）<br /><br /><span style="font-weight: bold;">第三個</span>是 SliceHost 標榜不超賣，大家說 Performance 很不錯。<br /><br />價錢我是選擇 20美金一個月的方案，256MB Ram + 10G Storage + 100G Bandwith 很夠用了。而網路上面<a href="http://blog.tinyau.net/archives/2007/06/13/first-experience-with-virtual-private-server/">大家</a><a href="http://blog.pbg4.org/2007/6/12/rails-on-slicehost-1">提到</a>一個很重要的問題，大家說因為 SliceHost 太熱門了，申請要等快一個月的情況並沒有發生，我只等半天。<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">註1</span></span><br />這個 console mode 真的好有fu~~<br />重灌畫面<br /><br /><a href="http://bp3.blogger.com/_8vS0KjIsbko/Rns2lbvdpcI/AAAAAAAAAIk/bplbdu4AwGw/s1600-h/%E6%93%B7%E5%9C%96_4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp3.blogger.com/_8vS0KjIsbko/Rns2lbvdpcI/AAAAAAAAAIk/bplbdu4AwGw/s320/%E6%93%B7%E5%9C%96_4.png" id="BLOGGER_PHOTO_ID_5078713021520258498" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a><br />登入 console<br /><br /><a href="http://bp2.blogger.com/_8vS0KjIsbko/RnsqiLvdpZI/AAAAAAAAAIM/eRYMpbXUJ8c/s1600-h/%E6%93%B7%E5%9C%96_1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp2.blogger.com/_8vS0KjIsbko/RnsqiLvdpZI/AAAAAAAAAIM/eRYMpbXUJ8c/s320/%E6%93%B7%E5%9C%96_1.png" id="BLOGGER_PHOTO_ID_5078699771546150290" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a><br />開機畫面<a href="http://bp0.blogger.com/_8vS0KjIsbko/RnsrFrvdpbI/AAAAAAAAAIc/7A2NnOTpszQ/s1600-h/%E6%93%B7%E5%9C%96_3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp0.blogger.com/_8vS0KjIsbko/RnsrFrvdpbI/AAAAAAAAAIc/7A2NnOTpszQ/s320/%E6%93%B7%E5%9C%96_3.png" id="BLOGGER_PHOTO_ID_5078700381431506354" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a>Reboot 畫面<br /><a href="http://bp3.blogger.com/_8vS0KjIsbko/Rnsq8bvdpaI/AAAAAAAAAIU/52GtTt9rXgk/s1600-h/%E6%93%B7%E5%9C%96_2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp3.blogger.com/_8vS0KjIsbko/Rnsq8bvdpaI/AAAAAAAAAIU/52GtTt9rXgk/s320/%E6%93%B7%E5%9C%96_2.png" id="BLOGGER_PHOTO_ID_5078700222517716386" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/93275#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Jun 2007 07:49:29 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/93275</link>
        <guid>http://thegiive.javaeye.com/blog/93275</guid>
      </item>
      <item>
        <title>300篇達成，版面大修</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/92545" style="color:red;">http://thegiive.javaeye.com/blog/92545</a>&nbsp;
          发表时间: 2007年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          這位客官，你沒走錯，為了慶祝本 Blog 邁向第三百篇文章，我在版面上作了很大幅度的改變。<br /><br /><span style="font-weight: bold;">1. 搜尋改用 Google</span><br /><br />我發現到 Blogger Nav Bar 的搜尋真是爛到極點，所以我砍了 Blogger Nav Bar，並且在側邊欄直接呼叫外掛 Google 大神來幫我作搜尋，大家以後可以直接使用右邊的 Search Bar 來搜尋本站的文章。<br /><br /><span style="font-weight: bold;">2. 版型大改</span><br /><br />版型改成我最喜歡的白底黑字，而特別的字就用紅色。除此之外我拿掉幾乎所有的 Blog 的小玩意，包含繼續閱讀，Tag Cloud...等等最 Javascript。這個動作的原因是因為我發現<br /><blockquote>來看我的 Blog 的人，你們只是來看內容而已</blockquote>這個趨勢從 Google Analysis 就可以知道<br /><br /><a href="http://bp1.blogger.com/_8vS0KjIsbko/RnkTJbvdpYI/AAAAAAAAAIE/lnOpE8HZ0Cc/s1600-h/%E6%93%B7%E5%9C%96_2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="http://bp1.blogger.com/_8vS0KjIsbko/RnkTJbvdpYI/AAAAAAAAAIE/lnOpE8HZ0Cc/s320/%E6%93%B7%E5%9C%96_2.png" id="BLOGGER_PHOTO_ID_5078111107623527810" border="0" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" /></a><br />這是我某段時間流量的來源的統計圖，我們可以發現到超過一半以上的人是被 Google 大神抓進來，然後查到你想要的東西，走人。<br /><br />這個推論，也從本 Blog 黏度只有 2.09 個可以知道（註1），我的觀眾都是查詢資料，查完一兩個網頁之後走人，也不會逗留。<br /><br />就一般網頁的角度來說，我該做出一些事情來增加黏性呢，但是想想不對<br /><blockquote>等等，幹嘛增加黏性呢？這是一件好事呀。</blockquote>因為我當初成立 本 Blog 的目標，就是一個知識為主的 Blog 。而上述現象代表我的 Blog 越來越 Wiki 化了，使用者看待這個 Blog 是一個已知識為主的網頁，而非一個閒聊的網頁。與其弄一堆拉哩佈達的東西讓大家傷眼睛，還不如砍掉所有無意義的部份，只留下最簡單的黑底白字 ，讓大家查詢的時候更加的快而迅速的查到相關的資料。這才是友善的對待顧客吧 。<br /><br />所以我改了版面，希望大家喜歡。<br /><br />註1<br />黏度：點閱網頁/造訪數
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/92545#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Jun 2007 16:17:07 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/92545</link>
        <guid>http://thegiive.javaeye.com/blog/92545</guid>
      </item>
      <item>
        <title>Textile，RedCloth，Vim</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/91362" style="color:red;">http://thegiive.javaeye.com/blog/91362</a>&nbsp;
          发表时间: 2007年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Textile</strong></p>    <p>有在用 Instiki 的人就知道，他是使用 <a href="http://en.wikipedia.org/wiki/Textile_%28markup_language%29">Textile</a>  這種語法。Textile 這種語法設計的目的是因為 Web 當中的核心 <span class="caps">HTML </span>語法，實在不是為為了方便人書寫而設計的，裡面格式相當的囉唆而且難以書寫閱讀。為了書寫方便，所以產生 Textile 這種 <a href="http://en.wikipedia.org/wiki/Lightweight_markup_language">Light Weight Markup Language</a> 語法。</p>    <p>Textile 的使用方式就不再詳加介紹了，可以看看 <a href="http://en.wikipedia.org/wiki/Textile_%28markup_language%29">Wikipedia的介紹</a> ，總之 Ruby on Rails 上面很多套件都相當友善的支援 Textile。</p><br /><br /><br /><p><strong><span class="newWikiWord">Red Cloth</span></strong></p>    <p>剛剛說到 Ruby and Ruby on Rails 上面很多套件都支援 Textile，他們都是靠 <a href="http://whytheluckystiff.net/ruby/redcloth/">RedCloth<br /></a> 這個 Gem 來支援的。他是一個相當容易使用的 Ruby Plugin，安裝方式就是</p>    <blockquote>   <p>gem i redcloth</p>  </blockquote>    <p>而使用方式就是</p>    <blockquote>   <p>require ‘redcloth’<br />html = ”<strong>strong text</strong> and <em>emphasized text</em>”<br />r = <span class="newWikiWord">RedCloth</span>.new(html)<br />r.to_html</p>  </blockquote>    <p>如何，很容易看的懂吧。</p>    <p><strong>vim</strong></p>    <p>剛剛看到網路上面強者這篇 <a href="http://blog.aaronbieber.com/2007/05/30/editing-textile-in-vim/">Editing Textile in <span class="caps">VIM</span></a> ，裡面介紹如何使用 Vim 來編輯 Textile，並且提供 <a href="http://blog.aaronbieber.com/blog/articles/TextileInVIM/textile.vim">Textile Syntax File</a> [1]。要使用他首先得先把這個 text.vim 放到<span style="font-size:100%;"> <strong><sub>/.vim/syntax/</sub></strong><sub> 底下，再來&gt;將 <strong></strong></sub><strong>/.vim/filetype.vim</strong> 加入一行</span></p>    <blockquote>   <p>au BufNewFile,BufRead *.textile setf textile</p>  </blockquote>    <p>假設使用 vim 編輯副檔名為 textile 的檔案，例如 xxx.textile，你就會發現他已經 S#ntax Highlight 過了。</p><p id="fn1"><sup>註1</sup> <a href="http://arbor.ee.ntu.edu.tw/%7Ewisely/download/textile.vim">我的 Mirror</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/91362#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Jun 2007 16:32:02 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/91362</link>
        <guid>http://thegiive.javaeye.com/blog/91362</guid>
      </item>
      <item>
        <title>用 JRuby 來連接 Oracle</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/91363" style="color:red;">http://thegiive.javaeye.com/blog/91363</a>&nbsp;
          发表时间: 2007年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JRuby 為 Ruby on Rails 帶來的效果已經出現了。<br /><br />根據 <a href="http://rawblock.blogspot.com/2007/06/ruby-oracle-mac-os-x-pain-jruby-and.html" style="">這篇文章 ，裡面提到了Oracle在 </a><span class="caps">MAC OS X 上面支援度相當的差勁。沒有 standard client 也沒有 standard Oracle C libraries，導致 </span><span class="caps">MAC OS X 上面，用 Ruby 連結到 Oracle 是一個</span><strong>Painful Job。</strong>以前遇到這檔事情，大家只能摸摸鼻子，說聲「再加強」。但是現在有了萬能超人 JRuby ，我們交給 <span class="caps">JDBC 來解決這檔事情。</span><br /><br />首先，按照 我說的方式<a hrf="http://lightyror.thegiive.net/2007/06/jruby.html">安裝 JRuby </a>還有 <a href="http://lightyror.thegiive.net/2007/06/jruby-on-rails.html" style="">ActiveRecord JDBC</a>。我文章裡面裡面提到的是如何安裝 MySQL ，要改連接到 Oracle 也是同樣的方式。去 <a href="http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html" style="text-decoration: none;">Oracle’s <span class="caps" style="text-decoration: underline;">JDBC download page </span></a><br />下載 ojdbc14.jar ，放到 $JRuby_HOME/lib/ 下面或是 export<span class="caps">CLASSPATH=ojdbc14.jar。</span><br /><br />然後在 Config 這樣設定即可<br /><pre style="text-align: left;">production:</pre><pre style="text-align: left;"><span class="symbol" style="">adapter: </span><span class="punct" style=""><span style="font-weight: bold;">'</span></span><span class="string" style="background-image: initial; background-repeat: initial; background-attachment: initial; background-position-x: initial; background-position-y: initial; background-color: rgb(255, 255, 238); ">jdbc</span><span class="punct" style=""><span style="font-weight: bold;">'</span></span></pre><pre style="text-align: left;text-align: left; "><span class="punct" style=""><span class="symbol" style="">driver: </span><span class="punct" style=""><span style="font-weight: bold;">'</span></span><span class="string" style="background-image: initial; background-repeat: initial; background-attachment: initial; background-position-x: initial; background-position-y: initial; background-color: rgb(255, 255, 238); ">oracle.jdbc.driver.OracleDriver</span><span class="punct" style=""><span style="font-weight: bold;">'<span class="punct" style=""><span class="symbol" style=""><span style="font-weight: normal;"></span></span></span></span></span></span></pre><pre style="text-align: left;text-align: left; "><span class="punct" style=""><span class="punct" style=""><span style="font-weight: bold;"><span class="punct" style=""><span class="symbol" style=""><span style="font-weight: normal;">url: </span></span><span class="punct" style="">'</span><span class="string" style="background-image: initial; background-repeat: initial; background-attachment: initial; background-position-x: initial; background-position-y: initial; background-color: rgb(255, 255, 238); "><span style="font-weight: normal;">jdbc:oracle:thin:@server:1521:database</span></span><span class="punct" style="">'</span></span></span></span></span></pre><pre style="text-align: left;text-align: left; "><span class="punct" style=""><span class="symbol" style="">username: </span><span class="punct" style=""><span style="font-weight: bold;">'</span></span><span class="string" style="background-image: initial; background-repeat: initial; background-attachment: initial; background-position-x: initial; background-position-y: initial; background-color: rgb(255, 255, 238); ">username</span><span class="punct" style=""><span style="font-weight: bold;">'</span></span></span></pre><pre style="text-align: left;text-align: left; "><span class="punct" style=""><span class="symbol" style="">password: </span><span class="punct" style=""><span style="font-weight: bold;">'</span></span><span class="string" style="background-image: initial; background-repeat: initial; background-attachment: initial; background-position-x: initial; background-position-y: initial; background-color: rgb(255, 255, 238); ">password</span><span class="punct" style=""><span style="font-weight: bold;">'</span></span></span></pre><br />哈哈哈，Oracle 可以忽略 <span class="caps">MAC 上面的用戶，可以忽略 Ruby 的用戶，但是他不能忽略 </span><span class="caps">JAVA 上面的用戶呀，有了 JRuby 真是太美好了。</span>
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/91363#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Jun 2007 09:22:57 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/91363</link>
        <guid>http://thegiive.javaeye.com/blog/91363</guid>
      </item>
      <item>
        <title>JRuby 的未來</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/90890" style="color:red;">http://thegiive.javaeye.com/blog/90890</a>&nbsp;
          发表时间: 2007年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JRuby 主要貢獻者之一 Ola Bini 在 JRuby 發表 1.0 之後，發表了<a href="http://ola-bini.blogspot.com/2007/06/jruby-10.html">一篇文章</a>，裡面提到當初發展到 1.0 的目標就是 <span style="font-weight: bold;">Ruby compatibility</span>，而且似乎也已經達成了。而 JRuby 未來的路要怎麼走呢？<br /><br /><br />JRuby 的主要開發者 Charles Nutter 也早就<a href="http://headius.blogspot.com/2007/06/jruby-100rc3-released-and-this-is-it.html">明示</a><br /><ol><li>繼續加強速度</li><li>Java Integration加強，1.1 可能會重寫整個 Lib<br /></li><li>支援 Ruby 2.0 還有 Rubinius 產生的 Bytecode</li></ol>無獨有偶，Ola Bini 在接受<a href="http://www.infoq.com/news/2007/04/great-expectations-jruby"> InfoQ 訪問時</a>也提到未來 JRuby 走向<br /><ol><li>效能加強</li><li>正確性加強</li><li>Java Integration加強</li><li>Java ByteCode Compiler</li></ol>也就是說，效能，正確性，跟 Java 整合度，以及 ByteCode Compiler 是未來 JRuby 努力的目標。<br /><br />另外一個好消息是，繼 <a href="http://lightyror.thegiive.net/2006/09/sun-jruby.html">JRuby 兩個作者接受了 SUN 的 offer</a> ，全職工作 JRuby 之後的九個月，Ola Bini 也接受了 <a href="http://ola-bini.blogspot.com/2007/03/thoughtworks.html">ThoughtWorks </a>的全職工作，性質也是付錢給他開發 JRuby core。JRuby 已經完全顛覆了以往 Open Source 開發者做公益的宿命，三個主要開發者都有人付錢請他們開發。JRuby 的開發速度怎麼看都覺得會繼續狂飆。<br /><br />JRuby 這東西前途不可限量。
          <br/>
          <span style="color:red;">
            <a href="http://thegiive.javaeye.com/blog/90890#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Jun 2007 13:50:17 +0800</pubDate>
        <link>http://thegiive.javaeye.com/blog/90890</link>
        <guid>http://thegiive.javaeye.com/blog/90890</guid>
      </item>
      <item>
        <title>Leopard 立志成為最好的 Ruby on Rails 開發平台</title>
        <author>thegiive</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://thegiive.javaeye.com">thegiive</a>&nbsp;
          链接：<a href="http://thegiive.javaeye.com/blog/89938" sty