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(大陸叫互聯網)。

2010年10月24日 星期日

本益比

以前聽一位長輩說過:「買股票要買在高本益比,不是去買低本益比的股票」。

老實說一直不懂,也有點質疑,投資股票的基本,
不就是要先看本益比是否合理(夠低)嗎? 為何反過來要買在高本益比呢?

最近覺得有點想通了。
說明白一點,這句話應該是針對景氣循環股而言,
當它的本益比不高的時候,通常是前一年的收益已達到景氣高點(所以會交投熱絡,吸引投資人的興趣),
股價也因投資人對於前景樂觀而來到相對高點,
這時候如果原本已擁有該檔股票,應該判斷依據景氣狀況,
決定是否獲利了結(也就是要賣而不是買!),等待下一次景氣循環。

相反地,如果股價已低迷一段時間,獲利也維持低檔,
然而不知為何,股價漸漸的上升,本益比因而比合理值(10-15)還高,
這時應該順勢買進(買在高本益比!),
等到公司營運獲利因景氣變好而增加,也差不多是該獲利了結的時候了。

2010年10月23日 星期六

神奇的今天

摘錄自:卡內基每週一智 電子報                                  2010/10/19

美國散文作家梭羅說:「如果有人朝著夢想、信心十足的前進,並把夢想中的日子過得跟真的一樣,他不久就會達到意想不到的成功。也許你築起了一座空中閣樓,但它不一定會消失,現在,你只需在它下面奠上地基。」

再二個多月即將要邁入中華民國百年,歡慶國慶日的同時,你打算要為自己創造什麼樣的人生?何妨就從今天重拾自己的夢想,讓自己和中華民國一起邁入嶄新的年度!

人的內心都有一份神奇的力量,那就是自我!人如果改變對事與人的看法,事與人就對他發生改變。也就是說當人提昇了自己的思想,用上進積極的態度去克服並完成某些事,人生就會因此而轉變。所以讓我們振奮起來,最重要的也是要從改變我們的想法態度開始!

這份計畫稱為「活在今天」。只要我們能照著做,多半的憂慮即將消逝,相對的增加我們生活的樂趣。讓我們一起培養更平和快樂的心理態度:「想得開心、做得開心,你就真的會覺得開心。」

1. 今天我要很開心。因為林肯說:「多半的人都可以決定自己要有多快樂」。快樂源於人的內心,它並非外來物。

2. 今天我要調適自己,而非調整世界來配合我。我要讓自己配合我的家庭、事業與機運。

3. 今天我要照顧自己的身體。我要運動、關心它、滋養它、不濫用它、不忽略它,使它成為我心靈的殿堂。

4. 今天我要強化我的心靈。我要學習,不讓心靈閒置,我將閱讀需要專注、思想與努力的讀物。

5. 今天我要由三方面操演我的心靈:我要默默為某人做一做好事。再起碼做兩件我不想做的事。只是為了讓心靈演練,不致怠惰。

6. 今天我要使自己怡人。我要使自己看來愉悅,穿著合宜,輕聲慢語,舉止恰當,多讚賞,少批評,不找任何事的毛病,也不想挑任何人的缺點。

7. 今天我要全心全意只活這一天,不去想我整個的人生。一天工作十二小時固然很好,如果想到一輩子都得如此,可能會先嚇壞我自己。

8. 今天我要釐訂計畫。我要計劃每小時要做的事。可能不能完全遵行,但我還是要計劃,為的是避免倉促及猶豫不決。

9. 今天我要給自己保留半小時輕鬆時間。我要用這半小時祈禱,想想我人生的遠景。

10. 今天我將無所畏懼,特別是我不怕更快樂,更享受人生的美好;也不怕更去愛人,相信我愛的人亦愛我。

2010年10月19日 星期二

口乾欲殆,來瓶舒跑吧~

Don't Repeat Yourself (DRY) 以及 Duplication is Evil (DIE) 是軟體開發上的一種原則,盡量把重複的程式碼集中,把系統中共用的設定放在設定檔中,以減少日後系統維護的負擔;有趣的是,如同警語般,如果你不遵循這樣的原則,你會累到口渴絕望,最後還可能賠上一條小命!

以前開始寫程式的時候,根本不會想到這個層面,能夠順利的把程式寫出來,除錯無誤,依照需求功能正確執行,便覺得自己好神。

想當年,自己寫的不入流的小程式竟然能夠連接到所謂的『資料庫』,那種喜悅與榮幸至今仍然記憶鮮明。
後來發現有個Perl DBI模組能夠以一致共通的方式連到大大小小不同的資料,那種震撼更是難忘。

(來源: Programming the Perl DBI  http://oreilly.com/catalog/9781565926998)

幾乎每支程式都是類似下面這樣的寫法(repeat yourself?)

(程式碼來源 http://oreilly.com/catalog/perldbi/chapter/ch04.html)
#!/usr/bin/perl -w
#
# ch04/error/ex1: Small example using manual error checking.
  
use DBI;            # Load the DBI module
  
### Perform the connection using the Oracle driver
my $dbh = DBI->connect( undef, "stones", "stones" ) 
    or die "Can't connect to the database: $DBI::errstr\n";
  
### Prepare a SQL statement for execution
my $sth = $dbh->prepare( "SELECT * FROM megaliths" )
    or die "Can't prepare SQL statement: $DBI::errstr\n";
  
### Execute the statement in the database
$sth->execute
    or die "Can't execute SQL statement: $DBI::errstr\n";
  
### Retrieve the returned rows of data
my @row;
while ( @row = $sth->fetchrow_array(  ) ) {
    print "Row: @row\n";
}
  
### Disconnect from the database
$dbh->disconnect
    or warn "Error disconnecting: $DBI::errstr\n";
  

歸納各個步驟就是連結資料庫、準備SQL敘述、(代入參數)執行SQL、迴圈處理傳回資料、中斷資料庫連結。
問題是,如果需要處理十來個tables,這樣的程式碼肯定是不太好看以及不容易維護了!
尤其是,複雜一點的SQL Statement夾雜在程式碼裡面,肯定多少因而造成視覺的障礙,SQL敘述也必然會在程式碼之間重複出現!(寫程式真累人啊,有點口乾舌燥了~)

SQL::Library  模組,提供將SQL語法集中管理維護的功能,透過它,可以把所有用到的SQL放在一個(或多個)檔案中,然後在程式中以容易記憶的關鍵字來取用。使用方法如下:
## A sample library file 
[get_survey_questions] 
select question_no, question_text 
from question 
where survey_id = ? 
order by question_no 

[get_survey_info] 
select title, date_format( open_date, '%Y%m%d' ) as open_date, 
    date_format( close_date, '%Y%m%d' ) as close_date, 
    template_file 
from survey 
where survey_id = ?

使用方法

use SQL::Library; 
my $sql = new SQL::Library { lib => 'sql.lib' };
my $query = $sql->retr( 'get_survey_questions' ); 

然後再用針對$query開始prepare、execute、fetch....

這個方法把SQL敘述自程式碼中移出,減少了SQL重複的問題。

但是程式人員仍然需要了解SQL語法,以SQL的層次來思考與處理資料,這是沒有必要的細節重複,因為我們要處理的是商業資料邏輯,而不是資料庫資料邏輯,我們不想每次都要去複習資料表格之間的關聯性,那應該是別人的事。

DBIx::Class  模組是2005年父親節的時候出現的,它是ORM(Object-Relational Mapping),也就是物件-關聯對應,簡單的概念是將物件對應到關聯式資料庫,Class對應到表格,而Object對應到表格資料列,而Object的屬性便是資料列裡面的欄位。

也就是說,只要一開始正確的建立對應關係之後,就不用再透過SQL語法來處理資料庫,直接使用物件就可以了。

舉個簡單的例子來看
# 透過MyDB::Schema來建立ORM連結關係
use MyDB::Schema;

# 連接資料庫
my $schema = MyDB::Schema->connect($dbi_dsn);

# 取回Artist表格內所有資料
my @all_artists = $schema->resultset('Artist')->all;

# 取回Artist表格內,name欄位是John開頭的所有資料
my $johns_rs = $schema->resultset('Artist')->search( 
                          { name => { like => 'John%' } }
                      );
有關資料庫資料表格(如Artist)的資訊(如資料表格欄位、與其他表格之間的關聯性.... )通通集中放在MyDB::Schema裡面,任何程式需要使用的時候只要use MyDB::Schema、連接資料庫,再透過$schema來存取資料庫就可以了。

是不是簡單多了?