使用melody来创建正则表达式

melody 是一款rust编写的编译输出为正则表达式的语言。Arch用户可以使用 paru -Syu melody 来安装,vscode和jetbrains系的IDE也有插件。 语法 下面是基于官方book的机翻语法。 量词 ... of - 用于表达特定数量的模式。相当于正则表达式 {5} (假设 5 of ... ) ... to ... of - 用于表示模式范围内的数量。相当于正则表达式 {5,9} (假设 5 to 9 of ... ) over ... of - 用于表达多个模式。相当于正则表达式 {6,} (假设 over 5 of ... ) some of - 用于表达 1 个或多个模式。相当于正则表达式 + any of - 用于表达 0 个或多个模式。相当于正则表达式 * option of - 用于表示模式的 0 或 1。相当于正则表达式 ? 所有量词前面都可以添加 lazy 以匹配最少数量的字符而不是最多的字符(贪婪)。相当于正则表达式 +? 、 *? 等。 ...

2023-12-15 · 2 分钟 · czyt

使用uber cff进行并发编程

第一个项目 配置相关工具 先决条件 Go 1.18 或更新版本 带有 go.mod 文件的项目 大多数go项目应采取以下步骤建立 cff。 如果项目目录中还没有 “tools.go”,请在其中创建一个。您将在此指定开发时的依赖关系。 cat > tools.go <<EOF //go:build tools package tools // use your project's package name here EOF 确保使用与项目目录相同的软件包名称。 将 import _ "go.uber.org/cff/cmd/cff" 添加到 tools.go 中。 echo 'import _ "go.uber.org/cff/cmd/cff"' >> tools.go 运行 go mod tidy 获取最新版本的 cff,或运行 go get go.uber.org/cff@main 获取当前未发布的分支。 go mod tidy 将 cff CLI 安装到项目的 bin/ 子目录下。 GOBIN=$(pwd)/bin go install go.uber.org/cff/cmd/cff 请随意 gitignore 此目录。 ...

2023-12-14 · 8 分钟 · czyt

使用uber-go的fx进行依赖注入

入门 下面是一个官方的例子: package main import ( "context" "fmt" "go.uber.org/fx" "io" "net" "net/http" "os" ) func main() { fx.New( fx.Provide( NewHTTPServer, NewEchoHandler, NewServeMux, ), fx.Invoke(func(srv *http.Server) {}), ).Run() } func NewHTTPServer(lc fx.Lifecycle, mux *http.ServeMux) *http.Server { srv := &http.Server{ Addr: ":8080", Handler: mux, } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { ln, err := net.Listen("tcp", srv.Addr) if err != nil { return err } fmt.Println("Starting HTTP server at", srv.Addr) go srv.Serve(ln) return nil }, OnStop: func(ctx context.Context) error { return srv.Shutdown(ctx) }, }) return srv } // EchoHandler is an http.Handler that copies its request body // back to the response. type EchoHandler struct{} // NewEchoHandler builds a new EchoHandler. func NewEchoHandler() *EchoHandler { return &EchoHandler{} } // ServeHTTP handles an HTTP request to the /echo endpoint. func (*EchoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if _, err := io.Copy(w, r.Body); err != nil { fmt.Fprintln(os.Stderr, "Failed to handle request:", err) } } // NewServeMux builds a ServeMux that will route requests // to the given EchoHandler. func NewServeMux(echo *EchoHandler) *http.ServeMux { mux := http.NewServeMux() mux.Handle("/echo", echo) return mux } 详解 fx.Lifecycle 使用 fx.Lifecycle 对象向应用程序添加生命周期挂钩。这告诉 Fx 如何启动和停止 HTTP 服务器。 ...

2023-12-13 · 7 分钟 · czyt

Golang测试参考

常规测试 性能测试 单元测试 模糊测试 原生测试包 httptest iotest 故障测试 failpoints Failpoints 是一种在代码中注入错误或其他行为的工具,主要用于测试。当Failpoints被配置为激活状态时,对应的代码片段才会被执行。它可以模拟各种复杂系统中的错误处理,以提高它们的容错性和稳定性。 例如,你可以在开发和调试应用程序时使用 Failpoints 使程序在特定时刻进行错误处理或表现出异常行为。最常见的使用场景是模拟网络延迟、磁盘损坏等异常情况,以测试应用程序对这些异常的处理能力。 Failpoints 也可以用于优化代码。在一些情况下,当有多个 guard 语句时,Failpoints 可以将这些不必要的代码提供给全部内联,使代码更符合 DRY(Don’t Repeat Yourself) 原则。 相关链接: Pingcap/failpoint etcd-io/gofail Mock测试 GoMock gomock是官方的mock生成工具,能够很好地和go test 框架集成。mock代码的生成基于mockgen。 安装mockgen Go 版本< 1.16 GO111MODULE=on go get github.com/golang/mock/mockgen@v1.6.0 Go版本 1.16+ go install github.com/golang/mock/mockgen@latest 使用 GoMock支持两种Mock模式:源码模式和反射模式。完整的参数列表说明如下: 若给定一个 Go 源文件,其中包含要被模拟的接口,则使用 modgen 命令为模拟类生成源代码。它支持以下参数: source: 包含要模拟的接口的文件。 destination: 一个文件,用于编写源代码。如果不设置此选项,代码将打印到标准输出。 package: 用于生成模拟类源代码的包。如果您没有设置它,那么包的名称就是 mock _ concatedwith 输入文件的包。 import: 应该在生成的源代码中使用的显式导入列表,指定为以逗号分隔的 foo = bar/baz 格式的元素列表,其中 bar/baz 是被导入的包,foo 是生成的源代码中用于包的标识符。 ...

2023-11-25 · 1 分钟 · czyt

为Mongodb安装Percona Monitoring and Management

Percona Monitoring and Management (PMM) 是一种开源数据库可观察性、监控和管理工具,可与 MySQL、PostgreSQL、MongoDB 及其运行的服务器一起使用。它使您能够在一个位置查看所有数据库的节点到单个查询的性能指标。通过查询分析,您可以快速找到成本高昂且运行缓慢的查询以解决瓶颈。此外,Percona Advisors 为您提供性能、安全性和配置建议,帮助您保持数据库保持最佳性能。备份、恢复和内置开源私有 DBaaS 等警报和管理功能旨在提高 IT 团队的工作速度。 软件安装 安装环境为Ubuntu 22.04,下面的步骤参考了Percona官网的安装文档 安装服务端 本安装需要Docker环境,如果当前机器没有安装Docker,脚本会自动进行安装 使用下面命令安装 curl -fsSL https://www.percona.com/get/pmm | /bin/bash 或者 curl -fsSL https://www.percona.com/get/pmm | /bin/bash 安装完毕以后,请稍等片刻会显示server的访问信息 Gathering/downloading required components, this may take a moment Checking docker installation - installed. Starting PMM server... Created PMM Data Volume: pmm-data Created PMM Server: pmm-server Use the following command if you ever need to update your container by hand: docker run -d -p 443:443 --volumes-from pmm-data --name pmm-server --restart always percona/pmm-server:2 PMM Server has been successfully setup on this system! You can access your new server using one of the following web addresses: https://172.17.0.1:443/ https://127.0.0.1:443/ https://10.10.31.19:443/ The default username is 'admin' and the password is 'admin' :) Note: Some browsers may not trust the default SSL certificate when you first open one of the urls above. If this is the case, Chrome users may want to type 'thisisunsafe' to bypass the warning. Enjoy Percona Monitoring and Management! 这时就可以通过web登录了,第一次登录会要求修改密码。 ...

2023-11-18 · 2 分钟 · czyt

系统设计101

本文使用AI自动翻译,原文仓库地址 用直观和简单的术语解释复杂的系统。 无论您是在准备系统设计面试,还是只是想了解系统在表面之下是如何工作的,我们都希望本资料库能帮助您实现这一目标。 通信协议 架构风格定义了应用程序编程接口(API)不同组件之间的交互方式。因此,它们通过提供设计和构建 API 的标准方法,确保了效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式: SOAP: 成熟、全面、基于 XML 最适合企业应用 RESTful: 流行、易于实施的 HTTP 方法 网络服务的理想选择 GraphQL: 查询语言,请求特定数据 减少网络开销,加快响应速度 gRPC: 现代化、高性能的协议缓冲器 适合微服务架构 WebSocket: 实时、双向、持久连接 非常适合低延迟数据交换 Webhook 事件驱动、HTTP 回调、异步 事件发生时通知系统 REST API 与 GraphQL 在应用程序接口设计方面,REST 和 GraphQL 各有优缺点。 下图显示了 REST 和 GraphQL 的快速比较。 REST 使用 GET、POST、PUT、DELETE 等标准 HTTP 方法进行 CRUD 操作。 当你需要在不同的服务/应用程序之间建立简单、统一的接口时,它就能很好地发挥作用。 缓存策略可以直接实施。 缺点是可能需要多次往返,从不同的端点收集相关数据。 GraphQL 为客户提供单个端点,以便准确查询所需数据。 客户端在嵌套查询中指定所需的确切字段,服务器只返回包含这些字段的优化有效载荷。 支持用于修改数据的突变和用于实时通知的订阅。 非常适合聚合多个来源的数据,并能很好地满足快速发展的前端需求。 不过,它将复杂性转移到了客户端,如果没有适当的保护措施,可能会允许滥用查询 缓存策略可能比 REST 更加复杂。 REST 和 GraphQL 之间的最佳选择取决于应用程序和开发团队的具体要求。GraphQL 非常适合复杂或频繁变化的前端需求,而 REST 则适合需要简单一致的合同的应用。 ...

2023-10-24 · 11 分钟 · czyt

Golang命令行库bubbletea使用备忘

核心概念 Model model是bubbletea的核心接口,定义如下: type Model interface { Init() Cmd Update(msg Msg) (Model, Cmd) View() string } Command 参考资料 Rapidly building interactive CLIs in Go with Bubbletea Intro to Bubble Tea in Go Processing user input in Bubble Tea with a menu component

2023-10-11 · 1 分钟 · czyt

12 个改变我生产力的个人go技巧【译】

原文链接https://dev.to/func25/12-personal-go-tricks-that-transformed-my-productivity-mne 作者 我通常在 Devtrovert 分享有关系统设计和 Go 的见解。请随时查看我的 LinkedIn Phuong Le 以获取最新帖子。 在从事生产项目时,我注意到我经常重复代码并利用某些技术,直到后来回顾我的工作时才意识到这一点。 为了解决这个问题,我开发了一个解决方案,事实证明它对我很有帮助,而且我认为它对其他人也可能有用。 下面是从我的实用程序库中随机挑选的一些有用且通用的代码片段,没有任何特定的分类或特定于系统的技巧。 1.跟踪使用时间的技巧 如果您有兴趣跟踪 Go 中函数的执行时间,您可以使用一个简单而有效的技巧,只需使用“defer”关键字的一行代码即可。您所需要的只是一个 TrackTime 函数: // Utility func TrackTime(pre time.Time) time.Duration { elapsed := time.Since(pre) fmt.Println("elapsed:", elapsed) return elapsed } func TestTrackTime(t *testing.T) { defer TrackTime(time.Now()) // <--- THIS time.Sleep(500 * time.Millisecond) } // elapsed: 501.11125ms 1.5.两阶段延迟 Go 延迟的强大之处不仅在于任务完成后的清理工作,还在于任务完成后的清理工作。这也是为了做好准备,请考虑以下事项: func setupTeardown() func() { fmt.Println("Run initialization") return func() { fmt.Println("Run cleanup") } } func main() { defer setupTeardown()() // <-------- fmt.Println("Main function called") } // Output: // Run initialization // Main function called // Run cleanup 感谢 Teiva Harsanyi 介绍了这种优雅的方法。 ...

2023-10-05 · 4 分钟 · czyt

go泛型备忘录【译】

原文 https://gosamples.dev/generics-cheatsheet/ 入门 泛型发布 Go 中的泛型自 2022 年 3 月 15 日发布的 1.18 版本起可用。 泛型函数 使用泛型,您可以创建以类型作为参数的函数。而不是为每种类型编写单独的函数,例如: func LastInt(s []int) int { return s[len(s)-1] } func LastString(s []string) string { return s[len(s)-1] } // etc. 您可以编写带有类型参数的函数: func Last[T any](s []T) T { return s[len(s)-1] } 类型参数在方括号中声明。它们描述了给定函数允许的类型: 泛型函数调用 您可以像调用任何其他函数一样调用通用函数: func main() { data := []int{1, 2, 3} fmt.Println(Last(data)) data2 := []string{"a", "b", "c"} fmt.Println(Last(data2)) } 您不必像下面的示例那样显式声明类型参数,因为它是根据传递的参数推断的。此功能称为类型推断,仅适用于函数。 ...

2023-09-25 · 3 分钟 · czyt

学习zig【译】

原文链接 https://www.openmymind.net/learning_zig/ 采用Google翻译机翻整理 安装 Zig Zig 的下载页面包括适用于常见平台的预编译二进制文件。在此页面上,您将找到最新开发版本以及主要版本的二进制文件。本指南跟踪的最新版本可以在页面顶部找到。 对于我的计算机,我将下载 zig-macos-aarch64-0.12.0-dev.161+6a5463951.tar.xz。您可能使用的是不同的平台或更新的版本。展开存档后,您应该有一个 zig 二进制文件(除了其他内容之外),您需要为其添加别名或添加到您的路径中;无论你习惯什么流程。 您现在应该能够运行 zig zen 和 zig version 来测试您的设置。 语言概述 - 第 1 部分 Zig 是一种强类型编译语言。它支持泛型,具有强大的编译时元编程功能,并且不包含垃圾收集器。许多人认为 Zig 是 C 的现代替代品。因此,该语言的语法与 C 类似。我们正在讨论以分号结尾的语句和大括号分隔的块。 Zig 代码如下所示: const std = @import("std"); // This code won't compile if `main` isn't `pub` (public) pub fn main() void { const user = User{ .power = 9001, .name = "Goku", }; std.debug.print("{s}'s power is {d}\n", .{user.name, user.power}); } pub const User = struct { power: u64, name: []const u8, }; 如果将上述内容保存为learning.zig并运行 zig run learning.zig ,您应该看到: Goku's power is 9001 。 ...

2023-09-23 · 39 分钟 · czyt