2013年11月26日

NetBeans IDE 字型美化 on Ubuntu Linux

NetBeans IDE 在 Ubuntu Linux Desktop 的編輯器,預設字型效果就跟一般 Java 應用程式一樣不太美觀。用習慣 Mac OS X 之後,眼睛對字型愈來愈挑剔,這篇探討怎麼讓編輯器字型看起來舒服一些。

這是 Ubuntu 13.10 + NetBeans 7.4 的預設畫面。


第一個優化是先開啟 Java 程式的字型反鋸齒(AntiAliasing)效果,需要在 NetBeans 的 netbeans.conf 加入以下藍色文字的設定。

$NETBEANS_DIR/etc/netbeans.conf

netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dswing.aatext=true -J-Dawt.useSystemAAFontSettings=lcd"

在字型的選擇上,可以使用 Google 佛心開放 Droid Sans Mono,可以跨平台使用相同字型,中文字支援也正常。這個字型是 Apache License 可以直接從官網合法下載安裝。

http://www.droidfonts.com/droidfonts/

重新啟動 NetBeans 之後,設定 Font & Colors,這邊使用 Norway Today 佈景主題,搭配 Droid Sans Mono 13 字型設定(已開啟 AA 反鋸齒)。


程式碼編輯區字型效果立竿見影。


 如果要讓不同編輯器都共用相同的精準配色佈景主題,可以再加上 Solarized 的設定。

SOLARIZED Precision colors for machines and people
http://ethanschoonover.com/solarized

GitHub 可以找到 Solarized for NetBeans。

Solarized Dark color scheme, implemented for NetBeans
https://github.com/fentie/netbeans-colors-solarized

這個套件的作者沒有發佈方便安裝的 ZIP 壓縮檔,所以我自己幫他包了一個。

直接下載 Solarized for NetBeans 安裝套件。
https://github.com/lyhcode/netbeans-colors-solarized/releases/download/v1.0/netbeans-colors-solarized.zip

在 NetBeans Options 設定畫面的左下方,用 Import 按鈕選擇下載的 ZIP 檔案。


安裝好重新開啟 NetBeans 後,就可以看到 Solarized 的效果,包含 Dark 及 Light 兩種配色組合;這套佈景預設搭配 Monaco 字型,可以從 Mac OS X 的系統取得這個字型檔。

Solarized Dark


Solarized Light


到目前已經改善程式碼編輯區的字型效果,不過 NetBeans 其它部份還是不好看,主要原因還是歸咎於 JDK 並未使用作業系統原生的 Font Rendering。

為了徹底改善字型效果,找到以下兩個參考文章:

Step 1: BETTER FONT RENDERING IN LINUX WITH INFINALITY

這篇是 Infinality 的安裝,它是 Patch Ubuntu 的 FreeType 函式庫,並且可以選擇偏好的 Font Rendering 效果。

sudo bash /etc/fonts/infinality/infctl.sh setstyle

Select a style:
1) debug       3) linux      5) osx2     7) win98
2) infinality  4) osx      6) win7     8) winxp

安裝設定後,整個 Ubuntu Desktop 的字型效果會有顯著改善,更接近 Mac OS X 的水準。

Step 2: INSTALL OPENJDK PATCHED WITH FONT FIXES [UBUNTU PPA]

這篇是安裝 OpenJDK with Font Patch,它讓 Java Swing 應用程式的字型效果,跟 Ubuntu Linux 其它 Native 應用程式看起來一致。

完成上面兩個步驟,可以看到 NetBeans 在 Ubuntu Linux 的字型顯示,已經完全脫胎換骨。


2013年11月20日

利用 IntelliJ IDEA Community Edition (Free) 輕鬆開發 Gradle / Java 專案

Gradle 是令開發者「再也回不去」的自動化建置工具;過去 Java 的開發者在使用 Ant + Ivy 及 Maven 所遇到的障礙,往往最後還是要依賴 IDE 的 Build 支援,因為傳統 Java 的 XML 設定實在讓人卻步。

Gradle 不僅是設定比 Maven 更容易,最重要的是它的設定本身是 Groovy Script,所以任何 Java 程式能做到事情,在 Gradle 的 Task 中也都能輕鬆做到。開發 Gradle Task Plugin 的難度低,所以在開發過程的日常任務,都可以用更少的時間輕鬆達成自動化建置。

不過在導入 Gradle 工具後,許多 Java 開發者的第一個疑問是?是不是一定要搭配 Console command-line 使用,而必須放棄 IDE 的 Build 功能呢?

回想兩年前,Gradle 使用人口還不多,版本也遲遲未正式推出 1.0,那時候 IDE 對 Gradle 的支援只能用慘字形容。但現在的 Gradle 已經有大幅的進步,而各大 IDE 也持續改善「Gradle 專案」的支援。

目前各大 IDE 的支援狀況:

Eclipse

Spring 官方的開發工具 STS(Spring Tool Suite)是以 Eclipse 為基礎建置的 IDE,所以官方也開發一個 Gradle Integration 工具;如果不想使用 STS,也可以自行利用 Update site 單獨安裝 Plugin 功能。

因為 Eclipse 沒有內建「新增 Gradle 專案」的功能,需要利用 Gradle 內建 Eclipse Plugin 先產生 Java Project Settings,再用 Import Existing Project 的方式匯入。

NetBeans

目前的 NetBeans 可以直接在內建的 Plugins 清單搜尋並安裝 Gradle Support Plugin,就能直接開啟包含 build.gradle 設定檔的專案資料夾。

Gradle 並未提供 NetBeans Plugin,所以在 NetBeans IDE 中建置 Gradle 專案,實際上使用的是 IDEA Plugin。

IntelliJ IDEA

本篇主要介紹 IDEA 的原因,就是它對 Gradle 的支援度最佳,而且功能有持續更新及維護。IDEA 有商業授權版及免費社群版(Community Edition,簡稱 CE),許多 Java 開發者會覺得 Java EE 功能必須商業版才有提供,例如 Grails 等;但 IntelliJ 對開源社群相當友善,處理回應開發者問題及需求的速度也快,目前免費的 CE 就對 Gradle(包括 Android)內建完整功能。

Gradle 本身也內建 IDEA Plugin,它可以用來產生 IDEA 所需的建置設定。但由於 IDEA 對 Gradle 的完善支援,即使沒有先跑 Gradle 產生設定檔,也能在 IDEA 匯入 Gradle 專案時自動產生相關必要設定。

這篇文章將以最新的 IntelliJ IDEA 13(目前還是測試版)為例。

建立 Gradle 專案

在 IDEA 新建 Project,直接選擇 Gradle 專案類型。
Gradle 專案的設定,需要指定 Gradle 來源,有三種模式:(1) default 使用 IDE 內建的 Gradle Wrapper、(2) 使用專案自訂的 Gradle Wrapper、(3) 使用安裝在本地端的 Gradle 版本。
Gradle 內建 Wrapper Plugin,Wrapper 的功能是一個非常棒的設計,它會在專案資料夾產生 gradlew 及 gradlew.bat 兩個執行檔,與一個包含必要 JAR 檔案的 gradle 資料夾。gradlew 是 Linux 及 Mac OS X 適用的 BASH Scirpt,而 gradlew.bat 則是 Windows 的批次檔,所以在沒有安裝 Gradle 的電腦,只要裝有 JDK,仍可以執行 ./gradlew build 來建置專案。

Wrapper 對發佈到 CI(持續整合系統如 Travis 或 Jenkins)來說是非常方便的設計,因為在 CI 上不必先安裝 Gradle 環境,而且每個專案使用的 Gradle 版本可能也有差異,Wrapper 可以指定所用的 Gradle 版本(但必須 > 1.7,因為在這之後才有 Wrapper)。

也就是說,即使電腦沒有先裝 Gradle,在 IDEA 仍可以建置 Gradle 專案,實際上就是由 Wrapper 來處理。

以下是 Gradle 專案新增完成的畫面。


使用 JetGradle 工具

IDEA 12 開始提供內建的 JetGradle 工具,到 IDEA 13 已直接稱為 Gradle tasks,這個工具可以從 View / Tool Windows / Gradle 打開。

JetGradle 的主要功能包含:(1) 列出專案可用的 Gradle Task 指令清單、(2) 重新讀取 Gradle 設定。當 build.gradle 的內容修改,例如增加 dependency 後,就可以利用重新整理按鈕,將依賴的 JAR Library 載入,就能在 Java 程式碼中 import 所需的新類別。


新增 Java 類別

在新建 Gradle 專案的 build.gradle 設定檔,可以看到它已經包含「apply plugin: 'java'」設定,也就是專案已經支援基本的 Java 程式編譯及建置。

預設的 Java 原始碼需要放在「src/main/java」,我們需要先在專案右鍵選單的 New / Directory 手動建立資料夾。


資料夾「src/main/java」新增後,可以看到「java」目錄是不同顏色。


在「java」目錄右鍵選單,選擇 New / Java Class 新增 Java 類別。


寫一個 Hello World 程式碼(com.company.Hello)。


執行程式(Run Task)

Gradle 的 Application Plugin 提供執行 Java 程式的功能,先在 build.gradle 增加以下兩行設定:

apply plugin: 'application'

mainClassName = 'com.company.Hello'


修改後再到 JetGradle 重新載入設定(使用工具視窗左上方的 Reload 按鈕)。


點兩下 HelloGradle 在 All tasks 的「run」任務,開始執行 Run Task(由 Application Plugin 提供;在 build.gradle 設定 mainClassName 指定要啟動的 Startup Class)。

在 IDEA 顯示程式執行結果。


這個動作也等於在 Console 自行輸入「gradle run」或「./gradlew run」的 command-line 指令。


Conclusion

利用 Gradle 豐富的 Plugin,可以建立各種自動化的專案建置流程,團隊開發成員也能各自選擇喜好的開發工具,不再受限 IDE 設定。

由於 build.gradle 明確定義專案參數,例如 dependency library 的版本及來源,如此可以避免過去 Java IDE 經常出現的 trouble,特別是在協同開發時經常發生從 VCS 取得的專案,總是缺少某些設定或無法順利建置。

IntelliJ IDEA Community Edition 無疑是目前與 Gradle 搭配最佳的開發工具,不僅免費且功能十分友善。搭配 Gradle 建置設定,讓 IDEA 幾乎可以勝任各類型 Java 專案的開發,從 Spring MVC、GWT 到 Android 等,不再依賴 IDE 提供特別的專案類型設定。

2013年11月19日

解決 Ubuntu 13.10 音量圖示消失的問題

Ubuntu 13.10 音量圖示(volume indicator)會無故消失,造成要調整音量或控制播放器不方便。

解決之道是補裝以下兩個 package。

sudo apt-get install indicator-sound indicator-sound-gtk2

如果有裝卻還是沒圖示,可以重新設定套件。

dpkg-reconfigure indicator-sound
dpkg-reconfigure indicator-sound-gtk2

設定後登出重新進入桌面,音量圖示就會復原。

Review: Functional Programming for Java Developers, Dean Wampler, O'Reilly (函數型程式設計)

Functional Programming for Java Developers

在熟悉結構化與物件導向程式設計後,Java 開發者的學習之路,可以往函數型程式設計(Functional Programming,簡稱 FP)邁進。

過去 Java 開發者比較少接觸 FP,因為 Java API 及多數的 3rd Party Library,都是物件導向的設計,Design Pattern 也是從頭到尾都以 OO 做基礎。

OO 沒什麼不好,它也是目前設計中大型系統必要的方法論,只是在有些情況下,使用 FP 的設計會更好。

作者 Dean Wampler 在第一章,就開宗明義說明 FP 為何更好?主要的原因包括 concurrency 時代來臨,現代連手機都有四核心架構,單一執行緒的程式根本浪費資源。

但是在 OO 世界中做 multi-thread、concurrency、asynchronous,需要有相當經驗的程式設計師,才不會做出效率高但爆炸也快的程式。

舉例來說,List simpleList = new ArrayList(); 很單純地建立一個 List 物件,然後我們也設計標準的 Getter / getSimpleList() 來取得資料。但是試想在多執行緒的世界中,有多個程式同時修改 List 會造成什麼後果?

於是我們看到 Java 創造更多語法來處理同步與非同步,事情變得更加複雜。

另一件 OO 造成的 overhead,是不斷被創造出來的 middleware;很顯然 Object-relational mapping(ORM)就是這麼一回事,為了避免直接使用 Relational Data,讓程式碼更加 OO 且 Type-safe,於是我們不斷創造 Model 去封裝資料,為了簡單的資料存取動作,需要有 Context、EntityManager 等額外的負擔。

我在大學的第一門程式設計課,很幸運地教授不是教我們 Java,而是採用國內比較少見的 Scheme(類似 LISP)程式語言;很早就開始接觸 Functional Programming 的訓練,認識如 High-order procedure 等觀念。

有 FP 的觀念,就更容易理解為何 Java 世界不斷出現 Polyglot 語言;如 Groovy、Scala、Clojure 等,甚至在 JVM 環境寫 JavaScript。這些新語言的出現,直接修正了老舊 Java 的不足,把開發者的期待更直接注入。

老舊 Java 的不足,不是開發社群的新鮮事,像 Lambda / Closure 的特性在 Java 8 終於出現,才慢慢讓 Java 更能支援 FP 的設計。

儘管我們有 JVM Polyglot Language 可用,但許多情況如開發 Android App 或設計基礎 API Library,仍免不了直接面對 Java 語言。

談論 Java Hight Performance 與 Concurrency 的書籍不少;但談論 Java Functional Programming 的書卻有限。這本書的出現彌補了一些缺憾,我們終於有一本合適的 Java 書籍,重新認識不同的程式設計方法論如何解決問題。

從 OO 到 FP 的學習之路需要花上不少時間,所以愈早開始起步愈好。學習 FP 的觀念,並不是讓我們丟掉 OO 的舊程式,然後全部重新用 FP 重寫一次,並非如此。

我常說這是一個流行 Hybrid 的時代,電動車不會馬上取代汽油動力車;但開始設計油電混合車勢在必行。程式設計的世界也是如此,Node 的出現不會讓你丟掉手邊的 RoR、PHP、Java EE 程式碼,但如果必要時不懂混搭 Node 的 Socket IO,肯定會浪費更多自己的時間造輪子。

程式設計的觀念也是相同的,FP 讓你可以用另一種角度思考程式如何設計,就像你需要有 OO 的觀念才能寫好 Java。在可以預見的未來,缺乏 FP 的觀念,可能讓你無法跟上時代演變的腳步。

Buy "Functional Programming for Java Developers" from O'Reilly Book Store


By lyhcode, an article for O'Reilly blogger review program.

O'Reilly Atlas - 來自 O'Reilly 的線上免費學習資源,結合閱讀與出版

我一直很佩服 O'Reilly,從寫書評換取免費看書的 Blogger Review 到包月飽讀的 Safari Books。它在 IT 書籍出版的地位屹立不搖,但仍然一直在創新。

Atlas 是 O'Reilly 的新平台,它目前已經提供一些電子書,包含 Java、Node、HTML5、Git 等主題,而且很大方地將整本電子書內容讓你在線上閱讀不用錢!

Atlas 想做的事情,似乎還不只免費讓人看書:「Atlas is a publishing platform for writing, reading, collaborating, and learning.」它也開始招募作者,透過這個平台做出版。

O'Reilly 似乎不怕它的書「被盜版」,在線上購買的電子書,至少都提供「沒有DRM保護」的 PDF、EPUB、MOBI 三種格式(某些還提供 DAISY 格式)。大部分熱門的 O'Reilly 書籍,只要將書名加上某些關鍵字,就能在 Google 搜尋找到全文電子書。

內容被大量流傳,更說明許多 O'Reilly 出版的書,是被讀者渴望閱讀。

現在由 O'Reilly 來做這些「盜版者」在做的事 --- 「加速一本書在全世界被傳閱的速度」,事情變得更有趣,渴望閱讀的人,不必再透過第三方、看了一堆惱人的廣告才能看到書的內容,而是可以直接從 Atlas 網站線上看書。

作者寫書,其實稿費版稅真的很有限,賺大錢的暢銷作家僅是少數,即使是暢銷作家,走紅後得到的演講通告代言,也遠比書本身賺得更多。

最重要的目的應該是讓「書的內容」被廣為流傳;可惜的是,到了數位時代,數位內容複製成本極低,反而那些理應幫助書流傳的出版社,多數不願意面對改變。

過去我們到書店,能夠免費翻閱大部分的書,從頭讀到尾也沒人阻止你;但是到網路時代,很多時候讀者會被要求只看過書名和目錄,就必須掏錢把書買回家。

盼望 Atlas 能有更多的書上架,讓知識的學習和分享變得更容易!

Atlas Beta - The new learning environment from O’Reilly


2013年11月18日

Ubuntu Linux apt-get 徹底移除套件(purge)的使用方式

使用 apt-get 指令在 Ubuntu Linux 移除套件,通常會有一些設定檔之類的殘留,若要徹底移除則用 purge 指令。

指令一、移除套件(以 NetBeans 為例)

sudo apt-get purge netbeans
sudo apt-get --remove netbeans

上面的兩種指令都會以 purge 清理模式移除。

指令二、移除無用套件

sudo apt-get --purge autoremove netbeans

在移除某些套件後,使用 autoremove 可以把該套件相依的其它套件清除,加上 --purge 參數就會徹底清楚。

指令三、檢查有哪些套件殘留

列出已安裝套件的指令是 dpkg -l,檢查行首是否有 rc 標示,就能判別該套件是已經被移除但還有檔案殘留的項目。

dpkg -l |grep ^rc

將標示為 rc 的套件一次徹底清除。

sudo apt-get purge `dpkg -l |grep ^rc|awk '{print $2}'`

2013年11月12日

NetBeans IDE 開發工具效能調校(記憶體設定篇)

NetBeans 的記憶體預設值在 Java EE 專案開發中經常不足。

設定檔: /Applications/NetBeans/NetBeans 7.4.app/Contents/Resources/NetBeans/etc/netbeans.conf

調整 Xms、Xmx、XX:PermSize 等 JVM 參數。

netbeans_default_options="-J-client -J-Xss2m -J-Xms512m -J-Xmx512m -J-XX:PermSize=128m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true"

其中 Xms 與 Xmx 設定一樣,讓 NetBeans 啟動時就保留 512MB 的記憶體空間,對執行效能頗有改善。

2013年11月10日

Choosing Logging Framework for Java Projects

關於如何挑選 Logging 函式庫,SpringFramework 文件有一段簡單的說明比較。

Logging is a very important dependency for Spring because a) it is the only mandatory external dependency, b) everyone likes to see some output from the tools they are using, and c) Spring integrates with lots of other tools all of which have also made a choice of logging dependency. One of the goals of an application developer is often to have unified logging configured in a central place for the whole application, including all external components. This is more difficult than it might have been since there are so many choices of logging framework.

http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/overview.html#overview-logging


Not Using Commons Logging

*不建議使用 Apache Jakarta Common Logging (JCL)

Unfortunately, the runtime discovery algorithm in commons-logging, while convenient for the end-user, is problematic. If we could turn back the clock and start Spring now as a new project it would use a different logging dependency. The first choice would probably be the Simple Logging Facade for Java (SLF4J), which is also used by a lot of other tools that people use with Spring inside their applications.

Using SLF4J

SLF4J is a cleaner dependency and more efficient at runtime than commons-logging because it uses compile-time bindings instead of runtime discovery of the other logging frameworks it integrates. This also means that you have to be more explicit about what you want to happen at runtime, and declare it or configure it accordingly. SLF4J provides bindings to many common logging frameworks, so you can usually choose one that you already use, and bind to that for configuration and management.

SLF4J provides bindings to many common logging frameworks, including JCL, and it also does the reverse: bridges between other logging frameworks and itself. So to use SLF4J with Spring you need to replace the commons-logging dependency with the SLF4J-JCL bridge. Once you have done that then logging calls from within Spring will be translated into logging calls to the SLF4J API, so if other libraries in your application use that API, then you have a single place to configure and manage logging.

Using Log4J

Many people use Log4j as a logging framework for configuration and management purposes. It's efficient and well-established, and in fact it's what we use at runtime when we build and test Spring. Spring also provides some utilities for configuring and initializing Log4j, so it has an optional compile-time dependency on Log4j in some modules.

2013年11月8日

Compile and Run GWT project with Gradle build tool


Gradle Build Config for GWT
http://lyhcode.org/GradleGWTSample/

Google Web Toolkit (GWT)預設使用 Ant 建置專案,在 GWT SDK 內建的 webAppCreator 指令,建立新專案時,就會自動產生 build.xml 設定;在 GWT Project 網站中,建議搭配 Eclipse + GWT Plugin 開發。

另一套著名開發工具 NetBeans 也對 GWT 有良好的 Plugin 支援,只要裝好 GWT4NB 就能建立 GWT 專案,並提供基本的 Development Mode 執行功能。

不過這類搭配 IDE 工具開發 GWT 的作法,相當程度地依賴 IDE 的建置功能;但是使用 Ant 又太過麻煩。

目前發現最佳的作法似乎是 Gradle,雖然目前幾個 GWT Plugin for Gradle 都已經是閒置狀態;但其實 Gradle 不必使用 Plugin 就能很方便地建置 GWT 專案。

GradleGWTSample 目前搭配 GWT 2.5.1 版本,已經可以執行基本的 gwtc 與 devmode 指令,這是一個 Gradle + GWT 的使用示範;我不打算將它開發成 Plugin 形式,因為維護成本高而且不太有必要。

使用 Gradle + GWT 可以得到幾個好處:
  1. 免自行下載 GWT SDK,只要在 build.gradle 定義版本代碼即可。
  2. 集中的 Dependency Management。
  3. 搭配 Gradle 幾個常見 Plugin,例如打包成 WAR 檔或搭配 Jetty 測試。
lyhcode by lyhcode
歡迎轉載,請務必註明出處!