發佈日期:

Intro to Artificial Intelligence

課程網址:https://www.udacity.com/course/viewer#!/c-cs271

什麼是Intelligent Agent

人工智能代理(Agent)根據環境的感知器(下圖的Sensors)傳入的資料,經過一連串的映設函數(紅箭頭部份),藉由效應器對環境做影響(下圖Actuators)。在裡面紅色箭頭部份是最重要的課題,這稱為代理控制策略。
螢幕快照 2014-02-18 下午11.05.25
如上圖這樣的一個決策過程會重覆進行很多次,從環境將資訊透過Sensors傳給Agent,經過代理做出決定,然後用Actuators影響環境,這樣的一個周期稱為perception action cycle。

AI應用範疇

  1. 財務金融:應用環境可以在股票市場、債卷市場或期貨市場,感知到一些東西的資訊和相關新聞,決策則是買入和賣出。
  2. 機器人學:這個是研究時間最長的一門ai領域,他的Sensors及Actuators都是與物理環境交互,而更為特殊。
  3. 遊戲:分兩種,一種是與人類對戰,像是象棋對戰,對Agent來說玩家是環境,它必需觀察玩家的動作,目的是戰勝玩家。另一種是遊戲情境模擬,為了要讓遊戲更自然,讓玩家感覺遊戲世界像真實世界般。
  4. 醫藥學:可以用在終身醫療上,輸入過去病史,讓它可以幫助判斷未來可能出現的疾病。
  5. WEB應用:像智能搜索,對語意進行判定,然後幫助找出可能更符合使用者想要的搜尋結果。

術語介紹

  1. 完全可觀察的環境 vs 部份可觀察的環境(partially)
    完全可觀察:例如一些牌類遊戲,當所有牌都已被掀開在桌子上,我們可以看到所有的資訊,可以算出最佳解答。
    部份可觀察:像另一些紙牌遊戲,有些牌是掀開的,有些則是未被掀開的。這時就要去觀察並記憶過去曾有的牌型紀錄,和桌上現有的牌,來推算可能是最有利的出牌方式。越多的歷史紀錄可以幫助Agent去做出更正確的推斷。這個循環稱為馬爾可夫模型(Markov Model),我們會廣泛的討論要如何具有下面的這種結構:
    螢幕快照 2014-02-19 上午1.10.56拷貝
  2. 確定性環境 vs 隨機性環境(stochastic)
    確定性環境:Agent所做的結果會產生的影響是否確定。例如像在象棋遊戲中,移動一個棋子的效果是完全可預見的。
    隨機性環境:像是大富翁的擲骰子遊戲,雖然所做的決定會影響結果,但是我們無法預期骰子會擲出多少,因此無法完全預見所做決策會影響到的效果。
  3. 離散環境 vs 連續環境(continuous)
    離散環境:有有限多個選擇和可能性,例如象棋遊戲。
    環境:可做的行動或可能性是無限的,例如丟飛鏢會有無限種角度的可能性與加速方式
  4. 良性環境 vs 敵對環境(adversarial):環境因素的存在與影響是否剛好與我們所要達成的目標相反?

AI的不確定性

螢幕快照 2014-02-19 上午1.51.16

包括感知器的有限、很多時候會忽略掉某些不重要或無法判別的因素、敵對因素的影響、隨機性環境的不可預測因素、可計算的步數有限性等…。而AI的存在就是在處理並控制不確定性以供做出決策的規則。

定義問題

  1. 初始狀態:一開始的狀態
  2. 動作狀態:若當Agent處於該狀態時會有那幾種可能性(返回一組該狀態可做行動的序列)
  3. 結果狀態:一個狀態和一個動作為輸入,一個新的狀態為輸出
  4. 目標測試函數:是否這個狀態是可達成目標的。
  5. 路徑成本函數:計算從a狀態到b狀態要花的成本

幾個路徑計算方式

螢幕快照 2014-02-19 下午2.20.59
求從上圖的路徑中的A點到B點的最佳路徑的方式有下面這些工具:

  1. Graph Search vs Tree Search
  2. Graph
  3. Tree
  4. BFS
  5. DFS
  6. Best-first Search:在大部份的時後,找到最佳解是最困難的,因此這部份很難實作,有許多文章有在探討相關實作方式。

像上述的這些搜尋方式,是完全不考慮有什麼意外發生的狀態下才有效的。
要使用上面這種路徑搜尋方式,環境必須符合下面幾項條件:
螢幕快照 2014-02-19 下午2.12.33

  1. 搜索域必須是完全可觀察的,換句話說,我們必須具備觀察我們開始的初始狀態的能力
  2. 域必須是可知的,我們必需知道我們可採取的行動的集合
  3. 必須為離散域,可選擇的行動的數量必需是有限的
  4. 域必須是具有確定性的,必須知道採取某一行動所產生的結果
  5. 域必須是靜態的,除了我們自己的行動以外,域中不可以存在任何可以改變它的東西

在AI中以機率去找出最佳解

貝葉斯概率:http://wiki.mbalib.com/zh-tw/%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%A6%82%E7%8E%87
聯合概率分布:http://zh.wikipedia.org/wiki/%E8%81%94%E5%90%88%E5%88%86%E5%B8%83
貝葉斯網絡可以簡潔地表示一個聯合概率分佈狀況,如下圖可表示一個汽車壞掉可能原因的貝葉斯網路圖,我們觀察一些面板數值,然後去推斷可能的原因的發生機率,再去做交叉比對,這樣就可以列出一個概率分布圖。
螢幕快照 2014-02-19 上午3.15.19

機率學相關概念:互補事件獨立性事件(任意兩個變量的聯合概率是兩個機率的乘積)、貝葉斯法則

貝葉斯公式

螢幕快照 2014-02-19 下午7.55.50
P(A|B) = P(B|A) P(A) / P(B)
P(A,B) = P(A|B) P(B)

經過如下的推導
未命名1
可得知P(A,B|C) = P(A|B,C) P(B|C)

這邊有相關的理論說明:條件機率與貝氏定理

範例題目
螢幕快照 2014-02-19 下午5.37.10

是在探討今天若心情很好P(H)可能原因有天氣好P(S)或是被加薪P(R)
假使天氣好P(S)的機率為0.7
被加薪P(R)的機率為0.01

P(H | S,R) = 1 >> 天氣好且被加薪,心情好機率為1
P(H | ^S,R) = 0.9 >> 天氣不好但被加薪,心情好的機率為0.9
P(H | S,^R) = 0.7 >> 天氣好但沒被加薪,心情好的機率為0.7
P(H | ^S,^R) = 0.1 >> 天氣不好又沒被加薪,心情好的機率為0.1

則求出P( R | H,S)  > 也就是求出在心情好且天氣好的狀況下,是被加薪的機率
下面是好心人在討論版所給的詳解方式

According to Bayes formula p(R|H,S) = p(H,S|R)p(R)/p(H,S) = p(H|S,R)p(S|R)p(R)/p(H,S) (1)
In the second equality we used the analog of formula p(H,S) = p(H|S)p(S) but under definite value of R: p(H,S|R) = p(H|S,R)p(S|R).
Further, p(S|R) = p(R|S)p(S)/p(R). Plugging it in the formula (1) and accounting that p(H,S) = p(H|S)p(S) we get the targeted expression:
p(R|H,S) = p(H|R,S)p(R|S)/p(H|S). It’s the strict formula and should be remembered. It’s easy if you note that this formula is the custom Bayes rule p(R|H) = p(H|R)p(R)/p(H) but under definite value of S of all probabilities in the formula.

發佈日期:

Git版本控管學習筆記(1)

我過去一直都是使用SVN來做專案的版本控管的工作,
最近突然很頻繁的聽到圈內的人都用git這個東西,強調他分散式適合分散式開發等等的優點。
再加上最近有看到保哥的30天精通Git版本控管的教學文,
就決定好好的來學習一下這個新的版本控管系統。

在過去,較有名的檔案管理系統有SVNCVSVisual SourceSafeVSTS
不過,這些版本管理系統大都採用集中式控制,
也就是一定要連上Server才可以commit資料。

而Git則強調分散式管理,他可以在本機就先commit資料,當連到網路之後,才去與server上的系統做合併
這樣有一個很大的好處,就是即使今天人在國外,無法連上網路而需要繼續工作,
或公司的svn是使用區網去連接,但我們卻無法連接至公司網路時,
也可以commit程式的變更,這個特性在分散式的開發上十分的方便。

決定要學GIT後,第一個就是要選擇工具

CloudHsu推薦下面兩款:

  1. mac系統上使用SourceTree
  2. 在windows上使用gitextensions

上面這兩款都是圖形化GUI介面的操作軟體。

不過保哥在文章裡面有提到,最終在使用上,因為操作方便性以及使用方便性,還是會選擇使用GUI介面的操作工具。
但是,在剛開始學習時,由於對整個GIT概念的了解,他還是建議從下指令碼開始學習,以下是節錄他的學習建議:

* 先擁有 Git 基礎觀念,透過下指令的方式學習是最快的方式,不要跳過這一段
* 找多一點人跟你一起學 Git 版本控管,最好能直接用在實務的開發工作上
* 團隊中最好要有幾個先遣部隊,可以多學一點 Git 觀念,好分享給其他人,或有人卡關時,能適時提供協助
* 了解 Git 屬於「分散式版本控管」,每個人都有一份完整的儲存庫(Repository),所以必須經常合併檔案
* 使用 Git 的時候,分支與合併是常態,但只要有合併,就會有衝突,要學會如何解決衝突

因此我還是先裝Git for Windows,在保哥的系列文章的第二篇,有很詳細的解說
請看在Windows平台必裝的三套Git工具,一定要先裝Git for Windows才能裝GitHub for Windows
他一樣很大推SourceTree,這一套CloudHsu也說很好用!

首次使用如果有成功登入 GitHub 帳戶,GitHub for Windows 會自動建立一組 SSH Key-Pair

GitHub for Windows 幫你產生的 SSH Key 預設路徑如下:
"C:\Users\<username>\.ssh\github_rsa"
"C:\Users\<username>\.ssh\github_rsa.pub"

這樣以後可以不用每次登入GitHub都要輸入帳號密碼。

而預設的工作目錄則是在
C:\Users\<username>\Documents\GitHub

在登入github網站後,點選右上的Account settings,然後點選SSH Keys
可以看到現在連接到你gitHub帳號的電腦所使用的SSH key。

2013-11-11_180939
然後這是安裝好的GitHub for Windows介面的樣子
2013-11-11_183846

今天學的三個指令
<詳細教學文請見此>

  1. 建立本地儲存庫
    mkdir demo
    cd demo
    git init
  2. 建立本地共用儲存庫
    mkdir demo
    cd demo
    git init --bare
  3. 從遠端取出儲存庫
    (2) 先在此取得儲存庫的網址
    2013-11-11_182141
    (2) git clone [REPOSITORY_URI]

相關資料:

  1. 30天精通Git版本控管
  2. Git Magic
  3. Git教學
發佈日期:

利用ant 構建和部署專案

Ant 可以代替使用 javac 、 java 和 jar 等命令來執行 java 操作,從而達到輕松的構建和部署 JAVA 項目的目的。

1. 利用ant 的javac命令來編譯JAVA程式

Ant 的javac命令用於實現編譯JAVA 程式的功能。下面來看一個簡單的例子:首先我們建立名為 JAVATestPro的JAVA項目,建立src目錄為源代碼目錄,在src目錄下建立HelloWorld.java這個類檔。該類檔的內容如下:

public class HelloWorld {
    public static void main(String[] args) {
       System.out.println("hello world!");
    }
}

同時在JAVATestPro項目的根目錄下建立build.xml 檔,在該檔中編譯sr 目錄下的JAVA檔,並將編譯後的class檔放入build/classes 目錄中,整個項目的目錄結構如下:

|JAVATestPro
|src
|build
|classes
|build.xml

在編譯前,需清除classes 目錄,該檔的內容如下:

<?xml version="1.0" ?>

<project name ="javacTest" default="compile" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
</project>

在項目根目錄(C:\ThinkInJAVACode\JAVATestPro)執行ant命令後,可在該目錄下發現新生成的build/classes子目錄,編譯後生成的HelloWorld.class檔就在該目錄下。

2. 使用java命令執行JAVA程式

Ant 中可以使用 java命令實現運行JAVA程式的功能。可以在上面的build.xml基礎上做修改來實現:

<?xml version="1.0" ?>
<project name ="javacTest" default="run" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
<target name="run" depends ="compile">
<java classname ="HelloWorld">
<classpath>
<pathelement path="${basedir}/build/classes"/>
</classpath>
</java>
</target>
</project>

接著,就可以在主控台看見輸出:” hello world!”

3. 使用jar命令生成jar檔

還可以在上例的基礎上更進一步,來生成jar包,可在run 這個 target 下再加上如下 target :

<?xml version="1.0" ?>
<project name ="javacTest" default="jar" basedir=".">
<target name="clean">
<delete dir="${basedir}/build"/>
</target>
<target name="compile" depends ="clean">
<mkdir dir ="${basedir}/build/classes"/>
<javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>
</target>
<target name="run" depends="compile">
<java classname ="HelloWorld">
<classpath>
<pathelement path="${basedir}/build/classes"/>
</classpath>
</java>
</target>
<target name="jar" depends="run">
<jar destfile="helloworld.jar" basedir="${basedir}/build/classes">
<manifest>
<attribute name="Main-class" value="HelloWorld"/>
</manifest>
</jar>
</target >
</project>

其中,project的default 屬性設置為應設為jar,ant運行完畢後,可看到在項目的根目錄下生成了一個 helloworld.jar的jar包 。可通過運行以下命令來執行該jar包:

java -jar helloworld.jar

4. 使用war命令打包JAVAEE項目

建立一個JAVAEE項目,其中src 為JAVA源代碼目錄,WebContent為各jsp存放目錄,lib 為項目引用的的包的目錄。在WebTest項目目錄下建立了build.xml 檔,該檔為該工程的 Ant 構件檔。

|WebContent
|src
|build
|classes
|WebContent
|META-INF
|MANIFEST.MF
|WEB-INF
|lib
|classes
|HelloJSP.jsp
|build.xml

讀者可以 src 目錄下放入在前續例子中開發的 HelloWorld.java 檔,並在 WebContent下建立 HelloJSP.jsp 檔,其內容很簡單,就是輸出 Hello 資訊,代碼如下所示:

<%@ page language="java" contentType="text/html;charset=UTF-8" 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>war test for ant</title>
</head>
<body>
Hello JSP!Hello Ant!
</body>
</html>

接下來編寫 build.xml 檔,其內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<project name ="WebTest" default ="war" basedir =".">
<property name ="classes" value ="${basedir}/build/classes"/>
<property name ="build" value ="${basedir}/build"/>
<property name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/>
<!-- 刪除build 路徑-->
<target name ="clean">
<delete dir ="${build}"/>
</target>

<!-- 建立build/classes 路徑,並編譯class 檔到build/classes 路徑下-->
<target name ="compile" depends ="clean">
<mkdir dir ="${classes}"/>
<javac srcdir ="${basedir}/src" destdir ="${classes}"/>
</target>

<!-- 打war 包-->
<target name ="war" depends ="compile">
<war destfile ="${build}/WebTest.war" webxml ="${basedir}/WebContent/WEB-INF/web.xml">
<!-- 拷貝WebRoot 下除了WEB-INF 和META-INF 的兩個檔夾-->
<fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/>
<!-- 拷貝lib 目錄下的jar 包-->
<lib dir ="${lib}"/>
<!-- 拷貝build/classes 下的class 檔-->
<classes dir ="${classes}"/>
</war>
</target>
</project>

在C:\ThinkInJAVACode\WebTest目錄下運行ant後,就生成了WebTest.war 檔了,然後可以將其放入Web容器(如Tomcat)的相應目錄下(${Tomcata安裝目錄}\webapps)運行該web項目了。

發佈日期:

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">
發佈日期:

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} 分別取得這兩個屬性值。

發佈日期:

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

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

他們提出了三個原因:

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

發佈日期:

人月神話讀後筆記


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

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

發佈日期:

在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

發佈日期:

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\4.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
再依範例自行試看看如何實現