Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-addons-for-gutenberg domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /opt/bitnami/wordpress/wp-includes/functions.php on line 6114
Coding - 八寶周的研究小屋

Category: Coding

0. 前言


在 AI 萌發的世代越來越多組織投入到模型的訓練,不只企業專用還有免費開源。相對於使用網頁產品受到代幣或會費的限制,在擁有夠力的設備下,我們也能夠自己運行略為遜色但免費的服務。

趕緊來看看如何在本地設置環境準備運行開源模型吧!

1. 重點


CUDA 版本建議較新版本,涉及到系統與外部程式支援的程度
PyTorch 相容的 CUDA 稍晚於 NVIDIA 最新發布的版本
PyTorch 不同的套件版本兼容不同的 CUDA 版本

2. 內容


2.1. 檢查 CUDA

針對所使用的 NVIDIA GPU 設備,我們必須另外安裝 CUDA Toolkit 讓電腦知道顯卡的位置以進行使用,若沒有經過正確的流程則沒法正確驅動,變相使用 CPU 而非 GPU 導致很多人抱怨執行時間過長。

關於如何選擇 CUDA 版本,我們首先到【顯卡與運算兼容】找到自己顯卡的 Compute Capability 數值,如我的設備在下圖標註處而其數值為 8.6 ,相對屬於較新的資源(本篇完成時最新為 9.0)。

接著我們到【架構與對應版本】看到表格,找到對應的 Compute Capability 以及其支援的 CUDA 版本間距。可以看到較舊的型號不再維護,而目前多數則支援到最新的版本,但最低的支援版本各不相同。

ArchitectureCUDA CapabilitiesFirst CUDA Toolkit SupportLast CUDA Toolkit SupportLast Driver Support
Fermi2.0CUDA 3.0CUDA 8.0R390
Kepler3.03.2CUDA 6.0CUDA 10.2R470
Kepler3.53.7CUDA 6.0CUDA 11.xR470
Maxwell5.05.25.3CUDA 6.5OngoingOngoing
Pascal6.06.1CUDA 8.0OngoingOngoing
Volta7.0CUDA 9.0OngoingOngoing
Turing7.5CUDA 10.0OngoingOngoing
Ampere8.08.6CUDA 11.0OngoingOngoing
Ada8.9CUDA 11.8OngoingOngoing
Hopper9.0CUDA 11.8
CUDA 12.0
OngoingOngoing

版本差距不只在於系統的變動,同時有包括外部程式的兼容性,因此還是建議安裝較新的版本。比如【此篇詢問】也是我所遇到的議題,本來 CUDA 11.7 跑得好好的,由於其他程式需要更新 Visual Studio 2022 結果就導致專案錯誤,加上 Community 版沒法回朔,只好加裝新的 CUDA,順道就寫下這篇記錄。

2.2. 匹配 PyTorch

確認完 CUDA 版本後別急著下載最新版,畢竟涉及 CUDA 的系統變動與套件維護,PyTorch 支援的版本與 NVIDIA 最新的版本難免形成差距。

來到【PyTorch 官網】稍微往下滾動,壓下 Get Started 進到安裝介面。

按照自己的設備與需求設定後,底層將會產生安裝的指令。此時注意到指令末端有 /whl/cu124 字樣,在安裝過程中該 PyTorch 內建只會尋找 CUDA 12.4,因此安裝 11.8 或 12.6 都是沒法正確運行的。

在部分 HuggingFace 或 GitHub 開源模型的安裝方式中可能存在 –index-url 之參數,此時我們就必須額外安裝其他版本的 CUDA Toolkit 避免 PyTorch 套件版本不同的差距引發錯誤。

2.3. 安裝 CUDA

再度回首來到【CUDA Toolkit Archive】並選擇 PyTorch 的對應版本,接著依照系統選擇並開始安裝。

等到下載器準備好就能夠執行,過程中維持預設即可,慢慢等待安裝完成即可。

安裝完成後我們開啟 powershell 並輸入 nvidia-smi 指令,此時應該能跳出當下的顯卡資訊。

(卸載不完全,導致 CUDA 版本顯示為 12.6)

2.4. 安裝 PyTorch

建議使用 venv 進行環境的分隔,隨著專案越多雖然占用大量的儲存空間,但相對好集中管理,且避免不同專案的套件版本發生衝突。

我們複製在 2.2 取得的指令並開始進行漫長的安裝,在等待期間我們先建立一個 Python 檔案等會用來檢測系統設備。簡單解釋一下邏輯,當 CUDA 支援時則會使用 GPU 並回報首個設備的資訊,否則使用 CPU 。

Python
import torch
import logging

# Set up logging configuration with a prettier format
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger()

# Define the dashboard border
border = "=" * 60
section_divider = "-" * 60

# Check if GPU is available and set the device
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Print device type (GPU/CPU)
logger.info(border)
logger.info(f"⚙️  Using Device: {device.type.upper()}")
logger.info(border)

# Additional info when using CUDA (GPU)
if device.type == "cuda":
    gpu_name = torch.cuda.get_device_name(0)

    total_memory = round(
        torch.cuda.get_device_properties(0).total_memory / 1024**3, 1
    )  # Total GPU memory

    logger.info(f"🖥️  GPU Name: {gpu_name}")
    logger.info(f"📊 Total GPU Memory: {total_memory} GB")
    logger.info(border)

確認 PyTorch 安裝結束,我們就來測試看看是否能讀取到顯卡資訊。

Python
python <上述 .py 路徑>

3. 後話


當我們確認好正確安裝與配置後,就可以安心地進入模型開發與探索的階段了。

無論是進行深度學習的訓練,還是處理其他複雜的計算任務,擁有良好的驅動環境將確保你的工作流程順暢無礙。未來就讓我們一起探索模型的潛力,開啟 AI 領域的全新旅程吧!

  • MC 煉金工藝 – 音效配置與音訊導入

    MC 煉金工藝 – 音效配置與音訊導入

    0. 前言


    在遊戲中加入音訊不只帶動遊戲感,如果加上劇情對話還能帶來劇情張力並引導遊玩速度。

    透過 /playsound,趕緊看看如何透過生成工具簡單達成以上的目的吧!

    1. 重點


    該指令是在地點觸發,不會隨著物體移動
    音量的 volume 參數在 > 1.0 的情況去 x16 則代表是傳聲的距離,最小傳聲距離是 16 格
    最小音量是指傳聲範圍之外的常態音量,而非範圍內的最小音量

    2. 內容


    2.1. 解說 – 指令的整體架構

    關於 /playsound 的架構也不複雜,但最基本的情況下建議還是使用以下方式,因為在正常情況下我們是從某個地點或物體去發出聲音,所以 Selector 的設定相對重要。而如果製作的地圖中有版權音樂或音效,要讓直播者避開風險,通常建議放在 music 或 record 兩個相對較少人開啟的音軌。

    Python
    /playsound <聲音特效> <音軌> <SELECTOR>

    而除此之外還有一系列的參數可以調整,首先 /playsound 該指令是在「位置」進行傳聲並非跟著物體移動,因此自由活動的情況下並不適合長篇的音檔。音高的部分在 Java 版能從 0.5 ~ 2.0,上下 1 則代表是八度音的距離,而提高同時會讓聲音變得急促,反之拉低會讓音訊延長。

    而 volume 的設定從 0.0 ~ 1.0 是調整音量,但超出 1.0 後則會 x16 代表傳聲的距離,而傳聲的最小距離就是 16 格,而在傳聲範圍內離發聲地點越遠漸弱。末端的 minVolume 從 0.0 ~ 1.0 的數值實際上是在撥放範圍之外,玩家所能聽到的音量。所以假設 minVolume = 1.0 的時候,在超出撥放範圍外的音量反而比在圈內外圍還大聲。 這時候最好的限縮方式就是透過 Selector 搭配 distance 標籤進行塞選。

    Python
    /playsound <聲音特效> <音軌> <SELECTOR> <x> <y> <z> <音量/距離> <音高> <圈外音量>

    2.2. 實作 – 為材質包導入自訂義的音檔

    在影片中我們有稍微帶過以下這些可用的介面化工具

    【音效】Stable Audio, Meta Audiobox

    【語音】TTSMaker

    那這邊額外補充幾個工具給具有 Python 經驗 + GPU 的朋友

    【音效】AudioLDM2, Stable Audio Open

    【語音】speecht5_tts

    這次需要用到在 versions 檔案看不到的材質包屬性,首先將 .ogg 音檔放入到 sounds 資料夾目錄之中。

    另外建立一份 sounds.json 並進行編輯,這份檔案才是實質標註音訊的設定。各位可以參考以下的格式達成最基礎的設定,最主要會要設定 Sound Event ( 識別字串 ) 以及 name ( 檔案路徑 ) 。關於 stream 的串流設定建議設為 true 避免讀取完整大檔導致的 lag 。

    Python
    {
        "識別字串": {
            "sounds": [
                {
                    "name": "檔案路徑",
                    "stream": true
                }
            ]
        },
        "speeches.opening": {
            "sounds": [
                {
                    "name": "rpg:speeches/opening",
                    "stream": true
                }
            ]
        }
    }

    完成之後來到我們的遊戲之中,裝上材質包,最好再按下 F3 + T 重整一下。此時我們輸入指令應該要能看到我們自訂義的音檔,並可以正常進行撥放。

    2.3. 實作 – 將 MIDI 轉為音階盒樂曲

    我們透過 Open Note Block Studio 去讀取 MIDI 並轉換成音階盒格式,導入的時候麻煩維持 1x 並記得勾選 Read Note Velocity 進行音量調整。

    這邊提供範例使用的千本櫻 MIDI 音檔

    完成讀取後,由於通常公開的 MIDI 都已經調整好設定了,我們就透過 File >> Export as datapack ,等待一段時間直到有個視窗彈出才算完成。

    接著我們就能將 musicbox 這個資料夾移到我們自己的 Datapack 之中,此時記得將 load 與 tick 添加到 minecraft / tags 的兩份設定之中,最後記得若為 1.21 記得將 Namespace 底下的 functions 改為 function 該新的名稱。

    完成後就能到遊戲 /reload 開始測試,我們主要操作就是 play (撥放), pause (暫停), stop (停止) 上述三種,各位能注意影片中的記分板數值。

    3. 後話


    快速複習下本篇內容,指令的架構與基礎,再來添加自己的音檔,最後轉換 MIDI 並轉為音階盒樂曲。

    那下次我們終於要進入到 Ground Crafting,透過 execute 製作視覺化的合成效果。

    4. 參考


    [1] sounds.json 格式 — Minecraft Wiki
    https://minecraft.wiki/w/Sounds.json

    [2] playsound — Minecraft Wiki
    https://minecraft.wiki/w/Commands/playsound

  • MC 煉金工藝 – 粒子效果與旋轉法陣

    MC 煉金工藝 – 粒子效果與旋轉法陣

    0. 前言


    無論是在冒險地圖中製作生動的場景,或是為技能設計絢麗的動畫,/particle 指令都能派上用場。透過粒子效果可以大大提升遊戲的沉浸感,讓你的創意在遊戲中得以充分展現。

    那我們這篇我們會進行 particle 的基礎知識到進階設定,順帶簡單實作,馬上就來看看吧!

    1. 重點


    delta 用於指定粒子效果的範圍,並受 count 影響進行排列
    delta 在 count = 0 時通常用來指定 Motion
    force 不僅是增加視野距離,還可強迫在 Minimal 設定之下顯現粒子

    2. 內容


    2.1. 完整解析

    2.1.1. 粒子效果的特性

    在遊戲中粒子效果是以 2D Sprites 形式呈現,因此無論玩家如何移動它們總是面向玩家。而在短暫的動畫過程中可能會變換大小和旋轉,並去循環 Sprite 動畫。

    多數粒子是可以穿過牆面的,而部分粒子(ex: 煙霧)則與實心方塊碰撞,並在蜘蛛網中會被減速,但它們並不受其他實體的影響。

    另對於遊戲機制有影響的粒子效果基本還會顯現在 Minimal 設定之下。

    Sprite

    Sprite 是電腦圖形和遊戲的術語,指整合到場景或環境中的 2D 圖像或動畫。通常由多張不同動作的圖片組成循環動畫,避免遊戲角色在螢幕平移的滑稽情況,且可透過越多的禎數提供流暢的動態感。至今仍大量運用在 Platform, 2D RPG 等平面遊戲,到了 3D 則多都改由骨架進行控制。

    圖片來源: Sunny Land on itch.io
    2.1.2. 粒子效果的生成

    簡單認識粒子的特性後,我們就能夠進一步開始透過指令進行更好的調整囉。

    那由於涉及視覺設定上的觀感設定,我自己基本不會使用最基本的語法,能調整的太少了。

    Python
    /particle <particle_name> ~ ~ ~

    那另外一種較詳細的寫法中,我們能夠進一步調整粒子的數量, 呈現範圍, 速度, 視野距離, 強制顯示, 可看見者,相對有非常多的調整。

    Python
    /particle <particle_name> ~ ~ ~ <delta> <speed> <count> [force|normal] [viewers]

    在座標後方各位千萬別依照 Hint 乖乖地輸入座標。

    這個 delta 區塊主要用來表示要呈現粒子效果的區域,而其中心區域就是我們前面指定的座標。而這邊的數值被放大了 8 倍,所以想要呈現在一格之中我們則要設置為 .125 .125 .125,而後方的 count 除了影響數覺效果外還能用來辨別例外。

    接著先跳過來看 count 也就是粒子的總數,最高可到 32 bit 但前提是你的電腦承受的住。正如我們在 RPG 地圖 Boss Fight 難免遇到粒子效果造成的當機攻勢,生成越多粒子往往對玩家是種負擔。

    而粒子會在 delta 的範圍內隨機擺放,以下為從左到右的指令範例。可以發現即使再多的粒子在同個地點也沒有多少用處,而在 delta 的直徑範圍內除了縮放外還能針對樣式做調整。

    Python
    /particle flame ~ ~3 ~ 0 0 0 0 100 normal
    Python
    /particle flame ~ ~3 ~ .125 .125 .125 0 100 normal
    Python
    /particle flame ~ ~3 ~ .125 .5 .125 0 100 normal

    但在 count = 0 的時候不是沒有粒子,在此時的 delta 則等同於 Motion 設定,配合 speed 從隨機擴散變為直線射出粒子。

    針對音階符與 entity_effect 則用來決定粒子的顏色,色彩數值由 delta x speed 進行計算。

    那 speed 概念正如其名代表粒子的移動速度,但其活性視粒子效果反而不同。在下方的範例中分別是速度 0 與 0.05 來呈現火焰,可以看到在 0.05 的狀況下火焰就已經明顯向外擴散。

    但也不是說速度越高一定越糟,有些比較遲鈍或會下墜的粒子效果反而要到 1 才會變平常所見的樣貌。

    另外當然也有完全不受影響的案例。

    後方兩項都是選填的針對玩家的顯示設定,本身的預設值分別為 normal 與 @a ,但我自己習慣上還是加上 normal 提醒自己這邊還有參數可以設定。

    在 Minecraft Wiki 之中雖然只寫到 normal 與 force 用於顯示於 32 或 512 格之距離。

    但 force 還可強制在 minimal 設定下也看到效果,適合針對地圖製作中必要的元素避免影響遊戲。

    最後尾端的設定則常用於遊戲分組的時候,比如殺手或間諜能夠獨立看到特殊的機關進一步幹些壞事。以下範例以 tag = viewer 進行呈現。

    Python
    /particle flame ~ ~3 ~ .125 .5 .125 0 1 normal @a[tag=viewer]

    2.2. 實作體驗 – 旋轉法陣

    2.2.1. 活用工具

    首先到 GitHub 下載【該工具】,麻煩注意系統需求的部分,各位可能還要額外安裝 .NETCore 3.1 才能執行。

    接著我們能夠到【該網站】下載圖檔,習慣性按下 Preview,接著依照以下設定。

    簡單講解下齁,我們首先設為相對座標,這樣法陣才能夠進行旋轉。而為了放在地面則設為 Z-X 。接著將法陣對齊中心,並取消 Autosize 直接設置直徑為 4 。

    接著開啟 More Settings 調整粒子效果,那範例這我使用的是附魔文字的 enchant,並且將顯示設定改為 normal,就可以輸出 mcfunction 。

    接著到專案目錄進入 functions 目錄之中,複製與檔名相同的檔案。

    2.2.2. 指令測試

    接著貼到我們的 Datapack 之中做成 function 在遊戲中進行使用。那方便起見我們就偷懶用下指令方塊進行測試。

    我們首先準備一個 Repeat 指令方塊,讓盔甲座持續的旋轉。

    Python
    execute as @e[type=minecraft:armor_stand] at @s run tp @s ~ ~ ~ ~6 ~

    接著在後方接個 Chain 指令方塊,在盔甲座底下秀出魔法陣。

    Python
    execute as @e[type=minecraft:armor_stand] at @s run function |YOUR_FUNCTION|

    大功告成!會旋轉的法陣就是如此簡單,對於地圖擺設或技能特效都十分實用。

    3. 後話


    靈活運用這些粒子效果,你可以創造出極具視覺衝擊力的場景,並將你的想法具象化為動態效果,讓你的 Minecraft 創作更上一層樓。

    那由於篇幅關係,我們將 /playsound 拆出額外進行解說,另外也有準備額外實作進行音樂的添加,各位可以期待一下。

    4. 參考


    [1] Commands / particle — Minecraft Wiki
    https://minecraft.fandom.com/wiki/Commands/particle

    [2] Image Particle Generator – by Legitmoose
    https://www.youtube.com/watch?v=1DjAt-WuJFA

    5. 額外


    [1] Animated Particle Plotter – by Cloud Wolf
    https://www.youtube.com/watch?v=YFDo5Inn7x8

  • AWS – Billing and Cost – 計費與預算警報

    0. 前言


    隨著企業越發依賴雲端服務,管理和優化雲端支出的重要性也日益增加。

    而 AWS Billings 為用戶提供了一個全面而透明的計費管理服務,使用戶能夠清楚地了解其 AWS 資源使用情況,並作出明智的財務與優化決策。

    1. 重點


    AWS 在每日進行計費
    預算警報可設置在超出特定數值與 % 之時通知
    AWS 在每月三號收費

    2. 內容


    2.1. 開銷報告

    我們租賃 Amazon 機器總該付錢的,那我們又該到哪邊檢查呢?我們又如何知道哪個服務最燒錢呢?

    2.1.1. 開銷總攬與基礎設定

    我們從用戶的設定選單中我們找到 Billings 並進入介面。

    此時系統會將我們導引到成本管理的介面,這邊我們能快速看到這個月目前與後續預測金額,以及與上個月的比較。若我們想看到過往紀錄與細項服務的使用情況則必須到 Cost Explorer 進行。

    接著在左側選單找下 Cost Explorer,此時作為新帳戶的各位可能還沒有任何資料,會顯示藍色的提示框請 24 hr 後再嘗試。

    這邊我們可以調整統計時常以及統計時間,那預設情況只能顯示 1 年內的資料。而現版本的預設狀態好像是半年以月統計(我剛接觸的時候是單月每日)。此時滑鼠移到圖表上會顯示該間距各服務的花費。這邊要注意 Hourly 的資料採集是「付費功能」,沒有即時需求就不用開通!

    這邊我也順便訴苦下,可以看到維持我這 Blog 的 Lightsail 服務在 2024 五月後由於加收 IPv4 費用漲價了,各位不給獨自營運的我個好評嗎?

    要顯示到最久 38 個月的話我們需要開啟額外設定,必且 1 年以前的資料是指能開啟 Monthly Basis 的。那反正該功能是免費的我是習慣性開啟拉,畢竟比起到信箱調閱每月的帳單來的快速。

    完成設定後記得到頁面下方壓下 Save preferences 才會儲存設定喔,那這邊在處理期間是沒法做修改的。

    2.1.2. 給予子帳戶權限

    但在預設情況下所有子帳戶都是沒有權限瀏覽的。

    此時能夠在 root 帳號調整設定,變更為擁有 IAM 權限的母子用戶都能夠操作。

    進到資訊介面後我們往下滑,找到 IAM user … to Billing information 並將其開啟。接著重新

    等它生效要一段時間,可以先去樓下裝杯咖啡再回來啊 ~ 接著就是瘋狂地刷新。

    2.2. Free Tier 用量

    這邊我順道為新 AWS 用戶介紹下,同樣在 Billings 中的左側選單找到 Free Tier 進入介面。這邊會顯示你目前使用那些能折抵的服務,以及目前的使用量。

    詳細的資訊可以到【官方介面】進行了解,另外要注意有些是全年或每月統計。

    2.3. 預算警報

    阿我有 Free Tier 折抵我的費用,真的有需要擔心破費嗎?關於錢的事自然不能馬虎,但不乏疏漏的時刻。這邊案例是我在自學過程中就曾發生過操作失當多噴了近 15 USD 。

    假設當時我沒有設定警報,還是在月初的情況,我那個僅 30 日的試用不但浪費掉,此時用 26 日的 9 USD 隨意算一下,還要多付高於 270 USD,你說重不重要?

    預算警報主要有兩種作用,一種是當費用破表時寄送信件通知用戶,而另一種則是在超過 N% 的時候。

    2.3.1. 設置警報

    進到 AWS 介面之後我們就點擊用戶名稱開啟設定選單,這次選擇 Billing and Cost Management 進到關於花費的設定介面。

    在左側的選單我們下拉在 Budgets and Planning 找到 Budgets,接著進到該介面之中。

    首次進到頁面之中大概是這種版面,我們看向右側並壓下 Create a budget 按鈕。

    這邊我們選用 Advanced 進行建置不然少了許多功能。接者選擇針對開銷的 Cost budget 並進下步驟。

    我們就先不管右側的 Budget Preview 並關閉,這個視窗主要的用途只是讓我們去評估後續的預測。關於名稱的設定就自己能懂就好,這便範例就使用 10 美金作為界線。

    下面我們維持預設按月統計。而其底下的 renewal type 則是說該預算警報的形式,是無限期的重複啟用,還是有時效性的(專案)預算。

    從何時啟用我們也先不動,預設就是從本月開始計算。至於金額規則我們使用 Fixed 並固定為 10 美金。

    我們這邊同樣保留預設去統計所有 AWS 服務之支出金額。

    進到下個步驟我們新增門檻。

    範例這邊我們設為 Actual 的 80% 時會寄信到指定信箱,而 eMail 通知最多支援十人,否則就要倚靠另外兩個方式進行建立。

    而除了 Actual 還有 Forecasted 的觸發方式,相對提早預估異常的發生,但在月底的時候也很容易誤觸。

    再來就是過往沒有的功能,我們實際上還可以設定當觸發警報時會去執行甚麼動作。透過 IAM Role 給與權限去調整 IAM Policy 或者關閉 EC2 與 RDS 的 VM 資源。

    我們就先不操作這塊進入下步驟。

    再度確認一切設定,完成後就可以進行建立,如此當隔日計費時超過 8 與 10 USD 時都會寄送警告信。

    3. 後話


    初步觀察 Cost Explorer 後更能知曉與預測後續的花費,並結合 Budget 提醒用戶發生評估之外的異常狀態。但在參加取多官方活動時拿到了不少的折抵券,我們又如何進行兌換呢?

    下回快速的來看看吧!

    4. 參考


    [1] Grant access to the billing console – AWS Doc
    https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-set-up.html

  • AWS – Identity Center – 分配組織帳戶與 Single Sign On

    0. 前言


    在組織間需要確保其應用程式和資源的訪問既簡便又安全。為解決過往 IAM 的管控問題與 AWS 本身沒有專案設計的問題,Identity Centre 提供了一個集中化的平台,簡化了身份和存取管理。

    1. 重點


    能夠邀請非 AWS 用戶使用組織的 AWS 帳戶
    除允許用戶登入到主控台外,還能夠綁定 SaaS 應用
    登入用戶擁有 Session 連線時長限制,並會刷新一組 Access Key

    2. 內容


    2.1. 關於 Identity Centre

    AWS IAM Identity Center(前稱 AWS SSO)是一項由 AWS 提供的身份和存取管理服務,幫助企業管理雲端和企業應用程式的用戶訪問並確保安全和合規。其支援並可自由替換 SAML 2.0 之 SSO 驗證商,也不用擔心系統轉嫁的議題。

    而 SSO (Single Sing-On) 的是讓使用者一次性針對多個應用程式和服務進行驗證的方法。其概念在於使用者只需在單個登入介面驗證就可以使用多個應用程式。

    生活案例

    現今越來越多的餐飲店引入 LINE 掃碼點餐,此時用戶的資料收錄在平台提供商的資料庫,此時可以依靠你的 LINE 帳號進到同供應商底下的其他餐廳進行訂餐,不用另外註冊新的帳戶。

    IAM Identity Centre 接手管理 Organization,在組織中不同於 IAM 直接將權限配給 Group / User,反而是在分配帳戶時才綁定權限,以此來避免管理員忘記過往的群組配套權限而造成失誤。透過該方式允許的用戶能透過 Portal 登入後進行多支子帳戶的管理。

    2.2. 建立組織與成員

    雖然說組織除了配與權限外還能透過 Applications 給予 SaaS 的服務權限,但設定上有不少步驟,我們今天就專注在權限的設置。

    2.2.1. 建立組織

    我們首先在搜尋欄中查詢 IAM 並找到 Identity Centre 並進到其介面之中。

    在 Identity Centre 中首先會需要建立一個 Organization,而此時選擇的地區也就是之後的總部位置,那為了降低網路上的連線延遲,請確保所在地區為日本東京(2025 年後者可考慮 Asia Pacific (Taipei) 臺北地區),因為建立之後我們是沒法輕易改變組織區域的。

    此時會跳出一個視窗要你選擇模式,我們維持預設即可,右側的主要是給企業做為體驗,可以看到許多功能都沒法使用。

    再來稍等他介面生成一段時間,完成之後就會導到主控介面了。

    此時若我切換到其他 Region 就會跳出錯誤的訊息並無法進入管理介面。這邊表示很清楚組織只能存在於一個地區,若要遷移的話我們必須先「刪除」再「重建」。

    2.2.1.1. 更換 Portal URL

    在預設情況下 Portal URL 由一組亂數的 sub-domain 組成,那我們實際上是可以自行修改 sub-domain 的分支名稱的,在 Settings Summary 中找到 Portal URL 並按下 Edit 。

    這時會跳出一個視窗,我們只要將想要的名稱輸入格內並重複確認即可。但這邊很重要!一旦修改過後就無法變動了,只能整個 Organization 重建或透過自己的 DNS 做 CNAME 轉接,各位請好好考慮。

    2.2.1.2. 替換 Identity Provider

    我們講到該服務系統本身支援 SAML 2.0 的 SSO 提供商,有需求的就這邊來看下怎麼替換。

    那當然事後若你相信或想整合在 AWS 的系統也是可以換回的。

    2.2.2. 建立成員

    我們有了組織之後總要新增些成員,我們進到 Users 分頁並於右上方壓下 Add user 新增 User 。

    基本每次避不開的就是先取資源的名稱,而這邊將會是我們未來慣用的登入帳戶,就交給各位自行命名了。接著填寫受邀請者的 eMail 信箱,這邊不論是否有註冊過 AWS 都可以使用進行使用。

    這邊的屬性除 Username 之外後續都可進行修改,還能透過該方法進行帳戶轉交。

    接著繼續填寫的是受邀請人的名與姓,這邊的 Display Name 是管理員在管理 Organization 時能看到的樣貌,但該用戶登入介面後只會看到 First Name,若想設定為暱稱的話要注意一下。

    這邊提醒下若組織有透過前面提到的 Applications 發配 Office 365,記得需要在 Additional Attributes 中給予該用戶一組用於登入的序號。其餘部分基本就是完善用戶資訊的設定,這邊我們就先跳過,直接點擊 Next 進下個步驟。

    我們後續按階段慢慢來,這邊我們直接先按 Next 進下一步驟。

    接著檢查自己的帳戶設定是否有誤,若完成後就到最底層按下 Add user 新增 User 吧。

    完成之後就能看到新的 User 在介面之中囉,我們在這邊可以看到所擁有的所有 Username,並透過 Display Name 去方便管理人員看說是誰或做啥用的帳戶。那 Status 有 Enabled 自然也有 Disable,我們先接著點選 Username 進入管理介面。

    在最頂端的 General information 區塊就能看到有個按鈕能夠 Disable 用戶狀態,那過程中我們還沒去驗證信箱因此會有回色區塊的提醒,接著就去收下認證信唄。

    來到信箱應該有收到一封來自 no-reply 的 AWS IAM Identity Centre 邀請信件,那我們不疾不徐的原因就在於其效期長達 7 日,那這這信上還會附有帳號資訊與登入連結。接著我們就按下 Accept invitation 接受組織邀請並設置我們的密碼吧。

    那由於我們在建立過程中沒有調整設定,使用預設情境讓收到邀請的用戶自己去設置喜歡的密碼。

    當我們首次為 User 註冊密碼後就會顯示以下建立完成的通知,接著導回到 portal 登入介面。

    我們先嘗試登入這個新的用戶,此時我們會被強迫要幫該帳戶綁定 MFA 設備。

    完成綁定之後我們若登入帳戶進到資源介面,但由於並沒有賦予任何權力給該帳戶因此會是空的。

    2.2.3. 建立 Group

    群組的概念在於其底下的用戶能被快速概括選取以及調整設定。接著在左側的選單中找到 Groups 並在其頁面右上方壓下 Create group 進行建置。

    那在下方的範例我就取作 Admin 作為示範,該群組名稱代表擁有 AWS 所有資源之管理權限。但在過程中各位應該知道我們並沒有配發權限,關於這部分則是 Permission Set 進行處理。

    那後續有需要變更的情況下我們能點擊群組名稱進入管理介面。

    並在這邊進行用戶的補登。

    2.3. 賦予用戶權限

    再來我們就要真正的賦予用戶權限並給予到指定帳戶的管理權限。

    2.3.1. Permission Set

    同樣在左側選單中找到 Permission Sets 並透過右上角的按鈕進行建置。

    在設定過程中我們有兩種配套方法,第一種是使用官方預設的權限組,雖然可以快速建置但會缺乏細粒度調整,我們待會就來體驗另一種。

    我們在頁面的上方選擇 Custom 後進到下一步。

    在這邊怎麼樣?我們又來配置 IAM Policy 啦!這邊有三種方式,包括直接書寫,用戶客製化的以及官方預設的。我們這邊使用預設的並選擇最大的 AdministratorAccess 後進下步驟。另外一樣我們是能設置 Boundary,但我們先跳過並進下一步。

    在這邊我們同樣簡單命名我們的資源為 Admin,那這邊要注意的是 Session duration 代表每次用戶的連線時間,這邊建議各位設久一點,不然操作資源到一半被強制登出肯定滿肚子火。

    而上述的 Replay state 則是用戶登入後該自動跳轉到什麼介面,比如我們使用該網址的話則會自動導引到 US – Ohio 地區並在 EC2 的管理介面上。

    HTML
    https://us-east-2.console.aws.amazon.com/ec2/

    我們接著到下一步驟進行檢查,確認完成後就可以建置了。

    2.3.2. 分派權限

    我們接著就來配與組織用戶到指定帳戶下進行權限的操控吧,首先在左側選單看到 AWS Accounts,這邊彙總覽所有組織擁有的帳戶,但因為我只是一般個人我就只示範操作單個帳戶。

    這邊我們先選取我們要配給用戶(群組)權限的帳號後壓下右上角的按鈕。

    那範例這邊我們就授權給所有在 Admin 群組的用戶,這樣未來我們只用把新的 User 加到群組即可。

    再來勾選我們的 Permission Set,可以看到直到這個步驟我們才配與權限給用戶使用。

    再來下一步就是確認設定,瀏覽無誤後就可以完成設定了。這時會跳出一個提示框說明正在建立,並請用戶不要離開本頁面。稍等一下就會完成建立了。

    完成之後我們回到我們的 SSO 介面並嘗試 F5 刷新,此時是部會有任何結果出現的,因為我們的 Session 仍保持再更新前的狀態。必須登出後再重新登入,此時應該會多出一條資源。

    點選開來之後,左側的按鈕能進入網頁主控台,其名稱由 Permission Set 來決定。而右側按鈕則是生成 “本次 Session” 的 Access Key,相對於 IAM 固定的更加安全。

    進到網頁控制台後我們留意下右上角,應該會是 Permission Set 搭配 Username 的樣式。這樣就代表我們成功的分派 Identity Centre 之帳戶給用戶,完成本次的實作。

    3. 後話


    我們成功分出 SSO 的組織帳戶了,但目前有個嚴重的問題在於預設情況下 Billings 是不公開給子用戶的。那麼我們又要如何啟用呢?順道來設置我們的預算警報吧!

    4. 參考


    [1] What is SAML – Cloudflare Learning
    https://www.cloudflare.com/learning/access-management/what-is-saml/

    [2] Customizing the AWS access portal URL – AWS Doc
    https://docs.aws.amazon.com/singlesignon/latest/userguide/howtochangeURL.html

  • AWS – IAM 架構與用戶分派

    AWS – IAM 架構與用戶分派

    0. 前言


    權限管理一直以來是最重要的議題,攸關安全性與組織性。

    那我們就來看看 IAM 到底如何組成以及如何分派權限吧!

    1. 重點


    IAM 可用來賦予用戶或資源執行權限
    目前官方建議以 Identity Centre 取代 IAM 來建立與管理子帳戶

    2. 內容


    2.1. 關於 IAM

    該服務用於安全管理 AWS 資源的訪問權限,控制用戶是否能訪問特定資源以確保安全和規範。

    在普遍的 IAM 架構我們會有 Policy 去綁定多個 Permission,而我們可以配套給 Group(群組)與 User(個別),另外針對 AWS 服務則是配與 Role(角色)。那在下圖我就配上生活案例搭配解釋。

    而在除了官方預設的 Policy 與 Role 都是可以另外建置的,而 Policy 的架構則主要由 Effect (效果), Actions(操作權限), Resource(資源) 組成,並另外能加上 Principal(對象), Condition(條件)。

    在下方的範例則是表示 “針對所有 Principal 除了 Condition 中的帳戶之外一律拒絕其對指定 S3 Bucket 的任何操作” 。

    Python
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "UsePrincipalArnInsteadOfNotPrincipalWithDeny",
          "Effect": "Deny",
          "Action": "s3:*",
          "Principal": "*",
          "Resource": [
            "arn:aws:s3:::BUCKETNAME/*",
            "arn:aws:s3:::BUCKETNAME"
          ],
          "Condition": {
            "ArnNotEquals": {
              "aws:PrincipalArn": "arn:aws:iam::444455556666:user/user-name"
            }
          }
        }
      ]
    }

    那在組織中我們肯定不可能給予每個員工管理員權限,而是給予相匹配的最小權限阻止其讀取與業務無關的資源,甚至盜竊組織重要資源。

    我們就準備示範如何透過 IAM 建立子帳戶來操作 AWS 介面吧。

    事前提醒

    由於 AWS 官方目前建議採用 Identity Centre 來管控組織分帳戶,在下一篇章我們會進行介紹。

    但現今仍不少公司業務為求快速簡便而慣用 IAM 服務,因此以下實作主要用於示範,建議各位實作後進行刪除,或者純看以下的過程即可。

    2.2. IAM Group 的建立

    我們首先進到的是群組的概念,卽在內部的用戶會自動繼承相關的權限。我們從 IAM 面板的左側選單找到 User Groups 並進入介面。

    進到介面後我們壓下右上側的 Create group 按鈕開始進行建置。

    那我們在範例中建立個群組並取作 aws_admin 代表該群組擁有 AWS 所有服務的管理員權限。那目前我們沒有建立任何 User 就先跳過中間的步驟,而權限的部分這邊從簡而選取 AdministratorAccess 套用最大的 Full Access ,完成過後就可以建立群組了。

    建立完成過後我們應該能立即看到在頁面上顯示,就可以進到下一步了。

    2.3. IAM User 的建立

    事前提醒

    由於我事先準備後續教材,截圖的版面可能與各位不同,關於 Identity Centre 的部份請忽略它。

    那接著我們就要進到 Users 介面來準備建立 IAM 帳號。

    直接點擊右上側的 Create user 按鈕進行用戶的建立。

    由於在下一期我們會透過 Identity Centre 來取代建立 IAM 用戶的形式,我們就先隨便幫它取個名字為 tmp_admin 代表是暫時性的管理員帳戶。接著請勾選正下方的 access to … Console 才能讓用戶從官方的登入介面進到網頁介面之中。那這邊為了方便我先取消掉要重置密碼的設定。

    進入下一步看下權限的設立方式,Copy 是從其他 User 複製權限我們就不多談了,這邊來體驗另兩種建立方式:Add to group 與 Attach policy。

    我們先體驗 Attach policy 齁,阿其實就跟剛剛添加權限到 Group 相同的感覺,我們就不多加嘗試了。

    接著我們回到預設的 Add to group,選擇我們剛才設定的 aws_admin 群組。那雖然說同處同個 Group 但實際上我們還能另外設置 boundary 限縮該 User 的權限,但我們就先跳過並進到下一步。

    再來檢查一下設置並按下 Create user 建立新的 User 在 Group 之中。

    建立完成後我們會生成三個資料,這邊直接下載 csv 資料進行保存齁。

    那反正實作完我就會將該帳戶刪除,後續該 IAM 的 Account ID 就懶著遮了。但 Account ID 本身也能用於一些處理因此各位盡量不要洩漏,正如我在先前的截圖中都有遮住 root 的 Account ID 。

    2.3.1. MFA 設置

    建立完成後先別急著測試登入,這邊先帶各位看下怎麼去設定 IAM User 的 MFA 機制。首先點擊 User name 進入到管理介面之中。

    這邊額外說明下,雖然我們是透過 Group 的方式來建立用戶,但在後續我們是可以在此頁面給此 User 新增額外的權限。那總之我們進到 Security 分頁來調整重要的安全設定。

    在這邊我們也能夠取消該 User 網頁介面登入的許可,那這邊就先留意下這邊可以建立 MFA 就好。

    2.3.2. 介面登入

    接著我們複製 sign-in link 貼到瀏覽器後,登出 root 帳戶的 AWS Console 來嘗試當入該 IAM 帳號吧。那這個網址的用途就只是會自動填入 IAM 的 Account ID,也就是連結開頭的 12 位碼。接著輸入我們的用戶名稱 tmp_admin 並貼上在 csv 檔案中的用戶密碼。

    成功進到我們的頁面,各位也能發現在右上角的用戶名稱為剛所設定的 User 名稱就代表完成了。

    2.4. 清除練習資源

    因為相對我們下次要講得方法簡便許多,針對小型案件與臨時權限不少的企業仍採用 IAM 進行配發,因此本篇還是稍微介紹下建立與登入 IAM 用戶的方式。

    但現在 AWS 官方也本身不太推薦使用 IAM 開設子用戶,主要在於 IAM 的管理與授權很常需要變動,且其 Access / Secret Key 申請後不會自動更新,過往造成不少管理的糾紛案件。

    又由於 AWS 本身沒有 Project 的概念,通常都是分出很幾個帳戶作為 Project 進行使用,這樣任何人員都需要好幾把金鑰去應對不同的公司帳戶。

    後續我們將採用 Identity Centre 去結合 Single Sign-On 的優點來進行帳戶的分立,那我們接著重新登入我們的 root 帳戶,來把剛練習的資源都砍砍掉。

    我們首先到 Users 介面勾選 tmp_admin 並點選 Delete 依照操作進行 User 的刪除。

    接著再來到 User Groups 同樣勾選 aws_admin 並透過 Delete 依照操作進行刪除。

    如此我們就移除乾淨本篇有異動並稍有安全風險的資源囉。

    3. 後話


    簡單的認識 IAM 其架構與建立子帳戶的方式,但當組織龐大的時候越來越難管理又還可能員工要領好幾把鑰匙。甚至是員工或顧客不想辦理 AWS 帳號。

    那針對這個議題 AWS 後來就推出了 Identity Centre 並結合 SSO 進行快捷的單一登入,並方便組織進行分帳戶的組合管理。那我們下期就來看看又如何從組織分配帳戶呢?

    4. 參考


    [1] How IAM works? – AWS Doc
    https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html

  • AWS – 設置多重要素驗證(MFA)

    0. 前言


    相信不少人註冊完 AWS 的全新帳號就迫不及待去體驗各種功能,卻不曉得忽略了帳戶的安全性。

    在我們分出子帳號之前我們首先就來保管好我們的 root 帳戶。

    1. 重點


    透過 MFA 可以加深別人破解的可能性
    不論是母或子帳號都建議加上多重要素驗證

    2. 內容


    2.1. MFA 的概念

    MFA (Multi-Factor Authentication) 是一種要求使用者除了輸入密碼以外還要輸入更多資訊的多步驟帳戶登入程序。其用意於透過只有用戶個人手頭擁有的其他方法來驗證用戶的身分。

    (圖片來源:Post by Michael Mardahl

    2.1.1. MFA 的優勢

    降低安全風險

    MFA 可最大限度地降低因人為錯誤,密碼錯放和裝置遺失而導致的風險。

    改善安全回應

    公司可以設定多重要素驗證系統,以便在偵測到可疑登入嘗試時主動傳送提醒。這有助於公司和個人快速回應網路攻擊,從而減少任何潛在的損害。

    2.2. 如何設置 MFA

    假設我們今日剛進入到管理介面,此時我們點擊右上角的用戶名稱打開設定選單,接著選擇 Security Credentials 之設定並跳轉至頁面之中。

    進到介面之後稍微往下滑,而 MFA 設定就在 Account Details 的下一格也足見其重要性。我們接著點選該區塊右上角的 Assign MFA Device 快速來設定我們的多重要素驗證。

    最開始很直覺的就是為你接下來要設定的 MFA 方式命名,那後續驗證方式我將用簡易又常見的驗證器,範例使用我自己長年累積的 Authy (以前支援電腦跟手機,現僅支援手機)來命名。那另外幾個常見的軟體還有 Google Authenticator 與 Microsoft Authenticator 。

    完成後我們進到下一步,這邊我們在步驟 2 按下 Show QR Code 以顯示我們的 QR-Code 並且透過程式掃描添加到帳戶。添加完成之後應該會看到一組 6 位數字密碼他在一段時間後就會自動刷新,接著在步驟 3 輸入 “連續” 兩組數字密碼,輸入完成後趕緊按下 Add MFA 進行建置。

    完成之後我們就能看到首個綁定的 MFA 設備!

    緊接著我們就登出 AWS 重新登入看看,進到登入見面使用剛綁定 MFA 的帳戶登入(範例為 root)。

    輸入完帳號密碼之後就會跳出新一層的 MFA 防護,此時就要開啟我們的驗證器並輸入 6 位數字密碼。而這也代表我們 MFA 有設置成功,各位為帳戶添加一層防護。

    2.3. MFA 方法全介紹

    雖然我們完成建立一種最基本的 MFA 方式,但下方我們還是簡單介紹下所有驗證方式與其原理,讓各位更好的了解並進行選擇。

    2.2.1. Passkey or Security Key

    根據 FIDO 標準後在這個分類中 AWS 支援兩種型態:實體金鑰(硬體設備)與設備同步密鑰

    實體金鑰(Security Key)的概念就很明確,他就是可以插上電腦的一組硬體設施以此作為認證的方式,比如 Yubico 所推出 YubiKeys 系列。你可能覺得這晶片看起來十分脆弱,但這麼重要的東西自然會經過些特殊處理。丟到洗衣機,砸到地上,甚至被轎車輾過基本都能存活下來。

    而他由於規則的約束力,對於網路釣魚驗證有些許防護力,但主要優勢在於電源由插入的電腦提供。

    而設備同步金鑰(Synced Key)多數要連接你的手機設備,可能搭配生物鎖或一些特殊的軟體進行認證。

    2.2.2. Authenticator App

    我們常看到的驗證器是當我們在應用程式中註冊帳戶後,透過 QR-Code 或手動輸入連接碼加入我們的帳戶進行管理的方式。通常在一段時間就會刷新數字密碼,因此也讓有些人認為只有當下那組數字可以執行,但實際上這類程式多數都是能維持 2 組的紀錄,那相信 6 位數字的記憶對各位不難吧?

    (圖片來源:Authenticator in Google Play
    2.2.3. 硬體 TOTP

    TOTP 的全名是 Time-Based One Time Password,我們使用的 Authenticator App 基本都是採這種方式,也就是依靠時間去生成一組隨機性的密碼。

    那硬體顧名思義又是外插並由電腦供電的,但不同於 Security Key 他會有個螢幕顯示數字密碼。並透過驅動軟體來進行驗證。

    (圖片來源:Token 2

    3. 後話


    多重要素驗證其實是不可忽視的動作,密碼設的再長再安全,若被盜錄也毫無用武之處。

    那為了 root 帳戶的安全我們一般會再切出子帳戶來進行日常的操作,那後續我會用兩種方法來達成這個目標。但若使用 Organization 建立的子帳戶是沒權限管理 Billings 帳單的。

    所以在那之前我們先來設置預算警報避免花費爆表吧!

    4. 參考


    [1] What is MFA? – AWS What-Is
    https://aws.amazon.com/what-is/mfa/?nc1=h_ls

    [2] Using MFA in AWS – AWS Docs
    https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html

    [3] We ran over some security keys with a car and some still worked – Freedom of the Press Foundation
    https://freedom.press/training/blog/security-keys-meet-real-world/

  • MC 煉金工藝 – Floor Crafting 合成站

    MC 煉金工藝 – Floor Crafting 合成站

    0. 前言


    在上回我們透過合成台配方進行客製化物品的生成,但礙於目前的架構限制,沒法使用特殊道具作為素材,因此我們必須透過 Floor Crafting 達成此目標,順便做出視覺效果。

    另外我們要避免隨便丟在地上的物品意外合成,勢必需要設定專用的合成站。那我們今天這一篇我們會進行 execute 的基礎使用與介紹。

    1. 重點


    execute 可以視作為篩選後的結果,相對 Selector 能進行更精細的篩選。
    execute 的 as 會回傳物體並能從中取得其資訊,然而 at 只回傳座標位置
    tp 本身不會消除動量

    修正資訊(Jul. 30, 2024)

    🙏感謝 [巴哈姆特] 貓狗貓 提供以下關於修正資訊

    透過 function 進行 tp 與 storage 測試後,tp 在 tick 瞬間是會消除 Motion 的,但為何物體會前移仍不明。

    2. 內容


    2.1. execute 基礎篇

    關於 execute … run 我們能視作篩選後的結果,當滿足 subcommand 的篩選條件後,執行 run 之後的相應動作。那其中最常用分別為 as 與 at 這兩個,那我們就來看看他們的用途吧。

    2.1.1. as

    首先講述到的 as 我們能看做 “當” 的概念,比如下方的指令方塊內容代表「當 entity 型態為 item (掉落物) 的時候執行 tp 到指令方塊的上一格」。

    Python
    execute as @e[type=item] run tp ~ ~1 ~

    那麼丟些道具並拉下拉桿後,物體就該被傳送到方塊上方,代表有偵測到這些物件。

    2.1.2. at

    那 at 的概念則是相當於 “在” 的概念,那像下方 Repeat 指令方塊的內容則表示「在 item (掉落物) 的位置顯現粒子效果」。

    Python
    execute at @e[type=item] run particle flame ~ ~ ~ 0.125 0.125 0.125 0 10

    當我按下拉桿後,當我丟出物體就該持續有粒子效果跟著物體移動。

    2.1.3. as 與 at 的區別

    在後方的 Repeat 指令方塊中我寫了較為詳細的語法,透過 as 搭配 at 進行組合。前後文效果是一樣的。

    Python
    execute as @e[type=item] at @s run particle flame ~ ~ ~ 0.125 0.125 0.125 0 10

    但我們直接用 at 不是運行好好的嗎?那切割點在於 as 是回傳物體與其資訊,然 at 只回傳座標資訊,假若用 at 直接銜接其他 subcommand 可能無法正常運作。便宜偷懶是可以用 at,但有牽扯到其他判斷式時就建議採用詳細的寫法避免後續出現問題又可能拉長 debug 的時間。

    2.1.4. if / unless

    我們另外看到經常使用的 if 肯定的判斷式,那其相對的就是 unless 作為否定的判斷式。他們可以銜接的包括生態環境(biome), 方塊類別(block/blocks), 物體資訊(data)。

    另外其他的包括境界的判斷 (dimension), 物體(entity), 方法是否執行成功(function), 玩家包包檢查(items)。

    最後兩個比較例外少用的指定座標是否有被世界加載(loaded), 關於 Datapack 的數值比對(predicate)。

    2.1.5. align

    講到對齊我們會使用的便是 align 方法,那有 xyz 三軸嘛,他的組合數就是 C3 取一 + C3 取二 + C3 取三,等同於 2^3 – 1 共 7 個組合。

    JavaScript
    x y z xy xz yz xyz

    那我們可以假設說當我們 align xyz 時,我們就在那單個方塊的 0, 0, 0 座標上,因此若 x 與 z 設為 ~0.5 代表在地面的正中心,另外加上 y 為 ~0.5 就是該方塊的正中心點。

    2.1.6. as 與 at 的驗證

    這邊我們回頭為 as 與 at 做個證明,順便用上一些我們剛介紹的判斷架構。透過 Repeat 指令方塊,可以看到下方我們先使用 at 嘗試去對齊 xyz,而當掉落物下方的方塊為含水大鍋就會停止物體並取消重力。

    但在下方的測試中並沒有跳出指令方塊的回饋也沒有讓物體滯空。

    Python
    execute at @e[type=item] align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}

    這時我們把指令修改一下為複合的準確型態。這時我們重新嘗試就能看到指令方塊的執行回饋,並且明顯看到物體神奇的浮在空中。

    Python
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}

    2.2. Datapack 的 function 架構

    這似乎是我們首次提到 function 目錄,那事實上有幾個特殊的目錄是沒有寫入在 versions 的版本執行檔,必須去到 Minecraft Wiki 進行查詢。

    那我們首先必須講到的就是 minecraft/tags/function 內部的兩個 JSON 檔案,其中可以透過陣列的方式選定要執行那些動作。而 load.json 所代表的是加載資源包時執行的動作,而 tick.json 所代表是遊戲每 tick (1 sec = 20 tick)去執行的動作。

    Python
    {
        "values": [
            "BRANCH:PATH/OF/MCFUNCTION"
        ]
    }

    那相應他們的名稱,我個人的命名習慣在最頂層就有 load(建立計分板, 隊伍等等), tick(需要隨時偵測的內容), unload(相對於 load 讓玩家可以安全卸載資源包)。那當然後面細分時可能就會有更多目錄與特殊的 mcfunction 。

    基礎三個方法個人採用階層式的方法,當我有要移除任何階層時相對好管理減少到處呼叫的問題,另外就是同一種分類的 function 都寫在一塊容易管理。

    另外這些寫好的 mcfunction 實際上都能夠在遊戲中透過 /function 這個指令來直接進行呼叫。

    2.3. 坩鍋實作

    我們接著進入到今日的實作部分,當然在一點修改下也適用於判斷其他方塊,各位可以自行發揮。

    2.3.1. tp 動量驗證

    那在我們直接執行正解之前先來做個關於 tp 的實驗,我們在 Datapack 確認每 tick 觸發後,先只測試將物品傳送到鍋的中心而沒有動量消除的部分。

    我們回到遊戲通過 /reload 加載後丟點東西到含水大鍋上方可以看到物品有確實被吸入,但當我們抽乾之後卻會發現物品不在中心而是壁面。但我們不是設定 x 與 z 的 .5 了嗎?原因在於 tp 不會消除物體動量。

    Python
    # Teleport item into water cauldron
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run tp @s ~.5 ~-.5 ~.5

    我們快速做個驗證,跟朋友一起玩過的可能就體驗過,當我們從高空墜落一段時間後,即使 /tp 到地面玩家身邊,那瞬間還是會摔死的,主要就在於動量沒被消除,玩家還是以其速度撞向地面。

    2.3.2. 視覺效果

    我們接著加上前面測試的方法來消除動量與重力。完成修改後回到遊戲進行 /reload,接著丟點東西嘗試一下。那由於我有使用 NoGravity 將物品浮空在鍋內中間,掉落物自然上下起伏的動畫剛好能讓玩家看到自己放了那些素材進去。

    Python
    #
    # When item flying across water cauldron, teleport item into it
    #
    
    # Detect if item flying across water cauldron then freeze it
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}
    # Teleport item into water cauldron
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run tp @s ~.5 ~-.5 ~.5

    3. 後話


    但若我們只是將素材丟入坩鍋是否還是太過無趣,我們下期就要介紹 /particle 與 /playsound 來給予視覺與聽覺的效果。那我們就下期再會啦。

    4. 參考


    [1] Datapack – Minecraft Wiki
    https://minecraft.wiki/w/Data_pack

    [2] Execute – Minecraft Wiki
    https://minecraft.wiki/w/Commands/execute

  • MC 煉金工藝 – 自訂義配方

    MC 煉金工藝 – 自訂義配方

    0. 前言


    在生存當中你是否曾覺得某些道具取得麻煩?是否曾妄想過能夠合成特殊道具?

    這些事情也能透過 Datapack 進行擴增,接著就來看看如何取代以及擴增物品的合成配方吧!

    1. 重點


    利用指令道具在 minecraft/recipe 目錄下的覆蓋配方是最基本的禁用方式
    在 1.20.5 後配方可以透過 components 增加物品標籤建立客製化物品

    版本變動

    在 1.21 許多目錄的 s 都被移除了,並增加了許多過往沒有的架構,請先觀察欲開發版本 jar 檔案

    2. 內容


    2.1. 配方架構

    老樣子先講解架構,我們進入版本的 JAR 執行檔,進入 data >> minecraft >> recipe,這個目錄底下是遊戲中所有的原本合成配方。

    那關於合成方式設有兩種型態: shapelessshaped,代表就是是否需要擺為特定形狀。

    這邊另外拿兩份檔案進行範例解說。

    2.1.1. 相思木按鈕 acacia_button
    JavaScript
    {
      "type": "minecraft:crafting_shapeless",
      "category": "redstone",
      "group": "wooden_button",
      "ingredients": [
        {
          "item": "minecraft:acacia_planks"
        }
      ],
      "result": {
        "count": 1,
        "id": "minecraft:acacia_button"
      }
    }

    可以看到 shapeless 所對應的是 ingredients 只管要有那些素材而不論位置。那我挑選木造按鈕的原因在於它有 group 標籤,而 group 的概念在於相同配方架構下,可能因為不同木材不同顏色而有變化。

    2.1.2. 釀造台 brewing_stand
    JavaScript
    {
      "type": "minecraft:crafting_shaped",
      "category": "misc",
      "key": {
        "#": {
          "tag": "minecraft:stone_crafting_materials"
        },
        "B": {
          "item": "minecraft:blaze_rod"
        }
      },
      "pattern": [
        " B ",
        "###"
      ],
      "result": {
        "count": 1,
        "id": "minecraft:brewing_stand"
      }
    }

    相對釀造台就是 shaped,那對照的是 pattern 與 key,其中 key 代表 pattern 內相對位置的素材條件。另外 pattern 不一定要擺滿九宮格,比如原版的樣式是兩行,所以我們在合成上可以是一二行或二三行。

    剛才提到 group 的概念在於相同配方架構下。而 category 則代表物品合成出來後該歸在哪一類,最直觀的就是創造模式下能看到的物品分頁。尾端的 result 則對應合成結果與數量,那這是原版的情況,我們後續會再加上 components 創建自訂義物品的配方。

    那雖然今天主軸都在合成台的配方上,還是多介紹下其他合成站的狀態。那在下方沒有 count 標記就代表沒法更動結果數量,但都可以加上 components 。

    但根據 Minecraft Wiki 現在還有個致命缺點,就是只支援結果能設定 NBT Tag,也就是說我們沒法將客製化物品做為合成素材使用,因此這範疇還是要仰賴 Floor Crafting 達成。

    2.1.3. 燒製型配方

    包括熔爐, 高爐, 營火, 煙燻爐都是燒製的範疇,讀取的都是 ingredient,並配有給予玩家的經驗與燒製時長的設定。

    2.1.4. 切石機配方

    同樣也是讀取單個 ingredient,但輸出可以多設定數量,且能單個素材產出多個結果。

    2.1.5. 鍛造台配方

    我們知道在 1.20 系列更新我們多出了鍛造模板,而鍛造台呢也就是針對三個欄位讀取去合成結果。

    2.2. 配方增減

    我們接著就來實作看看如何覆蓋以及增加物品的合成方式吧。

    2.2.1. 覆蓋配方

    覆蓋原版配方可用來調整物品取得難度或禁止生存手段合成物品。那在這個案例中我將會以禁止釀造台為實作,後續我們的藥水將透過大鍋搭配 Floor Crafting 形成更好的視覺效果。

    那我們偷個懶用這個視覺化的網站幫忙編寫,在上方選用合成配方後,稍微往下滑記得先選取你的遊戲版本,接著參照版本 JAR 內的規格在 Output Recipe 取名為 brewing_stand,接著我們往上勾選 “Exactly where placed (準確放哪)” 。

    我們首先搜尋 brewing 並找到釀造台放到結果欄位,接著從右側的素材中搜尋 barrier 這只能靠指令拿到的物品並拖拉進合成表之中。那接著我們要簡略的第二層保險,避免用戶意外在遊戲內發現配方,我們多拉幾個屏障並且不規則的放入。

    接著你可以選用是否要設第三層保險,比如我就多搜尋 knowledge 把其中一個屏障改為知識之書。

    完成之後滑到最底層,點選 Download JSON,並且將這放檔案放到 Datapack 的 minecraft/recipe 中。返回遊戲之中首先輸入 /reload,將著嘗試看看原版的合成配方是否已被取代。

    2.2.2. 增添配方

    相對的有減少我們就來操作增加,我們刷新網站並命名配方,那由於我們是超出原版的內容,只要確保檔名在目錄內沒有重複就能隨便亂取,比如我打 testing123 。那我們這次改用 shapeless 進行示範,我們將結果設為麵包(bread)素材設為一綑小麥(wheat),完成之後就進行輸出。

    接著將 JSON 放到 Datapack 的其他分支,比如我的在 course/recipe 之中,這時我們就有原版的 bread 與我們的 testing123 兩個配方。我們回到遊戲 /reload 後進行測試,測試原版的新增的兩種合成方式。

    當然放到 minecraft/recipe 因為檔名沒相衝也可以使用,但建在分支的優點就在於方便跟著更動並且能使用原版物件的名稱。比如我今天突然將整個分支移到其他 Datapack,我不用另外再搬動合成配方。

    2.3. 合成客製化物品

    接著我們就要進行 components 的調整,那我們所使用的網站可以對合成表上的物件右建刪除或設定 custom_data,但由於該網站能改動的部分很少,因此還是以編譯器直接進行修改。

    我們就拿過往製作的材質包來練習,再度刷新清空合成表後我們合成蜂蜜瓶,為求簡單選個 shapeless,拿個空瓶 bottle 跟紅石 redstone dust,我們命名為 932230 後輸出 JSON,並將其複製到分支的 recipe。

    JavaScript
    {
        "type": "minecraft:crafting_shapeless",
        "ingredients": [
            {
                "item": "minecraft:redstone"
            },
            {
                "item": "minecraft:glass_bottle"
            }
        ],
        "result": {
            "id": "minecraft:honey_bottle",
            "count": 1,
            "components": {
                "minecraft:custom_model_data": 932230,
                "minecraft:custom_name": "\"Healing Potion\""
            }
        }
    }

    上述範例看到最底層的 components,這個是在 1.20.5 才加入的 NBT 架構,因此你可以到參考資料找下我過往整理的「1.20.5 物品常用標籤」或官方的「Snapshot 更新誌」。

    那我們上面範例就練習到 Custom Model Data 與物品名稱的設定,完成之後就能進到遊戲實驗啦,阿別忘記先載入過往練習的材質包,應該要能看到之前設定的樣式。

    注意事項

    若有裝光影的話 objmc 的 3D 模型基本上是會壞的,可以嘗試換成 2D 的圖樣進行

    3. 後話


    目前客製化藥水的合成只是作為範例,我所希望的是透過 Floor Crafting 在大鍋中更有視覺化的進行釀造,這也是前面封禁釀造台的主因。

    那麼下回我們就會透過辨識物品底下的方塊或物體設定特製的合成台,先讓物品準確的落在中心點。

    4. 參考


    [1] Minecraft 1.20.5 物品參數更新 — 八寶周的研究小屋
    https://babaochou2420.com/2024/06/14/minecraft-1-20-5-item_cmd_update/

    [2] 官方 Snapshot 更新誌
    https://www.minecraft.net/en-us/article/minecraft-snapshot-24w09a

    [3] Recipe — Minecraft Wiki
    https://minecraft.wiki/w/Recipe

  • MC 煉金工藝 – 3D 自訂義物品

    MC 煉金工藝 – 3D 自訂義物品

    0. 前言


    2D 模型感覺不夠看,但想製作 3D 模型又好麻煩?

    這期我們使用 AI 模型告別 Blockbench,快速將 2D 轉成 3D 並匯入 Minecraft 世界。

    1. 重點


    Tripo AI 採 token 制度按操作收費
    objmc 針對模組環境仍有些嚴重問題

    修正資訊(Jul. 21, 2024)

    🙏感謝 [巴哈姆特] 貓狗貓 提供以下關於 objmc 部分的修正資訊

    1. 由於 objmc 是修改 core shader 後達成的效果,因此與光影相關的模組基本都會出現看不見的問題
    2. 透過結果 JSON 的 elements 能發現其都非常微小 (0.000001),才是 Blockbench 無法看到的主因
    3. 關於結果 PNG 的藍色區塊代表是 uv 資訊而不是套皮的素材。

    2. 內容


    2.1. Minecraft 的 JSON 模型格式

    透過 JSON 建立方塊與素材算是 Minecraft 特有的樣式,那我們主要有三個區塊,textures 讀取不同的素材進行配色,elements 調整 cube 的位置組成模型,display 調整拿在手上丟在地上的模型樣貌。

    2.2. 材質包製作

    我們先進到上次建立的材質包之中並準備好開發環境,接著就從生成模型先開始吧。

    2.2.1. Tripo AI — 2D 轉 3D

    講到 Minecraft 講到建模很多人大概先想到 Blockbench, 但我身為 3D 建模白癡,我決定使用 AI 模型進行處理,那我所使用的是 Tripo AI 這個 2D 轉 3D 的服務。

    該公司先前有與 Stable Diffusion 合作發布概念性模型,但成效差上許多,若你真不想花費 token 可以嘗試看看。這邊提供文章連結,裡面附有模型下載的地方。

    這邊先付上我這邊生成的 OBJ 模型,各位不想註冊不想花錢的可以到此連結下載素材

    生成與檔案下載都會花費 token,而剛註冊會給 600 的免費額度,大概可以做 20 個左右。我們上傳我們上次準備的去背圖片進行嘗試吧。

    這種生成方式有兩種缺陷,首先在於模型只能靠一個面去推敲,但出來的結果還可以接受。第二在於由於是 material 鋪上 mesh 的方式,因此我們若想對模型進行更動稍有挑戰性。

    等待生成完成後可以轉一轉把玩一下,再來點選右上的拓展按鈕進到主檢視器。

    關於 Stylize 那邊的像素化我們可以忽略它,先前在測試發現畫質損失嚴重並只能匯出 glb 格式。

    我們只要記得右下的匯出選擇最普遍的 obj 並交錢下載模型,下載成功後我們找個地方先解壓縮出來。

    2.2.2. objmc — OBJ 轉 JSON

    我們到 GitHub 找到 objmc 這個專案,並透過 git clone 指令複製到本地。完成後就請執行 objmc.py 開啟 GUI 介面準備進行操作。

    PowerShell
    git clone https://github.com/Godlander/objmc.git

    這個專案的特點就在於轉換 OBJ,這是 Blockbench 覺得太過麻煩直接表明拒絕開發的功能。而這個工具根本成為了 3D 建模者的福音,可以將 Polish 3D Model 直接轉為 Minecraft 的 JSON 格式。

    那介面上看到可以讀取多個 OBJ 但那是針對動畫的生成,我們不用用到那麼複雜。但你有興趣能研究 Blockbench 的 Obj Animation Exporter 插件,其就是透過動畫分偵切割新的 Obj 出來。

    那我們就是讀取剛剛的單個 OBJ 模型 + 它的圖片素材,順便先設定輸出時名稱與素材路徑。

    那轉換出來的這個格式與方塊也是完全相通的,但我們還是先將目光集中在道具之上。

    2.2.2. 引入模型

    看到 Terminal 顯示 Complete 完成生成後,將剛剛的 JSON 與 png 貼到我們的材質包之中。而 [蜂蜜瓶] 記得要將 override 的地方從 2d_ 改為 3d_ 。

    完成之後我們在回到 Minecraft 進行 F3 + T 重整,可以看到模型有點偏移。這邊強烈否對使用 Blockbench 讀取 JSON,原因在於從 mesh 轉換因而有超多的 cube,直接加載瞬間讓我電腦當機,而第二在於素材圖片的大小過大,Blockbench 偵測不到因而呈現隱形的物件。所以要修改還是推薦從 Maya, Blender 進行修改後重新給 objmc 進行轉檔。

    3. 後話


    透過 2D 轉 3D 雖有侷限性但大大增加製作的效率,那希望這兩篇可以幫助到各位。

    也別忘記可以留言或按讚讓我知道,這教學對於各位非常實用。

    4. 參考


    [1] objmc
    https://github.com/Godlander/objmc

    [2] Tripo SR (開源概念模型)
    https://stability.ai/news/triposr-3d-generation