搜尋

搜尋結果

Home Media 系列驚爆娛樂陪您過「哈囉喂」 🎃👻
生活在我城
Cheers!・2024-10-28

今個 Halloween 留喺屋企一樣咁「盞鬼」!Home Media 集齊一系列驚險遊戲、懸疑猛片、解密綜藝等,為您開啟刺激冒險之旅,依家新客戶仲可用 350 CTM 積分換購 Home Media 免費體驗,快 d 去換購,同家人朋友一齊挑戰驚悚極限啦 ! OnePlay 雲遊戲平台服務(30 小時)(優惠價:$68) 免費 3 個月 myTV SUPER 服務(App / 網頁版) 首月免費 Blacknut / hmvod / 芒果 TV 國際服務,期後享優惠月費 $28 / 月 6 個月 myTV Gold 服務(電視盒子 / 智能電視版 + App / 網頁版)(優惠價:$280) 仲有 Home Media 電視盒子連 myTV SUPER 服務等更多積分優惠:https://s.ctm.net/otdXe 萬聖節心跳推介: 冒險類雲遊戲 #OnePlay:《Batman》化身蝙蝠俠對抗危險惡棍 #Blacknut:《Among the Sleep》直面童年恐懼 都市懸疑劇 myTV SUPER 帶您重溫經典懸疑劇《金宵大廈》《降魔的》等, 仲可升級 myTV Gold 專享更多海外驚悚劇 《23:23(雙語版)》《天黑了》等 萬聖節必睇猛片 #hmvod:《鬼靈精怪大酒店:怪獸變錯身》展開歡樂緊張奪寶之旅 ,《窺探者》改編自愛爾蘭古老恐怖傳說 推理解密綜藝 #芒果TV國際 《密室大逃脫》《YES OR NO 第三季》靠線索逃出密室 / 推理故事 好歌分享 #JOOX:Serrini《日月無光》、陳蕾《妖治時代》擊退內心魔鬼 下載 Home Media App 體驗一系列精彩娛樂:https://s.ctm.net/0X0oD,一個賬號盡享最新體育賽事直播、電視劇、電影、綜藝等! Home Media 娛樂服務詳情:https://s.ctm.net/sIrfC

【家居百科】舊床單可以用來做甚麼?將它來個大改造吧!
創意生活
Chrysalids 少爺・2017-08-19

每樣物件都會有固定的使用壽命,當過了使用壽命時候會如何處置?棄置是大多數朋友的做法,其實,只要好好利用,每樣不起眼的物件都可以大有用途,床單就是很好的例子,以下裝修佬教大家床單的另類用途及做法。 先準備好剪刀、針線,將床單裁剪成合適大小,用衫鈕,亦能當作裝飾物縫上去,一個舊床單收納袋就完成了,亂七八糟的遙控器和各種雜物,瞬間解決淩亂,恢復整潔,縫得大的話,還可以專門做雜物收納 。 枱墊 將床單裁剪成相同的六邊形,在內部塞入同樣大小的硬紙板,然後七個一組疊在一起縫好,根據自己的喜好來把它們拼起來,想要長一點的話,也可以接著往下拼,各種花色瞬間增強特色。 靠墊 純棉的床單不僅透氣性好,手感也舒適柔軟,將有花紋的床單做成靠墊,往睡房、客廳放幾個瞬間就能提升整個家居藝術氣息。 吊椅 文藝小清新必備的吊椅,用家裡的舊床單就能可以做出來,先準備好繩、掛鉤和打孔器,再將床單裁剪成梯形然後縫成雙層,兩側留出穿繩的洞口,用打孔器在房頂上固定好掛鉤(一定要非常牢固),最後將繩穿過床單和掛鉤一張文藝氣息滿滿的吊椅就完成 。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:http://yes-news.com/

北極 讓你幸福一輩子的八件事
走遍世界
行走世界記錄・2018-11-08

傳說........... 遇見北極光 會幸福一輩子 何時去?去哪裡? 若能遇上 ,真的能幸福一輩子嗎? 一大堆問題,思緒在腦袋飛轉 一生必追一次北極光 近年,極光這個話題越來越火熱,全球有多個位處北極圈的國家迅速成為極光旅遊勝地,就是在挑選哪一個作為追極光的地點,無疑是使人頭痛的一道課題。 位處北半球的拉普蘭德地區,挪威北部、瑞典北部、芬蘭北部和俄羅斯西北部位處於北極圈內,每年冬天從9月至翌年的3月都有機會看到北極光,是北歐有名的追極光國度。 為了追尋幸福,決定來到瑞典阿比斯庫,踏進白茫茫一片的冰雪世界。 在北極圈的第二個晚上,第一件幸福的事發生了,我....遇見了她,在寒冬的晚上,跟北極女神遇上了。 接下來,第二件幸福的事也發生了........ 幸福的第一件事 遇見北極光 幸福一輩子 觀看極光必須具備三個要件,就是天色黑暗、無光害以及沒有雲。瑞典阿比斯庫擁有清澈無比的天空,有極光小鎮稱號,住上3個晚上便有很高機率看到極光,而且阿比斯庫擁有一個很大的湖泊,即使沒有參加極光團,晚上亦可自行走到湖邊觀看極光,非常棒。 可遇見的幸福 為了製造一場偶遇,一睹極光女神的優美身姿,忍受零下廿多度的寒風刺骨,在遍地白雪的森林湖邊守候。 北極圈天氣變幻莫測,體感溫度往往低於天氣報告的溫度,踏進北極圈便要有足夠的心理準備,隨時要跟澟烈的寒風搏鬥。 抓緊北極光大爆發的一刻 觀看極光需要很強的耐性去等待,以及專注的觀察力,因為北極光時強時弱,最弱的時候用肉眼看上去其實只是灰灰的一道光,不留神便會錯過了,但不要擔心,有緣份的話,她會在天空中飛舞,亮透整個星空,緊記要抓緊可貴的瞬間啊! 在阿比斯庫的5個晚上,與極光女神遇上兩回,滿滿的幸福感,足以抵禦寒風的冰冷。 這是北極發生的第一件幸福的事。 幸福的第二件事 雪地犬拉雪撬 飆車的速度感 穿上厚厚的連身衣,坐上木造的雪撬,雪地犬在前面排成一列拉著雪撬,女教練英姿颯颯的站在雪撬的後方,一聲號令,雪撬被拉動著向前滑行。 跑過白雪叢林,穿越結冰的湖泊,一直往前馳騁,在零下廿多度下感受速度的快感。 旅程分成兩段,當小狗跑過雪湖到達對岸,車子的速度慢下來,徐徐停在傳統薩米民族的帳篷前,雪地犬稍作休息後才通過雪湖跑回大本營。 教練點燃營火,把咖啡和茶煮好,準備小點給我們,經過一小時多的極速飛馳,各人的臉給風吹得紅紅的,頭髮也給亂了點。坐在石椅上,喝著暖暖的茶,聽著教練訴說著雪地上的小故事。 這一瞬間,溫暖感從腳尖透進冰冷的身體往上傳透心窩,就這樣第二件幸福的事發生了。 幸福的第三件事 雪地健行 挑戰自我 早上起來吃過早點,隨大夥兒驅車到達托納湖,由於昨天乘火車進入極光小鎮時,正值氣溫下降和刮大風雪,我們需要套上特製的大腳雪鞋才能順利穿越樹林的一段走到湖泊,整個結冰的湖面已舖落厚厚的白雪,湖水結成小冰川。 雪地健行是近年新流行的極地活動,大夥人穿上大腳雪鞋、戴著帽子,別忘記帶上相機,由專業人員帶領下一步一步的踏雪前行。 冬天的托納湖非常優美,湖面結成厚厚的冰,在小冰川和白雪的襯托下,景色非常壯麗。 白雪世界猶如高傲的女皇令人生畏,在大夥兒的彩衣的襯托下,把白雪世界點綴成七彩繽紛,增添一份親和感;一路上不離不棄的互助精神,心頭浮起絲絲暖意。 這一瞬間,第三件幸福的事發生了。 幸福的第四件事 冰湖上釣魚 耐性的考驗 在極地生活,每天面對的都是風和雪。這一天,穿上禦寒裝備,隨著女教練駕駛的雪地摩托,再次走進托納湖。摩托車停在靠近湖邊的一處,取下釣魚具後女教練引領我們到湖中央。 真的是巾幗不讓鬚眉,英姿颯颯的女教練利用冰鉆快速地打開一個洞,動作非常專業純熟,絲毫不會嬌柔。 模仿著女教練的一舉一動,艱難地把冰鉆向厚達一公尺的冰面來回轉動,直至冰洞出現時,雙手已有點酸痛了。 撥開冰塊把魚餌拋進洞內,引向冰層下的海中魚兒,這是考驗耐性的時刻。 站著站著,寒從腳下,再多的保暖衣也不敵腳下的冰雪,加上風雲變色,湖泊刮起大風,猶如一雙強橫的臂膀,直把每個人往外推動,差點沒摔倒湖上。 釣魚活動被迫中斷,趕緊收回釣餌,女教練體貼地領我們走進湖邊的一個小木屋,點起營火,還不停詢問我們腳尖有沒有失去感覺,驚怕我們給凍傷了。 隨著小木屋內的溫度上升,腳底的寒氣也漸漸消退了,與此同時,一杯熱騰騰的飲料以及一件暖暖的糕餅遞到手中。 這一刻,第四件幸福的事發生了。 幸福的第五件事 挑戰極限 勇闖冰旅館 來到位於瑞典北極圈內的純天然的冰旅館,冷艷無比。冰房間內的傢具床舖跟所有裝飾品,全部都出自國際知名藝術家的雕刻之手。冰旅館的建材取自托納河結成的冰塊,待天氣回暖,冰塊融化後流回流托納河,極具"生生不息"的象徵意義。 當冰冷的大門徐徐打開,在零下的溫度中尋找冰雪女皇的影蹤,禁不住輕聲地問:難道這就是幸福的第五件事嗎? 若在這裡住上一晚,挑戰自我極限,真的可以夢想成真,跟冰雪女皇舉杯痛飲嗎? 幸福的第六件事 極光下的烤鹿肉大餐 海外存知己,天涯若比鄰。互不相識的你與我,躲進極光底下的小木屋內,不需要知道你是誰,不需要知道你是來自何方,就這樣坐在一起一邊烤肉一邊暢飲。 聽說瑞典拉普蘭地區住著以馴鹿為生的遊牧民族,聽說他們原是這片大地的主人,聽說馴鹿是放養的,聽說.... 這個晚上,雖然看不到極光,眼看著遠處的星空,腦海內不斷出現很多聽說...聽說我這個晚上很幸福... 幸福的第七件事 與歐洲最後民族對話 千百年來薩米人一直是北極圈這大片土地的主人,在零下廿多度的寒冷環境下生活,擁有本族的語言文化習俗。歐洲最大的遊牧民族,以大地為家,如今只剩下不足10萬人口的薩米人,受歷史洪流的沖洗,被迫散居各處。 天色陰暗的早上,薩米人就在我們面前,近距離坐在我的對面,用心地訴說著民族情懷,訴說著一個又一個薩米人的傷痛故事,在這個黃色的傳統帳篷內,瀰漫著傷感的氣氛,但堅強的薩米人把引以為傲的生活方式和文化傳承下去,使得憂傷的味道給沖淡掉,禁不住使用薩米語向薩米人說聲"謝謝"。 這一次與薩米人的真情對話,使得我在哀傷中得到一份幸福的感覺,這個便是極地發生的第七件幸福的事。 幸福的第八件事 挪威不凍海港 揭開神秘面紗 第八件幸福的事,是發生在挪威的那一天。 那一天車子駛進公路,從阿比斯庫向挪威的鐵礦小鎮納爾維克出發,沿途聽著介紹,說這裡有一個不凍海港,海灣長年不結冰的,很想很想看到它的真面目。 通過公路,跨越國境,經過山路,終於來到這裡,揭開不凍海港的神秘面紗。被白雪包圍的海港,因北大西洋暖流的經過而終年不結冰,藍與白,永遠是和諧的組合,這裡的風景真的非常迷人。 喝過鮮味的魚湯,爬到遠處的山丘上,這裡可看到不凍海港,景色很優美很恬靜....優美與恬靜的背後隱藏著一段轟動全世界的大事。1940年這裡發生了一件轟動全球大事。 山丘上有一段文字簡介,原以為是優美風景的文字敘述,誰不知... 那一年是二次大戰,在歐洲戰場上德國佔領挪威,利用不凍海港大量運輸鐵礦製造軍事武器,英國跟同盟國合力跟德國激烈戰鬥,地點....就是這個景色迷人的山丘上... 經過無數次的反撀失敗後, 這一次,盟軍終於打開決口,第一次把德軍擊敗,往後歷史便朝大家所知的結果走向,殘酷的戰爭終於結束了。 在挪威的國土,上了歷史課,深刻體會到和平的可貴。這一次,我遇見的幸福,便是要珍惜和平時代的幸福。 沒有如果 只有結果 這些就是我在極地 所遇見的八件幸福的事 幸福因有和平 和平締造幸福 更多精彩遊記在 行走世界記錄

【LX Factory!里斯本術勝地】
旅遊情報
Cleo's Travel Log 為旅死 為旅亡・2017-12-13

"The world is a book and those who do not travel read only one page." - St. Augustine, Philosopher.「世界是本書,那些不旅行的人只讀了一頁。」── 哲學家 聖奧古斯丁。 出發葡萄牙之前,其實沒有太大的興奮感覺。大概是滿腦子「葡國咪同澳門一樣,去嚟做乜啫!」思想作祟,正如哲學家聖奧古斯丁的話,我們太容易以一概全了。然而遊走葡萄牙前後 9 日,真正了解過,才發現我愛葡萄牙。 尤其里斯本的「Lx Factory」藝術特區,翻查資料,園區由 23,000 平方米的廢棄工廠改造,「內置」不同的手作小店、設計傢品、咖啡店、特色餐廳。踏入園區,先被攝人的藝術感深深吸引,幾乎每棟建築都被不同風格的塗鴉「包裹」,新與舊的強烈對比令園區充滿性格,特別是看到牆上的 “We Hate Tourism Tours.” 塗鴉時,我心想:Lx Factory, I love you even I am one of the tourists you hate. 沒錯,我犯賤。 每個塗鴉作品,都似乎訴說著一個故事。 整個藝術特區,最出位的非「Ler Devagar」莫屬,被稱為里斯本最有型書店,亦是全球最美的書店之一! 一樓和二樓以 X 型的樓梯相連,超過廿層的書架由天花板延伸至地面,一踏入書店就被充滿氣勢的書牆吸引,手指情不自禁的狂㩒快門。 店名 Ler Devagar,意思是:慢慢閱讀(read slowly)。 這裡的餐廳各具特色,小編在此邊睇靚仔邊呷 Sangria,簡直人間樂土! Lx Factory 地址:Rua Rodrigues de Faria, 103, 1300 Lisboa電話:+351 21 314 3399網頁:http://www.lxfactory.com/EN/welcome/

「世界第一名DJ」Armin van Buuren即將登陸澳門金光綜
娛樂殿堂
LifeMag Editor・2016-09-10

「世界第一名DJ」Armin van Buuren將於2016年11月19日首度登陸澳門,在澳門威尼斯人®金光綜藝館帶來其最新的世界巡迴表演《Armin Only Embrace》。Armin獲全球樂迷票選,並史無前例地贏取五次排名第一的美譽。門票於9月6日(星期二)起透過各大金光票務售票處公開發售。 Armin的《Armin Only Embrace》世界巡迴表演於5月以荷蘭為首站,上演了兩場座無虛席的精彩表演。這個最新的巡迴表演除了其招牌Trance 音樂風格、雷射光效、即場表演以及令音樂會氣氛更加高漲的舞者外,熱愛電子舞曲以及喜歡主流音樂的人士更可現場感受將爵士、hip-hop及搖滾等不同風格的音樂混合的嶄新樂風。 《Armin Only Embrace-澳門站》不但有才華洋溢的客串嘉賓現身即席表演,讓氣氛升溫的各種視覺特效更會保證為觀眾帶來最狂野的派對體驗。 Armin 每年在全球超過 150 個世界知名的音樂節及著名電音場所作表演,包括 EDC、ULTRA、Tomorrowland 等,所到之處的演出皆令各地粉絲欣喜若狂。Armin 的演出自成一格,令他 連續 14 年高踞 《DJ Mag 》百大DJ首5 位的排名。此外,他的電台節目「A State of Trance」覆蓋全球 84 個國家,每週吸引超過 3 千 7 百萬名聽眾。Armin被譽為全球最頂尖DJ及電子舞曲製作人之一,其影響力絶對舉足輕重。 場地 澳門威尼斯人 金光綜藝館 票價 早鳥優惠:9月6日至10月2日 澳門幣 / 港幣580元 (早鳥優惠 站立區) 澳門幣 / 港幣280元 (早鳥優惠 座位區) 預售期間:10月3日至11月18日 澳門幣 / 港幣680元 (預售期間 站立區) 澳門幣 / 港幣280元 (預售期間 座位區) 演出當天: 11月19日 澳門幣 / 港幣900元 (演出當天 站立區) 澳門幣 / 港幣280元 (演出當天 座位區) 船票套票 於9月6日至11月18日期間購買門票的觀眾可另加澳門幣/港幣108元購買包括金光飛航往返港澳雙程船票的套票 金光票務 網上訂購:www.cotaiticketing.com 售票處: o 澳門巴黎人 – 一樓正門大堂售票處及五樓巴黎人劇場售票處 o 澳門威尼斯人 – 金光綜藝館及酒店正門大堂售票處 o 澳門四季酒店 – 百利宮™售票處 o 澳門金沙– 一樓售票處 o 金沙城中心 – 喜來登酒店正門及假日酒店正門售票處 電話訂購: o 澳門熱線:+853 2882 8818 o 香港熱線:+852 6333 6660 o 中國內地免費熱線:4001 206 618 香港快達票(將額外收取每張門票的顧客服務費) 網上訂購:www.HKTicketing.com 電話訂購:+852 3128 8288 澳門廣星傳訊 網上訂購:www.macauticket.com 門市據點資料請瀏覽:www.macauticket.com/TicketWeb/ServiceStations.aspx 電話訂購:+853 2855 5555

2026看Steam Machine | Steam OS 是不是一個出路?
科技新知
MacauYeah・2026-02-20

在這幾年,筆者都一直分享一些coding anywhere的主題。原本的出發點,其實是因為雲資源及container的出現,是不是讓個人電腦的採購可以越來越不受限?是不是相對選擇會更多,亦應該可以更便宜的選擇? 適逢SteamDeck Linux興起,使用Steam OS道理上會比windows更適配雲資源的開發,而且SteamDeck 可以同步作為手提遊戲機,買台低配的SteamDeck回來,可謂一石多鳥。筆者用著用著,也來了兩年多。現在再來聊它,主要因為Valve未來又有新的硬件Steam Machine推出。這台新硬件,道理上也是跟Steam OS,官方亦宣傳它可以作為PC用。但就這一賣點,筆者很想分享一下它的Steam Deck的使用心得,供各位參考Steam Machine的軟功能是否適合。 https://store.steampowered.com/sale/steammachine 首先,作為遊戲方面,Steam Deck是手提遊戲,硬件比較弱,不能與同世代的PS5或Xbox Series X或PC去對比。我們不應該拿畫面和效能跟其他平台比。但它的OS 層功能,就很直接看得出它有沒有價值。 遊戲模式-Gaming mode 有即時待機功能,但不是所有遊戲都百分百適配。Steam OS的待機,來回玩,再待機,玩過兩三天,總會crash一次。相對之下,Switch就做得很好,就算玩一週也沒問題。Steam OS 也不能說很差,因為PS5等沒有真試過來回待機玩個一週。這裏要表達的,就是遊戲未必為Steam OS而做優化,開發商的目標還是傳統的PC遊戲模式,傳統PC Notebook也有待命,但又有多少遊戲會認真對待?所以Steam OS可以待個兩天,就已經很好 手柄連接算是順利,一般大版的手柄,都可以簡單連接。但它也有做得不好的地方。每次待機換地點,基本上都涉及切換手柄問題。即使內置就有只一個實體手柄,系統並不會自動為你更換第一順位。例如,我原本使用PS5 無線手柄,在家遊玩,這時PS5手柄是第一順位,實體手柄是第二順位。很多遊戲只認第一順位是很正常的。不過在我待機,切換環境,原本的PS5手柄已不存在,但SteamOS並不會把實體手柄順移到第一順位,必需要手動調節。好在,也不需要退遊戲就可以切換。這個對比PC來講,SteamOS已經是做出了改進,但對於Switch和PS4/5,這些根本就是待機一啟動時就要為用戶的問題。可能這是因為SteamOS要考慮Desktop Mode的原因吧,不過筆者就沒有試過在Desktop Mode開遊戲,因為突然要待機外出會更麻煩。 桌面模式-Desktop Mode 這個模式,筆者就專注在取待PC的日常操作上 中日韓輸入法問題,這是大大地阻礙大家入這坑的很重要原因。如果大家都是純英文人,就不需要顧慮這一塊。但筆者就不是一個英文很強的人,多多少少需要直接打中文去找問題。原本SteamOS在Gaming Mode下可以通過 Steam Key + X,叫出虛擬鍵盤,安裝中文倉頡是很易的事。原本這一功能,在Desktop Mode也是可以的。但在寫稿的今天,Gaming Mode / Desktop Mode的中文虛擬鍵盤都一起報廢了,原因未明。筆者只好走回最早期為大家介絡的 flatpak fcitx5+RIME大法。fcitx5可以用,但限制也多。之後筆者再寫一期教學,解決它的限制問題。 辦公室套件。最基本就LibreOffice, OnlyOffice,大家可以在Desktop Mode中的Discovery裏找到。大家想知自己常用的套件是否有對應的版本,可以在https://flathub.org/en 裏找找看。有的話基本可以放心一半,至少經Discovery下載的app,都可以經fcitx5+RIME輸入中文。但這並不代表你可以真的當自己在辦公室工作,那些printer / scanner ,筆者實在沒有太多想法。道理上今年今日普通列印功能,應該通過指定driver就可以做到,但無耐真的不太簡單。日後筆者了解好制式問題後,再來填這個坑。 瀏覽器-就用Firefox吧。 其他瀏覽器有是有的,但最好只用Firefox。Discovery是有筆者最常用的google chrome瀏覽器,但在網安原因下,筆者不敢推薦。Flathub上 Firefox是官方認證的程式,但Google Chrome和Chromium也是沒有認證。如果想使用管方認證的Google Chrome,頂多只能在Distrobox下自行安裝。同樣,如果你是IT人也是英文人,Distrobox再安裝chrome,應該很簡單。但如果你像筆者一樣,還是依賴中文輸入法,你就會很失望,Distrobox經X-server出來的程式,沒法使用前文所講的fcitx5。所以簡單一點的選擇,就是直接使用Firefox。 寫Code,那就得在Distrobox上弄了 Flathub上是有非管方的VSCode,但同樣問題,這個版本你敢用嗎?同樣地,在Distrobox 下安裝 VSCode,是取得官方版本的好方式。只要大家不強求在vscode中輸入中文就可以了(貼上中文是可以的)。使用Dsitrobox做開發類的IT工作,在Contianer範圍內,都算可行的,在Container內安裝java,總比在SteamOS上簡易。但如果你需做一些低層的開發,還是在VM下操作吧。 總結: 如果你很想一石多鳥,你能接受新事物,Steam OS可以一試。 如果你有一些深度的操作或要求,即是是遊戲層面還是工作層面,現時Steam OS都不是一個很好的選擇,除非你的Steam OS不更新,把它硬改回ArchLinux,但這就失去了Gaming Mode的意義。

雲系統的持續更新,大家的選擇是什麼?
科技新知
MacauYeah・2026-01-30

在開始之前,筆者先解釋一下自己對Linux發佈策略的理解。筆者之前以為自己都尚算了解,但到了兩難問題時,才開始反思。所以都不禁懷疑自己的基本觀念有沒有問題,如果大家覺得筆者多少有些理解上的錯誤,請留言糾正。 普通軟件的發佈 主要分為穩定(Stable / GA), 測試(Edge / Alpha / Beta),特定版本。穩定、測試版本也可能有多個不同的分支,但它們主要是指不同環境下的選擇。通常安裝時,都會安裝最後的穩定、測試,除非最後版本有明顯Bug,我們需要回覆到再去的一個穩定版本。 當我們每次都更新到最後的穩定版本,我們稱之為rolling release. 以docker 官方建議的方式,我們在ubuntu底下,可以看到它的有很多結果回傳。 apt list --all-versions docker-ce Listing... Done docker-ce/noble,now 5:29.1.4-1~ubuntu.24.04~noble amd64 [installed] docker-ce/noble 5:29.1.3-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.1.2-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.1.1-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.1.0-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.0.4-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.0.3-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.0.2-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.0.1-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:29.0.0-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:28.5.2-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:28.5.1-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:28.5.0-1~ubuntu.24.04~noble amd64 docker-ce/noble 5:28.4.0-1~ubuntu.24.04~noble amd64 ... 我們可以選擇過去某個版本,但通常無腦update,就會去到最後一個版本。 Ubuntu的發佈策略 我們換個package看看,如果只看重要軟件的話,例如kernel,我們沒有什麼可以選擇 apt list --all-versions linux-image-generic Listing... Done linux-image-generic/noble-updates,noble-security,now 6.8.0-90.91 amd64 [installed] linux-image-generic/noble 6.8.0-31.31 amd64 apt list --all-versions linux-image-virtual Listing... Done linux-image-virtual/noble-updates,noble-security,now 6.8.0-90.91 amd64 [installed,automatic] linux-image-virtual/noble 6.8.0-31.31 amd64 除了可選擇數量外,另一個最大的不同是,kernel的自身版本其實固定在 6.8.0,就算更新,都是同一個版本的ubuntu補丁版,並不是官方kernel的bug fix版。筆者認為,這應該就是所謂的point release的策略。 (如果大家安裝物理機的話,kernel可能會是6.14,筆者大部份都是VM,還是比較舊的版本。筆者保證,6.8.0-90.91與 6.8.0-31.31之間,曾經是有多個不同版本的。但現在沒法下載回來,除非之前大家有安裝過。) 但相同情況,我們找另一個package看看,由 ubuntu 自己打包的docker 版本,雖然可以選擇的數量是有限的,但它們的版本是不斷更新的,而且不是hotfix版,還有大版本更新。 apt list --all-versions docker.io Listing... Done docker.io/noble-updates,now 28.2.2-0ubuntu1~24.04.1 amd64 [installed] docker.io/noble-security 27.5.1-0ubuntu3~24.04.2 amd64 docker.io/noble 24.0.7-0ubuntu4 amd64 雖然版本是跟著官方docker最新版本,但也有持續跳級更新。如果真的要分類,筆者應該會把它歸類為 rolling release。 Rolling release vs Point release 花了一些時間看例子之後,終於開始討論我們自己的更新策略了。rolling release,最主要的原因是,舊版本無人再免費維護了,有什麼bug,都在最新版本中修復,但也因此有機會出現不相容的情況。point release,最主要的原因是為了維持極強的穩定和兼容版本,這亦代表,除官方專家出手,否則很難有舊版本的bug fix。 那麼我們有什麼選擇? 有point release,當然跟point release,因為程式不可能天天做調整。除非大家想要新功能再升級版本。 沒有point release,就手動自己選擇hotfix版或小版本升級。在升級大版本前,一定要做整合測試。若追求極致的穩定,升級大版本時就不要原機升級,要另起爐灶,似兩個相對獨立的環境並行過渡。如果有container版本,就用container隔離,一般java等都可以這樣建獨立環境。 沒有point release,也沒有可隔離的並行環境:其實 docker 接近這類。對它應的OS層的存取,雖然可以用VM隔離,但通常都不實際。因為重新安裝OS, 設定外部環境,成本很高。docker 在中 lab 並行升級是可以,但投産環境並行真的不實際。沒有辦法之下,筆者還是原機升級。頂多是lab中實現更多的整合測試。

你開始寫 Spring Boot 測試案例了嗎?
科技新知
MacauYeah・2025-11-29

雖然筆者過往做 spring boot framework 教學中,都有滲入一些測試用例。筆者也曾經困惑了很長一段時間,所以就獨立開一個主題,聊一下筆者在實務上對spring boot test 的理解。 測試案例究竟測試什麼? 測試用例 (test case) 是確保你的程式碼正確性與穩定性的重要步驟,但在 framework 下,並不是所有功能都很容易寫成測試。所以在討論 framework 測試之前,釐清測試的本質。 function input - business logic - function output 這意味著我們輸入某些資料(input),然後經過業務邏輯(business logic)的處理,最後產生結果輸出(output)。 我們的測試目標,其實就是確保業務邏輯正確。而我們的手段就是經檢查概定的輸入資料,核對輸出結果。 那麼只要我們可以生成輸入資料,就一定可以檢查輸出結果了吧?其實不是的,因為實務上的輸入和輸出沒有這麼簡單。筆者常接觸到的輸入輸出如下 輸入 function 輸入參數 系統狀態資料,例如:資料庫狀態、外部API結果。 輸出 function 輸出參數 寫入系統(影響到)的資料,例如:資料庫狀態、使用外部API時的輸入參數。 總之就是考慮了狀態機 (state machine) 的問題,每個狀態+外部輸入都是一個測試用例,然後核對狀態機去了下一個什麼狀態。 言下之意,我們就是暴力地生成輸入參數和模擬狀態資料,道理上就是可以進行測試。 Spring boot web framework 中,我們又會測試什麼? function input - business logic - function output在Spring boot web就變成如下 controller request - business logic - controller response在 Spring Boot test 中,我們可以用模擬的 MVC (MockMvc) 測試來驗證 controller 的行為。不過,其實進入 controller 前經過很多系統轉換,而這些道理上跟Framework的技術大相關,與業務邏輯小相關。所以為免折磨自己,可以將業務邏輯單獨封裝成服務(service)。之後直接測試服務 ,易寫也易讀。 controller request - service input - business logic - service output - controller response道理上 controller 能做的業務邏輯,服務 (service) 都可以無腦重現。這樣還可以重用服務,減少測試的數量。 如何實現輸入? 直接 new Object。大部份的情況下,因為業務是自己編寫的,應該都可以直接 new 出來。 經 json 檔讀入。如果輸入的參數量太多,逐個經 java new 是很耗時的,我們可以經 json 反序列化變成 Object。但這亦只限於自己可以操作/改寫的類。 Mockito 模擬那些無法簡易經 new 或 json 反序列化的 Object。例如:spring security authentication object 我們在使用時,其實只看到 interface。我們難似自己實現一個可以反序列化的類,那麼我們可以使用 Mockito 來模擬這些資料。一些外部API的結果,我們也可以用使 Mockito 來模擬。 什麼情況下不進行測試? 有些情況下,我們可能選擇不對某些功能進行測試,原因可能包括對功能的了解不足或是單純的懶惰。以下是一些例子: 僅進行配置的Function:如果你的 Function 只是在 Framework 中填寫配置,而且你並不太了解它的運作原理,可能就不需要進行測試了。例如,Spring boot web 中,需要大家配置一個SecurityFilterChain Object,它要求大家將 HttpSecurity 轉換為 SecurityFilterChain 。因為輸入的 HttpSecurity 是系統固定的參數,我們亦沒有檢查它的狀態。這種情況下,它的輸入及輸出,其實我們都沒有真正理解。我們硬測試的話,測試功能可能只流於表面。若我們真的要做測試,也是經過MockMvc進行端到端測試(end-to-end testing),測試它在事後的影響範圍。 單純的框架功能:例如資料庫的儲存庫介面(repository interface),雖然是在框架下生成的,對於自己手動調整的部份功能,筆者通常亦不會進行單獨測試,通常都會搭配業務邏輯一起進行。它可以使用 Mockito 進行模擬測試,或用測試環境的真實資料庫進行測試。 面對的挑戰 總括來講,筆者盡可能地把測試用例限定在業務邏輯中,就可以大大地降低寫測試的技術難度。但筆者還是有些問題並未完美解決。 測試用例的數量可能很多,因此共用與維護變得相當困難。逐個用例獨立編寫輸入也是很累的。對於 Mockito 的使用,筆者還是可免則免。因為要逐個功能模擬,編寫量就指數提高,這亦難似配合外部變化。一般來說,能優先使用測試環境或者 Docker 來模擬環境的,就盡量用。 離線開發、離線測試。系統依懶的外部功能越多,想做單機開發的難度就越高。即使前述有 Docker 測試,對於持續整合(CI)來講也是有一定難度。那麼這時,Mockito 就是一個可取的選擇。但這又回到編寫量及難以偵測外部變化問題。 希望這篇文章能幫助你更好地理解測試案例的編寫方向,並在Spring boot web開發中加入你自己的測試!

Coding Anywhere: 依賴服務的選擇
科技新知
MacauYeah・2025-04-22

年多前,筆者購入steamdeck, 經過一輪軟件定制,把它變成一個可以作為IT從業員開發機的方案,也介紹了一些coding anywhere的想法 https://lifemag.cyberctm.com/zh_TW/blog/macauyeah/14175/Coding Anywhere 工作方案 https://lifemag.cyberctm.com/zh_TW/blog/macauyeah/14352/Steam OS 3.5更新,內建 podman, distrobox https://lifemag.cyberctm.com/zh_TW/blog/macauyeah/14149/開發者在Steamdeck上的另一個選擇: Gnome box 在試驗了一年多後,筆者對於依賴服務的模疑,又有另一層感受。什麼是依賴服務?就像你寫的程式庫,可能需要資料庫儲存、可能需要問AI等等。所以在開發時,都要確保這些服務的存在。一般,要麼就是在本機上自行安裝,要麼就是經過互聯網使用雲服務(public cloud或者你團隊提供的private cloud),也就是本地模擬還是互聯網模擬。 本地模擬的得失 本地模擬,主要是考慮金錢上的優勢與資源的獨立性。 金錢成本 - 互聯網資源大部份都不會是免費的,如果本機的硬件足夠,可以在本地完全模疑,有一定上的優勢。但如果該服務在本地安裝,都要計授權,可能不沒有太大差異,例如那些report engine, report designer,即使本地開發都要逐台開發機計算。但其他大部份,如資源庫的實現,都有本地開發免費授權。所以本地安裝道理上有一定的成本優勢。 資源獨立性 - 當一個團隊共用一些互聯網服務時,可能會互相干援。即使團隊在開發時,可以經profile使用不同的資源,但發生誤用的情況還是很常見。(除非大家已經有一套很健全的開發用profile,只在本機生效,亦只在必要時才會被提升到程式碼的版本控制當中,不會誤會地覆蓋他人,也不會忘了提交。但這是很有挑戰的一件事)。反觀本地模擬,因為那些服務並不會在團隊中分享,就保證不會被誤用。 學習成本高 - 本地模擬,就有一個莫大的痛點,就是學習成本高。我們可以找到很多本也安裝資料庫的教學,本地LLM AI的架設也不少。但我們並不是很輕易地就可以無師自通,有時為了初次安裝,所花的時間成本也大得令人卻步。 coding anywhere轉移成本高 - 因為全部本地模疑,代表我們必需要有一台足夠強大的主機。但如果我們的移動接入點,綁定了在某台特定的強大主機,我們活動空間也相對減少。 互聯網模擬的得失 直接使用互聯網的服務,主要體現於用錢解決問題的優勢 即開即用 - 能用現成的就用現成的。例如你目標是使用mysql cloud database,就直接伸請使用。如果你還要在本地安裝或使用Cloud VM安裝,就還要自行安裝管理介面等工具。因為成本問題,實在要自行安裝,使用cloud vm也有一定的方便性。使用cloud vm 有一定的快取,可以減少安裝所需要的時間。當我們養成自動化的習慣,clould VM 也可以隨時刪掉,有需要才重起。 解決單機無法模擬的情況 - 某性依賴,並不能簡單地經過本地單一部主機去做到。例如我們要模擬一些叢集功能。我們可能要在主機或網絡設備作出一定的調整,才可能提供bridge network。這一點在辦公室網絡下限制更多,不是隨便就可以建一個可以互通,又可以訪問互聯網的環境。另一些如block storage等資源,還會對硬件有一定的要求,也不是軟件模擬就可以做到。我們若不經過互聯網取得,至少也要在團隊下的private cloud上去建立。(不過如果是從零自建private cloud環境,初次投入的成本可能直接使用public cloud 低。 ) coding anywhere轉移成進一步下降 - 作為移動接入點,就剩下那些不可互聯網化的部份,例如domain name,有時還是localhost比較方便,又例如有一些硬件相關開發,硬件部份必需經過本地接入。 就以筆者的個人經驗來講,除非public cloud的價錢實在不可接受又或是自動化幾乎不可能,否則使用public cloud會有時間成本上的絕對優勢。如果要走本機模擬方向,必需要對Container、VM、網絡等有深刻的了解,才會成事。