這篇文章會有三個部分:

  • 以 node.js 的 express 來建立 Hello world 伺服器
  • 撰寫 dockerfile
  • 編譯成 docker image

安裝 Node.js

Node.js 官方網站下載 LTS 版本並且安裝。

使用指令 node -v 會顯示當前版本

1
2
➜  first_dockerfile node -v
v13.14.0

建立 express 伺服器

首先使用指令 npm install,再輸入 npm install express 安裝 express 套件

最後是建立一個 server.js 檔案,並貼上以下內容

Read more »

本篇將初次體驗 docker 的操作


初次學習一項新的技術或語言 hello world 已經是一個慣例了,而 docker 官方也有提供此 image 供大家體驗。

docker hello world

輸入指令 docker run hello-world

1
2
3
4
5
6
7
8
9
10
11
 ✗ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:97a379f4f88575512824f3b352bc03cd75e239179eea0fecc38e597b2209f49a
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

...下略

可以看到我們電腦並沒有此 image,因此會自動從網路上下載你想啟用的 image

輸入指令 docker image ls hello-world
可以看到 image 已經下載回來了。

1
2
3
➜  blog git:(master) ✗ docker image ls hello-world
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 4 months ago 13.3kB

輸入指令 docker run hello-world

Read more »

本篇僅介紹基本的 docker 概念與架構,不會涉及到實作與指令等。


應用場景

  • Scenario1

機器數量很多正在安裝,數天到數周後才能交付

  • Scenario2

工程師:「這在我的電腦是好的」
QA、User、PM:「在我電腦看就是壞的啊!」

  • Scenario3

專案用開發/測試環境很複雜,與其幫你安裝,不如我建立好 VM,拷貝給你後使用
VM 開太多了,電腦不太能動

  • Scenario4
Read more »

建議搭配第一篇 MongoDB 不懂 ESR 別說你會用 Index !! 一起閱讀


我們建立 MongoDB 索引時需要掌握 ESR 原則,所謂的 ESR 代表的是 E(quality)、S(ort)、R(Range),也就是説,索引欄位順序必須是這個順序,才能達到最佳效能。

這是一個大原則,相同類型的欄位可以重複,例如:

  • EESR (O)
  • ESRR (O)
  • ER (O)
  • EER (O)
  • ESER (X) 像這種違反大原則的就不符合規則

我們遵循 ESR 規則的原因是使得每次查詢都能夠以最少的 KEY 掃描次數就能找到文件為目標,這樣速度會是最快的。大家可能受到 RDB 觀念影響,就很容易發生未遵照 ESR 原則的情況,這樣會使得查詢未達最佳化。

如果沒按照 ESR 規則,MongoDB 的查詢速度肯定會受到影響,其次是第一階段會使用 RAM 進行索引排序,也就是後面會提到的 sortsort_key_generator; 第二階段,一但超過記憶體使用上限,就必須使用硬碟排序,此時必需啟用 allowDisk 設定,速度會再更慢。附帶一提,MongoDB find 查詢的參數順序是沒影響的,例如 .find({ fieldA: true, fieldB: 3 }) 等同於 .find({ fieldB: 3, fieldA: true })

這邊要強調,實務上並非所有情境都需要即時得到查詢結果,例如週期性產生報表的排程作業就沒有這麼高的即時性,刻意建立相關的索引會換來寫入速度降低。

使用測試資料來演示 ESR

這邊我們先建立了五筆資料與一把索引,特別注意索引刻意先把 Range 建立在 Equality 前面。

Read more »

這篇文章將會一步一步教學從買網域開始,到修改自己 Github 網誌的網址。

網路發展至今,很多東西都大幅開放與提升,而服務也是日新月異,如今要擁有自己的網域,是一件非常簡單的事情,重點是非常便宜,何不先創立自己的品牌呢~

Step0 Prerequisite

  • 在 Github 有建立 Blog
  • 想使用自己的網域名稱

其實購買網域的用途都不一樣,只是我的用途是這個,而這篇文章純粹想紀錄比較新的版本。

Step1 購買網域

網路上有很多提供網域購買的網站服務,常見的像是 GoogleNameCheapAzureAWS,好了要講可能講不完,挑一個你覺得順眼的就對了。

只想特別提醒,有些品牌打著超低價,但是第二年的續約價錢卻拉高不少,雖然這是一種行銷手法,但個人非常不喜歡,沒注意到的人可能就上當了,畢竟域名這種東西較少說改就改,辛苦經營了一年後發現續約價格高了不少,會很不舒服。

本篇介紹的域名商是 Cloudflare,本身也能夠處理 DNS 問題,剛好滿足需求。印象之前有出了個大包,但不影響我決定就是了。

註冊後就能看到 Dashboard,依序點擊圖中的 購買網域

Read more »

寫 MQL aggregation 有一些要注意的地方,雖然蠻多部分 MongoDB 都幫你優化了,但還是要注意一下小地方,讓你的 MQL 效能更好

Case1

絕對優先使用 $match 減少資料量

$match -> $project

  • $match 過濾不必要的資料,減少記憶體與CPU消耗
  • $project 過濾不必要的欄位,同上,若你預期的結果不需要使用某些欄位時,就先移除再進行其他操作

Case2

$match -> $sort

基本上是上面的變形,先減少資料量再排序

Case4

這邊是比較少用到的狀況,但也很好理解

Read more »

MongoDB Index Intersection,索引交集


MongoDB 索引交集,初次看到這個東西覺得很神奇,查了一下是在 2.6 版本提供的新功能。

用途是一個查詢中,可以使用兩把 Index 進行協助查詢,注意,至多只能是兩把!所以你想把每個欄位都單獨建立索引,讓他能夠自由組合就錯了。

說明文件開頭也聲明:

  • 請使用 Compound Index 而非使用 Index Intersection
  • explain 上也不會優先使用它
  • 若查詢中有排序,就不能使用它

看了上述三項,應該很多情境都不會用了。


在更細去探討之前,先了解 Index。

例如我們現有一把 Index

Read more »

Environment

  • macOS Monterey
  • DotNet SDK 6.0.101
  • Rider IDE 2021.3.2
  • DotNet Core Project

升級 DotNet Core 版本後,有遇到某些專案會無法建置,錯誤如下:

NETSDK1177: Failed to sign apphost with error code 0

解法 1

  • Step1: 刪除專案底下的 obj 資料夾
  • Step2: 執行 Nuget restore

通常就可以解決了,如果還是無法,還有第二種…

解法2

直接輸入 xcode-select --install,等待安裝完畢即可

Read more »

Postman 發展至今已經是很強大的 API 測試工具,早期為單純的 API 測試,接著陸續加入了腳本、整合多個測試、個人同步、團隊協作甚至是開發 API 與 Mock server(模擬伺服器),讓你不需要熟稔程式也能開發自己的 API。


前置作業

  1. Postman官網 下載並安裝好 Postman
  2. 選擇以下任一個 API 測試網站,挑一個覺得順眼的就可以了

接下來我們練習的 API 會直接打到這些網站之一的接口


本篇會著重在介紹基本的使用。

打開 Postman 後會長這個樣子,點擊左方的 Collection,這個 Collection 像是一個測試資料夾,可以放置多個 API 測試之後,陸續執行。先來建立一個屬於這次測試的資料夾吧!

alt

Read more »

MongoDB, out, merge


本篇接續 MongoDB $out 教學,介紹的是 $out 語法的進階版本 $merge,客製化程度更高了,能夠處理衝突時該使用覆蓋還是略過等。

$merge 僅能在 aggregation pipeline 中使用,且必須是最後一個執行的階段,也就是說在前面可以執行任何的資料篩選、操作和轉型,最終輸入到目的地。

語法與參數

1
2
3
4
5
6
7
{ $merge: {
into: [collection] // 或是 { db: [db], coll: [collection] },
on: [field] // 或是 [ field1, field2 ], 指定唯一的欄位,選填參數
let: [variables], // 選填參數
whenMatched: [ replace | keepExisting | merge | fail | pipeline ], // 選填參數
whenNotMatched: [ insert | discard | fail ] // 選填參數
} }

從上述語法上可以得知

  • into 就是匯入的集合
  • on 指定唯一的欄位,用來做文件比對是否相符,以進行 whenMatchedwhenNotMatched 動作,可以是一個或多個欄位
  • let 可以讓使用者自定義的變數 $$xxx
  • whenMatched 當遇到衝突時該..
    • replace 直接取代
    • keepExisting 略過
    • merge 嘗試合併(預設選項)
    • fail 直接回傳失敗
    • pipeline 若有自定義的 user variable,就必須使用 pipeline 參數來客製整個操作細節
  • whenNotMatched
    • insert 直接寫入(預設選項)
    • discard 忽略此資料
    • fail 直接報錯

注意事項

Read more »