J2EE劍俠行

          直覺我的J2EE應(yīng)用生涯,打造我心中的一把利劍。

          常用鏈接

          統(tǒng)計

          技術(shù)鏈接

          最新評論

          2005年12月20日 #

          找到一個好用的UML建模工具-argouml

           很不錯的一個UML建模工具-argouml
               argouml下載地址
               我一眼就看上他的原因是:生成的用例和包圖可能直接生成JAVA代碼,而且準(zhǔn)備無誤,這正是我要找的。
               我想:以后使用一些框架的話,可能由PD生成一些實體,然后Hibernate生成pojo等,加入到argouml,然后根據(jù)一個框架的特性生成一些包 和類.就等于詳細(xì)設(shè)計了吧.應(yīng)該來說是比詳細(xì)設(shè)計還實用的東西.總比哪些WORD文檔好吧.還有讓人看不懂的概要設(shè)計.
              我想從技術(shù)出發(fā),這個是一條比較適用的路子.下班了.我明天將會匯報一下我使用的情況和一些范例.
              反過來又想像.這好象是一個組合的腳手架.好象ROR的零星操作步驟.應(yīng)該學(xué)習(xí).ROR畢竟是一個新生事物,JAVAEYE的推廣也需要一個時間.如果像我這樣的打工,混口飯吃的人還是專心的研究J2EE好一點.否則明天就沒有飯吃了.

              呵呵.我的文章可被JAVAEYE收回到水貼里了,可能自己的能力不如人吧,好好學(xué)習(xí),天天向上,如果看客有什么好的工具和軟件生產(chǎn)思路,可以共同交流。

          posted @ 2007-06-20 13:29 @家軍 閱讀(1861) | 評論 (1)編輯 收藏

          ROR:習(xí)慣約定優(yōu)于配置(學(xué)習(xí)ROR的第一天)

          今天學(xué)習(xí)了一下ROR,有一些學(xué)習(xí)經(jīng)驗東西要與大家分享。
          給ROR加一個座右銘--------狹窄心腸的日本產(chǎn)物。
          首先,不要一個一個的下載Ruby,Rails,建議使用一鍵安裝,下載地址如下:
          InstantRails-1.3-win
          版本說明:ruby 1.8.4 (2005-12-24) [i386-mswin32]
          其次,下載一個目前為止比較好的一個ROR的實踐工具:RadRails
          下載地址:radrails-0.7.1-win32
          接下來,設(shè)置一下Radrails的環(huán)境
          1)、Windows/perferences/Ruby/Installed Inteperters/ ->add ruby所在路徑:比如D:\InstantRails\ruby\bin\ruby.exe
          2)、Windows/perferences/Rails/Configuration ->Rails path:比如D:\InstantRails\ruby\bin\rails
          ->Rake path:比如D:\InstantRails\ruby\bin\rake 絕不是bat/cmd
          ->mogrel path:比如D:\InstantRails\ruby\bin\mongrel_rails絕不是bat/cmd

          有了如上的配置后,就只需要和在JAVA當(dāng)中ANT一樣使用。(成功用過APPFUSE的人就不用害怕了)

          看看日本人寫的第一步:
          1),在RadRails中創(chuàng)建一個Rails Project,怎么樣會出來一堆的東東。
          2),進入DOS命令吧,后面的工序都是這樣的,好象買了海爾的洗衣機,第一次是送貨、第二次是用戶回訪,第三次是.....
          進入到你的項目處,運行ruby script\generate controller MyTest,
          則得到的服務(wù)如下:
          exists app/controllers/
          exists app/helpers/
          create app/views/my_test
          exists test/functional/
          create app/controllers/my_test_controller.rb
          create test/functional/my_test_controller_test.rb
          create app/helpers/my_test_helper.rb
          修改一下my_test_controller.rb

          代碼
          ?????? class ?MyTestController? < ?ApplicationController
          ??????def?index
          ????????render_text?
          " Hello?world!! "
          ??????end?
          ??????end

          在瀏覽器里輸入:http://127.0.0.1:3000/my_test/
          會出現(xiàn) Hello world!!字樣,
          不過有意思的是你可以輸入:http://127.0.0.1:3000/My_test/
          http://127.0.0.1:3000/My_Test/
          http://127.0.0.1:3000/my_Test/
          都可以得到這個值,可能沒有JAVA哪樣嚴(yán)格吧。
          3)、還有對數(shù)據(jù)庫的操作,要配置一個database.yml(好象Log4j的東東)
          4)、創(chuàng)建數(shù)據(jù)庫表的時候只能夠使用復(fù)數(shù)起名,比如User就不行,只能夠起Users
          下面只要執(zhí)行幾個命令就可以使用增刪改查了。
          如下是我的操作,下班了,就不多寫了,例子能夠說明一切問題:
          代碼
          ?1?E:\RORProject\demo>ruby?script/generate?model?user
          ?2?
          ?3???????exists??app/models/
          ?4?
          ?5???????exists??test/unit/
          ?6?
          ?7???????exists??test/fixtures/
          ?8?
          ?9???????create??app/models/user.rb
          10?
          11???????create??test/unit/user_test.rb
          12?
          13???????create??test/fixtures/users.yml
          14?
          15???????exists??db/migrate
          16?
          17???????create??db/migrate/001_create_users.rb
          18?
          19?E:\RORProject\demo>ruby?script/generate?controller?user
          20?exists?app/controllers/
          21?exists?app/helpers/
          22?create?app/views/user
          23?exists?test/functional/
          24?create?app/controllers/user_controller.rb
          25?create?test/functional/user_controller_test.rb
          26?create?app/helpers/user_helper.rb
          27?

          修改user_controller.rb如下:
          代碼
          1????class?UserController?<?ApplicationController
          2????????scaffold:user
          3????end

          最后你的瀏覽器當(dāng)中輸入:http://127.0.0.1:3000/user/list,就包括了對數(shù)據(jù)庫表的四個操作.當(dāng)然你也可以自己定義四個操作的任意一種.
          最后總結(jié):
          ROR可能是敏捷開發(fā)的一個好實踐,但是我覺得他完成復(fù)雜應(yīng)用進不會有大做為,而至于這一點還需要再做探究。不過現(xiàn)階段最好的需求就是能夠給用戶快速的寫出一個不完整的DEMO,這一點為以后打單取得主動。

          posted @ 2006-09-29 11:47 @家軍 閱讀(2007) | 評論 (1)編輯 收藏

          三個JAVA文件完成你的MVC應(yīng)用

               摘要: 只需要你三個JAVA類和兩個配置文件,就可以完成你的MVC應(yīng)用,我們就做一個示例吧。本文以一個登錄為例。第一個JAVA文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/**======================================...  閱讀全文

          posted @ 2006-09-29 11:43 @家軍 閱讀(1917) | 評論 (3)編輯 收藏

          struts標(biāo)簽,請你走開(系列一)

          在項目開發(fā)的很多時候,用戶需要更友好,更容易理解的操作界面,而為了能夠達到這種表現(xiàn)界面,struts標(biāo)簽顯得力不從心,本人經(jīng)過幾個項目的開發(fā)當(dāng)中 逐漸的擯棄了struts標(biāo)簽,而由JSTL來做為JSP頁面的表達者。
          struts標(biāo)簽之死穴一 不支持嵌套
          看看這種常見的需求吧。一個用戶隸屬于一個職能部門,比如
          項目要求 職能部門有五個(亂寫的)
          1、企劃部
          2、網(wǎng)絡(luò)集成部
          3、行政部
          4、營銷部
          5、產(chǎn)品部
          項目要求 一共有二個員工
          1、張三 隸屬于行政部
          2、李四 隸屬于營銷部
          而你想把張三和李四都列表出來,顯示為如下:
          姓名 部門名稱
          張三 行政部
          李四 營銷部
          而且還需要用戶的列表鏈接到修改頁面當(dāng)中(假如只修改部門)應(yīng)該如何做呢。
          在使用struts標(biāo)簽是很難做到的,除非你非常不在意內(nèi)存的使用(亂寫技術(shù)性代碼)
          看看JSTL是如何做的吧。
          從STRUTS的ACTION當(dāng)中加載兩個對象

          List?GetAllDept? = ?UserDAO.GetAllDept(); // 取得所有部門

          List?GetALLUser?
          = ?UserDAO.GetAllUser(); // 取得所有用戶

          request.setAttribute(
          " View_Dept " ,?GetAllDept);

          request.setAttribute(
          " View_User " ,?GetALLUser);
          在頁面當(dāng)中加入對JSTL的引用
          <%@?taglib?uri="http://java.sun.com/jsp/jstl/core"?prefix="c"%>

          然后寫代碼如下:
          <table>

          <tr>

          <td?align="center">

          <a?href="User.do?method=EditUser&UserId=<c:out?value='${View_User.UserId}'/>">

          <c:out?value="${View_User.UserName}"?/>?</a>

          </td>

          <td?align="center">

          <c:forEach?items="${View_Dept}"?var="View_Dept">

          <c:if?test="${View_User.Dept.DeptId==View_Dept.DeptId}">

          <c:out?value="${View_Dept.DeptName}"?/>

          </c:if>????????????????????????????

          </c:forEach>

          </td>

          </tr>

          </table>

          其中View_User.Dept.DeptId表示USER表與DEPT表的一個關(guān)系(外鍵)
          你就可以看到所顯示的列表了。

          還有如果在修改用戶時,則也與上面的差不多,首先在ACTION當(dāng)中加入:

          String?ModifyUserId?=?request.getParameter("GroupUserId");

          if?(ModifyUserId?==?null?&&?ModifyUserId.equals(""))?{

          //這是出錯處理

          request.setAttribute(
          "UserMsg",?"User.ValidateUser");

          return?mapping.findForward("Fail");

          }

          DynaValidatorForm?UserActionForm?
          =?(DynaValidatorForm)?form;

          User?user?
          =?UserDAO.GetUser(ModifyUserId);????????

          List?GetAllDept?
          =?UserDAO.GetAllDept();//取得所有部門

          request.setAttribute(
          "View_Dept",?GetAllDept);

          UserActionForm.set(
          "User",?User);
          然后頁面當(dāng)中顯示如下(部門為LISTBOX),例子當(dāng)中只顯示部門
          <html:select?property="DeptAsString">????????????

          <c:forEach?items="${View_Dept}"?var="View_Dept">????????

          <c:choose>????????????????????????

          <c:when?test="${User.Dept.DeptId==View_Dept.DeptId}">

          <option????value="<c:out?value='${View_Dept.DeptId}'?/>"selected>????

          <c:out?value="${View_Dept.DeptName}"?/>????????????

          </option>????????????????????????????

          </c:when>????????????????????????????

          <c:otherwise>????????????????????????

          <option?value="<c:out?value='${View_Dept.DeptId}'?/>">????????

          <c:out?value="${View_Dept.DeptName}"?/></option>????????

          </c:otherwise>????????????????????????

          </c:choose>

          </c:forEach>

          </html:select>

          可以看到HTML的SELECT有一個DeptAsString,你可以在FORM當(dāng)中指定一個STRING的FORM屬性。
          這樣用戶的要求就可以完成了。
          本次只說明方法,而代碼沒有經(jīng)過測試。希望大家多多觀注我的BLOG,下一次將臭罵ACTIONFROM不支持的DATE類型及解決方法。

          posted @ 2006-09-25 16:36 @家軍 閱讀(459) | 評論 (0)編輯 收藏

          用二維數(shù)組管理好你零亂的狀態(tài)、分類和其它常用選項

               摘要: 在大家的編碼過程當(dāng)中,有沒有遇到過這么一種情況,很多零亂的狀態(tài)、分類和其它常用選項常常是定義死了。但是沒有一個完整的東東來約束他,在每個模塊當(dāng)中使用相關(guān)的信息時,往往重新COPY一次,或者COPY過來修改一次。如果多人協(xié)作的話,務(wù)必會讓代碼變的零亂、不好管理等。
          本次主要是把一些靜態(tài)的分類、狀態(tài)或者其它常用選項使用二維數(shù)組管理起來。如果你是一個使用JSTL或者STRUTS做前臺表現(xiàn)的話,你就更應(yīng)該好好關(guān)注了.......  閱讀全文

          posted @ 2006-09-05 13:31 @家軍 閱讀(1290) | 評論 (0)編輯 收藏

          如果失去工作會怎么辦?

          ??? 在工作當(dāng)中,遇到了一個不明智的上級,我是劉羅鍋,但是領(lǐng)導(dǎo)不一定是乾隆。設(shè)計當(dāng)中的爭執(zhí)成為私下做對的理由,從此,我感覺到今年的財運不佳。
          ??? 因為工作當(dāng)中的爭執(zhí),而讓領(lǐng)導(dǎo)失去了面子??我在郁悶當(dāng)中,為什么呀!好事反而成了壞事。
          ??? 領(lǐng)導(dǎo)的報復(fù)心理,讓我失去了績效,所以我感覺到財運不佳。我很想跳出這個魔鬼圈,是不是能夠改善一下自己的經(jīng)濟收入呢?正在想離開這個公司......
          ??? 發(fā)現(xiàn)自己的軟肋:UML整體設(shè)計(最好有代碼生成)和XP敏捷開發(fā)。近期需要加強這兩方面的學(xué)習(xí),可以以權(quán)限設(shè)計為UML做為訓(xùn)練(生成代碼??),以CRM->VtigerCRM為業(yè)務(wù)主線,做一個XP開發(fā),不過VtigerCRM的表設(shè)計真是很糟糕,Indiea人呀。
          ??? 今年的公司很亂,是一個很糟糕的管理層,可能我以后離開這個公司后才感覺到領(lǐng)導(dǎo)者的“聰明才智”吧!完全在內(nèi)耗當(dāng)中生存。我已經(jīng)被領(lǐng)導(dǎo)國邊緣化,我會在灰色的區(qū)域彷徨很長的時間,或許公司另有高人吧,我已經(jīng)被領(lǐng)導(dǎo)逐漸忽視,自己發(fā)光的時間也只有一年,好象知了一樣。
          ??? “人貴有自知之明”,如果領(lǐng)導(dǎo)沒有重視,只是為了發(fā)揮自己的最低性能的話,我完全有很多的時間來學(xué)習(xí)知識,我很慶幸自己和開源代碼有很大的信心,我將在以后的時間里,為開源界展示自己的能力。
          ??? 首先要把自己學(xué)習(xí)到的知識透明化,其次我會在開源中小型的CRM軟件當(dāng)中做出自己應(yīng)有的貢獻。

          posted @ 2006-07-24 11:37 @家軍 閱讀(479) | 評論 (1)編輯 收藏

          struts表單 vs JSTL表現(xiàn)之多條件查詢示例

          ??? struts表單主要是利用actionform來取得JSP頁面所有的request的,所有的Struts標(biāo)簽無非在取得request當(dāng)中的所有INPUT,并賦值回標(biāo)簽值的,同理,JSTL能夠在JSP表單當(dāng)中輕易的表現(xiàn)要輸出的結(jié)果。
          ??? 如果你是高手,你就知道這個標(biāo)題有誤,是的,struts表單與JSTL表現(xiàn)沒有可比性,但是如果我們要在實現(xiàn)一個多條件的查詢頁面時,這個比較就比較有效了。
          ??? 我不妨比較一下利用struts表單的查詢實現(xiàn) 和 利用JSTL做為表現(xiàn)而實現(xiàn)的查詢功能有什么不同,讓讀者尋其方便。
          ??? 示例說明:
          ??? 用戶表-USER
          ??? username? 用戶名稱
          ??? loginid?? 登錄ID
          ??? sex?????? 性別
          ??? 一、利用struts表單的查詢實現(xiàn)
          ??????? 實現(xiàn)步驟:
          ??????? 創(chuàng)建多條件的序列化對象(java)->在struts.config當(dāng)中申明actionform->Action當(dāng)中實現(xiàn)->輸出結(jié)果
          ???????
          ????/**?The?value?of?the?simple?userName?property.?*/
          ????
          private?java.lang.String?userName;
          ????
          /**?The?value?of?the?simple?loginId?property.?*/
          ????
          private?java.lang.String?loginId;
          ????
          /**?The?value?of?the?simple?sex?property.?*/
          ????
          private?java.lang.String?sex;
          ????
          /**
          ?????*?Return?the?value?of?the?USER_NAME?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getUserName()
          ????{
          ????????
          return?this.userName;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?USER_NAME?column.
          ?????*?
          @param?userName
          ?????
          */
          ????
          public?void?setUserName(java.lang.String?userName)
          ????{
          ????????
          this.userName?=?userName;
          ????
          /**
          ?????*?Return?the?value?of?the?LOGIN_ID?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getLoginId()
          ????{
          ????????
          return?this.loginId;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?LOGIN_ID?column.
          ?????*?
          @param?loginId
          ?????
          */
          ????
          public?void?setLoginId(java.lang.String?loginId)
          ????{
          ????????
          this.loginId?=?loginId;
          ????}
          ????
          /**
          ?????*?Return?the?value?of?the?sex?column.
          ?????*?
          @return?java.lang.String
          ?????
          */
          ????
          public?java.lang.String?getSex()
          ????{
          ????????
          return?this.sex;
          ????}

          ????
          /**
          ?????*?Set?the?value?of?the?sex?column.
          ?????*?
          @param?loginId
          ?????
          */
          ????
          public?void?setSex(java.lang.String?sex)
          ????{
          ????????
          this.sex?=?sex;
          ????}
          <!-- struts_fonfig -->
          ???????
          <form-bean?name="UserActionForm"?type="org.apache.struts.validator.DynaValidatorForm">
          <form-property?name="userCondition"?type="com.antbee.searchCondition.UserFindCondition"?/>????????
          ????????
          </form-bean>
          Action當(dāng)中
          DynaValidatorForm?UserForm?=?(DynaValidatorForm)?form;
          ????????UserFindCondition?Condition?
          =?(UserFindCondition)?UserActionForm
          ????????????????.get(
          "userCondition");//?取得查詢條件
          List?user?=?userManager.find(Condition,
          ????????????????(iCurPageNo?
          -?1)?*?pageCon.PAGE_SIZE,?pageCon.PAGE_SIZE);//呵呵,加入了hibernate的分頁
          具體實現(xiàn):
          ????public?List?find(UserFindCondition?Condition,?int?begin,
          ????????????
          int?count)?{
          ????????StringBuffer?sql?
          =?new?StringBuffer("from?User?as?a?where?1=1");??????????????
          ? ? ? ?
          if?(Condition?!=?null)?{
          ????????????makeSql(sql,?shipmentFindCondition);
          ????????}
          ????????String?fsql?
          =?sql.toString();
          ????????Query?query?
          =?this.getSession().createQuery(fsql);
          ????????
          if?(Condition?!=?null)?{
          ????????????setParameter(query,?Condition);
          ????????}
          ????????query.setFirstResult(begin);
          ????????query.setMaxResults(count);
          ????????List?tt?
          =?query.list();
          ????????
          return?tt;
          ????}

          --
          ??? /**
          ??? ?* 根據(jù)條件生成一個sql語句
          ??? ?*
          ??? ?* @author 和
          ??? ?* @param sql
          ??? ?*??????????? 初始的sql語句(一般為select a from A as a where 1=1)
          ??? ?* @param condition
          ??? ?*??????????? 查詢的條件
          ??? ?* @return
          ??? ?* @version 1.0
          ??? ?*/
          private
          ?void?makeSql(StringBuffer?sql, UserFindCondition?condition)?{
          ????????
          if?(condition.getUsername()?!=?null
          ????????????????
          &&?!condition.getUsername().toString().equals(""))?{
          ????????????sql
          ????????????????????.append(
          "?and a.username like?:username");
          ????????}

          ????????
          if?(condition.getLoginid()?!=?null
          ????????????????
          &&?!condition.getLoginid(().equals(""))?{
          ????????????sql
          ????????????????????.append(
          "?and a.loginid( =?:loginid(");
          ????????}

          ????????
          if?(condition.getSex()?!=?null
          ????????????????
          &&?!condition.getSex().equals(""))?{
          ????????????sql.append(
          "?and a.sex =?:sex");
          ????????}


          ????}

          ????
          /**
          ?????*?根據(jù)條件設(shè)置query的值
          ?????*?
          ?????*?
          @author?和
          ?????*?
          @param?query
          ?????*????????????一個hibernate的Query對象
          ?????*?
          @param?condition
          ?????*????????????查詢的條件
          ?????*?
          @return
          ?????*?
          @version?1.0
          ?????
          */
          ????
          private?void?setParameter(Query?query, UserFindCondition?condition)?{

          ????????
          if?(condition.getUsername()?!=?null
          ????????????????
          &&?!condition.getUsername().equals(""))?{
          ????????????query.setString(
          "username",?"%"?+?condition.getUsername()
          ????????????????????
          +?"%");
          ????????}

          ????????
          if?(condition.getLoginid()?!=?null
          ????????????????
          &&?!condition.getLoginid().equals(""))?{
          ????????????query.setString(
          "loginid",?condition.getLoginid());
          ????????}

          ????????
          if?(condition.getSex()?!=?null
          ????????????????
          &&?!condition.getSex().equals(""))?{
          ????????????query.setString(
          "sex",?condition.getSex());
          ????????}?????

          ????}

          呵呵,笑死人了,這個方法很通用,我才在我的第二個項目當(dāng)中才用到,真是可惜,當(dāng)然了,使用Actionform有一個毛病就是對date類型要轉(zhuǎn)換成STRING類型來處理,這是actionform的一個死穴。還有對Actionform不能夠重置,只能夠回來從前。不知道這群設(shè)計者怎么想的,真是由于這一點,所以我們有必要使用最原始的方法來解決問題了。使用頁面當(dāng)中的input,我們來拼request如何?
          ?? 二、利用JSTL做為表現(xiàn)而實現(xiàn)的查詢功能
          ???? 步驟:在JSP頁面布置很多的input,當(dāng)然,你可以加入value了。(省略了...)
          ?????????? 創(chuàng)建查詢條件的序列化對象(同樣user.java)
          ?????????? 在action當(dāng)中拼個condition了,做為查詢條件,后面的處理類同第一種方式。
          ?????UserSearchCondition?userSearchCondition?=?null;
          ?????userSearchCondition?
          =?makeUserSearchCondition(request);

          private UserSearchCondition?makeUserSearchCondition(HttpServletRequest?request)?throws?Exception{
          ???????
          UserSearchCondition userSearchCondition?=?new?OrderSearchCondition();
          ????????String username
          =?request.getParameter("Username");
          ????????String loginid
          =?request.getParameter("Loginid");
          ????????String sex
          =?request.getParameter("Sex");??
          ???????

          ????????????????
          ????????
          if(username!=?null?&&?!username.trim().equals("")){
          ???????????
          usernameSearchCondition.setUsername(username);
          ????????}
          ????????
          ????????
          if(loginid? !=?null?&&?!loginid.trim().equals("")){
          ??????????? userSearchCondition.set
          Loginid (loginid );
          ????????}
          ????????
          ????????
          if(sex !=?null?&&?!sex.trim().equals("")){????????
          ??????????? userSearchCondition.setSex(
          sex);
          ????????}??????

          ????????
          ????????
          return userSearchCondition;
          ????}

          ???? 以后的方法,我就不用再做舉例了吧,可以參考如上第一種方法的實現(xiàn).
          ???? 第二種方法的好處就是:在頁面上比較好控制,比如重置,又比如日期性數(shù)據(jù)等。
          ???? (所有過程當(dāng)中的代碼沒有經(jīng)過測試,只是說明這種方法而已)

          posted @ 2006-07-21 11:20 @家軍 閱讀(2725) | 評論 (1)編輯 收藏

          hibernate的延遲加載通用方法

          呵呵,在忙一個項目,潛水很久,現(xiàn)在冒個泡:
          (本文適用在struts+spring+hibernate3上做開發(fā)的蟲蟲們)
          類名:HibernateUtil

          package?com.antbee.j2eemodel.util;

          import?java.lang.reflect.InvocationTargetException;
          import?java.lang.reflect.Method;
          import?java.util.Collection;
          import?java.util.Iterator;

          import?org.springframework.orm.hibernate3.support.HibernateDaoSupport;

          public?class?HibernateUtil?extends?HibernateDaoSupport?{

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          String[]?methodArray?
          =?methodName.split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?i=0;i<methodArray.length;i++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[i],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @param?methodName?方法名稱數(shù)組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for?(int?i?=?0;?i?<?methodName.length;?i++)?{
          String[]?methodArray?
          =?methodName[i].split("\\.");
          Method?method?
          =?null;
          Object?initializeObject?
          =?object;

          if(methodArray.length?==?1){
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          method?
          =?object.getClass().getMethod(methodArray[0],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          this.getHibernateTemplate().initialize(initializeObject);
          }
          else{
          for(int?j=0;j<methodArray.length;j++){
          method?
          =?initializeObject.getClass().getMethod(methodArray[j],?new?Class[]?{});
          initializeObject?
          =?method.invoke(initializeObject,?new?Object[]?{});
          }
          this.getHibernateTemplate().lock(initializeObject,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(initializeObject);
          }
          }

          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?object?POJO對象
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Object?object)?throws?SecurityException,?NoSuchMethodException,?IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{
          this.getHibernateTemplate().lock(object,?org.hibernate.LockMode.NONE);
          this.getHibernateTemplate().initialize(object);
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱數(shù)組
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName[])
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }

          /**
          *?初始化POJO類
          *?
          @author?@家軍
          *?
          @param?collection?POJO對象集合
          *?
          @param?methodName?方法名稱
          *?
          @return
          *?
          @version?1.0
          */
          public?void?initialize(Collection?collection,?String?methodName)
          throws?SecurityException,?NoSuchMethodException,
          IllegalArgumentException,?IllegalAccessException,?InvocationTargetException?{

          for(Iterator?i=collection.iterator();i.hasNext()Wink{
          Object?object?
          =?i.next();
          this.initialize(object,methodName);
          }
          }
          }?

          這個方法的好外是:可以不在hbm.xml的文件當(dāng)中,指定為lazy=true這個模式,可以直接使用。使用方法如下:
          如果你使用SPRING,則需要把hibernateUtil注入其中:
          ?<bean?id="hibernateUtilTarget"?class="com.antbee.j2eemodel.util.HibernateUtil">
          <property?name="sessionFactory">
          <ref?local="mssqlSessionFactory"?/>
          </property>
          </bean>

          <bean?id="hibernateUtil"?parent="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
          <property?name="target">
          <ref?local="hibernateUtilTarget"?/>
          </property>
          </bean>
          <!--配置基礎(chǔ)事務(wù)-->
          <bean?id="BaseTransactionProxy"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"?abstract="true">
          <property?name="transactionManager">
          <ref?bean="mssqltransactionManager"?/>
          </property>
          <property?name="proxyTargetClass">
          <value>true</value>
          </property>
          <property?name="transactionAttributes">
          <props>
          <prop?key="*">PROPAGATION_REQUIRED</prop>
          </props>
          </property>
          </bean>?

          使用示例:
          如果你使用STRUTS,則需要這樣:
          List?what_ur_view?=?XXXManager.find(.);//取得你要展示的對象
          //如果這個對象當(dāng)中有延遲加載的對象(SET)時,則需要如下加載就行
          this.hibernateUtil.initialize(what_ur_view,?"getTbShipmentSale");
          //其中g(shù)etTbShipmentSale是其對象(SET也可以操作)?

          在頁面顯示的時候,你就可以使用JSTL如下表述:
          <c:out?value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}"?/>//呵呵,是不是很爽呀。?

          同樣的方法,我們也可以對一個SET在頁面進行顯示,方法如下:
          <c:forEach?items="${what_ur_view.tbShipmentProductMappingSet}"?var="ProductMapping"?varStatus="status">
          <c:out?value="${ProductMapping.productNum}"?/>
          <c:out?value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}"?/>
          </c:forEach>
          //呵呵,支持多級嵌套,?

          在ACTION當(dāng)中則需要加入
          hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
          new?String[]?{?"getTbProduct",?"getTbOutOfWarehouse",
          "getTbProductConfigure"?});?
          呵,如果你要是在HIBERNATE當(dāng)中使用,這個就太簡單了吧。

          怎么樣?呵呵呵,
          從此,我對STRUTS的標(biāo)簽深惡痛絕,而對JSTL情有獨鐘了。

          posted @ 2006-07-21 10:09 @家軍 閱讀(5609) | 評論 (2)編輯 收藏

          成功是一種病態(tài)的堅持!

          ?? 很長的時間陷入到與同事上級的斗爭當(dāng)中,無聊死了,今天回來看看自己書簽當(dāng)中的網(wǎng)站,感覺到自己是小人了。我不應(yīng)該留戀明爭暗斗,我應(yīng)該自立自強,永不停息。
          ?? 在年前的時候我曾經(jīng)非常看好compiere的應(yīng)用,想不到今天再看看國內(nèi)使用的形勢,長三角和珠三角的廣泛應(yīng)用,還有ORACLE免費數(shù)據(jù)庫的推出,更加印證了我錯誤的做法。
          ?? 一個人最重要的事情就是三個字:做決定。
          ?? 一個人想要成功,尤其像我這樣不甘愿給別人打工又有很多想法的人,除非是一種病態(tài)的堅持才能夠取得成功。
          ?? 我很討厭公司現(xiàn)行的CRM系統(tǒng),簡單的說一句就是:簡直就是一個糊人的、丑陋的MIS系統(tǒng),一點設(shè)計思想都沒有,一點產(chǎn)品理念都沒有。最重要的設(shè)計者在拼命的逃脫自己的責(zé)任,開發(fā)者在忍受莫大的痛苦,業(yè)務(wù)在每一個開發(fā)者思想里扭曲......唉,想抽出一點時間來都難。
          ?? 我要在以后的時候里,一則增加自己的業(yè)務(wù)能力,以compiere的應(yīng)用為主;二則要增強我的技術(shù)能力,以 vTigerCRM為藍本,做一個J2EE的產(chǎn)品移植。
          ?? 在今年年底以前,自己必須要做到對compiere的應(yīng)用熟練,能夠完成 vTigerCRM的J2EE實現(xiàn)。所以自己最重要要做的事是:時間安排,

          posted @ 2006-07-19 16:35 @家軍 閱讀(409) | 評論 (0)編輯 收藏

          轉(zhuǎn)摘:從一個笑話看軟件開發(fā)管理

          來自于:http://blog.csdn.net/Raptor/archive/2006/05/13/727299.aspx

          關(guān)于軟件開發(fā)的笑話有很多,下面這個是我剛在QQ群里的看到的:

          1. 程序員寫出自認(rèn)為沒有Bug的代碼。
          2. 軟件測試,發(fā)現(xiàn)了20個Bug。
          3. 程序員修改了10個Bug,并告訴測試組另外10個不是Bug。
          4. 測試組發(fā)現(xiàn)其中5個改動根本無法工作,同時又發(fā)現(xiàn)了15個新Bug。
          5. 重復(fù)3次步驟3和步驟4。
          6. 鑒于市場方面的壓力,為了配合當(dāng)初制定的過分樂觀的發(fā)布時間表,產(chǎn)品終于上市了。
          7. 用戶發(fā)現(xiàn)了137個新Bug。
          8. 已經(jīng)領(lǐng)了項目獎金的程序員不知跑到哪里去了。
          9. 新組建的項目組修正了差不多全部137個Bug,但又發(fā)現(xiàn)了456個新Bug。
          10. 最初那個程序員從斐濟給飽受拖欠工資之苦的測試組寄來了一張明信片。整個測試組集體辭職。
          11. 公司被競爭對手惡意收購。收購時,軟件的最終版本包含783個Bug。
          12. 新CEO走馬上任。公司雇了一名新程序員重寫該軟件。
          13. 程序員寫出自認(rèn)為沒有Bug的代碼。

          要我說,如果真有這樣的公司,不倒閉對不起人民。

          這個笑話從程序員開始,到程序員結(jié)束,從頭到尾都在說程序員的不是。但是我要說的是,這完全是管理者的失敗,從整個過程中,看不到任何管理工作。這種管理者不但無知無能,還很無恥——將自己的失敗責(zé)任推給程序員。

          1、程序員憑什么證明他的代碼沒有BUG?有Test case嗎?有Code review嗎?這個環(huán)節(jié)管理缺失。

          2、測試發(fā)現(xiàn)BUG有進行BUG管理嗎?有跟蹤嗎?這個環(huán)節(jié)管理缺失。

          3、憑什么證明程序員已經(jīng)把那10個BUG修改好了?另10個又為什么不是BUG?BUG的評價標(biāo)準(zhǔn)難道是程序員說了算?這個環(huán)節(jié)管理缺失。

          4、5個不能工作的BUG修改問題有沒有追究責(zé)任?增加新BUG是修改過程中不可避免的事情,但是如果有有效的單元測試機制,可以大大減少這種情況。這個環(huán)節(jié)管理缺失。

          5、迭代是正常的,但是問題處理于發(fā)散而不是收斂發(fā)展,可見沒有有效的管理調(diào)控。這個環(huán)節(jié)管理缺失。

          6、過于樂觀的時間表和不可能達到的最后期限,都表現(xiàn)出管理者的無知和無能。而在這樣的情況下強行推出產(chǎn)品,那就是無知者無畏了。

          7、這是對用戶的不負(fù)責(zé)任,管理者要負(fù)最大的責(zé)任。

          8、這樣的情況還能發(fā)項目獎金,只能說管理者不是一般的愚蠢。

          9、管理工作沒有任何的改進,問題仍然處于發(fā)散迭代狀態(tài)。管理工作依然沒有到位。

          10、拖欠測試部門工資體現(xiàn)出管理者對質(zhì)量管理工作的忽視以及對人力資源管理方面一無所知。

          11、送被收購者兩個字:活該。送收購者兩個字:瞎眼。

          12、可見新管理者與原管理者半斤八兩,都沒有認(rèn)識到問題的根本所在。不過也只有這樣的管理者才會作出收購這種公司的決策。

          13、歷史的重演是必然的。

          一個正常的企業(yè)或是項目,其運作必須應(yīng)該是循環(huán)向上進行的。而保障這種運行的工作就是管理。而管理工作的主要內(nèi)容就是控制,包括控制循環(huán)的節(jié)奏——不能太快也不能太慢,控制發(fā)展的方向——只能向上不能向下,控制運作的穩(wěn)定——不能大起大落或時聚時散等。

          而這一切,在這個例子中都看不到。

          在 這個笑話的例子中,一切都是以開發(fā)工作在驅(qū)動,這首先就是一個方向性錯誤,產(chǎn)品是為用戶服務(wù)的,當(dāng)然應(yīng)該是以用戶和市場作為驅(qū)動,并且結(jié)合自身的能力最終 確定工作的重點。這一錯誤折射出管理者對被管理的內(nèi)容很不了解,只好任由比較了解的程序員擺布——事實上他們除了技術(shù),并不會了解更多。

          一個管理者如果對自己所管理的內(nèi)容不了解,他就不可能管理得好

          這是一件毫無疑問的事,可是國內(nèi)的軟件業(yè)似乎總是不相信這一點。中國軟件業(yè)中流毒最深的謊言之一就是:

          管理者只要懂管理就可以,不需要懂技術(shù)。

          其實這不過是那些無知無能無恥的管理者為了騙錢而編出來的,相信這句話的人必將付出金錢的代價。

          其 次是質(zhì)量管理。基本的質(zhì)量管理常識告訴我們,每次循環(huán)結(jié)束前,最重的工作就是總結(jié)改進。只有這樣才能保證循環(huán)運作是向上發(fā)展,而不是失去控制地向下發(fā)展。 也只有有效的質(zhì)量管理,才能保證迭代過程是收斂發(fā)展,并最終達到目標(biāo)。但在這個例子中,這個部分顯然是缺失的——其中雖然有測試部門,但是他們的作用僅僅 是質(zhì)量管理中的質(zhì)量檢測環(huán)節(jié),管理部分還是缺失的。

          然后是人力資源管理。軟件開發(fā)是一項勞動密集型的工作,雖然這是腦力勞動,但同樣意味著人在因素在其中占有決定性的地位。而例子中未改完BUG的程 序員拿到項目獎金,而同樣辛苦工作的測試人員卻被拖欠薪資,除了表現(xiàn)出管理者對他們的工作內(nèi)容的不了解,以及對質(zhì)量管理工作的不重視以外,還表現(xiàn)出管理者 完全不會管人,這是一種謀殺團隊的行為——謀殺一個團隊遠(yuǎn)比建設(shè)要容易得多。

          最后,這個失敗的管理者把他的經(jīng)歷編成這個笑話,讓大家看到他被程序員們害得多慘,把程序員妖魔化為一群騙子。但只要稍懂管理的人簡單分析一下就可以看出來,只不過是這個人的無知和無能造成了他現(xiàn)在的結(jié)果,而把責(zé)任推給別人的行為更是表現(xiàn)出他的無恥。

          作為身居高位的管理者,如果連應(yīng)該承擔(dān)的責(zé)任都要推卸,他們還能勝任什么事情呢?

          posted @ 2006-05-15 15:53 @家軍 閱讀(363) | 評論 (0)編輯 收藏

          我向百度公司進軍!

          ???? 百度公司今天搬到我們這幢樓內(nèi),更加刺激了我去百度的念頭,因為我喜歡創(chuàng)新的工作,所以我將為這一點而去努力奮斗。
          ???? 不是說百度公司有多好,主要是想穩(wěn)定上幾年,有一點積蓄了,就可以自己出來自謀生路。呵呵。看見百度技術(shù)的職位只有無線搜索技術(shù)用到了JAVA,呵呵,不會灰心,其實,PYTHON或者RUR都將是以后的方向,至于PHP,我感覺百度會在不遠(yuǎn)的將來拋棄掉的。在服務(wù)器的性能和安全爭端上我只相信JAVA,百度只不過把這一種技術(shù)很快轉(zhuǎn)化成了資本,如果百度想要和GOOGLE一爭高下,實質(zhì)性的工作--技術(shù)上必須上要勝出GOOGLE一籌才行。而這一點只有行家才知道。

          ???? 我在北京的這幾年都是為代碼,或者就是為純粹的技術(shù)而奮斗,其實做為軟件公司,其起步主要是靠技術(shù),但是他成名或者有所富裕后,就覺得人情是一個比技術(shù)還好玩的東西時,這個公司就開始有了差距,不過,這個公司就開始危險了,或者是窮途末路,只能鉆到錢眼里去了。如果管理層(其實就是和有權(quán)的腐敗工廠DANG有關(guān)系的人)沒有動靜的話,這個公司必死。這就是中國的國情。
          ? ?
          ???? 工廠DANG叫嚷的中國國情就是要隱含有權(quán)層的灰色收入,況且五千年的封建文化完全可以掩蓋這一點。否則,會把老祖宗也搬出來。孔子曰:孟子說:還有什么孫子談兵什么的。
          ?? ?
          ???? 從程序員的角度思索一下,如上是IF.....ELSE....的語句后,final,工廠DANG治理的天下亂七八糟。

          posted @ 2006-05-08 15:50 @家軍 閱讀(392) | 評論 (0)編輯 收藏

          我將成為一個快樂的房奴

          ??? 呵呵,我在北京買到房子了,貸款了40萬元,在簽訂了很多的不平等條約后,我成為了一個正式的房奴了,但是我很高興。
          ??? 我來自于農(nóng)村,我最原始的生活憧憬就是改變農(nóng)村這種生活方式,我在很小的時候就不喜歡農(nóng)村的黃昏,因為夕陽照著我疲背一天身體時,我感覺到生命的絕望。于是我要改變自己,改變整個家庭的命運。
          ??? 父親很努力,在我懂事的時候就進入了縣城,我的心理比較的蹋實了,好象有了可以驕傲的資本,雖然家庭的收入很拮據(jù),但是我認(rèn)為自己要改變的不只是這一點。
          ??? 于是我只身來到北京,舉目無親的可憐像和在火車站睡覺的經(jīng)歷更加激勵了我,我要生活下去,我從上大學(xué)的時候就有一個始終不愈的信念:打不死的精神活到老。
          ??? 我對生命很是無所謂,因為我知道自己已經(jīng)在階級社會的最低層,我不害怕自己的失敗,我也不在乎錢,錢對于我來說只是肯定我的成績,肯定我的所有為是有效的。
          ??? 呵呵,我成為了北京的一員了,我的想法很簡單,當(dāng)我20年后,如果我的兒子不在北京發(fā)展了,我將買掉我的房子,回家后,我也應(yīng)該成為自由的生活者了,我已經(jīng)能夠讓我的晚年有所事事了。
          ??? 這一段時間主要在忙一個緊急的項目和公積金貸款,我將撰寫一個比較權(quán)威詳細(xì)的的貸款程序、
          ??? 博客將給我一個表現(xiàn)自己全新的舞臺,我將為生命之花綻放。

          posted @ 2006-05-08 15:29 @家軍 閱讀(685) | 評論 (5)編輯 收藏

          危險的中國經(jīng)濟

          ?? 說起來危險吧,就是對納稅人的不滿,如果納稅人有追求自由的念頭,那么你就知道中國的經(jīng)濟有多危險。
          ?? 呵呵,危險的中國樓市
          ???????? 危險的就業(yè)大軍
          ???????? 危險的新農(nóng)村政策
          ? 新農(nóng)村的建設(shè)就是廢除個人承包制,恢復(fù)現(xiàn)代地主制。看小X忙的不亦樂乎,他在干著財富分裂的現(xiàn)代社會主義建設(shè)。好象農(nóng)民脫離了土地,浮萍會被枯葉敗枝聚集,壯觀的讓人壓抑。
          ? 程序員不談?wù)瘟恕7駝t,后果不好。

          posted @ 2006-04-28 20:01 @家軍 閱讀(263) | 評論 (0)編輯 收藏

          快被尖刻的客戶托垮了!

          ? 最近沒有時間寫B(tài)LOG,雖然心理有很多想法想寫,想努力的推進開源代碼的實施,但是被尖刻的客戶托垮了。
          ?? 可能是我目前見到最尖刻的客戶吧,用戶在使用軟件當(dāng)中,遇到任何一點可疑的問題就打電話“責(zé)令”修改,否則沒有快速響應(yīng),最高的領(lǐng)導(dǎo)就出面給我施加壓力。我CALL,我真是對這群濫人生氣。所以我不得不打斷所有的工作而快速響應(yīng),于是晚上自愿加班到9-10點,已經(jīng)有三周沒有休息了。最要命的這個項目的設(shè)計者、編碼者、測試者和實施者就我一個人,而我上面有項目經(jīng)理、銷售、部門經(jīng)理、副總,一有問題,四個經(jīng)理就在一旁看結(jié)果,呵呵,壓的人喘不過氣來。
          ?? 我也很氣憤這個鬼公司,老板小氣的要死,實施時連個筆記本都沒有,而且前一段時間說為了實施方便才剛剛搞了一個移動硬盤,這才把我的老式的MP3(U盤)才換下來。所有給客戶的演示的第一步驟就是搬機器,最后一個步驟也是搬機器。唉,這么詭異的公司!!!!!!!!!!!!!!!
          ?? 現(xiàn)在客戶系統(tǒng)要上線,說不允許出現(xiàn)BUG,我沒有敢承諾,所以我也不說話,所有上面的領(lǐng)導(dǎo)都告訴我,不允許出現(xiàn)錯誤,你說我應(yīng)該怎么說,我也沒有說,只是和最小的頭說:我盡量吧,錯應(yīng)該不是錯,以后就是布丁了。
          ? 果然,正式上線的系統(tǒng)出現(xiàn)錯誤了,果然領(lǐng)導(dǎo)生氣了,果然領(lǐng)導(dǎo)給我委派了一個測試人員(普通員工臨時調(diào)配),果然我想離開這個詭異的公司。果然開源代碼的推廣又一步的延遲.........
          ? 不過,我覺得我還是很自信,因為我已經(jīng)盡了自己的最大努力,還有積累了很多的軟件工程的經(jīng)驗,還有快速開發(fā)的經(jīng)驗。
          ? 呵呵,出去混又何妨,方正我已經(jīng)有了項目經(jīng)理證,方正也實施了這個近百萬的項目了。還是一個人執(zhí)政,呵呵,和尚養(yǎng)大了,又覺得廟門小了。
          ?
          ?

          posted @ 2006-04-28 11:03 @家軍 閱讀(300) | 評論 (0)編輯 收藏

          開源代碼的盈利模式是什么?

           已經(jīng)有很長時間沒有寫日記了,公司的活太累了,所以沒有清閑的時間和清靜的心情來寫B(tài)LOG。
           我現(xiàn)在還深學(xué)陷入到開源代碼的實現(xiàn)當(dāng)中,我感覺不到開源代碼將對以后的生活帶來什么實質(zhì)的影響,可能就是能夠加快軟件生產(chǎn)的效率而已,在IT界,開源代碼的商業(yè)模式有過很多的探討,這也證明了開源代碼的魅力所在。因為她很深,所以以傳統(tǒng)的專業(yè)精神是很難很快的了解開源代碼。因為研究所化費的代價很大,所以她的存在價值就越來越高。
           從很多的資料和個人的體驗當(dāng)中,我深深感覺到開源代碼的盈利就是服務(wù),而這個服務(wù)應(yīng)該是多元化、多層面的服務(wù)體系,這個就好象是一個宗教一樣,像是道教,人之初,性本善,開源代碼的開源之初總是最好的,以后可能會魚龍混雜,現(xiàn)在已經(jīng)有這種跡象了。
           從理論上進行分析,以后對開源代碼進行管理的企業(yè)將是一個可以盈利的企業(yè),對開源代碼提供規(guī)則的將也是商家,在一定實踐基礎(chǔ)上對開源代碼進行分級,將是另外一個視角看開源代碼的方式,這個對開源代碼的成長起輔助作用。
           開源代碼對軟件的生產(chǎn)將提供最大的技術(shù)支持,這只是給有心人的。
           開源代碼也將指導(dǎo)企業(yè)應(yīng)用的先進化生產(chǎn),風(fēng)險和效率將同時存在。將來對開源代碼這種生產(chǎn)力的風(fēng)險減低和效率提高的服務(wù)型企業(yè)將是開源代碼的最大受益者。
           我現(xiàn)在在拼命的研究AJAX技術(shù),感覺用戶體驗是有了,但是又增加了寫程序的能力,頁面和實際業(yè)務(wù)不能夠完全分離,不知道這個東東能生存多久。AJAX的出生和用戶對“點擊->返回”的上網(wǎng)體驗都是不久的事,哪個將取得領(lǐng)導(dǎo)地位,還拭目以待。

          posted @ 2006-03-30 13:43 @家軍 閱讀(817) | 評論 (0)編輯 收藏

          我的信仰地圖[引用 zbw25]

          {只為學(xué)習(xí),并無其它目的}
          一、概念界定
            前一段時間在和李杜韓兄討論儒家是否宗教的問題,當(dāng)時我答應(yīng)他,要好好想一想,給出一個自己的關(guān)于宗教的定義。在這段時間里,我 始終在思考這個問題。終于我決定將問題放在一個更加廣闊的范圍內(nèi)來進行思考,這就是,什么是宗教?什么是科學(xué)?這個問題似乎反而簡單了。在不進行更加深入 地思考的情況下,我可以先給出科學(xué)的定義:科學(xué)是用理性的、邏輯的方式看待世界的觀點,以及方法論。也可以這樣說:科學(xué)就是以理性和邏輯的方法為特征的世 界觀和方法論。這樣的定義還可以進一步解釋為,以理性和邏輯的態(tài)度,來探索世界,形成結(jié)論,并以此指導(dǎo)自己的生活。那么宗教呢,宗教同樣對世界進行探索, 形成結(jié)論,并以此指導(dǎo)自己的生活。馬克思主義的說法是:宗教的顛倒了的世界觀,我并不如此認(rèn)為,這是完全站在以我為中心的立場來對宗教信仰的評價。這個問 題,我下面還要詳細(xì)分析。因此,我對宗教的定義是:以一種崇拜的、神秘主義的心態(tài),來探索世界,形成結(jié)論,并以此來指導(dǎo)自己的生活。這樣就稱之為宗教。?
             這里要解釋一下理性的、邏輯的心態(tài)與崇拜的、神秘主義的心態(tài)的區(qū)別,前者相信,人類對世界的探索,將不斷的接近真理,也就是說,世界是可知的,我們所生 存的世界,對于科學(xué)來說,就是各種各樣可以研究的對象,可以看成一個整體,也可以分別研究,從科學(xué)研究的可行性角度來看,對世界的研究首先意味著對問題的 分解,也可以說是對世界的分解。因此,科學(xué)很容易的就導(dǎo)向無神論(無神論與科學(xué)并不等同,這一點下面再詳細(xì)分析)。而崇拜的、神秘主義的心態(tài),首先就認(rèn)為 這個世界是一個整體,而且是一個人類永遠(yuǎn)無法徹底把握的整體。面對浩淼蒼穹,無盡時空,人類唯有贊嘆造化的神奇,并越發(fā)深切的意識到自己的渺小。但是這樣 的態(tài)度并非不可知論,因為,以宗教的態(tài)度看待世界的人,同樣在探索世界,而且從未停止。?
            在這樣一個框架下,我們同樣可以定義哲學(xué),哲學(xué)是另 一種態(tài)度,面對世界萬物,哲學(xué)家是思辨的。他們以一種思辨的心態(tài)來探索世界,形成結(jié)論,并以此來指導(dǎo)生活。思辨與邏輯不同,對于邏輯來說,對就是對,錯就 是錯。而對于思辨來說,對也可能是錯,錯也可能是對。在我看來,一切哲學(xué)都是思辨的,這與馬克思哲學(xué)中的形而上學(xué)/辯證法的概念,并不一致。思辨、狡辯、 詭辯等等都只有一線之隔,而真正的哲人,因為一定可以繼續(xù)思辨而否定自己,所以最終的結(jié)果要么是發(fā)瘋;要么是停止思辨,開始建立自己的理論體系。而后來的 哲學(xué)家,就可以在他的思考、思辨停止的地方,開始對他的反駁。也正是由于哲學(xué)的思辨的本質(zhì),因此哲學(xué)體系的種類最多,最為千差萬別,有的像科學(xué),有的像宗 教,有的什么都不像,而自成一家。?
            再界定兩個概念,知道與信仰。我可以知道自己有左右兩只手,而無需信仰自己有兩只手。所謂信仰,可以定義 為對于無法證明的命題的確信。我們知道,宗教中的絕大多數(shù)命題都是無法證明的,因此我們同樣都將宗教和信仰連起來表達。而對于科學(xué),我們往往會認(rèn)為這不是 信仰,因為科學(xué)結(jié)論都是可以證明的,但是問題并沒有這么簡單,因為科學(xué)體系是建立在公理體系的基礎(chǔ)上的,而公理體系是無法證明的,因此對科學(xué)的信心,也可 以稱之為信仰,當(dāng)然這樣的信仰需要“糊弄過去”的地方只有少數(shù)的一些公理和常數(shù)。相對來說比宗教要“好”很多。但是無神論并不是這樣,我們可以馬馬虎虎不 將科學(xué)算成信仰的一種,但是無神論,卻一定是一種信仰,因為這同樣是對無法證明的命題的確信。?

          二、儒家的定位?
            現(xiàn)在,基于 已經(jīng)明確的定義,我們可以繼續(xù)回到對儒家問題的討論上來了。儒家肯定不是科學(xué),也不是單純的宗教,我們可以很清楚地界定,儒家同樣是以一種崇拜的、神秘主 義的心態(tài),來探索世界,形成結(jié)論,并以此來指導(dǎo)自己的生活。儒家對天的崇拜,以及對天道、天命的近乎神秘主義的信仰,可以說是一種很典型的宗教的心態(tài)。?
             但是,問題到這里并沒有結(jié)束,因為我們還需要區(qū)分儒家這樣的宗教,與其他的宗教有什么區(qū)別,為什么對于儒家是否宗教的問題,有著如此多的爭論,而在其他 的宗教上幾乎沒有這樣的疑問。按照李杜韓兄的理解,認(rèn)為儒家是一種“準(zhǔn)宗教”,但是什么是“準(zhǔn)”呢?為什么會“準(zhǔn)”呢?為什么就不能明確的分析出,儒家與 其他的宗教的真正的區(qū)別所在呢??
            在我看來,絕大多數(shù)的宗教,都是起源于人類對于“生死”問題的思考,個人問題,是宗教探討的當(dāng)然的出發(fā)點。 但是,這正是儒家與其他宗教的區(qū)別所在。在基督教的論述中,“永生”是一個重要的命題,進天國,得永生,是基督徒所能得到的最大的恩典;而在佛教的論述 中,“出六道輪回”是每個佛教徒的追求—即使不是最高追求;而在道教的論述中,“長生不老”是值得追求,也是可能達到的目標(biāo)。這些宗教—我對其他的宗教不 太熟悉—所共有的特征是面向個人的,是“我”的追求目標(biāo),或是“我”能得到的恩典。這些宗教對人的教導(dǎo)中都有“向善”的成分,但是都是達到目標(biāo)的手段—甚 至在基督教不承認(rèn)任何手段的有效性,只要求絕對的信仰—或方法。因此通常的表述是:“如果你如何如何,你就能怎樣怎樣”。?
            但是在儒家,個人 問題幾乎是完全不被考慮的,社會、他人、國家、天下才是真正重要的。正心、誠意是為了修身,而修身是為了齊家、治國、平天下。對自己下功夫,并不是為了自 己,而是為了比自己更加廣大的,更加重要的事情。天理是重要的,人欲是可以忽略的。這樣的區(qū)別非常明顯,其他的宗教,一切的追求、行為,無論是對他人、社 會還是對自己,最終的目的都是為了“自己”。所有的努力,甚至“熄滅自己欲望”的努力,也是為了實現(xiàn)自己最大的欲望。但是,儒家從來就不告訴你:“信了我 的教,你能如何如何”。也可以這樣說,儒家從來都不會“利用一個人的私人欲望,來引人入教”。這也就是為什么歷史上有這么多的邪教,而這些邪教的理論根 源,或借鑒者,可能是基督教、佛教、道教或者其他的什么宗教,但從來沒有借鑒過儒教,因為在儒家的理論中,不提供“滿足個人欲望的可能性”。儒家從來只告 訴他的信徒:“你要成為君子,你要憂國憂民,你要……”,卻從來沒有告訴他的信徒:“成為君子后,你有什么樣的好處……”。?

          三、三種宗教的區(qū)別?
            在論證了儒家與其他宗教的重大區(qū)別之后,我們可以來討論一下道教、佛教與基督教之間的區(qū)別所在。?
            他們之間的相似之處是很明顯的,這三種宗教都非常的關(guān)注“生死”問題,但是如何解決這個問題呢?三種宗教卻給出了不同的答案。?
             為了解答“生死”問題,這三種宗教都非常的關(guān)注“時間”、“始終”等等命題,但是對于道教來說:“道生一、一生二、二生三、三生萬物”,可以說是一個無 窮無盡的過程,因此在道教看來,“時間是有始無終的”。而對于佛教來說,時間即沒有開始,也沒有結(jié)束,因此“時間是無始無終的”。對于基督教來說,上帝是 一切的創(chuàng)造者,當(dāng)然也包括時間,一直到最終的審判,“時間是有始有終的”。?
            因為“時間是有始無終的”,所以對于道教來說,向前看是沒有意義 的,回去是唯一有意義的事,在老子的“小國寡民”的理想確定無法實現(xiàn)之后,作為個人回到過去,回到道,成為唯一的出路。因此,在道家看來,不斷的修煉自 己,最終成仙,并不是向前的進步,而是回到了本源,回到了自己的出發(fā)點。?
            因為“時間是無始無終的”,所以對于佛教來說,這世間的一切都沒有意義,因為如果有無限的時間,那么世界一定會不斷的重復(fù),人就在六道中輪回,承受著永遠(yuǎn)的痛苦。唯一的出路,是跳出來,不但要跳出這個世界,甚至要跳出所有的“時間和空間”。?
            因為“時間是有始有終的”,所以對于基督教來說,一切都是掌握在上帝的手中,沒有人能夸耀自己的努力,沒有人能憑借自己的奮斗而找到出路,唯一的道路就是“信”,其他的一切作為,都只具備世間的意義,而沒有永恒的價值。?
            三種宗教的理論基礎(chǔ),已經(jīng)如上所分析,而作為世界上的真實存在的宗教,一定會面臨具體的“實踐”問題,或者說如何判斷一個實踐是否符合理論的問題。?
             判斷的困難在道教基本上不存在,因為這是一個明確的以目的為導(dǎo)向的宗教,是否正確,只看你是否有效果,這樣的“實用主義”,避免了很多理論上的爭論,乃 至人格上的判斷。只要成了仙,就一定得了道。甚至煉丹都可以由別人來進行,自己只要吃了就可以。因此道教的基本發(fā)展歷程,就是一個不斷探索的過程,如何才 能更有效地成仙,不妨百家爭鳴,不妨百花齊放,只要有效,一切都是值得的。這也就是為什么道教的歷史最少爭論,也最少理論派別的原因。而這樣的弊端就是什 么歪門邪道都有可能混入道教,使得道教成為一個名副其實的大雜燴。?
            佛教對于判斷的問題,存在兩面性,既有很多外在的判斷標(biāo)準(zhǔn),又相信“如人 飲水,冷暖自知”的最高境界。佛陀的“相貌、神通、舍利子”乃至“智慧”,成為常用的外部標(biāo)準(zhǔn)。而在佛教中又有很多關(guān)于“次第”的論述,似乎成佛是可以循 序漸進,有跡可查的。然而事情并非如此簡單,因為,外在的標(biāo)準(zhǔn)并不符合佛教的基本教義,因為一切表象,皆是因緣合和而成,并非根本,所以是否成佛,還需要 某種“未知的”方法的驗證。這種方法沒有人知道如何描述,但是已經(jīng)公認(rèn)的大師,則有權(quán)通過這樣的方法來作出判斷。所以在佛教會出現(xiàn)比道教多得多的派別,特 別是到了禪宗以后,佛教的派別、分化就會越來越多,因為判斷沒有公認(rèn)的標(biāo)準(zhǔn),只以權(quán)威的意見為轉(zhuǎn)移。?
            基督教對于判斷的問題,最為頭疼,因為 根據(jù)基督教的基本教義,人的一切行為,表象,都不能成為判斷的依據(jù),這一點基督教比佛教執(zhí)行的嚴(yán)格得多。而這樣導(dǎo)致的后果就是無休止的爭論與不斷的分化。 基督教對于教會的純潔性是最為注重的,這樣導(dǎo)致的結(jié)果,并不是教會的純潔,而是不同教派之間的“水火不容”,甚至“你死我活”。因為我無法從理論上駁倒 你,又無法實際的證明給你看,只能殺了你,才能證明上帝是站在我這一邊的。但是這樣不能解決任何問題,所以現(xiàn)在基督教的派別是世界上最多的,而這些派別之 間的矛盾,也是最為尖銳的。?

          四、無用的哲學(xué)?
            之所以說“無用的哲學(xué)”,其實并沒有什么貶義,而是我認(rèn)為,從哲學(xué)的本質(zhì)來說,他就應(yīng)該是“無用的”。如果哲學(xué)變得很有用,就會十分危險,非人類之福。?
             根據(jù)我前面的定義,哲學(xué)是一種以思辨的心態(tài),來探索世界,形成結(jié)論,并以此來指導(dǎo)自己的生活的方式。出于這樣的一種心態(tài),哲學(xué)成為人類智力的終極樂園, 古往今來,無數(shù)的人思考哲學(xué)問題,并沉醉其中,而哲學(xué)的問題沒有一個得到解決—在科學(xué)意義上的得到最終答案—或者獲得公認(rèn)。我們甚至可以斷言,一切的哲學(xué) 問題,都永遠(yuǎn)不可能有最終的確定的答案,這也正是哲學(xué)的魅力所在。?
            為什么哲學(xué)不能得出公認(rèn)的結(jié)果呢?這有兩個方面的原因,一方面是由于哲學(xué)的本質(zhì),另一方面是由于人的本性。?
             從哲學(xué)的本質(zhì)來說,這是一種心態(tài),一種永遠(yuǎn)試圖再換一種方式思考的心態(tài),或者我們可以褒義的稱之為:“不斷思考得更加深入。”而哲學(xué)的思考對象又是全世 界,如此的復(fù)雜,如此的難以概括,如此的千差萬別。而哲學(xué)又試圖從整體上來把握整個世界,因此一定會有無數(shù)個答案,而且一定無法確定哪一種答案是最優(yōu)解 答。?
            對于人的本性來說,哲學(xué)思考是一種最好的智力游戲。因為不需要站在巨人的肩膀上,不需要繼承已有的哲學(xué),最值得贊賞的努力是開創(chuàng)全新的 體系,如果做不到,也可以創(chuàng)造全新的表述方式。前人的努力,與其說是繼承的財富,到不如說是批判的目標(biāo)。能夠批判前人,提出自己的觀點,能夠使人得到最大 的滿足,因為哲學(xué)是回答最重要的問題的學(xué)問。?
            似乎我這樣講,將哲學(xué)過于貶低了,其實并不是這樣,因為這正是哲學(xué)的偉大所在。只有了解的哲學(xué) 的本質(zhì),才會相信,人人都能進行自己的思考,得出自己的結(jié)論,有這樣的心態(tài)人,我們稱之為有哲學(xué)精神的人,如果將這樣的精神貫穿整個人生,我們就稱之為 “哲人”,例如我們所尊敬的偉大的蘇格拉底。哲學(xué)的最大的用處是作為“解毒劑”,但是哲學(xué)不能變成有用的結(jié)論,哲學(xué)會變質(zhì),有可能變成宗教,有可能變成政 治,有可能冒充科學(xué),這樣的有用,非常危險。?

          五、有限的科學(xué)?
            說科學(xué)是有限的,同樣沒有貶低的意思。因為根據(jù)科學(xué)的本質(zhì),他就一定是有限的。?
             科學(xué)作為一種以理性和邏輯的態(tài)度,來探索世界,形成結(jié)論,并以此指導(dǎo)自己的生活的學(xué)問,他的本質(zhì)就是不斷的懷疑與驗證,如果有人為了懷疑而懷疑,毫無意 義,而為了驗證而驗證,只能說是迷信或者說是偽科學(xué)。既然科學(xué)是一個不斷懷疑與驗證的過程,而且出于理性與統(tǒng)一的邏輯,科學(xué)必然是一個整體。打個簡單的比 方,當(dāng)年亞里斯多德在地上畫的那個關(guān)于知識的圈,是一個而且只能是一個圈。如果在這個知識的圓圈之外另有一個“飛地”,那只能稱之為科學(xué)猜想,只有在將來 的某個時刻,這個猜想得到了驗證,這塊“飛地”才能和大圈連在一起,成為科學(xué)知識的一部分。?
            附帶說一句,我并不認(rèn)為社會科學(xué)是科學(xué)的一種,在我看來,所有的社會科學(xué),只是哲學(xué)思考擴大化之后對科學(xué)的模仿。這也就是為什么自然科學(xué)基本上沒有什么派別,而社會科學(xué)卻流派紛呈的原因。?
             科學(xué)是有限的,而世界是無限的—也正是由于科學(xué),我們才能像今天這樣深切的認(rèn)識到世界的無限性—這就意味著科學(xué)永遠(yuǎn)也無法窮盡整個世界,科學(xué)的有限性不 但是必然的,而且是絕對的。真正的科學(xué)家,或者具有科學(xué)精神的人,永遠(yuǎn)都遵循著懷疑、驗證的規(guī)律,而不會混淆知識與假想的界線。?
            說到這里, 我倒是想起了一件很有趣的事情,當(dāng)年特異功能流行的時候,錢學(xué)森與**之間有一場激烈的爭論,我們知道,錢學(xué)森是一個科學(xué)家,而**是一個—怎么說呢,就 算是—社會科學(xué)家吧。他們的態(tài)度截然不同,錢學(xué)森認(rèn)為這種現(xiàn)象值得研究,而**則大力反對,或者說科學(xué)立場比錢學(xué)森還要堅定。這就是科學(xué)家與信仰科學(xué)者的 區(qū)別。?
            現(xiàn)在我們開始大力提倡尊重科學(xué),學(xué)習(xí)科學(xué)知識。但是真正要學(xué)習(xí)的是什么呢?是科學(xué)精神,一種偉大的,永遠(yuǎn)不自以為是的精神。而不是為了維護某種“科學(xué)結(jié)論”卻喪失了進一步探索的勇氣。?

          六、我的信仰選擇?
             對于我來說,選擇一種信仰其實分為兩個階段,在寫這篇文章之前,我處在一種漫無目的的摸索階段,就好像一個叢林中的迷路者,找不到方向,更不要說出路。 但是通過前面的思考,我為自己的畫出了地圖—一幅關(guān)于信仰的地圖。于是在我來說,選擇信仰的問題變得簡單,并且有效。?
            當(dāng)然,這個問題也可以 反過來看,就是我首先是確定了自己的信仰,然后開始尋找理論上的支撐,通過論證自己的信仰選擇的合理性,使我可以更加有把握的走下去。不管怎么說,這是一 個良性循環(huán)的開始,信仰堅定了理論,而理論又更加堅定了信仰。也可以說,這樣的方式才是信仰式、而非思辨式的。?
            首先要做的第一個選擇題是, 是否需要信仰,也可以說,這個世界存在著兩種人,有信仰的人和沒有信仰的人,我要選擇做什么樣的人,我要選擇一種什么樣的生活。有兩種人可以沒有信仰,一 種是混混僵僵的人,這種狀態(tài)可以簡單的稱之為“快樂的豬”,如果一個沒有開始思考信仰的問題,他可以停留在這個狀態(tài),但是一旦他開始思考,就再也沒有可能 回到混混僵僵的狀態(tài),對于我來說,這是一個不可能的選擇。?
            另一種沒有信仰的人,是有著各式各樣?“現(xiàn)實追求”的人,這樣的可以一輩子的不考 慮信仰問題,而生活得很充足,很忙碌。但是這樣的人,他的目標(biāo)是否達到,并不取決于自己,而是取決于別人的評價,所有的“成功、金錢、地位、名譽”,如果 不被別人承認(rèn),就什么都不是。我并不虛偽的反對這樣的追求,但是如果只有這樣的追求,人生是不完整的,可以說這樣的人完全是為了別人的評價而活著,卻沒有 為自己而活著。這樣的人,尼采稱之為“駱駝”。我不愿意做這樣的“駱駝”,因此需要繼續(xù)作下面的選擇題。?
            在我的“信仰地圖”中,有三個大的 方向,科學(xué)、哲學(xué)與宗教。有人選擇科學(xué)作為信仰,也有人選擇哲學(xué)作為信仰,但是在我看來,無論是科學(xué)還是哲學(xué),其基本的精神,都與信仰格格不入。當(dāng)你成為 科學(xué)的信徒,你就違背了科學(xué)的精神;當(dāng)你成為哲學(xué)的信徒,你就違背了哲學(xué)的精神。這樣的人,在世界上的確不少,而且也的確在為害著這個世界。從歷史上來 看,科學(xué)的信徒與哲學(xué)的信徒,為害世界的事情還真不少。也許有人要問,宗教的信徒不也一樣為害世界嗎?但是區(qū)別在于,宗教的信徒只是“可能”為害世界,而 科學(xué)與哲學(xué)的信徒,則一定會為害世界。?
            有人也許還要問,我是科學(xué)的信徒,但是我信仰的是科學(xué)的精神,難道也會為害世界嗎?科學(xué)的精神,當(dāng)然不會為害世界,但是這樣的精神只是探索世界的一種方法,他只需要遵循,而不需要信仰。只存在是否嚴(yán)格遵循的問題,而不存在是否相信的問題。?
             同樣的問題,也會有人問出來而為哲學(xué)辯護,在我看來,最好的哲學(xué)與最好的科學(xué)一樣,一個使人奮進,一個使人冷靜。科學(xué)的生命力在于始終遵循科學(xué)的精神, 而哲學(xué)的生命力在于不斷的反思自身,甚至于整個哲學(xué)的基礎(chǔ)。科學(xué)如果被人信仰,最多是科學(xué)的發(fā)展受阻,哲學(xué)如果被人信仰,整個社會的發(fā)展都有可能受阻。?
            既然科學(xué)和哲學(xué)都不可能成為我的選擇,那么選擇題就要繼續(xù)進行,在我的“信仰地圖”中,宗教又分為兩個大類,一種是以個人為中心,另一種則是以社會為中心。前者包括了佛教、道教以及基督教等等眾多宗教,后者則主要以儒家為代表。?
             以個人為中心的宗教很容易吸引人,因為這樣的宗教討論的問題是以“我”為中心的,解決的也是“我”的問題。當(dāng)一個發(fā)現(xiàn)自己不應(yīng)該為了別人的評價而活著的 時候,首先會想到的選擇就是為了自己而活。當(dāng)一個人發(fā)現(xiàn)對于外在的追求不再有吸引力的時候,走向自己的內(nèi)心就成為唯一的方向。?
            在中國古代, 儒家遭受了普遍的誤解,就是因為儒家的追求很像是向外的追求,讀四書五經(jīng)是為了做官,參加科舉是為了功名利祿,所有的這些追求都可以說是外在的,世間的, 無常的。但是儒家信仰,與功名利祿追求,存在著重大的區(qū)別,一種是為了別人的評價而活,另一種卻只是純粹的為了別人而活,別人的評價是指向自己的,說到底 是為了滿足自己的欲望,只不過這樣的欲望需要通過別人的評價而得到滿足。而儒家的信仰不是這樣的一種個人欲望,這樣的追求中沒有一個“我”的存在。?
             無論是對世間功名利祿的追求,還是對于宗教的、出世間的追求,核心的理由都是為了“我”,只不過追求的目標(biāo)一則現(xiàn)實,一則縹緲而已。因此,到了現(xiàn)在這個 社會,當(dāng)儒家學(xué)說失去了科舉做官的現(xiàn)實用途之后,要想使人信仰他,就變得非常的困難,因為他從不滿足“我”的欲望,也從不許諾各種個人的好處。他的吸引力 就幾乎不存在了,而現(xiàn)在的儒家信徒也就幾乎不存在了,除了一些大專院校的儒家學(xué)說研究者,幾乎沒有人還會再接觸儒家的思想,更不要說產(chǎn)生信仰了。?
            但是,我的選擇,最終還是儒家信仰,有很多可以說的理由,而最大的理由,就是因為這種信仰不是為了自己。有很多名人名言深深地打動了我,例如:“先天下之憂而憂,后天下之樂而樂”、“為國為民,俠之大者”、“為天地立心、為生民立命、為往圣繼絕學(xué)、為萬世開太平”。?
            說到這里,我的這篇文章也就算結(jié)束了,但是關(guān)于儒家的話題,這卻只是一個開始,畢竟可以討論的東西,真的很多。

          posted @ 2006-03-24 11:22 @家軍 閱讀(490) | 評論 (1)編輯 收藏

          世界不在意你的自尊

          (考慮再三,還是要轉(zhuǎn)貼一些有用的話)
          比爾蓋茨十條職場箴言曝光:世界不在意你的自尊
          1.生活是不公平的,要去適應(yīng)它;
          2.這世界并不會在意你的自尊,這世界指望你在自我感覺良好之前先要有所成就;
          3.高中剛畢業(yè)你不會成為一個公司的副總裁,直到你將此職位掙到手;
          4.如果你認(rèn)為你的老師嚴(yán)厲,等你當(dāng)了老板再這樣想;
          5.如果你陷入困境,不要尖聲抱怨錯誤,要從中吸取教訓(xùn);
          6.在你出生之前,你的父母并非像現(xiàn)在這樣乏味。他們變成今天這個樣子是因為這些年來他們一直在為你付賬單,給你洗衣服,聽你大談你是如何的酷;
          7.你的學(xué)校也許已經(jīng)不再分優(yōu)等生和劣等生,但生活卻仍在作出類似區(qū)分;
          8.生活不分學(xué)期,你并沒有暑假可以休息,也沒有幾個人樂于幫你發(fā)現(xiàn)自我;
          9.電視并不是真實的生活,在現(xiàn)實生活中,人們實際上得離開咖啡屋去干自己的工作;
          10.善待乏味的人,有可能到頭來會為一個乏味的人工作。

          posted @ 2006-03-21 11:06 @家軍 閱讀(345) | 評論 (0)編輯 收藏

          TOMCAT內(nèi)存溢出之解決方法

          問題表現(xiàn):

          當(dāng)用戶執(zhí)行一個大數(shù)據(jù)的應(yīng)用時(凈字節(jié)碼量約為5M)時,系統(tǒng)會提示出錯:

          前臺錯誤為:HTTP Status 500-Dispatch[EAITool] to method listCurTree retrun an exception

          (以下省略)

          ………………………………………………………

          ………………………………………………………

          后臺錯誤為:java.lang.OutOfMemoryError: unable to create new native thread
                  at java.lang.Thread.start(Native Method)
                  at org.apache.catalina.loader.WebappLoader.notifyContext(WebappLoader.ja
          va:847)

          (以下省略)

          ………………………………………………………

          ………………………………………………………

          問題分析:

             由于TOMCAT內(nèi)存溢出而引發(fā)的問題,主要原因是JVM的虛擬內(nèi)存默認(rèn)為128M,當(dāng)超過這個值時就把先前占用的內(nèi)存釋放,而導(dǎo)致好象TCP/IP丟包的假象,出現(xiàn)HTTP500的錯誤。  
               
          解決方法主要是加大TOMCAT可利用內(nèi)存,并在程序當(dāng)中加大內(nèi)存使用。

          解決方法:

          方法:加大TOMCAT可利用內(nèi)存:
            在TOMCAT的目錄下,也就是在TOMCAT41/bin/catalina.bat文件最前面加入
            set JAVA_OPTS=-Xms800m -Xmx800m
            表現(xiàn)效果是當(dāng)你啟動TOMCAT時,系統(tǒng)內(nèi)存會增加近800M使用

          操作方法:
            1)、先關(guān)掉WINDOWS服務(wù)當(dāng)中的TOMCAT4服務(wù)。
            2)、再找到TOMCAT/BIN目錄下startup.bat,雙擊打開它,你會發(fā)現(xiàn)現(xiàn)WINDOWS內(nèi)存占用會增加近800M
            3)、執(zhí)行程序,因為是TOMCAT重新編譯程序,所以第一次會比較慢。

          結(jié)論:

          經(jīng)過測試,我們得出如下數(shù)據(jù):

          當(dāng)系統(tǒng)傳輸約2000條數(shù)據(jù)時,大約近12M的凈數(shù)據(jù)(不壓縮時),系統(tǒng)輔助運行的內(nèi)存大約占用150M左右的空間,也就是近200M的內(nèi)存占用,而我們擴大了近800MJAVA內(nèi)存使用,這對于業(yè)務(wù)本身來說是足夠了。所以你們不用擔(dān)心大數(shù)據(jù)量的傳遞問題。

          基于JAVA虛擬機的原理,JAVA自動有垃圾回收機制,也就是在你對一些內(nèi)存長時間不使用時(近2分鐘,取決于使用頻度和優(yōu)先級等),就會自動垃圾回收,從而釋放不用的內(nèi)存占用。

          posted @ 2006-03-10 14:15 @家軍 閱讀(9118) | 評論 (2)編輯 收藏

          MYSQL BUG #5020及解決方法

          MYSQL BUG #5020
          描述:
             MYSQL網(wǎng)站BUG公示
          錯誤MESSAGE:
              
          Connection was closed due to the following exception:

          ** BEGIN NESTED EXCEPTION ** 

          java.sql.SQLException
          MESSAGE: Communication link failure: java.net.SocketException, underlying cause: Software caused connection abort: recv failed

          ** BEGIN NESTED EXCEPTION ** 

          java.net.SocketException
          MESSAGE: Software caused connection abort: recv failed

          STACKTRACE:

          java.net.SocketException: Software caused connection abort: recv failed
              at java.net.SocketInputStream.socketRead0(Native Method)
              at java.net.SocketInputStream.
          read(SocketInputStream.java:129)
              at java.io.BufferedInputStream.fill(BufferedInputStream.java:
          183)
              at java.io.BufferedInputStream.read1(BufferedInputStream.java:
          222)
              at java.io.BufferedInputStream.
          read(BufferedInputStream.java:277)
              at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:
          1385)
              at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:
          1532)
              at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:
          1923)
              at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:
          1163)
              at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:
          1272)
              at com.mysql.jdbc.Connection.execSQL(Connection.java:
          2236)
              at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:
          1555)
              at net.sf.hibernate.impl.BatcherImpl.getResultSet(BatcherImpl.java:
          89)
              at net.sf.hibernate.loader.Loader.getResultSet(Loader.java:
          880)
              at net.sf.hibernate.loader.Loader.doQuery(Loader.java:
          273)
              at net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:
          138)
              at net.sf.hibernate.loader.Loader.doList(Loader.java:
          1063)
              at net.sf.hibernate.loader.Loader.list(Loader.java:
          1054)
              at net.sf.hibernate.hql.QueryTranslator.list(QueryTranslator.java:
          854)
              at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:
          1554)
              at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java:
          1531)
              at net.sf.hibernate.impl.SessionImpl.
          delete(SessionImpl.java:1678)
              at net.sf.hibernate.impl.SessionImpl.
          delete(SessionImpl.java:1664)
          出錯原因:
             我們的系統(tǒng)一天24小時運行,但在夜晚的時候是沒有人連接的,因此Socket連接就超時了。早上嘗試做任何事情(比如:登錄)都將以失敗告終,除非我們關(guān)閉連接或者重新建立連接。3.0.11后才會發(fā)生這種情況。
             現(xiàn)在我們使用的MYSQL版本號為4.016,問題一樣。
          專家建議:
             [Mark Matthews],翻譯如下:
             注意:我不贊成Autoreconnect功能,在以后的發(fā)行版本中,它最終會被移除。在這種特殊情況下, 它不起作用的原因是:在3.0.11以后,autoreconnect的方法變得更加安全了并且和阿utoCommit狀態(tài)有關(guān)聯(lián),這樣的話就能使當(dāng)前‘in-flight’事務(wù)失敗(如果你在失敗后,再次試圖連接事務(wù),就會重新被連接)。請查看相關(guān)解釋文檔,文檔的修復(fù)故障中包括如何正確實用這個屬性。無論在哪種情況下,   如果TCP/IP在沒有連接的情況下并且還不會冒著數(shù)據(jù)庫被癱瘓的危險,是沒有百分之百的方式使得JDBC驅(qū)動器被自動重連接的,這也是為何要移除Autoreconnect功能的原因。不管網(wǎng)絡(luò)發(fā)生什么情況,    JDBC 都不會說明這個連接是否處于連接狀態(tài)。JDBC driver 客戶端負(fù)責(zé)處理網(wǎng)絡(luò)故障,只有應(yīng)用程序本身(實際上是應(yīng)用程序的開發(fā)者)知道如何正確應(yīng)對事務(wù)失敗的情況。在服務(wù)器上過期的‘Waittimeout’基本上是服務(wù)器給與的強制性網(wǎng)絡(luò)故障。你通過把‘Waittimeout’設(shè)置的高點兒就可以改正它,盡管如此,作為一個開發(fā)者,你的代碼應(yīng)該包含相關(guān)的異常處理并采取適當(dāng)?shù)幕謴?fù)措施,不要都把它們傳到調(diào)用堆中。
             連接錯誤總是有一個SQL狀態(tài)‘08’。如果你發(fā)現(xiàn)它的話,你可以再連接一次并重試事務(wù)(如果是適當(dāng)?shù)脑挘?/span>
             不管什么原因,如果這樣不起作用的話,配置你的連接池來測試是否處于連接狀態(tài)并且那些長時間閑置連接(所有的連接池都能這樣做,但是它們的配置取決于池子)。
          作者說明:在MYSQL4.1以后的版本當(dāng)中,沒有“wait_timeout”變量,由
          interactiveClient代替
          參考資料:http://dev.mysql.com/doc/connector/j/en/cj-configuration-properties.html
               [
          Kirk Wylie]:翻譯如下:
             
          如果有一個事務(wù)在運行的話,就能得到一個特別簡單的例子:
              
          ---如果連接在autoCommit模式下,autoReconnect是安全的。
              
          ---如果連接不在autoCommit模式下,但是沒有打開的事務(wù),autoReconnect是安全的。(因為連接可能在池在里面)
              ---如果連接不在autoCommit模式下,有打開的事務(wù),這樣就會拋出異常。
             
          這樣會解決你不在autoRecom\nnect模式下的憂慮并且會保留應(yīng)用程序的功能性。
             盡管如此,在它改變的時候,在改變?nèi)罩局袥]有任何記錄說明發(fā)生了改變,這點令我很煩。由于這種改變很可能破壞我的應(yīng)用程序,這種變化因該添加到CHANGE文件中。

            如下是我個人的做法:
            (STRUTS+SPRING+HIBERNATE)
            1、把mysql的變量
          interactiveClient由 默認(rèn)的28800(8個小時)延長。并告知用戶多長時間后,重新啟動TOMCAT服務(wù)器。不過,MYSQL5.0.12版本以前的所有版本,只要你設(shè)置成 了默認(rèn)語言為GBK,所有對interactive_timeout(wait_timeout)的時候如何設(shè)置,重新連接或者重新啟動MYSQL后,都 是28800,現(xiàn)在我使用的5.0.18后,使用GBK,沒有問題。
            2、在HIBERNATE當(dāng)中加入:
             
          ..
          <property name="hibernate.connection.url">jdbc:mysql://192.168.100.111/eai?autoReconnect=true</property>
          <property name="enableDeprecatedAutoreconnect">true</property>
          <!--  如下的語句是使用第三方的DBCP來建立連接池 -->
          <property name="dbcp.maxActive">100</property>
          <property name="dbcp.whenExhaustedAction">1</property>
          <!--  看到了沒有,這個maxWait一定要大于MYSQL默認(rèn)的28800(秒) -->
          <property name="dbcp.maxWait">30000</property>
          <property name="dbcp.maxIdle">10</property>

          <property name="dbcp.ps.maxActive">100</property>
          <property name="dbcp.ps.whenExhaustedAction">1</property>
          <property name="dbcp.ps.maxWait">30000</property>
          <property name="dbcp.ps.maxIdle">10</property>
          ..
              
           如上兩種方法均可,推薦大家使用第二種方法,來遮擋一下MYSQL的BUG。
          如果有不對之處,請大家提出自己的見解。

          posted @ 2006-01-18 14:48 @家軍 閱讀(5694) | 評論 (0)編輯 收藏

          2006年之創(chuàng)業(yè)狂想

            風(fēng)風(fēng)雨雨幾年IT生涯,從剛剛開頭不敢說一句話,到現(xiàn)在在企業(yè)工廠與客戶指點江山,答疑解惑,好不勝哉。
            ERP的實施和開發(fā)將影響我一生的IT生涯,我也致力探索其技術(shù),交流發(fā)布其管理思想,不過2005年讓我在技術(shù)的領(lǐng)域里磨礪著這把劍,呵呵,夢寐以求的J2EE技術(shù)有所長進,不過還需要再接再厲,更上一層樓。
            這一年來,我看好開源代碼給人們的生活帶來的實惠和方便,我也曾經(jīng)預(yù)言開源代碼將為我淘得第一桶金。可能是時機未到或者自己修煉還未果吧,至今還要努力學(xué)習(xí)。
            所以,我的最大快樂就是技術(shù)轉(zhuǎn)化成生產(chǎn)力,讓企業(yè)的應(yīng)用上一個新的臺階,讓管理的先進思想長駐企業(yè)內(nèi)部。
            我想,2006年,有必要創(chuàng)業(yè):
               創(chuàng)立一個利用開源代碼引導(dǎo)應(yīng)用為主的論壇。
               初步的分類可以使用現(xiàn)在www.open-open.com的分類來做。
               與www.open-open.com網(wǎng)站建立聯(lián)盟關(guān)系。
               我的工作表現(xiàn)在對網(wǎng)站的管理上,發(fā)表原創(chuàng)及使用感受。提倡開源代碼當(dāng)中的管理思想。
               還要加入PHP、PYTHON等新一代解釋性語言帶來的開源思想等。
               最終目標(biāo)要扶植幾家軟件企業(yè)應(yīng)用開源代碼來做應(yīng)用,或者利用開源代碼二次開發(fā)等。
               理想目標(biāo)是一到兩家公司使用開源代碼,我們做服務(wù)和二次開發(fā)工作。
            另外,從GOOGLE上,感覺到國內(nèi)對藝術(shù)、字畫和古玩有熱衷的傾向,所以我想做一個交流平臺。
            這個平臺可以簡單描述為:
               藝術(shù)家或者收藏家可以通過一定的流程,發(fā)布自己的作品和藏品,以照片為例。
               所有的藝術(shù)家或者收藏家都可以通過本網(wǎng)站的誠信通道由網(wǎng)站代理出售其作品或者收藏品。
               所有的網(wǎng)站注冊用戶可以選擇自己喜愛的作品進行交易。
               交易通道有兩個,一個與作品本人聯(lián)系,一個與網(wǎng)站代理聯(lián)系。(考慮中....)
                    所有的網(wǎng)站注冊用戶可以提出自己的個性化需求與藝術(shù)家或者收藏家給出答復(fù)。(贏利點)
               個性化的需求由本網(wǎng)站代理完成,從中得到應(yīng)有的費用。做為網(wǎng)站發(fā)展的基金。
            藝術(shù)和學(xué)問是一個知識分子追求的東西,還需要和藝術(shù)家和大學(xué)問家建立聯(lián)盟關(guān)系,擴大影響力。
                  

              加上兩幅圖片
            我和兒子
          259895602.jpg
           爺爺和孫子
          259895994.jpg

          posted @ 2006-01-12 15:57 @家軍 閱讀(502) | 評論 (2)編輯 收藏

          州牧下的羊叫

          古代的地方官員叫州牧,而牧民放牧的是羊和牛。
          我是一只小羊,等到黑夜來臨的時候,我在羊圈里看見在美麗的星空。一眨一眨的星星和皎潔的月亮。
          天空是美麗的,也是完美的,因為我永遠(yuǎn)都觸及不到她,所以她是神圣的。
          草原是美麗的,綠色和黃色深深的循環(huán)著我的生活。
          草原是險惡的,因為哪里有狼,因為哪里有虎豹。
          不過我不用害怕,因為牧羊人會幫助我把它們趕走,我不害怕。
          我最害怕的是沒有草和水喝,因為這里有牛和其它的動物在和我分食。
          我沒有了草吃,牧羊人會把我趕到一個豐盛的草場去。
          我沒有了水喝,牧羊人會把我趕到一個小河流去。

          呵呵,我沒有了憂郁。
          呵呵,這只是一個夢。就象美麗的天空一樣。

          我沒有了草吃,牧羊人不知道哪里有豐盛的草場,但是他發(fā)現(xiàn)了牛棚里還有草,所以他就去牛棚里背些草過來。可能我還沒有吃到,草已經(jīng)沒有了。

          我沒有了水喝,牧羊人不知道哪里有小河流,但是他發(fā)現(xiàn)了牛棚里還有水,所以他就去牛棚里背些水過來。可能我還沒有喝到,水已經(jīng)沒有了。

          于是我在彷徨,但是發(fā)現(xiàn)很多的牛已經(jīng)在侵占著我們的領(lǐng)域,僅有的草被他們吃光了,僅有的水被他們搶去了。

          我們只能向牛屈服,誰讓我們是羊呢?

          我在想,如果牧羊人:
              如果牧羊人能夠了解草場的規(guī)律的話,是不是可以讓牛和羊分別在不同的季節(jié)和不同的草場進食呢?
              如果牧羊人能夠深暗天理地勢的話,他能夠不辛苦的背水背草呢?
              如果牧羊人能夠按照天道地道來辦事的話,他是不是會得人道呢?
              人道才是真正的平民力量,也是大海里的海浪和波動。

          posted @ 2006-01-12 11:33 @家軍 閱讀(401) | 評論 (1)編輯 收藏

          2006年之夢境殺手

            我來到思奧特公司已經(jīng)有一年多了,應(yīng)該是老員工了吧。
            但是我近段時間以來感覺到自己的一種無奈,沖不破的霸權(quán)管理和無聊可笑的管理者。
            于是我想變了。
            “窮則思變”,-毛澤東
            我想自己是一個超級深水潛水員,因為我喜歡大海,喜歡到大海的最深處,用自己的生物電照亮大海。
            我想寫一些文章,在談?wù)劷衲甑母惺埽彩荌T的人生感受吧。
            我想寫:軟件工業(yè)化生產(chǎn)之夢境管理
                軟件工業(yè)化生產(chǎn)之夢境開發(fā)
                軟件工業(yè)化生產(chǎn)之JIT生產(chǎn)
                軟件工業(yè)化生產(chǎn)之超級服務(wù)者
            我很想用WIKI來寫這些東西,SPRING的誕生是由一個夢想開始的,軟件企業(yè)的管理和生產(chǎn)也應(yīng)該有一些理論的指導(dǎo)吧。我很想寫出自己的感受,當(dāng)然我也需要大家的力量,所以我要加入鷹之隊,我要WIKI。
            利用現(xiàn)在的空閑時間我要努力學(xué)習(xí)。我要開創(chuàng)一種利用開源軟件做載體來極限學(xué)習(xí)的方法。
            我還有一個偉大的想法,我想開辦一個利用開源軟件嘗試使用到實際應(yīng)用當(dāng)中的論壇,我想康比爾,我想OPEN OFFFICE VS M$,我想OPENCMS。。。。。。
            可能2006年將給我?guī)硪粋€應(yīng)用技術(shù)年吧,我想發(fā)揮我的一點熱量,想重新營造IT界在中國的管理和生產(chǎn)。
            請大家關(guān)注我的貼子。

          posted @ 2006-01-11 10:15 @家軍 閱讀(368) | 評論 (4)編輯 收藏

          多數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)交換的可行性技術(shù)研究

          2005年在給領(lǐng)導(dǎo)買關(guān)子時寫的一篇文章。現(xiàn)在讀起來也有意思,
          大家可以看一看,多拓展一些思路。
          多數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)交換的可行性技術(shù)研究

          posted @ 2006-01-09 16:44 @家軍 閱讀(426) | 評論 (0)編輯 收藏

          我快速實施的遭遇

          我實施A公司的EAI項目以來,邊需求調(diào)研和代碼開發(fā)及最近的正式上線,只用了兩個月的時間。項目很快就實施完成了。
          今天開會,表示我的EAI項目完成。本來很高興的事,讓領(lǐng)導(dǎo)肯定一下我的成績,誰知道領(lǐng)導(dǎo)毫不猶豫的把我調(diào)到另外一個項目組做CRM分析了,我操(本年度最難聽的話),我是萬精油呀,到處抹。項目經(jīng)理一下子變成一個小職員。
          CRM是一個爛攤了,即使我做過ERP也知道公司負(fù)責(zé)CRM調(diào)研和分析哪幾個人是什么水準(zhǔn)。我絕對反對領(lǐng)導(dǎo)這樣做,太霸道了,看來這個小公司的弱點已經(jīng)讓我看透了。
          埋炸彈。引爆所有程序。

          posted @ 2006-01-09 15:32 @家軍 閱讀(322) | 評論 (1)編輯 收藏

          EAI項目實施心得

            這一段時間,忙于在代碼和A公司之間奔波,所以日志也沒有時間來寫。
            今天談?wù)勎医螘r間在客戶實施的心得。
            到現(xiàn)場實施情況是比較復(fù)雜的,所以從剛剛開頭我就沒有像專家一樣的到處都問(調(diào)研時可以像專家一樣告訴客戶一些大道理)。我們的程序是基于合同技術(shù)附件簽訂的,實施也就跟著簽字的需求和目標(biāo)走。
            由于前一段時間讓一群學(xué)生寫了一些代碼,雖然在質(zhì)量上我有所“查閱”,但是問題最大的也就是在這里,在實施前只是把大致的錯誤進行了修改,就匆匆到現(xiàn)場實施。
            核心代碼由于是自己的思想,也讓放心的手下寫了,但是還必須得測試和驗證其準(zhǔn)確性。這是一個重要的工作,也可能會涉及到一些改變。
            第一天,到了客戶現(xiàn)場,先是對其環(huán)境要求,確定完主機和數(shù)據(jù)庫后,就開始安裝布置,1個小時后全部搞定,基本上給客戶講了一遍怎么使用(很粗略,因為 以后我們有培訓(xùn))。接著就聯(lián)合PDM系統(tǒng)和ERP系統(tǒng)進行測試,還幸運(不相信迷信也這么寫),沒有出事,用戶的輸出結(jié)果也正確,呵呵,收工回家。
            其實,里面的問題很多。只是用戶對這個陌生的事物還有好奇的心理,沒有深入去學(xué)習(xí)它。
            第二天,接著實施,在不斷的測試過程當(dāng)中,問題就出現(xiàn)了,很小的問題讓客戶對我的軟件產(chǎn)生了懷疑,比如供應(yīng)商編碼和供應(yīng)商PN號為什么輸出是一樣的? 員工ID為什么傳遞不過來?假如PDM發(fā)布同一個樹但有不同的組成結(jié)構(gòu)時,做的處理不符合我們的實際業(yè)務(wù)?為什么不同層次的裝配件再次發(fā)布時,數(shù)量不相 加?假如我這一次發(fā)布錯了,能不能刪除?
            客戶提出了很多問題,我知道我的程序開始讓用戶認(rèn)可了,所以我的態(tài)度比較友好,(說實在的,哪時候真想找個替身),我把問題羅列出來后,做了歸類,并給客戶承諾完成時間,并態(tài)度友好、熱情、友善、和氣。。。。的給用戶出錯原因。當(dāng)然心態(tài)必須是誠實。
            一般客戶會提出這幾類問題。
            一、軟件本身的BUG,是自己的責(zé)任,勇敢的承認(rèn)自己的錯誤,合同都簽定了,還不讓修改一個BUG。
            二、在實際需求時,考慮的不充分,或者是技術(shù)實現(xiàn)上有制約的地方
            三、實際業(yè)務(wù)和輸出結(jié)果不符合。
            這三類問題,前兩類我們很積極并承諾盡快得給用戶解決,就是不在合同之內(nèi)的事也加入代碼實現(xiàn),我們的目的就是先讓用戶使用起來。
            第三類問題,不管用戶多么著急,我們也對之的實現(xiàn)優(yōu)先級降低,同樣必須讓用戶書面提出需求我們再做。
            后來的三兩天就是修改程序,不過這個時候我手下已經(jīng)沒有人了,所以我自己這兩天很辛苦。同樣,也發(fā)現(xiàn)了很多錯誤,尤其是表現(xiàn)層,我真是恨這幫學(xué)生呀。害的我不得不對之進行修改。
            再以后就是實施,就算是我的第二個階段吧。
            這個階段里,我就象一只狗似的,看見客戶負(fù)責(zé)人就趕緊用舌頭去舔人家的腳,(想起了發(fā)廊的小M辛苦的為我按摩),晚上人家都下班了,為了趕進度只得自愿加班,晚上經(jīng)常9點后回家。
            這個階段里,是比較富有成果的,首先把客戶前一段時間的BUG和考慮不充分的地方進行了彌補,而且用戶對我修改的速度也很佩服。呵呵。(高興的我自己好象是一個偉大的。。嗯,實施家)
            等到用戶測試結(jié)果正確,不,應(yīng)該是準(zhǔn)確(我的認(rèn)為),而且從長期的測試來說,我心理比較塌實了,我進行第三個階段。修改需求并加入新的程序。
            這個過程比一個階段好一些。我可以坐回公司來,上上網(wǎng),聊聊天,喝口茶,再寫寫程序了,一兩的活兩天干,還能混吃兩頓飯。呵呵,目前就實施在這里。

            對EAI產(chǎn)品本身我給用戶提供了一個規(guī)則,因為我的軟件當(dāng)中有版本管理和BUG提交模塊,所以我每一次的修改就對版本有所影響,小的改動加小版本,大 的改動加大版本,說來也巧,等正式上線剛才從0.8上升到1版本。呵呵。同樣用戶的BUG管理只開放給系統(tǒng)管理員,我可以每天收集一下BUG,并及時進行 修改。

            對TOMCAT中間件服務(wù)器和程序本身的性能優(yōu)化是一個大問題,現(xiàn)在正在解決當(dāng)中。
            程序的穩(wěn)定性和并發(fā)控制也準(zhǔn)備在下一期進行修改。

            請關(guān)注我的貼子。

          posted @ 2006-01-05 17:57 @家軍 閱讀(1232) | 評論 (2)編輯 收藏

          我對快速編程的設(shè)想

          我沒有什么敏捷、什么XP編程的概念,所以我這次的格斗沒有套路。
          從去年開始我擔(dān)任了項目經(jīng)理一職,已經(jīng)負(fù)責(zé)公司的三個項目的開發(fā)和實施了。
          我可以籍以此發(fā)表我的看法。
          本主題內(nèi)容是極限開發(fā)
          首先說說我概念當(dāng)中的極限開發(fā)。
          項目特點:面向應(yīng)用、面向服務(wù)的中小企業(yè)應(yīng)用。
          先哆嗦一下業(yè)務(wù)需求
          我們在實際調(diào)研企業(yè)現(xiàn)狀后,最大限度的了解與我們應(yīng)用范圍相關(guān)的實際業(yè)務(wù)。隨后進入業(yè)務(wù)需求分析,其實就是抽象實際業(yè)務(wù)到軟件功能設(shè)計。同時考慮到我們應(yīng)用 范圍外的業(yè)務(wù),用戶可以不太關(guān)心這一塊,但是我們必須得做。最終的業(yè)務(wù)需求分析由公司內(nèi)部評審,(盡管我們的管理不完善,但是我有權(quán)力讓什么也不懂的領(lǐng) 導(dǎo)參與),再與客戶去交涉。直到取得最終評審。
          極限開發(fā)之前:
          我們首先要做概要設(shè)計,其實是對前業(yè)務(wù)需求分析的細(xì)化,當(dāng)然這文檔是面向業(yè)務(wù)的,這個文檔是修改最多的,所以在你開始寫這個文檔以前一定要做好版本管理(包括有效版本的管理)。
          概要設(shè)計長話短說吧,就是對企業(yè)實際業(yè)務(wù)管理的理想模型,是盡可能的去理想(理智的想象,而不是單純的想象),同時不能夠把軟件的功能劃分在合同的需求功能之外(這個一定要把握一個度的問題)。
          概要設(shè)計是一個相對漫長的過程,這個過程馬虎不得,一定要有耐心說服用戶和有權(quán)力的領(lǐng)導(dǎo),說什么能做,什么不能做,我們?yōu)槭裁催@么做,以及變通的業(yè)務(wù)實現(xiàn)等等。
          極限開發(fā)之?dāng)?shù)據(jù)庫設(shè)計篇
          大家可能不理解,為什么我首先要對數(shù)據(jù)庫進行設(shè)計呀,這個完全和我的習(xí)慣有關(guān)。(我的地盤我做主)
          在對以上概要設(shè)計完以后,我的心理就對實際的軟件功能有具體的描述了,當(dāng)然這個是我最清楚了,我在寫概要設(shè)計的時候會把這些映射成軟件的具體實現(xiàn),并且使 用一些工具比如VISIO在寫完概要設(shè)計的實際業(yè)務(wù)時,我會把軟件的實現(xiàn)圖、邏輯圖同時畫出來,害怕以后沒有時間來想這些,呵呵。
          所以在其后的工作當(dāng)中,我對軟件的具體實現(xiàn)就胸有成竹了,所以我直接進行數(shù)據(jù)庫設(shè)計。
          數(shù)據(jù)庫設(shè)計我使用DB Design,這個工具很好用,我在數(shù)據(jù)庫設(shè)計時有兩個準(zhǔn)原則:
          原則一:數(shù)據(jù)庫表對應(yīng)程序功能模塊,一個模塊一個前綴,并且如果無太多關(guān)系的業(yè)務(wù)模塊對應(yīng)一張表,并且這些表沒有關(guān)聯(lián)關(guān)系,都是獨立的。
          原則二:所有的表如果無復(fù)雜關(guān)系都使用統(tǒng)一的UUID做為主鍵,同樣,如果處理同樣的事務(wù),字段名能夠統(tǒng)一的話就統(tǒng)一命名,或者有統(tǒng)一規(guī)則生成等。
          根據(jù)以上原則,我的數(shù)據(jù)庫表沒有想象當(dāng)中的復(fù)雜,所以在程序?qū)崿F(xiàn)時就不用考慮數(shù)據(jù)庫間的關(guān)系。
          極限開發(fā)之程序?qū)崿F(xiàn)-統(tǒng)一增加、刪除、修改數(shù)據(jù)庫
          數(shù)據(jù)庫設(shè)計完以后,就建立映射成實體,并根據(jù)現(xiàn)行的軟件架構(gòu)實現(xiàn)統(tǒng)一的對數(shù)據(jù)庫的增加、刪除、和修改的操作,比如現(xiàn)在的STRUTS+SRPING+ HIBERNATE的架構(gòu),我根據(jù)數(shù)據(jù)庫表,生成對本數(shù)據(jù)庫表的增加、刪除和修改的類接口,剩下的工作由下面的員工完成,(很想自動生成,但沒有時間來寫 這些東西。以后這個東東肯定會有人發(fā)明)
          極限開發(fā)之程序?qū)崿F(xiàn)-封裝業(yè)務(wù)邏輯層
          我一般使用VISIO或者現(xiàn)在的WEB FLOW給手下的員工畫出程序?qū)崿F(xiàn)方式,讓他們來完成,我的工作是檢查他們的代碼是不是符合規(guī)范,是不是能夠符合 業(yè)務(wù)需求,所以這個時間我的主要工作是質(zhì)檢和修改程序?qū)崿F(xiàn)的業(yè)務(wù)邏輯,(有些剛剛畢業(yè)的大學(xué)生,你要給他講明實現(xiàn)的業(yè)務(wù)關(guān)系呀,還不如告訴他你應(yīng)該往哪個 表插入什么數(shù)據(jù)來得快,這是一個怪圈)
          極限開發(fā)之程序?qū)崿F(xiàn)-關(guān)鍵業(yè)務(wù)實現(xiàn)
          關(guān)鍵業(yè)務(wù)的實現(xiàn)是至關(guān)重要的,這個我一個可能是不行,而且可能當(dāng)時用戶的需求在改變或者改進等,所以我就要找一個比較實在、能力比較強的員工來擔(dān)任這個職務(wù),要盡可能的給他講明實際的業(yè)務(wù)和用戶需要的效果和目的,說不定他還能幫助你的思維呢。
          這個是個重要的環(huán)節(jié),所以生產(chǎn)的重點就是這里,在最復(fù)雜的業(yè)務(wù)邏輯時,對程序的處理,一定要畫個VISIO或者什么圖告訴員工每一步的實現(xiàn)如何做,包括很 多的錯誤處理等。如果你在這里偷懶了,說明你這個項目的有很多的隱患在其中,這個工作比較艱巨,變數(shù)也多,需要多多鼓勵員工。
          極限開發(fā)之程序?qū)崿F(xiàn)-單元測試
          單元測試不是很嚴(yán)格,由公司相關(guān)人員測試,不過經(jīng)過我質(zhì)檢過的代碼,一般沒有太多問題。
          極限開發(fā)之程序?qū)崿F(xiàn)-業(yè)務(wù)測試
          根據(jù)項目的實際業(yè)務(wù)來測試,由我和能力很強和人來測試,最后由測試人員來測試,
          極限開發(fā)之用戶試運行及上線
          這個就不用說了,要用服務(wù)的意識來幫助客戶來認(rèn)知這個東東,就好象到理發(fā)店讓小妹妹給你按摩一樣,不要害羞。也好象很累了到冼足浴室一樣,無微不至引導(dǎo)消費。
          我的這三個項目分別是庫存管理+財務(wù)管理、EAI項目和CRM+服務(wù)。
          用人最多的時候不超過6人,開發(fā)周期沒有超過2個月的。
          庫存管理+財務(wù)管理  6人  1.5個月
          EAI項目       3人  20個工作日
          CRM+服務(wù)      5-6人 不到兩個月
          所有項目均是新寫。


          posted @ 2005-12-27 16:11 @家軍 閱讀(1843) | 評論 (8)編輯 收藏

          無聊工作當(dāng)中的尋財夢

          今天東看看,西看看,一天全浪費在網(wǎng)上亂逛了。
          先是看看淘寶網(wǎng),想開小店,發(fā)現(xiàn)自己的帳號內(nèi)空空蕩蕩。修改了一下密碼后,就不知道做什么了,
          又看看軟件項目交易網(wǎng),東看看、西看看,沒有適合自己的軟件外包項目,可能自己的能力還不夠吧,應(yīng)該多接受一些實際的應(yīng)用。尤其是WEB應(yīng)用這一塊,不過通過軟件項目交易網(wǎng)也可以看到現(xiàn)在市場的一些需求。
          到最后浪費了一天的時間,沒有看看OPEN-OPEN,沒有學(xué)習(xí)康比爾,沒有看看VITEGER CRM,啊,自己的心太野,就什么也學(xué)不會,
          君子愛財,取之有道,君子固窮。沒有辦法。
          還好振奮起精神吧。好好學(xué)習(xí)J2EE技術(shù),為自己以后能夠像油條一樣積累很多的東東。
          左右逢源,左右開弓,多好呀。

          posted @ 2005-12-23 15:49 @家軍 閱讀(408) | 評論 (1)編輯 收藏

          開源代碼學(xué)習(xí):Plone CMS系統(tǒng)

          Plone
          Plone是一種開源的內(nèi)容管理系統(tǒng)(CMS)。基于Zope,用Python寫成。
          最早由 Alan Runyan, Alexander Limi, and Vidar Andersen在1999年開始,之后迅速成為流行而又強大的內(nèi)容管理系統(tǒng)。
          Plone 基于 GNU General Public License 發(fā)布。它建立在應(yīng)用服務(wù)器Zope和Zope Content Management Framework(Zope 內(nèi)容管理框架)之上。Plone的名字來源于一個來自英國伯明漢,叫做Plone的電聲樂隊
          官方網(wǎng)站鏈接:http://plone.org/


          很厲害,僅僅14M左右的東東,就有服務(wù)器和國際化的所有東東。佩服。CMS市場是不是做爛了,這么多的開源代碼。不過操作方面比OPENCMS容易理解,權(quán)限管理不像OPENCMS那么復(fù)雜。

          posted @ 2005-12-21 16:06 @家軍 閱讀(2142) | 評論 (1)編輯 收藏

          Compiere ERP&CRM使用手冊

           北京安特比軟件技術(shù)公司傾情奉獻。
          所有資源均來自于網(wǎng)上,本人收集整理,只供學(xué)習(xí)用途。
          如果你要轉(zhuǎn)換其它閱讀格式,請保留版本信息。
           
            Compiere ERP使用手冊.part1.rar 1423KB
           Compiere ERP使用手冊.part2.rar 1393KB  

          posted @ 2005-12-21 14:54 @家軍 閱讀(3434) | 評論 (16)編輯 收藏

          開源代碼學(xué)習(xí):COMPIERE

          康比爾的學(xué)習(xí)過程:
          難找的漢化地址:http://prdownloads.sourceforge.net/windowutil/

          posted @ 2005-12-20 16:01 @家軍 閱讀(872) | 評論 (1)編輯 收藏

          年度工作總結(jié)

          年度工作總結(jié)

           

          擔(dān)任項目經(jīng)理的職位一年了,盡管自己到現(xiàn)在為止仍然是個不合格的項目經(jīng)理,但是畢竟站在這個崗位上,主要從事的還是設(shè)計和程序?qū)崿F(xiàn)的工作,加上自己也有志于在這個方向上發(fā)展,所以做一個年度總結(jié)是有必要的,也希望領(lǐng)導(dǎo)給以指點。

          這一年來,主要管理了有兩個項目,一個是EAI課題及A公司項目,一個是B公司的二次開發(fā)。

          EAI課題是今年5月份開始提出來,并由我來擔(dān)任項目經(jīng)理的。我很積極的開始工作,并努力配合前方調(diào)研和方案建議的撰寫。從5月份到7月份是一個EAI課題的調(diào)研和需求分析階段。需求分析由我撰寫,并通過公司內(nèi)部評審;8月份進入設(shè)計階段,概要設(shè)計和數(shù)據(jù)設(shè)計由我撰寫并通過公司內(nèi)部評審。9月份開始編碼,并在9月底完成代碼的編寫。

          10月份由于公司接到A公司項目的需求,和EAI課題內(nèi)容很吻合。所以就把原EAI課題實施計劃順延,改變由以A公司的應(yīng)用集成為主線。10月中旬進入調(diào)整期,并在10月底對A公司進行調(diào)研和分析,并寫出概要設(shè)計,通過公司內(nèi)部評審。

          11月份開始編碼,并使用兩周的時間完成極限編程,11月下旬開始在A公司進行安裝調(diào)試。其間因為A公司內(nèi)部的需求有所改變,所以開發(fā)也有所影響,致使在12月上旬正式在A公司安裝調(diào)試,并順利通過項目驗收。

          12月份我們就主要開始對EAI課題的另外一個實施方-B公司進行調(diào)研編碼,在12月份中旬完成對B公司的編碼開發(fā)工作,12月份下旬安裝調(diào)試,并順利通過課題驗收,同時得到了用戶的認(rèn)可和肯定。

          EAI課題及A公司項目這個項目當(dāng)中,時間緊湊也富有挑戰(zhàn)性,我合理的安排時間,并對手下的資源充分利用。根據(jù)我手下的資源的一些特性,對其分派的任務(wù)也有所不同,以下是我在這個項目當(dāng)中,對資源管理的一些總結(jié):

          學(xué) 生們可能對企業(yè)的實際業(yè)務(wù)不很了解,就是即使把企業(yè)的實際業(yè)務(wù)抽象的很好,并讓學(xué)生們?nèi)ダ斫猓麄儗ζ錁I(yè)務(wù)也有很多的疑惑。所以,我對學(xué)生在編碼上的做法 是:把企業(yè)的實際業(yè)務(wù)抽象成一種計算機語言,并告訴學(xué)生這些類主要完成什么功能,對數(shù)據(jù)庫是如何操作的,應(yīng)該注意的是什么和完成的操作效果是什么。這樣做 的話,學(xué)生往往能夠很快的完成自己的工作。

          對項目的控制和質(zhì)檢是必要的,這個對項目的完成質(zhì)量有很大的關(guān)系。因為我的編碼實現(xiàn)主要是由學(xué)生來完成,所以我對代碼的質(zhì)檢是對其代碼的檢查。對其處理的事務(wù)進行細(xì)致的查看,所以項目的進度得到了有效的控制。

          其次,另外一個項目是對B公司項目的二次開發(fā)。

          我們主要的工作是二次開發(fā)的工作,是對DYNAPDM系統(tǒng)的二次開發(fā),所以我們從剛剛開頭時,沒有急于編程,而是努力學(xué)習(xí),并讓手下的資源完成一些TEST功能實現(xiàn),等到大家對之比較熟悉了,我們才開始編碼,尤其這一段時間我們對DYNAPDM的開發(fā)總結(jié)進行了歸檔。

          等 到我們正式接受B公司的需求并二次開發(fā)時,我們的二次開發(fā)就開始變得樸素迷離了,因為B公司項目需求的多次變更和完成模板的多次調(diào)整,使得我們的二次開發(fā)不斷 的跟著他們的需求在變更。為此,我們嚴(yán)格了他們對我們的需求,每一個需求是需要共同確認(rèn)才予以編程,使得后來的編碼才有所規(guī)范。最終及時完成了B公司項目的 二次開發(fā)。

          從對DYNAPDM的二次開發(fā)來說,我們有以下的總結(jié):

          首先,DYNAPDM現(xiàn)行版本不太穩(wěn)定,導(dǎo)致我們在開發(fā)時有所影響。

          其次,B公司項目的需求不是太多,也不是太難,但是他的需求多次調(diào)整牽扯到我們的很多精力,并且有很多的工作都是無效的,所以以后在對企業(yè)調(diào)研時應(yīng)該深入細(xì)致的為用戶的需求進行判斷和確認(rèn),免得用戶的“拉抽屜”的需求。

          最后,我們的員工很努力,雖然項目更改很多,但是我們還是最終及時的完成的項目的二次開發(fā)。

           

          總之,這一年又要過去了,雖然工作比較累,但是我在其中也學(xué)習(xí)到了很多的管理知識,尤其是建立一個規(guī)范、高效的開發(fā)團隊上我已經(jīng)積累了很多經(jīng)驗。明年將是技術(shù)革新最重要的一年,WEB2.0將占據(jù)我們的技術(shù)生活,很快他將成為業(yè)界開發(fā)的新的標(biāo)準(zhǔn)。對于我們以技術(shù)為主的軟件公司來說,應(yīng)該珍惜這次變革的機會,成為應(yīng)用這個技術(shù)為先的公司,為贏得市場先機而努力。

           

           

           

           

           

                                       我

                                       2005-12-20

          posted @ 2005-12-20 11:09 @家軍 閱讀(865) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 甘谷县| 平乡县| 丁青县| 秦安县| 新田县| 兴业县| 苍南县| 青田县| 石台县| 东辽县| 宁海县| 个旧市| 吴旗县| 永仁县| 屏边| 泊头市| 嘉兴市| 襄汾县| 焉耆| 遂宁市| 南木林县| 威信县| 武夷山市| 和顺县| 格尔木市| 赤峰市| 腾冲县| 温州市| 毕节市| 奉化市| 楚雄市| 东光县| 浦城县| 冕宁县| 巴马| 宝清县| 郎溪县| 黄浦区| 沐川县| 扶绥县| 策勒县|