2017年6月20日星期二

ASP.NET MVC EntityFramework DataContext (*.edmx) 應該放在哪裡?

以前我做 Webforms Project的時候,很多時求個方便,都都直接在同一個Project下建立DBContext (*.edmx),之後就會在DAL或BLL層面直接利用。
當然還是有機會引起Class名稱上的混亂,但還是機會較微,因為即使要採用Entity,都會使用回EF輸出的POCO classes。

但MVC專案情況下就有所不同,大家都知道,除了DBContext之外,一般我們還會在Models下建立類同的POCO classes (或可叫做DTOs, Data Transfer Objects),而到了EF6,更可以用Code First做Reverse Engineer 快速建立POCOs。
至於原因可以看看這裡 - Entity Framework classes vs. POCO




上述兩者不止內容相似,名稱都可以是相似甚至一樣,如果跟Webforms專案時一樣放在同一個Project下,那麼問題就出現了。



因為很大機會程式會出現錯誤訊息:
Schema specified is not valid.
Errors:
The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'Address'.
Previously found CLR type 'NewMVC.Models.Address', newly found CLR type 'NewMVC.Database.Address'.

最簡單地說明原因是EF會忽略Namespace,而以Class Name做Table Mapping,更詳細的解釋,可以看看CodePlex上的回報。

解決方法就是以另一個Assembly去載入DBContext,換句話說,就是新建Class Library Project去把EntityFramework的DBContext跟本身的Models分離。

2017年3月26日星期日

Google Blogger終於有新Theme用了!

一度認為Google慢慢會放棄Blogger,始終有Google Reader的前科
回顧一下Blogger的問題,有用開Blogger都會知道,Blogger無論是的Frontend和Admin頁都跟不上時代,簡單如文章搜尋功能都一直都不精準,編輯文章沒有Version Control等等都是現今,
甚至可以說是早很多年CMS上應該有的基本功能,所以都習慣了,但求Google不會對Blogger開刀而已。

2016年6月3日星期五

使用PowerShell多層資料夾大量轉換檔案繁簡中文

前幾天公司叫我把一個ASP.NET MVC專案由繁體中文轉換成簡體中文,
雖然都知道只是轉字不轉語法,但要求是這樣都沒辦法。
第一時間就想到用古法知名的ConvertZ,但原來ConvertZ只是支援一層資料夾,並不支援Recursive轉換檔案。

還是自己乖乖做小程式,網上一些文章介紹兩種方法,
一是引用VisualBasic.Runtime的Strings.StrConv功能,
二是引用Microsoft Office的Microsoft.Office.Interop.Word中的簡繁互換,
但公司是英文版Office,沒提供Language Pack,所以沒有安裝那個中文繁簡轉換增益集。
最後只可以選擇前者,但完成後,發現轉換不到簡體,既沒有亂碼,
檔案都是有修改過,但文字原封不動。
不知道是否英文Windows + 英文.NET Framework影響,都沒有研究下去。

突然想起之前SSIS專案用過Uniconv,(見UniConv - 超強轉碼工具 BIG5/GB/UTF8/Unicode)
Uniconv除了轉換內碼如Big5,UTF8等等,還可以繁簡轉換的。
花了一點時間研究如何用CMD做Loop之後.......
還是使用PowerShell更簡單。

完成後的程式碼如下:

#取得所有主資料夾和子資料夾所有檔案,可自行設定Filter
$files_table = Get-ChildItem -Path "C:\Source\MVCSite" -Include *.cshtml,*.cs -Recurse
#建立暫存資料夾供uniconv使用
$temp_folder = "C:\Source\Translated\"
foreach ($file in $files_table)
{
    #取得個別檔案所在的路徑
    $origin_folder = Split-Path -Path $file.fullname
    #複製至暫存資料夾的路徑
    $temp_file = $temp_folder + $file.Name
    #uniconv命令行
    $arg = 'UTF8 "' + $file.FullName + '" UTF8 "' + $temp_file + '" ToSimplifiedChinese'
    #write-host是debug用,類似echo或debug.print
    #write-host $arg 
    #啟動uniconv, wait參數是等待一個程序完成才執行下一個
    Start-Process -FilePath "C:\uniconv\uniconv.exe" -Wait -ArgumentList $arg
    #複製回原本的資料夾
    Copy-Item -Path $temp_file -Destination $origin_folder -Force
    #刪除暫存檔案
    Remove-Item $temp_file
}
程序上沒太多技術細節,但我轉換了多層資料夾,大量檔案都沒有問題,而且速度都很快。

要在PowerShell執行多行程序可以使用";"分號代替LineBreak。
$files_table = Get-ChildItem -Path "C:\Source\MVCSite" -Include *.cshtml,*.cs -Recurse;$temp_folder = "C:\Source\Translated\";foreach ($file in $files_table){ $origin_folder = Split-Path -Path $file.fullname;$temp_file = $temp_folder + $file.Name;$arg = 'UTF8 "' + $file.FullName + '" UTF8 "' + $temp_file + '" ToSimplifiedChinese';Start-Process -FilePath "C:\uniconv\uniconv.exe" -Wait -ArgumentList $arg;Copy-Item -Path $temp_file -Destination $origin_folder -Force;Remove-Item $temp_file;}

參考:
[C#].net的簡繁轉換
CODE-封裝Office繁簡轉換服務
用vb.net自製一個簡繁互換!!不用再開Word去互換

2016年4月10日星期日

Google Webfont的思源黑體(Noto Sans TC)中文測試

上年年尾Google公佈Noto Sans字形時,一直都有留意住。
因為一直都並未有比較好看而免費的web font可以使用,相信大多數設計網頁的人還在使用"微軟正黑體"為主。
其實微軟正黑體並不差,由2000年的Windows XP時代走到2015,依然是很多人使用的預設繁體中文字體。
但在現今高解析度的螢幕下就顯得有不足。

當時Google的Webfont服務並未有同步包含這個字形,所以一直無緣使用在網頁上。
上幾個星期,得知Google Fonts的Early Access頁面已經可以使用Noto Sans CJK就立即在自己的Blog上測試一下。

前往Early Access頁面,搜索"Noto Sans TC"就可以找得到。
至於如何使用Webfont,大家就自行Google搜尋了。

測試一下Noto Sans TC使用效果 :

1. 在微軟正黑體 / 14px的字形下是這樣,大家應該都見慣這樣式。
font-family: 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;



2. 使用Noto Sans TC後,在單純14px的情況下,其實會更得更醜,
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;



3. 主要原因是我未加font-weight去控制粗幼,Noto Sans TC的Font Weight預設是Regular 400,所以我加上font-weight: 300後,雖然字體幼了,但不會比微軟正黑體好看。
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;
font-weight:300;



4. 來到這裡,我耍了一些手段,令字體更有圓滑,我加上text-shadow:#999 0.01em 0.01em 0.05em !important,是不是開始有感覺了。
font-family: 'Noto Sans TC', 'Microsoft JhengHei', '微軟正黑體', Verdana, Arial, 'Microsoft YaHei' !important;
font-size:14px;
font-weight:300;
text-shadow:#999 0.01em 0.01em 0.05em !important



5.若果我把font-weight設回400,字體會更見結實。


所以我最後得出的結果是,視乎你使用情況而定,你可以微調font-size和font-weight得出最好的結果。
有關Noto Sans TC的font-weight可以參考官方文件 - https://www.google.com/get/noto/#sans-hant
如果你是完美主義者的話,可以再加上以下CSS做反鋸齒。
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-smooth: always;


值得一提的是Noto Sans TC在手機上有非常出色的效果,即使大量文字在最光的螢幕下看起來都十分舒服。


最後我在jsfiddle上建立了範例,大家可以用這個玩一玩測試一下。