2017年10月31日 星期二

[.Net]Dll明明有在,為什麼出現找不到DLL錯誤 - 一次搞懂如何處理Dll版本問題(Dll Hell)

image
圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/

當系統越來越模組化,大量library開始透過nuget方式組成的時候,開始會遇到一個情況,那就是Dll版本問題(Dll Hell)。

如果對於Dll版本問題沒有一些了解的情況下,常常會遇到明明Dll存在bin下面,但是還是出現找不到的錯誤訊息:

image
System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

這篇將對於.Net如何處理Dll Hell的問題做一些介紹。


2017年10月21日 星期六

[.net framework 工程師看.net core][03]工程師的語言 C#

image
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在上一篇介紹完了.Net Framework的概觀(起源.Net Framework) - 在這一篇將會介紹和.Net Framework一起誕生的語言:C#

將會了解到C#版本的歷史、主要版本之間的功能差異和.Net Compiler Platform (Roslyn) 帶來的差異


2017年10月18日 星期三

[.net framework 工程師看.net core][02]起源.Net Framework

image
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在這一篇,將會從起源,介紹.Net Framework作為開始。

先了解.Net Framework到底包含了什麼,再來介紹一下版本和Runtime之間的關係,最後在介紹一下CLR如何和C#搭配然後整個run起來。

這篇結束之後,會對於整個.Net Framework有個基本的概念並且方便之後和.Net Core和Xamarin做個比對。


2017年10月15日 星期日

[.net framework工程師看.net core][01]開篇

image

作為.net 工程師來說,最近最夯的應該就是.net core 2.0的正式發佈。

如果你和我一樣,是一個從頭到尾只使用Windows並且以開發C# .net為主的工程師,那麼.net core最明顯的跨平台可能沒什麼吸引力,畢竟只用Windows還需要夸平台嗎?

那麼是否.net core就不重要了呢?是否應該花時間學習呢?在這個系列希望能夠給目前.net為主的工程師節省一些查資料的時間,並且了解.net core的重要性。


2017年10月13日 星期五

[.Net Core 與 .Net Standard 實戰教學][Lab][03-3].Net Standard 2.0能夠直接Reference .Net Framework Library

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

透過上一個lab: 了解到了如何更容易評估把.net framework程式碼port到.net Standard之後,接下來的問題就是,可是有些第三方.net framework library沒有source code但是又要用怎麼辦?

在這個lab將會介紹.Net Standard 2.0帶來的一大優勢,能夠直接reference .net framework的library。將會使用一個2012的library:NQuery,主要目的是可以用sql語法來查詢資料。將會調整改成這種方式來查資料。

上個lab的最後成果的程式碼可以再github看到:https://github.com/alantsai-samples/2017-10-14-net-core-workshop

git標籤:lab3/1-port-net-standard-finish

兩種方式取得:

  1. 用git clone然後在checkout到lab3/1-port-net-standard-finish
  2. 從github release下載:下載鏈接

[.Net Core 與 .Net Standard 實戰教學][Lab][03-2]使用.NET API Portability分析API支援程度

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

在上一個lab:[03-1]現有.Net Framework Lib 改成 .Net Standard 了解了如何把一個現行的.Net Framework邏輯移轉到Target .Net Standard以達到最大跨平台共用邏輯的需求。在操作的過程中有特意轉成.Net Standard 1.6來模擬不支援的api DataSet, 並且了解如何使用 Api Browser來查看api支援度。

不過,難道沒有工具能夠分析現行程式碼是否支援那些target嗎?

在這一個lab將會使用.NET API Portability來達到分析支援度的情況。

上個lab的最後成果的程式碼可以再github看到:https://github.com/alantsai-samples/2017-10-14-net-core-workshop

git標籤:lab3/1-port-net-standard-finish

兩種方式取得:

  1. 用git clone然後在checkout到lab3/1-port-net-standard-finish
  2. 從github release下載:下載鏈接

[.Net Core 與 .Net Standard 實戰教學][Lab][03-1]現有.Net Framework Lib 改成 .Net Standard

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

在前兩個lab 2裡面([Lab2-1]了解Framework Dependent Deployment(FDD)執行(發佈)模式[Lab2-2]了解Self Contained Deployment(SCD)執行(發佈)模式)了解了.Net Core和.Net Framework 不同執行模式以後。

在lab 3將會切換到另外一個很重要的部分,.Net Standard 2.0的到來。

這個lab將會介紹如何移轉現有target .net Framework的程式改成.Net Standard以達到多runtime使用重複邏輯。

一般來說會先port test程式碼,在port實際的業務程式碼,不過做法都類似,以這個範例就直接port業務程式碼。

[.Net Core 與 .Net Standard 實戰教學][Lab][02-2]了解Self Contained Deployment(SCD)執行(發佈)模式

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

在上一個Lab:了解Framework Dependent Deployment(FDD)執行(發佈)模式建立了一個.Net Core Console程式, 並且用發佈看產出的結果 - 最後得到的是FDD的執行模式。

在這一個lab將會沿用上一個lab的Solution接下去建立另外一種執行模式,Self Contained Deployment (SCD)。

上個lab的最後成果的程式碼可以再github看到:https://github.com/alantsai-samples/2017-10-14-net-core-workshop

git標籤:lab2/1-fdd-finish

兩種方式取得:

  1. 用git clone然後在checkout到lab2/1-fdd-finish
  2. 從github release下載:下載鏈接

[.Net Core 與 .Net Standard 實戰教學][Lab][02-1]了解Framework Dependent Deployment(FDD)執行(發佈)模式

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

在上個Lab:[01]準備環境準備好環境之後,接下來就是建立一個.Net Core Console的Hello World範例程式。

建立出來之後,了解.Net Core在發佈出來的成果為 Framework Dependent Deployment(FDD)類型並且了解這個和以前.Net Framework的有何不同。


[.Net Core 與 .Net Standard 實戰教學][Lab][01]準備環境

image
圖片來源:https://pixabay.com/en/workshop-rustic-hammer-wrench-tool-2608390/

要開始開發.Net Core程式之前,一定需要先把環境準備好。

這篇lab主要介紹如何以VS 2017為主的開發模式來準備需要的環境。


2017年9月30日 星期六

[jquery]jquery ajax post能夠正確Model Bind到Asp .net Mvc網站 - 三種不同情境的建議做法

image
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

Model Binding是Asp .net Mvc裡面用來處理表單送出(Form Post)資料自動轉成強型別的機制。

一般來說,如果用HtmlHelper產生的html內容,在Post back的時候Model Binding基本上不會遇到什麼問題。

不過為了網站responsive更好,很多時候會希望Form Post是透過ajax來做。

這個時候依據不同做法,就很容易造成form post到asp .net mvc的時候Model Binding不到。

這篇將會建議不同情境的時候應該如何寫正確的Jquery Form post寫法,避免Model Binding不到的問題。

這篇文章相關的範例程式碼在:https://github.com/alantsai-samples/aspnetmvc-jquery-post-model-binding-sample,有用tag標註每一個不同的情境。

2017年9月20日 星期三

[iis]每個Server都應該做的資安防護 - 使用IIS Crypto一鍵設定該啟用和停用的SChannel (如SSL 3.0)和Cipher Suite (如MD5)

image
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

資安是最需要注意也最容易忽視掉的一環,尤其是當有些資安是和系統設定有關的時候。

作為開發人員,程式開發上面的資安注意事項是一定要知道的,但是Server上面就不一定,但是有時候會需要開發者來管理Server,這時候知道一些Server資安要注意的設定就變得非常重要。

在這一篇將會提到一個Server常被忽視的地方,就是設定IIS https裡面可以使用的SChannel和Cipher Suite。如何透過IIS Crypto設定最佳建議的設定。


2017年9月18日 星期一

[git]repo、branch和tag取名建議和注意事項 - 怎麼取名比較不會有問題

image
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

最近在和同事協同開發的時候,發生了一件事情:

由於我們還沒啟用CD(自動部署)但是更新測試機器又不一定是同一個人,為了好管控目前程式碼和目前測試機器上面的版本,我們使用了一個標籤叫做TestServer來記錄。

不過當我同事更新的時候,他使用了testserver作為標籤,結果我這邊發生了雖然local只有一個tagtestserver,但是在remote上面其實有兩個標籤:TestServertestserver

為什麼會發生這個事情呢?如果不處理,未來在看的時候非常混亂,這讓我想起來一直想要寫的一篇文章,為git repo、tag和branch取名的時候應該要注意什麼比較不會有問題,因此兩篇一起寫,算是不好好naming會帶來什麼問題的use case範例。

搜索關鍵字:naming guidance for git repo, tag and branch.


2017年9月6日 星期三

[打造自己的template-建立一致性程式碼][09]內建VSIX的缺點 - SideWaffle基本介紹

[打造自己的template-建立一致性程式碼][09]內建VSIX的缺點 - SideWaffle基本介紹
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在上篇([08]Visual Studio Experimental Instance 和 VSIX template的細節設定介紹) 介紹完了Visual Studio(以下簡稱VS)的Experimental Instance的一些維護方式和VSIX template的一些細節設定。內建VSIX方式建立template基本就告一個段落。

不過會發現雖然用VSIX可以版控template專案和部署的時候變得容易,但是建立template的過程有些地方還是過於繁瑣。SideWaffle因此而誕生

這篇將會對現行做法有什麼問題在做一些介紹,和SideWaffle如何讓這些變得更加容易。


2017年9月2日 星期六

[打造自己的template-建立一致性程式碼][07]匯出template建立小總結,更好的建立方式介紹 VSIX

匯出template建立小總結,更好的建立方式介紹 VSIX
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在上一篇([06]建立Item Template)介紹完了Item Template的建立方式之後,基本上關於template建立方式的介紹就結束了。剩下只是透過介紹的內容微調自己的template達到想要的目標。

Template建立方式講完了,但是另外一個問題出現了,這種建立出來的template在管理上面非常的不方便,例如沒有版控,安裝還要到特定位置等,是否有什麼方式可以讓管理變得更加簡單嗎?


2017年8月27日 星期日

[打造自己的template-建立一致性程式碼][04]了解vstemplate來微調匯出的Template和強制VS更新Template的方式

解vstemplate來微調匯出的Template和強制VS更新Template的方式
了解vstemplate來微調匯出的Template和強制VS更新Template的方式

在上一篇[打造自己的template-建立一致性程式碼][03]透過匯出建立Project Template透過匯出的方式得到了 一個zip檔案。可以透過放到對應位置來達到安裝到VS上面。

但是匯出來的zip檔案其實有一些不如意的地方,因此在這篇將會介紹Project Template組成的原理來方便微調並且介紹如何讓VS更新Template。

之前建立的sample 程式用來產生範本在 github mhat-visualstudio-template sample/chapter02

[打造自己的template-建立一致性程式碼][03]透過匯出建立Project Template

透過匯出建立Project Template
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在上一篇[打造自己的template-建立一致性程式碼][02]了解template類型和建立出要變成範本的程式建立出一個能夠用Console Process Template套件建立出來的的Echo程式之後,在這篇我們將會把建立的程式變成範本。

我們將會透過VS匯出的功能產生Template,並且介紹如何匯入匯出的template。


2017年8月26日 星期六

[打造自己的template-建立一致性程式碼][02]了解template類型和建立出要變成範本的程式

[打造自己的template-建立一致性程式碼][02]了解template類型和建立出要變成範本的程式
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

上篇了解了template的重要性之後,在這篇將會先介紹Visual Studio裡面的兩種Template:Project Template和Item Template。

了解完兩種template類型之後,將會開始打造我們的template。這邊會以一個我自己的的open source console專案作為之後範本的目標,然後建立出一個實用這個套件的簡單console程式,未來會被用來做於template。


2017年8月24日 星期四

[打造自己的template-建立一致性程式碼][01]開篇

[打造自己的template-建立一致性程式碼][01]開篇
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在公司裡面或者自己建立的套件/框架一般來說使用上都有一定的規範。例如ViewModel應該開在哪裡?建立之後要繼承什麼class?應該要有什麼namespace等。

如果規範沒有好好遵守,很容易一個人寫一個樣,另外一個人寫另外一樣 - 或許從最終結果來說沒有差異(會動就好XD),但是對於未來要維護的時候會造成很大困擾。

因此如何讓不同團隊成員有一樣概念來建立一致性專案就是一件非常麻煩的事情,而Template(範本)就是專門來解決這個問題。


2017年8月22日 星期二

IIS 無法取得font - 錯誤 Failed to decode downloaded font - 了解MIME設定和gitattributes錯誤導致的問題

IIS 無法取得font - 錯誤 Failed to decode downloaded font - 了解MIME設定和gitattributes錯誤導致的問題
圖片來源:https://pixabay.com/en/despair-alone-being-alone-archetype-513528/

最近在案子裡面遇到網站有使用到Fontello的元件。網站的靜態切板沒什麼問題但是掛到了iis之後,發現icon的部分都出不來,然後chrome F12的developer工具出現了錯誤訊息:

Failed to decode downloaded font

Failed to decode downloaded font

OTS parsing error: incorrect file size in WOFF header

但是看network裡面fontello的font又有load成功   
但是看network裡面fontello的font又有load成功

這不是我第一次使用這種font相關的套件,為什麼以前沒有發生呢?這篇將會對於發生的原因和解決方式做個總結。

關鍵字:fontello出不來、fontawesome出不來、無法使用font套件

2017年7月30日 星期日

[從.Net工程師的角度來看DevOps 21]Build階段的總結和重構 - Build Server介紹

image圖片來源:https://pixabay.com/en/books-spine-colors-pastel-1099067/ 和 https://blog.xebialabs.com/2016/03/21/essential-devops-terms/

在上篇[iThome第8屆鐵人賽 20]靜態程式碼分析之程式碼風格 - Stylecop介紹完了如何整合stylecop之後,build階段也差不多到了一個階段。

在這個階段裡面,從最基本的編譯、到執行單元測試、到整合程式碼測試的涵蓋率最後整合Code Analysis和stylecop,整個build基本要做的都做了,因此我們要開始進入如何把這個建制整合到builder server來達到CI的效果

在這篇,將會談到:

  1. 在一次重構和調整script - 以符合上build server執行的時候比較沒有問題
  2. 對build server做個簡單的介紹

2017年7月25日 星期二

[回顧][課程]20170704-20170705-電子內容管理 使用Git 與 github

[回顧][課程]20170704-20170705-電子內容管理 使用Git 與 github
圖片來源:https://pixabay.com/en/discussion-session-white-male-1874788/

在2017/07/04和2017/07/05這兩天(總共6個小時)很榮幸有機會在逢甲給非資訊系的學員介紹版控,並且如何使用版控來管理他們日常文件。

這次的課程其實非常特別,因為有別于以往我習慣的教學方式(多說明概念和原因多過於實際操作,因為實際操作很容易找到資料,但是背後原理、概念則不容易找到),這次反而是不需要了解太多背後原理,會用就好,先使用有興趣再來了解 原理。

一樣,我喜歡請大家給我一些回饋意見因此有請學員幫我填寫問卷,這篇會針對這次課程的一個總結。

前情提要

活動相關資訊
簡報主要內容

讓非資訊人員了解版控,並且以此課程延伸一些不同地方的興趣。其中使用TortoiseGit介紹幾本git操作,搭配visual studio code教學編輯markdown和編輯html檔案並且透過visual studio code直接做git commit和比對等相關動作

因此希望上完這個課程,學員可能因此對git更有興趣,或者對基礎web更有興趣(因為在做線上履歷會自己調整)或者對如何搭配專案管理(github issue tracking)更有興趣,之後在往下專研。

相關投影片

2017年7月23日 星期日

該怎麼開專案的資料夾結構?每個專案應該要有的資料夾結構和檔案

該怎麼開專案的資料夾結構?
圖片來源:https://pixabay.com/en/key-tag-security-label-symbol-2114047/

每當需要建立一個新的專案的時候,最長遇到的問題就是,我的 資料夾應該怎麼開有哪些檔案是必須要存在

對於初學者來說,可能會覺得這有什麼好難的,我就visual studio開起來,然後建立一個專案就可以開始工作了,範例不都是這樣開的嗎?

這個為什麼很重要呢?假設有些必要的檔案沒有建立,除了在開發上會造成負擔(例如缺少git忽略檔案),在之後自己回來看的時候就要花很多時間去找。例如文件在哪裡?專案的變更記錄在哪裡?ci的自動化build script在哪裡?

如果每個專案的結構和內容相近的話,不僅讓找資料更加方便,也能提醒自己有些東西需要補(例如萬惡的文件XD)。

這篇將會介紹每個專案應該要有的資料夾結構和應該要有的檔案,讓未來在建立專案的時候不會忘記。

最後,在實際進入之前,和任何軟體開發一樣,這個有很重的個人喜好(personal preference)在裡面,所以可能和各位習慣不同,由我先拋磚引玉,如果有不同想法和更好建議也歡迎提出來。

關鍵字:專案結構、開專案資料夾、project strcture、特殊檔案



2017年7月9日 星期日

[回顧][活動][Study4]20170624-大家應該都要會的工具 git - 從放棄到會用

在2017/06/24的時候非常有榮幸和大家在Study4的6月場次裡面介紹了git。

我對於大家聽完的感想其實非常有興趣,因此做了一個問卷請大家幫忙填寫。

大家都那麼認真幫我做了填寫,我當然也要認真的把大家的建議納入進去 - 因此這篇我將會對我看問卷的結果和自己時候思考到的問題總結一下,作為未來修正的參考。

前情提要

活動相關資訊
Study4 6月活動
簡報主要內容
版控歷史介紹、gui和powershell操作、Visual Studio Team Service介紹、Visual Studio Code搭配呼叫
相關投影片

2017年7月2日 星期日

[git]為什麼常出現有修改但是比對不卻顯示不出差異?談談檔案斷行問題和如何達到不同平台正確一致化

用git之後,有時候遇到在檢查狀態的時候明明顯示有修改,但是實際比對的時候發現完全沒有差異

通常來說發生這種情況就是檔案的斷行跑掉了,如果沒有好好解決到時候log會常常出現修改,但是實際上並不是真的修改,未來查找log很辛苦。

在這篇將會對於如何一勞永逸處理掉這個斷行問題做個說明。


2017年6月25日 星期日

[git]開始使用git - 用git操作svn repo

git作為分散式版控的一項優勢是可以在offline的情況下查到log,並且能夠隨時隨地commit;這個對於當中央repo在公司內部的時候會更加有感(因為通常內部都要透過vpn,就有可能導致速度慢,甚至有些vnp還會切斷你的外網, 沒有google要怎麼寫code XD)

很不幸的,如果你今天被要求使用svn或者tfs,你就沒有辦法像git一樣在無連線狀態下查log。

但是別絕望,git其實可以透過一個Bridge來和svn溝通,從外部來看,你好像還是使用svn,但是其實你實際上使用git。所以git的那些優點(local有一個版本,因此可以local commit,快速切branch等)完全可以使用。

這是一個很好開始嘗試git的方式。

題外話,我當初接觸git就是為了他的local功能,因為實在太好用了,最後慢慢就希望全部換成git。

昨天有幸為 Study4的6月場次介紹git,其中有學員有特別提到關於git和svn溝通的部分, 因此把當初所做的事情作了一些整理。如果有任何地方看不懂或者有缺或者漏的地方,在留言給我。


2017年6月18日 星期日

[git]重新命名檔案的方式和如何在log檢查到改檔名前的歷史記錄

how to properly rename in git and show the log of previous rename

當持續在改檔案內容,容易發生當初為這個檔案取的名字已經不適合描述目前內容的情況,所以會對檔案名稱做修改。

最好的例子就是重構,當重構的時候很容易發生class名稱變換,這個時候會一起調整class的檔案檔名避免未來不好找。

不過當有天需要追蹤那個檔案的變更歷史的時候,會突然發現,只有 從新檔名那段開始有記錄,而舊檔名的記錄則看不到。這個對於從svn轉過來的使用者來說是無法理解的。

在這篇將會針對這個常見的問題來談到解決的方式和為什麼git會是這樣運作。

rename以前的log不見了
rename以前的log不見了

2017年3月28日 星期二

[Visual Studio]如何在Visual Studio 2015使用C#7的功能?

隨著Visual Studio 2017發佈之後,C# 7也同時發佈了。

C# 7 和 C# 6一樣,帶來都是比較偏幫助開發的時候寫起來更加簡潔的一些寫法,因此很容易就會想要使用來增加易讀性。

這個時候如果團隊使用的Visual Studio版本不同,容易就會發生編譯問題,以Visual Studio 2015來說,在編譯C# 7 就會出錯,那是否就不能夠用了呢?


2017年3月12日 星期日

[Visual Studio 2017]建立離線安裝(Offline Install)包

「工欲善其事,必先利其器」作為.Net 開發者來說最大的利器就是Visual Studio。

最近Visual Studio剛過完20歲週年並且發佈了最新版本VS 2017,當然要第一時間來試試看到底可以對開發增加多少幫助,這個時候會發現,怎麼都找不到離線安裝的版本了呢?

這篇將會介紹如何建立離線安裝版本的安裝檔。


2017年1月15日 星期日

[iThome第8屆鐵人賽 20]靜態程式碼分析之程式碼風格 - Stylecop

在上篇介紹了如何透過使用Code Analysis來達到程式碼品質的分析。

在這一篇將會從另外一個層面介紹使用靜態程式碼分析來達到程式碼風格的一致性 - Stylecop。


[iThome第8屆鐵人賽 19]靜態程式碼分析之Assembly品質分析 - Code Analysis(以前的FxCop)

在了解完如何分析測試碼的涵蓋率(也代表測試品質)之後,我們將來看另外一種保持程式碼品質的方式,也就是透過靜態程式碼分析。

在.Net的世界里,從最早期的而外工具FxCop,到後來進化成為VS一部分的Code Analysis就是專門在做這個方面工作的工具。

在這篇將會介紹如何使用Code Analysis,並且如何把它整并到我們的Build Script裡面。

廣義來說,靜態程式碼分析應該是針對源代碼(Source Code)作分析,實際上Code Analysis其實是對Assembly作分析,而Assembly也是IL,所以真的要叫做靜態程式碼分析應該也沒錯,只是 真的要嚴格說起來,Code Analysis應該不能夠稱之為靜態程式碼分析。不過以下我還是會稱之為靜態程式碼分析。(有點繞口)

2017年1月14日 星期六

[iThome第8屆鐵人賽 18]OpenCover 結果 - html結果產生篇

在上篇了解到了測試涵蓋率的計算方式之後,已經可以了解xml報告的一些數字所代表的意思。

但是,xml畢竟不是那麼容易讀得懂,並且也不容易看出到底那些地方沒有測試到。

在這篇,將會介紹如何把xml結果產生出html結果,並且如何使用。


[iThome第8屆鐵人賽 17]OpenCover 結果 - 涵蓋率介紹篇

在上篇把OpenCover整合到測試之後,每當執行測試後會產生出一個涵蓋率的結果報告出來。

這個涵蓋率的結果是一個xml的檔案,這個xml其實有非常豐富的資訊,但是沒有一些基礎概念會不理解是什麼意思。

因此,在這篇,將會對於涵蓋率相關的資訊做一個介紹和說明。