Me唱歌看書研究,程式小說新詩。搞了個Blog和古文網站,寫些亂七八糟及翻譯文章,玩些小程式和中文化。可惜時間美好人生苦短,沒法一一盡善。夢想是開間小 pub,放喜歡的音樂,喝自己調的酒。

noIE.png 針對 css 支援極差的 IE 可能會無法正常瀏覽本站,強烈建議 Mozilla Firefox

本站連結圖示與 Feed:
rss.gif atom10.gif
smalllogo.png

支援標準:
xhtml10validated.gif cssvalidated.gif
rss_valid.gif atom_valid.gif

本站架構:
firefox.png thunderbird.gif
openoffice.png postgresql.gif
spring.png ubuntu_button.gif

網路運動:
Sticker Map GeoUrl
Fight Spam! BlogLook

聯播、訂閱、書籤:
Oui Blog Bloglines
NewsGator Del.ico.us

天下雜誌台灣不願面對的真相貼紙

本站授權規範:
cc.gif
Creative Commons License
請參閱網頁下方之版權說明

Powered By Sylphie 0.1a

2010-04-25 01:54:11.171

[翻譯] JDK 7 特色中譯

時序已來到 2010 年,距離發佈 JDK 7 的時間越來越近。預計今年秋季釋出的 JDK 7 正式版中到底有哪些新功能呢?底下翻譯了 OpenJDK 網站上所公佈的 JDK 7 Features,在正式版來臨前先一睹為快吧!


本文是 Oracle 和其他組織為 JDK 7 所開發的功能列表。

當 Java SE 7 平台的 JSR 送交時,這些功能會在其中被薦舉,除了那些列為 VM 層級或與實作相關的功能。

摘要

功能大致依序排列,從整體 JDK 中的最底層到最高層。

分類項目
虛擬機器64 位元物件指標壓縮
垃圾優先的 GC (G1)
JSR 292:非 Java 語言的 VM 支援 (InvokeDynamic)
語言JSR 294:模組編程的語言和 VM 支援
JSR 308:Java 型別上的標註 (Annotation)
JSR TBD:語言的小改進 (Coin 專案)
JSR TBD:Lambda 專案
核心模組化 (Jigsaw 專案)
升級類別載入器架構 (class-loader)
可關閉 URLClassLoader 的函式
Unicode 5.1
並行性和容器的更新
JSR 203:更多 Java 平台上的新 I/O API (NIO.2)
SCTP (串流控制傳輸協定)
SDP (Sockets Direct Protocol)
橢圓曲線密碼學 (ECC)
客戶端Java 2D 的 XRender 管線
6u10 部署功能
為 6u10 圖像功能建立新的平台 API
Swing Nimbus 界面外觀
Swing JLayer 組件
Web更新 XML 堆

曾經計劃過但稍後卻被摒棄的功能會列在本頁最底端。

虛擬機器

64 位元物件指標壓縮

將 64 位元指標壓縮成 32 位元的技術,可減少記憶體和其頻寬的耗用,從而增進整體效能 (VM 層級的功能)。

連結:Wiki

垃圾優先的 GC (G1)

新的垃圾收集器。它保証會比現有的 CMS 收集器還花費更少的暫停時間,以及擁有更佳的可預測性 (VM 層級的功能)。

連結:ISMM 2004 paper摘要

JSR 292:非 Java 語言的 VM 支援 (InvokeDynamic)

VM 支援非 Java 語言的實作品,可讓它們的效能直逼 Java 語言本身的效能。

連結:JSR 292專案頁面Wiki郵件清單

語言

JSR 294:模組編程的語言和 VM 支援

針對 Java 語言及 VM 規格的加強,使其支援模組編程,不管是編譯時期或執行時期。

連結:JSR 294郵件清單

JSR 308:Java 型別上的標註 (Annotation)

擴充了 Java 標註語法,允許它出現在每次使用型別時。

連結:JSR 308專案頁面詳細專案頁面

譯註:目前標註僅能使用在標註宣告、Package 宣告、型別宣告(包括類別、介面、列舉等宣告)、欄位宣告 (包括列舉常數宣告)、建構子宣告、方法宣告、參數宣告、和區域變數宣告上。此項改變可使得標註能出現在每次型別和型別參數出現時,以及其他地方。例如:

  • interface MyList<@ReadOnly T> {} // 型別參數
  • myStr = (@NonNull String) myObj; // 型別使用
  • List<@NonNull Integer> myList; // 型別使用
  • void read() throws @Critical IOException {} // 型別使用
  • @Readonly Document [] [] docList1 = new @Readonly Document [1][2]; // 陣列
  • Document @Readonly [] [] docList2 = new Document @Readonly [1][2]; // 陣列
  • Document [] @Readonly [] docList3 = new Document[1] @Readonly [2]; // 陣列
  • new @Interned MyObject(); // 建構子呼叫
  • public String toString() @ReadOnly { … } // 函式接收者

JSR TBD:語言的小改進 (Coin 專案)

一些語言上的小變化,目的是為了簡化一些常見的、例行性的編程工作。

連結:專案頁面郵件清單

JSR TBD:Lambda 專案

提供給 Java 語言的一級函式、函式型別和 Lambda 表達式 (非正式地說法是 Closure)。

連結:專案頁面郵件清單

核心

模組化 (Jigsaw 專案)

一個與實作相關、簡單、低階的模組系統,它側重於模組化 JDK,以及該系統的應用程式到 JDK 本身。

連結:簡介專案頁面郵件清單

升級類別載入器架構 (class-loader)

修改 ClassLoader API 和實作品,以避免在非階層式類別載入器的拓撲結構中發生死結。

連結:摘要

可關閉 URLClassLoader 的函式

提供一個方法來釋放被 URLClassLoader 所持有的潛在資源,像是已開啟的檔案。

連結:摘要API

Unicode 5.1

Unicode 的支援版本升級到 5.1。

並行性和容器的更新

一個輕量級的分岔/接合框架、一般化的關卡 (barrier) 和佇列、一個並行性參考的 (concurrent-reference) HashMap、和可控制細粒度讀寫順序的柵欄。

連結:概觀APIWiki

JSR 203:更多 Java 平台上的新 I/O API (NIO.2)

新的 API,包括檔案系統存取、可調整的非同步 I/O 操作、Socket 通道綁定和組態、以及多點廣播的資料訊息 (multicast datagrams)。

連結:JSR 203專案頁面訪談談話影片java.net 文章

SCTP (串流控制傳輸協定)

Solaris 上一套與實作相關的串流控制傳輸協定 API。

連結:專案頁面郵件清單

SDP (Sockets Direct 協定)

Solaris 上一套與實作相關的 Sockets Direct 協定 API。

橢圓曲線密碼學 (ECC)

標準橢圓曲線密碼學演算法的可攜式實作品,使得所有 Java 應用程式都可以應用。

客戶端

Java 2D 的 XRender 管線

基於 X11 XRender 擴充上的新 Java2D 圖形管線,它可存取大部份現今 GPU 的功能。

6u10 部署功能

從 6u10 版本而來的實作相關部署功能:新的 Java Plug-in、Java 核心、Java Quick Starter、和相關的安裝程式功能。

為 6u10 圖像功能建立新的平台 API

為 6u10 版本中原先已實作的功能建立新的平台 API:半透明和變形視窗、重量級/輕量級混合、以及增強的 AWT 安全性警示。

Swing Nimbus 界面外觀

Swing 裡下一代跨平台的界面外觀。

連結:專案頁面

Swing JLayer 組件

新增 SwingLabs JXLayer 組件裝飾器至平台中。

連結:JXLayer 專案

Web

更新 XML 堆

升級 JAXP、JAXB、和 JAX-WS API 到最新近的穩定版本。

已摒棄

JSR 296:Swing 應用程式框架

一套 API 可定義典型 Swing 程式的基本結構,從而消除許多樣板程式碼,並提供大為改善的初始開發者經驗。

連結:JSR 296

Swing JDatePicker 組件

新增 SwingLabs JXDatePicker 組件至平台中。

連結:JXDatePicker API

最後更新:2010/2/9 13:31 -0800

2008-04-30 13:52:27.343

在 Windows 的 Eclipse 中撰寫 Python 程式 (2) - 在 Eclipse 中安裝 PyDev

安裝好 Python 之後,就可以在命令提示字元的視窗中輸入 python 來執行 Python 程式(前提是有先設好 PATH 變數)。當然如果我們要撰寫大量的程式碼時,使用文字編輯器或編譯器會是比較好的方式。下列介紹如何使用 Eclipse 來撰寫 Python 程式。

Eclipse 是一套知名的 Java 程式編譯器,它有著許多豐富的外掛程式。其中一項名為 PyDev 的外掛程式可以讓我們在 Eclipse 中撰寫並編譯、執行及除錯 Python 的程式碼。你可以直接到 PyDev 的下載頁面 來下載,目前的版本是 1.3.15,支援 Eclipse 3.3、Python 2.3.x or 2.4.x。
2.png

我們使用的從 Eclipse 中直接安裝 PyDev,如此一來如果日後有新版本的話,那麼直接在 Eclipse 中更新即可,比較方便。開啟 Eclipse 後點擊選單「Help」/「Software Updates」/「Find and Install...」。在跳出軟體安裝的視窗後,我們選擇「Search for new features to install」圓鈕:
11.png

點擊「Next」按鈕後,接著就是要新增軟體安裝來源的網址。首先點擊「New Remote Site」按鈕,並填入 Name: PyDev、URL: http://pydev.sourceforge.net/updates/,接著按下「OK」按鈕,此時我們已經成功新增一筆安裝來源網址了。在確認「Site to include in search:」清單中 PyDev 項目有打勾之後,按下「Finish」按鈕:
12.png

按下「Finish」按鈕之後 Eclipse 會連線搜尋(請確定電腦是否能順利上網),接著會出現搜尋結果視窗。此處僅需要勾選「PyDev for Eclipse 1.3.15」項目,其他的都不用勾選:
13.png

選擇「Next」之後,便開始 PyDev 的安裝過程。第一步會先有版權宣告:
14.png

第二步是選擇安裝目錄。當然此處我們都是直接點選「Finish」按鈕,因為預設它會直接安裝在 Eclipse 的目錄下:
15.png

第三步開始下載 PyDev 套件:
16.png

第四步下載完成後,Eclipse 會跳出確認視窗,詢問你是否真的要安裝此一套件。此處直接選擇「Install」:
17.png

第五步正式安裝:
18.png

第六步安裝完成,Eclipse 會提示你要重新啟動程式才可以跑 PyDev:
19.png

重開 Eclipse 後,我們就可以開始寫 Python 程式了。中間為程式碼區塊、左方為專案及檔案目錄的樹狀架構區、右方為程式碼摘要,以及下方為程式執行結果、搜尋結果、待辦事項、程式碼片斷清單、伺服器管理等小工具面板:
20.png

2008-04-29 18:59:03.359

在 Windows 的 Eclipse 中撰寫 Python 程式 (1) - 在 Windows 中安裝 Python

本篇是和 MaxChu 約好要發表,可是一直遲遲沒有生出來的文章。話說 MaxChu 同學,我發了這篇之後,你也差不多該把在 Eclipse 上玩 GWT 和外掛的文章寫一寫了 XD

要想在 Windows 的 Eclipse 上玩 Python,首先要安裝好 Python (廢話~_~)。先連到 Python 的下載頁面,尋找 Python 2.5.2 Windows installer 的連結來下載 Windows 安裝程式。
1.png

下載完成之後,就可以點擊 python-2.5.2.msi 來安裝了,此處我們選擇「Install for all users」來讓電腦上的每個使用者都可以使用 Python:
3.png

接下來選擇安裝目錄。一般來說都是建議使用預設目錄,不過我個人偏好安裝在其他磁區的英文目錄之中,並且該目錄不含有空白字元。不使用中文目錄或含有空白字元的目錄的原因是為了預防少數可能會發生的路徑錯誤問題。當然這只是我個人的想法,實際上目錄名稱中含有中文字或空白字元或許對執行 Python 不會造成任何問題:
4.png

選擇目錄之後,可以決定要安裝哪些功能,這邊可視情況調整欲安裝的功能。我選擇的是全部安裝:
5.png

接著程式就會開始安裝:
6.png

安裝完成:
7.png

開啟命令提示字元的視窗,切換到安裝目錄下,輸入 python 之後就可以開始寫程式了:
8.png

如果想要在任何目錄下都可以執行 python 的話,別忘了到「控制台」/「系統」/「進階」分頁/「環境變數」中,把安裝目錄加到 PATH 變數中。

2007-10-24 17:25:30.765

Spring Framework 2.5 RC1 釋出

Spring Framework 團隊日前釋出了 Spring Framework 2.5 RC1 (候選版本),這意味著正式版在不久的將來中發表。此版中有許多重大的更新和改進,包括:
  • 完整的 Java 6 及 Java EE 5 支援 (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0 等等)
  • full-featured annotation-driven dependency injection (including support for 'qualifiers')
  • 支援在類別路徑 classpath 中掃描組件 (自動偵測已評註的類別 (annotated classes))
  • bean name pointcut element in AspectJ pointcut expressions
  • 內建 AspectJ 載入時間時嵌入的支援 (基於 LoadTimeWeaver 抽象化)
  • 先進的 XML 組態命名空間 ("context", "jms")
  • 完整改寫整合測試的框架 (針對 JUnit 4 及TestNG 的支援)
  • 新的 Servlet MVC 和 Portlet MVC 的 annotation-based 控制器風格
  • 延伸 SimpleJdbcTemplate 的功能性 (支援已命名參數等等)
  • 官方認證的 WebSphere 支援 (支援 WebSphere 6 UOWManager)
  • Spring framework jars are shipped as OSGi-compliant bundles out of the box
  • Spring ApplicationContext 可配置為 JCA RAR 檔 (for headless application modules)
  • JCA 1.5 message endpoint management (for Spring-managed JMS and CCI message listeners)
相關連結:
2007-05-29 15:11:02.812

[感想]寫程式到底需不需要懂數學?

本篇原是發表在Mr./Ms. Days - 網路, 資訊, 觀察, 生活 - 寫程式到底需不需要懂數學?的迴響,我將它稍稍整理一下後重貼如下:
寫程式超過十年,一直很高興自己是數學系出來的,而不是資工本科系出來的。為什麼?

每當我要寫程式時,我腦中自然就會浮現出能簡化步驟,加快效率的方法和定理;我同時能擁有「將問題化成數學題目和演算法」的能力,以及「將數學演算法寫成程式」的能力。有些人說寫程式不用數學,我倒不這樣認為。只要你的程式中含有「邏輯和演算法」的話,那基本上就已經牽涉到數學了。我認為大家在爭論的,是「到底數學應該要用得深還是不用太深」、「只需要基本用法,還是要儘量多用進階技巧」。

寫程式,多多少少都會用到數學,除非你的程式是只在螢幕上印出 "Hello world!" 之類的簡易程式,沒有「邏輯和演算法」可言。不過只要一碰到演算法,效率好的演算法和效率不好的馬上就可以區分出來。之前很紅的「The art of programming」、「The pearl of programming」、「C 精選名題100題」等等的書,仔細翻開來看,裡面在說的,不就都是數學嗎?問題只在於,你想要用在程式裡的,是哪一種演算法?是快的那一種,還是慢的那一種?或者是適合的那一種?

一個從 1 累加到 n (n>1) 的整數運算式,用 for 迴圈累加起來求解,其實就已經是數學,是一種演算法了,只是顯得毫無效率,直接改用梯形公式就可在 O(1) 解決。跑一個 20^1, 20^2, ..., 20^n (n>1,n為正整數)各除以 p (p為正整數)之後,所餘下的各個餘數為何,你可以用 for 迴圈來把每個 20^k 的項次展開 (pow()) 後再去除以 p 求解,當然得花上你 O(n^2) 的時間,並且還要處理長整數數值溢位的可能,但若直接改用模數運算來跑全部,可在 O(n) 內解決,並且不會有長整數溢位的困擾。平平一樣都可以求出解法,但是在效率上自然有差別。

想用到那一種程度的數學,端看需求而已。一千筆資料的「找出某筆資料修改後重新排序」、「每頁任意n筆的動態有序分頁」、「相互交叉比對求得最符合查詢條件的資料之排行榜」、「分析並建立語詞、語義索引資料庫」…等等,有一千筆時的做法,一千萬筆則有一千萬時的做法。需求不同、時程不同,條件不同,硬體不同,而所用的演算法也不一定相同。在不同的地方,選擇適合的方式下去做。有些雞肋的小地方,也不用執著於用牛刀來殺。

另外,有關於邏輯的部份。數學系在 1+1=2 都得先證明它是正確的以後 (需要用到多個定理),我們才敢去用它來計算,也因此我們才敢說:「是的,九九乘法表是正確無誤的,因為我們可以證明 3*2 => 3+3 的確會等於 6」。每一個運算子,每一次計算,我們都必需要小心地去用邏輯推理。a*b 並不恆等於 b*a (你必須先知道 a, b 元素和其 * 運算子的定義,才能證明),c 也不一定等於 c+0 (同樣,你得先知道 c 元素, 零元素 和 + 運算子的定義)。我們用嚴謹的邏輯去推理,去思考,我們才能真正的說:梯形公式的確比for迴圈累加快、模數運算的演算法的確比各項各自展開後再求來得快。

邏輯論、數論、集合論、圖論、離散數學、演算法、資料結構、網路架構,其實骨子不都是數學嗎?Google 或其他知名大公司的面試考題,不是也有很多題目是和邏輯及演算法相關的?如果寫程式不需要較深、較進階的數學的話,那麼何必要用這些題目做為考題呢?

多學會一種技巧,並不會讓你的刀劍變鈍,反而會讓它更加鋒利和光亮。你的程式裡可以不需要用到複雜的數學,而使用簡易的方法,完全取決於你想要你的程式如何運作。但是要注意,在程式的撰寫從 DOS 的單工、其他作業系統的多工、多執行緒、多核心平行處理,一直演化到後來的網路分散式架構時,或許用更宏觀的角度來對待程式撰寫,可以讓我們的程式更具有競爭力和效率,也可以讓我們程式設計人員本身有更寬廣的心,以及具有更高的專業價值。

至今我仍然很慶幸,當初毅然在資工大二時,轉唸應用數學的決定。

2007-03-21 10:52:35.953

舊作 - Sun JavaServer Pages Technology FAQs 中文翻譯

其實是很久以前翻譯的問答集 (FAQs),只是一直都是放在其他的網站上。因為目前決定將該網站關閉,所以文章就移過來此處。FAQ 英文版位於 http://access1.sun.com/FAQSets/jspfaq.html ,官方早已不在更新。此次轉移過來時我針對文章一部份的內容及鍵結做了一些更新,並刪除掉早已過時的資訊。

注意:本 FAQs 只是極簡易的問答而已(官方設定),只適用於初窺門徑的新手。

2007-01-21 18:17:17.0

ZDI 公佈 Java 臭蟲

Java Runtime Environment(JRE) 中發現一隻臭蟲,會使得當使用者造訪懷有惡意程式碼的網站時遭到攻擊。對此昇陽已經發佈更新程式。

昇陽表示:「舉例來說,Applet 可以提高自身的權限去讀寫本地端的檔案,或以未獲信任的 Applet 身分去執行應用程式。」

這隻臭蟲是 GIF 影像元件造成的,它由 Zero Day Initiative (ZDI)發佈 。公告內文說:「當一個合法 GIF 檔案的影像區塊寬度為 0 時,JVM 會為其配置指定的大小,並隨後複製所有資料到已配置的記憶體區塊。此一溢位導致參照的誤用,並因此能執行任意的程式碼。」

ZDI 在六月時已通知昇陽此一問題。

此臭蟲影響範圍為 JDK、JRE 5.0 Update 9 及其之前版本,JDK、JRE 1.4.2_12 及其之前版本,JDK、JRE 1.3.1_18 及其之前版本。請至此處下載最新版本的 JDK 及 JRE。

消息來源:Java WorldJava brews critical bug

2006-12-12 10:12:38.687

Java SE 6 正式現身

等待了許久,令人引頸期盼的Java SE 6終於在今天釋出正式版,現在已經可以從下載頁面取得Java SE Development Kit 6 (簡稱JDK 6)了。目前在下載頁上看到 Windows, Linux, Solaris SPARC (包括 32-bit 和 64-bit), Solaris x86, Solaris x64, Linux x64 及 Windows x86 等平台可供選擇。你可以直接點選檔案名稱來下載,例如點選「Windows Offline Installation, Multi-language」下載 jdk-6-windows-i586.exe 檔案;或者一次勾選數個想要下載的版本,並選擇「Download selected with Sun Download Manager」來使用 Java Web Start 下載。它的好處是可以隨時暫停、續傳、重新開始、辨正檔案、多檔下載等等,有興趣的人可以玩玩看。(其實我本來想介紹的,但是這篇的重點是 Java SE 6,所以還是不要偏離主題的好~_~)

本次 Java SE 6 新增和加強了不少地方的功能,值得寫篇文章來好好介紹一番。此處我先簡短介紹幾個比較有趣的改進,日後有時間的話再另行闢文。Java SE 6 特色如下:

Collection 架構

  • 新增 Deque 介面:支援兩端插入及刪除節點的佇列。
  • 新增 NavigableSet 介面:繼承自 SortedSet 且功能更強大,是屬於「可導覽」的集合。它提供了有如下方法:
    • descendingIterator() 遞減迭代,descendingSet() 遞減集合,即集合本身的反向集合
    • headSet(E e), tailSet(E e) 前段集合及後段集合,即在順序中位於某物件 e 之前/之後的元素所形成的集合
    • lower(E e), floor(E e), ceiling(E e), higher(E e) 高斯函數,即和某物件相比後最接近此物件的元素,相比方法依序為 <, <=, >=, >
    • 另還有 NavigableMap 介面,和 NavigableSet 的概念大致雷同,只是用在 Map 上而已
  • 新的 ArrayDeque 類別及原有 LinkedList 類別:實作 Deque 介面。
  • TreeSet 及 TreeMap 類別:各自實作 NavigableSet 及 NavigableMap 介面。

Swing 及 Java 2D

  • 增進 Windows 外觀與視覺 (Look and Feel) 效能,使用微軟 API 來繪製部份組件,並確保每一組件有正確的外觀和行為。
  • 在 Linux GTK 部份則是使用 GTK API 囉,這裡也做了和 Windows 部份類似的加強。
  • 對 OpenGL, DirectX 效能上的增進。
  • 改進拖放支援。原先「拖拉 Drag」的結果無法如使用者所預期般操作,而「放開 Drop」的支援很陽春且難以自訂。因此本次針對 Drag-and-drop gesture (拖放手勢) 做了很大的改進。現在我可以在 JTree 或 JTable 中把元素上拉下拖,藉以把它擺放到新的位置了。這對搬移目錄檔案或自訂清單的物件順序來說真方便
  • Double buffering (雙重緩衝) 這次終於是玩「真」的了,效能比之前的雙重緩衝要快上不少。
  • JTable 可以排序和篩選了,這真是謝天謝地,終於可以不用在茫茫的無序 Rows 海中找資料,也不用在塞資料到 JTable 前做排序的動作了,現在可以直接點每個直欄最上方的「欄位名稱」來排序了,當然它是可以遞增排序和遞減排序的。
  • 好用的 SwingWorker,搖擺工人 (呃 這是我個人一廂情願的中文直接意譯法) 幫你解決執行緒和 Swing 的事情。
  • JTabbedPane 支援其他組件的 tab 分頁。以前 tab 分頁標籤中只能使用字串和圖示,無法加入其他組件。所以像是 Mozilla Firefox 的分頁有個紅色小叉叉在每個分頁旁,讓你可以點了之後關閉分頁的事情是做不到的,因為我們沒辦法把按鈕放進去。不過現在你可以做得到了。
  • Java 2D 在 Windows 上有更多及更好的圖形硬體加速了。
  • 加強了文字的顯示品質,反鋸齒的效果出現!
  • 程式啟動圖片。執行 Word, Excel 時會先跳出一個小方框畫面,過了幾秒之後它會消失不見,然後再是真正的程式本體出現,對吧?羨慕嗎?也很想要讓自己的視窗程式也有這樣「程式啟動圖片」的功能嗎?請下載 Java SE 6 吧。 (不過話說其實 Apache Ant 也有這個功能,只需在 build.xml 中加上一個 task 並指定圖片。沒記錯的話是 <splash> tag 的樣子,不過現在 Java 直接支援,不用透過 Ant 來偽裝了。)
  • 支援「圖示前進到啟動列」功能。玩 MSN 時會在螢幕右下角、工作列的常駐程式區看到一個小綠人的圖示吧?或是網路連線之後會在同樣區域有個兩台電腦在一直眨眼的圖示吧?Java 程式的圖示現在也可以前進到那邊去了。寫個看起來是「音量控制」的圖示,實際上卻是自製的小型瀏覽器,專連 Web MSN Messenger 網站的聊天程式吧!
  • 更漂亮的介面。在外觀上要漂亮許多,比以往的介面好看。如今 Java 的桌面應用程式也慢慢脫離了以前醜小鴨的宿命了啊~ (那請問是變成了比較大隻而且已經十歲的醜小鴨嗎?……(狂毆))。想想當年的日子,還真是感嘆令人唏噓不已啊……(煙)。
  • ImageIO:GIF writer。(感謝上帝,賜予了這個新功能)
  • 延伸了 SpringLayout。就是加了一些常數欄位讓你的 Swing 版面配置更隨心所欲,讓你更 Spring。

Java IO

  • 新的 Java.io.Console 類別:顧名思義,就是用來存取 console 的類別,提供的方法有:
    • flush() 輸入至 console
    • format() 輸出已格式化過的字串,printf() 嗯,輸出格式化字串
    • readLine() 一次讀一行,這真是太好了、readPassword() 讀取密碼,等好久,終於來了
  • File 的新方法:
    • getTotalSpace() 取得目前磁區的容量
    • getFreeSpace() 取得目前磁區的未配置容量
    • getUsableSpace() 取得目前磁區可使用的容量,檢查了有關寫入權限和一些作業系統的限制,例如像是配額限制 (quota)
    • setWritable(), setReadable(), setExecutable(), canExecute() 設定有關讀、寫、執行檔案的權限
  • 在 nio 上也有一些改進。

JConsole

  • 在 Java SE 5 中就出現的 JConsole,本次可是官方正式認可的支援了。
  • 支援 JConsole 外掛系統。
  • 動態附加的能力。可以將 JConsole 連線到任一個有支援動態 Attach API 的程式。
  • 加強了使用者介面,使其更方便存取。(我用過的結果認為:比 Java SE 5 的 JConsole 要好上一些了)
  • 新的「概觀」分頁和「摘要」分頁。概觀可以讓你一次看四張圖,摘要的資訊也略有改善。不過我個人認為那個字型應該要挑個好看點的。噗。
  • 把玩 MXBean 更方便了。就是管理 MXBean 的分頁有改進了,我個人覺得是還可以啦。

新的標準

  • JAXB 到 2.0,又是一堆 annotation 玩不完了。
  • 在 JDBC 上有許多重要的改進和更新 (JDBC 4.0)。
  • 寫 WebService 更簡單了。請用 annotation: @WebService 和 @WebMethod。
  • 提供標準 java.util.spi 支援 (Service Provider Interface)。
  • 提供 Array Reallocation API。
  • 新的 javax.script 套件:支援動態描述性語言 (script language)。把 JavaScript 放進 Java 來玩吧!
  • 支援 Java Compiler API。也就是在 Java 程式中編譯 Java 程式。
插個話:老實說我個人對 Script 和 Compiler 這兩項支援還滿有興趣的,因為我六七年前曾經很迷 Mud,那時還在一些 Mud 站台中擔任大神撰寫程式,使用的是 LPC 語言。它可以動態更新物件,也就是說我在 Mud 遊戲之中使用 edit 指令來進入一個簡單的編輯器 (類似 Linux 上的 ed),然後編輯某個房間物件的檔案 (例如改個參數,放隻怪物)。存檔之後,我只需要用 rehash 指令來更新這個已修改過的檔案,那麼在遊戲中這個房間的參數就會立即套用,新怪物馬上出現。Rehash 在做的事情就是將原本的 object 從原本的程式載入器 (相當於 Java 的 ClassLoader) 中清除,然後再重新載入該物件,而現在 Java 用這兩個 API 應該是可以很方便地來撰寫 Mud 和除錯了。試想看看,對於 24 小時在運行的網路遊戲程式,許多問題都是在使用者數量一多之後才浮現的,這時總不能要大家下線、編譯並重啟遊戲、大家上線、測試 bug 有沒有修復、沒修好就再重來一次……。唔,該是把多年前自己埋頭苦寫的 Jos Mud 再拿出來玩的時候了嗎?…(毆)

其他

  • 新的 Desktop 類別,可以和去啟動關聯程式。它有如下的方法:
    • browse(URI) 用系統的預設瀏覽器來開啟 URI
    • edit(File) 開啟 File 的關聯程式來編輯
    • mail(), mail(URI) 啟動預設信件軟體來「撰寫新郵件」
    • open(File) 使用 File 的關聯程式來開啟 File
    • print(File) 列印檔案
  • Unicode 正規化,還有對 ResourceBundle 也做出了延伸。
  • OutOfMemoryError 的診斷更人性化了,至少比之前的一句真言「java.lang.OutOfMemoryError」要好得多了。
  • MBean 描述子內容改用泛型聲明支援。現在我們可以用 @MXBean 來撰寫監視及管理的物件。還有 @DescriptorKey 可以玩。
  • 支援 XML 數位簽名。
  • 同樣地,許多在安全性上的支援。 (我手有點酸了 ~_~)
就先介紹到這邊吧。各位 Java 愛好者心動了嗎?快去下載來玩玩吧。

話說有人和我說他對可怕的 < > @ 還沒搞定,沒想到 Java SE 6 就出來了,這個世界的變化真的是好快。不過我個人是認為,有人喜歡在安定中求穩步發展,有人喜歡追逐最新的規格和變化,這是每個人都有權利去自行選擇的。我覺得不論是屬於那一種,更重要的是身為一個程式設計師,應該都要有熱情的編程態度、認真的研究精神、嚴謹的規劃設計、耐心的除錯追蹤、靈活的清晰思維,以及永遠的不斷創新。你說呢? :)

2004-07-04 01:09:34.117

Java 3D Desktop

Project Looking Glass 幾日前已釋出,版權為 GPL。環境需求為 2G CPU 和 512MB RAM,並且要有支援 OpenGL 的顯示卡,使用 24 位元色。目前我已經將所有需要的檔案全下載完畢,並且都安裝好了,甚至連 Screenshot 和中文安裝說明都寫的差不多了,但是在我的 Mandrake 10 下就是跑不出結果,無法享受到 Looking Glass 的感動。目前我仍在除 Bug 中,不知是 Gnome 還是我的顯示卡有問題。希望能早日順利啟動。
2004-03-13 14:48:26.445

Fast PartitionsP(n) Program 數字拆解

最近在複習數論和微分方程時,正好想到 yoshi 之前有寫過一個數字拆解的程式。當時稍為研究了一下,不過因為忙專案,所以就沒再繼續下去。現在剛好有點閒時間,就把問題重新思考一遍。數字拆解的意思是一個正整數 n 可以有幾種相加的方法。例如 2 = 2 + 0 = 1 + 1,有兩種加法、3 = 3 + 0 = 2 + 1 = 1 + 1 + 1,有三種拆解法,因此類推下去:

3 = 3 + 0 = 2 + 1 = 1 + 1 + 1
4 = 4 + 0 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1
5 = 5 + 0 = 4 + 1 = = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1

令 f, g 為兩函式, f : N -> N, f(n) 的值是 n 的拆解總數,g(i,j) 的值是用小於等於 j 的數字來拆解 i 的結果總合,則:

f(n) = Σg(i,j) , where 0 <= i < n and j = n - i

也就是說:

f(3) = g(2,1) + g(1,2) + g(0,3)
f(4) = g(3,1) + g(2,2) + g(1,3) + g(0,4)
f(5) = g(4,1) + g(3,2) + g(2,3) + g(1,4) + g(0,5)

g(3,2) 就是用 2 以下的數字來拆解 3 的總合。從上述中我們知道總共有兩個可能,分別是 2+1 和 1+1+1,因此 g(3,2) = 2。另外以 g(1,3) 來說,用 3 來拆解 1 是沒有意義的,同樣用 2 也是,所以 g(1,3) = g(1,1),也用是用 1 以下的數字拆解 1,只有一種結果:1+0,所以 g(1,3) = g(1,1) = 1。由此可知,上述等式會變成:

f(3) = g(2,1) + g(1,1) + g(0,0)
f(4) = g(3,1) + g(2,2) + g(1,1) + g(0,0)
f(5) = g(4,1) + g(3,2) + g(2,2) + g(1,1) + g(0,0)

f(n) = Σg(i,j) , where 0 <= i < n and j = min(n-i, i)

當我把 f(1) 到 f(20) 各項數字以類似二元樹的方法排列出來後去剖析,發現在二元樹左半部的分支部份其實是很穩定在成長的,而右分支的部份比較浮動。既然左分支的數字很穩定,那麼我就把左分支的資訊儲存在一維陣列中,長度為 n+1。更重要的是,左分支的數正好依序是 f(0) 到 f(n/2) 的值!因此左分支就不用再煩惱了,我只要把每個介於 0 到 n-1 的數字拆解結果算出來,那麼左分支的值就自動會出現。右分支的部份比較浮動,因此我使用二維陣列來儲存,大小是 (n-6)*(n-5)/2。在空間上差不多是 n+1 + (n^2-11n+30)/2。在右分支的計算上,原本是還要遞迴地去計算 g(3,2) 的值,但是我的右分支所儲存的資訊並不需要重複計算,只需要拿已經計算好的數值繼續累加上去就可以了,這使得計算的時間從 O(n^3) 大幅降低到 O(n^2) 以下。這種差別有點類似以下的例子:

最後的結果,重複計算 100 次所花的時間為 30 ms,跑 1000 次約為120 ms,跑10000 次約為 1050 ms。所以每跑一次差不多介於 0.1 ms ~ 0.3 ms 之間。另外全部計算完畢後,serie 陣列中所儲存的資訊就是各個數字拆解的結果,所以從 1 到 100 中每個數字拆解也都一併計算完成了。

數字分解程式:

Definition:
PartitionsP(n) gives the number p(n) of unrestricted partitions of the integer n. I parsed the result from 1 to 20, and listed all in the form of binary tree. Then I found that the numbers of left side increase stably. So I wrote this program in Java to count PartiotionsP(n).

Page: 1 2 Next >