在JDK1.4.2中加入了對(duì)NIO的支持,掌握其中的Selector個(gè)人認(rèn)為是能實(shí)現(xiàn)好NIO的關(guān)鍵。
Selector是用來(lái)獲取注冊(cè)在其中的channel的相關(guān)事件的發(fā)生,也就是accept,read和write。selector中有3個(gè)key set。
key set:包含代表所有在其中注冊(cè)的channel,可以通過(guò)selector.keys()得到。
selected-key set:包含所有被檢測(cè)到有關(guān)注的操作已經(jīng)就緒的key,通過(guò)selector.selectedKeys得到。
cancelled-key set:包含所有已經(jīng)被cancel,但是還沒(méi)有channel還沒(méi)有deregister的key,這個(gè)集合是不能直接被訪(fǎng)問(wèn)的。
key通過(guò)調(diào)用channel的register方法被加入到key set中。被取消的key在select的時(shí)候會(huì)被從相應(yīng)的key set中移除。
key set自身是不可以直接進(jìn)行修改的。
無(wú)論是通過(guò)調(diào)用channel的close方法還是調(diào)用key的cancel方法,key都會(huì)被放置到canceled-key set中。取消的key會(huì)將其channel在下一次select時(shí)將注冊(cè)撤銷(xiāo),同時(shí)將key從所有的key set中移除。
key在執(zhí)行select操作時(shí)被加入到selected-key set中。在selected-key
set中的key可以通過(guò)調(diào)用iterator的remove方法,將其從selected-key
set中移除,不能通過(guò)其他的辦法將其從selected-key set中移除。
通過(guò)selector的3個(gè)方法select(阻塞選擇,直到有關(guān)心的事件發(fā)生時(shí)退出阻塞),selectNow(不阻塞選擇),select(long)(指定超時(shí)選擇,超時(shí)到達(dá)或者有關(guān)心事件發(fā)生時(shí)退出阻塞),來(lái)獲取關(guān)心事件的發(fā)生。其執(zhí)行步驟分為以下3步:
1、將存在于canceled-key set中的key從所有的key set中移除,撤銷(xiāo)注冊(cè)的channel,清空canceled-key set。
2、地層操作系統(tǒng)檢查是否有關(guān)心的事件發(fā)生,當(dāng)有關(guān)心的事件發(fā)生時(shí),首先檢查channel的key是否已經(jīng)存在于selected-key
set中,如果不存在,則將其加入到selected-key set中去,同時(shí)修改key的ready-operation
set來(lái)表明當(dāng)前ready的操作,而以前存在于ready-operation
set中的信息會(huì)被刪除。如果對(duì)應(yīng)的key已經(jīng)存在于selected-key set中,這直接修改其ready-operation
set來(lái)表明當(dāng)前ready的操作,刪除原來(lái)ready-operation set中的信息。
3、如果在第二步中有加入到canceled-key set中的key,在這一步會(huì)執(zhí)行第一步的操作。
selector自身是線(xiàn)程安全的,而他的key
set卻不是。在一次選擇發(fā)生的過(guò)程中,對(duì)于key的關(guān)心事件的修改要等到下一次select的時(shí)候才會(huì)生效。
另外,key和其代表的channel有可能在任何時(shí)候被cancel和close。因此存在于key
set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的線(xiàn)程取消或關(guān)閉channel,程序必須小
心的同步檢查這些條件。
阻塞了的select可以通過(guò)調(diào)用selector的wakeup方法來(lái)喚醒。
在JavaScript中,可以通過(guò)window.location來(lái)獲取url地址。但是window.location是一個(gè)對(duì)象,沒(méi)有辦法直接從里面獲取出我們需要的參數(shù)。通常的做法就是使用一個(gè)隱藏的<input>,通過(guò)將window.location負(fù)值給input。其目的就是為了將location轉(zhuǎn)換成String。寫(xiě)的過(guò)程中總是覺(jué)得太復(fù)雜了,后來(lái)發(fā)現(xiàn)使用document.URL就可以解決這個(gè)問(wèn)題。
下載了一個(gè)Action Script Viewer 4.0對(duì)原來(lái)的swf文件進(jìn)行反編譯,雖然有的movie clip會(huì)出現(xiàn)一點(diǎn)問(wèn)題,但是總的來(lái)說(shuō)效果還是不錯(cuò)的,而且操作相當(dāng)?shù)暮?jiǎn)單。
1)使用ASV打開(kāi)要進(jìn)行反編譯的SWF文件;
2)File-->export rebuild data。這時(shí)將swf文件分拆成單個(gè)的swf文件;
3)打開(kāi)flash,創(chuàng)建一個(gè)空的fla文件;
4)File-->Import...-->Import to Library 將前面導(dǎo)出的swf文件導(dǎo)入,如果swf文件太多flash會(huì)報(bào)錯(cuò),可以通過(guò)分批導(dǎo)入文件來(lái)繞過(guò)這個(gè)錯(cuò)誤;
5)將新建的swf文件保存為rebuild.fla,并且3)導(dǎo)出的文件在同一目錄;
6)運(yùn)行3)產(chǎn)生的一個(gè)rebuild.jsfl文件,一切搞定。
中午收到老姐來(lái)的電話(huà),電話(huà)里她是一遍一遍又一遍的在我耳邊嘮叨,說(shuō),“不管你怎么忙,有多少東西要寫(xiě),一定要按時(shí)睡覺(jué)”。還列出了一堆要按時(shí)睡覺(jué)的理由。其實(shí)誰(shuí)不知道應(yīng)該要按時(shí)睡覺(jué),可是作為寫(xiě)程序的程序員來(lái)說(shuō),要真想做到這一點(diǎn)實(shí)在是難,難,難呀!
要按時(shí)睡覺(jué)的理由:
從人的排毒期入手:晚間11:00--1:00,肝的排毒期(必須在睡覺(jué)中進(jìn)行)
從人的睡眠最佳時(shí)段入手:1:00--4:00,人的睡眠是質(zhì)量最高的
不知道各位有誰(shuí)是有正常的生活習(xí)慣的,能不能說(shuō)一說(shuō)你是怎么做到的。。。
做了這么久的軟件,從來(lái)就沒(méi)有好好的學(xué)習(xí)過(guò)設(shè)計(jì)模式。寫(xiě)代碼,做設(shè)計(jì)的時(shí)候都是稀里糊涂。做出來(lái)的設(shè)計(jì),都會(huì)不同程度的讓自己感覺(jué)到不安。這可能就是《設(shè)計(jì)模式精解》書(shū)中所說(shuō)那種直覺(jué)吧。
引用:
留意你的知覺(jué)
出自本能的直覺(jué)能對(duì)設(shè)計(jì)質(zhì)量做出令人驚訝的預(yù)測(cè)。所謂“出自本能的直覺(jué)”,是指當(dāng)你看到某些不喜歡的東西時(shí),你胃部的感覺(jué)。我知道這聽(tīng)起來(lái)并不科學(xué)(而且它的確不科學(xué)),但我的經(jīng)驗(yàn)總是向我證明:當(dāng)我從直覺(jué)上不喜歡一個(gè)設(shè)計(jì)時(shí),一個(gè)更好的設(shè)計(jì)一定就躺在角落里。
Facade模式:關(guān)鍵特征
意圖:希望簡(jiǎn)化現(xiàn)有系統(tǒng)的使用方法。你需要定義自己的接口。
問(wèn)題:只需要使用一個(gè)復(fù)雜系統(tǒng)的一個(gè)子集。或者,需要用一種特殊的方式與系統(tǒng)交互。
解決方案:Facade向客戶(hù)展現(xiàn)使用現(xiàn)有系統(tǒng)的一個(gè)新的接口。
參與者與協(xié)作者:向客戶(hù)展現(xiàn)一個(gè)定制的接口,讓客戶(hù)更容易地使用現(xiàn)有系統(tǒng)。
效果:Facade模式簡(jiǎn)化了對(duì)所需子系統(tǒng)的使用。但是,由于Facade并不完整,因此某些功能對(duì)于客戶(hù)可能是可用的。
現(xiàn)實(shí):1)定義一個(gè)(或一組)新的類(lèi)來(lái)提供所需要的接口。
2)讓新的類(lèi)使用現(xiàn)有的系統(tǒng)。
Facade模式使用于以下情況:
- 不需要使用一個(gè)復(fù)雜系統(tǒng)的所有功能,并且可以創(chuàng)建一個(gè)新的類(lèi)來(lái)包容訪(fǎng)問(wèn)原有系統(tǒng)的接口的一個(gè)子集(通常它就是)比原始系統(tǒng)AP簡(jiǎn)單得多。
- 希望包裝或隱藏原有系統(tǒng)。
- 希望使用原有系統(tǒng)的功能,并且希望增加一些新的功能。
- “編寫(xiě)一個(gè)新的類(lèi)”的代價(jià)小于“讓所有人學(xué)會(huì)使用原有系統(tǒng)”或“在未來(lái)維護(hù)整個(gè)系統(tǒng)”所需的代價(jià)
一個(gè)項(xiàng)目通常分為表示層、業(yè)務(wù)邏輯層和持久層,這是最為常見(jiàn)的三層結(jié)構(gòu)。在組織團(tuán)隊(duì)進(jìn)行項(xiàng)目開(kāi)發(fā)的時(shí)候,選擇如何分工對(duì)版本控制有很大的影響。團(tuán)隊(duì)在做開(kāi)發(fā)的時(shí)候一般有兩種模式:按層開(kāi)發(fā)和按功能開(kāi)發(fā)。
按層開(kāi)發(fā)(本人贊同的模式)
在這種開(kāi)發(fā)模式下,每個(gè)開(kāi)發(fā)人員的目錄結(jié)構(gòu)相對(duì)固定和獨(dú)立。對(duì)于CVS這類(lèi)按文件夾來(lái)控制權(quán)限的版本控制服務(wù)器來(lái)說(shuō),比較容易實(shí)現(xiàn)對(duì)開(kāi)發(fā)人員權(quán)限的劃分,不易出現(xiàn)文件不同步而導(dǎo)致的版本混亂。
另外,這種開(kāi)發(fā)模式下,更能集中開(kāi)發(fā)人員的注意力,不需要了解太多與本層無(wú)關(guān)的其他技術(shù)。將精神全部集中在如何實(shí)現(xiàn)本層的功能上,更有利于寫(xiě)出功能強(qiáng)大,運(yùn)行穩(wěn)定的代碼。例如:開(kāi)發(fā)業(yè)務(wù)邏輯層的開(kāi)發(fā)人員,他不可避免的會(huì)寫(xiě)很多邏輯上基本上一致的代碼,在寫(xiě)代碼的過(guò)程中,就能從中找出一些相對(duì)的共性,將公共的代碼進(jìn)行抽象,從而避免了出現(xiàn)大量的重復(fù)代碼。由于工作范圍相對(duì)較小,能有更多的時(shí)間去學(xué)習(xí)相關(guān)方面的最新技術(shù)和解決方案,并應(yīng)用到程序中,能使程序在實(shí)現(xiàn)方式上較為先進(jìn)、優(yōu)越。
老天是公平的,萬(wàn)物有其好的一面也必然有其不好的一面,這種開(kāi)發(fā)模式也不能例外。對(duì)于需求不明確,無(wú)法定義相對(duì)固定的對(duì)外接口時(shí),這中按層開(kāi)發(fā)的模式就有其無(wú)法避免的一個(gè)問(wèn)題。各層開(kāi)發(fā)人員需要在開(kāi)發(fā)的過(guò)程中,反覆的修改接口,以便適應(yīng)于變化了的需求。這必然就導(dǎo)致邏輯處理部分代碼要做相應(yīng)的修改。
按功能開(kāi)發(fā)(本人持保留態(tài)度)
這種開(kāi)發(fā)模式下,開(kāi)發(fā)人員的目錄結(jié)構(gòu)基本是項(xiàng)目的完整目錄接口,他們需要到各層去編寫(xiě)對(duì)應(yīng)他們所開(kāi)發(fā)的模塊的所有代碼。對(duì)于CVS這類(lèi)版本控制服務(wù)器來(lái)說(shuō),基本上是無(wú)法做到對(duì)開(kāi)發(fā)人員權(quán)限的界定。很容易造成版本控制混亂,導(dǎo)致文件版本不同步,是在開(kāi)發(fā)過(guò)程中使用了公共文件的開(kāi)發(fā)人員不能保證同步。例如:一個(gè)文件為多個(gè)開(kāi)發(fā)人員所共同維護(hù),開(kāi)發(fā)人員各自都需要在其中添加自己功能所需要部分的代碼。這樣很容易出現(xiàn)多個(gè)人同時(shí)修改一個(gè)文件的情況,導(dǎo)致文件不同步而造成的版本混亂。
另外,這種開(kāi)發(fā)模式對(duì)開(kāi)發(fā)人員的技術(shù)要求相對(duì)較高,它要求開(kāi)發(fā)人員掌握各層中所需要的技術(shù)。從界面顯示到數(shù)據(jù)持久化,甚至到網(wǎng)絡(luò)通信都需要一個(gè)開(kāi)發(fā)人員去實(shí)現(xiàn)。在功能實(shí)現(xiàn)架構(gòu)不是很確定的情況下,程序代碼中將會(huì)出現(xiàn)大量的重復(fù)代碼,因?yàn)槊總€(gè)人都有自己的實(shí)現(xiàn)機(jī)制,而邏輯處理相同或相近的情況在同一層中出現(xiàn)頻率又比較高。導(dǎo)致程序的整體結(jié)構(gòu)不統(tǒng)一,盡管層次結(jié)構(gòu)相同。使得程序日后維護(hù)極度困難,大大的提高了維護(hù)成本。由于開(kāi)發(fā)人員牽涉使用的技術(shù)過(guò)多,也很難保證程序?qū)崿F(xiàn)方式的先進(jìn)性和優(yōu)越性。
網(wǎng)上一大堆關(guān)于PO,POJO,DTO,VO等等對(duì)象的討論,通常都是各持己見(jiàn),公說(shuō)公有理,婆說(shuō)婆有理,討論到最后也沒(méi)有什么定論。今天看到一個(gè)應(yīng)用的代碼,發(fā)現(xiàn)其講PO直接做為VO(view object)在表示層使用。只從代碼上講,這樣做確實(shí)省去了跟多操作。不用重復(fù)的做對(duì)象的賦值、構(gòu)造。但是會(huì)過(guò)頭來(lái)看,這樣無(wú)疑增加了代碼的耦合性。做一個(gè)簡(jiǎn)單的假設(shè),如果對(duì)持久層的PO進(jìn)行了修改,相應(yīng)的使用PO做為對(duì)應(yīng)的VO(value object)業(yè)務(wù)邏輯層和使用PO最為VO(view object)的表示層都必須做相應(yīng)的修改,如此的應(yīng)用給代碼的維護(hù)帶來(lái)了很大的負(fù)擔(dān),可謂是一動(dòng)則百動(dòng)。
在J2EE應(yīng)用開(kāi)發(fā)中,是不應(yīng)該出現(xiàn)這中PO共享使用的方式的。實(shí)體對(duì)象不應(yīng)該被跨層使用,各層維護(hù)自己的實(shí)體對(duì)象。這點(diǎn)看書(shū)我想大家都知道,而在實(shí)際應(yīng)用中很多人都選擇不遵循這一規(guī)則。(在使用hibernate時(shí)有所不同,引用:“
不過(guò)由于Hibernate的強(qiáng)大功能,例如動(dòng)態(tài)生成PO,PO的狀態(tài)管理可以脫離Session,使得在應(yīng)用了Hibernate的J2EE框架中,PO完全可以充當(dāng)VO,因此我們下面把PO和VO合并,統(tǒng)稱(chēng)為PO。”引文:
結(jié)合struts和hibernate談J2EE架構(gòu)的數(shù)據(jù)表示。)出現(xiàn)這總現(xiàn)象,我想原因只有一個(gè)就是貪圖了一時(shí)的省事,在一次性應(yīng)用開(kāi)發(fā)中,相對(duì)的業(yè)務(wù)對(duì)象改動(dòng)可能性相當(dāng)?shù)纳伲芏鄷r(shí)候在做項(xiàng)目的時(shí)候并不會(huì)出現(xiàn)預(yù)料不到的改變,沒(méi)有必要去管理一大堆各式各樣的實(shí)體對(duì)象,這樣就自然的導(dǎo)致了PO在各層中共享使用。可是就我目前接觸到的項(xiàng)目基本上沒(méi)有需求是如此明確的,通常需求都是在不斷的改變,甚至有時(shí)到了最后發(fā)版的時(shí)候,一些客戶(hù)都會(huì)提出修改需求的要求。另外就是自做需求的情況就更是如此了,這種項(xiàng)目的需求是不斷的在變化的。為了保證項(xiàng)目的適應(yīng)性和可擴(kuò)展性,就必須保證各層之間的相對(duì)獨(dú)立,盡可能降低耦合度。
命運(yùn)之可怕
深夜,沒(méi)有睡。不是在寫(xiě)程序,而是在看《難兄難弟》。兩大男主角都是我所喜歡的,羅嘉良扮演李奇,吳鎮(zhèn)宇飾演謝源。電視的情節(jié)跌宕起伏,命運(yùn)被劇中的演員詮釋的入木三分。正所謂存在必不容易,電視劇的劇本不是編劇憑空想象而寫(xiě)成的,特別是好的劇本定是編劇不知道咬了多少筆頭而寫(xiě)就而成的。(寫(xiě)好的程序不也是這樣嗎?)在《難兄難弟》一劇中謝源是一個(gè)在事業(yè)上一路順風(fēng),扶搖直上的大明星,而李奇的星路則是坎坷嶇崎的,做的角色大多是跑龍?zhí)滓活?lèi)的,更是經(jīng)常做其他明星的影子(替身)。一身才華得不到人得賞識(shí),有力無(wú)處使。命運(yùn)簡(jiǎn)直是講所有的一切大風(fēng)大浪都強(qiáng)加與他的身上。以前看電視,總是覺(jué)得有不有這么巧呀,什么壞是都被他遇上了。而今,長(zhǎng)大了,對(duì)周?chē)娜恕⑹乱惨?jiàn)多了。最后不得不感嘆,原來(lái)命運(yùn)真的是如此的不公平。知道不公平又能怎么樣呢?人,作為一種自認(rèn)為是高級(jí)的物種存在于這顆被稱(chēng)為地球的星球上,其實(shí)他本身是多么的渺小。對(duì)于自己面臨的問(wèn)題,很多時(shí)候人都是兩手一擺,無(wú)能為力。
前段時(shí)間跟一位故友討論了一下所謂的人生價(jià)值。在閑聊之間,發(fā)現(xiàn)人生價(jià)值太難以去把握。人的一生拿來(lái)于宇宙來(lái)比較,太為短暫微不足道了。而一個(gè)人要在如此短暫的生命區(qū)間里找尋到自己的價(jià)值,談何容易。馬克思說(shuō)一個(gè)人存在的價(jià)值是通過(guò)他的社會(huì)價(jià)值來(lái)表現(xiàn)的。只有當(dāng)他實(shí)現(xiàn)了自己的社會(huì)價(jià)值,得到了社會(huì)的肯定和承認(rèn),這樣才能得到社會(huì)的回報(bào),得到自己的個(gè)人價(jià)值。從字面上來(lái)看,馬克思說(shuō)的這一點(diǎn)是勿庸置疑的。但是當(dāng)用馬克思的另一個(gè)原理矛盾存在的普遍性在來(lái)分析一下人生。人的一身是短暫的,而矛盾無(wú)處不在。從宏觀(guān)的角度看,價(jià)值觀(guān)可能如馬克思所說(shuō),但是從微觀(guān)上來(lái)說(shuō),人的一生是充滿(mǎn)了不平等待遇的。就是所謂的好人未必又好報(bào)。劇本中的李奇這角色充分的體現(xiàn)了這一點(diǎn)。當(dāng)人被命運(yùn)不斷的摧殘下,有幾個(gè)人能真正的挨得住,撐得下去。(可能有人說(shuō)我太消極了,應(yīng)該用積極的態(tài)度去看待,應(yīng)該認(rèn)為是在接受命運(yùn)的考驗(yàn)。)可能是我真的太悲觀(guān)了,但是我知道如果換成我是李奇我肯定頂不住。我覺(jué)得已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)了我的承受能力。命運(yùn)可能認(rèn)為只是跟他開(kāi)一個(gè)小小的玩笑,可是不要忘記人是渺小的,開(kāi)不起這樣的玩笑。
看了一天的文檔,頭都要炸了,加上原本就有的發(fā)燒,簡(jiǎn)直就是要我的命了。上班的日子不知道比考研要累上多少被,才三天就有點(diǎn)支持不住了,可是為了生活沒(méi)有辦法呀。下午討論了一下如何做到對(duì)一個(gè)局域網(wǎng)的安全性進(jìn)行評(píng)估。單單只是談?wù)摿艘幌滦枨缶桶l(fā)現(xiàn)這個(gè)系統(tǒng)實(shí)在是把簡(jiǎn)單。
目前提出的需求有:
- 網(wǎng)絡(luò)上各節(jié)點(diǎn)主機(jī)是否存在病毒;
- 網(wǎng)絡(luò)上各節(jié)點(diǎn)主機(jī)存在的漏洞評(píng)估;
- 主機(jī)上是否存在非法用戶(hù)和非法應(yīng)用;
- 對(duì)網(wǎng)絡(luò)上敏感信息的搜索;
- 網(wǎng)絡(luò)拓?fù)涫欠癜踩侠怼?/li>
以上無(wú)條需求出了2、5以外其他的都是一個(gè)“偉大的工程”,需要慢慢研究。無(wú)奈呀
辛苦呀,是在是很辛苦。不過(guò)總算是熬過(guò)去了。看了3個(gè)月的考研書(shū),頭都快要大了。考完第3天了,回實(shí)驗(yàn)室也是第3天了,一大堆的東西要看,要寫(xiě)。最為郁悶
的是,昨天晚上開(kāi)始有點(diǎn)發(fā)燒了,頭疼的要命。同學(xué)坐今天下午的火車(chē)回家,沒(méi)有辦法,命苦呀,頭痛還是要硬著頭皮去送人。把知道西客站今天的人是否很多,但
愿少一點(diǎn)。