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
竟然一切順利正常
搞定收工

2011年5月2日 星期一

Term::ShellUI 模組

Term::ShellUI 是CPAN上的一個模組,
用來建立像shell一樣的文字模式人機介面。

多了一層介面,
當然意味著可以隨需要增強或限縮可以做的事情,
也可以紀錄使用者在連線過程中,
所操作的每一個按鍵與時間戳記,
所謂"凡走過必留下痕跡"需求下,
這算是基本必要的功能。

另外,也可以再建立另外一組應用層使用者,
一方面可以減少系統使用者數量
同時也能夠簡化作業權限的管理。

類似的想法,也能夠用web的方式來實現,
端看實作環境與作業特性來選擇。

由使用文件範例稍做修改如下:
use Term::ShellUI;
my $term = new Term::ShellUI(
    commands => {
            "cd" => {
                desc    => "Change to directory DIR",
                maxargs => 1, 
                args    => sub { shift->complete_onlydirs(@_); },
                proc    => sub { chdir($_[0] || $ENV{HOME} || $ENV{LOGDIR});     },
            },
            "chdir" => { alias => 'cd' },
            "lsl"   => {
                desc => "List files in working directory",
                maxargs => 0, 
                proc => sub { system('ls -l'); },
            },
            "pwd" => {
                desc => "Print the current working directory",
                maxargs => 0, 
                proc => sub { system('pwd'); },
            },
            "help" => {
                desc   => "Print helpful information",
                args   => sub { shift->help_args(undef, @_); },
                method => sub { shift->help_call(undef, @_); }
            },
            "exit" => { alias => 'quit' },
            "quit" => {
                desc   => "結束作業", maxargs => 0,
                method => sub { shift->exit_requested(1); },
            }},
        history_file => '~/.shellui-history',
  );
print 'Using '.$term->{term}->ReadLine."\n";
$term->prompt('OP-Shell: ');
$term->run();

這個模組的基本用法整理如下:
  • 建立一個command set,這個command set就是使用者可以執行的指令。
  • command set 基本上是一個以hash為主的資料結構,詳細參見文件說明。
  • 同一個指令可以有別名。
  • command set可以遞迴,也就是可以有"次指令 sub command"的功能。
  • 支援指令歷程command history,按上下鍵選擇。
  • 支援中文 (要安裝Term::ReadLine::Gnu)
執行影片如下:
經由自動產生的help畫面,
知道可以執行的指令有哪些,
中文顯示沒有問題,
cd切換目錄,經由pwd指令確認沒有問題,
lsl也正常,但是ls如同預期不能執行,
最後,雖然指示quit離開,但因為程式設定exit是quit的別名,
所以打exit或quit都可以離開。


《影片使用recordmydesktop錄製,再使用vlc轉成mp4》

2011年4月23日 星期六

整批檔案格式轉換

習慣將喜愛的音樂光碟做一份備份
之前使用nero燒錄程式所做的備份
預設是存成nrg格式。

自從2010年家中的電腦因Windows版權問題
改成免費而且已經穩定好用的Ubuntu系統
沒有辦法直接掛載*.nrg格式映像檔
日積月累的數位檔案也已經"氾濫成災"

花了點時間
集中整理放在同一顆硬碟上
希望格式也都是統一的ISO格式
2~3百個光碟映像檔當然不可能適合手動轉換
簡單方法如下

# Linux下,將目錄內所有 *.nrg轉成 *.iso檔
# 使用 nrg2iso 指令
use strict;

my @nrg = glob "*.nrg";

for my $nrg (@nrg) {

    # 需要將副檔名 .iso 改成 .nrg 
    my $iso = $nrg;
       $iso =~ s/\.nrg$/\.iso/;

    # 印出 nrg2iso 的輸出
    print `nrg2iso "$nrg" "$iso"`;

}

2011年4月5日 星期二

如何排除安裝Perl模組時可能遇到的各種問題?

Perl不像Python,有著號稱"batteries included"的預設模組庫,
通常得視需要,安裝適宜的模組。
這兩種截然不同的"武器裝備哲學"到底孰優孰劣,
標準答案當然是:各有優缺點,青菜蘿蔔各取所愛。

使用cpan方式來安裝Perl模組,
通常會很順利地自動下載(以及自動下載所依賴的其他模組)、測試、安裝,
但是偶爾遇到安裝失敗時,怎麼辦?

最常見的方法是用look 模組的方式,以分解動作來手動安裝。

c:\> cpan
cpan> look POE
> perl Makefile.PL
> dmake 
> dmake test
> dmake install
exit

今天安裝DateTime::TimeZone時,dmake吐出了一個錯誤訊息
dmake.EXE:  makefile:  line 1312:  Error: -- Input line too long,
increase MAXLINELENGTH 

這個問題,得額外加上一個參數才行MAXLINELENGTH
(30000是任意數,應該不用這麼大)
c:\> cpan
cpan> look DateTime::TimeZone
> perl Makefile.PL
> dmake MAXLINELENGTH=30000
> dmake MAXLINELENGTH=30000 test
> dmake MAXLINELENGTH=30000 install

大多數的問題,經由look手動安裝,見招拆招,多能順利解決。