2022年2月12日 星期六

[Python] 常用Collections:namedtuple、defaultdict、OrderedDict

 

1. namedtuple

tuple是immutable的,初始化後值就無法改變

namedtuple適用於想存一個不希望有人改值的資料時


>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'age'])
>>> a = Student('Tom', 20)
>>> a.name
'Tom'
>>> a.age
20
>>> a.age=21
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute


[Python] Fluent Interface 流式接口

 

不知道大家是否有聽過「流式接口」(Fluent Interface)

總之我是最近才知道這個詞的


說起來為什麼會去查這東西

因為最近隨便看看,看到Java code滿多這樣的程式碼:a.foo().boo(),像是這樣會將函式接連串下去的程式碼,就好奇查了一下Python相似的寫法實作與應用

然後就查到原來這樣的寫法有個稱呼:「流式接口」

流式接口- 維基百科,自由的百科全書 

2022年1月15日 星期六

[觀後感] 86-不存在的戰區- 第一季 (有劇透)

 



本作是輕小說改編動畫,作品我在看動畫前就有耳聞,應該是在「這本輕小說真厲害」的榜單上看到的名字的,因此一直有著原作就很有人氣的印象,然後終於動畫化的感覺。


故事講述聖瑪格諾利亞共和國與帝國的無人兵器「軍團」間的戰爭,共和國宣稱研發的無人機「破壞神」能與軍團對抗,並沒有造成人員傷亡,但實際上破壞神是由一群遭受種族迫害被剝多公民權的人駕駛,並非真的無人死傷,只是做為非白系種不被當作人計算而已,這些被隔絕於共和國85區外被迫踏上戰場的人,被惡稱為「86」。

2021年12月9日 星期四

Nginx學習筆記 (8) - Cache緩存配置


Cache 可以減輕後端 server 的負擔,同樣的 request 內容不用每次都再跟 server 要資料,可以使用 Nginx Cache 裡存的 response 做回應

Nginx學習筆記 (7) - Rewrite重定向使用


Rewrite 重定向

語法:

rewrite regex replacement [flag];

若 path 符合後面 regex 正規匹配的話,會重定向到 replacement 位置

Nginx學習筆記 (5) - Load balacing演算法


Nginx 內提供多種 Load Balance 演算法

Nginx學習筆記 (6) - Proxy設定


Proxy 主要分成兩種

1. 正向代理 (Forward proxy):代理對象是client

  client <--> proxy <-- | --> server

  (server不會知道client的IP)


2. 反向代理 (Reverse proxy):代理對象是server

  client <-- | --> proxy <---> server

  (client不會知道server的IP)


作為服務端,我們一般是拿Nginx做為 reverse proxy,前面講到的負載平衡的分流其實就是 reverse proxy 的一種常見功能,以下介紹更多 proxy 相關的功能

Nginx學習筆記 (4) - Load balacing負載平衡實作


為應付龐大流量時後端可能不是只有一個伺服器,Nginx作為中間代理,能解析用戶端來的請求的路徑,做派發到特定後端伺服器處理,當中也可做些負載平衡的設定,讓流量分散到各伺服器,防止只有單一伺服器繁忙的狀況

Nginx學習筆記 (3) - Location 路由匹配

config 檔裡的 location 可用來定義請求 path 對應的回應

以下說明匹配規則

首先,要記住這幾個符號代表的意思:

1. = /uri:精準匹配,如果有對到搜尋會到此為止

2. ^~ /uri:前綴匹配,如果有對到搜尋會到此為止

3. ~ pattern:正規表達式匹配,區分大小寫

4. ~* pattern:正規表達式匹配,不區分大小寫

5. /uri:前綴匹配

6. /:通用匹配,所有的路徑一定會匹配到這個


採用的順序是:

1. = 精準匹配最優先

2. ^~ 前綴匹配,對到即使用

3. ~pattern, ~* pattern 正則匹配

4. 沒帶修飾的前綴匹配

5. 通用匹配

多個正則匹配的狀況,會選擇設定寫在上面的那個匹配

多個前綴匹配成功的狀況,會選擇匹配最長的那個

Nginx學習筆記 (2) - 配置設定與指令


Config 檔案

Nginx的config配置檔案

- /etc/nginx/nginx.conf     (主配置)

- /etc/nginx/conf.d/default.conf   (預設會被加載的配置檔)

Nginx學習筆記 (1) - 利用Docker建立測試環境

為了之後學習與測試方便,我們先利用Docker來建立一個Nginx測試環境吧!


檔案結構:

docker-compose.yaml

nginx/

├─ log/

├─ html/

│  ├─ index.html

├─ default.conf

2021年12月8日 星期三

[PostgreSQL] 資料庫的Race Condition問題與交易隔離等級

資料庫的操作會併發處理,因此也會遇到Race Condition問題

此篇文章會說明各種問題情境與解法

這裡主要是考慮使用的是 PostgreSQL 資料庫的狀況,不一樣的資料庫可能會有不同結果


- 髒寫 (Dirty Write)

在前一個寫入還沒commit前,後面的寫入覆蓋前面的值,就是 Dirty Write

範例:

DB: X = 0

Transaction A:寫入 X = 10

Transaction B:寫入 X = 5

Transaction A:COMMIT

Transaction B:COMMIT

最後 X = 5,Transaction A 的寫入被蓋掉了

2021年11月28日 星期日

[Python] asycio工作原理淺談

 

什麼是 asyncio

asyncio 是 Python 內建的module,在 Python 3.4 時加入

是一種單 thread 的設計,它靠著 cooperative multitasking (協同運作式多工) 讓我們能多個工作併發處理 (concurrent)

協同運作式多工相對於搶佔式多工(Preemptive multitasking),協作式多工要求每一個運行中的程式,定時放棄自己的執行權利,告知作業系統可讓下一個程式執行

多線程採用的是搶佔式多工,多線程是由作業系統做排程,線程執行任務途中會被外力(作業系統)中斷改排其他線程執行,而協同運作式多工不由作業系統排程,在任務執行時遇到需要等待回應的狀況,會放棄執行權,改執行別的任務,而原任務在等到回應後再繼續執行

這篇文章主要是大概介紹 asyncio是如何做到 cooperative multitasking

在介紹 asyncio 是怎麼做到 cooperative multitasking,首先需要知道什麼是Coroutine與Event Loop

2021年11月25日 星期四

[PostgreSQL] 常用SQL指令集

 

- 查詢Table的某筆資料

select "欄位名" from "表格名" where "條件"

範例:

select * from tb_customer where customer_id='xxxxxx';

select name from tb_customer where customer_id='xxxxxx' order by age asc;      (order by "欄位名" [desc, asc])

2021年11月17日 星期三

RabbitMQ (6):使用 RabbitMQ 建立 RPC system

 

什麼是RPC

RPC 全名 Remote Procedure Callback,是一種電腦通信協定,該協定允許執行於一台電腦的程式呼叫另一個位址空間(通常為一個開放網路的一台電腦)的子程式

程式碼看起來就像呼叫一般的函式,但其實底層是呼叫遠端別的程式的函式

RabbitMQ (5):路由設定與Exchange種類

RabbitMQ 提供各種 routing 方法,讓我們能在傳送消息上做到各種變化以適應各種條件問題

前幾章大概說明了消息的傳輸路徑,先來看第一站:Exchange 元件

RabbitMQ 提供了四種 Exchange

RabbitMQ (4):Message Acknowledgments與Durability

 

Message Acknowledgments

RabbitMQ 提供了 Message Acknoledgments (簡稱ack) 的功能,讓我們能確保消息有準確傳達,以及正確執行

RabbitMQ (3):Python實作RabbitMQ Producer端與Consumer端

 

Producer 端實作

使用 python pika client library 實作簡單的 Producer 端發送訊息到 MQ 裡

pika doc:https://pika.readthedocs.io/en/stable/

RabbitMQ (1):RabbitMQ基本介紹


什麼是 RabbitMQ? 


RabbitMQ 是 message broker (消息代理) 軟體

當中傳輸消息的協定是使用 AMQP (Advanced Message Queuing Protocol,高級消息隊列協議)

RabbitMQ (2):使用Docker建立RabbitMQ測試環境

 
使用 Docker 建立 RabbitMQ 測試環境吧!