<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[chenxupest的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/chenxupest</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; chenxupest]]></copyright><item><title><![CDATA[MIX & OTP——依赖项和总体项目]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/140130433</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/140130433</guid><author>chenxupest</author><pubDate>Tue, 02 Jul 2024 17:50:54 +0800</pubDate><description><![CDATA[在本章中，我们学习了更多关于 Mix 依赖项和umbrella project的知识。虽然我们可以在没有服务器的情况下运行 kv，但我们的 kv_server 直接依赖于 kv。通过将它们分解为单独的应用程序，我们可以更好地控制它们的开发和测试方式。使用umbrella application时，在它们之间划出明确的界限非常重要。我们即将推出的 kv_server 必须仅访问 kv 中定义的公共 API。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——使用 ETS 加速]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/140128778</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/140128778</guid><author>chenxupest</author><pubDate>Tue, 02 Jul 2024 16:22:42 +0800</pubDate><description><![CDATA[每次我们需要查找存储容器时，我们都需要向注册表发送一条消息。如果我们的注册表被多个进程同时访问，注册表可能会成为瓶颈！在本章中，我们将了解 ETS（Erlang Term Storage）以及如何将其用作缓存机制。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——监督动态子进程]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/140048170</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/140048170</guid><author>chenxupest</author><pubDate>Fri, 28 Jun 2024 17:28:36 +0800</pubDate><description><![CDATA[现在，我们已经成功定义了我们的监督器，它将作为应用程序生命周期的一部分自动启动（和停止）。但请记住，我们的 KV.Registry 在 handle_cast/2 回调中同时链接（通过 start_link）和监控（通过 monitor）存储容器进程：链接是双向的，这意味着存储容器崩溃会导致注册表崩溃。虽然我们现在有了监督进程，可以保证注册表恢复正常运行，但注册表崩溃仍然意味着我们会丢失将存储容器名称与其各自进程相关联的所有数据。换句话说，我们希望即使存储容器崩溃，注册表也能继续运行。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——监督树和应用]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/140041976</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/140041976</guid><author>chenxupest</author><pubDate>Fri, 28 Jun 2024 16:49:46 +0800</pubDate><description><![CDATA[在上一章关于 GenServer 的内容中，我们实现了 KV.Registry 来管理存储容器。在某个时候，我们开始监控存储容器，这样每当 KV.Bucket 崩溃时，我们就能采取行动。虽然变化相对较小，但它提出了一个 Elixir 开发人员经常问的问题：当出现故障时会发生什么？在我们添加监控之前，如果存储容器崩溃，注册表将永远指向不再存在的存储容器。如果用户尝试读取或写入崩溃的存储容器，它将失败。任何尝试创建具有相同名称的新存储容器的操作都只会返回崩溃存储容器的 PID。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——使用 GenServer 进行客户端-服务器通信]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139884112</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139884112</guid><author>chenxupest</author><pubDate>Wed, 26 Jun 2024 17:04:16 +0800</pubDate><description><![CDATA[在上一章中，我们使用代理来表示存储容器。在 mix 的介绍中，我们指定要命名每个存储容器，以便我们可以执行以下操作：在上面的会话中，我们与“购物”存储容器进行了交互。由于代理是进程，因此每个存储容器都有一个进程标识符 (PID)，但存储容器没有名称。在“进程”一章中，我们了解到可以通过为进程赋予原子名称来在 Elixir 中注册进程：但是，用原子命名动态进程是一个糟糕的想法！如果我们使用原子，我们需要将存储容器名称（通常从外部客户端接收）转换为原子，并且我们永远不应该将用户输入转换为原子。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——通过代理进行简单的状态管理]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139879842</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139879842</guid><author>chenxupest</author><pubDate>Sat, 22 Jun 2024 16:08:33 +0800</pubDate><description><![CDATA[在本章中，我们将学习如何在多个实体之间保持和共享状态。如果您以前有过编程经验，您可能会想到全局共享变量，但我们将在这里学习的模型完全不同。下一章将概括这里介绍的概念。如果您跳过了入门指南或很久以前读过它，请务必重新阅读流程章节。我们将使用它作为起点。]]></description><category></category></item><item><title><![CDATA[MIX & OTP——Mix 简介]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139865618</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139865618</guid><author>chenxupest</author><pubDate>Sat, 22 Jun 2024 11:37:07 +0800</pubDate><description><![CDATA[在本指南中，我们将构建一个完整的 Elixir 应用程序，它具有自己的监督树、配置、测试等。本指南的要求如下（请参阅 elixir -v）：Elixir 1.15.0 及以上版本Erlang/OTP 24 及以上版本该应用程序用作分布式键值存储。我们将把键值对组织到存储桶中，并将这些存储桶分布在多个节点上。我们还将构建一个简单的客户端，允许我们连接到任何这些节点并发送请求，例如：为了构建我们的键值应用程序，我们将使用三个主要工具：1.OTP（开放电信平台）是 Erlang 附带的一组库。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——调试]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139750734</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139750734</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 18:04:24 +0800</pubDate><description><![CDATA[在 Elixir 中，有多种调试代码的方法。在本章中，我们将介绍一些较常见的方法。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——Erlang 库]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139750153</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139750153</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 17:51:21 +0800</pubDate><description><![CDATA[Elixir 提供了与 Erlang 库的出色互操作性。事实上，Elixir 不鼓励简单地包装 Erlang 库，而是直接与 Erlang 代码交互。在本节中，我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。Erlang 模块的命名约定与 Elixir 不同，并且以小写字母开头。在这两种情况下，模块名称都是原子，我们通过分派到模块名称来调用函数：随着您对 Elixir 的熟练程度不断提高，您可能希望更详细地探索 Erlang STDLIB 参考手册。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——可选语法表]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139749915</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139749915</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 17:32:56 +0800</pubDate><description><![CDATA[在前面的章节中，我们了解到 Elixir 语法允许开发人员在一些情况下省略分隔符，以使代码更具可读性。例如，我们了解到括号是可选的：并且 do-end 块相当于关键字列表：关键字列表使用 Elixir 的常规符号来分隔参数，其中我们用逗号分隔每个键值对，每个键后面跟着 :。在 do 块中，我们去掉了冒号和逗号，并用换行符分隔每个关键字。它们非常有用，因为它们在编写代码块时消除了冗长。大多数时候，我们使用块语法，但知道它们是等效的会很好。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——编写文档]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139749229</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139749229</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 17:23:43 +0800</pubDate><description><![CDATA[Elixir 将文档视为一等级别类。文档必须易于编写且易于阅读。在本指南中，您将学习如何在 Elixir 中编写文档，涵盖模块属性、样式实践和文档测试等结构。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——try, catch, and rescue]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139748247</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139748247</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 17:00:34 +0800</pubDate><description><![CDATA[Elixir 有三种错误机制：errors, throws, and exits。在本章中，我们将探索每种机制，并说明何时应使用它们。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——自定义符号]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139747053</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139747053</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 16:37:38 +0800</pubDate><description><![CDATA[正如本章开头所暗示的，Elixir 中的符号是可扩展的。事实上，使用符号 ~r/foo/i 相当于使用二进制和字符列表作为参数调用 sigil_r：我们可以通过 sigil_r 访问 ~r 符号的文档：我们还可以通过实现遵循 sigil_{character} 模式的函数来提供我们自己的符号。例如，让我们实现返回整数的 ~i 符号（使用可选的 n 修饰符使其为负数）：自定义符号可以是单个小写字符，也可以是大写字符后跟更多大写字符和数字。符号还可以在宏的帮助下用于执行编译时工作。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——速构(函数式编程基础)]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139745268</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139745268</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 16:07:36 +0800</pubDate><description><![CDATA[在 Elixir 中，循环遍历 Enumerable 是很常见的，通常会过滤掉一些结果并将值映射到另一个列表中。速构是此类构造的语法糖：它们将这些常见任务分组为 for 特殊形式。例如，我们可以将一串整数映射到它们的平方值：速构由三部分组成：生成器、过滤器和可收集物。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——协议]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139742881</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139742881</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 15:17:41 +0800</pubDate><description><![CDATA[协议是一种在 Elixir 中实现多态性的机制，您希望行为根据数据类型而变化。我们已经熟悉解决此类问题的一种方法：通过模式匹配和保护子句。考虑一个简单的实用程序模块，它会告诉我们输入变量的类型：如果此模块的使用仅限于您自己的项目，您将能够继续为每种新数据类型定义新的 type/1 函数。但是，如果此代码作为依赖项由多个应用程序共享，则可能会出现问题，因为没有简单的方法来扩展其功能。这就是协议可以帮助我们的地方：协议允许我们根据需要扩展尽可能多的数据类型的原始行为。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——结构]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139742124</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139742124</guid><author>chenxupest</author><pubDate>Mon, 17 Jun 2024 14:09:21 +0800</pubDate><description><![CDATA[要定义结构，请使用 defstruct/1 构造：defstruct 使用的关键字列表定义了结构将具有哪些字段及其默认值。结构采用其定义模块的名称。在上面的示例中，我们定义了一个名为 User 的结构。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——模块属性]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139705573</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139705573</guid><author>chenxupest</author><pubDate>Sat, 15 Jun 2024 17:46:39 +0800</pubDate><description><![CDATA[Elixir 中的模块属性有三个用途：1.作为模块和函数注释2.作为编译期间使用的临时模块存储3.作为编译时常量让我们检查一下这些示例。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——别名、需要、导入和使用]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139704922</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139704922</guid><author>chenxupest</author><pubDate>Sat, 15 Jun 2024 17:27:35 +0800</pubDate><description><![CDATA[为了便于软件重用，Elixir 提供了三个指令（alias、require 和 import）以及一个名为 use 的宏，总结如下：# 为模块添加别名，以便可以将其称为 Bar 而不是 Foo.Bar# 需要模块才能使用其宏# 从 Foo 导入函数，以便可以在不带 `Foo.` 前缀的情况下调用它们import Foo# 调用 Foo 中定义的自定义代码作为扩展点use Foo我们现在将详细探讨它们。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——输入输出和文件系统]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139703814</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139703814</guid><author>chenxupest</author><pubDate>Sat, 15 Jun 2024 16:50:49 +0800</pubDate><description><![CDATA[本章介绍输入/输出机制、文件系统相关任务以及相关模块（如 IO、File 和 Path）。IO 系统提供了一个很好的机会来阐明 Elixir 和 Erlang VM 的一些思维模式和新奇思想。]]></description><category></category></item><item><title><![CDATA[Elixir学习笔记——进程(Processes)]]></title><link>https://blog.youkuaiyun.com/chenxupest/article/details/139686118</link><guid>https://blog.youkuaiyun.com/chenxupest/article/details/139686118</guid><author>chenxupest</author><pubDate>Fri, 14 Jun 2024 18:22:52 +0800</pubDate><description><![CDATA[在 Elixir 中，所有代码都在进程内运行。进程彼此隔离，彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础，而且还提供了构建分布式和容错程序的方法。Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU 方面非常轻量级（甚至与许多其他编程语言中使用的线程相比也是如此）。因此，同时运行数万甚至数十万个进程并不罕见。在本章中，我们将学习生成新进程的基本构造，以及在进程之间发送和接收消息。]]></description><category></category></item></channel></rss>