2011年11月24日 星期四

Randy Pausch時間管理演講

影片:Randy Pausch時間管理演講
由於幾乎每一段文字都太有意義,
實在無法截出最重要的片段
簡單講:
每件事情
如果你無法從中得到樂趣,那幹嘛要做?
你可以花一分錢然後賺回一分錢
但你無法花一秒然後取回
既然無法回朔,那當下問自己為什麼要做這件事就顯得重要多了


運用時間沒有捷徑
基本的計畫與經驗。



System your work

事情分重不重要急不急(當作四格賽局)
先作重要且務急的
但之後更重要的是開始作不急但重要
因此在那些重要的事情在它還不急的時候你就已經解決了
接著就會很神奇的發現
居然還有時間解決不重要的事情


you will have a lot more time to spend with the one you love
Time is all we have, and you may find one day, you have less than you think

2011年11月23日 星期三

Google 2008 台北程式開發日

Android 簡介
不喜歡舊有的平台 和其他數十間廠商一起聯合推出Android平台與相關資源
一切設計都主要於一個概念
就那個Google大神的一千零一個概念
"開放性+可替換性+獨立性"
連單一開發APK(可以想像成執行程式)
都再細分成許多階層的設計
負責制訂動作、儲存資訊或制定相關的Service
Android: Dalvik VM Internals

Android
把原本的java bytecode轉換成dalvik bytecode
原因是觀察到 JVM轉換時其實有很多重複的字串重複用到的資訊
例如lang.object是每個宣告都需要 或是"String"相關的宣告都會引用
甚至新增許多指令讓許多常使用到的連串Instructions規劃成單一Instruction
實作上再配合JNI讓整體執行速度在人類知覺可接受的範圍。

App Engine入門
Google App Engine
對於它的概念比較沒有特別有興趣
(跟之前已經摸過有關資訊)
暫時跳過,以後摸到再研究

雲端運算
GFS+BigTable+MapReduce
建議直接去看由google發佈的Paper
上面講的概念比較完善且清楚
記得先由GFS開始

Gadget
Google開發的小工具
使用<![CDATA[..~~~..]]>
在XML中包住HTML的語法

把所需求的工具作成Gadget code
再直接在各個網頁上使用 Gadget code
這樣就不需要到處更改
簡單講就是把寫網頁這件事情用Gadget 切成架構化


Maps API
一個javascript的lib
再使用之前必須先到網頁上setup key
才能開始使用
div tag
        先給定起始相對範圍
map.Center
       設定 GLatLng 跟Zoom
   GLatLng    (設定 緯度經度)
   Zoom  (設定大小)
map.Type
       設定為各種不同的圖形
map.openinfoWindow
       在地圖上面PopOut出一個infoWindow
GEvent.addListener
       針對點擊或使用者動作可以寫回應功能或對應方法
GMaker
       顯示紅色標點。若希望是可以拉動的標點就設為draggable
       可以用MakerManager管理所有的GMaker
       避免出現大量或太大範圍的GMaker

GPolyline
       用來在地圖上畫線,可以設定寬度長度透明度
       可以增加屬性 geodesic:true來設定球面弧形(因為地球是圓的)

GPolygon
       用來畫多邊形
       其中線跟內容可以式不同顏色

GGroundOverlay
       給一張舊圖來代替原圖
GTileLayerOverlay
       可以替代原圖
GXmlHttp
       可以用paser建conection連回其他地方取資料(很像AJAX的寫法)
geocoder
       針對位置和其相對應的標名連結
GStreetViewOverlay
       看哪裡有可以看的街景(可以看會出現藍色的點)
GLargeMapControl,
GSmallMapControl,
GSmallZoomControl,
...
簡單來講你在G Map上看到的功能多半可以客製化
(也可以在Google Earth API建立 3D model)
剛好最近會用到所以作些筆記~


OpenSocial 進階

GData API
操作放在google端的data
後端一樣是XML
基於M2M的需求所以用XML
總之Google想要把所有的資料有相同的格式
讓M2M可以分享data
使用上包含了
Authentication(ClientLogin or AuthSub),
Batch processing,
Optimistic Concurrency(timestamp版本的衝突處理)
等技巧

Android 教學網站


2011年11月22日 星期二

[轉載]Applet編程——Applet與Servlet通信

Applet編程——Applet與Servlet通信


    在今天的多層結構的web應用程序的設計中,我們可以同時使用Java applet和Servlet。Applet為建立功能強大的動態界面提供了便利的機制,Servlet為web服務器或者其他應用服務器處理請求提供了高效率的手段。Sun公司的應用程序模型描述了在Java 2平台下開發企業級的Java應用的最好的規範。一種被推薦的規範是:在前端使用Applet、HTML和JSP,在後端使用Enterprise JavaBeans支持的Servlet及其他成分 。
    這種體系結構的關鍵是在客戶端的Applet和在服務器說?ervlet之間的通信。但是由於Applet受瀏覽器安全模式的限制,在一個Applet中存取數據和信息並不想看上去的那麼簡單。在這篇文章中,我們將解釋在Applet-Servlet結構中開發者所面對的限制,並探討幾個不同的可以在Applet和Servlet之間轉輸數據的通信策略。如果你已經熟悉Applet和Servlet,這肯定會對你閱讀本文有幫助,如果你還不是那麼熟悉,那也沒關係,我們會簡要地介紹它們。


APPLET和SERVLET的簡介


Applet   
    Java applets實際上是運行在web頁面上的Java程序。它是一個繼承於java.applet.applet的Java類,它通過引用被嵌入到HTML頁面中去,就像一個圖像一樣。Applet和HTML的組合,可以建立功能更為強大的動態界面。對於一些只用來滾動正文和播放動畫的Applet,我們可以在一個企業級的應用程序中利用它來顯示和處理來自服務器上的資源的數據。例如,一個Applet可以用來瀏覽和修改數據庫中的記錄或者控制運行在服務器上的其他應用程序。
  Java applet除了可以使用它自己定義的類文件外,還可以使用其他的類,不管這些類是獨立存在的還是被打包成了一個JAR文件。Applet和它的類文件通過標準的HTTP請求進行分佈,所以Applet可以越過web頁面數據所在的平台的防火牆進行發送。除非是涉及到保持應用程序完整性的問題,Applet總會在每次用戶重新訪問web主機時自動刷新並會在客戶端保留一段時間。 
     我們得感謝Java操作系統的平台無關性,這才使得Applet可以運行在任何擁有Java虛擬機(JVM)的瀏覽器上。Sun公司的Java插件甚至可以使用可以利用最新版本的JVM編制頁面,而不用擔心受你的用戶的瀏覽器上的JVM的版本的限制。  
因為Applet是Java平台的擴展,所以在你建立用Applet建立你的web應用程序的界面時,你可以重用已存在的Java組件。正如我們在下面的例子中可以看到的那樣,你可以在你的Applet的組件中使用複雜的Java對象來開發本來由服務器端應用程序完成的工作。事實上,你可以編寫這樣的Java代碼,它既可以在Applet上執行,也可以在應用程序內執行。  Applet具有所有傳統的Java應用程序的功能,包括使用Sun公司的JFC/Swing組件。Applets也可以用來製作圖形以及應用程序中的用戶界面(儘管有些輔助的窗口會被標誌為“Warning, Java Applet Window”)。但是不管他們有多麼相似,在應用程序和Applet之間還是一些關鍵性的差別的。例如,我們不得不考慮到我們的Applet是受到安全模式的限制的。


Applet的安全約束  
Applet代碼來自於web主機並在最終用戶的機器的瀏覽器中運行。有害的含有病毒的Applet可能會造成破壞性的效果,為了防止這樣的Applet,Applet受到安全方面的約束,那就是Applet只可以與提供這個Applet的主機進行通信,而且Applet不能操作最終用戶的機器。它們不能讀寫該用戶的文件系統,不能執行上面的程序,也不能檢查一些敏感的環境參數。(事實上,我們有一種方法可以迴避這種限制,那就是開發者可以利用數字簽名的技術對Applet進行標誌,這將會詢問用戶是否可以給予Applet某種特殊的待遇。但是這已經超出我們這篇文章中所討論的範圍了。)此外,Applet不能建立或接受外來的socket連接。所謂外來的是指這個連接超出了提供這個Applet類 ??文件的主機(不是提供引用這個Applet的HTML所在的主機)。  因為這個安全性的限制,我們與Applet的通信必須採用一種特殊的策略。通信的唯一的途徑就是在提供Applet的主機和提供相應的HTML的主機之前的網絡連接。


Servlets   
Java servlet是服務器端的組件,它和CGI有很多相似。它可以處理web請求,並返回數據或HTML。Servlet可以訪問數據庫,進行計算,並和Enterprise JavaBean這樣的組件進行通信。與CGI程序不同的是,Servlet是持久有效的,也就是說,它只要被示例一次就可以不斷地處理請求(這些請求很可能是同時發生的)。因此,Servlet比CGI來得更高效。  
Servlet運行在一個Servlet引擎中,通常是在一個web服務器或應用程序服務器上。Netscape Enterprise Server 4.0和Netscape Application Server都支持最新版本的Java servlet規範。和Applet不同,Servlet不受安全約束的限制。因為Servlet是完全在服務器上運行的,它具有所有操作系統所允許的性能。
  Servlet可以用來很方便地建立在Applet和Web瀏覽器這樣的客戶端和企業應用程序的核心之間的連接。對於客戶端來說,向Servlet發出的請求與其他web請求並沒有任何不同。客戶端通過一個URL來接受返回的信息,正如我們看到的那樣,返回的信息並不一定只能是HTML,實際上我們可以通過HTML協議發送和接受任何類型的數據。


構造方法  
一個企業級的應用程序可以有幾種方法來構造Applet和Servlet的使用。我將向大家介紹三種不同的構造方法,並對它們的優缺點進行比較。  


第一種方法實際上只使用了Applet而沒有使用Servlet,儘管Applet受到它們的安全模式的限制,但是Applet還是可以使用象JDBC、RMI這樣的協議來訪問像數據庫、LDAP目錄和Enterprise JavaBeans組件這樣的後端信息。
這種方法雖然看上去很簡單,但是這並不是一個好的方法,它會帶來很多的問題。首先,這種安排要求你將所有的訪問信息直接嵌入到你的Applet代碼中。數據庫用戶名、口令、服務器標識,所有的這一切都必須包含在你的Applet代碼中,這樣最終用戶就有可能從類文件中蒐集到這些信息。此外,數據庫或任何其他你訪問的系統都必須在提供Applet的同一台服務器上。這意味著你的服務器將不得不承擔雙重的負擔,它既是一個web服務器,也是一個數據庫服務器。典型的情況是,你的後端資源可能受到防火牆的保護,但是在這種情況下,這是不可能的,因為運行在客戶端上的Applet必須直接訪問你的機器。最後,使用這種方法,你想使用web服務器群集,如果不是不可能的,至少也是很困難的。
好一點的方法是將與後端資源通信的事務封裝到Servlet中,而Applet僅僅用來處理前端的工作。在這種構造方法中,Servlet克服了Applet固有的安全約束,並用來控制Applet訪問企業信息系統和事務邏輯。當Servlet接受到一個請求時,它會在後端數據庫中查詢信息、執行計算、處理對代表Applet的信息的獲取並作用於來自Applet的信息。這種方法的一大進步是Applet/Servlet對可以分佈在一個後端web服務器的群集上,所有與某一共享的數據庫的通信都存在於後端。此外,使用Servlet的設計有助於設計的模塊化、抽象應用程序的後端處理商業邏輯並提高設計的靈活性。
如果你是圍繞Enterprise JavaBeans構建你的應用程序,Servlet就成了中間件。EJB組件可以更加有助於將商業邏輯從Servlet中分離出來,並將其更加抽象。在這種情況下,一個Applet與它的Servlet通信,Servlet再與EJB組件通信。在應用程序構建中引入由EJB組件、Servlet和前端的applet/HTML這樣的層次結構,可以給我們提供最大限度的彈性和性能。儘管這樣做你必須附出複雜化和費用的代價。


通信策略
如果你使用了這樣的構造:在前端使用Applet,在後端使用Servlet,那麼你將需要執行Applet和Servlet的通信。因為Applet受瀏覽器的安全模式的限制,我們在對一個Applet存取數據和信息時並沒有太多的選擇。正如我們在前面提到的,我們不能讀取客戶端的文件系統、不能運行客戶端的程序,由於Applet不是在服務器上運行的,我們也不能訪問服務器上的文件系統。我們只能建立到運行在我們的主機上的服務的網絡連接。另外,不要忘記應用程序是在一個公開的Internet上發布的,防火牆可能會限制通過HTTP到Servlet或其它web-server模塊的會話。事實上,因為Applet本身就是在網絡上通過HTTP發布的,所以我們必須準確把握通信的策略。  
假定在客戶端的Applet和服務器端的Servlet之間的網絡連接是我們可以使用的唯一的通信路徑,我們可以有幾種方法交換信息。正如你知道的,文字流可以由服務器通過HTTP發放。但是你可能不知道Java對像出可以用這種方式發放。我們將詳細地介紹HTTP文字流和HTTP對象流的使用。另外,我們將簡單地介紹通過Socket進行通信的方法,當一個應用程序需要雙向的、持續的連接時,這個方法會特別有用。 


HTTP textStream
Applet與Servlet交換信息的最簡單地方法就是通過HTTP文字流。Java的URL和URLConnection類型使得從一個URL讀取數據變得很容易,你可以不用擔心Socket和其它有關網絡工作的通常的複雜問題。我們所需要的只是一個服務器端的組件,這個組件應該可以通過URL發放信息。這就是我們在這兒使用Servlet的原因。 作為一個例子,我們想要監控服務器的JVM所能使用的內存的總數,並在一個Applet中用一個簡單的儀表顯示它。首先我們需要開發一個Servlet,當通過它的URL訪問這個Servlet時可以返回我們所需要繪製儀表的信息。這個Servlet的源代碼如清單1所示


清單1
import javax.servlet.*; 
import javax.servlet.http.*; 
public class ShowMemservlet extends Httpservlet 
{   
public void doGet(HttpservletRequest req, HttpservletResponse res)   
    throws servletException, IOException
    {
        res.setContentType("text/plain");
        PrintWriter out = res.getWriter();
        Runtime rt = Runtime.getRuntime();
        out.println(rt.freeMemory());
        out.println(rt.totalMemory());
    
}   
這個非常簡單的Servlet會響應一個GET請求(直接通過瀏覽器或者是像我們在下面將看到的那樣通過我們的Applet),並返回兩行文字。第一行顯示了服務器的JVM的剩餘的自由空間,第二行顯示了JVM可用的全部空間(譯者註:包括已使用的空間)。  
要建立我們的Applet中的儀表,我們只需要建立一個到這個Servlet的連接,將它的InputStream封裝到一個DataInputStream中,讀出這兩個參數,將其轉換成數字,並更新我們的儀表。
我們可以讓我們的Applet執行Runnable接口並在其自己的線程中運行。每隔一秒鐘,我們可以運行一個方法來更新我們的儀表。refresh()方法的代碼如清單2所示。

清單2
private void refresh() throws MalformedURLException, IOException 

{
   URL url = new URL(getCodeBase(), "/servlet/ShowMemServlet");
   URLConnection con = url.openConnection();
   con.setUseCaches(false);
   InputStream in = con .getInputStream();
   DataInputStream textStream;
   textStream = new DataInputStream(in);
   String line1 = textStream.readLine();
   String line2 = textStream.readLine();
   double freeMem = Double.parseDouble(line1);
   double totalMem = Double.parseDouble (line2);
   int usedMem = totalMem - freeMem;
   int percentUsed = (int) 100 *(usedMem / totalMem);
   meter.setLength(percentUsed);
 }   
正如你看到的,HTTP文字流的使用相當簡單而且直接。Applet建立到Servlet的連接,讀取它返回的兩行信息並對其進行適當的處理。
  使用簡單的文字流來交換數據有一個主要的弱點,那就是Applet並不直接理解數據的信息,而是要將其轉換成一個有用的格式。在我們的例子中,將字符串轉換成數字還不算太複雜,但是當我們試圖處理一個更複雜的數據和對象時,轉換的工作會很快變得無法控制。事實上,在下面我們可以看到我們一種簡單的方法來處理這些複雜的數據。


HTTP ObjectStream
    你也許還沒有意識到HTTP連接也可以用來傳輸二進制的數據,就像傳輸文本數據一樣,但是事實上每次你從一個web看到圖像時或者是下載.zip文件時都在使用這個功能。我們可以利用這個功能並結合被稱之為“Object 序列”的技術從Servlet向Applet傳輸完整的Java對象。複雜的數據可以很容易地被傳輸,你不需要做任何解析和解釋。  Object 序列允許我們將Object 封裝到二進制數據流,它可以到達一個OutputStream可以到達的任何地方:Disk、Screen或者是在我們的例子中,通過一個HTTP連接到達一個Applet。
Object 序列是JVM1.1和更高的版本才支持的功能,所以有一些老版本的瀏覽器不支持這一功能。但是Sun公司的Java插件幾乎可以對所有的瀏覽器進行升級以支持最終版本的Java,這樣它就可以支持Object 序列。  使用HTTP ObjectStream和使用HTTP TextStream的方法幾乎一樣。我們建立一個到我們的web主機上的Servlet的URL連接並讀取其返回的數據。只不過我們不再是將InputStream封裝到DataInputStream中,而是將其封裝到ObjectInputStream中。
我們可以按照適當的類型讀取其中的對象。  清單3顯示了我們用來交換一個對象的一段代碼,這個對像用來從Servlet獲得有關書目的信息(包括作者、題目、價格和其它信息)。你會注意到在這裡我們用ObjectOutputStream取代了清單1中的PrintWriter,其基本概念是相同的。


清單3 
public void doGet(HttpservletRequest req, HttpservletResponse res) 
throws servletException, IOException 
 {
   OutputStream out;
   ObjectOutputStream objStream;
   out = res.getOutputStream();
   objStream = new ObjectOutputStream(out);
   Album album = fetchNextAlbum();
   out.writeObject( album);
 }
這個Servlet會生成書目Object 的序列化版本,它可從它的fetchNextAlbum()方法作為一個DataStream被接收。如果你通過一個web瀏覽器來訪問這個Servlet,你會看到一堆垃圾,這是因為目前你只能處理文本而不能處理二進制數據的Object 序列。請注意這個Object 必須執行Serializable接口以使其序列化。
此外,任何引用這個對象的其他對像也必須執行Serializable接口。
  在Applet端,每當用戶單擊Applet的Next按鈕時,我們可以使用方法getNextAlbum()(程序如清單4所示)來從服務器獲得書目對象。Applet將查詢這個對象並顯示其中的數據。

清單4 
private Album getNextAlbum()
throws MalformedURLException, IOException
 {
   URL url = new URL(getCodeBase(), "/servlet/Albumservlet");
   URLConnection con = url.openConnection();
   con.setUseCaches(false);
   InputStream in = con .getInputStream();
   ObjectInputStream objStream;
   objStream = new ObjectInputStream(in);
   album = (Album)objStream.readObject();
   return album;
 }
   正如你看到的,Object Stream給我們提供了一個非常簡便的方法在Applet和Servlet之前交換一組複雜的信息。請注意我們所處理的不是單純的數據而是對象,所以你可以在客戶端和服務器之間重用這個對象。這使得我們的程序更為智能化並且可以防止重複的邏輯處理。Socket連接  另外,一種不太常用的Applet和Servlet的通信策略是在兩者之間建立Socket連接。這意味著開發者利用Socket連接設計並執行適當的協議來處理兩者之間的通信。
  使用Socket的一個大的好處是這個連接是持續的而且是雙向的。一個基於HTTP的連接只能短暫地交換信息。如果你想要不斷地用新的信息更新Applet,你必須不斷地建立新的HTTP連接。而對於一個Socket連接來說,你可以只建立一個與服務器的連接,就能實現不斷地更新。當然,你可能想要建立一個Multi-Thread的系統,這樣可以有幾個Applet同時與服務器聯繫。
請注意使用Socket有的時候並不是一個適當的方法,絕大多數的防火牆不允許通過罕見的端口號進行通信。然而,在一個內部的Intranet上,這還是一項很有用的技術。

APPLET和SERVLET的協同工作  
在這篇文章中,我們討論了有關建立一個前端使用Applet、後端使用Servlet的應用程序的一些有用的策略。Applet只有一個唯一的通信路徑,但是我們可以有幾種在Applet和Servlet之間交換信息的方式。  Sun公司的應用程序模型所推薦的策略和我們在這裡討論的一樣。將事務邏輯從界面中分離可以使得應用程序更加靈活,易於升級,這樣的應用程序也更易於設計和維護。但是這個模型不允許你的Applet直接訪問你的企業數據,這會大大減少你的系統的複雜性並大大提高你的系統的安全性。
Applet和Servlet的協同工作將有助於建立一個較好的應用