︿
Top

2019年8月14日 星期三

[C#] 如何進行變數或物件的 相同(ReferenceEquals) 或相等(Equals) 的比較: 由 int / string 的原始程式碼談起


0. 前言


在撰寫單元測試時, 常會需要作 expected 與 actual 的比較, 常用的是 Assert.AreSame() 或 Assert.AreEqual().

關於 AreSame() 的部份, 很容易理解, 就是同一個記憶體區塊. 例如:

void Main()
{
    var a = new Customer();
    var b = a;
    Console.WriteLine(Object.ReferenceEquals(a, b));
}
public class Customer
{
    public int Id { get; set; }
    public string Name {get; set; }
}
則 變數 b 與 變數 a 是相同的, 因為指向同一個 Customer 物件.
即 Object.ReferenceEqual(a,b) 會回傳 True.

關於 AreEqual() 的部份, 則會因對於相等的定義不同, 而有不同的結果. 例如:
有 2 個 Box (具有長/寬/高/顏色 4 個屬性), 我們可以定義它的相等是:

  • 長/寬/高 都各自相等即可
  • 長/寬/高 都各自相等之外, 顏色也要相等
因此, 會有不同各自認定的規則, 來確定是否相等.

在 "相等" 的實作方面, 網路上查到了 91 哥的 2 篇文章 (參考文件2 / 參考文件3). 有提到可採用一些的方式作轉換後, 進行比較, 例如:

  • 覆寫 Object 類別的 Equals() / GetHashCode()
  • 轉換成匿名型別, 再作比較
  • 轉換成 Expected Objects, 再作比較

本篇文章的編排比較類似個人的筆記, 說明會放在程式碼裡, 或圖片即能理解, 就不多作說明, 主要內容為:

  • 由 int / string 等內建的資料型別, 如何達到 "相等" 的比較開始談起
  • 再延伸至自訂類別, 如何達到 "相等" 的比較
  • Dictionay<T> 是如何作到去掉重複
  • LINQ 的 OrderBy() 是如何作到的


2019年1月6日 星期日

[SQL Server] How to view the page content with DBCC PAGE (2) : 進階篇


0. 前言


筆者經由前一篇 [SQL Server] How to view the page content with DBCC PAGE (1) : 基礎篇 的撰稿過程, 對 DBCC IND 及 DBCC PAGE 的使用, 大致上有了一些了解; 但都是經由其輸出的結果來探查 page 的內容, 並未看到其內部是如何儲存的; 故欲透過撰寫本文的過程, 對其內部結構能夠有所理解.

本文主要以 參考文件06, 參考文件12, 參考文件13, 參考文件14 這4篇為主要的參考對象; 故文章內容, 可能會與前4篇有些重疊或重複, 感謝這 4 篇文章的作者.
測試資料的部份, 係採自 前一篇, 故建議由前一篇開始閱讀.

本文將區分為以下幾個部份進行探討:
1. Data Page 的結構
2. Data Page 各筆資料的結構
3. UPDATE 的實地觀察 (定長欄位)
4. UPDATE 的實地觀察 (可變長度欄位)

筆者已盡力查詢相關資料, 但有些文章, 受限於個人的能力, 無法全盤瞭解;
故本文僅以個人所能理解的部份作說明.


2018年9月4日 星期二

[SQL Server] How to view the page content with DBCC PAGE (1) : 基礎篇


0. 前言


將近2年前, 筆者曾針對 non-clustered index 的 page 結構, 在 facebook 的 Super SQL Server 社團中詢問, 如本連結, 並非常感謝 Levis Yang, 劉修仁 ... 等前輩的指點, 而有了一些瞭解.

一直以來, 很想對 SQL Server index page 及 data page 的結構及內容, 都有很大的好奇心; 直到最近, 才有機會作一些整理.

對此主題有興趣, 但對 SQL Server 的 index 仍不是很熟悉的朋友, 建議先閱讀 參考文件01 及 參考文件02.

筆者已盡力查詢相關資料, 但有些文章, 受限於個人的能力, 無法全盤瞭解; 故本文僅以個人所能理解的部份作說明.


2018年8月23日 星期四

How to put image file to CDN or Gist, and shared to Google Blogger


0. 前言


因為在寫 Google Blogger 時, 其圖片的網址, 不管是由本地檔案上傳 / Google Album Archive / 手機 / 網路攝影機 / Google Drive 的圖檔分享, 其所產生的超連結, 很不容易辨識, 也沒有一定的規則; 如果想要自行採用外部編輯器撰稿時, 會很不方便 (例如: Sublime Text / Visual Studio Code ...) .

故一直想找一個比較能夠自行控制的儲存空間. 因此想到以下 2 個方案:
方案 1. 用 CDN (Content Deilvery Network) (例如: Cloudinary, CloudFlare, Incapsula ... 等)
方案 2. 用 gist.

方案 1. 如果採用免費版, 通常會有一些儲存空間或流量的限制, 故若是流量很大的部落格, 但又很在意付費的話, 或許可以考慮採用 方案 2.

註: 經實測, 若採用 Google Drive 的圖檔分享, 則真正放到 blogger 的內容, 已經不是原來 Google Drive 上的連結, 而是被 blogger 存到 *.bp.blogspot.com 沒有規則的複雜連結


2018年7月16日 星期一

Sublime Text 3 與 Git (GitHub) 版控機制的整合

0.. 前言


距離前一次使用 Sublime Text 已經快 4 年了, 筆者當時寫了一篇 "Sublime Text 3 操作 與 Emmet 套件安裝及使用 "; 最近因為參加一門 Bootstrap 4 的課程, 而有機會再次接觸.

本文主要在於說明 Sulime Text 與 git (github) 版控機制的整合; 雖然網路上可以查到一些文章, 但總是自己下去作過, 有痛過, 才會有經驗, 故作成筆記, 供有興趣的朋友參考.

本文共區分以下幾個段落, 相關的範例, 可 由此下載.
1.. 以 Package Control 安裝 git plug-in.
2.. 建立一個測試資料夾 (z1-vc_test), 並複製 bootstrap 4 相關的 css 及 js, 建立一個 01.html (based on bootstrap 4 範本)
3.. File / Open Folder ...
4.. 建立 project 及 workspaces
5.. 以 Package Control 安裝 gitignore plug-in.
6.. 建立 .gitignore 檔案, 並存檔
7.. 將現有專案加到本地 Git
8.. 建立第 1 個版本
9.. 加入 1 個檔案試試 ( 02.html )
10.. 查詢異動歷程
11.. 異動1個檔案(01.html), 刪掉1個檔案(02.html) 試試
12.. 上版到 GitHub

事先需準備的環境如下:
(1) SublimeText 3 : 可參考筆者的 這篇, 進行安裝及設定
A. Package Control 套件
B. Emmet plug-in
(2) Git : 可 由此下載及安裝
(3) GitHub : 已申請帳號, 並會建立 repository.


2018年6月16日 星期六

[SQL Server] Table新增欄位, 但對應的 View 卻沒有異動 的處理方式 (sp_refreshview) (進階) : 取出全部相依物件 with CTE, Recursive

0.. 前言


接續前一篇文章, 本文要來探討如何 取出某個 Table 的全部相依物件 (View), 進行 refresh View 的動作.
茲分為以下幾個部份及實作步驟進行說明:

1.. 問題重現
2.. 解決方式
3.. 延伸閱讀 (2018.06.25 補充)
4.. 結論
5.. 參考文件

2018年6月14日 星期四

[SQL Server] Table新增欄位, 但對應的 View 卻沒有異動 的處理方式 (sp_refreshview) (初階) : 只取1層相依物件


0.. 前言

最近發現某個 Table 加上欄位後, 但相依於該 Table 的 View 卻沒有異動的狀況.
本文只取1層的相依物件, 若要取全部相依物件, 請參考 另一篇進階 的文章
茲分為以下幾個部份及實作步驟進行說明:

1.. 問題重現
2.. 解決方式
3.. 結論
4.. 參考文件