2011年8月23日 星期二

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";