# 專案進度
## WPF project 程式介面
- Main

- Create - Key in data

- Create - ClickCheck Button, change tag

- Change Tag

- Change Tag - editting

- Read

- Search results - all data contain Tag - anime

- Detail - After Double Click row 9

- Detail - We can update/delete this data in this window

## 進度
### 2/27
- 完成添加資料視窗,Check按鈕的功能。
### 2/28
- 完成ChangeTag子視窗的完整功能
- Groupby這個函數,好像比較適合拿來分析資料,不適合拿來產生IEnumerable
- 移除所有Browse按鈕
- 增加CheckAll按鈕,僅確認資料夾\(DataBase) or 檔案位置是否存在
### 3/01
- 完成CheckAll按鈕
- 新增CheckAll結果的顏色提示
- 新增Reset按鈕
- 完成CreateWindow的所有功能
### 3/02
- 新增Search Window
- 將Main Window改成選模式,Create Window設為須由Main Window開啟
### 3/06
- 調整DataBase(directory)的架構
- 修改寫入/讀取 \*.video的程式碼
- 完成Search時,不同資料庫Tags的merge
- 完成於複數DB以Tag搜尋Video的功能
### 3/07
- 點擊SearchResult視窗的hyperlink可直接開啟YT連結
- 建立程式碼解說文件,內容目前有Merge Tag與Search by Tag,程式功能繼續增加會再更新。
- Update Window prototype
### 3/08
- 完成初版的所有功能
- (未更新至DB版本)完成Demo影片的[解說](https://hackmd.io/@qFAJdSGFTWmS4XvD3xDFNQ/Hk0z8qEb5)
### 3/11
- [udemy ocw](https://www.udemy.com/course/introduction-to-databases-and-sql-querying/ )
### ? - 3/16 (無關C#/DB/SQL 但花了很多時間在寫這些@@)
利用PyDrive實現不同電腦的資料傳輸,與工作的分配。

work flow 如下
1. 在實驗室電腦(圖左)上建立問題的複數個模型。
2. 將模型上傳到google drive。
3. 高速運算中心的電腦(圖右)會自行判斷是否上傳了正確的數量,並把全部模型載下來。
4. 載下來後會提交運算的job script並等待運算結束後上傳回google drive。
5. 回到實驗室電腦(圖左),會自行判斷是否上傳了正確的數量,並把全部運算完的模型載下來,並分析模型的運算結果。
6. 利用運算結果產生新的一批複數個模型:同步驟1,並且接步驟2,如此循環交替的疊代運算模型找最佳解。
### 3/19
1. 套用Agile的說法:
`不去預測或嘗試避免,未來才會出現的問題,專注在當下目標最高品質的程式碼。`
先將Table設計成專注在Youtube平台上的影片,WPF project的程式碼之後可能也要改一下...= = QQ
\
感覺Agile的這一原則跟物件導向的通盤規劃物件,設計完美的類別來建構程式,有一點衝突?
2. DECLARE @SQL VARCHAR(MAX)
嘗試了很久,感覺SQL要做到複雜的迭代/查找/建表(非用JOIN),非常的困難= =
在使用一些函數時,光是可以PASS的變數種類就被嚴格限制了
不如直接用EXEC(@SQL) = =
FUNCTION 宣告也很難懂...
3. 成功用SQL將原本的*.video轉入Table中了,但內容還需要做字串處理,明日再戰...
### 3/21
- 如果database的varchar中混了escape character真的超級麻煩...很多字元用print他只會顯示空白,要用ASCII找到底卡了那些字元進去...
- 將原始的影片資料分成三個Table儲存
### 3/23
- 完成單一DB的查詢功能
- 利用Generic Method與Pass method,將SQL的結果存進各式物件中
### 3/25
- 把以ID,Title,Tag查詢的功能改寫在同一個SQL中
### 3/27
- inner join的performance感覺受order影響超級大,修改了一下search SQL的寫法
- 同時開著SSMS再用C#去連DB會影響Performance的樣子@@
- 完成DELETE, UPDATE, CREATE
### 3/28
- 重寫了編輯Tag的視窗
- 跨DB
### 4/01
- 整理程式碼,merge DB版本進master
### 4/04
- Visual Studio 的 C# Interactive 很好用
### 4/06
> Login and logout events will not be raised on the server when a connection is fetched from or returned to the connection pool, because the connection is not actually closed when it is returned to the connection pool. For more information, see SQL Server Connection Pooling (ADO.NET).
文件只有連結到Logout的Event,好像沒有內建從C#端Logout的方法,只能被動等Server端幫登出。
- using/Dispose/Close
用SQL Server profile觀察,connection開啟連線後,不管是主動Dispose/Close還是用using(等效於Dispose)都不會Logout。
```csharp
using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
{
connection.Open();
connection.Close();
}
```
- using的機制
C# 對using的描述如下
> Provides a convenient syntax that ensures the correct use of IDisposable objects. Beginning in C# 8.0, the using statement ensures the correct use of IAsyncDisposable objects.
並且
`IDisposable`<-`DBConnection`<-`SqlConnection`
`Component` <- `DbConnection`
所以using connection之後,他會呼叫從`Component`(應該)繼承來的Dispose(),
`SqlConnection.Close`是繼承自`DBConnection`後override的,並且根據
SqlConnection.Close的文件描述
> `Close` and `Dispose` are functionally equivalent.
我也不知道Close是用來幹嘛的= =,也不是Finalize,可能單純用來避免using包太多東西?但也可以直接用Dispose= =,可能`DBConnection`的Abstract Close會在Derive其他類別時被用到吧...?
- HeadFirst C# Chapter4
原來assign a.k.a. `=`也會回傳一個值= =,所以可以寫成這樣
```csharp
int a, b, c, d;
// a = b = c = d = 0
a = b = c = d += 1;
// a = b = c = d = 1
```
- CLR
> The runtime automatically handles object layout and manages references to objects, releasing them when they are no longer being used. Objects whose lifetimes are managed in this way are called managed data. Garbage collection eliminates memory leaks as well as some other common programming errors
### 4/12
- new modifier
若在subclass中宣告與base相同signature的方法,則該宣告會於該subclass中實作,並"hide" base原本的方法。意即現在兩個方法同時存在,但一個在subclass下,另一個在base下。
經過繼承,因為base中的其他方法,不會知道subclass中有新的方法,故只會呼叫base原本定義好的方法。
而subclass中,除了new的方法,也可以利用base.方法來呼叫原本定義好的方法。
```csharp
class A
{
protected void Method1() { }
public void CallMethod1()
{
Method1();
}
}
class B : A
{
// without virtual/override, this will hide Method1 from class A
protected void Method1() { }
public void CallNewMethod1()
{
Method1();
}
public void CallOldMethod1()
{
base.Method1();
}
}
static void Main()
{
class B = new B();
B.CallMethod1();
// Since this method is defined in class A,
// it will call the old method1 in class A.
B.CallNewMethod1();
// call new Method1 under class B
B.CallOldMethod1();
// call old Method1 under class A
}
```
### 4/20
教授說可以開始寫論文了@@,一個月左右能寫完
### 近期規劃
- FOREIGN KEY Constraint/PRIMARY KEY
- 最佳化SQL的效能
### ? 未做 中期規劃
- 規劃一個好一點的檢查方案(Code/Code位置)?,用於對DB做CUD前
- Entity Framework Core
- Model–view–controller
- Defensive programming
### 書的進度會四月底前完成,有確定口試時間也會再知會組長,謝謝QQ
### 其他
[sql 語法紀錄](https://hackmd.io/@qFAJdSGFTWmS4XvD3xDFNQ/HJlzfqQzc)
[Github](https://github.com/giginepuran/MediaManage)
### 書單進度
`-`:沒看完
`O`:看完
`X`:沒看
#### 無瑕的程式碼 敏捷完整篇
|章節|名稱|進度|
|-|-|-|
|1|敏捷實踐|O|
|2|極限程式設計概觀|-|
|3||X|
#### ASP.NET Core 打造軟體積木和應用系統
|章節|名稱|進度|
|-|-|-|
|1|資料庫文件系統|-|
|2||X|
#### 深入淺出C#
|章節|名稱|進度|
|-|-|-|
|1|開始使用C#來建構程式|O|
|2|陳述式、類別與程式碼|O|
|3|讓程式有意義|O|
|4|取得參考|O|
|5|封裝|O|
|6|繼承|O|
|7|讓類別遵守它們的承諾|-|
|9|LINQ與lambda|O|
|-|-|X|