搜尋

搜尋結果

澳航1月特賣!飛日$1,500、台泰$1,100!
激安優惠
OHChance 旅遊誌・2016-01-07

價錢測試: 1月澳門飛東京來回 【促銷公司】澳門航空(Air Macau) 【搭乘日期】即日起至1月31日 【販賣時間】已開賣,至1月8日2359 【最長停留】7天 【航班限制】曼谷去程限NX886 【預訂網址】httpohchance.inforefairmacau 澳門航空推出1月Last Minute特賣,大陸、日本、台灣、泰國、越南航點有優惠,各航點來回連稅優惠價如下: 東京:MOP1,474 大阪:MOP1,504 台北高雄:MOP1,118 曼谷:MOP1,169 峴港:MOP1,439 河內:MOP1,512 重慶合肥鄭州南寧:MOP907 天津瀋陽太原成都南京寧波:MOP1,107 最值得留意當然係兩條日本線!千五銀來回應該係近幾年最低價,仲係Last Minute!另外台灣同曼谷的千一銀來回都係非常值得考慮!搵過平飛主要在1月中之後,數量日本線都ok!台灣線就稍為差一點點。優惠只賣今明(1月7日、8日)兩天,要買要快!另外澳航官網顯示由於更新了購票系統略有不穩,有時會出現無法出現價錢的情形,只要多search 幾次或稍待片刻再search即可,亦建議使用chrome 瀏覽器進行購票。 編輯聲明====================================== 相關連結:httpohchance.infop=3810 來源:OH!Chance!澳燦旅行資訊 |FaceBookOhChance 經版權持有人授權CyberCTM.com發表。 ======================================

芭堤雅4日3夜套票$343起-AirAsiaGo
激安優惠
OHChance 旅遊誌・2016-01-05

【促銷公司】AirAsiaGo【旅行日期】1月7日至2月29日【開賣時間】已開賣,至1月10日【最長停留】沒有【航班限制】沒有【預訂網址】httpohchance.inforefairasiago      httpohchance.inforefexpediahk AirAsiaGo 推出即期澳門出發Package優惠,訂澳門去芭堤雅、羅勇、沙美島的機票加酒店套票,機票免費! 如果以4日3夜2人同行價計,最低每人連稅只要HKD343!同一時段機票最平都要HKD941!就算唔想住個d 酒店,當係買機票都抵!住好d 例如羅勇的Novotel,每人計返都係HKD814,真心爆抵!記住呢隻係last minute! 不過要訂芭堤雅、羅勇、沙美島的優惠,要去不同的網站:去芭堤雅的話,要去返AirAsiaGo 官網,目的地選芭堤雅就會搵到;去羅勇、沙美島的話,就去Expedia 選機票加酒店套票,目的地填 ldquo;羅勇rdquo; 或 ldquo;沙美島rdquo; 就ok!只要出現 rdquo;免費機票rdquo; 字樣就係目標! *注意套票唔包烏塔保機場出芭堤雅 羅勇 沙美島的地面交通,不過機場有去上述3個目的地的minivan(沙美島需再轉一程船)。 編輯聲明====================================== 相關連結:httpohchance.infop=3770 來源:OH!Chance!澳燦旅行資訊 |FaceBookOhChance經版權持有人授權CyberCTM.com發表。 ======================================

德威航空飛首爾MOP1933
激安優惠
OHChance 旅遊誌・2015-11-27

價錢測試: 12月澳門飛首爾來回 德威航空新出一次小優惠,澳門-首爾來回連稅MOP1,933,價錢比之前貴左200幾銀!買德威航空記得要分開兩個單程買(即分開澳門-首爾、首爾-澳門兩個單程咁來買),咁樣回程首爾飛澳門就唔使俾燃油附加費!(註:德威目前以韓圜計價,加埋的總價是KRW279,630,上面個葡紙價只供參考) 提提大家,德威航空的票價已包10KG手提行李,以及15KG託運行李額,行李額無法額外加購,超重只能在counter 罰錢,罰金為MOP80KG 或KRW9,000KG。 注意: 之前的經驗是德威航空的付款系統對非韓國發出ge 信用卡好似有d 水土不服,付款失敗機率比其他航空公司高。且由於德威航空暫時港澳都沒有辦事處,請自行考量購買出問題後,要花時間處理的風險。如果碌卡後出現error且銀行send 信息話己過數,可以打去銀行問問是否確實已過數或只是開了授權,如果是後者,可以請銀行取消返個授權再重新買過;如是前者,則可以問銀行拿交易編號,然後跟德威航空聯絡。 【促銷公司】德威航空(Trsquo;way Airline) 【搭乘日期】11月28日至2016年3月26日 【販賣時間】已開賣,至11月29日0059 【最長停留】沒有 【航班限制】沒有 【預訂網址】httpohchance.inforeftway 編輯聲明====================================== 相關連結:httpohchance.infop=3543 來源:OH!Chance!澳燦旅行資訊 |FaceBookOhChance 經版權持有人授權CyberCTM.com發表。 ======================================

亞洲航空飛澳洲MOP2188起
激安優惠
OHChance 旅遊誌・2015-11-26

大家搶AirAsia BigSale D曼谷同芭堤雅0元機票之際,其實澳洲線都有唔錯ge 優惠!各航點澳門出發經吉隆坡轉機來回連稅價如下: 柏斯:MOP2,188黃金海岸:MOP2,689墨爾本:MOP2,616悉尼:MOP2,724 出發日期跟東南亞的Big Sale一樣,出年5月到後年2月!兩千幾飛轉澳洲都真係得得地,當然AirAsia 唔包行李同餐食,不過都可以睇睇佢,因為平時都要成三千幾四千,平左個d當補貼行李同餐食都唔錯! 仲有想酒店機票一次過訂哂的,可以上expedia 上面睇睇套票,部份酒店有送一晚、兩晚甚至三晚的優惠(視乎你住幾耐),計返條數都幾ok。不過最穩陣都係自己先睇下分開訂ge 價錢,如果唔係差好多都係分開訂靈活性大d。大家可以用下d 酒店搜尋引擎比比價。 Hotelscombined httpohchance.inforefhcTrivago httpohchance.inforeftrivago 另外國慶、聖誕個d 大假,前後都有一d 平飛,但實在唔易夾時間,當佢blackout左都得,當然亦可以耐心搵搵,睇下夾唔夾到。 【促銷公司】亞洲航空(Air Asia) 【搭乘日期】2016年5月1日至2017年2月5日 【販賣時間】已開賣,至11月29日2359 【最長停留】沒有 【航班限制】沒有 【預訂網址】httpohchance.inforefairasia(機票)       httpohchance.inforefexpediahk(套票) 編輯聲明================================ 相關連結:httpohchance.infop=3565 來源:OH!Chance!澳燦旅行資訊 |FaceBookOhChance 經版權持有人授權CyberCTM.com發表。 ================================

釜山航空飛日本HKD2710起
激安優惠
OHChance 旅遊誌・2015-11-19

釜山航空推出了一個11月中至12月中澳門出發,經釜山轉機飛大阪及福岡的優惠,來回未稅價MOP1,880,連埋稅的話: 大阪:MOP2,840 福岡:MOP2,710 (以上價錢為估算,可能與實際查詢時有差異) 如果以last minute 來計,其實呢個價都唔錯!加上呢個優惠仲可以加大概MOP190中停釜山,一票玩兩地!現在買11月12月澳門-釜山來回飛已經要差不多MOP2500,加多少少玩埋日本真心fit。 另外坐釜山航空飛大阪福岡,澳門半夜上機,計埋轉機,飛到日本都仲係朝早(大阪早上10點、福岡早上8點半),然後回程都是黃昏機返(大阪下午6點50、福岡晚上7點40),返到澳門半夜12點,絕對可以玩盡d 時間。相當唔錯! 不過這個優惠無法在網上預訂(網上都買到轉機去日本的票,但會貴很多),請以以下方式向釜山航空澳門買飛: 提交以下資料到 karmen@airbusan.com 旅客姓名(護照上的英文名字,寫法是 姓名,例如 CHANDAMEN) 性別 目的地(大阪/福岡) 出發回程日期 聯絡電話 如有其他問題亦可以直接向釜山航空查詢,電話 8898 2327 另外機票限制是 no change no refund,出發前退票,只會稅回稅款及燃油附加費;已出發的話就什麼都沒得退。 優惠資訊整理: 【促銷公司】釜山航空(Air Busan) 【搭乘日期】11月18日至12月17日 【販賣時間】11月18日至12月4日 【最長停留】7天 【航班限制】沒有 編輯聲明====================================== 相關連結:httpohchance.infop=3504 來源:OH!Chance!澳燦旅行資訊|FaceBookOhChance 經版權持有人授權CyberCTM.com發表。 ======================================

2026看Steam Machine | Steam OS 是不是一個出路?
科技新知
MacauYeah・2026-02-20

在這幾年,筆者都一直分享一些coding anywhere的主題。原本的出發點,其實是因為雲資源及container的出現,是不是讓個人電腦的採購可以越來越不受限?是不是相對選擇會更多,亦應該可以更便宜的選擇? 適逢SteamDeck Linux興起,使用Steam OS道理上會比windows更適配雲資源的開發,而且SteamDeck 可以同步作為手提遊戲機,買台低配的SteamDeck回來,可謂一石多鳥。筆者用著用著,也來了兩年多。現在再來聊它,主要因為Valve未來又有新的硬件Steam Machine推出。這台新硬件,道理上也是跟Steam OS,官方亦宣傳它可以作為PC用。但就這一賣點,筆者很想分享一下它的Steam Deck的使用心得,供各位參考Steam Machine的軟功能是否適合。 httpsstore.steampowered.comsalesteammachine 首先,作為遊戲方面,Steam Deck是手提遊戲,硬件比較弱,不能與同世代的PS5或Xbox Series X或PC去對比。我們不應該拿畫面和效能跟其他平台比。但它的OS 層功能,就很直接看得出它有沒有價值。 遊戲模式Gaming mode 有即時待機功能,但不是所有遊戲都百分百適配。Steam OS的待機,來回玩,再待機,玩過兩三天,總會crash一次。相對之下,Switch就做得很好,就算玩一週也沒問題。Steam OS 也不能說很差,因為PS5等沒有真試過來回待機玩個一週。這裏要表達的,就是遊戲未必為Steam OS而做優化,開發商的目標還是傳統的PC遊戲模式,傳統PC Notebook也有待命,但又有多少遊戲會認真對待?所以Steam OS可以待個兩天,就已經很好 手柄連接算是順利,一般大版的手柄,都可以簡單連接。但它也有做得不好的地方。每次待機換地點,基本上都涉及切換手柄問題。即使內置就有只一個實體手柄,系統並不會自動為你更換第一順位。例如,我原本使用PS5 無線手柄,在家遊玩,這時PS5手柄是第一順位,實體手柄是第二順位。很多遊戲只認第一順位是很正常的。不過在我待機,切換環境,原本的PS5手柄已不存在,但SteamOS並不會把實體手柄順移到第一順位,必需要手動調節。好在,也不需要退遊戲就可以切換。這個對比PC來講,SteamOS已經是做出了改進,但對於Switch和PS45,這些根本就是待機一啟動時就要為用戶的問題。可能這是因為SteamOS要考慮Desktop Mode的原因吧,不過筆者就沒有試過在Desktop Mode開遊戲,因為突然要待機外出會更麻煩。 桌面模式Desktop Mode 這個模式,筆者就專注在取待PC的日常操作上 中日韓輸入法問題,這是大大地阻礙大家入這坑的很重要原因。如果大家都是純英文人,就不需要顧慮這一塊。但筆者就不是一個英文很強的人,多多少少需要直接打中文去找問題。原本SteamOS在Gaming Mode下可以通過 Steam Key X,叫出虛擬鍵盤,安裝中文倉頡是很易的事。原本這一功能,在Desktop Mode也是可以的。但在寫稿的今天,Gaming Mode Desktop Mode的中文虛擬鍵盤都一起報廢了,原因未明。筆者只好走回最早期為大家介絡的 flatpak fcitx5RIME大法。fcitx5可以用,但限制也多。之後筆者再寫一期教學,解決它的限制問題。 辦公室套件。最基本就LibreOffice, OnlyOffice,大家可以在Desktop Mode中的Discovery裏找到。大家想知自己常用的套件是否有對應的版本,可以在httpsflathub.orgen 裏找找看。有的話基本可以放心一半,至少經Discovery下載的app,都可以經fcitx5RIME輸入中文。但這並不代表你可以真的當自己在辦公室工作,那些printer scanner ,筆者實在沒有太多想法。道理上今年今日普通列印功能,應該通過指定driver就可以做到,但無耐真的不太簡單。日後筆者了解好制式問題後,再來填這個坑。 瀏覽器就用Firefox吧。 其他瀏覽器有是有的,但最好只用Firefox。Discovery是有筆者最常用的google chrome瀏覽器,但在網安原因下,筆者不敢推薦。Flathub上 Firefox是官方認證的程式,但Google Chrome和Chromium也是沒有認證。如果想使用管方認證的Google Chrome,頂多只能在Distrobox下自行安裝。同樣,如果你是IT人也是英文人,Distrobox再安裝chrome,應該很簡單。但如果你像筆者一樣,還是依賴中文輸入法,你就會很失望,Distrobox經Xserver出來的程式,沒法使用前文所講的fcitx5。所以簡單一點的選擇,就是直接使用Firefox。 寫Code,那就得在Distrobox上弄了 Flathub上是有非管方的VSCode,但同樣問題,這個版本你敢用嗎?同樣地,在Distrobox 下安裝 VSCode,是取得官方版本的好方式。只要大家不強求在vscode中輸入中文就可以了(貼上中文是可以的)。使用Dsitrobox做開發類的IT工作,在Contianer範圍內,都算可行的,在Container內安裝java,總比在SteamOS上簡易。但如果你需做一些低層的開發,還是在VM下操作吧。 總結: 如果你很想一石多鳥,你能接受新事物,Steam OS可以一試。 如果你有一些深度的操作或要求,即是是遊戲層面還是工作層面,現時Steam OS都不是一個很好的選擇,除非你的Steam OS不更新,把它硬改回ArchLinux,但這就失去了Gaming Mode的意義。

雲系統的持續更新,大家的選擇是什麼?
科技新知
MacauYeah・2026-01-30

在開始之前,筆者先解釋一下自己對Linux發佈策略的理解。筆者之前以為自己都尚算了解,但到了兩難問題時,才開始反思。所以都不禁懷疑自己的基本觀念有沒有問題,如果大家覺得筆者多少有些理解上的錯誤,請留言糾正。 普通軟件的發佈 主要分為穩定(Stable GA, 測試(Edge Alpha Beta),特定版本。穩定、測試版本也可能有多個不同的分支,但它們主要是指不同環境下的選擇。通常安裝時,都會安裝最後的穩定、測試,除非最後版本有明顯Bug,我們需要回覆到再去的一個穩定版本。 當我們每次都更新到最後的穩定版本,我們稱之為rolling release. 以docker 官方建議的方式,我們在ubuntu底下,可以看到它的有很多結果回傳。 apt list allversions dockerce Listing... Done dockercenoble,now 529.1.41ubuntu.24.04noble amd64 installed dockercenoble 529.1.31ubuntu.24.04noble amd64 dockercenoble 529.1.21ubuntu.24.04noble amd64 dockercenoble 529.1.11ubuntu.24.04noble amd64 dockercenoble 529.1.01ubuntu.24.04noble amd64 dockercenoble 529.0.41ubuntu.24.04noble amd64 dockercenoble 529.0.31ubuntu.24.04noble amd64 dockercenoble 529.0.21ubuntu.24.04noble amd64 dockercenoble 529.0.11ubuntu.24.04noble amd64 dockercenoble 529.0.01ubuntu.24.04noble amd64 dockercenoble 528.5.21ubuntu.24.04noble amd64 dockercenoble 528.5.11ubuntu.24.04noble amd64 dockercenoble 528.5.01ubuntu.24.04noble amd64 dockercenoble 528.4.01ubuntu.24.04noble amd64 ... 我們可以選擇過去某個版本,但通常無腦update,就會去到最後一個版本。 Ubuntu的發佈策略 我們換個package看看,如果只看重要軟件的話,例如kernel,我們沒有什麼可以選擇 apt list allversions linuximagegeneric Listing... Done linuximagegenericnobleupdates,noblesecurity,now 6.8.090.91 amd64 installed linuximagegenericnoble 6.8.031.31 amd64 apt list allversions linuximagevirtual Listing... Done linuximagevirtualnobleupdates,noblesecurity,now 6.8.090.91 amd64 installed,automatic linuximagevirtualnoble 6.8.031.31 amd64 除了可選擇數量外,另一個最大的不同是,kernel的自身版本其實固定在 6.8.0,就算更新,都是同一個版本的ubuntu補丁版,並不是官方kernel的bug fix版。筆者認為,這應該就是所謂的point release的策略。 (如果大家安裝物理機的話,kernel可能會是6.14,筆者大部份都是VM,還是比較舊的版本。筆者保證,6.8.090.91與 6.8.031.31之間,曾經是有多個不同版本的。但現在沒法下載回來,除非之前大家有安裝過。) 但相同情況,我們找另一個package看看,由 ubuntu 自己打包的docker 版本,雖然可以選擇的數量是有限的,但它們的版本是不斷更新的,而且不是hotfix版,還有大版本更新。 apt list allversions docker.io Listing... Done docker.ionobleupdates,now 28.2.20ubuntu124.04.1 amd64 installed docker.ionoblesecurity 27.5.10ubuntu324.04.2 amd64 docker.ionoble 24.0.70ubuntu4 amd64 雖然版本是跟著官方docker最新版本,但也有持續跳級更新。如果真的要分類,筆者應該會把它歸類為 rolling release。 Rolling release vs Point release 花了一些時間看例子之後,終於開始討論我們自己的更新策略了。rolling release,最主要的原因是,舊版本無人再免費維護了,有什麼bug,都在最新版本中修復,但也因此有機會出現不相容的情況。point release,最主要的原因是為了維持極強的穩定和兼容版本,這亦代表,除官方專家出手,否則很難有舊版本的bug fix。 那麼我們有什麼選擇? 有point release,當然跟point release,因為程式不可能天天做調整。除非大家想要新功能再升級版本。 沒有point release,就手動自己選擇hotfix版或小版本升級。在升級大版本前,一定要做整合測試。若追求極致的穩定,升級大版本時就不要原機升級,要另起爐灶,似兩個相對獨立的環境並行過渡。如果有container版本,就用container隔離,一般java等都可以這樣建獨立環境。 沒有point release,也沒有可隔離的並行環境:其實 docker 接近這類。對它應的OS層的存取,雖然可以用VM隔離,但通常都不實際。因為重新安裝OS, 設定外部環境,成本很高。docker 在中 lab 並行升級是可以,但投産環境並行真的不實際。沒有辦法之下,筆者還是原機升級。頂多是lab中實現更多的整合測試。

你開始寫 Spring Boot 測試案例了嗎?
科技新知
MacauYeah・2025-11-29

雖然筆者過往做 spring boot framework 教學中,都有滲入一些測試用例。筆者也曾經困惑了很長一段時間,所以就獨立開一個主題,聊一下筆者在實務上對spring boot test 的理解。 測試案例究竟測試什麼? 測試用例 test case 是確保你的程式碼正確性與穩定性的重要步驟,但在 framework 下,並不是所有功能都很容易寫成測試。所以在討論 framework 測試之前,釐清測試的本質。 function input business logic function output 這意味著我們輸入某些資料(input),然後經過業務邏輯(business logic)的處理,最後產生結果輸出(output)。 我們的測試目標,其實就是確保業務邏輯正確。而我們的手段就是經檢查概定的輸入資料,核對輸出結果。 那麼只要我們可以生成輸入資料,就一定可以檢查輸出結果了吧?其實不是的,因為實務上的輸入和輸出沒有這麼簡單。筆者常接觸到的輸入輸出如下 輸入 function 輸入參數 系統狀態資料,例如:資料庫狀態、外部API結果。 輸出 function 輸出參數 寫入系統(影響到)的資料,例如:資料庫狀態、使用外部API時的輸入參數。 總之就是考慮了狀態機 state machine 的問題,每個狀態外部輸入都是一個測試用例,然後核對狀態機去了下一個什麼狀態。 言下之意,我們就是暴力地生成輸入參數和模擬狀態資料,道理上就是可以進行測試。 Spring boot web framework 中,我們又會測試什麼? function input business logic function output在Spring boot web就變成如下 controller request business logic controller response在 Spring Boot test 中,我們可以用模擬的 MVC MockMvc 測試來驗證 controller 的行為。不過,其實進入 controller 前經過很多系統轉換,而這些道理上跟Framework的技術大相關,與業務邏輯小相關。所以為免折磨自己,可以將業務邏輯單獨封裝成服務(service)。之後直接測試服務 ,易寫也易讀。 controller request service input business logic service output controller response道理上 controller 能做的業務邏輯,服務 service 都可以無腦重現。這樣還可以重用服務,減少測試的數量。 如何實現輸入? 直接 new Object。大部份的情況下,因為業務是自己編寫的,應該都可以直接 new 出來。 經 json 檔讀入。如果輸入的參數量太多,逐個經 java new 是很耗時的,我們可以經 json 反序列化變成 Object。但這亦只限於自己可以操作改寫的類。 Mockito 模擬那些無法簡易經 new 或 json 反序列化的 Object。例如:spring security authentication object 我們在使用時,其實只看到 interface。我們難似自己實現一個可以反序列化的類,那麼我們可以使用 Mockito 來模擬這些資料。一些外部API的結果,我們也可以用使 Mockito 來模擬。 什麼情況下不進行測試? 有些情況下,我們可能選擇不對某些功能進行測試,原因可能包括對功能的了解不足或是單純的懶惰。以下是一些例子: 僅進行配置的Function:如果你的 Function 只是在 Framework 中填寫配置,而且你並不太了解它的運作原理,可能就不需要進行測試了。例如,Spring boot web 中,需要大家配置一個SecurityFilterChain Object,它要求大家將 HttpSecurity 轉換為 SecurityFilterChain 。因為輸入的 HttpSecurity 是系統固定的參數,我們亦沒有檢查它的狀態。這種情況下,它的輸入及輸出,其實我們都沒有真正理解。我們硬測試的話,測試功能可能只流於表面。若我們真的要做測試,也是經過MockMvc進行端到端測試(endtoend testing),測試它在事後的影響範圍。 單純的框架功能:例如資料庫的儲存庫介面(repository interface),雖然是在框架下生成的,對於自己手動調整的部份功能,筆者通常亦不會進行單獨測試,通常都會搭配業務邏輯一起進行。它可以使用 Mockito 進行模擬測試,或用測試環境的真實資料庫進行測試。 面對的挑戰 總括來講,筆者盡可能地把測試用例限定在業務邏輯中,就可以大大地降低寫測試的技術難度。但筆者還是有些問題並未完美解決。 測試用例的數量可能很多,因此共用與維護變得相當困難。逐個用例獨立編寫輸入也是很累的。對於 Mockito 的使用,筆者還是可免則免。因為要逐個功能模擬,編寫量就指數提高,這亦難似配合外部變化。一般來說,能優先使用測試環境或者 Docker 來模擬環境的,就盡量用。 離線開發、離線測試。系統依懶的外部功能越多,想做單機開發的難度就越高。即使前述有 Docker 測試,對於持續整合(CI)來講也是有一定難度。那麼這時,Mockito 就是一個可取的選擇。但這又回到編寫量及難以偵測外部變化問題。 希望這篇文章能幫助你更好地理解測試案例的編寫方向,並在Spring boot web開發中加入你自己的測試!

Coding Anywhere: 依賴服務的選擇
科技新知
MacauYeah・2025-04-22

年多前,筆者購入steamdeck, 經過一輪軟件定制,把它變成一個可以作為IT從業員開發機的方案,也介紹了一些coding anywhere的想法 httpslifemag.cyberctm.comzh_TWblogmacauyeah14175Coding Anywhere 工作方案 httpslifemag.cyberctm.comzh_TWblogmacauyeah14352Steam OS 3.5更新,內建 podman, distrobox httpslifemag.cyberctm.comzh_TWblogmacauyeah14149開發者在Steamdeck上的另一個選擇 Gnome box 在試驗了一年多後,筆者對於依賴服務的模疑,又有另一層感受。什麼是依賴服務?就像你寫的程式庫,可能需要資料庫儲存、可能需要問AI等等。所以在開發時,都要確保這些服務的存在。一般,要麼就是在本機上自行安裝,要麼就是經過互聯網使用雲服務(public cloud或者你團隊提供的private cloud),也就是本地模擬還是互聯網模擬。 本地模擬的得失 本地模擬,主要是考慮金錢上的優勢與資源的獨立性。 金錢成本 互聯網資源大部份都不會是免費的,如果本機的硬件足夠,可以在本地完全模疑,有一定上的優勢。但如果該服務在本地安裝,都要計授權,可能不沒有太大差異,例如那些report engine, report designer,即使本地開發都要逐台開發機計算。但其他大部份,如資源庫的實現,都有本地開發免費授權。所以本地安裝道理上有一定的成本優勢。 資源獨立性 當一個團隊共用一些互聯網服務時,可能會互相干援。即使團隊在開發時,可以經profile使用不同的資源,但發生誤用的情況還是很常見。(除非大家已經有一套很健全的開發用profile,只在本機生效,亦只在必要時才會被提升到程式碼的版本控制當中,不會誤會地覆蓋他人,也不會忘了提交。但這是很有挑戰的一件事)。反觀本地模擬,因為那些服務並不會在團隊中分享,就保證不會被誤用。 學習成本高 本地模擬,就有一個莫大的痛點,就是學習成本高。我們可以找到很多本也安裝資料庫的教學,本地LLM AI的架設也不少。但我們並不是很輕易地就可以無師自通,有時為了初次安裝,所花的時間成本也大得令人卻步。 coding anywhere轉移成本高 因為全部本地模疑,代表我們必需要有一台足夠強大的主機。但如果我們的移動接入點,綁定了在某台特定的強大主機,我們活動空間也相對減少。 互聯網模擬的得失 直接使用互聯網的服務,主要體現於用錢解決問題的優勢 即開即用 能用現成的就用現成的。例如你目標是使用mysql cloud database,就直接伸請使用。如果你還要在本地安裝或使用Cloud VM安裝,就還要自行安裝管理介面等工具。因為成本問題,實在要自行安裝,使用cloud vm也有一定的方便性。使用cloud vm 有一定的快取,可以減少安裝所需要的時間。當我們養成自動化的習慣,clould VM 也可以隨時刪掉,有需要才重起。 解決單機無法模擬的情況 某性依賴,並不能簡單地經過本地單一部主機去做到。例如我們要模擬一些叢集功能。我們可能要在主機或網絡設備作出一定的調整,才可能提供bridge network。這一點在辦公室網絡下限制更多,不是隨便就可以建一個可以互通,又可以訪問互聯網的環境。另一些如block storage等資源,還會對硬件有一定的要求,也不是軟件模擬就可以做到。我們若不經過互聯網取得,至少也要在團隊下的private cloud上去建立。(不過如果是從零自建private cloud環境,初次投入的成本可能直接使用public cloud 低。 ) coding anywhere轉移成進一步下降 作為移動接入點,就剩下那些不可互聯網化的部份,例如domain name,有時還是localhost比較方便,又例如有一些硬件相關開發,硬件部份必需經過本地接入。 就以筆者的個人經驗來講,除非public cloud的價錢實在不可接受又或是自動化幾乎不可能,否則使用public cloud會有時間成本上的絕對優勢。如果要走本機模擬方向,必需要對Container、VM、網絡等有深刻的了解,才會成事。

Docker 中的非管理員用户 Docker non-root user
科技新知
MacauYeah・2025-03-14

Container USER為何重要 在制作Docker Image的過程中,有時會接觸到 USER 這個設定。這事關到最後的 Docker Container內部運行的那個 user 到底會有什麼權限。大家也要知道,Docker Container 其實也只是一個 Linux 上的程序,也就是如果Container內權限過大,也有機會從 Container 內部存取到 Host上的資料。 一般情況下,Docker Image 預設的 USER 就是 root,最基礎的base image都是一樣。而我們想換,其實也相當簡單,就像Linux上起User一樣,只要經指令RUN adduser xxx 或RUN useradd xxx 也可以在 Docker Image 中創建帳號和 home 資料夾,之後就隨時經USER xxx來切換 實際上是不是這麼簡單 如果你將要Container中執行的程序,是一個binary,平常你在Linux中也是以 nonroot 方式執行,那麼是的,就是那麼簡單。例如你執行系統中的java, node, python,原本在Linux中就已經是誰都可以,那麼你的docker container 也應該沒有難度。 但如果原本的安裝包,預設是由system service來啟動,我們就要花點力氣,看看那個service是怎樣呼叫binary的,然後就一步一步模擬它的做法。例如筆者有打包的codeserver,預設是system service啟動,但它也有提共binary的執行方法,安定好home資料夾後,我們也可以手動啟動。 泛生之檔案權限問題 上述binary的情境之所以簡單,是因為大部份情況下,我們都只對於container 內部運行考慮即可,因為預設投產情況下的運作模式,都是隨時起、隨時刪、隨時砍掉重練,只要container內部運作可以自給自足,就可以了。Docker Swarm的運作也是如此,所以它不預期有的持久化資料權限的問題。 而持久化資料權限的問題,其實早在單個Linux伺服器就已經存在。同一個伺服器中,不同process就有不同的UID,當他們需要共同讀寫某些檔案,就會設定多人權限。同理,當多個Container要共同檔案,也是同樣問題。在討論共享檔案之前,我們先看看預設 Docker Storage Mount 會給我們什麼權限。 如果是bind mount,bind mount的權限預設會是Host內的檔案或者資料夾的權限。 如果Host是root,container內是nonroot,container有機會無法讀寫bind mount內的檔案。 留意權限設置就可以解決問題 如果Host是nonroot,但container 內是root,從container內生成的檔案,Host的nonroot user就無法使用。 Host是nonroot的話就一定無解,Host至少有sudo權限,臨時變成管理員,去修正問題。 如果host和container也是nonroot,但UID不夾,其實也不能交換使用。 跟上述一樣,最後要靠sudo來解決問題。 如果host和container也是root,就沒有權限問題,但就有安全性的風險。 如果是volume mount,就還是看看 mount path 是docker image layer中現有的 path還是新起的path 大部份手動建立的named volume都是root 經docker compose起的named volume滿足以下條件的話,將會是nonroot。 docker image 中的已有該path存在。 named volume未存在,docker compose會把對應path的內容在初次建立時抄到named volume 中。 例如ubuntu24.04中的homeubuntu,存在於docker image中,它的擁有者就是UID 1000,我們經docker compose HOME_VOLUMEhomeubuntu,在HOME_VOLUME建立時,就會是UID 1000。但如果是 NOT_EXISTShomeubuntusomethingNotExists,那麼NOT_EXISTS建立時,也會是root 上述討論的Storage mount是集中在單機情況下,使用HOST OS的本地儲存。若現在的場境是多機共享的share storage,就會更麻煩,還要看看那個share storage本身的屬性。例如常見的Linux NFS,其實有指定的權限,跟NFS的Login權限有關,如果你的process本身對檔案權限很敏感,就請先不要挑戰NFS例如postgresql。 Rootless mode Rootless 模式 Rootless 模式指的是在Host中,執行Container的使用者,不需要是管理員,筆者就常用於開發環境中。投產環境中反而沒有聽過這樣的討論,因為投產環境很少可以讓非管理員去執行這麼重要的環境管理。 雖然只是開發環境,但這像前述的bind mount討論中,如果Host是nonroot,但container 內是root,又或是兩者nonroot,但UID不夾,也會出現權限問題。無腦的將host user加入docker group,只可以讓非管理員可以運行docker,但解決不了權限問題。 真正有條件解決的,可能就會向linux subgroup的方式發展。暫時筆者用得比較順的rootless mode,可以無腦用的,不是docker,是podman。有興趣的朋友可以經podman官網看看教學,它給筆者的感覺就像是自動轉換UID。 podman rootless mode 想看更多 筆者已經將過去的文章重新整理成gitbook,有興趣睇更多的讀者,可以來筆者的gitbook再翻一翻 httpsmacauyeah.github.ioAProgrammerPrepares