2020年8月9日 星期日

ASP.NET Core 3.1 on CentOS 8

最近有個案子,環境限定 CentOS + PostgreSQL 而且還要 HA(High availability) 的架構。是我完全不熟的東西,在經過多方摸索以後,把相關安裝設定方式記錄一下。

首先提到 HA,正式環境是用 L4 Switch 做 Round Robin AA,由於 L4 Switch 不是我玩的起的硬體,所以 Google 了一下,看看有沒有什麼替代方案?於是找到了富人用 L4 Switch,窮人用 Linux HAProxy!

那我們準備三個 VM 分別是 HAProxy, Web 1, Web2 IP 分配如下:
ServerIP
HAProxy192.168.0.130
Web 1192.168.0.131
Web 2192.168.0.132

所以我們先來準備兩台 Web Server 吧。安裝 CentOS 8 就跳過了,安裝完後,習慣先更新一下已經安裝的套件。
sudo dnf update

接著安裝 dotnet sdk
sudo dnf install dotnet

由於之後會用 HAProxy 所以這邊就省略用 nginx 做 reverse proxy 了,正式環境必須加上 nginx 做 reverse proxy。因此這邊防火牆我們直接開 5000 的 port 就好。
sudo firewall-cmd --permanent --zone=public --add-port=5000/tcp
sudo firewall-cmd --reload

接著我將寫好的 service 複製到指定位置
sudo cp frank.service /etc/systemd/system/frank.service

service 內容如下
[Unit]
Description=Frank Web Server

[Service]
WorkingDirectory=/var/www/Frank
ExecStart=/usr/bin/dotnet /var/www/Frank/Frank.dll --urls http://0.0.0.0:5000
Restart=always
RestartSec=10
SyslogIdentifier=frank-web-server
User=frank
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

這邊 --urls http://0.0.0.0:5000 很重要,如果多張網卡,可以指定特定 IP,如果這邊沒用 --urls 那只能從 localhost 連了。

以及將發行好的檔案複製到指定位置,並變更目錄擁有者。
sudo mkdir /var/www
sudo cp -r Frank /var/www
sudo chmod g+w -R /var/www/Frank
sudo chown -R frank.frank /var/www/Frank

最後啟用 service 並執行他。
sudo systemctl enable frank.service
sudo systemctl start frank.service
sudo systemctl status frank.service

到這邊正常來說沒遇到什麼問題,你用:
curl http://192.168.0.131:5000
應該會通了。

Web 2 依樣畫葫蘆,也可以順利完成。當然,如果 appsettings.json 裡面有和自身 IP 相關的地方,要記得修改。

這邊都完成後,就要進入下一篇,設定 HAProxy 了。

2015年10月25日 星期日

自動測試與 TDD 實務開發(使用C#) Day 2 心得

回顧從第一天的基礎觀念說明,以及介紹一些好用的工具
(很重要!因為要容易導入,先決條件就是,簡單好用、容易上手不會造成太多的負擔。),
再告訴我們如何將需求轉化為測試案例。

第二天告訴我們,
如何簡單容易(第二次了!)的建立整合測試保護目前已有的程式,
接著透過重構來償還這些技術債務,
最後再將重構後的程式建立單元測試加以驗證與保護。

而且!這課程是帶著你一步一步地做,讓你實際去體會:
從需求出發,建立測試案例,然後將測試案例逐步地完成測試,你的程式就完成了;
和你看了需求直接想程式該怎麼寫,其實差不了多少。

當思維從看到需求直接想 code 怎麼寫,轉化為如何透過測試案例講清楚需求,
慢慢地就會感覺到這樣寫程式,很輕鬆,不會有多餘的程式產生。
不然很容易落入一種寫很爽,但是會用到的沒多 少!
一旦真的要用可能還不符合需求......那不是很浪費生命嗎?
生命應該要浪費在美好的事物上,電視上不是常看到嗎?

上完這兩天的課程以後,我已經開始一步步的為手上的專案加上測試,
同時也期待最後一天的課程到來。

如果你對於用測試來保護你的產品、程式有興趣,可以參考看看。
如果正在導入,卻遇到阻礙(相信我,絕對有,親身體驗過),你更要看看。

最後,雖然是使用 C# ,但是這梯也是有很多 php, java 的開發人員參加,
因為重要的是觀念,你用什麼語言,什麼工具都是其次,
在各種語言上絕大多數應該都找的到對應的工具才是,
所以別太擔心,也會有很親切的助教協助你的!

講師的FB部落格 91 敏捷開發之路

FB 原文

2015年10月18日 星期日

自動測試與 TDD 實務開發(使用C#) Day 1 筆記

前言==========
這次運氣不錯,有幸報到第四梯的課程,
其實在第三梯的時候就想報名了,不過剛好有兩位好友先後結婚,
只好期待 Joey 的第四梯了!
也感謝 Joey 用心準備與持續精進的課程內容,
這應該也是一種早買早享受(提早進入這領域),晚買享折扣(學到更多)的概念吧!

對課程有興趣,或是想要導入測試來強化產品,真的大力推薦 Joey 課程,網址如下:
https://skilltree.my/events/mbh
一定是物超所值的。

另外是他的粉絲團『91 敏捷開發之路』
https://www.facebook.com/91agile
以及點部落『In 91』
http://www.dotblogs.com.tw/hatelove

心得==========
第一天的主軸在於:

【老闆是花錢請你來寫 production code 不是來寫測試的!】

重點還是在開發,不是測試!
測試只是工具,輔助你驗證 production code 是符合開發者的想法,
滿足顧客的需求!

在團隊開發中最常遇到的狀況:

  1. 測試環境和正式環境有些因素導致無法驗證,例如:資料庫、第三方的 API 等
  2. 不知道錯在哪裡!一段冗長的流程結果錯了,必須要從頭追到尾
  3. 上頭問起那些功能測過......提不出證據
  4. 修 A 壞 B,修好 B 結果 A 又往生了!
  5. 平行開發,只憑想像或是文件,整合的時候就是場災難


這些問題都可以仰賴撰寫測試,來降低開發成本,
BUG 越早被發現,處理成本越低,
整個就是早期發現早期治療的概念!
所以寫測試就像是在健檢一樣,必然會有一些成本的支出,
但是效益絕對是很大的。

Unit Test 是:

  1. 最小測試單位
  2. 外部相依為零
  3. 不具備商業邏輯
  4. 測試案例之間相依為零
  5. 一個測試案例只測一件事情


Unit Test 的特性是:

  1. Fast
  2. Independent
  3. Repeatable
  4. Self-Validating
  5. Timely

簡稱 FIRST

3A 原則

  1. Arrange
  2. Act
  3. Assert


要驗證的東西

  1. 回傳值
  2. 狀態的改變
  3. 與外部的互動


單元測試的意義在於模擬外部如何使用測試物件,驗證行為是否符合預期!
所以應以需求為出發點,而不是為了測試而測試,要記住是在開發!
非公開的方法,應該透過測試公開的方法而被測試,
沒有涵蓋到表示兩種可能:

  1. 測試案例代表性不足
  2. 沒被涵蓋到的程式,沒有存在的價值(永遠不會被用到!)


後記==========
其實在前公司曾經試著要導入自動化測試,想藉著導入測試提升產品的品質,
確實遇到了一些阻力,同時也因為自己對於測試沒有充分的了解,
沒有持續改善的觀念,最終仍以失敗收場,相當可惜!
希望在這課程中,能夠提升自己對於自動化測試的認知與能力,並且在往後的專案中落實。

2015年10月10日 星期六

Ford 24小時免費試駕

首先感謝福特萬達汽車的方副理,從他那邊取得 24h 試駕體驗券一張,
再和桃園艾維士確認有 TDCi 的日期後便預約取車了。
取車當天有個小插曲,google map 導航居然帶我到和運租車......
我當時滿心雀躍想要開 Kuga 也沒注意招牌,
直接進門說『我要取車......』,真是太丟臉了。

糗事不多說,接著我們來驗明正身,打開引擎蓋!

引擎室的配置和 Focus MK 2.5 還挺像的。

正副駕駛車門都有貼的活動貼紙!

Kuga 銘牌

TDCi AWD

這尾燈還不錯!

原廠18吋的鋁圈

擁有全景天窗的車頂。

讓我們從後車門進入吧!(因為我比較關心後座,哈哈!)

這是展示間,以及上次在 Costco 看到的椅背角度,
因為登記客貨車的關係,所以會多加一些橫桿,
導致乘坐時會覺得很挺,不舒服。

移除椅背後方橫桿以及下方的檔板後就可以讓椅背更斜一些,
相對舒適許多。比起 Focus MK 2.5 似乎更好坐些,
但我都沒有長途乘坐的經驗XD

後座出風口以及12V電源插座!後面有供電插座真的是很方便的設計。

後座 ISOFIX 安全座椅直上完全沒有問題喔。

放上兩張娃娃推車(下面有個黑色袋子裝起來,所以不顯眼!)仍然很寬敞。

拉起行李箱隔板(比較像簾子)的樣子。放上寶寶的玩具!

來看看前座的空間吧!

儀表板

雙域自動恆溫空調

引擎啟動鈕

這個置杯架不錯!

中央扶手的置物空間很深......裡面還有12V供電插座喔!

SYNC power by Microsoft

眼鏡盒

喔!全景天窗

偷看一下後輪的傳動軸。

由於我是前一晚7點多取車,所以有很充裕的時間多認識一下 Kuga。
緊接著隔天一早就出發來去宜蘭一日遊囉。

第一站來品嚐北門蒜味肉羹。

全家福!

滿滿的肉羹,蒜味很濃郁喔!

第二站本來要去吃柯式蔥油餅,結果星期二休息沒開,
只好先去買些伴手禮,等待媽媽購物的時間,
把芊芊從安全座椅放下來玩一玩,
Kuga 的空間還挺不賴的,小朋友爬來爬去的很喜歡。


跑了 145 KM 平均油耗 6.1 L / 100 KM 相當漂亮呢!

接著來四圍堡車站晃晃




古堡風格的用餐地方。



隨處可見的貓頭鷹。

接著來到貓極簡咖啡

 小芊很喜歡貓兒呢!

 小芊也不怕生,和隔壁桌的婆婆玩的很開心呢!

貓與 Kuga 的邂逅

大概是下午吧,貓兒大多在休息!


小芊看起來很喜歡這裡呢!

今天最後一站來到城堡咖啡!

小芊好像不太爽喔!

TDCi AWD 上來真的是輕鬆愜意呢!

最後在時限內還車囉!

真是有點捨不得還人家阿XDD

經過了 24h 的試駕體驗,對於 Kuga TDCi AWD 實在是覺得很心動,
一來是油耗和我的 Focus TDCi 表現相當,乘坐空間又大了些,整體安全配備也相當齊全,
再來是一樣架構的 PowerShift 變速箱,但是感覺進步很多,
換檔順暢,感覺沒有之前的一些毛病。
180 匹的馬力以及 40 公斤的扭力,起步加速對於 1770 公斤的車重,
表現依然很棒,加上 AWD 在去城堡咖啡的路上感覺很輕鬆。
整體來說是部相當不錯的車,要是能把汽油旗艦版上的一些配備都加上來就更棒囉XD。