Arch Linux 常用软件

本文部分内容基于manjaro,另外如果喜欢苹果界面,可以试下pearos。理论上基于Arch的发行版都可以使用本文进行安装。如果您安装好了manajro但是又不想重装系统,可以试下这个脚本来将Manjaro自动转换为Arch,。 Arch 安装后必装的软件 通过archinstall 安装以后,是没图形界面的。需要安装下面的一些软件和配置 安装时,声音后端的选择: PulseAudio,历史悠久、最为常用; PipeWire,新生代,采用全新架构,整合多种音频后端(PulseAudio、ALSA和JACK),提供低延迟的音频体验 启用网络 systemctl enable dhcpcd systemctl enable wpa_supplicant systemctl enable NetworkManager 蓝牙 sudo systemctl enable --now bluetooth 如果没这个服务,可能需要通过 paru -S bluetooth进行安装。 如果需要启用蓝牙音频支持,请安装 paru -S pulseaudio-bluetooth 蓝牙高级管理工具 paru -S blueman 打印机 paru -S cups ghostscript gsfont 然后启动服务 sudo systemctl enable --now cups // 可能需要启动 sudo systemctl enable --now cups-browsed 打印机驱动 paru -S foomatic-db foomatic-db-ppds # 基本驱动 paru -S foomatic-db-nonfree foomatic-db-nonfree-ppds # 非自由软件驱动 启用MTP/PTP支持 和Windows一样,Linux也支持MTP、PTP设备,这样就可以方便地与安卓手机、数码相机等外设连接,管理文件。不过对这类设备的支持并非与生俱来,而是有赖于GVFS(Gnome Virtual File System),它把对其他设备或网络环境的访问抽象成一系列I/O接口,意味着可以像平时读写磁盘那样访问它们。...

February 23, 2022 · 21 min · czyt

go-kratos使用备忘

需要特别注意的一些建议 API路由覆盖的问题 比如有两个接口 A get /v1/user/{user_id}和 B get /v1/user/profile如果A定义在B之前,那么B可能会被A覆盖路由。需要将A放到B之前。 JWT使用的建议 摘自极客时间课程《高并发系统实战课》 通讯过程必须使用 HTTPS 协议,这样才可以降低被拦截的可能。 要注意限制 token 的更换次数,并定期刷新 token,比如用户的 access_token 每天只能更换 50 次,超过了就要求用户重新登陆,同时 token 每隔 15 分钟更换一次。这样可以降低 token 被盗取后给用户带来的影响。 Web 用户的 token 保存在 cookie 中时,建议加上 httponly、SameSite=Strict 限制,以防止 cookie 被一些特殊脚本偷走。 自定义接口返回内容 正常的响应序列化逻辑通过Response Encoder实现。 错误的序列化逻辑通过ErrorEncoder实现。 注意:自定义Encoder后,可能会遇到零值字段被忽略的情况,可以参考这个issue。具体的解决办法是 proto定义返回内容,然后将生成的类型在encoder中使用。 简单代码大致如下: proto定义 import "google/protobuf/any.proto"; // BaseResponse is the base response message BaseResponse{ int32 code = 1 [json_name = "code"]; google.protobuf.Any data = 2 [json_name = "data"]; } go代码...

August 12, 2022 · 32 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/rustai-solutions 文章 图书

April 24, 2024 · 1 min · czyt

一些rust clap库的笔记

小试牛刀 clap是rust下面的一款命令行解析的库,下面是一些使用的笔记。 在Cargo.toml中添加下面的依赖 [dependencies] clap = {version = "4",features = ["derive"]} 对应feature的作用如下: 默认特性 std: Not Currently Used. Placeholder for supporting no_std environments in a backwards compatible manner. color: Turns on colored error messages. help: Auto-generate help output usage: Auto-generate usage error-context: Include contextual information for errors (which arg failed, etc) suggestions: Turns on the Did you mean '--myoption'? feature for when users make typos. 可选特性 deprecated: Guided experience to prepare for next breaking release (at different stages of development, this may become default) derive: Enables the custom derive (i....

April 19, 2024 · 5 min · czyt

使用 Pest 和 PEG 构建 Rust 解析器【译】

本文原为为 https://blog.logrocket.com/building-rust-parser-pest-peg/,使用Google翻译进行机翻,部分内容做了细微润色。 编写一个高效的词法分析器对来解析复杂的结构可能具有挑战性。如果格式或结构是固定的,并且您必须以易于理解、维护和扩展以适应未来更改的方式编写解析器,那么这会变得更加复杂。 在这些情况下,我们可以使用解析器生成器,而不是手写解析器或手动解析我们的项目。在本文中,我们将回顾什么是解析器生成器,并探索一个名为 Pest 的 Rust 解析工具。我们将涵盖: [TOC] 请注意,您应该能够轻松地阅读和编写基本的 Rust 代码,例如函数、结构和循环。 什么是解析器生成器? 解析器生成器是一些程序,它接受解析器需要考虑的规则,然后以编程方式为您生成一个解析器,该解析器将根据这些规则解析输入。 大多数时候,规则以简化语言(例如正则表达式)提供给解析器生成器。因此,当您想要通过更改规则或添加新规则来更新解析器时,您只需更新或添加规则的正则表达式即可。然后,当您运行解析器生成器时,它将重写解析器以适应这些规则。 可以想象使用这样的解析工具可以节省多少时间。许多解析器生成器还会生成词法分析器,因此您不必自己编写词法分析器。如果生成的词法分析器不适合您,您可以选择使用您自己的词法分析器运行解析器(如果需要)。 目前,Rust 生态系统中有多个解析器生成器可供您使用。其中最受欢迎的三个是 LalrPop、Nom 和 Pest。 LalrPop 与 Yacc 非常相似,它让您定义规则和相应的操作。我个人用它来为我的 8086 模拟器项目编写规则。 Nom 是一个解析器组合器库,您可以在其中将规则编写为函数组合。这更面向解析二进制输入,但也可用于解析字符串。 最后,Pest 使用 Parsing Expression Grammar 来定义解析规则。我们将在这篇文章中详细探讨 Rust 与 Pest 的解析。 Pest 中的解析表达式语法是什么? 解析表达式语法(PEG)是用 Pest 定义 Rust 解析“规则”的方法之一。 Pest 接受具有此类规则定义的文件的输入,并生成遵循它们的 Rust 解析器。 在编写规则时,您应该考虑 Pest 和 PEG 的三个定义特征。 第一个特点是贪婪匹配。 Pest 将始终尝试将输入的最大值与规则相匹配。例如,假设我们编写了如下规则: match one or more alphabets 在这种情况下,Pest 将消耗输入中的所有内容,直到达到数字、空格或符号。在此之前它不会停止。 要考虑的第二个特征是交替匹配是有序的。为了理解这意味着什么,假设我们给出了多个匹配来满足一条规则,如下所示: rule1 | rule2 | rule3 Pest 将首先尝试匹配 rule1 。当且仅当 rule1 失败时,Pest才会尝试匹配 rule2 ,依此类推。如果第一条规则匹配,Pest 将不会尝试匹配任何其他规则来找到最佳匹配。...

April 19, 2024 · 10 min · czyt

使用rust操作mongodb

准备工作 使用rust进行mongodb连接需要添加依赖,在Cargo.toml中添加下面的依赖 [dependencies] mongodb="2" serde = "1" 添加serde的原因是我们建模的时候需要用。 预备知识 连接数据库 下面是我们的本地数据库连接 const CONNECT_STR:&str = "mongodb://czyt:[email protected]:27017"; 然后使用连接字符串进行数据库连接 let mut client_options = ClientOptions::parse_async(CONNECT_STR).await?; // Set the server_api field of the client_options object to Stable API version 1 let server_api = ServerApi::builder() .version(ServerApiVersion::V1) .build(); client_options.server_api = Some(server_api); // Create a new client and connect to the server let client = Client::with_options(client_options)?; // Send a ping to confirm a successful connection client.database("admin").run_command(doc! { "ping": 1 }, None)....

April 15, 2024 · 2 min · czyt

enum_dispatch在rust中的简单使用

请先看下面这个例子: enum Creatures { Dog(Dog), Cat(Cat), } trait Animal { fn make_sound(&self); } struct Dog; struct Cat; impl Animal for Dog { fn make_sound(&self) { println!("Bark!"); } } impl Animal for Cat { fn make_sound(&self) { println!("Meow!"); } } fn main() { let animals: Vec<Creatures> = vec![ Creatures::Dog(Dog), Creatures::Cat(Cat), ]; for animal in animals { match animal { Creatures::Dog(dog) => dog.make_sound(), Creatures::Cat(cat) => cat.make_sound(), } } } 在 main 函数中,我们创建了一个名为 animals 的 Vec<Creatures> 向量,其中包含不同种类的生物。遍历 animals 向量时,使用 match 语句来确定每个生物的实际类型,然后调用相应实例的 make_sound 方法。...

April 8, 2024 · 2 min · czyt

使用Mono.Cecil自动补丁.net程序

坚果云是我常用的一个工具,但是我一般喜欢使用绿色版,不喜欢程序到处写文件,也不喜欢重装以后还要各种登录。所以要折腾“绿色版”来使用。坚果云的完整版下载链接为 https://pkg-cdn.jianguoyun.com/static/exe/installer/NutstoreWindowsWPF_Full.exe 手动IL处理 一般手动处理坚果云的个人用户资料目录。需要使用dnspyEx,然后修改NutstoreLib.dll中的Utils.DirectoryUtils下的APPDATA_NUTSTORE_DIR,下面是我的一个手动IL修改列表: 0 0000 call string NutstoreLib.Utils.DirectoryUtils::get_NUTSTORE_INSTALL_DIR() 1 0005 newobj instance void [mscorlib]System.IO.DirectoryInfo::.ctor(string) 2 000A call instance class [mscorlib]System.IO.DirectoryInfo [mscorlib]System.IO.DirectoryInfo::get_Parent() 3 000F callvirt instance string [mscorlib]System.IO.FileSystemInfo::get_FullName() 4 0014 ldstr "UserData" 5 0019 call string [Pri.LongPath]Pri.LongPath.Path::Combine(string, string) 6 001E ret 自动IL处理 借助Mono.Cecil我们可以实现上面的功能,自动进行dll的patch修改。 注:因为我不喜欢调用太多的库,所以Pri.LongPath.Path::Combine(string, string)我改为了系统的库 完整代码如下: using System.Linq; using Mono.Cecil; using Mono.Cecil.Cil; namespace NutstoreAutoPatch { internal class Program { public static void Main(string[] args) { const string nutstoreLib = "NutstoreLib.dll"; const string directoryutils = "NutstoreLib....

April 4, 2024 · 1 min · czyt

让你的ssh连接更安全

缘起 最近服务器日志有一些ssh的暴力破解登录记录。所以尝试使用下面几个方案来保证ssh的安全。 修改ssh配置 对 SSH 进行安全加固可以通过多种不同的策略和手段来实行,以下是一些有效的措施: 禁用 Root 登录: 修改 SSH 配置文件 /etc/ssh/sshd_config 中的 PermitRootLogin 选项,将其设置为 no,以防止通过 SSH 使用 root 用户直接登录服务器。 使用公钥加密: 如前所述,通过使用基于密钥的认证来替代密码认证可以极大地提高安全性。 限制用户 SSH 访问: 在 /etc/ssh/sshd_config 中使用 AllowUsers 或 AllowGroups 指令来限制那些用户或者组可以通过 SSH 登录。同样,可以使用 DenyUsers 或 DenyGroups 以禁止特定用户或用户组的访问。 SSH 协议版本: 确保使用的是 SSH-2,因为 SSH-1 已知存在安全漏洞。 更改默认 SSH 端口: 修改配置文件中的 Port 选项,将 SSH 服务的监听端口从默认的 22 更改到其他值。 使用 TCPWrappers 限制访问: 通过 /etc/hosts.allow 和 /etc/hosts.deny 控制哪些 IP 地址允许或拒绝访问。 设置连接超时: 设置自动注销用户的超时时间,避免定期保持未使用的 SSH 会话。使用参数 ClientAliveInterval 和 ClientAliveCountMax 控制这些设置。 使用 Two-Factor Authentication(两因素认证): 安装并配置像 Google Authenticator 这样的两因素认证系统,要求用户在登录时提供密码以及来自手机或其他设备的一次性密码(OTP)。 使用 iptables 或 ufw 防火墙: 配置 Linux 防火墙以只允许特定的 IP 地址或 IP 范围来进行 SSH 连接。 限制最大登录尝试次数: 在 /etc/ssh/sshd_config 文件中设置 MaxAuthTries 限制登录尝试的次数。 使用复杂且定期更新的密码: 再次强调即使在启用密钥登录的情况下,也应该使用强密码并定期更新。 监控 SSH 访问日志: 定期查看 /var/log/auth....

April 2, 2024 · 3 min · czyt

一个RustFace demo程序

下面是一个基于RustFace这个库的demo程序。基于原项目 整理。image随便下载一张,model.bin从原项目进行下载即可。 Cargo.toml配置 [package] name = "faceDemo" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] rustface = "0" image= "0.23.14" src/main.rs use rustface::{Detector, FaceInfo, ImageData}; fn main() { let imageFile = "1.png"; let modelFile = "model.bin"; let mut detector = rustface::create_detector(modelFile).unwrap(); detector.set_min_face_size(20); detector.set_score_thresh(2.0); detector.set_pyramid_scale_factor(0.8); detector.set_slide_window_step(4, 4); let img = image::open(imageFile).unwrap(); let gray = img.to_luma8(); let (width, height) = gray.dimensions(); let mut image = ImageData::new(&*gray, width, height); for face in detector....

February 27, 2024 · 1 min · czyt