十一月 072007
 

使用 Subversion 偶而就會遇到有人不小心把一堆不該存在的檔案 commit 進來了,這在去年寫的一篇「svndumpflter with wildcards support ?」有提到從歷史記憶中去除個別檔案的方式

但如果你能即時發現最新的一個(或幾個) commit(s) 的任何更動都是不該發生的(通常就是有人做了蠢事),那麼在有其他正常人繼續 commit 之前,其實是有蠻好的挽救機會的 💡

假設你的 repository 名稱是 foobar,最新的 revision number 是 r105,但是你即時發現 r101 ~ r105 都是某人亂搞的結果,那麼在 r106 commit 之前,應該還有機會把時光倒轉到 r100 那時清純未受污染的狀態..

廢話不多說,下面是作法

# cd /home/svn
# svnadmin create foobar.new
# svnadmin dump -r0:100 foobar | svnadmin load --force-uuid foobar.new
# mv foobar foobar.old
# mv foobar.new foobar

做完以上動作後再把該設的權限弄好,hooks 下的東西 copy 回去就可以了

如果有其他人在這段動作完成前 checkout 了 r101~r105 之間的版本,就跟他們說他們看到鬼了,請他們砍掉 source tree 重新 checkout 一份吧 🙄

上面這段作法最重要的地方是 –force-uuid 這個選項,沒有加這個選項會使得回復的 repository 的 UUID 跟原本的不同,進而導致之前已經 checkout 的 working copy 都會認不得新的 repository!

如果還來不及作上述動作,就有其他正常人 commit 東西進來了,其實也不會很麻煩,反正做完回復動作後,統統當作沒發生過,再叫作蠢事的人請一頓飯,拜託其他人把新的修改再改一次就好了

 Posted by at 23:09
十月 112007
 

由於網路架構的問題,我們有時會設計讓不同網段必須透過 Proxy 才能存取 Subversion Repository,但是為此架設一個獨立的 Proxy Server (如 squid)實在太麻煩,利用 Apache 內建的 mod_proxy / mod_proxy_http 功能有時候會讓工作簡化很多

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Deny from all
</Proxy>
ProxyVia On

為了安全性考量,如同上面的設定,我們先把所有 Proxy 的存取關掉,然後依據需要開放特定目錄來允許 Proxy

例如我們想把對 /svn 的存取導向到 http://svn.domain/svn,那麼設定內容就會變成:

<VirtualHost *:80>
    ProxyPass /svn http://svn.domain/svn
    ProxyPassReverse /svn http://svn.domain/svn
    <Location /svn>
        <Limit OPTIONS PROPFIND GET REPORT MKACTIVITY PROPPATCH PUT CHECKOUT
 MKCOL MOVE COPY DELETE LOCK UNLOCK MERGE>
          Order Deny,Allow
          Allow from all
          Satisfy Any
        </Limit>
    </Location>
</VirtualHost>

裡面最重要的就是 <Limit OPTIONS PROPFIND… > 這一行(這一整行不能分成兩行,Copy-Paste時請注意),因為 Subversion 會用到除了 HTTP GET / POST 以外的一些特殊 Method,因此必須設定讓 HTTP 的 Proxy Module 允許這些 Methods 通過,才能讓 Subversion 正常運作

另外建議修改 Allow from all 這一行,改成僅允許特定 IP 來連結,也可強化系統的安全性

參考資料: Subversion behind an Apache Reverse Proxy (不過裡面的設定方式跟我上面提供的有一點點小小差異)

如果你還是想用 squid 來解決問題,那您可以參考 Subversion 網站上面的 FAQ

 Posted by at 13:32
九月 132007
 

一早起來發現 MSN Messenger 7.5 無法登入了…

不升級就無法登入了!

我還是比較喜歡用 7.5 的介面,尤其 Messenger Plus!自訂暱稱的功能只支援 7.5,而我又不想用 8.0 以後內建但殘廢的自訂暱稱功能… 而且我的聯絡人已經上百個了,懶得一個一個還要作轉換,所以能撐多久就撐多久…

要讓 7.5 免除升級困擾,請先把 MSN Messenger 關閉,然後開啟我的電腦,打開 C:\Program Files\MSN Messenger\ 資料夾,在 msnmsgr.exe上面按滑鼠右鍵選內容:

選擇「相容性」,然後把「以相容性模式執行這個程式」打勾,再從選單中選擇「Windows 2000」後按「確定」即可

然後執行 MSN Messenger 後,就可以正常登入了

這方法不曉得可以用多久就是了…

目前唯一的缺點是,系統列上面的圖示變得有點難看,只能裝作看不見了…

 Posted by at 08:32
十月 062006
 

Subversionsvnadmin obliterate 功能一直沒有實作出來,這實在是有點麻煩,尤其是當負責管理一個 repository 時,常常就會有人把 *.exe, *.obj, *.lib, *.a 統統給 commit 進去了….

然後你就會發現整個 repository 長大的速度越來越快,就算事後用 svn delete 把它砍掉還是無濟於事,因為那已經成為無法抹滅的歷史了

雖然可以事先設定 svn:ignore 來解決,不過偶而還是會有漏網之魚,官方提供的解決方法是使用 svndumpfiler 來把不要的檔案徹底從歷史記憶中濾除

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude XX.exe | svnadmin load REPOS2

這方法當然沒有 svnadmin obliterate 好,不過也是目前狀況下不得不的作法

但是這個方法最大的問題在於 svndumpfilter 無法接受 wildcards (萬用字元),也就是你無法指定 svndumpfilter exclude ‘*.exe’

所以,萬一不小心遇上了機車的狀況,你可能要一個一個把檔名找出來濾掉 XD

所以不久前就想辦法修改了 svndumpfilter 的程式,把它加上直接濾除特定副檔名檔案的功能…

[patch to subversion/svndumpfilter/main.c]
(the filename with leading dot will be matched against filename extension)

--- subversion/svndumpfilter/main.c.orig
+++ subversion/svndumpfilter/main.c
@@ -111,7 +111,12 @@
       pfx_len = strlen(pfx);
       if (path_len < pfx_len)
         continue;
-      if (strncmp(path, pfx, pfx_len) == 0)
+      if( pfx[0] == '.' )
+      {
+        if( strncmp( path+path_len-pfx_len, pfx, pfx_len ) == 0 )
+          return TRUE;
+      }
+      else if (strncmp (path, pfx, pfx_len) == 0)
         return TRUE;
     }
 
@@ -1257,7 +1262,8 @@
             style, and absolute. */
        SVN_INT_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool));
        prefix = svn_path_internal_style(prefix, pool);
-       prefix = svn_path_join("/", prefix, pool);
+       if( prefix[0] != '.' )
+          prefix = svn_path_join("/", prefix, pool);
        APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix;
      }
  }

這個 patch 有點投機取巧,因為我懶得真的去實作 wildcards,我需要的功能只要能濾除指定的副檔名就可以了…

所以這個 patch 把原來 svndumpfilter include/exclude 後面接的檔名參數作特殊判斷,只要第一字元是小數點,就當作要去 match 的副檔名,因此,要濾除 *.exe 只要這樣作就可以了:

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude .exe | svnadmin load REPOS2

剛好看到前幾天也有人寫了個 PATCH 讓 svndumpfilter 完全支援 wildcards… 不過我沒試過,相信不久的將來應該會被整合進正式版本中

當然最希望還是 svmadmin obliterate 能早日被支援,就不用這麼辛苦了

 Posted by at 12:59
六月 052005
 

在 FreeBSD 下面用 ports 安裝 MySQL 4.1

如果你只要用 UTF-8 的話就算了,但是如果還是有使用 BIG5 的話..
安裝 make 的時候,記得要加上 WITH_CHARSET=big5

以下當作筆記,紀錄 MySQL database server / FreeBSD 的安裝流程:

安裝資料庫:

cd  /usr/ports/databases/mysql41-server/
make  WITH_CHARSET=big5  install

接下來加入這一行在 /etc/rc.conf 裡面:

mysql_enable=”YES”

如果想指定不同的資料庫存放位置的話,可以在 /etc/rc.conf 內加上:

mysql_dbdir=”/home/mysql”

記得這個目錄要先建立,owner 及 group 都要是 mysql,然後就可以啟動 MySQL 了:

/usr/local/etc/rc.d/mysql-server.sh start

再來要設定 root 密碼(假設密碼是 dada):

/usr/local/bin/mysqladmin -u root password ‘dada’

然後我們先進入 MySQL 的交談式介面,在命令列下執行:

/usr/local/bin/mysql -u root -p


問密碼的時候就輸入您在前一步驟設定的密碼

接下來首要任務當然是讓 phpMyAdmin 能連線囉,假設我們要為 phpMyAdmin 建立的一個連線帳號名稱為 giga 密碼為 virtual,在大於符號後面輸入:

GRANT ALL PRIVILEGES ON *.* TO ‘giga‘@’localhost

IDENTIFIED BY ‘virtual‘ WITH GRANT OPTION;


這邊是假設你的 Web Server 跟 MySQL 在同一台機器上,如果不是的話,請把 localhost 改成 Web Server 的 hostname 或 IP

完成後輸入 exit 可離開交談介面

然後到你的 Web Server 上面,安裝 phpMyAdmin

cd /usr/ports/databases/phpmyadmin
make install

設定 phpMyAdmin:

vi /usr/local/www/phpMyAdmin/config.inc.php

設定以下數值:

$cfg[‘Servers’][$i][‘auth_type’] = ‘http

如果你的 Web Server 跟 MySQL 不在同一台機器上,請把下面這一行的 localhost 改掉:

$cfg[‘Servers’][$i][‘host’] = ‘localhost

接下來改 httpd.conf (以 apache2 為例):

vi /usr/local/etc/apache2/httpd.conf

加入以下幾行

Alias      /mysql/       "/usr/local/www/phpMyAdmin"
<Directory    "/usr/local/www/phpMyAdmin">
Options  MultiViews FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
Allow from 192.168.0.1
Allow from 192.168.0.2
</Directory>

以上是設定只允許兩個 IP 連線,請依據你的需求更改,最後重新啟動 Web Server:

/usr/local/etc/rc.d/apache2.sh   stop
/usr/ocal/etc/rc.d/apache2.sh   start

然後就可以用瀏覽器連到:

http://your.web.server/mysql/

輸入之前建立給 phpMyAdmin 用的帳號密碼就應該可以進去了..

成功進去後就可以開始做你想做的事了!

上面步驟以上所建立給 phpMyAdmin 用的帳號,會擁有全部的權限,建議可以做一些調整,拿掉不需要的部分,這樣的調整可以在 phpMyAdmin 的權限頁面中直接完成

另外,如果你有兩台 MySQL Server,想要設定 MySQL 的 Replication 功能,
請參考之前寫的另外一篇文章「Replication of MySQL database

另外,如果要用 PHP 連接 MySQL 4.1,使用 BIG5 編碼的資料庫,記得在連線後執行:

$charset = mysql_query( "SET  NAMES  'big5'", $dblink);

或者直接在 my.cnf 中加入底下這行(如果你確定所有的 DB 都是使用 BIG5 編碼的話):

init_connect='SET  NAMES  big5'
 Posted by at 23:19
四月 042005
 

Microsoft Chinese Date & Time Utility

發現微軟提供了一個顯示日期(農曆/國曆/世界時間)的小工具… 蠻好用的,可以顯示農曆及自選四個世界各地時間,還會考慮日光節約時間

下載網址: http://www.microsoft.com/globaldev/outreach/dnloads/ICalClkSetup.mspx

2009/04/10 補充:

微軟好像拿掉這個程式了,請搜尋 “Microsoft Chinese Date Time” 去找網路上的下載點

 Posted by at 22:10