隨筆-88  評(píng)論-77  文章-48  trackbacks-0
            2006年8月18日

          發(fā)布21個(gè)已知被微軟黑屏的序列號(hào)提醒相關(guān)用戶不要冒險(xiǎn)去驗(yàn)證升級(jí)

          發(fā)布21個(gè)已知被微軟黑屏的序列號(hào),提醒使用該序列號(hào)的用戶就不要冒險(xiǎn)去驗(yàn)證升級(jí)了。

          已知被黑屏的序列號(hào)(這21個(gè)序列號(hào)是我今天一個(gè)個(gè)通過驗(yàn)證測試出來的結(jié)果):

          XP8BF-F8HPF-PY6BX-K24PJ-TWT6M 

          F4297-RCWJP-P482C-YY23Y-XH8W3

          HH7VV-6P3G9-82TWK-QKJJ3-MXR96

          HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT

          MRX3F-47B9T-2487J-KWKMF-RPWBY

          T72KM-6GWBP-GX7TD-CXFT2-7WT2B

          QHYXK-JCJRX-XXY8Y-2KX2X-CCXGD

          DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G

          MFBF7-2CK8B-93MDB-8MR7T-4QRCQ

          MRX3F-47B9T-2487J-KWKMF-RPWBY

          DFXFM-DKWTG-MYDWJ-68DQF-YBCYG

          TB7JC-3VJKY-J3VMR-PP8TP-HMTWY

          KR88V-RCBCB-D78QP-V4FF9-JW77M

          HWCTG-CQPWK-D22DQ-JD7TQ-GXVW8

          Q7TG8-MQ3BK-RHXQC-YDXJD-6Q6M3

          BP6XM-YXMKY-V4Q74-KJP8X-VW3CQ

          BFBPF-TF64Y-BT8T9-DQJFY-3TH7W

          GQ9CX-QDFPR-XFRMF-T3M94-2JG9Y

          XPF44-PDM32-XT4B8-R8W8C-CPP6T

          RC7QJ-KX66J-V4R9W-32HC4-CJH2B

          DDQXW-THQ8M-79V6K-2YFGH-R793Q

          注:但有網(wǎng)友反映MRX3F-47B9T-2487J-KWKMF-RPWBY這個(gè)序列號(hào)有些地方能通過正版驗(yàn)證,有些地方不能通過正版驗(yàn)證,看來微軟這次驗(yàn)證還分蠻細(xì)的,并可以按地區(qū)來判斷序列號(hào)是否為盜版和正版呀。
          posted @ 2008-10-26 00:40 崛起的程序員 閱讀(379) | 評(píng)論 (0)編輯 收藏

          AJAX 流行之后,總想好好學(xué)習(xí)一下。但是眾多的框架實(shí)在難以選擇。說明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。
          剛開始學(xué)了 JQuqery, 眾多的 $get(),...等等符號(hào)早已把我搞暈了。暫時(shí)就放棄了。
          后來學(xué)習(xí) ASP.NET AJAX ,在微軟的領(lǐng)導(dǎo)下,逐漸由服務(wù)器端轉(zhuǎn)向客戶端編程。 激起我客戶端編程的興趣,
          才想起學(xué)習(xí)一下了 Jquery.
                隨著WEB2.0及ajax思想在互聯(lián)網(wǎng)上的快速發(fā)展傳播,陸續(xù)出現(xiàn)了一些優(yōu)秀的Js框架,其中比較著名的有Prototype、YUI、jQuery、mootools、Bindows以及國內(nèi)的JSVM框架等,通過將這些JS框架應(yīng)用到我們的項(xiàng)目中能夠使程序員從設(shè)計(jì)和書寫繁雜的JS應(yīng)用中解脫出來,將關(guān)注點(diǎn)轉(zhuǎn)向功能需求而非實(shí)現(xiàn)細(xì)節(jié)上,從而提高項(xiàng)目的開發(fā)速度。
                jQuery是繼prototype之后的又一個(gè)優(yōu)秀的Javascript框架。它是由 John Resig 于 2006 年初創(chuàng)建的,它有助于簡化 JavaScript™ 以及Ajax 編程。有人使用這樣的一比喻來比較prototype和jQuery:prototype就像Java,而jQuery就像ruby. 它是一個(gè)簡潔快速靈活的JavaScript框架,它能讓你在你的網(wǎng)頁上簡單的操作文檔、處理事件、實(shí)現(xiàn)特效并為Web頁面添加Ajax交互。

          它具有如下一些特點(diǎn):
          1、代碼簡練、語義易懂、學(xué)習(xí)快速、文檔豐富。
          2、jQuery是一個(gè)輕量級(jí)的腳本,其代碼非常小巧,最新版的JavaScript包只有20K左右。
          3、jQuery支持CSS1-CSS3,以及基本的xPath。
          4、jQuery是跨瀏覽器的,它支持的瀏覽器包括IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+。
          5、可以很容易的為jQuery擴(kuò)展其他功能。
          6、能將JS代碼和HTML代碼完全分離,便于代碼和維護(hù)和修改。
          7、插件豐富,除了jQuery本身帶有的一些特效外,可以通過插件實(shí)現(xiàn)更多功能,如表單驗(yàn)證、tab導(dǎo)航、拖放效果、表格排序、DataGrid,樹形菜單、圖像特效以及ajax上傳等。

          jQuery的設(shè)計(jì)會(huì)改變你寫JavaScript代碼的方式,降低你學(xué)習(xí)使用JS操作網(wǎng)頁的復(fù)雜度,提高網(wǎng)頁JS開發(fā)效率,無論對(duì)于js初學(xué)者還是資深專家,jQuery都將是您的首選。
          jQuery適合于設(shè)計(jì)師、開發(fā)者以及那些還好者,同樣適合用于商業(yè)開發(fā),可以說jQuery適合任何JavaScript應(yīng)用的地方,可用于不同的Web應(yīng)用程序中。
          官方站點(diǎn):http://jquery.com/  中文站點(diǎn):http://jquery.org.cn/

          1.2、目的
          通過學(xué)習(xí)本文檔,能夠?qū)Query有一個(gè)簡單的認(rèn)識(shí)了解,清楚JQuery與其他JS框架的不同,掌握jQuery的常用語法、使用技巧及注意事項(xiàng)。

          二、使用方法
          在需要使用JQuery的頁面中引入JQuery的js文件即可。
          例如:<script type="text/javascript" src="js/jquery.js"></script>
          引入之后便可在頁面的任意地方使用jQuery提供的語法。

          三、學(xué)習(xí)教程及參考資料
          請(qǐng)參照《jQuery中文API手冊(cè)》和http://jquery.org.cn/visual/cn/index.xml
          推薦兩篇不錯(cuò)的jquery教程:《jQuery的起點(diǎn)教程》和《使用 jQuery 簡化 Ajax 開發(fā)》


          四、語法總結(jié)和注意事項(xiàng)

          1、關(guān)于頁面元素的引用
          通過jquery的$()引用元素包括通過id、class、元素名以及元素的層級(jí)關(guān)系及dom或者xpath條件等方法,且返回的對(duì)象為jquery對(duì)象(集合對(duì)象),不能直接調(diào)用dom定義的方法。

          2、jQuery對(duì)象與dom對(duì)象的轉(zhuǎn)換
          只有jquery對(duì)象才能使用jquery定義的方法。注意dom對(duì)象和jquery對(duì)象是有區(qū)別的,調(diào)用方法時(shí)要注意操作的是dom對(duì)象還是jquery對(duì)象。
          普通的dom對(duì)象一般可以通過$()轉(zhuǎn)換成jquery對(duì)象。
          如:$(document.getElementById("msg"))則為jquery對(duì)象,可以使用jquery的方法。
          由于jquery對(duì)象本身是一個(gè)集合。所以如果jquery對(duì)象要轉(zhuǎn)換為dom對(duì)象則必須取出其中的某一項(xiàng),一般可通過索引取出。
          如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這些都是dom對(duì)象,可以使用dom中的方法,但不能再使用Jquery的方法。
          以下幾種寫法都是正確的:
          $("#msg").html();
          $("#msg")[0].innerHTML;
          $("#msg").eq(0)[0].innerHTML;
          $("#msg").get(0).innerHTML;

          3、如何獲取jQuery集合的某一項(xiàng)
          對(duì)于獲取的元素集合,獲取其中的某一項(xiàng)(通過索引指定)可以使用eqget(n)方法或者索引號(hào)獲取,要注意,eq返回的是jquery對(duì)象,而get(n)和索引返回的是dom元素對(duì)象。對(duì)于jquery對(duì)象只能使用jquery的方法,而dom對(duì)象只能使用dom的方法,如要獲取第三個(gè)<div>元素的內(nèi)容。有如下兩種方法:
          $("div").eq(2).html();    //調(diào)用jquery對(duì)象的方法
          $("div").get(2).innerHTML;  //調(diào)用dom的方法屬性

          4、同一函數(shù)實(shí)現(xiàn)set和get
          Jquery中的很多方法都是如此,主要包括如下幾個(gè):
          $("#msg").html();    //返回id為msg的元素節(jié)點(diǎn)的html內(nèi)容。
          $("#msg").html("<b>new content</b>");  
          //將“<b>new content</b>” 作為html串寫入id為msg的元素節(jié)點(diǎn)內(nèi)容中,頁面顯示粗體的new content

          $("#msg").text();    //返回id為msg的元素節(jié)點(diǎn)的文本內(nèi)容。
          $("#msg").text("<b>new content</b>");  
          //將“<b>new content</b>” 作為普通文本串寫入id為msg的元素節(jié)點(diǎn)內(nèi)容中,頁面顯示<b>new content</b>

          $("#msg").height();    //返回id為msg的元素的高度
          $("#msg").height("300");  //將id為msg的元素的高度設(shè)為300
          $("#msg").width();    //返回id為msg的元素的寬度
          $("#msg").width("300");  //將id為msg的元素的寬度設(shè)為300

          $("input").val(");  //返回表單輸入框的value值
          $("input").val("test");  //將表單輸入框的value值設(shè)為test

          $("#msg").click();  //觸發(fā)id為msg的元素的單擊事件
          $("#msg").click(fn);  //為id為msg的元素單擊事件添加函數(shù)
          同樣blur,focus,select,submit事件都可以有著兩種調(diào)用方法

          5、集合處理功能
          對(duì)于jquery返回的集合內(nèi)容無需我們自己循環(huán)遍歷并對(duì)每個(gè)對(duì)象分別做處理,jquery已經(jīng)為我們提供的很方便的方法進(jìn)行集合的處理。
          包括兩種形式:
          $("p").each(function(i){this.style.color=['#f00','#0f0','#00f'][i]})  
          //為索引分別為0,1,2的p元素分別設(shè)定不同的字體顏色。

          $("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})  
          //實(shí)現(xiàn)表格的隔行換色效果

          $("p").click(function(){alert($(this).html())})    
          //為每個(gè)p元素增加了click事件,單擊某個(gè)p元素則彈出其內(nèi)容

          6、擴(kuò)展我們需要的功能
          $.extend({
            min: function(a, b){return a < b?a:b; },
            max: function(a, b){return a > b?a:b; }
          });  //為jquery擴(kuò)展了min,max兩個(gè)方法
          使用擴(kuò)展的方法(通過“$.方法名”調(diào)用):
          alert("a=10,b=20,max="+$.max(10,20)+",min="+$.min(10,20));

          7、支持方法的連寫
          所謂連寫,即可以對(duì)一個(gè)jquery對(duì)象連續(xù)調(diào)用各種不同的方法。
          例如:
          $("p").click(function(){alert($(this).html())})
          .mouseover(function(){alert('mouse over event')})
          .each(function(i){this.style.color=['#f00','#0f0','#00f'][i]});

          8、操作元素的樣式
          主要包括以下幾種方式:
          $("#msg").css("background");    //返回元素的背景顏色
          $("#msg").css("background","#ccc")  //設(shè)定元素背景為灰色
          $("#msg").height(300); $("#msg").width("200");  //設(shè)定寬高
          $("#msg").css({ color: "red", background: "blue" });//以名值對(duì)的形式設(shè)定樣式
          $("#msg").addClass("select");  //為元素增加名稱為select的class
          $("#msg").removeClass("select");  //刪除元素名稱為select的class
          $("#msg").toggleClass("select");  //如果存在(不存在)就刪除(添加)名稱為select的class

          9、完善的事件處理功能
          Jquery已經(jīng)為我們提供了各種事件處理方法,我們無需在html元素上直接寫事件,而可以直接為通過jquery獲取的對(duì)象添加事件。
          如:
          $("#msg").click(function(){alert("good")})  //為元素添加了單擊事件
          $("p").click(function(i){this.style.color=['#f00','#0f0','#00f'][i]})
          //為三個(gè)不同的p元素單擊事件分別設(shè)定不同的處理
          jQuery中幾個(gè)自定義的事件:
          (1)hover(fn1,fn2):一個(gè)模仿懸停事件(鼠標(biāo)移動(dòng)到一個(gè)對(duì)象上面及移出這個(gè)對(duì)象)的方法。當(dāng)鼠標(biāo)移動(dòng)到一個(gè)匹配的元素上面時(shí),會(huì)觸發(fā)指定的第一個(gè)函數(shù)。當(dāng)鼠標(biāo)移出這個(gè)元素時(shí),會(huì)觸發(fā)指定的第二個(gè)函數(shù)。
          //當(dāng)鼠標(biāo)放在表格的某行上時(shí)將class置為over,離開時(shí)置為out。
          $("tr").hover(function(){
          $(this).addClass("over");
          },
            function(){
             $(this).addClass("out");
          });
          (2)ready(fn):當(dāng)DOM載入就緒可以查詢及操縱時(shí)綁定一個(gè)要執(zhí)行的函數(shù)。
          $(document).ready(function(){alert("Load Success")})
          //頁面加載完畢提示“Load Success”,相當(dāng)于onload事件。與$(fn)等價(jià)
          (3)toggle(evenFn,oddFn): 每次點(diǎn)擊時(shí)切換要調(diào)用的函數(shù)。如果點(diǎn)擊了一個(gè)匹配的元素,則觸發(fā)指定的第一個(gè)函數(shù),當(dāng)再次點(diǎn)擊同一元素時(shí),則觸發(fā)指定的第二個(gè)函數(shù)。隨后的每次點(diǎn)擊都重復(fù)對(duì)這兩個(gè)函數(shù)的輪番調(diào)用。
            //每次點(diǎn)擊時(shí)輪換添加和刪除名為selected的class。
            $("p").toggle(function(){
              $(this).addClass("selected");  
            },function(){
               $(this).removeClass("selected");
            });
          (4)trigger(eventtype): 在每一個(gè)匹配的元素上觸發(fā)某類事件。
          例如:
            $("p").trigger("click");    //觸發(fā)所有p元素的click事件
          (5)bind(eventtype,fn),unbind(eventtype): 事件的綁定與反綁定
          從每一個(gè)匹配的元素中(添加)刪除綁定的事件。
          例如:
          $("p").bind("click", function(){alert($(this).text());});  //為每個(gè)p元素添加單擊事件
          $("p").unbind();  //刪除所有p元素上的所有事件
          $("p").unbind("click")  //刪除所有p元素上的單擊事件

          10、幾個(gè)實(shí)用特效功能
          其中toggle()和slidetoggle()方法提供了狀態(tài)切換功能。
          如toggle()方法包括了hide()和show()方法。
          slideToggle()方法包括了slideDown()和slideUp方法。

          11、幾個(gè)有用的jQuery方法
          $.browser.瀏覽器類型:檢測瀏覽器類型。有效參數(shù):safari, opera, msie, mozilla。如檢測是否ie:$.browser.isie,是ie瀏覽器則返回true。
          $.each(obj, fn):通用的迭代函數(shù)。可用于近似地迭代對(duì)象和數(shù)組(代替循環(huán))。

          $.each( [0,1,2], function(i, n){ alert( "Item #" + i + ": " + n ); });
          等價(jià)于:
          var tempArr=[0,1,2];
          for(var i=0;i<tempArr.length;i++){
            alert("Item #"+i+": "+tempArr[i]);
          }
          也可以處理json數(shù)據(jù),如
          $.each( { name: "John", lang: "JS" }, function(i, n){ alert( "Name: " + i + ", Value: " + n ); });
          結(jié)果為:
          Name:name, Value:John
          Name:lang, Value:JS
          $.extend(target,prop1,propN):用一個(gè)或多個(gè)其他對(duì)象來擴(kuò)展一個(gè)對(duì)象,返回這個(gè)被擴(kuò)展的對(duì)象。這是jquery實(shí)現(xiàn)的繼承方式。
          如:
          $.extend(settings, options);  
          //合并settings和options,并將合并結(jié)果返回settings中,相當(dāng)于options繼承setting并將繼承結(jié)果保存在setting中。
          var settings = $.extend({}, defaults, options);
          //合并defaults和options,并將合并結(jié)果返回到setting中而不覆蓋default內(nèi)容。
          可以有多個(gè)參數(shù)(合并多項(xiàng)并返回)
          $.map(array, fn):數(shù)組映射。把一個(gè)數(shù)組中的項(xiàng)目(處理轉(zhuǎn)換后)保存到到另一個(gè)新數(shù)組中,并返回生成的新數(shù)組。
          如:
          var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
          tempArr內(nèi)容為:[4,5,6]
          var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
          tempArr內(nèi)容為:[2,3]
          $.merge(arr1,arr2):合并兩個(gè)數(shù)組并刪除其中重復(fù)的項(xiàng)目。
          如:$.merge( [0,1,2], [2,3,4] )  //返回[0,1,2,3,4]
          $.trim(str):刪除字符串兩端的空白字符。
          如:$.trim("  hello, how are you?   ");   //返回"hello,how are you? "

          12、解決自定義方法或其他類庫與jQuery的沖突
          很多時(shí)候我們自己定義了$(id)方法來獲取一個(gè)元素,或者其他的一些js類庫如prototype也都定義了$方法,如果同時(shí)把這些內(nèi)容放在一起就會(huì)引起變量方法定義沖突,Jquery對(duì)此專門提供了方法用于解決此問題。
          使用jquery中的jQuery.noConflict();方法即可把變量$的控制權(quán)讓渡給第一個(gè)實(shí)現(xiàn)它的那個(gè)庫或之前自定義的$方法。之后應(yīng)用Jquery的時(shí)候只要將所有的$換成jQuery即可,如原來引用對(duì)象方法$("#msg")改為jQuery("#msg")。
          如:
          jQuery.noConflict();
          // 開始使用jQuery
          jQuery("div   p").hide();
          // 使用其他庫的 $()
          $("content").style.display = 'none';

          posted @ 2008-09-21 21:24 崛起的程序員 閱讀(319) | 評(píng)論 (0)編輯 收藏
          1377-4167-5844-4698-0048-5821
          posted @ 2008-03-02 19:35 崛起的程序員 閱讀(340) | 評(píng)論 (0)編輯 收藏

          Flex License:
          1307-1581-4356-2616-4951-7949 (Commercial Version)
          1307-1581-4356-2939-1231-4484 (Education Version)

          Charting License:

          1301-4581-4356-7349-9369-3351 (Commercial Version)

          posted @ 2008-02-24 21:43 崛起的程序員 閱讀(410) | 評(píng)論 (0)編輯 收藏

          Today we shipped Visual Studio 2008 and .NET 3.5.  You can download the final release using one of the links below:

          • If you are a MSDN subscriber, you can download your copy from the MSDN subscription site (note: some of the builds are just finishing being uploaded now - so check back later during the day if you don't see it yet).

          • If you are a non-MSDN subscriber, you can download a 90-day free trial edition of Visual Studio 2008 Team Suite here.  A 90-day trial edition of Visual Studio 2008 Professional (which will be a slightly smaller download) will be available next week.  A 90-day free trial edition of Team Foundation Server can also be downloaded here.

          • If you want to use the free Visual Studio 2008 Express editions (which are much smaller and totally free), you can download them here

          • If you want to just install the .NET Framework 3.5 runtime, you can download it here.

          Quick Tour of Some of the New Features

          Visual Studio 2008 and .NET 3.5 contain a ton of new functionality and improvements.  Below are links to blog posts I've done myself as well as links to videos you can watch to learn more about it:

          VS 2008 Multi-Targeting Support

          VS 2008 enables you to build applications that target multiple versions of the .NET Framework.  This means you can use VS 2008 to open, edit and build existing .NET 2.0 and ASP.NET 2.0 applications (including ASP.NET 2.0 applications using ASP.NET AJAX 1.0), and continue to deploy these application on .NET 2.0 machines.  You can learn more about how this works from my blog post here:

          ASP.NET AJAX and JavaScript Support

          .NET 3.5 has ASP.NET AJAX built-in (no separate download required).  In addition to including all of the features in ASP.NET AJAX 1.0, ASP.NET 3.5 also now includes richer support for UpdatePanels integrating with WebParts, ASP.NET AJAX integration with controls like <asp:menu> and <asp:treeview>, WCF support for JSON, and many other AJAX improvements.

          VS 2008 and Visual Web Developer 2008 also now have great support for integrating JavaScript and AJAX into your applications.  You can learn more about this from my blog posts here:

          You can watch some videos that discuss ASP.NET AJAX and Visual Studio 2008 support for it here

          I also highly recommend the excellent ASP.NET AJAX in Action book to learn more about ASP.NET AJAX (both client-side and server-side).

          VS 2008 Web Designer and CSS Support

          VS 2008 and Visual Web Developer 2008 Express includes a significantly improved HTML web designer (the same one that ships with Expression Web).  This delivers support for split-view editing, nested master pages, and great CSS integration.  Below are some articles I've written that discuss this more:

          ASP.NET 3.5 also has a new <asp:ListView> control that provides the ability to perform rich data scenarios with total control over the markup.  It works nicely with the new CSS support in VS 2008.  You can learn more about it from my article here:

          You can watch some videos that discuss the new Visual Studio 2008 web designer features and the new ListView/DataPager controls here

          Language Improvements and LINQ

          The new VB and C# compilers in VS 2008 deliver significant improvements to the languages.  Both add functional programming concepts that enable you to write cleaner, terser, and more expressive code.  These features also enable a new programming model we call LINQ (language integrated query) that makes querying and working with data a first-class programming concept with .NET. 

          Below are some of the articles I've written that explore these new language features using C#:

          Here are a few additional blog posts I've written that show off some of the new VS 2008 code editing support and some cool ways to use these new language features:

          The Visual Basic team has also created some great free videos that cover LINQ.  You can watch them here.

          Data Access Improvements with LINQ to SQL

          LINQ to SQL is a built-in OR/M (object relational mapper) in .NET 3.5.  It enables you to model relational databases using a .NET object model.  You can then query the database using LINQ, as well as update/insert/delete data from it.  LINQ to SQL fully supports transactions, views, and stored procedures.  It also provides an easy way to integrate business logic and validation rules into your data model.  Below are some of the articles I've written that explore how to use it:

          I think you'll find that LINQ and LINQ to SQL makes it much easier to build much cleaner data models, and write much cleaner data code.  I'll be adding more posts to my LINQ to SQL series in the weeks and months ahead (sorry for the delay in finishing them earlier - so much to-do and so little time to-do it all!).

          Scott Stanfield is also working on creating some great LINQ to SQL videos for the www.asp.net site based on my article series above (all videos are in both VB and C#).  You can watch the first 4 videos in this series here.

          Browsing the .NET Framework Library Source using Visual Studio

          As I blogged a few weeks ago, we will be releasing a reference version of the .NET Framework library source code as part of this release.  Visual Studio 2008 has built-in debugger support to automatically step-into and debug this code on demand (VS 2008 can pull down the source for the appropriate .NET Framework library file automatically for you).

          We are deploying the source servers to enable this right now, and will be publishing the steps to turn this feature on in the next few weeks.

          Lots of other improvements

          The list above is only a small set of the improvements coming.  For client development VS 2008 includes WPF designer and project support.  ClickOnce and WPF XBAPs now work with FireFox.  WinForms and WPF projects can also now use the ASP.NET Application Services (Membership, Roles, Profile) for roaming user data. 

          Office development is much richer - including support for integrating with the Office 2007 ribbon, and with Outlook.  Visual Studio Tools for Office support is also now built-into Visual Studio (you no longer need to buy a separate product).

          New WCF and Workflow projects and designers are now included in VS 2008.  Unit testing support is now much faster and included in VS Professional (and no longer just VSTS).  Continuous Integration support is now built-in with TFS.  AJAX web testing (unit and load) is now supported in the VS Test SKU.  And there is much, much more...

          Installation Suggestions

          People often ask me for suggestions on how best to upgrade from previous betas of Visual Studio 2008.  In general I'd recommend uninstalling the Beta2 bits explicitly.  As part of this you should uninstall Visual Studio 2008 Beta2, .NET Framework Beta2, as well as the Visual Studio Web Authoring Component (these are all separate installs and need to be uninstalled separately).  I then usually recommend rebooting the machine after uninstalling just to make sure everything is clean before you kick off the new install.  You can then install the final release of VS 2008 and .NET 3.5 on the machine.

          Once installed, I usually recommend explicitly running the Tools->Import and Export Settings menu option, choosing the "Reset Settings" option, and then re-pick your preferred profile.  This helps ensure that older settings from the Beta2 release are no longer around (and sometimes seems to help with performance).

          Note that VS 2008 runs side-by-side with VS 2005 - so it is totally fine to have both on the same machine (you will not have any problems with them on the same box).

          Silverlight Tools and VS Web Deployment Project Add-Ins

          Two popular add-ins to Visual Studio are not yet available to download for the final VS 2008 release.  These are the Silverlight 1.1 Tools Alpha for Visual Studio and the Web Deployment Project add-in for Visual Studio.  Our hope is to post updates to both of them to work with the final VS 2008 release in the next two weeks.  If you are doing Silverlight 1.1 development using VS 2008 Beta2 you'll want to stick with with VS 2008 Beta2 until this updated Silverlight Tools Add-In is available. 

          posted @ 2007-12-02 02:24 崛起的程序員 閱讀(857) | 評(píng)論 (0)編輯 收藏

          PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

          在開始>設(shè)置>控制面版>添加或刪除程序>卸載vs.net2008>出現(xiàn)卸載界面>點(diǎn)擊Next>輸入上面CD-key ->出現(xiàn)Success畫面。。激動(dòng)ING

          本人使用的是VS2008 RTM版..


          Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.iso  [3.83 Gb]
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Suite-ZWTiSO.nfo  [5.8 Kb]
          [ Add all 2 links to your ed2k client ]

          Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO
          ed2k: Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO.iso  [3.31 Gb]
          ed2k: Microsoft.Visual.Studio.2008.Professional.Edition-ZWTiSO.nfo  [5.5 Kb]
          [ Add all 2 links to your ed2k client ]

          Microsoft.Visual.Studio.Team.System.2008.Development.Edition
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Development.Edition-ZWTiSO.iso  [3.81 Gb]
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Development.Edition-ZWTiSO.nfo  [5.5 Kb]
          [ Add all 2 links to your ed2k client ]

          Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO.iso  [1.29 Gb]
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Team.Foundation.Server.Workgroup.Edition-ZWTiSO.nfo  [5.7 Kb]
          [ Add all 2 links to your ed2k client ]

          Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWT
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWTiSO.iso  [551.01 Mb]
          ed2k: Microsoft.Visual.Studio.Team.System.2008.Test.Load.Agent-ZWTiSO.nfo  [5.7 Kb]
          [ Add all 2 links to your ed2k client ]

          posted @ 2007-12-02 02:21 崛起的程序員 閱讀(20634) | 評(píng)論 (30)編輯 收藏

          注冊(cè)機(jī)下載地址

          http://www.aygfsteel.com/Files/ioriqw/Altova%202008.rar
          posted @ 2007-10-30 16:23 崛起的程序員 閱讀(1007) | 評(píng)論 (1)編輯 收藏
               摘要: 在網(wǎng)上找了一圈Ajax的Java框架,感覺不錯(cuò)的只有兩個(gè),一個(gè)是被提到比較多的DWR(Direct Web Remoting),另一個(gè)是剛剛1.0的Ajax4JSF。本文先用代碼說話,各用兩個(gè)框架開發(fā)同樣功能的Ajax輸入驗(yàn)證的小程序。在最后表達(dá)一下鄙人對(duì)這兩個(gè)框架的淺見。·程序功能    頁面上有兩個(gè)輸入框,一個(gè)填用戶名,一個(gè)填密碼。兩個(gè)框空著時(shí)提示...  閱讀全文
          posted @ 2007-08-27 20:17 崛起的程序員 閱讀(573) | 評(píng)論 (0)編輯 收藏
          Go to window-preferences-java-installed jre's- edit
          and add the values
          -Xms512m -Xmx512m -Xss256k
          (or the amount of memory you want)
          eclipse starts tomcat with those values, so your memory problems should be solved
          posted @ 2007-06-10 22:26 崛起的程序員 閱讀(385) | 評(píng)論 (0)編輯 收藏
           
          有個(gè)系統(tǒng)隱藏的文件夾System Volume Information會(huì)達(dá)到1G甚至20G,這是系統(tǒng)還原的文件夾,這個(gè)目錄是WINDOWS對(duì)于大硬盤搜索方便的索引記錄文件!會(huì)在WINDOWS空閑時(shí)自動(dòng)記錄,所以這個(gè)文件夾會(huì)越來越大,然后PF使用率不斷上升,導(dǎo)致機(jī)器卡住!&W&D.C g V b j [ a
          我們可以禁用這個(gè)自動(dòng)索引功能!打開搜索功能->改變首選項(xiàng)->不使用制作索引服務(wù)->不,不要啟用制作索引服務(wù)->確定。還有一件事,就是回到剛才的地方,下面還有一個(gè)“改變制作索引服務(wù)設(shè)置(高級(jí))”,按下去,右鍵彈出的窗口中的那個(gè)索引服務(wù)->刪除,就好了!海騰數(shù)據(jù)中心服務(wù)器論壇 Y \ M z(R1{
          O

          f ?&f t j9Y&] B `
          SystemVolumeInformation\catalog.wci的文件用來存放索引文件,而且在系統(tǒng)空閑時(shí),Windows會(huì)自動(dòng)讀硬盤更新索引,安裝的文件越多,索引文件會(huì)越來越大。
                 D Y }&X
          刪除索引服務(wù):海騰數(shù)據(jù)、服務(wù)器論壇聯(lián)盟、win服務(wù)器、代理服務(wù)器,郵件服務(wù)器、代碼、程序、游戲下載、軟件、電腦技術(shù)、設(shè)計(jì)、圖片、信息發(fā)布 N i$y l z:M }
          運(yùn)行msconfig,然后選擇服務(wù)選項(xiàng),找到IndexingService,將前面的小勾去掉,再刪掉文件夾即可。
          posted @ 2007-04-11 10:36 崛起的程序員 閱讀(1438) | 評(píng)論 (0)編輯 收藏

          Introduction

          Changing proxy settings of IE is a frequent requirement of mine. Then I got the idea of writing a tool by myself, at last. I have not found clear instructions on this. Many articles recommend to modify registry directly, but unfortunately their instruction is not enough. Most of them direct me to modify the following values in registry :-

          [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
          "ProxyEnable"=dword:00000001
          "ProxyServer"=":"
          "ProxyOverride"=""
          "DisablePasswordCaching"=dword:00000001
          

          Details

          I tested it and find that it does not work at least on my computer.( I access internet by ADSL connection.) So I backed up registry and modified proxy settings via Internet Explorer, finding that [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] is also changed. So I wrote the following code snippet to change proxy settings:

          Collapse
          				void ShowError(long lerr)
          {
              LPVOID lpMsgBuf;
              if (!FormatMessage( 
                  FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                  FORMAT_MESSAGE_FROM_SYSTEM | 
                  FORMAT_MESSAGE_IGNORE_INSERTS,
                  NULL,
                  lerr,
                  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
                  (LPTSTR) &lpMsgBuf,
                  0,
                  NULL ))
              {
                  return;
              }
              MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
              LocalFree( lpMsgBuf );
          }
          void CieproxyDlg::OnBnClickedOk()
          {//set proxy server
              UpdateData();
              GetDlgItemText(IDC_EDIT1,m_sIEProxy);
              HKEY hk;
              LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
                  "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
                  NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
              if(lret==ERROR_SUCCESS&&NULL!=hk)
              {
                  TCHAR* pbuf=m_sIEProxy.GetBuffer(1);
                  lret=RegSetValueEx( hk,"ProxyServer",NULL,REG_SZ,pbuf,m_sIEProxy.GetLength());
                  DWORD dwenable=1;
                  lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
                     (LPBYTE)&dwenable,sizeof(dwenable));
                  RegCloseKey(hk);
              }
              const TCHAR* keyname3=_T(
                "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
              lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL,
                  KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
              if(lret==ERROR_SUCCESS&&NULL!=hk)
              {
                  DWORD dwtype;
                  char pbuf[256];
                  DWORD dwlen=sizeof(pbuf);
                  constchar* valname="Connection to adsl3";
                  lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
                  if(lret!=ERROR_SUCCESS)
                  {
                      ShowError(lret);
                  }
                  pbuf[8] = 3;//enable proxy
                  pbuf[4]=pbuf[4]+1;
                  constchar* p=m_sIEProxy.GetBuffer(1);
                  memcpy(pbuf+16,p,m_sIEProxy.GetLength());
                  char c=0;
                  for(int i=m_sIEProxy.GetLength();i<20;i++)
                      pbuf[16+i]=c;
                  m_sIEProxy.ReleaseBuffer();
                  lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
                  RegCloseKey(hk);
              }
              DWORD dwret;
              SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,
                  SMTO_NORMAL,1000,&dwret);
          }
          
          void CieproxyDlg::OnBnClickedDisableProxy()
          {
              UpdateData();
              GetDlgItemText(IDC_EDIT1,m_sIEProxy);
              HKEY hk;
              LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
                  "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
                  NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
              if(lret==ERROR_SUCCESS&&NULL!=hk)
              {
                  DWORD dwenable=0;
                  lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
                      (LPBYTE)&dwenable,sizeof(dwenable));
                  RegCloseKey(hk);
              }
              const TCHAR* keyname3=_T(
                "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
              lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,
                  NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
              if(lret==ERROR_SUCCESS&&NULL!=hk)
              {
                  DWORD dwtype;
                  char pbuf[256];
                  DWORD dwlen=sizeof(pbuf);
                  constchar* valname="Connection to adsl3";
                  lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
                  if(lret!=ERROR_SUCCESS)
                  {
                      ShowError(lret);
                  }
                  pbuf[8] = 1;//enable proxy
                  pbuf[4]=pbuf[4]+1;
                  lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
                  RegCloseKey(hk);
              }
              DWORD dwret;
              SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL,
                  1000,&dwret);
          }

          Problem with above code is that existing Internet Explorer instances don't know the change of settings. What is more, changing registry directly is not an elegant method. Then the following must be more attractive :

          Collapse
          BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
          {
              //conn_name: active connection name. //proxy_full_addr : eg "210.78.22.87:8000"
              INTERNET_PER_CONN_OPTION_LIST list;
              BOOL    bReturn;
              DWORD   dwBufSize = sizeof(list);
              // Fill out list struct.
              list.dwSize = sizeof(list);
              // NULL == LAN, otherwise connectoid name.
              list.pszConnection = conn_name;
              // Set three options.
              list.dwOptionCount = 3;
              list.pOptions = new INTERNET_PER_CONN_OPTION[3];
              // Make sure the memory was allocated.if(NULL == list.pOptions)
              {
                  // Return FALSE if the memory wasn't allocated.
                  OutputDebugString("failed to allocat memory in SetConnectionOptions()");
                  return FALSE;
              }
              // Set flags.
              list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
              list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
                  PROXY_TYPE_PROXY;
          
              // Set proxy name.
              list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
              list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";// Set proxy override.
              list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
              list.pOptions[2].Value.pszValue = "local";
          
              // Set the options on the connection.
              bReturn = InternetSetOption(NULL,
                  INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
          
              // Free the allocated memory.delete [] list.pOptions;
              InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
              InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
              return bReturn;
          }
          BOOL DisableConnectionProxy(LPCTSTR conn_name)
          {
              //conn_name: active connection name. 
              INTERNET_PER_CONN_OPTION_LIST list;
              BOOL    bReturn;
              DWORD   dwBufSize = sizeof(list);
              // Fill out list struct.
              list.dwSize = sizeof(list);
              // NULL == LAN, otherwise connectoid name.
              list.pszConnection = conn_name;
              // Set three options.
              list.dwOptionCount = 1;
              list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
              // Make sure the memory was allocated.if(NULL == list.pOptions)
              {
                  // Return FALSE if the memory wasn't allocated.
                  OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
                  return FALSE;
              }
              // Set flags.
              list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
              list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT  ;
              // Set the options on the connection.
              bReturn = InternetSetOption(NULL,
                  INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
              // Free the allocated memory.delete [] list.pOptions;
              InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
              InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
              return bReturn;
          }

          The usage is very straightforward:

          				//set proxy
          				const
          				char* connection_name="Connection to adsl3";
              SetConnectionOptions(connection_name,"62.81.236.23:80");
          //disable proxy 
              DisableConnectionProxy(connection_name);
              

          Existing Internet Explorer instances are notified by INTERNET_OPTION_SETTINGS_CHANGED and INTERNET_OPTION_REFRESH

          posted @ 2007-01-25 20:13 崛起的程序員 閱讀(889) | 評(píng)論 (0)編輯 收藏
          Hot Spot JVM5中的GC調(diào)優(yōu)

          Written by Halatu Hubisi


          引言
          有JAVA開發(fā)經(jīng)驗(yàn)的朋友們一定碰到過下面的這種情況,那就是自己所開發(fā)的應(yīng)用運(yùn)行了一段時(shí)間后其性能或者響應(yīng)速度會(huì)有明顯的降低.這是由多方面的原因造成的即有程序本身的優(yōu)化問題,也有運(yùn)行環(huán)境問題.此運(yùn)行環(huán)境即包括硬件環(huán)境也包括軟件環(huán)境.大多數(shù)人第一個(gè)能想到的解決方法是提升硬件的配置而忽略了程序本身的運(yùn)行環(huán)境JVM也提供了比較多的調(diào)優(yōu)選項(xiàng).本文將重點(diǎn)描述利用JVM的一些選項(xiàng)對(duì)GC進(jìn)行調(diào)優(yōu).

          約定:
          1.讀者應(yīng)具備一定JAVA的知識(shí).

          2.本文中的JVM選項(xiàng)均以SUN公司發(fā)布的HotSpot JVM 5為準(zhǔn)(不過大多數(shù)的選項(xiàng)在JVM1.3,JVM1.4中也是可用的).

          3.以JAVA_HOME下demo/jfc/SwingSet2/SwingSet2.jar為例進(jìn)行說明.

          4.閱讀本文需要一些關(guān)于GC的知識(shí),可以到附錄A中了解這些知識(shí)。

          關(guān)鍵字:
          JVM(java虛擬機(jī)),調(diào)優(yōu),GC(垃圾回收)

          JVM GC調(diào)優(yōu)
          為了能夠?qū)VM GC的調(diào)優(yōu)能夠使用在具體的實(shí)踐當(dāng)中,下面將利用若干個(gè)例子來說明GC的調(diào)優(yōu).
          例1:Heap size 設(shè)置
          JVM堆的設(shè)置是指java程序運(yùn)行過程中JVM可以調(diào)配使用的內(nèi)存空間的設(shè)置.JVM在啟動(dòng)的時(shí)候會(huì)自動(dòng)設(shè)置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項(xiàng)可進(jìn)行設(shè)置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
          當(dāng)在JAVA_HOME下demo/jfc/SwingSet2/目錄下執(zhí)行下面的命令。
          java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar
          系統(tǒng)輸出為:
          Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
          Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
          Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space
          Exception in thread "Image Fetcher 2" java.lang.OutOfMemoryError: Java heap space
          除了這些異常信息外,還會(huì)發(fā)現(xiàn)程序的響應(yīng)速度變慢了。這說明Heap size 設(shè)置偏小,GC占用了更多的時(shí)間,而應(yīng)用分配到的執(zhí)行時(shí)間較少。
          提示:在JVM中如果98%的時(shí)間是用于GC且可用的Heap size 不足2%的時(shí)候?qū)伋龃水惓P畔ⅰ?/span>
          將上面的命令換成以下命令執(zhí)行則應(yīng)用能夠正常使用,且未拋出任何異常。
          java -jar -Xmn4m -Xms16m -Xmx32m SwingSet2.jar
          提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項(xiàng)設(shè)置為相同,而-Xmn為1/4的-Xmx值。

          例2:Young Generation(-Xmn)的設(shè)置
          在本例中看一下Young Generation的設(shè)置不同將有什么現(xiàn)象發(fā)生。
          假設(shè)將Young generation 的大小設(shè)置為4M ,即執(zhí)行java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)
          [GC [DefNew: 3968K->64K(4032K), 0.0923407 secs] 3968K->2025K(32704K), 0.0931870 secs]
          [GC [DefNew: 4021K->64K(4032K), 0.0356847 secs] 5983K->2347K(32704K), 0.0365441 secs]
          [GC [DefNew: 3995K->39K(4032K), 0.0090603 secs] 6279K->2372K(32704K), 0.0093377 secs]
          [GC [DefNew: 3992K->23K(4032K), 0.0057540 secs] 6325K->2356K(32704K), 0.0060290 secs]
          [GC [DefNew: 3984K->27K(4032K), 0.0013058 secs] 6317K->2360K(32704K), 0.0015888 secs]
          [GC [DefNew: 3981K->59K(4032K), 0.0023307 secs] 6315K->2422K(32704K), 0.0026091 secs]
          將程序體制并將Young Generation的大小設(shè)置為8M,即執(zhí)行java -jar -verbose:gc -Xmn8m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar,屏幕輸出如下(節(jié)選)
          [GC [DefNew: 7808K->192K(8000K), 0.1016784 secs] 7808K->2357K(32576K), 0.1022834 secs]
          [GC [DefNew: 8000K->70K(8000K), 0.0149659 secs] 10165K->2413K(32576K), 0.0152557 secs]
          [GC [DefNew: 7853K->59K(8000K), 0.0069122 secs] 10196K->2403K(32576K), 0.0071843 secs]
          [GC [DefNew: 7867K->171K(8000K), 0.0075745 secs] 10211K->2681K(32576K), 0.0078376 secs]
          [GC [DefNew: 7970K->192K(8000K), 0.0201353 secs] 10480K->2923K(32576K), 0.0206867 secs]
          [GC [DefNew: 7979K->30K(8000K), 0.1787079 secs] 10735K->4824K(32576K), 0.1790065 secs]
          那么根據(jù)GC輸出的信息(這里取第一行)做一下Minor收集的比較。可以看出兩次的Minor收集分別在Young generation中找回3904K(3968K->64K)和7616K(7808K->192K)而對(duì)于整個(gè)jvm則找回1943K(3968K->2025)和5451K(7808K->2357K)。第一種情況下Minor收集了大約50%(1943/3904)的對(duì)象,而另外的50%的對(duì)象則被移到了tenured generation。在第二中情況下Minor收集了大約72%的對(duì)象,只有不到30%的對(duì)象被移到了Tenured Generation.這個(gè)例子說明此應(yīng)用在的Young generation 設(shè)置為4m時(shí)顯的偏小。
          提示:一般的Young Generation的大小是整個(gè)Heap size的1/4。Young generation的minor收集率應(yīng)一般在70%以上。當(dāng)然在實(shí)際的應(yīng)用中需要根據(jù)具體情況進(jìn)行調(diào)整。

          例3:Young Generation對(duì)應(yīng)用響應(yīng)的影響
          還是使用-Xmn4m 和-Xmn8m進(jìn)行比較,先執(zhí)行下面的命令

          java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime SwingSet2.jar
          屏幕輸出如下(節(jié)選)
          Application time: 0.5114944 seconds
          [GC [DefNew: 3968K->64K(4032K), 0.0823952 secs] 3968K->2023K(32704K), 0.0827626 secs]
          Total time for which application threads were stopped: 0.0839428 seconds
          Application time: 0.9871271 seconds
          [GC [DefNew: 4020K->64K(4032K), 0.0412448 secs] 5979K->2374K(32704K), 0.0415248 secs]
          Total time for which application threads were stopped: 0.0464380 seconds
          Young Generation 的Minor收集占用的時(shí)間可以計(jì)算如下:應(yīng)用線程被中斷的總時(shí)常/(應(yīng)用執(zhí)行總時(shí)?L+應(yīng)用線程被中斷的總時(shí)常),那么在本例中垃圾收集占用的時(shí)?L約為系統(tǒng)的5%~14%。那么當(dāng)垃圾收集占用的時(shí)間的比例越大的時(shí)候,系統(tǒng)的響應(yīng)將越慢。
          提示:對(duì)于互聯(lián)網(wǎng)應(yīng)用系統(tǒng)的響應(yīng)稍微慢一些,用戶是可以接受的,但是對(duì)于GUI類型的應(yīng)用響應(yīng)速度慢將會(huì)給用戶帶來非常不好的體驗(yàn)。

          例4:如何決定Tenured Generation 的大小
          分別以-Xmn8m -Xmx32m和-Xmn8m -Xmx64m進(jìn)行對(duì)比,先執(zhí)行
          java -verbose:gc -Xmn8m -Xmx32m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)

          111.042: [GC 111.042: [DefNew: 8128K->8128K(8128K), 0.0000505 secs]111.042: [Tenured: 18154K->2311K(24576K), 0.1290354 secs] 26282K->2311K(32704K), 0.1293306 secs]
          122.463: [GC 122.463: [DefNew: 8128K->8128K(8128K), 0.0000560 secs]122.463: [Tenured: 18630K->2366K(24576K), 0.1322560 secs] 26758K->2366K(32704K), 0.1325284 secs]
          133.896: [GC 133.897: [DefNew: 8128K->8128K(8128K), 0.0000443 secs]133.897: [Tenured: 18240K->2573K(24576K), 0.1340199 secs] 26368K->2573K(32704K), 0.1343218 secs]
          144.112: [GC 144.112: [DefNew: 8128K->8128K(8128K), 0.0000544 secs]144.112: [Tenured: 16564K->2304K(24576K), 0.1246831 secs] 24692K->2304K(32704K), 0.1249602 secs]
          再執(zhí)行java -verbose:gc -Xmn8m -Xmx64m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java類,命令行將提示(只提取了Major收集)
          90.597: [GC 90.597: [DefNew: 8128K->8128K(8128K), 0.0000542 secs]90.597: [Tenured: 49841K->5141K(57344K), 0.2129882 secs] 57969K->5141K(65472K), 0.2133274 secs]
          120.899: [GC 120.899: [DefNew: 8128K->8128K(8128K), 0.0000550 secs]120.899: [Tenured: 50384K->2430K(57344K), 0.2216590 secs] 58512K->2430K(65472K), 0.2219384 secs]
          153.968: [GC 153.968: [DefNew: 8128K->8128K(8128K), 0.0000511 secs]153.968: [Tenured: 51164K->2309K(57344K), 0.2193906 secs] 59292K->2309K(65472K), 0.2196372 secs]
          可以看出在Heap size 為32m的時(shí)候系統(tǒng)等候時(shí)間約為0.13秒左右,而設(shè)置為64m的時(shí)候等候時(shí)間則增大到0.22秒左右了。但是在32m的時(shí)候系統(tǒng)的Major收集間隔為10秒左右,而Heap size 增加到64m的時(shí)候?yàn)?0秒。那么應(yīng)用在運(yùn)行的時(shí)候是選擇32m還是64m呢?如果應(yīng)用是web類型(即要求有大的吞吐量)的應(yīng)用則使用64m(即heapsize大一些)的比較好。對(duì)于要求實(shí)時(shí)響應(yīng)要求較高的場合(例如GUI型的應(yīng)用)則使用32m比較好一些。
          注意:
          1。因?yàn)樵贘VM5運(yùn)行時(shí)已經(jīng)對(duì)Heap-size進(jìn)行了優(yōu)化,所以在能確定java應(yīng)用運(yùn)行時(shí)不會(huì)超過默認(rèn)的Heap size的情況下建議不要對(duì)這些值進(jìn)行修改。
          2。Heap size的 -Xms -Xmn 設(shè)置不要超出物理內(nèi)存的大小。否則會(huì)提示“Error occurred during initialization of VM Could not reserve enough space for object heap”。

          例5:如何縮短minor收集的時(shí)間
          下面比較一下采用-XX:+UseParNewGC選項(xiàng)和不采用它的時(shí)候的minor收集將有什么不同。先執(zhí)行
          java -jar -server -verbose:gc -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
          系統(tǒng)將輸出如下信息(片段〕
          [GC 7807K->2641K(32576K), 0.0676654 secs]
          [GC 10436K->3108K(32576K), 0.0245328 secs]
          [GC 10913K->3176K(32576K), 0.0072865 secs]
          [GC 10905K->4097K(32576K), 0.0223928 secs]
          之后再執(zhí)行 java -jar -server -verbose:gc -XX:+UseParNewGC -Xmn8m -Xms32m -Xmx32m SwingSet2.jar
          系統(tǒng)將輸出如下信息(片段〕
          [ParNew 7808K->2656K(32576K), 0.0447687 secs]
          [ParNew 10441K->3143K(32576K), 0.0179422 secs]
          [ParNew 10951K->3177K(32576K), 0.0031914 secs]
          [ParNew 10985K->3867K(32576K), 0.0154991 secs]
          很顯然使用了-XX:+UseParNewGC選項(xiàng)的minor收集的時(shí)間要比不使用的時(shí)候優(yōu)。

          例6:如何縮短major收集的時(shí)間
          下面比較一下采用-XX:+UseConcMarkSweepGC選項(xiàng)和不采用它的時(shí)候的major收集將有什么不同。先執(zhí)行
          java -jar -verbose:gc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
          系統(tǒng)將輸出如下信息(片段〕
          [Full GC 22972K->18690K(262080K), 0.2326676 secs]
          [Full GC 18690K->18690K(262080K), 0.1701866 secs
          之后再執(zhí)行 java -jar -verbose:gc -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar
          系統(tǒng)將輸出如下信息(片段〕
          [Full GC 56048K->18869K(260224K), 0.3104852 secs]
          提示:此選項(xiàng)在Heap Size 比較大而且Major收集時(shí)間較長的情況下使用更合適。

          例7:關(guān)于-server選項(xiàng) 在JVM中將運(yùn)行中的類認(rèn)定為server-class的時(shí)候使用此選項(xiàng)。SUN 的Hot Spot JVM5 如果判斷到系統(tǒng)的配置滿足如下條件則自動(dòng)將運(yùn)行的類認(rèn)定為server-class,并且會(huì)自動(dòng)設(shè)置jvm的選項(xiàng)(當(dāng)沒有手工設(shè)置這選項(xiàng)的時(shí)候〕而且HOTSPOT JVM5提供了自動(dòng)調(diào)優(yōu)的功能,他會(huì)根據(jù)JVM的運(yùn)行情況進(jìn)行調(diào)整。如果沒有特別的需要是不需要太多的人工干預(yù)的。SUN形象的稱這個(gè)機(jī)制為“人體工學(xué)”(Ergonomics〕。具體可以參考http://java.sun.com/docs/hotspot/gc5.0/ergo5.html
          *.具有2個(gè)或更多個(gè)物理的處理器
          *.具有2G或者更多的物理內(nèi)存
          提示:此選項(xiàng)要放在所有選項(xiàng)的前面。例如:java -server 其他選項(xiàng) java類

          附錄A:預(yù)備知識(shí)
          JVM中對(duì)象的劃分及管理

          JVM根據(jù)運(yùn)行于其中的對(duì)象的生存時(shí)間大致的分為3種。并且將這3種不同的對(duì)象分別存放在JVM從系統(tǒng)分配到的不同的內(nèi)存空間。這種對(duì)象存放空間的管理方式叫做Generation管理方式。
          1。Young Generation:用于存放“早逝”對(duì)象(即瞬時(shí)對(duì)象)。例如:在創(chuàng)建對(duì)象時(shí)或者調(diào)用方法時(shí)使用的臨時(shí)對(duì)象或局部變量。
          2。Tenured Generation:用于存放“駐留”對(duì)象(即較長時(shí)間被引用的對(duì)象)。往往體現(xiàn)為一個(gè)大型程序中的全局對(duì)象或長時(shí)間被使用的對(duì)象。
          3。Perm Generation:用于存放“永久”對(duì)象。這些對(duì)象管理著運(yùn)行于JVM中的類和方法。

          JVM選項(xiàng)的分類

          JVM有這么幾種選項(xiàng)供使用.
          1.供-X選項(xiàng)使用的項(xiàng)目,又稱為非標(biāo)準(zhǔn)選項(xiàng),不同廠商的此類型選項(xiàng)是有所不同的。例如:IBM的JVM用的一些選項(xiàng)在Sun的JVM中就不一定能生效。這種選項(xiàng)的使用方式如下:
          java -Xmn16m -Xms64m -Xmx64m java類名
          2.供-XX選項(xiàng)使用的項(xiàng)目,這種類型的選項(xiàng)可能要求有對(duì)系統(tǒng)信息訪問的權(quán)限。所以要慎用。這種選項(xiàng)的使用方式如下:
          java -XX:MaxHeapFreeRatio=70 -XX:+PrintGCDetails java類名
          3.java選項(xiàng)(即在命令行執(zhí)行java后提示的選項(xiàng)).
          java -server -verbose:gc -d64 java類名

          垃圾收集分類

          在JVM中有兩種垃圾方式,一種叫做Minor(次收集),另一種叫做Major(主收集)。其中Minor在Young Generation的空間被對(duì)象全部占用后執(zhí)行,主要是對(duì)Young Generation中的對(duì)象進(jìn)行垃圾收集。而Major是針對(duì)于整個(gè)Heap size的垃圾收集。其中Minor方式的收集經(jīng)常發(fā)生,并且Minor收集所占用的系統(tǒng)時(shí)間小。Major方式的垃圾收集則是一種“昂貴”的垃圾收集方式,因?yàn)樵贛ajor要對(duì)整個(gè)Heap size進(jìn)行垃圾收集,這會(huì)使得應(yīng)用停頓的時(shí)間變得較長。

          GC信息的格式

          [GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
          <collector> GC為minor收集過程中使用的垃圾收集器起的內(nèi)部名稱.
          <starting occupancy1> young generation 在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間.
          <ending occupancy1> young generation 在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
          <pause time1> minor收集使應(yīng)用暫停的時(shí)間長短(秒)
          <starting occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集前被對(duì)象使用的存儲(chǔ)空間
          <ending occupancy3> 整個(gè)堆(Heap Size)在進(jìn)行垃圾收集后被對(duì)象使用的存儲(chǔ)空間
          <pause time3> 整個(gè)垃圾收集使應(yīng)用暫停的時(shí)間長短(秒),包括major收集使應(yīng)用暫停的時(shí)間(如果發(fā)生了major收集).
          GC信息的選項(xiàng)
          -XX:+PrintGCDetails 顯示GC的詳細(xì)信息
          -XX:+PrintGCApplicationConcurrentTime 打印應(yīng)用執(zhí)行的時(shí)間
          -XX:+PrintGCApplicationStoppedTime 打印應(yīng)用被暫停的時(shí)間
          提示:1.":"后的"+"號(hào)表示開啟此選項(xiàng),如果是"-"號(hào)那么表示關(guān)閉此選項(xiàng)。
          ?????2.在不同的選項(xiàng)和不同的收集方式和類型下輸出的格式會(huì)有所不同。

          附錄B:HotSpot JVM 選項(xiàng)
          請(qǐng)參考JavaTM HotSpot VM Options

          附錄C:其他資源
          http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
          http://java.sun.com/docs/hotspot/gc5.0/ergo5.html

          posted @ 2006-11-28 19:23 崛起的程序員 閱讀(442) | 評(píng)論 (0)編輯 收藏
          清晨的時(shí)候,
          在近春園曲折的小路上走,
          看見一個(gè)老人坐在湖邊悠閑地垂釣
          依稀聽見濕漉漉的笛聲
          婉約進(jìn)樹林深處,
          老人專注的神情似乎能
          漾起水中的波影,
          然后目光被長長的眉須剪斷,
          撲閃在晨霧中捕捉著空氣.
          這是怎樣一種美妙啊!
          我在他身邊坐下,靜靜等待
          魚兒的到來.半個(gè)小時(shí)過去了,
          我的心情開始煩躁,
          可老人的微笑一如既往.
          "你們二十幾歲的年輕人啊,
          心就像一個(gè)玻璃杯,
          透明,盛滿了陽光."
          老人說話跟垂釣一樣,安詳.
          和仙風(fēng)道骨的老人話別后,
          我決定從粉綠的湖邊繼續(xù)往前走,
          去探尋校園極致的景色,
          享受年輕的心情,
          呵呵,像玻璃杯……???????????????????????????????????
          posted @ 2006-11-19 19:57 崛起的程序員 閱讀(297) | 評(píng)論 (0)編輯 收藏
          String strs = request.getParameter("yourstrs");
          byte b[] = strs.getBytes("ISO-8859-1");
          strs = new String(b);








          簡潔寫法:


          String convert = new String(request.getParmater("inputname").trim().getBytes("ISO8859_1"), "GBK");
          posted @ 2006-11-10 09:53 崛起的程序員 閱讀(241) | 評(píng)論 (0)編輯 收藏
          關(guān)于tomcat4.0配置digest認(rèn)證注意事項(xiàng):
          MemoryRealm作為事例
          在server.xml中需要配置 紅色字體為注意事項(xiàng)
          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
          ???????????????? debug="0" resourceName="UserDatabase" digest="MD5"/>

          密碼轉(zhuǎn)換成密文的加密格式為:
          {username}:{realm}:{cleartext-password}.

          到bin/目錄下找到digest.bat?文件執(zhí)行如下命令得到密文
          digest -a md5 admin:realm:admin

          其中admin分別用戶和密碼,realm為所配置域名
          admin:realm:admin:ae7cdd2406201487bcce77064b5fe10c

          紅色部分為加密后的密碼。

          完:
          作者: Liming

          posted @ 2006-11-09 04:30 崛起的程序員 閱讀(2011) | 評(píng)論 (0)編輯 收藏
          這是一篇很有趣的文檔,所以摘要一下,其實(shí)類似閱讀筆記,好像是3/25發(fā)布的:
          不知怎么翻譯Sweet Spots,難道翻譯為甜處、甜頭、蜜點(diǎn)、蜜穴?

          本文基于對(duì)以下人的采訪(最后兩位的看法獨(dú)到還是自己看吧!):
          JSF???????????? Jacob Hookom
          RIFE????????????Geert Bevin
          Seam????????????Gavin King
          Spring MVC??????Rob Harrop
          Spring Web Flow Rob Harrop and Keith Donald
          Stripes???????? Tim Fennell
          Struts Action 1 Don Brown
          Tapestry????????Howard Lewis Ship
          Trails??????????Chris Nelson
          WebWork???????? Patrick Lightbody
          Wicket??????????Eelco Hillenius


          JSF(Jacob Hookom)

          1、你認(rèn)為你的framework的"甜點(diǎn)"在哪里?他最適合哪種類型的項(xiàng)目?
          當(dāng)你希望瀏覽器程序像桌面程序一樣工作的時(shí)候,你可以遵循標(biāo)準(zhǔn)并獲得大量第三方支持。它致力于降低復(fù)雜度。它允許你不與view和特定的action、參數(shù)傳遞、狀態(tài)傳遞、渲染打交道就可以進(jìn)行高質(zhì)量的開發(fā),不管是否使用工具。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          它不適合大規(guī)模的、只讀(其實(shí)指讀為主)的網(wǎng)站。在這種情況推薦Struts,因?yàn)橹R(shí)庫豐富(應(yīng)該指文檔和用戶群)。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          Seam:
          優(yōu)點(diǎn):非常簡單直接
          缺點(diǎn):對(duì)于大項(xiàng)目過于簡單;沒有模塊化開發(fā)的好例子
          Struts:
          優(yōu)點(diǎn):巨大的文檔和用戶群;跟著它沒錯(cuò)
          缺點(diǎn):狀態(tài)/行為的分離過于教條化
          WebWork:
          優(yōu)點(diǎn):比Struts易于使用
          缺點(diǎn):復(fù)雜的UI難于維護(hù),UI代碼過于復(fù)雜(JSF作者對(duì)action
          Framework都攻擊這一點(diǎn))
          Tapestry:
          優(yōu)點(diǎn):概念新穎;可以應(yīng)付復(fù)雜的UI
          缺點(diǎn):對(duì)于一個(gè)組件化(JSF主要競爭對(duì)手),它依然依附于page/action的概念

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          他認(rèn)為JSF這個(gè)標(biāo)準(zhǔn)下這些應(yīng)該有第三方提供。JSF(2.0)會(huì)提供"Partial Faces Request",它是Ajax實(shí)現(xiàn)。JSF也會(huì)增強(qiáng)annotation組建編程。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?很多JSF書都拿Struts作為對(duì)比。他認(rèn)為這不能體現(xiàn)JSF的特點(diǎn)。他認(rèn)為Struts和WebWork能做到的JSF也能做到。

          6、你對(duì)Ruby on Rails的看法如何?
          它與WebWork一樣好用,它的CoC(Convention over Configration)和腳手架非常好用。他認(rèn)為CoC可以被應(yīng)用在任何framework,他認(rèn)為這是RoR最大的優(yōu)點(diǎn)。他還認(rèn)為RoR會(huì)走上其它framework的路(復(fù)雜性),因?yàn)槿藗冃枰约旱臄U(kuò)展。

          RIFE(Geert Bevin)

          1、你認(rèn)為你的framework的"甜點(diǎn)"在哪里?他最適合哪種類型的項(xiàng)目?
          你可以付出10%的工作量,得到其它framework的90%的......,它是一個(gè)full-stack framework(如RoR)。它吸收了成熟的分層框架的架構(gòu),并將共同的優(yōu)點(diǎn)匯集在一起。提供了web continuation,POJO驅(qū)動(dòng)的CRUD生成,可擴(kuò)展的基于組建的架構(gòu),無session的狀態(tài)控制,關(guān)注REST作為API,雙向無邏輯模版引擎,集成了內(nèi)容控制框架(CMS?)。每個(gè)層次的組建提供了可復(fù)用性(AOP,site,sub-site,page,widget,portlet等)。適合于團(tuán)隊(duì)快速開發(fā)公共Web項(xiàng)目,適合喜歡開發(fā)可復(fù)用組件的人。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          團(tuán)隊(duì)中的每個(gè)人都有其它framework的知識(shí),難于培訓(xùn)他們。開發(fā)狀態(tài)相關(guān)的服務(wù)器端Web組件,而不是用RIA或Ajax去實(shí)現(xiàn)。第三方支持很重要的情況下(可憐RIFE用戶群還不大)。他推薦這種情況下使用JSF。或者在XML為主要發(fā)布形式的情況下,推薦Cocoon。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          他試驗(yàn)過WebWork,JSF,Wicket。他喜歡WebWork的簡單,但是不喜歡它的模版方式(tag的template,應(yīng)該),它也不提供組件封裝。他認(rèn)為JSF的工具支持非常吸引人。Wicket的純Java實(shí)現(xiàn)很不錯(cuò),可惜XML配置很不爽。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          關(guān)于Ajax,RIFE剛剛集成了DWR,而且選定以后也使用這個(gè)。集成Dojo,Scriptaculous,Prototype都很容易集成進(jìn)來。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?這些錯(cuò)誤理念:
          ??1)、RIFE的XML配置繁瑣
          ??2)、RIFE是continuations server
          ??3)、RIFE重新造輪子沒有提供新鮮東西
          ??4)、RIFE的模版語法很蹩腳過于簡單和業(yè)余
          ??5)、RIFE是基于request的framework
          ??6)、RIFE的功能太多,學(xué)習(xí)曲線陡峭

          6、你對(duì)Ruby on Rails的看法如何?
          RoR對(duì)Java社區(qū)的沖擊非常棒,元編成也得到了信任。RoR沒什么特殊之處,也沒有從Ruby語言獲益很多。
          我討厭:它的模版。Partials(RoR中的組件)。URL的分散處理。Active Record提供了從數(shù)據(jù)庫schema而來的DSL,但是卻不是從domain model而來。沒有l(wèi)10n和i18n支持。手動(dòng)狀態(tài)轉(zhuǎn)換。不能在JVM運(yùn)行(......)。實(shí)際上腳手架生成了實(shí)際代碼。Ruby缺少工具和IDE。

          Seam(Gavin King)

          1、你認(rèn)為你的framework的"甜點(diǎn)"在哪里?他最適合哪種類型的項(xiàng)目?
          擁有豐富用戶交互體驗(yàn)的應(yīng)用。方便實(shí)現(xiàn)多窗口的操作,回退的支持,單窗口多工作區(qū),無狀態(tài)瀏覽。對(duì)商務(wù)流程(BPM)的集成是獨(dú)一無二的。Seam方便使用數(shù)據(jù)驅(qū)動(dòng)的ORM。遵循JSF和EJB3,多任務(wù)支持(多窗口/多工作區(qū)),BPM的領(lǐng)先解決方案。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          不適合只是將數(shù)據(jù)從數(shù)據(jù)庫顯示到網(wǎng)頁的應(yīng)用,這時(shí)應(yīng)該使用PHP或RoR。不適合需要設(shè)計(jì)特別的HTML組件的情況,此時(shí)應(yīng)該選用Tapestry或Wicket。還在使用JDK1.4的人們。還有那些喜歡Struts的人(嘿嘿,夠狠)。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          JSF:喜歡他的事件/交互模型。喜歡他的EL和模型綁定。不喜歡那么多XML(為什么沒有annotation)。創(chuàng)建自己的controls太難了。
          Tapestry:非常好。form驗(yàn)證是它的殺手锏!模版方式很有創(chuàng)意。不過非基于POJO的組件模型則讓我對(duì)它失去興趣。
          RIFE:這個(gè)東西很怪,但是有創(chuàng)業(yè)也有趣。我想進(jìn)一步學(xué)習(xí)。如果學(xué)習(xí)先要自費(fèi)武功:D
          Struts:這個(gè)東西的模型view綁定太復(fù)雜了。東西已經(jīng)過時(shí)了。
          WebWork:比Struts好一點(diǎn),不過也過時(shí)了。XWork曾經(jīng)是個(gè)很好的實(shí)現(xiàn),不過現(xiàn)在也過時(shí)了。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          Portal支持。遠(yuǎn)程框架Seam Remoting Framework(Ajax)。模版消息的工具支持。以后還要集成ESB,計(jì)劃引擎和異步支持。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          這些都不是真的:JSF不能處理GET requests。JSF post后無法redirect。JSF不能與REST共存。

          6、你對(duì)Ruby on Rails的看法如何?
          它是PHP的很好替代品。如果它有一個(gè)正經(jīng)一點(diǎn)的持久化層它就可以和Java競爭了。

          Spring MVC(Rob Harrop)和Spring Web Flow(Rob Harrop and Keith Donald)

          1、你認(rèn)為你的framework的"甜點(diǎn)"在哪里?他最適合哪種類型的項(xiàng)目?
          Spring MVC:
          穩(wěn)定可擴(kuò)展,支持了i18n、文件上傳、異常處理,這些穩(wěn)定的支持給開發(fā)者堅(jiān)實(shí)的工作基礎(chǔ)。是最佳實(shí)踐,告訴你怎么做是最好的。與Spring集成,領(lǐng)先的IoC遠(yuǎn)生支持。支持,Spring社區(qū)活躍和龐大。Struts開發(fā)者可以平滑過渡。適合多種項(xiàng)目,可選的多種result類型。
          Spring Web Flow:內(nèi)置任務(wù)處理引擎,支持線性處理過程中的持續(xù)狀態(tài)。抽象,減少開發(fā)的關(guān)注點(diǎn)。適合多種項(xiàng)目類型,插件支持Spring MVC、Struts、JSF等。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          Spring MVC:不適合需要組件化開發(fā)的場景。它是一個(gè)request驅(qū)動(dòng)的MVC。那些場景推薦JSF或Tapestry。
          Spring Web Flow:處理線性頁面流,不適合一般的"自由瀏覽"。當(dāng)然Spring Web Flow可以與request驅(qū)動(dòng)或者組件驅(qū)動(dòng)共存。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          Spring框架支持Struts和JSF集成。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          Spring MVC:簡化JSP標(biāo)簽。更多的MVC配置schema。CoC風(fēng)格的默認(rèn)控制器、URL影射、view,學(xué)習(xí)Rails和Stripes的優(yōu)點(diǎn)。增強(qiáng)數(shù)據(jù)綁定和驗(yàn)證(支持范型綁定)。Portlet支持。Spring也要接受Ajax,使用DWR庫。
          Spring Web Flow:一大堆,關(guān)心的可以自己看......

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          Spring MVC難于配置。在Spring 2.0,將會(huì)改善,可以使用自己定義的基于schema的配置。

          6、你對(duì)Ruby on Rails的看法如何?
          Spring MVC:RoR非常有趣。不過現(xiàn)在就拿出來用還有點(diǎn)幼稚。這里舉了個(gè)例子,關(guān)于變量的復(fù)數(shù)形式的處理,RoR會(huì)使用這樣的CoC風(fēng)格來處理變量list,而Spring MVC也實(shí)驗(yàn)了種種風(fēng)格,但是受到的結(jié)果卻很差。人們認(rèn)為英語的復(fù)數(shù)很古怪,沒有一定的規(guī)則,所以會(huì)帶來混亂,如(person -> people)。所以Spring ...

          Stripes(Tim Fennell)

          1、你認(rèn)為你的framework的“甜點(diǎn)”在哪里?他最適合哪種類型的項(xiàng)目?
          與Spring MVC、WebWork等相同。它提供高質(zhì)量action驅(qū)動(dòng)的框架的同時(shí),盡量簡化配置,增進(jìn)開發(fā)效率。Stripes適合復(fù)雜的數(shù)據(jù)交互的場合。這種情況下綁定驗(yàn)證的強(qiáng)項(xiàng)就完全體現(xiàn)出來了,能夠很好的處理form和map轉(zhuǎn)換等。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          所有的action驅(qū)動(dòng)的framework都適合用戶在非Ajax驅(qū)動(dòng)的情況下在一個(gè)頁面進(jìn)行松關(guān)聯(lián)(loosely
          related)和無狀態(tài)交互的情況。適合每次都刷新的頁面。管理多窗口間持續(xù)狀態(tài)的應(yīng)用會(huì)比較麻煩,此時(shí)應(yīng)該選擇JSF。不過我認(rèn)為90%以上的Web程序都是前者,JSF只適合剩下的那9%,AJAX對(duì)于管理無狀態(tài)UI更加適合。客戶端不需要AJAX,則可以看看Wicket,它更加簡單。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          用過Struts、WebWork、Spring MVC。其中Struts做過商業(yè)項(xiàng)目,不過這個(gè)東西帶來的麻煩遠(yuǎn)比帶來的效率提升要多。它認(rèn)為這些MVC都有三個(gè)缺點(diǎn):暴露了過多的復(fù)雜性給可發(fā)者。沒有提供足夠的開發(fā)便利性,沒有提供足夠多的錯(cuò)誤和提示信息,也沒有date格式化等小的便利(其實(shí)有)。穩(wěn)當(dāng)太差。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          1.3要加入Inteceptor,實(shí)現(xiàn)AOP功能。驗(yàn)證系統(tǒng)要加強(qiáng)。支持Ajax。我還在尋找一個(gè)好的Ajax/javascript庫。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          這些觀點(diǎn):1、Stripes使用了annotation代替XML,只是換湯不換藥:由于元數(shù)據(jù)更接近代碼,所以修改默認(rèn)的配置非常方便,不像XML那樣復(fù)雜,這是實(shí)質(zhì)的變化。2、Annotation意味著你只能有一套配置:我認(rèn)為90%的action都有自己的一套配置!Stripes會(huì)根據(jù)繼承關(guān)系尋找Annotations,子類的annotation會(huì)覆蓋父類的,因?yàn)橄駐alidation都是可以繼承的,如果特別需要還可以覆蓋。這樣很合理。在1.3中允許validations基于UI事件進(jìn)行。它向后兼容,不需要可以不用。

          6、你對(duì)Ruby on Rails的看法如何?
          我認(rèn)為Java社區(qū)有很多可以從RoR學(xué)習(xí)的地方。Stripes學(xué)習(xí)了RoR的前端部分,開發(fā)者可以減少配置量。但是RoR的RHTML讓我想到了以前的JSP中混亂的scriptlet。而后面的ActiveRecord是一個(gè)很好的理念,實(shí)現(xiàn)的也很好。ActiveRecord比Hibernate等復(fù)雜的ORM工具要容易理解,因?yàn)檫@樣的特點(diǎn)RoR才引起了這么大的波瀾。

          Struts Action 1(Don Brown)

          1、你認(rèn)為你的framework的“甜點(diǎn)”在哪里?他最適合哪種類型的項(xiàng)目?
          文檔和用戶基礎(chǔ),書籍和背后的支持。容易雇到人(也容易找工作)。雖然其他項(xiàng)目的理念比這個(gè)要先進(jìn),但是這些不算什么。實(shí)際上,Web層是很容易也很直接的。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          如果你需要portlets或者復(fù)雜的頁面(顯示很多東西),那么Struts要么無法工作要么太枯燥。這種情況你需要一個(gè)基于組件的framework,如JSF、Tapestry/Wicket。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          這些我基本都試驗(yàn)過,他們每個(gè)都工作的很不錯(cuò)。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          Struts Action2基于WebWork2,很快會(huì)開始。現(xiàn)在已經(jīng)支持Ajax了,我們?cè)趯ふ腋尤菀椎拈_發(fā)方式,JSF支持(Struts Shale),continuation支持,還有支持更多的腳本語言(BSF擴(kuò)展腳本撰寫Action)。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          Struts太過時(shí)了,而且也不酷,難于使用。但是你可以自己修改或者擴(kuò)展它。我認(rèn)為團(tuán)隊(duì)對(duì)于你的限制遠(yuǎn)大于framework對(duì)你的限制。

          6、你對(duì)Ruby on Rails的看法如何?
          不需要D&D工具,旨在幫助開發(fā)人員提高開發(fā)效率的好例子。我們?cè)贏ction2中將學(xué)習(xí)它的先進(jìn)理念。

          Tapestry(Howard Lewis Ship)

          1、你認(rèn)為你的framework的“甜點(diǎn)”在哪里?他最適合哪種類型的項(xiàng)目?
          我想Tapestry對(duì)于中等規(guī)模或者大規(guī)模的應(yīng)用會(huì)帶來很多好處(甚至你可以在單頁面的應(yīng)用程序中獲得好處)。這里有允許你創(chuàng)建新的組件的良好工具。Tapestry不關(guān)心數(shù)據(jù)從哪里來,很多“項(xiàng)目類型”都基于切面(aspect)(如CRUD vs. RSS feed vs. etc.)。我認(rèn)為Tapestry非常容易與IoC集成(HiveMind或與Spring),方便進(jìn)行測試。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          我在其它Java framework中沒有找到到強(qiáng)于Tapestry的優(yōu)點(diǎn)。但是對(duì)于RoR,我自己沒有使用過使用,很難說RoR中的項(xiàng)目應(yīng)該是什么樣子。我沒有仔細(xì)對(duì)比過RIFE,它看起來受了RoR影響,尤其是類似ActiveRecord的數(shù)據(jù)訪問層。但是如果你的應(yīng)用需要特定的URL格式,那么在Tapestry中奮戰(zhàn)勝算不大。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          在這兩年來我沒怎么嘗試過Tapestry以外的東西。我沒怎么學(xué)習(xí)RoR,因?yàn)闀r(shí)間太有限了。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          Tapestry 4.0有很好的Ajax支持,通過Tacos庫。而Tapestry4.1還要進(jìn)一步強(qiáng)化這方面的支持。
          Tapestry 5.0提供了明顯的改進(jìn):沒有abstract類(Tapestry的怪癖:)。沒有強(qiáng)迫的繼承關(guān)系。對(duì)屬性進(jìn)行annotation而不是方法。沒有XML,只有模版和annotaions。只能類裝載,自動(dòng)尋找類的變化。最小化API,超越annotaion。面向方面(Aspect-oriented)模塊構(gòu)造,使用mix-ins。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          Tapestry3.0還不容易測試,4.0改善了一些。Tapestry只是個(gè)人秀;實(shí)際上我們有很多活躍的貢獻(xiàn)者。Tapestry的學(xué)習(xí)曲線非場陡峭。它只有漂亮的模版實(shí)現(xiàn);實(shí)際上Tapestry的特點(diǎn)在于狀態(tài)管理(允許對(duì)象存儲(chǔ)狀態(tài),而不是多線程的單例來管理requests之間的游離和持久狀態(tài))

          6、你對(duì)Ruby on Rails的看法如何?
          很有影響力。但是模版的實(shí)現(xiàn)非常丑陋。我聽到了很多意見,關(guān)于RoR的優(yōu)缺點(diǎn)。基于我的基本理解,這些觀念對(duì)Tapestry4產(chǎn)生了影響(它對(duì)Tapestry 5影響更深)。
          RoR意味著限制了你的選擇:如果你選擇RoR那么就要尊旬它的實(shí)踐(CoC..),看起來你的錢會(huì)花的恨值。這些類似Microsoft的哲學(xué)。而Java更崇尚給你更寬松的選擇,不限定你使用的工具,但是曖昧的說這需要你對(duì)你的工具理解更深。不僅對(duì)Tapestry,還對(duì)于JEE、Spring這寫entire stack的框架,需要從RoR學(xué)習(xí),不僅提供工具,還需要提供整套的解決方案。

          Trails(Chris Nelson)

          1、你認(rèn)為你的framework的“甜點(diǎn)”在哪里?他最適合哪種類型的項(xiàng)目?
          Trails的應(yīng)用程序只需要Web界面和持久化的domain model就可以了。Trails給你的domain
          model快速的提供一個(gè)界面,除了POJO自己不需要附加的代碼。Trails允許你修改界面的外觀和行為,包括驗(yàn)證、i18n、安全。這些都不需要java代碼生成,不喜歡代碼生成的人應(yīng)該感覺很舒適。

          2、它不適合于什么樣的場景?在這些場景你推薦什么fremework?它是哪個(gè)?
          Trails講究夠用就好。它允許你快速交付,問問你的客戶:“這樣夠好么?”。這會(huì)改變你的工作流程,當(dāng)然這不是可以覆蓋所有需求的解決方案。當(dāng)UI需求很高,Trails沒有優(yōu)勢。我認(rèn)為Trails適合于混合的應(yīng)用,對(duì)于管理員他們只需要夠用就好,那么就可以使用Trails。其它的部分我們可以訂制開發(fā),我們?cè)谑褂肨apestry、Hibernate、Spring來實(shí)現(xiàn)這些部分,Trails正是基于它們。對(duì)于非交互的應(yīng)用,Trails也不適合,如報(bào)表應(yīng)用,可以考慮Eclipse BIRT。

          3、在下面提到的framework中,你試驗(yàn)過他們么?如果試驗(yàn)過,你比較喜歡哪個(gè)?你不喜歡哪個(gè)?
          我用Struts很多。它曾經(jīng)是偉大的framework。主要的缺陷是它不能自動(dòng)幫定數(shù)據(jù)到domain model。我也研究過JSF,它比Struts強(qiáng),但是自定義組建非常難。Tapestry非常便于自定義組建,尤其對(duì)于建立高階組件(有其它組件組成的)非常方便,Trails正在使用它。

          4、你的framework的未來會(huì)怎樣?對(duì)于用戶開發(fā)會(huì)有什么方便使用的變化?你會(huì)原生支持Ajax么?你們計(jì)劃支持它了么?
          對(duì)于Trails來說我們站在巨人的肩膀上。Tapestry在ajax功能作了很多努力,所以Trails也不難與其共舞。但是我們需要?jiǎng)?chuàng)建更多的例子來演示這些。我們也致力于讓Trails容易介入到已經(jīng)進(jìn)行的項(xiàng)目中。以后Trails還要加入基于實(shí)例的安全(instance-based security)(目前正在使用基于角色的role-based),還有method invocation。

          5、有對(duì)你們的framework的傳言需要澄清么?如果有,是哪個(gè)?
          Trails是對(duì)RoR的移植。Trails的名字來自Rails。它是基于Rails的理念,但不是對(duì)它的移植。

          6、你對(duì)Ruby on Rails的看法如何?
          我認(rèn)為我們有很多需要從RoR學(xué)習(xí)的地方,那將幫助我們享受開發(fā)Web程序的愜意。
          posted @ 2006-08-18 00:02 崛起的程序員 閱讀(190) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 万盛区| 贵溪市| 札达县| 衡东县| 河南省| 宁国市| 古丈县| 固安县| 克拉玛依市| 集贤县| 延寿县| 呼玛县| 永嘉县| 清丰县| 南雄市| 衡东县| 舞钢市| 北流市| 麻城市| 仁寿县| 杭锦后旗| 长海县| 威海市| 鹤岗市| 长治市| 双柏县| 绍兴县| 乌拉特后旗| 汕头市| 辽中县| 铜梁县| 满城县| 昌宁县| 南汇区| 五指山市| 永吉县| 霍邱县| 马关县| 金秀| 石楼县| 双鸭山市|