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 的加持下,不用一分鐘就會跑出畫面囉!


2009年11月28日 星期六

Windows 7 x64 之宅宅的漫長等待

主機 + UPS  IDE Disk , SATA DVD-RW  , SATA Disk


上上週一直瀰漫著打算砸錢買新電腦的構想,因為環境差不多許可,上週日回到宿舍前,盡管飄雨還特地去NOVA收集價目單,那時有家門市業務還跟我說週末買回去剛剛好啊,結果我回到寢室後,發現電腦出現問題,突然無法開機,那種感覺就像主機板掛掉,沒有任何的資訊,把一張張 PCI 卡拆下、把記憶體拿掉,也都一樣沒救,弄了將近一小時,正打算打電話回家報備時,播通電話那一刻,電腦竟然可以開機了。不曉得是不是冥冥之中的安排?是老機器的逆襲,還是它要我忍下心去買新電腦呢?最後,我在星期一晚上決定了項目表,並且使用原價屋的網路訂購服務,網路下單後打電話去,這一切仍以電話為主的交易模式,網路只是協助而已。


這是我第二次使用,第一次則是用消費券買螢幕。選擇用它的主因有兩個,一個是滿萬元免運費免代收費費,代收費就是用在貨到付款的服務,很方便也免掉搬運或匯款問題,第二個理由是項目比較多,可以很輕鬆選擇。在這之前我以為它是最便宜的,因為很多討論都以它來講,但我跟大學同學請教後,以及去 NOVA 要了單子,發現的確也還存在很多比它便宜的,的確,不然它要怎樣賺錢,哈,所以,以後使用上要記得盡量用一些搭配方案來取得優勢囉。


貨品也很快,大概 2 ~ 3 天就會送到,我在星期一晚上訂,請他們幫忙多測一下,畢竟有問題換貨對我比較麻煩,所以是星期三出貨,稍稍一問,他們的出貨時間分中午跟晚上五點前。以我的點是星期四早上收件。以為一切就這麼順利了嗎?並沒有,苦難才正要開始。


以下是我自己亂配的單子



  • CPU:AMD AM3 PhenomII 四核心 X4-945/3.0G/95W/45nm/L2+L3=8MB+B62

  • 主機板:技嘉MA785GPMT-UD2H/A785G+SB710/RGB+DVI+HDMI/1394+eSATA (內建顯卡)

  • 記憶體:威剛 DDR3-1600 2G x 4

  • 硬碟:日立 SATAII 500G 16M 7200RPM 三年保固

  • 燒錄器:LITE-ON iHAS324/24XDVD燒錄

  • 機殼:黑熊貓四大 + 康舒 370W /12公分

  • UPS:APC全美最大 500VA OFF-LINE 含監控+防雷擊突波 BE500TW


但打電話過去確認時,有些項目已經沒了,又改成



  • 記憶體:黑金剛 DDR3-1600 2G x 4

  • 燒錄器:華碩 DRW-22B2ST/22XSATA


主要是記憶體沒有搭配到方案,整整貴了 780 元!!那時對方也問我要不要改用 DDR3-1333 的,我想了會還是用 DDR3-1600 ,實在是價錢沒差多少。至於為啥不用 DDR2 記憶體,在這之前是有想過,但看到那時 DDR2-800 的價錢比 DDR3-1600 特價方案還貴,就選擇用 DDR3 了。當下回想起來還有一點懊悔。但今天我仔細看了一下主機板,因為要用 AMD3 且內建顯卡的,似乎也沒多少可以選擇。不過,DDR2-800 好像有稍微降價了!


原價屋,還有一個特色就是出貨前若價錢變動可以跟他們確認價錢喔!他們說假設星期三出貨,那到星期三晚上都還可以打電話去確認價錢,當然這些都要買家自己去做。所以,後來兩天我都一直看價目,但最後只看到 LITE-ON iHAS324/24XDVD燒錄 又有貨了,恰好又特價,所以爭取換貨但這一切只爭取得便宜 50 元。


但這一切仍只是序章。


星期四拿到貨時,一開機主機板卻不斷地叫!查了說明書是說顯示卡沒插好,可是這是內建顯卡啊!黔驢技窮,把 BIOS 電池拔掉還是一樣。後來上網查一查,有人說記憶體沒插好也可能,慶幸地重插記憶體就搞定了,但我發現只使用 DDR-1333 在運行,趕緊上網查一下,原來,那些板子上頭說支援到 DDR3-1800 都是要超頻的!看來我真的沒做好功課啊。但因為我不喜歡折磨硬體,最後都選擇用 DDR3-1333 模式,當初若我改買 DDR3-1333 大概可再便宜 400 元吧!


USB 轉接 PS/2


真正的痛苦開始了!我發現主機板只有一個 PS/2 插孔!外加上我是先安裝 Ubuntu 9.10 i386 版,只好去猜怎樣切換到選單,以前在 Windows XP 還可以用 Tab 切換,在 Ubuntu 我就不熟了,但有印象一些快速鍵是使用 Ctrl + Alt 來搭配,以及 Alt+F2 這個快速鍵我還記得,它就是跟 Windows 的 視窗鍵 + R 的道理一樣。透過這些我終於把舊硬碟中的東西燒錄出來!當然在安裝舊硬體又有一番折騰,因為 Power 接線過短,我又橋內部搞了一陣子。


先後嘗試了 Vista Business x64 與 Windows 7 x64 的版本,前者讓我買的便宜 Webcam 不能運作,另外 Skype 4.1 版也有問題,打開視窗打字就會卡住!後來發現 Skype 3.8 版就能正常囉!接著換 Windows 7 x64 版,發現 Webcam 已經可以正常運作,但 Skype 4.1 還是會有卡住的問題,我換到 Skype 3.8 仍是一樣並且有不支援的問題,幸運的官方網站還有 3.5 版,用了 Skype 3.5 版就正常,但需要把 IE 上的  plugin 關掉!(20091129:使用上不知怎樣,可能是跟對方都是private ip,所以一直看不到對方,最後我又換回Skype最新版,也可能因為更新過 Windows 7 了,目前暫時無事)


沒想到這一路上跌跌撞撞啊!我想,老天一定是派它來磨練我的耐心的。


最後我決定使用 Windows 7 x64 版囉!這樣我也可以安心地享用 8 GB 的記憶體,而買了 UPS 就是有在想要不要架站等,晚點再來試試 VMWare Server 吧!附上一些照片紀念一下。