發表文章

自製簡易混音器

圖片
最近因為公司給了一個會場音控的任務而需要用到混音功能,但是市面上的混音器最便宜也要3000左右,而且接頭都不是3.5mm的音源孔,因為我的音樂來源是3部筆電,也不想買一堆轉接頭。公司也沒經費補助的情況下。遂想說手頭還有一些零件與OPA可以利用,所以就自製了簡易的混音器來使用,雖然手邊的OPA不是啥高音質的IC但是拿來撐場面應該綽綽有餘。 先構想一下架構 這個架構前面先用個加法器來完成初級混音,然後再分割耳擴(監聽)與輸出,然後再加個VU表監看輸出量,電力的部分我不想搞雙電源,因為太麻煩了,而且手上有12V/1.2A交換式變壓器,想直接利用。 接下來就準備細分電路了。 第一部分:混音電路(OPA加法器) 第二部份:耳擴與輸出(電路相同) 第三部份:VU表電路 以上參考不少其他網站的電路,但是很多都是設計成雙電源,也因此修改了一些部份設計。 接下來,開始製作電路部份 還是很苦力的用洞洞板來完成,哈! (因為個人不太想碰藥水) 連接部份都設計成接頭形式方便日後維護。 再來製作外殼,這真是折煞的工作,誤選了鐵殼來製作,下蓋是鋁製比較好施作,上蓋卻是很硬的鐵製品,搞得全身酸痛,光是挖LED排燈的孔就累死了(銼刀一直挫挫挫⋯⋯ 內部樣式: 接下來就是要開始連接各VR的電線了(還真是多的不像話啊) 最後蓋上上蓋,完成,GOOD JOB! 背後的樣子 還沒有時間測試,改天再來測試看看。 ======反應部分網友回覆=================================== 我使用的輸入/輸出用的是3.5mm立體聲接頭/插座,一般安裝在外殼上的是下面這種(黑色),他的R/L接法如下: 不要買到白色的喔,白色是單聲道,只有R聲道: 另外,我的總音量是下面圖片這一顆,日本製(蠻貴),有中間抽頭(在畫面最左邊那組就是中間抽頭),中間抽頭在這次電路沒用到,且這顆VR有段(轉起來有一節一節的感覺),這樣音量定位比較明確。 關於NE55322接腳 關於VR(音量可變電阻): 這種可變電阻,是兩個VR串在一起,又稱連動式可變電阻,通常用於音量控...

C# 取得程式路徑

因為工作的關係需要開始使用C#,所以就從這邊開始紀錄一些C#的使用方式吧。 (發現年紀越大,學的東西如果不筆記起來就很容易忘了啊啊啊冏) A.取得和設置當前目錄(即該程序從中啟動的目錄)的完整路徑,這個設定會受到 Startup Directory(環境變數:起始目錄)的影響,通常像是排程或是DEBUG都會有這種設定。 string dir = System.Environment.CurrentDirectory; 結果: C:\Project\MyApplication1 B.取得啟動應用程序的執行檔案的路徑,不包括可執行檔案的名稱,通常也是程式真實位置,不受到 Startup Directory(環境變數:起始目錄)的影響。 string dir = System.Windows.Forms.Application.StartupPath; 結果: C:\Project\MyApplication1 C.取得應用程序的當前工作目錄,這個設定會受到 Startup Directory(環境變數:起始目錄)的影響,通常像是排程或是DEBUG都會有這種設定。 string dir = System.IO.Directory.GetCurrentDirectory(); 結果: C:\Project\MyApplication1 D.取得當前 Thread 的當前應用程式所在的根目錄(尾部帶有\),通常也是程式真實位置,不受到 Startup Directory(環境變數:起始目錄)的影響。 string dir = System.AppDomain.CurrentDomain.BaseDirectory; 結果: C:\Project\MyApplication1\ E.取得和設置包含該程式的目錄的名稱(尾部帶有\)。 string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase; 結果: C:\Project\MyApplication1\ F.取得啟動應用程式的可執行檔案的路徑,包括可執行檔案的名稱。 ...

CFLOCK多人共用資源鎖定/獨占

WEB是個多人共用的執行環境。 好處是多人多工執行緒,不會互相干擾。 缺點是同時搶資源時處理上就很傷腦筋。 什麼叫『搶資源』,白話說搶票啦,簡單說就是希望讓多人執行可以排隊做"某件事"。 假如資料庫裡面有一個表Tickets,裡面裡面有500筆資料,每一筆都是獨立票號。 當客人要來取票時,系統會找出Tickets裡面沒有被使用的票號發給客人。 所以程式碼會寫成: <cfquery name="check1" datasource="SQLDB">  Select top 1 tick_no  From Tickets  Where tick_used = 'N' </cfquery> <cfif check1.recordcount GT 0>  <cfset newTicket = check1.tick_no>   <cfquery name="update1" datasource="SQLDB">   Update Tickets   Set tick_used = 'Y' , cust_id = '#LoginCust#'   Where Tick_no = '#newTicket#'  </cfquery> </cfif> <cftransaction action="commit" /> <cfif isdefined("newTicket")>  <cfoutput>You Got Tick No : #newTicket#</cfoutput> <cfelse>  <cfoutput>No More Tickets can get !</cfoutput> </cfif> 邏輯上看似沒有問題,但是請別忘記WEB是多人操作的, 結果就發生同時有2個人很湊巧的同一秒鐘按下取票, 因此上面程式碼就被兩個執行緒同時...

powerbuilder匯入(讀取)檔案時的注意技巧

圖片
先看看下面一段程式碼: ls_path = "C:\inetpub\ftproot\upload\custOrder.txt" do while FileExists(ls_path)    yield() loop dw_1.importFile(text!,ls_path) // next , processing dw1 row data FileDelete(ls_path) 這是一個讓客戶用FTP上傳檔案後,並讀取檔案內容,處理後便把檔案刪除的作業,邏輯上是合理的,絕大多數的情況下也是沒有問題的。 但是偶爾發生了客戶資料沒有處理的問題,客戶也說明明就上傳成功了,FTP傳輸日誌有出現傳輸成功的指令,但,為什麼卻沒有處理到資料? 這段程式碼持續使用迴圈檢查檔案是否生成,只要檔案出現就進行讀取。 這看起來沒有錯,但是卻常常發生檔案讀出空白或是不完整的情況。 為什麼會這樣? 最大問題出在『時間差』,也就是檔案名稱產生的時間和檔案內容產生的時間有時間差異存在。檔案越大這個問題越明顯! 因為檔案系統會先生成檔案名稱並賦予記憶體指標(檔案內容緩衝區),當檔案指標被應用程式Close時,OS才會把檔案內容緩衝區的內容,寫到磁碟機上。 這個動作是作業系統為了加快檔案處理的速度而設計,緩衝區大小預設為磁碟sector大小,也就是說你的磁碟如果 sector 是 512K ,預設緩衝區就是 512K,若是sector 為 4096K,緩衝區就是 4096K。然而這個緩衝區可以依照應用程式去要求作業系統調整的,基本的原則是sector的倍數。 相關參考: 微軟檔案緩存 、 資料緩存定義 因此,要如何判斷得知檔案是否已經寫入完成,並且可以讀取呢? 目前我測試有兩種方法可以使用: 一、檔案大小法:如果運作的磁碟機 Sector 是 512K,而你非常肯定你的檔案大小絕對不會超過512K,那很好,除了取得檔案名稱外另外加判斷檔案大小,只要取得的檔案大小超過0,就代表檔案已經從緩衝區 Flush或Close 了,這樣就可以讀取了。 ls_path = "C:\inetpub\ftproot\upload\custOrder.txt" do while FileExists...

Coldfusion直接讀取/產生Excel檔案 (使用POI元件)

圖片
最近在 Ben Nadel 先生的網站發現他有個Component計畫,他利用 apache.org 的 poi project 來製作一個可以讀寫 EXCEL 檔案的 Component,操作 EXCEL 檔真的蠻方便的。而且 poi project 以處理 office文件為目標,算是很棒的專案。 正在想如何直接透過 Coldfusion 網頁處理客戶的 Excel 檔案時,這真是一大幫助啊! 請先參考相關連結: apache.org 的 poi 計畫 、  apache poi jar下載 Ben Nadel 的 POIUtility 文章出處 、 Ben Nadel 的 POIUtility 專案 我的環境 本人使用 Railo 3.3.4.003 執行 Coldfusion ,所以核心是 Apache 比較沒有問題,至於Adobe的Coldfusion可能要再研究一下 Ben Nadel 的專案了。 1、下載  JAR 檔案 注意下載的 poi jar 版本,由於我使用的 Railo 3.3.4.003版本無法搭配最新的 poi,所以測試到使用  poi-3.0-FINAL.jar 是沒有問題的,太新的反而不能用。 把下載的 jar 放在 Railo Server 路徑下的 \lib\ext 裡面,重新啟動服務即完成掛載。 2、下載 Ben Nedal 的 POIUtility.cfc 假設網頁運行路徑在 \webroot\ 你可接放在 \webroot\ 而我的測試是放在 \webroot\COM 裡面 (我個人習慣Component都是放在COM路徑下) 3-1、測試一:讀取全部 首先,建立一個 Excel 檔案 "測試活頁簿.xls",裡面有3個Sheet 3-1.1、寫一段讀取用的 script: <!--- 建立並初始化POI物件 ---> <cfset POIobj = CreateObject("component","COM.POIUtility").Init() > <!--- 取得我要測試的Excel檔案路徑. ---> <cfset myFile...

Coldfusion 對 query 語句生成

一般的 query 查詢方式 <cfquery name="QryName" DataSource="ConnecttionName"> SELECT field-A,field-B FROM TableName WHERE strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)# </cfquery> 上面是純粹帶『查詢資料』進去 Query 語句時所使用的方式,SQL語句屬於固定類的, 但若你把它改成動態語句: <cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#"> <cfquery name="QryName" DataSource="ConnecttionName"> SELECT field-A,field-B FROM TableName WHERE #qs# </cfquery> 這個語句絕對會失敗的, 因為 Coldfusion 為了防止 SQL injection 所以會對 生成 SQL語句的變數裡 ' single-quotation 產生escape 字元,導致生成了不是你想像中的語句。 正確的作法,如果你希望使用動態語句生成,那就是加個指令要求ColdFusion不要去處理 single-quotation 問題即可解決: <cfset qs = "strfield = '#sdata#' AND numfield = #ndata# AND dtmfield = #parseDatetime(dtdata)#"> <cfquery name="QryName" DataSource="ConnecttionName"> SELECT fi...

Coldfusion 來自不同資料庫的join作法

Coldfusion server 提供了許多資料庫的Native Connection方式,或是Jconnect的方式,在我認為效率總是比ODBC好多了,所以我寫的網頁常常遊走在不同資料庫上,我最常用的資料庫不外乎Sybase ASE 與 MS SQL (或是更早的MSDE)這兩種資料庫,所以需要用到兩種BD來源的Table需要Join的問題: 這技術需要用到 inMemory Query 的作法就可以達成 首先從各資料庫先取出需要 join 的資料(可以盡量使用篩選過的,減少記憶體用量) <cfquery name="emp" datasource="SYB_CONN"> SELECT empl_no,empl_name,title_no FROM rmployee WHERE depart_no = 'sales' </cfquery> <cftransaction action="commit" /> <cfquery name="ttl" datasource="MSSQL_CONN"> SELECT title_no,title_name FROM outsider_title WHERE title_kind = 'S' </cfquery> <cftransaction action="commit" /> Join 兩邊的資料源 <cfquery name="emptlo" dbtype="query"> SELECT a.empl_name,b.title_name FROM emp a, ttl b WHERE a.title_no = b.title_no </cfquery> 輸出測試 <cfloop query="emptlo"> <cfoutput>#empl_name# , #title_name# <br /></cfou...