Globus Installation



專題報告書

以Google Desktop

建置個人化資訊服務

Developing an Information Portal

by using Google Desk Top tools

成員:s942910 程涵濡

s942917 陳揚棋

s942918 陳信文

指導教授: 陳隆彬 副教授

東海大學 資訊工程與科學系

網際網路系統與服務實驗室



1.簡介 1

2.背景 2

2.1 Google Desktop 2

2.2 JavaScript 3

2.3 正規表示式 4

3.系統架構 6

3.1 Google Desktop 系統架構圖 6

3.2 Gadget Designer 流程 6

3.3 Gadget 架構 9

3.4 MyGadget 架構流程圖 10

4.系統開發 11

4.1 網頁資料擷取 11

4.2在GoogleDesktop上輸出 14

5.作品成果介紹 16

5.1 顯示抓取的資料及資料的原始網頁 16

6.結論與未來展望 17

7.人員 18

8.參考書目 19

9.附錄 20

9.1 Google Desktop安裝 20

9.2 正規表示式API 28

Figure01: Google Desktop 系統架構圖 6

Figure02: Gadget物件圖 7

Figure03: Debug Console 7

Figure05: Gadget Setting 設定畫面 8

Figure06: Gadget 架構 9

Figure07: MyGadget 架構流程圖 10

Figure08: 網頁HTML原始檔 11

Figure09: 各網頁抓取正規表示式語法 12

Figure10: whlie迴圈程式碼 13

Figure11: for迴圈字串反轉 13

Figure12: ContentItem() 13

Figure13: 時間函數 14

Figure14: 取出陣列內容 14

Figure15: 顯示格式 14

Figure16: 用於顯示於Google Desktop 14

Figure17: 顯示結果 15

Figure18: 程式抓取畫面與實際網頁比較 16

Figure19: 從下載GoogleDesktop 20

Figure20: 安裝畫面 21

Figure21: Google Desktop服務條款 選擇我同意 21

Figure22: 安裝功能選擇 選擇所需要功能並點選完成 22

Figure23: 安裝完畢 22

Figure25: 點選左方的下載SDK 23

Figure26:勾選我已經閱讀並同意 API 條款及細則並點選下載SDK 24

Figure27: 開啟designer_en 24

Figure28: 從左上的File選單開啟main.js 25

Figure29: 從上方的Gadget選單選擇Build Package 25

Figure30: 建立GoogleDesktop小工具 26

Figure31: 建立的小工具其名稱會自動以該資料夾為名 26

Figure32: 執行小工具 27

Figure33: 成功執行 27

Figure34: 執行成果 28

1.簡介

  「Google 桌面」可以讓搜尋電腦資料就像使用 Google 搜尋網路一樣簡單。「Google 桌面」是一個桌面搜尋應用程式,可讓您用全文搜尋的方式搜尋電子郵件、檔案、音樂、相片、聊天內容、Gmail、您檢視過的網頁,以及更多資訊。 即使您平時不整理檔案、電子郵件和書籤,只要在電腦上使用「Google 桌面」進行搜尋,就能輕易找到所需資料。

  「Google 桌面」不只是幫助您搜尋您的電腦,它也會以小工具和側欄來協助您從網路上收集並管理新資訊。 您可以將 [Google 小工具] 放置在桌面上的任何地方,用它來顯示新郵件、氣象、相片、個人化新聞及更多其他資訊。 [側欄] 是位於桌面上的垂直列,可協助您管理小工具。

  我們的專題目標正是利用「Google 桌面」提供的API和Javascript語法來開發[Google 小工具] ,其開發方向是以擷取未提供RSS服務的網頁中的第一手更新資料為主。

2.背景

  這個章節,我們會介紹我的專題所用到的程式及所使用的到程式語言,像是Google Desktop、Javascript、正規表示式等的介紹。

2.1 Google Desktop

  Google桌面是Google公司的一款桌面搜索軟體,在Windows XP或Windows 2000的SP3以上版本的個人電腦以及Mac,Linux上本地運行。 該桌面搜索程序可以對一個人的電子郵件、電子文檔、音樂、照片、聊天記錄和使用者瀏覽過的網頁進行全文搜索。

  「Google桌面」不是開源、自由的軟體,但是在遵守最終用戶使用條款(EULA)的前提下,用戶可以免費下載使用。安裝完成後,「Google桌面」會花費數百兆的空間和一定時間來建立索引,並在每次開機的時候自動啟動,以實現搜索本地資源的功能。用戶也可以自由選擇關閉、刪除該軟體。

  「Google桌面」最初是在Windows Vista中可能提供的文件和網路搜索功能的影響下開發。一些人聲稱「Google桌面」和Mac OS X v10.4作業系統的Spotlight部分一樣,都從微軟2003年的專業開發者大會(PDC)上演示的Vista桌面搜索中獲得了靈感。因為「Google桌面」或許可以進行對Google的私有搜索演算法進行逆向工程,所以它得到了許多關注。

  「Google桌面」2.0版的測試版(Beta版)於2005年8月22日發布。它和1.0版的主要區別是增加了補充工具欄(sidebar)。補充工具欄是一個可以顯示個性化信息的面板,它可以放在Windows桌面某一側,顯示實時的新聞、電子郵件、照片、股票和天氣等信息。補充工具欄還包括了一個可以搜索個人電腦或其他Google搜索類型(如網頁、圖片、資訊、論壇等)的搜索框。

  「Google桌面」2.0版於2005年11月3日正式推出,新的特色包括Google Maps的補充工具欄外掛程式和更多對開發人員的幫助支持。

  「Google桌面」3.0版的測試版於2006年2月9日發布。它開始支持對網路上多台計算機進行檢索,這是本版中最為重大的改進,可以實現搜索遠程電腦桌面的功能。無論你在家中還是在單位,都可以共享不同電腦中的資源。這一功能看上去很美,不過也備受爭議。要實現此功能,用戶必須允許程序將你的搜索資料複製到Google的伺服器上去,雖然文件傳送過程是加密的,但不可否認,存在一定安全隱患。

  「Google桌面」3.0版於2006年3月14日正式推出,這個版本中的快速搜尋框,在你的桌面上的任意地方只要按兩次「ctrl」鍵,它就會出現。

2.2 JavaScript

  JavaScript是一種原型法物件導向的腳本語言,目前已經在全球資訊網上廣泛用於動態網頁的編程語言。JavaScript是ECMAScript標準的起源語言,也是網景通訊公司和Mozilla基金會的ECMAScript實施。網景通訊公司最初在它的Netscape Navigator 2.0產品上設計並實現,原名LiveScript。

  JavaScript不是Java:JavaScript和Java除了語法上有一些相似之處,以及都能夠當作網頁的程式語言以外,兩者是完全不相干的。

  JavaScript與JScript不同:為了掌握技術優勢,微軟推出了JScript來迎戰JavaScript的腳本語言。為了互用性,Ecma國際(前身為歐洲電腦製造商協會)建立了ECMA-262標準(ECMAScript)。現在兩者都屬於雙方的ECMAScript實施。

  JavaScript並不簡單:儘管JavaScript作為給非程式人員的腳本語言,而非作為給程式人員的程式語言來推廣和宣傳,但是JavaScript是一門具有非常豐富特性的語言,它有著和其它程式語言一樣的複雜性,或更甚複雜。實際上,你必需對JavaScript有紮實的理解才能用它來撰寫比較複雜的程式。

  JavaScript已經被Netscape公司提交給ECMA制定為標準,稱之為ECMAScript,標準編號ECMA-262。目前最新版為ECMA-262 3rd Edition。符合該標準的實現有:

Microsoft公司的Jscript。

Mozilla的Javascript-C(C語言實現),現名SpiderMonkey。

Mozilla的Rhino(Java實現)。

Digital Mars公司的DMDScript。

據測試,Spidermonkey的性能最好。 目前ECMA-262 4th Edition正在開發的過程中,與其對應的JavaScript的版本為JavaScript 2.0,目前也正在開發過程中。

  不同於伺服器端腳本語言,例如PHP與ASP,JavaScript是用戶端腳本語言,也就是說JavaScript是在用戶的瀏覽器上運行,不需要伺服器的支援而可以獨立運行。所以在早期程式員比較青睞於JavaScript以減少對伺服器的負擔,而與此同時也帶來另一個問題:安全性。而隨著伺服器的強壯,雖然現在的程式員更喜歡運行於伺服端的腳本以保證安全,但JavaScript仍然以其跨平台、容易上手等優勢大行其道。

  JavaScript是一種腳本語言,其源代碼在發往客戶端執行之前不需經過編譯,而是將文字格式的字元代碼發送給瀏覽器由瀏覽器解釋執行。解釋語言的弱點是安全性較差,而且在JavaScript中,如果一條執行不了,那麼下面的語言也無法執行。而且由於每次重新載入都會重新解譯,載入後,有些代碼會延遲至運行時才解譯,甚至會多次解譯,所以速度較慢。

  與其相對應的是編譯語言,例如Java。Java的源代碼在傳遞到客戶端執行之前,必須經過編譯,因而客戶端上必須具有相應平台上的模擬器或解釋器,它可以通過編譯器或解釋器實現獨立於某個特定的平台編譯代碼的束縛。但是它必須在服務器端進行編譯,這樣就拖延了時間。但因為已經封裝,所以能保證安全性。

2.3 正規表示式

  正規表示法(英文:Regular Expression),在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具裡,正規表達式通常被用來檢索和/或替換那些符合某個模式的文本內容。許多程式語言都支持利用正規表達式進行字元串操作。例如,在Perl中就內建了一個功能強大的正規表達式引擎。正規表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。「正規表示法」通常縮寫成「regex」,單數有regexp、regex,複數有regexps、regexes、regexen。

  最初的正規表示法出現于理論計算機科學的自動控制理論和形式語言理論中。在這些領域中有對計算(自動控制)的模型和對形式語言描述與分類的研究。1940年代,Warren McCulloch與Walter Pitts將神經系統中的神經元描述成小而簡單的自動控制元。在1950年代,數學家史蒂芬•科爾•克萊尼利用稱之為正規集合的數學符號來描述此模型。肯•湯普遜將此符號系統引入編輯器QED,然後是Unix上的編輯器ed,並最終引入grep。自此,正規表達式被廣泛地使用於各種Unix或者類似Unix的工具,例如Perl。

  Perl正規表示法源自於Henry Spencer寫的regex,它已經演化成了pcre(Perl兼容正規表示法Perl Compatible Regular Expressions),一個由Philip Hazel開發的,為很多現代工具所使用的庫。各計算機語言之間的正規表達式的整合目前開展的很差。未來的Perl6的子項目Apocalypse的設計中已考慮到了這點。

  正規表示法的形式定義故意非常精簡,避免定義多餘的量詞 ? 和 +,它們可以被表達為: a+ = aa* 和 a? = (a|ε)。有時增加補算子 ~ ;~R 指示在 Σ* 上的不在 R 中的所有字元串的集合。補算子是多餘的,因為它使用其他算子來表達(儘管計算這種表示的過程是複雜的,而結果可能指數性的增大)。

  這種意義上的正規表示法可以表達正規語言,精確的是可被有限狀態自動機接受的語言類。但是在簡潔性上有重要區別。某類正規語言只能用大小指數增長的自動機來描述,而要求的正規表示法的長度只線性的增長。正規表示法對應于喬姆斯基層級的類型-3文法。在另一方面,在正規表示法和不導致這種大小上的爆炸的非確定有限狀態自動機(NFA)之間有簡單的映射;為此 NFA 經常被用作正規表示法的替代表示。

  我們還要在這種形式化中研究表達力。如下面例子所展示的,不同的正規表示法可以表達同樣的語言: 這種形式化中存在著冗余。有可能對兩個給定正規表示法寫一個演算法來判定它們所描述的語言是否本質上相等,簡約每個表達式到極小確定有限自動機,確定它們是否同構(等價)。這種冗余可以消減到什麼程度? 我們可以找到仍有完全表達力的正規表示法的有趣的子集嗎? Kleene 星號和並集明顯是需要的,但是我們或許可以限制它們的使用。這提出了一個令人驚奇的困難問題。因為正規表示法如此簡單,沒有辦法在語法上把它重寫成某種規範形式。過去公理化的缺乏導致了星號高度問題。最近 Dexter Kozen 用克萊尼代數公理化了正規表示法。很多現實世界的「正規表示法」引擎實現了不能用正規表示法代數表達的特徵。

3.系統架構

  這章節我們以介紹我們專題所使用的程式架構,編譯程式的流程,及我們編寫的Gadget物件的架構,及最後程式執行所要經過的各種流程。

3.1 Google Desktop 系統架構圖

[pic]

Figure01: Google Desktop 系統架構圖

  程式執行時,Google Desktop會先對Server端即所要擷取資料的網頁發出Http request,接著Server端會回傳HTTP的Data給Google Desktop,接著Google Desktop根據我們的Gagdet內所撰寫的程式碼,對Data做分析處理,再將處理過後的結果,顯示於Google Desktop上給使用者觀看。

3.2 Gadget Designer 流程

# Step 1: Download and Install Software

  要使用Gadget Designer前,必須要先安裝Google Desktop,並下載SDK,將其解壓縮後,會出現一個api資料夾。

# Step 2: Create a New Gadget

  開啟api資料夾裏的tool資料夾,執行designer_en.exe,選取File > New Gadget即可開啟一個新的Gadget。一個Gadget所擁有的物件見下圖所示。Gadget物件的功能會在下一章節內做介紹。

[pic]

Figure02: Gadget物件圖

# Step 3: Add a UI Element

  建立完Gadget後,可以拉取所需要使用者元件在main.xml上,對所拉取的元件可以作名稱設定,所要顯示的的大小位置等。

# Step 4: Add Event Handling

  對元件快速點取兩下,可以對此物件做事件處理設定,此時會跳到main.js檔去做設定,在mail.js裡會有你所點取物件的專屬函數,在裡面可以對此函數做你想要它執行的程式碼編寫。

# Step 5: Get Debugging Output

  在View選單內,確定Debug Console是否有被選取,如果被選取後,會在Designer下方出現,當你在編寫你的Gadget完藥嘗試預覽時,就會顯示執行的資訊或是錯誤於Designer下方,如下圖所示。

Figure03: Debug Console

# Step 6: Customize Strings and Settings

  設定你的Gadget的一些資訊,點選string.xml,可以直接以文字編輯(Figure04),或是按F3以視窗模式來做設定(Figure05)。

[pic]

Figure04:string.xml內容[pic]

Figure05: Gadget Setting 設定畫面

# Step 7: Package the Gadget

  當你完成自己的Gadget時,必須Package你們Gadget元件,選取Gadget > Build Package或是按F7即可產生一個以你Gadget所在資料夾為名的gg檔,點擊兩次即可將你的Gadget於Google Desktop上執行。

3.3 Gadget 架構

[pic]

Figure06: Gadget 架構

main.js:主要是Gadget的程式部份,我們所需要的功能,事件處理等的程式碼都是在main.js裡面編寫的。

main.xml:主要是Gadget的版面設計部份,如元件的位置配置,元件的初始值設定,版面的大小、顏色等等之類的都是在main.xml做設定。

string.xml:主要是設定Gadget的資訊,顯示於Google Desktop時的名稱、Gadget的描述、Gadget的說明之類的設定。

other non-language-specific file:其他的物件,通常是Gadget的背景圖片,icon的顯示圖片之類的東西。

3.4 MyGadget 架構流程圖

[pic]

Figure07: MyGadget 架構流程圖

首先從getNews()開始執行,由http_request.responseText中抓取欲抓取頁面之原始碼,接著用正規表示式來擷取我們想要的資料,並將結果存入Array中,這個存取過程是用while迴圈執行的,當輸入的值是null值時,即跳出這迴圈並往下執行。接著,把Array的內容存入item.heading和item.snippet中,最後用AddContentItem把item下的兩個變數內容輸出到GoogleDesktop的側欄上。

getNews()執行完後便會啟動updateTimer(),當設定的時間倒數完畢時,便執行newsUpdate()。newsUpdate()的執行流程大體和getNews()相同,但其並沒有設置迴圈,而是只抓取最新一筆資料來和舊資料的最後一筆比對,如相同則不輸出,不同則呼叫getNews()再次抓取資料。

4.系統開發

  介紹我們攥寫程式所要考慮的部份,以及根據我們的要求所攥寫出來的程式碼解析。

4.1 網頁資料擷取

  所需要的擷取的網頁資料為公告訊息的標題及超連結,一開始要先自己找到要抓取的超連結文字,如圖:

[pic]

Figure08: 網頁HTML原始檔

在紅色框框的部分就是主要擷取的部份,不同的網站結構其規則架構也會有所更動。

  依照欲擷取部份的前後文,寫出適當的正規表示式。用正規表示式找出要擷取的網頁資料所在的內容原始檔中,其架構樣式。

[pic]

Figure09: 各網頁抓取正規表示式語法

  這裡為方便使用,把想看網頁的網址 (http_URL) 用switch分開選擇,並把其相對需要的正規表示式 (re) 和部份超連結網址 (web) 也同時選擇。

  藉由while迴圈與lastIndex來達成擷取所有符合正規表示式的網頁內容,並把它們存入陣列。

[pic]

Figure10: whlie迴圈程式碼

  這個for迴圈用反過來的原因是為了讓抓到的資料能夠依照順序排列,因為GoogleDesktop會把新抓到的資料排到最上方,所以要讓排列順序正確,便需用此法。

[pic]

Figure11: for迴圈字串反轉

new一個ContentItem()。

[pic]

Figure12: ContentItem()

時間。

[pic]

Figure13: 時間函數

把陣列的內容存到變數裡。

[pic]

Figure14: 取出陣列內容

輸出到contentarea的排列格式。

[pic]

Figure15: 顯示格式

ContentItem()的heading和snippet是contentarea的標題和內文。

[pic]

Figure16: 用於顯示於Google Desktop

4.2在GoogleDesktop上輸出

  把抓到的超連結文字放入title這個變數,連結則放入link中,DETAILS_HTML是在GoogleDesktop上輸出的排版方式,最後用gddItemDisplayInSidebar把結果顯示於GoogleDesktop上。

[pic]

Figure17: 顯示結果

5.作品成果介紹

  展示所攥寫的程式執行後的成果,以及是否有達到預設的目的做比較。

5.1 顯示抓取的資料及資料的原始網頁

[pic]

Figure18: 程式抓取畫面與實際網頁比較

6.結論與未來展望

  我們的作品著重在開發者的便利性,所以我們並沒有做出方便的UI介面,能夠讓使用者可以任意新增、刪除。

  另外,我們在擷取網頁資料時,因為是依據網頁結構去撰寫設定檔, 所以當網頁結構有更改寫法,就會導致程式中的正規表示式又要重新撰寫過。未來希望能將這些部份補齊,使得程式能夠更為便利

未來努力方向:

更為便利的 UI。

動態的資料擷取設定檔。

λ 資訊的便利性

資訊的可攜性

使用者選擇的自由性

7.人員

指導老師:陳隆彬 東海大學資訊工程與科學系 副教授

程涵濡:東海大學資訊工程與科學系四年級

陳揚棋:東海大學資訊工程與科學系四年級

陳信文:東海大學資訊工程與科學系四年級

8.參考書目

[1] 陳會安 Java Script 網頁製作徹底研究 , 民國 90 年六月初版 , 旗標出版股份有限公司

[2] 林邦傑 如何設計JavaScript程式 ,民國93年初版, 知城數位科技

[3] ; JavaWorld@TW

[4] ; Google Desktop APIs

[5] ; FUNction's 無趣隨筆

[6] ; 藍色小舖 Blue Shop 資訊專家社群

[7] ; Google桌面- 維基百科

[8] ; JavaScript - 維基百科

[9]

E5%BC%8F ;正則表達式- 維基百科

[10] ; Regular Expression Library

[11] ;[Javascript] 正規表示式 Regular Expression (RegExp)

9.附錄

9.1 Google Desktop安裝

官方網站:

目前版本:5.8.811.4345

作業環境:WindowsVista/XP/2000 SP3+

9.1.1. 下載Google Desktop

[pic]

Figure19: 從下載GoogleDesktop

9.1.2. 安裝

[pic]

Figure20: 安裝畫面

[pic]

Figure21: Google Desktop服務條款 選擇我同意

[pic]

Figure22: 安裝功能選擇 選擇所需要功能並點選完成

[pic]

Figure23: 安裝完畢

9.1.3下載GoogleDesktopSDK

[pic]

Figure24: 選取小工具連結[pic]

Figure25: 點選左方的下載SDK

[pic]

Figure26:勾選我已經閱讀並同意 API 條款及細則並點選下載SDK

[pic]

Figure27: 開啟designer_en

[pic]

Figure28: 從左上的File選單開啟main.js

[pic]

Figure29: 從上方的Gadget選單選擇Build Package

[pic]

Figure30: 建立GoogleDesktop小工具

[pic]

Figure31: 建立的小工具其名稱會自動以該資料夾為名

[pic]

Figure32: 執行小工具

[pic]

Figure33: 成功執行

[pic]

Figure34: 執行成果

9.2 正規表示式API

|字元 |描述 |

|\ |將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進位轉義符。例如,「n」匹配字元「n」|

| |。「\n」匹配一個換行符。序列「\\」匹配「\」而「\(」則匹配「(」。 |

|^ |匹配輸入字元串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配「\n」或「\r」之後的位置。 |

|$ |匹配輸入字元串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配「\n」或「\r」之前的位置。 |

|* |匹配前面的子表達式零次或多次。例如,zo*能匹配「z」以及「zoo」。*等價于{0,}。 |

|+ |匹配前面的子表達式一次或多次。例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。+等價于{1,}。 |

|? |匹配前面的子表達式零次或一次。例如,「do(es)?」可以匹配「do」或「does」中的「do」。?等價于{0,1}。 |

|{n} |n是一個非負整數。匹配確定的n次。例如,「o{2}」不能匹配「Bob」中的「o」,但是能匹配「food」中的兩個o。 |

|{n,} |n是一個非負整數。至少匹配n次。例如,「o{2,}」不能匹配「Bob」中的「o」,但能匹配「foooood」中的所有o。「o{1,}|

| |」等價于「o+」。「o{0,}」則等價于「o*」。 |

|{n,m} |m和n均為非負整數,其中n ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download