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手動安裝,見招拆招,多能順利解決。

2011年4月2日 星期六

寫程式的能力

寫程式的能力跟讀寫一樣,每個人多少都要會一點。

我所說的寫程式,不是正經八百的coding,
而是「指揮電腦」的能力。

電腦的運算與記憶能力(甚至體力)都比我們強
但就像常見的工具(如螺絲起子)一樣
它是我們可以運用的工具之一
我們來決定,螺絲是要鎖上還是卸下,
工具本身不負責思考或下決策。

電腦比一般傳統的工具靈活
也是一大堆工具的結合
特別是網際網路的快速發展
經由對外連線,可以取得的資訊與整合的服務,
都超過我們的想像,而且演變的速度越來越快,
如果能夠經由程式的技巧來整合這些資源
電腦能夠發揮更多的用途,
我們也會因而間接或直接的受益。

大致上,程式可以提供我們三種型式的方便:
大量處理、自動化、代理人

《大量處理》

GUI桌面程式的風行降低了使用電腦的障礙,
直覺而又漂亮的操作介面,
取代了指令模式的不親切,
讓個人電腦大量普及,是很好的設計。
然而GUI有一個問題就是,
它必須由人來操作,
由人來解讀螢幕上面的訊息,
沒有操作者,他就不會動,
只會靜靜等待著滑鼠被點一下
才進行下一個步驟。

想想看,假如你有成千或者上萬首歌曲放在電腦裡面,
有一天你想要整理分類,
或者只是複製到另外一台更大容量的外接式硬碟,
這時也許你想區分歌手或者作曲家,
把相同屬性的檔案放在相同的目錄,
也許發現同一首曲目曾出現於不同位置,
想順便移除重複的檔案,.....
諸如此類的「整理」工作。

處理數百個檔案並不是大(困難)問題,
但是數千個,可能得花上個幾天的時間,
就算有耐心的做一次,那下次呢?

如果把處理分類的規則寫成程式,
讓程式代勞,有效率的完成這些重複、規則性的選取、複製與貼上的程序,
這是日常生活裡大量處理的應用。

工作上也有類似的需求,
大量重複耗時的工作經常存在,
寫程式,能幫你解決這類問題。

《自動化》

有些事情需要在特定的時間或條件下才需要(能)去作,
或者一段期間內,每隔一定時間得去執行的事,
如果沒有寫程式來輔助,你只能持續地等待與檢查,事必躬親。
像這類可以排程去處理的事情,
透過程式來進行,不需要你人親自在現場,
也能夠自我啟動執行,自我偵錯,自我紀錄,自我儲存,
甚至將執行結果往外通知的方式,這就是自動化。

《代理人》

代理人的例子蠻常見,
但一般人多習以為常,不會特別去注意到。

就拿我們上網訂購高鐵票這件事為例,
高鐵的線上訂購網站就是高鐵公司的櫃台代理人,
反之,當年台鐵火車票過年期間,一票難求的時候,
也曾有人將購票程序寫成程式,
在半夜以代理人身份代替本尊連上網路訂票。
兩方面的代理人一來一往,就像真人互動一般,毫不含糊。
仔細想想,真的有趣極了。

寫程式,先要選擇自己合用的程式語言,
(合用,是說用起來順手,符合自己思考方式的)
而在經過這一、二十年來的開放原始碼運動發展之後,
如今簡單、好用、穩定、成熟的程式語言比比皆是。

運用工具一直是靈長類的的強項,
選擇、學習一個順手的程式語言,
磨練、培養自己寫程式的能力,
是今日我們必備的基礎能力之一了。