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");
}