Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4


          本文部分內容和靈感來自eclipse.org網站,特此聲明。更多內容,請參考:

          http://eclipse.org/articles/Article-SWT-Design-2/SWT-Design-2.html

           

          由于SWT直接跟操作系統打交道,所以我們需要在處理系統的圖形資源時格外小心,以免不必要的資源泄漏。所幸SWT提供了很好的資源管理機制,我們絕大多數情況下需要做的只是確保兩條原則:

          第一條原則 誰分配誰銷毀

          第二條原則 父控件銷毀的同時銷毀子控件

           

          下面我們分別來看一看這兩條在實際中是如何體現的。

          先看第一條原則。乍一看這似乎是廢話,但是在實際中往往并非那么簡單。首先,構造方法不等于分配資源,實際上分配資源可以發生在一個類中的任何地方以及一個對象生命周期的任何時候,只要你的代碼告訴操作系統這樣做。你必須保證所有由你分配的資源當你不再使用時調用其dispose()方法;同時你也必須保證所有不是由你分配的資源不要隨便調用其dispose()方法,否則很可能會影響到實際分配的那段相關代碼的正常工作。好消息是,為了明確和簡化這第一條原則所規定的分工,SWT在設計之初就確定下來,所有基于系統資源的SWT類都在其構造方法中完成所有所需的資源分配,在其他方法中則沒有任何分配系統資源的動作,所以我們可以幸運的這樣看待SWT的資源管理:如果你調用了某個SWT類的構造方法,那么就由你來調用其dispose()方法釋放資源;如果你沒有調用某個SWT類的構造方法,即便你使用了這個類的實例,也不應該由你來調用其dispose()方法。就是這么明確。

          比方講,你new了一個Font對象,那么當你不再需要它時,就應該調用dispose();如果你通過某個控件的getFont()方法取得一個Font對象并使用后,你不應該去銷毀它,而應該交給那個具體的控件去處理。

          對于第二條原則,SWT有一個很好的機制去支持它,那就是,所有的SWT控件,具體講,Composite類及其子類的實例,都必須有一個父控件,這個父控件的引用在子控件的構造方法中被傳入。需要注意的是,所有這些控件的不帶參數的構造方法都只有默認訪問級別,于是我們不能在自己的SWT程序中直接調用這樣的默認構造方法而只能提供一個父控件的引用,而在Widget類(Composit的父類)的帶參數構造方法中,它會調用如下方法:

          void checkParent (Widget parent) {
                 
          if (parent == null) error (SWT.ERROR_NULL_ARGUMENT);
                 parent.checkWidget ();
          }

          進而:

          protected void checkWidget () {
                 Display display 
          = this.display;
                 
          if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
                 
          if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
                 
          if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
          }

          這樣的檢查保證了任何控件在創建時都有父控件。當我們調用某個Compositedispose()方法時,它會調用:

          void releaseChildren () {
                 Control [] children 
          = _getChildren ();
                 
          for (int i=0; i<children.length; i++{
                        Control child 
          = children [i];
                        
          if (!child.isDisposed ()) child.releaseResources ();
                 }

          }

          其中的_getChildren()方法通過OS對象的方法遍歷控件的子控件,然后匯總到一起分別調用releaseResources()方法釋放控件和句柄。

          回到上次的SimplestSWT的例子:


          package sean.test.swt;

          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;

          public class SimplestSWT {

              
          public static void main(String[] args) {
                  Display display 
          = new Display();
                  Shell shell 
          = new Shell(display);
                  shell.pack();
                  shell.open();
                  
          while (!shell.isDisposed()) {
                      
          if (!display.readAndDispatch()) {
                          display.sleep();
                      }

                  }

                  display.dispose();
              }


          }

           

          這當中,Display是一個頂層的設備,它繼承自Device類,而Device類實現了Drawable接口。Shell的父類是Decoration,而Decoration繼承自CanvasCanvas繼承自Composite,最終這條繼承鏈一直連到Widget類。我們在創建Shell示例的時候,需要告訴構造方法它的父控件是什么,在這里就是display。于是當我們最后調用display.dispose()時,雖然我們沒有明確寫shell.dispose(),我們的Shell實例也隨之銷毀了。

          這就是SWT的資源管理機制,稍有例外的是MenuItemsetMenu()方法和ControlsetMenu()方法,它們通過顯式調用setMenu的方式注冊自己的父控件。

           

          posted @ 2005-03-20 17:11 laogao 閱讀(771) | 評論 (0)編輯 收藏

           

          本文部分內容和靈感來自eclipse.org網站,特此聲明。更多內容,請參考:

          http://eclipse.org/articles/Article-SWT-Design-1/SWT-Design-1.html

           

          眾所周知,SWTSwing最大的不同就是它直接使用操作系統提供的現成的本地圖形接口,于是具備本地化的Look & Feel。但是它是怎么做到這一點的呢,當然是通過JNI。我們來看一個例子,假定我們使用Win32API

          我們現在有一個文本框text,通過如下的代碼,我們給它一個字符串,并讓它選擇/highlight3~5[3,5])的字符。

          text.setText(“abcdefgh”);
          text.setSelection(
          36);


          Windows下,這個setSelection方法是怎么實現的呢?我們可以看看源碼:

          public void setSelection (int start, int end) {
                 …
                 OS.SendMessage (handle, OS.EM_SETSEL, start, end);
                 OS.SendMessage (handle, OS.EM_SCROLLCARET, 
          00);
          }

          做過Windows編程的朋友可能一下子就認出了這個SendMessage,這不就是Win32 API中用于向窗體發送消息的函數嗎?呵呵,沒錯,我們再來看一下這個SendMessage方法的原型:

          public static final int SendMessage (int hWnd, int Msg, int wParam, int lParam) {
                 
          if (IsUnicode) return SendMessageW (hWnd, Msg, wParam, lParam);
                 
          return SendMessageA (hWnd, Msg, wParam, lParam);
          }


          public static final native int SendMessageW (int hWnd, int Msg, int wParam, int lParam);

          public static final native int SendMessageA (int hWnd, int Msg, int wParam, int lParam);

          我們看到了兩個版本,一個版本針對Unicode,另一個版本針對ASCII,正好Win32 API也是如此,我們在這里看到的是native的方法,這意味著具體還有一組JNIC代碼來直接與操作系統的函數打交道:

          #ifndef NO_SendMessageW__IIII
          JNIEXPORT jint JNICALL OS_NATIVE(SendMessageW__IIII)
                 (JNIEnv 
          *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
          {
                 jint rc;
                 OS_NATIVE_ENTER(env, that, SendMessageW__IIII_FUNC);
                 rc 
          = (jint)SendMessageW((HWND)arg0, arg1, (WPARAM)arg2, (LPARAM)arg3);
                 OS_NATIVE_EXIT(env, that, SendMessageW__IIII_FUNC);
                 
          return rc;
          }

          #endif

          #ifndef NO_SendMessageA__IIII
          JNIEXPORT jint JNICALL OS_NATIVE(SendMessageA__IIII)
                 (JNIEnv 
          *env, jclass that, jint arg0, jint arg1, jint arg2, jint arg3)
          {
                 jint rc;
                 OS_NATIVE_ENTER(env, that, SendMessageA__IIII_FUNC);
                 rc 
          = (jint)SendMessageA((HWND)arg0, arg1, (WPARAM)arg2, (LPARAM)arg3);
                 OS_NATIVE_EXIT(env, that, SendMessageA__IIII_FUNC);
                 
          return rc;
          }

          #endif

          看到這里,你也許已經恍然大悟:SWT所做的無非就是把Win32API簡單的包裝了一下,我們在SWT這一層調用的方法、傳遞的參數被原封不動的代理到了Win32層。這就是SWT的核心思想。SWT有一個很重要的設計原則,那就是,SWTAPI一對一的封裝OSAPI,完全忠實于操作系統的API實現的行為,如果有bug,那也是OSbug,它不會嘗試去糾正操作系統,因為那樣會潛在的破壞本地化的一些行為。忠實于OS也使得調用者不必但心自己的SWT程序會跟OS的本地GUI有不一致的地方,如有必要直接參考MSDN即可。SWT其實就是這樣一個thin wrapper,我們通過它可以方便的訪問Win32的圖形API,為我們的應用程序提供nativeLook & Feel

          下面給出一個完整的SWT示例:

          package sean.test.swt;

          import org.eclipse.swt.SWT;
          import org.eclipse.swt.layout.FillLayout;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Text;

          public class DummySWT {

                 
          public static void main(String[] args) {
                        final Display display 
          = new Display();
                        final Shell shell 
          = new Shell(display);
                        shell.setLayout(
          new FillLayout());
                        final Text text 
          = new Text(shell, SWT.SINGLE);
                        text.setText(
          "abcdefgh");
                        text.setSelection(
          36);
                        shell.pack();
                        shell.open();
                        
          while (!shell.isDisposed()) {
                               
          if (!display.readAndDispatch()) {
                                      display.sleep();
                               }

                        }

                        display.dispose();
                 }


          }


          posted @ 2005-03-20 15:06 laogao 閱讀(706) | 評論 (1)編輯 收藏

           

          本文假定讀者使用Windows操作系統+JDK 1.4,其他平臺和JDK版本應該也是八九不離十。

          為了編譯和運行SWT程序,我們有兩種選擇:1- 使用Eclipse SDK2- 下載單獨的SWT二進制文件和源文件。

          Eclipse SDK,我們可以在它的plugins目錄下找到SWT的二進制文件,通常的目錄名稱是:org.eclipse.swt.win32_xxxx,后綴是版本號,在這個目錄下有osws兩個子目錄,內容分別是SWTJNI庫和swt.jar

          如果不是使用Eclipse來開發,或者需要SWT的源文件,那么需要下載單獨的SWT二進制和源文件包,在下面的地址可以找到:

          http://mirror.pacific.net.au/eclipse/eclipse/downloads/drops/R-3.0.1-200409161125/swt-3.0.1-win32.zip

          這個zip文件解包以后包含JNI庫(一些DLL)和swt.jar,以及swtsrc.zip,這個swtsrc就是我們SWT的源文件了,包括CJava的源代碼。

          為了運行SWT程序,我們需要首先編譯我們SWT的代碼,這個時候需要告訴編譯器swt.jar的位置;編譯成功以后,我們除了指明classpath包含swt.jar之外,需要在命令行告訴java.exe另一個參數,那就是java.library.path,看上去大概是這個樣子:

          java -cp %SWT_HOME%\swt.jar SimplestSWT -Djava.library.path=%SWT_HOME%

          如果你使用的是Eclipse SDK 3.1M5a或者更新的版本,你可以直接右鍵.java文件選擇Run As -> SWT Application,則不用在命令行寫那么長的參數了。

          比較有意思的是,我們可以在eclipse.orgSWT下載頁面看到目前SWT支持的平臺:

          •        Windows 98/ME/2000/XP
          •        Windows CE (ARM PocketPC)
          •        Windows CE (ARM PocketPC, J2ME profile)
          •        Linux (x86/Motif)
          •        Linux (x86/GTK 2)
          •        Linux (AMD 64/GTK 2)
          •        Solaris 8 (SPARC/Motif)
          •        QNX (x86/Photon)
          •        AIX (PPC/Motif)
          •        HP-UX (HP9000/Motif)      
          •        Mac OSX (Mac/Carbon)

          呵呵,支持的平臺雖然有限,不過還是蠻多了。

           

          posted @ 2005-03-20 01:05 laogao 閱讀(7539) | 評論 (2)編輯 收藏


          第15屆Jolt大獎評選結果已經公布,可以在以下地址下載PDF:

          http://www.sdmagazine.com/pressroom/jolt_winners_2005.pdf

          比較有意思的是:Eclipse 3.0力壓IntelliJ IDEA 4.5成為語言和開發環境類的Jolt獎得主,可能出于Eclipse開源的關系;Hibernate 2.1力壓J2SE (TM) 5.0獲得了類庫、框架和組件類的Jolt大獎。

          這些結果也許會出乎一些朋友的意料甚至反感,我想說的是,這僅僅是一個相對權威的雜志的一次常規的評選結果,當然也能夠在一定程度上反映出獲獎者的實際水平和用戶/市場接受度,但是能夠入圍的產品都是相當不錯的。

          期待在未來能有國人的作品上榜。

          posted @ 2005-03-18 15:29 laogao 閱讀(422) | 評論 (2)編輯 收藏


          今天聽新聞說肯德基一直以來出售的新奧爾良烤翅和新奧爾良烤雞腿堡的調料被查出含有致癌物質蘇丹紅一號。看來對這些產品也需要多加留意了。雖然肯德基已經 在所有門店停止了這兩種產品的銷售,并承諾一周內恢復供應不含蘇丹紅的以上兩款產品,但是像起來還是令人后怕,肯德基也會出這檔子事兒?還讓不讓人安心去 吃了?

          從目前公布的名單和相關報道看,除了肯德基,像麥當勞、亨氏這樣的大品牌恐怕在短期內都難洗清蘇丹紅事件對它們造成的負面影響。

          背景資料:
          蘇丹紅一號是一種紅色染料,用于為溶劑、油、蠟、汽油增色以及鞋、地板等的增光。 研究表明,蘇丹紅一號具有致癌性,中國和歐盟都禁止其用于食品生產。蘇丹紅事件牽涉到食品安全問題。2005年2月18日,英國食品標準署就食用含有添加 蘇丹紅色素的食品向消費者發出警告,并在其網站上公布了亨氏、聯合利華、麥當勞等30家企業生產的可能含有蘇丹紅一號的產品清單。截至2月21日,清單上 的產品增加到了419種,這些產品包括蝦色拉、泡面、熟肉、餡餅、辣椒粉、調味醬等。英國食品標準署已下令召回上述食品。事件爆發后,引起了世界媒體的一 片嘩然。

          posted @ 2005-03-16 22:26 laogao 閱讀(279) | 評論 (0)編輯 收藏

               摘要: 鑒于Java社群不時的也應該了解一下對手的信息作為參考,我將自己在博客園的一篇隨筆摘錄如下: 原文見:http://www.cnblogs.com/sean/archive/2005/03/15/119341.html  閱讀全文

          posted @ 2005-03-16 00:59 laogao 閱讀(687) | 評論 (2)編輯 收藏


          kukoo的blog上面提供的鏈接來看,最近似乎NetBeans和Eclipse陣營又開始了新一輪的口水戰?我們先看看這兩個對手之間近來都發生了些什么事:

          首先是J2SE 5.0的發布,幾乎同時NetBeans就宣布了全面的新語法支持,并且發布了新的4.0版,以及同JDK的捆綁版;而Eclipse則花了相當一段時間來完善對J2SE 5.0新語法的兼容,并且至今還沒有哪個release版本的Eclipse JDT宣稱100%支持J2SE 5.0。這當然并沒有出乎我們的意料:NetBeans后面是誰?SUN是也,這就難怪會有這樣的區別。

          然后是剛剛結束的Eclipse CON 2005,在這次大會上,雖然主角還是離不開Eclipse背后的IBM,我們還是看到了其他許多大廠商的身影,比較重量級的有BEA,Borland等等,它們都紛紛宣布加入Eclipse的"戰略開發"陣營;相較Eclipse,NetBeans受到的關注日漸減少,當然,還是有不少NetBeans 的支持者在不停的振臂疾呼,然而,NetBeans和SUN似乎正不可避免的逐步走向孤立?

          從體系結構上講,Eclipse和NetBeans基本上走的是一致的路線:Platform + Java IDE + Plugins,也許最大的不同是Eclipse在某種程度上鼓勵使用SWT,而NetBeans則是更"純"的AWT/Swing。

          不知道大家有沒有類似的感覺:當今IT界有一個很重要的現象,那就是"得程序員之心者得天下",這個是針對IDE和IDE背后的平臺而言的。像 Microsoft、SUN、IBM、Borland這樣的大公司當然也非常明白這一點,于是紛紛都把大筆資金砸到IDE的開發中,之前我的一篇blog 也提到Eclipse出現的背后有一個動機是趕超Visual Studio系列。

          在Eclipse和NetBeans競爭的背后,IBM想得更多是如何將大量的開發人員,不論是Java、C/C++、還是別的什么語言吸引到同一個平臺下,進而創造更多潛在的IBM客戶(而不是微軟);而SUN似乎更希望IBM按照規則出牌,對類似SWT的東西能夠放到JCP這樣由SUN控制的,相對標準化的流程中,而不是自成體系。很多人也許希望SWT能夠被JCP,然而現在看來這真的最多只是一個希望而已了,IBM似乎也沒有理由,或者至少不情愿這樣做。我們可以追述到一年多以前,當SUN決定不參與Eclipse計劃那個時候,從當時兩方的態度和聲明也許就已經多少成就了現今這樣尷尬的局面。

          從純技術上講,Eclipse和NetBeans也許真的是蘿卜青菜各有所愛,但想想背后的這些故事,也許能夠更好的理解近來某些相關言論的出發點。

          說了以上這么多相對中立的話,下面也說一些也許更加代表我個人的觀點:

          Eclipse我已經用了很長一段時間了,在這之前,我偶爾也用一些其他的Java IDE如JBuilder等,自從用上了Eclipse,至今我再沒有離開過它,哪怕WSAD那也是基于Eclipse的,坦白說,我真的喜歡上了 Eclipse。它的開放性遠非NetBeans能及,作為完全開放的平臺,它可以很方便的擴展,而且有大量的開源項目支持,Eclipse正變得越來越成熟,我也無法抵制自己做插件的欲望和沖動。可以說,Eclipse是目前唯一可以與微軟Visual Studio叫板的IDE。它不排斥任何東西,有一天哪怕你用它來做C#又有什么不可以呢?Eclipse給人最明顯的感覺就是實用,而不是為了某種技術而技術,同時它也提供給開發人員更多更開放的選擇。

          NetBeans也不是一點沒接觸過,3.6的時候就下下來看過,沒什么吸引我的,罷了。最近跟著JDK一起下過4.0,甚至也單獨下過4.1,也沒有留下什么好的印象:

          我的系統是Windows XP,安裝4.1到8%時,停住了,說明文字是"Building Storage...",重試N遍都是這樣,放棄。安裝4.0的時候,看到NetBeans的最小內存要求384MB,推薦512MB,我只有 256MB,狠狠心還是裝了,果然速度受到了內存的影響,感覺非常明顯,其界面顯示和易用性也有些讓人不敢恭維。然而我的Eclipse SDK 3.1M5a確感覺不到太慢,界面整潔、清晰、漂亮。

          不知道這些能不能說服你,說服我自己繼續使用Eclipse是足夠了。


          posted @ 2005-03-14 23:04 laogao 閱讀(444) | 評論 (0)編輯 收藏


          在之前的blog中間我們曾經提到過3.1M5a這個版本的性能似乎并不盡如人意,許多使用報告和用戶反饋似乎在支持這個結論。如果你像我一樣,想弄個究竟的話,下面有幾個鏈接可以給我們一些有價值的參考,它們是eclipse.org官方公布的3.1M5a相對于3.0版本的對比測試結果:(由于 3.1M5a發布版本的構建時間是2月19號15時整,所以報告中采用的版本號I20050219-1500跟3.1M5a其實是一致的)

          [Overall|整體表現]
          http://download.eclipse.org/eclipse/downloads/drops/S-3.1M5a-200502191500/performance/performance.php
          [org.eclipse.ui|Eclipse界面]
          http://download.eclipse.org/eclipse/downloads/drops/S-3.1M5a-200502191500/performance/org.eclipse.ui.php
          [org.eclipse.jdt.core|JDT核心模塊]
          http://download.eclipse.org/eclipse/downloads/drops/S-3.1M5a-200502191500/performance/org.eclipse.jdt.core.php
          [org.eclipse.jdt.ui|JDT界面]
          http://download.eclipse.org/eclipse/downloads/drops/S-3.1M5a-200502191500/performance/org.eclipse.jdt.ui.php
          [org.eclipse.jdt.text|JDT文本編輯器]
          http://download.eclipse.org/eclipse/downloads/drops/S-3.1M5a-200502191500/performance/org.eclipse.jdt.text.php

          具體答案是什么還是大家自己看吧,希望到了3.1版正式release的時候我們能看到比3.0性能更加優異的Eclipse。

          posted @ 2005-03-14 20:52 laogao 閱讀(302) | 評論 (0)編輯 收藏


          我們來看一段最簡單的SWT程序是什么樣子:

          package sean.test.swt;

          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.Shell;

          public class SimplestSWT {

              
          public static void main(String[] args) {
                  Display display 
          = new Display();
                  Shell shell 
          = new Shell(display);
                  shell.pack();
                  shell.open();
                  
          while (!shell.isDisposed()) {
                      
          if (!display.readAndDispatch()) {
                          display.sleep();
                      }

                  }

                  display.dispose();
              }


          }



          這段代碼運行時會顯示一個空的窗體。比較有意思的是Shell shell = new Shell(display);這一句,通過它我們可以了解到:在SWT中,子控件在構建時會傳入包含該子控件的母控件引用,更進一步,在一個母控件被銷毀時,包含的自控件也會自動被銷毀。幾乎所有常見的SWT控件都是以這種方式處理的。由于SWT使用OS自帶的API,SWT控件的創建和銷毀就跟純Java實現有些不一樣。

          在接觸SWT之前,總覺得它遙不可及,真正看到具體的代碼后才發覺,原來它近在咫尺。

          posted @ 2005-03-11 17:09 laogao 閱讀(559) | 評論 (2)編輯 收藏


          上一篇blog我提到了新發布的Eclipse SDK 3.1M5a,在接下來的系列文章中,我會零散的記錄我對Eclipse一些相關內容,如SWTPDERCP這些的學習過程和心得,并非作為正式的教程或者嚴謹的文檔,只是想到哪兒說到哪兒了。

          更早的一篇blog,我提到Eclipse SDK 3.1M4的發布,其實在那個時候,EclipseJDT已經支持所有J2SE 5.0的新語法了,只是有一些bug和重構的功能還沒有完全做好,3.1M5a在這個基礎上改掉了一些bug,新增了一些針對J2SE 5.0的代碼操作,就像Kukoo說的,3.1M5a在某些方面還不如3.0,但我相信正式的3.1推出以后會比3.0有很大的提高,單對J2SE 5.0的全面支持就很有吸引力。

          如果你對這個3.1M5a的版本的JDT UIJ2SE 5.0源文件支持度感興趣,可以看看這里:

          http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/jdt-ui-home/r3_1/j2se50/Status.html?rev=1.48

          在進一步學習Eclipse之前,我們需要搞清楚一些基本概念。

           

          # What is eclipse?

          Eclipse是由IBM最初發起并最終開源的一個功能強大的開發平臺,它包含3個項目:the Eclipse Projectthe Eclipse Tools Projectthe Eclipse Technology Project

           

          # What is the Eclipse Project?

          Eclipse項目是一個健壯、功能豐富、商用品質的業界軟件開發平臺,集成了相當多的工具,它包含3個子項目:PlatformJDTPDE

           

          # What is the Eclipse Platform?

          Eclipse平臺用于整合不同廠商、機構或個人的工具,把它們無縫的集成到一起,使得整個Eclipse的框架非常易于擴展。

           

          # What is JDT?

          JDT的全稱是Java Development Tools,在Eclipse平臺上提供的一款功能強大的Java IDE

           

          # What is PDE?

          PDE的全稱是Plug-in Development Environment,用于對插件開發的支持。

           

          # What is the Eclipse Tools Project?

          Eclipse工具項目包含相當多的開源和非開源的工具,用于支持Eclipse平臺,這個項目的存在可以協調各方開發人員共同開發某些功能的插件,避免不必要的重復勞動,以及確保工具之間可以良好的集成。

           

          # What is the Eclipse Technology Project?

          Eclipse技術項目的任務是為那些開源的開發人員、學者等提供一個參與到Eclipse發展進程中的渠道。分為科研、創新和教育三個分支:科研分支研究Eclipse相關領域的問題如開發語言、工具和開發環境等;創新分支包括了一些小型的、非正式的項目為Eclipse開發新的功能;教育分支重點是提供教學材料和課程等。

           

          # What is the Eclipse SDK?

          Eclipse SDKEclipse項目的三個子項目,平臺、JDTPDE的產品合集,提供單獨下載。這些產品整合在一起,為開發人員提供功能豐富而便捷的開發環境。

           

          # What is SWT?

          SWT的全稱是Standard Widget Toolkit,標準控件工具包,提供構建用戶圖形界面的API,由于是直接使用操作系統現有的圖形接口(如果有的話),速度和性能在很大程度上不受JVM的限制。對于Java開發者來說是好事,在AWTSwing之外,我們又多了一套極具吸引力的圖形API。支持多種平臺,我們可以看到Eclipse的界面就是SWT畫的,足見它的實力。 

           

          更多內容,參考:

          http://eclipse.org/eclipse/faq/eclipse-faq.html


          posted @ 2005-03-11 14:00 laogao 閱讀(415) | 評論 (0)編輯 收藏


          Google's latest move is the beta release of its Desktop search engine, which, to some extent, is considered an "invasion" into our beloved (or behated?) Windows platform.

          I tried it for some time now, and it seems very interesting and powerful.
          http://desktop.google.com/

          posted @ 2005-03-11 13:52 laogao 閱讀(312) | 評論 (0)編輯 收藏


          最近忙得昏頭轉向的,還沒有仔細看Eclipse CON 2005的內容,卻偶然發現Eclipse SDK的新的Milestone build已經可以下載,版本號3.1M5a。印象中這次的release已經等了很長時間了。

          接下來打算抽時間看一下它的新特性,J2SE 5.0兼容度,以及SWT、PDE、RCP等內容(謝謝Kukoo的大力推薦)。會同步推出相關blog文章。

          新版本下載地址:

          http://mirror.pacific.net.au/eclipse/eclipse/downloads/drops/S-3.1M5a-200502191500/eclipse-SDK-3.1M5a-win32.zip

          我試過,速度還可以。

          posted @ 2005-03-08 14:28 laogao 閱讀(302) | 評論 (0)編輯 收藏

           

          今年的Eclipse CON年度大會于22833在美國加州BurlingameHyatt Regent酒店隆重舉行。33日上午,來自IBM RationalLee Nackman做了題為《Eclipse現象》的演講。以下是eclipsepowered.org上的一篇相關報道的摘要。

           

          原文見:

          http://www.eclipsepowered.org/archives/2005/03/03/day-4-the-eclipse-phenomenon/

           

          NackmanEclipse起源的介紹從1995-1998的那個年代開始,當時的IDE市場是微軟Visual Studio的天下,JavaIDE以及類似WebLogic的服務器產品也才剛剛起步,而IBM當時的產品線相對混亂,雖然都掛了Visual Age的牌子,但實際上并不是集成到一起的產品

           

          1998年左右,他們意識到應用程序服務器(中間件)市場競爭的關鍵是如何吸引開發人員為這些服務器寫應用程序。于是他們想搭建一個可以讓合作伙伴來完成空缺功能的框架,而事實上IBM當時的各個實驗室往往在用不同的技術做著相同的事。

           

          幾個人合作提交了一份展望未來的提案給IBM的各個團隊,在199811月他們通過會議達成共識:構建一個新的工具平臺和一個新的Java IDE。當時一個叫OTI的分支機構正在開發一款支持pluginIDE,于是最終的決定是由這個分支機構開發工具平臺,由另一支IBM的團隊負責構建第一個基于該平臺的IBM產品。這就是為什么我們現在看到的Eclipse有兩個不同版本的重量級項目:eclipse platformeclipse JDT

           

          核心的決定包括:

          u       將任務交給小型的、緊密的團隊 概念上和理解上的一致相當重要;

          u       構建一個可擴展的平臺和一款優秀的Java IDE – 用來增加該平臺的人氣;

          u       平臺和IDE的團隊緊密合作 于是有了干凈的平臺接口并且很好的反饋機制促成了更好的、正確的產品;

          u       產品和平臺團隊分離 保證品臺產品的完整和維護多個版本;

          u       盡全力同Visual StudioWindows環境競爭 這就是SWT背后的動機。

           

          2000年,一切進展都很順利,于是他們打算開始把這個項目作為產品來開發,取代Visual Age

           

          關于Eclipse的名稱,Nackman是這樣解釋的:當時所有以“e”開頭的詞都很時髦,雖然已經有不少公司/機構/產品都已經使用了這個名稱,但是最終IBM還是決定采用“Eclipse”命名,一方面,eclipse這個單詞聲調很好;另一方面,他們想eclipse(日食/超越/遮蓋)Visual Studio。筆者相信背后隱隱約約還有一個更合理的解釋:遮擋住SUN的光芒。

           

          接下來問題是如何推廣Eclipse,讓它廣泛被接受?時間到了2001年,當時Visual Studio和微軟的產品線繼續壯大,廠商仍然不停地將開發人員引入到中間件的開發,類似Borland的公司也在推出不同的Java相關產品。這些Java陣營的公司/機構都在做自己的一套功能其實類似的東西,而不是在一起推一個成熟的產品線來同微軟競爭。關鍵在于如何說服大家相信Eclipse就是這樣一個平臺。這就是為什么Eclipse最終走向了開源。

           

          這個時期的IBM已經有了很多開源的經驗,例如他們看到ApacheHTTP服務器發展的勢頭,于是在WebSphere中采用了Apache的技術,另一方面他們也積極的幫助類似ApacheLinux這樣的技術社群,于是開源Eclipse就成了當時最合理的選擇。

           

          最終,Eclipse項目從IBM脫離,IBMHP/SAP/Intel等公司合作,成立了Eclipse Foundation,從名字看就像是著名的Apache Foundation這樣的非盈利性機構。

           

           

          筆者的話

           

          Eclipse目前最新的release版本號是3.0,在Eclipse SDK 3.1 M4中,J2SE 5.0的功能也得以實現。作為開發人員,我很高興我今天能夠使用到這樣一款優秀的產品,并且Eclipse還在繼續以驚人的速度穩步前進,足以看到其旺盛的生命力。如果你用過Eclipse,那么你一定會被它樸實的風格和強大的功能所吸引,如果你還沒有開始你的Eclipse之旅,那么你還在猶豫什么呢?趕緊下一個試試吧!

           

          http://eclipse.org/downloads/index.php

           

           

          posted @ 2005-03-04 12:55 laogao 閱讀(1044) | 評論 (1)編輯 收藏


          這話要從最近我改乘可刷卡公交車一事說起。

          由于是外資高新企業,所以我現在的公司設在高新區,通常高新區離市區都比較遠,我們這個高新區也不例外,每天上班至少需要40分鐘。我們這里的公交車大致可以分為兩種:可以刷卡的和不可以刷卡的。刷卡實行包月限次的優惠方式,即按照正常的情況估算,次數使用越多越劃算。現實的情況有些讓人為難,因為事實上從市區通往高新區的公交車有五路之多,其中兩個可以刷卡,三個只收現金,而從我家到公司,至少有四套比較合理且經濟的方案:

          Plan A: 在一個有很多路車都停靠的站點(I)乘坐不可刷卡的公交車直達公司所在地;
          Plan B: 在同一個站點(I)乘坐可以刷卡的公交車然后轉可以刷卡的另一部公交車前往公司;
          Plan C: 在另一個只有一部車的站點(II)乘坐可以刷卡的公交車然后轉不可以刷卡的公交車前往公司;
          Plan D: 在另一個只有一部車的站點(II)乘坐可以刷卡的公交車轉另一部可以刷卡的公交車前往公司。

          有很長一段時間,這根本不是一個問題,因為我認定了其中一個:Plan A,所以無論刮風下雨,我都會死等那部從我家直達公司的車。但是最近我越來越無法忍受該路公交車的服務水準:經常有一班無一班,動不動等上30分鐘或者人多的擠也擠不上去,這對于上班需要準時和長時間坐車容易疲勞的上班族來講,很難說可以接受。于是我就開始考慮另一種選擇:使用公交卡,因此就有了上面的多種方案。

          不要小看一張公交卡,乘車人的習慣一下子被這個分水嶺一分為二:持卡的乘車人幾乎都傾向于選擇可以刷卡的公交車,而非持卡人則往往更習慣于綁定到有售票員的線路,因為這樣不必擔心沒有零錢去投幣。

          最終我選擇并很樂意的接受了Plan D,也很享受這份簡單和輕松,一方面,我不必擔心這套方案里的兩部車會不準時到離譜的程度,另一方面,我也不用考慮其他任何外界因素,認準了這兩路車即可。一卡在手,我心無憂,呵呵。這就是Plan B和Plan D的巨大區別。再看Plan C,它既不省事,也不省錢,所以沒有吸引力。

          從公司回家也有兩個不同的站點可以選擇:站點(III)只有一部公交車,而站點(IV)幾乎所有公交車都會停。你估計也猜到了,我最終的選擇是站點(III)。

          這說明什么問題呢?說明我們內心其實會對“給你很多選擇,或者沒得選擇,你更希望是哪一種”這樣的問題有一個答案,多多少少反映出我們的心理圖案。也許更多的人第一反應是:有選擇當然是好事。我在很多時候脫口而出的答案也是前者,然而我最終的在公交車線路問題上的選擇是:選擇沒有選擇的選擇,在很多模棱兩可的選擇或者誘惑面前,我會選擇給我最少不安和煩躁的那一種。

          這不得不讓我聯想到當今企業軟件開發和外包的兩大陣營:Java和.NET,在不同的層面上它們其實又處于完全不同的位置。

          如果你在平臺/中間件/開源類庫和框架這個層面來看,Java給你很多選擇,而.NET至少到目前為止大家看到的在這個層面還是相當局限,可以說.NET沒有給你多少選擇,換句話說,不用你去擔心找不到合適的平臺/中間件/類庫,最終MS會給你一個solution。

          如果你站在語言的層面看,Java的世界只認一種語言:Java,雖然也有其他的語言可以編譯后在JVM中運行,但是很少有人用,所以一旦選定了Java,你基本上不用考慮其他語言;而.NET的世界里,只要有編譯器可以把某種語言編譯成MSIL,就可以使用這門語言來描述你的想法。

          看,這兩個家伙完全調了個兒。

          最終的問題還是:給你很多選擇,或者沒的選擇,你更希望是哪一種?前者意味著freedom、power of control、compitition、nervousness、和excitement;后者意味著easy decision、certainty、assurance、relaxation、或者peace。

          其實生活中我們何嘗不是在選擇或者沒得選擇的快樂和痛苦的交錯中度過每一天?對于我提出的這個問題,真的可以從答案和行動中看出一個人的性格,不信你試試?你會選擇什么樣的工作?喜歡怎樣的生活方式?想不想結婚?持怎樣的戀愛觀?這些都是“給你很多選擇,或者沒的選擇,你更希望是哪一種”這個問題在現實中的例子。對了,你有沒有看過《海上鋼琴師》,英語片名"The Legend of 1900",里面的那個鋼琴高手最終選擇留在船上,換作是你,你會怎么選?

          posted @ 2005-03-04 01:41 laogao 閱讀(465) | 評論 (1)編輯 收藏


          這是一部相當有味道的電影,中文片名叫做《再見列寧》,2003年上映。

          36m.jpg

          從名字上看你也許能一下子就看出來這大概是一部政治電影,沒錯,它反映的是1990年德國柏林墻被拆除的那個年代當時東德一個普通家庭的故事,這當中當然不可避免的會有政治的成分。但是我不想說這些,這部片子吸引我的是它的另一個視角:一個男孩到男人的成長過程、遇到的挫折、以及他對母親的愛。

          故事中年輕的主人公參加一次示威游行,被警察抓走,當時他的母親看到這一幕便昏厥過去,經檢查,她患有心臟病,并且這一睡就昏迷不醒。男孩的父親早在主人公兒時就偷渡到了西德,母親是含辛茹苦將他和他姐姐帶大。這個時候主人公意識到他的魯莽和沖動會給他的家庭帶來多大的不幸,于是他決心陪伴母親直到她蘇醒過來。

          在母親昏迷過程中,德國發生了翻天覆地的變化,東德和西德統一了,他們家的日子也不斷在發生著新的瑣事。主人公也逐漸長大,有了自己的初戀。

          終于有一天,他的母親醒了。

          這個時候問題來了:根據醫生的勸告,她的母親不能承受任何重大的刺激,國家統一的大事當然也就成了絕對不能讓她知道的秘密。于是男孩決定用他力所能及的方式讓母親感覺不到這一巨大變化。可以想象一下這有多么不容易:報紙、電視、收音機、鄰居、家人、窗外的一草一木,每一樣都極有可能使他的計劃泡湯。于是他開始盡他的最大努力向他的母親隱瞞真相。屋里的家具全部換成原來的,罐頭也"舊瓶裝新酒",收音機和電視機播放錄制好的節目,甚至不惜代價自己錄制新聞,有時候甚至是為了不小心讓母親看到的廣告牌自己編造一些新聞來自圓其說......等等等等。

          最終......他的母親在幸福中離開了人世。說她幸福,并非是膚淺的說她認為東德比西德好,或者是任何政治上的原因;她幸福,是因為她最終看到:兒子長大了,懂事了。這種愛相當有深度,也相當能給人平凡中的震撼。

          這個片子有很多看點,每個人看多多少少都會有不同的體會,你如果有時間,千萬別錯過哦。

          對了,這部片子最后的片尾曲相當好聽,我已經聽了N遍了;另外,這部片子對白是德語,如果你碰巧在學德語,也是不錯的學習資料。

          posted @ 2005-02-25 01:24 laogao 閱讀(297) | 評論 (0)編輯 收藏

          僅列出標題
          共34頁: First 上一頁 26 27 28 29 30 31 32 33 34 下一頁 
          主站蜘蛛池模板: 收藏| 柳河县| 大厂| 昌邑市| 宜春市| 若尔盖县| 遂川县| 吉木乃县| 崇明县| 海宁市| 大兴区| 六盘水市| 郁南县| 阿巴嘎旗| 仁化县| 吉隆县| 南澳县| 大同县| 灵石县| 长寿区| 大邑县| 濮阳县| 德兴市| 无锡市| 淳安县| 荥阳市| 静宁县| 桐梓县| 寿光市| 香港| 政和县| 安平县| 汤原县| 汉川市| 内江市| 嘉定区| 东阿县| 扎鲁特旗| 临湘市| 平谷区| 葵青区|