發表文章

目前顯示的是 2019的文章

coldfusion component (CFC) 另一種用法

圖片
一般 CFC 的寫法大概會像上面這樣: 而呼叫方式如下: <cfinvoke component= " COM.extfunc " method= " myescape " returnvariable= " escstr " >     <cfinvokeargument name= " sdata " value= "# myForm.note #" > </cfinvoke> <!--- 返回 escstr ---> <cfoutput> #escstr# </cfoutput> 上面這種方式屬於純 TAG 寫法,寫起來超麻煩,尤其參數很多時就會寫出一堆  <cfinvokeargument>,真是快昏倒了。 其實,也可以使用創建物件方式來使用這個 Component,會方便許多。 我們把上面的 cfc 改成下面方式 <cfcomponent displayname= " extfunc " hint= " 擴充功能 " >       <cffunction name= " Init " access= " public " returntype= " QueryUtility " output= " false "            hint= " Returns an initialized QueryUtility instance. " >           <!--- Return This reference. --->            <cfreturn THIS />       </cffunction>       <cffunction name= "myescape" access= "public" returntype=

Coldfusion 隱蔽式下載

圖片
一般下載時,通常會使用 <a href="URL" /> 這種方式使用者下載,而 URL 大多的做法是指明檔案所在的位置例如  <a href="http://MySite.com/download/picture/myPicture.png">。 這種方式有幾個問題: 1、如果使用者取得此聯結位址後,可以單獨由此取得檔案或盜連,故被直接拿到的風險會很高,因為這個 URL 就是一個開放的位址。 2、由於直接指定檔案位置,很多時候檔案就會被瀏覽器直接開啟,而非下載存檔,對於大部分使用者來說,這是一個貼心的模式,但是對於很多需要下載的商業用途場合就很麻煩,使用者還必須在聯結上按『右鍵』選擇『另存檔案』的方式,操作相當不便。 3、無法設定檢查使用者取得檔案的條件。 因此,透過隱蔽式下載就是一種很好的方法。 程式碼: < cfsetting enablecfoutputonly = "yes" > <!--- 避免下載檔案遇到中文檔名無法正常下載問題而使用的功能,也可以避免使用者知道實際檔案儲存位置 ---> <!--- Arguments : file = 指定檔案名稱 ---> < cftry > <!--- 判斷使用者來源聯結是否來自本伺服器 或是直接下載,當直接下載時 REFERER 會是 空值--->     < cfif findnocase (CGI.SERVER_NAME,CGI.HTTP_REFERER) LTE 0 >     < cfthrow type = "RefererError" message = "#CGI.HTTP_REFERER#:不允許存取" >     </ cfif > <!--- 判斷參數是否存在 ---> < cfif not isdefined ( "file" )>     < cfthrow type = "Arguments" message = "

凹凸世界 - 艾比 的裝備 - 草稿圖

圖片
這是凹凸世界裡的角色 - 艾比 的相關配件,純粹幫忙畫稿 角色介紹: 看這裡 艾比的翅膀 - 出場機會太少目前只有一幕,只能放慢動畫,慢慢畫出來 QQ 艾比的武器 - 弓與箭

Coldfusion (Railo 3.3.4)使用 POI 元件 寫出 XLSX 檔案

圖片
補充前一篇  Coldfusion (Railo 3.3.4) 使用 POI 元件 讀取 xls/xlsx 修改記錄 我在 POIUtility.cfc 內加入一個 Function 用來處理寫出 XLSX 格式檔案 cfc 程式碼(增加): <!--- 自訂寫出 XLSX 的 EXCEL 檔案--->     < cffunction name= "WriteExcelX" access= "public" returntype= "void" output= "false"         hint= "Takes an array of 'Sheet' structure objects and writes each of them to a tab in the Excel file." >         <!--- Define arguments. --->         < cfargument             name= "FilePath"             type= "string"             required= "true"             hint= "This is the expanded path of the Excel file."             />         < cfargument             name= "Sheets"             type= "any"             required= "true"             hint= "This is an array of the data that is needed for each sheet of the excel OR it is a single Sheet object. Each '

Coldfusion (Railo 3.3.4) 使用 POI 元件 讀取 xls/xlsx 修改記錄

圖片
這是配合 上一篇 『 Coldfusion直接讀取/產生Excel檔案 (使用POI元件) 』進階改版 主要原因是 上一篇 的功能只能讀取 XLS檔案,但是對於XLSX卻沒有辦法處理。 如果升級 POI的版本到最新版,會造成 RAILO 內建的 Apache 無法支援該套件版本。 經過一翻苦戰,終於搞定如何處理: 首先,RAILO 3.3.4(註一) 以後因為有支援 cfspreadsheet 指令,所以內建了 POI 套件,但是這個指令僅能處理 XLS 檔案,所以可想而知這個套件是非常陽春的,更不用說要能夠讀取 XLSX 檔案了。

12V LED 電壓設計

圖片
因為有不少朋友問道: 使用電壓 12V下 LED 的電路設計如何處理,所以這裡我簡單的講解一下電路上的設計方式好了。 其實這是基本電學複習,沒有很特別,讓一些不太懂電學朋友參考。 一般我在設計車用LED電路時,對於LED的電路大概會用下面的方式,當然有的人會使用多少LED來串連是事情況而定,沒有絕對。 Figure 1: R1 = (12 V - (1.6 Vled x 2)) / 15 mA = 0.5866... ≒ 580 Ω (可以買到的電阻) Figure 2: R2 = (12 V - (1.6 Vled x 3)) / 15mA = 0.48 ≒ 470 Ω (常用電阻) Ω 也可用 Ohm 表示,唸成『歐姆』 這裡有幾個要注意的地方: 1、LED 的電壓,LED 是一顆二極體,電壓順向時有一定的偏壓存在,發光 LED 因應顏色不同,其化學材料也不同,所以每一家生產的 LED 也會有不同的偏壓,最好使用時要使用同一家且同一種型號的 LED 比較不會燒壞 LED。我使用的 LED 偏壓大約 1.6 V,所以計算時我註記成 1.6 Vled。 2、一般 LED 的電流( 這裡指 5Φ 左右的 LED ),可以承受到 25 mA,但這個電流值幾乎接近熱衰竭電流(也就是在這個電流下 長時間 工作會讓 LED 內的材料受熱損壞),所以通常我們都會設計在 15 mA ~ 20 mA 左右,以維持 LED 壽命。 3、在這電路上 Q1、Q2 作為 SWITCH (開關) 使用,CE 導通偏壓約莫 0.7 V,通常我會忽略不計。 4、電阻 瓦數可用 1/4W (0.25W) 大小, 依照 P=VI ,Figure 1 上的電阻偏壓約 8.8 V 所以 W = 8.8 V x 15 mA = 0.132 W,1/4W足夠使用了。 5、如果 LED 發光不同不建議串接使用,會發生偏壓較大的 LED 反而不太亮的問題,如果有不一樣顏色的 LED 建議單獨使用不同的電阻來偏壓。

檔案編碼轉換小工具

圖片
檔案: FileEncode.exe 運行環境: .NET 2.0 Runtime 注意,這是編碼轉換,不是翻譯喔!! 某些時候在一些新舊系統文件上就是會遇到編碼文件需求不同而傷腦筋,在某些舊程式上就是如此,也無法再改動或是更新等問題,文件本身的編碼就會導致文件交易相當不順暢。 這支小程式就是用來解決這些問題的。 但要注意的是,UNICODE萬國編碼的文字一定會比舊式編碼大得多,可能會遇到某些文字無法轉換問題,例如簡體中文(GB)轉繁體中文(BIG5)。 對於英數字文件轉換是有一定實用性的。 通常新系統會使用UTF-8編碼,舊系統會使用 BIG5編碼/ANSI編碼/ISO8895-1編碼之類的。 我這邊最多用到的是 BIG5 (950) 轉 UTF-8 (65001) 需要用的自己下載去玩吧。 下載點 使用方式: 編碼類型: 37 - IBM037 437 - IBM437 500 - IBM500 708 - ASMO-708 720 - DOS-720 737 - ibm737 775 - ibm775 850 - ibm850 852 - ibm852 855 - IBM855 857 - ibm857 858 - IBM00858 860 - IBM860 861 - ibm861 862 - DOS-862 863 - IBM863 864 - IBM864 865 - IBM865 866 - cp866 869 - ibm869 870 - IBM870 874 - windows-874 875 - cp875 932 - shift_jis 936 - gb2312 949 - ks_c_5601-1987 950 - big5 1026 - IBM1026 1047 - IBM01047 1140 - IBM01140 1141 - IBM01141 1142 - IBM01142 1143 - IBM01143 1144 - IBM01144 1145 - IBM01145 1146 - IBM01146 1147 - IBM01147 1148 - IBM01148 1149 - IBM01149 120

FirebirdSQL 新增資料庫使用者與資料表權限

圖片
Firebird 資料庫有個最高權限的 SYSDBA 帳號,正常上線使用下最好將它的密碼進行變更,然後再新增一個使用者並賦予資料表的權限,這樣比較安全。 這些調整指令都透過使用 isql 介面來完成 ※注意,使用 isql 調整資料庫相關設定前,先把 Firebird 服務/引擎 先關閉,以免發生占用衝突。 假設我們資料庫是在 D:\NEWDB\test.fdb 首先,變更 SYSDBA 的密碼 C:\FB3>isql -user SYSDBA D:\NEWDb\test.fdb↵ Database: D:\NEWDb\test.fdb, User: SYSDBA SQL> ALTER USER SYSDBA password 'mustKey';↵ SQL> COMMIT;↵ SQL> 這樣就把密碼變更為 mustKey 了 (注意,Firebird 對帳號沒有大小寫分別,但是密碼有分別) 一、新增使用者 SQL> CREATE USER user01 password 'userPass01';↵ 或是創建時同時賦予角色權限(例如管理者權限) SQL> CREATE USER user01 password 'userPass01' GRANT ADMIN ROLE;↵ ※參考  SQL user management commands ※參考  ROLE ※參考  The RDB$ADMIN role 二、對使用者賦予資料表權限 假設我有一個資料表 EMPL SQL> GRANT SELECT , INSERT , UPDATE ON TABLE EMPL TO USER user01;↵ 這代表我只賦予 user01 對 EMPL 只能操作 SELECT、INSERT、UPDATE 三種權限。 基本上,資料表操作權限只有 SELECT、INSERT、UPDATE、DELETE、REFERENCES 這四種,要 CREATE/DROP/ALTER 資料表只能由 SYSDBA 來做。 REFERENCES 這權限是用來讀取資料表的 關聯 資訊(foreign key)的。

FirebirdSQL 以單次執行

圖片
這個是繼 上篇文章 之後,如果不希望這資料庫一直以服務狀態執行,而是希望 Client App 啟動時才執行的方法。 其實,就跟前一篇一樣的設定,就是不要做 install_service 的動作。 只是有幾個要先做的步驟還是少不了 一、要註冊 Firebird  到 Register 裡面 執行 instreg,這個動作在一部 電腦只需要做一次就好 D:\FB3\instreg install -z 二、在客戶端程式執行時 啟動 Firebird 引擎 呼叫方法大致分兩種 (1) 經典模式 D:\FB3\firebird -a (2)超級伺服器模式 D:\FB3\firebird -a -m ※兩種模式參考 說明書 其實在 Windows 下這兩種模式都差不多,選擇一種就可以,啟動後可以在工作列圖式看到這個圖案。 這個引擎會一直開著直到 Windows 關閉為止,或是手動 Shutdown 它。

FireBirdSQL 小型(崁入型)資料庫 初探、下載、建立、設定

圖片
常常會有些時候,開發一些工具程式會需要自帶資料庫的時候。 在10年前,那時候最好的一些開發工具選擇可能還是 Foxpro 吧。 但是自從微軟不再對 Foxpro 做更新時,就已經是末路之流了。 近年來,桌機上的商用主流依然是 Windows 無誤,開發工具從我孰悉的 powerbuilder 漸漸轉向了 C# 。 雖然 powerbuilder 沒辦法使用 Embedded Database ,然而業務開發又需要提供具有資料庫能力的『單機版』程式,雖然說是單機版,但實際使用上通常都會在 3 ~ 5人左右的程式。 因為公司是希望開發好的程式/資料庫可以打包一起,然後是由不是很懂 IT 的業務人員去客戶那邊安裝(最好能一鍵安裝或傻瓜安裝就搞定)的。 MS SQL express 是不錯的選擇,但是太過肥大,安裝又是囉哩叭縮,要包成自動安裝難度太高,如果又要網路共享需要比較懂得人才有辦法去設定啊,也不是一般業務人員可以搞定啊。 雖然,MySQL、 、MariaDB 也是不錯,但還要安裝 ODBC 來分享這也不好搞的。 SQL lite 太過單機,小型群組分享資料庫是做不到了,還得透過 API 指令。 Access DB、Excel table 等太過精簡,操作一個不小心未正常關檔,檔案就掛了,欲哭無淚。Excel table 資料庫沒有加密,等於裸奔狀態。 游網之餘,看到了這個 FireBirdSQL ,其前身是 Interbase 也算元老級的,但支援小群組共同使用,支援加密、StoreProcedure、可以當 Embedded DB 也可以當 C/S 資料庫,雖然效能不怎樣,但是這樣在小程式上真的綽綽有餘,所以趕快來研究看看吧。 FireBirde官方網站 一、下載主程式 本篇討論使用的是 Firebird 3.0.4 版  ,由於需要能夠被打包所以就下載這個 ZIP 壓縮檔版本 為什麼下載 32-bit 版本? 因為沒辦法保證客戶使用的 Windows 平台是 64-bit 的,所以保險起見就用 32-bit 來執行。 下載 ZIP 檔案回來後解壓縮後(通常會放在 C:\FB3 ,實際依需求去放),就可以開始設定了。 二、建立一個放資料檔案的路徑 (我的範例是 D:\NEWDB) 三、建

小工具開發 - 檔案實序排定器

圖片
最近遇到某些音樂播放器,由其是SONY的車用音響,都出現了這個問題,就是它根本不照我們放置檔案的順序或是其他排序方式(時間)去撥放。而這支程式就是用來重建他的檔案順序用的。 At some Sony music players or car audios,  it read mp3 files order is not follow filename sort or otherwise sort on the USB drive. This program will regenerate file order to the right! 假如我有一個USB隨身碟資料夾,裡面的檔案清單就如下面這張圖: 在 Windows 檔案總管下,看起來就是上面這樣子的,因為檔案總管會預設以檔案名稱來排序,正常得情況我們在 Windows 的播放軟體也會依照這個規則來執行。 然而,目前我在SONY音樂播放器上遇到這個播放順序的問題,它是照下面這種順序去撥放的: 比較前後兩張清單後注意到了嗎? 第二章的清單順序根本不知道它是依循啥麼的啊??事實上這就是我在 SONY音樂播放器上遇到的問題。 經過不斷的檢查後發現,原來第二張的檔案順序是在 FAT 表上的出現順序啊!!!!! 這啥鬼? 原來 SONY 音樂播放器是直接照 FAT 表讀出的檔案順序來播放音樂的,無怪乎我怎麼改檔案名稱,或是檔案時間都沒有用。 要是按照這種方式播放的話,如果要整理檔案,就得把 MP3 檔全部 移出 USB 隨身碟後,再依順序一個一個拷貝(搬移)回 USB 隨身碟。 真是天殺的,如果 USB 隨身碟有滿滿 16 GB音樂檔,那不就搬到天花地老了。這個會死人啊,老兄。SONY,我真服了你們了,東西又不便宜,程式卻寫得這麼爛,真不像 SONY 的產品啊。 索性,自己寫一支程式,專門來做檔案順序『重建』就可以保證在 FAT 上是依照自己訂的順序來跑了。 有興趣的就自己下載看看: 下載檔案/原始碼 這是用 dotNetFramwork 4.5 製作的,所以要執行的話,電腦至少要能支援 dotNetFramwork 4.5 ,或是到 這裡下載 。記得選擇您使用的語系再安裝。 程式載點 (Google drive) 原始碼載點 (Gith

Arduino 控制 - 使用 L293D 來驅動馬達

圖片
L293D 式一顆用雙路直流馬達的控制器,用這顆 IC 可以用來驅動一般的小型馬達/玩具馬達之類的,相當方便。 其內部結構大概就是一個 4路半H橋式驅動電路。 Pin 2 與 Pin 7 屬於一對,Pin 10 與 Pin 15 也屬於一對。 Pin 1 與 Pin 9 雖然做為 Enable 接腳,但是也可以輸入 PWM 訊號來控制馬達出力的力度。 Pin 8 是提供給馬達的電力,可以獨立供給,也可以和 Pin 16 的 Vcc 共用。 底下是利用 Arduino 做的簡易的控制電路: 藍色 LED 是用來觀察 PWM 的強度用的,可以不接。 我這邊另外用 9V 提供給 L293D 來驅動馬達,速度會比較快。 程式碼方塊如下: 程式源碼如下: int counter; int counter2; void setup() {   pinMode(3, OUTPUT);   pinMode(5, OUTPUT);   pinMode(6, OUTPUT);   pinMode(13, OUTPUT); } void loop() {   analogWrite(3, 255);   digitalWrite(5, HIGH);   digitalWrite(6, LOW);   for (counter = 0; counter < 5; ++counter) {     digitalWrite(13, HIGH);     delay(500); // Wait for 500 millisecond(s)     digitalWrite(13, LOW);     delay(500); // Wait for 500 millisecond(s)   }   analogWrite(3, 64);   digitalWrite(5, LOW);   digitalWrite(6, HIGH);   for (counter2 = 0; counter2 < 5; ++counter2) {     digitalWrite(13, HIGH);     delay(500); // Wait for 500 mill

LED流水燈(方向燈)-電路實驗

圖片
最近看到不少新車的方向燈都配備有流水燈的效果,想說興致來潮,做一個這樣的電路試試看。 這樣的電路當然可以用 attiny85 來做,只是手頭沒有 attiny85 所以就利用傳統電路來製作,順便解析一下原理。 點亮順序原則就是 L1 → L2 → L3 → L4 ,這個週期時間必須在方向燈點亮時間內跑完,推估大約在1秒左右吧。 L1 首先點亮,沒啥技巧,R1、R2 分壓直接給 P3055LDG 閘極偏壓,導通後點亮 L1。 L2大約延遲 0.3 秒點亮,且點亮後維持住,所以這裡我用了 SCR 來控制,時間由 R4、C1 來決定,依照 RC 充電到 63% 大約一個 t 時間。 RC時間常數 = R x C = 10k x 33uf = 0.33 秒 當RC充電到63.2%時,觸發 SCR 導通,R5上出現 較高電壓(接近VCC),藉此導控制 L2 的MOSFET,此電壓並帶往下一個 RC,並觸發下一個 SCR,依此類推,下一個 LED於 0.3 秒後後亮起。 當方向燈停止供電後,SCR 狀態恢復(釋放),待下一次供電啟動。 ○至於模擬方向燈閃爍的電路,就用 555 來完成,如下圖: 555 的第三接腳直接供電給流水燈電路的 VCC ※※請注意,以上電路為模擬電路,使用的電壓為 5V,如果要用在汽車上,部分電阻值需要更動,LED 與其限流電阻部分,可以用 LED 排燈,或是 COB 燈 + 適當限流電阻, P3055LDG 有足夠驅動能力,要注意 P3055LDG背部必須靠電路板的銅箔散熱。

Sybase 資料庫發生 Error: 644, Severity: 21, State: 1

通常此錯誤都是 索引損毀造成,在非資料庫伺服器等級機器上容易出現,官方說法通常是硬體問題引起,但實際狀況不一定。 Error: 644, Severity: 21, State: 1 後通常還會接這樣訊息: Index row entry for data row id (11316867, 0) is missing from index page 11405926 of index id 5 of table ' myTable ' in database ' CURDB '. Xactid is (7099705,6). Drop and re-create the index . 雖然 官方說法 建議使用 dbcc checktable 或是 sp_fixindex 來處理,但是效果不理想,建議還是重建比較好。 但是怎麼知道錯誤是哪個索引檔呢? 先用 sysindexes 列出全部索引 select si.* from sysindexes si,sysobjects so where so.id = si.id and so.type = 'U' and so.name = 'myTable' go 然後錯誤訊息指名 index id 5 ,所以找到欄位 indid 為 5 的索引名稱 'CUST_IDX'。 接下來就是 DROP 索引 drop index myTable.CUST_INDEX go 再來重建,由於此索引不是主索引所以下面使用 nonclustered 建立 create nonclustered index CUST_IDX on dbo.myTable (column1,column2,column3....) on 'default' go ※如果該資料表資料量很大,依照機器速度可能會花上半天左右。 參考: How to find Index List in a Sybase database? Error 644 - Sybase Infocenter