昨天在twitter里做了個小小的調查,使用Google日歷的朋友不少,大多數人都會用到其中一個功能:短信提醒。
這是個非常有效的事項提醒方式。
1、https加密訪問
Google日歷支持https方式連接,建議大家都使用這種方式。當你在Google因搜索低俗內容被斷開連接后,使用http方式是無法連接Google日歷的。Gmail也有https方式。
事實上,能用https的服務都建議大家使用這種方式,這個互聯網不可靠,你永遠不知道什么時候會被低俗。
2、拖曳選擇日期區間
你可以使用拖曳日期的方式選擇日程顯示區間:
3、設定個性化日期區間
當然,除了拖曳選擇日期區間外,你還可以在設置里設置“自定義視圖”顯示的日期數目。
4、給Google日歷換個皮膚
覺得Google日歷太丑了?有時我也有這樣的感覺,你可以使用Better GCal Firefox擴展使其變得漂亮,總體外觀如下:
一個好的日程表應該具有導出功能,也就是能與其它日程管理軟件/服務同步。
1、與電腦軟件同步
你可以在這里看到將Google日歷導出到Outlook等軟件和導入日歷到Google日歷的步驟。
如果你使用的是MS Outlook,你還可以使用專用的軟件來同步:Google Calendar Sync
2、同步到手機
(1)S60系列
如果你在用S60系列手機,你可以用GcalSync來將手機日程與Google日歷同步,首先你需要在手機上安裝GcalSync軟件。
安裝軟件后設置好用戶名和密碼即可。
(2)iPhone
對于iPhone來說,可以使用一款名為NemusSync的軟件,我目前正在使用,同步效果很理想。
(3)其它手機
如果你的手機既不是S60也不是iPhone,可以考慮使用GooSync服務。
首先你需要在GooSync注冊賬戶,導入你的賬戶信息,然后再在手機上安裝GooSync的軟件。
GooSync不但能同步日程表,還可以同步Email聯系人等。
3、結合Remember the Milk
Remember the Milk是最好的Todo List服務之一,你可以在Google日歷里將RTM導入,方法是:
將下面URL的日歷添加到Google日歷,接著輸入RTM的用戶信息:
http://www.rememberthemilk.com/services/modules/googlecalendar/ics.rtm
1、短信通知
大多數人都會使用這種通知方式。Google日歷的短信通知方式是免費的,支持大多數手機號,你可以在Google日歷設置里添加手機號,在添加事項后設置短信提醒。
讓我好奇的是,每次SMS通知的SP號都是不一樣的。
2、團隊日程群發短信
如果你在為一個團隊管理日程,你希望每個人都收到短信提醒,可以用以下的方法:
(1)讓每個人注冊Google日歷,并設置好手機號
(2)添加一個團隊日歷,同時邀請所有團隊成員(Email方式)
(3)將事項設置為短信提醒
這主要是用于團隊事物提醒,最好別濫用在群發短信上。
3、免費天氣預報短信
既然Google日歷支持導入日歷又支持短信提醒,那是否可以導入一個天氣日歷,然后我們就可以接收免費的天氣預報短信呢?
能,具體請移步:免費接收天氣預報短信的兩種方式
1、快捷鍵
或許你不知道,Google日歷是支持快捷鍵操作的,英文版的Google日歷比中文版有更多的快捷鍵。和在Google Reader和Gmail的快捷鍵一樣,J,K分別是上下操作。C(compose)是新建日程。
當你忘記快捷鍵時,同樣可以輸入?(Ctrl+/)來查看快捷鍵提示。
2、拖曳日程
Google日歷支持拖曳日程,你可以將某個日程拖到另外一天或另一時段(月視圖不可拖曳改變時間):
1、日歷分享
事實上在說到“團隊短信提醒”時已提到日歷分享,你可以與特定的人分享這個日歷(通過email),也可以將這個日歷設置為公開,這樣所有人都可以導入你的日歷。
2、嵌入到網頁
這是個十分有用的功能,之前我做的奧運日程表就是使用了Google日歷的網頁嵌入功能,具體操作可以參考嵌入奧運日程的文章。
3、訂閱日歷
既然日歷可以分享給別人導入,你同樣也可以導入別人的日歷。你可以直接從URL里添加一個新日歷,也可以在日歷搜索里搜索日歷。
比如我,搜索到了F1 2009年的賽歷,這樣我就不會錯過今年的F1比賽了。
1、RSS訂閱日歷
和前面提到的“訂閱日歷”不一樣,這里的訂閱是用RSS閱讀器來訂閱日歷。如果你是一個天天只生活在閱讀器里的人,你可以訂閱任何公開的日歷。
每個公開的日歷都有唯一的RSS訂閱地址。這種方式會導致日程滯后,因為閱讀器抓取頻率是固定的,不是無間斷掃描。
2、作為日記使用
將Google日歷當做日記來使用是個不錯的想法,你可以新建一個“日記”日歷,然后每天在這個日歷里寫上日記。
有什么比這樣寫私人日記更方便?
3、使用Twitter更新日程
Twitter進階手冊里應該添加這個項目,這實在太有用了。
打開http://twittercal.com,注冊賬號后在twitter follow twittercal機器人,以后將日程信息以私信的形式發給twittercal機器人,日程就會被添加到Google日歷。
GTD是一門高深的學問,如何將事情以最高效并且不遺漏地做好是一件不容易的事。不要盲目地認為大腦可以記錄下一切,這是很難的,尤其是一些突如其來的想法。
我的做法是,隨身帶備筆和紙,外加使用Google日歷與手機日程同步。
有時我會有突然的想法,如果當時我在線,我會用Gtalk將它發送到我一個備用郵箱;如果不在線,如果沒有圖像或公式,我會記在手機上,然后同步到日歷;如果有圖的話,那筆和紙是必須的。
一旦有什么事情要在半天后做,我一定會添加到Google日歷,我已經不再相信我的大腦了,在這個信息過載的世界,我無法依靠大腦去記住一切。我認為,凡是能快速查詢到的信息,都不必記在大腦里。
我很少使用軟件來記錄日程,一般都使用在線服務
據最新的互聯網安全威脅報告顯示,混合式網絡威脅日益增多。目前全球每20秒就發生一次計算機入侵事件,Windows系統和組件的漏洞增多以及嚴重信息系統漏洞的不斷涌現,使得網絡安全 成為亟待解決的問題。如何保護企業的機密信息不受黑客和工業間諜的入侵,已成為政府機構、電信運營商 、企事業單位信息化健康發展需首要考慮的問題。
由于層出不窮的病毒攻擊著網絡系統 中的各級設備,而各種病毒、CIH、沖擊波等更是侵犯著網絡中的基礎設施,這些情況迫使安全問題 解決策略不能再局限于某一節點、某一設備上,而是要從系統的高度出發,全面考慮全網的設施,全新認識安全防護 。對于電信運營商而言,不僅要從物理層保證傳輸安全,而且還要站在網絡層次的高度,重新看待和分析網絡安全,在全網架構中確定重點的防范區域,分層次、分階段的布設安全措施。
一、傳統電信網的安全
傳統電信網是基于連接的物理通信網絡,且是封閉的網絡。同時,傳統用戶終端也是模擬終端,如電話機、傳真機等是不帶智能的,這就使得相應業務完全由運營商控制,即控制和承載不分離,網絡面臨的安全的復雜性也就大大低于現有網絡。
傳統電信網解決通信安全的主要目的是在物理傳輸上防止竊聽及數據傳輸問題,對數據傳輸其主要的安全保護措施是密碼技術,不涉及OSI或TCP/IP 的上層協議 。
二、現有網絡的安全
近年來由于互聯網的快速發展,電信網的分組數據業務呈爆炸性增長,基于TDM的PSTN話音網和分組交換數據網呈現融合趨勢,即電信網與互聯網的融合,形成可以傳遞話音和數據等綜合業務的新一代網絡。
由于互聯網是一個IP網絡,它是開放且無連接性的,具有邊界和路徑不確定性:從用戶源主機到另一個目的主機可能存在多條路徑,一個主機可能是兩個不同網絡中的一個中轉點。因此,一個網絡中的資源可由另一網中的用戶訪問。這樣,一些未經授權的非法用戶可能就會給網絡安全構成嚴重的威脅。
網絡安全已經成為互聯網發展過程中不容忽視的問題。尤其是為了減緩IP地址 匱乏,引進了NAT 技術,現在大部分諸如企業網、校園網 等的局域網 都采用了這種NAT技術,這種技術破壞了端到端的基本原則,在很大程度上破壞了互聯網的授權和鑒定機制。
三、網絡安全體系結構
這里針對互聯網絡系統實際運行TCP/IP協議模型來分析。TCP/IP 協議模型網絡安全貫穿于信息系統的四個層次,即網絡接口 層、網絡層、傳輸層、應用層。為此基于TCP/IP分層模型的網絡安全服務也是分層的,相應的不同層次的網絡服務也是不同的,需要分層進行配置 。下表是TCP/IP分層模型中提供的的網絡安全服務 (Y表示服務選項并入該層的標準之中,空格表示不提供)。
1.網絡接口層安全
網絡接口層是TCP/IP的最低層,包括OSI的物理層、數據鏈路層 。網絡接口層有兩種類型:第一種是設備驅動程序(如局域網的網絡接口);第二種是含自身數據鏈路協議的復雜子系統(如X.25中的網絡接口)。為保證通過網絡鏈路傳送的數據不被竊聽,主要采用劃分VLAN 、加密通信(遠程網)等手段進行加密。
對于通過使用VPN 業務連接多個私有地點的組織應該使用NAT、防火墻 和數據加密 技術。在VPN拓撲結構中,私有數據在公共網絡上傳送,因此加密是必須的。第2層隧道協議(L2TP)就是互聯網工程任務組(IETF)針對在公共網絡上用隧道傳送私有數據而制定的標準。作為VPN業務中的一種,光虛擬專用網 (OVPN)是下一代光傳送網-智能光網絡最有潛力的增值業務。OVPN的關鍵技術包括:安全隧道與信息加密技術 ,即使用加密與封裝相結合的技術對用戶數據進行安全保護;在VPN用戶訪問網絡資源 及管理員對VPN系統進行管理之前,采用用戶認證技術進行身份認證 ;訪問控制 技術提供細粒度的訪問控制功能以實現對用戶信息資源的保護。
使用光虛擬專用網不僅具有共享的經濟性、靈活性、可靠性和可擴展性等特點,更重要的是它在光層的安全性受到電信運營商的重視,這對于客戶來說支出更少,而對于運營商來說則有更多的收入、更安全的網絡。可以說,OVPN服務對于用戶和運營商來說是一種雙贏的選擇方案,在將來的智能光網絡領域有著廣泛的應用前景。
2.網絡層安全
網絡層安全即IP層安全性,它的主要優點是其透明性,也就是說,安全服務的提供不需要應用程序,也不需要對其他通信層次和網絡部件做任何改動。最主要缺點的是IP層一般對屬于不同進程 的包不作區別。對所有去往同一地址的包,它將按照同樣的加密密鑰和訪問控制策略來處理,這將使得網絡安全性能下降。針對面向主機密鑰分配的這些問題,RFCl825推薦使用面向用戶的密鑰分配,其中,不同的連接會得到不同的加密密鑰。但是,面向用戶的密鑰分配需要對相應的操作系統 內核作比較大的改動。
IP層非常適合提供基于主機的安全服務,相應的安全協議可以用來在互聯網上建立安全的IP通道和虛擬專網 。例如,利用它對IP包的加密和解密功能,可以簡捷地強化防火墻系統的防衛能力。
網絡層的安全性問題核心在于網絡是否能得到控制,目標網站通過對來源IP進行分析,便能夠初步判斷來自這一IP的數據是否安全,是否會對本網絡系統造成危害,來自這一IP的用戶是否有權使用本網絡的數據。一旦發現某些數據來自不可信任的IP地址,系統便會自動將這些數據阻擋在系統之外,并且大多數系統能夠自動記錄那些曾經造成過危害的IP地址,使它們的數據無法造成第二次危害。網絡層主要的安全技術 包括:
(1)防火墻
防火墻是建立在內外網絡邊界上的過濾封鎖機制。內部網絡被認為是安全和可信賴的,而外部網絡(通常是互聯網)被認為是不安全和不可信賴的。防火墻的作用是防止不希望的、未經授權的通信進入被保護的內部網絡,通過邊界控制強化內部網絡的安全策略 。
防火墻對于解決一些機構網絡邊界安全問題起到了比較好的效果,應用很廣泛,但它只能是網絡安全措施的一個組成部分,而不能解決所有的網絡安全問題。
(2)IP安全協議(IPSec)
IP安全協議(IPSec)是一組提供數據保密性、數據完整性和對IP層的參與各方進行身份驗證 的公開標準。IPSec已經獲得行業的認可,客戶也要求所購買的互聯網產品中包含對它的支持。IPSec使用認證頭部(AH)和安全內容封裝(ESP)兩種機制,前者提供認證和數據完整性,后者實現通信保密。
IPSec使得一個系統能夠選擇安全協議和算法,并且建立密鑰。互聯網密鑰交換(IKE)協議提供了對IPSec同等各方的身份驗證。使用IKE還可以對IPSec密鑰和其他安全性相關措施進行協商。IKE主要使用以下技術:
① DES——用來對數據包數據進行加密;
② Diffie-Hellman——用來建立一個共享的、保密的會話密鑰;
③ Message Digest 5(MD5)——一個對數據包數據進行身份驗證的哈希算法;
④ Secure Hash Algorithm(SHA) ——一個對數據包數據進行身份驗證的哈希算法;
⑤ RSA encryptednonces——提供否認功能;
⑥RSA簽名——提供認可功能。
(3) 入侵檢測 技術
ICSA(入侵檢測系統論壇)對入侵檢測技術的定義是:通過從計算機網絡 或計算機系統中的若干關鍵點收集信息并對其進行分析,從中發現網絡或系統中是否有違反安全策略的行為和遭到襲擊跡象的一種安全技術。
入侵檢測技術是動態安全技術中最為核心的技術之一。傳統的操作系統加固技術和防火墻隔離技術等都是靜態安全防御技術,對網絡環境下日新月異的攻擊手段缺乏主動的反應。入侵檢測作為一種積極主動的安全防護技術,從網絡安全立體縱深、多層次防御的角度出發,在不影響網絡性能 的情況下能對網絡進行監測,提供了對內部攻擊、外部攻擊和誤操作的實時保護,在網絡系統受到危害之前攔截和響應入侵。
目前,利用最新的可適應網絡安全技術 和 P2DR(PolicyProtectionDetectionResvonse)安全模型,已經可以深入地研究入侵事件、入侵手段本身及被入侵目標的漏洞等。入侵檢測技術通過對入侵行為的過程與特征的研究,使安全系統對入侵事件和入侵過程能做出實時響應。入侵檢測技術的一個發展趨勢是將它集成到路由器或三層交換機 中,在實現網絡安全的過程中入侵檢測技術執行的任務包括:監視、分析用戶及系統活動;系統構造和弱點的審計;識別、反映已知進攻的活動模式并向相關人士報警;異常行為模式的統計分析;評估重要系統和數據文件的完整性;操作系統的審計跟蹤管理,并識別用戶違反安全策略的行為。
3.傳輸層安全
傳輸層的脆弱性已經成為網絡協議 攻擊的主要突破口之一,其漏洞如下:
① TCP連接 的建立與終止。TCP連接的建立與斷開機制保證了傳輸的可靠性與速度,但是在連接建立過程完成之后,服務器端 不再驗證連接的另一方是不是合法的用戶,這種脆弱性的直接后果是連接可能被竊取。
② TCP連接請求對隊列的處理方法看起來很適用于連接的實際情況,但是很容易出現以下現象:如果某一用戶不斷地向服務器某一端口發送申請TCP連接的SYN 請求包,但不對服務器的SYN包發回ACK確認信息,則無法完成連接。當未完成的連接填滿傳輸層的隊列時,它不再接受任何連接請求,包括合法的連接請求,這樣就可能使服務器端口服務掛起。
③TCP連接的堅持。TCP連接仍舊能保持的特性會造成當TCP連接上很長時間內無數據被傳送時TCP連接資源的浪費。畢竟服務器某個端口可以存在的最大連接數有限,保持著大量不傳輸數據 的連接將極大地降低服務器性能,而且在服務器的兩次探測之間,可能導致TCP連接被竊取,使得原來與服務器連接的機器死機或重啟。
由于TCP/IP協議本身非常簡單,沒有加密、身份認證等安全特性,因此要向上層應用提供安全通信的機制就必須在TCP之上建立一個安全通信層次。傳輸層網關就是在兩個通信節點之間代為傳遞TCP連接并進行控制,這個層次一般稱作傳輸層安全。最常見的傳輸層安全技術有SSL (安全套接層協議)、SOCKS和安全RPC等。同網絡層安全機制相比,傳輸層安全機制的主要優點是它提供基于進程對進程(而不是主機對主機)的安全服務和加密傳輸信道,利用公鑰體系進行身份認證、安全強度高、支持用戶選擇的加密算法。這一成就如果再加上應用級的安全服務,就可以提供更加安全可靠的安全性能。
4.應用層安全
應用層的缺陷主要集中在R系列命令中(rcp、rsh、rlogin等),這些命令是基于可信任主機之間的關系而設置的方便用戶登錄的一種方法,可信任主機不需要口令也可以通過R系列命令登錄進入目標系統。
一般說來,在應用層提供安全服務有下面幾種可能的做法。首先是對每個應用(及應用協議)分別進行修改和擴展,加入新的安全功能。一些重要的TCP/IP應用已經這樣做了。例如,在RFCl421~1424中,IETF規定了私用強化郵件(PEM)來為基于SMTP的電子郵件 系統提供安全服務,應用層對防止系統遭病毒侵入和黑客攻擊 都有極其重要的作用。另外,應用層還可以使用應用平臺提供的安全服務,如采用通信內容安全保護、通信雙方的認證、審計等手段來保證基本安全。
四、結束語
在安全性設計中包含的任務與網絡總體設計所包含的任務是一致的:分析網絡安全需求 和目標,對其復雜性作出折中,因為任何網絡都不會有絕對的安全,安全的保護和策略越復雜,則投入的網絡運營成本越高。因此,找到兩者的平衡點,制定出一種合適的安全策略是非常必要的。
Firebug 是 Mozilla Firefox 瀏覽器的開源擴展,提供了很多工具,可以監視、編輯和調試任何 Web 站點的級聯樣式表(CSS)、HTML、文檔對象模型(DOM)和 JavaScript。Firebug 包括一個 JavaScript 控制臺、一個日志記錄 API 以及一種有用的網絡監視器。借助 Firebug,可以很輕松地調試和優化 Web 和 Ajax 應用程序。
本文將幫助您熟悉所如下的 Firebug 特性:
![]() ![]() |
使用 Firefox,下載 Firebug。通過單擊頁面右側的橙色按鈕 Install Firebug 安裝此擴展。
Firefox 安裝了此擴展后,重啟瀏覽器。要使用 Firebug:
本文使用了第一種方法在相同的瀏覽器窗口中打開 Firebug,如圖 1 所示:
安裝后,Firebug 是禁用的。單擊 Enable Firebug 啟用它,如圖 2 所示:
本文的后面的內容將討論 Firebug 的特性。
![]() ![]() |
HTML 和 CSS 工具包括:HTML 檢查和編輯、CSS 編輯和 CSS 可視化。
可以使用 HTML 檢查特性在源代碼中定位可視 HTML。
圖 4 給出了 Firebug 編輯窗口以及瀏覽器窗口中已編輯的文本。“Editing with Firebug” 已經代替了原先的 Ajax 標題。
在檢查元素時,將會看到 Firebug 窗口內的元素嵌套,如圖 5 所示:
還可以通過檢查這個 Web 頁面進行 CSS 編輯。Inspection 視圖會顯示相關的 CSS 條目,包括繼承樣式。如圖 6 的示例:
CSS 工具還可用來編輯 CSS 即時屬性、禁用屬性、自動完成和圖片預覽,如圖 7 所示:
CSS 的可視化在檢查 HTML(回顧 圖 3 中的藍色邊框)已經展示過了。Firebug Layout 選項卡顯示了更多的信息,比如間隙、 偏移和其他相關的量度。圖 8 中的布局窗口則顯示了一個導航元素的量度:
圖 9 展示了能即時編輯 CSS 盒的奇妙的 Firebug 特性:
![]() ![]() |
現在,JavaScript 工具是 Web 開發中最有用的工具之一。Firebug 提供了調試、剖析、日志記錄和命令行控制臺特性。
Firebug JavaScript 工具包括斷點、監視表達式和典型調試器中常見的其他一些工具。圖 10 展示了斷點和逐步調試的實際例子。請注意作為工具提示的主機變量的值。
有用的調試工具能:
JavaScript 剖析非常有用。如 Firebug 中的其他特性一樣,剖析也很容易使用。單擊 Console 選項卡上的 Profile 啟動剖析器,如圖 11 所示:
剖析開始后,可以瀏覽一下此站點。單擊 Profile 獲得剖析報告,如圖 12 所示:
該報告顯示了花在函數上的時間和平均時間等等。
對于更愿意使用老的日志記錄(而非調試)方式的開發人員,Firebug 提供了日志記錄功能。日志記錄使用的是一種 Firebug JavaScript API。最簡單的一種日志條目是 console.log("logging");
。
Console API 包含其他一些功能,如清單 1 所示:
console.time("test timer"); console.log("Hello from ",document.title); console.info("This is info"); console.warn("This is warning"); console.error("This is error"); console.timeEnd("test timer"); |
可以使用 console.time
和 console.timeEnd
來測量執行時間。在詳細報告中顯示結果的 console.profile()
和 console.profileEnd()
(見清單 1)也可用來測量執行時間。
圖 13 顯示了這些結果。JavaScript 控制臺日志測試功能被添加到由 Web 服務器提供服務的頁面中。
Console API 內其他有用的特性還有堆棧跟蹤、對象檢查和字符串格式化。
Firebug 最為強大特性之一就是 JavaScript 命令行。這種命令行的使用方式與其他命令行一樣;它執行您編寫的所有 JavaScript 代碼,好像它們就是頁面的一部分一樣。通過命令行,可以檢查 DOM、獲得屬性等等。所有返回值都顯示在控制臺上。
命令行具有自動完成功能(使用 Tab 鍵)以及完善的文本編輯器(能夠編寫完整的函數而不僅僅是幾行代碼)等等。圖 14 給出了一個簡單的控制臺會話。請注意 Web 頁面左上角的徽標。這里也可以進行即時編輯。
與控制臺類似,命令行也有一個 API,它包含可用于 Firebug 的特殊函數,比如 $(id)。該函數能夠返回帶有給定 id 的元素。
![]() ![]() |
Firebug Network Monitor 特性可用來監視加載 Web 頁面所花費的時間。使用 Net 選項卡可以看到進度欄,該進度欄顯示了一個文件相對所有其他文件開始和停止加載的時間。Network Monitor 分開每個文件的流量,因此就可以查看加載圖像、JavaScript、HTML 等各占用了多少時間。此外,還可以查看資源是否從瀏覽器緩存中加載。
對于本例中的 Ajax 開發,Firebug 在 Net 選項卡和 Console 選項卡中均顯示了每個 XMLHttpRequest。
圖 15 顯示了如何利用 Network Monitor 查看 HTTP 請求和響應頭。要查看 HTTP 頭,只需單擊每個請求左側的箭頭將其展開。全部請求、已用時間和內容的大小均顯示在 Firebug 窗口底部。
![]() ![]() |
Firebug 的其他特性包括:
一旦錯誤發生,Firebug 能夠提供有用的:
Firebug 還會顯示只與所查看的頁面相關的錯誤。
Document Object Model 是 Web 頁面中的對象和函數的等級結構。Firebug DOM 包括所有定制的和標準的對象,而且 DOM explorer 能夠分辨它們。這里同樣可以進行 JavaScript 代碼導航、自動完成和即時編輯。
Firebug 定制特性包括黑名單和白名單以及依據個人需要更改字體大小的功能。
出處:http://www.sinoprise.com/read.php?tid-662-page-e-fpage-1.html,我沒有改動原文,只是進行了一些排版和整理。
參考文獻:http://www.fsf.org/licensing/licenses/
現今存在的開源協議很多,而經過Open Source Initiative組織通過批準的開源協議目前有58種(http://www.opensource.org/licenses/alphabetical)。我們在常見的開源協議如BSD, GPL, LGPL,MIT等都是OSI批準的協議。如果要開源自己的代碼,最好也是選擇這些被批準的開源協議。
這里我們來看四種最常用的開源協議及它們的適用范圍,供那些準備開源或者使用開源產品的開發人員/廠家參考。
BSD開源協議(original BSD license、FreeBSD license、Original BSD license)
BSD開源協議是一個給于使用者很大自由的協議。基本上使用者可以"為所欲為",可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發布。
但"為所欲為"的前提當你發布使用了BSD協議的代碼,或則以BSD協議代碼為基礎做二次開發自己的產品時,需要滿足三個條件:
BSD 代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。BSD由于允許使用者修改和重新發布代碼,也允許使用或在BSD代碼上開發商業軟件發布和銷售,因此是對商業集成很友好的協議。而很多的公司企業在選用開源產品的時候都首選BSD協議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發。
Apache Licence 2.0(Apache License, Version 2.0、Apache License, Version 1.1、Apache License, Version 1.0)
Apache Licence是著名的非盈利開源組織Apache采用的協議。該協議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發布(作為開源或商業軟件)。需要滿足的條件也和BSD類似:
Apache Licence也是對商業應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業產品發布/銷售。
GPL(GNU General Public License)
我們很熟悉的Linux就是采用了GPL。GPL協議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業軟件發布和銷售。這也就是為什么我們能用免費的各種linux,包括商業公司的linux和linux上各種各樣的由個人,組織,以及商業軟件公司開發的免費軟件了。
GPL協議的主要內容是只要在一個軟件中使用("使用"指類庫引用,修改后的代碼或者衍生代碼)GPL 協議的產品,則該軟件產品必須也采用GPL協議,既必須也是開源和免費。這就是所謂的"傳染性"。GPL協議的產品作為一個單獨的產品使用沒有任何問題,還可以享受免費的優勢。
由于GPL嚴格要求使用了GPL類庫的軟件產品必須使用GPL協議,對于使用GPL協議的開源代碼,商業軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發的基礎。
其它細節如再發布的時候需要伴隨GPL協議等和BSD/Apache等類似。
LGPL(GNU Lesser General Public License)
LGPL是GPL的一個為主要為類庫使用設計的開源協議。和GPL要求任何使用/修改/衍生之GPL類庫的的軟件必須采用GPL協議不同。LGPL允許商業軟件通過類庫引用(link)方式使用LGPL類庫而不需要開源商業軟件的代碼。這使得采用LGPL協議的開源代碼可以被商業軟件作為類庫引用并發布和銷售。
但是如果修改LGPL協議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL協議。因此LGPL協議的開源代碼很適合作為第三方類庫被商業軟件引用,但不適合希望以LGPL協議代碼為基礎,通過修改和衍生的方式做二次開發的商業軟件采用。
GPL/LGPL都保障原作者的知識產權,避免有人利用開源代碼復制并開發類似的產品
MIT(MIT)
MIT是和BSD一樣寬范的許可協議,作者只想保留版權,而無任何其他了限制.也就是說,你必須在你的發行版里包含原許可協議的聲明,無論你是以二進制發布的還是以源代碼發布的.
我們將在如下的章節中利用一些例子來解釋正則表達式的用法,絕大部分的例子是基于vi中的文本替換命令和grep文件搜索命令來書寫的,不過它們都是比較典型的例子,其中的概念可以在sed、awk、perl和其他支持正則表達式的編程語言中使用。你可以看看不同工具中的正則表達式這一節,其中有一些在別的工具中使用正則表達式的例子。還有一個關于vi中文本替換命令(s)的簡單說明附在文后供參考。
在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。
要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了所有的元字符和對它們的一個簡短的描述。
元字符 | 描述 | |
---|---|---|
|
|
|
|
匹配任何單個字符。例如正則表達式r.t匹配這些字符串:rat、rut、r t,但是不匹配root。 | |
|
匹配行結束符。例如正則表達式weasel$ 能夠匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。 | |
|
匹配一行的開始。例如正則表達式^When in能夠匹配字符串"When in the course of human events"的開始,但是不能匹配"What and When in the"。 | |
|
匹配0或多個正好在它之前的那個字符。例如正則表達式.*意味著能夠匹配任意數量的任何字符。 | |
|
這是引用府,用來將這里列出的這些元字符當作普通的字符來進行匹配。例如正則表達式\$被用來匹配美元符號,而不是行尾,類似的,正則表達式\.用來匹配點字符,而不是任何字符的通配符。 | |
[c1-c2] [^c1-c2] |
匹配括號中的任何一個字符。例如正則表達式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括號中使用連字符-來指定字符的區間,例如正則表達式[0-9]可以匹配任何數字字符;還可以制定多個區間,例如正則表達式[A-Za-z]可以匹配任何大小寫字母。另一個重要的用法是“排除”,要想匹配除了指定區間之外的字符——也就是所謂的補集——在左邊的括號和第一個字符之間使用^字符,例如正則表達式[^269A-Z] 將匹配除了2、6、9和所有大寫字母之外的任何字符。 | |
|
匹配詞(word)的開始(\<)和結束(\>)。例如正則表達式\<the能夠匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:這個元字符不是所有的軟件都支持的。 | |
|
將 \( 和 \) 之間的表達式定義為“組”(group),并且將匹配這個表達式的字符保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用 \1 到\9 的符號來引用。 | |
|
將兩個匹配條件進行邏輯“或”(Or)運算。例如正則表達式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:這個元字符不是所有的軟件都支持的。 | |
|
匹配1或多個正好在它之前的那個字符。例如正則表達式9+匹配9、99、999等。注意:這個元字符不是所有的軟件都支持的。 | |
|
匹配0或1個正好在它之前的那個字符。注意:這個元字符不是所有的軟件都支持的。 | |
\{i,j\} |
匹配指定數目的字符,這些字符是在它之前的表達式定義的。例如正則表達式A[0-9]\{3\} 能夠匹配字符"A"后面跟著正好3個數字字符的串,例如A123、A348等,但是不匹配A1234。而正則表達式[0-9]\{4,6\} 匹配連續的任意4個、5個或者6個數字字符。注意:這個元字符不是所有的軟件都支持的。 |
最簡單的元字符是點,它能夠匹配任何單個字符(注意不包括新行符)。假定有個文件test.txt包含以下幾行內容:
要想匹配行首的字符要使用抑揚字符(^)——又是也被叫做插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,但是這會匹配第三行的the,所以要使用正則表達式^he,它只匹配在行首出現的h。
有時候指定“除了×××都匹配”會比較容易達到目的,當抑揚字符(^)出現在方括號中是,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情性(也就是the和she),可以使用:[^st]he。
可以使用方括號來指定多個字符區間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接著0或者多個字母(大寫或者小寫)。當然我們也可以用元字符+做到同樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等價。但是要注意元字符+ 并不是所有支持正則表達式的程序都支持的。關于這一點可以參考后面的正則表達式語法支持情況。
要指定特定數量的匹配,要使用大括號(注意必須使用反斜杠來轉義)。想匹配所有100和1000的實例而排除10和10000,可以使用:10\{2,3\},這個正則表達式匹配數字1后面跟著2或者3個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數字,例如正則表達式0\{3,\} 將匹配至少3個連續的0。
這里有一些有代表性的、比較簡單的例子。
vi 命令 | 作用 |
|
|
:%s/ */ /g | 把一個或者多個空格替換為一個空格。 |
:%s/ *$// | 去掉行尾的所有空格。 |
:%s/^/ / | 在每一行頭上加入一個空格。 |
:%s/^[0-9][0-9]* // | 去掉行首的所有數字字符。 |
:%s/b[aeio]g/bug/g | 將所有的bag、beg、big和bog改為bug。 |
:%s/t\([aou]\)g/h\1t/g | 將所有tag、tog和tug分別改為hat、hot和hug(注意用group的用法和使用\1引用前面被匹配的字符)。 |
將所有方法foo(a,b,c)的實例改為foo(b,a,c)。這里a、b和c可以是任何提供給方法foo()的參數。也就是說我們要實現這樣的轉換:
之前 | 之后 | |
foo(10,7,2) | foo(7,10,2) | |
foo(x+13,y-2,10) | foo(y-2,x+13,10) | |
foo( bar(8), x+y+z, 5) | foo( x+y+z, bar(8), 5) |
下面這條替換命令能夠實現這一魔法:
現在讓我們把它打散來加以分析。寫出這個表達式的基本思路是找出foo()和它的括號中的三個參數的位置。第一個參數是用這個表達式來識別的::\([^,]*\),我們可以從里向外來分析它:
[^,] | 除了逗號之外的任何字符 | |
[^,]* | 0或者多個非逗號字符 | |
\([^,]*\) | 將這些非逗號字符標記為\1,這樣可以在之后的替換模式表達式中引用它 | |
\([^,]*\), | 我們必須找到0或者多個非逗號字符后面跟著一個逗號,并且非逗號字符那部分要標記出來以備后用。 |
現在正是指出一個使用正則表達式常見錯誤的最佳時機。為什么我們要使用[^,]*這樣的一個表達式,而不是更加簡單直接的寫法,例如:.*,來匹配第一個參數呢?設想我們使用模式.*來匹配字符串"10,7,2",它應該匹配"10,"還是"10,7,"?為了解決這個兩義性(ambiguity),正則表達式規定一律按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個參數而不是我們期望的一個。所以,我們要使用[^,]*來強制取出第一個逗號之前的部分。
這個表達式我們已經分析到了:foo(\([^,]*\),這一段可以簡單的翻譯為“當你找到foo(就把其后直到第一個逗號之前的部分標記為\1”。然后我們使用同樣的辦法標記第二個參數為\2。對第三個參數的標記方法也是一樣,只是我們要搜索所有的字符直到右括號。我們并沒有必要去搜索第三個參數,因為我們不需要調整它的位置,但是這樣的模式能夠保證我們只去替換那些有三個參數的foo()方法調用,在foo()是一個重載(overoading)方法時這種明確的模式往往是比較保險的。然后,在替換部分,我們找到foo()的對應實例,然后利用標記好的部分進行替換,是的第一和第二個參數交換位置。
這里有幾行我們現在的數據:
下面就是第一個替換命令:
下面這個替換命令則用來去除空格:
Billy tried really hard而你想把"really"、"really really",以及任意數量連續出現的"really"字符串換成一個簡單的"very"(simple is good!),那么以下命令:
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
:%s/\(really \)\(really \)*/very /就會把上述的文本變成:
Billy tried very hard表達式\(really \)*匹配0或多個連續的"really "(注意結尾有個空格),而\(really \)\(really \)* 匹配1個或多個連續的"really "實例。
Sally tried very hard
Timmy tried very hard
Johnny tried very hard
當然,你也可以在Visual C++編輯器中使用RE。選擇Edit->Replace,然后選擇"Regular expression"選擇框,Find What輸入框對應上面介紹的vi命令:%s/pat1/pat2/g中的pat1部分,而Replace輸入框對應pat2部分。但是,為了得到vi的執行范圍和g選項,你要使用Replace All或者適當的手工Find Next and Replace(譯者按:知道為啥有人罵微軟弱智了吧,雖然VC中可以選中一個范圍的文本,然后在其中執行替換,但是總之不夠vi那么靈活和典雅)。
Sed是Stream EDitor的縮寫,是Unix下常用的基于文件和管道的編輯工具,可以在手冊中得到關于sed的詳細信息。
這里是一些有趣的sed腳本,假定我們正在處理一個叫做price.txt的文件。注意這些編輯并不會改變源文件,sed只是處理源文件的每一行并把結果顯示在標準輸出中(當然很容易使用重定向來定制):
sed腳本 | 描述 | |
|
|
|
sed 's/^$/d' price.txt | 刪除所有空行 | |
sed 's/^[ \t]*$/d' price.txt | 刪除所有只包含空格或者制表符的行 | |
sed 's/"http://g' price.txt | 刪除所有引號 |
在Aho,Weinberger和Kernighan的書The AWK Programming Language中有很多很好的awk的例子,請不要讓下面這些微不足道的腳本例子限制你對awk強大能力的理解。我們同樣假定我們針對price.txt文件進行處理,跟sed一樣,awk也只是把結果顯示在終端上。
awk腳本 | 描述 | |
|
|
|
awk '$0 !~ /^$/' price.txt | 刪除所有空行 | |
awk 'NF > 0' price.txt | awk中一個更好的刪除所有行的辦法 | |
awk '$2 ~ /^[JT]/ {print $3}' price.txt | 打印所有第二個字段是'J'或者'T'打頭的行中的第三個字段 | |
awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt | 針對所有第二個字段不包含'Misc'或者'misc'的行,打印第3和第4列的和(假定為數字) | |
awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt | 打印所有第三個字段不是數字的行,這里數字是指d.d或者d這樣的形式,其中d是0到9的任何數字 | |
awk '$2 ~ /John|Fred/ {print $0}' price.txt | 如果第二個字段包含'John'或者'Fred'則打印整行 |
下面的例子中我們假定在文件phone.txt中包含以下的文本,——其格式是姓加一個逗號,然后是名,然后是一個制表符,然后是電話號碼:
Francis, John 5-3871
Wong, Fred 4-4123
Jones, Thomas 1-4122
Salazar, Richard 5-2522
grep命令 | 描述 | |
|
|
|
grep '\t5-...1' phone.txt | 把所有電話號碼以5開頭以1結束的行打印出來,注意制表符是用\t表示的 | |
grep '^S[^ ]* R' phone.txt | 打印所有姓以S打頭和名以R打頭的行 | |
grep '^[JW]' phone.txt | 打印所有姓開頭是J或者W的行 | |
grep ', ....\t' phone.txt | 打印所有姓是4個字符的行,注意制表符是用\t表示的 | |
grep -v '^[JW]' phone.txt | 打印所有不以J或者W開頭的行 | |
grep '^[M-Z]' phone.txt | 打印所有姓的開頭是M到Z之間任一字符的行 | |
grep '^[M-Z].*[12]' phone.txt | 打印所有姓的開頭是M到Z之間任一字符,并且點號號碼結尾是1或者2的行 |
egrep command | Description | |
|
|
|
egrep '(John|Fred)' phone.txt | 打印所有包含名字John或者Fred的行 | |
egrep 'John|22$|^W' phone.txt | 打印所有包含John 或者以22結束或者以W的行 | |
egrep 'net(work)?s' report.txt | 從report.txt中找到所有包含networks或者nets的行 |
命令或環境 | . | [ ] | ^ | $ | \( \) | \{ \} | ? | + | | | ( ) |
vi | X | X | X | X | X | |||||
Visual C++ | X | X | X | X | X | |||||
awk | X | X | X | X | X | X | X | X | ||
sed | X | X | X | X | X | X | ||||
Tcl | X | X | X | X | X | X | X | X | X | |
ex | X | X | X | X | X | X | ||||
grep | X | X | X | X | X | X | ||||
egrep | X | X | X | X | X | X | X | X | X | |
fgrep | X | X | X | X | X | |||||
perl | X | X | X | X | X | X | X | X | X |
s 表示其后是一個替換命令。
pat1 這是要查找的一個正則表達式,這篇文章中有一大堆例子。
g 可選標志,帶這個標志表示替換將針對行中每個匹配的串進行,否則則只替換行中第一個匹配串。