2015年12月28日 星期一

[javascript] not not (!!) 運算

!!false===false
!!true===true
!!0===false
!!parseInt("foo")===false// NaN is falsy
!!1===true
!!-1===true// -1 is truthy
!!""===false// empty string is falsy
!!"foo"===true// non-empty string is truthy
!!"false"===true// ...even if it contains a falsy value
!!window.foo===false// undefined is falsy
!!null===false// null is falsy
!!{}===true// an (empty) object is truthy
!![]===true// an (empty) array is truthy; PHP programmers beware!

2015年11月2日 星期一

[Multithread] Java multithread

Java multithread - 1


在開發多執行緒程式時,常發生的問題是共用資源非同步問題,就像工作一個人做好好的,多一個人沒有協調好就是來添亂的,除了叫他麥來亂之外,可能好好協調才是增加產能的好策略。

本系列文主要把之前遇過的一些多執行緒問題紀錄一下,然後一些資料參考這本書和部分本人的記憶,如果有疏漏或是錯誤也請不吝指教。

問題


  • 共用物件
  • 多資源資源鎖定
  • Job - Worker
  • 排程

Java - Syncronized


  • syncronized method
  • syncronized block

Java - Thread


  • wait
  • sleep
  • join
  • yank
  • notify/notifyAll
  • interrupt
  • Thread/Runnable
  • Mutax Object

Queue Design


Worker Design


Job

[maven] profile - activation

http://maven.apache.org/guides/introduction/introduction-to-profiles.html

profile 設定裡面除了 id, build 之外還有個蠻有用的設定

activation 可以用來設定啟用這個 profile 的條件 (哇喔~~~)

指定 JDK 1.4
  1. <activation>
  2. <jdk>1.4</jdk>
  3. </activation>

JDK 1.3~1.6前
  1. <activation>
  2. <jdk>[1.3,1.6)</jdk>
  3. </activation>

特定 OS
  1. <activation>
  2. <os>
  3. <name>Windows XP</name>
  4. <family>Windows</family>
  5. <arch>x86</arch>
  6. <version>5.1.2600</version>
  7. </os>
  8. </activation>

有 debug 這個 property
  1. <activation>
  2. <property>
  3. <name>debug</name>
  4. </property>
  5. </activation>

environment 設定成 test -Denvironment=test
  1. <activation>
  2. <property>
  3. <name>environment</name>
  4. <value>test</value>
  5. </property>
  6. </activation>

沒有某個檔案或資料夾
  1. <activation>
  2. <file>
  3. <missing>target/generated-sources/axistools/wsdl2java/org/apache/maven</missing>
  4. </file>
  5. </activation>

預設啟動
  1. <activation>
  2. <activeByDefault>true</activeByDefault>
  3. </activation>

2015年10月17日 星期六

[maven] profile 使用

最近專案在發佈的時候,需要把 war 檔案中的 config, jar 等檔案移出來的需求

看了一下 maven-war-plugin 的範例文件

把專案設定丟出來加些說明

1. 在 pom.xml 裡面增加 profiles 不同的 profile 可以適用不同環境的上版參數設定

2. profile 裡面主要有三個 plugin,設定大概如下方說明

3. mvn clean install -Dmaven.test.skip=true -Puat

-P 就是指定 profile 的意思

Eclipse version


threads 跟 skip Tests 都是自己加的 不需要可以自己移掉


--- plugin 示意

  •  maven-war-plugin : 
    • 處理 war 檔案包裝,包括檔案過濾、web.xml 指定、其他資源載入等
  • maven-compiler-plugin
    • java 編譯相關參數,設定編譯用參數,顯示提示等
  • maven-resource-plugin
    • 將設定檔案移動至指定位置

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 執行。