2014年11月14日 星期五

設計一個簡單的檔案清理模組

我們 team 開發了多個專案,這些專案每天在現場環境都會因為功能被使用而記錄了很多 log ,長期下來現場系統組給的空間就會慢慢的不夠,然後就會被念...= =,可是用人工定期去檢查這個問題再手動清檔又是一件很蠢的事,為了要能夠保持空間不被過多的 log 占用,於是我就被給了這個任務來處理這個問題。

(當時心想,哇~我真的可以開始設計模組了嗎?...真是不可思議 XD)

第一步就是先將自己所有能夠想到的解法都寫下來,然後對其做優缺點分析 (就像 SWOP 那樣,但沒那麼麻煩就是),接著請教前輩看看這樣子方法是不是可行,再把想法畫出來然後就開始動手實作,最後做出來也將它順利的套上各個專案了,真的滿開心的!

 看大圖
看大圖

手動 install local lib to local .m2

最近在試著更新我們某個專案使用的第三方 lib,但卻發現在網路上找到的最新版 lib 卻一直無法更新到內部的 repository 上,原因是因為對方(官方)並沒有把最新的釋放出來 (放到官方 repository 上),所以就試著手動將自己下載下來的 lib 安裝進 maven 的目錄,這樣我們專案的 maven 才有辦法抓對我需要的測試 lib。

步驟:
1. 先下載 maven 的手動工具 (不是附在 eclipse 的 plugin) http://maven.apache.org/download.cgi

2. 下載後要做的就是設定 maven 的家 (home) 等相關環境變數。
確定 maven 已經可以在 windows console 下面使用了 --->  mvn --version。

3. 之後則下下列指令,在這邊示範的是要裝新版的 smartgwt-skins.jar
mvn install:install-file -Dfile=C:\Users\evelyn\Downloads\smartgwt-skins.jar -DgroupId=com.smartgwt -DartifactId=smartgwt-skins -Dversion=4.1 -Dpackaging=jar

4. 看到 build success 之後可以去 .m2 下看看應該已經裝好了。

5. 再到 eclipse update pom 就可以使用了。

參考的指令:
mvn install:install-file
-Dfile=<path-to-file>-DgroupId=<group-id>-DartifactId=<artifact-id>-Dversion=<version>-Dpackaging=<packaging>-DgeneratePom=true

Where: <path-to-file>  the path to the file to load
   <group-id>      the group that the file should be registered under
   <artifact-id>   the artifact name for the file
   <version>       the version of the file
   <packaging>     the packaging of the file e.g. jar

JUnit unrooted problem

常常發生的一個怪現象,就是我要 run 自己本身的 tesecase 時,eclipse 卻跟我說找不到自己本身要跑的這個 class (unrooted ...Compilation failure), 原因可能是因為之前有對本身這個專案做了 maven-clean,
但是 JUnit 的 plug-in 沒有再重新產生出這個 tesecase 的 byte code(<---吳先生解釋)
所以要再執行一次  maven: test-compile 這個指令,之後再 run tesecase 即可。


如果還是一直出現錯誤,就將 project/build automatically 先關掉,再 clean 一次 project 試試看。


結論就是:
try to clean & rebuild your project.

Close Entity Manager

關於 close jpa 的 EntityManager:

http://javanotepad.blogspot.tw/2007/06/how-to-close-jpa-entitymanger-in-web.html
裡面說到了非常重要的觀念,就是當 EntityManger 跟 transaction 綁在一起使用時,若是 在 transaction 的過程中發生問題沒有被完整的 commit 或 rollback 的話(也就是當transaction沒有正常被關掉時),即使已經呼叫了 entityManager 的 close() 也不會馬上將 entityManager 關掉,它會一直保留至確定 transaction 都被關掉為止,所以要確保EntityManager 被 close 的話,要像下面這樣做才行 (至少在 Java6 時都必需是這樣):
 EntityManagerFactory emf = ... ;
  EntityManager em = emf.createEntityManager();
  try {
    EntityTransaction t = em.getTransaction();
    try {
      t.begin();  
      // business logic to update the customer
      em.merge(cust);
      t.commit();
    } finally {
      if (t.isActive()) t.rollback();
    }
  } finally {
    em.close();  }

容易搞混的 css selector

記錄一下自己可能會搞混的 css selector:


1.關聯 selector
ex:
div p
只要是在 div block  內的 p 元素都會被套用到


2.子 selector (子系 selector,不包含全部子孫,也就是只有爸爸下的兒子但不包含孫子的意思)
ex:
div > p

3.相鄰同輩 selector (只有緊鄰的才有,不是剛好在旁邊或太遠的就沒有)
ex:
h1 + p

4.虛擬類別 (不是真的套用在特定的實體標籤上,而是屬於標籤的某些特定事件發生時的才會有的動作,通常會有「:」)
ex:
:FISRT-CHILD
:FOCUS

5.虛擬元素
ex:
h1.age:before {content: "Age: "}
h1.age:after {content: " years old."}
會讓 <h1 class="age">25</h1>
變成這樣的顯示:Age: 25 years old.

6.!important (以這次定義的為主)
因為 css 是可以被繼承的,瀏覽器會依照:預設樣式表->使用者定義樣式表 -> 作者定義樣式表 -> 作者定義嵌入樣式 -> 作者定義行內樣式 的順序來顯示被設定的元素,所以若是有設定的樣式指定了這個「重要」的標記,則不管下面的樣式如何定義,都會以此為主。使用此項目時一定要確認其必要性才能使用。

From: Stylin' with CSS - a Designer's Guide 2/e