搜尋

搜尋結果

[翻書倒櫃] 微小習慣改變人 - 《原子習慣》
文化創意
君尋・2020-11-20

一個微小的改變可以扭轉人生嗎?《原子習慣》一書的作者相信,透過改變微小的習慣帶來的小進步,持續堅持下終有一天能帶來巨大的成就。作者認為建立習慣的最終目的,是讓我們能在每天選擇做正確的事。雖然可能只是每天取得原子般大小的進步,但日積月累和複利效應的影響下,一年後、五年後或者十年後的改變就變得非常明顯。關於「養成習慣」的議題,多年來已有不少書本探討,《原子習慣》的不同之處在於,作者認為該改變的不只是外在行為。驅使我們開始某個習慣的源動力確實是情緒,提供動力給我們踏出第一步。但熱情過後,習慣就只是某種行為的重複,很容易變得無聊。因此要開始和持續一個新習慣,該思考的不是要「達成怎樣的目標」,而是我們「想成為怎樣的人」,要改變的是對自己的身份認同。 書中提出四大原則,讓我們能有效率持續新習慣並減少已存在的壞習慣。第一個原則是「讓提示顯而易見」,每個習慣都是被提示所觸發的,因此增加身處的環境中的提示,讓這些觸發習慣的提示顯而易見。久而久之環景便會連結你的習慣,並成為你的提示。至於自制力是否觸發習慣的關鍵,作者認為能以自制力控制自己的行為只是短期策略,長期而言不讓自己身處充滿誘惑的環境比較重要。例如想要養成讀書的習慣,比起充滿誘惑的家裡,到圖書館閱讀的效果必定更高。緊接下來的原則是要「讓習慣有吸引力」,加強由「提示、渴望、回應、獎賞」構成的「習慣迴路」中,我們對獎賞的預期的正面感受,而非實際的獎賞,更能有效吸引我們實行該習慣。同理,當強調避免不良習慣的益處,便可使壞習慣的吸引力減弱。第三個原則是要「讓行動輕而易舉」,本章中提出我們需要不斷重複習慣,讓行為漸漸變得自動化。比起執行習慣時間的「長短」,執行習慣的「次數」之多寡更為重要。就像筆者本人今年開始了到健身房健身的習慣,雖然只是每天上班前運動三十分鐘,但不經不覺已持續半年有多,確實養成「運動的習慣」。若每天要求自己運動一小時,單是想像已經接受不了,更何況要持續半年。最後一項是要「讓獎賞令人滿足」。須謹記大腦會被立即的獎賞所吸引,並使人願意重複帶來此獎勵的行為,反之亦然。其中一種使人感到滿足的獎賞就是進步的感覺,可藉由記錄「進步的證據」。如本人每天記錄有沒有運動以及到健身房的總次數,讓我自身的進步可以被看見,大大增加「運動的習慣」的滿足感。 雖然作者傳授如何養成良好習慣的要點,但同時亦認為我們應慎選「習慣」。每個人天生的條件不一樣,在有利條件下透過上述的方案當然能有效達到目標,但同時亦無法完全扭轉在不利條件下的劣勢。選到正確的習慣我們很易便會進步,選到錯誤、不合適的只會讓我們充滿掙扎。此外,養成好習慣的同時,必須要認清一點,習慣會養我們不經思考行事,即代表我們不再注意到此習慣當中存在的問題。因此,盡管養成了良好的習慣,亦要謹記反省與復查的重要性,兩者並兼才可達致通往巨大成就的成功之路。 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 關於今回 [翻書倒櫃] 的推介書本: 書名: 《原子習慣》 作者: James Clear 出版社: 方智 出版日期:2019/06/01 更多關於專欄 [翻書倒櫃]的閱讀心得:https://ppt.cc/fBQDFx

正宗台灣口味,有故事的“牛什面與蚵仔煎”!
其他
澳門生活圈・2019-07-24

●同步發布媒體公眾號 ●媒體排名不分先後 牛什面及蚵仔煎評測 台灣美食 台灣雖然離得比較近,但是去一趟台灣不算特別方便。那麼澳門有沒有一家台灣今天我們來試一下台灣美食的牛什面和蚵仔煎。 首先我們來看看這碗牛什面,其實就是牛雜面。 牛雜,又稱“牛雜碎”,是牛內髒的統稱,源於老廣州地區的一道傳統美食。 據說,上古一位大王在先農壇親耕祭祀農神時,突然天降大雨,大王看到當地百姓饑饉,立即下令屠宰親耕的牛,將其牛肉、牛肚、牛心、牛肝、牛百葉、牛腸、蘿卜等放入鍋中。 百姓食後醇正鮮美,味道甚好,至此流傳下來,搭配美味面條。最後再澆上美味的湯汁,一碗好吃的牛什面就這樣完成了。 這碗牛雜面用料新鮮,烹飪得當。牛雜嫩得來又富有嚼勁,嘗過的朋友們也是有著非常好的評價。 給大家介紹完這碗牛雜面後,接下來還有正點的美味跟大家分享一下,就是蚵仔煎。 蚵仔煎 蚵仔煎,是一道常見的家常菜,起源於福建泉州,是福建,台灣,潮汕等地區經典的傳統小吃之一。 關於它的起源,有一則有趣的故事。民間傳聞,公元1661年時,荷蘭軍隊占領台南,泉州南安人鄭成功從鹿耳門率兵攻入,意欲收複失土,鄭軍勢如破竹大敗荷軍,荷軍在一怒之下,把米糧全都藏匿起來,鄭軍在缺糧之餘急中生智,索性就地取材將台灣特產蚵仔、番薯粉混合加水和一和煎成餅吃,想不到竟流傳後世,成了風靡全省的小吃。 首先,這款蚵仔煎首先在我們習慣的一張大餅形狀,而是已經將其炒碎的狀態。但是在用料上還是比較豐富的,這一方面可以說對得起這個價格,值得大家去品嘗一番。 歡迎來到“憶條街”訂單詳情! 台灣菜館(皇朝店) ●店家幹淨整潔! ●價格優惠! ●專屬定制! 想嘗試的朋友們,可以通過憶條街進行外賣點單或者直接去店裏外帶。 店鋪地址 澳門倫斯泰特大馬路光輝菀地AU鋪。

米芝蓮首場「感官之旅」星級盛宴於新濠影滙盛舉行
專題報導
LifeMag Editor・2016-11-16

首屆米芝蓮與Robert Parker Wine Advocate:「感官之旅」星級盛宴由官方冠名合作夥伴新濠博亞娛樂全力支持,於11月11日晚假澳門新濠影滙盛大舉行,在數百名政府官員、酒店業專才、社交名人、傳媒友好及公眾見證下,為「米芝蓮2017港澳美食盛宴系列」揭開序幕。 是次盛會更邀得澳門特別行政區政府旅遊局局長文綺華女士擔任主禮嘉賓。澳門旅遊局是「米芝蓮2017港澳美食盛宴系列」的官方支持單位。 名廚Guillaume Galliot的「阿拉斯加雪場蟹沙律伴喇沙泡沫」 這場獨一無二的美酒佳餚盛宴雲集由七位國際頂尖名廚精心烹調的獨特菜式,包括金坂真次(東京)、Guillaume Galliot(澳門)、Björn Frantzén(斯德哥爾摩)、譚國鋒(澳門)、松尾英明(大阪)、梁經倫(香港)及Pierre Hermé(巴黎),當中六位更獲米芝蓮指南的肯定。晚宴以「感官」為主題,由知名荷里活服裝設計師Manuel Albarran獨家創作連串揉合華麗服飾及精彩舞蹈的細膩演出,營造一場視聽饗宴映襯桌上佳餚美酒,喚醒每位賓客的五種感官。 名廚金坂真次的「吞拿魚大腹、海膽及北海道三文魚籽」 新濠博亞娛樂餐飲部高級副總裁Kristoffer Luczak於歡迎辭中表示:「新濠博亞娛樂作為『米芝蓮2017港澳美食盛宴系列』的第一個及唯一一個官方冠名合作夥伴,我們非常高興於新濠影滙帶來這一場非凡絕倫的感官盛宴,為澳門締造另一個前所未有的歷史時刻。是次華麗盛會再度彰顯公司在探索、創新及呈獻最優質上乘的餐飲及款客體驗方面所傾注的熱誠和決心。新濠博亞娛樂歷來囊括逾200個國際及地區獎項,反映我們在各方面皆精益求精的終極目標。」 名廚Björn Frantzén的「北海道鮮帶子伴指橘、雲杉芽、曬乾帶子及北歐高湯」 Kristoffer Luczak補充道:「新濠博亞娛樂同時很高興看到是次盛宴為澳門打造成為區內令人嚮往的美食之都的過程中樹立了另一個里程碑,進一步推動澳門發展成為世界旅遊休閒中心。」 名廚譚國鋒的「桂花煙烤法國乳鴿」 星級盛宴的另一焦點,就是著名香港演員、美食家和跨界星級廚師謝霆鋒獲頒授首個「米芝蓮之友」的榮譽。是晚他更為「感官之旅」的賓客創作和烹調第一道菜「秋天的甜酸苦辣」(Senses of Fall),以烤甜椒、番茄和青瓜烹調出味道清爽濃郁的西班牙凍湯。 謝霆鋒的「秋天的甜酸苦辣」 謝霆鋒表示:「最簡單的食材往往最難處理。廚藝最吸引我的地方,就是能探索和演繹不同文化、味道和烹飪元素。我為星級盛宴創作的菜式運用了來自世界各地的蔬菜,包括澳洲番茄、西班牙青瓜、荷蘭的青紅椒,以及法國小紅蔥和大蒜。」他續說:「我以玻璃小杯盛載這些簡單的食材,以呈現它們最精緻的面貌。我更將多種口味的『鋒』味曲奇製成楓葉形,為這道凍湯增添秋天的色彩、香氣和味道,呼應現在季節的轉變。」 名廚松尾英明的「慢煮日本龍蝦、香菇及海藻」 在整個感官旅程中,Manuel Albarran以別出心裁的物料製作出多套超乎想像的服裝,並配合現代編舞、色彩斑爛的影像和每道佳餚散發出來的香氣,呈獻一場前所未有的震撼表演,觸動賓客的每寸感官神經。 名廚梁經倫的「廚魔超凡牛肉」 七位名廚各自設計及烹調的每道佳餚均配搭Robert Parker Wine Advocate高度評價的佳釀,包括精選Petrus系列葡萄酒,以及稀世珍貴的Quinta do Vallado ABF Old Tawny Port 1888。 名廚Pierre Hermé的「巴西帕伊內拉斯朱古力的精彩呈現」 米芝蓮與Robert Parker Wine Advocate:「感官之旅」星級盛宴圓滿結束後,另一美饌體驗即將於新濠天地的米芝蓮二星食府「御膳房」登場。於12月1至3日期間舉行的第三場國際大廚系列活動將邀得來自美國芝加哥的米芝蓮三星餐廳Grace的名廚Curtis Duffy獻技。詳情及預訂,請瀏覽https://guide.michelin.com.hk/zh_TW/grace-curtis-duffy。

兩地牌車主須嚴格遵守規定,否則將永久不得申領兩地車指標!
生活在我城
澳門生活圈・2019-10-18

近日,似乎有很多家長吐槽 有部分人士在學校路段泊車竟泊了半條馬路 導致他人上班上學塞在半路上 進退兩難,且違泊比較嚴重 究竟是怎麽回事? 治安警宣布的數據顯示 今年1月至7月,在離島區個別學校周邊道路共檢控7,600多宗違泊; 今年9月,相關學校附近的違法停車檢控約1,700宗,平均每月過千宗,令人難以想象。 路邊泊車導致無法通行 這種行為也是令他人既頭痛又無奈 澳門道路窄小人人皆知 繁忙時段交通更是一度阻塞... 有人士表示,花城區有2間學校,白天塞車或違規情況,特別在大連街及成都街,白天上班上學交通阻塞或違泊都算嚴重。 該區道路由雙行線改為單向雙行,即便如此,仍然無法解決違泊與塞車問題。 家長接送小孩子上學尤為重要,而在繁忙時間段中,附近路段抄牌亦是特別厲害,而家長仍將子女送到學校門口,再加上本澳多處路段處於維修狀態,完全造成他人出行不便。 離島社諮委副召集人施妮娜曾就相關問題提出建議,例如研究開發更多免費車位,或者在中央停車場提供半小時免費泊車。 現時,學校周邊由黃實線改為黃虛線,亦是為了方便家長接送子女。 有市民表示 若學校附近安裝電子執法 交警開單一日就逾千張 堵車已成日常 但希望各位家長文明出行 給孩子們做好一個榜樣 創造更好行人出行環境 避免造成他人不便 另外,越來越多港澳居民申領 粵港、粵澳兩地車指標 為嚴格執行相關規定 省公安廳交管局提醒大家 須規范指標申請以及牌證使用管理 日前,省公安廳交管局提醒兩地牌車主必須嚴格執行規定,規范指標申請以及牌證使用管理; 若駕駛人士嚴重違規,將面臨永久不得申領兩地車指標等處罰。 粵澳等兩地牌車主可能違法違規行為: 1、以欺騙、賄賂等不正當手段取得兩地牌指標,或取得指標後轉讓、出租、出售,一經查實將注銷指標,5年內不得再次申領。 2、偽造、變造或者使用偽造、變造的兩地車號牌、行駛證、駕駛證,一經查實,對當事人所指標作不少於3個月鎖控處理,鎖控期間不得辦理所有指標變更業務。 性質惡劣的,將按《中華人民共和國道路交通安全法》規定追究法律責任,即扣留汽車,處15日以下拘留,並處2,000元以上5,000元以下罰款;構成犯罪追究刑責。 3、內地出港商務車一年內在港逗留時間累計不得超過180天,對違反相關規定的,將暫停使用兩地車指標4至6個月(首次違反規定的暫停4個月,再次違反的暫停6個月)。 港澳往來內地小汽車每次進入內地停留最長不得超過3個月(出境後允許再次入境),違反規定海關部門將作出相應處罰。 4,利用两地牌车协助他人非法进入境界,转变,违规搬运禁止或限制进境境货物,物品,或强制走私,一经查实除对对进行进行,从而使两地牌指标,永久不得再次申领。 對於特區政府現正接受公眾申請914個澳門私家車往來港澳的常規突破,交通事務局初步查看已接收的申請個案中,發現有部分補充填入資料有誤。 交通事務局提醒 申請人必須確保其輸入的資料屬實和正確,否則可能會影響到重置資格的申請及取得,且不能退回已支付的所有費用。 符合資格的申請人只須在10月23號下午5點之前,在官方網站:https://epay.dsat.gov.mo填寫並提交申請意向表,並繳付參與抽簽費用澳門幣500元即可完成申請。 若市民有相關疑問,可致電交通事務專線8866 6363進行咨詢。 素材來源:交通事務局,新聞局,力報 圖片來源:新聞局,攝圖網,力報,表情包 如果有,請聯系我們刪除 版權屬於原作者 編輯撰寫:小嚕

[評] 任天堂亂鬥 特別版 |這競技遊戲值得非核心玩家買嗎?
手機‧電玩
MacauYeah・2019-06-10

這隻遊戲已經發售半年有多,現在才來評價主要是筆者觀望了很久才入手。 筆者作為單機遊戲的常客,對於競技類遊戲都持有很大戒心。 不是不好玩,而是我有沒有這個能耐學懂怎去玩。三年前的街霸五,連街機模式都打不過,這個任天堂大亂鬥我又能玩得多少? 所以這次的結論是? 好玩!!! 好玩、能上手,也不至太容易或太難,故事模式可以在熟習之後,有條件地通關,難度適中。(相對街霸五故事難度是太易,街機模式又發現有點學不來,也沒有明確的教學指引,要自行研究。) 原因在於 這遊戲高深: 這遊戲在對戰系統是很講究的,在競技比賽上其實是硬核遊戲。 攻擊基本上除了普攻(原地及空中上、下、橫向攻擊)和必殺技(上、下、横向)、防禦、回避,還有回場、守崖(阻止對方回場)及場地陷阱的概念。遊戲作者也故意不說太多,等玩家自行發掘。道理上,這是一個很難的硬核遊戲,跟街霸一樣難。有興趣的朋友真的可以花很長時間去熟習和磨練。 這遊戲不是直接把你勸退: 如果是Dark Souls系列,基本上第一個Boss就過不了,讓大部份的族群也直接放棄。街霸五雖然有訓練模式,但指導原則都很少。 而大亂鬥則不同,故事模式是以ARPG的方式進行,玩家可以通過命魂增加戰力,只要戰力大大高於NPC,對手根本打你不痛。再加上還有技能系統,配合命魂可以Buff各積屬性。所以一個純格鬥遊戲,加入各種配Buff效果,大大減少了玩家的沮喪感,誘使玩家可以長時間重複挑戰。 圖:不同命魂(輔助角色)有不同Buff,戰力也不相同 遊戲前、中、後期,還是有些傳奇級挑戰(4星NPC對手),需要認真對待才能過關。因為有等級上限,配Buff是有極限的,面對傳奇挑戰,不會因為角色的升級而令玩家覺得無聊。 這遊戲是滿滿的情懷: 不含DLC的情況下,這遊戲有74位可操作角色。如果你是有點年紀的遊民,總會有幾個角色是你所期待的。筆者就對街霸最為感動。特別是街霸,遊戲重現一些重要的情境,例說街霸二的道場、副本的週遊列國打比賽。 圖:街霸道場及世界巡迴賽的背景 最後最後,因為這遊戲是可以多P的,所以人越多,越有攪笑感,比正統的競技遊戲更有團體樂趣 所以不論你是核心還是非核心玩家,這遊戲都有令你重複遊玩的原因。筆者光是玩完故事模式,就30多小時過去了 想看看角色列表的,可以在官網看看 https://www.smashbros.com/TC/fighter/index.html 想睇遊戲直播,記得訂閱我地嘅 Twitch / YouTube / Facebook

心理家教路:父母語義忌負面
生活在我城
Chrysalids 少爺・2017-07-18

彭姑娘認為,人與人的相處要時時關心「自己的視綫」和「對方的視綫」,意思是有時想告訴孩子的一件事,表達方式若有所不同,孩子領略的意思就不同了。 家長與子女經常發生爭拗,如家長收到小朋友一份不理想的成績,會有很多情緒,因而跟小朋友說了一些不好聽的勸告說話。其實,父母們有時都不知道,自己的說話原來小朋友另有一番負面解讀。 基督教家庭服務中心註冊臨床心理學家彭馨兒拆解家長語言背後的意思,以下例子就十分常見︰ 1. 「點解阿某某讀到你讀不到?」 家長希望孩子能做得更好,但孩子接收到的意思是︰「我比不上其他人」。 2. 「你還未夠努力呢!」 家長希望孩子能更加努力,但孩子接收到的意思是︰「我被人找錯處和忽視我的努力」。 3. 「你最叻是打機!」 家長希望孩子打少些遊戲機,負面暗示子女的不當行為;但孩子接收到的意思是︰「你在串我」、「你對我感到不滿」。 4.「你真是個懶惰的人。」 家長希望孩子能更勤力,但孩子接收到的意思是︰「你攻擊批評我」、「為我貼負面標籤」。 5. 「這麼簡單的問題也做錯?!」 家長希望孩子能完成習作,但孩子接收到的意思是︰「你看不起我」、「攻擊批評我」。 6.「你知唔知我花了幾多時間同你溫習?」 家長希望孩子能快點完成溫習,抱怨子女做不到;而孩子接收到的意思是︰「你向我抱怨,覺得我讓你失望了」、「你覺得我蠢」。 說話難達目的 以上各句,孩子所領略到的都是同一個信息︰你對我不滿、你找我錯處。這些說話都能見到家長的負面情緒,家長因使用負面暗示/人身攻擊/貼負面標籤,孩子為此出現情緒反應也是正常不過的事。彭姑娘認為︰「縱使他們停止打機,也只不過是因為想你停止抱怨或攻擊,但不會領略到自己真正需要改善的地方。」如果雙方只是把焦點放在言語的唇槍舌劍上,可能會忽略大家的真正需要,家長們其實需要做的是︰安撫情緒;消化自己失望;接受期望落空;接受教孩子有時並非種瓜得瓜;教孩子盡力而為;接受孩子是個獨立的個體。 滿足孩子需要 其實孩子需要甚麼呢? 1.需要父母的支持和鼓勵,信任及相信他可以下次做得更好; 2.需要學習為了自己而讀書努力,不是因為怕父母的情緒、怕父母失望; 3.需要建立自信。 彭姑娘提醒家長,跟孩子表達時,可以用一個比較能夠滿足孩子需要的說法,例如︰「你可以做到的」、「不要緊,繼續努力」、「我有看到你的努力」。這個說法能夠給予孩子的支持,肯定孩子的能力和付出。或者「我是有點失望,不過我相信你下次可以做到」,這個說法又能夠讓孩子了解家長的一些不滿。 以上文章及圖片均轉載自網路,所有版權歸原作者所有 原文地址:https://hk.news.yahoo.com/

【九州。遊記】鹿兒島屋台村 與日本人奇妙的交流!
走遍世界
原來世界這樣大・2018-08-20

屋台村…相信去慣日本的朋友對屋台村一點也不會陌生了。屋台村是一條滿是特色的餐廳區域,有很多特色的小食,而在晚上是特別熱鬧。每間餐廳的座位不多,就像是有小小居酒屋的感覺。不能缺少的當然是喝酒了! 遊玩鹿兒島過後,跟朋友打算到屋台村吃晚餐。我們住在鹿兒島中央站附近,而屋台村正好就是我們回酒店必經的地方。本來只是跟朋友靜靜坐在一角,怎料到旁邊的日本人問我們的飲料好喝嗎,才發現我們是外國人。哈哈,難道我們兩個太像日本人了嗎?! 其實有不少日本人都不太敢說英文,知道我們是外國人都會放棄聊天,但奈何自己又不會日文,只好看著白白遠去,這是我去日本覺得最沒趣的一點。有時我都會恨我自己為什麼不好好學日語,讓自己到日本旅遊可以更加暢所欲言,奈何想做的事太多,但時間卻太少。 但這次遇到的兩位日本人反而盡量用他們以前學過的英文,嘗試跟我們聊天,屋台的老闆也是,聊著聊著這兩位日本人還送了兩件鹿兒島出名的雞肉刺身給我們試試!(之前我們正躊躇要不要點!) 他們走了,我們旁邊的換來一對從福岡來鹿兒島度假的情侶,老闆向他們介紹我們是從香港來的遊客。 這對情侶之中,正好一位曾經去過美國留學,一位是幼稚園老師,跟我同行的朋友也是從事教育工作,我們跟他們二人有著無窮無盡的話題。本打算快快在屋台吃個飯就回酒店休息,沒想到我們聊著聊著到差不多十二點才回家。 除了喝酒,熱鬧也是屋台的特色。很奇妙這樣認識了新朋友。在這氣氛中大家打成一片,一起喝酒、一起聊天,送給我一個盡興的晚上,也成為我在鹿兒島的一件難忘的小事!

你開始寫 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開發中加入你自己的測試!

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/

【電影】玩轉極樂園:可以並架的夢想與家人。
娛樂殿堂
原來世界這樣大・2018-01-24

最近太多好電影了,其中Pixar出品的玩轉極樂園也是備受注目的一部。雖然早兩星期已經進場觀看了,但還是拖到現在才寫出影評。 《玩轉極樂園》由Pixar出品,畫功當然是無庸置疑,而每次Pixar作品的故事背後都帶來極深厚的意義,就像陪伴我們成長的《ToyStory》(反斗奇兵) 和2016年的《Inside Out》(玩轉腦朋友) 一樣,同樣令人笑中有淚。這次的《玩轉極樂園》去到墨西哥,一個充滿熱情音樂的地方。主角米高是鞋匠世家,但因為曾曾祖父為音樂離開家庭,所以音樂成為他們整個家族的禁忌,家族的任何一人都不可以接觸音樂。喜歡音樂的米高只可以偷偷收藏自己的結他和一切有關音樂的東西。有次被嫲嫲發現了米高在玩音樂,打爛米高心愛的結他了,而使米高無法在亡靈節參加音樂比賽,情急之下他決定偷進歌王的墓借用結他,誤打誤撞米高走進了極樂世界。他與死了多年的親戚們見面,要是他想回到現實世界,他必須得到家人的祝福,可是家人們不想米高繼續接觸音樂,氣憤下米高再度出走。他一直以為自己是歌王的後人,決定找歌王的幫助得到祝福回到人間,輾轉下才發現陪伴他到處找歌王的阿德才是他的曾曾祖父,米高在極樂世界除了幫家人消除彼此的誤會外,更幫家人打開音樂之門。夢想對你來說是什麼?米高的家人因為一些理由討厭音樂,也不讓米高接觸音樂,可惜愈受別人的反對就愈想要接觸,米高靜悄悄的學習音樂,亦希望把音樂成為自己的夢想。米高不理家人的反對接觸音樂,不知道對你來說,你的夢想是什麼?父母那代人的夢想很簡單,勞勞碌碌地工作,只希望三餐溫飽就已經很足夠,對於以前的生活環境沒有太多的選擇,足夠的經濟成為了大家拼搏的原動力。反而我們這一代的生活質素富裕能建立自己的興趣,要是熱愛的話更想一輩子都去發展自己的夢想,顯然跟上一代人有不同的想法,也會容易跟他們引起爭吵。米高不理家人的反對繼續玩音樂,那你又為了夢想,與誰對抗呢?或許這是一種任性,但我覺得堅持夢想是一份對自己生命的執著,要是我的生命不是在實踐自己想做的事,那我的生存又有什麼價值呢?所以,米高在為自己的夢想堅持時,我一直都為他「寧死不屈」的堅持而很感動。 家人是最愛你的人家人總有千百個反對你的理由,想起我曾經想做某些事情卻被一口咬定這不適合我,我心想:「為何連自己的事情都無法拿主意?」但我依然認為只要是自己覺得值得、不後悔的,就應該要好好堅持。每人都應該有自己的決定權去選擇自己的路。不過要理解的是家人的出發點也是為你好,要是他們依然不相信你的,那就用心地做得更好,讓他們刮目相看!夢想不應受別人的阻攔,也不是件輕易放棄的事情;如果是輕易放棄的,這又算什麼夢想?無論多久,又記得回頭看看- 家人永遠都是你最強的後盾。當我們只在意自己你跑得有多前,跑得有多快,家人卻是那個在意你跑得有多累的人。希望就算多忙碌,也不要忘記向家人表達你對他們的愛。死亡並不可怕記得很多電影都會把死亡定義為一件可怕的事,繼《怪誕城之夜》後《玩轉極樂園》毫不避嫌地提及死亡,不過卻以一個輕鬆的手法帶過。Pixar故事的結尾往往都是令人出人意表,米高的彈奏讓Coco太婆記起爸爸,能拯救阿德(即是Coco的爸爸)使他可以留在極樂園。可是,Coco太婆始終也要面對著死亡,當米高把Coco太婆的相片放在其他死去的親人照片旁邊時,我們的心也沉了一沉,為Coco的逝去而感到婉惜。但另一角度,我們也應該為她高興才對,因為她終於可以跟爸爸重遇了。我們或者沒有辦法抵抗生老病死,但我們可以正面一點地想,他們的愛沒有因為死亡而離開,往生者的愛依然存在於這個世界上,繼續守護著我們,只是轉了個形式。