Pages

2015-04-29

用VirtualSVN版控整個專案根目錄

如果你直接在VS2013裏將方案加入遠端VisualSVN作版控,它只會將目前Solution下的可見專案文件寫入遠端版控,然而我們大部分專案根目錄卻是長這樣子的:
+ MyRootDir/ (root)
   App_Doc/  (放置專案文件)
   App_Deploy (編譯佈署輸出目錄)
   App_MainProject1/  (主專案1)
   App_Library/   (共用函式庫)
   App_OtherProject1/    (其他專案1)
   App_OtherProject2/
   MainProject1.sln
   OtherProject1.sln
   OtherProject2.sln

同個專案下,可能會有很多方案Solution檔,控制著不同的專案項目組合,若異動了非某專案下的文件,可能遠端主機就沒法探測到異動,因此我們不能讓SVN綁著方案,而該綁定最上游的根目錄。

設定步驟如下:

  1. 確認系統已安裝VS2013, TortoiseSVN, VisualSVN程式。
  2. 在遠端主機建置空的Repository(倉庫),設置好存取用戶權限。
    SVN Empty Repository 
  3. 將MyRootDir/目錄匯入該遠端Respository裏。
    SVN Import
  4. 打開VS2013,執行選單上「VISUALSVN\Get Solution from Subversion」,將遠端的Respository儲存到欲放置的路徑上。
     SVN Get Solution
  5. 完整下載後,它會判讀該目錄下的所有*.sln,就可選擇任一個來開啟。
    SVN Open Solution
  6. 在系統檔案管理員(非VS2013)下新增任一文字檔(ImportedNewFile.txt),但在VS2013的專案檔下去作SVN Commit,即可抓到上層的所有異動文件。這是因為VisualSVN的「Set working copy root」是設定在root根目錄層。
    SVN Commit
  7. 如此一來,我們綁定SVN在根目錄裏的變動,而非目錄下單一*.sln方案檔了。

2015-04-25

SQL Transaction錯誤造成的中斷

為了確保整個SQL正常執行,我們程式中通常會把DbCommand包在Transaction裏,再利用try/catch作trans.Rollback()。一般的SQL錯誤(如欄名不正確)等,執行一切正常,但偏偏遇到某些致命錯誤(如int欄位寫入字串,挺常見的!)竟然會讓Transaction中斷,裏頭的Connection會變成null,後面的trans.Rollback()自然就失去效用。

網上很少人提到這詭異現象,只有在stakoverflow有提到此問題,但沒有妥善解決之道。我在210行處重新再取得Trans物件作Rollback,就可以復原挽救第195行的刪除指令了。

image

面對這種奇怪現象,若是常用TransactionScope{}簡易寫法的人,將無法回復錯誤前的指令執行結果,宜注意此狀況。

2015-04-22

磁區4K對齊的效能改良

4K對齊」在磁區分割時是一個重要的概念,不僅效能增快也減少了讀寫次數(理論上延長壽命),尤其對於SSD固態硬碟效能影響更大(籠統地說,SSD比一般HDD硬碟快約4倍,而RamDisk比HDD快約40倍)。AS SSD Benchmark是一個綠色免安裝的磁碟測速軟件, 若出現紅色框「xx K - BAD」代表未對齊。
SSD 4K對齊前: (下圖4K意指單位時間內隨機存取4K的最快速度,而4K-64Thrd是同時以64個4K存取指令的速度,尤其表現在x64 OS系統上)
TestSpeed Before
SSD 4K對齊後: (且不論4K-64Thrd的效能提升4倍外,Seq循序寫入至少提升2倍了) TestSpeed After
傲梅分區助手(PartAssist)」這軟件可以直接將目前已有資料的硬碟分割區對齊4K,而不用重新分割磁區(它使用搬移技術,時間耗費久一點而己),請下載免安裝的綠色版本。執行前若是要對齊使用中的系統碟,那麼必須使用PE系統開機才行,若是其他非使用中的分割區(Partition),即可直接使用。
版本: 5.6.2, 分割區列表秀出該區是否已對齊4K否?
Partition List
在分割區滑鼠右鍵,選擇「高級操作>分區對齊」:
Partition Action
選擇第1個項目「4KB對齊」,接著回主畫面按左上角的「提交」按鈕才會確認執行。
Partition 4KB
移動對齊磁區是件大事,最好還是在PE系統執行為宜。因為分割區存在資料,因此它需要一段時間作對齊工作。對齊後可以再測速磁區,寫入速度或多或少都有提升!
Partition Using Alert

2015-04-15

批次刪除大量Gmail信件

Gmail免費空間有15GB,如同官方所說的,既然大到用不完,為何要刪除呢?但Email郵件累積多了,適當作個管理是個人生好習慣,Gmail官方建議將郵件Archive存檔起來,其實只是把這些被存檔的郵件給隱藏起來而己,只要選下圖編號3即可顯示所有郵件,包括被存檔的郵件項目。

  Archive Mail

若你仍堅持要刪掉Inbox來信匣的所有郵件(不要傻傻分頁勾選),可以使用下列的步驟批次操作:

  1. 在上方搜尋框輸入「in:Inbox  before:2014/12/31」指令,按「搜尋」圖示,系統會分頁列出這些郵件的項目及總筆數(185筆)。請按下圖編號4「More/Create filter」按鈕。
     Filter Command
  2. Filter過濾條件框會蹦出,因為已有搜出結果了,因此這兒不用再填條件,直接按右下角「Create filter with this search」連結。
     Filter Create
  3. 它會彈出一個確認框,按OK後就會出現下圖,請選擇動作:刪除(編號1)及應用到所有郵件(編號2),再按「Create filter」按鈕,這些符合條件的郵件就會被移入Trash垃圾匣。
    Filter Action
  4. 選擇左側選單: Trash垃圾匣(編號1),按「Empty Trash Now」(編號2)一鍵清除所有Trash Mail郵件。
    Empty Trash
  5. 此搜尋的Filter過濾規則會被自動儲存起來,因此我們得用完就刪除它,否則後面進來的郵件都會直接套用此規則。
    選擇頁面右上角的Settings設定:
    Filter Delete1
    刪除該Filter過濾規則。
  6. Filter Delete2

2015-04-08

Chrome複製選取區域連結: Linkclump

此Extension套件的功用就是複製目前頁面選取的文字Link連結,因為像迅雷或JDownloader等下載軟件都可以接受一串的下載網址,以下圖為例,若可以用滑鼠選取某區域裏的所有Link網址至Clipboard剪貼簿裏,那將是非常方便的事,而這套Linkclump套件就是實現這樣的功能。其命名clumb很有意思,利用英文字形來仿dump(傾倒)這單字。
 Target Link
請安裝Google Extesion: Linkclump (撰文時版本: v2.7.3)
https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj
 Extension Page
安裝後,它並沒有工具圖示,只能到Extension Manager介面去點選Options設定頁面,它可以加入很多個Action(可定義滑鼠HotKey),默認Action項目是打開選取區域的所有link頁面,你可以修改成複製至剪貼簿就好。
Extension Action
圖1是定義啟動選取區域的hotkey,圖2是選擇將結果輸出至何處,圖3是只複製url連結,圖4是避免重複link。
Extension Edit
以後Chrome瀏覽器觀看網頁時,當點擊該圖示Menu項目,它就會把該網頁的Tab Title + URL複製至剪貼簿中,就可以直接貼給別人。
Link Grabbing
對於喜歡下載網頁資源的人,Linkclump是一個不可或缺的必裝套件。

2015-04-04

SQLite for Entity Framework 6.x安裝實例

為一個ASP.NET Website/MVC安裝SQLite for EF6的NuGet安裝程序如下: (撰寫時使用EF 6.1.3 + SQLite 1.0.96版本,2015/04/01)

使用NuGet方式依序安裝:
PM> Install-Package EntityFramework
PM> Install-Package System.Data.SQLite
SQLite的資料庫檔放在/App_Data/Database/Northwind.db
Web.config下的連接字串為:

<connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|Database\Northwind.db" providerName="System.Data.SQLite"/>
</connectionStrings>

新增一個ADO.NET Entity Data Model, 因為沒有內建適當的SQLite EF Provider自動產生POCO物件(MS獨厚SQL Server?),因此得手動新增POCO類別。
DbContext:
public virtual DbSet<Products> Products { get; set; }

public class Products
{
    [Key]
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public int SupplierID { get; set; }
    public int CategoryID { get; set; }
}
查詢SQL資料方式:
using (Database db = new Database())
{
    var query = from p in db.Products
                where p.ProductID == 1
                select p;

    foreach (var p in query)
    {
        string PID = p.ProductID;
    }
}


執行時會出現Provider Not Found錯誤:


Provider Not Found 


這是因為Nuget安裝只加入EF6的宣告,並沒在系統GAC裏安裝SQLite Provider,當內部運作呼叫到DbProviderFactories.GetFactory("System.Data.SQLite")就會產生上述的錯誤。因此必須在默認的Web.config下方增加對System.Data.SQLite的宣告(增加下面紅色的字串)。

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
            <parameter value="mssqllocaldb" />
        </parameters>
    </defaultConnectionFactory>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />

        <!--Solve SQLite error of "Unable to find the requested .Net Framework Data Provider."-->
        <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
</entityFramework>
<system.data>
    <DbProviderFactories>
        <remove invariant="System.Data.SQLite.EF6" />
        <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />

        <!--Solve SQLite error of "Unable to find the requested .Net Framework Data Provider."-->
        <remove invariant="System.Data.SQLite"/>
        <add name="SQLite Data Provider" invariant="System.Data.SQLite"
            description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />

    </DbProviderFactories>
</system.data>

以上就是讓SQLite使用EF6.x讀取資料的完整範例了。

2015-04-01

ASP.NET CS0016 Temp目錄存取拒絕錯誤

原來運作良好的IIS 6 on Win2003R2的ASP.NET 4.0網站,在佈署時出現「Compiler Error Message: CS0016: Could not write to output file 'c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\xxx – access is denied」錯誤訊息。

Error Msg

查了網路資訊,有些解法是把ASP.NET Temp輸出目錄的寫入權限給「NETWORK SERVICE」,但即使設定「完全控制」也沒用。

Dir Authority

在Win2003的IIS 6.0,ASP.NET執行的用戶權限為「NETWORK SERVICE」,很多目錄權限存取的問題,針對它給予授權即可。不同的網站可以設定各自的用戶權限,其綁定在網站的應用集區執行身份。下圖對應的英文用戶名稱分別為NETWORK SERVICE, LOCAL SERVICE, SYSTEM,它們也常常出現在使用Integrated Security存取SQL Server時產生的登入權限問題裏。

AppPool Role

我試了網路服務(NETWORK SERVICE)及本機服務(LOCAL SERVICE)的身份,一樣會有目錄存取拒絕的問題,最後使用本機系統(System)就運作正常,雖然它的權限過大會有警示訊息。