@OverWrite BlogJava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 29 評論 :: 0 Trackbacks

          2012年8月12日 #

          httpclient已停止維護,其替代產品為 Apache HttpComponents 。 官方聲明如下(詳細信息點擊這里):
          The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

          HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的
          客戶端程工具包,并且它支持 HTTP 協議最新的版本和建議。本文首先介紹 HTTPClient,然后根據作者實際工作經驗給出了一些常見問題的解決方法。 

          所以打算用HttpClient的朋友,可以考慮使用HttpComponents 了。
          HttpComponents 入門,筆者認為 iteye上的一篇文章寫的不錯,大家可以參考 《HttpComponents入門解析》
          posted @ 2012-08-12 17:50 vesung 閱讀(397) | 評論 (0)編輯 收藏

          2012年7月26日 #

          現在本本屏幕越來越小, 在上面運行eclipse就會顯得字體小, 那么如何調整字體大小那?
          方法一:
              打開菜單 window->preferences->general->appearance->colors and fonts
          打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。

          方法二:
              因為eclipse版本眾多,所以菜單路徑也會有所差異。 還有一種方法可以不用擔心不同版本的差異:
              開始先打開菜單 window->preferences   在左上角數據font 回車, eclipse就會自動搜索出可以設置字體的地方了。 接下來打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。 


          一點小技巧希望對大家能有所幫助。
          posted @ 2012-07-26 14:46 vesung 閱讀(43762) | 評論 (1)編輯 收藏

          2008年7月31日 #

          這篇文章在chinaunix上看到,寫的很不錯。希望能對學習linux的人有所幫助。

          隨著Linux應用的擴展許多朋友開始接觸Linux,根據學習Windwos的經驗往往有一些茫然的感覺:不知從何處開始學起。作為一個 Linux系統管理員,我看了許多有關Linux的文檔和書籍,并為學習Linux付出了許多艱苦的努力。當真正獲得了一份正式的Linux系統管理工作 后,我更加深刻地理解了Linux的靈魂:服務與多用戶。Linux系統知識是非常廣博的,但是只要掌握了重點知識,管理它并沒有想象中的那么可怕。在下 面我會將作為系統管理員的一些工作心得和總結出來的經驗系統地介紹給大家。

          一、 學習的目的

          通過Linux的學習掌握UNIX的目的想必不用多說了,在這個網絡人才身價倍增的年代,想靠技術吃飯又不想掌握網絡和編程技術是不明智的。當一人第一次 聽說Linux并躍躍欲試的時候,總會提出幾個?,它是什么(What)? 為什么要用它(Why)? 怎樣學習它(How)?做為開放源碼運動的主要組成部分,Linux的應用越來越廣泛,從我們平時的娛樂、學習,到商業、政府辦公,再到大規模計算的應 用。為了滿足人們的需求,各種各樣的、基于Linux的應用軟件層出不窮。只要具備了LinuX的基本功,并具有了自學的能力之后,都可以通過長期的學習 將專項內容予以掌握。

          二、 從命令開始從基礎開始

          常常有些朋友一接觸Linux 就是希望構架網站,根本沒有想到要先了解一下Linux 的基礎。這是相當困難的。雖然Linux桌面應用發展很快,但是命令在Linux中依然有很強的生命力。Linux是一個命令行組成的操作系統,精髓在命 令行,無論圖形界面發展到什么水平這個原理是不會變的,Linux命令有許多強大的功能:從簡單的磁盤操作、文件存取、到進行復雜的多媒體圖象和流媒體文 件的制作。這里筆者把它們中比較重要的和使用頻率最多的命令,按照它們在系統中的作用分成幾個部分介紹給大家,通過這些基礎命令的學習我們可以進一步理解 Linux系統:

          ●安裝和登錄命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh
          ●文件處理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln
          ●系統管理相關命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last
          ●網絡操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup
          ●系統安全相關命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho

          三、 選擇一本好的Linux書籍

          無論在論壇還是讀者反饋中,我們看到最多的問題往往是某個新手,在安裝或使用linux的過程中遇到一個具體的問題就開始提問,很多都是重復性的問題,甚 至有不少人連基本的問題描述都不是很清楚。這說明很多初學linux的人還沒有掌握基本功。怎樣才能快速提高掌握linux的基本功呢? 最有效的方法莫過于學習權威的linux工具書,工具書對于學習者而言是相當重要的。一本錯誤觀念的工具書卻會讓新手整個誤入歧途。目前國內關于 linux的書籍有很多不過精品的不多,筆者強烈建議閱讀影印本的“o'reilly原版linux圖書”,而且出版社還提供了一個非常好的路線圖


          四 、養成在命令行下工作

          一定要養成在命令行下工作的習慣,要知道X-window只是運行在命令行模式下的一個應用程序。在命令行下學習雖然一開始進度較慢,但是熟悉后,您未來 的學習之路將是以指數增加的方式增長的。從網管員來說,命令行實際上就是規則,它總是有效的,同時也是靈活的。即使是通過一條緩慢的調制解調器線路,它也 能操縱幾千公里以外地遠程系統。

          五、用Unix思維思考Linux

          由于Linux是參照Unix的思想來設計的,理解和掌握它就必須以Unix的思維來進行,而不能以Windows思維。不可否認,windows 在市場上的成功很大一部分在于技術思想的獨到之處。可是這個創新是在面對個人用戶的前提下進行的,而面對著企業級的服務應用,它還是有些力不從心。多年來 在計算機操作系統領域一直是二者獨大:unix在服務器領域,Windows在個人用戶領域。由此可見,用戶需求決定了所采用的操作系統。不管什么原因, 如果要學習Linux,那么首先要將思維從Windows的“這個小河” 中拖出來,放入Unix的海洋。

          六 、學習shell

          對于Shell(中文名稱殼),習慣Windows的讀者肯定是非常陌生的,因為Windows只有一個“Shell”(如果可以說是Shell的話), 那就是Windows自己。用一句話容易理解的解釋就是,shell是用戶輸入命令與系統解釋命令之間的中介。最直觀的說法,一種Shell有一套自己的 命令。舉一個容易理解的例子,Linux的標準Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表現出來的。讀者可能會不理解,Windows從命令行“進化”到了圖形界面,那么Linux現在還 使用命令行豈不是一種倒退?

          當初我剛剛接觸Linux時就曾有過這種想法??墒呛髞戆l現,如果使用圖形界面,那么分配給應用軟件的資源就少了,在價格昂貴的服務器上,能夠以較低的硬件配置實現同樣的功能是非常重要的。

          下面舉例說明,一臺服務器有1GB內存,假設其中512MB用于處理圖形界面,若要安裝一個需要784MB內存的數據庫軟件,惟一的辦法就是擴大內存。但 是如果使用命令行,系統可能只需要64MB內存,其它的內存就可以供數據庫軟件使用了。使用命令行,不僅是內存,而且CPU及硬盤等資源的占用都要節省很 多。所以,作為服務器使用命令行是優點而不是缺點。既然Shell有這么多優點,就必須要學習它。
          七、勤于實踐

          要增加自己Linux 的技能,只有通過實踐來實現了。所以,趕快找一部計算機,趕快安裝一個 Linux 發行版本,然后進入精彩的Linux世界。相信對于你自己的 Linux 能力必然大有斬獲。此外,人腦不像計算機的硬盤一樣,除非硬盤壞掉了或者是資料被你抹掉了,否則儲存的資料將永遠而且立刻的記憶在硬盤中。在人類記憶的曲 線中,你必須要不斷的重復練習才會將一件事情記得比較熟。

          同樣的,學習 Linux 也一樣,如果你無法經常學習的話,學了后面的,前面的忘了。你對Linux命令熟悉后你可以開始搭建一個小的Linux網絡,這是最好的實踐方法。 Linux是網絡的代名詞,Linux網絡服務功能非常強大,不論是郵件服務器、Web服務器、DNS服務器等都非常完善。當然你不需搭建所有服務,可以 慢慢來。需要說明的是這個Linux網絡對于初學者有兩三臺計算機即可。自己多動手,不要非要等著別人幫你解決問題。

          八、學會使用文檔

          和私有操作系統不同,各個Linux的發行版本的技術支持時間都較短,這對于Linux初學者是往往不夠的。其實當你安裝了一個完整的Linux系統后其 中已經包含了一個強大的幫助,只是可能你還沒有發現和使用它們的技巧。主流Linux發行版都自帶非常詳細的文檔(包括手冊頁和FAQ),從系統安裝到系 統安全,針對不同層次的人的詳盡文檔,仔細閱讀文檔后40%問題都可在此解決。查閱經典工具書和Howto,特別是Howto是全球數以萬計的 Linux、Unix的經驗總結非常有參考價值通常40%的問題同樣可以解決。安裝一個新的軟件時先看README,再看INSTALL然后看FAQ,最 后才動手安裝,這樣遇到問題就知道為什么。如果說明文檔不看,結果出了問題再去論壇來找答案反而浪費時間。

          當查找文檔時, 一定要看文檔是在何種版本、何種環境及何種狀態下出現的何種結果。對于文檔的有效性, 一時還無法在操作前就知道結論如何,那么對某個專題或問題,閱讀相關的多篇文章將會節省大量的時間,還可以保證盡量“干凈”的環境,有效避免因為不同操作 所造成的更多問題。操作時要仔細核對各個步驟及輸出的結果,盡量保持與文檔一致。

          九、在Linux論壇獲取幫助

          如果上面的措施沒有解決問題,此時你就需要Linux社區的幫助了。需要說明的是你要有周全的思考,準備好你的問題,不要草率的發問,否則只會得到到草率 的回答或者根本得不到任何答案。越表現出在尋求幫助前為解決問題付出的努力,你越能得到實質性的幫助。最好先搜尋一下論壇是否有您需要的文章。這樣可以獲 得事半功倍的效果。

          你需要提供精確有效的信息。這并不是要求你簡單的把成噸的出錯代碼或者數據完全轉儲摘錄到你的提問中。如果你有龐大而復雜的測試條件,盡量把它剪裁得越小 越好??赡苣銜龅竭@種情況,對于一個問題會出現不同內容回答,這時你需要通過實踐來驗證。另外把這個問題放在其他Linux社區請求幫助也是一種選擇。 如果得不到答案,請不要以為我們覺得無法幫助你。有時只是看到你問題的人不知道答案罷了。這時換一個社區是不錯的選擇。

          十、學習專業英文

          如果你想深入學習Linux,看不懂因為文檔實在是太難了。寫的最好的,最全面的文檔都是英語寫的,最先發布的技術信息也都是用英語寫的。即便是非英語國家的人發布技術文檔,也都首先翻譯成英語在國際學術雜志和網絡上發表。

          通過man、info等命令,可以從在線幫助中快速地獲得所需要的命令和操作方法。不要害怕海量的系統幫助,仔細閱讀幾個man或info文檔就會發現, 這些幫助幾乎都按照固定格式寫成一命令名稱、參數、參數說明、使用例子、參考等。當英語成為一種習慣,就會自覺地查找或訂閱互聯網上感興趣的英文材料。這 樣,在不知不覺中就已經和世界同步。

          十一、在社區共享你的經驗

          隨著Linux應用的擴展,出現了不少Linux社區。其中有一些非常優秀的社區:水木清華、其中有一些非常優秀的社區:www.linuxforum.net(國內最高水平GNU站點)、http://www.chinaunix.net/ (中國最大的Unix技術社區),隨著知識的不斷積累,就可以把自己動手解決一些前人沒有遇到的問題寫出文檔在網絡上共享給其他讀者。這個時候,也就成為 了一名“高手”。Linux的使用者一般都是專業人士,他們有著很好的電腦背景且愿意協助他人,Linux高手更具有鼓勵新手的文化精神。

          最后是一個筆者的Linux學習的路線圖(roadmap):

          ●了解Linux 的基礎知識,這些包含了用戶管理、群組的概念、權限的觀念等;
          ●掌握至少50個以上的常用命令;
          ●掌握.tgz、.rpm等軟件包的常用安裝方法
          ●學習添加外設,安裝設備驅動程序(比如網卡)
          ●熟悉Linux文件系統 和目錄結構。
          ●掌握vi,gcc,gdb等常用編輯器,編譯器,調試器 。
          ●理解shell別名、管道、I/O重定向、輸入和輸出以及shell腳本編程。
          ●網絡的基礎包括: 掌握路由概念、OSI七層網絡模型、TCP/IP模型及相關服務對應的層次對于Linux學習非常重要的。然后學習Linux環境下的組網。
          posted @ 2008-07-31 17:49 vesung 閱讀(391) | 評論 (0)編輯 收藏

          2008年6月29日 #

          國外開發者博客中有一篇有趣的文章,將程序員按水平像軟件版本號那樣劃分為不同的版本。相對于在招聘時分為初級,中級,高級程序員,直接表明需要某種語言N版本的程序員或許更方便直接。根據作者的觀點,可將WEB開發者大致分為以下幾個版本:

          Alpha:閱讀過一些專業書籍,大多數能用Dreamweaver或者FrontPage幫朋友制作一些Web頁面。但在他們熟練掌握HTML代碼以前,你大概不會雇傭他們成為職業的WEB制作人員。

          Beta:已經比較擅長整合站點頁面了,在HTML技巧方面也有一定造詣,但還是用Tables來制作頁面,不了解CSS,在面對動態頁面或數據庫連接時還是底氣不足。

          Pre Version 1 (0.1):比Beta版的開發者水平要高。熟悉HTML,開始了解CSS是如何運作的,懂一點JavaScript,但還是基于業余水準,逐步開始關心動態站點搭建和數據庫連接的知識。這個版本的WEB開發人員還遠不能成為雇主眼中的香餑餑。

          1.0: 能夠基本把控整個站點開發,針對每個問題盡可能的找到最直接的解決辦法。但對可測性,可擴展性以及在不同(層)框架下如何選擇最合適的WEB設計工具尚無概念。這個版本的WEB開發者有良好的技術基礎,需要有進一步的幫助和指導。

           

          2.0:懂面向對象的編程語言,理解分層開發的必要性,關注代碼分離,對問題尋找更完美的解決方法,偶然也會考慮設計模式的問題,但對此仍然概念不清。屬于優秀的初級開發者,能完成較松散的代碼開發(相對大型嚴謹的站點開發而言),在面對較復雜問題尋找解決辦法時需要周邊人的幫助。

          3.0:開始較為深入的理解面向對象編程和設計模式,了解他們的用途,當看到好的設計模式時能看透其本質,逐步關注分層的架構解決辦法和可測試性。理解不同的開發語言并能說出他們的異同(例如各自的優勢)。屬于優秀的中級別開發者,雇主也確信他們最終能找到問題的解決辦法,這個版本的人可以給1.0和2.0的開發者以指導。但他們對架構的理解仍然不夠清晰,值得一提的是,只要給予一些指導,他們能很快理解并熟記做出的決定,以及選定方案的優勢所在。

          4.0:理解模式,重視用戶的反饋。著手研究方法論,架構設計和軟件開發的最佳入口。頭腦中已經形成了超越開發語言,技術架構的整體方案,可根據需求解構程序。能從理論的角度,不同模式如何融合成最佳形態,將多種X-驅動的模式應用到不同的方案中。是精通多語言的高手,理解不同系統和方法論的細微差別,屬于高級程序員。這個級別的人能夠輕易的輔導2.0和3.0的程序員,將他們推向更高的級別。

          5.0:從系統的角度考慮問題。對各種系統結構有深入研究,能對整個代碼架構中的問題進行改進。在團隊粘合性以及代碼安全性方面有杰出貢獻。對1.0到4.0版本的開發人員出現的問題能及時察覺,讓整個團隊保持積極性且保持興奮的狀態創建軟件解決辦法。舉例來說,他們總是對新的技術和信息保持饑渴狀態,試圖用最簡便的方案解決開發任務。在整個IT團隊中獲得信任,屬于高級程序員和架構師。

          那么,您屬于哪個版本的程序員呢?

          posted @ 2008-06-29 23:28 vesung 閱讀(624) | 評論 (1)編輯 收藏

          2008年6月23日 #

          中國互聯網審查制度的不透明一直為人所詬病。現在還不清楚56.com是因為什么開罪了監管機構,也不知道該網站會關閉多久。這些疑問也表明籠罩整個中國互聯網視頻領域的風險,即使是那些有明智投資方支持的大型互聯網公司也面臨著同樣的問題。該網站至少募集了3,000萬美元資金,投資方中包括風險投資巨頭Sequoia Capita和華特•迪斯尼(Walt Disney Co.)旗下的Steamboat Ventures。

          網絡視頻主管部門之一的中國國家廣電總局(SARFT)沒有回復記者就56.com問題的采訪申請。該網站首席財務長張福興(Jay Chang)拒絕發表評論,其投資方的人士也拒絕置評。

          看來清理行動開始下狠手了。
          posted @ 2008-06-23 08:54 vesung 閱讀(351) | 評論 (0)編輯 收藏

          2008年6月12日 #

          不說廢話了,直接看代碼:
          頁面:
          <html>
          <head>
          <script type='text/javascript' src='jquery.js'></script>
          <script type='text/javascript'>
          //js代碼1
          <script>

          <body>
          <table>
           
          <tr>
            
          <td>級聯菜單</td>
            
          <td>
              
          <select name='city' class='amenu'>
               
          <option value=''>-市局全部-</option>
               
          <option value='1'>a市</option>
               
          <option value='2'>b市</option>
               
          <option value='3'>c市</option>
              
          </select>
            
          </td>
            
          <td>
              
          <select name='country' class='amenu'>
               
          <option value=''>-縣局全部-</option>
               
          <option value='1'>test</option>
              
          </select>
            
          </td>
            
          <td>
              
          <select name='taxOffice' class='amenu'>
               
          <option value=''>-所全部-</option>
               
          <option value='1'>test</option>    
              
          </select>
            
          </td>
            
          <td>
              
          <select name='taxOffical' class='amenu'>
               
          <option value=''>-職員全部-</option>
               
          <option value='1'>test</option>    
              
          </select>
            
          </td>
           
          </tr>
          </table>
          </body>

          對應的js代碼:
          js代碼1:
          //本菜單是4級級聯菜單,采用jquery框架來實現
          $(document).ready(function(){
           
          //為所有class為amenu的元素綁定onchange事件
           $('.amenu').change(function(){
            
          //記錄本級菜單標志
            var orgLevel = this.name;
            
          //下級菜單
            var nextMenu = $(this).parents().next().children[0];
            
          //ajax動作提交的對象(后臺采用java程序)
            var postUrl = 'pubOrgAjax.do';

            
          //如果本菜單是最后一級菜單的話則不做任何動作
            if(orgLevel=='taxOffical') return true;
            
          //本級菜單選擇為全部選項,則下級菜單也置為全部
            if(this.value == ''){
             
          var firstOption = nextMenu.option[0];
             nextMenu.length
          =0;
             nextMenu.options.add(firstOption);
             
          return true;
            }


            
          //ajax動作
            $.post(postUrl,{orgFlag:orgLevel,orgCode:this.value},function(xml){
              
          var dicts = $('dict',xml);
              
          if(dicts.length<1){alert('返回數據錯誤,請重新登陸');return false;}
              
          //清空nextMenu
              if(nextMenu.options[0].value == ''){
                
          var firstOption = nextMenu.options[0].text;
                nextMenu.length 
          = 0;
                nextMenu.options.add(
          new Option(firstOption,''));
              }
          else{
                nextMenu.length 
          = 0;
              }

              
          //為清空后的nextMenu填充新值
              for(var i=0;i<dicts.length;i++){
                
          var newOption = new Option($('name',dicts[i]).text(),$('code',dicts[i]).text());
                nextMenu.options.add(newOption);
              }

              
            }
          );
            
           }
          );
          }
          );

          后臺返回的數據格式:
          <?xml version="1.0" cencodeing="gbk"?>
          <ajax-response>
          <response>
           
          <dict>
              
          <code>1</code>
              
          <name>市局1</name>
           
          </dict>
           
          <dict>
           
           
          </dict>

           
          </response>
          </ajax-respnse>

          posted @ 2008-06-12 09:44 vesung 閱讀(9839) | 評論 (5)編輯 收藏

          2008年6月5日 #

          Yahoo本周發表研發一年的Yahoo!BrowserPlus預覽版,這是一個用來延伸網絡應用的平臺,開發人員可透過該平臺結合桌面程序,而用戶只要透過瀏覽器就能執行利用該平臺開發的網絡應用。

          現階段BrowserPlus平臺所提供的功能包括自桌面拖曳、客戶端的圖像處理,以及桌面通知工具等。Yahoo指出,BrowserPlus的最大特色就是可以直接新增或更新服務而不用重新啟動瀏覽器,甚至不需重新下載網頁,對使用者而言,這代表在執行這些新應用時不用進行安裝或受到其他干擾;開發人員則能透過單一的功能呼叫檢視或啟動新服務。

          Yahoo展示了基于BrowserPlus所設計的應用范例,其中一個為照片上傳工具Photo Uploader,該工具參考了Flickr Uploader桌面應用程序的功能,用戶可以透過瀏覽器,從桌面上拖曳照片,并進行諸如旋轉、改變大小以及特效等簡單的編輯功能。

          BrowserPlus屬于近來風行的豐富網絡應用程序(RIA)平臺,Yahoo利用該平臺替開發人員處理了復雜的軟件發表及更新功能,讓開發人員及使用者皆能從中受益。

          Yahoo目前僅允許Yahoo及其合作伙伴使用BrowserPlus,預計在公開版本發表后才會供其他開發人員使用?,F階段BrowserPlus支持Windows XP及Mac OS X等操作系統,以及IE、Firefox及Safari等瀏覽器,未來將支持更多的平臺。

          Yahoo指出,Yahoo致力于開發開放的平臺,其中一項重點是提供開發人員用來開發內容的客戶端工具,Yahoo先前已釋出Yahoo用戶接口鏈接庫(Yahoo!User Interface Library,YUI)開放源碼計劃,BrowserPlus則是提供以瀏覽器為基礎的網站開發解決方案,該平臺之后也將朝開放的目標前進。

          豐富網絡應用程序平臺成為各大業者爭相競逐的領域,市場上類似的平臺還包括微軟發表的Silverlight、Adobe的AIR,以及Mozilla基金會所開發的Prism等

          posted @ 2008-06-05 08:50 vesung 閱讀(422) | 評論 (0)編輯 收藏

          2008年6月4日 #

          (轉載)
          2007年6月項目準備開始了,剛來到一個新的項目組,什么都是新的,除了我自己。

          需要一個新的框架來開發項目,香港的同事決定使用Dojo,DWR, 我開始學習使用dojo,時間很短,但是我還是基本上熟悉了dojo的基本控件和架構。在此基礎上搭建起了項目的基本框架。這是一個單頁面,基于ajax和dojo widget的系統,一切都那么的新奇,又充滿挑戰,但是既然dojo有這么多后臺,又有香港同事的推薦,我顯得自信滿滿。

          框架搭建的同事,也開始后了緊鑼密鼓的招兵買馬,一起都像是從零開始。陸陸續續,招了5個程序員和一個測試員。開始了整個項目的快速開發,由于需求由香港負責,而且需求做的比較細致,基本上問題很少。Dojo 卻是麻煩不斷。

          首先的一個壞消息是當我們做完了幾乎全部300個頁面的時候,dojo宣布0.43不在得到支持,取而代之是完全不同的dojo0.9。 而且dojo0.9 還不是穩定的版本,問題多多,讓我們騎虎難下,最后還是決定按兵不動。 隨之而來,是dojo1.0,dojo1.1 的陸續發布,但是一直都無法讓我看到希望的曙光。 與之相對的是ext在國內的廣泛使用和熱烈追捧。

          Dojo 的控件有很多奇怪的地方,日期選擇控件的行為非常怪異,與國內的使用習慣很不相同。而且樣式極其丑陋,當字體放大縮小的時候更是丑陋。顯示的格式和保存的格式需要分別指定。我們修改了大量的代碼。

          dojo 的下拉框也被用戶投訴,過濾之后一定要再選擇一次或者按回車才能選定結果,前臺值和后臺值分開操作也帶來很多不變。

          dojo 的驗證文本框顏色現實有bug,我們不得不修改代碼

          dojo的對話框也有問題,對話框中無法在彈出對話框。對話框的操作和控制很不靈活。

          js代碼不利于管理,容易發生命名沖突。

           

          致命的問題發生在項目的后期,在客戶的系統進行測試時發現。dojo的性能非常差,在賽揚2G的電腦上,一個頁面顯示的時間竟然需要17秒。簡直就是噩夢。

          另外使用dojo的對話框時出現cpu占用100%而且一直不回落下來。

          頁面載入完成的時候,它有將整個頁面重新刷新一次,又需要花費額外的5到8s時間,不僅花費更多的時間,而且嚴重影響客戶體驗。

           

          還有開發過程中碰到的無數問題,雖然一個一個被解決,但是無疑是一次一次痛苦的煎熬。

           

          最后,在性能面前,我被dojo徹底打敗,如此的速度是任何客戶都無法忍受的,客戶不可能為了這個系統全部升級電腦cpu。而且還有很多未知的問題可能還沒有被發覺,不如內存泄露,可能導致資源耗盡,內存耗盡。cpu 的占用可能在使用時間長了之后越來越高,等等,這些都是我擔心的問題。

           

          使用Ajax或者說Rich client,一定要謹慎啊。使用新的技術和框架,一定要謹慎,這是我的教訓,希望給同行們一個參考。

          posted @ 2008-06-04 11:32 vesung 閱讀(2097) | 評論 (2)編輯 收藏

          2008年6月3日 #

          看兩段代碼:
          import java.util.ArrayList;   
          import java.util.List;   
            
          public class TailRecursionTest {   
              
          public static void main(String[] args) {   
                  TailRecursionTest t 
          = new TailRecursionTest();   
                  
          for (int i = 0; i < 10000; i++)   
                      t.a(
          0);   
              }
             
            
              
          public void a(int j) {   
                  j
          ++;   
                  List list 
          = new ArrayList<Integer>(100000);   
                  
          // 對list進行處理   
              }
             
          }

          沒啥特殊的,僅僅是為了測試,我們將a方法調用10000次,a方法創建一個有100000個元素的list的局部變量。
          第二個程序:
          import java.util.ArrayList;   
          import java.util.List;   
            
          public class TailRecursionTest2 {   
              
          public static void main(String[] args) {   
                  TailRecursionTest2 t 
          = new TailRecursionTest2();   
                  t.a(
          0);   
              }
             
            
              
          public void a(int j) {   
                  System.out.println(j);   
                  j
          ++;   
                  
          if (j == 10000)   
                      
          return;   
                  List list 
          = new ArrayList<Integer>(100000);   
                  
          // 對list進行處理   
                  a(j);   
              }
             
          }
            

          也沒啥特殊的,就是將循環換成了遞歸,a方法做的事情沒變。兩個都跑一下,程序1順利結束,程序2出問題了,啥問題?如下:
          161  
          162  
          163  
          164  
          165  
          Exception in thread 
          "main" java.lang.OutOfMemoryError: Java heap space   
              at java.util.ArrayList.
          <init>(Unknown Source)   
              at TailRecursionTest2.a(TailRecursionTest2.java:
          17)   
              at TailRecursionTest2.a(TailRecursionTest2.java:
          20)   
              at TailRecursionTest2.a(TailRecursionTest2.java:
          20)   
              at TailRecursionTest2.a(TailRecursionTest2.java:
          20)   
              at TailRecursionTest2.a(TailRecursionTest2.java:
          20

          我倒,才運行166次了,heap就滿了。問題在哪呢?oh,yep,你肯定想到了,是不是重復創建list這個大集合引起的呢?它不是局部變量嗎?怎么也會溢出?是的,list是局部變量,在a的方法棧里引用著,指向heap上的大對象,更關鍵的問題在于,java是沒有尾遞歸優化的,遞歸方法是不會使用同一個棧幀,每一次遞歸調用,都將壓入新的棧幀,并且這個棧幀上又new了一個list變量,引用著heap上新的一個大集合。隨著棧深度的增加, jvm里維持著一條長長的方法調用軌跡以便你能回來,在方法沒有返回之前,這些list變量一直被各自的棧幀引用著,不能被GC,你說,能不OOM嗎?

              也許,你想到了個補救方法來挽救程序2,就是每次在處理完list后,我把它設置為null,不讓棧幀繼續引用著它,咱編寫對gc友好的代碼,這不就行了,試試:


          import java.util.ArrayList;   
          import java.util.List;   
            
          public class TailRecursionTest2 {   
              
          public static void main(String[] args) {   
                  TailRecursionTest2 t 
          = new TailRecursionTest2();   
                  t.a(
          0);   
              }
             
            
              
          public void a(int j) {   
                  System.out.println(j);   
                  j
          ++;   
                  
          if (j == 10000)   
                      
          return;   
                  List list 
          = new ArrayList<Integer>(100000);   
                  
          // 對list進行處理   
                  list = null;  //gc友好   
                  a(j);   
              }
             
          }
           

          得意洋洋,我跑一下看看,這次跑到4000多次,但是:
             
          4289  
          4290  
          4291  
          4292  
          java.lang.StackOverflowError   
              at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)   
              at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)   
              at java.nio.charset.CharsetEncoder.encode(Unknown Source) 

          總結:在java里,遞歸最好咱還是別用,老老實實地while、for;就算遞歸了,最好遞歸方法不要new太大的對象,除非你能確定遞歸的深度不是那么大,否則OOM和堆棧溢出的陰影將籠罩著你。
          posted @ 2008-06-03 09:14 vesung 閱讀(1562) | 評論 (0)編輯 收藏

          2008年6月2日 #

          先看下面表格:

          作用域
          當前類 同一package 子孫類
          其他package
          public √   
          √   
          √   
          √   
          protected
          √   
          √   
          √   
            × 
          default √   
          √   
            × 
            × 
          private √   
            × 
            × 
            × 

          不寫時默認為default

          我們先看類:

          public class  Test 可以在任何地方訪問,無論是否為當前package
          class Test 只允許當前的package使用,不允許其它package使用
          class 不與許prirvate和protected ,所以不討論了

          我們再看方法
          private 的只允許類自己使用,子類都不可見。但允許inner類調用,因為inner類屬于他自己。

          class Test 里面的方法
            public 和default和protected 方法,允許同包的訪問,因為類是default的,所以方法不可能大于它

          public class Test 里面的方法
            private 只允許自己內部訪問
           default 只允許同包的訪問
            protected 只允許同包和子類訪問
            public 可以任意訪問
          posted @ 2008-06-02 09:12 vesung 閱讀(877) | 評論 (0)編輯 收藏

          僅列出標題  下一頁
          主站蜘蛛池模板: 闽清县| 和林格尔县| 株洲县| 文成县| 靖远县| 永仁县| 福清市| 桑日县| 九台市| 松江区| 彭州市| 米易县| 融水| 清水县| 新竹县| 灵丘县| 哈巴河县| 海门市| 荥阳市| 泉州市| 厦门市| 锦州市| 延安市| 江北区| 蓬莱市| 秀山| 南召县| 高阳县| 城口县| 东山县| 工布江达县| 湘潭市| 礼泉县| 安徽省| 神木县| 宁城县| 湖州市| 荥阳市| 临湘市| 灵武市| 建平县|