搜尋

搜尋結果

Spring Boot 01 - 萬物始於Spring boot context
科技新知
MacauYeah・2024-01-16

Spring Boot 01 萬物始於Spring boot context 筆者早些時候向一位朋友討論,為何Java那麼不受歡迎。朋友一句就回答,Java煩爆,沒有人會喜歡。 老實講,Java在句法上,實在囉唆。但以筆者的經驗,即使使用其他語言和開發框架,在實戰到一定複雜程度下,其實也一樣煩爆。 而現在的Java框架中,就以Spring boot的入門門檻低。筆者從Spring boot 1.x用到現在的3.x,也真的感受到更多的簡化,所以筆者也加入一起推廣Spring boot的行列。筆者將會通過一系列最小的可執行程式,為大家講解Spring在Web和資料庫上的應用。 所以現在就不廢話,馬上開壇作法 快速下戴模版 使用Spring initializr,可以很容易就建立一個以Spring boot starter為底的java project。大家可以使用Spring 官網又或是vscode plugin 快速地建立一個maven或gradle project。筆者較為熟悉maven,就以maven起一個範例。 在使用Spring initializr有幾件事必需要指定的 Spring boot version 3.x.y 或以上 Language java Group Id 請選擇有意思的域名,如果你用github,可以選 io.github.yourusername artifactId 這個範例的名字,例如commandline Packaging type 本次使用jar,日後若開發web 應用,可以使用war Java version 17或以上 之後就不用選了。若你經官網起範例,你會得到一個zip檔,下載後解壓縮。若你使用vscode插件,最後插件會叫有一個位置儲存。它們都是最後也是會得到同一樣範例Java project。 你使用Vscode,Intellij打開,IDE都會自動辨識到它是java maven project,同時會顯示java和maven結構。道理上你用Intellij 應該可以無腦開始編譯Community 或Ultimate版都可以, Vscode有安裝Extension Pack for Java也會開始自動編譯。不想麻煩,也可以試用Github Codespaces java。Github Codespaces其實就是一個雲上的vscode,經網頁可以連到Github VM內的vscode,所以它也會有齊Extension Pack for Java等插件。 筆者最後也會上載已完成的範例,它也可以在Github Codespaces上以Java執行或繼續開發。 打開project中的pom.xml,它為我們添加了兩個很重要的lib org.springframework.boot springbootstarter ... ... org.springframework.boot springbootmavenplugin springbootstarter是重中之重,它定義了怎樣動態地設定日後的其他lib,它是讓我們可以無腦設定的一個關鍵。但若大家有很多客制化的設定,就要返撲歸真地逐個lib叫起。 maven在預設情況下,只會負責編譯和打包目前的project原始碼。所有相關依賴就是xml中的dependency,並不會自動包起。而springbootmavenplugin,就是幫我們把相關依據都包在一起,讓你的jar可以獨立行起來。 註 若大家在開發lib jar,並不是一個獨立執行的jar,也就是原始碼上沒有main函數,大家就不應該引用springbootstarter和springbootmavenplugin。 我們繼續看其他原始碼,整個資料夾就像以下那樣。 . HELP.md pom.xml ` src main java ` io ` github ` macauyeah ` springboot ` tutorial ` commandline ` CommandlineApplication.java ` resources ` application.properties ` test ` java ` io ` github ` macauyeah ` springboot ` tutorial ` commandline ` CommandlineApplicationTests.java CommandlineApplication是我們有main函數的java class。我像可以經過IDE運行main又或者下指令mvn springbootrun來執行。 正式開始我們的Commandline開發 我們在CommandlineApplication.class中,加入新的程式碼,實現ApplicationRunner和它的函數run。 package io.github.macauyeah.springboot.tutorial.commandline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; other import @SpringBootApplication public class CommandlineApplication implements ApplicationRunner static Logger LOG = LoggerFactory.getLoggerCommandlineApplication.class; public static void mainString args SpringApplication.runCommandlineApplication.class, args; @Override public void runApplicationArguments args throws Exception args.getOptionNames.stream.forEachoptionName gt; LOG.debugquot;option namequot; optionName; args.getOptionValuesoptionName.forEachoptionValue gt; LOG.debugquot;option valuesquot; optionValue; ; ; LOG.debugquot;program end.quot;; ... 這個run函數很直白,就是更好地演譯main中的String args。 但大家還要看清楚,這個main並沒有直接執行run。其實它是靠SpringApplication.run及@SpringBootApplication,跑一堆自動設定,最後因為傳入CommandlineApplication.class是一個Spring 可以處理的ApplicationRunner,所以才呼叫它的CommandlineApplication.run。 換個講法,如果今天做的是web應用,傳入去的就會是SpringBootServletInitializer,這個SpringBootServletInitializer也不一定跟main是同一個class。 如果大家有興趣,可以經過反編譯器,點入@SpringBootApplication看它的原始碼,你就可以看到它其實代表了很多自動化的東西。如果我們只做一些在同一個模組下生效的事情,《自動化》極大地降低了大家入門門檻。一般來講,如果大家不在意程式碼的複用度,比較少機會自行設定,自動化已經很有用。而隨著系統規模增加,多模組就慢慢地顯得重要,在大家了解完基本的Spring後,著者再從測試用途test case入手,為大家介紹如何手動設定。 Source Code Commandline Application

新購機票可免費更改之航空公司匯總
激安優惠
OHChance 旅遊誌・2020-03-10

目前已經有多間航空公司推出於特定時間內預訂的全新機票,未來一定時間內可免手續費改期及航點的特別措施。以下各航空公司的特別安排除非是特別作了注明,否則適用其公司下之所有航點;亦除非另外註明,否則航空公司容許的免費更改只限一次。  《國泰國泰港龍航空》購票日期:3月9日至4月20日出發日期:2021年2月28日或之前新行程完成日期:2021年2月28日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 註:國泰國泰港龍航空可無限次免更改手續費(但每次都有可能要補差價) 官方公告:httpswww.cathaypacific.comcxzh_HKofferscollectionunlimitedchangeswithoutcharge.html  《新加坡航空勝安航空》購票日期:3月6日至3月31日出發日期:2021年3月31日或之前新行程完成日期:2021年3月31日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.singaporeair.comen_UKsgmediacentrenewsalertid=inrass4b  《漢莎集團:包括漢莎航空 瑞士航空 奧地利航空 布魯塞爾航空 多諾米航空》購票日期:至3月31日出發日期:12月31日或之前新行程完成日期:12月31日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.lufthansa.comhkenflightinformation.html  《荷蘭皇家航空 KLM》購票日期:至3月31日出發日期:5月31日或之前新行程完成日期:5月31日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.klm.comtravelhk_enprepare_for_travelup_to_dateflight_updateindex.htm  《北歐航空 SAS》購票日期:3月5日至3月19日出發日期:8月31日或之前新行程完成日期:8月31日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 註:挪威、丹麥、瑞典之間的機票,及上述三國的國內機票不適用。 官方公告:httpswww.flysas.comhkenlowfarecalendar 《芬蘭航空》購票日期:3月9日至4月30日出發日期:11月30日或之前新行程完成日期:11月30日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.finnair.comhkenflightinformationtravelupdates 《阿聯酋航空》購票日期:3月6日至3月31日出發日期:不限新行程完成日期:原購票日期起計11個月內可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.emirates.comhkchinesebookaboutbookingonlinebookwithpeaceofmind  《阿堤哈特航空》購票日期:3月8日至4月7日出發日期:3月22日起新行程完成日期:無特別註明可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:(資料來自官方宣傳電郵)  《美國聯合航空》購票日期:3月3日至3月31日出發日期:不限新行程完成日期:原出發日期起計12個月內可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:可,原機票價值可用於折抵新購機票 官方公告:httpswww.united.comualzhhkhkflytravelnotices.html#ChangeFeeTerms 《美國航空》購票日期:3月5日至3月31日出發日期:3月5日至2021年1月30日新行程完成日期:原出發日期起計12個月內可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.aa.comi18ntravelinfonochangefeetermsandconditions.jsp 《達美航空》購票日期:3月1日至3月31日出發日期:3月5日至2021年2月25日新行程完成日期:2021年2月28日或之前可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:可,原機票價值可用於折抵新購機票 官方公告:httpswww.delta.comusenadvisoriesotheralertscoronavirustravelupdates  《英國航空》購票日期:3月3日至3月16日出發日期:無特別註明新行程完成日期:原出發日期起計12個月內可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.britishairways.comenmoflightsandholidaysflightsbookwithconfidence 《維珍大西洋航空》購票日期:3月4日至3月31日出發日期:至2020年9月30日新行程完成日期:至2020年9月30日可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpsflywith.virginatlantic.comgbennews.html#nofee 《新西蘭航空》購票日期:3月5日至3月31日出發日期:無得別註明新行程完成日期:無得別註明可否改期:可,免手續費,需補差價可否改航點:可,免手續費,需補差價可否退票:按照原本票規 官方公告:httpswww.airnewzealand.comtravelalerts#GdAzlHKDvHtcugY2znHv 《酷航 Scoot》購票日期:3月10日至5月14日出發日期:不限新行程完成日期:無得別註明可否改期:可,免手續費,需補差價可否改航點:不可可否退票:按照原本票規 註:同一訂單內的所有乘客需要一起更改,不可分拆 官方公告:httpswww.flyscoot.comzhtwbookwithconfidence === 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 httpsohchance.info 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 httpsohnote.info 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:httpsyoutube.comcOHChanceTravel 睇埋 Facebook 專頁 httpsfb.comohchance 第一時間獲得最新旅遊資訊!

【新加坡】<表演活動> 濱海灣金沙光影水舞秀 ~ 新加坡3大免費燈光秀之一
走遍世界
80後愛旅行✈️・2018-11-16

濱海灣金沙酒店的光影水舞秀是新加坡的三大免費燈光秀之一, 是由激光、噴泉和投影設備的協作下, 展現出一段由音樂、水流和燈光交織而成的迷人故事。 其實在觀賞「光影水舞秀」時可以分為「水舞投影秀」和「金沙激光秀」。 因為在做「水舞投影秀」的同時, 濱海灣金沙頂樓的雷射光束會同時演出。 在濱海灣金沙平台廣場可以欣賞到「水舞投影秀」, 就是噴泉和投影技術的表演。 而濱海灣金沙頂樓的「金沙激光秀」則需要在濱海灣金沙對面的Merlion Park 魚尾獅公園才能看到。 本來我們是打算一天看「水舞投影秀」一天看「金沙激光秀」, 所以我們就先去了Merlion Park 魚尾獅公園看「金沙激光秀」。 結果隔天我們也沒時候去看水舞秀, 算是個小遺憾吧, 唯有下次再去新加坡的時候補上 我們再次來到Merlion Park 魚尾獅公園, 找個能看到對岸濱海灣金沙酒店的好位置。 就算沒有激光秀的映襯, 晚上的濱海灣也是一樣美 除了在岸上觀看「金沙激光秀」, 也可以坐觀光船在海上從另一個角度欣賞表演。 表演要開始了 整個激光秀歷時約15分鐘 我們在濱海灣金沙酒店對岸, 看到的是「金沙激光秀」 而在同一個時間, 在濱海灣金沙酒店邊上演著的是「水舞投影秀」 激光配合著音樂演出, 而這個音樂也就是對岸上演著的「水舞投影秀」的音樂。 真的一雞兩味 附上兩段影音片段, 可以清楚聽到激光秀的音樂啊 在同一時間, 濱海灣金沙那邊上演著「水舞投影秀」 以下圖片轉自官網 濱海灣金沙「光影水舞秀」

馬來西亞 | 沙巴迪加島Pulau Tiga跳島行
走遍世界
背包旅神・2018-06-19

沙巴美美的島太多了,這一趟和朋友們到沙巴,只有一天的空檔,其實朋友們比較想到Kudasang的農場看神山、看牛羊,但個人覺得火山泥好特別,所以把大夥一起拖下海經歷一番驚濤駭浪的探險旅程。 行程:第一個島ndash; 蛇島 在無人島尋找海蛇蹤影第二個島ndash; 白沙島 純白的沙灘第三個島ndash; 迪加島 :浮潛2次午餐火山泥浴 注意:暈船藥mdash; 我們出海當天天氣不太好,乘風破浪1個半小時,容易暈船的還是記得自備暈船藥防蚊液mdash; 前往火山泥的路途需跋山涉水經過一段森林路,蚊子好多 迪加島(Pulau Tiga)位於沙巴首府亞庇西南方約55公里的外海上,是沙巴旅遊勝地之一,這裡曾因為美國實境秀《Survivor》的拍攝地點而聲名大噪,所以才又被稱作「生存島(Survivor Island)」。早晨,到Jesselton Point碼頭搭船出發,大約一個半小時抵達迪加島國家公園(Pulau Tiga Park)。 景點 蛇島 Pulau Ular蛇島是個無人島,因爲有很多海蛇因此得名蛇島,海蛇其實很毒,但白天在睡覺,因此可能在礁石的縫隙中可以找到它的蹤影。 白沙島 沙子細白、花兒朵朵的沙灘加上清澈的海水,美美的沙灘。 浮潛(兩個點) 迪加島Pulau Tiga 午餐時間: 迪加島上有多個火山泥噴口,也有多條步道到達。 走到火山泥處需要爬一段半小時山路,路況濕滑,其實可以選擇赤脚上山。 到達火山泥 火山泥浮力很强 泡完火山泥后,就可以走下山,火山泥不在乎泡多久才見效,而是泡了后要等待它乾了才有效,和敷面膜是一樣的道理。跑完后,走下山就差不多乾了可到海邊冲洗。 海邊也有厠所衛浴可以清洗,因此可多準備一件衣服供換洗。 另外也拍了支影片,詳細記錄了一整天的跳島行程:

【日本。九州自駕】 阿蘇農莊 Aso FarmLand (阿蘇ファームランド) ~ 集合食買玩的大型渡假村! (上)
走遍世界
80後愛旅行✈️・2023-09-20

Aso FarmLand 是位於九州阿蘇地區的大型渡假村 是一個以大自然、健康為主題的公園 住宿地方 園區內集結了運動、餐飲、住宿、體驗、購物等的設施和角落, 基本上足不出園就可以在裡面玩個兩天兩夜 我分別在Aso FarmLand經歷過冬與夏, 截然不同的景色 Aso FarmLand 一共有3個停車場, 其中一個是「住客專用」的 我們把車停在「住客專用」的停車場 ​ 官網圖片 在停車場上就會直接看到通往園區的路, 指示非常清晰 ​ 園區非常大, 現在我們就是在地圖最下方的地方 ​ 坐升降機往下走 ​ 走過長長的隧道後就會到達園區了 ​ 一出隧道就會見到這座大樓, 這是「村莊區」和「皇家區」的前台, check in的地方 什麼是「村莊區」「皇家區」 下面會詳細介紹 ​ Aso FarmLand 入住的時間比較晚, 我記得是下午1600, 對於這點是有些奇怪 因為園區設施很多, 而大部份都是17001800就會關門, 1600才能入住的話, 之後才去玩設施的話時間肯定不夠 所以只能 1. 先把行李寄存好, 先去玩設施之後再回來拿房間; 2. 入住後先玩一些設施, 隔天再玩剩下的... ​ 由於Aso FarmLand 比較大, 房型多, 設施也多, 接下來我就分類來為大家介紹 住 宿 Aso Farmland內共有3種房型, 分別是「村莊區」、「皇家區」和「夢幻地帶」 依價錢和美觀度是「夢幻地帶」gt;「皇家區」gt;「村莊區」 ​ 官網圖片 Aso Farmland的幅員非常大, 「村莊區」和「皇家區」的房間可能離前台非常遠 ​ 官網圖片 所以可以坐這種園內的巴士到目的地 ​ 「皇家區 Royal Zone」 在地圖上可以看到「皇家區」的房間非常多 幸好我們住的是55號房, 離前台大樓很近 要是住到74號房就... ​ 「皇家區」有自己的一個範圍 ​ ​ 我們住的55號房, Aso FarmLand內無論哪一個園區內的房間, 都是獨立一間間的 而「皇家區」的特色是每間房內都會有一個小庭院 ​ 房間有點蒙古包的感覺 ​ 一般的設備都一應俱全, 電視機、吹風機、梳洗用品等都齊全的。 所有房門都是用鎖匙設計, 出門或是睡前記得記得鎖門 ​ ​ 像不像雪條 ​ 白天停雪後的「皇家區」 ​ 白雪覆蓋著圓頂 ​ 「村莊區 Village Zone」 「村莊區」房間也是非常的多, 超過300間, 可能要走的很遠很遠 也是非常幸運地, 這次我們住的是A19號房, 也是在前台大樓附近, 不用拉著行李走太遠 ​ 拖著行李走一會就找到了A區 ​ A19就在眼前 ​ 「皇家區」和「村莊區」外觀上最大的分別就是「村莊區」沒有小庭院 大門隔壁就是別的小屋 ​ 房間內部其實和「皇家區」差不多, 我們三個人住一起, 訂了個4床房 ​ 放了4張床空間都還有很多, 不會擠 ​ 浴室簡潔 ​ 特別要拍一拍這個天窗, 這是什麼類型的房間都有的 天窗沒有窗簾, 是個叫你起床的神物 ​ 這是和旁邊房間的距離, 不會太近, 蠻有私隱度的... ​ 「夢幻地帶 Dream Zone」 「夢幻地帶」是完全獨立於前兩種房型, 連前台的地方都不同, 需要到「夢幻地帶」專屬的前台Check in ​ 這就是Dream Zone的前台, 還沒進去已經feel到很夢幻 ​ 一般情況下, 住在普通區域的住客是不能進入Dream Zone的 我們是因為小外甥們住在「夢幻地帶」, 我們就跟著一起進來參觀囉 這是「夢幻地帶」的前台, 真的很適合帶小朋友來住 ​ 「夢幻地帶 Dream Zone」一共才26個房間, 如果想訂這區房間的話, 一定一定要提前預訂 我們幫忙訂房的時候也已經慢了點, 最可愛的房間已經沒了, 熊本熊房更是早早就沒了 ​ 走進Dream Zone, 童真都回來了 每個房間都非常有特色 光是外型已經讓小朋友開心死了 ​ 因為住在這區的基本上都是帶小朋友來的, Aso FarmLand也很貼心的弄了很多小孩會喜歡的元素 ​ 光是粉紅色, 已經讓我愛不惜手 ​ 這是士多啤梨草莓為主題的房間 ​ 還有西瓜 ​ 糖果蛋糕 每個房間都裝飾得非常細緻, 連房號牌都是貼合主題的 ​ 上面看到的都是女孩子喜歡的房間, 當然不能忽略男孩啊 這個應該是潛水艇 ​ 當然還有足球房 ​ 最後怎能少得了熊本熊呢 ​ ​ 小甥們住的是蘑菇房 ​ 小朋友住在Dream Zone真的會超開心的吧 ​ 房間內是比「皇家區」和「村莊區」要新淨 ​ 牆上會按照不同主題的房間有不同的裝飾和圖案 ​ 還有這個「會叫你起床」的天窗, 也有裝飾的 ​ 同場加映冬天的雪景Dream Zone ​ ​ ​ 冬天來Aso FarmLand 的確會比較少人啊 ​ ​

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 刪掉再試試。

Docker環境參數化 - Arg VS Env
科技新知
MacauYeah・2024-03-26

Docker Variable control 我們在Docker Image的打包時,最簡單當然就是每個步驟都使用最新版本。例如Docker Base Image,大家可能選用latest tag,安裝linux package (Linux包),也可能就apt install yum 安裝最新的穩定版本。但如果我們想要更好地做測試,就要使用指定版本,方便追蹤問題。而Docker在打包和運行時,都有不同的方式讓大家定義或覆寫指定參數。 Docker build arg 我們先從打包Image開始。 例如我們需要使用一個Base image為 ubuntu,版本預設為22.04,但有需要時可以經build指令覆寫,可以這樣寫 ARG ubuntu_version=22.04 FROM ubuntu$ubuntu_version # default ubuntu_version=22.04 docker image build t test2204 . # or overwrite by buildarg docker image build t test2404 buildarg=quot;ubuntu_version=24.04quot; 雖然Dockerfile的RUN指令都是使用linux shell,但在Dockerfile中想表達條件控制(if else statment)就不太易看。在外部加入script做控制,是另一個可行的後備選擇,它更可以連image名字也進行參數化。 # in bash script, you also can if $beta == true then ubuntu_version=24.04 else ubuntu_version=22.04 fi docker image build t test$ubuntu_version buildarg ubuntu_version=$ubuntu_version Docker Container Run and Docker Compose 一般來講,Linux Container 在執行時,就等於進入Linux Shell。也就是,我們可以使用Shell中的環境變數。 我們在打包Image前,已經可以在Dockerfile中定義自己的ENV數參(也就是環境變數)。與前面的Build Arg有所不同的是,ENV是定義在Dockerfile中,在Container運行時以環境變數的形式存在,它也可以在運行中被改變。而Arg,則只在打包Image時存在,運行期間就不存在了。(當然,你在打包時,用Arg傳入Env,以運到這個目的。) 另一個更特別的性質是,那怕ENV沒有定義在Dockerfile中,我們運行時也可以加入更多的環境變數,大家就當成是一般Linux操作,隨時在自己的shell中加入變數。 # e, env for inline variable # envfile for file docker container run e MYVAR1 env MYVAR2=foo envfile .env.list ubuntu bash 同樣地Docker compose,也支援環境變數。筆者建議environment可以使用Array格式,日後可以更方便地直接改為env_file。 # dockercompose.yaml services ubuntu image ubuntu22.04 environment RACK_ENV=development SHOW=true USER_INPUT 上述的寫法沒有任何問題,不過如果你的dockercompose.yaml是放在git等版本控制中,你更新環境變數就有可能會影響到其他人,這時你就會想轉成env_file。 dockercompose.yaml預設就會讀當前資料夾的.env,就算不存在,也可以正常運行。(當然,大家的ImageContainer應該要有預設值) # dockercompose.yaml services ubuntu image ubuntu22.04 # if env_file is not defined, it will load .env. # or you can load the specific file. # env_file # .a.env env_file內,每一行就是一個變數 # .env or a.env RACK_ENV=development SHOW=true USER_INPUT 使用預設的.env還有一個好處,就是我們可以把dockercompose.yaml也變成受環境變數控制。 # dockercompose.yaml with variable control, only works in default .env services ubuntu image ubuntu$ubuntu_version # .env ubuntu_version=22.04

手遊最佳獨立遊戲|本週手遊重點推介 2021/06/14-06/20
手機‧電玩
MacauYeah・2021-06-21

上星期手遊新聞不算多,今週就爆點滿滿 仙劍奇俠傳九野 仙劍奇俠傳這個IP,就一直是國產遊戲的傳奇,當時由電腦版DOC 起就開始發行,之後一直都是產國遊戲售量的保證。不過遊戲市場一直在改變,缺乏3A開發水平的傳統遊戲,當然就慢慢追不上現時的PC市場。雖然PC版沒有去到國際水平,近年來國產手遊的水準就一直提高,終於,仙劍奇俠傳九野,又再回到大家眼前。 遊戲是以卡牌的型式進行,配以Roguelike的型式進行,很有之前大熱一時的《月圓之夜》的味道。 遊戲現在已經可以正式從港澳台下載啦 httpsapps.apple.commoappid1565329620 httpsplay.google.comstoreappsdetailsid=com.softstar.sh.jiuyetw 6月26日更新說明:貌似iOS版本連結被回收了,遊戲暫時回到事前預約階段,已下戴的App亦不能再繼續登入。詳情要再等官網公告 httpsjy.softstargames.com.twevent202106pc 煙雨江湖 都說了國產手機遊戲水平不斷提高,所以筆者還準備了另一款國產遊戲介紹給大家:手機武俠RPG《煙雨江湖》 遊戲業內一致評得:2020最佳獨立遊戲、最受歡迎單機遊戲 大家唯一一個沒法接觸到它的原因,就只是因為它去年只有在中國地區上架。而現在,它亦總於準備好要向港澳台市場出發啦。 港澳台預約連結 httpsapps.apple.commoappid1559873812 httpsplay.google.comstoreappsdetailsid=com.wuxia.novastar 官方網站 httpswww.novastargame.netyanyu 天地劫 最後一款要介紹的,也是華語地區的老牌IP:天地劫 天地劫的名聲可能沒有仙劍這麼響,但當年單機時代,筆者也有玩過其中一集:《幽城幻劍錄》一段時間。它給筆者的一個很強烈感受,Hardcore RPG,超級難。 就是因為一個太有深度的難度和文本設計,而且在那個網絡還不算強大的年代,筆者估計,可以玩懂天地劫系列的人就不多了,所以它的名聲不夠響,也是可以理解的。 不過,作為經典,它終於有機會復生了。 雖然還沒有公佈遊戲內容,但以官方網站提到的美術設計和音樂來看,這個重生的IP,真的超一流。 官方網站 httpstdj.gamebeans.com OST原聲音樂 httpstdj.gamebeans.comgallerygallery.html#firstPage

【Vlog】山長水遠過大海為影一張相!?仲差啲入獄..|歡樂馬介休|
歡樂馬介休
bacalhau・2019-01-29

山長水遠過海為左影一張相!? 仲要差啲入獄.. 【馬介休豬年「好頭好尾」網上訂購套餐!】豬年開個靚頭、戴頂靚帽「豬豬I笠U」mdash; $98旺到埋個靚尾、條尾好好捽「豬籮Pat」mdash; $88 凡於海外購買豬帽或豬籮Pat,隨豬附送玩員Yes卡及揮春一張,送完即止! 港澳同價(豬豬~郵費請貴客自負~噶) 馬介休自家設計,包你由頭贏到尾,豬到飛起!想要華浚同RICO的揮春同Yes卡,喺以下呢個Link訂購啦: 華浚:httpsgoo.glformsvc8g69ExRus018pw1 RICO:httpsgoo.glformssCAJOQjel3e1HKgU2 ▲2019年,記得繼續睇我地嘅片,訂閱、留言同埋Share出去啊! #年宵 #豬年 #網購 快快訂閱【歡樂馬介休Youtube專頁】 右上角紅色訂閱按鈕啊BB 速速讚好【歡樂馬介休Facebook專頁】 httpsgoo.gl5y9aWC 慢慢追蹤【歡樂馬介休Instagram專頁】 httpsgoo.glkHYhRc 齊齊聊天【歡樂馬介休Facebook群組】 httpsgoo.glxwKkno 〔馬介休女玩員粉絲專頁〕 BOBO粉絲團:httpsgoo.glSSZsgL 啊花粉絲團:httpsgoo.gl8nyf5i VIVI粉絲團:httpsgoo.glB75RKm 芊華粉絲團:httpsgoo.glg6fjb6 〔馬介休男玩員粉絲專頁〕※就睇下有無人like男仔 龍哥粉絲團:httpsgoo.glRMn4eX 華浚粉絲團:httpsgoo.glFc2Zbw 黑GAP粉絲團:httpsgoo.glvi5XTU RICO粉絲團:httpsgoo.gl2mjPeV 微信公眾號/微博/騰訊視頻/土豆網/美拍:欢乐马介休

香港 | J.S. Foodies
全球飲食
原來世界這樣大・2019-01-25

又一大熱的日式班戟店J.S. Foodies再度打進香港,當然引來不少Pancake迷前來一試,而我也不例外了。幸好現在的工作模式,可以讓我避開繁忙時段,等了15分鐘即可入座,對於只可以在繁忙時段光顧的打工仔,不好意思囉! 簡潔的J.S. Foodies與充足的光線,走一貫日式餐飲店,不過與Flippers不一樣的是J.S. Foodies 的菜單上提供了Pancake以外更多的選擇,可以在同一地方吃到主食和甜品,不須再多為去哪裡吃甜品而煩惱。 人流不算太多,總叫我們可以寫意地吃個午餐。和朋友分享著兩款主食,首先要介紹的是蕃茄海鮮意粉,賣相吸引。特別的是他的蕃茄醬汁偏甜,反而沒有平時的茄醬意粉帶點酸意,所以吃起來反而點不一樣呢!另外在意粉上的大蝦、帶子、青口,份量都挺多的! 在點單時,可以叫店員幫忙把漢堡切成一半,跟朋友分享更為方便。以木板擺放著薯條和經典漢堡,是聊天必備的小吃。而漢堡方面,也有幾款配料選擇。更為我驚喜的是漢堡內的牛肉,Juicy多汁呢!即使是內外也不是「乾爭爭」的感覺 ,是少數做得不錯的漢堡呢! 吃過主餐後,到我們期待的甜食出場了。不過製作也要點時間,所以差不多吃完主餐再點就剛剛好了,我們貪心地點了兩個甜食,去到最後又基於不想浪費,吃得有點吃力,還是勸大家要量力而為啊! 我們點了Flippers Pancake。水準跟Flippers一樣,都是令人滿意的,鬆軟美味!現在有太多這類的空氣感Pancake了,難免會有比較,但即使如此,Flippers和J.S. Foodies 也有信心保證,不會失望而回。下次想吃Pancake的,不用過海到銅鑼灣吃了! 對法式焦糖班戟充滿期待,那時候的我心裡沒有其他,只有法式焦糖班戟!終於來到我的面前了,這個是J.S. Foodies的招牌,幾乎每枱都會點的,不過要注意並不是每個班戟都會焦糖在表層的! 吃慣了班戟的鬆軟,原來加多一層焦糖更是別的風味,脆得來又帶點甜味,令班戟增加多點味道。除了表層的生果外,班戟之間也藏了半條香蕉,可讓班戟看起來更有層次。咬破焦糖層吃到鬆軟的班戟層,享受每口的滋味,吃起來有一份幸福的感覺!來到J.S. Foodies 怎能不嚐嚐這個呢? 以為沒有太大的飽肚感,誰不知都撐不了肚子,最後戰敗了。老實說的,這個法式焦糖班戟太出色了,真的要把Flippers的都要比下去了! J.S. FOODIES九龍塘達之路80號又一城LG2樓30號舖i.t blue block