k

kjelly

Cloud engineering, Automation, Networking, Containers, Virtualization. Python, Dart, Goalng. Ansible, Terraform OpenStack, Kubernetes OpenStack contributer.

基於目錄的環境切換工作流程

身為一個 DevOps 與 backend 工程師,需要接觸許多眾多環境。kubectl 雖然支援多個 context 。但是一次只能指向一個環境,在我需要多工時沒有很方便。 最後我是採用 direnv ,讓一個環境資訊放在一個資料夾中。當我切換到不同的資料夾時,自動使用該資料夾的環境變數,就能使用該環境。為了降低頻繁 cd 的困惱。我使用 zoxide 來快速切換目錄(環境),加快工作效率。 在操作環境時,會有一些動作是許多環境共用的,此時我會使用 https://github.com/ddanier/nur 工具。將共享的程式碼放在 nurfile (我主要用nushell),放在環境資料夾的父目錄。這樣我就可以在環境資料夾中執行各種操作,換到另外一個環境時,輸入一樣的指令也可執行相同的操作。不用一直複製或是查看歷史紀錄。 ...
Read post

使用 kaniko build oci image,整合 nushell

def kaniko-build [ dockerfile: string, context: string, image: string, ...args:string ] { let build_args = ($args | each {|it| ["--build-arg", $it]}|flatten) let dct = { "apiVersion": "v1", "spec": { "containers": [ { "name": "kaniko", "image": "gcr.io/kaniko-project/executor:latest", "stdin": true, "stdinOnce": true, "args": [ "--dockerfile=Dockerfile", "--context=tar://stdin", "--cache-dir=/workspace/cac...
Read post

基於 systemd 的背景執行程式與備忘錄的方法

我目前主要是用 nushell 。nushell 沒有原生支援 backend process有點困擾。又我又很常在 nvim terminal 下執行指令,因此能夠在背景執行又不依賴現在 termianl很重要 過去我有用 pueue 做為背景執行程式,不過使用上沒有很順手(我不喜歡每次看東西都要先查 id)。於是考慮用 systemd-run 實做一個。目前感覺起來很可以。 systemd-run 執行程式時,需要指定 unit。除非程式正常結束,否則 unit 不能重複(當然這行為是根據你參數而定,目前我是這樣使用) 以下程式碼皆是 nushell 語法 def --wrapped "run" [ --doc="", ...command ] { mut desc = ($command | str join ' ') if ($doc != "") { $desc = $doc } let _unit = (not-used-units|first) systemd-run --user -u $_unit --service-type=one...
Read post

自動化神器 nushell ,kubernetes 好幫手

有時候我們會臨時想要修改一下 kubernetes 的相關設定,不過不需要變更到檔案。所以就想說如果可以直接修改 kubernetes 資源就好。過去可能是靠 kubernetes edit 還編輯。但是編輯久了,有時候會覺得沒效率。這時候可以靠 nushell 幫你自度化修改。 下面範例為修改 deployment 的一些設定 def "complete deployment" [ ] { kubectl get deployments -o name|lines } export def use-host-namespace [ name: string@"complete deployment" ] { mut yaml = (kubectl get $name -o yaml |from yaml) $yaml = ($yaml | upsert spec.template.spec.hostNetwork true) $yaml = ($yaml | upsert spec.template.spec.hostPID true) $yaml = ($...
Read post

自動化神器 nushell ,系統檢查範例

原本想說把 nushell 範例都寫在一起,不過這樣會拖稿太久。所以決定隨意一點,想到什麼就發表什麼 nushell 提供方便的程式語言與簡單的和外部互動方式,讓你可以很容易的的檢查系統狀態是否是你預期的 下面範例會幫我找出所有 gpu_開頭沒有正常運作的程序(正常運作定義成strace 結果沒有 futex 文字) ps|where name =~ "gpu_"|par-each -t 8 {|it| {name: $it.name, out: (do {sudo timeout 5s strace -p $it.pid} | complete |get stderr)}}|filter {|it| $it.out | str contains futex}|get name 範例使用 par-each ,所以他會平行運算,不會每個 process 都需要等五秒鐘 下面範例示範找出所有任務沒有出現在 modulea 的 log 與 moduleb 的 log let tasks = (ls -s /tasks/ |get name ) let logs = (timeout...
Read post

使用 nushell 六個月的心得

在使用 nushell 這六個月期間,nushell 已經成為我主要的 shell 環境。而過去一些簡易的腳本,我都用 python 寫,如今都用 nu script 代替。nu script 用在做一些部署或設定時,遠比 python script 好用許多,能夠直接修改設定檔、執行程式,不需要額外裝東西。而 pipelin 方式,也讓你在寫 script 或是使用 shell 處理東西時,更加容易 一些簡易的 nu script 範例 檢查系統問題並顯示資訊 let priority = { "debug": 0, "info": 1, "warn": 2, "error": 3, "fatal": 4 } def main [ level: string = "info" ] { [ {|| let result = (uname -a|str contains x86) let level = (if $result { "info" } else { "error" }) { "level": $leve...
Read post

我的筆記方法

我做筆記也有一段時間了,這裡簡單紀錄我的做筆記方法。筆記軟體使用 Standard notes。 目標 我做筆記有以下目標 輔助記憶:因為我很健忘,所以需要外部系統 反省自己:留下一些記錄,未來可以反省 方便實施,容易在未來找到需要的筆記 做筆記方法 盡可能的在標題就說明清楚筆記用意。內文用來補充說明或是其他額外資訊 這項特性會導致許多無內容的筆記,不過我可以接受 這個設計也符合 atomic note 原則 筆記主要都是記在流水帳(log)內,log 目前分四類:global, 投資, computer, company global 基本上就是放其他所有的流水帳筆記 除了流水帳分類外,有一些細項的分類,如 computer -> programming -> python。但是這些分類不一定一開始做筆記時就會正確歸類,可能事後補加。減少做筆記時的負擔。一開始筆記分類以 log 為主。 有關聯的筆記使用 note link 功能 做筆記時,需要思考未來如何容易找到這筆記(利用內文增加可搜索性) 不依賴細項分類來搜索資料,細項分類只用來關連相關資...
Read post

nvim 拼字檢查

最近寫程式一直拼錯字,只好啟用拼字檢查功能。spelloptions=camel 功能主要是為了能夠在程式碼 function 依舊可以正確檢查(畢竟程式碼 function很高機會不是正常單字) 第一行是啟用拼字檢查 第二行是大寫視為新的字的開頭 set spell set spelloptions=camel 快速鍵: zg : 新增字到字典 zw : 新增字到字典 z= : 修正現在錯字 ...
Read post

使用 eink 螢幕進行開發與維運心得

很久前已經購買了 eizo 螢幕,eizo很棒值得推薦。不過他終究是主動發光的螢幕,所以還是有考慮電子紙螢幕。不過電子紙螢幕沒看過實體機器,所以也不知道好不好用。直到有天去書展看到現場有展示電子紙螢幕(boox mira),測試一下還可以,於是就買了。 基本上我用電腦只會使用兩種GUI程式,第一個是瀏覽器,第二是 terminal emulator 。瀏覽器在 eink 螢幕上使用沒啥太大問題。關掉 smooth scroll 和安裝 vimium plugin,應該就差不多了。terminal emulator 預設使用白色佈景, 在 terminal emulator 上會使用的程式就比較多,就個別介紹 tmux : 基本上我使用電腦都會透過 ssh 連到其他電腦進行開發(也就是我使用的電腦相當於 thin client),然後啟動 tmux session。tmux 可以讓你動態設定背景,所以我可以根據現在tmux window 大小來動態設定 tmux 背景主題。至於為啥需要動態設定背景的原因是有些程式需要切換到一般的螢幕才方便看內容,如k9s #!/bin/bash...
Read post

terraform 授權從 MPL 變成 Business Source License

terraform 授權從 MPL 變成 Business Source License。這個轉變基本上對於使用者影響不大,不過對於那些建立在 terraform 上並加以改進的產品,可能會有問題。當其他公司無法開發改善 terraform 的軟體,整個生態系就會變糟糕。 感覺一定會被影響的有:gaunacode 可能受影響的有: terragrunt ...
Read post

KCL lang(Constraint-based Record & Functional Language) 介紹

最近發現一個新的程式語言,不過很少人提到,所以就自己寫一篇。 KCL lang 是一種 data language,用來產生 yaml。它與 template language 不同的地方在於, language 可以做到資料與邏輯分開,而 template engine 則是資料與邏輯混雜在一起。 KCL 和 yaml 不同的地方在於 KCL 是程式語言,所以可以有變數與函數的觀念。而 yaml 只是一種格式,所以沒什麼特殊功能。 KCL 的語法和 terraform 與 python 相似,所以你會這兩個程式語言,你很快就可以上手了。 一個簡單的 kubernetes deployment 範例 apiVersion = "apps/v1" kind = "Deployment" metadata = { name = "nginx" labels.app = "nginx" } spec = { replicas = 3 selector.matchLabels = metadata.labels template.metadata...
Read post

nushell 介紹

nushell 是一個新的 shell ,提供 pipeline 和結構化資料的操作。nushell 使用 tcl-like 的 nu script 作為腳本語言,並加以改進。 tcl-like 語言是指每個敘述開頭都是一個指令,由第一個指令來決定後面的參數要放什麼。因此 if 也是一種指令。這種程式語言特別好學。nu script 繼承了這樣的優點,並引進了 pipeline 概念,更加優化 nu script 作為 shell 用途上的程式語言。 當你在 nushell 上打一個指令時,這個指令如果是內建指令,則執行該內建指令動作。如果不是,則看該指令是否為 PATH 下執行檔,如果是則執行,如果不是則顯示錯誤。這個特性讓你在shell使用 nu script時就像其他 shell 一樣方便,而不是要特殊語法才能執行程式。 nushell 敘述的輸出可以透過 pipeline 作為下一個敘述的輸入,像多數的 shell 一樣。不過 nushell 的輸出預設都是結構化輸出,方便你處理資料,而不是要透過各種手法來取得你要的東西。 例如你可以透過下面指令取得最新 linux 版...
Read post

設定 caddy server ,只許可 cloudflare ip 訪問

當我們使用 cloudflare 作為防火牆/CDN或是其他事情需要 cloudflare 擋在前面,此時就需要設定 caddy 只能讓 cloudflare存取。caddy 的設定會是如下(cloudflare ip 記得隨時更新) (ban-not-cloudflare) { @notcloudflare_ips { not remote_ip 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::...
Read post

2022 使用筆記軟體回顧

2022 年初,一開始是使用 Standard notes ,後來因為有一堆小 bug 、搜索功能不夠好用和不容易做到筆記關連,所以跳槽到 obsidian。 使用 obisidan 時,一開始用得很順利。後來當筆記越來越多,在加上受到 atomic note 啟發,產生了更多檔案。這時候,obsidian 就顯得不好用一些(他檔案和資料夾在同一個 tree),最後因為 standard notes 支援筆記關連與上傳檔案後,又跳回 Standard notes。 其實從跳離 Standard notes 到跳回 Standard notes ,Standard notes 搜索功能並無改進什麼,不過因為採用 atomic note 概念,所以原生的搜索功能就變成好用。 過去我筆記的習慣,是喜歡開一則筆記,然後裡面塞滿東西。在這個情形下,Standard notes 只能幫我找到那個筆記,至於我要的內容我要自己去找。但是當我採用 atomic note 概念時,每則筆記都是完整最小內容的筆記,因此我透過 Standard notes 搜索時,就可以準確找到我要的東西(而非還要在很...
Read post

2022 八月,nvim 從 coc 生態系轉成內建 lsp 心得

過去使用 nvim ,coc.nvim 生態系,快一百個 plugin 。coc.nvim 使用起來雖然簡單,不過 nvim 啟動速度大概快一秒。 後來將 coc.nvim 換成 nvim-lspconfig 與 nvim-cmp 後,也順便移除了非 lua 或 vim script 寫的 plugin,在 plugin 數量快一百三十個與設定檔行數變多的前提下,nvim 的啟動速度降到 0.3 秒左右,快十分多 ...
Read post

資料夾筆記法

最近在思考筆記方法,後來覺得透過檔案資料夾形式作筆記最簡單,也最方便。不需要用 tag ,也不需要用複雜軟體。 你可以使用純文字檔做筆記,也可以透過 markdown 格式。當內容需要透過章節來分段時,此時就將現在的檔案檔名變成資料夾名稱,原本分段的標題就變成了資料夾底下的個別檔案。如果你想要保留順序,則在檔案名稱前面加編號。也沒有一定要每個分段就是一個檔案,關鍵在於每個檔案是否是最小不可分割的筆記(atomic note) 如果要搜索資料,則可以透過 fzf、ripgrep等軟體。當然,你也可以使用作業系統內建的檔案管理工具做搜索,彈性很高。 因為使用檔案資料夾筆記方法,所以通常你可以將此方法套用至各種不同的筆記軟體(當然要支援無限深度的資料夾)。 也因為是檔案資料夾筆記法,所以你可以支援各種格式。你的資料夾能夠放什麼,就能做什麼筆記。 舉個簡單的例子來示範檔案資料夾筆記法。假設你`linux 工具`資料夾有 rofi 檔案,裡面紀錄編譯方法。有一天你想要額外記錄 rofi on的快速鍵,那麼你就將 rofi 變成 linux 工具資料夾下的資料夾,裡面擺編譯方法與快速鍵兩...
Read post

ansible default 行為

預設要觸發 default 值,需要上一個變數是未定義 如 "{{ undefined_variable | default(default_var) }}" 只有 undefinedvariable 未定義時,才會使用 defaultvar 的值 如果需要上一個變數是空值時,則用預設值,需要傳入 true 到 default 的第二個參數 如 "{{ empty_value | default(default_var, true) }}" 如果 emptyvalue 是空字串空陣列等,則會使用 defaultvar 的值 ...
Read post

建立第二個頭腦

過去一直都是靠頭腦再記事情,不太需要做額外的筆記或是建立知識管理系統。因為總覺得遇到問題,基本上都可以透過 google 找到答案。 後來記性變差後,有在做一些筆記。直到有一次我再找一個問題的解答,不過一直 google 都找不到。後來向別人要關於那主題的相關資料,才找到關鍵字。這時候我才發現,我需要一個知識管理系統作為我第二個頭腦。 知識管理系統,或是第二個頭腦的重點,在於如何讓你過去所學習的東西,如何在未來需要時,能夠快速地有效使用它(快速的找到該知識與有效的使用該知識解決問題,兩者缺一不可)。有些人靠的是強大的記憶力,但是我覺得我記憶力不好,所以需要依賴系統。 過去我是使用 Standard notes 作為筆記軟體。不過要拿來當知識管理系統的話不夠好,主要是搜索不夠強與附加檔案不方便。 最後採用 Obsidian 軟體。 Obsidian 有下面功能: 強大的搜索功能。能夠搜索 section (#下面區塊)、tag等 能夠嵌入 pdf 等檔案,也可以嵌入你的筆記或是筆記的一部分 支援雙向連結 支援 markdown 他是使用檔案存資料,因此你可以用 nvim 或...
Read post

Standard notes 介紹

前言 之前都是用 vimwiki 在做筆記。不過 vimwiki 不方便用手機存取。因此開始評估各種筆記軟體。 評估過下面軟體,最後選擇了 Standard notes。 Standard notes 優缺點如下: 優點 Open source 原生支援 web。 支援資料夾(使用 tag 實作)(付費) 支援無限制的子資料夾 (畢竟資料夾只是 tag 而已)(付費) 許可筆記放在不同資料夾裡面。(付費) E2E 加密 能夠將筆記轉成 blog 支援使用密碼保護特定筆記 他可以先選定 tag ,在搜索 tag 下的資料 缺點 使用 markdown 格式不支援圖片 無使用法鍵盤操作筆記功能,如搜索筆記 搜索功能十分陽春。他只會列出所有包含關鍵字的筆記。至於要找筆記內的關鍵字,要在搜索一次。 不方便做到提醒功能 評估過其他軟體列表: everntoe: 優點: 支援 web, desktop app, mobile app 現在的 web 版本比過去好很多(之前 web 介面不好看)。 功能豐富 缺點: 不支援 markdown 沒有加密 筆記本、搜索...
Read post

直接從 linux command line 的 stdin 複製資料

從 stdin 複製資料 下載下面程式 https://chromium.googlesource.com/apps/libapps/+/master/hterm/etc/osc52.sh 之後就可以透過將資料丟到 hterm-copy 的 stdin,terminal emulator 則會自動複製資料 執行下面指令 sudo curl https://raw.githubusercontent.com/kjelly/auto_config/master/roles/mybin/files/mybin/hterm-copy.sh -o /usr/bin/hterm-copy 之後就可以透過將資料丟到 hterm-copy 的 stdin,系統則會自動複製資料 和 vim 整合 如果想要和 vim(or neovim) 做整合,則執行下面動作 下載 https://raw.githubusercontent.com/kjelly/auto_config/master/roles/vim/files/clipboard-provider 確保 clipboard-pro...
Read post

測試 terminal 是否支援 true color

用下面腳本可以測試 terminal 是否支援 true color curl https://raw.githubusercontent.com/kjelly/auto_config/master/roles/mybin/files/mybin/test-true-color.sh | bash 或是直接使用以下的程式碼 #!/bin/bash # # This file echoes a bunch of 24-bit color codes # to the terminal to demonstrate its functionality. # The foreground escape sequence is ^[38;2;<r>;<g>;<b>m # The background escape sequence is ^[48;2;<r>;<g>;<b>m # <r> <g> <b> range from 0 to 255 inclusive. ...
Read post

在 chrome secure shell 使用 NERD fonts

要在 chrome secure shell 使用 NERD fonts 字型,開啟 chrome secure shell 的選項,在 Custom CSS (URI) 填入 https://cdn.jsdelivr.net/gh/kjelly/webfont@latest/css/nerd.css 。 之後就可以在 Text font family 填入下面字型名稱,使用該字型。目前之支援的字型有: Knack Nerd Font Mono FiraCode Nerd Font Mono Hack Nerd Font Mono UbuntuMono Nerd Font Mono SauceCodePro Nerd Font Mono SpaceMono Nerd Font Mono Hurmit Nerd Font Mono DroidSansMono Nerd Font Mono InconsolataLGC Nerd Font Mono RobotoMono Nerd Font Mono Iosevka Nerd Font Mono AurulentSansMono Nerd...
Read post

mapr 介紹

mapr 是一個非同步,批次執行指令的程式。擁有以下特點: 非同步執行指令 可以指定同時執行指令的數目 指令執行失敗時,不在執行下一個指令 能夠取得過去執行程式的結果作為這個指令的輸入(過去結果儲存在檔案裡面) 能夠從檔案、指令執行結果、標準輸入做為指令參數 能夠自動產生暫時檔案或是 uuid 作為指令參數 使用情境 檢查特定主機的特定路徑是否有檔案,有檔案則顯示主機名稱 mapr -f '@a=hosts' 'ssh @a ls /somepath/somefile' 'echo @a' --last --no-header 上述指令執行從檔案讀取主機名稱(一行一個主機名稱),之後透過 ssh 指令檢查 /somepath/somefile 路徑是否存在, 如果存在則執行 echo 指令,印出主機名稱。如果路徑不存在,則不會執行 echo 指令。 @a會被替換成檔案hosts裡面的每一行。檔案有 n 行,則執行 n 次。 刪除 OpenStack 下 project 所有的 volumes mapr -c '@a=openstack volume list --...
Read post

kubernetes 接 ceph 當 storage backend

kubernetes 版本:1.13.0 不同版本的設定可能會不一樣,我在201903測試過可以用 未來可能會有些許不同 不過原則應該都一樣 原則: kubernetes 支援用 rbd 當 storage backend。但是 kube-controller-manager container 未必會包含 rbd 指令。如果 kube-controller-manager container 未包含 rbd 指令,你建立 storage 時就會看到 『failed to create rbd image: executable file not found in $PATH, command output:』的錯誤。這時候,你就要提供新的 container ,讓 kubernetes 可以透過你提供的 container (之後都叫 provider )來執行 rbd 相關操作。該 provider 放在 kube-system 下。 腳本簡易說明: 一開始建立名為 rbd-provisioner 的 serviceAccount ,之後在建立 secret 用來放 ceph...
Read post

在 linux 下使用指令將照片自動轉正

使用下面工具可以做圖片轉正 sudo apt install imagemagick mogrify -auto-orient *.jpg ...
Read post

debian 出現 locale: Cannot set LC_ALL to default locale: No such file or directory

debian 出現 locale: Cannot set LC_ALL to default locale: No such file or directory  的解決辦法 sudo apt install locales sudo locale-gen en_US.UTF-8 sudo dpkg-reconfigure locales ...
Read post

輸家競標

網路上有種競標方式,它的特性是每次下標都要付錢,我不知道到該怎麼稱呼這種競標方式。姑且叫他輸家競標。 為什麼我要叫他輸家競標呢? 因為你一下標你就輸了(輸了錢和時間),在這種競標模式下,只有兩個贏家,賣家、平台提供者。 在一般的競標模式下,競標者為了確保自己的最大利益,通常不會一次加碼太多錢。直到沒有人願意再加碼,此時競標就成立,買家確定。 可是在輸家競標的情形下,一旦你下標,要嗎你成為買家,要嗎你失去你因下標的而付出的錢。許多人為了避免損失之前下標的錢,就會盡量的下標,直到物品金額他無法負擔。也因為大部分下標的人不願意失去他因下標的而付出的錢。因此最後成交金額常常會比一般競標方式高,而買家通常不會得到太多好處(因為他需要負擔成交價、因下標而損失的錢、使用平台費用)。 一般的競標,因為出價不需要成本(當然有時間成本),所以要嗎成為買家,要嗎就浪費時間(輸家競標既浪費錢也浪費時間)。所以不會有買家競相出價的情形。因此一般的競標方式,對買家有利許多,賣家則還好。 ...
Read post

論生活中常見成本概念

這篇文章探討生活中的常見成本,讓你在思考成本時,有個方向。以下的名詞並非所有都是經濟學術語。成本不一定是金錢。 擁有成本:這是指當你從一個狀態轉變到另一個狀態(注:後者狀態的價值比前者狀態還高),所付出的成本。例如你從沒有車到有一台車,購買車的成本。或是從有第二台車到有第三台車的購車成本。 維持成本:維持狀態,使其狀態的價值避免嚴重減損。例如保養車的成本,避免車損壞。 機會成本:當你做一個選擇而需要放棄其他選擇,則其他選擇的最高價值者,為機會成本。在思考時間相關的問題時,應注意機會成本的問題。 沉沒成本:當你做了某件事,然後發現做下去沒意義(或價值)。但是因為過去花費的成本,又讓你繼續做沒意義(或低價值或非完全理性)的事。則過去花費的成本則為沉沒成本。例如你不小心買了一張很難看的電影票,你覺得去看只是又浪費時間。但最後又去看,而浪費了時間。該張電影票則為沉沒成本。 了解了上述成本的意義,則以情境來描述上面成本概念。 情境一: 當你花錢買書,則買書錢為擁有成本(你必須付出錢,才能擁有該本書)。當你買了很多書,因而需要額外租空間來放書,則租額外空間的錢則是書的維持成本(為...
Read post

新部落格!

舊的blog 在blogger 不過後來覺得 blogger 不好用 就很少寫文章了 現在用了 standard notes 後 發現 standards notes 有提供 blog 功能 覺得很方便 畢竟我的 blog 主要是用來記錄電腦筆記 這樣我自己的筆記和電腦筆記都可以用 standard notes 管理 ...
Read post

探討解決問題的方法

在做決策時,一開始需要盡可能列出問題的所有可能解法,這樣可以避免在單一解法陷入太深,而看不到其他情形。在找出許多可能解法後,則需要深入探討評估各種解法。需要廣度分析、深度分析。評估各種解法,可以從下列三種角度來分析 利益分析:分析各種解法能夠帶來的好處。這會是優先考慮的角度,畢竟沒有好處的解法是不需要考慮的。 風險管理:任何解法都會有副作用,評估各個副作用發生的可能性,並副作用會造成的損害。 損害控制:當採取該解法時,發生不利或不預期的事情時,是否能夠降低損害或是接受該損害。  以下象棋為例子,一開始要思考各種可以走的走法。之後深入分析各個走法,找出各個步數可能優缺點。評估各種走法,思考各種走法,有何風險。如會損失一隻”車”或是”馬”。損害控制像是這樣的走法,可能只會讓你損失兩隻兵,但是不會輸掉遊戲之類的。 ...
Read post