<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Quietbo</title><link>https://quietbo.com/posts/</link><description>Recent content in Posts on Quietbo</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Sun, 06 Jul 2025 21:09:56 +0000</lastBuildDate><atom:link href="https://quietbo.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>[Kafka] 使用docker在本機部署KRaft模式 + kafka-ui (簡易版)</title><link>https://quietbo.com/2025/07/07/kafka%E4%BD%BF%E7%94%A8docker%E5%9C%A8%E6%9C%AC%E6%A9%9F%E9%83%A8%E7%BD%B2kraft/</link><pubDate>Sun, 06 Jul 2025 21:09:56 +0000</pubDate><guid>https://quietbo.com/2025/07/07/kafka%E4%BD%BF%E7%94%A8docker%E5%9C%A8%E6%9C%AC%E6%A9%9F%E9%83%A8%E7%BD%B2kraft/</guid><description>&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;原本官方文件的簡單範例使用預設網路設定，大部分參數都自動配置，較適合單機測試，但無法與 kafka-ui 等其他服務整合。本篇將介紹如何使用 Kafka KRaft 模式 + kafka-ui，並提供完整的配置說明。&lt;/p&gt;
&lt;p&gt;相關連結：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/r/apache/kafka" target="_blank" rel="noopener"
 &gt;docker-kafka&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.net.tw/guides/kafka/" target="_blank" rel="noopener"
 &gt;dockerdocs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/provectus/kafka-ui" target="_blank" rel="noopener"
 &gt;gitHub-kafka-ui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hub.docker.com/layers/apache/kafka/3.9.1/images/sha256-5862db4a63a6dd7d46fd14771b10a1b39e069c2c47f17d8e4640f960720a0ead" target="_blank" rel="noopener"
 &gt;kafka:3.9.1 image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什麼是-kraft-模式"&gt;什麼是 KRaft 模式？
&lt;/h2&gt;&lt;p&gt;KRaft (Kafka Raft) 是 Kafka 的新架構模式，主要特色：&lt;/p&gt;
&lt;p&gt;不需要 ZooKeeper：簡化部署和維護&lt;br&gt;
內建 Controller：metadata 管理更高效&lt;br&gt;
更好的效能：減少網路延遲和複雜度&lt;/p&gt;
&lt;p&gt;快速開始 (推薦使用 docker-compose)&lt;br&gt;
如果你想快速開始，可以直接跳到 docker-compose.yml 章節。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;創建自定義網路&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker network create kafka-network
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;部署 Kafka Broker
為什麼選擇 3.9.1 而不是 latest？
版本固定，確保環境一致性，避免 latest 版本可能帶來的不穩定性&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d \
 --name broker \
 --network kafka-network \
 -p 9092:9092 \
 -e KAFKA_NODE_ID=1 \
 -e KAFKA_PROCESS_ROLES=broker,controller \
 -e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker:9092 \
 -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
 -e KAFKA_CONTROLLER_QUORUM_VOTERS=1@broker:9093 \
 -e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
 apache/kafka:3.9.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;環境變數詳解&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;變數&lt;/th&gt;
 &lt;th&gt;說明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_NODE_ID=1&lt;/td&gt;
 &lt;td&gt;節點唯一 ID，KRaft 模式必需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_PROCESS_ROLES=broker,controller&lt;/td&gt;
 &lt;td&gt;同時扮演 broker 和 controller 角色&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093&lt;/td&gt;
 &lt;td&gt;監聽接口：9092（客戶端）、9093（內部管理）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://broker:9092&lt;/td&gt;
 &lt;td&gt;重要：告訴客戶端如何連接&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER&lt;/td&gt;
 &lt;td&gt;監聽器名稱&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_CONTROLLER_QUORUM_VOTERS=1@broker:9093&lt;/td&gt;
 &lt;td&gt;選舉投票設定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT&lt;/td&gt;
 &lt;td&gt;Broker 間通信協定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;重要提醒： KAFKA_ADVERTISED_LISTENERS 必須使用 broker:9092，不能使用 localhost:9092，否則 kafka-ui 無法連接！&lt;/p&gt;
&lt;h2 id="kafka-ui"&gt;kafka-ui
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d \
 --name kafka-ui \
 --network kafka-network \
 -p 8080:8080 \
 -e KAFKA_CLUSTERS_0_NAME=local \
 -e KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=broker:9092 \
 provectuslabs/kafka-ui:latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;環境變數的解說:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;變數&lt;/th&gt;
 &lt;th&gt;說明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_CLUSTERS_0_NAME=local&lt;/td&gt;
 &lt;td&gt;集群顯示名稱&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=broker:9092&lt;/td&gt;
 &lt;td&gt;必須與 KAFKA_ADVERTISED_LISTENERS 一致&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="測試是否正常"&gt;測試是否正常
&lt;/h3&gt;&lt;p&gt;檢查服務狀態&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;bash# 檢查容器運行狀態
docker ps

# 檢查 kafka-ui 日誌
docker logs kafka-ui

# 檢查 broker 日誌
docker logs broker
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;# 進入 Kafka 容器
docker exec --workdir /opt/kafka/bin/ -it broker sh

# 創建測試 Topic
./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-topic

# 列出所有 Topics
./kafka-topics.sh --bootstrap-server localhost:9092 --list

# 查看 Topic 詳細資訊
./kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic test-topic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;測試 Producer/Consumer&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# 啟動 Producer (會出現 &amp;gt; 提示符)
./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
&amp;gt; hello kafka
&amp;gt; this is a test message

# 啟動 Consumer (讀取所有訊息)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;透過 kafka-ui 驗證
開啟瀏覽器訪問：http://localhost:8080
你應該能看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kafka 集群狀態&lt;/li&gt;
&lt;li&gt;Topics 列表&lt;/li&gt;
&lt;li&gt;剛才發送的訊息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="docker-composeyml-推薦方式"&gt;docker-compose.yml (推薦方式)
&lt;/h2&gt;&lt;p&gt;請使用docker-compose.yml來儲存下方內容，&lt;br&gt;
並下指令docker-compose up即可正常運行&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;version: &amp;#39;3.8&amp;#39;
services:
 broker:
 image: apache/kafka:3.9.1
 container_name: broker
 ports:
 - &amp;#34;9092:9092&amp;#34;
 environment:
 KAFKA_NODE_ID: 1
 KAFKA_PROCESS_ROLES: broker,controller
 KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092
 KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
 KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker:9093
 KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
 networks:
 - kafka-network

 kafka-ui:
 image: provectuslabs/kafka-ui:latest
 container_name: kafka-ui
 ports:
 - &amp;#34;8080:8080&amp;#34;
 environment:
 KAFKA_CLUSTERS_0_NAME: local
 KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: broker:9092
 depends_on:
 - broker
 networks:
 - kafka-network

networks:
 kafka-network:
 driver: bridge
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;啟動服務&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;bash# 啟動所有服務
docker-compose up -d

# 查看服務狀態
docker-compose ps

# 查看日誌
docker-compose logs -f

# 停止服務
docker-compose down
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看當前版本&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker exec -it broker /opt/kafka/bin/kafka-topics.sh --version
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;輸出範例：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;4.0.0
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] goroutine &amp; sync.WaitGroup</title><link>https://quietbo.com/2024/11/17/golang-goroutine-sync-waitgroup/</link><pubDate>Sun, 17 Nov 2024 15:27:57 +0000</pubDate><guid>https://quietbo.com/2024/11/17/golang-goroutine-sync-waitgroup/</guid><description>&lt;p&gt;Goroutine 是 Go 語言中一種輕量級的並發執行單元。我們可以使用 Goroutine 來實現並發編程,提高程式的效率和性能。&lt;/p&gt;
&lt;p&gt;sync.WaitGroup 是 Go 標準庫中提供的一個同步原語,它用於等待一組 Goroutine 全部執行完畢。我們可以通過以下方式使用 sync.WaitGroup:&lt;/p&gt;
&lt;p&gt;創建 WaitGroup 實例:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wg := new(sync.WaitGroup)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 wg.Add(n) 可以將 WaitGroup 的計數器增加 n。每啟動一個新的 Goroutine,都需要增加計數器。 增加 WaitGroup 計數器:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wg.Add(n)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;等待所有 Goroutine 完成&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wg.Wait()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 main 函數中,使用 wg.Wait() 可以阻塞直到所有 Goroutine 都完成。&lt;/p&gt;
&lt;p&gt;在 Goroutine 中減少計數器:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;defer wg.Done()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在 Goroutine 內部,使用 defer wg.Done() 可以在 Goroutine 退出時,將 WaitGroup 的計數器減 1。&lt;/p&gt;
&lt;p&gt;下方為實作的code，找質數：一般如果用for迴圈會非常慢&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package main

import (
 &amp;#34;fmt&amp;#34;
 &amp;#34;time&amp;#34;
)

func main() {
 num := 300000
 start := time.Now()
 for i := 1; i &amp;lt;= num; i++ {
 if isPrime(i) {
 fmt.Println(i)
 }
 }
 end := time.Now()
 fmt.Println(end.Unix() - start.Unix(), &amp;#34;seconds&amp;#34;)
}

func isPrime(num int) bool {
 if num == 1 {
 return false
 } else if num == 2 {
 return true
 } else {
 for i := 2; i &amp;lt; num; i++ {
 if num % i == 0 {
 return false
 }
 }
 return true
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;單純只使用Goroutine，在使用findPrimes之前加go，會沒辦法知道實際到底花幾秒的時間，以及main時間到就會結束。 main 啟動了 300000 個 Goroutine，每個 Goroutine 調用 findPrimes 函數。 但是 main 函數並沒有等待所有 Goroutine 執行完畢,而是直接等待了 2 秒鐘輸出 done。 單純使用 Goroutine 而不使用 sync.WaitGroup 或其他同步機制,無法確保所有任務都已完成,也無法準確測量總的執行時間。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package main

import (
 &amp;#34;fmt&amp;#34;
 &amp;#34;time&amp;#34;
)

func main() {
 num := 300000
 for i := 1; i &amp;lt;= num; i++ {
 go findPrimes(i)
 }
 time.Sleep(2 * time.Second)
 fmt.Println(&amp;#34;done&amp;#34;)
}

func findPrimes(num int) {
 if num == 1 {
 return
 } else if num == 2 {
 fmt.Println(num)
 } else {
 for i := 2; i &amp;lt; num; i++ {
 if num % i == 0 {
 return
 }
 }
 fmt.Println(num)
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;因此,我們無法確定在 “done” 輸出之前,所有 findPrimes 函數都已經執行完畢，要解決這個問題,最簡單的方法就是使用 sync.WaitGroup。&lt;/p&gt;
&lt;p&gt;下方正確使用了 sync.WaitGroup 來確保所有 Goroutine 都執行完畢,並且能夠正確地計算整個過程的耗時。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;package main

import (
 &amp;#34;fmt&amp;#34;
 &amp;#34;sync&amp;#34;
 &amp;#34;time&amp;#34;
)

func main() {
 wg := new(sync.WaitGroup)
 num := 300000
 wg.Add(num) // 設置需要檢查的數字範圍為 1 到 300000
 start := time.Now().Unix()
 for i := 1; i &amp;lt;= num; i++ {
 go findPrimes(i, wg) // 啟動 num 個 goroutine,每個 goroutine 都調用 findPrimes 函數。

 }
 wg.Wait() // 在所有goroutine完成之前, main 函數會一直等待,使用 wg.Wait()
 end := time.Now().Unix()
 fmt.Print(end-start, &amp;#34;seconds&amp;#34;)
}

func findPrimes(num int, wg *sync.WaitGroup) {
 defer wg.Done() // 確保在函數退出時,WaitGroup 的計數器會被減 1
 if num == 1 {
 return
 } else if num == 2 {
 fmt.Println(num)
 } else {
 for i := 2; i &amp;lt; num; i++ {
 if num%i == 0 {
 return
 }
 }
 fmt.Println(num)
 }
}
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Redis] 監控</title><link>https://quietbo.com/2024/11/11/redis-%E7%9B%A3%E6%8E%A7/</link><pubDate>Sun, 10 Nov 2024 18:19:00 +0000</pubDate><guid>https://quietbo.com/2024/11/11/redis-%E7%9B%A3%E6%8E%A7/</guid><description>&lt;p&gt;參考文章:[Redis維之監控指標，效能監控，監控方式，反應慢分析][1]&lt;/p&gt;
&lt;p&gt;先連接redis（本機默認端口6379）&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;redis-cli
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果不使用下方redis-cli的話，就使用bin/redis-cli info | grep mem&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO # 查看當前狀態（可以一次獲取所有的信息，也可以按塊獲取信息）
INFO &amp;lt;子集&amp;gt; # 例如 CPU,memory 
INFO memory # INFO 命令的子集，只會顯示與記憶體相關的資訊
INFO stats # Redis的統計數據，主要包含命令執行、連接、網路等統計信息。
LATENCY LATEST # 查看最近的延遲峰值
LATENCY HISTORY command # 顯示 command 事件的延遲歷史記錄
SLOWLOG GET [n] # 獲取慢查詢日誌（默認獲取所有）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;非交互模式下的指令&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;redis-cli --latency # 基本延遲測試
redis-cli --latency-history # 延遲歷史記錄（每15秒輸出一次）
redis-cli --latency-dist # 延遲分佈圖
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-&amp;ndash; server:伺服器運行的環境參數 clients:客戶端相關訊息 memory：伺服器運行記憶體統計數據 persistence：持久化訊息 stats：通用統計數據 Replication：主從複製相關訊息 CPU：CPU使用情況 cluster：集群資訊 Keypass：鍵值對統計數量信息&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./redis-cli info 按块获取信息 | grep 需要过滤的参数
./redis-cli info stats | grep ops
./redis-cli &amp;gt; info server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;-&amp;ndash; Redis的統計數據，主要包含命令執行、連接、網路等統計信息。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Stats
total_connections_received:12345 # 總共接受的連接數
total_commands_processed:123456 # 總共處理的命令數
instantaneous_ops_per_sec:1000 # 每秒執行的命令數
total_net_input_bytes:12345678 # 總網路輸入流量(bytes)
total_net_output_bytes:12345678 # 總網路輸出流量(bytes)
instantaneous_input_kbps:12.34 # 即時輸入流量(KB/s)
instantaneous_output_kbps:12.34 # 即時輸出流量(KB/s)
rejected_connections:0 # 由於maxclients限制而被拒絕的連接數
sync_full:2 # 全量同步次數
sync_partial_ok:1 # 成功的部分同步次數
sync_partial_err:0 # 失敗的部分同步次數
expired_keys:12345 # 過期的key數量
expired_stale_perc:0.12 # 過期key的百分比
expired_time_cap_reached_count:0 # 達到過期時間上限的次數
expire_cycle_cpu_milliseconds:123 # 過期循環佔用CPU的毫秒數
evicted_keys:0 # 由於maxmemory限制而被驅逐的key數量
keyspace_hits:123456 # key命中次數
keyspace_misses:12345 # key未命中次數
pubsub_channels:1 # 目前使用中的發布/訂閱頻道數
pubsub_patterns:0 # 目前使用中的發布/訂閱模式數
latest_fork_usec:1234 # 最近一次fork操作耗時(微秒)
migrate_cached_sockets:0 # 快取的遷移socket數量
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;[1]: &lt;a class="link" href="https://www.cnblogs.com/jingzh/p/18414550#13-redis%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/jingzh/p/18414550#13-redis%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Doris] docker容器啟動時遇到 Please set vm.max_map_count to be xxxxxx</title><link>https://quietbo.com/2024/10/24/doris-docker%E5%AE%B9%E5%99%A8%E5%95%9F%E5%8B%95%E6%99%82%E9%81%87%E5%88%B0-please-set-vm-max_map_count-to-be-xxxxxx/</link><pubDate>Thu, 24 Oct 2024 07:51:39 +0000</pubDate><guid>https://quietbo.com/2024/10/24/doris-docker%E5%AE%B9%E5%99%A8%E5%95%9F%E5%8B%95%E6%99%82%E9%81%87%E5%88%B0-please-set-vm-max_map_count-to-be-xxxxxx/</guid><description>&lt;p&gt;如果在docker 中遇到下方字串&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please &lt;span class="nb"&gt;set&lt;/span&gt; vm.max_map_count to be &lt;span class="m"&gt;2000000&lt;/span&gt; under root using &lt;span class="s1"&gt;&amp;#39;sysctl -w vm.max_map_count=2000000&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用下方指令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it --privileged --pid&lt;span class="o"&gt;=&lt;/span&gt;host --name&lt;span class="o"&gt;=&lt;/span&gt;change_count debian nsenter -t &lt;span class="m"&gt;1&lt;/span&gt; -m -u -n -i sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;進入到容器後再執行指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -w vm.max_map_count&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然後exit退出並建立Doris Docker叢集。&lt;/p&gt;
&lt;p&gt;來源來自:[doris官方文件-#Docker部署Doris][1]&lt;/p&gt;
&lt;p&gt;[1]: &lt;a class="link" href="https://doris.apache.org/docs/1.2/install/construct-docker/run-docker-cluster/#deploy-doris-docker" target="_blank" rel="noopener"
 &gt;https://doris.apache.org/docs/1.2/install/construct-docker/run-docker-cluster/#deploy-doris-docker&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Graph database] 使用docker安裝memgraph &amp; python簡易連線</title><link>https://quietbo.com/2024/03/24/graph-database-%E4%BD%BF%E7%94%A8docker%E5%AE%89%E8%A3%9Dmemgraph/</link><pubDate>Sun, 24 Mar 2024 06:42:36 +0000</pubDate><guid>https://quietbo.com/2024/03/24/graph-database-%E4%BD%BF%E7%94%A8docker%E5%AE%89%E8%A3%9Dmemgraph/</guid><description>&lt;ul&gt;
&lt;li&gt;使用docker desktop&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="什麼是-graph-database-"&gt;什麼是 Graph database ？
&lt;/h2&gt;&lt;p&gt;[Graph database簡稱GDB][1],是一個使用圖結構進行語意查詢的資料庫，它使用節點、邊和屬性來表示和儲存資料。 該系統的關鍵概念是圖，它直接將儲存中的資料項，與資料節點和節點間表示關係的邊的集合相關聯 目前有哪些GraphDB,排名:&lt;a class="link" href="https://db-engines.com/en/ranking/graph&amp;#43;dbmsmemgraph" target="_blank" rel="noopener"
 &gt;圖形資料庫排名&lt;/a&gt;以及所有&lt;a class="link" href="https://db-engines.com/en/ranking" target="_blank" rel="noopener"
 &gt;受歡迎程度對資料庫管理系統進行排名&lt;/a&gt; ## docker desktop 安裝 memgraph&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-1-1024x579.png"&gt;以在 localhost:7687 看到 memgraph 的介面了。&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-2-1024x551.png"&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-3-1024x638.png"&gt;點擊左方的Datasets 找 CORA: Scientific publications classified into seven categories&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-4-1024x550.png"&gt;執行完成後點擊 run query&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-5-1024x550.png"&gt;會出現下方成功的結果&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://quietbo.com/uploads/2024/03/image-1024x591.png"&gt;## Python連線&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用pycharm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官網教學:[網址][2] 當memgraph建立成功後使用下方程式碼來建立Person&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mgclient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mgclient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7687&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; CREATE (n:Person {name: &amp;#39;John&amp;#39;})-[e:KNOWS]-&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; (m:Person {name: &amp;#39;Steve&amp;#39;})
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; RETURN n, e, m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# (:Person {&amp;#39;name&amp;#39;: &amp;#39;John&amp;#39;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# [:KNOWS]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# (:Person {&amp;#39;name&amp;#39;: &amp;#39;Steve&amp;#39;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 提交數據(沒有commit就不會真正存進資料庫內)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 關閉游標和連線&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接著在memgraph下sql指令即可看到剛才創建的2筆資料&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;MATCH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;RETURN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;[1]: &lt;a class="link" href="https://zh.wikipedia.org/zh-tw/%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93" target="_blank" rel="noopener"
 &gt;https://zh.wikipedia.org/zh-tw/%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93&lt;/a&gt; [2]: &lt;a class="link" href="https://pypi.org/project/pymgclient/0.1.0/" target="_blank" rel="noopener"
 &gt;https://pypi.org/project/pymgclient/0.1.0/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Kafka] Mac上使用Docker部署kafka+zookeeper</title><link>https://quietbo.com/2024/03/22/kafka-mac%E4%B8%8A%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2kafkazookeeper/</link><pubDate>Fri, 22 Mar 2024 07:32:14 +0000</pubDate><guid>https://quietbo.com/2024/03/22/kafka-mac%E4%B8%8A%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2kafkazookeeper/</guid><description>&lt;ol&gt;
&lt;li&gt;拉取 kafka &amp;amp; zookeeper image&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker pull wurstmeister/kafka
docker pull zookeeper
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;運行zookeeper的container&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d --name zookeeper -p 2181:2181 -t zookeeper
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;運行kafka(下方會建立3個docker container) 注意：192.168.999.999為自己本機的ip，請自行手動修改 mac查詢方式:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ifconfig | grep &amp;#34;inet&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看到的inet有192.168.XXX.XXX就是了!\[Uploading file…_28ywkkhaq\]() 參數說明:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-d: 表示在背景運行容器&lt;/li&gt;
&lt;li&gt;–name: 容器命名&lt;/li&gt;
&lt;li&gt;-p: 將容器內部的port分享到本機的prot號，用於kafka的監聽端口&lt;/li&gt;
&lt;li&gt;-e KAFKA_BROKER_ID=0: 設置環境變量，將Kafka Broker的ID設為0。&lt;/li&gt;
&lt;li&gt;-e KAFKA_ZOOKEEPER_CONNECT=192.168.999.999:2181 將Kafka與Zookeeper連接。Zookeeper預設的prot是2181&lt;/li&gt;
&lt;li&gt;-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.999.999:9092:&lt;/li&gt;
&lt;li&gt;PLAINTEXT:// 使用普通的明文文字傳輸協議。這是設定 Kafka 的廣告偵聽器，也就是 Kafka 伺服器公開給外部用戶端的位址和連接埠。&lt;/li&gt;
&lt;li&gt;-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092: 設置Kafka監聽的地址和端口。&lt;/li&gt;
&lt;li&gt;-t wurstmeister/kafka: 指定使用的image(wurstmeister/kafka 是 Kafka 官方維護的一個鏡像&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kafka0：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d --name kafka0 -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.999.999:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.999.999:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kafka1：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.999.999:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.999.999:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kafka2：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d --name kafka2 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.999.999:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.999.999:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 -t wurstmeister/kafka
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;成功後4個container都顯示Running 進入kafka0的container&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker exec -it kafka0 /bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;進入bin後創建topic&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /opt/kafka_2.13-2.8.1/bin
kafka-topics.sh --create --zookeeper 192.168.999.999:2181 --replication-factor 3 --partitions 5 --topic TestTopic
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看指定 topic&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kafka-topics.sh --zookeeper 192.168.999.999:2181 --topic TestTopic --describe 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hackmd.io/_uploads/rk5Uw5tCa.png"&gt;節點說明：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Topic: TestTopic TopicId: H-Y_jJv5TFSN-sxQBMnzdg PartitionCount: 5 ReplicationFactor: 3
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Topic: 主題名稱&lt;/li&gt;
&lt;li&gt;Leader: 主題節點號&lt;/li&gt;
&lt;li&gt;Replicas: 副本節點有Broker.id = 2、0、1（包括Leader Replica和Follower Replica，且不管是否存活），&lt;/li&gt;
&lt;li&gt;Isr: 表示存活且同步Leader節點的副本有Broker.id = 2、0、1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看 topic 集合&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kafka-topics.sh --zookeeper 192.168.999.999:2181 --list
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hackmd.io/_uploads/ByjwPqKAT.png"&gt;生產者和消费者測試，開啟三個終端機， 分別在Broker0上運行一個生產者，Broker1、2上分別運行一個消費者：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kafka-console-producer.sh --broker-list 192.168.999.999:9092 --topic TestTopic

kafka-console-consumer.sh --bootstrap-server 192.168.999.999:9093 --topic TestTopic --from-beginning

kafka-console-consumer.sh --bootstrap-server 192.168.999.999:9094 --topic TestTopic --from-beginning
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;左邊輸入的地方會有個&amp;gt; 箭頭符號，代表是生產者，送出後會送到右手邊的消費者&lt;img alt="image" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hackmd.io/_uploads/SkrsccY0T.png"&gt;[1]: &lt;a class="link" href="https://hackmd.io/" target="_blank" rel="noopener"
 &gt;https://hackmd.io/&lt;/a&gt;_uploads/SkrsccY0T.png&lt;/p&gt;</description></item><item><title>[Redis] HyperLogLog(HLL) – 活躍量統計</title><link>https://quietbo.com/2023/12/06/redis-hyperlogloghll-%E6%B4%BB%E8%BA%8D%E9%87%8F%E7%B5%B1%E8%A8%88/</link><pubDate>Wed, 06 Dec 2023 11:00:45 +0000</pubDate><guid>https://quietbo.com/2023/12/06/redis-hyperlogloghll-%E6%B4%BB%E8%BA%8D%E9%87%8F%E7%B5%B1%E8%A8%88/</guid><description>&lt;p&gt;統計一個APP的日活量（DAU）和月活量（MAU）&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;基數: 不重複元素, 例如{1, 2, 3, 5, 5, 5, 6}, 基數集為{1, 2, 3, 5, 6}, 基數為5;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;本次範例使用Docker內建立一個Redis容器 [Redis-hyperloglogs][1] HyperLogLogs 提供了3個指令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pfadd : 添加&lt;/li&gt;
&lt;li&gt;pfcount : 計數&lt;/li&gt;
&lt;li&gt;pfmerge : 合併&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; PFADD bikes Hyperion Deimos Phoebe Quaoar
(integer) 1
&amp;gt; PFCOUNT bikes
(integer) 4
&amp;gt; PFADD commuter_bikes Salacia Mimas Quaoar
(integer) 1
&amp;gt; PFMERGE all_bikes bikes commuter_bikes
OK
&amp;gt; PFCOUNT all_bikes
(integer) 6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以上的操作說明為:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;將Hyperion, Deimos, Phoebe, Quaoar加入至bikes&lt;/li&gt;
&lt;li&gt;查看bikes目前有多少基數(不重複元素)&lt;/li&gt;
&lt;li&gt;Salacia, Mimas, Quaoar加入至commuter_bikes&lt;/li&gt;
&lt;li&gt;將兩個key&amp;gt; bikes與commuter_bikes合併成一張表，命名為all_bikes&lt;/li&gt;
&lt;li&gt;查看all_bikes目前有多少基數&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第4個操作不會將原本兩表刪除，還是會保留著。 如果想要HLL的資料刪除的話，可使用del與TTL時間到達後自行刪除 [1]: &lt;a class="link" href="https://redis.io/docs/data-types/probabilistic/hyperloglogs/" target="_blank" rel="noopener"
 &gt;https://redis.io/docs/data-types/probabilistic/hyperloglogs/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Postman] 不會寫code也沒關係, postman幫你把request轉成code!(必學)</title><link>https://quietbo.com/2023/11/20/postman-%E4%B8%8D%E6%9C%83%E5%AF%ABcode%E4%B9%9F%E6%B2%92%E9%97%9C%E4%BF%82-postman%E5%B9%AB%E4%BD%A0%E6%8A%8Arequest%E8%BD%89%E6%88%90code%E5%BF%85%E5%AD%B8/</link><pubDate>Mon, 20 Nov 2023 07:05:53 +0000</pubDate><guid>https://quietbo.com/2023/11/20/postman-%E4%B8%8D%E6%9C%83%E5%AF%ABcode%E4%B9%9F%E6%B2%92%E9%97%9C%E4%BF%82-postman%E5%B9%AB%E4%BD%A0%E6%8A%8Arequest%E8%BD%89%E6%88%90code%E5%BF%85%E5%AD%B8/</guid><description>&lt;p&gt;下圖為postman發送後，有順利request後並且取得資料&lt;br&gt;
&lt;img decoding="async" src="https://hackmd.io/_uploads/SyaDkzGBn.png" alt="" /&gt; &lt;figure class="wp-block-image size-large"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="1024" height="307" src="https://quietbo.com/uploads/2023/11/image-1-1024x307.png" alt="" class="wp-image-1008" srcset="https://quietbo.com/uploads/2023/11/image-1-1024x307.png 1024w, https://quietbo.com/uploads/2023/11/image-1-300x90.png 300w, https://quietbo.com/uploads/2023/11/image-1-768x230.png 768w, https://quietbo.com/uploads/2023/11/image-1-1536x460.png 1536w, https://quietbo.com/uploads/2023/11/image-1-2048x613.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再最右方找到 &lt;code&gt;&amp;lt;/&amp;gt;&lt;/code&gt;這個icon，點擊後可以看到預設是cURL。&lt;br&gt;
點擊後選取自己要轉換的語言即可&lt;br&gt;
&lt;img decoding="async" src="https://hackmd.io/_uploads/SkrJ4tdNp.png" alt="" /&gt;&lt;img decoding="async" src="https://hackmd.io/_uploads/SyaDkzGBn.png" alt="" /&gt;&lt;img decoding="async" src="https://hackmd.io/_uploads/SyaDkzGBn.png" alt="" /&gt; &lt;figure class="wp-block-image size-large"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="325" height="1024" src="https://quietbo.com/uploads/2023/11/image-325x1024.png" alt="" class="wp-image-1007" srcset="https://quietbo.com/uploads/2023/11/image-325x1024.png 325w, https://quietbo.com/uploads/2023/11/image-95x300.png 95w, https://quietbo.com/uploads/2023/11/image-488x1536.png 488w, https://quietbo.com/uploads/2023/11/image.png 540w" sizes="auto, (max-width: 325px) 100vw, 325px" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;舉例成python就轉會轉成python request的code&lt;br&gt;
&lt;img decoding="async" src="https://hackmd.io/_uploads/ByadkGfHh.png" alt="" /&gt; &lt;figure class="wp-block-image size-large is-style-default"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="1024" height="872" src="https://quietbo.com/uploads/2023/11/image-2-1024x872.png" alt="" class="wp-image-1009" srcset="https://quietbo.com/uploads/2023/11/image-2-1024x872.png 1024w, https://quietbo.com/uploads/2023/11/image-2-300x256.png 300w, https://quietbo.com/uploads/2023/11/image-2-768x654.png 768w, https://quietbo.com/uploads/2023/11/image-2.png 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;(我自己比較常使用到的是cURL)&lt;/p&gt;</description></item><item><title>[Python] grequest 出現 Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Please monkey-patch earlier(已解決)</title><link>https://quietbo.com/2023/05/02/python-grequest-%E5%87%BA%E7%8F%BE-monkey-patching-ssl-after-ssl-has-already-been-imported-may-lead-to-errors-including-recursionerror-on-python-3-6-it-may-also-silently-lead-to-incorrect-behaviou/</link><pubDate>Tue, 02 May 2023 14:56:10 +0000</pubDate><guid>https://quietbo.com/2023/05/02/python-grequest-%E5%87%BA%E7%8F%BE-monkey-patching-ssl-after-ssl-has-already-been-imported-may-lead-to-errors-including-recursionerror-on-python-3-6-it-may-also-silently-lead-to-incorrect-behaviou/</guid><description>&lt;p&gt;剛開始使用grequest就遇到這個Error，用這段訊息去找也沒有解決方式，一開始google到的都是要加下方這段，但仍然沒有解決根本的問題!&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import gevent
from gevent import monkey
monkey.patch_all(select=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但我使用下方code，開啟一個新的py檔案就正常運行&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import grequests

req_list = [ # 请求列表
 grequests.get('http://httpbin.org/get?a=1&amp;b=2'),
 grequests.post('http://httpbin.org/post', data={'a':1,'b':2}),
 grequests.put('http://httpbin.org/post', json={'a': 1, 'b': 2}),
]

res_list = grequests.map(req_list) # 并行发送，等最后一个运行完后返回
print(res_list[0].text) # 打印第一个请求的响应文本&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看一下&lt;a class="link" href="https://github.com/spyoungtech/grequests" target="_blank" rel="noopener"
 &gt;grequests的GitHub&lt;/a&gt;&lt;br&gt;
最下面方有個最好的寫法&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/TSt5RhX.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;後來發現原本py檔有from其他py檔是有使用request的，把request前面import grequests就成功解決這個問題&lt;/p&gt;</description></item><item><title>[Mongodb] 資料內為什麼有$numberLong?(已解決)</title><link>https://quietbo.com/2023/03/11/mongodb-%E8%B3%87%E6%96%99%E5%85%A7%E7%82%BA%E4%BB%80%E9%BA%BC%E6%9C%89numberlong%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Fri, 10 Mar 2023 16:56:40 +0000</pubDate><guid>https://quietbo.com/2023/03/11/mongodb-%E8%B3%87%E6%96%99%E5%85%A7%E7%82%BA%E4%BB%80%E9%BA%BC%E6%9C%89numberlong%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;這件事情是不小心自己做了一個坑給自己踩的，&lt;br&gt;
我從公司的QAT測試環境的GUI(Mongodb compass)複製了一份data，內容複製出來如下:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2580913&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UserName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;A123456789&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;age&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;height&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;birthday&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;$numberLong&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;789798540000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;registration_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;$numberLong&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1677211157126&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然後在我自己本機用Studio 3T直接insert了這些相同格式的資料，都正常匯入了！ 後來我在local開發的時候find用了下方的方式來搜尋(注意!其實這是錯的，這裡的$numberLong是被當作層級使用)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{&amp;#34;birthday.$numberLong&amp;#34;: {&amp;#34;$gte&amp;#34;: &amp;#34;789798540000&amp;#34;}}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;此時local能正常取出資料，我還沒意識到問題。 後來部署到QAT後頻繁出錯，一去了解才發現，原來當時從Mongodb compass複製出來的$numberLong該資料的type， 原始資料為:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2580913068820&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UserName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;A123456789&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;age&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;weight&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;height&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;birthday&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;789798540000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;registration_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1677211157126&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我後來去QAT機器測了一下這段，(如果birthday的type是int)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;db.user.find ({birthday:{$ type : &amp;#34;int&amp;#34; }})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果沒有資料。我把int換成了long：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;db.user.find ({birthday:{$ type : &amp;#34;long&amp;#34; }})
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;就出現一堆資料了。 其實我一開始在把QAT的測試資料存進local這裡就出錯了！ 原因是Mongodb compass在複製資料時為了區分int和long這兩個不同的type，所以加了$numberLong 這段讓我們肉眼能夠判斷資料的type，後來我把$numberLong都拿掉後，公司QAT就正常可以取得資料了。&lt;/p&gt;</description></item><item><title>[Mac|M1] Sequel Pro 閃退(解決)</title><link>https://quietbo.com/2023/02/17/macm1-sequel-pro-%E9%96%83%E9%80%80%E8%A7%A3%E6%B1%BA/</link><pubDate>Fri, 17 Feb 2023 07:00:53 +0000</pubDate><guid>https://quietbo.com/2023/02/17/macm1-sequel-pro-%E9%96%83%E9%80%80%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;如果MySQL的版本是8.0以上，别下Sequel Pro，每次用每次閃退，直接在AppleStore下載：&lt;br&gt;
Sequel-Ace/Sequel-Ace&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/kvndkVm.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;目前在Mac M1 Ventura 13.2使用都正常&lt;/p&gt;</description></item><item><title>[Mac|M1] 「Another Redis Desktop Manager.app」已損毀，無法打開</title><link>https://quietbo.com/2023/02/07/macm1-%E3%80%8Canother-redis-desktop-manager-app%E3%80%8D%E5%B7%B2%E6%90%8D%E6%AF%80%EF%BC%8C%E7%84%A1%E6%B3%95%E6%89%93%E9%96%8B/</link><pubDate>Tue, 07 Feb 2023 07:33:38 +0000</pubDate><guid>https://quietbo.com/2023/02/07/macm1-%E3%80%8Canother-redis-desktop-manager-app%E3%80%8D%E5%B7%B2%E6%90%8D%E6%AF%80%EF%BC%8C%E7%84%A1%E6%B3%95%E6%89%93%E9%96%8B/</guid><description>&lt;p&gt;執行下方指令安裝Another Redis Desktop&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;brew install --cask another-redis-desktop-manager
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打開Another Redis Desktop.app後會出現APP已損毀，無法打開的訊息， 解決方式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo spctl --master-disable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo xattr -rd com.apple.quarantine /Applications/Another&lt;span class="se"&gt;\ &lt;/span&gt;Redis&lt;span class="se"&gt;\ &lt;/span&gt;Desktop&lt;span class="se"&gt;\ &lt;/span&gt;Manager.app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo spctl --master-enable
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;spctl --status.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;assessments enabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重新打開APP後即成功 來源:[m1打不开，提示 “Another Redis Desktop Manager.app”已损坏，无法打开 #782][1] [1]: &lt;a class="link" href="https://github.com/qishibo/AnotherRedisDesktopManager/issues/782" target="_blank" rel="noopener"
 &gt;https://github.com/qishibo/AnotherRedisDesktopManager/issues/782&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Postman] Mock Servers(含圖和Json)</title><link>https://quietbo.com/2023/01/19/postman-mock-servers%E5%90%AB%E5%9C%96%E5%92%8Cjson/</link><pubDate>Thu, 19 Jan 2023 09:32:19 +0000</pubDate><guid>https://quietbo.com/2023/01/19/postman-mock-servers%E5%90%AB%E5%9C%96%E5%92%8Cjson/</guid><description>&lt;p&gt;為何需要使用到Mock?&lt;br&gt;
可參考這篇&lt;a class="link" href="https://ithelp.ithome.com.tw/articles/10267680" target="_blank" rel="noopener"
 &gt;[面試][後端]在正式 API 完成前，如何讓要串接的工程師不要空等？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不只是前端可能會遇到要等後端API完成，有時候後端要與其他Server對接API拿資料時，也會使用到。&lt;br&gt;
當不只是一個部門再開發時，可能需要與其他部門合作，等待對接API資料時，也能有效提高開發速度，避免在那等來等去的。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2023/01/19/postman-mock-servers%e5%90%ab%e5%9c%96%e5%92%8cjson/#%E5%BB%BA%E7%AB%8B_Mock_Server" &gt;建立 Mock Server&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2023/01/19/postman-mock-servers%e5%90%ab%e5%9c%96%e5%92%8cjson/#%E8%A8%AD%E8%A8%88_Mock_Server_Response" &gt;設計 Mock Server Response&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2023/01/19/postman-mock-servers%e5%90%ab%e5%9c%96%e5%92%8cjson/#response_%E7%B5%A6%E9%9A%A8%E6%A9%9F%E8%B3%87%E6%96%99" &gt;response 給隨機資料&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2023/01/19/postman-mock-servers%e5%90%ab%e5%9c%96%e5%92%8cjson/#%E4%BE%9D%E7%8B%80%E6%B3%81%E8%BF%94%E5%9B%9E%E4%B8%8D%E5%90%8C%E7%9A%84Response" &gt;依狀況返回不同的Response&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2023/01/19/postman-mock-servers%e5%90%ab%e5%9c%96%e5%92%8cjson/#%E6%88%90%E5%8A%9F%E5%A4%B1%E6%95%97%E7%9A%84%E8%BF%94%E5%9B%9E%E6%96%B9%E5%BC%8F" &gt;成功/失敗的返回方式&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="建立-mock-server"&gt;&lt;span class="ez-toc-section" id="%E5%BB%BA%E7%AB%8B_Mock_Server"&gt;&lt;/span&gt;建立 Mock Server&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt; &lt;figure class="wp-block-image"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/tlZXWGc.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/DtEhwsl.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;建議勾選儲存 mock server URL 到環境變數的選項。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HYsA4d3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;創建成功左方會新增一個Mock及mock server URL&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Lw4845M.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點擊左方的Environments會有剛才建立的Mock Server Name，會自動將mock server URL帶入到url內，&lt;br&gt;
後續只要打{{url}}就會取得資訊。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/K34Mzma.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="設計-mock-server-response"&gt;&lt;span class="ez-toc-section" id="%E8%A8%AD%E8%A8%88_Mock_Server_Response"&gt;&lt;/span&gt;設計 Mock Server Response&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 到Collections的分頁
 &lt;/li&gt;
 &lt;li&gt;
 找到剛剛初始化的 Request，{{url}}會自動帶入
 &lt;/li&gt;
 &lt;li&gt;
 環境變數右上角請選擇剛剛建立的「User」
 &lt;/li&gt;
 &lt;li&gt;
 按下Send後
 &lt;/li&gt;
 &lt;li&gt;
 下面的Response一片空白是正常的，因為還沒設定 Mock Server Response
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/w1RrUNa.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;左側 Request 下面有一個「Default」，它就是用來自訂Response example，&lt;br&gt;
最下方改為Json輸入完後儲存:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "id":1,
 "user": "bocky"
}&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/56BeBvI.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;回到Request，按下Send後，Response會跟剛剛填寫Json相同:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/7ba9mw3.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="response-給隨機資料"&gt;&lt;span class="ez-toc-section" id="response_%E7%B5%A6%E9%9A%A8%E6%A9%9F%E8%B3%87%E6%96%99"&gt;&lt;/span&gt;response 給隨機資料&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Postman 本身就有提供給隨機資料的參數，主要在 example response 那邊把固定值改填參數就行，在 &lt;a class="link" href="https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/mocking-with-examples/" target="_blank" rel="noopener"
 &gt;文件&lt;/a&gt; 中給的範例是這樣：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "name": "{{$randomFullName}}",
 "userName": "{{$randomUserName}}",
 "location": "{{$randomCity}}",
 "company": "{{$randomCompanyName}}",
 "jobTitle": "{{$randomJobTitle}}",
 "updatedAt": "{{$timestamp}}"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;收到的 response 就會像這樣：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3Y6wP1r.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "name": "Mrs. Dana Berge",
 "userName": "Natalie.Moen85",
 "location": "South Orlando",
 "company": "Bergstrom, Schultz and O'Conner",
 "jobTitle": "Forward Data Manager",
 "updatedAt": "1674070363"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Postman 有的隨機參數官方都整理在這：&lt;a class="link" href="https://learning.postman.com/docs/writing-scripts/script-references/variables-list/" target="_blank" rel="noopener"
 &gt;Dynamic variables&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="依狀況返回不同的response"&gt;&lt;span class="ez-toc-section" id="%E4%BE%9D%E7%8B%80%E6%B3%81%E8%BF%94%E5%9B%9E%E4%B8%8D%E5%90%8C%E7%9A%84Response"&gt;&lt;/span&gt;依狀況返回不同的Response&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;通常在不同狀況會有不同的Response，例如成功或失敗。&lt;/p&gt;
&lt;h3 id="成功失敗的返回方式"&gt;&lt;span class="ez-toc-section" id="%E6%88%90%E5%8A%9F%E5%A4%B1%E6%95%97%E7%9A%84%E8%BF%94%E5%9B%9E%E6%96%B9%E5%BC%8F"&gt;&lt;/span&gt;成功/失敗的返回方式&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;再新增一個Explore為失敗的UserNume(success)。&lt;br&gt;
當data為success時，返回:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "status": "success",
 "msg": "成功",
 "data": {
 "name": "{{$randomFullName}}",
 "userName": "{{$randomUserName}}",
 "location": "{{$randomCity}}",
 "company": "{{$randomCompanyName}}",
 "jobTitle": "{{$randomJobTitle}}",
 "updatedAt": "{{$timestamp}}"
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/173Jsgi.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再新增一個Explore為失敗的UserNume(Error)。&lt;br&gt;
當data為error時的Response為&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "status": "error",
 "msg": "失敗",
 "data": {}
}&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/gXVklT2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;測試成功Response:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/DqSzD5e.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;測試失敗的Response:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/VsbOQJm.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Ubuntu] Ubuntu22網卡遺失</title><link>https://quietbo.com/2023/01/10/ubuntu-ubuntu22%E7%B6%B2%E5%8D%A1%E9%81%BA%E5%A4%B1/</link><pubDate>Tue, 10 Jan 2023 04:47:46 +0000</pubDate><guid>https://quietbo.com/2023/01/10/ubuntu-ubuntu22%E7%B6%B2%E5%8D%A1%E9%81%BA%E5%A4%B1/</guid><description>&lt;p&gt;某天工作發現右上角網路的標誌整個不見…&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 先確認網卡是否正常
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$sudo lshw -c network&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若有出現logical name: ens33代表正常&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/DkZQcZl.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 執行下方指令
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo gedit /etc/NetworkManager/NetworkManager.conf &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把managed=false改為managed=true再儲存。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/SKDCFmk.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;執行下方指令後，右上角就會出現網路&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo service NetworkManager start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Q52Rcli.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Python] 與MongoDB連接(並使用GUI:Studio 3T)</title><link>https://quietbo.com/2023/01/09/python-%E8%88%87mongodb%E9%80%A3%E6%8E%A5%E4%B8%A6%E4%BD%BF%E7%94%A8guistudio-3t/</link><pubDate>Mon, 09 Jan 2023 15:13:00 +0000</pubDate><guid>https://quietbo.com/2023/01/09/python-%E8%88%87mongodb%E9%80%A3%E6%8E%A5%E4%B8%A6%E4%BD%BF%E7%94%A8guistudio-3t/</guid><description>&lt;p&gt;本篇使用虛擬機VMware安裝ubuntu20.04，並安裝docker。&lt;br&gt;
Windows使用GUI &lt;a class="link" href="https://studio3t.com/" target="_blank" rel="noopener"
 &gt;Studio 3T&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;請自行先安裝VMware、ubuntu、docker及Studio 3T。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2023/01/09/python-%e8%88%87mongodb%e9%80%a3%e6%8e%a5%e4%b8%a6%e4%bd%bf%e7%94%a8guistudio-3t/#ubuntu%E5%AE%89%E8%A3%9Ddocker_mongodb" &gt;ubuntu安裝docker mongodb&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2023/01/09/python-%e8%88%87mongodb%e9%80%a3%e6%8e%a5%e4%b8%a6%e4%bd%bf%e7%94%a8guistudio-3t/#%E6%9F%A5%E8%A9%A2%E8%A9%B2ubuntu%E7%9A%84IP%E4%BD%8D%E5%9D%80" &gt;查詢該ubuntu的IP位址&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2023/01/09/python-%e8%88%87mongodb%e9%80%a3%e6%8e%a5%e4%b8%a6%e4%bd%bf%e7%94%a8guistudio-3t/#Windows%E5%AE%89%E8%A3%9DStudio_3T" &gt;Windows安裝Studio 3T&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2023/01/09/python-%e8%88%87mongodb%e9%80%a3%e6%8e%a5%e4%b8%a6%e4%bd%bf%e7%94%a8guistudio-3t/#%E5%A6%82%E4%BD%95%E9%80%B2%E5%85%A5docker%E5%85%A7%E7%9A%84mongodb" &gt;如何進入docker內的mongodb?&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="ubuntu安裝docker-mongodb"&gt;&lt;span class="ez-toc-section" id="ubuntu%E5%AE%89%E8%A3%9Ddocker_mongodb"&gt;&lt;/span&gt;ubuntu安裝docker mongodb&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;下載image&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker pull mongo:latest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動容器&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker run --name mongo -v /d/tmp/mongo/data:/data/db -d -p 27017:27017 mongo:latest&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &amp;#8211;name 指定建起來的container名字
 &lt;/li&gt;
 &lt;li&gt;
 -v 連結local端目錄與container目錄 (像Linux中mount共用空間的概念)
 &lt;/li&gt;
 &lt;li&gt;
 -d 背景執行
 &lt;/li&gt;
 &lt;li&gt;
 -p 指定將docker內的27017 port 與本地端(ubuntu)的27017 port連結在一起，這樣就可以透過本地直接連container了
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若ubuntu重新啟動發現容器沒有up是正常的，只要在重新使用start就可以起來了，&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker ps -a
docker start {CONTAINER_ID}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:docker start 242c45f0ab65&lt;br&gt;
up正常為下圖:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/2loo39c.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="查詢該ubuntu的ip位址"&gt;&lt;span class="ez-toc-section" id="%E6%9F%A5%E8%A9%A2%E8%A9%B2ubuntu%E7%9A%84IP%E4%BD%8D%E5%9D%80"&gt;&lt;/span&gt;查詢該ubuntu的IP位址&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;右上角網路資訊點進去到這頁面會看到ubnutu的ip&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/mtAd6ZL.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="windows安裝studio-3t"&gt;&lt;span class="ez-toc-section" id="Windows%E5%AE%89%E8%A3%9DStudio_3T"&gt;&lt;/span&gt;Windows安裝Studio 3T&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;GUI &lt;a class="link" href="https://studio3t.com/" target="_blank" rel="noopener"
 &gt;Studio 3T&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;設置與ubuntu內的mongodb&lt;/p&gt;
&lt;p&gt;點Connect建立New Connect。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Uz82ZC5.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/xSPR4yk.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;成功會出現下圖&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oAkMC9W.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="如何進入docker內的mongodb"&gt;&lt;span class="ez-toc-section" id="%E5%A6%82%E4%BD%95%E9%80%B2%E5%85%A5docker%E5%85%A7%E7%9A%84mongodb"&gt;&lt;/span&gt;如何進入docker內的mongodb?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 進入容器，指令:docker exec -it 容器ID bash
 &lt;/li&gt;
 &lt;li&gt;
 進入容器後輸入:mongosh
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下圖為成功進入docker內的mongodb&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/JKKB3re.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;補充&lt;br&gt;
如果沒連上可能是ubuntu 27017的port沒有分享出來。&lt;/p&gt;</description></item><item><title>[Golang] aes各种加密方式（CBC/ECB/CFB）含Code</title><link>https://quietbo.com/2022/12/27/golang-aes%E5%90%84%E7%A7%8D%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F%EF%BC%88cbc-ecb-cfb%EF%BC%89%E5%90%ABcode/</link><pubDate>Tue, 27 Dec 2022 10:12:09 +0000</pubDate><guid>https://quietbo.com/2022/12/27/golang-aes%E5%90%84%E7%A7%8D%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F%EF%BC%88cbc-ecb-cfb%EF%BC%89%E5%90%ABcode/</guid><description>&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Code
 &lt;/li&gt;
 &lt;li&gt;
 輸出結果
 &lt;/li&gt;
 &lt;li&gt;
 線上驗證(網站)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "bytes"
 "crypto/aes"
 "crypto/cipher"
 "crypto/rand"
 "encoding/base64"
 "encoding/hex"
 "io"
 "log"
)

func main() {
 origData := []byte("Hello World") // 待加密數據(明文)
 key := []byte("ABCDEFGHIJKLMNOP") // 密鑰，長度必為16
 log.Println("原文：", string(origData))

 log.Println("------------------ CBC模式 --------------------")
 encrypted := AesEncryptCBC(origData, key)
 log.Println("密文(hex)：", hex.EncodeToString(encrypted))
 log.Println("密文(base64)：", base64.StdEncoding.EncodeToString(encrypted))
 decrypted := AesDecryptCBC(encrypted, key)
 log.Println("解密结果：", string(decrypted))

 log.Println("------------------ ECB模式 --------------------")
 encrypted = AesEncryptECB(origData, key)
 log.Println("密文(hex)：", hex.EncodeToString(encrypted))
 log.Println("密文(base64)：", base64.StdEncoding.EncodeToString(encrypted))
 decrypted = AesDecryptECB(encrypted, key)
 log.Println("解密结果：", string(decrypted))

 log.Println("------------------ CFB模式 --------------------")
 encrypted = AesEncryptCFB(origData, key)
 log.Println("密文(hex)：", hex.EncodeToString(encrypted))
 log.Println("密文(base64)：", base64.StdEncoding.EncodeToString(encrypted))
 decrypted = AesDecryptCFB(encrypted, key)
 log.Println("解密结果：", string(decrypted))
}

// =================== CBC ======================
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte) {
 // 分组秘钥
 // NewCipher该函数限制了输入k的长度必须为16, 24或者32
 block, _ := aes.NewCipher(key)
 blockSize := block.BlockSize() // 获取秘钥块的长度
 origData = pkcs5Padding(origData, blockSize) // 补全码
 blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) // 加密模式
 encrypted = make([]byte, len(origData)) // 创建数组
 blockMode.CryptBlocks(encrypted, origData) // 加密
 return encrypted
}
func AesDecryptCBC(encrypted []byte, key []byte) (decrypted []byte) {
 block, _ := aes.NewCipher(key) // 分组秘钥
 blockSize := block.BlockSize() // 获取秘钥块的长度
 blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) // 加密模式
 decrypted = make([]byte, len(encrypted)) // 创建数组
 blockMode.CryptBlocks(decrypted, encrypted) // 解密
 decrypted = pkcs5UnPadding(decrypted) // 去除补全码
 return decrypted
}
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
 padding := blockSize - len(ciphertext)%blockSize
 padtext := bytes.Repeat([]byte{byte(padding)}, padding)
 return append(ciphertext, padtext...)
}
func pkcs5UnPadding(origData []byte) []byte {
 length := len(origData)
 unpadding := int(origData[length-1])
 return origData[:(length - unpadding)]
}

// =================== ECB ======================
func AesEncryptECB(origData []byte, key []byte) (encrypted []byte) {
 cipher, _ := aes.NewCipher(generateKey(key))
 length := (len(origData) + aes.BlockSize) / aes.BlockSize
 plain := make([]byte, length*aes.BlockSize)
 copy(plain, origData)
 pad := byte(len(plain) - len(origData))
 for i := len(origData); i &amp;lt; len(plain); i++ {
 plain[i] = pad
 }
 encrypted = make([]byte, len(plain))
 // 分组分块加密
 for bs, be := 0, cipher.BlockSize(); bs &amp;lt;= len(origData); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
 cipher.Encrypt(encrypted[bs:be], plain[bs:be])
 }

 return encrypted
}
func AesDecryptECB(encrypted []byte, key []byte) (decrypted []byte) {
 cipher, _ := aes.NewCipher(generateKey(key))
 decrypted = make([]byte, len(encrypted))
 //
 for bs, be := 0, cipher.BlockSize(); bs &amp;lt; len(encrypted); bs, be = bs+cipher.BlockSize(), be+cipher.BlockSize() {
 cipher.Decrypt(decrypted[bs:be], encrypted[bs:be])
 }

 trim := 0
 if len(decrypted) &amp;gt; 0 {
 trim = len(decrypted) - int(decrypted[len(decrypted)-1])
 }

 return decrypted[:trim]
}
func generateKey(key []byte) (genKey []byte) {
 genKey = make([]byte, 16)
 copy(genKey, key)
 for i := 16; i &amp;lt; len(key); {
 for j := 0; j &amp;lt; 16 &amp;&amp; i &amp;lt; len(key); j, i = j+1, i+1 {
 genKey[j] ^= key[i]
 }
 }
 return genKey
}

// =================== CFB ======================
func AesEncryptCFB(origData []byte, key []byte) (encrypted []byte) {
 block, err := aes.NewCipher(key)
 if err != nil {
 panic(err)
 }
 encrypted = make([]byte, aes.BlockSize+len(origData))
 iv := encrypted[:aes.BlockSize]
 if _, err := io.ReadFull(rand.Reader, iv); err != nil {
 panic(err)
 }
 stream := cipher.NewCFBEncrypter(block, iv)
 stream.XORKeyStream(encrypted[aes.BlockSize:], origData)
 return encrypted
}
func AesDecryptCFB(encrypted []byte, key []byte) (decrypted []byte) {
 block, _ := aes.NewCipher(key)
 if len(encrypted) &amp;lt; aes.BlockSize {
 panic("ciphertext too short")
 }
 iv := encrypted[:aes.BlockSize]
 encrypted = encrypted[aes.BlockSize:]

 stream := cipher.NewCFBDecrypter(block, iv)
 stream.XORKeyStream(encrypted, encrypted)
 return encrypted
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行結果&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;2022/12/27 18:03:51 原文： {"http_method": "POST", "http_service": "openapi", "http_uri": "/app/openapi/loginweb", "uri_params": {}, "body": {"app_id": "bens", "app_userid": "101a"}}
2022/12/27 18:03:51 ------------------ CBC模式 --------------------
2022/12/27 18:03:51 密文(hex)： 15cc9814d9c06fd3816ba2a4f842f6124a9dfd653c6ceb427377484541e680fe7c040613389f2233f0c505968d4c791cd29ef6c2c189e4f8b60543459bf31c2bebb3b3cb2e6341ffa0d0c44f3c29e04f7f5bd367472a5a1d9c78014b44e2584cf058f2abbc31913d46acc451d3459e13e021b4cf9df0bb5eb5d9982cca8a4897f99f18b9e3c4c355584888ebd1270a3368e908b2c15c1ba4095aa07d6cd59038
2022/12/27 18:03:51 密文(base64)： FcyYFNnAb9OBa6Kk+EL2Ekqd/WU8bOtCc3dIRUHmgP58BAYTOJ8iM/DFBZaNTHkc0p72wsGJ5Pi2BUNFm/McK+uzs8suY0H/oNDETzwp4E9/W9NnRypaHZx4AUtE4lhM8Fjyq7wxkT1GrMRR00WeE+AhtM+d8LtetdmYLMqKSJf5nxi548TDVVhIiOvRJwozaOkIssFcG6QJWqB9bNWQOA==
2022/12/27 18:03:51 解密结果： {"http_method": "POST", "http_service": "openapi", "http_uri": "/app/openapi/loginweb", "uri_params": {}, "body": {"app_id": "bens", "app_userid": "101a"}}
2022/12/27 18:03:51 ------------------ ECB模式 --------------------
2022/12/27 18:03:51 密文(hex)： 860ca9b68b3684b287af3375bad0c97377acef832b6693c2d97c74c2c563f2c498b645673d4724d3c5a41e3fde6741b5d176c17b1c94b36283b7f9c6f860c487ea7b03124c2418bb73607fe684bf93c2f6890d0e195b3316140f6595c02403b47b15f4c0a58ad794ad6f98a626a0e0df4bc3fc72249ed196c663a9b06545ba71d25ee921fbf01f8e924e110f6aabea60d256a104e57174ff3fd725a6aeb57638
2022/12/27 18:03:51 密文(base64)： hgyptos2hLKHrzN1utDJc3es74MrZpPC2Xx0wsVj8sSYtkVnPUck08WkHj/eZ0G10XbBexyUs2KDt/nG+GDEh+p7AxJMJBi7c2B/5oS/k8L2iQ0OGVszFhQPZZXAJAO0exX0wKWK15Stb5imJqDg30vD/HIkntGWxmOpsGVFunHSXukh+/AfjpJOEQ9qq+pg0lahBOVxdP8/1yWmrrV2OA==
2022/12/27 18:03:51 解密结果： {"http_method": "POST", "http_service": "openapi", "http_uri": "/app/openapi/loginweb", "uri_params": {}, "body": {"app_id": "bens", "app_userid": "101a"}}
2022/12/27 18:03:51 ------------------ CFB模式 --------------------
2022/12/27 18:03:51 密文(hex)： b326c923ef88752f4f604b41722fd1b3a0dced22a81b206237ff3055d5ebebca0456b6bdcaae9816e29247822ec42dbdaea560fe5d5643f40f0f4a55d5528f97c5bd59e55b0881345bf60f17a2da37c0d7d63dea5da337491314155480c045d448cf66089a506ade54b0e0ac34fc0136de3230432c1a8e159a1b150802147f225d9f8aebb7b67e45959c2b018240f5d121b7d619686630e152d83ab20a7847cf81811bc0183d574acb496a
2022/12/27 18:03:51 密文(base64)： sybJI++IdS9PYEtBci/Rs6Dc7SKoGyBiN/8wVdXr68oEVra9yq6YFuKSR4IuxC29rqVg/l1WQ/QPD0pV1VKPl8W9WeVbCIE0W/YPF6LaN8DX1j3qXaM3SRMUFVSAwEXUSM9mCJpQat5UsOCsNPwBNt4yMEMsGo4VmhsVCAIUfyJdn4rrt7Z+RZWcKwGCQPXRIbfWGWhmMOFS2DqyCnhHz4GBG8AYPVdKy0lq
2022/12/27 18:03:51 解密结果： {"http_method": "POST", "http_service": "openapi", "http_uri": "/app/openapi/loginweb", "uri_params": {}, "body": {"app_id": "bens", "app_userid": "101a"}}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;驗證網站:&lt;br&gt;
&lt;a class="link" href="https://totools.site/AES" target="_blank" rel="noopener"
 &gt;AES在線加密解密工具&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] 製作一個exe檔案在windows執行</title><link>https://quietbo.com/2022/12/11/python-%E8%A3%BD%E4%BD%9C%E4%B8%80%E5%80%8Bexe%E6%AA%94%E6%A1%88%E5%9C%A8windows%E5%9F%B7%E8%A1%8C/</link><pubDate>Sun, 11 Dec 2022 08:03:13 +0000</pubDate><guid>https://quietbo.com/2022/12/11/python-%E8%A3%BD%E4%BD%9C%E4%B8%80%E5%80%8Bexe%E6%AA%94%E6%A1%88%E5%9C%A8windows%E5%9F%B7%E8%A1%8C/</guid><description>&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Windows 11
 &lt;/li&gt;
 &lt;li&gt;
 IDE:PyCharm 2022.3 (Community Edition)
 &lt;/li&gt;
 &lt;li&gt;
 Python3.7
 &lt;/li&gt;
 &lt;li&gt;
 package:PyInstaller
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下為pycharm初始的Code，請先確認環境與package可install與執行指令。&lt;/p&gt;
&lt;p&gt;本篇程式碼檔案名為main.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
 # Use a breakpoint in the code line below to debug your script.
 print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
 print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pip install pyinstaller&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行下方指令&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pyinstaller -F .\{檔案名稱}.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pyinstaller -F .\main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行會出現一大串訊息，本篇只擷取部分畫面:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/RF0ZDaJ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;開啟資料夾查看&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/wclI2Ox.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;會建立以下&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 main.spec
 &lt;/li&gt;
 &lt;li&gt;
 build 資料夾 (log與工作檔案)
 &lt;/li&gt;
 &lt;li&gt;
 dist 資料夾(要執行的exe檔案在這裡面)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;打開dist會看到main.exe，點擊後會馬上出現命令提示字元後馬上又消失。&lt;br&gt;
如果想要暫停住的話可加入input()在Code內。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/rrvkrP2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再重新pyinstaller -F .\main.py一次，重新點擊main.exe即可停留在下方畫面。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/vmbVcrL.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Golang] Gin &amp; Goland &amp; go.mod 快速建立</title><link>https://quietbo.com/2022/10/26/golang-gin-goland-go-mod-%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B/</link><pubDate>Tue, 25 Oct 2022 17:49:24 +0000</pubDate><guid>https://quietbo.com/2022/10/26/golang-gin-goland-go-mod-%E5%BF%AB%E9%80%9F%E5%BB%BA%E7%AB%8B/</guid><description>&lt;p&gt;打開Goland後main.go檔內複製下方的Code:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "github.com/gin-gonic/gin"
)
func main() {
 app := gin.Default()
 app.GET("/hello/:name", func(c *gin.Context) {
 name := c.Param("name")
 c.JSON(200, gin.H{
 "message": "hello " + name,
 })
 })
 err := app.Run(":8080")
 if err != nil {
 panic(err)
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會看到很多紅字如下圖&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/CaqIcVr.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;打開Goland的file -&amp;gt; settings -&amp;gt; Go Modules -&amp;gt;&lt;br&gt;
將Enable Go modules integration打勾&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/CCEOu0Z.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;再Goland下方打開terminal，輸入&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$ go mod init [project_name]
$ go mod tidy&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/pn7NIKz.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;此時的go.mod會自動下載&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;module do_gowork

go 1.19

require github.com/gin-gonic/gin v1.8.1

require (
 github.com/gin-contrib/sse v0.1.0 // indirect
 github.com/go-playground/locales v0.14.0 // indirect
 github.com/go-playground/universal-translator v0.18.0 // indirect
 github.com/go-playground/validator/v10 v10.10.0 // indirect
 github.com/goccy/go-json v0.9.7 // indirect
 github.com/json-iterator/go v1.1.12 // indirect
 github.com/leodido/go-urn v1.2.1 // indirect
 github.com/mattn/go-isatty v0.0.14 // indirect
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
 github.com/modern-go/reflect2 v1.0.2 // indirect
 github.com/pelletier/go-toml/v2 v2.0.1 // indirect
 github.com/ugorji/go/codec v1.2.7 // indirect
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect
 golang.org/x/text v0.3.6 // indirect
 google.golang.org/protobuf v1.28.0 // indirect
 gopkg.in/yaml.v2 v2.4.0 // indirect
)&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/AE6i33f.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;注意，go mod tidy有移除「沒使用的依賴這功能」，實際上是需要使用來取得library。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;go get [library]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;空白處點選右鍵，Run ‘go build main.go’&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/fw3ni1J.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;執行成功可看到下面這些訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env: export GIN_MODE=release
 - using code: gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET /hello/:name --&amp;gt; main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開瀏覽器輸入:&lt;br&gt;
http://127.0.0.1:8080/hello/world&lt;/p&gt;
&lt;p&gt;{“message”:”hello world”}&lt;/p&gt;</description></item><item><title>[Golang] 創建BOT&amp;發送訊息</title><link>https://quietbo.com/2022/09/19/golang-%E5%89%B5%E5%BB%BAbot%E7%99%BC%E9%80%81%E8%A8%8A%E6%81%AF/</link><pubDate>Mon, 19 Sep 2022 10:00:42 +0000</pubDate><guid>https://quietbo.com/2022/09/19/golang-%E5%89%B5%E5%BB%BAbot%E7%99%BC%E9%80%81%E8%A8%8A%E6%81%AF/</guid><description>&lt;h2 id="創建bot加入好友並取得token"&gt;創建BOT，加入好友並取得token
&lt;/h2&gt;&lt;p&gt;打開Telegram搜尋:&lt;br&gt;
@BotFather&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/cZZDRgu.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;加入好友後，輸入/start 會提供些指令讓你選擇。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 /start :用戶開始和機器人進行交互
 &lt;/li&gt;
 &lt;li&gt;
 /help :返回幫助信息
 &lt;/li&gt;
 &lt;li&gt;
 /setting :返回機器人的設置界面用戶在首次向機器人發信息之前會看到/start按鈕，在菜單中（機器人信息頁）可以看到幫助和設置鏈接。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;創建BOT過程如下, 成功會返回一段訊息:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/2NosBTo.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;藍框: 用來加該機器人好友的，建議直接點擊加入，先成為好友。&lt;br&gt;
紅框: 該bot的token，主要用來操控BOT，要記住!!&lt;/p&gt;
&lt;h2 id="取得chat-id"&gt;取得chat id
&lt;/h2&gt;&lt;p&gt;需要chat id，bot才知道要傳送訊息給哪個使用者或群組。&lt;/p&gt;
&lt;p&gt;首先，加入Bot好友後，傳一個訊息給這支BOT，例如”testbot”，發送成功後打開瀏覽器輸入&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;https://api.telegram.org/bot{token}/getUpdates&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;br&gt;
&lt;a class="link" href="https://api.telegram.org/bot5630000628:AAH2XXXXXXXXXXXXXXXXXXXXXXXXXXXXn2zo/getUpdates" target="_blank" rel="noopener"
 &gt;https://api.telegram.org/bot5630000628:AAH2XXXXXXXXXXXXXXXXXXXXXXXXXXXXn2zo/getUpdates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;會看到json資料，從裡面我們可以得到chat_id，建議先利用這網站把Json轉成可讀性高一點&lt;br&gt;
&lt;a class="link" href="https://tw.piliapp.com/json/formatter" target="_blank" rel="noopener"
 &gt;JSON格式化&lt;/a&gt;&lt;br&gt;
轉成功後再貼在記事本，搜尋剛剛傳給bot的訊息:testbot&lt;br&gt;
會看到有一段，像下圖的訊息&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/NwJIyNx.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;取得那段數字就好。&lt;/p&gt;
&lt;h2 id="使用程式發送訊息"&gt;使用程式發送訊息
&lt;/h2&gt;&lt;p&gt;把chat id和token帶入下方的const內。&lt;/p&gt;
&lt;p&gt;並開啟終端機輸入:go get -u github.com/go-telegram-bot-api/telegram-bot-api&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
 tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
 "log"
)
var bot *tgbotapi.BotAPI

const (
 chatID = 1234567 //要傳送訊息給指定用戶
 youToken = "5630000628:AAH2XXXXXXXXXXXXXXXXXXXXXXXXXXXXn2zo"
)

func main() {
 var err error
 bot, err = tgbotapi.NewBotAPI(youToken)
 if err != nil {
 log.Fatal(err)
 }
 bot.Debug = false

 link := fmt.Sprintf(`&amp;lt;a href="%s"&amp;gt;[google]&amp;lt;/a&amp;gt;`, "https://www.google.com.tw/")
 sendMsg(link)
}

func sendMsg(msg string) {
 NewMsg := tgbotapi.NewMessage(chatID, msg)
 NewMsg.ParseMode = tgbotapi.ModeHTML //傳送html格式的訊息
 _, err := bot.Send(NewMsg)
 if err == nil {
 log.Printf("Send telegram message success")
 } else {
 log.Printf("Send telegram message error")
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用程式運行發送後就會收到 google 連結的的訊息了&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/auvOu34.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title/><link>https://quietbo.com/2022/09/12/golang-goroutine-channel/</link><pubDate>Mon, 12 Sep 2022 14:41:24 +0000</pubDate><guid>https://quietbo.com/2022/09/12/golang-goroutine-channel/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/09/12/golang-goroutine-channel/#Golang_goroutine_channel" &gt;[Golang] goroutine &amp; channel&lt;/a&gt;&lt;ul class='ez-toc-list-level-2' &gt;
 &lt;li class='ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/09/12/golang-goroutine-channel/#Channel" &gt;Channel&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/09/12/golang-goroutine-channel/#%E9%A1%9E%E5%9E%8B%E8%88%87%E5%89%B5%E5%BB%BA" &gt;類型與創建&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/09/12/golang-goroutine-channel/#%E7%99%BC%E9%80%81%E8%88%87%E6%8E%A5%E6%94%B6" &gt;發送與接收&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-5&amp;quot; href=&amp;quot;https://quietbo.com/2022/09/12/golang-goroutine-channel/#select&amp;quot; &amp;gt;select&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-6&amp;quot; href=&amp;quot;https://quietbo.com/2022/09/12/golang-goroutine-channel/#%E5%9F%BA%E6%9C%AC%E8%AA%9E%E6%B3%95&amp;quot; &amp;gt;基本語法&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h1 id="golang-goroutine--channel"&gt;&lt;span class="ez-toc-section" id="Golang_goroutine_channel"&gt;&lt;/span&gt;[Golang] goroutine &amp;amp; channel&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Go &lt;a href="https://www.runoob.com/go/go-concurrent.html"&gt;併發&amp;通道（channel）&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="channel"&gt;&lt;span class="ez-toc-section" id="Channel"&gt;&lt;/span&gt;Channel&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Channel 是 Go 語言中用於 goroutine 之間通信的管道，是 Go 並發編程模型的核心組件之一。&lt;br&gt;
基本概念&lt;br&gt;
Channel 提供了一種 goroutine 之間的通信機制，使一個 goroutine 可以向另一個 goroutine 發送數據，而無需顯式的鎖或條件變量。&lt;/p&gt;
&lt;h3 id="類型與創建"&gt;&lt;span class="ez-toc-section" id="%E9%A1%9E%E5%9E%8B%E8%88%87%E5%89%B5%E5%BB%BA"&gt;&lt;/span&gt;類型與創建&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;// 創建不同類型的 channel
ch1 := make(chan int) // 無緩衝的整數 channel
ch2 := make(chan string, 10) // 有 10 個緩衝區的字符串 channel
ch3 := make(chan interface{}) // 任意類型的 channel&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="發送與接收"&gt;&lt;span class="ez-toc-section" id="%E7%99%BC%E9%80%81%E8%88%87%E6%8E%A5%E6%94%B6"&gt;&lt;/span&gt;發送與接收&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;// 發送數據
ch &amp;lt;- value

// 接收數據
value := &amp;lt;-ch
value, ok := &amp;lt;-ch // ok 表示 channel 是否已關閉&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;goroutine + Channel 範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;package main
import "fmt"
import "time"
func main() {
 ch1 := make(chan int, 1)
 ch2 := make(chan string, 1)
 ch3 := make(chan interface{}, 1)

 ch1 &amp;lt;- 1 // ch1 緩衝區已滿

 // 創建 goroutine 來接收第一個值
 go func() {
 time.Sleep(2 * time.Second) // 等待1秒
 fmt.Println(&amp;lt;-ch1) // 1，此時釋放 ch1 的空間
 }()

 ch1 &amp;lt;- 3 // 這裡會阻塞，直到上面的 goroutine 從 ch1 接收數據
 // 由於上面的 goroutine 有2秒延遲，這里會等待約2秒

 ch2 &amp;lt;- "name"
 ch3 &amp;lt;- "hi"

 fmt.Println(&amp;lt;-ch1) // 3
 fmt.Println(&amp;lt;-ch2) // "name"
 fmt.Println(&amp;lt;-ch3) // "hi"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;1
3
name
hi&lt;/code&gt;&lt;/pre&gt;
&lt;ol start="2" class="wp-block-list"&gt;
 &lt;li&gt;
 範例&amp;說明
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;package main
import "fmt"

func main() {
 // 創建通道
 c := make(chan int)

 //併發執行
 go ifunc(c)
 for i := 1; i &amp;lt;= 10; i++{
 // 將數據i發送給通道
 c &amp;lt;- i
 }

 // 通道ifunc結束讀取數據
 c&amp;lt;- 100

 //等於ifunc結束
 fmt.Println(&amp;lt;-c)
}

func ifunc(c chan int) {

 // 阻塞等待數據
 for {
 //從通道獲取一個數據
 data := &amp;lt;- c

 // 當取得的數據為100則結束阻塞
 if data == 100{
 break
 }
 // 輸出數據
 fmt.Println(data)
 }
 // 通知main結束
 c&amp;lt;-0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;1
2
3
4
5
6
7
8
9
10
0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;補充:&lt;br&gt;
可以在&lt;br&gt;
fmt.Println(&amp;lt;-c)與fmt.Println(data)之前，print隨便一個數值，&lt;br&gt;
就可以看到，輸出模式取決於 Go 調度器如何在這兩個 goroutine 之間切換&lt;/p&gt;
&lt;h2 id="select"&gt;&lt;span class="ez-toc-section" id="select"&gt;&lt;/span&gt;select&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;select 是 Go 語言中的一個控制結構，專門用於處理多個通道操作。它的主要用途是同時等待多個通道的操作（發送或接收），並在其中一個操作可以進行時執行對應的代碼。&lt;/p&gt;
&lt;h3 id="基本語法"&gt;&lt;span class="ez-toc-section" id="%E5%9F%BA%E6%9C%AC%E8%AA%9E%E6%B3%95"&gt;&lt;/span&gt;基本語法&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;select {
case &amp;lt;-chan1:
 // 從 chan1 接收到數據時執行
case chan2 &amp;lt;- value:
 // 向 chan2 發送數據成功時執行
case x := &amp;lt;-chan3:
 // 從 chan3 接收到數據並賦值給 x 時執行
default:
 // 沒有通道操作就緒時執行（非阻塞模式）
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/go/go-select-statement.html" target="_blank" rel="noopener"
 &gt;select&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;package main

import (
 "fmt"
 "time"
)

func main() {
 // 創建兩個通道
 ch1 := make(chan string)
 ch2 := make(chan string)

 // 在一個 goroutine 中，1秒後發送數據到 ch1
 go func() {
 time.Sleep(1 * time.Second)
 ch1 &amp;lt;- "來自通道1的數據"
 }()
 go func() {
 time.Sleep(1 * time.Second)
 ch1 &amp;lt;- "來自通道1-1的數據"
 }()
 // 在另一個 goroutine 中，2秒後發送數據到 ch2
 go func() {
 time.Sleep(2 * time.Second)
 ch2 &amp;lt;- "來自通道2的數據"
 }()

 go func() {
 time.Sleep(2 * time.Second)
 ch2 &amp;lt;- "來自通道2-1的數據"
 }()

 // 使用 select 監聽兩個通道
 for i := 0; i &amp;lt; 4; i++ {
 select {
 case msg1 := &amp;lt;-ch1:
 fmt.Println("接收到:", msg1)
 case msg2 := &amp;lt;-ch2:
 fmt.Println("接收到:", msg2)
 case &amp;lt;-time.After(3 * time.Second):
 fmt.Println("操作超時")
 }
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;接收到: 來自通道1-1的數據
接收到: 來自通道1的數據
接收到: 來自通道2的數據
接收到: 來自通道2-1的數據&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] 接口interface</title><link>https://quietbo.com/2022/09/10/golang-%E6%8E%A5%E5%8F%A3interface/</link><pubDate>Sat, 10 Sep 2022 15:10:52 +0000</pubDate><guid>https://quietbo.com/2022/09/10/golang-%E6%8E%A5%E5%8F%A3interface/</guid><description>&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;type 類型名 struct{
 字段1 類型
 字段2 類型
}

定義接口
type interface_name interface{
 方法名 method_name1
 方法名 method_name2
 ....
}

定義結構體
type struct_name struct{

}


func(struct_name_var struct_name) method_name1() [返回類型]{
 //方法實現
}


func(struct_name_var struct_name) method_nam2() [返回類型]{
 //方法實現
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"


type Mobile interface {
 call()
 message()
}

type Iphone struct {
}

type Samsung struct{
}

func (iphone13 Iphone) call(){
 fmt.Println("iphone13, call phone number")
}

func (iphone13 Iphone) message(){
 fmt.Println("iphone13, use message")
}

func (s22 Samsung) call(){
 fmt.Println("samsung, call phone number")
}

func (s22 Samsung) message(){
 fmt.Println("samsung, use message")
}

func main() {
 var mobile Mobile
 mobile=new(Iphone)
 mobile.call()
 mobile.message()


 var mobile2 Mobile
 mobile2=new(Samsung)
 mobile2.call()
 mobile2.message()
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=" line-numbers"&gt;iphone13, call phone number
iphone13, use message
samsung, call phone number
samsung, use message&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="空接口類型"&gt;空接口類型
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)

func main() {
 var any interface{}
 any = 100
 fmt.Printf("value:%d type:%T \n", any, any)

 any = "aaa"
 fmt.Printf("value:%s type:%T \n", any, any)

 testFunc(100)
 testFunc("test")
}

func testFunc(par interface{}){
 fmt.Println(par)
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=" line-numbers"&gt;value:100 type:int 
value:aaa type:string 
100
test&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] 結構體struct &amp;方法接收器</title><link>https://quietbo.com/2022/09/07/golang-%E7%B5%90%E6%A7%8B%E9%AB%94/</link><pubDate>Tue, 06 Sep 2022 17:07:53 +0000</pubDate><guid>https://quietbo.com/2022/09/07/golang-%E7%B5%90%E6%A7%8B%E9%AB%94/</guid><description>&lt;h2 id="定義實例化"&gt;定義&amp;amp;實例化
&lt;/h2&gt;&lt;p&gt;定義方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;type 類別名 struct {
 名稱1 類型
 Age int
 Color Color //可定義別的結構體或自己
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;實例化方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;var instance T
instance := new(T)
instance *T
instance := &amp;T{}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

//結構體
type User struct {
 Name string
 Age int
 Color Color //可定義別的結構體或自己
}

type Color struct {
 R, G, B string
}

func main() {


 var user User
 user.Age = 20
 user.Name = "bocky"
 user.Color.R = "red"
 print(user.Color.R, user.Age) // red20

 user := new(User)
 user.Age = 25
 user.Name = "Abby"

 user1 := &amp;User{}
 user1.Name = "Car"
 user1.Age = 30


 //下方利用function來實例化
 user2 := NewUser("NAME1", 100)
 fmt.Println(user2.Name) //NAME1
 fmt.Println(user2.Age) //100
}

func NewUser(name string, age int) *User {
 return &amp;User{
 Name: name,
 Age: age,
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化成員變量&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

type Person struct {
 name string
 chile *Person
}

type User struct {
 Name string
 Sex int
 Email string
 Mobile string
}

func main() {

 Person := &amp;Person{name: "奶奶", chile: &amp;Person{name: "媽媽", chile: &amp;Person{name: "我"}}}

 fmt.Println(Person.chile.chile.name) // 我

 user1 := User{
 "Bocky",
 1,
 "a123456@gmail.com",
 "0123456789",
 }
 fmt.Println(user1) //{Bocky 1 shty@gmail.com 0123456789}

 //定義完後馬上初始化
 user2 := &amp;struct { //1.定義
 id int
 name string
 }{ //2.初始化
 22222333333,
 "Amy",
 }
 fmt.Println(user2) //&amp;{22222333333 Amy}
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="go中的方法與接收器-必學"&gt;Go中的方法與接收器 (必學)
&lt;/h2&gt;&lt;p&gt;將函數與結構體綁定&lt;br&gt;
格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;func (接收器變量 接收器類型) 函數名(參數列表) (返回参数){
 函數體
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"


type User struct {
 Name string
 Age int
}

func main() {
 user1 := &amp;User{
 Name: "AAAA",
 Age: 30,
 }
 fmt.Println("===有指標的類型===")
 user1.PprintName() //Name: Bocky
 user1.PprintAge() //Age: 30
 user1.PprintName() //Name: BBB

 fmt.Println("===沒有指標類型===")

 user2 := &amp;User{
 Name: "AAAA",
 Age: 30,
 }
 user2.printName() //Name: AAAA
 user2.printAge()
 //Name: BBB
 //Age: 30
 user2.printName() //Name: AAAA
}

// 由此function調用, 可使用指針來修改值
func (user *User) PprintName() {
 fmt.Println("Name:", user.Name)
}

func (user *User) PprintAge() { // 使用*User 指針類型是可改值的
 user.Name = "BBB" // 原本是AAAA改成BBB
 fmt.Println("Age:", user.Age)
}

// 非指針類型的接收器
func (user User) printName() {
 fmt.Println("Name:", user.Name)
}
func (user User) printAge() { // 使用*User 指針類型是可改值的
 user.Name = "BBB"
 fmt.Println("Name:", user.Name) // 原本是AAAA改成BBB, Name: BBB
 fmt.Println("Age:", user.Age) //Age: 30
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;印出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;===有指標的類型===
Name: AAAA
Age: 30
Name: BBB
===沒有指標類型===
Name: AAAA
Name: BBB
Age: 30
Name: AAAA&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] 函數, 匿名函數,閉包,可變參數,遞迴, 延遲執行</title><link>https://quietbo.com/2022/09/03/golang-%E5%87%BD%E6%95%B8-%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B8%E9%96%89%E5%8C%85%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8%E9%81%9E%E8%BF%B4-%E5%BB%B6%E9%81%B2%E5%9F%B7%E8%A1%8C/</link><pubDate>Fri, 02 Sep 2022 18:55:39 +0000</pubDate><guid>https://quietbo.com/2022/09/03/golang-%E5%87%BD%E6%95%B8-%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B8%E9%96%89%E5%8C%85%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8%E9%81%9E%E8%BF%B4-%E5%BB%B6%E9%81%B2%E5%9F%B7%E8%A1%8C/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E5%87%BD%E6%95%B8" &gt;函數&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B8" &gt;匿名函數&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E9%96%89%E5%8C%85" &gt;閉包&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8" &gt;可變參數&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E8%A8%88%E7%AE%97%E5%87%BD%E6%95%B8%E6%99%82%E9%96%93" &gt;計算函數時間&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#%E9%81%9E%E8%BF%B4" &gt;遞迴&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-7" href="https://quietbo.com/2022/09/03/golang-%e5%87%bd%e6%95%b8-%e5%8c%bf%e5%90%8d%e5%87%bd%e6%95%b8%e9%96%89%e5%8c%85%e5%8f%af%e8%ae%8a%e5%8f%83%e6%95%b8%e9%81%9e%e8%bf%b4-%e5%bb%b6%e9%81%b2%e5%9f%b7%e8%a1%8c/#defer_%E5%BB%B6%E9%81%B2%E5%9F%B7%E8%A1%8C" &gt;defer 延遲執行&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="函數"&gt;&lt;span class="ez-toc-section" id="%E5%87%BD%E6%95%B8"&gt;&lt;/span&gt;函數&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;輸入的參數可多個, 返回也可多個&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;func 函數名(參數)(返回值){
 函數體
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {

 fmt.Println(sum(2, 3)) //5
 x, y := getXYValue()
 fmt.Printf("x:%d y:%d", x, y) //x:1 y:2

 var f func() //指定function類型
 f = process //把process這個func指定給f
 f() // 調用f等於調用process
}

func sum(x, y int) int {
 return x + y
}

func getXYValue() (x, y int) {
 x = 1
 y = 2
 return x, y
}

func process() {
 fmt.Println("use process function")
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="匿名函數"&gt;&lt;span class="ez-toc-section" id="%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B8"&gt;&lt;/span&gt;匿名函數&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 //匿名函數

 f := func(name string) {
 fmt.Println("hello,", name)
 }
 f("bocky") //hello, bocky
 fmt.Println("===")

 iterator([]int{1, 2, 3, 4, 5, 6}, func(value int) { //函數沒有名稱
 fmt.Println(value)
 })
}

func iterator(arr []int, ff func(int)) { // 這裡的函數是有名稱ff
 for _, value := range arr {
 ff(value)
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="閉包"&gt;&lt;span class="ez-toc-section" id="%E9%96%89%E5%8C%85"&gt;&lt;/span&gt;閉包&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;閉包 = 函數+引用環境&lt;/p&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 //str := "Bocky" // IDE會出現str declared but not used
 f := func() {
 str := "Abby"
 fmt.Println(str) //Abby
 }
 f()

 // 閉包擁有記憶性
 fmt.Println("======")
 add1 := add(1)
 fmt.Println(add1()) //2
 fmt.Println(add1()) //3
 fmt.Printf("%p\n", &amp;add1) //0xc000006030

 fmt.Println("======")
 add2 := add(200)
 fmt.Println(add2()) //201
 fmt.Println(add2()) //202
 fmt.Printf("%p\n", &amp;add2) //0xc000006038

 fmt.Println("======")
 bocky := user("bocky")
 name, hp := bocky()
 fmt.Println(name, hp) //bocky 1000

 fmt.Println("======")
 amy := user("amy")
 name2, hp2 := amy()
 fmt.Println(name2, hp2) //amy 1000
}

func add(v1 int) func() int {
 return func() int {
 v1++
 return v1
 }
}

func user(name string) func() (string, int) {
 hp := 1000
 return func() (string, int) {
 return name, hp
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="可變參數"&gt;&lt;span class="ez-toc-section" id="%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8"&gt;&lt;/span&gt;可變參數&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;在實際開發中，總有一些函數的參數個數是在編碼過程中無法確定的，&lt;br&gt;
當有狀況是需要實現類似的接口時，就會用到”可變參數”了。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "bytes"
 "fmt"
)

func main() {
 //可變參數
 funx1(1)
 funx1(1, 2, 3, 5)

 funx2(11) //11 int
 funx2("1234") //1234 string
 funx2(1.23) //1.23 default
 funx2(func() () { return }) //0x96ca00 default

 fmt.Println("=======")
 fmt.Println(funx3("hello "))
 fmt.Println(funx3("hello ", "I'm ")) //hello I'm
 fmt.Println(funx3("hello ", "I'm ", "Bocky!")) //hello I'm Bocky!



 fmt.Println("=======")
 Tprint("A","B","C")
}

func funx1(args ...int) { //不確定會傳多少個int的時候可以使用...但一定要是int類型
 for _, arg := range args {
 fmt.Println(arg)
 }
}

func funx2(args ...interface{}) { //任一類型的可變參數
 for _, arg := range args {
 switch arg.(type) {
 case int:
 fmt.Println(arg, "int")
 case string:
 fmt.Println(arg, "string")
 case float32:
 fmt.Println(arg, "float32")
 default:
 fmt.Println(arg, "default")
 }
 }
}

func funx3(strs ...string) string {
 var b bytes.Buffer
 for _, s := range strs { // 依序遍歷strs內的string
 b.WriteString(s)
 }
 return b.String()
}

//下方Tprint會call funx4來執行print的動作
func Tprint(params ...interface{}) {
 funx4(params)
}
func funx4(params ...interface{}) {
 for _, value := range params {
 fmt.Println(value)
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="計算函數時間"&gt;&lt;span class="ez-toc-section" id="%E8%A8%88%E7%AE%97%E5%87%BD%E6%95%B8%E6%99%82%E9%96%93"&gt;&lt;/span&gt;計算函數時間&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;想要獲取計算某個任務從開始到結束的運行時間，我們可以使用time包中的Slice函數，用法:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;func Since (t Time) Duration&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;t是時間值。&lt;br&gt;
&lt;strong&gt;此方法是time.Now().Sub(t)的快捷方式&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
 "time"
)

func main() {
 //func Since(t Time)Duration
 //time.Now().sub(t
 testTime()
}

func testTime() {

 start := time.Now()
 sum := 0
 for i := 0; i &amp;lt; 1000000000; i++ {
 sum++
 }
 duration := time.Since(start)
 fmt.Println("function執行時間:", duration)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="遞迴"&gt;&lt;span class="ez-toc-section" id="%E9%81%9E%E8%BF%B4"&gt;&lt;/span&gt;遞迴&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;費波那契數列&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;1,1,2,3,5,8,13 ,...&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 //遞迴

 result := 0
 for i := 1; i &amp;lt;= 10; i++ {
 result = fibonacci(i)
 fmt.Printf("fibonacci(%2d) -&amp;gt; %3d\n", i, result)
 }
}

func fibonacci(n int) (rtn int) {
 if n &amp;lt;= 2 {
 rtn = 1
 } else {
 rtn = fibonacci(n-1) + fibonacci(n-2)
 }
 return
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="defer-延遲執行"&gt;&lt;span class="ez-toc-section" id="defer_%E5%BB%B6%E9%81%B2%E5%9F%B7%E8%A1%8C"&gt;&lt;/span&gt;defer 延遲執行&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 用於資源的釋放，會在函數返回之前進行調用，簡單來說就是宣告 function &amp;#8220;結束前&amp;#8221;的動作。
 &lt;/li&gt;
 &lt;li&gt;
 先進後出
 &lt;/li&gt;
 &lt;li&gt;
 會保留當下狀態
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡單的範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)


func main() {
 fmt.Println("defer start")
 defer fmt.Println(1)
 defer fmt.Println(2)
 defer fmt.Println(3)
 fmt.Println("defer stop")
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;defer start
defer stop
3
2
1&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)

func main() {
 num := 1
 x := addOne(num)

 fmt.Printf("Result is %d\n",x)
}


func closeProcess() {
 fmt.Println("close process")
}
func addOne(x int) int {
 fmt.Println("Start process")
 defer closeProcess() // function結束前返回
 if x &amp;gt; 2 {
 fmt.Println("x &amp;gt; 2")
 return x * 20
 } else {
 fmt.Println("x &amp;lt;=2")
 return x + 1
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Start process
x &amp;lt;=2
close process
Result is 2&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] List</title><link>https://quietbo.com/2022/09/01/golang-list/</link><pubDate>Thu, 01 Sep 2022 09:44:37 +0000</pubDate><guid>https://quietbo.com/2022/09/01/golang-list/</guid><description>&lt;p&gt;List由多個節點所組成的, 節點之間透過一些變數紀錄彼此的關係&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;a -&amp;gt; next -&amp;gt; b -&amp;gt; next -&amp;gt; c
a &amp;lt;- pre &amp;lt;- b &amp;lt;- pre &amp;lt;- c&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;宣告方式&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;name:=list.New()
//var name list.List&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 PushBack:插入元素直接放入結尾
 &lt;/li&gt;
 &lt;li&gt;
 PushFront:插入元素直接放入開頭
 &lt;/li&gt;
 &lt;li&gt;
 InsertBefore:被標記的元素前增加元素
 &lt;/li&gt;
 &lt;li&gt;
 InsertAfter:被標記的元素後增加元素
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "container/list"
 "fmt"
)

func main() {
 //List




 list1 := list.New()
 list1.PushBack("Back_1") //插入元素直接放入結尾
 list1.PushFront(111) //插入元素直接放入最前 111 Back_1
 list1.PushBack("Back_2") //插入元素直接放入結尾 111 Back_1 Back_2

 el := list1.PushBack("Back_3") // 111 Back_1 Back_2 Back_3
 //在Back_3的後方加入After
 list1.InsertAfter("After", el) // 111 Back_1 Back_2 Back_3 After
 // 在Back_3的前方加入Before
 list1.InsertBefore("Before", el) // 111 Back_1 Back_2 Before Back_3 After

 // 移除 Back_3
 //list1.Remove(el)
 for i := list1.Front(); i != nil; i = i.Next() {
 fmt.Println(i.Value)
 }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示結果&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=" line-numbers"&gt;111
Back_1
Back_2
Before
Back_3
After&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] map</title><link>https://quietbo.com/2022/09/01/golang-map%E9%9B%86%E5%90%88/</link><pubDate>Thu, 01 Sep 2022 08:30:28 +0000</pubDate><guid>https://quietbo.com/2022/09/01/golang-map%E9%9B%86%E5%90%88/</guid><description>&lt;p&gt;宣告方式:&lt;/p&gt;
&lt;p&gt;var name map[keyType]valueType&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;var map1 map[string]int

// 使用 make 建立 Map。
// Key 的型別是 string，Value 是 int
map2 := make(map[string]int)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;賦值與刪除&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 // map 無序的鍵, 無法決定它的返回順序。通過key來檢索數據

 //var name map[keyType]valueType

 var map1 map[string]int
 map1 = map[string]int{"A": 1, "B": 2}
 fmt.Println(map1["B"]) //2
 //map1["C"] = "3" //會報錯

 map2 := make(map[string]float32)
 map2["k1"] = 2.345
 map2["k2"] = 1.3
 fmt.Println(map2["k1"]) // 2.345

 // 提前指定空間
 //map3 := make(map[string]int, 10)

 for k, v := range map1 {
 fmt.Println(k, v)
 //A 1
 //B 2
 }

 // 刪除方式
 // delete(map, key)
 delete(map2, "k1")
 for k, v := range map2 {
 fmt.Println(k, v)
 //k2 1.3
 }

}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] 陣列 (array) 和切片 (slice)</title><link>https://quietbo.com/2022/09/01/golang-%E9%99%A3%E5%88%97-array-%E5%92%8C%E5%88%87%E7%89%87-slice/</link><pubDate>Wed, 31 Aug 2022 19:07:12 +0000</pubDate><guid>https://quietbo.com/2022/09/01/golang-%E9%99%A3%E5%88%97-array-%E5%92%8C%E5%88%87%E7%89%87-slice/</guid><description>&lt;h2 id="陣列"&gt;陣列
&lt;/h2&gt;&lt;p&gt;陣列索引是從 0 開始, 以索引 (index) 對陣列賦值。&lt;br&gt;
附上Code:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {

 fmt.Println("===一維數組===")
 //var
 var arr [3]int
 fmt.Println(arr[0])
 fmt.Println(len(arr))
 fmt.Println(arr[len(arr)-1])

 //for _, v := range arr{
 // fmt.Printf("%d \n", v)
 //}
 for i, v := range arr {
 fmt.Printf("%d %d \n", i, v)
 }
 //0
 //3
 //0
 //0 0
 //1 0
 //2 0

 var arr1 [3]int = [3]int{1, 3, 5}
 fmt.Println(arr1[2]) //5

 arr2 := [...]int{1, 3, 5}
 fmt.Println(arr2[2]) //5

 fmt.Println(arr1 == arr2) //true

 for i, v := range arr2 {
 fmt.Printf("%d %d \n", i, v)
 }
 //0 1
 //1 3
 //2 5

 fmt.Println("===多維數組===")

 //var arr3 [4][2]int //宣告方式
 arr3 := [4][2]int{{11, 22}, {12, 23}, {45, 62}, {83, 26}}
 fmt.Println(arr3[0][0]) //11
 fmt.Println(arr3[3][1]) //26
 //fmt.Println(arr3[4][2]) //超過會報錯

 fmt.Println("======")
 arr4 := [4][2]int{1: {11, 22}, 3: {31, 36}}
 fmt.Println(arr4[0][0]) //0
 fmt.Println(arr4[1][0]) //11
 fmt.Println(arr4[2][0]) //0
 fmt.Println(arr4[3][1]) //36

 fmt.Println("======")

 arr5 := [4][3]int{1: {0: 100}, 3: {2: 33}}
 fmt.Println(arr5[1][0]) //100
 fmt.Println(arr5[3][2]) //33
 fmt.Println(arr5[1][1]) //0

 arr5[1][1] = 66 //賦值
 fmt.Println(arr5[1][1]) //66
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="切片"&gt;切片
&lt;/h2&gt;&lt;p&gt;使用 make() 函數來創建切片:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;var slice1 []type = make([]type, len)
// 也可以簡寫為
slice1 := make([]type, len)
//slice11 := make([]int, len)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)

func main() {

 //slice [開始位置:結束位置]
 var arr = [3]int{1, 2, 3}
 fmt.Println(arr, arr[1:2]) //[1 2 3] [2]

 var arr1 = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
 fmt.Println(arr1[2:5]) // [3 4 5]
 fmt.Println(arr1[:5]) //[1 2 3 4 5]

 fmt.Println(arr1[5:]) //[6 7 8 9 10]
 fmt.Println(arr1[:]) //[1 2 3 4 5 6 7 8 9 10] //跟 [0:10], [:10]一樣
 fmt.Println(arr1[0:0]) //[0]

 //var name[]Type
 //var stringSlice []string
 //var numberSlice []int
 //var numberEmptySlice []int

 //make([]Type, size. cap) // make 並不會回傳指標
 a := make([]int, 2)
 b := make([]int, 2, 10)
 fmt.Println(a, b) //[0 0] [0 0]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;append 添加元素&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)

func main() {
 var a, b []int
 a = append(a, 1) // 追加一個元素
 fmt.Println(a) //[1]

 b = append(b, 1, 2, 3) // 追加三個元素
 fmt.Println(b) //[1 2 3]

 b = append(b, []int{4, 6, 8}...) // 從後方添加
 fmt.Println(b) //[1 2 3 4 6 8]

 var sli []int

 for i := 0; i &amp;lt; 10; i++ {
 sli = append(sli, i)
 fmt.Printf("長度:%d,容量:%d,地址:%p\n", len(sli), cap(sli), sli)
 }
 //長度:1,容量:1,地址:0xc00000e128
 //長度:2,容量:2,地址:0xc00000e130
 //長度:3,容量:4,地址:0xc0000141e0
 //長度:4,容量:4,地址:0xc0000141e0
 //長度:5,容量:8,地址:0xc000012280
 //長度:6,容量:8,地址:0xc000012280
 //長度:7,容量:8,地址:0xc000012280
 //長度:8,容量:8,地址:0xc000012280
 //長度:9,容量:16,地址:0xc00010c000
 //長度:10,容量:16,地址:0xc00010c000

 var r = []int{1, 2, 3}
 r = append([]int{0}, r...) //從前面加了0
 fmt.Println(r) //[0 1 2 3]

 r = append([]int{-4, -3, -2, -1}, r...)
 fmt.Println(r) //[-4 -3 -2 -1 0 1 2 3]
 //盡量不要從前面去加

 // 一般容量會大於長度
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="copy"&gt;copy
&lt;/h3&gt;&lt;p&gt;copy() 可以將一個數組切片複製到另一個數組切片中，如果加入的兩個數組切片不一樣大，就會按照其中較小的那個數組切片的元素個數進行複制。&lt;/p&gt;
&lt;p&gt;範例1:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import (
 "fmt"
)

func main() {
 // copy(目標切片, 源切片)類型

 slice1 := []int{1, 2, 3, 4, 5, 6}
 slice2 := []int{7, 8, 9}
 slice3 := []int{9, 8, 7}
 //copy(slice1, slice2) //複製 7 8 9 到s1 的1 2 3 位置
 copy(slice1, slice2)
 fmt.Println(slice1) //[7 8 9 4 5 6]
 fmt.Println(slice2) //[7 8 9]
 fmt.Println("=========")
 // 與長度有關, 會將 7 8 9 複製到slice3
 copy(slice3, slice1)
 fmt.Printf("slice1:%d, slice3:%d \n", slice1, slice3)
 // slice1:[7 8 9 4 5 6], slice3:[7 8 9][7 8 9]

}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 // copy(目標切片, 源切片)類型
 const len = 10 //const常量是一個簡單值的標識符，在程序運行時，不會被修改的量。
 //創建切片var slice1 []type = make([]type, len)
 slice11 := make([]int, len)
 for i := 0; i &amp;lt; len; i++ {
 slice11[i] = i
 }
 slice33 := slice11
 slice22 := make([]int, len)
 copy(slice22, slice11)
 fmt.Println(slice11) //[0 1 2 3 4 5 6 7 8 9]
 fmt.Println(slice22) //[0 1 2 3 4 5 6 7 8 9]
 fmt.Println(slice33) //[0 1 2 3 4 5 6 7 8 9]

 slice11[0] = 999
 fmt.Println(slice11[0]) //999
 fmt.Println(slice22[0]) //0 不受影響
 fmt.Println(slice33[0]) //999

}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刪除元素&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {

 //刪除元素

 //方法
 var a = []int{1, 2, 3}
 a = a[2:]
 fmt.Println(a) //[3]

 //方法-append
 var b = []int{1, 2, 3, 4, 5, 6}
 fmt.Println(b[:1]) //[1]
 b = append(b[:1], b[4:]...)
 fmt.Println(b) //[1 5 6]

 //方法-copy
 var c = []int{1, 2, 3, 4, 5, 6, 7}
 c = c[:copy(c, c[3:])] // 與append類似
 fmt.Println(c) // [4 5 6 7]

 //試者了解這取值的過程
 fmt.Println(c) //[4 5 6 7 5 6 7]
 fmt.Println(c[3:]) //[4 5 6 7]
 fmt.Println(copy(c, c[3:])) //4
 fmt.Println(c[:4]) //[4 5 6 7]

 // 方法 - append
 var d = []int{1, 2, 3, 4, 5}
 fmt.Println(d[3+1:]) //[5]
 fmt.Println(d[:3]) //[1 2 3]
 // d = append(d[:N], d[N+1:]...)
 d = append(d[:3], d[3+1:]...)
 fmt.Println(d) //[1 2 3 5]

 // 方法 - copy
 var e = []int{1, 2, 3, 4, 5}
 e = e[:2+copy(e[2:], e[2+1:])]
 fmt.Println(e)//[1 2 4 5]

 //方法-slice

 slice1 := []int{1, 2, 3, 4, 5, 6, 7, 8}
 index := 2
 fmt.Println(slice1[:index], slice1[index+1:]) //[1 2] [4 5 6 7 8]

 slice1 = append(slice1[:index], slice1[index+1:]...)
 fmt.Println(slice1) //[1 2 4 5 6 7 8]

}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] 指標</title><link>https://quietbo.com/2022/08/26/golang-%E6%8C%87%E6%A8%99/</link><pubDate>Thu, 25 Aug 2022 17:38:38 +0000</pubDate><guid>https://quietbo.com/2022/08/26/golang-%E6%8C%87%E6%A8%99/</guid><description>&lt;p&gt;*int : 宣告的指標整數&lt;/p&gt;
&lt;p&gt;&amp;amp;變數名 : 拿記憶體位置&lt;/p&gt;
&lt;p&gt;fmt.Printf: &lt;a class="link" href="https://pkg.go.dev/fmt" target="_blank" rel="noopener"
 &gt;格式化輸出&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"


func main(){
 var a int = 100
 var s string = "hello"

 fmt.Print(a)
 fmt.Print(s)
 fmt.Println("%p %p", &amp;a, &amp;s)

 var address ="Bocky address"

 ptr := &amp;address
 fmt.Printf("Address =%p \n", ptr) //Address =0xc000010260

 value := *ptr
 fmt.Printf("value Type: %T \n", value) // value Type: string
 fmt.Printf("value value: %s \n", value) //value value: Bocky address

 aa, bb := 10, 100
 swap(&amp;aa, &amp;bb)
 fmt.Println(aa,bb)
}



func swap(m, n *int){

 // s =10
 s := *m

 // m 100 n 100
 *m = *n

 // n 10
 *n = s
}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Goland] Toolbar</title><link>https://quietbo.com/2022/08/23/goland-toolbar/</link><pubDate>Tue, 23 Aug 2022 10:37:28 +0000</pubDate><guid>https://quietbo.com/2022/08/23/goland-toolbar/</guid><description>&lt;p&gt;goland:2020 3.5&lt;/p&gt;
&lt;p&gt;預期結果如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/04cb1xb.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;view -&amp;gt; Appearandce -&amp;gt; Toolbar&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/d9HBCMh.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;基本上JetBrains開發出來的IDE會有Toolbar, 只是位置可能不會在一樣的地方。&lt;/p&gt;</description></item><item><title>[Python] 日誌記錄第三方庫 – Loguru(附簡單的範例)</title><link>https://quietbo.com/2022/08/12/python-%E6%97%A5%E8%AA%8C%E8%A8%98%E9%8C%84%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%AB-loguru%E9%99%84%E7%B0%A1%E5%96%AE%E7%9A%84%E7%AF%84%E4%BE%8B/</link><pubDate>Fri, 12 Aug 2022 11:01:01 +0000</pubDate><guid>https://quietbo.com/2022/08/12/python-%E6%97%A5%E8%AA%8C%E8%A8%98%E9%8C%84%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%AB-loguru%E9%99%84%E7%B0%A1%E5%96%AE%E7%9A%84%E7%AF%84%E4%BE%8B/</guid><description>&lt;p&gt;use:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pycharm, FastAPI, Loguru&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一開始在學log時, 會使用標準庫 logging。&lt;br&gt;
設置上較爲繁瑣, 甚至有些在多進程多線程等特殊處理時, 還會導致日誌記錄會出現異常, 還有幾次都在找為什麼logg會印兩次…&lt;br&gt;
現在單純開發時都會使用Loguru來做一些log的紀錄,下方提供簡單的範例&lt;/p&gt;
&lt;h2 id="安裝"&gt;安裝
&lt;/h2&gt;&lt;p&gt;使用 pip 安裝即可，Python 3 版本的安裝如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pip3 install loguru&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;log.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from loguru import logger
logger.add("./logs/test.log", rotation="00:00", enqueue=True, retention="30 days")

#logger.info(1)
#logger.error(2)
#logger.warning(3)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;main.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import uvicorn
from log import logger
from fastapi import FastAPI

app = FastAPI()

@app.on_event("startup")
async def startup_event():
 logger.info('Hi startup')

@app.get("/")
async def root():
 return {"message": "Hello World"}


if __name__ == "__main__":
 uvicorn.run("main:app", host='127.0.0.1', port=8000, reload=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行python main.py&lt;/p&gt;
&lt;p&gt;會看到下方的&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;INFO: Will watch for changes in these directories: ['C:\\Dev\\FastAPI_demo']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [21476] using watchgod
INFO: Started server process [4168]
INFO: Waiting for application startup.
2022-08-12 18:53:32.579 | INFO | main:startup_event:9 - Hi startup
INFO: Application startup complete.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開瀏覽器輸入下方:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;127.0.0.1/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開logs資料夾會看到已經有印出來的檔案。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;2022-08-12 18:56:21.419 | INFO | main:startup_event:9 - Hi startup
2022-08-12 18:56:27.969 | INFO | main:root:13 - {'message': 'Hello World'}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Golang] go run: cannot run non-main package(解決)</title><link>https://quietbo.com/2022/08/08/golang-go-run-cannot-run-non-main-package%E8%A7%A3%E6%B1%BA/</link><pubDate>Mon, 08 Aug 2022 08:39:55 +0000</pubDate><guid>https://quietbo.com/2022/08/08/golang-go-run-cannot-run-non-main-package%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;寫了第一個go程序，很簡單，就是一個簡單的輸出語句，但是確報了&lt;br&gt;
go run: cannot run non-main package 的錯誤信息，代碼如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package example

import "fmt"

const englishHelloPrefix = "Hello, "

func Hello(name string) string {
 return englishHelloPrefix + name
}

func main() {
 fmt.Println(Hello("world"))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在終端機執行了main.go的檔案但出現錯誤&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$ go run main.go 
go run: cannot run non-main package&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;main方法只能放在package main中，go run 是執行命令，必須要一個main用來調用&lt;/p&gt;
&lt;p&gt;把第一行改成下方就可以了&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] Linux 查找volumes</title><link>https://quietbo.com/2022/08/03/docker-linux-%E6%9F%A5%E6%89%BEvolumes/</link><pubDate>Wed, 03 Aug 2022 10:27:42 +0000</pubDate><guid>https://quietbo.com/2022/08/03/docker-linux-%E6%9F%A5%E6%89%BEvolumes/</guid><description>&lt;p&gt;以下為linux在查找volumes範例&lt;/p&gt;
&lt;p&gt;查看已建立的volume&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker volume list
DRIVER VOLUME NAME
local mysql-data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看該volume資訊, 會看到Mountpoint, 這是存放的路徑&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker inspect mysql-data
[
 {
 "CreatedAt": "2022-08-03T05:59:51Z",
 "Driver": "local",
 "Labels": null,
 "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
 "Name": "mysql-data",
 "Options": null,
 "Scope": "local"
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會發現使用找不到, 因為該路徑下需要使用root&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ cd /var/lib/docker/volumes/mysql-data/_data&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ sudo -s
$ cd /var/lib/docker/volumes/mysql-data/_data&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;該路徑下會看到database, 內容會有tableName.ibd&lt;/p&gt;</description></item><item><title>[Linux] Makefile:8: *** missing separator. Stop.(已解決)</title><link>https://quietbo.com/2022/07/28/linux-makefile8-missing-separator-stop-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Thu, 28 Jul 2022 03:26:38 +0000</pubDate><guid>https://quietbo.com/2022/07/28/linux-makefile8-missing-separator-stop-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;原因:&lt;/p&gt;
&lt;p&gt;出現這個錯誤的原因通常是tab格式錯誤導致的。Makefile的命令行必須以一個tab作為開頭, 不可用4個空白。&lt;/p&gt;
&lt;p&gt;在~/.vimrc文件中添加：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;set tabstop=4 //設置tab鍵是4個空格
set noexpandtab //不把tab键用空格代替&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看目前的Makefile是否有tab鍵&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;cat -t Makefile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;當你看到&lt;code&gt;^I&lt;/code&gt;代表tab。出問題的命令行如果前面是有空白, 代表該命令的指令是需要修改的&lt;/p&gt;</description></item><item><title>[Linux] 建立自訂 Systemd 服務教學與範例(Python)</title><link>https://quietbo.com/2022/07/27/linux-%E5%BB%BA%E7%AB%8B%E8%87%AA%E8%A8%82-systemd-%E6%9C%8D%E5%8B%99%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8Bpython/</link><pubDate>Wed, 27 Jul 2022 07:33:45 +0000</pubDate><guid>https://quietbo.com/2022/07/27/linux-%E5%BB%BA%E7%AB%8B%E8%87%AA%E8%A8%82-systemd-%E6%9C%8D%E5%8B%99%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8Bpython/</guid><description>&lt;p&gt;&lt;a class="link" href="https://blog.gtwang.org/linux/linux-create-systemd-service-unit-for-python-echo-server-tutorial-examples/" target="_blank" rel="noopener"
 &gt;Linux 建立自訂 Systemd 服務教學與範例&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="部屬方式"&gt;部屬方式
&lt;/h1&gt;&lt;p&gt;本次範例程式使用FastAPI,&lt;br&gt;
檔名為main.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import platform
import os
os_type = platform.system()
if os_type == 'Linux':
 # print('in Linux')
 os.chdir('/home/ubuntu/Dev')
import sys
sys.path.append("/home/ubuntu/.local/lib/python3.8/site-packages")
from fastapi import FastAPI
import uvicorn


app = FastAPI()

@app.get("/")
async def root():
 return {"message": "Hello World"}

if __name__ == "__main__":
 uvicorn.run("main:app", host='0.0.0.0', port=8080, workers=1, reload=True)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="linux-建立自訂-systemd-服務教學與範例"&gt;Linux 建立自訂 Systemd 服務教學與範例
&lt;/h1&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 到/etc建立或rc.local並輸入下列內容(如果沒有的話自行建立)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 更改檔案路徑
 &lt;/li&gt;
 &lt;li&gt;
 python執行檔路徑, 有些是/bin/python, 請自行更改(若想包成docker就寫執行docker容器的指令)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;#!/bin/sh -e

cd /home/ubuntu/Dev/myPython

/usr/bin/python3 main.py

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;確定輸入的python路徑正確, 使程式正常運行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ /usr/bin/python3 data_collector_main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後將執行權限添加到 /etc/rc.local 文件。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo chmod +x /etc/rc.local&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 到/etc/systemd/system建立rc-local.service服務
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ nano /etc/systemd/system/rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是依照rc.local則直接複製下方內容,無須修正&lt;br&gt;
(有修改過rc.local檔名的話, 請自行將下方的4處修改為自己的檔名, 分別為下方的1,4,9,17行)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
Environment="DJANGO_SETTINGS_MODULE=Macdonald_Server.settings.production"
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
Alias=rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 python的庫位置
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ pip3 show fastapi&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 添加PATH, 路徑請自行更改
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ export PATH=$PATH:/home/nadi_19/.local/lib/python3.6/site-packages&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 開啟執行權限
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ chmod +x /home/nadi_19/NADI/ShowCase/server_ms_showcase/data_collector/data_collector_main.py&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 重新載入 Systemd 設定檔
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 啟動自訂的 echo 伺服器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl start rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="8"&gt;
 &lt;li&gt;
 查看 echo 伺服器狀態
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl status rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功啟動訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;root@ShowCase19-1:/home/nadi_19/NADI/ShowCase/server_ms_showcase/data_collector# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
 Drop-In: /lib/systemd/system/rc-local.service.d
 └─debian.conf
 Active: active (exited) since Wed 2022-07-20 11:15:40 UTC; 1min 27s ago
 Docs: man:systemd-rc-local-generator(8)
 Process: 31493 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="9"&gt;
 &lt;li&gt;
 使服務能夠在啟動時自動啟動
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl enable rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入完後重新開機, 測試看看是否service都有自己run起來!&lt;/p&gt;
&lt;ol class="wp-block-list" start="10"&gt;
 &lt;li&gt;
 指令補充
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下方的service-name都是指rc-local.service這隻檔案。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢視服務的當前狀態&lt;br /&gt;無論它是否正在執行，都可以在終端中使用以下命令語法：
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl status [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 啟動服務，請使用以下語法
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl start [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 停止正在執行的服務
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl stop [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 使服務能夠在機器啟動時自動啟動
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl enable [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 禁用服務，使其無法在啟動時自動啟動：
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl disable [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 重新載入服務
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl reload [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 重新載入&lt;br /&gt;或重新啟動服務（它重新載入服務，並且如果重新載入不可用，那麼它將重新啟動服務。）
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl reload-or-restart [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢查服務是否啟用
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl is-active [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服務正常並啟用則返回:activating&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢查是否已啟用服務以在系統啟動時自動啟動
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl is-enabled [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟用則返回:enabled&lt;/p&gt;
&lt;h2 id="補充"&gt;補充
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 若是出現Condition check resulted in /etc/rc.local Compatibility being skipped.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;將執行權限添加到 /etc/rc.local 文件。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo chmod +x /etc/rc.local&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 找不到xxx.local檔案&lt;br /&gt;如果在確認etc是否有xxx.local,如果沒有的話請將自己補上, 或是.service檔案內的xx.local檔名打錯了。
 &lt;/li&gt;
 &lt;li&gt;
 執行多個service&lt;br /&gt;目前是建立多個xx.local和xx-local.service,&lt;br /&gt;未來若有更好的方式, 我會來修正現在的方式(如果我有記得的話)
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[Docker] restart</title><link>https://quietbo.com/2022/07/27/docker-restart/</link><pubDate>Wed, 27 Jul 2022 07:06:09 +0000</pubDate><guid>https://quietbo.com/2022/07/27/docker-restart/</guid><description>&lt;p&gt;原文檔:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &lt;a href="https://docs.docker.com/engine/reference/commandline/restart/"&gt;Docker Doc&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 &lt;a href="https://docs.docker.com/config/containers/start-containers-automatically/#use-a-restart-policy"&gt;Start containers automatically&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要重開機後, 就要手動去開啟容器, 雖然有GUI很方便按個按鈕就好, 可是有時候還是會忘記要啟動必要容器…&lt;/p&gt;
&lt;h2 id="設置重啟策略"&gt;設置重啟策略
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker run --restart={Policy} {Container Name}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此命令更改已在運行的容器:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker update --restart={Policy} {Container Name}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下方為Policy與原檔描述&lt;figure class="wp-block-table"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Policy&lt;/th&gt;
 &lt;th&gt;Result&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;默認, 不要自動重啟容器。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;on-failure[:max-retries]&lt;/td&gt;
 &lt;td&gt;如果容器因錯誤退出，則重新啟動容器，這表現為非零退出代碼。或者，使用該:max-retries選項限制 Docker 守護程序嘗試重新啟動容器的次數。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;always&lt;/td&gt;
 &lt;td&gt;無論退出狀態如何，始終重新啟動容器。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;unless-stopped&lt;/td&gt;
 &lt;td&gt;無論退出狀態如何，始終重啟容器，包括在守護進程啟動時，除非容器在 Docker 守護進程停止之前進入停止狀態。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="查看容器設置"&gt;查看容器設置
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker inspect {Container Name}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或使用下方指令&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker inspect -f "{{ .HostConfig.RestartPolicy }}" {Container_Name}

{always 0}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在HostConfig.RestartPolicy下可以看到已經被改為always&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/R7L5RQM.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;顯示所有正在運行的 docker 容器的重啟策略&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker inspect --format "{{.HostConfig.RestartPolicy.Name}}, {{.Name}}, {{.Id}}" $(docker ps -qf status=running) | sort -t, -k1 |column -s, -t&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;always /agitated_hertz 32a0f056b137401990aff0c2532de951933bf301f6736bc806ef5e2490aea2b5
always /ubuntu 0c1e12f31e1ad359530a2709a3a814e8a442fea756d1cda8694d8c9aebb05755&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;參考來源:&lt;a class="link" href="https://stackoverflow.com/questions/43108227/is-it-possible-to-show-the-restart-policy-of-a-running-docker-container" target="_blank" rel="noopener"
 &gt;[stackoverflow]Is it possible to show the restart policy of a running Docker container?&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Golang] 安裝 (Windows &amp; ubuntu20.04)</title><link>https://quietbo.com/2022/07/21/golang-%E5%AE%89%E8%A3%9D-windows-ubuntu20-04/</link><pubDate>Thu, 21 Jul 2022 15:59:38 +0000</pubDate><guid>https://quietbo.com/2022/07/21/golang-%E5%AE%89%E8%A3%9D-windows-ubuntu20-04/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#Windows%E5%AE%89%E8%A3%9D" &gt;Windows安裝&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#%E5%9F%B7%E8%A1%8C%E7%AC%AC%E4%B8%80%E6%94%AF%E7%A8%8B%E5%BC%8Fhellogo" &gt;執行第一支程式hello.go&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-3&amp;quot; href=&amp;quot;https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#ubuntu_%E5%AE%89%E8%A3%9D_golang_118&amp;quot; &amp;gt;[ubuntu] 安裝 golang 1.18&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-4&amp;quot; href=&amp;quot;https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#%E5%B7%B2%E8%A7%A3%E6%B1%BA_%E9%97%9C%E6%8E%89%E7%B5%82%E7%AB%AF%E6%A9%9F%E6%89%BE%E4%B8%8D%E5%88%B0go&amp;quot; &amp;gt;[已解決] 關掉終端機找不到go&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-5&amp;quot; href=&amp;quot;https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#%E5%9F%B7%E8%A1%8Cgo%E6%AA%94%E6%A1%88&amp;quot; &amp;gt;執行go檔案&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;

&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-6&amp;quot; href=&amp;quot;https://quietbo.com/2022/07/21/golang-%e5%ae%89%e8%a3%9d-windows-ubuntu20-04/#%E6%A8%99%E6%BA%96%E5%91%BD%E4%BB%A4_%E2%80%93_run_%E8%88%87_build%E5%B7%AE%E7%95%B0&amp;quot; &amp;gt;標準命令 &amp;amp;#8211; run 與 build差異&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="windows安裝"&gt;&lt;span class="ez-toc-section" id="Windows%E5%AE%89%E8%A3%9D"&gt;&lt;/span&gt;Windows安裝&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;以下為安裝連結:&lt;br&gt;
&lt;a class="link" href="https://go.dev/" target="_blank" rel="noopener"
 &gt;安裝Golang&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://code.visualstudio.com/" target="_blank" rel="noopener"
 &gt;VSCode&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="執行第一支程式hellogo"&gt;&lt;span class="ez-toc-section" id="%E5%9F%B7%E8%A1%8C%E7%AC%AC%E4%B8%80%E6%94%AF%E7%A8%8B%E5%BC%8Fhellogo"&gt;&lt;/span&gt;執行第一支程式hello.go&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;下方為hello.go內的code&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 fmt.Println("Hello Golang")
}

// 1.撰寫程式 &amp;gt; 建置(build) &amp;gt; 執行程式
// 建置: go build 程式檔案的名稱

// 2. 執行程式: 輸入執行檔的檔名&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開終端機執行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="basic" class="language-basic"&gt;$ go build hello.go&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會產生hello.exe, 在終端機執行hello&lt;br&gt;
如果出現錯誤訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;Suggestion [3,General]: 找不到 hello 命令，但它確實存在於目前的位置。Windows PowerShell 預設並不會從目前的位置載入命令。如果您信任這個命令，請改為輸入 ".\hello"。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;請改使用./hello&lt;/p&gt;
&lt;p&gt;補充:&lt;br&gt;
若是package main出現紅色底線, 重新開機即可。&lt;/p&gt;
&lt;h2 id="ubuntu-安裝-golang-118"&gt;&lt;span class="ez-toc-section" id="ubuntu_%E5%AE%89%E8%A3%9D_golang_118"&gt;&lt;/span&gt;[ubuntu] 安裝 golang 1.18&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;下載golang壓縮檔(如果要其他版本則自行把18換成其他版本號)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;wget https://dl.google.com/go/go1.18.linux-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的命令安裝了 Golang v1.13，大多數用戶更喜歡更新版本的 Golang，當新版本出現時會不斷更新。 實現此目的的最佳方法是安裝 PPA。&lt;/p&gt;
&lt;p&gt;解壓縮&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成後ls /usr/local會多一個go的目錄&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ ls /usr/local
bin etc games go include lib man sbin share src&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用指令vi /etc/profile進到檔案內, 在最下方添加,&lt;br&gt;
目的是在系統環境變量PATH中增加go的路徑&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ vi /etc/profile
export PATH=$PATH:/usr/local/go/bin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;儲存並離開,使用下方指令立即生效&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;source /etc/profile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入go version查看版本號&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ go version
go version go1.18 linux/amd64&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="已解決-關掉終端機找不到go"&gt;&lt;span class="ez-toc-section" id="%E5%B7%B2%E8%A7%A3%E6%B1%BA_%E9%97%9C%E6%8E%89%E7%B5%82%E7%AB%AF%E6%A9%9F%E6%89%BE%E4%B8%8D%E5%88%B0go"&gt;&lt;/span&gt;[已解決] 關掉終端機找不到go&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;開啟profile檔案&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;nano $HOME/.profile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後將以下行貼上到檔案中並儲存。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;export PATH=$PATH:/usr/local/go/binb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成後，執行以下命令以完成安裝&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ source ~/.profile
$ go version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;補充:&lt;br&gt;
加入環境變量後但仍出現找不到go, 或是關閉終端機就會出現找不到go, 重新開啟VM試試看&lt;br&gt;
&lt;a class="link" href="https://volvootofinans.com/zh-TW/how-to-install-go-on-ubuntu-20-04-18-04.html" target="_blank" rel="noopener"
 &gt;參考此處&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="執行go檔案"&gt;&lt;span class="ez-toc-section" id="%E5%9F%B7%E8%A1%8Cgo%E6%AA%94%E6%A1%88"&gt;&lt;/span&gt;執行go檔案&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;上方安裝及環境沒問題後, 可執行一隻hello.go試試看&lt;/p&gt;
&lt;p&gt;下方儲存名稱為main.go&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="go" class="language-go line-numbers"&gt;package main

import "fmt"

func main() {
 fmt.Println("Hello, World")
 fmt.Println("哈囉！世界！")
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開終端機輸入&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ go run main.go
Hello, World
哈囉！世界！&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class="link" href="https://go.dev/doc/code" target="_blank" rel="noopener"
 &gt;連結&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="標準命令-8211-run-與-build差異"&gt;&lt;span class="ez-toc-section" id="%E6%A8%99%E6%BA%96%E5%91%BD%E4%BB%A4_%E2%80%93_run_%E8%88%87_build%E5%B7%AE%E7%95%B0"&gt;&lt;/span&gt;標準命令 – run 與 build差異&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 build
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ go build 檔案名.go&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果沒有錯誤就產生執行檔於當前目錄, 例如執行main.go成功就會出現一個main.exe檔案在同樣路徑下&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 run
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ go run 檔案名.go&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 直接執行golang code
 &lt;/li&gt;
 &lt;li&gt;
 直接在命令行輸出程序執行結果，方便用戶調試，本質上也是先編譯再執行
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可參考更多資訊:&lt;a class="link" href="https://blog.csdn.net/wohu1104/article/details/106295007" target="_blank" rel="noopener"
 &gt;Go 學習筆記（37）— 標準命令（go build 跨平台編譯、交叉編譯、go clean、go run、go fmt、go install、go get）&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] os.chdir 更改當前工作目錄</title><link>https://quietbo.com/2022/07/19/python-os-chdir-%E6%9B%B4%E6%94%B9%E7%95%B6%E5%89%8D%E5%B7%A5%E4%BD%9C%E7%9B%AE%E9%8C%84/</link><pubDate>Tue, 19 Jul 2022 09:49:44 +0000</pubDate><guid>https://quietbo.com/2022/07/19/python-os-chdir-%E6%9B%B4%E6%94%B9%E7%95%B6%E5%89%8D%E5%B7%A5%E4%BD%9C%E7%9B%AE%E9%8C%84/</guid><description>&lt;p&gt;語法:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="basic" class="language-basic"&gt;os.chdir(path)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;參數&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 path − 更改到新位置的目錄的完整路徑。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不返回任何值。沒有找到指定的路徑，會拋出FileNotFoundError&lt;/p&gt;
&lt;p&gt;舉例:&lt;br&gt;
我在跟目錄(/)的狀態下, 使用python3 絕對路徑/xxxx.py後, 要在運行別隻py檔案,&lt;/p&gt;
&lt;p&gt;使用下方兩隻py檔來做演示,路徑都在/home/ubuntu/Dev&lt;/p&gt;
&lt;p&gt;檔名:chdir.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os, sys

path = "/home/ubuntu/Dev"

# 查看當前工作目錄
retval = os.getcwd()
print("當前工作目錄:%s" % retval)

# 修改當前工作目錄
os.chdir( path )

# 查看修改後的工作目錄
retval = os.getcwd()

print("目錄修改成功:%s" % retval)

# 接著要運行的指令
os.system("python3 pping.py") &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檔名:pping.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import os
a=os.system("ping 192.168.1.101") #使用a接收返回值
print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是在終端機執行過程:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;ubuntu@ubuntu:~/Dev$ cd ~
ubuntu@ubuntu:~$ python3 /home/ubuntu/Dev/chdir.py 
當前工作目錄:/home/ubuntu
目錄修改成功:/home/ubuntu/Dev
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq=1 ttl=128 time=5.19 ms&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由此可見os.getcwd是獲得終端機當下在運行python時的路徑, 而os.chdir是會修改為新的工作路徑, 若沒有修改的話, 是沒辦法透過os.system來運行pping.py的, 會出現找不到檔案的error。&lt;/p&gt;</description></item><item><title>[Ubuntu] Terminator+ZSH</title><link>https://quietbo.com/2022/07/17/ubuntu-terminatorzsh/</link><pubDate>Sat, 16 Jul 2022 16:26:36 +0000</pubDate><guid>https://quietbo.com/2022/07/17/ubuntu-terminatorzsh/</guid><description>&lt;p&gt;多窗口如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/T32W7Qv.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="terminator"&gt;Terminator
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$ #sudo add-apt-repository ppa:gnome-terminator
$ sudo apt update
$ sudo apt install terminator&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="zsh"&gt;zsh
&lt;/h2&gt;&lt;p&gt;更新apt-get&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$sudo apt-get update
$sudo apt-get upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝 zsh&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$sudo apt-get install zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝git&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;$sudo apt-get install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看一下是否安裝成功&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$cat /etc/shells

# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/bin/zsh
/usr/bin/zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝 curl&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo apt-get install curl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝 oh-my-zsh&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改配置&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$chsh -s /bin/zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方主題庫:&lt;a class="link" href="https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes" target="_blank" rel="noopener"
 &gt;Github網址&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] 背景執行nohup, &amp; 與 nohup.out</title><link>https://quietbo.com/2022/07/06/python-%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8Cnohup-%E8%88%87-nohup-out/</link><pubDate>Wed, 06 Jul 2022 10:13:54 +0000</pubDate><guid>https://quietbo.com/2022/07/06/python-%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8Cnohup-%E8%88%87-nohup-out/</guid><description>&lt;h1 id=""&gt;
&lt;/h1&gt;&lt;p&gt;本篇提到的「&lt;strong&gt;背景&lt;/strong&gt;」指的是: 在終端機模式下使用 [ctrl]-c, 並不會中斷的一個情境!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://quietbo.com/2021/03/10/ubuntu%e8%83%8c%e6%99%af%e5%9f%b7%e8%a1%8cpy%e6%96%b9%e6%b3%95/" target="_blank" rel="noreferrer noopener"&gt;[Linux]背景執行py方法&lt;/a&gt; 雖然是在背景執行, 不會因為[ctrl]-c而中斷, 但會因為「&lt;strong&gt;終端機關閉後而中斷&lt;/strong&gt;」。&lt;/p&gt;
&lt;p id="block-b1f3c7ea-6b97-4897-bb83-e416e7bdabac"&gt;
 中斷可能多個原因, 例如ssh連線到機器後, 操作時不小心將視窗關閉,或是網路斷線而關閉。
&lt;/p&gt;
&lt;p&gt;本次主要目的為: 「&lt;strong&gt;在離線或登出系統後，還能夠讓工作繼續進行&lt;/strong&gt;」。&lt;/p&gt;
&lt;p&gt;演示的code為my_nohup.py:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8
from datetime import datetime
from time import sleep
import logging

Log_Format = "%(levelname)s %(asctime)s - %(message)s"

logging.basicConfig(filename = "mylog.log",
 filemode = "w",
 format = Log_Format,
 level = logging.INFO)
logger = logging.getLogger()
logger.error("Our First Log Message")

while(1):
 sleep(5)

 print("print " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
 logger.info(str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
 # print(1/0) # 輸出錯誤時使用&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="指令介紹"&gt;&lt;span class="ez-toc-section" id="%E6%8C%87%E4%BB%A4%E4%BB%8B%E7%B4%B9"&gt;&lt;/span&gt;指令介紹&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &lt;code&gt;nohup&lt;/code&gt;: no hang up的縮寫, 不斷地運行。
 &lt;/li&gt;
 &lt;li&gt;
 &lt;code&gt;&amp;&lt;/code&gt;: 在後台運行，關掉終端會停止運行。
 &lt;/li&gt;
 &lt;li&gt;
 &lt;code&gt;&amp;gt;&lt;/code&gt; : 標準輸出符號。
 &lt;/li&gt;
 &lt;li&gt;
 &lt;code&gt;-u&lt;/code&gt;: 在nohup.out內可以看到print的訊息。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="背景執行nohup-"&gt;&lt;span class="ez-toc-section" id="%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8Cnohup"&gt;&lt;/span&gt;背景執行(nohup, &amp;amp;)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;nohup python3 my_nohup.py &amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;758865 為背景執行的PID&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Ixd9tqD.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;執行完會出現一段，所有輸出都被重定向到一個名為nohup.out的文件中&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;nohup: ignoring input and appending output to 'nohup.out'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此時輸入ls指令會看到多出mylog.log和nohup.out&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;admins@labs:~$ ls
Dev get-pip.py mylog.log my_nohup.py nohup.out Python-3.7.9&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;試著使用cat去看看這兩隻檔案, mylog.log會每5秒打印訊息, 但nohup.out是空的。&lt;/p&gt;
&lt;p&gt;查看背景運行(若是關閉終端機後才使用指令，jobs已經無法看到後台跑得程序了, 需使用ps aux)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;jobs -l&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;離開該終端機後, 背景仍會繼續執行這個服務, 可使用ps aux來查看。&lt;/p&gt;
&lt;h2 id="解決-nohupout打開是空白問題"&gt;&lt;span class="ez-toc-section" id="%E8%A7%A3%E6%B1%BA_nohupout%E6%89%93%E9%96%8B%E6%98%AF%E7%A9%BA%E7%99%BD%E5%95%8F%E9%A1%8C"&gt;&lt;/span&gt;[解決] nohup.out打開是空白問題&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;如果沒有指定導出的地方, 會在nohup.out檔案內, 但在執行時需使用&lt;br&gt;
python -u&lt;br&gt;
執行時使用下方指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;nohup python3 -u my_nohup.py &amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣print內的訊息都會在nohup.out了, 而log則是logger寫入的資料, 是分開的檔案。&lt;/p&gt;
&lt;h2 id="指定輸出檔案導出檔案"&gt;&lt;span class="ez-toc-section" id="%E6%8C%87%E5%AE%9A%E8%BC%B8%E5%87%BA%E6%AA%94%E6%A1%88%E5%B0%8E%E5%87%BA%E6%AA%94%E6%A1%88"&gt;&lt;/span&gt;指定輸出檔案(導出檔案)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;可以指定導到其他檔案, 下方是導到my_print.txt&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;nohup python3 -u my_nohup.py &amp;gt; my_print.txt &amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;沒有nohup: ignoring input and appending output to ‘nohup.out’的訊息, 也沒有看到nohup.out的檔案。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/cg3xS8W.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;這裡的&amp;gt;其實是 1&amp;gt; 的縮寫。&lt;figure class="wp-block-table"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;名稱&lt;/th&gt;
 &lt;th&gt;代碼&lt;/th&gt;
 &lt;th&gt;操作符號&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;標準輸入&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;&amp;lt; 或&amp;laquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;標準輸出&lt;/td&gt;
 &lt;td&gt;1&lt;/td&gt;
 &lt;td&gt;&amp;gt;或&amp;raquo;或1&amp;gt; 或1&amp;raquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;標準錯誤輸出&lt;/td&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;2&amp;gt; 或2&amp;raquo;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;通常後台運行重定向可以寫成：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;mkdir logs
nohup python3 -u my_nohup.py &amp;gt; logs/command.log 2&amp;gt;&amp;1 &amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2&amp;gt;&amp;amp;1 是將「標準錯誤輸出(2)」重定向到「標準輸出(1)」, 簡單來說就是&lt;strong&gt;標準輸出和標準錯誤輸出都在同一份檔案&lt;/strong&gt;, 導入logs文件夾下的command.log日誌文件。&lt;/p&gt;
&lt;h2 id="標準輸出與標準錯誤輸出分開儲存"&gt;&lt;span class="ez-toc-section" id="%E6%A8%99%E6%BA%96%E8%BC%B8%E5%87%BA%E8%88%87%E6%A8%99%E6%BA%96%E9%8C%AF%E8%AA%A4%E8%BC%B8%E5%87%BA%E5%88%86%E9%96%8B%E5%84%B2%E5%AD%98"&gt;&lt;/span&gt;標準輸出與標準錯誤輸出分開儲存&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;如果想要把錯誤輸出存到另一份檔案,把最後一行的註解拿掉， print(1/0)在最後運行時會出錯, 下方指令, 會把標準輸出到out.log, 標準錯誤輸出err.log&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;nohup python3 -u my_nohup.py &amp;gt; out.log 2&amp;gt;err.log &amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下方為故意讓程式有出錯的狀況的圖片, 會看到out.log是原本的print日期時間, 而err.log則是遇到錯誤的訊息&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/mMogv4p.png" alt="" /&gt;&lt;/p&gt;
&lt;hr class="wp-block-separator has-alpha-channel-opacity" /&gt;
&lt;p&gt;補充:&lt;br&gt;
&lt;a href="https://linux.vbird.org/linux_basic/centos7/0440processcontrol.php#nohup" target="_blank" rel="noreferrer noopener"&gt;鳥哥私房菜-離線管理問題&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] 日誌按天分割，保存近一個月日誌</title><link>https://quietbo.com/2022/06/30/python-%E6%97%A5%E8%AA%8C%E6%8C%89%E5%A4%A9%E5%88%86%E5%89%B2%EF%BC%8C%E4%BF%9D%E5%AD%98%E8%BF%91%E4%B8%80%E5%80%8B%E6%9C%88%E6%97%A5%E8%AA%8C/</link><pubDate>Thu, 30 Jun 2022 11:00:42 +0000</pubDate><guid>https://quietbo.com/2022/06/30/python-%E6%97%A5%E8%AA%8C%E6%8C%89%E5%A4%A9%E5%88%86%E5%89%B2%EF%BC%8C%E4%BF%9D%E5%AD%98%E8%BF%91%E4%B8%80%E5%80%8B%E6%9C%88%E6%97%A5%E8%AA%8C/</guid><description>&lt;p&gt;下方為code, 請根據自己需求去做調整, 主要是存放的路徑與log內的訊息格式&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import datetime
import logging
import os
import pathlib
import re
from logging.handlers import TimedRotatingFileHandler


path = os.path.join(pathlib.Path(__file__).parent.absolute(), 'log')
log_folder_path = os.path.join(pathlib.Path(__file__).parent.parent.parent, 'log') # 與service同層, 自行調整parent的次數,

try:
 if not os.path.isdir(log_folder_path): # 如果日誌資料夾不存在，則建立資料夾
 os.mkdir(log_folder_path)
except Exception:
 print("建立資料夾失敗,資料夾路徑：" + log_folder_path)
 pass

log_name = 'serverlog' # 自訂log檔名稱
logger = logging.getLogger(log_name)

log_filename = datetime.datetime.now().strftime("%Y-%m-%d.log")
log_path = os.path.join(log_folder_path, log_name)
logger.setLevel(logging.DEBUG)

# when: 為一天, backupCount: 30個log檔案
file_handler = TimedRotatingFileHandler(
 filename=log_path, when="MIDNIGHT", interval=1, backupCount=30
)
file_handler.suffix = "%Y-%m-%d.log" # 可自訂
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$") # 刪除過期log檔


# format_2 = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'

# 可自訂想要的格式, 或是網路上提供的, 像format_2就給的訊息很多, 但本身不需要那麼多訊息可以自己訂些簡單的
file_handler.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)1.4s: %(module)s:%(lineno)d %(message)s'))
logger.addHandler(file_handler)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檔案名稱如下, 名稱會照file_handler.suffix做修正。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9v6ifxz.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Docker] 80port被佔用。Error response from daemon: driver failed programming external connectivity on endpoint cranky_banzai(解決)</title><link>https://quietbo.com/2022/06/07/docker-80port%E8%A2%AB%E4%BD%94%E7%94%A8%E3%80%82error-response-from-daemon-driver-failed-programming-external-connectivity-on-endpoint-cranky_banzai%E8%A7%A3%E6%B1%BA/</link><pubDate>Tue, 07 Jun 2022 10:23:23 +0000</pubDate><guid>https://quietbo.com/2022/06/07/docker-80port%E8%A2%AB%E4%BD%94%E7%94%A8%E3%80%82error-response-from-daemon-driver-failed-programming-external-connectivity-on-endpoint-cranky_banzai%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;當我在docker創建containerd時, 出現被佔用訊息, 如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker: Error response from daemon: driver failed programming external connectivity on endpoint cranky_banzai (6e53d887b7e49120d6eb6d061196c5f4edd36e5527a9554dfed718184081a0a2): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;網路上很多都是把docker restart就解決了, 如果沒解決, 可能是被其他佔用了。&lt;/p&gt;
&lt;p&gt;執行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;netstat | grep 80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;沒看到80被佔用。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/7pG0p48.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;netstat -tulpn | grep :80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Not all processes could be identified, non-owned process info&lt;br&gt;
will not be shown, you would have to be root to see it all.)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tcp6 0 0 :::80 :::* LISTEN -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起來是有東西, 但必須使用root才能知道是什麼，切換成root後再看一次&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo su -
netstat -tulpn | grep :80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到是LISTEN 858230/apache2&lt;br&gt;
因為我沒有在使用apache2所以我就先停掉。&lt;/p&gt;
&lt;img decoding="async" src="https://i.imgur.com/HyPa2tQ.png" alt="" /&gt; 
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo /etc/init.d/apache2 stop&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image is-style-default"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/d4sSrIr.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;離開root&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再執行一次docker run -d -p 80:80 nginx&lt;br&gt;
成功解決這次被佔用問題!&lt;/p&gt;</description></item><item><title>[Docker] 建立群組 – Got permission denied while trying to connect to the Docker daemon socket at unix(解決)</title><link>https://quietbo.com/2022/06/06/docker-%E5%BB%BA%E7%AB%8B%E7%BE%A4%E7%B5%84-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket-at-unix%E8%A7%A3%E6%B1%BA/</link><pubDate>Mon, 06 Jun 2022 07:43:23 +0000</pubDate><guid>https://quietbo.com/2022/06/06/docker-%E5%BB%BA%E7%AB%8B%E7%BE%A4%E7%B5%84-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket-at-unix%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;環境:linux&lt;/p&gt;
&lt;p&gt;下方錯誤訊息，表示目前的使用者身分沒有權限。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/build?buildargs=%7B%7D&amp;cachefrom=%5B%5D&amp;cgroupparent=&amp;cpuperiod=0&amp;cpuquota=0&amp;cpusetcpus=&amp;cpusetmems=&amp;cpushares=0&amp;dockerfile=Dockerfile&amp;labels=%7B%7D&amp;memory=0&amp;memswap=0&amp;networkmode=default&amp;rm=1&amp;shmsize=0&amp;t=ocms_server&amp;target=&amp;ulimits=null&amp;version=1": dial unix /var/run/docker.sock: connect: permission denied&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解決方式:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 最前方加入sudo(每次都需要加sudo有點麻煩)
 &lt;/li&gt;
 &lt;li&gt;
 將目前使用者加到docker群組裡面(本篇使用的方法)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="建立-docker-群組"&gt;建立 docker 群組
&lt;/h1&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo groupadd docker&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果一開始就已經有群組的話，就則會告知下方訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;groupadd: group 'docker' already exists&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="將非-root-帳號加上-docker-群組中"&gt;將非 root 帳號加上 docker 群組中
&lt;/h2&gt;&lt;p&gt;將連接的用戶”$USER”添加到docker組。&lt;br&gt;
如果不想使用當前用戶，請更改用戶名&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo gpasswd -a $USER docker&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功則返回:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Adding user admins to group docker&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;group 的資訊並不會立刻更新，為了要能立刻產生作用，執行 newgrp docker，&lt;/p&gt;
&lt;p&gt;讓這個帳號立刻改成使用 docker 這個群組 (或是你要登出登入也行)：&lt;br&gt;
執行下方指令, 或注銷/進入以激活對組的更改:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;newgrp docker&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="重新啟動-docker-服務"&gt;重新啟動 docker 服務
&lt;/h1&gt;&lt;p&gt;重啟 docker 服務之後，所有的變動就完成了：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>WSGI &amp; ASGI</title><link>https://quietbo.com/2022/05/08/wsgi-asgi/</link><pubDate>Sun, 08 May 2022 12:46:31 +0000</pubDate><guid>https://quietbo.com/2022/05/08/wsgi-asgi/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/05/08/wsgi-asgi/#%E4%BB%80%E9%BA%BC%E6%98%AF_WSGI" &gt;什麼是 WSGI?&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/05/08/wsgi-asgi/#WSGI_%E8%88%87_WSGI_Server" &gt;WSGI 與 WSGI Server&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-3&amp;quot; href=&amp;quot;https://quietbo.com/2022/05/08/wsgi-asgi/#%E4%BB%80%E9%BA%BC%E6%98%AF_ASGI&amp;quot; &amp;gt;什麼是 ASGI?&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-4&amp;quot; href=&amp;quot;https://quietbo.com/2022/05/08/wsgi-asgi/#%E7%B8%BD%E7%B5%90_WSGI_%E8%88%87_ASGI&amp;quot; &amp;gt;總結: WSGI 與 ASGI&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="什麼是-wsgi"&gt;&lt;span class="ez-toc-section" id="%E4%BB%80%E9%BA%BC%E6%98%AF_WSGI"&gt;&lt;/span&gt;什麼是 WSGI?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Web Server Gateway Interface，的縮寫(Web伺服器閘道器介面)，是一種協議，這個協議制定了一套規則，規定HTTP Request要如何與Application Server溝通。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 WSGI應用是一個單調用、同步接口，即輸入一個請求，返回一個響應，無法支持長連接或者WebSocket
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wsgi-與-wsgi-server"&gt;&lt;span class="ez-toc-section" id="WSGI_%E8%88%87_WSGI_Server"&gt;&lt;/span&gt;WSGI 與 WSGI Server&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;可以將WSGI Server理解成處理 HTTP Request 與 Python 可理解的 Input/Output 的中繼站(Middleware)&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/JFpxNWj.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;所有支援 WSGI 協定的 Server 都可稱為 WSGI Server，現在比較常見的WSGI Server是gunicorn及 uwsgi。&lt;/p&gt;
&lt;h2 id="什麼是-asgi"&gt;&lt;span class="ez-toc-section" id="%E4%BB%80%E9%BA%BC%E6%98%AF_ASGI"&gt;&lt;/span&gt;什麼是 ASGI?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Asynchronous Server Gateway Interface(異步服務器網關接口)
 &lt;/li&gt;
 &lt;li&gt;
 ASGI 是 WSGI 的繼承者，已經存在的WSGI應用可以直接在ASGI服務器中運行
 &lt;/li&gt;
 &lt;li&gt;
 ASGI 代表異步服務器網關接口，是爲異步、同步應用程序提供標準，支持 WSGI 不支持當前 web 開發中的一些新的協議標準
 &lt;/li&gt;
 &lt;li&gt;
 介於網絡協議服務和Python應用之間的標準接口，能夠處理多種通用的協議類型，包括HTTP，HTTP2和WebSocket。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="總結-wsgi-與-asgi"&gt;&lt;span class="ez-toc-section" id="%E7%B8%BD%E7%B5%90_WSGI_%E8%88%87_ASGI"&gt;&lt;/span&gt;總結: WSGI 與 ASGI&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt; &lt;figure class="wp-block-image"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/0b6uf83.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 相同之處:&lt;ul&gt;
 &lt;li&gt;
 WSGI 與 ASGI都指定接口並位於 Web 服務器和 Python Web 應用程序或框架之間。
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;li&gt;
 兩者的區別:&lt;ul&gt;
 &lt;li&gt;
 WSGI是基於HTTP協議模式的，不支持WebSocket
 &lt;/li&gt;
 &lt;li&gt;
 ASGI的誕生則是為了解決Python常用的WSGI不支持當前Web開發中的一些新的協議標準。
 &lt;/li&gt;
 &lt;li&gt;
 ASGI對於WSGI原有的模式的支持和WebSocket的擴展，即ASGI是WSGI的擴展。
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[React|M1] 創建一個React</title><link>https://quietbo.com/2022/04/24/reactm1-%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8Breact/</link><pubDate>Sun, 24 Apr 2022 14:21:02 +0000</pubDate><guid>https://quietbo.com/2022/04/24/reactm1-%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8Breact/</guid><description>&lt;p&gt;Mac M1&lt;/p&gt;
&lt;p&gt;參考&lt;a class="link" href="https://github.com/facebook/create-react-app" target="_blank" rel="noopener"
 &gt;github:create-react-app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;點擊網站來安裝&lt;a class="link" href="https://nodejs.org/en/" target="_blank" rel="noopener"
 &gt;Node.js&lt;/a&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/5YcVEgv.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;查看是否安裝成功&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;node -v
npm -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;創建一個react&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;npx create-react-app react-store&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開剛才創建的react&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;cd react-store
npm start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt; Local: http://localhost:3000
 On Your Network: http://192.168.100.4:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開瀏覽器填入http://localhost:3000/&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/gIAkRbN.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Python] pymysql.err.IntegrityError 解決</title><link>https://quietbo.com/2022/04/15/python-pymysql-err-integrityerror-%E8%A7%A3%E6%B1%BA/</link><pubDate>Fri, 15 Apr 2022 03:19:05 +0000</pubDate><guid>https://quietbo.com/2022/04/15/python-pymysql-err-integrityerror-%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;通常遇到這狀況代表有設定unique的欄位, 被重複了,&lt;br&gt;
而且要新增的一筆資料又與該欄位有重複的值,則會報錯,&lt;/p&gt;
&lt;p&gt;假設我的欄位id已經有202204150012的資料時, 要再增加一筆id是202204150012的資料, 錯誤訊息如下, 會告知是哪個欄位重複與重複的value&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;(pymysql.err.IntegrityError) (1062, "Duplicate entry '202204150012' for key 'tb_order.id'")&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解決方式1:&lt;br&gt;
將該欄位的unique拿掉&lt;/p&gt;
&lt;p&gt;解決方式2:&lt;br&gt;
做異常處理與回滾(rollback)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;try:
 db.commit()
except:
 # 回滾
 db.rollback()
finally:
# 關閉數據庫連接
db.close()&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-preformatted"&gt;解決方式3:例外處理時跳過&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;try:
 .... 
except IntegrityError as error:
 # 獨立處理重複
 result1 = re.search('Duplicate entry', str(error))
 if result1:
 logger.error('Duplicate entry')
 pass
except Exception as error:
 # 其他例外處理 ...
 &lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Pycharm] 導出&amp;導入虛擬環境(venv導出requirements)</title><link>https://quietbo.com/2022/04/06/pycharm-%E5%B0%8E%E5%87%BA%E5%B0%8E%E5%85%A5%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83venv%E5%B0%8E%E5%87%BArequirements/</link><pubDate>Wed, 06 Apr 2022 05:24:22 +0000</pubDate><guid>https://quietbo.com/2022/04/06/pycharm-%E5%B0%8E%E5%87%BA%E5%B0%8E%E5%85%A5%E8%99%9B%E6%93%AC%E7%92%B0%E5%A2%83venv%E5%B0%8E%E5%87%BArequirements/</guid><description>&lt;h2 id="導出虛擬環境"&gt;導出虛擬環境
&lt;/h2&gt;&lt;p&gt;一般命令為導出的是系統環境，不是虛擬環境(venv)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;pip freeze &amp;gt; requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在windows終端下是不可以使用的，使用以下代碼進行導出，運行後會產生requirements.txt&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import os
import platform
import sys
import subprocess

# 當前目錄
project_root = os.path.dirname(os.path.realpath(__file__))
# project_root = os.path.realpath(__file__)
print('當前目錄' + project_root)

# 依據目前使用不同的系統會使用不同的command,目前使用linux及Windows
if platform.system() == 'Linux':
 command = sys.executable + ' -m pip freeze &amp;gt; ' + project_root + '/requirements.txt'
if platform.system() == 'Windows':
 command = '"' + sys.executable + '"' + ' -m pip freeze &amp;gt; "' + project_root + '\\requirements.txt"'
# 生成requirements的命令
print(command)
#
# 執行command
# os.system(command) #路徑有空格時不可用
os.popen(command) # 路徑有空格可用&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="安装requirement"&gt;安装requirement
&lt;/h2&gt;&lt;p&gt;開啟新的專案想使用requirement時，打開終端機輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;pip install -r requirement.txt&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Python|FastAPI] 返回沒有雙引號的字串(返回純文本)PlainTextResponse</title><link>https://quietbo.com/2022/03/31/pythonfastapi-%E8%BF%94%E5%9B%9E%E6%B2%92%E6%9C%89%E9%9B%99%E5%BC%95%E8%99%9F%E7%9A%84%E5%AD%97%E4%B8%B2%E8%BF%94%E5%9B%9E%E7%B4%94%E6%96%87%E6%9C%ACplaintextresponse/</link><pubDate>Thu, 31 Mar 2022 10:26:15 +0000</pubDate><guid>https://quietbo.com/2022/03/31/pythonfastapi-%E8%BF%94%E5%9B%9E%E6%B2%92%E6%9C%89%E9%9B%99%E5%BC%95%E8%99%9F%E7%9A%84%E5%AD%97%E4%B8%B2%E8%BF%94%E5%9B%9E%E7%B4%94%E6%96%87%E6%9C%ACplaintextresponse/</guid><description>&lt;p&gt;問題:&lt;br&gt;
對方是要的訊息Hello World，不是要”Hello World”&lt;/p&gt;
&lt;p&gt;原本的FastAPI寫法如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/")
async def root():
 return "Hello World"

if __name__ == "__main__":
 uvicorn.run("main:app", host="127.0.0.1", port=8000)&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image is-style-default"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/f23g0hl.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;可以看到最常見的postman發的請求得到是”Hello World”&lt;/p&gt;
&lt;p&gt;解決方式:&lt;br&gt;
使用:&lt;a class="link" href="https://fastapi.tiangolo.com/advanced/custom-response/#plaintextresponse" target="_blank" rel="noopener"
 &gt;PlainTextResponse&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from fastapi import FastAPI
import uvicorn
from fastapi.responses import PlainTextResponse

app = FastAPI()


@app.get("/", response_class=PlainTextResponse)
async def root():
 return "Hello World"

if __name__ == "__main__":
 uvicorn.run("main:app", host="127.0.0.1", port=8000)&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image is-style-default"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/VHdSY2i.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;可以看到還滿順利的出現了單純只有文字的Hello World&lt;/p&gt;
&lt;p&gt;不一定要放在response_class，以下方式也能成功:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from fastapi import FastAPI
import uvicorn
from fastapi.responses import PlainTextResponse

app = FastAPI()

def get_text(parameters):
 text = PlainTextResponse(parameters)
 return text


@app.get("/")
async def root():
 op = get_text('hello bocky')
 return op

if __name__ == "__main__":
 uvicorn.run("main:app", host="127.0.0.1", port=8000)&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image is-style-default"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/VpbKCPd.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Python] ‘cryptography’ package is required for sha256_password or caching_sha2_password auth methods</title><link>https://quietbo.com/2022/03/30/python-cryptography-package-is-required-for-sha256_password-or-caching_sha2_password-auth-methods/</link><pubDate>Wed, 30 Mar 2022 02:56:35 +0000</pubDate><guid>https://quietbo.com/2022/03/30/python-cryptography-package-is-required-for-sha256_password-or-caching_sha2_password-auth-methods/</guid><description>&lt;p&gt;環境:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;windows10
mysql Ver 8.0.28
python3.7, mysql+pymysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;開發時要連線到MySQL時出錯，錯誤訊息如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Xr9yP8Z.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;cryptography' package is required for sha256_password or caching_sha2_password auth methods"
RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;去google才得知:&lt;br&gt;
MySQL 自8.0+ 版本後，默認的身份認證插件由mysql_native_password 變為了caching_sha2_password,&lt;br&gt;
網上提供的作法，有些答案都是去MySQL中更改默認的認證方式，但我不建議這麼做，原因就是未來部屬時，問題仍有可能會再次出現。&lt;/p&gt;
&lt;p&gt;解決方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;pip3 install cryptography&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;密碼學:&lt;br&gt;
什麼是cryptography?可&lt;a class="link" href="https://cryptography.io/en/latest/" target="_blank" rel="noopener"
 &gt;參考連結&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] LinePay串接Online APIs – 問題 (5/5)</title><link>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%95%8F%E9%A1%8C-5-5/</link><pubDate>Mon, 14 Mar 2022 05:44:59 +0000</pubDate><guid>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%95%8F%E9%A1%8C-5-5/</guid><description>&lt;div class="wp-block-image is-style-default"&gt;
 &lt;figure class="aligncenter size-full is-resized"&gt;&lt;img loading="lazy" decoding="async" src="https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM.png" alt="" class="wp-image-793" width="334" height="119" srcset="https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM.png 334w, https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM-300x107.png 300w" sizes="auto, (max-width: 334px) 100vw, 334px" /&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 linepay v2 的Payment-check api 在&lt;a href="chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/viewer.html?pdfurl=http%3A%2F%2Fwww.hrp.scu.edu.tw%2F.upload%2Fdissertation%2F1498720302032.pdf&amp;clen=3977681&amp;chunk=true"&gt;LINE Pay: Overview&lt;/a&gt;這邊找到的,僅供測試用。
 &lt;/li&gt;
 &lt;li&gt;
 建議開發使用新的版本，目前v3。
 &lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Python] LinePay串接Online APIs – 串接v3(含code) (4/5)</title><link>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E4%B8%B2%E6%8E%A5v3%E5%90%ABcode-4-5/</link><pubDate>Mon, 14 Mar 2022 05:38:31 +0000</pubDate><guid>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E4%B8%B2%E6%8E%A5v3%E5%90%ABcode-4-5/</guid><description>&lt;p&gt;以下測試環境及工具使用:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 windows 10
 &lt;/li&gt;
 &lt;li&gt;
 Sandbox
 &lt;/li&gt;
 &lt;li&gt;
 linePay文檔
 &lt;/li&gt;
 &lt;li&gt;
 python 3.7
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下使用Request API-&amp;gt; Check Payment Status API -&amp;gt; Confirm API。&lt;/p&gt;
&lt;p&gt;操作流程如下:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 channel_id 填入自己的channel id
 &lt;/li&gt;
 &lt;li&gt;
 channel_secret 填入自己的channel secret
 &lt;/li&gt;
 &lt;li&gt;
 開啟瀏覽器貼上付款web_url
 &lt;/li&gt;
 &lt;li&gt;
 付款成功後將最下方的transaction_id填上
 &lt;/li&gt;
 &lt;li&gt;
 重新運行
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import time
import json
import requests
import hashlib
import hmac
import base64


def get_auth_signature (secret, uri, body, nonce):
 """
 用於製作密鑰
 :param secret: your channel secret
 :param uri: uri
 :param body: request body
 :param nonce: uuid or timestamp(時間戳)
 :return:
 """
 str_sign = secret + uri + body + nonce
 return base64.b64encode(hmac.new(str.encode(secret), str.encode(str_sign), digestmod=hashlib.sha256).digest()).decode("utf-8")

channel_id = "your channel id"
channel_secret = "your channel secret"
uri = "/v3/payments/request"
nonce = str(round(time.time() * 1000)) # nonce = str(uuid.uuid4())
transaction_id = ''

headers = {
 'Content-Type': 'application/json',
 'X-LINE-ChannelId': channel_id,
 'X-LINE-Authorization-Nonce': nonce,
}

def do_request_payment():
 '''此api僅使用文檔中必填的資料'''
 request_options = {
 "amount": 2000,
 "currency": 'TWD',
 "orderId": nonce,
 "packages": [{
 "id": '20220314I001',
 "amount": 2000,
 "name": '鬼滅之刃公仔',
 "products": [{
 "name": '竈門禰豆子',
 "quantity": 1,
 "price": 1000
 },{
 "name": '我妻善逸',
 "quantity": 1,
 "price": 1000
 }]
 }],
 "redirectUrls": {
 "confirmUrl": 'https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%95%8f%e9%a1%8c-5-5/',
 "cancelUrl": 'https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/'
 }
 }
 json_body = json.dumps(request_options)


 headers['X-LINE-Authorization-Nonce'] = nonce
 headers['X-LINE-Authorization'] = get_auth_signature(channel_secret, uri, json_body, nonce)
 response = requests.post("https://sandbox-api-pay.line.me"+uri, headers=headers, data=json_body)
 print(response.text)
 dict_response = json.loads(response.text)

 if dict_response.get('returnCode') == "0000":
 info = dict_response.get('info')
 web_url = info.get('paymentUrl').get('web')
 transaction_id = str(info.get('transactionId'))
 print(f"付款web_url:{web_url}")
 print(f"交易序號:{transaction_id}")

def do_checkout(transaction_id):
 print("transaction_id={}".format(transaction_id))

 conf_data = """{"amount": 2000, "currency": "TWD"}"""
 checkout_url = f"/v3/payments/requests/{transaction_id}/check"
 headers['X-LINE-Authorization'] = get_auth_signature(channel_secret, checkout_url, conf_data, nonce)
 response = requests.get("https://sandbox-api-pay.line.me"+checkout_url, headers=headers, data=conf_data)
 print(response.text)
 response = json.loads(response.text)
 if str(response.get('returnCode')) == "0110":
 return True
 return False

def do_confirm(transaction_id):

 con_url = f"/v3/payments/{transaction_id}/confirm"
 conf_data = """{"amount": 2000, "currency": "TWD"}"""
 headers['X-LINE-Authorization'] = get_auth_signature(channel_secret, con_url, conf_data, nonce)
 response = requests.post("https://sandbox-api-pay.line.me"+con_url, headers=headers, data=conf_data)
 print(response.text)
 response = json.loads(response.text)

 return response.get('returnMessage')

if __name__ == "__main__":
 do_request_payment() # 向linepay請求付款

 # 填入已付款後的交易序號後下方註解拿掉
 # transaction_id = "your transaction_id" # ex: transaction_id = 2022031400707390210
 # status = do_checkout(transaction_id) # 檢查訂單狀態
 # if status == True:
 # print(do_confirm(transaction_id)) # 確認訂單&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Python] LinePay串接Online APIs – 後台查看 (3/5)</title><link>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%BE%8C%E5%8F%B0%E6%9F%A5%E7%9C%8B-3-5/</link><pubDate>Sun, 13 Mar 2022 17:23:22 +0000</pubDate><guid>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%BE%8C%E5%8F%B0%E6%9F%A5%E7%9C%8B-3-5/</guid><description>&lt;figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex"&gt; &lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="334" height="119" data-id="793" src="https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM.png" alt="" class="wp-image-793" srcset="https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM.png 334w, https://quietbo.com/uploads/2022/03/chrome_iLlqqg3OhM-300x107.png 300w" sizes="auto, (max-width: 334px) 100vw, 334px" /&gt;&lt;/figure&gt; &lt;/figure&gt; 
&lt;p&gt;&lt;a class="link" href="https://pay.line.me/portal/tw/auth/login#" target="_blank" rel="noopener"
 &gt;linepay測試用後台&lt;/a&gt;&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/K45uiot.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;登入後找右上角的「測試環境」&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ALTOU8d.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;右上角可將語言轉成繁體中文&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/vmLeYqM.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;左方管理交易-&amp;gt;交易紀錄，可以查看到之前的交易紀錄:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/31RxWwk.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Python] LinePay串接Online APIs – 初步了解流程及使用postman測試api v2 (2/5)</title><link>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%88%9D%E6%AD%A5%E4%BA%86%E8%A7%A3%E6%B5%81%E7%A8%8B%E5%8F%8A%E4%BD%BF%E7%94%A8postman%E6%B8%AC%E8%A9%A6api-v2-2-5/</link><pubDate>Sun, 13 Mar 2022 17:22:34 +0000</pubDate><guid>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E5%88%9D%E6%AD%A5%E4%BA%86%E8%A7%A3%E6%B5%81%E7%A8%8B%E5%8F%8A%E4%BD%BF%E7%94%A8postman%E6%B8%AC%E8%A9%A6api-v2-2-5/</guid><description>&lt;p&gt;因有些人只想了解linepay的運作方式, 提供一些簡單可使用的方式。&lt;/p&gt;
&lt;p&gt;以下測試環境及工具使用:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Sandbox
 &lt;/li&gt;
 &lt;li&gt;
 postman
 &lt;/li&gt;
 &lt;li&gt;
 linePay文檔
 &lt;/li&gt;
 &lt;li&gt;
 Online APIs 文檔:&lt;a href="https://pay.line.me/tw/developers/apis/onlineApis?locale=zh_TW"&gt;網址&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 按下&lt;a href="https://pay.line.me/documents/online_v2_en.html"&gt;此處&lt;/a&gt; 查看以前的API文件(v2)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本次postman的簡易流程&lt;br&gt;
簡易流程圖&lt;a class="link" href="https://i.imgur.com/N2ftauj.jpg" target="_blank" rel="noopener"
 &gt;網址&lt;/a&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/N2ftauj.jpg" alt="" /&gt;&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3%e6%b5%81%e7%a8%8b%e5%8f%8a%e4%bd%bf%e7%94%a8postman%e6%b8%ac%e8%a9%a6api-v2-2-5/#%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A" &gt;基本設定&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3%e6%b5%81%e7%a8%8b%e5%8f%8a%e4%bd%bf%e7%94%a8postman%e6%b8%ac%e8%a9%a6api-v2-2-5/#request_%E8%AB%8B%E6%B1%82%E8%A8%82%E5%96%AE" &gt;request 請求訂單&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3%e6%b5%81%e7%a8%8b%e5%8f%8a%e4%bd%bf%e7%94%a8postman%e6%b8%ac%e8%a9%a6api-v2-2-5/#confirm_%E7%A2%BA%E8%AA%8D" &gt;confirm 確認&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3%e6%b5%81%e7%a8%8b%e5%8f%8a%e4%bd%bf%e7%94%a8postman%e6%b8%ac%e8%a9%a6api-v2-2-5/#Check_Payment_Status_%E6%9F%A5%E7%9C%8B%E8%A8%82%E5%96%AE%E7%8B%80%E6%85%8B" &gt;Check Payment Status 查看訂單狀態&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2022/03/14/python-linepay%e4%b8%b2%e6%8e%a5online-apis-%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3%e6%b5%81%e7%a8%8b%e5%8f%8a%e4%bd%bf%e7%94%a8postman%e6%b8%ac%e8%a9%a6api-v2-2-5/#refurnd_%E9%80%80%E6%AC%BE" &gt;refurnd 退款&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="基本設定"&gt;&lt;span class="ez-toc-section" id="%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A"&gt;&lt;/span&gt;基本設定&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;請先下載&lt;a class="link" href="https://www.postman.com/" target="_blank" rel="noopener"
 &gt;postman&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;domain&lt;/strong&gt;(v2測試用)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;https://sandbox-api-pay.line.me/v2/payments&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在現有的&lt;strong&gt;Headers&lt;/strong&gt;添加&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;Content-Type:application/json
X-LINE-ChannelId:商戶的Channel ID
X-LINE-ChannelSecret:商戶的Channel Secret&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/xwo8UJj.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="request-請求訂單"&gt;&lt;span class="ez-toc-section" id="request_%E8%AB%8B%E6%B1%82%E8%A8%82%E5%96%AE"&gt;&lt;/span&gt;request 請求訂單&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;API:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;POST {domain}/request&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Request Body:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "amount": 1,
 "currency": "TWD", 
 "productName": "MyProd",
 "productImageUrl": "https://cimg.cnyes.cool/prod/news/4556115/l/79b7b76238dcaa28d626ec007bff576f.jpg",
 "confirmUrl": "http://127.0.0.1:3000",
 "orderId": "Order202203110011"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Payment Reserve Response:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "returnCode": "0000",
 "returnMessage": "Success.",
 "info": {
 "paymentUrl": {
 "web": "https://sandbox-web-pay.line.me/web/payment/wait?transactionReserveId=WVZub2tRakxRbzk0NWVsa1VMZ1pyTzhOSk00QXJqNXgvbTZIeXZ2NklpL2ZiMHlBUGN4SnJrTG4xVWh6bFA1cg",
 "app": "line://pay/payment/WVZub2tRakxRbzk0NWVsa1VMZ1pyTzhOSk00QXJqNXgvbTZIeXZ2NklpL2ZiMHlBUGN4SnJrTG4xVWh6bFA1cg"
 },
 "transactionId": 2022031100707222710,
 "paymentAccessToken": "785453599850"
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/TRf6Xju.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;取得info.paymentUrl.web後, 使用瀏覽器打開如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/KqzzWBQ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點擊付款:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/96WKw9t.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;付款成功如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/iqFRyLj.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;補充:&lt;br&gt;
為什麼結帳後會原本的網頁會出現下圖?&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/fSpv3o3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;文檔內的說明如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;Merchant's URL that the buyer is redirected to after selecting a payment method and entering the payment password in LINE Pay.
On the redirected URL, Merchant can call Confirm Payment API and complete the payment
LINE Pay passes an additional parameter, "transactionId"

Reference Detailed Explanation and Exceptional Case of ConfirmUrl&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;簡單來說就是:想讓結帳完的顧客看到什麼畫面。&lt;/p&gt;
&lt;h2 id="confirm-確認"&gt;&lt;span class="ez-toc-section" id="confirm_%E7%A2%BA%E8%AA%8D"&gt;&lt;/span&gt;confirm 確認&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;API:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;POST {domain}/{transactionId}/confirm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;https://sandbox-api-pay.line.me/v2/payments/2022031400707322810/confirm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;添加&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;X-LINE-MerchantDeviceType: POS
X-LINE-MerchantDeviceProfileId: DUMMY&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/zX0wqPs.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Request Body:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "amount": 1,
 "currency": "TWD"
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Response成功的Json如下:&lt;br&gt;
(補充:此次訂單是重新發起的新的訂單,所以transactionId與orderId會與上面請求訂單時的資料不一樣, 主要目的是呈現成功的結果)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "returnCode": "0000",
 "returnMessage": "Success.",
 "info": {
 "transactionId": 2022031400707322810,
 "orderId": "dev202203140002",
 "payInfo": [
 {
 "method": "CREDIT_CARD",
 "amount": 1,
 "maskedCreditCardNumber": "************1111"
 }
 ]
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若失敗或是orderId有重複, 則會告知錯誤。&lt;/p&gt;
&lt;h2 id="check-payment-status-查看訂單狀態"&gt;&lt;span class="ez-toc-section" id="Check_Payment_Status_%E6%9F%A5%E7%9C%8B%E8%A8%82%E5%96%AE%E7%8B%80%E6%85%8B"&gt;&lt;/span&gt;Check Payment Status 查看訂單狀態&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;API&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;GET {domain}?transactionId={transactionId}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;https://sandbox-api-pay.line.me/v2/payments?transactionId=2022031400707322810&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Response成功的Json如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "returnCode": "0000",
 "returnMessage": "Success.",
 "info": [
 {
 "transactionId": 2022031400707322810,
 "transactionDate": "2022-03-13T16:11:08Z",
 "transactionType": "PAYMENT",
 "productName": "MyProd",
 "currency": "TWD",
 "payInfo": [
 {
 "method": "CREDIT_CARD",
 "amount": 1
 }
 ],
 "orderId": "dev202203140002"
 }
 ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意:&lt;br&gt;
正常來說是要先檢查是否付款後才執行confirm這支API，但因為v2是需要先進行confirm這支API才有辦法使用，否則會出現:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "returnCode": "1150",
 "returnMessage": "Transaction record not found."
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若是使用v3則可正常先進行Check Payment Status 後再進行確認。&lt;/p&gt;
&lt;h2 id="refurnd-退款"&gt;&lt;span class="ez-toc-section" id="refurnd_%E9%80%80%E6%AC%BE"&gt;&lt;/span&gt;refurnd 退款&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;取消已付款的交易。&lt;/p&gt;
&lt;p&gt;API:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;POST {dimain}/{transactionId}/refund&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Headers&lt;/strong&gt;添加&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;X-LINE-MerchantDeviceType: POS
X-LINE-MerchantDeviceProfileId: DUMMY&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;refundAmount: 退款金額&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "refundAmount": 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Response:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="json" class="language-json line-numbers"&gt;{
 "returnCode": "0000",
 "returnMessage": "Success.",
 "info": {
 "refundTransactionId": 2022031400707327211,
 "refundTransactionDate": "2022-03-13T17:05:50Z"
 }
}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Python] LinePay串接Online APIs – 申請測試帳號 (1/5)</title><link>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E7%94%B3%E8%AB%8B%E6%B8%AC%E8%A9%A6%E5%B8%B3%E8%99%9F-1-5/</link><pubDate>Sun, 13 Mar 2022 17:17:51 +0000</pubDate><guid>https://quietbo.com/2022/03/14/python-linepay%E4%B8%B2%E6%8E%A5online-apis-%E7%94%B3%E8%AB%8B%E6%B8%AC%E8%A9%A6%E5%B8%B3%E8%99%9F-1-5/</guid><description>&lt;p&gt;以下測試環境使用:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Sandbox
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一創建sandbox帳號"&gt;一、創建Sandbox帳號
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://pay.line.me/tw/developers/techsupport/sandbox/testflow?locale=zh_TW" target="_blank" rel="noopener"
 &gt;測試流程文件網址&lt;/a&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 LinePay建立Sandbox:&lt;a href="https://pay.line.me/tw/developers/techsupport/sandbox/testflow?locale=zh_TW"&gt;Sandbox網址&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 正式LinePay商戶請使用:&lt;a href="https://pay.line.me/portal/tw/main?isFooterConventionChanged=true"&gt;網址&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;填入下方訊息, 及使用中的信箱, 此處我是使用與line相同的信箱，若是以有相同信箱會跳出:此email已註冊過Sandbox ID。請輸入其他email以註冊Sandbox。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/wxZlyNd.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;創建成功如下圖(有興趣可自行點擊後查看)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/TyR7AIv.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="二收信並登入商家"&gt;二、收信並登入商家
&lt;/h2&gt;&lt;p&gt;到信箱收信如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/agbkGVt.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;使用剛才收到的來登入Merchant Center:&lt;a class="link" href="https://pay.line.me/portal/tw/auth/login#" target="_blank" rel="noopener"
 &gt;網址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用收到的測試帳號及密碼登入&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ABRSthV.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="三取得channel-id及channel-secret-key"&gt;三、取得Channel ID及Channel Secret Key &lt;figure class="wp-block-image"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/xVp3hpJ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;紅框內的要保留好, 不要外流。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/hcN9p8I.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;補充:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Sandbox: 指測試帳號的url及後台等等環境
v2/v3指的是在串接api時的linepay版本&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[SQL] REFERENCES 外來鍵的用法(含範例與mysql)</title><link>https://quietbo.com/2022/03/01/sql-references-%E5%A4%96%E4%BE%86%E9%8D%B5%E7%9A%84%E7%94%A8%E6%B3%95%E5%90%AB%E7%AF%84%E4%BE%8B%E8%88%87mysql/</link><pubDate>Tue, 01 Mar 2022 07:20:41 +0000</pubDate><guid>https://quietbo.com/2022/03/01/sql-references-%E5%A4%96%E4%BE%86%E9%8D%B5%E7%9A%84%E7%94%A8%E6%B3%95%E5%90%AB%E7%AF%84%E4%BE%8B%E8%88%87mysql/</guid><description>&lt;p&gt;下方演示: MySQL&lt;br&gt;
GUI: &lt;a class="link" href="https://tableplus.com/" target="_blank" rel="noopener"
 &gt;tabPlus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在學習SQL時一定會學到外來鍵，外來鍵的目的是&lt;strong&gt;確定資料的參考完整性(referential integrity)&lt;/strong&gt;，簡單來說，就是&lt;strong&gt;只有被准許的資料值才會被存入資料庫內&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下方以一個生活例子來舉例:&lt;br&gt;
1個頻道(電視台)會依據不同時間有不同節目，當然&lt;strong&gt;沒有頻道就不會有節目撥出&lt;/strong&gt;，也就是一對多。如下圖:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/hP9x7EB.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;頻道:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;CREATE TABLE `channel` (
 `id` int PRIMARY KEY,
 `channel_name` varchar(255) NOT NULL
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;節目:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;CREATE TABLE `programme` (
 `id` int PRIMARY KEY AUTO_INCREMENT,
 `channel_id` int,
 `programme_name` varchar(255),
 `start_time` datetime DEFAULT (now()),
 `end_time` datetime DEFAULT (now()),
 FOREIGN KEY(channel_id) REFERENCES channel(id)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入資料1:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;INSERT INTO `channel` (`id`, `channel_name`) VALUES
(7, '恩恩新聞'),
(8, '探索世界'),
(9, '東西購物');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入資料2:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;INSERT INTO `programme` (`channel_id`, `programme_name`, `start_time`, `end_time`) VALUES
(7, '3點新聞', '2022-03-01 15:00:00', '2022-03-01 16:00:00'),
(7, '4點新聞', '2022-03-01 16:00:00', '2022-03-01 17:00:00'),
(7, '5點新聞', '2022-03-01 17:00:00', '2022-03-01 18:00:00'),
(8, '說書人', '2022-03-01 15:00:00', '2022-03-01 16:00:00'),
(8, '科學時間', '2022-03-01 16:00:00', '2022-03-01 17:00:00'),
(8, '海底裡', '2022-03-01 17:00:00', '2022-03-01 18:00:00'),
(9, '3點購物時間', '2022-03-01 15:00:00', '2022-03-01 16:00:00'),
(9, '4點購物時間', '2022-03-01 16:00:00', '2022-03-01 17:00:00'),
(9, '5點購物時間', '2022-03-01 17:00:00', '2022-03-01 18:00:00'),&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嘗試當加入一筆沒有在channel內的id&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;INSERT INTO `programme` (`channel_id`, `programme_name`, `start_time`, `end_time`) VALUES
(10, '一起出去玩', '2022-03-01 17:00:00', '2022-03-01 18:00:00');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;錯誤訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=""&gt;Cannot add or update a child row: a foreign key constraint fails (`general`.`programme`, CONSTRAINT `programme_ibfk_1` FOREIGN KEY (`channel_id`) REFERENCES `channel` (`id`))&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/X796Vf2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;補充&lt;/p&gt;
&lt;p&gt;當表已經建立完畢後，設置外來鍵:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=""&gt;ALTER TABLE `programme` ADD FOREIGN KEY (`channel_id`) REFERENCES `channel` (`id`);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可參考:&lt;a rel="noreferrer noopener" href="https://www.fooish.com/sql/foreign-key-constraint.html" data-type="URL" data-id="https://www.fooish.com/sql/foreign-key-constraint.html" target="_blank"&gt;fooish&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[windows] 一鍵解決Docker Desktop報錯WSL 2 installation is incomplete的問題(已解決)</title><link>https://quietbo.com/2022/02/22/windows-%E4%B8%80%E9%8D%B5%E8%A7%A3%E6%B1%BAdocker-desktop%E5%A0%B1%E9%8C%AFwsl-2-installation-is-incomplete%E7%9A%84%E5%95%8F%E9%A1%8C%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Tue, 22 Feb 2022 06:34:54 +0000</pubDate><guid>https://quietbo.com/2022/02/22/windows-%E4%B8%80%E9%8D%B5%E8%A7%A3%E6%B1%BAdocker-desktop%E5%A0%B1%E9%8C%AFwsl-2-installation-is-incomplete%E7%9A%84%E5%95%8F%E9%A1%8C%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;電腦使用的wsl2版本老了, 需要自己手動更新, 可點擊下圖提示, 去微軟官網下載最新版的wsl2安裝後即可正常打開。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/KdW085I.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;下載安裝:&lt;a class="link" href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" target="_blank" rel="noopener"
 &gt;下載&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python 3.6] f-Strings (字串雙引號前加f)</title><link>https://quietbo.com/2022/02/21/python-3-6-f-strings-%E5%AD%97%E4%B8%B2%E9%9B%99%E5%BC%95%E8%99%9F%E5%89%8D%E5%8A%A0f/</link><pubDate>Mon, 21 Feb 2022 07:03:38 +0000</pubDate><guid>https://quietbo.com/2022/02/21/python-3-6-f-strings-%E5%AD%97%E4%B8%B2%E9%9B%99%E5%BC%95%E8%99%9F%E5%89%8D%E5%8A%A0f/</guid><description>&lt;p&gt;Python 3.6之前式字串格式化:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;str.format()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;處理多個引數和更長的字串時，程式碼很冗長&lt;/p&gt;
&lt;p&gt;f-Strings 比 %-formatting 和 str.format()更輕鬆，且更快。&lt;br&gt;
大小寫f都可以使用:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="basic" class="language-basic"&gt;&amp;gt;&amp;gt;&amp;gt; name = "Bocky"
&amp;gt;&amp;gt;&amp;gt; age = 18
&amp;gt;&amp;gt;&amp;gt; f"name={name}, age={age}"
'name=Bocky, age=18'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以運算:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;&amp;gt;&amp;gt;&amp;gt; f"{2*100}"
'200'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用function:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;&amp;gt;&amp;gt;&amp;gt; def to_lowercase(input):
... return input.lower()
...
&amp;gt;&amp;gt;&amp;gt; name = "BOCKY"
&amp;gt;&amp;gt;&amp;gt; f"{to_lowercase(name)} is funny."
'bocky is funny.'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.python.org/3/reference/lexical_analysis.html#f-strings" target="_blank" rel="noopener"
 &gt;文檔:2.4.3. Formatted string literals&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://iter01.com/585538.html" target="_blank" rel="noopener"
 &gt;參考2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python] 不打印轉義字符串，字串不轉義處理(\t\f)</title><link>https://quietbo.com/2022/02/17/python-%E4%B8%8D%E6%89%93%E5%8D%B0%E8%BD%89%E7%BE%A9%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%AD%97%E4%B8%B2%E4%B8%8D%E8%BD%89%E7%BE%A9%E8%99%95%E7%90%86tf/</link><pubDate>Thu, 17 Feb 2022 07:26:33 +0000</pubDate><guid>https://quietbo.com/2022/02/17/python-%E4%B8%8D%E6%89%93%E5%8D%B0%E8%BD%89%E7%BE%A9%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E5%AD%97%E4%B8%B2%E4%B8%8D%E8%BD%89%E7%BE%A9%E8%99%95%E7%90%86tf/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 在轉義字符前多加一個\
 &lt;/li&gt;
 &lt;li&gt;
 字符串前面加上&amp;#8217;r&amp;#8217;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;print('123\n123\t123')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;123
123 123&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在轉義字符前多加一個（\）&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;print('123\\n123\\t123')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;123\n123\t123&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用r，整個字串不轉義&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;print(r'123\n123\t123')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;123\n123\t123&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="範例.wp-block-heading"&gt;範例
&lt;/h2&gt;&lt;p&gt;最需要注意的是，如果再windows下，如果不使用r，使用\t會出現下圖&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;C:\\Dev\\mytoolbox\\myfile\\testfile.txt&lt;/code&gt;&lt;/pre&gt;
&lt;img decoding="async" src="https://i.imgur.com/SCoKLFT.png" alt="" /&gt; 
會發現\t變成一個tab的功能，但若使用r的話即可解決</description></item><item><title>[Redis] 發佈(publish)&amp;訂閱(subscribe)</title><link>https://quietbo.com/2022/02/14/redis-%E7%99%BC%E4%BD%88publish%E8%A8%82%E9%96%B1subscribe/</link><pubDate>Mon, 14 Feb 2022 10:51:45 +0000</pubDate><guid>https://quietbo.com/2022/02/14/redis-%E7%99%BC%E4%BD%88publish%E8%A8%82%E9%96%B1subscribe/</guid><description>&lt;p&gt;環境:Windows 10&lt;br&gt;
Redis: 5.0.7&lt;/p&gt;
&lt;p&gt;Redis發布訂閱(pub/sub) 是一種消息通信模式：發送者(pub) 發送消息，訂閱者(sub) 接收消息。&lt;/p&gt;
&lt;h2 id="範例.wp-block-heading"&gt;範例
&lt;/h2&gt;&lt;p&gt;創建了訂閱頻道名為runoobChat&lt;br&gt;
訂閱之後就無法在進行操作，只能點擊Stop Subscribe&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/pGIes6o.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;開新的GUI連到redis內，查看訂閱數:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pubsub numsub channel_name &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回頻道訂閱者的數量:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/5ibVYq8.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;channels可創建多個，且可同時被多個client訂閱，client可訂閱多個channels(如下圖)&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/hSH0f5U.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="jsx" class="language-jsx"&gt;subscribe channel_name # 訂閱1個channel
subscribe channel_name_1 channel_name_2 # 訂閱多個channel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;將信息發送到指定的頻道，下方是runoobChat發送訊息出去給所有訂閱者。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;publish runoobChat "發送的訊息" &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖是我開啟3個redis，前面2個是client，最右方的是server，發送訊息給訂閱runoobChat這個channel的client。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/SjxSEMt.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://redis.io/topics/pubsub" target="_blank" rel="noopener"
 &gt;Redis文檔&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://www.runoob.com/redis/redis-pub-sub.html" target="_blank" rel="noopener"
 &gt;Redis 發布訂閱&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Windows|安裝] Another Redis Desktop Manager</title><link>https://quietbo.com/2022/02/07/windows%E5%AE%89%E8%A3%9D-another-redis-desktop-manager/</link><pubDate>Mon, 07 Feb 2022 10:27:56 +0000</pubDate><guid>https://quietbo.com/2022/02/07/windows%E5%AE%89%E8%A3%9D-another-redis-desktop-manager/</guid><description>&lt;p&gt;環境:windows10&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/qishibo/AnotherRedisDesktopManager" target="_blank" rel="noopener"
 &gt;github網址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;通過winget來完成:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;winget install qishibo.AnotherRedisDesktopManager&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/PmIBnCD.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;安裝完成後:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/nagDtzr.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;點選New Connection，填入自己的IP,Port號,密碼等&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/xuvrecS.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[docker-compose] 環境設置</title><link>https://quietbo.com/2022/02/03/docker-compose-%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE/</link><pubDate>Thu, 03 Feb 2022 13:08:42 +0000</pubDate><guid>https://quietbo.com/2022/02/03/docker-compose-%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE/</guid><description>&lt;p&gt;主要docker-compose.yml檔案不要直接暴露redis的密碼。&lt;/p&gt;
&lt;h2 id="使用-env設置密碼範例.wp-block-heading"&gt;使用.env設置密碼範例
&lt;/h2&gt;&lt;p&gt;下方為目錄結構:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/1mLAJkZ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;以下為docker-compose.yml檔內容&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask:
 build:
 context: ./flask
 dockerfile: Dockerfile
 image: flask-demo:latest
 environment:
 - REDIS_HOST=redis-server
 - REDIS_PASS=${REDIS_PASS}
 networks:
 - backend
 - frontend

 redis-server:
 image: redis:latest
 command: redis-server --requirepass ${REDIS_PASS}
 networks:
 - backend

 nginx:
 image: nginx:stable-alpine
 ports:
 - 8000:80
 depends_on:
 - flask
 volumes:
 - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
 - ./var/log/nginx:/var/log/nginx
 networks:
 - frontend

networks:
 backend:
 frontend:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.env檔&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;REDIS_PASS=ABC123&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.gitignore檔(用於不要上傳到git上)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.env&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看目前設置內容:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose config&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="指定路徑的方式.wp-block-heading"&gt;指定路徑的方式
&lt;/h2&gt;&lt;p&gt;若不使用.env檔，想使用其他路徑下的檔案，改成myenv的檔名，下指令&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker-compose --env-file myenv config
docker-compose --env-file myenv up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;則可正常執行。&lt;/p&gt;</description></item><item><title>[docker-compose] 服務的更新</title><link>https://quietbo.com/2022/02/02/docker-compose-%E6%9C%8D%E5%8B%99%E7%9A%84%E6%9B%B4%E6%96%B0/</link><pubDate>Tue, 01 Feb 2022 18:11:04 +0000</pubDate><guid>https://quietbo.com/2022/02/02/docker-compose-%E6%9C%8D%E5%8B%99%E7%9A%84%E6%9B%B4%E6%96%B0/</guid><description>&lt;h2 id="服務更新.wp-block-heading"&gt;服務更新
&lt;/h2&gt;&lt;p&gt;下方為目錄結構:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ tree 
.
├── docker-compose.yml
└── my_flask
 ├── app.py
 └── dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;app.py檔如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
 redis.incr('hits')
 return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-compose.yml檔內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build: ./my_flask
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在該目錄下執行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會創建2個容器，一個是flask-demo，一個是redis，開起瀏覽器輸入127.0.0.1:8899，會看到下方字串(隨著開啟次數會累加):&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Hello Container World! I have been seen 1 times and my hostname is b895a0c7b962.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若有更新app.py內的code，重新build一次flask，下方為演示的訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker-compose up -d --build
Building flask-demo
[+] Building 5.9s (10/10) FINISHED 
 =&amp;gt; [internal] load build definition from Dockerfile 0.0s
 =&amp;gt; =&amp;gt; transferring dockerfile: 37B 0.0s
 =&amp;gt; [internal] load .dockerignore 0.0s
 =&amp;gt; =&amp;gt; transferring context: 2B 0.0s
 =&amp;gt; [internal] load metadata for docker.io/library/python:3.9.5-slim 5.8s
 =&amp;gt; [auth] library/python:pull token for registry-1.docker.io 0.0s
 =&amp;gt; [internal] load build context 0.0s
 =&amp;gt; =&amp;gt; transferring context: 395B 0.0s
 =&amp;gt; [1/4] FROM docker.io/library/python:3.9.5-slim@sha256:9828573e6a0b02b6d0ff0bae0716b027aa21cf8e59ac18a76724d216bab7ef04 0.0s
 =&amp;gt; CACHED [2/4] RUN pip install flask redis &amp;&amp; groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; mkdir /src &amp;&amp; chown -R 0.0s
 =&amp;gt; [3/4] COPY app.py /src/app.py 0.0s
 =&amp;gt; [4/4] WORKDIR /src 0.0s
 =&amp;gt; exporting to image 0.0s
 =&amp;gt; =&amp;gt; exporting layers 0.0s
 =&amp;gt; =&amp;gt; writing image sha256:cc1bafcde9c602150db215976497c20a13db386bdbfeecf41d84e36ed77286e9 0.0s
 =&amp;gt; =&amp;gt; naming to docker.io/library/flask_demo:latest 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
redis-demo is up-to-date
Recreating mydocker_flask-demo_1 ... done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看容器狀況，會發現原本的redis沒有被重構，只有因修改了app.py後重建的flask-demo，畫面如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/jTeoXcD.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="刪除服務.wp-block-heading"&gt;刪除服務
&lt;/h2&gt;&lt;p&gt;將原本的docker-compose.yml檔新增一個busbox:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build: ./my_flask
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

 busybox:
 image: busybox:latest
 command: sh -c "while true; do sleep 3600; done"
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在剛才已有兩個容器的狀況下，再下一次指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Z5Bn8Te.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;在已經建立3個容器的狀況下，將yml檔的busbox註解掉，再重新下一次指令，會出現一段WARNING的訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;WARNING: Found orphan containers (mydocker_busybox_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Wf3b6zu.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;使用剛才建議的指令，來刪除不需要的service&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d --remove-orphans&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/QsCEeSA.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;三個更新文件指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=" line-numbers"&gt;docker-compose build # 只build dockerfile 的image
docker-compose up -d --remove-orphans # 刪除不需要使用的service
docker-compose restart # 重啟&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[docker-compose] image build與pull(build非dockerfile名稱)</title><link>https://quietbo.com/2022/02/01/docker-compose-image-build%E8%88%87pullbuild%E9%9D%9Edockerfile%E5%90%8D%E7%A8%B1/</link><pubDate>Tue, 01 Feb 2022 13:52:15 +0000</pubDate><guid>https://quietbo.com/2022/02/01/docker-compose-image-build%E8%88%87pullbuild%E9%9D%9Edockerfile%E5%90%8D%E7%A8%B1/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B" &gt;目錄結構&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_image_buildpull%E7%9A%84%E6%8C%87%E4%BB%A4%E5%B7%AE%E7%95%B0" &gt;docker-compose image build/pull的指令差異&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_build" &gt;docker-compose build&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_pull" &gt;docker-compose pull&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-5&amp;quot; href=&amp;quot;https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#%E9%83%A8%E5%88%86%E5%9F%BA%E7%A4%8E%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8&amp;quot; &amp;gt;部分基礎的命令行基本使用&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="目錄結構.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B"&gt;&lt;/span&gt;目錄結構&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;當要build的image名稱不是dockerfile時，是其他名稱，且在不同路徑下，例如：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.
├── docker-compose.yml
└── my_flask
 ├── app.py
 └── dockerfile.data&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 build: 要build的指令：&lt;ul&gt;
 &lt;li&gt;
 context: 檔案路徑
 &lt;/li&gt;
 &lt;li&gt;
 dockerfile: 檔案名稱
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;app.py檔如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
 redis.incr('hits')
 return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker_compose.yml檔如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build:
 context: ./my_flask
 dockerfile: Dockerfile.data
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功畫面:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9wRyaGQ.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="docker-compose-image-build-pull的指令差異.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_image_buildpull%E7%9A%84%E6%8C%87%E4%BB%A4%E5%B7%AE%E7%95%B0"&gt;&lt;/span&gt;docker-compose image build/pull的指令差異&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;當docker-compose.yml檔內同時有要從dockerfile build的image與從dockerhub pull下來時，這兩種會不同結果&lt;/p&gt;
&lt;h3 id="docker-compose-build.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_build"&gt;&lt;/span&gt;docker-compose build&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;下方是利用docker_compose.yml檔執行的結果，只有build dockerfile，沒有redis image：&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/0WtFnrJ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="docker-compose-pull.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_pull"&gt;&lt;/span&gt;docker-compose pull&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;下方是從dockerhub pull redis，因為dockerfile的關係所以馬上就是done，而pull則需等待下載:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/oM8hTaq.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;可以看到，下方使用pull，只有一個redis的image&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/eeXIX8v.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="部分基礎的命令行基本使用.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="%E9%83%A8%E5%88%86%E5%9F%BA%E7%A4%8E%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8"&gt;&lt;/span&gt;部分基礎的命令行基本使用&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -d: 背景執行
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若想查看log可使用下方兩個指令&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -f :持續動態的查看
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose logs
docker-compose logs -f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看容器目前狀況:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose ps
 Name Command State Ports 
-----------------------------------------------------------------------------------------
my_flask_flask-demo_1 flask run -h 0.0.0.0 Up 0.0.0.0:8899-&amp;gt;5000/tcp
my_flask_redis-server_1 docker-entrypoint.sh redis ... Up 6379/tcp &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意:使用docker-compose ps時，要在yml檔的目錄底下才能使用，否則無法查詢&lt;/p&gt;
&lt;p&gt;將容器停止:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose stop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;將已經停止的容器刪除:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose rm 
Going to remove my_flask_flask-demo_1, my_flask_redis-server_1
Are you sure? [yN] y
Removing my_flask_flask-demo_1 ... done
Removing my_flask_redis-server_1 ... done&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker-compose] Python Flask+Redis(練習2)</title><link>https://quietbo.com/2022/01/31/docker-compose-python-flaskredis%E7%B7%B4%E7%BF%922/</link><pubDate>Mon, 31 Jan 2022 12:28:54 +0000</pubDate><guid>https://quietbo.com/2022/01/31/docker-compose-python-flaskredis%E7%B7%B4%E7%BF%922/</guid><description>&lt;p&gt;yml的基本語法結構:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;services: # 容器
 servicename: # 服務名字，這個名字也是內部 bridge網絡可以使用的 DNS name
 image: # 鏡像的名字
 command: # 可選，如果設置，則會覆蓋默認鏡像裡的 CMD命令
 environment: # 可選，相當於 docker run裡的 --env
 volumes: # 可選，相當於docker run裡的 -v
 networks: # 可選，相當於 docker run裡的 --network
 ports: # 可選，相當於 docker run裡的 -p
 servicename2:

volumes: # 可選，相當於 docker volume create

networks: # 可選，相當於 docker network create&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 services&lt;br /&gt;對照:&lt;a href="https://docs.docker.com/compose/compose-file/"&gt;Compose and Docker compatibility&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 servicename&lt;br /&gt;與前一篇在docker時下指令的&amp;#8211;name flask-demo 一致
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="練習.wp-block-heading"&gt;練習
&lt;/h2&gt;&lt;p&gt;以&lt;a class="link" href="https://quietbo.com/2022/01/22/docker-mac-python-flaskredis%e7%b7%b4%e7%bf%92/" target="_blank" rel="noopener"
 &gt;Python Flask+Redis(練習)&lt;/a&gt;：為例子，改造成一個docker-compose文件&lt;/p&gt;
&lt;p&gt;app.py檔案內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
 return 'hello'


if __name__ == "__main__":
 app.run(debug=True, host='0.0.0.0', port=5000)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-compose.yml內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;version: "3.8"

services:
 flask-demo:
 image: flask-demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 資料結構
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.
├── app.py
├── docker-compose.yml
└── dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 建立2個image
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 下載redis image
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull redis&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 建立flask-demo的image
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image build -t flask-demo .&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 運行docker-compose
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose up 
Creating network "my_flask_demo-network" with the default driver
Creating my_flask_redis-server_1 ... done
Creating my_flask_flask-demo_1 ... done
Attaching to my_flask_redis-server_1, my_flask_flask-demo_1
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-server_1 | 1:M 31 Jan 2022 12:26:05.447 * monotonic clock: POSIX clock_gettime
redis-server_1 | 1:M 31 Jan 2022 12:26:05.448 * Running mode=standalone, port=6379.
redis-server_1 | 1:M 31 Jan 2022 12:26:05.448 # Server initialized
redis-server_1 | 1:M 31 Jan 2022 12:26:05.449 * Ready to accept connections
flask-demo_1 | * Serving Flask app 'app.py' (lazy loading)
flask-demo_1 | * Environment: production
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | Use a production WSGI server instead.
flask-demo_1 | * Debug mode: off
flask-demo_1 | * Running on all addresses.
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | * Running on http://172.25.0.3:5000/ (Press CTRL+C to quit)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開瀏覽器輸入&lt;br&gt;
127.0.0.1:8899&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/pES3Goo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Docker-compose] 安裝</title><link>https://quietbo.com/2022/01/23/docker-compose-%E5%AE%89%E8%A3%9D/</link><pubDate>Sun, 23 Jan 2022 15:01:47 +0000</pubDate><guid>https://quietbo.com/2022/01/23/docker-compose-%E5%AE%89%E8%A3%9D/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 Mac在默認安裝了docker desktop以後，docker-compose隨之自動安裝，直接下指令來查詢目前docker-compose的版本:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 Linux用戶需要自行安裝
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最新版本號可以在這裡查詢:&lt;a class="link" href="https://github.com/docker/compose/releases" target="_blank" rel="noopener"
 &gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 使用python的用戶，可以使用pip去安裝docker-Compose
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pip install docker-compose&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Mac|M1] Port 5000 already in use,Port 5000一直被佔用(已解決)</title><link>https://quietbo.com/2022/01/22/macm1-port-5000-already-in-useport-5000%E4%B8%80%E7%9B%B4%E8%A2%AB%E4%BD%94%E7%94%A8%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Fri, 21 Jan 2022 20:00:38 +0000</pubDate><guid>https://quietbo.com/2022/01/22/macm1-port-5000-already-in-useport-5000%E4%B8%80%E7%9B%B4%E8%A2%AB%E4%BD%94%E7%94%A8%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;再學習docker+flask+redis時遇到一個小問題，就是5000一直被佔用著，但Flask 預設使用 port 5000。&lt;/p&gt;
&lt;p&gt;查詢port 5000是否被佔用:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ sudo lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ControlCe 96400 bocky 36u IPv4 0xb3652d5dff6c5fe3 0t0 TCP *:commplex-main (LISTEN)
ControlCe 96400 bocky 37u IPv6 0xb3652d5dec3e630b 0t0 TCP *:commplex-main (LISTEN)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢結果已經在使用了&lt;/p&gt;
&lt;h2 id="解決方式1"&gt;解決方式1.
&lt;/h2&gt;&lt;p&gt;左上角[系統偏好設定]&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/8Tv4FHr.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;點擊[共享]&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/L7TRWPJ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;將AirPlay接收器關閉。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/umGw5mx.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="解決方式2"&gt;解決方式2.
&lt;/h2&gt;&lt;p&gt;將flask更換其他port號，更換port方式請自行搜尋。&lt;/p&gt;</description></item><item><title>[Docker] Mac -Python Flask+Redis(練習)</title><link>https://quietbo.com/2022/01/22/docker-mac-python-flaskredis%E7%B7%B4%E7%BF%92/</link><pubDate>Fri, 21 Jan 2022 19:48:54 +0000</pubDate><guid>https://quietbo.com/2022/01/22/docker-mac-python-flaskredis%E7%B7%B4%E7%BF%92/</guid><description>&lt;p&gt;環境&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Mac M1
 &lt;/li&gt;
 &lt;li&gt;
 docker:Version 20.10.11
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 建立app.py
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
 redis.incr('hits')
 return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 同一層建立dockerfile
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 image 的準備
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker image pull redis
$ docker image build -t flask-demo .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-demo latest d92f7778af76 9 minutes ago 123MB
redis latest f16c30136ff3 4 weeks ago 107MB&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 創建一個docker bridge
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network create -d bridge demo-network
960a617c97c6a197624c51fc02dbbf9007080662052551296d55b0cc7d5f2ba7
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b2077f8151cb bridge bridge local
caf0f586ef79 demo-network bridge local
d1465da885e1 host host local&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 創建redis container&lt;br /&gt;創建一個叫 redis-server 的container，連到demo-network上
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker container run -d --name redis-server --network demo-network redis
960a617c97c6a197624c51fc02dbbf9007080662052551296d55b0cc7d5f2ba7

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
960a617c97c6 redis "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 6379/tcp redis-server&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 創建flask container
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 打開瀏覽器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;127.0.0.1:5000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會看到下圖，每次刷新頁面，計數加1:ㄋ&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/iCAiHPA.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Hello Container World! I have been seen 2 times and my hostname is a426b16a8d01.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="總結"&gt;總結
&lt;/h2&gt;&lt;p&gt;如果把上面的步驟合併到一起，成為一個部署腳本:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;# prepare image
docker image pull redis
docker image build -t flask-demo .

# create network
docker network create -d bridge demo-network

# create container
docker container run -d --name redis-server --network demo-network redis
docker container run -d --network demo-network --name flask-demo --env REDIS_HOST=redis-server -p 5000:5000 flask-demo&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] –network host, None</title><link>https://quietbo.com/2022/01/17/docker-network-host-none/</link><pubDate>Mon, 17 Jan 2022 15:17:52 +0000</pubDate><guid>https://quietbo.com/2022/01/17/docker-network-host-none/</guid><description>&lt;p&gt;環境：Linux&lt;/p&gt;
&lt;p&gt;注意：&lt;br&gt;
主機網絡驅動程序僅適用於 Linux 主機，不支持 Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server。&lt;/p&gt;
&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/OJh6RUm.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="8211network-host"&gt;–network host
&lt;/h2&gt;&lt;p&gt;創建4個容器:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker run -d --name web1 nginx
docker run -d --name web2 nginx
docker run -d --name web3 nginx
docker run -d --name web4 --network host nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;都是監聽80的port&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/R15HOJ9.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;打開瀏覽器輸入127.0.0.1&lt;br&gt;
能夠成功看到nginx的頁面，而這個頁面是由web4與本地連接的，並非we1,web2,web3，若是想要再創建一個web5，則無法創建。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker run -d --name web5 --network host nginx
docker logs -f web5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原因是80的port已被佔用。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="8211network-none"&gt;–network none
&lt;/h2&gt;&lt;p&gt;無法對內，對外進行通訊&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker exec -it box1 ip a
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue qlen 1000
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
2: tunl0@NONE: &amp;lt;NOARP&gt; mtu 1480 qdisc noop qlen 1000
 link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: &amp;lt;NOARP&gt; mtu 1452 qdisc noop qlen 1000
 link/tunnel6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00

&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] dockerfile端口轉發</title><link>https://quietbo.com/2022/01/17/docker-dockerfile%E7%AB%AF%E5%8F%A3%E8%BD%89%E7%99%BC/</link><pubDate>Mon, 17 Jan 2022 14:21:35 +0000</pubDate><guid>https://quietbo.com/2022/01/17/docker-dockerfile%E7%AB%AF%E5%8F%A3%E8%BD%89%E7%99%BC/</guid><description>&lt;h2 id="pull-image"&gt;pull image
&lt;/h2&gt;&lt;p&gt;先pull兩個image:&lt;br&gt;
python:3.9.5-slim&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker image pull python:3.9.5-slim&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;redis&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker image pull redis&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新增2個dockerfile&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY startup.py /src/startup.py

WORKDIR /src

ENV FLASK_APP=startup.py REDIS_HOST=redis

#EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用上方的dockerfile build image，註解掉EXPOSE的image名為flask-demo：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker image build -t flask-demo .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再建立一個image，這個image只是把EXPOSE 5000打開。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY startup.py /src/startup.py

WORKDIR /src

ENV FLASK_APP=startup.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開EXPOSE的image名為flask-demo-new。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker image build -t flask-demo-new .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立後查看image&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker image inspect flask-demo
docker image inspect flask-demo-new&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;裡面的Config只有flask-demo-new的有多出&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;"ExposedPorts": {
 "5000/tcp": {}
 },&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/jvFogBK.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Python] File “manage.py”, line 17 ) from exc ^ SyntaxError: invalid syntax (已解決)</title><link>https://quietbo.com/2022/01/17/python-file-manage-py-line-17-from-exc-syntaxerror-invalid-syntax-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Mon, 17 Jan 2022 10:27:31 +0000</pubDate><guid>https://quietbo.com/2022/01/17/python-file-manage-py-line-17-from-exc-syntaxerror-invalid-syntax-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;我在env內，有python2.7與python3.8。&lt;br&gt;
當使用 python 運行命令時，Django 無法預測確切的 python 版本。&lt;/p&gt;
&lt;p&gt;執行下列指令後出現錯誤:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;問題訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt; File "manage.py", line 17
 ) from exc
 ^
SyntaxError: invalid syntax&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/nzdZu0Z.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;解決方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python3 manage.py runserver
python3 manage.py runserver 0.0.0.0:8899 # 轉port為8899&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;參考:&lt;a class="link" href="https://stackoverflow.com/questions/42611593/how-to-solve-syntaxerror-on-autogenerated-manage-py" target="_blank" rel="noopener"
 &gt;How to solve SyntaxError on autogenerated manage.py?&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Mac|M1] ModuleNotFoundError: No module named ‘pip._internal.cli.main’ (已解決)</title><link>https://quietbo.com/2022/01/17/macm1-modulenotfounderror-no-module-named-pip-_internal-cli-main-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Mon, 17 Jan 2022 07:01:50 +0000</pubDate><guid>https://quietbo.com/2022/01/17/macm1-modulenotfounderror-no-module-named-pip-_internal-cli-main-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;問題訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ pip install --upgrade pip
Traceback (most recent call last):
 File "/usr/local/bin/pip", line 6, in &amp;lt;module&amp;gt;
 from pip._internal.cli.main import main
ModuleNotFoundError: No module named 'pip._internal.cli.main'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解決方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py --force-reinstall&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Defaulting to user installation because normal site-packages is not writeable
Collecting pip
 Using cached pip-21.3.1-py3-none-any.whl (1.7 MB)
Installing collected packages: pip
 WARNING: The scripts pip, pip3 and pip3.8 are installed in '/Users/bocky/Library/Python/3.8/bin' which is not on PATH.
 Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-21.3.1
WARNING: You are using pip version 19.2.3; however, version 21.3.1 is available.
You should consider upgrading via the '/Applications/Xcode.app/Contents/Developer/usr/bin/python3 -m pip install --upgrade pip' command.&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ZxKs6aB.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;訊息告知建議執行的內容:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;/Applications/Xcode.app/Contents/Developer/usr/bin/python3 -m pip install --upgrade pip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下方為執行結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./Library/Python/3.8/lib/python/site-packages (21.3.1)&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/LwzulX6.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;解決!&lt;/p&gt;</description></item><item><title>[Docker] 容器端口轉發(外部訪問容器)</title><link>https://quietbo.com/2022/01/17/docker-%E5%AE%B9%E5%99%A8%E7%AB%AF%E5%8F%A3%E8%BD%89%E7%99%BC%E5%A4%96%E9%83%A8%E8%A8%AA%E5%95%8F%E5%AE%B9%E5%99%A8/</link><pubDate>Sun, 16 Jan 2022 16:23:13 +0000</pubDate><guid>https://quietbo.com/2022/01/17/docker-%E5%AE%B9%E5%99%A8%E7%AB%AF%E5%8F%A3%E8%BD%89%E7%99%BC%E5%A4%96%E9%83%A8%E8%A8%AA%E5%95%8F%E5%AE%B9%E5%99%A8/</guid><description>&lt;p&gt;容器中可以運行一些網絡應用，要讓外部也可以訪問這些應用，可以通過 -P 或 -p 參數來指定端口映射。&lt;br&gt;
當使用 -P 標記時，Docker 會隨機映射一個端口到內部容器開放的網絡端口。&lt;/p&gt;
&lt;p&gt;使用:Mac M1。&lt;/p&gt;
&lt;p&gt;創建容器，注意port已將80轉出到8888&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker container run -d --rm --name web -p 8888:80 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看IP:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' web
172.17.0.3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;創建image busybox，名為client的容器:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker run -d --rm --name client busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下載web的index.html:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker exec -it client wget http://172.17.0.3
Connecting to 172.17.0.3 (172.17.0.3:80)
saving to 'index.html'
index.html 100% |********************************| 615 0:00:00 ETA
'index.html' saved&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入:ifconfig，查找自己的IP，如下:192.168.1.108&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;en0: flags=8863&amp;lt;UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST&amp;gt; mtu 1500
 options=6463&amp;lt;RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM&amp;gt;
 ether a0:78:17:a6:e9:f5
 inet6 fe80::c75:fc71:85f1:6b48%en0 prefixlen 64 secured scopeid 0xb
 inet 192.168.1.108 netmask 0xffffff00 broadcast 192.168.1.255
 inet6 2001:b011:7:1540:c2b:e11f:4b75:5eed prefixlen 64 autoconf secured
 inet6 2001:b011:7:1540:cc5b:e1c7:11df:d59e prefixlen 64 autoconf temporary
 nd6 options=201&amp;lt;PERFORMNUD,DAD&amp;gt;
 media: autoselect
 status: active&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;開啟瀏覽器輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;192.168.1.108:8888&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會看到nging的頁面&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] 創建容器時指定gateway與subnet</title><link>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%AE%B9%E5%99%A8%E6%99%82%E6%8C%87%E5%AE%9Agateway%E8%88%87subnet/</link><pubDate>Sat, 15 Jan 2022 18:49:32 +0000</pubDate><guid>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%AE%B9%E5%99%A8%E6%99%82%E6%8C%87%E5%AE%9Agateway%E8%88%87subnet/</guid><description>&lt;p&gt;可參考之前的&lt;a href="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/" data-type="URL" data-id="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/"&gt;[Docker] 創建和使用 bridge&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker network create --help

Usage: docker network create [OPTIONS] NETWORK

Create a network

Options:
 --attachable Enable manual container attachment
 --aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
 --config-from string The network from which to copy the configuration
 --config-only Create a configuration only network
 -d, --driver string Driver to manage the Network (default "bridge")
 --gateway strings IPv4 or IPv6 Gateway for the master subnet
 --ingress Create swarm routing-mesh network
 --internal Restrict external access to the network
 --ip-range strings Allocate container ip from a sub-range
 --ipam-driver string IP Address Management Driver (default "default")
 --ipam-opt map Set IPAM driver specific options (default map[])
 --ipv6 Enable IPv6 networking
 --label list Set metadata on a network
 -o, --opt map Set driver specific options (default map[])
 --scope string Control the network's scope
 --subnet strings Subnet in CIDR format that represents a network segment&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker network create -d bridge --gateway 172.200.0.1 --subnet 172.200.0.0/16 demo&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看剛才創建的demo&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker network inspect demo
[
 {
 "Name": "demo",
 "Id": "9a5ccdbfa5b5e9968cedb3a9b66b5714e35eade805582538bde47c187e593df5",
 "Created": "2022-01-15T18:42:53.457025805Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": {},
 "Config": [
 {
 "Subnet": "172.200.0.0/16",
 "Gateway": "172.200.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {},
 "Options": {},
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立box4&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker container run -d --rm --name box4 --network demo busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;將原本的box3新增demo的網路並ping看看有沒有辦法互通&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker network connect demo box3
docker exec -it box4 ping box3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用ip，或是容器名。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/6y7gu0v.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;或是反過來，用box3來pintbox4也是能相通的。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker exec -it box3 ping box4&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] 創建和使用 bridge</title><link>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8-bridge-1/</link><pubDate>Sat, 15 Jan 2022 18:38:33 +0000</pubDate><guid>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8-bridge-1/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/#%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8B%E8%87%AA%E8%A8%82%E5%90%8D%E7%A8%B1%E7%9A%84_docker_network" &gt;建立一個自訂名稱的 docker network&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/#%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8B%E5%AE%B9%E5%99%A8" &gt;創建一個容器&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/#%E8%AE%93%E4%B8%80%E5%80%8B%E5%AE%B9%E5%99%A8%E9%80%A3%E6%8E%A52%E5%80%8B%E7%B6%B2%E8%B7%AF" &gt;讓一個容器連接2個網路&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/01/16/docker-%e5%89%b5%e5%bb%ba%e5%92%8c%e4%bd%bf%e7%94%a8-bridge-1/#%E6%96%B7%E9%96%8B%E5%AE%B9%E5%99%A8%E8%88%87%E7%B6%B2%E7%B5%A1%E7%9A%84%E9%80%A3%E6%8E%A5" &gt;斷開容器與網絡的連接&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="建立一個自訂名稱的-docker-network"&gt;&lt;span class="ez-toc-section" id="%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8B%E8%87%AA%E8%A8%82%E5%90%8D%E7%A8%B1%E7%9A%84_docker_network"&gt;&lt;/span&gt;建立一個自訂名稱的 docker network&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;建立一個自訂名稱的 docker network，這邊取名為mybridge:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker network create -d bridge mybridge&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看目前network的訊息，是否有我們建立的mybridge&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker network ls&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/nnT1EXU.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查看mybridge的資訊。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker network inspect mybridge
[
 {
 "Name": "mybridge",
 "Id": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "Created": "2022-01-15T14:21:30.014726296Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": {},
 "Config": [
 {
 "Subnet": "172.18.0.0/16",
 "Gateway": "172.18.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {},
 "Options": {},
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="創建一個容器"&gt;&lt;span class="ez-toc-section" id="%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8B%E5%AE%B9%E5%99%A8"&gt;&lt;/span&gt;創建一個容器&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;將容器指定network在mybridge&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &amp;#8211;network :後方帶入網路名
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker container run -d --rm --name box3 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看box3的訊息，最下方Networks:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="basic" class="language-basic"&gt;"Networks": {
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/bxWulUI.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;回來查看mybridge，會發現有一個新的容器(box3)資料&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker network inspect mybridge
[
 {
 "Name": "mybridge",
 "Id": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "Created": "2022-01-15T14:21:30.014726296Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": {},
 "Config": [
 {
 "Subnet": "172.18.0.0/16",
 "Gateway": "172.18.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {
 "7ad11d3a4e9c0fff207c329a9beae2fc8060b0110a67dc4a32f133c591be4abb": {
 "Name": "box3",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "MacAddress": "02:42:ac:12:00:02",
 "IPv4Address": "172.18.0.2/16",
 "IPv6Address": ""
 }
 },
 "Options": {},
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="讓一個容器連接2個網路"&gt;&lt;span class="ez-toc-section" id="%E8%AE%93%E4%B8%80%E5%80%8B%E5%AE%B9%E5%99%A8%E9%80%A3%E6%8E%A52%E5%80%8B%E7%B6%B2%E8%B7%AF"&gt;&lt;/span&gt;讓一個容器連接2個網路&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;原本的box1與box2是連接預設的docker0(就是bridge)，而box3是連接mybridge&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b2077f8151cb bridge bridge local
d1465da885e1 host host local
8569e3bba27a mybridge bridge local
91fc3c2b25fb none null local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;讓box3連接bridge網路，再查看一次box3的網路資訊:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker network connect bridge box3
docker inspect box3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原本box3只有一個mybridge，新增連接後的Networks出現了bridge的資料。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;"Networks": {
 "bridge": {
 "IPAMConfig": {},
 "Links": null,
 "Aliases": [],
 "NetworkID": "b2077f8151cbe85b063e14c0603ad241acc0066d0155b747d09d5a1171598b62",
 "EndpointID": "d7ee13480da9ec15d24ced9a42acc24da4344577bf4832b2e927791c4e8d9155",
 "Gateway": "172.17.0.1",
 "IPAddress": "172.17.0.6",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:11:00:06",
 "DriverOpts": {}
 },
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;進入到box3來查看ip a的狀態，&lt;br&gt;
eth0屬於mybridge，eth1屬於bridge。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/XGrrGgI.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="斷開容器與網絡的連接"&gt;&lt;span class="ez-toc-section" id="%E6%96%B7%E9%96%8B%E5%AE%B9%E5%99%A8%E8%88%87%E7%B6%B2%E7%B5%A1%E7%9A%84%E9%80%A3%E6%8E%A5"&gt;&lt;/span&gt;斷開容器與網絡的連接&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;查看網路相關命令：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker network&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;Usage: docker network COMMAND

Manage networks

Commands:
 connect Connect a container to a network
 create Create a network
 disconnect Disconnect a container from a network
 inspect Display detailed information on one or more networks
 ls List networks
 prune Remove all unused networks
 rm Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;斷開box3與bridge網絡的連接，並查詢box3&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker network disconnect bridge box3
docker inspect box3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下，Networks只剩下mybridge:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;"Networks": {
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;網路圖如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/zzA6Mbr.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Docker] 創建和使用 bridge</title><link>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8-bridge/</link><pubDate>Sat, 15 Jan 2022 18:23:58 +0000</pubDate><guid>https://quietbo.com/2022/01/16/docker-%E5%89%B5%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8-bridge/</guid><description>&lt;p&gt;建立一個自訂名稱的 docker network，這邊取名為mybridge:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker network create -d bridge mybridge&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看目前network的訊息，是否有我們建立的mybridge&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker network ls&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/nnT1EXU.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查看mybridge的資訊。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network inspect mybridge
[
 {
 "Name": "mybridge",
 "Id": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "Created": "2022-01-15T14:21:30.014726296Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": {},
 "Config": [
 {
 "Subnet": "172.18.0.0/16",
 "Gateway": "172.18.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {},
 "Options": {},
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;創建一個容器，指定network在mybridge&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker container run -d --rm --name box3 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看box3的訊息，最下方Networks:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;"Networks": {
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/bxWulUI.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;回來查看mybridge，會發現有一個新的容器(box3)資料&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network inspect mybridge
[
 {
 "Name": "mybridge",
 "Id": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "Created": "2022-01-15T14:21:30.014726296Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": {},
 "Config": [
 {
 "Subnet": "172.18.0.0/16",
 "Gateway": "172.18.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {
 "7ad11d3a4e9c0fff207c329a9beae2fc8060b0110a67dc4a32f133c591be4abb": {
 "Name": "box3",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "MacAddress": "02:42:ac:12:00:02",
 "IPv4Address": "172.18.0.2/16",
 "IPv6Address": ""
 }
 },
 "Options": {},
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="讓一個容器連接2個網路"&gt;讓一個容器連接2個網路
&lt;/h2&gt;&lt;p&gt;原本的box1與box2是連接預設的docker0(就是bridge)，而box3是連接mybridge&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b2077f8151cb bridge bridge local
d1465da885e1 host host local
8569e3bba27a mybridge bridge local
91fc3c2b25fb none null local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;讓box3連接bridge網路，再查看一次box3的網路資訊:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker network connect bridge box3
docker inspect box3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原本box3只有一個mybridge，新增連接後的Networks出現了bridge的資料。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;"Networks": {
 "bridge": {
 "IPAMConfig": {},
 "Links": null,
 "Aliases": [],
 "NetworkID": "b2077f8151cbe85b063e14c0603ad241acc0066d0155b747d09d5a1171598b62",
 "EndpointID": "d7ee13480da9ec15d24ced9a42acc24da4344577bf4832b2e927791c4e8d9155",
 "Gateway": "172.17.0.1",
 "IPAddress": "172.17.0.6",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:11:00:06",
 "DriverOpts": {}
 },
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;進入到box3來查看ip a的狀態，&lt;br&gt;
eth0屬於mybridge，eth1屬於bridge。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/XGrrGgI.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="斷開容器與網絡的連接"&gt;斷開容器與網絡的連接
&lt;/h2&gt;&lt;p&gt;查看網路相關命令：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker network&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Usage: docker network COMMAND

Manage networks

Commands:
 connect Connect a container to a network
 create Create a network
 disconnect Disconnect a container from a network
 inspect Display detailed information on one or more networks
 ls List networks
 prune Remove all unused networks
 rm Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;斷開box3與bridge網絡的連接，並查詢box3&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker network disconnect bridge box3
docker inspect box3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下，Networks只剩下mybridge:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;"Networks": {
 "mybridge": {
 "IPAMConfig": null,
 "Links": null,
 "Aliases": [
 "7ad11d3a4e9c"
 ],
 "NetworkID": "8569e3bba27a4dd6a5f1a8d39c9df7350aa27dc8eb38118ab4b99f9fb4b6e7cf",
 "EndpointID": "213898adbc0abf4dc37894e94f10720f44682b59d046a45f9a88ed92172bf306",
 "Gateway": "172.18.0.1",
 "IPAddress": "172.18.0.2",
 "IPPrefixLen": 16,
 "IPv6Gateway": "",
 "GlobalIPv6Address": "",
 "GlobalIPv6PrefixLen": 0,
 "MacAddress": "02:42:ac:12:00:02",
 "DriverOpts": null
 }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;網路圖如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/zzA6Mbr.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>什麼是網路位址轉換(NAT)?</title><link>https://quietbo.com/2022/01/15/%E4%BB%80%E9%BA%BC%E6%98%AF%E7%B6%B2%E8%B7%AF%E4%BD%8D%E5%9D%80%E8%BD%89%E6%8F%9Bnat/</link><pubDate>Fri, 14 Jan 2022 17:03:30 +0000</pubDate><guid>https://quietbo.com/2022/01/15/%E4%BB%80%E9%BA%BC%E6%98%AF%E7%B6%B2%E8%B7%AF%E4%BD%8D%E5%9D%80%E8%BD%89%E6%8F%9Bnat/</guid><description>&lt;h2 id="淺談l1"&gt;淺談(L1)
&lt;/h2&gt;&lt;p&gt;網路位址轉換（英語：Network Address Translation，縮寫：NAT；又稱網路掩蔽、IP掩蔽）&lt;/p&gt;
&lt;p&gt;NAT是作為一種解決IPv4位址短缺以避免保留IP位址困難的方案而流行起來的。&lt;/p&gt;
&lt;p&gt;NAT就像是中間綠色箭頭，將私有IP轉為公開IP&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/N4cYuul.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;NAT 伺服器的功能:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 封包偽裝
 &lt;/li&gt;
 &lt;li&gt;
 封包過濾
 &lt;/li&gt;
 &lt;li&gt;
 平衡負載
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;參考：&lt;br&gt;
&lt;a class="link" href="https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2" target="_blank" rel="noopener"
 &gt;wiki:網路位址轉換NAT&lt;/a&gt;&lt;br&gt;
YT參考影片:&lt;a class="link" href="https://www.youtube.com/watch?v=FTUV0t6JaDA&amp;amp;ab_channel=PowerCertAnimatedVideos" target="_blank" rel="noopener"
 &gt;NAT Explained – Network Address Translation&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="http://linux.vbird.org/linux_server/0250simple_firewall.php" target="_blank" rel="noopener"
 &gt;鳥哥的Linux 私房菜-第九章、防火牆與 NAT 伺服器&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Docker] Docker Bridge 網路</title><link>https://quietbo.com/2022/01/14/docker-docker-bridge-%E7%B6%B2%E8%B7%AF/</link><pubDate>Fri, 14 Jan 2022 15:14:13 +0000</pubDate><guid>https://quietbo.com/2022/01/14/docker-docker-bridge-%E7%B6%B2%E8%B7%AF/</guid><description>&lt;h2 id="容器間通信"&gt;容器間通信
&lt;/h2&gt;&lt;p&gt;容器都連接到了一個叫 docker0 的Linux bridge上&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b2077f8151cb bridge bridge local
d1465da885e1 host host local
91fc3c2b25fb none null local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下方為bridge的訊息，基本上Containers的IPv4Address會在Subnet的子網內。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker network inspect b20
[
 {
 "Name": "bridge",
 "Id": "b2077f8151cbe85b063e14c0603ad241acc0066d0155b747d09d5a1171598b62",
 "Created": "2022-01-05T06:05:45.888144625Z",
 "Scope": "local",
 "Driver": "bridge",
 "EnableIPv6": false,
 "IPAM": {
 "Driver": "default",
 "Options": null,
 "Config": [
 {
 "Subnet": "172.17.0.0/16",
 "Gateway": "172.17.0.1"
 }
 ]
 },
 "Internal": false,
 "Attachable": false,
 "Ingress": false,
 "ConfigFrom": {
 "Network": ""
 },
 "ConfigOnly": false,
 "Containers": {
 "0f74d05e5298f06e21b056273867145558143b4dda2b62f0e397ef31f25fc074": {
 "Name": "box1",
 "EndpointID": "8b7adf5422e5701c9fd762728009809a5a63033cdfe1ea2d621fb3d6a668f4ec",
 "MacAddress": "02:42:ac:11:00:02",
 "IPv4Address": "172.17.0.2/16",
 "IPv6Address": ""
 },
 "5360d3a4fb4ab3fab6b4b3fc505932f9360bc5d970d1411db8acd84be37d0338": {
 "Name": "web2",
 "EndpointID": "b318ba87a14cc6bb72183805479d0acc35947045242875b2bd590290bdde03ca",
 "MacAddress": "02:42:ac:11:00:03",
 "IPv4Address": "172.17.0.3/16",
 "IPv6Address": ""
 },
 "d9875a0e49cd74897dc3d25d7d9ad297bcfbd62bdfde050ddb2e64b5cf5764e0": {
 "Name": "box2",
 "EndpointID": "67c774ac6dbac5d7266223d34ff28a0a81c2f24074397ce307d8e49593e5f950",
 "MacAddress": "02:42:ac:11:00:05",
 "IPv4Address": "172.17.0.5/16",
 "IPv6Address": ""
 },
 "f8b413a00b3b4715914b381a28b1aef8816dc32942d6ec2eb29c2570da3069ff": {
 "Name": "web1",
 "EndpointID": "96c5cbd408523c17fae501ce51c2cb1b6d85ab4d70d629b88e630f7faabc336d",
 "MacAddress": "02:42:ac:11:00:04",
 "IPv4Address": "172.17.0.4/16",
 "IPv6Address": ""
 }
 },
 "Options": {
 "com.docker.network.bridge.default_bridge": "true",
 "com.docker.network.bridge.enable_icc": "true",
 "com.docker.network.bridge.enable_ip_masquerade": "true",
 "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
 "com.docker.network.bridge.name": "docker0",
 "com.docker.network.driver.mtu": "1500"
 },
 "Labels": {}
 }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;並且Containers都默認的連接到docker0，如下圖。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/mqnWun0.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="668" src="https://quietbo.com/uploads/2022/01/image-1024x668.png" alt="" class="wp-image-693" srcset="https://quietbo.com/uploads/2022/01/image-1024x668.png 1024w, https://quietbo.com/uploads/2022/01/image-300x196.png 300w, https://quietbo.com/uploads/2022/01/image-768x501.png 768w, https://quietbo.com/uploads/2022/01/image.png 1316w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Docker] Docker Bridge – 本地練習</title><link>https://quietbo.com/2022/01/13/docker-docker-bridge-%E7%B6%B2%E7%B5%A1/</link><pubDate>Thu, 13 Jan 2022 15:11:07 +0000</pubDate><guid>https://quietbo.com/2022/01/13/docker-docker-bridge-%E7%B6%B2%E7%B5%A1/</guid><description>&lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/jlz3BoV.png" alt="" /&gt;&lt;/figure&gt; 
&lt;p&gt;建立出來的容器是互相可以ping的。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 pull image
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull busybox&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 建立容器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &amp;#8211;rm :容器停止後會自動刪除
 &lt;/li&gt;
 &lt;li&gt;
 -name :容器的名字為 box1
 &lt;/li&gt;
 &lt;li&gt;
 /bin/sh -c &amp;#8220;While true; do sleep 3600; done&amp;#8221; : 希望執行的命令
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker container run -d --rm --name box1 busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 檢查容器是否運行中
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 進入名為box1的容器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker exec -it box1 sh&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 查box1的IP
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ip a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看eth0中的IP，如下圖：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/cd4Gjan.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 ping看看box1的ip是否有通
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 建立名為box2的新的容器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker container run -d --rm --name box2 busybox /bin/sh -c "while true; do sleep 3600; done"&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="8"&gt;
 &lt;li&gt;
 查看目前容器狀況
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker ps&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/GQVQVie.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="9"&gt;
 &lt;li&gt;
 查看box2的ip
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這次就不進入容器查看，會看到eth0的IP是172.17.0.3&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker exec -it box2 ip a&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/01E1hxU.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="10"&gt;
 &lt;li&gt;
 用box1來ping box2
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker exec -it box1 ping 172.17.0.3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下，看起來是有通的：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.159 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.432 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.317 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.384 ms&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="11"&gt;
 &lt;li&gt;
 pull image nginx
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull nginx&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="12"&gt;
 &lt;li&gt;
 創建名為web1的容器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker run -d --name web1 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="13"&gt;
 &lt;li&gt;
 查看web1的IP
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker inspect web1&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Ueid9V0.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;補充：因為web沒有安裝ip的指令，所以使用ip a會跳出錯誤訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker exec -it web1 ip a
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ip": executable file not found in $PATH: unknown&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="14"&gt;
 &lt;li&gt;
 測試是否相通
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;進入box1的shell&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker exec -it box1 sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;/ # ping 172.17.0.4
PING 172.17.0.4 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.672 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.344 ms
64 bytes from 172.17.0.4: seq=2 ttl=64 time=0.307 ms
64 bytes from 172.17.0.4: seq=3 ttl=64 time=0.273 ms&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下載172.17.0.4:80的html&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;/ # wget 172.17.0.4:80
Connecting to 172.17.0.4:80 (172.17.0.4:80)
saving to 'index.html'
index.html 100% |*************************************************************************| 615 0:00:00 ETA
'index.html' saved&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看html檔案&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;cat index.html&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="15"&gt;
 &lt;li&gt;
 端口轉發
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建立一個新的container，將80轉到local&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker run -d -p 80:80 --name web2 nginx&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ab1GUCU.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="16"&gt;
 &lt;li&gt;
 測試是否有分享到本機
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;開啟瀏覽器，輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;127.0.0.1:80&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有成功將web2的nginx的80port分享來，會顯示：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>網絡常用命令</title><link>https://quietbo.com/2022/01/13/%E7%B6%B2%E7%B5%A1%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Wed, 12 Jan 2022 18:09:23 +0000</pubDate><guid>https://quietbo.com/2022/01/13/%E7%B6%B2%E7%B5%A1%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/01/13/%e7%b6%b2%e7%b5%a1%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#IP%E5%9C%B0%E5%9D%80%E7%9A%84%E6%9F%A5%E7%9C%8B" &gt;IP地址的查看&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/01/13/%e7%b6%b2%e7%b5%a1%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#%E7%B6%B2%E7%B5%A1%E9%80%A3%E9%80%9A%E6%80%A7%E6%B8%AC%E8%A9%A6" &gt;網絡連通性測試&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/01/13/%e7%b6%b2%e7%b5%a1%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#%E6%B8%AC%E8%A9%A6%E7%AB%AF%E5%8F%A3%E7%9A%84%E9%80%A3%E9%80%9A%E6%80%A7" &gt;測試端口的連通性&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/01/13/%e7%b6%b2%e7%b5%a1%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#traceroute" &gt;traceroute&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2022/01/13/%e7%b6%b2%e7%b5%a1%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#curl%E5%91%BD%E4%BB%A4" &gt;curl命令&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="ip地址的查看"&gt;&lt;span class="ez-toc-section" id="IP%E5%9C%B0%E5%9D%80%E7%9A%84%E6%9F%A5%E7%9C%8B"&gt;&lt;/span&gt;IP地址的查看&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Windows:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ipconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Linux、Mac:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ifconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mac 中沒有 ip 命令，可使用brew install&lt;br&gt;
&lt;a class="link" href="https://superuser.com/questions/687310/ip-command-in-mac-os-x-terminal/898971" target="_blank" rel="noopener"
 &gt;ip command in Mac OS X terminal&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;brew install iproute2mac
ip addr&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="網絡連通性測試"&gt;&lt;span class="ez-toc-section" id="%E7%B6%B2%E7%B5%A1%E9%80%A3%E9%80%9A%E6%80%A7%E6%B8%AC%E8%A9%A6"&gt;&lt;/span&gt;網絡連通性測試&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;ping命令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ping 192.XXX.XXX.XXX&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="測試端口的連通性"&gt;&lt;span class="ez-toc-section" id="%E6%B8%AC%E8%A9%A6%E7%AB%AF%E5%8F%A3%E7%9A%84%E9%80%A3%E9%80%9A%E6%80%A7"&gt;&lt;/span&gt;測試端口的連通性&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;telnet命令&lt;/p&gt;
&lt;p&gt;mac M1需安裝telnet:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;brew install telnet&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;測試連接google的80port如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ telnet www.google.com.tw 80
Trying 172.217.163.35...
Connected to www.google.com.tw.
Escape character is '^]'.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="traceroute"&gt;&lt;span class="ez-toc-section" id="traceroute"&gt;&lt;/span&gt;traceroute&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;可顯示封包在IP網路經過的路由器的IP位址。&lt;/p&gt;
&lt;p&gt;Windwos平台指令&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tracert&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Linux平台指令：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;traceroute
tracepath&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;traceroute連接到google如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ traceroute www.google.com.tw
traceroute to www.google.com.tw (142.251.43.3), 64 hops max, 52 byte packets
 1 192.168.100.1 (192.168.100.1) 6.143 ms 5.137 ms 4.805 ms
 2 192.168.1.1 (192.168.1.1) 6.382 ms 7.177 ms 6.312 ms
 3 h254.s98.ts.hinet.net (168.95.98.254) 12.624 ms 7.280 ms 9.544 ms
 4 * * *
 5 203-75-90-146.hinet-ip.hinet.net (203.75.90.146) 19.812 ms 7.768 ms 6.890 ms
 6 tpdt-3308.hinet.net (168.95.81.6) 8.898 ms 7.564 ms 31.192 ms
 7 tpdt-3032.hinet.net (220.128.27.94) 14.086 ms
 tpdb-3031.hinet.net (220.128.1.102) 8.078 ms 8.284 ms
 8 * * *
 9 pcpd-3211.hinet.net (220.128.12.241) 13.199 ms
 pcpd-3211.hinet.net (220.128.13.85) 9.528 ms
 pcpd-3211.hinet.net (220.128.12.189) 7.593 ms
10 72.14.218.140 (72.14.218.140) 9.797 ms 9.633 ms 10.930 ms
11 * * *
12 209.85.243.196 (209.85.243.196) 9.198 ms
 142.251.226.170 (142.251.226.170) 28.471 ms
 216.239.48.134 (216.239.48.134) 10.657 ms
13 142.251.77.85 (142.251.77.85) 8.641 ms 17.196 ms
 tsa03s08-in-f3.1e100.net (142.251.43.3) 8.052 ms&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="curl命令"&gt;&lt;span class="ez-toc-section" id="curl%E5%91%BD%E4%BB%A4"&gt;&lt;/span&gt;curl命令&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;請求web服務的&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -v :顯示請求詳細信息
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;curl quietbo.com -v&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -X :指定请求方式(GET or POST)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;curl -X Get URL
curl -X POST URL&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -H :指定頭部類型&amp;Cookie
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;curl -H "Content-Type:application/json"
curl -H "Cookie:username=XXX" URL&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -d :使用POST向server發送數據，下方可以省略-X POST
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;curl -H "Content-Type:application/json" -d '{"name":"bocky","date":"2022/1/13"}' URL -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可參考更多網路文章，&lt;a class="link" href="http://www.ruanyifeng.com/blog/2019/09/curl-reference.html" target="_blank" rel="noopener"
 &gt;文章&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Docker] volume 指定/ 不指定-v参数</title><link>https://quietbo.com/2022/01/11/docker-volume-%E6%8C%87%E5%AE%9A-%E4%B8%8D%E6%8C%87%E5%AE%9A-v%E5%8F%82%E6%95%B0/</link><pubDate>Mon, 10 Jan 2022 16:21:51 +0000</pubDate><guid>https://quietbo.com/2022/01/11/docker-volume-%E6%8C%87%E5%AE%9A-%E4%B8%8D%E6%8C%87%E5%AE%9A-v%E5%8F%82%E6%95%B0/</guid><description>&lt;p&gt;下方為dockerfile的內容&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
 SUPERCRONIC=supercronic-linux-amd64 \
 SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
 &amp;&amp; echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
 &amp;&amp; chmod +x "$SUPERCRONIC" \
 &amp;&amp; mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
 &amp;&amp; ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /app/my-cron
WORKDIR /app

VOLUME ["/app"]

# RUN cron job
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 構建鏡像&lt;br /&gt;在終端機執行：
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image build -t my-cron .
docker image ls&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/MquvGsa.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 創建容器(不指定-v參數)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker run -d my-cron
docker volume ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此時Docker會自動創建一個隨機名字的volume，存儲在Dockerfile定義的volume&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;VOLUME ["/app"]&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Flj1Mdr.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/0gKd2fc.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="創建容器指定-v參數"&gt;創建容器(指定-v參數)
&lt;/h2&gt;&lt;p&gt;在創建容器的時候通過 -v 參數，我們可以手動的指定&lt;strong&gt;需要創建Volume的名字&lt;/strong&gt;，以及&lt;strong&gt;對應於容器內的路徑&lt;/strong&gt;，這個路徑是可以任意的，不必需要在Dockerfile裡通過VOLUME來定義。&lt;/p&gt;
&lt;p&gt;把原本Dockerfile裡的VOLUME刪除(如下)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
 SUPERCRONIC=supercronic-linux-amd64 \
 SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
 &amp;&amp; echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
 &amp;&amp; chmod +x "$SUPERCRONIC" \
 &amp;&amp; mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
 &amp;&amp; ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /app/my-cron
WORKDIR /app

# RUN cron job
CMD ["/usr/local/bin/supercronic", "/app/my-cron"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新build鏡像，然後創建容器，加-v參數:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image build -t my-cron .
docker container run -d -v cron-data:/app my-cron
docker volume ls
docker volume inspect cron-data &lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/HSkWhf0.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="環境清理"&gt;環境清理
&lt;/h2&gt;&lt;p&gt;強制刪除所有容器，系統清理和volume清理&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker rm -f $(docker container ps -aq)
docker system prune -f
docker volume prune -f&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] Data Volume的練習(MySQL)</title><link>https://quietbo.com/2022/01/10/docker-data-volume%E7%9A%84%E7%B7%B4%E7%BF%92mysql/</link><pubDate>Mon, 10 Jan 2022 15:05:46 +0000</pubDate><guid>https://quietbo.com/2022/01/10/docker-data-volume%E7%9A%84%E7%B7%B4%E7%BF%92mysql/</guid><description>&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 MAC M1
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 下載Mysql 5.7的image
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker pull --platform linux/amd64 mysql:5.7&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/998OIK4.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 使用剛才下載的image創建出容器，並將mysql的密碼設為123456
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v mysql-data:/var/lib/mysql mysql:5.7
docker container ls&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/wh0ZN2C.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/gdHrOxc.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker volume ls
docker volume inspect mysql-data&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/kOypCQi.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 進入container，下方的71f請更換成自己的container id
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker exec -it containerId sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;進入後再進入MySQL，密碼為剛剛的123456&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/MansRUm.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 創建一個database(最後要用;來結尾)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;show databases;
create database demo;
show databases;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Ej9yBrq.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 確認有建立demo後，離開mysql和container
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用2次exit來離開。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/a4c23zv.png" alt="" /&gt; &lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/dRlrRCF.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查看文件夾可參考這篇&lt;a class="link" href="https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%ef%bc%8c%e6%89%be%e4%b8%8d%e5%88%b0var-lib-docker-volumes-%e5%b7%b2%e8%a7%a3%e6%b1%ba/" target="_blank" rel="noopener"
 &gt;[Docker] Mac M1 – no such file or directory: /var/lib/docker/volumes ，找不到var/lib/docker/volumes (已解決)&lt;/a&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 刪除container
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker container ls
docker container rm -f containerId&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Rcsnl4M.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 查看volume是否還在
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Ih097ha.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="8"&gt;
 &lt;li&gt;
 再創建一個已經存在的volume
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;雖然這指令跟第二步驟是一樣的，但因為紅框內還是我們volume的路徑，所以資料會繼續沿用。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker container run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -v mysql-data:/var/lib/mysql mysql:5.7&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/45Tcpk1.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="9"&gt;
 &lt;li&gt;
 進入container查看mysql的資料，會看到原本創建的demo。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/B5JetIt.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[MSSQL] like %%中文不匹配問題(必知)</title><link>https://quietbo.com/2022/01/06/mssql-like-%E4%B8%AD%E6%96%87%E4%B8%8D%E5%8C%B9%E9%85%8D%E5%95%8F%E9%A1%8C%E5%BF%85%E7%9F%A5/</link><pubDate>Thu, 06 Jan 2022 08:33:23 +0000</pubDate><guid>https://quietbo.com/2022/01/06/mssql-like-%E4%B8%AD%E6%96%87%E4%B8%8D%E5%8C%B9%E9%85%8D%E5%95%8F%E9%A1%8C%E5%BF%85%E7%9F%A5/</guid><description>&lt;p&gt;新手常犯，常忘記的匹配問題。主要是轉碼，需要在like後面添加個N，&lt;br&gt;
N轉換字符串爲nchar,nvarchar。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/2Ivedf4.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;SELECT [Type] ,[Title] FROM [TableName] WHERE [Title] LIKE N'%標題%'&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Git] Push Branch (增/刪)</title><link>https://quietbo.com/2021/12/30/git-push-branch-%E5%A2%9E-%E5%88%AA/</link><pubDate>Thu, 30 Dec 2021 02:50:39 +0000</pubDate><guid>https://quietbo.com/2021/12/30/git-push-branch-%E5%A2%9E-%E5%88%AA/</guid><description>&lt;p&gt;push featrue/#9999999分支上ogigin&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;git push origin 'featrue/#9999999' &lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/y4Yy6rO.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;在GitLab上會看到剛才Push上去的branch&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/upYdFjo.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;移除branch&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;git push origin :featrue/#9999999 &lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/4gblbU3.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Docker] Mac M1 – no such file or directory: /var/lib/docker/volumes ，找不到var/lib/docker/volumes (已解決)</title><link>https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%EF%BC%8C%E6%89%BE%E4%B8%8D%E5%88%B0var-lib-docker-volumes-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Wed, 22 Dec 2021 17:29:36 +0000</pubDate><guid>https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%EF%BC%8C%E6%89%BE%E4%B8%8D%E5%88%B0var-lib-docker-volumes-%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 Mac M1 version 12.0.1
 &lt;/li&gt;
 &lt;li&gt;
 Docker version 20.10.11
 &lt;/li&gt;
&lt;/ul&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/porV5EQ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;嘗試進入這個路徑時，發現它並不存在&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/64ZyrW9.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;網路上有許多解決方式是使用下方指令，但仍錯誤。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嘗試之後直接閃退：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;[screen is terminating]&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ghCOFSw.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%ef%bc%8c%e6%89%be%e4%b8%8d%e5%88%b0var-lib-docker-volumes-%e5%b7%b2%e8%a7%a3%e6%b1%ba/#1%E8%A7%A3%E6%B1%BA%E9%96%83%E9%80%80%E5%95%8F%E9%A1%8C%E6%96%B9%E5%BC%8F" &gt;1.解決閃退問題方式&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%ef%bc%8c%e6%89%be%e4%b8%8d%e5%88%b0var-lib-docker-volumes-%e5%b7%b2%e8%a7%a3%e6%b1%ba/#2%E6%AA%A2%E8%A6%96volumes" &gt;2.檢視volumes&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%ef%bc%8c%e6%89%be%e4%b8%8d%e5%88%b0var-lib-docker-volumes-%e5%b7%b2%e8%a7%a3%e6%b1%ba/#%E8%A3%9C%E5%85%85%EF%BC%9A" &gt;補充：&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/12/23/docker-mac-m1-no-such-file-or-directory-var-lib-docker-volumes-%ef%bc%8c%e6%89%be%e4%b8%8d%e5%88%b0var-lib-docker-volumes-%e5%b7%b2%e8%a7%a3%e6%b1%ba/#%E9%80%B2%E5%85%A5Mountpoint%E5%B0%8D%E6%87%89%E7%9A%84%E8%B3%87%E6%96%99%E5%A4%BE_Linux" &gt;進入Mountpoint對應的資料夾 (Linux)&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="1解決閃退問題方式"&gt;&lt;span class="ez-toc-section" id="1%E8%A7%A3%E6%B1%BA%E9%96%83%E9%80%80%E5%95%8F%E9%A1%8C%E6%96%B9%E5%BC%8F"&gt;&lt;/span&gt;1.解決閃退問題方式&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;詳細可參考此篇：&lt;a class="link" href="https://stackoverflow.com/questions/38532483/where-is-var-lib-docker-on-mac-os-x/65645462#65645462" target="_blank" rel="noopener"
 &gt;Where is /var/lib/docker on Mac/OS X&lt;/a&gt;&lt;br&gt;
mac下docker實際是在vm裡又加了一層，因此需要進入vm 才能進行操作。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 終端機執行下方指令
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="2檢視volumes"&gt;&lt;span class="ez-toc-section" id="2%E6%AA%A2%E8%A6%96volumes"&gt;&lt;/span&gt;2.檢視volumes&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;解決閃退問題後，會進入VM內，輸入ls，檢視當前路徑下目錄資訊。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ls /var/lib/docker/volumes/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到我要的mysql-data，而其他卷掛載都在這個目錄下：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/6LVBW4n.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;退出：exit&lt;/p&gt;
&lt;h2 id="補充"&gt;&lt;span class="ez-toc-section" id="%E8%A3%9C%E5%85%85%EF%BC%9A"&gt;&lt;/span&gt;補充：&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;h3 id="進入mountpoint對應的資料夾-linux"&gt;&lt;span class="ez-toc-section" id="%E9%80%B2%E5%85%A5Mountpoint%E5%B0%8D%E6%87%89%E7%9A%84%E8%B3%87%E6%96%99%E5%A4%BE_Linux"&gt;&lt;/span&gt;進入Mountpoint對應的資料夾 (Linux)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;如果使用Linux，可以直接找到Mountpoint對應的目錄，就是和container連接的地方，這裡面的改動和container內是同步的。&lt;br&gt;
但如果是Mac，用同樣的方式想要進入Mountpoint對應的目錄，會不存在，&lt;/p&gt;
&lt;p&gt;Mac需要先創建一個Linux的VM，所以Mountpoint對應的不是Mac裡可以找得到的檔案，而是要到那個VM裡去找，&lt;/p&gt;</description></item><item><title>[Mac] 安裝Jenkins，並與github連接</title><link>https://quietbo.com/2021/12/12/mac-%E5%AE%89%E8%A3%9Djenkins%E4%B8%A6%E8%88%87github%E9%80%A3%E6%8E%A5/</link><pubDate>Sat, 11 Dec 2021 18:24:19 +0000</pubDate><guid>https://quietbo.com/2021/12/12/mac-%E5%AE%89%E8%A3%9Djenkins%E4%B8%A6%E8%88%87github%E9%80%A3%E6%8E%A5/</guid><description>&lt;p&gt;使用Mac M1&lt;br&gt;
Jenkins 2.319.1&lt;/p&gt;
&lt;h1 id="安裝jenkins"&gt;安裝Jenkins
&lt;/h1&gt;&lt;p&gt;到&lt;a class="link" href="https://www.jenkins.io/" target="_blank" rel="noopener"
 &gt;Jenkins網站&lt;/a&gt;下載對應的檔案。目前我是使用&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;brew install jenkins-lts&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/OzpWOTs.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;安裝完成後，啟動jenkins&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;brew services start jenkins-lts&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/sZkyWrq.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;打開瀏覽器，輸入：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;http://localhost:8080&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一進去jenkins會要求使用密碼解鎖，初始密碼的路徑，就在提示上的紅色字。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/mJtjOa2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;解鎖後，選擇要安裝的套件&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/pUcbYIe.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;接下來是安裝時間，會稍微久一點。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/1BcCNOz.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;安裝完成後，會要求輸入建立admin帳號，這些帳密都要記住，未來登入需要使用。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Wt8Xb8a.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/N3T0Fpj.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;成功進入jenkins！&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/UAg0ro4.png" alt="" /&gt; &lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Vgj5t8W.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h1 id="設定-jenkins-與github-rerository連接"&gt;設定 jenkins 與Github Rerository連接
&lt;/h1&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 新增建置作業&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/nwfYR6x.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 新增項目名稱，建置Free-Strle軟體專案&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/fuImLsu.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 輸入github的git網址&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/DBTTCi9.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 建置觸發程序，將GitHub hook trigger for GITScm polling打勾。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/upQad1U.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 建置環境選擇執行Shell，並輸入下方指令後儲存。
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;echo 開始建置mydjango&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/4hzqyUk.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/9ucJHQm.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;注意：這次示範使用mac的shell，如果使用windows的Shell語法要注意更換。&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 儲存後點擊「馬上建置」，成功後左下方會出現綠色勾，若失敗的話可進入觀看失敗訊息。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/7xd5MZx.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建置完成後，點擊「#1」並進入「console output」，就可以看到終端機的輸出了。&lt;figure class="wp-block-image size-full"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="666" height="806" src="https://quietbo.com/uploads/2021/12/image.png" alt="" class="wp-image-644" srcset="https://quietbo.com/uploads/2021/12/image.png 666w, https://quietbo.com/uploads/2021/12/image-248x300.png 248w" sizes="auto, (max-width: 666px) 100vw, 666px" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="jenkins檢查github"&gt;Jenkins檢查github
&lt;/h2&gt;&lt;p&gt;不建議使用，基本上應該是github上有push新的程式後，jenkins再進行建置。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/mhftEQP.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[SQL] 萬用字元與escape的用法(必知)</title><link>https://quietbo.com/2021/12/10/sql-%E8%90%AC%E7%94%A8%E5%AD%97%E5%85%83%E8%88%87escape%E7%9A%84%E7%94%A8%E6%B3%95/</link><pubDate>Fri, 10 Dec 2021 08:27:31 +0000</pubDate><guid>https://quietbo.com/2021/12/10/sql-%E8%90%AC%E7%94%A8%E5%AD%97%E5%85%83%E8%88%87escape%E7%9A%84%E7%94%A8%E6%B3%95/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/12/10/sql-%e8%90%ac%e7%94%a8%e5%ad%97%e5%85%83%e8%88%87escape%e7%9a%84%e7%94%a8%e6%b3%95/#%E8%90%AC%E7%94%A8%E5%AD%97%E5%85%83%E7%94%A8%E6%B3%95" &gt;萬用字元用法&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/12/10/sql-%e8%90%ac%e7%94%a8%e5%ad%97%e5%85%83%e8%88%87escape%e7%9a%84%e7%94%a8%e6%b3%95/#%E3%80%81%E3%80%81%E5%8F%8A1%E7%9A%84%E5%9B%9B%E7%A8%AE%E7%AF%84%E4%BE%8B" &gt;[、]、[]及[1]的四種範例:&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/12/10/sql-%e8%90%ac%e7%94%a8%e5%ad%97%e5%85%83%e8%88%87escape%e7%9a%84%e7%94%a8%e6%b3%95/#%E4%BD%BF%E7%94%A8_like_%E5%8C%B9%E9%85%8D%E7%89%B9%E6%AE%8A%E5%AD%97%E5%85%83" &gt;使用 like [] 匹配特殊字元&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-4&amp;quot; href=&amp;quot;https://quietbo.com/2021/12/10/sql-%e8%90%ac%e7%94%a8%e5%ad%97%e5%85%83%e8%88%87escape%e7%9a%84%e7%94%a8%e6%b3%95/#escape%E7%9A%84%E7%94%A8%E6%B3%95&amp;quot; &amp;gt;escape的用法&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="萬用字元用法"&gt;&lt;span class="ez-toc-section" id="%E8%90%AC%E7%94%A8%E5%AD%97%E5%85%83%E7%94%A8%E6%B3%95"&gt;&lt;/span&gt;萬用字元用法&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 %：匹配零個及多個任意字元
 &lt;/li&gt;
 &lt;li&gt;
 _ &lt;em&gt;：與任意1個單字元匹配，包含&lt;/em&gt;
 &lt;/li&gt;
 &lt;li&gt;
 []：匹配一個範圍
 &lt;/li&gt;
 &lt;li&gt;
 [^]：排除一個範圍
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;字串中出現的特殊字元：&lt;code&gt;%&amp;lt;strong&amp;gt; [ [] _&amp;lt;/strong&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;可以使用 ‘[]’ 把特殊字元包起來，這些特殊字元就被當作普通字元對待了。&lt;/p&gt;
&lt;h3 id="及1的四種範例"&gt;&lt;span class="ez-toc-section" id="%E3%80%81%E3%80%81%E5%8F%8A1%E7%9A%84%E5%9B%9B%E7%A8%AE%E7%AF%84%E4%BE%8B"&gt;&lt;/span&gt;[、]、[]及[1]的四種範例:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;以下SQL使用 like [] 匹配特殊字元 [ 與 []&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;-- 使用[[]
select 1 where '[TEST' like '[[]%'; -- 1
select 1 where 'TEST[' like '%[[]'; -- 1

-- 這邊的]是不需要包起來，只需要寫在like內即可
select 1 where 'TEST]' like '%]'; -- 1
select 1 where ']TEST' like ']%'; -- 1

-- 使用[[]]
select 1 where '[]TEST' like '[[]]%%'; -- 1

-- 稍微複雜一點包法，前面的[1]要用[[]1]包
select 1 where '[1]TEST' like '[[]1]%%'; -- 1&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="使用-like--匹配特殊字元"&gt;&lt;span class="ez-toc-section" id="%E4%BD%BF%E7%94%A8_like_%E5%8C%B9%E9%85%8D%E7%89%B9%E6%AE%8A%E5%AD%97%E5%85%83"&gt;&lt;/span&gt;使用 like [&lt;em&gt;] 匹配特殊字元&lt;/em&gt;&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;原本 _ 的功能是與任意單字元匹配，&lt;br&gt;
如果想搜尋是DB_開頭的話，使用單純的_又會把DBa、DBb什麼db開頭的家人都找出來，變模糊搜尋了。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;--原本:
select 1 where 'DB_' like '___'; -- 1
select 1 where 'DBa' like '___'; -- 1
select 1 where 'DBb' like '___'; -- 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果確定只要DB_開頭，就必須把_用[]包起來，這樣其他的就找不到了!&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql"&gt;select 1 where 'DBatest' like 'db[_]%'; -- 無
select 1 where 'DBbtest' like 'db[_]%'; -- 無
select 1 where 'DB_test' like 'db[_]%'; -- 1&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="escape的用法"&gt;&lt;span class="ez-toc-section" id="escape%E7%9A%84%E7%94%A8%E6%B3%95"&gt;&lt;/span&gt;escape的用法&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;escape要與Like一起使用，定義轉義符&lt;br&gt;
若不使用[]包住%，來搜尋’10%’，也許會很直覺的使用&lt;code&gt;like '10%'&lt;/code&gt;&lt;br&gt;
但這樣會把100%、101%、1000%等10開頭都搜尋到，與預期結果不符。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;SELECT 1 WHERE '100%' LIKE '10%'; -- 1
SELECT 1 WHERE '101%' LIKE '10%'; -- 1
SELECT 1 WHERE '102%' LIKE '10%'; -- 1
SELECT 1 WHERE '10000%' LIKE '10%'; -- 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下方指令是使用escape來尋找真正的%&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt; SELECT 1 WHERE '10%' LIKE '10/%' ESCAPE '/' ;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上方的是指定用’/’符號來說明，後面的萬用符轉成普通字符(單純的百分比%)，&lt;br&gt;
如果同時要尋找/的話呢?例如日期常使用到的/&lt;br&gt;
一般沒有使用ESCAPE的話，可能直接打上日期(下方第一個)搜尋，&lt;br&gt;
若加入 ESCAPE ‘/’ ，要使用2個/，這樣才能符合。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql line-numbers"&gt;SELECT 1 WHERE '2021/12/31' LIKE '2021/12/31'; -- 1
SELECT 1 WHERE '2021/12/31' LIKE '2021//12//31' ESCAPE '/'; -- 1
SELECT 1 WHERE 'MSSQL/50%' LIKE 'MSSQL/50%' ESCAPE '/'; -- 0
SELECT 1 WHERE 'MSSQL/50%' LIKE 'MSSQL//50/%' ESCAPE '/'; -- 1&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Python] Django第一個Urls與View</title><link>https://quietbo.com/2021/11/28/python-django%E7%AC%AC%E4%B8%80%E5%80%8Burls%E8%88%87view/</link><pubDate>Sun, 28 Nov 2021 09:13:19 +0000</pubDate><guid>https://quietbo.com/2021/11/28/python-django%E7%AC%AC%E4%B8%80%E5%80%8Burls%E8%88%87view/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 定義視圖函數&lt;br /&gt;books\views.py:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from django.shortcuts import render
from django.http import HttpResponse

#定義視圖函數
def hello(request):
 return HttpResponse("&amp;lt;h1&amp;gt;Hello, world.世界你好.&amp;lt;/h1&amp;gt;")&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 修改項目(mydjango) urls.py文件
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from django.contrib import admin
from django.urls import path, include

urlpatterns = [
 path('books/', include('books.urls')),
 path('admin/', admin.site.urls),
]&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 在books的資料夾新增 urls.py文件
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from django.urls import path
from . import views

urlpatterns = [
 path('hello/', views.hello, name='hello'),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立完成後的資料如下，執行&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/A4uX13g.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/gkEr4Ol.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;開啟瀏覽器，輸入&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;http://127.0.0.1:8000/books/hello/&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/cjoWs3K.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="url配置"&gt;URL配置
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 urlpatterns: 路由模式列表,通過URL模式映射到視圖
 &lt;/li&gt;
 &lt;li&gt;
 path函數： 返回urlpatterns元素&lt;br /&gt;定義：path(route, view, kwargs=None, name=None)&lt;br /&gt;route：路由模式,&lt;br /&gt;view:可以是視圖函數、視圖類或include函數返回值&lt;br /&gt;path(&amp;#8221;, views.home, name=&amp;#8217;home&amp;#8217;)&lt;br /&gt;path(&amp;#8221;, Home.as_view(), name=&amp;#8217;home&amp;#8217;)&lt;br /&gt;path(&amp;#8216;blog/&amp;#8217;, include(&amp;#8216;blog.urls&amp;#8217;))
 &lt;/li&gt;
 &lt;li&gt;
 include函數：導入其他的模塊,include(&amp;#8216;books.urls&amp;#8217;)是導入books.urls模塊
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[Python] 創建一個Django專案</title><link>https://quietbo.com/2021/11/16/python-%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8Bdjango%E5%B0%88%E6%A1%88/</link><pubDate>Mon, 15 Nov 2021 16:08:12 +0000</pubDate><guid>https://quietbo.com/2021/11/16/python-%E5%89%B5%E5%BB%BA%E4%B8%80%E5%80%8Bdjango%E5%B0%88%E6%A1%88/</guid><description>&lt;p&gt;使用：Mac M1&lt;br&gt;
Python 3.8&lt;br&gt;
Django:3.2&lt;/p&gt;
&lt;h2 id="建立環境"&gt;建立環境
&lt;/h2&gt;&lt;p&gt;可參考：&lt;a class="link" href="https://quietbo.com/2021/06/27/mac-pro-m1-%e5%ae%89%e8%a3%9dvirtualenv/" target="_blank" rel="noopener"
 &gt;安裝virtualenv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;進入env後，安裝及查看Django版本：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pip install django
pip list&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/YDA0rRK.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="建立專案"&gt;建立專案
&lt;/h2&gt;&lt;p&gt;尋找一個位置，建立第一個專案：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;django-admin startproject mydjango&lt;/code&gt;&lt;/pre&gt;
&lt;img decoding="async" src="https://i.imgur.com/33w2bsR.png" alt="" /&gt; 
創建的資料結構如下： 
&lt;img decoding="async" src="https://i.imgur.com/AREpKuM.png" alt="" /&gt; 
&lt;p&gt;執行方式：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若想更改默認端口：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python manage.py runserver 0.0.0.0:8899&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行成功如下圖：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/T83LNyC.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;開啟瀏覽器，輸入：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;http://127.0.0.1:8000/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一次運行，會看到下圖畫面：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/xIuSCBD.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;停止方式：Control + C&lt;/p&gt;
&lt;p&gt;此時，會多出現一個檔案db.sqlite3&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/2pFmXot.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Django主要提供了四種數據庫引擎：&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 django.db.backends.postgresql
 &lt;/li&gt;
 &lt;li&gt;
 django.db.backends.mysql
 &lt;/li&gt;
 &lt;li&gt;
 django.db.backends.sqlite3
 &lt;/li&gt;
 &lt;li&gt;
 django.db.backends.oracle
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打開setting.py會看到默認引擎是sqlite3，&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.sqlite3',
 'NAME': BASE_DIR / 'db.sqlite3',
 }
}&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/pcR3yH3.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;MySQL設置方式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.mysql',
 'NAME': 'djangodb',
 'USER': 'root',
 'PASSWORD': '12345',
 'HOST': '127.0.0.1',
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要更多的配置信息，可以指定配置文件：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.mysql',
 'OPTIONS':{
 'read_default_file': '/path/to/my.cnf',
 },
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;# my.cnf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[client]&lt;/p&gt;
&lt;p&gt;databases = djangodb user = root password = 12345 default-character-set=utf8&lt;/p&gt;
&lt;p&gt;PostgreSQL數據庫配置:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.postgresql',
 'NAME': 'mydatabase',
 'USER': 'mydatabaseuser',
 'PASSWORD': 'mypassword',
 'HOST': '127.0.0.1',
 'PORT': '5432',
 }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python manage.py migrate&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/udBptue.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="創建應用程序"&gt;創建應用程序
&lt;/h3&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;python manage.py startapp books&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成books，如下的資料結構&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.
├── books
│&amp;nbsp;&amp;nbsp; ├── __init__.py
│&amp;nbsp;&amp;nbsp; ├── admin.py
│&amp;nbsp;&amp;nbsp; ├── apps.py
│&amp;nbsp;&amp;nbsp; ├── migrations
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── __init__.py
│&amp;nbsp;&amp;nbsp; ├── models.py
│&amp;nbsp;&amp;nbsp; ├── tests.py
│&amp;nbsp;&amp;nbsp; └── views.py
├── db.sqlite3
├── manage.py
└── mydjango
 ├── __init__.py
 ├── asgi.py
 ├── settings.py
 ├── urls.py
 └── wsgi.py&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/RbOLpWV.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 admin :網站管理設置
 &lt;/li&gt;
 &lt;li&gt;
 apps :註冊應用相關
 &lt;/li&gt;
 &lt;li&gt;
 migration ：數據庫的升級文件包，會自動升級專案的數據庫
 &lt;/li&gt;
 &lt;li&gt;
 models ：定義模型
 &lt;/li&gt;
 &lt;li&gt;
 tests :測試相關代碼
 &lt;/li&gt;
 &lt;li&gt;
 views ：定義視圖函式
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主要程式撰寫是在views及models&lt;/p&gt;</description></item><item><title>[Mac] Homebrew安裝tree(樹狀資料夾目錄結構)</title><link>https://quietbo.com/2021/11/10/mac-homebrew%E5%AE%89%E8%A3%9Dtree%E6%A8%B9%E7%8B%80%E8%B3%87%E6%96%99%E5%A4%BE%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B/</link><pubDate>Tue, 09 Nov 2021 16:37:03 +0000</pubDate><guid>https://quietbo.com/2021/11/10/mac-homebrew%E5%AE%89%E8%A3%9Dtree%E6%A8%B9%E7%8B%80%E8%B3%87%E6%96%99%E5%A4%BE%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B/</guid><description>&lt;p&gt;目的：使用homebrew來安裝tree，並顯示資料結構。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/P7VqLcb.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="homebrew"&gt;Homebrew
&lt;/h2&gt;&lt;p&gt;可以在 Mac 上安裝系統沒有的套件，例如 Wget (算是工程師滿常使用的軟體)&lt;/p&gt;
&lt;p&gt;開啟終端機，輸入下方指令來安裝&lt;a class="link" href="https://brew.sh/index_zh-tw.html" target="_blank" rel="noopener"
 &gt;Homebrew&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新套件&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;brew update &amp;&amp; brew upgrade &amp;&amp; brew cleanup&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝tree&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;brew install tree&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若在顯示列印資料夾目錄，中文檔名有亂碼時，加上 -N&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tree -N&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有些資料夾層級太多時，可指定要印出的層數，後面加上層數的數字：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tree -L 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依字母排序&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tree -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;關鍵字搜尋 Homebrew 套件(下方是搜尋tree)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;brew search tree&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/VGyBRyQ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查看更多tree的功能：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;tree --help&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Python] break、continue、pass、return及exit的用法與區別</title><link>https://quietbo.com/2021/11/05/python-break%E3%80%81continue%E3%80%81pass%E3%80%81return%E5%8F%8Aexit%E7%9A%84%E7%94%A8%E6%B3%95%E8%88%87%E5%8D%80%E5%88%A5/</link><pubDate>Thu, 04 Nov 2021 16:53:04 +0000</pubDate><guid>https://quietbo.com/2021/11/05/python-break%E3%80%81continue%E3%80%81pass%E3%80%81return%E5%8F%8Aexit%E7%9A%84%E7%94%A8%E6%B3%95%E8%88%87%E5%8D%80%E5%88%A5/</guid><description>&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 break 結束循環語句
 &lt;/li&gt;
 &lt;li&gt;
 continue 跳出本次循環，繼續下一個循環
 &lt;/li&gt;
 &lt;li&gt;
 pass 不做任何事情，站位而已
 &lt;/li&gt;
 &lt;li&gt;
 return 退出整個函數(def)
 &lt;/li&gt;
 &lt;li&gt;
 exit 結束整個程序(進程)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/11/05/python-break%e3%80%81continue%e3%80%81pass%e3%80%81return%e5%8f%8aexit%e7%9a%84%e7%94%a8%e6%b3%95%e8%88%87%e5%8d%80%e5%88%a5/#break" &gt;break&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/11/05/python-break%e3%80%81continue%e3%80%81pass%e3%80%81return%e5%8f%8aexit%e7%9a%84%e7%94%a8%e6%b3%95%e8%88%87%e5%8d%80%e5%88%a5/#continue" &gt;continue&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/11/05/python-break%e3%80%81continue%e3%80%81pass%e3%80%81return%e5%8f%8aexit%e7%9a%84%e7%94%a8%e6%b3%95%e8%88%87%e5%8d%80%e5%88%a5/#pass" &gt;pass&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/11/05/python-break%e3%80%81continue%e3%80%81pass%e3%80%81return%e5%8f%8aexit%e7%9a%84%e7%94%a8%e6%b3%95%e8%88%87%e5%8d%80%e5%88%a5/#return" &gt;return&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/11/05/python-break%e3%80%81continue%e3%80%81pass%e3%80%81return%e5%8f%8aexit%e7%9a%84%e7%94%a8%e6%b3%95%e8%88%87%e5%8d%80%e5%88%a5/#exit" &gt;exit&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="break"&gt;&lt;span class="ez-toc-section" id="break"&gt;&lt;/span&gt;break&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;用來終止循環語句，即使循環條件沒有False或者序列還沒被完全遞歸完，也會停止執行循環語句。&lt;/p&gt;
&lt;p&gt;break語句用在while和for循環中。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;def config():
 for num in '12345':
 if num == '3':
 break
 print('當前數字:', num)
 print('=' * 10)

config()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;當前數字: 1
當前數字: 2
==========&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="continue"&gt;&lt;span class="ez-toc-section" id="continue"&gt;&lt;/span&gt;continue&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;continue 語句跳出&lt;strong&gt;本次&lt;/strong&gt;循環，然後繼續進行下一輪循環。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;def config():
 for num in '12345':
 if num == '3':
 continue
 print('當前數字:', num)
 print('=' * 10)

config()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果：當for迴圈到3時，被跳過了。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;當前數字: 1
當前數字: 2
當前數字: 4
當前數字: 5
==========&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="pass"&gt;&lt;span class="ez-toc-section" id="pass"&gt;&lt;/span&gt;pass&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;空語句，pass 不做任何事情，一般用做佔位語句，是為了保持程序結構的完整性。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;def config():
 for num in '12345':
 if num == '3':
 pass
 print('當前數字:', num)
 print('=' * 10)

config()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;當前數字: 1
當前數字: 2
當前數字: 3
當前數字: 4
當前數字: 5
==========&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;補充：&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 為什麼要站位？
 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;事實上站位就是要先預留位置，回頭再補上具體的代碼實現。
很多時候我們在開發的時候，會把已知的判斷條件或函式寫好，然後在對應的塊中寫上pass，後續再慢慢完善這些站位的部分。&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="return"&gt;&lt;span class="ez-toc-section" id="return"&gt;&lt;/span&gt;return&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;return 語句就是將結果返回到調用的地方，並把控制權也一起返回。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;def config():
 for num in '12345':
 if num == '3':
 return f'for迴圈在 {num} 時回傳了'
 print('當前數字:', num)
 print('=' * 10)

print(config())
print('上方function已返回')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;當前數字: 1
當前數字: 2
for迴圈在 3 時回傳了
上方function已返回&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="exit"&gt;&lt;span class="ez-toc-section" id="exit"&gt;&lt;/span&gt;exit&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;用來結束整個程序（進程）。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;def config():
 for num in '12345':
 if num == '3':
 exit()
 print('當前數字:', num)
 print('=' * 10)

config()
print('*' * 10) #程式已結束所以不會印出&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;當前數字: 1
當前數字: 2&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[C#]例外處理Exception</title><link>https://quietbo.com/2021/11/01/%E4%BE%8B%E5%A4%96%E8%99%95%E7%90%86exception/</link><pubDate>Sun, 31 Oct 2021 16:22:08 +0000</pubDate><guid>https://quietbo.com/2021/11/01/%E4%BE%8B%E5%A4%96%E8%99%95%E7%90%86exception/</guid><description>&lt;p&gt;&lt;a class="link" href="https://docs.microsoft.com/zh-tw/dotnet/api/system.exception?view=net-5.0" target="_blank" rel="noopener"
 &gt;Microsoft： Exception 類別&lt;/a&gt;&lt;br&gt;
程式執行期間發生的錯誤，會丟出異常或丟出例外。&lt;/p&gt;
&lt;p&gt;例外處理是所有開發工程師必學的，以下介紹比較常見的 Exception&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 確認例外的什麼類型
 &lt;/li&gt;
 &lt;li&gt;
 透過debug來檢查是第幾行造成異常
 &lt;/li&gt;
&lt;/ul&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#NullReferenceException" &gt;NullReferenceException&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#DivideByZeroException" &gt;DivideByZeroException&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#ArgumentOutOfRangeException" &gt;ArgumentOutOfRangeException&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#ArgumentNullException" &gt;ArgumentNullException&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#FormatException" &gt;FormatException&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/11/01/%e4%be%8b%e5%a4%96%e8%99%95%e7%90%86exception/#try%E2%80%A6catch%E2%80%A6finally" &gt;try…catch…finally&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="nullreferenceexception"&gt;&lt;span class="ez-toc-section" id="NullReferenceException"&gt;&lt;/span&gt;NullReferenceException&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;當嘗試對Null 物件取值時，所擲回的例外狀況。&lt;/p&gt;
&lt;p&gt;尋找字串裡，B在第幾個位置出現，由於name是null, 所以程式時會丟出例外，範例如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string name = null;
int position = name.IndexOf('B');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;錯誤如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="dividebyzeroexception"&gt;&lt;span class="ez-toc-section" id="DivideByZeroException"&gt;&lt;/span&gt;DivideByZeroException&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;嘗試將整數或 Decimal 值除以零時，所擲回的例外狀況。&lt;/p&gt;
&lt;p&gt;分母不可以為零，程式在執行時, 會丟出例外，範例如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp"&gt;int i = 100;
int ans = i/0;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;錯誤如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;System.DivideByZeroException: Attempted to divide by zero.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="argumentoutofrangeexception"&gt;&lt;span class="ez-toc-section" id="ArgumentOutOfRangeException"&gt;&lt;/span&gt;ArgumentOutOfRangeException&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;引數超出有效值的範圍。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string value = "0123456789";

// 字串長度10, 叫用 Substring時, 傳入 100, 會丟出 ArgumentOutOfRangeException 例外
string result = value.Substring(100);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;錯誤訊息如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;System.ArgumentOutOfRangeException: startIndex cannot be larger than length of string.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="argumentnullexception"&gt;&lt;span class="ez-toc-section" id="ArgumentNullException"&gt;&lt;/span&gt;ArgumentNullException&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.microsoft.com/zh-tw/dotnet/api/system.argumentnullexception?view=net-5.0" target="_blank" rel="noopener"
 &gt;ArgumentNullException&lt;/a&gt;&lt;br&gt;
當 Null 參考 (在 Visual Basic 中為 Nothing) 傳遞給不接受其為有效引數的方法時，所擲回的例外狀況。&lt;/p&gt;
&lt;p&gt;不允許參數是null時,就會丟出ArgumentNullException&lt;/p&gt;
&lt;h2 id="formatexception"&gt;&lt;span class="ez-toc-section" id="FormatException"&gt;&lt;/span&gt;FormatException&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;引數格式無效或複合格式字串格式不正確時所擲回的例外狀況。&lt;/p&gt;
&lt;p&gt;此用法是想使用字串插值，但因為語法錯誤，導致異常。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string template = "user_name: {bocky}"; 
string result = string.Format(template, "bocky");&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;錯誤如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;System.FormatException: Input string was not in a correct format.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="trycatchfinally"&gt;&lt;span class="ez-toc-section" id="try%E2%80%A6catch%E2%80%A6finally"&gt;&lt;/span&gt;try…catch…finally&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;不要太依賴，若是能在開發時就想到需要檢查/判斷的地方，就先做好。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 &lt;a href="https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/try-catch"&gt;Microsoft：try-catch&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 &lt;a href="https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/try-finally"&gt;Microsoft：try-finally&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 &lt;a href="https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/try-catch-finally"&gt;Microsoft：try-catch-finally&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;try
{
//程式執行區或可能發生異常的地方
}
catch (Exception ex)
{
//例外的處理方法，如秀出警告
}
finally
{
//無論是否有發生例外事件，都會執行這區塊
}&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[C#]字串相關處理</title><link>https://quietbo.com/2021/10/31/c%E5%AD%97%E4%B8%B2%E7%9B%B8%E9%97%9C%E8%99%95%E7%90%86/</link><pubDate>Sun, 31 Oct 2021 15:41:04 +0000</pubDate><guid>https://quietbo.com/2021/10/31/c%E5%AD%97%E4%B8%B2%E7%9B%B8%E9%97%9C%E8%99%95%E7%90%86/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%88%AA%E9%99%A4%E5%AD%97%E4%B8%B2%E5%B7%A6%E9%82%8A_%E5%8F%B3%E9%82%8A_%E5%85%A9%E5%81%B4%E7%9A%84%E7%A9%BA%E7%99%BD" &gt;刪除字串左邊, 右邊, 兩側的空白&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E7%8D%B2%E5%BE%97%E5%AD%97%E4%B8%B2%E7%9A%84%E9%95%B7%E5%BA%A6" &gt;獲得字串的長度&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E6%88%AA%E5%8F%96%E5%AD%97%E4%B8%B2" &gt;截取字串&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%AD%97%E4%B8%B2%E5%87%BA%E7%8F%BE%E6%9F%90%E4%BA%9B%E5%AD%97%E7%9A%84%E4%BD%8D%E7%BD%AE" &gt;字串出現某些字的位置&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%AD%97%E4%B8%B2%E5%8F%96%E4%BB%A3" &gt;字串取代&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%AD%97%E4%B8%B2%E5%88%87%E5%89%B2" &gt;字串切割&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-7" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%AD%97%E4%B8%B2%E8%BD%89%E6%8F%9B" &gt;字串轉換&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-8" href="https://quietbo.com/2021/10/31/c%e5%ad%97%e4%b8%b2%e7%9b%b8%e9%97%9c%e8%99%95%e7%90%86/#%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E9%96%8B%E9%A0%AD%E6%88%96%E7%B5%90%E5%B0%BE%E6%98%AF%E5%90%A6%E7%AC%A6%E5%90%88%E6%8C%87%E5%AE%9A%E7%9A%84%E5%AD%97%E4%B8%B2" &gt;判斷字串開頭或結尾是否符合指定的字串&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="刪除字串左邊-右邊-兩側的空白"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4%E5%AD%97%E4%B8%B2%E5%B7%A6%E9%82%8A_%E5%8F%B3%E9%82%8A_%E5%85%A9%E5%81%B4%E7%9A%84%E7%A9%BA%E7%99%BD"&gt;&lt;/span&gt;刪除字串左邊, 右邊, 兩側的空白&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 TrimStart() 刪除左空白
 &lt;/li&gt;
 &lt;li&gt;
 rimEnd() 刪除右空白
 &lt;/li&gt;
 &lt;li&gt;
 Trim() 刪除左右空白
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;範例：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string str_name = " bocky Bocky ";
string trim_start = str_name.TrimStart();
string trim_end = str_name.TrimEnd();
string trim_reim = str_name.Trim();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;結果如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;bocky Bocky 
 bocky Bocky
bocky Bocky&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="獲得字串的長度"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%BE%97%E5%AD%97%E4%B8%B2%E7%9A%84%E9%95%B7%E5%BA%A6"&gt;&lt;/span&gt;獲得字串的長度&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;最常使用在獲得帳號或密碼的長度上，做長度的限制。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string password = "iambocky";
int password_len = password.Length;
Console.WriteLine("密碼長度:" + password_len); // 8&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="截取字串"&gt;&lt;span class="ez-toc-section" id="%E6%88%AA%E5%8F%96%E5%AD%97%E4%B8%B2"&gt;&lt;/span&gt;截取字串&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 擷取的位置需在字串範圍
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre title="" class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string name = "iambocky";
string news_name = name.Substring(3, 5); 
Console.WriteLine(news_name);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字串出現某些字的位置"&gt;&lt;span class="ez-toc-section" id="%E5%AD%97%E4%B8%B2%E5%87%BA%E7%8F%BE%E6%9F%90%E4%BA%9B%E5%AD%97%E7%9A%84%E4%BD%8D%E7%BD%AE"&gt;&lt;/span&gt;字串出現某些字的位置&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 IndexOf() 由左至右開始檢查，傳回第一個符合的位置,若字串中沒有符合則傳回-1
 &lt;/li&gt;
 &lt;li&gt;
 LastIndexOf() 是從字串最後（右向左）尋找, 傳回第一個符合的位置
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;範例：判斷字串裡是否有@&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string email = "bocky@gmail.com";
int location = email.IndexOf('@');
Console.WriteLine(location); // @所在的位置（從0開始）
if (location &amp;gt; 0)
{
 Console.WriteLine("屬於email");
}
else
{
 Console.WriteLine("不屬於email");
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字串取代"&gt;&lt;span class="ez-toc-section" id="%E5%AD%97%E4%B8%B2%E5%8F%96%E4%BB%A3"&gt;&lt;/span&gt;字串取代&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;將字串裡的某一個字,或某個字串, 置換成其他字。&lt;/p&gt;
&lt;p&gt;不想要空白，就把空白取代為，範例：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string value = " te st .jos n ";
string result = value.Replace(" ", "");
Console.WriteLine(result); // test.josn&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字串切割"&gt;&lt;span class="ez-toc-section" id="%E5%AD%97%E4%B8%B2%E5%88%87%E5%89%B2"&gt;&lt;/span&gt;字串切割&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;將一個字串分割成數個子字串。&lt;br&gt;
Split()&lt;/p&gt;
&lt;p&gt;舉例要取年月日，用/來做切割，切割出來的資料需存在陣列內。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string today = "2021/10/31";
string[] tmp = today.Split('/');

string year = tmp[0];
string month = tmp[1];
string day = tmp[2];

Console.WriteLine(year); // 2021
Console.WriteLine(month); // 10
Console.WriteLine(day); //31&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字串轉換"&gt;&lt;span class="ez-toc-section" id="%E5%AD%97%E4%B8%B2%E8%BD%89%E6%8F%9B"&gt;&lt;/span&gt;字串轉換&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 ToUpper() 全部大寫
 &lt;/li&gt;
 &lt;li&gt;
 ToLower() 全部小寫
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大部分需要全部轉換成大小寫一致的話是為了比對。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string name = "Bocky";
Console.WriteLine(name.ToUpper()); //全部大寫BOCKY
Console.WriteLine(name.ToLower()); //全部小寫bocky&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;補充:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;若想判斷二個變數內的字串文字是否相同, 建議使用：Equals() &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class="link" href="https://stackoverflow.com/questions/814878/c-sharp-difference-between-and-equals" target="_blank" rel="noopener"
 &gt;== 和 Equals() 的區別&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="判斷字串開頭或結尾是否符合指定的字串"&gt;&lt;span class="ez-toc-section" id="%E5%88%A4%E6%96%B7%E5%AD%97%E4%B8%B2%E9%96%8B%E9%A0%AD%E6%88%96%E7%B5%90%E5%B0%BE%E6%98%AF%E5%90%A6%E7%AC%A6%E5%90%88%E6%8C%87%E5%AE%9A%E7%9A%84%E5%AD%97%E4%B8%B2"&gt;&lt;/span&gt;判斷字串開頭或結尾是否符合指定的字串&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;傳回:Boolean&lt;br&gt;
範例：檢查開頭是否有https://&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string url = "https://www.quietbo.com";
bool is_https = url.StartsWith("https://");&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例：檢查結尾是否有.com&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string url = "https://www.quietbo.com";
bool is_com = url.EndsWith(".com");&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[C#] 變數宣告</title><link>https://quietbo.com/2021/10/25/c-%E8%AE%8A%E6%95%B8%E5%AE%A3%E5%91%8A%E8%B5%B7%E6%AD%A5%E8%B5%B0-%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82/</link><pubDate>Sun, 24 Oct 2021 17:30:25 +0000</pubDate><guid>https://quietbo.com/2021/10/25/c-%E8%AE%8A%E6%95%B8%E5%AE%A3%E5%91%8A%E8%B5%B7%E6%AD%A5%E8%B5%B0-%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82/</guid><description>&lt;p&gt;環境:Windows 10&lt;br&gt;
IDE:VS2019&lt;/p&gt;
&lt;p&gt;在C#中，//是單行註解，/**/是區塊註解&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 宣告的變數一定要給予型別。
 &lt;/li&gt;
 &lt;li&gt;
 var則是一定要給值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#%E6%95%B4%E6%95%B8int" &gt;整數int&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#var" &gt;var&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#%E6%B5%AE%E9%BB%9E%E6%95%B8float%E3%80%81double%E3%80%81decimal" &gt;浮點數(float、double、decimal)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#%E5%AD%97%E4%B8%B2String" &gt;字串(String)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#%E9%99%A3%E5%88%97arry" &gt;陣列(arry)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/10/25/c-%e8%ae%8a%e6%95%b8%e5%ae%a3%e5%91%8a%e8%b5%b7%e6%ad%a5%e8%b5%b0-%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82/#%E7%89%B9%E6%AE%8A%E9%80%B8%E5%87%BAEscape%E5%AD%97%E5%85%83" &gt;特殊逸出Escape字元&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="整數int"&gt;&lt;span class="ez-toc-section" id="%E6%95%B4%E6%95%B8int"&gt;&lt;/span&gt;整數int&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/builtin-types/integral-numeric-types" target="_blank" rel="noopener"
 &gt;microsoft(整數的數字型別)&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;int apple = 100; // 宣告變數apple時就給值100

int bird; // 宣告變數bird，但不給值
bird = 200; // 設定變數bird的值為200

int lucky_girl_age = 18, lucky_boy_age = 17, abby; // 宣告數個同型別的變數&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="var"&gt;&lt;span class="ez-toc-section" id="var"&gt;&lt;/span&gt;var&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 必需宣告值&lt;br /&gt;var是一定要先給值，var是讓電腦來區分值是什麼型別，若沒有給值，電腦會無法判斷。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在編譯時會經由10,推測number的型別是整數:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;var number = 10; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不能只宣告的:var&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZnchZOq.png" alt="" /&gt;&lt;br&gt;
補充:checked 是用來明確啟用整數型別算術運算和轉換的溢位檢查。&lt;/p&gt;
&lt;h2 id="浮點數floatdoubledecimal"&gt;&lt;span class="ez-toc-section" id="%E6%B5%AE%E9%BB%9E%E6%95%B8float%E3%80%81double%E3%80%81decimal"&gt;&lt;/span&gt;浮點數(float、double、decimal)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types" target="_blank" rel="noopener"
 &gt;microsoft(浮點數值型別)&lt;/a&gt;&lt;br&gt;
每個浮點數型別的預設值都是零，浮點數型別都有 MinValue 與 MaxValue 常數，提供該型別的最小與最大有限值。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 float
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 單精準數
 &lt;/li&gt;
 &lt;li&gt;
 不可以直接只指定數值，必需在數值最後加 F 或 f
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 double
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 雙精準數
 &lt;/li&gt;
 &lt;li&gt;
 可以直接指定數值，或在數值最後加 D 或 d
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 decimal
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 進位數
 &lt;/li&gt;
 &lt;li&gt;
 不可以直接只指定數值，必需在數值最後加M或m
 &lt;/li&gt;
 &lt;li&gt;
 通常用於財務(有關錢的計算)。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;從c# 7.0開始支援_做為數位分隔符號，可以使用數位分隔符號搭配所有種類的數值常值。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;double d_1 = 9D;
double d_2 = 6d;
double d_3 = 4.852_0001000;
Console.WriteLine(d_3); // 4.8520001

float f_1 = 2_000.5F;
float f_2 = 3.4000f;
Console.WriteLine(f_2); // 3.4

decimal myMoney_1 = 3_000.50m;
decimal myMoney_2 = 400.750000M;
Console.WriteLine(myMoney_2); // 400.750000&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以使用科學記號標記法。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;double d = 0.42e2;
Console.WriteLine(d); // 42

float f = 134.45E-2f;
Console.WriteLine(f); // 1.3445

decimal m = 1.5E6m;
Console.WriteLine(m); // 1500000&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="字串string"&gt;&lt;span class="ez-toc-section" id="%E5%AD%97%E4%B8%B2String"&gt;&lt;/span&gt;字串(String)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 字串加字串
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string firstName = "Hello";
string lastName = "World";
string fullName = firstName + "," + lastName;
Console.WriteLine(fullName); // Hello,World&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 字串加數字
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;int sum = 1 + 1;
string leading = "1+1=";
string result = leading + sum;
Console.WriteLine(result); //1+1=2&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 宣告字串為Null&lt;br /&gt;null 表示字串沒有任何值，可以與字串相加，不等於零(0)也不等於空字串。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string value1 = null;&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 空字串
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string value1 = "";
string value2 = string.Empty; // 空字串比較好的寫法&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="陣列arry"&gt;&lt;span class="ez-toc-section" id="%E9%99%A3%E5%88%97arry"&gt;&lt;/span&gt;陣列(arry)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 指定長度後就不可以再修改長度，較適合已知長度
 &lt;/li&gt;
 &lt;li&gt;
 第一筆資料從0開始
 &lt;/li&gt;
 &lt;li&gt;
 型別必須一致
 &lt;/li&gt;
 &lt;li&gt;
 可以重覆修改值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;資料型別 [] 陣列名稱 = new 資料型別[陣列大小];&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;int[] numbers = new int[4]; // 陣列長度為4
// 宣告後再把值填到陣列裡
numbers[0] = 1000;
numbers[1] = 10;
numbers[2] = 20;
numbers[3] = 30;
numbers[2] = -100; //修改值 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;宣告陣列時填入值：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;// 雖然一開始沒指定長度，但長度是固定的
string[] items = new[] {"A", "B", "C", "D", "E"};
// items[5] = "Z" //會報錯，陣列的長度已超過
/*
 * 長度只到5，會出現錯誤的訊息：
 * System.IndexOutOfRangeException: Index was outside the bounds of the array.
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;取得陣列長度:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string[] items = new[] {"A", "B", "C", "D", "E"};
int length = items.Length;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;排序小到大＆大到小：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;int[] items = new int[] {8, 10, 1, 3, 5};
Array.Sort(items); // 小到大
//Array.Reverse(items); // 轉成大到小需先使用sort排列過
foreach (var item in items)
{
 Console.Write($"{item}\t");
}
// 1 3 5 8 10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sort(小到大）允許傳入兩個陣列;&lt;br&gt;
下方使用2個不同的陣列來做成績的排序，且名字要與分數一致。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string[] students = {"小王", "小美", "大強", "大白", "自強", "莒光"};
int[] score_math = {80, 50, 90, 66, 76, 99};

// 將score_math排序, 且同時用相同順序排列students
Array.Sort(score_math, students);

//若想要遞增，則需使用2次Reverse
// Array.Reverse(score_math);
// Array.Reverse(students);
for (int i = 0; i&amp;lt; students.Length; i++)
{
 string name = students[i];
 int score = score_math[i];
 Console.WriteLine($"{name}的成績:{score}");
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;遞減的結果：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/hkeVe1p.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;遞增的結果：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/jJpiEPw.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="特殊逸出escape字元"&gt;&lt;span class="ez-toc-section" id="%E7%89%B9%E6%AE%8A%E9%80%B8%E5%87%BAEscape%E5%AD%97%E5%85%83"&gt;&lt;/span&gt;特殊逸出Escape字元&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 \&amp;#8217; 單引號
 &lt;/li&gt;
 &lt;li&gt;
 \&amp;#8221; 雙引號
 &lt;/li&gt;
 &lt;li&gt;
 \ 反斜線
 &lt;/li&gt;
 &lt;li&gt;
 \a 發出一聲警告
 &lt;/li&gt;
 &lt;li&gt;
 \b 倒退一個字元
 &lt;/li&gt;
 &lt;li&gt;
 \f Form Feed
 &lt;/li&gt;
 &lt;li&gt;
 \n 換新行
 &lt;/li&gt;
 &lt;li&gt;
 \r 換行並移到最前方
 &lt;/li&gt;
 &lt;li&gt;
 \t 水平方向的Tab
 &lt;/li&gt;
 &lt;li&gt;
 \v 垂直方向的Tab
 &lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[VirtualBox] ERROR Failed to send host log message</title><link>https://quietbo.com/2021/10/21/virtualbox-error-failed-to-send-host-log-message/</link><pubDate>Thu, 21 Oct 2021 10:20:13 +0000</pubDate><guid>https://quietbo.com/2021/10/21/virtualbox-error-failed-to-send-host-log-message/</guid><description>&lt;p&gt;某次要重開ubuntu時出現的錯誤訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;[drm:vmw_host_log [vmwgfx]] ERROR Failed to send host log message&lt;/code&gt;&lt;/pre&gt;
&lt;img decoding="async" src="https://i.imgur.com/S2fjQh6.png" alt="" /&gt; 
&lt;p&gt;解決方式:&lt;br&gt;
設定 -&amp;gt; 顯示 -&amp;gt; 畫面 -&amp;gt; 圖形控制器 -&amp;gt; VBoxVGA&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HjhGz0L.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Git]使用Meld作為git diff tool</title><link>https://quietbo.com/2021/10/18/%E4%BD%BF%E7%94%A8meld%E4%BD%9C%E7%82%BAgit-diff-tool%E5%92%8Cmergetool/</link><pubDate>Mon, 18 Oct 2021 10:52:18 +0000</pubDate><guid>https://quietbo.com/2021/10/18/%E4%BD%BF%E7%94%A8meld%E4%BD%9C%E7%82%BAgit-diff-tool%E5%92%8Cmergetool/</guid><description>&lt;p&gt;環境:ubuntu20.04&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 下載meld
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo apt-get install meld&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 設置git
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;git config --global diff.external meld &lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 在自己的的目錄下建立一個git-meld.sh 的script:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;vi ~/git-meld.sh &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;#!/bin/sh
meld $2 $5&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 查看是否有存入
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;cat ~/git-meld.sh&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 改變檔案的屬性:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;chmod 777 ~/git-meld.sh&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 把external diff 改成這個shell script:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;git config --global diff.external ~/git-meld.sh&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 使用git diff
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;git log # 複製選取要查看的commit_id
git diff [commit_id]&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[基礎]命名規則</title><link>https://quietbo.com/2021/10/06/%E5%9F%BA%E7%A4%8E%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87/</link><pubDate>Wed, 06 Oct 2021 06:44:00 +0000</pubDate><guid>https://quietbo.com/2021/10/06/%E5%9F%BA%E7%A4%8E%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87/</guid><description>&lt;p&gt;剛出來寫程式，還是一張超級白紙時，覺得命名就是讓人看得懂變數就好啦~現在好想回頭揍自己 ಠ▃ಠ&lt;/p&gt;
&lt;p&gt;命名有兩個關鍵是:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 可讀性
 &lt;/li&gt;
 &lt;li&gt;
 一致性
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Snake Case, Pascal Case, Camel Case 這三種是較常被採用的命名方式，像像在目前專案上，變數則是使用Snake Case，但在Function則使用Pascal或Camel Case&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/10/06/%e5%9f%ba%e7%a4%8e%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87/#Snake_Case" &gt;Snake Case&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/10/06/%e5%9f%ba%e7%a4%8e%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87/#Pascal_Case" &gt;Pascal Case&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/10/06/%e5%9f%ba%e7%a4%8e%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87/#Camel_Case%E9%A7%9D%E5%B3%B0%E5%BC%8F" &gt;Camel Case(駝峰式)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/10/06/%e5%9f%ba%e7%a4%8e%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87/#Kebab_Case" &gt;Kebab Case&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/10/06/%e5%9f%ba%e7%a4%8e%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87/#Screaming_Case" &gt;Screaming Case&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="snake-case"&gt;&lt;span class="ez-toc-section" id="Snake_Case"&gt;&lt;/span&gt;Snake Case&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;單字皆為小寫，單字以底線_分離。例如:user_name&lt;/p&gt;
&lt;h2 id="pascal-case"&gt;&lt;span class="ez-toc-section" id="Pascal_Case"&gt;&lt;/span&gt;Pascal Case&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;跟 Camel Case 類似，只是第一個字要大寫。例如:UserName&lt;/p&gt;
&lt;h2 id="camel-case駝峰式"&gt;&lt;span class="ez-toc-section" id="Camel_Case%E9%A7%9D%E5%B3%B0%E5%BC%8F"&gt;&lt;/span&gt;Camel Case(駝峰式)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;第一個字母為小寫，之後每一個單字的開頭為大寫，不包含空格。&lt;br&gt;
例如:userName&lt;/p&gt;
&lt;h2 id="kebab-case"&gt;&lt;span class="ez-toc-section" id="Kebab_Case"&gt;&lt;/span&gt;Kebab Case&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;跟Snake Case類似，單字以減號-分離。例如:user-name&lt;br&gt;
較常在html裡面的class、div、id看到&lt;/p&gt;
&lt;h2 id="screaming-case"&gt;&lt;span class="ez-toc-section" id="Screaming_Case"&gt;&lt;/span&gt;Screaming Case&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;跟Snake Case類似，單字皆為全大寫。例如:PROJECT_NAME&lt;br&gt;
常用地方:全域變數或設定檔內的變數。&lt;/p&gt;
&lt;p&gt;我在取名字會盡量保持幾個原則&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 不超過40個字
 &lt;/li&gt;
 &lt;li&gt;
 不使用羅馬拼音(例如Jiancha，唸法就同檢查)
 &lt;/li&gt;
 &lt;li&gt;
 使用有意義或公認的英文縮寫
 &lt;/li&gt;
 &lt;li&gt;
 變數使用名詞或形容詞，有關function或操作的使用動詞
 &lt;/li&gt;
 &lt;li&gt;
 選擇好溝通的英文
 &lt;/li&gt;
 &lt;li&gt;
 好搜索，例如id，就加個user_id或admin_id，不然用id搜尋整個專案，出來可能會有上千個id…
 &lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Iphone] 不使用USB，投影畫面至電腦</title><link>https://quietbo.com/2021/10/01/iphone-%E4%B8%8D%E4%BD%BF%E7%94%A8usb%EF%BC%8C%E6%8A%95%E5%BD%B1%E7%95%AB%E9%9D%A2%E8%87%B3%E9%9B%BB%E8%85%A6/</link><pubDate>Fri, 01 Oct 2021 07:02:46 +0000</pubDate><guid>https://quietbo.com/2021/10/01/iphone-%E4%B8%8D%E4%BD%BF%E7%94%A8usb%EF%BC%8C%E6%8A%95%E5%BD%B1%E7%95%AB%E9%9D%A2%E8%87%B3%E9%9B%BB%E8%85%A6/</guid><description>&lt;p&gt;需要準備的有:一台iphone手機、一台電腦及無線網路。&lt;/p&gt;
&lt;p&gt;使用:&lt;br&gt;
iPhone 11Pro(IOS v14.6)&lt;br&gt;
電腦:windows 10&lt;br&gt;
享幕版本:1.2.4.4&lt;/p&gt;
&lt;p&gt;目前已知問題:&lt;strong&gt;YT無法投影&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;手機安裝: &lt;a href="https://apps.apple.com/app/letsview-easy-screen-cast-tool/id1478202069" data-type="URL" data-id="https://apps.apple.com/app/letsview-easy-screen-cast-tool/id1478202069"&gt;點我下載幕享IOS版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;電腦下載: &lt;a href="https://download.aoscdn.com/down.php?softid=letsview-protop&amp;_cc=8&amp;_ct=1633057079&amp;_dm=letsview.com&amp;_gn=ANGLE%20(Intel%2C%20Intel(R)%20UHD%20Graphics%20620%20Direct3D11%20vs_5_0%20ps_5_0%2C%20D3D11-27.20.100.8337)&amp;_sh=864&amp;_sw=1536&amp;_tz=GMT%2B0800&amp;_vi=ab393f8c60c79b2a4c2dbc71c35190f9&amp;_wxga=GA1.2.2019990918.1633055975" data-type="URL" data-id="https://download.aoscdn.com/down.php?softid=letsview-protop&amp;_cc=8&amp;_ct=1633057079&amp;_dm=letsview.com&amp;_gn=ANGLE%20(Intel%2C%20Intel(R)%20UHD%20Graphics%20620%20Direct3D11%20vs_5_0%20ps_5_0%2C%20D3D11-27.20.100.8337)&amp;_sh=864&amp;_sw=1536&amp;_tz=GMT%2B0800&amp;_vi=ab393f8c60c79b2a4c2dbc71c35190f9&amp;_wxga=GA1.2.2019990918.1633055975" target="_blank" rel="noreferrer noopener"&gt;點我下載[幕享電腦版]&lt;/a&gt;&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 先將iPhone及電腦連至同一個wifi網路
 &lt;/li&gt;
 &lt;li&gt;
 電腦打開幕享&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/Etf7pT2.png" alt="" /&gt;&lt;br /&gt;開啟畫面如下，打開箭頭方向的QRCode:&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/TIG7ser.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;展開後會看到QRCode和一組密碼&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/PC6OWht.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;第三種登入方式:&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 iPhone開啟幕享APP&lt;br /&gt;登入方式我試過三種，三種都可以:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 直接點選與電腦的本機名稱一樣的設備名稱&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/gRFAI7e.png" alt="" /&gt;&lt;br /&gt;第二種登入方式:
 &lt;/li&gt;
 &lt;li&gt;
 輸入投影碼連接(電腦端顯示的3801)&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/fHpDVn4.png" alt="" /&gt;&lt;br /&gt;第三種登入方式:
 &lt;/li&gt;
 &lt;li&gt;
 掃QRCode&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/yNO9DA3.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 選擇投射方式&lt;br /&gt;本次是要將手機畫面投影到電腦，所以選擇「手機螢幕投射」&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/em662oA.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 打開iPhone的控制中心&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/MTxsV3W.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;選擇要螢幕鏡像輸出:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3BusSq1.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 打開電腦&lt;br /&gt;連接成功後，電腦會自動跳出幕享的畫面，這時候的操作都會顯示在螢幕上了。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/z1R0yrd.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更多問題請查看&lt;br&gt;
&lt;a class="link" href="https://letsview.com/tw/faq/cant-connect-via-wifi.html" target="_blank" rel="noopener"
 &gt;幕享&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Docker] Mac M1 – no matching manifest for linux/arm64/v8 in the manifest list entries(已解決)</title><link>https://quietbo.com/2021/09/27/docker-mac-m1-no-matching-manifest-for-linux-arm64-v8-in-the-manifest-list-entries%E5%B7%B2%E8%A7%A3%E6%B1%BA/</link><pubDate>Mon, 27 Sep 2021 13:47:30 +0000</pubDate><guid>https://quietbo.com/2021/09/27/docker-mac-m1-no-matching-manifest-for-linux-arm64-v8-in-the-manifest-list-entries%E5%B7%B2%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;在 Mac M1的終端機，docker pull mysql image，出現如下的錯誤訊息：&lt;/p&gt;
&lt;img decoding="async" src="https://i.imgur.com/h6wkxX3.png" alt="" /&gt; 
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;no matching manifest for linux/arm64/v8 in the manifest list entries&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這個鏡像只有linux/amd64的架構，而M1是ARM芯片，所以pull下來的版本，沒有適用於arm64架構的mysql鏡像&lt;/p&gt;
&lt;p&gt;到docker hub上看到的，也都是linux/amd64。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/DzDrdLN.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;從&lt;a class="link" href="https://docs.docker.com/desktop/mac/apple-silicon/" target="_blank" rel="noopener"
 &gt;docker的文檔&lt;/a&gt;有說到：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/1sqm9qK.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;可以在終端機使用下方指令來&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker pull --platform linux/amd64 mysql&lt;/code&gt;&lt;/pre&gt;
&lt;img decoding="async" src="https://i.imgur.com/MdIdaxw.png" alt="" /&gt; 
查看後安裝成功。
&lt;p&gt;補充：&lt;br&gt;
如果是dockerfile，加上下面這行，就可以正常運行了：&lt;br&gt;
原本：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM ubuntu:18.04&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改後：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM --platform=linux/x86_64 ubuntu:18.04&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[IDE] VS2019 無法解析、找不到NuGet套件、還原失敗:400</title><link>https://quietbo.com/2021/09/23/ide-vs2019-%E7%84%A1%E6%B3%95%E8%A7%A3%E6%9E%90%E3%80%81%E6%89%BE%E4%B8%8D%E5%88%B0nuget%E5%A5%97%E4%BB%B6%E3%80%81%E9%82%84%E5%8E%9F%E5%A4%B1%E6%95%97400/</link><pubDate>Thu, 23 Sep 2021 12:00:49 +0000</pubDate><guid>https://quietbo.com/2021/09/23/ide-vs2019-%E7%84%A1%E6%B3%95%E8%A7%A3%E6%9E%90%E3%80%81%E6%89%BE%E4%B8%8D%E5%88%B0nuget%E5%A5%97%E4%BB%B6%E3%80%81%E9%82%84%E5%8E%9F%E5%A4%B1%E6%95%97400/</guid><description>&lt;p&gt;某天下載了VS2019要build新專案，結果跳出一千多行的錯誤訊息，跟旁邊的工程師求救，用一段時間後還是無解，最後去找大神求救，原因是:NuGet沒有下載來源呀!!!&lt;/p&gt;
&lt;p&gt;NuGet2連網路套件來源(第三方網站)才能下載，不然就是用電腦offline本身的套件。&lt;br&gt;
所以找不到套件，有可能來源壞了，或是跟我一樣根本沒有連到NuGet。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/722rDD7.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;工具 -&amp;gt; NuGet套件管理員 -&amp;gt; 套件管理員設定&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/A3Qkn5L.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;一定要加入才能連到nuget:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;名稱:nuget.org
來源:https://api.nuget.org/v3/index.json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Offline Packages:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;名稱:Microsoft Visual Studio Offline Packages
來源:C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/StG7iPW.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;補充:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;2021/09/23
前陣子都滿正常的，但今天在公司重build卻出現NuGet失敗:[還原失敗 400 bad request]的訊息，
回家研究時，連上家裡網路，NuGet就成功了。(中華電信)&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[C#] 建置一個Hello world</title><link>https://quietbo.com/2021/09/21/c-%E5%BB%BA%E7%BD%AE%E4%B8%80%E5%80%8Bhello-world-%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B81/</link><pubDate>Tue, 21 Sep 2021 06:57:13 +0000</pubDate><guid>https://quietbo.com/2021/09/21/c-%E5%BB%BA%E7%BD%AE%E4%B8%80%E5%80%8Bhello-world-%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B81/</guid><description>&lt;p&gt;環境:Windows&lt;br&gt;
IDE: VS2019&lt;/p&gt;
&lt;h2 id="建置一個c專案來顯示hello-world"&gt;建置一個C#專案來顯示Hello world
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 開啟VS2019 (Visual Studio 2019)
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/bQCe6MN.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 開啟新的專案
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/nYWaSE2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 建立專案
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/2gAkOLz.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/T2QPiHi.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 添加一行要顯示的文字
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在Main裡面(第12~14行)中間填入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;Console.WriteLine("Hello world");&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/EoPdfsz.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;一定要按下儲存(Ctrl+S)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/agfE2kz.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 建置/重建方案
 &lt;/li&gt;
&lt;/ol&gt;
&lt;img decoding="async" src="https://i.imgur.com/q7MzcI1.png" alt="" /&gt; 
注意:不要有失敗 
&lt;img decoding="async" src="https://i.imgur.com/ConnLgf.png" alt="" /&gt; 
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 執行
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;偵錯-&amp;gt; 啟動但不偵錯&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/uxTlUyR.png" alt="" /&gt;&lt;br&gt;
會跳出一個終端機，顯示Hello world&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3zF60gf.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Redis] Key命令與五種數據的操作(基本指令)</title><link>https://quietbo.com/2021/09/18/redis-key%E5%91%BD%E4%BB%A4%E8%88%87%E4%BA%94%E7%A8%AE%E6%95%B8%E6%93%9A%E7%9A%84%E6%93%8D%E4%BD%9C%E5%9F%BA%E6%9C%AC%E6%8C%87%E4%BB%A4/</link><pubDate>Sat, 18 Sep 2021 15:12:23 +0000</pubDate><guid>https://quietbo.com/2021/09/18/redis-key%E5%91%BD%E4%BB%A4%E8%88%87%E4%BA%94%E7%A8%AE%E6%95%B8%E6%93%9A%E7%9A%84%E6%93%8D%E4%BD%9C%E5%9F%BA%E6%9C%AC%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;作者:不一定會持續更新。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#Key%E5%91%BD%E4%BB%A4" &gt;Key命令&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E6%AA%A2%E6%9F%A5Key%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8" &gt;檢查Key是否存在&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E6%9F%A5%E7%9C%8BKey%E5%B0%8D%E6%87%89%E7%9A%84value%E7%9A%84%E9%A1%9E%E5%9E%8BType" &gt;查看Key對應的value的類型(Type)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%88%AA%E9%99%A4Key" &gt;刪除Key&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E8%A8%AD%E7%BD%AEKey%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93" &gt;設置Key過期時間&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E6%9F%A5%E7%9C%8BKey%E7%9A%84%E6%9C%89%E6%95%88%E6%99%82%E9%96%93" &gt;查看Key的有效時間:&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-7&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#String%E5%AD%97%E7%AC%A6%E4%B8%B2&amp;quot; &amp;gt;String字符串&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-8&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#Set%E3%80%81Setnx_%E8%A8%AD%E7%BD%AEkey%E8%88%87value_%E8%A8%AD%E7%BD%AE%E5%A4%9A%E5%80%8B&amp;quot; &amp;gt;Set、Setnx 設置key與value &amp;amp; 設置多個&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-9&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E8%A8%AD%E7%BD%AE%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93&amp;quot; &amp;gt;設置過期時間&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-10&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E7%8D%B2%E5%8F%96value_%E5%A4%9A%E5%80%8Bvaleu&amp;quot; &amp;gt;獲取value &amp;amp; 多個valeu&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;

&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-11&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#List%E5%88%97%E8%A1%A8&amp;quot; &amp;gt;List列表&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-12&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%A2%9E%E5%8A%A0&amp;quot; &amp;gt;增加&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-13&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E4%BF%AE%E6%94%B9%E6%8C%87%E5%AE%9A%E4%BD%8D%E7%BD%AE%E7%9A%84value&amp;quot; &amp;gt;修改指定位置的value&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-14&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E7%8D%B2%E5%8F%96value&amp;quot; &amp;gt;獲取value&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-15&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%88%AA%E9%99%A4%E6%9F%90%E5%80%8B%E5%A4%9A%E5%80%8B%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;刪除某個/多個元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;

&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-16&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#Set%E9%9B%86%E5%90%88&amp;quot; &amp;gt;Set集合&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-17&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%A2%9E%E5%8A%A0-2&amp;quot; &amp;gt;增加&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-18&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E7%8D%B2%E5%8F%96&amp;quot; &amp;gt;獲取&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-19&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%88%AA%E9%99%A4&amp;quot; &amp;gt;刪除&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;

&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-20&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#zset%E6%9C%89%E5%BA%8F%E9%9B%86%E5%90%88&amp;quot; &amp;gt;zset有序集合&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-21&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%A2%9E%E5%8A%A0-3&amp;quot; &amp;gt;增加&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-22&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E7%8D%B2%E5%8F%96member%E8%88%87score&amp;quot; &amp;gt;獲取member與score&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-23&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%88%AA%E9%99%A4-2&amp;quot; &amp;gt;刪除&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;

&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-24&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#hash&amp;quot; &amp;gt;hash&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-25&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%A2%9E%E5%8A%A0-4&amp;quot; &amp;gt;增加&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-26&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E7%8D%B2%E5%8F%96field%E8%88%87value&amp;quot; &amp;gt;獲取field與value&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-27&amp;quot; href=&amp;quot;https://quietbo.com/2021/09/18/redis-key%e5%91%bd%e4%bb%a4%e8%88%87%e4%ba%94%e7%a8%ae%e6%95%b8%e6%93%9a%e7%9a%84%e6%93%8d%e4%bd%9c%e5%9f%ba%e6%9c%ac%e6%8c%87%e4%bb%a4/#%E5%88%AA%E9%99%A4%E5%B1%9E%E6%80%A7&amp;quot; &amp;gt;刪除属性&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="key命令"&gt;&lt;span class="ez-toc-section" id="Key%E5%91%BD%E4%BB%A4"&gt;&lt;/span&gt;Key命令&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 在查找key的時候支持正則
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: revert; color: initial;"&gt;格式&lt;/span&gt;:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;keys pattern&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;keys * # 查所有key，常用
keys 'k*' # 查名稱包含[開頭為k]的key&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/dGtaC1H.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="檢查key是否存在"&gt;&lt;span class="ez-toc-section" id="%E6%AA%A2%E6%9F%A5Key%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8"&gt;&lt;/span&gt;檢查Key是否存在&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;格式(可多個): 存在返回1，不存在返回0&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;exists key1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;exists k0
exists k1
exists k0 k1
exists k0 k1 k2 k3&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/EYs4V02.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="查看key對應的value的類型type"&gt;&lt;span class="ez-toc-section" id="%E6%9F%A5%E7%9C%8BKey%E5%B0%8D%E6%87%89%E7%9A%84value%E7%9A%84%E9%A1%9E%E5%9E%8BType"&gt;&lt;/span&gt;查看Key對應的value的類型(Type)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;type key&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;redis⽀持的五種類型:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 string
 &lt;/li&gt;
 &lt;li&gt;
 list
 &lt;/li&gt;
 &lt;li&gt;
 set
 &lt;/li&gt;
 &lt;li&gt;
 zset
 &lt;/li&gt;
 &lt;li&gt;
 hash
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/r0GYnew.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="刪除key"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4Key"&gt;&lt;/span&gt;刪除Key&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;del key1
del key1 key2 key3 # 刪除多個&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/7qjMFEG.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="設置key過期時間"&gt;&lt;span class="ez-toc-section" id="%E8%A8%AD%E7%BD%AEKey%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93"&gt;&lt;/span&gt;設置Key過期時間&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;如果在一開始就沒有指定過期時間，Key會一直存在，直到用Del才會移除，&lt;br&gt;
在已有的Key設置過期時間(以秒為單位):&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;expire key seconds&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="查看key的有效時間"&gt;&lt;span class="ez-toc-section" id="%E6%9F%A5%E7%9C%8BKey%E7%9A%84%E6%9C%89%E6%95%88%E6%99%82%E9%96%93"&gt;&lt;/span&gt;查看Key的有效時間:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ttl key&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/cRx86MR.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="string字符串"&gt;&lt;span class="ez-toc-section" id="String%E5%AD%97%E7%AC%A6%E4%B8%B2"&gt;&lt;/span&gt;String字符串&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;字符串類型是Redis中最為基礎的數據存儲類型，它在Redis中是二進制安全的，這便意味著該類型可以接受任何格式的數據，如JPEG圖像數據或Json對象描述信息等。在Redis中字符串類型的Value最多可以容納的數據長度是512M。&lt;/p&gt;
&lt;p&gt;想了解更多命令可參考:&lt;a class="link" href="http://redisdoc.com/string/set.html" target="_blank" rel="noopener"
 &gt;String&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="setsetnx-設置key與value--設置多個"&gt;&lt;span class="ez-toc-section" id="Set%E3%80%81Setnx_%E8%A8%AD%E7%BD%AEkey%E8%88%87value_%E8%A8%AD%E7%BD%AE%E5%A4%9A%E5%80%8B"&gt;&lt;/span&gt;Set、Setnx 設置key與value &amp;amp; 設置多個&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 如果設置的key不存在則添加，若key已存在則修改value。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;set key value # 設置一個
mset key1 value1 key2 value2 key2 value2 # 設置多個&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;設置一個key與value:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;set name hello&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/tmo5cCi.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 如果設置的key存在則不做任何動作。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;setnx name hello&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/LSeIgIc.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 設置多個key與value:
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;mset k1 hello k2 hi k3 good&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/cMOrueo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="設置過期時間"&gt;&lt;span class="ez-toc-section" id="%E8%A8%AD%E7%BD%AE%E9%81%8E%E6%9C%9F%E6%99%82%E9%96%93"&gt;&lt;/span&gt;設置過期時間&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 為key設定value值，並且設定過期時間
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;setex key seconds value # 以秒為單位&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;setex ice 5 cream # 設置5秒後過期
get ice # cream
get ice # 5秒後在獲取會回nil&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/HRQsEqT.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 在key的value內追加值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;append key value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原本k3的value是good，我在k3的value追加值:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;append k3 morning&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/VHFQgFM.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;但若是原本沒有key的話，會設置一個新的key與value&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/0Jcqu0N.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="獲取value--多個valeu"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%8F%96value_%E5%A4%9A%E5%80%8Bvaleu"&gt;&lt;/span&gt;獲取value &amp;amp; 多個valeu&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 get：根據鍵獲取值，如果不存在此鍵則返回nil
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;get key
mget key1 key2 key3 # 獲取多個值&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;mget k1 k2 k3 &lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/gXN9alW.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="list列表"&gt;&lt;span class="ez-toc-section" id="List%E5%88%97%E8%A1%A8"&gt;&lt;/span&gt;List列表&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;列表的元素類型為有序列的字符串&lt;/strong&gt;&lt;br&gt;
想了解更多命令可參考:&lt;a class="link" href="http://redisdoc.com/list/index.html" target="_blank" rel="noopener"
 &gt;List&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="增加"&gt;&lt;span class="ez-toc-section" id="%E5%A2%9E%E5%8A%A0"&gt;&lt;/span&gt;增加&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 從左/右側添加數據
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lpush key value1 value2 value3 ....valueN # 左側
rpush key value1 value2 value3 ....valueN # 右側&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖為從左/右側加入數據的範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lpush Llist A B C D E
rpush Rlist R O P W Z
lrange Llist 0 5
lrange Rlist 0 5&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Zzun1l5.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;lpush的第一個元素(0)是E，因為lpush插入的方式是像下方影片的插入方式，&lt;br&gt;
所以原本第一個A才會在最後。(右側則不舉例)&lt;figure class="wp-block-gallery columns-1 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"&gt;&lt;/p&gt;
&lt;ul class="blocks-gallery-grid"&gt;
 &lt;li class="blocks-gallery-item"&gt;
 &lt;figure&gt;&lt;img loading="lazy" decoding="async" width="900" height="450" src="https://quietbo.com/uploads/2021/09/wTdUGAOTME-1.gif" alt="" data-id="549" data-full-url="https://quietbo.com/uploads/2021/09/wTdUGAOTME-1.gif" data-link="https://quietbo.com/?attachment_id=549" class="wp-image-549" /&gt;&lt;/figure&gt;
 &lt;/li&gt;
&lt;/ul&gt;&lt;/figure&gt; 
&lt;img decoding="async" src="https://i.imgur.com/yoJ3zJz.png" alt="" /&gt; 
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 指定位置添加數據&lt;br /&gt;可指定要在某一元素的前或後插入新的元素
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;linsert key before/after 現有元素 插入的新元素&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lrange Llist 0 -1 # 顯示Llist的所有元素
linsert Llist before B b1 # 在現有元素B的前方插入新元素b1&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/bH6jHZ2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="修改指定位置的value"&gt;&lt;span class="ez-toc-section" id="%E4%BF%AE%E6%94%B9%E6%8C%87%E5%AE%9A%E4%BD%8D%E7%BD%AE%E7%9A%84value"&gt;&lt;/span&gt;修改指定位置的value&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 索引可以是負數
 &lt;/li&gt;
 &lt;li&gt;
 最左側為第一個元素0
 &lt;/li&gt;
 &lt;li&gt;
 最後一個元素是-1
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lset key index value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lrange Llist 0 -1
lset Llist 1 Z&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這裡要注意的是，第一個元素是0，所以把原本的元素1:D改成了Z&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/kRWxWLP.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="獲取value"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%8F%96value"&gt;&lt;/span&gt;獲取value&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取列表內指定範圍的值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 索引可以是負數
 &lt;/li&gt;
 &lt;li&gt;
 最左側為第一個元素0
 &lt;/li&gt;
 &lt;li&gt;
 最後一個元素是-1
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lrange key start stop &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用的顯示所有元素方式為:lrange key 0 -1&lt;/p&gt;
&lt;h3 id="刪除某個多個元素"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4%E6%9F%90%E5%80%8B%E5%A4%9A%E5%80%8B%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;刪除某個/多個元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 刪除指定的值
 &lt;/li&gt;
 &lt;li&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;lrem key count value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除元素可以是一個或多個，都是照count來決定移除的數量和方向。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 count &gt; 0 : 從元素0開始，移除count個與value相同的元素
 &lt;/li&gt;
 &lt;li&gt;
 count &lt; 0 : 從最後一個元素，移除count個與value相同的元素
 &lt;/li&gt;
 &lt;li&gt;
 count = 0 : 移除表中與value相同的元素
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;rpush lrem_test aa bb cc oo aa zz bb aa rr aa # 先建立一個list
lrange lrem_test 0 -1 # 檢視一下新創立的list
lrem lrem_test 2 aa # 刪除2個與aa相同的元素 (下方圖一)
lrem lrem_test -1 aa # 移除表中後面數的第1個與aa相同的元素 (下方圖二)
lrem lrem_test 0 bb # 移除表中與bb相同的元素 (下方圖三)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(下方為圖一)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/tGWfv3h.png" alt="" /&gt;&lt;br&gt;
(下方為圖二)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HY548k5.png" alt="" /&gt;&lt;br&gt;
(下方為圖三)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/SIKM9bY.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;想了解更多命令可參考:&lt;a class="link" href="http://redisdoc.com/list/lrem.html" target="_blank" rel="noopener"
 &gt;lrem&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="set集合"&gt;&lt;span class="ez-toc-section" id="Set%E9%9B%86%E5%90%88"&gt;&lt;/span&gt;Set集合&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 ⽆序集合
 &lt;/li&gt;
 &lt;li&gt;
 元素為字符串類型
 &lt;/li&gt;
 &lt;li&gt;
 元素具有唯唯性，不重複
 &lt;/li&gt;
 &lt;li&gt;
 Set集合沒有修改操作&lt;br /&gt;想了解更多命令可參考:&lt;a href="http://redisdoc.com/set/index.html"&gt;Set集合&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="增加-1"&gt;&lt;span class="ez-toc-section" id="%E5%A2%9E%E5%8A%A0-2"&gt;&lt;/span&gt;增加&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;添加元素格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sadd key member1 member2 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sadd aset Abby Kitty Bobby&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="獲取"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%8F%96"&gt;&lt;/span&gt;獲取&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;獲取所有元素格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;smembers key&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖顯示結果，很像list的&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/a6dOZh0.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="刪除"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4"&gt;&lt;/span&gt;刪除&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;删除指定元素格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;srem key value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;list刪除方式是lrem，集合的刪除方式是srem，只要看頭是l或s就能知道是什麼數據，&lt;br&gt;
集合的值不能重複，所以不需指定index。&lt;/p&gt;
&lt;h2 id="zset有序集合"&gt;&lt;span class="ez-toc-section" id="zset%E6%9C%89%E5%BA%8F%E9%9B%86%E5%90%88"&gt;&lt;/span&gt;zset有序集合&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;可以當作是Set的升級版，在基礎上加了”權重”。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 有序的集合
 &lt;/li&gt;
 &lt;li&gt;
 元素為字符串類型
 &lt;/li&gt;
 &lt;li&gt;
 元素具有唯一性，不可重複
 &lt;/li&gt;
 &lt;li&gt;
 score表示權重，可以是整數或浮點數，通過權重將從⼩到大元素排序
 &lt;/li&gt;
 &lt;li&gt;
 與集合一樣，沒有修改操作
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="增加-2"&gt;&lt;span class="ez-toc-section" id="%E5%A2%9E%E5%8A%A0-3"&gt;&lt;/span&gt;增加&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;格式如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zadd key score1 member1 score2 member2 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zadd zset_test 4 Abby 5 Kitty 6 Lucy 1 Bocky 4 Pocky 1 Happy&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="獲取member與score"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%8F%96member%E8%88%87score"&gt;&lt;/span&gt;獲取member與score&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;與List獲取元素很相似，zset是有序集合，但不需設數量，因為集合不能有重複的元素。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 需指定開始與結束位置
 &lt;/li&gt;
 &lt;li&gt;
 索引由左至右，索引可以是負數
 &lt;/li&gt;
 &lt;li&gt;
 第一個元素為0，-1表示最后⼀个元素
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrange key start stop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrange zset_test 0 -1&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/AMYtHAB.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取score在min與max之間的值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrangebyscore key min max&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrangebyscore zset_test 1 2&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/jtPgpTe.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取member的score值
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zscore key member&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例為:獲取Bocky、Happy(member)的score&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/nvvKuEX.png" alt="" /&gt;&lt;/p&gt;
&lt;h3 id="刪除-1"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4-2"&gt;&lt;/span&gt;刪除&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 删除指定的member
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrem key member1 member2 ....&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zrem zset_test Pocky&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/hzbrkgv.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 删除有score值指定範圍的member
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zremrangebyscore key min max&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;zremrangebyscore zset_test 1 2 # 刪除集合zset_test中權重值是1~2之間的元素&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例的Bocky、Happy的score值為1。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/bNOLlJ5.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="hash"&gt;&lt;span class="ez-toc-section" id="hash"&gt;&lt;/span&gt;hash&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 用於存儲對象，對象的結構為屬性(field)與值(value)
 &lt;/li&gt;
 &lt;li&gt;
 值的類型為字符串&lt;br /&gt;(滿像python的dict)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="增加-3"&gt;&lt;span class="ez-toc-section" id="%E5%A2%9E%E5%8A%A0-4"&gt;&lt;/span&gt;增加&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 設置單個屬性
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;hset: 如果給定的Key不存在則建立，若存在則覆蓋，成功返回1&lt;br&gt;
hsetnx: 如果給定的key已經存在，則不執行該命令，返回0&lt;/p&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hset key field value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hset today very happy&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 設置多個屬性&lt;br /&gt;如果有一樣field的名稱但不同的value，則會覆蓋掉。&lt;br /&gt;格式:
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hmset key field1 value1 field2 value2 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hmset yesterday very happy sometimes read often playgames&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/FtXUQBp.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="獲取field與value"&gt;&lt;span class="ez-toc-section" id="%E7%8D%B2%E5%8F%96field%E8%88%87value"&gt;&lt;/span&gt;獲取field與value&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取所有field(属性)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hkeys key&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hkeys yesterday&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/c7YjlAW.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取key裡面所有的value
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hvals key&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/v3HsLD5.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 獲取field的value
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hget key field # 獲取一個value
hmget key field1 field2 field3 ... # 獲取多value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hget yesterday very
hmget yesterday very sometimes often &lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/n9i3alo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="刪除属性"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4%E5%B1%9E%E6%80%A7"&gt;&lt;/span&gt;刪除属性&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 刪除整個hash則使用del(與string一樣)
 &lt;/li&gt;
 &lt;li&gt;
 刪除field(屬性)時，value(值)也會一併刪除
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hdel key field1 field2 ... &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意:&lt;br&gt;
del是刪除key，hdel才是刪除屬性&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9dd4svA.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Editor]Sublime Text 3 安裝插件、查詢已安裝插件、刪除插件</title><link>https://quietbo.com/2021/09/16/editorsublime-text-3-%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6%E3%80%81%E6%9F%A5%E8%A9%A2%E5%B7%B2%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6%E3%80%81%E5%88%AA%E9%99%A4%E6%8F%92%E4%BB%B6/</link><pubDate>Thu, 16 Sep 2021 11:26:08 +0000</pubDate><guid>https://quietbo.com/2021/09/16/editorsublime-text-3-%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6%E3%80%81%E6%9F%A5%E8%A9%A2%E5%B7%B2%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6%E3%80%81%E5%88%AA%E9%99%A4%E6%8F%92%E4%BB%B6/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/09/16/editorsublime-text-3-%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e6%9f%a5%e8%a9%a2%e5%b7%b2%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e5%88%aa%e9%99%a4%e6%8f%92%e4%bb%b6/#%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6" &gt;安裝插件&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/09/16/editorsublime-text-3-%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e6%9f%a5%e8%a9%a2%e5%b7%b2%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e5%88%aa%e9%99%a4%e6%8f%92%e4%bb%b6/#%E6%9F%A5%E8%A9%A2%E5%B7%B2%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6" &gt;查詢已安裝插件&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/09/16/editorsublime-text-3-%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e6%9f%a5%e8%a9%a2%e5%b7%b2%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e5%88%aa%e9%99%a4%e6%8f%92%e4%bb%b6/#%E6%9B%B4%E6%96%B0%E6%8F%92%E4%BB%B6" &gt;更新插件&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/09/16/editorsublime-text-3-%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e6%9f%a5%e8%a9%a2%e5%b7%b2%e5%ae%89%e8%a3%9d%e6%8f%92%e4%bb%b6%e3%80%81%e5%88%aa%e9%99%a4%e6%8f%92%e4%bb%b6/#%E5%88%AA%E9%99%A4%E6%8F%92%E4%BB%B6" &gt;刪除插件&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="安裝插件"&gt;&lt;span class="ez-toc-section" id="%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6"&gt;&lt;/span&gt;安裝插件&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 ctrl + shift + P，輸入&amp;#8221;Package Control&amp;#8221;
 &lt;/li&gt;
 &lt;li&gt;
 點擊 Package Control:install Package&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/RB7LtVL.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 輸入要安裝的package名稱，下面會跳出相似的package名稱，再選擇自己要的即可&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/4awRV9j.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="查詢已安裝插件"&gt;&lt;span class="ez-toc-section" id="%E6%9F%A5%E8%A9%A2%E5%B7%B2%E5%AE%89%E8%A3%9D%E6%8F%92%E4%BB%B6"&gt;&lt;/span&gt;查詢已安裝插件&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;步骤如下:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 ctrl + shift + P，輸入&amp;#8221;Package Control&amp;#8221;
 &lt;/li&gt;
 &lt;li&gt;
 點擊Package Control：List Packages&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/U3XBPYF.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 查看已安装插件列表(下圖為範例)&lt;br /&gt;以列表的形式顯示，可通過鍵盤上下鍵或者滑鼠滾輪來查看列表。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/4sQsqyD.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="更新插件"&gt;&lt;span class="ez-toc-section" id="%E6%9B%B4%E6%96%B0%E6%8F%92%E4%BB%B6"&gt;&lt;/span&gt;更新插件&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 ctrl + shift + P，輸入 upgrade packages後按下Enter。
 &lt;/li&gt;
 &lt;li&gt;
 如果有可更新的插件，下方會顯示(但這次沒有可更新的插件，無法提供圖片)&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/oeCrmks.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="刪除插件"&gt;&lt;span class="ez-toc-section" id="%E5%88%AA%E9%99%A4%E6%8F%92%E4%BB%B6"&gt;&lt;/span&gt;刪除插件&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 ctrl + shift + P，輸入&amp;#8221;Package Control&amp;#8221;
 &lt;/li&gt;
 &lt;li&gt;
 選擇Package Control:remove package&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/HLv4XWX.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 選擇要刪除的package&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/NovqD6r.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[Docker] Mac M1 安裝 Docker</title><link>https://quietbo.com/2021/09/13/docker-%E5%AE%89%E8%A3%9D-mac-m1/</link><pubDate>Mon, 13 Sep 2021 13:07:20 +0000</pubDate><guid>https://quietbo.com/2021/09/13/docker-%E5%AE%89%E8%A3%9D-mac-m1/</guid><description>&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/docker-for-mac/apple-silicon/" target="_blank" rel="noopener"
 &gt;docker M1晶片安裝網址&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://docs.docker.com/docker-for-mac/install/" target="_blank" rel="noopener"
 &gt;docker Intel安裝網址&lt;/a&gt;&lt;br&gt;
以往在Linux（ubuntu)環境安裝Docker，都是通過命令行安裝的，但這次 安裝Mac版的Docker變方便許多，下載完成的文件名叫做Docker.dmg。&lt;br&gt;
雙擊後安裝，完成會出現下圖，把Docker.app移至應用程式就完成了。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Yxy1rgU.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;應用程式中找到 Docker，雙擊打開，在右上角就會顯示docker已啟用。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/We4WkdA.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;系統要求:&lt;br&gt;
必須安裝Rosetta 2，因為某些二進製文件仍然是 Darwin/AMD64。要從命令行手動安裝 Rosetta 2，請運行以下命令：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;softwareupdate --install-rosetta&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檢查當前docker的版本：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用M1晶片的話，Arch會是arm64&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/QaW3kjD.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;docker.app打開後的畫面如下：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/R5PL8bA.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[VSCode] 一分鐘切換繁體中文或其他語言</title><link>https://quietbo.com/2021/09/06/vscode-%E4%B8%80%E5%88%86%E9%90%98%E5%88%87%E6%8F%9B%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E6%88%96%E5%85%B6%E4%BB%96%E8%AA%9E%E8%A8%80/</link><pubDate>Mon, 06 Sep 2021 08:20:39 +0000</pubDate><guid>https://quietbo.com/2021/09/06/vscode-%E4%B8%80%E5%88%86%E9%90%98%E5%88%87%E6%8F%9B%E7%B9%81%E9%AB%94%E4%B8%AD%E6%96%87%E6%88%96%E5%85%B6%E4%BB%96%E8%AA%9E%E8%A8%80/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 安裝中文套件chinese
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/IbfmGmd.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 顯示命令面板Show Command Palette&lt;br /&gt;windows 按ctrl + shift + P 或 F1&lt;br /&gt;Mac 按 cmd + shift + P&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/qdI17DV.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 輸入 display language&lt;br /&gt;選擇跳出的 Configure Display Language&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/B2Db3rl.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 選擇想要的語言&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/9yAQVrZ.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重新啟動VSCode即完成&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Z3G575p.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;如果要選擇其他語言，就回到1去找尋該語言的套件，安裝後再執行2.3.4的步驟&lt;br&gt;
&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hant" target="_blank" rel="noopener"
 &gt;Chinese (Traditional) Language Pack for Visual Studio Code&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[VSCode] F12找函數的原位置沒反應?安裝一插件解決</title><link>https://quietbo.com/2021/08/31/vscode-f12%E6%89%BE%E5%87%BD%E6%95%B8%E7%9A%84%E5%8E%9F%E4%BD%8D%E7%BD%AE%E6%B2%92%E5%8F%8D%E6%87%89%E5%AE%89%E8%A3%9D%E4%B8%80%E6%8F%92%E4%BB%B6%E8%A7%A3%E6%B1%BA/</link><pubDate>Tue, 31 Aug 2021 03:50:00 +0000</pubDate><guid>https://quietbo.com/2021/08/31/vscode-f12%E6%89%BE%E5%87%BD%E6%95%B8%E7%9A%84%E5%8E%9F%E4%BD%8D%E7%BD%AE%E6%B2%92%E5%8F%8D%E6%87%89%E5%AE%89%E8%A3%9D%E4%B8%80%E6%8F%92%E4%BB%B6%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;最近換語言後又換了VSCode，想找個函數按F12或Ctrl+點擊左鍵都沒用，後來在網路上找了一下，找到一個VSCode插件就解決了，目前只有C#上遇到這問題。&lt;/p&gt;
&lt;p&gt;下方是1分鐘搞定找不到原位置的問題的流程:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 打開VSCode，安裝插件&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/01aQCg2.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 輸入TypeLens&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/EaIHxO1.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 點擊安裝，成功後重新開啟VSCode
 &lt;/li&gt;
 &lt;li&gt;
 找個function測試&lt;br /&gt;測試方法:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 光標停在想查看的function字裡面，按F12
 &lt;/li&gt;
 &lt;li&gt;
 Ctrl+滑鼠左鍵點擊function名(按下Ctrl後滑鼠移到的名稱，都會變成有底線)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;該插件的介紹&lt;a class="link" href="https://marketplace.visualstudio.com/items?itemName=kisstkondoros.typelens" target="_blank" rel="noopener"
 &gt;:TypeLens&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Windows] 美化Terminal- powershell</title><link>https://quietbo.com/2021/08/18/windows-%E7%BE%8E%E5%8C%96terminal-powershell/</link><pubDate>Wed, 18 Aug 2021 12:13:27 +0000</pubDate><guid>https://quietbo.com/2021/08/18/windows-%E7%BE%8E%E5%8C%96terminal-powershell/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 打開PowerShell&lt;br /&gt;如果都沒有改過的話，windows預設的cmd是黑底白字，而PowerShell是藍底白字。&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/zS7p3tE.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 oh-my-posh 安裝&lt;br /&gt;打開 PowerShell，輸入下方兩行指令
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=""&gt;Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;都輸入:Y&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/dINg6hQ.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 在 PowerShell 上輸入 $PROFILE後輸入下列&lt;br /&gt;用途:有檔案的話就開啟，沒有自動新增。
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 使用VSCode開啟檔案:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;code $PROFILE&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加下方程式(除了前3個，其他可選用)後儲存，關閉PowerShell&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt -Theme Paradox&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果沒有安裝VSCode也沒關係，可以用其他文字編輯&lt;br&gt;
檔案路徑在，找到後再把剛才那三行複製貼上進去該檔案。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;C:\Users\你的電腦名稱\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1，器去打開它並新增。&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 使用系統管理員開啟PowerShell&lt;br /&gt;執行命令:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Set-ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/sLa8q2l.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 開啟Microsoft store&lt;br /&gt;在放大鏡搜尋&lt;code&gt;Windows Terminal Preview&lt;/code&gt;&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/kxrtSlr.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意:在這裡要使用微軟的帳號登入才能下載，這邊沒有附上登入過程，請自行登入後再下載。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HdYBhyB.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;成功後按啟動。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/32LeuZc.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 啟動
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打開可能會像下圖這一樣，有?的符號，下方會解決。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/YWiZNFE.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;目標是解決成下圖:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/lCOlq7j.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;如果過程有出現紅字:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;警告: git command could not be found. Please create an alias or add it to your PATH.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是找不到路徑，解決方式:安裝Git(請自行上網搜尋)&lt;/p&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 下載字型包
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;到 powerline fonts 的 &lt;a class="link" href="https://github.com/powerline/fonts" target="_blank" rel="noopener"
 &gt;github page&lt;/a&gt; 下載字形包，用git下載或直接下載Zip檔後直接壓縮，都可以。&lt;/p&gt;
&lt;p&gt;打開在資料夾的fonts-master\SourceCodePro，會看到很多.otf檔&lt;/p&gt;
&lt;p&gt;找到Source Code Pro for Powerline.otf檔後，右鍵安裝。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/IJjenqL.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;再開啟控制台-&amp;gt;外觀及個人化-&amp;gt;字型&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/rxPd1hn.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/imHhkRd.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;打開後會看到很多字型&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/IBC0gGY.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;直接點放大鏡來搜尋，用Powerline來搜尋看看，&lt;br&gt;
確認是否安裝成功。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/qAVUwSL.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="8"&gt;
 &lt;li&gt;
 設定字型
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打開設定&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/QA7ta1V.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點選左排的Windows PowerShell-&amp;gt;外觀-&amp;gt; 顯示所有字型 -&amp;gt; 剛才安裝的字型:Source Code Pro for Powerline -&amp;gt; 儲存&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HAS43eC.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="9"&gt;
 &lt;li&gt;
 完成&lt;br /&gt;回到Windows PowerShell按+後會出現一個新的&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/r4pK0kc.png" alt="" /&gt;&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/fR88Cd5.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在8的步驟時，其實就可以做很多設定了，&lt;br&gt;
也可以直接去改setting.json檔&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/qakySt0.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;如果想要看其他主題，可以輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Get-PoshThemes&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker-Composer] Couldn’t connect to Docker daemon at http+docker://localhost – is it running?(解決)</title><link>https://quietbo.com/2021/08/17/docker-composer-couldnt-connect-to-docker-daemon-at-httpdocker-localhost-is-it-running%E8%A7%A3%E6%B1%BA/</link><pubDate>Tue, 17 Aug 2021 07:22:02 +0000</pubDate><guid>https://quietbo.com/2021/08/17/docker-composer-couldnt-connect-to-docker-daemon-at-httpdocker-localhost-is-it-running%E8%A7%A3%E6%B1%BA/</guid><description>&lt;p&gt;部屬的環境是用docker-composer，某天用ssh連回去，要下docker指令就出現下面訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
make: *** [Makefile:26: restart] Error 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這用google翻譯過來看是:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;無法通過 http+docker://localhost 連接到 Docker 守護進程 - 它是否正在運行？&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嗯…….(什麼東西，好不直覺)&lt;/p&gt;
&lt;p style="font-size:25px"&gt;
 其實就是&lt;strong&gt;忘記加入docker群組&lt;/strong&gt;呀!!!
&lt;/p&gt;
&lt;h2 id="解決方式"&gt;解決方式
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 在機器內下指令，將docker加入群組
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;sudo gpasswd -a ${USER} docker&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/mMJyzQ0.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 退出當前用戶
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;sudo su&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 切換為原本用戶&lt;br /&gt;下方ubuntu需依照不同用戶名稱去更改。
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;su ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 在終端機下docekr指令試試看吧
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[VirtualBox] 系統備份映象檔(必學)</title><link>https://quietbo.com/2021/08/12/virtualbox-%E7%B3%BB%E7%B5%B1%E5%82%99%E4%BB%BD%E6%98%A0%E8%B1%A1%E6%AA%94/</link><pubDate>Thu, 12 Aug 2021 10:23:32 +0000</pubDate><guid>https://quietbo.com/2021/08/12/virtualbox-%E7%B3%BB%E7%B5%B1%E5%82%99%E4%BB%BD%E6%98%A0%E8%B1%A1%E6%AA%94/</guid><description>&lt;p&gt;最近公司電腦壞掉，換了一台同型號的筆電，把舊筆電的VM備份起來，到新的電腦裡面繼續使用，說真的很簡單，我用過兩個方式都成功，但方法二花費時間比較久。&lt;/p&gt;
&lt;h2 id="方法一"&gt;方法一
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 找出目前存放VM的位置，複製整個資料夾&lt;br /&gt;怕找錯的話可以去VirtualBox裡面確認路徑，一般&gt;進階&gt;快照資料夾。&lt;br /&gt;我是複製ubuntu20.04這整個資料夾，&lt;br /&gt;注意:一定要有.vbox檔案，如果沒有複製到就沒有用&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/JvV0OEZ.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 資料夾複製到新電腦&lt;br /&gt;點選VirtualBox的加入，找到剛複製的資料夾位置&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/NQJrfma.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 加入.vbox檔案&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/1fn4Ko2.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 加入成功&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/FQ1iMaD.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這是沿用之前的VM，不算有備份(除非有做快照)，未來若VM有問題，只能用快照復原。&lt;br&gt;
(除非有把原本複製過來時的資料夾保留著)&lt;/p&gt;
&lt;h2 id="方法二"&gt;方法二
&lt;/h2&gt;&lt;p&gt;此方法是直接用VirtualBox的匯出功能，雖然等的時間真的很長但做出來的.ova檔案，算是備份檔了。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 打開VirtualBox，點選匯出&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/RvO8Rhn.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 選擇要匯出的VM後下一步&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/by4suO7.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 依個人狀況去選擇，我只有調整MAC原則網址&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/oMJZZRL.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 再下一步後開始匯出(這時間真的要等很久)&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/IEcbNLI.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 匯入ova檔&lt;br /&gt;成功匯出後把.ova檔案複製到新電腦上，然後到新電腦匯入.ova檔&lt;br /&gt;位置放在自己找的到的位置即可
 &lt;/li&gt;
&lt;/ol&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/bmPlc1P.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 開始匯入&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/tyFMqdI.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 等待匯入&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/kdd2wfN.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 匯入成功
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;匯入成功的VM已經跟ova檔無關了，可以參考方法一看VM的路徑位置在哪，未來如果這支匯入的VM掛了，就可以再拿ova重新匯入，只是這之後的軟體和檔案要重新下載。&lt;/p&gt;
&lt;p&gt;如果想要用別人的VM，就請對方匯出ova檔，再做匯入即可。&lt;/p&gt;</description></item><item><title>[VirtualBox] 無法開啟虛擬機 Not in a hypervisor partition (HVP=0)</title><link>https://quietbo.com/2021/08/12/virtualbox-%E7%84%A1%E6%B3%95%E9%96%8B%E5%95%9F%E8%99%9B%E6%93%AC%E6%A9%9F-not-in-a-hypervisor-partition-hvp0/</link><pubDate>Thu, 12 Aug 2021 09:09:32 +0000</pubDate><guid>https://quietbo.com/2021/08/12/virtualbox-%E7%84%A1%E6%B3%95%E9%96%8B%E5%95%9F%E8%99%9B%E6%93%AC%E6%A9%9F-not-in-a-hypervisor-partition-hvp0/</guid><description>&lt;p&gt;最近公司電腦壞掉，換了一台同型號的筆電，把舊筆電的VM備份起來，到新的電腦裡面繼續使用，結果才剛開始就出現問題:&lt;/p&gt;
&lt;p&gt;Not in a hypervisor partition (HVP=0) (VERR_NEM_NOT_AVAILBLE). VT-x is disabled in the BIOS for all CPU modes (VERR_VMX_MSR_ALL_VMX_DISABLED)&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/p9sTP6W.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;解決方式:&lt;br&gt;
1.重新開機進入BIOS，每個廠牌的筆電，進BIOS的按鍵都不一樣，請自行查詢。&lt;br&gt;
2.找到Intel(R) Virtualization Technology&lt;br&gt;
3.Enabled (啟用)&lt;br&gt;
4.存檔後離開&lt;br&gt;
5.打開VirtualBox&lt;/p&gt;</description></item><item><title>[Python] 有序的Dict – OrderedDict (必學)</title><link>https://quietbo.com/2021/07/22/python-%E6%9C%89%E5%BA%8F%E7%9A%84dict-ordereddict-%E5%BF%85%E5%AD%B8/</link><pubDate>Wed, 21 Jul 2021 17:00:01 +0000</pubDate><guid>https://quietbo.com/2021/07/22/python-%E6%9C%89%E5%BA%8F%E7%9A%84dict-ordereddict-%E5%BF%85%E5%AD%B8/</guid><description>&lt;p&gt;特性:&lt;strong&gt;依據key被插入的先後做排序，如果更新了某個key的值，不會影響排序位置，除非是把key刪除後又重新插入。後續加入的key都會從最末做添加&lt;/strong&gt;。&lt;br&gt;
本篇沒做增刪查改的範例。&lt;/p&gt;
&lt;h2 id="dict一般常用的"&gt;dict(一般常用的)
&lt;/h2&gt;&lt;p&gt;一般常用的dict都會說是無序，但其實還是有一定的順序，是&lt;strong&gt;按照hash來存儲的，和存儲的數據結構有關&lt;/strong&gt;(本篇不多說明)，但通常這個跟我們一般認真的序列有一點不一樣，因為不是填入時的順序。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;example_dict = dict(
 name='Bocky',
 phone='0912-345-678',
 address='Taiwan-Taipei',
 age='18'
)
print(example_dict)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=" line-numbers"&gt;{'phone': '0912-345-678', 'age': '18', 'name': 'Bocky', 'address': 'Taiwan-Taipei'}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="ordereddict"&gt;OrderedDict
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from collections import OrderedDict
import json
# 錯誤示範，沒有照順序排列的效果(與一般dict結果一樣)
example_ordered_dict_0 = OrderedDict(
 name='Bocky',
 phone='0912-345-678',
 address='Taiwan-Taipei',
 age='18'
)
print('錯誤示範的輸出:\n{}'.format(example_ordered_dict_0))
print("="*20)

example_ordered_dict_1 = OrderedDict([
 ('name', 'Bocky'),
 ('phone_number', '0912-345-678'),
 ('address', 'Taiwan-Taipei'),
 ('age', '18')
])
print("OrderedDict輸出結果:\n{}".format(example_ordered_dict_1))
print("="*20)

print("添加一個key為interest到最末端:")
example_ordered_dict_1['interest'] = 'sleep'
print(example_ordered_dict_1)
print("="*20)

print("把OrderedDict轉成字串,並剔除空白:")
print (json.dumps(example_ordered_dict_1).replace(" ", ""))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=" line-numbers"&gt;錯誤示範的輸出:
OrderedDict([('phone', '0912-345-678'), ('age', '18'), ('name', 'Bocky'), ('address', 'Taiwan-Taipei')])
====================
OrderedDict輸出結果:
OrderedDict([('name', 'Bocky'), ('phone_number', '0912-345-678'), ('address', 'Taiwan-Taipei'), ('age', '18')])
====================
添加一個key為interest到最末端:
OrderedDict([('name', 'Bocky'), ('phone_number', '0912-345-678'), ('address', 'Taiwan-Taipei'), ('age', '18'), ('interest', 'sleep')])
====================
把OrderedDict轉成字串,並剔除空白:
{"name":"Bocky","phone_number":"0912-345-678","address":"Taiwan-Taipei","age":"18","interest":"sleep"}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是要a~z排序的話就使用sorted，網路上很多參考，但這就不需要使用OrderedDict了，一般dict就可以做到，只是排序拼接而已，我自己工作上是很常用:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=" line-numbers"&gt;data = "&amp;".join("{0}={1}".format(str(k), str(example_ordered_dict_1[k])) for k in sorted(example_ordered_dict_1.keys()))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="" class=""&gt;address=Taiwan-Taipei&amp;age=18&amp;interest=sleep&amp;name=Bocky&amp;phone_number=0912-345-678&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker]將Image push到Docker Hub</title><link>https://quietbo.com/2021/07/15/docker%E5%B0%87image-push%E5%88%B0docker-hub/</link><pubDate>Wed, 14 Jul 2021 18:53:19 +0000</pubDate><guid>https://quietbo.com/2021/07/15/docker%E5%B0%87image-push%E5%88%B0docker-hub/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 需要&lt;a href="https://hub.docker.com/"&gt;docker hub&lt;/a&gt;的帳號
 &lt;/li&gt;
 &lt;li&gt;
 開啟終端機，輸入下方指令後輸入帳號密碼，成功則顯示：Login Succeeded
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker login&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 建立新的tag&lt;br /&gt;把原本的hello(藍框)建立新的tag，主要是push到docker hub的格式，但這兩個是同一個鏡像(IMAGE ID)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker tag hello {dockerHub帳號}/hello:1.0&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/dcmznsP.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 push到docker hub
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker image push {dockerHub的帳號}/hello:1.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行成功如下圖：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/cuI2tXC.png" alt="" /&gt;&lt;br&gt;
到docker hub查看是否有push成功。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/quOgzQq.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 拉取剛才push的image:&lt;br /&gt;先刪除原本push的image，沒有的話再pull剛剛傳上去的image
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker pull dockerHub的帳號/hello:1.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用docker image ls 查看pull的image是否成功&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/okiWOQY.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Docker] 獲取Image的三種方式</title><link>https://quietbo.com/2021/07/12/docker-%E7%8D%B2%E5%8F%96image%E7%9A%84%E4%B8%89%E7%A8%AE%E6%96%B9%E5%BC%8F/</link><pubDate>Mon, 12 Jul 2021 09:12:25 +0000</pubDate><guid>https://quietbo.com/2021/07/12/docker-%E7%8D%B2%E5%8F%96image%E7%9A%84%E4%B8%89%E7%A8%AE%E6%96%B9%E5%BC%8F/</guid><description>&lt;div class="wp-block-group"&gt;
 &lt;div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"&gt;
 &lt;div class="wp-block-group"&gt;
 &lt;div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"&gt;
 &lt;p&gt;
 獲取Image的三種方式:
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;div class=&amp;quot;wp-block-group&amp;quot;&amp;gt;
 &amp;lt;div class=&amp;quot;wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow&amp;quot;&amp;gt;
 &amp;lt;ol class=&amp;quot;wp-block-list&amp;quot;&amp;gt;
 &amp;lt;li&amp;gt;
 從Registry取得Image &amp;amp;#8211; &amp;lt;a href=&amp;quot;https://docs.docker.com/registry/&amp;quot;&amp;gt;registry&amp;lt;/a&amp;gt;&amp;lt;ul&amp;gt;
 &amp;lt;li&amp;gt;
 public（公開的，任何人都可以使用）
 &amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;
 private（私有）
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;/li&amp;gt;
 
 &amp;lt;li&amp;gt;
 文件導入(可離線時使用）
 &amp;lt;/li&amp;gt;
 &amp;lt;li&amp;gt;
 從Dockerfile建造
 &amp;lt;/li&amp;gt;
 &amp;lt;/ol&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id="從registry取得image"&gt;從Registry取得Image
&lt;/h1&gt;&lt;p&gt;如果沒有提供registry名稱的話，預設是從&lt;a class="link" href="https://hub.docker.com/" target="_blank" rel="noopener"
 &gt;DockerHub&lt;/a&gt;取得。&lt;br&gt;
如果不指定的話會下載lates。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想指定版本的話就加入:tag名稱&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull nginx:1.20.1&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Kj3d9t4.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查看已下載的Image&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示Image的相關訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image inspect IMAGE_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刪除Image&lt;/p&gt;
&lt;p&gt;如果有容器正在使用，無論是運行中或是關閉狀態，會無法刪除。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image rm IMAGE_ID&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="文件導入image"&gt;文件導入Image
&lt;/h1&gt;&lt;p&gt;其他兩種都是要在有網路的狀況下才可以使用，若是電腦沒有網路的話，可以使用導入的方式。&lt;/p&gt;
&lt;p&gt;建構Image指令如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image save nginx[:版本] -o 檔案名稱&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/OmxitSX.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;導入Image&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image load -i 檔案路徑&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ODhSf7a.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h1 id="從dockerfile建造"&gt;從Dockerfile建造
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/reference/builder/" target="_blank" rel="noopener"
 &gt;Dockerfile參考&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;將下方兩個檔案存在同一個資料夾：&lt;br&gt;
檔名：hello.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;print("Hello this python!")&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檔名：dockerfile&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM ubuntu:20.04
RUN apt-get update &amp;&amp; \
 DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev
ADD hello.py /
CMD ["python3", "/hello.py"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我把這兩個檔案放在名為coding的資料夾裡面。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZZQiUBP.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;接下來從dockerfile建構Image:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -t :替image命名所需帶入
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;docker image build -t hello dockerfile路徑
docker image ls # 查看是否有名為hello的image&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖紅框是我們想要為這個image的命名。&lt;br&gt;
黃框是dockerfile的路徑。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/4EiTOQO.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker run -it hello&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看看有沒有顯示hello.py的字串。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/NjapyIi.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Docker]Interactive mode – 交互式模式(必學)</title><link>https://quietbo.com/2021/07/08/docker-%E4%BA%A4%E4%BA%92%E5%BC%8F%E6%A8%A1%E5%BC%8F/</link><pubDate>Wed, 07 Jul 2021 17:17:04 +0000</pubDate><guid>https://quietbo.com/2021/07/08/docker-%E4%BA%A4%E4%BA%92%E5%BC%8F%E6%A8%A1%E5%BC%8F/</guid><description>&lt;p&gt;下方有兩個進入shell的範例說明，&lt;br&gt;
方法一是建立container後直接進入shell，&lt;br&gt;
方法二是建立container後，再下指令進入運行中的container，我個人是很常用方法二。&lt;/p&gt;
&lt;p&gt;docker Version: 20.10.7&lt;/p&gt;
&lt;h2 id="方法一"&gt;方法一
&lt;/h2&gt;&lt;p&gt;創建ubuntu(或busybox)的container並進入shell&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker container run -it ubuntu sh 
或
docker container run -it busybox sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用法：&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 docker container run [OPTIONS] IMAGE [COMMAND] [ARG…]
 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -it ：啟動容器並進入終端交互模式(it通常是一起使用的)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;想查看更多_OPTIONS_可輸入&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker container run --help&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;進入某的運行中的容器裡面&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker exec -it CONTAINER_ID sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;退出方式有兩種：&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 exit 退出容器後，容器會停止
 &lt;/li&gt;
 &lt;li&gt;
 ctrl+P+Q 退出容器但容器不停止
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="方法二"&gt;方法二
&lt;/h2&gt;&lt;p&gt;建立nginx的container&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker container run -d -p 80:80 nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢CONTAINER ID，輸入指令進到container的內部。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;docker ps
docker exec -it CONTAINER_ID sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用法：&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
 &lt;/p&gt;
&lt;/blockquote&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/jzzFWkM.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;退出方法兩種：&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 exit 退出容器後，容器不會停止。
 &lt;/li&gt;
 &lt;li&gt;
 ctrl+P+Q 退出容器但容器不停止
 &lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>[Docker] Run container in the background – detached背景執行</title><link>https://quietbo.com/2021/07/06/docker-detached%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C/</link><pubDate>Mon, 05 Jul 2021 19:17:38 +0000</pubDate><guid>https://quietbo.com/2021/07/06/docker-detached%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C/</guid><description>&lt;p&gt;本機:mac M1 11.2.3&lt;br&gt;
docker: 20.10.7&lt;/p&gt;
&lt;p&gt;先讓容器在背景保持運作中，不進入shell介面。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 run 是pull(下載 image) 和 create（創建容器）和 start（啟動容器）組合在一起的功能。
 &lt;/li&gt;
 &lt;li&gt;
 -d 代表 detach，將docker在背景執行。
 &lt;/li&gt;
 &lt;li&gt;
 -p 80:80是將主機的80port轉到web這個Container的80 port。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;docker run -d -p 80:80 nginx
docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立完後會跳出一串英數的字串，這是CONTAINER ID，顯示完就會直接回來，且不會卡在shell。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/iWcc1M4.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;用本機的瀏覽器打開網頁，輸入127.0.0.1會看到下圖。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Ev40ddq.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;回到終端機，會看到終端機還是維持原本的畫面，但正常來說只要有進到網頁，就會有log，如果想要看到log的話，就可以輸入：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker container logs CONTAINER_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這樣就會印出該container的log。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3uYrAXB.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;但這樣也很麻煩，因為想看log的話就要一直來下指令，下方為自動顯示log的指令：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker container logs -f CONTAINER_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若是在這時候使用control+C的話，不會將container關閉。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/R8MUnzJ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;下方指令用attach來連接運行中的container。&lt;br&gt;
回到container的shell，之後的log會顯示出來。（如果想看之前的紀錄就開另一個終端機去執行logs)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker"&gt;docker attach CONTAINER_ID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在attach時使用&lt;code&gt;control+C&lt;/code&gt;就直接被關閉。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9NaYIbX.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Virtualbox] 還原之前的備份與還原方式-快照 (必學)</title><link>https://quietbo.com/2021/07/04/virtualbox-%E9%82%84%E5%8E%9F%E4%B9%8B%E5%89%8D%E7%9A%84%E5%82%99%E4%BB%BD%E8%88%87%E9%82%84%E5%8E%9F%E6%96%B9%E5%BC%8F-%E5%BF%AB%E7%85%A7-%E5%BF%85%E5%AD%B8/</link><pubDate>Sat, 03 Jul 2021 18:30:15 +0000</pubDate><guid>https://quietbo.com/2021/07/04/virtualbox-%E9%82%84%E5%8E%9F%E4%B9%8B%E5%89%8D%E7%9A%84%E5%82%99%E4%BB%BD%E8%88%87%E9%82%84%E5%8E%9F%E6%96%B9%E5%BC%8F-%E5%BF%AB%E7%85%A7-%E5%BF%85%E5%AD%B8/</guid><description>&lt;p&gt;最近工作又不小心把自己的環境弄壞了，用壞後有努力想要救回來，但就是被我搞到徹底的壞掉了，然後我還忘記做之前要快照，但還好有把某個時間點做快照，不至於整個系統要重灌。(如果要重灌使用一年的環境要很久…)&lt;/p&gt;
&lt;p&gt;以下為操作版本:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Virtualbox 6.1
ubuntu 20.04&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;快照功能簡述:&lt;br&gt;
可以保存虛擬機特定狀態，出現問題時想還原到正常狀態時，可以切換回以前的某狀態的快照。&lt;br&gt;
快照可以創建數多個，因此可以在虛擬機不同時間點的快照來回移動。&lt;br&gt;
VM運行時可以刪除快照，回收硬碟空間。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/07/04/virtualbox-%e9%82%84%e5%8e%9f%e4%b9%8b%e5%89%8d%e7%9a%84%e5%82%99%e4%bb%bd%e8%88%87%e9%82%84%e5%8e%9f%e6%96%b9%e5%bc%8f-%e5%bf%ab%e7%85%a7-%e5%bf%85%e5%ad%b8/#%E8%A3%BD%E4%BD%9C%E5%BF%AB%E7%85%A7%E8%A3%BD%E4%BD%9C%E9%82%84%E5%8E%9F%E7%8B%80%E6%85%8B" &gt;製作快照(製作還原狀態)&lt;/a&gt;&lt;ul class='ez-toc-list-level-2' &gt;
 &lt;li class='ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/07/04/virtualbox-%e9%82%84%e5%8e%9f%e4%b9%8b%e5%89%8d%e7%9a%84%e5%82%99%e4%bb%bd%e8%88%87%e9%82%84%e5%8e%9f%e6%96%b9%e5%bc%8f-%e5%bf%ab%e7%85%a7-%e5%bf%85%e5%ad%b8/#%E6%96%B9%E6%B3%95%E4%B8%80" &gt;方法一:&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/07/04/virtualbox-%e9%82%84%e5%8e%9f%e4%b9%8b%e5%89%8d%e7%9a%84%e5%82%99%e4%bb%bd%e8%88%87%e9%82%84%e5%8e%9f%e6%96%b9%e5%bc%8f-%e5%bf%ab%e7%85%a7-%e5%bf%85%e5%ad%b8/#%E6%96%B9%E6%B3%95%E4%BA%8C" &gt;方法二:&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-4&amp;quot; href=&amp;quot;https://quietbo.com/2021/07/04/virtualbox-%e9%82%84%e5%8e%9f%e4%b9%8b%e5%89%8d%e7%9a%84%e5%82%99%e4%bb%bd%e8%88%87%e9%82%84%e5%8e%9f%e6%96%b9%e5%bc%8f-%e5%bf%ab%e7%85%a7-%e5%bf%85%e5%ad%b8/#%E9%82%84%E5%8E%9F&amp;quot; &amp;gt;還原&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h1 id="製作快照製作還原狀態"&gt;&lt;span class="ez-toc-section" id="%E8%A3%BD%E4%BD%9C%E5%BF%AB%E7%85%A7%E8%A3%BD%E4%BD%9C%E9%82%84%E5%8E%9F%E7%8B%80%E6%85%8B"&gt;&lt;/span&gt;製作快照(製作還原狀態)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;h2 id="方法一"&gt;&lt;span class="ez-toc-section" id="%E6%96%B9%E6%B3%95%E4%B8%80"&gt;&lt;/span&gt;方法一:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;開啟Virtualbox的快照畫面。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3YVBpqh.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZlSpZIQ.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="方法二"&gt;&lt;span class="ez-toc-section" id="%E6%96%B9%E6%B3%95%E4%BA%8C"&gt;&lt;/span&gt;方法二:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;方法二限於ubuntu開啟時: 機器 -&amp;gt; 取得快照&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3BSyHRP.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;一開始預設的名稱都是快照1&lt;br&gt;
建議命名時間日期，我是會照時間命名。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oP7yWVt.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點擊確認後稍等幾秒。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/B2JtEWR.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;開啟Virtualbox的快照畫面。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/3YVBpqh.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;紅框就是剛才做出來的快照。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/IpxjzCL.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="還原"&gt;&lt;span class="ez-toc-section" id="%E9%82%84%E5%8E%9F"&gt;&lt;/span&gt;還原&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;只要在ubuntu內的任意處增、刪、改檔案，然後正常關機。&lt;/p&gt;
&lt;p&gt;Virtualbox的快照還原可以點擊，紅框快照就是備份的狀態，&lt;br&gt;
而藍框是做完快照後有做增、刪、改檔案的狀態。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/hGrLqo8.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點擊還原後，會問要不要再建立”目前狀態”的快照，如果你不建立此時的快照，你所有狀態都會回到還原時的狀態，&lt;/p&gt;
&lt;p&gt;意思就是問你要不要備份(快照)現在的狀態，不備份(快照)的話，以後想要回來現在的狀態就沒辦法囉!!!。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/qDhy7Ki.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點擊還原後，一切都會回到當下快照的狀態。&lt;br&gt;
備份什麼時候的快照，就可以使用復原回到當下，只要你有做快照!&lt;/p&gt;
&lt;p&gt;還原後就會變成下圖:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/uxumjsN.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;補充:&lt;br&gt;
檢視-&amp;gt;取的螢幕快照。&lt;br&gt;
這裡的快照是螢幕截圖，跟本篇的快照無關。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/NhsGvDt.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[Virtualbox] 安裝ubuntu20.04</title><link>https://quietbo.com/2021/07/01/%E8%99%9B%E6%93%AC%E6%A9%9F-virtualbox%E5%AE%89%E8%A3%9Dubuntu/</link><pubDate>Thu, 01 Jul 2021 12:00:25 +0000</pubDate><guid>https://quietbo.com/2021/07/01/%E8%99%9B%E6%93%AC%E6%A9%9F-virtualbox%E5%AE%89%E8%A3%9Dubuntu/</guid><description>&lt;p&gt;工作配Windows但開發時都用Linux，然後自己就很常弄壞環境，菜雞時期都是建新的，常用的工具在慢慢裝回來，後來學會備份(映像檔)和快照後，弄壞弄的更安心了呢(?)，但還是菜，bug(菜蟲)都掉滿地了。&lt;br&gt;
真心建議安裝完後可以去學個【&lt;a rel="noreferrer noopener" href="https://quietbo.com/2021/07/04/virtualbox-%e9%82%84%e5%8e%9f%e4%b9%8b%e5%89%8d%e7%9a%84%e5%82%99%e4%bb%bd%e8%88%87%e9%82%84%e5%8e%9f%e6%96%b9%e5%bc%8f-%e5%bf%ab%e7%85%a7-%e5%bf%85%e5%ad%b8/?preview=true" target="_blank"&gt;Virtualbox 快照&lt;/a&gt;】、 【 &lt;a href="https://quietbo.com/2021/08/12/virtualbox-%e7%b3%bb%e7%b5%b1%e5%82%99%e4%bb%bd%e6%98%a0%e8%b1%a1%e6%aa%94/" data-type="URL" data-id="https://quietbo.com/2021/08/12/virtualbox-%e7%b3%bb%e7%b5%b1%e5%82%99%e4%bb%bd%e6%98%a0%e8%b1%a1%e6%aa%94/"&gt;系統備份映象檔&lt;/a&gt;】 功能，也許哪天環境有問題，怎麼辦都解決不了的時候，快照也許能幫上忙，至少不用全部都重新安裝。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/07/01/%e8%99%9b%e6%93%ac%e6%a9%9f-virtualbox%e5%ae%89%e8%a3%9dubuntu/#%E5%AE%89%E8%A3%9D" &gt;安裝&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/07/01/%e8%99%9b%e6%93%ac%e6%a9%9f-virtualbox%e5%ae%89%e8%a3%9dubuntu/#%E8%A7%A3%E6%9E%90%E5%BA%A6%E8%A8%AD%E5%AE%9A" &gt;解析度設定&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/07/01/%e8%99%9b%e6%93%ac%e6%a9%9f-virtualbox%e5%ae%89%e8%a3%9dubuntu/#%E8%A8%AD%E5%AE%9A%E5%8F%AF%E4%BB%A5%E9%9B%99%E5%90%91%E5%89%AA%E8%B2%BC" &gt;設定可以雙向剪貼&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/07/01/%e8%99%9b%e6%93%ac%e6%a9%9f-virtualbox%e5%ae%89%e8%a3%9dubuntu/#%E5%85%B1%E4%BA%AB%E8%B3%87%E6%96%99%E5%A4%BE" &gt;共享資料夾&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/07/01/%e8%99%9b%e6%93%ac%e6%a9%9f-virtualbox%e5%ae%89%e8%a3%9dubuntu/#%E7%95%AB%E9%9D%A2%E5%A4%A7%E5%B0%8F" &gt;畫面大小&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="安裝"&gt;&lt;span class="ez-toc-section" id="%E5%AE%89%E8%A3%9D"&gt;&lt;/span&gt;安裝&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;先新增虛擬機的名稱&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/pflnAFT.png" alt="" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2.名稱,系統,版本如下&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/NPMNX72.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;以下步驟:&lt;br&gt;
記憶體大小(下一步)-&amp;gt;立即建立虛擬硬碟-&amp;gt;VDI(VirtualBox磁碟映像)-&amp;gt;動態分配-&amp;gt;建議分32G&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/DqeBhjS.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/IOpb9lK.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;新增完後點選設定:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/CXwIJuN.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;系統-&amp;gt;加速-&amp;gt;不要勾Nested Paging&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/O0v2Pig.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;存放裝置 -&amp;gt; 空的 -&amp;gt; 找出iso檔的位置(自行決定要安裝的版本) -&amp;gt; 確定&lt;br&gt;
注意:iso檔盡量不要放在中文路徑的資料夾下&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Soak3kh.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點選啟動:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/HSQeKe6.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;一開始的設定跟密碼不講解。&lt;/p&gt;
&lt;p&gt;開始安裝畫面:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Am90YfI.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;安裝完重新開機&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/BZA6GoL.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;記得要按Enter進入系統，不然會一直停再畫面&lt;br&gt;
輸入剛剛設定時的密碼,記得打開右方的NumLock，不然可能按到”訪客作業階段”&lt;br&gt;
我設很簡單&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Vg4fEcS.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;登入成功!!!&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/O3lFH3a.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="解析度設定"&gt;&lt;span class="ez-toc-section" id="%E8%A7%A3%E6%9E%90%E5%BA%A6%E8%A8%AD%E5%AE%9A"&gt;&lt;/span&gt;解析度設定&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;畫面超級小,先把他調大一點…&lt;br&gt;
右上角-&amp;gt;系統設定-&amp;gt;顯示器-&amp;gt;解析度(自行調整)&lt;br&gt;
我是用1680*1050(16:10)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/gQ6zMul.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="設定可以雙向剪貼"&gt;&lt;span class="ez-toc-section" id="%E8%A8%AD%E5%AE%9A%E5%8F%AF%E4%BB%A5%E9%9B%99%E5%90%91%E5%89%AA%E8%B2%BC"&gt;&lt;/span&gt;設定可以雙向剪貼&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;沒用的話會無法貼上從windows複製的文字&lt;/p&gt;
&lt;p&gt;裝置-&amp;gt;插入Guest Additions CD 映像&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/dZGRaKI.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點選執行&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/6LfMWVw.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;打上密碼:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/W5l12rr.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/J1CMASF.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;輸入:yes&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/NAyT6hv.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;選雙向&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/5sJV1uZ.png" alt="" /&gt;&lt;br&gt;
選雙向&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/N84wRLB.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;完成&lt;/p&gt;
&lt;h2 id="共享資料夾"&gt;&lt;span class="ez-toc-section" id="%E5%85%B1%E4%BA%AB%E8%B3%87%E6%96%99%E5%A4%BE"&gt;&lt;/span&gt;共享資料夾&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;終端機輸入這串:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo usermod --append --groups vboxsf $USER&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;裝置-&amp;gt; 共用資料夾 -&amp;gt; 共用資料夾設定&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Iqf4SMG.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;注意:這裡選擇的是在外面windows的資料夾路徑&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/lgV3Qtx.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;共用的資料夾是創建在windows的，&lt;br&gt;
不是ubuntu(如果想要從ubuntu分享也可以用其他方式)。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/e9KNlgz.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;下圖就是成功掛載的樣子，檢查資料夾的路徑，沒問題就按確認。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/u5Fi6H9.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;打開ubuntu的檔案資料夾，會出現剛才建立的資料夾:&lt;br&gt;
前綴是sf_加共用資料夾名稱，打開後測試看看能不能在ubuntu添加檔案。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/b8mvMBY.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="畫面大小"&gt;&lt;span class="ez-toc-section" id="%E7%95%AB%E9%9D%A2%E5%A4%A7%E5%B0%8F"&gt;&lt;/span&gt;畫面大小&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;自動調整客體顯示大小&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/0JyDeEU.png" alt="" /&gt;&lt;/p&gt;
&lt;h5 id="補充無法使用客體大小"&gt;補充:無法使用客體大小
&lt;/h5&gt;&lt;p&gt;某次安裝的ubuntu20.04無法使用客體大小。在網路上查了三個小時終於找到解決方式。&lt;/p&gt;
&lt;p&gt;一直重新安裝VBoxGuestAdditions.iso檔都沒用，最後再下列網址找到解決方式。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://askubuntu.com/questions/452979/resolution-doesnt-change-when-resizing-virtualbox-window" target="_blank" rel="noopener"
 &gt;解決網址&lt;/a&gt;&lt;br&gt;
終端機輸入下列指令，之後重新開機。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo apt-get install virtualbox-guest-dkms&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker] 三個基本概念</title><link>https://quietbo.com/2021/07/01/docker-%E4%B8%89%E5%80%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</link><pubDate>Thu, 01 Jul 2021 11:05:00 +0000</pubDate><guid>https://quietbo.com/2021/07/01/docker-%E4%B8%89%E5%80%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/</guid><description>&lt;p&gt;三個基本概念:&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 Image (映像檔)
 &lt;/li&gt;
 &lt;li&gt;
 Container (容器)
 &lt;/li&gt;
 &lt;li&gt;
 repositories (倉庫)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="image-映像檔"&gt;&lt;span class="ez-toc-section" id="Image_%E6%98%A0%E5%83%8F%E6%AA%94"&gt;&lt;/span&gt;Image (映像檔)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;Docker Image是一個唯讀的模板，用來建立 Docker Container(容器)&lt;/p&gt;
&lt;p&gt;例如：&lt;br&gt;
一個image包含一個完整的ubuntu，裡面安裝了python3或其它需使用的應用程式。&lt;br&gt;
Docker 提供了一個非常簡單的方式來建立image或更新現有的image，大部分的使用者可以直接從其他人已經做好的image來下載來用。&lt;/p&gt;
&lt;h1 id="container容器"&gt;&lt;span class="ez-toc-section" id="Container%E5%AE%B9%E5%99%A8"&gt;&lt;/span&gt;Container(容器)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;Docker 利用Container來執行應用。(注意Image是一個唯讀，要有Container才有操作)&lt;br&gt;
Container是從Image建立的執行實例。主要進行Container的啟動、停止、刪除。而這裡的每個Container都是相互隔離的，彼此不會互相影響。&lt;/p&gt;
&lt;h1 id="repository倉庫"&gt;&lt;span class="ez-toc-section" id="Repository%E5%80%89%E5%BA%AB"&gt;&lt;/span&gt;Repository(倉庫)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;倉庫是集中Image檔案的地方，我看過的幾部教學影片，會把倉庫註冊伺服器(Registry)混為成同一個東西，&lt;br&gt;
倉庫分為Public(公開)和Private(私有)兩種形式。&lt;/p&gt;
&lt;p&gt;補充:Registry上存放著多個Repository，每個Repository又有多個Image，每個Image又有不同的版本(也可以當tag標籤)。&lt;/p&gt;
&lt;h2 id="public公開"&gt;&lt;span class="ez-toc-section" id="Public%E5%85%AC%E9%96%8B"&gt;&lt;/span&gt;Public(公開)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;最大的公開倉庫是大部分人都知道的 Docker Hub。其他的話還有&lt;a rel="noreferrer noopener" href="https://www.redhat.com/zh/technologies/cloud-computing/quay" target="_blank"&gt;紅帽&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="private私有"&gt;&lt;span class="ez-toc-section" id="Private%E7%A7%81%E6%9C%89"&gt;&lt;/span&gt;Private(私有)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;使用者也可以在本地網路內建立一個私有倉庫。當使用者建立了自己的Image之後就可以使用 push 命令將它上傳到公開或者私有倉庫，這樣下次在另外一台機器上使用這個Image時候，只需要從倉庫上 pull 下來就可以了。&lt;/p&gt;
&lt;p&gt;來源:&lt;a rel="noreferrer noopener" href="https://philipzheng.gitbook.io/docker_practice/repository" target="_blank"&gt;Docker —— 從入門到實踐&lt;/a&gt;&lt;/p&gt;</description></item><item><title>設定windows shadowsocks與virtualbox(ubuntu)共享IP</title><link>https://quietbo.com/2021/06/30/%E8%A8%AD%E5%AE%9Awindows-shadowsocks%E8%88%87virtualboxubuntu%E5%85%B1%E4%BA%ABip/</link><pubDate>Wed, 30 Jun 2021 13:53:44 +0000</pubDate><guid>https://quietbo.com/2021/06/30/%E8%A8%AD%E5%AE%9Awindows-shadowsocks%E8%88%87virtualboxubuntu%E5%85%B1%E4%BA%ABip/</guid><description>&lt;p&gt;最近WFH後，都要用penVPN和shadowsocks的IP來開發和測試。&lt;br&gt;
但其實我一直有一個問題沒有解決，&lt;br&gt;
就是windows開shadowsocks，但virtualbox的ubuntu20.04沒有共享到，&lt;br&gt;
最近測試又要用shadowsocks的IP，終於在今天把這問題解決了。(感謝我家技術長提供的方法)&lt;/p&gt;
&lt;p&gt;主機系統：Windows10&lt;br&gt;
VPN：shadowsocks 4.1.9.2&lt;br&gt;
VM: virtualbox 6.1.0&lt;br&gt;
Client:ubuntu20.04&lt;/p&gt;
&lt;p&gt;注:這裡不教設定方式，請自行上網設定完成及確認正確ip&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 啟用windows的shadowsocks&lt;br /&gt;shadowsocks右鍵 -&gt; 系統代理 -&gt; 全局模式&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/3ngWvhP.png" alt="" /&gt;
 &lt;/li&gt;
 &lt;li&gt;
 顯示ubumtu路由的設定&lt;br /&gt;在ubuntu打開終端機，執行:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;ip route show&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我們要的是紅框內的IP(每台可能不一樣，不要抄我的IP)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/F1UQmfu.png" alt="" /&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 設置Virtualbox 使用 NAT 網絡&lt;br /&gt;之前我一直設定成橋接模式&lt;br /&gt;設定 -&gt; 網路 -&gt; 附加到:NAT&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/G4Xgwb8.png" alt="" /&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這邊設定完我會重開一次ubuntu。&lt;/p&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 設置ubuntu網絡代理伺服器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;打開ubuntu設定，&lt;br&gt;
網路 -&amp;gt; 網路代理伺服器 -&amp;gt; 手動 -&amp;gt; 填入在第二步驟時的ip&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ZYge3iA.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/lnwpSOT.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;設定完後，網路代理伺服器會變成:手動&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ziZGQRy.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;在ubuntu開啟測試IP網址:https://www.whatismyip.com.tw&lt;br&gt;
注意:此時windows的shadowsocks是開著，ubuntu有網路連線，代理伺服器是手動。&lt;/p&gt;
&lt;p&gt;如果IP是原本shadowsocks-windows的IP就成功了。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/NoQWLvk.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;如果開發結束，想用回原本的IP，只要把網路代理伺服器會變成:關閉&lt;br&gt;
就不會用shadowsocks-windows的IP了。&lt;/p&gt;
&lt;p&gt;來自:&lt;a class="link" href="https://stackoverflow.com/questions/49941543/how-to-set-virtualbox-centos-7-client-to-share-host-vpn" target="_blank" rel="noopener"
 &gt;stackoverflow的文章&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[安裝]Mac pro M1 安裝virtualenv</title><link>https://quietbo.com/2021/06/27/mac-pro-m1-%E5%AE%89%E8%A3%9Dvirtualenv/</link><pubDate>Sun, 27 Jun 2021 11:55:45 +0000</pubDate><guid>https://quietbo.com/2021/06/27/mac-pro-m1-%E5%AE%89%E8%A3%9Dvirtualenv/</guid><description>&lt;p&gt;目前自帶版本有:&lt;br&gt;
Python 2.7.16&lt;br&gt;
Python 3.8.2&lt;/p&gt;
&lt;p&gt;查詢路徑：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;which python3 # which python&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/cjtmWq2.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 安裝virtualenv&lt;br /&gt;用pip就可以安裝 virtualenv，可以同時用在 Python 2 和 3，
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;pip install virtualenv&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 創建虛擬環境
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;mkdir work_venv # 建立一個名為work_venv的資料夾
python3 -m virtualenv XXXvenv # 創建名為XXvenv的虛擬機&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/PXPLVuo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 進入/安裝模組/離開虛擬環境
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;source XXvenv/bin/activate

# 進到虛擬環境，最前面就會多（XXvenv）
pip list&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/unecAMW.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;pip install XXXX # 安裝模組
pip install -r requirements.txt # 導入requirements.txt(路徑自行填寫)
deactivate # 離開虛擬環境&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[C#] @、$及@$的字串處理(必學)</title><link>https://quietbo.com/2021/06/24/c-%E3%80%81%E5%8F%8A%E7%9A%84%E5%AD%97%E4%B8%B2%E8%99%95%E7%90%86%E5%BF%85%E5%AD%B8/</link><pubDate>Wed, 23 Jun 2021 18:26:45 +0000</pubDate><guid>https://quietbo.com/2021/06/24/c-%E3%80%81%E5%8F%8A%E7%9A%84%E5%AD%97%E4%B8%B2%E8%99%95%E7%90%86%E5%BF%85%E5%AD%B8/</guid><description>&lt;p&gt;最近新專案進來，從Python轉到C#了，一切來的太突然，因為不是很熟悉C#，所以在這做些筆記，也方便分享給其他同事，一起學習C#。&lt;/p&gt;
&lt;p&gt;符號:@&lt;br&gt;
用途:加在字串前面，表示其中的轉義字元不被處理，也可換行。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string a = "hello \t world";
string b = @"hello \t world";
string c = "today is \"Sunday\"";
string d = @"today is ""Sunday""";
string e = "https:\\\\localhost\\user\\name.txt";
string f = @"https:\\localhost\user\name.txt";
string g = "AAA\r\nBBB\r\nCCC";
string h = @"
AAAA
BBBB
CCCC";&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顯示如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/6u5UR8t.png" alt="" /&gt;&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 如果使用@的話，編譯時會自動上\r\n\t。像h輸出就是自動加換行的結果。&lt;br /&gt;此處注意的是:顯示一個雙引號的話，需要像d寫法一樣，使用2個雙引號&amp;#8221;&amp;#8221;才會當作1個雙引號&amp;#8221;
 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;符號:$&lt;br&gt;
用途:使用String.Format將指定的變數名稱帶入字串中。&lt;br&gt;
其實就是:字串輸出格式。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string a = "hello world";
string b = @"today is ""Sunday""";
string c = @"https:\\localhost\user\name.txt";


string i = $"{a} {b} URL:{c}";
Console.WriteLine(i);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;hello world today is "Sunday" URL:https:\\localhost\user\name.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;符號:$@(或@$)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="csharp" class="language-csharp line-numbers"&gt;string a = "hello world";
string b = @"today is ""Sunday""";
string c = @"https:\\localhost\user\name.txt";

string i = $@"{a} 
{b} 
URL:{c}";

Console.WriteLine(i);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/CNKTZro.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[VSCode] 1分鐘搞定，終端機設置Powerline字體</title><link>https://quietbo.com/2021/06/12/vscode-1%E5%88%86%E9%90%98%E6%90%9E%E5%AE%9A%EF%BC%8C%E7%B5%82%E7%AB%AF%E6%A9%9F%E8%A8%AD%E7%BD%AEpowerline%E5%AD%97%E9%AB%94/</link><pubDate>Sat, 12 Jun 2021 11:33:45 +0000</pubDate><guid>https://quietbo.com/2021/06/12/vscode-1%E5%88%86%E9%90%98%E6%90%9E%E5%AE%9A%EF%BC%8C%E7%B5%82%E7%AB%AF%E6%A9%9F%E8%A8%AD%E7%BD%AEpowerline%E5%AD%97%E9%AB%94/</guid><description>&lt;p&gt;之前在網路上找了一下，很多都要去git clone 字體才能解決，&lt;br&gt;
但最簡單的方式就是直接輸入。&lt;/p&gt;
&lt;p&gt;以下是用Mac操作如下：&lt;br&gt;
code -&amp;gt; 喜好設定 -&amp;gt; 設定 -&amp;gt; 輸入Font Family&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/a8w62Do.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;終端機 -&amp;gt; Integrated:Font Family內，輸入’Meslo LG L DZ for Powerline’&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/bOjV4pf.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;完成！&lt;/p&gt;
&lt;p&gt;如果是在Windows的話，可能沒有 Meslo LG L DZ for Powerline 這個字型，可以參考這篇&lt;a href="https://quietbo.com/2021/08/18/windows-%e7%be%8e%e5%8c%96terminal-powershell/" data-type="URL" data-id="https://quietbo.com/2021/08/18/windows-%e7%be%8e%e5%8c%96terminal-powershell/"&gt;[Windows] 美化Terminal- powershell&lt;/a&gt;，主要是字型有Source Code Pro for Powerline，就可以在Source Code Pro for Powerline輸入上，也可正常使用。&lt;/p&gt;</description></item><item><title>[Pycharm] 退出 run pytest</title><link>https://quietbo.com/2021/06/11/pycharm-%E9%80%80%E5%87%BA-run-pytest/</link><pubDate>Fri, 11 Jun 2021 09:11:30 +0000</pubDate><guid>https://quietbo.com/2021/06/11/pycharm-%E9%80%80%E5%87%BA-run-pytest/</guid><description>&lt;p&gt;某次安裝pytest後，在執行程式都會自動用pytest，但我其實很少用到pytest，可又不想把Package刪除。&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/06/11/pycharm-%e9%80%80%e5%87%ba-run-pytest/#%E5%A6%82%E4%BD%95%E6%AA%A2%E6%9F%A5%E6%98%AF%E5%90%A6%E5%B7%B2%E5%AE%89%E8%A3%9Dpytest%E7%9A%84package" &gt;如何檢查是否已安裝pytest的package?&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/06/11/pycharm-%e9%80%80%e5%87%ba-run-pytest/#%E6%96%B9%E6%B3%951%E7%9F%AD%E6%9C%9F%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C%E7%94%A8" &gt;方法1(短期解決問題用):&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/06/11/pycharm-%e9%80%80%e5%87%ba-run-pytest/#%E6%96%B9%E6%B3%952" &gt;方法2:&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/06/11/pycharm-%e9%80%80%e5%87%ba-run-pytest/#%E6%96%B9%E6%B3%953" &gt;方法3:&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="如何檢查是否已安裝pytest的package"&gt;&lt;span class="ez-toc-section" id="%E5%A6%82%E4%BD%95%E6%AA%A2%E6%9F%A5%E6%98%AF%E5%90%A6%E5%B7%B2%E5%AE%89%E8%A3%9Dpytest%E7%9A%84package"&gt;&lt;/span&gt;如何檢查是否已安裝pytest的package?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;File -&amp;gt; settings -&amp;gt; Project:xxxx -&amp;gt; Project Interpreter&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/XQSdgQp.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;如果需要移除，就點右方的”-“&lt;/p&gt;
&lt;h2 id="方法1短期解決問題用"&gt;&lt;span class="ez-toc-section" id="%E6%96%B9%E6%B3%951%E7%9F%AD%E6%9C%9F%E8%A7%A3%E6%B1%BA%E5%95%8F%E9%A1%8C%E7%94%A8"&gt;&lt;/span&gt;方法1(短期解決問題用):&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;指定一般執行模式上方run -&amp;gt; Run…&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;如果點Run 'pytest in XXXXX.py'，又會在執行pytest。&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ig2F7pt.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/KhiWAZs.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="方法2"&gt;&lt;span class="ez-toc-section" id="%E6%96%B9%E6%B3%952"&gt;&lt;/span&gt;方法2:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt; &lt;figure class="wp-block-image is-resized"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img loading="lazy" decoding="async" src="https://i.imgur.com/ig2F7pt.png" alt="" width="804" height="88" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/j1qkHAa.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;將Python test內想去掉的文件點選後點擊上面的’-‘號。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/X2dw0WI.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="方法3"&gt;&lt;span class="ez-toc-section" id="%E6%96%B9%E6%B3%953"&gt;&lt;/span&gt;方法3:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;File -&amp;gt; settings -&amp;gt; Tools -&amp;gt; Python Integrated Tools&lt;/p&gt;
&lt;p&gt;查看Default test runner ，如果現在是pytest，則改成Unittests&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/idxFJNb.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;之後要寫C#改用VSCode了，短時間應該不會有Pycharm的文章。&lt;/p&gt;</description></item><item><title>Visual Studio Code 與 Visual Studio</title><link>https://quietbo.com/2021/06/07/visual-studio-code-%E8%88%87-visual-studio/</link><pubDate>Mon, 07 Jun 2021 15:38:03 +0000</pubDate><guid>https://quietbo.com/2021/06/07/visual-studio-code-%E8%88%87-visual-studio/</guid><description>&lt;p&gt;我在開發web時使用VSCode，主要是寫前端、Python。(現在要多個C#了)&lt;br&gt;
Visual Studio是在大學、銀行專案和C++有使用過，這兩個我都有用過一段時間，&lt;br&gt;
最近發現，有些人把Visual Studio Code 和 Visual Studio誤會成同一個，可能是因為名稱和外型很像，所以會搞混，在這小說明這兩者之間的差異。&lt;/p&gt;
&lt;h2 id="visual-studio-code"&gt;Visual Studio Code &lt;figure class="wp-block-image"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/U9qsiXS.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/3QWvWax.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://zh.wikipedia.org/wiki/Visual_Studio_Code" target="_blank" rel="noopener"
 &gt;Wiki:Visual Studio Code&lt;/a&gt;&lt;br&gt;
下載點:&lt;a class="link" href="https://azure.microsoft.com/zh-tw/products/visual-studio-code/" target="_blank" rel="noopener"
 &gt;Visual Studio Code&lt;/a&gt;&lt;br&gt;
Editor 編輯器&lt;br&gt;
輕量化、快速、著重在寫程式碼編輯，&lt;br&gt;
適用於Windows、MacOS及Linux，性能速度較快、可以各別擴充包且免費。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/QoMqC9k.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;事實上，我覺得VSCode不能與Visual Studio比較，能夠比較的對象應該是Sublime、Atom，因為這兩個都是Editor。&lt;/p&gt;
&lt;h2 id="visual-studio"&gt;Visual Studio &lt;figure class="wp-block-image"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Jqy4iSQ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://zh.wikipedia.org/wiki/%E9%9B%86%E6%88%90%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83" target="_blank" rel="noopener"
 &gt;Wiki:IDE 整合開發環境&lt;/a&gt;&lt;br&gt;
&lt;a class="link" href="https://zh.wikipedia.org/wiki/Microsoft_Visual_Studio" target="_blank" rel="noopener"
 &gt;Wiki:Visual Studio&lt;/a&gt;&lt;br&gt;
下載點:&lt;a class="link" href="https://visualstudio.microsoft.com/zh-hant/" target="_blank" rel="noopener"
 &gt;Visual Studio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IDE 可以說是編輯器、編譯、介面設計、測試、佈署的工具…等等，很多在開發時會用到的工具都放在裡面。&lt;br&gt;
屬於重量級的軟體。&lt;/p&gt;
&lt;p&gt;下載的話是分Community、Professional及Enterprise。除了社區版以外都要付費，在安裝的過程中，套件或工具這些選擇越多，明顯感受到安裝越多時間越久，光是安裝就跟VSCode有明顯的落差。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/quwhDvG.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;小結:&lt;/p&gt;
&lt;p&gt;對我來說Visual Studio Code 與 Visual Studio是不一樣的東西，&lt;br&gt;
所以並沒有特別覺得哪個較差，只是基於自己習慣和大多數人使用，還是VSCode較多。&lt;/p&gt;</description></item><item><title>[Python]字串轉型態ast.literal_eval，且為什麼不建議eval(必學)</title><link>https://quietbo.com/2021/06/03/python-%E5%AD%97%E4%B8%B2%E8%BD%89%E5%9E%8B%E6%85%8Bast-literal_eval%EF%BC%8C%E4%B8%94%E7%82%BA%E4%BB%80%E9%BA%BC%E4%B8%8D%E5%BB%BA%E8%AD%B0eval%E5%BF%85%E5%AD%B8/</link><pubDate>Thu, 03 Jun 2021 09:40:06 +0000</pubDate><guid>https://quietbo.com/2021/06/03/python-%E5%AD%97%E4%B8%B2%E8%BD%89%E5%9E%8B%E6%85%8Bast-literal_eval%EF%BC%8C%E4%B8%94%E7%82%BA%E4%BB%80%E9%BA%BC%E4%B8%8D%E5%BB%BA%E8%AD%B0eval%E5%BF%85%E5%AD%B8/</guid><description>&lt;p&gt;三分鐘學習一個小知識，還有範例直接看!&lt;/p&gt;
&lt;p&gt;當python在做型態轉換，str轉dict、list、tuple、set或是int時，有些人會使用eval 或 ast.literal_eval，但eval是不推的，安全性是其中重要的原因。&lt;br&gt;
若要單純轉換型態，我。&lt;/p&gt;
&lt;p&gt;稍微講一下eval會說是危險原因:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8

"""
輸入下方指令:
"1000"
"1+3"
"[0, 1, [2, 2]]"
"(1, 3, 5, [7])"
"{'A': 'aa', 'B': 'bb', 'C': 'cc'}"
"__import__('os').system('ls /')"
"""
std = input('please input: ')
eval_std = eval(std)
print('input: ',eval_std, type(eval_std))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上5種輸入，下方為輸出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;input: 1000 &amp;lt;type 'int'&amp;gt;
input: 4 &amp;lt;type 'int'&amp;gt;
input: [0, 1, [2, 2]] &amp;lt;type 'list'&amp;gt;
input: (1, 3, 5, [7]) &amp;lt;type 'tuple'&amp;gt;
input: {'A': 'aa', 'C': 'cc', 'B': 'bb'} &amp;lt;type 'dict'&amp;gt;

bin boot cdrom dev etc home lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv swapfile sys tmp usr var VBox.log
input: 0 &amp;lt;type 'int'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;eval 不只是可以轉型態、將輸入做處理，甚至系統的命令都能執行!&lt;br&gt;
如果今天(使用者)輸入的內容是輸入刪除文件、顯示目錄結構等命令，那是很大的危險，所以要轉型態是不建議使用eval的!(本篇不介紹惡意操作的指令有哪些)&lt;/p&gt;
&lt;p&gt;使用下方程式:ast.literal_eval&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8
import ast

"""
輸入下方指令:
"1000"
"1+3" # 會報錯
"[0, 1, [2, 2]]"
"(1, 3, 5, [7])"
"{'A': 'aa', 'B': 'bb', 'C': 'cc'}"
"__import__('os').system('ls /')" # 會報錯
"""
std = input('please input: ')
ast_std = ast.literal_eval(std)
print('input: %s %s'% (ast_std, type(ast_std)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ast.literal_eval會去判斷要解析的內容是否安全，不安全就報錯，我們只要處理報錯的處理就好，比起找回刪除的檔案或是被偷的資料，這輕鬆多了。&lt;/p&gt;
&lt;p&gt;結論:字符串進行類型轉換，一律用ast.literal_eval()&lt;/p&gt;
&lt;p&gt;連結:&lt;a class="link" href="https://docs.python.org/2/library/ast.html" target="_blank" rel="noopener"
 &gt;python document&lt;/a&gt;&lt;/p&gt;</description></item><item><title>windows分享VPN給手機</title><link>https://quietbo.com/2021/05/28/windows%E5%88%86%E4%BA%ABvpn%E7%B5%A6%E6%89%8B%E6%A9%9F/</link><pubDate>Thu, 27 May 2021 16:54:17 +0000</pubDate><guid>https://quietbo.com/2021/05/28/windows%E5%88%86%E4%BA%ABvpn%E7%B5%A6%E6%89%8B%E6%A9%9F/</guid><description>&lt;p&gt;原本用手機測試都是連公司的wifi，不需要開vpn，但最近疫情關係要WFH，一定要用公司IP才能測試。&lt;/p&gt;
&lt;p&gt;以下操作只要抓到兩個關鍵點就可以完成了&lt;br&gt;
1.VPN是哪台?如何判斷?&lt;br&gt;
2.如何開啟行動熱點?如何判斷?&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/05/28/windows%e5%88%86%e4%ba%abvpn%e7%b5%a6%e6%89%8b%e6%a9%9f/#%E9%96%8B%E5%95%9F%E7%B6%B2%E8%B7%AF%E9%80%A3%E7%B7%9A%E7%95%AB%E9%9D%A2" &gt;開啟網路連線畫面&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/05/28/windows%e5%88%86%e4%ba%abvpn%e7%b5%a6%e6%89%8b%e6%a9%9f/#VPN%E6%98%AF%E5%93%AA%E5%8F%B0%E6%80%8E%E9%BA%BC%E5%88%A4%E6%96%B7" &gt;VPN是哪台?怎麼判斷?&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/05/28/windows%e5%88%86%e4%ba%abvpn%e7%b5%a6%e6%89%8b%e6%a9%9f/#%E5%A6%82%E4%BD%95%E9%96%8B%E5%95%9F%E8%A1%8C%E5%8B%95%E7%86%B1%E9%BB%9E%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%B7" &gt;如何開啟行動熱點?如何判斷?&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/05/28/windows%e5%88%86%e4%ba%abvpn%e7%b5%a6%e6%89%8b%e6%a9%9f/#%E8%A8%AD%E5%AE%9A%E5%88%86%E4%BA%ABVPN%E6%AD%A5%E9%A9%9F" &gt;設定分享VPN步驟&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/05/28/windows%e5%88%86%e4%ba%abvpn%e7%b5%a6%e6%89%8b%e6%a9%9f/#%E6%B8%AC%E8%A9%A6" &gt;測試&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h1 id="開啟網路連線畫面"&gt;&lt;span class="ez-toc-section" id="%E9%96%8B%E5%95%9F%E7%B6%B2%E8%B7%AF%E9%80%A3%E7%B7%9A%E7%95%AB%E9%9D%A2"&gt;&lt;/span&gt;開啟網路連線畫面&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;先到下圖的畫面(如果找到了就可以跳過找這畫面的過程)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oYrfG7N.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;如果找不到，可以在下方操作找到:&lt;br&gt;
右下網路WiFi圖示右鍵 -&amp;gt; 開啟網路和網際網路設定 -&amp;gt; 狀態 -&amp;gt; 變更介面卡選項&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/dlQtPLh.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/j8d2ED8.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="vpn是哪台怎麼判斷"&gt;&lt;span class="ez-toc-section" id="VPN%E6%98%AF%E5%93%AA%E5%8F%B0%E6%80%8E%E9%BA%BC%E5%88%A4%E6%96%B7"&gt;&lt;/span&gt;VPN是哪台?怎麼判斷?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;看到後找尋有TAP-Windows Adapter V9 字的就是VPN。&lt;br&gt;
但若有2台以上，沒辦法判斷哪台才是真正要分享的VPN時，打開VPN的程式，再回來看網路連線，有連線上的就是正確的。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/vCaVmQK.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="如何開啟行動熱點如何判斷"&gt;&lt;span class="ez-toc-section" id="%E5%A6%82%E4%BD%95%E9%96%8B%E5%95%9F%E8%A1%8C%E5%8B%95%E7%86%B1%E9%BB%9E%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%B7"&gt;&lt;/span&gt;如何開啟行動熱點?如何判斷?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;回到下面設定位置，開啟行動熱點，藍色框就是手機連線要找的Wifi名稱和密碼。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oJg9ufU.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;回到網路連線畫面，會看到多了一個熱點分享的區域連線，這台就是要分享出去的網路，等等要設定，所以要記得名字。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/edYmhzv.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="設定分享vpn步驟"&gt;&lt;span class="ez-toc-section" id="%E8%A8%AD%E5%AE%9A%E5%88%86%E4%BA%ABVPN%E6%AD%A5%E9%A9%9F"&gt;&lt;/span&gt;設定分享VPN步驟&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;把已知VPN右鍵 -&amp;gt; 內容&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Kbdbsnm.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;共用 -&amp;gt; 第一個框打勾 -&amp;gt; 選擇行動熱點的區域連線&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/1RcIzrL.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="測試"&gt;&lt;span class="ez-toc-section" id="%E6%B8%AC%E8%A9%A6"&gt;&lt;/span&gt;測試&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;把筆電和手機開啟&lt;a href="https://www.whatismyip.com.tw/" target="_blank" rel="noreferrer noopener"&gt;測試網路IP的連結&lt;/a&gt;，若IP一樣，就是分享成功!&lt;/p&gt;
&lt;p&gt;參考連結:&lt;a href="https://makingreal.net/win10%E7%94%B5%E8%84%91%E7%83%AD%E7%82%B9%E5%85%B1%E4%BA%ABvpn%E8%BF%9E%E7%BB%93/" target="_blank" rel="noreferrer noopener"&gt;Win10电脑热点共享VPN连结&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Pycharm] 突然連不到sql檔，檔案變成資料夾灰色叉叉 (已解決)</title><link>https://quietbo.com/2021/05/26/%E8%A7%A3%E6%B1%BA-pycharm-%E7%AA%81%E7%84%B6%E9%80%A3%E4%B8%8D%E5%88%B0sql%E6%AA%94%EF%BC%8C%E6%AA%94%E6%A1%88%E8%AE%8A%E6%88%90%E8%B3%87%E6%96%99%E5%A4%BE%E7%81%B0%E8%89%B2%E5%8F%89%E5%8F%89/</link><pubDate>Wed, 26 May 2021 13:40:54 +0000</pubDate><guid>https://quietbo.com/2021/05/26/%E8%A7%A3%E6%B1%BA-pycharm-%E7%AA%81%E7%84%B6%E9%80%A3%E4%B8%8D%E5%88%B0sql%E6%AA%94%EF%BC%8C%E6%AA%94%E6%A1%88%E8%AE%8A%E6%88%90%E8%B3%87%E6%96%99%E5%A4%BE%E7%81%B0%E8%89%B2%E5%8F%89%E5%8F%89/</guid><description>&lt;p&gt;我是用網路磁碟連到ubuntu裡面的專案，就在某次要查SQL時，一直找不到檔案內的資料，後來我去看檔案，顯示如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9mdbo7h.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;原本是長這樣:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/v2W2dK3.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;我是用windows查看ubuntu內的檔案，看到SQL檔變成一個資料夾左下打灰色叉，後來我試過了ubuntu重開機，windows也重開機，pycharm也用過invalid cache and restart了，仍沒有解決這問題，網路上找到的解決方式，大多都跟雲端有關，但我確定我這問題與雲端無關。&lt;br&gt;
其中也試過了刪除的方式重建，也出現不給刪除的問題。&lt;/p&gt;
&lt;p&gt;以下是我當時解決問題的方式:&lt;/p&gt;
&lt;p&gt;1.修改變成資料夾灰色叉的檔名 -&amp;gt; 成功&lt;br&gt;
2.打開已經改成新名字的檔案 -&amp;gt; 成功&lt;br&gt;
3.先備份一個到其他位置，取同樣的檔名後再回來把有問題的檔案刪除&lt;br&gt;
4.將檔案放回資料夾位置&lt;br&gt;
5.pycharm顯示正常了，但變成一個有修改過的格式&lt;br&gt;
6.檔案右鍵，Git -&amp;gt; Rollback。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/EftPDxk.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;就成功解決這問題了。&lt;br&gt;
目前有7這專案資料夾一起開，但就唯獨一個專案的SQL檔發生這問題，目前還不知道是什麼原因造成的。&lt;/p&gt;</description></item><item><title>[Linux] scp 指令教學與範例</title><link>https://quietbo.com/2021/05/20/linux-scp-%E6%8C%87%E4%BB%A4%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8B/</link><pubDate>Thu, 20 May 2021 14:17:36 +0000</pubDate><guid>https://quietbo.com/2021/05/20/linux-scp-%E6%8C%87%E4%BB%A4%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8B/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/05/20/linux-scp-%e6%8c%87%e4%bb%a4%e6%95%99%e5%ad%b8%e8%88%87%e7%af%84%e4%be%8b/#scp%E6%98%AF%E4%BB%80%E9%BA%BC" &gt;scp是什麼?&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/05/20/linux-scp-%e6%8c%87%e4%bb%a4%e6%95%99%e5%ad%b8%e8%88%87%e7%af%84%e4%be%8b/#%E6%9C%AC%E5%9C%B0%E5%82%B3%E5%88%B0%E9%81%A0%E7%AB%AF" &gt;本地傳到遠端&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/05/20/linux-scp-%e6%8c%87%e4%bb%a4%e6%95%99%e5%ad%b8%e8%88%87%e7%af%84%e4%be%8b/#%E9%81%A0%E7%AB%AF%E5%82%B3%E5%88%B0%E6%9C%AC%E5%9C%B0" &gt;遠端傳到本地&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/05/20/linux-scp-%e6%8c%87%e4%bb%a4%e6%95%99%e5%ad%b8%e8%88%87%e7%af%84%e4%be%8b/#%E4%B8%BB%E8%A6%81%E5%8F%83%E6%95%B8" &gt;主要參數&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="scp是什麼"&gt;&lt;span class="ez-toc-section" id="scp%E6%98%AF%E4%BB%80%E9%BA%BC"&gt;&lt;/span&gt;scp是什麼?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;Linux scp 命令用於Linux 之間複製文件和目錄。&lt;/p&gt;
&lt;p&gt;scp 是secure copy 的縮寫(安全複製), 是linux 系統下基於ssh 登陸進行安全的遠程文件拷貝命令。&lt;br&gt;
更多說明可以到&lt;a class="link" href="https://zh.wikipedia.org/wiki/%E5%AE%89%E5%85%A8%E5%A4%8D%E5%88%B6" target="_blank" rel="noopener"
 &gt;維基百科:SCP安全複製&lt;/a&gt;來了解。&lt;/p&gt;
&lt;p&gt;這真的是超好用的，基本上只要確認另一端可以SSH進去，跟Linux基本指令的就可以簡單上手，以下是我在使用時常用到的指令，在下方我會有指令和說明。&lt;/p&gt;
&lt;h2 id="本地傳到遠端"&gt;&lt;span class="ez-toc-section" id="%E6%9C%AC%E5%9C%B0%E5%82%B3%E5%88%B0%E9%81%A0%E7%AB%AF"&gt;&lt;/span&gt;本地傳到遠端&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;先了解指令的及說明的:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;# scp [-主要參數] 本地端目錄 帳號@遠端主機IP:遠端目錄
scp [-主要參數] /home/ubuntu/local_dir ubuntu@192.168.1.1:/home/ubuntu/test_vm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖為local，將local的scp_text.txt傳送到遠端資料夾中。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/IJV4w9P.png" alt="" /&gt;&lt;br&gt;
下圖為遠端的VM，已成功接收到檔案。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZywY6ll.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="遠端傳到本地"&gt;&lt;span class="ez-toc-section" id="%E9%81%A0%E7%AB%AF%E5%82%B3%E5%88%B0%E6%9C%AC%E5%9C%B0"&gt;&lt;/span&gt;遠端傳到本地&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;接下來示範將遠端目錄傳到本地，這次要傳目錄就需要使用到主要參數。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;# scp [-主要參數] 遠端主機IP:遠端目錄 本地端目錄
scp -r ubuntu@192.168.1.1:/home/ubuntu/remote_vm /home/ubuntu/local_scp &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖為local的資料夾狀態，及使用的指令畫面:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/TdzNmRl.png" alt="" /&gt;&lt;br&gt;
遠端畫面就不顯示了，因為沒有動到&lt;/p&gt;
&lt;h2 id="主要參數"&gt;&lt;span class="ez-toc-section" id="%E4%B8%BB%E8%A6%81%E5%8F%83%E6%95%B8"&gt;&lt;/span&gt;主要參數&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;-r：複製整個目錄以及其下的所有檔案(常用!)&lt;br&gt;
-C：將資料先壓縮後再傳送，可節省傳輸量(常用!)&lt;br&gt;
-v：顯示傳輸進度與資訊(常用!)&lt;br&gt;
-p：檔案在複製後，保留原本的修改時間、存取時間與權限(偶爾用)&lt;br&gt;
-q： 不顯示傳輸進度條&lt;br&gt;
-4：強制使用IPv4來傳輸&lt;br&gt;
-6：強制使用IPv6來傳輸&lt;/p&gt;
&lt;p&gt;我自己是使用過的4個參數，如果想要更多參數可以到:&lt;br&gt;
&lt;a class="link" href="https://www.runoob.com/linux/linux-comm-scp.html" target="_blank" rel="noopener"
 &gt;菜鸟教程&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Pycharm]GitToolBox – Git顯示分支、自動Fetch</title><link>https://quietbo.com/2021/05/17/pycharmgittoolbox-git%E9%A1%AF%E7%A4%BA%E5%88%86%E6%94%AF%E3%80%81%E8%87%AA%E5%8B%95fetch/</link><pubDate>Mon, 17 May 2021 14:12:47 +0000</pubDate><guid>https://quietbo.com/2021/05/17/pycharmgittoolbox-git%E9%A1%AF%E7%A4%BA%E5%88%86%E6%94%AF%E3%80%81%E8%87%AA%E5%8B%95fetch/</guid><description>&lt;p&gt;GitToolBox 是IDE插件，我個人是滿推薦安裝的，下方有一些截圖和功能說明，如果這是你想要的工具，你想安裝的話，可以參考下方的安裝、設定方式。&lt;/p&gt;
&lt;h2 id="顯示git-branchfetch和最後commit的時間和訊息"&gt;顯示git Branch、Fetch和最後commit的時間和訊息
&lt;/h2&gt;&lt;img decoding="async" src="https://i.imgur.com/Lz0pHKL.png" alt="" /&gt; 
Δ-表示有變化 
∅-不變/乾淨
&lt;p&gt;舉例:&lt;br&gt;
2Δ-表示有2個變化(Fetch)。&lt;/p&gt;
&lt;p&gt;Fetch會自動檢查，若不想要太常檢查可以自行設定。&lt;/p&gt;
&lt;p&gt;下圖是我隨便截的一段程式碼，在26行是我光標停放的位置，會顯示該行git最後commit的時間和訊息，這也是能夠自己設定格式。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/61gLzih.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="安裝使用方式"&gt;安裝、使用方式
&lt;/h2&gt;&lt;p&gt;本次操作版本為:11.0.6&lt;br&gt;
安裝方法:&lt;br&gt;
File -&amp;gt; Settings -&amp;gt; Plugins -&amp;gt; GitToolBox -&amp;gt; Installed&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZIxUJmc.png" alt="" /&gt;&lt;br&gt;
安裝過程或許會較久，若安裝完成建議重開Pycharm。&lt;/p&gt;
&lt;p&gt;使用方法:&lt;br&gt;
File -&amp;gt; Settings -&amp;gt; Other Settings -&amp;gt; GitToolBox Global 或 GitToolBox Project&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/jrMK0sC.png" alt="" /&gt;&lt;br&gt;
這兩個都可以進去修改。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/zielu/GitToolBox/wiki/Manual#git-status-display" target="_blank" rel="noopener"
 &gt;點選我獲得更詳細的操作&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Docke] ubuntu 安裝Docke</title><link>https://quietbo.com/2021/05/12/docke-ubuntu-%E5%AE%89%E8%A3%9D/</link><pubDate>Tue, 11 May 2021 17:56:00 +0000</pubDate><guid>https://quietbo.com/2021/05/12/docke-ubuntu-%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;以下為ubuntu20.04&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#Linux_%E5%AE%89%E8%A3%9Ddocker" &gt;Linux 安裝docker&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#Linux_%E5%AE%89%E8%A3%9Ddocker_Compose" &gt;Linux 安裝docker Compose&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#docker_%E5%88%87%E6%8F%9B%E4%BD%BF%E7%94%A8%E8%80%85" &gt;docker 切換使用者&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#%E6%9B%B4%E6%96%B0apt%E5%8C%85%E8%B5%84%E6%BA%90%E7%B4%A2%E5%BC%95" &gt;更新apt包资源索引&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#%E5%AE%89%E8%A3%9D%E8%BB%9F%E4%BB%B6%E5%8C%85%E4%BB%A5%E5%85%81%E8%A8%B1apt%E9%80%9A%E9%81%8EHTTPS%E4%BD%BF%E7%94%A8%E5%AD%98%E5%84%B2%E5%BA%AB" &gt;安裝軟件包以允許apt通過HTTPS使用存儲庫:&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/05/12/docke-ubuntu-%e5%ae%89%e8%a3%9d/#%E9%87%8D%E6%96%B0%E9%96%8B%E5%95%9Fdocker" &gt;重新開啟docker&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="linux-安裝docker"&gt;&lt;span class="ez-toc-section" id="Linux_%E5%AE%89%E8%A3%9Ddocker"&gt;&lt;/span&gt;Linux 安裝docker&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;在 Ubuntu Linux 中，使用 apt 安裝 Docker 比較方便：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo apt-get install docker.io&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/6z0wwDO.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;安裝好之後，查看一下 docker 服務是否有正常啟動：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service docker status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常的話，應該可以看到綠色的狀態：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/UMvvP4N.png" alt="" /&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo usermod -aG docker 使用者名稱&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/SgP2HST.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;docker version&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/QvrXKqq.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/B5QPKn6.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="linux-安裝docker-compose"&gt;&lt;span class="ez-toc-section" id="Linux_%E5%AE%89%E8%A3%9Ddocker_Compose"&gt;&lt;/span&gt;Linux 安裝docker Compose&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo gpasswd -a ${USER} docker&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/L9WTE0i.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="docker-切換使用者"&gt;&lt;span class="ez-toc-section" id="docker_%E5%88%87%E6%8F%9B%E4%BD%BF%E7%94%A8%E8%80%85"&gt;&lt;/span&gt;docker 切換使用者&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 將使用者加入群組
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo gpasswd -a ${USER} docker&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 切換到超級使用者
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo su&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 切回使用者
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;su ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="更新apt包资源索引"&gt;&lt;span class="ez-toc-section" id="%E6%9B%B4%E6%96%B0apt%E5%8C%85%E8%B5%84%E6%BA%90%E7%B4%A2%E5%BC%95"&gt;&lt;/span&gt;更新apt包资源索引&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="安裝軟件包以允許apt通過https使用存儲庫"&gt;&lt;span class="ez-toc-section" id="%E5%AE%89%E8%A3%9D%E8%BB%9F%E4%BB%B6%E5%8C%85%E4%BB%A5%E5%85%81%E8%A8%B1apt%E9%80%9A%E9%81%8EHTTPS%E4%BD%BF%E7%94%A8%E5%AD%98%E5%84%B2%E5%BA%AB"&gt;&lt;/span&gt;安裝軟件包以允許apt通過HTTPS使用存儲庫:&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;sudo apt-get install \
 apt-transport-https \
 ca-certificates \
 curl \
 software-properties-common&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="重新開啟docker"&gt;&lt;span class="ez-toc-section" id="%E9%87%8D%E6%96%B0%E9%96%8B%E5%95%9Fdocker"&gt;&lt;/span&gt;重新開啟docker&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;有次早上要執行docker-compose的時候無法正常開啟，出現下方錯誤訊息&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;當時已經設好群組卻還是一樣，所以有可能就是docker不知道原因**&lt;span style="text-decoration: underline;"&gt;被關閉&lt;/span&gt;**了。&lt;br&gt;
下方指令為重新開啟docker的方式。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;service docker start
sudo docker-compose up&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[MySQL] MySQL InternalError: 1251, u’Client does not support authentication protocol requested by server; consider upgrading MySQL client</title><link>https://quietbo.com/2021/05/11/%E8%A7%A3%E6%B1%BA-internalerror-1251-uclient-does-not-support-authentication-protocol-requested-by-server-consider-upgrading-mysql-client/</link><pubDate>Tue, 11 May 2021 11:13:00 +0000</pubDate><guid>https://quietbo.com/2021/05/11/%E8%A7%A3%E6%B1%BA-internalerror-1251-uclient-does-not-support-authentication-protocol-requested-by-server-consider-upgrading-mysql-client/</guid><description>&lt;p&gt;某次在local測試時，因為要新增package而重新build了一次docker。&lt;br&gt;
後來更新get-pip出現錯誤訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;InternalError: (1251, u'Client does not support authentication protocol requested by server; consider upgrading MySQL client')&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;客戶端不支持服務器請求的身份驗證協議；請考慮升級MySQL客戶端&lt;/p&gt;
&lt;p&gt;目前是使用python2.7，MySQL 8.0.23，&lt;br&gt;
不推薦將MYSQL降級，可以通過在創建數據庫時告訴MySQL服務器使用舊版身份驗證插件來實現此目的。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="sql" class="language-sql"&gt;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/5j9Eex7.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;如果不行的話，將@’localhost’拿掉，再重新執行一次，下方還有其他指令，可嘗試以下指令擇一試看看。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES; # 最後一定要加這段&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我是將@’localhost’拿掉後，才成功的。若失敗的話，請參考下方連結，內有許多解決方式。&lt;br&gt;
參考連結:&lt;a rel="noreferrer noopener" href="https://stackoverflow.com/questions/50093144/mysql-8-0-client-does-not-support-authentication-protocol-requested-by-server/50961428" target="_blank"&gt;stackoverflow&lt;/a&gt;、&lt;a rel="noreferrer noopener" href="https://blog.csdn.net/lovedingd/article/details/106728292" data-type="URL" data-id="https://blog.csdn.net/lovedingd/article/details/106728292" target="_blank"&gt;Mysql 解決1251&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Git]提交空資料夾</title><link>https://quietbo.com/2021/05/11/git%E6%8F%90%E4%BA%A4%E7%A9%BA%E8%B3%87%E6%96%99%E5%A4%BE/</link><pubDate>Mon, 10 May 2021 16:26:30 +0000</pubDate><guid>https://quietbo.com/2021/05/11/git%E6%8F%90%E4%BA%A4%E7%A9%BA%E8%B3%87%E6%96%99%E5%A4%BE/</guid><description>&lt;p&gt;Git最初的設計是不支援空資料夾，最初的設計是用來索引文件的，所以Git 只關注文件，不關心目錄，因此在建立空資料夾時，資料夾內一定要有文件，下方提供了我自己使用，且網路上較多人使用的方式，但目的都是要建立空的資料夾。&lt;/p&gt;
&lt;h2 id="解決方式"&gt;解決方式：
&lt;/h2&gt;&lt;p&gt;在空目錄下創建空文件：.gitkeep&lt;br&gt;
這約定俗成的空目錄識別文件名，不具有什麼功用。&lt;br&gt;
網路上會寫可以創建.gitignore，但我自己是不會加入，因為.gitignore檔案是用來讓git忽略版本控制系統中&lt;code&gt;不需要的檔案&lt;/code&gt;的。&lt;/p&gt;
&lt;p&gt;目前建立了空的資料夾，名為foler_2，查看working directory，&lt;br&gt;
Git裡面並且沒有被更改過的檔案。&lt;/p&gt;
&lt;p&gt;以下是使用mac terminal的操作畫面。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;mkdir folder_2
git status&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/XA27aCt.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;進入要建立的空目錄內，創建.gitkeep，接下來Git就會感應到有文件加入。&lt;br&gt;
如果沒有出現，就去檢查一下是不是.gitignore忽略了此文件名稱。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;cd folder_2
ls
touch .gitkeep
git status&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Linyw1u.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;接下來就像平常一樣的流程：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/5u5rSNh.png" alt="" /&gt;&lt;/p&gt;</description></item><item><title>[解決]終端機的亂碼’?’</title><link>https://quietbo.com/2021/05/07/%E8%A7%A3%E6%B1%BA%E7%B5%82%E7%AB%AF%E6%A9%9F%E4%B8%8A%E7%9A%84%E4%BA%82%E7%A2%BC/</link><pubDate>Thu, 06 May 2021 16:35:47 +0000</pubDate><guid>https://quietbo.com/2021/05/07/%E8%A7%A3%E6%B1%BA%E7%B5%82%E7%AB%AF%E6%A9%9F%E4%B8%8A%E7%9A%84%E4%BA%82%E7%A2%BC/</guid><description>&lt;p&gt;最近買了一台mac，網路上找了安裝&lt;code&gt;iTerms2 + Oh-my-zsh&lt;/code&gt;的方法，順利完成安裝後，再回頭開原本的Terminal(終端機)，發現竟然有亂碼！？&lt;br&gt;
雖然絕大部分都開iTerms2，但還是想把這問題解決，不然我晚上一定睡不著覺。&lt;br&gt;
本篇不是要解決&lt;code&gt;終端機中文字出現亂碼&lt;/code&gt;問題。&lt;/p&gt;
&lt;p&gt;下圖是終端機的樣子，有“？”&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/qSlJ2Gc.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;下圖為iTerm2&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/VIMZ10Q.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;為什麼原本的終端機會有？但iTerms2沒有呢？&lt;/p&gt;
&lt;p&gt;主要是因為一個叫&lt;code&gt;Powerline&lt;/code&gt;的字型，如果有興趣的人可以解決這問題後，自行去Google這個關鍵字．&lt;/p&gt;
&lt;p&gt;以下為iTerms2設定．&lt;br&gt;
Preferences -&amp;gt; Profiles -&amp;gt; Text -&amp;gt; Font -&amp;gt; Meslo LG S DZ for Powerline&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/94I8NQ9.png" alt="" /&gt;&lt;br&gt;
大家主要注意是&lt;code&gt;字型&lt;/code&gt;的位置。&lt;/p&gt;
&lt;p&gt;下圖為原本終端機的設定，字體不是Powerline。&lt;br&gt;
描述檔 -&amp;gt; 文字 -&amp;gt; 字體 -&amp;gt; 更改…&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/1awCKzh.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;更改 -&amp;gt; 字體集：等寬字 -&amp;gt; XXXXX Powerline&lt;br&gt;
選最後面有Powerline就可以了&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ZK7KmH6.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;顯示結果：&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/Uphv61g.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;希望本篇有幫助到像我一樣不知道powerline是什麼的人～&lt;/p&gt;</description></item><item><title>[Python]實現php serialize函數</title><link>https://quietbo.com/2021/04/28/python%E5%AF%A6%E7%8F%BEphp-serialize%E5%87%BD%E6%95%B8/</link><pubDate>Wed, 28 Apr 2021 08:50:46 +0000</pubDate><guid>https://quietbo.com/2021/04/28/python%E5%AF%A6%E7%8F%BEphp-serialize%E5%87%BD%E6%95%B8/</guid><description>&lt;p&gt;不同的程式語言之間物件的傳遞，就必須把物件序列化為標準格式，比如XML，但更好的方法是序列化為JSON，因為JSON表示出來就是一個字串，可以被所有語言讀取，也可以方便地儲存到磁碟或者通過網路傳輸。&lt;/p&gt;
&lt;p&gt;舉例A公司用php撰寫後序列化(物件轉字串)傳送到B公司，而B公司用Python反序列化時要用到。&lt;br&gt;
通常是用在Python編程環境和PHP編程環境，相互之間需要&lt;code&gt;進行數據交換&lt;/code&gt;時。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/NTe1vwR.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;pip3 install phpserialize&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;導入庫：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;import phpserialize&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;利用dumps 進行序列化（物件轉字串）：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;phpserialize.dumps(vary)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用loads 進行反序列化（字串轉物件）：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;phpserialize.loads(formated_string)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/whatday/article/details/106987049" target="_blank" rel="noopener"
 &gt;來源1&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Python]並發編程的三種方式</title><link>https://quietbo.com/2021/04/19/python-%E4%B8%A6%E7%99%BC%E7%B7%A8%E7%A8%8B%E7%9A%84%E4%B8%89%E7%A8%AE%E6%96%B9%E5%BC%8F/</link><pubDate>Mon, 19 Apr 2021 08:07:14 +0000</pubDate><guid>https://quietbo.com/2021/04/19/python-%E4%B8%A6%E7%99%BC%E7%B7%A8%E7%A8%8B%E7%9A%84%E4%B8%89%E7%A8%AE%E6%96%B9%E5%BC%8F/</guid><description>&lt;p&gt;1.多進程(Process)&lt;br&gt;
2.多線程(Thread)&lt;br&gt;
3.多協程(Coroutine)&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#1%E4%BB%80%E9%BA%BC%E6%98%AFCPU%E5%AF%86%E9%9B%86%E5%9E%8B%E8%A8%88%E7%AE%97%E3%80%81IO%E5%AF%86%E9%9B%86%E5%9E%8B%E8%A8%88%E7%AE%97" &gt;1.什麼是CPU密集型計算、IO密集型計算?&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#2%E5%A4%9A%E9%80%B2%E7%A8%8B%E3%80%81%E5%A4%9A%E7%B7%9A%E7%A8%8B%E3%80%81%E5%A4%9A%E5%8D%94%E7%A8%8B%E7%9A%84%E5%B0%8D%E6%AF%94" &gt;2.多進程、多線程、多協程的對比&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#%E5%A4%9A%E9%80%B2%E7%A8%8BProcessmultiprocessing" &gt;多進程Process(multiprocessing)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#%E5%A4%9A%E7%B7%9A%E7%A8%8BThreadthreading" &gt;多線程Thread(threading)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#%E5%A4%9A%E5%8D%94%E7%A8%8BCoroutineasycio_%E2%80%93_%E7%95%B0%E6%AD%A5io" &gt;多協程Coroutine(asycio) &amp;#8211; 異步io&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-6&amp;quot; href=&amp;quot;https://quietbo.com/2021/04/19/python-%e4%b8%a6%e7%99%bc%e7%b7%a8%e7%a8%8b%e7%9a%84%e4%b8%89%e7%a8%ae%e6%96%b9%e5%bc%8f/#3_%E5%A6%82%E4%BD%95%E6%A0%B9%E6%93%9A%E4%BB%BB%E5%8B%99%E9%81%B8%E6%93%87%E5%B0%8D%E6%87%89%E7%9A%84%E6%8A%80%E8%A1%93&amp;quot; &amp;gt;3. 如何根據任務選擇對應的技術?&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="1什麼是cpu密集型計算io密集型計算"&gt;&lt;span class="ez-toc-section" id="1%E4%BB%80%E9%BA%BC%E6%98%AFCPU%E5%AF%86%E9%9B%86%E5%9E%8B%E8%A8%88%E7%AE%97%E3%80%81IO%E5%AF%86%E9%9B%86%E5%9E%8B%E8%A8%88%E7%AE%97"&gt;&lt;/span&gt;1.什麼是CPU密集型計算、IO密集型計算?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;bound在這邊是限制的意思。&lt;/p&gt;
&lt;p&gt;CPU密集型(CPU-bound):&lt;br&gt;
CPU密集型也叫計算密集型，指的是I/O在很短的時間就可以完成，CPU需要大量的計算和處理。特點是CPU占用率極高。&lt;br&gt;
例如:壓縮/解壓縮、加密/解密、正則表達式搜索。&lt;/p&gt;
&lt;p&gt;IO密集型(I/O-bound):&lt;br&gt;
指的是系統運作大部分的狀況CPU在等I/O的讀寫。CPU占用率相對的會較低。&lt;br&gt;
例如:文件處理、爬蟲網路、讀寫數據庫。&lt;/p&gt;
&lt;p&gt;小總結:&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 若程式依賴大量的外部連結(內存、硬碟、網路、DB..等等外部連結)就是IO密集型。若其他的只在CPU運算，則是CPU密集型。
 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="2多進程多線程多協程的對比"&gt;&lt;span class="ez-toc-section" id="2%E5%A4%9A%E9%80%B2%E7%A8%8B%E3%80%81%E5%A4%9A%E7%B7%9A%E7%A8%8B%E3%80%81%E5%A4%9A%E5%8D%94%E7%A8%8B%E7%9A%84%E5%B0%8D%E6%AF%94"&gt;&lt;/span&gt;2.多進程、多線程、多協程的對比&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;這三個是有一個級聯關係的。一個進程中可以包含和啟動多個線程，一個線程中可以啟動多個協程。&lt;br&gt;
協程的概念比較新，在任務中可以啟動很多的協程，但本身都在一個線程中進行。&lt;/p&gt;
&lt;h3 id="多進程processmultiprocessing"&gt;&lt;span class="ez-toc-section" id="%E5%A4%9A%E9%80%B2%E7%A8%8BProcessmultiprocessing"&gt;&lt;/span&gt;多進程Process(multiprocessing)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 優點:可以利用多核CPU並行運算
 &lt;/li&gt;
 &lt;li&gt;
 缺點:占用資源最多，可啟動數目比線程少
 &lt;/li&gt;
 &lt;li&gt;
 適用於:CPU密集型計算
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="多線程threadthreading"&gt;&lt;span class="ez-toc-section" id="%E5%A4%9A%E7%B7%9A%E7%A8%8BThreadthreading"&gt;&lt;/span&gt;多線程Thread(threading)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 優點:相比進程，更輕量級，占用的資源更少。&lt;br /&gt;這裡的資源指的是每個線程運行都要包含自己的一些變量存儲，存儲到內存區域
 &lt;/li&gt;
 &lt;li&gt;
 缺點:&lt;br /&gt;相比進程:多線程只能併發執行，不能利用多CPU(GIL-全局解釋器鎖)&lt;br /&gt;相比協程:啟動數目有限制，佔用內存資源，有線程切換開銷
 &lt;/li&gt;
 &lt;li&gt;
 適用於:IO密集型計算、同時運型的任務數木要求不多
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="多協程coroutineasycio-8211-異步io"&gt;&lt;span class="ez-toc-section" id="%E5%A4%9A%E5%8D%94%E7%A8%8BCoroutineasycio_%E2%80%93_%E7%95%B0%E6%AD%A5io"&gt;&lt;/span&gt;多協程Coroutine(asycio) – 異步io&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 優點:內存開銷最少，啟動協程數量最多(甚至到幾萬個)。
 &lt;/li&gt;
 &lt;li&gt;
 缺點:支持的庫有限制(aiohttp vs requests)、代碼實現複雜。&lt;br /&gt;目前有很多技術是不支持協程的，例如requests這個爬蟲常用的類庫，但在python協程中是不支持的，&lt;br /&gt;所以要用協程來進行爬蟲的話，可以用aiohttp。&lt;br /&gt;相比進程、線程，代碼實現複雜，且要考慮的點也較多。
 &lt;/li&gt;
 &lt;li&gt;
 適用於:IO密集型計算、需要超多任務運行、但有現成庫支持的場景。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-如何根據任務選擇對應的技術"&gt;&lt;span class="ez-toc-section" id="3_%E5%A6%82%E4%BD%95%E6%A0%B9%E6%93%9A%E4%BB%BB%E5%8B%99%E9%81%B8%E6%93%87%E5%B0%8D%E6%87%89%E7%9A%84%E6%8A%80%E8%A1%93"&gt;&lt;/span&gt;3. 如何根據任務選擇對應的技術?&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;img decoding="async" src="https://i.imgur.com/yoFF8Xt.png" alt="" /&gt; 
&lt;p&gt;來源:&lt;a class="link" href="https://www.youtube.com/watch?v=qwkc9S85JHs" target="_blank" rel="noopener"
 &gt;youtube&lt;/a&gt;&lt;br&gt;
蚂蚁学Python【Python并发编程】怎样选择多线程多进程多协程&lt;/p&gt;</description></item><item><title>[Editor]Sublime Text 3 – 設置中文&amp;默認語法</title><link>https://quietbo.com/2021/03/30/sublime-text-3-%E8%A8%AD%E7%BD%AE%E9%BB%98%E8%AA%8D%E8%AA%9E%E6%B3%95/</link><pubDate>Tue, 30 Mar 2021 03:57:36 +0000</pubDate><guid>https://quietbo.com/2021/03/30/sublime-text-3-%E8%A8%AD%E7%BD%AE%E9%BB%98%E8%AA%8D%E8%AA%9E%E6%B3%95/</guid><description>&lt;p&gt;安裝:&lt;a class="link" href="http://www.sublimetext.com/" target="_blank" rel="noopener"
 &gt;官方網站&lt;/a&gt;&lt;br&gt;
中文化:&lt;a class="link" href="https://zhuanlan.zhihu.com/p/102376540" target="_blank" rel="noopener"
 &gt;參考網站&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="設置中文"&gt;設置中文
&lt;/h2&gt;&lt;p&gt;Ctrl+Shift+P輸入:install package&lt;figure class="wp-block-image size-full"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="764" height="164" src="https://quietbo.com/uploads/2021/08/image-1.png" alt="" class="wp-image-495" srcset="https://quietbo.com/uploads/2021/08/image-1.png 764w, https://quietbo.com/uploads/2021/08/image-1-300x64.png 300w" sizes="auto, (max-width: 764px) 100vw, 764px" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再輸入Chinses，安裝完後重新開啟Sublime即可。&lt;figure class="wp-block-image size-full"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" decoding="async" width="995" height="344" src="https://quietbo.com/uploads/2021/08/image.png" alt="" class="wp-image-494" srcset="https://quietbo.com/uploads/2021/08/image.png 995w, https://quietbo.com/uploads/2021/08/image-300x104.png 300w, https://quietbo.com/uploads/2021/08/image-768x266.png 768w" sizes="auto, (max-width: 995px) 100vw, 995px" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image size-large"&gt;&lt;img loading="lazy" decoding="async" width="1024" height="393" src="https://quietbo.com/uploads/2021/08/image-2-1024x393.png" alt="" class="wp-image-496" srcset="https://quietbo.com/uploads/2021/08/image-2-1024x393.png 1024w, https://quietbo.com/uploads/2021/08/image-2-300x115.png 300w, https://quietbo.com/uploads/2021/08/image-2-768x295.png 768w, https://quietbo.com/uploads/2021/08/image-2.png 1084w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="設置默認語法"&gt;設置默認語法
&lt;/h2&gt;&lt;p&gt;在Sublime Text 3中設置默認語法顯示，未來若再開啟文件的話會以該格式的語法顯示。&lt;/p&gt;
&lt;p&gt;View(檢視) -&amp;gt; Syntax(語法) -&amp;gt; Open all with current extension as … -&amp;gt; 選擇自己要的語法。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/meLD8TJ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[安裝]Python 2.7以及Python virtualenv</title><link>https://quietbo.com/2021/03/24/python-2-7%E4%BB%A5%E5%8F%8Apython-virtual-environment-%E5%AE%89%E8%A3%9D/</link><pubDate>Wed, 24 Mar 2021 10:51:20 +0000</pubDate><guid>https://quietbo.com/2021/03/24/python-2-7%E4%BB%A5%E5%8F%8Apython-virtual-environment-%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;因ubuntu從18.04開始，內建的python版本都是為3.6以上 (舊的內建2.7)，所以要手動輸入版本號&lt;/p&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/03/24/python-2-7%e4%bb%a5%e5%8f%8apython-virtual-environment-%e5%ae%89%e8%a3%9d/#%E5%AE%89%E8%A3%9Dpython27" &gt;安裝python2.7&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/03/24/python-2-7%e4%bb%a5%e5%8f%8apython-virtual-environment-%e5%ae%89%e8%a3%9d/#%E5%AE%89%E8%A3%9Dpip%E5%A5%97%E4%BB%B6" &gt;安裝pip套件&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/03/24/python-2-7%e4%bb%a5%e5%8f%8apython-virtual-environment-%e5%ae%89%e8%a3%9d/#%E4%BD%BF%E7%94%A8pip%E5%AE%89%E8%A3%9Dvirtualenv" &gt;使用pip安裝virtualenv&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/03/24/python-2-7%e4%bb%a5%e5%8f%8apython-virtual-environment-%e5%ae%89%e8%a3%9d/#%E7%82%BAvirtualenv%E8%A3%BD%E4%BD%9C%E5%88%A5%E5%90%8D" &gt;為virtualenv製作別名&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="安裝python27"&gt;&lt;span class="ez-toc-section" id="%E5%AE%89%E8%A3%9Dpython27"&gt;&lt;/span&gt;安裝python2.7&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;sudo apt update
sudo apt install python2.7 -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檢查一下python2.7版本:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;python2.7 -V&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/w4o7c6Q.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="安裝pip套件"&gt;&lt;span class="ez-toc-section" id="%E5%AE%89%E8%A3%9Dpip%E5%A5%97%E4%BB%B6"&gt;&lt;/span&gt;安裝pip套件&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;這邊的作法是下載&lt;code&gt;get-pip.py&lt;/code&gt;來安裝。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;:&lt;br&gt;
第3行的URL不一定是最新的，若有跳出錯誤訊息是URL找不到，請自行更換成錯誤訊息跳出的URL。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;cd ~
cd 下載
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python2.7 get-pip.py &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若安裝成功，最後會看到這個訊息:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/UIkuliG.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;(可略過不做)&lt;br&gt;
為使用pip套件建立別名:&lt;br&gt;
後面的指令pip2請自行改成&lt;code&gt;python2.7 -m pip&lt;/code&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;cd ~
touch .bash_aliases
echo "alias pip2='python2.7 -m pip'" &amp;gt;&amp;gt; .bash_aliases
source .bash_aliases
pip2 -V&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸出結果:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;pip 20.3.4 from /home/ubuntu/.local/lib/python2.7/site-packages/pip (python 2.7)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="使用pip安裝virtualenv"&gt;&lt;span class="ez-toc-section" id="%E4%BD%BF%E7%94%A8pip%E5%AE%89%E8%A3%9Dvirtualenv"&gt;&lt;/span&gt;使用pip安裝virtualenv&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;日後為每個專案製作一個專屬的python environment&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;pip2 install virtualenv
# 等同於 python2.7 -m pip install virtualenv&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/u9rTOFG.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="為virtualenv製作別名"&gt;&lt;span class="ez-toc-section" id="%E7%82%BAvirtualenv%E8%A3%BD%E4%BD%9C%E5%88%A5%E5%90%8D"&gt;&lt;/span&gt;為virtualenv製作別名&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;這是因為如果安裝其他python版本的virtualenv，用別名來區分使用的版本。&lt;strong&gt;也可以略過，後續指令virtialenv2.7自行替換成virtualenv&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;echo "alias virtualenv2.7='python2.7 -m virtualenv'" &amp;gt;&amp;gt; ~/.bash_aliases
source .bash_aliases
# 測試一下
virtualenv2.7 --version
# 輸出結果
# virtualenv 20.4.3 from /home/ubuntu/.local/lib/python2.7/site-packages/virtualenv/__init__.pyc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;製作一個test_venv專屬的python environment。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;mkdir python27_venv
cd python27_venv
virtualenv2.7 test_venv # 方法1:有製作別名(上方操作)才可使用此方法
python27_venv python2.7 -m virtualenv test_venv # 方法2&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/IBxbyKT.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;創建完後進入虛擬環境:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;source ~/python27_venv/test_venv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;# 命令列多出前綴(test_venv)。表示已經啟用此虛擬環境
(test_venv)$ python -V
Python 2.7.17 # 輸出結果
(test_venv)$ pip list

(test_venv)$ deactivate # 離開虛擬環境

# 前綴消失，表示已經關閉虛擬環境&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/YhCSlD5.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/xuP235Q.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[MySQL] 快速安裝</title><link>https://quietbo.com/2021/03/24/mysql-%E5%AE%89%E8%A3%9D/</link><pubDate>Wed, 24 Mar 2021 09:14:15 +0000</pubDate><guid>https://quietbo.com/2021/03/24/mysql-%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;apt套件管理器安裝:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo apt update
sudo apt install mysql-server -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安裝完應會自動啟動:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/SE8x1aZ.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;檢查redis服務狀態:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service mysql status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;停止redis server:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service mysql stop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動redis server:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service mysql start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;進入Mysql:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;mysql -u root -p&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/WeiyuQw.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;若出現則登入成功。&lt;br&gt;
mysql&amp;gt;&lt;/p&gt;</description></item><item><title>[Redis]安裝</title><link>https://quietbo.com/2021/03/24/redis-server-%E5%AE%89%E8%A3%9D/</link><pubDate>Wed, 24 Mar 2021 08:00:54 +0000</pubDate><guid>https://quietbo.com/2021/03/24/redis-server-%E5%AE%89%E8%A3%9D/</guid><description>&lt;p&gt;利用apt套件管理器安裝:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;sudo apt update
sudo apt install redis-server -y&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;檢查redis服務狀態:&lt;br&gt;
安裝完應會自動啟動。開啟會出現綠色字active(running)&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/bSzwVOX.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;檢查服務狀態:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service redis-server status &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;停止redis server:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service redis-server stop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動redis server:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;service redis-server start&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟動redis服務器:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;redis-cli&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/KUEm3J5.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Linux]背景執行py方法</title><link>https://quietbo.com/2021/03/10/ubuntu%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8Cpy%E6%96%B9%E6%B3%95/</link><pubDate>Wed, 10 Mar 2021 10:33:33 +0000</pubDate><guid>https://quietbo.com/2021/03/10/ubuntu%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8Cpy%E6%96%B9%E6%B3%95/</guid><description>&lt;p&gt;2022/07/06 – 新增&lt;a href="https://quietbo.com/2022/07/06/python-%e8%83%8c%e6%99%af%e5%9f%b7%e8%a1%8cnohup-%e8%88%87-nohup-out/?preview_id=847&amp;preview_nonce=4fb57ac562&amp;preview=true" data-type="URL" data-id="https://quietbo.com/2022/07/06/python-%e8%83%8c%e6%99%af%e5%9f%b7%e8%a1%8cnohup-%e8%88%87-nohup-out/?preview_id=847&amp;preview_nonce=4fb57ac562&amp;preview=true" target="_blank" rel="noreferrer noopener"&gt;[Python] 背景執行nohup, &amp;amp; 與 nohup.out&lt;/a&gt;&lt;/p&gt;
&lt;hr class="wp-block-separator has-alpha-channel-opacity" /&gt;
&lt;p&gt;主要介紹在linux下使用Terminal來背景執行python的幾種方式，&lt;br&gt;
執行3隻python檔，每5秒、10秒、15秒各別顯示當前時間。&lt;/p&gt;
&lt;p&gt;以下為python範例:&lt;br&gt;
test.py、test2.py、test3.py這三隻同時使用背景來執行的畫面。&lt;/p&gt;
&lt;p&gt;執行test.py後，會顯示跳出PID為25270。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8
from datetime import datetime
from time import sleep

while(1):
 count = 1
 sleep(5)
 print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想讓程式跑在背景，在結尾的地方加個&amp;amp;&lt;br&gt;
python 背景執行指令如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;python 程式碼名稱 &amp;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/26SgbQS.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再執行一隻test2.py，不會讓原本的test.py停住，仍在背景繼續執行，並且顯示test2.py新的PID。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8
from datetime import datetime
from time import sleep

while(1):
 count = 2
 sleep(10)
 print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/qs2nJvo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;再執行test3.py。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;# coding:utf-8
from datetime import datetime
from time import sleep

while(1):
 count = 3
 sleep(15)
 print(str(count) + " : " + str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/vemyMSe.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查詢背景運行的程式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;ps -ef&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/IczNFtg.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;想停止某隻程式的話，輸入下方指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;kill PID&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖為停止第一支test.py的程式。&lt;/p&gt;
&lt;img decoding="async" src="https://i.imgur.com/XGJJtqK.png" alt="" /&gt; 
kill掉後原本的Terminal會出現已終止的程式名稱。 
&lt;img decoding="async" src="https://i.imgur.com/1If2w51.png" alt="" /&gt; 
原本的test2.py和test3.py還會繼續執行。 
&lt;img decoding="async" src="https://i.imgur.com/ucgmhz8.png" alt="" /&gt;</description></item><item><title>HTML -標記的語法規範與結構</title><link>https://quietbo.com/2021/03/07/html-%E6%A8%99%E8%A8%98%E7%9A%84%E8%AA%9E%E6%B3%95%E8%A6%8F%E7%AF%84%E8%88%87%E7%B5%90%E6%A7%8B/</link><pubDate>Sun, 07 Mar 2021 08:57:00 +0000</pubDate><guid>https://quietbo.com/2021/03/07/html-%E6%A8%99%E8%A8%98%E7%9A%84%E8%AA%9E%E6%B3%95%E8%A6%8F%E7%AF%84%E8%88%87%E7%B5%90%E6%A7%8B/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E8%AA%9E%E6%B3%95" &gt;語法&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E5%96%AE%E6%A8%99%E8%A8%98" &gt;單標記&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E9%9B%99%E6%A8%99%E8%A8%98" &gt;雙標記&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%A8%99%E8%A8%98%E7%9A%84%E5%B5%8C%E5%A5%97" &gt;標記的嵌套&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%A8%99%E8%A8%98%E7%9A%84%E5%B1%AC%E6%80%A7_%E5%92%8C_%E5%80%BC" &gt;標記的屬性 和 值&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-6&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#HTML%E6%96%87%E6%AA%94%E7%B5%90%E6%A7%8B&amp;quot; &amp;gt;HTML文檔結構&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-3' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-7&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#HTML%E9%A0%81%E9%9D%A2&amp;quot; &amp;gt;HTML頁面&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-4' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-8&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E7%B6%B2%E9%A0%81%E9%A0%AD%E9%83%A8%E4%BF%A1%E6%81%AF&amp;quot; &amp;gt;網頁頭部信息&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-9&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E7%B6%B2%E9%A0%81%E7%9A%84%E4%B8%BB%E9%AB%94&amp;quot; &amp;gt;網頁的主體&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-10&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;/li&amp;gt;
 
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-11&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#HTML%E6%A8%99%E8%A8%98&amp;quot; &amp;gt;HTML標記&amp;lt;/a&amp;gt;&amp;lt;ul class='ez-toc-list-level-4' &amp;gt;
 &amp;lt;li class='ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-12&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%96%87%E6%9C%AC&amp;quot; &amp;gt;文本&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-13&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%96%87%E6%9C%AC%E6%A8%A3%E5%BC%8F%E6%A8%99%E8%A8%98&amp;quot; &amp;gt;文本樣式標記&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-14&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%A8%99%E9%A1%8C%E6%A8%99%E8%A8%98&amp;quot; &amp;gt;標題標記&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-15&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%AE%B5%E8%90%BD%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;段落元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-16&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%8F%9B%E8%A1%8C%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;換行元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-17&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E6%B0%B4%E5%B9%B3%E7%B7%9A%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;水平線元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-18&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E5%88%86%E5%8D%80%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;分區元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-4'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-19&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/07/html-%e6%a8%99%e8%a8%98%e7%9a%84%e8%aa%9e%e6%b3%95%e8%a6%8f%e7%af%84%e8%88%87%e7%b5%90%e6%a7%8b/#%E8%A1%8C%E5%85%A7%E5%85%83%E7%B4%A0%E8%88%87%E5%A1%8A%E7%B4%9A%E5%85%83%E7%B4%A0&amp;quot; &amp;gt;行內元素與塊級元素&amp;lt;/a&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
 &amp;lt;/li&amp;gt;
 &amp;lt;/ul&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="語法"&gt;&lt;span class="ez-toc-section" id="%E8%AA%9E%E6%B3%95"&gt;&lt;/span&gt;語法&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;h3 id="單標記"&gt;&lt;span class="ez-toc-section" id="%E5%96%AE%E6%A8%99%E8%A8%98"&gt;&lt;/span&gt;單標記&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;只有一個標記，既能表示開始，也能表示結束&lt;br&gt;
語法：&amp;lt;標記&amp;gt; 或 &amp;lt;標記/&amp;gt;&lt;br&gt;
ex:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;br&amp;gt; 或 &amp;lt;br/&amp;gt; 換行
&amp;lt;hr&amp;gt; 或 &amp;lt;hr/&amp;gt; 一條水平線
&amp;lt;img&amp;gt; 或 &amp;lt;img/&amp;gt; 圖片
&amp;lt;input&amp;gt; 或 &amp;lt;input/&amp;gt; 表單控件&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;單標記是沒有內容文字的，所以沒有&lt;code&gt;&amp;lt;/img&amp;gt;&lt;/code&gt;，建議寫成&lt;code&gt;&amp;lt;img /&amp;gt;&lt;/code&gt;，&lt;br&gt;
在&amp;gt;前加上一個”/”，這樣的話就可以很清楚的看見這個元素的結束。&lt;/p&gt;
&lt;h3 id="雙標記"&gt;&lt;span class="ez-toc-section" id="%E9%9B%99%E6%A8%99%E8%A8%98"&gt;&lt;/span&gt;雙標記&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;雙標記，是有顯示的開始 和 結束標記組成的&lt;br&gt;
&amp;lt;標記&amp;gt;內容&lt;br&gt;
ex:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;b&amp;gt;普通文本&amp;lt;/b&amp;gt;
&amp;lt;s&amp;gt;文本內容&amp;lt;/s&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有開始，必須有結束，否則會產生意想不到的效果&lt;/p&gt;
&lt;h3 id="標記的嵌套"&gt;&lt;span class="ez-toc-section" id="%E6%A8%99%E8%A8%98%E7%9A%84%E5%B5%8C%E5%A5%97"&gt;&lt;/span&gt;標記的嵌套&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;在一對標記中，又出現了其他的標記，相當於就是功能的嵌套&lt;/p&gt;
&lt;p&gt;標記嵌套時一定要注意格式問題：&lt;br&gt;
ex:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;s&amp;gt;&amp;lt;b&amp;gt;文本內容&amp;lt;/b&amp;gt;&amp;lt;/s&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;被嵌套的內容一定要加 縮進&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;s&amp;gt;
 &amp;lt;b&amp;gt;文本內容&amp;lt;/b&amp;gt;
&amp;lt;/s&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="標記的屬性-和-值"&gt;&lt;span class="ez-toc-section" id="%E6%A8%99%E8%A8%98%E7%9A%84%E5%B1%AC%E6%80%A7_%E5%92%8C_%E5%80%BC"&gt;&lt;/span&gt;標記的屬性 和 值&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;在標記中，屬性是用來修飾標記的顯示效果的。&lt;/p&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 屬性必須聲明在開始元素中&lt;br /&gt;&lt;元素 屬性聲明位置處&gt;&lt;br /&gt;&lt;元素 屬性聲明位置處&gt;
 &lt;/li&gt;
 &lt;li&gt;
 屬性 和 元素之間，用空格隔開&lt;br /&gt;&lt;元素 屬性聲明位置處&gt;&lt;br /&gt;&lt;元素 屬性聲明位置處&gt;
 &lt;/li&gt;
 &lt;li&gt;
 屬性 和 值之間使用 = 連接，值要用&amp;#8221;或&amp;#8221;&amp;#8221;引起來&lt;br /&gt;&lt;元素 屬性=&amp;#8221;值&amp;#8221;&gt;
 &lt;/li&gt;
 &lt;li&gt;
 一個元素允許設置多個屬性，並且排名不分先後，&lt;br /&gt;多屬性間用 空格 隔開&lt;br /&gt;&lt;元素 屬性1=&amp;#8221;值1&amp;#8243; 屬性2=&amp;#8221;值2&amp;#8243;&gt;
 &lt;/li&gt;
 &lt;li&gt;
 HTML中的註釋
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;!-- 這是註釋內容
這也是註釋內容
--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 注意：
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;註釋不能出現在&amp;lt;&amp;gt;中
&amp;lt;p&amp;lt;!-- --&amp;gt;&amp;gt;&amp;lt;/p&amp;gt;

註釋不能嵌套
&amp;lt;!--
這是一段註釋
&amp;lt;!--
這又是一段註釋
--&amp;gt;
--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="html文檔結構"&gt;&lt;span class="ez-toc-section" id="HTML%E6%96%87%E6%AA%94%E7%B5%90%E6%A7%8B"&gt;&lt;/span&gt;HTML文檔結構&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;h3 id="html頁面"&gt;&lt;span class="ez-toc-section" id="HTML%E9%A0%81%E9%9D%A2"&gt;&lt;/span&gt;HTML頁面&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;在 文檔類型聲明 之下，使用一對 根標記來表示頁面&lt;br&gt;
html根標記包含兩對子標記：&lt;/p&gt;
&lt;h4 id="網頁頭部信息"&gt;&lt;span class="ez-toc-section" id="%E7%B6%B2%E9%A0%81%E9%A0%AD%E9%83%A8%E4%BF%A1%E6%81%AF"&gt;&lt;/span&gt;網頁頭部信息&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="網頁的主體"&gt;&lt;span class="ez-toc-section" id="%E7%B6%B2%E9%A0%81%E7%9A%84%E4%B8%BB%E9%AB%94"&gt;&lt;/span&gt;網頁的主體&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;顯示給用戶看的內容，是最長編寫的地方。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="元素"&gt;&lt;span class="ez-toc-section" id="%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 標題內容
 &lt;/li&gt;
 &lt;li&gt;
 指定網頁內容的編碼格式
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;meta charset="utf-8&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 指定網頁的關鍵字 &amp;#8211; 面向搜索引擎
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;meta name="keywords" content="關鍵字1,關鍵字2,關鍵字3"&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 指定網頁的描述文本 &amp;#8211; 面向搜索引擎
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;meta name="description" content="... ..."&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="html標記"&gt;&lt;span class="ez-toc-section" id="HTML%E6%A8%99%E8%A8%98"&gt;&lt;/span&gt;HTML標記&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;h4 id="文本"&gt;&lt;span class="ez-toc-section" id="%E6%96%87%E6%9C%AC"&gt;&lt;/span&gt;文本&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;HTML中的特殊字符&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;nbsp; 表示一個空格
&amp;lt; 表示一個 &amp;lt;
&amp;gt; 表示一個 &amp;gt;
&amp;copy; 表示一個 c （copyright）
&amp;yen; 表示 ￥&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id="文本樣式標記"&gt;&lt;span class="ez-toc-section" id="%E6%96%87%E6%9C%AC%E6%A8%A3%E5%BC%8F%E6%A8%99%E8%A8%98"&gt;&lt;/span&gt;文本樣式標記&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;改變文本在網頁中的表現形式&lt;br&gt;
特點：以下標記允許與其他文本內容在一行內顯示。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt; : 斜體
&amp;lt;u&amp;gt;&amp;lt;/u&amp;gt; : 下劃線
&amp;lt;s&amp;gt;&amp;lt;/s&amp;gt; : 刪除線
&amp;lt;b&amp;gt;&amp;lt;/b&amp;gt; : 加粗顯示
&amp;lt;sup&amp;gt;&amp;lt;/sup&amp;gt; : 上標
&amp;lt;sub&amp;gt;&amp;lt;/sub&amp;gt; : 下標&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;`&lt;/p&gt;
&lt;h4 id="標題標記"&gt;&lt;span class="ez-toc-section" id="%E6%A8%99%E9%A1%8C%E6%A8%99%E8%A8%98"&gt;&lt;/span&gt;標題標記&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 改變文字大小以及加粗效果
 &lt;/li&gt;
 &lt;li&gt;
 每個標題都具備垂直的空白距離
 &lt;/li&gt;
 &lt;li&gt;
 每個標題獨占一行
 &lt;/li&gt;
 &lt;li&gt;
 每個標題都有一個屬性&lt;br /&gt;屬性：align&lt;br /&gt;取值：left / center / right
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;h1&amp;gt;&amp;lt;/h1&amp;gt; : 一級標題，文字最大
&amp;lt;h6&amp;gt;&amp;lt;/h6&amp;gt; : 六級標題，文字最小
&amp;lt;h1 align="left"&amp;gt;標題H1 &amp;lt;/h1&amp;gt;
&amp;lt;h2 align="left"&amp;gt;標題H2 &amp;lt;/h2&amp;gt;
&amp;lt;h3 align="center"&amp;gt;標題H3 &amp;lt;/h3&amp;gt;
&amp;lt;h4 align="center"&amp;gt;標題H4 &amp;lt;/h4&amp;gt;
&amp;lt;h5 align="right"&amp;gt;標題H5 &amp;lt;/h5&amp;gt;
&amp;lt;h6 align="right"&amp;gt;標題H6 &amp;lt;/h6&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/hIgtlI5.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h4 id="段落元素"&gt;&lt;span class="ez-toc-section" id="%E6%AE%B5%E8%90%BD%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;段落元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;突出顯示一段文本&lt;br&gt;
獨占一行&lt;br&gt;
每個元素都具備垂直空白距離&lt;br&gt;
屬性：align&lt;br&gt;
取值：left / center / right&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;p align="left"&amp;gt;left&amp;lt;/p&amp;gt;
&amp;lt;p align="center"&amp;gt;center&amp;lt;/p&amp;gt;
&amp;lt;p align="right"&amp;gt;right&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/tpjV6iK.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h4 id="換行元素"&gt;&lt;span class="ez-toc-section" id="%E6%8F%9B%E8%A1%8C%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;換行元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="水平線元素"&gt;&lt;span class="ez-toc-section" id="%E6%B0%B4%E5%B9%B3%E7%B7%9A%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;水平線元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;&amp;lt;hr&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="分區元素"&gt;&lt;span class="ez-toc-section" id="%E5%88%86%E5%8D%80%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;分區元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 塊分區元素&lt;br /&gt;作用：佈局&lt;br /&gt;獨占一行&lt;br /&gt;&lt;code&gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;br /&gt;屬性：align (left / center / right)
 &lt;/li&gt;
 &lt;li&gt;
 行內分區元素&lt;br /&gt;設置同一行文本的不同樣式。&lt;br /&gt;能在一行中顯示多個。&lt;br /&gt;&lt;code&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="行內元素與塊級元素"&gt;&lt;span class="ez-toc-section" id="%E8%A1%8C%E5%85%A7%E5%85%83%E7%B4%A0%E8%88%87%E5%A1%8A%E7%B4%9A%E5%85%83%E7%B4%A0"&gt;&lt;/span&gt;行內元素與塊級元素&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h4&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 按照元素不同的表現形式，對元素進行的一個類別的劃分。
 &lt;/li&gt;
 &lt;li&gt;
 塊級元素&lt;br /&gt;在網頁中能夠獨占一行的元素都是塊級元素&lt;br /&gt;p,div,h1~h6&lt;br /&gt;以上元素都有align屬性
 &lt;/li&gt;
 &lt;li&gt;
 行內元素&lt;br /&gt;多個元素能夠在一行內顯示的，都是行內元素&lt;br /&gt;span,i,b,s,u,sub,sup
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;u&amp;gt;xxxx&amp;lt;/u&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/AWCRM1b.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>HTML、CSS、JavaScript 簡易介紹</title><link>https://quietbo.com/2021/03/05/html%E3%80%81css%E3%80%81javascript-%E7%B0%A1%E6%98%93%E4%BB%8B%E7%B4%B9/</link><pubDate>Fri, 05 Mar 2021 06:55:55 +0000</pubDate><guid>https://quietbo.com/2021/03/05/html%E3%80%81css%E3%80%81javascript-%E7%B0%A1%E6%98%93%E4%BB%8B%E7%B4%B9/</guid><description>&lt;p&gt;寫網頁時常聽到的三大名稱:&lt;/p&gt;
&lt;blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"&gt;
 &lt;p&gt;
 簡單來說:&lt;br /&gt;html是網頁的結構，CSS是網頁的樣式，JavaScript是網頁的行為。
 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 HTML 網頁的結構，看起來都方方正正。
 &lt;/li&gt;
 &lt;li&gt;
 CSS 把外貌給顯示出來，讓網頁的外貌看起來美觀一些
 &lt;/li&gt;
 &lt;li&gt;
 JavaScript 控制網頁裡面的內容以及使用者的操作行為
 &lt;/li&gt;
&lt;/ul&gt;
&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#HTML_%E5%9F%BA%E6%9C%AC%E8%A7%80%E5%BF%B5" &gt;HTML 基本觀念&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#%E5%B7%A2%E7%8B%80%E7%B5%90%E6%A7%8B" &gt;巢狀結構&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#%E5%85%83%E7%B4%A0element" &gt;元素(element)&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#%E5%B1%AC%E6%80%A7attribute" &gt;屬性(attribute)&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-5&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#CSS&amp;quot; &amp;gt;CSS&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-6&amp;quot; href=&amp;quot;https://quietbo.com/2021/03/05/html%e3%80%81css%e3%80%81javascript-%e7%b0%a1%e6%98%93%e4%bb%8b%e7%b4%b9/#JavaScript_%E2%80%93_JS&amp;quot; &amp;gt;JavaScript &amp;amp;#8211; JS&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="html-基本觀念"&gt;&lt;span class="ez-toc-section" id="HTML_%E5%9F%BA%E6%9C%AC%E8%A7%80%E5%BF%B5"&gt;&lt;/span&gt;HTML 基本觀念&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 巢狀結構
 &lt;/li&gt;
 &lt;li&gt;
 元素(element)
 &lt;/li&gt;
 &lt;li&gt;
 屬性(attribute)&lt;br /&gt;使用文本編輯軟件即可做開發，以 .html 或 .htm 為結尾的文件，最後使用瀏覽器開啟檔案即可顯示。
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="巢狀結構"&gt;&lt;span class="ez-toc-section" id="%E5%B7%A2%E7%8B%80%E7%B5%90%E6%A7%8B"&gt;&lt;/span&gt;巢狀結構&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;簡單來說就是一層一層的概念&lt;br&gt;
範例:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="markup" class="language-markup"&gt;&amp;lt;html&amp;gt;
 &amp;lt;head&amp;gt;
 &amp;lt;title&amp;gt;Title&amp;lt;/title&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
 &amp;lt;h1&amp;gt;標題H1 &amp;lt;/h1&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因為巢狀結構有分層級，上層稱為&lt;code&gt;父元素&lt;/code&gt;，下層稱為&lt;code&gt;子元素&lt;/code&gt;。&lt;br&gt;
而層級之間有一定上下、左右的規則，會透過&lt;code&gt;Document Object Model (DOM)&lt;/code&gt;來進行遍歷的順序。&lt;/p&gt;
&lt;h3 id="元素element"&gt;&lt;span class="ez-toc-section" id="%E5%85%83%E7%B4%A0element"&gt;&lt;/span&gt;元素(element)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;使用過程中，需要用 &amp;lt;&amp;gt; 括起來。&lt;br&gt;
&lt;a class="link" href="https://developer.mozilla.org/zh-TW/docs/Web/HTML/Element" target="_blank" rel="noopener"
 &gt;HTML元素網址&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="屬性attribute"&gt;&lt;span class="ez-toc-section" id="%E5%B1%AC%E6%80%A7attribute"&gt;&lt;/span&gt;屬性(attribute)&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;可以藉由各種方式去設定元素或調整它們的行為。&lt;br&gt;
簡單來說，除了最開頭的元素以外，中間都是屬性。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://developer.mozilla.org/zh-TW/docs/Web/HTML/Attributes" target="_blank" rel="noopener"
 &gt;HTML屬性網址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="css"&gt;&lt;span class="ez-toc-section" id="CSS"&gt;&lt;/span&gt;CSS&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;CSS就是管理網頁的外貌。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="css" class="language-css"&gt;.mainBody{
 min-width: 1024px;
 width: 100%;
 height: 100%;
}
.mainBody .logo{
 height: 45px;
 line-height: 45px;
 background-color: #214D8A;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="javascript-8211-js"&gt;&lt;span class="ez-toc-section" id="JavaScript_%E2%80%93_JS"&gt;&lt;/span&gt;JavaScript – JS&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;JavaScript 就是管理網頁的內容以及使用者的操作行為，為了要控制網頁的內容。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="javascript" class="language-javascript"&gt;&amp;lt;script&amp;gt;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就是實做JavaScript的地方。&lt;/p&gt;</description></item><item><title>[Git] 常用指令</title><link>https://quietbo.com/2021/03/02/git-%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/</link><pubDate>Tue, 02 Mar 2021 07:22:36 +0000</pubDate><guid>https://quietbo.com/2021/03/02/git-%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/</guid><description>&lt;p&gt;git checkout # 有兩個功能，一個是branch, HASH 間的切換，另外一個則是工作區檔案的還原。&lt;br&gt;
git checkout . # 還原所有檔案&lt;br&gt;
git checkout app.html # 還原一個檔案&lt;/p&gt;
&lt;p&gt;git remote update # 檢查遠端是否有更新&lt;br&gt;
git branch # 檢查local分支&lt;br&gt;
git branch -a # 檢查雲端最新分支&lt;/p&gt;
&lt;p&gt;git stash # 備份當前的工作區&lt;br&gt;
git stash save abcd # 將當前修改的檔案暫存起來並命名為abcd&lt;br&gt;
git stash list # 顯示git內的所有備份，可以利用這個列表來決定從那個地方恢復。&lt;br&gt;
git stash apply stash@{0} # 把Stash撿回來用&lt;br&gt;
git stash drop stash@{0} # 從列表裡刪掉暫存的Stash了&lt;br&gt;
git stash clear # 刪除所有暫存的操作&lt;/p&gt;
&lt;p&gt;git reset –hard # 回復到最新提交版本&lt;br&gt;
git reset e1d58ef^ # 拆掉commit的版本&lt;/p&gt;
&lt;p&gt;git add -u # 加入所有被更動的檔案（包含 modified 及 deleted）&lt;br&gt;
git log # 查看提交歷史紀錄&lt;/p&gt;
&lt;p&gt;git pull origin # 從遠端更新&lt;/p&gt;
&lt;p&gt;git push origin my-tag # push 指定標籤 (多個標籤以空白隔開)&lt;br&gt;
git push –tags # push 所有 tag&lt;/p&gt;
&lt;p&gt;git diff # 檢查修改內容&lt;br&gt;
git remote -v # 查詢遠端pull、push路徑&lt;/p&gt;
&lt;h2 id="tag相關"&gt;tag相關
&lt;/h2&gt;&lt;p&gt;git tag -l # 查詢所有tag名稱&lt;br&gt;
git tag -a test_tag -m “” # 新增一個名為test_tag的tag&lt;br&gt;
git push origin test_tag # push 指定標籤 (多個標籤以空白隔開)&lt;/p&gt;
&lt;p&gt;git push origin –tag # push 所有 tag&lt;/p&gt;
&lt;p&gt;git push –tags # push 所有 tag&lt;/p&gt;</description></item><item><title>Line bot – 創建Line bot帳號</title><link>https://quietbo.com/2021/03/01/%E5%BE%9E%E9%9B%B6%E9%96%8B%E5%A7%8B%E5%AF%ABline-bot/</link><pubDate>Mon, 01 Mar 2021 15:13:05 +0000</pubDate><guid>https://quietbo.com/2021/03/01/%E5%BE%9E%E9%9B%B6%E9%96%8B%E5%A7%8B%E5%AF%ABline-bot/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#%E5%BB%BA%E7%AB%8BHeroku" &gt;建立Heroku&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#%E5%BB%BA%E7%AB%8B_%E5%B1%AC%E6%96%BC%E8%87%AA%E5%B7%B1%E7%9A%84Line_Bot" &gt;建立 屬於自己的Line Bot&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#%E5%B0%87%E5%89%B5%E5%BB%BA%E5%A5%BD%E7%9A%84Line_Bot%E8%88%87Heroku%E9%80%B2%E8%A1%8C%E4%B8%B2%E6%8E%A5" &gt;將創建好的Line Bot與Heroku進行串接&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#%E7%B7%A8%E8%BC%AF%E7%A8%8B%E5%BC%8F" &gt;編輯程式&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-5" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#%E5%B0%87%E4%BB%A3%E7%A2%BC%E5%82%B3%E9%80%81%E5%88%B0Heroku%E4%B8%8A" &gt;將代碼傳送到Heroku上&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-6" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#Git_%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%E4%BB%A5%E5%8F%8APush_Hearoku" &gt;Git 基本設定以及Push Hearoku&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-7" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#Line_Bot_%E8%88%87_Hearoku_%E7%B6%81%E5%AE%9A" &gt;Line Bot 與 Hearoku 綁定&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-1'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-8" href="https://quietbo.com/2021/03/01/%e5%be%9e%e9%9b%b6%e9%96%8b%e5%a7%8b%e5%af%abline-bot/#clone_heroku_%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%A2%BC" &gt;clone heroku 的程式碼&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h1 id="建立heroku"&gt;&lt;span class="ez-toc-section" id="%E5%BB%BA%E7%AB%8BHeroku"&gt;&lt;/span&gt;建立Heroku&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;首先進到Heroku的帳戶，登入會看到這個畫面&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/VBueQlY.png" alt="" /&gt;&lt;/p&gt;
&lt;p class="has-normal-font-size"&gt;
 &lt;code&gt;Create new app&lt;/code&gt;，創建名字&lt;br /&gt;&lt;img decoding="async" src="https://i.imgur.com/Wrp2hxJ.png" alt="" /&gt;
&lt;/p&gt;
&lt;h1 id="建立-屬於自己的line-bot"&gt;&lt;span class="ez-toc-section" id="%E5%BB%BA%E7%AB%8B_%E5%B1%AC%E6%96%BC%E8%87%AA%E5%B7%B1%E7%9A%84Line_Bot"&gt;&lt;/span&gt;建立 屬於自己的Line Bot&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://developers.line.biz/console/" target="_blank" rel="noopener"
 &gt;&lt;/a&gt;&lt;a href="https://developers.line.biz/console/" data-type="URL" data-id="https://developers.line.biz/console/" target="_blank" rel="noreferrer noopener"&gt;developers網址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登入後長下面這樣，點選Create a new provider&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/JuzP1Rg.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;請輸入一個Providers的名稱之後，點擊Create&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/E76NAYa.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;左上角是名字，選擇 Create a Messaging API channel&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/soffcDy.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/Mt2f6LL.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;Channel name
Channel description
Category
Subcategory
Email address&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上這些填一填，最下方打勾&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/abeUwX2.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;創建完成!&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/DLg4kwQ.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="將創建好的line-bot與heroku進行串接"&gt;&lt;span class="ez-toc-section" id="%E5%B0%87%E5%89%B5%E5%BB%BA%E5%A5%BD%E7%9A%84Line_Bot%E8%88%87Heroku%E9%80%B2%E8%A1%8C%E4%B8%B2%E6%8E%A5"&gt;&lt;/span&gt;將創建好的Line Bot與Heroku進行串接&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;點選 Messaging API&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/S0Qspyl.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點選 Auto-reply messages 右邊的 Edit&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oenU948.png" alt="" /&gt;&lt;br&gt;
點選後會跳出一個新頁面，Webhook設置為啟用&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/5rGURpm.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;點選Channel access token 右方issue，之後會產生一串有英文數字特殊符號的字串，可以先複製起來，後續會使用到。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/GJkjMqR.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;移動到最上方，選擇Basic settings後，到Channel secret點擊issue，&lt;br&gt;
這串也會跟著改變，也要複製下來，後面會使用到。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/O6ThIT7.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="編輯程式"&gt;&lt;span class="ez-toc-section" id="%E7%B7%A8%E8%BC%AF%E7%A8%8B%E5%BC%8F"&gt;&lt;/span&gt;編輯程式&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;填入自己當時複製起來的字串。第一個最長，第二個是比較短的。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python"&gt;# Channel Access Token
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
# Channel Secret
handler = WebhookHandler('YOUR_CHANNEL_SECRET')&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="將代碼傳送到heroku上"&gt;&lt;span class="ez-toc-section" id="%E5%B0%87%E4%BB%A3%E7%A2%BC%E5%82%B3%E9%80%81%E5%88%B0Heroku%E4%B8%8A"&gt;&lt;/span&gt;將代碼傳送到Heroku上&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;到Heroku的官網，依照自己的系統來安裝套件。&lt;a class="link" href="https://devcenter.heroku.com/articles/heroku-cli" target="_blank" rel="noopener"
 &gt;Heroku官網&lt;/a&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/PpY1C7J.png" alt="" /&gt;&lt;br&gt;
安裝成功後我們來登入Heroku，輸入:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;heroku login&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會自動開啟新網頁視窗請你登入帳號密碼，下方為登入成功畫面，之後就不需要再管這個畫面了。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/dXjzRFd.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="git-基本設定以及push-hearoku"&gt;&lt;span class="ez-toc-section" id="Git_%E5%9F%BA%E6%9C%AC%E8%A8%AD%E5%AE%9A%E4%BB%A5%E5%8F%8APush_Hearoku"&gt;&lt;/span&gt;Git 基本設定以及Push Hearoku&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;查看目前的設定&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git config --list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果本來就沒有設定git，需要輸入以下指令來進行初始化:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git config –global user.name “你的名字”
git config –global user.email “你的信箱”&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在自己的專案創建一個.git檔案(該動作只需要做一次)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git init &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回到資料夾檢查看有沒有出現.git的資料夾，&lt;br&gt;
通常是被隱藏起來，想看的話要把檢視-&amp;gt;隱藏的項目打勾&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/qafdlGn.png" alt="" /&gt;&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/P8iE5aM.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;將 git 資料夾與 Heroku作為連接，這邊HEROKU_APP_NAME是要照你當時在Heroku的專案名稱一樣，&lt;br&gt;
如果不同，他則會報錯&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;heroku git:remote -a {HEROKU_APP_NAME}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下圖為錯誤訊息:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/aomEjdG.png" alt="" /&gt;&lt;br&gt;
下圖為設定成功的訊息:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/mwlCRRR.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;然後照下圖方式&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/axvyAxT.png" alt="" /&gt;&lt;br&gt;
指令如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git add .
git commit -m "你想輸入的訊息(必填)" 
git push -f heroku master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後會執行一段時間，成功如下圖&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/ndZrJNC.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="line-bot-與-hearoku-綁定"&gt;&lt;span class="ez-toc-section" id="Line_Bot_%E8%88%87_Hearoku_%E7%B6%81%E5%AE%9A"&gt;&lt;/span&gt;Line Bot 與 Hearoku 綁定&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;剛剛已經完成將程式碼PUSH到Hearoku了，現在則是讓Line Bot能夠到Hearoku去運行我們想要機器人為我們做的事情。&lt;/p&gt;
&lt;p&gt;回到LINE Developers的Messaging API，&lt;br&gt;
選擇 Webhook URL 點擊Edit 將網址貼上去，格式:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;https://{HEROKU_APP_NAME}.herokuapp.com/callback&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入完後點選Verify，成功後就會將剛剛輸入的URL存上去了。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/oWzuUvB.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;回到Heroku網站，點選Open app，跳出的新網頁就是你的專案網址。&lt;/p&gt;
&lt;p&gt;測試自己做的機器人回覆內容&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/8Qh5Qm8.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;目前機器人是看打什麼字就回復什麼內容，&lt;br&gt;
如果要關閉每次都跳出那感謝訊息，要到回到回應設定，將自動回覆訊息關閉。&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/JNwMkAj.png" alt="" /&gt;&lt;/p&gt;
&lt;h1 id="clone-heroku-的程式碼"&gt;&lt;span class="ez-toc-section" id="clone_heroku_%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%A2%BC"&gt;&lt;/span&gt;clone heroku 的程式碼&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h1&gt;&lt;p&gt;有些人開發不一定是使用同一台電腦，clone的指令如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git clone https://git.heroku.com/YOUR_HEROKU_APP_NAME.git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;YOUR_HEROKU_APP_NAME&lt;/code&gt;這串英文改成你的專案名字就可以成功clone下來了。&lt;/p&gt;</description></item><item><title>[Git] 安裝及簡單設定</title><link>https://quietbo.com/2021/02/23/git/</link><pubDate>Tue, 23 Feb 2021 10:43:38 +0000</pubDate><guid>https://quietbo.com/2021/02/23/git/</guid><description>&lt;p&gt;Linux 安裝git&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo apt-get install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;驗證git是否已安裝成功&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ which git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢git版本&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git 產生SSH Key&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;ssh-keygen&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看SSH Key&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ cat ~/.ssh/id_rsa.pub&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢目錄的狀態&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git status&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢目前的設定&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git config --list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢特定檔案的commit&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git log XXXXX.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意:需要有副檔名&lt;/p&gt;
&lt;p&gt;查看特定檔案修改什麼&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git log -p XXXXX.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;+代表新增&lt;/p&gt;
&lt;p&gt;-代表刪除&lt;/p&gt;
&lt;p&gt;SourceTree的話也可以看到:&lt;/p&gt;
&lt;p&gt;在commit時點選:Log Selected 則會另外彈出一個視窗&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Fylt22D.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;查詢”單行”代碼作者及修改時間&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git blame XXXX.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;組合內容為:&lt;/p&gt;
&lt;p&gt;commit的識別碼 、 修改人名 、修改日期及時間 該行號(上圖我僅擷取2016行~2023行)&lt;/p&gt;
&lt;p&gt;如果檔案太多行了，你只想看某而已，就加入-L 開始行號~結束行號&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git blame -L 2010,2030 XXXX.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有些檔案不想放在Git裡面&lt;/p&gt;
&lt;p&gt;先建立檔名為:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;.gitignore&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後編輯這個檔案的內容:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;#忽略 test.py 檔案
test.py

#忽略 log目錄下的所有檔案
log/*

#忽略所有附檔名是 .tmp的檔案
.tmp

#忽略所有檔名為settings的檔案
settings.*&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若不知道使用的工具或程式語言通常會忽略哪些檔案，可以至此&lt;a class="link" href="https://github.com/github/gitignore" target="_blank" rel="noopener"
 &gt;連結&lt;/a&gt;查看&lt;/p&gt;
&lt;p&gt;清出忽略&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git clean -fx&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;忽略部分補充&lt;/p&gt;
&lt;p&gt;如果要忽略的檔案在編輯.gitignore時就已經存在，需要先移出Git控管，之後就會被忽略了。&lt;/p&gt;
&lt;p&gt;舉例:在3月1號時已經將test.py加入Git控管中，在3月5號才將.gitignore內新增要將test.py忽略，但此時Git已經在控管了，所以3月5號加的忽略不會進行，必須先將目前控管中的test.py移除。&lt;/p&gt;
&lt;h6 id="救回被刪除的檔案"&gt;救回被刪除的檔案
&lt;/h6&gt;&lt;p&gt;此三個檔案被我不小心刪掉了&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Rz8vGTd.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;救回方式(等同於還原所有檔案):&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git checkout .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想救一個檔案:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git checkout S01.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SourceTree用法&lt;/p&gt;
&lt;p&gt;打開SourceTree會看到上面有被誤刪的檔案，點選最右邊的-，讓誤刪的檔案下去Unstaged files的位置。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Ec1u6hc.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;鼠標移至誤刪的檔案位置，右建點選discard(丟棄)&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/NWnqI8L.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;然後會問你:您確定要放棄對這些文件的更改嗎？&lt;/p&gt;
&lt;p&gt;意思就是⇒你不要刪除嗎&lt;/p&gt;
&lt;p&gt;按下OK!!!!完成後就會看到誤刪的檔案回來了&lt;/p&gt;
&lt;p&gt;補充&lt;/p&gt;
&lt;p&gt;並不是所有檔案都能救出來，如果.git的目錄被刪除了，代表歷史紀錄也被刪除，會救不回來。&lt;/p&gt;
&lt;p&gt;修改commit描述的訊息文字&lt;/p&gt;
&lt;p&gt;修改最後一筆&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git commit --amend -m "fix commit msg"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;退版方式&lt;/p&gt;
&lt;p&gt;先查看版本號&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git log --oneline&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/UNXTYK1.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;方法一:相對位置&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reset d7ea967^&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後加的^代表前一次的意思，所以是指da824b4的commit，如果是d7ea967^^，就是前兩個版本，如果超過5個，可以寫成d7ea967~5，畢竟太多^很容易看得眼花。&lt;/p&gt;
&lt;p&gt;相對位置也可以用另一種來表示:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reset master^&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reset HEAD^&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因為HEAD和master目前都是指向d7ea967這個commit，而且d7ea967這數字很難記，所以通常都不會用commit的英數來做，都已以上兩個方式，且都會一樣的結果。&lt;/p&gt;
&lt;p&gt;方法二:絕對位置&lt;/p&gt;
&lt;p&gt;直接指明在git log的版本號&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reset d9d68f9(版本號)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sourceTree用法&lt;/p&gt;
&lt;p&gt;回到History，點選右鍵&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/p0tUkjF.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h5 id="已經退版但想再回一開始的版本"&gt;已經退版但想再回一開始的版本
&lt;/h5&gt;&lt;p&gt;git reset HEAD~2，現在要在把他reset回到一開始(d7ea967)的commit。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reset d7ea967 --hard&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/r881Fqn.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;忘記版本的數字&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git reflog&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Oa1tiHR.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;顯示HEAD有移動時的所有位置，目前HEAD的位置就是在執行完”reset”的位置，所以可以猜測，d7ea967是在reset前的位置，&lt;/p&gt;
&lt;p&gt;Reset 的模式&lt;/p&gt;
&lt;p&gt;Reset英文單字翻譯為”重新設定”，但事實上Git的Reset指令用中文來說比較像是”前往”或”變成”的概念，事實上並沒有真的把這個commit”拆掉”(放心，所有commit都在)&lt;/p&gt;
&lt;p&gt;比較正確的解讀應該是”我要前往兩個commit之前的狀態”，因為實際上git reset指令也不是真的刪除或是重新設定，只是”前往”到指定的commit。&lt;/p&gt;
&lt;p&gt;git reset 指令可以搭配參數使用，常見的三種參數，分別:&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 mixed
 &lt;/li&gt;
 &lt;li&gt;
 soft
 &lt;/li&gt;
 &lt;li&gt;
 hard
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HEAD是什麼?&lt;/p&gt;
&lt;p&gt;HEAD 是一個指標，指向某一個分支，通常你可以把 HEAD 當做「目前所在分支」看待。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ cat .git/HEAD&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/KlJ9Qat.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;從這個檔案看起來，HEAD 目前正指向著 master 分支。&lt;/p&gt;
&lt;p&gt;如果有興趣再深入看一下 refs/heads/master 的內容就會發現，其實所謂的 Master 分支也不過就是一個 40 個字元的檔案罷了：&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/ZDlPkRN.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;切換分支，在看看HEAD檔案內容&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git checkout dog
$ git cat .git/HEAD&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/7CMHriu.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;HEAD 通常會指向目前所在的分支。不過 HEAD 也不一定總是會指向某個分支，當 HEAD 沒有指向某個分支的時候便會造成「detached HEAD」的狀態，詳情請參閱，待補。&lt;/p&gt;
&lt;p&gt;在 SourceTree 的介面裡，HEAD 是以一個「空心的小圈圈」圖示呈現&lt;/p&gt;
&lt;p&gt;在切換分支的同時，除了 HEAD 的內容會改變之外，在Reflog，當 HEAD 的內容改變的時候也會留下紀錄。&lt;/p&gt;
&lt;p&gt;分支(Branche)&lt;/p&gt;
&lt;p&gt;什麼是分支？&lt;/p&gt;
&lt;p&gt;在開發軟體時，可能同時會有多人在開發同一功能或修復錯誤，也可能會有多個發佈版本的存在，並且需要針對每個版本進行維護。&lt;/p&gt;
&lt;p&gt;為了能支援同時進行數個功能的增加或版本控制，Git具備了分支的功能。&lt;/p&gt;
&lt;p&gt;建立分支&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git branch 新的分支名稱&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查詢現在的分支&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git branch&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前方有*代表目前所在分支&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/s2izE2I.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;切換分支&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git checkout 分支名稱&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/uiPREaH.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;在 checkout 命令給定 -b 參數執行，可以同時建立分支和切換。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ git checkout -b 分支名稱&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/7Odrckh.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;rebase&lt;/p&gt;
&lt;p&gt;離開rebase&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git rebase --abort&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/R2K6gvb.png" alt="" /&gt; &lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/8sUwHTd.png" alt="" /&gt;&lt;/figure&gt; &lt;figure class="wp-block-image"&gt;&lt;img decoding="async" src="https://i.imgur.com/hFRJdTs.png" alt="" /&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;在.git目錄裡面有什麼&lt;/p&gt;
&lt;p&gt;此處先建立一個index.html檔案，再add後查看狀態。&lt;/p&gt;
&lt;p&gt;利用hash來確認該檔案的值，來對照資料夾是否有這個檔案名。&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/LO7XNbT.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;.git\objects\30&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/kALGpX9.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Git會用40個字的SHA-1值的前面2字作為目錄，剩下38字是檔案名字&lt;/p&gt;
&lt;p&gt;檢視差異&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://t.codebug.vip/questions-1743912.htm" target="_blank" rel="noopener"
 &gt;參考網址&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git difftool --dir-diff --tool=meld HEAD~ HEAD&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立一個方便的Bash函式：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;git-diff-meld() (
 git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)&lt;/code&gt;&lt;/pre&gt;</description></item><item><title/><link>https://quietbo.com/posts/2025-02-06-doris-%E6%9C%AC%E6%A9%9F%E9%83%A8%E7%BD%B2doris/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://quietbo.com/posts/2025-02-06-doris-%E6%9C%AC%E6%A9%9F%E9%83%A8%E7%BD%B2doris/</guid><description>&lt;p&gt;-&amp;ndash; title: &amp;lsquo;[Doris] 本機部署Doris&amp;rsquo; author: Bocky type: post date: 2025-02-06T10:52:03+00:00 url: /2025/02/06/doris-本機部署doris/ categories: - doris &amp;mdash;&lt;/p&gt;
&lt;p&gt;資料結構&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.
├── be_data
├── be_log
├── docker-compose.yml
├── doris-be
├── doris-fe
├── fe_data
└── fe_log
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker-compose.yml 內容:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# version: &amp;#39;3&amp;#39;
services:
 doris-fe:
 image: selectdb/doris.fe-ubuntu:2.1.6
 container_name: doris_fe
 environment:
 - FE_SERVERS=fe1:10.5.0.2:9010
 - FE_ID=1
 volumes:
 - ./fe_data:/opt/apache-doris/fe/doris-meta
 - ./fe_log:/opt/apache-doris/fe/log
 ports:
 - &amp;#34;8030:8030&amp;#34; # Web UI
 - &amp;#34;9030:9030&amp;#34; # MySQL client
 - &amp;#34;9020:9020&amp;#34; # JDBC
 networks:
 doris_net:
 ipv4_address: 10.5.0.2

 doris-be:
 image: selectdb/doris.be-ubuntu:2.1.6
 container_name: doris_be
 depends_on:
 - doris-fe
 environment:
 - FE_SERVERS=fe1:10.5.0.2:9010
 - BE_ADDR=10.5.0.3:9050
 volumes:
 - ./be_data:/opt/apache-doris/be/storage
 - ./be_log:/opt/apache-doris/be/log
 ports:
 - &amp;#34;8040:8040&amp;#34;
 networks:
 doris_net:
 ipv4_address: 10.5.0.3

networks:
 doris_net:
 driver: bridge
 ipam:
 config:
 - subnet: 10.5.0.0/24
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker-compose.yml儲存後下指令&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;運行成功後進入FE容器中：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mysql -h 127.0.0.1 -P 9030 -u root
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;-- 建立資料庫
CREATE DATABASE test_db;
USE test_db;

CREATE TABLE employees (
 emp_id INT,
 name VARCHAR(50),
 department VARCHAR(50),
 salary DECIMAL(10,2)
) ENGINE=OLAP
DUPLICATE KEY(emp_id)
DISTRIBUTED BY HASH(emp_id) BUCKETS 1
PROPERTIES (
 &amp;#34;replication_num&amp;#34; = &amp;#34;1&amp;#34;
);

--建立一筆資料
INSERT INTO employees VALUES (1001, &amp;#39;John Doe&amp;#39;, &amp;#39;IT&amp;#39;, 50000.00);
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="doris-web-ui"&gt;Doris Web UI
&lt;/h2&gt;&lt;p&gt;打瀏覽器&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;http://localhost:8030
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;User:root&lt;/p&gt;
&lt;h2 id="gui--tableplus連線doris"&gt;GUI – TablePlus連線Doris
&lt;/h2&gt;&lt;p&gt;使用TablePlus連線資訊如下： 選擇MySQL Host/IP: 127.0.0.1 Port:9030 User:root Database:test_db&lt;/p&gt;
&lt;p&gt;設置好後按Test，成功會呈現綠底 &lt;img alt="image" class="gallery-image" data-flex-basis="282px" data-flex-grow="117" height="880" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://hackmd.io/_uploads/Hk_XlGfY1x.png" srcset="https://quietbo.com/Hk_XlGfY1x_9214255126827432737_hu_e31f8206112c2436.png 800w, https://hackmd.io/_uploads/Hk_XlGfY1x.png 1034w" width="1034"&gt;&lt;/p&gt;</description></item></channel></rss>