如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

          #

               摘要: XML 技術是隨著 Java 的發展而發展起來的。在 XML 出現之前對于簡單的數據格式通常是存儲在 ini 配置文件等文本文件中,復雜的格式則采用自定義的文件格式,因此對于每種文件格式都要有專門的解析程序。 XML 出現以后解決了這個問題,程序面對的是有固定格式的 XML 文件,只要通過...  閱讀全文
          posted @ 2007-03-26 13:14 CowNew開源團隊 閱讀(3402) | 評論 (5)編輯 收藏

               摘要: 是否選擇了合適的數據結構進行數據處理對系統的性能有著極大的影響, JDK 中提供了常用的數據結構的實現類,比如鏈表、堆棧、哈希表,很多第三方開源庫也進行了有益的擴展。關于這些類的原理以及使用可以參考相關的手冊,在本節中重點講解一些使用中需要注意的問題 。 1.1.1.?????? 增量內存分配 ...  閱讀全文
          posted @ 2007-03-16 12:37 CowNew開源團隊 閱讀(1769) | 評論 (5)編輯 收藏

          這是剛才和一個朋友的聊天記錄,希望對大家有幫助:
          佘士東 08:41:47
          我設計一個接口,其中有些方法很類似,比如取得某個工作對象,有可能需要獲得多個,也有可能獲得其中一個,參數為工作對象的名字、名字列表。
          我是用窄接口還是寬接口好,是用一個最大功能的方法還是多個重載方法好?
          比如:
          IService
          public Worker? getWorker(String name);
          public Vector<Worker> getWorkers(final Vector<String> names);
          我是在接口約束這兩個方法還是只約束最大的那個,使所有的方法都適配為后面這個最大方法,而在接口中去掉第一個方法
          楊中科 08:51:57
          我認為還是多個重載方法好,主要是考慮方便別人使用
          ?
          楊中科 08:52:31
          順便說一句:為什么參數和返回值要用Vector?用List接口不更好嗎?
          ?
          佘士東 08:53:55
          如果適用者很有限,大概只有5個左右,實際上使用者也是提供適配功能,比如使用cs結構,web方式,wap方式,sms方式獲得接口服務的適配模塊
          佘士東 08:55:04
          我的想法是使用Vector它是異步安全的,服務可能是多線程實現的,所以使用Vector返回,不知道有沒有這個必要,有沒有這個作用
          楊中科 08:55:12
          你說的是什么意思,不太明白。你說getworker方法不是所有實現類都能實現?
          ?
          佘士東 08:56:35
          其實這個接口是夾在實現和使用這中間的,使用者實現不同類型服務的適配,實現根據項目不同所要求的業務實現不一樣,實際上這個接口是約束實現要多
          佘士東 08:58:08
          如果接口方法太多,我怕如果變更會不會陷入變更里面,因為重載多了,其中很多有重復,比如參數列表,如果需要加上用戶驗證,那就都要加,這樣所有實現都要改動一批
          楊中科 08:59:41
          “我的想法是使用Vector它是異步安全的,服務可能是多線程實現的,所以使用Vector返回,不知道有沒有這個必要,有沒有這個作用 ”,你可以將傳進來的List參數用Collections類中的syn****List方法將List搞成異步安全的,返回的時候你也可以返回Vector類型的,但是返回值要生命成List類型
          ?
          楊中科 09:00:14
          要考慮二次開發人員的易用性,大部分人還是傾向于使用List、ArrayList這樣的東西的
          ?
          楊中科 09:01:50
          “如果接口方法太多,我怕如果變更會不會陷入變更里面,因為重載多了,其中很多有重復,比如參數列表,如果需要加上用戶驗證,那就都要加,這樣所有實現都要改動一批 ”,還是那句話,不要陷入實現的漩渦中,你的接口是聲明服務用的,不要管實現,怎么實現是實現類的事情,站在二次開發人員的角度來看你必須同時提供getworker和getworkers兩個方法
          ?
          佘士東 09:01:49
          原來如此,就是說實際上還是Vector,只不過返回值使用List接口,但是如果他直接轉換成ArrayList使用會不會丟掉原來異步安全特性?因為返回值畢竟只是一個引用,可能其它地方也在用同一個引用
          楊中科 09:02:30
          不可能轉換為ArrayList的,否則運行的時候會拋ClassCastException
          ?
          佘士東 09:02:46
          但是,二次開發實際上是開發實現類,而不是服務調用類
          楊中科 09:03:24
          哦,也就是二次開發實際上是寫一個實現了你定義的接口的插件???
          ?
          佘士東 09:03:47
          對,就是這個意思
          楊中科 09:04:57
          那也最好提供這兩個接口,這樣你使用這些插件的時候也方便,你可以寫一個抽象類來實現默認的getworker方法,在getworker中調用getworkers方法,這樣二次開發人員一般只要實現getworkers方法就可以了
          ?
          佘士東 09:04:57
          但是這個插件是惟一的,使用一個Factory獲得實現
          佘士東 09:05:57
          哈哈,豁然開朗,寬接口,加上適配抽象父類,就搞定了
          楊中科 09:06:26
          接口方法是越多用起來越方便
          ?
          佘士東 09:07:10
          我只是怕在產生變更的時候,對應的實現也要改動很多,畢竟框架才是初期
          楊中科 09:08:29
          “對應的實現也要改動很多”,那就看你抽象類的實現水平的,定義接口的時候不要去想實現,只要想接口定義那些方法才夠用就可以,實現和接口不能混
          ?
          楊中科 09:09:00
          你可以用各種設計模式來保證不會發生“產生變更的時候,對應的實現也要改動很多”
          ?
          楊中科 09:09:11
          但是接口就是接口

          posted @ 2007-03-13 09:18 CowNew開源團隊 閱讀(1969) | 評論 (10)編輯 收藏

          Python 的模塊一旦加載就會常駐內存,直到程序結束。再碰到 import 語句式只是修改名字空間,而不需要重新加載。這種機制是出于運行時的效率考慮,每遇到 import 的時候重新加載顯然很低效。它也不會檢查源文件的修改時間以確定是否重新加載,Python 有那么多的模塊,每次調用時都檢查一遍時間也是不行的。

          這種機制下,開發長時間運行的守護程序就會很麻煩,修改源代碼后要重新啟動程序才能讓新的代碼生效。比如用 mod_python 做 web 開發,Apache 會啟動多個守護進程來應答客戶請求,里面有 python 的解釋引擎和加載的模塊,若要讓修改后的代碼生效只能重起 apache,這會影響到其它服務的正常運行,非常不方便。mod_python 有一個PythonAutoReload 參數,它只是針對 PythonHandler 而言的,能夠對設定的 PythonHandler 實現自動重新加載,而該 Handler 中所用到的模塊卻不能自動 reload。

          這種修改源代碼然后重起 apache 的調試方式實在讓我無法忍受了,決定實現一種自動重新加載機制。基本的思路就是每個用戶請求到來時,檢查我所關心的那些模塊源文件的修改時間,如果比加載時的修改時間新,則重新加載。

          編寫一個檢測時間和重新加載的函數,讓它在每個請求到來時執行:

          1. def ?autoreload(): ??
          2. ??mod_names?=?['Entry','Index','SideBar'] ??
          3. ?? for ?mod_name? in ?mod_names: ??
          4. ???? try : ??
          5. ??????module?=? sys .modules[?mod_name?] ??
          6. ???? except : ??
          7. ?????? continue ??
          8. ????mtime?=? os .path.getmtime(?module.__file__?) ??
          9. ???? try : ??
          10. ?????? if ?mtime?>?module.loadtime: ??
          11. ???????? reload (?module?) ??
          12. ???? except : ??
          13. ???? pass ??
          14. ????module.loadtime?=?mtime ??

          這段代碼不長,但是改了好多個版本,最開始用 has_key() 的方式來檢測是否存在某個模塊,檢測該模塊是否有 loadtime 屬性( 用 module.__dict__ ),現在這種方式應該效率高一些,曾經在一個 blog 上看到過對比測試數據。起初還在每個關心的模塊里面加上一句loadtime = os.path.getmtime( __file__ ),這是不必要的,因為 Python 用的是動態類型,可以在運行時追加屬性,第一次檢測時設置初始狀態即可。

          有了這段代碼,開發 BlogXP 方便多了,改了源碼之后立馬就能生效,而且它在正常運行時的消耗也很小。另外,由于mod_python 能夠實現指定的 Handler 的自動重新加載,將這段代碼放在該 Handler 中,可以方便地改變所關心的模塊列表,也不需重起 apache。

          歡迎批評指正:-)
          from: http://blog.daviesliu.net/article/entry20050610-235635

          posted @ 2007-03-12 14:57 CowNew開源團隊 閱讀(1744) | 評論 (2)編輯 收藏

          thanks to hengheng123456789:
          首席執行官『ceo.icxo.com』專家指點:30歲前讓你成為“富翁”的四大秘訣

           內修工夫+外營人脈

          ??? 所謂,只能靠錢賺錢?盡管市面上理財書籍教的致富方法,大多是以投資工具為媒介,但積累資產的方法不只一種,有人懂得善用投資工具,大賺機會財;有人則專營人脈圈,年輕時愿意多付點交際費當學費,先蹲后跳,隨之而來的是職位、薪水的提升以及見識的增廣,已經不是可以用報酬率這類數字來衡量的了。

          ??? 外營:深耕職場關系

          ??? 上世紀九十年代初就開始投資的李雨,對于理財工具的知識比一般人還要強,卻沒有用于自己的資產規劃,“我沒有很刻意存錢或尋求投資,我認為投資自己最重要!”他說:李雨對自我的投資,包含了進修與人脈兩項。他曾在上海一家最高級的休閑俱樂部待了7年,做到市場總監,舉辦過數十場的大型休閑運動賽事,招待過阿加西、張德培等世界運動名將。

            有些俱樂部是達官貴人的匯聚之所,在那里可以接觸到很多優秀的人。李雨從一個小專員開始,只有一千多元的薪水,他卻舍得請客吃飯、多結交朋友,而非存起來。“你知道嗎?光聽他們講話就覺得收獲頗豐!”他覺得這交際費花得太值了。他的專業是市場營銷,深耕人脈的作用很快便“發酵”般擴散,各方人士大力贊助并參與他所舉辦的活動。不過三年,他便躋身年薪百萬一族了。

          ??? 李雨實行的就是“人脈理財法”:藉由結識比自己更優秀的人才,協助事業或眼界的拓展。理財專家也認為:投資在理財的時間愈長就表示投資在自己身上的時間愈短,而增加自己這個“人力資本”,如增加學歷、才能、提升工作技能與人際關系,比投資所得的利息更多。這個建議特別適合初入社會三五年的青年,正逢職涯起步,最重要的是積累專業知識與建立職場關系,與其算計一些蠅頭小利,倒不如將時間成本花在經營本業,工作表現好,升官加薪也不遠了。

          ??? 內修:打響自我口碑

          ??? 人脈理財,需要真才實學相輔相成,指的是專業知識與敬業態度。在工作上肯下苦工是第一步,博得客戶、上司、同事的信任,先有工作表現為基礎,人脈的加分效果才明顯。

          ??? 27歲的楊慶,前一份工作是精品公關公司的專員,如今,則是國內某知名鐘表代理公司的公關經理。當初尚未正式上班,公司就送來一支市價20萬的名表當作員工福利。不少人欣羨她能得到這個好職位,楊慶則說獲得職涯攀升的機會連自己都覺得意外,因為是老板主動找上她的。

          ??? 原來現在的老板曾經是她的客戶,認同楊慶的辦事能力;當底下有缺,便將她列為候選人之一。而之所以被公司選中,“后來我才知道,老板曾問過幾位媒體記者的意見,最后選了我。”由于她與媒體接洽時,會針對不同屬性的媒體提供多元的新聞角度,這份努力讓記者肯定其專業,若有人問起楊慶的工作能力,想必多是美言。往往就是因為共事的好印象,就算沒有刻意經營關系,無形之中也幫你牽起好人脈,因此實力與人脈的養成不能偏廢。

           真誠付出,心薪相印

          ??? “人脈理財法”并不適合急欲一步登天的人,關系是一種長期投資,要細火慢燉,誰也算不準它在何時才開花結果,甚至要有心理準備,不一定有職位、薪資等實質回饋。

          ??? 人脈的回饋是以各種形式展現在你的生涯中。結識優秀的人就像李雨所說,聽他們講話都有收獲!當你面對人生關卡、遭遇困境之際,往往能從好的人脈那兒得到指引和幫助,他們或許無法在事業上給予直接幫助(通常若你值得信任,他們必會拔刀相助),但有時一句話就讓你受益無窮。

          ??? 而最會經營人脈者都不約而同地透露:與人結交,真心為貴。美國知名企業家與激發潛能大師博恩崔西(Brain Tracy)指導學員銷售成功術時,最常掛在嘴邊的就是“真誠地關懷你的顧客”。他說:“你越關懷你的顧客,他們就越有興趣跟你做生意,一旦客戶認定你是真心關懷他的處境,不論銷售的細節或競爭者如何,他都會向你購買。”做成生意只是結果,崔西教導的重點是以真誠贏得人心。

          posted @ 2007-03-09 16:58 CowNew開源團隊 閱讀(381) | 評論 (0)編輯 收藏

          這是今天早晨我和一個網友關于eclipse調試原理的聊天記錄,希望對大家有幫助:
          小魚 說:
          你說了解JAVA的編譯機制和熟練使用調試,最好的方法是不是去閱讀eclipse的源代碼啊
          楊中科 說:
          編譯機制?要了解編譯機制的話最先肯定要把編譯原理搞清楚呀,eclipse本身是不負責編譯java代碼的,它是委托給JDK去編譯的,因此要了解java的編譯機制肯定要去閱讀jdk的源碼的
          楊中科 說:
          不過jdk的編譯器部分的源碼好像沒有開放
          楊中科 說:
          使用調試也不用去看源碼,功能很簡單的
          小魚 說:
          是啊,我覺得eclipse的調試很有用啊,尤其是你以前講過的那個jsp的調試,學問很深啊
          楊中科 說:
          原理上并不難,因為eclipse是把調試請求通過jpda協議發給jdk來完成的,eclipse本身不提供java代碼的編譯和調試機制
          小魚 說:
          這就是實時監測虛擬機的運行狀態吧
          楊中科 說:
          不過讀懂了eclipse的java調試部分的代碼你就也可以寫出一個java的調試器出來
          小魚 說:
          斷點就是給程序一個中斷是吧?
          小魚 說:
          是的
          楊中科 說:
          不是實時檢測,是一個請求、應答的模式
          楊中科 說:
          比如我們在java的編譯器的第五行放了一個斷點,那么代碼調試起來以后,eclipse就告訴運行環境“請在第五行停下來”,那么運行環境就會在第五行停下來。然后你想看看i這個變量的值,eclipse就會向運行環境請求“請告訴我i等于多少”,然后運行環境就將i的值告訴eclipse,eclipse就將這個值顯示給你。原理非常簡單
          小魚 說:
          也就是程序掛起吧?
          楊中科 說:
          eclipse只是充當了一個介紹人的角色
          楊中科 說:
          不明白程序掛起具體指的什么,不過應該就是你理解的意思
          小魚 說:
          也是,一個和用戶直接打交道的UI

          楊中科 說:

          http://www.aygfsteel.com/huanzhugege/

          ?

          posted @ 2007-03-07 09:13 CowNew開源團隊 閱讀(2528) | 評論 (1)編輯 收藏

          ???在開發過程中我發現終端屏幕頻繁的刷新,看上去閃的厲害。使用截包工具(我用的是EtherDetect Packet Sniffer,在Sniffer單機端口數據的時候比Sniffer Pro易用)分析發現,每次更新一個子窗口的時候竟然整個屏幕都被刷新了,數據量非常大。為了發現問題,我編寫了下面的測試程序:
          from ACursesEX import *
          import curses

          def main():
          ??? mainwin = curses.newwin(15,50,0,0)
          ??? mainwin.box()
          ???
          ??? mainwin.addstr(0,0,"主窗口")
          ??? mainwin.refresh()
          ???
          ??? cwin = curses.newwin(5,20,2,2)
          ??? cwin.addstr(1,1,"子窗口")
          ??? cwin.box()
          ??? cwin.refresh()
          ??? while(True):
          ??????? ch = cwin.getch()
          ??????? cwin.clear()
          ??????? cwin.addch(2,1,ch)
          ??????? cwin.touchwin()
          ??????? cwin.refresh()
          ???????
          ??
          try:
          ??? initapp()
          ??? try:???????
          ??????? main()
          ??? except:???????
          ??????? traceback.print_exc()
          finally:
          ??? endapp()

          經測試每一次按鍵的時候屏幕的數據都刷新一次,經過嘗試發現把cwin.clear()改成cwin.erase()就不會出現這種問題了。查看curses的API說明才發現自己犯了一個大錯誤:
          clear( ) :
          Like erase(), but also causes the whole window to be repainted upon next call to refresh().

          ???也就是說erase只會使子窗口刷新,而clear會導致整個窗口刷新。
          看來還是自己太粗心了!

          ?

          posted @ 2007-03-06 16:32 CowNew開源團隊 閱讀(333) | 評論 (0)編輯 收藏

          ?分頁在任何系統中都是非常頭疼的事情,有的數據庫在語法上支持分頁,而有的數據庫則需要使用可滾動游標來實現,并且在不支持可滾動游標的系統上只能使用單向游標逐步接近要取得的數據。
          ?Hibernate提供了一個支持跨系統的分頁機制,這樣無論底層是什么樣的數據庫都能用統一的接口進行分頁操作。比如下面的代碼就是從第500條開始取出100條記錄:
          Query q = session.createQuery("from FooBar as f");
          q.setFirstResult(500);
          q.setMaxResults(100);
          List l = q.list();
          那么Hibernate底層如何實現分頁的呢?Hibernate根據Query拼裝SQL語句的地方是在org.hibernate.loader.Loader類的prepareQueryStatement方法中,對分頁支持的代碼在這一段中可以發現:
          if (useLimit)
          {
          sql = dialect.getLimitString(
          ?????sql.trim(), //use of trim() here is ugly?
          ?????useOffset ? getFirstRow(selection) : 0,
          ?????getMaxOrLimit(selection, dialect)
          ????);
          ?}
          ?此處調用Dialect的getLimitString方法來得到不同平臺的分頁語句。
          在MySQLDialect中是如下實現getLimitString方法的:
          public String getLimitString(String sql, boolean hasOffset)
          {
          return new StringBuffer( sql.length()+20 )
          .append(sql)
          .append( hasOffset ? " limit ?, ?" : " limit ?")
          .toString();
          }
          ?這是MySQL的專用分頁語句,再來看Oracle9Dialect:
          ?public String getLimitString(String sql, boolean hasOffset) {
          ??
          ??sql = sql.trim();
          ??boolean isForUpdate = false;
          ??if ( sql.toLowerCase().endsWith(" for update") ) {
          ???sql = sql.substring( 0, sql.length()-11 );
          ???isForUpdate = true;
          ??}
          ??
          ??StringBuffer pagingSelect = new StringBuffer( sql.length()+100 );
          ??if (hasOffset) {
          ???pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
          ??}
          ??else {
          ???pagingSelect.append("select * from ( ");
          ??}
          ??pagingSelect.append(sql);
          ??if (hasOffset) {
          ???pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
          ??}
          ??else {
          ???pagingSelect.append(" ) where rownum <= ?");
          ??}

          ??if ( isForUpdate ) {
          ???pagingSelect.append( " for update" );
          ??}
          ??
          ??return pagingSelect.toString();
          ?}?
          Oracle采用嵌套3層的查詢語句結合rownum來實現分頁,這在Oracle上是最好的方式,因為如果只是一層或者兩層的查詢語句的rownum不能支持order by。
          此外Interbase,PostgreSQL,HSQL等也在語法級別上支持分頁,具體實現可以查看相應的Dialect實現。如果數據庫不支持分頁的SQL語句,那么如果數據庫支持可滾動游標,那么Hibernate就會采使用ResultSet的absolute方法直接移到查詢起點;否則使用循環語句,通過rs.next一步步移動到要查詢的數據處:
          final int firstRow = getFirstRow( selection );
          if ( firstRow != 0 )
          {
          if ( getFactory().getSettings().isScrollableResultSetsEnabled() )
          {
          // we can go straight to the first required row
          rs.absolute( firstRow );
          }
          else
          {
          // we need to step through the rows one row at a time (slow)
          for ( int m = 0; m < firstRow; m++ ) rs.next();
          }
          }

          可見使用Hibernate,在進行查詢分頁的操作上,是具有非常大的靈活性,Hibernate會首先嘗試用特定數據庫的分頁sql,如果沒用,再嘗試Scrollable,如果不支持Scrollable再采用rset.next()移動的辦法。這樣既兼顧了查詢分頁的性能,同時又保證了代碼在不同的數據庫之間的可移植性。

          posted @ 2007-03-06 09:22 CowNew開源團隊 閱讀(681) | 評論 (0)編輯 收藏

          ??????當使用多個資源合作解決一個問題的時候,必須使這些資源在一個事務中進行合作。為了實現這一目的,將事務分為兩個階段進行:
          ??????第一階段開始時,向此事務涉及到的全部資源發送提交前信息。此時,事務涉及到的資源還有最后一次機會來回滾事務。如果任意一個資源決定回滾事務,那么整個事務將被取消。否則,事務會被提交。
          第二階段只是在第一階段沒有回滾時才會發生。在這個階段,所有的能被定位和單獨控制的資源都將真正的更新。
          ??????事務被分割成兩個階段來完成,這被稱為兩階段提交協議。如果程序在同一個操作中需要訪問多種資源,您就要使用兩階段提交事務。例如,如果從 JMS 隊列中刪除一個消息,并且隨后更新數據庫中基于這條消息的紀錄,這時,要保證這兩個操作的原子性。不應該出現一條消息已經從隊列中被刪除,而系統沒有更新與此消息相關的數據庫中的紀錄的情況。可以通過應用程序的代碼在數據庫更新失敗的時候 "撤銷"對隊列的操作。但是這樣做并不還,因為當程序在執行“撤銷”操作的過程中服務器突然崩潰的話就會導致數據出現不一致。作為替代的方式,應該使用兩階段提交事務。
          posted @ 2007-03-06 09:20 CowNew開源團隊 閱讀(366) | 評論 (0)編輯 收藏

          out of the box:“The following apply to SCO 3 only; Python builds out of the box on SCO 5。”(源自:http://svn.python.org/projects/python/trunk/README
          解釋:
          out-of-the-box具有“創造性的,獨特性,思維不合常規”的意思,但在計算機術語里又可以指“從盒子里拿出來直接可以使用的,也就是即開即用”的意思。

          因此上邊那句的翻譯是:下面所說的只適用于SCO3;在SCO 5中Python已經構建好了。

          posted @ 2007-03-02 16:47 CowNew開源團隊 閱讀(292) | 評論 (0)編輯 收藏

          僅列出標題
          共30頁: First 上一頁 13 14 15 16 17 18 19 20 21 下一頁 Last 
          主站蜘蛛池模板: 康保县| 四子王旗| 上虞市| 大连市| 民乐县| 青龙| 侯马市| 谢通门县| 安徽省| 内江市| 开封县| 封开县| 固安县| 仙居县| 海口市| 和田市| 郯城县| 芜湖县| 诏安县| 清镇市| 宜城市| 株洲市| 民乐县| 洪江市| 布拖县| 安仁县| 行唐县| 平利县| 兴义市| 永兴县| 扎鲁特旗| 澎湖县| 凌云县| 庄河市| 永川市| 霞浦县| 石渠县| 伊宁县| 河北省| 英德市| 曲水县|