Google Prettify

2008-12-19

我上輩子應該是個教師

最近發現我時常有機會就會想對人說說自己的看法、想法。用另外一種方式來說叫"說教"。就好像父母親千叮萬嚀的都是他們的想法認知與看法;希望子女不要這樣、應該那樣;就好像老師的碎碎唸,只希望學生懂得一切的真理、成就一切正義...。 根據來生學理論,我上輩子就應該是個教師。也許上輩子曾誤人子弟,所以這輩才來當工程師...(好像沒什麼關係)。

        唸了好幾次才發覺(反應好慢),勸人為善是一種拆炸彈的過程。其實這個理論,高中時劉墉已經教過我,只可惜那時的我體會不了,甚至一度懷疑是不是排版錯誤。如今終於因為平常碎碎唸的習慣而嘗到被炸的滋味了。這證明了3件事:

第一,[勸人為善]是[影響別人]的一個實例,[影響別人]是[勸人為善]的抽象化。2者皆是一種藝術,過程皆要小心與耐心。(X的,我真的是標準的工程師...)
第二,我拆炸彈的技術還不夠好。
第三,那本書沒有排版錯誤,只是講得不夠清楚..。

為此我還特別去翻了翻劉墉的一些著作...。

2008-11-16

SVK使用說明

初始

1.下載SVK
注意: 如果本機有安裝oracle 或環境變數中有PERL5LIB需拿掉或更名。這是perl會讀取的。Oracle會將這個變數指到oracle的perl,可能與svk下載的版本不合。
注意: path中必須包含. 路徑。
2.將目前的資料與server同步。該commit的 commit、該update的update。
3.將原本的檔案保留一份下來。
4.指行dos 指令:
svk depot –i
說明: 初始化svk的depot資料。depot是alias。全名是depotmap。Svk會在"C:\Documents and Settings\當前用戶名\.svk\Local建立reponsitory。可以用depot –relocate重新指定。
可以使用下列指令看更多說明:
svk help commands
svk help depotmap
svk help depot
svk mkdir //mirror -m "Mkdir mirror"
說明: 建立目錄。
svk mirror svn://SVNSERVER //mirror/project # project目錄會自動建立
svk sync //mirror/project # 將SVNERVER的資料同步到//mirror中
svk mkdir //local
svk cp //mirror/ project //local/ project # project目錄會自動建立
5.建新目錄/刪除原本SVN中所有的svn設定檔。反正要一個不受原本SVN控管的目錄。如果原本沒有使用SVN那只要新建一個就可以了。假設是svn。
D:\mydoc\svn>
6.進到目錄。進行checkout動作。這裡checkout與CC或perforce中的checkout意義不同。
svk co //my/local
7.下一步比較麻煩。如果你是即有系統的話,需要將原本在local上卻不在SVN上的一些檔案,例如設定檔從備份檔一個一個轉過來。
8.到此已經有一份workarea可供修改。

日常使用

1.更新
A.更新檔案至最新版本。
svk sync —all
svk update
B.使用pull 指令可一次進行更新、merge。我建議使用這個,因為只要下一次只令即可。
svk pull -a
2.如果有衝突的話,解決衝突。解決完後,要告訴SVK已經解決完。
svk resolved local/License.txt
3.commit code到local。注意一定要到local目錄。
svk commit –C
svk commit
我建議先使用-C參數檢查是commit的檔案,或是在commit時不要直接加-m log訊息,以彈出文字可,一來可確定各檔案控管的狀態(在我的經驗裡,有時候有些檔案的狀態會是【?】,我建議在此時可手動將狀態改成適當的狀態);二來是可決定那些檔案要不要列入控管。
4.將local brach的異動上傳到repository 上。注意;SVK有自己的版本編號。SVK的版本隨著depot的異動而改變;不是SVN的repository。
svk push
push其實是smerge –If的wrap指令。也就是說,在以前(不使用push)的情況下,也可以使用smerge指令,將異動上傳到repository。當merge 由local branch 版本至mirror時,SVK也同將//mirro上的資訊上傳到repository上。
svk smerge //local //mirror

2008-11-11

VMware使用經驗

最近在玩VMware,向一位使用已久的同事詢問了很多,記下來,免得自己忘記;記下來,給要學的人看看。

1.有關於新加的2張網卡

VMware在安裝時,會預設幫你安裝2張網卡。這牽扯到VMware對外的模式。
VMware有2種連線模式。第一種是Bridged模式。這種模式需要另一個實體IP。第二種是NAT模式。VM把你實體的電腦當做Hub,因此VM得到是192.168XXX的虛擬IP。

2.Local與VM中的連繫

第一次安裝,是使用NAT的方式。實體電腦中新增的2張網卡中,當啟動VM時,其中一張的網域會變成與VM相同網域的IP。通常都是XXX.1。有了2個IP,你可以使用網芳或是FTP的方式互傳檔案。不過使用這種方式,因為是虛擬IP,因此其它電腦無法直接連繫VM。要連VM只能透過本機來連。如果使用Bridged的方式,因為都是實體IP,所以都可以連繫。
另外在實體電腦中可以直接使用托曳的方式將檔案傳到VM中。

2008-10-29

如何在WEB中使用jasper產生PDF檔?

目錄架構:
web
└report
    └template.jrxml
    └template.jasper
使用i-Report編寫jrxml檔、並直接用i-Report編譯產生jasper檔。
使用servletContext取得jasper檔之路徑:

String jasperPath =servletContext.getRealPath("/report/template.jasper");

ServletContext的取得依所使用的web framework而有所不同。以JSF來說,servletContext的取得如下:

ServletContext servletContext=(ServletContext)FacesContext.getCurrentInstance(). getExternalContext().getContext();

接下來產生byte[]串流:

JasperFillManager.fillReportToFile(jasperPath, parameter,conn);
byte[] bytes = JasperRunManager.runReportToPdf(jasperPath, parameter, conn);

之所以要產生byte[]是因為它轉成Stream或是File都很方便。JasperRunManager也提供了很多不同型態+報表類型的回傳值。(詳見API..)。
接下來由HttpResponse取得outputStream並寫出

response.getOutputStream().write(bytes);

2008-09-29

為什麼資產增加記在借方?

最近在研究會計,對於初心者(初學者)時常卡在借貸法則,常常背不住什麼會計科目在什麼情況下要記在那一方。針對於上面的問題,上網查了一下得到了許多像蘋果為什麼會往下掉的答案(在牛頓以前,這是理所當然得沒有為什麼,問這個問題的人會被罵白目+白癡)。經過思考後,我也有了自己的答案。感謝 hyz_atm與kahlil 2位的答案給我的啟示。還有Wiki一段落落長的英文

首先是基本會計公式:
A=L+OE(資產=負債+業主權益)。
進階公式:
A=L+OE+(I-E)(資產=負債+業主權益+(收入-支出)
變形公式:
A+E=L+OE+I
小學數學告訴我們,等號左邊加1等號右邊也要加1,或者是若等號左邊+1的話,也要同時-1,這樣等式才會維持平衡。因此當資產增加時,L、OE、I其中一定要有一個增加。或者說若右邊總值不變時,當E增加時,A一定要減少。用公式來說明應該會更清楚:
(A+1)+E=L+OE+(I+1) 或 (A-1)+(E+1)=L+OE+I
再來,所謂的借是指錢流入帳戶,所謂的貸是錢出帳戶。這是(我認為)為什麼用借、貸來描述。我認為T字帳其實描述的就是現金流。 以一筆現金收入為例,在會計上就要借計現金(A)增加、貸計收入(I)增加。當然,所謂的公說公有理,婆說婆有理;這種說並不能否定為什不用「收、支」、「增、減」、「左、右」、「A、B] 、或是其它的label來描述T字帳的左右兩邊,只是提出來,讓初學者會比較分得清,那種科目在什麼樣的情況下,需要放在T字帳的左方或右方。

2008-05-22

技術出身的主管


在我的工作經驗裡, 曾經遇到一位主管, 記得我們第一次見面他就跟我宣稱他也是技術出身的. 之後當我在實作案件時因為速度上的關係,被命令要使用model 1的開發方式. 當然我們也曾經為了開發方式有起過爭執。我記得他跟我說(最經典??)的理由是: 維護成本高? 那是維護的人的事, 你是負責開發, 弄好開發就好. 事實上, 在我們公司裡的企業流程, 開發是一組人馬, 維護是另一組人馬. 開發真的不關我事, 維護成本也是另外一組事業單位的成本, 跟本單位無關.


我本身並不兼任管理職. 目前也是技術人員. 如果我跟別人宣稱我是技術出身, 我想這應該是很理所當然爾, 因為也從沒轉過工作型態. 事實上前陣子我也才在爭扎是否要走管理職. 因為走技術真的錢不太多. 不過玩技術有點像在吃毒品-是越吃越上癮. 如果一個主管工作10年, 做技術1年, 剩下9年可能是從助理慢慢爬到主管, 那能否算是技術出身? 我想不行. 又多少年才能算是可以宣稱自己是技術出身?? 這樣想想, 可以宣稱自己是技術出身的主管, 判定標準似乎不是在年資, 而是在於本身是否真有技術能力. 在那間公司, 我也遇到寫code寫了3年還沒聽過MVC的人, 所以年資雖然跟能力有點關係, 但不是絕對..


講了那麼多, 就是要說, 當如果遇到有管理人員跟你說他也是技術出身, 他只是想讓你覺得會很容易溝通. 你不要期望他會有比較好的技術sense.甚至你也不該期望你會很好跟他溝通, 因為那只是一種管理手段.


2008-05-21

如何在word中使用自訂的表格樣式

前言: 最近在狂寫文件, 對word的有了更深的體認...(廢話中....), 直接告訴各位, 要如何在word設定自訂的表格樣式。基本上, 看圖說故事就可以了。

方法就如同以下圖一般, 我先有張表格。

然後點選「表格」、「表格自動格式」、「新增」。輸入「樣式名稱」(這裡是「我的樣式」);選擇「樣式根據」(這裡選擇「表格格線」樣式);選擇「將格式設定套用於」(這裡選擇「整張表格」)。然後依照自己喜歡的樣式設定就可以了。





最後將樣式套用到整個表格就可以了。

2008-04-18

給我複雜的BO

最近在上有關UML的課程,雖然老師沒有明講,我覺得這是Test-driven或use case driven之類的方法。所謂「之類」是說都是使用Iterator 的開發方式、每個iterator都要經過測試、每次出品都是production的水準。學到的東西當然要拿來用在工作上啦,忽然問題產生了...

2008-03-13

如何在weblogic 8中取得jsp編譯後的java檔

有寫過JSP的人都知道, 所謂的JSP,是container用來產生servlet class檔用的。Container翻譯JSP,產生.java檔,透過.java檔產生.class檔。最終就如同servlet一樣,還是要執行.class檔。所以當一個畫面呈現在瀏器時,至少會有jsp、java、class 3個檔案。不過在weblogic container中卻只看得到2個檔案

1.jsp檔在${BEA_HOME|}\user_projects\domains\mydomain\applications下, 也就是deploy的目錄。
2.class檔在${BEA_HOME}\user_projects\domains\mydomain\myserver\.wlnotdelete\extract下,也就是weblogic暫存目錄下。

那.java檔呢? weblogic 預設在產生.class檔後就會移除掉。要保留.java檔的方法是在weblogic.xml中設定keepgenerated為true即可。
${BEA_HOME}\user_projects\domains\mydomain\applications\${AP_NAME}\WEB-INF\weblogic.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" 
"http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>    
  <jsp-descriptor>
    <jsp-param>
      <param-name>keepgenerated</param-name>
      <param-value>true</param-value>
    </jsp-param>
  </jsp-descriptor>
  <container-descriptor>
    <prefer-web-inf-classes>false</prefer-web-inf-classes>
  </container-descriptor>
</weblogic-web-app>

2008-02-17

WDS使用技巧


Google的桌面搜尋是出了有名的。很可惜,不知道為什麼,在我的電腦上執行,總會有問題。但對於這類的搜尋功能又是愛不釋手(在有需要找檔案或是一些文件時,速度真是超快的)。因此就在想想有什麼替代方案;那就是WDS啦。什麼是WDS? WDS就是Windows Desktop Search;聽名字就知道跟google desktop search是相同的東西。以下是一些進階搜尋的功能:
ext:doc - 搜尋後面為doc的文件
file:report - 搜尋檔案名中包含report這個詞的文件
cameramake:canon - 搜尋所有圖片中由canon相機產生的(依賴於EXIF訊息)
from:zhang - 搜尋發件人名字中有zhang的郵件
size:>100000000 - 搜尋尺寸大於100MB的項目。這個做得比較土,不支持MB,KB等服務機構,只能是字元為服務機構,要加一堆0……
phone:12345678 - 搜尋電話號碼為12345678的聯絡人
來源:windows desktop search一些小技巧


2008-01-22

如何在Quartz中確定當上一個job尚未執行完前不執行下一次job?

為了避免重覆執行企業邏輯,我們在排程時有時必須確保上一次的工作執行完後,才可以允許下一個排程工作繼續執行。也就是說,原則上是個一個固定時間區間執行一次企業邏輯運算,但實際上必須等到上一次運算完後,才可以繼續執行下一次的運算...當然,也是要在固定時間區間之後。以下是個人撰寫的部份sample code。主要是利用Scheduler.getCurrentlyExecutingJobs()來限制執行job的數量。其實原理並不是不執行排程,只是不執行排程裡設定的動作。

Sample code後有一段是展示如何重新啟動排程及設定排程時間。

這段Sample code是使用Spring framework。

public class LogAnalysisJob extends QuartzJobBean {
    private LogAnalysisBO bo;

    public void setBo(MyBO bo) {
        this.bo = bo;
    }

    protected void executeInternal(JobExecutionContext c)
    throws JobExecutionException {
    Scheduler sc = c.getScheduler();
    try {
      List l = sc.getCurrentlyExecutingJobs();
      if (l.size() <= 1) { //限定目前的只有1個bo被執行
      bo.exe();//真正執行企業邏輯的部份
    }
    SimpleTriggerBean t = (SimpleTriggerBean) c.getTrigger();
    if (count > 10) {
       t.setRepeatInterval(t.getRepeatInterval() + 3000);//如果排程執行超過10次, 每次執行間隔就延長3秒
       sc.rescheduleJob(t.getName(), c.getJobDetail().getGroup(), t);
       count = 0;
    }
    count++;
  } catch (SchedulerException e) {
    e.printStackTrace();
  }

    private static int count;
}

2008-01-21

在Spring中使用Quartz

最近工作上同時使用了spring framework與quartz排程。其實這個solution在網路上已經有很多了,甚至是copy-paust良葛格的sample code也可以直接用。當然會記在這裡,一定是遇到了一些難以解決的問題。
當我在執行時,發生了NoSuchMethodError
Caused by:java.lang.NoSuchMethodError:org.apache.commons.collections.SetUtils.orderedSet...
解決方法是更換commons-collections至3.X版就可以了。

2008-01-04

Hibernate中Criteria如何查詢nested property?

假設我們有一個Object A。A的型態是ObjectA,A有一個property名稱是 propertyA、類型是ObjectB。ObjectB中有一個property名稱是propertyB屬性是String。注意、問題來了:要怎麼使用Hibernate criteria去取得propertyB值是"nested property"的instance A呢?一般人都會直覺的認為

Criteria cri = session.createCriteria(ObjectA.class);
cri.add(Restrictions.eq("propertyA.propertyB", "nested property"));
Collection r = cri.list();

這樣是不行滴。(其中一個)正確的寫法是:

Criteria cri = session.createCriteria(ObjectA.class);
cri.createAlias("propertyA", "ptA");
cri.add(Restrictions.eq("ptA.propertyB", "nested property"));
Collection r = cri.list();

沒錯,跟HQL一樣,需要使用alias。
更多請參考:Hibernate 文件

您或許對這些有興趣

最後

謝謝您的閱讀,希望您可以有豐富的收獲。