Rust serde_with快速参考

serde_with 是 Rust 中 serde 序列化/反序列化库的一个扩展,提供了许多有用的自定义序列化和反序列化方法。以下是一些常用的功能和适用场景: 字符串格式化 use serde_with::rust::display_fromstr; #[derive(Serialize, Deserialize)] struct Foo { #[serde_with(as = "display_fromstr")] bar: u32, } 适用于需要将数字类型序列化为字符串的场景。 时间格式化 use serde_with::chrono::datetime_utc_ts_seconds_from_any; #[derive(Serialize, Deserialize)] struct Foo { #[serde_with(as = "datetime_utc_ts_seconds_from_any")] time: DateTime<Utc>, } 适用于需要自定义时间格式的场景。 枚举字符串表示 use serde_with::{serde_as, DisplayFromStr}; #[serde_as] #[derive(Serialize, Deserialize)] struct Foo { #[serde_as(as = "DisplayFromStr")] bar: MyEnum, } 适用于将枚举序列化为字符串的场景。 跳过序列化默认值 use serde_with::skip_serializing_none; #[skip_serializing_none] #[derive(Serialize)] struct Foo { bar: Option<String>, } 适用于需要在序列化时忽略 None 值的场景。 自定义序列化/反序列化 use serde_with::{serde_as, FromInto}; #[serde_as] #[derive(Serialize, Deserialize)] struct Foo { #[serde_as(as = "FromInto<String>")] bar: MyCustomType, } 适用于需要为自定义类型实现序列化/反序列化的场景。...

在rust中使用protobuf

常规方式 安装必要工具 # 安装 protoc # 在 macOS 上: brew install protobuf # 在 Ubuntu 上: sudo apt-get install protobuf-compiler # 安装 Rust protobuf 代码生成器 cargo install protobuf-codegen 示例 创建一个protobuf的文件: message.proto syntax = "proto3"; package mypackage; message Person { string name = 1; int32 age = 2; string email = 3; } 然后执行命令 protoc --rust_out=. message.proto 如果是在项目中,在你的 Rust 项目中,添加必要的依赖到 Cargo.toml: [dependencies] protobuf = "2.27.1" 然后可以在代码中访问生成的内容 use protobuf::Message; mod message; // 引入生成的模块 use message::Person; fn main() { let mut person = Person::new(); person....

在go中使用CoAP

CoAP协议 CoAP(Constrained Application Protocol)是一种专为物联网(IoT)和受限环境设计的网络协议。它的主要目标是为资源受限的设备(如传感器、执行器等)提供一种轻量级的通信方式。以下是 CoAP 协议的几个关键特点和功能: 1. 轻量级设计 小开销:CoAP 使用 UDP(用户数据报协议)作为传输层,相比于 TCP(传输控制协议),它具有更小的头部开销,适合带宽有限的环境。 简化的消息格式:CoAP 消息格式简单,适合资源受限的设备。 2. 请求/响应模型 类似 HTTP:CoAP 采用类似于 HTTP 的请求/响应模型,客户端可以发送请求(如 GET、POST、PUT、DELETE)来与服务器交互。 资源导向:CoAP 允许客户端访问和操作服务器上的资源,资源通过 URI(统一资源标识符)进行标识。 3. 可靠性 确认机制:虽然 CoAP 基于 UDP,但它实现了可靠性机制,包括重传和确认,以确保消息的可靠传输。 非确认和确认消息:CoAP 支持两种类型的消息:确认消息(需要确认)和非确认消息(不需要确认),以适应不同的应用需求。 4. 观察功能 资源观察:CoAP 支持观察功能,允许客户端订阅资源的变化,当资源状态发生变化时,服务器会主动通知客户端。这减少了轮询请求的需要。 5. 多播支持 多播通信:CoAP 原生支持多播,允许服务器向多个客户端同时发送消息,适合需要广播信息的场景。 6. 安全性 DTLS:CoAP 可以与 DTLS(Datagram Transport Layer Security)结合使用,以提供数据加密和安全性,保护数据在传输过程中的安全。 应用场景 物联网:CoAP 广泛应用于物联网设备的通信,如智能家居、环境监测、工业自动化等。 资源受限设备:适合用于低功耗、低带宽的设备和网络环境。 在go中使用coap echo服务 server: package main import ( "fmt" "log" "github.com/plgd-dev/go-coap/v3" "github.com/plgd-dev/go-coap/v3/message" "github.com/plgd-dev/go-coap/v3/message/codes" "github.com/plgd-dev/go-coap/v3/mux" ) func main() { r := mux....

一些docker和k8s的笔记

常见的项目Dockerfile golang项目 # 构建阶段 FROM golang:1.23 AS builder # 设置工作目录, WORKDIR /app # 复制go.mod和go.sum文件 COPY go.mod go.sum ./ # 设置goproxy RUN go env -w GOPROXY='https://goproxy.io,https://goproxy.cn,direct' # 下载依赖 RUN go mod download # 复制源代码 COPY . . # 构建应用 RUN CGO_ENABLED=0 GOOS=linux go build -o server . # 运行阶段 FROM alpine:latest # 安装ca-certificates以支持HTTPS, RUN apk --no-cache add ca-certificates WORKDIR /root/ # 从构建阶段复制编译好的二进制文件 COPY --from=builder /app/server . # 暴露端口(如果您的应用监听某个端口) EXPOSE 8080 # 运行应用 CMD ["....

MacOS常用软件

聊天和社交 QQ - 80,90的青春。 微信 - 国内TOP1社交软件。 钉钉 - 阿里巴巴出品协同办公软件。 企业微信 - 腾讯出品协同办公软件。 飞书 - 字节跳动出品协同办公软件。 Telegram - 地下社交软件,通信加密。 X(原twitter) - 地下社交软件,了解国内外大事。 XDeck 𝕏桌面客户端 Franz 多合一聊天工具 邮箱工具 Spark 输入法及键盘扩展 AutoSwitchinput 当你在Mac上打开不同的软件的时候,它可以自动帮你切换中文和英文输入法 Input Source Pro,推友开发的一个输入法自动切换工具 Tickeys 键盘打字风格模拟应用, 支持 Cherry轴等多种风格. keycue 快捷键辅助应用, 帮助记忆快捷键. KeyKey macOS 上优雅好用的键盘打字练习。 Karabiner-Elements 键盘映射工具 翻译和外语学习工具 bob - 翻译神器 EasyDict GoldenDict 有道词典 deepl Eudic 新闻及阅读 NetNewsWire rss阅读软件 Reeder 界面优美的RSS订阅应用. 浏览器 Chrome - Google出品,全球最流行的浏览器。 vivaldi 我的偏爱浏览器,前opera团队开发的。 Safari - Apple自己的浏览器,毋庸置疑的好用。 Edge - 微软出品,基于Chromium内核,IE浏览器的替代者。 Firefox - Mozilla出品,早年开发者必备。 Tor - 洋葱浏览器,可浏览AW。 360极速浏览器Pro - 目前Mac上支持Flash的浏览器。 下载及同步工具 Downie4 - 视频下载工具,可以下载YouTube,bilibili等视频网站的视频,并且是满速下载。 Neat Download Manager - 多线程下载器,跑满你的带宽。 迅雷 坚果云 Motrix Aria2GUI blip qBittorrent Enhanced Edition tssh brew install trzsz-ssh 代理工具 nekoray v2rayN 第一次运行请执行xattr -cr /Applications/v2rayN....

在rust中使用duckdb的一些笔记

基本使用 添加cargo包 在cargo.toml中添加 [dependencies] duckdb = {version = "1"} 示例代码 use duckdb::{params, Connection, Result}; use duckdb::arrow::record_batch::RecordBatch; use duckdb::arrow::util::pretty::print_batches; #[derive(Debug)] struct Person { id: i32, name: String, data: Option<Vec<u8>>, } fn main() -> Result<()> { let conn = Connection::open_in_memory()?; conn.execute_batch( r"CREATE SEQUENCE seq; CREATE TABLE person ( id INTEGER PRIMARY KEY DEFAULT NEXTVAL('seq'), name TEXT NOT NULL, data BLOB ); ")?; let me = Person { id: 0, name: "Steven".to_string(), data: None, }; conn....

跟AI学习Rust的Atomic

QA 如何理解rust的atomic,常见操作有哪些 Rust中的原子类型(atomic types)是一种用于并发编程的工具,它们提供了对共享内存的安全访问机制。以下是对Rust原子类型的理解和常见操作: 理解Rust的atomic: 原子操作是不可分割的操作,它们在多线程环境中能够保证数据的一致性。 Rust的原子类型位于std::sync::atomic模块中。 原子类型可以在多个线程间安全地共享,无需使用互斥锁。 它们通常用于实现无锁数据结构和同步原语。 常见的原子类型操作: 加载(load): let value = atomic.load(Ordering::SeqCst); 存储(store): atomic.store(new_value, Ordering::SeqCst); 比较并交换(compare_and_swap): let result = atomic.compare_and_swap(expected, new, Ordering::SeqCst); 获取并增加(fetch_add): let previous = atomic.fetch_add(1, Ordering::SeqCst); 获取并减少(fetch_sub): let previous = atomic.fetch_sub(1, Ordering::SeqCst); 获取并按位或(fetch_or): let previous = atomic.fetch_or(0b0001, Ordering::SeqCst); 获取并按位与(fetch_and): let previous = atomic.fetch_and(0b1110, Ordering::SeqCst); 获取并按位异或(fetch_xor): let previous = atomic.fetch_xor(0b1111, Ordering::SeqCst); 这些操作都需要指定内存顺序(memory ordering),如SeqCst(顺序一致性)、Relaxed(松散)等,以控制操作的同步级别。 需要注意的是,虽然原子操作提供了线程安全的访问,但它们的使用可能会影响性能。在实际应用中,应根据具体需求选择合适的同步机制。 Rust的atomic常见内存顺序有哪些,它们各自的应用场景有哪些 Rust中的内存顺序(Memory Ordering)是一个重要的概念,它定义了原子操作如何与其他内存操作交互。在std::sync::atomic::Ordering枚举中,Rust提供了以下几种内存顺序选项: Ordering::Relaxed Ordering::Release Ordering::Acquire Ordering::AcqRel Ordering::SeqCst 这些选项的主要区别如下: Ordering::Relaxed(松散顺序) 最宽松的内存顺序 只保证原子操作本身的原子性 不提供任何同步或顺序保证 性能最好,但最难推理...

GIT 别名的 10 个级别【机翻】

第一部分:初级到中级概念 原文 https://www.eficode.com/blog/10-levels-of-git-aliases-beginner-to-intermediate-concepts 您是否知道 Git 可以通过多种方式根据您的需求进行定制? 在 Git 中创建别名是一项强大的功能,它允许您为更长的 Git 命令(以及更多命令)定义“快捷方式”。对于某些人来说,它只是一个让命令行 Git 使用变得可行的工具,但我将向您展示 Git 别名是如此强大,它们可以帮助使命令行成为使用 Git 的首选且最有效的方式。 创建 Git 别名的主要动机可能是以下一项或多项: 优化:为常用的 Git 命令创建快捷方式。 定制:让 Git 按照您想要的方式运行或支持团队商定的习惯。 记忆:易于记忆的复杂操作快捷键。 在我的博客系列的第 1 部分中,我将带您从非常简单的基础知识开始,介绍只需键入较长命令的 Git 别名,一直到甚至许多经验丰富的 Git 老手从未使用过的更高级功能。 第 2 部分将从这里继续,介绍更高级的概念,并尝试真正“外面”使用 Git 别名,包括一些彻头彻尾疯狂的示例,然后再讨论解决相同需求的替代方案。 学习和理解这些技术,无论是用于从别人那里窃取的别名还是自己冒险突破界限,都将使您成为更高效、更强大的 Git 用户,并有望让您使用 Git 的日常生活变得更加愉快。在此过程中,您可能还会学到一些提示和技巧,并探索您甚至不知道的 Git 角落。 什么是 Git 别名,我们如何设置它们? Git 别名是 Git 子命令的替代,就像 Bash 别名是其他 Bash 命令或脚本的替代一样。 Git 只是允许您定义自己的 Git 命令来执行您想要的操作,并且可以与内置命令无缝地使用。 别名是在 Git 配置层次结构中定义的,但由于我们通常希望它们在我们计算机上的任何地方都可以工作,因此全局配置是它们的自然家园。 您可以通过直接编辑全局配置文件或使用git config命令来添加别名。 要创建您的第一个简单别名,只需尝试: $ git config --global alias....

在局域网多台设备上执行ssh脚本

需要的软件包 需要安装sshpass和nmap 代码示例 run_on_lan_machines.sh #!/usr/bin/env bash USERNAME="czyt" PASSWORD="upwd" SUDO_PASSWORD="supwd" SCRIPT="install_test.sh" REMOTE_SCRIPT_PATH="/tmp/$SCRIPT" IP_RANGE="172.168.1.0/24" # 扫描在线主机 echo "Scanning for hosts with open SSH ports..." nmap -p 22 $IP_RANGE --open -oG scan_result.txt # 提取在线主机IP地址 grep "/open/tcp//ssh/" scan_result.txt | awk '{print $2}' > ip_list.txt # 检查是否有找到的IP地址 if [[ ! -s ip_list.txt ]]; then echo "No hosts with open SSH ports found." exit 1 fi # 逐个IP执行脚本 while IFS= read -r ip; do echo "Uploading and executing script on $ip" # 上传脚本到远程主机 sshpass -p "$PASSWORD" scp -o StrictHostKeyChecking=no "$SCRIPT" "$USERNAME@$ip:$REMOTE_SCRIPT_PATH" if [[ $?...

定制你自己的cockpit

什么是Cockpit Cockpit,官网https://cockpit-project.org是一个基于web的服务器管理界面,可以通过浏览器访问。它提供了一个统一的管理界面,用于管理和监控Linux服务器。以下是Cockpit的一些主要特点: 易用性 提供直观的图形化界面,无需命令行操作 支持多种Linux发行版,如Red Hat、CentOS、Fedora、Debian、Ubuntu等 可以通过浏览器远程访问,无需安装客户端软件 功能特性 系统监控:实时查看CPU、内存、磁盘、网络等系统资源的使用情况 服务管理:启动、停止、重启系统服务 存储管理:管理磁盘分区、LVM、RAID等存储设备 网络配置:配置网卡、防火墙、虚拟网络等网络设置 日志查看:查看系统日志和审计日志 用户管理:添加、删除、修改系统用户和组 软件包管理:安装、更新、删除软件包 安全性 基于角色的访问控制(RBAC),可以为不同用户设置不同的权限 支持SSL/TLS加密,保护数据传输安全 可以与LDAP、Kerberos等认证系统集成 总的来说,Cockpit是一个功能强大、易用的Linux服务器管理工具,可以大大提高管理员的工作效率。它适用于各种规模的Linux服务器,是Linux系统管理的一个不错的选择。 安装 cockpit在主流操作系统都一键安装的包。请参考https://cockpit-project.org/running.html的Installation & Setup部分 自定义你的cockpit 修改登陆界面标题 修改 /etc/cockpit/cockpit.conf [WebService] LoginTitle=gophers land 更多参数,请参考 https://cockpit-project.org/guide/latest/cockpit.conf.5.html 编写一个rustdesk id viewer页面 创建目录结构 mkdir -p /usr/share/cockpit/rustdesk cd /usr/share/cockpit/rustdesk cockpit支持从下面两个位置获取配置 ~/.local/share/cockpit 在您的主目录中。它用于用户特定的包和您正在开发的包。您可以即时编辑这些内容并刷新浏览器以查看更改。 /usr/share/cockpit 和 /usr/share/local/cockpit是可供系统所有用户使用的已安装软件包的位置。更改此路径中的文件需要管理员(“root”)权限。在 Cockpit 运行时,不应更改这些内容。 因为涉及一些js库,我想复用原来的,所以我这里使用的是第二个位置。 可以通过cockpit-bridge --packages 查看已经安装的包: apps Applications /usr/share/cockpit/apps base1 /usr/share/cockpit/base1 metrics /usr/share/cockpit/metrics network Networking /usr/share/cockpit/networkmanager rustdesk RustDesk ID /usr/share/cockpit/rustdesk shell /usr/share/cockpit/shell static /usr/share/cockpit/static storage Storage /usr/share/cockpit/storaged system Overview, Services, Logs, Terminal /usr/share/cockpit/systemd updates Software updates /usr/share/cockpit/packagekit users Accounts /usr/share/cockpit/users 创建文件 manifest....