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

2014年11月2日 星期日

[T-SQL] yyymm -> yyymmdd

-- YYYMM TO YYYMMDD (FIRST DAY)
select @STR+'01';

-- YYYMM TO YYYMMDD (LAST DAY)
select @STR+CONVERT(VARCHAR, DAY(DATEADD(DAY, -1, DATEADD(M, 1, convert(datetime, convert(varchar, (SUBSTRING(@str, 1, 3)+1911))+SUBSTRING(@str, 4, 2)+'01', 112)))));

2014年10月29日 星期三

[T-SQL] 利用起訖查詢月區間

declare @sdate datetime
declare @edate datetime

set @sdate = convert(datetime, '2014/01/02');
set @edate = convert(datetime, '2014/12/15');

WITH dt(idx, s, e) as(
select 1, 
    @sdate, 
    DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0, @sdate)+1,0))
union all
select idx+1, 
    DATEADD(mm, DATEDIFF(m,0,dateadd(m, 1, s)),0), 
    case when dateadd(m, 1, e) < @edate 
        then DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,dateadd(m, 1, e))+1,0)) 
        else @edate 
        end 
    from dt 
    where dateadd(m, 1, s) < @edate
)
select *
from dt;

-------
1 2014-01-02 00:00:00.000 2014-01-31 23:59:59.000
2 2014-02-01 00:00:00.000 2014-02-28 23:59:59.000
3 2014-03-01 00:00:00.000 2014-03-31 23:59:59.000
4 2014-04-01 00:00:00.000 2014-04-30 23:59:59.000
5 2014-05-01 00:00:00.000 2014-05-31 23:59:59.000
6 2014-06-01 00:00:00.000 2014-06-30 23:59:59.000
7 2014-07-01 00:00:00.000 2014-07-31 23:59:59.000
8 2014-08-01 00:00:00.000 2014-08-31 23:59:59.000
9 2014-09-01 00:00:00.000 2014-09-30 23:59:59.000
10 2014-10-01 00:00:00.000 2014-10-31 23:59:59.000
11 2014-11-01 00:00:00.000 2014-11-30 23:59:59.000
12 2014-12-01 00:00:00.000 2014-12-15 00:00:00.000



2014年5月30日 星期五

[js] JavaScript的"類別"用法 ~2~

類別的建立方式收集

1. 
var Person = function(_name, _age){
  this.name = _name;
  this.age = _age;
};

2. 
var Person = function(_name, _age){
  return {
    name: _name,
    age: _age
  }
};

3. 
// 匿名類別
var p = (function(){
  return {
    name: _name,
    age: _age
  };
}());

4.
// 隔空發功建立物件
var p;
(function(){
  p = {
    name: _name,
    age: _age
  };
}());