2009年12月9日 星期三

ASUS Eee PC 1000H WinXP 版 - 關閉觸控面板

最近常用 Eee PC 打打字,發現很容易不小心按到觸控面板,結果就打字的東西就會亂飄,然而上次仔細一看卻沒發現任何開關它的熱鍵,就不了了之。


剛剛又不小心弄到,就上網找一下資料,發現有關閉的方式,但我不確定原先舊有的是否就有,因為我已經是先更新了觸控面板的驅動程式才去做設定。所以,可以先試著去找看看,若沒有下面所提到的設定再去安裝新的觸控面板驅動程式吧!


首先,上 ASUS 官網下載驅動軟體 ASUS技術支援 -> [檔案下載] -> [Eee Family] -> [Eee PC] -> [Eee PC 1000H XP] 按下搜尋後,再選 WinXP 系統。


接著看 [觸控板驅動程式] ->  [觸控板驅動程式 V7.0.4.3版] 上頭恰好有列出



  1. 新增支援多點觸控功能

  2. 新增支援防誤觸功能


所以下載安裝完後,可以從視窗右下角常駐程式中去點選[觸控面板右鍵]->[Smart-Pad內容]->[Elan Smart-Pad] 頁面,就有"停止裝置" 的選項,當然這樣關閉觸控面板是可以的,但倘若哪一天忘了帶滑鼠,一開機連去點 Smart-Pad 設定的能力都沒有,那豈不是更慘?好像沒有組合鍵可以關閉打開它,但至少在 Smart-Pad 設定頁面上,有一個選項”當外部USB滑鼠插入時停用",可以恰恰好用一下囉。如果常駐程式找不到觸控面板的設定,那就從[開始]->[設定]->[控制台]->[滑鼠]->[Elan Smart-Pad] 也可以設定。


2009年12月8日 星期二

快閃台北行

高鐵車票


這張是第二次搭高鐵留下來的,第一張其實就是從新竹到台北,只是被收走報帳。回程這張打 65 折,只要 185 元,去程則是 85 折,要 245 元。這個價錢其實還能接受,因為台鐵新竹到台北,自強要 180 元,一小時車程,區間車 116 元花一小時二十分,而高鐵只要30分鐘左右,在加上從宿舍到竹北高鐵站其實比到新竹火車站還近。


由於是第一次搭車,搭車前我還特地去逛一下知識+,擔心自己太門外漢,事實證明,我連插卡片都還真的插反了!一開始我找到的文章都是 2007 年的,還有說要把票根留下來得在購票時跟售票員說,或是自動購票時,有選項可以選,但我用自動販賣買票也都沒看到選項,最後問服務人員才知道現在都自動留票根啦,難怪當時找到的文章只到 2007 年。


記得大五那年,同寢學弟一聽到高鐵開始營運,就去搭乘一次,過了兩年後我也終於搭過高鐵,扣除乘車時間外,跟台鐵差不了多少。要說不一樣的話,至少看到高鐵的服務員拖著行李時,會覺得像空姐,但台鐵的服務員就只會覺得像清潔員吧。哈,當然不只這些,高鐵站真的華麗很多,而且軌道架在空中,等車時可以看看車站外的夜景,真的不錯。另外,搭高鐵時,逢下班時間,感覺外國人比較多,我搭台鐵那麼多次,都沒看到幾次外國人,大概外國人都真的只搭高鐵吧。


或許該找找機會也帶家人去搭乘一次吧!


Amazon EC2 使用教學 - 以 Windows Server 2003 與 RDP 為例

Amazon Elastic Compute Cloud 簡稱 Amazon EC2 或 EC2 ,它是眾多雲端運算平台之一。至於何時會需要用到雲端計算呢?我覺得可以思考一些情境,例如突然需要一堆電腦來幫計算研究數據,或是想要開發網站服務但手邊的機器不足,然後又非常急迫,這時候就可以考慮使用這類平台,可以很輕鬆快速的得到一群電腦!當然,手邊沒幾個銅板是不行的(還有信用卡)!


雲端運算是當下很紅的名詞,最近被要求一下要熟悉 EC2 ,所以就來強迫自己寫一篇使用教學,在 Google 上使用 "EC 教學" 關鍵字,其實已經可以找到不錯的文章: Amazon EC2 簡易操作筆記 (使用 EC2 Console)  與 Amazon EC2 使用操作筆記 (使用 Elasticfox) ,另外則是官方的介紹 Amazon Elastic Compute Cloud - Getting Started Guide (API Version 2009-08-15)


網站位置:http://aws.amazon.com/ec2/ ,有興趣的可以再多逛逛 Amazon Elastic Compute Cloud - Wikipedia, the free encyclopedia ,這是我從同事身上學到的,凡事要留意一下歷史背景。EC2 在 2006 年 08 月開啟,在 2008 年 10 月 23 日後,已提供完整的架構與服務。


若以一個初學者,可能跟我一樣連 Amazon 帳號都沒 :P 所以,先來申請一下帳號吧!請透過網站上的 Create an AWS Account 建立帳號(AWS:Amazon Web Services) ,強烈建議,一切動作都從官網開始,以免不小心點到釣魚網站。



  1. 點選 Create an AWS Account 進入登入畫面

    • My e-mail address is: your_email

    • 勾選 I am a new user.

    • 點選 Sign in using our secure server



  2. 接著輸入基本帳號資訊

    • My name is: your_name

    • My e-mail address is: your_email

    • Type it again: your_email

    • Enter a new password: your_password

    • Type it again: your_password

    • 點選 Create account



  3. 接著填寫個人資訊

    • Address Line

    • City

    • State, Province or Region

    • ZIP or Postal Code

    • Country

    • Phone number

    • 接著點選下面的同意跟認證碼後就可以完成申請帳號囉!



  4. 接著可以透過上個頁面顯示的 Amazon Elastic Compute Cloud 連回去。並且點選 Sign Up For Amzaon EC2 ,並且下頭要你輸入信用卡資訊。由於我沒信用卡 XD 所以後面就不 demo 啦。此部份也可以從 Your Account -> Payment Method 進行設定。


接著,Amazon Elastic Compute Cloud 頁面,可以在右上角 Your Account 選單中看到不少項目:



  • Account Activity

  • Usage Reports

  • Security Credentials

  • Personal Information

  • Payment Method

  • AWS Management Console

  • DevPay Activity


其中比較特別的是 Security Credentials 和 AWS Management Console 。前者用意就像帳號密碼的認證管理,可分為



  • AWS Access Key Identifiers

    • make secure REST or Query protocol requests to any AWS service API



  • X.509 Certificates

    • make secure SOAP protocol requests to AWS service APIs



  • Key Pairs

    •  for Amazon CloudFront and Amazon EC2





圖片來源:About AWS Security Credentials


 AWS 管理是透過 API 指令進行的,例如在本機端用 cmd mode 一個個敲出來,或是用管理介面的進行管理,這些動作要跟 AWS 進行溝通,將透過 REST 或 SOAP 等協定進行,因此,就有上述幾種方便的帳密確認方式,簡言之,就不必使用登入 Web 介面的 email / password 來管理,換個角度想,以 Security Credentials 為例,新增一組用來登入使用服務,若這組帳密不慎外流,可以快速更換,而損失能夠降低,倘若登入都用 email / password 管理,一旦帳密被得知,受到的傷害可能足以影響使用者其他網路服務的使用。另外,如果有多人要管理 EC2 的機器時,使用 Security Credentials 分給管理者,也比使用 email/password 來的好。更多細節請參考 About AWS Security Credentials


AWS Management Console @ 20091208


假設你完成信用卡的設定,那就可以點選 AWS Management Console 進入 Web 端管理介面,若是使用 Security Credentials 的人,可考慮使用 Elasticfox Firefox Extension for Amazon EC2 (Resources ->  Developer Tools -> Other Developer Tools -> Elasticfox)。在此以 Web 管理介面介紹。接著,來新增一台雲端機器吧!


在新增機器之前,需要留意管理介面左下角的兩項:Security Groups 和 Key Pairs 。前者就像設定一台機器的防火牆,例如新增一台機器,若要能夠遠端,以 Windows 來說,就要打開 3389 port ,而 Unix 則是 22 port 等,而 Security Groups 就是在做這件事,設定好後,若未來還要再新增機器時,可直接套用之前以建立好的條例。Key Pairs 部份,就像前面所提到的 Security Credentials ,只是對象轉成一台雲端機器登入的帳號密碼。


AWS Management Console - Security Groups @ 20091208


因此,在新增機器前,可以先到這兩個頁面作點事情工作,其中 Key Pairs 只要點一下 "Create Key Pair" ,輸入名稱跟敘述就可以完成,此過程會將建立的 *.pem 下載回來;Security Groups 會稍微多一點步驟,除了名字跟敘述外,還需要一項項地增加你想要開放的 port ,例如 Windows 就要試一下 RDP (Remote Desktop Protocol) ,這樣才可以遠端登入囉!


假設上頭已新增好 Key Pair : demo.pem 和 Security Groups : demo ,接著就來新增 Windows 機器啦。請點選左邊的 Instances ,這個意思就類似你要開幾台電腦的地方,另外也有一些資訊可以提供你掌控機器狀況。


AWS Management Console - Instance @ 20091208


選一台 Windows 來用用,就選 Basic Microsoft Windows Server 2003 吧!


AWS Management Console - Instance Setup @ 20091208


選好後,除了要決定開幾台機器外,最重要的是 Key Pair 和 Security Groups 的設定,此例就用剛剛新增好的 demo 系列吧!接著按下 Launch 就啟動機器啦!當然也開始收費囉!EC2 的計費是以小時為單位的,使用上要留意,也就是使用 1 分鐘跟 59 分鐘是一樣的價錢,使用上要小心啦。


AWS Management Console - Instance Setup @ 20091208


機器開起來後,接下來就是去使用它,使用 Windows 的方式最簡單就是遠端桌面了,但該主機位置在哪?登入的帳號密碼在哪?就先選好 instance 後再點 Instance Actions


AWS Management Console - Instance Menu @ 20091208


其中有一項就是 Get Windows Admin Password ,就用它來查看帳號密碼囉


AWS Management Console - Get Password @ 20091208 demo.pem


其中那欄 Private Key ,就是之前設定 Key Pairs 時下載的 demo.pem 啦,用編輯軟體打開它並且全部複製貼上到上頭的框框內,就可以按下 Decrypt Password 啦,最後就會告訴你連線的位置、登入帳號和密碼囉,只要之前的 Security Groups 的設定有打開 RDP 3389 Port ,那就可以遠端進入囉!


AWS Management Console - Get Password @ 20091208


剩下的行為,就像遠端一台電腦一樣,只是這台電腦是 EC2 上的囉!


2009年12月5日 星期六

[PHP] Official Plurk API 之 PHP - cURL 使用教學

Plurk 一陣子,官方終於將 Plurk API 弄出來囉,如此有更統一的 API 來把玩,最棒的是不必擔心用的 Unofficial Plurk API 會不會哪一天掛掉,當然並不是說官方的就不會更改 API 架構,只是換個角度想,API 的維護交給官方,讓製作 Plurk 架構的人處理,比自行摸索要來的更有效率。(...突然回想起當初去hack某家網誌發文的辛苦歷程...)


Plurk API 上有 Java 跟 Python 的範例程式,但竟然沒有我最擅長使用的 PHP 。所以,就來試試 PHP 吧!



  1. 申請 Plurk API Key

    • 幾乎大家都用 API Key 的方式管理,申請方式就只要在上述網頁 Get an API key 中,填寫 "What are you planning to make?" & "Your full name" & "Your email" ,最重要的就是 "Your email" 啦,因為 API Key 會用寄信的方信寄到指定的信箱,而其他兩個資料,我想只是一種統計吧?



  2. 由於一些動作都是要使用 HTTP 甚至 HTTPS 進行溝通,在 PHP 上滿建議使用 cURL 函數,先建一個小function吧。

    • function do_act( $target_url , $type , $data , $cookie_file = NULL )
      {
              $ch = curl_init();

              if( $type == 'GET' )    // GET
              {

                      $target_url .= http_build_query( $data );
                      curl_setopt($ch, CURLOPT_URL, $target_url );

              }
              else                    // POST
              {
                      curl_setopt( $ch , CURLOPT_URL , $target_url );
                      curl_setopt( $ch , CURLOPT_POST , true );
                      curl_setopt( $ch , CURLOPT_POSTFIELDS , http_build_query( $data ) );
              }

              if( isset( $cookie_file ) )     // cookie
              {
                      curl_setopt( $ch , CURLOPT_COOKIEFILE , $cookie_file );
                      curl_setopt( $ch , CURLOPT_COOKIEJAR , $cookie_file );
              }

              curl_setopt( $ch , CURLOPT_RETURNTRANSFER , true );
              //curl_setopt( $ch , CURLOPT_FOLLOWLOCATION , true );
              //curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER , false );

              $result = curl_exec( $ch );
              curl_close( $ch );
              return $result;
      }



  3. 連續範例動作

    • // Users/login
      print_r(
              do_act(
                      'http://www.plurk.com/API/Users/login' ,
                      'POST' ,
                      array(
                              'api_key'       => 'Your_Plurk_API_Key' ,
                              'username'      => 'Your_Account' ,
                              'password'      => 'Your_Password'
                      ) ,
                      '/tmp/plurk_cookie'
              )
      );

      echo "\n\n";

      // Timeline/getPlurks
      print_r(
              do_act(
                      'http://www.plurk.com/API/Timeline/getPlurks' ,
                      'POST' ,
                      array(
                              'api_key'       => 'Your_Plurk_API_Key' ,
                              'offset'        => '2009-6-20T21:55:34'
                      ) ,
                      '/tmp/plurk_cookie'
              )
      );

      echo "\n\n";

      // Timeline/plurkAdd
      print_r(
              do_act(
                      'http://www.plurk.com/API/Timeline/plurkAdd' ,
                      'POST' ,
                      array(
                              'api_key'       => 'Your_Plurk_API_Key' ,
                              'qualifier'     => 'likes' , // loves , likes , shares , ...
                              'content'       => '(LOL)' ,
                      ) ,
                      '/tmp/plurk_cookie'
              )
      );




至於更多的 Plurk API 請上官網看囉,用法應該很簡單,只需把上頭的 array 中的變數改一下就行啦,至於回傳資料是 JSON 格式,有需要的請自行去處理囉,上述範例可完成發一則噗浪囉,有些 API 是需要 Login 的,那就要記得先完成一次 Users/login ,將資料存在 cookie 中,才能接著去嘗試其他 API 啦。


剩下的有空再來玩。


實作範例(@2010/01/08更新)



// Users/login
print_r(
        do_act(
                'http://www.plurk.com/API/Users/login' ,
                'POST' ,
                array(
                        'api_key'       => 'cGRgp6VPBY0oNwP47iudVmVHzOlDqzIj' ,
                        'username'      => 'changyy_paper' ,
                        'password'      => 'qazwsxed'
                ) ,
                '/tmp/frank'
        )
);

echo "\n\n";

// Timeline/getPlurks
print_r(
        do_act(
                'http://www.plurk.com/API/Timeline/getPlurks' ,
                'POST' ,
                array(
                        'api_key'       => 'cGRgp6VPBY0oNwP47iudVmVHzOlDqzIj' ,
                        'offset'        => '2009-6-20T21:55:34'
                ) ,
                '/tmp/frank'
        )
);

echo "\n\n";

// Timeline/plurkAdd
print_r(
        do_act(
                'http://www.plurk.com/API/Timeline/plurkAdd' ,
                'POST' ,
                array(
                        'api_key'       => 'cGRgp6VPBY0oNwP47iudVmVHzOlDqzIj' ,
                        'qualifier'     => 'likes' , // loves , likes , shares , ...
                        'content'       => '(LOL)' ,
                ) ,
                '/tmp/frank'
        )
);


2009年12月1日 星期二

[Java] 將連續的 Images (JPEG) 轉成 AVI/MOV

花了非常多的時間看資料,結果成效不彰啊!主要是在找 Java 版的程式庫,但偶爾也會看到幾眼 C 語言版本,兩者交互測試。我想做的事有兩件,第一件事是將連續的 Jpeg 串成影片,第二件事,就是將兩個影片再合併成一個影片,主要用在一些演算法上。


以下是我參考的相關討論,其中 Java Media Framework 中,有很完整的範例程式 JMF 2.1.1 Solutions ,它可以將 jpeg 弄成 mov 影片,並且又提供 merge 的範例,但無論我怎樣試,都沒辦法把兩個 mov 再串成一個 mov ,儘管程式在編譯或執行上都沒有顯示任何問題(除了範例程式使用 Vector 沒有指定 type),但合併的結果卻不是正常的,真讓我十分灰心。





最後,關於 Jpeg 製成 AVI 的部分,我使用 Writing AVI videos using pure Java 這篇提到的 AVIDemo.jar 程式庫,寫得滿乾淨又簡單!


import ch.randelshofer.media.avi.AVIOutputStream;
import java.io.*;
import java.awt.image.BufferedImage ;
import javax.imageio.ImageIO;

class test
{
        public static void main( String[] args ) throws Exception
        {
                if( args.length < 2 )
                {
                        System.out.println( "Usage> test file_out 1.jpg" );
                        System.exit( -1 );
                }
                AVIOutputStream out = null;
                out = new AVIOutputStream( new File( args[0] ) , AVIOutputStream.VideoFormat.JPG );
                out.setVideoCompressionQuality( 1f );
                out.setTimeScale(1);
                out.setFrameRate(1);

                for( int i=1 ; i <args.length ; ++i )
                {
                        out.writeFrame( ImageIO.read(new File( args[i] ) ) );
                }
                out.close();
        }
}


如此一來,就能夠用 java test out.avi 1.jpg 2.jpg 3.jpg 來產生影片啦!


關於 Merge 的部分,暫時沒有 Java 版的成果,以下是相關的參考資料,但我尚未測試成功。



關於將兩個影片串在一起,其實早就有範例可用啦!



看來我的英文真的有待加強!隔行如隔山!下錯關鍵字,成果差很大啦,用上述的範例程式就可以成功把我作的影片合併再一起囉!


如果是 C 的版本,那有 Transcode 可以用喔,裡頭有一支 tool 叫 avimerge ,它可以很成功的將我用上述 Java 程式產生影片合併串在一起。最後,若純粹只是想把 jpeg 串成影片,或將影片再合併起來,滿推薦使用 mencoderTranscode - avimerge ,前者有需要可以再參考這篇 製作 Motion JPEG (Mjpeg) 影片 - 將連續的照片串成影片