潮流特區

最新文章

Swarm mode 上線 5 - load balancer | 還有那些事該考量?

科技新知
MacauYeah・2024-11-18

前面介紹了 ingress network ,亦介紹了 proxy gateway 。能做到的基本都做到了,再來就是考量安全性的問題。因為加了 proxy gateway ,前述的例子是所有 service ,都放在同一個 yaml 檔中。好處是,所有相關的東西存放在同一個檔中, gateway ,背後的 service 都一眼看到。但壞處就是有其中一個 service 更新,都要改那個 yaml 檔。更大的問題是, stack deploy 的指令,不單只更新其中一個 service ,就連其他 service 都會自動取得最新 image 而 redeploy 。 對於一個緊密的系統來講,同步更新可能不是大問題。但對於一些預定排程發佈的系統可不能這樣因為副作用而更新了。如果你也有這樣的分開管理需求,可以參考下面做法,把 gateway service 及 upstream service 放在不同的檔案中,然後經過 external network把所有 service 串連起來。 # nginx-stack.yaml, docker stack deploy -c nginx-stack.yaml nginx services: http-gateway: image: http-gateway ports: - 8080:8080 deploy: replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure # manager-stack.yaml services: managerhttp: image: bretfisher/httpenv networks: - nginx_default - default deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==manager networks: nginx_default: external: true # dmz-stack.yaml services: dmzhttp: image: bretfisher/httpenv networks: - nginx_default - default deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==dmz networks: nginx_default: external: true 這樣,不同 service 的維護人員,就可以獨自控制自己的檔案。在第一次發佈時,確認 nginx-stack.yaml 先行發佈就可以了。對應的發佈指令是docker stack deploy -c nginx-stack.yaml nginx,它會自動産生一個 nginx_default (即 stack名字_default )的網絡。之後其他service,就可以經networks的設定找到它了。 services: YOUR_SERVICE: networks: - nginx_default - default networks: nginx_default: external: true 上述即使分離檔案,在安全性考量時還是有一個問題,就是 ingress network 的問題。試想一下,dmzhttp (Demilitarized Zone)原本被設定的原因,就是想限制某些訪問只能一些可以公開的服務。但因為經過 ingress network 之後,它們會在所有機器上開放這些 port。那就是,以下面的例子來講,若 dmzhttp 是公開的服務, intrahttp 是內部服務,即使用 intrahttp 使用不同的port 8889。但一經 swarm mode 預設的 ingress network ,在node.labels.zone==dmz的那些節點,還是可以訪問到 intrahttp 。 services: dmzhttp: image: bretfisher/httpenv ports: - 8888:8888 deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==dmz intrahttp: image: bretfisher/httpenv ports: - 8889:8888 deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==intra 我們前述介紹的 proxy gateway ,其實已經有一定程度可以解決這個問題。因為 proxy gateway 是根據 http 協定中的 host header 去做分流。在邊界網絡進來的「合法」訪問,道理上會好好地經引導到我們的 dmzhttp 。不過網路的邪惡可容小看, proxy gateway 也會有被騙的一日。有特定能力的攻擊者,只需找到目標域名,還是可以接觸到 intrahttp 。 若要做進一步隔離,在這種情況下,我們可以在 dmz , intra 機器中各設定一套 swarm ,完全獨立,這是最安全的做法。但這樣做的管理成本就會變高,因為兩個網段都會有自己的 manager 節點,而且在 dmz 網段的 manager 節點也有被攻擊的可能。 若我們回到單一 swarm 的方向,可以修改各個 service 中的 port 和 deploy 。利用 post mode 中的「host」,配合 deploy mode 中的「global」,完全跳開 ingress network。 services: dmzhttp: image: nginx ports: - target: 80 published: 8888 mode: host deploy: mode: global update_config: delay: 1s restart_policy: condition: any placement: constraints: - node.labels.zone==dmz intrahttp: image: bretfisher/httpenv ports: - target: 8888 published: 8888 mode: host deploy: mode: global update_config: delay: 10s restart_policy: condition: on-failure placement: constraints: - node.labels.zone==intra 上面的例子中, dmzhttp 會在所有 dmz 的機器中,每個節點只運行一份服務,而且直接使用該機的 8888 port ,外面不會再有 ingress network 的 存在。同樣地,intrahttp 會在 intra 的所有節點,運行一份服務,佔用它們的8888 。這兩個服務,即使使用一個 port ,swarm 也不會說有任何問題。因為它們不會經 ingress network 搶佔其他人的 8888。 可能會有讀者問,如果 host mode 這麼安全,為什麼預設會是 ingress network,那我們就要先了理清 ingress network 與 host mode 有有什麼分別?假設我們只運行一個service,它佔用8888。 功能ingress modehost mode replicas 數 同一個 service replicas 為任意數量,什至比節點的數目多 因為有 port 限制,每個節點最多只能運行一份 Virtual IP Virtual IP 任意在節點中跳轉也可以,因為 ingress 會自動找到對應的 service 所在的節點 Virtual IP必需要與 service 所在節點綁定,其他節點訪問不到 load balance 有 沒有 host mode 就像我們傳統在各自的節點上自行佈署自己的程序,各個節點只有一份。所以不會有自動 load balance 的效果,如果客戶端訪問固定的IP,就會得到是固定的接器接受請求。我們有需要,就要在前面加一個 Proxy Gateway (或 HA proxy )。 Virtual IP 也一樣, host mode 下需要好好地自動跟著 service 的生命期,不過幸運的是, Docker 預設己經有自動重啟 service 功能,即前文中的 restart_policy ,它在 host mode 下也適用。如果大家有配合 deploy 中的 global mode , Virtual IP 的並沒有實際變動。但如果沒有 global mode ,就要再想想辦法了。 最後考慮 load balance 的問題,如果進入點的 service 的真的不太消耗資源,沒有 load balance 也是可以的 ,但若超負荷,就必需要自建 proxy gateway 。經過進入點後,若我有背後的 service 就沒有所謂的 ingress 和 host mode 選擇。

Swarm mode 上線 5 - load balancer | proxy gateway 代理伺服器

科技新知
MacauYeah・2024-11-11

前面的例子,我們已經成功設定 ingress Network,也加了 virtual ip 。如果大家的目標是單一 web 應用,應該就已經很足夠。但作為一個足夠節儉的老闆,怎會讓一個 Swarm 只跑一個 Web 應用?但問題來了,一個 docker swarm service 就已經佔用一個公開端口 (例如上述的8888,或是更常見的443)。怎麼可以做到多個 service 分享同一個端口?答案就是回到傳統的 Web Server 當中,使用它們的 virtual host 及 proxy 功能,以達到這一效果。我們就以 Nginx 為例,去建立一個守門口的網關 (gateway) 。 以下就是一個最簡單的例子,最前端的 http-gateway (nginx) 對外公開端口 8080 ,它根據 virtual host,去分派對應的請求去 dmzhttp (bretfisher/httpenv) 及 managerhttp (bretfisher/httpenv) 。構架圖就是以下這樣。 ┌───────────┐ ┌──────────────►│ dmzhttp │ │ └───────────┘ │ ┌───────────────┐ │ http-gateway │ ────────►│ (nginx:8080) │ └──┬────────────┘ │ │ ┌─────────────┐ └─────────────►│ managerhttp │ └─────────────┘ 換成 docker stack ,就大概如下 services: http-gateway: image: http-gateway ports: - 8080:8080 deploy: replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure dmzhttp: image: bretfisher/httpenv deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure managerhttp: image: bretfisher/httpenv deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure docker stack有一個很好的功能,就是 service 名會自動成為同一段網絡中的 hostname 。即是http-gateway中,它可以經DNS,找到 dmzhttp 、 managerhttp,也就是它的 nginx 可以設定成如下的樣子。 # default.conf server { listen 8080; listen [::]:8080; server_name managerhttp; resolver 127.0.0.11 valid=30s; location ^~ / { set $upstream_manager managerhttp; proxy_cache off; proxy_pass http://$upstream_manager:8888$request_uri; } } server { listen 8080; listen [::]:8080; server_name dmzhttp; resolver 127.0.0.11 valid=30s; location ^~ / { set $upstream_dmz dmzhttp; proxy_cache off; proxy_pass http://$upstream_dmz:8888$request_uri; } } 上面的例子中,就是一般的 virtual host + nginx proxy 設定。特別要說明的是 resolver 那一行,它指向 docker DNS (127.0.0.11), 而且還可以讓nginx在找不到上游時,不要馬上死亡。這樣 docker swarm 中各個 service 隨時加加減減,有保命的作用。 最後我們的 http-gateway 就是 nginx image + default.conf 上述的 docker 就可以用以下方式打包。 # Dockerfile # docker image build -t http-gateway ./ FROM nginx:latest COPY default.conf /etc/nginx/conf.d/default.conf 上面的 docker stack 和 nginx config,只要同步增加 service 及對應的 proxy pass,就可以o讓同一個端口,根據不同hostname做分流。當然,如果大家可以共用端口及 hostname 也可以,分流就改用 nginx location 來設定,不過這是更加偏向 nginx 的內容,日後有機會再介紹。本篇就先集中於 docker 相關的議題。 在安全性的角度, docker 還有一些配置可以做,就是讓 dmzhttp 和 managerhttp 在不同的機器上發佈。假設我們的網絡分開兩段,一段是 manager 專用,一段是 dmz 專用。在建立 docker swarm 後,我們可以為不同的節點加入對應的標簽。 docker node update --label-add zone=manager YOUR_MANAGER_NODE docker node update --label-add zone=dmz YOUR_DMZ_NODE 然後我們通過修改 docker stakc 中的 placement -> constraints ,限制不同的 service 在不同的節點上運行。 services: http-gateway: image: http-gateway ports: - 8080:8080 deploy: replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure dmzhttp: image: bretfisher/httpenv deploy: replicas: 2 update_config: delay: 10s restart_policy: condition: on-failure + placement: + constraints: + - node.labels.zone==dmz managerhttp: image: bretfisher/httpenv deploy: replicas: 3 update_config: delay: 10s restart_policy: condition: on-failure + placement: + constraints: + - node.labels.zone==manager 使用上面的例子,我們就可以達到簡單分離的效果。但大家緊記,這個分離效果始終是一個規則式功能,它與防火牆的隔離還是有本質上的區別。除了利用傳統的防火牆技術外,我們的docker swarm network,其實也可以做更多隔離,我們日後再慢慢加強這個例子。

Git 歴史修正

科技新知
MacauYeah・2024-10-29

有時候,我們修正一系統檔案,例如某個commit中,多了一個不該放的檔案,又或者想修改該commit的作者,我們就要追搜到某個commit,然後用rebase隨個改。 例如本次repo,有一個githubAction.md,因為錯誤原因,被加到了main中,也藏了很久。如果我們想連根拔起,我們需要加出它第一次出現的commit。 $ git log githubAction.md commit 60ccd70f6b768138cbe23c93ffcfa32574ce895c 那我們就以它前一個commit作為rebase的根據,進行逐個commit修正。 $ git rebase -i 60ccd70f6b768138cbe23c93ffcfa32574ce895c^ pick 60ccd70 draft some content pick e2ee9a3 add some senario. pick b91afc1 refine submodule; pick 98cd366 add notes about submodule specific checkout; pick 064b06f test directly commit in submodule main pick 7b648d2 update git submodules notes pick 556f25e add notes about merge timing pick 5244804 Create git-continuous-integration-strategy.md pick 107e486 add more pratical nodes about ci; pick d93cbee add mono repo challenge pick 1c471b6 add worktree notes pick 9063ccb notes about different of git flow and github flow; pick b72e89e Update github-flow.md, add ref more link pick 0b8f2a9 draft github flow release problem pick 8b333fc finalize github flow release strategy 在rabase選項中,把需要改的commit由pick改為edit。(rebase會以舊到新顯示)。然後儲存。例如 edit 60ccd70 draft some content edit e2ee9a3 add some senario. edit b91afc1 refine submodule; pick 98cd366 add notes about submodule specific checkout; pick 064b06f test directly commit in submodule main pick 7b648d2 update git submodules notes pick 556f25e add notes about merge timing pick 5244804 Create git-continuous-integration-strategy.md pick 107e486 add more pratical nodes about ci; pick d93cbee add mono repo challenge pick 1c471b6 add worktree notes pick 9063ccb notes about different of git flow and github flow; pick b72e89e Update github-flow.md, add ref more link pick 0b8f2a9 draft github flow release problem pick 8b333fc finalize github flow release strategy 我們第一次會在60ccd70,我們作出想要的改動,然後經amend去改掉60ccd70 $ rm githubAction.md $ git add -u $ git commit --amend --author="newuser " 確定無誤的話,就可以去下一步,即是到了e2ee9a3 $ git rebase --continue 因為已經rebase過,你此時看到的不會再是hash不再是e2ee9a3,而是自動rebase完的e2ee9a3。若大家有東西要改,就使用commit --amend。如果沒有東西要改,也沒有conflict,可以繼續rebase --continue下去。

Swarm mode 上線 5 - load balancer | 負載平衡器

科技新知
MacauYeah・2024-10-28

前面我們一直談 swarm 的設定,但對於真實的服務,我們還要考慮客戶端是如何連接我們的伺服器群集。通常網路服務,客戶端都會經過域名轉換成IP,然而通過IP連線服務。 Ingress Network 假設我們 swarm 內有5個節點,那到底域名應該指向我們哪一個節點的 IP 呢? 如果我們不考慮節點死機的話,其實5個節點的IP都可以。因為 swarm 會自動把同一個公開的 port ,在每一個節點上都可以訪問到。 以下例子,即使只有一個 container 運行,佔用 port 8888,它還是會在5個節點上全開。 swarm 通過自己的 ingress network,它所有節點的 8888 串連起來。 services: http: image: bretfisher/httpenv ports: - 8888:8888 deploy: replicas: 1 update_config: delay: 10s restart_policy: condition: on-failure 我們可以在每個節點上,都會找到這個 ingress network,而且那個Network ID,應該是一樣的 > docker network ls | grep ingress t7rmk6g9zybm ingress overlay swarm 如果上述的 service 的 replicas 調成大於1的數量, ingress network 還會方便地自動 round robin (輪替) 地分派流量,達到最簡單的負載平衡。 Virtual IP 前述的設定,我們有一最大的假設,就是節點不會死機。但實際情況下,各種原因,例如安全性更新、重啟中,都會讓節點暫時無法使用。即使所有 service 都是會自動 failover (故障轉移),但客戶端還是用舊機 IP ,它還是無法訪問。因為該機 IP 已無法使用,除非我們連 IP 也懂 failover。這時, Virtual IP 就是我們的救命靈藥。 在 ubuntu 上,我們可以經過 keepalived 去設定 Virtual IP apt-get update && apt-get install keepalived -y 然後設定 keepalived , 假設 172.22.1.5 是我們的 Virtual IP 。 然後每個節點都要加入conf # vim /etc/keepalived/keepalived.conf # assume failover ip is 172.22.1.5 vrrp_instance VI_1 { # change interface according to machine status interface eth1 state MASTER # 101 for node1, 102 for node2 # you can start seq from other value, remind unqiue for each node is ok; virtual_router_id 101 # lower value will become master # ex, node1 priority 100, node2 priority 200, node3 priority 150. # if node 1, 2, 3 alive, node2 will become master. # if node 2 gone, node 3 will become master. priority 100 advert_int 1 authentication { auth_type PASS auth_pass YOUR_RANDOM_PASSWORD } virtual_ipaddress { 172.22.1.5 } } 上述需要特別注意的是 virtual_router_id : 每個節點應該都要不一樣,以作唯一標識。 priority : 每個節點應該都要不一樣,最大的那個節點,就會優先使用 Virtual IP 。 auth_pass : 每個節點都相同,但大家在抄時,記得更改。 還有的是開通 iptables ,讓各個節點可以經網絡廣播的方式互相看到對方。 iptables -I INPUT -d 224.0.0.0/8 -j ACCEPT iptables -I INPUT -p vrrp -j ACCEPT systemctl restart keepalived

Docker Tag 命名

科技新知
MacauYeah・2024-10-24

一般來講,同一個docker image會提供多個不同的版本,每個版本會附予不同的tag,以作標識。但以docker image的維護者來講,它的tag通常代表的是自己程式的版本號。不過這個版本號卻存在很多變數,就讓筆者好好地逐一說明。 程式的版本號 在沒有Docker的年代,其實所有軟件在發佈時,都會標示版本號,方便使用方明確追蹤問題,自行選擇升級、降級以解決相容性問題。大家要重現問題,也能清清楚地重現。所以docker image的tag,在某程度,都是代表發佈自己的程式版本號。但以前的年代,軟件底層的依賴,例如OS層面的共享程式庫,則不在發佈的管控中,所以過去的程式,在跨電腦安裝時,都會出現缺少某些共享庫的問題。而使用了Docker後,image以內的共享庫的都會在打包的那一刻固定和發佈,就不會有漏的問題。 庫更新,怎麼辦 上面說到image可以打包共享庫,但問題是共享庫也會有安全性更新問題,那麼對docker image的維護者來講,它自己的tag又該如何命名? 因為庫的量可大可少,所以一般來說,都不可能完全把各個庫的版本號寫在自己的tag上。退而求其次,就是用"版本號+日期",庫的細版本號,就存在原始碼當中。Ubuntu 就是這樣的例子。 不過"版本號+日期"的命名方式真的方便嗎?每次下遊用戶想更新去最近版本,都要自己找一次最近的日期。這樣對很多用戶來講都不夠方便。所以docker又提供了一個重tag的功能。例如ubuntu:noble,在早些時候指著noble-20240904.1,然後過幾天,又指向更新的noble-20241009。更常見的是latest,每次image都預設會存在,docker也希望大家會定期更新這個tag,讓大家可以更易地找到最新版本。 註: 這跟git tag有所不同,git tag並不預期會變的。當協作者收到tag後,那怕上遊刻意更新tag指針,協作者沒有刪除原tag之前,都不會知道tag更新去了哪裏。 我們該如何選 在發佈方和引用方來講,引用時可以明確使用唯一的"版本號+日期",對穩定性來講是有意義的。不過多多少少,會產生額外的時間成本。發佈方來說,就是多用了一些儲存空間,方便引用方可以隨時找到舊(庫)版本。而引用方,就要手動修改引用號,作為驗收依據,自動更新的難度比較大。 但對於自動更新要求比較大的情況下,可能就是使用latest或者會隨時更新的share tag(共用tag)比較實際。但我們也依然要定一些方式去版本更新記錄,例如:同時使用 beta latest archive 每日自動更新beta,只有所有測試都通過時,才把archive指向現在的latest,再把latest指向現在的beta。這樣做的好處是,核心的docker stack檔案改變的機會較少,也可以免除docker swarm做太細緻的權限管理。

重入膠坑

手機‧電玩
MacauYeah・2024-10-21

上期講到,筆者因為機緣之下,認識到賢者模型工作室,也很感謝他們幫忙修復了筆者那斷椿的模型(斷樁是膠老永遠都要面對的難題) 不知道大家看了筆者的爛尾舊模之後,有沒有也心動想把自己的舊模拿出來再繼前緣?概然有這個麼好的地方,有人指路,何不帶著大家的模型或問題,去賢者問一問。筆者就在最近一個月,就乾脆一口氣做一隻新模,翻新一隻舊模。 筆者也來分享一下最近的素組+補色的制作心得 剪鉗 - 新模 如果大家有機會做新模,看大家有沒有打磨的需求。打磨是很花時間的,但成品通過打磨後,即使不上色,只噴保護漆,已經超級美觀的。但時間成本也真的很高。 為什麼明明標題講剪鉗,但開篇卻在講打磨。因為第一步把模型從流道剪下來的那一刻,就間接地影響了日後能不能打磨。也根據大家要求的打磨完美度,去決定剪鉗要買多貴。 不論大家想不想打磨,但買一把實用的剪鉗,不要在剪下來取件的一刻令水口位花了,是很重要的。雖然有時留了位置打磨,但若水口花了,有時還是會傷到零件本身,不論表面怎樣打磨,都救不了。那時不是使用補土,就是要打磨到缺肉。家裏環境不方便上色的話,補土的做法就不適合了,還是好好地選剪鉗吧。 完全不打磨,可以買薄刃單刃剪。薄刃單刃剪可以極大地讓水口切割平整,又讓水口細小,之後不想打磨,也不會大刺刺地看到。筆者有試過這個方案,筆者還有一些更奇妙的想法:一開始開心剪,先素組/假組再說,後期有機會再打磨。但這個不是賢者老闆的推薦方案,而筆者慢慢地也發現了一些問題,果然不聽老人言,吃虧在眼前。我們有機會實際操作再詳述。 進行打磨,可以買田宮的雙刃剪,雙刃剪也有薄刃的,但鋒利程度不單刃。賢者老闆比較推這款,因為價格宜人,也耐用。不過筆者都有聽一些其他朋友的建議,一把粗剪,一把薄刃,這樣薄刃剪比較耐用。因為薄刃剪不論多便宜,也要 MOP 200起跳。但壞處就是時間成本越來越多,所以到頭來,可能賢者老闆推薦的田宮的雙刃剪 + 自行打磨,才是長久的做法。 打磨 - 新舊模 若果大家選擇打磨的話,就需要不同號數的砂紙。筆者就直接買了老闆推薦的海棉砂紙套裝:400, 600, 1000, 1500, 3000。省心,好用。 不過對於有需求的朋友,可能要另外再散買800和1200號。另外400,600號,也要加構砂紙+打磨板的版本。因為400,600號切削力強,不分情況全用海棉的話,很易磨到出現曲面。800和1200則作為600、1000、1500之間的過渡。有時太粗心,部份地方沒有足夠用1000打磨,噴保護漆後,還是會有明顯的傷痕。 手塗補色 - 新舊模 不論大家有多痛恨Bandai的貼色,筆者都不建議大面積手塗補色。因為市面上手塗的marker筆,多為水性塗,附著力本來就低,沒有底色補土的情況下,水性塗很易刮塗。筆者之前不知道,刮了又塗,塗了又刮,惡夢。經向賢者請教之後,才放棄這一方向。 而中、細型面積的補色,軟頭的Marker補色筆,實在太好用。除了白色這類遮蓋力不強的顏色,其他遮蓋力強的顏色,例如藍色、紅色,在補土加成之下,筆者塗得很滿意,不過刮漆還是會有。

Tmux - 繼 Screen以後的Linux多工神器

科技新知
MacauYeah・2024-10-08

因為各硬件/軟件的發難,筆者又不得不回到那個只有純純linux tty console的世界。很多時候,那怕使用tty,我們在Desktop mode,也有現代terminal 可以用,需要多分頁,滑鼠選取文字、複制、貼上,都可以輕易做到。 但在mobile / tablet device 上,手指操作真的很不方便。又或者你像筆者一樣,即使有電腦,但要操作一些Linux VM,它們連ssh都沒有,只能直接登入它們的tty,那麼懂得使用Tmux進行分頁及複制、貼上,就變得很重要。 Tmux 是什麼? Tmux 就是可以在Linux Terminal 同一個窗口中,實現多工處理的小程式。就像我們利用多分頁一樣,不同分頁做不同的事。不過最大的差異就是,生成分頁,排列分頁,我們都要使用鍵盤來完成。有時筆者也會用它來作為背景程式,以免不小心關了Terminal就會把所有運行中的指令都停掉。 我們就馬上來看實際例子吧 前置事項: 安裝Tmux及運行Tmux Debain & Ubuntu 安裝: sudo apt-get update && sudo apt-get install tmux 運行:tmux 進入tmux後,你就會至少有一個分頁,而且不會因為Terminal關閘而中斷 用法一: 建立兩個分頁,並切換 增加分頁: 先按 “Ctrl + b” (前置鍵),再按”c” (create) 切換分頁: 在多於一個分頁的情況下,先按 “Ctrl + b” (前置鍵),再按”n” (next) 用法二: 同一個分頁中,建立左右並排的窗口 增加水平窗口: 先按 “Ctrl + b” (前置鍵),再按 “ (雙引號) 切換窗口: 在多於一個窗口的情況下,先按 “Ctrl + b” (前置鍵),再按方向鍵左或右 用法三: 回到前一個tmux session中 因為不小必關閉了terminal,又或是remote ssh中,ssh斷線後,需要回到之前的工作狀態 未進入tmux 的狀態下:tmux attach 要留意tmux 可以有很多個session,要去到指定的session,就要為session命名。但這個不是筆者常用的情境,原本多個分頁已經很夠用,還要多個session,會很混亂。但不排除它在某些情況下有特別用途,有興趣的朋友可以自行挖挖看。 進階: 回頭看過去的terminal screen output 在現代的Terminal中,原本按滑鼠滑輪向上滾,就可以看到過去的資訊,但tmux下反而不行,所以我們需要進入特殊模式 進入Copy Mode: 先按 “Ctrl + b” (前置鍵),再按 [ (開括號中括號) 向上翻頁: 上方向鍵或PageUp 離開Copy Mode: Copy Mode中任何時候按”q” 進階: 複制貼上 進入Copy Mode: 先按 “Ctrl + b” (前置鍵),再按 [ (開括號中括號) 選擇範圍: 移到需要複制的文字起點,“Ctrl + Space” ,然後再移動到結束點,再按”Ctrl + w” 複制 貼上: 離開Copy Mode後,再按”Ctrl + b” ,然後 ] (關括號中括號) 進行貼上 進階: 複制貼上2 某些情況下,我們不允許使用“Ctrl + Space” 或 ”Ctrl + w”,因為它們可能跟系統的組合鍵有衝突,所以需要改為單鍵。 讓tmux使用類似vim的操作模式: echo “set-window-option -g mode-keys vi” >> ~/.tmux.conf 關掉所有使用中的tmux,重開tmux 進入Copy Mode: 先按 “Ctrl + b” (前置鍵),再按 [ (開括號中括號) 選擇範圍: 移到需要複制的文字起點,按單鍵“Space” ,然後再移動到結束點,再按”Enter” 複制 貼上: 離開Copy Mode後,再按”Ctrl + b” ,然後 ] (關括號中括號) 進行貼上 筆者常用的功能就這些,有興趣的朋友可以再深挖一下。 Reference https://tmuxcheatsheet.com/

澳門路牌是澳門歷史的佐證

宗教玄學
熊神進・2024-10-04

Some toponímicas ao papel pictures and texts are peeling off, and citizens are worried that this will affect Macau's feng shui. After the handover, Macau retained Portuguese characteristics, such as Calçada Portuguesa, cesto de lixo, cabin telefónica, candeeiro de rua, Farol da Guia, placas toponímicas a azulejo, etc. These are the focus of attracting tourists from all over the world to visit Macau. Having inspected some places recently, I.A.M. personnel discovered that a batch of newly replaced placas toponímicas a azulejo had quality problems. The personnel spotted the non-compliance with the required manufacturing process and suspected fraud, and the case was reported for investigation. As for placas toponímicas a azulejo suspected of cutting corners, law enforcement agencies have launched relevant investigations and taken temporary remedial measures for placas toponímicas a azulejo that have peeled off to ensure the function of placas toponímicas a azulejo as directional signages. The problematic placas toponímicas a azulejo will be replaced as soon as possible and the work will be completed within the fourth quarter of this year. The placas toponímicas a azulejo in Macau, rooted in the art of azulejos, reflect the city's cultural diversity. Their distinctive blue and white color scheme, adorned with placas toponímicas in both Chinese and Portuguese, has become an integral part of Macau's identity. During the Portuguese reign, the placas toponímicas a azulejo was a testament to the city's multicultural fabric, with the Portuguese language dominating three-quarters of the plate surface area and the Chinese language occupying the remaining quarter. Mickey Hung went to Rua dos Eucaliptos, Parque Industrial Luen San, Coloane last week and saw o placas toponímicas a azulejo. The placas toponímicas were initially supposed to be made of fired ceramics. Now, they are suspected of having papels on the surface of the white tiles, and they are surrounded by an edge pattern that is yellowing and falling off. According to the provisions of the project-related documents, placas toponímicas a azulejo must be manufactured using the "sob esmalte" technique, and the procedure specifications to be followed by the "sob esmalte" method are clearly stated. However, during the inspection, I.A.M. personnel discovered that the placas toponímicas were not fired with "sob esmalte" according to the procedure specifications, and there was a suspicion of cutting corners. O placas toponímicas a azulejo is the quintessence of Portugal and a mirror of Feng Shui, which can reflect the core values of a city. The people's culture of a city is reflected in the mirror, and the Road name sign is a history textbook that prints Macao citizens' past living habits and Macao's historical origin. It's like the early Pátio da Indigência and the people here lived relatively poor lives in the past. Later, the street name was changed to Travessa de S. Paulo on August 19, 1969. There are many ways to name streets in Macau. One common practice is naming them after street landmarks and buildings. However, as time passes, the buildings have been moved away from the streets or disappeared entirely, making the street names somewhat inconsistent. The Chinese street names may change to a new one based on the reality. Like Calçada de Tronco Velho, the place used to be a prison. After the prison was moved, the original Portuguese street name remained unchanged. This shows that placas toponímicas a azulejo is a witness to the history and civilization of Macau. O placas toponímicas a azulejo must not only have appealing outlook, but also have connotation. If it is just a placas toponímicas a azulejo, it will not play a role in feng shui. When O placas toponímicas a azulejo records a piece of history, it is alive and spiritual. There is a story; this is what Feng Shui experts call "spirituality," which is Feng Shui.

哪些女生的八字會爲別人的孩子而犧牲?

宗教玄學
熊神進・2024-10-03

#泰國游覽車失控20名學生和3名老師死亡 泰國上星期的一場游覽車意外,導致無情大火,帶走了20名學生和3名老師的生命,筆者爲遇難者祈福,阿彌陀佛。 在這次的意外中,其中一名身亡的女教師今年剛從大學畢業投入職場,也不幸遇上意外,她被發現時,雙手仍緊緊抱著學生。 據報導車上共有38名學童和6名老師,學童年紀介于3到9歲之間。目前確認25師生被燒, 19人獲救。 泰國是東南亞發生致命交通意外最高的國家,筆者在泰國工作時曾經做過一些統計,每年死于交通事故的人高達15000人(泰國只有8千萬人),如果以這些數字做教材,我們可以找到很多案例幫助八字做印證。今年4月11日至17日,在潑水節交通安全周,泰國共發生2044起交通事故,造成287人死亡、2060人受傷。 今天我講的是八字如何看到女性的母性,當在危急時會保護小孩。原來在女性的八字中,“食”“傷”是女性的子女星,日主是女生,食傷是女生的子女,在正常的生克關係中,食傷可以泄去日主的氣,令日主吐秀,展露原來本性。日主吐秀最忌是印星旺,因爲「偏印」旺就克「食神」,食神受克,真性就不現出來。在五行學上,五行的真情有五種: 木主仁; 火主禮; 土主信; 金主義; 水主智。 五行屬木的女生,她具有仁慈、善良、慈悲的一面,具有母愛,當她遇上意外時,她會站出來保護孩子。 這椿事令筆者想起1992年5月15日發生在中國臺灣省桃園市,平鎮區的一起重大游覽車火燒車事故。當天幼稚園的53名師生及家長的游覽車,預計將前往新竹縣六福村主題游樂園進行校外旅游教學活動,在行經桃園縣平鎮市中興路時因短路起火燃燒,統計共造成23人死亡、9人輕重傷。罹難者之中,一名老師林靖娟因搶救車上的學童而身亡,被入祀臺北市忠烈祠,爲第一位入祀忠烈祠的平民。 林靖娟老師 和Kanokwan Sripong 老師的 大愛行爲遺愛人間,我們不會忘記她們。 正當群衆淡忘二年前的10月7日,泰國一名前警員闖入幼兒中心用刀槍殺害至少37人(包括23名兒童),2年後的10月又來一次23人的不幸離世,我們抱著慈悲的心爲他/她們做烟供,阿彌陀佛。

【七年間短炒騰訊52次勝率達76.92%的方法】

創富坊
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威)・2024-09-26

【七年間短炒騰訊52次勝率達76.92%的方法】 在筆者Patreon 每星期會定期有一些Trading View的語法教學。在今年6月13日Patreon的文章中便講解了「七年間短炒騰訊52次勝率達76.92%」的方法。 若你由2017年1月3日開始買入騰訊並一直持有到今年6月13日,這7年間回報可達到114.57%,即使只買入10萬港元,大約能獲利114570港元。但對很多人來說這根本不可能的。例如在2022年也有很多機構多次增持騰訊,但騰訊股價在低位徘徊不前,到了2023年初便沽貨離場。 要長期持有一隻股票真的要很有「耐性」,這點真的並非每個人都做到,巴菲特被視為大師,最大原因是他真的大部份時間也「坐得穩」。筆者今天並非要教長期持有股票的好處,既然我們沒有辨法也沒有能力長期持有一隻股票,透過短炒又能否有較好的回報? 文章中介紹的就是專用作炒騰訊的方法。若運用30分鐘圖表,由2017年1月3日至今的回報有78.22%,同樣投入10萬港元,回報約78222.6港元,期間交易了52次,獲利的有40次,勝率大約76.92%,平均每次交易持倉時間約413支bar。 若用30分鐘圖,平均持倉時間大約1個月左右,這樣應更合符人性,因為若要持倉長達七年,連很多專家都做不到,但一般散戶要持倉1個月較容易處理。(pinescript 代碼在patreon內容可找到) 筆者patreon: https://www.patreon.com/quantshk


PUI PUI 天竺鼠車車 電影版 MOLMAX
做個有錢人
4DX   史迪仔
銀魂劇場版  金魂篇
英語版  史迪仔
4DX  職業特工隊:最終清算
心之觸碰。
腓尼基大作戰
MX4D 職業特工隊:最終清算
IMAX with Laser 職業特工隊:最終清算
以愛之罪 3rd MIQFF
肌蜜寶貝 3rd MIQFF
白天的我,夜裡的他 3rd MIQFF色情組
酷兒 3rd MIQFF
漂亮朋友 3rd MIQFF
雷霆特攻隊
史迪仔 英語版
罪人們
獵狐行動
關於我和鬼變成家人的那封利是
DAN DA DAN: 邪視
還魂
職業特工隊:最終清算
怪獸8號:Mission Recon
史迪仔
死神來了:血脈
300呎窒息倒數
鐵拳驅魔
獵金•遊戲
送院途中
水餃皇后
雷霆特攻隊*
死亡輪迴
Until Dawn 死亡輪迴
暗算2
破。地獄 加長版
破.地獄 加長版
MINECRAFT:我的世界大電影
PUI PUI 天竺鼠車車 電影版 MOLMAX
做個有錢人