打包不同環境設定檔的 build.xml
/ant/lib/jsp-api.jar /ant/lib/junit-4.4.jar /ant/lib/servlet-api.jar /src /test /web /config/yourconfigfolders1 /config/yourconfigfolders2 /config/yourconfigfolders3 ... /config/yourconfigfoldersN只要確定專案資料夾結構符合規定就可以使用這份 build.xml
clean : 清空 build 與 dist 資料夾 clean-dist-jarwar : clean 與 dist 後打包檔案到 dist 資料夾 clean-dist-test : clean 與 dist 後執行測試 clean-dist-test-jarwar : clean 與 dist 與 test 後打包檔案到 dist 資料夾注意這是在使用 target 的時候要帶參數, 目的就是要指定想使用哪一個設定檔.
ant clean-dist-jarwar -Dconfig=yourconfigfolders1想打包 /config/yourconfigfolders2, 就輸入
ant clean-dist-jarwar -Dconfig=yourconfigfolders2依此類推.
<?xml version="1.0" encoding="UTF-8"?>
<project name="myproject" default="default" basedir=".">
<description>Builds the project.</description>
<property name="project.name" value="myproject" />
<property name="dist" value="dist" />
<property name="build" value="build" />
<property name="build.version" value="1.0" />
<property name="lib" value="web/WEB-INF/lib" />
<property name="ant.lib" value="ant/lib" />
<property name="build.reports.tests" value="build/reports/tests" />
<property name="build.tests" value="build/tests" />
<property name="build.tests.classes" value="build/tests/classes" />
<property name="build.web" value="build/web" />
<property name="build.web.classes" value="${build.web}/WEB-INF/classes" />
<property name="build.web.lib" value="${build.web}/WEB-INF/lib" />
<property name="src.java" value="src" />
<property name="src.test" value="test" />
<property name="src.config" value="config/${config}" />
<property name="src.webapp" value="web" />
<property name="dist.manifest" value="dist/MANIFEST.MF" />
<property name="dist.mainclass" value="" />
<path id="build.classpath">
<fileset dir="${ant.lib}" includes="*.jar" />
<fileset dir="${lib}" includes="*.jar" />
</path>
<target name="clean">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
<target depends="clean" name="clean-dist">
<mkdir dir="${build.web.classes}" />
<mkdir dir="${build.tests.classes}"/>
<mkdir dir="${dist}" />
<javac destdir="${build.web.classes}"
srcdir="${src.java}"
classpathref="build.classpath"
source="1.5"
target="1.5"
encoding="UTF-8">
</javac>
<copy todir="${build.web.classes}">
<fileset dir="${src.java}">
<exclude name="**/*.java" />
<include name="**/*"/>
</fileset>
</copy>
<javac destdir="${build.tests.classes}"
srcdir="${src.test}"
classpathref="build.classpath"
source="1.5"
target="1.5"
encoding="UTF-8">
<classpath location="${build.web.classes}" />
</javac>
<copy todir="${build.tests.classes}">
<fileset dir="${src.test}">
<exclude name="**/*.java" />
<include name="**/*"/>
</fileset>
</copy>
<copy todir="${build.web.lib}">
<fileset dir="${lib}" />
</copy>
<copy todir="${build.web}">
<fileset dir="${src.webapp}" />
</copy>
</target>
<target name="clean-dist-test" depends="clean-dist">
<mkdir dir="${build.reports.tests}" />
<copy todir="${build.web.classes}">
<fileset dir="${src.config}" />
</copy>
<junit haltonfailure="false" showoutput="true">
<jvmarg value="-version:1.5.0" />
<classpath>
<pathelement path="${build.tests.classes}" />
<pathelement path="${build.web.classes}"/>
<path refid="build.classpath" />
</classpath>
<batchtest fork="yes" todir="${build.reports.tests}">
<fileset dir="${src.test}">
<include name="**/*"/>
</fileset>
<formatter type="xml" />
</batchtest>
</junit>
</target>
<target name="init-dist-manifest">
<copy todir="dist/lib">
<fileset dir="${lib}" includes="*.jar" />
</copy>
<path id="jar.classpath">
<fileset dir="dist/lib">
<include name="*.jar" />
</fileset>
</path>
<manifestclasspath property="jar.manifest.classpath" jarfile="dist/${project.name}.jar">
<classpath refid="jar.classpath" />
</manifestclasspath>
<manifest file="${dist.manifest}">
<attribute name="Class-Path" value="${jar.manifest.classpath}" />
<attribute name="Main-Class" value="${dist.mainclass}"/>
<attribute name="Implementation-Title" value="${project.name}"/>
<attribute name="Implementation-Version" value="${build.version}"/>
<attribute name="Implementation-Vendor" value="YourCompany Technology Corporation"/>
<attribute name="Implementation-Build" value="myproject-${build.version}-M201001240200"/>
</manifest>
</target>
<target depends="clean-dist-test,init-dist-manifest" name="clean-dist-test-jarwar">
<jar destfile="dist/${project.name}.jar" manifest="${dist.manifest}" >
<fileset dir="${build.web.classes}"/>
</jar>
<copy todir="${build.web.classes}">
<fileset dir="${src.config}" />
</copy>
<war destfile="${dist}/${project.name}.war">
<fileset dir="${build.web}" />
</war>
</target>
<target depends="clean-dist,init-dist-manifest" name="clean-dist-jarwar">
<jar destfile="dist/${project.name}.jar" manifest="${dist.manifest}" >
<fileset dir="${build.web.classes}"/>
</jar>
<copy todir="${build.web.classes}">
<fileset dir="${src.config}" />
</copy>
<war destfile="${dist}/${project.name}.war">
<fileset dir="${build.web}" />
</war>
</target>
</project>
Posted at 02:37上午 一月 24, 2010 by shooeugenesea in Others | 迴響[0]
codeline 的控制
專案通常會有三種環境: DEV / UAT / PROD.
為了讓每次的佈署與修改的 bug 都有好的版本管理方式, 我列一下一個需求進來該有怎樣的操作流程.
希望看官們能給點意見, 謝謝! :D
(這只是草稿, 希望以後可以適當的完整, 也不要太複雜好讓人容易記住).
- create branch for development
- create branch from trunk to /branches/DEV/
- develop in branch
- test in branch
- fix bugs in branch
- finish branch development
- merge to trunk
- create tag from trunk to /tags/DEV/
- merge branch to trunk
- test in trunk
- fix bugs in trunk
- finish trunk mergence
- deploy to UAT
- create tag from trunk to /tags/UAT/ before deploy to UAT
- deploy to UAT
- test in UAT
- fix bugs in UAT
- create branch from /tags/UAT/ to /branches/UAT
- fix bugs in /branches/UAT/
- test in /branches/UAT/
- finish fix bugs in /branches/UAT/
- create tag from trunk to /tags/UAT/
- merge from branch to trunk
- go to "deploy to UAT"
- finish UAT deployment
- deploy to PROD
- create tag from trunk to /tags/PROD/ before deploy to PROD
- deploy to PROD
- test in PROD
- fix bugs in PROD
- create branch from /tags/PROD/ to /branches/PROD/
- fix bugs in /branches/PROD/
- test in /branches/PROD/
- finish fix bugs in /branches/PROD
- create tag from trunk to /tags/PROD/
- merge from branch to trunk
- go to "deploy to PROD"
- finish PROD deployment
Posted at 10:44上午 十一月 18, 2009 by shooeugenesea in Others | 迴響[2]
[分享] 節錄版本控制與平行開發文章重點的投影片
今天在公司分享介紹一篇文章
Streamed Lines: Branching Patterns for Parallel Software Development
有做投影片節錄重點.
http://docs.google.com/present/view?id=dcsswcvv_5f65vrwfp
不過這篇文章好像蠻久的了, 而且也只是大概看一下, 如果有誤解或是該抓的重點沒抓到請提出來討論喔.
Posted at 11:26下午 十一月 06, 2009 by shooeugenesea in Others | 迴響[0]
簡單的推文到 twitter, plurk, facebook
因為客戶想要, 所以看一下客戶口中的"推文到 twitter, plurk, facebook"是怎麼回事.
根據客戶的描述文字, 目前猜測可能是以下的簡單功能.
facebook 的部份跟 twitter/plurk 不太一樣的地方是不知道怎麼顯示字串訊息
而且給的是網頁的位址, facebook 會自動去找那個網頁有什麼可以顯示的..
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
<script type="text/javascript">
function sendToPlurk() {
var msg = document.getElementById('msg').value;
window.open('http://www.plurk.com/?qualifier=shares&status=' + msg );
}
function sendToTwitter() {
var msg = document.getElementById('msg').value;
window.open('http://twitter.com/home/?status=' + msg );
}
function sendToFacebook() {
var url = document.getElementById('url').value;
window.open('http://www.facebook.com/sharer.php?u=' + encodeURIComponent(url) );
}
</script>
</head>
<body>
<input type="text" size="100" id="msg" value="測試" /><br />
<a href="javascript:sendToPlurk()">
發訊息上 plurk
</a><br />
<a href="javascript:sendToTwitter()">
發訊息上 twitter
</a><br /><br /><br />
URL : <input type="text" size="100" id="url" value="http://www.youtube.com/watch?v=x6QA3m58DQw" /><br />
<a href="javascript:sendToFacebook()">
發訊息上 facebook
</a>
</body>
</html>
Posted at 01:03上午 十月 06, 2009 by shooeugenesea in Others | 迴響[0]
簡單, 複雜與靈活設計的記分
程式設計中, 簡單才是王道. 可是如果都只求 work 的簡單也不太好.
今天心血來潮, 突然覺得這好像可以自己評分.
整個過程目的就是要計算積分後取絕對值, 分數愈低表示設計愈恰當.
"簡單"積分是1
"複雜"積分是10
"靈活"積分是-10
所以一個個的小程式區塊設計就可以評分:
如果你有一個簡單, 沒有靈活, 那你的程式是 Math.abs( 1 + 0*10 + 0*-10 ) = 1 分
如果有一個簡單, 但是有一個靈活, 那就是 Math.abs( 1 + 0*10 + 1*-10 ) = 9 分
如果有一個簡單, 而且還有一個複雜, 但是都沒有靈活, 那就是 Math.abs( 1 + 1*10 + 0*-10 ) = 11 分
當然你也可以把10個簡單換成一個複雜.
如何, 是這樣的感覺嗎?
簡單是最重要的,
可是當簡單變複雜就是一點點重構與一點點設計模式出馬建立一個靈活的時候了.
Posted at 01:20上午 七月 03, 2009 by shooeugenesea in Others | 迴響[0]
Tomcat 用 ImageIO 讀圖要有 temp 資料夾
今天遇到一個狀況就是無法在 Tomcat 上用 ImageIO 讀圖片, 出現
javax.imageio.IIOException: Can't create cache file! javax.imageio.ImageIO.createImageInputStream(ImageIO.java:333) javax.imageio.ImageIO.read(ImageIO.java:1321) org.apache.jsp.test_jsp._jspService(test_jsp.java:65) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)讓人大吃一驚, 因為原本程式都跑好好的.
Posted at 09:14下午 六月 15, 2009 by shooeugenesea in Others | 迴響[0]
依不同環境包檔案的 build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="fubon-sportslotto-activity-200907" default="default" basedir=".">
<description>Builds the project myp.</description>
<property name="project.name" value="myp" />
<property name="dist" value="dist" />
<property name="build" value="build" />
<property name="lib" value="lib" />
<property name="build.test" value="build/test" />
<property name="build.web" value="build/web" />
<property name="build.web.classes" value="${build.web}/WEB-INF/classes" />
<property name="build.web.lib" value="${build.web}/WEB-INF/lib" />
<property name="main.resources" value="src/main/resources" />
<property name="src.java" value="src/main/java" />
<property name="src.config.dev" value="src/main/config-dev" />
<property name="src.config.uat" value="src/main/config-uat" />
<property name="src.config.prod" value="src/main/config-prod" />
<property name="src.webapp" value="src/main/webapp" />
<path id="build.classpath">
<fileset dir="${lib}" includes="*.jar" />
</path>
<target name="clean">
<delete dir="${build}" />
<delete dir="${dist}" />
</target>
<target depends="clean" name="clean-dist">
<mkdir dir="${build.web.classes}" />
<mkdir dir="${dist}" />
<javac destdir="${build.web.classes}"
srcdir="${src.java}"
classpathref="build.classpath"
source="1.5"
target="1.5"
encoding="UTF-8">
</javac>
<copy todir="${build.web.classes}">
<fileset dir="${src.java}">
<include name="**/*.xml"/>
</fileset>
</copy>
<copy todir="${build.web.lib}">
<fileset dir="${lib}" />
</copy>
<copy todir="${build.web}">
<fileset dir="${src.webapp}" />
</copy>
</target>
<target depends="clean-dist" name="clean-dist-uat">
<copy todir="${build.web.classes}">
<fileset dir="${src.config.uat}" />
</copy>
<war destfile="${dist}/${project.name}.war">
<fileset dir="${build.web}" />
</war>
</target>
<target depends="clean-dist" name="clean-dist-dev">
<copy todir="${build.web.classes}">
<fileset dir="${src.config.dev}" />
</copy>
<war destfile="${dist}/${project.name}.war">
<fileset dir="${build.web}" />
</war>
</target>
<target depends="clean-dist" name="clean-dist-prod">
<copy todir="${build.web.classes}">
<fileset dir="${src.config.prod}" />
</copy>
<war destfile="${dist}/${project.name}.war">
<fileset dir="${build.web}" />
</war>
</target>
</project>
Posted at 03:32上午 六月 09, 2009 by shooeugenesea in Others | 迴響[0]
幾個 td 一個 tr 的邏輯
package test;
import java.util.ArrayList;
import java.util.List;
public class TestTrTdWrap {
public static void main(String[] args) {
TestTrTdWrap test = new TestTrTdWrap();
test.test();
}
private void test() {
System.out.println("test 1 items 2 td wrap");
showTrTd( takeItems(1), 2 );
System.out.println("test 7 items 3 td wrap");
showTrTd( takeItems(7), 3 );
System.out.println("test 7 items 2 td wrap");
showTrTd( takeItems(7), 2 );
System.out.println("test 17 items 9 td wrap");
showTrTd( takeItems(17), 9 );
System.out.println("test 17 items 2 td wrap");
showTrTd( takeItems(17), 2 );
}
private List<Item> takeItems(int cnt) {
List<Item> items = new ArrayList<Item>();
for ( int i = 0; i < cnt; i++ ) {
items.add( new Item() );
}
return items;
}
private void showTrTd(List<Item> items, int tdWrap) {
int itemSize = items.size();
int roundCnt = itemSize + ( tdWrap - (itemSize % tdWrap) );
for ( int i = 0; i < roundCnt; i++ ) {
if ( i % tdWrap == 0 ) {
System.out.println("<tr>");
}
if ( itemSize > i ) {
System.out.printf(" <td>%s</td>%n", items.get(i).getContent());
} else {
System.out.println(" <td> </td>");
}
if ( i % tdWrap == tdWrap - 1 ) {
System.out.println("</tr>");
}
}
}
}
class Item {
private String content = "testContent";
public String getContent() {
return content;
}
}
Posted at 12:27下午 六月 02, 2009 by shooeugenesea in Others | 迴響[0]
jsp上取得http開頭網址
<c:set var="jspFolder" value="/WEB-INF" />
<str:substring var="serverURL" start="0" end="${fn:indexOf(pageContext.request.requestURL, jspFolder)}" >${pageContext.request.requestURL}</str:substring>
感覺以後會常用到所以紀錄一下
Posted at 11:50上午 三月 13, 2009 by shooeugenesea in Others | 迴響[0]
CSS - Some notes
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>TEST</title>
<style type="text/css">
pre {
background-color : yellow;
}
</style>
</head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>TEST</title>
<link type="text/css" rel="stylesheet" href="TestXHtml.css" />
</head>
body {
font-size : 10px;
}
/* 一次指定兩個 tag 的效果 */
h1, h2 {
color : gray;
}
/* p tag 如果指定 class 為 classA 就會使用此效果 */
p.classA {
font-size : 10px;
border-width : thin;
border-style : solid;
border-color : #007e7e;
}
/* 任何的 tag 只要 class 為 classB 就使用此效果 */
.classB {
font-size : 20px;
padding-top : 120px;
padding-right : 20px;
padding-bottom : 20px;
padding-left : 20px;
}
如果一個 p tag 宣告
<p class="classB classA">
TEST TESTTEST TESTTEST TESTTEST TEST
</p>
這樣 p tag 同時會有 classA 與 classB 的效果. 不過 font-size 會符合 classB 的效果, 這是因為 classB 比較晚宣告.
<p id="testid">
TEST TESTTEST TESTTEST TESTTEST TEST
</p>
則透過使用 #
/* 不論什麼 tag 只要 id 是 testid 都套用此效果 */
#testid {
font-size : 10px;
}
/* tag p 的 id 是 testid 就套用此效果 */
p#testid {
font-size : 20px;
}
都可以拿來指定 testid 這個 p tag.
/* div tag 下的 p tag 下的所有 blockquote tag 子孫都套用此效果 */
div p blockquote {
font-size : 100px;
}
/* div tag 下的所有 p tag child 都套用此效果 */
div p {
font-size : 100px;
}
/* testid 這個 id 下的所有 p tag 子孫都套用此效果 */
#testid p {
font-size : 100px;
}
/* 只有 testid 這個 id 下的 p tag child (不包括所有子孫, 只有直系 child)套用此效果 */
#testid>p {
font-size : 100px;
}
/* 原本的屬性 */
.classA {
border-width : thin;
border-style : solid;
border-color : #007e7e;
}
/* 可以寫成這樣, 不用管順序 */
.classB {
border : thin solid #007e7e;
}
/* 如果有 top bottom 之類的, 就已上右下左為順序 */
/* 上 0px, 右 10px, 下 20px, 左 30px */
.classC {
padding : 0px, 10px, 20px, 30px;
}
/* 下右下左都一樣, 就寫一個即可 */
/* 四面都 100px */
.classD {
padding : 100px;
}
/* 上下一樣, 左右一樣. */
/* 上下為 10px, 左右 20px */
.classE {
padding : 10px, 20px;
}
/* 字型速記的順序 : font : font-style font-variant font-weight font-size/line-height font-family */
/* 字型速記 optional 的項目有 font-style font-variant font-weight */
/* 連結原本的顏色為藍色 */
a:link {
color : blue;
}
/* 拜訪過的連結是灰色 */
a:visited {
color : gray;
}
/* 滑鼠在上方時呈現綠色 */
a:hover {
color : green;
}
/* id 為 testid 的 tag 滑鼠滑過連結時呈現黃色 */
#testid a:hover {
color : yellow;
}
/* grade : 1 */
h1 {
color : red;
}
/* grade : 11 */
h2.myClass {
color : red;
}
/* grade : 100 */
#testid {
color : red;
}
/* id 為 testid 的 div 元素會浮動到畫面右邊, 其下方的元素會自動往上補又不會蓋掉這個 div */
div#testid {
width : 300px;
background-color : lightblue;
float : right;
}
/* 這樣 testid2 的右邊不會因為 testid 浮動到畫面右邊導致 testid2 的內容被擠壓到.
* testid2 會被擠到 testid 下方 */
div#testid2 {
clear : right;
}
div#testid {
width : 35%;
background-color : lightblue;
float : right;
}
/* margin-left 和 margin-right 設定為 auto 可使這個 div 保持在畫面中間 */
div#allContent {
width : 800px;
margin-left : auto;
margin-right : auto;
}
/* 這樣會底色黃色出現在離頂端 200px 離左方 200px 的位置 */
div#anywhere {
background-color : yellow;
position : absolute;
width : 400px;
top : 200px;
left : 200px;
}
/* 這兩個 div 可看出 : 重疊的時候 anywhere1 會被 anywhere2 蓋過去 */
div#anywhere1 {
position : absolute;
background-color : yellow;
width : 400px;
top : 10%;
right : 20%;
z-index : 10;
}
div#anywhere2 {
position : absolute;
background-color : blue;
width : 200px;
top : 20%;
right : 20%;
z-index : 20;
}
/* HTML */
<div id="outer">
<p>
...some content
</p>
<div id="inner">
<p>
anywhere anywhere anywhere anywhere anywhere anywhere
anywhere anywhere anywhere anywhere anywhere anywhere
</p>
<p>
anywhere anywhere anywhere anywhere anywhere anywhere
anywhere anywhere anywhere anywhere anywhere anywhere
</p>
</div>
<p>
...some content
</p>
</div>
/* CSS */
div#outer {
background-color : yellow;
position : absolute;
top : 100px;
left : 100px;
width : 400px;
}
div#inner {
background-color : green;
position : absolute;
top : 100px;
left : 100px;
width : 100px;
z-index : 2;
}
/* outer 會固定在離瀏覽器頂端 100px 與瀏覽器左邊離 -60px, 所以會被瀏覽器左邊擋掉一點 */
div#outer {
background-color : yellow;
position : fixed;
top : 100px;
left : -60px;
width : 400px;
}
/* outer 會跑到被擠壓過後的位置往下移 50px 往右移 20px */
div#outer {
background-color : yellow;
position : relative;
top : 50px;
left : 20px;
width : 400px;
}
li#a {
list-style-type : disc;
}
li#b {
list-style-type : circle;
}
li#c {
list-style-type : square;
}
li#d {
list-style-type : none;
}
li#e {
list-style-image : url( rock.jpg );
}
/* A.XXX
* B.XXX
* C.XXX
*/
li#f {
list-style-image : upper-alpha;
}
/* A.XXX
* XXX
* B.XXX
*/
li {
list-style-type : upper-alpha;
list-style-position : outside;
}
/* A.XXX
* XXX
* B.XXX
*/
li {
list-style-type : upper-alpha;
list-style-position : inside;
}
table#testid {
border : thin solid black;
border-spacing : 10px 30px;
}
/* 方法 1. 指定 border-spacing */
table#testid {
border : thin solid black;
border-spacing : 0px;
}
/* 方法 2. 指定 border-collapse */
table#testid {
border : thin solid black;
border-collapse : collapse;
}
table table th {
background-color : white;
}
<!-- 手攜裝置的 CSS -->
<link rel="stylesheet" type="text/css" media="handheld" href="forhandheld.css" />
<!-- 列印的 CSS -->
<link rel="stylesheet" type="text/css" media="print" href="forprint.css" />
Posted at 01:45下午 十月 31, 2008 by shooeugenesea in Others | 迴響[0]
SQL - 查詢每天最後一筆
create table TEST_DATE (
ID varchar(40),
EMP_ID varchar(40),
MY_DATE timestamp
)
然後我的需求是, 找出某個 EMP_ID 每天的最後一筆資料, 結果就是
select * from TEST_DATE d2 where d2.MY_DATE in (
select MAX_DATE from ( (
select DATE(d.MY_DATE) DAY, max(d.MY_DATE) MAX_DATE
from TEST_DATE d
where d.EMP_ID = '123456'
group by DATE(d.MY_DATE)
) T
) )
Posted at 09:23上午 十月 18, 2008 by shooeugenesea in Others | 迴響[0]