2015年9月17日 星期四

[log4j] 顯示 SQL & 參數值

log4j.properties 設定

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate=ERROR



org.hibernate.SQL 用來顯示 PeparedStatement
org.hibernate.type.descriptor.sql.BasicBinder 用來顯示 bind 的值

2015年9月5日 星期六

Log4j - Addtivity & Category

一個一直沒有去弄清楚的東西

additivity

https://logging.apache.org/log4j/2.0/manual/configuration.html#Additivity

同一個訊息可以在多個 logger 中被輸出到同一個 appender

這樣訊息很明顯是會被輸出多次

additivity = false 就是讓這個 logger 的訊息不要被輸出的意思

properties 版本

log4j.rootLogger=INFO, console

log4j.logger.package.name=INFO, console
log4j.additivity.package.name=false;

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %-5p %c - %m%n


---

Category

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html

一個被捨棄 (deprecate) 的類別

Category category = Category.getInstance(TargetClass.class);

Logger logger = Logger.getLogger(TargetClass.class)

當初用的時候好像就已經只有看到 Logger 了

Category 這個關鍵字就是偶而會出現在設定檔案裡面,讓人覺得煩躁 XDD

反正就不要再使用囉!!!


2015年8月11日 星期二

[Maven] 基本 plugin

mvn [<goal(s)>] [<phase(s)>]

goal: <plugin>:<goal>

-- goal --
archetype:generate
    http://maven.apache.org/archetype/maven-archetype-plugin/
help:help
 
compiler:compile

    http://maven.apache.org/plugins/maven-compiler-plugin/
war:war

    http://maven.apache.org/plugins/maven-war-plugin/
jar:jar

    http://maven.apache.org/plugins/maven-jar-plugin/
dependency:help

    http://maven.apache.org/plugins/maven-dependency-plugin/
source:help

    http://maven.apache.org/plugins/maven-source-plugin/

checkstyle:checkstyle

    http://maven.apache.org/plugins/maven-checkstyle-plugin/
pmd:pmd

    http://maven.apache.org/plugins/maven-pmd-plugin/

ant:ant

    http://maven.apache.org/plugins/maven-ant-plugin/
antrun:run
    http://maven.apache.org/plugins/maven-antrun-plugin/


tomcat6/7
    http://tomcat.apache.org/maven-plugin-2.2/context-goals.html
cargo (支援多種 container 發布)
    https://codehaus-cargo.github.io/cargo/Home.html

-- phase --
clean
compile
deploy
install
test
package

2015年8月10日 星期一

[bash] 指令速記

查出 process 並用 username 過濾
ps -ef | grep username

透過 awk 篩選出 container id 並且在 docker 中移除
docker ps -a | grep imageName | awk '{print $1}' | xargs docker rm {}


篩選特定的 pid 然後 kill
ps -ef | grep ping | grep -v 'grep' |  awk '{print $2}' | xargs kill

看檔案的尾巴
tail -f

2015年8月9日 星期日

[CLI] zip/unzip, jar command

最近很常在 linux 上作業,特別是操作 weblogic 和裡面的 jar/war 檔案

原來都透過 zip/unzip 來處理檔案

常見的用法是

建立壓縮檔
zip -r zipfile.zip sourceDir

-r recursive (很好記)

解壓縮檔案 (可不加 .zip)
unzip zipfile -d targetDir

-d directory (很好記)


這樣就很方便了,不過使用 jar 可以滿足一些些虛榮心

(補)(原來之前已經寫過了,不過看起來出以前比較不會用指令)

建立壓縮檔
jar cf jarfile -C sourceDir *.class

-C 會從 sourceDir 中尋找檔案再進行建立,可以包括多個 -C

解壓縮檔案
jar xf jarfile

create
x extract
u update
t table of contents
m manifest file
f file
0 no compress (create only)
v verbose

------

以下是 man 出來的語法



2015年8月8日 星期六

[CI] svn hook & Jenkins auto build 1/2


蠻簡單的先透過 svn server 的 hook 機制 (在某些時間點觸發一些 script)

觸發 Jenkins 來啟動專案 build

而 build 本身就是依賴 maven 或是 ant 等專案的設定來啟動

--- svn ---
1. svn commit

2. 透過 svn post-commit hook 觸發 Jenkins

3. Jenkins 透過 maven 啟動編譯或發佈等行為






SET CSCRIPT=%windir%\system32\cscript.exe
SET VBSCRIPT=D:\Repositories\post-commit-hook-jenkins.vbs
SET JENKINS=http://localhost:8080/jenkins/
SET REPOS=JENKINS_JOB_NAME

"%CSCRIPT%" "%VBSCRIPT%" "%JENKINS%" "%REPOS%"
---------

post-commit-hook-jenkins.vbs



jenkins = WScript.Arguments.Item(0)
repos   = WScript.Arguments.Item(1)

url = jenkins + "job/" + repos + "/build?token=TOKEN"

Set http = CreateObject("Microsoft.XMLHTTP")
http.open "GET", url, False
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8"
http.send
crumb = null
if http.status = 200 then
  crumb = split(http.responseText,":")
end if


--- maven ---

待續

2015年7月29日 星期三

[NodeJs] 啟用行程,取得 svn log

---node js---
#!/usr/local/Cellar/node/0.12.2_1/bin/node
var exec = require("child_process").exec;

exec( 'alias svn=/usr/local/Cellar/subversion/1.8.13/bin/svn;'
'cd /Users/progden/Documents/eclipse-workspace/workspace_nsp/NSP2;'+
'svn update;'+
'svn log -l 5;' , function(err, stdout, stderr){
console.log(stdout);
console.log(stderr);
});

---shell---

#!/bin/sh
alias svn=/usr/local/Cellar/subversion/1.8.13/bin/svn

cd /Users/progden/Documents/eclipse-workspace/workspace_nsp/NSP2
svn update
svn log -l 5


---Geek Tool---


2015年6月23日 星期二

AOP - Concept

AOP

不使用 procedure 的形式來撰寫邏輯,也就是不使用呼叫函數的方式。
AOP 將邏輯透過 weaving (織入) 加入現有程式
可以不更改到原有程式碼(Target)
但是由於加入邏輯的方式如此神奇,所以如果"適用"範圍與方式需要做些限制。

Weaving

Weaving 的時間點可以在編譯時期,或者是執行期進行。
Spring AOP 是在執行期做 weaving,透過 proxy pattern 來達成

JoinPoint

被加入額外邏輯的位置,函數執行時、Class 初始時、Object 初始時。

Advice

加入的程式。
被加入程式的地方,join point 前(before advice)、後(after advice)、前後(around advice)加邏輯。

Pointcuts

一個 join point 的集合,指定一個 advice 會在哪些 join point 執行。



2014年11月3日 星期一

[T-SQL]取得兩個日期間的差距,顯示成yy年mm月dd日格式

--好懂好讀版--
select cast(Y as varchar(1)) + 'Y'+cast(M as varchar(1)) +'M'+cast(D as varchar(1)) +'D' AS TimeDiff
from(
  select y, m, s, e,
    DATEDIFF(D, dateadd(MM, t.m, dateadd(YYYY, t.y, t.s)) , t.e) D
  from (
    select y, s, e, 
      case when DATEDIFF(D, DateAdd(MM, DATEDIFF(MM, dateadd(yyyy, t.y, t.s), t.e), dateadd(yyyy, t.y, t.s)), t.e) < 0 then DATEDIFF(MM, dateadd(yyyy, t.y, t.s), t.e)-1 else DATEDIFF(MM, dateadd(yyyy, t.y, t.s), t.e) end M
    from (
      SELECT case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end Y, s, e
      FROM (SELECT '20081231' 's', '20090101' 'e') t 
    ) t
  ) t
) t
;



-- 拆開來效能比較好版 --

select cast(Y as varchar(1)) + 'Y'+cast(M as varchar(1)) +'M'+cast(D as varchar(1)) +'D' AS TimeDiff
from(
SELECT case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end Y,
 case when DATEDIFF(D, DateAdd(MM, DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e), dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s)), t.e) < 0 then DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e)-1 else DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e) end M,
 DATEDIFF(D, dateadd(MM, case when DATEDIFF(D, DateAdd(MM, DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e), dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s)), t.e) < 0 then DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e)-1 else DATEDIFF(MM, dateadd(yyyy, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s), t.e) end, dateadd(YYYY, case when DATEDIFF(D, DateAdd(YYYY, DATEDIFF(YYYY, t.s, t.e), t.s), t.e) < 0 then DATEDIFF(YYYY, t.s, t.e)-1 else DATEDIFF(YYYY, t.s, t.e) end, t.s)) , t.e) D
FROM (SELECT '20081231' 's', '20090101' 'e') t 
) t