2017年1月19日 星期四

Windows 環境下,Perl處理中文的簡單建議


也許不是最好的建議方式,但至少提供一致性的處理方式。

編輯器設定:UTF-8編碼

Perl程式:
  • use utf8;  
  • 使用 encode 明確以big5編碼與外部OS(Windows)溝通
    • $file_name = '中文檔名';
    • encode ('big5', $file_name)
  • 使用 decode 明確指定由外部進來的資料編碼為何
    • $cname = decode('big5', $cname);


2017年1月18日 星期三

印象深刻的一首民歌

【歲月】 楊弦

每天一早便開車加入 上班族長長婉蜒的車隊
一樣的風景 一樣的擁擠 一樣的忙碌 一樣的寂寞
不停的工作 不停的計劃 經歷希望、欲望、健忘和淡忘
數著歲月 數著白髮 數著青春 年華的流逝
盼望著有一天我能離去 去跋涉遙遠的高原和大漠
朝著普陀 聽那海潮和梵音
走回家鄉 夢回童年 走回家鄉 夢回童年
從小到大立下許多志向 多少披星戴月的夜車路
多少考試 多少窄門 多少遙遠的異鄉路
愛情來又去 空留回憶 親朋難相聚 多少生別離
多少煩惱 多少牽掛 此心何時 才能歇息
幻想著有一天我已離去 去尋找恆何舊墟的歷史
在那雪山和荒野裡沉思
從哪裡來 往何處去 從哪裡來 往何處去

這首歌的歌詞與旋律
一直讓我頗有感受

終究最後,
我們最在意的,最珍惜的,
還是是那一段
不在意明日將會是如何
活在當下的青春歲月

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

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有一個問題就是,
它必須由人來操作,
由人來解讀螢幕上面的訊息,
沒有操作者,他就不會動,
只會靜靜等待著滑鼠被點一下
才進行下一個步驟。

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

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

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

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

《自動化》

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

《代理人》

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

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

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

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

2011年3月29日 星期二

ActivePerl使用cpan安裝DBD::DB2模組

今天發現ActiveState公司所提供的ActivePerl 5.12.3版有個不錯的改進
(可能之前的版本就改進了,只是今天才注意到,不過這並不重要)。

以往在Windows環境底下使用Perl總有個令人覺得是次等公民的限制,
那就是對於部分需要C編譯程式才能完成安裝的模組,
如果沒有已經準備好的PPM(參考),那就無法安裝,也就是不能用。
如果找得到也有可能不是最新的版本,使用上總是有點不暢快,
於是習慣在Unix環境下使用Perl。

ActivePerl 5.12.3提供了gcc編譯器(應該是v3.4.5)
鍵入cpan後歡迎畫面會顯示這個資訊,
安裝模組的方式一如往常,
以安裝DBD::DB2為例:
install DBD::DB2
就可以了

只要Windows環境下DB2的環境是準備好的
整個安裝過程完全沒有問題
之後也寫了個簡單的測試程式確認連結、查詢資料庫是正常的

我覺得這個改進很好,讓人覺得呼吸順暢沒有束縛,開放原始碼真好。

2011年3月26日 星期六

好聽的 In my life

好聽的《In my life》,演唱跟口白版本一樣動人。





歌詞淺顯感人

In my life

There are places I remember all my life
Though some have changed
Some forever, not for better
Some have gone, and some remain
All these places had their moments
With lovers and friends I still can recall
Some are dead and some are living
In my life I've loved them all

But of all these friends and lovers
There is no one compares with you
And these memories lose their meaning
When I think of love as something new
Though I know I'll never lose affection
For people and things that went before
I know I'll often stop and think about them
In my life I love you more

Though I know I'll never lose affection
For people and things that went before
I know I'll often stop and think about them
In my life I love you more

In my life I love you more    

這一生中

有許多地方對我來說永生難忘
雖然有些地方早就人事已非
有些地方永遠一成不變
有些已經片瓦不留,也有些還保持原樣
它們全都曾參與過重要時刻
和戀人、和朋友,這些人在我的記憶裡依然那麼清晰
他們有些已經撒手人寰,有些還活在世上
這一生中我深愛這一切

但在全部的戀人和朋友之中
沒有一個人能與妳相比
這些回憶通通失去了它們的意義
當愛情對我又產生了新鮮感
雖然我很清楚我永遠不會失去這份情感
對於那些已成追憶的人、事、物
我知道我會常常停下腳步懷念它們
但這一生中,我愛妳最多

雖然我很清楚我永遠不會失去這份情感
對於那些已成追憶的人、事、物
我知道我會常常停下腳步懷念起它們
但這一生中,我愛妳最多

但這一生中,我愛妳最多……

2011年3月20日 星期日

Ubuntu上更新OpenOffice到3.3版的方法

安裝步驟
  1. 移除前版本 :  sudo apt-get remove openoffice*.*
  2. 下載 : 網址 OOo_3.3.0_Linux_x86-64_install-deb_zh-TW.tar.gz
  3. 解壓縮
  4. 安裝 : sudo dpkg -iR ./OOO330_m20_native_packed-1_zh-TW.9567
也許過程會因為作業環境不同而有點異常的情況發生,但大致上這麼做是沒有問題的。

另外注意到,由於SUN已被甲骨文公司併購,所以開放軟體社群另外建立了一個分支LibreOffice 免費文書處理軟體中文版。但操作介面類似與檔案格式仍然可以相通讀取。

我個人來說,自從家中"借用"的MS-Office 2003被告知說是非正版而移除安裝以後,就改用OpenOffice,連帶PC的作業系統改成Ubuntu超過一年了,個人使用上覺得穩定方便,也因為沒有安裝防毒軟體,所以PC運作效能也一直維持應有的水準。

    2011年3月19日 星期六

    習作-使用Open2來與外部程式交談

    # demo 使用Open來與外部程式交談
    # unix指令wc : print newline, word, and byte counts for each file
    # 在perl程式內執行wc, 提供計算資料以及取回計算結果
    
    use strict;
    
    use IPC::Open2;
    use IO::Handle;
    
    # init file handle
    my $read_fh  = IO::Handle->new();
    my $write_fh = IO::Handle->new();
    
    # 使用open2建立可與之交談的子程序
    my $childpid = open2($read_fh, $write_fh, 'wc');
    
    # 提供資料
    $write_fh->print("abc def\n24 187\n");
    # 關閉(結束)input handle, 否則wc會一直等待
    $write_fh->close();
    
    # 取回結果(可能多行, 使用陣列)
    my @wc = <$read_fh>;
    
    # 關閉(結束)input handle, 否則wc會一直等待
    $read_fh->close();
    
    print "$_\n" for (@wc);
    # 印出 2 4 15
    
    # 等待確認子程序已結束
    waitpid($childpid, 0);
    
    exit 0;
    

    在Perl程式裡面執行外部程式的方法很多,如何選擇使用,主要還是取決於需求以及外部程式的特性。

    有一類如系統指令,並不提供API,通常的用法就是在shell環境下,以指令的方式或者shell script的方式使用,用眼睛閱讀解讀,執行的輸出結果,或者再把它的輸出經由pipe,當成另外一個指令的輸入或者儲存寫到檔案裡面。


    如果需要能夠動態決定輸入內容,以及靈活使用(比如判斷、轉換、組成、轉送...)它的輸出,Perl提供open2這個基本函式,經由線上文件可以瞭解它的使用方法,以及需要注意(比如I/O buffer的觀念)的地方。

    外部程式並非永遠正確執行(比如可能找不到,或者傳入的內容不符合他的預期...),這點就需要檢查$?變數內容。

    為什麼是open2(),因為它只處理了STDOUT & STDIN這兩個File Handle,如果還需要STDERR的內容,那就要使用open3(),照文件說明所說,open2()其實是open3的wrapper,也就是它最終是去呼叫open3(),使用這個函式需要注意的是File Handle的Input/Output方向。

    然而,現在寫程式,比較不建議直接使用open2這些基本的函式呼叫了,因為你需要處理一些不必要的細節,學會使用CPAN上的模組,比如IO::CaptureOutput或者IPC::Cmd
    可以簡化一些處理細節,程式的bug也會減少很多。

    2011年3月9日 星期三

    設定備忘:讓User只能FTP而不能logon的方法

    參考來源

    為了安全起見(FTP一點都不安全),如果User不需要登入系統,就不要給他這樣的權限。
    要修改的有兩個設定檔案,分別是 /etc/passwd & /etc/shells

    /etc/passwd 存有使用者帳號資料,每行有7個欄位。(參見)





    1. 將最右邊的 /bin/bash 改成一個不存在的 shell , 比如 /usr/nologin,存檔。
    2. 再將這個shell種類加到 /etc/shells 最後面一行就可以了。

    2011年3月7日 星期一

    IBM主機中文碼的轉碼

    不同系統間的資料傳遞,如果只是單純的英數字資料,就不會碰到麻煩,
    但是,如果資料含有中文字,就要特別處理轉碼的問題,
    原本處理來自IBM主機資料時,一直 Convert::IBM390這個模組,
    也由於之前資料內很幸運的都沒有中文,
    所以一直也沒注意到這個無法轉換中文的限制,直到.....今天。

    Convert::IBM390只能夠轉換 IBM-1047 <=> ISO8859-1
    而 IBM主機上的Traditional Chinese EBCDIC編碼是IBM-937(cp937)
    目前Perl在CPAN上面的Encode模組找不到支援cp937
    另外唐鳳所寫的模組Encode::IBM可以支援。(但我沒試過)

    Unix-like作業系統上,也有一個iconv的指令,可已進行檔案轉碼的作業。
    簡單介紹可以參考這裡

    所以經由Perl可以間接使用iconv來轉碼,再將結果取回放回變數內,舉例如下。

    ###############################
    # CP937 => Big5 轉碼
    # 使用inconv指令
    #
    sub CP937_BIG5 {
    
        my $eb = shift;
        return '' unless $eb;
    
        # 在家目錄/tmp下
        my $big5file = $ENV{HOME} . '/tmp/big5file';
        open Convert, " | iconv -s -f IBM-937 -t big5 > $big5file "  or die;
    
        print Convert $eb;
        close Convert;
    
        open B5, '<', $big5file or die;
    
        my $big5 = <B5>;
        close B5;
    
        return $big5;
    
    }
    


    如果不想使用上面的方法,也可以改用Text::Iconv,比較簡潔。
    ###############################
    # CP937 => Big5 轉碼
    # 使用Text::Iconv來介接inconv指令
    #
    use Text::Iconv;
    sub CP937_BIG5 {
    
        my $eb = shift;
    
        if ($eb) {
            return Text::Iconv->new("IBM-937" => "big5")->convert($eb);    
        }
        else {
            return '';
        }
        
    }

    轉碼是個不得已沒有營養的作業,
    但為了現有營運中不同系統間的資料轉換,
    它又是個必須存在的基本工具。

    Perl提供了良好多樣性的方法來達到我們的目的,是個值得學習而又實用的程式語言。

    2010年10月31日 星期日

    孤陋寡聞

    Ruby Version Manager (RVM)是一套讓使用者可以在同一個作業系統下,安裝以及切換使用多個版本的Ruby程式語言的工具。

    誰會需要安裝多個版本? 是開發人員。軟體工具更新速度越來越快,除了早期版本開發的應用系統需要維護外,也需要能夠針對新版本進行安裝與學習測試,所以這樣的切換工具就應運而生。

    不意外的,Perl也有類似的工具:App::perlbrew

    安裝RVM的文件裡有這樣的指令
    bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
    比較奇怪的是 <( .....  ) 是啥?!! 用Linux也有一段時間了,倒是沒看過這個指令?!

    到Google找答案,問題是Google不會去搜尋 <( 這樣的查詢字串,這又衍生另外一個問題,Google搜尋服務就在那裡,但不是每個人都有能力去搜尋!

    不管如何,我還是找到答案了,這有個詞叫做「Process Subtitution」,簡單的解釋看這裡,詳細的解釋與範例看這裡
    有點尷尬的是,這又再度衍生另外一個問題,Google搜尋服務就在那裡,你有能力去搜尋,但不是每個人都有能力去理解答案! 大多數的人可能都只具備傳送url連結的技能吧?

    為了減少尷尬的機會,(多虧)Google搜尋又給了我們另一個救贖的可能,就是「沒事多看書,多看書沒事」,在搜尋的頁面看到了這個網誌文章《12 本免費的 Linux 優質好書》 而且慷慨地透過免費這神奇的字眼來驅使我們學習。

    所以知識還是力量,網路找得到的只是資料與資訊以及通往知識道路的指標,理解的能力與知識的本身,永遠需要靠自己一點一滴的不斷累積,只是以前讓人知道自己無知的是朋友(子曰︰獨學而無友,則孤陋而寡聞),現在則是多了一個來源︰網際網路Internet(大陸叫互聯網)。