< 返回版块

长琴 发表于 2021-10-24 22:51

Tags:rust,日报

sea-orm:异步动态 ORM

SeaORM 是一种关系 ORM,可帮助您在 Rust 中构建轻量级和并发的 Web 服务。

  • 异步:依赖 SQLx
  • 动态:基于 SeaQuery
  • 可测试
  • 服务导向

来看个 Select 的例子:

// find all models
let cakes: Vec<cake::Model> = Cake::find().all(db).await?;

// find and filter
let chocolate: Vec<cake::Model> = Cake::find()
    .filter(cake::Column::Name.contains("chocolate"))
    .all(db)
    .await?;

// find one model
let cheese: Option<cake::Model> = Cake::find_by_id(1).one(db).await?;
let cheese: cake::Model = cheese.unwrap();

// find related models (lazy)
let fruits: Vec<fruit::Model> = cheese.find_related(Fruit).all(db).await?;

// find related models (eager)
let cake_with_fruits: Vec<(cake::Model, Vec<fruit::Model>)> =
    Cake::find().find_with_related(Fruit).all(db).await?;

设计思想:「分层抽象」,几乎所有的东西都是可配置的,编译时不知道底层数据库是什么(数据库无关)。使用 API 时有不同的阶段,有两个维度来导航 SeaORM 代码库,“阶段” 和 “抽象”。

  • 首先是「申报阶段」,实体和它们之间的关系是用 EntityTrait、ColumnTrait 和 RelationTrait 等定义的。
  • 其次是「查询构建阶段」
    • 最顶层是 Entityfind*insertupdatedelete 方法,可以直观的进行基本的 CRUD 操作。
    • 再往下一层是 SelectInsertUpdateDelete 结构,它们每个都有自己的 API 用于更高级的操作。
    • 再往下一层是 SeaQuery SelectStatementInsertStatementUpdateStatementDeleteStatement,它们有丰富的 API 供您处理 SQL 语法树。
  • 三是执行阶段。一组单独的结构,SelectorInserterUpdaterDeleter,负责针对数据库连接执行语句。
  • 最后是解析阶段,此时查询结果被转换为 Rust 结构体以供使用。

因为只有执行和解析阶段是特定于数据库的,我们可以通过替换它们来使用不同的驱动程序。

Diesel 对比:

Diesel SeaORM
Sync Async
Static Dynamic
Native Driver Pure Rust

官网:https://www.sea-ql.org/SeaORM/

GitHub:https://github.com/SeaQL/sea-orm

block-ciphers:用纯 Rust 编写的分组密码算法集合

支持多种算法,使用方法如下:

use aes::Aes128;
use block_modes::{BlockMode, Cbc};
use block_modes::block_padding::Pkcs7;
use hex_literal::hex;

// create an alias for convenience
type Aes128Cbc = Cbc<Aes128, Pkcs7>;

let key = hex!("000102030405060708090a0b0c0d0e0f");
let iv = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff");
let plaintext = b"Hello world!";
let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap();

// buffer must have enough space for message+padding
let mut buffer = [0u8; 32];
// copy message to the buffer
let pos = plaintext.len();
buffer[..pos].copy_from_slice(plaintext);
let ciphertext = cipher.encrypt(&mut buffer, pos).unwrap();

assert_eq!(ciphertext, hex!("1b7a4c403124ae2fb52bedc534d82fa8"));

// re-create cipher mode instance and decrypt the message
let cipher = Aes128Cbc::new_from_slices(&key, &iv).unwrap();
let mut buf = ciphertext.to_vec();
let decrypted_ciphertext = cipher.decrypt(&mut buf).unwrap();

assert_eq!(decrypted_ciphertext, plaintext);

GitHub:https://github.com/RustCrypto/block-ciphers

darkfi:匿名的 DeFi 网络

DarkFi 是一个匿名的 DeFi 网络。它的目标是提供灵活的私有原语,可以用来创建任何类型的应用程序。 DarkFi 使用零知识密码学的进步,并创建了一种合同语言和开发人员工具包,旨在使匿名工程对开发人员具有高度的可访问性。

官网:https://dark.fi/

GitHub:https://github.com/darkrenaissance/darkfi

tunneler:隧道工具

Rust 实现的,通过 TCP、(相互)TLS 或 DNS(权威服务器或直接连接)隧道传输 TCP 或 UDP 流量。整体架构如下:

图片地址:https://img.gejiba.com/image/zqi53

每个可执行文件包含 2 个组件,通过客户端 stream 通道(字节读取器和写入器元组)进行通信:

  • 客户端监听器绑定套接字并将传入和传出的流量转为新的流。
  • 客户端 tunneler 将流读取器和写入器转为隧道协议。
  • 服务器 untunneler 根据隧道协议绑定套接字并将隧道流量转换回原始流。
  • 服务器转发器将流写入器和读取器转换回流量。

基于 TCP 的流量被简单地转换为流。 基于 UDP 的流量转换取决于隧道协议。基于 UDP 的流量还需要一种方法来识别现有客户端以继续其会话。解决方案是内存中的客户端缓存,它将客户端的标识符映射到其对应的流。

GitHub:https://github.com/dlemel8/tunneler

gateway-rs:Helium Light 网关

Helium 网关应用程序是一项旨在在基于 Linux 的 LoRaWAN 网关上运行的服务。它旨在与典型的 LoRa 数据包转发器一起运行,并通过 Semtech 的网关消息传递协议(GWMP,使用 JSON v1 或 v2)进行连接。

Helium Gateway 应用程序会做两件事:

  • 从网关服务获取区块链上下文,例如路由表和 OUI 端点;这意味着应用程序不需要维护区块链副本的完整分类帐。
  • 将数据包连接并路由到适当的 OUI 端点(如 Helium 路由器)。

GitHub:https://github.com/helium/gateway-rs

FileClassed:批处理文件管理器

高效、轻量、可配置的文件管理器。实现很简单:它在某些目录(可以配置)中取一个文件,然后组织它们,最后将它们移动到一个目录(也可以配置)。

大概就是这么个效果:

config file :
---
dest: ~/Documents
dirs:
  - ~/Documents-source

once: false
timeinfo: false
static_mode: false
sleep: 1000

codes:
  hst: History
  cnt: Century
  cs: Computer Science
  en: English
  chin: Chinese
  mt: Mathematics
  sp: Sports
  phy: Physics
  ch: Chemestry
  glb: Global
  gr: Greek
  fr: French
  asg: Assignments

Before :
~/Documents-source/hst/<fr> <hst>.18th <cnt>.Consulate.pdf
~/Documents-source/Computer/cs.algorithms and data structures.dvi
~/Documents-source/very/deep/meaning/gr.statues weren't white.mp4
~/Documents-source/such/nested/asg.mt.integration.tex
~/Documents-source/chin.Great Wall.odt

After :
~/Documents/French History/18th Century/Consulate.pdf
~/Documents/Computer Science/algorithms and data structures.dvi
~/Documents/Greek/statues weren't white.mp4
~/Documents/Assignments/Mathematics/integration.tex
~/Documents/Chinese/Great Wall.odt

注意 Before 中每一个文件的「最后一部分」,他们会被转换为 After 中的目录。

GitHub:https://github.com/Eolien55/FileClassed

rust-kernel-barebones:Rust 内核和配置脚本

一个最小的 64 位 Rust 内核和一堆配置脚本,可用于使用 Nightly-Rust 编译器引导操作系统开发。使用 Rust OsDev 社区构建的工具如 xbuild、bootimage、bootloader crates,并将所有这些工具配置为协同工作。从而开发人员不必担心 toochain 的配置。工具链构建并配置项目以使用 x86_64-unknown-none 目标。 一些功能包括:

  • 配置整个环境的脚本。
  • 构建内核并使用 Qemu 模拟的脚本。
  • VS Code RLS 配置。

GitHub:https://github.com/Narasimha1997/rust-kernel-barebones

simple-undo:undo和redo

使用方法如下:

use simple_undo::Undo;

let mut message = Undo::new(String::new());
message.update(|text| text.push_str("Simple ")); // 步骤1
message.update(|text| text.push_str("undo !"));  // 步骤2
assert_eq!(*message, "Simple undo !");

message.undo(); // "Simple "  撤销步骤2
message.undo(); // ""         撤销步骤1
message.redo(); // "Simple "  再执行步骤1

message.update(|text| text.push_str("redo !"));
assert_eq!(*message, "Simple redo !");

let result: String = message.unwrap();
assert_eq!(result, "Simple redo !");

GitHub:https://github.com/didibear/simple-undo

学习资源


From 日报小组 长琴

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页