廣告

2015年4月16日 星期四

[git] The step of release production code to remote


#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月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
$ 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
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


[git] 不錯的git教學

因為我這邊都只記錄自己常用到的部分,
所以這邊貼上一些當初參考的連結。

http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic/

http://blog.longwin.com.tw/2009/05/git-learn-initial-command-2009/

http://backlogtool.com/git-guide/tw/reference/log.html

https://ihower.tw/blog/archives/2622