20061227

Loging 實務:log4j 設定檔範例


#設定 Logger(s),格式 logger_name = message_level, appender1, appender2, ...
log4j.rootCategory=error, stdout

#以下是給fileftp.java使用的專屬Category
log4j.category.doftp.name=info, X
#以下設定false時,訊息不會往rootCategory送,只會在doftp.name的自訂Categoey中
log4j.additivity.doftp.name=false

#設定 Appenders
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

### 設定doftp.name是RollingFile的方式
log4j.appender.X=org.apache.log4j.RollingFileAppender
log4j.appender.X.File=doftp.log
log4j.appender.X.MaxFileSize=300KB
log4j.appender.X.MaxBackupIndex=2
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %m%n

20061226

測試預期的 Exception 行為

當某個方法我們預期會丟出 Exception 時,
可利用 fail 這個述詞來測試。
如以下的 JUnit 語法:

public void testGetUserException() {
User u = null;
try {
u = UserFetcher.getUser("ThisUserIdDoesNotExist");
fail("Should have gotten NoSuchUserException - used a bad user ID");
} catch (NoSuchUserException expected) {
; // Expected - intentional
}
}

20061222

組 SQL 字串時,加入 WHERE 1=1 條件,以增加組 SQL 字串彈性

若在一般程式語言存取關聯式資料庫,必須要組 SQL 字串,傳至後端的 DB Server,利用 WHERE 1=1,則可把條件句彈性的組合到 SQL 字串中,如下:

strSQL = "select * ";
strSQL +="from employee ";
strSQL +="where 1=1 ";
if(emp_no.length() > 0) {
strSQL +="and emp_no='"+emp_no+"' ";
}
if(emp_name.length() > 0) {
strSQL +="and emp_name='"+emp_name+"' ";
}

上述程式碼動態要將條件語句加入到原本的 SQL 字串中,而不用考慮原本 SQL 字串的格式。

多個欄位的單一關鍵字查詢,請用 or 運算子

試想,若你希望使用者輸入一個關鍵字來查詢資料, 此關鍵字可以是員工代號,或是員工姓名,那麼也許你會執行兩次 SQL,並判斷兩次 SQL 是否有資料,以達到上述功能:

SQL1:
sqlstr = "select *
from employee
where 1 = 1
and emp_no = '#{keyword}'"

SQL2:
sqlstr = "select *
from employee
where 1 = 1
and emp_name = '#{keyword}'"


上述二個 SQL 可簡單的以 or 運算子合併成下式:

SQL3:

sqlstr = "select *
from employee
where 1 = 1
and emp_no='#{keyword}' or emp_name = '#{keyword}'"

如此一來除了更為簡潔,也讓原本要執行兩次 SQL 查詢,減為一次。

20061221

電腦可能遭受的攻擊分類

惡意程式:
  • 電腦病毒:類似生物病毒必須依附在其它活體,電腦病毒必須依附在其它程式,感染其它程式來散佈
  • 電腦蟲:透過網路自動感染其它主機
  • 特洛伊木馬:可遠端控制其它主機

Web 的攻擊:

  • DoS:癱瘓網路服務,使其無法提供服務

20061127

WEB 實務:forward vs redirect

Redirect: 伺服器會回復 HTTP 302 的訊息,告訴 client 要求的網頁在新位置,
訊息如下:

HTTP/1.1 302 Object moved
Location: somewhere/newlocation.jsp

Forward: 直接由伺服器把原本的 request 轉送到另一個網頁,client 不知道這個動作。

在 JSP 中,redirect 是由 Respose 物件支援,而 forward 是 RequestDispatcher 物件支援。

20061125

需要研究:分散式協同教材

scorm: http://www.adlnet.gov/scorm/20043ED.cfm

20061117

JDBC 實務:使用 JDBC 時,一定要放在 try 區塊中,並於 finally 區塊釋放 Connection

在 try/catch/finally 語法中,若有定義 finally 區塊,則執行 try 區塊後,一定會執行 finally 區塊的程式碼。
所以若程式有使用 JDBC 時,一定要包在 try 區塊中,並在 finally 中關閉 connection 釋放資源,才不會耗盡資源。
一般實務作法如下例:


Connection con=null;
try{
con=new Connection();
...
...
...
}finally{
try{
con.close();
}catch(Throwable e) {
String errmsg="close connection failed! errmsg is "+e.getMessage();
log.error(errmsg);
}
}

Java 實務:發生例外事件時,log 所有的錯誤訊息

系統發生無法處理的例外時,若只顯現「發生系統錯誤,請連絡資訊室!」,但完全沒有 log 錯誤訊息,對除錯是沒有幫助的,尤其是網頁程式,若沒有作 log,則程式人員是無法掌握例外當下系統的狀態。
因此系統應導入 log 機制 Ex.log4j,來幫助我們 trace 產生例外的程式。建議所有的程式,全部應放鄉 try/catch(throwable) 區塊,除了顯現「發生系統錯誤,請連絡資訊室!」外,並將所有例外訊息傳給 log 以利除錯。
建議在程式加入以下源碼:

try {
;
}catch(Throwable e){
String errmsg = "系統例外:"+e.getMessage();
log.error(errmsg);
throw new RuntimeException(errmsg, e);
}

20061115

mathml in docbook

要讓 mozilla 的顯示 mathml 生效,請將網頁副檔名為 xhtml ,很重要。

20061110

轉檔中最重要的是資料整理

資料整理
像是 cobol 將 text date 匯到 informix
而又要將 date string coverse to date type,
先用 delete 將不合 formate 的 date string,
再作 conversion

20061027

docbook 常見設定

1.如何在 DocBook 中放入 MathML?
看這裡


[交叉參考的處理]
交叉參考只想顯示編號標題,不想顯示說明標題
如:圖11."妹妹的照片" -> 圖11.

開啟 param.xsl
設定 xref.with.number.and.title = 0

[文章參考文獻的引用以數字不以(人名+年份)]
文獻引用標題為 [1] 而不是 [Brooks95]

開啟 param.xsl
設定 bibliography.numbered= 0

docbook 參考文獻的處理
biblioentry vs bibliomixed
biblioentry

Contains a set of bibliographic elements in random order that the stylesheet selects, orders, and renders. It does not permit PCDATA (ordinary text) except in its child elements.

bibliomixed

Contains the mix of elements, text, and punctuation as you want it presented. The stylesheet formats elements but does not rearrange them. The term mixed is used here because this is mixed content of elements and text (PCDATA).

make a citation link to the specificed biblioentry
This citation:


to this entry:


brody98
...


will generate this citation text:
[brody98]
xref, linkbiblioref 等元素設定
linkend 屬性即可

citation 只有在妳不想有連結才用。

xref or biblioref 會自動產生 citation 文字

  • bibliography.numbered 若設為非 0 值,則 citation 文字會是自動編號

  • abbrev 有設的話,citation 文字為其值

  • xreflabel 不然為其 xreflabel 值

  • 最後為元素的 id




docbook 參考文獻的格式化

20061015

知識工程

知識工程的活動

  • 問題評估
  • 知識系統介面/結構的發展
  • 將結構化知識實作進知識庫
  • 獲取並組織相關的資訊、知識及特殊領域知識
  • 測識並確認新加入的知識
  • 整合及維護系統
  • 修訂及評量系統

Various activities of KE specific for the development of a knowledge-based system:

  • Assessment of the problem
  • Development of a knowledge-based system shell/structure
  • Implementation of the structured knowledge into knowledge-bases
  • Acquisition and structuring of the related information, knowledge and specific preferences
  • Testing and validation of the inserted knowledge
  • Integration and maintenance of the system
  • Revision and evaluation of the system.

20061013

既有 GSM 系統增加 GPRS 功能所需的修改:

既有 GSM 系統增加 GPRS 功能所需的修改:
1.Core Network adds SGSN, GGSN
2.BS adds PCU
3.Upgrade software
SGSN -- software GPRS support node
GGSN -- gateway GPRS support node
PCU -- packet control unit

20061005

vim 很有用卻又不好記的功能

*比較兩個檔
:o f1
:vert diffsplit f2
就會對 f1 及 f2 作 diff

*自定檔案型態
遇到某些檔以特定 syntax 開啟的設定存在
/vim/vim70/filetype.vim


*在 ex script 取出目前正在編輯的檔案檔名的方法 (current filename)
filename 通常就是目前 buffer 的 name。
"%" 表示目前的 buffer ,利用 :bufname("%") 便能取出目前正在編輯的檔名。
"#" 表上個編輯的 buffer

*執行目前的 buffer 中的 ruby script
:map :w:rubyfile %

20060929

這一生花很多時間在羨慕別人有我所沒有的東西,害怕別人不好的狀態會落在我身上。
但是你知道生命就是如此,我知道我最重視的是平靜,心靈上的平靜安穩比任何東西價值更高,不是嗎?
阿們

20060926

待辦事項的作法
high 一週內辦完
med 幾週內
low 二個月內
待辦事項不寫超過七個

20060925

要讀完的好書
"The anatomy of programming languages" by ALICE E. FISCHER,
FRNCES S. GRODZINSKY
把程語的結構描述的真的仔細
外界事物 -> 程式語言物件
->電腦物理及記憶體表示

抽象化的三個層次

--KR 與 Process and Entity
知識庫 -> 推理機 <- 外部事物
-> 計算結果

20060923

論認知經濟性(Cognitive Economy)

目前的關連式資料庫是以資料來描述概念,也就是列舉概念的全部形式,而非以少數公理及邏輯法則來描述概念,所以當要用極少數的字符去描述許多個案,會出現困難,語意網提供一個更好的表達系統,在描述某些概念(如 law )可以用較少的字符去描述,但在解譯上則需要較多的運算。由上,當特例較多時,若想要資料傳輸(溝通、交換)量,則用後者去描述資料,而讓主機用較多的運算。

  1. 目前的關連式資料庫是以資料來描述概念,也就是 列舉概念的全部形式,而非以少數公理及邏輯法則來描述概念,所以當要用極少數的字符去描述許多個案,會出現困難,語意網提供一個更好的表達系統,在描述某 些概念(如 law )可以用較少的字符去描述,但在解譯上則需要較多的運算。
  2. 由上,當特例較多時,若想要資料傳輸(溝通、交換)量,則用後者去描述資料,而讓主機用較多的運算。
  3. 以用藥資訊系統為例
  4. 資料持久化(可存到硬碟)有兩種,一種為文件,一種為資料庫
ps.從我的 Xuite blog 轉來的

20060915

Rake: the way to configure specially task options.

The ANT experience make me naturally think that rake should suppot the following syntax to configure the options of an specially predifined task.

task :javac do |opt|
opt.classpath = 'build/classes'
opt.target='1.4'
end

Isn't it?

20060913

代數結構:環

為了研究 CRC 錯誤偵測法,我猜想代數結構環,應可用來解釋其成因:
環公理

環是一序對 r=,其中 R 是一組元素的集合,+ 及 * 是作用在 R 上的二元運算,且滿足以下的條件:
  • 為交換群,令 0 表單元,並滿足以下公理:
    • (a+b)+c=a+(b+c)
    • 0+a=a+0=a
    • a+b=b+a
    • 對所有的 a 屬於 R,存在一元素 -a 屬於 R,使得 a+(-a)=0
  • 為單子(monoid),令 1 表單元,並滿足以下公理:
    • (a*b)*c=a*(b*c)
    • 1*a=a*1=a
    • 序對 <{R-{0}}, *>,記作 R*
  • * 可分配於各個 + 上
    • a*(b+c)=(a*b)+(a*c)
    • (a+b)*c=(a*c)+(b*c)
交換環
  • 環的 * 不一定要滿足交換律,若所有元素滿足 a*b=b*a,R稱為交換環

單位
  • a 不一定要有 * 的反元,若 a 有 * 的反元 a' 稱 a 為單位,滿足 a*a'=1
  • R 所有單位形成一個在 * 上的群,此群記作 U(R)=

20060907

系統開發的格言

  1. 什麼都不用說,先把使用者介面作出來再說

20060906

ANT 的 depnedent 工具

ANT 對 file operation 有一項很不錯的功能,
若 file 的 directory 不存在,
就自動建立,若 file uptodate? 則不動作。

copy

字串處理的程式片段集合

以下是一堆字串處理的程式片段集合

#日期相關的
*2008/01/01 -> 20080101
Java:
String.replaceAll("/", "');

20060903

Ruby Rake: Task[:javac]

I write a :javac task for rake. PLEASE try it.
The file structure is like ANT, the complied classe will be stored under build/classes.

USAGE:
1.copy the following source into java.rb
2.put
"require 'path/to/java.rb'" into your rakefile.rb
3.type
"rake javac"
then this will complie all java file under the rake base dir,
and copy all classes into 'build/classes'

SOURCE:java.rb
#!/usr/bin/env ruby

# The 'rake/java.rb' file defines the [:javac] task and its helper
# file.
#
# [:javac] complie all .java file in the working directory into
# CLASSDIR(defaults is "build/classes")
#
# version 0.1
# fhope@2006/9/3 03:01:35pm
require 'rake'
require 'rake/clean.rb'
def java_package_of(javafile)
file=File.new(javafile)
file.each do |line|
return line.sub(/package /,'').sub(/;/,'').sub(/\s/,'') if line =~ /^package/
end
return '' # empty string mean no package
end
def java_path(javafile)
return java_package_of(javafile).sub(/\./, '/')
end

JAVAC="javac"
JAVA=FileList["**/*.java"]
JARS=FileList["**/*.jar"]
CLASSDIR="build/classes"
CLASSPATH=JARS.to_a + [CLASSDIR]
CLASS = JAVA.collect do |fn|
puts fn
dir=CLASSDIR
package_path=java_path(fn)
if package_path != '' then dir="#{CLASSDIR}/#{java_path(fn)}" end
"#{dir}/#{fn.pathmap('%n')}.class"
end

def find_java(classfile)
base = File.basename(classfile, '.class')
JAVA.find { |s| File.basename(s, '.java') == base }
end

rule '.class' => lambda{ |classfile| find_java(classfile)} do |t|
classpath = CLASSPATH.join(';')
basedir=Rake.original_dir
tdir = basedir+"/"+ CLASSDIR
tf=basedir+"/"+t.source
sh "#{JAVAC} -classpath #{classpath} -d #{tdir} #{tf}"
end

desc "complie java file"
directory CLASSDIR
task :javac => [CLASSDIR] + CLASS

CLOBBER.add("#{CLASSDIR}/**/*.class")

20060804

T:描述結構性資料

抽象化的第一件事,是能用簡單的名字描述一串結構,
較佳的結構至少是類 xml 的階層結構。
階層結構由 "{}"來區分,
而 sequence 結構由 "," 及出現的前後區分。
一個 order 有很多 entry 可這樣描述
order ={
light={amt=2},
bulb={amt=2}
}

取出 order 第一個物件就是
order.light.amt==2
用"." 點來區分物件。

20060801

T:一個新語言的設計

看完 B. A. Tata 的"超越 Java" 後,有種想設計新語言的念頭。
這個語言的中心哲學是,
"簡單直覺的描述一件事"

語言暫且稱為 T 意思為譯者,
能讓我們用簡單的命令告訴它,讓電腦作事情。

當然這是交談式的,
我告訴 T 一件事,
T 會給我回應,溝通圖如下:
I <-> T
T 給我的回應是在下一行,
我給 T 的稱作"指令",
T 的回應是用字串報告的結果,
並列印於螢幕上。

首先這個語言的 hello world 是如此
I: print("hello world!");
T:hello world!

20060719

SVN 基本用法


















SVN 與 CVS 異同
功能SVNCVS
版本編號每次 commit 專案編號加一,版編=專案被 commit 的次數每個檔案一個編號,編號=這個檔案的commit 數
異動功能add delete copy moveadd delete
指定儲存庫標準 URL 語法,語法較自然類 URL

SVN 的版本編號



SVN 一次都是給整個專案都同一個 revision number,
而 CVS 是一個檔案一個 revision number。
這樣的好處是可以很簡單的找出穩定的版本。
因為穩定和整個專案有關,而非個別的檔案。
所以一個穩定的專案版在 SVN 可用一個 revision number 表示,
而在 CVS 需指定每個檔案的 revision number 比較麻煩。



安裝SVN


1.先下載 bin 檔案
2.解壓安裝
3.設定環境變數 lang=en_us 以去除中文亂碼

常用指令



以下指令以主機[192.168.0.188]及專案[RPMS]為範例:

察看目前儲存庫的目錄



svn list svn://192.168.0.188/

取得最新的工作烤貝



svn co svn://192.168.0.188/RPMS

更新工作烤貝



#進入工作目錄
cd RPMS
#更新
svn up

加檔入確認排程



#進入工作目錄
cd RPMS
svn add FILE

刪檔入確認排程



#進入工作目錄
cd RPMS
svn delete FILE

建立子目錄加入排程



#進入工作目錄
cd RPMS
svn mkdir DIR

確認上傳



#進入工作目錄
cd RPMS
svn ci

連接密碼控管的文件庫


若要連上有加上密碼控管的文件庫則在命令前加上使用者及密碼資訊如下:
svn co --username ggyy --password ggyy svn://gyboy.blogspot.org/fhope

20060704

ANT 簡介

ANT 的角色是作為一個 跨平台 的批次檔或 shell script。 shell script 是幫助自動化發展應用程式的非核心工作, 像是檔案管理、源碼管理、程式庫 dependency 分析、 程式師合作的溝通。 讓程式師專注於解決他的問題, 基本上除了寫程式的事外,ANT 都能幫你作好, 她能為妳處理下面這些事。
  • 檔案管理- copy, move, mkdir, rename等
  • ANT 能從不同來源取得檔案的方法,像是 ftp, cvs, svn, http get 等
  • 也能用 ftp 來幫妳佈署檔案到遠端主機
  • 壓縮檔案
  • 支援 zip, unzip, jar, war, 幫妳生成包裝檔案
  • 利用 JDBC 設定資料庫
  • 利用 Telnet 幫妳設定遠端的 Server,ex.重開 weblogic
  • 支援 CVS, SVN 幫妳作版本控管
  • 利用 JUnit 自動幫妳作測試,並產生測試報告
  • XSLT 幫妳轉換 XML 的文件
  • XDOCLET 幫妳自動生成程式碼
  • 把 JSP 轉成 JAVA 可指定 tomcat 或 weblogic
  • 幫妳從檔案取代字串,通常用在 html sign 上最後修改日期的自動化
重點是上面這些工作妳可以全部在一個檔案定義, 然後用 ANT 去呼叫特定的工作, 把寫程式以外卻又必要的雜事集中控管, 又可以輕易的呼叫出來 功能強大,又跨平台, 不用 Linux 寫 sh,Windows 又要寫 bat。 所有的語法已被 XML 統一了, 所以 ftp telnet bat sh perl xslt copy find svn cvs 等奇怪的語法, 全部都可用 xml 表示,像是指定一組檔案, 在所有的命令都是用 來表示, 不用再去參考某命令的文件,再去找他指定一組檔案的語法

例:把 JSP 上傳測試機

  • 傳統上我們得用 ftp GUI client 貼上去,但每次改一段要測試就得重覆這個動作,在程式間跳來跳去,相當不方便。
  • 聰明一點的,會把利用 ftp 的 command 指令寫成巨集執行這個重覆的動作ftp 命令檔如下:
#deploy.ftp
root
rootpassword
cd /deploy/webapp
put /local/file1.jsp
put /local/file2.jsp
cd /deploy/classes
put /local/file1.class
put /local/file2.class
然後要上傳時輸入
ftp -s deploy.ftp
批次執行上述的 ftp 命令
看看 ANT 怎麼作?
         description="deploy files to pcstest machine" >

remotedir="${pcstest.operation.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">





可以把 元素看成個別的 dos bat 檔 ,要執行只要輸入
ant deploy.pcstest
就可以執行 所定義的工作了。 再看看 ANT 的 copy 指令
         description="create a temp dir for make ncqmda release file" >












再看看 ANT 的 ZIP 指令
         description="create a nckmqa release zip" >





有沒有發現指定檔案集的方式都是用 。 若沒用 ANT,ftp 命令有一種指定檔案的語法, dos bat 又一種,unix 還有語法超級特殊的 find 指令, 每次用都要 man find 復習一下, 在 ANT 指定一組檔案就一種方法。

ANT 可統一設定所有的資源,包括 SQL, Telnet, CVS, http GET, mail

可遠端操作 Telnet 不用在使用其它的 cliet 去作這件事, 以下看看如何重開 weblogic。
  
userid="${pcstest.telnet.userid}"
password="${pcstest.telnet.password}">

cd ${pcstest.nckmdomain.dir}

stopWebLogic.sh

nohup startWebLogic.sh &



當然透過 JDBC 也可用 SQL 設定資料庫
  
driver="${db.pcs.driver}"
url="${db.pcs.url}"
userid="${db.pcs.userid}"
password="${db.pcs.password}">
CREATE TABLE oproom_material_record_detail2
(
oprmrd2_hospital_no char(1),
oprmrd2_operation_date char(8),
oprmrd2_room_no char(2),
oprmrd2_seq_no int,
oprmrd2_material_date char(8),
oprmrd2_material_time char(9),
oprmrd2_r1 char(4),
oprmrd2_r2 char(4),
oprmrd2_r3 char(4),
oprmrd2_material_no char(9),
v1f char(1),
v2f char(2),
v3f char(3),
r1f char(1),
r2f char(2),
r3f char(3)
);


cvs 或 svn 也通用,用來作版控。
  




自動寄 e-mail。




The ${buildname} nightly build has completed




從 http 抓檔案
     dest="statement.html"
username="1214";
password="secret"/>

ANT 能自動比較檔案的新舊,來作動作

ANT 能從不同來源取得檔案的方法, 像是 ftp, unzip, copy, cvs 等, 其中一個重點是當目的檔案比來源檔案舊時, 應該不可覆蓋來源檔案,相關的屬性如下
[v1|v2] 第一個表預設值
ftp.depends=[no|yes] yes 表不覆蓋
ftp.newer=[no|yes] yes 表不覆蓋
unzip.overwrite=[true|false] false 表不覆蓋
copy.overwrite=[false|true]false 表不覆蓋

直接看我的範例檔吧!


operation









location="${build.test.dir}/report"/>






value="jdbc:mysql://localhost/pss?useUnicode=true&characterEncoding=big5"/>




value="jdbc:informix-sqli://192.168.11.112:1526/pcs:authority:INFORMIXSERVER=nckmdb_tcp"/>










value="${pcstest.nckmdomain.dir}/applications/hospitalization"/>
value="${pcstest.ap.dir}/DefaultWebApp"/>
value="${pcstest.web.dir}/hospitalization3/operation"/>
value="${pcstest.web.dir}/WEB-INF/classes/"/>

location="d:\nckm\DefaultWebApp\hospitalization3"/>

value=":pserver:nckmcvs:nckmcvs@ftp-proxy.syscom.com.tw:/cvshome/nckm"/>
value="nckm_s"/>
description="setup a environment for this project" >


























description="put file to test machine" >
debug="on"
source="1.4"
target="1.4">





description="unit test" >






name="edu.ncku.hosp.OPRMaterialRecordTXTest"/>


description="deploy files to pcstest machine" >

remotedir="${pcstest.operation.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">




remotedir="${pcstest.web.classes.dir}"
userid="${pcstest.ftp.userid}"
password="${pcstest.ftp.password}" depends="yes" binary="no">






remotedir="${test.server.operation}"
userid="root" password="wyj0806" depends="no" binary="no">





description="backup" >
value="${backup}/${ant.project.name}_${DSTAMP}${TSTAMP}.zip"/>




description="create a temp dir for make ncqmda release file" >












description="create a nckmqa release zip" >





description="clear release dir">


description="put release into nckmqa" >
remotedir="nckmqa"
userid="root"
password="wyj0806"
depends="yes"
binary="no">







description="restore src to initialize state" >








message="import procject files: ${scm}"/>




test.server.operation.dir=${test.server.operation}






userid="${pcstest.telnet.userid}"
password="${pcstest.telnet.password}">

cd ${pcstest.nckmdomain.dir}

stopWebLogic.sh

nohup startWebLogic.sh &




driver="${db.pcs.driver}"
url="${db.pcs.url}"
userid="${db.pcs.userid}"
password="${db.pcs.password}">
CREATE TABLE oproom_material_record_detail2
(
oprmrd2_hospital_no char(1),
oprmrd2_operation_date char(8),
oprmrd2_room_no char(2),
oprmrd2_seq_no int,
oprmrd2_material_date char(8),
oprmrd2_material_time char(9),
oprmrd2_r1 char(4),
oprmrd2_r2 char(4),
oprmrd2_r3 char(4),
oprmrd2_material_no char(9),
v1f char(1),
v2f char(2),
v3f char(3),
r1f char(1),
r2f char(2),
r3f char(3)
);




無廢話ANT 安裝

  1. 下載ANT
  2. 解壓縮至 c:\ant
  3. 設定環境變數 JAVA_HOME=C:\jdk
  4. 設定環境變數 ANT_HOME=C:\ant
  5. 設定環境變數 PATH=%ANT%\bin

使用 FTP task

安裝以下的庫至 %ant_home%/lib 下
  • jakarta-oro-2.0.8.jar
  • commons-net-1.4.0.jar
在 build.xml 第一行補上:
classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/>

Ant vs Maven

Maven 是 ANT 的主要對手,其差異如下: Ant 有三個階層,project target task,但彼此互不關聯 Maven 在 project 層則隱涵target。

20060627

vim 的 textobject

text object 用來描述某文字區塊,可接在如 y, d 等命令之後。

aw - 包含 cursor 的一段字,有含字的空白
iw - 包含 cursor 的一段字,不含字的空白

at - 包含 cursor 下的 tag 區塊,含 tag 本身。
it - 包含 cursor 下的區塊,不含 tag 本身。

aB
- 包含 cursor 下的程式區塊,含區塊分隔符號本身。
iB - 包含 cursor 下的程式區塊,含區塊分隔符號本身。

vim 在程式的移動

20060626

時間管理的十大步驟

親愛的讀者:

辦公桌上堆積如山的文件,好像永遠不會都減少;接踵而至的訪客,及尋求問題解決的部屬,一個個「闖」進你的辦公室;不斷響起的電話,一直打斷你手邊的工作;接二連三的會議,讓你疲於奔命,恨不得自己三頭六臂,可以同時應付這麼多的事情。

工作上如此,生活亦是。許多想讀的書買了卻沒時間讀;心儀已久的音樂家終於來台演出,卻抽不出空去看表演;答應家人一起出國去玩,行事曆上卻排得滿滿的‥‥‥,這些挫折都讓生活不再新鮮有趣。

你是不是感歎時間不夠用?事情做不完的壓力揮之不去了每個人一天都只有二十四小時,大部份的人是「忙,但不知道在忙什麼」,或是「忙,但不是忙自己想做的事」,但為什麼還是有人能事業有,還有時間兼顧生活及其他活動?因為他們懂得做時間管理。

管理時間有兩個必要的條件:計劃你的時間,以及避兔浪費時間。不妨問問自己以下三個問題:有沒有做一些根本不需要做的事?有哪些工作可以分配給其他人去做?必須做的事,是不是可以做得更有效率?

真正能幹的中階主管,能好好安排自己的工作時間表,逐項徹底執行,一旦工作順利進行,自然不會手忙腳亂,再加上工作效率高,工作成效自然也比他人多出數倍。做你計劃做的事,在你計劃的時間做,並在你計劃的時限內做完,成功就離你不遠了。祝你成功!

1.事先規劃好你的時間與步驟,以收事半功倍之效

要與時間拔河,首先記錄自己的時間分配方式,分析哪些習慣浪費時間;按著訂定目標並擬定計劃,以較實際的觀點安排時程;最後找出浪費時間的原因與因應方法,改變這些壞習慣。

.每天空出一段時間來規劃事情。

.拿一個小時來訂計劃,可以有二到三倍的效果出現。

.你可以在上班之前比較安靜的環境(家裡或辦公室)訂計劃,或是當作上班的第一件事,或是在下班前訂第二天的計劃。

.將時間加以分段,最好是以十五分鐘為一段。並要求自己把原本要花比較多時間的工作,在一段段時間裡加速完成。

.學習絕對專心,同時做兩三件事,像電視機選台器一樣。

2.分析工作的優先順序,按照輕重緩急作處置。

要掌控時間,就必須先能掌控自設定個人目標,以便根據目標,分析工作的優先順序,按照輕重緩急做處置經常評估所設定的優先順序。採用80/20原則來設定優先順序。完成20%的目標可能獲得80%的效果,如果你每天的行事曆上有十個事項要做,你只要能圓滿達成其中最重要的兩個項目,就可以得到八成的效果。

根據緊急性與重要性決定:

重要而且緊急:馬上辦。

重要而不緊急:好好規劃。

不重要但很緊急:1.馬上辦,但只花一點時間;2.請人代辦;3.集中處理。

不重要也不緊急:有空再辦。

3.找出自己最有效率的時段以安排工作內容。

生理專家研究,人的效率會隨著時間不同而不同,順其自然安排工作內容,工作效率才會高。早上八點至十點:精力顛峰,適合做規劃。早上十點至十二點:注意力及短暫記憶力最強,適合腦力激盪會議、訓練。下午一點至二點:昏昏欲睡,比較適合進行互動溝通的工作。下午二點至四點:開始清醒,長期記憶力最強,適合閱讀、思考。下牛四點至五點:適合技術性工作、處理衝突問題。了解自己的生理時鐘,它不像真的時鐘那麼有規律。找出精神最好的時間從事較困難的工作。

在效率最高的時段,你可以集中精力於:棘手或困難的問題、創造性思考、複雜的工作、討論或訂定工作計劃。

在效率中等的時段,你可以專心做:與他人交換意見、處理回信、規劃行程表。

在效率最差的時段,你可以處理:例行性事務、電話聯絡事情、接待訪客、基本行政工作。

4.組織你的辦公桌及辦公室,提升工作效率。

雜亂無章的公桌會讓人分心、容易疲倦及緊張、生產力降低、無法控制工作,也會給人不好的印象。更重要的是,檔案找不到,辦公桌上一片凌亂,都會浪費你寶貴的時間。

保持辦公桌清爽的最高指導原則:與手邊正在做的工作有關的東西,才能出現在桌面上,其餘的請立即拿開。把你的辦公桌與辦公室當作一個工作站你可以這樣清理你的辦公桌:挪出一段時間專門來整理你的辦公桌。可以將這個時間再分成幾個小段,每小段專心清理一個抽屜或桌面。與工作毫無連的書籍雜物等,都應該立即清掉。一年半年內不會再用到的東西,考慮把它扔掉。想一想,扔掉這個東西最壞的結果是什麼?如果沒什麼大不了,就別猶豫了。運用5S技巧──整理、整頓、清掃、清潔、養成習慣。把你的辦公桌與辦公室當作一個工作站辦公桌如果面對窗戶或走道,往往容易分心,最好的方位是既可以掌控全場,也不會有人常常走過你面前,還可以有空間擺放其他辦公家具。每天要用到的東西,放的位置愈靠近座位;不是每天要用的,可以集中到較遠的角落去。將出、入、檢討之用的文件分別以不同的抽屜檔案或籃子收集,一收到文件就加以分類,有效縮短文件傳遞的時間。

5.進行充分的授權將工作分配給部屬助理或秘書

如果你堅持處理工作所有的細節,很快就會發現時間根本不夠用,更何況你的職位與所負的責任會不斷的增加。請他人分攤你的工作,善用授權策略,事半功倍。找出哪些工作可以授權他人去做。將工作交給能處理得最好的人。信任對方,尊重對方。清楚說明你對工作的要求、方式與時間限制。授權不是推卸責任,你一樣要負起追蹤的責任。秘書或助理不是花瓶,他們可以替你擋不速之客與過濾電話、信件,使妳不受干擾地專注在重要事務上,還能替你蒐集資訊,提出解決問題及做決策的構想。你應該和他們相互信賴,建立團隊工作紀律,發展出合作關係:每天固定時問與他們討論工作內容,讓他們熟知你的目標、優先順序及渴望,清楚知道你要什麼。鼓勵他們分擔更多的責任,並允許他們發展自己的行事風格,可以做決定,而不是當你的影子。給予充分的支持、認同與尊重。

6.活用記事本管理時間。

找一本口袋大小的記事本帶在身邊:記事本裡最好有常用電話號碼、待辦私人事務、待辦公務、日期約會欄及雜記欄。列出待辦事項,可以分為每天、每週或未來數週。把預定做的事登錄到預定的時程裡,確定的事項用鋼筆或原子筆書寫,可能有變數的就先用鉛筆書寫。隨時記錄一些新想到的做法。達成的項目就劃掉,但不要劃得亂七八糟,以免日後要察看會看不懂。在你的記事本上,你可以用螢光筆標顏色來區分事情的重要性或優先性。也就是說,紀錄時用一支筆,事後再用螢光筆標記重要性或優先性。

7.運用有效的方法取得資訊。

如何在短時間內得到最多的資訊?在精神最充沛的時候,閱諒最重要的資料。不斷的學習如何加快閱讀的速度。與對同一領域有興趣的人分擔資訊收集的責任。養成隨身攜帶閱讀資料的習慣。養成在等待的時候閱讀的習慣。要求部屬在文件上做摘要。鎖定你真正需要的資訊,避免因資訊氾濫而無所適從。閱讀前先了解自己的目的。有選擇性的閱讀,如果沒有很多時間,可以只選擇一份綜合性的報紙。先讀標題。讀一讀就停下來思考,並將所讀的內容濃縮成大要。想保留某一段資料,可以在文章的角落立刻註記並剪下來歸檔,並將其他都份丟棄。

8.改變拖延的習慣 ,即時行動。

該寫一篇重要報告的時候,你卻在整理桌子?像這種先處理無關緊要事情,而非該優先解決事情的心態,就是拖延。我們習慣拖延困難、討厭、難以下決定的事,但這些事卻不會因此消失,只會讓你更緊張,反而陷入困境,還需花原本二至三倍的時間才能完成。

終結拖延的六個方法:

問自己:現在最重要的事做什麼?而非問:我現在最想做什麼?先把最令你討厭、最困難的事解決掉,不要讓它一直困擾你。

將工作分解成幾個較小的部分,讓工作容易進行。

不要等所有資料都到手才開始工作,有什麼就做什麼。

找出自己拖延事情的方法,例如聊天、喝咖啡等,規定自己某段時間內禁止做這些事。

設定誘因激勵自己準時不拖延。

9.技巧的對待訪客,讓時間的控制權在自己手上。

如果訪客逗留太久,你應該及時的站起來。不要打斷對方的話,可是一旦輪到你開口接話,你應該主動結束這次的對談,總結應該採取的行動或結論。儘量使用肢體語言,如闔上筆記本、整理桌上的文件,或將身體移到椅子的邊緣。說些暗示性的話,例如:「我想這就是結論吧!」「我很感謝你來看找。」等。訪客在所難免,妳必須要懂得一些應付的技巧,才不會輕易浪費了你的工作時間。儘量少在自已的辦公室裡接待訪客,最好使用訪客接待室。開宗明義即引出訪客的目的,保持公事公辦的態度和語氣。不要以茶點或咖啡款待未經約定的訪客。坐在椅子的邊緣,將全部的注意力投注在訪客身上。可能的話,明確的設定時間限制,放一個你和訪客都能察覺到的時鐘。

10.練就健康的身體,保持身心最佳狀況。

沒有時間照顧自己身體的健康,將來就沒有健康的身體利用時間。要不斷保持顛峰水準的工作表現,就應該保持身心健全,注意個人的健康狀況及需要,學習用較少的時間獲得健康。運動不是有機會才做,最好在你的行事曆上加入這一項,固定時問與地點做運動。縮短睡眠時間能節省時間,可是,如果能培養快速入睡、充分睡眠的能力,一樣可以擁有效率。養成早上一睜開眼晴就起床的習慣。定時做健康檢查,除了醫院及健診中心外,也可以利用血壓器等醫療器材自己在家測量。錯過鬧鐘、找不到車鑰匙、識別證等都會偷去時間,而且影饗一天情緒。無情地壓迫自己並不是善用時間的好方法,感到有壓力時,休息一下,能有效提高精神,增進工作效率。

20060624

開發程式活動及工具

開發程式的活動
開發程式包含了下面幾個活動:
  1. 撰寫說明文件,設計文件,需求文件,專案文件
  2. 編輯程式碼文件
  3. 文件版本控管
  4. 程式測試
  5. 程式除錯
  6. 程式建立
  7. 程式佈署
  8. 臭蟲需求追縱記錄

一篇介紹程式發展工具的好文
用Open Source工具開發軟體: 新軟體開發觀念

我用的程式發展輔助工具
----------------
文字編輯器:vim

程式語言:Java
編譯器:javac
除錯器:jdb, 尚未有深入研究,見:java debug, O'Reilly sleepless 專欄

程式碼結構 index 產生器:
jtags,對 java 結構產生一 tags 的 index 檔,使編輯器可很快走到 java 的某項結構
ctags,支援多個語言

程式建立輔助工具:ant, maven 好像也不錯
安裝程式產生器:目前還用 ant 模擬
log 系統: log4j + chainsaw ,links:log4j 簡明手冊

版控系統:SVN 和 CVS 都有用,目前希望專注在 SVN 上

目前想要的功能:
bug tracker:無,想要找一套,或自已寫
測試軟體:JUnit, htmlUnit,dbunit
vim 能有 code completion
vim 有更好的 xml 編輯功能

CASE Tools
UML 塑模器:ArgoUML 似乎進步了,不過比不上 Rose UML 吧
StartUML 也不錯
RDBMS Exploerer: Squirrel
上面覺得不好用是因為沒跟 vim 整合在一起吧!

20060623

值得注意的未來技術:WiMAX

WiMAX的真實面貌

George Ou‧郭文興譯  2005/08/01

WiMAX(全球微波存取互通介面)是IEEE 802.16乙太網路的介面標準,就像Wi-Fi是802.11乙太網路的標準一樣。這兩年來,WiMax已經成為無線網路界最流行的專用字彙。同時它也可能是近年來最被誇大誤解的技術之一。

對WiMAX常見的誤解有:

  • WiMAX的傳輸範圍一定比Wi-Fi大

  • WiMAX的速度比Wi-Fi快

  • WiMAX會跟Wi-Fi競爭,進而取代Wi-Fi

  • WiMAX比Wi-Fi更安全。
  • WiMAX的傳輸範圍一定比Wi-Fi大

    WiMAX的設計可以在需要執照的無線頻段,或是公用的無線頻段運作。只要系統業者擁有該無線頻段的執照,而讓WiMAX在授權頻段運作時,WiMAX便 可以用更多頻寬、更多時段與更強的功率進行傳送。一般來說,只有無線ISP業者才會使用授權頻寬的WiMAX技術。至於Wi-Fi的設計則只在公用頻段中 的2.4GHz到5GHZ之間工作。美國的聯邦通訊委員會(FCC )規定Wi-Fi一般的傳輸功率要在1毫瓦到100毫瓦之間。一般的WiMAX的傳輸功率大約100千瓦,所以Wi-Fi的功率大約是WiMAX的一百萬 分之一。使用WiFi基地台一百萬倍傳輸功率的WiMAX基地台,會有較大的傳輸距離,自然毫無疑問。

    雖然有授權頻段的WiMAX顯然有較長的傳輸範圍,也不代表只要有錢就要趕著去買個WiMAX基地台。你必須要有一個授權的無線電頻段,就像一個音樂電台 也必須要有頻段執照,才能在空中發射無線電波。而如果WiMAX跟Wi-Fi一樣放在未授權的頻段,則它的傳輸優勢就馬上消失了。Wimax跟Wi-Fi 都是基於無線頻段傳輸的技術,所以受同樣的物理定律限制。反之,如果在同樣的條件下,讓Wi-Fi使用授權頻寬,Wi-Fi也可以跟WiMAX一樣快。另 外,雖然WiMAX可以利用較新的多路徑技術。目前新推出的pre-N MIMO(多天線雙向傳輸)技術Wi-Fi產品也使用了該技術。

    WiMax的速度比Wi-Fi快

    WiMAX的擁護者常常在大肆宣揚該技術的速度優勢。雖然WiMAX聲稱最高速度每秒70mbyte,然而最新的Wi-Fi MIMO理論上也有每秒108mbyte的最高速度,而實際環境下也有45mbps的速度。我可以去商場買一個Wi-Fi MIMO的基地台回家組裝,自行確認其速度約為45mbps,然而WiMAX的產品至今卻尚未出現。WiMAX技術同樣受技術問題與物理定律所限制,要談 論WiMAX的實際頻寬還是太早。

    無線ISP業者在建置WiMAX的時候,同樣會遇到現今其他無線業者會遇到的頻寬競爭難題。授權頻段的WiMAX系統涵蓋範圍極大,約數十公里,其建置的 困難可說是一把兩刃之劍。這是因為無線覆蓋範圍非常之大,裡面會有極多的使用者同時競爭同樣的頻寬。就算無線ISP業者使用多個獨立的頻道來運作,在同一 個頻道中,還是會有數倍於Wi-Fi的使用人數。我所認識的每一家無線ISP業者,不管是無線微波業者、3G行動業者,到衛星電話業者,同樣都會遇到頻寬 競爭與QoS(服務品質)管控的問題。

    如果網路的延遲在200到2000毫秒間遊移,這種網路根本不可能使用VoIP、視訊會議、網路遊戲,或任何其他的即時應用。雖然已經有人談論將 WiMAX加上QoS機制,以供VoIP使用,然而實作方法與實作效益仍舊有待觀察。而在Wi-Fi方面,Spectralink上的QoS實作成效已被 證實,同時802.11e的無線QoS標準也將要推出。無線ISP業者的WiMAX建置一定會比非授權的WiMAX或Wi-Fi基地台建置來得慢,因為對 無線ISP業者不可能會去讓少數用戶使用整個頻段。

    私人而使用公用頻段的WiMAX基地台,與Wi-Fi基地台的設置到底何者為快,將取決於產品的推出。由於理論上他們的傳輸功率與頻段大致相同,而市面上 已經有大量而且成熟的Wi-Fi產品,我個人會賭Wi-Fi這一邊贏。Wi-Fi在非授權頻段這一邊已經領先一大步,很難想像WiMAX在這個領域有辦法 成功。這是為什麼WiMAX多是往無線ISP業者的方向來推動。

    WiMAX將與Wi-Fi競爭,進而取代Wi-Fi

    最狂熱的WiMAX支持者甚至辯稱WiMAX將會完完全全的取代Wi-Fi,讓Wi-Fi成為歷史。這種想法說好聽一點是過度樂觀,過難聽一點則是荒謬無 比。WiMAX在整合與標準化無線微波ISP市場的過程中,將會有一席之地,但它並不會直接的與大多數的Wi-Fi建置競爭。WiMAX將會聚焦於授權頻 段的無線ISP市場,而Wi-Fi將會繼續主導私用的無照無線市場,如公司或家用的無線網路。WiMAX與Wi-Fi唯一會重疊的地方,大概就是收費的 Wi-Fi存取點了。

    由於WiMAX連線的涵蓋面積較大,以數十公里計,而Wi-Fi存取點是由數十米的小片面積所組成,所以WiMAX在全球涵蓋上會有佔有優勢。但是因為目 前的市場佔有率較高,以及因為小範圍、同時競爭的用戶人數較少,造成Wi-Fi較快、延遲較小的特性,Wi-Fi的收費存取點仍可能持續流行。至於 WiMAX是否能擊敗Wi-Fi的收費存取點,關鍵因素將是WiMAX的QoS機制是否良好實作,以及如何解決過多使用者的問題。如果WiMAX技術跟現 今的無線ISP一樣,具有過多使用者與高延遲的問題,它絕對不可能讓Wi-Fi收費存取點的需求消失。

    WiMAX較Wi-Fi來得安全

    WiMAX比Wi-Fi更安全是另一個盛傳的錯誤觀點。事實上WiMAX使用的是與Wi-Fi 的WPA2標準相似的認証與加密方法。其中的微小區別在於WiMAX的安全機制使用3DES或AES加密,然後再加上EAP,這種方法叫PKM-EAP。 而另一方面Wi-Fi的WPA2則是用典型的PEAP認証與AES加密。沒人可以說其中一個一定絕對比另一個安全,因為好的安全性往往取決於實際建置方式 的正確與否。

    讓社會大眾知道WiMAX的正反兩面十分重要。WiMAX技術與802.16標準是十分重要的,因為他是無線ISP業者未來合理的演進方向。但是它絕非無 線網路技術萬能而且終極的解決方案。WiMAX或其他的無線網路技術將會互補,同時這些無線技術也不可能取代有線技術的需求。無線的連線方式必定更有行動 力、更方便。至於有線的連線方式,只要能牽上線,則一定更快,更可靠。我們必須揚棄所有關於WiMAX的不實謠言,務實看待這個技術的真實面貌。

    Assertion

    裡面缺乏一篇介紹,
    assertion 的開啟及關閉是由
    java -ea
    來設定的,也就是可在虛擬機啟動時才指定。

    JavaWorld@TW - Assertion 介紹與使用

    20060621

    ANT 的檔案管理

    ANT 能從不同來源取得檔案的方法,
    像是 ftp, unzip, copy, cvs 等,
    其中一個重點是當目的檔案比來源檔案舊時,
    應該不可覆蓋來源檔案,相關的屬性如下:


    [v1|v2] 第一個表預設值
    ftp.depends=[no|yes] yes 表不覆蓋
    ftp.newer=[no|yes] yes 表不覆蓋
    unzip.overwrite=[true|false] false 表不覆蓋
    copy.overwrite=[false|true]false 表不覆蓋

    ANT 的角色

    20060620

    ANT 的角色

    ANT 的角色是作為一個跨平台的 shell script。

    shell script 是幫助自動化發展應用程式的非核心工作,
    像是檔案管理、源碼管理、程式庫 dependency 分析、
    程式師合作的溝通。
    讓程式師專注於解決他的問題。


    Ant vs Maven

    20060616

    vim 在程式的移動

    vim 提供一些能方便在程式區塊移動的命令,
    這些命令以 [ 開頭的表示到區塊起點,
    以 ] 開頭的表示移到區塊終點。

    % 對應的括號
    [[ 外部區塊起點
    ][ 外部區塊終點
    [{ 內部區塊起點
    ]} 內部區塊終點
    [( 括號起點
    ]) 括號終點
    [/ 註解區塊起點
    ]/ 註解區塊終點

    [I 列出游標識別字在檔案的所有位置
    [ or [ 移至上一個識別字
    [i 僅列出全部檔案第一個比對到的識別字,通常可用來找到識別字的定義
    ]I 列出所有游標行數後的識別字位置
    ]i 列出游標後第一個比對到的識別字

    [D 找出全域的 #define

    gD 移到識別字全域的定義 -- 一定要常用
    gd 移到識別字本地的定義 -- 一定要常用


    為何不學 vim script

    研究方法課的一些重點

    1. 研究背景和研究動機最好放為一節,不要和研究目標放為一節 -- 已修正
    2. 研究方法要闡述為何使用此研究方法的目的 -- 已新增
    3. 使用個案研究方法主要是前面無相關研究 -- 已新增
    4. 結論要解釋前面的研究目標是否達成,及本研究的貢獻 --
    5. 任何一段陳述都要有證據 -- 努力達成
    6. 研究要有 focus -- 已有 focus
    7. 表的標題在上、圖的標題在下 -- 暸解比較多的 DocBook,已經會操作了
    8. 中文論文內不要有英文 -- 暸解比較多的 DocBook,已經會操作了
    撰寫科技研究論文之要領

    正式環境、測試環境、開發環境

    正式環境為 AP 正式上線的環境。
    測試環境為與正式環境整體相當,作上線前測試的環境。
    開發環境為開發人員寫作程式的環境。

    20060615

    Ant vs Maven

    Ant 有三個階層
    project target task
    但彼此互不關聯
    Maven 在 project 層則隱涵一些預訂的 target

    項目管理: Maven 讓事情變得簡單

    RDBMS 的 View 代表推論資料

    前陣子在讀 prolog 的書時, 發現 view 的新解,

    RDBMS 的 View 代表推論資料

    下述的 prolog 碼

    //這句說 X 是 Y 的爸爸,或 X 是 Y 的媽媽,
    //則可推論出 X 是 Y 的父母親
    parent(X, Y) -: father(X,Y) or mother(X,Y)

    ?parent(X, fhopecc) //這類似 select 會找出 fhopecc 的父母

    把它可轉成下面的關聯模型, 每個關係是一個關聯
    father 是一個 table
    mother 也是一個 table

    parent 就是 view,簡單而言 view 可視為前二個 table 的推論

    create view parent as
    select * from father
    union
    select * from mother;
    SQL 的 view 指令
    SQL 的 alter 指令

    20060611

    docbook 顯示行號的方法

    docbook 顯示行號的方法
    http://www.sagehill.net/docbookxsl/InstallingAProcessor.html#InstallXalan

    20060610

    vim:functions

    呼叫函數
    :call function

    定義函數
    :function {name}({varlist})
    : {body}
    :endfunction

    ex.
    :function min(n1, n2)
    : if a:n1 < res="a:n2" res="a:n1">

    vim script 筆記

    Vim Script
    為一組 Ex 命令組成

    Ex 命令
    為 vim 的 normal mode 中,打 ":" 起始的命令

    :while 命令 - 迴圈
    語法:
    :while {condition}
    {statement}
    :endwhile

    資料型態
    vim 僅有二種資料型態,數字及字串。

    三種數字實字型態
    十六進位實字
    語法:
    {hexadecimal literial}=0x[1..9abcdef][0..9abcdef]*
    八進位實字
    語法:
    {octal literial}=0[1..7][0..7]*
    十進位實字
    語法:
    {decimal literial}=[1..9][0..9]*
    注意:前面不可前置 0 這個數字,否則會視為 8 進位

    數學運算式
    {add}={variable}+{variable}
    {minus}={variable}-{variable}
    {multiply}={variable}*{variable}
    {divide}={variable}/{variable}
    {modula}={variable}%{variable}

    例子:
    :echo 1*3
    3

    字串實字
    {double-quote-string-literal}="[a..zA..Z0..9]*"

    字串相連
    {string-concatenate}={string}.{string}

    ex.
    :echo "foo"."bar"
    foobar


    變數
    :let 命令 - 設值給變數,都是全域變數的
    語法:
    :let {variable}={expression}

    例子:
    :let i=1
    :echo "i is" i
    vim 會印出 i is 1

    :let
    vim 會印出所有的全域變數

    變數種類
    s:var -
    草稿檔變數
    {script-local-variable}=s:{variablename}
    僅作用於目前的草稿檔,
    若用 source 匯入的草稿變數,
    雖同名,但有不同的值

    {buffer-local-var}=b:{varname}
    {window-local-var}=w:{varname}
    {global-var}=g:{varname}
    {vim-var}=v:{varname} - vim 預定變數

    清除變數
    {clear-var}=unlet[!] {variable}

    判斷變數是否已定義
    boolean exist(string varname)
    判斷變數名為 varname 是否有定義


    表示式
    {enviroment-variable}=$NAME
    {option}=&name
    {register}=@r

    絛件表示式

    {expr}?{expr}:{expr}
    a?b:c
    若 a 為真,則 b,反之為 c

    :let i=4
    :echo i>5:"i is big":"i is small"
    i is small

    :if {condition}
    {statements}
    :endif

    :if {condition}
    {statements}
    :else
    {statements}
    :endif

    :if {condition}
    {statements}
    :elseif{condition}
    {statements}
    :else
    {statements}
    :endif

    比較運算子
    a==b

    ex.
    :if 0 == "one"
    : echo "yes"
    :endif
    yes

    因為 "one" 不是數字,故為 0

    a!=b
    a> b
    a>=b
    a< a="~b" style="font-weight: bold;">:excute str -直譯傳入字串
    :execute "tag " . tag_name
    直譯器的直譯

    :normal str -將傳入字串以 normal mode 直譯

    為何不學 vim script

    想寫一本資料結構的書,書的格式是用 docbook。
    在寫這本書時,總想要能夠有一支程式,
    能自動幫我產生一些例子,且它的格式要符合 docbook。
    像是輸入一陣列,它能自動幫我產生此陣列的反轉表(inversion table),
    但是究竟要用何種程式語言寫,
    是工作常用且嚴謹的 Java 嗎?
    或是寫法多樣且好寫的 Javascript?

    但我忘了,我打字的主要工具是 vim?
    為何常我要有工具來輔助我打字時,我不學 vim 呢?
    現在就開始,
    vim script 我要挑戰妳!

    20060606

    解決 IE 無法顯示 blogger 的問題

    剛剛發現把 blogger 的
    [設定]-[格式]-[日期語言]-[中文台灣]
    就可了

    把 IE 的編碼改成 UTF-8
    [檢視]-[編碼]-[Unicode(UTF-8)]

    一片空白的UTF-8網頁
    裡有更多解法

    20060605

    兩中國學者 解開龐加萊猜想

    兩中國學者 解開龐加萊猜想

    廣東中山大學教授朱熹平和中國旅美數學家曹懷東,在六月號「亞洲數學期刊」發表專刊,登載「龐加萊猜想和幾何化猜想的完全證明」專文,演算推證百年來被稱為「七大世紀數學難題」之一的龐加萊猜想。

    http://news.chinatimes.com/Chinatimes/newslist/newslist-content/0,3546,110505+112006060500059,00.html?source=rss

    縱走在稜線之間: 想做的相關研究

    程式測試工具

    一篇不錯的中文 JUnit 簡介:
    JUnit 學習筆記
    利用 Ant 和 JUnit 进行增量开发

    發展程式會用到的工具

    20060604

    APA style 筆記

    美國 APA 協會居然要錢買他們出版的書,
    才能看到標準。
    只好到 wikipedia 讀自由版本的標準了。
    連連連,找到一篇不錯的 Citation Styles Handbook: APA
    中文寫法:臺灣健康促進暨衛生教育學會投稿格式
    • APA 稱參考文獻為 reference list 而非 bibliography
    請參閱:
    研究方法課的一些重點

    20060603

    關聯模型的正規化理論

    今天在南台圖書讀 C. J. Date 大部頭的資料庫理論第七版

    摘要如下:

    函數相依性 function dependent
    若一關聯 R, a, b 是 R 的屬性,
    若每個不同的 a 值,則會有一固定 b 值與它對映,
    則稱 b 函數相依於 a,
    a 稱為決定集,b 稱為相依集
    記作 a->b。

    多值相依性 multivalue dependent
    若一關聯 R, a, b,c 是 R 的屬性,
    若每個不同的 a 值,則會有一固定 b 值與它對映,
    則稱 b 函數相依於 a,
    a 稱為決定集,b 稱為相依集,
    記作 a->b。

    20060602

    馮紐曼模型與哈佛模型

    目前的計算機具有兩種模型
    馮鈕曼模型:
    將指令與資料都存在同一個記憶體

    哈佛模型:
    將指令與資料存在不同地方


    這與資料編碼有很大的相關,
    我們可編指令碼到傳輸的訊息中,
    讓收訊端利用計算能力解碼才能得知想要的資訊,
    也可直接告訴收訊端想要的資訊。
    也可看看下文
    資料編碼的品質

    Vim JDE

    剛看到的據說有 code completion 的功能
    值得研究。

    可以看看我的另一篇發展程式的工具

    20060518

    職場

    職埸上每個人都只顧著自已眼前的事
    不顧整體,如何讓員工顧及組織整體,是一門很大的學問。

    我想在這樣的公司工作,
    若無機會,我想創立這樣的公司。

    目前目標:
    盡速拿到學位,
    作出研究,
    使自已工作的價值更高

    20060516

    CVS 說明中 module 的意義

    syntax:
    cvs -d repos cmd -d dir module

    第二個 option -d 後的 dir 指 checkout 下來的檔案,把其原目錄更動為 dir。
    在 cvs 說明中,module 指的是一個目錄,或是一個檔案,若是目錄,則會作用在目錄所有的檔案,若是指向一個檔案,則作用此一個檔案。


    D:\mywork\helper_note>cvs -d :pserver:nckmcvs:nckmcvs@ftp-proxy.syscom.com.tw:/cvshome/nckm co -d station nckm_s/DefaultWebApp/hospitalization/station/CC009101fetch.jsp

    20060512

    遠距離愛情

    說真的,分隔兩地對我而言是一種煎熬,擔心、害怕、寂寞。但是能如何呢?

    20060502

    民主與真理

    免去測試的最佳方法,用最多人使用的輪子,其功能最能保證其所宣稱的。
    一群人的共同意見會比較貼近真理。

    女人呢?
    -----------
    知識也能用民主決定嗎?
    維基百科 vs 大英百科

    CNET 的關於上面的報導
    維基百科創辦人:Wikipedia是一種社會運動