搜尋

搜尋結果

docker swarm 回到最基礎的群集組建
科技新知
MacauYeah・2025-11-21

雖然筆者都知道,全世界在講 k8s ,全世界都叫筆者放棄 docker swarm,但無獨有偶,docker swarm 還是有使用的價值。 你只有單個服務在運行,只想要做冗餘或分流。快速地用 docker swarm 做最小可行性産品,推出市場。 傳統的HA功能做到了,但你沒有中央匯整日誌的功能。而你也不想把事情攪得太複雜,使用docker swarm 可以讓你在任何一個管理節點上查看不同 container 的日誌。 你的客戶只提供VM,他可能有自己的k8s平台,但不讓你使用。自建一套docker swarm ,先入場,事後擴展再要求客戶提供k8s,對於客戶來講,先證明系統是有價值的,在金錢成本上或能力上,一定是件比較可以接受的事。 筆者之前介紹過一系列的 docker swarm 教學,但生成群集的部份一直沒有做介紹。因為實在太簡單,所以一直都沒有收納在教學內容當中。但現在考慮其完整性,以及為了讓大家感受一下它有多簡單,所以重新寫了組建群集的步驟。 組成群集 以前各家不同的軟件,想要起一個群集,要左攪右攪,又要重啟。而docker swarm真的很簡單,只要各機中有 docker ,再在各機中順序打指令就好。 node 1 使用docker swarm init docker swarm join-token manager # node 1 > docker swarm init > docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxx xxx.xxx.xxx.xxx:2377 其餘的管理員節點就根據上述的提示,使用 docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxx xxx.xxx.xxx.xxx:2377 就好。只要總數的管理員節點有奇數個就可以了(包括當初的node 1)。即是1、3、5等都可以。這是因為在容錯的情況下,必需由管理節點作出多數決,才能容易地知道判斷是哪些節點出現問題。 如果不為容錯,只想增加可工作的機器,那麼我們只需要增加工作節點。我們可以在任何管理員節點生成docker swarm join-token worker > docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-yyyyyyyyyyyyyyyyyyyyyyy yyy.yyy.yyy.yyy:2377 若想要檢查各個節點的工作狀態,在管理員節點上執行 docker node ls 看到了。 docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION xxxxxxxxxxxxxxxxxxxxxxxxx * node1hostname Ready Active Leader 28.5.1 yyyyyyyyyyyyyyyyyyyyyyyyy * node2hostname Ready Active Reachable 28.5.1 全部教學請見 https://macauyeah.github.io/AProgrammerPrepares/VMDockerNotes/SwarmModeCommandCN.html

排程執行任務 | Linux Schedule Job
科技新知
MacauYeah・2023-09-07

在Linux底下,crontab是一個最簡單建立Schedule Job的方法。大家用crontab -e 就可以進入設定。 # crontab -e */1 * * * * /opt/run.sh 其中每個星號,順序代表的是分、時、日、月、星期。上面的例子就是不論何月何日何時,只要每一分鐘就執行一次/opt/run.sh Singleton Job 問題是,實際情況下,你想執行程式的時間都不一定會少於1分鐘。所以你總是有機會上一個job未跑完,下一個job就開始了。為了保障自已,需要一些參考機制,去決定是否讓job開始跑。 有些情況,可能你會想用job server去做監管,但若只為單線執行的工作,起一個job server還是會增加管理上的複雜性。 最簡單的做法,就是根據不同的程式語言,使用file lock(鎖上)的機制,先上鎖,再做事。但要注意考慮有沒有出現異常情況,令你自己反鎖自己。即是你的process死了,但不懂自己解鎖,這樣以後你也不能再執行了。 在Linux Bash Shell下,就有一個很簡單的做法,就是使用flock指令。用它的最大好處,就是從OS層面下,去鎖上。只要process結束了,不論正常還是不正常結束,都會自動解鎖。 以下例子就是在執行/opt/run.sh前,先要取得/tmp/run.lockfile的鎖。如果沒法取鎖,就自動放棄執行後面的指令。 flock -n /tmp/run.lockfile /opt/run.sh # crontab -e */1 * * * * flock -n /tmp/run.lockfile /opt/run.sh Timeout 引入singleton的概念後,其實會引發另一個問題。因為異常的情況,還有機會是不生不死,process hang。所以我們還需要設定一個最大的執行時間,讓你的process在異常的情況下,被強行清走。 例如,ping指令在linux預設是永遠不會自動停止的,可以模擬process hang的情況。如果我們想定時從外部收走ping process,就可以使用timeout指令。以下指令就是2分鐘後殺指ping process。 # in file /opt/run.sh timeout 2m ping localhost # to check process id, you could use # > ps aux | grep ping # you will see two different id for ping and timeout 配合errorcode使用,你可能還會在想在timeout時送出一個email通知自已。 # in file /opt/run.sh timeout 2m ping localhost exitCode=$? if [[ $exitCode -eq 124 ]]; then echo "timeout" # enter email alert with timeout elif [[ $exitCode -gt 0 ]]; then echo "exit with error" # enter email alert with timeout else echo "exit normal" fi 配合docker使用,你可能需要考慮signal怎樣傳遞。 在筆者測試的環境中,似乎SIGTERM會被擋,也有可能是SIGTERM太強,它只把前景的docker container run收走,但其內的ping process還在docker daemon中行走。所以最後改用SIGINT,讓docker container run可以好好地把SIGINT傳入其內。 # It seems that docker captured the SIGTERM. Send SIGINT instead # in file /opt/run.sh timeout --signal=SIGINT 10s docker container run --rm pingtest -c 20 exitCode=$? if [[ $exitCode -eq 124 ]]; then echo "timeout" # enter email alert with timeout elif [[ $exitCode -gt 0 ]]; then echo "exit with error" # enter email alert with timeout else echo "exit normal" fi Full demo, github repo cronjobWithDocker

營養師: 沒有骨質疏鬆也要補鈣
生活在我城
My nutridiary・2019-11-21

“沒有骨質疏鬆就不用補鈣?” 這是營養師在營養諮詢中經常被問到的。讓我們一起了解一下鈣質吧! 鈣質在我們身體內,約99%存在於骨骼與牙齒中,1%則分布在血液、細胞內液、肌肉及組織中,並在身體中扮演了很重要的角色: 有助於維持骨骼與牙齒正常發育及健康。 維持正常的凝血功能。 有助於肌肉與心臟的正常收縮及放鬆。 穩定神經,幫助入睡,提升睡眠品質。 減緩骨質流失,降低骨折發生率。 幫助調控血脂異常,降低心血管疾病風險。 有助於體重管理 (脂肪的代謝是需要鈣質參與的) 舒緩經前症後群 預防抽筋、肌肉拉傷 有效預防高血壓,預防動脈硬化 當體內血鈣充足時,鈣質會儲存於我們的骨骼中;當血鈣濃度下降時,鈣質便會從骨骼中 "釋放" 出來,以供身體正常運作所需。 身體骨骼的骨質大約在30歲會達到最高峰,之後骨質逐漸減少,尤其在女性停經後,骨質減少的速度會加快。如果骨質流失過多,使得原本緻密的骨骼形成許多孔隙,呈現中空疏鬆的現象,就是所謂的「骨質疏鬆症」。 補鈣的原因: 1. 30歲前,可為 "骨骼銀行" 補充多點存款,以供將來 "退休" 之用。 2. 30歲 "退休" 後,"骨骼銀行" 不再接受存款,只接受支出,我們只可每天吃足夠的鈣質,以確保不會動用銀行的存款。(若銀行的存款被支出得多,我們很容易會患上骨質疏鬆症哦!) 補鈣的方式:食物補充及鈣片 提提你,不是吃了就算,我們還要注意吸收率哦。一般植物含有植酸,草酸,纖維素等影響鈣質吸收的因子,因此,植物性的鈣質會比較難吸收, 補鈣小貼士: 乳糖不耐症者可選擇經發酵的奶類製品,如芝士或乳酪。奶類製品儘量選擇低脂或脫脂。 大部分鈣質儲存於骨骼中,我們可以多選擇連骨吃的魚類,如小魚乾,沙甸魚等。 避免與朱古力,菠菜,士多啤梨等富含草酸的食物同食。 進食鈣質豐富的食物時可與富含維他命C的食物同食,可增加鈣質吸收。 鈣片可選擇睡前服用,以減少食物中含有影響鈣質吸收的營養素,也有助舒眠。 選擇鈣片時,除了留意鈣含量的多少外,更需要留意成份表上所使用 "鈣的種類",單單鈣質含量高不等於吸收得好哦! 如有需要建議先諮詢營養師。 高鈣食譜:https://lifemag.cyberctm.com/zh_TW/blog/mynutridiary/8778/%E7%87%9F%E9%A4%8A%E9%AB%98%E9%88%A3%E9%A3%9F%E8%AD%9C 讚好FB專頁:https://www.facebook.com/mynutrinotes/

12號台風“楊柳”已成,廣東局地將有特大暴雨!
其他
澳門生活圈・2019-08-27

今年11號台風“白鹿”剛走不久,轉眼間,12號台風“楊柳”又生成了。 本月27號上午,第12號台風“楊柳”在菲律賓以東洋面生成,中心附近風力最大達8級,風速每秒18米。 中央氣象台預計 台風“楊柳”將 向海南東部沿海靠近 受其影響 南海海域及華南地區 將出現較強風雨天氣 台風“楊柳”將以每小時約30公裏速度向西偏北方向移動,明天早晨或上午穿過菲律賓呂宋島後進入南海東部,然後逐漸向海南島東南部海域靠近,強度逐漸增強。 “楊柳”最強可達強熱帶風暴級或台風級,並可能於30號登陸海南島東南部,也可能經過海南島南部近海,趨向越南北部。 12號台風“楊柳”(熱帶風暴級) 英文名稱:Podul; 名字來源:朝鮮; 名稱意義:一種樹 因受其影響,今天夜間到31號,巴士海峽、南海自東向西風力將逐漸加大到7~8級; 其中29到30號,南海中北部、北部灣有9~10級大風,“楊柳”中心經過的附近海域陣風可達11~12級。 29號至9月1號,海南島、廣東、廣西中南部、福建、江西南部、浙江中南部等地將有大到暴雨,海南島、西沙和中沙群島、廣東沿海、廣西沿海、福建東南部沿海等地將有大暴雨、局地特大暴雨。 由於時間較長,目前其路徑強度預報尚有不確定性,中央氣象台將密切監視其發展變化。 同時,中央氣象台提醒海南、廣東、廣西、福建等地及時做好防禦工作。 素材來源:中央氣象台、網絡 圖片來源:中央氣象台報、微博、攝圖網 如有侵權,請聯系我們刪除 版權屬於原作者 編輯撰寫:小嚕

如果你吃膩了豬扒包,不妨到澳門仔茶餐廳嘗一款新穎的小食吧!
其他
澳門生活圈・2019-08-21

●同步發布媒體公眾號 ●媒體排名不分先後 澳門仔仔脆評測 今天,要為大家介紹的是由店老板推薦的一款新穎小吃,澳門仔仔脆。 如果你已經厭倦了在澳門被推薦的豬排包或者其他面包類的話,那你大可以來嘗試一下澳門仔仔脆這款新穎的面包,表面撒著些許面包糠,然後淋上煉乳。 當我以為是普通的煉乳面包的時候,可切開一看,原來裏面還包含了花生醬以及花生粒。 這居然用吐司的方法制作的出來的面包,這樣的制作保留了面包本身的蓬松感,然後搭配上了外面包糠和花生粒。 就這樣形成了一種甜而不膩的味道而且味道一直彌留在口中,如果這個時候搭配上一杯奶茶,絕對是下午茶的絕配。 這款澳門仔仔脆還得到了店長的熱情推薦,店面裝修整潔衛生,風格趨於上世紀八九十年代的澳門,相信你在這樣的環境下還會別具一番風味。 如果朋友們想要品嘗這樣一款美味的澳門仔仔脆,可以選擇到澳門仔茶餐廳,就在黑沙環馬路(公交站),黑沙環第一街路牌附近,大家可以挑選自己最方便的路線去。 想要嘗試的朋友可以通過憶條街進行外賣訂單,或者到店鋪自取。 店鋪地址 澳門黑沙環第一街5-7號、9-11號錦興大廈地下

澳門麗思卡爾頓酒店「怡世寶水療」呈獻特色療程喚醒感官 重拾活力
美容
LifeMag Editor・2016-08-26

澳門麗思卡爾頓酒店深諳忙碌的都市人,無論生活節奏多急促,不時都需要停下腳步,放鬆身體、煥發疲憊心靈。今年9月起,澳門麗思卡爾頓酒店內屢獲殊榮的「怡世寶水療」將呈獻多款水療禮遇,讓賓客喚醒感官,重拾活力神采。當中包括專為響應10月「關注乳癌月」而特意打造的「Pink Your Life肌膚修護療程」,有助賓客釋放沉重壓力,肌膚重現健康亮澤。此外,還有即時緊緻提升輪廓,延緩衰老的「ESPA面部提升緊緻療程」,以及兼收並蓄東西方療法精髓的「全方位極致護理療程」。上述療程均為滿足每位賓客的需要而悉心設計,帶來膚質改善、心靈升華的全方位水療體驗。 徹底鬆弛身心的水療之旅,始於賓客踏入迎賓大堂的一刻。療程開始前,賓客先獲奉上「怡世寶水療」精心準備的木橘茶,繼而盡情體驗水療中心內形形色色的設施,包括恬靜舒心的獨立浴池、芳香四溢的蒸氣及桑拿房,還有體驗式淋浴間以至寧靜典雅的休憩大堂,喚醒感官活力,迎接自選療程。 「Pink Your Life肌膚淨化修護療程」── 紅泥與杏桃仁增進肌膚健康 粉紅絲帶是全球乳癌防治運動的標誌,代表社會人士對防治乳癌的關注與支持。為了支持這項極n this context2be the treatment perfectly to describe the treatment here3 3具意義的運動,「怡世寶水療」將於10月推出「Pink Your Life肌膚淨化修護療程」,讓賓客親身體驗紅泥及杏桃仁的修護煥膚及深層滋潤效果。療程開始時,理療師會先以輕柔潔膚刷為賓客徹底淨化肌膚,去除死皮,繼而全身敷上滋潤體膜,令肌膚回復水嫩幼滑,重現青春亮澤。此外,理療師更會為賓客按摩面部及頭皮,讓賓客放鬆身體,感到無比舒泰。整項療程需時105分鐘,費用僅為澳門幣1,680元**。賓客更可從多款ESPA 粉紅色系列的修護產品中任擇其一,在家中延續美好難忘的體驗。 「ESPA面部提升緊緻療程」── 三重活性成分延緩肌膚衰老 這項激活細胞再生的「ESPA面部提升緊緻療程」,採用的護膚產品蘊含尖端配方的三重活性成分,有效增加肌膚彈性與緊緻度。90分鐘的面部護理療程旨在紓緩肌肉緊張,並結合超卓的面部提升技巧,延緩衰老現象,刺激骨膠原增生,令肌膚從內到外透出健康神采。整個體驗僅需澳門幣1,580元**。 「全方位極致護理療程」 ── 精選ESPA產品平衡身心靈 賓客可以任選「怡世寶水療」深受歡迎的身體磨砂及芳香身體按摩精油,藉以清除身體毒素,增強抵抗力或修身健體等等,全方位增進健康。療程全長90分鐘,有助鬆弛身體緊張狀態,去除暗啞死皮,重現嫩滑膚質。整個體驗僅需澳門幣1,380元**。 賓客在煥發身心的療程後,可以繼續享用水療中心內的各項設施,又或是在休憩大堂享受片刻寧靜舒泰。「怡世寶水療」更會於11月推出名為「ESPA澳門優越體驗之旅」的30分鐘免費肩背按摩,凡預訂60分鐘或以上療程的賓客均可享用。 如有垂詢,請致電 +853 8886 6608或電郵至espamacau@ritz-carlton.com。 **上述價格須加10%服務費及5%政府稅

張愛玲x王安憶x許鞍華x焦媛,4個女一台戲。金鎖記2017巡迴演出
文化創意
蘇蘇・2017-06-22

張愛玲 一個中國現代文學史上頗具傳奇色彩的個性女作家 王安憶 一個低調扎實的中國當代文學女作家 許鞍華 一個家喻戶曉的最佳導演 焦媛 一個努力創作享譽舞台的創作演員 四個女人,以原著、編劇、導演、主演的身份各就各位,共同製作出一台精彩絕倫、口碑載譽的香港舞台劇<金鎖記>。 <金鎖記>由香港焦媛實驗劇團演出,張愛玲原著,許鞍華導演,王安憶編劇,除了有著名舞台劇演員焦媛飾演曹七巧外,還有香港實力派演員李潤祺飾演的三爺姜季澤、黃嘉威飾演的童世舫和馮兆珊飾演的姜長安,更有多位專業演員同台演出,如此演技派陣容,難怪在各地巡演口碑載譽。 由2009年首演到現在,<金鎖記>於香港、中國及海外各地應邀巡迴演出已經接近100場了,今年3月初開始,劇組先在廣州、珠海、天津、哈爾賓、新加坡、上海、蘇州、深圳和廈門公演,好評如潮,在各地又再掀起了熱潮,這個星期開始,劇組再次收拾行裝出發,將會前往北京、無錫、南京、杭州、成都、重慶等地展開2017年第二次巡迴演出之旅。 早前獲高志森導演邀請前往新加坡Esplanade欣賞該站的<金鎖記>巡迴演出,原來是次演出獲得香港駐新加坡經貿辦鼎力支持,<金鎖記>是在東盟地區慶祝香港特區成立20週年的首個慶祝項目,出席嘉賓香港駐新加坡經濟貿易辦事處陸嘉健處長、中國駐新加坡大使館臨時代辦房新文先生、亞太經合組織 Excutive Director Mr. Alan Bollard、德國領事館 Mr. Jorge Samayoa Rivera、新加坡國會議員馬炎和夫人海燕、緬甸駐新加坡大使 Tin Soe及泰國駐新加坡大使 Thitiporn Chirasawadi,謝謝高導演及焦媛實驗劇團邀請讓蘇蘇親身來到新加坡見證這一切,還遇上香港的資深傳媒前輩們,很開心的旅程。 對,蘇蘇又再看<金鎖記>了,已經忘記了共看了多少次呢,總之很多次了,蘇蘇一直認為一齣好戲跟一本好書一樣,就算看多少次,每一次都可以從中發掘出不同事物不同意義的含意出來,所以每一次我也可以看到不同的東西。 故事內容把從前中國封建社會時代的家族觀念、人與人之間循環不息的勾心鬥角、因父母之命無奈斷送愛情和幸福的痛苦,從而讓人格的扭曲與壓迫,搬上舞台裸露呈現。 一直以來, <金鎖記>都是以粵語(廣東話) 演繹,各個人物的感情在粵語的表演中顯得更加細膩,舞台旁邊設有中文字幕,以保留香港本土文化藝術特色與質素,意外的是,母語是普通話的觀眾亦十分接受,而且大部分觀眾也十分喜歡。 女主角焦媛為著名舞台劇演員,在中國舞台劇界屢獲大獎,她所飾演劇中女主角曹七巧,是一個一點也不容易演繹的角色,不過當你看過她的演繹之後,你就會被她的演技折服,實在太有層次,嘆為觀止。 為什麼蘇蘇這樣說? 戲中的曹七巧從一個十多歲如花似玉對愛情、婚姻充滿憧憬和期待的少女,直到嫁入大戶人家但因身份低微被眾人欺壓而扭曲了人生觀,是個既可憐又可悲亦可恨的角色,焦媛對角色每個階段的性格拿捏非常準確,無論在唸台詞、功架和身段都滿有張力,把人性漸漸步向扭曲的曹七巧演繹得太好了。蘇蘇坐在台下深感震撼,每一次看她都會有雞皮疙瘩的感覺。 其他的演員也相當專業,特別是與曹七巧最多對手戲的姜家三少姜季澤飾演者李潤祺,實力演技派之人,曾演過不少香港電視劇,現主力於舞台發展,能演正劇也可搞笑,他一出場就滿有壓場感。 兩位好戲之人在舞台上擦出的火花,更是讓觀眾們目不轉睛。 另外兩位主要角色,曹七巧的女兒姜長安和未婚夫童世舫的戲份比小說加重了,他們一出場的逗趣互動,腼腆的談戀愛做朋友直到談婚論嫁的方式,讓蘇蘇看得會心微笑,將之前曹七巧逐漸的瘋狂和的怨恨暫時掃除,他們的出現有如釋重負的感覺。 曹七巧的女兒姜長安由香港演員馮兆珊飾演,她是焦實<金鎖記>第一代的姜長安,首度公演以來長安這角色一直都是由她來飾演,長安說話氣若游絲但有抑揚頓挫的變化,入耳動心,聲音也很好聽,也是我心目中膽怯、楚楚可憐的長安模樣,但在後台的她完全是兩回事,她是一位開朗的人,舞台上就是演技。童世舫則由香港專業舞台劇演員黃嘉威飾演,看過他演出的觀眾都知道,他演技收放自如,隨機應變能力高,無論是音樂劇抑或是悲/正劇還是喜/鬧劇的角色,也絕對拿捏準確。 在童先生和長安退婚的那一幕,沒有台詞,僅以光影的人物動作來呈現,有些時候就是無聲勝有聲,這一幕讓蘇蘇有很深的記憶。 七巧的一生不只毀滅了自己,更毀滅了親人,言而這種情況將不會因為她的死去而被終止,反而會無止盡的循環下去,就像小說的結尾一樣。 三十年前的月亮早已沉下去,三十年前的人也死了,然而三十年前的故事還沒完-- 完不了。 張愛玲筆下絢爛又沉重的金鎖,鎖著一代又一代的人,掙扎不成、擺脫不了,呈現了自古以來恆久不變的人性枷鎖,深深的鎖著人們悲劇的命運。 完場時久久不止的掌聲、歡呼聲,演員們數度謝幕也停止不了,這就是對<金鎖記>全體演員和工作人員最好的回報。 6月的第二回巡迴演出,從北京「老舍國際戲劇節」開始,於6月23、24在北京天橋藝術中心大劇院演出,據說兩場爆滿,已經一票難求了。 如果<金鎖記>巡迴演出將會去你的城市而你無論看過抑或沒有看過,都千萬不要錯過,因為如果錯過了將會是你的損失。 演出日期及時間:2017年6月23-24日 演出地點:北京天橋大劇院 演出日期及時間:2017年6月29日 7:30pm 演出地點:無錫人民大會堂 售票網址:http://www.228.com.cn/ticket-243828995.html 演出日期及時間:2017年6月30日 7:30pm 演出地點:南京紫金大戲院 售票網址:http://www.228.com.cn/ticket-248029098.html 演出日期及時間:2017年7月2日 7:30pm 演出地點:杭州劇院 售票網址:http://www.228.com.cn/ticket-245375720.html 演出日期及時間:2017年7月5-6日 8:00pm 演出地點:成都西禪劇院 售票網址:http://www.228.com.cn/ticket-239779862.html 演出日期及時間:2017年7月8日 7:30pm 演出地點:重慶人民大廈 售票網址:http://www.228.com.cn/ticket-240000370.html 每次看完演出,蘇蘇都會有一點幕後花絮,今次當然也不會例外,戲碼完結之後就回來現實世界,其實人生開心與否,在乎的只是你自己的看法,這組照片,蘇蘇有幸福的感覺。 ~~~~~~~~~~~~~~~~~~~~~~ 更多各地吃喝玩樂、美容、潮流、旅遊、演藝、文化或購物資訊、心情話語文章等,繼續以一文多發形式發放於中、港、澳三地多個高人氣時尚生活網站的專欄內,詳情請點擊蘇蘇的 新浪微博: 『蘇蘇的部落』http://www.weibo.com/susannakl/profile Facebook: https://www.facebook.com/sososusanna Instagram: http://instagram.com/sososusanna 時尚生活專欄: ELLE HK 澳門人氣資訊網站CTM ELLE CHINA 中國瑞麗時尚網 搜狐新聞網 (手機Apps) 聯絡及邀約: susannakL88@yahoo.com.hk

因應肺炎疫情航空公司及機票、酒店預訂網站退改安排統整(11-Feb 01:50更新)
旅遊情報
OHChance 旅遊誌・2020-02-11

本文章之原文會不定時更新,原文網址:https://ohchance.info/2020/02/corona-virus-airlines-bookingsite/ 因應新冠狀病毒(俗稱武漢肺炎)疫情,現統整各航空公司涉及香港、澳門的特別退改安排,以及酒店預訂網站的特別退改安排。由於航空公司眾多,未能常規性追查有否變更,如發現資料有錯漏,請至 facebook 粉絲頁 https://fb.com/ohchance 私訊提供,感謝! 註1:航空公司提供退改安排不代表航班會取消。各航空公司的航班取消情況請自行到官網查詢,此處不特別整理。註2:如果航空公司取消航班會另有特別安排,以下僅指不是航空公司取消航班而自願退改的措施。註3:如果你的機票是透過旅行社或網上機票預訂網站預訂,需要循原購買渠道處理,航空公司不能直接受理。註4:退改機票酒店基本以聯絡客服為主,由於近期退改量大,如出發日期是一星期以後的,建議稍後再進行處理。 以下順序為航空公司、機票酒店預訂網站,且按其英文字母排列。  AirAsia 亞洲航空適用對象:1月28日或之前購買、3月1日或之前出發的機票。退票措施:全額退票改票措施:免變更費用及無需補差價,更改至原出發日期前後30天內(改票僅適用於受航班取消影響旅客)。申請日期:原定出發前退改途徑:更改、退票請至亞航官網 AVA 系統自助辦理:support.airasia.com 官方公告:https://newsroom.airasia.com/news/2020/02/06/travel-advisory-airasia-extends-period-of-credit-account-or-refund/tc [菲律賓航線]亞洲航空暫時停止菲律賓來往港澳的航班,1月28日或之前購買且是3月1日或之前出發的旅客可以選擇免費更改航班至原出發日期前後30天內,或全額退款;其他出發日期的未有特別安排。請至亞航官網 AVA 系統自助辦理:support.airasia.com。 官方公告:https://newsroom.airasia.com/news/travel-advisory-airasia-suspends-flights-between-the-philippines-and-china  Air Busan 釜山航空接獲釜山航空通知,將於2月8日至3月29日期間取消所有來往釜山-澳門的航班,受影響旅客會接獲釜山航空通知並協助全額退票。已出發的旅客航空公司會協助安排回程航班。 (早前的自願退改政策)適用對象:1月29日或之前購買、3月28日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,但仍需補機票差價(如有)。申請日期:官方無公告退改途徑:聯絡客服 官方公告(僅有韓文版本):https://www.airbusan.com/content/common/customercenter/noticeDetail?id=3515  Air China 中國國航適用對象:1月27日或之前購買、1月1日或之後出發的機票。退票措施:全額退票改票措施:(無)申請日期:原定出發日期前退改途徑:國航 24 小時客服務熱線:+86-10-95583 官方公告:https://www.airchina.hk/HK/TW/info/news/?FOCUS_CATEGORY_ID=1134&FOCUS_NEWS_ITEM_ID=28JAN_WUHAN_REFUND_NOTICE&NEWS_CATEGORY=HongKongSite  Air Macau 澳門航空澳門航空2月10日至29日期間大量取消航班,仍然執飛的航班可以參考以下官方公告:http://www.airmacau.com.mo/#/business-common?__parameter=eyJkYXRhIjoxODYsInR5cGUiOiJsayJ9 如果你的航班是2月10日至29日飛航,但沒有顯示在上述的列表中,即代表已被取消。如被取消可選擇退票或更改航班。退票請致電客服或電郵至 airs@airmacau.com.mo;希望更改航班的可以進入官網 “不正常航班處理” 系統自助更改:http://www.airmacau.com.mo/#/involuntary 澳門航空於2月6日更新各航線的自願退改安排: [中國大陸航線]適用對象:1月28日或之前購買、6月30日或之前出發的機票退票措施:全額退票改票措施:免變更費用及差價,更改出發日期至6月30日前申請日期:航班出發前 [台灣、韓國、越南]適用對象:2月1日或之前購買、2月29日或之前出發的機票退票措施:全額退票改票措施:免變更費用及差價,更改出發日期至6月30日前申請日期:航班出發前 [日本、泰國]適用對象:2月6日或之前購買、3月28日或之前出發的機票。退票措施:(無)改票措施:免變更費用及差價,更改出發日期至6月30日前申請日期:航班出發前 退票請電郵至 airs@airmacau.com.mo 申請;希望更改航班的可以進入官網 “不正常航班處理” 系統自助更改:http://www.airmacau.com.mo/#/involuntary 以上各航退改安排官方公告:請見澳門航空官網新聞公告  Air Seoul 首爾航空適用對象:1月29日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用更改出發日期。申請日期:原定出發日期前退改途徑:聯絡客服(+82-1800-8100) 官方公告:https://flyairseoul.com/CW/zh/main.do  American Airlines 美國航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用更改至331日內。申請日期:原定出發日期前退改途徑:聯絡客服 +852 3057-9197 官方公告:https://www.aa.com/i18n/travel-info/travel-alerts.jsp?locale=zh_HK  ANA 全日航適用對象:1月28日或之前購買、3月31日或之前出發的機票。退票措施:(無)改票措施:免變更費用更改至4月20日或之前。申請日期:原定出發日期前退改途徑:聯絡客服 官方公告:https://www.ana.co.jp/zh/hk/topics/notice200123/  Asiana 韓亞航空適用對象:1月27日或之前購買、3月31日或之前出發的機票。退票措施:(無)改票措施:免變更費用更改出發日期。申請日期:原定出發日期前退改途徑:聯絡客服 官方公告:https://flyasiana.com/C/HK/ZH/customer/notice/detail?id=CM202001310001194736  British Airways 英國航空適用對象:2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用更改出發日期。申請日期:原定出發日期前退改途徑:使用官網預訂管理系統自助辦理,或聯絡客服(+852 3071 5083 ) 官方公告:https://lfn.custhelp.com/app/answers/detail/a_id/7982  Cathay Pacific/Cathay Dragon 國泰航空/國泰港龍航空 2月7日公告針對台灣航線的退改安排: 適用對象:2月6日或之前購買、3月31日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,但仍需補機票差價(如有)。申請日期:原定出發前退改途徑:聯絡客服 官方公告:https://www.cathaypacific.com/cx/zh_TW/travel-information/travel-preparation/travel-advisories/special-ticketing-guidelines-for-taiwan.html  因為疫情的一般性自願退改方案: 適用對象:2月1日或之前購買、2月29日或之前出發的機票。退票措施:(無)改票措施:免變更費用,但仍需補機票差價(如有)。申請日期:原定出發前退改途徑:聯絡客服 官方公告:https://www.cathaypacific.com/cx/zh_HK/travel-information/travel-preparation/travel-advisories/special-ticketing-guidelines-for-passengers-arriving-to-Hong-Kong.html  Cebu Pacific 宿霧太平洋適用對象:1月24日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,更改至原出發日期30天內的航班申請日期:原定出發前退改途徑:利用官網管理預訂系統自助辦理:https://book.cebupacificair.com/Manage/Retrieve/ 官方公告:https://www.cebupacificair.com/en-mo/Pages/travel-advisory?tid=489  China Airlines 中華航空適用對象:1月27日或之前購買、3月31日或之前出發的機票。退票措施:全額退票改票措施:免手續費及差價改期申請日期:原定出發日期前,至3月31日止退改途徑:聯絡客服(https://www.china-airlines.com/tw/zh/contact-us/index) 官方公告:https://www.china-airlines.com/tw/zh/discover/news/travel-advisory?travelAlert  China Eastern Airlines 中國東方航空適用對象:1月27日或之前購買、1月28日或之後出發的機票。退票措施:全額退票改票措施:(無)申請日期:原定出發日期前退改途徑:於官網管理訂單內自助退票 官方公告:https://hk.ceair.com/newCMS/hk/hk/content/hk_News/TravelAlert/202001/t20200128_13828.html  China Southern Airlines 中國南方航空適用對象:1月23日或之前購買、1月24日或之後出發的機票。退票措施:全額退票改票措施:(無)申請日期:原定出發日期前退改途徑:利用南航微信公眾號進行 官方公告:https://global.csair.com/HK/TW/GYNH/NEWC?NEWS_CATEGORY=596&SELECTED_NEWS_ID=20200122  Eastar Jet 易斯達航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,但仍需補機票差價(如有)。申請日期:官方無公告退改途徑:聯絡客服 (+82-1544-0080) 官方公告:https://www.eastarjet.com/newstar/PGWCA00002?cId=11&iId=0&bId=2885&lang=CN  Emirates 阿聯酋航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:可變更日期或航點,但需於2月29日前出發。申請日期:原定出發14天前退改途徑:改票需聯絡客服(+852 30713019),退示請使用以下系統,並於評論部份填上「有關新型冠狀病毒的退票要求」(”Refund request due to Corona virus”):https://www.emirates.com/english/help/refund-request.aspx?pub=autodetect 官方公告:https://www.emirates.com/hk/chinese/help/travel-updates.aspx/#3468  Etihad 阿提哈特航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票(退票僅張2月6日前出發之機票)改票措施:可變更日期,但需補差價申請日期:原定出發前退改途徑:請聯絡客服(+852 30713221) 官方公告:https://www.etihad.com/en-hk/  EVA Air 長榮航空適用對象:2月10日或之前購買且於4月30日或之前出發的機票。(如因各國入境禁令無法出行,則購買日期不限)退票措施:全額退票改票措施:免變更費用及差價,更改出發日期至6月30日或之前。(如改航點則只免變更費,要付差價)申請日期:原定出發前退改途徑:改票可聯絡客服,退票可利用官網系統自助辦理。 官方公告:https://www.evaair.com/zh-hk/about-eva-air/news/travel-news/2020-01-24-wuhan-coronavirus.html [長榮航空機票特別保留辦法] 跟長榮澳門公司查詢了一下目前的退改政策,確定如果你有2月10日前購買、4月30日或之前出發的機票,是有方法可以取消行程但保留機票,只要在4月30日或之前再決定改期還是退票就可以。改期可改到6月30日或之前,改期或退票都不會產生任何費用。操作方法如下: —–注:如果你的航班有被取消或更改的,以下方法不適用,只能聯絡客服處理。—– 1. 先確定你的機票是:a) 你的機票是在官網購買 ,且b) 2月10日或之前購買,且c) 4月30日或之前出發,且d) 航班涉及大陸或香港或澳門 2. 先準備好你的電子機票 3. 利用機票資料進入以下系統取消行程(此取消行程不等於退票,只是將訂位取消避免產生no show fee)https://booking.evaair.com/flyeva/EVA/B2C/manage-your-trip/cancelbooking-login.aspx?lang=zh-hk (注意你必須在原出發日期前進行 “取消行程” 這一步,否則過了原出發日期無取消行程又無上飛機,就會被收取 no show fee) 4. 確認行程取消後,你可以在4月30日或之前,隨時打電話上長榮客服,跟他們說你最後決定改期還是取消。如要改期,則目前安排是可以改到6月30日或之前出發。  Finnair 芬蘭航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用更改出發日期至5月31日前。申請日期:原定出發前退改途徑:退票請使用官網管理預訂系統自助辦理,改期請聯絡客服 官方公告:https://www.finnair.com/hk-en/flight-information/travel-updates  Hainan Airlines 海南航空適用對象:1月31日或之前購買的機票。退票措施:全額退票改票措施:免變更費用但需補差價(如有),更改出發日期至6月30日前。申請日期:原定出發前退改途徑:聯絡24小時客服:+86-898-95339 官方公告:https://www.hnair.com/guanyuhaihang/hhdt/hhgg/202001/t20200129_43517.html  Hong Kong Airlines 香港航空適用對象:2月1日或之前購買、2月29日或之前出發的機票。退票措施:(無)改票措施:免變更費用更改日期及航點,但需補差價(如有),新出發日期至6月30日前。申請日期:原定出發前退改途徑:改票請使用不正常航班改票系統自助辦理:http://inrebookingservice.hongkongairlines.com/unfc/InvoluntaryChange/html/tc/rebookPassengerInformation.html 官方公告:https://www.hongkongairlines.com/zh_HK/special_news/detail?id=10005576510  JAL 日本航空適用對象:1月27日或之前購買、3月31日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,更改至4月20日或之前。申請日期:至少出發1天前退改途徑:改票請聯絡客服(+852-39191111)或退票可利用官網訂單管理系統自助處理 官方公告:https://www.hk.jal.co.jp/hkl/zhhk/info/2020/inter/200124_02/index.html    Jeju Air 濟州航空接獲濟州航空澳門分公司通知,首爾-澳門航班 7C2001/7C2002航班於2020/02/05至2020/03/28、7C2003/7C2004航班於2020/02/07至2020/03/29 期間停飛。濟州航空將聯絡受影響旅客,亦可以利用電郵 mfm@jejuair.net 與航空公司聯絡。   Jin Air 真航空適用對象:1月27日或之前購買、3月28日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,但仍需補機票差價(如有)。申請日期:官方無公告退改途徑:聯絡客服或利用官網Q&A平台留言 官方公告:https://www.jinair.com/company/announce/announceView?anceSeq=21216  Juneyao Air 吉祥航空適用對象:1月27日或之前購買、1月28日或之後出發的機票。退票措施:全額退票改票措施:(無)申請日期:原定出發日期前退改途徑:利用吉祥航空微信小程序或24小時客服熱線 +86-21-95520 官方公告:http://www.juneyaoair.com/pages/About/notice.aspx?noticeid=4821  MIAT 蒙古航空蒙古航空已暫時停飛香港航班至3月1日(部份日子除外,請見官方公告),受影響旅客可聯絡客服退款或改期。 官方公告:https://www.miat.com/news.php?newsid=241&lang=en  Philippine Airlines 菲律賓航空菲律賓航空已取消所有2月29日及之前來往港澳的航班,請聯絡客服或原本購票途徑協助退改。 官方公告:https://www.philippineairlines.com/AboutUs/newsandevents/cancellation-feb22020 Qatar Airways 卡塔爾航空適用對象:1月27日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,更改出發日期不限,但仍需補機票差價(如有)。申請日期:原定出發前退改途徑:聯絡客服(+852 800-969-848) 官方公告:https://www.qatarairways.com/zh-hk/offers/travel-alert.html  SAS 北歐航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,更改至5月31日前出發,需補差價(如有)。申請日期:原定出發前退改途徑:登入官網預訂管理系統自助辦理,或聯絡客服(+852 3106 0918) 官方公告:https://www.flysas.com/hk-en/traffic-information/message/  Scoot 酷航適用對象:1月29日或之前購買、3月31日或之前出發的機票。退票措施:全額退票改票措施:免變更費用,可改期及航點(需補差價)申請日期:官方無公告退改途徑:可至酷航 facebook fan page、微博、或致電客服辦理。 官方公告:https://www.flyscoot.com/zhtw/announcements/update-on-coronavirus-pneumonia-situation  Singapore Airlines 新加坡航空適用對象:1月30日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:免變更費用可改期至5月31日前出發申請日期:原定出發前退改途徑:出發日期在5個工作天內的致電客服+65 6223 8888;5個工作天外的電郵 sq_support@singaporeair.com.sg(會在5個工作天內回覆) 官方公告:https://www.singaporeair.com/en_UK/sg/media-centre/news-alert/?id=is5rire4  Spring Airlines 春秋航空適用對象:1月27日或之前購買、1月28日或之後出發的機票。退票措施:全額退票改票措施:(無)申請日期:原定出發日期前退改途徑:春秋航空自助退改系統:https://t.ch.com/fFYM8 或24小時熱線(+86-21-95524) 官方公告:https://www.ch.com/News/63404339048144b4b7aa6b62f5be11be.Html  StarLux Airlines 星宇航空星宇航空於2月3日宣布取消2月8日至3月28日的台北-澳門航線全部航班,另外3月29日至5月31日僅恢復 JX201/202航班(即每天一班),受影響的旅客退改方法如下: 適用對象:2月3日或之前購買、5月31日或之前出發,因航班取消而受影響的旅客。退票措施:全額退票改票措施:免變更費用,更改出發日期不限,但仍需補機票差價(如有)。申請日期:5月31日前且不遲於機票原定出發日期前退改途徑:改期請聯絡客服,退票請使用以下系統:https://support.starlux-airlines.com/s/formRefund?language=zh_TW 官方公告:https://www.starlux-airlines.com/StarluxTravelAlerts/0720764a-f3c1-4521-b8fd-fb14562ea5ce  Tigerair Taiwan 台灣虎航台灣虎航於2月6日公告,全數取消2月7日至3月31日台中-澳門、高雄-澳門,以及2月27日至3月31日台北-澳門的航班。受影響旅客如果是在台灣虎航官網買票,不用作出任何申請,台灣虎航會自動退款到你的付款信用卡中;如果是經旅行社或購票平台購買,則需要向原購買渠道查詢及協助辦理。 如果你的航班不屬以上的受影響範圍,以下為自願退票安排: 適用對象:1月24日或之前購買、3月31日或之前出發的機票。退票措施:全額退票改票措施:免變更費用及差價,更改出發至原出發日期6個月內。申請日期:退改均是不遲於機票原定出發日期24小時前退改途徑:改票需聯絡客服(+886-277531088),退票可至以下系統登記:https://www.surveycake.com/s/0Qw79  官方公告:https://www.tigerairtw.com/zh-tw/20200122  T’way Air 德威航空適用對象:1月28日或之前購買、2月29日或之前出發的機票。退票措施:全額退票改票措施:(無)申請日期:官方無公告退改途徑:聯絡客服或使用網站留言(需登入會員) 官方公告:https://www.twayair.com/app/customerCenter/notice/retrieve/11258  United Airlines 聯合航空適用對象:1月27日或之前購買、3月31日或之前出發的機票。退票措施:(無)改票措施:改期免變更費用及差價,如改航點免變更費用但需補差價申請日期:官方無公告退改途徑:使用官網預訂管理系統自助處理:https://www.united.com/xx/xx/manageres/mytrips 官方公告:https://www.united.com/ual/en/us/fly/travel/notices.html  Vietnam Airlines 越南航空 越南航空在2月6日起暫時停飛港澳航班至3月底,請聯絡航空公司或原購票途徑更改或退款。聯絡客服:https://www.vietnamairlines.com/vn/en/support/vietnam-branches 官方公告:https://www.vietnamairlines.com/vn/en/news-travel-alerts/travel-alert/0124-VI-Thong-tin-ve-dich-viem-phoi-virus-corona-lien-quan-den-cac-chuyen-bay-cua-VNA-va-JPA  酒店預訂網站 AgodaAgoda為所有中國大陸、香港、澳門、台灣居民免費取消入住日期為2020年2月29日及之前的訂單,不論酒店所在地點。符合退訂要求的旅客只需登入訂單自助取消即可。但如看到需要扣款,請使用訂單號碼,通過24小時客戶服務熱線(+853 6262 5205 / +852 3071 1201)進行處理。 官方公告:https://www.agoda.com/coronavirus  Booking.com針對所有中國、香港、澳門和台灣旅客於2020年2月29日及之前入住的訂單,退還所有預付款項和/或免除任何取消費(手續費、行政費和/或其他金額)。 官方公告:https://partner.booking.com/en-gb/help/legal-security/important-information-regarding-coronavirus(原公告是針對BOOKING的合作伙伴,即是酒店,但亦可視作對客戶的特別退改安排)  Hotels.com根據版友分享,如因航班取消、入境限制等因素無法成行,可以跟hotels.com聯絡,請他們協助向酒店申請全額退款。如要申請,最好能提供相關的證明以利加快流程。  綜合旅遊預訂網站及平台  Expedia HK機票以航空公司公布的政策為準。酒店方面如果是自助管理系統顯示不能免費取消,需要聯絡 Expedia HK 協助申請(+852 3077 4857)。 官方公告:https://www.expedia.com.hk/service/#/myTrips/25625  KKDay*已預訂旅遊日期為2月29日前,位於中國大陸、香港、澳門的行程:可全額退費。*已預訂旅遊日期於2月29日前,位於其他地區的行程:-持中國護照及中國身分證旅客(不包含港澳旅客,需提供證明)-14天內到訪湖北之旅客(訂單出發日推算,需附證明)-醫生開具流感證明 (需附證明)-班機取消,行程受影響者(需附航空公司取消證明)-因應目的地官方政策,無法順利入境者(需檢附證明) 退改辦法:請電郵至 service@kkday.com,信件主旨標示「KKday之訂單編號」,並提供相關購買紀錄證明,將會由客服人員協助相關取消事宜。 官方公告:https://hk.blog.kkday.com/30920/wars-2020 Klook*已預訂旅遊日期為2月29日前,位於中國大陸、香港、澳門的行程:可申請全額退費或更改行程日期,若是無法改期的產品則以退費處理。*已預訂旅遊日期於2月29日前,位於其他地區的行程: 將由KLOOK客服人員依不同情況(例如航班取消,入境限制等),請求用戶提供相關證明文件,以利退改作業進行。*防疫相關工作人員: 包括醫務工作者、公務人員,或其他因疫情防制需要/工作而無法休假出遊的用戶,只要提供相關資料證明即可申請全額退費。 退改辦法:申請退費和行程修改,用戶可透過「諮詢客路」與客服聯絡(請備妥預訂編號和相關資訊以利提升處理速度) 官方公告:https://www.klook.com/zh-TW/blog/2019-ncov/  Trip.com.機票:於2020年1月28日00:00前預訂,起飛日期為上述時間後的中國內地的航空公司機票訂單,若於航班起飛前申請退票,均可免費取消;.火車票:於2020年1月28日00:00前預訂,出發及目的地為中國內地的火車票訂單均可免費取消;.酒店:於2020年1月24日00:00前預訂,入住日期為2020年1月28日至2月8日期間,目的地為全中國地區的酒店訂單均可免費取消。全中國地區客人於上述預訂及入住日期期間,預訂了目的地為其他地區的酒店訂單,亦可獲得免費取消;.租車:於2020年1月24日00:00前預訂,使用日期為2020年1月23日至2月8日期間,目的地為全中國地區的租車訂單均可免費取消;.其他產品:於2020年1月24日00:00前預訂,使用日期為2020年1月27日至2月29日期間,目的地為全中國地區的機場接送、車票、船票或當地玩樂產品訂單均可免費取消。全中國地區客人於上述預訂及使用日期期間,預訂了目的地為其他地區的機場接送或當地玩樂產品訂單,亦可獲得免費取消。.若客人被診斷出感染新型冠狀病毒、正接受隔離檢查,Trip.com 將為客人承擔所有於 Trip.com 上的產品訂單取消費用。 有退改需求的請於Trip.com 網站或App上自助取消或更改訂單。 官方公告:https://hk.trip.com/newsroom/trip-hk-on-novel-coronavirus/?promo_referer=11_1061_1  WingonTravel 永安旅遊網因應不同的產品有不同的協助方法,詳情參閱官方因武漢肺炎設置的協助頁面:https://www.wingontravel.com/SevereWeather/Index/Home.html  攜程內容較多,請直接閱讀官方公告:https://contents.ctrip.com/activitysetupapp/mkt/index/whyq  飛豬內容較多,請直接閱讀官方公告:https://page.fliggy.com/wow/z/pcraft/dailypromotion/yiqing?spm=181.11358650.5190364.1.4c0d223eA24uFV&wh_biz=tm&wh_weex=true&ttid=seo.000000576 === 想搵平機票去玩,即上 OH!Chance!澳燦旅行資訊 https://ohchance.info/ 去日本旅行買咩 JR Pass好?即上 OH!Note!小燦的旅行筆記做功課 https://ohnote.info/ 唔知間航空公司好唔好坐?馬上 Subscribe OH Chance Youtube 睇睇佢:https://youtube.com/c/OHChanceTravel 睇埋 Facebook 專頁 https://fb.com/ohchance 第一時間獲得最新旅遊資訊!

Lambda 表達式之可讀性
科技新知
MacauYeah・2023-11-24

Java作為一個真OOP物件導向的程式,在設計和編寫上是很嚴謹,什至是囉嗦的程度。近年很多Programmer因為各種原因,都放棄Java跳船去其他語言。 Javascript是其中一個很多人的選擇,因為Javascript有nodejs的加持,在Web世界下,可以同時走frontend、backend路線。而Javacript亦有一個很明顯的特性,就是大部份的library都以callback的型式出現。另外,Javascript也讓很多人覺得很簡潔,這除了是因為它沒有強型態的規限外,另一個原因也是因為有callback的大量使用。 Function Pointer 其實callback,籠統一點講就是在一個function A傳入另一個function pointer B。而編寫function A的作者,並初期並不知道function pointer B的實際操作會是什麼。A作者只是強調在特別定時候,它就會使用這個function pointer B。而這種把function pointer 傳來傳去的做法,就可以看成是Functional Programming的基礎。 Functional Programming除了把function pointer 當成是一等公民以外,還有很多附加要求,例如: Pure Function: 它只會使用到自己的Local Variable本地變數,這樣它的作用域就鎖死在Function內部,就不會有副作用。 傳統的OOP,Class中不少變數會以Class Attribute型式存在,雖然它們可能是private attribute,但還是獨立於Function外,這樣各Function的操作,都要靠作者好好地記著Class Attribute的狀態。 Nested Functions: 與普通程式語言類似,很多情況下都需要local variable,而Function Programming要足夠好用的話,就需要彈性地在function裏定義local function pointer。 Java Lambda 表達式 其實從Java 8開始,就有提供Lambda表達式,這是一個可以制作匿名function pointer的方法。所以硬要講,Java也可以做Functional Programming。 但必需要盡早強調的是,Java經常性地使用class attribute,它們很多時候都會引申請狀態的概念。即是在它們必需經過特定步驟後,class attribute才會有特定的意義。也就是Lambda表達式想保持Pure Function的特性,它可以使用的時期就有很大限制。 但我們還有必要使用Lambda嗎? 以筆者的經驗來講,它還是有作用的,特別在於它可以改善Class Function的閱讀性。 例如下面一個Java Class。它是一個工廠,提供一個服務可以生產一堆車。那些車而需要經過特定檢測,才能推出。 public class Factory { // ex1 public static List generateListOfCarByForLoop() { List tempCars = new ArrayList(); // many other logic // many other logic // many other logic List passTestCars = new ArrayList(); for (Car car : tempCars) { if (car.getWheels().size() == 4) { // many other check logics // many other check logics // many other check logics passTestCars.add(car); } } return passTestCars; } } 中間的for loop可以用lambda來改寫。 // ex2 public static List generateListOfCarByLamda() { List cars = new ArrayList(); // many other logic // many other logic // many other logic cars = cars.stream().filter((car) -> { if (car.getWheels().size() == 4) { // many other check logics // many other check logics // many other check logics return true; } return false; }).toList(); return cars; } 有人會說,上述ex2只是形式上改變了,沒有特別易讀。就像ex3這樣,把特定邏輯抽成獨立function,才是真正的易讀,對嗎? // ex3 public static List generateListOfCarByForLoopFunction() { List tempCars = new ArrayList(); // many other logic // many other logic // many other logic List passTestCars = filterCarsByWheelsSize(tempCars, 4); return passTestCars; } private static List filterCarsByWheelsSize(List originalList, int targetSize) { List passTestCars = new ArrayList(); for (Car car : originalList) { if (car.getWheels().size() == targetSize) { // many other check logics // many other check logics // many other check logics passTestCars.add(car); } } return passTestCars; } 上述ex3是一個有效的改進。如果大家不計較傳入參數的先後順序及交互影響的話,就已經很足夠。 但如果大家對於多參數的解讀又怎樣? private static List someotherfunction(List cars, List wheels) 大家又會不會突然停住,想想到底是cars影響wheels,還是wheels影響cars? 對於多參數的function來講,相互影響就會越來越多,但使用Lambda的話,可以針對性地表達這是一個Predicate Lambda。 // ex4 public static List generateListOfCarByLamdaComposition() { List cars = new ArrayList(); // many other logic // many other logic // many other logic List wheels = new ArrayList(4); cars = cars.stream().filter( filterCarByWheelSizePredicate(wheels) ).toList(); return cars; } private static Predicate filterCarByWheelSizePredicate(List wheels){ return (car) -> { if (car.getWheels().size() == wheels.size()) { // many other check logics // many other check logics // many other check logics return true; } return false; }; } 就最後的ex4版本,可以很明確的知道是cars被Predicate所作用。 如果大家還有其他使用Lambda的明顯好處,也可以一起來Github分享大家的Code