聊天室
這個東西在即時通訊系統出現之前
非常流行
是掀起網路人際關係的濫觴
特色在於能立即收到回應
缺點是必須登入指定地點
所以ICQ出來之後,
立刻被打敗了
因為ICQ是裝在自己的電腦上
加上使用者的介面相對親切
並且更加方便
^^^^^^^^^^^^^^^^
只要留給別人即時通地址, 別人想聯絡你時就能聯絡你
不需要約時間在聊天室苦苦等候
做到真正的"即時"通~
最近心血來潮
用JSP想實作一個簡單的聊天室
沒想到越做越多
因為有幾點要考慮:
1.聊天內容存放處: 只是存放在application的一個變數. 吃的是記憶體空間. 所以AP SERVER重開或清掉變數內容的話, 記錄就沒了.
2.重新讀取問題: 若是用post方法, 每次重讀, 瀏覽器都會跳出視窗確認, 很麻煩又關不掉. 用get方法沒有跳出確認視窗問題, 但是之前聊天內容會一直重複增加, 原因是採用window.location.reload(), 導致重複送出帶參數的網址. 解決之道是利用window.location底下的屬性, 拼湊出不含變數的網址. 然後用window.open()取代window.reload()以指定url位址.
3.捲軸位址: 重新讀取畫面時, 捲軸會跑掉. 所以必須要能記得捲軸位址, 重新讀取時恢復上次捲軸位址. 這點用window.onscroll事件和document.body.scrollTop屬性完成.
以下是成品, 內含兩支JSP+1個HTML做窗格(FRAME)
http://goo.gl/QWriQ
2011年7月27日 星期三
原來java的修飾關鍵字是沒有順序的...!!
public class test123{
static final private String s1 = "abc";
private static final String s2 = "def";
public static void main(String args[]){
System.out.println(s1);
System.out.println(s2);
}
}
印出:
abc
def
一直以為java的修飾關鍵字是要照順序的
但是今天才發現
原來是不用的!
修飾關鍵字照順序應該是個習慣
但並不是文法上的要求!!
static final private String s1 = "abc";
private static final String s2 = "def";
public static void main(String args[]){
System.out.println(s1);
System.out.println(s2);
}
}
印出:
abc
def
一直以為java的修飾關鍵字是要照順序的
但是今天才發現
原來是不用的!
修飾關鍵字照順序應該是個習慣
但並不是文法上的要求!!
用jsp確認Server上的jvm版本
我最近用jdk 1.5版本編譯檔案
丟到遠方的AP Server上
可以執行
所以知道這台Server上的jvm版本
必定>=1.5
因為沒有向上相容這件事
舉例而言
也就是1.4無法跑1.5編譯出來的class
否則會出現java.lang.UnsupportedClassVersionError
但是詢問Server管理員
跟我說這台Server上的jvm版本是1.4
這與我的認知衝突
所以到底是幾版呢?
可以用以下jsp驗證
<%@ page import="java.util.*"%>
<%
out.println("The version of current JVM is: " + System.getProperties().getProperty("java.version"));
%>
把這支jsp丟到Server上
得到結果是1.5
證明我是對的...哦ㄝ
這裡是相關討論
丟到遠方的AP Server上
可以執行
所以知道這台Server上的jvm版本
必定>=1.5
因為沒有向上相容這件事
舉例而言
也就是1.4無法跑1.5編譯出來的class
否則會出現java.lang.UnsupportedClassVersionError
但是詢問Server管理員
跟我說這台Server上的jvm版本是1.4
這與我的認知衝突
所以到底是幾版呢?
可以用以下jsp驗證
<%@ page import="java.util.*"%>
<%
out.println("The version of current JVM is: " + System.getProperties().getProperty("java.version"));
%>
把這支jsp丟到Server上
得到結果是1.5
證明我是對的...哦ㄝ
這裡是相關討論
表單上的type=sumbit和type=button的按鈕
表單上有兩個按鈕
一個是<input type=submit />
一個是<input type=button />
這兩個的差別
在於type=submit在預設上
會引發表單的onSubmit事件
而type=button什麼事件都不會發生!
可以看以下例子:
test.html:
<script>
function doChk(){
alert("No way!");
return;
}
function doChk2(){
alert("No send!");
return;
}
</script>
<form action="test1.jsp" onSubmit="doChk2();">
<input type=submit value="Send?" onClick="doChk();" />
</form>
test1.jsp:
<%
out.println("You send....");
%>
在瀏覽器看到的結果是:
跳出視窗:No Way!
跳出視窗:No Send!
新畫面:You send....
所以可以知道幾件事:
1.type=submit的按鈕, 會先觸發按鈕自己的onClick事件, 再觸發表單的onSubmit事件
2.無論onSubmit事件的處理函式如何寫, 最後一定會將表單送出, 無法阻止表單送出的發生
一個是<input type=submit />
一個是<input type=button />
這兩個的差別
在於type=submit在預設上
會引發表單的onSubmit事件
而type=button什麼事件都不會發生!
可以看以下例子:
test.html:
<script>
function doChk(){
alert("No way!");
return;
}
function doChk2(){
alert("No send!");
return;
}
</script>
<form action="test1.jsp" onSubmit="doChk2();">
<input type=submit value="Send?" onClick="doChk();" />
</form>
test1.jsp:
<%
out.println("You send....");
%>
在瀏覽器看到的結果是:
跳出視窗:No Way!
跳出視窗:No Send!
新畫面:You send....
所以可以知道幾件事:
1.type=submit的按鈕, 會先觸發按鈕自己的onClick事件, 再觸發表單的onSubmit事件
2.無論onSubmit事件的處理函式如何寫, 最後一定會將表單送出, 無法阻止表單送出的發生
2011年7月14日 星期四
java版本的向下相容
jre是向下相容的!
這向下相容有兩個面向
1.低版本編譯好的class, 能在高版本直接執行:
你以1.4版編譯好的class
能在1.6版的jre上直接執行, 不需做任何修改
換句話說
所以1.6版的jre能夠直接地
吃下比它低版本的class
2.高版本編譯好的class, 能在低版本執行:
咦?
這樣有下向相容嗎?
在1.6的jdk直接編譯: javac hello.java
這樣你拿去1.4版jre執行
會得到以下結果:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 50.0)
(拿高版本jdk編譯的java去低版本jre執行->當然不行, 因為沒有向上相容這件事)
你必須要加上兩個參數:-source和-target
-source: 要用java幾版, 來檢查程式內容, 是否合乎java文法
-target: 於前項檢查文法ok後, 編譯後產生的class檔將以何種java版本輸出
這裡要特別注意幾點:
a.-target的預設值 = -source的值
例如-source=1.4, 如果不加以設定-target
則此時-target=預設值=1.4
(但-source=1.2或1.3時, -target的值都等於1.4)
b.-target的值必須大於等於-source的值
比如-source=1.4
則-target可以等於1.5
若-target=1.3
執行javac後將會得到以下結果
javac: source release 1.4 requires target release 1.4
為-target做個實驗
用jdk 1.6寫一個簡單的java
執行:javac test.java
再拿到jre 1.4上去執行
結果是:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 50.0)
若執行的是:javac test.java -target 1.5
再拿到jre 1.4上去執行
結果是:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 49.0)
可以觀察到-target的值不同,
所產生出來的class檔的版本真的不一樣
這裡有個疑問
會有需要將-source和-target設定成不一樣的時候嗎
例如javac hello.java -source 1.4 -target 1.5
答案是, 需要視你要佈署的環境而定
舉個例子你本機是高版本的1.6
欲佈署在遠方的機器是低版本的1.5
然後你程式碼中有用到1.4才提供的功能
這個時候就相當適合使用:javac hello.java -source 1.4 -target 1.5
但記得前面我提過
高版本的jre能直接吃下低版本的class
所以, 結論是
你使用javac hello.java -source 1.4 -target 1.5最完美
但使用javac hello.java -source 1.4 -target 1.4也沒差, 是相同意思
可是使用javac hello.java -source 1.4 -target 1.3 <-錯誤!
因為-target的值必須大於等於-source的值
最後
提醒大家
雖然
高版本的jre能直接吃下低版本的class
但是程式總有需要修改的時候
所以在修改以前的程式後
有必要重新編譯時
必須要注要你所使用的 -source值
請看下面兩張圖, 分別是j2se1.4和j2se 5的api
其中String這個類別的api
圖一 j2se1.4的String API
圖二 j2se1.5的String API
可以注意到從1.4跨到1.5之後
本來在1.4中的方法compareTo(Object o)
已經消失了....也就是1.5把這個方法取消
可以寫個簡單類別來測試:
public class test{
public static void main(String[] args){
String a = "p";
Object b = new String("p");
if(a.compareTo(b)==0){
System.out.println("They are equal!");
}
}
}
執行指令如下,
可以看到用-source 1.4編譯沒有錯誤
若用-source 1.5就會說你應該參數用String而不是Object
參照圖二, 就可以知道這是因為, j2se 1.5中已刪除 compareTo(Object o)的關係
C:\jpractice>javac test.java -source 1.4
C:\jpractice>javac test.java -source 1.5
test.java:5: compareTo(java.lang.String) in java.lang.String cannot be applied t
o (java.lang.Object)
if(a.compareTo(b)==0){
^
1 error
C:\jpractice>
編譯的時候
要注意使用哪個版本的java來檢查程式文法
但是只要一編譯好
以上例而言
以javac test.java -source 1.4編譯完成
拿到jre 1.6去執行時
雖然test.java裡使用了1.4版才有的String.compareTo()功能
但是因為高版本的jre能直接吃下低版本的class
所以能執行執行沒有問題
只不過編譯時要比較麻煩
加個-source參數
當然你應該不會想替專案裡的少數幾支java特別加上-source參數
專案裡所有的程式應該都是以同樣版本的java去編譯的
這樣才好維護
所以有發現有使用到已被高版本取消的方法時
還是趁早修改比較理想
這向下相容有兩個面向
1.低版本編譯好的class, 能在高版本直接執行:
你以1.4版編譯好的class
能在1.6版的jre上直接執行, 不需做任何修改
換句話說
所以1.6版的jre能夠直接地
吃下比它低版本的class
2.高版本編譯好的class, 能在低版本執行:
咦?
這樣有下向相容嗎?
在1.6的jdk直接編譯: javac hello.java
這樣你拿去1.4版jre執行
會得到以下結果:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 50.0)
(拿高版本jdk編譯的java去低版本jre執行->當然不行, 因為沒有向上相容這件事)
你必須要加上兩個參數:-source和-target
-source: 要用java幾版, 來檢查程式內容, 是否合乎java文法
-target: 於前項檢查文法ok後, 編譯後產生的class檔將以何種java版本輸出
這裡要特別注意幾點:
a.-target的預設值 = -source的值
例如-source=1.4, 如果不加以設定-target
則此時-target=預設值=1.4
(但-source=1.2或1.3時, -target的值都等於1.4)
b.-target的值必須大於等於-source的值
比如-source=1.4
則-target可以等於1.5
若-target=1.3
執行javac後將會得到以下結果
javac: source release 1.4 requires target release 1.4
為-target做個實驗
用jdk 1.6寫一個簡單的java
執行:javac test.java
再拿到jre 1.4上去執行
結果是:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 50.0)
若執行的是:javac test.java -target 1.5
再拿到jre 1.4上去執行
結果是:
Exception in thread "main" java.lang.UnsupportedClassVersionError: test (Unsuppo
rted major.minor version 49.0)
可以觀察到-target的值不同,
所產生出來的class檔的版本真的不一樣
這裡有個疑問
會有需要將-source和-target設定成不一樣的時候嗎
例如javac hello.java -source 1.4 -target 1.5
答案是, 需要視你要佈署的環境而定
舉個例子你本機是高版本的1.6
欲佈署在遠方的機器是低版本的1.5
然後你程式碼中有用到1.4才提供的功能
這個時候就相當適合使用:javac hello.java -source 1.4 -target 1.5
但記得前面我提過
高版本的jre能直接吃下低版本的class
所以, 結論是
你使用javac hello.java -source 1.4 -target 1.5最完美
但使用javac hello.java -source 1.4 -target 1.4也沒差, 是相同意思
可是使用javac hello.java -source 1.4 -target 1.3 <-錯誤!
因為-target的值必須大於等於-source的值
最後
提醒大家
雖然
高版本的jre能直接吃下低版本的class
但是程式總有需要修改的時候
所以在修改以前的程式後
有必要重新編譯時
必須要注要你所使用的 -source值
請看下面兩張圖, 分別是j2se1.4和j2se 5的api
其中String這個類別的api
圖一 j2se1.4的String API
圖二 j2se1.5的String API
可以注意到從1.4跨到1.5之後
本來在1.4中的方法compareTo(Object o)
已經消失了....也就是1.5把這個方法取消
可以寫個簡單類別來測試:
public class test{
public static void main(String[] args){
String a = "p";
Object b = new String("p");
if(a.compareTo(b)==0){
System.out.println("They are equal!");
}
}
}
執行指令如下,
可以看到用-source 1.4編譯沒有錯誤
若用-source 1.5就會說你應該參數用String而不是Object
參照圖二, 就可以知道這是因為, j2se 1.5中已刪除 compareTo(Object o)的關係
C:\jpractice>javac test.java -source 1.4
C:\jpractice>javac test.java -source 1.5
test.java:5: compareTo(java.lang.String) in java.lang.String cannot be applied t
o (java.lang.Object)
if(a.compareTo(b)==0){
^
1 error
C:\jpractice>
編譯的時候
要注意使用哪個版本的java來檢查程式文法
但是只要一編譯好
以上例而言
以javac test.java -source 1.4編譯完成
拿到jre 1.6去執行時
雖然test.java裡使用了1.4版才有的String.compareTo()功能
但是因為高版本的jre能直接吃下低版本的class
所以能執行執行沒有問題
只不過編譯時要比較麻煩
加個-source參數
當然你應該不會想替專案裡的少數幾支java特別加上-source參數
專案裡所有的程式應該都是以同樣版本的java去編譯的
這樣才好維護
所以有發現有使用到已被高版本取消的方法時
還是趁早修改比較理想
2011年7月5日 星期二
jquery選擇器的問題
選擇html畫面上的dom物件進行操作
以往都是要用getElementById(), getElementsByName()等來操作
但有了jquery之後
使用他的選擇器
就可以方便地選取畫面上的元件了
選擇器長這樣: $()
一個錢字號, 後面帶一個小括號
詳細用法可以參考這裡
今天碰上一個jquery選擇器的問題
選取所有input標籤, 其name屬性為test, 且被選取(checked)的元件.
乍看之下沒問題
問題是我程式裡本來是這樣寫的
以往都是要用getElementById(), getElementsByName()等來操作
但有了jquery之後
使用他的選擇器
就可以方便地選取畫面上的元件了
選擇器長這樣: $()
一個錢字號, 後面帶一個小括號
詳細用法可以參考這裡
今天碰上一個jquery選擇器的問題
$('input[name=test]:checked').each(function() {//處理的程式碼});
上面這個意思是說選取所有input標籤, 其name屬性為test, 且被選取(checked)的元件.
然後逐一將這些元件, 交付function(){//處理的程式碼}去處理
乍看之下沒問題
問題是我程式裡本來是這樣寫的
$('input[name=test][checked]).each(function() {//處理的程式碼});
他用[], 而不是:
妙的是, 經過測試,
這樣的句子在IE8較低版本(我同事的電腦, IE8版本< 8.0.7601.17514, 確切版本數記不住)可以選到東西
但在較高版本(我的電腦, IE8版本8.0.7601.17514)卻連個鬼都選不到
WHY?
本來我對jquery的處理器雖有概念
但對語法並不熟悉
看了這一頁後,
恍然大悟可能是出在[checked]的關係
應該改為:checked才對
修改後果真可以在IE8版本8.0.7601.17514運行
結論:
要選擇被選取的元件
要用冒號:checked
而不是中括弧[checked]
但無法解是為何在較低版本的IE8,
中括弧[checked]也可以運行??
關於:checked的用法
亦可參考這裡
eclipse無法建置?
今天替專案加了旗標flag
為了觀察程式執行的流程與參數值
加了旗標就是改了程式
所以要重新編譯
疑?
為什麼選擇專案->建置專案
看起來是順利完成
可是跑去專案的classes資料夾一看
都還是舊的東西
一氣之下選擇專案->清除
打算乾脆全部都重新建置算了
沒想到連一個class都沒編譯出來
情況更糟.....
我後來知道原因了!
那是因為該專案的建置路徑裡
我本來有加一些外部jar

(
為什麼我知道紅色驚嘆號的意義?
答:從eclipse documentation中查到的, 如下
)
將這些已經移除的外部jar
從建置路徑中移除
則紅色驚嘆號就會消失
再選擇一次專案->建置專案
已經可以的classes資料夾看到編譯後的.class檔了
總結:
eclipse中, 只要專案建置路徑有一個錯誤, 就無法再建置任何東西!
20110728補充:
今天幫同事測專案時
專案裡面會用到spring+hibernate
然後hibernate所需連線
會寫在一個設定檔裡面
專案啟動時
spring會根據此設定檔內容
去讀取db相關設定
然後試著去new出一個org.springframework.jdbc.datasource.DriverManagerDataSource
但是此設定檔帳號密碼設定錯誤
所以拋出Exception
然後此專案就"起不來"
AP Server(在此例中是Tomcat)會跳過此一專案
繼續啟動其他專案...
所以
除了建置路徑中有不存在的jar, 會導致專案啟動失敗外
如果建置中有任何Exception,
或是任何錯誤
都會導致專案怎樣都無法啟動
為了觀察程式執行的流程與參數值
加了旗標就是改了程式
所以要重新編譯
疑?
為什麼選擇專案->建置專案
看起來是順利完成
可是跑去專案的classes資料夾一看
都還是舊的東西
一氣之下選擇專案->清除
打算乾脆全部都重新建置算了
沒想到連一個class都沒編譯出來
情況更糟.....
我後來知道原因了!
那是因為該專案的建置路徑裡
我本來有加一些外部jar
可是這些外部jar後來被我移除所以專案就無法參考到
而會一直出現紅色驚嘆號

(
為什麼我知道紅色驚嘆號的意義?
答:從eclipse documentation中查到的, 如下
)
將這些已經移除的外部jar
從建置路徑中移除
則紅色驚嘆號就會消失
再選擇一次專案->建置專案
已經可以的classes資料夾看到編譯後的.class檔了
總結:
eclipse中, 只要專案建置路徑有一個錯誤, 就無法再建置任何東西!
20110728補充:
今天幫同事測專案時
專案裡面會用到spring+hibernate
然後hibernate所需連線
會寫在一個設定檔裡面
專案啟動時
spring會根據此設定檔內容
去讀取db相關設定
然後試著去new出一個org.springframework.jdbc.datasource.DriverManagerDataSource
但是此設定檔帳號密碼設定錯誤
所以拋出Exception
然後此專案就"起不來"
AP Server(在此例中是Tomcat)會跳過此一專案
繼續啟動其他專案...
所以
除了建置路徑中有不存在的jar, 會導致專案啟動失敗外
如果建置中有任何Exception,
或是任何錯誤
都會導致專案怎樣都無法啟動
eclipse裡icon的意義
eclipse是一個好用IDE的工具
可以拿來開發JAVA, C++, PHP等
IDE工具就是視覺化的工具
但是上面有很多ICON,
不知道是什麼意思.....??
看看這份eclipse documentation吧
可以拿來開發JAVA, C++, PHP等
IDE工具就是視覺化的工具
但是上面有很多ICON,
不知道是什麼意思.....??
看看這份eclipse documentation吧
2011年7月3日 星期日
2011年6月30日 星期四
辨識SQL SERVER版本
我不清楚連的SQL Server版本
所以我在SSMS上
選擇連線的Server
按右鍵選擇屬性
出現了下圖的伺服器屬性畫面
上圖看到版本的屬性
其值是9.00.4035.00
阿咧~這是三小朋友
本來預期會看到SQL Server 2005 SP3這樣的東西
結果看到這一串數字
反而覺得更疑惑??????
搜尋到微軟的這一篇文章
哈哈~所有問題都解決啦!!
所以我在SSMS上
選擇連線的Server
按右鍵選擇屬性
出現了下圖的伺服器屬性畫面
上圖看到版本的屬性
其值是9.00.4035.00
阿咧~這是三小朋友
本來預期會看到SQL Server 2005 SP3這樣的東西
結果看到這一串數字
反而覺得更疑惑??????
搜尋到微軟的這一篇文章
哈哈~所有問題都解決啦!!
以INSERT INTO方式匯出資料
看同事寄的文稿裡面
有一個.sql檔案
裡面以INSERT INTO TABLE VALUES
的方式把TABLE備分起來
這引起了我的興趣
因為據我所知
SQL SERVER 2008 Management Studio並沒有這樣功能
他頂多只能匯出該TABLE的SCHEMA, 如下圖
然後目前我知道最新版的SQL SERVER是2008 R2
據說是2010.04開始開放下載Express版本
SQL SERVER 2005, SQL SERVER 2008, SQL SERVER 2008 R2 都有Express版本
然後Express版本還可以分為 Express with Tools 與 Express Advanced Services版本
所謂Express(快捷版)就是不用錢
with Tools就是把SSMS(SQL Server Management Studio)也包在裡面
Advanced Services又比with Tools包含一些報告的功能??
據我所知2008和2008 R2才有出with Tools版本
Express版本讓一般程式學習使用者
或者想先試試產品功能的人
能夠免費取得並試用產品
其內容跟正式版大致一樣
不過功能少了一些
對於機器的支援也較有限制
比如支援CPU有幾顆
記憶體多大等....
唉呀參考一下維基百科吧!
題外話扯多了
今天要講DB備份的方式
對於SQL Server而言
以前都是用SQL Server匯入和匯出精靈
來幫我從.txt檔(以適當的delimiter(定義符號)分開欄位, 如逗號或空白字元)
匯入資料到TABLE
或從TABLE匯出資料到.txt檔
所以看到這樣用INSERT語法完成的備份檔
覺得很新奇也很好用
搜尋了一下
主要有三種方式可以達成以INSERT句子
完成備份資料表的資料
1.Toad for SQL Server
2.一個外國人寫好的神奇SP(預存程序)
3.一個小小的軟體SQL Server Dumper 參考點2
我是利用SQL Server Dumper做的
該軟體所佔空間很小
畫面又相當直覺
算是相當好上手的軟體!!
有一個.sql檔案
裡面以INSERT INTO TABLE VALUES
的方式把TABLE備分起來
這引起了我的興趣
因為據我所知
SQL SERVER 2008 Management Studio並沒有這樣功能
他頂多只能匯出該TABLE的SCHEMA, 如下圖
然後目前我知道最新版的SQL SERVER是2008 R2
據說是2010.04開始開放下載Express版本
SQL SERVER 2005, SQL SERVER 2008, SQL SERVER 2008 R2 都有Express版本
然後Express版本還可以分為 Express with Tools 與 Express Advanced Services版本
所謂Express(快捷版)就是不用錢
with Tools就是把SSMS(SQL Server Management Studio)也包在裡面
Advanced Services又比with Tools包含一些報告的功能??
據我所知2008和2008 R2才有出with Tools版本
Express版本讓一般程式學習使用者
或者想先試試產品功能的人
能夠免費取得並試用產品
其內容跟正式版大致一樣
不過功能少了一些
對於機器的支援也較有限制
比如支援CPU有幾顆
記憶體多大等....
唉呀參考一下維基百科吧!
題外話扯多了
今天要講DB備份的方式
對於SQL Server而言
以前都是用SQL Server匯入和匯出精靈
來幫我從.txt檔(以適當的delimiter(定義符號)分開欄位, 如逗號或空白字元)
匯入資料到TABLE
或從TABLE匯出資料到.txt檔
所以看到這樣用INSERT語法完成的備份檔
覺得很新奇也很好用
搜尋了一下
主要有三種方式可以達成以INSERT句子
完成備份資料表的資料
1.Toad for SQL Server
2.一個外國人寫好的神奇SP(預存程序)
3.一個小小的軟體SQL Server Dumper 參考點2
我是利用SQL Server Dumper做的
該軟體所佔空間很小
畫面又相當直覺
算是相當好上手的軟體!!
2011年6月29日 星期三
INSERT多筆資料
INSERT INTO SAMPLE_TABLE
VALUES('AMY','TAIPEI'),('JOHN','NEW YORK')
上面的語法可以新增多筆資料
之前公司用IBM DB2可以執行無誤
可是在SQL SERVER 2005上始終都無法執行
查了資料1和資料2
原來要一直到SQL SERVER 2008才有支援......
圖 MSDN文件庫中, SQL SERVER 2005與2008的INSERT語法差異
所以
如果無法用最上面的語法
新增多筆資料
那麼你有兩種選擇:
1.用INSERT新增一筆, 然後好幾次
2.用INSERT INTO SELECT FROM UNION SELECT FROM UNION....方法
詳情請參考這裡囉
VALUES('AMY','TAIPEI'),('JOHN','NEW YORK')
上面的語法可以新增多筆資料
之前公司用IBM DB2可以執行無誤
可是在SQL SERVER 2005上始終都無法執行
查了資料1和資料2
原來要一直到SQL SERVER 2008才有支援......
圖 MSDN文件庫中, SQL SERVER 2005與2008的INSERT語法差異
所以
如果無法用最上面的語法
新增多筆資料
那麼你有兩種選擇:
1.用INSERT新增一筆, 然後好幾次
2.用INSERT INTO SELECT FROM UNION SELECT FROM UNION....方法
詳情請參考這裡囉
Oracle SQL Loader
有個需求要把Excel裡的東西
匯到Oracle裡面的資料表
以前在操作IBM DB2時
要先把.xls轉換成.csv或.txt
然後下import指令
詳細內容忘記了
大概是: import from 'unit_contrast.txt' of del replace into UNIT_CONTRAST
這樣一行就可以搞定
可是換到Oracle
變得稍為複雜的一些
必須將命令寫近文稿裡
然後執行此文稿
unit_contrast.ctl :
load data
infile "unit_contrast.txt"
badfile "bad.log"
discardfile "discard.log"
into table unit_contrast
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
( unit_id ,
unit_name
)
然後用TOAD的SQL Loader Wizard選擇此控制檔
或者在命令列底下執行:
sqlldr 帳號/密碼 control=unit_contrast.ctl
參考網站:
網站1
網站2
網站3
匯到Oracle裡面的資料表
以前在操作IBM DB2時
要先把.xls轉換成.csv或.txt
然後下import指令
詳細內容忘記了
大概是: import from 'unit_contrast.txt' of del replace into UNIT_CONTRAST
這樣一行就可以搞定
可是換到Oracle
變得稍為複雜的一些
必須將命令寫近文稿裡
然後執行此文稿
unit_contrast.ctl :
load data
infile "unit_contrast.txt"
badfile "bad.log"
discardfile "discard.log"
into table unit_contrast
fields terminated by ',' optionally enclosed by '"'
trailing nullcols
( unit_id ,
unit_name
)
然後用TOAD的SQL Loader Wizard選擇此控制檔
或者在命令列底下執行:
sqlldr 帳號/密碼 control=unit_contrast.ctl
參考網站:
網站1
網站2
網站3
2011年6月28日 星期二
java的數字
一.
System.out.println(1-0.8);
上一句的輸出是:
0.19999999999999996
前公司業務跟錢有關
所以在處理小數有關的東西
一律都是用BigDecimal類別
System.out.println((new BigDecimal("1").subtract(new BigDecimal("0.8"))));
上一句的輸出是:
0.2
二.
System.out.println(365*(1+1000000000000000));
上一句的輸出是:
integer number too large: 1000000000000000
要解決這個問題很簡單
只要加個L就解決了
System.out.println(365*(1+1000000000000000L));
這其中的奧妙
就在於JAVA
作四則運算時
會把運算子旁邊的兩個運算元
都提升到較大運算元的型別後
再開始計算
這個叫作Promotion
(
註:Promotion指由小型別換到大型別
這會自動發生
而Cast則指由大型別換到小型別
這就要由程式員特別指定
還有
JAVA基本型別的大小
可以參這篇文章
byte<short<int<long<float<double
浮點數型別的double和float都比整數型別的long還要大
這是因為這float和double
主要用來儲存小數數值,也可以用來儲存範圍更大的整數
)
以本例而言
1+1000000000000000L
在JAVA中所有整數都預設為int
而所有小數都預設為double
但是加了個L
就把該整數提升為long型別
所以
1000000000000000先變成了long
->1+1000000000000000L = int + long = long + long = long
接著365*long = int * long = long * long = long = 365000000000000365
轉成long型別後就能裝下 365000000000000365 這麼大的數字了
System.out.println(1-0.8);
上一句的輸出是:
0.19999999999999996
前公司業務跟錢有關
所以在處理小數有關的東西
一律都是用BigDecimal類別
System.out.println((new BigDecimal("1").subtract(new BigDecimal("0.8"))));
上一句的輸出是:
0.2
二.
System.out.println(365*(1+1000000000000000));
上一句的輸出是:
integer number too large: 1000000000000000
要解決這個問題很簡單
只要加個L就解決了
System.out.println(365*(1+1000000000000000L));
這其中的奧妙
就在於JAVA
作四則運算時
會把運算子旁邊的兩個運算元
都提升到較大運算元的型別後
再開始計算
這個叫作Promotion
(
註:Promotion指由小型別換到大型別
這會自動發生
而Cast則指由大型別換到小型別
這就要由程式員特別指定
還有
JAVA基本型別的大小
可以參這篇文章
byte<short<int<long<float<double
浮點數型別的double和float都比整數型別的long還要大
這是因為這float和double
主要用來儲存小數數值,也可以用來儲存範圍更大的整數
)
以本例而言
1+1000000000000000L
在JAVA中所有整數都預設為int
而所有小數都預設為double
但是加了個L
就把該整數提升為long型別
所以
1000000000000000先變成了long
->1+1000000000000000L = int + long = long + long = long
接著365*long = int * long = long * long = long = 365000000000000365
轉成long型別後就能裝下 365000000000000365 這麼大的數字了
2011年6月27日 星期一
2011年6月23日 星期四
心得:測試時, 還是選同樣的Web Container測試吧
有中文亂碼問題
在Tomcat上測試可以的程式碼
佈署到WebSphere就是不行....
為什麼不行?
答:我也不知道...
可能原因很多
跟web container如何實作有關
或者跟server所用的作業系統也有關...
目的是要能在最終機台上正常顯示
所以要測試時
請盡可能找和最終機台環境最相似的測試環境
進行測試
才能確保測試結果萬無一失!
在Tomcat上測試可以的程式碼
佈署到WebSphere就是不行....
為什麼不行?
答:我也不知道...
可能原因很多
跟web container如何實作有關
或者跟server所用的作業系統也有關...
目的是要能在最終機台上正常顯示
所以要測試時
請盡可能找和最終機台環境最相似的測試環境
進行測試
才能確保測試結果萬無一失!
sql server 2005 management studio express沒有匯出匯入精靈
sql server 2005 management studio express沒有匯出匯入精靈
sql server 2008 management studio express才有
如下圖
在資料庫按右鍵->工作->匯入資料/匯出資料
sql server 2008 management studio express才有
如下圖
在資料庫按右鍵->工作->匯入資料/匯出資料
java io的flush
舉凡使用java做io時
必須要使用flush()
才能將資料輸出到輸出裝置
輸出裝置可能是: 螢幕或檔案等...
以下這個範例
FileWriter要寫出一個String
但是十秒後才會flush
所以執行時
你會看到先建立sample.txt
但是打開一看
裡面空無一物
過了十秒後
再次打開sample.txt
會發現裡面多了一行Today is a good day
import java.io.*;
import java.util.*;
public class Test_IO{
public static void main(String args[]){
try{
String content= "Today is a good day.";
FileWriter fo = new FileWriter("sample.txt");
fo.write(content);
long curr = System.currentTimeMillis();
while(true){
long result = System.currentTimeMillis()-curr;
if(result/10000 == 1){
//10秒後flush
fo.flush();
System.out.println("Flushed!");
break;
}
}
fo.close();
}catch(Exception e){
e.printStackTrace();
}
}//end main
}//end class
你或許會問
常常用的System.out.println()
也是個io輸出
為什麼不用打System.out.flush()
就可以直接看到結果
這是因為有些io類可以設定auto flush(自動)
System的out是個PrintStrem物件
在api說明中有寫道:
Optionally, a
所以上完廁所
如果沒有自動沖水裝置
別忘了要自己手動沖水(flush!)
必須要使用flush()
才能將資料輸出到輸出裝置
輸出裝置可能是: 螢幕或檔案等...
以下這個範例
FileWriter要寫出一個String
但是十秒後才會flush
所以執行時
你會看到先建立sample.txt
但是打開一看
裡面空無一物
過了十秒後
再次打開sample.txt
會發現裡面多了一行Today is a good day
import java.io.*;
import java.util.*;
public class Test_IO{
public static void main(String args[]){
try{
String content= "Today is a good day.";
FileWriter fo = new FileWriter("sample.txt");
fo.write(content);
long curr = System.currentTimeMillis();
while(true){
long result = System.currentTimeMillis()-curr;
if(result/10000 == 1){
//10秒後flush
fo.flush();
System.out.println("Flushed!");
break;
}
}
fo.close();
}catch(Exception e){
e.printStackTrace();
}
}//end main
}//end class
你或許會問
常常用的System.out.println()
也是個io輸出
為什麼不用打System.out.flush()
就可以直接看到結果
這是因為有些io類可以設定auto flush(自動)
System的out是個PrintStrem物件
在api說明中有寫道:
Optionally, a
PrintStream can be created so as to flush automatically; this means that the flush method is automatically invoked after a byte array is written, one of the println methods is invoked, or a newline character or byte ('\n') is written. 所以上完廁所
如果沒有自動沖水裝置
別忘了要自己手動沖水(flush!)
2011年6月22日 星期三
測試時的怪事
利用ECLIPSE當IDE
TOMCAT當WEB CONTAINER
要在本機測試一個JSP網頁是否正常
用FIRE FOX去連
怎樣就是會出錯
而且我有再該JSP裡插旗子
照理說旗子應該會顯示
可就是沒有
然後改用IE去連
好一點會出現旗子了
可是還是無法正常登入
然後我沒有做任何事
再用IE連一次
就正常
接著用FIRE FOX連
也是正常
WHY?
我什麼事都沒做
就自己好了??
這樣的例子我遇過四, 五次了
明明看起來就對
可是出來結果就不是這樣
最後一樣沒做任何事
他就自己好了....
怪事
我想這應該是
在ECLIPSE裡
去建立一個WEB CONTAINER執行環境
才會碰到的問題
TOMCAT當WEB CONTAINER
要在本機測試一個JSP網頁是否正常
用FIRE FOX去連
怎樣就是會出錯
而且我有再該JSP裡插旗子
照理說旗子應該會顯示
可就是沒有
然後改用IE去連
好一點會出現旗子了
可是還是無法正常登入
然後我沒有做任何事
再用IE連一次
就正常
接著用FIRE FOX連
也是正常
WHY?
我什麼事都沒做
就自己好了??
這樣的例子我遇過四, 五次了
明明看起來就對
可是出來結果就不是這樣
最後一樣沒做任何事
他就自己好了....
怪事
我想這應該是
在ECLIPSE裡
去建立一個WEB CONTAINER執行環境
才會碰到的問題
2011年6月21日 星期二
base64
什麼是base64 <-我一直很疑惑
今天上網查了一下
有以下幾點
1.是一種編碼方式. 將輸入的字串或位元, 以3個bytes換成4個6bits方式編碼.
編譯成純文字的碼. 會叫base64, 是因為編碼結果只會有a-z, A-Z, 0-9外加兩個字元.
編譯出的每一個代碼, 只會在這64個字元裡面, 故名base64.(以上是我猜的...)
編碼詳情可以上google或維基百科查詢.
例如:I am a good man.
以base64編碼方式加以編碼後的結果:SSBhbSBhIGdvb2QgbWFuLg==
2.因為是一種編碼方式, 所以多少有加密的功能. 可是這種加密不安全, 只能防君子. 因為不是很安全地加密, 所以編碼速度很快.
3.為什麼會有base64的出生?..........是因為有些網路傳輸協定, 只允許以ASCII當做內文, 來傳遞資料. 如果你有個檔案, 比如說美女照片, 想要用電子郵件寄給別人, 那就是走SMTP協定, 此協定只能用ASCII來傳遞, 所以必須先將該照片的位元組, 例如010101010100101010101....編碼成純文字, 變成:AAaGBdGHE130.....這是舉例. 才能用SMTP傳出去.
4.網路上有提供base64編碼與解碼的網站
5.那麼HTTP也是純文字傳遞嗎? 我以前都認為是, 可後來看到這篇文章, 才知道原來HTTP也可直接傳位元組哩~所以在http上傳檔, 不一定非得先將二進位檔進行base64編碼才行. 但如果情況是, 你利用http傳給別人一份xml文件, 且想要在該份xml文件中, "夾帶"檔案, 就非得先將檔案以base64編碼後, 再將編碼後的結果, 貼到xml文件裡. 比如以下xml文件:
<傳送資料>
<檔案內容>
PGgxPrS/pHCzvaxPpGqr0630sNUhPC9oMT4=
</檔案內容>
</傳送資料>
6.經過base64編碼後, 輸出的東西會比輸入的東西大上35%, 約莫三分之一左右. 這也是為什麼, 你要記東西給別人, 上傳6MB但上傳完卻顯示為8MB. 會稍微大一點.
總結:base64是一種編碼方式, 可以將二進位或文字資料, 轉變成文字的資料.(你或許會疑惑, 將文字資料轉成文字資料? 沒有錯, 看看維基百科的例子, Man編碼後, 會變成TWFu. 他本來就是文字, 本來就可以用SMTP等協定傳輸, 編碼後只是變成另一個文字. 答:可以做點不是很安全的加密功能囉, 例如這個網站舉例你要傳情書的話...起碼被情敵攔截會看不懂..). base64的編碼原理不複雜, 所以編碼速度快, 安全性低. base64的誕生是為了在純文字協定(如SMTP)下, 仍能傳輸檔案(如一個美女照片, 就說是Hebe好了, 如何?)
今天上網查了一下
有以下幾點
1.是一種編碼方式. 將輸入的字串或位元, 以3個bytes換成4個6bits方式編碼.
編譯成純文字的碼. 會叫base64, 是因為編碼結果只會有a-z, A-Z, 0-9外加兩個字元.
編譯出的每一個代碼, 只會在這64個字元裡面, 故名base64.(以上是我猜的...)
編碼詳情可以上google或維基百科查詢.
例如:I am a good man.
以base64編碼方式加以編碼後的結果:SSBhbSBhIGdvb2QgbWFuLg==
2.因為是一種編碼方式, 所以多少有加密的功能. 可是這種加密不安全, 只能防君子. 因為不是很安全地加密, 所以編碼速度很快.
3.為什麼會有base64的出生?..........是因為有些網路傳輸協定, 只允許以ASCII當做內文, 來傳遞資料. 如果你有個檔案, 比如說美女照片, 想要用電子郵件寄給別人, 那就是走SMTP協定, 此協定只能用ASCII來傳遞, 所以必須先將該照片的位元組, 例如010101010100101010101....編碼成純文字, 變成:AAaGBdGHE130.....這是舉例. 才能用SMTP傳出去.
4.網路上有提供base64編碼與解碼的網站
5.那麼HTTP也是純文字傳遞嗎? 我以前都認為是, 可後來看到這篇文章, 才知道原來HTTP也可直接傳位元組哩~所以在http上傳檔, 不一定非得先將二進位檔進行base64編碼才行. 但如果情況是, 你利用http傳給別人一份xml文件, 且想要在該份xml文件中, "夾帶"檔案, 就非得先將檔案以base64編碼後, 再將編碼後的結果, 貼到xml文件裡. 比如以下xml文件:
<傳送資料>
<檔案內容>
PGgxPrS/pHCzvaxPpGqr0630sNUhPC9oMT4=
</檔案內容>
</傳送資料>
6.經過base64編碼後, 輸出的東西會比輸入的東西大上35%, 約莫三分之一左右. 這也是為什麼, 你要記東西給別人, 上傳6MB但上傳完卻顯示為8MB. 會稍微大一點.
總結:base64是一種編碼方式, 可以將二進位或文字資料, 轉變成文字的資料.(你或許會疑惑, 將文字資料轉成文字資料? 沒有錯, 看看維基百科的例子, Man編碼後, 會變成TWFu. 他本來就是文字, 本來就可以用SMTP等協定傳輸, 編碼後只是變成另一個文字. 答:可以做點不是很安全的加密功能囉, 例如這個網站舉例你要傳情書的話...起碼被情敵攔截會看不懂..). base64的編碼原理不複雜, 所以編碼速度快, 安全性低. base64的誕生是為了在純文字協定(如SMTP)下, 仍能傳輸檔案(如一個美女照片, 就說是Hebe好了, 如何?)
訂閱:
文章 (Atom)




