Rust 实现的教学软件 franzplot

米兰理工大学的一名研究助理,担任了 “设计的曲线和表面”课程的助教,这门课主要是为设计专业的学生解释三维数学概念。因为没有趁手的教学工具,所以这位助教自己用 Rust 实现了一个。

第一个版本是 cpp 实现的。然后新版本用 Rust 重写了,为什么呢?

  1. 他在cpp版本内亏欠的技术债务太多,不利于开源协同
  2. OpenGL 已经被苹果废弃
  3. 想让工具变得更加强大

所以,现在用 WebGPU + Rust 重写了这个工具,基于 wgpu。FranzPlot目前是闭源的,未来可能会开源。因为尽管重新写了软件,也还需要处理一些技术债务。另外想完全使用 WGSL 而抛弃 GLSL ,还想将界面替换为纯 Rust 实现,比如使用 egui 框架。现在是用 imgui-rs。

介绍链接,https://gfx-rs.github.io/stories/franzplot

【Rust日报】2021-07-17 Rust 实现的教学软件 franzplot_分页

在 Windows 上使用 Rust 进行开发

在 Windows 上使用 Rust 进行开发,包括开发环境的设置、Windows 的 Rust 和代码示例。

链接,https://docs.microsoft.com/en-us/windows/dev-environment/rust/

Minus 发布 v4.0.0

Minus,是 Rust 实现的一个快速,异步终端分页库。它提供了高级功能,可以方便地为任何终端应用程序编写分页器。minus 同时支持 tokio 和 async-std 运行时。更重要的是,如果只想使用 minus 提供静态输出,也可以选择不使用这些动态特性。

项目Github链接,https://github.com/arijit79/minus

Minus v4.0.0 Changelog,https://github.com/arijit79/minus/blob/main/CHANGELOG.md

Lexopt

Lexopt 是一个 Rust 实现的参数解析器。它试图用最简单的设计保持正确性。它是如此简单,以至于使用起来有点乏味。

使用示例如下:

struct Args {
thing: String,
number: u32,
shout: bool,
}

fn parse_args() -> Result<Args, lexopt::Error> {
use lexopt::prelude::*;

let mut thing = None;
let mut number = 1;
let mut shout = false;
let mut parser = lexopt::Parser::from_env();
while let Some(arg) = parser.next()? {
match arg {
Short('n') | Long("number") => {
number = parser.value()?.parse()?;
}
Long("shout") => {
shout = true;
}
Value(val) if thing.is_none() => {
thing = Some(val.into_string()?);
}
Long("help") => {
println!("Usage: hello [-n|--number=NUM] [--shout] THING");
std::process::exit(0);
}
_ => return Err(arg.unexpected()),
}
}

Ok(Args {
thing: thing.ok_or("missing argument THING")?,
number,
shout,
})
}

fn main() -> Result<(), lexopt::Error> {
let args = parse_args()?;
let mut message = format!("Hello {}", args.thing);
if args.shout {
message = message.to_uppercase();
}
for _ in 0..args.number {
println!("{}", message);
}
Ok(())
}

项目Github链接,https://github.com/blyxxyz/lexopt

Highnoon

Highnoon,一个 Rust 实现基于 Hyper 的最小化网络框架。

使用示例如下:

struct MyState;

impl highnoon::State for MyState {
type Context = ();

fn new_context(&self) -> Context {
()
}
}

#[tokio::main]
async fn main() -> highnoon::Result<()> {
let mut app = highnoon::App::new(MyState);

app.with(highnoon::filter::Log);

app.at("/hello").get(|_request| async {
"Hello world!\n\n"
});

app.listen("0.0.0.0:8888").await?;
Ok(())
}

项目GitHub链接,https://github.com/sphenlee/highnoon



社区学习交流平台订阅:

  • Rustcc论坛: 支持rss
  • 微信公众号:Rust语言中文社区