2017年7月18日星期二

ASP.NET Core + CentOS 7 + Apache安裝攻略

作為一個經歷過ASP.NET初代到4.5版本的人,見到ASP.NET終於能夠誇平台是值得興奮的事。
雖然Mono早在好幾年前已經很成熟,而且相容度亦滿足一般使用,但始終不是官方支持,商業上實在很難說服團隊使用。
現在周圍的人都在應用Azure/AWS,甚至是Docker技術把虛擬機和程式封裝運作,ASP.NET MVC/Webforms只能在IIS上執行的確是很尷尬的局面。
Microsoft此舉絕對是明智決定,由一直面對著主流的PHP,Java/Spring,到近年在Start-up廣泛使用的Ruby on Rails或Python/Django,都是Cross-platform的。
所以DotNET Core的出現使ASP.NET不再邊緣化,終於名正言順在Linux/Mac上運行了。
我都來湊下熱鬧,嘗試設置一下DotNET Ready的Linux平台,過程中固然不會一直都順利,自己都是LINUX外行人,我使用CentOS的時候已經是大約6年前的CentOS 5,很多Command都忘記了。
所以我就把每一步Command的輸出,和自己遭遇到的問題解決辦法都寫下來,給自己和大家參考一下。


事前準備
我所採用的軟件版本如下:
  • CentOS Linux release 7.3.1611 (Core) 64Bit
  • Apache 2.4.6 (httpd.x86_64 0:2.4.6-45.el7.centos.4)
  • .NET Core 1.0.4

有幾個官方連結會用上的:
  1. CentOS Linux release 7.3.1611 (Core) 64Bit
  2. Set up a hosting environment for ASP.NET Core on Linux with Apache, and deploy to it
  3. .NET Core command-line interface (CLI) tools

頭兩個是必須的,第三個頁面讓你了解一下Linux下的DotNET CLI工作的命令。

首先我們依照第一個頁面的指示先把DotNET Core核心檔案安裝至Linux。
頁面上沒有提的事,就是我們安裝CentOS後,有兩件事我認為要做的。
1. 做一次系統軟件更新
2. 安裝VNC Server,畢竟我是來自Windows世界,有GUI操作資料夾或檔案,用GUI文字編輯軟件(GEdit)去編輯Apache Config檔會更容易,沒必要扮Geek用vi Editor吧...

Yum Update

***請確認是使用Root權限作SSH連線***

#確認CentOS版本
[root@localhost ~]# cat /etc/centos-release
#> CentOS Linux release 7.3.1611 (Core)
#更新一次系統軟件
[root@localhost ~]# yum update
#完成後,重啟系統
[root@localhost ~]# reboot

安裝VNC Server
#確認沒有安裝過VNCServer
[root@localhost ~]# which vncserver
#***Output***:
#> /usr/bin/which: no vncserver in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

#安裝Gnome Desktop
[root@localhost ~]# yum groupinstall "GNOME Desktop"

#完成後,安裝VNCServer
[root@localhost ~]# yum install tigervnc-server

#執行以下指令,檢查是否安裝完成
[root@localhost ~]# rpm -qa | grep tigervnc-server
#***Output***:
#> tigervnc-server-1.3.1-9.el7.x86_64
#> tigervnc-server-minimal-1.3.1-9.el7.x86_64

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去互換