搜尋

搜尋結果

為程所困-是什麼讓你不想寫自動化測試?
科技新知
MacauYeah・2025-01-08

測試場 VS 自動化測試 筆者一直地更新自己過去所編寫的程式,很恐怖的是,那時的自己很少思考過怎樣寫測試Test Case。致使每次做更新時,都膽戰心驚,要手動建立測試場,人肉去測試每個可能有受影響的地方。在那些年的時候,有能力自己搭建測試場,已經是萬幸。但當面對一些要長期維護的程式,測試場的人肉測試並不是一個有效的方法,一來費時間,二來人腦記憶並不可靠。單靠自己去想想那些地方受影響,再測試,某程度是在挑戰人腦的記憶上限。如果是團隊合作,就更麻煩,你以為修改不會影響到其他人,結果卻是翻天覆地。 所以為求長治久安,編寫自動化測試,是有必要的。這些自動化測試,都算是回歸測試,每次程式有任何地方改動,都確保所有自動化測試被通過。理想始終是理想,但實際操作又會遇到怎麼的問題? 以筆者剛更新的程式為例,難以測試主要是當初沒有想過要測試這件事,所以程式結構通常是【連續順序】地執行。想分段測試?除非先重構。 Function中太多自己創建的Object 回顧自己的程式,初期編寫時,總會我手寫我心,每想要創建任何資源,在java中就會使用 new 字眼,或是自行呼叫某些 builder 類來取得資源,這是其中一個令自己無法寫測試的原因。 我們要想想,這些資源,是不是自己Function中所關心的核心。如果這個資源是被直接回傳的,我們要保留,如果它是HttpClient,只是要來獲取其他資源的媒介,我們或許可以利用依賴注入來取得它,即是把 HttpClient 改為經呼叫方傳入。注入的好處時,我們可以在Test中,修改那些資源的行為和結果。更進一步的是,把那些資源改為 interface 的方式存取,那麼在 Test 中就能更任意地控制該資源的行為。 首次重構某些資源成為依賴注入,大部份都會影響呼叫方,很多地方都要重寫。不論使用constructor injection, setter injection, annotation injection 等,上傳呼叫方,或多或少都會要加減改變參數。極致地,我們把構建都交給Program 框架去做,例如Spring Boot中,各種資源,都交給框架去自動配致。當然,這種做法的學習成本高,除錯成本也高。 【注入】其實是想在控作那些資源,在測試中運行得到固定的行為。使用前述的HttpClient例子,當我們業務邏輯是先訪問外部Web API,再根據結果做處理,那麼我們測試時,就會想模擬Web Api的結果。如果要做到自動化測試,最強硬的手段,就修改自己的HttpClient,模疑給出固定結果。 想要做到這種,在傳統的Java中,我們需要透過進一步抽離Interface去做。但這樣做很累,所以筆者通常會用如Mockito的程式庫,去修改HttpClient的行為。有興趣直接看程式碼的讀者,可以去看 github 。 當然,上述的 HttpClient 例子,使用測試場也有可做測試,自己再去模擬那些Web Api的回傳,有些情況下,這樣會更真實,但大家就必需好好定義測試場的行為。因為測試場可能與團隊的其他成員所共用,有機會其他人可能想要更多互動的測試方式,而非固定的結果。但並上非固定結果的測試場,自動化要測試的可控度就減少。

Miss Viv’ 手袋系列瑰麗登場 「時尚匯」獨家發售
購物‧時裝
LifeMag Editor・2015-09-29

Roger Vivier開設首家澳門專賣店 澳門奢華時尚購物熱點「時尚匯」引領潮流風尚,獨家呈獻由Roger Vivier(羅傑‧維維亞)精心設計的Miss Vivrsquo; 手袋系列。來自法國的Roger Vivier洋溢巴黎高貴典雅的時尚氣質,自創立以來風靡全球。品牌今年更特別與形象大使Ines de la Fressange攜手推出充滿好奇且熱情澎湃的Miss Vivrsquo; 手袋系列,再一次展現品牌獨特的時尚風格。 位於「澳門銀河trade;」綜合渡假城的「時尚匯」,奢華時尚名店林立,不單引入多家首度進駐澳門的國際時尚品牌,當中不少更是來自設計名師的獨家限量系列。今次於「時尚匯」獨家發售的Miss Vivrsquo; 手袋系列結集七款精緻手袋,每一款也運用不同物料精心設計,外形鮮明奪目,各具特色,充分展現出品牌的獨特風格。該系列其中一款名為「Lrsquo;ArcoBaleno」的手袋,採用絲緞與鍍銀工藝製作,同時配以純手工縫製的漸變彩虹珠片。這款精美絕倫的手袋在全亞洲僅於「時尚匯」獨家發售。 「時尚匯」購物區總面積超過10萬平方米,擁有超過200家奢華時尚名店,更結合高格調英式下午茶文化,讓賓客盡享購物樂趣之餘,更可品味生活時尚,為澳門的潮流風格重新定義。「時尚匯」獨家發售Roger Vivier的Miss Vivrsquo; 手袋系列,引領賓客走在時尚品味的尖端。 Miss Vivrsquo;手袋系列將於9月19日至10月18日期間,於「澳門銀河」「時尚匯」的Roger Vivier專門店獨家發售。

自己架設Docker的共享儲存空間
科技新知
MacauYeah・2023-07-21

Docker很好用,在單機環境下真的很好用。Docker原本的設計,是為了快速迭代而設計成Image的。在一般設定下,每次新建或重建container,都會根據Image重設一下各方面的環境,包括儲存空間。重設CPU,Memory,大家都很易理解,但重設儲存空間,真的不是每一個使用情況都可以這樣。 又或者說,未必所有使用情況都會有一個第三方的儲存空間可以用。所以良心的Docker在單機環境下也有提供bind mount或是docker named volume,作為可以長期保存,不受container生死的影響,以達到長期存在Data的存在。 單機儲存空間 單機情況下很簡單,就用一個docker compose做例子 其中html就是一個bind mount,而nginxlogs就是一個docker named volume,兩者都可以長期保存data,除非各位自己手動刪除,否則不會因為container的興亡而不見了。 但有兩個很重要的分別 bind mount,直接跟host os連接,實際上是每次folder有更新,docker都要同步host和container之間的資料。 bind mount在linux下很暢順,因為大部份docker imagecontainer原本就是linux engine,所以folder mount真的可以互通。 bind mount在windows mac下,就會不斷抄資料。面對大量檔案,例如node_module,就會有速度上的問題 docker named volume,就是docker 分離一些獨立空間,然後再綁到container上 相對bind mount,即使在windows mac下,都沒有那個速度上的問題。筆者猜測,即使是獨立空間,其實本身都已經限定在linux enginx下,所以沒有需要抄資料。 但在windows mac下,因應docker 底層建立Linux VM的技術不同,你可能沒法在windows mac預設環境下直接讀取docker named volume。 若要讀取docker named volume,最好的做法,還是連上docker container,然後用docker cp 來抄回資料。一但抄資料,其實都會有速度上問題,不過docker cp是手動決定何時做的,不做docker cp,其實container也是可以用。 Cluster儲存空間 雖然良心的bind mount和named volume解決了單機上的儲存問題,但到了cluster環境,就沒有可以跨機同步儲存空間的做法,要做就自己建立。 筆者也稍為研究了一下同步的問題,不過對技術真的很有要求。所以退而求其次,筆者還是選擇簡單的第三方儲存空間。就是做一個可以分享存取的NAS。 建立nfs linux下要安裝nfs其實很簡單,不過要注意資料夾和防火牆權限,以下安裝教學以ubunut 22.04為例,記得把下面的YOUR_DOCKER_NODE_ADDRESS_RANGE轉為你的真實IP段落 修改docker compose 最後,你在原來的dockercompose的docker volume上加driver_opts就大功告成。 記得把下面的YOUR_NFS_IP轉為你的真實IP

Swarm Mode 上線番外篇:Ceph
科技新知
MacauYeah・2024-08-20

在預設Docker和K8s的容器主導世界裏面,其實一直都缺少了直觀的儲存空間。當你的程序需要讀寫故定的來源資料,該來源就必需是外部的穩定儲存空間,例如是資料庫、NFS。但資料庫、NFS等,要做到真的正穩定,其實就要走Cluster叢集模式,確保它們自己本身不是做成single point of failure 單點故障的元兇。 坊間,只要付得起錢,其實找個穩定的資料庫或NFS,也是有的。但如果你像筆者一樣,只有一塊或多塊【鐵】,就要試試開源的儲存引擎Ceph Storage。 Ceph Storage,有自己特有的CephFS格式,但也支援NFS httpsdocs.ceph.comenquincycephadminstall。也就是,只要我們有足夠多人力,道理上可以自己用實體機去模擬一個穩定的NFS。 因為只是試裝,筆者暫時只用VM來測試,完整的安裝script,可以在這裏找到。script使用Multipass VM,大家有條件的話,可以使用其他VM引擎來看重複。以下是一些官網上沒有提的重點 Ubuntu 24.04 還未能正式使用。在筆者做POC的當是,Ceph v18 在 Ubuntu 24.04上需要先解決,即使大家使用Curl base下載 binary,也未必能成功。 筆者成功測的版本是 Ubuntu 22.04 Ceph v17,全使用Ubuntu 發佈的內置版本。但大家也要留意自己的Ubuntu apt 有沒有更新到最新版,過去的 cephadm,引用的container image url也變更。記得更新到v17 的最新版,cephadm 指令才能成功取得image。 在官方說明文件的【Deploying a new Ceph cluster】中的【Adding Hosts】httpsdocs.ceph.comenreefcephadminstall#addinghosts 節章可能有些誤導,大家應該要看 【Host Management】中的【Adding Hosts】 httpsdocs.ceph.comenreefcephadmhostmanagement#cephadmaddinghosts 在每個節點內,可以直觀地連接地Ceph Dashboard,但若大家需要Port Forword,要注意你的Network Interface,筆者就只能經過預設的IPv4的public ip 進行ssh port forward,不能經過0.0.0.0。 Script 位置 httpsgithub.commacauyeahubuntuPackerImageblobmaininitCephCluster.sh

【澳門聖誕美饌推介】
節慶盛事
Cheers!・2024-12-10

今年嘅聖誕節大家準備好同親朋好友去邊度食聖誕大餐呢?等小編幫大家搜羅幾間餐廳嘅聖誕美饌,包括自助餐、西餐廳等等系列,等你地可以同屋企人一齊去享受大餐! 澳門JW萬豪酒店 名廚都匯 「節慶晚餐自助餐 」 名廚都匯嘅節慶自助晚餐匯聚來自世界各地嘅美味佳餚,精選海鮮包括即開生蠔、波士頓龍蝦、各款優質刺身及自家醃製三文魚等。傳統聖誕美食有烤聖誕火雞、聖誕蜜糖烤火腿、石榴醬烤聖誕黑毛豬肋條,以及紅酒燉牛臉頰等!甜點仲有傳統聖誕甜品及布丁! 「聖誕及除夕自助晚餐」 喺聖誕及除夕當晚嘅自助晚餐除咗豐富多樣嘅珍饈美食,更設有白銀鱘魚子醬及即席烹調嘅香煎帶子,12月24日及25日更特別奉送巴黎之花香檳, 大朋友可品味聖誕熱紅酒,小朋友則可享用香濃嘅熱朱古力~ 「節慶晚餐自助餐」 供應日期:2024年12月1日至23日、26日至30日及2025年1月1日 時間:晚上6時至9時30分 價錢:成人每位澳門元688、小童每位澳門元340 「聖誕及除夕自助晚餐」 供應日期:2024年12月24日、25日及31日 時間:晚上6時至9時30分 價錢: 成人每位澳門元1088、小童每位澳門元495 12.2425 成人每位澳門元888、小童每位澳門元395 12.31 澳門麗思卡爾頓酒店 - 麗思咖啡廳 麗思咖啡廳匠心推出多款佳節美饌,從豐盛早午自助餐到優雅嘅法式饗宴! 「節日早午自助餐」 於2024年12月8日至29日逢週日及聖誕節供應,環球美食同經典節慶佳餚是歡聚共慶嘅最佳之選。賓客不僅可無限暢飲特選葡萄酒及無酒精飲品,亦可升級享用Veuve Clicquot香檳! 「冬日聖誕晚宴」 喺平安夜同聖誕節晚上,冬日聖誕晚宴將節日氣氛推上高峰!法式六道菜晚宴包括法式鴨肝配餡餅、意大利西西里紅蝦塔塔伴海鮮批同冬季栗子奶油濃湯,兩道主菜包括龍利魚諾曼底伴海鰲蝦卷與巴貝特釀鵪鶉,最後以充滿節日氣氛嘅蒙布朗聖誕栗子蛋糕完美作結~ 「節日早午自助餐」 供應日期:2024年12月8日至29日 時間:中午11時30分至下午2時30分 價錢:成人每位澳門元728、小童每位澳門元358 「冬日聖誕晚宴」 供應日期:2024年12月24日至25日 時間:晚上6時至10時 價錢:每位澳門元988,包含一杯侍酒師精選香檳。 新濠影滙 - 星滙餐廳 澳門新濠影滙旗下星滙餐廳自助餐匯聚多國料理,供應過百款美食,必食推介包括原條黃鰭吞拿魚刺身、即點即蒸龍蝦及花尾躉、新鮮生蠔、聖誕蔓越莓鵝肝餡餅、意大利龍蝦千層麵、香烤美國頂級牛肉眼;仲有聖誕烤火雞、香橙蜜汁烤火腿以及一系列繽紛佳節特色甜點如三重朱古力樹桐蛋糕、聖誕暖紅葡萄酒浸覆盆子及香梨、南瓜批、朱古力噴泉等。 「聖誕及元旦自助午餐」 供應日期:2024年12月15日至26日 時間:中午12時至下午3時 價錢:(2024年12月15至23日)成人每位澳門元358;小童每位澳門元188;(2024年12月24至26日)成人每位澳門元388;小童每位澳門元198 「聖誕及元旦自助晚餐」 供應日期:2024年12月15至26日 供應時間:下午6時至晚上10時 價錢:(2024年12月15至23日)成人每位澳門元628;小童每位澳門元318;(2024年12月24至26日)成人每位澳門元688;小童每位澳門元358 澳門銀河 - 安達仕廚薈 安達仕廚薈嘅行政主廚黎安德以「分享歡樂、延續傳統」為理念,精心準備了葡萄牙嘅節日美食,以自助餐形式呈現,菜品中不僅包含中式佳肴,更可無限暢飲葡萄牙水果酒。 「聖誕自助早午餐」 供應日期:2024年12月24日至25日 時間:上午11時半至下午2時半 價錢:成人每位澳門幣 388 元 「聖誕自助晚餐」 供應日期:2024年12月24日至25日 時間:晚上6時至10時半 價錢:成人每位澳門幣 598 元 澳門銀河 - 庭園意大利餐廳 榮獲米芝蓮入選餐廳嘅庭園意大利餐廳則沿襲意大利人傳統,新鮮海鮮、經典燉小牛脛及招牌菜式必定讓味蕾大滿足,主廚更特別加入螯蝦栗子湯及意大利飯!聖誕套餐於 12 月 24 及 25 日供應,每位澳門幣 988 元;除夕晚餐於 12 月 31 日晚供應,每位澳門幣 1,088 元。 「聖誕套餐」 供應日期:2024年12月24日至25日 時間:下午6時至晚上10時 價錢:成人每位澳門幣 988 元 「除夕晚餐」 供應日期:2024年12月31日 時間:下午6時至晚上10時 價錢:成人每位澳門幣 1088元

Spring Data 關聯型態 01
科技新知
MacauYeah・2024-07-16

筆者身邊的朋友,首次接觸 ORM 的關聯型態時都會覺得很難,筆者自己也是。但在好好地理順它的設計時,就會覺得其實很簡單。 因為篇輻很長,我們先以Code First的角度,先體驗一下ORM程式讀取的便捷性,以及解決一個常見的序列化問題。 雙向存取 例如一個Parent,有好幾個Child @Entity public class Parent ... Parent Primay Key @OneToManymappedBy=quot;parentquot; List children = new ArrayList; TODO add remove @Entity public class Child ... Child Primay Key @ManyToOne Parent parent; 上述的寫法很簡潔,ORM會為你自動加入join column,處理關聯的載入。在讀取Parent時,它的所有Children就可以直接在Java層面讀取,在讀取Child時,它的Parent也隨時取得。也就是,開發人員只要經SQL準備其中一方的資料,另一方並不需要手動準備,它就可以自動按需載入。 RESTFul API 坑雙向存取 Spring Data在Java層面的雙向存取,已經做到很方便。但經常坑到我們的是Spring Data與RESTFul API的混合應用。當我們嘗試經API回傳我們的Parent Json時,API會很聰明地把關聯的Children也變成Json回傳。但他也會把child中的parent不斷重複變成json,變成無限輪迴。 坊間有兩種不同的解決方案,可以防止無限輪迴。 讓Json可以認得已經序列化的元素。@JsonIdentityInfo 讓Json只可以單向序列化serialization。@JsonManagedReference, @JsonBackReference, @JsonIgnore 筆者兩個方向都試過,但首個方法並不通用,至少它不能算是一般常見的無腦Json結構。它需要伺服器、客戶端都懂這如何經IdentityInfo認得重複出現的元素。 而單向序列化,是筆者現時的通用解。在設計RESTFul READ API時,筆者就會決定到底是Parent自動回傳Child,還是Child自動回傳Parent。決策的考慮因素,主要在於是否可以簡化Client的API調用次數。通常從Parent出發,自動回傳Child,可以節省API調用。但如果是選項性的結果List of Value,就倒過來。有時候,遇著API需要雙向設計,就只好自己設計DTO資料傳輸對象 Data transfer object, DTO。 例如Parent API,就原封不動回傳原本的元素 @Entity public class Parent ... Parent Primay Key @OneToManymappedBy=quot;parentquot; List children = new ArrayList; @Entity public class Child ... Child Primay Key @ManyToOne @JsonIgnore Parent parent; Child API,就反過來引用。 public class ParentDTO ... Parent Other fields except children public class ChildDTO ParentDTO parent; ... Child Other fields 這種DTO,看起來很麻煩。但其實Spring有提供一個簡便的複制DTO功能,它可以把自動複制兩個class中有同一名稱、同一型別的欄位到另一個class上,不需要逐個欄位明文寫出來。 BeanUtils.copychild, childDTO; BeanUtils.copyparent, parentDTO; childDTO.setParentparentDTO 因為child、childDTO中的parent欄位型別不同,BeanUtils.copy會自動忽略,其他欄位就會自動複制。 註 其實古早的網頁系統設計,DTO的概念一直存取。只是現在RESTFul API的流行,很多框架已經提向便捷的Json轉換。若然平時只需Json單向存取,筆者還是省略DTO的建立。

澳門君悅酒店推出閃耀出彩的「亮‧晶晶」月餅禮盒
澳城餐飲
LifeMag Editor・2016-07-08

澳門君悅酒店深知,您和親朋好友均希望擁有一份典雅獨特的中秋之禮。經過多月來的探索,設計及籌備,期待已久,閃耀出彩的「亮‧晶晶」月餅禮盒現已推出,以蝴蝶和孔雀為主題,採用絢爛色彩的閃石和編織出的圖案相交輝映,散發出高優雅無比的氣質hellip;hellip;這一切將創意昇華,融會貫通在傳統節日的伴手禮盒中。 蝴蝶,形象給人自由活力,浪漫靈動之感,象徵了對生活充滿美好期盼。此次以璀璨晶石繪出蝴蝶及斑斕花叢之畫,代表幸福及生機之美意。閃石共造栩栩如生的蝶戀花圖,仿如萬千華燈下彩蝶飛舞於前,同述無限動人的中秋祝福。 另一設計同是讓人驚詫其美的孔雀,眾所周知,孔雀開屏乃鳳凰展翅,喻意吉祥。鑲嵌的點綴更使孔雀屏生動別緻,不僅凸顯了其華美親切的豔麗形象,更與中秋月影相照。 最為特別的還要數精心鑲嵌的LED燈飾,酒店團隊挑戰創新,別出心裁設計不同層次的燈光效果,務求更進一竿,塑造獨一無二,晶亮無比的禮盒。燈飾與飛翔的蝴蝶,又或與熠熠生輝的孔雀開屏,在光線的映襯下金碧流光,光輝灼灼。 自家製造的三種特色月餅口味為軟心朱古力、蛋皇軟奶凍及香芋白蓮蓉,甜香誘人,口感清新。酒店大堂更設「亮‧晶晶」禮盒專櫃,開放時間由每日中午1200至晚上1000,直至2016年9月15日。禮券由即日起開始發售,換領日期由2016年8月15日起至2016年9月15日。每盒售價澳門幣469元。數量有限,欲購從速。更多詳情及預訂,敬請致電853 8868 1908。 以上價格需另收5%政府稅。