goldboot 是一款用于为真实硬件构建机器镜像的工具,能够实现接近不可变的基础设施,而无需进行大量额外的工作。
在 Goldboot 的方法中,可以为每台部署的计算机创建一个声明性配置文件。利用这个配置文件,Goldboot 可以在本地计算机或 CI 平台(如 Github Actions)上构建镜像。生成的镜像可以通过 USB 驱动器或 PXE 启动部署到实际硬件上。
GitHub: https://www.php.cn/link/64566c7205d7788234fa94f496ae3478
Valitron 是一个用于 Rust 的字段校验工具。
新版本的更新包括:
示例代码语言:javascript,运行次数:0
fn main() { let validator = Validator::new() .rule("name", Required.and(StartWith("hello"))) .rule("age", custom(age_limit)) .message([ ("name.required", "name is required"), ("name.start_with", "name should be starts with `hello`"), ]); let person = Person { name: "li", age: 18, }; let res = validator.validate(person); // or using trait let res = person.validate(validator); } fn age_limit(n: &mut u8) -> Result { if *n >= 25 && *n
GitHub: https://www.php.cn/link/d2f53008ecf7568f1abeb455e1dcf5e4
Zeke 是一个基于 Tokio 的 HTTP 库,专注于简单和极简主义。以下是一些示例:
代码语言:javascript,运行次数:0
use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use zeke::http::{ context::{get_context, set_context, Contextable}, handler::Handler, middleware::{Middleware, MiddlewareGroup}, response::{new_response, set_header}, router::{Route, Router}, }; #[tokio::main] async fn main() { //================================================================ // creating a router //================================================================ let mut r = Router::new(); //================================================================ // creating a handler //================================================================ pub fn handle_home() -> Handler { return Handler::new(|request| { let response = new_response(200, "<h1>Home</h1><a href=\"/about\">About</a>"); let response = set_header(response, "Content-Type", "text/html"); return (request, response); }); } pub fn handle_about() -> Handler { return Handler::new(|request| { let response = new_response(200, "<h1>About</h1><a href=\"/\">Home</a>"); let response = set_header(response, "Content-Type", "text/html"); return (request, response); }); } //================================================================ // creating a type to represent shared state //================================================================ pub enum AppContext { Trace, } impl Contextable for AppContext { fn key(&self) -> &'static str { match self { AppContext::Trace => {"TRACE"}, } } } //================================================================ // creating a middleware to track when our request starts //================================================================ pub fn mw_trace() -> Middleware { return Middleware::new(|request| { let trace = HttpTrace{ time_stamp: chrono::Utc::now().to_rfc3339(), }; let trace_encoded = serde_json::to_string(&trace); match trace_encoded { Ok(trace_encoded) => { set_context(request, AppContext::Trace, trace_encoded); return None; }, Err(_) => { return Some(new_response(500, "failed to encode trace")); } } }); } //================================================================ // creating a middleware to log our request processing time //================================================================ pub fn mw_trace_log() -> Middleware { return Middleware::new(|request| { let trace = get_context(&request.context, AppContext::Trace); if trace == "" { return Some(new_response(500, "trace not found")); } let trace: HttpTrace = serde_json::from_str(&trace).unwrap(); let elapsed_time = trace.get_time_elapsed(); let log_message = format!("[{}][{}][{}]", request.method, request.path, elapsed_time); println!("{}", log_message); return None; }); } //================================================================ // grouping middleware for reusability //================================================================ pub fn mw_group_trace() -> MiddlewareGroup { return MiddlewareGroup::new(vec![mw_trace()], vec![mw_trace_log()]); } //================================================================ // creating a type to track our request processing time //================================================================ #[derive(Debug, Serialize, Deserialize)] pub struct HttpTrace { pub time_stamp: String, } impl HttpTrace { /// Prints the time elapsed since the `time_stamp` was set. pub fn get_time_elapsed(&self) -> String { if let Ok(time_set) = DateTime::parse_from_rfc3339(&self.time_stamp) { let time_set = time_set.with_timezone(&Utc); let now = Utc::now(); let duration = now.signed_duration_since(time_set); let micros = duration.num_microseconds(); match micros { Some(micros) => { if micros { } } } let millis = duration.num_milliseconds(); return format!("{}ms", millis); } else { return "failed to parse time_stamp".to_string(); } } } //================================================================ // mounting handlers with middleware/outerware //================================================================ // mount a handler with middleware/outerware r.add(Route::new("GET /", handle_home()) .middleware(mw_trace()) .outerware(mw_trace_log()) ); // mount a handler with a middleware group r.add(Route::new("GET /about", handle_about()) .group(mw_group_trace()) ); //================================================================ // starting the server //================================================================ let err = r.serve("127.0.0.1:8080").await; match err { Some(e) => { println!("Error: {:?}", e); }, None => { println!("Server closed"); }, } }
GitHub: https://www.php.cn/link/a555ec5f81ae0b44cb4a94424aa510bf
Ufetch 是一个简单的 Linux 系统信息获取工具。
使用方法:
$ ufetch
它提供以下信息:操作系统(OS)、内核(Kernel)、主机名(Host)、Shell、已安装软件包(Packages)、CPU、GPU、内存(Memory)、磁盘(Disk)等。
GitHub: https://www.php.cn/link/c227f47adae0efadb834fcf162f5bbd5
以上就是【Rust日报】2024-05-12 镜像工具Goldboot的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号