一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Piccolo-用純Rust實(shí)現(xiàn)的無(wú)棧Lua虛擬機(jī)

jf_wN0SrCdH ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 2024-01-05 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Piccolo - 用純Rust實(shí)現(xiàn)的無(wú)棧Lua虛擬機(jī)

Piccolo,原名luster,在經(jīng)過(guò)數(shù)年的中斷后,于2023年4月悄然恢復(fù)了開(kāi)發(fā)。曾經(jīng)開(kāi)發(fā)過(guò) rlua 的 kyren,在底層gc-arenacrate 取得突破后,回到了piccolo項(xiàng)目。這兩個(gè)項(xiàng)目現(xiàn)在已經(jīng)(小心地)在生產(chǎn)中使用,比如 Fish Folk 用在了游戲腳本中,Ruffle 用于其 ActionScript 虛擬機(jī)。 如今兩個(gè)重要版本的發(fā)布了:piccolo v0.3.0 和 gc-arena v0.5。 Piccolo項(xiàng)目的目標(biāo),按大致優(yōu)先級(jí)降序排列:

成為一個(gè)可以工作、有用的 Lua 解釋器。

成為一種簡(jiǎn)單而可靠的方式,用于安全地隔離不受信任的Lua腳本。

抵御來(lái)自不受信任腳本的 DoS 攻擊(腳本不能夠?qū)е陆忉屍鞅罎⒒蚴褂脽o(wú)限量的內(nèi)存,并應(yīng)保證在有限時(shí)間內(nèi)返回控制權(quán)給調(diào)用者)。

提供一種安全地將 Rust API 綁定到 Lua 的簡(jiǎn)便方法,具有對(duì)異常情況和邊緣情況具有處理的綁定系統(tǒng),并且用戶(hù)類(lèi)型可以安全地參與運(yùn)行時(shí)垃圾回收。

與某些版本的 PUC-Rio Lua 兼容。

不要過(guò)于緩慢(例如,避免不必要的抽象化)。

使用 Rust 生成 IP 地址的 PNG 圖片

看起來(lái)像是這樣:

c5f4c42c-ab0e-11ee-8b88-92fbcf53809c.png

原文是一個(gè)詳盡的教程,告訴讀者如何一步一步的實(shí)現(xiàn)這個(gè)例子,感興趣的可以查看原文。最終實(shí)現(xiàn)其實(shí)代碼很簡(jiǎn)潔:

use std::{io::Cursor, net::SocketAddr, sync::OnceLock};

use axum::{
extract::ConnectInfo,
http::{header, StatusCode},
response::IntoResponse,
routing::get,
Router,
};
use image::{ImageBuffer, ImageOutputFormat, Rgb};
use imageproc::drawing::draw_text_mut;
use rusttype::{Font, Scale};

const X: i32 = 8;
const Y: i32 = 96;
const WIDTH: u32 = 256;
const HEIGHT: u32 = WIDTH;
const TEXT_COLOR: Rgb= Rgb([235, 219, 178]);
const BACKGROUND_COLOR: Rgb= Rgb([177, 98, 134]);
const SCALE: Scale = Scale { x: 32.0, y: 32.0 };
const FONT_DATA: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/fonts/UbuntuMono-R.ttf"
));

#[derive(Debug, thiserror::Error)]
#[error("Failed to generate image: {0}")]
struct AvatarError(#[from] image::ImageError);

impl IntoResponse for AvatarError {
fn into_response(self) -> axum::response::Response {
(StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response()
}
}

fn font() -> &'static Font<'static> {
static FONT: OnceLock= OnceLock::new();
FONT.get_or_init(|| Font::try_from_bytes(FONT_DATA).expect("Built-in font data was invalid"))
}

async fn avatar(
ConnectInfo(addr): ConnectInfo,
) -> Result {
// Wow, IPv6 causes a lot of headache.
let ip = addr.ip().to_canonical();
letmut img = ImageBuffer::from_pixel(WIDTH, HEIGHT, BACKGROUND_COLOR);

draw_text_mut(&mut img, TEXT_COLOR, X, Y, SCALE, font(), "Hello,");
let y = Y + SCALE.y asi32;
draw_text_mut(&mut img, TEXT_COLOR, X, y, SCALE, font(), &format!("{ip}!"));

letmut cursor = Cursor::new(vec![]);
img.write_to(&mut cursor, ImageOutputFormat::Png)?;

Ok(([(header::CONTENT_TYPE, "image/png")], cursor.into_inner()))
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
let app = Router::new().route("/avatar.png", get(avatar));

let listener = tokio::net::TcpListener::bind("[::]:3000").await?;
let make_service = app.into_make_service_with_connect_info::();
axum::serve(listener, make_service).await?;
Ok(())
}







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    966

    瀏覽量

    29217
  • Lua
    Lua
    +關(guān)注

    關(guān)注

    0

    文章

    83

    瀏覽量

    10922
  • 解釋器
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    6731
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    7015

原文標(biāo)題:【Rust日?qǐng)?bào)】Piccolo - 用純Rust實(shí)現(xiàn)的無(wú)棧Lua虛擬機(jī)

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    TECS OpenStack資源池虛擬機(jī)網(wǎng)絡(luò)二層地址無(wú)法互通的問(wèn)題處理

    某運(yùn)營(yíng)商TECS OpenStack使用主機(jī)overlay SDN方案組網(wǎng),運(yùn)維人員在創(chuàng)建虛擬機(jī)測(cè)試虛擬機(jī)網(wǎng)絡(luò)狀態(tài)時(shí)發(fā)現(xiàn)問(wèn)題:在其中一臺(tái)主機(jī)上創(chuàng)建兩臺(tái)同網(wǎng)段虛擬機(jī)虛擬機(jī)之間二層地址無(wú)
    的頭像 發(fā)表于 06-12 09:28 ?216次閱讀
    TECS OpenStack資源池<b class='flag-5'>虛擬機(jī)</b>網(wǎng)絡(luò)二層地址無(wú)法互通的問(wèn)題處理

    hyper 備份,Hyper備份:虛擬機(jī)備份與恢復(fù)

    的解決方案。今天就為大家介紹Hyper備份:虛擬機(jī)備份與恢復(fù)。 ? ?在虛擬化環(huán)境中,備份和恢復(fù)虛擬機(jī)是確保數(shù)據(jù)安全和業(yè)務(wù)連續(xù)性的關(guān)鍵操作。Hyper-V提供了多種備份和恢復(fù)方法,幫助用戶(hù)靈活地管理
    的頭像 發(fā)表于 02-08 09:53 ?824次閱讀
    hyper 備份,Hyper備份:<b class='flag-5'>虛擬機(jī)</b>備份與恢復(fù)

    hyper v 上網(wǎng),Hyper-V上網(wǎng):虛擬機(jī)網(wǎng)絡(luò)配置

    大家介紹Hyper-V上網(wǎng):虛擬機(jī)網(wǎng)絡(luò)配置。 ? ?在Hyper-V環(huán)境中,正確配置虛擬機(jī)的網(wǎng)絡(luò)設(shè)置是確保虛擬機(jī)能夠正常訪(fǎng)問(wèn)外部網(wǎng)絡(luò)的關(guān)鍵。以下是詳細(xì)的Hyper-V虛擬機(jī)網(wǎng)絡(luò)配置指南
    的頭像 發(fā)表于 02-06 10:29 ?3017次閱讀
    hyper v 上網(wǎng),Hyper-V上網(wǎng):<b class='flag-5'>虛擬機(jī)</b>網(wǎng)絡(luò)配置

    Ubuntu系統(tǒng)的虛擬機(jī)安裝步驟 如何在Ubuntu系統(tǒng)上編譯軟件

    Ubuntu系統(tǒng)上安裝虛擬機(jī)的步驟 在Ubuntu系統(tǒng)上安裝虛擬機(jī)是一個(gè)相對(duì)簡(jiǎn)單的過(guò)程,通??梢酝ㄟ^(guò)安裝VirtualBox或KVM等虛擬化軟件來(lái)實(shí)現(xiàn)。以下是使用VirtualBox在
    的頭像 發(fā)表于 12-12 14:36 ?1179次閱讀

    虛擬化數(shù)據(jù)恢復(fù)—XenServer虛擬機(jī)數(shù)據(jù)恢復(fù)案例

    Server操作系統(tǒng)虛擬機(jī),該虛擬機(jī)有2塊虛擬磁盤(pán)(系統(tǒng)盤(pán)+數(shù)據(jù)盤(pán)),當(dāng)作網(wǎng)站服務(wù)器使用。 服務(wù)器虛擬化故障: XenServer虛擬機(jī)
    的頭像 發(fā)表于 11-08 10:32 ?493次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—XenServer<b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)——Hyper-V虛擬機(jī)數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)環(huán)境: Windows Server操作系統(tǒng)服務(wù)器上部署Hyper-V虛擬機(jī)環(huán)境。虛擬機(jī)的硬盤(pán)文件和配置文件存放在一臺(tái)存儲(chǔ)中,該存儲(chǔ)上有一組由4塊硬盤(pán)組建的raid5陣列,除此之外
    的頭像 發(fā)表于 10-25 09:26 ?653次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)——Hyper-V<b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)案例

    Lua語(yǔ)法基礎(chǔ)教程(上篇)

    意味著Lua虛擬機(jī)可以很方便的嵌入別的程序里,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。而整個(gè)Lua虛擬機(jī)編譯后僅僅一百余K,經(jīng)過(guò)適當(dāng)?shù)牟眉暨€能做到更小,十分適合嵌入式的開(kāi)發(fā)。 同時(shí),在
    的頭像 發(fā)表于 10-24 07:17 ?777次閱讀

    虛擬機(jī)數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致XenServer虛擬機(jī)不可用的數(shù)據(jù)恢復(fù)案例

    虛擬機(jī)數(shù)據(jù)恢復(fù)環(huán)境: 某品牌服務(wù)器通過(guò)同品牌某型號(hào)的RAID卡,將4塊STAT硬盤(pán)為一組RAID10陣列。上層部署XenServer虛擬化平臺(tái),虛擬機(jī)安裝Windows Server系統(tǒng),每臺(tái)
    的頭像 發(fā)表于 10-21 14:17 ?509次閱讀
    <b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致XenServer<b class='flag-5'>虛擬機(jī)</b>不可用的數(shù)據(jù)恢復(fù)案例

    鴻蒙跨端實(shí)踐-JS虛擬機(jī)架構(gòu)實(shí)現(xiàn)

    在Roma跨端方案中,JS虛擬機(jī)是框架的核心,負(fù)責(zé)執(zhí)行動(dòng)態(tài)化的JS代碼。在A(yíng)ndroid平臺(tái)采用了基于V8的J2V8,iOS平臺(tái)則使用了系統(tǒng)自帶的JSCore,而在HarmonyOS中,由于業(yè)界無(wú)
    的頭像 發(fā)表于 09-30 14:42 ?2928次閱讀
    鴻蒙跨端實(shí)踐-JS<b class='flag-5'>虛擬機(jī)</b>架構(gòu)<b class='flag-5'>實(shí)現(xiàn)</b>

    虛擬化數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致VMware虛擬機(jī)文件丟失的數(shù)據(jù)恢復(fù)案例

    某品牌服務(wù)器(部署VMware EXSI虛擬機(jī))+同品牌存儲(chǔ)(存放虛擬機(jī)文件)。
    的頭像 發(fā)表于 09-14 17:35 ?1217次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—異常斷電導(dǎo)致VMware<b class='flag-5'>虛擬機(jī)</b>文件丟失的數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)—EXSI虛擬機(jī)誤還原快照如何恢復(fù)數(shù)據(jù)?

    虛擬化技術(shù)原理是將硬件虛擬化供不同的虛擬機(jī)使用,一臺(tái)物理機(jī)上可以有多臺(tái)虛擬機(jī)。人為誤操作或者物理機(jī)故障會(huì)導(dǎo)致上層
    的頭像 發(fā)表于 09-09 11:56 ?677次閱讀
    <b class='flag-5'>虛擬</b>化數(shù)據(jù)恢復(fù)—EXSI<b class='flag-5'>虛擬機(jī)</b>誤還原快照如何恢復(fù)數(shù)據(jù)?

    什么是虛擬機(jī)?什么是虛擬化?

    在日新月異的科技世界中,虛擬化技術(shù)如同一座橋梁,連接著現(xiàn)實(shí)與數(shù)字的鴻溝,為我們打開(kāi)了全新的計(jì)算維度。虛擬機(jī),這一概念,自其誕生以來(lái),就以其獨(dú)特的魅力和強(qiáng)大的功能,深深地影響了軟件開(kāi)發(fā)、系統(tǒng)測(cè)試和云計(jì)算等多個(gè)領(lǐng)域。即使目前你還不了解它的應(yīng)用,你應(yīng)該也聽(tīng)過(guò)
    的頭像 發(fā)表于 09-04 14:55 ?2093次閱讀

    創(chuàng)建ubuntu虛擬機(jī)

    英文的習(xí)慣。創(chuàng)建ubuntu虛擬機(jī)打開(kāi)VMware軟件,點(diǎn)擊創(chuàng)建新的虛擬機(jī)。進(jìn)入以下界面:選擇自定義,點(diǎn)擊“下一步”。選擇對(duì)應(yīng)VMware版本的兼容性,版本可在幫助->關(guān)于VMware
    發(fā)表于 08-10 14:15

    虛擬機(jī)數(shù)據(jù)恢復(fù)—KVM虛擬機(jī)被誤刪除的數(shù)據(jù)恢復(fù)案例

    虛擬機(jī)數(shù)據(jù)恢復(fù)環(huán)境: Linux操作系統(tǒng)服務(wù)器,EXT4文件系統(tǒng)。服務(wù)器中有數(shù)臺(tái)KVM虛擬機(jī)。 虛擬機(jī)1:主數(shù)據(jù)庫(kù)服務(wù)器 虛擬磁盤(pán):系統(tǒng)盤(pán)(qcow2)+數(shù)據(jù)盤(pán)(raw)
    的頭像 發(fā)表于 08-07 13:33 ?747次閱讀
    <b class='flag-5'>虛擬機(jī)</b>數(shù)據(jù)恢復(fù)—KVM<b class='flag-5'>虛擬機(jī)</b>被誤刪除的數(shù)據(jù)恢復(fù)案例

    什么是虛擬機(jī)虛擬機(jī)真的那么好用嗎?

    在日新月異的科技世界中,虛擬化技術(shù)如同一座橋梁,連接著現(xiàn)實(shí)與數(shù)字的鴻溝,為我們打開(kāi)了全新的計(jì)算維度。虛擬機(jī),這一概念,自其誕生以來(lái),就以其獨(dú)特的魅力和強(qiáng)大的功能,深深地影響了軟件開(kāi)發(fā)、系統(tǒng)測(cè)試和云
    的頭像 發(fā)表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機(jī)</b>?<b class='flag-5'>虛擬機(jī)</b>真的那么好用嗎?