搜尋

搜尋結果

台灣華語樂壇巨星田馥甄、林宥嘉、閻奕格 呈獻最終場台灣音樂紅人騷「炫音狂熱」的音樂盛會
音樂聯合國
LifeMag Editor・2015-12-07

《超級星光大道》冠軍閻奕格 《超級星光大道》冠軍閻奕格 林宥嘉在魔幻間 炫音狂熱-台灣樂壇小王子林宥嘉 Hebe在魔幻間 炫音狂熱-台灣文青女神田馥甄 新濠影滙綜藝館獨家呈獻台灣音樂紅人騷「炫音狂熱」繼續為樂迷帶來第三場音樂盛會,由台灣文青女神田馥甄(Hebe)、台灣樂壇小王子林宥嘉以及電視歌唱選秀節目《超級星光大道》冠軍閻奕格為最後一場「炫音狂熱」壓軸演出,於新濠影滙繼續發放無限巨星級娛樂。 田馥甄和林宥嘉表示:「這是一個非常難得的演出經驗,讓我們有機會於這個世界級綜藝館中近距離與樂迷共襄盛舉,希望這個獨家呈獻的演唱會能夠讓樂迷全心全意的陶醉其中。」在新濠影滙綵排演唱會期間,一眾歌手更親臨新濠影滙其中之旗艦娛樂項目及澳門首個大型魔術滙演「魔幻間」。 新濠影滙綜藝館獨家呈獻台灣音樂紅人騷「炫音狂熱」,由一眾巨星級台灣華語樂壇歌星聯手呈獻,聯同台灣著名製作人陳鎮川及其製作團隊親力打造的三場頂級音樂盛會系列。 新濠影滙 – 這才是娛樂 有關新濠影滙的資料,歡迎瀏覽: www.studiocity-macau.com 及加入新浪微博www.weibo.com/studiocity或Facebook http://www.facebook.com/studiocitymacau

斷捨離學會25日舉辦個人成長工作坊 歡迎市民參加
文化創意
陳康妮・2023-10-24

澳捨離10月25日晚上7:30分舉辦個人成長工作坊。歡迎澳門市民參加: 斷捨離是一種由日本瑜伽師沖正弘提出的生活理念,意思是「斷絕不需要的東西、捨去多餘的物品、脫離對物品的執著」; 這種理念被認為可以幫助人們減少生活中的負擔和壓力,提升自我認識和自我區分,增加生活品質和幸福感; 家庭系統是一種以婚姻、血緣、收養、同居等關係為基礎而形成的共同生活單位; 家庭系統中的成員彼此相互影響,形成一種情感連結和互動模式; 家庭系統也會受到外在環境和文化的影響,產生變化和適應。 那麼,斷捨離與家庭系統有什麼關係呢?我們可以從以下兩個方面來看: 從心理學的角度來看,斷捨離可以幫助人們提高自我區分的程度,也就是區分自己的理智和情感,不受他人或物品的牽制; 這對於家庭系統中的成員來說,是一種重要的能力,因為它可以讓他們在保持親密關係的同時,也能保有自己的想法和立場,不會過度依賴或反抗家庭系統; 這樣可以減少家庭系統中的衝突和矛盾,增加溝通和理解,促進家庭系統的和諧與健康; 從社會學的角度來看,斷捨離可以幫助人們實踐理性消費,也就是在購買物品前思考是否真的需要,是否符合自己的價值觀和生活方式; 這對於家庭系統來說,是一種有效的資源管理,因為它可以讓家庭系統節省時間、空間、金錢等資源,避免浪費和囤積; 這樣可以提高家庭系統的生活水平和滿足感,也可以減少對外部環境和文化的依賴或追隨; 綜上所述,我們可以看到斷捨離與家庭系統有著密切的關係,它們既相互影響,又相互促進。通過實踐斷捨離,我們不僅可以改善自己的心理狀態和生活品質,也可以改善自己與家庭系統中其他成員的關係和互動,進而提升家庭系統的功能和幸福感。

靜謐海島的慢時光療愈 —— 鷺環海天度假酒店的康養之旅
生活在我城
小燕品味・2025-07-13

當城市的秒針總在耳邊滴答作響,總有一片海,願意等你把時間調慢 —— 這便是澳門唯一擁有沙灘海景的「鷺環海天度假酒店」,一處藏在山海間的康養淨土。 坐落在路環島東南端的它,左擁青山,右抱黑沙灘。推開房間露台門,藍天與碧海在眼前鋪成無邊畫卷,腳下細軟的黑色沙粒是大自然的獨特饋贈;漫步園林,青草與泥土的芬芳纏繞鼻尖,海浪拍岸與鳥鳴啾啾組成天然白噪音。在這裡,度假從不是刻意的「放鬆任務」,而是讓身心自然而然地沉入自然懷抱,與海島的寧靜共振。更妙的是,它與繁華保持著恰好的距離 —— 距離熱鬧的路氹金光大道僅 10 分鐘車程,既能逃離喧囂,又不隔絕便利。 一場與山海共生的康養盛宴 今年六月,這片海島秘境剛剛見證了一場溫柔的覺醒 ——「夏至康養瑜伽靜修」在此圓滿落幕。這場酒店與 Wellness Yoga Events 聯手打造的沉浸式體驗,讓追求身心平衡的賓客們,在夏至與國際瑜伽日的雙重祝福裡,度過了三天與自然共生的時光。 作為參與者,我至今仍記得那份感動:因時差輾轉醒於凌晨五點,起床後便外邊的風景吸引, 走至露台時,恰好遇見太陽躍出海面 —— 第一縷金光刺破雲層的瞬間,海浪似乎也靜止了,那一刻的奇妙光景,成了全天最溫柔的開場。清晨的戶外瑜伽,以椰林為幕,以浪聲為韻,每一次伸展都與晨光共振,每一次呼吸都裹挾著海風的清冽;午後的音缽療愈,聲波穿過枝葉縫隙,將肩頭的壓力震碎在空氣中,冥想課上,鳥鳴成了最好的指引,引領我們潛入內心的寧靜深處;水中瑜伽更是巧妙融合了清涼與力量,讓緊繃的肌肉在流動中漸漸舒展;還有一場場身心工作坊,像一把把溫柔的鑰匙,輕輕打開平衡生活的門徑。待到夜幕降臨,抬頭便是漫天星光,伴著海浪聲入眠,連夢都變得輕盈。 參與者們都說,這不只是一場活動,更像一次「生活重置」—— 在這裡,終於有勇氣卸下累積的重負,擁抱徹底放鬆的心境,最後帶著重生般的活力重新出發。原來真正的康養從不刻意,當你與自然足夠親近,和諧便會自然而然地發生。 日常即修行,在這裡時時發生 在這裡, 酒店的每一天都是「微康養」的完美注腳:清晨沿黑沙灘追一場日出,腳踩獨特的黑色沙粒感受大地的溫度;午後在園林的藤椅上靜坐,看陽光透過葉縫灑下跳動的光斑;傍晚看夕陽將海面染成流動的金紅,任海風梳開糾結的思緒。 鷺環海天度假酒店定期舉辦康養活動,7月,酒店與 Soul Healing Macau頌鉢導師Ganaa,合辦了頌缽聲頻浴之旅。參加者在溫和的頌鉢聲浪中釋放身心,重尋平衡。置身自然懷抱,一場專屬的寧靜之旅徐徐展開。無論是初探聲療的探索者,還是想為繁忙的生活節奏按下暫停鍵,都能在此被療癒頻率包裹,讓心靈於海島一隅回歸本真的平靜。 在澳門這座永不落幕的城市裡,鷺環海天度假酒店像一顆被山海捧在手心的明珠。它用最溫柔的方式告訴我們:最好的度假,不一定要奔赴遠方,有時讓身心在熟悉的山海間舒展,讓日子在晨光與浪聲裡,慢慢釀成詩就是很好的方式。 鷺環海天度假酒店 地址:澳門路環黑沙馬路1918號 電話:+853 2887 1111 了解更多: https://www.artyzen.com/sc/hotels/grand-coloane-resort/ 電郵: info.glm@artyzenhotels.com

吉祥殊勝——故宮與扎什倫布寺珍藏文物展
生活在我城
小燕品味・2024-03-02

澳門藝術博物館年度大展”吉祥殊勝——故宮與扎什倫布寺珍藏文物展”,共展出137 件珍貴藏品,分別以〝從須彌福壽之廟至紫禁城”、〝來自扎什倫布寺的藝術”及〝六世班禪的遺珍”三個單元,引領觀眾走進歷史深處,感悟藏傳佛教悠久歷史的文化積澱和藝術瑰寶的歷程。現場還設有多個互動區,包括輕觸螢幕自製”如意卡”圖像,向親友傳遞吉祥福氣! 展品中以六世班禪赴京覲見乾隆帝的相關文物最受矚目,觀眾可從皇帝冊封班禪的金印金冊、乾隆皇帝與六世班禪之間的貢賜往來文物、佛像敕文等,見證清代西藏地區與中央政府的密切往來,以及西藏地方與乾隆時期宮廷之間藝術與技術的互動。 筆者參觀當日適逢周六, 館方設有導賞服務, 聽取導賞員對多件重點展品作出介紹, 讓參觀者對展品有更深入的了解。 據介紹, 藏傳佛教歷史悠久,自17世紀以來在中國歷史上扮演著重要角色。扎什倫布寺是歷世班禪的駐錫地,為藏傳佛教格魯派著名的四大寺之一。在清代,歷世班禪與中央政府建立了密切的政治關係,貢賜往來十分頻繁,現存故宮博物院和扎什倫布寺的文物,就是關於這段歷史記憶最重要的見證。清朝皇帝尊崇藏傳佛教,在繼承漢、藏佛教傳統的基礎上,製作了大量的佛教藝術品。如今保存在故宮博物院的藏傳佛教文物中,既有清宮造辦處的精良製作,也有蒙藏地區進獻而來的珍貴作品。它們既是歷史的見證,也展現中華民族對待文化開放包容、兼收並蓄的態度,具有珍貴的文物價值與歷史價值。 本次展覽展出故宮博物院和扎什倫布寺收藏的137件珍貴藏品,從歷代班禪與清代宮廷交流往來的視角,展現多民族團結與融合的經過,以及歷世班禪大師為建立統一多民族國家而做出的貢獻。 單元介紹 從須彌福壽之廟至紫禁城 自 1447 年一世達賴喇嘛根敦珠巴興建扎什倫布寺以來,扎什倫布寺就成為了後藏地區傳播格魯派教法的重要基地。四世班禪額爾德尼以後,扎什倫布寺的住持都只由歷輩班禪擔任,可見地位之重。1713 年,清朝康熙帝正式册封五世班禪為“班禪額爾德尼”,賜金册、金印,並加封以前歷世班禪,正式確認其宗教地位和政治地位,自此歷世班禪須報中央政府册封成為定制。由於歷世班禪與清朝中央政府關係密切,貢使不斷,大量的册印、檔案、文物得以留存並見證了班禪額爾德尼的歷史貢獻和教法地位,而作為班禪駐錫地的扎什倫布寺,也與紫禁城有了深遠淵源。 來自扎什倫布寺的藝術 扎什倫布寺作為格魯派四大寺之一,佛學修為精嚴,頗為西藏各派所推崇,是後藏的代表性寺廟,也是重要的佛學中心、藝術中心和文化中心。扎什倫布寺保存了大量珍貴的早期漢地以及喜馬拉雅地區的古代藝術珍品。另外,其官屬作坊扎什吉彩生產的扎什琍瑪銅造像和大量仿尼泊爾風格及古代印度風格的作品,類型豐富,風格多樣,技術精湛,曾對清乾隆時期的宮廷造像產生過較大影響。同時,扎什倫布寺也是後藏地區重要的繪畫中心之一,活躍於 15 世紀的著名藝術家勉拉頓珠曾長期駐錫扎什倫布寺,參與唐卡和壁畫的創作並著述授徒,使扎什倫布寺成為藏區近代影響最大的繪畫流派——勉唐畫派的大本營。 六世班禪的遺珍 清朝康熙帝曾邀請五世班禪額爾德尼進京朝覲,由於種種原因未果。直到清乾隆四十五年(1780)乾隆帝七十萬壽時,在各方努力下,六世班禪毅然東行,率近三千人的隊伍不遠萬里來京為乾隆帝祝壽,後圓寂於北京,衣冠埋葬於西黃寺。他此行意義非凡,為維護清朝中央政府與西藏地方的關係作出了重要的貢獻。六世班禪東行留下的大量文物仍完整保存於故宮博物院,而宮廷賜品也深藏於扎什倫布寺中,鮮為人知。本部分將系統展示六世班禪向乾隆帝敬獻的賀禮、乾隆帝賞賜給六世班禪的各種禮物以及西藏地方與乾隆時期宮廷之間藝術與技術的互動。 本次展覽設有吉祥殊勝——故宮專家系列講座, 3月 17日將澳門藝術博物館一樓演講廳舉行〝清宮佛堂內的陳設與班禪貢物〞為主題的講座, 有興趣參加的朋友可於3月5-13日透過一戶通活動報名服務進行報名(手機APP)或(網頁),名額共100人,抽籤錄取,免費參加。 ”吉祥殊勝——故宮與扎什倫布寺珍藏文物展” 地點: 澳門藝術博物館四樓 展覽日期:2023/12/16 - 2024/03/17 公開導賞服務日期: 2023/12/20 - 2024/03/17 (逢星期六、星期日及公眾假期 15:00-16:00) 吉祥殊勝——故宮專家系列講座 17/03/2024(星期日) 15:00-17:00 主題2:清宮佛堂內的陳設與班禪貢物 語言:普通話 地點:澳門藝術博物館一樓演講廳 名額:100人,抽籤錄取,免費參加 報名方式:05-13/03/2024透過一戶通活動報名服務進行報名(手機APP)或(網頁) 本文資料來源: 澳門藝術博物館官網 https://www.mam.gov.mo/cn/exhibition/2023_golden_eminence 筆者在現場互動區自製”如意卡”圖像,向親友傳遞吉祥福氣!

陳康妮:學會7 種生存技能,讓學生為未來做好準備
文化創意
陳康妮・2023-05-22

作為教育工作者,我們不斷努力讓我們的學生為他們周圍存在的“真實世界”做好準備。 我們教他們如何閱讀、寫作和計算。 然後,當然,還有我們教授的不太有形的技能; 例如如何在團隊中工作、批判性思考以及對每天遇到的事情保持好奇。 一旦他們離開我們並進入成年期,我們希望讓他們做好準備,過上富有成效和成功的生活。 但是,我們學生的未來會怎樣呢? 二十年前的教育工作者是否知道我們這個世界的大部分將基於計算機和技術? 他們是否知道當今的就業市場需要哪些技能? 不太可能,但無論如何,他們必須盡最大努力讓學生為這個世界做好準備。 如今,教育工作者仍然肩負著同樣複雜的任務——讓學生為未來做好準備。 哈佛大學的托尼瓦格納致力於揭示 21 世紀所需的 7 種生存技能。 為實現這一目標,我們採訪了數百名來自商業、非營利組織和教育機構的首席執行官。 根據他們的回答,我們編制了一份清單,列出了人們在 21 世紀生存和繁榮所需的七項技能。 我們可能無法確切知道學生未來的發展方向,但我們的優勢在於知道他們到達那里後需要具備哪些技能。 以下是 21 世紀的 7 種生存技能,以及它們在課堂上有目的地應用的樣子。 學生永遠需要的 7 種技能 技能#1:批判性思維和解決問題 準備:學生需要培養從不同角度看待問題和製定自己的解決方案的技能。 無論他們選擇進入哪個領域從事職業,快速思考和行動的能力都是未來不可或缺的工具。 為了實踐這一點,教師應該向學生展示他們需要自己解決問題的情境——在這些情境中,他們可以利用和應用他們已經掌握的技能來幫助他們解決問題。 理想情況下,問題應該適合於多種解決方案,因為我們不想告訴學生只有一個答案可用,而是解決問題可以是一種創造性的個人體驗。 數學中的情境問題為這些技能在工作中提供了一個很好的例子。 技能 #2:跨網絡協作和影響力領導 準備:了解並非每個人都是天生的領導者。 然而,領導他人的能力絕對可以幫助一個人在他們選擇的職業中取得進步並取得成功。 此外,找到一份不需要與他人密切和諧地工作的工作可能是一項艱鉅的任務。 為了讓學生在這方面做好最好的準備,需要的不僅僅是典型的團隊合作。 與其簡單地組成一個小組並相互分配任務,不如鼓勵學生在小組中為項目中的每項任務承擔不同的角色。 有時他們可以是“經理”,有時他們可以是“組織者”或“平面設計師”。 在與同齡人一起完成的項目中,學生可以擔任許多不同的角色,這使他們能夠以更具協作性的方式與他人合作,而不僅僅是拆分項目然後最後將其重新組合在一起。 技能 #3:敏捷性和適應性 準備:如果我們回顧過去的二十年,我們可以看到工作場所和世界發生了多大的變化。 我們的學生需要適應變化的想法,並願意適應周圍的變化。 教師可以在課堂上創造一個充滿活力的環境,幫助學生為未來做好準備。 改變我們使用的教學策略、教室的佈置、學生展示學習的方式,甚至小組作業或家庭作業的指導方針,都可以幫助學生學會適應。 例如,讓學生創建一個故事情節,然後用一個必須包含的元素給他們驚喜,或者甚至讓他們切換工作並根據另一個人的準備工作完成一項任務。 他們一開始可能會抱怨,但這些技能會很好地為他們服務! 技能#4:主動性和企業家精神 準備:學生需要能夠採取主動並為世界做出貢獻。 我們應該在我們的課堂和社區中鼓勵這些技能。 我們的學生可能非常有創造力,並且對塑造他們在課堂上的體驗很感興趣,因此我們可以要求他們提供的不僅僅是課堂規則和後果的清單。 讓他們知道您有空並願意傾聽他們關於改善課堂或學校的任何想法。 幫助他們組織想法並將其付諸實踐——即使一個想法可能會失敗。 關於如何分析出了什麼問題並考慮如何改進這個想法,這可能是一堂寶貴的課。 學生永遠不應該害怕嘗試,因為他們害怕失敗。 技能 5:有效的口頭和書面溝通 準備:儘管技術不斷進步,但這些技能的重要性從未減弱。 想一想老闆或經理向您發送了一封充滿語法錯誤的電子郵件,或者在講話時語氣太低並從一張紙上閱讀了整個演示文稿時提出了新的業務計劃。 老實說,你會怎麼想? 想一想您見過的一些最出色的溝通者——是什麼讓他們脫穎而出? 我們需要教我們的學生如何自信而清晰地說話。 這不是自然而然的,而是需要練習的; 發音、速度、音量、手勢和眼神交流都可以教和學。 在戲劇中有所幫助的技能同樣可以在口頭交流中有所幫助。 有一天花一點時間開始以一種非常低效的方式上課,看看你的學生要花多長時間來問你在做什麼……他們應該能夠準確地告訴你你的溝通技巧有什麼“問題”! 至於書面交流,我們需要繼續強調規則,同時也要教學生如何使用他們可用的技術來幫助檢查他們的寫作。 正式和非正式寫作之間的區別對於學生學習和開始應用非常重要。 技能 6:獲取和分析信息 準備:如今,學生可以獲得難以想像的大量信息。 互聯網提供了一種令人難以置信的研究工具,可以成為他們最好的朋友或最大的敵人。 獲取信息很容易,但獲取好的信息往往更複雜。 需要教導學生如何篩選關於某個主題的數百萬個可用網頁並找到他們需要的內容(並且能夠相信他們找到的內容)。 他們需要了解事實信息和聽起來像事實的觀點之間的區別。 今天的許多學生會檢查“答案”網站來收集信息,而不是真正考慮這些信息是如何由一個可能正確也可能不正確或在某個學科領域真正知識淵博的人編寫的。 同樣,老師可以“有聲思考”閱讀策略,我們可以有聲思考互聯網搜索策略。 將您的屏幕投影到白板上,並與您的學生一起了解某個主題。 向他們展示如何搜索,以及如何在不被誤導的情況下使用這些“答案”網站! 技能#7:好奇心和想像力 準備:我們的學生自然而然地來到我們這裡,對他們的世界充滿好奇並想要探索它。 他們的想像力是廣闊而無拘無束的,創造出無窮無盡的實用和不實用的東西。 作為教育者,我們的任務與教他們如何保持好奇心和想像力無關,更多的是不要剝奪他們的好奇心和想像力。 我們需要繼續鼓勵他們發展這些技能,並教他們如何創造性和有目的地應用它們。 想像一下喜歡士兵和機器人但不喜歡公主的小男孩。 當他向您展示他新繪製的士兵使用機器人武器摧毀公主的照片時,您有何反應? 你是否像慶祝他旁邊的學生畫的拯救世界的機器人一樣慶祝他的創造力? 牆上掛著他的照片嗎? 我們並不都喜歡和欣賞相同的事物,因此教育者必須非常小心地培養和發展學生的創造力和想像力。 我們可以教他們什麼事情在什麼情況下是合適的,而不會讓他們覺得他們的想法是錯誤的或不好的。 陳康妮 Miss Connie 澳洲墨爾本大學主修教育管理學 英國倫敦大學主修心理學 都柏林大學 (愛爾蘭國立大學) 主修工商管理學 大學講師 美國國際青年培訓師 (26年港澳企業培訓經驗) 美國全球職涯發展師 澳門創新創業專家 澳門職涯發展師 澳門資深教育學者 澳門作家 出版書籍:澳門教育創新 澳門斷捨離學會主席 (澳門會友26000人)

男子遭女友分手,男子以“5秒性愛片”要挾複合!
其他
澳門生活圈・2019-07-03

自近日两名6岁女童被侵犯一事 让众人心中燃起一团火 两名犯案者的兽性行为 简直令人难灭心头之恨 而事件刚过不久 再度传来另一宗涉及性爱事件 原本为男女朋友关系 但却因分手而作出不法行为 一时冲昏头脑 令爱情再无回头之地 早前,本澳一名20多岁女子向男友提出分手,但不知是否来得突然,男友接受不了事实,却做出了令人难以想象的事情。 2人曾一度热恋,在凼仔同居近9个月后分手,面对女友提出分手,男子曾一度要求女友回家及复合不果; 然而,男子不甘于分手一事,以昔日2人在发生性行为偷拍的5秒性爱影片,要挟女友回到同居的住宅单位,如果不接受的话,就将在社交平台公开发布性爱短片。 由于女事主担心影片流出,迫于无奈之下,就返回凼仔住所收拾行李,期间,男子再度要求女事主复合,但再遭女事主拒绝。 怎料,却遭来男子的拳打脚踢,导致左右手臂均被打伤。 当时,遭受暴力对待的女事主没有实时向警方求助,毕竟相爱一场。 但事至本月1号早上10点到晚上7点,男子不断透过微信和电话对女事主作出滋扰,女事主最终承受不住疯狂般的滋扰,作出了报警求助的地步。 同日,治安警到该单位将男子带返警局接受调查,男子供称,与女事主为情侣关系,2人同居9个月,并指有关私密影片是在双方同意的情况下拍摄的,而片段已经在手机内删除。 现时,警方已“以不法录制及照片罪”对其落案起诉,移交检察院跟进。 涉案人姓刘,男性,28岁,澳门居民,报称保险经纪。 事件一出,就颇受网民关注,纷纷留言评论区:“何必呢为一个不再爱你的伴侣而触犯刑法,值得吗”,“超冇品的垃圾男人”,“有眼无珠”,“相爱相杀”等等。 其实,要挟这件事情真的过分了,且还对曾经女友动起手来,的确枉为一个男人,卑微到极致就做出了疯狂的行为压死了他們感情的最后一根稻草。 在成年人的世界里,以这种方式的挽留,只会被嘲笑为幼稚而已; 然而对于女方来说,分手一事也早看清了一个人,是对是错,其实心中早有定数。这尘世间的爱情分分合合真的是难以猜透。 经常听到别人说,男人多情且长情,女人专情且绝情,痴情的女人一旦醒来,没有什么留得住她。到最后,女人往往会比男人更决绝。 在爱情这条道路上,有的人会是很甜蜜,有的人会是很坎坷,还有的就是兜兜转转回到原点... 然而,小编却是 材来源:治安警察局,网络 图片来源:治安警察局,摄图网,表情包 如有侵权,请联系我们删除 版权属于原作者 编辑撰写:小噜

雲系統的持續更新,大家的選擇是什麼?
科技新知
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、網絡等有深刻的了解,才會成事。

Docker 中的非管理員用户 Docker non-root user
科技新知
MacauYeah・2025-03-14

Container USER為何重要 在制作Docker Image的過程中,有時會接觸到 USER 這個設定。這事關到最後的 Docker Container內部運行的那個 user 到底會有什麼權限。大家也要知道,Docker Container 其實也只是一個 Linux 上的程序,也就是如果Container內權限過大,也有機會從 Container 內部存取到 Host上的資料。 一般情況下,Docker Image 預設的 USER 就是 root,最基礎的base image都是一樣。而我們想換,其實也相當簡單,就像Linux上起User一樣,只要經指令RUN adduser xxx 或RUN useradd xxx 也可以在 Docker Image 中創建帳號和 home 資料夾,之後就隨時經USER xxx來切換 實際上是不是這麼簡單? 如果你將要Container中執行的程序,是一個binary,平常你在Linux中也是以 non-root 方式執行,那麼是的,就是那麼簡單。例如你執行系統中的java, node, python,原本在Linux中就已經是誰都可以,那麼你的docker container 也應該沒有難度。 但如果原本的安裝包,預設是由system service來啟動,我們就要花點力氣,看看那個service是怎樣呼叫binary的,然後就一步一步模擬它的做法。例如筆者有打包的codeserver,預設是system service啟動,但它也有提共binary的執行方法,安定好home資料夾後,我們也可以手動啟動。 泛生之檔案權限問題 上述binary的情境之所以簡單,是因為大部份情況下,我們都只對於container 內部運行考慮即可,因為預設投產情況下的運作模式,都是隨時起、隨時刪、隨時砍掉重練,只要container內部運作可以自給自足,就可以了。Docker Swarm的運作也是如此,所以它不預期有的持久化資料權限的問題。 而持久化資料權限的問題,其實早在單個Linux伺服器就已經存在。同一個伺服器中,不同process就有不同的UID,當他們需要共同讀/寫某些檔案,就會設定多人權限。同理,當多個Container要共同檔案,也是同樣問題。在討論共享檔案之前,我們先看看預設 Docker Storage Mount 會給我們什麼權限。 如果是bind mount,bind mount的權限預設會是Host內的檔案或者資料夾的權限。 如果Host是root,container內是non-root,container有機會無法讀寫bind mount內的檔案。 留意權限設置就可以解決問題 如果Host是non-root,但container 內是root,從container內生成的檔案,Host的non-root user就無法使用。 Host是non-root的話就一定無解,Host至少有sudo權限,臨時變成管理員,去修正問題。 如果host和container也是non-root,但UID不夾,其實也不能交換使用。 跟上述一樣,最後要靠sudo來解決問題。 如果host和container也是root,就沒有權限問題,但就有安全性的風險。 如果是volume mount,就還是看看 mount path 是docker image layer中現有的 path還是新起的path 大部份手動建立的named volume都是root 經docker compose起的named volume滿足以下條件的話,將會是non-root。 docker image 中的已有該path存在。 named volume未存在,docker compose會把對應path的內容在初次建立時抄到named volume 中。 例如ubuntu:24.04中的/home/ubuntu,存在於docker image中,它的擁有者就是UID 1000,我們經docker compose HOME_VOLUME:/home/ubuntu,在HOME_VOLUME建立時,就會是UID 1000。但如果是 NOT_EXISTS:/home/ubuntu/somethingNotExists,那麼NOT_EXISTS建立時,也會是root 上述討論的Storage mount是集中在單機情況下,使用HOST OS的本地儲存。若現在的場境是多機共享的share storage,就會更麻煩,還要看看那個share storage本身的屬性。例如常見的Linux NFS,其實有指定的權限,跟NFS的Login權限有關,如果你的process本身對檔案權限很敏感,就請先不要挑戰NFS(例如postgresql)。 Rootless mode - Rootless 模式 Rootless 模式指的是在Host中,執行Container的使用者,不需要是管理員,筆者就常用於開發環境中。投產環境中反而沒有聽過這樣的討論,因為投產環境很少可以讓非管理員去執行這麼重要的環境管理。 雖然只是開發環境,但這像前述的bind mount討論中,如果Host是non-root,但container 內是root,又或是兩者non-root,但UID不夾,也會出現權限問題。無腦的將host user加入docker group,只可以讓非管理員可以運行docker,但解決不了權限問題。 真正有條件解決的,可能就會向linux subgroup的方式發展。暫時筆者用得比較順的rootless mode,可以無腦用的,不是docker,是podman。有興趣的朋友可以經podman官網看看教學,它給筆者的感覺就像是自動轉換UID。 podman rootless mode 想看更多 筆者已經將過去的文章重新整理成gitbook,有興趣睇更多的讀者,可以來筆者的gitbook再翻一翻 https://macauyeah.github.io/AProgrammerPrepares/

發佈Docker Swarm App的選擇 - CI/CD系統的參與
科技新知
MacauYeah・2023-08-25

一段時間前,筆者就討論了一些Docker打包的程式的文章,也討論了一些Docker Cluster環境下的選擇。現在也是時候,可以分享一些對於發佈環境的可選空間。 CI/CD系統 CI/CD 全稱是continuous integration (CI) 和 continuous delivery (CD),字面上代表的持續地集成和發佈,實體上就是某台伺服器自動發佈APP。因為使用到Docker Cluster,不論前述什麼選擇 (前文連結 請點這裏),都會有多個node(節點)的出現。要發佈App,總不能一個個node逐個登入設定。所以我們需要一些CI/CD工具,把這個過程都自動化。 在筆者的認知上,CI/CD系統,由兩個部份組成,一個是取得Source Code(程式原始碼)的過程,一個是編譯或發佈Source Code的過程。Gitlab,Github,BitBucket等大型的代碼庫供應商,它們天生為了保存Source Code而提供服務的。不少CI/CD系統都可以跟它們整合,它們提供了存取Source Code的部份,剩下你只要能提供編譯或發佈的伺服器就好。 如果作為小型開發團隊,很少會有意願去自己花錢養一個編譯或發佈的伺服器。(極端地,如果我就是一人團隊,我用自己電腦編譯和發佈就好,伺服器能做的,我自己也能做。)好消息的是,Github提供了一個叫Github Action的CI/CD系統,即使你沒有自己的編譯專用的伺服器,Github Action也可以用Docker Image,提供一個臨時的編譯程序,用完就刪掉。詳細功能還請各位先查看官方教學,筆者也暫時只能零星使用經驗,無法給出有意思的架構。 如果對智慧財產權有高度重視,Source Code不能存放在公開的伺服器,那麼Gitlab Enterprise Edtion則是一個好選擇。運用Gitlab ee,你可以用自己的機器,造一個純本地的庫存伺服器。更強的是,它內建也有CI/CD系統,只要你有間置的伺服器,就可以作為編譯使用。筆者也是從這個方向著手,架設了自己的Gitlab Runner(Gitlab CI/CD系統)。在這裏,就分享一下與Docker Swarm整理的概念。 對於前述兩種選擇,GitLab Runner都可以做得到 底層程式打包成Image並運行在Swarm mode上,每次發佈的是App Binary(執行檔或核心檔案)。 把App直接打包成Image,並運行在Swarm mode上,每次發佈的是App Image。 CI/CD - 打包底層程式成為Image 在這個選擇下,其實就跟傳統自動化發佈的做法類似,只是發佈時,要多個node報行更新指令。如果你使用的底層程式原本就有支援多版本並行,這樣更新時就不用太操心rollback(回滾?)等操作。若系統不支援多版本並行,為求簡化,若遇到要rollback的情況,重跑過去舊的CI/CD操作也是一個做法。當然,我們也可以經過一些備份的操作,來保存被代替的程式,若在發佈過程中出問題,也可以手動重來,不過整件事就越來越複雜。 筆者發佈的基本思路是 使用docker image,編譯和打包App Binary。 使docker image做編譯的好處是,你可以比較放心地假設每次編譯時,你的編譯環境都是乾淨的。 傳送上述的結果至生產環境可以取用的地方。 跳入生產環境執行更新指令 這裏有些隱藏的管理成本,如果你生產環境中有多個node,最後那幾行指令就要多抄幾次。 CI/CD - 打包App成為Image 在這個選擇下,對比傳統自動化發佈的做法,現在要多做一步,就是要包裝自己的Image。不過好處是docker swarm有提供監測工具,在發佈過程每個分身會逐個更新,前一個分身更新成功後才會到下一個分身更新。而且 rollback等的操作,你可以靠docker做到。即是要手動rollback,也可以透過更正docker tags來達到,所以整體上來說沒有比傳統的麻煩。 筆者發佈的基本思路是 編譯App Binary。 打包成docker image。 經docker上傳image。 跳入生產環境執行更新指令。 對比傳統自動化發佈的做法,最後的更新指令,只要執行一次就可以。當然,原本在Docker Swarm中要管理的事還是要好好管理。 CI/CD - 備註事項 雖然CI/CD可以幫忙簡化更新的過程,但實際操作會比上述的例子複雜一些。因為通常對非技術型的外界用戶來說,一個Web App會包含很多不同的功能。上述的例仔,在實際情況下可能需要拆解成很多微服務來進行。所以對管理上還是有相當的挑戰。