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 吧!附上一些照片紀念一下。


2009年11月20日 星期五

[Linux] Eclipse & Subclipse Plugin (SVN Client) - Change/Clear SVN User/Password @ Ubuntu 9.10

在 Ubuntun 9.10 i386 Desktop 環境,安裝 Eclipse 3.5.1 with Sublcipse 1.0.0 版。


製作一份共用的 VMWare Image 檔互傳使用,並使用 Eclipse 與 Svn 管理案子,因此碰到如何移除 SVN 所紀錄的 User & Password 問題,找了很久並未發現 Eclipse 或 Subclipse 介面上有無去除密碼的方式,最後選擇直接砍掉儲存密碼的檔案,如此一來,把 VMWare Image 傳給其他人時,第一次使用就會詢問帳號密碼,以此讓使用者以自己的帳號進行專案的管理。


Subclipse 儲存密碼的資訊:



  • 檔名:.keyring

  • 位置:$HOME/.eclipse/org.eclipse.platform_3.5.0_155965261/configuration/org.eclipse.core.runtime/.keyring

  • 動作:# rm $HOME/.eclipse/org.eclipse.platform_3.5.0_155965261/configuration/org.eclipse.core.runtime/.keyring
     (記得先備份,以免出事)


另外,如果有用到 Subversion 時,可能也會有一樣的問題,這時也可以移除紀錄帳密的檔案來達到一樣效果:



  • 目錄:auth

  • 位置:$HOME/.subversion/auth

  • 動作:# rm -r $HOME/.subversion/auth (記得先備份,以免出事)


參考資料



[Linux] Update Manager : An error occurred during the signature verification (Hash Sum mismatch) @ Ubuntu 9.10

前陣子安裝 Ubuntu 9.10 i386 Desktop ,印象中當時作系統更新時還算正常,但之後改過 /etc/hostname ,也不知何時開始,更新作業系統就無法成功,出現的訊息大多是 Hash Sum mismatch ,後來試了這篇 [ubuntu] Update Manager Problem... Invalid signature? - Page 2 - Ubuntu Forums ,看到許多人說 Aearenda 提到的更新 /etc/hostname 與 /etc/hosts 的修正,就可以更新成功囉!可惜的,我仍沒有解決這個問題,或採用下面指令也是如此。



  • # sudo apt-get update -o Acquire::http::No-Cache=True


但我發現,我有一台主機 Ubuntu 9.04 的,使用上述的方式的確有效,但 Ubuntu 9.10 依舊沒有解決。慶幸的最後仍有找到方式,以下是相關的執行樣貌,最後我是使用 Bug #24234 in apt (Ubuntu): “apt-get update failing with bad signature.” finjay 提到的解法,解決了 Ubuntu 9.10 的更新問題!



  • sudo apt-get clean

  • cd /var/lib/apt

  • sudo mv lists lists.old

  • sudo mkdir -p lists/partial

  • sudo apt-get clean

  • sudo apt-get update


我嘗試的流程:



  1. 使用 sudo apt-get update -o Acquire::http::No-Cache=True ,但仍無解決

  2. 使用修正 /etc/hosts 與 /etc/hostname 的關係,仍無解決

  3. 最後使用 finjay 提到的解法,就更新成功囉



以下是一些相關的錯誤訊息,也忘了到底是在那個階段出現的 :P 畢竟兩種是接續著試,有無相依性也不確定,再說問題解決後環境也不再,無法再測試,僅留下來當作參考囉。


user@Ubuntu910:~$ sudo apt-get update
Hit http://tw.archive.ubuntu.com karmic Release.gpg
Ign http://tw.archive.ubuntu.com karmic/main Translation-en_US
Ign http://tw.archive.ubuntu.com karmic/restricted Translation-en_US
Ign http://tw.archive.ubuntu.com karmic/universe Translation-en_US
Ign http://tw.archive.ubuntu.com karmic/multiverse Translation-en_US
Get:1 http://tw.archive.ubuntu.com karmic-updates Release.gpg [189B]
Ign http://tw.archive.ubuntu.com karmic-updates/main Translation-en_US
Ign http://tw.archive.ubuntu.com karmic-updates/restricted Translation-en_US
Ign http://tw.archive.ubuntu.com karmic-updates/universe Translation-en_US
Ign http://tw.archive.ubuntu.com karmic-updates/multiverse Translation-en_US
Hit http://tw.archive.ubuntu.com karmic Release
Get:2 http://tw.archive.ubuntu.com karmic-updates Release [44.1kB]
Hit http://tw.archive.ubuntu.com karmic/main Packages
Err http://tw.archive.ubuntu.com karmic-updates Release

Hit http://tw.archive.ubuntu.com karmic/restricted Packages
Hit http://tw.archive.ubuntu.com karmic/main Sources
Hit http://tw.archive.ubuntu.com karmic/restricted Sources
Hit http://tw.archive.ubuntu.com karmic/universe Packages
Hit http://tw.archive.ubuntu.com karmic/universe Sources
Hit http://tw.archive.ubuntu.com karmic/multiverse Packages
Hit http://tw.archive.ubuntu.com karmic/multiverse Sources
Hit http://security.ubuntu.com karmic-security Release.gpg
Ign http://security.ubuntu.com karmic-security/main Translation-en_US
Ign http://security.ubuntu.com karmic-security/restricted Translation-en_US
Ign http://security.ubuntu.com karmic-security/universe Translation-en_US
Ign http://tw.archive.ubuntu.com karmic-updates/multiverse Translation-en_US
Hit http://tw.archive.ubuntu.com karmic Release
Get:2 http://tw.archive.ubuntu.com karmic-updates Release [44.1kB]
Hit http://tw.archive.ubuntu.com karmic/main Packages
Err http://tw.archive.ubuntu.com karmic-updates Release

Hit http://tw.archive.ubuntu.com karmic/restricted Packages
Hit http://tw.archive.ubuntu.com karmic/main Sources
Hit http://tw.archive.ubuntu.com karmic/restricted Sources
Hit http://tw.archive.ubuntu.com karmic/universe Packages
Hit http://tw.archive.ubuntu.com karmic/universe Sources
Hit http://tw.archive.ubuntu.com karmic/multiverse Packages
Hit http://tw.archive.ubuntu.com karmic/multiverse Sources
Hit http://security.ubuntu.com karmic-security Release.gpg
Ign http://security.ubuntu.com karmic-security/main Translation-en_US
Ign http://security.ubuntu.com karmic-security/restricted Translation-en_US
Ign http://security.ubuntu.com karmic-security/universe Translation-en_US
Ign http://security.ubuntu.com karmic-security/multiverse Translation-en_US
Hit http://security.ubuntu.com karmic-security Release
Hit http://security.ubuntu.com karmic-security/main Packages
Hit http://security.ubuntu.com karmic-security/restricted Packages
Hit http://security.ubuntu.com karmic-security/main Sources
Hit http://security.ubuntu.com karmic-security/restricted Sources
Hit http://security.ubuntu.com karmic-security/universe Packages
Hit http://security.ubuntu.com karmic-security/universe Sources
Hit http://security.ubuntu.com karmic-security/multiverse Packages
Hit http://security.ubuntu.com karmic-security/multiverse Sources
Fetched 190B in 11s (16B/s)
Reading package lists... Done
W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://tw.archive.ubuntu.com karmic-updates Release: The following signatures were invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>

W: Failed to fetch http://tw.archive.ubuntu.com/ubuntu/dists/karmic-updates/Release

W: Some index files failed to download, they have been ignored, or old ones used instead.


2009年11月17日 星期二

[Linux] 設定 Objective-C 開發環境及教學資料 @ Ubuntu 9.10

差不多該學學 Objective-C 了,手邊也有 iphone 及相關的環境可開發,剩下只有懶散的心情要整頓。至於什麼是 Objective-C ,可以先看看維基百科的介紹,我覺得還滿詳盡的,甚至英文版還有介紹從 C/C++ 跨到 Objective-C 的範例程式,真的就乾心哩,看程式比看英文快上十倍啊。



跟 iphone 開發相關的網頁介紹:



其他相關的教學



接著,就只剩環境架設的部分,


在 Ubuntu 9.10 最簡化版:



  1. 安裝相關套件

    • # sudo apt-get install gnustep-devel

    • The following extra packages will be installed:
        gnustep-back-common gnustep-back0.16 gnustep-back0.16-art gnustep-base-doc gnustep-core-devel gnustep-core-doc gnustep-gpbs gnustep-gui-common
        gnustep-gui-doc gnustep-gui-runtime gnustep-make-doc gorm.app libaspell-dev libaudiofile-dev libgif-dev libgnustep-gui-dev libgnustep-gui0.16
        libjpeg62-dev libpng12-dev librenaissance0 librenaissance0-dev libtiff4-dev libtiffxx0c2 projectcenter.app projectmanager.app zlib1g-dev



  2. 安裝完就能用 gcc 進行編譯囉

    • # gcc -lgnustep-base -lpthread -lobjc -lm -I/usr/local/include/GNUstep -I/usr/include/GNUstep source.m -o source_run



  3. 參考資料



使用 Makefile 的教學:



  1. 建立 GNUmakefile

    • GNUSTEP_MAKEFILES = /usr/share/GNUstep/Makefiles/

      include $(GNUSTEP_MAKEFILES)/common.make
      TOOL_NAME = LogTest
      LogTest_OBJC_FILES = source.m
      include $(GNUSTEP_MAKEFILES)/tool.make

    • 最上頭那段是我自己加的,網路上大部分的文件都是使用 shell 來設置環境變數

      • C shell

        • # source <GNUstep root>/System/Library/Makefiles/GNUstep.csh



      • Bourne shell

        • # . <GNUstep root>/System/Library/Makefiles/GNUstep.sh







  2. 建立 source.m


    • #include <stdio.h>

      /*
      * The next #include line is generally present in all Objective-C
      * source files that use GNUstep.  The Foundation.h header file
      * includes all the other standard header files you need.
      */
      #include <Foundation/Foundation.h>  

      /*
      * Declare the Test class that implements the class method (classStringValue).
      */
      @interface Test
      + (const char *) classStringValue;
      @end

      /*
      * Define the Test class and the class method (classStringValue).
      */
      @implementation Test
      + (const char *) classStringValue;
      {
        return "This is the string value of the Test class";
      }
      @end

      /*
      * The main() function: pass a message to the Test class
      * and print the returned string.
      */
      int main(void)
      {
        printf("%s\n", [Test classStringValue]);
        return 0;
      }



  3. 編譯與測試

    • # mkdir test ; cd test ;

    • # vim GNUmakefile (內容如上)

    • # vim source.m (內容如上)

    • # make ;

    • # ./obj/LogTest


      • 輸出結果:This is the string value of the Test class





  4. 參考資料



 



Learn Objective-C on Ubuntu



2009年11月13日 星期五

[Linux] 安裝 Eclipse & Subclipse Plugin (SVN Client) @ Ubuntu 9.10

最近剛重灌電腦,上次安裝失敗,這次就好好順便紀錄一下安裝過程。


安裝環境:Ubuntu 9.10 Desktop i386



  1. 安裝 Eclipse

    • # sudo apt-get install eclipse



  2. 安裝 Subclipse

    • 開起 eclipse

    • [Help] -> [Install New Software] 點選 Add


      • Name : subclipse

      • Locatioon : http://subclipse.tigris.org/update



    • 點選 Subclipse Plugin -> Subclipse

    • 接著就 Next 進行囉 (記得版權那邊要勾一下才能按 Finish 安裝喔)



  3. 設定 Eclipse

    • [Window]->[Preferences]->[Team]->[SVN]

    • 此時會蹦出錯誤訊號窗

      • Failed to load JavaHL Library.
        There are the errors that were encountered:
        no libsunjavahl-1 in java.library.path
        no svnjavahl-1 in java.library.path
        no svnjavahl in java.library.path
        java.library.path = /usr/lib/jvm/java-6-openjdk/jre/lib/i386/cclient:/usr/lib/lib/jvm/java-6-openjdk/jre/lib/i386:......:/usr/lib/jni:/usr/lib

      • 這是因為一開始預設是用 JavaHL 關係



    • 解決方式有兩種

      • 第一種:在剛剛的頁面上,有 SVN interface 選項,有 JavaHL(JNI) 跟 JavaSVN(Pure  Java) 兩種可選,切換成 JavaSVN 就行了!

      • 第二種:安裝 JavaHL

        • # sudo apt-get install libsvn-java

        • 只是我安裝完仍有看到錯誤訊息

          • Failed to load JavaHL Library.
            There are ther errors that were encountered:
            no libsvnjavahl-1 in java.library.path
            Incompatible JavaHL library loaded, 1.3.x or later required.



        • 然而自己就很懶得再繼續解下去,就略過這個解法,改用 JavaSVN(Pure  Java) 啦







  4. 測試

    • [File]->[New]->[Other]->[SVN]->[Checkout Projects from SVN]->[Create a new repository location]

      • 若預設就在這個選項,但又不能按 Next ,就先選另一個選項再切回來就可以選 Next 啦



    • 剩下的就只是選你要 checkout 的目錄囉,選完按 Finish 就能跑了




以上純粹只是在 Linux 上使用安裝 Subclipse plugin for Eclipse 而已,並不是要開發 Java 類的程式,因此僅利用預設的環境。


2009年11月6日 星期五

使用 find regex 與 xargs 將特定檔案打包壓縮

通常使用 find . -name "*.txt" 已經很夠用了,但如果要多個附檔名時卻又有點困擾。


這時可以使用 find . -regex 的方式,它是接受正規表示法的。但須留意用法,原先 find . -name "*.txt" 需更新成 find . -regex ".*\.txt",原理部份請參考 regular expression 。


處理多個副檔名的範例:


# find . -regex ".*\.jpg\|.*\.txt"


如果要順便打包壓縮:


# find. -regex ".*\.jpg\|.*\.txt" | xargs tar -rvf test.tgz


製作 Motion JPEG (Mjpeg) 影片 - 將連續的照片串成影片

如果有一連串稍稍變化的照片,好比如 100 張連續變化的照片,像運動比賽,甚至街景的變化等,有時就想把它弄成影片來玩玩。這時,若那些照片都是 jpeg ,那就有一些現成的工具可以拿來用囉。


關於 Motion JPEG 可以參考這些資訊:



在網路上隨手一查,不少可用的方式



以下在 Ubuntu 的環境先試了 mjpegtool



  • jpeg2yuv −f 25 −I p −j image%05d.jpg > result.yuv

  • jpeg2yuv −b 1 −f 25 −I p −n 60 −j image*.jpg | yuv2lav −o stream_without_sound.avi


發現它會要求 jpeg 的 width 要 16 的倍數



  • **ERROR: [jpeg2yuv] The image width isn't a multiple of 16, rescale the image


所以最後我用了 mencoder



  • mencoder mf://1.jpg,2.jpg,3.jpg -mf w=800:h=600:fps=1:type=jpeg -ovc copy -o out.avi

  • mencoder mf://%.jpg -mf w=800:h=600:fps=1:type=jpeg -ovc copy -o out.avi


其中 -ovc 和 -oac 分別代表要如何處理視訊跟聲音的動作,此例為 copy 不進行轉換。後來發現,原來 mencoder 還可以把網路上的串流(mms://)給轉換成影片呢!



  • mencoder mms://www.example.com/test.wmv -ovc copy -oac copy -o 輸出檔名

  • mms 的部份也可以接受 asf , wma 等格式,但這邊我就沒試,我主要是要玩 mjpeg 囉


參考資料



Facebook SPAM Quiz !

雖然這陣子開發一些簡單的 Facebook 的 Quiz 程式,但自己真的沒用玩過幾個 Quiz ,心血來潮是了兩個別人推薦的邀請,一玩下去才發現!開始有 SPAM 的味道了。SPAM就是擾人的廣告性的事物。


那些 Quiz 通常在第二頁列出制式的官方邀請函介面,但骨子裡卻已經幫你送出邀請函!若 Facebook API 等架構不變動的話,再不用多久,可能 SPAM Quiz 滿天飛,接下來就是沒人想再玩 Quiz 了。


2009年11月4日 星期三

發現...

無意間發現有人在轉錄我的文章?不過是比較像弄成書籤的網誌。


有人把我寫的文章的標題打在自己的 blog 上,然後再把該篇文章的上前面幾段內文貼上去。我本來是沒什麼在意,但如果考慮 Search Engines 的搜尋排名,那就會計較了,哈。


原本是去 Search 某個關鍵字看看會不會找到我的文章,然後才發現怎麼有人的文章跟我標題一模一樣?還出現部份內文?且比我排在前頭!比較好的做法是至少文章標題不要一樣嘛,多個 [轉錄] 不是很好嗎?因為我自己一開始去看那個網站時,真的會以為那些文章都是對方寫的,每一篇雖然文章底部有標明 Source 的字樣,但仍不是很明顯。


之所以會有不好的感觸是因為前陣子我在找某個主題的相關文章,恰巧也發現 A 先生的文章也被 B 先生這樣處理( A 文章內容被 B 先生複製貼上),雖然多少有標明來源,但文章標題都仍是一樣的。如果只是這樣倒沒什麼差,但我卻發現某個很大咖的研究中心,在推廣教學時,反而去引用 B 先生的網誌文章,這就讓我感覺對 A 先生的不公平,畢竟原先的文章是由 A 先生辛苦撰寫的嘛。


anyway,稍稍抱怨一下,我猜我發現的那個網站應該是類似機器人處理的,因為它除了有制式的格式外,還有附上文章來源的網頁快照(snapshot),只是,尊重作者,最好還是明確地寫上些完整的訊息會來得更好。但,寫下東西的最大用意除了跟大家分享外,就是幫自己寫點紀錄啦。


Facebook API Publisher - 使用 Attach 附件服務增加發佈塗鴉牆的效果

Facebook Attach


有時希望可以讓使用者在分享文字或連結時,能自動帶出一些效果,這時候我們需要的就是 Publisher 服務。例如當輸入 YouTuBe 影片連結時,系統會自動幫我們嵌入 YouTuBe 的顯示頁面,而不再只是簡單的 link 樣貌,此時原理即是將使用者輸入的資料,進行分析再轉換成新的呈現方式。


然而,目前 Facebook 平台開放的狀態還沒讓開發者如此便利,但有個間接使用的方式,那就是發表時以 Attach(附件) 來呈現。關於 Attach 的設定方式如下:


Setup



  • My Applications > Edit Settings > Profiles > Profile Publisher

    • Publish

      • Text

      • Callback URL



    • Self-Publish

      • Text

      • Callback URL






其中可分成兩類,一種是在別人的塗鴉牆留言時,另一種則是在自己的塗鴉牆留話。分別都需要填寫兩項資訊,其中 Text 代表在 Attach(附件) 顯示的按鈕名稱,如:加增表情符號。 Callback URL 則是當使用者按下按鈕時,系統會去這個位置要資料來呈現。實作上要留意,那個 Callback URL 回傳的資料要以 JSON 格式回來。


至於 Facebook 去 Callback URL 進行撈資料時,帶有以下參數資訊:



  • fb_sig_api_key: Your application's API key.

  • fb_sig: A signature using your application's secret key to encrypt the request.

  • fb_sig_in_canvas: This parameter is always false or 0 because the Publisher is not a canvas page.

  • fb_sig_request_method: This is always a POST method.

  • fb_sig_locale: This is the user's locale.

  • fb_sig_time: The time that the request was made.

  • fb_sig_added: Indicates whether the user has authorized (agreed to your Terms of Service) the application.

  • fb_sig_profile_user: Indicates the user whose profile is being published to.

  • fb_sig_user: The ID of the user interacting with the Publisher.

  • method: Indicates if the Publisher is getting the application's Publisher interface or getting the Feed story. 

  • 等等‥


只是,依舊沒有使用者當下輸入的資訊,這讓我有一點小失望,這也可能基於一些隱私或安全性的考量吧?剩下的我只好有空再來摸索啦!但是,目前開放的平台特色仍可以做出不錯的效果喔!


發佈塗鴉牆的效果
Facebook Attach

點選播放的畫面
Facebook Attach


簡單的 Callback 程式碼,其中 base.php 則是處理 Facebook API 的初始化,而 publisher_getFeedStory 部份則是直接用上頭 Facebook - Publisher 提到的範例。


<?php
require( 'base.php' );
$data = array();
$data['content'] = array();

$out = '';
foreach( $_REQUEST as $k => $v )
        $out .= "[$k] => [$v]<br>";
if( !isset( $_REQUEST['method'] ) || $_REQUEST['method'] == 'publisher_getInterface'  )
{
        $data['content']['fbml'] = json_encode( $out );
        $data['content']['oublishEnabled'] = true;
        $data['method'] = 'publisher_getInterface';
}
else
{
        $data['content']['attachment'] = array();
        $data['content']['attachment']['name'] = 'ninja cat';
        $data['content']['attachment']['href'] = 'http://www.youtube.com/watch?v=muLIPWjks_M';
        $data['content']['attachment']['caption'] = '{*actor*} uploaded a video to www.youtube.com';
        $data['content']['attachment']['description'] = 'a sneaky cat';
        $data['content']['attachment']['properties'] = array();
        $data['content']['attachment']['properties']['category'] = array();
        $data['content']['attachment']['properties']['category']['text'] = 'pets';
        $data['content']['attachment']['properties']['category']['href'] = 'http://www.youtube.com/browse?s=mp&t=t&c=15';
        $data['content']['attachment']['properties']['ratings'] = '5 stars';
        $data['content']['attachment']['media'] = array();
        $data['content']['attachment']['media'][0]['type'] = 'video';
        $data['content']['attachment']['media'][0]['video_src'] = 'http://www.youtube.com/v/fzzjgBAaWZw&hl=en&fs=1';
        $data['content']['attachment']['media'][0]['preview_img'] = 'http://i2.ytimg.com/i/uZp-cf0yOTqQEOuKGGnocg/1.jpg';
        $data['content']['attachment']['media'][0]['video_link'] = 'http://www.youtube.com/watch?v=muLIPWjks_M';
        $data['content']['attachment']['media'][0]['video_title'] = 'ninja cat';
        $data['method'] = 'publisher_getFeedStory';
}
echo json_encode( $data );
?>


其中,上述發佈用的 template 允許四種 type ,分別為 image , flash, mp3, vedio ,細節請參考 Facebook - Attachment (Streams)


參考資料



2009年11月3日 星期二

[Javascript] 以 Array 方式產生亂數序列

有時需要一串亂數序列使用時,例如亂數播放影片等等的,就可以用下面這招!把數列都打亂囉。


使用到 Math.round (四捨五入) 與 Math.random (亂數),流程是先呼叫 Math.random 產生一個介於 0 ~ 1 的數字,再利用 Math.round 讓這個數值為 0 或 1 ,最後再把數值扣 0.5 ,讓它明確地變成負數或正數,以此達成 sorting 用的 compare function 啦。因此呼叫 sort 完後,就變成亂數的序列囉。


<script type="text/javascript">
    test = new Array( 1 , 2 , 3 , 4 , 5 );
    test.sort( function(){ return Math.round( Math.random() ) - 0.5 ; } );
    document.write( test );
</script>

參考資料



2009年11月2日 星期一

Django Testing

最近要開始嘗試 Test-driven development (TDD) 了,簡單地說就是以測試起家,什麼想做的事,第一件事就是幫它規劃輸入的參數與預期的輸出結果,然後就開始撰寫測試的程式碼,最後才開始填寫核心程式碼。


這樣的好處除了可以替案子留下測試的簡單驗證程式碼外,以避免未來案子過大造成的相互影響,也能更明確寫程式的目標,而唯一的缺點就是耗時間。以下紀錄 Django 在 apps 裡新增 testing 的環境。



  1. 在 project 中的 apps 裡新增 tests.py 檔案和 fixtures 目錄

  2. 在 fixtures 目錄裡準備一筆測資

    • ex: record_1000.json

    • 可從現有 database 匯出

      • # python manager dumpdata your_app > record_1000.json





  3. 撰寫 tests.py 檔案

    • import django
      import views as testingAPI

      class FuncTestCase(django.test.TestCase):
          fixtures=['record_1000']
          def test_MyFunc(self):
              tags='Testing for My Func'
              arg = 0
              result=testingAPI._MyFunc( arg )
              self.assertEqual(result["errorcode"],"0")

              return



  4. 測試

    • # python manage.py test your_app'




參考資料