Posted on

ANT常用命令

1. copy 命令

copy主要用來對檔和目錄的複製功能。舉例如下:

eg1. 複製單個檔:

<copy file="original.txt" tofile="copied.txt"/>

eg2. 對檔目錄進行複製:

<copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>

eg3. 將檔案複製到另外的目錄:

<copy file="source.txt" todir="../home/philander"/>

2. delete 命令

對檔或目錄進行刪除,舉例如下:

eg1. 刪除某個檔:

<delete file="/home/photos/philander.jpg"/>

eg2. 刪除某個目錄:

<delete dir="/home/photos"/>

eg3. 刪除所有的備份目錄或空目錄:

<delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.bak"/>
</delete>

3. mkdir 命令

創建目錄。 eg :

<mkdir dir="/home/philander/build/classes"/>

4. move 命令

移動檔或目錄,舉例如下:

eg1. 移動單個檔:

<move file="sourcefile" tofile="destfile"/>

eg2. 移動單個檔到另一個目錄:

<move file="sourcefile" todir="movedir"/>

eg3. 移動某個目錄到另一個目錄:

<move todir="newdir"> <fileset dir="olddir"/></move>

5. echo 命令

該任務的作用是根據日誌或監控器的級別輸出資訊。它包括 message 、 file 、 append 和 level 四個屬性,舉例如下

<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">
Posted on

ant 腳本編寫 – 關鍵元素

1. project元素

project 元素是 Ant 構件檔的根項目, Ant 構件檔至少應該包含一個 project 元素,否則會發生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。
  1. name 屬性
    用於指定 project 元素的名稱。
  2. default 屬性
    用於指定 project 默認執行時所執行的 target 的名稱。
  3. basedir 屬性
    用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件檔的附目錄作為基準目錄。
<?xml version="1.0" ?>
<project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJAVACode">
<target name="getBaseDir">
<echo message="The base dir is: ${basedir}"/>
</target>
</project>
從上例可以看出,在這裏定義了default 屬性的值為getBaseDir ,即當運行ant 命令時,如果沒有指明待執行的target,則將執行默認的target–getBaseDir 。此外,還定義了basedir 屬性的值為 “C:/ThinkInJAVACode” ,進入”C:/ThinkInJAVACode” 後運行ant 命令,得一下結果:

Buildfile: C:\ThinkInJAVACode\build.xml
sayBaseDir:
[echo] The base dir is: C:\ThinkInJAVACode
BUILD SUCCESSFUL
Total time: 0 seconds

2. target 元素

target為Ant的基本執行單元,它可以包含一個或多個具體的任務。多個target 可以存在相互依賴關系。它有如下屬性:
  1. name 屬性
    指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。
  2. depends 屬性
    用於描述 target 之間的依賴關系,若與多個 target 存在依賴關系時,需要以「,」間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target 。被依賴的 target 會先執行。
  3. if 屬性
    用於驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。
  4. unless 屬性
    該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。
  5. description 屬
    性該屬性是關於 target 功能的簡短描述和說明。
舉例說明如下:
<?xml version="1.0" ?>
<project name ="targetPro" default="targetB">
<target name="targetA" if ="ant.java.version">
<echo message ="JAVA Version: ${ant.java.version}"/>
</target>
<target name="targetB" depends ="targetA" unless ="philander">
<description>
a depend example!
</description>
<echo message ="The base dir is: ${basedir}"/>
</target>
</project>
從以下結果後可以看到,我們運行的是名為 targetB 的target ,由於它依賴於targetA ,所以 targetA 將首先被執行,同時因為系統配置了JDK,所以 ant.java.version 屬性存在,執行了targetA,輸出資訊:”[echo] JAVA Version: 1.6 “,targetA 執行完畢後,接著執行 targetB ,因為philander不存在,而unless屬性是在不存在時進入所在target 的,由此可知 targetB 得以執行,輸出資訊:

 

[echo] The base dir is: C:\ThinkInJAVACode”。
Buildfile: C:\ThinkInJAVACode\build.xml
targetA:
[echo] JAVA Version: 1.6
targetB:
[echo] The base dir is: C:\ThinkInJAVACode
BUILD SUCCESSFUL
Total time: 0 seconds

 

3. property 元素

property元素可看作參量或者參數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。若要在外部引入某檔,例如 build.properties 檔,可以通過如下內容將其引入:

<property file="build.properties"/>

property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在「 ${ 」和「 } 」之間,並放在 task 屬性值的位置來實現的。
Ant 提供了一些內置的屬性,它能得到的系統屬性的清單與 JAVA 文檔中 System.getPropertis() 方法得到的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它自己的內置屬性,如下:

  1. basedir:project 基目錄的絕對路徑;
  2. ant.file:buildfile的絕對路徑,上例中ant.file值為C:\ThinkInJAVACode\build.xml;
  3. ant.version:Ant 的版本資訊,本文為1.8.1 ;
  4. ant.project.name:當前指定的project的名字,即前文說到的project的name屬性值;
  5. ant.java.version:Ant 檢測到的JDK版本,本文為 1.6 。

舉例說明如下:

<? xml version="1.0" ?>
<project name ="propertyPro" default ="example">
<property name ="name" value ="philander"/>
<property name ="age" value ="25"/>
<target name ="example">
<echo message ="name: ${name}, age: ${age}"/>
</target>
</project>

上例中用戶設置了名為name 和age的兩個屬性,這兩個屬性設置後,在下文中可以通過 ${name}${age} 分別取得這兩個屬性值。

Posted on

沒有銀彈 – 軟體工程的本質性與附屬性工作

在人月神話裡,花了兩章的篇幅說明在軟體開發上,
不會有類似銀彈這種,可以快速解決開發時程延誤或發生重大錯誤的捷徑

他們提出了三個原因:

(1) 複雜性

軟體開發的複雜度與規模大小並非線性的關係,整個複雜度增加情況也會遠遠超過線性預估的結果。也因為結構上的複雜性,當軟體在擴充新功能時,難保不會產生新的副作用。程式裡的狀態難以一一列舉,也更加難以明瞭整個產品也會變的更不可靠。另外因為複雜性關係,開發時也容易遇到溝通困難、時程落後、成本超支的困難。

(2) 配合性

軟體必須配合其他的領域,例如電腦、不同語言、不同介面等等….。

(3) 易變性

1. 時常面臨修改,因為軟體是純思考的產物,有無限延展性,修改容易,也因此特別容易面臨修改
2. 成功的軟體生命周期會比硬體來的長,因此時常會需要配合硬體環境上去修改。

(4) 隱匿性:過於抽象、難以理解。

在這邊他們也提出了幾項過去曾讓軟體界有所突破的重大發展,但這些突破都是屬於附屬性的,沒辦法突破軟體工程本質上的複雜性:

(1) 高階語言:高階語言的發行的確是最強而有力的一次突破,對生產力而言至少有五倍以上的提升。並伴隨得到可靠度、簡潔性、理解力上的增益。它把和程式內涵一點關係都沒有的那一整層複雜性給去除了。

(2) 分時技術:分時技術對於程式設計師的生產力及產品品質有了重大的提升。因為分時確保了即時性,使我們得以持續保持住腦子裡對複雜的概觀。但緩慢的回復時間是附屬難題。

ps: 分時系統:作夜系統依中央處理器排程(CPU Scheduling),將中央處理器的時間切割為極小的時間片段(Time Slice)

(3) 統一的軟體開發環境:Unix和Interlisp是第一個得到廣泛使用的整合開發環境,藉由提供完整的程式庫、統一的檔案格式、管道和過濾器,以促成軟體的共用。

(4) 物件導向程式設計:抽象資料型別和階層式型別的使用。允許介面可以用次一層級的型別去做進一步的細緻化,隱藏類別裡面的實際操作,讓開發者可以在開發時專注於設計該類別的邏輯,排除掉許多附屬性困難

(5) 人工智慧:ex語音辨識、圖形辨識

(6) 專家系統:一支具有廣義推理引擎與知識庫的軟體程式,被設計成可接收輸入資料和假設條件的軟體程式,然後藉由知識庫來推導出邏輯上的結果。這項技術所帶來最重要的進步,是將應用領域的複雜性從程式中區隔出來

(7) 『自動化』程式設計:換句話說是用更高階的語言來編寫程式。未來可能我們會是用『建構』的方式來寫程式,也就是更完備的函式庫,可以讓寫程式的複雜度更加的降低。

(8)  圖形化程式設計(graphical programming):一個博班論文提出的新想法,但本書覺得要有成果應有些困難。

(9) 軟體的驗證:編輯軟體自動驗證程式的某些錯誤。例如比對資料型態、變數是否已宣告等等。

(10) 環境與工具:用來除錯、或是搜尋該類別曾被用在那些地方的開發工具。

(11) 工作站:也就是編輯所消耗的時間,若是機器的編譯時間減少,程式師能花在思考上的時間就會變多。

Posted on

人月神話讀後筆記


花了很多天終於看完了著名的專案管理聖經─『人月神話』
在此整理一下大致的重點

1. 開發一個軟體系統產品要付出的代價是一般組件程式的九倍。因為產品化是一般組件程式的三倍時間,設計整合測試又是三倍時間,這兩方面的成本計算基本上是獨立的。

2. 以成本會計為基礎的時程預估方式,使我們誤把工作量和專案進度混為一談,人月是一個危險並容易遭到誤解的迷思,因為他假設人力和工時可以互換。

在此本書裡面,提到,專案管理人員不應該把人/月這樣的標準來做為專案規劃的標準,因為當人員多起來後,整個專案的運行會需要花更多的時間在溝通、管理、協調上,人月之間的關係並非線性關係。

並且勿忽略掉新的程式師要學習上手的開發時間,以及要耗費掉的老手的教育時間。因此,在一個已經延遲的專案中增加人手,只會讓它更加的落後,這邊較建議的方式是重新安排時程、或者刪減工作。

在這一章裡,也提出建議的專案軟體時程安排方法

1/3 規劃

1/6寫程式

1/4組件測試和早期系統測試

1/4系統測試和完成所有的組件

3. 從第三章到第七章,都是在討論保有『整體概念性』的重要。

一個專案的規劃必需出由同一人之手,也就是說,一個專案不應該有兩個領導者。
我們必須選出一個能力強的人,來帶領整個專案的開發及方向,我們寧可忽略掉一些可能新奇、或很棒的想法,也必須讓整個專案都能呈現同一個設計理念。此一概念便是這本書所一直提及的整體概念性

在第三章裡,此本書提出了一個外科手術團隊的做法,來解釋該如何去達到這個整體概念性的目的。

(1) 首席程式設計師:也就是整體概念性裡所提到的做決策的主腦。負責定義功能、設計程式、測試程式並撰寫文件。
ps: 此本書也提到,真正優秀的專案管理人員,也應該要寫程式,沒有真正去撰寫一些程式的PM,是無法做好專案管理的工作的。

(2) 副手:外科醫生的分身,可以做所有首席設計師所做的事,或提出想法,但是首席設計師不一定要接納他的想法。

(3) 行政助理:幫忙處理首席程式設計師的所有庶務。一位行政助理可同時處理兩個以上團隊的工作。

(4) 文件撰寫人員、秘書(負責專案協調事宜及產品無關文件)、程式助理、測試員、語言專家、工具專家。

4. 第五章的地方,提到了第二系統效應,這個效應是指說,最容易失敗的專案,反而是我們第二個設計的系統,原因是加入了太多不相關功能。我們要慎防在設計第二個系統的時候過度設計(自律)。

5. 第六章在說意念的傳達設計必須出於同一人之手,那些有規範那些沒有應定義清楚。溝通方式包括:將定義(指規格書裡的定義)直接融入實作、開會(分為每週召開的會議、和公開大會,討論一些重大議題及無法預見的瑣碎事項)、多重實作(當規格與程式衝突時兩方都有可能要更改)、電話紀錄(現在可用email)、產品測試(專案經理最好的朋友)

6. 在第七章探討了巴別塔失敗的原因

(1) 充分的溝通十分重要

(2) 工作手冊的結構十分的重要,且每一位成員都應看到全部的文件內容

(3) 專案管理的權力結構應該要是樹狀的,也就是第三章所講的整體概念性,任何人都不能同時聽命於兩個老闆。而組織內的溝通結構則應該是網狀

7.  第八章是在討論專案時程預估要注意的點

(1) 員工只有50%的時間真正在寫程式

(2) 溝通時間應要納入估算

(3) 開發程式的類型不同以及大小之間的關係必須算進去。專案大小及費力程度大概是1.5的指數關係

8. 必須做好整體空間規劃,不單包括常駐空間的、背後有連帶關係的動作也應納入考量(ex: 記憶體分頁錯亂)
方法1. 確保大家的本事是真正通過程式設計的訓練而來
方法2.認知組件是去創造才有,每個專案都應有個手冊是專門蒐集關於佇列、搜尋、堆疊、雜湊(hashing)、Sorting的副程式且要有兩套方法,一個是用的空間最少的、一個是速度最快的。

9. 規劃軟體開發的文件:目標、產品規格、時程、預算、場地配置、組織編製圖

10. 把一次必然的失敗納入正式計劃之中(失敗是成功之母)

(1) 表格驅動技術:將設定值寫在表格檔案之中

(2) 軟體開發十分容易面臨無窮無盡的改變,因此 將改變量化,使組織利於改變

(3) 軟體測試在維護時期要用更多的資源(要做迴歸測試),也會需要進一步、退兩步,任何修改都有可能會破壞掉原有的軟體結構。

11. 第十二章在講開發工具的重要性,通常我們開發時的工具機器和最後程式要跑的目標機器是不一樣的,因此我們需要採用成熟的機器避免偶爾出現/偶爾正常的問題被忽略。程式語言的選擇也是工具的選擇之一,在這邊提到採用高階語言可以大量提高生產力。

12. 在專案開發中要如何避免錯誤的發生呢?在第十三章的地方提到了幾點重點

(1) 整體概念性的具備:也就是不同開發人員做出了彼此不協調的假設,具備了整體概念性的軟體容易使用、易於開發、也比較不容易發生錯誤。

(2) 規格審查:規格書應交給獨立的測試小組進行審查,而不應該給程式設計人員去審查

(3) 由上而下的設計方式:這是一種持續細分精製的步驟,先勾勒出粗略的工作定義和執行方案以得到主要的結果,然後做更深入的探討,看看跟我們真正要的東西有何不同。也就是把大步驟細分成幾個更小的步驟。

(4) 結構化程式設計:由Dijkstra所提出的最短路徑方式,在說由某一節點到另一個結點的最短路徑。

13. 要如何避免大災難的發生,有以下幾點:

(1) 里程碑應要明確、不模陵良可,要明顯到無法讓人自己騙自己,可以輕易查證

(2) 團隊應充滿幹勁,我們亦可提出計劃評核圖(PERT chart)或要徑時程表(critical-path schedule)來顯示什麼做完才可以做什,並告訴我們什麼事情是重要的需要先做

PERT chart
a:最樂觀時間 (Optimistic Time)為最短時間
m:最可能時間 (Most Likely Time)為適中時間
b:最悲觀時間 (Pessimistic Time)為最長時間

要徑的概念:通過網路最長的路徑,稱為要徑。若最長路徑的作業延遲了,整個專案就延遲,若要縮短專案完成時間,只要縮短要徑作業的工期即可。要完成專案,所有的路徑都必須通過。

(3) 避免隱匿不報的狀況發生:為了避免下面的人明知專案延遲卻不往上報的狀況,在組織上應降低角色衝突(老闆不應干涉部屬可以自己解決的問題),並且訂定一些審查技巧。

Posted on

在eclipse裡用ant編檔案

1. 要如何把ant-contrib裝進去
window=>preferences=>ant=>runtime=>global entries
選擇ant-contrib的jar檔

2. 遇到java.lang.OutOfMemoryError: Java heap spac的異常錯誤
window->preferences->java->installed jres->(選擇執行的jdk)edit…
把default vm arguments 的參數設為-Xms64m -Xmx512m

不過我使用的方法是 點檔案右鍵=>properties=>run/DEBUG SETTING 然後按edit
選jre那頁
把vm arguments設為: -Xms64m -Xmx512m

Posted on

ResourceManager動態載入多國語系的實現

事前準備工作
1.[撰寫Ant編譯時所使用的XML檔]
依照原有的XML去設定自己的SDK的位置,並且寫入要載入的語言檔

<?xml version="1.0" encoding="utf-8"?>
    <project name="Example resource bundle builder" basedir="." default="main">
    <!--這邊應設定為自己電腦的flex sdk的位置-->
    <property name="FLEX_HOME" value="C:\Program Files\Adobe\Adobe Flash Builder 4.5\sdks.5.0" />
    <property name="APP_ROOT" value="${basedir}"/>
    <!--這邊需要載入ant編譯as檔案所需的flexTasks.jar以及所有相關編譯所需的函式庫-->
    <taskdef resource="flexTasks.tasks" >
        <classpath> <pathelement path="${FLEX_HOME}/ant/lib/flexTasks.jar"/>
            <pathelement path="${FLEX_HOME}/lib/flexTasks.jar"/>
            <fileset dir="${FLEX_HOME}/lib">
                <include name="**/*.jar"/>
            </fileset>
        </classpath>
    </taskdef>
    <!--定義所有的語言-->
    <target name="main">
        <antcall target="en_US"></antcall>
        <antcall target="zh_TW"></antcall>
    </target>
    <target name="en_US">
        <mxmlc>
            <locale>en_US</locale>
            <source-path>locale/{locale}</source-path>
            <include-resource-bundles>test</include-resource-bundles>
            <output>src/Resources_en_US.swf</output>
        </mxmlc>
    </target>
    <target name="zh_TW">
        <mxmlc keep-generated-actionscript="true">
            <allow-source-path-overlap>true</allow-source-path-overlap>
            <locale>zh_TW</locale>
            <source-path>locale/{locale}</source-path>
            <!--載入相關的函式庫-->
            <compiler.library-path dir="${FLEX_HOME}/frameworks" append="true">
                <include name="libs" />
                <include name="locale/{locale}" />
            </compiler.library-path>
            <!--定義要載入的語言檔案(可以用很多檔案)-->
            <include-resource-bundles>test</include-resource-bundles>
            <!--<include-resource-bundles>other</include-resource-bundles>-->
            <output>src/Resources_zh_TW.swf</output>
        </mxmlc>
    </target>
</project>

2.[設定Ant環境]
(a)Help->Software Updates更新flash builder的Ant編輯程式
(b)Windows->Show View->Other->Ant->Ant把視窗叫出來
(c)按Ant編譯視窗最左邊的Add Buildfiles,選擇剛剛寫的xml
(d)RUN他

3.[設定要產出的flex專案檔的編譯locale參數]
如果是要中文+英文則為-locale en_US zh_TW,如果少了這個動作在變語言時會發生缺少核心語言CORE檔案的問題。

4. locale檔副檔名是.properties

====================================
1. flex版本的實現及範例下載
http://www.nbilyk.com/flex-localization-example

2. 為flash builder安裝ant
http://www.judahfrangipane.com/blog/2007/12/13/flex-builder-3-ant-support/

3. 官方關於ResourceManager的類別資料
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/resources/ResourceManager.html

4. 在flash裡實現多國語系
http://ticore.blogspot.com/2010/07/as3-project-multi-languages.html

5. 各種實現方式
http://blog.csdn.net/fireson/archive/2010/01/12/5181343.aspx

[學習經歷]
首先先至[flex版本的實現及範例下載]下載多國語系範例
然後到[為flash builder安裝ant]實際編譯ResourceManager的語言檔為swf
再依範例自行試看看如何實現