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号