搜尋

搜尋結果

Spring Boot Web App 更新期間的維護模式:從唯讀到全鎖的解決方案
科技新知
MacauYeah・2025-08-25

在營運 Web App 的時候,雖然我們有 Docker K8s 可以滾動更新,但難保用戶在更新的過程中,有一半訪問去到了舊版,另一半去了新版。如果可以,Web App 本身自帶維護模式,可以自我判斷什麼時候應該忽略新的訪問,當然最好。但要做到這一點,前期需要很多規劃。狠心一點,可以直接關掉對外的服務,讓用戶無法訪問。 但在另一些情況下,例如升級搬遷的情況,下線時間比較長,完全關掉服務並不是一個很好的方向,我們至少還可以提供唯讀的選擇。而且這個可以從資料庫出發,讓 Web App 少處理一點邏輯。 如果 Web App 背後的資料庫是 MSSQL 或 MySQL,唯讀這件事應該是簡單的,只要你把 service account 的權限改變就好。但如果你用Oracle,就要想想辦法。 筆者想到的方法,暫時有兩個。第一個就需要大家寫寫 Script ,一口氣把所有 Table 給鎖起來。例如 第二個,就是生成一個新的唯讀 User schema,給他所有Select的權限。然後更新 Web App 使用那個唯讀 User schema存取資料。 兩個方法有什麼差異呢? 前者就全部鎖起來,沒有任何一個資料庫用戶可以改寫資料。如果你的業務沒有差異性,全部一起封起來就完事。但如果你只想 Web App 轉成唯讀,但其他背景程式還可以執行更新。那你就只能用後者了。但後著也不是百分百的完全無痛,至少你 Web App 要支援登入與操作的 Schema分離。 例如用Spring boot JPA的話,可以在 application.properties 可以讓登入及操作的Schema不一樣。 spring.datasource.username=READ_ONLY_USER spring.jpa.properties.hibernate.default_schema=ORIGINAL_SCHEMA 又或者在 java 層面指定。 @Tableschema = quot;ORIGINAL_SCHEMAquot; 這看上去,是很有彈性的。但其實也是有些局限。如果你本來的JPA有寫特制的 JPQL 或 Raw Query,又或者你在Java層面加了 @Subselect,由於這些都是程式原作者所 hard code 的,JPA沒法幫你改寫。改來改去,可能還是前述寫Script的方法,一口氣把所有 Table 給鎖起來實際一些。 Reference 更多筆者的程式開發分享,見請 github

Galera 4 (Mariadb cluster) 的冷開機
科技新知
MacauYeah・2025-08-20

前次我們介紹了 Galera 4 在Ubuntu 24的架設方式,這次我們來補充一個最常見的問題Cold Start 冷開機 cold start 平常, Cluster 中只有其中一個 node 需要更新重啟,基本上所有節點回覆正常後,都可以互相通訊。而有些情況,例如斷電問題,需要所有節點全數關機,那麼 Galera cluster 就需要一定的方式重啟系統。那是一些狀態的保護機制,因為在全關機後再同步,系統不知道哪台機才有最新的狀態,它也不敢貿然同步因為正常使用下, Galera cluster 只有兩台機也會開步。所以需要人手介入,指定以某台機作為 cluster 的起始點。 舉個最簡單的例子,前述三台機 pocdbnode3 , pocdbnode2 , pocdbnode1 順序關閉,那麼 pocdbnode1 應該就會有最新的資訊。 在ubuntu中,可以查看 varlibmysqlgrastate.dat 中的 safe_to_bootstrap是否為1。如果是1,代表當初它有最後的 transaction ,以它為起始點重新起 cluster。 $ cat varlibmysqlgrastate.dat # GALERA saved state version 2.1 uuid 0c38b6dd7bdb11f0a4dd1f4be36a6ea9 seqno 1 safe_to_bootstrap 1 我們使用galera_recovery, galera_new_cluster, 就可以把該機器重新救起mariadb process。 $ galera_recovery WSREP Recovered position 0c38b6dd7bdb11f0a4dd1f4be36a6ea911 wsrep_start_position=0c38b6dd7bdb11f0a4dd1f4be36a6ea911 $ galera_new_cluster 然後其餘兩個 node 可以直接重啟 mariadb 服務 # node 2 $ systemctl start mariadb # node 3 $ systemctl start mariadb Reference Getting Started with MariaDB Galera Cluster 官方文件 How to Set up MariaDB Galera Clusters on Ubuntu 22.04 How to Bootstrap MySQL or MariaDB Galera Cluster ndash; Updated 還有比較複雜的救機狀況,例如safe_to_bootstrap全為0,即是可能是全部node都沒有好好地關掉,就掛了。大家有需要可以看看這個link的解決

生活AI 應用筆記
科技新知
MacauYeah・2025-07-22

上週六(7月19日),筆者參加了聖公會的一門講座「AI時代,父母的教養實戰新教程」,學習如何利用AI輔助小朋友的教育。雖然課題如此,但課堂還是以感受AI的使用方式為主,之後大家就好好利用AI這個知識庫去激發新思維。課堂上,文字、語音、動畫都有示範,但筆者感受到文字AI的部分最為深刻。 在過去一兩年,筆者曾略微使用AI,但即使在DeepSeek出現後,筆者仍覺得幫助有限。這主要是因為筆者身處科技行業,AI給出的答案不夠精準,難以協助開發,還可能導致一堆無法延續的結果,因此筆者甚少使用。然而,上課的主題並非針對本業使用AI,而是探討如何利用AI為生活注入更多新感受。 AI或許無法取代專業,但可以幫助你引入跨界元素,讓思考模式或你的作品更加多樣化。課堂中,學員將自己創作的家書放入AI,請它協助轉換成不同年齡層的人用詞、改編為劇本或變成辯論議題等。當然,並非每個方向都能產生合理的結果,例如家書轉為辯論,明顯會顯得不合適。但由於轉換的成本低,你可以透過少量提詞,得到多樣不同的呈現效果,激發新的思維。這就像在創作前,你可能會參考大量同類型的作品,去取得靈感。 筆者也簡單分享一些使用文字AI創作的方向,希望大家能有所收穫。 首先,準備好自己的原稿,這個原稿必須是由自己親自起草的,而非AI生成的主題方向。起草時,不必過於拘泥於前後文法,只需有一個大概方向即可。 將原稿交給AI,請它幫忙修改。AI會協助你修正一些口語或錯字問題。 嘗試請AI給你一些建議,或者請它幫你補充段落。筆者認為,請AI給建議會更好一些,因為有時補充段落可能會顯得過於機械。 除此之外,文字AI在日常生活中還做得不錯的實例 整理文章重點,重新以不同的方式演繹 整埋文章重點,筆者在大學的教育中,就經常看到以條列重點去取得原本書的教學方式。所以針對中小學教育,或新知識的學習,都可以試試用AI來整理大意,提升學習效率。 更強的是,如果你還是看不懂,可以叫AI以更多例子,深一點或淺一點去解釋一次。 禮物準備 有時物輕情義重,如果你身邊的親友很重儀式感,那麼使用AI的搜集及變化能力來幫你多樣化禮物的準備,相信可能為你加入更多新元素。 計劃旅行 計劃旅行,過去一般都參考他人的行程分享。過去就一篇一篇地逐篇閱讀,個人歸納。現在你可以先問AI,再去覆核。過去自行搜尋的方式,可能會被一些旅遊網站的文章所佔據,而現在改用AI,配合不同的提詞(prompt),你還可以多一些不同的參考角度。 註:本文僅使用AI修正用字,並未生成任何插畫或議題。

重入膠坑 8 | HG Mighty Strike Freedom 取件表
手機‧電玩
MacauYeah・2025-05-16

之前就為大家介紹過,想有效率地消除Gunpla山積,事前計劃好一個概定的流程,絕對是件很重要的事。 而流程中,預制取件表,絕對素組檔的一件神器,筆者習慣後,可以極大地減少筆者換剪、打磨工具的次數,也減少找不到零件的機會。 筆者就分享一下自己制作的Mighty Strike Freedom 取件表 Google Drive連結,有需要的讀者,可以直接下載或列印。 在這邊再簡介一下如何利用取件表作為素組之用 準備粗剪、薄刃剪、打磨砂紙400, 600, 800號、十二個零件盒 按照取件表,分區粗剪取件: 完整地粗剪頭部所有零件 放入頭零件盒 完整地粗剪身體所有零件 放入身體零件盒 依次粗剪各部份零件,放入對應的零件盒...... 分區薄刃剪修件 完整地修剪頭部所有零件 完整地修剪身體所有零件 依次完整地修剪各部份所有零件...... 選擇性分區打磨零件 完整地打磨頭部所有零件 完整地打磨身體所有零件 依次完整地打磨各部份所有零件...... 回到說明書,分區組合 依次地分區組合 選擇性記錄需要額外補色的位置。 選擇性滲線、補色 於粗坑線條上水性滲線液 Marker筆補色 選擇性保護漆 最後一定要提醒,在第4步組合以外,就必需要決定是否進行打磨,若是組合完再拆散,就有斷件風險。亦有因為上述流程不刻線,其實第5步很安全,沒有進一步打磨修補問題。 最後附上筆者速刷前四個步驟的HG Mighty Strike Freedom美照。

github flow - github 開發流程
科技新知
MacauYeah・2024-06-20

那些年那個很穩定卻又不受歡迎的 git flow 開發流程 多年前,朋友就向筆者介紹git的團隊整操作流程。筆者深思過後,的確實用,那些年的gitflow,很美滿,由開發、測試,到發佈、修補漏動(backport),都有清楚明確的指引。 原作者連結:gitflow 大家如果沒有更複雜的需求,真的可以照搬,筆者也很推這一個模型。 但在長期推廣下,筆者發現大部份人其實都不熟git的基本操作,什至連git graph也不看,現在看git flow,就更不可能接受。那怕是有常用git的個人團隊,也是不怎使用分支模型。 前一兩年,筆者也不懂,筆者也努力地簡化git flow。例如把master和develop合而為一,但最後也是少有人可以接受,很多人還是卡在分支那邊,對checkout、merge還是很陌生。在跟更多不同人的協作過後,筆者總於意會到一件事。其實大部份人,只想知道最後、最新的狀態,只會更新 master main ,也因為個人開發,所以連衝突也不會有,更不需要使用merge。那怕是少型團隊,頂多也是維護main的衝突,間中用用merge,而checkout還是用不著。 其實這個情況,並不限於小型團隊。因為 web app 和 DevOps 的流行,所以越來越少機會要維護多個舊的穩定版本。大家都專心於最後一個開發及發佈版本就完事,用戶的某個版本有問題?更新到最新版本吧。(註:越底層的應用開發模式,因為相容性問題,不可能只保留一個穩定版本。) 那麼我們就大力簡化吧 github flow 開發流程 既然大部份情況,大家都只在乎 main master 預設分支,那我們也沒有必要跟著複雜的 git flow 走。但在 DevOps 的角度下,為保證 main master 穩定性,大家還是至少要遵守branching 、pull merge request 、code review 、auto test 原則 。 github就最簡單的branching 、pull request 、code review 提出了它們的 github flow。 簡而言之,就是每個人在開發時,都先從 main 起一個新分支,不斷更新。待合適的時候,就透過 pull requst,向原項目負責人提出申請,只要項目負責人點頭,就可以把改動傳入 main 中。又因為Github 原本的定位在於個人與個人之間的協作,初時已經需要通過fork建立獨立的倉庫,那怕你不愛分支也必需分支。所以 pull request,code review 的作用更明顯,後逐的協作更理所當然。 但若果回到公司團隊協,Github flow 就應該像筆者之前提出協作方案,各自起分支,最後由某個人守門,把所有結果放到 main 中。(前文連結)

開發者在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不是針對自動化或企業管理所做的,只有一些基本操作。 官方連結 httpsapps.gnome.orgBoxes 官方原始碼 httpsgitlab.gnome.orgGNOMEgnomeboxes Flathub載點 httpsflathub.orgappsorg.gnome.Boxes 對於筆者來說,能裝到VM,代表就有更多的操作空間。如果大家不介意多了一些虛擬層,會太影響效能,其實很多操作可以在VM內使用。例如不需要再用podman,可以直接在VM中使用docker、安裝k8s等。對於效能問題,我們必需要在Steamdeck操作時,至少我們可以在VM中先安裝Arch linux,找回必要的依賴包,編譯我們想要的link lib,再抄回Steamdeck下執行。過程的確比較轉折,但若然Steamdeck這台機器只適合打機的話,就真的很可惜。

測試驅動開發 | 系統邊界Mock
科技新知
MacauYeah・2024-04-23

好一段日子之前,筆者就介紹了一些寫Test Case的大方向 。對於大部份情況來說,有分隔的開發環境,有整個配套,測試起來是順暢的,想做單元測試可以,做整合測試也可以。但如果沒有,我們其實也要想辦法寫Mock。 Mock這個概念,對於寫前端程式的朋友應該比較熟悉,因為前端開發者總不能等後端準備好之後,才開始慢慢設計。前端很早期就要模擬一些情況,做介面設計,做各種思考。而且這個Mock不是指在運行單元測試時,才使用的臨時修改隨機數據。而是針對開發時,自行模擬的後端或外部環境。不過因為前端介面涉及很多主觀設計,很多元素冇辦法做固定的自動測試,所以前端的測試通常要人幫測試。 而後端開發,邊界Mock這一概念也很有用。在外部環境不足的情況下,為自己系統的邊界部份自建一個Stub Dummy 等的模疑數據,是很有幫助的。不論我們對外部環境的掌控度有多少,我們走測試驅動開發(Test Driven Development),好好地定義這個外部環境的期待行為是很重要的。 例如,你有個功能,需要存入數據,但資料庫未準備好,也沒有所謂的In Memory資料庫可以用。這時,自己架空寫一個什麼都不做或回傳固定結果的函數作為中轉接口,然後在你的Test Case可以規劃你的想要結果。 也許你會說,這個函數就是存下資料,我不會需要它的回傳結果,但我們其實還是可以在Test case 中定義一些錯誤檢測,確保這個函數沒有Throw Exception 。再進一步想,我們主程式是否真的不負任何儲存失敗的責任?要定義其他回傳變數,方便寫Log讓追蹤?或者我們至少要知道成功後的Primary Key ?若然業務上真的不在乎儲存結果的有效性,我們不存入數據也是可以的? 所以歸根究底,我們還是在乎儲存的成功與否。還是有必要去驗證驗寫入是否成功。 上述例子,因為資料庫不存在,開發途中可能Test Case 有好長一段時間也通過不了,但至少當資料庫完備後,可以直接驗證,不用人手手工測試。 舉另外一個例子,我們要從某個地方,例如API或資料庫,讀取數據。我們也可以先寫中轉接口,並為它寫Test Case定義應有的行為。雖然明明就只是讀取,我們沒法控制太多。但在接口做好異常狀態處理,是很重要的。例如Handle exception、檢查某些重要業務值會不會是空、確保後續部份可以正常使用,這是因為我們不能被外部系統的失誤而導致自身系統癱瘓。 其實測試驅動,本質上就是強逼大家想多一點,好好定義預期的行為,不論內部條件怎樣變化,都有一自動的檢收標準。

Spring官方教學 | Spring Certified Professional 2023
科技新知
MacauYeah・2023-11-07

筆者作為一個網頁程式開發者,使用Spring Boot開發已經有六年。從當初Spring Boot 1.x開始,查看官方Tutorial七零八落,慢慢摸索,到大改版升級2.x,都碰過不少釘。最近Spring Boot亦要升級到3.x,正式進入Java 17時代。筆者亦不斷Update自己,保持程式於一個可支援的狀態。 相對以前,現在入門Spring Boot已經比1.x年代輕鬆很多。主要前些年某些網頁開發的概念,例如REST API,已經深入行業,大家不再糾結要走傳統MVC還是RESTFul API,也使得Spring Boot這樣的Framework,可以有一個受眾比較廣的統一入門教學。 筆者最近也正式參與Spring Academy的官方教學,好好地厘清一些概念。 官方連結 httpsspring.academypathsspringcertifiedprofessional2023 在讀過官方的幾個章節後,真的覺得很適合有興趣的人去看一看。主要是因為 官方以一個經典例子作為切為點,教學REST API,In Memroy Database。它還介紹了一些簡易的HTTP Code Standard、Test Case。真的比其他民間教學更有系統性。 提供一個可以在網頁上就實驗到的Lab實習環境。那是極為重要的一件事,因為九成人,在setup java 及library dependency maven, gradle時,都碰釘到直接放棄。有時是因為公司工作環境比較有要求,並不允許你使用一鍵安裝的java套件及它的library dependency;有時則因為網路安全,java把你公司的firewall當作a man in the middle MITM attack擋了,也有時是因為你公司的firewall把java擋了。Spring Academy在一個遠端的https網頁提供實驗環境,真的比本機開發要易入門很多。 Spring Academy可要多謝vscode、codeserver,及其他VM、Container技術。 在真實環境中,筆者也有自己的codeserver,打包java os cert等等,盡量減少firewall問題。 因為官方教學持續以Spring boot的最新版本作為教材,它更新的速度總比民間要快。只是官方的教學不會全面覆蓋到所有Spring project。如果大家作為Web入門的話,還是有推薦的。 在Spring boot 3.x當中,因為要求Java 版本至少為17以上,那些教材也有使用一些Java 17的新語法Syntax,實在也令人驚喜。 基本上Java 17現在可以簡化getter setter switch statement,這些在開發Web的環境下都是很重複的事。在Java 11或以前,只能經過IDE去生成getter setter等,但似始都有會一大堆Code佔據你的頁面。 官方教學及Lab環境暫時免費,除非大家很在意的修業證書,不然都可以自由免費看。 官方教學真的值得一看,雖然距離真正開發還差很遠,筆者日後若有條件,會針對官方沒有提及的內容作補充,分享一些在技術面上所需求的最少可運行配置。

[教學] 平民雲端服務不是夢 | 5分鐘教你如何快速起VM
科技新知
MacauYeah・2023-05-11

前言 原本筆者只是想做docker cluster,但因為在實機中建VM極其麻煩,所以就研究了好一陣子如何快速起VM。 HyperV有預設的Ubuntu template,但只有ubuntu desktop版,沒有server版。而且desktop gui顯得浪費資源,要clone VM也很廢時,放棄。 Windows Subsystem Linux起VM很方便,但同一個Linux version只有一個instance,沒法起cluster,放棄。 Virtual box沒有Ubuntu template,若要clone的話就變得跟HyperV差不多,放棄。 經過一輪資料搜集,發現了一個Ubuntu multipass engine,聲稱可以跨平台快速起VM。裏面有一些很吸引的功能,可以自己建立images、使用固定IP。 那怕即使是沒有snapshot,在自定義images的配合下預裝docker,要隨時加減cluster node都是一件容易的事。 重大決策點 醜話說在前頭。經過一輪測試,multipass最大的問題,就是custom image、fix IP都只能在bare metal ubuntu 中才能使用。如果你沒有一台閒置實體機安裝Ubuntu,還是要再多考慮一下。 重點 詳細的流程,筆者記錄了在Packer template 和Multipass Static IP中,在這裏就只說一些重點。 packer是使用cloudinit和qemu的技術,行起template中指定的cloud image 在筆者的例子中就是ubuntu22.04servercloudimgamd64.img 大家可以定義image行起後進行一些操作,而那些操作都是經過qemu vnc、ssh進去操作的。 操作完後就會直接儲存當時的image。所以在操作結束之前,盡可能地刪cache或刪去不要的user group settings。 最後生成的image,還是一個cloud image。若要再運行它,必需要使用支援cloudinit的VM來讀取。 cloudinit是用來指定初次運行時要設定的事,例如hdd size, user account password, ssh key import等。 使用工具cloudlocalds可以生成一個seed.img,這樣qemu也可以cloudinit。 HyperV應該也可以經過類似方式,進行cloudinit,但筆者未有去實測。如有更簡便的方法請告知。 multipass預設就已經有cloudinit,在bare metal ubuntu就可以直接執行。 multipass也可以設定不同的cloudinit參數。 成品 最後筆者就選擇了用packer用來預裝docker,經mulitpass無腦起VM,再使用shell script對多個node設定docker,達到即時起docker node的功能。這樣就減省了VM的安裝時間,也省去了docker的安裝問題。 說到底,如果只想測試docker cluster,其實windows, macOS中的multipass也可以實現相同的功能。因為安裝docker那些都可以經過shell script自動化,只是每次重複操作,都變得相當慢。另外,因為multipass在windows, macOS不支援fix ip,對於指定docker cluster interface又會再多一重功夫。

【馬交慳多拿 baby】自助餐優惠 - 30.09.2022
生活在我城
Cheers!・2022-09-30

1.澳門凱旋門咖啡廳 澳門凱旋門咖啡廳推出「四人同行一人免費」自助餐,更有生日禮遇「二人同行壽星免費」,每位都係 $338起,CP 值高,最適合同屋企人一齊去享用豐富大餐! 2.澳門旅遊塔 360deg; 旋轉餐廳 澳門旅遊塔嘅 360deg; 旋轉餐廳推出星期一至四限定 $138 半自助午餐,包括沙律、精選餐湯、7 款主食選擇、3 款特色甜品,一邊睇靚景一邊食好嘢,絕對係極緻享受! 3.CTM 星級娛家優惠!hmvod 同 JOOX 依家申請即享首 12 個月月費 $28;hmvod 另外再送 120 張電影券俾您暢睇最新好戲!而 JOOX 可享豁免本地數據,任聽超過三千萬歌庫,體驗無廣告打擾, HiFi 高音質!即刻去 CTM Buddy app 申請喇~ hmvod:再送 120 張電影券俾您暢睇最新好戲! 精彩荷里活大片包括《蜘蛛俠:不戰無歸(加長版)》、《雷神奇俠4:愛與雷霆》、《迷你兵團2》! JOOX:豁免本地數據,任聽超過三千萬歌庫,體驗無廣告打擾, HiFi 高音質! 精選好歌包括:李榮浩〈獲獎人〉、TWICE《BETWEEN 1amp;2》、林家謙 〈邊一個發明了ENCORE〉 4.澳門雅辰酒店 澳門雅辰酒店嘅薈景閣咖啡室星期五至日,推出「嚐鮮自助晚餐」,包括新鮮生蠔、冰鎮海鮮刺身,更有威靈頓牛排、烤羊排等美食,每位$398起,而澳門中銀手機銀行用戶更尊享 8 折禮遇! 5.漁人碼頭巴黎餐廳 漁人碼頭巴黎餐廳買兩位自助晚餐送一位自助午餐優惠,每位 $328 起,包括多款環球美食,數量有限,送完即止!

《呂布 VS 本多忠勝》 - 人中呂布
走遍世界
幸村・2022-07-07

寫完曹操和信長的故事,休息了一個星期,絕對不是因為出了《魔物獵人》而偷懶,而是做資料搜集。 三國時代的故事早在日本戰國時代開始廣為流傳,這個異邦的故事更不斷地發展出別於中國的三國文化,加上出現的大量二創,例如最近很流行的『派對咖孔明』、『終末的女武神』等作品,都讓這些歷史人物的面孔煥發新生。 日本二創三國人物的豐富性,實在令我們驚訝,同時又不禁令人嘆息,為什麼在三國故事的發源地中國,卻沒有很好地發揮這些故事的IP? 日本人對歷史的重新思考,正是遊戲、電影、小說等帶來歷久彌新的火花。 呂布可說是日本人最人氣最高的武將,實力剽悍,說他是三國武力最強的天花板應該沒人有異議,連《終末的女武神》等作品都以呂布作為人類代表的第一戰,挑戰神的代表雷神索爾。 不過,讓呂布對上索爾恐怕不夠公平,挑戰雷神,換上任何凡人恐怕都打不贏,我們還是拿日本另一個號稱「無傷之鬥神」的本多忠勝和呂布較量。 首先看戰力,他們倆有多強? 先說呂布,《三國志》描述呂布「布便弓馬,臂力過人,號為飛將。」可說是和西漢初期戰神李廣齊名的稱號。 關於呂布的戰績也有不少,轅門射戟、三英戰呂布,不過最大的戰績是干掉義父董卓和丁原。 很多人知道轅門射戟很利害,技驚四座,在場的紀靈和劉備都目盯口呆,但到底射戟的距離有多遠? 很可惜,文獻沒有說,但我們可以推算,從營門到軍帳的距離,呂布的兵力大約一千二百人,跟據漢朝的軍隊編制,五人為伍、十人為什,十個人就有一個帳篷,帳篷之間有十步左右距離。 以一步1.5米左右計算,轅門射戟的距離,至少有九十米, 而現代奧運射箭項目的距離為七十米,呂布可說是東漢末年妥妥的奧運冠軍。 題外話,還有一個高手,自稱可以騎射一百五十米,還能左右開弓,曹丕在自傳《典論》中吹噓可以「逐禽輒十里,馳射常百步。」 有日荀彧問曹丕:「聽講你擅長左右開弓,英雄本色也是向你致敬的吧?」 曹丕回應:「那只是小把戲,荀叔叔還沒看過我在馬上也可以用口銜著箭向背後發射吧。」(項發口縱,俯馬蹄而仰月支) 荀彧笑笑口:「咁勁!」(彧喜笑曰:「乃爾!」) 曹丕是否真高手我們尚不可知,畢竟他也沒有真的露兩手。 可是呂布真的在眾人面前表演,在場人士無一不甘拜下風,齊拍手「將軍真天威也~」《後漢書 劉焉袁術呂布列傳》 再說三英戰呂布。 (星期四待續)

[議劇論映] 以神之名做盡壞事的惡魔 - 《神棄之地》
娛樂殿堂
君尋・2020-12-21

演員名單亮眼到讓人無法勿視的Netflix電影《神棄之地》,不但由漫威電影中的新世代蜘蛛俠Tom Holland主演,以及美國隊長中的寒冬戰士Sebastian Stan飾演重要角色,還有下一個蝙蝠俠,亦即《暮光之城》男主角的Robert Pattinson飾演墜落的神父。但這一眾星光熠熠的演員合演的,卻是一套充滿絕望,悲慘氣氛由頭滲透至尾,幾乎讓人窒息的電影。故事發生在美國60年代東部的一個小鎮,鎮上的居民對信仰都非常虔誠,正如中文劇名所透露,上天對於他們的渴求卻非有求必應,不管怎樣渴求,不幸的事依然會接兩連三的發生。 男主角生於美滿幸福的小家庭,卻在從小長大的過程中,眼看著自己身邊一個又一個的至親離世。他的家人非常依靠信仰,反導致主角從小對信仰失去信心。諷刺的是當他長大後,鎮上卻有人以信仰之名做出「過界」的行為,認為自己的「罪」必然會被獲得「寬恕」。甚至有人挑戰「信仰的力量」,殺人後冀望對方能死而復生。但他們從不知道自己已偏離正軌成為「惡魔」。 《神棄之地》選擇用一種接近群像劇的方式述說故事,主角在畫面上佔的時間並不突出,觀眾有機會了解其他重要角色的行動背後的動機和心態的改變。因此當觀眾以神的視角看到鎮上發生的事時,不禁悲嘆這些無法脫離被「信仰」牽著走的人的命運。 關於議劇論映 本欄目將會分享日本及歐美的影集和電影。除最新上映及流行的作品外,亦會推薦值得回味的滄海遺珠。 更多本欄目相關的內容可按:httpsppt.ccf6n5yx

[翻書倒櫃] 和食古早味
文化創意
君尋・2020-09-30

由極具代表的壽司,到主食的炸豬扒飯、鰻魚飯、天婦羅、懷石料理,以至麵類的拉麵、蕎麥麵,甚至乎日本威士忌等,這些縱使人不在日本,依然能輕易品嚐得到的常見美食,在全球化的時代下對我們來說都毫不陌生。不過關於這些料理的起源及歷史,我們又瞭解多少?《和食古早味》一書介紹的不只是這些食物的歷史,更是關於這些食物的故事。你有曾想過,天婦羅和拉麵等非常受外國人歡迎的料理,原來是受外來文化影響,再由日本人轉變為本土的料理嗎而日本人自古以來對自然、食物的尊敬與感謝,亦影響他們如何使用土地上的天然食材,並烹調出最適合的料理。此亦即日本人所謂的「地區限定」、「季節限定」,新澙的越後米、信州的手打蕎麥麵正是代表,絕非只是流於表面的宣傳口號。在故事當中不可或缺的角色就是人,作者與多位被日本人稱為「人間國寶」的料理大師會面,從這些全心全意投入於料理世界的職人身上,窺探這些繼承「江戶味」的料理背後的文化脈絡。 本書介紹的除了是食物,更是日本的一種文化史。幾乎可說是代表現今日本料理的握壽司、天婦羅及拉麵,幾乎都不是日本自古以來的「傳統食物」。壽司是源於古時候未有冷藏技術前,將米發酵再用作保存海鮮的一種的技術。亦因此當時的壽司重點在於魚而不是米。壽司在不同年代和不同地區有各自的流派和製作方法。直到江戶時代,人們對在外吃飯有一定需求,在屋台販賣的速食「握壽司」開始成為各款壽司流派的主流,而為了填滿客人的肚子,壽司中米飯的比例亦變得像今天所見的大小。而在屋台的吧檯看著壽司師傅的精湛手藝製作壽司的文化,就演變為今天的「板前」。與此同時,因對食材的鮮度亦有一定要求,高級的壽司師傅都會使用江戶灣(即現今東京灣)捕捉到的新鮮魚獲,而此亦即是高級壽司「江戶前」的起源。這種握壽司能成為流傳後世的唯一壽司流派,全因德川家康能一統天下並定都江戶,其後爆發性的經濟增長讓江戶成為超級大都會,才因而出現上述提到的背景和原因。整個壽司的歷史,與政治、經濟因素不無關係。除此之外,和製洋食的日式炸豬扒及天婦羅的誕生,是日本與世界接軌的足跡。理所當然一般存在於日本各處的拉麵店,卻是二次世界大戰對日本造成的影響之一。日本的和食文化有源遠流長的歷史,一邊吸收外來的產物和技術,一邊遵循傳統對食材的尊重,形成大和民族的料理體系。而當我們能深入瞭解其中的演變過程,便更能明白到當今日本獨特文化的本質。 關於今回翻書倒櫃的推介書本: 書名: 和食古早味:你不知道的日本料理故事 作者: 胡川安 出版社: 時報出版