2018-07-13

取得 Redis 中指定 key 條件的筆數

公司有個流量很大的 ASP.NET MVC 網站仍在使用 Session,並利用 Redis 來儲存 Session 資訊,而近來的大型活動讓 Redis 壓力倍增,使用的 memory 是活動前的 2-3 倍,於是興起清查 Redis 各式來源使用量的念頭

經過嘗試了幾種做法,對最後解決方式的執行時間還算滿意,順手紀錄一下各種方式的優缺點待日後備查

2018-07-11

使用 HttpClient 出現 ObjectDisposedException ?!

最近某個專案中有個需求需要對 partner 發出 http request,而 user 針對 request 出現 error 時希望加上 retry 機制:重試一次,結果就是這個重試一次的要求讓程式出現預期外的 Exception,立馬來看看我犯了什麼錯吧

2018-07-09

System.IO.FileLoadException : Could not load file or assembly (0x80131040)

前情提要:公司有個專案需要與外部 partner 周期性進行資料交換,是常見的排程作業但 partner 沒有提供測試環境,加上 partner 的 api 環境有鎖定來源 ip,也就是所有的功能開發都需要憑空想像或是透過 production 來 debug XD 雖然不是第一次遇到這種需求,但還是覺得無力感很重呀

不過就是因為這個專案的特殊性才讓我遇到 System.IO.FileLoadException : Could not load file or assembly 問題,當下我花了一陣子才想到原因加上違反正常 CI/CD 流程,特別筆記一下加深印象

2018-06-25

解決無法使用 IIS Manager 及 AppCmd.exe 列出 Worker Processes 的 Request

最近監控 IIS 上的 application 時發現部份 server 無法列出 request queue,以我的經驗一般情況下並不會特別去看 request queue 的內容,一旦需要看就一定有 server 或是 application 警示出現,如果看不到內容對於除錯就少了可以快速定位發生原因的手段,也就增加偵錯的時間

原本以為是 IIS Manager GUI 的問題,改用 AppCmd.exe 來看內容也出現錯誤,就來看看如何解決吧

2018-06-18

WinDbg 設定 symbol file path 的四種方法

有一陣子沒用 WinDbg 來進行偵錯,再次感受到年紀的影響,指令忘得很乾淨XD 當然 WinDbg 的指令對我而言本來就沒有記得很牢,忘得快也是意料中的事,剛好最近用到的機會高一些,每次查指令也滿花時間的,所以趁著連假時間做個紀錄以利之後追查問題可以再加快速度。

首先就來看看如何設定 symbol file path ,雖然 symbol file path 沒有特別設定也可以正常使用,不過每次都重新下載 symbol file 既耗時又浪費網路頻寬,因此透過設定 symbol file path 讓已經下載過的 symbol file 可以重用讓偵錯流程可以再加快,把握時間找出真正的問題

2018-06-16

Docker Push 出現 405 Method Not Allowed 錯誤?!

之前筆記 解決 Docker build pip install fail 提到在練習 Kubernetes 過程中執行 docker build 指令時會出現 pip install fail 的 error,問題發生原因是 docker 的 DNS 解析不正確造成的,解決方式是設定 Docker 的 DNS。

完成 docker build 產生的 image 只會存在執行指令的機器上,除非手動打包 image 至其他 Kubernetes Node 上,否則在執行 Kubernetes 部署時會出現找不到 image 而出現部署失敗的錯誤訊息,但 Kubernetes Node 可以動態增減,手動複製並沒有真正解決問題,透過將 image push 至 registry 才可以一勞永逸,只是想不到一個 docker push 也讓我卡關了XD 就來看看問題發生原因及解決方式吧

解決 Docker build pip install fail

近期工作之餘將部份時間花在學習 Kubernetes 上,過程中嘗試透過 Dockerfile 建立 pyhon application 的 image 來部署至 Kubernetes 中打算用來做一些實際應用情境的演練,原以為會卡在 Kubernetes 的網路設定上,想不到我太過樂觀,連第一步的 Dockerfile 都 build fail,如果沒有 image 更不用提建立 container 及部署至 Kubernetes

因為 Kubernetes 相關知識尚未上手,非常容易踩雷碰壁,為此我還重建了好幾次 VM 來反覆驗證測試,過程中也遇到好幾次 Dockerfile pip install fail 的狀況,每次都要重新查設定方式,於是就來筆記一下囉

2018-06-10

C# 搭配 MongoDB 的連線寫法

最近有個新專案需要儲存 json 格式的資料,MongoDB 是考慮的選項之一,評估的過程中才發現我沒有 C# 連線 MongoDB 的使用筆記,雖然專案時程非常急迫需求假日額外加班處理,原本很認份地要開工但仔細想想工作畢竟是工作就算再急也不該為了工作失去熱誠,雖說我自己常常額外加班不過都是出於對程式熱誠,一旦只是為了對專案有所交待,我愈來愈說服不了自己,所以決定在休假期間放下時程的考量做自己覺得開心的事

立馬就來紀錄一下 MongoDB 的連線寫法吧

2018-06-07

C# 連線 Oracle 出現 ORA-01000: maximum open cursors exceeded

同事負責的系統在 production 環境出現異常問題:原本系統已經運作了一段時間,某天突然出現 ORA-01000: maximum open cursors exceeded 造成相關功能無法運作,經過 IIS reset 後又可以正常使用,發生頻率不定,只是出現異常的間隔有日趨縮小的現象,造成問題的程式雖然已經找到也完成了修正,但隱含在背後的真正原因還是令我相當好奇,所以多花了不少時間來進行驗證及測試,過程中學到了許多東西一定要好好紀錄才行

2018-06-06

CentOS 7 Docker 無法連線 Docker daemon?!

同事想在 VirtualBox 上建立 CentOS 7 虛擬環境,並在 VM 中使用 Docker,在安裝 Docker 時一如往常相當順利直到實際建立 container 時卻遇到無法連線:Cannot connect to the Docker daemon at unix:///var/run/docker.sock 的提示訊息,重啟 Docker service 時也失敗並得到新的錯誤:Job for docker.service failed because the control process exited with error code.

解決這個問題的過程中學到以前不知道的內容與設定,順手紀錄一下備忘

2018-06-05

如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - Oracle)

之前筆記 如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - SQL Server) 提到 Entity Framework 使用上的限制,也紀錄如何透過在 SQL Server 的 table 上加入 rowversion 的欄位並將 Entity Framework 上該欄位的 Concurrency Mode 改為 fixed 就可以避免修改資料後遭其他人覆寫的狀況,那相同問題當然也會發生在 Oracle 上,就來看看 Oracle 該如何解決吧

2018-05-31

不需安裝 Oracle client 使用 C# 搭配 Oracle.DataAccess 連線 Oracle

之前公司電腦因為註冊檔毀損,讓電腦上的 Oracle client 一直無法正常運作,就算是重灌多次 Oracle client 還是一樣無法正確運作就連移除功能也壞了,所以在 local 開發時我都會暫時將 Oracle.DataAccess 改為 Oracle.ManagedDataAccess,在多數情況下都可以正常運作,真的非得用到 Oracle.DataAccess 就透過 VM 來開發,實際上遇到問題的次數一隻手數得出來,加上近期已經很少用到 Oracle.DataAccess 也就沒有特別想解決 Oracle client 無法正常運作的問題,直到最近有個困擾已久的 issue 一直沒有找到真正原因,透過 LINQPad 模擬時一直搞不定,讓我有了不得不解決的動力

憑心而論,如果沒有其他考量,建議升級為 Oracle.ManagedDataAccess,原生就不需要 Oracle client,如果你還有舊系統的相依無法搞定,就來看看如何可以不安裝 Oracle client 並使用 Oracle.DataAccess 連線吧

2018-05-27

如何避免多個 EntityFramework 6 instance 造成資料覆蓋問題 (DB First - SQL Server)

前後台分離且共同存取 table 或是同時有多台機器甚至是修改資料不經由 EntityFramework 都是平常開發上很常見的情境,但這些操作卻可能因為 EntityFramework 的 cache 機制而出現資料不一致的現象,最近同事疑似遇到類似問題,雖然立馬就想到解決方式,但已經好一陣子沒用,為避免說錯就自己先測試一下並紀錄紀錄囉

要確保資料的完整及一致性,做法有好幾個包括 DB First、Code First、DB table setting 首先就從最簡單的做法:DB First + table setting + SQL Server 看起

讓 log4net 收到指定錯誤 Level 發送 mail

平常我自己本身慣用的 log 套件是 nlog,主要原因是因為設定相對較簡潔,加上多年前看過的效能比較 - Benchmarking 5 popular .NET logging libraries 結果是 nlog 效能較好,不過前陣子看到另一篇文章 - .Netcore之日誌組件Log4net、Nlog性能比較 重新比較 nlog 與 log4net 的效能則得出 log4net 效能較好的結論,所以針對兩者效能問題我想自己動手比較看看,再下結論

在取得效能比較結論前之前,因緣際會下需要調整其他同事的專案,剛好是使用 log4net,所以透過這個機會紀錄一下使用方式

BTW:原本想要大致紀錄一下 log4net 的相關設定及用法,但文件愈看愈多卻也愈搞不清楚設定細節,決定改天有需要時再另外紀錄,今天就只紀錄如何讓 log4net 發出 mail 囉

2018-05-20

從 DLL 中建立 PDB 檔

這是在追查某個 dll 可能的潛在效能問題時,延伸出的問題,一般情況下我們透過 NuGet 下載套件時大多都沒有包含 PDB - Program DataBase file 檔,讓追查錯誤時少了一個好用有效的利器,所以才興起從 dll 取得 pdb 的念頭,google 後在 stackoverflow 上看到可以透過 dotPeek 來製作 PDB,立馬動手實驗看看並紀錄一下

Windows 慣用者如何在 Red Hat Enterprise Linux 7.5 (CentOS ) 上使用 kubeadm 架設 Kubernetes (K8s)

之前筆記 Windows 慣用者如何在 Ubuntu Server 16.04 LTS 上使用 kubeadm 架設 Kubernetes (K8s) 紀錄到如何在 Ubuntu 上使用 kubeadm 建立 Kubernetes cluster,考量到公司使用的 linux 都為 CentOS (RHEL) 所以趁著印象還新鮮時趕緊紀錄一下在 CentOS 上架設 Kubernetes 的做法

2018-05-19

使用 EntityFramework Insert 大量資料

這是參加 黃忠成老師的 Entity Framework 全線開發 課程時他提出讓學員思考的問題:如何使用 EntityFramework Insert 大量資料,我當下立馬想起印象中以前同事也被這個問題困擾過,而我自己本身則沒有遇到相同困擾,剛好透過這個機會來了解其中的差異也順便嘗試看看不同解法

立馬動手模擬看看,親身體驗實際情況吧

2018-05-18

在 LINQPad 中使用 nlog

LINQPad 的便利性我想不必我多提,而我自己常常在 LINQPad 上進行主要核心流程功能的 poc 開發,或是將特定功能從原系統抽離以加速功能驗證,今天遇到的情境也是如此,希望在不改動原本程式的主架構下略過其他不必要的系統驗證授權部份,完整保留原本的 log 行為與執行流程並且順利完成程式的調整,這樣一來功能完成也可以與原系統無縫接軌了,但現實常常與理想會有些距離,就來看看如何在 LINQPad 中正常使用 nlog 吧

2018-05-14

Windows 慣用者如何在 Ubuntu Server 16.04 LTS 上使用 kubeadm 架設 Kubernetes (K8s)

原本是想將 Kubernetes 架設在 Ubuntu Server 17.10 上,但需要透過一些小手法才能順利執行 container,為了避免忘記如何架設,決定先退而求其次的使用 Ubuntu Server 16.04 LTS 紀錄一下先,網路上有許多文章在介紹如何安裝 Kubernetes,我相信我不會寫得比網路上的大大來得好,但我想站在一個 Windows 環境慣用者的角度來紀錄該如何使用 Ubuntu 及安裝 Kubernetes,主要就是因為我自己在實際安裝時就遇到不少操作上問題XD

Kubernetes - K8s 是用於自動部署、擴展和管理容器化(containerized)應用程式的開源系統,前身為 Borg (節錄自 Kubernetes - 維基百科,自由的百科全書 - Wikipedia)

近來 Kubernetes 漸漸有擺脫其他 Orchestration 工具(像是 docker swarm,Mesos... )的態勢,功能發展及業界關注度明顯較為熱絡,雖然一直相當看好 docker 的後續發展但也仍在觀望到底該選擇什麼樣的 Orchestration tool,近來覺得應該可以先試試 Kubernetes ,就來看看該如何在 Ubuntu Server 16.04 LTS 上架設 Kubernetes 吧

2018-05-12

使用 Elastic Stack (ELK) 來監控 MongoDB

之前筆記 Windows 平台上安裝 Elastic Stack (ELK - Elasticsearch , Logstash , Kibana) 提到因為想要將部份系統資料餵進 ELK 用來監控及除錯,順手紀錄 Windows 平台上架設 Elastic Stack (ELK - Elasticsearch , Logstash , Kibana) 的步驟,也提及 ELK 較適合執行於 Linux 環境,只是身為 Microssoft 派工程師,Windows 環境相對好取得用來開發測試

首先第一個目標就是為原本沒有監控機制的 MongoDB 加上基本的效能監控。在同事強力的協助下,終於排除困難將 MongoDB 效能資訊餵進 ELK,過程況狀不斷,如果不紀錄相信一周後我就再也做不出來了,就來看該如何設定吧

2018-05-09

IIS 上的 ASP.NET 程式出現 500.19 (0x8007000d) 錯誤?!

這是同事在處理 IIS 上的 application 改用 64-bit (不啟用 32-bit) 時遇到的狀況,之前筆記 IIS Express 出現 500.19 - 0x800700b7 錯誤?! 有紀錄到類似的錯誤,也是一樣出現 500.19 當時是因為 web.config 的設定與更上層的 applicationhost.config 或是 machine.config 重覆造成,原以為是相同錯誤定神細看才發現錯誤代碼不同

立馬來看看 0x8007000d 的錯誤原因是什麼吧

2018-05-08

如何知道使用的 dll 是否需以 32 位元模式執行

最近因為年度計劃預計做些 Windows server OS 的升級作業,將大部份 OS 升級為 Windows Server 2016,也順便整理 server 上的 application,發現仍有不少 application 執行在 32 位模式下,過去主要的原因是 Oracle.DataAccess.dll,原以為只要搞定 Oracle.DataAccess.dll 就可以,想不到後續又遇到其他參考的 dll 需要執行在 32 bit 模式下,所以找了幾個方式來試著不需要反覆部署至 IIS 上進行測試即可得知特定的 dll 是否需要執行在 32 bit 的相容執行環境

網路上分享的方法有很多種,今天會以本次遇到問題的 dll 中的 Oracle.DataAccess.dllSystem.Data.dll當做範例來進行測試,立馬來看看哪個方式比較方便吧

2018-05-02

Windows 平台上安裝 Elastic Stack (ELK - Elasticsearch , Logstash , Kibana)

Elastic Stack (ELK - Elasticsearch , Logstash , Kibana) 建議執行在 Linux 平台上效能較佳

ELK Stack5.0 版本加入 Beats 套件後更名為 Elastic Stack,在還沒搞清楚 Beats 實際作用前反而是 5.5 版本的變更引起我更大的關注:可以使用 .msi 在 Windows 環境上進行安裝,以往在 Windows 平台上安裝 ELK 有著其他平台移植的痕跡,需要多一層轉換橋接才能使用,而透過 .MSI 安裝的實際體驗跟過去安裝 Windows 原生軟體就是一樣的,安裝流程很直覺,唯一需要留意的是 Java 8 的 runtime 還是必要條件且沒有包含在 .msi 中,如果過去沒有安裝過 Java 8 得要自行下載安裝

剛好最近需要將手上的一些系統資料餵進 ELK ,剛好趁這個機會重新安裝 ELK 並且紀錄一下流程

2018-05-01

在 ASP.NET MVC 出現 HttpAntiForgeryException 錯誤時 Redirect 至指定 Controller、Action

user 反應在操作系統時出現 System.Web.Mvc.HttpAntiForgeryException 錯誤,而 System.Web.Mvc.HttpAntiForgeryException 的錯誤在 ASP.NET MVC 上並不算罕見,是個為了避免 XSRF 的保護機制:在網頁表單上加上個隱藏欄位用來儲存 token ,實際 submit 時 server 會檢查這個 token 是否有效,常發生在網頁開啟閒置一段時間後再次 submit 資料的情境下,通常只要 refresh 頁面讓網頁重新取得 token 即可解決

本次專案的 owner 希望可以給 user 更好的使用者體驗,所以希望在 token 過期失效時重新導向登入頁面並提示需重新登入(經 user 這麼說,我也覺得讓錯誤直接裸奔在外實在不好,但我以前怎麼不會這麼想,難道我愈來愈客戶導向了嗎XD)

2018-04-23

IIS 出現 Service Unavailable HTTP Error 503 - Windows Process Activation Service (WAS) Error

這個問題遇到第二次了,照以往的習慣:問題遇到二次以上就要來筆記一下,避免下次再遇到又要花好多時間追查。之前沒有紀錄的原因:一來是覺得狀況特殊不太有機會再遇到,二來就是牽涉到的功能及設定不好模擬,但這次遇到相同問題又讓我花了好幾個小時才確認問題,所以多花點時間準備環境來完成紀錄

這次遇到的問題,外顯的錯誤訊息很籠統,第一時間並不好定位出問題,但搭配 event log 難度就會降低許多,就來看看實際的狀況為何吧

2018-04-22

C# 使用 Dapper 連線 DB 時指定逾時時間 (timeout):0x80004005

最近專案在 production 環境執行時常常遇到 [Win32Exception (0x80004005): The wait operation timed out],造成程式未完整執行,但再執行一次後又正常了,想當然爾這個狀況在開發階段未曾發現過(再次證實在我的電腦上都是好的XD),經過追查 log 後發現是 db 資料量略大,加上查詢語法在目標 db 上沒有建立對應的 index,所以執行查詢時都會耗費較多時間,但第二次之後的查詢則因為第一次查詢的犧牲已 trigger db 協助建立相關 cache,讓後續查詢得已順利完成

追查問題的過程中,發現沒能在第一時間快速精確鎖定相關設定解決問題,所以馬上紀錄一下加強印象

decimal , double , float 輸出 json 的格式問題

之前筆記 decimal 屬性輸出 JSON 時指定的格式問題 提到在專案中因為系統介接需要統一 decimal 小數位數,過程中也才發現 json.net 在輸出沒有小數的 decimal 時行為不太一樣(會補上 .0:小數點及小數點一位),最後雖然有解決問題,但解決方式自己卻不甚滿意,加上想要順帶測試 double 及 float 的行為,所以又花了一些時間找其他方法,就來看看過程遇到的問題及最後的解決方式吧

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 的環境