< 返回版块

2019-08-01 11:17    责任编辑:jay

标签:rust, diary

July

Rust

关于Rust依赖安全的最新思考

#RestSec

很高兴有人在帮我们思考这个问题:当一个crate依赖越来越多的crates时,我们有什么办法可以审计它们?

Read More

paperclip: OpenAPI的代码生成工具

#openapi #WIP

0.3发布,支持OpenAPI V2接口。

paperclip

rocket-lamb: 方便在aws lambda上面跑rocket的库

#rocket

rocket-lamb

到目前为止,Rust编译器的速度已经全面提高了30-40%

#Rustc

从2019-01-01到2019-07-17,Rust编译器的速度已经全面提高了30-40%,一些项目的速度提高了45%以上

Read More

HOWTO: mem::MaybeUninit代替 mem::uninitialized

#std

Rust 1.36稳定了mem::MaybeUninit,本帖教你如何使用它来替代mem::uninitialized。使用uninitialized()函数容易出现UB。一般是在FFi的时候需要使用uninitialized(),因为在C/C++中允许创建未初始化的变量,而Rust不允许。

可以参考该贴作者给自己维护的库升级MaybeUninit的PR来查看如何使用。

「视频」使用 RISC-V 和 Rust 来构建安全的系统

#RiscV

rustarok: 适合开发多人快节奏Moba风格游戏的框架

#game

rustarok

「非官方」用于收集Rust孤儿规则设计问题的仓库

#orphan

rust-orphan-rules

Pushrod 0.4.1 发布

#GUI

Pushrod 是一個利用piston_window做GUI库。

Read More

SCalc - 保证不会溢出的计算库

很简单的思路,如果发现溢出了,结果就置为 1。一定程度上,可保证计算安全,不会由于偶然的原因,导致系统崩溃。

比如:

use scalc::SCell; fn main() { let a = SCell::::new(12) * SCell::::new(3); assert_eq!(*a.get_data(), 36); // error_tag will be true in the presence of overflow behavior(s) let a = SCell::::new(std::i32::MAX) + SCell::::new(1); assert_eq!(a.is_overflowed(), true); assert_eq!(*a.get_data(), 1); }

https://github.com/XCH-CEB/xch-project/tree/master/scalc

cargo-cache - 帮助你管理你本地的 registry 缓存

比如会给出这样一个报告。

Total: 3.81 GB 107 installed binaries: 916.89 MB Registry: 163.43 MB Registry index: 156.47 MB 5 crate archives: 6.96 MB Registry: dl.cloudsmith.io 4.18 KB Registry index: 3.21 KB 1 crate archives: 971 B Registry: github.com 1.34 GB Registry index: 98.51 MB 5522 crate archives: 812.62 MB 743 crate source checkouts: 426.25 MB Registry: home 478 B Registry index: 478 B Registry: ship.rs 478 B Registry index: 478 B Git db: 1.40 GB 138 bare git repos: 1.37 GB 6 git repo checkouts: 23.53 MB

还有相关其它配套功能。使用下面命令安装:

cargo install cargo-cache

kmean-rs - 实现 K 均值聚类的小而快的库

这是一个例子:

use kmeans::*;
fn main() {
    let (sample_cnt, sample_dims, k, max_iter) = (20000, 200, 4, 100);
    // Generate some random data
    let mut samples = vec![0.0f64;sample_cnt * sample_dims];
    samples.iter_mut().for_each(|v| *v = rand::random());
    // Calculate kmeans, using kmean++ as initialization-method
    let kmean = KMeans::new(samples, sample_cnt, sample_dims);
    let result = kmean.kmeans(k, max_iter, KMeans::init_kmeanplusplus, &mut rand::thread_rng());
    println!("Centroids: {:?}", result.centroids);
    println!("Cluster-Assignments: {:?}", result.assignments);
    println!("Error: {}", result.distsum);
}

https://github.com/seijikun/kmean-rs

Rust in Action 新增了几个 rust 项目:

  • a CPU emulator
  • an NTP client
  • a basic grep
  • your own floating point format
  • a memory scanner
  • UNIX signal handling
  • setjmp/longjmp control flow
  • binary files inspector
    Read More

sled 将要发布新版本

sled 将要发布新版本,下面是新版本中的一些特性:

  • atomic writebatches
  • higher write throughput & lower tail latency
  • much faster initial startup time for short-lived programs
  • CRDT-based multithreaded recovery support
  • fewer dependencies
  • API closer to #rustlang std
    Read More

用 Rust 和 OpenGL 实现的屏幕拍摄应用

#rust

@nasso4991把他老版本的屏幕拍摄应用使用 Rust 重写了,第一个版本是用 C 和 SDL2 实现的,新版本使用了 Rust、OpenGL 和 glium crate。

Repo

Read More

Blog Post: Unsafe as a Human-Assisted Type System

read more

sauron 0.10.0 web framework (rust nightly)

更新了效能改善與語法改動。

read more

Rust 碎形程式

裡面有個短片與源碼,可以看到不斷放大的碎形之美

read more

zoet - 一个帮助实现常用 Trait 的过程宏库

像下面这个样子:

#[zoet]
impl Wossname {
    // The impls are often the same, so share them!
    #[zoet(Asref, Borrow, Deref)]
    fn deref(&self) -> &Inner { /* ref-to-ref conversion code */ }

    // No having to remember the associated types on IntoIterator!
    #[zoet(IntoIterator)]
    pub fn iter(&self) -> Iter { /* ... */ }
    #[zoet(IntoIterator)]
    pub fn iter_mut(&mut self) -> IterMut { /* ... */ }
    #[zoet(IntoIterator)]
    fn into_iter(mut self) -> IntoIter { /* ... */ }
    
    // ...
}

不过,俗话说,写宏一时爽,读宏火葬场。请看官自行斟酌。

Repo

网页上的 SPH 流体模拟器

SPH(smoothed-particle hydrodynamics) 光滑颗粒流体动力学 :D。

作者用 Rust 写了一个模拟这个的库,在网页上运行。效果真棒。

Demo online
Repo

哪些 unsafe 代码可以被替换为安全代码

Rust 安全代码工作组(非官方)搞的一个仓库,供人们讨论可以替换为safe代码的unsafe代码

Repo

atomig - 一个辅助使用 Atomic 类型的库

目的是让使用标准库中的 Atomic 类型更方便。比如下面这样子:

// Requires the 'derive' feature:
//     atomig = { version = "_", features = ["derive"] }
use atomig::{Atom, Atomic, Ordering};

#[derive(Atom)]
#[repr(u8)]
enum Animal { Dog, Cat, Fox }

let animal = Atomic::new(Animal::Cat);
animal.store(Animal::Fox, Ordering::SeqCst);

#[derive(Atom)]
struct Port(u16);

let port = Atomic::new(Port(80));
port.store(Port(8080), Ordering::SeqCst);

Repo

用 Rust 制作游戏服务器

在这里

用 Rust 实现 Mandelbrot 集

炫酷的视频效果在这里

Http状态检查器

检查 Http 的返回状态,其实主要是配合 Prometheus 使用的。

Repo

attribution - 辅助写过程宏的过程宏

听起来有点绕口,就是帮助你写过程宏的一个库。主要是提供了方便的解析属性的功能。

Repo

一个 Conway 生命游戏练习

img

Repo

Siderophile: 暴露你crate中的不安全性

#unsafe

(这名字起的好:Sidereophile,噬铁菌,对金属有亲和力)

Siderophile会发现你代码中的unsafe代码,并且会给这些代码进行安全性排序,辅助你进行模糊测试。

async-trait: 为trait提供async fn支持

#async

async/await将在Rust 1.38中稳定,但是还不会支持trait中的异步方法,所以,dtolnay做了这个库,提供了一个属性宏#[async_trait]来满足这个功能。

#![feature(async_await)] use async_trait::async_trait; #[async_trait] trait Advertisement { async fn run(&self); }

async-trait

「系列」RSoC: 为Redox实现ptrace: Part 5

#Redox

Read More

radix64: 全功能的base64库

#base64

它的目标是全功能、易用且采用AVX2加速,所以如果编码/解码大块数据(如何机器支持AVX2),它会非常快。

radix64

quickjs-rs: Quickjs Javascript引擎的Rust包装

#quickjs

quickjs-rs

cargo-bloat 0.8 发布

#cargo

cargo-bloat 是一个可以帮助你缩减crate大小的库。新的版本有意思的是,cargo-bloat用cargo-bloat缩减了自己,结果令人满意:大小缩减了5倍,性能提升了10倍。

Read More

chttp 0.5 发布

#async

chttp是一个http客户端,最近全面升级为async/await,并且改进了API。适合学习async/await

Read More

bastion: 容错运行时

#supervisor

Rust实现的一个类似于Erlang里的监督树,使用它来启动自动监督的任务。

bastion

Cargo-release 0.12 发布

#cargo

新版本提供了Workspace的支持。cargo-release是一个类似于Go语言社区的一个分发工具GoReleaser。

Repo

heim: 用于获取系统信息的跨平台异步库

#async

heim是在Rust crates生态系统中用于获取系统信息(例如,CPU、内存、磁盘或进程统计信息)的最佳工具。它的目标是最终至少具有与psutil、gopsutil或oshi相同的功能。

Abscissa: 面向安全的Rust应用框架

#security

用于构建Rust应用程序(CLI工具、网络、Web服务)的微框架,非常注重安全性。可能一些区块链应用在用它。

grue-rs: RPG 角色名字生成器

#game

siderophile - 暴露你的包中的不安全代码

可以看作一个代码审查辅助工具。不能完全保证找出所有不安全代码,但可以成为一个有效的生产力工具。会根据不安全代码的使用进行评分,给出一个报告:

Badness Function 
 012 molasses::crypto::hash::HashFunction::hash_serializable 
 005 molasses::crypto::hash::HashContext::feed_serializable 
 003 molasses::utils::derive_node_values 
 003 molasses::application::encrypt_application_message 
 003 molasses::application::decrypt_application_message 
 003 molasses::group_ctx::GroupContext::new_from_parts 
 003 molasses::group_ctx::GroupContext::from_welcome
 003 molasses::group_ctx::GroupContext::update_transcript_hash 
 003 molasses::group_ctx::GroupContext::update_tree_hash
 003 molasses::group_ctx::GroupContext::update_epoch_secrets 
 003 molasses::group_ctx::GroupContext::apply_update 
...

Read More

Repo

tgconnector - 一个电报连接器

可以用来与电报机器人进行交互。

Repo

Torch 神经网络框架现已在 Rust 中可用

#rust

下面一篇教程介绍了如何在 Rust 中通过 tch-rs 使用 Torch 神经网络

Read More

mask,一个通过 markdown 配置的任务运行工具

#rust #cli

编写 markdown 文件,通过 mask 运行文档中的任务,目前支持 node、bash、python、php、ruby。例如:你可以配置一个 server 任务和一个 snapshot 任务,让 python 运行 web 服务,让 node 运行 puppeteer 为每一个页面生成一张 png 图片。

Read More

正在想要不要使用 unsafe 吗?可以考虑下 zerocopy

#unsafe

zerocopy 可以为具有的某些属性的类型提供标记 trait。例如,将任意字节序列(正确长度)解释为类型的实例是安全的。 它还提供了多个 derive,自动分析的类型并确定它是否符合标准。它提供了零成本抽象,允许开发者在原始和类型字节表示之间进行转换,解锁“零拷贝”解析和序列化。 到目前为止,它已被用于网络数据包解析和序列化,图像处理,操作系统程序等。

它最初是为网络堆栈开发的,作者去年就此进行了讨论,因此,他们的项目具有零拷贝解析和所有数据包的序列化功能,而整个25K行代码仓库只有一个 unsafe 关键字。

Read More

开启流水线编译成为默认设置

#rustc

可能下下下一个正式版就有机会用到了

read more

Abscissa:面向安全的Rust应用程序框架

#cli #rust

Abscissa 是一个小型的程序框架,它提供了 cli 程序的基本功能

  • cli 指令解析
  • TOML 配置
  • logging 记录
  • 错误处理
  • 组件特性(类似ECS)
  • REPL,彩色界面

read more

编译器速度提升

#rustc

今年到目前为止,编译器速度已经提高了30%~40%,一些项目的提升率达到了45%以上。

本周的 Rust weekly 有一篇关于提升编译器速度的文章,可以看看。更多讨论请点击下面的链接。

read more

Ballista:集成了Rust、 Apache Arrow 和 Kubernetes的分布式计算平台

#k8s #Arrow

DataFusion的作者新的项目,目前是PoC(概念验证)阶段。

advisory-db: RustSec组织发布的安全告警数据库

#RustSec

advisory-db

silicon: 为你的源码创建漂亮的图片

#Carbon

有一个网站叫Carbon,可以创建漂亮的代码图片,而silicon是该功能的Rust实现。

img

lain: 一个模糊器框架

#fuzzer

lain

用Rust编写的Redis内存分析器

#redis

redis-analyzer

CactusRef: 一个单线程、周期感知、引用计数智能指针

#rc

是Rust标准库中Rc的一个替代品

Read More

一个尚未发布的 cli 工具

#rust

编写markdown文档,通过命令运行文档中脚本语言编写的程序,目前支持 node、bash、python、php、ruby。

Read More

RustyBoy - 一个时钟精确的 Gameboy 模拟器

先来看一下 demo

img

Repo

lemmy - 一个用 rust 实现的类 reddit 项目

这套系统 rust.cc 能不能直接拿来用呢?

img

Repo

silicon - 为你的代码生成漂亮的分享图片

实际是借鉴的 carbon 库。来看看效果:

img

Repo

cargo-crev v0.8 出了

值得注意的是,此版本引入了User Guide跟其它文檔

其它改動

  • verify deps 改成 verify
  • 關閉草稿編輯器時沒有存檔𤡈的話將移除記錄。
  • advisories 系統進行了改造

read more

AiC: 無限工作佇列和語言設計

這篇文章在講Rust的工作量太大,想做的事太多,

這些工作該怎麼管理,有些工作應該被重新考慮,並審查有限的資源該投入在哪些工作上。

RFC的初始設計。 這是由語言團隊完成的。

有些RFC存在五年是因為這個想法很好,但是缺少資源去實作, 且優先級別不夠高。

作者也提到可能會需要設定一些限制,不要讓要做的事無限增加。

read more

golomb-set - 比布隆过滤器压缩率更高的库

Golomb-compressed sets(GCS)是一种空间利用率很高的数据结构,可以用于判断一个元素是否属于这个集合。它与 Bloom Filter 非常类似,区别是它的压缩率更高,同时查询效率更低。同样,GCS 也有将原本不属于集合的元素误判为属于的可能(false positive)。

这个库为 Rust 实现版本。

Repo

derive_destructure: 支持对实现Drop的结构进行解构

#macro

let (field_1, field_2, ...) = my_struct.destructure();

上述代码字段会被Move。该库由unsafe Rust实现,谨慎使用。

derive_destructure

Hashcow: 一个带有写时复制KV的Rust HashMap实现

#hashmap

Hashcow

maybe-uninit: 为所有Rust版本支持MaybeUninit

Rust最近发布的1.36.0版本带来了一个MaybeUninit Union类型,它允许更安全地处理可能未初始化的数据。 这样的数据结构非常棒,但很多crate的MSRV策略可以追溯到很多,并且可能会犹豫是否放弃std::mem::uninitialized以支持这个非常新的API。对于这些用户,可以使用maybe-uninit crate,它将MaybeUninit的带到所有版本的稳定Rust中,从1.0.0开始。

Read More

Debian 10发布,包含ripgrep,fd-find,exa,hexyl,process-viewer几个Rust实现的命令行工具

#Debian

Read More

Google的CodeSearch服务支持Rust代码搜索

#codesearch

基于Rust的ripgrep和google的re2正则引擎构建。

Read More

hunter - 终端下的文件浏览器

#ranger #file_browser #cli

看起来操作性很高,比linux之前的MC好用多了。本工具受 ranger 和 emacs 启发。 (之前日报也推过)

hunter

Hunter

bin_io: 一个读写二进制文件的框架

#nom

类似于nom,但是它提供了读写功能,作者自己称:是nom的小兄弟。

bin_io

Rust标准库中array impl用上了const generics

#Rust #std #const_generics

Read More

神器 flamer

flamer 是这样一个魔法东西,它可以方便地计算出你代码块的耗时。

基本方法,就是在你的代码/函数头和尾(自动)插入计时代码,最后汇总出一个耗时(报告)。用到了 nightly 的自定义属性,所以暂时只能以 nightly 版运行。看下例子:

extern crate flame;

use std::fs::File;

pub fn main() {
    // Manual `start` and `end`
    flame::start("read file");
    let x = read_a_file();
    flame::end("read file");

    // Time the execution of a closure.  (the result of the closure is returned)
    let y = flame::span_of("database query", || query_database());

    // Time the execution of a block by creating a guard.
    let z = {
        let _guard = flame::start_guard("cpu-heavy calculation");
        cpu_heavy_operations_1();
        // Notes can be used to annotate a particular instant in time.
        flame::note("something interesting happened", None);
        cpu_heavy_operations_2()
    };

    // Dump the report to disk
    flame::dump_html(&mut File::create("flame-graph.html").unwrap()).unwrap();

    // Or read and process the data yourself!
    let spans = flame::spans();

    println!("{} {} {}", x, y, z);
}


------------------------

extern crate flame;
#[macro_use] extern crate flamer;

#[flame]
// The item to apply `flame` to goes here.

Repo

snoopy - 一个可高度配置化的多线程网络包嗅探分析工具

Rust 作这类工具太适合不过了。

➜ sudo snoopy capture run                                          
--------------------
Sniffing  wlp3s0
-------------------- 


Source IP              | Source Port  | Dest IP                | Dest Port    | Protocol     | Length       | Timestamp            |
------------------------------------------------------------------------------------------------------------------------------------
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 10078        | 1562310108.589373                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 54           | 1562310108.589468                  
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 10078        | 1562310108.890490                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 54           | 1562310108.890547                  
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 1486         | 1562310109.197739                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 54           | 1562310109.197795                  
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 1486         | 1562310109.197841                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 66           | 1562310109.197865                  
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 2918         | 1562310109.197887                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 74           | 1562310109.197906                  
52.216.185.195         | 443          | 10.20.197.103          | 38522        | Tcp          | 1486         | 1562310109.197965                  
10.20.197.103          | 38522        | 52.216.185.195         | 443          | Tcp          | 74           | 1562310109.197984                  
35.154.102.71          | 443          | 10.20.197.103          | 56572        | Tls          | 160          | 1562310109.262324                  
10.20.197.103          | 56572        | 35.154.102.71          | 443          | Tcp          | 66           | 1562310109.262383                  

Repo

yarte - 号称最快的模板渲染引擎

采用 handlebars 语法。作者说它是 Rust 界最快的模板渲染引擎。

Repo

Analysis of Rust Crate Sizes on crates.io

有人寫了一個程式可以分析crates.io 裡面庫的大小

read more

tiny-keccak 1.5.0

Keccak是一種多功能的加密函數。

tiny-keccak是一個有基本加密函數的庫。

這次新增了 big-endian平台支持

與 KangarooTwelve哈希函數的支援

read more

d-macro

用 d! 取代 dbg! 讓你得到更多debug資訊

read more

hazptr - 動態無鎖內存回收

三個月前曾發佈第一版

現在的API跟 crossbeam-epoch 很類似,方便與 crossbeam 的組件合作。

read more

构建C(ABI) Like的Rust库

#C(ABI)

该文介绍了一个小工具cargo-c,帮助开发者改善Makefile和build.rs的开发体验。

Vector: 为logs, metrics, 和 events提供收集、转换和路由的开源工具集

#timberio #log

Timber.io是一家提供日志服务的SaaS厂家。Vector是一种高性能的可观测数据路由器。它使得收集、转换和发送日志、性能指标和事件更加容易。它将数据收集和路由从应用服务中分离出来,使开发者能够控制和拥有数据,还有许多其他好处。它编译成一个静态二进制文件,并被设计为部署在整个基础设施上,既充当轻量级代理,又充当高效的服务,使从A到B的数据获取过程简单而统一。

TLS 性能: rustls vs OpenSSL

#tls #openssl

rustls是一个现代的Rust实现的TLS库。

结论:

rustls发送数据快15%。
rustls接收数据快5%。
建立客户端连接会快20-40%。
建立服务器连接会快10%。
恢复客户端连接会快30-70%。
恢复服务器连接会快10-20%。
rustls使用的内存不到OpenSSL的一半。

serenity: Discord API的Rust客户端

#Discord

serenity

librespot: 开源的Spotify客户端

#Spotify

librespot

「Redox编程之夏博客系列」:为Redox OS实现ptrace Part 2

#RSoC

目前是本系列第三篇。

ptrace (process trace)系统调用通常与调试相关,它是本地调试器监视类unix系统上调试的主要机制,同时也是实现strace系统调用跟踪的常用方法。

Read More

std::time与Runtime库

#runtime

Runtime库的成员正在考虑为其增加时间支持,本文讨论了std:time模块,以及可以为无缝集成runtime工作流而进行的一些更改讨论。

Read More

termimad: 可以在显示富(Markdown)文本的库

#cli #markdown

img

termimad

Rust vs Haskell 正则性能比拼

#haskell #regex

haskell-vs-rust-regex-benchmark

优化jieba-rs,比cppjieba快33%

#jieba

Read More

使用nix-shell为Termux编译Rust应用程序

#termux #nixShell #android

NixOS平台上为安卓手机交叉编译Termux(安卓手机上的终端)

Read More

diffr: 一个diff高亮工具

#git #cli

diffr



##: 区块链

indy-sdk: indy SDK实现

#indy #hyperledger

Hyperledger Indy(超级账本)官方发布的Rust SDK。

Hyperledger Indy是特别为去中心化的身份而建立的一种分布式账本。它提供了基于区块链或者其它分布式账本互操作来创建和使用独立数字身份的工具、代码库和可以重用的组件。

indy-sdk

Rust在区块链中的应用 Topic 申请表

#topic

如果你在San Francisco, Berlin 或 杭州,想要分享Rust在区块链中的应用,可以填一下这个申请表

Read More



Learning

知乎专栏【CPP工程师的Rust迁移之路】

#rust

知乎网友@黄珏珅开设了本专栏,主要针对对 Rust 感兴趣的 C++ 工程师,介绍了完成相同任务 C++ 和 Rust 中的异同,感兴趣可以专注专栏,目前已经有两篇文章:

Read More

Rust 实现的游戏服务器

#rust

@ardawan 用 Rust 实现的游戏服务器,目前还没有开源,评论中期待开源的呼声很高。

Read More

使用 Rust 实现 Gameboy 模拟器

#rust

@douglascorrea 要在 YouTubeTwitch 直播他实现 Gameboy 模拟器的过程,他认为“公开曝光有助于避免拖延症”,所以他选择了直播。

Read More

「视频」facebook Libra听证会关于为什么选择Rust语言的两分钟精华问答

#video #libra

Read More

已经用上 wasm 技术的一些网站

这里列举一些,不完整,会不断增加

Rust Unsafe:把它们看作公理和定理

这篇文章https://iandouglasscott.com/2019/07/26/rust-safe-and-unsafe-as-theorems-and-axioms/ 作者从另一个视角来探讨了 Rust 中的 unsafe 的概念,他建议,可以将 Rust Unsafe 类比看作数学上的公理和定理。基于这个观点,做出了详细的剖析。详情请看原文。

Bayes-O-Matic - 帮助你对一些问题做贝叶斯推演的一个Webapp程序(用wasm实现)

演示地址在这里:https://vberger.github.io/Bayes-O-Matic/

讲解文章在这里:https://vberger.github.io/Bayes-O-Matic/help.html

使用動態規劃解決找錢問題

給rust初學者參考

read more

「用Rust写前端系列文章」如何模块化你的Rust前端

#yew

该文教你用Yew的函数和组件来模块化代码。

Read More

「系列」棒球编程与Rust 2

昨天出的第一篇文章,今天出的第二篇,接着昨天的写。初学者可以仔细跟着做一下,很好的入门教程。

Read More

「系列」棒球编程与Rust

#Rust

到底Rust是否适合小白?本文算是一个答案。

本文作者不是一名程序员,他从去年开始想要创建一个自己的个人棒球数据基础设施,所以想自学一门编程语言,后来选择了Rust。这之前他也了解过R/ Python,来看看他写的两篇文章,看看他如何理解Rust,以及他如何通过类比棒球比赛(代码示例)来理解Rust的所有权。

(我看他这两篇文章写的一点儿都不像是个零基础刚入门的小白)

Read More

不同语言中的泛型和元编程模型

#Metaprogramming #Generics

该文作者比较了Go、Rust、Swift和D等语言中的泛型,以及阐述了这些语言中如何实现泛型。

Read More

位向量与可变长度编码

#BitVectors

作者在写压缩算法,这篇文章是作者学习使用位向量进行可变长度编码压缩算法学习过程的记录。

Read More

建议: 学Substrate前先系统学习一遍Rust语言

#substrate

最近发现学习Substrate(Polkadot出的区块链框架)的人越来越多。今天有人问我一个问题,刚开始看的我一头雾水(对方截图代码如图1),又像Rust又不像Rust。问了他相关代码上下文之后,发现完整代码是一个宏(图2)。 我有点担忧。想起了10年前Rails流行的时候,很多人把Rails的DSL认为是一种语言,而完全不懂得Ruby了。

对此,我只想说,磨刀不误砍柴工。建议Substrate的爱好者先把Rust系统性地学一遍,再看substrate将会事半功倍。

img1img2

tch-rs: PyTorch的Rust绑定

#ML #PyTorch

同时也有篇文章介绍了如何基于tch-rs和Rust来使用PyTorch。

Unsafe的魔力

#unsafe

最近关于Actix中unsafe的讨论沸沸扬扬,该文作者特地写了一篇针对Unsafe的文章,来引导大家正确认识Unsafe。 最终作者提到几点:

  • Unsafe并不容易。我们应该承认并尊重Unsafe的复杂性。
  • 请记住,Unsafe的范围远远超过了unsafe块的界限。
  • 当你必须使用Unsafe时,请不要放松警惕。你在用FFI的时候无法避免地会使用Unsafe,没有人会因为你在那里使用它而责备你。但这并不能免除你调整外部库的语义用来适应Rust代码的责任。
  • 如果想用Unsafe来优化代码,那么务必要做到这一点:在使用Unsafe优化之前,先测试代码性能。
  • 使用注释来记录你对Unsafe代码的不安全假设。
  • 保守地使用Unsafe,不要随心所欲,这样只会增加自己和别人的负担。
  • 当看到别人写Unsafe代码的时候,该如何做? 不要放过UB出现的可能性,但你完全可以拥有一次愉快的交流。

Read More

构造函数的危险

#Constructors

这篇文章里作者讨论了构造函数的危险性,以此可以明白Rust为什么放弃构造函数。

Read More

Gotham : 从零开始实现一个Web应用且部署到Heroku

本文介绍了如何使用Tera模板系统、Webpack、最小的VueJS和CoffeeScript、Gotham创建一个小应用,并部署到Heroku。

Read More

treelike - 一个用于方便地实现树结构的辅助包

它提供了一个 Treelike trait,实现其中的两个方法 content()children() 即可。

作者是在在多个项目中重复写树实现得出的灵感。赞一个!

Repo

slice-group-by - 对 slice 进行分组的库

非常 Nice。第一眼就爱上了。

use slice_group_by::GroupBy;

let slice = &[1, 1, 1, 3, 3, 2, 2, 2];

let mut iter = slice.linear_group_by(|a, b| a == b);

assert_eq!(iter.next(), Some(&[1, 1, 1][..])); assert_eq!(iter.next(), Some(&[3, 3][..])); assert_eq!(iter.next(), Some(&[2, 2, 2][..])); assert_eq!(iter.next(), None);

use slice_group_by::StrGroupBy;

let string = "aaaabbbbb饰饰cccc";

let mut iter = string.linear_group_by(|a, b| a == b);

assert_eq!(iter.next(), Some("aaaa")); assert_eq!(iter.next(), Some("bbbbb")); assert_eq!(iter.next(), Some("饰饰")); assert_eq!(iter.next(), Some("cccc")); assert_eq!(iter.next(), None);

Repo

又一篇《理解生命周期》

初学者可以多看看。

Read More

《Rust编程语言》新版已经在印刷了

#book #rust

这本书是 Rust "圣经"的纸质版,可以在线阅读。推特别特感谢 @Carols10cents 为这本书作出的卓越贡献。

Read More

heim - 获取系统信息的工具项目

这个项目用于,跨平台,获取系统基本信息,比如 cpu,内存,磁盘,网络等等。

heim是德语“家”的意思。开发作者专门开了一篇博客,详细讲述他要做什么。老外做事情真是踏实。

Read More
Repo

关于使用 mem::MaybeUninit 替换 mem::uninitialized 的一个示例

1.36 发布后,Rust带来了一个 mem::MaybeUninit,可以更安全地处理未初始化的数据。而 mem::MaybeUninit 可以替代 mem::uninitialized,为什么?下文给出了说明和一个示例:

Read More

2019,Rust如何提高编译器速度

Rust 核心组开发人员 Nicholas Nethercote 详细罗列了 2019 年可以做的用于加速 Rust 编译器速度的事情。

Read More

Rust的可测试组件设计

#TestableComponentDesign

本文简单介绍了在Rust中编写一个工程性更强的组件(crate)所必须要遵循的一些原则:

  • 自动化测试覆盖
  • 需要可配置的依赖
  • 公共api应该更加易于使用和理解
  • 契约层应该尽量减少泛型的使用
  • 其他

Read More

从futures 0.1迁移到0.3

#TiKV #futures

nrc 最近为TiKV的客户端从futures的0.1升级到了0.3,本文记录了该过程中他遇到的一些棘手的问题等。想了解0.1和0.3之间的一些区别,可以看看此文。

使用Yew和Rust进行全栈Web开发

#yew #wasm #web

Read More

2019年如何提升Rust编译器性能

#rustc

该文作者最近给Rust发了很多PR,用于改进Rust编译器的性能,该文是他对这些PR的一些梳理总结,记录了他提升Rustc编译性能的思路。

Read More

存在于Rust中的函数式编程“黑话”

#functional

本文档使用Fantasy Land规范(JavaScript)和Rust编程语言中定义的术语来提供代码示例,讲解了Rust中存在的函数式语言编程中的“黑话(术语,Jargon)”,很难得的一份学习材料。

Fantasy land(梦幻之地 )不仅包含大量的函数式编程模块,还包含有关如何实现“代数结构”(也称为对象)以与库兼容的正式规范。将此作为标准会很棒。

「新手向」Rust vs C++ : 实现神经网络

#ml #cpp #neural

这篇文章其实是一个Rust新手在尝试使用Rust和Cpp编写一个朴树的神经网络来重新学习Rust。作者在2014年第一次学Rust,但是后来就放下了,五年后的今天想尝试使用Rust,这个项目是他复习Rust所做的。

感兴趣的可以看看源码学习学习如何使用Rust实现一个简单的神经网络。

Read More

「学术」用类型指针反转进行高效解构

#paper

本文说明了一种转换任意数据结构析构函数的技术,使它们在恒定的堆栈和堆空间中运行。听上去不错,可惜的是我还没看明白。。。

Read More

Ralfj: 未初始化内存

Ralfj: 未初始化内存

#memory #unsafe

Ralfj的新博文,探讨了未初始化内存。你真的了解什么是未初始化内存吗?来看看Ralfj怎么说。

Read More

cedarwood: 高效可更新的双数组前缀树(Double-Array Trie)

#jieba

该库旨在为jieba-rs提速。

双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现,兼顾了查询效率与空间存储。

面向数据设计(Data-Oriented Design)的一些学习资源

#DOD

Read More

「学习rust」写了3万行rust代码后的心得

#article

作者分享了他在写了3万行 rust 代码后的心得,文中包括学习 rust 的十个关键,正在学习 rust 的小伙伴可以去看看,文中推荐了其他文章,可以一起看。

Read More

为 Redox OS 实现 ptrace

Redox OS 还在坚持不懈的开发。这篇文章讲解了为 Redox OS 实现 ptrace 的细节。

img

cedarwood - 提升 jieba-rs 分词效率

用双数组字典树实现,尝试并提升了 jieba-rs 的分词效率,点击下面链接阅读详情。

Read More
Repo

從Java的角度來思考 Rust的Web應用程序

作者提到了 docker 讓虛擬容器變的很普遍,但java的虛擬機開銷很大

作者目前只有看到 actix 好像還不錯,但他對這個框架還不夠了解,

不知道能不能做到過去他在java裡面做的事情,目前他還在研究中

read more

Rust哪邊不安全?

作者提到 unsafe 關鍵字讓很多人誤解了 rust 在 unsafe裡面很不安全,

其實 unsafe 裡面還是有做很多檢查,這篇文也比較了 python 與 rust 的內存安全差異。

文章列舉了 safe 範圍的 rust做了什麼樣的保證, unsafe 的rust做了什麼樣的保證,

與程式員需要做出相對的契約保證。

如果你想讓你的程式更安全、更好維護那這篇文章值得一看。

read more

一節 Rust社群語音 1.36特別篇

對下面議題有興趣的可以聽聽

4:27 - std::future
11:29 - std::task
14:22 - the alloc crate
18:52 - std::collections::HashMap and hashbrown
22:50 - std::mem::MaybeUninit and the deprecation of std::mem::uninitialized (mentioned: Error::type_id destabilization and std::pin discussion)
36:24 - NLL for Rust 2015 (mentioned: MIR)
44:45 - cargo --offline and cargo fetch
46:50 - ongoing stdlib constification
47:25 - read_vectored and write_vectored
49:05 - Iterator::copied
49:58 - dbg! enhancements
51:19 - #[must_use] for is_err and is_ok

read more

rusty-pipes: 使用Azure 輕鬆 CI Rust項目

作者分享了用 Azure Pipelines app 配上CI 整合進他們的產品中。

read more

書: 現代編譯器實作在現代語言

Modern Compiler Implementation in ML

這本書裡面講了一個tiger語言

本文作者實作了第一章的一部份

read more

这样写异步递归行不行?

像下面这样写递归现在是不行的。

async fn foo(n: usize) {
    if n > 0 {
        foo(n - 1).await;
    }
}

这里给出了一些解释。大体上说是异步函数编译成状态机后的一些限制,balabala,可以进帖子查看。

static-alloc

这个库用于分配一个全局固定存储,特别适合嵌入式设备使用。库刚刚发布,感兴趣可以参与进去。

Repo

用 Rust 点亮树莓派上的 LED 阵列

直接上图:

img

细节可在下文中追寻。

Read more

关于 Rust 能否用在(高频)交易系统中的相关资料汇集和讨论

在这里 Possible Java to Rust switch for a securities trading platform

希望有助于致力于把 Rust 用在金融领域的同学。

Loopy Bayes Net 的 Rust 实现

loopybayesnet 是一个 Loopy Belief Propagation 算法的 Rust 实现。属于神经网络/深度学习领域的算法。关于它与 Bayesian networks 的区别:

Bayesian networks can be used to encode a set of causal or logical probabilistic dependency between events. They take the shape of directed acyclic graphs, each node being associated with a probability table defining the probability of it taking each possible values depending on the values of its parents. For further details, you can check Wikipedia.

The Loopy Belief Propagation is an algorithm that computes an approximation of the marginal probability distribution of each node of the network, conditionned by the value of a chosen set of "observed" variables, for which the values are set beforehand.

「个人心得」从Clojure转到Rust的几个原因

#clojure

一个9年的Clojure资深开发者写下了他喜欢Rust的原因:其实和大家喜欢Rust的原因一样。

感兴趣的可以去看看。

Read More

cargo offline功能指南

#cargo

使用--offline意味着Cargo不会更新其索引。 Cargo将使用缓存索引重新解析依赖关系图,并且更喜欢使用已缓存的crates版本。 如果可以只使用缓存的crates,那么就可以在不触及网络的情况下进行构建。

同样,在添加新依赖项或启动新项目时,如果没有--offline,cargo build将更新索引,但使用--offline意味着Cargo将使用缓存索引并尝试使用已在本地缓存的crates。

Read More

Rust的模块与文件

#module

没有搞清楚模块和文件关系的可以看看这篇文章。

Read More

使用GTK和Rust的加速桌面应用程序

#GTK

Read More

「系列」std::alloc 指南

#alloc

std::alloc在1.36稳定版中发布,这篇文章较为详细的介绍了std::alloc。总之,可以自定义自己的全局内存分配器。

Read More

「系列」使用Rust和GTK绘图 Part I

#GTK

作者对于Rust和GTK都是新手,这是他的学习心得记录。

Read More

Rust中模拟高阶类型的方法

#Higher-KindedType

该文作者提出了一种方法,通过类型参数向下转换泛型trait来模拟当前Rust中的高阶类型/泛型关联类型,并且提供了使用该方法在Rust中创建Functors,Applicatives和Monads的简单示例。

Read More

Rust编译器按配置文件引导优化(Profile-guided optimization,PGO)稳定化支持已经被merge到主分支

#rustc

PGO优化是一种常见的基于概率的编译器优化技术,主要是通过在收集程序执行的profile信息来估算某些代码执行的频率来进行优化。

Read More

給 C++ 程式員的Rust教學影片

read more

「学术」介绍oars:用于处理正交数组的库

#OrthogonalArray

正交数组:一个具有特殊的数学特性的二维数组,例如,数组中的任意两列都包含了所有可能的、由数组的任意值组成的对值。

Read More

RVirt: 用Rust编写的RISC-V管理程序

#riscv

由MIT并行和分布式操作系统小组出品

RVirt

使用Rust和Zig编写小的光线追踪程序

#zig

作者出于比较Zig和Rust哪个更适合编写小型的图形应用的目的,分别使用这两种语言实现了一个小的光线追踪程序。所以,作者的结论是:

Rust和Zig他都非常喜欢,以后做大项目就用Rust,做点自己的小项目用Zig。

Read More

理解闭包

#closure

本文是一篇介绍闭包的文章,在学习中的朋友可以看看

Read More

「Rust标准库研究系列」内部可变性

#study

该系列文章记录了作者对Rust标准库的一些学习心得。

Read More

Rust中的生命周期

#study

该文通过示例记录了作者学习Rust生命周期的一些心得

Read More

sozu:HTTP 反向代理实现

#ReverseProxy

sozu是一个Rust实现的反向代理库,该文作者写了一篇关于sozu的文章。

「系列文章」使用Rust实现光线跟踪 Part3

#RayTracer

Read More

「小书」使用Rust从零开始制作任天堂GameBoy模拟器

#GameBoy

任天堂的Game Boy是曾经最受欢迎的计算机之一,该小书作者说:如果想学习计算机是如何工作的,没有比模拟实现一个计算机更好的学习方法了。

Read More



game

CHIP-8模拟器的Rust移植版本

#CHIP8

该文作者是游戏开发圈的一员,最近在尝试从Cpp到Rust的迁移过程,这个CHIP-8模拟器就是他的迁移实践。本文记录了他的一些心得感想。

计算机语言Benchmarks游戏:Rust在n-body项拿下第一

#benchmarks

据文章中所说,是因为新的测试硬件使用了更先进的AVX-512 SIMD指令。

Read More

使用Rust编写的编程类益智游戏 Robo Instructus 已上架

#Game

使用100% rust (gfx-rs, winit, opengl)开发了该游戏

Site Steam

veloren: 一个类似于我的世界的游戏

#game

对本游戏感兴趣的可以关注它们的周报,已经发了23期

img

Read More



GUI

LGM 2019 – 用 rust 实现 2D 绘图框架

#graphics #rust

libre graphics meeting 是一个图形相关的会议,本次会议 Colin Rofls 和 Raph Levien 一起分享了他们使用 rust 开发绘图框架的过程,如果你正在使用 rust 开发绘图框架,可以点击下面的链接观看视频。

read more

Compactor - Win 10 文件系统压缩用户界面

这种界面风格:

img

Repo

amethyst-starter-2d: 2D游戏开发的新工具

#game #2D

Amethyst出品

使用Rust與GTK 快速開發桌面應用

作者寫了一個丟骰子的範例程式作為教學範例

read more

Pushrod 0.3.5: GUI Library

新增了 基本佈局、水平佈局

修了幾個bug讓速度變快

read more

花一个周末写的光线追踪动画

#raytracing

img

ray-tracing-iow-rust

paperclip: OpenAPI的代码生成工具

#openapi #WIP

0.2发布,支持OpenAPI V2接口。目前还是WIP状态。

paperclip

Winit 0.20 alpha 1 发布,请求测试、审查和贡献

#GUI

Winit是纯Rust Window创建库。Servo和Alacritty都使用了该库。 支持Glutin(或者包括gfx-rs,Glium和Amethyst在内的相关项目)等图形编程。新的版本中引入了新的事件循环。现在因为团队人手缺乏,所以想请求社区的朋友帮助测试、审查和贡献代码。



async

async-injector: Rust的异步反应式依赖注入库

#async

新库,WIP状态。该库是从作者的另外一个项目OxidizeBot(高性能Twitch机器人)中提取出来的。

在Rust中使用异步网络收集广播UDP数据包

#async #UDP

本文是async和tokio的一次尝试,作者写了一个通过UDP广播发现本地网络上的设备的应用,并且介绍了他实现过程中的一些心得。

async-log:使用异步元数据扩展标准日志包

#async #log

这是一个通用的包,它使用异步元数据扩展标准日志包。 这是向Rust引入完整的异步track功能的第一步。

Read More



FFI

C++20 和 Rust 实现推箱子游戏的比较

#rust

@SuperV1234 使用 C++20 和 Rust 分别实现了同一个项目,用来比较这两个语言的优势以及相异之处,下面是他的初衷:

  • 让 C++ 的开发者体验一下 Rust
  • 让 Rust 的开发者体验一下 C++20
  • 让自己对 Rust 更深入
  • 确定两种语言的优劣点,并希望有助于改善这两种语言。

更多讨论和代码仓库请点击链接。

Read More

用 Rust,Cursive 和 PubNub 开发一个聊天客户端

直接看效果。

img

img

喜欢。

Repo

Mozilla在Firefox中为所有平台提供了跨语言LTO

#LTO

为了使Rust能够与用其他语言编写的代码进行互操作,调用必须通过C-ABI。 所以它是内联过程优化的边界。跨语言LTO使此边界对LLVM透明,有效地允许将C/C++代码内联到Rust代码中,反之亦然。

D语言中的所有权和借用

#D

从D语言的角度来看看所有权和借用?感兴趣的可以看看

Read More

unlisp-llvm: 基于LLVM的玩具Lisp语言编译器

#lisp #llvm

基于Rust和inkwell开发。

Inkwell旨在通过安全地包装llvm-sys来帮助你编写自己的编程语言。

「视频」Rust是下一个Python FFI

#Python

将会替代C。

Read More

「系列」Rust是新的C语言 Part I: 构建和组合本地库到C接口

#FFI #C

该系列文章主要包括如何将Rust库更简单更安全地公开为统一的C接口。

Read More

在 Rust 裡面創造一個簡單 LISP

方法跟上面的現代編譯器實作在現代語言很像

read more

Linkerd2 安全審核

Linkerd 是一個服務網格,旨在提供平台範圍的可觀察性、可靠性、安全性,而無需更改配置或代碼。

使用 Kubernetes 。 官方網站

這篇PDF說明了Linkerd花了很多力氣在維護程式碼上面。

包含了 人工程式碼審核和代碼輔助滲透測試。

報告指出,從2019年6月的Cure53項目清楚表明Linkerd產品完全能夠防止重大攻擊和大多數妥協的惡意企圖。

read more

wafu: Fuse.js的Rust移植版

#fuseJS

模糊字符串搜索库,运行在你的浏览器中

Rust实现遗传算法并用Python进行可视化

#algorithm #Genetic

img

rusty-genes

ferrocarril - 把 Ruby on Rails 嵌入 Rust 服务(容器)中运行的尝试

这个项目很有意思。想法很新颖。

Repo

使用JavaScript Rust 建構區塊鏈聊天系統(WebAssembly)

read more

mimalloc_rust: mimalloc的另一个Rust绑定

#mimalloc

mimalloc是最近流行的一个C实现的性能良好的小型通用分配器。

mimalloc_rust

在Python和Rust之间共享引用

#python

Mercurial开发人员写的一篇博客。在重写Mercurial的一些核心部分期间,他们必须为Python提供一个类似于类的接口来运行Rust代码(他们使用rust-cpython)。 通常,该类实现了__iter__,这需要Python来保存对Rust迭代器的引用。 每当遇到这个问题时,他们只是将整个结构复制到Python的数据类型,这是一种糟糕的方式。

最近他们重构了代码,直接在Rust和Python之间实现了共享引用来解决上述问题。本文通过一个简单的HashSet为示例,阐述了他们的共享引用的方法,并且还解决了Python GC可能会将共享引用收集而引发内存泄漏等问题。

用Python,Go和Rust编写同一程序之后的心得

#python #go

该文作者先后用Python、Go和Rust实现了同一个程序,在使用过这三种语言之后,他写了这篇文章,比较客观公正地比较了这三门语言。感兴趣的可以看看,结论还算客观。

Read More

leaf:注重效率的高级函数式编程语言

#lang #wip

又一门由Rust编写的新语言,不过该语言状态是WIP,感兴趣可以关注。

leaf



Story

「SO问答」既然两个可变引用不能别名为啥Rust编译器没有对其进行优化

#Rust #stackoverflow

该问题的作者描述,比如C代码中:

void adds(int  *a, int *b) {
    *a += *b;
    *a += *b;
}

两个指针a和b有可能互为别名(俩指针指向同一数据),所以clang在编译该代码的时候,会在寄存器中存储两次(%rsi),%eax来防止这种情况。当然也可以使用restrict关键字来对参数进行约束,显式地告诉编译器这俩指针不可能互为别名(但在C语言中,restrict关键字仅仅是告诉编译器可以优化,它不会帮助开发者进行检查,也就是说,很可能因为开发者没有遵循此契约而引发未定义行为)。从而生成的优化代码中只存储一次寄存器。

但是作者发现在Rust中虽然有编译器检查,两个可变引用不存在互为别名的情况,但是编译器并没有因此而进行任何优化:

#![crate_type = "staticlib"]
#[no_mangle]
fn adds(a: &mut i32, b: &mut i32) {
    *a += *b;
    *a += *b;
}

所以他比较担忧,是不是在Safe Rust之下也可能存在别名?

该贴的回复给出了答案:

Rust最初启用了LLVM的noalias属性,但这导致了非预期的编译结果(算是LLVM的一个Bug,等issues 54878修复以后就正常了)。现在也可以使用-Zmutable-noalias=yes参数进行编译就能得到预期结果。

「学术」使用类型化指针反转进行高效析构

#TypedPointerReversal #paper

HAL INRIA貌似是法国国家信息及自动化研究院。该论文提出了ML风格编程语言的资源管理模型,旨在兼容OCmal理念和运行时模型,提议使用析构函数扩展OCmal,在系统编程所有权和借用模式之上来提升OCmal的安全性、效率。

没错,借用了Rust/C++中的一些概念。感兴趣的可以看看,对资源管理应该会有深入的了解。

该组织已经发布了多篇关于Rust研究的论文了。

Read More

Python和Rust实现神经网络

#NeuralNetworks

这篇文章是作者探索Rust是否适合数据科学的工作。他分别用python和rust实现了一个小型的神经网络,然后进行了性能测试,利用火焰图进行分析,最终得出一个结论:

  • 大部分时间都花在做线性代数上,不管Rust还是Python,所以使用Rust永远也不会有10倍的加速。
  • Python进行优化以后,性能可以提升两倍,Rust原则上可以进行相同的优化,但目前ndarray还不支持2维数据以上的矩阵乘法。
  • 作者认为,Rust目前还没有做好胜任数据科学的工作。未来还需要更完善的生态系统。

Read More

「讨论」Rust如何实现代数效应

#AlgebraicEffects

看样子该贴作者是一个函数式粉丝。评论回复中有人用Rust实现了一个代数效应库effective-rust。

代数效应目前是一个学术/实验概念,它允许你通过使用类似于throw catch的机制来改变称为“效果”的某些计算元素(如函数调用,打印语句等)。

Debian Buster 将会预装Rust编译器

#Debian

2019年7月6日发布的Debian GNU/Linux 10 “Buster” 操作系统将预装Rust编译器。

img

Rust & Blockchain 群

#blockchain

秘猿组织的 rust & blockchain 的 telegram 群,下面是群链接

Read More

关于创建「更小的」Rust的思考

#rust

官方核心团队成员无船大佬新博文,针对社区中有些人喜欢Rust但还没有真正热爱Rust的人提出的看法「能否创造一个更小化更简单的更易于使用的Rust呢」所做的回应?

发出此类问题的人,最想改变Rust的一个想法就是给Rust增加垃圾回收,但其实这是错误的。因为他们根本不明白Rust语言的本质。Rust的核心是:代数数据类型、RAII、「别名 xor 可变」,换句话说,就是所有权和借用。如果试图摆脱这个核心,就是错过真正的Rust。

如果Rust不以「系统」语言为目标,如何才能设计它才能变得更简单呢?无船大佬给出了以下思考:

  • 放弃变量是在栈上还是堆上分配的任何保证。Rust为开发者做了这种保证,这是Rust复杂性的独特来源。
  • 使trait对象成为多态的主要形式,不再单态化,泛型只用于创建容器类型,而不去创建函数。
  • 将Rust的承诺放在并发性上,并使所有可用的原语线程安全。 没有Rc,没有Cell和RefCell。 内部可变性仅允许通过互斥锁类型,并且所有内容都可以跨线程Move。 Send和Sync仅作为对所有权相关类型的一些内置检查存在。
  • 闭包/数组/Vecs/切片也可以通过不保证任何被分配的位置来简化。
  • 会使用绿色线程,并且拥有像Go这样的简单CSP/Actor模型。
  • 还有很多其他地方可以简化,比如元编程、错误处理等。
  • 会小心地设计编译器,以便它可以嵌入到不同的运行时,有两个主要的编译目标:基于LLVM的和WASM的。
    无船大佬说,(假如要实现的话)他会用Rust实现这种语言及其运行时。
    Read More

「讨论」现在Rust语言招聘要求三年Rust经验是否合理?

#reddit

这是来自于Reddit的一个讨论贴,作者十分喜欢Rust,但是看到很多招聘广告要求三年Rust经验,所以他想问,是否有适合Rust新手的工作。然后评论里有一个回复我觉得挺有道理,我贴出来:

There are no language X job advertisements. I think there is a misunderstanding here; you see an advertisement asking for C++ experience and conclude that not knowing C++ you are unfit. There's a slim possibility that you are right, and a near overwhelming possibility that you misunderstood the ad. Now, before going further, there are possibly some places where "X years of experience in Y" is a sacrosanct requirement; the company may be looking for an expert in Y for some reasons. And there are cases where HR may even believe it is sacrosanct, if they have no idea what they are doing. In the vast, overwhelming, majority of cases though, "X years of experience in Y" is really a rough guideline: X aims at giving a hint of the seniority required; 0-1 is aimed at beginners, 2-4 at juniors, 5-10 at regulars and 10+ at seniors. The varying level of seniority is also a hint at the kind of work (senior may imply mentorship, technological/architecture decisions, ...) and compensation. Y aims at giving a hint at the domain, for example C++ could mean: systems programming (kernel, driver, embedded), high-performance computing (numerical, scientific, machine-learning), real-time (embedded, audio/video), low-latency, ... A technical interviewer would understand that anybody with experience in C or Rust in the same domains would be able to adapt relatively quickly. The only quasi-certainty in "X years of experience in Y" is that the job involves working with Y; if you don't like it, or do not want to work with it, better pass your way. Learning X developers are pointless. I've never seen a job which required me to only ever program with a single language. There's usually a main language, certainly, but: My first job was mainly C++, with some SQL, HTML, CSS, JavaScript, and Python/Bash. My second job was mainly C++, with a lot of SQL, and some Python/Bash. My current job is mainly C++, with some x64 assembly (debugging), Java, and some Python/Bash. The occasional glance at Systems Verilog too. Furthermore, the more languages you see, the more your realize just how much in common those languages have. The first time you see a concept, you'll struggle with it, but the fourth or fifth time, it's just like getting back on a bicycle after a couple years, it just comes back instantly. My advice, therefore, is NOT to make the mistake of focusing on learning a single language in depth and instead aim for breadth: Computer Science is awesome: data-structures and algorithms are not something you code daily, but understanding them and applying complexity analysis is great. Languages have a lot of different programming paradigms, in no particular order: C/C++/Rust, Java/C#, JavaScript, Haskell, Python/Ruby, Lisp, Forth, Eiffel, ... Each of these groups bring something novel to the mix. Real world != assignments: assignments tend to be small, well-defined, and immediately forgotten. The real-world has large code-bases which grew organically for decades and have high-level functional requirements that are only defined on a coarse-grained level (and even then, there's often leeway). If you want early experience with the real world, either find a part-time job at a programming shop or an existing open-source project -- insisting on existing, as it means already large and laden with technical debt. You could read books, like Clean Code, etc... but honestly, you'll only appreciate their advice after experiencing the mess of the real world first-hand ;) Broader Learning Also, just in case you are under the misconception that a programming job is about coding; it's a lot more than that. Programming also involves: Communication: English. If your first language is not English, that's your first priority in University -- take extra courses if needed, start reading/writing in English daily, start watching movies in English. If your first language is English (lucky you), but you're not too good at it, then it's also your first priority. Spelling mistakes are an embarrassment in any professional e-mail, fumbling for words in a conversation is always awkward, and having to repeat because you mumble makes you wonder how many times you were misunderstood. Communication: Clarity & Concision. Remember when I mentioned coarse-grained specifications? Guess who it falls onto to clarify them? YOU! It means listening/speaking and reading/writing, of course. It also means communicating with technical peers and non-technical clients. It means rephrasing to ensure you understood. It means summarizing discussions to leave a trace you can come back to. Planning. At the very least, planning your work, knowing how to divide a large task in small chunks, understanding business priorities, ... In Parting Learning a programming language in depth should be the least of your worries. Instead you should learn programming in the broad sense: puzzle-solving, navigating large code-bases, communicating clearly and efficiently, and getting comfortable with a variety of programming paradigms and syntax so as to be flexible. Oh, and if you're looking to get your feet wet by contributing to open-source, may I suggest the Rust community? It's welcoming, and there are a lot of exciting projects on a broad variety of topics ;)

Read More

Animate code with awoo!

https://phaazon.net/blog/introducing-awoo 这篇文章,从风格上,我觉得挺诡异,没看懂,各位看观有兴趣来点评一下?

如果你想参加关于 Gamedev 的演讲、研讨会或者加入讨论组,可以在这条推特下面和@Miux讨论或者提出建议。

Read More

一个关于crate播客的想法

#crate

@jntrnr 有一个关于 crate 播客的想法,每集找一个有趣的 crate,谈谈能用它干什么,点击下面的链接加入讨论。

Read More

組一台編譯rust最快的個人電腦!

這位網友想組一台 Ryzen 9 3900X + Samsung 970 EVO Plus SSD

有興趣的可以給他建議

read more

编译器优化及其可能带来的风险

这是一篇很优秀的文章,讲了 C 编译器的实现中的一些优化情况,以及带来的风险,对于正在进化的 Rust 编译器,可能能提供一些参考。

Read More

Rust 编译器一致在致力于加快编译速度的

都在报怨 Rust 编译器太慢了。其实官方组还是很努力了。不信看看下面的报告:

img

Read More

北京区块链创业公司招人

#Job

Key responsibilities:

  • Work with product to translate the requirements into high level design.
  • Coordinate the engineering to assign/prioritize tasks dynamically.
  • Build high quality code by developing both unit and integration testing
  • Participate in code reviews to ensure new code conforms to highest standards
  • Work with team to troubleshoot code level problems quickly and efficiently
    Requirements:
  • Bachelors Degree in Computer Science or related field
  • 5 years+ software programing experience
  • Experience with blockchain technologies, like ethereum, smart contracts, and p2p networking.
  • Rust experience in production environment.
  • Experience with substrate is a plus
    地址在北京, 薪水40-60万, 联系 zhengpeng.hou [at] gmail

In Rust We Trust 活动回顾视频已上传B站

#meetup

Read More

「微软安全响应中心系列博文」为什么Rust适合安全系统编程

#MSRC #Microsoft

本文是MSRC的第二篇文章,介绍了为什么微软认为Rust目前是C和C++的最佳替代品。

Read More

巴基斯坦物联网和人工智能课程使用Rust

#AI #IoT

巴基斯坦一个为期15个月的物联网和人工智能项目,专为绝对初学者设计,让巴基斯坦为物联网和人工智能的新时代做好准备。该课程大部分内容是使用Rust。

课程内容涵盖:Rust/ 嵌入式Rust和实时系统/ 微软IoT edge和IoT云/ WebAssembly/ Node.js / Docker/ KubeEdge/ 应用于IoT的区块链等。

Read More

Tezos Rust项目获得了Tezos基金会的资助

#Tezos

该资金将用于使用Rust开发新的Tezos节点。

Tezos是一个和以太坊竞争的区块链项目。

Read More

Redmonk 语言排行榜:Rust 比上季度上升两名

Link

rustc 已经被添加进了 Android 工具链

Link

台湾友人分享Rust官网翻译台湾繁体版本的心得

#website

来自刘安齐的分享

Read More

我们需要更安全的系统编程语言

#rustlang

微软发现过去他们修正的 bug,平均有70%都是内存安全导致的,当然也包括 data race。

下面一篇文章探讨为什么微软认为 Rust 编程语言目前是业界采用的最佳选择。

read more

美国国会关于Libra的听证会

有议员提到,为什么为选择Rust来开发Libra,它够成熟吗?如何担负起其对安全的要求。内有彩蛋:D

Read More

是否真的需要构造器

这篇文章 中,讨论了构造器是什么,Rust选择了没有构造器,这背后的权衡是什么?会有什么问题。并且对比了一下Swift的选择。等等,很细致。值得一看。

「系列文章」微软安全响应中心:一种主动性的方式来提升安全

微软安全响应中心一直在研究Rust语言作为系统编程的安全替代方案,并建议整个软件行业认真研究它。并且会写一系列的相关的文章,本文是第一篇:

自2004年以来,微软安全响应中心(MSRC)已经对所有报告的微软安全漏洞进行了三重分析。从所有这些分类中,有一个惊人的事实凸显出来: 正如马特·米勒在2019年布鲁哈特伊利诺伊州的演讲中所讨论的那样,大多数修复的漏洞和分配的CVE漏洞都是由开发人员无意中在他们的C和C++代码中插入内存损坏错误造成的。随着微软增加其代码基础并在其代码中使用更多的开源软件,这个问题并没有变得更好,反而变得更糟。微软并不是唯一一个暴露在内存崩坏问题之下的公司。

所以需要一种更加内存安全的语言,比如Rust。时代在进步和变革,拿汽车和编程语言类比非常适合。我们不是要等事故发生以后再去处理它,而要在事故发生之前,预判一些可能导致事故的危险行为去避免它。

(微软已经不是以前那个微软了,微软越来越像那个我期待的微软了)

Read More

叫板?为什么我们需要一个actix的替代品

#actix

本文作者尝试解释为什么他不认为actix-web能够成为引领Rust社区向前发展的“那个”框架。作者列出了他的理由:

  • 代码中依旧还有25个unsafe方法在使用。比如std::mem::uninitialized。但有人可能会说,这没什么大不了的,修好就可以了。但是本文作者强调:Nikolay(acitx-web作者)的态度是你难以改变的。本文作者列举了Nikolay在强硬关闭其他人移除actix-web中unsafe代码的PR中的回复:actix-web/pull/968。 (这个PR下actix-web作者的几个回复的态度确实不太好,比如他说道:已经失去了和开源社区打交道的动力。)
  • actix不是一个你可以轻易贡献的项目。最终,这使得开发者都将依赖Nikolay来获得新的特性。本文作者用一个词来描述actix-web:Flying Solo。
  • 性能测试作弊?比如硬编码header值、或者放弃检查HTTP方法之类。他呼吁大家仔细研究下TechEmpower的测试代码。

总结:本文作者认为actix-web作者的心态和代码内部的质量,足以让他放弃actix框架。那么还有哪些替代品?

  • Rocket
  • Gotham
  • Thruster
  • Warp
  • Tide

(wow,看完之后我感觉,该文作者描述actix的问题还是挺严重的,真心希望actix-web可以更好)

tokio重构计划:让tokio 的子crate “坍缩”为一个独立的crate

#tokio

主要是解决tokio用户对依赖tokio时候pull的crate数量抱怨的问题。大家可以来此issues下讨论替代的策略。

(合久必分,分久必合)

Read More

timetill.rs: 专注于记录全球Rust活动的站点

#event

该站点专注于记录世界各地Rust各大活动的时间线,开源项目,大家可以提交活动信息。

timetill.rs

RustFest 巴塞罗那大会将在11月份开启

#RustFest

Read More

2019年最大的音乐节Atlas Weekend使用了Rust

#event

乌克兰基辅举办的音乐节,其实该音乐节去年就开始使用Rust了,去年的日报也报道过。

Read More

rust-trending —— 用 Rust 开发的 twitter 机器人

#rust

用来发布 Rust 项目的推文,可以关注它 @RustTrending

Read More

未来全世界 Rust 会议的一个汇编网站

专门用于罗列在哪些地方什么时候将要举办(已经举办)哪些 Rust 会议。很方便了。

https://timetill.rs/

对不再打算继续构建的老项目请使用carg clean

#cargo

该贴作者写道:在遗忘的target目录下发现了170GB的空间占用。由此他提醒大家使用cargo clean来清理这些垃圾。评论区有人也提供了另外一个工具,比如cargo-sweep。

Read More

「讨论」如何回复同事这个问题:Rust没有提供任何Cpp没有的东西。

#cpp

该贴作者谈到:

同事是一位(资深)Cpp开发人员,他坚持认为Rust不会带来任何新的东西,至少与C++相比是这样。

因为该贴作者没有进一步紧跟现代Cpp(他在Cpp11发布之前就不用Cpp了),所以没有很好的论据来说服他的同事,现在发帖想和大家探讨这个问题。那么评论区是怎么说的呢?

  • 「Rust提供了内存安全保证,Cpp没有」。 对此论点提供反驳的通常都这么说:「格式良好的C++可以用智能指针做同样的事情,等等」,但其实,开发人员并不能保证他们的代码总是格式良好的。也许有人说,Cpp专家可以保证格式良好。但是Rust并不仅仅是关心那些专家,它关心的是每个开发者。这就像说如果每个人都遵守交通法规,事故就不会发生一样。虽然这是真的,但这完全是毫无意义的反驳。
  • 除此之外,有人总结了Rust提供了Cpp不提供的三件事:强制性RAII; 默认Move; 全局且不妥协的静态分析。但Rust的泛型,目前还不如cpp的模板更加强大。不过Rust还在持续改进,超越Cpp模板编程指日可待。

这篇reddit帖子里包含了大量评论,感兴趣的可以自己去看看。

(总之就是一句话:不要等错过了、遗憾了,才明白生活中其实不必有如此无谓的执着。)

Read More

moz://gfx 新聞 #46

新增了桌面縮放,WebGL更強大:低功耗高效能

增加了 WebRender 一個基於GPU的2D渲染引擎

read more

Rust 問卷調查

調查你工作上、業餘時間使用rust的情況。

read more

「讨论」跨平台应用的逻辑开发共享库的最佳实践是什么?

#CrossPlattform

该贴作者的团队计划开发一个应用程序并将其部署在Android和iOS上,同时也想以将其移植到Windows,MacOS和Linux。目前的想法是,整个应用程序/业务逻辑将作为可交叉编译的库一次性实现,以便可以在多端共享。你是否会推荐Rust呢?如果推荐Rust有什么经验分享?

目前还未有太多讨论,可以关注。

Reddit 讨论

rust-analyzer现状:成就和Open Collective

rust-analyzer是Rust编程语言的实验性编译器前端。 该项目的最终目标是为Rust提供完美的IDE体验,所有IDE功能在编辑代码时都能完美运行。

在2019年2月,rls-2.0工作组在柏林成立之后,rust-analyzer成为了这项工作的一部分。该工作组的目的是尝试构建支持IDE的编译器的可能方法,然后通过这些尝试所获得的知识来确定Rust的总体方向。请注意,rls-2.0用词不当:当前并没有立即替换现有Rust语言服务器(rls)的计划。

这篇文章讨论了rust-analyzer的现状、未来计划,并宣布rust-analyzer Open Collective (可能是某种开放式基金会)。

Open Collective是一组具有共同使命的人,完全透明地运作。每个人都可以看到他们如何收钱或花钱。

到目前为止完成的成就:

  • Chalk和rust-analyzer的集成
  • 尝试集成现有的rls和rust-analyzer
  • 保证新功能的引入不会影响性能
  • 尝试解决「宏」相关的问题,让IDE可以更好地支持宏

未来计划:

  • 将目前取得的成就进行组件化,也就是开发出独立的crate,然后集成到rustc中,估计rustc会有大量的重构工作。
  • 确定rls和rust-analyzer的关系,因为它们具有不同的体系结构,这个问题也需要花费大量时间。

Open Collective:

Open Collective专注于为正在进行的项目而不是为个人筹集资金。有闲钱的可以支持下。



wasm

一个使用 Rust 实现的 WebAssembly 项目

#wasm

这是一个用 Rust 编译到 WebAssembly 的前端项目,它实现的效果像万花镜一样绚丽🦚

Online Demo

Read More

一个 Rust、WebAssembly 及与 Js 进行配合的讲座

这里

Cloudflare 的工程师讲的,不过是英文的,感兴趣的可以听听。

WebAssembly 实现的路径查找 Demo

#wasm

开发者是上面 mask 的作者,他通过编写 rust 编译成 wasm,使用浏览器 canvas2D API 实现了一个寻找路径的 Demo,可以在线体验

Read More

Rust 1.36稳定了wasm32-wasi target

#wasi

不确定为什么在官方发布公告中没有提到这一点(这是WASM开发的重要一步),不过在发布说明中可以找到。

Read More

Rust WebAssembly 之 深入浅出wasm-bindgen和wasm2wat

#wasm

Read More

使用Rust构建Dev的offline网页

#dev #wasm

Dev的offline网页是指dev.to/offline,该网页上提供了几种颜色的画笔。这篇文章教你如何用Rust和WASM实现类似的网站。

Rust和Yew指南

#yew #wasm

这是一篇比较详尽的Yew使用指南,使用Yew和Rust来构建前端页面。

Read More

提升Rust和WebAssembly的性能

#wasm

该文以使用WebAssembly转换markdown格式为html的示例,介绍了Rust和WASM。

Read More

使用 Rust與WebAssembly 創建離線頁面

一個簡單的教學,讓你用 Rust與WebAssembly 創建離線頁面

read more



Job

Neuralink 在组建一个队伍,寻找有 Rust 经验的工程师

Neuralink is developing ultra-high bandwidth brain-machine interfaces to

connect humans and computers. We are building a team of

multidisciplinary experts passionate about making a world-changing

impact.

Read More

「远程工作」assembl招Rust开发

#job

assembl公司主要技术栈是Nodejs和Electron,所以也希望应聘者有Nodejs经验。可远程。当然你有Rust的丰富开发经验也是可以的。联系邮件:[email protected]



嵌入式

embeded

把 Rust 在 Commodore 64 位机上跑起来

Commodore 64,也称为C64、CBM 64或在瑞典被称作VIC-64,是由Commodore(康懋达国际)公司于1982年1月推出的8位家用电脑。

img

Repo

monome-rs: 让Rust和Monome对话

#music #monome

img

Monome是一种很酷的乐器,算是一种开源硬件,该库可以实现用Rust和Monome对话。

static-alloc

这个库用于分配一个全局固定存储,特别适合嵌入式设备使用。库刚刚发布,感兴趣可以参与进去。

Repo

用 Rust 点亮树莓派上的 LED 阵列

直接上图:

img

细节可在下文中追寻。

Read more

「嵌入式Rust」嵌入式工作组报告 #18

#embeded

概要:

  • 经过社区投票,交流工具选择了Matrix,新的channel:https://matrix.to/#/#rust-embedded:matrix.org
  • 官方工作组在英国剑桥和美国波特兰RustConf大会上做宣传
  • 还在寻找合适的嵌入式Rust项目进行官方展示

Read More

「嵌入式Rust」使用Apache Mynewt更安全更简单地在STM32 Blue Pill上使用Rust

#embeded

这篇文章涵盖了使用声明宏、过程宏来避免在编写嵌入式代码中遇到的坑: 当Embedded Rust编码器调用Mynewt API,驱动程序和其他C函数时,可能会出现字符串相关的问题。为了解决这个问题,作者使用Rust的宏创建了一个新的类型Strn,它表示一个永远不会被修改的以null结尾的字符串。

Apache Mynewt是一个开源的ioT操作系统,是C语言实现的,它支持很多传感器。

Read More



Web

关于 Web 前端开发框架 Seed 的一些资料

Seed(https://seed-rs.org/) 也是一个前端 Web 开发框架。这是用 Seed 写的一个前端网站(https://seed-rs-realworld.netlify.com/),这里是一些相关的资源(https://github.com/MartinKavik/awesome-seed-rs)。

Repo

Osgood:基于Rust和V8构建的专门用于HTTP服务器的JavaScript运行时

#JavaScript

osgood

「嵌入式Rust」Rust嵌入式尝鲜线下活动

#embeded

该活动在本月25号于伦敦举行,在伦敦的日报读者朋友可以去看看。

Read More

异步Web框架Gotham发布0.4版本

#gotham #async

新版本引入了TLS支持,以及新的中间件设计。

Read More

shorty-rs: 一个基于tower-grpc实现的url短地址服务

#gRPC

shorty-rs

juniper —— graphQL 服务端库的 Rust 实现

#graphql

hyper、rocket、iron、warp 这四个 web 框架中可以使用,目前该项目版本没有到 1.0,可能会有一些 API 不稳定。

Read More

重磅:Rust 的 http plain test 在 techempower 上已经霸榜了,hyper 拿下头名

前 10 结果如下:

1	hyper	7,007,513	
2	tokio-minihttp	7,006,181	
3	ulib-plaintext_fit	7,004,608	
4	actix	7,000,911	
5	ulib	6,998,172	
6	libreactor	6,997,422	
7	actix-raw	6,996,104	
8	atreugo-prefork	6,995,436	
9	firenio-http-lite	6,994,344	
10	aspcore	6,993,704	

聪明的你认得出哪些是 Rust 的孩子么?

hyper 冲上头名,举社区欢庆! :)

Read more

hyper现在已经支持std::future

#hyper

将在hyper 0.13中稳定发布

Read More

静态站点生成器Zola发布了0.8版本

#zola #static_site

Read More

「官方」async-await状态报告 #2

#async #await

官方核心组Leader Niko的新文,主要阐述了三件事:

  • async/await MVP的状态
  • 目前的工作目标,以及如何将其纳入更大的愿景
  • 社区里的你,能帮上什么忙。

MVP(最小可行产品)的功能包括:

  • Future trait(1.36已稳定)
  • 基本的async-await的语法,正在努力赶在1.38版本稳定发布(仅限于 async fn自由函数 和 impl块中async fn的方法)
  • async book(异步之书)的第一版。等async-await语法稳定就开始构建本书。

未来更大的愿景:

  • 需要一组核心的async trait和组合子。基本上是futures-rs的1.0版本中包含。
  • 更好的stream支持。
  • Generator和async Generator支持。
  • 在trait和trait impl中的async fn支持
  • 异步闭包

你如果愿意参与贡献,可以去Rust官方仓库搜索async-await相关的issues了解。

Read More

meli: 新的终端邮件客户端 pre-alpha版本

#cli

Read More

使用Actix-Web 1.0实现Auth Web微服务

#actix_web

使用最新版(actix-web 1.0.3)的API

Read More