發表文章

安裝 Ubuntu 後,Windows 無法關機

圖片
原來是跟 GRUB 衝突,只要把 Fast Boot 關掉就正常了 參考: [已解決] Dual boot 無法關機/休眠/睡眠 (Ubuntu/Windows)

執行批次檔不要 DOS Command 視窗

圖片
如果程式有特殊需求必須從 Command Line 執行,例如以下的 Test.bat Notepad 則執行的結果就是像下圖一樣,有一個醜醜的 DOS Command 視窗,直到你程式結束後才會關閉 如果要把它去掉,可以修改 Test.bat 如下 Start Notepad Exit 它的原理是利用 Start 呼叫要執行的程式後,原本的批次檔會繼續往下執行 Exit,就可以把 DOS Command 視窗關閉了 Start 還有其它參數,例如 /Max 可以把要執行的程式最大化,有興趣可自行參考 Start /? 的說明

不要自動完成 { }

圖片
每次寫程式 Visual Studio 都會自動加 { },但是加完就不會自動排版了,所以每次都還要刪掉再重加一次,以便完成排版。 今天找了好久,終於找到取消的設定了

Driver 的數位簽章

圖片
Microsoft 為了安全性的考量,在 x64 OS 下的 Driver 一定要有合法的數位簽章,否則下場就是這樣,甚麼都不能做。

執行緒安全 (Thread-safe)

圖片
現代程式設計為了提升效能,通常採用多執行緒的方式執行,但若沒有注意執行緒安全,往往會造成意想不到的錯誤。 假設現在有一個程式有 Main & Timer 兩個 Thread 都會透過 i2c command 存取硬體,模擬的程式碼如下:

ubuntu studio

ubuntu studio 是 ubuntu 的影音加強版,是為了玩 MIDI 的 Rosegarden 才看到的。12.04 LTS 佔 1.9 GB (用家裡的 ADSL download 了快 4 小時),還得用 DVD 才能燒錄,所以在 Windows XP 下又找了一個免費的燒錄軟體 ImgBurn ,比起 ubuntu 用一張 CD 就能搞定,實在差太多了。 以下就是一些使用的心得(萬一以後還要重裝的話,也好有一個參考): 系統 | 日期與時間設定 改為 “與網路伺服器保持同步”(需安裝 NTP) 關閉 UTC 解決與 Windows 時間衝突的問題: timedatectl set-local-rtc 1 懶得用 gcin 了,直接用內建的 IBus,再加上 行列輸入法 即可 ( 還是得裝 gcin,IBus 的行列打不出特殊符號啊 ) 裝完再用 im-switch 切換內定輸入法,然後重新登入即可 設定主機板的 Wake on Lan (重裝 ubuntu studio 好像把這個選項又關掉了) 設定 wins ,不然 Windows 網路芳鄰的電腦名稱(NAS)又找不到了 Pidgin 網路即時通:MSN Sysinfo  Dropbox LibreOffice Asunder CD Ripper :抓 CD不可少的工具  Ripper X :Asunder CD Ripper 無法抓太多音軌的 CD 時可改用此軟體,不過中文支援有問題,需要用 EasyTAG 再改一次 (18.04 版的軟體中找不到,只能以手動安裝了 sudo apt-get install ripperx ) Rosegarden:玩 MIDI 的軟體,不過還是有當機的情形,希望不要當得太頻繁啊。另外安裝完後沒有在 Audio Production,反而跑到 Media Playback PS: 自動儲存的功能怎縻關掉啊? 原本這個功能是怕當機資料消失,結果我反而因為這個功能導至這篇文章消失了。 在編輯的過程中,切換到 HTMlS 模式後,又利用 Ctrl + Z 執行 Undo 時,不明原因導至整篇文章不見了,偏偏又在此時自動存檔,真是 #@#%^,害我又打了第二遍(還好還沒全部忘記)

[分享] Visual Studio 遠端偵錯

圖片
參考: Visual Studio 遠端偵錯和診斷 在程式開發的過程中常需要在不同的作業系統平台上偵錯,以前的做法是在該平台上安裝 Visual Studio,但這不僅僅曠日廢時,同時也破壞測試的完整性,畢竟在一般使用者的平台上是不會有這些開發環境的程式的。 所以看過今天的介紹後,你再也不需要這麼麻煩了,只要有網路線,你就可以利用遠端遙控的方式來偵錯,同時可以將一個測試平台分享給不同的開發者測試,一舉數得。

[心得] 如何造成程式 Crash

圖片
最近在改程式的時候,發生以下異常存取的狀況 原因是以下的指標指到不合法的記憶體,但查很久就是查不到在那裡被改的 if ( m_pStaticCoreVoltage ->IsWindowVisible()) { m_pStaticCoreVoltage->SetWindowText(m_strMonCoreVoltage); }

[心得] 在 struct 中的 vector 存取異常

很久沒有寫心得了,這個問題花了我整整兩天的時間才解決,所以值得分享一下。首先我們看以下的定義 typedef struct _Profile { INT nFormat; BOOL bFanMode; ULONG ulFanSpeed; #ifdef BOOST BOOL bBoost; #endif INT nOCMode; vector<INT> OffsetVector; } Profile, *PProfile; 應該沒甚麼問題,除了條件式的組譯:如果有定義 BOOST 的話,就多一個 bBoost 的欄位 在我的 Solution 中有 ProjectA 和 ProjectB,其中 ProjectA 會產生 Profile 的物件,並以 Call by address 的方式傳給 Project B 中做後續的資料處理與回傳。 而問題出在 ProjectB 中只要對 OffsetVector 做寫入就會產生記憶體存取異常。我找過幾個方向: 因為 vector 會動態配置記憶體來存取資料,所以初期一直朝這個方向找答案,是否在傳遞的過程中,vector 所指到的記憶體已經改變了?所以才造成異常。但相同的動作在 ProjectA 做卻完全沒問題 struct alignment 的問題,是否兩個 Project 的配置不一樣,造成相同的欄位卻存取到不同的位址?因此我用 sizeof() 取得兩個這數所佔空間的大小,還真的不一樣,而且 OffsetVector 是指向 struct 中不同的 offset。但我查 Project alignment 的設定,一樣都是預設值 這就怪了,最後發現原來問題是我自己造成的。原來我在 ProjectA 有定義 BOOST,因此有 bBoost 這個欄位,而 ProjectB 是事後才加入的,並沒有定義 BOOST,因此兩邊在存取 OffsetVector 時,就差了一個 BOOL 的欄位空間,故 ProjectB 在存取的位址實際上是錯的,當然就產生記憶體存取異常了,還害我誤會了 vector 所以結論是: 以後 不要在 struct 中設定條件式組譯 ,避免又發生同樣的問題。 而在程式碼中的條件式組譯,請定義在 Project Property | C/C++ ...

NB 更新 EC

步驟如下: 把下列檔案複製到隨身碟 EFI Boot ( EFI 開機檔 ) Bootia32.ef Bootx64.efi EC 226.bin ( 要更新的 EC 檔案 ) amiecfx64.EFI ( 更新的執行檔 ) u.nsh 使用隨身碟在 NB 開機 ( 按 F7 選擇 ) 進入 EFI Shell (使用類似 linux command) Shell> map // 查詢 USB mount 之後的名稱 (例如 fs4) Shell> fs4: // 切換到隨身碟 fs4:\> ls // 查詢檔案 fs4:\> cd EC // 切換目錄 fs4:\EC> amiecfx64.EFI 226.bin // 更新 EC fs4:\EC> u 226.bin // 使用 script 更新亦可 u.nsh 內容為 amiecfx64 %1

如何解決 Microsoft Windows SDK for Windows 7 and .NET Framework 4 (v7.1) 安裝失敗

由於 Direct3D Interop sample 已無法從  MSDN Code Gallery  取得,因此只好安裝 Windows 7 SDK ,但安裝過程中發現 Microsoft Visual C++ 2010 Redistributable Package 造成安裝失敗,請依照以下的步驗安裝即可成功 移除 Microsoft Visual C++ 2010 Redistributable Package (x86 and x64) 安裝 Windows SDK v7.1 時取消 " Visual C++ Compilers " 與 " Visual C++ 2010 Redistributable Packages " 安裝 Microsoft Visual C++ 2010 Service Pack1 Compiler Update for the Windows SDK 7.1 安裝 Microsoft Visual C++ 2010 Redistributable Package ( x86 and x64 ) 原文參考: Why does the SDK 7.1 installation fail with an "Installation Failed" message on my Windows system?

Visual Studio 環境設定

圖片
如果你的 Project 不是單一執行檔,而是搭配其它檔案才能正常執行,那麼通常會設定 Debug 與 Release 兩組環境;如果再搭配 Win32 與 x64 的話就有 4 組了。有點麻煩?對吧! 所以我希望把測試環境設定在一個固定的地方 (例如 Bin 目錄下),這樣相關的檔案只要放一組就可以了,然後利用 Post-Build Event 把編譯過的執行檔複製到這裡就可以測試了。

Ubuntu 11.04 的點點滴滴 [更新 14.10 Unity systray-whitelist 設定]

圖片
Ubuntu 11.04 採用新的 Unity 介面,當使用 Compiz 開啟 3D 桌面時有許多衝突,因此得將 Unity 關掉,亂按的結果就是掛點了,重開機後畫面只剩一張背景圖。 這個時候就需要用到 Alt + SysRq + K 登出回到 Display Manager (登入) 的畫面,選擇 " 傳統 Ubuntu 桌面 " 登入後,將 Compiz 與 ATi Driver 移除後,結果還是一樣的空白桌面。將重裝一次 Driver 與 Compiz,還是一樣,看來是新版的 Unity 桌面被我的 Compiz 關掉了。

如何在 Ubuntu 下認得 Windows 的電腦名稱

自從踏入 Ubuntu 的領域後,還是以 Windows 的習慣在使用,例如存取公司內部的 Web Server 時,還是習慣使用 電腦名稱 ,但此名稱在 Ubuntu 內是不認得的,只能以 IP 的方式存取。經過一番研究後,得出以下的結論與解決方法: Windows 是透過 WINS 服務將 NetBIOS 的電腦名稱轉換為 IP 的 (此功能與 DNS 相同,只是應用在不同的地方) 因此Ubuntu 要達到相同的功能,需執行以下的動作 sudo gedit /etc/ nsswitch.conf 將 host: ... dns 前面加上 wins,變成 host: ... wins dns 利用 Synaptic 安裝 winbind 即可 原文參考 HOWTO: Resolve Netbios hostname system-wide 2014/11/01 更新 此方法在 Ubuntu Studio 14.10 下竟然無效,無法從瀏覽器用 http://mymediacenter 連接到 NAS 伺服器 不過網路位置還是可以用 smb://mymediacenter  連線到資料夾,真是怪哉!

dynamic_cast 與 operator override 的應用

假設我有一個 Interface 如下 struct IProperty abstract { ~IProperty() { } virtual LPCTSTR toString() = 0; virtual BOOL operator==( const IProperty& other) const = 0; virtual BOOL operator!=( const IProperty& other) const = 0; };

DPI-Aware Application

圖片
一般 MFC Dialog base 的程式,如果使用者調整 Font size 則 Dialog 是會跟著 Font size 等比例放大的。

【已解決】CMyButton 反應太慢

CMy Button  是一個 Owner-Drawn 的 CButton,最近在使用時發現:如果連續按的話,有時會沒有反應。 原本懷疑:  利用 OnSetCursor  攔截 Mouse Over 的狀態,如果 Mouse 停留在 Button 的區域內,會一直產生重繪的動作 ( 取消後問題仍在,故排除 ) 按下 Button 後執行的程式佔用太多的時間,導致第二次 Button click 來不及處理 ( 但使用標準的 CButton 則沒有問題,故排除 )

在網路磁碟機設定 Visual Studio 2010 方案

圖片
由於網路磁碟機是屬於不信任的區域,因此在上面設定方案時會出現以下問題

【分享】如何顯示 Debug Message

圖片
通常在程式 Debug 的過程中會需要顯示一些訊息,最簡單的方式就是利用 MessageBox 來顯示,但缺點是會中斷程式的執行。 所以在 Console or Win32 的程式底下,我們可以直接利用 OutputDebugString (in windows.h) 將訊息輸出到 Visual Studio Output Window,例如     OutputDebugString(_T("Hello, OutputDebugString.\n")); 而 MFC 就更方便了,可以直接用 TRACE 巨集,還可以直接格式化字串,例如     TRACE(_T("Hello, TRACE No. %d.\n"), num);

記錄 PDF 最後讀取位置

圖片
最近在讀 PDF 電子書時,每次開啟都要從第一頁切換到最後讀取的頁數,如果不記得的話,甚至還要花不少時間來搜尋,於是上網找找看有沒有類似書籤的功能,原來就在 ...