Visual studio code 已經是開發者必備的工具之一,我個人的操作上不喜歡使用內建的 Command+O 開啟功能,尤其很常在使用 terminal 時需要開啟 IDE 來編輯,所以在 terminal 使用指令 vs code 就很重要了。

設定

  1. 在 vs code 中同時按下 command + shift + p
    alt

  2. 點選 Shell Command: Install 'code' command in PATH

大功告成~

使用

只要在 terminal 輸入 code 即可開啟 vs code 囉!
但只輸入 code 只會開啟一個空白的 vs code,我通常都是會在該路徑輸入 code . 這樣會直接開啟該目錄 explorer。


這篇比較像是我自己的備忘錄,因為新環境只要設定一次,久了根本就忘記了

閱讀全文 »

事前準備

我們先將 Consul 以 docker 方式啟動

1
2
3
4
5
6
7
8
version: '3'
services:
consul-local-test.com:
image: consul:latest
container_name: consul-local-test.com
ports:
- "8500:8500"
command: ["consul", "agent", "-dev", "-client=0.0.0.0"]

接著使用瀏覽器進入Consul自帶的管理介面http://localhost:8500/

alt

點選上方 Key/Value 就可以開始編輯了
範例直接使用json格式填入

1
2
3
4
{
"Key1": 100,
"Key2": "HelloConsul"
}

這邊要特別注意的是 value 所儲存的值不可以超過 512kb

今天介紹的工具就是免費、開源的 BenchmarkDotNet
這個工具能夠協助你快速完成速度的測試,不需要再像以前一樣寫滿StopWatch、手動整理跑完的數據,最後再把計時用的程式碼還原。
透過這個工具,只需要短短幾個步驟就可以取得對照的結果。

首先需要下載、安裝這個套件。

1
Install-Package BenchmarkDotNet
閱讀全文 »

最近需要做一個小工具去整理出指定資料夾所有使用的第三方套件版本,同時去查詢nuget最新版本號。
拆解步驟大概就是兩個

  • 掃出使用套件清單
  • 以這個清單查尋nuget最新版本

透過以下語法找出所有 .csproj 檔名的檔案,並找到第三方套件的內容。
我們找一個 csproj 範例如下:

1
2
3
4
5
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
</ItemGroup>
</Project>

透過以下語法找到檔案並解析內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//找出所有 .csproj 檔案
var allFiles = Directory.GetFiles(arg, "*.csproj", SearchOption.AllDirectories);
//依序以 XDocument 載入並解析出第三方套件的名稱與版本號
foreach (var file in allFiles)
{
var projDefinition = XDocument.Load(file);
var elements = projDefinition.Element("Project")?.Element("ItemGroup")?.Elements("PackageReference");

if (elements == null)
continue;
if (!elements.Any())
continue;
var pkgRefs = elements.ToDictionary(x => x.Attribute("Include")?.Value, x => x.Attribute("Version")?.Value);
}

剩下的功能就是查詢 Nuget 取得版本號碼。
由於大部分人的使用都是直接使用 IDE 或 VS 的 package management console 來安裝,幾乎沒有使用 api 去呼叫的需求,這類型的資訊在網路上很少;若是哪天要整理的內容變很多時,手動就感覺特別的沒有效率。 我絕對不會承認官方文件看好久還是看不懂

透過 Package 名稱去查詢版本號碼其實並不太難,在 v3 api 中格式如下:

1
https://api.nuget.org/v3-flatcontainer/{PackageName}/index.json

只要把{PackageName}替換成套件名稱即可。而 Nuget 會回傳一個 json 格式資料,我們以查詢 Newtonsoft.Json 套件為例。
Url example:

閱讀全文 »

「欸這功能效能很差,每次用都速度很慢。」
這是一個很常見的「感覺」形容。每個人對於速度的快慢定義不同,有些人覺得這速度很OK,而有些人覺得效能真的太差。

在工作上我們需要盡量避免這樣的形容詞,除了不夠精確之外,還需要花費更多、額外的時間來校正雙方的度量尺,這時候就需要一個公正、客觀的數據來協助探討是否這個功能真的很慢。

今天介紹的工具就是免費、開源的 BenchmarkDotNet
這個工具能夠協助你快速完成速度的測試,不需要再像以前一樣寫滿StopWatch、手動整理跑完的數據,最後再把計時用的程式碼還原。
透過這個工具,只需要短短幾個步驟就可以取得對照的結果。

首先需要下載、安裝這個套件。

1
Install-Package BenchmarkDotNet

在本文為了我們建立一個Console專案,然後將要進行的測試內容寫在另一個新開的類別裡面。最基本的使用方式就是將測試目標函式給予 [Benchmark]Attribute即可如下。

1
2
3
4
5
6
7
8
9
10
11
public class BenchmarkSampleTestClass
{
[Benchmark]
public void TestMethod1()
{
}
[Benchmark]
public void TestMethod2()
{
}
}

在 main 方法就可以直接呼叫該class進行benchmark評測。
務必在進行benchmark時使用 Release 建置。

1
2
3
4
5
6
7
8
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<BenchmarkSampleTestClass>();
Console.ReadLine();
}
}

接著在terminal就可以看到花費時間的比較表。

閱讀全文 »

這篇文章主要是介紹以C#強型別使用Mongodb driver連線的CRUD語法,一些MongoDB的名詞就不會多著墨。

情境

我們要建立一個 hellomongodb 的資料庫,裡面有 users 的 collection,存放 user 的相關資訊。
以下範例都會使用非同步的方式,若有需要同步執行的,可以自行移除async看看,大致上都是這樣。

先打開shell模式建立DB與collection

1
2
3
4
//切換至 hellomongodb 資料庫
use hellomongodb
//建立名為 users 的 collection
db.createCollection("users")

建立連線

1
2
3
4
5
6
const string MongoAddress = "mongodb://localhost:27017";
const string HelloDatabase = "hellomongodb";
const string UserCollection = "users";

var client = new MongoClient(MongoAddress);
var collection = client.GetDatabase(HelloDatabase).GetCollection<UserEntity>(UserCollection);

Create

剛開始肯定沒有資料的,所以我們會先建立幾筆資料做為測試

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//建立一筆資料
private static async void CreateUser()
{
await GetUsersCollection().InsertOneAsync(
new UserEntity{ Name = "Shaka", Country = "Unknown", City = "Zodiac Temple"}
);
}
//一次建立多筆資料
private static async void CreateMultiUsers()
{
await GetUsersCollection().InsertManyAsync(new List<UserEntity>
{
new UserEntity{ Name = "Jack", Country = "Taiwan", City = "Taipei"},
new UserEntity{ Name = "Sion", Country = "Unknown", City = "Underworld"},
new UserEntity{ Name = "Saga", Country = "Unknown", City = "Zodiac Temple"}
}
);
}
閱讀全文 »

這邊提幾個基本的查詢容易犯得錯,之後再追加比較進階的部分。

  • 只是要確認存在,讓DB只回覆 _id,不需要整個回覆

常見的

1
2
3
4
db.users.findOne({
'username' : 'pattri'
'pwd' : 'iampass123'
})

其實只要回覆 _id,這樣可以提高傳輸效率

1
2
3
4
db.users.findOne({
'username' : 'pattri'
'pwd' : 'iampass123'
}, { '_id':1 } )
  • 重複用運算子搜索同一個欄位

1
2
3
4
db.users.find({
{ 'age': {'$gte': 30} ,
{ 'age': {'$lte': 40} ,
} )

正確的應該是

1
2
3
db.users.find({
'age': {'$gte': 30, '$lte': 40}
} )
閱讀全文 »

最近在使用 docker-compose 加入 mongodb 時遇到一個地雷。由於近日來的挫折感,不免還是問一下專家,專家馬上說道:「對呀!應該要一樣的!」接著馬上解釋原因。是這樣啦~我真的有看過官方文件以及手上的書,也許我沒看得很仔細所以忽略掉吧!

當初在debug時很認真搜尋網路,發現沒找到相關問題,有提到的只有一個網頁,我想這問題應該在本機開發或者只做demo都不會遇到,不過進到產品階段肯定會碰到。

通常我們在本機開發都會用的yml設定如下:

1
2
3
4
5
6
7
8
version: '3'

services:
mongo:
image: mongo
container_name: mongo_container
ports:
- "27017:27017"

啟動後就能很開心的用GUI或cmd連進mongo進行開發。

問題發生在..
開發階段時,我們將mongo綁定了url(當然在hostfile也加了),如下

1
2
3
4
5
6
7
8
version: '3'
services:
database:
image: mongo
container_name: Mongo_DkrCmps_Test
ports:
- "27117:27017"
entrypoint: [ "/usr/bin/mongod","--bind_ip", "localhost,mongo-local-test.com"]

當很開心的啟動後,就發現用任何方式都無法連線到mongo囉!即使docker-compose ps 也可以看到他在listen的狀態,那麼問題是出在哪?

answer

關鍵就是出在 yml 的 service 名稱,這個命名需要和你設定entrypoint 所bind的內容一樣,所以我們來調整一下..

閱讀全文 »

macOS的使用者應該都使用過vs code,加上各種plugin做起事來更是如虎添翼。

今天要介紹的工具是Open In Code,此程式的功能就是在Finder上增加一個”使用vs code開啟”的功能,讓你在使用Finder瀏覽時,隨時都能夠使用vs code開啟當前目錄,不需要再辛苦得再選定資料夾開啟。

那馬上就使用Brew cask來安裝吧!

1
brew cask install open-in-code

alt

下載完後會告訴你安裝好了以及相關位置。

  1. 去應用程式裡面找到 Open In Code.app
  2. 點選 Open In Code.app
  3. 按住 cmd拖移到 Finder 上方工具列,出現綠色+號即可。
    這樣就大功告成囉! 以後使用Finder瀏覽時,就能隨時隨地以 vs code 開啟這個目錄了。

alt

閱讀全文 »

原本要寫個用 docker compose 來起 MongoDB container 的文章,發現整個弄完不到三分鐘,好像有點過於簡單。
就順便用這個為範本來討論一下port的功能與expose的差異,在剛開始接觸的時候被搞混了一下。

攥寫yml檔案

docker compose的檔案是用yml寫的,如果不知道什麼是 yml,可以參考一下連結,基本上就是比json更高可視化、更簡潔(更小)的設定檔。

將以下內容存成 docker-compose.yml 檔案即可

1
2
3
4
5
6
7
version: '3'
services:
database:
image: mongo
container_name: Mongo_DkrCmps_Test
ports:
- "27117:27017"

執行

下面兩個指令分別就是啟動與關閉這份 docker-compose

1
2
docker-compose up    //啟動
docker-compose down //關閉

alt

上圖就是寫好yml後執行,如果沒有MongoDB的image就會從網路上下載,下載好後就可以看到MongoDB的container已經在運行。

閱讀全文 »