跟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(松散顺序) 最宽松的内存顺序 只保证原子操作本身的原子性 不提供任何同步或顺序保证 性能最好,但最难推理...

July 9, 2024 · 1 min · czyt

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....

June 25, 2024 · 9 min · czyt

在局域网多台设备上执行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 [[ $?...

June 21, 2024 · 1 min · czyt

定制你自己的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....

June 9, 2024 · 2 min · czyt

在树莓派3b上搭建GitHub Linux arm64 runner

最近需要在GitHub Action上自动构建一些软件,但是Github 不提供Arm64的runner,自能自建。 github 官方准备在2024年底开始为开源项目提供arm的runner 树莓派设置 Arch系统 安装基本软件 安装下面的这些软件,不同的构建可能有所区别: sudo pacman -S curl zip unzip tar cmake ninja docker Github Action 依赖于docker,所以我们需要安装好docker sudo pacman -S docker 然后将当前用户添加到docker的组 sudo usermod -aG docker $USER 查看和确认: grep docker /etc/group Ubuntu系统 安装基本软件 docker 安装前的配置 # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker....

May 22, 2024 · 2 min · czyt

一些RustDesk部署的笔记

自建 Server 搭建中转服务器 参考官方 https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/install/ 一些有用的链接: https://github.com/infiniteremote/installer/blob/main/install.sh 搭建api server api server是高级版的功能,但是我们可以通过自建api server实现设备id同步等部分操作。推荐使用: https://github.com/kingmo888/rustdesk-api-server https://github.com/sctg-development/sctgdesk-server 这个是带web console的用户名和密码分别是admin和Hello,world! https://github.com/lantongxue/rustdesk-api-server https://github.com/v5star/rustdesk-api 更多的实现,可以去Github 搜一搜 https://github.getafreenode.com/topics/rustdesk-api-server 客户端自定义部署 基于Github Action 参考官方 https://rustdesk.com/docs/en/dev/build/all/ 对于arm版本的自动化构建,Github Action暂时不提供arm64的runner 基于配置文件和命令行 RustDesk有用的命令行参数 --password 可用于设置永久密码。 --get-id 可用于检索 ID。 --set-id 可用于设置ID,请注意ID应以字母开头。 --silent-install 可用于在 Windows 上静默安装 RustDesk。 RustDesk 配置文件 RustDesk的配置文件,windows为"%appdata%\RustDesk\config\RustDesk2.toml"linux则为~/.config/rustdesk/RustDesk2.toml,下面是一个完整的配置文件示例: rendezvous_server = 'rustdesk.xxxx.tech:21116' nat_type = 1 serial = 0 [options] # 对应安全选项->权限中的完全访问 access-mode = 'full' # 对应安全选项->安全->允许IP直接访问 direct-server = 'Y' # 对应安全选项->安全->自动关闭不活跃的会话 allow-auto-disconnect = 'Y' stop-service = 'Y' key = 'KEY' relay-server = 'IPADDRESS' api-server = 'https://IPADDRESS' custom-rendezvous-server = 'rustdesk....

May 17, 2024 · 1 min · czyt

Windows ollama一些有用的批处理脚本

模型设置 模型路径设置 @echo off echo set models storage path to current Dir %~dp0models SETX OLLAMA_MODELS %~dp0models echo setup done timeout 5 这个脚本会将模型的存储路径放在批处理相同目录的models目录下 启动 一键启动ollam和对应模型 @echo off echo start ollama... start %~dp0ollama.exe serve echo boot model start %~dp0ollama.exe run phi3

May 9, 2024 · 1 min · czyt

Nom指南中文版

原文https://tfpk.github.io/nominomicon/introduction.html,使用Google进行机翻 nominomicon 欢迎阅读这本关于Nom的书;使用 Nom 解析器发挥巨大作用的指南。本指南将向您介绍使用 Nom 的理论和实践。 本指南仅假设您: 想学习Nom, 已经熟悉 Rust。 Nom 是一个解析器组合器库。换句话说,它为您提供了定义以下内容的工具: “解析器”(接受输入并返回输出的函数),以及 “组合器”(采用解析器并将它们组合在一起的函数!)。 通过将解析器与组合器相结合,您可以从简单的解析器构建复杂的解析器。这些复杂的解析器足以理解 HTML、mkv 或 Python! 在我们出发之前,列出一些注意事项很重要: 本指南适用于 Nom7。 Nom 发生了重大变化,因此如果您正在搜索文档或 StackOverflow 答案,您可能会找到较旧的文档。一些常见的表明它是旧版本的指标是: 2021 年 8 月 21 日之前的文档 named! 宏的使用 使用 CompleteStr 或 CompleteByteArray 。 Nom 可以解析(几乎)任何东西;但本指南几乎完全专注于将完整的 &str 解析为事物。 第一章:Nom 方式 首先,我们需要了解 nom 思考解析的方式。正如简介中所讨论的,nom 让我们构建简单的解析器,然后组合它们(使用“组合器”)。 让我们讨论一下“解析器”实际上是做什么的。解析器接受输入并返回结果,其中: Ok 表示解析器成功找到了它要查找的内容;或者 Err 表示解析器找不到它要查找的内容。 如果解析器成功,它将返回一个元组。元组的第一个字段将包含解析器未处理的所有内容。第二个将包含解析器处理的所有内容。这个想法是解析器可以愉快地解析输入的第一部分,而无法解析整个内容。 如果解析器失败,则可能会返回多个错误。然而,为了简单起见,在接下来的章节中,我们将不对这些进行探讨。 ┌─► Ok( │ what the parser didn't touch, │ what matched the regex │ ) ┌─────────┐ │ my input───►│my parser├──►either──┤ └─────────┘ └─► Err(....

April 29, 2024 · 7 min · czyt

在你的Rust程序中使用Deref和DerefMut trait

Deref Deref 是一种 Rust 编译器宏,用于实现 Deref trait。Deref trait 允许将自定义类型转换为引用,从而使其能够用于任何需要引用的地方。 Deref 宏通常用于以下场景: 新类型模式: 当您定义一个新类型时,deref 宏可以使其能够像引用一样使用。例如,您可以创建一个 Box 类型,该类型将值存储在堆上,并实现 Deref trait 以便可以使用 * 运算符访问值。 链式访问: deref 宏可以用于创建链式访问语法。例如,您可以创建一个 Vec<Box<T>> 类型,其中 T 是任何可实现 Deref trait 的类型。这允许您使用 * 运算符在向量中迭代并访问每个值。 泛型代码: deref 宏可以用于编写泛型代码,该代码可以与任何可实现 Deref trait 的类型一起使用。例如,您可以创建一个函数,该函数接受任何可实现 Deref trait 的类型并返回其值。 deref宏在 Rust 中扮演着重要的角色,它允许你自定义类型在特定情况下表现得像引用一样。这带来了许多便利,例如: 简化访问底层数据: 无需手动解引用,直接访问结构体内部数据。 使用运算符重载: 使自定义类型支持 * 和 [] 等运算符。 自动解引用: 在需要引用的地方,自动解引用自定义类型。 实用例子 1. 自定义智能指针 use std::ops::Deref; struct MyBox<T>(T); impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) -> &Self::Target { &self....

April 25, 2024 · 3 min · czyt

一些Rust的机器学习资料

代码示例 ONNX web interface to YOLOv8 object detection neural network implemented on Rust. 仓库地址 Client/server face detection from your webcam with tokio, axum, tract-onnx and the lightweight ultraface network. 仓库地址 Segment anything inference using Rust llm https://github.com/jondot/awesome-rust-llm https://github.com/gabotechs/MusicGPT 其他 https://github.com/rustai-solutions 文章 图书

April 24, 2024 · 1 min · czyt