搜尋

搜尋結果

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

重入膠坑 10|JMS(集模社)的馬克兔作品分享
手機‧電玩
MacauYeah・2025-06-26

回鍋模型制作已經好一段時間,亦做了不少的嘗試。但如果大家覺得新嘗試有點怕怕,可以試一試以國産KO(高仿)作為實驗對像。 筆者並不支持KO,因為質量真的有差,但以練手的角度出發,要做很多白老鼠實驗,那麼KO的價錢絕對是一個合適的選擇。可能有朋友會問,做實驗為何不使用廢件?廢件做一些基本實驗是可以的,例如切削、顔料,使用單件就可以做到。但如果要做流程實驗,廢件很難折開重來。比例實在的,還是從零剪件容易一點。實驗的流程可能是板噴、局部取件、打磨+刻線+滲線等。 筆者最近就開了一盒 JMS(集模社)的馬克兔 21世紀配色,主要試一下加深刻線+打磨+滲線配色+水貼的流程。 先上作品圖 外貎很可以 工具 刻線:0.15刻線刀 打磨:400 600 800砂紙、陶瓷推刀 滲線液:田宮滲線液 水貼:KO自帶的水貼 流程 因為水貼原因,原本有打算用司特力的水性滲線液,但在個別區域試過後,就知道會被水貼的水引流的問題,所以馬上改回田宮的琺瑯滲線液。 加深刻線部份,想少錯,就用刻線膠帶,不然出界就要用打磨的方式修正。筆者就懶得貼,所以不少地方都有打磨的痕跡。修正時,感覺上先用推刀刮,再使用600、800號砂紙打磨,後期再消光漆,就已經足夠。有些地方,什至只用推刀,感覺上差異也不大。 滲線液的部份,本次試用黑色,作為大反差配色。個人覺得在馬克兔 21世紀下,效果配色不差,可以跟軀幹部份相對應。 至於JMS品質,真的是練手的好選擇,組合度OK。但我們不能要求關強度,對把玩有要求的朋友請勿嘗試。

重入膠坑6-補色地獄
手機‧電玩
MacauYeah・2025-03-23

之前筆者就有介紹過水性馬克筆補色、滲線,對於有一直砌開最新HG、MG的朋友來講,只需要考慮滲線就夠。但對於一些便宜價位的入門級的HG或SDEX模型,補色就更重要,因為它們的成型色大都只有兩至三種,即使套件中有提供補色貼紙,亦無法函蓋所有部位。筆者最近做的一款舊HG能天使及SDEX巴巴托期天狼座就是如些。 你所需要的是一套足夠便宜的平替 之前筆者亦介紹過【迪斯派】的模型專用的水性馬克筆,但對於這麼大量的補色,迪斯派的單價也是相當讓人心痛。最近筆者就發現到另一款更便宜的平替品,【多樂繪直液式丙烯馬克筆】。筆者寫稿當天,非金屬色中,也是45.8RMB 24色,72.8RMB 48色。相對於6.9一支的迪斯派非金屬色,多樂繪很便宜,顏色選擇也很多。 多樂繪亦提供散裝購買,7.9RMB 自選三支非金屬色,即是2.64一支。如果大家不想一次過全部購買24色,可以參考筆者以下型號 配合區部重塗 600白色, 603黃色, 608藍色, 622淺灰, 680深灰, 664紅色。上述與萬代的成型色還是會有色差,但相對不太明顯。其中600白色, 603黃色,遮蓋力較差,需要多次重塗以便發色。 還有一些筆者用到但不是通用色,628天藍色?,642海軍藍? 使用效果 筆者在塗裝部份只是處於基本補色要求,沒有試過混色、疊色、過渡等高階用法。對比迪斯派,多樂繪的感覺真的差不多。 操作 使用前先搖一搖筆身,拔蓋就用。 上色前需要打磨嗎 對於白色、黃色等,先打磨模型表面,有助加強附著力。但白色始終難發色,也要多次重塗。深色的不用打磨表現也很好。 易刮漆嗎 易刮,所以要留意邊角位。完成補色後記得上保護漆,上保護漆之前也記得再檢查一遍。 遇到的最大問題 多樂繪的黑色出墨過快,難以控制影響範圍,因為顏色太深,事後也很難清潔。但其他顏色未有出墨過快的問題,未知是否個別事件。另外筆者亦未試過傳統的水性消色筆,都一律以酒精或牙籤清理錯處,暫時無需使用專用消色筆多樂繪可能也沒有消色筆。 迪斯派比多樂繪做得更好的可能是出墨的部份,它不需要搖筆身,也有正常的顏色表現。但迪斯派的顏色選擇很少,灰色、藍色與萬代的成型色很不協調,小部份補色也很顯眼。筆者認為它最大的問題是缺少深灰色,這是萬代很多內構的常用色,再加上多樂繪價錢便宜一大截,一口氣買幾次回來粗用回本。 如果大家有發現一些更細微的分別,歡迎隨時留言交留。

重入膠坑5 | 堆積變山積,山積有辦法解決嗎?
手機‧電玩
MacauYeah・2025-02-20

針對大標題的問題,先講結論,堆積是沒法完全避免的,但我們應該有條件防止堆積變成山積大量堆積。 堆積不可避免的原因 以前筆者一直是玩遊戲多,面對特價節日買多了的現像,直到PS4後期,都還會有這個問題出現。但在過渡到PS5早期,就不再有這個問題。因為數位遊戲必定是越賣越便宜,除了機器壞、停產的問題,基本上不會有所謂的錯過好遊戲的問題。不同平台,每年都有節日特價,急玩頂多也就原價買入,能等就一定會有好價錢。 但模型可不一樣,實體商品都有限量的問題,首發一定貴,再販之後會回落到正常價,但再過一期就不一定有現貨。所以大家的策略一般是先買入自己認為不錯的新貨特價品,以免後來買不到,即使山積也會照買。不過問題就是當年紀越來越大,又或是對制作越來越有要求,作業的速度就會越來越慢,然後山積就會越來越嚴重。 改變一下心態 首先這裏不討論成品玩具的山積問題,因為成品玩具至少可以折價出讓,只要夠捨得,想清貨一般都有市場。這裏講的山積問題主要是針對拼裝模型部份,針對那些要自己出手,慢慢一件件加工的玩具。 最初,我們可能很想完美地砌完一台模型,打磨、上色、擺拍。但因為一些技術問題,例如因為損毀要另行修復、制作難度、天氣問題、家庭問題,令大家的進度一直無法向前。久而久之,就會更無心情去完成作品,食之無味,棄之可惜。 面對這個問題,我們可以考慮放過自己,其實不一定要完美制作才能體現樂趣。素組,AA膠強行修復,遮醜,拍攝區部特寫,也可以一定程度的避重就輕地跳過有問題的部份。 貴精不貴多 由少量堆積變成山積主要的原因源自於【不想錯過】,但對於長遠目標來講,山積可能意義不大。 如果我們的目標是收藏,我們會想精制,而面對可能損毀的風險,雙入更具意義。所以不同時期山積多款模型,就變得沒有對沖意義。 如果我們的目標是重複把玩,我們可能更在意空間收納的方便性。若山積的話對於怎樣找模型,絕對是一個阻礙。舊模可能需要搬去一個更隱閉的地方,但這樣亦代表不再把玩,所以堆積也沒有價值。 重新定義如何斷捨離 回到本文最初的結論,堆積,或者叫作團貨,是沒法完全避免的。主要因為商品可取得性問題,再加上對珍品的不捨,一定量的堆積是必定會出現的。但我們可知道,物品始終都會老化或損壞,亦即是有保質期的問題,堆積不代表可以永久擁有。有些我們無法完成、修復的作品,就只好換個形式儲存,例如變成改件作為下一個作品的配件使用,又或是送出給下一位有緣人。新品購入時,亦要評估保質時間,自己是否可以在指定時間內開封體驗,免得錯過最佳觀賞時間。

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和其他網路資源才是真正的救命靈藥。

steam deck 辦公用途工具資訊 2024/12更新
科技新知
MacauYeah・2024-12-17

購入steam deck 已經有一年多的時間,之前亦發過一些安裝教學。適逢筆者系統重裝,又有機會重新檢視工具的可用性。 Podman Distrobox 一項很重要的更新,Steam OS已經有預安裝podman,不需要經home brew安裝。但預裝的podman 沒有內置DNS,可能會對K8S等進階應用有影響,不過筆者只作為單機測試用,普通的podman compose沒有問題。 另一項很重要的更新,就是 distrobox,它可以經 podman 讓大家方便地執行不同的 linux 版本,想在Steam OS上使用Ubuntu?沒問題,開箱即用;想用VScode官方維護版本,沒問題,安裝指定Linux再按裝VScode就好。 詳見上一期的介紹。Steam OS 3.5更新,內建 podman, distrobox 中文輸入法 我們不需要再安裝Fcitx5 Rime,如果大家在遊戲模式下,已經設定好中文輸入法,那麼在輸到桌面模式下,照樣以Steam Button X Button的方式,打開內鍵輸入法。你會見到有虛擬鍵盤彈出,它會覆寫桌面模式的。此時,即使你關掉虛擬鍵盤,並用實體鍵盤,中文輸入法都會保留。不過大家要確認,彈出當下必需要是【中文】。 若然你彈出的虛擬鍵盤是英文,請按【地球】轉換到【中文】後,關掉虛擬鍵盤,再重來一次重按Steam Button X Button,確保彈出的時候是經【中文】覆寫。 Discovery Discovery 是 Steam OS 預設用來安裝第三方程式的地方,它經 flathub flatpak 存取程式。但筆者一定要先強調,它提供的第三方程式,並不一定會得到原開發者的支援,它屬於打包移植之類。 例如 flathub 中可以找到 Google Chrome httpsflathub.orgappscom.google.Chrome ,但它實際是經過一個github 專案移植過去的 httpsgithub.comflathubcom.google.Chrome。它有提供持續更新,但筆者不保證當中有沒有任何被植入過任何不正當軟件。 相反,flathub中有一些程式是經過原開發者支援的,例如 Firefox httpssupport.mozilla.orgenUSkbinstallfirefoxlinux, Gnome Boxes httpsgitlab.gnome.orgGNOMEgnomeboxes, Gimp httpswww.gimp.orgdownloads ,這類可以比較放心使用。 筆者過去使用 Discovery ,的確有遇到一些權限問題,但最後估計應該是筆者安裝 Homebrew 所影響。筆者在重裝 Steam OS 後,直接使用 Discovery,就沒有問題。過去需要經 Homebrew 安裝的東西,現在經 podman , distrobox 或 Gnome boxes 就可以了,不再需要經Homebrew去折騰一輪。而且Homebrew也不是萬能的,因為Steam OS有限制一些套件的事用,即使安裝Homebrew也解決不了。若想要完全開放套件限制或解決依賴問題,還不如直接開啟Steam OS覆寫權限,轉用Arch Linux的安裝包。

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下去。

Docker Tag 命名
科技新知
MacauYeah・2024-10-24

一般來講,同一個docker image會提供多個不同的版本,每個版本會附予不同的tag,以作標識。但以docker image的維護者來講,它的tag通常代表的是自己程式的版本號。不過這個版本號卻存在很多變數,就讓筆者好好地逐一說明。 程式的版本號 在沒有Docker的年代,其實所有軟件在發佈時,都會標示版本號,方便使用方明確追蹤問題,自行選擇升級、降級以解決相容性問題。大家要重現問題,也能清清楚地重現。所以docker image的tag,在某程度,都是代表發佈自己的程式版本號。但以前的年代,軟件底層的依賴,例如OS層面的共享程式庫,則不在發佈的管控中,所以過去的程式,在跨電腦安裝時,都會出現缺少某些共享庫的問題。而使用了Docker後,image以內的共享庫的都會在打包的那一刻固定和發佈,就不會有漏的問題。 庫更新,怎麼辦 上面說到image可以打包共享庫,但問題是共享庫也會有安全性更新問題,那麼對docker image的維護者來講,它自己的tag又該如何命名? 因為庫的量可大可少,所以一般來說,都不可能完全把各個庫的版本號寫在自己的tag上。退而求其次,就是用quot;版本號日期quot;,庫的細版本號,就存在原始碼當中。Ubuntu 就是這樣的例子。 不過quot;版本號日期quot;的命名方式真的方便嗎?每次下遊用戶想更新去最近版本,都要自己找一次最近的日期。這樣對很多用戶來講都不夠方便。所以docker又提供了一個重tag的功能。例如ubuntunoble,在早些時候指著noble20240904.1,然後過幾天,又指向更新的noble20241009。更常見的是latest,每次image都預設會存在,docker也希望大家會定期更新這個tag,讓大家可以更易地找到最新版本。 註 這跟git tag有所不同,git tag並不預期會變的。當協作者收到tag後,那怕上遊刻意更新tag指針,協作者沒有刪除原tag之前,都不會知道tag更新去了哪裏。 我們該如何選 在發佈方和引用方來講,引用時可以明確使用唯一的quot;版本號日期quot;,對穩定性來講是有意義的。不過多多少少,會產生額外的時間成本。發佈方來說,就是多用了一些儲存空間,方便引用方可以隨時找到舊庫版本。而引用方,就要手動修改引用號,作為驗收依據,自動更新的難度比較大。 但對於自動更新要求比較大的情況下,可能就是使用latest或者會隨時更新的share tag共用tag比較實際。但我們也依然要定一些方式去版本更新記錄,例如:同時使用 beta latest archive 每日自動更新beta,只有所有測試都通過時,才把archive指向現在的latest,再把latest指向現在的beta。這樣做的好處是,核心的docker stack檔案改變的機會較少,也可以免除docker swarm做太細緻的權限管理。

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時,同樣因為機器繁忙而卡在不上不下的狀況。

全球教育新點子:結合未來技能與傳統教學的力量
文化創意
陳康妮・2024-05-24

全球教育新點子:結合未來技能與傳統教學的力量 在當今這個快速變化的世界中,教育不僅僅是知識的傳遞,更是技能和能力的培養。澳門教育家陳康妮認為,未來技能教育應該成為全球教育的核心,這包括批判性思考、創造力、協作和溝通能力等。然而,隨著教育科技的發展,我們也必須認識到聯合國教科文組織(Unesco)所強調的,即線上教學永遠不能取代老師的面對面指導。 未來技能教育的重要性 未來技能教育的目標是為學生提供在21世紀社會和職場中成功所需的技能。這些技能包括: 批判性思考:能夠分析問題,提出解決方案。 創造力:在面對挑戰時能夠想出創新的方法。 協作:與他人共同工作,達成共同目標。 溝通:清晰地表達想法,並有效地聆聽他人。 線上教學與傳統教學的結合 雖然線上教學提供了靈活性和可訪問性,但它不能完全取代傳統教學。老師的面對面指導對於學生的情感發展和社交技能至關重要。因此,我們需要一個結合了線上教學和傳統教學的混合模式,這樣學生既可以利用科技的便利,也能從老師那裡獲得必要的指導和支持。 實施策略 為了實現這一教育新點子,我們需要以下幾個策略: 教師培訓:提供教師培訓,使他們能夠有效地結合線上教學和傳統教學。 技術整合:在課堂上整合最新的教育科技,以增強學習體驗。 課程設計:設計以未來技能為中心的課程,並確保這些技能能夠在真實世界中得到應用。 評估改革:改革評估方法,以衡量學生在未來技能上的進步。 這些關鍵技能將幫助澳門的學生在競爭激烈的世界中脫穎而出,為他們的未來鋪平道路。澳門教育應該不斷進步,以適應不斷變化的需求,並為學生提供最佳的教育體驗。

軟件發行也需要維修基金?
手機‧電玩
MacauYeah・2024-05-13

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

斷捨離與市民免費分享二手物品
文化創意
陳康妮・2024-01-30

2024年1月24日 星報 【特訊】澳門斷捨離學會義工隊在過去的兩年裡,每週三積極走進社區,致力於共享二手物品,並免費提供給澳門市民所需。這項義工活動不僅為社區帶來了便利,同時也推動了環保理念的普及和可持續發展。 斷捨離運動在全球范圍內逐漸興起,其核心理念是減少過度消費和浪費,以達到心靈實踐和環境保護的目標。澳門斷捨離學會義工隊的成立,旨在將這一理念引入澳門社區,並積極推動實踐。義工隊的成員來自各個年齡段和職業背景,他們自發組織起來,共同參與這一有意義的活動。每週三,他們將收集到的二手物品攜帶至社區,並在指定地點設立臨時的共享物品站。這些物品包括衣物、書籍、家居用品和玩具等,涵蓋了市民日常生活的各個方面。 在共享物品站開放的時間內,澳門市民可以前來選擇所需物品,並免費獲得。這不僅為市民提供了一個便利的渠道,解決了他們對於一些日常用品的需求,同時也減少了浪費和資源的消耗。義工隊的成員不僅提供物品,還積極開展環保宣傳和教育活動。他們在現場向市民講解斷捨離的理念和方法,提供有關環保和可持續發展的資訊,鼓勵大家共同參與環保行動,共同為澳門的可持續發展出一份力。 在過去的兩年中,澳門斷捨離學會義工隊的活動取得了顯著的成果。越來越多的市民參與其中,共享物品站也逐漸成為了社區的一個重要組成部分。這項活動不僅為社區帶來了實質的幫助,同時也推動了澳門社會對環保和可持續發展的關注。 澳門斷捨離學會義工隊表示,他們將繼續努力,為社區居民提供更多的幫助和支持。他們希望通過這項活動的持續開展,進一步普及斷捨離的理念,促進澳門社會的可持續發展,讓更多的人受益以上是一篇關於澳門斷捨離學會義工隊每週三走進社區共享二手物品免費分享澳門市民所需的新聞稿,總字數為1500字。新聞稿介紹了該義工隊的成立背景和目的,以及他們在社區共享物品和推廣環保理念方面所做的努力。同時,強調了這項活動對於社區和環境的正面影響,並表達了義工隊將繼續努力的承諾。

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升級時,還是讓你可以安心一點。

斷捨離與個人成長之關係 放下過去創造自己的未來
文化創意
陳康妮・2023-10-19

你是否曾經感到自己的生活太過複雜和混亂?你是否曾經想要擺脫過去的陰影和束縛?你是否曾經渴望自己的未來更加明亮和美好?如果你有這些想法,那麼你可能需要嘗試一種叫做斷捨離的方法。 斷捨離是一種簡化生活的方法,意思是斷絕不必要的東西,捨棄多餘的物品,離開對自己不利的環境。斷捨離不僅可以讓我們的空間更寬敞、整潔,也可以讓我們的心靈更清爽、自由。斷捨離可以幫助我們減少壓力、提高效率、增加幸福感 斷捨離也可以促進我們的個人成長,尤其是與我們的原生家庭有關的成長。原生家庭是指我們出生和成長的家庭,它對我們的性格、價值觀、信念、行為等有很大的影響。然而,原生家庭並不一定都是健康和正面的,有些原生家庭可能存在著暴力、虐待、冷漠、過度保護、控制等問題,這些問題會給我們留下深刻的傷痕和陰影,影響我們與自己和他人的關係。 因此,我們需要對自己的原生家庭進行一次斷捨離,也就是放下過去,走出陰影,創造自己的未來。這並不意味著我們要否定或忘記自己的原生家庭,而是要正視和接受自己的過去,並從中學習和成長。 我們可以通過以下幾個步驟來實現斷捨離與原生家庭: 斷:意識到自己與原生家庭之間存在的問題和衝突,並決定改變自己的狀態和態度。這需要我們有勇氣和決心,也需要我們有足夠的自信和自愛。 捨:釋放自己對原生家庭的執著和依賴,並放下自己對原生家庭的怨恨和期待。這需要我們有寬容和謙卑,也需要我們有足夠的自由和自主。 離:距離自己與原生家庭之間不健康和負面的影響,並建立自己與原生家庭之間健康和正面的關係。這需要我們有智慧和技巧,也需要我們有足夠的尊重和溝通。 通過斷捨離與原生家庭,我們可以從過去中解放出來,並開始創造自己想要的未來。我們可以發現自己的潛能和價值,並實現自己的夢想和目標。我們可以與自己和他人建立更深刻和更美好的關係,並享受更豐富和更幸福的生活。 斷捨離不僅是一種生活方式,也是一種成長方式。它可以幫助我們釋放自己的負擔,發揮自己的潛力,創造自己的幸福。讓我們一起開始斷捨離吧! (澳門斷舍離學會 供稿)

Design Pattern: Observer / Subscribers - Push vs Pull
手機‧電玩
MacauYeah・2023-09-29

相信一般入行IT不久的朋友,都會知道IT系統更新時,有推和拉push、pull兩種方式。特別是Programer,對於觀察者模式又或者是訂閱者模式Observer Subscriber 會有更多的使用經驗,例如OS programing要處理event bus,Mobile App要做的推送通知Push Notification。 但一般來說,很少人討論推和拉push、pull的問題,筆者就著一些踩過的坑來說說差異。 首先,在一個通訊相對穩定的系統中,Push、Pull都很好用。例如同一個OS內,它的socket或pipe可以看作很穩定,可以假設那些要廣播的消息可以正常傳遞出好。但好用歸好用,這個模式對於越來越複雜的交互系統都有一個無法明確處理的問題:怎樣去處理觀察者訂閱者自己的操作失敗問題。 對於非IT行業的讀者來說,只要你接觸過手機即時聊天程式IM,如whatsapp, wechat, facebook messenger應該都會遇到一個問題就是:你收到OS提示通知,但打開聊天程式卻看不到新的對話內容;又者是你連續收到多個同一個內容的提示通知,那怕你已經讀過了。這些都代表了,手機端當初時沒有好好即時回應是否已經操作成功,不需要重複通知的問題。有可能是手機當時掛了,也有可能是網絡不太好。 上述的例子,對一般人來說,可能影響不太。因為重複收到訊息,又或是漏了訊息,也不會怎樣。但對於業務系統,例如定期收費,多收一次又或是少收一次,都會引起某部份關係者的不滿,即使事後有退費機制,但有些匯率問題,始終會有差異。在傳統架構上,有規模的公司系統都可能會使用內部的中央資料庫等做交易transaction管理,整個過程,都要嚴謹地記錄廣擴是否成功、觀察者自己的操作是否成功。 在近代,分散式系統又或是微服務的出現,令上述的中央資料庫無法實行。如何好好地重新定義好Transaction管理,就是一大挑戰。筆者最近亦實作了一個要在微服務的上廣播的觀察者模式,但雪上加霜的是,在互聯網的環境下,廣播的消息沒法保證可以正常傳遞出好。觀察者訂閱者可能已經正常收到消息,也做了相應的操作,只是來不及回應,網路就斷了。這令重複發送信號的可能增加了。 如果說,要以平民的方式去實作這類廣播,Pull會比較有大的容錯。廣播者只是通知觀察者訂閱者來拉資料,保證廣播當時的資料量可以盡量地少。廣播者開放盡量大的查閱權,觀察者訂閱者可以自由決定事後更新要取得的資料量。但這樣每個觀察者訂閱者都要重做一次同步機制,不過好處是,主動權在於他們自己手上。 相對地,Push的容錯就低一點,但要付出的成本也跟Pull差不多。因為網路環境,大家要重現一個基於TCPIP而有commitrollback的難度較大。當網路出現斷線,廣播者無法確定是否需要重做。在重複收到訊號時,最後還是需要觀察者訂閱者來決定怎樣處理重複記錄。但比Pull好的是,Push可以限制單次訊號的傳送量,也可以確保觀察者訂閱者一定收到特定的記錄。 上述就是筆者在這一年來遇過的坑,如有什麼不足,很歡迎大家一起來作更多討論。