2009/12/29

這幾天看了終於開始看AIR了,不過…

在ACG的動漫世界中,有這麼樣一部感動人心的HGAME -- AIR
<AIR 女主角之一:神尾觀鈴>

而且我記得在當時的ACG世界中,流傳著這麼樣的一句名言:

『讀出師表不流淚者,其人必不忠;玩AIR不流淚者,其人必不懂日文!』

Key社也因為這款遊劇而聲名大噪,後來也推出了全年齡版(PC / DC)。

全盛時期日本還推出了動畫版。一共13集。

玩了一下DC版的AIR… WOW!!!
神尾的聲優,音色真美!光是聽這美聲就足以讓人痴迷了!

……然後呢?
然後我就睡著了…………(逃)

果然我是真不懂日文呀!!!(眾人毆)

在很久很久之後,在很多很多的巧合下,我拿到了在日本TV放映的AIR影集。

啊!終於可以一飽眼耳心之福了!哈!

看了前6集後,總感覺這部......很像是一堆死小孩在耍任性的卡通 = 三個沒母愛的死小孩 + 一個亡靈 + 一個外星生物!還真是有給它有點看不懂……故事進展好快,一下子就解決了每個人的事件…

不過呀,人物、動物都好可愛,但老頭不太像老頭(連主角看起來都比神尾媽還老),聲優更讚!

嗯……果然是我真的不懂日文呀!哈哈……(汗)

DataSnap (MIDAS)所提到 "MetaData"一詞

我原先一直以為 "MetaData" 是一種應用程式連結到DATABASE所產生的一種 "Session"!

但今天才知道它是一種Database內部註解的一種資訊 (Data about data)。

比方說:
Database's TableName define content.
Table's Field define content.
等之類的。

比較接近於 C++ 的「註解」(//.... or /*...*/)

維基百科中有更詳細的說明:
Metadata(中介資料)

2009/12/25

2010年預計要研究的方向 / 2009回顧


1. Firebird's backup and restore (GBAK)
2. C++ Builder game program of DirectDraw
3. English learn
4. Adobe Flex builder learn

嗯…會不會太貪心呢?

嗯…2009年的身體還真是有夠虛的
年餘未好的感冒(不是h1n1,也跟非同種疾病有關!)、腰閃、50肩、顎內關節異常……反正就一堆老人病,我是 心智 也才10餘歲的少年人耶!
果然我是天生的勞碌命嗎?

最近不知道為什麼,公司對軟體開發的內容似乎不怎麼感興趣。狡免死,走狗烹。為避免變成下一個遊魂,還是趁早多準備一些證照吧。

2009/12/21

Delphi Databases: Dynamic Datamodules at Runtime

這篇文章很像是在說:你是在寫物件導向程式,還是物件導向開發義大利麵程式

我在設計時期所遇的的狀況,在這篇的前兩個方法都看見了,真是個高深的學問呀!

不知如果應用在DBX上結果會不會也是這般美好?


原文網址
譯文網址

20091225更新:
這幾天大致上把Delphi的DEMO轉成C++語法,在轉的過程也慢慢了解到原作者對資料庫設計架構及整個程式操作的流程的想法。

比較困難的地方應該是在Setup Datamodule的內容,因為採用了「函式內包子函式」的作法(這在pascal不知道該怎麼敘述它),這在C++中也不知道該如何去修改(很像遞迴,但卻不是)。最後索性將整個setup函式包成一個class來處理,效果還不錯。

但後來發現,如果合併成一個多參數的函式,或許會更完美也說不定,不過到這邊已經不是原作者demo所要表達的內容,所以也就沒再改寫了。

真的是很有趣的概念,下次來試著寫新專案看看 ^ ^

2009/12/16

GPRS AT Command(GPRS相關AT指令)

GPRS AT Command(GPRS相關AT指令)
出處不明:

AT命令流:
1. 登錄GPRS網:
a) AT+CGDCONT=1,」IP」,」CMNET」
b) AT+CGATT=1
c) ATD*98**1*1#
2. 設置目的IP地址及端口號
a) AT+CGDSTIP
如:AT+CGDSTIP=61.50.33.196,設置目的IP地址為61.50.33.196
b) AT+CGDSTPT
如:AT+CGDSTPT=89,設置目的端口號為89
3. 初始化及註冊
a) AT+CGSTCPINIT
b) AT+CGRGST
4. 數據發送/接收

a) AT+CGDL
如:AT+CGDL=2,設置發送數據的長度為5個字節
b) AT+CGDS
發送數據。如:AT+CGDS=48656C6C6F,發送數據「Hello」)
數據接收
c) AT+CGDQ
查詢是否接收到數據,該命令的返回值中包含數據長度,如
AT+CGDQ
EXT: I
udp,5(收到5個字節的數據)

d) AT+CGDR
讀取數據,該命令的返回值中包含接收到的數據,如:
AT+CGDR
48656C6C6F(收到的字符為:「Hello」)
5. 取消註冊
a) AT+CGUNR
b) AT+CGSTCPSHUT

取得服務器端的IP地址
。AT+CGDGETIP
返回數據為:
IP Address:X1.X2.X3.X4

2009/12/15

最近的三兩事

GSM Model:MC55i 圖片來源
最近終於有看到一些新的玩樣兒

GSM模組的應用,這次用到的是「MC55i」!

不知道這東西出來多久,但目前知道的是…資料好少呀!
很多地方是由彼岸工程師那邊得來的消息!

目前知道它(MC55i)可以:
1.收發簡訊 (160英文字,Enter/Return鍵算2個英文字)
2.收發USSD (在台灣只能傳MP3……)
3.連接GPRS上網

看起來是很厲害的工具!不知可以帶來多大的工作契機!

目前計畫的構想應該是透過nrComm來測試連結GSM模組來收發簡訊,再來試試看如何利用nrComm來與GPRS來結合,希望能有更進一步的研究。 ^ ^

2009/12/10

親 手 打 造 C++Builder 的 TRACE Window

出處:Borland Taiwan
親 手 打 造 C++Builder 的 TRACE Window


曾 經 用 過 Visual C++ 1.5 的 讀 者 們 都 知 道 , 你 可 以 使 用 TRACE 這 個 巨 集 將 需 要 Debug 的 訊 息 送 到 一 個 名 為 DBWIN 的 視窗 上 , 而 咱 們 可 以 一 邊 執 行 程 式 , 一 邊 觀 看 DBWIN 中 由 程式 所 輸 出 過 來 的 TRACE 訊 息 。 但 不 幸 的 事 ,Visual C++ 1.5 的下 一 個 版 本Visual C++ 4.X 竟 然 開 始 不 包 含 了DBWIN , 為 什 麼 呢? 原 來 是 原 先DBWIN 裡 頭 所 包 含 的 所 有 功 能 都 被 整 合 到 了Visual C++ 的 整 合 環 境 裡 頭 , 且 功 能 更 被 發 揚 光 大 , 但TRACE 巨 集從 現 在 起 只 存 在 於 除 錯 模 式 , 並 且 還 被 硬 性 規 定 只 許 應用 程 式 在 整 合 環 境 內 執 行 時 其TRACE 功 能 才 能 夠 使 用 。 這對 於 只 不 過 想 要 像 使 用 printf 一 樣 簡 單 的 輸 出 一 點 訊 息 的咱 們 , 卻 必 須 動 用 到 這 樣 龐 大 的 除 錯 器 似 乎 有 點!@#$%^ 。

SendMessage……真是難

技術篇中唯一的純抱怨文…(怨)

使用BCB6,3年以來一直研究不出來該怎麼用這個指令…

果然是沒啥米慧根呀……

2009/12/09

脾康(台語:鼻孔)長痘痘…後記

經過了2星期的折騰,終於是好了

到底是什麼原因呢?

在看過醫生後,才知道答案是:「破皮發炎」。

哇哩咧,發炎就算了,還加上冒痘痘+感冒,整個就是爽歪歪呀!!!

被衛生紙 強暴 磨破皮的位置…掉毛了!還掉光光!!!

這……這算是傳說中的「雄性禿」嗎?!

最後吃上了抗生素感冒藥才順利讓傷口癒合。

現在…還在等長毛中~~~~(暈)

2009/11/29

鼻孔裡長痘痘了…

繼上次嘴巴長疱疹後…

現在又出現鼻孔裡長疱疹了……不對,是長痘子!

真是個奇怪的地方,雖然說我全身都很容易長痘子、粉刺…但這次長的地方實在是太糟糕了啦!

不能擠 + 好痛!

真是要命!

後來在google上小查了一下,可能是肝火上升的關係吧。

怎麼解呢?早點睡才是王道呀!

食療不知有沒有好效果?

來源在這:綠豆薏仁湯

這幾天就吃這帖吧!看看能不能早點好

真的是好痛呀!!!

2009/11/25

Upgrading to Indy 10 (從Indy9升級到Indy10)

出處:Upgrading to Indy 10

Upgrading to Indy 10

Abstract: This session covers the changes made to Indy 10 and how to quickly port existing code. It also covers the advantages of Indy 10 and why you should port your code. While performance and other demonstrations are shown, this session is a practical overview and does not focus on demo code.
Chad Hower works for Atozed Software, and is the original author of Indy and IntraWeb. When not programming, he likes to bike, kayak, ski, drive, or just be outdoors. Chad is an ex-patriate who spends his summers in St. Petersburg, Russia, winters in Cyprus, and travels extensively year round.

無法正常使用piaip's Restaurant City Hack?可能是……

piaip's Restaurant City Hack

相信大家都已經知道這個屬於開心餐廳的「黑」軟體(作者超厲害的!主程式一更新,沒多久他也更新了!我想該作者應該也是重度 痴漢 玩家)

之前好像要聽說在部份電腦上會有某些功能不能開,比如:

人客(台)加速跑功能失效
客人不跑廁所功能失效
只有廚師才會回復體力

等等之類的問題……

其實,我也有遇到耶!哈哈!

經過本人怨念放送下(?),大致上是知道問題出在哪邊了。

「硬體」,問題居然是硬體!!!

在很多台電腦的連續測試下,得到了以下的結論:
如果你的電腦使用的記憶體是「SDR」級的,那麼將有上述問題會發生。

DDR級的…目前我還沒有測到不行的唷!

相信我,快升級你的電腦吧!哈哈!
不過…這年頭還有誰還在用SDR級的電腦呢?

2009/11/20

久違了,Kylix!

十年前,在VMWare上裝不起來Red Hat 7.2,這個怨念到今天才算是真的了結了!哈哈!

什麼Ubuntu、CentOS上面可以裝Kylix,都嘛是騙人的!我從來沒真正裝起來可以運行過!
只有Red Hat7.2才是最正統的啦!沒圖沒真相!看看下面!

Kylix for Delphi + Kylix for C++ Builder都裝好啦!100%可編譯+運行!

整個事件下來,我覺得最難的還是在Red Hat7.2 X Window的設定,真的是有夠難的難啦!
十年前卡在這邊,十年後,我還是卡在這邊,真是怨念呀!火大到一個不行!

一直到今天,才真正的了結這個怨念!
在網路上一直找VMWare4的資料,豈知在VMWare6上完全不是這樣的處理方法!

什麼文字介面的安裝,狗屁不通!裝完就直接黑在那邊,連個X都看不到呀!

後來還是在圖形介面安裝,最後再設定文字介面來啟動,然後安裝好VM Tools後再Run X window(StartX)即可!整個簡單到一個不行的方法,在Google上居然找不到?!

呵呵呵!真是開心的啦!

2009/11/15

網站設計的評估(下)

上回提到了前端程式以及後端程式在賣出網站後,可能引發網頁原始碼外洩的可能性。

不論是ASP或是PHP,都會有可能發生的問題。

那麼,有其它解決方法的可能性嗎?

別忘了,還有一個被遺忘很久的網頁設計技術--CGI(Common Gateway Interface)

這是種類似像AJAX的一門動態網頁設計技術,唯一與JavaScript不同的地方是,CGI程式是各種程式語言都可以寫得出來的程式,這在C++ Builder上是很吃香的!

更棒的是,它編譯出來的是EXE檔,這在反解譯的部分可以說是大大提高了安全性(網路傳輸的安全性是屬另一個議題了)

在BCB裡編譯的好處是,還可以與系統週邊的硬體做通訊,由前端到後端都可以通吃,這也是其它網路程式設計無法替代的功能之一。

唯一的缺點應該就是CGI太耗資源了,同時10人連線時,WEB SERVER的系統資源就吃緊了呀!

嗯嗯…果然有一好就沒二好呀……

2009/11/14

bit与byte的区别

轉載自:bit与byte的区别

bit与byte的区别

Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范筹;
  Byte意为“字节”,是计算机文件大小的基本计算单位;
这两者应用的场合不同。通常用bit来作数据传输的单位,因为物理层,数据链路层的传输对于用户是透明的,而这种通信传输是基于二进制的传输。在应用层通常是用byte来作单位,表示文件的大小,在用户看来就是可见的数据大小。比如一个字符就是1byte,如果是汉字,则是2byte。
 下面是2个具体应用实例:
 Mbps=mega bits per second(兆位/秒)是速率单位,
 MB=mega bytes(兆比、兆字节)是量单位,1MB/S(兆字节/秒)=8MBPS(兆位/秒)。
我们所说的硬盘容量是40GB、80GB、100GB,这里的B指是的Byte也就是“字节”。(与容量相关,应用层)
1 KB = 1024 bytes =2^10 bytes
1 MB = 1024 KB = 2^20 bytes
1 GB = 1024 MB = 2^30 bytes
 USB2.0标准接口传输速率是480兆位/秒,即480MBps。这里的B指是的Bit也就是“位”。(与传输相关,底层)

 注:另外,Byte通常简写为B(大写),而bit通常简写为b(小写)。可以这么记忆,用大写的就是数据值比较大的位,而小字的就是数据值比较小的字节,1B=8b。

2009/11/10

網站設計的評估(上)

不論是用ASP, PHP做為後端對資料庫的存取及網頁程式設計,都可以將程式碼藏身在後端而不讓有心人偷走程式設計師的智慧財產。

但,如果是要把網站「賣」給客戶呢?

不論再怎麼藏,網頁的程式碼就是赤裸裸地躺在那邊讓客戶自由取用,這對程式設計師來說真是一件很冒汗的事情。

架構的好壞估且不說,日後可能有後續挖錢合作的可能性都沒有了,那設計師靠什麼吃飯呢?

---為了避免吃虧,所以把售價調高到「買斷」的等級,這樣就可以把損失減到最低。---

通常,我們第一個所想到的都是這個方法。但,客戶們也不是笨蛋,價格這麼高,怎麼買的下手呢?尤其是在現在經濟這麼不景氣的時代,更是要錙銖必較呀!

---那麼,加密就好了!這樣總不會被客戶解開了吧!哈哈哈!---

嗯,這也算一個好方法,畢竟會找程式設計師寫網站的客戶,就表示自己對這方面不熱。要破解什麼的,基本上也不太可能。

那麼,加密軟體不用錢嗎?天底下哪有這麼好的事情!價格還不便宜呢!

不過,現在的網路這麼發達,要找到加密軟體的xx程式,還不簡單!

別人會想到這招,那一定會想到如何「反加密」囉!

所以反加密的程式也可以在網站上找到……歹路不可走呀!

..........看來這個方法也不可行.............

2009/11/05

C++ Builder VS Web 初步心得

最近公司提出了要寫網頁的需求
雖然很早就知道BCB可以寫WEB網頁,但完全不知道它的能耐到哪邊
所以就開始找尋相關的資料

所有的資料寫的很詳盡,但對我來說還真是夠難的
還是直接從範例下手吧!
經過了一些範例中,總算是能了解BCB對WEB的詮釋了
簡易的架構圖大概會像是:

(BCB上對WEB SERVICE的簡化詮釋)

就上面的圖片就可以知道,BCB負責了「接收資料→處理需求→資料庫存取→輸出資料」四個步驟,也就是「BCB's WEB Module」這個區塊。

在書上寫著「不論你的web server提供cgi、isapi之類的服務,在BCB中的寫法一律相同。」

這有點像是...資料庫程式中BDE可以連接各式各樣的資料庫,但在BCB中的寫法都不會變的道理是相同的。

但事實上會這麼簡單的嗎?

要知道,如果這麼理想的話,在2006的版本之後就不會出現IntraWEB這種玩樣兒出現了。

事實上,在ie裡面看到的網頁叫什麼呢?



「網頁」才是主角,別忘記它了啊!

「HTML」!

是的,在書上的簡易範例中著墨最少的html,因為BCB所提供的元件只能回傳簡易的html碼,所以必需在html上多加學習。


既然要寫html,當然少不了css排版…還有很多很多。


而BCB對web的態度也僅僅是這樣嗎?

BCB6的誕生年代是沒有ASP這種東西的,在當時的網頁如果要做電子商務的話,除了CGI、JAVA外,就沒有其他東西可以用了。所以只能將就點用了,在當下的時機點,CGI是歷史最悠久的,所以當時的寶蘭才會覺得非它莫屬了吧(自以為)。

會不會覺得太簡單了呢?

2009/11/04

好像動不了的美人時計

最近在網路上看到有blog會放上美人時計
覺得還蠻賞心閱目的,於是就想把它放上來

但…為什麼放了之後官網就掛了呢?

還真是「金手指」呀~~~~哈哈!

2009/10/28

免費的DBX for Firebird driver with RAD2007~XE3

今天在dbExpress Driver for Firebird看到Google group - dbExpress Firebird社群


現在換成這個網站:dbExpress Driver for Firebird

看到他們有寫出支援 Formerly known as Borland or CodeGear Delphi / C++ Builder
2007, 20092010XE, XE2 and XE3的DBeXpress driver for Firebird

目前作者還沒有要收費的打算,不過也歡迎使用者在試用後依喜好捐錢給他。

這樣才能做出更優更好的驅動出來造福使用者 ^ ^

不過對於仍然還在使用BCB6開發的我來說,只能說「殘念」囉~~~~ Orz

2009/10/26

BCB6與DirectDraw的結合

今天在公司無聊到快昏過去的我突然在我的skype中收到某人的訊息

SlyDiman's home

很有趣的東西,叫做「DirectDraw for C++ Builder」的VCL元件,在多媒體開發中算是很不賴的元件,作者除了提供原始碼外,還附上了Example,執行畫面如下
畫面還不賴吧!哈哈!
Win2000隨機附的是DirectX 8.1(印象中),但DX9也可以向下支援,所以我另外下載了「bcb_dx_include.zip

解壓縮之後再開啟SlyDDraw.bpk編譯,再安裝,完成!還真簡單!

在安裝時要注意:

一、壓縮檔裡有個include目錄,原本是要全部覆蓋BCB安裝路徑下的同名目錄,但為了避免覆蓋較新的.H檔,所以在覆蓋的時候不要去覆蓋已經有的.H檔。

二、需要DirectDraw的專案裡,需要另外把Proxies.pas放到該專案中編譯才會成功。

剛剛小公主看到我在找這篇的時候,就問到能不能換照片呢?
來試試看吧!

呵呵,BCB又多了一項可以玩的玩具,還真是不賴呀!

2009/10/01

新遊戲![NDS]SAGA2 秘寶傳說

日本官網
日文原名:サガ2 秘宝伝説 運命の女神
中文翻譯:SAGA2 秘寶傳說 命運女神

小時候玩過GB版的SAGA2,看不懂劇情,手邊也只有一本少少劇情的攻略本,但卻異常地熱血,沒日沒夜地玩。

為了什麼?

為了傳說中77個秘寶?還是為了找尋失蹤已久的父親?其實那個時候什麼也搞不清楚。
只覺得音樂很好聽,人物(攻略本+說明書上的圖)很好看,就這樣給它玩下去了。

補上當時GB版SAGA2的卡帶封面:

















很帥的一張!

但實際在玩的時候卻不是這麼一回事,哈!
那時候還把GB帶在身上,只為了聽它的音樂。

傳說中,在標頭畫面按下"SELECT + START + B"就可以進入遊戲中所有音樂的測試模式。

少見的立體音(戴耳機才聽得出來),以及熱血澎派的戰鬥音樂,畫質在GB中算是一絕了!
尤其是最後和緊急逃生電梯PK的時候(這段我到現在還是無法理解為什麼要和電梯PK),魔王的背景採用浮雲動畫,這是GB的RPG少見的處理,以及魔王的攻擊也採用動畫式處理。在當時只能用「感動」二字來形容。

最近剛入手NDS SAGA2 秘寶傳說重製版
來看一下它的圖片吧
























是不是有不一樣的感覺了呢?(笑)
重製後的音樂把一些頗具震憾力的內容改掉了,有點小失望,但整體的音樂還是很優呀!

還我片頭的立體音呀~~~~~~~~~~~~~~

2009/09/23

這…這其實也是老梗了, ACER AO751H BIOS 3210更新!

最近還是不死心的找找看751h的vga driver是不是有更新的版本

但還是沒有……(倒)


不過bios倒是又多了一個新的版本

(點下後會放大)



更新了之後發現,在使用上還是沒啥變化


到底是更新了什麼呢?

總覺得ACER在客服的部份很像是在閉門造車,完全沒在跟客戶互動的。


果然就是便宜的下場嗎?

=======2009/10/27更新=======

ACER在10/5號時又發了個新的BIOS--3210

BIOS_Acer_3210_A_AO751h.zip


有需要的人快去更新吧!


2009/09/01

[轉貼]如何在blogger首頁文章使用繼續閱讀功能

如何在blogger首頁文章使用繼續閱讀功能

這功能我找好久啦!總算是找到了說。 ^ ^

讀書心得:SQL語法查詢百科








其實,這本書買來迄今也大概有兩年的時間,一直沒有機會好好拿來細讀。

在我的觀念中,這本書被我歸類在「工具書字典類」的範圍中,但這本書從來沒有在我需要的時候給我任何的貢獻…
實在是很奇怪呀!為什麼我要找的資料都找不到?

在不斷開發程式的過程中,我仍然是在無盡的網海中找尋我需要的SQL語句。

最近終於是閒下腳步了,想把我之前買來貢在書架上的書拿來看一看,了解自己在這段期間學了什麼。
或許也能從中學到些技能,碰撞出一些設計上的火花也說不定。

於是就翻開書本上的序,開始一頁一頁的精讀。

其實這本書我也翻了幾次,但可能我翻到的地方都是很簡單的說明,
於是也不覺得這本書內容有多充實,很想趕快看完後拿去捐給圖書館去危害鄉民 XD。

翻了前兩章之後才發現,哇,原來還能有這樣的寫法。
在簡單且平談的文字敘述間,夾雜著技術層面的內容,不精讀的話,還真是無法領略其中的奧妙。

每一個小議題都會將Oracle與ACCESS兩者資料庫的語法不同之處詳細解說,對於想雙修的人來說無疑是很好的學習書。
而行政文書人員也可以藉由書上access的範例來學習單機資料庫的應用方式來學習改善日常文書效率的做法。

沒有繁文縟節的資料庫理論,而是深入淺出的純SQL探討書籍。

每一個章節的後面都會有很簡單但卻又很辦公室生活(?)的練習題,在練習的過程不僅學到SQL,也學到能夠活用SQL的技巧。

往往在學完一個章節後,又迫不及待地翻開下一章繼續閱讀。

這是我讀過「C++ BUILDER資料庫程式設計 - 人事薪資系統實作」一書後,第二本會讓我有這種衝動的書籍。
為了它,我還丟下我家的小公主去圖書館偷偷K的咧。

全書的主旨是在「如何利用SQL來有效率地得到最需要且正確的結果」,以結果論來看,我認為這本書到最後也沒有脫離這個原則。

如果有心要學SQL的話,這本是非常有學習價值的一本書,拿來收藏也不錯。
(謎之音:剛剛是誰說要把這本書拿去捐掉?)

最後,寫一些關於這本書地不負責任的優缺點吧!
優點:
1.學習曲線平穩,相當適合初學者入門,而後段對熟手也有觀念上的修正
2.每一個議題都會有ORACLE與ACCESS對照內容,一書二吃,學習自由度頗高
3.練習題很口語且較符合辦公室的應用場合,對SQL語句的活用很有幫助
4.翻譯的質感佳,不會有不知所云的觀感

缺點:
1.沒有各個SQL語句的索引,必須採用「人腦索引」來解決這個問題,如果這本書再版能把索引加進去,這本書適用的範圍就更廣了
2.ORACLE與ACCESS的SQL語句有很多都不相同,兩邊都解釋的結果就是頁數變多了,書變重了(這就是雙面刃啊)

所以嚴格說起來,這本書應該不是定位在工具書,而是學習書,這本書的書名會讓人有所誤會 (笑)
不過,看完這本書的讀者應該會把這本學習書轉成工具書來使用吧!太實用了!

題外話,正在強迫我家的小公主學習中,哈!

2009/08/31

[轉貼]Vector用法

出處:Vector用法
內容:
Vector用于存储对象数组

常用方法

1.push_back 在数组的最后添加一个数据

2.pop_back 去掉数组的最后一个数据

3.at 得到编号位置的数据

4.begin 得到数组头的指针

5.end 得到数组的最后一个单元+1的指针

6.front 得到数组头的引用

7.back 得到数组的最后一个单元的引用

8.max_size 得到vector最大可以是多大

9.capacity 当前vector分配的大小

10.size 当前使用数据的大小

11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

12.reserve 改变当前vecotr所分配空间的大小

13.erase 删除指针指向的数据项

14.clear 清空当前的vector

15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty 判断vector是否为空

18.swap 与另一个vector交换数据

2009/08/26

將不特定檔案存入取出資料庫內

來源:請問如何將不特定檔案存入取出資料庫內
事實上方法極為簡單, 範例如下
(1)載入檔案存入note欄位內(note是一blob)

TFileStream *fs;
TStream *s;

if( OpenDialog1->Execute() )
{
s=Table1->CreateBlobStream( Table1->FieldByName("Note"), bmWrite );
s->Seek( 0, 0 );
fs=new TFileStream( OpenDialog1->FileName, fmOpenRead );
s->CopyFrom( fs, fs->Size );
fs->Free();
s->Free();
}

(2)自note內取出資料存成檔案
TFileStream *fs;
TStream *s;

if( SaveDialog1->Execute() )
{
s=Table1->CreateBlobStream( Table1->FieldByName("Note"), bmRead );
s->Position=0;
fs=new TFileStream( SaveDialog1->FileName, fmCreate );
fs->Seek(0, 0);
fs->CopyFrom( s, s->Size );
fs->Free();
s->Free();

夠簡單吧! 不過就是用 FileStream & Stream 在那兒轉來轉去而已
但它沒有原始檔名資料,建議你另加一欄位存放原始檔名
如果你不想存檔可以將Stream傳至您的其他元件直接觀看,例如pdf, bmp, jpg
tiff, word, excel..........等其他方式處理,反正BLOB是完完整整的將檔案存起來也不管你的資料格式是啥隨便你玩,只是請注意一下容量大小,若你是經由端
伺服器那麼最好有經過特別處理或不純放太大檔案

TClientDataSet的詳細介紹

出處:CSDN
=============================================================
在三層結構中,TClientDataSet的地位是不可估量的,她的使用正確與否,是十分關鍵的,
本文從以下幾個方面闡述她的使用,希望對你有所幫助.
1.動態索引
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;
2.多層結構中主從表的實現
設主表ClientDataSet1.packetrecord為-1,所有記錄
設從表ClientDataSet1.packetrecord為0,當前記錄
3.Taggregates使用
(1)在字段編輯中add new field類型為aggregates
後設置expression(表達試)
設置active:=true即可
使用dbedit的field為前者即可
(2)使用Aggergates屬性add設計表達式
調用
  showmessage(floattostr(ClientDataSet1.Aggregates.Count));
  showmessage(ClientDataSet1.Aggregates.Items[0].Value);
 
4.在單層數據庫中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds
代替table的tablename的db或者dbf
原來的程序改造方法:
加一個ClientDataSet,使用右鍵assign locate data
後savetofile,再loadfromfile,後刪除table
將原連table的datasource設為ClientDataSet
唯一注意的是:要將midas.dll拷到system或者當前目錄
5.三層結構的公文包的實現方法
同時設定1:filename(*.cds)2.remote server
6.可以對data賦值(從另一個數據集取值)
ClientDataSet2.Data:=ClientDataSet1.Data;
ClientDataSet2.Open;
或者
ClientDataSet2.CloneCursor(ClientDataSet1,true);
ClientDataSet2.Open;
7.附加數據取得
客戶程序嚮應用服務器請求數據。如果TClientDataSet 的
FetchOnDemand 屬性設為True,
客戶程序會根據需要自動檢索附加的數據包如BLOB字段的值或嵌套表的內容。
否則,
客戶程序需要顯式地調用GetNextPacket 才能獲得這些附加的數據包。
ClientDataSet的packetrecords設置一次取得的記錄個數
8.ClientDataSet與服務器端query連接方法
(1)sql內容為空
ClientDataSet1.Close;
ClientDataSet1.CommandText:=edit1.Text;//即sql內容
ClientDataSet1.Open;
對於沒有應用服務器設置filter 如:country like 'A%'
filtered=true可實現sql功能
(2)有參數
如服務端query的sql為
select * from animals
where name like :dd
則:客戶端ClientDataSet
var
pm:Tparam;
begin
ClientDataSet1.Close;
ClientDataSet1.ProviderName:='DataSetProvider1';
pm:=Tparam.Create(nil);
pm.Name:='dd';
pm.DataType:=ftString;
ClientDataSet1.Params.Clear;
ClientDataSet1.Params.AddParam(pm);
ClientDataSet1.Params.ParamByName('dd').AsString:=edit1.Text ;
ClientDataSet1.Open;
pm.Free;
end;

9.數據的更新管理
(1)savepoint 保存目前為止數據狀態,可以恢復到這個狀態
var
pp:integer;
begin
pp:=ClientDataSet1.SavePoint;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('姓名').asstring:='古話';
ClientDataSet1.Post;
table1.Refresh;
end;
恢復點
ClientDataSet1.SavePoint:=pp;
(2)cancel,RevertRecord
取消對當前記錄的修改,只適合沒有post的,如果post,調用
RevertRecord
(3)cancelupdate
取消對數據庫所有的修改
(4)UndoLastChange(boolean),changecount
取消上一次的修改,可以實現連續撤消
參數為true:光標到恢復處
false:光標在當前位置不動
changecount返回修改記錄的次數,一個記錄修改多次,返回只一次
但UndoLastChange只撤消一次

10.可寫的recno
對於Ttable和Tquery的recno是只讀的,而TClientDataSet的recno可讀可寫
ClientDataSet1.recno:=5;是設第五個記錄為當前記錄
11.數據保存
對於table使用post可更新數據
而ClientDataSet1的post只更新內存數據,要更新服務器數據要使用
ApplyUpdates(MaxErrors: Integer),他有一個參數,是允許發出錯誤的
次數,-1表示無數次,使用simpleobjectbroker時常設為0,實現自動容錯和負載平衡

[CB6] AnsiString 類別介紹

以下也是轉載而來的內容,來源是:
AnsiString

全文如下:
AnsiString 其實是一個類(class),不過,它並不歸屬於VCL的框架,不是派生於TObject. 該類封裝了C,C++裏字串的大多操作,並有所發展。方便了C++程式師在程式中使用字串。下面挑典型和重要的說。

一、String就是AnsiString.typedef AnsiString String;

二;在VCL,幾乎所有字串都是AnsiString。若是屬性,則有要求, += 的重載對屬性不保證一定起作用。


Form1->Caption = "窗口標題"; //OK
Form1->Caption += " - 世界你好"; //Err
Form1->Caption = Form1->Caption + " - 世界你好"; //OK

同樣的事情發生 >>(移出) 或 << (移入) 重載上。如字元:
this->Font->Style >> fsBold; //不行的

三、如果要用空串,最好不用 "";

而是:AnsiString emptyStr = *NullStr;
四、現在你不用(顯式地)?字串管理記憶體了:
AnsiString name = "Mike";
ShowMessage(name); //顯示Mike
name = "張三";
ShowMessage(name); //顯示張三
AnsiString name2 = name;
name = 李四";
ShowMessage(name);
ShowMessage(name2);
AnsiString twoName = name + name2;
ShowMessage(twoName);

上面其實說明了,AnsiString 重載了 = 和 + 操作符,讓我們可以直接通過簡單的=或+操作,來賦值,改變一個字串。
如果不用Ansistring這樣或類似的而在C,C++,同樣的操作將是類似於(並不一定和上面完全一致的過程):
char* name = "Make";
ShowMessage(name);
name = new char[strlen("張三") + 1];
stcpy(name, "張三");
ShowMessage(name);
char* name2 = new char [strlen(name1)+1);
strcpy(name2,name);
delete[] name;
name = new char[strlem("李四")+1];
strcpy(name,"李四");
ShowMessage(name);
ShowMessage(name2);
char* twoName = new char [strlen(name) + strlen(name2) + 1)];
strcpy(twoName,name);
strcat(twoName,name2);
ShowMessage(twoName);
delete[] twoName;
delete[] name2;
delete[] name;

肯定可以看出後者在記憶體管理(初始分配,擴容,連接,釋放)上的一堆瑣事。當然,可以考慮用純C的 malloc,realloc, free ,及 sprintf連減少一些操作,但在C++世界裏,這樣的記憶體管理會和使用new,new[] , delete,delete[]的代碼在交接上?生問題。並不是C++程式師的首選。

可能還會說,我就是原意累點,可是直接寫記憶體管理,會帶來高效率啊。。這是不知量力。由於字串管理在一個程式中的使用率太高了,事實上不管是VC的CString, 還是STL的string,或者是C#的string,及我們這裏的AnsiString,統統採用記憶體池,及“realloc on modify(在修改時才生分配記憶體)”等技術,可謂既提高了連續記憶體使用率,又提高了運行速度,這類高級功能,不是一般你我有精力甚至能力去實現。

四、小心,AnsiString 帶有Pascal風格。

AnsiString這個類也重載 [] 操作符 ,用於得到字串中指定的字元,可是,雖然AnsiString純是用C++寫成,但它是?了實現Object Pascal內置類型string,所以必須和Object Pascal保持相容,所以,它的下標也是從1開始:
AnsiString pascal = "Pascal";
char c = pascal[1]; // c 是 'P'

五、可以得到C風格的字串。

Windows在編程介面上還是非面向物件,(等.Net完全取代後,就是了) 它的API還得用到很多的C風格的字串(上面我們舉例的那個);再者,C++既然說完全相容C,那我們難免有時還會喜歡用用C的函數庫。
AnsiString s = "123456";
int len = strlen(s.c_str());
沒錯, c_str() 這個成員函數返回的是一個 const char* 常量字串指標。因?是const的,所以用在類似strlen()這樣僅要求是const char* 的函數還算方便,如果你想安全一點,或者人家函數指定就不能是const ,那你只好複製走:
AnsiString s = "123456";
char* tmp = new char[7];
strcpy(tmp, s.c_str()); //複製
然後對tmp愛幹嘛幹嘛去。

六、它有好多字串操作成員函數,並一般都有對應的同名全局函數。

比如取長度:
AnsiString s = "Hello!";
int len = s.Length(); //求長度
但你也可以這樣:
int len = Length(s);
或例如求子串:
string subString = s.SubString(2,3);
ShowMessage(subString) // "ell"
同樣用個全局的SubString(s,2,3);
注意了,索引從1開始。

用C++實作Strtok (類似 Java StringTokenizer)

來源:strtok:Split string into tokens

在網路上在查Strtok的做法,無意間找到C++的處理模式
有網友熱心的公佈出他的程式碼(類似 Java StringTokenizer)
內容寫的真的很棒,所以就轉來這邊收藏。
如果要套用AnsiString,則可以使用AnsiString的c_str()函式,也同樣適用哦!
以下是它的源始碼內容:
//---------------------------------------------------------------------------
#include <iostream>
#include <string>
#include <vector>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

class StringTokenizer : public std::vector<string>{

public:
 StringTokenizer(const string& s, const string& delim = " ,") {
   string::size_type lastPos = s.find_first_not_of(delim, 0);
   string::size_type pos = s.find_first_of(delim, lastPos);

   while( string::npos != pos || string::npos != lastPos ) {
     push_back(s.substr(lastPos, pos - lastPos));
     lastPos = s.find_first_not_of(delim, pos);
     pos = s.find_first_of(delim, lastPos);
   }
 }
};
int main(int argc, char* argv[])
{
 StringTokenizer stk("1, 2, 3");

 for( StringTokenizer::size_type i = 0; i < stk.size(); i++ ) {
   cout << stk[i] << endl;
 }

 system("pause");
 return 0;
}
//---------------------------------------------------------------------------

2009/08/21

羅技新滑鼠m555b試用心情(?)

最近用了一下m555b的感覺,很棒!
滾輪零磨擦!滾一下就滾個沒完沒了,需要手動煞車
常常也因為這樣而讓食指磨掉一層皮 (誤)

好用的電池更換開關,按一下蓋子就和本體分離了!很方便!

1000dpi的解析度,滑起來很柔很滑順(?)

預設的中鍵是在滾輪後面的按鈕,按滾輪是沒反應的唷!

而滾輪的左右鍵預設也是沒作用的,需要另外安裝driver才行,下次再來試試看吧!

20090821更新:
裝了m555b的驅動程式後,設定介面就跑出來了,滾輪的左右鍵也可以正常使用了
中鍵的應用程式切換鍵(有點像ALT + TAB功能的方式)所帶出來的介面很炫!跟VISTA的切換視窗功能很像,但沒這麼耗資源。

另外,零磨擦滾輪其實可以變成傳統棘輪滾輪(會出現咔啦咔啦聲音的那種)
只要壓一下滾輪,就可以做傳統和零磨擦模式的切換哦!

真是好棒的滑鼠呀!

2009/08/19

[轉載]加快你ADD Items的速度!virtual list、vector for TListview教學


寫這篇文章的人真的是佛心來的耶!超厲害的啦!希望我有一天也能夠寫出這樣的作品 ^___^

轉載自:300分求解决listview大量数据添加慢的方法

轉載內容

主  题:     讨论ListView里显示十万级以上记录时,象SQL   Server里的返回所有行的方式显示记录,怎么实现?

作  者:     cmsoft   (韦小宝是我的老乡)

等  级:

信   誉   值:     100

所属论坛:     C++   Builder   基础类

问题点数:     99

回复次数:     38

发表时间:     2002-12-31   9:57:02

回复人:   bigwhiteshark(大白鲨)   (   )

信誉:被封杀

哈哈正中本人下怀

如何用TListView来处理大量数据

采用常规方法处理ListView,在数据量大时无论是还是用了BeginUpdata和EndUpdata()

还是处理WM_EraseBkgnd信息都不会得到理想的效果,那答案是什么呢?嗯,

采用所谓Virtual ListView技术。说起来很神秘,其实点通了很简单。

通常ListView中的所有数据都是由ListView自己来管理的,它负责这些数据空间的分配和释放,

当你把ListView->OwnerData设为true时,ListView就把数据的管理权交给了你,而它只负责显示。

这时你需要自己来为数据分配和释放空间,至于你怎样来管理这些数据完全有你自己来定,

ListView完全不关心,当ListView需要显示某条数据时,它就调用OnData事件,

你只要在这个事件的处理函数里指定ListView即将显示的Item的内容就可以了。

这就是所谓的Virtual ListView技术。

由于ListView对数据管理的功能强大,随之而来的却是效率低下,

如果你采用更高效的数据管理方式就会极大的改变效率。

而且Virtual ListView只在数据需要显示时才调用OnData事件载入数据,所以速度很快。

下面的例子中,假设ListView中需要显示4列数据,所有的数据被保存在vector里。

/*Unit1.h*/
//---------------------------------------------------------------------------     
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------     
#include   <Classes.hpp>
#include   <Controls.hpp>
#include   <StdCtrls.hpp>
#include   <Forms.hpp>
#include   <ComCtrls.hpp>
#include   <vector.h>

using namespace std;
//---------------------------------------------------------------------------     

struct ListViewData //用於存儲一條資料的結構體     
{
  AnsiString Caption;
  AnsiString SubItems1;
  AnsiString SubItems2;
  AnsiString SubItems3;
};

class TForm1: public TForm
{
  __published: //   IDE-managed   Components     
    TListView * ListView1;
  void __fastcall ListView1Data(TObject * Sender, TListItem * Item);
  private: //   User   declarations     
    vector < ListViewData * > m_lvDataVector; //用於存儲所以資料的向量     
  public: //   User   declarations     
    __fastcall TForm1(TComponent * Owner);
  __fastcall~TForm1();
};

//---------------------------------------------------------------------------     

extern PACKAGE TForm1 * Form1;

//---------------------------------------------------------------------------     
#endif

/*unit1.cpp*/
//---------------------------------------------------------------------------     
#include   <vcl.h>
#pragma hdrstop#include   "Unit1.h"

//---------------------------------------------------------------------------     

#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 * Form1;
//---------------------------------------------------------------------------     
__fastcall TForm1::TForm1(TComponent * Owner) : TForm(Owner)
{
  ListView1 -> OwnerData = true;
  const int iListViewCount = 5000;
  ListView1 -> Items -> Count = iListViewCount; //必須指定,以使ListView知道其虛擬資料量   

  //保存資料     
  for (int i = 0; i < iListViewCount; ++i) {
    ListViewData * plvData = new ListViewData;
    plvData -> Caption = "Caption" + AnsiString(i);
    plvData -> SubItems1 = "SubItems1" + AnsiString(i);
    plvData -> SubItems2 = "SubItems2" + AnsiString(i);
    plvData -> SubItems3 = "SubItems3" + AnsiString(i);
    m_lvDataVector.push_back(plvData); //向vector中添加一項     
  }
}

__fastcall TForm1::~TForm1()
{
  int iCount = ListView1 -> Items -> Count;
  for (int i = 0; i < iCount; ++i) {
    ListViewData * plvData = m_lvDataVector[i];
    delete plvData; //釋放資料佔用的資源     
  }
  m_lvDataVector.clear(); //清空vector中所有條目     
}
//---------------------------------------------------------------------------     

//ListView在要顯示某條資料時會調用這個函數   
void __fastcall TForm1::ListView1Data(TObject * Sender, TListItem * Item)
{
  if (Item -> Index > m_lvDataVector.size())
    return;

  ListViewData * plvData = m_lvDataVector[Item -> Index];

  //指定要顯示的條目的資料     
  Item -> Caption = plvData -> Caption;
  Item -> SubItems -> Add(plvData -> SubItems1);
  Item -> SubItems -> Add(plvData -> SubItems2);
  Item -> SubItems -> Add(plvData -> SubItems3);
}
//---------------------------------------------------------------------------

速度很快,5000条数据只要1秒左右. 在使用Virtual ListView方式时,如果要对数据排序,只需对你保存的内部数据(这里时vector对象)排序,然后ListView->Refresh()即可。

这时你在ListView中看到的数据就是排好序的数据了。

2009/08/09

你今天上線了沒?

這兩天颱風天出門,發現了很有趣的景象,連結電線杆的電線上面滿滿都是麻雀。

嘰嘰喳喳吵個不停,彷彿是在聊天………

「你今天上線了沒?」

不知道有沒有人懂我的笑話,哈!

2009/07/29

Firebird的Show Tables?那是MySQL的指令啦!

出處:FAQ for Firebird Users Migrating From MySQL

原文如下:

How to list all tables in a database?

In MySQL, you can do SHOW TABLES. You can use the same in Firebird's isql command-line tool, but nowhere else. However, this can be done by querying Firebird's system tables:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;

This query will show you both system and user tables. To select user tables only, use this:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0;

Note for advanced users:
The above query will select both user tables and views. To select tables only use this:

SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_BLR IS NULL;

有看不懂的…再寫個意見給我吧。

2009/07/22

ACER AO751h的顯示驅動更新了!


2009/07/21 做了第二版的更新,版號是6.14.11.1012,不知道是更新了哪邊,總之就更新看看吧!

希望我的楓之谷可以正常顯示吧!


更新了之後………

更新後的抓圖……(像不像遊戲中的NPC--「區原」呢?)

看來,XP的驅動仍然還有完善的空間啊……
持續當白老鼠ing

2009/07/19

很盡責的笠螺仔

最近在魚缸中丟了2隻苦螺仔(非常像燒酒螺,但不能吃)加上1隻笠螺。

3呎大小的魚缸對它們而言像是一座超大型的運動場,常常找不到它們。


吸到加溫棒電線的笠螺(+愛搶鏡的金魚…… = =)
吃到欲罷不能

另一隻撞到歪嘴的金魚也入鏡了(不知道怎麼撞的)

呵呵,魚缸內的世界真是越來越精彩了啊~~~

2009/07/14

Firebird中,有趣的Stored Procedure

今天閒來無事,找找Firebird embedded上有沒有什麼新奇的東西,仔細想想,Stored procedure好像還沒玩過,拿來玩玩也不賴。

首先,看到的是這個網頁
Stored Procedures in Firebird

使用重點就是
* Stored Procedures can perform an action and do not return any data
它能做傳值和不傳值的動作。(資料庫不就只有這樣的功能?)
* "Select" Procedures return tables, just like SELECT, Tables or Views. They can be used like a table reference in a SELECT statement:
SELECT a, b FROM procedurename (params) ...
語法非常像SQL中select的語法
* To be able to call a procedure, the user must have EXECUTE rights (granted by GRANT/REVOKE)
使用Procedure的人一定要有EXECUTE的權限。

利用文中的範例做了兩個預存程序,發現有一點點的小錯誤。
原來「SUSPEND」就像是C++的「RETURN」指令,某範例少了這行,不會有回傳值。

總之,做完之後再拿到BCB上去試,發現,不一定要使用TSQLStroedProc才能呼叫它,用TSQLQuery就可以輕鬆直上了!

哈哈!真是有趣的東西呀!(謎之音:有趣的點是在哪邊?)

2009/07/12

TIdSysLog Class - SendMsg篇(四)

這次所講的是SendLogMessage內的另一參數:Severity
Indy中是這麼解釋的:
Indicates the severity of the Syslog message.
這封訊息的嚴重性。

結構如下:

TIdSyslogSeverity = (
slEmergency,
slAlert,
slCritical,
slError,
slWarning,
slNotice,
slInformational,
slDebug
);

嚴重性由上而下,由重到低,依此類推。
TIdSysLog Class - SendMsg篇(三)一樣,提到轉為文字的函式。

資料來源:TIdSyslogSeverity enumeration

2009/07/11

微軟真的是…賺很大!只會欺負台灣嗎?

最近把windows附的media player 9 更新為 11 版
更新完之後,發現怎麼右上角有個簡體中文的廣告!

「从FAROLATINO.COM下载合法且免费的音乐」

奇怪了?我從來上過這個簡體網站,也沒到過類似的廣告,到底是怎麼給我裝上去的呢?

後來在GOOGLE上查了一下之後才發現,原來是微軟自己把這個廣告同捆到MEDIA PLAYER11裡面了!
同捆就算了,內容還是簡體中文!
之前常上簡體中文網站,常常被那些程式寫得不好的木馬網站搞得一定要重灌,對簡中網站實在是很反感…

現在是怎樣!要我們識簡書正就是了!

在對岸查了一下之後,發現早期對岸的MEDIA PLAYER11有繁中的廣告連結,並且對它做了移除。

可能是有被施壓(?)所以才改成簡體中文的吧!

如果怕有爭議的話,那廣告內容就改成英文的啊,何必自己找罪受!

後來在台灣的網站上找了一下,咦!怎麼都是讚揚這個廣告功能的啊!?

這…這是奴性太重還是……

可能識簡書正是潮流吧…我…我落伍了啦!

2009/09/05 更新
在微軟社群網站上有找到關於這問題的解法,有些些的麻煩。
來源:Media Player 的預設線上商店 地區選項
引用開始==
這裡的名稱是HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Services下的機碼名稱,預設就是FaroLatino11_CN,如果是HiNet就是MyHiNet,Media Guide則是MediaGuide

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Subscriptions]
"ActiveService"="Service=MediaGuide&userlocale=404&GEOID=ed&locale=404"
"ActiveServiceName"="MediaGuide"
以下為刪除商店,刪除FaroLatino商店作範例

Windows Registry Editor Version 5.00

[-HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Services\FaroLatino11_CN]
因為一開始沒MediaGuide和HiNet的資料,沒有底下這2個機碼,要等Media Palyer中點選Media Guide或HiNet才會出現
如果你要使用,你可能要先從其它電腦匯出此處的機碼,一併加入你要修改的reg檔中
HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Services\MediaGuide
HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Services\MyHiNet
引用結束==

2009/07/09

TIdSysLog Class - SendMsg篇(三)

上次我們看到SendMessage / SendLogMessage中有其它的參數,我們再來研究一下它們的內容吧!
這次我們先從TIdSyslogFacility說起吧
顧名思義,這單字就是設備。
原文是這麼解釋的:
Indicates the facility that caused the message to be generated.
送出此訊息的設備別。

在Syslog中,除了訊息以外,再來就是發送訊息的來源,方便我們使用者做後續的追蹤。

結構大致如下

TIdSyslogFacility = (
sfKernel,
sfUserLevel,
sfMailSystem,
sfSystemDaemon,
sfSecurityOne,
sfSysLogInternal,
sfLPR,
sfNNTP,
sfUUCP,
sfClockDaemonOne,
sfSecurityTwo,
sfFTPDaemon,
sfNTP,
sfLogAudit,
sfLogAlert,
sfClockDaemonTwo,
sfLocalUseZero,
sfLocalUseOne,
sfLocalUseTwo,
sfLocalUseThree,
sfLocalUseFour,
sfLocalUseFive,
sfLocalUseSix,
sfLocalUseSeven
);


上面提到的只是發送的部份,在接收的話就只會看到「01234…n」的數字。難道我們只能後續用switch的方式來轉換為文字嗎?
其實TIdSyslogFasility也提供了反向轉換的工具:
結構如下:

function FacilityToString(
AFac: TIdSyslogFacility
): string;


這樣傳送與接收就更趨完整了吧。

參考來源:TIdSyslogFacility

2009/07/08

TIdSysLog Class - SendMsg篇(二)

這次再介紹一下IdSysLog SendMessage的內容
基本上,如果捨SendMsg而就Send的話
那麼接收端就會收到單純的Message,TimeStamp就不會追加在Message前面。

而如果要用SendMessage而又不想加TimeStamp,呃…目前我還沒找到方法…如果我有找到的話再放上來吧



TIdSysLog.SendMessage
Sends a message to the loggin daemon.

procedure SendMessage(const AMsg: TIdSysLogMessage; const AAutoTimeStamp: Boolean = true); overload;
procedure SendMessage(const AMsg: String; const AFacility: TidSyslogFacility; const ASeverity: TIdSyslogSeverity); overload;
procedure SendMessage(const AProcess: String; const AText: String; const AFacility: TidSyslogFacility; const ASeverity: TIdSyslogSeverity; const AUsePID: Boolean = False; const APID: Integer = -1); overload;

Parameters

const AMsg: TIdSysLogMessage

Syslog message instance or string.
實體Syslog message 或是 某一字串


const AAutoTimeStamp: Boolean = true

Add time stamp to the message.
增加time stamp到欲輸出的訊息

const AFacility: TidSyslogFacility

The facility for the logged message.
發送訊息的場所

const ASeverity: TIdSyslogSeverity

The severity of the logged message.
發送訊息的重要性

const AProcess: String

The process name.
發送訊息的程序名

const AText: String

Descriptive text for the syslog entry.
可讓syslog發送的描述性文字

const AUsePID: Boolean = False

Use a process ID.
是否使用程序ID (Handle),預設為「否」

const APID: Integer = -1

Process ID for the syslog entry.
可讓syslog發送的程序ID

後面的說明…有點煩雜
主要是在說明SendMessage重載了TIdSyslog後做了哪些的加強及擴充,有興趣的可以再自己翻一下底下的內容。

Description
SendMessage is an overloaded procedure in TIdSysLog used to form and transmit a message destined for the logging daemon.
One variant of SendMessage sends the existing TIdSyslogMessage instance identified in AMsg to the logging daemon. AAutoTimeStamp indicates if the current date and time should be applied to the TIdSyslogMessage.Timestamp property prior to transmission. This variant calls Send using the encode value for the message.

Other variants of SendMessage construct a new TIdSyslogMessage instance and populate it's values using the arguments specified for the procedure. Each of these overloaded procedure calls the SendMessage variant that uses the existing TIdSyslogMessage instance.

阿斗仔,你不知道我們是把技術文件是當成武俠小說在看的嗎!?

在看Indy技術文件時,發現版本越是新的文件,它的內容越是空洞。
最後還只用了一句話來處理…
IdSyslog SendLogMessage為例

TIdSysLog.SendLogMessage Method (String, String, TidSyslogFacility, TIdSyslogSeverity, Boolean, Integer)

procedure SendLogMessage(
const AProcess: String;
const AText: String;
const AFacility: TidSyslogFacility;
const ASeverity: TIdSyslogSeverity;
const AUsePID: Boolean = False;
const APID: Integer = -1
); overload;


然後再看到成員表及說明…

ParametersDescription
AProcess 
AText 
AFacility 
ASeverity 
AUsePIDDefault is False.
APIDDefault is -1.


一開始看到宣告後我會不知道這預設值為false?不知道預設值為-1?還需要你在說明中再廢言一次?
其它內容一個渣也沒掉出來……

你不知道大部份的苦命工程師是把技術文件是當成武俠小說在看的嗎!

是想叫直接用Indy10的人去自宮後回去用Indy9嗎?

你好歹…好歹也要來個前情提要吧!!!

一個混到一個不行的Open Source......不誨言的是,它很好用,真的,但前提是你要會用才行!

難怪哈利波特我看不懂,因為我是從第3集才開始看的啊啊啊啊啊啊啊!

2009/07/07

最近在Blogger找語法高亮的方法

因為在Blogger上面放一些code,如果沒加上點顏色,感覺就不像是code的樣子

所以在網路上找了些可以高亮的方法。

方法一:利用Online syntax highlighting
我找到介紹很詳盡的網站:Onile Syntax Highlighting - 線上語法高亮產生器
寫得很棒,還有圖文併茂的解說唷!

方法二:利用SyntaxHighlighter來完成高亮的處理
有一個已經實作的網站了
在這邊
補充:方法二中的brush的成員放在這裡

TIdSysLog Class - SendMsg篇(一)

TIdSysLog Class
---------------------------------
TIdSyslog SendLogMessage --Indy 10.x
TIdSyslog SendMessage --Indy 9.x (實際應用是SendMsg)
---------------------------------

Exsample:
//This is C++ Code
IdSysLog1->SendMsg("Test HI!",sfUserLevel,slInformational);


Sends a message to the logging daemon. --Indy10.1.5
Sends a message to the loggin daemon --Indy9........(看出哪裡錯了嗎?)
對Syslog Server發送一個訊息。

logging daemon 原文應該是翻成 「登錄守護靈」??
但實際指的就是接收 Syslog的機器,所以等於Syslog Server也不為過吧。

可能因原Indy9.x中的TIdSyslog SendMessage會和TIdMessageClient.SendMsg重名
(對IdSyslog.SendMsg做help查詢會查到TIdMessageClient.SendMsg)
所以才會在Indy10.x中改為SendLogMessage吧? (誤)

2009/07/03

在中國 IBM 網站發看到了一篇關於DBX及DB2的連結教學

IBM在文件漢化上真的有下一番功夫,與某O及某$牌比較起來,IBM的文件漢化功夫真的有到家!
雖然我個人沒啥機會會用到DB2,但利用 dbExpress 創建可重用組件來將 Delphi 7 連接到 DB2這篇關於DBX的設計方式真的還不賴!看得我真是心癢癢的啦!

以下節錄這篇文章的精彩片段:


儘管 TSQLTable、TSQLStoredProc 和 TSQLQuery 都只有一個特定用途,但 TSQLDataSet 卻像隻變色龍。
它可以執行這三種任務,並可以在運行時切換到所希望執行的行為。
實際的行為通過兩個屬性(CommandType 和 CommandText)來定義。
可以將 CommandType 屬性設置為 ctQuery、ctStoredProc 或 ctTable,CommandText 屬性將根據您做出的選擇顯示一個 SQL 查詢構建器(SQL Query builder),它是一個表名稱的下拉列表或存儲過程名稱的下拉列表。
SQL 查詢構建器是新出現的,因為它不是 TSQLQuery 組件本身的一部分。
.....................................
因為增加了靈活性(以及添加了設計時 SQL CommandText Editor),所以我總是更喜歡使用 TSQLDataSet 組件,而從來不使用 TSQLTable、TSQLQuery 或 TSQLStoredProc 組件。





由於全部修改一直保存在內存中,直到應用這些更新為止,因此為客戶提供一個 Undo按鈕是個不錯的主意(根據我的經驗,這常常會受到好評)。TClientdataSet 使用 UndoLastChange 方法支持 Undo,該方法的唯一一個參數指定是否希望應用程序執行這一修改(例如,如果您想將游標定位在剛剛執行撤銷操作的記錄上)。

要實現此方法,請(從 Standard 選項卡)在窗體中放入一個 TButton 組件,命名為 btnUndo,將其 Caption 設置為 Undo,然後將下面的代碼添加到組件的 OnClick 事件處理程序:



procedure TForm1.btnUndoClick(Sender: TObject);
begin
ClientdataSet1.UndoLastChange(True)
end;

發生unresolved external __fastcall #$%@#^& .OBJ的可能原因

最近在編譯程式時,三不五時給我跑這個出來,一整個火大
在網路上找了一下可能的原因,可能會有…

一、專案裡的「.obj」刪掉重新編譯
二、使用「Build」不使用「Make」試試
三、把該函式所使用的「cpp/pas」加到專案中再試試

一行錯誤,多重解法…什麼鬼!

2009/07/01

ACER AO751H很慢? maybe......

最近用這台電腦被家裡的小公主一直嫌慢(我也覺得啦,不過還能接受)

在網路上聽說重灌後速度會變快(supXP)

但我幹嘛吃飽沒事去裝個非正式的軟體呢?

想著想著就順便去找幾個可以加快windows速度的方法,果不其然,真的有!

記憶體利用率低?全給我載到記憶體去!
L2快取完全沒開?!那就打開吧!

總之,找了很多修改登錄檔的東西後,真的,WINXP的速度就變快了唷!

最後在網路上找到一個重灌後會用到的登錄檔…
=================================================
※自行重灌XP時,螢幕亮度無法維持fn鍵所改變的亮度。
處理方法如下:
開始->執行
regedit
在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LPCO 底下新增機碼 PersistenceBacklight
在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LPCO\PersistenceBacklight 新增DWORD值DisablePersistenceBacklight,設為1
參考連結
==================================================

2009/06/25

多做多錯,不做不錯

話說,我家老大最近丟了一些雜事下來,說是為了新零件的承認要做的測試工作

說得真好聽…還不是為了cost down!
把品質搞爛才會有很多維修品,才會賺不完吧!

一測就是3個星期,還沒結束!

為什麼這麼久呢?
高精密的電子產品一定會經過一道所謂「高低溫」測試,來證明這項零件可以在極地中正常工作

為了這項測試,真是搞死我了!

每做一次調整,就要-15~55℃全測過一次!

每一次測試都會有小問題,為了這些小問題,被老大一直問問問,答了結果又不相信,還一直要我確認確認確認,x的!你煩不煩啊!搞什麼鬼!

什麼都要明確的資料表,是怎樣!

做越多錯越多!到底是為誰辛苦為誰忙啊!

2009/06/23

Google電子書--Borland C++ Builder 6 developer's guide

最近在找BCB的教學書籍,看到了這本電子書,如果有興趣的同好們,也歡迎去看看唷!
底下附上嵌入的電子書



10/8補充
Google Book Downloader alpha 8 ~ 下載Google Book書籍的最佳利器,可存成PDF格式有提供如何下載版權書的方法,也歡迎各位去看看唷!

2009/06/08

螢火蟲之墓 -- 觀後感

昨天(6/8)看了螢火蟲之墓真人電影版後,一整個很鬱悶,戰爭真是太可怕了……

清太之死,有一大半是自己的責任
換作我是收留他的人,我一定也會這樣做
但,如果劇中明確提到清太平日是如何照顧妹妹的內容,或許也會有另一層的觀感也說不定。

但小公主說:
「如果不是日本犯賤地跑去找人打架,會落得如此下場嗎?一切是自找的,還敢拍這種戲來搏取世人的同情!不要臉!」

「……」

一整個無言,不過小公主說得也有一番道理。

歪著頭,想著努力活下去的方法……

2009/06/04

嘴唇腫得跟香腸一樣…

前一陣下嘴吧下方一點點的地方長了一顆很像青春痘的東西,痛痛的,於是就叫我家的小公主把它給擠破
不擠還好,一擠整個就是爆痛!

痛…痛死我啦~~~~~!

隔天
我的嘴就腫得跟士林大香腸一樣大

真…真是可怕…
好痛~~~~ ><;

一到公司,同事們很快就發覺了

「Eden,你的嘴…是被家暴哦」
「…比家暴還可怕…」
「還有比家暴更可怕的事?」
「就…嘴吧長針眼咩,還能有什麼事…痛!」
「…………」
明明就是痛得說不出話來,還想搞笑…真是夠了

還以為跟以前一樣是皰疹,於是跑到藥局去買藥
原來這藥還真不是普通的貴!
1顆要價20元

10顆劑量就200元了耶!

後來吃了一天半,無效,腫得又更大了…
不得已,只好去看醫生了

「啊,就發炎了」
「啊?發炎?」
「誰跟你說這是皰疹了」

聊了很久才知道,原來藥局拿的藥是剋黴菌的,害我賠了夫人又折兵啊……

被細菌感染的香腸唇…痛苦地等待它快快好~~~~ > <

2009/06/03

奇妙的PowerDVD版本

話說日前買了ACER AO751H之後,用得不亦樂乎
後來在試用powerdvd時,發現上面找不到實際的版本資訊
結果在啟動畫面上看到…
「Video 版」

這是什麼版本?
為什麼說明書上沒有提到??
好奇怪呀

那這算是試用版?還是隨機附增版??
什麼資料都沒有…
嗯嗯…不知道能不能外掛到MPC中做硬解MKV影片

2009/06/02

誠知此恨人人有,貧賤夫妻百事哀。

3年經驗,半年價值…
好像是我目前現階段的寫照
進步越來越遲緩了,要怎麼突破現狀呢?
還是與環境一同沉淪呢?

不可抗拒的事情越來越多
工作越來越重要
一切的一切都是因為錢啊……

古人所曰真的沒錯…

誠知此恨人人有,貧賤夫妻百事哀。

原文如下:
================================
唐·元稹《遣悲懷》其二
昔日戲言身後意,今朝都到眼前來。
衣裳已施行看盡,針線猶存未忍開。
尚想舊情憐婢僕,也曾因夢送錢財。
誠知此恨人人有,貧賤夫妻百事哀。

2009/05/22

滑鼠滾輪事件在 Visual Basic 6.0 IDE 中無法運作

微軟原址
用BCB習慣了之後,改用VB6來寫程式時
發現滑鼠滾輪不能使用
很不方便

後來在網路上有看到微軟官方有提供解決的方法(詳如上述連結)

在這邊簡單地說一下好了:
一、下載官方修正檔
二、解壓縮到「c:\windows\system32」
三、按一下 [開始] ,[按一下 [執行] ,[輸入regsvr32 VB6IDEMouseWheelAddin.dll再按一下 [確定] 。
四、之後再用VB6的增益集管理員」開啟即可

嗯…不知道這老古董還需要玩多久………

2009/05/19

今天體驗了一下傳說中的VT技術

也不算是什麼正規的測試方法啦
就在VirualBox的官網上下載了新版的程式,加上做好的作業系統

在原本P4 2.4G(無HT)上跑仍會有點卡卡的情況
但在AO751H這台筆電上開啟VT後,所展現的效果居然比正P4 2.4G還要來的順暢!!

一整個很開心

不過3D破圖的問題目前還沒辦法解決…不是很苦腦,但看起來不…不蘇糊………

2010/3/22更新:
事實上,VMware會實際去檢查VT-X是否有被BIOS打開,而到目前為止的BIOS更新卻都沒有開啟這個選項供USER開啟,所以會發生無法運行Win7 64bit的情形(不過卻可以正常安裝,很奇怪)

AO751h使用ATOM Z520 CPU晶片組,是不支援64BIT系統的,但官方卻有提供64BIT的DRIVER,真的很令人疑惑呀!

2009/05/16

終於入手了!我人生第一台的筆記型電腦--Acer AO751h-BW!

昨天好晚才回到家
白天不在公司
這台電腦的到來還真是引發了不少的風波…(太貴了,沒人敢收,哈!)
總而言之,還是順利的入手了!

一整個很興奮!
網路上已經有很多開箱文了,在這邊就不多po照片占頻寬了~~~~~(懶)

爽度很夠
鍵盤敲得很爽,按鍵夠大

螢幕也夠用
效能部份,我有打開Acer內附的DEMO Game來試玩看看,發現3D能力真的不算優…會有3D物件貼圖亂掉的問題,不過,目前還沒打算拿來玩3D GAME,所以就…當作沒這回事……(逃)

而大多數人嫌慢的可能原因應該是McAfee惹的禍,一直在掃描所有執行的程式,所以效能當然DOWN了很多!

實際用起來…比現役的DURON 1.3G要來得快很多
記憶體只有1G…對常常會用到VirualBox的我來說,真的不夠用,一開機就只剩4xx mb的記憶體,怎麼樣都是不夠的吧。

整體來說已經很滿意了!
但,之後還要再試試看Flash及Photoshop後才會知道結果吧

趕快再來試試,哈!!!

2009/05/15

期待新nb的到來-ACER AO751H-52BW

上星期六到傳說中的小黃(鬼)屋去採買攜帶式的nb
想想…我的需求是什麼呢?
攜帶方便、速度快、便宜、持久(…我指的是電力… >///<)

看來看去,看來是沒有我要的東西……(暈)

最後只好在 epc 及 AO751H 中做選擇,說真的,兩者的規格真的沒有差很多

以下是做簡單的比較表
 ASUS EEEPC 1008HA-WHI001XACER AO751h
作業系統正版 WindowsR XP Home正版 WindowsR XP Home
螢幕10.1" LED 背光 WSVGA 螢幕 (1024x600)

16:9 11.6" HD 1366 x 768 TFT LCD

處理器與晶片組IntelR Atom N280 (Atom N280 (1.66GHz雙執行緒)DDR2 667 1GBGMA 950)Intel® Atom Z520
記憶體1GB DDR21GB DDR2 667系統記憶體,可擴充至2GB
Wireless Data NetworkWLAN 802.11b/g/n
Bluetooth2.1 + EDR
802.11b/g
Bluetooth 2.0+EDR
Hybrid Storage1. 160GB 2.5" SATA II 5400RPM HDD
2. 10GB Eee Storage
160GB 2.5" SATA II 5400RPM HDD
內建相機1.3M Pixel1.3M Pixel,支援暗光補強技術
音效Hi-Definition 音效晶片
立體聲喇叭
數位陣列式麥克風

Hi
-Definition技術
2個立體喇叭裝置
MS-Sound相容
內建麥克風
電池超薄, 且環保的 鋰聚合電池--6 小時*57.7W 5200mAh 6-cell 鋰電池--8小時
尺寸大小266mm(W) x 178mm(D) x 18.5mm~ 25.7mm(H)284(寬) x 198(深) x 25.4(高)mm
重量1.1Kg(2.42lbs)1.35公斤(6 Cell電池)

------------------------------------------------------------------
從這張表來看…嗯…EPC真的好像比較好一點

但怎麼螢幕解析度低了一點?

這在使用一些大解析度(1024*768)時會有按扭按不到的情況,雖然有小程式可以用,但個人總覺得麻煩。

啊!真是苦腦啊,到底該選哪一台呢?

仔細想想,反正我的作業就是拿來打打程式碼,如果螢幕大小不夠的話,打起來就會不舒服。

15吋的1024*768的小畫面我都哇哇叫了,更何況是更小的1024*600

雖然很無奈,但還是只能選大一點的A0751...啊!是AO751H

白色嚴重缺貨呢!聽說今天才會到,真是期待的說~~~~~(樂)

2009/05/14

Visual Basic6 元件陣列的用法

話說,已經習慣BCB的IDE後,用回VB…一整個很不習慣
不過發現在很多不好用之後,發現一個好用的東西
就是「元件陣列」

一般來說,我們習慣把物件名稱命名為…
Label1
Label2
.
.
.
以此類推
後來發現,vb6中的元件可以重複指向相同的名字,而且系統也會好心提醒要不要合併元件陣列
一整個很方便
這個功能可以節省很多很多的程式碼哦!

例如:
  For i = 0 To 3
Label(i).Caption = 1
Next i

2009/05/06

讀書心得--第十層地獄

如果在所有的罪行裡,最重的罪是背叛別人,那麼欺騙自己的人該當何罪?

這是「茱迪.皮考特」的另一部作品,在看完「姊姊的守護者」後,就很想再找她的作品來品嚐一番。

但,還沒進到本文,就已被跳躍式的邏輯跟詭異的翻譯給打倒了

而我,只看了翠克西與她父親第一次失散的序章結束而已

而書中有許許多多被粗體標示的文字,感受不到作者(或是譯者)所要表達的內容。
我必須把同一章文字反覆看了兩三遍才能理解文章內容…

看來…看得懂中文,不一定能看得懂小說……

2009/05/05

BDE 轉 DBeXpress : Prepare 篇

以往BDE在做查詢的時候,常常會看到以下內容:

if(!Query1->Prepared)
Query1->Prepare();


針對BDE的引擎做SQL語法最佳化的處理。(這應該叫BDE的SQL機器人工具吧?)

DBX依然是沒有這個函式,也沒有可以替代的函式可用……

因為DBX並沒有像BDE一樣經由函式檢查SQL語法內容,而是直接把語法丟給DB去作處理+檢查,這在傳輸上可以節省時間,達到高效的目的。 ^ ^

當然,這樣就必須讓聰明的程式設計師寫出更為正確的SQL指令了。

讀書心得--姊姊的守護者

之前在圖書館時看到公告欄上的強打書籍:「姊姊的守護者」
看了預告就覺得還蠻好看的,介紹上是這麼寫的:

莎拉為了救罹患急性前骨髓性白血病的女兒凱特,利用醫學科技生下與凱特有完美基因配型的安娜。

十三年來,安娜不斷地供應凱特血液、白血球、骨髓、幹細胞,現在輪到了她的腎臟。

無法忍受再被當成藥糧的安娜決定反擊她的父母,控告父母奪走她的身體使用權。

看到這裡,就覺得很刺激,很想知道整個事件的始末,以及結果如何。
但想不到這本書的借閱率之高,難以借到手,就在排隊排了半年之後,終於給我盼到了。

懷著期待的心情把這本書給看完,實在很令人驚訝劇情會如此發展。
也看到了人性、親情、友情交互糾結與矛盾的交織。一連貫的事件源源不絕地衝擊我的道德觀

以同理心的方式來揣摩劇中人物;「我是否也會這樣做?」或者是「更應該如何面對?」
同一個事件、同一個時間點,依據每個人的角度及觀感表達出來
彷拂法官就是你,由你來評斷整起事件的對錯,一直到終章……

我只能說,終章的衝擊一直在我腦海揮之不去,真不應該在睡前看這本書的,哈!

不斷的爭議性是貫通此書的重點,發人省思的一本好書。

2009/05/04

BDE 轉 DBeXpress : EmptyTable 篇

這次提的是 BDE 的 TTable 中會刪除所有資料集的函式:「EmptyTable」
在Query元件要刪除table時,不外乎都是利用「DELETE TABLE tablename」的方式來處理
但是SQL語法對一般程式設計師來說並不是這麼平易近人
而且,在資料量不大的資料表中,這樣的處理方式顯得冗長
所以DELPHI / C++ Builder的程式設計師通常會利用TTable的函式「EmptyTable」來處理這般的需求,但很奇怪的是…

每當需要使用的時候,必需先將目標關閉,如:

Table1->Active = false;
Table1->EmpeyTable();
//之後才把Table1打開
Table1->Active = true;


然而DBX的SQLTable居然沒有這個好用的函式。
取而代之的則是:「DeleteRecords」

用法也是一樣,而且,就算SQLTable->Active = true
也是能夠照常使用。
(如果Active=false
,也可以執行,但實際資料並不會被刪除就是了)
實戰上算是很方便的函式之一。

2009/05/02

5/1勞動節?勞動劫?

今天在電視上看到在總統府前抗議的勞工團體
其實蠻想去聲援的

家人卻說:

你又不是沒工作,去跟人家聲援什麼!

對,目前我是還有工作,但,這件事情非同小可,我未來也有可能會像這些失業的人一樣面臨失業

當你能發聲的時候不發聲,當你需要別人聲援的時候,就沒有人替你聲援了
(完整的文章內容我找不到了,只能把大概的意思表達出來)

然而,有些事情是隱藏在背後的…

我們公司也在悄悄地開始放假了,未來還真是堪慮呀~~~~~~

2009/04/29

DBeXpress 的 RecordCount

DBX中的 SQLTable / SQLQuery / SQLDataSet 都有支援「RecordCount」函式(統計資料集合現有多少筆數)

實際在用的時候發現並不是這麼好用,常常 run 到該處就發生例外錯誤(Exception)

不少人認為這是DBX的BUG...

最近閒來沒事在查這方面的資訊,發現原來BCB的HELP中有解釋不能應用的場合

原來DBX的元件是由「TCustomSQLDataSet」繼承「TDataSet」而來

然「TCustomSQLDataSet」有改寫 RecordCount 的些許內容,一般簡易查詢依然可以利用
但如果遇到以下情況則會跳出例外錯誤:

1. The dataset represents stored procedure.
1. 資料集為 Stored Procedure 表示式

2. The dataset represents a query that contains parameters.
2. 資料集為帶有參數查詢的表示式

3. The dataset represents a multi-table join.
3. 資料集為多表合併的表示式

不過HELP中並沒有提到這樣的限制的理由 (汗)

解決的方式有以下兩種:
1. 利用ClientDataSet來處理RecordCount
2.使用SQL的COUNT(*)來統計

以上,做個小參考吧~~~(笑)

2009/04/28

DBeXpress的一些觀念

話說DBeXpress是B社強力主推的軟技術之一
但鮮少有資料可供參考

討論它的專書繁中+簡中的…大約4本吧
而有提到的書籍,無一不說DBX的效能好,但…

說效能不錯,那是有條件的!

就先拿BDE來說好了,B社資料連結技術的開山元祖
速度快不快,說真的,在單機架構中,應該是沒有任何的引擎比它快
(就連最新的DBX4也才只比BDE快0.X秒)

缺點:
封裝麻煩

說真的,BDE除了這點外,大概沒其它問題(…是我沒用到過)

而DBX呢?
速度嘛…M$SQL輸ADO(大),單機輸BDE(超大),C/S則還需看BDE的SQL LINK及ODBC效能才有機會勝出…
DBX的效能…或許在5~6版之後能真正超越BDE吧
那,DBX的優勢在哪邊?
1.封裝簡單
  只需要把 MIDAS 及 DBX+DB Client所需的DLL包在一起,直接封裝即可,快速簡單
2.架構明確
  以往習慣BDE的B社愛好者(被逼?),一但必須把原1~2-TIER的架構晉升為N-TIER時,往往會因架構落差太大導致轉換不易
  而DBX採行的則是「準n-tier」架構,讀取資料時採單向取出,寫入資料時則交由DATASNAP方式寫入
各司其職,取「單向取出」及「MIDAS寫入」二者優點,得到最大效能
(慢就是慢在MIDAS,所以效能慢也不能全怪DBX)

提了這麼多,那DBX的架構是什麼東西?

DBX元件 + DataSetProvider + ClientDataSet

這就是完整的DBX架構

某書曾寫DBX + StringGrid的方式簡直是大誤......

N-TIER所用到的元件則是…

(BDE / ADO / DBX) + DataSetProvider |<-Server 切 Client->| (DCOM / Socket) + ClientDataset

如何?有沒有像一點?如此切開就成了n-tier架構

接下來要討論的課題是
這樣的DBX要怎麼在專案中設計?
以下的內容不一定是正規寫法,也歡迎提出討論

1.視時機使用SQLTable/SQLQuery及ClientDataSet操作資料存取元件
  這種方式看起來沒啥不好,在c/s設計上也沒有問題,但在未來移轉到n-tier時,需要變更的地方可不少
(也就是說,仍採用與BDE相同的設計模式)

2.將ClientDataSet直接取代成TTable / TQuery來使用
  把SQLTable及DataSetProvider藏在DataModule內,完全使用ClientDataSet操作
這樣的方式更能貼近N-TIER的程式寫法,若未來有升級的空間,可考慮這樣的寫法
但在1~2-TIER上設計時往往會有脫褲子放屁的感覺
再者,由於大部份的情況都在DataSetProvider做in/out動作,效率上會顯得更為慢些
(在單機的情況來說,這並不明顯)

在設計性與未來延伸性來說,會是設計師的一門課題
不過也因為這個原因,讓資料庫程式設計變得富有趣味性及變化性。

2009/04/11

在史瓦濟蘭九天的回憶錄(一)

話說去史瓦濟蘭,到底是好,還是不好?
說真的,沒一天好,沒有一天是好的!
(這就是愛台灣啦!哈哈!)

因為敝公司的業務平日都有在做面子,所以在那邊真的很能感受客戶對我們的善意
也看到了當地的好人,當然,壞人也不少啦,但與南非比起來,史國民情算是相當優良的了
出發第一天從台灣出發,飛到香港後,等了3小時才搭上預計的班機,當時是晚上,而南非當地則是白天。坐上飛機,發現座位旁沒人,心想真幸運,但沒想到之後坐在我旁邊的居然是位高胖的黑人(多胖?185cm / 120公斤有吧),就是坐著還會卡到我,真是大隻……
抵達南非時的機上照片
飛機飛得很快,平均是900km / hr,我覺得就像上演現代版夸父追日一般,當然,太陽沒被我們追到,連月亮都跑得比我們還要快,到最後,我們又被太陽給追上了,呵!
「這邊是德本機場!」不遠處的香港旅行團團員盼盼在討論這件事情
呃!?這跟我們預計的不太一樣,我們不是應該到約翰尼斯堡嗎?
之後的廣播告知:因南非天候不佳,必須先到德本機場等候,等天氣好一點,再飛到目的地。
之後我就開始觀查旁邊的大隻佬,呼吸聲真大…下飛機時還會把垃圾丟到我位置前的置物袋……是我太大驚小怪嗎?但…好像是當地的民族性…或許吧

面對小公主的脾氣…

...小公主晚上又發脾氣了…
心情實在不太好,上來舒解一下…
其實,住在一起之後,我發現,常常只要一接近家中,小公主就很容易被激怒,不知道是我太白目還是小公主脾氣變差還是…

前一秒還是高高興興的,後一秒就大發脾氣,這個不應該做,那個不應該碰…
很煩

是不是每個結婚後的家庭都是這樣呢?還是絕對都是我的問題?

開始有點討厭回家了…如果一回家就要吵一架,那幹嘛組一個家庭呢?

當初的決定是否正確呢?
可能

小公主也是這樣想的吧

2009/04/08

[轉貼]心得分享 : 參數檔 (INI 檔) 處理

來源:心得分享 : 參數檔 (INI 檔) 處理


INI 檔應用的歷史從 Windows 3.1就已存在,雖然它也是文字檔的一種,但它利用「節區(Section)」及「識別字(KeyWord)」觀念,類似資料庫的索引,所以用來當作少量 變數資料的儲存器非常適合,除變數管理容易外尚可做程式流程控制,市售套裝軟體有用 ini 檔來控制其軟體版本例子,其主執行檔可能只有一個,但依 INI 檔設定可開放其全功能版(豪華版)與非全功能版;INI檔案 Size 雖然有 64k的限制,但已足夠存放上百個變數資料;在 32 位元系統上,正統取代 INI 機能的方法為使用 Windows Regist,但為了儲存Windows 作業系統本身的資訊,Regist已夠龐大,如果我們每個應用程式又去 Regist內挖一塊空間當作自己儲藏變數或參數的地方,會讓 Regist變得更龐大更複雜,所以筆者還是建議每個程式都使用自己的INI檔來儲存自己的變數,況且 INI檔不會被淘汰,連 Linux Kylix 下都看得到其蹤影

■ 應用實例

假設程式中需要紀錄目前發票號碼(invo_no)、交易序號(tran_no),而每次交易完都要將這兩個變數值加1,若程式從頭到尾都不關機,那沒有 問題,程式會記錄目前的發票號碼及交易序號已排到幾號;但若程式中途有關機後,下次開機,程式怎知發票號碼及交易序號已排到幾號?所以除了將變數資料存於 資料庫中外,更簡單的方法就是使用INI檔來記錄變數值,在程式重新啟動時再將變數值取回,所以該INI檔內容可能長得如下:

[Varible]
invo_no=00000005
tran_no=3

其中,用中括號刮起來的Variable就是「節區(Section)」名稱(可自訂),而其內的 INVO_NO、TRAN_NO則稱為「識別字(KeyWord)」(可自訂);不可有相同名稱的兩個節區(Section),但不同的節區中可有相同名 稱的識別字(KeyWord),取用時按節區(Section)索引分開取用,如下圖:

[Varible]
invo_no=00000005
tran_no=3

[Varible_2]
invo_no=00000007
tran_no=5

■ 程式實例

接下來我們介紹使用 INI 檔來儲存或取回變數的方法,在程式中要使用 INI 檔有幾個步驟:

1.程式開頭必須 #include "inifiles.hpp"
2.程式中首先需建立一個 INI 物件以對應實際的 INI 檔,不用時再釋放這個 INI 物件,通常 INI 檔實 體與主執行檔存在同一路徑,甚至檔名也和主執行檔相同,但副檔名則為 *.ini
3.使用 INI 物件的某些方法(Method)來存取變數,取用的方法依變數型態有下列幾種方法(假設這個 INI 物件名為 MyIni)
MyIni->ReadInteger(節區名,識別字,整數Default值);
MyIni->ReadString(節區名,識別字,字串Default值);
MyIni->ReadBool(節區名,識別字,布林Default值)
4.寫入的方法依變數型態也有下列幾種方法
MyIni->WriteInteger(節區名,識別字,欲寫入之整數變數值);
MyIni->WriteString(節區名,識別字,欲寫入之字串變數值);
MyIni->WriteBool(節區名,識別字,欲寫入之布林變數值)

以下為一完整使用INI程式碼的範例
//-------------------------------------------------------
#include
#pragma hdrstop

#include "Unit1.h"
#include "inifiles.hpp" //要 include 這個東西才有 TIniFile 類別
//-------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TIniFile *MyIni;
//-------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  //建立 ini 物件及實體存放路徑
  MyIni = new TIniFile(ChangeFileExt( Application->ExeName, ".ini" ) );

  //讀取變數(若變數值不存在則用自動使用 Default 值)
  Left=MyIni->ReadInteger( "Form","Left",100);
  Caption=MyIni->ReadString( "Form","Caption","Default Caption");
}
//-------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  //將變數寫入 ini 物件
  MyIni->WriteInteger("Form","Left",Left);
  MyIni->WriteString("Form","Caption",Caption);

  // 釋放 ini 物件
  delete MyIni;
}
//-------------------------------------------------------

■ INI 物件的生命週期

在上面的程式碼中,可以看見我們把 INI 物件的建立寫在 FormCreate 事件中,而釋放 INI 物件則寫在 FormClose 事件中;事實上,變數真正寫到實體檔案中,是在INI 物件釋放的時候(也就是類似關閉檔案動作);平常則只是暫存於記憶體中,如此可減少磁碟 I/O 動作,但若程式不正常關閉,則INI 物件來不及將暫存於記憶體中的變數存檔,會導致欲存檔的變數遺失;所以為保險起見,我們可在準備寫入變數的時候才去建立 INI 物件,存入後馬上釋放 INI 物件以確保寫入實體檔案中,但這樣卻會增加磁碟I/O讀寫頻繁,其中的斟酌端看應用方向的特性。

//-------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TIniFile *MyIni;
  MyIni = new TIniFile(ChangeFileExt( Application->ExeName, ".ini" ) );

  MyIni->WriteInteger("Form","Left",Left);
  MyIni->WriteString("Form","Caption",Caption);

  delete MyIni;
}
//-------------------------------------------------------

2009/03/13

史瓦濟蘭前外一章

星期六原本要去史瓦濟蘭

在第二次的複診中,醫生提到我的血液檢查結果是沒有A、B型肝炎抗體,也沒有抗原(也就是還沒得病的意思),建議我打A、B型肝炎的二合一疫苗


雖然不清楚費用要多少,但以自費的慣例來看,沒有破NT2000應該是不可能

而且,這也不在這次去史瓦濟蘭的事前重要準備項目之一,所以就向醫生表示沒有施打的意願


在這之後…醫生一直強調這個疫苗只有台大有,一般坊間是沒有二合一的(REPEAT*n)

還直說沒打會後悔等類的話

(事後去找了才發現,連署立醫院都沒聽過有這二合一的疫苗,可見這藥是很新的(一定更貴)

而且這次我還遇上了全台A肝疫苗大缺貨,有錢也買不到的疫苗…至此,我還真有點後悔…)


在會診結束之後,醫生就說我如果要去一般醫院,建議我去印診斷報告


到底要印什麼咧?是只要印血液檢查報告呢?還是連醫生的手寫稿也要呢?

這個問題除了我要去的醫院(診所)知道外,我看全台大也沒人知道


為了避免還要再來一趙,所以也就一併把醫生的手寫病例給申請了出來



不申請還好,一申請……


老闆生氣了...........................................
除了被叫去老闆室落鑽外,去到當地還被冷嘲熱諷……
一整個小心眼的老闆啊……

2009/03/07

行前的健康檢查

最近為了到史瓦濟蘭出差,還得千里迢迢地跑到台大去做健檢

在經過無止境的排隊、等待…只得到3分鐘的問診時間…

我說啊…這c/p值也太低了吧!

從鄉下來的我,除了只會騎車外,很少坐其它的交通工具
坐捷運時,拿著感應幣在入口刷半天進不去 @@
在那邊卡了30分鐘,只看到其它人拿著藍綠相間的卡刷一下就進去了,為什麼我還在入口處不得其門而入呢?

站務人員終於看不下去了,走過來大聲地向我說
「先生!卡片要放到螢幕下面的那個感應器才會有效果!」

呃…原來科技還沒這麼先進哦!
就這樣,沒坐過幾次捷運的我,終於在此時此刻用力地把這個「關鍵」地步驟記了起來…
(突然很想去野外趕羚羊…)

雖說坐捷運就很頭痛了,但還不如坐火車,月台、時刻、對號、車別…
光是買票坐火車就讓我一個頭兩個大,尤其是這諾大的台北車站
先投錢再按按鈕?還是先按鈕再投錢幣?
身為台北俗的一員,這30分鐘我依然沒放過…

好不容易,終於出票了,拿起票券,上面寫著:

19元。

我記得我是投20元吧,怎麼還有壹元沒掉下來?難道是退到別的地方?
出票 / 退幣口
沒錯!依然是這個地方!
於是我又在售票機這邊挖挖挖、等等等

我的壹圓~~~~~~~!!!

這是上天懲罰我搭訕美女醫生的罪孽嗎!我下次不敢了! ><

於是,我懷著贖罪的心情,離開了這萬惡地售票機
好在,台鐵的入口只有臭臉剪票員,沒有趕羚羊感應器

「那個,請問這張票要去哪個月台?」我說
「嗯嗯…這個就是第3月台。」
「那下班車什麼時候會到呢?班次在哪邊可以看到?」
「……」
剪票員不耐地指著上面的電子看板說:
「上面這個……(你自己不會看哦)……就是這班自強號啦!時間哦,還剩一分鐘車就要開了,趕快去!」
於是,我又被趕羚羊了,今天我跟野生動物還真是有緣
上了月台,怎麼兩邊都有火車!我是要坐哪一台!怎麼會沒有往北往南的指標!
時間不容我再考慮了,於是我就直覺的選了一台坐上去

「Excuse me!」

一位金髮正妹跑了過來

「This......」她拿著手上的票券給我看,並且指著我坐上的火車

票券上寫著:台北 - 嘉義

雖然我不是要去嘉義,只知道如果這班車是往南,就一定會到嘉義

於是我便不假思所地說:
「YA!!!」

隨後便進車廂內找位子了,過了不久,看到那位金髮正妹也上了車

「糟,我自己也不知道這班車是往北還是往南,如果是往北怎麼辦…」

內心的徬徨與不安擁上心頭,一直到火車啟動…

過了許久後,終於到了下一站,熟悉地廣播聲響起…

「本站是板橋站,請……」

沒錯!這班車是往南!我猜對了!
終於可以放下心中的不安,在這短短地旅程中,可以放心地小瞇一下了!

放下心中的不安,身心獲得了舒展,睡吧,可憐的孩子

火車再度出發,就快結束旅程了
能夠幫助別人,真是一件快樂地事情,真是令人開心

………………
廣播再度響起,我也準備要下車了。

「各位旅客,現在即將抵達的是本列車的終點站:樹林站,本列車將於………」

我有沒有聽錯!這站是終點站!!!

國語、台語、客語、英語…重複聽了八遍,我確定台鐵沒說錯…而我,也沒聽錯…

「真是丟臉丟到家了!」我心裡吶喊著

滿懷著不安,歉咎的心情,開了門之後,我似沒了命地逃出了車站

「對不起!我下次再也不亂說話了啊啊啊!」

不知道那個老外後來有沒有順利去到嘉義了。
(本篇完)

2009/03/05

要去史瓦濟蘭了!

我不想去!

一句話,一個跟案子只扯上10%的小工程師,就這樣準備到史瓦濟蘭去了。

我也不想去啊…

但,又能怎辦呢?老闆不是我,家裡還有 7 小要照顧…

「喀噠!」(骨拆聲)

所以只好為2斗米腰斬了!(泣)

究竟史瓦濟蘭是什麼樣的地方呢?

一、台灣的邦交國
二、愛滋病大國(全球平均最短命的國家之一)
三、季節性虐疾產出!(傳說蚊子跟手掌一樣大)
四、一定要煮沸才能喝的水(水裡都有血吸蟲)

……這是什麼國家啊……
一整個亂七八糟……
雖說只要潔身自愛點,這些病也不是這麼容易就可以得到,但,真的讓人覺得恐怖

尤其是腸胃特別差的我,看來是去幾天拉幾天了……

能不能不要去啊啊啊~~~~~~~~~~~~~~~~~~~~~~~!

2009/02/19

Using critical sections

話說BCB在執行緒中有同步的指令,但這是應用在VCL元件上面,在不用到VCL的埸合時,我們就可以利用「Critical Sections」來對多執行緒做排序處理,以下是從BCB的help中節錄出來的:

If objects do not provide built-in locking, you can use a critical section. Critical sections work like gates that allow only a single thread to enter at a time. To use a critical section, create a global instance of TCriticalSection. TCriticalSection has two methods, Acquire (which blocks other threads from executing the section) and Release (which removes the block).

Each critical section is associated with the global memory you want to protect. Every thread that accesses that global memory should first use the Acquire method to ensure that no other thread is using it. When finished, threads call the Release method so that other threads can access the global memory by calling Acquire.

Warning: Critical sections only work if every thread uses them to access the associated global memory. Threads that ignore the critical section and access the global memory without calling Acquire can introduce problems of simultaneous access.

For example, consider an application that has a global critical section variable, pLockXY, that blocks access to global variables X and Y. Any thread that uses X or Y must surround that use with calls to the critical section such as the following:
pLockXY->Acquire(); // lock out other threads
try
{
  Y = sin(X);
}
__finally
{
  pLockXY->Release();
}

將存很久的草稿拿出來潤一下

哈哈
看起來一星期沒更新了,事實上是存成草稿了

上星期還發生了斷後照鏡事件
以及深坑、石碇之旅
有時間再來回顧一下唄~~呵呵

2009/02/18

太慢太慢!太慢了啦!

話說前一陣子買了一顆900的前輪,心裡毛毛的
今天早上因為下雨,實在的怕死的小寶騎得非常慢

慢到小公主都趕不上火車了,因為原本10分鐘的車程,騎了20分鐘

「真慢!會不會太誇張了!」
小公主生氣了。

在沒有趕上火車的小公主氣憤難耐,打電話來「客訴」

可真是任性的小公主啊

「我可是因為擔心摔車才會騎這麼慢的咧。」我說
「那你為何就不能跟別人騎的一樣呢,別人就不是買比你還便宜的買菜胎嗎!」
「……」

真是一千萬個無言啊……

2009/02/12

GPS...真難決擇…

最近看到家樂福在出清 Garmin nuvi 200 (NT 2990)
想說去買一台,這樣搭配景點書,就能開心地帶著小公主四處趴趴走

想不到逛了兩家,都只剩展示機,而且還…
1. 少配件(無傳輸線及充電器)
2. 外觀嚴重刮傷

…這樣叫我怎麼買得下去

手邊還有台ipaq…1930 古早機,如果買了gps,這樣家裡又多了一台展示機,一整個很敗家…

還是買顆SDIO的GPS吧,這樣我的PDA就有生存下去的空間了

一顆要價6張小朋友……

我我我……還是再繼續觀望吧……

2009/02/11

Firebird 不支援 TRUNCATE TABLE 指令

來源:http://www.firebirdnews.org/?p=2075=1
以下節錄:

Few notes about level of support of TRUNCATE statement in Firebird :

a) as we have no IDENTITY we can ignore and all related rules
(Syntax rule 4, Genereal rule 8)

Firebird中沒有IDENTITY,所以不用找了 (笑)

b) Syntax rule 2 means TRUNCATE TABLE is not applicable to VIEW’s

TRUNCATE TABLE 不能用在VIEW's

c) Syntax rule 3 means truncated table must not participate in FOREIGN KEY constraints as
master table.
ORACLE relaxed this rule and allow self-referenced constraints. I think we can follow it.

d) as we have no subrows we can ignore General rule 5

e) it will be good to implement TRUNCATE privilege to satisfy Access rules but for the first time
we can allow to TRUNCATE table only for SYSDBA and OWNER.

Firebird資料庫有優異的TRUNCATE存取規則,但初步我們只開放「SYSDBA」和「OWNER」有TRUNCATE權限。

ORACLE used DROP TABLE privilege to control usage of TRUNCATE TABLE statement, while MSSQL used ALTER TABLE privilege.

From the implementation point of view i have some concerns. All the code which released
table’s and indexes pages without removing relation itself is already present. It may require
some small changes but i see no problem with it.

The main concern is about rollback’s (or undo). If we will perform TRUNCATE TABLE as usual
DML statement, i.e. not defer it to transaction commit time, then we must implement support
for undo-log. Also we must decide if we will preserve truncated contents for older still active
concurrent transactions. And specify when this content will be erased finally.

Another approach is to require exclusive lock on table when TRUNCATE is issued (to prevent
any concurrent access to table’s data) and to defer TRUNCATE execution to the commit time. It
allows us to not preserve table contents for the indefinite time and to avoid complex manipulations with undo-log.

Note, ORACLE can’t rollback TRUNCATE statement. MSSQL 2005 don’t log truncation of big
objects and defer physical deallocation until commit time. All pages remains locked until commit
so no concurrent access to truncated data is allowed, AFAIU. IIRC, MSSQL before 2005 also can’t
rollback TRUNCATE statement.


看來是為了安全性的考量…

(20090429修改--始)

Firebird說明仍能有條件地使用 TRUNCATE 指令

但我怎麼樣都試不出來……

(20090429修改--完)

要刪資料?只能慢慢刪或重建table了…Orz