發表文章

如何退出被系統鎖住的外接式磁碟機

圖片
適用於Windows 7以上版本 明明都已經把所有程式給關閉了,但是要安全退出USB外接硬碟時,卻一移無法退出。 使用Unlocker、USB Remover等軟體,確是 一直提示被『系統』使用中 。 (這個系統又不是任何外裝軟體也不知道怎麼停止它) 而且, 不管使用任何強迫終止程序手段都沒有用! 此時使用Open File View檢查會發現像是下面的東西被『系統』鎖住: $Extend\$RmMetadata\$TxfLog\$TxfLogContainer00000000000000000001 此時,我測試過最有效的方法就是使用 Diskpart 來處理 先開啟『命令提示字元』,或是到『執行』輸入cmd.exe 注意,如果您的電腦使用權限不是『系統管理員』身分,請切換到管理員身分執行,或是以滑鼠右鍵『以系統管理員身分執行』! 1.輸入 Diskpart,進入工具模式 2.輸入 List Disk,顯示出本機所有磁碟機,這些磁碟機會以1、2、3的編號出現 3.輸入Select Disk n,這個n是你要退出的磁碟機編號 4.輸入 Offline Disk ,則可以退出此磁碟機 範例畫面: 注意! 在這之後,你的USB外接式硬碟再度裝回此部電腦時,可能不會再出現磁碟機代號。 此時可以到『裝置管理員』>『磁碟管理』,會發現這部磁碟機變成了『離線』狀態。 那要如何恢復呢? 有兩種方式: 一、使用磁碟管理,在該硬碟機上按滑鼠右鍵,跳出選單,點擊『連線』項目 二、使用Diskpart管理工具:   1.輸入 List Disk,顯示出本機所有磁碟機,這些磁碟機會以1、2、3的編號出現   2.輸入Select Disk n,這個n是你要退出的磁碟機編號   3.輸入 Online Disk ,則可以重新連接此磁碟機

霹靂燈設計(帶尾) K.I.T.T Scanner Light

圖片
這次的霹靂燈製作式為了接下來的 霹靂車模型 製作的,因為模型比例不大,車體空間又非常小,所以盡量找零件最少的來製作,而且希望使用CR2032當電源。雖然使用PLC是最少,但麻煩的是要Codding,也要一定產量(回想當初我在手機店改裝Motorola CD928的時候,老闆訂PLC粒都是以條為單位的,每條約30顆)。因此對於只需要少少一組的使用者來說,真的不實用。 也許網路上都找得到的霹靂燈套件,最早最傳統的莫過555+74193+74154的電路,但是要做出帶尾效果,加上要塞到模型加上希望使用鈕扣電池,這個74系列的設計完全就出局了,那就更不用說要用8051來設計的霹靂燈了。 而外面買的霹靂燈條大都是汽車用,所以光是電力就out了。 後來在逛電子街的時候看到了祥昌電子的OK-154套件,發現它只使用2顆IC,而且都是MOSFET為主的驅動+40系列IC,而且只需要2顆AAA乾電池。已經非常接近我所需要的規格了;原本套件使用了25顆LED,但實際上只有5組(5組*5顆)而已。所以我便把他做了一點修改(如下圖)。 我把LED改成純5顆,然後在555端的電容器C1旁併上了一顆1uf的電容,以稍微降低一點速度(這個很重要,在接下來的改造都會有很直接的關連了)。 這裡有一件不得不注意到的事,是它們的555震盪器的設計方式真是少見啊!! 居然把output當成discharge來使用,這樣的話就不需要在discharge上裝設一顆電阻(Rn),而頻率公式就從原本的 f = 1 / (0.693 x C x (Rn + 2 x R7)) 變成 f = 1 / (0.693 x C x (2 x R7)) 而且上下弦波時間也都一樣,真是太棒了! 不過前提是,輸出必須加上覆載電阻,當然電流會變小,不可以直接當成驅動使用,當訊號使用是非常OK的。 霹靂燈帶尾 來說說這個故事吧,當年霹靂遊俠李麥克盛行的年代,LED大燈泡是不存在的,當時的LED真的只是很小的指示燈的燈源而已(亮度不是很夠),所以霹靂車前面的Scanner Light是真的邏輯電路+燈泡帶來的效果,而那個帶尾的效果,很單純的是燈泡熄滅後的餘光Fade out(我的學長就做過)。 直到LED光源近年來大放異彩,取代了燈泡,當然LED的特性就顯現出來的,光源...

自製簡易混音器

圖片
最近因為公司給了一個會場音控的任務而需要用到混音功能,但是市面上的混音器最便宜也要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...