搜尋

搜尋結果

Spring Boot 03 - 做好Database的模組化及測試用例
科技新知
MacauYeah・2024-04-12

這節,我們將會使用spring-data-jpa,寫一個業務上的資料庫模組,提供資料表的存取,讓你的好同僚可以直接使用。這樣可以在多模組的環境中,減少同一個資料表在不同地方重複又重複地重定義。將來要更新,也可以使用jar檔的方式發佈。 下戴模版 我們跟上節一樣,使用Spring Initializr (Maven) 下載模版,但細節筆者就不再講啦。Dependency主要選擇 H2 Database Spring Data JPA 對pom.xml作一些微調,並把spring-boot-start-data-jpa,h2改為只在測試中生效。 並把Java檔案搬一搬位置 # old location src/main/java/io/github/macauyeah/springboot/tutorial/springbootdatatest/SpringBootDataTestApplication.java src/main/resources/application.properties # new location src/test/java/io/github/macauyeah/springboot/tutorial/springbootdatatest/SpringBootDataTestApplication.java src/test/resources/application.properties 以上的操作,主要是因為我們的目標是提供Schema,或者叫資料表規格。其他用於做連線的操作,我們不需要打包在jar內。所以把那些次要的東西都放在test資料夾中。我們這時可以先用mvn test指令,確保一切功能還是正常。 Entity folder 然後我們入正題,在pom.xml中加入hibernate-core,spring-data-jpa, 然後在main資料夾下加入 Entity、Repository,例如前述用過的Apple和AppleRepo,最後資料夾就像是這樣。 . |-- pom.xml |-- src | |-- main | | `-- java | | `-- io | | `-- github | | `-- macauyeah | | `-- springboot | | `-- tutorial | | `-- springbootdatatest | | |-- Apple.java | | `-- AppleRepo.java | `-- test | |-- java | | `-- io | | `-- github | | `-- macauyeah | | `-- springboot | | `-- tutorial | | `-- springbootdatatest | | |-- SpringBootDataTestApplication.java | | `-- SpringBootDataTestApplicationTests.java | `-- resources | `-- application.properties 然後我們在Test Case中使用AppleRepo @SpringBootTest class SpringBootDataTestApplicationTests { @Autowired AppleRepo appleRepo; @Test void contextLoads() { Apple apple = new Apple(); apple.setUuid(UUID.randomUUID().toString()); apple.setWeight(100.0); apple.setGravity(1000.0); appleRepo.save(apple); } } 這個跟前述02-spring-data-jpa最大的差別,就是我們的main中只有Entity相關的Class,我們發佈jar,別人引用我們的class,別人不會解發其他不相干的商業邏輯。假如發佈02的例子,因為Spring有自動初始化Component的原因,很可能會誤觸發02中的BasicApplicationRunner.java Source Code spring boot data test

Spring Boot 01 - 萬物始於Spring boot context
科技新知
MacauYeah・2024-01-16

Spring Boot 01 - 萬物始於Spring boot context 筆者早些時候向一位朋友討論,為何Java那麼不受歡迎。朋友一句就回答,Java煩爆,沒有人會喜歡。 老實講,Java在句法上,實在囉唆。但以筆者的經驗,即使使用其他語言和開發框架,在實戰到一定複雜程度下,其實也一樣煩爆。 而現在的Java框架中,就以Spring boot的入門門檻低。筆者從Spring boot 1.x用到現在的3.x,也真的感受到更多的簡化,所以筆者也加入一起推廣Spring boot的行列。筆者將會通過一系列最小的可執行程式,為大家講解Spring在Web和資料庫上的應用。 所以現在就不廢話,馬上開壇作法 快速下戴模版 使用Spring initializr,可以很容易就建立一個以Spring boot starter為底的java project。大家可以使用Spring 官網又或是vscode plugin 快速地建立一個maven或gradle project。筆者較為熟悉maven,就以maven起一個範例。 在使用Spring initializr有幾件事必需要指定的: Spring boot version: 3.x.y 或以上 Language: java Group Id: 請選擇有意思的域名,如果你用github,可以選 io.github.yourusername artifactId: 這個範例的名字,例如commandline Packaging type: 本次使用jar,日後若開發web 應用,可以使用war Java version: 17或以上 之後就不用選了。若你經官網起範例,你會得到一個zip檔,下載後解壓縮。若你使用vscode插件,最後插件會叫有一個位置儲存。它們都是最後也是會得到同一樣範例Java project。 你使用Vscode,Intellij打開,IDE都會自動辨識到它是java maven project,同時會顯示java和maven結構。道理上你用Intellij 應該可以無腦開始編譯(Community 或Ultimate版都可以), Vscode有安裝Extension Pack for Java也會開始自動編譯。不想麻煩,也可以試用Github Codespaces - java。Github Codespaces其實就是一個雲上的vscode,經網頁可以連到Github VM內的vscode,所以它也會有齊Extension Pack for Java等插件。 筆者最後也會上載已完成的範例,它也可以在Github Codespaces上以Java執行或繼續開發。 打開project中的pom.xml,它為我們添加了兩個很重要的lib org.springframework.boot spring-boot-starter ... ... org.springframework.boot spring-boot-maven-plugin spring-boot-starter是重中之重,它定義了怎樣動態地設定日後的其他lib,它是讓我們可以無腦設定的一個關鍵。(但若大家有很多客制化的設定,就要返撲歸真地逐個lib叫起)。 maven在預設情況下,只會負責編譯和打包目前的project原始碼。所有相關依賴(就是xml中的dependency),並不會自動包起。而spring-boot-maven-plugin,就是幫我們把相關依據都包在一起,讓你的jar可以獨立行起來。 註: 若大家在開發lib jar,並不是一個獨立執行的jar,也就是原始碼上沒有main函數,大家就不應該引用spring-boot-starter和spring-boot-maven-plugin。 我們繼續看其他原始碼,整個資料夾就像以下那樣。 . |-- HELP.md |-- pom.xml `-- src |-- main | |-- java | | `-- io | | `-- github | | `-- macauyeah | | `-- springboot | | `-- tutorial | | `-- commandline | | `-- CommandlineApplication.java | `-- resources | `-- application.properties `-- test `-- java `-- io `-- github `-- macauyeah `-- springboot `-- tutorial `-- commandline `-- CommandlineApplicationTests.java CommandlineApplication是我們有main函數的java class。我像可以經過IDE運行main又或者下指令mvn spring-boot:run來執行。 正式開始我們的Commandline開發 我們在CommandlineApplication.class中,加入新的程式碼,實現ApplicationRunner和它的函數run。 package io.github.macauyeah.springboot.tutorial.commandline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; // other import @SpringBootApplication public class CommandlineApplication implements ApplicationRunner { static Logger LOG = LoggerFactory.getLogger(CommandlineApplication.class); public static void main(String[] args) { SpringApplication.run(CommandlineApplication.class, args); } @Override public void run(ApplicationArguments args) throws Exception { args.getOptionNames().stream().forEach(optionName -> { LOG.debug("option name:" + optionName); args.getOptionValues(optionName).forEach(optionValue -> { LOG.debug("option values:" + optionValue); }); }); LOG.debug("program end."); } // ... 這個run函數很直白,就是更好地演譯main中的String[] args。 但大家還要看清楚,這個main並沒有直接執行run。其實它是靠SpringApplication.run及@SpringBootApplication,跑一堆自動設定,最後因為傳入CommandlineApplication.class是一個Spring 可以處理的ApplicationRunner,所以才呼叫它的CommandlineApplication.run。 換個講法,如果今天做的是web應用,傳入去的就會是SpringBootServletInitializer,這個SpringBootServletInitializer也不一定跟main是同一個class。 如果大家有興趣,可以經過反編譯器,點入@SpringBootApplication看它的原始碼,你就可以看到它其實代表了很多自動化的東西。如果我們只做一些在同一個模組下生效的事情,《自動化》極大地降低了大家入門門檻。一般來講,如果大家不在意程式碼的複用度,比較少機會自行設定,自動化已經很有用。而隨著系統規模增加,多模組就慢慢地顯得重要,在大家了解完基本的Spring後,著者再從測試用途test case入手,為大家介紹如何手動設定。 Source Code Commandline Application

新濠影滙今夏讓你好運一「發」沖天
激安優惠
Benjamin・2016-05-07

新濠影滙自開幕以來,即以國際級劃時代娛樂項目、非凡美饌餐飲體驗,以及獨一無二的活力時尚購物體驗,成為世界級首屈一指的旅遊娛樂度假勝地。其全球首個「8」字形摩天輪「影滙之星」更已成為新濠影滙乃至澳門以及亞洲的新地標。為了迎接夏日度假旺季的來臨,新濠影滙即日起特別推出「『8』在影滙」幸運活動,送出總值超過港幣88,888,888元的即時獎金和禮品。當中的「『8』在你手」即揭即獎活動讓所有前來新濠影滙的賓客們立即獲得多項優惠尊賞,更有機會抽中每日現金大獎港幣88,888元,讓幸運夏日一「發」不可收拾。至於未能親臨新濠影滙的賓客,亦可在電腦或手機參與「『8』在影滙,勁獎刮刮」 活動贏取一系列優惠禮遇。 即日起自2016年7月24日,所有前來新濠影滙的賓客都可免費獲得即揭卡一張。只需輕輕一揭,即有機會獲得以下各種幸運「8」字好禮: 以優惠價澳門幣8元於「百味漫遊」購買開運小食 以優惠價澳門幣18元於「百味漫遊」享用開運下午茶餐 以優惠價澳門幣38元於「東南薈」或「面棧」享用開運套餐 於「東南薈」或「百味漫遊」享用美食即享免費飲品 於新濠影滙指定餐廳即享餐飲優惠 「澳門派馳」免費入場券,並獲贈1杯免費飲品 於「上海魅影」、「玥龍軒」、「意.味」或「巨星酒廊」消費滿澳門幣500元即可獲贈Pierre Hermé 7枚裝馬卡龍禮盒 「魔幻間」 、 「華納滿Fun童樂園」 、 「蝙蝠俠夜神飛馳」 或 「影滙之星」門票8折優惠 除了以上各種幸運「8」字好禮,新濠影滙更特別提供額外驚喜!只需花短短幾分鐘註冊成為新濠影滙會員,即可參加每日由早上10點至晚上9點於新濠影滙澳門時代廣場進行的免費抽獎,有機會贏取包括餐飲優惠或娛樂設施門票等總值超過港幣88,888,888元的豐富獎品。運氣大旺的您說不定就是獲得每日現金大獎港幣88,888元的大贏家! 把新濠影滙的好運氣帶到四面「8」方! 2016年5月4日起,賓客無論身在哪裡,只需從電腦或手機登陸新濠影滙Facebook官方頁面、新浪微博官方賬號或微信官方帳號,即可參與「『8』在影滙,勁獎刮刮」 活動,好禮即揭即得。馬上行動,前往http://fortuneinyourhand.mcepromotion.com/tc,祝好運伴您贏大禮! 新濠影滙是本澳最多元化的娛樂度假聖地。除了「影滙之星」 、「魔幻間」 、「蝙蝠俠夜神飛馳」 及「華納滿Fun童樂園」等世界首創的娛樂設施外,新濠影滙還提供不少免費的嶄新體驗,如漂浮半空的魔幻天球(Magic Orb)、位於澳門時代廣場的精彩立體投影和於上海魅影進餐時的現場魔術表演等。  隨著夏季臨近,新濠影滙對其世界級水上娛樂設施更是引以自豪。「綠野遊蹤」,一條長達450多米,蜿蜒曲折的激流,將於5月1日為炎夏重新開放。綠野遊蹤設有三條主題流水道,讓旅客親身挑戰以熱帶森林河流為主題的奇幻水上之旅。設施還備有水上滑梯、 「童樂池」 及人造沙灘,勢必為炎夏帶來充滿歡樂的一天。請瀏覽新濠影滙官方網站或致電(853)8865 6656查詢「綠野遊蹤」及「遊.吧」暢遊綠野池畔燒烤自助餐的特別優惠。

新加坡航空歐洲優惠,香港出發經新加坡轉機來回連稅HKD4,460起!
激安優惠
OHChance 旅遊誌・2016-07-20

新加坡航空推出歐洲航點優惠,出發日期由9月至出年3月: [最低價錢報告].阿姆斯特丹:HKD4,460.哥本哈根:HKD4,679.法蘭克福:HKD4,974.杜塞爾多夫:HKD4,812.蘇黎世:HKD4,529.巴黎:HKD4,709.米蘭:HKD4,552.羅馬:HKD4,621.巴塞隆拿:HKD4,666.倫敦:HKD5,430.曼徹斯特:HKD5,431 (註:以上航點需經新加坡轉機。另由於匯率變動因素,實際查到的最低價可能會與上述價錢有些許出入) [重點資訊].以新航而言4字頭飛歐洲算抵玩;.英國航點只需五千多D 亦是划算之選;.最多只能停14天有點短;.由於需往新加坡轉機,所以會先向南飛再去往北飛,飛行時間會較長;.優惠可不同點來回,例如米蘭入羅馬出。方法是先就來回點找出最平的日子及航班寫下,再利用multi-city 功能分別選返有平飛的日子及航班即可。 [附加資訊].在官網搜價頁面勾選 “彈性旅行日期” 會出心水日子前後3天的票價,較易找到平飛;.新加坡航空票價已包機上餐飲及30KG托運行李額;.新加坡航空可以乘搭機場船直接由澳門到香港機場海天客運碼頭 check-in 並獲退HKD120 香港離境稅。  附註:上述最低價錢為航空公司公告之最優惠價格,或本站能找到的最低價格;每一航班有否優惠票價及所存票量由航空公司決定,優惠票量有限售完即止。 【促銷公司】新加坡航空(Singapore Airlines)【搭乘日期】9月12日至2017年3月31日【開賣時間】已開賣,至7月26日23:59【最長停留】14天【航班限制】沒有【預訂網址】http://ohchance.info/ref/sinair [價錢 Sample – 香港經新加坡飛米蘭來回連稅HKD4,518]

【電影】以青春的名義:青春的執迷不悔
娛樂殿堂
原來世界這樣大・2018-01-16

在之前的香港亞洲電影節已經想看《以青春的名義》了,但我實在太低估電影節的威力,上映場次少,優先場的座位爭到頭破血流,最後買不到電影票只好苦苦等到上映那天才可以欣賞到這部電影。 在《以青春的名義》中,葉若美(劉嘉玲 飾)和張子行(吳肇軒 飾)在泳池遇上,其後機緣巧合下葉若美成為了學生張子行的代課班主任, 二人從此多了時間相處,彼此認識對方。張子行知道葉若美丈夫有外遇一事後,去報讀葉若美的情敵李菁(余香凝 飾)的跳舞班,了解李菁的底細。二人下課後的互相陪伴,在泳池旁跳舞、唱歌,擁抱,超越了師生的關係。他們這份曖昧、似是而非的關係,或許是一份不敢承認的愛。//每人都寂寞葉若美知道自己的丈夫有外遇,感到束手無策。而張子行生於單親家庭,媽媽在他小時候離家出走,從小缺乏母愛。寂寞讓人孤單和空虛,故事沒有具體交代到他們的邂逅,也沒有很直白地說到二人的關係,但從他們的眼神你知道一定不止是師生關係而已。葉若美和張子行二人走在一起,一切也是源於自然而然的相處,加上二人心靈寂寞,能互相在對方找到慰藉,得到一份「被重視」的感覺。 //是母親也是女朋友張子行的不羈,在學校找女朋友不是一件困難的事。但電影剛開始張子行說:「我喜歡成熟點的。」正如張子行的讀白所說:「你對一個人有興趣,不是因為你知道她的事情,而是你對她一概不知。」或許是這樣,令張子行對葉若美產生興趣。如果你留意,李菁和張子行在排舞室的交談中,張子行一時形容葉若美為他媽媽,一時形容她為女朋友,張子行對葉若美的愛可能是來自於從小缺乏母愛,即我們所稱的戀母情結。 //薛定諤貓故事中所提及「薛定諤貓」(Schrödinger’s Cat)的實驗,把貓放到一個密閉和有毒氣的箱子裡,處於一個不生不死的狀態,只要一天不打開這箱子,我們都不會知道這貓是生是死,而他有一半生存、也有一半死亡的機會。也即是說在打開盒子的一刻,你只能得到其中一個結果,也就是我們常聽到的一句:「一定係,除非唔係」。 《在青春的名義》的主線是在葉若美和張子行這段師生戀的關係上,然而「薛定諤貓」的實驗也在其他角色的故事中發生– 例如張子行、葉若美和劉方信三人爭吵的場面上,葉若美選擇不再沈默,而是揭發丈夫外遇,就如實驗打開盒子的一刻;張子行爸爸張福偉(董瑋 飾)看到妻子的照片,知道妻子早就遠走的真相後,失蹤幾天後回家,繼續好像若無其事般度過;張子行經常撥那個無人接聽的電話,心底裡一直都很想跟媽媽見面,於是意圖綁架媽媽和另一個男人所生的女兒,而張子行最後得到狠狠的拒絕,一個徹底的心死。 這三個角色都是「薛定諤貓」實驗內的貓,處於一個半生半死的浮游狀態。最後他們選擇要對自己一直執著的事情揭盅,就如海報上的一句「用一次執迷不悔 換一次青春惦記」。 // 劉嘉玲和吳肇軒的配搭葉若美是個中國傳統思想下的女人,也因為丈夫的外遇而把自己困在一個局內,劉嘉玲的演出帶出葉若美沒有自信和迷失的一面。而相反,吳肇軒的角色就是年輕、有活力的學生。兩人的對手戲中吳肇軒沒有因為劉嘉玲的氣場而比下去,吳肇軒那份青澀和帶點憂鬱的眼神更突顯兩人的性格,做成強烈的對比。吳肇軒與劉嘉玲每場的對手戲,都很有火花。我們看到青春不顧後果的衝動以及成熟思前顧後的遲疑。要是你回想過去,當年青春的你是不是都像張子行一樣的瘋狂?看到穿著校服的吳肇軒我想起了《哪一天我們會飛》的蘇博文,當然,蘇博文和張子行有著不同的故事。除此之外,張子行的性格也令人聯想起當年《阿飛正傳》由劉嘉玲飾演那個為愛情奮不顧身的Mimi/Lulu,大概青春就是這份天不怕地不怕。 還有張子行表白被葉若美掌摑一幕,甚具張力。即使葉若美在最後一幕去保釋張子行,但從一而終葉若美沒有向張子行透露自己的心意,我會想這是成熟時期遲疑的表現,還是礙於傳統思想下的枷鎖,繼續把這份愛收起來呢? 這類型的文藝戲並不是每個人都合口味,就正如王家衛的電影,未必所有人都懂欣賞。想拿王家衛的電影來做例子,不是用來與《以青春的名義》的比較,而是我認為每一部電影從每個人的解讀都有不同。而同時,我發現與王家衛曾獲最佳美術指導及最佳剪接獎項的張叔平為電影擔任剪接顧問,難怪在《以青春的名義》上帶點王家衛的影子。《以青春的名義》的拍攝一貫以藍色為主的,而藍色同時也代表著憂傷,很多人覺得青春是美好的,但同時有很多人會在青春留下執迷不悔的憂傷。

免費升級 Windows 10
手機‧電玩
LifeMag Editor・2015-08-05

Windows 10配備載譽歸來的「開始功能表」及「動態磚」 Windows 電腦操作系統 (Windows 7;Windows 8/8.1) 可免費升級至Windows 10 Windows 10 正式登陸全球190個國家和地區 Windows 10近日以免費更新,或隨全新個人電腦及平板電腦附載的形式正式推出,預載Cortana、Xbox、Microsoft Edge等創新功能及應用程式,於最廣泛的裝置上提供統一的用户體驗,包括個人電腦、平板電腦、電話、Raspberry Pi、Xbox One及HoloLens等。而全新Windows市集及Windows軟件開發工具亦同步推出。 Windows 10配備載譽歸來的「開始功能表」及「動態磚」讓用戶時刻緊貼與其相關的資訊。據官方介紹,Windows 10亦是Microsoft史上最安全的Windows版本,配備增強的Windows Defender及SmartScreen,協助用戶防範病毒、惡意軟件及釣魚網站的侵擾,加上多項創新功能,例如讓用戶能夠便捷地無需輸入密碼亦可安全登入的Windows Hello。同時,保持個人和裝置時刻緊貼最新軟件及資訊亦從此變得簡單,免費更新將助人們更能掌握支援其裝置的最新功能及安全性更新。Windows 10配備語音、手寫筆、手勢操作功能,讓用戶能夠與個人電腦自然地互動,帶來更個人化的操作方式,提高生產力。 Windows 10提供多項創新體驗及裝置,包括: Cortana是一個助用戶輕鬆合時地尋找到合適資訊的個人數碼助理; 全新Microsoft Edge是一個讓用戶能夠迅速地瀏覽、閱讀及標記及分享網站的瀏覽器; 整合的Xbox app為Windows 10注入Xbox體驗,讓用戶能夠跨越裝置界限,使用Xbox One或Windows 10裝置,呼朋引伴聯手作戰或對戰一較高下; Continuum 驅動應用程式,讓用戶能輕鬆切換觸控操作及桌面模式,裝置變得盡善盡美,更貼近現實需求; 內置應用程式:包括相片;地圖;Microsoft全新音樂應用程式;Groove;以及提供精彩絕倫的娛樂及無與倫比的生產力選擇的電影及電視。配合OneDrive,所有檔案都能輕易地分享及確保所有裝置的檔案保持更新; Microsoft Phone Companion應用程式使iPhones、Android或Windows Phone都能與Windows 10裝置暢順無縫地運作; 所有為Windows 10平板電腦而設的全新Office Mobile應用程式現已於Windows市集4上架。Word、Excel及PowerPoint應用程式為尺寸較小的平板電腦提供絕佳的觸控操作體驗。而Windows 10亦會預載全面的OneNote應用程式,滿足用戶摘錄各式各樣數碼筆記的需要。而下一代Office應用程式 (Office 2016)將會為專業內容創作提供最豐富多彩的功能組合。而在大尺寸屏幕個人電腦、手提電腦及如Surface Pro一樣二合一裝置運行的Office應用程式,亦將會為進一步加強鍵盤及滑鼠的精確度,讓用戶在進行文書處理工作時更得心應手。 免費升級計劃已開始推出,使用正版Windows 7或Windows 8.1個人電腦或平板電腦的客戶,可輕易地升級至Windows 10。已登記升級的客戶將於升級安裝就緒時獲得通知。從8月中到9月,Windows 10會在全世界越來越多的商店推出。部份零售商戶亦陸續推出預載Windows 10裝置。