前言:
从2018年开始,我每天会花1个小时关注Rust社区动态,并且在Rust.CC论坛、tg channel、Steemit、GitHub、语雀订阅都开通了Rust日报,分享我每天的见闻,偶尔也夹杂了一些个人的观点。新的一年过去了,Rust每日新闻已经成为了Rust社区群大家每天必看的内容。每周也会精选几篇Rust社区中的动态,和大家分享。分享的内容就不按时间排序了。
2019-04-14
通告两则
RustCon Aisa 2019 大会在下周六即将开启
关于大会动态,请关注此帖。包含讲师介绍、议题等信息。
大会期间吃货指南: 土生土长北京饮食达人姜军为你推荐:RustCon 期间的北京特色餐饮
关于门票:
我手头有两份优惠码:IZHKfP6 和 fAp7FK1,给有需要的朋友。但不知道有没有被使用了。如果你已经买了票,但是大会期间有事不能去,可以提前联系日报小组,可以帮你吆喝一嗓子,转购给有需要的人。
RustCC论坛坛主Mike新上线了公众号
以后Rust日报也将同步到该公众号,多了一个推送渠道。
官方新闻
Rust 1.34 稳定版发布
$ rustup update stable
该稳定版本包括如下变动:
- 引入了cargo registries,此功能允许你指定crates.io之外发布的crate,甚至一些闭源的crate。
- 文档测试支持
?
语法 - 过程宏中的自定义属性
#[attr()]
,#[attr[]]
, 和#[attr{}]
可以接受token流。之前的unrestricted_attribute_tokens Features。 - TryFrom和TryInto稳定
- 弃用
fn before_exec
而使用unsafe fn pre_exec
- 稳定了一些标准库API,比如Instant::checked_add/ Instant::checked_sub等
- 支持
extern crate self as foo;
将当前crate的root导出为指定别名 - 支持新的target:
riscv64imac-unknown-none-elf
和riscv64gc-unknown-none-elf
,以及powerpc64-unknown-freebsd
- 可以使用
-C linker-plugin-lto
启用链接器插件LTO优化, 使得rustc将Rust代码编译为LLVM bitcode,从而允许LLVM跨C / C ++ FFI边界执行LTO优化
更多内容请看官方release notes。
Rust异步进展:Future-proof the Futures API的PR已经被合并
该PR解决的问题是:Future::poll
应该获取&Waker还是可以获得&Waker的&Context?
最终答案是:Context
- Future-proof the Futures API :PR 59119
- 相关:Tracking issue for RFC 2592, futures_api
- 相关: [Stabilization] Future APIs #59725
社区新闻
Rust又一次获得StackOverflow程序员最喜欢语言第一
今天SO发布的这个统计很有意思,先来看看Rust,三点:
- 80%以上的开发者想用Rust开发
- SO有65%的开发者是开源贡献活跃者,这其中使用Rust、WebAssembly和Elixir的人贡献速率最高
- Rust的薪资较去年增高了(去年65k)
继续SO统计。图1是SO统计各大语言生态的原图,上面没有Rust。但其实,以我运营Rust日报近两年的观察,Rust的生态目前确实比不上在各个领域已经成熟的语言,但是它正在底层默默地在这些领域构建自己的生态。如图2。用群友的话来说:Rust正在聚沙成塔。
另外,SO统计上关于区块链的统计也很有意思。
「讨论」如何解读StackOverflow上面Rust连续四年成为最受开发者喜欢语言的这一事实?
该贴作者对这个结果做出了以下可能的解释:
- 跨越了学习曲线的人真的都喜欢Rust
- 开发人员喜欢新的技术,即使他们还没了解Rust,但他们认为应该重视它。(这个角度来看的话,排名第二的Python看上去就比较诡异)
- Rust社区是一个非常友好的社区
- Rust社区营销的比较好
- 有许多C++开发者因为Rust的安全性而选择它
到底是什么原因呢?这个话题下评论区讨论比较激烈。
(我喜欢Rust,是因为Rust这门语言恰好符合我对理想编程语言的某些预期。你是什么原因喜欢Rust呢?虽然目前还没有太多Rust的职位招聘,但实际上暗流涌动,有很多公司都已或多或少地在生产中使用了Rust,也就是说,Rust正在聚沙成塔)
偶尔也看到一条额外信息:Apple也在使用Rust构建分布式文件系统,据说在在西雅图举行过一次小型演讲,试图招募相关人才,在网上还找不到相关信息。
「远程工作」Rust软件工程师
关键字:远程(美国境内)、Rust、容器服务、创业
「通告」image的GitHub仓库现已迁移到新的image-rs组织
image是纯Rust实现的图像库,这次迁移主要是遵循以下计划:
准备邀请一些人可以加入组织做贡献
准备建立两个团队:发布团队(拥有crates.io的访问权限)和开发团队(拥有仓库代码的写入权限)。这样做是为了安全性。
移动其他相关的库到统一的组织下
「讨论」为什么Deno的基准测试中Hyper的最大延迟如此高?
max latency >1000ms
目前讨论还未有结果,可以持续关注。
Deno作者提交了一个PR,使用O3优化,目测也未有改善。后续也有热心人提交了新的补丁,还在尝试。
一封写给Rust宏的情书
本文不是宏教程,作者写这篇文章的目的就是为了让还没有使用过Rust宏的人,早点尝试一下宏。(真香预警)
作者比较了Rust和其他语言(C/C++/Java)中的元编程,摘要:
- C宏和Cpp模板元编程。很容易引入难以发现的错误,并且会扰乱编译时间,在构建中引入不必要的复杂性。你是否见过错误使用模板而引发的编译器错误呢?
- Java注解。Java的注解功能很强大,可以在编译时使用,也可以在运行时执行,既可以用于代码生成,又可以拿来反射。Java中最受欢迎的Spring框架大量使用Java注解。但正因为如此,Java的注解功能导致你写的代码可能超越语言自身的语义,而更像是另外一种语言。而且通过注解实现的代码,调试起来也非常痛苦。
那么Rust的宏是不是完全避免了上面的问题呢?并不是百分百的避免,但是Rust已经努力避免了常见的问题,并且可以发挥出Rust语言自身的优势。作者介绍了声明宏和过程宏的一些优势,并且在文章底部列出了一些学习宏的资料。
使用Rust开发跨平台组件的新策略
Mozilla工程师最新分享,将Rust实现的核心业务逻辑封装到一个中间层,然后通过新的共享策略,达到Web、iOS、Android三端共享。实施这个策略遇到的一个问题就是如何安全地使用FFI,并且还能与Rust的所有权良好地配合。因此该团队写了一个ffi-support库来帮助达成此目的。
该库最初的实现方案是通过序列化为JSON字符串在FFI中传递。但是缺点是,JSON序列化和反序列化会很慢。最重要的问题是,Java中字符串编码是UTF-16-ish。在Kotlin中,必须反序列化每个数据结构,这个过程会可能会发生异常。最严重的问题是,没有返回JSON字符串,而是某个C指针,忘记更新Kotlin中或者ObjectiveC中的数据结构,导致严重的内存问题。
值得庆幸的是,团队发现了使用Protocol BufferV2替代JSON,可以解决上面的问题。在Rust中直接使用prost库,可以通过Rust的宏生成非常干净的结构。而且,PB比JSON的性能高。
Atom 1.36选用了ripgrep
使用Ripgrep极大地提升了Atom项目内查找的性能,在文件量很大的情况下尤为明显。不过需要专门通过设置使用Rip Grep
选项手动打开。
Mozilla 準備跟一些"合格"的Linux使用者測試 WebRender
現在Linux使用者可以手動開啟WebRender了
這是一個實驗特性
他可以開啟rust寫的gpu渲染程序
給"合格"的Linux設備使用
ndarray-stats v0.2 发布
此库为 ndarray 的 ArrayBase
类型提供了统计方法。
到目前为止,Scipy.stats (Python)
和 StatsBase.jl (Julia)
中的大部分统计特性都已经移植过来了。用 Rust 做机器学习的同学是不是可以上手了?
本库作者还邀请大家一起来讨论这个库的未来走向,好机会。
学习资源
如何为TiKV做贡献
Rust编程之道 关于闭包和所有权相关规则
读者frostRed和Yim先后总结出来的规则,大家可以参考讨论。
在随书源码选择「精选」label也可看到。
Rust和Actix-web基本Web编程
使用Actix Web进行人脸检测
这是上次日报里报道过「使用tensorflow与rust人脸检测」文章作者的续篇。在这篇内容里,作者介绍了如何将上一篇文章的成果通过HTTP API来提供。并且作者使用了actix-web = "1.0.0-alpha.4"
版本。在mtcnn库的actix-web分支里可以看到具体实现。
这两篇文章是实践性很强的文章,建议大家跟着玩玩。
「系列博客」 Rust与科学计算 Part 2: 数组
该作者的日常工作是机器学习,他在多次使用Rust进行相关的实验之后发现,Rust语言在这个领域将大有可为,并让他感觉非常激动。作者反观了Python统治下的机器学习世界,其生态系统爆炸的原因是因为有很多基础库,比如NumPy,SciPy,Pandas等。大多数项目是构建在NumPy和SciPy之上。如果Rust也拥有这些核心的基础库会怎么样?抱着这样的想法,作者加入了维护ndarray库的队伍中。他贡献了一堆PR之后,诞生了一个独立的crate:ndarray-stats。这个系列的文章,将围绕ndarray来阐述。
「嵌入式Rust」一个TM1637的demo
来自Rust国内社区 @洛佳。查看该Demo项目Readme,有详细的内容说明。
crust - 一个Rust实现的简单C编译器
从头开始写 C 编译器,很好的学习教程。谁在学习编译原理,可以参考参考。
rust-wasi-tutorial
帅气的 wasi 教程 的 rust 实现版本。跟进最新的 wasi 的同学不能错过。
使用actix-web实现魔术登录链接的示例
“魔术链接(Magic links)”是每次需要登录时,Web应用程序都会生成一个新的,唯一的密码,而不是单个长期存在的密码。 然后,Web应用程序会向用户发送一封电子邮件或一条带有登录链接的短信。 此链接包含此唯一密码:短暂共享密钥。
该demo是使用actix-web 0.7。
使用Tokio实现自定义协议(i3 IPC)
该文作者介绍了使用tokio实现i3wm(i3窗口管理器)的IPC接口
「系列文章」Python开发者的Rust教程 Part 2: 所有权和借用
electron-wasm-rust-example: 一个最小化的Electron + WebAssembly (WASM) + 🦀 Rust的示例
「视频」深入WASM和WASI
如何在Rust测试中Mock时间
「系列文章」JavaScript解析和求值
该文作者在之前分享了如何使用Rust实现一个基于状态机的高性能的JS词法分析器。这之后,又开始写系列文章分享他的心得。
- Javascript evaluator part 1: Lexing
- Javascript evaluator part 2: Parser and Basic evaluator
- javascript-es9-parser
使用Sonr构建pub/sub服务器
sonr建立在mio之上的网络库,相比于Tokio来说,更加轻量。
项目、工具与库
BlockLang Installer 是一款专用于部署 Spring boot 项目的自动化安装工具
来自Rust国内社区 @xiaohulu 投稿。
源代码托管在 https://github.com/blocklang/blocklang-installer
BlockLang Installer 安装在应用服务器上,支持:
下载 JDK 和 Spring boot Jar 文件;
安装 JDK;
启动 Spring boot Jar。
功能示意图:
rust-notifica: Rust实现的跨平台系统通知工具
hunter - 终端下的文件浏览器
看起来操作性很高,比linux之前的MC好用多了。本工具受 ranger 和 emacs 启发。
lopdf - 用于操作PDF文档的库
flashback - 将adobe的SWF文件转换为SVG或WASM等格式
转换后,就不需要运行模拟器来执行swf了。开坑不久,可以参与。
simdjson-rs - simdjson库的Rust实现
simdjson 这个库这段时间非常火,因为它确实很快啊,用 SIMD 指令集来加速。这个库是 rust 的实现版本,不是包装版本。
fluid - 一个单元测试库 发布了0.4版本
写人类可读的单元测试的框架。看起来非常不错。
Fact
#[fact]
fn cerberus_has_3_heads() {
number_of_faces("Cerberus").should().be_equal_to(3);
}
Theory
#[theory]
#[case("Cerberus", 3)]
#[case("Hydra", 7)]
#[case("Janus", 2)]
#[case("Normal guy", 1)]
fn each_creature_has_a_correct_number_of_faces(name: &str, nbr_faces: u8) {
number_of_faces(name).should().be_equal_to(nbr_faces);
}
nom-peg: 基于nom实现的PEG解析器生成器工具
和pest类似,但它是基于nom实现的。
Rust实现的IRC机器人
chit: 可在终端查询crate信息的工具
$ cargo install chit
$ chit serde
wasmer: 可执行wasm二进制文件的Python库
ppcp - 带进度条的文件复制工具
cp 的替代品啊。什么都不说了,炫酷上图吧
neat-flappy-bird
NEAT算法玩Flappy Bird(像素鸟) ,群友贡献,棒棒哒!JiaYe(planet0104)