0%

想趁著做 Side Project 的同時順便練習一下文筆,因此就有了這系列的文章,主要是紀錄踩過的坑。
Side Project 想要使用 flask + postgresql,因此打算要在 windows 10 上安裝 docker,並透過 docker-compose 建立 postgresql 資料庫,而以下就是今天踩到的坑。

在 docker-compose 中利用 environment variable

1
${VARIABLE_NAME}

psql: FATAL: password authentication failed for user “postgres”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# docker-compose.yml
version: '3.8'

services:
db:
image: postgres
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data

volumes:

postgres-data:

在 docker container 裡建立的 postgresql 沒辦法連進去,兩個方法可以試試看

  1. 刪掉 docker volume 後重新跑一次

    有可能是因為在建立 container 時一樣用到舊 volume 資料,導致 docker-compose 或 docker file 上的設定沒有套用。

  2. 將對外的 port 從改成 5432 改成別的 5433:5432

    前面的數字代表 container 向外對應到 windows 上的 port,後面的數字則是 container 內的 port

    因為 5432 是 postgresql 預設的 port,所以假如在 windows 本機上也有裝 postgresql 的話,不管是透過 pgAdmin 或下 psql 指令連線都會連到 windows 本機上的 postgresql,而不是 docker container 裡的。

pipenv shell 中沒有辦法使用箭頭上跟下來輸入之前的指令

在 power shell 而不是 cmd 中執行 pipenv shell 就可以解決。

把一些常用的 hexo 指令記錄下來,以免每次都要重新查

  • 建立新文章

    1
    hexo new [layout] <title>
  • 產生 static file

    1
    hexo generate

    在 deploy 到 github 之前需要先打這行指令
    可以在後面接上 -d--deploy 就可以直接發布

    hexo generate -dhexo deploy -g 是一樣的

  • 在 local 開 server

    1
    hexo deploy -p 5000

    -p 指令 port

  • 列出所有路徑

    1
    hexo list <type>

    type 打 post 可以拿到所有發布的文章

  • 清理快取和產生的檔案

    1
    hexo clean

緣由

每次需要開發較大型的新功能時,往往需要一併重構或是想新架構,而一個人想出來的架構往往會有許多的盲點,因此就會需要畫簡易的類別圖。類別圖不但可以重新審視自己想的架構,更能加速與其他工程師討論的效率。有鑒於本人時常忘記類別圖各種相依關係的圖示,因此以這篇筆記來幫助我快速恢復記憶。

什麼是類別圖 class diagram?

類別圖是 UML 的一種,他透過一個系統中的物件、物件的屬性、物件擁有的方法和物件與物件之間的關係來描述其結構。

類別圖符號

類別圖的符號分為兩大類

  • 描述物件本身
  • 描述物件與物件的關係

物件 Object

總共分為三大格

  1. 物件名字
  2. 物件屬性
    • 前面為屬性名字
    • 冒號後面為屬性型別
  3. 物件方法
    • 前面為物件名字
    • 括號內為參數和參數型別
    • 冒號後面為回傳值型別
  • +代表公開屬性/函式 public attribute / method
    任何物件都可以存取和使用
  • -代表私有屬性/函式 private attribute / method
    只有該物件內部才可以存取和使用
  • #代表保護屬性/函式 protected attribute / method
    只有該物件和該物件繼承的子物件可以存取和使用

關係 Relation

  • Realization

    • A implement B , A 實作 B
    • B 為介面
  • Generalization

    • A extend B, A 繼承 B
    • B 為父類別
  • Dependency

    • A references B, A 使用 B
    • A 在參數或回傳時有用到 B
  • Association

    • A has-a B object, A 擁有 B
    • B 為 A 擁有的變數

Aggregation 和 Composition 為 Association 的一種特例

![](https://upload.cc/i1/2020/10/24/W7JpMX.png =200x200)

  • Aggregation

    • A 是由 B 組合而成,且為弱關係
    • A 和 B 擁有自己的獨立的生命週期,B 可單獨存在
    • 舉例

      訂單 擁有 商品
      商品可以獨立存在

  • Composition

    • A 是由 B 組合而成,且為強關係
    • B 只要離開 A 便不具意義,無法單獨存在,且生命週期與 A 一樣
    • 舉例

      人 擁有 手、腳、頭
      手、腳、頭獨立存在時無意義

參考資料

免費 SSL 憑證申請

Let’s Encrypt 是一個可以免費申請 SSL 憑證的機構
最簡單的做法是透過 Certbot 來替你的網站安裝憑證


以下範例用的是 Ubuntu 16.04 + Nginx

  1. 首先要先 SSH 進到你的 server 並擁有 root 權限
  2. 下載 Certbot 資源
1
2
3
4
5
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
  1. 安裝 Certbot
1
sudo apt-get install certbot python3-certbot-nginx
  1. 執行
1
sudo certbot --nginx
  1. 測試更新 bash script

因為 Let’s Encrypt 發行的憑證 90 天後就會過期,因此每1個半月就需要更新一次,而 Certbot 會幫你安裝一個自動更新的 bash script
通常安裝在其中一個這邊的位置

1
2
3
/etc/crontab/
/etc/cron.*/*
systemctl list-timers

檢查更新程式

1
sudo certbot renew --dry-run
  1. 驗證 SSL 安裝成功
    可以在 SSL checker 檢查有沒有安裝成功

以下紀錄以前使用 Ruby 查詢的一些小知識
可以利用 ctrl + f 快速搜尋

數字相關 Numeric

  • 除法
    整數 / 整數 = 整數
1
2
> 5 / 3
=> 1

但如果有任一數為小數,則結果為小數

1
2
> 5 / 3.0
=> 1.6666666666666667

如果想要整數互除得到小數可以使用 fdiv

1
2
> 5.fdiv(3)
=> 1.6666666666666667

如果想要得到分數,可以使用 quo,不過都要是整數

1
2
3
4
> 5.quo(3)
=> (5/3)
> 5.quo(3.0)
=> 1.6666666666666667

Refactor 之路

此系列文章是為了記錄 Refactor 公司遺留程式碼,一方面以後可以回過頭來檢討,一方面可以讓更多人一起討論。
主要會寫一些 design choice 以及架構設計的 UML 圖。

第三方API封裝 Third Party API Encapsulation

Service Diagram

Service 主要負責三件事

  • input validation (輸入驗證)
    validation 寫在 service 的好處是,如果未來 validation 有更動,就不需要到各個 adapter 修改
  • output format (輸出格式)
    統一不同介面的 API 回傳格式
    介面可按需求自行調整,主要是為了讓每支 API 有共通的操作介面
  • HTTP request encapsulation (封裝)
    封裝後可以隱藏實作細節,並重複使用

Open-Closed Principle 開放-封閉法則

核心概念

⚡️Open for extension, but closed for modification.⚡️

翻譯成中文↓

⚡️開放擴充,但避免不必要的修改。⚡️

黑人問號
還是看不懂嗎?那我來講個故事。

閱讀全文 »