2018-04-21

decimal 屬性輸出 JSON 時指定的格式問題

這是之前專案遇到的狀況:輸出 金額 時只需處理到小數點下二位。既然是 金額,為了避免精準度造成的誤差都會選用 deciaml 資料類型,而在 db 中使用 money 儲存(因為業務需求面沒有運算需求可以使用,如果會有運算 money 有失真的風險,詳細內容請參考 欄位開立(2) - decimal, numeric, float, real, money 的抉擇),預設精準度為小數點下四位,為了符合目前系統的要求(小數點下二位),就需要調整輸出,來看看可以怎麼做吧

2018-04-17

清除 Windows 上的 git 驗證資訊(Credential)

公司電腦的安全性設定要求固定時間需要修改個人 AD 密碼,連帶其他內部系統密碼也會一並被修改,之前修改 AD 密碼後,密碼驗證失敗會彈出錯誤訊息要求重新輸入,但最近卻出現吐出驗證失敗沒有要求重新輸入,造成與 git server 的交互動作全部失敗,順手紀錄一下個人做法:將 Windows 上紀錄的 git credentials 清除,需要與 git server 溝通時重新輸入

2018-04-12

使用 Topshelf 搭配 Quartz.Net 撰寫 Windows Service 排程執行工作

排程工作在許多系統中都是必備組件,常用來處理非立即性作業(e.g.:每日交易結清,發送電子報...etc),如果沒有特別要求或限制下做法非常多:像是 host 在 web application 下的 web background runner : Quartz.Net 與 hangfire 或是 console + scheduled tasks ,另外就是今天要紀錄的 Windows Service + timer 功能,都可以達到排程執行目的

雖然今天要紀錄的內容目標是 Windows Service + timer,卻也有些不同,會透過 console 應用程式與 Quartz.Net 來實作,並使用 Topshelf 來安裝,其中 Topshelf 是套用來簡便建立 Windows Service 的 framework,可以直接撰寫 console 應用程式讓整個開發及偵錯更為容易,完成功能開發後再將 console 應用程式安裝為 Windows Service 而 Quartz.NET 則是排程 framework,移植自 java 上的 Quartz. 立馬來看看如何實作吧

2018-04-10

使用 RedLock.net 搭配 redis 達成分散式 Lock

RedLock.net 是前兩個禮拜從安德魯大大的 架構面試題 #1, 線上交易的正確性 一文中看到使用 redis 搭配 RedLock 演算法製造出分散式鎖定 (Distributed locks) 的套件,也是 Redlock distributed lock algorithm 在 C# 上的實作之一,主要相依於 StackExchange.Redis 套件(實作 Redlock 的其他程式語言及套件可以參考 Distributed locks with Redis)

當下看到安德魯大大介紹,立馬回想起過去為了達到分散式鎖定苦思了許多但還是沒有想到好方法的冏況,終於有機會突破當時的技術瓶頸,恰巧最近需要重構一段程式碼從本機的 object lock 改為分散式鎖定 (Distributed locks),正好可以透過實戰來上手效果更佳

2018-04-09

使用命令列指令 (VSTest.Console.exe) 執行 MSTest V2 測試

之前筆記 使用 MSTest.exe 指令來進行測試 曾經介紹到使用 MSTest.exe 在 cmmand line 環境中執行測試,筆記結尾有提到未支援 MSTest V2 的測試功能,在原本使用 MSTest V2 專案不多的情況下影響不大,但近期專案為了使用 Live Unit Testing 逐漸改用 Visual Studio 2017 搭配 MSTest V2,除了開發階段方便外,為了讓 CI 充份發揮功能,得另外調整 unit test 的語法,就來看看該如何使用命令列指令執行 MSTest V2 測試

2018-04-08

ASP.NET Web API Unit Test 出現需要加入 `System.Web.Http` 參考錯誤

為 ASP.NET Web API 加上 unit test 時,在加入 action 實際動作後 Visual Studio 就提示需要加入 System.Web.Http 參考,仔細回想這個問題也不是第一次遇到了,只是過去都是直接手動加入 System.Web.Http 參考先解決問題為主,但因為直接加入 System.Web.Http 參考會直接相依個人電腦上的設定容易造成其他團隊成員無法取得 System.Web.Http 或是 CI server 無法順利執行測試

所以趁這個機會紀錄一下正較的做法,以供日後參考

2018-04-07

加快大型 GIT Repository 下載速度(指定 depth)

同事反應有個專案在經年累月的發展下,快速成長到每次 clone 都要個十幾二十分鐘,後來甚至有次在 production deploy 時還完全卡死,無法正確 pull 新的 code

在檢查無法 pull 的過程中,發現光只是 clone 就讓我失去耐心了,所以分享給同事只抓最後版本的做法(發現用自己筆記分享做法給同事超省事還能 reuse ,超棒的 哈哈)

2018-04-06

匯出 Excel 時使用多國語系 Resource 當做欄位名稱

之前筆記 使用 C# 將資料匯出成 Excel (.xlsx) 紀錄到使用 ClosedXML 搭配 generic 與 reflection 匯出 excel,方便使用者自行調整資料報表

剛好有個系統需要支援多國語系,連帶地使用者對要求 excel 也需要有多國語系,雖然資料內容無法隨意改變,但 excel 的欄位名稱就有調整的空間,就來看看可以如何處理吧

2018-04-05

使用 C# 將資料匯出成 Excel (.xlsx)

雖然大部份系統都會有報表相關功能,只是多數情況都無法在系統建置時就設想到所有使用者需求,加上常常功能需求的優先程度會被報表高不少,所以就會透過將資料匯出成 Excel 讓使用者自行組裝成需要的格式及內容以應付需求就成了最有效率的方式

針對匯出 excel 的需求,前幾天同事問到相關問題,才發現我連匯出 excel 的基本功能沒有做過筆記,所以立馬來補紀錄一下囉

2018-04-04

使用 C# 將資料匯出為 CSV

最近有個需求是將部份資料內容倒進其他系統中,主要計劃是打算透過目標系統所開發的 restful api 來 insert 資料,但在實際透過 api 交換資料之前最重要的工作當然就是確保資料格式跟內容都是正確的,經過討論後決定將資料匯出成 CSV 讓目標系統相關人員 review 匯出的資料內容是否合乎要求

收到這個需求時,雖然知道難度應該是不高,只是沒有很確定的想法,還試著找過有沒有好用的套件,最後還是索性自己動手,順手紀錄一下

2018-04-03

ASP.NET Identity 如何依據不同用途設定個別 Token 時效

之前曾經筆記中 改 ASP.NET Identity 2 的 Token 時效 紀錄到 ASP.NET Identity 預設的 token 時效及調整方式。在專案實際使用時,user 提出其他需求:依不同功能別而有不同的 token 時效,例:註冊新帳號 - 確認 E-mail 的時效為 24 小時;忘記密碼 - 重設密碼的時效為 15 分鐘

針對這個需求,有好幾個可行方案閃過,但沒有實際驗證過誰也說不準能不能用,所以立馬來試試看囉

2018-04-02

如何增加 VirtualBox VM 空間

為了測試網站相容性,打算透過 VM 來安裝可能有資安疑慮的瀏覽器,避免影響到主要開發用電腦,只是在建立 VirtualBox VM 時並沒有預期會有其他軟體所以起始的配置空間不足而無法安裝瀏覽器

雖然重新製作新的 VirtualBox VM 可以徹底解決問題,但重新安裝 OS 有些太浪費時間了,所以就來看看如何擴充 VirtualBox VM 的空間吧

2018-03-13

用 C# 將 PowerPoint 檔(.pptx .ppt) 轉換為 PDF

之前筆記 使用 C# 將 Word 檔(.docx .doc) 轉換為 PDF 紀錄到該如何使用 Word 內建 API 將 Word 轉存為 PDF,後來有網友問到 Excel 及 PowerPoint 轉存的狀況,為了不要給出錯誤的答案,當然要實際測試看看比較準囉,其中 Excel 轉存 PDF 程式碼已紀錄在 使用 C# 將 Excel 檔(.xlsx .xls) 轉換為 PDF,接著就是來看看 C# 在處理 PowerPoint 轉 PDF 有什麼不同吧

2018-03-12

使用 C# 將 Excel 檔(.xlsx .xls) 轉換為 PDF

之前筆記 使用 C# 將 Word 檔(.docx .doc) 轉換為 PDF 紀錄到該如何使用 Word 內建 API 將 Word 轉存為 PDF,後來有網友問到 Excel 及 PowerPoint 轉存的狀況,為了不要給出錯誤的答案,當然要實際測試看看才能確保正確性,而驗證的過程中發現 Excel 轉存程式跟 Word 有些落差,於是就多紀錄一篇了

2018-02-26

使用 GIT 找出特定期間內特定檔案的修改資料

過去幾次 production 環境的更版都遇到 config 異常的狀況,輕則只影響特定功能,嚴重的讓整個 application 都 crash,根本原因是 config 的調整是由 developer 開發但實際上線內容都是 change manager 使用工具批次套用的結果,造成 developer 沒辦法即時知道實際上線的內容,所以想透過 git 的 log 撈出針對 config 有修改紀錄的 developer 在上線前夕可以預先知道該提醒哪些 developer 進行確認

站在客觀的角色,我不認為這是個好做法,只是我理想中相對好的做法就需要改變既有的流程,但流程可就不是說改就改的,需要時間好好討論大家的需求與顧慮,所以才想暫時透過 git log 列出 config 類檔案的修改人員清單

2018-02-24

使用 telnet 檢查 SMTP 是否正常提供服務

近期手上的重要專案到了要上線的最終階段,在正式對外服務前,Server 間的相關設定都需要一一確認與驗證,其中關於 mail server (SMTP) 這塊,因為是全新的 server,沒有額外安裝可以用來測試的工具也沒有其他 application 可以用來測試,這時 Windows 內建的基本工具 telnet 就成為最佳幫手了

而我因為好一陣子沒用生疏不少,趁著這次機會再複習一下,順手紀錄一下用法

2018-02-22

Windows 7 無法安裝 IIS ASP.NET 模組

這個問題發生在公司的 Windows 7 電腦上,一般日常的程式功能開發大多使用 IIS Express,用到 IIS 的機會並不高,但如果要同時開多個 website,IIS 使用的資源量就會比開多個 Visual Studio 降低很多

最近一直想要釐清同事遇到的 CORS 405 錯誤,在反覆測試的過程中竟然把 IIS 搞到無法 host ASP.NET application,身為 ASP.NET 開發人員,卻無法在 IIS 上建立 ASP.NET 站台XD,讓很多測試情境無法進行,嚴重影響工作效率

當然最終手段 - 重灌,可以解決問題,但除非必要實在不好意思麻煩 MIS 同事,幸虧最後找到不用重灌的解決方法,就來看看該如何解決問題吧

2018-02-20

在 Windows 10 上啟用 Linux Bash Shell

主要使用的筆電在某次更新失敗後就再也無法完成更新,一直停留在 Windows 10 舊版本,雖然在備用機上的 Windows 10 仍正常運作不至於錯過了幾個有趣的功能,但近期的 CPU 漏洞更新在每次開機都會重新執行,讓我實際無法在忽視這件事,所以趁著農曆新年的空閒時間重新安裝了 Windows 10,結果發現 Windows 10 上啟用 Bash 的流程有些不同,紀錄一下

2018-02-09

Windows 7 中無法使用 PowerShell 安裝 IIS?!改用 DISM

這次遇到的問題是在公司的 Windows 7 電腦上,雖然 Windows 7 也是優秀的作業系統,但終究是較早期的產品,對於一些新的工具就得自行安裝或是不支援,今天遇到的狀況就是其中一個例子

因為安裝 Windows feature 的 GUI 持續吐出錯誤 無法完成安裝,所以想試試透過 PowerShell 安裝,結果 import module 就失敗

發現網路相關文章不多,自己紀錄一下囉

2018-02-08

IIS 10.0 開啟 ASP.NET 應用程式出現 403.14 錯誤

最近一兩周嘗試找出同事提出的問題背後所隱含的根本原因,同事遇到的狀況已經解決,但遲遲沒有找出自己可以接受的答案實在不夠痛快,經過幾天反覆驗證終於好像看見真相的一道曙光時,竟然在建立全新環境時做最後確認時遇到 403.14 錯誤

這個 403.14 錯誤對於常常在 IIS 上建立 ASP.NET 站台的朋友想必一定不陌生,而這次解決問題的方式與以往經驗不同,藉此紀錄備查

2018-02-05

C# DateTime 轉 JavaScript Date (依使用者偏好區域來顯示時間)

同事負責的頁面會有不同時區的 user 來瀏覽,時間類型的顯示會直接影響 user 的使用者體驗,尤其是各式公告跟有時效性的操作更是需要特別留意

主要的需求就是用 C# 從 DB 取出 DateTime 資料,接著顯示在網頁上,而 DateTime 資料需要依據使用者所在時區來顯示

以下紀錄一下個人想到的做法,再跟同事交流看看可以怎麼改善

2018-02-04

如何設定 IIS 存取 LocalDB (.MDF) 及並解決 Error 50

繼之前筆記 IIS 存取 LocalDB (.MDF) 時出現 Error 52 解決在 IIS 中直接存取 LocalDB (.MDF) 時出現 Error 52 後接著馬上又遇到 Error 50 的狀況,還好這個錯誤之前就遇到,大概知道原因跟處理方式,就來看看該如何解決吧

IIS 存取 LocalDB (.MDF) 時出現 Error 52

資料庫是網頁應用程式儲存資料最常見的方式,存取資料的操作方法也最廣為人知,只是資料庫本身有維護及管理成本,如果目的只是本機開發使用,透過 IIS Express 搭配 LocalDB 就可以滿足大部份情境了,不過一旦需要實際部署至 IIS 上,LocalDB 就不適用了,因為 LocalDB 是 SQL Server Express 的一種特殊執行模式,而 SQL Server Express 本來就不適用在 production 上,加上 LocalDB 也不是設計用來搭配 IIS

剛好最近有個功能想要模擬不同時區的顯示,可是又不想大費周章管理架設 SQL Server,於是就想到透過 LocalDB 來簡單驗證功能正確性,有段時間沒有這麼做了,設定方式有些生疏,順手紀錄一下以備日後又想偷懶XD

2018-02-02

IIS 設定啟用 CORS (Cross-Origin Resource Sharing) - 跨來源資源共用

網站工程師或多或少都曾聽過 CORS (Cross-Origin Resource Sharing) - 跨來源資源共用,甚至遇到相關問題,小弟也不例外,只是以往主要都是調整 ASP.NET MVC 或是 ASP.NET WebAPI 的設定,這次同事遇到的問題則是靜態網頁,而需要調整 IIS 設定,就來看看如何設定 IIS 啟用 CORS 吧

2018-01-30

Enum To List<SelectListItem> 及 Enum To SelectList

無意間看到專案中的一段程式碼,讓我停頓了一下,一時之間好幾個念頭閃過卻不知道該選擇哪個做法來改善

大意是 View 中有個欄位資料型別是一個 enum,預設範本直接透過 @Html.EnumDropDownListFor 進行綁定,但這樣的輸出有個缺點: enum 的預設值也會被輸出,為了避免預設值也被輸出成選項,第一個念頭就是透過自行組裝 select 及 option 相關 html 的做法

只是靜心想想,是不是有其他更好的做法,想到三個做法筆記一下

2018-01-28

DebugDiag 2 Analysis 出現 DacError

繼前篇筆記 WinDBG 出現 SOS does not support the current target architecture ?! 紀錄在使用 WinDBG 偵錯 production issue 時遇到使用 64-bit 工作管理員匯出 32-bit 程式的 dump 而無法順利完成偵錯的狀況

遇到問題當下並沒有其他心思去偵錯 WinDBG 所以立馬改使用黑大在 ASP.NET CPU 飆高問題之傻瓜分析工具-DebugDiag Tools 一文中介紹的 Debug Diagnostic Tool (DebugDiag) 來查問題,但第一次使用 Debug Diagnostic Tool (DebugDiag),加上問題源頭原本就與工具無關,並沒有順利查出問題根源

在使用 Debug Diagnostic Tool (DebugDiag) 過程遇到不常見的錯誤訊息,於是紀錄一下使用經驗

WinDBG 出現 SOS does not support the current target architecture ?!

前幾天 production server 上的出現 CPU high 的 warning,當下立馬想到使用 WinDBG 來追查問題發生原因,只是我使用 WinDBG 的頻率不高,每次在使用前都要再花一些時間查語法,幸虧黑大日前的文章 - WinDBG 應用實例:找出 ASP.NET CPU 100% 原因 列舉幾個常用的 WinDBG 語法,讓使用 WinDBG 時的前置時間縮短不少,可以更有效率地專注在追查問題原因

以往使用 WinDBG 時都還算順利,但這次卻出現 SOS does not support the current target architecture 的狀況,讓追查動作無法繼續下去,所以立馬來紀錄一下這次使用 WinDBG 的經驗

2018-01-22

NLog 設定 Rule 僅包含部份 Logger

log 是系統正式上線後,少數可以用來協助 debug 的資訊,而 debug 的難易度與解決問題的速度也就跟著 log 的品質而有極大的差異。

今天想要紀錄最近專案遇到的一個需求:某些 log 內容很少使用加上資料量又大實際效用不高,但卻是追查 bug 的最後一道不可或缺的防線(像是 EntityFramework 實際產出的 SQL script),而其他 log 則紀錄了整個程式流程的相關資訊,所以打算將 db 的 script log 與其他程式執行資訊分開儲存,避免 db 的大量 log 形成雜訊而拖慢 debug 的速度,就來看看 nlog 可以如何設定吧

2018-01-20

使用 Moment.js 來簡化 JavaScript 的時間處理

專案的前端頁面在 user 要求加速整個流程下,使用了一套 library - Date Range Picker 方便使用者可以在同一個 input 中同時選擇 start date 與 end date 也讓整體操作獲得簡化,整體改善獲得 user 的好評

故事開頭似乎跟筆記的標題沒什麼關係?! 因為使用了 Date Range Picker 來處理需要同時選擇 start date 與 end date 的需求,而為了讓頁面呈現統一也使用 Date Range Picker 來處理單一日期的選擇,在設定單一日期選擇器的過程中發現 Date Range Picker 送出的日期一樣是 start date 與 end date,並且相當貼心的已經處理成 start date 為選擇日期的 00:00:00 而 end date 為選擇日期的 23:59:59 讓後端程式可以少做一些處理 非常方便,需是乎就打算來學習一下 Date Range Picker 是如何處理 js 的時間問題也才發現今天主角 - Moment.js 的強大功能

今天就來簡單地紀錄一下自己常用的 Moment.js 功能吧

2018-01-18

使用 C# 取出 Word (.docx) 中的內嵌 Office 物件

之前筆記 取得 Word(.docx) 中的內嵌檔案 紀錄到如何在 word 中嵌入其他物件,也提到如何簡易地取出內嵌物件

今天則是要紀錄如何使用 C# 將 Word 中的內嵌物件取出

2018-01-17

取得 Word(.docx) 中的內嵌檔案

之前筆記 使用 C# 將 Word 檔(.docx .doc) 轉換為 PDF 曾經分享過如何使用 C# 將 Word 轉成 PDF,同事在實作後 user 反應如果 word 中有其他文件(e.x. pdf、word、excel、zip) 並沒有同步進行轉換,造成資料遺失

不是我刻意想吐糟 user 反應沒有處理 word 中有其他文件的問題(user 永遠是對的XD),但在 user 提出需求前根本就沒有說 word 會內嵌其他文件,根據最小可行產品的原則一定是沒做的呀 哈哈

今天就先紀錄一下不使用程式下的做法

2018-01-14

Windows Server 2016 docker 執行身份

最近重新安裝幾台了電腦,一開始都沒有 docker 的執行權限,原因就是執行 docker for windows 需要有特殊權限:docker-users,而 docker-users 預設僅加入 Administrator 造成使用其他身份登入時都無法啟動 docker

今天又遇到,順手截個圖,紀錄一下

Dapper 讀取 Oracle 資料 - 更新版 (使用 Oracle.ManagedDataAccess )

之前筆記 Dapper 讀取 Oracle 資料 提到使用x64 版本的 oracle client - Oracle.ManagedDataAccess 無法成功連線這句話是錯誤的,一來 Oracle.ManagedDataAccess 本身是 32位元,另外就是 Oracle.ManagedDataAccess 絕對可以正常連線 oracle 讀寫資料

就來看看如何使用 Oracle.ManagedDataAccess 搭配 dapper 連線 oracle 吧

2018-01-13

透過 ProGet 取得官方 NuGet 套件

之前筆記 將 NuGet Package 發行至 ProGet 曾經介紹到如何將內部使用的 NuGet package 發行至內部 NuGet server:ProGet 上,在試行一段時間後決定擴大範圍,將所有 NuGet package 皆透過內部 ProGet 來取得,不再將所有 NuGet package commit 至 git 中

因為公司的各個環境皆屬封閉環境,對外皆未開通網路連線,僅能連到 NuGet server,所以需要將 NuGet package 下載至內部 ProGet 上,立馬來看看可以如何設定

ASP.NET Identity 修改預設 Cookie 名稱

最近專案同時有前台與後台在進行開發,過去習慣的做法是將前後台使用同一個 VS 專案 (project) 進行開發,再透過 ASP.NET MVC Area 的功能來切分,但因為這個專案的前後台會分別部署在不同的 server 中所以就拆成兩個 vs project 但仍在同一個 vs 方案 (solution) 中,結果在開發時出現同時開啟前後台時會讓 cookie 混淆(前後台會吃到對方的 user 資訊),這讓前後台的同時開發變得產生出現靈異 bug

今天就來紀錄該如何透過設定 cookie name 的方式來避免前後台 cookie 互咬

2018-01-09

利用 Pure CSS 讓 HTML Table 也能有 RWD 效果

這是最近專案 user 提出的需求:所有對外服務的頁面都要有 RWD 顯示。這是現代化網站基本條件並不算特殊需求。雖然透過 grid system 的排版可以快速達成 RWD 的效果,但資料列表的顯示還是 table 最好用,加上 user 無法決定哪些欄位在 mobile 上是可以被隱藏的,所以退而求其次希望可以保留 table 的使用

其間討論過幾種方式:

  1. table 等比例縮少

    缺點:實在太小

  2. table 加上橫向捲軸

    缺點:使用者體驗稍差

  3. 最後經部門 designer 提點,透過 css 來客製 mobile RWD 顯示效果

2018-01-08

JavaScript 偵測 Request 來自瀏覽器的 Go Back (回到上一頁)

這是自己寫的 bug 所衍生出來的需求,大意是如果 user 在某個頁面執行 submit 動作後會 redirect 到新頁面,但如果 user 此時按下 go back 再重新 submit 一次頁面就會出現錯誤,所以打算透過 JavaScript 來偵測 request 來源,如果是使用 go back 時就做一些動作(e.x. 重新整理頁面或是提示)

2018-01-07

ASP.NET MVC 上的 Ajax 動作都被觸發多次?!

幫同事調整程式的過程中發現,View 的 Ajax 功能都會被觸發不止一次,本來以為是手殘按了兩次,特別留意後發現問題仍然存在,改懷疑起是不是軌跡球出現連點XD,最後證實只是人為造成的 bug

2018-01-04

使用 C# 將 Word 檔(.docx .doc) 轉換為 PDF

同事想要將 user 上傳的 word 檔轉換為 pdf,降低內容被篡改的機會,記憶中 word 轉存成 PDF 功能的程式碼並不多,但印象模糊,於是趁這個機會順手紀錄一下,方便日後參考

本文使用的程式碼僅適合 已安裝 Word 的環境