#project一開始會有兩條branch, #master(主要開發用) & release(上版用) #開branch git branch release #push release這個分支 #ex:git push origin release #每次要上版 1.merge master to release git merge release maste 2.push to remote git push 3.(add tag 會add到當前你在的分支) git tag $release-versioNname #ex:git tag v1.1.1 git push $repository_name $release-versioNname #ex:git push origin v1.1.1
廣告
2015年4月16日 星期四
[git] The step of release production code to remote
2015年4月13日 星期一
[java] read/write properties file | 讀/寫 properties 檔
package testJava;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;
public class testProperties {
private static String propertiesName = "server.properties";
private static String serverAddr = "";
private static Integer serverPort = 0;
private static Integer threadCnt = 0;
public static void main(String[] args) {
System.out.println("before load Properties");
System.out.println("serverAddr:"+serverAddr+"\nserverPort:"+serverPort+"\nthreadCnt:"+threadCnt);
System.out.println("after load Properties");
loadParams();
System.out.println("serverAddr:"+serverAddr+"\nserverPort:"+serverPort+"\nthreadCnt:"+threadCnt);
System.out.println("==================");
System.out.println("save value to Properties");
System.out.println("serverAddr:"+serverAddr+"\nserverPort:"+serverPort+"\nthreadCnt:"+threadCnt);
serverAddr = "192.168.0.0";
serverPort = 4543;
threadCnt = 111;
saveParamChanges();
System.out.println("load value form Properties");
loadParams();
System.out.println("serverAddr:"+serverAddr+"\nserverPort:"+serverPort+"\nthreadCnt:"+threadCnt);
System.out.println("==================");
System.out.println("print all content");
printThemAll();
}
public static void loadParams() {
Properties props = new Properties();
InputStream is = null;
// First try loading from the current directory
try {
is = new FileInputStream(propertiesName);
props.load(is);
serverAddr = props.getProperty("ServerAddress");
serverPort = new Integer(props.getProperty("ServerPort"));
threadCnt = new Integer(props.getProperty("ThreadCount"));
} catch (Exception e) {
System.out.println(e.getMessage().toString());
}finally {
if (is != null) {
try {
is.close();
} catch (Exception e) {
System.out.println(e.getMessage().toString());
}
}
}
}
public static void saveParamChanges() {
OutputStream out = null;
Properties props = new Properties();
try {
props.setProperty("ServerAddress", serverAddr);
props.setProperty("ServerPort", ""+serverPort);
props.setProperty("ThreadCount", ""+threadCnt);
out = new FileOutputStream(propertiesName);
props.store(out, "This is an optional header comment string");
}
catch (Exception e ) {
System.out.println(e.getMessage().toString());
}finally {
if (out != null) {
try {
out.close();
} catch (Exception e) {
System.out.println(e.getMessage().toString());
}
}
}
}
private static void printThemAll() {
Properties prop = new Properties();
InputStream input = null;
try {
String filename = propertiesName;
input = new FileInputStream(propertiesName);
prop.load(input);
if (input == null) {
System.out.println("Sorry, unable to find " + filename);
return;
}
Enumeration e = prop.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = prop.getProperty(key);
System.out.println("Key : " + key + ", Value : " + value);
}
} catch (Exception e) {
System.out.println(e.getMessage().toString());
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
System.out.println(e.getMessage().toString());
}
}
}
}
}
console
before load Properties serverAddr: serverPort:0 threadCnt:0 after load Properties server.properties (系統找不到指定的檔案。) serverAddr: serverPort:0 threadCnt:0 ================== save value to Properties serverAddr: serverPort:0 threadCnt:0 load value form Properties serverAddr:192.168.0.0 serverPort:4543 threadCnt:111 ================== print all content Key : ServerPort, Value : 4543 Key : ServerAddress, Value : 192.168.0.0 Key : ThreadCount, Value : 111
2015年4月9日 星期四
[git] clone specific version & push branch to remote
事情是這樣的.
每次上板前都應該branch一個版本出來
並且push 到server.
樣樣revert比較快.
clone specific version from remote
push branch to remote
每次上板前都應該branch一個版本出來
並且push 到server.
樣樣revert比較快.
clone specific version from remote
$ git clone $URL $ git reset --hard $SHA1 EX:git reset --hard 5201870025b316252008882aecbd2e2fd8d68787 To again go back to the most recent commit $ git pull
push branch to remote
$ git remote -v shows remote repository name and url //基於此版本 branch 一個 版本出來 $ git branch branch_name 切換 branch $ git check branch_name push branch $ git push repository_name branch_name
2015年4月7日 星期二
[design pattern] [java] Chain of Responsibility Pattern
責任鏈模式在物件導向程式設計裡是一種軟體設計模式,
它包含了一些命令對象和一系列的處理對象。
每一個處理對象決定它能處理哪些命令對象,
它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。
該模式還描述了往該處理鏈的末尾添加新的處理對象的方法
AbstractLogger.java
FileLogger.java
ConsoleLogger.java
ErrorLogger.java
ChainPatterntest.java
console
它包含了一些命令對象和一系列的處理對象。
每一個處理對象決定它能處理哪些命令對象,
它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。
該模式還描述了往該處理鏈的末尾添加新的處理對象的方法
AbstractLogger.java
package com.test.chainofresponsibilitypattern;
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
// next element in chain or responsibility
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
System.out.println("current class :"+this.getClass().getSimpleName()+" "+
"current(this).level : " + this.level + " " +
"level(from function) = "+ level);
if (this.level <= level) {
write(message);
}
if (nextLogger != null) {
//find out whether there have "next"
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
FileLogger.java
package com.test.chainofresponsibilitypattern;
public class FileLogger extends AbstractLogger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File Logger: " + message);
}
}
ConsoleLogger.java
package com.test.chainofresponsibilitypattern;
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Console Logger: " + message);
}
}
ErrorLogger.java
package com.test.chainofresponsibilitypattern;
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Logger: " + message);
}
}
ChainPatterntest.java
package com.test.chainofresponsibilitypattern;
public class ChainPatterntest {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
//order is important
//return the first object you set
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO,
"This is an information.");
System.out.println("======================");
loggerChain.logMessage(AbstractLogger.DEBUG,
"This is an debug information.");
System.out.println("======================");
loggerChain.logMessage(AbstractLogger.ERROR,
"This is an error information.");
}
}
console
current class :ErrorLogger current(this).level : 3 level(from function) = 1 current class :FileLogger current(this).level : 2 level(from function) = 1 current class :ConsoleLogger current(this).level : 1 level(from function) = 1 Console Logger: This is an information. ====================== current class :ErrorLogger current(this).level : 3 level(from function) = 2 current class :FileLogger current(this).level : 2 level(from function) = 2 File Logger: This is an debug information. current class :ConsoleLogger current(this).level : 1 level(from function) = 2 Console Logger: This is an debug information. ====================== current class :ErrorLogger current(this).level : 3 level(from function) = 3 Error Logger: This is an error information. current class :FileLogger current(this).level : 2 level(from function) = 3 File Logger: This is an error information. current class :ConsoleLogger current(this).level : 1 level(from function) = 3 Console Logger: This is an error information.
2015年4月5日 星期日
[git] diff : add . & add -u & add -A
先新增三個檔案當作測試用 after_modify.txt new_add.txt deleted.txt 並且都git add ========================== git rm deleted.txt 修改after_modify.txt內容 此時看status如下
git add . 結果如下: 會發現 deleted.txt 沒有近來
========================== git reset ==========================
git add -u 結果如下: 圖 會發現 new_add.txt 沒有近來
========================== git reset ==========================
git add -A 結果如下: 全都進來了
總結一下:
git add -A :全都進到stages git add . :git rm 的會沒有 git add -u :新增的檔案沒有
[git] 基本git使用 tutirial 2 (branch, merge)
gitk --all //圖形化介面 git branch //列出目前所有branch git checkout -b issue513 // 由現在的環境為基礎, 建立新的 branch git checkout issue513 //切換branch
在 branch新增 檔案 並且 add , then commit.
切回 master git checkout master merge: git merge issue513
訂閱:
文章 (Atom)





