2011年8月23日 星期二

效率 x 意願 x 天才

請記得:

效率=(有效工作量/時間)*意願
意願 ::= {0 | 1}

人在意願為零的時候,喜歡用理由來阻止有效工作量的產出,反之,當意願不為零的時候,會為了有效工作量而找方法。

我國小老師有說過,國中以後的學習跟學校、老師無關,這讓我學會比較獨立的思考學習這件事情,事實上也是,我高職混樂隊也沒讀幾天書,二、三年級公假佔了 半個學期,在樂隊當幹部,副社長,跟著其他人拿著請假單去教官室蓋章,後來教官乾脆拿印章叫我們自己蓋,我們已經翹到老師有點火了,我在這個期間很認真的 把樂器學好,這是唯一的收穫,因為我想要,所以我認真做,結果就是除了打擊樂器之外,管樂部份能夠演奏的有九成,除了西洋樂器之外,國樂的笛與蕭都會演 奏,想當初吹嘴搭在我唇上,光吹出聲音也搞了快一個月,長笛也差不多,單簧片樂器也是,雙簧片類的樂器也是,會與不會是熟練的問題。

我智商也沒真的比較高,智力測驗維持在普通人的階段,甚至還比我專科同學低,但,結果沒比較差,因為我想要寫程式,所以我一直在這方面下功夫,我同學跑去 當CE幫嘉利修理刷卡機,我跑去當RD寫程式,認真的練習,公司也沒教我什麼,就找一堆工作讓我搞,找一堆麻煩讓我解,搞專案讓我寫規格,放一堆火讓我 救,在離開公司之前在公司被稱為C語言之神,金融風暴來襲,我同學被嘉利裁員,女朋友跑了,他重新燃起想要學寫程式這件事情,問我,如何進行?

我就開了一些書單,叫他去找類似的書本看,領政府失業救濟金期間,我叫他去上Microchip的課程,他問我可不可以去職訓中心上課,OK,上完了一堆 課程之後,我叫他隨便找一家小公司當RD寫軔體,不問薪水的做幾個月,再換,到一家做電梯控制的公司上班,再換,做RFID讀卡機、Tag的公司寫軔體, 他的進步絕對比我快,摸索的時間比我短,對一個有意願的人來說,提點就好。

你要問我對沒意願的人怎麼辦?

我會說:「朽木不可雕也」,等意願回來再說,能怎麼辦?
拿皮鞭抽他嗎?

我國小老師影響我的另外一句話是:「天助自助者」,我補習班老師有說過真話,老師每年教的內容都大同小異,能不能上好學校,是學生的問題,老師能干涉到什麼程度?
拿棍子打嗎?
搞清楚,體罰是會被告的!

凡事都有一定的先決條件,滿足這些條件,事情自然就會進行,正如船到橋頭自然直一樣,這是自然的現象,每個人的程度或許有差別,但,這些差別都代表之前的 投入程度的差異,對於一個學過一種樂器的人,另一種樂器的學習或許可以沿用以前的經驗衍生,比如說黑管與薩克斯風,遇到長笛,發音方法差異很大,但按鍵指 法卻類似,投資時間下去練習,有結果並不意外,一切都是自然的結果,我學長最後搞到連爵士鼓、電子琴、吉他BASS都會,有本書的作者30歲才開始練習鋼 琴、體操,他本業是程式設計師勒。

反過來說想要有結果,去分析構成的要素,滿足他,要素到齊了,等老天爺放行,結果自然就會出來,正如盡人事,聽天命,如果人事不盡,天命又能怎樣呢?

人阿~有意願是替困難找方法,沒意願是替目標找麻煩。

我補習班的老師萬老最恨別人說他是天才,他跳級入學,年紀輕輕的就從大學畢業,一路上研究所、博士很快的完成,他認為,說他天才是汙辱他的努力,天才的能力是天給的,他的成就是他努力掙來的,用天才來隨便搪塞這成就是種侮辱。

正如誇讚小孩漂亮,被讚美的是他的父母與老天幫忙,而讚美小孩懂事、乖巧、努力讀書成績好是對小孩的努力鼓勵一樣,請不要搞錯了。

練習可以帶來品質的提升與時間的縮短,直接就影響效率,但是,意願卻是會直接決定要不要練習這件事情,決定要、不要做是各自的事情,反正個人造業個人擔, 放棄遠慮而狂解近憂也都是自找的,成功像沙漏,一點一滴的墊高,雖然社會上一堆靠爸團體,但是,請記得他長輩也是累積過來的,只是付出的投資在現在收割而 已。

ESL 廣播抓下來了~XD

上次我說過,我對ESL (English as a Second Language)網路廣播節目的排版方式不滿,所以就稍微幫他整理一下,下一個階段要把翻譯搞上去對照,好讓我一般用滑步機跑步,正好一邊看著文字及聽廣播,目前是第一階段完成,節目已經排好存到我SD卡上,mp3的部份則是靠HTML5直接播放網址。



2011年8月16日 星期二

上市公司基本資料的抓取程式

今天晚上完成上市公司基本資料的抓取,底下是螢幕截圖,把這些公司的基本資料存到資料庫內等待以後的處裡,也算個練習而已吧,目標是自動把財報抓過來算,然後產生一個統計、警報的系統出來,很晚了~明天早上再檢查資料庫等收成~Ya。


生命應該用在努力工作上嗎?

從前有座雙峰山,雙峰上各有間廟,廟中都有個和尚,要喝水兩個和尚都要下山取水。
左峰上的和尚左戒,閒暇時開始鑿井,右峰和尚右戒笑左戒吃飽太閒在鑿井,不過就是一小段路,怎麼跟鑿井相比呢?
三年後左戒在廟旁取水,省下的時間參佛、整理寺院,右戒還是要下山取水,忙碌的喊忙,所以是左戒笨嗎?

小A非常努力的把從資料庫拿下來的檔案,經過數道工法做成了一份圖表精美的Excel檔,每週燒掉一天多的時間來完成這份報告,他常常忙得不可開交,非常忙碌、勤勞的工作。

3年前小A也遇過類似的事情,就是ioMeter的報告,每次遇到要提測試報告的時候,就非常忙碌的把文件中的欄位搬來搬去、剪剪貼貼的搞成一份報告,當時我就幫忙寫一個自動報告產生程式並且附上原始碼,提醒要改自己改,有問題可以問,我希望小A能夠學會自己寫這類的報告程式,3年過去了,報告不一樣了,但症狀還是一樣,都是為了省鑿井的時間,卻願意花一輩子時間去山下提水,然後再來喊工作多到做不完,沒時間陪家人。

今天我稍稍寫了個程式讓事情加速,從原本每週一天多的時間消耗,變成每週只需三分鐘以下(還可以更快,列出目錄下的檔案全做,而不是一個一個的輸入),並且附上了原始碼,3年之後有可能進步嗎?





功能就是統計審查狀態,做出圖表,並且按照廠商排序,我是輸出網頁,圖表是HTML5+Javascript做出來的,圓餅圖是套網路現成的Source搞出來的,所以也沒做多少東西,頂多就類似一個頁面的CGI。

人工整理則需要先計算總數,分別計算各審查狀態的數量,在Excel上做出表格,然後是圖表,一份報告當然是還好,按照BOM表的數量每一個成品料都要玩一次呢?
然後是資料筆數從十幾個,進步到數十個,到現在的數百個零件呢?
所以一開始先是燒掉幾小時,再來是一早,然後一天,現在一天半,以後是兩天、三天、四天、還是五天?
其它事情什麼時候做?

2011年8月14日 星期日

資料收集者的福音~網頁表格殺手,又是Perl發功(股票)

你是不是對一些公司基本面感到興趣?
你是不是很懶的去抄那一堆資料?
你還在用手算?

各位認識小弟的股友們有福了,信我,沒辦法給你上天堂,也沒辦法給永生,但是,讓你多空出點時間陪家人這小事還是做得到,底下的是Perl寫的webTableKiller,這網頁表格殺手主要功能就是把網頁上面的資料抓下來,讓後面串接的Script可以快速的取得網頁的資料,我是拿Yahoo的股市當祭品做出來。

Perl的特色是垮平台都可以使用,也可以找Perl2Exe轉成Windows執行檔(不建議)。

$./webTableKiller <網址> <取出目標欄位的.CSV檔案>











#!/usr/bin/perl
use LWP;
use HTML::TreeBuilder;
use Text::Iconv;

my $url="http://tw.stock.yahoo.com/d/s/company_3115.html"; 

if(defined $ARGV[0]){
  if($ARGV[0] =~ /^http/){
    $url=$ARGV[0];
  }
}

my $showAll=0;
my @getList;
my $getLists;

if(defined $ARGV[1]){
  if($ARGV[1] =~ /\.csv$/i){
    if(open(FH, "<$ARGV[1]")){
      @getList=;
      close FH;
    }
  }
}

foreach (@getList){
   $getLists.=$_;
}

my $ua=LWP::UserAgent->new;
my $res=$ua->get($url);
die "Can't get $url ", $res->status_line unless $res->is_success;
my $html=$res->content;

$converter = Text::Iconv->new("big5", "utf8");
$html = $converter->convert("$html");
#print "$html\r\n";

my $root=HTML::TreeBuilder->new_from_content($html);

my $layer=0;

&parserLookDown($root,$layer);

sub isOnList{
  my $currentPos=shift;
  my $count=0;

  foreach(@getList){
    if($_ =~ /$currentPos/){
      #print "$currentPos/\t$_\n";
      $count++;
    }
  }

  return $count;
}

sub parserLookDown{
  my $root=shift;
  my $layer=shift;
  $layer++;
  my @tables=$root->look_down(_tag=>'table');
  for my $i(0 .. @tables-1){
    my $tmp=$tables[$i]->as_trimmed_text;
    my @trs=$tables[$i]->look_down(_tag=>'tr');
    for my $j(0 .. @trs-1){
      my @tds=$trs[$j]->look_down(_tag=>'td');
      for my $k(0 .. @tds-1){
 if($tds[$k]->as_HTML =~ /table/){
   &parserLookDown($tds[$k],$layer);
 }
 my $tmp=$tds[$k]->as_trimmed_text;
 $_=~s/\ //g;
 if(@getList > 0){
   my $currentPos="$layer,$i,$j,$k";
   if(&isOnList($currentPos) > 0){
    print "$tmp,";
   }
 }else{
   print "($layer,$i,$j,$k)$tmp,";
 }
      }
      if(@getList <= 0){
 print "\r\n";
      }
    }
  }
}

$root->delete;

2011年8月11日 星期四

軔體版本管理的逆襲

今天被問到我軔體版本發行管理的問題,這問題存在許久,之前因為手邊工作滿檔,就不理會它,過了這麼久還是發作,所以今天花一天寫一個網頁程式來管理軔體的版本。

目標是讓使用者在檔案伺服器上建立資料夾、貼上檔案,網頁就跟的更新,不用寫程式,寫網頁,一次搞定,懶惰的使用案例。

 1. 為了以後維護方便,所以乾脆在Linux 的 file server上加上Web Server,但,基於辦公室中其他使用者在用Windows,只好開samba讓那些人存取,而中心思想則是利用路徑、檔名去做出一個相對應的表格頁面,好讓其他人可以查表、看照片(光看料號誰看的出來阿~),搞清楚是哪個硬體上的軔體,順便看一下目前到底有多少版本,發行了哪些版本。

2. 以XML為介面,伺服器上的CGI程式不管顯示的部份,也就是說CGI只會吐出XML的資料而已,可保留以後擴充及修改的彈性,畫面組成靠客端瀏覽器運作,可以節省主機的運算時間,好讓客戶端給我分攤一些運算,另外一方面,主要是我之前玩一堆Javascript跟JQuery,所以這方法比較熟練一點~XD,而且這方法目前還是主流。

3.明天就要寫SOP文件跟把我寫的一些軔體檔案放上去,算收工了吧 ~ XD

PS. 用PERL+Javascript+HTML真的快的跟鬼一樣,一天就收工了~~XD

2011年8月3日 星期三

Perl LWP 股票資料收集

這是一支跑去Yahoo股市查列出股票的股利政策的程式,自動計算、分析是最後的結果。

# 抓取網頁中的 link
use LWP;
use HTML::TreeBuilder;
use Text::Iconv;

# 取得命令列中的網頁位址,放入 $url 中
#my $url=shift || die "您沒有輸入 url 網址!\n";
my $stock=2357;
if(defined $ARGV[0]){
 $stock=$ARGV[0];
}
my $url="http://tw.stock.yahoo.com/d/s/dividend_".$stock.".html"; 

my $ua=LWP::UserAgent->new;
my $res=$ua->get($url);
die "Can't get $url ", $res->status_line unless $res->is_success;
my $html=$res->content;

$converter = Text::Iconv->new("big5", "utf8");
$html = $converter->convert("$html");
#print "$html\r\n";

my $root=HTML::TreeBuilder->new_from_content($html);

my @names=$root->look_down(_tag=>'TITLE');

foreach my $line(@names){
 my $name=$line->as_trimmed_text;
 my @items=split(/\-/,$name);
 print $items[0],",",$items[1],",\r\n";
}

my @links=$root->look_down(
   _tag=>'table',
);
for($j=0; $j<=$#links; $j++){
 if($j == 9){
  #print "\t$j=", $links[$j]->attr('href'),' ', $links[$j]->as_trimmed_text, "\r\n";
  my @items=$links[$j]->look_down(_tag=>'tr');
  #print "Item $j\r\n";
  foreach my $item(@items){
   my @datas=$item->look_down(_tag=>'td');
   foreach my $data(@datas){
    my $tmp=$data->as_trimmed_text;
    $tmp =~ s/\ //ge;
    $tmp =~ s/\ //ge;
    print $tmp,",";
   }
   print "\r\n";
   #print "$j\t", $item->as_trimmed_text,"\r\n";
  }
  #print "$j=", $links[$j]->as_trimmed_text, "\r\n";
 }
}
$root->delete;

這個程式是先跑去抓某個網頁的股票代碼列表(有點舊)然後再去呼叫上面那一支程式把歷史股利政策全抓下來。

# 抓取網頁中的 link
use LWP;
use HTML::TreeBuilder;
use Text::Iconv;

# 取得命令列中的網頁位址,放入 $url 中
#my $url=shift || die "您沒有輸入 url 網址!\n";

my $url="http://www.tej.com.tw/webtej/doc/uid.htm"; 

my $ua=LWP::UserAgent->new;
my $res=$ua->get($url);
die "Can't get $url ", $res->status_line unless $res->is_success;
my $html=$res->content;

$converter = Text::Iconv->new("big5", "utf8");
$html = $converter->convert("$html");
#print "$html\r\n";

my $root=HTML::TreeBuilder->new_from_content($html);

my @links=$root->look_down(
   _tag=>'td'
);
#my @links=$root->query('tr');

for($j=0; $j<=$#links; $j++){
 my $tmp=$links[$j]->as_trimmed_text;
 #my $tmp=$links[$j]->attr('str');
 $tmp=~s/\D//ge;
 if(($tmp < 9999)&&($tmp ne "")){
  #print $tmp, "\r\n";
  my $var=`perl yahooStock01.pl $tmp`;
  print "$var\n";
 }
}
$root->delete;

2011年8月2日 星期二

perl讀取Win32剪貼簿

這是剪貼簿讀取的範例程式:

#!/usr/bin/perl

use Win32::Clipboard;

$clip = Win32::Clipboard->new();

$val = $clip->Get();

print "Clipboard: [ $val ]\n";