blogspot.com-GA4

星期五, 2月 24, 2012

Statement Of Work, SOW 工作條款

SOW的目的是用以描述使用者對專案所期望獲得之結果,並說明專案應如何及何時與用什麼方法來完成最後產品或服務之交付。
SOW把專案工作與合約作聯繫的敘述,專案由WBS提供架構,而SOW依此描述整個專案必須要做的工作,含產品、服務及其他組成專案的活動,並提供報告、執行成效與報告等比較基準。
一份好的工作條款可以清楚定義專案之需求、降低專案在執行上產生誤解之風險,幫助專案經理來檢視專案之執行效益,並可約束專案團隊成員、合約商或需求者之責任、權力與義務。
工作條款要點

清晰(明白)的規格需求。
表達合約商的特性責任,讓其了解買方對工作完成後所期望的滿意程度。
具體但亦保留一定彈性、使若賣方被強制執行某特定工作時也不致造成問題。
僅引用規格與標準所需之參考文件,因其之多寡將直接造成總價款的增減幅度。
將背景資料與建議程序能從賣方責任中清楚區別。
避免直接指導如何執行工作,應表述需要何種結果。
工作條款主要內容

利害關係人及職掌
利害關係人:參考「專案管理簡介」
職掌:參考「專案組織」
專案目標/目的
參考「專案起始」
專案範疇


工作條款範例
XX飯店營造專案

專案團隊負責設計,建造位於XX路XX號地址及交付5星級飯店。
本飯店為本公司因應國家觀光發展計畫,計畫推出國際風系列飯店的旗艦飯店,具指標性意義。
飯店包含3間餐廳,1間健身房,10間單人房,30間雙人房及3間會議室(各可容納20,40,100人),全安標準必須符合當地及國家建管標準。
飯店風格為「地中海」風,由XX公司負責設計,建造。
不含內部裝潢及中庭設計(由YY公司負責)
簽約後18個月內完成專案及交付飯店。
專案總金額不超過100萬美金。

工作條款發展之步驟

決定發展SOW所採用的格式
決定SOW所應涵蓋的範圍
確認相關之限制因素
參考合約內容
決定專案之技術需求
決定專案之品質需求
工作條款發展之步驟
參考文件並為該文件裁製適當的指導綱要
具體說明清楚SOW中的每一條款
使用範本整合以上所有資訊以完成SOW 之發展

相官連節
轉貼連節

星期五, 2月 10, 2012

【轉貼】Easy DOS command

Easy DOS command

前言: 剛開始接觸電腦的人, 因為 Windows 的好用, 會讓人覺得學習電腦實在很容易, 可是如果要到 DOS 執行的指令, 總是令人感到蠻害怕的, 畢竟 DOS 給人的感覺沒有 Windows 來的親切嘛! 但是站長要跟你說喔! DOS 的指令其實也只有那麼一丁點 , 只要這點小指令你學起來了, 管它是 DOS 還是 Windows , 都是通行無阻的喔! 從此之後 , 保證 DOS 不再讓你害怕了, 讓我來教教你這些簡單的指令吧!

( 雖然 MS 的新產品將不再支援 DOS 系統 , 不過 MS 的 NT 裡也是有類似 DOS 的工具存在 , 所以這些指令對初學者也不會完全沒用。)

DOS 2000 年危機 :
1. 在 DOS 下 DIR 列出的檔案為什麼日期顯示為 00 呢 ? 別擔心 , 只要加上 /4 參數就可以將日期正常顯示為 2000 了 , ex. dir/4
如果您嫌每次 DIR 都要加上 /4 參數粉麻煩的話 , 您也可以在 C:\Config.sys 裡增加這一行 set dircmd=/4 , 你可以用筆記本來開啟Config.sys 這個檔案 , 等修改好了存檔完畢之後重新開機就可以啦! 以後 DOS 下顯示的日期就是 2000 了。

 

1.DIR: 如果你在某個目錄下, 這個所謂的目錄可以是磁碟機, 也可以是資料夾, 譬如 C:\ 好了, 那你想看看 C: 槽究竟放了哪些資料呢? 很簡單喔! 你只要在 C:\ 的後面打上 DIR 就好了, 是不是粉簡單呢? 還有喔! 如果你覺得: 打個 DIR 在按 Enter 之後, 那個檔案咻就跑到最下面去了, 根本都沒看清楚就給它跑走了, 站長跟你說, 沒關係的, 我們不要跟它計較跑的那麼快, 否則有損身為人的自尊哦! 只要在打 DIR/P ,YA! 它每次都只會出現一頁的部分, 等我們看清楚了在按 Enter 看下一頁不就好啦! OK! 還有一個秘密喔! 就是如果你打 DIR/W 的話, 它只會顯示檔案名稱, 不會顯示一堆日期, 檔案大小, ...一堆有的沒有的。

2.FORMAT: 這個指令的用途就是格式化, 你應該知道格式化是什麼吧! 就是可以消滅磁碟中的病毒, 資料,裡面所有的東西, 很可怕喔! 不小心資料都會毀了, 但是磁片或是硬碟在剛買來都是要格式化過的, (現在買到的磁片大多數好像都已經格式化過了 ) ,其實如果磁片壞軌了, 也可以重新格式化, 有時候就好了說, 言歸正傳, 如果我們要格式化 A 槽, 只要打 FORMAT A: 就可以了, 格式化 C 槽就打入 FORMAT C: 就可以了。

3.COPY: 這個指令一看也知道是複製檔案用的嘛! 如果我們要將 A: 中的 lmi.txt 這個檔案複製到 C: 則可以打
COPY A: lmi.txt C:
如果我們要把 lmi.txt 從 A: 複製到 C: 而且要把複製的檔案名稱更為 hsuyin.txt 的話, 我們可以這樣作
COPY A: lmi.txt C: hsuyin.txt
最後還有一個絕招要跟你介紹, 如果你想要複製 A: 中所有的 .EXE檔到 C: ,我們就可以打 COPY A: *.EXE C: 就可以了。

4.DISCOPY: 這跟 COPY 很像, 但不太一樣, 如果你要把 A: 磁片內容整個複製到 B: 你可以打 DISCOPY A: B:

5. XCOPY : 這個指令可以用來複製整個目錄 , 譬如我要將 d:\HSUYIN 這個目錄裡的檔案全部複製到 d:\LMI 裡面 , 只要打入 xcopy d:\HSUYIN d:\LMI 就可以啦 。

6.DEL: 這個指令可以刪除檔案的, 如果說你的電腦中了病毒, 或者你想要刪除一些檔案, 可是在 Windows 系統中它總是告訴你 "Windows 正在使用檔案, 因此無法刪除", 那就是要到 DOS 刪除了, 假設我要刪除 lmi.txt 我只要打 DEL lmi.txt 就可以了, 那如果你要刪除資料夾中所有檔案只要打 DEL *.* 就可以啦。

7.REN: 這是將檔案重新命名, 例如我要將 LMI.TXT 改成 HSUYIN.TXT 就可以打 REN LMI.TXT HSUYIN.TXT 當然, 如果你要更改所有的副檔名, 你也可以打 REN *.TXT *.DOC ,清楚這指令的意思嗎? 這是說我把這個資料夾中所有的 .txt 改成 .doc 檔。

8.MD: 這個指令可以建立一個新的資料夾, 如果我要建立一個 hsuyin 的資料夾我就可以打入 MD hsuyin 或是打 MKDIR hsuyin 也是可以的。

9.RD: 這個指令跟 MD 恰好相反, 可以刪除一個空的資料夾, 一定要是空的才有辦法刪除喔! 用法是這樣子的, 假設我要刪除 hsuyin 就可以打 RD hsuyin 或是打 RMDIR hsuyin

10. DELTREE: 這是比 RD 還要強的刪除資料夾指令, 因為如果要刪除一個資料夾 RD 就要先刪除裡頭所有的資料夾跟檔案, 而 DELTREE 可以連資料夾裡面的資料夾或是檔案一起刪除, DELTREE 就跟 Windows 中的刪除資料夾一樣把整個資料夾給刪除了, 我要刪除 hsuyin 這個資料夾就可以打 DELTREE hsuyin 就可以啦, 是不是粉簡單呢 ?

11.TYPE: 這個指令是給我們列印文字檔用的, 假設我要印 LMI.txt 的內容就打 TYPE LMI.txt 就可以了。

12.CLS: 用來清除螢幕。

13. 尋找檔案 : 在 DOS 裡尋找檔案也蠻方便的喔 ! 如果你要在 C:\ 找一個檔名為 XXX.txt 的檔案你可以打 dir /s XXX.txt 這樣就可以搜尋出所有 c:\ 中的 XXX.txt

14. cd: 在 Windows 中我們要進入一個資料夾只要用滑鼠左鍵點兩下就好啦 ! 在 DOS 中要進入資料夾就是打 CD 了, 現在假設現在我停留在 c:\ 裡 , 我要進入 C:\ 中的 Windows 資料夾 , 我只要打 cd Windows 就可以了, 如果你現在是在 A: ,你只要打 C: 就可以進入 C: 了, 那要怎麼離開資料夾呢? 如果我是在 C:\Windows\Desktop 而我要退回到 C:\Windows 我只要打 cd.. 就可以了。

15. 離開 dos : 若您開啟的是 windows 下的 dos , 那麼要離開 dos 程式只要鍵入 EXIT 就可以囉!

最後我在說明一下這些符號 ( 萬用字元 ) 的意思: 就是 * 跟 ? ( * 是用來當作任意一行字 ? 則是用來當作任意一個字來用), 就像我們之前說的, 我要複製所有的 .txt 檔到 A: 我們可以打 COPY *.txt A: 我們要刪除所有檔案可以打 DEL *.* ( * 就像是一個數學中的變數 X 在這裡我們讓 * 代表了任意一行字, *.txt 就是所有的 .txt 檔, 不管它叫作 lmi.txt 或是hsuyin.txt 或是 123.txt 或是 abcd.txt 都可以 , *.txt 中的 * 取代了 .txt 之前的那串字, 所以不管是 lmi 或是 hsuyin 或是 123 或是 abcd 都可以用 * 來表示, 這樣對 * 的意思你們應該已經了解了吧!嗯! 接下來說 ? 的意思, 其實 * 只要懂了, ? 的意思也不難, 因為 * 是代表一串字, 而 ? 是代表一個字, 喔! 知道了吧! 你看看喔! DEL ???.txt 是什麼意思, 我們是要刪除所有在 .txt 前面是三個字的檔案, 以前面的例子來說, lmi.txt 跟 123.txt 會被刪除, 而 hsuyin.txt 和 abcd.txt 因為 hsuyin 跟 abcd 不是 3 個字元嘛! 所以不會被刪除, 蠻好玩的喔!

其他指令: ( 可以不用看 , 不過您可以試試看 , 蠻有趣的 )

1. date : 更改系統日期 。

2. time : 更改系統時間 。

3. ver : 查詢您系統的版本 。

4. edit : DOS 下的文書編輯程式 。

5. more : 與 type 一樣功能 , 不過有自動分頁 。

6. move : 移動檔案 , 用法與 copy 類似 。

7." > " : 改變輸出 , 譬如 dir > 1.txt 將會把 dir 出來的內容傳到 1.txt 這個文字檔案裡面 ( 1.txt 可命名為任意文字檔名 , 1.txt 可為已存在檔案或是不存在的檔案 , 若為不存在檔案 , 系統會自動建立。 )

8. 指令參數使用說明 : 以上的 dos 指令都有更多詳細的參數使用說明 , 您可以在指令後加上 /? 就可以查詢此只應的參數了 , 比如我要查詢 dir 的用法只要在 dos 中鍵入 dir/? 即可。

9. attrib 在 DOS 底下更改檔案屬性 : 比如我要將 readme.txt 屬性改成隱藏檔 , 可以打 attrib +h readme.txt , 那如果要取消檔案隱藏的屬性 , 只要將 + 改成 - 號就可以了 ex. attrib -h readme.txt , 更多的參數設定請在 DOS 底下打入 attrib /? 查詢。

如果對更多 DOS 的指令有興趣 , 您可以查詢關於 DOS 的書籍。

星期四, 2月 09, 2012

基於按annotation的hibernate主鍵生成策略[轉載]

自訂主鍵生成策略,由@GenericGenerator實現。
hibernate在JPA的基礎上進行了擴展,可以用一下方式引入hibernate獨有的主鍵生成策略,就是通過@GenericGenerator加入的。

比如說,JPA標準用法
Java代碼
@Id
@GeneratedValue(GenerationType.AUTO)

就可以用hibernate特有以下用法來實現
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")


@GenericGenerator的定義:
Java代碼
@Target({PACKAGE, TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface GenericGenerator {

String name();

String strategy();

Parameter[] parameters() default {};
}


name屬性指定生成器名稱。
strategy屬性指定具體生成器的類名。
parameters得到strategy指定的具體生成器所用到的參數。

對於這些hibernate主鍵生成策略和各自的具體生成器之間的關係,在org.hibernate.id.IdentifierGeneratorFactory中指定了,
Java代碼
static {
GENERATORS.put("uuid", UUIDHexGenerator.class);
GENERATORS.put("hilo", TableHiLoGenerator.class);
GENERATORS.put("assigned", Assigned.class);
GENERATORS.put("identity", IdentityGenerator.class);
GENERATORS.put("select", SelectGenerator.class);
GENERATORS.put("sequence", SequenceGenerator.class);
GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
GENERATORS.put("increment", IncrementGenerator.class);
GENERATORS.put("foreign", ForeignGenerator.class);
GENERATORS.put("guid", GUIDGenerator.class);
GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated
GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
}

上面十二種策略,加上native,hibernate一共默認支援十三種生成策略。

1、native 對於orcale採用Sequence方式,對於MySQL和SQL Server採用identity(處境主鍵生成機制),native就是將主鍵的生成工作交給資料庫本身,hibernate不管。(很常用)
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "native")

2、uuid 採用128位元的uuid演算法生成主鍵,uuid被編碼為一個32位元16進制數位的字串。佔用空間大(字串類型)。
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")

3、hilo 要在資料庫中建立一張額外的表,默認表名為hibernate_unque_key,默認欄位為integer類型,名稱是next_hi(比較少用)
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "hilo")

4、assigned 在插入資料的時候主鍵由程式處理(很常用),這是元素沒有指定時的預設生成策略。等同於JPA中的AUTO。
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

5、identity 使用SQL Server和MySQL的自增欄位,這個方法不能放到Oracle中,Oracle不支持自增欄位,要設定sequence(MySQL和SQL Server中很常用)。等同於JPA中的IDENTITY
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "identity")

6、select 使用觸發器生成主鍵(主要用於早期的資料庫主鍵生成機制,少用)
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name="select", strategy="select",
parameters = { @Parameter(name = "key", value = "idstoerung") })

7、sequence 調用謹慎資料庫的序列來生成主鍵,要設定序列名,不然hibernate無法找到。
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

8、seqhilo 通過hilo演算法實現,但是主鍵歷史保存在Sequence中,適用於支援Sequence的資料庫,如Orcale(比較少用)
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "seqhilo",
parameters = { @Parameter(name = "max_lo", value = "5") })

9、increment 插入資料的時候hibernate會給主鍵添加一個自增的主鍵,但是一個hibernate實例就維護一個計數器,所以在多個實例運行的時候不能使用這個方法。
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "increment")

10、foreign
Java代碼
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @Parameter(name = "property", value = "employee") })


注意:直接使用@PrimaryKeyJoinColumn 報錯(?)
Java代碼
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
例如
Java代碼
@Entity
public class Employee {
@Id Integer id;

@OneToOne @PrimaryKeyJoinColumn
EmployeeInfo info;

}
應該為
Java代碼
@Entity
public class Employee {
@Id
@GeneratedValue(generator = "idGenerator")
@GenericGenerator(name = "idGenerator", strategy = "foreign",
parameters = { @Parameter(name = "property", value = "info") })
Integer id;

@OneToOne
EmployeeInfo info;

}
11、guid 採用資料庫底層的guid演算法機制,對應MySQL的uuid()函數,SQL Server的newid()函數,ORCALE的rawtohex(sys_guid())函數等
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "guid")

12、uuid.hex 看uudi,建議用uuid替換
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "uuid.hex")

13、sequence-identity
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "sequence-identity",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })

四、通過@GenericGenerator自訂主鍵生成策略
如果實際應用中,主鍵策略為程式指定了就用程式指定的主鍵(assigned),沒有指定就從sequence中取。
明顯上面所討論的策略都不滿足,只好自己擴展了,集成assigned和sequence兩種策略。

Java代碼
public class AssignedSequenceGenerator extends SequenceGenerator implements
PersistentIdentifierGenerator, Configurable {
private String entityName;

public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
entityName = params.getProperty(ENTITY_NAME);
if (entityName==null) {
throw new MappingException("no entity name");
}

super.configure(type, params, dialect);
}

public Serializable generate(SessionImplementor session, Object obj)
throws HibernateException {

Serializable id = session.getEntityPersister( entityName, obj )
.getIdentifier( obj, session.getEntityMode() );

if (id==null) {
id = super.generate(session, obj);
}

return id;
}
}

實際應用中,定義同sequence。
Java代碼
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "AssignedSequenceGenerator",
parameters = { @Parameter(name = "sequence", value = "seq_payablemoney") })


值得注意的是,定義的這種策略,就像打開了潘朵拉魔盒,非常不可控。正常情況下,不建議這麼做。

星期六, 2月 04, 2012

MYSQL SELECT ROWNUM

在抓MYSQL 的資料時,需要一個ROWNUM 的欄位,而MYSQL並沒有提供,
沒有辦法做到像是ORACLE 的ROWNUM,
所以找到了以下的方法


select @rownum:=@rownum+1 `product_category_id`,
0 `parent_id`,
1 `level`,
kind_name `title`,
'0' `wai_flag`
from kind ,
(SELECT @rownum:=0) r
order by kind_id desc limit 10;