【Rust日报】 2020-1-16 用 Rust 来诠释 Epoll, Kqueue 和 IOCP

Jancd 发表于 2020-01-16 23:37

Tags:rust,news

用 Rust 来诠释 Epoll, Kqueue 和 IOCP

这其实是一本书,旨在说明 Epoll,Kqueue 和 IOCP 的工作原理,我们可以将其用于高效率、高性能的 I/O。其中一些实现将会使用 rust,原文地址:https://cfsamsonbooks.gitbook.io/epoll-kqueue-iocp-explained/

扩展阅读:Green Threads Explained in 200 Lines of Rust

reddit 上参与讨论:https://www.reddit.com/r/rust/comments/ephm4t/epoll_kqueue_and_iocp_explained_with_rust/

Deadpool

Deadpool 是一个死的简单异步池,用于任何类型的连接和对象。

Example

use async_trait::async_trait;

#[derive(Debug)]
enum Error { Fail }

struct Computer {}
struct Manager {}
type Pool = deadpool::managed::Pool<Computer, Error>;

impl Computer {
    async fn get_answer(&self) -> i32 {
        42
    }
}

#[async_trait]
impl deadpool::managed::Manager<Computer, Error> for Manager {
    async fn create(&self) -> Result<Computer, Error> {
        Ok(Computer {})
    }
    async fn recycle(&self, conn: &mut Computer) -> deadpool::managed::RecycleResult<Error> {
        Ok(())
    }
}

#[tokio::main]
async fn main() {
    let mgr = Manager {};
    let pool = Pool::new(mgr, 16);
    let mut conn = pool.get().await.unwrap();
    let answer = conn.get_answer().await;
    assert_eq!(answer, 42);
}

这个库还提供:Database connection pools,GitHub 地址:https://github.com/bikeshedder/deadpool

factori

Factori is a testing factory library inspired by Ruby’s FactoryBot.

Example

Factori provides two macros: factori!, which defines a factory for a type, and create! which instantiates it:

#[macro_use]
extern crate factori;

pub struct Vehicle {
    number_wheels: u8,
    electric: bool,
}

factori!(Vehicle, {
    default {
        number_wheels = 4,
        electric = false,
    }

    mixin bike {
        number_wheels = 2,
    }
});

fn main() {
    let default = create!(Vehicle);
    assert_eq!(default.number_wheels, 4);
    assert_eq!(default.electric, false);

    // Its type is Vehicle, nothing fancy:
    let vehicle: Vehicle = default;

    let three_wheels = create!(Vehicle, number_wheels: 3);
    assert_eq!(three_wheels.number_wheels, 3);

    let electric_bike = create!(Vehicle, :bike, electric: true);
    assert_eq!(electric_bike.number_wheels, 2);
    assert_eq!(electric_bike.electric, true);
}

From 日报小组 @Jancd

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 20200101 2019年 Rust 库增长率以 58% 排名第一

用 Rust 重写 m4vgalib

作者用 Rust 重写了自己多年前用 C++ 写的视频生成库 m4vgalib. 介绍了 Rust 的一些优点,如包管理、API 设计、内存安全等. 详情

2019年 Rust 库增长率以 58% 排名第一

有人根据 modulecounts.com 网站的数据统计了2019年各种语言的库增长率,Rust 以 58% 排名第一,NPM 以 55%排名第二,另外还有 Julia 40%, Python 29%, Nim 28%, Hex 25%……

image.png

aspotify:异步 Spotify Web API 客户端

作者觉得现有的几个库有一些问题:

  • spotify : 没有包含所有的 API
  • rspotify : API 比较难用
  • spotrust : 没有文档

所以作者就用 Rust 写了这个库

Druid 状态更新以及 0.5 路线图

Druid 是一个实验阶段的 Rust-native UI 工具库,主要目标是表现 Rust 开发应用的潜力. 05 版的主要任务有:

  • addressable widgets
  • lifecycle refactor
  • z-order painting
  • paint bounds
  • modal widgets

详情

From 日报小组 @挺肥

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】2020-01-02 The Embedded Working Group Newsletter

The Embedded Working Group Newsletter - 22

这是 Rust Embedded WG 的第 22 期通讯,我们重点介绍新的进展,为出色的项目加油,感谢社区并宣传需要帮助的项目!(如果您想在下一期通讯中提及,请联系我们。)例如:用 Rust 在树莓派上进行操作系统开发教程:https://github.com/rust-embedded/rust-raspi3-OS-tutorials。

查看原文:https://rust-embedded.github.io/blog/newsletter-22/

reddit 参与讨论:https://www.reddit.com/r/rust/comments/eiisk9/the_22nd_embedded_working_group_newsletter/

Spinlocks Considered Harmful

In this post, I will be expressing strong opinions about a topic I have relatively little practical experience with, so feel free to roast and educate me in comments (link at the end of the post) :slight_smile:

Specifically, I’ll talk about:

  • spinlocks,
  • spinlocks in Rust with #[no_std],
  • priority inversion,
  • CPU interrupts,
  • and a couple of neat/horrible systemsy Rust hacks.

Read more :https://matklad.github.io//2020/01/02/spinlocks-considered-harmful.html

reddit参与讨论:https://www.reddit.com/r/rust/comments/eis1tr/blog_post_spinlocks_considered_harmful/

理解 Tokio , pt. 1

“我想了解 Tokio 的工作方式。我的兴趣涉及事物的实时性和并行性,但是我对 Tokio 本身并不了解。在引入异步和稳定的期货之前,我或多或少有意地避免学习它,这并不是毫无道理的认为 Tokio 是错的,但是只有有限的时间来学习东西,学习一些新东西是一项艰巨的任务。”

“因此我写下了这些学习 Tokio 的笔记。我没有计划如何学习它的内部原理,但是总的来说,当我有某种项目可以帮助我阅读时,我会学得最好。上下文确实有帮助。我不知道我要长期构建什么,但是一个 HTTP 负载生成器可以很好地工作,它可以扩展自身以找到服务器每秒可以处理的最大请求,同时仍然满足一些延迟约束。这确实意味着我需要将我的学习与另一个库 - hyper 相结合,但是我以前使用过它,并且认为我可以将其保留为黑匣子。”

阅读原文:https://blog.troutwine.us/2019/12/31/understanding-tokio-pt1/

面向大众的 Rust 和 WebAssembly 教程

如果您认为 WebAssembly 最适合游戏应用程序,Online IDE 以及其他资源密集型和占用内存的应用程序,那么您在技术上是正确的。但是我们也可以在一个简单的应用程序中获得 WebAssembly 的好处。

对于我们开发的普通应用程序(即始终不需要超快速响应的应用程序),有些部分需要进行性能调整。有时,我们必须删除仅在某些浏览器上而不在其他浏览器上运行的很丑陋的代码。那么 WebAssembly 是一个很好的选择。

使用 Rust 和 WebAssembly,可以使用更快,一致的 WebAssembly 代码轻松弥补这些领域的不足。

详情请看:https://dev.to/sendilkumarn/rust-and-webassembly-for-masses-introduction-1034

关于 Rust 代码测试的讨论

详情请看:https://www.reddit.com/r/rust/comments/eiji29/rust_webapps_and_testing/

From 日报小组 @Jancd

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-03

damody 发表于 2020-01-04 01:14

Tags:rust

改非同步沒什麼壓力啊

作者想講的是背壓的問題

Back Pressure

以作者的說法就是生產者消費者問題

生產者速度太快,消費者跟不上的壓力叫背壓

非同步就是把這個等待的時間壓力分散掉的一種方式

當消費者是OS或是其它程式時,用async await寫非同步

就跟寫同步程式一樣簡單

Read more

const generics 進度更新

這個RFC被接受以來已經有2年多了

自上次更新以來的過去幾個月中,已經取得了良好的進展。

Read more

Happy Nu Year 2020

NuShell的開發者很感謝2019年有60多位朋友一起開發與協助。

希望2020跟大家一起前進 做的更好

文內有感謝名單

Read more

postgres-query

一個使用 async 的 psql orm

Read more

This Week in Rust 319

在Rust中重寫m4vgalib。

一個思想實驗:在遊戲引擎之外使用ECS模式。

自旋鎖被認為是有害的。

內部可變性模式。

應該從哪裡來照顧Clippy?

在Rust中編寫AWS Lambda函數。

Rust生命週期和迭代器。

Rocket 與 Multipart forms

Lion 0.15.0-新的面三角化庫。

嵌入式的Raspberry Pi OS開發教程:教程13-使用QEMU的內核單元,集成和控制台測試

使用Rust和Mynewt優化PineTime的顯示驅動程序

嵌入式新聞 22

rust分析變更日誌5

Rust在區塊鏈 7

Read more

Podcast 在Etsy中使用Rust在搜索中使用機器學習

Read more

AeroRust 航空航天業的非官方工作組

我們很高興宣布組建AeroRust非官方工作組。 最近,航空航天業正在加快商業化的速度,甚至在該地區的發展越來越快。

該工作組旨在通過向愛好者和行業提供信息,材料,工具等,幫助將開源社區更多地推向不斷發展的航空航天行業。

Read more

From 日报小组 @Damody

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】2020-01-04 Rust将减少对苹果32位系统的支持

LacneQin 发表于 2020-01-04 19:25

Tags:rust

Rust将减少对苹果32位系统的支持

Rust团队遗憾地宣布,Rust 1.41.0 将于2020年1月30日发布,这是对32位Apple目标当前支持水平的最后一个版本。从Rust 1.42.0开始,这些目标的支持将降级为Tier 3。

该决定是在RFC 2837上发布的,并被编译器团队和发行团队接受。上述文章解释了做出这个更改的意义,以及对现有项目会产生什么样的影响。

受到此更改影响的主要是32位macOS( i686-apple-darwin ),支持级别将从级别1降级为3级。这将影响在32位Mac硬件上使用编译器以及从以下版本任何其他平台的交叉编译32位macOS二进制文件。

此外,以下32位iOS系统将从2级降级为3级:

  • armv7-apple-ios
  • armv7s-apple-ios
  • i386-apple-ios

更多详情请阅读Rust博客原文

Razor发布,一阶理论的模型发现者

razor-fol:一个用于解析和语法处理一阶(逻辑)公式的库。 razor-chase:一个用于构造一阶理论模型的库。剃刀:一阶理论的模型发现工具。

这是GitHub仓库的链接:https://github.com/salmans/rusty-razor

该项目仍处于起步阶段,但是作者进行了部分试验。证明定理的正确性和程序运行速度,因此在不久的将来或许能在Rust中看到类似的项目。

运行

solve

使用 solve 命令查找 <input> 文件中编写的理论模型:

razor solve -i <input>

--count 参数限制了要构建的模型的数量:

razor solve -i <input> --count <number>

有界模型查找

与传统的模型查找器(例如Alloy)不同,Razor不需要用户为其构造的模型的大小提供界限。但是,当在带有无限的模型的理论上运行时,Razor进程可能永远不会终止。可以证明,在不满足要求的理论(即,没有模型的理论)上运行非常长的时间之后,Razor可以保证能够终止(尽管这可能需要很长时间才能完成)这是一阶逻辑的半判定性的直接结果。

为了保证有穷性,请使用 --bound 带有 domain 参数值的命令,通过结果模型的元素数量限制结果模型的大小:

razor solve -i <input> --bound domain=<number>

前往GitHub仓库获取更多信息。

Nvim-rs:针对Neovim客户的Rust库

nvim-rs 的第一个版本刚刚发布,该库用于在Rust中编写neovim客户程序。

它的主要功能是使用异步来正确嵌套请求,但我也将工作放在错误处理、常规处理、文档示例中。这个项目将会有更多的东西出现,目前很少有功能是固定的,所以尝试一下。

前往GitHub参与讨论/了解更多。

From 日报小组 @Lance

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】2020-01-05

sourmesh 3.0发布,从C++迁移到了Rust

#rust #c++

sourmesh 是一款超快、轻量级核酸搜索和比对软件,此版本与sourmash 2.0兼容,包括sourmash Python API、命令行、签名和数据库文件格式都相同。

Read More

rio 一个纯Rust的io_uring库

#rust

rio只依赖于libc、工作线程和异步,主要是想面向有高性能存储需求的用户。虽然它只是一个pre-alpha版本,但是已经让作者的笔记本电脑达到了6Gbps的读写速度,这还是在debug模式编译后的情况。

Repo

推荐阅读——面向大众的Rust和WebAssembly教程

From 日报小组 格朗

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-06

tomaka / redshirt:在0环中运行的WASM二进制的操作系统原型

redshirt操作系统是建立某种形式与操作系统类似环境的实验,其中的可执行文件都在WASM并从类似IPFS的去中心化网络被加载。

此存储库中有两种二进制文件:

  • “托管内核”是执行WASM程序并使用主机操作系统的常规二进制文件。
  • 独立式内核是兼容multiboot2的内核,可以与GRUB2或任何兼容的引导程序一起加载。

对于托管内核:

# You need the WASI target installed:
rustup target add wasm32-wasi

# Then:
cargo run

对于独立内核:

rustup target add wasm32-wasi

# From the root directory of this repository (where the `arm-freestanding.json` file is located):
RUST_TARGET_PATH=`pwd` cargo +nightly build -Z build-std=core,alloc --target arm-freestanding --package redshirt-standalone-kernel

# You now have a `target/arm-freestanding/debug/redshirt-standalone-kernel`.
# It can be loaded directly by QEMU:
qemu-system-arm -M raspi2 -m 2048 -serial stdio -kernel ./target/arm-freestanding/debug/redshirt-standalone-kernel

支持x86_64的独立内核:

RUST_TARGET_PATH=`pwd` cargo +nightly build -Z build-std=core,alloc --target x86_64-multiboot2 --package redshirt-standalone-kernel

前往GitHub了解更多。

Rust官方发布:任务监视器扩展task_scope

task_scope crates是一个运行时用于向现有运行时添加对结构化并发的支持的扩展。

什么是结构化并发?

结构化并发是一种编程范例,它允许异步操作仅在特定范围内运行,以便它们像常规函数调用堆栈一样形成操作堆栈。当父操作等待所有子代完成时,结构化并发有助于并发程序的本地引导。

可撤回点

task_scope 要求任务定期通过一个可撤回点才能有效地工作。

use tokio::io::*;

let mut read = repeat(42); // very fast input
let mut write = sink(); // very fast output

copy(&mut read, &mut write).await.unwrap();

实际上,该程序回进入无限循环,因为 read 并且 write 永远不会终止。更糟糕的是,程序无法从外部关闭,因为I / O操作始终会成功,并且 copy 功能会尝试尽可能继续。因此,产生的任务必须协同检查取消或定期循环执行以保持结构良好。

task_scope 提供便利功能 cancelable 以自动处理取消。它封装给特定的 Future / AsyncRead / AsyncWrite 并在进行内部计算之前检查取消。

use futures::pin_mut;
use tokio::io::*;

use task_scope::cancelable;

let read = cancelable(repeat(42)); // very fast, but cancelable input
pin_mut!(read); // needed for Unpin bound of copy
let mut write = sink(); // very fast output

// this will terminate with an error on cancellation
copy(&mut read, &mut write).await.unwrap();

如果这个取消逻辑比较复杂,则可以使用 Cancellation 手动轮询以检查取消信号。

详细信息前往Rust官方博客浏览

新版本sysinfo(OSX性能改进)

sysinfo用于创建系统信息(支持Linux,Windows,OSX,Android和raspberry pi)。

此版本是性能改进系列的最后一个版本,专注于OSX。

关于sysinfo前往GitHub了解更多。

前往https://blog.guillaume-gomez.fr/articles/2020-01-06+New+sysinfo+release+(OSX+performance+improvements) 查看更新日志。

restq-一种适用于rest api的紧凑型查询语言

/person?age=lt.42&(student=eq.true|gender=eq.'M')&group_by=sum(age),grade,gender&having=min(age)=gt.42&order_by=age.desc,height.asc&page=20&page_size=100

大致转换成sql即为:

SELECT * FROM person
WHERE age < 42
    AND (student = true OR gender = 'M')
GROUP BY sum(age), grade, gender
HAVING min(age) > 42
ORDER BY age DESC, height ASC
LIMIT 100 OFFSET 1900 ROWS

RestQ的语句/语法

create  = table, column_def_list, "\n", csv

select = table, [join_table], column_list, [ "?", condition]

delete = table, [ "?", condition ]

update = table, set_expr_list, [ "?", condition]

drop = "-", table

alter = table, { drop_column | add_column | alter_column }

drop_column = "-", column

add_column = "+", column_def

alter_column = column, "=", column_def


column_def_list =  "{", { column_def }, "}"
        | "(", { column_def }, ")"

column_def = [ { column_attributes } ], column, [ "(" foreign ")" ], ":", data_type, [ "(" default_value ")" ]

column_attributes = primary | index | unique

primary = "*"

index = "@"

unique = "&"

data_type = "bool" | "s8" | "s16" | "s32" | "s64" | "u8" | "u16", etc

default_value  = value

value = number | string | bool ,..etc

column = string, ".", string
        | string

table = string

foreign = table

insert = table, column_list ,"\n", csv

column_list = "{", { column }, "}"
        | "(", { column }, ")"


join_table = table, join_type, table

join_type = right_join | left_join | inner_join | full_join

right_join = "->" | "-^"

left_join = "<-"  | "^-"

inner_join = "-><-" | "-^^-"

full_join = "<-->"  | "^--^"

condition = expr

expr =  column | value | binary_operation

binary_operation = expr, operator, expr

operator = "and" | "or" | "eq" | "gte" | "lte" ,..etc

更多详细功能与用法前往GitHub查看。

From 日报小组 @Lance

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-07

joshsulin 发表于 2020-01-08 00:54

Tags:rust, 日报

Yew发布 v0.11

前往GitHub了解更多。

MuOxi MUD/MU* Rustic 游戏引擎 v0.1.0

前往GitHub了解更多。

欢迎讨论, 哪些应用更适合用Rust来开发?

国外一名开发者, 提出了这个问题? 其实我与这名开发者有一样的疑问和迷茫, 在哪些应用程序中用Rust编写更有意义?我确实想学习该语言,但是很难找到一个比其他选择更有意义的项目.

欢迎大家加入讨论

From 日报小组 @joshsulin

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-08 Nushell 0.8 发布

Elastic 官方发布 Elasticsearch Rust 客户端

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。是目前十分流行的企业级搜索引擎.

详情

Nushell 0.8 发布

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

此次更新,优化以及添加了一些命令. 详情

把 Quake 3 翻译成 Rust 版

有人把游戏 Quake 3 编译为了 Rust 版,详情

image.png

From 日报小组 @挺肥

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】2020-01-09 在 Rust 实现的内核中实现协作调度器

Jancd 发表于 2020-01-09 22:19

Tags:rust,news

在 Rust 实现的内核中实现协作调度器

背景:OxidizedOS 是用 Rust 编写的多核 x86-64 内核。有关更多信息,请参见简介:https://ryan-jacobs1.github.io/2019/12/30/an-introduction.html。

在本文中,我们将实现协作式多任务处理。为简单起见,我们将使用循环调度器,其中每个线程将以 FIFO 顺序运行。更多请看原文:https://ryan-jacobs1.github.io/2020/01/06/scheduler.html

reddit 参与讨论:https://www.reddit.com/r/rust/comments/elzh3x/blog_post_implementing_a_cooperative_scheduler_in/

canduma

该仓库包含样板 Rust 代码,用于通过 JWT 启动并快速运行 GraphQL 原型。

它使用 actix-webJuniperDieseljsonwebtoken

Benchmarks with insert into PostgreSQL:

▶ ./bombardier -c 125 -n 10000000 http://localhost:3000/graphql -k -f body --method=POST -H "Content-Type: application/json" -s
Bombarding http://localhost:3000/graphql with 10000000 request(s) using 125 connection(s)

10000000 / 10000000 [===========================================================================] 100.00% 28777/s 5m47s
Done!
Statistics        Avg      Stdev        Max
  Reqs/sec     28788.66    2183.47   34605.95
  Latency        4.32ms   543.07us   110.95ms
  HTTP codes:
    1xx - 0, 2xx - 10000000, 3xx - 0, 4xx - 0, 5xx - 0
    others - 0
  Throughput:    20.75MB/s

项目地址:https://github.com/clifinger/canduma

reddit 参与讨论:https://www.reddit.com/r/rust/comments/em8bx9/update_of_our_rust_boilerplate_server_with/

RustZone: Writing Trusted Applications in Rust (Black Hat Asia 2018)

演讲中将探索使用 Rust 语言编写受信任的应用程序。 Rust 允许开发人员编写系统级代码,但提供安全性功能,包括内存安全性,类型安全性和错误处理。这些是开发受信任的应用程序的理想功能。油管地址:https://www.youtube.com/watch?v=5fxPuOrlE2I&feature=youtu.be

Rust Belt Rust 2019 的视频已发布

Rust Belt Rust(http://www.rust-belt-rust.com/)是在美国 Rust Belt 地区举行的关于 Rust 编程语言的会议。 Rust Belt Rust 2019 于 10 月 18 日星期五和 10 月 19 日星期六在俄亥俄州代顿举行。再次感谢我们所有的与会者,演讲者和赞助商!油管地址:https://t.co/DTFoG1dDyr?amp=1

编写 Web server 及其以外的技巧

油管地址:https://youtu.be/ZDy71QtAQgs?list=PLgC1L0fKd7UkVwjVlOySfMnn80Qs5TOLb

From 日报小组 @Jancd

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-10 track_caller 錯誤處理大突破

damody 发表于 2020-01-11 14:43

Tags:rust

更新我們的Rust Boilerplate server 使用 GraphQL (Async and Actix-web 2)

做了以下的更新

use async/await

use actix-web version 2

use anyhow + thiserror in place of failure

structopt

Read more

sntpc Rust SNTP 客戶端可以從 NTP servers 拿 timestamp

Read more

有人成功的驗證了rust可以跟unreal遊戲引擎整合

Read more

Rust基礎建設

目標1:明確Rust作為獨立項目的地位

有些公司想要商業投資Rust但因為 Mozilla 持有這個項目而卻步。

Rust應該要有自己的獨立基金會。

目標2:減輕一些實際困難

儘管Rust項目擁有自己的治理系統,但它從未擁有自己獨特的法人實體。該角色一直由Mozilla扮演。例如,Mozilla擁有Rust商標,而Mozilla是crates.io等服務的合法運營商。

作者希望Rust獨立出來,Mozilla成為其中一個投資者而不是持有者。

但作者又不希望Rust基金會不應僱用全職開發人員

造成這種情況的原因有很多,但最大的原因就是價格太貴了。

為該工作量提供資金將需要大量預算,這將需要大量籌款。

Read more

有人使用了Rust實作了BLAKE3

BLAKE3 是一種 cryptographic hash

類似 MD5 SHA1 等 Read more

Library team 從 IRC 移動到 Zulip

https://zulipchat.com/ 是一個類似slack的軟件。

Read more

Way Cooler驗屍報告

作者做了一個開源專案但是死的很慘

他用這篇文章做一個記錄

我最初的計劃是用C語言編寫它,因為這似乎是複合語言的流行語言(當時只有Gnome,KDE,Weston,E,Orbment和Sway的早期版本)。 Snirk 說服我研究Rust。 他對它的強大可靠性保證很感興趣(他的研究領域是編譯器和語言設計)。 它獨特的內存管理方法吸引了我,在嘗試了該語言之後,我們開始研究Way Cooler。

當時他們在 libweston, swc, wlc 中做選擇

最後他們選了 wlc

更清楚的是如何包裝Rust所使用的API。它具有非常簡單的內存模型和非常小的API界面。

我們試了範圍,並開始包裝wlc庫,以便能在Rust中使用它。我們設定了一個短期目標,用約400行程式碼從C轉換為慣用的Rust。

但是,在此階段犯了兩個錯誤,乍看之下似乎是矛盾的:我們跳入包裝wlc的速度太快了,但與此同時卻花了太多時間。

封裝給Rust使用的C庫並不是一件容易的事,如果我們知道這個問題,可能就不會這樣做了。

後面想支援Lua又想支援Nodejs然後庫的API又大改在3.X=>4.X 做了不相容更新。

然後我們都是自學很少跟人合作,在閱讀他人的代碼上異常困難。

後面又因為 Rust 實作樹資料結構不好作,搞了很久。

太長了,大家有興趣可以看原文

Read more

Arc 怎麼在Rust運作的呢?

就是原子計數器加指標

Read more

Terminal 0.2.0

類似 termion, crossterm, ncurses, pancurses 的

命令列 UI library

Read more

track_caller 錯誤處理大突破

Option::{expect,unwrap}Result::{expect, expect_err, unwrap, unwrap_err}#[track_caller]

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /rustc/da3629b05f8f1b425a738bfe9fe9aedd47c5417a/src/libcore/macros/mod.rs:16:40
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

變成

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:3:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

Read more

duckscript

用rust實作的腳本語言

Read more

為什麼要用Rust?我們有GC啊

Rust有速度上的優勢,並發上的自動檢查。

但跟Java一樣都開發的不快,Python是開發速度的首選。

不過Java有更好的IDE支援,生態系統與社群更強大,

對老闆來說更安心。

Read more

【Rust日报】 2020-01-11 postgres-query, 新的分词器库tokenizers

洋芋 发表于 2020-01-11 22:54

Tags:rust, 日报

postgres-query

这个crate提供了方便的宏和trait,可帮助编写SQL查询并将其结果收集到静态类型的结构中。

示例代码:

// Connect to the database
let client: Client = connect(/* ... */);

// Construct the query
let query = query!(
    "SELECT name, age FROM people WHERE age >= $min_age",
    min_age = 18
);

// Define the structure of the data returned from the query
#[derive(FromSqlRow)]
struct Person {
    age: i32,
    name: String,
}

// Execute the query
let people: Vec<Person> = query.fetch(&client).await?;

// Use the results
for person in people {
    println!("{} is {} years young", person.name, person.age);
}

Github

新的分词器库tokenizers

分词器的核心是用Rust编写的。提供当今最常用的分词器的实现,重点是性能和多功能性。

示例代码

use tokenizers::tokenizer::{Result, Tokenizer, EncodeInput};
use tokenizers::models::bpe::BPE;

fn main() -> Result<()> {
	let bpe_builder = BPE::from_files("./path/to/vocab.json", "./path/to/merges.txt")?;
	let bpe = bpe_builder
		.dropout(0.1)
		.unk_token("[UNK]".into())
		.build()?;

	let mut tokenizer = Tokenizer::new(Box::new(bpe));

	let encoding = tokenizer.encode(EncodeInput::Single("Hey there!".into()))?;
	println!("{:?}", encoding.get_tokens());

	Ok(())
}

Github

一个PR,在Rust 1.40中删除对proc-macro-hack的依赖

使用Rust 1.40时,类似函数的宏可以生成macro_rules!,因此,删除对 proc-macro-hack 的依赖非常容易。

PR信息

From 日报小组 洋芋

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-12 Rust编译出的可执行文件体积优化方法

makeco 发表于 2020-01-12 22:16

Tags:rust

为什么Rust编译出的可执行文件那么大?

#rust #exe

为什么相同应用用Rust编译出的可执行文件比C编译出的要大?下面这篇文章详细阐述了原因,并提出了多重可行的方案,帮你减小可执行文件的体积,这几种方法是:

  • 使用 --release 模式进行编译
  • 在发布之前,开启LTO压缩二进制文件体积
  • 如果你的应用不是内存密集型,使用系统分配器(需要nightly)
  • 你可以开启编译优化等级s/z
  • 还有一点建议对小的可执行文件效果不明显,但是你可以尝试UPX和其他可执行文件压缩,如果你的应用很大的话

Read More

不在微信也能运行小程序?小程序硬件框架正式上线!

#rust #mini

小程序从诞生到现在,我们经常收到这样的询问:小程序能脱离微信在其他终端上运行么?

例如,在跑步机上玩跳一跳;查看冰箱库存时顺手在显示屏使用生鲜网购小程序;酒店智能固话使用周边服务小程序,叫个送餐,定个电影票;甚至照个镜子都能用小程序。

答案是,可以!1月9日,微信小程序硬件框架正式开放,小程序可以脱离微信在不同终端上运行,各种硬件上都能跑小程序啦。

运行小程序硬件框架的设备要求

■ 最低配置

四核1.5GHz CPU

内存1GB RAM+4GB ROM

安卓5.0及以上

■ 建议配置

四核2GHz CPU

内存2GB RAM+8GB ROM

安卓7.1及以上

Read More

From 日报小组 格朗

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【Rust日报】 2020-01-14

joshsulin 发表于 2020-01-14 23:42

Tags:rust, 日报

ASM工作组已提交“关于提供稳定的内联汇编”的第一稿RFC

内联汇编(Inline assembly):目前,对内联汇编方面来讲,Rust 非常接近于 LLVM,这是一种不同于 gcc 的格式,因此,我们必须解决这种不匹配的问题。我们期待将来有一天,Rust 能够为内联汇编提供稳定的支持。

了解更多, 请阅读。 https://www.reddit.com/r/rust/comments/eo9pks/the_asm_working_group_has_submitted_their_first/

如何你想深入探讨 ELF、x86指令、内存映射、gdb、动态加载程序等知识, 以下内容对你有用.

Linux 可执行文件是什么?

不使用 exec 运行可执行文件

有兴趣的, 可以关注作者.

小工具包 parse_int 发布0.3.0 版本

将字符串中带有常用前缀的整数值 解析成 数字.

use parse_int::parse;
 
// decimal
let d = parse::<usize>("42")?;
assert_eq!(42, d);
 
// hex
let d = parse::<isize>("0x42")?;
assert_eq!(66, d);
 
// octal explicit
let d = parse::<u8>("0o42")?;
assert_eq!(34, d);
 
#[cfg(feature = "implicit-octal")]
{
    let d = parse::<i8>("042")?;
    assert_eq!(34, d);
}
 
// binary
let d = parse::<u16>("0b0110")?;
assert_eq!(6, d);

From 日报小组 @joshsulin

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

【rust日报】 2020-01-13 用rust编写的最小系统兼容服务管理器 : rustysd 更新

LacneQin 发表于 2020-01-13 22:14

Tags:rust

用rust编写的最小系统兼容服务管理器 : rustysd 更新

Rustysd是一个服务管理器,复制系统行为一部分配置。它着重于服务管理器的核心功能。因此,rustysd提供的功能数量很少。如果使用musl和strip’ed构建二进制文件,则二进制文件可能会很小,但通常rust会生成相对较大的二进制文件。

这意味着只要服务知知悉rustysd可以读取systemd单元文件(的一部分)并像运行systemd一样运行它们。由于rustysd不需要是PID1,因此它可以为不使用systemd的Linux发行版以及FreeBSD提供此功能(现在还未经测试其他BSD)。另外,它可以在docker中用作PID1,因此您可以运行需要由systemd在容器中运行的服务。

rustysd的下一个目标是:

  • 成为一个很好的工具
  • 成为rustysd在VM中充当init系统
  • 开发一个测试套件以能够捕获回归/错误的功能

项目仓库地址:https://github.com/KillingSpark/rustysd/tree/v0.1.0

用于Rust的Cranelift后端

目前项目正在进行中的工作是为在Cranelift 上构建的Rust创建后端,这有望大大减少调试编译耗时。

除了Rustc测试套件中的57个测试之外,其他所有测试都已通过,并取得惊人的进步。

几乎所有这些工作都是由bjorn3一手完成的。

详情前往项目GitHub仓库查看。

Rust数据库连接性(RDBC)更新

同时支持面向行和面向列的数据实际上非常简单。RDBC API应该支持将成批数据提取到实现 RowSet 特征的行集中,从而提供面向行和面向列的访问。

因为列中的所有值都具有相同的数据类型,所以我们可以使用类型安全的特征来访问这些值。

pub trait ColumnAccessor<T> {
    fn get(&self, i: u64) -> Result<Option<T>>;
}

行通常包含混合类型,因此这里我们将在方法而不是特征上指定泛型。

pub trait RowAccessor {
    fn get<T>(&self, i: u64) -> Result<Option<T>> where Self: Sized;
}

RowSet 特征示例

pub trait RowSet {
    /// get meta data about this row set
    fn meta_data(&self) -> Result<Box<dyn RowSetMetaData>>;
    /// Get an accessor for a row containing mixed types
    fn get_row(&self, i: u64) -> Result<Box<dyn RowAccessor>>;
    /// Get a column as a type-safe accessor
    fn get_column<T>(&self, i: u64) -> Result<Box<dyn ColumnAccessor<T>>>;
}

支持的数据 RowSet 将是面向行的或面向列的,始终可以同时以行和列的形式访问数据,但是其中一种方法肯定比另一种方法更有效。对于大多数用例来说这可能并不太重要,但是在某些用例中却很重要,因此元数据应公开有关本机格式的信息。

pub trait RowSetMetaData {
    fn row_oriented(&self) -> bool;
    fn num_rows(&self) -> u64;
    fn num_columns(&self) -> u64;
    fn column_name(&self, i: u64) -> String;
    fn column_type(&self, i: u64) -> DataType;
}

RDBC只是底层数据访问和查询执行API。它不打算取代像Diesel这样的ORM,尽管很快将有可能使用RDBC代替Diesel构建应用程序。

前往博客了解有关RDBC连接与RDBC迁移至东京的消息。

git-poly:用rust编写的极简multi repo工具

帮助越跨50多个git仓库进行开发更加轻松的工具。这是一个简单、轻巧的工具,可并行处理许多git repos。

以下项目与本项目处于同一位置:

  • git repo
  • git subtree
  • git slave
  • git submodule

前往Gitlab了解项目详情。

From 日报小组 @Lance

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅: