Regular expression 是貪婪的

前兩天才赫然發現,自己完全忽略了這個特性,導致結果完全不是我所預期…
這個特性就是貪婪(請參考:一輩子受用的 Regular Expressions — 兼談另類的電腦學習態度)。
所以當你想要利用這個式子:\<title\>(?<titleStr>.*)\</title\> 去這堆文字: <title>AAA</title>…other tags…<title>BB</title> 取得每對 <title>…</title> 裡面的文字時,實際上只得到一個結果,內容是 AAA</title>…other tags…<title>BB
>_< 這下該怎麼辦?
我想到幾種方式:

  • 取得每個 <title> 的位置,然後再利用 String.IndexOf 去搜尋 </title>,取得位置之後,就可以取得<title>…</title> 裡面的文字。
  • 分別用 Regular Expression 取得<title>與</title>的位置,然後再依據結果,去取裡面的字串。

希望是能有更好的解~

Vim 7.1 / MRU / TagMenu

最近 Vim 釋出了 7.1 版,這兩天順手更新了。
在下載的同時,邊找一下有沒有好用的 Plugin:

  • mru – Plugin to manage Most Recently Used (MRU) files,顧名思義,就是在 Menu 安插一個 Most recent used (最近使用) 的選單,讓你可以從選單選到最近編輯的檔案。
  • TagsMenu – Creates a menu of all the tags in the current file.,這個其實跟 taglist 很像,只是 taglist 是分割一個視窗出來顯示 Tag,而 TagsMenu 則是在選單安插一個 Tags 項目,顯示出所有 Tags。他的 ctags 指令比較不一樣,記得要加上 -f – –fields=+K,例如:

    let TagsMenu_ctagsCommand=’c:\tools\ctags.exe -f – –fields=+K ‘

CVSNT 混合使用 protocol

我們 team 的 CVSNT 一直是用 SSPI 方式,直接與公司內部的 Active Directory 接軌作認證。
如果你想要一些不是在網域的人也能存取 CVS Repostiroy 的話,該怎麼辦呢?
其實 CVSNT 安裝的時候,預設就已經是同時開啟 SSPI 與傳統的使用者認證了~
所以,你需要更動 Server Repository 的 CVSROOT 目錄下的 users、passwd 檔案。
users 的檔案格式是 username:e-mail
passwd 的檔案格式是 username:password:alias
這邊的 password 應該要填入加密過的,不過你可以先不填,稍後再利用 CVS passwd 指令來更改。
舉例來說,你在 users 檔案加入了一行 paul:paul@xxx.com,在 passwd 檔案加入了一行 paul::paul
接著在 client 端使用 cvs -d :pserver:paul@your_server:/your_module login 登入,在詢問密碼時,按下 Enter。
再使用 cvs -d :pserver:paul@your_server:/your_module passwd 更動密碼即可。
如果你要把混合認證的功能關掉的話,得去修改 CVSNT 安裝目錄下的 protocol_map.ini,加入一行 pserver=none,重新啟動 CVSNT 服務以後就可以關閉了。
參考資料:

BSP 使用技術概觀

這篇純粹是一篇 Overview…
BSP 大致可以分為三個部份來討論:BSP主頁面、blogger的個人頁面、blogger文章管理平台。

  • BSP 主頁面,主要就是聚合所有blogger的文章,依照發表先後順序來顯示。這部份就是直接從資料庫去Query資料出來顯示,基本上不困難。額外要補充的部份,在外面你可能還會看到本身不提供 BSP 服務,但提供聯播服務的站台,那他們又是怎麼做的呢?大致上有兩種,一種是由站台本身定期去 pull RSS/ATOM feed 回來作整合(所以想要參加聯播的人,得提出申請;或者有些blog線上閱覽器(Aggregator)會順便提供聯播Widget,如:NewsGatorGoogle Reader,因為這只是舉手之勞。);另外一種,則是站台提供有 Weblog ping service的位址,使用者需要在 BSP 的設定去填入此位址,那麼在發表文章的同時,BSP就會去通知該站台說有新文章發表了,該站台再根據這資訊來作顯示或是其他動作(所以新增文章的時候,你會用到這個,當然也可以不提供,這主要是增加 blogger 在其他網站曝光的機會)。
  • blogger個人頁面,只聚合blogger本身的文章,可以依照使用者在管理平台上指定的順序來顯示。
    1. 文章的產出,一般有常見的兩種作法:一種是從資料庫Query資料出來顯示,這方法相對來說,是比較簡單的,但是資料庫的負載會比較重;另外一種,則是在文章有更動的時候,除了更新到資料庫之外,還同時產生一份 html 檔在對應的位置上,當訪客瀏覽的時候,實際上是直接瀏覽這份 html 檔,把負載集中在 Web server 上,速度會比較快些,缺點則是要修改相關 html 檔案的連結,著名代表是:Movable Type 2.x。關於要不要產生靜態 html 檔案的討論,我記得國外或對岸有人寫專文來討論。
    2. TrackBack與留言:留言就不用說了,就留言,有些 BSP 可以讓你在管理介面上直接回覆留言,而不是作者自己要在文章上再留言一次;TrackBack則是類似 Weblog ping services,如果你在文章裡面有引用到其他人的文章,那麼你可以在發表文章的時候,指定 TrackBack 網址,那麼在發表的時候,就會通知該文章,該文章就會知道你有引用,然後在文章後面列出相關資訊。
    3. 個人化網址,目前國內 BSP 都讓你可以自訂後綴的目錄名稱,但國外的Blogger則可以讓你自訂域名,例如 http://someone.blogspot.com。實作上,多半是利用 Url rewrite 或是直接在 web server 建立相對應的目錄;Blogger的作法我並不清楚,我猜測應該是直接在 DNS 處理掉。
  • blogger文章管理平台,管理部落格基本設定,新增/修改/刪除文章,或是邀請別人一起來編輯。一般還有提供的功能:變更版面配置(有些則乾脆整份頁面讓你自己去改,如早期的 Blogger)、自訂 CSS、自訂邊欄、簡單的照片管理…等等。

此外還有:

  • RSS/ATOM,這兩種格式,說穿了,就是 XML,只要依照規範去撰寫,大致上就沒什麼問題。
  • Server 的管理、負載平衡、流量管理…

轉移到Thunderbird

Mozilla Thunderbird前一陣子已經推出 RC1,所以按照預定計畫,開始進行轉換的工作。
轉換的工作其實很簡單~
不過也就是安裝好 RC1,打開Mozilla Thunderbird,執行”工具”>”匯入”,把郵件以及設定都匯入進來~
接著再檢查看看郵件有沒有問題、帳號密碼,最後把原來配合 Outlook express 的 popfile 移除掉。
就這樣,簡單到不行。

cvs2svn 實戰

我主要是參考這篇:HOWTO: smooth CVS to SVN migration (and back again)
基本上步驟還真的是…很簡單。
目前我先在Ubuntu上試驗,想說先搞定之後,再到 Windows server 上試試看。
首先得安裝cvs2svn

#sudo apt-get install cvs2svn

又,因為 Windows 上用的是CVSNT,我再安裝了CVSNT(是的,Ubuntu有包進去):

#sudo apt-get install cvsnt

接著把 Windows 上的 CVS Repository (除專案目錄之外,CVSROOT目錄也要!這是我踩到的第一個雷,如果你是整個搬,就不會有這困擾。)複製到 Linux 機上的 /work/cvs 放著,然後切換到該目錄下之後,輸入:

#cvs2svn -v -s /svn/my_new_project my_project

  • -v 表示 verbose
  • -s 指定 svn repository 位置,這邊不需要特別先執行 svnadmin create 去建立,cvs2svn會自動建,如果你已經有一份建好的,那麼你得加上 –existing-svnrepos
  • 最後是 cvs repository 位置

cvs2svn就開始跑啦~
過沒多久,cvs2svn告訴我:

ERROR: The command ‘[‘co’, ‘-q’, ‘-x,v’, ‘-p1.1’, ‘-kk’, ‘my_project/aaa/bbb/si_template,v’]’ failed with exit status: 1
and the following output:
co: my_project/aaa/bbb/si_template,v:28: unknown character `_’
co aborted

這個問題卡了我很久,我找不到原因。後來找到這篇討論串:error encountered with co: unknown character ‘_’,最後解法是使用 –use-cvs,也就是不要用 rcs 指令去處理 CVS repository,改用 cvs 指令去處理。
用了這參數以後,原本以為這下就都搞定了,但天不從人願,cvs2svn告訴我另外一個噩耗:

ERROR: The command ‘[‘cvs’, ‘-q’, ‘-R’, ‘co’, ‘-r1.1’, ‘-p’, ‘-kk’, ‘my_project/my_project.mak’]’ failed with exit status: 1
and the following output:
cvs [checkout aborted]: Cannot check out files into the repository itself

這問題又再次卡了我很久,我甚至去 trace cvs2svn 的 code…後來發現這完全是因為我的愚蠢所造成…反覆閱讀CVS–Concurrent Versions System – Troubleshooting之後,我終於知道原因,原來我不可以在 /work/cvs 下執行cvs2svn
於是我切到 /work,然後再執行一次就行了。最後指令如下:

cvs2svn –use-cvs -v -s /svn/my_new_project /work/cvs/my_project

參考資料:

後來整個弄完以後又發現的另外一份參考資料~冏:

subversion 與 file:// protocol

在 Windows 上,想偷懶不架設 svn server 或 http server 的話,可以這麼作。
首先你得安裝TortoiseSVN
然後建立 repository,TortoiseSVN的方法是這樣子的:

  1. 先建立一個空目錄
  2. 再該目錄上按下滑鼠右鍵,選 TortoiseSVN > create repository here

建立成功之後,緊接著,再按下滑鼠右鍵,將這個目錄分享出來。
之後,到你的工作目錄,用TortoiseSVN去 check out
URL of repository 就打 file:////your_computer/your_share 即可。

Make Link 與 Digg This!

不知道裝了什麼 Addon 之後,Make Link得到的結果就錯了,每次要取頁面標題或是選取文字時,都會得到 “[object Object]”。
經過一番奮戰之後,終於發現 Make LinkDigg This! 都個別定義了 getSelectedText() 這個函數,Make Link因為呼叫到Digg This!的getSelectedText(),所以判斷的時候,就出錯,而得到 “[object Object]”。
所以只要移除掉Digg This!這個 Addon 之後就好了。
或者,你也可以自行為某 Addon 中的 getSelectedText() 作更名,再重新打包即可。

mod_rewrite

使用上很簡單,看mod_rewrite官方說明,應該就可以明白,要不也可以利用Google找到很多教學(關鍵字:mod_rewrite tutorial)。
要特別注意的一點,得記得把該目錄的 AllowOverride 設置為 All (Apache設定檔裡面)。
如果是 None 的話,mod_rewrite 不會生效。
像我的CentOS預設就是把 /var/www/html 的 AllowOverride 設置為 None,所以得去編輯 /etc/httpd/conf/httpd.conf ,找到 <Directory “/var/www/html”> … </Directory> 裡面的 AllowOverride,改為 All,再重新啟動 httpd 即可。