顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

星期五, 4月 29, 2022

在MacOS使用其他版本的java

在 Linux 裡要切換 java,可以使用 update-alternative --config java

在 MacOS 裡,要用 /usr/libexec/java_home

MacOS 本身就有帶一包 java ,是 OpenJDK,所以在要切換之前,得先說一下,怎麼安裝其他版本的 java 。要安裝其他版本的 java,用 homebrew 的話,是很簡單的。

要安裝 oracle-jdk,就用

brew search oracle-jdk

要安裝 adoptopenjdk,就用

brew tap adoptopenjdk/openjdk
brew install adoptopenjdk8

要知道裝了哪些 jdk,可以用

/usr/libexec/java_home -V

這行指令會列出所有安裝的 Java ,從這邊可以取得版本號碼跟名稱。

知道版本以後,要使用指定版本的 Java ,可以用切換 PATH 的方式來處理

export JAVA_HOME=$(/usr/lib_exec/java_home -v <your_java_version>)
export PATH=${JAVA_HOME}/bin:${PATH}

參考資料

 

星期一, 3月 16, 2015

SugarORM

因為想偷懶,之前有看到 Sugar ORM,感覺上很簡單易用,就試試看了。大致上照網頁上的說明,就可以用了,這裡主要提一些比較不清楚的地方。
  1. 使用 Android Studio 的話,compile 'com.github.satyan:sugar:1.3' 這行是放在 app/build.gradle 裡的 dependencies {} 裡。
  2. 放 在 AndroidManifest.xml 裡的 meta tag 很重要。DOMAIN_PACKAGE_NAME 要跟你 entity class 的 package name 對應到,否則,會沒辦法自動建立資料表格。VERSION 在第一次開發時,是隨便給,但在之後有變動 entity class 以後,要出更新版本時,這裡要記得累加。如果都還沒上架,那倒是沒關係,可先都不變,碰到問題時,先 uninstall 再 install app 就可以了。
  3. 在 app 啟動時,查看 Logcat ,可以看到 SugarORM 輸出的訊息,說建立了什麼資料表格,如果使用上有問題,不妨看看,會有所幫助。
  4. 不支援 1 對多、多對多的關係。1 對多,可以在類別裡建立欄位跟函式來處理:
    [gist id=40581147cbd358dfc65b]
    至於多對多,也是可以用傳統 RDB 的觀念來炮製。
官方網頁裡還有提到直接 Query 跟 Migration,這邊我就沒試了。

星期三, 1月 18, 2012

ping in Android(續)

後來發現裏面有包ping這指令,而且有設置setgid權限,那麼應該是可以執行。只是試了之後,卻不行,然後我就以為不行。之後不死心,把stderr接出來看,才知道我下錯指令,於是修正以後,就可以了。

final class Helper {
  private final String TAG="Helper";
  private void pingInExec(String host) {
    Runtime runtime = Runtime.getRuntime();
    String command = String.format("/system/bin/ping -c 2 %s", host);
    Process proc;
    try {
      proc = runtime.exec( command );
      BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
      BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
      
      String inputLine;
      while ((inputLine = in.readLine()) != null) {
        Log.d(TAG, inputLine );
      }
      in.close();
      while ((inputLine = err.readLine()) != null) {
        Log.e(TAG, inputLine );
      }
      err.close();
      proc.waitFor();
      int exit = proc.exitValue();
      Log.d(TAG, String.format("exitcode=%d", exit) );
      if (exit == 0) { // normal exit
        Log.d(TAG, "RESPONSE_OK");
      } else { // abnormal exit, so decide that the server is not reachable
        Log.d(TAG, "RESPONSE_TIMEOUT" );
      }
    } catch (IOException e) {
      Log.e( TAG, e.getMessage() );
    } catch (InterruptedException e) {
      Log.e( TAG, e.getMessage() );
    }
  }
}

星期三, 3月 02, 2011

AlbiteReader後續修正

J2ME裡的英文字型寬度不是固定的,所以顯示英文字的時候會怪怪的。利用 HashTable 去存英文字的寬度,至於中文字型還是固定,這樣英文顯示就比較漂亮一點了。

大致上就這樣,更新以後的檔案放在同一個地方,需要的人自己下載。

另記用 Sigil 的心得,儘量使用 p、blockquote 來做編排,段落的呈獻會比較漂亮,避免使用 br 來做斷行。簡單說,大致的編排就是儘量使用 html 搭配 css,而不要用硬幹的方式。

星期五, 2月 25, 2011

AlbiteReader的後續紀錄

AlbiteReader是一個可以在手機上閱讀 epub 電子書的軟體,原來只能看英文,下面是我改成可以看中文的紀錄。

原本很擔心怎麼build的問題,想不到下載 netbean 6.9.1 + J2ME 3.0 的版本就迎刃而解,先從AlbiteREADER的github網頁上把原始碼拉下來,接著用 netbean 開就行了,除了可以 build 也可以 debug (有emulator),這在後續追蹤問題上,給了我很大的協助。

netbean 這邊比較大的問題是在編輯主要畫面,就編輯 .midlet 檔時,如果選 flow 會整個當掉,我後來是根本沒機會看到,好在也不需要用到,其他的頁籤就都可以點,所以我就順手把主選單給中文化了。

之前有提到 Font 的問題,後來是整個翻掉,改成使用系統的中文字型,所以 AlbiteFont 類別其實是 J2ME Font 的 Adapter,作為一個中間的轉換,對原來的 AlbiteReader 來說,介面幾乎是一樣,只是底層顯示的方式改變了。

改了以後,根本沒辦法顯示,去 debug,才知道 Font.drawChar跟 netbean 給的提示不一樣,drawChar 的最後一個參數並不是 color,必須要給 Graphics.TOP、Graphics.LEFT...這些定位的參數才行,我後來是用 Graphics.TOP | Graphics.LEFT,簡單說,就是一個是上下的定位,一個是左右的定位,我就是固定靠左上角。

可以顯示之後,發現最右邊總是會出現半個字。原本以為是斷字出現的問題,大致追到TextPage,確定這裡是主要處理多少字為一頁的地方。再次利用了 debug,發現程式的思維跟我想的不一樣,程式的作法是根本不斷字,每行其實是一個 XXXRegion 的類別,Region 裡放的字串是好長一串,顯示的時候其實是這樣畫:12345678, 45678, 78...,所以根本跟斷字無關,一定會畫出半個字。我的處理方式是在 Font.drawChars 增加一個參數,在邊畫字的時候,就邊檢查,如果超出了這個值,就不畫了,這樣就避免了畫出半個字的問題。

整個改到這邊的時候,是很高興的,但是放到手機上,卻發現慢到一個不行。想了一個晚上,才想到,可能是取字寬度的問題,在看 TextPage 時,發現程式裡大量使用了取字寬度函數。因為我是呼叫 J2ME Font.charWidth(),每個字都去呼叫,而原來的處理,這些值都是固定的,而且字了不起也才 26 個英文字母 + 數字 + 標點符號,不會對程式有太大的負荷。但對中文字來說,如果每個字都去查,那肯定是很慢。這邊我的處理方法是在 initialize Font 的時候,就先把一個中文字的寬度記下來,假定每個中文字的寬度都一樣 (好在也都一樣),之後就用這個值去計算,這樣就恢復到原來的速度了。

回憶錄大概就記到這裡,如果有需要參考我的 code,可以到我 fork 出來的 github repository去拉。
要直接下載 .jar 的話,可以直接從這裡下載。