2013年12月29日 星期日

如何檢查你目前Ubuntu 桌面是使用 Unity-2d 或 Unity-3d 與確定目前系統是否有支援 Unity-3d

       檢查 Ubuntu 桌面是使用 Unity-2d 或 Unity-3d 你可以透過 "echo $DESKTOP_SESSION" 命令來檢查,執行畫面如下:

      如果目前使用 Unity-2d 會顯示 Ubuntu-2d,Unity-3d 則只會顯示 Ubuntu。

      另外如果你要確定系統是否有支援 Unity-3d,你可以透過 "/usr/lib/nux/unity_support_test -p" 來檢查,執行畫面如下:


[參考連結]

解決使用 Intel G840 啟動 VirtualBox 3D 加速 VirtualBox 會當機的問題

     在VirtualBox中安裝 Ubuntu 12.04 LTS後,如果你沒有啟動 VitualBox 3D 加速,進入 Ubuntu 後使用的是 Unity-2d,如果你想要使用 Unity-3d 你必須要啟動 VitualBox 的 3D 加速。設定的方式如下圖:

    但當啟動 3D 加速時,重新啟動虛擬時你也許會遇到 VirtualBox 會莫名的當機,無法正常開啟你的虛擬機,最後更新 Intel G840 HD Graphic 驅動程式後,就解決啟動虛擬機會當機的問題了,如果你有遇到類似的問題,或許可以嘗試更新你的顯示卡驅動程式來解決問題。
 


如何在 Windows XP 下透過 VirtualBox 安裝 64 bits Ubuntu 12.04 LTS

    如果你想要在 Windows XP 下安裝 64 bits Ubuntu 12.04 LTS,你必須確定下列項目你都已經設定好了,才可正常安裝:
  1. 啟動 VirtualBox VT-x / AMD-V ( VirtualBOx 4.3.12 如果 BISO 沒有先開啟支援虛擬化技術,加速的頁面是無法點選。), 如下圖:

  2. 啟動 BIOS 中 CPU 的虛擬化技術(Virtualization technology)。 
    如果你沒有在 BIOS 中啟動虛擬化技術時,當你啟動你的 VirtualBox 中的 Ubuntu 時,會看到如下的警告視窗:

 
    即便你點選繼續最後會停在開機畫面無法正常進入 ;其實從上面的訊息中 "請確認在您主機電腦的 BIOS 中已正確啟用 VT-x/AMD-V",就已經告訴你如何解決問題了。只要從新開起進入到 BIOS 中啟動虛擬技術就可以正常的啟動安裝 64 bits Ubuntu 12.04 LTS。

    下圖為 ASUS 主機板設定的方式:

後記:
       重新安裝電腦後,BIOS 也已經啟動虛擬技術,但 VirtualBox 依然無法正常偵測到 VT-x,找了老半天,還以為是 Windows 7 跟 VirtualBox 哪邊不和需要設定,最後發現是因為安裝了avast free antivirus 的防毒軟體,移除後就可以正常偵測到且可以正常起動Guest OS。之前無法執行 Windows 的磁碟掃描也是因為它。似乎要考慮別的免費防毒軟體了。 XD


[參考資料]
     
    

2013年12月10日 星期二

2013年12月5日 星期四

LINE: 發生錯誤,請重撥(101),伺服器無法使用請檢查網路連線

     最近在家用 LINE 透過 WIFI 打免費電話時,發生一些問題,撥打時沒有 ringtone 而且人家打電話進來也沒有 ringtone 且無法接起電話,最後 LINE 就顯示 "發生錯誤,請重撥(101),伺服器無法使用請檢查網路連線",一度還以為是我的手機問題,氣到想要把它摔掉。後來發現兇手是 WIFI 基地台,今天突然想起,之前我有重新設定 WIFI 基地台,有重新設定防火牆,死馬當活馬醫,我把 "Enable SPI and Anti-DoS firewall protection" 選項給取消後,LINE 終於可以正常撥接了。

2013年12月2日 星期一

修改 Android Emulator 的 Abstracted LCD density

      如果你用 ADT 來編輯目前 AVD 的 Abstracted LCD density 值時,你會發現在 Hardware 欄位那邊你只能下拉選擇數值而不能填入你想要的值,如下圖所示:
    注意:因為這個 AVD 我是用舊版的 ADT 所產生的,所以還看的到Hardware 的屬性設定。新版的,你可以在 Device Definitions 頁面,按 【New Device...】在新增裝置時設定,但我找不到可以設定 LCD density的數值,它似乎會根據你所設定螢幕解析度的是屬於 ldpi 或者 mdpi 來填入預設的數值。不過修改 LCD density 的方式是一樣的。

     從上圖你可以看到只有 120 、160、240...等數值可以選擇,而且你無法修改。修改的方式是到你的 .android 目錄下找到 AVD 資料夾,然後開啟 config.ini 檔案,修改 【hw.lcd.density】的數值即可。如下圖所示:


列印例外訊息 printStackTrace()、toString()、 getMessage()

     當我們處理 Java 例外時,通常會在例外捕獲時列印例外的訊息,一般在輸出訊息通常使用 printStackTrace()、toString()、 getMessage() 這三種方法列印出例外訊息。
     而輸出訊息的格式請參考下面圖示:

  • printStackTrace ()方法 輸出如下
  • java.io.FileNotFoundException: abc.txt (系統找不到指定的檔案。)
     at java.io.FileInputStream.open(Native Method)
     at java.io.FileInputStream.<init>(Unknown Source)
     at java.io.FileInputStream.<init>(Unknown Source)
     at ExceptionExample.someMethod(ExceptionExample.java:7)
     at ExceptionExample.main(ExceptionExample.java:19)
    
  • toString()方法 輸出如下
  • java.io.FileNotFoundException: abc.txt (系統找不到指定的檔案。)
    
  • getMessage()方法 輸出如下
  • abc.txt (系統找不到指定的檔案。)
    
    另外我們故意讓程式丟出 NullPointerException,透過上面三種方法輸出例外訊息,其範例與輸出結果如下:
  • 範例
  •     String str = null;
        try {
             str.length();
        } catch (Exception e) {
             e.printStackTrace();
        }
    
  • printStackTrace()
  • java.lang.NullPointerException
     at ExceptionExample.main(ExceptionExample.java:30)
    
  • toString()
  • java.lang.NullPointerException
    
  • getMessage()
  • null
    
     在上面的 NullPointerException 例子,toString() 與 getMessage() 幾乎沒有任何幫助,基本上,除非是自訂的例外或者可以明顯知道例外的輸出的解果發生在哪個地方,例如,我們只在某個地方開啟特殊的檔案,則我們可以考慮使用  toString() 與 getMessage() 來減少除錯訊息的輸出,否則建議還是直接 printStackTrace() 方法輸出詳細的例外訊息。

[參考資料]




2013年12月1日 星期日

String equals( ) 與 compareTo( ) 方法的不同

     Java 中要比對字串是否相等,我們可以使用 equals 或者 compareTo 方法來實現,但是它們之間有甚麼不同呢 ? equals 與 compareTo 之間主要的不同有下面兩點:

  1. 如果傳入的參數是 null 時, equals  總是回傳 false,而 compareTo 則是丟出 java.lang.NullPointerException。
    範例如下:
     "foo".equals((String)null)  // 回傳 false
     "foo".compareTo((String)null) == 0 // 丟出 NullPointerException
    

  2. compareTo 除了可以比對字串是否相等外,還可以得知哪一個字串比較大或者小,equals 只能比對是否相等。
     另外好奇的是,為何將 null 傳入 equals 裡面會沒事,看了一下原始碼你會發現類似下面的程式碼:
   if (anObject instanceof String) {
      ...  
   }
    而 null 是物件的參考常數值,它可以被任何物件所參考,但它不屬於任何物件。也就是說 null instanceof object 總是回傳 false,故在將它傳入 equals method 並不會丟出任何例外。

    下面是從 Oracle 上查詢到的資料,解釋有關 null type。有興趣的人可以連結過去查看。
4.1. The Kinds of Types and Values
There is also a special null type, the type of the expression null (§3.10.7, §15.8.1), which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type.
The null reference can always undergo a widening reference conversion to any reference type.
In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.