2009年12月8日 星期二

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) 影片 - 將連續的照片串成影片


[PHP] Motion JPEG - MJPEG/MJPG HTTP streaming

當你有一串連續的 JPEG 圖片時,想串成影片該怎麼辦呢?


因為工作上的需要,稍稍研究一下,從 Motion JPEG - Wikipedia, the free encyclopedia 可以看到關於 M-JPEG over HTTP 的簡介,於是我又試了一下。


PHP 搭配 Apache Web Server 範例:


@img_show.php
<?php
$boundary = 'ca3cdghdujhihal3';
$delay = 1;

header( "Content-Type: multipart/x-mixed-replace; boundary=\"$boundary\"\r\n" );

echo "--$boundary\n" ;

for( $i=1 ; $i<= 10 ; $i++ )
{
        echo 'Content-Type: image/jpeg'."\n\n";

        echo file_get_contents( "/path/images/$i.jpg" );

        echo "\n--$boundary\n" ;

        flush();
        sleep( $delay );
}
?>



此例將會依序呈現出 /path/images/1.jpg ~ /path/images/10.jpg 這些圖片囉,只是很可惜的,IE瀏覽器尚不支援,我在 IE8 也還是不會動。


可以直接用 Firefox 去瀏覽 http://host/path/img_show.php 看到成果,或是用 <img src="http://host/path/img_show.php" /> ,只是 HTML 部份我在 Ubuntun 9.04 + Firefox Shiretoko 3.5.5 此 img tag 並不會看到效果,但在 Windows XP with SP3 + Firefox 3.5.5 倒是正常。


另外,可以再參考 Cambozola Streaming Image Viewer ,這是一個 Java 版 Server Socket 範例,其 source code 中,可以在 src/com/charliemouse/cambozola/server 看到 MJPEG Streaming Server 的範例程式,只需要將該目錄下的 testImages 和 TestServer.java 複製出來,前者是照片的來源,後者是程式,接著把 TestServer.java 最上面的 package 定義清掉,再拿掉 AppID 的部份,基上就變成很簡單的 java code 啦,編譯完執行它,預設在 port 2020  開啟此服務,接著一樣用 http://localhost:2020/ 就會看到動畫效果囉。


2009年11月29日 星期日

[Windows] 安裝 64 位元環境的 Eclipse , JDK 和 Android SDK @ Windows 7 64-Bit


Image From : http://www.android.com/media/


更新 @ 2011-05-28 


必備軟體:



安裝順序:


一、點選 jdk-6u25-windows-x64.exe 依預設安裝即可


二、點選 installer_r11-windows.exe 進行安裝


not found jdk


如果一開始沒有找到 Java 相關環境,這時候只要先按 Back 後再按 Next 進行即可,預設安裝位置 C:\Program Files (x86)\Android\android-sdk


android sdk


之後接續啟動 Android SDK Manager ,開始下載相關 SDK ,若懶得管就 Accept All 就好,這個動作會花一陣子,因為下載的 Android SDK 高達 2GB (此刻是2011-05-28)


三、解壓縮 eclipse-SDK-3.6.2-win32-x86_64.zip 擺置適當位置,如 C:\ 等


接著就可以在 C:\eclipse 點選 eclipse.exe 啟動軟體(可建立捷徑擺到桌面使用),並且先進行軟體的更新:


[Help] -> [Check for Updates]


eclipse check update


新增 Android Development Tools (ADT) 軟體:


[Help] -> [Install New Software] ->[Add],在 Name 隨意輸入而 Location 輸入 https://dl-ssl.google.com/android/eclipse/ 後,全選 Developer Tools 選 Next 進行,並選擇 I accept the terms of the license agreements ,即可進行安裝 ADT


ADT


ADT2


安裝完 ADT 後就會重新啟動 Eclipse,啟動完後設定 Android SDK 位置:


[Window] -> [Preferences]-> [Android],將 SDK Location 填寫好(預設C:\Program Files (x86)\Android\android-sdk) 按下 Apply 就可以看到讀取到的資訊


android sdk list




以下是 2009-11-29 的筆記:


既然在使用 Windows 7 x64 ,就來安裝一下 64-bit 的環境吧!記得之前在 AMD 4000+ with 2G
DDR2-800 ,啟動模擬器也要3分鐘吧!我還曾試著要在 AMD Athlon XP 2000+ with 768MB DDR-400
安裝,結果跑了30分鐘以上,根本開不起模擬器!


之前寫了一篇 Android & Eclipse 開發環境 - 第一次安裝筆記 ,現在看起來不少步驟過期了,不確定是不是 Eclipse or Android SDK 的步驟更新,就順手記錄一下設定流程吧。



首先就點選 JDK 安裝完後,將 eclipse-SDK-3.5.1-win32-x86_64.zip 和 android-sdk_r3-windows.zip 依序解壓縮到 C:\ ,分別產生 C:\eclipse 和 C:\android-sdk-windows 。


安裝完 JDK 後,似乎沒設定環境變數在 cmd mode 下就能打出 Java 了耶,若有問題在設定一下 PATH 吧!Eclipse
下載 Plugin 位置變成 [Help] -> [Install New Software] ,可參考 Android SDK
官方網站的安裝流程 Installing the ADT Plugin
,因為我是用 Eclipse 3.5 (Galileo)
所以看右邊的流程,下載位置:https://dl-ssl.google.com/android/eclipse/ ,最後在設定一下
Android SDK Location : [Window] -> [Preferences] ->[Android] 中的
SDK Location ,設定成 C:\android-sdk-windows 吧!


緊接著還得產生 Android Virtural Device 才能跑 Hello World 啊,但使用 cmd mode 並切換到 C:\android-sdk-windows\tools 執行 android create avd --target 2 --name my_avd 都仍會有錯,也才發現 C:\android-sdk-windows\platforms 都是空的,然後我又參考 C:\android-sdk-windows\SDK Readme.txt ,想試試 C:\android-sdk-windows\tools\android.bat update sdk 都會蹦出以下訊息:



  • Starting Android SDK and AVD Manager
    SWT folder 'lib\x86_64' does not exist.
    Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.


看了一些文章,說只要用 Administrator 身分去啟動 cmd mode 就可以搞定,但我卻遲遲搞不定啊,最後想到該不會 Eclipse 早已有所整合?就逛逛 Eclipse 後,發現 [Windows]->[Android SDK and AVD Manager] ,給它先跑一下 [Installed Packages]->[Update All] 全部安裝完,除了 C:\android-sdk-windows\platforms 蹦出資料,也可以用 C:\android-sdk-windows\tools 執行 android create avd --target 2 --name my_avd 啦!當然,都看到這個介面了,當然更可以不用再從 cmd mode 去操作囉!


helloandroid


接著試試 Hello World



  • [File]->[New]->[Project]->[Android]->[Android Project]

    • Project name: HelloAndroid

    • Application name: Hello, Android

    • Package name: com.example.helloandroid

    • Create Activity: HelloAndroid

    • Min SDK Version: 2



  • Finish 完,接著 Eclipse 左邊就出現 HelloAndroid 東西了,點選一下 HelloAndroid->src->com.example.helloandroid->HelloAndroid.java ,並且將 code 更新

    • package com.android.helloandroid;

      import android.app.Activity;
      import android.os.Bundle;
      import android.widget.TextView;

      public class HelloAndroid extends Activity {
         /** Called when the activity is first created. */
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             TextView tv = new TextView(this);
             tv.setText("Hello, Android");
             setContentView(tv);
         }
      }



  • 之後點選 [Run]->[Run] 並選擇 Android Application 啦!在新電腦 AMD x4 945 的加持下,不用一分鐘就會跑出畫面囉!