廣告

2015年4月30日 星期四

[gradle]let gradle project can be import by eclipse


1. cd yourProject

2. add following to your build.gradle
apply plugin: 'eclipse'

3. $ gradle eclipse

then you can import code to your celipse

[linux] [java] download jdk1.7 64bit on linux and add to environment path



download jdk1.7 64bit for linux 

這樣是不行的
wget http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz" \
-O jdk-7-linux-x64.tar.gz


要加header
wget --no-cookies \
--no-check-certificate \
--header "Cookie: oraclelicense=accept-securebackup-cookie" \
"http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz" \
-O jdk-7-linux-x64.tar.gz


因為下載頁面有一個需要點選接受的按鈕.


解壓縮:
tar -xzf jdk-7-linux-x64.tar.gz -C /opt/

新增環境變數
export PATH=$PATH:/opt/jdk1.7.0_55/bin

export JAVA_HOME=/opt/jdk1.7.0_55/

[searchEngine] install Solr 4.7.2 on linux elasticity



1.
download solr
$ wget http://www.eu.apache.org/dist/lucene/solr/4.7.2/solr-4.7.2.tgz > solr-4.7.2.tgz

2.解壓縮
$ tar -xzf solr-4.7.2.tgz

3.
將/opt/download/solr-4.7.2/example/webapps/solr.war
複製到自己要deploy的路徑裡並解開

$ cp solr.war /opt/app/solrApp/solr

$ jar xvf solr.war
#我是在/opt/app/solrApp/solr 底下解開
  
4.  
將/opt/download/solr-4.7.2/example/solr底下的東西
放到/opt/app/solrApp/底下


5.
放所需的solr lib到 tomcat/lib 下
$ sudo cp -r ext/* /opt/apache-tomcat-7.0.61/lib

6.
搬log檔
cp /opt/download/solr-4.7.2/example/resources/log4j.properties classes/


7.
到/opt/apache-tomcat-7.0.61/conf/Catalina/localhost/
新增solr.xml
$ vim solr.xml
內容如下
  


  


  
  
  
8.
重啟
$ sudo sh /opt/apache-tomcat-7.0.61/bin/shutdown.sh 
$ sudo sh /opt/apache-tomcat-7.0.61/bin/startup.sh  
  
  
9.
給權限 
sudo chmod 777 collection1/  
  



2015年4月27日 星期一

[design pattern] [java] Decorator pattern

這種模式讓你不用修改現有的interface,
並且對其新添加功能,

重點在於Employee.java的第七行,
除了複寫walk的method,還添加了
run的method在裡面.




Human.java
package com.test.decoratorpattern;

public interface Human {

 void walk(String msg);
}




Man.java
package com.test.decoratorpattern;

public class Man implements Human{

 @Override
 public void walk(String msg) {
  System.out.println("class is Man , "+msg);
 }

}




ManDecorator.java
package com.test.decoratorpattern;

public class ManDecorator implements Human {

 protected Human decoratedHuman;

 public ManDecorator(Human decoratedHuman) {
  this.decoratedHuman = decoratedHuman;
 }

 public void walk(String msg) {
  decoratedHuman.walk("class is ManDecorator:"+msg);
 }

}




Employee.java
package com.test.decoratorpattern;

public class Employee extends ManDecorator {

 public Employee(Human decoratedHuman) {
  super(decoratedHuman);
  // TODO Auto-generated constructor stub
 }

 @Override
 public void walk(String msg) {
  decoratedHuman.walk(msg);
  run(decoratedHuman);
 }

 private void run(Human decoratedHuman) {
  System.out.println("class is Employee: Run");
 }

}




testDecorator.java
package com.test.decoratorpattern;

public class testDecorator {

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  Human man = new Man();
  man.walk(" man ");
  
  Human employee = new Employee(new Man());
  employee.walk(" employee ");

        
 }

}




Console
class is Man ,  man 
class is Man ,  employee 
class is Employee: Run

[linux] workbench連不到xampp的資料庫但是網頁可以連到phpmyadmin (環境為本機連到vm)


cd /opt/lampp/etc
vim vim my.cnf
註解他
#skip-networking

並且
因為我是從本機電腦連到vm的mysql

所以新增一個使用者.
主機位置給他 "%"
也就是任意位置
,不然預設的root位置是@localhost
這樣本機會連不到vm
(因為本機的localhost不等於vm的localhost)

[linux][解決] xampp 裝完後發現連不到他的mysql


法一
發現連不到資料庫
http://192.168.22.148/phpmyadmin/


做以下步驟:
cd到/opt/lampp/phpmyadmin

修改內容config.inc.php
$ sudo vim config.inc.php
$ cfg['Servers'][$i]['password']='your password'


進入mysql command line
$ /opt/lampp/bin/mysql -u root -plewis

更新密碼
UPDATE mysql.user SET Password=PASSWORD('root') WHERE User='root';


重啟
$ sudo /opt/lampp/lampp start
$ sudo /opt/lampp/lampp stop


法二
或者是在xampp安裝完時

輸入以下指令
sudo /opt/lampp/lampp security

2015年4月26日 星期日

[linux] install xampp on ubuntu


以下為錯誤步驟 , 可以跳到下面的正確步驟
step1
add ppa
$ sudo add-apt-repository ppa:upubuntu-com/xampp

此時系統會問你要步要加入ppa
到這網址查看內容https://launchpad.net/~upubuntu-com/+archive/ubuntu/xampp
裡面列出一些package
ppa : Personal Package Archive
詳細參考http://article.yeeyan.org/view/213582/193672


step2
$ sudo apt-get update

step3
$ sudo apt-get install xampp

此方法不行因為缺少套件
所以先移除吧
$ sudo apt-get remove xampp
ppa也別忘了移除
$  sudo add-apt-repository --remove ppa:upubuntu-com/xampp



以下為正確步驟
好的我們重來一次

#下載xampp包到指定路徑
$ wget -P /opt/download/xampp64bit.run http://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.8.3/xampp-linux-x64-1.8.3-2-installer.run/download

#添加權限
$ sudo chmod +x xampp64bit.run

#執行
$ sudo ./xampp64bit.run


#接著會進入安裝畫面,就下一步下一步吧

#啟動 lampp
$ sudo /opt/lampp/lampp start

#看到以下訊息
Starting XAMPP for Linux 1.8.3-2...
XAMPP: Starting Apache...already running.
XAMPP: Starting MySQL...ok.
XAMPP: Starting ProFTPD...ok.


如果要啟動VM就自行運作 xampp
$ sudo vim /etc/rc.local
加入
/opt/lampp/lampp start
exit 0

將網頁放到如下位置即可呈現
/opt/lampp/htdocs/

因為我是用putty連到我的vm
所以測試成功與否就從外部的window來看
結果如下:













xampp 帳/密 xampp/lewis
mysql 障/密 root/lewis
連不到sql的話參考這篇
workbench連不到參考這篇

[linux] Install tomcat7.0.61 on ubuntu with "wget"

安裝tomcat

這邊用wget而不用apt-get install
因為用後者會把一些內容放到不同目錄
這樣不好管理,當然每個人習慣不同.
#下載apache-tomcat-7.0.61.tar.gz
$ wget http://ftp.tc.edu.tw/pub/Apache/tomcat/tomcat-7/v7.0.61/bin/apache-tomcat-7.0.61.tar.gz


#解壓縮到/opt/  ,opt/:一般都是放第三方服務的安裝
$ sudo tar -xzf apache-tomcat-7.0.61.tar.gz -C /opt/


#啟動tomcat
$ sudo sh /opt/apache-tomcat-7.0.61/bin/startup.sh
#會看到如下訊息
Using CATALINA_BASE:   /opt/apache-tomcat-7.0.61
Using CATALINA_HOME:   /opt/apache-tomcat-7.0.61
Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.61/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/apache-tomcat-7.0.61/bin/bootstrap.jar:/opt/apache-tomcat-7.0.61/bin/tomcat-juli.jar
Tomcat started.


因為我是用putty 連到我的vm
所以測試成功與否就從外部的window來看
結果如下

#接著要修改使用者帳密
$ sudo vim conf/tomcat-users.xml


   
   


改完就可以管理你的app


#重新啟動
$ sudo sh /opt/apache-tomcat-7.0.61/bin/shutdown.sh
$ sudo sh /opt/apache-tomcat-7.0.61/bin/startup.sh














之前有介紹window版本的安裝以及webservice

[linux] remove install app


$ sudo apt-get remove app-name

ex: sudo apt-get remove tomcat7

2015年4月24日 星期五

[linux] crontab 基本使用

這篇主要目的是要說
cronjob執行jar檔 需要給jdk路徑==
WTF
因為看到這篇
http://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work
有時間看一下這篇
http://www.cyberciti.biz/faq/linux-unix-set-java_home-path-variable/
詳細教學可以操考下面兩個網址
https://help.ubuntu.com/community/CronHowto
http://linux.vbird.org/linux_basic/0430cron.php

環境變數可以參考這篇


crontab 設定

edit cronjob 
$ crontab -e

list cronjob 
$ crontab -l

例如
* 19-22 * * * cd /opt/acer/cronjob/channelData;export PATH=$PATH:/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin; java -cp "./*:./lib/*" com.acer.control.ChnelDataFlowHandler ibobar y y 3 y y y twn 0 ""

restart cron
$ sudo /etc/init.d/cron restart

check log
$ cat /var/log/syslog

[linux] export ,設定環境變數 |Environment variable


#列出目前所有變數
export

#添加變數
export PATH=$PATH:/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin

此時打一次exoprt 會發現已經添加

#修改profile
vim /ext/profile
#加入
export PATH=$PATH:/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin

#修改.bashrc
cd ~
vim .bashrc
export PATH=$PATH:/usr/lib/jvm/java-1.7.0-openjdk-amd64/bin

立即生效:
. ~/.bashrc

#測試
echo $PATH

2015年4月23日 星期四

export jar檔時出現 "eclipse class file on classpath not found or not accessible"

因為專案裡面有mark掉某java檔的整個
內容(包含class name),
因為程式碼全部被mark.
這樣bin下面會產不出class檔而導致錯誤,
 所以不能將class name給mark掉.    


結論:
這不知道是eclipse本身的bug又或者是java本來就這樣規定?

[linux] vim 常用指令 |vim common command

用putty連linux時,常要改一些設定檔,crronjob, shell script等等
用vim來改比較快也比較方便.

這邊列出一些常用指令


#首先創建一個文字檔
vim filename.txt

#進入編輯模式
i

#離開編輯模式 
esc

#離開
shift + :
q

#離開並存檔
wq

#下列為一般模式下

#左下上右
hjkl

#進階 一次往下5行
5j

#螢幕向下/上 一頁
ctrl + f/b

#移到該行最前面 
0

#尋找
/keyword

#刪除整列
dd

#複製
yy

#貼上 
p

#復原
u


2015年4月21日 星期二

[ununtu] change time-zone settings from the command line


sudo dpkg-reconfigure tzdata

[linux] 將指令的內容輸出到某檔案


use ">"
date +%Y%m%d > backcronjob.txt
lewis@ubuntu:/opt$ cat backcronjob.txt
20150318

lewis@ubuntu:/opt$ ls -l /opt/app/abStore_data/ > backcronjob.txt
lewis@ubuntu:/opt$ cat backcronjob.txt
total 4
drwxr-xr-x 4 root root 4096 Mar 18 13:14 data

2015年4月20日 星期一

[linux] Run jar on linux with command line


here is java test code
package testJava;

public class testLinuxArg {

 public static void main(String[] args) {

  System.out.println("args lenght:" + args.length);

  for (int i = 0; i < args.length; i++) {
   System.out.println("args:" + i + " is : " + args[i] + " type   is "
     + args[i].getClass() + "  length is " + args[i].length());
  }
 }
}

export as jar,
put it to your linux

run jar on linux
 java -cp "the lib you need" fileName
 ex: java -cp "./*:./lib/*" testJava.testLinuxArg "1" "" "3" $(pwd)


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