2013年10月4日 星期五

安裝Starman模組要注意的小地方

要順利完成測試安裝Starman模組,
必須先安裝LWP::Protocol::https,
否則會因測試失敗無法安裝!

2013年6月18日 星期二

如何使用MLDBM模組

Perl的資料結構之一「雜湊(hash」是用來存取「(鍵值、對應值)」的資料集合。
其中「鍵值」是字串格式,而對應值是「純量(scalar)」,
「參照(reference)」也是純量的一種,通常是指向一個資料結構所在的記憶體位址(address)
透過「參照(reference)」可以建立相當複雜的資料結構,
適當地運用可以達到強大而又靈活的資料處理,有點像是階層式資料模型。

要儲存這種資料結構,至少有兩種選擇,分別是「DBM:Deep」及「MLDBM」。

「DBM:Deep」由純Perl語言所開發,對於少量資料(數百筆」相當好用,
可是當資料量變多時,存取速度會明顯變慢。

「MLDBM」可以介接數種不同DBM存取程式庫,速度相當快,
當資料量是幾萬筆以內時,使用起來方便靈活,
對於輕量的資料庫應用,特別是小型資訊系統,是個不錯的選擇。

簡單使用MLDBM的程式範例如下
use strict;

use BerkeleyDB;
use MLDBM qw(BerkeleyDB::Btree);
use Data::Random qw(:all);

my $filename = 'foo.db';
my %db;
tie %db, 'MLDBM', -Filename => $filename,
                  -Flags    => DB_CREATE
    or die "Cannot open database $filename: $!\n";

# 產生10筆隨機資料,放入%db中,隨著迴圈的執行,資料也會同步寫到硬碟上的檔案中。
for my $seq (1..10) {

    my @random_words = rand_words( size => 5 );  
    $db{$seq} = [@random_words];
   
}

2012年7月11日 星期三

使用DateTime模組需要注意的小地方

DateTime 是CPAN上的一個模組,用來處理日期時間。

我通常使用它來產生與日期相關檔名,或者簡單的日期運算;
很方便轉換成字串以及UNIX TIME,用來顯示或者存入資料庫欄位。
要特別注意的是Time Zone的指定,使用正確的TimeZone,
才能正確顯示特定區域的日期時間,說明如下。


use strict;
use DateTime;

# 取得現在的時間,沒有指定Time Zone,所以是UTC Time Zone。
my $dt = DateTime->now;

# 指定Time Zone是local,DateTime模組會嘗試取得正確的Time Zone
my $dt = DateTime->now( time_zone => 'local' ); 

# 指定Time Zone是'Asia/Taipei'
my $dt = DateTime->now( time_zone => 'Asia/Taipei' );

# 底下兩行是一樣的
# 2011-08-26T17:12:31
print $dt->datetime(), "\n";
print $dt->iso8601, "\n";

2011年9月23日 星期五

一個FTP傳檔問題的解決方法

FTP檔案傳輸雖然不是安全的協定,
但在公司內部,由於使用方便簡單,
如果需要在不同主機間交換檔案,至今仍然是一個好的方式。


但在實務應用上,如果需要傳遞的檔案比較大,
有可能發生提供檔案的程序仍在執行中,
而收檔的程序已經開始進行檔案下傳了,
結果收到的檔案便會不完整,也無法立即發現,
需要額外的檢查程序,才能夠確認是否有問題。


這個問題有兩個可能的解決小技巧:


第一個是傳送時先使用暫時檔名(比如檔案名稱前加個底線),
等到傳送完成時再將檔名改成正確的檔名。
如此一來,當收檔的程序'看'到檔案的時候,
必定是已經傳送完成的狀態了。
只是這個方法需要傳送檔案的程序配合。


另外一個類似的方法是在傳檔完成後,
多傳一個小檔案(比如檔案名稱後加個".ok"),
收檔的程序'看'到這個小檔案的時候,
也必定是已經傳送完成的狀態了。
這個方法同樣需要傳送檔案的程序配合。

或許有人會想說,
也可以經由持續檢查檔案的檔案大小,
或檔案最後修改時間來判斷是否已經傳送完成,
只是這個方法必須依賴不同遠端作業系統的一致性,
不如前面二種方法來得可靠。


參考連結



2011年8月30日 星期二

Time::Piece 模組

Time::Piece 是CPAN上的一個模組,
用來處理日期時間,跟DateTime模組一樣簡單好用。
它主要是取代原有的localtime以及gmtime,改為物件方式來處理日期時間。
( * 有關日期時間的處理,可以參考這篇文章The Many Dates and Times of Perl)

use strict;
use Time::Piece;

# Time::Piece模組會取代原有的localtime & gmtime
# localtime會傳回Time::Piece物件
my $dt = localtime;

# Time::Piece物件在字串語境下,也會自動跟localtime的輸出是一樣的
print "Time is $dt\n";
# Time is Fri Aug 26 17:12:31 2011

print "Year is ", $dt->year, "\n";
# Year is 2011

print $dt->datetime, "\n";
# 2011-08-26T17:12:31


2011年6月5日 星期日

日影《花水木:依然想著你》觀後感






















 
昨天看了日影《花水木:依然想著你》,心中頗有感觸,
感動的不是表面的男女情愛,
而是片中伴隨劇情主軸約10年的分合過程中,
自身與周遭親友所發生的大小事情,
像是個人的興趣與成長方向的選擇、
家庭成員共同面對的經濟壓力、
因病痛、因意外而離去的親友等等
這一切平凡的日常事件,
是我們人格與心智熟成的養份.....

人的一生總會扮演幾種不同的角色,
也都有自己的嚮往與侷限,
從出發回到原點
不管需要多少時光
唯有親身經歷這些悲歡離合,

才能教會我們知道如何去接受與珍惜。

2011年5月4日 星期三

VMware-Player 問題處理

作業系統更新至Ubuntu11.04後,
今天是第一次開啟VMware-Player,
想要更新WinXP,
沒想到VMware-Player開不起來,
按例上網Google找最近一週的網路資訊
依樣畫葫蘆的胡搞了十幾分鐘,但沒有成功
最後直接連上VMware官網,
下載最新版的VMware-Player-3.1.4-385536.x86_64.bundle
簡單兩行
chmod +x VMware-Player-3.1.4-385536.x86_64.bundle
sudo ./VMware-Player-3.1.4-385536.x86_64.bundle
竟然一切順利正常
搞定收工