顯示具有 筆記 標籤的文章。 顯示所有文章
顯示具有 筆記 標籤的文章。 顯示所有文章

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年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月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年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年5月12日 星期三

    fping指令的使用

    ping指令是透過傳送ICMP封包給網路上的主機設備(hosts)的方式,來簡易判斷網路設備是否正常開啟運行,非常方便,但限制是一次只能檢查一台網路(主機)設備。

    fping是另一個使用C語言撰寫的程式指令,除了基本的ping功能之外,最主要的特色是可以同時ping多台網路設備,適合大量網路設備檢查的情況使用。

    要充分發揮fping的功能,通常搭配其他程式使用,也就是依實際需求(動態)提供所要檢查的設備ip,也可以後續處理檢查結果,例如記錄於資料庫或發警訊通知相關人員等等。

    詳細參數參考:fping使用說明

    使用範例:

    (-u : 顯示不成功結果, -g : ip range  2> /dev/null 捨棄額外錯誤訊息 )
    fping -u -g 172.17.214.120 172.17.214.132 2> /dev/null

    (-e : 顯示來回檢查所費時間 )
    fping -e -r1 -g 172.17.214.1 172.17.214.254 2> /dev/null

    搭配程式範例:

    use IPC::Open2;
    
    use strict;
    
    # declare file handle
    my ($chld_out, $chld_in);
    
    # "打開" 一個可讀可寫的 "執行子程序"
    my $pid = open2($chld_out, $chld_in, '/usr/bin/fping -e -r1');
    
    # 提供子程序的執行參數 此例. ping 172.17.214.1 ~ 172.17.214.10
    for my $ip (1..10) {
       print $chld_in "172.17.214.$ip\n";
    }
    # 關閉檔案後,才會開始執行fping
    close($chld_in);
    
    # 讀取執行輸出(不含stderr)
    my @output = <$chld_out>;
    
    print for @output;
    

    輸出

    172.17.214.1 is alive (3.72 ms)
    172.17.214.2 is alive (7.23 ms)
    172.17.214.5 is alive (6.09 ms)
    172.17.214.7 is alive (5.67 ms)
    172.17.214.8 is alive (5.20 ms)
    172.17.214.9 is alive (4.62 ms)
    172.17.214.10 is alive (1.22 ms)
    172.17.214.3 is unreachable
    172.17.214.4 is unreachable
    172.17.214.6 is unreachable


    使用apt安裝 fping

    sudo apt-get install fping

    2010年3月16日 星期二

    在Mediawiki內,新增崁入PDF檔案功能

    參考線上說明

    主要步驟有二

    一、 在extensions目錄下新增一個檔案 EmbedPDF.php
    二、 在LocalSettings.php最後新增一行:
        require_once('extensions/EmbedPDF.php');

    使用時,只要在wiki text裡面用...標記就可以了。

    2009年12月9日 星期三

    幸福來自於想法

    這篇網誌有轉譯值得你我咀嚼的人生箴言。(出處:[八卦園]: Regina Brett 的生活箴言)
    1. Life isn't fair, but it's still good.
    人生是不公平的,但還是好得很。
    2. When in doubt, just take the next small step.
    懷疑的時候何妨為未來踏出一小步。
    3. Life is too short to waste time hating anyone.
    人生太短,短到來不及浪費時間去恨任何一個人。
    4. Don't take yourself so seriously. No one else does.
    不要那麼嚴肅對待自己,沒有人會這樣對你的。
    5. Pay off your credit cards every month.
    每個月要付清你的信用卡。
    6. You don't have to win every argument. Agree to disagree.
    你不需要每一次都吵贏,同意你所不同意的。
    7. Cry with someone. It's more healing than crying alone.
    找人一起哭,它比獨自啜泣更加療癒。
    8. It's OK to get angry with God. He can take it.
    對上帝生氣沒有關係,祂受得了。
    9. Save for retirement starting with your first paycheck.
    退休存款要從你第一次領薪水條開始。
    10. When it comes to chocolate, resistance is futile.
    提到巧克力,抗拒它是徒然的。
    11. Make peace with your past so it won't screw up the present.
    要和你的過去和解,這樣它不會搞砸你的當下。
    12. It's OK to let your children see you cry.
    讓你的孩子看到你在哭沒有關係。
    13. Don't compare your life to others'. You have no idea what their journey is all about.
    別拿自己的人生和他人做比較,你根本不清楚別人的經歷是怎麼一回事。
    14. If a relationship has to be a secret, you shouldn't be in it.
    如果一段親密關係需要偷偷摸摸,你根本就不應該涉入。
    15. Everything can change in the blink of an eye. But don't worry; God never blinks.
    一眨眼的功夫什麼都會變,但是別擔心,上帝從來不眨眼。
    16. Life is too short for long pity parties. Get busy living, or get busy dying.
    短促的人生不夠用在冗長的哀悼,要忙著過活,或忙著就死。
    17. You can get through anything if you stay put in today.
    若是今天你堅定不移,你就能渡過一切。
    18. A writer writes. If you want to be a writer, write.
    作家寫作,如果想成為作家就寫吧。
    19. It's never too late to have a happy childhood. But the second one is up to you and no one else.
    重拾快樂童年永不嫌晚,但這第二次只能靠你不能靠別人。
    20. When it comes to going after what you love in life, don't take no for an answer.
    遇到你生命所愛來臨時,不要把「不」作為答案。
    21. Burn the candles, use the nice sheets, wear the fancy lingerie. Don't save it for a special occasion. Today is special.
    點上蠟燭,用好的床單,穿上炫麗的內衣,不要在特殊時刻才用,今天就是特別的一天。
    22. Overprepare, then go with the flow.
    準備要過於周全,然後隨遇而安。
    23. Be eccentric now. Don't wait for old age to wear purple.
    現在就隨興搞怪,不需要等上了年紀了才穿上紫紅袍。
    24. The most important sex organ is the brain.
    最重要的性器官是腦袋
    25. No one is in charge of your happiness except you.
    除你之外沒人能主宰你的快樂。
    26. Frame every so-called disaster with these words: "In five years, will this matter?"
    把所謂的不幸用"五年後這還重要嗎?"這一句話框起來。
    27. Always choose life.
    永遠選擇生活
    28. Forgive everyone everything.
    原諒每一個人每一件事。
    29. What other people think of you is none of your business.
    別人怎麼看你不干你的事。
    30. Time heals almost everything. Give time time.
    時間會癒合幾乎每一件事,多給時間一些時間。
    31. However good or bad a situation is, it will change.
    無論情況多好或多壞,它都會變的。
    32. Your job won't take care of you when you are sick. Your friends will. Stay in touch.
    生病的時候你的工作不會照顧你,而你的朋友會。要保持聯絡。
    33. Believe in miracles.
    相信奇蹟
    34. God loves you because of who God is, not because of anything you did or didn't do.
    上帝愛你是因為祂就是這樣,不是因為你做了什麼或是沒做什麼。
    35. Whatever doesn't kill you really does make you stronger.
    沒能打敗你的確實會讓你更堅強。
    36. Growing old beats the alternative - dying young.
    變老就等於戰勝了另一種選項 - 死得早。
    37. Your children get only one childhood. Make it memorable.
    你的孩子只有一個童年,讓這值得回憶。
    38. Read the Psalms. They cover every human emotion.
    要讀聖經中的詩篇,其中蘊含所有人類的情感。
    39. Get outside every day. Miracles are waiting everywhere.
    每一天都要出門,奇蹟在四處等著。
    40. If we all threw our problems in a pile and saw everyone else's, we'd grab ours back.
    如果我們大家把自己的問題都丟成一堆,然後看看其他人的,相信我們還是會把自己的撿回來。
    41. Don't audit life. Show up and make the most of it now.
    不用去稽核人生,現在就展現自己做最大的發揮。
    42. Get rid of anything that isn't useful, beautiful or joyful.
    任何沒有用、不美、或不悅的都丟掉。
    43. All that truly matters in the end is that you loved.
    到頭來所有最重要的事是你曾愛過
    44. Envy is a waste of time. You already have all you need.
    忌妒是在浪費時間,你已經擁有你所需要的了。
    45. The best is yet to come.
    最好的都還沒來
    46. No matter how you feel, get up, dress up and show up.
    不管你感覺如何,起來,打扮好、展現自己
    47. Take a deep breath. It calms the mind.
    深吸一口氣,它讓心智平靜。
    48. If you don't ask, you don't get.
    如果你不問,你就得不到
    49. Yield.
    謙讓
    50. Life isn't tied with a bow, but it's still a gift.
    人生不會打上蝴蝶結,然而它仍然是一份禮物。

    說得好,也譯得好!

    2009年11月13日 星期五

    分享/展示 片段程式碼的工具 codepad

    今天由Google Reader讀取這篇文章的時候,
    注意到有這個分享/展示 片段程式碼的工具codepad
    可以編譯/執行貼上去的程式碼,
    同時可依據該程式語言的文法加以美化顯示,
    試了結果如連結:Perl_code
    初次印象還不錯,由於是連結,也可以用在MSN或Twitter上。

    使用這個方式傳送連結,
    不再需要貼上長長而又凌亂的程式碼,
    也算是電子型態的另一種"環保"

    註冊帳號也很容易,完全不需要mail address,
    就輸入UserID & PWD就可以了
    註冊的好處是可以永久保有這個連結

    維基參考連結:Pastebin
    Memo:mrhsucodepad/ditto

    2009年11月12日 星期四

    思考如何思考

    網路上看到有關"思考"的文章,摘要部份做筆記

    思考,誰不會思考?但就像「呼吸」與「深呼吸」的差別,面對現代多元社會的種種資訊,思考已不能停留在單點、淺層、浮面、天馬行空的思考。

    穿過Eastern Hutt School小學的矮牆,走入一間裡頭擺著成人桌椅的教室,牆上貼著六頂「思考」紙帽圖樣。
    校長Dianne Patterson解釋,這是專教思考策略〈thinking strategy〉的教室。
    全校三十二位老師,每週一次輪流來當學生,上「如何教孩子思考」的課。
    這份 thinking strategy共有六種思考技巧:

    一、好的想法:這麼想,有什麼好處?
    二、壞的想法:這麼想,有什麼壞處?
    三、思考如何思考:想想看,這件事,到目前為止,我們想到了些什麼?做了些什麼?接下來,我們該往哪個方向思考?
    四、資訊:往某個方向思考,我們有哪些已知資訊?還需要些什麼資訊?
    五、新想法:能否有不同的看法?
    六、感覺:如果這樣我的感覺如何?