分布式一致性算法Raft详解:从入门到实现

2024-12-21

本文是关于Raft分布式一致性算法的系列文章的第一篇,介绍了Raft算法的基本概念和架构。Raft算法用于解决在多个服务器上复制确定性状态机的问题,确保即使部分服务器崩溃,服务也能保持可用性。文章解释了Raft的核心组件,包括状态机、日志、一致性模块,以及领导者和跟随者角色,并阐述了客户端与Raft集群的交互方式。此外,文章还讨论了Raft的容错能力和CAP定理,以及选择Go语言作为实现语言的原因。后续文章将深入探讨Raft算法的实现细节。

阅读更多

使用 Python 辅助程序在 Go 中进行机器学习

2024-11-18

本文探讨了如何在 Go 应用程序中利用机器学习模型,特别是大型语言模型(LLM)。文章首先介绍了使用现成的互联网 LLM 服务(如 ChatGPT 和 Gemini)以及本地运行的开源模型(如 Llama 和 Mistral)的简便方法,并推荐使用 Ollama 或 Llamafile 等工具简化本地模型部署和 API 调用。接着,文章深入讲解了如何使用 Python 作为辅助程序,通过自定义模型实现更高级的定制化。文章以 Gemma 和 JAX 为例,演示了如何构建一个 Python 服务器,通过 REST API 为 Go 应用程序提供本地 LLM 推理服务。此外,文章还展示了如何使用 TensorFlow 和 Keras 训练一个简单的图像分类模型,并通过 Unix 域套接字实现 Go 客户端与 Python 服务器之间的低延迟通信。

阅读更多
未分类

计算复数的模

2024-10-24

这篇文章讲解了复数的模的计算方法。很多人误以为复数 z 的模的平方 |z|^2 等于 zz,而实际上 |z|^2=zz^*,其中 z^* 是 z 的共轭复数。文章从模的定义出发,解释了为什么 zz 不能作为模的平方,并通过直角坐标和极坐标两种方式证明了 zz^* 才是正确的计算方法。

阅读更多
未分类

使用 Go 在 Linux 上构建静态二进制文件

2024-07-31

文章介绍了如何在 Linux 系统上使用 Go 语言构建静态链接的二进制文件。作者首先解释了 Go 语言默认情况下并不总是生成静态链接的二进制文件,特别是在使用 cgo 的情况下,需要额外的设置才能实现。文章详细介绍了如何使用 musl libc 和 Zig 工具链来构建静态链接的 Go 二进制文件,并提供了一些示例代码来说明这些方法。

阅读更多
未分类 静态链接

泰勒级数与麦克劳林级数

2024-07-29

本文介绍了泰勒级数和麦克劳林级数,它们是用于逼近函数的多项式。麦克劳林级数是泰勒级数的一种特殊形式,用于在0附近逼近函数。文章首先通过逼近余弦函数的例子直观地解释了麦克劳林级数的工作原理,然后推导了麦克劳林级数的公式。接着,文章介绍了泰勒级数,它可以用于在任意点附近逼近函数。文章以逼近自然对数函数为例说明了泰勒级数的应用。最后,文章讨论了幂级数的收敛性,并使用比值检验来确定麦克劳林级数和泰勒级数的收敛区间。

阅读更多
未分类 泰勒级数

使用 Go 程序读取谷歌表格

2024-06-02

本文介绍了如何使用 Go 程序读取谷歌表格数据。文章提供了两种方法:使用服务账户和 OAuth 2.0。使用服务账户时,需要创建服务账户并下载私钥,然后在程序中使用私钥进行身份验证。使用 OAuth 2.0 时,需要在 GCP 控制台中设置 OAuth 2.0 客户端 ID,并在程序中使用客户端 ID 和密钥进行身份验证。文章还提供了一个完整的示例程序,演示了如何使用这两种方法读取谷歌表格数据。

阅读更多
未分类

递归、延续性和蹦床

2024-05-25

文章探讨了递归,尤其是尾递归在编程中的应用。文章首先解释了尾递归的概念,以及它与普通递归的区别,并以阶乘和斐波那契数列为例进行了说明。然后,文章介绍了尾调用优化(TCO) 的概念,以及为什么某些语言(如Python)不支持TCO。之后,文章深入探讨了延续性和延续性传递风格(CPS)的概念,并展示了如何使用CPS将任意函数转换为尾递归形式。最后,文章介绍了蹦床的概念,以及如何使用蹦床来避免尾递归调用中的堆栈溢出问题。

阅读更多