讀”魔鬼都在細節裡”一文小感

今天讀完 Neo’s blog魔鬼都在細節裡 之後,覺得很慚愧…

我不知道我的同學是不是很用心在籌備自己的婚禮,但是感覺上沒有一個細節處理的好,而且最重要的是,婚禮的整個過程我的同學都沒有過來跟我打過一聲招呼,就算結婚當天太忙,事隔一天連通電話也沒有,感覺實在相當糟糕。

是的,就是這句話.
讓我想到三年前我對自己婚宴的心態,是的,我真的只想快快結束.
很多事情都沒考慮到,該聯絡的朋友啊~什麼的,都沒有好好去處理.
以我現在來看,這個婚宴辦的不好!
有看到我這篇文章,而且有收到我帖子的朋友,在此說聲對不起.
不過….不會有下次了~~

聊 Editor

昨天好友問到我用啥編輯器在寫 .Net 程式,有沒有用 UltraEdit??
我答道:”沒有,現在都用免費的編輯器在寫.”
so, 這就是這篇文章的由來…
PSPad Unicode
話才說完,還真巧,沒多久我就在 Nelson’s Blog 上看到這篇文章.
裝起來大致看了一下,還不錯,該有的功能都有了.
notepad++
這個是無意之中找到的,速度很快,也很好用.
用他的頻率,不知道為甚麼就是比下面的 Programmer’s Notepad 少.
Programmer’s Notepad
這是我目前最常用的編輯器之一,功能也很多.
常常用的原因很簡單,因為在檔案上面按下滑鼠右鍵,就會出現 Edit with PN2 ….
=_=”
Crimson
這個則是在某 blog 上看到的,不過沒記下網址.
也很好用,某同事大力推薦.
VIM
這個就不用說了,在 linux 環境下我都是用這個.
他也有 Windows 版本,也可以很方面的在檔案上面按下滑鼠右鍵,選”使用Vim編輯此檔案”…
可以說是上上之選,一直都沒有花很多時間去認真學他,都是停留在堪用的程度.
依照我逛網路的經驗告訴我,網路上很多 Linux 玩家都很厲害.
Linux 還有一個很有名的 Emacs, 但我沒用過,也懶得學,這套聽說也是神的不得了.
jEdit
是在 SourceForge 找到的,還是在 JavaLobby 電子報上逛到的??
已經不可考,不過這也是一套不錯用的編輯器,可以裝很多官方提供的亂七八糟 plugin. (我還蠻喜歡亂裝 plugin 來玩的)
Eclipse
這套最有名啦~目前紅的要命~~
也有提供很多 plugin, EclipsePlugins : hi! Find your plugin for Eclipse here.
還記得第一次裝的時候,如墜五里霧中.
後來找到不少 tutorial, 才知道怎麼裝.
其實用法不如想像中困難,就只是解開壓縮檔而已.
plugin 的話,eclipse 有內建 plugin manager,很方便.
eclipse 的 plugin 一狗票,但要注意的是,蠻多都是要收錢錢的.
AEdiX Suite
這一套是我同事介紹的.
他是這麼說的:”這套也是不用錢的..還不少人用.還支援 foxpro ..!”
不過,我沒辦法下載,所以也無從驗證起.
最後,”需要評比嗎??”
我這樣問我自己.我想應該是不用吧,每套編輯器都有自己的長處.
Developer 自己用熟就好啦~~

關於 ASP.NET 的 Cache(後續追蹤報導)

昨天在 Trace ASP.NET Caching 之後,還是念念不忘…
這麼好用的 OutputCacheModule 為甚麼會需要特別設定才會掛載??
於是今天再次 Trace, 這次從 Page 的產生開始.
於是我下手查了 Mono 的 PageCompiler 與 PageParser
他們之間的 Class diagram 大致是這樣
PageParser-20051216
在收到 Page Request 的時候,如果以前沒編譯過,Page Compiler 會先 Parse 這個 Page, 接著組出 code, 動態編譯成組件 (Assembly),然後再載入這個組件.
這樣一查下來,發現 PageParser 遇到 @ OutputCache 這個 Directive 的時候,也沒有動態去載入 OutputCacheModule 這個 Module.
這更怪了,再搜索 HttpModuleCollection.AddModule (.Net 是 HttpModuleCollection.LoadModule ),發現這真的只有在 HttpApplication 一開始的時候才有用到.
難道我昨天的結論真的沒有錯??
在萬念俱灰之下,利用 Google 搜索 OutputCacheModule
找到這篇文章:Extending the ASP.NET Runtime with Custom HTTP Modules
才發現,除了應用程式自訂的 web.config 之外,其實還有預設的 .config !!
以 .Net 1.1 來說,他是在 %WINDIR%\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config
Mono 來說,他是在 /etc/mono/1.0/machine.config
打開來看之後,赫然發現在這裡, OutputCacheModule 已經被載入了!
所以並不需要特別在你自己的 web.config 去加載 OutputCacheModule!!
p.s. 這篇是意外的收穫,對於整個流程解析的不錯,僅供參考:ASP.NET 中 Session 實現原理淺析 (1) 會話的建立流程

關於 ASP.NET 的 Cache

一般人大概會想,這有甚麼好說的,不就是在頁面加上 @ OutputCache 指示詞(Directive), 這樣就表示會快取頁面.
列在 .Net framework SDK documentation 裡的詳細語法:

<%@ OutputCache Duration=”#ofseconds” Location=”Any | Client | Downstream | Server | None” Shared=”True | False” VaryByControl=”controlname” VaryByCustom=”browser | customstring” VaryByHeader=”headers” VaryByParam=”parametername” %>

或許吧,這沒啥大不了的,但我好奇的是,背地裡,.Net 是怎麼幫我完成這件事情的呢??
從 .Net Framework SDK documentation 裡面,幾乎無法找到相關資訊,解釋得很籠統.
於是我只能作這些猜想:
1. .Net 利用 HTTP/1.1 的 Caching 來實現.
2. 內部再使用 Cache hashtable 來避免對後端過於頻繁的存取.例如,取得資料以後,先放到 Cache,如果 Cache 裡面找的到(表示沒過期),就直接拿來顯示,否則的話就再去取資料.
我對第二點沒什麼意見,實際上應該是要這麼作.
但是第一點,我就有問題了. HTTP/1.1 的 Caching 機制對 server 端來說,server 只是送出特定的 HTTP header, 如 Cache-Control, Expires 等等. (參見 HTTP/1.1: Caching in HTTP ).
對 client 來說,他收到這些 header, 怎麼實做,反而是看他自己.如果是坊間抓網頁程式,他可以忽略這些 header, 卯起來抓,那麼這樣就沒有 cache 的效果啦~
另外一點,我感到懷疑的,在他語法裡,可以指定 Any/Client/Downstream/Server, 所謂的 Server, 又是指甚麼意義呢?
就我自己的認知,應該是 Server 在處理的時候,會把整個頁面放到 Cache 裡面.
當遇到有人索取這頁面的時候,就會檢查 Cache, 如果有就直接取出.
所以我查找 Mono 與 .Net 解釋 HttpApplication 的部份,他們都特別指出了 HttpApplication 收到 web request 以後處理的順序:

1. BeginRequest
2. AuthenticateRequest
3. AuthorizeRequest
4. ResolveRequestCache
5. AcquireRequestState
6.PreRequestHandlerExecute
7.PostRequestHandlerExecute
8.ReleaseRequestState
9.UpdateRequestCache
10.EndRequest

特別注意步驟 4 與步驟 9, 他們都提到了 Cache.
p.s. 我覺得 Mono Framework class reference 寫的比較清楚, 參閱 HttpApplication
接著,我又利用 Google 查找相關資訊.
發現有用mono應用程式的 web.config 多半都會加掛 OutputCacheModule 這個 Module.

<httpModules>
<add name=”OutputCache” type=”System.Web.Caching.OutputCacheModule”/>
</httpModules>

參考 mono 的源碼以後,發現這就是我要找的.
這個 Module 的確做了我推想的事情.
他在 OnResolveRequestCache 事件先依據 FilePath 去檢查 Cache, 如果存在,就直接以 Cache 內保存的內容輸出.
接著在 OnUpdateRequestCache 事件,檢查頁面是否需要被 Cache, 需要的話,就把輸出結果保存到 Cache 中.
Bingo!!
但這是mono的作法, .Net 是否也有同樣的類別呢??
我利用Reflector 這個工具去看 System.Web.dll, 的確, 有 OutputCacheModule 這個 Module.
至此,我們已經解決了我想要解決的問題,並做出一個小結論:
如果想對頁面作 Cache 的話,需要作兩件事情:
1. 在頁面的開始加上 @ OutputCache 指示詞.
2. 在 web.config 裡面加掛 OutputCacheModule
可是我接下來想知道的是,如果我用 .Net 去寫作的時候,也需要特別加掛這個 Module 嗎??
再次求助於 mono 的源碼, 從 HttpApplication.cs 開始查找.
我直接搜索 HttpModule, 因為我想知道 HttpApplication 是在何時載入 Module.
HttpApplication 正巧有一個 HttpModuleCollection, 這看來就是 HttpModule 的 Collection.
宣告的名稱為 modcoll, 接著以 modcoll 進行搜索.很快就找到 InitOnce, 這裡以 ModulesConfiguration 對 modcoll 進行了初始化.
接著再查看 ModulesConfiguration 與 HttpModulesConfigurationHandler 的源碼, 至此已經真相大白.
原來如果沒有在 web.config 指定要掛載的 module 的話,只會掛載內定的 DefaultAuthenticationModule.
那麼微軟的 .Net 呢??
Reflector 查找同樣的 Class, 並進行 disassembly.
果然也做了一樣的事情,沒指定要掛載的 module 的話,只會掛載內定的 DefaultAuthenticationModule.
補充結論:
除了小結論所提到的事項之外,一定要在 web.config 裡面指定要掛載 OutputCacheModule, 才會更能發揮 Cache 的功效.
參考資料:
*HTTP/1.1: Caching in HTTP
*Caching in ASP.NET
*Page Output Caching, Part 1
*ASP.NET Caching
*mono的源碼
*.Net framework SDK documentation

freenx on Fedora Core 4

以前裝過,可是忘記了
現在又想用,結果搞了半天,好不容易設定成功了,把方法記起來.
$su root
#yum install freenx
由於這一版的 freenx 使用的目錄有點改變
所以到 /var/lib/nxserver/ 下,多增加一個軟連結
#cd /var/lib/nxserver
#ln -s nxhome home
接著改一下設定
#cd /etc/nxserver
#cp node.conf.sample node.conf
打開 node.conf
把 SERVER_NAME 與 SSHD_PORT 這兩行前面的註解拿掉.
重新啟動 nxserver
#nxserver –restart
確定 user 是否已經自動幫你加入了,看有沒有自己的 linux 帳號
#nxserver –listuser
如果沒有的話,那麼就得新增 user
#nxserver –adduser your_name
#nxserver –passwd your_name
安裝 Windows 版的 nxclient, 這可以到NoMachine網站下載.
下載完成以後就進行安裝,基本上都是 step by step, 沒啥困難的.
主要的幾個設定就是 ip, port, 還有 key
接著回到 server, 處理 key 的部份
這邊我不清楚是否要重新產生,不過我還是做了.
#nxkeygen
產生完畢後,切換到 /var/lib/nxserver/home/.ssh,將 client.id_dsa.key 檔案的內容複製出來,這邊就不仔細描述複製的方法了,總之你自己看著辦.
#cd /var/lib/nxserver/home/.ssh
#cat client.id_dsa.key
把這內容貼到 nxclient for Windows 的 key 裡面 (在 configuration 的時候會有個按鈕叫做 “key”,點下後可以貼東西 )
保存設定以後,輸入你的帳號與密碼,再進行連結,這樣就大功告成了.
參考資料:
*HOWTO FreeNX Server – Gentoo Linux Wiki
*NX/FreeNX HOWTO
*Linux-Tip.net – Remote access with FreeNX in 5 steps
*FedoraNEWS.ORG – HOWTO setup Freenx on Fedora

Whisky + 綠茶

今天在中時部落格看到這篇美酒加咖啡?不,威士忌加綠茶.
原來還有這麼一種混法, Whisky + 綠茶.
下次有空來試試看,依照我的經驗,挑選茶裡王的綠茶應該會比較順口.
因為他們的綠茶還蠻甜的…
突然想到,大部分混酒法都是以甜度較高或酸度較高的飲料與烈酒作搭配.
像是: Vodka + 七喜 (甜度高的蘇打汽水), 紅酒(酸澀) + 蘋果西打(甜度高的汽水) 之類的
莫非這就是調酒公式?!

weblogs.com 剖析

Overview
weblogs.com是一個彙整的服務,在這個網站上,你會看到目前最新的 blog 文章.
原理
weblogs.com是採取一種被動的方式來得知目前有哪些 blog 文章,換言之,也就是 blog hosting system 在發出文章的時候,就會通知(ping)weblogs.com,讓weblogs.com知道說有新文章啦…
運作
weblogs.com 主要利用兩個方式來接收 ping
*XMLRPC
*REST, 也就是以 http get, post 的方式
參數大同小異:
*name: name of site (limited to 1024 character)
*url: url of site or rss feed (limited to 255 character)
回傳值:
*flerror (bool): true 表示有錯誤發生
*message: successful: Thanks for the ping.”, failure: error message.
背地裡,weblogs 收到這些訊息之後到底做了什麼事情呢??
推測:
1. 組合 ping 過來的資訊
2. 排程,定時去 fetch
3. 把已經取得的資訊組合放到 xml, 裡面提供有 name, url, rssurl, when
name: name of the weblog
url: url
rssUrl: 該網站的 rss/atom feed url
when: a number of second, 拿 weblogUpdated.updated 減去此數字,就是 weblogs.com 收到 ping 的時間.

惡搞-烏來聯外道路

今天逛到惡搞之事,居然有要搞這麼一條路,從三峽到烏來。這中間可是跨過不少山區耶….

前幾日回祖父家(獅頭山附近)的時候,才聽到長輩們在聊,說最近山區這附近(含宜蘭)落下的都是”鹼雨”,使得作物都長不起來,聽說是安坑焚化爐引起的(不過這沒依據…參考用)。這附近已經很糟了,現在還要搞這條聯外道路,肯定對環境影響很大。

這裡是發動一人一信的網址:http://home.kimo.com.tw/syhalpinia/letter.htm,多少出點力吧,決定的日子就在明天了…