< 返回版块

2019-12-01 00:12    责任编辑:jay

标签:rust, diary

November-days

rust

iced,Github Rust分类趋势排第二

Trending

iced,是一个受Elm启发的Rust跨平台GUI库。

Github

Tokio v0.2.2

由于在v0.2中删除了current_thread::Runtime,初始发行版不提供生成!Send任务的机制。现在Tokio v0.2.2中提供了task::LocalSet来处理这种情况。

// Construct a local task set that can run `!Send` futures.
let local = task::LocalSet::new();

更多信息

StaticVec 0.5.0

StaticVec,是使用const泛型实现由数组支持的固定容量堆栈分配Vec替代方案。

这是在0.4.0之上的一个重大改进。

更多信息

Tokio 0.2 发布

新版本具有以下特性:

  • 更佳的 async / await 使用体验
  • 全新且更快的调度器
  • 更加轻量的 Tokio 依赖

例如,从 TcpListener 接收套接字 可以使用 accept 函数:

let (mut socket, _peer_addr) = listener.accept().await?;


了解更多

estream - 解析文件位置信息

如果您是Vim用户,estream可以帮助您解锁quickfix窗口的强大功能,而无需处理Vim的errorformat带来的痛苦。

使用

Plug 'JoshMcguigan/estream', { 'do': 'bash install.sh v0.1.1' }
" estream doesn't directly depend on asyncrun, but they work well together
Plug 'skywind3000/asyncrun.vim'

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

rpgp - Rust实现的 OpenPGP

rPGP是OpenPGP的唯一完全可靠的实现,遵循RFC4880和RFC2440。它提供了一个最低级别的API,并且没有规定信任模式或密钥管理策略。它完全支持Autocrypt 1.1电子邮件加密规范所需的所有功能。

Repo:https://github.com/rpgp/rpgp

Rusoto 0.42.0 发布

亚马逊云服务的 Rust SDK: Rusoto 发布 0.42.0 版。更多请查看 Github

vscode 包管理插件 crates 0.4.6 发布

添加以下功能:

  • 在 crate 旁展示其最新版本
  • 悬浮展示 crate 所有可用软件,并且可以点击更改

点击查看详情

Rust 字体解析成形引擎 Allsorts

Allsorts 是从 Prince 中剥离出来的字体成形(Font Shaping)引擎。

字体成形指的是Unicode码转化成文本,然后再把文本排版成字体的过程。

filler - 把不同的数据源的内容汇总到一个地方的工具

https://github.com/LeakyBucket/filler

radiate - 一个并行基因演化程序引擎

做基因遗传算法的吗?好像就是面向生物学物种演化的库。

https://github.com/pkalivas/radiate

wfd - 包装了 windows 的文化对话框

Windows Open and Save dialogs in Rust using winapi

https://github.com/ben-wallis/wfd

pathivu - 可以搜索的日志库

会在记录日志时自动做索引,方便搜索。

https://github.com/pathivu/pathivu

tfex-rs - 一个用 tui 实现的终端下的文件管理器

https://github.com/PorkSausages/tfex-rs

xcp - cp 命令的翻版

又一个基础轮子被翻了。

https://github.com/tarka/xcp

kyansel - 可以控制取消你的 future 的库

https://github.com/karrq/kyansel

Stacked Borrows: An Aliasing Model for Rust (the paper)

对 rust 别名模型的研究提案。全世界有这么多大佬在做研究,看来要设计一个好的语言真不是一件容易的事。

https://www.ralfj.de/blog/2019/11/18/stacked-borrows-paper.html

yubikey-piv.rs - 身份验证硬件驱动的 Rust 实现

Pure Rust Yubikey host-side driver for PIV-based RSA/ECC key storage + signing/encryption support

repotools rust縮寫指令小工具

git diff, git add -A, git status, git diff --cached, git commit -m <message>, git push and git shortlog -se

dp, aa, st, di, cm, pu and le 取代

Read more

Lopdf

Lopdf,用于PDF文件操作的纯Rust库。

更多信息Github

faster-utf8-validator

faster-utf8-validator,一种SSE/AVX-2加速的UTF-8验证算法。

更多信息Github

hilbert

hilbert,希尔伯特曲线转换

更多信息Github

RustyBox 一個完全用rust重寫的 BusyBox

真的是很猛

busybox是linux開發者最常用的一套cmd

使用rust增加穩定性是很多網路設備開發工程師樂見的?

Read more

由Mozilla Servo提供的CSS 由原本的librsvg支持升级到对Rust的支持

经过大量的重构之后,librsvg现在可以在Rust中完成所有CSS解析和匹配,无需使用libcroco。另外,CSS引擎来自Mozilla Servo,因此它应该能够处理比librsvg以前复杂得多的CSS。

介绍

第一次在librsvg中引入CSS解析是2002年。为了支持当时CSS2的一小部分,它的体积被设计的尽可能的小。

Librsvg处理CSS样式表的方式不是逐行进行语法分期,取而代之的是将各个部件组成一个整体。不知何时起,g_strsplit()成为了你最好的朋友。基本的解析算法是打开一个样式表,如下所示:

rect { fill: blue; }

.classname {
    fill: green;
    stroke-width: 4;
}

从librsvg在以往遇到的各种问题中,开发团队得知“ CSS的支持太有限”,感觉使用CSS功能的SVG要么是手写的,要么是由诸如数据绘图软件之类的自定义程序自动生成的。插图程序倾向于在每个SVG元素中明确列出所有样式属性,并且不使用CSS。

但在librsvg 2.47.1中将不再需要libcroco!

详细信息前往博客网页查看。

rabbithole-rs - JSON API数据建模

Rabbithole-rs是一个类型化、用户友好的JSON:API类型的系统,具有易于使用的宏系统来帮助您对数据建模。

#[derive(rbh_derive::EntityDecorator, Serialize, Deserialize, Clone)]
#[entity(type = "dogs")]
pub struct Dog<'a> {
    #[entity(id)]
    pub id: String,
    pub name: String,
    #[entity(to_many)]
    pub fleas: Vec<Flea>,
    #[entity(to_many)]
    pub friends: Vec<Dog<'a>>,
    #[entity(to_one)]
    #[serde(bound(deserialize = "Box<Human<'a>>: Deserialize<'de>"))]
    pub master: Box<Human<'a>>,
    #[entity(to_one)]
    pub best_one: Option<Box<Dog<'a>>>,
}

Read more:https://github.com/UkonnRa/rabbithole-rs

ptail - 让进程的输出固定行数

ptail是一个小工具,它会截断进程的输出。 与tail -f不同,它在终端中显示的行数不会超过指定的数量。如果您正在将命令作为Shell脚本的一部分执行并且不希望显示完整而冗长的输出就会特别有用。 ptail

Read more:https://github.com/orf/ptail

Chrome DevTools支持DWARF

DWARF(Debugging With Attributed Record Formats)是一种debugging文件格式,它是ELF(Executable and Linkable Format)格式的补充。

Chrome DevTools支持DWARF,意味着通过它,你可以对C/C++/Rust源码生成堆栈,设置断点和调试,而无需生成源映射。

devtools

cargo-wharf alpha.0

cargo-wharf是一个构建Rust crates的Docker镜像生成器。

更多信息参见Github

iou

iouliburing库的wrapper,这为用户提供了一个惯用的Rust接口,用于与Linux内核的io_uring接口进行异步IO交互。

更多信息参见Github

rustls-native-certs:为rustls集成操作系统证书库

rustls-native-certs可以使rustls在作为TLS客户端运行时使用平台的本机证书存储。

Windows、macOS和Linux都支持此功能:

  • 在Windows上,证书是从系统证书存储中加载的。schannel是用来访问Windows证书存储区的API。
  • 在macOS上,证书是从钥匙串加载的。用户、管理员和系统信任设置将合并在一起。security-framework 是用来访问密钥库的API。
  • 在Linux和其他类似UNIX的操作系统上, openssl-probe用于检测系统CA捆绑软件的文件名。

该库使用以下签名公开了一个函数:

pub fn load_native_certs() -> Result<rustls::RootCertStore, std::io::Error>

成功后,将返回rustls::RootCertStore在此平台上找到的带有根证书的快照库的加载程序,并用std::io::Error显示此功能以平台特定的方式失败的情况。

前往GitHub了解更多。

RUNTIME DIAGNOSTICS(运行时诊断)

Rust有非常好的错误消息以及非常具有同理心的编译器界面而闻名,如果出现问题,Rust编译器会尽力帮助您解决问题,这篇文章主要是谈谈调试错误的运行时相关的内容。 文章不长,感兴趣的可以看看

Read more:https://blog.yoshuawuyts.com/runtime-diagnostics/

cargo-hack - 解决Cargo限制的工具

Cargo是一个很好的包管理器,但有一些局限性,该工具提供了其他选项用于避免其中的一些限制。

Installation

cargo install cargo-hack

Usage --each-feature

cargo hack check --each-feature --no-dev-deps

Repo:https://github.com/taiki-e/cargo-hack

view - 在Rust中构建View的宏

该库与JSX之类的技术相比,它更加面向结构,并且大量借鉴了SwiftUI。

[dependencies]
view = "0.1.3"

示例

let show_coupon = false;
​
let v = view!{
  VStack {
    Image("company.png") 
    Button(text:"order".to_string(),style:BOLD)
      .on_click(Box::new(|| do_order())) { 
        Image("order_icon.png") 
      }
    For(i in images.iter()) { Image(i) }
    If(show_coupon) { Coupon }
    Legal
  }
};

Repo:https://github.com/richardanaya/view

mrustc 0.9:可选的Rust编译器

Github

safety-dance:从热门的crates中删除不必要的不安全代码

Safety-dance,人们可以在这里交流有关审核核心Rust中的不安全代码,并在可行时替换为安全代码的地方。

Github

Bayard:Rust语言编写的全文搜索服务程序

Bayard v0.1.0发布,作为概念证明(PoC),它是在Tantivy和tikv/raft-rs之上构建的用Rust语言编写的全文搜索服务程序。

Github




story

Redox OS self-hosting

根据Redox OS的创建者Jeremy Soller的说法,用Rust编写并正在开发中的Redox OS距离自托管(self-hosting)仅“几个月的时间”,这意味着Rustc编译器将在Redox本身上运行。

其它资料

更多信息

微軟收Rust安全軟體工程師

要3年C++ 1年系統軟體

理想的人選有編寫C / C ++的經驗,對OS安全性基礎的清晰理解,強大的計算機科學技能以及對Microsoft客戶安全的熱情。 此外,我們的漏洞研究工具主要是用Rust編寫的,因此有Rust經驗會加分。

Read more

Redox OS:硬件上有突破性进展,目前专注于 rustc 相关优化

System76 Galago Pro (galp3-c) 笔记本上运行 Redox OS:

Redox OS

原本地址:https://www.redox-os.org/news/focusing-on-rustc/

reddit 上参与讨论。

gnome-shell 的css解析栈工具全面转向Rust

大意是说gnome-shell之前使用的那些处理css的c语言的库,都已经陈旧且长时间不再维护了,而新的Mozilla/Servo/Rust 相关的Css工作栈的库,更新很快,性能也强。现在gnome官方已经决定全面转向使用 Rust 这套工具包了。

Link: https://people.gnome.org/~federico/blog/moving-gnome-shell-styles-to-rust.html

Async一些有趣的采访

博客信息

Rust编译器团队会议

编译器团队于2019-11-14举行了每周分类会议。

更多信息

crates.io 切换了DNS服务器

#rust #crate

Crates.io于今日切换了DNS服务器,在接下来的几天,这个改动将会影响到所有人,这个过程应该不会有什么问题,如果有问题的话可以Twitter @rustlang。

Read More

主要使用 Rust 开发的 MesaTEE 正式进入 Apache 孵化器

MesaTEE 是一个通用的安全计算框架,用于为安全关键场景提供通用计算服务。它结合了先进的混合内存安全(HMS)模型和可信计算技术(如 TPM )的能力,以及机密计算技术(如 Intel®SGX)。

百度安全 MesaTEE 通用安全计算框架正式通过全球著名开源社区 Apache 基金会的投票决议,以全票通过的优秀表现正式成为 Apache 孵化器项目。这是 Apache 基金会首次接收以Rust为主要开发语言的项目,也是百度继 Echarts、Doris、brpc后,第四个进入国际顶级开源社区 Apache 的项目。MesaTEE 系列项目于2018年由百度安全联手Intel宣告正式发布,主要包括核心基础安全框架 Rust-SGX-SDK(2017年4月开源)和通用安全计算框架 MesaTEE(2019年7月开源)。【消息摘自“百度安全实验室”公众号】

mesatee 代码仓库:https://github.com/apache/incubator-mesatee

crates.io 的 DNS 服务器更改

Rust 官方推特公布了这个消息,接下来的几天会生效。我们不期望任何问题的变化,如果有,各位 Rustceans 可以及时反馈。

twitter上参与讨论:https://twitter.com/rustlang/status/1197168031450972160

2019 年 6 个被使用最多的 Rust 框架

  1. Rocket
  2. Actix-
  3. Nickel-
  4. Yew-
  5. Azul-
  6. Conrod-

以上有没有你喜爱或者使用过的 Rust 框架呢?欢迎参与讨论:https://www.reddit.com/r/rust/comments/dzezr3/top_6_rust_frameworks_to_use_in_2019/

RUST 2020 目標:可擴展性

Read more

Rust 基础架构团队宣布考虑采用 GitHub Actions

来自官博的消息,Rust 基础架构团队将开始评估 GitHub Actions,以替代 Azure Pipelines 作为 rust-lang/rust 代码仓库的 CI 提供程序。

官博称 Rust 基础架构团队早之前就对 GitHub Actions beta 了解、并密切关注它的开发,并在一些较小的仓库上进行了测试。到目前为止,团队对 GitHub Actions 确实感到满意。 GitHub Actions 提供了团队最喜欢的 Azure Pipelines 功能,同时与 GitHub 的 UI,权限和工作流集成在一起。

团队的计划是在接下来的几周内开始与 Azure Pipelines 并行运行 GitHub Actions,并且随着了解到更多的信息,将会在社区更新、同步。

blog 原文:https://blog.rust-lang.org/inside-rust/2019/11/14/evaluating-github-actions.html

一个关于 Rust 编译器的漫画

是不是很形象,哈哈^_^

2019年 Rust 在 GitHub 上增速第二(235%)

在过去的几年中,有千万级数量的新开发人员加入了 GitHub 社区,为全球每个大陆的4,400万个以上的存储库做出了贡献。GitHub “盘点”了过去一年里在 GitHub 上卓越的代码仓库和社区等。在增速最快语言排行中, Rust 是 2019 年 GitHub 上增长第二快的语言(235%)。

查看原文:https://octoverse.github.com/#top-languages

此外,在 TIOBE 数据中,Rust 在一个月内排名从 34 上升到了 25,创下了历史新高。参考:https://www.cnbeta.com/articles/tech/907431.htm。

微軟工程師開始用rust開發作業系統底層元件

對C++使用者來說,使用Rust就像呼吸到新鮮空氣一樣!

且學習成本並沒有想像中的高,還算蠻友善的,新手不太需要老手幫忙就可以獨立作業。

Rust與C的交互不難,但與C++的交互目前還在研究中。

目前微軟的工程師對於Rust的想法都是比C++好用太多了。

Read more

2020年Rust的发展由你来定!

这是一篇来自官方的博客,围绕着2020年Rust的发展将如何这个话题进行的,同时也希望社区中的所有人给出一些建议

这个话题的运作方式如下:

  • 在Rust社区中写一篇博客文章,介绍他们希望2020年Rust开发的样子。
  • 核心团队阅读所有帖子,并撰写“Roadmap RFC”以提出正式建议。
  • RFC由所有人审核,进行注释,进行调整并最终被接受。
  • 该RFC是接受或推迟2020年RFC的指南。如果提案符合我们想要完成的主题,我们会采纳它,但是如果不适合,就把它推迟到下一年。

这个过程需要时间,并且在2020年之前还不能完全完成。

  • 我们将在12月1日审阅这些帖子。这使您有一个月的时间来思考2020年的Rust并撰写一些东西。
  • 我们的目标是在之后的一两周内制作RFC草案
  • 根据RFC收到的评论数量的不同,我们可能要等到一月初才接受它。

更多详情大家可以去直接阅读原文,就不一一翻译了,希望国内的Rustaceans也积极参加呀

原文链接:https://blog.rust-lang.org/2019/10/29/A-call-for-blogs-2020.html

这里月泉在给大家推荐几个国外Rustaceans写的对2020年Rust希望的博文供大家参考~

https://blog.turbo.fish/rust-2020/

https://blog.dend.ro/my-rust-2020-wishlist/

https://omarabid.com/rust-2020

https://beyermatthias.de/blog/2019/11/01/rust-2020-libraries-libraries-libraries/

完成向新借用检查器的过渡

详细信息可以参考Rust Blog

2020年,你期待的Rust是什么样子

#rust #feature

2019年接近尾声,2020年你对Rust有什么想法呢?写一篇博客然后在[email protected],或者在Reddit r/rust频道上发表,总之让Rust团队看到你的想法,Rust核心团队会看你的博客,然后撰写“路线图RFC”以提出正式建议。提案会被每个人看到,评论,调整直到被接受。如果提案满足Rust2020年的发展主题,Rust核心团队会采用它,否则就会推迟到下一年。

Read More




learning

Parze 乾淨,高效的解析器組合器

對簡單的cass 好用的感覺

use parze::prelude::*;

#[derive(Clone, Debug, PartialEq)]
enum Instr { Add, Sub, Left, Right, In, Out, Loop(Vec<Instr>) }

parsers! {
    bf = {
        ( '+' -> { Instr::Add }
        | '-' -> { Instr::Sub }
        | '<' -> { Instr::Left }
        | '>' -> { Instr::Right }
        | ',' -> { Instr::In }
        | '.' -> { Instr::Out }
        | '[' -& bf &- ']' => { |i| Instr::Loop(i) }
        ) *
    }
}

Read more

Rust寫的網頁剪貼簿

demo Read more

rust 2020 以太坊錢包Parity 心得

裡面講了以太坊錢包Parity的開發人員希望看到2020年中在Rust中發生的事情。

Read more

硬核:使用 Rust 实现简单的 JVM

来自 Ben Evans 的演讲,油管地址:https://youtu.be/7ECbwgkHdAE。

reddit 讨论请看。

纯 Rust 实现现代 Prolog - Scryer Prolog

Scryer Prolog 的目标是成为ISO Prolog,就像GHC之于Haskell:一个开放源码的工业强度生产环境,也是逻辑和约束编程的前沿研究的试验台。通常它是用高级语言实现。

mthom/scryer-prolog 使用 Rust 实现,README 上介绍了很多很棒的特性,以及一些使用指导,详细请看:https://github.com/mthom/scryer-prolog。

reddit 上参与讨论:https://www.reddit.com/r/rust/comments/e1z0hj/modern_prolog_implementation_in_pure_rust/

Rust 数据类型示意图

cheats.rs —— Rust 备忘录网站用示意图讲解了 Rust 的各种数据类型,非常直观

image.png

How to Panic in Rust

What exactly happens when you panic!()? I recently spent a lot of time looking at the parts of the standard library concerned with this, and it turns out the answer is quite complicated! I have not been able to find docs explaining the high-level picture of panicking in Rust, so this feels worth writing down.

https://www.ralfj.de/blog/2019/11/25/how-to-panic-in-rust.html

scryer-prolog - 用Rust写的现代prolog编译器实现

Scryer Prolog aims to become to ISO Prolog what GHC is to Haskell: an open source industrial strength production environment that is also a testbed for bleeding edge research in logic and constraint programming, which is itself written in a high-level language.

https://github.com/mthom/scryer-prolog

Neat Rust Tricks: Passing Rust Closures to C

One of Rust’s biggest selling points is how well it can interoperate with C. It’s able to call into C libraries and produce APIs that C can call into with very little fuss. However, when dealing with sufficiently complex APIs, mismatches between language concepts can become a problem. In this post we’re going to look at how to handle callback functions when working with C from Rust.

https://blog.seantheprogrammer.com/neat-rust-tricks-passing-rust-closures-to-c

【Rust日报】2019-11-24

makeco 发表于 2019-11-24 22:34

Tags:rust

Rust发布团队如何保证每六周发布一次编译器

#rust #blog

这篇文章是RustFest 2019中的一次分享,主要讲述了Rust发布流程是如何工作的,以及发布团队为什么要这么做。在过去几天发布的1.39版本中包含了大家一直期待的功能,在此前六周发布的1.38版本中包含了几十万行代码的改动,发布后发现了5个问题,有两个问题影响到了代码,另外三个是性能方面的问题。

在此前的1.37版本中,改动了几万行代码,有三个问题,在更早的1.36版本中只有四个问题。我想解释下为什么我们会进行如此快速的发布,以及过程中遇到了哪些问题,我们如何将问题扼杀在摇篮里。

为什么我们会每六周发布一次呢?这是个有趣的问题,很少有编译器有如此短的发布周期(原来Python的发布周期很短,后来改为一年了),这主要是因为我们没有发布压力。如果某个feature没有准备好发布,我们就会delay它几周时间,没有人会关心它是否在今天或者一个半月内要稳定下来。

当然我们也尝试过一个长的发布周期,特别是跟editon一起发布,但是这并不适合我们。稳定版editon在12月初发布,而9月份可能我们还对如何让模块正常工作存疑。而且这让会导致一些新的特性来不及经过nightly检验就匆忙发布,用户也无法对其进行测试,这样会破环我们许多内部的流程。

另外一个问题,我们如何及时发现并解决问题呢?答案是测试,我们有大量的测试,测试编译输出和异常信息,我们通过60个CI构建流去运行大量的测试,但是这并不够,因为测试并不能覆盖所有Rust的工作场景。

所以我们开始让编译器去编译它自己,每次发布前我们都用前一次去编译它。在nightly发布前我们用beta去编译,在beta发布前我们用stable去编译,stable发布前我们用上一个stable去编译,这会让我们捕获到一些特殊的场景,由于编译器代码库使用了许多不稳定的功能,而且编译起的代码库还有点旧,因此我们可以捕获一些极端情况,但是并不能覆盖所有内容。

我们从开发者拿得到bug报告,大部分是nightly的bug,而不是beta的,因为大部分人使用的是nightly而不是beta,我们也不能让用户去测试beta,即使我们要求,开发者也不会去测试的。我们想了一个办法,我们可以去测试用户的代码,虽然这么做很烧钱,这个项目就是Crater。我们把crates.io上和Github上带有Cargo.toml的项目克隆下来,对每一个项目我门运行两次cargo test,在stable上运行成功,但在beta上运行失败,这就是个问题,然后我们会记录下这个问题。

在1.39发布时我们在46个crate收集到了失败的报告,然后发布团队会对每个问题进行分析,然后去解决。1.39还算好的,在1.38版本我们收到了600个crate失败的报告,如果没有Crater,可能你在升级后就会编译不通过了,这会让开发者丧失对稳定版本的信心。

我们知道这样做不够完美,因为我们没法测试私有项目和Gitlab上的项目,而且每个项目都需要在sandbox中运行。Crater并不是一个可以长期永久扩展的东西,它使用了大量计算资源,太烧钱。

这些确实是一些需要解决的问题,不过目前它起到的效果很好,通过它在几百个crate中发现了几十个问题,这也是我们可以快速发布的原因之一。

Read More

Polonius

Rust-Belt-Rust 2019会议上,Nicholas Matsakis做了一个关于Polonius-将来的Rust借用检查器的演讲。

演讲PPT,视频后面会更新。

响应式UI

关于响应式UI的一篇博客文章

为了找出druid最佳的响应式结构,作者研究各种各样的响应式UI系统。文章试图找到常见的模式,以表征整个设计空间。

备注:druid是一个数据优先的Rust原生UI设计工具包。

std::future合并到了actix-web

#rust #web

Read More

在Rust中使用Redis内存分配器

#rust

作者在开发redismodule-rs时遇到一个问题,他需要创建自定义的内存分配器。我们知道Rust为String和Vec类型分配内存时使用的是Global Allocator,然而redis 模块的是以共享库的形式被编译的,也就是说Rust要使用这个模块就要用到System Allocator,这是系统默认提供的内存分配器,这种行为会导致几个问题:

首先,Redis可能根本不使用系统分配器,而是依靠jemalloc。 jemalloc分配器是系统malloc的替代方案,它除其他功能外还包括许多避免碎片的调整。 如果模块使用系统分配器,而Redis使用jemalloc,则分配行为将不一致。

其次,即使Redis始终使用系统分配器,Redis也不会看到模块直接分配的内存:它不会显示在诸如信息内存之类的命令中,也不会受到Redis执行的清除操作(例如逐出键)的影响 。

由于这些原因,Redis模块API提供了钩子,例如RedisModule_Alloc和RedisModule_Free。 它们的用法与标准malloc和free调用非常相似,但是除了将调用实际传递给内存分配器之外,还使Redis知道分配的内存。

Rust提供了实现自定义内存分配器的能力,可以通过impl GlobalAlloc 实现自己一个RedisAlloc,通过Redis 模块API提供的钩子来实现内存分配和释放。

Read More

使用 Rust 实现的布隆过滤器

项目作者使用 Rust 实现了布隆过滤器并将其开源。在项目的 README 中,作者也简要的说明了使用以及设计思想。希望有兴趣的朋友能够提供一些反馈。项目地址:https://github.com/srinivasreddy/rust-bloomfilter

参与 reddit 讨论:https://www.reddit.com/r/rust/comments/dzfvev/i_have_created_a_bloom_filter_in_rust/

用Rust进行创意编程(Creative Coding)

创意编程(Creative Coding)简单来说就是用代码来搞艺术,如果你对创意编程感兴趣,也想练练 Rust 的话,可以看看这篇 Rust 创意编程入门教程

创意编程

是什么让 Rust 这么快

其实这算是月经贴,最近 reddit 上又讨论了。答案比较丰富,各位看官自行前往围观:

https://www.reddit.com/r/rust/comments/dxbjq2/what_makes_rust_so_fast/

自己动手使用 Rust 实现区块链-第一部分

讲解得非常详细,区块链初学者可以学习学习。

https://blog.knoldus.com/custom-implementation-of-blockchain-in-rustpart-1/

rabbithole-rs - 兔子洞 Json API 系统

Rabbithole-rs is a nearly well-typed, user-friendly JSON:API type system, with an easy-to-use Macro System to help you modelling the your data.

https://github.com/UkonnRa/rabbithole-rs

博文:理解 Serde

讲解得很细致,对于学习深入理解 Serde 很有用。

https://www.joshmcguigan.com/blog/understanding-serde/

Rust 适合作为第一门编程语言来学习吗?

看看大家的讨论:

https://www.reddit.com/r/rust/comments/dy79ty/is_learning_rust_as_a_first_systems_programming/

好文:Rust 无错开发的模式

http://blog.pnkfx.org/blog/2019/11/18/rust-bug-minimization-patterns/

使用 Rust 进行音乐可视化教程(FFT 傅里叶变换可视化)

https://dflemstr.io/posts/music-visualization-7/

ambassador 程序宏實作的委派 trait (Delegation of trait implementations via procedural macros)

目前只支援 1.40

比如你有貓跟狗都會叫,然後你有個動物enum在上層

想要模仿繼承的感覺,那就是他

use ambassador::{delegatable_trait, Delegate};

#[delegatable_trait]
pub trait Shout {
    fn shout(&self, input: &str) -> String;
}

pub struct Cat;

impl Shout for Cat {
    fn shout(&self, input: &str) -> String {
        format!("{} - meow!", input)
    }
}

pub struct Dog;

impl Shout for Dog {
    fn shout(&self, input: &str) -> String {
        format!("{} - wuff!", input)
    }
}

#[derive(Delegate)]
#[delegate(Shout)]
pub enum Animal {
    Cat(Cat),
    Dog(Dog),
}

pub fn main() {
    let foo_animal = Animal::Cat(Cat);
    println!("{}", foo_animal.shout("BAR"));
}

Read more

关于Rust中错误处理的思考

编程语言的错误处理解决方案在很大程度上影响代码的健壮性,简洁性,可读性,并在一定程度上影响代码的运行时性能。考虑到最近的一些讨论以及越来越多的错误处理包装箱的出现,文章分享了作者对此的一些想法,关键点如下:

  • “匿名sum类型”是一个错误处理的好工具。
  • 我们可能希望明确区分针对应用程序用户的错误和旨在由代码处理的错误。
  • 我认为,Rust的错误处理很好,但仍可以改进。

更多信息参见博客

寫一次Rust就可應用在 Android, iOS, Flutter

作者手把手的教你怎麼做

很詳細的教學

Read more

實作泛型的固定大小陣列 arrayvec

作者講解了他實作這個庫中遇到的種種困難以及解決辨法

建議想用到泛型特性的朋友,可以來了解

Read more

关于Rust中的类型布局和ABI的注意事项

全文大纲如下:

1 The Anatomy of a Platform

2 The Anatomy of a Type

2.1 Size

2.2 Alignment

2.3 Offsets

2.4 Layout

2.5 ABI

2.6 The Layouts/ABIs of Builtins

2.7 Specifying Layouts and ABIs

3 Extended Random Notes

3.1 The C Integer Hierarchy

3.2 Endianness

3.3 Segmented Architectures

3.4 Calling Conventions

3.4.1 Problem and Motivation for Calling Conventions

3.4.2 Some Examples of Calling Conventions

感兴趣的读者可以浏览原文:https://gankra.github.io/blah/rust-layouts-and-abis/

为Rust应用构建小而快速的镜像

原文地址

这篇文章我会介绍如何为Rust应用创建小且快速的Docker镜像。 我将会从创建一个小的测试应用开始,然后不断构建迭代Dockerfile

环境要求

确保你已经安装了下面的应用:

起步: 创建demo应用

使用rustup进行设置,确保你使用了最新的稳定版Rust。

rustup default stable
rustup update 

创建一个myapp的新项目

cargo new myapp
cd myapp/ 

起步: 初始化dockerfile

以下是我们用于docker构建的起点,在当前目录中创建一个名为Dockerfile的文件:

FROM rust:latest

WORKDIR /usr/src/myapp 
COPY . . 
RUN cargo build --release 
RUN cargo install --path . 
CMD ["/usr/local/cargo/bin/myapp"] 

同样创建一个.dockerignore的文件写入以下内容:

target/
Dockerfile 

你可以尝试构建并运行应用:

docker build -t myapp .
docker run --rm -it myapp 

如果一切都能工作的话,你可以在控制台看到Hello, world!

我们初次构建的问题

当我写这篇文章的时候, Rust 包管理器 cargo 有一个issue是 它还没有 一个dependencies-only的选项,来单独构建依赖

cargo缺少这样单独构建依赖的选项使得我们在每次改动src下面的内容时都会对重新构建依赖项,但我们只想在Cargo.toml或者Cargo.lock文件改变是重新构建依赖项,比方说添加或者更新依赖时。

另一个问题是,虽然rust:latest Docker映像非常适合构建,但它的映像相当大,容量超过1.6GB。

改进构建流程避免src改动重新构建依赖项

为了避免这些问题并且开启docker构建缓存让构建变得更快,首先我们开始改动Cargo.toml来添加一个依赖:

[package]
name = "myapp"
version = "0.1.0"
[dependencies]
rand = "0.5.5" 

我们添加rand包作为项目依赖,它提供了方便地生成随机数的工具。

现在如果运行:

docker build -t myapp .

它将构建rand依赖关系并将其添加到缓存,但是更改src / main.rs将使下一次生成的缓存无效:

cat src/main.rs
fn main() {
    println!("I've been updated!");
}

docker build -t myapp . 

请注意,此次构建必须再次重建rand依赖项。

在等待Cargo的only-dependencies构建选项时,在将任何代码复制到构建环境之前,我们可以通过将Dockerfile更改为默认的src/main.rs来克服此问题:

FROM rust:latest

WORKDIR /usr/src/myapp 
COPY Cargo.toml Cargo.toml 
RUN mkdir src/ 
RUN echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs 
RUN cargo build --release 
RUN rm -f target/release/deps/myapp* 
COPY . . 
RUN cargo build --release 
RUN cargo install --path . 
CMD ["/usr/local/cargo/bin/myapp"] 

上面的Dockerfile中的以下行将导致Cargo构建时仅重建我们的应用程序:

RUN rm -f target/release/deps/myapp*

所以如果我们编译的话:

docker build -t myapp .

然后我们对src/main.rs做一点小小的改动:

cat  src/main.rs
fn main() {
    println!("I've been updated yet again!");
}

我们将会发现接下来docker构建应用只会在我们的应用逻辑改变时重新构建,而依赖项目则被缓存起来用来快速构建。

减小镜像体积

rust:latest镜像具有构建项目所需的所有工具,但大小超过1.6GB。我们可以使用Alpine Linux(一种出色的小型Linux发行版)来改善镜像大小。

Alpine团队提供了一个只有几兆字节大小的docker映像,并且仍然具有一些用于调试的shell功能,并且可以用作Rust构建的小型基础映像。

使用多阶段docker构建,我们可以使用rust:latest来完成构建工作,但是只需将应用复制到基于alpine:latest的最终构建阶段即可:

# ------------------------------------------------------------------------------
# Cargo Build Stage
# ------------------------------------------------------------------------------

FROM rust:latest as cargo-build

WORKDIR /usr/src/myapp 
COPY Cargo.toml Cargo.toml 
RUN mkdir src/ 
RUN echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs 
RUN cargo build --release 
RUN rm -f target/release/deps/myapp* 
COPY . . 
RUN cargo build --release 
RUN cargo install --path . 
# ------------------------------------------------------------------------------
# Final Stage
# ------------------------------------------------------------------------------

FROM alpine:latest

COPY --from=cargo-build /usr/local/cargo/bin/myapp /usr/local/bin/myapp 
CMD ["myapp"] 

现在如果你运行:

docker build -t myapp .
docker images |grep myapp 

你可以看到这些东西:

myapp               latest              03a3838a37bc        7 seconds ago       8.54MB

下一步:跟进、修复并进一步完善我们的构建

如果你尝试使用docker run --rm -it myapp运行以上示例,则可能会遇到类似以下错误:

standard_init_linux.go:187: exec user process caused "no such file or directory"

如果您熟悉[ldd](https://en.wikipedia.org/wiki/Ldd_(Unix)则可以运行以下命令,以查看我们缺少应用程序的共享库:

docker run --rm -it myapp ldd /usr/local/bin/myapp

在上面的例子中我演示了如何通过避免每次src/main.rs改动重新构建依赖提升构建速度,以及如何将镜像大小从1.6GB+减少到几兆字节,然而我们的构建还是不能生效,因为我们需要针对MUSL Libc进行构建,这是一个轻量级、快速的标准库,在alpine:latest中是默认库。

除此之外,我们还希望确保我们的应用程序以容器内的非特权用户身份运行,从而遵守最小特权原则

为MUSL Libc构建

要针对MUSL libc进行构建,我们需要安装x86_64-unknown-linux-musl 构建目标,以便可以将Cargo标记为使用--target为其构建。我们还需要标记Rust以使用musl-gcc链接器。

rust:latest镜像预安装rustup。 rustup允许我们使用rustup target add $NAME安装新的构建目标,因此我们可以像这样修改Dockerfile:

# ------------------------------------------------------------------------------
# Cargo Build Stage
# ------------------------------------------------------------------------------

FROM rust:latest as cargo-build

RUN apt-get update 
RUN apt-get install musl-tools -y 
RUN rustup target add x86_64-unknown-linux-musl 
WORKDIR /usr/src/myapp 
COPY Cargo.toml Cargo.toml 
RUN mkdir src/ 
RUN echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs 
RUN RUSTFLAGS=-Clinker=musl-gcc cargo build --release --target=x86_64-unknown-linux-musl 
RUN rm -f target/x86_64-unknown-linux-musl/release/deps/myapp* 
COPY . . 
RUN RUSTFLAGS=-Clinker=musl-gcc cargo build --release --target=x86_64-unknown-linux-musl 
# ------------------------------------------------------------------------------
# Final Stage
# ------------------------------------------------------------------------------

FROM alpine:latest

COPY --from=cargo-build /usr/src/myapp/target/x86_64-unknown-linux-musl/release/myapp /usr/local/bin/myapp 
CMD ["myapp"] 

请注意以下行,它显示了我们为MUSL Libc构建应用程序的新方式:

RUSTFLAGS=-Clinker=musl-gcc cargo build --release --target=x86_64-unknown-linux-musl

重新构建应用程序并运行它:

docker build -t myapp .
docker run --rm -it myapp 

如果一切正常,你应该再次看到应用已被更新了!

以非特权用户身份运行

为了遵循最小特权原则,我们创建一个名为myapp的用户,避免用户以root用户的身份运行应用。

将Final Stage docker build阶段更改为以下内容:

# ------------------------------------------------------------------------------
# Final Stage
# ------------------------------------------------------------------------------

FROM alpine:latest

RUN addgroup -g 1000 myapp 
RUN adduser -D -s /bin/sh -u 1000 -G myapp myapp 
WORKDIR /home/myapp/bin/ 
COPY --from=cargo-build /usr/src/myapp/target/x86_64-unknown-linux-musl/release/myapp . 
RUN chown myapp:myapp myapp 
USER myapp

CMD ["./myapp"] 

更新src/main.rs:

cat src/main.rs
use std::process::Command;

fn main() {
    let mut user = String::from_utf8(Command::new("whoami").output().unwrap().stdout).unwrap();
    user.pop();
    println!("I've once more been updated, and now I run as the user {}!", user)
} 

现在构建并运行应用:

docker build -t myapp .
docker run --rm -it myapp 

如果一切正常,你应该会看到应用已再次更新,现在应用以用户myapp运行。

最后

现在我们构建应用程序的完整Dockerfile如下所示:

# ------------------------------------------------------------------------------
# Cargo Build Stage
# ------------------------------------------------------------------------------

FROM rust:latest as cargo-build

RUN apt-get update 
RUN apt-get install musl-tools -y 
RUN rustup target add x86_64-unknown-linux-musl 
WORKDIR /usr/src/myapp 
COPY Cargo.toml Cargo.toml 
RUN mkdir src/ 
RUN echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs 
RUN RUSTFLAGS=-Clinker=musl-gcc cargo build --release --target=x86_64-unknown-linux-musl 
RUN rm -f target/x86_64-unknown-linux-musl/release/deps/myapp* 
COPY . . 
RUN RUSTFLAGS=-Clinker=musl-gcc cargo build --release --target=x86_64-unknown-linux-musl 
# ------------------------------------------------------------------------------
# Final Stage
# ------------------------------------------------------------------------------

FROM alpine:latest

RUN addgroup -g 1000 myapp 
RUN adduser -D -s /bin/sh -u 1000 -G myapp myapp 
WORKDIR /home/myapp/bin/ 
COPY --from=cargo-build /usr/src/myapp/target/x86_64-unknown-linux-musl/release/myapp . 
RUN chown myapp:myapp myapp 
USER myapp

CMD ["./myapp"] 

从这里观看我的演示,有关使用Skaffold在DC / OS上将Rust部署到Kubernetes。利用该演示中的一些技术,你可以将应用程序自动部署到Kubernetes,以使用Skaffold在本地minikube系统上进行测试。

Happy coding!

为 Rust 应用程序创建小型、快速构建的 Docker 映像

在博文中,作者将演示如何为Rust应用程序创建小型、快速构建的Docker映像。

前提:确保你拥有并且正在使用的最新的 stable Rust 及 rustup:

rustup default stable
rustup update

然后创建一个简单的测试应用程序(读者可自行把握),用于 Dockerfile 上构建和迭代。暂且叫 “myapp”:

cargo new myapp
cd myapp/

接着我们开始构建 docker 镜像,在当前目录中创建一个名为 Dockerfile 的文件,内容如下:

FROM rust:latest

WORKDIR /usr/src/myapp

COPY . .

RUN cargo build --release

RUN cargo install --path .

CMD ["/usr/local/cargo/bin/myapp"]

同时在当前目录下创建一个 .dockerignore 文件,添加如下内容:

target/
Dockerfile

然后你就可以构建并运行你的应用啦:

docker build -t myapp .
docker run --rm -it myapp

如果一切正常你将会看到输出:Hello, world!

更详细内容及高阶内容请看原文:https://shaneutt.com/blog/rust-fast-small-docker-image-builds/

Rust for raspberry pi 教程2.0

#rust #pi

以前发过这个项目,10月27号第二版合并到了主分支。

resp

Rust for C++ developer

#rust #c++

Pavel Yosifovich 在NDC大会的分享《Rust for C++ developer》,国内有很多相似的话题,比如知乎专栏C++工程师的Rust迁移之路

Read More

仔细研究Rust Ownership

#rust

twitter 比较火的一篇文章,作者第一篇关于Rust的文章,仔细研究Rust所有权机,结合形象的内存结构图片,帮助读者深入了解。推荐阅读。

Read More




game

2048-rs - 2048游戏Rust实现版本

这是一个Rust实现的2048游戏,运行在终端。除了标准的用户输入,AI还可以用来执行这些动作。这个人工智能利用expectiminimax算法在每一步中推荐最好的下一步。

使用

cargo install play-2048
play-2048

Mv72ZQ.png

Repo:https://github.com/KappaDistributive/rs2048

beaver - Busy Beaver 游戏的模拟图灵机

Simulating Turing machines for the Busy Beaver game 。

Busy Beaver game 的解释在这里:wikipedia

Informally, in theoretical computer science, the busy beaver game aims at finding a terminating program of a given size that produces the most output possible.[1]

https://github.com/LukasKalbertodt/beaver

sudoku - 使用 ggez 实现的独数游戏

https://raw.githubusercontent.com/Piripant/sudoku/master/screenshot.png

https://github.com/Piripant/sudoku

tocenter - 一个圆圈小游戏

基于 ggez 和 ecs 库开发。

img

https://github.com/silentsokolov/tocenter

Rust GameDev #3

Sulis - a Turn-Based RPG 類似SLG戰棋RPG的遊戲

Veloren 類似我的世界

PF Sandbox 3D橫向格鬥遊戲

Antorum 類似我的世界

Read more

klondike-rs:用Rust编写的经典纸牌命令行小游戏

avatar

avatar

框架

配置使用TOML。以下是一个示例配置文件,该文件将所有设置均设置为其默认值。

[display]

# Whether to use ANSI color escapes
# TODO: Currently ignored
color = true

# Whether to use Unicode box-drawing characters
# TODO: Currently ignored
unicode = true


[game]

# How many cards to draw (usually 3 or 1)
# TODO: No bounds checking, so don't break things
draw_from_stock_len = 3

# Whether it's permitted to move a card out of a foundation
take_from_foundation = true

根据您的操作系统,再从不同几个位置提取配置文件。

前往GitHub了解更多。




gui

iced - 跨平台原生Rust GUI库,并且受到赞助了

A cross-platform GUI library for Rust, inspired by Elm

img

重要的特性:同时支持本地GUI和Web UI。就是一份代码,可以编译到不同平台上运行。

然后,今天发布的消息,这个项目已经被 Cryptowatch 赞助了。

Repo: https://github.com/hecrj/iced

Palette - Rust 实现的色彩和色彩空间库

强调使用 Rust 的类型系统来阻止错误。

It’s a Rust library for working with colors and color spaces. It uses the type system to prevent mistakes, like mixing incompatible colors or working with non-linear RGB. It encodes the color spaces and their meta data (such as RGB primaries and white point) into the types to help making color processing less error prone and hopefully more accessible to those who don’t want to dive into the rabbit hole that is colors in computing.

https://ogeon.github.io/2019/11/17/palette-0-5-0.html

OrbTk 0.3.1-alpha1

Orbital Widget Toolkit是一个多平台(G)UI工具包,用于使用编程语言Rust构建可扩展的用户界面。

OrbTk发布了重写的第一版,0.3.1-alpha1,建议新开发者跳过0.2.*的所有版本,并从此alpha版本或即将发布的版本开始。

更多信息crates.io

rayn 0.3

SIMD 加速

分形渲染

Read more

超棒的终端 tui-rs

主要是受 Javascript 库 blessed-contrib 和 Go 库 termui 的启发而开发。

该库基于使用中间缓冲区立即渲染的原理。这意味着在每帧上,都应该构建所有应该属于 UI 的小部件。这为丰富的交互式UI提供了极大的灵活性。

GitHub 地址:https://github.com/fdehau/tui-rs

Pushrod 0.4.12 GUI庫更新了

目前使用SDL2 的UI庫

之後會全面改成 GFX 跟 winit

Read more

=======

Skulpin - 可以非常简单绘制2D图形

“Skulpin”结合了Skia和Vulkan来绘制gpu加速的2D图形。Skia是Chrome、Sublime Text和谷歌的新UI框架Flutter使用的相同的2D渲染库。这个crate设置一个窗口,初始化Vulkan,并将Skia画布传递给回调以进行绘制。Skia API易于使用,支持形状、文本和位图。

详情请见:https://github.com/aclysma/skulpin

pixels:硬件加速的像素帧缓冲器

pixels 终于发布了。作为创建硬件加速的像素帧缓冲区的最简单方法,声明的对象和与类似包装箱的比较可在自述文件中找到。例如以下的案例中那样,pixels可以满足目前大部分的需求。




embedded

「嵌入式」teensy4 开发板的 Rust 支持包

teensy4 是一款 Armv7 开发板,有兴趣可以用rust玩儿了。

https://github.com/mciantyre/teensy4-rs

仿真器

这是运行简单的CHIP-8测试程序的解释器(在macOS上运行)的屏幕截图:

avatar

这相当于1-bpp显示器,分辨率为64x32像素。在此屏幕截图中,显示(由GPU)缩放为原始大小的50倍。

模拟器是像素缓冲区的绝佳用例。使用pixels设置纹理四边形并将其流式传输到GPU非常容易。

前往GitHub了解更多。

MIDI 實體播放器使用 AD9833與 BluePill版子

有人使用了rust結合硬體做了 MIDI 播放器

對嵌入式有興趣的朋友不要錯過了

Read more




tools

Nushell 0.5.0 发布

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

详情请见:http://www.jonathanturner.org/2019/11/nushell-0_5_0.html



async

async-std 1.2.0 版本更新

这个版本主要是一些功能优化,包括新增了 Stream::unzip API 和详细的网络类型错误。

使用示例:

use async_std::prelude::*;
use async_std::stream;

let s  = stream::from_iter(vec![(1,2), (3,4)]);

let (left, right): (Vec<_>, Vec<_>) = s.unzip().await;

assert_eq!(left, [1, 3]);
assert_eq!(right, [2, 4]);

项目地址:https://github.com/async-rs/async-std/releases/tag/v1.2.0

reddit 上参与讨论:https://www.reddit.com/r/rust/comments/e2i3kn/asyncstd_120_released/

jsonrpc-v2 支持 async/await 语法了

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

博文:Rust async 介绍

值得读一读。

https://thomashartmann.dev/blog/async-rust/

async-std 1.0发布

async-std是Rust的标准库到异步世界的移植。它运行速度十分快,使用体验也更良好。

async-std1.0最终发布。正如开发者在第一个公告博客中所承诺的那样,稳定版本与Rust 1.39发行版相吻合,该发行版增加了async/.await。我们要感谢周围的活跃社区async-std帮助发布了该版本。

async-std的1.0版本指示所有相关的API均已就绪,将来会在这些稳定的基础上增加功能。

前往博客网页了解更多。

推荐文章:揭开异步Rust的神秘面纱

本文章的目标读者是已经对Vantage Rust经验丰富,并且希望涉足异步生态系统中的程序员。

就像标题所示,这本书与其说是关于如何使用异步Rust,还不如说是试图对幕后工作原理有一个扎实的理解。有效的使用异步rust应该是一个自然而然地开始。

因此,我们将尝试回答由任何足够复杂的技术引起的常见基本问题:

  • 我们如何以及为什么要这样做?
  • 构成堆栈的层是什么?
  • 它们各自的作用是什么?
  • 他们以什么样的方式工作以及为什么需要这样的方式?
  • 它们如何配合在一起?
  • 这种方法的优点和缺点是什么?
  • 整体执行模型的语义是什么?
  • 内存中的所有内容如何表示?
  • etc...

在回答所有这些问题的方式上,我们会遇到很多抽象的问题,一开始看起来完全像是变魔术。

在阅读本书之后,人们将能够:A)深入研究任何任意复杂的异步代码库,B)悉知编译器可能向它们抛出的任何错误消息。

本文章英文全文前往GitHub查看。

Executor:Web Assembly中的Async-Await

Executor的特点:

  • #![no_std]
  • 处理多个spawn并行化运行
  • 简单易学

更多信息参见Github

有人問join_all並沒有平行執行,怎麼解決?

解法:

let handles = my_futures.into_iter().map(async_std::task::spawn).collect::<Vec<_>>();

let results = futures::future::join_all(handles).await;

Read more

async-std 0.99.12: async/.await 準備好了!

看來 1.39 就可以使用了

這個週末打算出 1.0

這是一個第三方的仿原生標準庫的異步庫

use async_std::task;
use std::thread;
use std::time::Duration;

fn main() {
    task::block_on(async {
        let mut tasks: Vec<task::JoinHandle<()>> = vec![];
        let task = task::spawn(async {
            task::sleep(Duration::from_millis(1000)).await;
        });
        let blocking = task::spawn_blocking(|| {
            thread::sleep(Duration::from_millis(1000));
        });
        tasks.push(task);
        tasks.push(blocking);
        for task in tasks {
            task.await
        }
    });
}

Read more

web

std::future合并到了actix-web

#rust #web

Read More

一個使用 async/await 跟 tokio 0.2 and hyper 0.13 的範例

一個簡單高效的 http server

Read more




ffi

calculator - 用 Nom, Pratt Parser, LLVM, Cranelift and Relm 实现的计算器

同时支持 cli,repl, gtk 哦。

img

https://github.com/In-line/calculator

luster - 用 Rust 实现的 lua 虚拟机

https://github.com/kyren/luster




wasm

Rust 声谱图

使用 Rust 编写的 WebAssembly 项目:可以根据周围声音实时显示声谱图形。使用了crate:rustfft 和 web-sys。

image.png

Rust + wasm 开发的俄罗斯方块

直接在下面网页中就可以玩儿!!

http://klotzandrew.com/blog/rust-wasm-tetris