AOS安裝及操作演示

文章目錄

  • 一、安裝node
    • 1.1 在 macOS 上管理 Node版本
      • 1.1.1 安裝 nvm
      • 1.1.2 驗證 nvm 是否安裝成功
      • 1.1.3 使用 nvm 安裝/切換 Node.js 版本
      • 1.1.4 卸載 Node.js 版本
    • 1.2 在 windows 上管理 Node版本
      • 1.2.1 安裝 nvm-windows
      • 1.2.2 安裝 Node.js 版本
      • 1.2.3 切換 Node.js 版本
      • 1.2.4 卸載 Node.js 版本
      • 1.2.5 檢查當前 Node.js 版本
  • 二、安裝 aos
  • 三、使用AOS
    • 3.1 發送第一個命令
    • 3.2 發送消息
    • 3.3 向 Morpheus 發送消息
    • 3.4 收件箱
  • 四、操作Arweave的token
    • 4.1 發布一個Arweave的token
    • 4.2 使用golang調用token
    • 4.3 獲取消息信息

一、安裝node

1.1 在 macOS 上管理 Node版本

在 macOS 上管理 Node.js 版本,通常使用 nvm(Node Version Manager)是最便捷的方式。以下是安裝和使用 nvm 來管理 Node.js 版本的步驟:

1.1.1 安裝 nvm

打開終端并運行以下命令來安裝 nvm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash

運行上述命令后,按照提示操作,安裝過程會將 nvm 的路徑添加到 shell 配置文件(如 .bashrc, .bash_profile, .zshrc 等)中。

注意:如果你使用的是 Zsh 作為默認終端,可能需要編輯 .zshrc 文件;如果使用的是 Bash,可能需要編輯 .bash_profile 或 .bashrc。

在安裝完成后,執行以下命令來重新加載 shell 配置文件:

source ~/.bashrc  # 或者 source ~/.zshrc,視具體情況而定

1.1.2 驗證 nvm 是否安裝成功

在終端運行以下命令來檢查是否成功安裝:

nvm --version

如果返回 nvm 版本號,則說明安裝成功。

1.1.3 使用 nvm 安裝/切換 Node.js 版本

  • 查看可用的 Node.js 版本:

    nvm ls-remote

  • 安裝特定版本的 Node.js:

    nvm install <version>

例如,安裝 Node.js 21.x:

nvm install v21.0.0
  • 切換到特定版本的 Node.js:

    nvm use <version>

例如,切換到 Node.js 22.x:

nvm use v22.0.0
  • 查看當前已安裝的 Node.js 版本:

    nvm ls

  • 設置默認 Node.js 版本:

    nvm alias default <version>

例如,設置默認版本為 22.x:

nvm alias default v22.0.0

這樣每次打開終端時,系統會自動使用你設定的默認版本。

1.1.4 卸載 Node.js 版本

如果需要卸載某個 Node.js 版本,可以使用以下命令:

nvm uninstall <version>

例如:

nvm uninstall 22

1.2 在 windows 上管理 Node版本

在 Windows 上管理 Node.js 版本,常用的工具是 nvm-windows,這是 Node Version Manager (NVM) 的 Windows 版本。使用它可以輕松安裝、切換和管理多個 Node.js 版本。

1.2.1 安裝 nvm-windows

  • 下載 nvm-windows:前往 nvm-windows GitHub 主頁 - 下載最新的 .zip 文件或 .exe 安裝文件。

  • 安裝:運行下載的 .exe 文件,按照安裝向導的提示進行安裝。建議選擇默認的安裝路徑,以免出現權限問題。

1.2.2 安裝 Node.js 版本

  • 查看可用的 Node.js 版本

安裝好 nvm 后,打開命令行(如 PowerShell 或 CMD),輸入以下命令來查看可安裝的 Node.js 版本列表:

nvm list available
  • 安裝指定版本的 Node.js

選擇一個版本號,并使用以下命令進行安裝,例如安裝 Node.js 16.13.0:

nvm install 16.13.0
  • 查看已安裝的版本

可以查看系統上已經安裝的 Node.js 版本:

nvm list

1.2.3 切換 Node.js 版本

使用指定版本的 Node.js

如果你已經安裝了多個版本的 Node.js,你可以使用以下命令切換到所需的版本:

nvm use 16.13.0

使用該命令后,你的 Node.js 和 npm 都會切換到該版本。

1.2.4 卸載 Node.js 版本

卸載不需要的版本

如果你不再需要某個版本的 Node.js,可以通過以下命令卸載:

nvm uninstall 16.13.0

1.2.5 檢查當前 Node.js 版本

確認當前的 Node.js 版本

  • 使用 node -v 來查看當前使用的 Node.js 版本:

    node -v

二、安裝 aos

  • 完成 NodeJS 安裝后,只需安裝 aos 并運行它:

    npm i -g https://preview_ao.g8way.io

  • 卸載aos服務

    npm uninstall -g @permaweb/aos

  • 安裝完成后,我們運行命令即可啟動一個新的 aos 進程!

    aos

aos 命令運行時,其實是你在使用密鑰文件向 aos 驗證你的身份的。如果沒有指定,aos 會默認生成一個新的密鑰文件并將其存儲在本地 ~/.aos.json。如果你有 Arweave 錢包,可以使用 --wallet [location] 參數使用指定錢包。

剛剛我們啟動的程序實例是本地客戶端,它已準備好將消息發送到你的新進程(ao 計算機內的進程)。

連接后,我們會看到以下內容:

          _____                   _______                   _____          /\    \                 /::\    \                 /\    \         /::\    \               /::::\    \               /::\    \        /::::\    \             /::::::\    \             /::::\    \       /::::::\    \           /::::::::\    \           /::::::\    \      /:::/\:::\    \         /:::/~~\:::\    \         /:::/\:::\    \     /:::/__\:::\    \       /:::/    \:::\    \       /:::/__\:::\    \    /::::\   \:::\    \     /:::/    / \:::\    \      \:::\   \:::\    \   /::::::\   \:::\    \   /:::/____/   \:::\____\   ___\:::\   \:::\    \  /:::/\:::\   \:::\    \ |:::|    |     |:::|    | /\   \:::\   \:::\    \ 
/:::/  \:::\   \:::\____\|:::|____|     |:::|    |/::\   \:::\   \:::\____\
\::/    \:::\  /:::/    / \:::\    \   /:::/    / \:::\   \:::\   \::/    /\/____/ \:::\/:::/    /   \:::\    \ /:::/    /   \:::\   \:::\   \/____/ \::::::/    /     \:::\    /:::/    /     \:::\   \:::\    \     \::::/    /       \:::\__/:::/    /       \:::\   \:::\____\    /:::/    /         \::::::::/    /         \:::\  /:::/    /    /:::/    /           \::::::/    /           \:::\/:::/    /     /:::/    /             \::::/    /             \::::::/    /      /:::/    /               \::/____/               \::::/    /       \::/    /                 ~~                      \::/    /        \/____/                                           \/____/         Welcome to AOS: Your operating system for AO, the decentralized open access supercomputer.
Type ".load-blueprint chat" to join the community chat and ask questions!AOS Client Version: 2.0.0. 2024
Type "Ctrl-C" twice to exitYour AOS process:  9qyG3YAlPYt9SBns5zwrbIZGvYVdM8s86fIi2qw8jbsdefault@aos-2.0.0[Inbox:8]> 

三、使用AOS

3.1 發送第一個命令

我們所擁有的 aos 進程,已經駐留在 ao 計算機內部的服務器上,等待接收和執行你的命令。

為了讓開發更加的簡單,aos 使用 Lua 編程語言撰寫命令。 還沒學過 Lua? 不要著急! 這是一種超級簡單、友好的語言。 看完本手冊后你就順帶學會 Lua。

讓我們打破僵局并輸入:

default@aos-2.0.0[Inbox:8]> "Hello, ao!"

然后按 [Enter] 鍵。 你會看到 shell 簽名并發布消息,請求結果,然后打印結果,如下所示:

Hello, ao!

3.2 發送消息

  Send({ Target = "process ID", Data = "Hello World!" })
  • Send:Send 是 aos 中全局函數,用于發送消息。
  • Target:如果要將消息發送到特定進程,請在消息中包含 Target 字段。
  • Data:Data 是你希望目標進程接收的文本消息。 在此示例中,消息是 Hello World!

3.3 向 Morpheus 發送消息

  • 存儲 Morpheus 的進程 ID

我們將使用下面提供的進程 ID 并將其存儲為名為 Morpheus 的變量。

wu_tAUDUveetQZpcN8UxHt51d9dyUkI4Z-MfQV8LnUU

通過復制上面的進程 ID 并在 aos CLI 中運行以下命令以便將其存儲為變量:

Morpheus = "wu_tAUDUveetQZpcN8UxHt51d9dyUkI4Z-MfQV8LnUU"

這會將進程 ID 存儲為名為 Morpheus 的變量,從而更輕松地與特定進程 ID 進行交互。

創建 Morpheus 變量時,我們應該看到的唯一響應是 undefined。 這是預料之中的。 要檢查變量是否已成功創建,請輸入 Morpheus 并按 Enter。 我們應該會看到你存儲的進程 ID。

檢查 Morpheus 變量

-- 通過輸入 `Morpheus` 檢查 Morpheus 變量
Morpheus
-- 預期結果:
wu_tAUDUveetQZpcN8UxHt51d9dyUkI4Z-MfQV8LnUU-- 如果 `undefined` 被返回,
-- 那么變量沒有創建成功。
  • 向 Morpheus 發送消息

獲取 Morpheus 的進程 ID 并將其存儲在變量中后,我們就可以與它進行通信了。 為此,你可以使用 Send 函數。 Morpheus 本身就是 ao 中運行的一個并行進程。 他使用一系列 handler 接收和發送消息。 讓我們向他發送消息,看看會發生什么。

Send({ Target = Morpheus, Data = "Morpheus?" })
  • 我們的 Target 是 Morpheus,這是我們之前使用 Morpheus 進程 ID 定義的變量。

  • Data 是我們要發送給 Morpheus 的消息。 在這里,它是 Morpheus?。

預期結果:

-- 我們的消息命令
Send({ Target = Morpheus, Data = "Morpheus?"})
-- 消息已添加到發件箱
message added to outbox
-- 從 `Morpheus` 的進程 ID 收到一條新消息
New Message From BWM...ulw: Data = I am here. You are f

3.4 收件箱

收件箱 是我們從其他進程接收消息的地方。

讓我們檢查收件箱,看看我們收到了多少條消息。

在 aos CLI 中,輸入以下命令:

#Inbox

返回值示范:

-- 你的 `收件箱` 命令
#Inbox
-- 該命令將返回我們收件箱中的消息數量
16

在上面的示例中,返回為 16,表示收件箱中有十六封郵件。

由于我們主要是為了尋找 Morpheus 的回復,因此我們假設他的消息是最后收到的消息。要閱讀收件箱中的最后一條消息,請鍵入以下命令:

Inbox[#Inbox].Data

該命令允許我們將數據與消息分離,并且僅讀取特定數據字段的內容。

預期返回:

-- 你的 Inbox[x].Data 命令
Inbox[#Inbox].Data
-- 該命令將返回消息的 `Data` 字段。
-- Data 通常代表基于文本的消息
-- 從一個進程接收到另一進程。
I am here. You are finally awake. Are you ready to see how far the rabbit hole goes?

四、操作Arweave的token

4.1 發布一個Arweave的token

// 引入lua庫
// bint用于處理大整數
// json用于處理 JSON 數據local bint = require('.bint')(256)
local json = require('json')// 定義工具函數
// add: 將兩個數相加,返回字符串形式的結果。
// subtract: 從一個數中減去另一個數,返回字符串形式的結果。
// toBalanceValue: 將一個數字轉換為字符串,用于表示余額。
// toNumber: 將字符串形式的數字轉換為 Lua 數字。local utils = {add = function(a, b)return tostring(bint(a) + bint(b))end,subtract = function(a, b)return tostring(bint(a) - bint(b))end,toBalanceValue = function(a)return tostring(bint(a))end,toNumber = function(a)return bint.tonumber(a)end
}// 全局變量,這部分屬于合約本身內部的狀態,屬于當前process 獨立的狀態,收到消息并且處理以后呢,將會改變這些狀態 
// 定義代幣的基本信息,版本、精度(小數位數)、初始余額、總供應量、名稱、符號和 logo。
// 使用 or 操作符為未定義的變量提供默認值。Variant = "0.0.3"Denomination = Denomination or 12
Balances = Balances or { [ao.id] = utils.toBalanceValue(10000 * 10 ^ Denomination) }
TotalSupply = TotalSupply or utils.toBalanceValue(10000 * 10 ^ Denomination)
Name = Name or 'Points Coin'
Ticker = Ticker or 'PNTS'
Logo = Logo or 'SBCCXwwecBlDqRLUjb8dYABExTJXLieawf7m2aBJ-KY'// info:處理“信息”請求,返回代幣的基本信息。
Handlers.add('info', Handlers.utils.hasMatchingTag("Action", "Info"), function(msg)if msg.reply thenmsg.reply({Name = Name,Ticker = Ticker,Logo = Logo,Denomination = tostring(Denomination)})elseSend({Target = msg.From, Name = Name,Ticker = Ticker,Logo = Logo,Denomination = tostring(Denomination)})end
end)// balance:處理查詢余額的請求,根據接收者的不同,返回相應的余額。
Handlers.add('balance', Handlers.utils.hasMatchingTag("Action", "Balance"), function(msg)local bal = '0'if (msg.Tags.Recipient) thenif (Balances[msg.Tags.Recipient]) thenbal = Balances[msg.Tags.Recipient]endelseif msg.Tags.Target and Balances[msg.Tags.Target] thenbal = Balances[msg.Tags.Target]elseif Balances[msg.From] thenbal = Balances[msg.From]endif msg.reply thenmsg.reply({Balance = bal,Ticker = Ticker,Account = msg.Tags.Recipient or msg.From,Data = bal})elseSend({Target = msg.From,Balance = bal,Ticker = Ticker,Account = msg.Tags.Recipient or msg.From,Data = bal})end
end)// balances:用于查詢所有賬戶的余額
Handlers.add('balances', Handlers.utils.hasMatchingTag("Action", "Balances"),function(msg) if msg.reply thenmsg.reply({ Data = json.encode(Balances) })else Send({Target = msg.From, Data = json.encode(Balances) }) endend)// transfer:處理代幣轉賬請求,檢查余額是否足夠,如果足夠,則進行轉賬并發送通知。
Handlers.add('transfer', Handlers.utils.hasMatchingTag("Action", "Transfer"), function(msg)// transfer參數的檢查,確保 接收者 和 數量 的類型正確,且數量大于0assert(type(msg.Recipient) == 'string', 'Recipient is required!')assert(type(msg.Quantity) == 'string', 'Quantity is required!')assert(bint.__lt(0, bint(msg.Quantity)), 'Quantity must be greater than 0')// 檢查發件人和接收人的余額,如果不存在則初始化為0。if not Balances[msg.From] then Balances[msg.From] = "0" endif not Balances[msg.Recipient] then Balances[msg.Recipient] = "0" end// 檢查發送者的余額是否足夠進行轉賬if bint(msg.Quantity) <= bint(Balances[msg.From]) then// 從發送者余額中扣除數量,并將該數量加到接收者余額。Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Quantity)Balances[msg.Recipient] = utils.add(Balances[msg.Recipient], msg.Quantity)// 通知發送者及接收者 轉賬通知if not msg.Cast thenlocal debitNotice = {Action = 'Debit-Notice',Recipient = msg.Recipient,Quantity = msg.Quantity,Data = Colors.gray .."You transferred " ..Colors.blue .. msg.Quantity .. Colors.gray .. " to " .. Colors.green .. msg.Recipient .. Colors.reset}local creditNotice = {Target = msg.Recipient,Action = 'Credit-Notice',Sender = msg.From,Quantity = msg.Quantity,Data = Colors.gray .."You received " ..Colors.blue .. msg.Quantity .. Colors.gray .. " from " .. Colors.green .. msg.From .. Colors.reset}for tagName, tagValue in pairs(msg) doif string.sub(tagName, 1, 2) == "X-" thendebitNotice[tagName] = tagValuecreditNotice[tagName] = tagValueendendif msg.reply thenmsg.reply(debitNotice)elseSend(debitNotice)endSend(creditNotice)endelseif msg.reply thenmsg.reply({Action = 'Transfer-Error',['Message-Id'] = msg.Id,Error = 'Insufficient Balance!'})elseSend({Target = msg.From,Action = 'Transfer-Error',['Message-Id'] = msg.Id,Error = 'Insufficient Balance!'})endend
end)// mint:鑄造、增發代幣
Handlers.add('mint', Handlers.utils.hasMatchingTag("Action","Mint"), function(msg)assert(type(msg.Quantity) == 'string', 'Quantity is required!')assert(bint(0) < bint(msg.Quantity), 'Quantity must be greater than zero!')if not Balances[ao.id] then Balances[ao.id] = "0" endif msg.From == ao.id thenBalances[msg.From] = utils.add(Balances[msg.From], msg.Quantity)TotalSupply = utils.add(TotalSupply, msg.Quantity)if msg.reply thenmsg.reply({Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset})elseSend({Target = msg.From,Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset})endelseif msg.reply thenmsg.reply({Action = 'Mint-Error',['Message-Id'] = msg.Id,Error = 'Only the Process Id can mint new ' .. Ticker .. ' tokens!'})elseSend({Target = msg.From,Action = 'Mint-Error',['Message-Id'] = msg.Id,Error = 'Only the Process Id can mint new ' .. Ticker .. ' tokens!'})endend
end)// totalSupply:處理查詢總供應量的請求
Handlers.add('totalSupply', Handlers.utils.hasMatchingTag("Action","Total-Supply"), function(msg)assert(msg.From ~= ao.id, 'Cannot call Total-Supply from the same process!')if msg.reply thenmsg.reply({Action = 'Total-Supply',Data = TotalSupply,Ticker = Ticker})elseSend({Target = msg.From,Action = 'Total-Supply',Data = TotalSupply,Ticker = Ticker})end
end)// burn:銷毀代幣,
Handlers.add('burn', Handlers.utils.hasMatchingTag("Action",'Burn'), function(msg)assert(type(msg.Tags.Quantity) == 'string', 'Quantity is required!')assert(bint(msg.Tags.Quantity) <= bint(Balances[msg.From]), 'Quantity must be less than or equal to the current balance!')Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Tags.Quantity)TotalSupply = utils.subtract(TotalSupply, msg.Tags.Quantity)if msg.reply thenmsg.reply({Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset})elseSend({Target = msg.From,  Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset })end
end)

這段合約實現了一個簡單的token系統,支持基本的token操作,如查詢余額、轉賬、鑄造和銷毀token。通過使用處理器模式,代碼結構清晰,易于擴展。若要進一步提高代碼的安全性和可讀性,可以考慮添加詳細的注釋和更多的錯誤處理機制。

4.2 使用golang調用token

package mainimport ("github.com/liteseed/aogo""github.com/liteseed/goar/signer""github.com/liteseed/goar/tag""log"//aogo 庫用于與 Arweave 的智能合約交互//goar 庫用于處理錢包簽名和消息標簽
)func main() {walletPath := "./wallet.json"// 從錢包路徑創建簽名器s, err := signer.FromPath(walletPath)if err != nil {log.Fatalf("創建簽名器失敗:%v", err)}// 初始化 AO 對象ao, err := aogo.New()if err != nil {log.Fatalf("初始化 AO 對象失敗:%v", err)}// 定義目標合約 IDprocessPID := "jysQej65l7KHRZi93csg0rvdmciJNL9hteM1N_yakpE" // 合約 ID// 定義標簽,定義操作及操作者tags := &[]tag.Tag{{Name: "Action", Value: "Balance"},{Name: "Target", Value: "Glj6gtx-NJNXTWOF9z9dN2aue3KyU5A_sxR71L1Cak8"},}// 向目標合約發送消息messageID, err := ao.SendMessage(processPID, "", tags, "", s)if err != nil {log.Fatalf("發送消息失敗:%v", err)}log.Println("成功發送消息,消息 ID:", messageID)res, err := ao.LoadResult(processPID, messageID)if err != nil {log.Fatalf("讀取消息失敗:%v", err)}log.Println(res.Messages)log.Println(res.Error)
}

這段代碼展示了如何在 Arweave 網絡上發送數據并與智能合約交互。通過創建簽名器、定義標簽、發送消息和讀取結果。

4.3 獲取消息信息

可以從API中獲得消息信息:

https://cu49.ao-testnet.xyz/result/zpPRT9ASUBrT1-OO2LRIfz3IeALW9HiSlHhk6QOmRP0?process-id=jysQej65l7KHRZi93csg0rvdmciJNL9hteM1N_yakpE

result 后跟:Message Id,process-id則是我們的token合約ID

返回結果為:

{"Messages":[{"Target":"60vmK1FkO0f84yHggO5os6n3e_YnVF6O7V6IeX1vjaU","Data":"0","Tags":[{"name":"Data-Protocol","value":"ao"},{"name":"Variant","value":"ao.TN.1"},{"name":"Type","value":"Message"},{"name":"From-Process","value":"jysQej65l7KHRZi93csg0rvdmciJNL9hteM1N_yakpE"},{"name":"From-Module","value":"5l00H2S0RuPYe-V5GAI-1RgQEHFInSMr20E-3RNXJ_U"},{"name":"Ref_","value":"10"},{"name":"Balance","value":"0"},{"name":"Account","value":"60vmK1FkO0f84yHggO5os6n3e_YnVF6O7V6IeX1vjaU"},{"name":"Ticker","value":"PNTS"}],"Anchor":"00000000000000000000000000000010"}],"Assignments":[],"Spawns":[],"Output":[],"GasUsed":601453529}

注:所有發送的消息及返回的消息都會上鏈,大概十分鐘左右

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895256.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek模型R1服務器繁忙,怎么解決?

在當今科技飛速發展的時代&#xff0c;人工智能領域不斷涌現出令人矚目的創新成果&#xff0c;其中DeepSeek模型無疑成為了眾多關注焦點。它憑借著先進的技術和卓越的性能&#xff0c;在行業內掀起了一股熱潮&#xff0c;吸引了無數目光。然而&#xff0c;如同許多前沿技術在發…

AIGC-微頭條爆款文案創作智能體完整指令(DeepSeek,豆包,千問,Kimi,GPT)

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列AIGC(GPT、DeepSeek、豆包、千問、Kimi)??關于作者 專注于Android/Unity和各種游戲開發技巧,以及各種資…

[LLM面試題] 指示微調(Prompt-tuning)與 Prefix-tuning區別

一、提示調整(Prompt Tuning) Prompt Tuning是一種通過改變輸入提示語&#xff08;input prompt&#xff09;以獲得更優模型效果的技術。舉個例子&#xff0c;如果我們想將一條英語句子翻譯成德語&#xff0c;可以采用多種不同的方式向模型提問&#xff0c;如下圖所示&#xf…

CSS 性能優化全攻略:提升網站加載速度與流暢度

系列文章目錄 01-從零開始學CSS選擇器&#xff1a;屬性選擇器與偽類選擇器完全指南 02-避免樣式沖突&#xff1a;掌握CSS選擇器優先級與層疊規則的終極指南 03-如何精確掌控網頁布局&#xff1f;深入解析 CSS 樣式與盒模型 04-CSS 布局全面解析&#xff1a;從傳統浮動到現代 F…

自主項目面試點總結

1、許苑–OJ判題系統 技術棧&#xff1a;Spring BootSpring Cloud AlibabaRedisMybatisMQDocker 項目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice 1.1、項目介紹: 一個基于微服務的OJ系統&#xff0c;具備能夠根據管理員預設的題目用例對用戶提交的代…

12.推薦系統的前沿技術

接下來我們將學習推薦系統的前沿技術。推薦系統是一個快速發展的領域&#xff0c;許多新技術和新方法不斷涌現&#xff0c;進一步提升了推薦系統的性能和效果。在這一課中&#xff0c;我們將介紹以下內容&#xff1a; 圖神經網絡&#xff08;GNN&#xff09;在推薦系統中的應用…

【py】python安裝教程(Windows系統,python3.13.2版本為例)

1.下載地址 官網&#xff1a;https://www.python.org/ 官網下載地址&#xff1a;https://www.python.org/downloads/ 2.64版本或者32位選擇 【Stable Releases】&#xff1a;穩定發布版本&#xff0c;指的是已經測試過的版本&#xff0c;相對穩定。 【Pre-releases】&#…

CEF132 編譯指南 MacOS 篇 - depot_tools 安裝與配置 (四)

1. 引言 在 CEF132&#xff08;Chromium Embedded Framework&#xff09;的編譯過程中&#xff0c;depot_tools 扮演著舉足輕重的角色。這套由 Chromium 項目精心打造的腳本和工具集&#xff0c;專門用于獲取、管理和更新 Chromium 及其相關項目&#xff08;包括 CEF&#xff…

1312:【例3.4】昆蟲繁殖

1312&#xff1a;【例3.4】昆蟲繁殖 時間限制: 1000 ms 內存限制: 65536 KB 提交數:60386 通過數: 29787 【題目描述】 科學家在熱帶森林中發現了一種特殊的昆蟲&#xff0c;這種昆蟲的繁殖能力很強。每對成蟲過xx個月產yy對卵&#xff0c;每對卵要過兩個月長成成蟲…

Linux防火墻設置

目錄 Ubuntu防火墻&#xff08;UFW&#xff09;常用設置 1. 查看防火墻狀態 2. 開啟/關閉防火墻 3. 管理端口 4. 管理IP地址 5. 服務管理 CentOS防火墻&#xff08;firewalld&#xff09;常用設置 1. 查看防火墻狀態 2. 啟動/關閉防火墻 3. 設置開機啟動 4. 管理端口…

Git 日志查看與版本回溯

引言 在軟件開發的漫漫長路中&#xff0c;代碼就如同我們搭建軟件大廈的基石&#xff0c;而 Git 則是一位默默守護并精心管理這些基石的 “管家”。它不僅能記錄代碼的每一次變動&#xff0c;還提供了強大的日志查看和版本回溯功能&#xff0c;這些功能就像是給開發者配備了一…

針對Prompt優化的深入分析

一、針對Prompt優化的深入分析 1. 結構化設計 技術原理&#xff1a; 大語言模型&#xff08;LLMs&#xff09;本質是基于概率的序列生成器&#xff0c;結構化模板通過顯式定義輸出框架&#xff08;如角色、段落數、連接詞&#xff09;&#xff0c;利用模型的模式匹配能力&…

fps動作系統9:動畫音頻

文章目錄 動畫音頻創建音頻藍圖cue音量乘數 音效衰減衰減空間 綁定到動畫動畫序列軌道 動畫音頻 創建音頻藍圖 cue 音量乘數 音量大小 音效衰減 空間音效 衰減 空間 綁定到動畫 動畫序列 軌道 橫著的方向是有不同的軌道的&#xff0c;陰影的就是。

TensorRT【詳解】

文章目錄 1、 1、 參考&#xff1a; 1、nVidia TensorRT pytorch Docker 下載&#xff1a;https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags 2、nVidia TensorRT pytorch Docker 版本講解&#xff1a;https://docs.nvidia.com/deeplearning/frameworks/py…

解決QTimer報“Timers cannot be started from another thread“錯誤

今天在Qt編程時&#xff0c;將QTimer在子線程里執行start()函數&#xff0c;遇到“Timers cannot be started from another thread”問題&#xff0c;使用了如下AI工具&#xff0c;進行查詢&#xff1a; ? ? 提示詞A&#xff1a;“C QTimer 如何跨線程” ? ? 提示詞B&#…

【AI知識點】苦澀的教訓 The Bitter Lesson by Rich Sutton(2019)

【AI論文解讀】【AI知識點】【AI小項目】【AI戰略思考】【AI日記】【讀書與思考】【AI應用】 “The Bitter Lesson” 是由 Richard Sutton&#xff08;強化學習領域的先驅之一&#xff09;提出的一個概念&#xff0c;指的是機器學習領域在長期發展過程中&#xff0c;尤其是在強…

單片機上SPI和IIC的區別

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是兩種常用的嵌入式外設通信協議&#xff0c;它們各有優缺點&#xff0c;適用于不同的場景。以下是它們的詳細對比&#xff1a; — 1. 基本概念 SPI&#xff0…

SQL Server安裝流程

SQL Server 2022在安全性、可用性和性能方面不斷創新&#xff0c;是現在最支持Azure的SQL Server版本。 SQL Server發展史 SQL Server的歷史始于1989年&#xff0c;當時是由微軟與Sybase合作的產品&#xff0c;旨在為Windows NT操作系統提供一個高性能的數據庫解決方案。隨著…

VSOMEIP ROUTING應用和CLIENT應用之間交互的消息

#define VSOMEIP_ASSIGN_CLIENT 0x00 // client應用請求分配client_id #define VSOMEIP_ASSIGN_CLIENT_ACK 0x01 // routing應用返回分配的client_id #define VSOMEIP_REGISTER_APPLICATION 0x02 // client應用注冊someip應用 #…

jvm 線程監控調試

文章目錄 前言一、使用JDK工具轉儲線程文件(如jstack)1. 找到Java進程的PID:2. 使用jstack生成線程轉儲文件:3.驗證生成的線程轉儲文件:二、分析文件1.使用在線工具進行分析上傳thread-dump文件,等待解析完成2.查看分析結果總結前言 提示:使用jdk自帶工具轉儲線程監控文…