2007/11/27

40種網頁常用小技巧 (javascript)

1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽鼠標右鍵

<table border oncontextmenu=return(false)><td>no</table> 可用於Table

2. <body onselectstart="return false"> 取消選取、防止複製

3. onpaste="return false" 不准粘貼

4. oncopy="return false;" oncut="return false;" 防止複製

5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址欄前換成自己的圖標

6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夾中顯示出你的圖標

7. <input style="ime-mode:disabled"> 關閉輸入法

8. 永遠都會帶著框架
<script language="JavaScript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm為框架網頁
// --></script>

9. 防止被人frame
<SCRIPT LANGUAGE=JAVASCRIPT><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>

10. 網頁將不能被另存為
<noscript><iframe src=*.html></iframe></noscript>

11. <input type=button value=查看網頁源代碼
onclick="window.location = "view-source:"+ "http://www.51js.com/"">

12.刪除時確認
<a href="javascript:if(confirm("確實要刪除嗎?"))location="boos.asp?&areyou=刪除&page=1"">刪除</a>

13. 取得控件的絕對位置
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>
//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控件的位置"
end function
--></script>

14. 光標是停在文本框文字的最後
<script language="javascript">

function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">

15. 判斷上一頁的來源
javascript:
document.referrer

16. 最小化、最大化、關閉窗口
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" VALUE="Close"></OBJECT>
<input type=button value=最小化 onclick=hh1.Click()>
<input type=button value=最大化 onclick=hh2.Click()>
<input type=button value=關閉 onclick=hh3.Click()>

本例適用於IE

17.屏蔽功能鍵Shift,Alt,Ctrl
<script>
function look(){
if(event.shiftKey)
alert("禁止按Shift鍵!"); //可以換成ALT CTRL
}
document.onkeydown=look;
</script>

18. 網頁不會被緩存
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或者<META HTTP-EQUIV="expires" CONTENT="0">

19.怎樣讓表單沒有凹凸感?
<input type=text style="border:1 solid #000000">

<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:1 solid #000000"></textarea>

20.<div><span>&<layer>的區別?
<div>(division)用來定義大段的頁面元素,會產生轉行
<span>用來定義同一行內的元素,跟<div>的唯一區別是不產生轉行
<layer>是ns的標記,ie不支持,相當於<div>

21.讓彈出窗口總是在最上面:
<body onblur="this.focus();">

22.不要滾動條?
讓豎條沒有:
<body style="overflow:scroll;overflow-y:hidden">
</body>
讓橫條沒有:
<body style="overflow:scroll;overflow-x:hidden">
</body>
兩個都去掉?更簡單了
<body scroll="no">
</body>

23.怎樣去掉圖片鏈接點擊後,圖片周圍的虛線?
<a href="#" onFocus="this.blur()"><img src="logo.jpg" border=0></a>

24.電子郵件處理提交表單
<form name="form1" method="post" action="mailto:****@***.com" enctype="text/plain">
<input type=submit>
</form>

25.在打開的子窗口刷新父窗口的代碼裡如何寫?
window.opener.location.reload()

26.如何設定打開頁面的大小
<body onload="top.resizeTo(300,200);">
打開頁面的位置<body onload="top.moveBy(300,200);">

27.在頁面中如何加入不是滿鋪的背景圖片,拉動頁面時背景圖不動
<STYLE>
body
{background-image:url(logo.gif); background-repeat:no-repeat;
background-position:center;background-attachment: fixed}
</STYLE>


28. 檢查一段字符串是否全由數字組成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>

29. 獲得一個窗口的大小

document.body.clientWidth; document.body.clientHeight

30. 怎麼判斷是否是字符

if (/[^/x00-/xff]/g.test(s)) alert("含有漢字");
else alert("全是字符");

31.TEXTAREA自適應文字行數的多少

<textarea rows=1 name=s1 cols=27 onpropertychange="this.style.posHeight=this.scrollHeight">
</textarea>

32. 日期減去天數等於第二個日期

<script language=Javascript>

function cc(dd,dadd)
{
//可以加上錯誤處理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "年" + (a.getMonth() + 1) + "月" + a.getDate() + "日")
}
cc("12/23/2002",2)
</script>

33. 選擇了哪一個Radio

<script language="vbscript">

function checkme()
for each ob in radio1
if ob.checked then window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="style" checked>Style
<INPUT name="radio1" type="radio" value="barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY>

34.腳本永不出錯
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide

function killErrors() {
return true;
}
window.onerror = killErrors;
// -->
</SCRIPT>

35.ENTER鍵可以讓光標移到下一個輸入框

<input onkeydown="if(event.keyCode==13)event.keyCode=9">

36. 檢測某個網站的鏈接速度:
把如下代碼加入<body>區域中:
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]="www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]="www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]="www.cctv.com"

function butt(){
document.write("<form name=autof>")
for(var i=1;i<autourl.length;i++)
document.write("<input type=text name=txt"+i+" size=10 value=測試中……> =》<input type=text name=url"+i+" size=40> =》<input type=button value=GO
onclick=window.open(this.form.url"+i+".value)><br>")
document.write("<input type=submit value=刷新></form>")
}

butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="鏈接超時"}
else
{document.forms[0]["txt"+b].value="時間"+tim/10+"秒"}
b++
}

function run(){
for(var i=1;i<autourl.length;i++)document.write("<img
src=http://"+autourl+"/"+Math.random()+" width=1 height=1
onerror=auto("http://"+autourl+"")>")}
run()</script>

37. 各種樣式的光標
auto :標準光標
default :標準箭頭
hand :手形光標
wait :等待光標
text :I形光標
vertical-text :水平I形光標
no-drop :不可拖動光標
not-allowed :無效光標
help :?幫助光標
all-scroll :三角方向標
move :移動標
crosshair :十字標
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize

38.頁面進入和退出的特效
進入頁面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出頁面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">  
這個是頁面被載入和調出時的一些特效。duration表示特效的持續時間,以秒為單位。transition表示使用哪種特效,取值為1-23:
  0 矩形縮小
  1 矩形擴大
  2 圓形縮小
  3 圓形擴大
  4 下到上刷新
  5 上到下刷新
  6 左到右刷新
  7 右到左刷新
  8 豎百葉窗
  9 橫百葉窗
  10 錯位橫百葉窗
  11 錯位豎百葉窗
  12 點擴散
  13 左右到中間刷新
  14 中間到左右刷新
  15 中間到上下
  16 上下到中間
  17 右下到左上
  18 右上到左下
  19 左上到右下
  20 左下到右上
  21 橫條
  22 豎條
  23 以上22種隨機選擇一種

39.在規定時間內跳轉

<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">

40.網頁是否被檢索

<meta name="ROBOTS" content="屬性值">
  其中屬性值有以下一些:
  屬性值為"all": 文件將被檢索,且頁上鏈接可被查詢;
  屬性值為"none": 文件不被檢索,而且不查詢頁上的鏈接;
  屬性值為"index": 文件將被檢索;
  屬性值為"follow": 查詢頁上的鏈接;
  屬性值為"noindex": 文件不檢索,但可被查詢鏈接;
  屬性值為"nofollow": 文件不被檢索,但可查詢頁上的鏈接。


轉貼於
作者: cks (xxx.tm.net.my)
日期: 10-18-2004 17:35

2007/10/29

摩斯漢堡 熱量表

*早餐類

火腿起士可鬆堡(40元)-272大卡
鮪魚沙拉可鬆堡(45元)-296大卡
沙拉三明治(35元)-355大卡
豬排三明治(35元)-356大卡
摩斯熱狗堡(55元)-381大卡
火腿蛋三明治(40元)-384大卡
火腿杏力蛋堡(45元)-249大卡
鱈魚堡(60元)-395大卡
培根雞蛋堡(40元)-419大卡
雞肉沙拉三明治(40元)-447大卡

(點購元氣早餐套餐+20元可換套餐沙拉/北海道可樂餅)
套餐沙拉-71大卡
北海道可樂餅-159大卡

*米漢堡類

牛蒡培根珍珠堡(60元)-238大卡
蒟蒻珍珠堡(60元)-260大卡
燒肉珍珠堡(65元)-291大卡
薑燒珍珠堡(豬肉)(60元)-325大卡
厚燒醬味漢堡(80元)-355大卡
海洋珍珠堡(70元)-356大卡
鮮蝦珍珠堡(65元)-501大卡

(米漢堡皆可升級為有機米漢堡,需加10元)

*漢堡類

蜜汁烤雞堡(65元)-323大卡
摩斯漢堡(65元)-358大卡
摩斯熱狗堡(55元)-381大卡
摩斯鱈魚堡(60元)-395大卡
摩斯吉士漢堡(70元)-407大卡
辣味吉利熱狗堡(65元)-464大卡

*點心類

草莓雪果(15元/1顆)-30.5大卡
蒟蒻(40元)蜂蜜檸檬-34大卡
蒟蒻(40元)胡蘿蔔-47大卡
海藻鮮蔬沙拉(55元)-52大卡(不含醬料)
蒟蒻(40元)水蜜桃-57大卡
蝴蝶蝦(55元)-123大卡
北海道可樂餅(35元)-159大卡
雞肉總匯沙拉(55元)-167大卡(不含醬料)
法蘭克熱狗(32元)-175大卡
洋蔥圈(35元)-179大卡
薯條(S:25元/L:35元)-195大卡/330大卡
摩斯雞塊5塊(55元)-230大卡
金黃薯條(30元)-260大卡
蒜香雞球(45元)-303大卡
和風炸雞(1P/3P/5P:52元150元245元)-394大卡

*甜食類

摩斯特級香濃冰淇淋(50元)蘭姆葡萄-143.8大卡
摩斯特級香濃冰淇淋(50元)草莓-152.3大卡
覆盆子起司(40元)-162大卡
摩斯特級香濃冰淇淋(50元)巧克力布朗尼-168.4大卡
巧克起司(40元)-224大卡
曼波起司(40元)-229大卡
提拉米蘇(65元)-231大卡
巧克力慕斯(65元)-281大卡
芒果布丁(65元)-285大卡
巧克力水果(65元)-354.5大卡
牛奶糖歐蕾(65元)-369.3大卡

*冷飲類

摩斯礦泉水(18元)-0大卡
健怡可樂(M:25元/L:30元)-1.2大卡/1.5大卡
MOS鮮乳(30元)-117.8大卡
新鮮柳橙汁(50元)-120.5大卡
冰咖啡(M:30元/L:35元)-154大卡/192大卡
新鮮葡萄汁(50元)-171.09大卡
可樂(M:25元/L:30元)-191大卡/239大卡
冰紅茶(M:30元/L:35元)-197大卡/247大卡
雪碧(M:25元/L:30元)-209大卡/261大卡

*熱飲類

原片香桔茶(35元)-0.01大卡
纖綠檸檬茶(35元)-0.02大卡
熱咖啡/紅茶(30元)-7.2大卡/1.8大卡
可可亞(30元)-158大卡
玄米煎茶(40元)-220大卡
柚子綠茶(40元)-358大卡

*湯品類

鮮菇濃湯(40元)-83.3大卡
海鮮濃湯(40元)-110大卡
蔬菜濃湯(40元)-180大卡
玉米濃湯(35元)-180大卡

漢堡王 熱量表

*主餐類

漢堡王炸雞腿-227大卡
華嫩雞條(6PCS)-259大卡
火烤漢堡-311大卡
火烤吉士漢堡-353大卡
小華堡-397大卡
華雪魚-471大卡
雙層吉士漢堡-534大卡
雙層燒烤培根堡-580大卡
華辣雞腿堡-597大卡
華香雞排堡-685大卡
華堡-763大卡

*早餐類

華酥蛋-289大卡
華酥培根-324大卡
華酥火腿-335大卡
薯球-410大卡

*附餐點心類

蘋果派-158大卡
薯條(小)-250大卡
洋蔥圈(中)-380大卡
薯條(中)-400大卡
洋蔥圈(大)-554大卡
薯條(大)-590大卡

*飲料類

熱紅茶-0大卡
可口可樂Light(兒)-1大卡
可口可樂Light(小)-1大卡
可口可樂Light(中)-2大卡
可口可樂Light(大)-2大卡
熱咖啡-5大卡
卡布其諾咖啡-44大卡
摩卡其諾咖啡-91大卡
熱巧克力-111大卡
可口可樂(兒)-120大卡
芬達橘子(兒)-128大卡
雪碧(兒)-130大卡
冰咖啡-131大卡
柳橙汁-158大卡
可口可樂(小)-160大卡
雪碧(小)-160大卡
芬達橘子(小)-170大卡
冰紅茶(中)-171大卡
雪碧(中)-220大卡
可口可樂(中)-230大卡
芬達橘子(中)-234大卡
冰紅茶(大)-248大卡
雪碧(大)-320大卡
可口可樂(大)-330大卡
芬達橘子(大)-341大卡

麥當勞 熱量表

蛋堡1份295玉米濃湯(小)1杯85
漢堡1份260玉米濃湯(大)1杯128
薯餅1份150檸檬漾(大杯)1杯30
鬆餅1份186雪碧汽水(小)1杯121
焙果1份296雪碧汽水(中)1杯172
麥香雞1份519雪碧汽水(大)1杯254
麥香魚1份344可口可樂(小)1杯115
麥香堡1份521可口可樂(中)1杯165
滿福堡1份306可口可樂(大)1杯248
蘋果派1份260柳橙原汁(小)1杯161
薯條(小)1份111柳橙原汁(大)1杯227
薯條(中)1份158麥脆雞(原味)雞翅1塊310
薯條(大)1份199麥脆雞(原味)雞胸1塊311
豬肉蛋堡1份434麥脆雞(原味)雞排1塊260
吉事漢堡1份309麥脆雞(原味)雞腿1塊282
火腿蛋堡1份315麥脆雞(辣味)雞翅1塊309
豬肉鬆餅1份215麥脆雞(辣味)雞胸1塊290
麥克雞塊6塊299麥脆雞(辣味)雞排1塊258
糖醋醬包1包47麥脆雞(辣味)雞腿1塊298
勁辣雞腿堡1份285搖滾沙拉(火腿)1份27
豬肉滿福堡1份376冰旋風(奧利奧)1份163
豬肉滿福蛋堡1份465冰旋風(聽明豆)1份185
熱紅茶1杯2冰檸檬紅茶(小)1杯133
熱咖啡1杯6冰檸檬紅茶(中)1杯173
冰咖啡1杯97冰檸檬紅茶(大)1杯255
熱巧克力1杯139芬達橘子汽水(小)1杯133
香草奶昔1份283芬達橘子汽水(中)1杯191
草莓奶昔1份364芬達橘子汽水(大)1杯292
草莓聖代1份251柳橙原汁(輕鬆杯)1杯98
蛋捲冰淇淋1份185搖滾沙拉(夏威夷)1份33
巧克力奶昔1份374雪碧汽水(輕鬆杯)1杯88
巧克力聖代1份313可口可樂(輕鬆杯)1杯82
冰楂酸梅湯1杯43冰檸檬紅茶(輕鬆杯)1杯97



芬達橘子汽水(輕鬆杯)1杯97

Subway 熱量表

六吋潛艇堡
素食堡
火雞胸肉
火雞,火腿
火腿
燒烤牛肉
火雞,火腿,牛肉
香烤雞肉
甜蔥紅燒雞肉
重量(克/個)
158
215
224
215
215
248
222
241
熱量(大卡)
236
280
293
291
303
324
309
346
蛋白質(公克)
8
15
18
18
18
22
20
22
碳水化合物(公克)
42
46
45
43
43
45
44
49
脂肪(公克)
3.5
4.0
4.5
5.0
6.0
5.5
6.0
6.0

















圓形麵包
火雞胸肉
火腿
燒烤牛肉





重量(克/個)
155
145
155





熱量(大卡)
221
219
236





蛋白質(公克)
12
12
14





碳水化合物(公克)
36
34
34





脂肪(公克)
3.0
3.5
4.5






















沙拉
素食堡
火雞胸肉
火雞,火腿
火腿
燒烤牛肉
火雞,火腿,牛肉
香烤雞肉
重量(克/個)
233
290
299
290
290
324
303
熱量(大卡)
50
95
107
105
117
139
131
蛋白質(公克)
2
9
11
12
12
16
15
碳水化合物(公克)
9
13
12
10
10
13
11
脂肪(公克)
1.0
1.5
2.0
2.5
3.0
3.0
3.5

2007/10/25

FreeCommander :多功能檔案總管新版改進

freeCommander是一個可取代Windows檔案總管的免費軟體,freeCommander 擁有與 Total Commander 相似的操作介面,因此使用過 Total Commander 的使用者應該能夠很容易就上手。freeCommander 提供雙視窗顯示功能,也就是使用者能夠直接在 freeCommander 當中,同時瀏覽兩個不同目錄中的檔案,並且在彼此間進行搬移的動作,方便使用者管理檔案時的需要。而 freeCommander 也同時內建了常見壓縮檔的解壓與壓縮功能(ZIP、RAR、CAB),那你完全不必再安裝額外的壓縮軟體。此外,如檔案碎紙機、 MD5 檢查碼的產生與校驗、圖形檔案瀏覽...等,都在 freeCommander 的支援之列喔。

* 改善圖標外觀:介面有稍微好看一點,雖然幅度很小。
*

* 支援 ClearType 字體:可以在視窗中顯示開啟 ClearType功能的字體,使得瀏覽上有更舒適的視覺體驗。
*

* 自動儲存設定:在「設定」-「一般」裡勾選「Auto Save Setting」,就可以自動保存設定。
*

* 更方便的過濾條件輸入欄位:最新版的 FreeCommander 在兩個視窗底下都多出一個過濾條件輸入欄位,你只要輸入關鍵字,就可以快速的找到、或排除某些檔案,這個新介面的設計增加了許多方便性,尤其在找充滿了圖片或文字檔的資料夾時。
*

* 快速複製路徑按鈕:舊版裡要複製索在目錄的路徑不是很容易,而新版在上方的路徑欄位後,增加了一個複製按鈕,讓你可以快速複製。
*

* 快速預覽功能:這是一個很重要的新功能,按下「Ctrl+ Q」可以開啟快速預覽檔案,會在另一邊的視窗裡即時顯示檔案內容。支援圖片檔、文字檔等檔案的快速預覽。
*

* 內建獨立檔案預覽器:這是上面那個功能的延伸,FreeCommander 加入一個自己的預覽器,可以讓你快速連覽圖片或文字檔案的內容,就像 ACDsee之類的圖片瀏覽器一樣,還有往前、往後瀏覽、放大縮小、左右旋轉等功能,增加預覽的方便性。
*

* 資料夾標籤功能 Tab:這個最令我期待的功能終於登場了,如果你覺得雙視窗瀏覽還不夠的話,那麼 FreeCommander 現在加入了標籤瀏覽的方式,基本操作就和現在網路瀏覽器的頁面標籤一樣。在 FreeCommander 你只要用滑鼠中鍵點擊某個資料夾,就可以將該資料夾開啟在新的標籤裡,而用滑鼠中鍵點擊標籤則可以關閉它。

Starbucks Coffee熱量表

品 名 / 類 別
name / S.T.G
熱量(卡)
Calories
蛋白質(克)
Protein
脂肪(克)
Fat
碳水化合物(克)
Carbohydrates
那 堤 Caffé Latte
Short
Tall 200 11 11 16
Grande 260 14 14 21
卡布奇諾 Cappuccino
Short
Tall 120 7 6 10
Grande 150 8 8 13
焦糖瑪奇朵 Caramel Macchiato
Short
Tall 190 8 9 20
Grande 320 12 14 37
摩 卡 Caffé Mocha
Short
Tall 340 10 19 33
Grande 400 13 22 42
美式咖啡 Caffé Americano
Short
Tall 10 1 0 2
Grande 15 1 0 3
濃縮咖啡 Espresso
Solo 5 0 0 0
Soppio 10 0 0 0
濃縮瑪奇朵 Espresso Macchiato
Solo 10 1 0 1
Soppio 15 1 0 2
濃縮康保藍 Espresso con Panna
Solo 35 1 3 1
Soppio 40 1 3 2

品 名 / 類 別
name / S.T.G
熱量(卡)
Calories
蛋白質(克)
Protein
脂肪(克)
Fat
碳水化合物(克)
Carbohydrates
每日精選咖啡 Coffee of the Day
Short
Tall 5 0 0 1
Grande 10 0 0 2

品 名 / 類 別
name / S.T.G
熱量(卡)
Calories
蛋白質(克)
Protein
脂肪(克)
Fat
碳水化合物(克)
Carbohydrates
冰那堤 Iced Caffé Latte
Tall 120 6 6 10
Grande 160 8 8 13
冰焦糖瑪奇朵 Iced Caramel Macchiatto
Tall 190 7 8 24
Grande 270 10 10 34
冰摩卡 Iced Caffé Mocha
Tall 260 7 15 27
Grande 350 9 20 37
冰美式咖啡 Iced Caffé Americano
Tall 10 1 0 2
Grande 15 1 0 3

品 名 / 類 別
name / S.T.G
熱量(卡)
Calories
蛋白質(克)
Protein
脂肪(克)
Fat
碳水化合物(克)
Carbohydrates
巧克力星冰樂 Chocolate Cream Frappuccino® Blende Cream
Tall 385 10.2 15.2 54
Grande 527 13.8 21.1 72
香蕉星冰樂 Bananas& Cream Frappuccino® With Whip
Tall 385 9.1 11.8 57
Grande 536 12.6 16.4 83

品 名 / 類 別
name / S.T.G
熱量(卡)
Calories
蛋白質(克)
Protein
脂肪(克)
Fat
碳水化合物(克)
Carbohydrates
咖啡星冰樂 Coffee Frappuccino® Blended Coffee
Tall 190 4 2.5 38
Grande 260 5 3.5 52
摩卡星冰樂 Mocha Frappuccino® Blended Coffee
Tall 310 5 12 46
Grande 420 6 16 61
濃縮咖啡星冰樂 Espresso Frappuccino® Blended Coffee
Tall 160 4 2 33
Grande 230 5 3 46
焦糖星冰樂 Caramel Frappuccino® Blended Coffee
Tall 320 4 12 47
Grande 430 6 16 61
摩卡可可碎片星冰樂 Java Chip Frappuccino® Blended Coffee
Tall 370 5 15 54
Grande 510 7 22 73
摩卡可可碎片加鮮奶油 Java Chip Frappuccino® With Whip
Tall 369 5.4 14.6 55
Grande 205 7.2 20.4 74
摩卡可可碎片Light系列加鮮奶油 Java Chip Frappuccino®
Light With Whip
Tall 296 7.1 13.0 40
Grande 404 9.6 18.2 53
香蕉焦糖星冰樂 Banana Caramel Frappuccino® With Whip
Tall 402 4.3 11.4 68
Grande 546 5.9 15.8 92
香蕉焦糖星冰樂Light系列Banana Caramel Frappuccino®
Light With Whip
Tall 329 6.0 9.8 53
Grande 446 8.3 13.6 70

2007/10/21

免費防火牆 - Comodo Firewall Pro

免費防火牆 - Comodo Firewall Pro,獲得 PC Magazine 編輯 4.5 顆星的推薦,安裝之後讓電腦的網路安全多一道防護,所有透過程式運作的網路存取活動都會被它所攔截,你可以選擇放行或攔截,藉此防堵木馬、廣告程式的惡意行為,軟體的防火牆多是透過這套原理在運作的。

2007/10/03

Notebook Hardware Control (NHC)

NHC本名叫做(Notebook Hardware Control),顧名思義,NHC可以管得東西真的很多,上從CPU時脈與電壓,下至硬碟的休眠與噪音,都是其管轄範圍,真的有點像管家婆。在兩年前 NHC還是叫CHC(Centrino Hardware Control)時,有人就這注意到這個軟體了,本來是自由軟體,後來改名叫NHC後,就要付費才能開啟全功能,不過免費的版本已經非常好用,除了剛剛提 到可以調整CPU與硬碟細部的電源管理設定外,連顯示卡都可以動態調整時脈,以幫助省電,不過目前尚不支援Intel的顯卡,只要遇到支援的顯卡,除了時 脈外,連螢幕亮度都可以各自設定。

NHC在CPU的調節方面做得相當完善,除了可以依據CPU使用率,階段調整倍頻外,還能降電壓,大家聽過超頻要加電壓,很少聽過要降壓 吧。而NHC為了確保降電壓後可以穩定運作,還要求使用者一定要通過NHC的小測試,才允許使用該電壓值,相當地貼心。我們在NHC裡頭的所有設定都可以 單獨存成一個設定值,而且可以指定是在AC模式或是電池模式下使用,NHC便會自動載入。

付費版的差異在於可以讓NHC用「系統服務」的方式執行,而免費版則是當一般程式,會比較吃系統資源。如果試用過NHC覺得不錯的話,請大家一起贊助一下吧。

2007/06/23

Call Stored Procedure

不同資料庫的Stored Procedure的呼叫方式應該是大同小異,至少透過JDBC來呼叫更應該如此吧?! 但是,我只在Oracle 9.2上試過,所以,以下的方法只保證在Oracle 9.2下執行是正確的。
假設目前有stored procedure - gpv(empId, password)
它的功能是傳入員工編號 (empId),傳回加密的密碼,並且,當執行成功時,會傳回0,失敗時會傳回錯誤代碼,傳回值的型別是整數,那麼程式該怎麼寫?

con = pool.getConnection(); // 由Connection Pool取得Connection
sql = "{ ? = call gpv(?, ?) }"; // sql statement,詳見說明A
cstmt = con.prepareCall(sql); // cstmt的型別是CallableStatement
cstmt.registerOutParameter(1, Types.INTEGER); // 說明B
cstmt.setString(2, emp_id); // 說明C
cstmt.registerOutParameter(3, Types.LONGVARCHAR);
cstmt.execute(); // 執行
ret = cstmt.getInteger(1);
pwd = cstmt.getString(3).trim(); //說明D

  • 說明A:這是呼叫stored procedure的途述,如上是當有傳回值時,如果沒有傳回值要寫成{ call gpv(?, ?) }
  • 說明B:如果參數將會傳回值的話,必須註冊。
  • 說明C:當參數只傳入不傳出時,如此設定。
  • 說明D:傳回值是第一個參數,傳回的參數是第三個參數。
[轉貼自 - 史帝芬心得筆記]

2007/06/07

Java Excel Api - II

Workbook類提供的方法

  1. int getNumberOfSheets()

  獲得工作薄(Workbook)中工作表(Sheet)的個數,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
int sheets = rwb.getNumberOfSheets();

  2. Sheet[] getSheets()

  返回工作薄(Workbook)中工作表(Sheet)物件陣列,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
Sheet[] sheets = rwb.getSheets();

  3. String getVersion()

  返回正在使用的API的版本號,好像是沒什麼太大的作用。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
String apiVersion = rwb.getVersion();

  Sheet介面提供的方法

  1) String getName()

  獲取Sheet的名稱,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
String sheetName = rs.getName();

  2) int getColumns()

  獲取Sheet表中所包含的總列數,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsColumns = rs.getColumns();

  3) Cell[] getColumn(int column)

  獲取某一列的所有單格,返回的是單格物件陣列,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getColumn(0);

  4) int getRows()

  獲取Sheet表中所包含的總行數,示例:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
int rsRows = rs.getRows();

  5) Cell[] getRow(int row)

  獲取某一行的所有單格,返回的是單格物件陣列,示例子:
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell[] cell = rs.getRow(0);

  6) Cell getCell(int column, int row)

  獲取指定單格的物件引用,需要注意的是它的兩個參數,第一個是列數,第二個是行數,這與通常的行、列組合有些不同。
jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
jxl.Sheet rs = rwb.getSheet(0);
Cell cell = rs.getCell(0, 0);

  2、生成新的Excel工作薄

  下面的代碼主要是向大家介紹如何生成簡單的Excel工作表,在這裏單格的內容是不帶任何修飾的(如:字體,顏色等等),所有的內容都作為字串寫入。(完整代碼見ExcelWriting.java)

  與讀取Excel工作表相似,首先要使用Workbook類的工廠方法創建一個可寫入的工作薄(Workbook)物件,這裏要注意的是,只能通過API提供的工廠方法來創建Workbook,而不能使用WritableWorkbook的構造函數,因為類WritableWorkbook的構造函數為protected類型。示例代碼片段如下:
import java.io.*;
import jxl.*;
import jxl.write.*;
… … … …
try
{
//構建Workbook物件, 唯讀Workbook物件
//Method 1:創建可寫入的Excel工作薄
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));

//Method 2:將WritableWorkbook直接寫入到輸出流
/*
OutputStream os = new FileOutputStream(targetfile);
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
*/
}
catch (Exception e)
{
e.printStackTrace();
}

  API提供了兩種方式來處理可寫入的輸出流,一種是直接生成本地檔,如果檔案名不帶全路徑的話,缺省的檔會定位在當前目錄,如果檔案名帶有全路徑的話,則生成的Excel檔則會定位在相應的目錄;另外一種是將Excel物件直接寫入到輸出流,例如:用戶通過流覽器來訪問Web伺服器,如果HTTP頭設置正確的話,流覽器自動調用用戶端的Excel應用程式,來顯示動態生成的Excel試算表。

  接下來就是要創建工作表,創建工作表的方法與創建工作薄的方法幾乎一樣,同樣是通過工廠模式方法獲得相應的物件,該方法需要兩個參數,一個是工作表的名稱,另一個是工作表在工作薄中的位置,參考下面的代碼片段:
//創建Excel工作表
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);

"這鍋也支好了,材料也準備齊全了,可以開始下鍋了!",現在要做的只是實例化API所提供的Excel基本資料類型,並將它們添加到工作表中就可以了,參考下面的代碼片段:
//1.添加Label對象
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
ws.addCell(labelC);

//添加帶有字型Formatting的物件
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);

//添加帶有字體顏色Formatting的物件
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
Underlinestyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCF);

//2.添加Number對象
jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
ws.addCell(labelN);

//添加帶有formatting的Number對象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);

//3.添加Boolean對象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);

//4.添加DateTime對象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);

//添加帶有formatting的DateFormat對象
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);

  這裏有兩點大家要引起大家的注意。第一點,在構造單格時,單格在工作表中的位置就已經確定了。一旦創建後,單格的位置是不能夠變更的,儘管單格的內容是可以改變的。第二點,單格的定位是按照下面這樣的規律(column, row),而且下標都是從0開始,例如,A1被存儲在(0, 0),B1被存儲在(1, 0)。

  最後,不要忘記關閉打開的Excel工作薄物件,以釋放佔用的記憶體,參見下面的代碼片段:
//寫入Exel工作表
wwb.write();

//關閉Excel工作薄物件
wwb.close();

  這可能與讀取Excel檔的操作有少少不同,在關閉Excel物件之前,你必須要先調用write()方法,因為先前的操作都是存儲在緩存中的,所以要通過該方法將操作的內容保存在檔中。如果你先關閉了Excel物件,那麼只能得到一張空的工作薄了。

  3、拷貝、更新Excel工作薄

  接下來簡要介紹一下如何更新一個已經存在的工作薄,主要是下面二步操作,第一步是構造唯讀的Excel工作薄,第二步是利用已經創建的Excel工作薄創建新的可寫入的Excel工作薄,參考下面的代碼片段:(完整代碼見ExcelModifying.java)
//創建唯讀的Excel工作薄的物件
jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));

//創建可寫入的Excel工作薄物件
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile), rw);

//讀取第一張工作表
jxl.write.WritableSheet ws = wwb.getSheet(0);

//獲得第一個單格對象
jxl.write.WritableCell wc = ws.getWritableCell(0, 0);

//判斷單格的類型, 做出相應的轉化
if(wc.getType() == CellType.LABEL)
{
Label l = (Label)wc;
l.setString("The value has been modified.");
}

//寫入Excel對象
wwb.write();

//關閉可寫入的Excel對象
wwb.close();

//關閉唯讀的Excel對象
rw.close();

  之所以使用這種方式構建Excel物件,完全是因為效率的原因,因為上面的示例才是API的主要應用。為了提高性能,在讀取工作表時,與資料相關的一些輸出資訊,所有的格式資訊,如:字體、顏色等等,是不被處理的,因為我們的目的是獲得行資料的值,既使沒有了修飾,也不會對行資料的值產生什麼影響。唯一的不利之處就是,在記憶體中會同時保存兩個同樣的工作表,這樣當工作表體積比較大時,會佔用相當大的記憶體,但現在好像記憶體的大小並不是什麼關鍵因素了。

  一旦獲得了可寫入的工作表物件,我們就可以對單格物件進行更新的操作了,在這裏我們不必調用API提供的add()方法,因為單格已經於工作表當中,所以我們只需要調用相應的setXXX()方法,就可以完成更新的操作了。

  盡單格原有的格式化修飾是不能去掉的,我們還是可以將新的單格修飾加上去,以使單格的內容以不同的形式表現。

  新生成的工作表物件是可寫入的,我們除了更新原有的單格外,還可以添加新的單格到工作表中,這與示例2的操作是完全一樣的。

  最後,不要忘記調用write()方法,將更新的內容寫入到檔中,然後關閉工作薄物件,這裏有兩個工作薄物件要關閉,一個是唯讀的,另外一個是可寫入的。

[以上文章均為轉貼自香港IT網]

Java Excel Api - I

使用Windows作業系統的朋友對Excel(試算表)一定不會陌生,但是要使用Java語言來操縱Excel檔並不是一件容易的事。在Web應用日益盛行的今天,通過Web來操作Excel檔的需求越來越強烈,目前較為流行的操作是在JSP或Servlet 中創建一個CSV (comma separated values)檔,並將這個檔以MIME,text/csv類型返回給流覽器,接著流覽器調用Excel並且顯示CSV檔。這樣只是說可以訪問到Excel檔,但是還不能真正的操縱Excel檔,本文將給大家一個驚喜,向大家介紹一個開放源碼項目,Java Excel API,使用它大家就可以方便地操縱Excel檔了。

  Java Excel API簡介

  Java Excel是一開放源碼專案,通過它Java開發人員可以讀取Excel檔的內容、創建新的Excel檔、更新已經存在的Excel檔。使用該API非Windows作業系統也可以通過純Java應用來處理Excel資料表。因為是使用Java編寫的,所以我們在Web應用中可以通過JSP、Servlet來調用API實現對Excel資料表的訪問。

  現在發佈的穩定版本是V2.0,提供以下功能:

   從Excel 95、97、2000等格式的檔中讀取資料;
   讀取Excel公式(可以讀取Excel 97以後的公式);
   生成Excel資料表(格式為Excel 97);
   支援字體、數位、日期的格式化;
   支援單格的陰影操作,以及顏色操作;
   修改已經存在的資料表;

  現在還不支援以下功能,但不久就會提供了:

   不能夠讀取圖表資訊;
   可以讀,但是不能生成公式,任何類型公式最後的計算值都可以讀出;
 
   應用示例

  1、從Excel檔讀取資料表

  Java Excel API既可以從本地檔系統的一個檔(.xls),也可以從輸入流中讀取Excel資料表。讀取Excel資料表的第一步是創建Workbook(術語:工作薄),下面的代碼片段舉例說明了應該如何操作:(完整代碼見ExcelReading.java)
import java.io.*;
import jxl.*;
… … … …
try
{
//構建Workbook物件, 唯讀Workbook物件
//直接從本地檔創建Workbook
//從輸入流創建Workbook
InputStream is = new FileInputStream(sourcefile);
jxl.Workbook rwb = Workbook.getWorkbook(is);
}
catch (Exception e)
{
e.printStackTrace();
}

  一旦創建了Workbook,我們就可以通過它來訪問Excel Sheet(術語:工作表)。參考下面的代碼片段:
//獲取第一張Sheet表
Sheet rs = rwb.getSheet(0);

  我們既可能通過Sheet的名稱來訪問它,也可以通過下標來訪問它。如果通過下標來訪問的話,要注意的一點是下標從0開始,就像陣列一樣。

  一旦得到了Sheet,我們就可以通過它來訪問Excel Cell(術語:單格)。參考下面的代碼片段:
//獲取第一行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();

//獲取第一行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();

//獲取第二行,第二列的值
Cell c11 = rs.getCell(1, 1);
String strc11 = c11.getContents();

System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());

  如果僅僅是取得Cell的值,我們可以方便地通過getContents()方法,它可以將任何類型的Cell值都作為一個字串返回。示例代碼中Cell(0, 0)是文本型,Cell(1, 0)是數字型,Cell(1,1)是日期型,通過getContents(),三種類型的返回值都是字元型。

  如果有需要知道Cell內容的確切類型,API也提供了一系列的方法。參考下面的代碼片段:
String strc00 = null;
double strc10 = 0.00;
Date strc11 = null;

Cell c00 = rs.getCell(0, 0);
Cell c10 = rs.getCell(1, 0);
Cell c11 = rs.getCell(1, 1);

if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)c00;
strc00 = labelc00.getString();
}
if(c10.getType() == CellType.NUMBER)
{
NmberCell numc10 = (NumberCell)c10;
strc10 = numc10.getvalue();
}
if(c11.getType() == CellType.DATE)
{
DateCell datec11 = (DateCell)c11;
strc11 = datec11.getDate();
}

System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());

  在得到Cell物件後,通過getType()方法可以獲得該單格的類型,然後與API提供的基本類型相匹配,強制轉換成相應的類型,最後調用相應的取值方法getXXX(),就可以得到確定類型的值。API提供了以下基本類型,與Excel的資料格式相對應,如下圖所示:

  每種類型的具體意義,請參見Java Excel API document.

  當你完成對Excel試算表資料的處理後,一定要使用close()方法來關閉先前創建的物件,以釋放讀取資料表的過程中所佔用的記憶體空間,在讀取大量資料時顯得尤為重要。參考如下代碼片段:
//操作完成時,關閉物件,釋放佔用的記憶體空間
rwb.close();

  Java Excel API提供了許多訪問Excel資料表的方法,在這裏我只簡要地介紹幾個常用的方法,其他的方法請參考附錄中的Java Excel API document。

[以上文章均為轉貼自香港IT網]

2007/05/23

Subversion 最佳實務

Subversion 最佳實務 [轉貼自愛德華日誌]

這裡提供一組快速的指導原則,讓你能在每天的軟體開發工作中發揮 Subversion 的最大效用。
採用建全的儲存庫配置

儲存庫的目錄配置有許多方式。由於 branches 和 tags 只是一般的目錄,你必須在配置儲存庫的結構時,把它們考慮進去。

Subversion 官方文件建議採用專案根目錄的觀念,來代表專案在儲存庫中的掛載點。專案根目錄裡面僅包含三個子目錄:/trunk, /branches, 及 /tags。一個儲存庫裡面可包含一個或多個專案根目錄。

參考書籍: Choosing a Repository Layout.
以邏輯變更集(changesets)作為提交單位

當你將修改提交到儲存庫時,要確認你的更動反應的是單一的目的:修正一個特定的臭蟲、增加一個新的特性、或是一些特定的工作。你的提交將會產生一個版本號碼,這號碼在往後可用來作為該次變更的 "名稱"。你可以在臭蟲資料庫中記錄這個號碼,或把它拿來作為 svn merge (合併) 的參數。

參考書藉:"Subversion and Changesets" sidebar, within chapter 4.
善用事例追蹤軟體 (issue-tracker)

盡可能試著建立 Subversion 與 issue-tracker 資料庫之間的雙向連結:

* 盡可能在每個提交的登錄訊息 (log message) 中參引到明確的事例編號
* 在事例中附加訊息時 (描述進度,或是關閉事例),註記相應於此事例變更作業的版本號碼

手動追蹤合併

當提交合併的結果時,切記寫下解釋合併了些什麼的描述性資訊,像是:

將 /branches/foobranch 版號 3490:4120 合併至 /trunk。

參考書藉:Tracking merges manually, and Merging a whole branch to another.
了解混合版本的工作複本

存放工作複本的目錄及檔案可以處於不同的工作版號中:這種特意的設計讓你可以混編不同的新舊版號。但是有些事實是你必須注意的:

1. 每次的提交,都會讓你的工作複本包含不同的版號。你剛提交的變更是位於 HEAD 版號中,而其他的部份則屬於之前的版號。
2. 有許多的情況不允許提交:
* 若是某檔案或目錄沒有包含在 HEAD 的工作版號中,那你便不能提交其刪除動作。
* 若是某目錄沒有包含在 HEAD 的工作版號中,那你便不能提交其變更屬性的動作。
3. svn 更新 (update) 指令可以幫你取回整個工作版號的複本,而這也是第 2 個問題常用的解決方案。

參考書籍:The limitation of mixed revisions.
處理較大的檔案時要有耐心

Subversion 的優點之一是:在設計上,它並沒有對處理檔案的大小做限制。檔案以 "流(streamily)" 的形式在 Subversion client 及 server 兩端收送,而網路兩端只使用了少許的、定量的記憶體。

當然,有許多實務上的問題需要考量。雖然沒有必要擔心幾 K 位元組大小左右的檔案 (像是一般的原始檔),提交較大的檔案會花費大量的時間及空間 (像是幾十或幾百 mega 位元組大小的檔案)。

首先,記得 Subversion 的工作複本會在 .svn/text-base/ 目錄內儲存了所有接受版本控管檔案的初始複本(pristine copy)。這表示你的工作複本至少會占用原本資料集的兩倍磁碟空間。此外,Subversion client 會採用 (目前無法調整的) 演算法來提交檔案:

* 將檔案複製到 .svn/tmp/ (這會花一些時間,而暫存檔也會占用額外的磁碟空間)
* 對暫存檔與初始複本 (pristine copy) 進行二進位的差異比對,若是新增加的檔案則會拿暫存檔與空檔比對。(這可能會花很長的時間運算,即使最終只有很少量的資料會傳送到網路的另一端)
* 將差異送到伺服器,並將暫存檔移入 .svn/text-base/

因此雖然在理論上沒有檔案大小的限制,你還是得注意,當 client 程式在蹣跚處置較大檔案時,你得要耐著性子等待。然而,你可以放心的是,不像在 CVS,較大的檔案不會讓你的伺服器掛點,或影響到其他使用者。
因應那些不認得 copies/renames 動作的指令

在檔案或目錄複製或更名後,Subversion 儲存庫會追蹤歷程記錄。不幸的,在 Subversion 1.0 裡,善用這項特性的 client 端指令只有 svn log。許多其他指令 (例如 svn diff 及 svn cat) 應該要能自動追蹤更名歷程,但卻還沒這麼做。

面對這種情況,基本的因應之道是使用 'svn log -v' 指令找出舊版的檔案路徑。

例如,假設你在版號 200 中將 /trunk 複製到 /branches/mybranch,並在後續的版號中提交了對 /branches/mybranch/foo.c 的修改。現在你想比較該檔的 80 及 250 版號。

如果你有該分支的工作複本,並執行 svn diff -r80:250 foo.c,你會看到在版號 80 裡面並不存在 /branches/mybranch/foo.c 的錯誤訊息。補救方法是在你的分支或檔案上執行 svn log -v,以得知它在版號 200 之前稱為 /trunk/foo.c,接著就可以直接比較兩個 URL 了:

$ svn diff http://.../trunk/foo.c@80 http://.../branches/mybranch/foo.c@200
確定建立分支的時機

這是經常被爭論的話題,事實上這應該視軟體專案文化而定,而不是一套事先訂定的、放諸四海皆準的政策。我們將討論比較常見的三種型式:
從不分支的系統

(常用於還沒有可執行程式的初始專案)

* 使用者直接將每天的變更提交到 /trunk 中。
* 當某使用者開始提交一連串的複雜變更時,偶爾會造成 /trunk 的破壞 (無法編譯,或不能通過功能測試)。

優點:易於遵字的政策。新進開發人員進入門檻較低。沒有人需要學習如何操作分支及合併。

缺點:開發過程混亂,程式碼可能在任何時間產生不穩固的狀況。

附註:這種開發模式在 Subversion 中比 CVS 裡風險少一點點。因為 Subversion 的提交是單元式的 (atomic),即使當某人正在提交變更時,你也不可能僅取出 (checkout) 或更新 (update) 部分提交的變更。
總是分支的系統

(常用於傾向重度管理及監督的專案)

* 每個使用者在他自己所建立的分支上進行開發工作。
* 當實作完成後,某人 (原來的程式設計師,同儕,或經理) 複審所有私有分支的改變後,再將變更合併至 /trunk。

優點:可以保證 /trunk 在任何時間都相當穩固。

缺點:程式開發工作在此人為因素下與其他人分隔開來,可能產生更多不必要的合併衝突,而需要使用者進行許多額外的合併工作。
當需要時才分支的系統

(這是 Subversion 專案所採用的型式)

* 使用者將每天的工作提交到 trunk 上
* 規則 1:/trunk 必須在任何時間都能編譯,並通過回歸測試,違反此規則的提交者將在眾人面前無地自容。
* 規則 2:單一的提交 (changeset) 不應太大,免得同儕難以複審。
* 規則 3:若是規則 1 與規則 2 衝突 (例如,無法進行一連串的小提交同時保持 trunk 的穩固),那使用者就應建立一個分支,再於該分支上進行一連串的變更集小提交。這可以讓同儕順利進行複審,又保持 /trunk 的穩固性。

優點:可保證 /trunk 在任何時間都很穩固,也不用常常進行煩人的分支及合併。

缺點:會稍微增加使用者每天的工作負擔,他們在每次的提交前必須進行編譯及測試。

2007/04/23

Javascript - Regular Express

Regular Express 簡介

範例:

檢查日期格式 1900/1/12:/^\d{4}\/\d{1,2}\/\d{1,2}$/

檢查信用卡號 xxxx-xxxx-xxxx-xxxx:/^\d{4}-\d{4}-\d{4}-\d{4}$/

檢查身分證號碼 A000000000 : /^[A-Z]\d{9}$/

檢查IP格式 : /^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b$/

檢查僅能輸入英文數字格式 : /^\w{1,}$/

2007/04/09

Windows - 最佳化虛擬記憶體

如果要讓 Windows 選擇最佳的分頁檔大小,請按一下 [系統管理大小]。
建議的最小值為您電腦上 RAM 的 1.5 倍,而最大值則為這個數字的 3 倍。
例如,假設您有 256 MB 的 RAM,則最小值應為 384 MB,最大值應為 1152 MB。

2007/04/03

判斷檔案的 ContentType/MIME-Type

import javax.activation.MimetypesFileTypeMap;
import java.io.File;

class GetContentType {
public static void main(String args[]) {
File f = new File("gumby.gif");
System.out.println("Mime Type of " + f.getName() + " is " +
new MimetypesFileTypeMap().getContentType(f));
// "Mime Type of gumby.gif is image/gif"
}
}

[註]有可能會mapping不到資料,可以查詢j2ee api : javax.activation.MimetypesFileTypeMap。MIME types

2007/03/28

DataBase - 存取檔案至資料庫 (mssql2000)

環境:
DB : mssql 2000
Table schema :
id int,
fileContent image,
path varchar(255);

從檔案加入至資料庫

code:

try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433", "cf-intermediate",
"cf-intermediate");

File file = new File("C:/MyEclipse5.1/workspace/myJava/abc.doc");
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));

// 將檔案讀入位元陣列
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1];

while (bufferedInputStream.read(bytes) != -1) {
arrayOutputStream.write(bytes);
}
arrayOutputStream.close();
bufferedInputStream.close();
bytes = arrayOutputStream.toByteArray();

System.out.println("bytes="+bytes.length);

PreparedStatement preState = con.prepareStatement("insert into erpglm_append values(?,?,?)");
preState.setBytes(1, bytes);
preState.setString(2, file.getPath());
preState.setString(3, "N");

preState.execute();
con.close();
} catch (Exception e) {
e.printStackTrace();
}


從資料庫取得資料並存成檔案:

try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433", "cf-intermediate",
"cf-intermediate");

String sql = "select fileContent from erpglm_append where id=1";
Statement stat = con.createStatement();
ResultSet rs = stat.executeQuery(sql);
byte[] bytes = null;
while (rs.next()) {
bytes = (byte[]) rs.getObject("fileContent");
}
rs.close();
stat.close();
con.close();

System.out.println("bytes="+bytes.length);

BufferedInputStream bufferedInputStream = new BufferedInputStream(new ByteArrayInputStream(bytes));
File file = new File("C:/MyEclipse5.1/workspace/myJava/abc1.doc");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
byte[] data = new byte[1];
while (bufferedInputStream.read(data) != -1) {
bufferedOutputStream.write(data);
}
bufferedOutputStream.flush();
bufferedInputStream.close();
bufferedOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}

2007/03/26

XDoclet - sql-type 用法

/**
* @hibernate.property name="chtName" not-null="true"
* @hibernate.column name="chtName" sql-type="nvarchar(50)"
*/

欄位長度均由sql-type中給定

2007/03/23

彈跳視窗

1.使彈跳視窗為全螢幕:
window.open("2.html", "page2", "fullscreen=1");

2.使彈跳視窗最大化:
var param = "hight="+screen.availHeight+",width="+screen.availWidth;
window.open("2.html", "page2", param);

3.使彈跳視窗設定座標:
window.open("2.html", "page2", "top=0,left=0");

2007/03/12

Windows - 佈景主題

XPize is a GUI enhancer that replaces most of the non-XP icons, avis and bmps that Microsoft has always overlooked. It also includes some extras and a reloader, which you can use after visiting Windows Update.


2007/03/08

Subversion 走 http 通道

環境 :
    Linux - Ubuntu 6.10 LAMP Server

步驟:
1.安裝 apache http server , subversion
    1.1 安裝apache http server : sudo apt-get install libapache2-svn
    1.2 安裝subversion : sudo apt-get install subversion

2.新增系統群組
    2.1新增群組 : sudo groupadd svn
    2.2新增群組使用者 : sudo adduser www-data svn
    [註:www-data為Apache 帳號]

3.新增資料夾
    3.1新增svn資料夾 : sudo mkdir /home/svn

4.新增repository : sudo svnadmin create /home/svn/

5.設定存取群組
    5.1移至路徑 : cd /home
    5.2改變擁有者 : sudo chown -R root:svn svn
    5.3變更檔案屬性 : sudo chmod -R g+rws svn
    5.4新增www-data至shadow群組 : sudo adduser www-data shadow

6.修改dav_svn設定檔
    6.1移至路徑 : /etc/apache2/mods-available/
    6.2修改檔案dav_svn.conf : sudo pico dav_svn.conf
        加入以下內容
            < Location>
            ...
            ...
            DAV svn
            SVNPath /home/svn/
            AuthType Basic
            AuthName "subversion repository"
            AuthUserFile /home/svn/passwd
            AuthzSVNAccessFile /home/svn/authz
            Require valid-user
            < /Location>

7.新增密碼與權限檔案
    7.1移至路徑 : cd /home/svn
    7.2新增密碼檔案 : passwd
    7.3新增權限檔案 : authz

8.新增svn使用者
    8.1新增svn使用者: sudo htpasswd -c /home/svn/passwd user_name
        ex: sudo htpasswd2 -c /home/svn/passwd jeffchang
        之後他會要求你輸入密碼,輸入通過驗證後即完成。
    8.2之後新的使用者只需要 sudo htpasswd /home/svn/passwd user_name即可

9.設定權限 (部分)
    9.1修改 authz 檔案
        輸入檔案內容:

        [/]
        jeffchang = rw

10.重新開啟apache server: sudo /etc/init.d/apache2 restart

11.完成,即可利用http通道簽入簽出。

防木馬軟體 - Spyware Terminator

Spyware Terminator 是一款免費的電腦防護程式,它主要針對木馬、間諜軟體、惡意網頁等網路攻擊或陷阱來進行即時的防護,並且為電腦先行寫入某些惡意網頁所會更改的資料,等於替電腦先施打了預防針一樣,讓你的電腦能夠免於這類型攻擊的傷害。

2007/03/07

Windows - 吃掉所有CPU資源的 svchost.exe

[轉貼自網友:醒來聞到咖啡香(Wake up and smell the Coffee)]

svchost.exe 吃掉所有 CPU 資源的原因很多,不過我的狀況都是在執行 Windwos Update 時發生的(或是自動更新服務 Automatic Updates 執行時)。因此解決方法主要就是把 Windows 的自動更新重設一次,步驟如下:

一、首先檢查系統服務的狀態。
1. 點「開始」–>「執行」,輸入「services.msc」後按「確定」。
2. 在服務「Automatic Updates」上點二下。
3. 點選「登入」頁籤,確定登入身分為「本機系統帳戶」且「允許服務與桌面互動」“沒有”被選取。
4. 確認服務已在目前的「硬體設定檔」中被啟用,如果沒有,按下「啟用」按鈕。
5. 點選「一般」頁籤,確定「啟動類型」為「自動」,然後按下「啟動」按鈕以啟動服務。
6. 對「Background Intelligent Transfer Service (BITS) 」服務重覆 2 ~ 5 的步驟。

二、接著重新註冊 Windwos Update 的元件。
1. 點選「開始」–>「執行」。
2. 輸入「REGSVR32 WUAPI.DLL」後按 Enter。
3. 當看到 “DllRegisterServer 在 WUAPI.DLL 成功” 的訊息後按下「確定」。
4. 重覆上述步驟重新註冊下列元件
REGSVR32 WUAUENG.DLL
REGSVR32 WUAUENG1.DLL
REGSVR32 ATL.DLL
REGSVR32 WUCLTUI.DLL
REGSVR32 WUPS.DLL
REGSVR32 WUPS2.DLL
REGSVR32 WUWEB.DLL

三、最後清除可能已損壞了的 Windows Update 暫存目錄。
1. 點「開始」–>「執行」,輸入「cmd」後按「確定」。
2. 在命令提示字元中鍵入以下指令。(若出現錯誤訊息請先重開機後再報執行一次)
net stop WuAuServ
2. 點「開始」–>「執行」,輸入「%windir%」後按「確定」。
3. 找到「SoftwareDistribution」並更名為「SDold」。
4. 點「開始」–>「執行」,輸入「cmd」後按「確定」,並在在命令提示字元中鍵入以下指令。
net start WuAuServ

四、大功告成!

防毒軟體-Active Virus Shield

免費防毒軟體之王 - Active Virus Shield,你可以說他是卡巴斯基免費版,因為他是由 AOL 贊助,採用卡巴斯基核心並技術支援,經過測試,掃毒功力是目前最佳的,可以即時偵測病毒、木馬、間諜程式、廣告程式、撥號程式,並且可以即時透過電 子郵件回報電腦中毒,著名防毒軟體評測網站將其與各共享軟體一起評比,更獲得第二名的殊榮。不過!因為太過嚴謹,相對的會有誤判,建議具有相當電腦基礎的用戶使用。

註:著名防毒軟體評測網站(2006)

show 出 request and session 的變數與值

Enumeration requestEnumer = request.getParameterNames();
while(requestEnumer.hasMoreElements()) {
str1 = (String) requestEnumer.nextElement();
str2 = request.getParameter(str1);
System.out.println(str1+"="+str2);
}

Enumeration sessionEnumer = session.getAttributeNames();
while(sessionEnumer.hasMoreElements()) {
str1 = (String) sessionEnumer.nextElement();
str2 = session.getAttribute(str1).toString();
System.out.println(str1+"="+str2);
}

2007/03/06

安裝 ubuntu-desktop 到 ubuntu-6.10 - LAMP Server

安裝好 ubuntu-6.10 - LAMP Server 之後

1.先設定root密碼
輸入指令:sudo passwd root

2.更新apt-get list
輸入指令:sudo apt-get update

3.安裝GUI介面
輸入指令:sudo apt-get install ubuntu-desktop

NGINX SSL/設定檔案

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #...