< 返回版块

2019-10-01 21:46    责任编辑:jay

标签:rust, diary

rust

aes-gcm-siv 高性能身份验证加密

#rust #crate

Read More

cargo-audit 一个发现漏洞的CI工具

#crate #cargo

neural-net

neural-net, Rust语言写的一个"教学型"神经网络库。

Github

rust_cmd_lib

rust_cmd_lib, 常见的rust命令行宏和utils,可轻松编写类似于任务的shell脚本。

Github

CloudFlare 增加 HTTP/3 and QUIC 支援

Read more

再大約六星期後就會有 Async/await 了

Read more

pin-project 符合人體工學的 pin 保護功能

範例

use pin_project::pin_project;
use std::pin::Pin;

#[pin_project]
struct Struct<T, U> {
    #[pin]
    pinned: T,
    unpinned: U,
}

impl<T, U> Struct<T, U> {
    fn foo(self: Pin<&mut Self>) {
        let this = self.project();
        let _: Pin<&mut T> = this.pinned; // Pinned reference to the field
        let _: &mut U = this.unpinned; // Normal reference to the field
    }
}

Read more

Rust 1.38 发布

Rust 官方今天如期发布了 1.38。这次的主要改进有:

  • 流水线编译,提升 10%~20% 的性能
  • #[deprecated] 标签,明确标出某些功能不推荐使用了。(不需要在注释里面标注了)
  • std::any::type_name,用于调试时打出类型名字

比如:

fn gen_value<T: Default>() -> T {
    println!("Initializing an instance of {}", std::any::type_name::<T>());
    Default::default()
}

fn main() {
    let _: i32 = gen_value();
    let _: String = gen_value();
}

会打印出

Initializing an instance of i32
Initializing an instance of alloc::string::String

想要啊。

还有很多其它改进,请查看原文。

Read More: https://blog.rust-lang.org/2019/09/26/Rust-1.38.0.html

bumper-rs - 打出你的 Cargo.toml 版本号

Repo: https://github.com/segfaultsourcery/bumper-rs

pkghist - 获取 Pacman 包管理的版本历史

Repo: https://github.com/herzrasen/pkghist

type-freak - runtime-free 类型集合

这个库提供:

  • Non-trivial static assertions and type guards.
  • Typed list that supports insertion, removal and look-up.
  • Trait-level Boolean and Option
  • Some little tools on tuple types.

Repo: https://github.com/jerry73204/rust-type-freak


Nushell 0.3.0 发布

Nushell(简称Nu)是一种新型的shell,它采用现代的结构化方法来处理命令行。它与来自文件系统、操作系统和越来越多的文件格式的数据无缝地工作,使构建强大的命令行管道变得容易。

Nushell 0.3.0 更新特性:

  • 新的表格设计

  • 原生支持多种文件格式,包括:bson, tsv, sqlite, 和 url-encoded 字符串
  • 新的命令
    • help - 内置的帮助系统
    • reverse - 逆序表格
    • last - 跟 first 命令类似,但是从表格的尾巴开始返回 n 行数据
    • embed - 以当前表格为开始创建一个新的表格
    • fetch - 通过 URL 获取内容
    • post - 通过 post 指定的 URL 获得结果
    • pwd - 展示当前目录
    • env - 访问一些重要的路径和环境变量配置
    • pivot - 旋转表格进行行转列
    • echo - 内置的 echo 命令 — 增强错误提示

  • Shell 特征提醒
  • 插件支持
  • 支持 Docker

更多请查看 Nushell 0.3.0

Rust 1.38.0 pre-release 开始测试

Rust 1.38.0 计划在 9 月 26 日发布,发布日志可以查看 https://github.com/rust-lang/rust/blob/master/RELEASES.md

可以通过以下方式尝试:

RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stable

type-freak - 一组类型数据结构、特征操作符和有用的 Rust 类型别名的集合

通过设计将运行时计算减少到最小, DSTs 由特征操作符操作。也就是说,使用Rust的相关类型和泛型,我们可以构建 non-trivial 的类型,比如 lists 和 key-value map

  • TList: 可以以任意类型作为 key 的list
  • KVList: 跟 TList 类似,包括额外的数据
  • Boolean: 布尔类型
  • Maybe: 与 std::optoin::Option 类似的特质
  • tuple types
  • Counter: 用于构建递归特征操作符的convient类型
  • Control flow

Repo 链接:rust-type-freak

Rust官方Purple协议已经部署

Purple是一种高度可扩展的通用去中心化分类账协议,最先进的算法和架构设计。Purple有可能达到每秒处理数以千计的事务之高效率,这或将推动去中心化分类账技术的主流应用。

Purple协议对其支持的应用程序类型是未知的,他支持的应用程序可以是任何东西,从没有属性的简单的已发行资产到成熟的去中心化保险单或KYC。

但目前这个协议仍然是实验性质的,还需要在一个大型网络上进行压力测试之后才能确定其是否能稳定使用。

前往GitHub了解更多

Ndarray 0.13 发布

经历了10个月,他的最新版本终于发布上了crates.io

ndarray为通用元素和数字提供n维数组,其实质与Python的NumPy类似。

新增功能:

集成 rayon 支持:将yanon支持移入Crate。可以从数组运行并行迭代器,并行化Zip原语,以对多个数组或其他NdProducers进行锁步迭代。

Raw 视图:如果ArrayViewMut类比于&mut T,则新的RawArrayViewMut类似于* mut T,并作为数组视图。这对于我们的内部组件来说是一个有用的低级原语,它将帮助我们编写与正在开发的不安全代码准则兼容的Rust程序。

Approx 支持:ndarray现在支持更灵活的近似比较。

改良 azip!() 语法:azip是用于在多个数组或NdProducers上编写锁步循环的宏,现在它的语法与通常的for循环更相似。

更多升级: 新方法.as_standard_layout() 新数组存储类型CowArray 新方法.mean() 运行时能够检测到的SIMD支持的matrixmultiply

前往GitHub了解更多

IntelliJ Rust更新日志

https://intellij-rust.github.io/2019/09/23/changelog-106.html

DataFusion 0.15.0 支持并行查询操作

https://andygrove.io/2019/09/datafusion-0.15.0-release-notes/

s3rs - Amazon S3 富客户端

S3 是亚马逊的存储服务。这个库是 rust 实现的客户端,功能相当丰富,基本涵盖了 Amazon S3 的所有功能。

Repo: https://github.com/yanganto/s3rs

Rust官方CLI工作组发布一款诊断工具:cbor-diag-cli

cbor-diag-cli,一款使用简洁二进制对象表示(Concise Binary Object Representation,CBOR)的诊断工具。该工具可以解析二进制,十六进制和诊断符号格式表示的CBOR项。 然后将它们输出为二进制,十六进制(带有或不带有注释)和诊断符号(紧凑或“漂亮”)。

更多信息

LLVM 9.0.0 发布

更多信息

使用cargo build -Ztimings可视化构建crate的时间

测试这个需要首先更新到最新的nightly版本。

更多信息

blend - .blend文件的解析器和运行时

它是一个用于Blender解析.blend文件的库 使用案例

use blend::Blend;
/// Prints the name and position of every object
fn main() {
    let blend = Blend::from_path("file.blend");

    for obj in blend.get_by_code(*b"OB") {
        let loc = obj.get_f32_vec("loc");
        let name = obj.get("id").get_string("name");

        println!("\"{}\" at {:?}", name, loc);
    }
}

Repo:https://github.com/lukebitts/blend

blend: .blend文件的解析器和运行时

更多信息

toml <--> json 轉換器

讓大家自由轉換兩種格式,有線上版

Read more

oorandom 輕量prng偽隨機數產生器

編譯比rand快十倍,簡單快速的隨機數產生器

Read more

tikv這個月更新了四個小版本,並計畫4.0的製作

在 2.1.17 與 3.0.3 可以用 config-check 來確認是否可以升級

Read more

rust-shell-script

有人做了一個類似 rust 的腳本,可以轉換成 shell script

Read more

licensor : license產生器

快速產生各種license

Read more

衛生宏即將穩定

Fn-like 宏跟 attribute 宏在 extern 區塊
Fn-like 程序宏在型別位置

Fn-like macros and attribute macros in extern blocks
Fn-like procedural macros in type positions

Read more

rs-pbrt v0.7.1

物理渲染器更新了

kd tree 加速 LanczosSinc 過濾器 ProjectionLight 投射光 Mitchell-Netravali 過濾器

Read more

Xcode 的 rust 工具链 - rust-bitcode

在Rust的标准版本中,ARM64 iOS目标中的位代码通常与 Xcode 不兼容,因为它们使用不同版本的LLVM。这是一个众所周知的问题,目前还没有明确的长期解决方案。

这个存储库包含用于构建和安装自定义 Rust nightly 的脚本,其中 Rust 编译器版本的 LLVM 与 Xcode 匹配。使用此工具链构建的软件可以包含在支持位码的应用程序中,这些应用程序将安装在真正的 iOS 设备上。

了解更多请看:https://github.com/getditto/rust-bitcode

更新到最新可行的 nightly 版本

以前如果用户在 nightly 版本安装了最近的 nightly 版本无法使用的组件,那么 rustup update 根本不会更新用户的 nightly 组件。有了这个补丁,rustup 将逐步尝试更老的 nightly 应用程序,直到找到一个支持用户为当前 nightly 应用程序安装的所有组件的 nightly 应用程序。

Read more

Rants:异步NATS客户端库

Rants是一个使用 async / await 语法和新的异步生态系统的异步NATS客户端库。

配置直接处理消息的NATS客户端协议基础设施(与低级解析细节相反)十分的简单。此库的作者曾经用nom编写过底层解析器并将其集成到一个自定义tokio::codec::Decoder中。新的编解码器提供了一个用于处理来自NATS服务器的所有传入消息的高级流。

更多信息前往GitHub

bitwarden_rs - 非官方的Bitwarden服务器

这是一个用Rust编写的Bitwarden server API实现,与上游的Bitwarden客户机兼容,非常适合在运行官方资源密集型服务可能并不理想的情况下进行自托管部署。

Repo:https://github.com/dani-garcia/bitwarden_rs

templar - 动态模板框架

Templar既是一个Rust库,也是一个CLI工具,用于处理模板。其用法和风格都受到了Jinja2和Ansible的启发,尽管它并不是这两种方法的克隆。该项目的目标是提供快速和灵活的动态模板,特别是用于配置和本地工具。

例如,一个简单的模板可能是这样的

user_name={{ user.name }} {# Replace with the context property 'name' in 'user' #}
full_context={{ . | json("pretty") }} {# Dump the entire context as JSON, '.' is the root node #}
password={{ script('echo hunter2 | md5sum') }} {# Execute a shell command and calculate the MD5 sum #}

除了简单的替换之外,还可以使用更复杂的表达式。

The calculated result is {{ 100 * 5 / 10 }} {#- Prints '50' #}

Today's guest list:
{%- for person in ['Bob', 'Joe', 'Jen', 'Amy')] %}
* {{ person }} will come to the party!
{%- endif %} {#- This will loop everyone in the inline array above, but they array could also come from the context #}

Rust Forge — Rust官方补充文档存储库

#rust #doc

Rust Forge用作对Rust编程语言成员有用的补充文档的存储库。如果发现任何错误,拼写错误或想要添加到Rust Forge,可以在Rust Forge GitHub上提交问题或PR。

Read More

用rust编写的zstd解码器

Zstandard算法是一个无损压缩数据的格式,该格式独立于CPU类型、操作系统、文件系统和字符集,适用于文件压缩、通道和流压缩。

即使对于任意长的顺序呈现的输入数据流,也可以仅使用有限量的先验中间存储来产生或减少数据,因此可以用于数据通信。该压缩格式使用Zstandard压缩方法并使用xxHash-64校验方法(可选)来检测数据损坏。

以Zstandard定义的数据格式不会允许随机访问压缩数据。

兼容的解压器必须能够解压缩至少一个符合此处提供的规范的工作参数集。它也可能会忽略例如校验和之类的信息字段。只要它不支持压缩流中定义的参数,它就必须产生一个非模糊的错误代码和相关的错误消息,说明那个参数不受支持。

目前此rust工程已经能够做到:

  1. 解析/ decodecorpus_files中的所有文件。这些是由原始zstd开发人员使用decodecorpus生成的
  2. 将所有这些都正确解码到输出缓冲区
  3. 解码我在本地创建的所有decode_corpus文件(1000+)

更多信息可以前往GitHub上浏览。

Rustup 1.19.0 发布

Rustup工作组很高兴地宣布发布Rustup 1.19.0。可以从通常的地方或通过运行rustup self update来获取更新它。

这个版本的rustup进行了以下改进:

  • 管道pipeline,启用全线程IO以进行安装,这有望实现更快的解包速度。
  • 缓解了一些病毒扫描程序的状况
  • ......

详细信息可以在changelog中找到。

用Rust移植Tectonic

Tectonic是用C语言实现的,一款现代化,完整,独立的TeX/LaTeX引擎,由XeTeX和TeXLive提供支持。

CrLF0710正在用 c2rust 工具移植它。项目Github

glint 用Rust編寫的commit 提示工具

可以更智慧的送交git

image alt

Read more

structopt 升级到了0.3版本

#rust #cli

structopt 是一个基于结构体配置的命令行工具开发框架,0.3版本有两个主要的变化:

  1. 用span大幅改善错误报告
  2. 不再需要特別的技巧去调用claps方法与其它相关的方法,像是字串比对比(或raw attribute存取)之类的

Read More

如何为一个crate减少编译时间

作者开发一个应用时发现编译一次要花好长时间,真的太痛苦了,他尝试从几个方面解决编译时间问题,比如删除一些宏,将一些简单的正则表达式替换为rust标准库的API,删除一些其他的create等,虽然方法并不通用,但思路也有可取之处。

Read More

Starship,Rust编写的shell提示工具

Starship是任何shell的最小,极快,极其可定制的提示工具!提示会在工作时显示需要的信息。

Starship

官方网站

fastwfc-rs: libfastwfc 的 Rust 綁定庫

libfastwfc 是一個學術用波函數折疊的庫

目前還非常的小 codebase 也才400行 應該是可以直接用Rust快速重寫的庫

Read more

Iced 與渲染無關的GUI庫,專注於簡單與類型安全。參考Elm

image alt

Read more

Texture Synthesis 材質合成補完的庫 來自 embark.games

這個團隊使用rust來開發各種功能,且用UE4開發他們的場景Demo, 非常厲害的團隊。

Read more github youtube

hyper 0.13 alpha 版本发布,支持 async/await

hyper 0.13 alpha 版本发布,它是一个使用 Rust 编写的成熟 HTTP 库,并且是速度最快的 HTTP 库之一,同时因其正确性得到了许多人的认可。

这个 alpha 版本为 std::future::Future 提供了支持。让人兴奋的是,这意味着可以使用即将在 Rust 1.39 版本中稳定的 async/await 语法。

如下是一个使用示例:

#[tokio::main]
async fn main() -> Result<(), Error> {
    let client = Client::new();

    let resp = client.get("http://httpbin.org/ip".parse()?).await?;
    println!("Status: {}", resp.status());
    println!("Headers: {:#?}\n", resp.headers());

    while let Some(chunk) = resp.body_mut().next().await {
        stdout().write_all(&chunk?)?;
    }

    Ok(())
}

Read more

Fluvio

Fluvio 是一个云端原生动态数据平台,可在 Kubernetes 上运行。它带来了集中控制,可以在整个组织内连接,转换和分发实时数据。

它具备一下特性:

  • 声明式管理 - 独特的数据管理方法。
  • Cloud Native - 为 Kubernetes 而建。
  • 实时架构 - 完全异步设计,适用于低延迟和高吞吐量环境。
  • 灵活部署 - 控制器可以同时管理云和内部部署服务。
  • 功能强大的 CLI - 用户友好且易于使用的命令行界面。
  • 用 Rust 编写 - 安全,快速,小尺寸:专为高性能分布式系统而构建。
  • 与 Kafka 兼容 - 与 Kafka 客户端和服务器 API一起使用。 Fluvio CLI 用于管理 Kafka 主题,以及生成和使用 Kafka 日志。

了解更多

regex 1.3的改动

#rust #crate

regex1.3允许禁用Unicode等影响性能的特性,这可以减少超过1MB的二进制文件大小,将编译时间缩短一半,并将依赖关系树减少到一个包。

我们可以从一个issue#613中了解这些改动的原因:

这些变化的另一个动机是允许正则表达式的用户缩小其依赖树,如果他们希望交换运行时性能。 虽然这可能听起来不像是一个很好的交换,但是存在许多实际上不需要高性能正则表达匹配的情况。 例如,如果使用正则表达式来过滤一小组微小的ASCII字符串,那么禁用所有正则表达式的crate功能是完全合理的。 最终结果是它将大大缩小二进制大小,缩短编译时间并将正则表达式的依赖树缩小到单个包(正则表达式语法)。

发起这个PR的是BurntSushi大神。

Repo

Fac——能够自动解决依赖问题的通用编译工具

如果在编译工程的时候未正确指定依赖项,Fac可以在多次尝试之后将工程成功编译。

该项目创立于2014年,最开始用C编写,2017年后开始使用rust。

Fac的灵感来自于通用编译工具make,它利用ptrace来枚举所有依赖项,并将所有源文件添加到(git)repo中。Fac的一个重要特性是它能够自动处理依赖关系,而不会像传统的编译工具一样在工程的依赖性上报错。目前,fac仅能够在Linux系统上运行,但它非常易于使用。

Read More: https://github.com/droundy/fac http://physics.oregonstate.edu/~roundyd/fac

rxRust 0.2发布

rxrust是一个Rust实现的Reactive Extensions。ReactiveX是一个用于通过使用可观察序列来编写异步和基于事件的程序的库。除了对象必须将流的第一个闭包打包之外,他几乎是0开销的。

它扩展了观测模式以支持数据“与/或”事件序列,并添加了允许以声明方式组合序列的运算符,同时抽象出对低级线程同步、线程安全、并行数据结构和无阻塞I / O等问题的补充。

Read More: https://github.com/M-Adoo/rxRust/blob/master/CHANGELOG.md

Reactive Extensions官网: http://reactivex.io/

Helm本月迎来第一批用户

heim是用于系统信息获取的Rust跨平台异步库,已经发布一个多月,能够获取Rust crates生态系统中的系统信息(例如,CPU,内存,磁盘或进程统计)。

heim 有几个关键目标来奠定他的发展基础和公共接口: 1.异步优先 2.跨平台。 3.模块化设计。 4.符合用户习惯且易于上手。

现在可以使用新模块heim::process查询系统进程:

let current = heim::process::current().await?;

let mut processes = heim::process::processes();
while let Some(process) = processes.next().await {
    let process = process?;

    println!("Pid: {}", process.pid());
    if process.pid() == current.pid() {
        println!("It's-a me, Mario!");
    }

    println!("Status: {:?}", process.status().await?);
    println!("Name: {}", process.name().await?);
    println!("Path to executable: {:?}", process.exe().await?);
    // …and many other methods available
}


Read More: https://github.com/heim-rs/heim/

rustversion - 根据rustc编译器版本进行条件编译

这个类库提供了宏的扩展,能够根据rustc编译器版本进行条件编译的宏。

使用案例

#[rustversion::since(1.33)] use std::pin::Pin;

#[rustversion::since(1.33)] impl<P: MyTrait> MyTrait for Pin { /* ... */ }

#[rustversion::attr(before(1.33), repr(packed))] #[rustversion::attr(since(1.33), repr(packed(2)))] struct Six(i16, i32);

fn main() { println!("{}", std::mem::align_of::()); } 更多信息可以前往GitHub了解一哈

### mobi-rs - 用于解析和操作.mobi格式的Rust库

一个用rust编写的从.mobi格式电子书中提取数据的库

使用案例

访问基本信息

use mobi::Mobi; fn main() { let m = Mobi::init(Path::new("/home/wojtek/Downloads/lotr.mobi")).unwrap(); let title = m.title().unwrap(); let author = m.author().unwrap(); let publisher = m.publisher().unwrap(); let desc = m.description().unwrap(); let isbn = m.isbn().unwrap(); let pub_date = m.publish_date().unwrap(); let contributor = m.contributor().unwrap(); println!("{}\n{}\n{}\n{}\n{}\n{}\n{}\n", title, author, publisher, isbn, pub_date, desc, contributor); // Access Headers let header = m.header; // Normal Header let pdheader = m.palmdoc; // PalmDOC Header let mheader = m.mobi; // MOBI Header let exth = m.exth // Extra Header } 输出

The Fellowship of the Ring J. R. R. Tolkien Houghton Mifflin 9780618574940 2005-07-15T07:00:00+00:00 SUMMARY: For over fifty years, J.R.R............. calibre (0.7.23) [http://calibre-ebook.com] 更多信息可以前往GitHub了解一哈

persy - 用Rust编写的简单事务性存储引擎

Persy是一个用rust编写的事务性存储引擎。

示例

use persy::{Persy,Config}; //... Persy::create("./open.persy")?; let persy = Persy::open("./open.persy",Config::new())?; let mut tx = persy.begin()?; persy.create_segment(&mut tx, "seg")?; let data = vec![1;20]; persy.insert_record(&mut tx, "seg", &data)?; let prepared = persy.prepare_commit(tx)?; persy.commit(prepared)?; for (_id, content) in persy.scan("seg")? { assert_eq!(content[0], 20); //.... }

更多信息可以前往GitLab了解一哈

SOUNDSENSE-RS - SoundSense 的 Rust 复刻版

SoundSense 是 《矮人要塞(Dwarf Fortress)》的声音引擎,作者用 Rust 重写了(Rust重写一切!)。

Repo: https://github.com/prixt/soundsense-rs




learning

CPP工程师的Rust迁移之路 - 继承与组合(后)

#rust #cpp

知乎专栏CPP工程师的Rust迁移之路新文章

Read More

HTTP3 过去,现在和未来

#http3 #rust

推荐视频 HTTP over QUIC is the next generation

Read More

Rust小程序为何会卡顿?

观察一个用Rust和Kotlin编写的小程序,为何Rust版本会比Kotlin的慢?主要原因就是分配了很多新的Vecs。想要提速的第一部是使用预定大小初始化Vecs,下一步是不使用Vecs,而是通过使用其他数据结构(例如Iterator)或使用预分配的缓冲区来优化这些分配。最后,进行一些格式上的修正以及一些细微的更改(例如使用u32代替usize来实现)等。

结果新版本并不完美,但至少解决了主要问题,以下是测量反映出来的结果:

// KOTLIN (JVM), Windows 10
Running Movegen depth=7 ...
319406385 // "Checksum", to make sure both programs are correct
Time: 8424ms

// RUST, Windows 10, built with cargo build --release
>>> Starting movegen...
319406385
<<< Finished. Elapsed: 16s 895ms

// KOTLIN (JVM), Ubuntu (different machine)
Running Movegen depth=7 ...
319406385
Time: 7285ms

// RUST, Ubuntu
>>> Starting movegen...
319406385
<<< Finished. Elapsed: 8s 163ms

// Windows, depth = 8
Kotlin 70s 70ms vs Rust 139s 403ms

// Ubuntu, depth = 8:
Kotlin 65s 222ms vs Rust 65s 554ms

Rust 在物联网(IoT)的应用

演讲介绍了编写运行微控制器的 Rust 技巧,并调查已经现有生态系统中可用的优秀嵌入式Rust项目。

如果您的物联网项目在 ARM 或 MSP430 上,那么它已经在 Rust 编译器中获得了本地支持,AVR和RISC-V也有可用的编译器分支。但是架构支持只是第一个挑战:如果您习惯于为运行操作系统的主机编写Rust,那么在嵌入式世界中必须自己完成所有工作的范式转换可能会很不协调。

更多请原文视频地址:https://morioh.com/p/73aac331a451

通过漫画介绍 String 和 &Str 的区别

string-and-andstr-in-rust:https://github.com/jeenalee/zines/blob/master/string-and-andstr-in-rust.pdf

用于向错误添加上下文并转换为自定义错误类型的简单且符合人体工程学的模板

经过一系列实验,这已经是一个很好的模板,下面我们就开始用它来补全自定义错误类型的上下文。

首先,我们使用单个方法定义特征, err_with

pub(crate) trait ErrWith<T, E> {
    fn err_with<W>(self, with: W) -> Result<T, (E, W)>;
}

并实例化一个Result,用Err有效负载的元组和附加值替换有效负载:

impl<T, E> ErrWith<T, E> for Result<T, E> {
    fn err_with<W>(self, with: W) -> Result<T, (E, W)> {
        match self {
            Ok(ok) => Ok(ok),
            Err(error) => Err((error, with)),
        }
    }
}

然后,我们可以使用From实现我们的自定义错误类型,不同的元组类型映射到不同的错误变体。这是一个自定义错误类型,其中包含一个Io变量,io::Error以及发生错误的路径:

#[derive(Debug)]
enum Error {
    Io { io_error: io::Error, path: PathBuf },
}

From impl 将(io::Error, impl AsRef<Path>)转化为 Error::Io:

impl<P: AsRef<Path>> From<(io::Error, P)> for Error {
    fn from((io_error, path): (io::Error, P)) -> Error {
        Error::Io {
            path: path.as_ref().to_owned(),
            io_error,
        }
    }
}

我们可以用来.err_with(path)?为我们的错误补全上下文,并将它们转换为我们的自定义错误类型作为结果:

fn main() -> Result<(), Error> {
    fs::read_to_string("foo/bar").err_with("foo/bar")?;
    Ok(())
}

playground上的代码链接

GitHub上了解更多。

Rust的GitHub Actions分享

几个星期前,我获得了GitHub CI / CD平台的测试版访问权限。 我的Rust项目之前主要使用的Travis CI,最近开始迁移到Azure Pipelines,但现在可以考虑转向Github Actions了。

与Azure one相比,它配置的语法更友好一些,有Linux、macOS和Windows环境可用(几乎兼容主流平台),与其它GitHub组件的集成度也高一些。但对于我来说最重要的是可以创建在CI工作流中执行的动作自定义任务。

跟平常Rust CI操作类似

为Rust项目创建一个良好的CI工作流,需要做以下事情

  1. 检查你的cargorustup是否正常
  2. 安装你所需要的环境(stable,nightly或其它版本)
  3. 运行cargo clippycargo fmt

我从自己项目的Azure Pipeline配置中复制了所有相同的脚本,在我的项目之间以某种方式复用它们,但是现在我很高兴这些配置能够运用到GitHub Actions上

下面都是一些配置和解释了,我就不在这里翻译了,感兴趣的可以直接阅读原文

Read More:https://svartalf.info/posts/2019-09-16-github-actions-for-rust/

ImageCli - 一个纯Rust图像处理命令行工具

一个建立在image和imageproc之上的命令行图像处理工具。

看几个用例

最简单的用法是加载一个图像,然后保存它的相同副本。

imagecli --input robin.png --output ex0_0.png

1

可以为输出图像指定不同的格式

imagecli --input robin.png --output ex1_0.jpg

2

例如,下面的命令将图像转换为灰度

imagecli -i robin.png -o ex2_0.png -p 'gray'

2

还有更多的操作,感兴趣的大家可以去仓库瞧瞧

Repo:https://github.com/theotherphil/imagecli

通过模拟散热来学习Rust

这篇文章主要介绍了作者在绘制散热模拟图像时,如何不选择C++从而选择使用了Rust的历程,并在文中放出了相应的代码和成果,感兴趣的小伙伴可以仔细阅读一下这篇文章

2

Read More:https://tejqunair.com/posts/rust-heat/

Rust 宏之书

#rust #doc

本书试图提炼Rust社区对Rust宏的知识集,目前还在完善中,欢迎添加PR和issue。

Read More

对封装trait对象或trait对象引用的集合进行操作

这里有一个trait:

trait Get {
    fn get(&self) -> u32;
}

以及一些实现该trait的类型:

struct Foo(u32);
struct Bar(u16, u16, u16);

impl Get for Foo {
    fn get(&self) -> u32 {
        self.0
    }
}

impl Get for Bar {
    fn get(&self) -> u32 {
        self.0 as u32 + self.1 as u32 + self.2 as u32
    }
}

这些特征对象通常以两种方式在集合中结尾:

let mut v1 = Vec::<&dyn Get>::new();     // collection of trait object references
let mut v2 = Vec::<Box<dyn Get>>::new(); // collection of boxed trait objects

想要一个可以对这个特征对象的泛型集合进行操作的函数,但将迭代器作为参数传递是否是一个正确的方法呢?

fn sum_from_iter_box<'a, I, T>(it: I)
where
    I: IntoIterator<Item = &'a Box<T>>,    // <-- Box<T>
    T: Get + 'a + ?Sized,
{ ... }

fn sum_from_iter_ref<'a, I, T>(it: I)
where
    I: IntoIterator<Item = &'a &'a T>,     // <-- &'a T
    T: Get + 'a + ?Sized,
{ ... }

如何编写一个可以使用I类型的Iterator的单个函数? 有更好的方法吗?

下列代码解决了上述问题,且未添加任何trait的实现。

use std::ops::Deref;

fn sum_from_iter<'a, I, T, U>(it: I)
where
    I: IntoIterator<Item = &'a T>,
    T: Deref<Target=U> + 'a,
    U: Get + ?Sized,
{
    let sum = it.into_iter().fold(0, |acc, get| get.deref().get() + acc);
    println!("sum: {}", sum);
}

trait Get {
    fn get(&self) -> u32;
}

struct Foo(u32);
struct Bar(u16, u16, u16);

impl Get for Foo {
    fn get(&self) -> u32 {
        self.0
    }
}

impl Get for Bar {
    fn get(&self) -> u32 {
        self.0 as u32 + self.1 as u32 + self.2 as u32
    }
}

fn main() {
    let mut v1 = Vec::<&dyn Get>::new();
    let aaa = &Foo(1234);
    let bbb = &Foo(4321);
    v1.push(aaa);
    v1.push(bbb);
    sum_from_iter(v1.iter());

    let ccc = &Bar(1, 1, 1);
    v1.push(ccc);
    sum_from_iter(v1.iter());

    let mut v2 = Vec::<Box<dyn Get>>::new();
    v2.push(Box::new(Foo(123)));
    v2.push(Box::new(Foo(321)));
    sum_from_iter(v2.iter());

    v2.push(Box::new(Bar(1, 1, 1)));
    sum_from_iter(v2.iter());
}

通常最好使用Get自动地为所有引用类型实现trail,这样就不需要对其所有函数普遍操作。

Read More:Reddit原帖链接

以 golang 的角度理解 rust

#golang#rust

@damienstanton: 朋友们,在即将到来的 Go meetup 上,我要做一个非正统的演讲,主题是:以 golang 的角度理解 rust。

有哪些有趣的 golang 惯用习语/模式/抱怨 是你想在 rust 方面得到解释的?欢迎参与讨论:https://twitter.com/damienstanton/status/1171843816061624331

futures-intrusive - 为基于 async/await 和 Future 的异步生态提供了一些 intrusive 集合同步原语

又是个新名词,查了一下,侵入式集合是这样一个东西:

In the words of the intrusive-collections crate : The main difference between an intrusive collection and a normal one is that while normal collections allocate memory behind your back to keep track of a set of values, intrusive collections never allocate memory themselves and instead keep track of a set of objects.

这个库提供的原语有下面这些:

  • Channels in a variety of flavors:
    • Oneshot
    • Multi-Producer Multi-Consumer (MPMC)
    • State Broadcast
  • Synchronization Primitives:
    • Manual Reset Event
    • Mutex
    • Semaphore
  • A timer

Repo: https://github.com/Matthias247/futures-intrusive

multiversion - 可以为同一个函数针对不同的平台或条件,指定不同的版本

看一下效果

use multiversion::multiversion;

multiversion!{
    fn square(x: &mut [f32])
    "[x86|x86_64]+avx" => square_avx,
    "x86+sse" => square_sse,
    default => square_generic,
}

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[target_feature(enable = "avx")]
unsafe fn square_avx(x: &mut [f32]) {
    for v in x {
        *v *= *v;
    }
}

#[cfg(target_arch = "x86")]
#[target_feature(enable = "sse")]
unsafe fn square_sse(x: &mut [f32]) {
    for v in x {
        *v *= *v;
    }
}

fn square_generic(x: &mut [f32]) {
    for v in x {
        *v *= *v;
    }
}


不得不指出,Rust 强大的 4 种宏,可以玩出远远超越之前 C/C++ 宏的效果,发挥想象吧。

Repo: https://github.com/calebzulawski/multiversion

Rust编写操作系统,8月更新

详细信息参见博客

博客文章:Futures并发

通常,当你运行Futures时,你可以通过以下三种方式之一调度它们:

  • 运行一个future,并等待它完成。
  • 运行多个futures,并等待所有完成。
  • 运行多个futures,并等待第一个完成。

第一种调度方式是“顺序”的,后两种调度方法是“并发”的,并且具有细微的差别。

在这篇文章中,讨论了Rust中fallibleinfallible异步并发的挑战,将其与两种不同语言的方法进行了比较,并通过一个模型涵盖了所有案例。

博客原文

剖析 angr 的效能

angr 是樓主寫的一個程式,功能是記錄使用者花在每個程式的時間

最近樓主覺得這個程式跑的太慢了想來加速一下

發現這個程式會讓你在執行任何命令前先花個0.22秒做記錄

其實這個程式並不是真的需要更快,樓主主要用這個程式在手機上

記錄他手機執行各種程式的時間。

一開始他決定使用 cargo-profiler

他發現大部份時間用在記憶體配置,且很可能是在BTreeMap裡

然後再用 Linux perf 跑看看,發現分析結果與 cargo-profiler 相同

再用火焰圖跑看看

image alt

發現augr只是因為需要加載的檔案變多而變慢!

在這一點上,樓主決定花點時間調查問題來修復它。他添加了一些代碼來追踪加載時間,

這時的樓主想了很多方法要來優化檔案加載數量過多的問題。

在進行了一些更麻煩的調查後,樓主確定程式的大部分時間都在執行,而不是加載文件。

最後他發現了主要原因在 clone ,樓主很大量的使用了clone

在做了必要的改動,減少了大量的clone之後,效能得到了提升

優化到了 0.02 秒!

剖析性能很有趣! 在這種情況下,只需進行兩個簡單的更改並獲得10倍的改進。

本來樓主認為需要各種瘋狂的緩存系統才能讓augr更快。 但並不需要那樣的東西!

Read more

為什麼 "🤦🏼‍♂️".length == 7 會對

樓主對unicode與emoji的字串長度做了深度討論

首先比較不同語言得到的長度

原因是 UTF-32 UTF-16 UTF-8 所造成的

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> len("🤦🏼‍♂️") == 5
True
>>> 

$ cargo new -q length
$ cd length
$ echo 'fn main() { println!("{}", "🤦🏼‍♂️".len() == 17); }' > src/main.rs
$ cargo run -q
true

Read more

將Rust作為第一個學習的編程語言是否太狂了?

這個問題在reddit蠻多人討論的,所以也列一下

大多數Rust開發人員都是先學習了其他語言

Rust將很多語言的概念結合在一起,當你知道其他語言中存在的問題時,這些概念很有意義。

但這是因為Rust不是我們第一個學的語言

每個語言有自己擅長的特點,Rust的確不好學習

大部份的初學者如果不要挫折感太重,

還是建議從腳本語言開始 ex. javascript, python, lua

Read more

Rust 2018: NLL migrate mode => hard error

NLL指的是non-lexical lifetimes非词法生命周期,即新的借用检查规则和实现。NLL接受不安全代码,之前是使用警告和弃用通知的方式。现在这已经转为了一个hard error错误,因为NLL已经提出了一段时间。具体如下:

  • 在1.39中对Rust 2018发出NLL警告hard error
  • 在1.40的对Rust 2015发出NLL警告hard error

有关更多详细信息,请阅读#63565

Linux.Fe2O3: 一个Rust编写的“病毒”

Linux.Fe2O3,这是用Rust编写的POC ELF预装器。作者喜欢在其学习的语言上编写预编程器,并发现一些有趣的事。至于名称,Fe2O3是Rust的化学式,作者认为这个名字很合适的。(小编注:Rust的字面意思是铁锈)

测试中有用的两个属性宏

该代码库包含两个属性宏:default_trait_impl定义默认的trait实现,trait_impl使用定义的默认trait实现。

这在测试中尤其有用,当你有许多被mock类型具有非常相似的trait实现,但又不希望规范的默认trait实现使用mock值时。

Github地址

文字RPG

作者之前寫過 MUDdy 像MUD的純文字互動遊戲,但只是單機的 Read more

最近也用Rust寫了 RCRPG

Read more

這是一個 Rosetta Code 裡的題目,Rosetta Code是一個把基礎的程式問題用各種語言實作一遍的網站,大家有興趣也可以來幫忙Rust的實作更完整。

Read more

Fuzzcheck 針對Rust功能的覆蓋率提升工具

給定函數 Test:(T) - > Bool,它會試圖找到一個回傳false或導致崩潰的T類型的值。

比如你有個長的很醜的函數長這樣

extern crate my_library;

extern crate fuzzcheck;
use fuzzcheck::fuzzer;

extern crate fuzzcheck_input;
use fuzzcheck_input::integer::IntegerGenerator;
use fuzzcheck_input::vector::VectorGenerator;

fn test(input: &Vec<u8>) -> bool {
    // property test goes here
    if 
        input.len() > 7 &&
        input[0] == 0 &&
        input[1] == 167 &&
        input[2] == 200 &&
        input[3] == 103 &&
        input[4] == 56 &&
        input[5] == 78 &&
        input[6] == 2 &&
        input[7] == 254
    {
        false
    }
    else {
        true
    }
}

fn main() {
    let u8_gen = IntegerGenerator::<u8>::new();
    let vec_gen = VectorGenerator::new(u8_gen);
    
    let _ = fuzzer::launch(test, vec_gen);
}

然後去給他跑,他就跑出一個

NEW 180086 score: 493 pool: 48 exec/s: 132713 cplx: 79792

NEW 表示將新輸入添加到有興趣的輸入池中 180086 是到目前為止執行的迭代次數 得分:493 是池中所有輸入引起的總代碼覆蓋率的度量 pool:48 是池中的輸入數 exec / s:132713 是每秒執行的平均迭代次數 cplx:79792 是池中輸入的平均複雜度

最後他會找到return false的條件

================ TEST FAILED ================
188241  score: 495      pool: 51        exec/s: 132659  cplx: 81373
Saving at "./fuzz/fuzz_targets/target1/artifacts/1c10daa13e9b1721.json"

而這個1c10daa13e9b1721.json檔裡面會長這樣 [0, 167, 200, 103, 56, 78, 2, 254]

跟我們的程式碼條件一樣

input.len() > 7 &&
input[0] == 0 &&
input[1] == 167 &&
input[2] == 200 &&
input[3] == 103 &&
input[4] == 56 &&
input[5] == 78 &&
input[6] == 2 &&
input[7] == 254

Read more

Rust 如何优化 async/await(二):程序分析

第1部分中,我们介绍了如何将 Rust 中的异步 fns 编译为状态机。 我们看到内部编译器实现使用 generatoryield 语句来促进这种转换。 我们还看到在内存中布置其中一个状态机的最佳方法是使用类似枚举的表示,类似于以下内容:

enum SumGenerator {
    Unresumed { xs: Vec<i32> },
    Suspend0 { xs: Vec<i32>, iter0: Iter<'self, i32>, sum: i32 },
    Suspend1 { xs: Vec<i32>, iter1: Iter<'self, i32>, sum: i32 },
    Returned
}

存储在此枚举中的每个变量都是我们原始函数的局部变量,用于跟踪状态机的内部状态。 这里,关键点是 iter0iter1 不会同时使用,因此我们可以回收 iter0 的字节,当我们的状态机转换到下一阶段时,将它们用于 iter1

Read more

CPP工程师的Rust迁移之路

#rust #cpp

Read More

选择性抗锯齿像素算法

始终一致地应用抗锯齿处理图像非常耗费资源,因此通过这个算法可以将此过程轻松实现自动化选择。

大致步骤分为:

  1. 给定像素一个完整的线条
  2. 计算每1 px宽块的长度和方向
  3. 针对每个像素块,将一定长度的一部分颜色变为其他颜色
/// selectively anti-alias a pixel perfect line
/// each segment of length l contains floor(l*k) number of $alt_color pixels
pub fn selective_antialias(path: &mut Pixels, k: f64, alt_color: Color) {
    let mut chunks = vec![];
    let mut start_idx = 0;
    for (i, (pi,pj)) in path.iter().zip(path.iter().skip(1)).enumerate() {
        // if consecutive pixels not connected
        if (pi.point.x != pj.point.x) && (pi.point.y != pj.point.y) {
            let start_pix = path.0.get_index(start_idx).unwrap();
            let dir = start_pix.dir(&pi);
            chunks.push((i - start_idx, dir));
            start_idx = i + 1;
        }
    }
    let start_pix = path.0.get_index(start_idx).unwrap();
    let dir = start_pix.dir(path.iter().last().unwrap());
    chunks.push(((path.len() - start_idx - 1), dir));
    assert_eq!(chunks.iter().map(|i|i.0 + 1).sum::<usize>(), path.len());
    let mut idx = 0;
    for (l, dir) in chunks {
        for j in 0..=l {
            // xor with dir to keep orientation of coloring
            // example:
            //           o    o
            //           o    o
            //           x    x
            //           x    x
            //            ooxx
            if (j <= (l as f64 * k) as usize) ^ dir {
                let p = path.0.get_index(idx).unwrap().with_color(alt_color);
                path.0.replace(p);
            } else {
                // noop
            }
            idx += 1;
        }
    }
}


Read More: Ricky Han blog

使用 React, Gatsby 和 Wavelet 构建一个去中心化的博客

Wavelet 是 perlin-network 的一个子项目。

Wavelet is an open ledger for writing scalable mission-critical, decentralized WebAssembly application (https://wavelet.perlin.net/).

作者尝试了基于 wavelet 来构建一个去中心化的博客,也算是迈向 w3 过程中的一个尝试。

Read More: https://docs.qq.com/doc/DQkZhQ2lEVGVlTlNO

根据版本来编译分支代码?

if_rust_version 是这样一个项目,可以根据 rust 的版本,来编译运行不同分支中的代码。像下面这样:

if_rust_version! { >= 1.36 {
    let mut x = std::mem::MaybeUninit::<u32>::uninit();
    unsafe { x.as_mut_ptr().write(32); }
    let xx = unsafe { x.assume_init() };
} else {
    let mut xx : u32 = unsafe { mem::uninitialized() };
    unsafe { ptr::write(&mut xx as *mut u32, 32); }
}}

Repo: https://github.com/ogoffart/if_rust_version

default-boxed - 让结构体定义的时候,直接分配在堆上

通常,Rust 对于编译时已知大小的结构体,都默认在栈上分配内存。在实际编码过程中,往往存在向堆中复制的过程。这会降低效率,而这个库提供了标注:#[derive(DefaultBoxed)] ,可以使得被标注的结构体直接在堆上分配内存。像下面这样:

use default_boxed::DefaultBoxed;

#[derive(DefaultBoxed)]
struct Foo {
    a: Bar,
    b: [Bar; 1024 * 1024],
    c: [u32; 1024 * 1024],
}

struct Bar(u16);
impl Default for Bar {
    fn default() -> Bar {
        Bar(29)
    }
}

#[test]
fn test_basic() {
    let foo = Foo::default_boxed();
    assert_eq!(foo.a.0, 29);
}

Repo: https://github.com/upsuper/default-boxed

envopt - 把环境变量解析到结构体中

思路类似 structopt,不过这次是解析环境变量,其实很简单,就看你想不想得到,这是一种设计模式。

use envopt::EnvOpt;

#[derive(EnvOpt)]
pub enum EnvOpts {
    #[envopt(name = "FOO")]
    Foo,
    #[envopt(name = "BAR", default = "default-bar")]
    Bar,
}

pub fn main() {
    EnvOpts::validate_or_exit();

    println!("FOO: {}", EnvOpts::Foo.value_or_exit());
    println!("BAR: {}", EnvOpts::Bar.value_or_exit());
}

Repo: https://github.com/zoranzaric/envopt




story

Rust 求職專帖

reddit

Rust伦敦社区9月MeetUp

Hi Rustaceans,

LDN Meetup将于9月24日在伦敦举行。参与详情请点击:https://www.meetup.com/Rust-London-User-Group/events/264890481/attendees/

Babylon Health为现场提供的比萨和啤酒,期待在那里见到你们。

Rust Bay Area Meetup - 2019年9月12日

Meetup以对pcwalton :p的特写开场,并包含了两个内容:

  • Jane Lusby讨论了他对rust的一些建议
  • Adam Perry与大家交流了rust的UI和Moxie框架

Meetup视频已上传至YouTube

C/C++ vs Rust:开发人员的观点(译)

在这篇文章中,将从开发人员的角度看到Rust和C / C ++之间的区别

最初由Maourice Gonzalez在https://www.onmsft.com上发布

C++是一种非常快速和高效的编程语言。 它的多功能性无任何限制,其成熟度确保支持和可靠性是首屈一指的。 用C ++开发的代码也非常便携,所有主流操作系统都支持它。 许多开发人员开始使用该语言进行Coding,这并非巧合。 面向对象意味着它在,类,继承,抽象,封装和多态等概念方面做得非常好,它的概念和语法都能在现代语言中找到,如C#,Java和Rust。 它提供了一个很好的基础,可以提供更高速度,更易于使用和更现代的替代方案。

现在它并不都是美好的, C++有一个非常陡峭的学习曲线,需要开发人员将最佳实践应用到程序中,否则最终会导致不安全或性能不佳的代码,标准库的体积很小,虽然大多数时候被认为是一个好处同时也增加了难度。 这意味着成功使用C++创建有用的复杂库和应用程序可能具有挑战性。 在内存管理方面几乎没有提供什么帮助,开发人员必须自己做。 由于缺乏经验会导致内存安全问题和其他棘手的情况,新手程序员最终可能会遇到调试噩梦。 最后一点引导许多公司探索快速,安全且同样强大的C++替代品,对今天的微软来说,那个东西就是rust

修复了大多数漏洞且分配了CVE [常见漏洞和暴露]的漏洞是由开发人员无意导致内存安全问题,系C和C++中的代码所引起的 - Gavin Thomas,Microsoft安全响应中心

Rust在2006年的某个时候由一位名叫Graydon Hoare的Mozilla员工开始作为个人项目。这个雄心勃勃的项目已经在发布前开发了近十年,终于在2015年5月推出了1.0版本。在眨眼之间之间在Stack Overflow开发者调查中,自2016年以来被选为四年来最受欢迎的语言,已经偷走了大批开发者的心。

努力工作肯定得到了回报。 最终结果是非常有效的语言,其特征在于面向对象。 事实上,它被设计为在语法上类似于C++,这使得它很容易接近。 但与前面提到的不同,它还被设计为内存安全,同时还采用了一种新型的内存管理形式,而没有明确使用垃圾收集。

丑陋的事实是软件开发是一个试错法(哈哈哈,玄学问题请重启)。Rust已经超越了帮助我们调试我们的代码。 编译器可生成非常直观且用户友好的错误消息,并可直接链接到相关文档以帮助进行故障排除。 这意味着如果问题不明显,大多数时候答案是点击一下。 我发现自己很少需要启动浏览器来寻找Rust编译器在解释和文档方面提供的解决方案之外的解决方案。

Rust没有垃圾收集器,但大多数时候仍为您分配和释放内存。 它也被设计为内存安全,与C++不同,C++很容易让您在悬挂指针和数据竞争时遇到麻烦。 相比之下,Rust采用了可以帮助您预防和避免此类问题的概念。

还有许多其他因素使我从C++转向Rust。 但说实话,它与我们刚刚探索过的所有伟大的东西毫无关系。 我从WebAssembly开始的旅程中来到了Rust。 从我开始寻找一种更有效的网络JavaScript替代方案开始变成了确定Rust的强大功能。 从它的无缝互操作......

在Rust,WebAssembly和JavaScript API之间自动生成绑定代码。 利用像web-sys这样的库,为整个Web平台提供预打包的绑定。 - rust website

它的性能有多快和可预测。 我们生活中的一切都在发展。 我们的智能手机,汽车,家用电器,自己的身体。 C ++虽然仍然非常强大,快速和多功能只能带我们到目前为止。 在探索替代方案方面没有任何害处,特别是那些与Rust相比具有特殊性和承诺的替代方案。

Read More: https://morioh.com/p/95c294659991

微软招聘首席软件工程师 - 推动 Windows 系统采用 Rust

摘要:

我们是工程系统团队,该团队为构建Windows 10核心的Microsoft开发人员提供服务。我们希望我们的开发人员能够高效工作,使用合适的工具来构建高质量和安全的产品。 我们的开发人员必须有权控制遗产,而不是受其束缚。

要求:

所需资格:

  • 10年以上,开发系统级大型软件代码库的经验
  • 对C++有深刻理解
  • 出色的分析能力和与技术人员沟通的能力

加分项:

  • 有设计和处理健壮的安全边界的经验,比如虚拟化平台
  • 具有安全系统编程语言的经验,例如Rust。
  • 其他

详情看微软招聘:https://careers.microsoft.com/us/en/job/701993/Principle-Software-Engineer

附 reddit 讨论:https://www.reddit.com/r/rust/comments/d2tbyx/microsoft_hiring_for_role_to_help_push_for_rust/

附 twitter 上的讨论:https://twitter.com/ryan_levick/status/1171830191804551168

rust-lang.org 访问数据:rust 正被更多的企业认可

@Pietro Albini:终于有时间从 @rustlang CDNs 获得一些统计数据:上个月,我们处理了超过 1.25 亿次请求,提供了近 200 TB 的编译器和 11 TB 的库数据!

很高兴看到周末的访问流量下降,这表明企业的认可度提高了!

Read more

2019 年 Javascript 程序员最想学的语言有哪些?

根据 StackOverflow 上的数据进行统计。结果如下:

Rust    11.9%
WebAssembly    12.3%
TypeScript     35.8%
None of above    40%

Read More: https://www.techrepublic.com/article/the-rising-programming-languages-that-javascript-developers-are-learning-in-2019/

有沒有人願意幫Rust實現一個GCC的前端實作?

GCC 的開發者 Jacob Lifshay,覺得用Rust的程式取代 GCC自己的C是一個可行的方向

過去有@redbrain的寫過的gccrs 18是rust 1.0,但已經太舊了

如果有開發者願意幫忙,請聯絡 Stallman

這是一個Rust影響GCC的好機會

有實力又有興趣的大佬可以參考

Read more

【会议记录】Rust在大公司使用的现状

#rust

RustConf期间,来自Mozilla、Microsoft、Google、Facebook等大公司工程师和Rust核心开发者(Niko、Manish 和 Alex)的讨论Rust在他们公司的使用现状。大公司的工程师总有一些特殊的需求是一般开发者碰不到的,所以他们与Rust核心开发者一起交流,确定这些需求并一起讨论解决方案是一种很好的方式。如果你感兴趣的话,可以点击下文链接,找到更多会议记录。

Read More

rusoto 正在寻找项目维护者

#rust

rosoto是 ASW 的 Rust SDK,其作者@matthewkmayer 想找更多的人一起参与这个项目,他可以帮你把环境搞起来然后运行,分享给你文档之外的知识,这并不意味着他撒手不管这个项目了,他只是希望有更多优秀的人让这个项目越来越好。

Read More

rust 中哪個 protobuf庫 比較好用?

我有大量(1000+)個protobuf類型分佈在數百個不同的.proto文件中。

不知道有什麼庫可以一次幫這所有的 .proto 文件全部轉成 rust 宣告?

目前已經試過 prost, rust-protobuf 但感覺差強人意

prost的問題是沒辨法處理大量複雜相依的 .proto

rust-protobuf可以處理大量複雜相依的 .proto,但他發現一個問題發了一個PR但沒人理

他覺得這些專案的維護者是不是不想讓他們的庫愈來愈好?

Read more

Rust游戏开发工作组(非官方)工作月报

看看这个月发布了什么新的rust小游戏:

Way of Rhea Trailer and Steam Wishlist avatar

Veloren 0.3 avatar

RUZZT avatar

还有更多: https://rust-gamedev.github.io/2019/09/02/newsletter-001.html

Rocket和Actix-Web的异步性能测试

Rust目前最火的两个web框架就是Actix-Web和Rocket, 众所周知,Rocket的优势在于易用性,Actix-web在于性能,最近,Rocket的人员正在迁移到异步后端。因此,作者想看看异步分支和主分支如何的性能如何同时和Actix-Web进行比较是很有趣的。

测试使用的项目

用Rocket编写的hello world应用程序

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

#[get("/")] fn index() -> String { "Hello, world!".to_string() }

fn main() { rocket::ignite().mount("/", routes![index]).launch(); }

Cargo.toml的差异(同步和异步)

[dependencies] rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "async" } 同步

[dependencies] rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "master" } 下面的程序用于测试Actix-Web

use actix_web::{web, App, HttpServer, Responder};

fn index() -> impl Responder { "Hello, World".to_string() }

fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().service(web::resource("/").to(index))) .bind("127.0.0.1:8000")? .run() } 我还引入了Wrap

use warp::{self, path, Filter};

fn main() { let hello = path!("hello") .map(|| "Hello, world!");

warp::serve(hello)
    .run(([127, 0, 0, 1], 8000));

}

结果

我运行了二个应用程序使用了 cargo run --release 并用了wrk -t20 -c1000 -d30s http://localhost:8000

  • Rocket 同步

Running 30s test @ http://localhost:8000 20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 7.14ms 61.41ms 1.66s 97.97% Req/Sec 5.15k 1.45k 14.87k 74.03% 3076813 requests in 30.10s, 428.40MB read Requests/sec: 102230.30 Transfer/sec: 14.23MB

  • Rocket 异步

Running 30s test @ http://localhost:8000 20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.34ms 3.06ms 211.14ms 79.00% Req/Sec 11.15k 1.81k 34.11k 79.08% 6669116 requests in 30.10s, 0.91GB read Requests/sec: 221568.27 Transfer/sec: 31.06MB

  • Actix-Web

Running 30s test @ http://localhost:8000 20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 3.82ms 5.58ms 249.57ms 86.55% Req/Sec 24.09k 5.27k 69.99k 72.52% 14385279 requests in 30.10s, 1.71GB read Requests/sec: 477955.05 Transfer/sec: 58.34MB

  • Warp

    20 threads and 1000 connections Thread Stats Avg Stdev Max +/- Stdev Latency 4.23ms 8.50ms 428.96ms 93.33% Req/Sec 20.38k 6.09k 76.63k 74.57% 12156483 requests in 30.10s, 1.47GB read Requests/sec: 403896.10 Transfer/sec: 50.07MB 结论

虽然async Rocket的性能仍然不如Actix-Web,但是async极大地提高了它的性能。

我非常希望看到Rocket的性能提高到这样的程度:作为一名开发人员,从此就不需要在易用性和性能之间做出选择。

又一个 brainfuck 编译器 - nerve

编译到 X86 指令集上,算是一个练手项目。

Repo: https://github.com/JoshMcguigan/nerve




game

Amethyst-imgui v0.5

Amethyst-imgui提供包imgui-rs在Amethyst游戏引擎中的集成。

v0.5版本支持Docking功能。

Github 更多信息

will 2d動作遊戲更新

Read more

godot-rust - Rust绑定Godot游戏引擎

NativeScript是GDNative的一个扩展,它允许动态库向Godot注册脚本,

Repo:https://github.com/GodotNativeTools/godot-rust

zemeroth - 2D六角形轮回制策略游戏

类似于 Linux 上著名的 wesnoth(就不要与《文明》比了吧)。长这个样子:

img

还可以在线玩:https://ozkriff.itch.io/zemeroth

Repo: https://github.com/ozkriff/zemeroth
Read More: https://ozkriff.games/2019-09-21--devlog-zemeroth-v0-6/

Live - 一个用 Rust 开发的基于文本的小游戏

是一个用命令行进行交互的游戏,通过寻找足够的食物、水和资源让自己存活的更久。

live-rust:https://nuria.itch.io/live-rust

Veloren - 一个多从砖块 RPG 游戏

Veloren is a multiplayer voxel RPG written in Rust. It is inspired by games such as Cube World, Legend of Zelda: Breath of the Wild, Dwarf Fortress and Minecraft.

哇,看到好多熟悉的名字。

img

感觉自己心动了。

Repo: https://veloren.net/

将现有的WebAssembly应用程序转换为分布式程序

#rust #wasm

看过 rustwasm 文档的小伙伴应该都看到过 conway's game of life(康威生命游戏)的实现过程,有很多文章介绍了如何将 WebAssembly 应用运行在分布式虚拟机/智能合约平台Wavelet上运行,本文介绍如何改造一个现有的 WebAssembly 应用运行在智能合约平台Wavelet上。康威生命游戏小编也做过,周末按照这个教程改造试试。

Read More

test

retest 一个基于 fixture 的rust测试框架

#test #rust

我们可以通过两组测试代码看一下这个框架是如何工作的

use rstest::rstest;

pub fn fixture() -> u32 { 42 }

#[rstest]
fn should_success(fixture: u32) {
    assert_eq!(fixture, 42);
}

#[rstest]
fn should_fail(fixture: u32) {
    assert_ne!(fixture, 42);
}

# use rstest::rstest_parametrize;
#[rstest_parametrize(input, expected,
    case(0, 0),
    case(1, 1),
    case(2, 1),
    case(3, 2),
    case(4, 3)
)]
fn fibonacci_test(input: u32, expected: u32) {
    assert_eq!(expected, fibonacci(input))
}

running 5 tests
test fibonacci_test::case_1 ... ok
test fibonacci_test::case_2 ... ok
test fibonacci_test::case_3 ... ok
test fibonacci_test::case_4 ... ok
test fibonacci_test::case_5 ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Read More

#rust #crate

regex1.3允许禁用Unicode等影响性能的特性,这可以减少超过1MB的二进制文件大小,将编译时间缩短一半,并将依赖关系树减少到一个包。

我们可以从一个issue#613中了解这些改动的原因:

这些变化的另一个动机是允许正则表达式的用户缩小其依赖树,如果他们希望交换运行时性能。 虽然这可能听起来不像是一个很好的交换,但是存在许多实际上不需要高性能正则表达匹配的情况。 例如,如果使用正则表达式来过滤一小组微小的ASCII字符串,那么禁用所有正则表达式的crate功能是完全合理的。 最终结果是它将大大缩小二进制大小,缩短编译时间并将正则表达式的依赖树缩小到单个包(正则表达式语法)。

发起这个PR的是BurntSushi大神。

Repo




masm

在浏览器之外调试WebAssembly

WebAssembly 很有前景也很有吸引力,但它也带来了新的挑战,例如:如何调试 .wasm 二进制文件。

在 Mozilla,我们一直使用传统工具(如 GDB 和 LLDB )对 .wasm 文件进行源级调试的方法进行原型设计。

如下视频(https://youtu.be/PevI_Mn-UUE) 演示了使用 Wasmtime 和 LLDB 来调试使用 Rust 编写并最终编译为 WebAssembly 的程序:

Read more




ide

Eclipse IDE支持Rust开发

Eclipse Corrosion中支持Rust应用程序开发。

详细信息




Tools

Cloud Hypervisor - Intel 旗下的虚拟机监视器

发布 0.2 版了。

Cloud Hypervisor is an open source Virtual Machine Monitor (VMM) that runs on top of KVM. The project focuses on exclusively running modern, cloud workloads, on top of a limited set of hardware architectures and platforms.

Repo: https://github.com/intel/cloud-hypervisor

另外还有一个姐妹项目:rust-hypervisor-firmware

它是一个 KVM 的固件。

目前,它们都还处于实验性的阶段。

VeoLuz - 光与影,万花筒艺术创作工具

一个字,美!酷!

img img img img img

Website: https://jaredforsyth.com/veoluz/




gui

sdfu - Signed Distance Field Utilities

这是一个用于在计算机图形的上下文中处理带符号的距离字段,特别是基于光线行进的渲染器的工具包。

上图就是在 rayn 借助 sdfu 根据自己定义的路径绘制的图形,代码类似于:

use sdfu::SDF;

let sdf = sdfu::Sphere::new(0.45)
    .subtract(
        sdfu::Box::new(Vec3::new(0.25, 0.25, 1.5)))
    .union_smooth(
        sdfu::Sphere::new(0.3).translate(Vec3::new(0.3, 0.3, 0.0)),
        0.1)
    .union_smooth(
        sdfu::Sphere::new(0.3).translate(Vec3::new(-0.3, 0.3, 0.0)),
        0.1)
    .subtract(
        sdfu::Box::new(Vec3::new(0.125, 0.125, 1.5)).translate(Vec3::new(-0.3, 0.3, 0.0)))
    .subtract(
        sdfu::Box::new(Vec3::new(0.125, 0.125, 1.5)).translate(Vec3::new(0.3, 0.3, 0.0)))
    .subtract(
        sdfu::Box::new(Vec3::new(1.5, 0.1, 0.1)).translate(Vec3::new(0.0, 0.3, 0.0)))
    .subtract(
        sdfu::Box::new(Vec3::new(0.2, 2.0, 0.2)))
    .translate(Vec3::new(0.0, 0.0, -1.0));

Repo: sdfu - Signed Distance Field Utilities

Graphlib发布0.5.0版本

Graphlib是一个为图数据结构提供通用且易于使用的API的rust图形库,它的API与std::collections中的其他数据结构相似,它是为了在Purple协议中使用而构建的。

更新日志:

  • 现在可以在使用dot功能的时候标记图像顶点。
  • 添加了Graph::map() API,该API将Graph <T>映射到了Graph <E>

前往GitHub了解更多信息

重磅:Neutrino - MVC GUI 框架

我们都知道,目前Rust在Native GUI框架这一块,还是非常短的一个短板。但是并不意味着没有探索,Neutrino就是一个尝试。它是基于 web-view 的。利用 html 和 css 渲染页面。来看看效果吧。

https://raw.githubusercontent.com/wiki/alexislozano/neutrino/images/image_viewer/3.png

https://raw.githubusercontent.com/wiki/alexislozano/neutrino/images/styling/3.png

https://raw.githubusercontent.com/wiki/alexislozano/neutrino/images/styling/5.png

希望这个项目能坚持做下去(因为太多的Rust GUI项目半途而废啦)。

Repo: https://github.com/alexislozano/neutrino

GUI 库:iced

一个与渲染器无关的 GUI 库,专注于简单性和类型安全。

演示效果:

该库有一下特性:

  • 简单,易于使用,渲染器无关的 API
  • flexbox-based 布局
  • 类型安全,反应性编程模型
  • 内置的小部件
  • 自定义小部件支持

Read more:https://github.com/hecrj/iced

vxdraw - 基于 gfx-hal 的快速 2D 渲染库

vxdraw is a rendering library for drawing sprites, text, and streaming textures to a window. It is not an engine, just a library, and has no runtime.

它的特点是为动画优化,能充分利用 GPU 的渲染。

Repo: https://github.com/Omen-of-Aecio/vxdraw




Embedded

Drone OS 0.10 发布

Rust 操作系统来啦!

Drone is an Embedded Operating System for writing real-time applications in Rust. It aims to bring modern development approaches without compromising performance into the world of embedded programming.

目前只支持 ARM® Cortex®-M3/M4 ,但是设计成平台无关的。

Offical Site: https://www.drone-os.com/
Repo: https://github.com/drone-os

在 STM32 L476 上利用 Mynewt 和 嵌入式 Rust 开发 NB-IoT GPS 跟踪器

Rust 的嵌入式尝试,作者记录得很仔细。

Read More

ESP32 上的 Rust

作者还是个大学生,折腾了不少嵌入式方面的东西,最近用 rustc 为他自己做了一块智能手表。现在把他在 ESP32 上折腾 Rust 的经历和经验记录下来。

Read More: https://mabez.dev/blog/posts/esp32-rust/




wasm

Yew v0.9发布

Yew是一个Rust框架,用于使用WebAssembly创建多线程前端应用程序。

更多信息

使用 rust 去编译 WebAssembly

@_lrlna@twitter 在 RustConf 2019 上做了个演讲,通过使用 rust 编译 webassembly,并提升性能。

内容简要如下:

你应该了解到在浏览器中可运行 WebAssembly,但是这看起来像 IRL 吗?为了寻求在浏览器中运行 WASM 所带来的性能优势,Compass(用于 MongoDB 的 GUI)迈出了一大步,在 Rust 中重写了应用程序的一部分——一个负责文档分析的模式解析器。事实证明:将应用程序的某些部分使用 Rust 重写会使它更快。

在这次演讲中,将介绍如何将部分代码从 JavaScript 转换为 Rust,通过绑定 Electron,将 WASM 添加到现有的 React 应用程序中,并将其部署到生产环境中。因为 Compass 仍然通过 Nodejs 与 MongoDB 通信。此外还介绍了如何使用 Rust 在不丢失数据完整性的情况下提高性能。演讲过程中还包含了我们遇到了什么难题以及如何克服的。

演讲视频地址:https://www.youtube.com/watch?v=lLzFJenzBng&feature=youtu.be

Rust / wasm数据 / 内存共享

wasm-bindgen是一个Rust库和CLI工具,它促进了wasm模块和JavaScript之间的高级交互。wasm-bindgen 工具和库都是Rust和WebAssembly生态系统的一部分。

wasm-bindgen工具有点半填充性质,用于主机绑定等功能,以及用于增强JS和wasm编译代码(目前主要来自Rust)之间高级交互的部分功能。更具体地说,这个项目能让JS / wasm与字符串、JS对象、类等事物之间进行通信,而不是纯粹的传递整数和浮点数。

点击这里了解更多。

HTTPS Everywhere 使用WebAssembly提升性能

#wasm #rust

HTTPS Everywhere 是一个浏览器插件,可以将网站非HTTP请求强制为HTTPS请求,对互联网安全做了很多贡献。早起版本有内存占用过大,自带规则不完善,强制第三方资源使用HTTPS,影响资源加载等问题。现在它使用了WebAssembly,性能更好了。随着来自带规则的不断完善,变得更好用了。

Read More

使用WebAssembly实现经典的Marching cubes算法

#rust #wasm

MarchingCubes(MC)算法是面绘制算法中的经典算法,它是W.Lorensen等人于1987年提出来的一种体素级重建方法。MC算法也被称为“等值面提取”(IsosurfaceExtraction)算法。

Will Usher 使用wasm实现了MC算法,使用WebGL绘制,比使用纯Javascript实现速度快了了10-20倍,可以点击下面的链接看看。

Repo

Read More

Rust的WebAssembly简介,来自Rust Melbourne的演讲

在2019-08-14的Rust Melbourne,David Cristofaro给了我们一个关于WebAssembly的介绍

nr8QlF.png

Read More: https://www.youtube.com/watch?v=WONGc1zUxtc

wasm-bindgen 正在集成std::future

#wasm #rust

如题,激动的热泪盈眶,甚至测试代码也支持async/await啦。

Read More




ffi

现代C++(17/20)和Rust在安全方面的比较

#rust #cpp

Read More

neqo - 一个用Rust编写的QUIC实现

一个用Rust编写的QUIC实现 neqo

运行测试http 0.9程序(neqm -client和neqm -server)

  • cargo build
  • ./target/debug/neqo-server 12345 -k key --db ./test-fixture/db
  • ./target/debug/neqo-client http://127.0.0.1:12345/ -o --db ./test-fixture/db

运行测试http3程序(neqm -client和neqm -http3-server)

  • cargo build
  • ./target/debug/neqo-http3-server [::]:12345 --db ./test-fixture/db
  • ./target/debug/neqo-client http://127.0.0.1:12345/ --db ./test-fixture/db

Repo:https://github.com/mozilla/neqo

重磅:利用 Rust 和 LLVM 构建中间表示平台,加速 numpy, scikit 和 pandas 栈 100x 的速度

作者关于 weld(机器学习中间组件框架) 的长篇博文。作者的以下思路,我觉得很重要,这也是 Rust 想在科学计算,机器学习领域等大展身手的一个可能的方向:

After working for weeks with Python’s and R’s data science stack I started to ask my self if there could be a common intermediate representation, similar to CUDA, that could be used by many languages. There should be something better than reimplementing and optimizing the same methods in each language. In addition to that, having a common runtime that could optimize the whole program instead of each function separately would be better.

weld 的核心开发者之一是 Matei Zaharia,它也是 Spark(对,就是那个 scala 大数据流式计算框架) 的创建者。

他们选择 Rust 来实现 weld 的原因在于:

  • 最小 runtime,可以方便嵌入其它语言,比如 Java 和 Python
  • 可以用函数式范式编程,方便编译器优化
  • 很好的社区和高质量的包,让开发更容易

Read More: https://notamonadtutorial.com/weld-accelerating-numpy-scikit-and-pandas-as-much-as-100x-with-rust-and-llvm-12ec1c630a1?gi=97f3d8faf344

MiniV8: 用于Rust的最小嵌入式V8引擎

如果你希望使用Rust内置的JavaScript引擎执行脚本,那么MiniV8可能适合你。

更多信息

Rust和C / C ++之間的跨語言LTO

目前firefox的團隊正在研究rust與c++編譯後的中繼檔整合優化的可能性

當前C++與rust都是各自優化,但希望經由LLVM的函數內聯達到優化

目前firefox成功做到跨語言LTO,但並沒有成功優化,

之後團隊經過了努力,也只優化了一小部份函數。

目前在Windows,macOS和Linux上已經為Firefox版本構建了跨語言LTO幾個月,

而Mozilla的底層工具團隊對LTO的結果非常滿意。

雖然我們仍然需要努力使功能的設置更容易,

LTO已經啟用了從Firefox中Rust刪除重複的邏輯的功能,

因為現在代碼可以簡單地調用等效的C++實現並依賴這些調用進行內聯。

跨語言LTO需要不斷測試來降低有C++代碼緊密集成的Rust程式編寫的心理障礙,

從版本1.34開始,Rust編譯器中提供了跨語言LTO,並與Clang 8一起使用。

Read more

使用Rust构建Python扩展

mhp9B9.jpg 本演讲将集中讨论pyo3和milksnake,这两个流行的库提供了非常不同的编写Rust扩展的方法; 它将涵盖对库的基本介绍,并比较它们的相对优势和劣势。

Read More: https://morioh.com/p/14b736e8b8de




async

async-std v0.99.7 released

增加了16個新的api

example future::join

use async_std::future;

let a = future::ready(1);
let b = future::ready(2);
let c = future::ready(3);

let f = future::join!(a, b, c);
assert_eq!(f.await, (1, 2, 3));

Read more

Ergo-pin 0.1发布

ergo-pin 21 是一个提供更符合人体工程学的堆栈固定API的实验。当前的主要用例是在异步函数中,但对于std::pin::Pin API的其他用例(例如不稳定生成器特征的使用等)也很有用。

使用ergo-pin,您只需在一个项目上应用该属性,即可在该项目内使用 PIN! 宏来连接一切表达式:

fn get_reader() -> impl futures::io::AsyncRead + !Unpin { ... }
fn get_stream() -> impl futures::stream::Stream<Item = u32> + !Unpin { ... }

#[ergo_pin]
async fn foo() -> io::Result<[u8; 4]> {
    let mut buffer = [0; 4];
    pin!(get_reader()).read_exact(&mut buffer).await?;
    buffer
}

#[ergo_pin]
async fn bar() {
    let mut stream = pin!(get_stream());
    while let Some(value) = stream.next().await {
        dbg!(value);
    }
}

点击这里了解更多

async-std v0.99.6 版本更新

这个版本增加了几个新的组合器、work-stealing 算法执行器,以及使用 IntoStreamFromStreamcollect 流的能力。

此外,async-attributes 1.0 已经发布,它增加了对 async fn main, #[test] async fn#[bench] async fn 的支持。

使用示例
let a = stream::once(1u8);
let b = stream::once(2u8);
let c = stream::once(3u8);

let s = stream::join!(a, b, c);

assert_eq!(s.collect().await, vec![1u8, 2u8, 3u8]));

详情查看

Reddit 讨论:https://www.reddit.com/r/rust/comments/d6eb4g/asyncstd_v0996_released/

async-std v0.99.5 - Rust异步标准库

async-std外观和感觉像是Rust标准库,一切如你所期待使用async/await的工作方式一样。 该版本主要更新内容如下:

  • 增加了io::timeout的测试
  • 增加了fs::create_dir_all
  • 增加了io::prelude
  • 增加了stream::Stream::all
  • 增加了stream::Stream::filter_map
  • 增加了stream::Stream::find_map
  • .....

Repo:https://github.com/async-rs/async-std




web

render: 基于JSX的安全类型模板

render本身是一个特征、结构和宏的组合,它们统一并增强了构成树形数据结构的体验,最适合HTML和XML渲染,但也可以与其他例如ReasonML的Pastel终端颜色库一起使用。

前往GitHub了解更多

actix-web 修饰符 decorator

开源代码 https://github.com/gothame/rflaskProvide

两个宏可为您减少两行代码。

use actix_web::{web, App, HttpRequest, HttpServer, Responder};
use awf_help::{config, route,route_res, ServiceFactory};
#[route(GET, "/")]
fn greet(req: HttpRequest) -> String {
    let name = req.match_info().get("name").unwrap_or("World");
    format!("Hello {}!", &name)
}
struct Hello{
}
#[route_res("/api/auth")]
impl Hello {
    fn get(req: HttpRequest) -> String {
        format!("get Hello !")
    }
    fn post(req: HttpRequest) -> String {
        format!("post Hello !")
    }
}
fn main() {
        HttpServer::new(|| App::new().configure(config))
        .bind("127.0.0.1:8000")
        .expect("Can not bind to port 8000")
        .run()
        .unwrap();
}

tide - 授权每个人构建HTTP服务

一个模块化的Web框架围绕async/await进行构建,它是由Rust Async生态系统工作组积极开发的,目前还没有准备好投入生产使用

使用案例

fn main() -> Result<(), std::io::Error> {
    let mut app = tide::App::new();
    app.at("/").get(|_| async move { "Hello, world!" });
    Ok(app.run("127.0.0.1:8000")?)
}

Repo:https://github.com/rustasync/tide