潮流特區

最新文章

【Trading View 基本使用教學】

創富坊
程式交易 www.quants.hk (導師: 財經書藉作家: 麥振威)・2024-06-11

2014年我們便開始開辦程式交易課程,當時主要教授的是Amibroker,其後再增加有關Multichart的教學。近年始越來越多學員喜歡用Trading View,故此我們的教學內容也逐漸以Trading View的教學替代Amibroker,而且在Patreon也會定期提供一些Trading View的pine script(version 5)教學,希望會對大家有幫助。 學習pine scrip最好的方法就是參考別人已寫出來的例子,筆者會嘗試先用一些簡單的策略,每句語法給大家講解,多看這些例子後就會很容易上手。 首先,若有用Trading View的會員應該也知道,付了年費使用Trading View後,它所提供的是延時數據,所以只能用作backtest,若要用Trading View做autotrade,則需要申請實持數據,目前若要申請美股包括槓桿ETF如SQQQ及TQQQ等的實時數據大約是每月9.95美元,約77.6港元,其實算是十分便宜。但請留意這不包括標普、納指期貨的,若是想autotrade 美期,則需要額外申請,大約是5美元一個月,約39港元。 不過,筆者提提大家,若已付了Trading View的年費也先不用急著申請實時數據,因為若你本身已有申請interactive Broker的數據的話,其實可導入Trading View使用的。在下期課程也會教大家如何將Trading View連接interactive broker做autotrade(舊學員同時是Patreon會員也可免費重讀這部份的)。 故此,要做autotrade除了可選富途,interactive broker也可以。當然,若你想炒幣,選擇會更多,但筆者沒有教這方面的內容。 若果你完全是新手,也可先下載Trading View,會有一個月免費使用,先講解一下圖表的選擇,在「indicator」中可選不同的技術指標,一些較冷門的技術指標也有提供,如筆者已教過的Fisher Transform、可用以判斷即市中好、淡雙方力量的Vortex Indicator (VI)及判斷即市轉勢位的william fractal 等等也有提供。 圖表的選擇也有很多,如Heikin Ashi、Renko、kagi、Point&figure Chart等,當中Point&figure Chart就是OX圖,筆者覺得觀察OX圖的Intraday 圖表會對短炒有一定幫助 這些選擇圖表及指標的功能應不太困難,任何新手下載Trading View後也可自行嘗試。而Trading View最重要的是「Pine Editor」,就是可以在這裏寫交易策略做back test及autotrade,Trading View用的語法名為pine script,當寫好後可直接按「Strategy Tester」便會有backtest結果。 Trading View的backtest report其實內容十分清晰,在「overview」的部份便可看到資金變化,越平穩向上便越好,代表交易策略賺錢十分穩定。而在圖表上部份也顯示了虧損的情況,虧損不能完全沒出現的,但這部份顯示的形態越「平」越好,代表不會突然出現很大的虧損,若上落很大也代表交易策略在真實執行時會很困難。 另外,在「Performance Summary」則會顯示詳細的back test report,這部份很多完全新手常問筆者,「Total Closed Trade」是什麼,這其實代表你的交易策略在某段時間裏的「總交易次數」,report 也有顯示sharp ratio、profit factor等常見的數據。而「list of Trades」則會顯示每宗交易的詳細資料,基本上Multicharts及Amibroker等有提供的數據,Trading View也有提供,但Trading View不用再自行輸入數據,所以較為方便。 至於「Trading Panel」則是用作連接autotrade及導入外部數據用的,這個會逐步再教大家。 不過,要在Trading View寫策略就必需學習Pine Script,這套語法其實並不困難,但大家要留意,目前大家在Youtube或其他網頁看到的教學,絕大部份都是教 Version 4的版本,但Pine Script其實已更新至version 5,更改也頗多,例如要寫10日平均線在Vesrsion 4可以寫成 sma10=sma(close,10),但在version 5則要加上ta.,要寫成sma10=ta.sma(close,10)。 所以若大家用ChatGPT來幫自己寫Trading View的策略時會發現,ChatGPT的答案大部份都錯的,因為ChatGPT的數據是舊的,它給你的答案也是用version 4寫的。 不過,筆者知道有些學員其實已學過version 4 Pine Script的,又或大家可能在網上看到一些用version 4寫的sample,又很想直接使用,其實也有更方便的做法。在Pine Editor寫策略時先加上 //@version=4,然後按右上角的「...」便會見到「Convert code to v5....」,Trading View可協助將version 4的策略直接改為version 5的。 我們網頁: www.quants.hk Youtube: https://www.youtube.com/@markchunwai Facebook專頁: https://www.facebook.com/quantshk/ Patreon: https://www.patreon.com/quantshk

2024年6月10日-6月16日一周生肖運程預測

玄學星相
熊神進・2024-06-09

一周生肖運程預測 鼠:鼠生肖每年在6月都鬱鬱寡歡, 有很多心事。有的事情,不用自己操心,可放心讓他人去做, 這是需要的。婚外情是鼠生肖的煩惱, 欲斷難斷, 加上本周犯太歲, 你的不快樂之事追隨著你, 在星期六日, 如果可以, 建議你去游泳, 可以减壓。事實上,如果你原本單身,現在可能已經遇到了真愛。 牛:遇任何事情應都力求考慮周全些,宜以守成爲主,不可急進,難關也可以度過。財運非常旺,橫材也不錯。感情生活變得捉摸不定,應多花些心力呵護。要多注意腸胃健康。財運亨通,適合投資獲利,但偏財不宜强求,應適可而止。幸運數字:2、8、6、3及其組合。晚上如果有空,請做一次燒供。 虎:本周的你發現肩負的責任越來越重,計劃的事情也越來越多;然而你往往覺得壓力越大,動力也就越大。凡事不要太過在意到底是誰的錯誤,應當聽聽長輩和朋友的意見,用耐心多替對方著想。由于受到「劍鋒」凶星的影響,身體上可能會被金屬或者利器傷害到,從而引發可怕的血光之灾。 兔:今個星期在事業上有機會再進一步,在現有公司有可能會有晋升機會,轉工則不太適宜。加之「祿勛」會起到積極作用,給予有功者以俸祿,屬兔的人在工作中的努力奮進會讓領導看到他們的努力,從而帶動正財收入,此外還會獲得額外的獎勵,財運持續穩步上升,可在一定程度上改善生活質量。本周提妨生肖:牛、蛇。 龍:他生日了,你有否想過爲他生個孩子,如果你是愛他的話。本周應該多出去旅游或者是走動,這樣也有助于提升個人的運勢。愛神繼續加持,感情仍然充滿甜蜜的香味,你跟愛人都喜歡靜靜地享受二人世界的氣氛。單身者繼續需要參加親友聚會,令社交圈大增,脫單要靠自己多認識新朋友,才更容易遇到合眼緣的异性。 蛇:財運旺盛,努力工作就會荷包滿滿,或有升官發財的機會。你希望能享受自在簡單的愛情,談一場沒有負擔的戀愛,只要自己努力點還是有機會達成的。健康也是必需注重, 今個星期受到外界影響,容易心緒不寧, 出門及出外要小心小型意外,尤以常運動及駕車的朋友,需要留意。預防色欲敗身、桃色糾紛、夫妻反目、意氣用事。 馬:運勢稍稍下降,雖有「月德」助陣,但因「天狗」星阻礙,使得你在各項發展上充滿考驗。大部份的人都會身上挂一粒「黃水晶吊墜」, 因爲清明的負能量高。因命宮中有衆多的吉星拱照,在運程上會大有起色。退休後的屬馬人,如果能把多餘的時間用于鍛煉身體上,增强身體素質,以及規律的作息和飲食,這幾天的疾病問題將無足輕重,健康運勢也能日漸好轉。 羊:感情運勢方面,龍馬活躍,感情生活豐富,要謹防失控。身體容易出現毛病,例如飲食不平衡、容易發怒等,這些都容易令身體出現毛病,一定要注意保持生活規律,保持平靜的心境,便可以减輕身心承受的壓力。財運方面必須 以積極的態度面對各種機遇和變故,很容易掙到你想要的錢。 猴:本周有機會出外公幹,短暫離開家人,獨自闖蕩江湖,人在他鄉,夜深人靜的時候不禁思念家人、朋友及愛人。財運旺盛,生意興隆,讓你忙得不亦樂乎,宜把小量財富奉獻給慈善公益用途,積善之家必有餘慶,自能獲上天長遠庇佑令業務繼續滔滔不絕。繁忙的工作讓你作息飲食不穩定,宜避免有太多烟酒及油炸食物。學生的學業成績理想,如果能在桌上擺設文昌塔,能更專注學業,腦筋靈活。 鶏:做生意的朋友今個星期可望營業額增加,但打工仔(工薪族)要出來創業則不宜;感情方面則比較平淡, 假如打算今個星期籌辦婚宴, 這是不宜, 因爲負能量比較廣, 你可以延遲一下, 在6月芒種後, 情况會改善 。今個星期財運好,適宜投資,容易獲利,隨身佩戴一個玉佩,能够提升運氣。本周提妨生肖:猪、蛇。 狗:感情生活多姿多彩,不過要小心因其他异性的緣故,而與愛人發生摩擦,應切記專情,小心維繫感情,以免幾頭空。在事業上宜以守爲吉,妄動容易成爲招致失敗或禍事的導火索,小心謹慎爲上。事業發展得力,應在求穩的基礎上積極進取,以博取更大的發展!財運非常佳,財源大增,亦可進行投資獲利。本周幸運色:淡粉色。 猪:男女婚成,有情人終成眷屬,桃花局暗裏憂,磨合波折不如己願。 在經濟上會出現糾紛之事,多有經濟上的官司,切勿與人針鋒相對,以免兩敗俱傷。工作壓力比較大,事多繁忙,不要過多埋怨,頂住壓力努力工作,終會有相應的收穫。身體健康上要注意腸胃類的疾病。風水助運物:黃水晶球座。

何謂 Infrastructure as code - IaC

科技新知
MacauYeah・2024-06-07

在雲端服務出現後,好多新的名字,或許大家都聽過,筆者也稍為再簡介一下。 Software as a Service (Saas)。就像我們的Web App,不用下載體件,可以直接經雲進行業務操作。 Platform as a service (Paas)。這個概念可能最含糊,筆者理解就是,雲端供應商提供一些底層的軟件,供IT人使用。像是資料庫,Web Engine。 Infrastructure as a Service (Iaas)。這個更底層,雲端供應商給出CPU, IP, Memory, Storage等,頂多就再多個預安裝OS的選項。IT人自己去配搭使用。 多得這些彈性服務,雲端應用才真的跟過去租用實體伺服器有所差異。 但對於IT人來講,要使用這麼多不同的服務,實在也不簡單。對於IT消費方,用錢換來實體硬件的靈活性,但因為硬件沒有邊界之後,軟件的量就暴增。管理也不能說是很方便。 在Docker, Kubernetes等Container(容器)出現後,又為這些管理問題帶來另一種希望,就是Infrastructure as code - IaC。它的目標是,管理基礎設施,要像管理原始碼一樣,checkout 就可以回覆到指定狀態。 初聽之下,大家可能覺得好玄,但其實這個概念,在之前筆者的Docker 教學中,已經有出現過。Docker compose 、Docker stack 指令,它們都是基於yaml檔的IaC。 當筆者更新了yaml 檔,執行一次stack deploy ,docker 就會對比之前狀態,如果replica(分身)不夠多,就自動增加所欠數量,如果image 也更新了,就排隊輪流重起換image 。最重要的是,當我們checkout 舊的yaml 檔,回到過去某個狀況,只要還是執行同一句stack deploy ,系統就自然減少所需的replica數量,下戴過去的image。這就代表,我們對於container 構建而成的環境,都可以放入Git等版本控制中,整個管理模式,就像管理程式碼一樣(GitOps)。 對於更進階的Kubernetes更是如些,除了container外,多種不同的network,storage配置,都通過yaml檔進行控制。這樣,架構即使複雜,但只少可以測試、重現和管理。還有一個,它比Docker stack要強的是,它某程度上支緩刪除的概念。雖然不完全,但總比完全沒有方便。 這個IoC的概念,可能還未達到一定廣泛地應用的階段,但它的核心在於,基建項目有檢測試差異的功能,自動去因為這個差異去加或減資源。用Programmer的講法,就是系統有Diff的功能,自動多除少補。

命運起落,最終遁入空門

宗教玄學
熊神進・2024-06-06

#什麽人的八字會中年出家 有人說,入「空門」是一種福份,佛教宣揚萬法皆空,以悟「空」爲進入涅盤之門,故稱「空門」。筆者是佛教徒,也是玄學家,十分理解八字中有福份入「空門」的人,他/她們命中是有安排。 有一位藝人叫「秦蔚文」,她的八字從不公開,筆者跟她都是佛友,當然明白我佛慈悲,命運掌握在强者手上的硬道理。 文文是她的藝名,我們佛友相聚,大家都是叫法號或者師兄,她的八字是一頁教材,對初學者來說,我們可以從「裸桃」神煞中學習入「空門」的轉接位。 泰雅語有一個詞匯叫做sbalay,原文的意思是「找到真相」,裸桃的「裸」,就是回歸真相,什麽是「回歸真相」,稍後我再補充說明。 我們的傳統文化都是保守, 聽到ぜんらたいき就誤會它的字義,「全裸」這兩個只是說熱情,幷沒有什麽邪念,同樣命理學中的「裸桃」也不是什麽壞東西,它只是八字神煞中的「裸體桃花」一種。 什麽叫「裸體桃花」? 「沐浴」就是桃花,女生是甲子日、庚午日、丁卯日、癸酉日出生,她的日主屬自坐沐浴之地,沐浴的時候,女生都不穿衣服,古命書中寫道:“羅衫盡除稱裸體,多情多欲曰桃花。”裸體桃花就是這樣來。但從筆者實際工作中,筆者發現裸體桃花不僅命局裏有「沐浴」狀况,而且天干與地支都相沖才把「裸體桃花」實現。我舉一個例子,如甲子日,它具有「沐浴」狀况,但它沒有時柱相沖的條件也是不應驗,因此如果她是在庚午時出生,時幹七煞子午逢沖,就是具備了條件。 「裸體桃花」是八字,但在應用上,一位女生不可能一生都處于「情欲期」,情也有空檔期,當情欲沖上腦,我們就失去理智,這點可以從八字大運,流年中看出來。 文文在1985年開始行「裸桃」大運,這段日子她拍過幾套限制級電影,之後認識了一位江湖男人,情欲期過後在菩薩安排下皈依我佛,這就是我說的「孤獨期」。 很多女性在失去愛情後都有一種「帶發修行」行爲,例如减少社交活動,退群,以及打坐焚香等等,她們想過一些簡單生活,不再涉足煩塵。 「回歸真相」,就是玄學家說的「回復我性」,也就是《三世書》說的業力。人是帶業力來到人間,業力有長有短,有深有淺,我們不是聖人,我們會犯錯,犯錯是業力的呈現,是合理,也是「應劫」。我們這一生也在積福,當我們的福報來了,就抵消了前生的業力,因此,有福的人不生育入了空門,這就是「回歸真相」。相爲身,真相就是真身了。 命有「裸桃」神煞,一般是婚姻破敗,難以白頭,因此玄學師博總是建議晚婚,做烟供,同時更重要的就是不要早生育。

開發者在Steamdeck上的另一個選擇: Gnome box

科技新知
MacauYeah・2024-05-28

前些日子,因為升級podman的關係,筆者對Steamdeck的限制就更為了解。因為Steamdeck是一個修改過的Arch linux,不單止代表是某些區塊是唯讀不可寫。更深一層的問題是,有些依賴包,不能簡單地通過安裝或自行編輯來解決。 例如早前podman 5.0.x需要的pasta依賴,雖然Arch linux官方有這個lib的發佈,但Steamdeck沒有選用,那些我們自己下載原始碼,你地會發現steamdeck的gcc或cc編譯指令還法完全執行,一來是編譯器指令沒有預設對,另一方面則是缺少了更多的c lib (.h) 依賴包。最後筆者只好選擇下載pasta官方預編譯的二進位程式。能用,但就總是多少有點不安心。因為pasta的預編譯只是針對x86_64的CPU,並沒有考慮link lib的問題,不過這次運氣還算可以,沒有無盡依賴的問題。 回來講Steamdeck的情況,之前筆者介紹brew,其實是macOS帶過來的,雖然他們對其他linux的支援很不錯,但多少都基於某些低層的依賴包可以隨時更新。而Steamdeck這個限制版,就沒有保證linux 依賴包的預安裝。(那怕是Ubuntu也是一樣,只是我們可以通過進一步的指令案裝就可以了。)所以在Steamdeck上,長遠還是要找一些官方維護的軟件比較安全。 Steamdeck上預設的是依賴安裝是【Flatpak】,雖然它不像yum, apt, dnf這些仔細可以安裝原始碼依賴,但它們可以安裝App,例如Firefox、Chrome、輸入法等。遺憾的是,Flatpak上沒有podman, docker,對於開發者來說就很不方便。 但最後,筆者終於在【Flatpak】上發現一套【BOX】VM解決方案。它的功能不算強大,但至少可以經ISO安裝自己想要的OS,也有快照功能(只限關機狀態下)。BOX官方亦表明,這套VM不是針對自動化或企業管理所做的,只有一些基本操作。 官方連結: https://apps.gnome.org/Boxes/ 官方原始碼: https://gitlab.gnome.org/GNOME/gnome-boxes Flathub載點: https://flathub.org/apps/org.gnome.Boxes 對於筆者來說,能裝到VM,代表就有更多的操作空間。如果大家不介意多了一些虛擬層,會太影響效能,其實很多操作可以在VM內使用。例如不需要再用podman,可以直接在VM中使用docker、安裝k8s等。對於效能問題,我們必需要在Steamdeck操作時,至少我們可以在VM中先安裝Arch linux,找回必要的依賴包,編譯我們想要的link lib,再抄回Steamdeck下執行。過程的確比較轉折,但若然Steamdeck這台機器只適合打機的話,就真的很可惜。

范榮彰分享禪茶文化精神:「禪茶一味」體驗

宗教玄學
范榮彰博士太平紳士・2024-05-28

2024年1月6日至8日,香港菩提文教館舉辦了名為「禪茶一味」佛教文化展的活動,范榮彰博士欣賞這個展覽旨在傳承和弘揚中國傳統禪茶文化,並通過禪茶的體驗和分享,讓人們實現禪即生活、生活即禪的喜悅人生。 在活動的禪茶研討會上,范榮彰博士與其他佛教學者、專家和慈善家一起討論了禪茶文化的價值和精髓。他們一同探討了「茶禪」、「禪茶」、「由禪入道」和「禪茶一味」等主題,並希望通過這些研討交流,進一步弘揚禪茶文化。 省吾大師與范榮彰對談禪茶文化精神 禪茶文化的精神「正、清、和、雅」,以及其功能「感恩、包容、分享、結緣」深深吸引了范榮彰。他相信透過品茶和體驗禪茶文化,可以讓人們在日常生活中感受到這些價值觀的融入。范榮彰希望透過弘揚禪茶文化,讓人們實現自在和喜悅的人生,同時也發揮禪茶文化在凝聚人心和化解矛盾方面的潛在作用。 體驗茶香:范榮彰博士之愛好 范榮彰對禪茶文化的熱愛和對傳統文化關注,他相信禪茶的價值和精髓可以為現代社會帶來正面的影響,同時也希望通過這樣的活動和交流,讓更多的人認識並參與到禪茶文化的傳承和發展中。他對茶藝和茶文化有著深厚的興趣和研究。范榮彰相信茶藝是一種藝術形式,可以提供身心靈的寧靜和平衡。他認為品茶是一種禪修的方式,能夠幫助人們放鬆心情、提高專注力,並在忙碌的日常生活中找到片刻寧靜。范榮彰經常參與茶藝活動和研討會,並與其他茶藝愛好者交流分享。 范榮彰在平常生活中非常重視茶藝的研究和實踐,並且喜歡與朋友、家人或同事一起品茶。他相信茶藝是一種可以帶來身心寧靜的活動,也是與他人交流和分享的良好方式。相信茶藝的體驗能夠幫助人們放鬆身心,提高專注力,並增進彼此之間的聯繫。他喜歡和朋友們一起坐下來,品味茶葉的香氣和滋味,細細品味茶的質地和風味。在品茶的過程中,他們會互相分享對於茶的感受和體驗,並且用心聆聽彼此的故事和心情。 范榮彰平常也會與自己的家人和員工一起品茶。他認為這是一種拉近關係、增進人與人之間情感連結的方式。無論是在家中的小茶室還是辦公室的茶水間,范榮彰都喜歡與身邊的人共享茶的美好。這種共同品茶的經歷讓他們更加親近並建立更深厚的關係。 范榮彰對於茶藝的研究和與他人共享茶的經驗,展現了他對於禪茶文化的真摯熱愛和對人際關係的重視。茶藝成為了他與朋友、家人和員工之間建立共同體驗和情感連結的媒介。這種平常的茶藝實踐不僅豐富了他的生活,也為他身邊的人帶來了寧靜和喜悅。

BEYOND EXPO | Dr. Easy好醫師智慧醫療平台 打造澳門智慧城市

科技新知
Cheers!・2024-05-24

為推動本澳智慧醫療發展,澳門電訊打造了結合人工智能技術Dr. Easy好醫師醫療平台,澳門電訊Dr. Easy好醫師醫療平台啟動儀式在23日下午,於BEYOND國際科技創新博覽澳門電訊展館舉行! 平台啟動儀式 郵電局局長劉惠明、衛生局局長羅奕龍、澳門中聯辦經濟部助理陸上城、議員陳澤武、胡祖傑、梁孫旭、梁鴻細、鄭安庭、羅彩燕、馬耀鋒及澳門電訊行政總裁潘福禧共同參與平台啟動儀式。 澳門電訊商務副總裁湛寶儀發表 「Dr.Easy好醫師平台是澳門電訊面向醫療機構和服務使用者打造的一站式智慧醫療解決方案,提供多元化的數字管理功能、問診預約、檢查預約、遠程視像諮詢及報告查詢等功能,並內置了AI生命體徵檢測功能*,應用人工智能技術,透過面部掃描可分析身體健康數據,隨時掌握大致的身體狀況。亦期望透過該智慧醫療平台,為醫療機構及服務使用者解決現時存在的痛點、難點,打造一站式便捷高效的診療體驗。」 澳門電訊商業服務及拓展高級經理邵慶祥詳細介紹Dr. Easy好醫師平台亮點 為醫療機構提打造管理系統 實現資料雲管理 服務使用者端一鍵預約、覆診、報告查詢等功能 首批進駐澳門電訊Dr.Easy醫療平台嘅醫療機構代表 澳門明愛 歐亞口腔醫療中心 健滙醫療中心 尚越醫療中心 諾安醫療服務 工人醫療所 便民醫療中心 百利康醫療中心 九澳護養院 澳門電訊亦會繼續透過引進及自研各項智慧轉型解決方案,為醫療服務使用者打造更優質的智慧醫療服務體驗,助力澳門各界加速數字化轉型步伐,為市民打造一個智慧城市! *AI生命體徵檢測功能之所有數據不能代替醫療專業人員的臨床判斷,結果只供參考,如有需要請聯絡專業的醫療人員諮詢

BEYOND EXPO | 澳門電訊 X 澳門大學 延續項目合作 推動智慧旅遊業

科技新知
Cheers!・2024-05-24

為推動澳門智慧城市建設發展,澳門電訊與澳門大學早於2018年已簽署了戰略合作協議,透過雙方的合作,成功完成了「旅遊大數據算法研發」及「自動化客戶體驗測試工具研發」的項目合作,5月23日,於BEYOND國際科技創新博覽會(BEYOND EXPO)澳門電訊展館舉行雙方延續戰略合作簽署協議,為助力澳門1+4產業多元發展注入新活力! 簽署有關戰略合作協議 澳門大學副校長(研究)葛偉教授和澳門電訊行政總裁潘福禧共同見證下,澳門大學科技學院院長須成忠教授與澳門電訊商務副總裁湛寶儀簽署了有關戰略合作協議! 澳門電訊商務副總裁湛寶儀:「澳門大學卓越的科研團隊和師生,是澳門電訊在推動智慧城市領域研究成果轉化的重要伙伴,其中『旅遊大數據算法研發』項目的成果,更成為了支持澳門智慧旅遊發展的重要部分,未來,澳門電訊繼續就5.5G、AI、大數據、智慧物聯網應用等領域,與澳門大學展開更深入的合作,期待為澳門打造更多智慧應用場景。」 澳門大學科技學院院長須成忠教授:「澳門大學與澳門電訊的強強合作,相信能對澳門的通訊發展,起到更大的推動作用,這次的續約,也是雙方對前期工作的認可和肯定,雙方的後續合作,特別是在產學研方向的合作,有望推動上更高更大的台階。」 雙方進行了產學研項目交付儀式 交付項目 「旅遊大數據算法研發」項目 將助力澳門電訊大數據服務應用,進一步精準地分析及挖掘景點與旅客之間的關係,擴展數據的可用性及支持轉化更多應用場景。 「自動化客戶體驗測試工具研發」項目 將加快澳門電訊推動實現智能化工作流程,提高工作效率及測試準確性、擴大測試覆蓋範圍等,更好地了解客戶的服務使用體驗。 澳門大學代表參觀展館 在澳門電訊介紹下,參觀了展館中圍繞助力推動文化旅遊、大健康產業、AI+大數據潛力和應用、最新網絡安全技術與多網融合、新一代極速網絡等方面的「數碼澳門3.0」網絡基建及智慧應用。

Spring Boot 04 - 進入http json api 世代

科技新知
MacauYeah・2024-05-23

本節,我們將會建立一個http服務,提供json api讓程式訪問。 下戴模版 我們跟上節一樣,使用Spring Initializr (Maven) 下載模版,但細節筆者就不再講啦。Dependency主要選擇 Spring Web Spring Boot DevTools 下載後,可以直接運行測試,可以用指令 mvn test 或經IDE運行。Spring會至少測試下能不能成功取用預設的8080端口。 Controller 我們若要實作 http json api,需要在 spring 中加入一個類,附註為 @RestController ,那方便起見,類名我們也命名為 XXXController 吧。作為示範,我們弄一個 HomeController.java ,裏面有最常見的 http GET, POST功能。 // src/main/java/io/github/macauyeah/springboot/tutorial/springbootwebapibasic/controller/HomeController.java import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; // ... other import @RestController @RequestMapping("/api") public class HomeController { @GetMapping("/someRecord/{uuid}") public Map readSomeRecord(@PathVariable String uuid) { return Map.of("ret", "your uuid:" + uuid); } @PostMapping("/someRecord") public Map createSomeRecord(@RequestBody Map requestBody) { HashMap ret = new HashMap(requestBody); ret.put("ret", "got your request"); return ret; } } HomeController裏,完整的URL 其實為: GET http://localhost:8080/api/someRecord/{uuid} POST http://localhost:8080/api/someRecord URL中的api之後的路徑,都是定義在 HomeController 中,而前半的8080及context path,是使用預設值。在正式環境下,可能隨時會被重新定義。但我們做本地測試,只需要驗證預設值就可以了。 我們真的運行起程式mvn clean compile spring-boot:run,再使用最簡測試工具進行測試。Windows的朋友,可以選擇Postman作為測試,它有圖形介面。而linux的朋友,請用curl,預設安裝都會有。下列為方便表示測試參數,筆者選用curl。 測試GET,其中1234會自動對應到spring裏的uuid。 curl http://localhost:8080/api/someRecord/1234 # return {"ret":"your uuid:1234"} 測試 POST,其中的 -d 參數,會對應 spring裏的 @RequestBody, -H 參數則是設定 http header 的意思,我們就使用約定俗成的 json 作為 header 。 curl -X POST http://localhost:8080/api/someRecord -H "Content-Type: application/json" -d '{"requst":"did you get it?"}' # return {"requst":"did you get it?","ret":"got your request"} 上面的兩個操作,都回傳了我們輸入的資訊,這代表了我們成功用spring架起了http json api,而且正常讀入資訊。 Test Case 雖然我們可以正常地架起 api,但每次開發都要 postman / curl這種工具額外試一次,其實也有一些成本。而且 api 數量變大,或經多次修改後,就重複人手執行,就變得相當討厭。 面對這個問題,筆者會建議寫測試用例,即是Test Case,而且用Spring內置的@SpringBootTest來寫。 產生一個空的Test類,vscode中,最簡單可以Source Action => Generate Test,然後加入這次要測試的參數。 // src/test/java/io/github/macauyeah/springboot/tutorial/springbootwebapibasic/controller/HomeControllerTest.java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @SpringBootTest @AutoConfigureMockMvc public class HomeControllerTest { @Autowired private MockMvc mockMvc; @Test void testGetSomeRecord() throws Exception { RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/someRecord/1234") .contentType(MediaType.APPLICATION_JSON); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("your uuid:1234")) .andDo(MockMvcResultHandlers.print()); } @Test void testPostSomeRecord() throws Exception { String request = """ {"requst":"did you get it?"} """; RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/api/someRecord") .contentType(MediaType.APPLICATION_JSON) .content(request); this.mockMvc.perform(requestBuilder) .andExpect(MockMvcResultMatchers.jsonPath("$.requst").value("did you get it?")) .andExpect(MockMvcResultMatchers.jsonPath("$.ret").value("got your request")) .andDo(MockMvcResultHandlers.print()); } } 最後就是執行 mvn test 或經IDE運行,應該都會得到所有測試都通過的結果。 mvn test # other test result ... [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.368 s -- in io.github.macauyeah.springboot.tutorial.springbootwebapibasic.controller.HomeControllerTest # other test result ... 上面的程式碼很多,我們逐一來。 @SpringBootTest 寫在類的外面,代表執行這個測試類時,需要運行起整個Spring程序,當然也包括http的部份。 @AutoConfigureMockMvc 寫在類的外面,代表執行這個測試類時,可以模擬一些發向自己的 http 請求。 @Autowired private MockMvc mockMvc 寫在類的裏面,因為之前有定義了可以模擬 http 的請求,Spring在運行時為大家提供了那個所謂的模擬http client的實例。 MockMvcRequestBuilders,則是建造要測試的URL及Header參數。 MockMvcResultMatchers,則是檢查回傳的結果是否如遇期的一樣。 為何這個http client叫模擬 - Mock ? 因為在測試用例中,可能連Controller 內部依賴組件也需要進一步模擬,這樣才能把測試目標集中在Controller裏,這也是單元測試的原意。只是本次的例子看不出模擬與否的差別。 MockMvcResultMatchers.jsonPath(),這是用來檢測json的結構是否跟預期一樣。有些網路上的其他例子會簡寫成 jsonPath() ,但因為vscode IDE的自動import功能比較差,筆者還是保留傳統的寫法。 如果大家覺得@SpringBootTest很難,想折衷地把其他測試方法,那麼把 postman / curl好好管理起來,每次修改完程式,都完整地執行一次 postman / curl ,也可以達到測試的效果。只不過大家還是要好好學會整合 postman / curl,知道如何檢測json結構,什麼時候有錯,什麼時候叫測試通過,所以也要花一樣功夫來實現。 最後,大家千萬不要因為測試難寫而逃課,因為寫測試絕對地可以減輕日後重執行的工作量。除非你的程式碼即用即棄,否則都建議寫測試。(測試跟寫文檔不一樣,有了測試也不能沒有文檔。好消息的是,文檔現在越來越多自動生成的工具,我們日後再找機會介紹。) Source Code spring boot web api basic

Ubuntu 24.04 試用報告-更新

科技新知
MacauYeah・2024-05-21

上期為大家介紹了一些ubuntu docker, multipass的一些改動。本期再繼續介紹一些其他的更新。 apt中的source.list 的位置更新了,格式也更新了,從/etc/apt/sources.list在指向了/etc/apt/sources.list.d/ubuntu.sources,格式變得更親民,就像如下所示 Types: deb URIs: http://mo.archive.ubuntu.com/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: http://security.ubuntu.com/ubuntu/ Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg 承上更新,雖然格式好看了,noble-security的部份卻故意折開了。而且在live-cd初次安裝時,大家若要改mirror(鏡像站點),只能修改noble noble-updates noble-backports的位置,noble-security還是會指定在官方的位置。筆者猜測它的用意是針對安全性更新,大家應該要直接訪問官方網站,不要等mirror慢慢更新。此一更新,不單影響ubuntu 24.04,連ubuntu 22.04也受一併折開了,只是22.04還是使用舊版。如果有需要變回統一的方向,減少日後自動化的修改,可以像以下修改 ubuntu 24.04的修改 Types: deb URIs: http://mo.archive.ubuntu.com/ubuntu/ Suites: noble noble-updates noble-backports noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg ubuntu 22.04.04的修改,刪除/etc/apt/sources.list,新增/etc/apt/sources.list.d/ubuntu.sources (對齊ubuntu24的位置) Types: deb URIs: http://mo.archive.ubuntu.com/ubuntu/ Suites: jammy jammy-updates jammy -backports jammy-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

軟件發行也需要維修基金?

手機‧電玩
MacauYeah・2024-05-13

筆者參與軟件開發,都己經有好一定年期。面對軟件開發週期,最痛苦的並不是研發階段。好多打機的朋友,可能會以為軟件應該跟遊戲差不多吧,開發完就頂多修BUG,然後全心地投入下一個項目的開發。要持續花時間更新?不可能,微軟不也是幾年要求重買一次新版的Office套裝嗎?幾年也要另外花錢升級OS。概然全部都要另外花錢買,不就是一個全新的項目嗎? 其實除了微軟這種夠大夠惡的龍頭公司外,其他都不是這樣運作的。例如我們現在很常用的手機OS,不論Android, iOS,其實只要硬件支緩,就不需要用戶成本就可以升級的。其內的App應用,也因為手機OS的升級,也要持續升級。所以不論你是哪一層的開發者,好大機會都要一直維護已發佈的軟件版本,好讓它可以在不同環境下運作。而這個維護成本,就看你低層的供應商有多進取、有多佛心。現在基本免費的供應商都會大刀闊斧地改功能。大家要留意,是改功能,不是加功能。也就是有些功能過去有,現在使用模式整個有改變,你不得不重寫自己的軟件。 所以筆者現在最頭痛的是,如何為公司維護這些沒法帶來新收入,而又要不斷支付時間和金錢的訂制軟件。 技術上,一定有很多討論,但在於只關心行政的老闆的角度下,根本聽不懂。在於開發者的角度,也需要很長期的實務經驗才能有好一點的佈署。扣除技術,在本質上,若然各利害關系人都曾經考慮過,大家應該都會有更好的預期。 軟件有生命週期,而且這個重複得越來越快。由開發到發佈穩定版本的時間、人力、金錢最高。因為環境變遷,重回開發的機會越來越多,不斷地重複。 需求狠心地下架過氣軟件。過氣軟件,要麼更新,要麼淘汰。但不是所有軟件都受歡迎,值得投放時間。這個在老闆視角下,他很懂。但老闆通常做不了的是,狠心放棄升級不了的軟件。老闆經常覺得,只要軟件放著不更新,就不會有成本。錯,因為老闆只會記得倉庫中曾經有一個軟件可以做到某個功能,可以給賣給某個客戶。但當你拿出來時,才發現不能直接用,還是很焦急地找人更新。 軟件開發,跟很多其他類型工程很像。不是隨時看看圖表,就可以回憶前世今生。舊軟件要救,要花時間先摸索當初的開發工具、環境,追查問題原因,或許最後可只改一句指令就解問題,但總體成本會令人無法接受。 軟件的可複制性不如以前。很多老闆會認為,你之前開發過一次,抄過來做點少改動,不就可以當一款新的應用嗎?因為原來軟件沒有維護,大部份過氣的軟件,即使你有原始碼,你也未必能找到適合的編譯環境來做改動。想要改動?還是老老實實做先更新。 所以,大家對於軟件維護,應該要像物業管理一樣,要預留一部份費用為維修基金。可能還是有老闆會講,怎麼可以預留到這麼多錢去做維修?所以,筆者更加建議,不是要做一個完美的萬能軟件,要鎖定核心功能。沒化更新的,就放棄、止蝕。