搜尋

搜尋結果

LG V20 影音發燒友的流動 Hi-Fi
科技新知
Cheers!・2016-10-28

LG V20影音發燒友的流動HiFi Android手機仲有啲咩選擇?朋友說擇「機」要求不高,只要性能夠好、音質夠正、影相夠靚、電池夠持久、容量夠大、價格夠相宜......就好。咁多要求?最近全新推出 LG V20 旗艦手機,聽歌影相都有突破性享受,可以一次過滿足多個願望。 LG X Bamp;O PLAY頂級音色 細膩演繹 用手機聽歌,也可以有私人音樂廳的體驗!對於Bamp;O PLAY這個頂級音響品牌,愛玩音響的朋友應該不會陌生,這次 LG 與 Bamp;O PLAY 攜手合作,共同開發出 LG V20,是全球首款配備 32bit HiFi Quad DAC 的智能手機,有效減低 50% 以上的失真及雜訊,更可以將 16bit或 24bit 的音樂提升到接近 32bit 去播放,以後即使用手機聽歌,都可以聽到接近原音的音色,再配合埋隨機附送的 Bamp;O PLAY 耳機,隨時隨地都可以置身流動音樂廳。 前後雙廣角鏡 拍攝更方便 每次去旅行見到靚風景,都會恨為何相機不夠廣角,尤其自拍時,如果能夠同時影到靚人兼靚景,呃 like 當然更容易。LG V20 共配備前後三組鏡頭,後置的 1600 萬像素及 800 萬像素雙鏡頭,分別能拍攝出標準 75deg; 及 135deg; 超廣角照片,比一般智能電話相機寬 1.7 倍,無論拍生活照或廣角風景照都沒難度;前鏡方面,更有 500 萬像素,除了標準自拍,亦可調校至 120deg; 廣角鏡頭,連自拍神棍都唔洗帶,就可以自拍影齊靚人靚景,十分方便。 混合對焦系統 相片不再「鬆郁矇」 通常要拍攝移動物件或突發畫面,一般手機拍出來的效果都強差人意,變得「鬆郁矇」。今次 LG V20 引入全新的混合自動對焦系統 Hybrid Auto Focus,手機會自動透過鐳射自動對焦 Laser Detection 或相位偵測對焦 Phase Detection AF,結合對比偵測對焦 Contrast AF 技術,無論光暗環境下拍攝相片,都能準確捕捉所有細節,這樣就不怕錯失任何重要一刻啦! 可換式高效電池 支援外置記憶卡  習慣了用手機記錄生活,隨時舉起手來便可影相拍片,但最怕是手機越多越少空間,要清理空間非常麻煩。LG V20 有外置 Micro SD 卡插槽,最多可支援高達 2TB,如此彈性的擴充空間,影多點相拍多些片都不成問題了! 電池最近成為手機備受關注的一環,現時不少手機都採用內置式電池,但一邊叉電一邊玩電話是不少人擔心的安全隱患。LG V20 配備容量高達 3,200mAh 的高效電池,而且是可更換式電池,遇上不夠電量時,只要換上後備電就可以繼續用手機。 澳門電訊「尊壹會」會員、大豐 CTM Visa Signature 信用卡及大豐 CTM Visa 白金信用卡更尊享淨機 88 折!

蔡其東——開創澳門旅新格局
人物專訪
鳳凰天空・2016-04-29

Text 聶蔚然 Editor Joanna Lee Photo 鄧鋒 90年代,一位有誌青年懷著對澳門的憧憬以及對旅遊行業的熱愛來到了澳門,並投身於澳門旅遊業發展事業中。晃眼間,二十多年過去了,他一直在為澳門旅遊業的發展默默付出,他既見證了澳門回歸後旅遊業的發展,也對澳門未來旅遊業的發展有著自己的見解。他是蔡其東──澳門運通旅行社老闆亦是澳門旅遊從業員協會會長。 政府支持 旅遊業飛速發展 1962年澳葡政府把博彩專營權批給澳門旅遊有限公司之後,旅遊業才開始進入了一個起飛階段,2003年中央政府實行ldquo;自由行rdquo;政策,此後澳門旅遊業一直處於高速發展階段,近幾年澳門訪客每年呈雙位數增長。這飛速增長的背後更是離不開政府的大力支持。澳門政府每年都會組織旅行社到全國各地去推廣澳門,澳門政府曾經推出ldquo;合力澳門rdquo;政策,即以推廣澳門為主,把世界各地的客人吸引來澳門旅遊。近幾年,澳門政府在澳門舉辦的會展,音樂節,演唱會等活動越來越多,而一些競技類的活動比如每年一度的格蘭披治大塞車,拳擊比賽等都吸引了大量海內外遊客。與此同時,中央政府在十二五中提出要將澳門打造成為ldquo;世界旅遊休閒中心rdquo;的政策指導亦有助於澳門向更全面,更多元化方向發展。 ldquo;凝聚 學習 合作 培訓 交流rdquo; 隨著澳門旅遊業的硬體設施發展不斷完善,澳門旅遊從業員協會對旅遊業從業者也有十個字的要求:ldquo;凝聚rdquo;即凝聚業界力量,共同發展澳門旅遊業,這也是澳門旅遊從業員協會成立的宗旨。ldquo;學習rdquo;即旅遊業從業者應學習專業知識,提高從業者專業技能。ldquo;合作rdquo;即澳門旅遊從業員協會積極同澳門旅遊學院,澳門旅遊局展開全方位,多領域的合作。ldquo;培訓rdquo;即設置專業課程對從業人員進行培訓,包括專業知識和團隊領隊的危機處理意識等,盡全力滿足客人需求。最後,澳門旅遊從業員協會去到香港,台灣等鄰近地區,進行交流,借鑑好的旅遊發展經驗,在餐飲,交通,酒店,等方面加以優化,為打造澳門成為世界級的休閒城市貢獻力量。自古以來,澳門就是一個包容性極強的城市,澳門人熱情好客,很少有排外現象,旅遊業從業者也應做到讓遊客逛得開心,玩的盡興。 未來發展,開創多元化格局 蔡其東認為,澳門雖然面積狹小,但是具有天然的旅遊資源,雖然博彩業仍為澳門的龍頭產業,但從長遠發展角度,澳門經濟應向更為多元化方面發展。中央部署和澳門特區政府提出的打造澳門成為ldquo;世界休閒旅遊中心rdquo;的方針,已經對澳門多元化經濟的發展產生了較大的影響。澳門政府整體都在把澳門經濟向多元化方面帶領,除了舉辦一些活動外,澳門政府還在一些基礎設施上進行多元化的建設,比如新濠影匯的8字摩天輪等都會給遊客帶來不一樣的體驗。除此之外蔡其東也對澳門成為世界休閒旅遊中心提出了兩點建議:一,在保留澳門歷史文化的同時,澳門政府亦可進行舊區翻新的工作,為這些舊建築注入新的活力,也可藉機活化舊區的居住和營商環境,提升本澳旅遊城市形象。澳門政府在推廣澳門時,不能僅單單介紹ldquo;大三巴,威尼斯人rdquo;等一些知名的景點,也應以提升澳門整體形象為出發點,整體規劃,把較為破舊的老城區,進行翻新,讓整個城市形象得到改變。二,澳門要想成為世界休閒旅遊中心,其重要條件就是有足夠多的客人能來到澳門,感受到澳門的城市文化魅力,這不是遊客一天兩天的ldquo;速食rdquo;旅行所能體會到的。為了留住遊客,給更多的遊客一種休閒體驗,澳門政府可以建造一個大型的主題公園,給那些不想賭博的人提供更多的休閒旅遊選擇。在這方面,澳門可以借鑑香港ldquo;海洋公園rdquo;政府投資,外企管理的模式,同世界各地的主題公園相合作,延長遊客留澳時間。 通過一小時的談話,我看到了一位長期工作於澳門旅遊行業的從業人員對澳門旅遊業發展的看法和對澳門未來發展的期望,澳門回歸十六周年,對澳門來說,代表著新的契機,新的開始,望全民齊力,共創嶄新格局。

Coding Anywhere 工作方案
科技新知
MacauYeah・2024-06-13

最近筆者一直在準備軟件開發的教材,因為各種原因,例如:新舊硬件交替,沒有固定的電腦等等,讓寫稿和設計教程的進行得很慢。但其實這種情況並不旱見,即便是真正的開發團隊,也會時時刻刻面對各種新舊設備的更換。在不久的未來,這種更替速度可能更頻繁,工作模式也很可能趨向這樣,為了打造更靈活的工作方案,適筆者一直為自己的coding anywhere情境物色合適的工具。 基本假設 在分享之前,有些前題條件必需要滿足,coding anywhere的基本條件是我們可以把一些厚重的資源變成cloud或遠端工作,如果你是開發主機遊戲,你的測試必需要在PS5上跑,那就沒有條件帶著裝備走。即使你可以設定遠端連線,但你人在外,其實沒法在PS5上做互動。真正有條件實行的工作,必需要可以在外由開發至測試都行得動。 在這個前題下,筆者就開始分享一些自己嘗試過不同組合。 不可或缺的東西 滑鼠、網絡 這件事,看似不重要,但筆者一直沒法找到完美的解決方案。 無線滑鼠是標準配置,筆者曾經想去掉滑鼠,但不太可行。這個大家還是選一個不太大,而且可以穩定在不同機器切換的滑鼠吧。至於鍵盤,視乎你的主機有沒有實體鍵盤,如果最後選擇平板或掌機的話,還是需要帶鍵盤外出,亦即是不論你選擇何種方案,鍵盤的重量也是不會消失的。 另一個就是網絡流量問題。我們處身的環境,並不一定有免費網絡。有時為了安全性,我們不想配對公用Wifi。那怕不考慮安全問題,公用Wifi都很常出現因為人流太多而被踢的情況,所以一般都考慮直接使用手機的4G5G網絡。而為了節省流量,一般控制好大檔案大更新的下載時機,都是可以達到的。 不同的工作模式,不同的選擇 上述第一個問題在筆者看來,都屬於沒有選擇,但下面的選擇,可以基於價錢、功能、需要而搭配。另外,我們還要假設我們有足夠的Remote資源可以用。但如果大家的開發,必需要帶著硬件資源,就不太可能實現coding anywhere。 一台入門級的Notebook 如果我們大部份工作,都可以經Cloud Service解決的話,其實我們不必投資太多在主機之上。Notebook帶著四處跑,壞的可能性也多,入門級的Notebook就算壞了也沒有那麼心痛。 全Cloud Service還有另外一個好處是不需要擔心備份問題,壞了Notebook就狠心換機。而且Cloud Service的好處是需要更新client software的網絡流量消費不高,不過想真省錢的話,就需要好好控制cloud service。 例子1,如果大家熟識或願意使用github codespace或gitpod等全cloud IDE,Notebook只需要安全Browser就夠。所有IDE, VM都由github或gitpod提供,它們各自有各自的免費用量,也就是說,當大家真的不夠用又不想付費,可以兩著切換用。真的不夠用,就時租codespace 2G 每小時$0.18USD,約為每小時1.44MOP。 例子2,如果大家有自己Cloud VM,可以用VS Code SSH,除SSH的extension外,其他安裝及運行在VM中,對Notebook client的要求不高。Cloud VM品牌可以使用Digital Ocean、Linode等,2G機器價錢更低,每小時0.018USD左右,不過就要自己初始化各種工具。 一台高階的Notebook 這個方案可能就不需要再多解釋了,那就是你把家裏的核心電腦帶著到處走,一切都自給自足。在外的不可控因素可能就只有電量控制。另外一方面,長期的備份和維修成本也是需要考慮的。 輕便裝:一台中階大平板 跟上面的遊戲用PC掌機類似,不過螢幕更大,但缺點是配上鍵盤後,價錢比得上一台中階電腦,出門的重量也比得上電腦。在軟件上,你還必需要選擇Cloud VM,Local IDE也不一定有。所以在成本上來講,沒有很太優勢。大平板可能只對那些有專門APP需求的用戶有意義。 究極輕便裝,一台710寸入門平板 大平板最大的問題是價錢,但如果換成小平板,一切就不錯了,壞了也沒有那麼心痛。源用所有純Cloud解決方案。出門的負重最低,電量也最有保證。這是筆者最推薦的方案。 低成本高階機:遊戲用PC掌機 對,你沒有看錯,筆者指的是主打遊戲的PC掌機,也是筆者現時自己的最佳方案。假如你在工作室、家、公眾環境來回切換,很擔心傷到Notebook的話,那麼買台低成本的PC掌機絕對是可以接受。有些很重要的底層功能,需要多台Cloud VM,可能花費很高,所以還是需要經Local實現比較有性價比。 它最重主要的問題是螢幕小和沒有鍵盤,但這個程度,對比入門平板來講,其實都差不多。但它比平板有更強的CPU、RAM,作為移動核心電腦一定沒有錯。你還可以自由選擇Local VM、Cloud起VM。

【蔡司鏡頭加持】Nokia7 Plus 及 Nokia 6 !不可忽視的中階新機
手機‧電玩
Cheers!・2018-04-12

近年 Nokia 除了推出經典手機復刻版 3310 外,亦十分積極推出不同類別的手機。今次 Nokia 推出的 Nokia 7 Plus 及 Nokia 6 就主攻中階市場,想換平平哋又高質手機的你千祈咪錯過喇! Nokia 7 Plus 採用 6 吋 189 IPS屏幕,內建 Snapdragon 660 處理器,4GB RAM 64GB ROM;背面採用鋁合金機殼並設有指紋識別器,而3,800mAh 的電池容量更可達 2 日電池續航力,十分強勁!顏色方面則有雅瓷黑及雪瓷白可供選擇。 當中最大賣點就是配備蔡司光學認證的前後三鏡頭,分別是 2 個主鏡頭及前置鏡頭,雙主鏡頭具備 1,200 萬象素廣角及 1,300 萬畫素長焦鏡頭,前置鏡頭則有 1,600 萬象素,而內置的 Pro Camera 強化手動模式有簡易的設定介面,可調整各個高級的拍攝設定。 而一同發表的新一代 Nokia 6 則換上新的設計,功能上面更加升級,處理器由 Snapdragon 430 升級至 Snapdragon 630,內置 4GB RAM 64GB ROM 及採用一體成型鋁合金機身,而主鏡頭亦採用 1,600 萬象素蔡司光學認證鏡頭,前置鏡頭為 800 萬象素。電池容量為 3,000mAh,指紋識別器亦設在機身背後。Nokia 6 擁有夜霧黑及冷月銀兩色選擇。 lt;lt;出機小貼士gt;gt; 依家去 CTM 申請 4G 本地月費 $198 2GB,Nokia 7 Plus 上台機價 $680,New Nokia 6 上台機價 $0,仲免按金添!立即出機啦!

想試國産Linux Cloud Image ? 無問題Qemu快速幫到你
科技新知
MacauYeah・2026-01-21

不知道大家最近有沒有在考慮使用國産OS,如果有,大家又是怎樣做初步測試的呢 筆者之前一直都笨笨的從ISO開始安裝,所以每試不同的版本,都要從零開始。不但重複,OS安裝階段的複制過程也是很耗時的。但其實國産OS,大部份都有qcow2的格式,我們若只是本地測試的話,其實可以利用qcow2來做快速VM生成。 阿里aliyun 之前筆者有介紹過ubuntu的multipass,若你想試用的國産OS就是阿里aliyun,只要你有ubuntu,就可以快速跑起來。 但如果沒有ubuntu,只要有qemu(多平台),也是可以的。 qemusystemx86_64 cpu host machine type=q35,accel=kvm m 2048 nographic snapshot netdev id=net00,type=user,hostfwd=tcp222222 device virtionetpci,netdev=net00 drive if=virtio,format=qcow2,file=aliyun_3_x64_20G_nocloud_alibase_20251215.qcow2 drive if=virtio,format=raw,file=seed.img 上述指令中的qcow2和seed.img,階為官方網站可以下載的。預設帳號 alinux 密碼 aliyun。 seed.img是用於cloudinit的,就是初始化VM所用。第二次開機時,就不需要再使用seed.img qemusystemx86_64 cpu host machine type=q35,accel=kvm m 2048 nographic snapshot netdev id=net00,type=user,hostfwd=tcp222222 device virtionetpci,netdev=net00 drive if=virtio,format=qcow2,file=aliyun_3_x64_20G_nocloud_alibase_20251215.qcow2 華為OpenEuler 同樣地,我們也是用qemu可以跑起OpenEuler,只是它沒有seed.img(不支持cloud init),所以直接跑起就好。 qemusystemx86_64 cpu host machine type=q35,accel=kvm m 2048 nographic netdev id=net00,type=user,hostfwd=tcp222222 device virtionetpci,netdev=net00 drive if=virtio,format=qcow2,file=openEuler24.03LTSSP3x86_64.qcow2 預設帳號 root 密碼 openEuler12#$ 第二次開機,指令也是一樣。 龙蜥AnolisOS 方式也一樣。 qemusystemx86_64 cpu host machine type=q35,accel=kvm m 2048 nographic netdev id=net00,type=user,hostfwd=tcp222222 device virtionetpci,netdev=net00 drive if=virtio,format=qcow2,file=AnolisOS8.10x86_64ANCK.qcow2 預設帳號 anuser 密碼 anolisos 總結 如果只是要體驗一下國産OS,Qemu快速起VM就足夠。但Qemu本身只有NAT網絡,想要做VM之間的通訊,需要大量的學習成本。

為何 VueJS 除錯如此麻煩?
科技新知
MacauYeah・2025-11-04

前一次,筆者分享了VS code debugging frontend的好功能,也確實了coding anywhere並不是一個普通的notepad language server就可以解決的事。我們還要考慮如何debugging 除錯)的問題。 雖然筆者知道 vscode 可以解決問題,但為何 最原始的 nodejs debugger 不能解決問題。如果node debugger 不能解決問題,那麼 vscode 又做了什麼,它可以解決問題?經過一輪的實驗,筆者懷心疑,也許,強大的並不是 vscode 本身,而瀏覽器才真正的做到 debugger 的功能。而 vscode 只是以更方便的方式,重現那些結果。 為何 backend 的 debugger 不發揮作用? 筆者舉例,現時有一個 vue 3 專案,使用官方建議的方式生成 $ npm create vue@latest 這個專案,在開發模式下,會以 vite 架起一個端口為 5173 的伺服器,讓開發人員可以經過瀏覽器看到vue內容。筆者一直都認為,只要在 vite 的指令中插入 inspect 參數,一切就可以成功,就像 nodejs 一樣,只要在開始時加入參數就可以。結果當然是不行的。 經過對比 VueDevTools 的參考功能,筆者發現了一個出發點的問題。vite 其實是一個伺服器級的程式,也許它只是負責把所以 vue js 動態轉成常見 js,就像 webpack 一樣。我們想要設的中斷點,都不在它的程式上,所以 debug 參數也沒有用。實質,我們要加的中斷點,其實要在客戶端上,也就是瀏覽器上。那因此,VueDevTools 也不包括那些功能。它只是好好地記錄了每個 vue component 或 js 是如何被改寫的過程(就像被 webpack改寫的過程)。 官方又是用什麼來除錯的? 既然我們知道了問題所在,就要看看傳統的 javascript 又是如何除錯的。實際上,因為瀏覽器的配合,設立中斷點的功能,原來早就實現了。 httpsdeveloper.mozilla.orgenUSdocsWebJavaScriptReferenceStatementsdebugger 只要我們在任何 javascript 地方,插入 ldquo;debugger;rdquo; 這個神奇的字,瀏覽器就會在inspect模式下,自動產生中斷點。之後,你可以控制瀏覽器進行watch step into step over 功能。絕對比console.log更有意義。 在發現了這個方法之後,回去找vue3的官方文件,驚訝地發現,它就是提議用這種方式進行除錯。 httpsvuejs.orgguideextrasreactivityindepth.html#reactivitydebugging 未解之謎 雖然我們找到了設定中斷點的方式,但對於vscode是如何做到客戶端、伺服器端通用這件事,筆者還是沒有了解到。就以現在的知訊來看,很大機會就是vscode操控了瀏覽器的除錯模式,把所有資訊都回傳了vscode本身。這也是解譯了為何vscode在起動debugger時,必需要由vscode自己叫起瀏覽器。而codeserver這類雲IDE無法叫起本地瀏覽器,就造成它無法運用除錯功能的原因。 有與趣為codeserver一起搵解決方案的朋友,可以到筆者的 httpsgithub.commacauyeahAProgrammerPrepares ,以文字教學的方提交你的解決方案。 祝願大家可以早日實現coding 自由。

Swarm mode 上線 7 - load balancer | 反向代理 (2)
科技新知
MacauYeah・2025-07-18

前幾天,我們就使用traefik做了個最簡單的http反向代理。 做完上述的使用驗證後,我們可以正式開始看官方的例子,該例子加入了SSL,這就更充份地體現反向代理的用途。 官方教學連結 官方的yaml也很長,筆者實測了一個簡化版本。 services traefik image traefikv3.4 ports target 443 published 443 protocol tcp networks traefik_proxy volumes varrundocker.sockvarrundocker.sockro configs source dynamictls.yaml target dynamictls.yaml secrets source certslocal.key target certslocal.key source certslocal.crt target certslocal.crt command api.dashboard=true log.level=INFO accesslog=true quot;providers.file.filename=dynamictls.yamlquot; providers.swarm.exposedByDefault=false providers.swarm.network=traefik_proxy entrypoints.websecure.address=443 entrypoints.websecure.http.tls=true deploy replicas 1 placement constraints node.role==manager whoami image traefikwhoami networks traefik_proxy deploy labels quot;traefik.enable=truequot; quot;traefik.http.routers.whoami.rule=Host`whoami.swarm.localhost`quot; quot;traefik.http.routers.whoami.tls=truequot; traefik.http.services.whoami.loadbalancer.server.port=80 networks traefik_proxy name traefik_proxy driver overlay attachable true configs dynamictls.yaml file .dynamictls.yaml secrets certslocal.key file .certslocal.key certslocal.crt file .certslocal.crt 餘下的就照跟官方設定 生成cert file。(或大家有正式的證書,就可以免去這一步。) mkdir p certs openssl req x509 nodes days 365 newkey rsa2048 keyout certslocal.key out certslocal.crt subj quot;CN=.swarm.localhostquot; 指向cert的動態設定檔。 tls certificates certFile certslocal.crt keyFile certslocal.key 然後我們就可以這樣測試 curl v k H 'hostwhoami.swarm.localhost' 筆者在一開始時,始終無法設定 dyanmictls.yaml ,其實是筆者誤會了 traefik 的讀取方式。本個例子中,traefik 其實會動態讀取 swarm 及 file provider 的設置,而dyanmictls.yaml是經過file provider的方式生效。也就是 traefikssl.yaml 中的quot;providers.file.filename=dynamictls.yamlquot;。 本個例子與官方例子最大的不同,是官方的cert, tls, 是直接使用bind mount的方式存取,如果你有多過一個manager,這個方式不太有效。本文就用了swarm config及swarm secret,方便多個manager自動配置。不過swarm config及swarm secret都有個缺點,若要更新它們的內容,就必需要重命名(例如dynamictls.yaml=gt; dynamictls.yaml2) ,否則swarm不允許發佈。 完整 yaml 請見 github

Github copliot vs Intellij IDEA ultimate
科技新知
MacauYeah・2025-02-18

github copliot 最近正式開放每月限量免費使用,只要有github 帳號,就可以經過vscode copliot plugin,向 github copliot 交互式生成程式碼,又或是經 copliot 提供 code completion。大家會不會想過,加了github copliot的vscode,是不是效率暴升,可以跟傳統的付費IDE 例如intellij 的IDEA ultimate版本平起平坐? 流暢度明顯提高 是的,在生成程式碼方面,特別是code completion,在開啟copilot之後,實在好太多了。筆者長期寫java,vscode 原生的 java code completion,實在太陽春。java class name都很長,而且是強型別,很多時候都要完整打出class name。但大部份時候,筆者都要打很多個字之後,vscode才猜到你想打什麼,再給你可能的code completion,但這樣一來你也快打完了,幫助不大。要麼就是自己複制貼上,要麼就自己全拼出來。 在開了github copilot之後,在空行開始時,它就會開始猜你的意途,在打幾個字母以後,它雖然會頓一頓,但總在筆者跳去其他部份複制class name之前,就給出更新結果,實在省心太多。但猜測始終是猜測,大部份時候還是邊打邊修正。不過code completion方面,已經是追得上intellij,有些時候更是超越了intellij。例如我們有時寫 javascript 時,需要做多語言顯示,我們需要為每個語言設定一份i18n的翻譯。copilot 在這方面也能幫到忙,它會自動推薦可能的翻譯,你連問都不用問,這些功能,都不是 intellij 的本地運算會有的支援。 另一個要提提的是 copilot chat,它跟大家平時使用 chatgpt 程式碼生成的方面類似,只是它可以直接在vscode的某個檔裏直接交換生成程式碼。不過生成的品質都很一般,很初階的事可以做,深一點的就不懂。例如你很常寫java,但突然要寫javascript,有些javascript的array操作你懶得查,這時你可以叫copilot chat幫你生成。但若果你今日使用 javascript 框架,有一些 vuejs 或 reactjs 的結構參數傳遞你不太了解,你想找copilot chat,那就幫助不太。它依然可以生成一些程式碼,但對你碰釘的地方沒有修正意義。你還是需要自行從官方文件較對、研究Stack overflow中相似問題的解決方案。就跟chatgpt差不多。當然這些不是傳統IDE可以給你的。但如果現今對比的是收費的copilot chat和本地免費的ollama qwen2.5coder,copilot chat就沒有太大性價比。 可以作為付費IDE的平替嗎 如果我們拿vscode github copilot 跟 intellij IDEA ultimate來比較,前者入門價錢是120美元一年,後者入門則是169美元次年續期有優惠,但到了第三年才會比 github copilot便宜。單看價錢的話,github copilot的確比較便宜。想省點錢,github copliot絕對是一個可以考慮的選擇。但除了錢以外,或者我們還要考慮一些其他因素。 公司立場上,介不介意你的IDE上傳資料到cloud service上面? 付費IDE的除錯功能、多環境整合、程式碼品質分析,這些關係到長期維護,非程式碼生成部份,是不是可以忽略不計。 筆者在開發開源的程式,長期都使用vscdoe,在配上 github copilot 後,明顯覺得它提升了 vscode 的流暢度。但相對實際工作上,筆者還是會集中使用 intellij IDEA ultimate 。因為即使vscode 有明顯改善,但日常碰到的問題更多不是在生成部份,而是解決那些似是而非的程式碼結構陷阱,這方面還是intellij 更幫到忙。當然stack overflow和其他網路資源才是真正的救命靈藥。

Git 歴史修正
科技新知
MacauYeah・2024-10-29

有時候,我們修正一系統檔案,例如某個commit中,多了一個不該放的檔案,又或者想修改該commit的作者,我們就要追搜到某個commit,然後用rebase隨個改。 例如本次repo,有一個githubAction.md,因為錯誤原因,被加到了main中,也藏了很久。如果我們想連根拔起,我們需要加出它第一次出現的commit。 $ git log githubAction.md commit 60ccd70f6b768138cbe23c93ffcfa32574ce895c 那我們就以它前一個commit作為rebase的根據,進行逐個commit修正。 $ git rebase i 60ccd70f6b768138cbe23c93ffcfa32574ce895c pick 60ccd70 draft some content pick e2ee9a3 add some senario. pick b91afc1 refine submodule; pick 98cd366 add notes about submodule specific checkout; pick 064b06f test directly commit in submodule main pick 7b648d2 update git submodules notes pick 556f25e add notes about merge timing pick 5244804 Create gitcontinuousintegrationstrategy.md pick 107e486 add more pratical nodes about ci; pick d93cbee add mono repo challenge pick 1c471b6 add worktree notes pick 9063ccb notes about different of git flow and github flow; pick b72e89e Update githubflow.md, add ref more link pick 0b8f2a9 draft github flow release problem pick 8b333fc finalize github flow release strategy 在rabase選項中,把需要改的commit由pick改為edit。rebase會以舊到新顯示。然後儲存。例如 edit 60ccd70 draft some content edit e2ee9a3 add some senario. edit b91afc1 refine submodule; pick 98cd366 add notes about submodule specific checkout; pick 064b06f test directly commit in submodule main pick 7b648d2 update git submodules notes pick 556f25e add notes about merge timing pick 5244804 Create gitcontinuousintegrationstrategy.md pick 107e486 add more pratical nodes about ci; pick d93cbee add mono repo challenge pick 1c471b6 add worktree notes pick 9063ccb notes about different of git flow and github flow; pick b72e89e Update githubflow.md, add ref more link pick 0b8f2a9 draft github flow release problem pick 8b333fc finalize github flow release strategy 我們第一次會在60ccd70,我們作出想要的改動,然後經amend去改掉60ccd70 $ rm githubAction.md $ git add u $ git commit amend author=quot;newuser quot; 確定無誤的話,就可以去下一步,即是到了e2ee9a3 $ git rebase continue 因為已經rebase過,你此時看到的不會再是hash不再是e2ee9a3,而是自動rebase完的e2ee9a3。若大家有東西要改,就使用commit amend。如果沒有東西要改,也沒有conflict,可以繼續rebase continue下去。

Ceph Storage 水很深
科技新知
MacauYeah・2024-09-25

筆者不才,早前為大家介紹了一篇關於Ceph Storage的最入門安裝教學。但在後續測試中,發現了一些概念上的問題,需要盡早說明,不然就會像筆者一樣,要砍掉重來很多次。 OSD HDD Ceph Storage的主要功能,就是為Contiainer提供外置儲存空間,它對儲存空間有特定的要求。我們最好在建立ceph clustercephadm bootstrap之前,就為每個node上增加合適的HDD 引述官方說明 OSD Object Storage Daemons The device must have no partitions. The device must not have any LVM state. The device must not be mounted. The device must not contain a file system. The device must not contain a Ceph BlueStore OSD. The device must be larger than 5 GB. 簡而言之,大家需要準備新的HDD,不要做任何格式化,讓OS見到HDD但不作任何操作。筆者試過,使用hyperv VM hyperv HDD,也是可以做到的。不過之前筆者於教學中用的 multipass 就沒有這個模擬HDD功能,我們需要使用比較強大的VM作為實驗。 若然HDD是在ceph clustercephadm bootstrap建立之前,就存在的。我們可以經過ceph的網頁介面,或經指令自動加入。 ceph orch apply osd allavailabledevices 若然HDD是在ceph clustercephadm bootstrap建立之後,才加入的。那麼ceph有機會沒法自動發現它,筆者當前的dev版本就出現這問題。我們就需要經指令手動增加 ceph orch daemon add osd NODENAMEdevsdb OSD 官方說明文件 httpsdocs.ceph.comenreefcephadmservicesosd#cephadmdeployosds Reset 在我們做實驗時,若我們想回復到上一個狀態,測試不同的參數差異,Ceph指令並不會即時執行。例如前一句的add osd,想倒回來自行刪掉一些osd,即 ceph orch osd rm OSDID 它就會排隊慢慢做刪除。 但這個過程筆者未有成功過,OSD一直處於繁忙狀態。有機會是因為系統需要保持同步狀態,待成功遷移資料前,什麼都不能動,所以一直都在待刪除的狀態中。 同樣地,當我們想要刪除一些node時,我們使用以下指令 ceph orch host drain NODENAME ceph orch host rm NODENAME 最後也是會卡在刪除OSD的情況 Removing Hosts 官方說明文件 httpsdocs.ceph.comenreefcephadmhostmanagement Static IP 因為 container 技術,很多都需要固定 IP ,我們做實驗之前,最好先了解你的VM engine如果提供Static ip 。以 hyperv 建立的 VM ,其實可以同時建立兩張網卡的,一張為預設網卡,用於連網用,另一張則設定為內部網絡。在安裝 ceph 時,經 cephadm bootstrap 所引用的IP則設定為內部網絡的IP。之後基本上使用任何一張網卡的 ip ,也可以訪問到cephadm的網頁介面。如果不是在一開始的階段上準備Static IP ,我們又會在重設解綁cluster時,同樣因為機器繁忙而卡在不上不下的狀況。

Coding | Test Case 值得寫嗎?
科技新知
MacauYeah・2023-11-02

很多做軟件開發的朋友,其實都會聽過Testdriven的開發模式。就像Scrum一樣,名氣很高,但試過的人很少。為何會這樣呢?筆者認為,並非開發者懶,而是編寫Test Case的難度真的高。對比開發程式本身的成本,寫Test Case的時間學習成本一樣高。 造成這些高成本的原因很多。一來是因為開發者並不像過往一樣,慢慢從零寫程式,一般都應用Framework去預構建一些東西,例如打包Database connection pool,Dependency injection。Framework是好用的,但就令你要模擬Mock up特定資源,變得越來越複雜。所以一般中、小型開發,都鮮有人懂得做Test Case除了大神獨立開發者外。筆者對於Spring boot等Framework,都摸索了很久,才能模擬一些特定資源。但Framework一更新,就很多部份都要重寫。所以筆者沒有很強調要做Test Case,因為成本認真大。 最近,在摸清一些test case 基本concept後,筆者又重新開始嘗試編寫test case。以下假設用的是object oriented programming 在開發自己的class,為每個public function,都寫test case。很多IDE, 都有提供相關自動生成test case function signature的功能(就是為你的目標function,起一個只有外框的test function。)vscode雖然不是原生支援java,但只安裝基本的java test package,就可以達到同樣效果。 在不依靠framework的情況下,自己class要『引用』的其他class object,不要經過自己使用new來生成object。全部經set function來傳入你要引用的class object。除非你的class是作為Factory Pattern(工商模式)生產某些object,不然你就不會再有new字眼。 在為自己class編寫test case時,就會可以模擬被『引用』Object的行為。這個object在傳統上可以使用oop中的interface類型來達到模擬又不會影響到原結構的做法。實在不想做interface,java還可以用mackito 這個libraray來硬改Object的行為。 同理,自己class要『引用』一些外部資源,那些設定資源的config,都應該要set function傳入。這樣你在test case中才能起一個臨時的模擬外部資源。 在不使用framework的情況,要全數去自行模擬,當然很痛苦,但至少你可以做一些很簡單的測試。 在使用framework的情況下,還有些教學都是教你mockito繼續模疑。但這會是很痛苦的,因為這樣叫做unit test,單元測試,你要模擬所有東西。在折衷的情況下,應該底層元件做unit test,但上層的元件就做integration test,整合測試。 在做integration test時,就差不多等同使用framework行起部份或必要的資源。而那些必要資源,可能指是的database service, network service。我們可以在test case中設立不同的config,從而把framework指向一些備用資源。 Database好貴,腦細不會付錢set up多一套,自己電腦不夠強,也不能跑起多個開發用Database。好在還有h2 database可以幫你,它是memory可以操作的。只要你的framework支緩就好。在初次使用Framework時,你總會覺得為何Database層要設得這些抽像,其實為的就是讓你可以隨時換Database。不論做測試還是做移植,都會少很多問題。 模擬Network service還是沒有銀彈,要麼就mockito硬改行為,要麼就是提供一套測試用service。筆者曾經為模擬別人的Network Http API,也花了相當時間自己建立dummy server,提供模擬效果。無論dummy的效果有多假,有多局限,例如if id == 1,always return true,也是有一定價值。當你做source code refactoring (重構),又或是做framework升級時,還是讓你可以安心一點。

Git Submodule
科技新知
MacauYeah・2023-09-15

Git Submodule 初次實務上使用submodule來同時管理幾個project的更新。如果有任何理解上的錯誤,請在github中提issue或pull request。 Why Submodule 假設你的團隊中有三個人,A君做A Project,B君做B Project,C君做Main Project。如果可以,A,B各提供已編譯的Binary或Library,給C君直接使用就最好。 但要做到好好管理,A,B都要有自己的發佈系統,即是把Binary上傳到某個分享Repo中,這樣C君就能有條理地通過IDE或Compile工具下載對應的版本。如果是javascript,Repo可能就是npm repo,如果是java,可能就是maven repo。這亦代表A,B君對程式編譯、打包、版本命名等都要很熟悉,不能一輩子都命名為v1.0.0。 如果團隊對這些都不熟悉,C君還有什麼方法呢其實靠著Submodule的功能,C君也可以硬把A,B的Source code取出,做最後打包。 這跟A、B君自己把source code壓縮然後Email寄給C君是有不同的。因為這樣C君並不清楚A,B的git脈絡:C君需要自己做好A、B的版本記錄。想要只回滾A,B的版本普不容易。但經過git Submodule後,C君可以清楚知道現在正使用的是A、B的那一個commit版本。假如有一天,A、B、C三個都更新了,但發現合起來時就跑不動。C君可以保持A、C的版本不變,單獨提取B的某個版本進行測試。當然,你可以說原本Email也可以這樣管理,但始終你不清楚B的版本記錄,Email的日期並不代表Source Code的進度。因為有時候,Bug Fix是針對舊版本的做更新,新功能的Email日期反而比Bug Fix要早 同理,如果大家要連結多個沒有發佈系統的文字資料,也可以利用Submodule。例如筆者正在編輯一本書,當中不同的主題,就是使用Submodule的功能串連起。 Command 馬上看來來Submodule可以怎樣做。 假設你已經知道git 怎樣用,也起了git repo。假設你是C君,進入你的本機repo資料夾內,使用submodule參數。 上面的效果,就是把C君當前repo的狀態,連結到B君submodule當時預設分枝default branch的最後一個commit 中。然後C君在自己的repo怎樣更新,它引用到B君的submodule版本都不會變。 直到某一刻,B君說他加了一個穩定的新功能,請C也連帶更新一下。C君也做好自己的準備後,使用submodule參數進行更新。 注意,如果C君有多於一個submodule,上述指令會全部一口氣更新。另外,如果你覺得B君的最新版本不能用,還是可以針對B君取得特定的版本。

Git Co-Work Flow
科技新知
MacauYeah・2023-06-23

Git CoWork Flow 雖然git面世已很久,但相當一部份澳門朋友都是solo man,很少合作寫code,對git branch始終都有些恐懼。所以這次來解召一個基本原則,至少你不會爛了code救不回來。 若然大家未熟悉git,初次利用git合作寫program,請盡量減少使用共同分支branch,可以極大地減少問題。 第一個大原則 建立一條自己分支 在一個repo中,為自己建立一條分支branch,可以減少Remote repo中有人比你先commit,而令你push失敗的情況。 Code block由於安全性問題,沒有獨立寫了LifeMag 網誌中,請移到github repo。 除非你的隊友故意你用的分支名先commit,又或者你自己有幾台電腦,幾台一起做改動。不然push 應該不會有問題。 第二個大原則 用fetch取代pull 很多人在取用Remote Repo的更新時,都會使用pull。但pull其實是fetch及merge的混合,而且merge還要考慮source branch是那條分支的問題,若然大家都有一條獨立branch,那麼這個無腦pull並不存於每人只有一台電腦下的多人協作中。 fetch的過程中,還可以加入參數prune,順便依照Remote Repo的指示,同步刪掉本機中一些不再存在的originbranch。 Code block由於安全性問題,沒有獨立寫了LifeMag 網誌中,請移到github repo。 第三個大原則 Merge前先Commit 經過前述fetch後,其實他人的改動並未加入自己的分支中,必需經過merge才會出現。但並不是沒有conflict就無腦merge。 假若自己有改動,未commit,應該老虎蟹都先commit。這是為了在merge後,還有機會可以無腦reset,回到之前那個commit。這就像是做任何更新前,先做backup。 Code block由於安全性問題,沒有獨立寫了LifeMag 網誌中,請移到github repo。 第四個大原則 由某個特定的人來管理master或main branch main branch以前叫master branch,是他人下載時的預設分支,也是Github、Gitlab的預設顯示分支。所以該分支存放著的source code,應該在代表信心度比較高。 在協作的環境中,每人都有自己分支,那就代表要有一位人員做管理,他負責checkout main, 然後合併其他已驗證的分支。 Code block由於安全性問題,沒有獨立寫了LifeMag 網誌中,請移到github repo。 在某些比較嚴僅的環境中例如Github、Gitlab,main分支可能會被系統機制鎖定,必需通過系統內鍵的Pull Request,才能通過審核,合併到main。另外,也有一些關於開發上的Git workflow,主要針對功能管理、版本發佈、錯誤修正等控制。有機會再為大家介紹。 希望以上的流程,可以有效且容易地讓大家協作。如果有任何command錯誤或更新,都可以經Github Pull Request通知筆者。