Posts
Check empty folder with IsDirectoryEmplty Win32 API
在判斷目錄是否為空這邊,.NET 4.0 以前,很多人都會很直覺的去使用 Directory.GetFiles 、Directory.GetDirectories 、或 Directory.GetFileSystemEntries 方法,用個數判斷是否為空。
public bool IsDirectoryEmplty(string directory) { //return !Directory.GetFiles(directory).Any() && !Directory.GetDirectories(directory).Any(); return !Directory.GetFileSystemEntries(directory).Any(); } 用這樣的方式處理,必須等待所有檔案都找出來後回傳才能進行空目錄的判斷,效能十分的低落。
在 .NET 4.0 後可改用 Directory.EnumerateFiles 、Directory.EnumerateDirectories 、或 Directory.EnumerateFileSystemEntries 替代。
public bool IsDirectoryEmplty(string directory) { //return !Directory.EnumerateFiles(directory).Any() && !Directory.EnumerateDirectories(directory).Any(); return !Directory.EnumerateFileSystemEntries(directory).Any(); } 相較於 .NET 4.0 以前的處理方式,檔案變成找到就立刻回傳,因此我們找到一個檔案就可以將搜尋的動作中斷,效能問題獲得了改善。
雖然效能的問題解決了,不過像這樣的處理方式會受限於 .NET Framework 的版本,不是一個比較通用的解法。而且空目錄判斷這樣的動作其實跟前面提到的取得目錄大小一樣,用 Win32 API 去跟 OS 問多半是最快的方式。
以這邊來說,我們可以將之改用 IsDirectoryEmplty API 去處理。
[ DllImport("Shlwapi.dll" , EntryPoint = "PathIsDirectoryEmpty")] [ return: MarshalAs (UnmanagedType.Bool)] public static extern bool IsDirectoryEmplty([MarshalAs (UnmanagedType.
read morePosts
Travis CI - Build Status images
Travis CI 支援 Build status image,能讓我們將 Repository 建置的狀態嵌至網站上。
使用時只要開啟 Travis CI,將左側這邊切換至 My Repositories。
{% img /images/posts/TravisCIBuildStatusImages/1.png %}
切換至欲使用的 Repository ,在右側的建置資訊這邊,可以看到右上方有個圖片表示著這個 Repository 的建置狀態,這就是我們要拿來內嵌的圖片。
{% img /images/posts/TravisCIBuildStatusImages/2.png %}
滑鼠點擊後會出現像下面這樣的對話框。
{% img /images/posts/TravisCIBuildStatusImages/3.png %}
對話框裡面有提供嵌入用的語法,將之複製並貼入欲嵌入的位置就可以了。
多半我們會將它嵌在 GitHub 的 README.md 內。
{% img /images/posts/TravisCIBuildStatusImages/4.png %}
瀏覽 Repository 時就能一眼看出是否能成功的建置。
{% img /images/posts/TravisCIBuildStatusImages/5.png %}
Link [Travis CI: Status Images] (http://about.travis-ci.org/docs/user/status-images/)
read morePosts
Skype - High CPU usage
最近在筆者工作的電腦上,一直以來都運作良好的 Skype 突然開始狂吃 CPU 。查閱了一下資料,這段時間發現很多人也都碰到這個問題,不過同樣的現象卻未在同事的電腦上出現,感覺是要滿足特定的條件才會發生。
像這邊筆者的電腦就吃了 25% 左右,筆者的電腦是四核心,相當於一整顆 CPU 被吃掉了。
{% img /images/posts/SkypeCPUHigh/1.png %}
當這樣的問題發生時,電腦上的預設瀏覽器多半是設定為 Chrome 。而解決這問題的方法也就是將預設瀏覽器設為 IE ,或是設為其它瀏覽器。
{% img /images/posts/SkypeCPUHigh/2.png %}
修改完預設瀏覽器後, 將 Skype 重開,沒意外的話就會看到 CPU 使用率恢復正常的狀態。
{% img /images/posts/SkypeCPUHigh/3.png %}
另外還有一種解法就是改安裝舊版的 Skype ,然後將自動更新功能關閉,避免它更新到有問題的版本。
目前造成該問題的原因還不明確,同樣的版本同樣的預設瀏覽器設定也不一定能重現,在官方尚未修正好前暫時也只能先這樣避開問題。
Link 【問題】Skype之CPU使用量迷思 Getting extremely high CPU usage? SKYPE 讓cpu使用率過高 [問題]開啟Skype電腦變LAG
read morePosts
Travis CI - Build .NET project
Travis CI 內建支援 C、C++、Clojure、Erlang、Go、Groovy、Haskell、Java、Python、Ruby 等語言,卻沒有支援 .Net 的,這表示官方並不特別的去做 .Net 語言的支援。然而 Travis CI 具備有相當程度的彈性,經由設定能在建置前先進行套件的安裝,因此我們還是能透過安裝 Mono 套件去建置 .Net 的專案。
在設定檔的撰寫上,Language 這邊指定語言為 C ,因為前面提到的 Travis CI 並不支援 C# 。
language: c install 這邊透過 apt-get 安裝 mono-devel 、 mono-gmcs 。
install: - sudo apt-get install mono-devel mono-gmcs script 這邊直接叫用 xbuild 去建置我們的專案或是方案就可以了。
script: - xbuild Source/LevelUp.Extensions.Core/LevelUp.Extensions.Core.csproj - xbuild Source/LevelUp.Extensions.Control/LevelUp.Extensions.Control.csproj 整個設定檔撰寫起來會像下面這個樣子:
Travis CI Integration language: c install: - sudo apt-get install mono-devel mono-gmcs script: - xbuild Source/LevelUp.Extensions.Core/LevelUp.Extensions.Core.csproj - xbuild Source/LevelUp.
read morePosts
Travis CI - Free Hosted Continuous Integration Platform for the Open Source Community
Travis CI 是免費的 CI 服務,支援 C、C++、Clojure、Erlang、Go、Groovy、Haskell、Java、Python、Ruby等語言。能用來建置 GitHub 上的 Repository, 為 GitHub 加上 CI 的能力,不需另行為此架設 CI Server。只要在 Repository 放置個 Travis CI 的設定檔,並授權給 Travis CI,最後再將 Service Hook 啟用就可以了。
此外,Travis CI 也提供狀態貼紙的功能,能將建置的狀態內嵌在想放置的位置,讓建置狀態一目了然。
使用時需先至 Travis CI 做 GitHub 的登入
{% img /images/posts/TravisCI/1.png %}
登入後會 Travis CI 會向我們要求授權
{% img /images/posts/TravisCI/2.png %}
若對要求的權限沒什麼意見,可以進一步按下 Allow access 按鈕授予權限。
{% img /images/posts/TravisCI/3.png %}
授予權限時,為了安全起見,GitHub 會再次請求輸入密碼。
{% img /images/posts/TravisCI/4.png %}
密碼確認無誤,Travis CI 即會開始將我們的 Repository 給拉回來。
{% img /images/posts/TravisCI/5.png %}
read morePosts
NuGet - Reinstalling Packages
NuGet 在2.7版後開始支援重新安裝套件的功能,當碰到專案中的 NuGet 套件參考路徑錯誤,或是當專案的 .Net Framework 版本用的與 NuGet 套件用的不符時特別適用。
使用時先開啟 Package Manager Console 工具視窗,在裡面輸入命令:
Update-Package -reinstall NuGet 就會幫你重新加入所有使用到的套件。
若要指定重新安裝特定套件,可在命令後面帶上 Package
Update-Package -reinstall [Package Name] 像是要指定重新安裝 Log4Net 就可以輸入命令:
Update-Package -reinstall Log4Net {% img /images/posts/NuGetReinstallingPackages/1.png %}
若是要指定重裝特定專案內的套件,可像下面這樣加入 Project 參數,並帶上專案的名稱:
Update-Package -reinstall [Package Name] -project [Project Name] 若是要升級專案套件,用排除相依套件的方式下去重新安裝,可加入 IgnoreDependencice 參數:
Update-Package -reinstall [Package Name] -IgnoreDependencice Link Reinstalling Packages and its Pitfalls
read morePosts
Batch - Run as administrator
Windows Vista 後的作業系統開始導入 UAC ,在運行某些操作時必須要提升至管理者權限才能繼續。這在程式中只要加上 MetaData 就可以了,但在批次檔中卻沒有比較直接的做法。
好在有好心的網友整理好了下面這樣的程式碼片段
:: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32
read morePosts
Code Digger - Analyzes possible execution paths through your .NET code
Code Digger 是精簡版的 Pex,其內部還是使用 Pex 的程式碼分析引擎,能將有意義的參數的抓出,幫助我們更了解程式,並找到可能的淺在問題。目前該擴充套件支援 Visual Studio 2010 以後的版本 (Visual Studio 2012、 Visual Studio 2013),Visual Studio 2010 以前我們可以改使用功能更為強大的 Pex。
Code Digger 在設立之初只支援 Protable Class Library ,故非 Protable Class Library 的專案在使用時會看到像下面這樣的訊息框。
{% img /images/posts/CodeDigger/1.png %}
Code Digger 的功能也無法使用。
但在某一版後,Code Digger 能在 Options 那邊將這限制關閉。只要開啟 Options 對話框,切換至 Pex/General 頁籤,將 Code Digger 群組下的 DisableCodeDiggerPortableClassLibraryRestriction 設定為 True 就可以了。
{% img /images/posts/CodeDigger/2.png %}
使用時,我們只要在要分析的方法中按下滑鼠右鍵,在彈出的滑鼠右鍵快顯選單中選取 Generate Inputs / Outputs Table 選單選項。
{% img /images/posts/CodeDigger/3.png %}
接著會彈出 Code Digger Analytics 對話框,詢問是否同意 Code Digger 收集使用的資訊,這邊請視個人需求下去勾選就好,若有需要後續都可以至 Options 內做修改。
read morePosts
FxCop - assembly reference cannot be resolved
在使用 FxCop 分析組件時,某些組件在用命令列載入時會跳出 cannot be resolve 這樣的錯誤訊息。
{% img /images/posts/FxCopUnresolvedAssembly/1.png %}
改用 FxCop 嘗試載入的話,也會找不到相依的組件而彈出詢問對話框。
{% img /images/posts/FxCopUnresolvedAssembly/2.png %}
這樣的問題是由於某些相依的組件找不到所導致,而這些組件有時候只是在 GAC 內。所以要解決這樣的問題,可以在 FxCop 點選 Project/Options... 主選單選項,將開出的 Options 對話視窗切換至 Spelling & Analysis 頁籤,勾選 Search Global Assembly Cache for missing references 勾選框。
{% img /images/posts/FxCopUnresolvedAssembly/3.png %}
{% img /images/posts/FxCopUnresolvedAssembly/4.png %}
若是使用命令列驅動 FxCop 分析,可帶入命令列參數 /gac。
FxCopCmd /file:[Assembly] /gac 這樣 FxCop 就會嘗試由 GAC 中找尋遺失的組件參考。
read morePosts
EyeDisposable - IL instrumenter to help detect IDisposable leaks in .NET programs
EyeDisposable 是ㄧ用來檢測程式是否有正確 Dispose 資源的命令列工具。
程式可至 kizzx2/EyeDisposable · GitHub 這邊下載。因為有用到 Sub Module ,所以用 Git Clone 下來後需要更新 SubModule 。
git clone git://github.com/kizzx2/EyeDisposable.git cd EyeDisposable git submodule update 更新好後建置即可…
若是不會使用 SubModule ,或是網路限制導致無法連 Git ,這邊也可以手動將方案開啟,然後移除 Mono.Cecil 專案,改用 NuGet 將 Mono.Cecil 組件加入參考。
{% img /images/posts/EyeDisposable/1.png %}
程式主檔建立完成後,使用時我們只要將組件位置帶入即可。
EyeDisposable [AssemblyName] 組件帶入後,EyeDisposable會開始進行分析,並強制插入偵測 Leak 用的程式。分析的結果會顯示於主控台,可從中看到程式的方法中建立了多少可釋放的物件,而又釋放了多少次。
{% img /images/posts/EyeDisposable/2.png %}
這邊可依此線索下去查找沒被釋放的資源。像是以筆者的例子來說,他就找到在 Main 那邊建立出一個物件,但是卻沒做過釋放的動作,所以查驗一下程式碼,就可以看到這邊筆者建立了 RNGCryptoServiceProvider 物件卻未釋放。
{% img /images/posts/EyeDisposable/3.png %}
若是依此線索找不出來,也可以將程式點擊開啟,然後對程式做些操作後關閉。因為剛剛 EyeDisposable 已經將一些偵測用的程式注入,所以關閉時程式所在的目錄會多個 .DisposeLeaks.log 為檔案結尾的文字檔,開啟後若有偵測到 Leak ,該文字檔會有對應的資訊。
{% img /images/posts/EyeDisposable/4.png %}
read more