< 返回版块

2019-08-31 23:34    责任编辑:jay

标签:rust, diary

August

rust

structopt v0.3 发布

structopt 是一个库,其通过定义结构体来解析命令行参数。

v0.3 较大的两个变化是:

  • 错误提示的显著改进;
  • 移除了raw属性;

有关更详细的信息,查看Github

RustCrypto:chacha20poly1305,aead,polyval,universal-hash

RustCrypto项目,本周发布了4个新的crates,这些是加密算法的纯Rust实现或trait

  • chacha20poly1305:流行的身份验证的加密模式,由RFC 8439定义。此包也支持XChaCha20Poly1305扩展的nonce变体。
  • aead:使用关联数据进行身份验证加密(Authenticated Encryption with Associated Data, AEAD)的traitchacha20poly1305包是根据这些trait实现的。
  • polyval:AES-GCM-SIV(RFC 8452)使用的通用散列函数。
  • universal-hash:通用散列函数的trait

自行承担使用风险。一般来说,使用任何加密库的0.1版本,可能是一个非常糟糕的主意。

param_attrs 將在Rust 1.39.0版本穩定

讓人在#[feature(param_attrs)] 小括號中加入參數

fn len(
    #[cfg(windows)] slice: &[u16],
    #[cfg(not(windows))] slice: &[u8],
) -> usize {
    slice.len()
}

可以做到程式碼裡,依不同作業系統編譯不同的程式碼。

Read more

在rust 1.39 nightly 你可以使用aljabar的矢量來自動序列化任何大小的數組。

程式碼裡序列化成json

use aljabar::{Matrix, matrix, Vector, vector};

#[test]
fn test_serialize() {
    let v = vector![ 1u32, 2, 3, 4, 5, 6, 7 ];
    assert_eq!(
        serde_json::to_string(&v).unwrap(),
        "[1,2,3,4,5,6,7]"
    );
    let m = matrix![
        [ 1u32, 2 ],
        [ 3u32, 4 ],
    ];
    assert_eq!(
        serde_json::to_string(&m).unwrap(),
        "[[1,3],[2,4]]"
    );
}

Read more

sn0int - 半自动化 OSINT 框架和包管理器

OSINT 就是“公开资源情报”,常见于安全和黑客领域。这个 sn0int 是给 IT 安全专业人士和 bug 捕获者设计的 OSINT 框架及包管理器。它用于对给定的目标或你自己搜集情报,生成统一的格式,给后续的研究使用。

Rust 已经悄悄占领安全/黑客领域了。https://sn0int.readthedocs.io/en/stable/

Repo: https://github.com/kpcyrd/sn0int

insta - 快照测试库

Snapshots tests (also sometimes called approval tests) are tests that assert values against a reference value (the snapshot). This is similar to how assert_eq! lets you compare a value against a reference value but unlike simple string assertions snapshot tests let you test against complex values and come with comprehensive tools to review changes.

Snapshot tests are particularly useful if your reference values are very large or change often.

快照测试(有时也被称作赞成性测试)就是把值与一个引用值(快照)进行断言。有点像 assert_eq!。但是 assert_eq! 只是简单的字符串等类型的测试,快照测试支持进行复杂类型值的断言,并提供全面的功能进行更改校审。

快照测试在对值对象非常大或者改动非常频繁的时候,非常有用。

img

Repo: https://github.com/mitsuhiko/insta

mobi-rs - 查看 .mobi 格式电子书的 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);
}

Repo: https://github.com/wojciechkepka/mobi-rs

luminance-rs - 类型安全/type-level和无状态的 Rust 图形框架

luminance 致力于让图形渲染变得简单优雅。它最初由 @phaazon 使用 Haskell 实现,在 2016 年的时候,移植到了 Rust 上面。

Where gfx-hal provides you with an experience focused on down-to-metal performance and an API very similar to Vulkan’s, luminance provides an API that is, for sure, a bit less low-level — and hence, yes, it’s likely you will not have the same performances as with gfx-hal (even though no benchmarks have been done so far), and the API is not Vulkan-based — but easier to start with, especially if you don’t already have a background experience with OpenGL or Vulkan.

Repo: https://github.com/phaazon/luminance-rs

icon-pie - 用命令行产生应用程序图标

用来将已有素材,转换,合成标准的 icon 规范的图标。像下面这样:

$ icon-pie -e small.svg 16 20 24 -e big.png 32 64 -ico output.ico
$ icon-pie -e image.png 32 64 48 -r linear -png output.tar
$ echo Here's an ICNS file: ${ icon-pie -e image.jpg 16 32 64 -r cubic -icns | hexdump }

Repo: https://github.com/GarkGarcia/icon-pie

rx: 一个Rust实现的可扩展的现代像素编辑器

#PixelEditor

像素编辑器一般用于对小图片进行编辑制作的工具。

img

ADL现在拥有rust的后端了

ADL(代数数据语言)系统可以在简单但功能强大的DSL中定义数据模型,然后为各种编程语言生成相应的代码。一致的序列化确保可以在语言环境之间无缝传输值。

现在ADL正式支持rust了!这意味着它目前支持:

  • haskell

  • java

  • typescript

  • c++

  • rust

虽然现有的语言目标是为了更高效的生产,但是此rust后端应该有些试验性的。

开发人员正在学习一些嵌入式系统项目的锈蚀,并打算使用ADL。在某些方面,Rust已经证明拥有它最简单的后端,因为ADL序列化模型可以完全由serde序列化库派生。感谢rust和serde!

Read More: https://github.com/timbod7/adl

PathDSL - 简单,零开销,能够无依赖关系创建和修改路径的库

PathDSL,一个专注于使PathBuf api易于使用的库,同时保持与自己编写相同的效率。API由一个宏path!和一个#[repr(transparent)]包装器组成PathBuf - PathDSL。该包具有零依赖性并且构建非常快。

创建路径非常简单:

let p = path!("folder1" | "folder2" | "folder3");


如果您在任何常见类型中都有已存在的路径,则可以无需任何开销来集成它们。

let x = path!(path_buf | "file.txt"); // Steals path_buf's data with no copying
let y = path!(&path_buf | "file.txt"); // Borrows path_buf, copies into new structure


它还会自动安全地将字符串文字连接到单个推送操作中以进行优化:

let p = path!("this" | "is" | "a" | "path");
// "this\\is\\a\\path" on windows
// "this/is/a/path" on all others


结果类型是PathDSL替代的替代物PathBuf

以下文档中提供了更多示例和用法信息:

docs.rs crates.io github

将Synthesia piano roll的视频转换为乐谱!

avatar

仅需简单几步,git clone下来体验一下~ Read More: https://github.com/alborrajo/sheetesia

criterion.rs - 统计驱动基准测试库

Criterion.rs是一个能够快速准确的检测和测量性能的改进或回归(甚至是小型)来帮助您编写快速代码。 从而可以放心的进行优化,了解每个更改如何影响代码的性能

#[macro_use]
extern crate criterion;

use criterion::Criterion;
use criterion::black_box;

fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n-1) + fibonacci(n-2),
    }
}

fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

输出

Running target/release/deps/example-423eedc43b2b3a93
fib 20                  time:   [26.029 us 26.251 us 26.505 us]
Found 11 outliers among 99 measurements (11.11%)
  6 (6.06%) high mild
  5 (5.05%) high severe

仓库地址:https://github.com/bheisler/criterion.rs

Lystem - Rust 实现生成分形图案的方法

#rust

L-System(Lindenmayer system)是一种生成分形图案的方法。与迭代函数系统生成分形依靠数字的迭代不同,L-System依赖的是字符的迭代。字符间也有迭代公式,可以将字符换成某个字符串,随着迭代次数的增加,字符串长度越来越大,而字符串中的每一个字符,都代表着一种对线条的操作,如延伸、旋转等。最后将字符串依次执行一遍,便会得到一张分形图案,比如下图中的树

Repo

monolith - 将网页的内容都保存到一个html文件里

#rust

平时我们用command+S保存网页时,会生成一个html文件和一个资源文件夹,这样的好处是我们可以快速找到我们需要的图片。monolith 会将一个网页中的所有资源嵌入到一个文件中,如果是html中img标签的链接,会变成dataurl,CSS中的图片则不会,它还可以移除图片,排除javascript文件。

Read More

wgpu-0.3

有關 WebGPU的庫

目前的toolchain

wgpu-rs -> wgpu-native -> gfx-backend-xxx -> native API

未來希望

wgpu-rs -> wgpu-native -> gfx-backend-gl -> glow -> WebGL -> Browser

但我們應該

wgpu-rs -> WebGPU -> Browser

在Firefox上是

Firefox -> wgpu-remote -> wgpu-native -> gfx-backend-xxx -> native API

Read more

vaccum - 系统全局配置文件搜集工具

系统中装的软件/组件/服务多了,难免会有很多配置文件。这样,就会有一些工具来帮助统一管理这些配置文件。vaccum 就是这样一个工具。项目刚启动,还不成熟。

Repo: https://github.com/idursun/vacuum

cargo-play - 本地用的 Rust Playground

https://play.rust-lang.org/ 是 Rust 官方提供的用于在云端就可以玩(演示)rust 代码的服务。cargo play 也起到同样的功能,但是是在本地,这样,本地不用创建一个 cargo 工程就可以快速看到代码效果了(节约了两分钟)。

img

Repo: https://github.com/fanzeyi/cargo-play

gym-rs: OpenAI gym的Rust绑定

#openAI

测试覆盖率报告作为代码阅读工具

#CoverageReport #CI #review

本文教你一种使用覆盖率报告阅读项目源码的方法,以alacritty的代码为示例,使用kcov来说明。

construct: 一个用同伦映射构造三维几何的高阶函数编程库

#functional #3D #HomotopyMap

什么是同伦(Homotopy)映射?

同伦是两个函数之间的连续变形。考虑将两个函数f和g与一个在0和1之间的参数结合起来,这样把参数设为0就得到f,把参数设为1就得到g。换句话说,它让你可以在函数之间平滑地插值。这个库使用了一个简化的同伦版本,用于构建三维几何。

Repo: https://github.com/pistondevelopers/construct

Meuse: 一个免费的Rust私有Cargo注册仓

#cargo #registry

Repo: https://github.com/mcorbin/meuse

Glitter: 漂亮地输出Git仓库状态信息

#git

用于在shell提示符中显示关于Git仓库的信息

Repo: https://github.com/glfmn/glitter/tree/v0.2.0

Twitter使用Rezolous进行系统性能遥测

Rezolus是一种收集详细系统性能遥测数据,通过高分辨率的遥测技术探测突发情况的工具。Rezolus不仅能够监测基本系统指标,还提供了性能计数器和对eBPF(extended Berkeley Packet Filter)遥测的支持。测量是提高性能的第一步。

twitter/rezolus

System 76 发布了用Rust编写的新GTK固件管理器

System76一直在开发一个简单易用的工具来更新Pop!_OS和System76硬件。今天终于发布了,该工具可以通过设置检查和更新固件上的Pop!_OS并通过固件管理器GTK应用程序在System76硬件上运行其他基于debian的发行版。

文章:https://blog.system76.com/post/187072707563/the-new-firmware-manager-updating-firmware-across

TiSpark v2.1.3 - TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品

TiSpark 是 PingCAP 为解决用户复杂 OLAP 需求而推出的产品。它借助 Spark 平台,同时融合 TiKV 分布式集群的优势,和 TiDB 一起为用户一站式解决 HTAP (Hybrid Transactional/Analytical Processing) 的需求。TiSpark 依赖于 TiKV 集群和 Placement Driver (PD),也需要你搭建一个 Spark 集群。

该版本主要添加的特性:

  • 修复表扫描中的成本模型
  • 修复固定索引Bug
  • 通过双读下推来禁止聚合或分组
  • 修复了HDP版本的反射错误
  • 修复scala编译器版本

GitHub:https://github.com/pingcap/tispark

Meuse v0.1.0 - 免费的私人Rust Registry

该项目是用Clojure编写的Rust私有仓库项目,并提供了API来管理用户、Token、类别,目前处于alpha状态,尚未准备好用于生产,谨慎使用。 该版本主要添加的特性:

  • 新的API
  • 修复了很多小问题
  • 集成测试
  • 改进搜索
  • 添加了healthz端点
  • 更换数据库连接池为HikariCP
  • 更多

GitHub:https://github.com/mcorbin/meuse

PingCAP 周报

在过去的TiDB一周合并了41个PR,TiKV合并了31个PR,具体细节可阅读原文

文章:https://pingcap.com/weekly/2019-08-19-tidb-weekly/#weekly-update-in-tikv-and-pd

ruffle - 用Rust写的Flash Player 模拟器

Ruffle是一种用Rust编程语言编写的Adobe Flash Player模拟器。 Ruffle使用WebAssembly来定位桌面和Web,项目目前处于概念验证阶段,目前只可以运行早期Flash动画。

GitHub : https://github.com/ruffle-rs/ruffle

logq - Rust实现的命令行工具,用于分析SQL中的日志文件

该项目是使用Rust实现的命令行工具,用于分析SQL中的日志文件

目前处于alpha阶段,作者欢迎大家PR 目前支持的格式有:

  • AWS经典弹性负载平衡器
  • Squid 原生格式 (初步支持)

GitHub : https://github.com/MnO2/logq

文章: https://blog.paulme.ng/posts/2019-08-16-logq---analyzing-log-files-in-sql-with-command-line-toolkit%2C-implemented-in-rust.html

cargo-edit v0.4 - 用于从命令行依赖关系的实用扩展

这个工具是cargo的一个扩展,使用它可以通过命令行的方式修改Cargo.toml文件来进行添加、删除和升级依赖。 该版本新增的特性如下:

  • 现在可以通过cargo add--sort选项来顺序添加依赖
  • cargo addcargo upgrade 支持离线模式了,只需要添加选项--offline

GitHub : https://github.com/killercup/cargo-edit

graphlib v0.4.0 - Rust的简单但功能强大的图形库

Graphlib是一个使用Rust实现的图库,该项目提供一个通用API,用于构建,变异和迭代图形,类似于Rust中的其他数据结构,即Vec,HashMap,VecDeque等。 该版本新增的特性如下:

  • 增加了Graph::tips迭代器
  • 性能优化

GitHub : https://github.com/purpleprotocol/graphlib/releases

surf - 友好的HTTP客户端

Surf是一个使用Rust实现的友好HTTP客户端, 它是完全模块化的,使用async / await构建, 无论是快速脚本还是跨平台SDK,Surf都能让它发挥作用。

GitHub : https://github.com/rustasync/surf

Rust 1.37.0 稳定版已发布

  • 現在可以使用 type 製作別名
type ByteOption = Option<u8>;

fn increment_or_zero(x: ByteOption) -> u8 {
    match x {
        ByteOption::Some(y) => y + 1,
        ByteOption::None => 0,
    }
}

  • 而在實作(实现)函數中 Self 可以當成目前結構的別名
impl Coin {
    fn value_in_cents(&self) -> u8 {
        match self {
            Self::Penny => 1,
            Self::Nickel => 5,
            Self::Dime => 10,
            Self::Quarter => 25,
        }
    }
}

  • 現在可以有匿名的變數在巨集(宏)中
/// Type size assertion where the first parameter
/// is a type and the second is the expected size.
#[macro_export]
macro_rules! static_assert_size {
    ($ty:ty, $size:expr) => {
        const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()];
        //    ^ Note the underscore here.
    }
}

static_assert_size!(Option<Box<String>>, 8); // 1.
static_assert_size!(usize, 8); // 2.

現在程式可以根據實際的執行情況最佳化編譯,神奇的功能!

首先編譯時 rustc 加入 -C profile-generate

然後執行這個程式跑一跑你的測試資料後會產生記錄檔

再來第二次編譯 rustc 加入 -C profile-use

會根據你剛剛跑的結果來最佳化編譯

  • 現在將編譯出執行檔做為預設(缺省)行為

如果你沒打 --bin 也可以編

  • enum 也可以對齊了
#[repr(align(16))]
enum Align16 {
    Foo { foo: u32 },
    Bar { bar: u32 },
}

  • 下面的函數穩定了
BufReader::buffer and BufWriter::buffer
Cell::from_mut
Cell::as_slice_of_cells
DoubleEndedIterator::nth_back
Option::xor
[{i,u}{8,16,32,64,128,size}::reverse_bits] and Wrapping::reverse_bits
slice::copy_within

read more

system76-power - system76 操作系统使用 Rust 写了很多组件

这不是闹着玩儿的操作系统了,这可是面向商业的正式的操作系统(一个 Linux 发行版)。官网地址在这里

他们用 Rust 实现了下面这些:

`firmware daemon, firmware manager, firmware itself, a multi-USB flasher, power daemon, upgrade daemon, distribution installer, disk manager, etc```

而且,显得特别兴奋。还会继续写更多组件的。

Repo: https://github.com/pop-os/system76-power

include-flate - 又一个黑魔法

这个东东类似于 include_bytes!/include_str!,但是它在编译时不展开,而是在运行时再展开,因此特别适用于那些对体积要求严格的程序。

Repo: https://github.com/SOF3/include-flate

ceres-mpq - Blizzard 的 MoPaQ (MPQ) 包格式读写库

从此,可以用 Rust 读写 Warcraft III 地图格式了。开不开心。

Repo: https://github.com/ElusiveMori/ceres-mpq

physx-rs - NVIDIA PhysX 库的绑定

NVIDIA PhysX 是一个成熟的物理碰撞(检测)库。这个加是对其的绑定。Rust 社区中,还有另外一个 nphysics 库,但是还不够成熟。

img

Repo: https://github.com/EmbarkStudios/physx-rs

qlc - GraphQL 代码生成库

可生成 TypeScript GraphQL 代码。

Repo: https://github.com/notarize/qlc/

欢迎使用最新的 async/await

tokio 发布了 0.2.0 alpha1。小编今天看了一下,hyper 也已经跟进了。大家快来跟进吧,早跟早受益。反正小编的使用体验就是两个字:很爽!

maze - 用 Rust 实现一个迷宫

+---+---+---+---+---+---+---+---+---+---+
|                                       |
+---+---+---+---+   +---+---+   +   +   +
|                   |           |   |   |
+   +---+   +   +---+   +   +---+   +   +
|   |       |   |       |   |       |   |
+   +   +---+   +---+   +   +---+   +   +
|   |   |       |       |   |       |   |
+   +   +   +---+---+   +   +   +---+   +
|   |   |   |           |   |   |       |
+   +---+---+   +   +---+   +   +---+   +
|   |           |   |       |   |       |
+---+---+---+---+---+---+   +---+---+   +
|                           |           |
+---+   +   +   +---+---+---+   +---+   +
|       |   |   |               |       |
+---+---+---+   +   +   +   +   +---+   +
|               |   |   |   |   |       |
+---+   +---+   +---+   +   +---+---+   +
|       |       |       |   |           |
+---+---+---+---+---+---+---+---+---+---+

酷炫不。

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

VecOption: 与Vec等价但更高效的库

#StdExtend

Repo: https://github.com/sivadeilra/vec_option

Syn 和 Quote 1.0 发布

#macro #syn

Syn 和 Quote 此次 1.0 稳定,意味着API接口稳定,但是,并不代表着Rust的语法树稳定。Syn和Quote内部还是会随着Rust的变化而改动,只不过不会影响 Syn 和 Quote 的 API稳定。

注意: Syn和Quote的1.0版本最低依赖Rust 1.31版本。发布日志里还记录了一些Break change,需要注意。

Read More: https://github.com/dtolnay/syn/releases/tag/1.0.0

cargo-docset: 可以生成支持Dash和Zeal的文档集

#docs

Dash和Zeal都是著名的编程语言文档集工具

Repo: https://github.com/Robzz/cargo-docset

Rust 1.37 预发布测试

#Stable

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

新版本中有一些新特性:

  • cfgcfg_attr 中可以用泛型参数了
  • 可以对枚举值使用类型别名了
type MyOption = Option<u8>;

fn increment_or_zero(x: MyOption) -> u8 {
    match x {
        MyOption::Some(y) => y + 1,
        MyOption::None => 0,
    }
}

  • 可以用_来定义常量:const _: u32 = 5;
  • Rust 2015 edition 的宏现在支持 ?语法
  • mem::MaybeUninit和T已经实现ABI兼容,MaybeUninit共享T的大小、对齐方式和ABI。

1.37 Release Notes: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1370-2019-08-15

tnef: 一个纯Rust的 TNEF 解析器

#tnef

TNEF 以 application/ms-tnef 类型的 MIME 附件的形式出现在邮件中。

Repo: https://github.com/newpavlov/tnef

「非官方」Google Play市场的 Crates.io 安卓App 已经更新到了1.5版本

#android

头一次知道还有这个App

Read More: https://play.google.com/store/apps/details?id=com.bmco.cratesiounofficial&hl=en_us

Jilu: 根据Git仓库的状态生成改变日志

#git

自动生成 CHANGELOG.md

Repo: https://github.com/rustic-games/jilu

static-assertions-rs 发布 0.3.4 版本

#assert

该库可以实现编译时断言。

Repo: https://github.com/nvzqz/static-assertions-rs

starship 一个小而美的shell提示工具

#crate

starship 是一个非常小、极快shell的提示,可以定制,并且支持任何shell。

Read More

Tokio alpha 版发布

#tokio

新版本支持async/await

tokio = "=0.2.0-alpha.1"

#![feature(async_await)]

use tokio::net::TcpListener;
use tokio::prelude::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { 
    // ...
    tokio::spawn(async move {
            let mut buf = [0; 1024];
            // ... 
            loop {
                let n = match socket.read(&mut buf).await {
                    // ...
                }
    // ...
}

Read More: https://tokio.rs/blog/2019-08-alphas/

gfx-rs标杆项目开启

#gfx

gfx-rs并不是纯Rust编写。它依赖的一个复杂而重要的组件是用C和C++的混合语言编写的: SPRIV-Cross。它一个着色器翻译库,由 @TheMaister 和一些 Khronos 成员开发,虽然不是 Khronos 的官方产品,但需要它从SPIR-V源生成特定于平台的着色器。它有一个测试套件,它的后端主要由MoltenVK开发和使用。

SPRIV-Cross 在我们的性能报告中出现了很多次(例如在Dota2上)。它的编写方式也与惯用的Rust相去甚远: 代码更喜欢大的可变数据结构,这使得它很难模块化、测试、优化,尤其是在C/C++ FII之后进行交互。虽然它发展很快(就贡献而言),但它在使用高级后端功能方面限定了我们可以做什么和不能做什么,例如内嵌、参数缓冲区等。它使我们的构建过程变得复杂,尤其是在需要单独的Emscripten构建(Rust代码不需要)来生成WASM模块的网络上,成为开发人员和用户的一个痛点。

所以,gfx-rs团队认为,是时候攻克gfx-rs中C++代码的最后一个堡垒了。标杆项目就是关于“飞出墙外的SPIR”(A SPIR that flies above the garden walls,意指,被扔出去了。。。)。这是一个非常复杂的软件,我们还没有取得很大进展。

然而,我们再次感到Rust是着色器翻译工作的最佳工具: 它是关于解析的,处理字节和数据结构,具有进行单元和模糊测试的能力,并且没有外部依赖性。

Read More: https://gfx-rs.github.io/2019/07/13/javelin.html

「跟进」Rust中模拟高阶类型(HKTs)

#HKT

Read More: https://gist.github.com/edmundsmith/e09d5f473172066c0023ef84ee830cad

grin 一个 MimbleWimble 协议的最小实现

#crate

MimbleWimble是一个区块链隐私保护的格式和协议,是一种可以防止区块链泄露个人信息的技术,名字来源于《哈利波特》。grin是MimbleWimble协议的最小实现。

Read More

amethyst 面向数据和数据驱动的游戏引擎

#crate

amethyst 是一种数据驱动和面向数据的游戏引擎,旨在尽可能快速且可配置,文档写的很详细,下面是由它实现的两个项目:

Read More

tracing 更新

#crate

tracing 是一个框架,用于检测Rust程序以收集基于事件的结构化诊断信息。 跟踪由Tokio项目维护,但不需要使用tokio运行时。instrument 属性提供了一种向函数添加跟踪跨度的简便方法。 使用 instrument 注释的函数将在每次调用函数时创建并输入具有该函数名称的span,并使用fmt::Debug将该函数的参数记录为字段。

Read More

jsonrpc-v2 - 又一个JSON-RPC轮子

作者又造了一个轮子,因为他用其它JSONRPC的时候,有一点不顺心,所以就换自己喜欢的组合封装了一个新的库,感兴趣的可以了解。

Repo: https://github.com/kardeiz/jsonrpc-v2

tinystr - 只操作长度不超过4或8的ASCII字符串

只针对这两个进行操作,效率上进行了提速(内部使用 u32/u64 进行存储)。

Repo: https://github.com/zbraniecki/tinystr

另外一个可以参考的库:https://github.com/rust-analyzer/smol_str

droprate - 一个随机列表生成库

提供多种方式生成随机列表,可用于各种场景。提供:Random,Fairly Random,ShuffleRandom,PlaylistRandom,TrueRandom,Recurrence Interval等。

Repo: https://github.com/AberrantWolf/droprate

Way of Rhea - Steam 上的游戏,用Rust写的算法引擎哦

地址在这里:https://store.steampowered.com/app/1110620/Way_of_Rhea/

insta - Rust 快照测试库

Snapshots tests (also sometimes called approval tests) are tests that assert values against a reference value (the snapshot). This is similar to how assert_eq! lets you compare a value against a reference value but unlike simple string assertions snapshot tests let you test against complex values and come with comprehensive tools to review changes.Snapshot tests are particularly useful if your reference values are very large or change often.

学习Rust让小编学到好多新名字,新概念,新术语。长见识了。

Repo: https://github.com/mitsuhiko/insta

gfx-hal-0.3 來了

現在所有的型別都實作 Debug

MSAA 反鋸齒做好了

事件API

對3D圖形底層api有興趣的可以看看。

read more

emosaic: 马赛克生成器

#mosaic

万恶的马赛克。

img

emosaic

Codenano: 一种在浏览器中设计DNA(脱氧核糖核酸)纳米结构的工具

#DNA #wasm

Codenano还能够计算出一些简单的DNA碱基之间的相互作用,以帮助用户根据一些简单的标准设计出可行的DNA纳米结构。

创建纳米结构设计可能是一个乏味的过程,而codenano的设计目的是减少这一过程。它给出了一个简单的应用编程接口,在这个接口中,我们使用一个小的、简单的Rust编程语言子集来指定一个DNA纳米结构。使用这个应用编程接口不需要任何Rust的知识。然而,高级用户可以从Rust的表达中受益。

img

indextree 4.0发布

#indextree

pulldown_cmark库为了增加解析速度,快速构建和遍历AST,就使用了indextree。

Read More

SPOJ将Rust升级到1.33版本

#spoj

SPOJ是波兰最为出色的Online Judge之一,界面和谐,题目类型也非常丰富,适合有一定基础的选手练习,对高手而言也是个提高能力的良好平台。现在已经支持了Rust 1.33版本。

Read More

isahc: 之前的cHTTP已经改为此名

#http

一个实用的HTTP客户端。

Isahc vs Reqwest:

  • Isahc使用http crate作为其公共API的一部分,而reqwest将其隐藏在实现中
  • Isahc具有更小的依赖树和更小的二进制内存占用

改名的原因:

  • cHTTP太难念
  • cHTTP不容易被记住

(所以,isahc难道是 is a http client 缩写吗? 这新名字起的也不咋地。。。233)

isahc

proc_macro_roids 0.3 发布

#proc_macro

proc_macro_roids是一个辅助你写过程宏的小工具。

proc_macro_roids

staticvec: 基于const generics实现的栈分配固定容量的Vec替代方案

#Vector

发布了0.2版本

staticvec

一个新的 Rust PNG 解码库

#rust

特点是性能好,尚未发布,作者希望能让更多贡献者参与进来。

Image

this crate

png crate

this (wasm)

png (wasm)

depth.png

4.2 ms

9.1 ms

12 ms

42 ms

eye.png

0.69 ms

0.99 ms

3 ms

8 ms

inkscape.png

10.1 ms

9.8 ms

19 ms

43 ms

rgb.png

7.4 ms

16.1 ms

17 ms

61 ms

screen.png

8.6 ms

10.8 ms

15 ms

43 ms

texture_alpha.png

0.75 ms

1.9 ms

2 ms

8 ms

transparent.png

22.5 ms

17.6 ms

38 ms

81 ms

Read More

Rust的借用检查和内存所有权对GUI开发的影响(简单案例)

作者既不是经验丰富的Rust程序员,也不是GTK+的开发者,甚至没有丰富的多建立本机GUI或系统级编程的经验。尽管如此,他还是想知道Rust的内存访问静态分析对编写GUI有何影响。

Read More

使用 Rust 实现 Gameboy 模拟器

#rust

@douglascorrea 在Reddit上发帖要直播实现一个游戏模拟器的过程,如今已经出到第14期视频了。立下flag却迟迟没有动手的同学可以借鉴他的方式。

Read More

stable-bloom-filter - 稳定布隆过滤器

用来对一个数据流中的重复数据进行筛选。是 BoomFilters 的 Rust 实现版本。

Repo: https://github.com/u2/stable-bloom-filter

ruzzt - 一个 ZZT 游戏引擎

克隆自 DOS 游戏 ZZT 的引擎。

img

Repo: https://github.com/yokljo/ruzzt

rusty-sandbox - 一个 Rust 沙盒库

沙盒库的意思,就是可以随便在里面玩儿,里面崩了不会影响外面的进程状态。跟 Docker 有点像,但是是更轻量型的语言内的沙盒。

  • any normal computation (not I/O)
  • I/O operations on existing file descriptors (i.e. files and sockets opened before entering the sandbox)
  • accepting connections on an existing socket (which creates new file descriptors)
  • opening files under pre-selected directories though the Sandbox/SandboxContext API (which creates new file descriptors)

Repo: https://github.com/myfreeweb/rusty-sandbox

ternimal - 模拟生命的形式?

简单地被其动画吸引了,已经上升到美学和哲学层面。这种库不推还推什么,哈哈。

img

img

img

img

Repo: https://github.com/p-e-w/ternimal

国人 importcjj 哥出的 ajson 库

快速读取 JSON 值 。借鉴自 https://github.com/tidwall/gjson

Repo: https://github.com/importcjj/a-json

最小安全抽象

看起來是表達生命週期對能對記憶體安全做抽象描述

read more

paperclip - OpenAPI 规范的 Rust 实现

在完成后,它会实现:

  • Rust 中的服务器端、客户端和命令行端的高效的、编译时检查的、类型安全的 HTTP API 的生成;
  • 支持处理、验证和托管 OpenAPI 规范;
  • 自定义规范和代码生成。

很有意思!

Repo: https://github.com/wafflespeanut/paperclip

brpc-rs - X-lab 实验室新推出的一个rpc库

brpc-rs is part of the MesaLock Linux Project.

百度的 X-Lab 正在构建一个具有野心的体系 MesaLock Linux。brpc-rs 是对 Apache BRPC 的 Rust 绑定,是一个可用于工业级场景的 RPC 库。

img

Repo: https://github.com/mesalock-linux/brpc-rs




learning

cargo-udeps,缓解Rust依赖膨胀的插件

大多数人对Rust的最大问题之一是编译时间长。原因之一是许多项目使用crates.io中相当多的依赖项。

帮助缓解crates.io上的依赖膨胀是cargo-udeps的目标之一。小编在自己的项目上试用了一下,遇到问题尚待解决。毕竟目前还是v0.1.0,期待这个插件进一步完善。Gist详情

lyys-MBP:abc lyy$ cargo install cargo-udeps
    Updating crates.io index
  Downloaded cargo-udeps v0.1.0
  Downloaded 1 crate (19.7 KB) in 2.45s
  Installing cargo-udeps v0.1.0
  Downloaded cargo v0.38.0
  Downloaded curl v0.4.23
	...
   Compiling cargo v0.38.0
   Compiling cargo-udeps v0.1.0
    Finished release [optimized] target(s) in 3m 28s
  Installing /Users/lyy/.cargo/bin/cargo-udeps
   Installed package `cargo-udeps v0.1.0` (executable `cargo-udeps`)

lyys-MBP:abc lyy$ cargo +nightly udeps
   Compiling semver-parser v0.7.0
...
Running /abc/target/debug/build/abc-runtime-a1002fbc69f0d1e8/build-script-build
error: failed to run custom build command for abc-runtime v2.0.0 (/abc/runtime)

Caused by:
process didn't exit successfully: /abc/target/debug/build/abc-runtime-a1002fbc69f0d1e8/build-script-build (exit code: 1)
--- stderr
error: 'run' isn't a valid value for ''
[possible values: udeps]

USAGE:
cargo-udeps --manifest-path --message-format

For more information try --help

warning: build failed, waiting for other jobs to finish...
Error: StrErr("build failed")

通过AVL树来理解Rust的所有权

#Elixir #AVL

一个Elixir程序员开始学习Rust,在看完Too Many LinkedList之后,进一步实现更复杂的数据结构:AVL树(自平衡二叉查找树),以此来学习Rust的所有权机制。

在Rust中使用Tree-sitter解析器生成器

#TreeSitter

TreeSitter是 GitHub 团队的解析器项目, 目的在于给 GitHub 及 Atom 编辑器提供高效以及跨语言的语法解析支持, 采用 GLR 算法, 支持消歧, 从错误中恢复, 增量解析等功能。TreeSitter支持多种语言,且支持增量解析,它的出现降低了自己实现语言的门槛。

该文章简单介绍了Rust中使用TreeSitter的方法。

通过AVL树来理解Rust的所有权

#Elixir #AVL

一个Elixir程序员开始学习Rust,在看完Too Many LinkedList之后,进一步实现更复杂的数据结构:AVL树(自平衡二叉查找树),以此来学习Rust的所有权机制。

Crev的使用教程

#Crev

cargo-crev是一个代码审查工具,旨在构建信任的生态网络。但它并不局限于Rust社区,C/Cpp也可以使用。

该工具可以判断你项目中依赖crate的安全性、质量和发现的问题。可以在公共的git仓库里发布可验证的review信息。通过这种方式期望在Rust生态系统中构建可信任的网络。将不会有人再受到未经审查和不受信任代码的困扰。

想想npm因为依赖包出了多少次安全事故。这个工具ms不错,但是否真的可以解决问题?

Read More: https://wiki.alopex.li/ActuallyUsingCrev

使用Rust进行游戏开发6个月之后收获到了什么?

#game

一位使用Rust开发游戏的妹纸,最近6个月内使用ggez框架开发自己的个人游戏项目,这篇文章简单介绍了她的一些感想,比如如何坚持做自己的项目、ECS很棒之类的。

重点是她之前写的另一篇文章:24小时游戏开发,介绍了如何使用ggez框架在24小时内开发一款小游戏。感兴趣的看看吧。

Read More: https://iolivia.me/posts/6-months-of-rust-game-dev/

「系列」Rust for OOP系列:闭包

#learning #oop

这位博主打算写一系列主题是Rust for OOP的文章,主要是针对有一定OOP语言开发经验的人来学习。已经写了多篇,本文是关于闭包。

Read More:https://oribenshir.github.io/afternoon_rusting/blog/closures

Rust异步代码的优势:相比于其他语言更加容易调试

#async

该文作者通过研究栈回溯信息发现,Rust的异步代码基于轮询(Poll)模型,意味着我们总是有「异步调用者」在轮询期间,等待「异步被调用函数」在栈上完成。这个属性使得调试异步代码在Rust中相比于其他语言更加容易。(该文比较了JavaScript中的异步栈回溯信息

Read More: http://fitzgeraldnick.com/2019/08/27/async-stacks-in-rust.html

「视频」使用Rust扩展Python

#python

演讲的重点是:pyo3 和 milksnake

「思考」对于小的结构体,传值(By-Copy)还是传引用(By-Borrow)?

#Struct

这个小小的问题,涉及日常编写代码需要考虑的两个问题:性能 vs 人体工程学

我们是追求性能呢,还是追求代码的可读性和维护性等?

该文作者通过大篇幅的讨论,甚至深入到C++中探讨,得出结论:还是By-Copy吧。至于原因,还需要仔细阅读他的文章。

Read More: https://www.forrestthewoods.com/blog/should-small-rust-structs-be-passed-by-copy-or-by-borrow/

RACC: Berkeley YACC解析器生成器移植到Rust

#BerkeleyYACC

作者的练手项目

Repo: https://github.com/sivadeilra/racc/

搜狗词库转文本格式

Rust初学者,欢迎大家一起学习交流。 以下是简单用法

Convert sogou scel file to rime dict file.

USAGE:
    scel2rime [OPTIONS]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -i, --input <input>      A sogou scel filename.
    -o, --output <output>    An output filename.

Read More: https://github.com/godcrying/scel2rime

Rust-for-Node-developers - 写给Node开发者的Rust教程

#node.js #rust

@Jack Lo Russo搜索Javascript开发者学习Rust的资源,用来打发未来几天的休闲时光,结果发现了这个项目。

Read More

Rust 异步流程杂志图

#rust

@lrlna为Rust Conf特别制作的杂志图,描绘了Rust中异步编程状态,包括Futures、async/.await,以及关于Async Runtime如何工作的。

Read More

Dwelo如何在Rust中重寫 IoT gateway

小編我曾經在gateway team工作過,

rust其實非常適合寫這種在需要穩定執行的程式。

這篇文章講解了很多跟C庫打交道的技巧,

包含FFI, call c function, impl Drop, return pointers, error handle

蠻實用的

Read more

一個youtube短片教你如何使用gtk-rs (gtk 4.0)

Read more

CPU原子和顺序解释

#cpu #atomics #ordering

本文简要地解释了CPU内存顺序是如何工作的,以及它们是做什么的,这对于理解Rust中的原子类型和Mutex锁比较重要。

Read More: https://fy.blackhats.net.au/blog/html/2019/07/16/cpu_atomics_and_orderings_explained.html

<_>::v::<_>: 一件有趣的Rust「艺术品」

#tips #fun

<_>::v::<_> 像个猫头鹰(面试题 +1)

原始代码:

type O = u8;

trait V {
	fn v<T: Default>() -> (T, Self);
}

impl V for O {
	fn v<T: Default>() -> (T, Self) {
		(T::default(), 0)
	}
}

fn main() {
	let owl = <_>::v::<_>;

	println!("{:?}", owl() as (O, O));
}

网友改进:

type O = u8;
const O: O = 0;

trait V {
	fn v<T: Default>() -> (T, Self);
}

impl V for O {
	fn v<T: Default>() -> (T, Self) {
		(T::default(), O)
	}
}

#[test]
fn test() {
	let owl = <_>::v::<_>;
    assert_eq!(owl(), (O, O));
}

你看懂了吗?

HinT:

  1. <_>::v::<_>其实等价于<u8>::v::<u8>,类型推导
  2. o0 不要傻傻分不清楚

Read More: https://chrismorgan.info/blog/rust-artwork-owl/

用emoji学习Rust Iterator

#rust

@heavypackets 用emoji学习Rust Iterator,下面是其中一个例子。

Read More

用Rust实现js引擎来学习js

#rust

@hsiaosiyuan0用Rust实现JavaScript引擎来学习Rust,对于喜欢JavaScript又喜欢Rust的人来说,这真是个两不误的绝佳方式,点赞👍。

Read More

重要文章:为什么我们需要一个异步 tracing 库

tokio 官方写的,讲了为什么在异步环境下,日志的搜集和处理有什么不同。导致了 tokio-tracing库的出现。强烈推荐阅读。

Read: https://tokio.rs/blog/2019-08-tracing/

「SO问答」对超过240个元素的数组进行循环时,为什么会有很大的性能影响?

#stackoverflow

问题:

下面代码当 CAPACITY >= 240 的时候,与 CAPACITY >= 239 相比,性能慢了80倍。Rust编译器专门为240以内的长度做了优化? 使用 rustc -C opt-level=3 进行编译。

use std::time::Instant;

const CAPACITY: usize = 240;
const IN_LOOPS: usize = 500000;

fn main() {
    let mut arr = [0; CAPACITY];
    for i in 0..CAPACITY {
        arr[i] = i;
    }
    let mut sum = 0;
    let now = Instant::now();
    for _ in 0..IN_LOOPS {
        let mut s = 0;
        for i in 0..arr.len() {
            s += arr[i];
        }
        sum += s;
    }
    println!("sum:{} time:{:?}", sum, now.elapsed());
}

解答:

总结:低于240,LLVM完全展开内部循环,可以优化掉重复循环,增加性能。

分析:

这是一个神奇的阈值,超过该阈值LLVM将停止执行某些优化。阈值是 8字节* 240 = 1920字节(数组是usizes数组,因此长度乘以8字节,假设 x86-64 CPU)。在该问题中的基准测试中,是仅针对长度239执行的一个特定优化,所以导致了巨大的性能差异。

比如这段代码:

pub fn foo() -> usize {
    let arr = [0; 240];
    let mut s = 0;
    for i in 0..arr.len() {
        s += arr[i];
    }
    s
}

你在 godbolt 编辑器中查看生成的汇编代码,比较240和239,会发现有很大区别。比如当239的时候生成:

movdqa  xmm1, xmmword ptr [rsp + 32]
movdqa  xmm0, xmmword ptr [rsp + 48]
paddq   xmm1, xmmword ptr [rsp]
paddq   xmm0, xmmword ptr [rsp + 16]
paddq   xmm1, xmmword ptr [rsp + 64]
; more stuff omitted here ...
paddq   xmm0, xmmword ptr [rsp + 1840]
paddq   xmm1, xmmword ptr [rsp + 1856]
paddq   xmm0, xmmword ptr [rsp + 1872]
paddq   xmm0, xmm1
pshufd  xmm1, xmm0, 78
paddq   xmm1, xmm0

就是所谓的循环展开: LLVM将循环体粘贴一段时间,以避免执行那些“循环管理指令”,即循环变量的增量,检查循环是否结束和跳转。(可以自行对比一下240的输出)。但是,即便循环不展开,也不会造成80倍的性能差异。所以,实际上那个性能测试代码嵌套循环导致的(LLVM生成的代码基本上首先只执行内部循环(计算总和),然后通过多次累加总和来模拟外部循环!)。最好要使用Rust的惯用法: arr.iter().sum(),这样就不会产生80倍的性能差异了。

Read More: https://stackoverflow.com/questions/57458460/why-is-there-a-large-performance-impact-when-looping-over-an-array-over-240-elem

Rust异步编程尝试:GitHub star计数工具

#async

供学习使用

Repo: https://github.com/Byron/github-star-counter

tokio-i3ipc更新到了async/await

#tokio

tokio-i3ipc的作者写了篇文章记录了此事,也算是一个升级参考。

如何写全栈Rust代码

#fullstack

这篇文章比较系统的介绍了Yew、ws-rs(websocket)、serde等工具使用Rust编写一个Chat Web App。

Read More: https://www.steadylearner.com/blog/read/How-to-write-Full-Stack-Rust-code

「系列文章」用Rust重写物联网网关 Part 3: Safe Rust 如何跳过C/Cpp的陷阱

#IoT

文章里这个类比比较经典(普罗米修斯盗了天火,为世界带来了光明,但与此同时也带来了灾难):

我们本可以用C++重写我们的物联网平台应用。使用C就像用蜡烛照明一样。它的基本属性是众所周知的,它从文明之初就存在了,如果你滥用它,它会让你周围的房子着火。(在这个比喻中,C++将是“所有可以被点燃产生光的东西的集合”。)

该文的作者是智能家居系统公司Dwelo的IoT工程师,该文主要罗列了一些Cpp编写嵌入式应用可能拥有的问题。

这篇文章为系列第三篇。

Rust项目中如何在运行时重载配置

#reload

有些程序运行时间很长。对于这些,重启它们来改变配置不是你愿意做的事情。想象一个网络服务器或数据库服务器。这种东西总是处理大量的查询,重启会杀死所有当前正在执行的查询,这会导致最终用户出错,或者由于某些地方的重试而导致性能不佳。

作者的思考:

  • 需要从一个或多个文件中加载配置
  • 需要某种触发器来重新加载配置,然而,使用inotify之类的工具监视配置文件更改的做法不是最佳实践
  • 需要一个手动触发器
  • unix守护进程约定是向进程发送一个SIGHUP信号,对于命令行应用程序,此信号意味着终端消失了,你可能想要终止它。unix守护进程没有终端,所以它被重用了。在SIGHUP上,守护程序通常会重新加载其所有配置并重新打开日志文件(这是为了与logrotate集成)
  • 推荐使用signal-hook来侦听信号,因为信号一般很容易被错误使用,这个库屏蔽了信号使用的大部分问题。
  • 或者,程序可以通过某种方式发送一些触发重载的RPC命令
  • 配置文件有三种应用场景:初始化/ 每次都需要加载/ 需要主动更改的配置

根据上面的思考,作者开发了Spirit框架。但是该框架还有很多工作要完善。

(目测该框架会对Rust在自动化运维方向起到促进作用)

Rust 和 Raspberry Pi教程

#rust

最近在用 Rust 玩树莓派,找到了一份比较好的Rust + Raspberry Pi教程。

Read More

How does Tokio schedule tasks?

根据 Reddit 上的问答整理的:https://docs.qq.com/doc/DQll1bmZPclJ2UGZT

fuzzitdev example - 持续模糊测试平台 fuzzit.dev 的Rust例子

模糊测试(fuzz testing)是一种安全测试方法,他介于完全的手工测试和完全的自动化测试之间。

模糊测试充分利用了机器的能力:随机生成和发送数据;同时,也尝试将安全专家在安全性方面的经验引入进来。从执行过程来说,模糊测试的执行过程非常简单:

  1. 测试工具通过随机或是半随机的方式生成大量数据;
  2. 测试工具将生成的数据发送给被测试的系统(输入);
  3. 测试工具检测被测系统的状态(如是否能够响应,响应是否正确等);
  4. 根据被测系统的状态判断是否存在潜在的安全漏洞。

而 Rust 中提供了集成工具 https://github.com/rust-fuzz/cargo-fuzz

例子在这里:https://github.com/fuzzitdev/example-rust

Tokio v0.2.0-alpha.1; 現在有 async & await.

現在一個簡單的 echo server可以寫成這樣

#![feature(async_await)]

use tokio::net::TcpListener;
use tokio::prelude::*;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "127.0.0.1:8080".parse()?;
    let mut listener = TcpListener::bind(&addr)?;

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buf = [0; 1024];

            // In a loop, read data from the socket and write the data back.
            loop {
                let n = match socket.read(&mut buf).await {
                    // socket closed
                    Ok(n) if n == 0 => return,
                    Ok(n) => n,
                    Err(e) => {
                        println!("failed to read from socket; err = {:?}", e);
                        return;
                    }
                };

                // Write the data back
                if let Err(e) = socket.write_all(&buf[0..n]).await {
                    println!("failed to write to socket; err = {:?}", e);
                    return;
                }
            }
        });
    }
}

到目前為止,感謝社區的回饋與rust團隊對rust語言的維護,也感謝tokio有專業的團隊在維護。

read more

我學習rust的前三個月

作者是c++ 老手,看到了一些rust的傳聞很感興趣,所以來試著用用看。

一開始的感覺還不錯,所有權解決了很多在C++會遇到的問題,

這並不是免費的午餐,他依賴更複雜的語法限制,且你不能把其它語言的常識套用在rust。

但這樣也沒什麼不好,rust寫出來的程式很難會有難聞的代碼味,你可以很放心的維護你的程式。

rust相較於c++,需要你顯式宣告各種語法,你的程式語意明確不會被誤解。

作者覺得rust生態還不夠完整,直接使用的風險還過高,

但這個問題正在逐步被改善,像微軟、亞馬遜、臉書等公司都在使用,

相信rust的未來是很光明的。

read more

Await 一下,何必要這麼麻煩呢?

這篇文章講解了從純future轉換到 async/await之後,

程式碼的閱讀性會有顯著的提高,也更容易寫出非同步的程式。

使用future

fn handle_get_counters(
    &self,
    p: &mut P::Deserializer,
) -> impl Future<Item = ProtocolEncodedFinal<P>, Error = Error> + Send + 'static {
    let ret: Result<_, Error> = (|| {
        let args = {};
        Ok(self.service.get_counters(args))
    })(); 
    let ret = ret.map(|res| { 
        res.then(move |res| {
            res.and_then(move |res| write_message(
                p, "getCounters", MessageType::Reply, |p| res.write(p),
            ))
        })
    }); 
    ret.into_future().flatten()
}

async/await

async fn handle_get_counters(
    &self,
    p: &mut P::Deserializer,
) -> Result<ProtocolEncodedFinal<P>, Error> {
    let args = {};
    let res = self.service.get_counters(args).await?;
    let enc = write_message(p, "getCounters", MessageType::Reply, |p| res.write(p))?;
    Ok(enc)
}

相信大家都跟我一樣迫不及待想要趕快使用rust 1.38版!

read more

Project Servo 使用過去繼有的技術拯救未來的自己

裡面提到了 rust 目前所擁有的語言特性大部份是參考過去程式語言的解法

只是更優雅的整合在了一起,這是其它語言所沒有的。

read more

lzjd-rs - Lempel-Ziv Jaccard Distance 算法的 Rust 实现库

这个库的作用是这个,随着数据的增多,想要从各种数据中识别出用户的关键(敏感)信息,就越来越困难,必须使用一定的工具来进行自动化处理。而这个算法就在这个过程中起作用。详情请查阅:https://tweedegolf.nl/blog/33/implementing-lempel-ziv-jaccard-distance-lzjd-in-rust

Repo: https://github.com/tweedegolf/lzjd-rs

在使用现有的Rust设施模拟 HKT(Higher-Kinded Types )上的尝试

属于研究范畴了,作者还有后续文章,请持续关注。

Read More: https://gist.github.com/edmundsmith/e09d5f473172066c0023ef84ee830cad

Kate 编辑器对 Rust rls 的支持已经落实了

Kate,对,就是原来 KDE 中的那个 Kate,现在已经在其主分支上支持了 Rust 的 rls。想尝鲜的可以下下来试一下。

Read More: https://kate-editor.org/post/2019-08-07-kate-initial-rust-lsp-support/

NRC 大佬的博客文章,对 tikv 的 futures 0.1 升到 0.3 过程的记录

之前推过,今天社区又比较关心,故再次推一下。

Read More: https://tikv.org/blog/client-futures/

fractals_rust - 生成分形渲染图

可以并行渲染,适合新手练习。

img

Repo:https://github.com/Smoltbob/fractals_rust

boggle-solver - 通过解决 boggle 问题来展示 crossbeam-deque

Boggle 游戏是一种找字游戏,说明在[这里](https://en.wikipedia.org/wiki/Boggle),作者通过尝试将多线程与 crossbeam-deque 配合使用实现了高性能的解题武器。

Repo: https://github.com/elfsternberg/boggle-solver

q 框架 - 通用队列自动机运行时实现

包含:

  • A event based Descrete Event Simulator(DES)
  • A Queue Network, consists of Servers(Operator), Queues(Communication Channel)

感觉已经超出了小编的认知了,谁能来讲一下?

比如,它可以对斐波拉契公式映射成下面这个:

Fib(n) = Add ( Fib(n -1 ) , Fib (n-2), Fib(0) = 0, Fib(1) = 1.

  cargo run -- 5
@0000000000 queue = []
@0000000005 queue = [1]
@0000000007 queue = [1, 1]
@0000000012 queue = [2]
@0000000013 queue = [2, 1]
@0000000015 queue = [3]
@0000000016 queue = [3, 0]
@0000000018 queue = [3]
@0000000018 queue = [3, 0]
@0000000019 queue = [3]
@0000000020 queue = [3, 1]
@0000000023 queue = [4]
@0000000023 queue = [4, 1]
@0000000024 queue = [5]
@0000000025 queue = [5, 0]
@0000000027 queue = [5]
@0000000027 queue = [5, 0]
@0000000028 queue = [5]
@0000000029 queue = [5, 0]
@0000000030 queue = [5, 0]
@0000000030 queue = [5, 0]
@0000000031 queue = [5]
Result 5


Repo: https://github.com/max6cn/q

「新手向」「视频」和借用检查器战斗实录

#BorrowChecker

主要是简单地使用scope(花括号块)来解决生命周期问题

Read More

cheats.rs 一个整洁的Rust备忘录

#rust

cheats.rs是一个Rust资料备忘录网站,记载了常见Rust知识点、文档、工具等等,有了它可以把一大堆书签删掉了。夜间模式下 Ferris 的眼神蠢萌蠢萌的。

Read More

【阅读】使用Rust开发NB-IOT设备

#iot

作者李立源介绍了他使用Rust、 STM32 Blue Pill 和 Apache 开发 NB-IoT 传感器的过程。

Read More

【工具】vulkan-tutorial-rs 编程语言练习工具

#rust

@timkofu 看完 The Book 后想找一个类似 pythonchallenge.com 网站,通过做一些编程练习学习 Rust,网友给他推荐了以下几个网站:

刚学 Rust 不知道该做些什么项目的同学可以看看,顺便推荐issuehub.com,可以用“rust + help wanted”来搜索Rust 相关的开源项目,帮助开源项目解决issue也是一种练习方式。

Read More

「SO问答」Rust中的128位整数如何在64位系统上工作?

#stackoverflow

问题:

Rust有128位整数,用数据类型i128表示(u128表示无符号整数):

let a:i128 = 170141183460469231731687303715884105727;

Rust如何使该i128值在64位系统上工作?它是如何做算术的?因为据我所知,这个值不能放在x86-64处理器的一个寄存器中。编译器是以某种方式为一个i128值使用两个寄存器,还是使用某种大整数结构来表示它们?

回答:

所有Rust的整数类型都编译为LLVM整数。LLVM允许1到2^23 - 1之间任意位宽的整数。LLVM指令通常处理任意大小的整数。

在LLVM IR级别,答案是:两者都不是。i128适合一个寄存器,就像其他单值类型一样。另一方面,一旦翻译成机器码,两者之间就没有什么区别,因为结构可以像整数一样分解成寄存器。然而,当进行算术运算时,将整个数装入两个寄存器是一个非常安全的选择。

*虽然我知道对大于128的大小和非2的幂的支持是不稳定的,并且实现可能有错误,这可能部分解释了为什么Rust只公开1、8、16、32、64和128位整数。

Read More

Rust vs GUI: Rust所有权对于GUI开发的影响

#GUI #GTK

本文通过一个简单的示例探讨了Rust所有权对GUI开发的影响。

结论:在构建GTK应用程序时,Rust带来了一些合理的权衡。但这并不意味着它没有代价。如果你决定使用Rust进行GTK应用程序开发,那么在开始设计自己的框架之前,你可能需要检查relm(Rust实现的,基于GTK+的仿elm框架)是否有更高级别的应用程序接口。

Rust 会在研究领域大展身手吗?

作者写了一篇文章来表达自己的见解。答案是:会。原文值得一看。

国内地址:https://docs.qq.com/doc/DQlBtWlBBbFNXeEt2

原文地址:https://medium.com/@me_26124/rust-reverses-research-ruin-88641c11a99f

通过 AVL 树来理解 Rust

AVL 树是一个自平衡二分查找树,以它的发明者 Adelson-Velsky and Landis 命名。这篇文章就通过使用 Rust 对 AVL 树的实现来深刻理解 Rust 中的主要概念。

国内地址:https://docs.qq.com/doc/DQmNmTWxOcWdpeHJK

原文地址:http://francismurillo.github.io/2019-07-31-Understanding-Rust-Through-AVL-Trees/

moveslice - 一个简单的库,用来对slice中的一部分进行移动

功能很简单,比如:

use moveslice::Moveslice;

let mut arr = [1,2,3,4,5,6,7,8,9];

// The following moves the slice 3..6 to index 1.
// In effect, it moves [4,5,6] over to where [2] is.
arr.moveslice(3..6, 1);
assert_eq!(arr, [1,4,5,6,2,3,7,8,9]);

Repo: https://github.com/Calmynt/moveslice

其实相关的评论很有价值,我这里整理出来,对于学习是非常好的一手实践材料。

国内地址在这里:https://docs.qq.com/doc/DQkJscUd0REhCZkdX

原文地址

Rust in Blockchain 七月总结

这个网页把在区块链领域中使用Rust的项目的最新进展做了一下汇总。感兴趣的可以看看。

https://rustinblockchain.org/2019/08/01/rust-in-blockchain-2-july-2019/

关于使用 Rust 实现 Matrix 协议的 Ruma 项目的视频讲解

Matrix 协议是一个分布式IM通信协议,Ruma 是它的 Rust 实现。作者开课了,下面是第一个视频讲解(感叹一句,老外开发者做工作真心踏实,在教育上投入了很多心血)。

地址在这里:https://youtu.be/76BE1P8B1UU

写给那些搞不懂代数效应的我们(翻译)

翻译题记: 昨天的Rust日报上刊登了一个实现了代数效应的Rust库,以及这篇文章的原版链接。 这是一篇通俗易懂的有趣文章,本文只是对其的粗略意译,并且省略了其中的链接(和表情包)。请有能力的朋友尽量前往原文围观。

地址在这里:https://zhuanlan.zhihu.com/p/76158581




ffi

「系列文章」在Rust中使用C库

#C #FFi

两篇文章介绍了如何绑定C库,并且将其抽象为安全的方法调用。

Part I: https://medium.com/dwelo-r-d/using-c-libraries-in-rust-13961948c72a Part II:https://medium.com/dwelo-r-d/wrapping-unsafe-c-libraries-in-rust-d75aeb283c65

artichoke: Rust实现的Ruby

#Ruby

兼容MRI。Artichoke core提供了一个与实现无关的Ruby运行时,任何实现都可以加载它。Artichoke core中的运行时将100%通过core和标准库Ruby规范。运行时将以Rust和Ruby的混合方式实现。Artichoke中的Regexp实现就是这种方法的一个典型例子。

Rust Image比Python Pillow更快吗?

作者在研究一个科学应用,有时需要在非常大的图像上面进行操作,在作者目前的Pyhton工作版本中,对于大图像的处理很慢,最后作者得出测试Rust要快很多。

Pillow/Python

~55 sec

Rust (image crate)

~56 sec

Rust (image crate), built with release tag

~2 sec

使用Python中的time模块和Linux for Rust上的time命令进行测量

Cosmic: 多功能discord机器人

#discord

该项目是从Python到Rust的一个重写项目

Repo: https://github.com/Sreyas-Sreelal/Cosmic

使用 Rust 实现类 Cairo 的库

Cairo 是一个 C 语言实现的 2D 图形渲染库,是大量平台的底层构件。那么是不是需要用 Rust 重新实现一个呢?

发现下面两个,可以直接到仓库中去查阅详细信息:




IoT

Jeff Hiner - 我们用 Rust 重写了我们的 IoT 平台,竟然成功了

这是一篇在 medium 上的文章,讲了作者一年前加入一个 IoT 公司后,逐渐引入了 Rust 来重写其 IoT 平台的经历和故事。包括手撸 mqtt 协议实现等。或许对犹豫是否在 IoT 中使用 Rust 带来一些借鉴意义。

这里https://docs.qq.com/doc/DQnFrd3pOVHd5ZktB是国内可访问版本。

这里https://medium.com/dwelo-r-d/we-rewrote-our-iot-platform-in-rust-and-got-away-with-it-2c8867c61b67是原文。




async

使用async/await构建高性能TCP客户端

#async #await #tcp

作者通过创建了一个TCP客户端的项目Clobber来体验将在1.39中稳定的Async/Await的功能,结论:体验非常好,非常期待Rust异步稳定之后,社区将会带来什么变化。

「系列文章」Rust中如何优化async/await Part I

#async

官方在稳定Rust异步async/await的过程中,解决了很多问题。其中之一是从异步到状态机的转换,目前不是最优的方法。所以,这导致状态变得比需要的大得多。由于状态大小实际上是超线性增长的,所以当状态大小增长超过正常系统线程的大小时,可能会触发实际栈上的栈溢出。

该文作者过去几个月主要是解决这个问题,他写下这篇文章来告诉大众该问题的优化过程。好事多磨。

async await 將在 1.38 版本穩定

大約4~6個月後吧

read more

Rocket 從同步轉到異步IO遷移問題

這篇文章記錄了 Rocket 轉換到異步IO的API設計與問題,

不過Rocket目前不stable,速度又遠慢於主流框架,

只希望Rocket再快一點,不然對不起Rocket的名字啊。

img

https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune&l=yyku7z-f

速度只有 actix 的1/20,還一大堆 error 。

read more

futures-async-stream - 实验性的流 API 语法

这个库方便基于现有的 async/await 语法使用一些标签来进行对于流的代码的处理,说起来比较拗口。直接上代码看,比如:

#![feature(async_await, stmt_expr_attributes, proc_macro_hygiene)]
use futures::prelude::*;
use futures_async_stream::for_await;

async fn collect(stream: impl Stream<Item = i32>) -> Vec<i32> {
    let mut vec = Vec::new();
    #[for_await]
    for value in stream {
        vec.push(value);
    }
    vec
}

#![feature(async_await, generators)]
use futures::prelude::*;
use futures_async_stream::async_stream;

// Returns a stream of i32
#[async_stream(item = i32)]
async fn foo(stream: impl Stream<Item = String>) {
    // `for_await` is built into `async_stream`. If you use `for_await` only in `async_stream`, there is no need to import `for_await`.
    #[for_await]
    for x in stream {
        yield x.parse().unwrap();
    }
}

库在这里:https://github.com/taiki-e/futures-async-stream




story

Linux 未來可以使用 Rust 開發內核

Josh Triplett (Linux主要開發者之一)在一次的演講提到了Rust的可能性,

但他強調他不是要大家一定要使用Rust,他只是覺得Rust可以給Linux帶來更多可能性,

Josh也跟Greg Kroah-Hartman(Linux主要開發者之一)談過,Greg說他願意接受內核中用於在Rust中編寫驅動程序的框架

  1. 現在Rust默認沒有啟用即使你做了“make” "allyesconfig" 這樣人們就不需要安裝Rust來構建內核,
  2. 它顯示了除了編寫C之外的真正好處,例如安全的內核API。

看來大家在未來有很大的機會可以使用Rust來編寫Linux Kernel。

Read more

ts-results - Rust 对 Typescript 的影响之一,Result

Typescript 的 Result 实现,完全借鉴自 Rust。

Repo: https://github.com/vultix/ts-results

北京Rust线下读书会,第一次举办

以下是现场图片,大家感受一下气氛,最后一张图片是东哥用脑图梳理的知识点 mhpC7R.jpgmhpiA1.jpgmhpkh6.jpg mhp9B9.jpg

RustConf 2019

RustConf 2019,在8月22日-8月23日期间,在美国波特兰举办的第四届Rust活动,它的活动主页 RustConf 2019

400多位世界顶级Rust开发人员汇聚于此。第一天是由Rust社区领导者进行的专业知识培训与主题探讨,第二天是核心团队成员及社区主要贡献者的主题演讲及特色演讲。上两张图,大家感受下:

RustConf 2019 RustConf 2019

C2Rust

一個把C code轉換成 rust code的小程式,現在可以用cargo 下載安裝。

簡單的程式還可以,有用到動態指標動態載入的庫就爆了。

小編自己的感覺是玩具等級不怎麼實用。

Read more

Rust Fuzzing獎勵計劃

獎勵:500美金

如何獲得獎勵?您需要將Fuzzit與Go語言或Rust語言項目集成,星星超過1.5k。

其它細節請看原文。

Read more

Shellac(redox 作業系統下的shell) 自動完成所需時間在 1ms 以下

相信大家用linux 常常會遇到按tab,然後terminal卡住的經驗。

現在shellac解決了這個問題,

實作上就是盡量在使用者打出字來之後

依據當前打出來的字來做分支預測

在演算法上有命令分支爆破的問題

命令常有可選的選項,並且可以按任何順序放置。實際上,這意味著要測試的潛在分支的數量會爆炸。例如,帶有opt1,opt2和opt3的binary [options] 只能出現一次,需要轉換為 | opt1 | opt2 | opt3 | opt1 opt2 | opt1 opt3 | opt2 opt1 | opt2 opt3 | opt3 opt1 | opt3 opt2 | ...,如果沒有採取任何措施來規避問題,將導致性能下降。

解決方案是使預測分支線程都攜帶一組計數器。每個測試操作都能夠檢查和更新線程的計數器。這樣,opt1,opt2和opt3都可以擁有自己的計數器,16個分支可以減少到(opt1 | opt2 | opt3)*,只有4個(每個選項1個,循環1次)。

但這是完整參數匹配。 但是這對於分組參數不起作用(例如GNU樣式二進製文件,其中-a -b -c可以縮短為-abc)

解決方案是先匹配已有的組合。 例如,短參數定義為/ - ([a-z])+ /,並且根據有效選項集檢查每個捕獲的字符。 這樣可以輕鬆定義分組參數,而不會失去一般性。

目前團隊希望討論出好的shell-shellac協議,因為每種shell都會根據自己的假設實現自己的解析器,他們希望做一個統一好用的介面以保持向後兼容。

Read more

ICFP 2019編程競賽 團隊使用Rust贏得第一

閃電回合

  • 用C++, Haskell 是最快的

評審獎

  • Sound! TypeSystem
  • 他們使用多種語言協同 Rust, C++, Python, JavaScript, and Go

完整比賽

  • 第一名 Unagi 使用 rust
  • 第二名 CowDay 使用 C++

比的是 Bit Rotting Problem

對於給定的地圖,給出一個覆蓋整個表面的移動軌跡,同時盡可能走最少步

  • 油漆工有三個機械手
  • 它可以向四個方向移動 (但不是透過牆壁)。
  • 油漆工可以轉身
  • 機械手可折疊展開地圖的狹窄部分。
  • 附加一個額外的機器人手,擴大其範圍
  • 油漆工可以開一次兩倍加速,持續50步。
  • 油漆工可以製作隧道牆壁和障礙一次,持續30步。

比賽時間 72小時

Read more

polsim - 物理偏振模拟库

作者的物理学PhD论文是关于偏振研究的,他写了一个库来进行模拟计算。这个库也可以算作是小规模科学计算的尝试。

作者的心路历程在这里:https://tinkering.xyz/polsim/

祭图镇楼:

img

Repo: https://github.com/zmitchell/polsim

https://github.com/zmitchell/polarization

Mozilla 万字长文:WebAssembly Interface Types - 万物互操(作)

mozilla 的工程师太激进了。这次由美女工程师 Lin Clark 写一一篇万字长文,设想并描述了一个新的中间组件:WebAssembly Interface Types。这个东西一时半会儿讲不清,我上三张图大家一下就明白了:

远古时代

img

近代

img

未来

img

容小编来瓶雪碧压压惊。

万字长文,强烈推荐。

Read More: https://hacks.mozilla.org/2019/08/webassembly-interface-types/

Raph Levien 在 Rust 膨胀上的思考

Raph Levien 就是 Google 那位 Xi Editor 的主要作者。据小编观察,这是一位很有思想的人。

最近他决定接收一个 pr,这个pr(与国际化/本地化相关) 会使编译时间增加 3 倍,编译后的大小增加 2 倍。他说,一个编辑器没有国际化本地化的话,就是一个玩具,所以他必须接受这个pr。但是接受这个 pr 的代价,让他心生不悦。于是,开始了哲学思考。

这个问题其实我们经常会碰到。强烈建议阅读一下作者的思考,也许会对你有所启发。

Read More: https://raphlinus.github.io/rust/2019/08/21/rust-bloat.html

sgrif 发起的关于美国经济制裁对 Rust 和 crates.io 影响的一些讨论

我觉得对我们还是有用的,可以关注一下。

Read More: https://internals.rust-lang.org/t/update-on-rust-crates-io-and-us-economic-sanctions/10834

性能测评: C vs Rust vs Go

#Go #C #performance

基于问题:对于给定的图像,在图像中找到流行的颜色,这样用户就可以根据它的颜色来浏览图像。

使用算法:histogram

最终测试结果:

C    14s
Rust 21s
Go   34s

结论:在实现高效算法方面,Rust似乎处于最佳状态。它不会在抽象之中隐藏任何东西,你仍然可以像Go一样高效开发。

「官方」Rust编译器团队活动页

#CompilerTeam

该网站记录了Rust官方编译器团队的一些活动记录、文档、会议等信息,感兴趣的可以关注。

Read More: https://rust-lang.github.io/compiler-team/

Facebook内部meetup流出:Rust如何走进Facebook

#rust

Chaos: 今天刚看到Facebook内部meetup流出的Slides,原文标题很有意思:Bringing Rust Home to Meet the Parents (带Rust去见父母)。该分享主要是讲了Facebook引入Rust的过程,我也没有看过Meetup的内容,只是想通过Slides来解读并还原一下Facebook引入Rust的历程。https://zhuanlan.zhihu.com/p/78549374

Read More

Grand Star v0.6.0

任天堂也用Rust了。這是任天堂的 rust tool chain跟庫的集合

這些庫還不成熟,還在開發中,非常需要有時間的人幫忙開發

歡迎大家的加入

Reddit讨论:CppCon 2017 - 在Facebook上反复出现的 C++ bug

#Facebook

该贴主提到,他看了Facebook工程总监在CppCon 2017的分享,其中谈到Facebook中经常出现的Bug,他认为,这些Bug是用Safe Rust完全不会写出来的Bug。

以下是这些bug的概述:

  • Bug #1: 越界访问。C++的std::vector的索引运算符不进行边界检查。演讲者称之为“可能是每个代码库中问题的最大原因”。Rust's Vec总是进行边界检查,除非您使用Unsafe。
  • Bug #2: 如果你搜索的关键字不在map中,那么std::map的索引运算符将创建一个默认元素。真奇怪。Facebook发生了两起重大事故,Map显示了一些设置,打印设置时偷偷插入了值为0的新设置。Rust的哈希映射不可能做到这一点。要在Rust中获得这样的行为,您必须使用entry() API对其进行显式编程。
  • Bug #3: 试图避免不必要的复制通常会导致对已经不存在的临时成员的引用(悬垂指针)。C++没有借用检查器来检测这一点。Rust会。
  • Bug 4: volatile。它不会使代码线程安全,但是人们还是这样使用它。Safe Rust根本没有volatile。
  • Bug 5: std::shared_ptr线程安全吗?是像Rc还是像Arc?嗯,这很复杂。它很像Arc,但是如果你实际上在多线程环境中使用它,你仍然有可能出错。Rust既有rc又有Arc,它会阻止你将Rc发送到不同的线程。
  • 赠送的Bug : 人们经常解引用std::shared_ptr,并在不保留std::shared_ptr的情况下对结果进行引用。Rust的借用检查在这里拦住你。
  • Bug #6: 由于C++语法中的一个怪癖,很容易编写看起来像std::mutex的代码,但是实际上它正在创建一个与std::mutex同名的std::unique_lock,隐藏它但不锁定它。这里真正的问题是,在C++中,std::mutex没有连接到它所保护的数据,而在Rust中,如果不锁定它,就根本不可能访问受Mutex<T>保护的数据。
  • 附送的Bug : 在C++中,很容易意外地对事物进行深度复制(Clone)。演讲者和听众中的一个人理所当然地指出,这真的没什么大不了的,事实上,许多bug(见bug #3)都是通过避免不必要的拷贝而引入的。尽管如此,Rust在这里对你也有帮助,因为如果你想克隆一些东西,你通常需要显式地做。
  • 附送的又一个bug:“我们有很多与异步编程相关的生命周期问题,”演讲者说。他称之为“非常关键”和“最重要的缺陷之一”。如果说Rust擅长什么,那就是“与异步编程相关的生命周期问题”。

演讲中从未提到Rust,但如果里面提到Rust的话,该演讲就是Rust最好的广告了 :D

(Libra 选择 Rust,某种意义上,可能也是苦C++久矣)

哪些软件应用值得用Rust重写?

#rust

Rust安全、高性能等优点吸引到很多优秀的开发者和公司将原有项目的部分或全部用它重写,下面是知乎上关于该问题的回答,如果你有重写的经验和想法,欢迎分享。

CPU+内存密集型的应用,比如数据压缩领域的gzip、bzip2、xz 等等。我已经把自己的数据压缩应用orz用rust重写了(https://github.com/richox/orz),整体上来看,当前的rust性能已经完全匹敌c/c++,而且开发过程释放了大量脑力,涉及到对内存精细操作的地方不再需要像c/c++那样心惊胆战,也不需要处理c++的长篇编译错误,编译通过基本上就不会再出异常了。这个项目可以做为rust性能的一个实战验证,目前压缩速度快于gzip、压缩率高于bzip2,在整个压缩领域已经处于pareto frontier 的位置了。 ——知乎作者 鱼你太美

类似OpenSSL这样的基础软件,几乎已经成了事实上的标准,大家都在用都依赖,堆积了差不多20多年的C代码,据说里面各种古怪的旧代码,奇怪的东西。其实可以考虑重写了的。不过假如重写了之后,原来的攒了20年的OpenSSL的兼容性应该是会丢了,也就不是OpenSSL了。其实以Rust写的目标是替换或者兼容OpenSSL的项目是有的,而且在慢慢的发展。这种东西不是一天两天能完成替换或者取代的。 ——知乎作者 杨小小小小小明

推荐阅读知乎上另一个讨论【如何看待Rust应用前景?】

Read More

十年Cpp程序员学了三个月Rust之后的感想

#cpp

文章不长,用作者的话来总结:与其把Rust看作是一门语言,倒不如将其看作是一个生态系统。他对Rust这个生态系统未来的成长感到非常excited。

  • Facebook用Rust写区块链: Libra
  • Goolge用Rust写操作系统: Fuchsia
  • 亚马逊用Rust写虚拟化技术: FireCracker
  • 微软推,崇业界都应该使用Rust语言。

看见了吗? 四大巨头的未来主要核心业务都交给或准备交给Rust了。

这也是这个10年Cpp程序员开始学习Rust的原因:未来。

Read More: https://blog.aclysma.com/my-first-three-months-with-rust/

「社区」Rust游戏工作组的调查

#Game

Rust游戏工作组是社区自愿发起的一个组织,这次他们发起调查,是为了更好地支持Rust游戏开发生态,游戏开发者们可以去参与。

Read More: https://users.rust-lang.org/t/survey-from-the-rust-game-development-working-group/31270?u=erlend_sh

stubborn-io: 对tokio的AsyncWrite/AsyncRead进行了包装

#tokio

Docs: https://docs.rs/stubborn-io/0.1.3/stubborn_io/

PodCast:采访Jimmy Cuadra

#podcast

话题关于Matrix,一个开放和分散的通信协议,以及他在Rust中的实现Ruma。该作者之前也出了视频课程,地址在这里:https://youtu.be/76BE1P8B1UU

C++工程师的Rust迁移之道 组合与集成

#rust

知乎专栏C++工程师的Rust迁移之道继承与组合部分第二篇更新。

C++中的多态面临的问题

  1. 在使用静态派发时,由于完全依赖重载,当编写对应的代码时,很难保证你的类完整实现了调用代码的要求,再加上了深度模版的使用,导致出错信息非常难以阅读;为了解决这个问题C++标准委员会在C++ 20标准中加入了concepts的概念,它可以显式的提出约束,使用的例子可以参见上一篇文章 https://zhuanlan.zhihu.com/p/75755125,而更多的信息,大家可以参见cppreference[2];

  2. 在使用动态派发时,由于vptr存在,它会破坏对象本身的内存结构,当你的对象还需要与其他库(特别是C语言编写的库)进行交互的时候,内存结构就会称为一个显著的问题;

  3. 由于C++是一个非常成熟的语言,而concept又是在下一个标准中才会加入进来的概念,所以对于静态派发和动态派发的约束是完全不一样的语法,而且对于同样的约束,如果我们需要同时使用静态和动态派发的话,必须写两遍(一遍虚基类,一遍concepts)。

对于上述提到的3个问题,在Rust中有一个统一的解决方案,那就是trait系统, 更多内容请看正文。

Read More

号外:Rust同城读书学习会

Chaos (汉东)今天发起了一项线下活动。如下:

为了帮助大家更好的学习Rust,我发起了一个「Rust同城读书学习会」,规则如下:

  1. 首先,当地城市需要有人牵头来组织。牵头人找Chaos(汉东)报道。
  2. Topic可以自由选择,但是主要是学习为目的。
  3. 为了避免每周的交流缺乏Topic,可以选择《Rust编程之道》或官方的Rust Book等书籍,以每周一章的学习,作为保留学习项目。如果组织者有其他学习项目,也欢迎分享。
  4. 每个城市的读书学习会,并不是孤立的,而是由Rust日报和论坛组来帮助大家分享每周的学习心得。
  5. 每个同城群邀请Chaos(汉东)驻场,作为观察者,来对大家的学习状态进行观察和报道。当然,谁想作为观察者也可以报名。
  6. 本着公平自愿原则,完全自愿组织参加。

目前北京回龙观群友已经在策划这样的活动,先尝试一段时间看看。想要参与此活动(Rust同城读书学习会)的,请与 Chaos(QQ号:247026628)联系。

注意:

读书会属于特定主题的线下学习型组织,特点:

主题专一(至少某个阶段)/ 每周学习/ 学习报告/ 全员产出

这点有别于线下Meetup组织,感兴趣者加入。

号外:Rust.cc中文社区开始组织全国性的线下分部,寻觅组织者

随着 Rust 蓬勃发展,全国各城市对 Rust 线下 Meetup 的呼声越来越强烈。之前在北京、上海、杭州、成都等地都陆续有一些活动。现在,Rust.cc社区准备把这件事情提上日程,呼吁在全国各城市建立起这样一个个(松散的)Rust线下Meetup组织。有兴趣参与或组织的同学,请与我联系:Mike wx: daogangtang, qq 624910278,全凭志愿。

现在已经有如下城市的QQ群/微信群:

  • 北京
  • 上海
  • 成都
  • 深圳
  • 南京
  • 武汉
  • 广州

想要加入的,请与Mike联系,同时期待更多的城市建立进来。让我们看到 Rust 星星之火燎原之势。

「讨论」Rust的安全性

#security

今天的讨论有两个主题,第一个是关于在Safe Rust中绕过借用检查的一个问题,第二个是关于Libra区块链依赖Rust单一语言而引起的安全性讨论。

一、Safe Rust中绕过借用检查:

几天前(2019 年 7 月 27 日)一位用户将 Rust issue #25860 Implied bounds on nested references + variance = soundness hole 中的用例上传到了 crates.io(fake-static)。意在使大家注意到这个在此之前已经超过两年没有动静的 issue。这使我了解到原来目前的 Rust 实现还在一些边角存在着可怕的缺陷。以致于在安全 Rust 中通过精心构造的数行代码便能绕过借用检查,正如 issue 中的用例:

static UNIT: &'static &'static () = &&();

fn foo<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }

fn bad<'a, T>(x: &'a T) -> &'static T {
    let f: fn(_, &'a T) -> &'static T = foo;
    f(UNIT, x)
}

二、在今天某微信社区的一次区块链安全的分享中,提到Libra

墨子安全实验室创始人 苗知秋 谈到Libra选择Rust:

在实现语言上,Libra项目选择了一个非常小众但宣称安全性突出的语言RUST。然而,宣称的安全不表示实际上的安全。过于小众的语言往往缺乏长时间的锤炼,导致隐藏的问题较多。再安全的语言也无法确保实现的安全,漏洞常常来自代码实现过程,来自于人。RUST社区也在讨论随机数生成函数的安全升级。所以RUST语言虽然具有安全的特色,但是并不完美,不排除有可能成为Libra项目的阿喀琉斯之踵。 最后,过于依赖RUST语言有可能带来单一性依赖问题,如果RUST语言出现安全问题,则会波及整个Libra系统,这一点可能需要时间来解决,毕竟Libra出现时间尚短,需要时间来实现必要的多样化部署。

日报君(Chaos)发出质疑:

不过话说回来,有一点我不太同意。安全漏洞比例最大的是内存安全问题,(见微软安全响应中心的文章,70%的安全漏洞是内存问题引起的)。而Rust语言的安全性恰恰就是解决内存安全(常见的内存安全问题,当然不完美,也不可能完美)。内存漏洞是跨语言漏洞,多用一种语言就多一份风险,其实并不能改善安全性。

苗知秋回复:

这是一种经典的安全防护思路,安全问题必须从整体上考虑,不能只看局部。区块链作为去中心化的P2P架构,不怕部分节点出问题,担心的是全部节点出问题。因此如果单一使用rust语言实现,谁敢打包票说rust万寿无疆、刀枪不入?万一某天rust爆出系统性漏洞,Libra就全军覆没了。因此为了实现系统级的安全,必须要把风险分散。如果所有的rust部署节点出问题,在解决rust问题期间Go语言节点还可以支撑系统运行,Go语言出问题,在解决Go语言问题期间Java节点也可以让系统正常运行。那么如果rust,go,java同时出问题呢?概率比rust一个出问题的概率小多了啊,这就叫千斤重担万人挑,人人头上有指标[呲牙]

小结: 从安全角度来看,苗知秋的观点是有一定道理的。这可能也是以太坊多语言实现的一个原因。

关于以上两个讨论,大家怎么看呢?

「讨论」为什么Rust突然被广泛使用?

#Reddit

为什么Rust突然被Facebook、微软等广泛推崇? 下面一个评论总结的很到位:当「工程质量」高于一切的时候,选择Rust是自然而然的事。

Reddit讨论

Rustsim 报告 #7

#rustsim

Rustsim组织是一个GitHub组织,聚焦于提供各种数值模拟的库。包括

  • alga, 抽象代数库
  • nalgebra, 线性代数库
  • ncollide, 2D和3D的碰撞检测库
  • nphysics, 2D和3D的物理模拟库

最新报告称:

  • nphysics 0.12 已经支持了连续碰撞检测
  • ncollision 0.20 对非线性冲击时间计算和Pipeline进行了重构

Read More

当你没时间维护自己的crate时,最好的善后方法是什么呢?

#crate

这个帖子给出了一个办法,就是把它交给Rust Bus组织(社区义务者),该组织会帮你管理crate。倒也是个不错的办法。

【讨论】Rust是否比C++更能提升开发人员生产力

rust

作者认为Rust很有吸引力,但比较两门程序语言是困难的。虽然增长、性能和安全优势等指标是一回事,但长期来说开发人员的工作效率对于他们衡量或研究来说是一个更难的指标,因此作者想在社区中听到大家的声音。

目前讨论中觉得Rust能提能提高生产力的地方是:

1.cargo及其生态,开发过程中基本你能找到所有想用的库,可以方便的进行测试和编译,C++缺少这样方便的工作流工具。 2.Rust 能更早的将代码中的问题暴露出来,而不是等着编译时,这样能节省很多时间。 3.用来验证内存安全的时间变少了。

貌似讨论区更多的是在夸Rust,更多讨论请点击下面链接。

Read More

nphysics的未来:纯Rust的2D和3D实时物理引擎

#physics #game #Rustsim

作者在本文中探到了Nphysics将来的愿景,是做一个性能水平可与现有流行的C++开源物理引擎(如Box2D和Bullet Physics)相媲美的Rust实时物理引擎。

该库现在属于Rustsim组织。

Read More

用epochs修复c++

#cpp

有人写了篇文章,呼吁Cpp也学Rust那样引入Epochs。

想象一下,你已经设计了一种编程语言超过30年,并且它逐渐在全球广泛使用。你在开始时所做的一些决定非常出色,并为你的项目的成功做出了贡献。然而,还有一些不是最好的:多年来,你和你的用户意识到,如果你多年前所做的选择略有不同的话,这个世界会变得更好。 你不断发展你的语言,增加有用的功能,并使它跟上竞争的步伐。然而,糟糕的选择和旧的(现在已经过时的)结构仍然挥之不去。 你试着删除语言中最危险和最少使用的部分,虽然他们的删除非常成功,但是一些用户无疑会受到它的阻碍。对于更受欢迎的构造,您尝试不赞成:社区的大部分人欢迎它并迁移它们的代码库,而另一个人发现实现一致性所需的工作要么大得不合理,要么由于遗留依赖关系或许可问题而不可能。 除非你偶然发现这篇文章,否则似乎没有出路。它的作者提出了一个不可思议的主张: 如果我告诉你,我可以解决你所有的问题呢?更好的是,如果我告诉你向后兼容性永远不会被打破,并且可以自动迁移到你的语言的更新版本呢? 此时,你立即认为这家伙一定是疯了。然后他说... 而且,已经有人做了。而且奏效了。 现在你感兴趣了。

这篇文章的Rddit讨论贴里有人说:这就是我为什么学习Rust的原因,Cpp那帮人是不会同意的。

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

#rust

知乎网友@黄珏珅开设了本专栏,主要针对对 Rust 感兴趣的 C++ 工程师,介绍了完成相同任务 C++ 和 Rust 中的异同,感兴趣可以专注专栏。本周第三篇文章出炉。

Read More

是什么让 python 开发者在找不到 Rust 相关工作时还要学它?

#rust

Owen Synge 在 DebConf 上的演讲,他介绍了 python 在他开发中的应用场景,以及他为什么没有选择 C/C++ 而选择了 Rust。

Read More

想要改变世界的 Rust 语言

Read More

Actix - 公開邀請新的領導與貢獻者

作者fafhrd91表達了未來他沒辨法再花費那麼多時間維護 actix,

希望有大佬能夠繼續改善維護。

我個人是希望會有商業版本出來,讓品質更穩定也有商業支援可以使用。

read more

「系列文章」用Rust重写物联网网关 Part 2: 饮鸩止渴:为什么我们不用C++重写IoT应用

#IoT

标题为:「Abusing Fire for Light - Why we didn’t rewrite our IoT app in C++」,翻译过来就是: 「饮鸩止渴:为什么我们不用C++重写IoT应用」

文章里这个类比比较经典(普罗米修斯盗了天火,为世界带来了光明,但与此同时也带来了灾难):

我们本可以用C++重写我们的物联网平台应用。使用C就像用蜡烛照明一样。它的基本属性是众所周知的,它从文明之初就存在了,如果你滥用它,它会让你周围的房子着火。(在这个比喻中,C++将是“所有可以被点燃产生光的东西的集合”。)

该文的作者是智能家居系统公司Dwelo的IoT工程师,该文主要罗列了一些Cpp编写嵌入式应用可能拥有的问题。




game

rg3d,3D游戏引擎

Rust 编写 3D 游戏引擎。它包含的功能:

  • FBX Loader(ASCII和二进制)
  • TTF字体加载器
  • 延迟着色渲染器(基于OpenGL 3.3 Core)
  • ...

由于其 API 未稳定,该引擎还没有在crates.io上发布。

space_shooter_rs - 用来演示 Amethyst 游戏框架的又一个游戏:打飞机

打飞机!

img

效果还行吧!

Repo: https://github.com/amethyst/space_shooter_rs/

Rust游戏开发工作组(非官方)发布第一个提案

在之前的日报中,提到新成立的Rust游戏开发工作组(非官方),该工作组正在努力更好地了解生态系统的状况。

其第一个提案正在进行中,可以提供反馈!Github issue

介绍Glam和Mathbench

#linear #algebra

glam是一个用于游戏和图形的简单快速Rust线性代数库。mathbench是一组单元测试和基准测试。性能相比于cgmath和nalgebra,有一定的优势。并且有SIMD支持。

Rust游戏开发工作组成立了!

Rust将底层控制,卓越性能和现代构建工具相结合,使其成为游戏开发人员的一个令人兴奋的选择。 多年来,多次提出了一个支持这个新兴社区的工作组的想法,我们很高兴地宣布,一个团队终于成立了! 我们的章程列出了两个主要目标:

  • 改善Rust游戏开发者的体验。
  • 为不是游戏引擎开发人员的人分享更多的知识降低他们的上手难度

原文文章:https://rust-gamedev.github.io/2019/08/18/introducing-the-rust-game-development-working-group

boggle-solver:Boggle游戏的Rust实现

#crossbeam

Boggle是一款受欢迎的益智拼字游戏,作者用Rust来实现了它,作者主要是想练手crossbeam,因为他最近找工作的时候碰到的白板手写代码就是这个Boggle Slover。

boggle-solver

veloren: 一个类似于我的世界的游戏发布了0.3版本

#game




web

Rust全栈开发Web应用

Brian St. Pierre编写的 Introduction to Rust Web Applications

一个快速且简单的指南,使用 Rust 全栈开发 Web 应用:

  • Diesel 作为 ORM
  • Rocket 作为 Web 框架,
  • Seed 作为 [WebAssembly] 前端

actix-raft: 基于actix框架实现的raft库

#raft

Raft是一种分布式共识协议。该作者的目标也是想做分布式数据库。

Repo: https://github.com/railgun-rs/actix-raft

awmp:用于在actix-web中处理文件上传

#actix #multipart

是对actix-multipart的包装,方便使用

Repo: https://crates.io/crates/awmp

Polaris:一个用Rust编写的web音乐播放器

#music #web

img

Polaris




blockchain

slingshot : 一个新的区块链框架

#blockchain

stellar公司出品。wow,挖掘出一点点关于Rust之父的秘史,不知道大家是否知道:Rust之父Graydon Hoare在2014年加入过这家公司作为核心团队成员(当然现在不在了),可以看下面的Stellar Report 2014。




wasm

Wasmtime 在 WebAssembly & WASI上運行的容量小速度快的執行 runtime

可以讓 php, node js, rust, c++ 直接執行wasm的一個runtime

影片裡用 markdown 的庫展現了 wasmtime 的可能性

從四種語言語言呼叫 wasm 裡編譯好的函數,非常方便

Read more

Lumen:針對WebAssembly的Erlang VM

使用rust nightly

功能包括 Compiler 與 Runtime

開發Lumen的主要動機是將基於BEAM的應用程序(即用Elixir,Erlang,LFE,Alpaca等編寫的程式)編譯成WebAssembly模塊

原因是官方BEAM的實現與WebAssembly的現有技術不兼容,就是Emscripten編譯C / C ++程式的這部份

一個問題是WebAssembly中運行VM執行bytecode會產生不小的開銷(BEAM bytecode由BEAM VM解釋,BEAM VM作為WASM執行,它被瀏覽器WebAssembly引擎編譯執行)。

這也要求每個BEAM模塊要能讓能夠從瀏覽器執行並由VM加載。即使BEAM VM可以直接編譯為WASM,這些問題也沒有簡單的解決方案。

Lumen的BEAM bytecode是用AOT執行,而不是在JIT。這避免了BEAM bytecode的膨脹,產生出的WASM模塊可以直接加載,並且沒有JIT的runtime 開銷。

postgres-ext-wasm - 在 Postgres 中运行 WebAssembly

Wasmer 那帮人真的是疯狂,在我们都还在畅想 wasm 的应用场景的时候,他们已经将 wasm 塞进了 postgres。postgres-ext-wasm 是一个 pg 扩展,用来执行 wasm 二进制文件。

目测,项目想法是想用任何语言完成之前只有 PL/pgSQL 才能完成的事情!文章中就用 Rust 写了一个例子展示,不过目前只支持 + 法。

小编觉得 pg 这个智慧的结晶,真的值得好好挖掘一下的。

Repo: https://github.com/wasmerio/postgres-ext-wasm

wasm-pack - wasm工作流程工具

该工具旨在成为构建和使用Rust的WebAssembly的一站式商店, wasm-pack可以帮助您构建Rust的WebAssembly包,您可以将它们发布到npm仓库或者与您已经使用的工作流中的任何javascript包一起使用,例如webpack或greenkeeper。

wasm-pack

仓库地址:https://github.com/rustwasm/wasm-pack

intersection-wasm 一个网格和三角形相交检测库

#rustwasm

作者用rust实现了mesh-mesh和triangle-triangle的相交检测的库,目前只有两个API。

Repo

一个Yew使用react组件的示例

#react #yew #wasm

Repo: https://github.com/hobofan/yew-react-example

Rust开发的Adobe Flash Player 模拟器

#rust

@Herschel使用Rust+Wasm开发的 Flash Player模拟器。

Read More

Yew v0.8

  • 現在html <div class="marker" /> 可以使用/>來對tag做描述,
  • 現在 SVG 命名空間可以使用
  • Properties 可以被整合編譯

詳細請看 changelog

read more

wasm-astar rust+wasm实现的迷宫

#rustwasm

日报曾经发过这个项目,后来发现作者开发过程中的一些疑问都得到了回答,推荐给正在用rust开发wasm项目的小伙伴看看。

Read More

blurHash rust+wasm实现的blurhash算法

#rustwasm

blurhash可以将编码后的图像数据通过canvasContext2D.putImageData绘制在canvas画布上。目前该项目还未完成,希望以后能加上benchmark。

import * as blurhash from "blurhash-wasm";

// Returned as Uint8Array | undefined
// You can use this to construct canvas-compatible resources
const pixels = blurhash.decode("LKO2?U%2Tw=w]~RBVZRi};RPxuwH", WIDTH, HEIGHT);
if (pixels) {
	// Set the pixels to the canvas
	const asClamped = new Uint8ClampedArray(pixels);
	const imageData = new ImageData(asClamped, WIDTH, HEIGHT);
	const ctx = canvasEl.getContext('2d');
	ctx.putImageData(imageData, 0, 0);	 
}

Read More

wapm —— WebAssembly 包管理工具

#wasm

wasm 是一个WebAssembly 包管理工具,可以安装、管理、发布WebAssembly项目。

Read More

可以将任何文件进行Hash然后生成一个甜甜圈图案

#wasm

由Rust和Wasm实现




async

Libra 中使用 async/await 的心路历程

Libra 核心开发者 bmwill,在 libra 的论坛上总结了这篇帖子,讲了为什么在 libra 中直接上 async/await 的心路历程:缘由,过程,体会,仍然存在的不足。

强烈推荐看原文。

Read More: https://community.libra.org/t/async-await-in-libra-core/1566

「官方」async_await将在Rust 1.39稳定版中发布

#async #await #stable

目前,相关的PR已被合并。

Read More: https://github.com/rust-lang/rust/pull/63209#issuecomment-523113079

宣告:async-std 异步标准库的测试版

#async_std

并打算在2019年9月26日前发布1.0版。该库附带了一本书和完善的应用编程接口文档,并将很快提供一个稳定的接口来支持异步库和应用程序。

虽然我们在1.0版本之前没有承诺过应用编程接口的稳定性,但是我们也不期望做出任何突破性的改变。

该库由Rust异步生态系统工作组成员 stjepang 开发,他也是crossbeam的主要开发者,同时也供职于Rust咨询公司Ferrous Systems。

返回一个具有占位符值的Future,以便在future尚未完成时能够使用它

举一个现实世界的例子: 当你去一些快餐店时,一旦你订购,你会得到一张餐券(占位符),一旦你的用餐准备好,你就可以得到实际的食物(future)。

使用占位符来热reload资产和代币:

struct HotReload<T> {
    current: T,
    updates: Pin<Box<dyn Stream<Item = T>>>,
}

impl HotReload<T> {
    fn get(&mut self) -> &T {
        while let Poll::Ready(Some(value)) = self.updates.as_mut().poll(&mut noop_context()) {
            self.current = value;
        }
        &self.current
    }
}

read more

async-rs 在重写异步标准库

#async

async-rs组织今日发布了一篇博客,介绍了他们开发的 async-std beta版本,下面是标准库读文件和async-std读取文件的代码示例对比,热泪盈眶呀!

标准库异步标准库

Read More

async-stream: 提供了stream!宏方便编写异步流

#async #stream #tokio

Repo: https://github.com/tokio-rs/async-stream

「Rust异步之书」中文翻译

#async #book

感谢 @huangjj的分享

Read More




Embedded

用Rust编写gdbserver替代方案

用于Rust的GDB远程串行协议服务器,该项目旨在搭建一个简单的GDB服务器,能够运行在Rust重写的x86_64体系结构上运行的Linux和Redox。

Redox OS内部机制还没有实现,但是一旦Linux运行起来它应该很容易。

一个用Rust编写的gdbserver替代方案半成品

使用vscode可视化Rust嵌入式开发

#rust

@ly.lee介绍了他使用vscode开发的可视化嵌入式开发程序的经验。只需要安装一个插件,即可在vscode中通过拖动Block,生成嵌入式开发的代码。

Read More

百度x-lab发布了一个用Rust编写Linux内核模块的框架

#rust

Linux驱动的嵌入式或物联网系统上的设备驱动程序在内核空间中执行,因此必须完全受信任。 驱动程序中的任何错误都可能会对整个系 但是,第三方嵌入式硬件制造商通常会使用其嵌入式设备发布其专有设备驱动程序。 由于缺乏代码审计,这些树外设备驱动程序通常质量较差。

因此他们提出了一种方法,可以帮助第三方开发人员在不修改内核的情况下提高设备驱动程序的可靠性和安全性:使用名为Rust的内存安全编程语言重写设备驱动程序。

Read More




GUI

Rust GUI生态系统“测评报告”

这是Sylvain Kerkour关于Rust GUI生态系统的概述。他,为Bloom(Rust中的免费和开源Google)构建桌面应用程序,在查找有关目前Rust最佳GUI选项的信息时,他没有发现任何令人信服/足够的争论,所以他做了自己的研究。

他基于各种条件,测试了很多框架(Qt,Electron,Gtk ...)。详细信息,排名和代码示例参见:Gitlab

moxie,Rust编写的轻量级平台无关的UI运行时

moxie,是一个用Rust编写的轻量级平台无关的UI运行时,它支持强类型的声明性编程风格,具有最小的交互延迟。

moxie旨在通过手动管理有状态,可变对象的图形,顺利地弥合无状态工具和“传统”UI之间的差距。其设计与最近宣布的UI框架Jetpack Compose和SwiftUI有许多有趣的相似之处。

获取项目更多信息参见:Github




Nushell: 一个用Rust编写的新shell

Nushell,简称为Nu。为什么还需要它?直接上图:

Nushell

对Nu来说,一切都是数据。 它从经典的Unix管道哲学,PowerShell的结构化数据方法,函数式编程,系统编程等方面汲取灵感。关于Nu的更多信息:

cli

pastel - 用于生成,分析,转换和操作颜色的命令行工具

pastel是一种用于生成,分析,转换和操作颜色的命令行工具。 它支持许多不同的颜色格式和颜色空间,如RGB,HSL,CIELAB,CIELCh以及ANSI 8位和24位表示。 in action

仓库地址:https://github.com/sharkdp/pastel

ripgrep - 高性能的在目录中正则表达式搜索工具

ripgrep是一种搜索工具,可以递归搜索当前目录中的正则表达式模式。 默认情况下,ripgrep将尊重您的.gitignore并自动跳过隐藏的文件/目录。 ripgrep在Windows,macOS和Linux上拥有一流的支持,每个版本都有二进制下载。 ripgrep类似于其他流行的搜索工具,如The Silver Searcher,ack和grep。 以下是在Intel i7-6900K 3.2 GHz的系统上的性能测试数据

Tool

Command

Line count

Time

ripgrep (Unicode)

rg -n -w '[A-Z]+_SUSPEND'

450

0.106s

git grep

LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'

450

0.553s

The Silver Searcher

ag -w '[A-Z]+_SUSPEND'

450

0.589s

git grep (Unicode)

LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'

450

2.266s

sift

sift --git -n -w '[A-Z]+_SUSPEND'

450

3.505s

ack

ack -w '[A-Z]+_SUSPEND'

1878

6.823s

The Platinum Searcher

pt -w -e '[A-Z]+_SUSPEND'

450

14.208s

更多详情请参照仓库地址详情

仓库地址:https://github.com/BurntSushi/ripgrep

Battleship: 控制台游戏

#cli

新手可参考它来学习Rust

Battleship