Monday, December 15, 2008

以拼經濟之名,行"被統一"之實

馬總統上任半年了,現在經濟還是很差,如果在兩年前說經濟不好,我可以跟你說我感覺不到。但現在你說經濟不好,我真的有感覺到。因為,我上班的地方,大幅度的裁員,發生在馬英九上任後的幾個月,這就是經濟衰退的一個徵兆。

馬政府為了扶正台灣的經濟,卯足了全力去衝刺。但是每每衝刺後,所得到的結果還是一樣,這代表什麼??這代表領導人的領導沒有方向,完全沒有著力點,使不出力量。

現在呢??想要用三通,開放中國人民來台灣觀光...等等。這些政策都是以中國為主的經濟政策。
難道這些政策有用嗎??就我個人的觀點沒有用,那為什麼要這樣做了。那就是馬英九總統為了要實現他父親的遺言,要被中國終極統一。所以對外統稱拼經濟,其實私底下就是"被中國統一"。

親愛的馬總統,做點有用的事情吧!!

Thursday, December 11, 2008

Linux BusyBox Kernel 2.6

我的Host 平台Kernel 是Linux 2.6.11,但是我的BusyBox要裝載在Linux 2.6.27的Kernel上,為了要跟新的Kernel搭配良好,我就開始去下載Linux 2.6.27穩地版本的核心。

當我在Make Busybox 時,發生底下的事情。
CC libbb/loop.o
In file included from libbb/loop.c:16:
/usr/include/linux/loop.h:88: error: syntax error before ‘__kernel_old_dev_t’
/usr/include/linux/loop.h:90: error: syntax error before ‘lo_rdevice’
/usr/include/linux/loop.h:99: error: syntax error before ‘}’ token
make[1]: *** [libbb/loop.o] Error 1
make: *** [libbb] Error 2

在網路上找了幾篇文章,看了一下程式碼。
發現到在Make Busybox時,他會去找Host主機上面的Linux Kernel 的Header file。
只要改到kernel 2.6.27的include File就可以解決這樣的問題了。

#cd /usr/include
#mv asm asm-bak //先將asm改成其他的名字
#ln -s /mnt/work/linux-2.6.27.8/include/asm-x86 asm
#ln -s /mnt/work/linux-2.6.27.8/include/asm-generic asm-generic
#mv linux linux-bak //將Linux改成其他的名字
#ln -s/mnt/work/linux-2.6.27.8/include/linux linux

然後重新make busybox就可以了!!

Monday, December 8, 2008

Linux kill

最近與同事寫Linux程式遇到幾個問題。就是兩個Process要如何互相溝通,當然,在Linux底下有很多種方式可以做到,像是Pipe,share memory...等。而我們的兩個Process只是簡單的互相通知而已,所以我們用了Signal的方式來互相通知而已。不用複雜的Pipe,也不用share memory。
。只要互相傳送訊號(Signal)就可以做到了。

所以兩個Process就定義了SIGUSR1和SIGUSR2這兩個。我們兩個只要透過這樣的傳遞訊號,這樣兩個Process就可以互相傳遞訊號了。

問題來了,此時有A和B兩個Process時,A與B已經定義SIGUSER1,而B還沒有指定SIGUSR2,A Process可以利用kill 的方式傳遞SIGUSER1給B Process;當B process 還沒有定義SIGUSER2,而A Process利用Kill方式傳遞SIGUSER2給B Process,B Process,就會被Kill掉。@_@...

Monday, December 1, 2008

經濟衰退後的時代

我想今年的整個經濟市場頹靡,一振不起!!怪於美國次貸的影響而感染到整個全世界。
那衰退的經濟會造成什麼樣的影響呢??
1. 全球暖化消失
因為大家整個消費能力縮減,沒有錢可以去買汽油,買新的汽車。大家都騎腳踏車,搭大眾
運輸系統。所以減少整個二氧化碳的排氣量,所以整個地球的暖化也慢慢消失。
2. 人口慢慢減少
也是因為經濟衰退,一個家庭能減少支出就盡量減少支出,所以整個家庭頂多3人而已,也降低
新生兒的出生率,因為多一個嬰兒就多一分的負擔。另外一個角度來看,死亡的人數也會大
增,因為員工被裁員,那這些人就因為經濟的壓力承受不了,整家燒炭自殺。還有那些綁匪,
會綁架一些有錢人的兒女,甚至撕票。這些因素,多會使人口慢慢減少。

以上是我個人的觀點!!

Sunday, November 16, 2008

Build BusyBox error message!!

我從busybox網站Download下來以後,要自己玩玩看busybox時,發生底下問題:

#make defconfig
#make
miscutils/lib.a(inotifyd.o): In function `inotifyd_main':
inotifyd.c:(.text.inotifyd_main+0x3d): undefined reference to `inotify_init'
inotifyd.c:(.text.inotifyd_main+0xfa): undefined reference to `inotify_add_watch'
collect2: ld returned 1 exit status
make: *** [busybox_unstripped] Error 1
---------------------------------------------------------------------------------

解決的辦法就是關掉inotifyd support only (CONFIG_INOTIFYD=n)
這樣就可以了!!

Thursday, October 30, 2008

如何增加Linux 底下的 file descriptors

通常在Linux底下的file descriptors(socket)限制1024個。當如果有一天你的系統慢慢人數增加,你會發現你所可開啟的file descriptor(socket)會不夠用,這樣就不可能再繼續執行下去了。

那要如何擴充呢??如果我要擴充到60000個socket該怎麼作?

1.
首先先查看你系統的限制

#cat /proc/sys/fs/file-max
1024

讀出來的就是你系統上的限制。

2.
接下來就是要修改系統的上限,如果沒有就加上底下那行。
#vi /etc/sysctl.conf
fs.file-max = 60000

3.
存檔後,再執行底下的指令,就會針對你所修改的而改變。

#sysctl -p /etc/sysctl.conf

4.修改你系統的__FD_SETSIZE 裡面的數值,找出系統這兩個檔案。並搜尋__FD_SETSIZE
/usr/include/bits/types.h
/usr/include/linux/posix_types.h

將__FD_SETSIZE 的值改成60000 修改後存檔離開。

往後你的程式會include這幾個檔案,並將你的File Descriptor擴充到60000。

5. 修改/etc/security/limits.conf,這個檔案是可以限制Linux上的使用者,那些可以使用超過1024,
在這裡,我讓大家都可以使用到60000。當然,你也可以限定某一組帳號使用。

#vi /etc/security/limits.conf

* soft nofile 60000
* hard nofile 60000

存檔離開。

大致上就是這樣


Thursday, October 16, 2008

UNICODE convert UTF-8

最近工作上需要UNICODE跟UTF-8的轉換內碼。在網路上搜尋了一個網站,真的還不錯用!!
http://rishida.net/scripts/uniview/conversion.php
只要輸入你需要的文字,不管是中文還是韓文,他都可以show出那個文字的Unicode的代碼,還有其他像UTF-8的內碼。

或者你知道Unicode的內碼,藉由這個網站你也可以知道這個代碼是代表什麼字。

Wednesday, September 24, 2008

感謝~~

感謝馬英九總統讓我們增長知識,讓我們又學到對人體有害的化學物質名稱。也感謝,我們的衛生署的辛勞,也因為你們的疏忽,也讓我們台灣島上的人民三生有幸可以喝到毒奶。

Thursday, July 24, 2008

BusyBox 的 top指令

相信大家玩過BusyBox的應該不熟悉,底下是top所產生出來的。
top是用來觀測整個記憶體和CPU的使用率!!



Mem: 47808K used, 11968K free, 0K shrd, 3072K buff, 31472K cached
Load average: 0.00 0.00 0.00
PID USER STATUS VSZ PPID %CPU %MEM COMMAND
1096 root R 2208 879 1.9 3.6 exe
905 root S 8528 1 0.0 14.2 smbd
915 root S 8528 905 0.0 14.2 smbd
875 root S 3728 1 0.0 6.2 dropbear
865 root S 2272 1 0.0 3.7 busybox
879 root S 2240 1 0.0 3.7 sh
1 root S 2208 0 0.0 3.6 init
1086 root T 2192 879 0.0 3.6 exe
1091 root T 2192 879 0.0 3.6 exe
1085 root T 2192 879 0.0 3.6 exe
1000 root S 1856 1 0.0 3.1 lircd
1016 root S 1712 1 0.0 2.8 ntfs-3g
--------------------------------------------------------------------------------------------------------------------------------

底下Mem代表的是整個系統記憶體所使用的大小,我的系統大小是64MB(65536K)
所以47808+11968=59776,咦~~那剩下跑去哪裡了65536-59776=5760K.
那5760K其實就是Linux Kernel所佔的大小啦!!

used: 是代表整個memory被用掉的
free: 是代表memory還剩下的可用的空間
shrd:是代表有多少memory是一個以上的process所共用的
buff: 是代表Disk 所佔存的空間大小
cached: 是代表馬上可以使用的空間大小

Mem: 47808K used, 11968K free, 0K shrd, 3072K buff, 31472K cached

Tuesday, July 22, 2008

新光華商場開幕了

這星期六光華商場開幕了!!這一整棟的建築物裡面就包含1.光華商場2.中華商場3.西寧商場. 這三大電子商場結合在一起,大家就不用到處奔波了,只要來一個地方就可搞好所有你想要的物品。真的是太方便了。

星期天我就跑過去逛,一想也知道都是人山人海的一大堆人。一樓跟二樓都是滿滿的人潮,到了三樓以上人就比較少,逛起來比較舒服。因為我沒有要買東西,所以我就是純粹的逛逛而已先熟悉一下環境。有興趣的人可以去逛逛喔!!!

Friday, July 18, 2008

姓馬很吃虧,那你要姓什麼??

哪有人對自己的姓氏有這麼多的意見,馬總統你講這句話不止你們家族傷心,也讓不姓馬的更傷心。早在選舉之前500萬人已經對你失望透頂了,現在你讓投給你的700萬選民更加失望。你到底會不會執政啊??每次股市下跌,你都會跳出來信心喊話,你都寄望對我們有敵意的國家--中國。然到中國這帖藥良藥可以救起我們台灣的經濟嗎?我也不敢保證。不是說要立足台灣放眼全世界嗎??怎麼一執政就放眼中國,然到你所謂的全世界就是中國嗎?

口口聲聲要務實外交,結果讓人家貶低國格,這已經很嚴重了,結果為了討好與你們之前敵對中國共產黨的官員,你自己在人家面前就自稱自己為馬先生,我聽到這樣的一句話就讓我很吃驚。如果蔣中正還在世的話,我想你第一個會被殺頭的。原來阿~~你連自己的尊嚴都可以踩在自己的腳底下的一個人,姓馬的很吃虧,從你口中講出這樣一句話,我想在這個同時整個馬氏家族的尊嚴也被你踐踏了。好不容易,馬氏家族出了一個總統,整個家族應該都很高興,結果自稱為馬先生的你似乎打掉整個家族的尊嚴。

那到底你要姓什麼呢?? 姓大好了!! 因為我可以這樣叫你 大家好

Wednesday, July 16, 2008

一振不起的台股

這幾天台股下殺快接近500點,整個股市都是綠油油的一片。而我也深陷其中,從天堂到下地獄全部都住進套房了,從另一個角度去思考,這不就是一個機會嗎? 台股指數掉下去,就代表有上升的機會,況且現在就可以選擇好股票的機會,那些財務結構不是很穩定的或者那些經營不善的公司都在這個時候一一現形了,更加地讓投資人一眼就可以分辨哪一支是好股票,哪一支是地雷股。

換個角度來看,我現在也不要投資錢進去台股,我現在趕快存錢,等到時機一到就趕快大筆地購買股票,好好地賺上一筆。那什麼時候要漲呢??我也不知道??

Monday, July 14, 2008

時光蹉跎

看到底下這部影片,讓我有一個想法,就是放手地追逐自己的夢想!!

每個人都有自己的夢想,包含我在內,那何不把握時光實現你的夢想,別再蹉跎光陰了!!

2008海洋音樂祭

星期六跟同事參加2008年國際海洋音樂祭,我也沒有去過想說海洋音樂祭舉辦這麼多年,至少也要去過一次才不會惋厄。下午5點搭了同事的車前去台北貢寮,到了目的地快7點多了,沿路上都是要去朝貢的人潮,幾乎都是一大票的年輕人,還有比基尼辣妹,眼前的風景可以說是無限好。

而貢寮的鄉民,每年就是在等待這一刻,家家戶戶的門前就是停車場,我想這三天下來荷包也賺的飽飽的。也因為人潮眾多,我們的車子也停到很遠的地方,走路過去要20分鐘左右。到了福隆海水浴場,幾乎每條路都擠上滿滿的人潮,好想是螞蟻雄兵傾巢而出黑壓壓的一大片。好不容易地擠到彩虹橋,更誇張的事,連強上也都擠滿人潮,讓我想到音樂真的是一種魔力,讓這些人為之瘋狂。

好不容易擠到舞台前面,看到每個人幾乎挖了一個坑洞,然後悠閒的躺在沙坑裡面。這我還是投一次看到這樣的情形。有些人就拿著圓鍬挖長長的坑洞,然後一整排人的就往洞裡躺,而挖起來的砂就當作枕頭依靠著。

而當我們做定位以後,開始享受整個海風地吹拂,享受搖滾的瘋狂。有些人就喝的爛醉的,整個空氣都彌漫著啤酒,煙味。開始讓我覺得不舒服。但我還是撐到最後,整個表演結束,也讓我體驗到瘋狂的海洋音樂祭!!!

Friday, July 11, 2008

馬政府的擴大內需

新任總統馬英九一上任,首當要件就是要拼經濟。結果他的拼經濟的方式讓我不認同,首先是擴大內需,我想要問一下擴大內需真的有用嗎? 擴大內部需求的癥結點就在於台灣的人民有沒有慾望去購買東西,現在東西物價這麼高擴大內需搞屁啊!!

而且行政院的擴大內需都是一些道路的修補,公園的美化還有殯儀館的改建,難道這些是擴大內需真正的意義嗎?不如拿這些錢去如何協助或培育下一代的人才來得有用。或者拿這些錢去來輔助台灣的中小企業如何擴展到全世界,而不是偏向於中國。我們台灣只是一個小島,沒有礦物資源,所有的石油都必須仰賴其他國家的提供,這些原物料成本都被人家給控制了,我們更應該要想一下如何利用腦力去賺錢,而不是去賺取微薄勞苦的錢。

台灣其實就是靠代工的方式造就出來的,因為現在大環境的改變,我們不應該在走代工的模式,因為代工的模式說實在的,其他人都可以很容易的模仿跨入門檻極低,只要有土地,廠房,人力,訂單我就可以生產了。就像郭台銘一樣,他的代工廠規模如此龐大,但還不是被人挖走400名員工。挖走這400員工,就可以複製一模一樣郭台銘的工廠。說實在的,我並不看好郭台銘的產業,但是我很佩服他有這樣創業的精神。

台商到中國投資其實是為了要有更低的成本來創造高的利潤,但有誰可以保證可以在中國做的很久,這誰也不敢保證了。中國的目的就是要複製你的產業,只要一複製出來,台商就可以拍拍屁股準備走人了。因為台商再怎樣拼也拼不過當地的商人。

真正要擴大內需,就要想辦法讓每個人的所得變高,這才有意義。因為有錢了,大家才會想要去購買東西,刺激整個購買的欲望。所以退稅也是一種辦法,或者提高免稅額也行!!

我總是覺得我們台灣人民所選出來的總統或者那些民意代表,遠光都會放遠去思考如何讓台灣可以變得更好,結果都不是,都是為了自己的利益在思考,都沒有設身處地去為百姓去思考,而造成台灣現在這樣的困境。我現在怕的事,如果馬政府無法提振國內的經濟的話,會不會直接把台灣賣給中國,而他呢??他就可以依親的方式到美國當美國人了!!這就是不沾鍋。Labels:

Wednesday, July 9, 2008

手機有問題

前幾天我的手機電話怪怪的,我的手機已經用了快3年了,他的壽命好像快到了。因為之前打電話的時候,我可以很清楚地聽得到對方傳來的聲音,但是話機的另一方總是聽不到我的聲音,彼此之間都大聲呼喊,但是情況還是一樣沒有改善。索性我就把手機往桌上一敲,這時候竟然對方可以聽到我的聲音,太神奇了!!

昨天,下班了,我也是一樣打電話回家,就在撥通的那時候,手機的老毛病又犯了。我在人行道上大聲的喂~~~~,電話的令一端也在喂~~~~,這時候想到前幾天的方法。但是左顧右盼找不到我的桌子,靈機一動,我就往商家的牆壁敲,敲了一次還是沒有用,我就敲了第二次,每敲完一次就大聲的喂~~~~喂~~~~。真的最後就通了耶!!

只是不知道昨天有沒有人在旁邊看我做這樣的傻事。哈哈~~~

Monday, July 7, 2008

自行車的流行

這個星期天早上5:30從家裡出發去虎頭埤公園運動,沿路上就看到許多車隊全副武裝,整齊劃一地騎著腳踏車,甚至有些是單獨一個人騎著腳踏車。仔細一看,每個人腳踩的腳踏車清一色都是捷安特(Giant),心想著,這些人應該生活過得不錯,為什麼呢?因為這些腳踏車幾乎都是從萬元起跳,一定要有經濟能力才可以付得起這樣的價位。相對地,我只能騎著低於5000元的淑女車。

這種流行來自於石油的漲價而帶動起來的,況且捷安特又把傳統的腳踏車設計成比較前衛,時尚,堅固耐用的產品,讓不想騎腳踏車的人都變的很想騎,可以說是帶動流行的一大功臣之一。

在南部騎腳踏車,應該可以說是腳踏車的天堂,怎麼說呢?在中南部,在交通上沒有台北的車水馬龍,空氣中也沒有危害人體的浮游粒子,處處都是新鮮的空氣,唯獨太陽的毒辣,所以要運動前比需要補充水分,並且做好防曬的保護,這樣騎車才可以安全又舒適。

Thursday, July 3, 2008

牛頓,也只有站著的份!

李家同/暨南大學教授(投縣埔里)
俄國的彼得大帝一向對英國的牛頓很景仰,他和當時的英國國王有點親戚關係,彼得大帝到英國去訪問的時候,央求英國國王安排他和牛頓見面,國王說他可以安排,但彼得必須去拜訪牛頓,牛頓是不會來拜訪他的。

法拉第有時會向很多人演講,當時的維多利亞女皇也去聽,聽完以後,聽眾不會離開,要以鼓掌來表示敬意,演講者會出來謝幕,在謝幕以前,誰也不敢離開,女皇貴為一國之君,也不能離開,沒有想到的是法拉第已經離開了,因有一位老婦人病重快去世了,法拉第趕去為她念聖經。

在很多國家,非常有學問的學者是受到社會特別尊重的。大官雖然位尊權重,也都會對這些人特別有禮貌,如果這些學者已是髮蒼蒼的長者,年輕的大官更加要表現得謙虛一點。畢竟,在民主國家,大官不能做一輩子,政黨一旦輪替,大官就沒有人理了,但是有學問的學者卻越老越會受尊敬。

這次,中研院院士們合影留念,一些極為有名的老院士必須站著,而大官卻全部坐著,媒體紛紛大不以為然。我卻不怪這些大官,他們平時從不和學者來往,對他們來說,院士們對他們毫無影響力,如果院士們換成一大批富可敵國的財閥,大官中的一些小官,絕對不敢大剌剌地坐在前排,而讓一些富豪們站著。

大家可以想到的是,即使牛頓在場,我們的大官們仍會請他站著。

我還看過一場電影,電影中,美國和蘇聯因為電子系統出了問題,而發生了美國的隱形轟炸機即將到達莫斯科投下原子彈,美國通知了蘇聯政府,美國總統也一直以熱線和蘇聯總理聯絡,最後的一刻,美國總統問蘇聯總理離開莫斯科沒有?總理說他們早已離開,而且所有莫斯科城內的重要學者和音樂家,也都離開了,總理還特別提到他們撤離了眾多的數學家。

至於我國的數學家呢?我想我們的政府要員叫不出任何一位數學家的名字,他們很難想像如果沒有數學,電機系就只有關門,現代通訊也不可能,電腦也不可能有,很多國家之所以成為強國,還不是因為它們有很多優秀的數學家。

我在大學畢業以後,服役於空軍,我這才知道美國空軍曾經派人跟蹤英國的迪拉克教授,因為他的研究結果對於現代通訊技術極為有用,只是他們派出的人程度太差,紛紛承認弄不清迪拉克教授講些什麼。

這次大官坐、院士站的現象,一定會引起學者們的同聲歎息,也更會感到人微言輕。大官們看到院士,絲毫沒有敬畏之情,他們如果碰到不是院士的教授,絕對可以不理了。可惜的是,政府似乎不瞭解學術對於國家的重要性,國家如果尊敬學者,莘莘學子比較會埋頭做學術上的研究。以我國最近政府的做法,難怪最聰明的年輕人只想去念財務金融,因為如果你真的在財務金融上極為成功,連政府大官都要在你面前脫帽;如果你在文學,或者數學上成就再高,你也只有站著的份,悲哀也!

【2006-07-05/聯合報/A15版/民意論壇】

Wednesday, June 25, 2008

高油價的來臨

看到新聞每天的報導,我們已經進入高油價的來臨。石油是我們地球人唯一的
命脈,假使全世界的石油被採光的話,那不知道地球的人類會發生怎樣的世界。

台灣終究只不過是一個環海的一個小島國家,面對列強鄰國擁有龐大的資源,
在現實生活上我們還是不得對他們低頭。

現今的科學技術不知道有沒有那種石油的養殖場,我的想法就是利用細菌的方
式可以將腐蝕的肉類來產生有用的碳氫化合物,或者利用其他方式如高溫高壓
的方式來產生石油。

如果有這樣地技術發明的話,台灣就不用靠人家的臉色來要資源了。

Tuesday, June 24, 2008

超級電腦

美國又有一項創舉,就是超級電腦已經建構完成了,而且是全世界最快的超級電腦!!

超級電腦又代表著國力的象徵,在科技業這麼發達的台灣,不知道有沒有能力去發展出
自己的超級電腦。

但是台灣又面臨到現實的問題,要建構一座超級電腦要能做什麼?
底下是我的想法,說不定已經有人在做了

1. 匿蹤式的飛機
設計一台飛機,可以降低雷達的反射波能力。當然如果可以用超級電腦去算的話,
就可以知道雷達波的入射角,以及反射角,哪種材質對於雷達的吸收會比較好,
哪種斜切面可以降低雷達波的反射能力。
2. 飛彈的模擬
可以設計全新的飛彈,如空氣力學,熱力學,彈道的模擬。
3. 氣象的預測
可以準確的預測整個颱風的動向。颱風是屬於低氣壓的系統,又會因為地形,
高氣壓的牽引,而改變颱風的動向。
4. 生命科學
現在人類的基因已全數解譯出來,但是有些疾病還需要詳細的解析出來。像是
最有名的是Folding@Home。
5. 太空科學
最有名的就式SETI@home,可以在家裡分析無線電波,看看有沒有來自外太空所
傳送過來的電波訊號。
6. 電影特效
複雜的渲染技術,以及3D特效的處理。
7. 強大的搜尋引擎
如 Google 就是一個例子。
...

以上應該是世界上最會用到超級電腦的應用例子。不知道還有什麼運算可以用到超級電腦

Friday, June 20, 2008

你FireFox了嗎?

火狐鬥陣拼紀錄,有你一份!
新版的Firefox 3.0以經出爐囉!!
這幾天試用的結果,在開啟多個網頁的時候,有時候會莫名的沒有回應!!
跟FF 2.0比起來,有些不穩定!! 但是我相信FF 3.0 一定會越改越好...

Thursday, March 13, 2008

Linux 底下的crontab 重新啟動

剛開始接觸crontab時,以為只要修改/etc/crontab裡面的檔案就會自動地去執行裡面我所安排好的
script..

結果,不單單要修改crontab裡面的東西,我竟然忘了還要打上'crontab /etc/crontab' ,這個指令...@@

Wednesday, March 12, 2008

SVN備份策略

這幾天試了SVN (Subversion),跟之前的WinCVS用起來不太順手,可能以前用WinCVS用的太習慣了!!然而現今世界都在使用SVN來管理文件或程式碼,連sourceforge都已經在使用SVN,所以身為一個資訊人員,也要試試看SVN到底有多迷人~~~

SVN Server也架好了,剛好公司也有一台NFS Server,NFS Server目的是要備份所有程式碼倉庫(Repository)的文件,以免防止意外產生(如硬碟毀損...). 而我在網路上找到幾個備份的策略,雖然不符合我的需求,索性只好修改程式然後再加上我自己想要的功能..

網路上找到的,都是針對一個Repository來作備份的,而我的需求是備份所有倉庫. 做法很簡單,只要設定固定要存放倉庫的路徑,這支perl script就會自動幫你備份,再搭配crontable的設定就可以每天自動幫你備份.

底下可以分為兩種策略,一種是漸進式的備份Repository,另外一種是完整的備份.

漸進式的備份的優點是備份速度快,而完整的備份速度比較慢.原因是漸進式的備份是屬於少量的Reversion的備份,資料量比較少,而完整的備份是從Reversion 1 到 Reversion 100,每一個version都完全地備份,所佔的硬碟空間也比較大!!


策略一: 每天備份,我設定的時間是晚上11點,只要今天有異動到的我就會以最新的版本備份
------------------------------------------
#!/usr/bin/perl -w

use DirHandle;
use strict;

sub svn_repos_backup;

#--------------------------Config variable---------------------------
my $repos_dir = "/usr/local/svn"; #This is current repository directory.
my $repos_backup_dir = "/mnt/svn"; #This is the backup directory.

#------------------------------Don't change--------------------------
my $repos_backup_lastver = "REV";
my $next_backup_file = "daily_backup.".`date +%Y%m%d`;
my $svnlook_cmd ="svnlook youngest";
my @ReposList;
#--------------------------------------------------------------------

print "=======================================\n";
print "\tREPOS_DIR=".$repos_dir."\n";
print "\tREPOS_BACKUP_DIR=".$repos_backup_dir."\n";
print "=======================================\n";

#
# Parse all repositories under repository direcotry. We are not suggest empty directory in repository directory.
# Please remove the empty directory when you execute this perl script before.
#
if (opendir(DIRHANDLE, $repos_dir))
{
my @Filelist;


@Filelist = readdir(DIRHANDLE);

foreach(@Filelist)
{
my $fname = "$repos_dir/$_";

#print $fname."\n";

if (-d $fname) # test directory
{
if( ($_ ne '.') && ($_ ne '..'))
{
push @ReposList,$_;
}
}
}
}

closedir(DIRHANDLE);


#
# Backup each repository to BACKUP_DIR
#
my $tmp_repos_dir;
my $exec_cmd;

foreach(@ReposList)
{
$tmp_repos_dir= $repos_dir."/".$_;
$exec_cmd =$svnlook_cmd." ".$tmp_repos_dir."\n";
#print $exec_cmd;

svn_repos_backup($_);

}

#
# Backup the respository
#
sub svn_repos_backup()
{

my $lastrev;
my $currev;
my $repos_backup_file;

my $file_path_lastrev;
my $cmd_cur_rev;
my $cmd_svn_backup;
my $cmd_compress_file;



#print "ARG[0] ".$_[0]."\n";


$cmd_cur_rev = $svnlook_cmd." "."$repos_dir/".$_[0]."|";
open(REVS,$cmd_cur_rev) || die "can't fork: $!";
$currev = int();
print "Read Current Rev ".$currev."\n";
close(REVS);


$file_path_lastrev = $repos_backup_dir."/".$_[0]."/$repos_backup_lastver";

if(-e $file_path_lastrev)
{
print "Read $file_path_lastrev\n";
open(LREVS,"cat ".$file_path_lastrev."|");
$lastrev = int();
print "Read Last Rev ".$lastrev."\n";
close(LREVS);

if($lastrev != $currev)
{
$repos_backup_file = sprintf("$repos_backup_dir/$_[0]/%s-%s",$_[0],$next_backup_file);
#
#Execute the backup command.
#
print "Backup is processing...\n";
$cmd_svn_backup = sprintf("svnadmin dump /usr/local/svn/%s --incremental -r %d > $repos_backup_file",$_[0],$currev);
#print $cmd_svn_backup."\n";
system($cmd_svn_backup);

#
#Compress the file of the dumped file.
#
print "Compressing backup file...\n";
$cmd_compress_file = "gzip -9f $repos_backup_file";
print($cmd_compress_file."\n");
system($cmd_compress_file);

#
#Recodr current version and save to REV file.
#
open(LREVS,"+>","$file_path_lastrev");
print LREVS $currev;
close(LREVS);

#
#Remove the temporary dump file.
#
system("rm $repos_backup_file");
print("$_[0] backup done...\n");
}
}
else
{
mkdir($repos_backup_dir."/".$_[0])|| print $!;

open(REV_HANDLE,'>',$file_path_lastrev);
close(REV_HANDLE);
print "not found!!\n";
}
}

策略二: 每個禮拜備份一次,每個星期五晚上23點整個完整的備份,完整備份的資料會很龐大,所以要小心硬碟空間夠不夠用
#!/usr/bin/perl -w

use DirHandle;
use strict;

sub svn_repos_backup;

#--------------------------Config variable---------------------------
my $repos_dir = "/usr/local/svn"; #This is current repository directory.
my $repos_backup_dir = "/mnt/svn"; #This is the backup directory.

#------------------------------Don't change--------------------------

my $repos_backup_lastver = "REV";
my $next_backup_file;
my $svnlook_cmd ="svnlook youngest";
my @ReposList;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
#--------------------------------------------------------------------

print "=======================================\n";
print "\tREPOS_DIR=".$repos_dir."\n";
print "\tREPOS_BACKUP_DIR=".$repos_backup_dir."\n";
print "=======================================\n";
$year += 1900;
$mon += 1;
$next_backup_file= sprintf("weekly_backup.%04d%02d%02d",$year,$mon,$mday);
#
# Parse all repositories under repository direcotry. We are not suggest empty directory in repository directory.
# Please remove the empty directory when you execute this perl script before.
#
if (opendir(DIRHANDLE, $repos_dir))
{
my @Filelist;


@Filelist = readdir(DIRHANDLE);
   
foreach(@Filelist)
{
my $fname = "$repos_dir/$_";

#print $fname."\n";

if (-d $fname) # test directory
{
if( ($_ ne '.') && ($_ ne '..'))
{
push @ReposList,$_;
}
}
}
}

closedir(DIRHANDLE);


#
# Backup each repository to BACKUP_DIR
#
my $tmp_repos_dir;
my $exec_cmd;

foreach(@ReposList)
{
$tmp_repos_dir= $repos_dir."/".$_;
$exec_cmd =$svnlook_cmd." ".$tmp_repos_dir."\n";
#print $exec_cmd;

svn_repos_backup($_);

}

#
# Backup the respository
#
sub svn_repos_backup()
{

my $lastrev;
my $currev;
my $repos_backup_file;

my $file_path_lastrev;
my $cmd_cur_rev;
my $cmd_svn_backup;
my $cmd_compress_file;



$repos_backup_file = "$repos_backup_dir/$_[0]/$_[0]-$next_backup_file";

#
#Execute the backup command.
#
print "SVN Backup is processing...\n";
$cmd_svn_backup = "svnadmin dump $repos_dir/$_[0] > $repos_backup_file >& /dev/null";

print $cmd_svn_backup."\n";
#system($cmd_svn_backup);

#
#Compress the file of the dumped file.
#
print "Compressing backup file...\n";
$cmd_compress_file = "gzip -9f $repos_backup_file";
print($cmd_compress_file."\n");
system($cmd_compress_file);

#
#Remove the temporary dump file.
#
system("rm $repos_backup_file");
print("$_[0] backup done...\n");
}