java.sql.Date v.s. java.sql.Timestamp in Oracle 9i

我們都知道 JDBC 中 java.sql.Date 與 java.sql.Timestamp 的差異在於java.sql.Date 是不包含時間的部分

而最近在工作上碰到一個問題…
程式使用

Oracle 9i JDBC thin driver
Jakarta commons DBCP
Jakarta commons DBUtils

等元件進行資料庫的存取..
而使用的資料庫版本為 Oracle9i Enterprise Edition Release 9.2.0.7.0 – 64bit Production

如果撈取 Oracle 資料型態為 DATE 的欄位時,我希望撈出例如 2007/01/24 13:14: 20格式的資料(用 sqlplus 撈出來是有 時間 部分的)
但抓到的資料卻只有 2007/01/24 ,也就是說 時間 的部分不見了

查了很久的問題,加上股溝大神的協助,終於發現原因…
可以參考這個網址

http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.htm#08_01

What is going on with DATE and TIMESTAMP?

原來 Oracle 在 9.2 版以前,資料庫資料型態只有 DATE (含有日期與時間),
而 JDBC 9.2 版以前的 drvier 查完資料 mapping 回來會是 java.sql.Timestamp,所以查出來的資料會是包含日期與時間的值

但 Oracle 9.2 後,資料庫資料型態除了 DATE ,還新增了 TIMESTAMP 型態
如果 table schema 建立時使用 DATE 型態建立 (雖然是 DATE , 但是實際上日期時間也都會保留在欄位裡, 用 sqlplus 可以驗證)
但 9.2 版以後的 jdbc driver 查完資料 DATE 型態 mapping 回來會是 java.sql.Date, 而不是 java.sql.Timestamp
所以自然程式取出來的時間部分就不見了

除非 table schema 建立時,欄位型態就是 TIMESTAMP,那麼 jdbc driver 就會幫你轉回 java.sql.Timestamp
但這種情形太少了,原有的 table 我們大部分都是用 DATE 去建立欄位的…

在上述網址中提到四個解法中,

1. 建議我們建立 table 時就要使用 TIMESTAMP,這是最標準的作法
但這不可能,因為目前 table 已經建立了
因此以後如要建立新的 Table , 時間欄位型態請記得改用 TIMESTAMP.

2. 與 3 在如果搭配 DBCP 與 DBUtils 元件的情況下,我們也無法介入調整 (因為根本碰不到 JDBC ResultSet)

4. 方式最簡單,定義一個系統變數 -Doracle.jdbc.V8Compatibility=”true” 即可,看來最快也最簡單,但經我測試的結果,撈出來的資料值會是類似下面降子

2007/01/24 00:00: 00

也就是說,雖然時間的部分出現了,但是值還是 00:00:00 ,所以還是沒用

最後我直接把 JDBC Driver downgrade 到 8.1.7 版,雖然使用舊版,但 DATE 型態就會正確的轉回 java.sql.Timestamp

ps. 需注意的是用 8.1.7 的 jdbc driver 來連 Oracle 9i , Oracle 官方說法是必須需上一個 patch 後才不會有問題
雖然我沒上 patch 也是正常…@@

ROME: RSS/ATOM Java Utilities.

昨天用 RSS4j 替相簿產生了 RSS Feed 後,再仔細研究下去才發現 RSS4j 目前只支援 RSS 0.90/0.91/1.0,
並不支援最新的 RSS 2.0 與 Google 的ATOM 0.3/1.0,於是又找了另一個 RSS java library : ROME

ROME 目前支援的 RSS 版本相當齊全,列舉如下:

RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, and Atom 1.0

所以用 ROME 來製作各種格式的 RSS Feed 當然不是問題,甚至可以用來做各種格式間的轉換,功能相當強大。
於是我就利用 ROME 的 API ,稍微包裝一下後,弄了一個簡單使用 ROME 的類別 broso.rss.ROMERSSGenerator

包裝起來以後,用法比昨天的 RSS4j 就更簡單了
把昨天的範例程式用 ROMERSSGenerator 修改一下..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
`

    String photo_root = this.getServletContext().getRealPath("/");
String rss1_file = photo_root + File.separator + "rss1.xml";
String rss2_file = photo_root + File.separator + "rss2.xml";
String atom03_file = photo_root + File.separator + "atom03.xml";
String atom10_file = photo_root + File.separator + "atom10.xml";

// 產生 RSS XML Document
SimpleDateFormat dateParser = new SimpleDateFormat("yyyy/MM/dd");

ROMERSSGenerator rssGenerator = new ROMERSSGenerator();
rssGenerator.setRSS1(rss1_file); // 設定寫出 RSS 1.0 格式
rssGenerator.setRSS2(rss2_file); // 設定寫出 RSS 2.0 格式
rssGenerator.setATOM03(atom03_file); // 設定寫出 ATOM 0.3 格式
rssGenerator.setATOM10(atom10_file); // 設定寫出 ATOM 1.0 格式

// 產生相簿這個 Channel
rssGenerator.setFeedTitle("我的相簿");
rssGenerator.setFeedLink("http://broso.twbbs.org/photo");
rssGenerator.setFeedDescription("隨想意誌 我的相簿");


for (int i=0;i<photo_album.size();i++) {
....
....
// 將每個相簿加入 RSS 中
String link = "http://broso.twbbs.org/photo/"+DirName;
rssGenerator.addEntry(Title,link,dateParser.parse( Date),"text/html");
}

// 產生 RSS XML
rssGenerator.writeFeed();

需注意的是 ROME 需使用 J2SE 1.4 與 JDOM 1.0

下載
ROMERSSGenerator,
ROME,
JDOM 1.0

相簿即日起提供 RSS 訂閱服務

最近想幫相簿製作 RSS Feed,研究了一下,找到一個 java 的 Open Source RSS4j
提供 RSS 製作與剖析,參考作者的 Sample Code,很快地就整合到相簿的管理介面裡了。以後每次 Publish 一個相簿,RSS 都會自動更新了。

簡單說明一下如何利用 RSS4j 來製作 RSS

1.先去下載 RSS4j 回來,解開後把 rss4j.jar 放到 WEB-INF/lib 下面。
2.再到 Apache Xerces 下載最新的 xerces2-j ,解開後將裡面的 jar 檔都一併放到 WEB-INF/lib 下面。
3.剩下的就是寫 code 整合到相簿的管理介面中了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
`

    String photo_root = this.getServletContext().getRealPath("/");
String rss_file = photo_root + File.separator + "rss.xml";

// 產生 RSS XML Document
RssDocument doc = new RssDocument();
doc.setVersion(RssDocument.VERSION_10);

// 產生相簿這個 Channel
RssChannel channel = new RssChannel();
channel.setChannelTitle("我的相簿");
channel.setChannelLink("http://broso.twbbs.org/photo");
channel.setChannelDescription("隨想意誌 我的相簿");
channel.setChannelUri("http://broso.twbbs.org/photo");
doc.addChannel(channel);


for (int i=0;i<photo_album.size();i++) {
....
....
// 將每個相簿加入 RSS 中
RssChannelItem item1 = new RssChannelItem();
item1.setItemTitle(Title);
item1.setItemLink("http://broso.twbbs.org/photo/"+DirName);
item1.setItemDescription( Date);
channel.addItem(item1);
}

// 產生 RSS XML
File file = new File(rss_file);
try {
RssGenerator.generateRss(doc, file);
System.out.println("RSS file written.");
} catch (RssGenerationException e) {
System.out.println(e.getMessage());
e.printStackTrace();
out.println(e.getMessage());
return;
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
out.println(e.getMessage());
return;
}

4.搞定!!

EF 24-105mm F4L IS USM

這次的香港行在出發前就已經做好功課,在香港買鏡頭帶回來台灣,如果要台灣的代理商彩虹先進同樣保固,那麼一定得買香港 Canon 的行貨,
那麼自然就有國際保單,同時必須跟購買的商家索取購買時的發票,不然彩虹是不會收的。所以這次在香港買的時候就特別注意了這點。

在旺角通菜街的萬成測完了鏡頭,覺得沒什麼問題以後,就爽快的敗家下去了。本來國際保單上還差點忘了請萬成蓋上店章,還好回飯店以後就
發現這個問題,第三天趕緊抽空回旺角一趟補蓋店章。

Canon 國際保單
Canon 國際保單

萬成發票
萬成發票

在香港行的後兩天中一直是使用這支鏡頭來做拍攝,這兩天下來的心得只能說有了 IS 還真是好用,這顆鏡頭 IS 機構依據 Canon 的官方說法是
可降低快門達三級之多,再加上 5D 高 ISO 的可用性,於是在室內或是夜晚想要手持拍攝就也不再是件不可能的任務。

昨天原本要趁下台中聽優客李林的演唱會時,順道一遊東海大學,無奈出發時間太晚了,以致於無多餘時間去東海大學,只有在回程時在清水服務區
拍了幾張,順便測試看看 高 ISO + IS 防手振的能耐。

出發前在家裡拍的,銳利度很不錯
85mm,F4,1/60s,ISO400,外閃

85mm,F4,1/60s,ISO400,外閃

92mm,F4,1/60s,ISO400,外閃

92mm,F4,1/60s,ISO400,外閃

深夜12點的清水服務區
深夜12點的清水服務區

1/4 仍可拍出清晰的照片
1/4 仍可拍出清晰的照片

快門 0.6s ,已經稍嫌晃動了
快門 0.6s ,已經稍嫌晃動了

加了外閃,快門拉高至 1/60s,所以背景曝光不足
加了外閃,快門拉高至 1/60s,所以背景曝光不足

改用光圈優先模式加外閃補亮主體,不過曝光一秒就真的手振了
改用光圈優先模式加外閃補亮主體,不過曝光一秒就真的手振了

換個場景,同樣用光圈優先模式加外閃,這次快門 1/4 秒,IS 的好用就看的出來了
換個場景,同樣用光圈優先模式加外閃,這次快門 1/4 秒,IS 的好用就看的出來了

45mm,F4,1/60s,ISO1600,外閃,P 模式
45mm,F4,1/60s,ISO1600,外閃,P 模式

45mm,F8,1/3s,ISO1600,外閃,Av 模式
45mm,F8,1/3s,ISO1600,外閃,Av 模式

45mm,F8,0.4s,ISO1600,外閃,Av 模式
45mm,F8,0.4s,ISO1600,外閃,Av 模式

碳素先鋒 Velbon EL Carmagne 645A

以前 300D 時代用的 SLIK 腳架是在家樂福以一張小朋友的代價所購入的,想想 300D 用了三年多,這支腳架也陪了我三年多,
隨著我上山下海,四處趴趴走,雖然便宜,不過因為也沒什麼特殊需求,所以也沒感受到有什麼問題。

前陣子 Sony 從 大坑登山步道 相簿中看到這支 SLIK 腳架,
忍不住提醒我花大錢換了新相機,卻不肯花點小錢換支好點的腳架,萬一 5D 裝在腳架上,一個不慎倒了,那可是會心疼的。
真是一語驚醒了我啊!想想的確是,別為了省小錢而虧大錢啊,所以最近花了點時間對腳架做了點功課。

會需要腳架的拍攝場合,通常需要長時間的曝光,一點點的風吹草動都可能產生震動,所以越穩的腳架當然就越好啦。
但是穩定通常伴隨而來的就是重量,越重越穩定,腳架節數越少就越穩定,這是大概的原則。

我研究了一下後,決定了以碳纖維材質,節數四段,球型雲台為選擇條件,四處參考網友的評價
(Mobile01可幫了不少忙)。
碳纖維最有名的當然就是俗稱 “雞肉” 的 GITZO 啦,推薦的人真的很多,但是查查市價,喔..真是太貴啦..單單腳架部分就破萬了,雲台還沒算在內哩,加上雲台,恐怕沒個 15 張小朋友是買不回來的。
這價格實在是令人無法下手。

後來看來看去看到有人推薦 Velbon 這個日本牌子,價錢適中,且品質也不錯,於是就決定以 Velbon 為主,開始找尋適合的型號。
考量了一下機身、閃燈加長鏡頭有可能會破 4 公斤,加上未來的成長,腳架至少要承重 6~8 公斤,所以就選擇了 Velbon 的 EL Carmagne 645A

來看看 EL Carmagne 645A 的規格:

全高 1557mm
升降中軸 330mm
最短高度 112mm
折合後高度 452mm
腳管直徑 28mm 節數 4
重量 1520g
最高負重: 8kg

EL645 的特色

防滑腳管
Inner Jut Pipe
半自動低角度調節 海綿管套
腳管內部的凸狀滑軌使腳管不會打滑,無論從哪一節都能便捷地伸縮腳管。
(有專利/PAT.P.)
只要將開腳調整按鈕拉到最上部固定處,就能進行全開腳攝影和半開腳攝影。收攏腳管時,開腳角度自動從全開腳角度到半開腳角度,最後恢復到標准開腳角度。 採用NBR材料做成的,經久耐用的海綿式橡膠管套,將一號腳全體覆蓋,不僅保護腳管避免在攜帶中碰撞受損。還能在寒冷地帶發揮其獨特的作用。
腳刻度

El扳扣構造
2段分割式中軸
腳管上大約隔5cm標有刻度。攝影者參照此刻度,就可以簡單地把三腳架的高度調整到最佳攝影位置。 扳扣夾套部分使用的是碳纖維強化樹脂。關節部的強度提高到以前螺母式的同等以上。扳扣鎖緊裝置稍微用力就可以簡單迅速地進行腳的伸縮。
(有專利/PAT.P.)
在用全開腳進行低角度攝影時,可以簡單迅速地把中軸分割為上下兩部分。

雲台部分選擇 645A 所建議的 QHD-71Q,鎂合金球型雲台,承重同樣也是 8 公斤,規格如下

相機平台:長85X寬64mm
最長高度:107mm
重量:450g
台座直徑:64mm
最高負重:8kg
材質:鋁合金(本體)+鎂合金(快裝器、快裝板)
顏色:黑色

在 Yahoo 上下標了以後,東西很快就寄來了, 拍了些照片以供參考

腳架本體未開封盒裝

球型雲台包裝

QHD-71Q,還附贈一把扳手,及轉接螺絲

QHD-71Q 內建兩個水平儀

金剛合體,EL 645A + QHD-71Q

腳架節數全開

中柱拆掉後可以低角度拍攝,此為最低角度

另一個低角度拍攝

EL645A 還附贈一個腳架套,方便直接背在肩上,也可保護腳架

EL645A 還附贈一個石頭袋,用來綁在三隻腳上,可以放入重石以增加穩定度

我又另外買了個腳架外袋,以便可以裝入腳架,保護性更佳

目前還沒機會外出使用,不過在家裡測試結果果然跟 SLIK 穩定度差很多,質感也差很多,
很值得推薦的腳架!!

Yahoo拍賣詐騙陷阱不少,買家請小心

最近 Yahoo 出現了不少詐騙集團,利用相機/手機等高單價的物品,刻意以超便宜的價格吸引貪小便宜的網友進行交易,
而且表面上都宣稱願意面交,但面交地點卻都是澎湖金門等離島。或是宣稱隔日即將出國,請網友儘速匯款,否則取消此超低價
的買賣,買家禁不起貪便宜的誘惑,因此放棄面交直接匯款,結果就是匯款後賣家無聲無息,不聞不問。

聽多了這些故事,其實老實說真的很替這些花了大錢卻買到一場空的買家感到心疼。像我買個相機都得存錢存個老半天,如果是
我原本辛苦存錢,巴望好久才能買的下手的東西,結果換來是一場空,我想我應該也會氣到想一頭撞死,同時詛咒那些人下輩子
一定下地獄。

以前 Yahoo 都建議買家在下標前最好先檢視一下賣家過去的買賣記錄及其他買家對賣家的評價,雖然這招目前也還算管用,但最
近也常有些良好記錄賣家的帳號被破解後,拿來當成詐騙的工具。因此不一定過去良好的買賣記錄都是值得參考的。

下面提供我的一些方法,不敢說百分百可識破詐騙陷阱,但也還有一定的參考價值

1.絕對不要貪便宜。

天下沒有白吃的午餐,大家素昧平生,實在沒道理賣你超低價。如果看到一個比市價還低許多的賣場,最好心
裡就有個底,詐騙的可能佔九成。我知道便宜的東西很難忍,尤其是等了很久的東西,但換個角度想想,都等了那麼久,就再多等
一陣子又如何?

2.看看面交的地點,是不是讓買家很難面交。

高單價的東西大家都知道最好面交,但如果賣家宣稱面交沒問題,但僅限離島等偏遠
地區,其餘地區一律匯款後寄貨,甚至連貨到付款都不願意,這八九不離十也是個騙子。不過如果賣家願意以貨到付款出貨,也不
一定百分百就沒問題。曾聽過網友貨到付款的經驗,等宅配人員送貨並付款後,打開一看才發現自己花大錢買的相機,其實包裝盒
裡面只是一包麵條。所以不管如何,秉持高單價一定面交驗貨的原則大概就沒錯。

3.買東西之前一定做好功課。

如果要買東西,結果連那個東西的特性規格都搞不清楚,那當然只有受騙的份兒。所以買東西一定
要做好功課,諸如物品的規格、市價、網友的評價等等,最好都研究瞭解一下。下標前利用問與答多試試賣家對物品的瞭解程度,
問問題不花錢,如果問東,賣家回答西,那麼這種賣家最好還是不要交易的好。

下面這兩個網址很明顯就是詐騙,透過問與答很明顯的就可以發現賣家其實一點也不瞭解所販售的商品。

例如:買家詢問 EOS 5D
的閃燈有沒有問題?如果對 5D 規格夠熟就知道, 5D 是完全沒有內建閃燈,結果賣家竟然還回答內建 580EX 外閃?真是牛頭不對
馬嘴。

另一個販售 EOS30D 的賣場,買家故意詢問 30D 長時間錄影時會不會出現雜訊?賣家竟然回答完全不會有雜訊。試問 Canon 的
數位單眼又有哪一台是可以錄影的? 又有買家詢問 30D 的保固商,賣家竟然回答國祥實業?稍有常識的大概也都知道 Canon 的台灣
代理商是 彩虹先進,而賣家所稱的國祥實業則是 Nikon 的台灣代理商。幸好這兩個拍賣都及時讓網友發現,所以也沒網友受害。

列出來讓大家參考

CANON EOS 5D 空機 香港購買

全新日本內銷版 EOS-30D + EF-S 17-85 IS IS USM( 售價40800)現貨供應

製作 GIF 動畫

最近發現一個很有趣的軟體-GIF Movie Gear, 可以為你將多張圖檔快速製作為 GIF 動畫。

方法再簡單不過

1.選擇 Insert Frames
2.選入多張圖檔,支援檔案格式很多,ex: GIF, JPEG, AVI, ANI, ICO, PNG, BMP, PSD
3.調整一下每張圖中間的延遲時間 (計數單位是 1/100 sec)
4.存檔完成!!

下面是在某家美式燒烤店用 5D 連拍倒奶精的過程, 很有趣!!

CoffeeMate

下載位址..
Download GIF Movie Gear 4.1.2

Canon EOS 5D

用 5D 來拍照也拍了一陣子, 在使用上跟 300D 的等級感覺果然有差, 感覺最大的差異就是對焦系統等級的不同。

同樣的鏡頭, 用 300D 跟 5D 來拍, 300D 拍起來就感覺糊糊的, 沒 5D 拍起來那麼利。
其次是觀景窗, 跟 300D 比起來, 全幅的 5D 觀景窗真是又大又明亮,
即使在昏暗的場景, 拍起來一點也不吃力。

先來看看 5D 對焦系統的精準度, 測試鏡頭是 Tamron SP 28-75mm F2.8 XR Di 這顆窮人大光圈標準變焦鏡。
(沒拿 EF 17-40mm F4L 來測試的原因是, F4 光圈太小啦, 測試不出 5D 中央對焦點 F2.8 的對焦精度)

28mm 端,光圈 F2.8


75mm 端,光圈 F2.8


測試使用的是大腳哈利的面紙盒測焦圖, 焦平面皆對準於中央缺口的黑白星星處,
而旁邊的表尺刻度完全對準於 8cm 的地方, 無前移也無後移。
因此可以看得出來 5D 的中央對焦點 F2.8 的對焦精度真的不是蓋的..

來看看入手當天的測試照, 皆無外加閃燈

EF-135mm F2L


這顆 28-75mm 鏡頭也號稱有微距功能, 因此拿來試拍靜物看看。



分享一些最近用 5D 所拍的照片

全幅更容易展現淺景深(攝於台中大坑風景區)














室內 ISO 拉高至 1600, 也完全無雜訊


室內 + 外閃(Sigma EF-500 DG Super), 曝光一樣精準


ISO 可 1/3 級距增加 (ISO 1000)


5D 具備點測光功能,超好用 (測光點放在阿國的左手臂處)


容易拍出具通透感的人像照 (攝於翠峰瀑布)










慢速快門拍流水 (攝於翠峰瀑布,快門 0.4sec)


我的相簿中有更多的 5D 拍出來的照片, 有興趣的可移駕至相簿參考囉

Portable Applications

最近金管會來公司做稽核檢查,除了被要求所有 ISO 文件該補的都得補齊之外,任何無版權的軟體也得一律從電腦中刪除。
為此公司的稽核人員還自己特別用 VB 寫了一個小軟體,在電腦上執行就可以掃出所有已安裝的非法軟體,幾乎讓我們只得乖乖的將不該有的軟體通通移除。

不過呢,上有政策下有對策。這套軟體後來被發現似乎是根據 Registry 來掃瞄,只要 Registry 中找不到,它就掃不出來了。
所以大家就紛紛開始改用綠色軟體,也就是所謂的 Portable Applications。Portable Applications 的特色是無須安裝即可執行,
可裝載在任何隨身裝置上(例如 USB Flash),啟動即可執行。因為沒有做安裝的動作,自然那個掃瞄小軟體也無法偵測到。
而程式結束後,作業系統中也不會留下任何的資料。

PortableApps.com 首頁上開宗明義寫著

A portable app is a computer program that you can carry around with you on a portable device and use on any Windows computer.
When your USB flash drive, portable hard drive, iPod or other portable device is plugged in,
you have access to your software and personal data just as you would on your own PC.
And when you unplug, none of your personal data is left behind.

進去逛逛之後才發現,原來這網站蒐集的軟體還真多,而且大部分都是 GNU 軟體,大從 Open Office 系列,小到聊天軟體皆一應俱全。
其中引起我注意的就是 Miranda 與 Gaim 這兩個聊天軟體。首先試著執行了 Miranda,看起來已經將大部分的聊天系統都涵括進來,
不過有個讓我詬病的小缺點就是,聯絡人清單中並沒有依據 MSN 原來的群組來分組,這讓我上百人的清單看起來顯得非常凌亂,想要發個訊息,
還得認真的從凌亂清單中仔細的找才能找到,這令人有點頭痛。再換了 Gaim 來玩玩,其實與 Miranda 功能大同小異,網路選項中也支援 Socks5,
重點是聯絡人清單也有依據原來 MSN 分類的群組來分組,不過不知道有沒有支援表情符號。待我試用後再上來報告。