搜尋

搜尋結果

來場推理世界探險之旅吧
其他
皓芯・2022-07-12

『我要把所有的財產,贈與將我殺死的犯人。。』 故事從女主角劍持麗子的前男友死亡說起,故事中二人久未連絡,家財萬貫的前男友榮治,留下一份令人匪夷所思的遺書。遺囑中的遺產分配,除了有一般人想像中的對象,還對前女友們、對自己曾經親切過的人、甚至是自己心愛的小狗和照顧者,都留下了為數不小的遺贈。甚至hellip;殺害他的兇手可以獲得遺產? 日本「這本推理小說了不起!」大賞受賞作得獎小說,作品更被改編影視化,這是本不存在複雜犯案技巧的推理小說。 作者新川 帆立,職業麻將選手,從事律師工作。在16歲時閱讀夏目漱石《我是貓》深受感動,立志成為作家。而她律師生涯的所見所聞,也轉化為小說女主角劍持麗子的塑造養分。 女主角劍持麗子,是一個頭腦靈敏、勢利主義的律師,作為「前女友」的她,也被賦予獲取一部份財產的權利。同時,正因榮治這份奇怪的遺書內容、不可思議的犯人選拔,麗子須幫助委託客戶爭取「成為殺害榮治的犯人」,從而成為了「犯人候補」的代理人。 隨著故事發展,爾虞我詐的爭權內幕,充滿疑點的情節與人物關係,讓人忍不住一直往下翻頁。究竟榮治為何要寫下那樣的遺書呢? 《前男友的遺書》 作者: 新川帆立 譯者: 詹慕如 繪者: 丹地陽子 出版社:春天出版社 出版日期:20211208 ISBN:9789577414731 訂購地點 一書齋 圖片來源博客來誠品劍心

Virtual IP | 為客戶端提供的流動IP
科技新知
MacauYeah・2025-06-11

Virtual IP 雖然我們Docker Swarm、Galera等服務可以很容易地提供到Cluster的功能。但以用戶來講,怎樣知道該連線去那台伺服器,又是另一個問題。用戶不可能逐台伺服器逐台IP去訪問。通常,大家會以為在Cluster服務外部,加個 Load Balancer負載均衡器就已經可以解決問題。但其實Load Balancer本身也需要做Cluster,其中一個掛了,別的也需要頂上。那麼用戶到底是怎樣訪問伺服器的? 我們簡單地,可以經過 Virtual IP 簡稱VIP 來解決這件事。即是把我們網絡服務的域名,綁到VIP上,然後這個VIP可以在不同伺服器上游走,只要有一台伺服器活著,都可以回應這個VIP的請求。而這個VIP的功能,可以經keepalived簡單地做到。 配置 假設我們的配置如下 node 1 IP 192.168.0.2, network interface eth1 node 2 IP 192.168.0.3, network interface eth1 node 3 IP 192.168.0.4, network interface eth1 virtual IP 192.168.0.5 每個node,都有自己的IP,而virtual IP只會附在其中一台機上。 如果在 GaleraCluster 的情況下,可以看成只有virtual IP剛好附在其上的那台機工作,即是以 active passive 的方式運作。 如果在 Docker Swarm 的情況下,在預設模式下就已經有的mesh IP的機制,即使用virtual IP只在其中一台機上運作,但ingress networks都會擴散到所有機器上,所以是active active的方式運作。 設定 Keepalived 在三個node上,都各自安裝 keepalived。以下以 ubuntu 24.04 為例 # ubuntu 24.04 aptget update amp;amp; aptget install keepalived y node 1 的 keepalived 設定 # vim etckeepalivedkeepalived.conf vrrp_instance VI_1 # change interface according to machine status interface eth1 # one node is MASTER, other nodes are BACKUP state MASTER # all nodes in same group must be same value virtual_router_id 101 # higher 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 # VRRP Advert interval in seconds e.g. 0.92 use default advert_int 1 virtual_ipaddress 192.168.0.5 node 2 的 keepalived 設定 # vim etckeepalivedkeepalived.conf vrrp_instance VI_1 # change interface according to machine status interface eth1 # one node is MASTER, other nodes are BACKUP state BACKUP # all nodes in same group must be same value virtual_router_id 101 # higher value will become master priority 99 # VRRP Advert interval in seconds e.g. 0.92 use default advert_int 1 virtual_ipaddress 192.168.0.5 node 3 的 keepalived 設定 # vim etckeepalivedkeepalived.conf vrrp_instance VI_1 # change interface according to machine status interface eth1 # one node is MASTER, other nodes are BACKUP state BACKUP # all nodes in same group must be same value virtual_router_id 101 # higher value will become master priority 98 # VRRP Advert interval in seconds e.g. 0.92 use default advert_int 1 virtual_ipaddress 192.168.0.5 然後在各node上執行。 systemctl restart keepalived 上述設定中,除了 priority 外,應該所有 config 都一樣。state指的是初始化狀態,在 priority 不為255的情況下,即使設定 MASTER 或 BACKUP ,也會動態改變。又因為 priority 不是動態改變的,為方便管理及人眼辨識,筆者認為priority最高的那個node應該預設為MASTER,可以減少日後發生誤會。 如果一切正常的話,192.168.0.5只會出現在node1上。當node1掛了,192.168.0.5才會出現在node2。當node1、node2同時掛了,192.168.0.5才會出現在node3上。這個VIP,同一時間只會出現當時活著的機器中,priority最高的那一台。priority 最高的那一台,它的狀態為MASTER。這些狀態,我們可以經以下指令確認 # confirm state systemctl status keepalived # confirm ip ip a grep 192.168.0.5 Keepalived 可能的異常 如果 Keepalived 之間無法溝通,每個node都自認為MASTER,192.168.0.5會同時出現在所有node上。這個情況下,網絡請求還是可能的,但當真正出現 failover 故障轉移時,因為 ARP Address Resolution Protocol 等問題,路徑可能無法那上跳到活著的機器上,通常要等個十幾秒才會恢復。在前述的設定中, advert_int 就是各node溝通的時間間隔,以秒為單位。正常若果只有一個MASTER的話,failover可以在一至兩秒內完成。 造成 keepalived 無法溝通的原因很多,其中一個就為設定上的失誤,筆者初期就試過誤設定 virtual_router_id 。在有需要溝通的機器中,應該設定為相同的值。另一個原因則是防火牆,所幸的是 ubuntu 24.04 中, iptables 預設就接受它們之間的連線。如果是其他 Linux 版本,遇到無法溝通的情況,所以先關掉 iptables 服務,或者把 iptables 上的所有 rule 刪掉再試試。

Spring Boot 08 - 多情境設置 maven profile 與 application.properties 進階篇
科技新知
MacauYeah・2025-03-11

上期我們介紹完最直觀的用法,這期我們再來討論多管齊下的方向。 在開始之前,筆者總結一下上期的 Profile 的要點。 Spring boot 是經過 spring.profiles.active 去選擇什麼 spring boot Profile 生效 spring.profiles.active 它可以在runtime運行時動態更改 maven 是經過 xml 去選擇編譯時的 maven profile maven 編譯時為 spring.profiles.active 填入一個固定值 另外,筆者亦在測試途中,發現一個現像。 maven 並不提供混合 profile,即使下指令同時觸發兩個 profile ,最後亦只有一個 maven profile 生效。但這個部份筆者未在官方文件中找到,大家如果有任何發現,可以幫忙修正。 Spring boot 混合 Profile 當我們經IDE編譯時,可以為 spring.profiles.active 填入多個值,各值之間用逗號分隔,就可以觸發多個 profile 。 spring.profiles.active=dev,uat 程式碼中的application.properties, applicationdev.properties, applicationuat.properties 都會生效 Spring boot會先後載入上述三個檔案,如果有重複值,後面出現的會覆蓋前面的值。 spring.profiles.active如果填入的值與現在的applicationxxx.properties不匹配,該部份不生效,例如 spring.profiles.active=dev,uat 程式碼中只有application.properties, applicationdev.properties,但沒有applicationuat.properties Spring boot會先後載入上述兩個檔案 上述的都好理解,當大家都接受上面的結論後,再來看這個現像。 spring.profiles.active 是啟動spring boot時,作為選擇profile的依據。 application.properties可以有一個預設的spring.profiles.active,正常跑spring boot就會看它。 正常跑spring boot時,還可以通過傳入參數spring.profiles.active=xx,改變那個值。 Spring boot test 因為結構特殊,它只會看到 application.properties 中的那個spring.profiles.active值。 Spring boot test 暫時沒有方法傳入參數spring.profiles.active,但可以經程式碼 @ActiveProfiles 硬改運行中的 profile 。spring.profiles.active亦只會顯示 application.properties中的那個值。 Spring boot 混合 Profile 例子 大家看完概念之後,可以來看看實際例子。 當什麼都不加,就是根據application.properties的spring.profiles.active來啟動profile。 mvn clean compile springbootrun # or mvn clean compile package java jar targetspringbootprofile0.0.1SNAPSHOT.jar 正常springbootrun的情況下,可以經的 spring.profiles.active 覆蓋過application.properties內的值。 mvn clean compile springbootrun Dspringboot.run.arguments=quot;spring.profiles.active=dev spring.profiles.active=uatquot; mvn clean compile springbootrun Dspringboot.run.arguments=quot;spring.profiles.active=dev,uatquot; # or mvn clean compile package java jar targetspringbootprofile0.0.1SNAPSHOT.jar spring.profiles.active=dev spring.profiles.active=uat java jar targetspringbootprofile0.0.1SNAPSHOT.jar spring.profiles.active=dev,uat 上述例子,若dev,uat內的值沒有衝突,沒有覆蓋問題。但如果有衝突,最後會是uat內定義的值。 Spring boot test Profile 例子 因為不是正常springbootrun,所以那些參數都沒有用,具體只會看application.properties內預設spring.profiles.active mvn clean compile test Dspringboot.run.arguments=quot;spring.profiles.active=dev,uatquot; # arguments will be ignored, same as mvn clean compile test Maven Profile 例子 加入Maven之後,就可以修改application.properties內的預設spring.profiles.active。但要注意,maven只會有單profile 假設pom.xml如下 application.properties如下 spring.profiles.active=@active.profile@ 下述三組例子,有且只有uat生效。因為maven的uat生效後,會修改 mvn clean compile springbootrun Puat # or mvn clean compile package Pdev Dci=true java jar targetspringbootprofile0.0.1SNAPSHOT.jar # or mvn clean compile test Puat 當然,你想要弄一個maven mix profile 也可以 以下例子可以令 dev, uat 同時出現在spring.profiles.active mvn clean compile springbootrun Pmix # or mvn clean compile package Pmix java jar targetspringbootprofile0.0.1SNAPSHOT.jar # or mvn clean compile test Pmix Maven Profile Spring boot test例子 上述例子都了解後,最後就來看看全部混合的情況 當Test case中沒有硬改 profile 定義,application.properties中的spring.profiles.active就直接作用。以下情況就是同時運行dev,uat java @SpringBootTest class ProfileTests bash mvn clean compile test Pmix 當Test case中有定義@ActiveProfiles ,application.properties中的spring.profiles.active的值會保留,但不在該test case中生效。以下情況就是同時運行uat,dev,但讀取spring.profiles.active的值會是dev,uat。 java @SpringBootTest @ActiveProfilesvalue = quot;uatquot;, quot;devquot; class MultipleProfileUatDevTests bash mvn clean compile test Pmix 如果我們把maven 指令中的加入package,預期 test 執行的是 uat,dev 。而 jar 的打包結果會是 dev,uat。 java @SpringBootTest @ActiveProfilesvalue = quot;uatquot;, quot;devquot; class MultipleProfileUatDevTests bash mvn clean compile test package Pmix 但請盡量不要這些做,因為會越來越混亂,特別是打包 prod 環境。為減少出錯的機會,例如test污染了prod的環境,筆者在package時,通常都會跳過test。 mvn clean compile package Pprod Dmaven.test.skip=true