<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Tink&#39;s Blog</title><description>一只船孤独地航行在海上，它既不寻求幸福，也不逃避幸福。它只是向前航行，底下是沉静碧蓝的大海，而头顶是金色的太阳。</description><link>https://cyub.cyub.vip/</link><atom:link href="https://cyub.cyub.vip/feed.xml" rel="self" type="application/rss+xml" /><managingEditor>Tink</managingEditor><language>zh</language> <pubDate>Sun, 08 Mar 2026 15:36:57 -0000</pubDate> <lastBuildDate>Sun, 08 Mar 2026 15:36:57 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.15.0</generator> <item> <title>Kimi官方 Prompt 最佳实践指南</title> <author>Tinker</author> <description>&lt;blockquote&gt;&lt;p&gt;本文转载自 Kimi 官方文档&lt;a href=&#34;https://platform.moonshot.cn/docs/guide/prompt-best-practice&#34;&gt;入门指南：Prompt 最佳实践&lt;/a&gt;一文。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;System Prompt最佳实践：system prompt（系统提示）指的是模型在生成文本或响应之前所接收的初始输入或指令，这个提示对于模型的运作至关&lt;a href=&#34;https://kimi.moonshot.cn/share/col3fn2lnl95v16j0g2g&#34;&gt;重要&lt;/a&gt;&lt;/p&gt;&lt;p&gt;??? note &#34;大模型中 system prompt指的是什么，为什么它很重要？&#34;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;在大型机器学习模型，尤其是自然语言处理（NLP）模型中，&#34;system prompt&#34;（系统提示）指的是模型在生成文本或响应之前所接收的初始输入或指令。这个提示对于模型的运作至关重要，原因如下： 1. **指导生成内容：**系统提示为模型提供了生成文本的起点，帮助模型理解用户的需求和上下文。 2. **确定响应类型：**提示可以明确告诉模型需要生成哪种类型的响应，比如回答问题、撰写文章、进行翻译等。 3. **设定上下文：**通过包含必要的上下文信息，系统提示可以帮助模型更好地理解问题，并生成更准确的回答。 4. **影响生成文本的风格和语气：**系统提示还可以设定文本的风格和语气，比如正式、非正式、幽默、严肃等。 5. **控制生成文本的长度：**在某些情况下，系统提示可以包含对生成文本长度的要求。 6. **避免不当内容：**通过精心设计系统提示，可以减少模型生成不当或不安全内容的风险。 7. **提高效率：**一个好的系统提示可以提高模型的效率，因为它减少了模型需要猜测的内容，从而加快了生成过程。 8. **用户交互：**在交互式应用中，系统提示是用户与模型之间沟通的桥梁，确保了用户意图的准确传达。在设计系统提示时，需要考虑到这些因素，以确保模型能够生成高质量、相关且符合预期的输出。&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;编写清晰的说明&lt;/h2&gt;&lt;p&gt;为什么需要向模型输出清晰的说明？&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;模型无法读懂你的想法，如果输出内容太长，可要求模型简短回复。如果输出内容太简单，可要求模型进行专家级写作。如果你不喜欢输出的格式，请向模型展示你希望看到的格式。模型越少猜测你的需求，你越有可能得到满意的结果。&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://cyub.cyub.vip/blog/2026/03/08/kimi%E5%AE%98%E6%96%B9-prompt-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/</link> <pubDate>Sun, 08 Mar 2026 23:26:27 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/03/08/kimi%E5%AE%98%E6%96%B9-prompt-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>马修·伯恩斯坦讲线性代数系列：矩阵作为函数</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://mbernste.github.io/posts/matrices_as_functions/&#34;&gt;Matrices as functions&lt;/a&gt;&lt;/p&gt;&lt;p&gt;线性代数的核心思想是将矩阵表示函数。在本文中，我们将考察几个常见的初等函数，并讨论它们对应的矩阵。&lt;/p&gt;&lt;h2&gt;引言&lt;/h2&gt;&lt;p&gt;回想一下，&lt;a href=&#34;马修·伯恩斯坦讲线性代数系列：矩阵-向量乘法.md&#34;&gt;矩阵-向量乘法&lt;/a&gt;{.internal-link target=_blank} 的定义使我们能够从以下意义上将矩阵视为函数：如果我们固定一个矩阵 $\boldsymbol{A} \in \mathbb{R}^{m \times n}$，该矩阵将 $\mathbb{R}^n$ 中的向量映射到 $\mathbb{R}^m$ 中的向量。也就是说，我们可以定义一个函数 $T : \mathbb{R}^n \rightarrow \mathbb{R}^m$：&lt;/p&gt;&lt;p&gt;$$T(\boldsymbol{x}) := \boldsymbol{A}\boldsymbol{x}$$&lt;/p&gt;&lt;p&gt;在本文中，我们将考察几个常见的初等函数，并讨论它们对应的矩阵。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/03/07/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5%E4%BD%9C%E4%B8%BA%E5%87%BD%E6%95%B0/</link> <pubDate>Sun, 08 Mar 2026 15:37:36 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/03/07/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5%E4%BD%9C%E4%B8%BA%E5%87%BD%E6%95%B0/</guid> </item> <item> <title>软件架构与设计</title> <description>&lt;h1&gt;软件架构与设计&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1/page/2/</guid> </item> <item> <title>翻译</title> <description>&lt;h1&gt;翻译&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/page/3/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/page/3/</guid> </item> <item> <title>翻译</title> <description>&lt;h1&gt;翻译&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/page/2/</guid> </item> <item> <title>编程语言</title> <description>&lt;h1&gt;编程语言&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/page/3/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/page/3/</guid> </item> <item> <title>编程语言</title> <description>&lt;h1&gt;编程语言&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/page/2/</guid> </item> <item> <title>数据存储与中间件</title> <description>&lt;h1&gt;数据存储与中间件&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E4%B8%8E%E4%B8%AD%E9%97%B4%E4%BB%B6/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E4%B8%8E%E4%B8%AD%E9%97%B4%E4%BB%B6/page/2/</guid> </item> <item> <title>工程实践与运维</title> <description>&lt;h1&gt;工程实践与运维&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/4/</link> <pubDate>Sun, 08 Mar 2026 15:37:10 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/4/</guid> </item> <item> <title>工程实践与运维</title> <description>&lt;h1&gt;工程实践与运维&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/3/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/3/</guid> </item> <item> <title>工程实践与运维</title> <description>&lt;h1&gt;工程实践与运维&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/page/2/</guid> </item> <item> <title>2017 年</title> <description>&lt;h1&gt;2017 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2017/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2017/page/2/</guid> </item> <item> <title>2018 年</title> <description>&lt;h1&gt;2018 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2018/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2018/page/2/</guid> </item> <item> <title>2019 年</title> <description>&lt;h1&gt;2019 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2019/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2019/page/2/</guid> </item> <item> <title>2020 年</title> <description>&lt;h1&gt;2020 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2020/page/3/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2020/page/3/</guid> </item> <item> <title>2020 年</title> <description>&lt;h1&gt;2020 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2020/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2020/page/2/</guid> </item> <item> <title>2026 年</title> <description>&lt;h1&gt;2026 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2026/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2026/page/2/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/13/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/13/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/12/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/12/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/11/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/11/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/10/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/10/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/9/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/9/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/8/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/8/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/7/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/7/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/6/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/6/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/5/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/5/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/4/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/4/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/3/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/3/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/page/2/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/page/2/</guid> </item> <item> <title>经济</title> <description>&lt;h1&gt;经济&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BB%8F%E6%B5%8E/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BB%8F%E6%B5%8E/</guid> </item> <item> <title>笔记与随想</title> <description>&lt;h1&gt;笔记与随想&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%AC%94%E8%AE%B0%E4%B8%8E%E9%9A%8F%E6%83%B3/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%AC%94%E8%AE%B0%E4%B8%8E%E9%9A%8F%E6%83%B3/</guid> </item> <item> <title>数据存储与中间件</title> <description>&lt;h1&gt;数据存储与中间件&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E4%B8%8E%E4%B8%AD%E9%97%B4%E4%BB%B6/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E4%B8%8E%E4%B8%AD%E9%97%B4%E4%BB%B6/</guid> </item> <item> <title>并发与系统编程</title> <description>&lt;h1&gt;并发与系统编程&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E5%B9%B6%E5%8F%91%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E5%B9%B6%E5%8F%91%E4%B8%8E%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/</guid> </item> <item> <title>数据结构与算法</title> <description>&lt;h1&gt;数据结构与算法&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/</guid> </item> <item> <title>编码与协议</title> <description>&lt;h1&gt;编码与协议&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A0%81%E4%B8%8E%E5%8D%8F%E8%AE%AE/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A0%81%E4%B8%8E%E5%8D%8F%E8%AE%AE/</guid> </item> <item> <title>源码分析</title> <description>&lt;h1&gt;源码分析&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/</guid> </item> <item> <title>软件架构与设计</title> <description>&lt;h1&gt;软件架构与设计&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E4%B8%8E%E8%AE%BE%E8%AE%A1/</guid> </item> <item> <title>编程语言</title> <description>&lt;h1&gt;编程语言&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/</guid> </item> <item> <title>翻译</title> <description>&lt;h1&gt;翻译&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E7%BF%BB%E8%AF%91/</guid> </item> <item> <title>工程实践与运维</title> <description>&lt;h1&gt;工程实践与运维&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5%E4%B8%8E%E8%BF%90%E7%BB%B4/</guid> </item> <item> <title>人工智能</title> <description>&lt;h1&gt;人工智能&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/category/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/category/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/</guid> </item> <item> <title>2016 年</title> <description>&lt;h1&gt;2016 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2016/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2016/</guid> </item> <item> <title>2017 年</title> <description>&lt;h1&gt;2017 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2017/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2017/</guid> </item> <item> <title>2018 年</title> <description>&lt;h1&gt;2018 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2018/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2018/</guid> </item> <item> <title>2019 年</title> <description>&lt;h1&gt;2019 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2019/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2019/</guid> </item> <item> <title>2020 年</title> <description>&lt;h1&gt;2020 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2020/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2020/</guid> </item> <item> <title>2021 年</title> <description>&lt;h1&gt;2021 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2021/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2021/</guid> </item> <item> <title>2022 年</title> <description>&lt;h1&gt;2022 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2022/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2022/</guid> </item> <item> <title>2023 年</title> <description>&lt;h1&gt;2023 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2023/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2023/</guid> </item> <item> <title>2024 年</title> <description>&lt;h1&gt;2024 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2024/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2024/</guid> </item> <item> <title>2025 年</title> <description>&lt;h1&gt;2025 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2025/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2025/</guid> </item> <item> <title>2026 年</title> <description>&lt;h1&gt;2026 年&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/archive/2026/</link> <pubDate>Sun, 08 Mar 2026 15:37:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/archive/2026/</guid> </item> <item> <title>ConnectRPC：下一代 Protobuf RPC 框架——当 gRPC 遇见现代 Web 开发</title> <author>Tinker</author> <description>&lt;h2&gt;为什么我们需要&#34;更好的 gRPC&#34;？&lt;/h2&gt;&lt;p&gt;自 2016 年 Google 开源 gRPC 以来，它凭借 Protocol Buffers 的高效序列化和 HTTP/2 的多路复用，迅速成为微服务间通信的事实标准。然而，随着云原生架构的演进和前后端分离开发的普及，gRPC 的一些设计局限日益凸显：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;浏览器兼容性&lt;/strong&gt;：gRPC 依赖 HTTP/2 的底层特性，浏览器无法直接调用，必须借助 grpc-web + Envoy 代理&lt;/li&gt;&lt;li&gt;&lt;strong&gt;调试困难&lt;/strong&gt;：二进制协议让 &lt;code&gt;curl&lt;/code&gt; 和浏览器开发者工具束手无策&lt;/li&gt;&lt;li&gt;&lt;strong&gt;部署复杂&lt;/strong&gt;：需要特殊的负载均衡器支持 HTTP/2 trailers&lt;/li&gt;&lt;li&gt;&lt;strong&gt;代码冗长&lt;/strong&gt;：生成的客户端代码模板化严重，与现代开发体验脱节&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;ConnectRPC&lt;/strong&gt;（简称 Connect）正是 Buf 团队为解决这些痛点而打造的现代化 RPC 框架。它不仅完全兼容 gRPC 生态，更带来了浏览器原生支持、HTTP/1.1 回退、以及 REST 般的调试体验。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/03/05/connectrpc%E4%B8%8B%E4%B8%80%E4%BB%A3-protobuf-rpc-%E6%A1%86%E6%9E%B6%E5%BD%93-grpc-%E9%81%87%E8%A7%81%E7%8E%B0%E4%BB%A3-web-%E5%BC%80%E5%8F%91/</link> <pubDate>Thu, 05 Mar 2026 23:40:39 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/03/05/connectrpc%E4%B8%8B%E4%B8%80%E4%BB%A3-protobuf-rpc-%E6%A1%86%E6%9E%B6%E5%BD%93-grpc-%E9%81%87%E8%A7%81%E7%8E%B0%E4%BB%A3-web-%E5%BC%80%E5%8F%91/</guid> </item> <item> <title>Python 类型注解完全指南</title> <author>Tinker</author> <description>&lt;h2&gt;为什么要用类型注解？&lt;/h2&gt;&lt;p&gt;Python 是一门&lt;strong&gt;动态类型语言&lt;/strong&gt;，变量类型在运行时才确定。这种灵活性带来了快速开发的优势，但也埋下了隐患：&lt;/p&gt;&lt;p&gt;```python&lt;/p&gt;&lt;h1&gt;没有类型注解时，这个 bug 可能在生产环境才暴露&lt;/h1&gt;&lt;p&gt;def calculate_total(price, quantity): return price * quantity&lt;/p&gt;&lt;h1&gt;调用者可能传入错误类型，而 Python 不会提前报错&lt;/h1&gt;&lt;p&gt;result = calculate_total(&#34;100&#34;, &#34;5&#34;) # 结果是 &#34;100100100100100&#34;，而非 500```&lt;/p&gt;&lt;p&gt;&lt;strong&gt;类型注解（Type Hints）&lt;/strong&gt; 在 &lt;strong&gt;PEP 484&lt;/strong&gt;（Python 3.5）中引入，它解决了以下核心痛点：&lt;/p&gt;&lt;p&gt;| 痛点 | 解决方案 ||------|---------|| &lt;strong&gt;IDE 智能提示弱&lt;/strong&gt; | PyCharm/VSCode 能基于类型提供精准的自动补全和跳转 || &lt;strong&gt;代码可读性差&lt;/strong&gt; | 函数签名即文档，无需阅读实现即可了解接口 || &lt;strong&gt;重构风险高&lt;/strong&gt; | 修改函数参数时，类型检查器能发现所有调用点 || &lt;strong&gt;团队协作难&lt;/strong&gt; | 接口契约显性化，减少沟通成本 || &lt;strong&gt;文档不同步&lt;/strong&gt; | 类型注解即实时文档，不会过时 |&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/03/04/python-%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Thu, 05 Mar 2026 01:13:53 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/03/04/python-%E7%B1%BB%E5%9E%8B%E6%B3%A8%E8%A7%A3%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>🦞 OpenClaw：给 AI 装上“爪子”的开源革命 —— 数字贾维斯已到来</title> <author>Tinker</author> <description>&lt;h2&gt;OpenClaw 是什么？&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202602/openclaw-logo-text-dark.png&#34;&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/openclaw/openclaw&#34;&gt;OpenClaw&lt;/a&gt;&lt;/strong&gt;（原名 Clawdbot → Moltbot → OpenClaw）是一个&lt;strong&gt;开源 AI 代理框架&lt;/strong&gt;，由奥地利独立开发者 Peter Steinberger 创建。它不是一个大模型，而是一个&lt;strong&gt;&#34;给 AI 装上爪子的执行系统&#34;&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;简单来说：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;GPT/Claude&lt;/strong&gt; 是&#34;大脑&#34;——只能思考和建议&lt;/li&gt;&lt;li&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; 是&#34;手脚&#34;——能真正操作你的电脑执行任务&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;它运行在你的本地设备（Mac/PC）或私有服务器上，通过 WhatsApp、Telegram、Slack、飞书、钉钉等日常聊天软件与你交互，拥有读写文件、执行终端命令、操控浏览器、访问邮件日历等&lt;strong&gt;系统级权限&lt;/strong&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/25/-openclaw%E7%BB%99-ai-%E8%A3%85%E4%B8%8A%E7%88%AA%E5%AD%90%E7%9A%84%E5%BC%80%E6%BA%90%E9%9D%A9%E5%91%BD--%E6%95%B0%E5%AD%97%E8%B4%BE%E7%BB%B4%E6%96%AF%E5%B7%B2%E5%88%B0%E6%9D%A5/</link> <pubDate>Wed, 25 Feb 2026 23:02:08 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/25/-openclaw%E7%BB%99-ai-%E8%A3%85%E4%B8%8A%E7%88%AA%E5%AD%90%E7%9A%84%E5%BC%80%E6%BA%90%E9%9D%A9%E5%91%BD--%E6%95%B0%E5%AD%97%E8%B4%BE%E7%BB%B4%E6%96%AF%E5%B7%B2%E5%88%B0%E6%9D%A5/</guid> </item> <item> <title>一文带你理解Dart空安全</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://github.com/dart-lang/site-www/blob/4e84699a69aafbd3db8b912ad543b8eb0a080957/src/content/null-safety/understanding-null-safety.md&#34;&gt;Understanding null safety&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;作者：&lt;/strong&gt; 鲍勃·尼斯特罗姆，写于 2020年7月&lt;/p&gt;&lt;p&gt;自 Dart 2.0 中用&lt;a href=&#34;https://dart.dev/language/type-system&#34;&gt;可靠的静态类型系统&lt;/a&gt;替换了原有的不完善的可选类型系统以来，空安全是我们对 Dart 做出的最大改动。Dart 最初发布时，编译时空安全还是一项罕见的特性，需要详细讲解。如今，Kotlin、Swift、Rust 和其他语言都针对这个已经&lt;a href=&#34;https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/&#34;&gt;非常普遍的问题&lt;/a&gt;提供了各自的解决方案。以下是一个示例：&lt;/p&gt;&lt;p&gt;```dart// 无空安全：bool isEmpty(String string) =&amp;gt; string.length == 0;&lt;/p&gt;&lt;p&gt;void main() { isEmpty(null);}```&lt;/p&gt;&lt;p&gt;如果运行这段 Dart 程序时没有启用空安全机制，它会在调用 &lt;code&gt;.length&lt;/code&gt; 方法时抛出 &lt;code&gt;NoSuchMethodError&lt;/code&gt; 异常。因为空值是 &lt;code&gt;Null&lt;/code&gt; 类的一个实例，而 &lt;code&gt;Null&lt;/code&gt; 类没有 &lt;code&gt;length&lt;/code&gt; 方法。运行时错误非常糟糕。对于像 Dart 这样旨在运行在终端用户设备上的语言来说，这一点尤为重要。如果服务器应用程序崩溃，通常可以在用户注意到之前重启它。但是，当 Flutter 应用在​​用户的手机上崩溃时，用户会非常不满意。用户不满意，开发者自然也不会满意。&lt;/p&gt;&lt;p&gt;开发者喜欢像 Dart 这样的静态类型语言，因为它们允许类型检查器在编译时（通常直接在 IDE 中）查找代码中的错误。越早发现 bug，就能越早修复它。当语言设计者谈到“修复空引用错误”时，他们指的是增强静态类型检查器的功能，使语言能够检测到类似上述尝试对可能为空的值调用 &lt;code&gt;.length&lt;/code&gt; 的错误。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/20/%E4%B8%80%E6%96%87%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3dart%E7%A9%BA%E5%AE%89%E5%85%A8/</link> <pubDate>Sat, 21 Feb 2026 20:46:04 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/20/%E4%B8%80%E6%96%87%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3dart%E7%A9%BA%E5%AE%89%E5%85%A8/</guid> </item> <item> <title>Material Design 3 (Material You) 完整开发指南</title> <author>Tinker</author> <description>&lt;h2&gt;概述与核心变革&lt;/h2&gt;&lt;p&gt;Material Design 3（代号 &lt;strong&gt;Material You&lt;/strong&gt;）是 Google 于 2021 年 I/O 大会发布的第三代设计系统，随 Android 12 正式推出。它代表了从&#34;统一设计&#34;到&#34;个性化表达&#34;的范式转变。&lt;/p&gt;&lt;h3&gt;与 Material Design 2 的关键差异&lt;/h3&gt;&lt;p&gt;| 特性 | Material 2 | Material 3 ||------|-----------|-----------|| &lt;strong&gt;颜色哲学&lt;/strong&gt; | 固定品牌色（Primary/Secondary） | 动态个性化（从壁纸/种子色生成） || &lt;strong&gt;颜色数量&lt;/strong&gt; | 12个基础色槽 | 26+个语义化颜色角色 || &lt;strong&gt;表面层级&lt;/strong&gt; | 阴影海拔（Elevation） | 色调表面（Tone-based Surfaces） || &lt;strong&gt;排版体系&lt;/strong&gt; | 6种样式（Headline 1-6等） | 15种令牌化样式（Display/Headline/Title/Body/Label） || &lt;strong&gt;形状系统&lt;/strong&gt; | 固定圆角 | 7级可配置圆角体系 || &lt;strong&gt;个性化&lt;/strong&gt; | 无 | 核心特性（壁纸取色、算法生成） |&lt;/p&gt;&lt;h3&gt;核心设计原则&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;个性化优先&lt;/strong&gt;：系统从用户壁纸提取颜色，生成独一无二的主题&lt;/li&gt;&lt;li&gt;&lt;strong&gt;算法驱动美学&lt;/strong&gt;：基于 HCT 颜色空间的科学算法确保配色和谐&lt;/li&gt;&lt;li&gt;&lt;strong&gt;无障碍内置&lt;/strong&gt;：所有颜色组合默认满足 WCAG 2.1 AA 对比度标准&lt;/li&gt;&lt;li&gt;&lt;strong&gt;跨平台一致&lt;/strong&gt;：提供跨平台实现规范，Android（Compose/View）与 Flutter 为官方完整实现，Web 与 iOS 通过 Material Color Utilities 支持配色算法&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/14/material-design-3-material-you-%E5%AE%8C%E6%95%B4%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/</link> <pubDate>Fri, 20 Feb 2026 22:23:38 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/14/material-design-3-material-you-%E5%AE%8C%E6%95%B4%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>掌握Flutter状态管理</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://www.hungrimind.com/articles/flutter-state-management&#34;&gt;Mastering State Management in Flutter&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202602/state-management.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;想象一下一群书呆子为如何操作数据争吵了五年。这基本上就是 Flutter 社区一直在发生的事情。&lt;/p&gt;&lt;p&gt;五年过去了，关于 GetX 的帖子仍然会引发风暴。我就是那些书呆子之一。所以，我想最后一次狂热一下，然后继续我的生活。这是我&lt;strong&gt;关于状态管理的最终结论&lt;/strong&gt;。&lt;/p&gt;&lt;h2&gt;最终结论&lt;/h2&gt;&lt;p&gt;使用任何你想用的状态管理方案。如果你在意别人用什么，那就找点更好的事情去关心。&lt;/p&gt;&lt;p&gt;我不在乎你用什么。然而，我强烈建议你了解你所使用的工具，并理解如何仅使用 Flutter 提供的工具来&lt;strong&gt;管理你的状态&lt;/strong&gt;。&lt;/p&gt;&lt;h2&gt;什么是状态？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;状态管理&lt;/strong&gt;这个短语可以分解为一个用于&lt;strong&gt;管理你的状态&lt;/strong&gt;的系统。什么是状态？&lt;/p&gt;&lt;p&gt;状态是一种数据。应用程序中有两种类型的数据：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;常规数据（硬编码且无法更改）&lt;/li&gt;&lt;li&gt;状态（可以更改的奇特数据）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;一个典型的状态例子是用户信息。例如，你可以在主屏幕上显示 &lt;code&gt;Hello, Tadas&lt;/code&gt;，其中 &lt;code&gt;Tadas&lt;/code&gt; 这部分信息是从用户信息状态中获取的。假设你有一个设置页面，可以在其中将名称更改为 &lt;code&gt;T-Dog&lt;/code&gt;。这将使用新值更新用户信息状态，你的应用将更改为显示 &lt;code&gt;Hello,T-Dog&lt;/code&gt;。状态管理解决方案将促进这一更改数据并在整个应用程序中传播这些更改的过程。&lt;/p&gt;&lt;p&gt;其他一些常见的状态例子包括新闻动态、关注者数量、待办事项、倒计时器等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;状态最简单的定义就是可以更改的数据&lt;/strong&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/17/%E6%8E%8C%E6%8F%A1flutter%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/</link> <pubDate>Tue, 17 Feb 2026 17:09:24 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/17/%E6%8E%8C%E6%8F%A1flutter%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86/</guid> </item> <item> <title>Flutter布局终极指南：轻松布局 Flutter 组件的唯一指南</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://blog.adityasharma.co/the-ultimate-flutter-layout-guide&#34;&gt;The Ultimate Flutter Layout Guide:The only guide you need to layout your Flutter widgets hassle-free&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;引言&lt;/h2&gt;&lt;p&gt;你在构建 Flutter 应用时是否曾被以下错误困扰过？&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;A RenderFlex overflowed…&lt;/code&gt;（RenderFlex 溢出…）&lt;/li&gt;&lt;li&gt;&lt;code&gt;RenderBox was not laid out&lt;/code&gt;（RenderBox 未布局）&lt;/li&gt;&lt;li&gt;&lt;code&gt;Viewport was given unbounded height&lt;/code&gt;（Viewport 被赋予了无限高度）&lt;/li&gt;&lt;li&gt;&lt;code&gt;An InputDecorator …cannot have an unbounded width&lt;/code&gt;（InputDecorator 不能拥有无限宽度）&lt;/li&gt;&lt;li&gt;&lt;code&gt;Incorrect use of ParentData widget&lt;/code&gt;（ParentData 组件使用不正确）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果答案是肯定的，那么这篇博客文章就是为你准备的！&lt;/p&gt;&lt;p&gt;在这篇博客文章中，我将讨论并分享一些常见的 Flutter 布局场景和最佳实践。我会更多地关注代码片段，而不是组件细节。对于组件详情，我会分享相关链接。&lt;/p&gt;&lt;h2&gt;单个子元素布局组件&lt;/h2&gt;&lt;h3&gt;Align（对齐）&lt;/h3&gt;&lt;p&gt;一个将其子组件在其内部对齐的组件，并可选择根据子组件的大小调整自身大小。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202602/Zq9bGq8xA.webp&#34;&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;dartCenter( child: Container( height: 120.0, width: 120.0, color: Colors.blue[50], child: const Align( alignment: Alignment.topRight, child: FlutterLogo( size: 60, ), ), ),)&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/12/flutter%E5%B8%83%E5%B1%80%E7%BB%88%E6%9E%81%E6%8C%87%E5%8D%97%E8%BD%BB%E6%9D%BE%E5%B8%83%E5%B1%80-flutter-%E7%BB%84%E4%BB%B6%E7%9A%84%E5%94%AF%E4%B8%80%E6%8C%87%E5%8D%97/</link> <pubDate>Fri, 13 Feb 2026 11:50:07 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/12/flutter%E5%B8%83%E5%B1%80%E7%BB%88%E6%9E%81%E6%8C%87%E5%8D%97%E8%BD%BB%E6%9D%BE%E5%B8%83%E5%B1%80-flutter-%E7%BB%84%E4%BB%B6%E7%9A%84%E5%94%AF%E4%B8%80%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>马修·伯恩斯坦讲线性代数系列：矩阵-向量乘法</title> <author>Tinker</author> <description>&lt;p&gt;原文: &lt;a href=&#34;https://mbernste.github.io/posts/matrix_vector_mult/&#34;&gt;Matrix-vector multiplication&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;引言&lt;/h2&gt;&lt;p&gt;在&lt;a href=&#34;./马修·伯恩斯坦讲线性代数系列：矩阵的介绍.md&#34;&gt;上一篇博客文章&lt;/a&gt;中，我们讨论了观察矩阵的三种方式：作为值表格、作为向量列表，以及最终作为函数。正是第三种观察矩阵的方式赋予了矩阵真正的力量。在这里，我们将介绍矩阵和向量之间的一种操作，称为&lt;strong&gt;矩阵-向量乘法&lt;/strong&gt;，这将使我们能够将矩阵用作函数。&lt;/p&gt;&lt;p&gt;矩阵-向量乘法是矩阵和向量之间的一种操作，会产生一个新向量。值得注意的是，矩阵-向量乘法仅定义在矩阵和向量之间，其中向量的长度等于矩阵的列数。其定义如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;定义 1 (矩阵-向量乘法)：&lt;/strong&gt; 给定矩阵 $\boldsymbol{A} \in \mathbb{R}^{m \times n}$ 和向量 $\boldsymbol{x} \in \mathbb{R}^n$，$\boldsymbol{A}$ 和 $\boldsymbol{x}$ 的&lt;strong&gt;矩阵-向量乘法&lt;/strong&gt;定义为&lt;/p&gt;&lt;p&gt;$$\boldsymbol{A}\boldsymbol{x} := x_1\boldsymbol{a}&lt;em&gt;{&lt;em&gt;,1} + x_2\boldsymbol{a}_{&lt;/em&gt;,2} + \dots + x_n\boldsymbol{a}&lt;/em&gt;{*,n}$$&lt;/p&gt;&lt;p&gt;其中 $\boldsymbol{a}_{*,i}$ 是 $\boldsymbol{A}$ 的第 $i$ 个列向量。&lt;/p&gt;&lt;p&gt;像大多数数学概念一样，矩阵-向量乘法可以从多个角度审视，具有不同程度的抽象性。这些视角在尝试概念化我们利用矩阵-向量乘法来建模现实世界问题时的各种方式时非常有用。以下是我发现用于概念化矩阵-向量乘法的三种方式，按从最不抽象到最抽象排序：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;作为一种“逐行”的向量生成过程：&lt;/strong&gt; 矩阵-向量乘法定义了一个使用现有向量创建新向量的过程，其中新向量的每个元素是通过使用向量元素作为系数，对矩阵的每一行取加权和而“生成”的。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;作为矩阵列的线性组合：&lt;/strong&gt; 矩阵-向量乘法是使用向量元素作为系数，对矩阵的列空间取线性组合的过程。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;作为向量空间之间函数的求值：&lt;/strong&gt; 矩阵-向量乘法允许矩阵定义两个向量空间之间的映射。&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/08/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5-%E5%90%91%E9%87%8F%E4%B9%98%E6%B3%95/</link> <pubDate>Sun, 08 Feb 2026 22:45:09 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/08/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5-%E5%90%91%E9%87%8F%E4%B9%98%E6%B3%95/</guid> </item> <item> <title>Python 项目结构与打包完全指南：从入门到实践</title> <author>Tinker</author> <description>&lt;p&gt;当你完成一个 Python 项目，想要发布到 PyPI 供全球开发者下载时，你是否遇到过这些困惑：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;pip install&lt;/code&gt; 背后到底发生了什么？&lt;/li&gt;&lt;li&gt;为什么安装 &lt;code&gt;beautifulsoup4&lt;/code&gt; 却要 &lt;code&gt;import bs4&lt;/code&gt;？&lt;/li&gt;&lt;li&gt;项目代码应该放在根目录还是 &lt;code&gt;src&lt;/code&gt; 目录？&lt;/li&gt;&lt;li&gt;&lt;code&gt;python -m build&lt;/code&gt; 和 &lt;code&gt;uv build&lt;/code&gt; 有什么区别？&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;本文将从&lt;strong&gt;依赖安装的底层机制&lt;/strong&gt;出发，逐步深入到 &lt;strong&gt;WHL 文件构建流程&lt;/strong&gt;，最后探讨&lt;strong&gt;现代化项目结构&lt;/strong&gt;的最佳实践。无论你是刚接触 Python 打包的新手，还是希望迁移到现代工具链的开发者，这篇文章都能给你清晰的指引。&lt;/p&gt;&lt;h2&gt;依赖安装机制：当你执行 &lt;code&gt;pip install&lt;/code&gt; 时发生了什么？&lt;/h2&gt;&lt;h3&gt;软件包从哪来？——PyPI 与 WHL 文件&lt;/h3&gt;&lt;p&gt;当你执行 &lt;code&gt;pip install flask&lt;/code&gt; 时，工具背后做了三件核心的事：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;查询元数据&lt;/strong&gt;：向 &lt;a href=&#34;https://pypi.org/&#34;&gt;PyPI&lt;/a&gt;（Python Package Index，Python 官方的软件包仓库）请求 &lt;code&gt;flask&lt;/code&gt; 的包信息&lt;/li&gt;&lt;li&gt;&lt;strong&gt;下载 WHL 文件&lt;/strong&gt;：根据你的 Python 版本和操作系统，选择最合适的 &lt;code&gt;.whl&lt;/code&gt; 文件下载&lt;/li&gt;&lt;li&gt;&lt;strong&gt;解压安装&lt;/strong&gt;：将 WHL 文件解压到当前 Python 环境的 &lt;code&gt;site-packages&lt;/code&gt; 目录&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;WHL（Wheel）&lt;/strong&gt; 是 Python 的二进制分发格式标准（由 &lt;a href=&#34;https://peps.python.org/pep-0427/&#34;&gt;PEP 427&lt;/a&gt; 定义）。它本质上就是一个 &lt;strong&gt;ZIP 压缩包&lt;/strong&gt;，里面包含了：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;预编译的代码（或纯 Python 源代码）&lt;/li&gt;&lt;li&gt;包的元数据（依赖关系、版本信息等）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;让我们以 &lt;code&gt;Flask 3.1.1&lt;/code&gt; 为例，看看 WHL 文件的真面目：&lt;/p&gt;&lt;p&gt;```bash&lt;/p&gt;&lt;h1&gt;下载 Flask 的 WHL 文件（不安装）&lt;/h1&gt;&lt;p&gt;pip download flask==3.1.1 -d ./downloads&lt;/p&gt;&lt;h1&gt;查看 WHL 内容（WHL 就是 ZIP）&lt;/h1&gt;&lt;p&gt;unzip -l ./downloads/flask-3.1.1-py3-none-any.whl```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/05/python-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E6%89%93%E5%8C%85%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/</link> <pubDate>Thu, 05 Feb 2026 22:54:06 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/05/python-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E6%89%93%E5%8C%85%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/</guid> </item> <item> <title>马修·伯恩斯坦讲线性代数系列：开篇</title> <author>Tinker</author> <description>&lt;p&gt;马修·伯恩斯（Matthew N. Bernstein） 是计算生物学与机器学习领域的研究者，现任 Cellular Intelligence 首席计算科学家。&lt;/p&gt;&lt;p&gt;他于2019年获威斯康星大学麦迪逊分校计算机科学博士学位，本科毕业于圣母大学。此前曾在 Stellaromics 和 Immunitas Therap...&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/01/31/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</link> <pubDate>Sun, 01 Feb 2026 13:13:56 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/01/31/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</guid> </item> <item> <title>马修·伯恩斯坦讲线性代数系列：矩阵的介绍</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://mbernste.github.io/posts/matrices/&#34;&gt;Introducing matrices&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在这里，我将介绍思考矩阵的三种主要方法。当我在本科线性代数课程中第一次接触到矩阵时，这种对矩阵多方面思考方式的高级描述将帮助我更好地直觉矩阵。&lt;/p&gt;&lt;h2&gt;引言&lt;/h2&gt;&lt;p&gt;矩阵是线性代数中的基本概念，在科学和工程领域中无处不在。从表面上看，矩阵只是一个二维的值数组。例如，以下是一个矩阵：&lt;/p&gt;&lt;p&gt;$$\begin{bmatrix}1 &amp;amp; -2 &amp;amp; 0 \ 4 &amp;amp; -3 &amp;amp; 1 \ 0 &amp;amp; 6 &amp;amp; -2 \end{bmatrix}$$&lt;/p&gt;&lt;p&gt;正如我在&lt;a href=&#34;https://mbernste.github.io/posts/understanding_3d/&#34;&gt;上一篇博客文章&lt;/a&gt;中讨论的那样，有些概念需要从多个角度观察才能掌握其真实本质。尽管矩阵表面上很简单，但我认为矩阵是其中一个概念，并且我相信，如果一开始就提供对矩阵的高层次、多视角概述，以便为未来的线性代数学习提供背景，那么对于我--大学线性代数课程的二年级学生来说，这会对我有所帮助。在这篇文章中，我将介绍查看矩阵的三个主要角度，这对我以前的自己有帮助。&lt;/p&gt;&lt;h2&gt;预备知识&lt;/h2&gt;&lt;p&gt;在介绍观察矩阵的三种角度之前，我将介绍一些符号。首先，一个&lt;strong&gt;矩阵&lt;/strong&gt;是一个矩形的值数组。例如，以下矩阵 $\boldsymbol{A}$ 有 $m$ 行和 $n$ 列：&lt;/p&gt;&lt;p&gt;$$\boldsymbol{A} := \begin{bmatrix} a_{1,1} &amp;amp; a_{1,2} &amp;amp; \dots &amp;amp; a_{1,n} \ a_{2,1} &amp;amp; a_{2,2} &amp;amp; \dots &amp;amp; a_{2,n} \ \vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \vdots \ a_{m,1} &amp;amp; a_{m,2} &amp;amp; \dots &amp;amp; a_{m,n} \end{bmatrix}$$&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/02/01/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5%E7%9A%84%E4%BB%8B%E7%BB%8D/</link> <pubDate>Sun, 01 Feb 2026 13:13:56 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/02/01/%E9%A9%AC%E4%BF%AE%E4%BC%AF%E6%81%A9%E6%96%AF%E5%9D%A6%E8%AE%B2%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%B3%BB%E5%88%97%E7%9F%A9%E9%98%B5%E7%9A%84%E4%BB%8B%E7%BB%8D/</guid> </item> <item> <title>成为一名优秀的程序员：心智模型和学习策略</title> <author>Tinker</author> <description>&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;在我作为软件工程师的职业生涯中，我遇到了一些伟大的程序员，并从他们身上学到了很多东西。这篇文章将为初学者提供一些关于成为一名优秀程序员的旅程的提示，特别是从心智模型和学习策略方面。&lt;/p&gt;&lt;p&gt;掌握编程需要花费大量时间。 Peter Norvig 说&lt;a href=&#34;https://norvig.com/21-days.html&#34;&gt;十年可能就足够了&lt;/a&gt;，所以请保持耐心，让我们开始吧。&lt;/p&gt;&lt;h2&gt;心智模型&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202601//mental.png&#34;&gt;&lt;/p&gt;&lt;p&gt;每个人都会编程，几岁的孩子也能写出一些可运行的代码。然而，成为一名优秀的程序员需要大量的时间和精力来打磨技能。做好准备的心态会让你在这段漫长的旅程中不断成长。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2024/08/11/%E6%88%90%E4%B8%BA%E4%B8%80%E5%90%8D%E4%BC%98%E7%A7%80%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B%E5%92%8C%E5%AD%A6%E4%B9%A0%E7%AD%96%E7%95%A5/</link> <pubDate>Wed, 28 Jan 2026 23:31:45 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/08/11/%E6%88%90%E4%B8%BA%E4%B8%80%E5%90%8D%E4%BC%98%E7%A7%80%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%98%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B%E5%92%8C%E5%AD%A6%E4%B9%A0%E7%AD%96%E7%95%A5/</guid> </item> <item> <title>Opus 音频编解码器：libopus API 实用指南</title> <author>Tinker</author> <description>&lt;p&gt;Opus 是一种高度高效的开源音频编解码器，由 IETF（互联网工程任务组）标准化开发。它以卓越的压缩效率、低延迟和高音质著称，尤其适合实时应用。Opus 支持宽带到全带宽的音频（6-20 kHz），并能无缝处理从语音到音乐的各种内容。&lt;strong&gt;libopus&lt;/strong&gt; 是其核心 C 语言实现库，轻量级且跨平台，支持嵌入式设备到高性能服务器。&lt;/p&gt;&lt;h2&gt;使用场景&lt;/h2&gt;&lt;p&gt;Opus 在以下领域广泛应用：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;实时通信&lt;/strong&gt;：如 VoIP（Voice over IP，例如 WebRTC 中的语音聊天）、视频会议和游戏内语音，确保低延迟传输。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;流媒体&lt;/strong&gt;：在线音乐流、播客和视频平台（如 YouTube），平衡带宽与音质。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;存储与归档&lt;/strong&gt;：音频文件压缩（如 Ogg Opus 容器），用于移动设备或云存储，节省空间。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;嵌入式系统&lt;/strong&gt;：IoT 设备、智能音箱或无人机音频处理，支持 ARM 等架构。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;与其他编解码器（如 AAC 或 MP3）相比，Opus 在低比特率下表现出色（例如 12-64 kbps），并内置前向纠错（FEC）和丢包隐藏机制，适合不稳定网络。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2025/09/24/opus-%E9%9F%B3%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8libopus-api-%E5%AE%9E%E7%94%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sun, 25 Jan 2026 21:14:07 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2025/09/24/opus-%E9%9F%B3%E9%A2%91%E7%BC%96%E8%A7%A3%E7%A0%81%E5%99%A8libopus-api-%E5%AE%9E%E7%94%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>uv 快速入门指南</title> <author>Tinker</author> <description>&lt;p&gt;uv 是一款由 Astral 团队（创始人 Charlie Marsh）使用 Rust 语言开发的高性能 Python 包管理器。它旨在解决传统工具如 pip 和 venv 在依赖解析、安装速度和整体效率上的瓶颈。&lt;/p&gt;&lt;p&gt;作为 Python 生态的现代化核心组件，uv 不仅提供数倍于 pip 的安装速度，还支持无缝兼容现有工具（如 pip、poetry 和 setuptools），让开发者能轻松过渡到高效的工作流。&lt;/p&gt;&lt;p&gt;无论你是初学者还是资深开发者，uv 都能简化项目管理、减少环境冲突，并加速开发迭代。&lt;/p&gt;&lt;h2&gt;安装 uv&lt;/h2&gt;&lt;p&gt;uv 的安装过程简单快捷，支持多种方式。推荐使用脚本安装，以获取最新版本和自动配置。&lt;/p&gt;&lt;h3&gt;通过安装脚本&lt;/h3&gt;&lt;p&gt;&lt;code&gt;bashcurl -LsSf https://astral.sh/uv/install.sh | sh&lt;/code&gt;&lt;/p&gt;&lt;p&gt;此命令会下载并执行安装脚本，将 uv 添加到你的 PATH 中。安装后，重启终端或运行 &lt;code&gt;source ~/.bashrc&lt;/code&gt;（或对应 shell 配置）以生效。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2025/11/29/uv-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 24 Jan 2026 23:22:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2025/11/29/uv-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>vcpkg快速入门指南</title> <author>Tinker</author> <description>&lt;p&gt;Vcpkg 是由 Microsoft 和 C++ 社区维护的免费开源 C/C++ 包管理器，可在 Windows、macOS 和 Linux 上运行。 它是核心的 C++ 工具，使用 C++ 和 CMake 脚本编写。 它旨在解决管理 C/C++ 库的独特难题。&lt;/p&gt;&lt;h2&gt;为什么使用 vcpkg？&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;在特选注册表中有超过&lt;a href=&#34;https://github.com/microsoft/vcpkg/tree/master/ports&#34;&gt;2300 个开源库&lt;/a&gt;可供选择，这些库会定期生成，用于验证 ABI 兼容性&lt;/li&gt;&lt;li&gt;支持使用自己的自定义库包创建自定义库注册表&lt;/li&gt;&lt;li&gt;适用于 Windows、macOS 和 Linux 的一致的跨平台体验&lt;/li&gt;&lt;li&gt;使用任何生成和项目系统都可以轻松将库添加到项目&lt;/li&gt;&lt;li&gt;从源生成依赖项或下载预生成的 ABI 验证二进制文件，默认提供 70 多个配置，并可针对特定要求进行无限自定义&lt;/li&gt;&lt;li&gt;通过独特的版本控制设计，防止依赖项之间出现版本冲突和菱形依赖问题&lt;/li&gt;&lt;li&gt;对于 MSBuild 和 CMake 用户：自动与生成环境集成，打造无缝获取依赖项的体验&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2025/08/24/vcpkg%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Thu, 22 Jan 2026 22:58:41 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2025/08/24/vcpkg%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Golang源码分析系列之Map底层实现</title> <author>Tinker</author> <description>&lt;p&gt;映射也被称为哈希表(hash table)、字典。它是一种由key-value组成的抽象数据结构。大多数情况下，它都能在O(1)的时间复杂度下实现增删改查功能。若在极端情况下出现所有key都发生哈希碰撞时则退回成链表形式，此时复杂度为O(N)。&lt;/p&gt;&lt;p&gt;映射底层一般都是由数组组成，该数组每个元素称为桶，它使用hash函数将key分配到不同桶中，若出现碰撞冲突时候，则采用链地址法（也称为拉链法）或者开放寻址法解决冲突。下图就是一个由姓名-号码构成的哈希表的结构图：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202106/hash_table.svg&#34;&gt;&lt;/p&gt;&lt;p&gt;Go语言中映射中key若出现冲突碰撞时候，则采用链地址法解决，Go语言中映射具有以下特点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;引用类型变量&lt;/li&gt;&lt;li&gt;读写并发不安全&lt;/li&gt;&lt;li&gt;遍历结果是随机的&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;数据结构&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202106/map_struct.png&#34;&gt;&lt;/p&gt;&lt;p&gt;Go语言中映射的数据结构是&lt;code&gt;runtime.hmap&lt;/code&gt;(&lt;a href=&#34;https://github.com/golang/go/blob/go1.14.13/src/runtime/map.go#L115-L129&#34;&gt;runtime/map.go&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;```go// A header for a Go map.type hmap struct { count int // 元素个数，用于len函数返回map元素数量 flags uint8 // 标志位，标志当前map正在写等状态 B uint8 // buckets个数的对数，即桶数量 = 2 ^ B noverflow uint16 // overflow桶数量的近似值，overflow桶即溢出桶，即链表法中存在链表上的桶的个数 hash0 uint32 // 随机数种子，用于计算key的哈希值&lt;/p&gt;&lt;pre&gt;&lt;code&gt;buckets unsafe.Pointer // 指向buckets数组，如果元素个数为0时，该值为niloldbuckets unsafe.Pointer // 扩容时指向旧的bucketsnevacuate uintptr // 用于指示迁移进度，小于此值的桶已经迁移完成extra *mapextra // 额外记录overflow桶信息&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;}```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/01/18/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bmap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</link> <pubDate>Sun, 18 Jan 2026 22:36:42 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/01/18/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bmap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</guid> </item> <item> <title>Golang源码分析系列之官方Context包</title> <author>Tinker</author> <description>&lt;h2&gt;Context简介&lt;/h2&gt;&lt;p&gt;Context是由Golang官方开发的并发控制包，一方面可以用于当请求超时或者取消时候，相关的goroutine马上退出释放资源，另一方面Context本身含义就是上下文，其可以在多个goroutine或者多个处理函数之间传递共享的信息。&lt;/p&gt;&lt;p&gt;创建一个新的context，必须基于一个父context，新的context又可以作为其他context的父context。所有context在一起构造成一个context树。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;context tree&#34; src=&#34;https://static.cyub.vip/images/202008/context-tree.jpg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/08/22/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8B%E5%AE%98%E6%96%B9context%E5%8C%85/</link> <pubDate>Sun, 18 Jan 2026 22:36:42 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/08/22/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8B%E5%AE%98%E6%96%B9context%E5%8C%85/</guid> </item> <item> <title>pkg-config快速入门指南</title> <author>Tinker</author> <description>&lt;p&gt;&lt;code&gt;pkg-config&lt;/code&gt; 是一个帮助开发人员在编译和链接程序时发现和使用库的辅助工具。它提供了一种方法来获取库的编译和链接参数，使得在编译时链接库变得更加容易和一致。&lt;code&gt;pkg-config&lt;/code&gt; 通常用于Unix-like系统，并且支持多种编程语言。&lt;/p&gt;&lt;p&gt;&lt;code&gt;pkg-config&lt;/code&gt; 的工作原理是查询一个名为&lt;code&gt;.pc&lt;/code&gt;的文件，这些文件包含了关于库的元数据，例如库的安装位置、编译器标志、链接器标志等。当你安装一个库时，通常会在&lt;code&gt;/usr/lib/pkgconfig&lt;/code&gt;或&lt;code&gt;/usr/share/pkgconfig&lt;/code&gt;目录下安装相应的&lt;code&gt;.pc&lt;/code&gt;文件。&lt;/p&gt;&lt;h2&gt;如何使用 &lt;code&gt;pkg-config&lt;/code&gt;&lt;/h2&gt;&lt;h3&gt;查询库的编译和链接标志&lt;/h3&gt;&lt;p&gt;使用&lt;code&gt;pkg-config&lt;/code&gt;查询库的编译和链接标志是最常见的用途。例如，如果你想使用&lt;code&gt;libopus&lt;/code&gt;库，你可以使用以下命令来获取编译和链接标志：&lt;/p&gt;&lt;p&gt;&lt;code&gt;bashpkg-config --cflags --libs opus&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这个命令会输出类似以下内容：&lt;/p&gt;&lt;p&gt;&lt;code&gt;bash-I/usr/include/opus -lopus&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这些标志可以直接在编译命令中使用。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2026/01/14/pkg-config%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Wed, 14 Jan 2026 23:30:43 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2026/01/14/pkg-config%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Docker使用过程中问题汇总</title> <author>Tinker</author> <description>&lt;p&gt;下面是我在使用docker过程中遇到的一些问题以及解答，现记录下来备查。&lt;/p&gt;&lt;h2&gt;1. 为什么有很多&lt;code&gt;&amp;lt;none&amp;gt;:&amp;lt;/none&amp;gt;&lt;/code&gt;镜像，有的删除不掉，有些却删除不掉？&lt;/h2&gt;&lt;p&gt;我们执行命令&lt;code&gt;docker images -a&lt;/code&gt;有时候会发现不少&lt;none&gt;:&lt;/none&gt;镜像，使用&lt;code&gt;docker rmi image_name&lt;/code&gt;删除这些none镜像时候，有时候能够成功，有时候却不能成功。这究竟为什么？&lt;/p&gt;&lt;p&gt;我们知道镜像是分层的，上面一层依赖下一层，下一层是上一次的父镜像层。就像下面这样：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;http://static.cyub.vip/images/201812/docker-image-layer.png&#34;&gt;&lt;/p&gt;&lt;p&gt;我们可以通过&lt;code&gt;docker inspect&lt;/code&gt;查看镜像ID 和父层镜像ID&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/12/06/docker%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/</link> <pubDate>Sun, 11 Jan 2026 11:15:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/12/06/docker%E4%BD%BF%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/</guid> </item> <item> <title>Go 开发中我一定会用到的 7 种代码模式</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://betterprogramming.pub/7-code-patterns-in-go-i-cant-live-without-f46f72f58c4b&#34;&gt;7 Code Patterns in Go I Can’t Live Without&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;代码模式使你的程序更可靠、更高效，并使你的工作和生活更轻松&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;我已经为开发EDR解决方案工作了7年。这意味着我必须编写具有弹性和高效性的长时间运行的系统软件。我在这项工作中大量使用 Go，我想分享一些最重要的代码模式，你可以依靠这些模式你的程序更加可靠(reliable)和高效(efficient)。&lt;/p&gt;&lt;h2&gt;使用Map实现Set&lt;/h2&gt;&lt;p&gt;我们经常需要检查某些对象是否存在。例如，我们可能想检查之前是否访问过某个文件或者URL。在这些情况下，我们可以使用&lt;code&gt;map[string]struct{}&lt;/code&gt;。如下所示：&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202112/code_pattern1.png&#34;&gt;&lt;/p&gt;&lt;p&gt;使用空结构 &lt;code&gt;struct{}&lt;/code&gt; 意味着我们不希望Map的值占用任何空间。有些人会使用 &lt;code&gt;map[string]bool&lt;/code&gt;，但基准测试表明 &lt;code&gt;map[string]struct{}&lt;/code&gt; 在内存和时间上都表现得更好。相关基准测试可以&lt;a href=&#34;https://itnext.io/set-in-go-map-bool-and-map-struct-performance-comparison-5315b4b107b&#34;&gt;查看这里&lt;/a&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/12/25/go-%E5%BC%80%E5%8F%91%E4%B8%AD%E6%88%91%E4%B8%80%E5%AE%9A%E4%BC%9A%E7%94%A8%E5%88%B0%E7%9A%84-7-%E7%A7%8D%E4%BB%A3%E7%A0%81%E6%A8%A1%E5%BC%8F/</link> <pubDate>Sun, 11 Jan 2026 11:15:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/12/25/go-%E5%BC%80%E5%8F%91%E4%B8%AD%E6%88%91%E4%B8%80%E5%AE%9A%E4%BC%9A%E7%94%A8%E5%88%B0%E7%9A%84-7-%E7%A7%8D%E4%BB%A3%E7%A0%81%E6%A8%A1%E5%BC%8F/</guid> </item> <item> <title>并发编程系列：谈谈锁的实现机制</title> <author>Tinker</author> <description>&lt;p&gt;最近读了《&lt;a href=&#34;https://pages.cs.wisc.edu/~remzi/OSTEP/&#34;&gt;Operating Systems: Three Easy Pieces&lt;/a&gt;》一书，全书主要围绕虚拟化、并发和持久化这三个主题展开，其中并发部分中介绍锁的章节，行文风趣幽默，写得非常精彩。文中介绍了多种实现锁的方案，以及各种锁的适用场景和优缺点。本文基于该书中锁章节，以一个gopher的角度去分享、拓展书中介绍的锁，并尽量使用Go实现书中介绍的几款自旋锁。&lt;/p&gt;&lt;h2&gt;锁的基本思想&lt;/h2&gt;&lt;p&gt;锁(lock)的目的是给临界区(Critical Section)加上一层保护，以保证临界区中代码能够像单条原子指令一样执行。&lt;strong&gt;临界区&lt;/strong&gt;指的是一个访问共享资源的程序片段，比如对全局变量的访问、更新。在Linux系统中保护临界区的机制除了锁之外，还有信号量，屏障，RCU等手段。&lt;/p&gt;&lt;p&gt;锁本质是一个变量，我们通过lock()和unlock()这两个语义函数来操作锁变量。当线程准备进入临界区时候，会调用lock()尝试获取锁，当该锁状态是未上锁状态时候，线程会成功获取到锁，从而进入到临界区，如果此时其他线程尝试获取锁而进入临界区，会阻塞或者自旋。获取锁并进入临界区的线程称为&lt;strong&gt;锁的持有者&lt;/strong&gt;，当锁持有者退出临界区时候，调用unlock()来释放锁，那么阻塞等待的其他线程继续开始竞争这个锁。下面是获取锁和释放锁的代码示例：&lt;/p&gt;&lt;p&gt;&lt;code&gt;clock_t mutex;lock(&amp;amp;mutex); // 加锁balance = balance + 1; // 临界区资源unlock(&amp;amp;mutex); // 释放锁&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2022/07/28/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%B3%BB%E5%88%97%E8%B0%88%E8%B0%88%E9%94%81%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%9C%BA%E5%88%B6/</link> <pubDate>Sun, 11 Jan 2026 11:15:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2022/07/28/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%B3%BB%E5%88%97%E8%B0%88%E8%B0%88%E9%94%81%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%9C%BA%E5%88%B6/</guid> </item> <item> <title>探索Prometheus Go客户端指标</title> <author>Tinker</author> <description>&lt;p&gt;原文是 &lt;a href=&#34;https://povilasv.me/prometheus-go-metrics&#34;&gt;Exploring Prometheus Go client metrics&lt;/a&gt;，有删改。&lt;/p&gt;&lt;p&gt;在这篇文章中，我将探索下Prometheus Go 客户端指标，这些指标由&lt;code&gt;client_go&lt;/code&gt;通过&lt;code&gt;promhttp.Handler()&lt;/code&gt;暴露出来的。通过这些指标能帮助你更好的理解 Go 是如何工作的。&lt;/p&gt;&lt;p&gt;想对Prometheus了解更多吗？你可以去学习下&lt;a href=&#34;https://povilasv.me/out/prometheus&#34;&gt;Monitoring Systems and Services with Prometheus&lt;/a&gt;，这是一门很棒的课程，可以让你快速上手。&lt;/p&gt;&lt;p&gt;让我们从一个简单的程序开始，它注册&lt;code&gt;prom handler&lt;/code&gt;并且监听8080端口：&lt;/p&gt;&lt;p&gt;```go&lt;/p&gt;&lt;p&gt;package main&lt;/p&gt;&lt;p&gt;import ( &#34;log&#34; &#34;net/http&#34;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&#34;github.com/prometheus/client_golang/prometheus/promhttp&#34;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;func main() { http.Handle(&#34;/metrics&#34;, promhttp.Handler()) log.Fatal(http.ListenAndServe(&#34;:8080&#34;, nil))}```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/11/06/%E6%8E%A2%E7%B4%A2prometheus-go%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8C%87%E6%A0%87/</link> <pubDate>Sun, 11 Jan 2026 11:15:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/11/06/%E6%8E%A2%E7%B4%A2prometheus-go%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%8C%87%E6%A0%87/</guid> </item> <item> <title>如何在微控制器中运行Rust?</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://blog.mbedded.ninja/programming/languages/rust/running-rust-on-microcontrollers/#rp2040&#34;&gt;Running Rust on Microcontrollers&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;概览&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Rust&lt;/code&gt; 是一个相当新的编程语言(它诞生于2010[^1]年)，但在开发嵌入式固件方面显示出巨大的潜力。它首先被设计为一种系统编程语言，这使得它特别适合用于微控制器。它试图通过实现一个强大的所有权模型(可以消除整个错误类的发生)来改进 &lt;code&gt;C/C++&lt;/code&gt; 的一些最大缺点，这对固件也非常适用。&lt;/p&gt;&lt;p&gt;截至2022年，&lt;code&gt;C&lt;/code&gt; 和 &lt;code&gt;C++&lt;/code&gt; 编程语言仍然是嵌入式固件的事实标准。然而 &lt;code&gt;Rust&lt;/code&gt; 在固件中的角色看起来很光明。&lt;code&gt;Rust&lt;/code&gt; 对固件的支持并不是后面才考虑到，而是一开始就考虑支持。 为此，&lt;code&gt;Rust&lt;/code&gt; 专门有官方的 &lt;strong&gt;&lt;a href=&#34;https://github.com/rust-embedded/wg&#34;&gt;嵌入式设备工作组&lt;/a&gt;&lt;/strong&gt; 和 介绍如何使用 &lt;code&gt;Rust&lt;/code&gt; 进行嵌入式开发的 &lt;strong&gt;&lt;a href=&#34;https://docs.rust-embedded.org/book/&#34;&gt;嵌入式Rust之书&lt;/a&gt;&lt;/strong&gt;。下图就是Rust嵌入式设备工作组logo[^2]。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;Rust嵌入式设备工作组logo&#34; src=&#34;https://static.cyub.vip/images/202310/ewg-logo-blue-white-on-transparent.png&#34;&gt;&lt;/p&gt;&lt;p&gt;本篇文章旨在探索在微控制器（这里指的是低级嵌入式固件，而不是在 &lt;code&gt;Linux&lt;/code&gt; 等主机环境上运行）上运行 &lt;code&gt;Rust&lt;/code&gt;，涵盖以下内容：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;语言特性&lt;/li&gt;&lt;li&gt;架构支持&lt;/li&gt;&lt;li&gt;MCU家族支持&lt;/li&gt;&lt;li&gt;IDE, 编码 和 编码体验&lt;/li&gt;&lt;li&gt;实时操作系统&lt;/li&gt;&lt;li&gt;Rust缺点&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2023/10/22/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BE%AE%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8Crust/</link> <pubDate>Sat, 10 Jan 2026 23:38:49 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2023/10/22/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BE%AE%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8Crust/</guid> </item> <item> <title>首页</title> <description>&lt;h1&gt;导航&lt;/h1&gt;&lt;div class=&#34;grid cards&#34; markdown&gt;- [:fontawesome-solid-blog: __博客__](https://www.cyub.vip/blog){ .lg .middle } --- 用输出倒逼输入的系统性思考，将碎片知识沉淀为...</description><link>https://cyub.cyub.vip/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/</guid> </item> <item> <title>标签</title> <description>&lt;h1&gt;标签&lt;/h1&gt;&lt;h6&gt;tags.md:6-28/name { #tags.md:6-28/slug }&lt;/h6&gt;</description><link>https://cyub.cyub.vip/tags/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/tags/</guid> </item> <item> <title>所有文章</title> <description>&lt;h1&gt;所有文章&lt;/h1&gt;</description><link>https://cyub.cyub.vip/blog/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/</guid> </item> <item> <title>23个开发工具加速网站性能</title> <author>Tinker</author> <description>&lt;p&gt;原文地址：&lt;a href=&#34;https://www.sitepoint.com/23-development-tools-boosting-website-performance/&#34;&gt;23 Development Tools for Boosting Website Performance&lt;/a&gt;&lt;/p&gt;&lt;p&gt;When dealing with performance, it’s hard to remember all the tools that might help you out during development. For that purpose, we’ve compiled a list of 23 performance tools for your reference. Some you’ll have heard of, others probably not. Some have been covered in detail in our performance month, others are yet to be covered future articles; but all are very useful and should be part of your arsenal.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/12/03/23%E4%B8%AA%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8A%A0%E9%80%9F%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/12/03/23%E4%B8%AA%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E5%8A%A0%E9%80%9F%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD/</guid> </item> <item> <title>6个重构方法可帮你提升80%的代码质量</title> <author>Tinker</author> <description>&lt;p&gt;原文地址：&lt;a href=&#34;http://vitalflux.com/top-6-refactoring-patterns-to-help-you-score-80-in-code-quality/&#34;&gt;Top 6 Refactoring Patterns to Help You Score 80% in Code Quality&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在过去做了不少代码审核，发现了一些代码质量上普遍存在的问题，以下是其中的前五名：&lt;/p&gt;&lt;h2&gt;1. 臃肿的类&lt;/h2&gt;&lt;p&gt;类之所以会臃肿，是因为开发者缺乏对最基本的编码原则，即“单一职责原则”（SRP）的理解。这些类往往会变得很臃肿，是由于不同的且在功能上缺少关联的方法都放在了相同的类里面。&lt;/p&gt;&lt;p&gt;解决方法：&lt;strong&gt;提取类/抽离方法&lt;/strong&gt;正如上面提到的，像“臃肿的类”（一个类提供了本该有几个类提供的功能）这种代码异味应该将原有类中的方法和属性移动到适当数目的新类中去。旧类中对应新类的方法和属性应该被移除。&lt;/p&gt;&lt;p&gt;另外，有时候一些类过于臃肿是因为它包含了被其他类使用本应该是其他类的成员方法的成员方法。这些方法也应该被迁移到合适的类中。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/07/06/6%E4%B8%AA%E9%87%8D%E6%9E%84%E6%96%B9%E6%B3%95%E5%8F%AF%E5%B8%AE%E4%BD%A0%E6%8F%90%E5%8D%8780%E7%9A%84%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/07/06/6%E4%B8%AA%E9%87%8D%E6%9E%84%E6%96%B9%E6%B3%95%E5%8F%AF%E5%B8%AE%E4%BD%A0%E6%8F%90%E5%8D%8780%E7%9A%84%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F/</guid> </item> <item> <title>Ansible如何通过跳板机连接目标机器</title> <author>Tinker</author> <description>&lt;p&gt;&lt;a href=&#34;https://docs.ansible.com&#34;&gt;Ansible&lt;/a&gt;是配置管理工具，能够自动化部署，管理服务器。在实际工作中，我会用ansible来进行项目依赖的服务部署，比如nginx服务器，redis等部署。&lt;/p&gt;&lt;p&gt;在生产环境下，多台服务器往往部署在一个局域网内，没有公网ip，也不会对外暴露端口，这就导致本地不能通过ssh直接连接生产服务器。它需要连接到跳板机后然后再进行生产服务器操作。通过跳板机操作一来更安全，二来可以更好的监控和权限控制，但如果想要本地使用ansible对服务器进行操作，就被限制住了。此时我们可以更改ssh配置进行处理，已达到本地机器&#34;直接&#34;连接远程生产机器的目的。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/08/01/ansible%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E8%B7%B3%E6%9D%BF%E6%9C%BA%E8%BF%9E%E6%8E%A5%E7%9B%AE%E6%A0%87%E6%9C%BA%E5%99%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/08/01/ansible%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E8%B7%B3%E6%9D%BF%E6%9C%BA%E8%BF%9E%E6%8E%A5%E7%9B%AE%E6%A0%87%E6%9C%BA%E5%99%A8/</guid> </item> <item> <title>Architecting on AWS笔记</title> <author>Tinker</author> <description>&lt;p&gt;春节期间，公司组织远程培训，请Aws讲师培训&lt;code&gt;Architecting on aws&lt;/code&gt;，属于aws架构培训中级课程。以下内容是个人做的笔记。&lt;/p&gt;&lt;h2&gt;Aws简介&lt;/h2&gt;&lt;h3&gt;什么是云，什么是AWS&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;可编程资源&lt;ul&gt;&lt;li&gt;IAC(基础设施作为代码)&lt;/li&gt;&lt;li&gt;PAY as you go&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;动态能力&lt;/li&gt;&lt;li&gt;按使用量付费&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2020/02/20/architecting-on-aws%E7%AC%94%E8%AE%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/02/20/architecting-on-aws%E7%AC%94%E8%AE%B0/</guid> </item> <item> <title>Awk三十分钟入门到精通</title> <author>Tinker</author> <description>&lt;h2&gt;简介&lt;/h2&gt;&lt;p&gt;Awk是Linux系统中强大的文本处理命令工具。它名字来源于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。Awk是一个工具，也是一种程序语言，类似c语言，但无需提前进行变量声明定义。一个Awk程序由一系列的模式（pattern)和动作（action)组成, 模式用于描述在输入的文本中搜索哪些数据, 当某一行文本搜索到（即匹配某个模式）之后，动作定义了如何操作该行文本。&lt;/p&gt;&lt;h2&gt;程序格式&lt;/h2&gt;&lt;p&gt;一个awk程序格式如下：&lt;/p&gt;&lt;pre&gt;&lt;code&gt;pattern { action }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;awk的操作逻辑是扫描文本每一行, 搜索可以被模式(pattern)匹配的行， 若行能够匹配模式，则接着进行执行动作（action)。&lt;/p&gt;&lt;p&gt;在扫描每一行过程中，awk会自动把当前行分解为一个个的字段，默认是空格进行分割，$0表示当前行内容，$1为当前行的第一段，$2为当前行的第二段，以此类推。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/10/04/awk%E4%B8%89%E5%8D%81%E5%88%86%E9%92%9F%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/10/04/awk%E4%B8%89%E5%8D%81%E5%88%86%E9%92%9F%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/</guid> </item> <item> <title>CGO使用指南</title> <author>Tinker</author> <description>&lt;p&gt;Go 提供一个名为&lt;code&gt;C&lt;/code&gt;的伪包(pseudo-package)用来与 C/C++ 语言进行交互操作，这种Go语言与C语言交互的机制叫做 &lt;strong&gt;CGO&lt;/strong&gt;。通过 CGO 我们可以在 Go 语言中调用 C/C++ 代码，也可以在 C/C++ 代码中调用Go语言。CGO 本质就是 Go 实现的 &lt;a href=&#34;https://en.wikipedia.org/wiki/Foreign_function_interface&#34;&gt;FFI&lt;/a&gt;（全称为Foreign function interface，用来描述一种编程语言编写的程序可以调用另一种编程语言编写的服务的机制）解决方案。&lt;/p&gt;&lt;p&gt;当 Go 代码中加入&lt;code&gt;import C&lt;/code&gt;语句来导入&lt;code&gt;C&lt;/code&gt;这个不存在的包时候，会启动 CGO 特性。此后在 Go 代码中我们可以使用&lt;code&gt;C.&lt;/code&gt;前缀来引用C语言中的变量、类型，函数等。启动 CGO 特性时候，需要确保环境变量 &lt;code&gt;CGO_ENABLED&lt;/code&gt; 值是1，我们可以通过&lt;code&gt;go env CGO_ENABLED&lt;/code&gt;查看该环境变量的值，通过&lt;code&gt;go env -w CGO_ENABLED=1&lt;/code&gt;用来设置该环境变量值。&lt;/p&gt;&lt;h2&gt;序言&lt;/h2&gt;&lt;p&gt;我们可以给&lt;code&gt;import C&lt;/code&gt;语句添加注释，在注释中可以引入C的头文件，以及定义和声明函数和变量，此后我们可以在 Go 代码中引用这些函数和变量。这种注释称为 &lt;strong&gt;序言(preamble)&lt;/strong&gt; 。需要注意的是 &lt;strong&gt;序言和&lt;code&gt;import C&lt;/code&gt;语句之间不能有换行&lt;/strong&gt;，序言中的静态变量是不能被Go代码引用的，而静态函数是可以的。&lt;/p&gt;&lt;p&gt;```gopackage main&lt;/p&gt;&lt;p&gt;/*&lt;/p&gt;&lt;h1&gt;include &lt;stdio.h&gt;&lt;/h1&gt;&lt;h1&gt;include &lt;stdlib.h&gt;&lt;/h1&gt;&lt;p&gt;static void myprint(char&lt;em&gt; s) { printf(&#34;%s\n&#34;, s);}&lt;/em&gt;/import &#34;C&#34;import &#34;unsafe&#34;&lt;/p&gt;&lt;p&gt;func main() { cs := C.CString(&#34;hello world&#34;) C.myprint(cs) C.free(unsafe.Pointer(cs))}```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2022/05/09/cgo%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2022/05/09/cgo%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>CMake快速上手指南</title> <author>Tinker</author> <description>&lt;p&gt;CMake是一个跨平台的自动化构建系统，它使用配置文件（CMakeLists.txt）来生成标准的构建文件，如Unix的Makefile或Windows的Visual Studio工程文件。CMake旨在支持多平台源代码编辑和管理，并且可以用于管理复杂项目和大型代码库的构建过程。&lt;/p&gt;&lt;p&gt;CMake的主要特点包括：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;跨平台&lt;/strong&gt;: 支持在多种操作系统上构建项目，包括Windows、Linux、macOS等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;生成构建系统&lt;/strong&gt;: 根据CMakeLists.txt文件生成适用于不同平台的构建系统或IDE项目文件。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;可扩展&lt;/strong&gt;: 允许用户通过编写自己的CMake模块和脚本来扩展其功能。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;查找依赖&lt;/strong&gt;: 能够自动查找并配置项目所需的外部库和依赖项。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置选项&lt;/strong&gt;: 提供丰富的配置选项，允许用户自定义构建类型、编译选项等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;安装规则&lt;/strong&gt;: 支持定义安装规则，方便软件的打包和分发。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;集成测试&lt;/strong&gt;: 支持集成测试，确保代码质量。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;社区支持&lt;/strong&gt;: 拥有一个活跃的社区和丰富的在线资源，包括文档、教程和论坛。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;适用于大型项目&lt;/strong&gt;: 特别适合于大型项目和多语言支持的项目。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;CMake通过提供一套统一的构建和配置接口，简化了在不同平台上编译和构建项目的复杂性，是许多开源项目和商业软件所采用的构建工具之一。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2024/08/29/cmake%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/08/29/cmake%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Caddy服务器部署实践</title> <author>Tinker</author> <description>&lt;p&gt;Caddy是go语言编写的一款跨平台web服务器，支持window，linux，andorid等操作系统。&lt;/p&gt;&lt;p&gt;它配置简单易用，原生支持 HTTP/2，支持Markdown自动渲染，反向代理，FastCGI，自动创建 &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let’s Encrypt&lt;/a&gt; 证书等特性，非常适合开发环境使用。更多特性可见&lt;a href=&#34;https://caddyserver.com/&#34;&gt;官方介绍&lt;/a&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/03/12/caddy%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E5%AE%9E%E8%B7%B5/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/03/12/caddy%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E5%AE%9E%E8%B7%B5/</guid> </item> <item> <title>CentOS下安装MySQL</title> <author>Tinker</author> <description>&lt;h1&gt;配置yum源&lt;/h1&gt;&lt;h3&gt;下载mysql源安装包&lt;/h3&gt;&lt;p&gt;&lt;code&gt;wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/03/28/centos%E4%B8%8B%E5%AE%89%E8%A3%85mysql/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/03/28/centos%E4%B8%8B%E5%AE%89%E8%A3%85mysql/</guid> </item> <item> <title>CentOS下安装Redis以及主从复制测试</title> <author>Tinker</author> <description>&lt;p&gt;Redis是一个高性能的key-value数据库，它支持丰富的数据类型，包括字符串(String), 哈希(Hash), 列表(list), 集合(sets)和有序集合(sorted sets)。本文将从源码安装Redis并配置成系统服务，最后进行主从复制测试，这个流程展开&lt;/p&gt;&lt;h1&gt;1. 下载Redis并解压&lt;/h1&gt;&lt;p&gt;Redis最新稳定版本是4.0&lt;/p&gt;&lt;p&gt;&lt;code&gt;wget http://download.redis.io/releases/redis-4.0.2.tar.gztar -xzvf redis-4.0.2.tar.gz&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/10/20/centos%E4%B8%8B%E5%AE%89%E8%A3%85redis%E4%BB%A5%E5%8F%8A%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E6%B5%8B%E8%AF%95/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/10/20/centos%E4%B8%8B%E5%AE%89%E8%A3%85redis%E4%BB%A5%E5%8F%8A%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%E6%B5%8B%E8%AF%95/</guid> </item> <item> <title>Comprehensive Introduction to Apache Spark, RDDs &amp; Dataframes (Using PySpark)</title> <author>Tinker</author> <description>&lt;p&gt;&lt;img alt=&#34;Introduction to Apache Spark&#34; src=&#34;http://static.cyub.vip/images/201810/spark_introduction.png&#34;&gt;原文地址：&lt;a href=&#34;https://www.analyticsvidhya.com/blog/2016/09/comprehensive-introduction-to-apache-spark-rdds-dataframes-using-pyspark/&#34;&gt;Comprehensive Introduction to Apache Spark, RDDs &amp;amp; Dataframes (using PySpark)&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;blockquote class=&#34;blockquote-center&#34;&gt;Industry estimates that we are creating more than 2.5 Quintillion bytes of data every year.&lt;/blockquote&gt;&lt;p&gt;Think of it for a moment – 1 Qunitillion = 1 Million Billion! Can you imagine how many drives / CDs / Blue-ray DVDs would be required to store them? It is difficult to imagine this scale of data generation even as a data science professional. While this pace of data generation is very exciting, it has created entirely new set of challenges and has forced us to find new ways to handle Big Huge data effectively.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/10/23/comprehensive-introduction-to-apache-spark-rdds--dataframes-using-pyspark/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/10/23/comprehensive-introduction-to-apache-spark-rdds--dataframes-using-pyspark/</guid> </item> <item> <title>Conversation With API Builders</title> <author>Tinker</author> <description>&lt;p&gt;原文链接：http://conversation.bigbinary.com/&lt;/p&gt;&lt;h1&gt;Conversation With API Builders&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;Bad APIs have one thing in common—they do not handle response status codes effectively. They all use custom solutions while the status code value can be attached to the HTTP resonse. This ebook covers when to use what status code and much more.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;1. Return 200 when it is all good&lt;/h2&gt;&lt;p&gt;API user : Hey, I have a problem.&lt;/p&gt;&lt;p&gt;API builder : What’s wrong.&lt;/p&gt;&lt;p&gt;API user : I sent a request to the API to create a user. But I do not see the newly created user.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/09/13/conversation-with-api-builders/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/09/13/conversation-with-api-builders/</guid> </item> <item> <title>Crontab使用完全指南</title> <author>Tinker</author> <description>&lt;p&gt;最近看了《&lt;a href=&#34;https://www.sitepoint.com/premium/books/better-php-development&#34;&gt;Better PHP Development&lt;/a&gt;》一书，里面第6章专门讲了&lt;code&gt;crontab&lt;/code&gt;使用指南，事无巨细，几乎涉及到&lt;code&gt;crontab&lt;/code&gt;用法的方方面面。一直以为以为自己对&lt;code&gt;crontab&lt;/code&gt;用法非常熟悉了，看完之后才发现有些地方之前确实不知道。现把书中重要内容记录到博客中，以便后续查阅。&lt;/p&gt;&lt;h2&gt;Cron简介&lt;/h2&gt;&lt;p&gt;&lt;code&gt;cron&lt;/code&gt;是类Unix操作系统中基于时间的作业调度器，它会在未来某个时刻触发某些任务。这个名字源于希腊语“χρόνος”( chronos )，意思是时间。由于&lt;code&gt;crontab&lt;/code&gt;命令是使用&lt;code&gt;cron&lt;/code&gt;时候最常用的命令，所以我们通常会说&lt;code&gt;crontab&lt;/code&gt;，其实也就是&lt;code&gt;cron&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;如果我们查看&lt;code&gt;/etc&lt;/code&gt;目录，我们可以看到&lt;code&gt;cron.hourly&lt;/code&gt;, &lt;code&gt;cron.daily&lt;/code&gt;, &lt;code&gt;cron.weekly&lt;/code&gt; 和&lt;code&gt;cron.monthly&lt;/code&gt;这样的目录，每个目录都对应于特定的执行频率。比如&lt;code&gt;cron.hourly&lt;/code&gt;目录下面的脚本会按照每小时来执行。&lt;strong&gt;安排任务的一种方式是将脚本放在相对应的目录中&lt;/strong&gt;。例如，为了每天运行&lt;code&gt;db_backup.php&lt;/code&gt;，我们将它放在&lt;code&gt;cron.daily&lt;/code&gt;中。若没有这个目录，我们需要手动创建&lt;code&gt;cron.daily&lt;/code&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/11/14/crontab%E4%BD%BF%E7%94%A8%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/11/14/crontab%E4%BD%BF%E7%94%A8%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Debounce vs Throttle</title> <author>Tinker</author> <description>&lt;p&gt;&lt;code&gt;Debounce&lt;/code&gt; 和 &lt;code&gt;Throttle&lt;/code&gt;是javascript中两种手段来控制函数的执行，特别是事件的处理。&lt;/p&gt;&lt;p&gt;当处理&lt;code&gt;scroll&lt;/code&gt;,&lt;code&gt;resize&lt;/code&gt;, &lt;code&gt;keyup&lt;/code&gt;等事件时候，由于每秒触发的时间频次太多，不断的通过绑定回调函数来处理，会对浏览器造成巨大压力。这时候Debounce和Throttle就派上用场了。&lt;/p&gt;&lt;h2&gt;Debounce&lt;/h2&gt;&lt;p&gt;debounce强制函数某段时间只会执行一次，会把大量事件聚合在一次执行，哪怕它本来会被调用多次。&lt;/p&gt;&lt;p&gt;而throttle好比每隔15分钟一趟的电梯，过点不侯，debounce也每隔15分钟一趟，但当它看见有人要进来时候，它会允许进来，并从进来那一刻算起在等15分钟，如果15分钟内没有人进来了，就会开走。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/01/27/debounce-vs-throttle/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/01/27/debounce-vs-throttle/</guid> </item> <item> <title>ElasticSearch完全使用指南（一）</title> <author>Tinker</author> <description>&lt;p&gt;&lt;img alt=&#34;ElasticSearch完全使用指南&#34; src=&#34;https://static.cyub.vip/images/202005/es-logo.png&#34;&gt;&lt;/p&gt;&lt;h2&gt;简介&lt;/h2&gt;&lt;p&gt;Elasticsearch是基于Apace Lunence构建的开源，分布式，具有高可用性和高拓展性的全文检索引擎。Elasticsearch具有开箱即用的特性，提供RESTful接口，是面向文档的数据库，文档存储格式为JSON，可以水平扩展至数以百计的服务器存储来实现处理PB级别的数据。&lt;/p&gt;&lt;p&gt;Elasticsearch可以快速存储，搜索，分析海量，索引数据速度达到毫秒级（近实时Near Real Time)。Github的代码搜索就是使用Elasticsearch来实现的。Elasticsearch使用场景有：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;网站全文检索，高亮搜索，搜索建议&lt;/li&gt;&lt;li&gt;电商网站商品搜索，分面搜索(分面是指事物的多维度属性)&lt;/li&gt;&lt;li&gt;基于用户行为的推荐系统&lt;/li&gt;&lt;li&gt;支持到PB级别日志数据分析&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2020/03/22/elasticsearch%E5%AE%8C%E5%85%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E4%B8%80/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/03/22/elasticsearch%E5%AE%8C%E5%85%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%E4%B8%80/</guid> </item> <item> <title>Elasticsearch内存占用分析与管理</title> <author>Tinker</author> <description>&lt;p&gt;Elasticsearch是基于JVM实现的，内存分配分为堆内(on-heap)和堆外(off-heapp)两部分。每部分的内存，可以用于不同目的的缓存，具体可以看下思维导图：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202010/es_memory.jpg&#34;&gt;&lt;/p&gt;&lt;p&gt;从整体来看如下所示：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202204/es_memory_layout.png&#34;&gt;&lt;/p&gt;&lt;h3&gt;堆内存与堆外内存&lt;/h3&gt;&lt;p&gt;一般情况下，Java中分配的非空对象都是由Java虚拟机的垃圾收集器管理的，称为&lt;strong&gt;堆内内存（on-heap memory）&lt;/strong&gt;。虚拟机会定期对垃圾内存进行回收，在某些特定的时间点，它会进行一次彻底的回收（full gc）。彻底回收时，垃圾收集器会对所有分配的堆内内存进行完整的扫描，这意味着一个重要的事实——这样一次垃圾收集对Java应用造成的影响，跟堆的大小是成正比的。过大的堆会影响Java应用的性能。&lt;/p&gt;&lt;p&gt;Java虚拟机的堆以外的内存，即直接收操作系统管理的内存属于&lt;strong&gt;堆外内存（off-heap memory）&lt;/strong&gt;，通过把内存对象分配在堆外内存中，可以保持一个较小的堆，可以减少垃圾回收对应用的影响。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/09/25/elasticsearch%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%E5%88%86%E6%9E%90%E4%B8%8E%E7%AE%A1%E7%90%86/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/09/25/elasticsearch%E5%86%85%E5%AD%98%E5%8D%A0%E7%94%A8%E5%88%86%E6%9E%90%E4%B8%8E%E7%AE%A1%E7%90%86/</guid> </item> <item> <title>Elasticsearch小技巧之版本号比较过滤筛选</title> <author>Tinker</author> <description>&lt;p&gt;安卓应用的版本信息分为版本名和版本号两部分。版本名是语义性版本，一般格式是&lt;code&gt;主版本号.次版本号.修订版本号&lt;/code&gt;；版本号格式是数字。&lt;/p&gt;&lt;p&gt;应用新版本的版本号一定要旧版本要大，因为安卓系统在安装升级应用时候，会检查应用的版本号是否大于手机内已安装的该应用的版本号，若小于则直接拒绝升级此应用。&lt;/p&gt;&lt;p&gt;在开发需求中，有时候会需要根据应用的版本名进行筛选应用，比如筛选版本名大于&lt;code&gt;7.33.1&lt;/code&gt;的Netflix应用，此时若直接把每个应用的版本名索引到es里面，然后根据版本名字段range范围查询，这是有问题的。比如&lt;code&gt;12.8.1&lt;/code&gt;版本是高于&lt;code&gt;7.31.1&lt;/code&gt;版本的，因为在es里面是按照字符串逐字比较的，导致出现相反结果。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/11/10/elasticsearch%E5%B0%8F%E6%8A%80%E5%B7%A7%E4%B9%8B%E7%89%88%E6%9C%AC%E5%8F%B7%E6%AF%94%E8%BE%83%E8%BF%87%E6%BB%A4%E7%AD%9B%E9%80%89/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/11/10/elasticsearch%E5%B0%8F%E6%8A%80%E5%B7%A7%E4%B9%8B%E7%89%88%E6%9C%AC%E5%8F%B7%E6%AF%94%E8%BE%83%E8%BF%87%E6%BB%A4%E7%AD%9B%E9%80%89/</guid> </item> <item> <title>Elasticsearch生产环境配置</title> <author>Tinker</author> <description>&lt;p&gt;Elasticsearch在生产环境部署时候，我们需要考虑系统配置优化和Es本身配置优化，已达到能够发挥其最佳性能。本文是根据官方文档和个人工作实践总结出的生产环境配置。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202010/es_prod_config.jpg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/10/07/elasticsearch%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/10/07/elasticsearch%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/</guid> </item> <item> <title>Golang中信号处理</title> <author>Tinker</author> <description>&lt;h3&gt;什么是信号？&lt;/h3&gt;&lt;p&gt;信号(signal)是进程间通讯的一种方式，用来提醒进程某个事件已经发生。它属于一种异步通知进制。一个进程不必通过任何操作来等待信号的到达，事实上进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号，通知进程发生了某个事件。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/09/20/golang%E4%B8%AD%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/09/20/golang%E4%B8%AD%E4%BF%A1%E5%8F%B7%E5%A4%84%E7%90%86/</guid> </item> <item> <title>Golang中几种通道死锁典型案例</title> <author>Tinker</author> <description>&lt;p&gt;Golang中通道是进行数据同步一个重要手段，当主进程读取空通道，或者向没有协程读取的通道写入时候，都会发生死锁现象（编译时候提示fatal error: all goroutines are asleep - deadlock!）。下面列出几个常见死锁情况。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/07/19/golang%E4%B8%AD%E5%87%A0%E7%A7%8D%E9%80%9A%E9%81%93%E6%AD%BB%E9%94%81%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/07/19/golang%E4%B8%AD%E5%87%A0%E7%A7%8D%E9%80%9A%E9%81%93%E6%AD%BB%E9%94%81%E5%85%B8%E5%9E%8B%E6%A1%88%E4%BE%8B/</guid> </item> <item> <title>Go 反射三定律</title> <author>Tinker</author> <description>&lt;p&gt;原文地址：https://blog.golang.org/laws-of-reflection&lt;/p&gt;&lt;h2&gt;简介&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Reflection（反射）&lt;/strong&gt; 在计算机中表示程序能够检查自身结构的能力，特别指通过类型进行处理。它是元编程的一种形式，也是最容易让人迷惑的一部分。&lt;/p&gt;&lt;h2&gt;类型和接口&lt;/h2&gt;&lt;p&gt;因为反射建立在类型系统之上，所以让我们先回顾一下 &lt;code&gt;Go&lt;/code&gt; 中的类型。&lt;code&gt;Go&lt;/code&gt; 是静态类型语言。每个变量都有一个静态类型，即只有一种类型，并且在编译时就已经确定了。比如&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float32&lt;/code&gt;, &lt;code&gt;*MyType&lt;/code&gt;, &lt;code&gt;[]byte&lt;/code&gt;等。比如我们进行如下声明：&lt;/p&gt;&lt;p&gt;```gotype MyInt int&lt;/p&gt;&lt;p&gt;var i intvar j MyInt```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/11/22/go-%E5%8F%8D%E5%B0%84%E4%B8%89%E5%AE%9A%E5%BE%8B/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/11/22/go-%E5%8F%8D%E5%B0%84%E4%B8%89%E5%AE%9A%E5%BE%8B/</guid> </item> <item> <title>Golang并发调度的GMP模型</title> <author>Tinker</author> <description>&lt;p&gt;Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务，将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。&lt;/p&gt;&lt;h2&gt;什么是Goroutine&lt;/h2&gt;&lt;p&gt;Goroutine = Golang + Coroutine。&lt;strong&gt;Goroutine是golang实现的协程，是用户级线程&lt;/strong&gt;。Goroutine具有以下特点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;相比线程，其启动的代价很小，以很小栈空间启动（2Kb左右）&lt;/li&gt;&lt;li&gt;能够动态地伸缩栈的大小，最大可以支持到Gb级别&lt;/li&gt;&lt;li&gt;工作在用户态，切换成很小&lt;/li&gt;&lt;li&gt;与线程关系是n:m，即可以在n个系统线程上多工调度m个Goroutine&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2020/08/29/golang%E5%B9%B6%E5%8F%91%E8%B0%83%E5%BA%A6%E7%9A%84gmp%E6%A8%A1%E5%9E%8B/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/08/29/golang%E5%B9%B6%E5%8F%91%E8%B0%83%E5%BA%A6%E7%9A%84gmp%E6%A8%A1%E5%9E%8B/</guid> </item> <item> <title>Golang源码分析系列之Channel底层实现</title> <author>Tinker</author> <description>&lt;p&gt;Golang中Channel是goroutine间重要通信的方式，是并发安全的，通道内的数据First In First Out，我们可以把通道想象成队列。这里面分析的源码基于&lt;a href=&#34;https://github.com/golang/go/blob/release-branch.go1.13/src/runtime/chan.go&#34;&gt;go1.13&lt;/a&gt;版本。&lt;/p&gt;&lt;h2&gt;channel数据结构&lt;/h2&gt;&lt;p&gt;Channel底层数据结构是一个结构体。&lt;/p&gt;&lt;p&gt;&lt;code&gt;gotype hchan struct { qcount uint // 队列中元素个数 dataqsiz uint // 循环队列的大小 buf unsafe.Pointer // 指向循环队列 elemsize uint16 // 通道里面的元素大小 closed uint32 // 通道关闭的标志 elemtype *_type // 通道元素的类型 sendx uint // 待发送的索引，即循环队列中的队尾指针front recvx uint // 待读取的索引，即循环队列中的队头指针rear recvq waitq // 接收等待队列 sendq waitq // 发送等待队列 lock mutex // 互斥锁}&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/11/04/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bchannel%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/11/04/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bchannel%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</guid> </item> <item> <title>Golang源码分析系列之atomic底层实现</title> <author>Tinker</author> <description>&lt;h2&gt;atomic概述&lt;/h2&gt;&lt;p&gt;atomic是Go内置原子操作包。下面是官方说明：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Package atomic provides low-level atomic memory primitives useful for implementing synchronization algorithms. atomic包提供了用于实现同步机制的底层原子内存原语。&lt;/p&gt;&lt;p&gt;These functions require great care to be used correctly. Except for special, low-level applications, synchronization is better done with channels or the facilities of the sync package. Share memory by communicating; don&#39;t communicate by sharing memory. 使用这些功能需要非常小心。除了特殊的底层应用程序外，最好使用通道或sync包来进行同步。&lt;strong&gt;通过通信来共享内存；不要通过共享内存来通信&lt;/strong&gt;。&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://cyub.cyub.vip/blog/2021/04/05/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Batomic%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/04/05/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Batomic%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</guid> </item> <item> <title>Golang源码分析系列之sync.Map底层实现</title> <author>Tinker</author> <description>&lt;p&gt;Golang中&lt;code&gt;sync/map&lt;/code&gt;提供了并发读写map功能。这里面分析的源码基于&lt;a href=&#34;https://github.com/cyub/go-1.14.13/blob/master/src/sync/map.go&#34;&gt;go1.14.13&lt;/a&gt;版本。&lt;/p&gt;&lt;h2&gt;sync.Map的结构&lt;/h2&gt;&lt;p&gt;```gotype Map struct { mu Mutex // 排他锁，用于对dirty map操作时候加锁处理&lt;/p&gt;&lt;pre&gt;&lt;code&gt;read atomic.Value // read map// dirty map。新增key时候，只写入dirty map中，需要使用mudirty map[interface{}]*entry// 用来记录从read map中读取key时miss的次数misses int&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;}```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/02/28/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bsyncmap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/02/28/golang%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E7%B3%BB%E5%88%97%E4%B9%8Bsyncmap%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0/</guid> </item> <item> <title>Golang设计模式系列之工厂方法模式</title> <author>Tinker</author> <description>&lt;h2&gt;定义&lt;/h2&gt;&lt;p&gt;工厂方法模式(Factory Method Pattern)也称为工厂模式(Factory Pattern)。同简单工厂模式一样，工厂方法模式也是一种创建型设计模式。不同于简单工厂模式的都是通过同一个具体类（类的静态方法）或者函数来创建对象，工厂方法模式是通过一系列实现创建对象接口的具体子类来创建对象。即：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;工厂方法模式定义一个用于创建对象的接口，让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。&lt;/strong&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/08/01/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/08/01/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/</guid> </item> <item> <title>Golang设计模式系列之简单工厂模式</title> <author>Tinker</author> <description>&lt;h2&gt;定义&lt;/h2&gt;&lt;p&gt;简单工厂模式是一种创建型设计模式，一般又称为静态工厂方法（Static Factory Method）模式。这种模式通过一个静态方法或者函数来达到隐藏正在创建的实例的创建逻辑目的&lt;/p&gt;&lt;p&gt;客户端仅与工厂方法交互，并告知需要创建的实例类型。工厂方法与相应的具体产品进行交互，并返回正确的产品实例。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/06/22/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/06/22/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E4%B9%8B%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/</guid> </item> <item> <title>Golang设计模式系列开篇</title> <author>Tinker</author> <description>&lt;blockquote class=&#34;blockquote-center&#34;&gt;抽象是用来处理复杂性的主要工具。一个问题越复杂，就越需要抽象来解决&lt;/blockquote&gt;&lt;h2&gt;概念&lt;/h2&gt;&lt;p&gt;设计模式这个术语是由Erich Gamma等人在1990年代从建筑设计领域引入到计算机科学的。在《Domain-Driven Terms》一书中，设计模式被描述为：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;设计模式是命名、抽象和识别对可重用的面向对象设计有用的的通用设计结构。设计模式确定类和他们的实体、他们的角色和协作、还有他们的责任分配&lt;/p&gt;&lt;p&gt;每一个设计模式都聚焦于一个面向对象的设计难题或问题。它描述了在其它设计的约束下它能否使用，使用它后的后果和得失&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://cyub.cyub.vip/blog/2020/05/23/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/05/23/golang%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</guid> </item> <item> <title>Golang调度机制浅析</title> <author>Tinker</author> <description>&lt;blockquote&gt;&lt;p&gt;最近在部门中做了一次技术分享，现将分享内容总结成博文发布出来，内容有删改。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Golang以并发见长，支持成千上万个协程调度。Golang中协程称为Goroutine，它是Go runtime调度中的最小执行单元，Goroutine的创建、管理、调度运行的机制采用的GMP模型。本次分享介绍的就是Golang调度机制的GMP模型。&lt;/p&gt;&lt;h2&gt;并行 vs 并发&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202208/concurrency.jpg&#34;&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;并行(Parallelism)&lt;/strong&gt; 指的是一个CPU时间片内可以同时做多件事情。&lt;strong&gt;并行强调的是某一时间点内能够同时处理多件事情&lt;/strong&gt;，并行需要多核CPU提供支持。&lt;strong&gt;并行是并发的子集&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;并发(Concurrency)&lt;/strong&gt; 指的是是一种同时处理许多事情的能力，&lt;strong&gt;并行强调是某一时间段内能够同时处理多件事情&lt;/strong&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2022/08/20/golang%E8%B0%83%E5%BA%A6%E6%9C%BA%E5%88%B6%E6%B5%85%E6%9E%90/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2022/08/20/golang%E8%B0%83%E5%BA%A6%E6%9C%BA%E5%88%B6%E6%B5%85%E6%9E%90/</guid> </item> <item> <title>Go语言中如何在零内存分配情况下反转字符串？</title> <author>Tinker</author> <description>&lt;p&gt;一日午饭后散步中，同事问了一道Go相关的测试题目，是他之前面试中面试官问的一个题目，他到现在还没有找到答案。这道测试题就是本篇博文的标题：Go语言中如何在零内存分配情况下反转字符串？&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/11/27/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E5%A6%82%E4%BD%95%E5%9C%A8%E9%9B%B6%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E6%83%85%E5%86%B5%E4%B8%8B%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/11/27/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E5%A6%82%E4%BD%95%E5%9C%A8%E9%9B%B6%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E6%83%85%E5%86%B5%E4%B8%8B%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/</guid> </item> <item> <title>Go语言中调用time.Now()时有没有发生系统调用?</title> <author>Tinker</author> <description>&lt;p&gt;在探究“Go语言中调用time.Now()时有没有发生系统调用?”这个问题之前，我们先复习下什么是系统调用。&lt;/p&gt;&lt;h2&gt;什么是系统调用？&lt;/h2&gt;&lt;p&gt;系统调用(system call)指的是运行在用户空间的程序向操作系统内核请求具有更高权限的服务。究竟是哪些服务呢?这些服务指的是由操作系统内核进行管理的服务，比如进程管理，存储，内存，网络等。以打开文件为例子，用户程序需要调用&lt;code&gt;open&lt;/code&gt;和&lt;code&gt;read&lt;/code&gt;这两个系统调用，在c语言中要么使用libc库实现（底层也是系统调用），要么直接使用系统调用实现。&lt;/p&gt;&lt;p&gt;Linux系统中为什么一定要经过系统调用才能访问特资源呢，难道就不能在用户空间完成调用访问功能吗？之所以这么设计是考虑到系统隔离性，提高系统安全性和容错性，避免恶意攻击。操作系统把CPU访问资源的安全级别分为4个级别，这些级别称为特权级别（privilege level），也称为CPU环（CPU Rings）。在任一时刻，CPU都是在一个特定的特权级下运行的，从而决定了什么可以做，什么不可以做。这些级别可以形象的考虑成一个个圆环，里面是最高特权的Ring0，向外依次是Ring1，Ring2，最后是最低特权的Ring3。当发生系统调用时候，应用程序将会从应用空间进入内核空间，此时特权级别会由Ring3提升到Ring0，应用程序代码也会跳到相关系统调用代码处执行。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/09/19/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E8%B0%83%E7%94%A8timenow%E6%97%B6%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8F%91%E7%94%9F%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/09/19/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E8%B0%83%E7%94%A8timenow%E6%97%B6%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8F%91%E7%94%9F%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/</guid> </item> <item> <title>Go语言实现简易版netstat命令</title> <author>Tinker</author> <description>&lt;h2&gt;netstat工作原理&lt;/h2&gt;&lt;p&gt;netstat命令是linux系统中查看网络情况的一个命令。比如我们可以通过&lt;code&gt;netstat -ntlp | grep 8080&lt;/code&gt;查看监听8080端口的进程。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202012/netstat-example.jpg&#34;&gt;&lt;/p&gt;&lt;p&gt;netstat工作原理如下：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;通过读取/proc/net/tcp 、/proc/net/tcp6文件，获取socket本地地址，本地端口，远程地址，远程端口，状态，inode等信息&lt;/li&gt;&lt;li&gt;接着扫描所有/proc/[pid]/fd目录下的的socket文件描述符，建立inode到进程pid映射&lt;/li&gt;&lt;li&gt;根据pid读取/proc/[pid]/cmdline文件，获取进程命令和启动参数&lt;/li&gt;&lt;li&gt;根据2,3步骤，即可以获得1中对应socket的相关进程信息&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2020/11/22/go%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E7%AE%80%E6%98%93%E7%89%88netstat%E5%91%BD%E4%BB%A4/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/11/22/go%E8%AF%AD%E8%A8%80%E5%AE%9E%E7%8E%B0%E7%AE%80%E6%98%93%E7%89%88netstat%E5%91%BD%E4%BB%A4/</guid> </item> <item> <title>Go语言常见使用错误总结</title> <author>Tinker</author> <description>&lt;p&gt;在学习和使用 Go 语言的过程中，我们不可避免地会遇到一些陷阱和常见的使用错误。这些建议性错误或潜在的问题，有时可能会在代码中悄悄滋生，直到某一天给你带来难以察觉的 bug。为了帮助大家更好地理解和规避这些陷阱，我整理了一些 Go 语言中常见的使用错误，这些建议或许能成为你编写更健壮、可维护代码的助力。&lt;/p&gt;&lt;p&gt;本篇博客旨在提醒读者注意一些在 Go 语言中易犯的错误，不仅包括语法和语义级别的问题，还包括一些最佳实践和规范。通过深入理解这些错误，我们可以更好地规避潜在的风险，写出更高效、更稳定的 Go 代码。&lt;/p&gt;&lt;p&gt;在我们开始探索这些错误之前，让我们一同回顾一下“在错误中学习，不断成长”的理念。编程世界中，错误不是失败的代名词，而是成长的机会。当我们深入了解常见错误时，我们更能够逐步提升自己的编程技能，写出更加健壮的代码。&lt;/p&gt;&lt;p&gt;愿这篇博客能够帮助你更好地使用 Go 语言，避免一些不必要的困扰。让我们开始我们的探索之旅，一同领略 Go 语言的优雅之美，并在编程的路上越走越远。&lt;/p&gt;&lt;p&gt;Happy coding! 🚀&lt;/p&gt;&lt;h2&gt;切片相关&lt;/h2&gt;&lt;h3&gt;对切片并发地进行append操作&lt;/h3&gt;&lt;p&gt;append操作是并发不安全的，在使用过程中，需要特别注意。下面代码中是有问题的：&lt;/p&gt;&lt;p&gt;```gofunc append_to_slice(s []int, i int) { append(s, i)}&lt;/p&gt;&lt;p&gt;var slices = []int{1,2, 3}go append_to_slice(slices, 4)go append_to_slice(slices, 5)```&lt;/p&gt;&lt;p&gt;解决办法之一是我们可以使用sync.Mutex进行加锁处理。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2024/03/05/go%E8%AF%AD%E8%A8%80%E5%B8%B8%E8%A7%81%E4%BD%BF%E7%94%A8%E9%94%99%E8%AF%AF%E6%80%BB%E7%BB%93/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/03/05/go%E8%AF%AD%E8%A8%80%E5%B8%B8%E8%A7%81%E4%BD%BF%E7%94%A8%E9%94%99%E8%AF%AF%E6%80%BB%E7%BB%93/</guid> </item> <item> <title>HTTP断点续传</title> <author>Tinker</author> <description>&lt;h2&gt;断点续传简介&lt;/h2&gt;&lt;p&gt;断点续传是HTTP/1.1协议支持的特性。实现断点续传的功能，需要客户端记录下当前的下载进度，并在需要续传的时候通知服务端本次需要下载的内容片段。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/06/12/http%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/06/12/http%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/</guid> </item> <item> <title>How-To-Clear-PHP’s-Opcache</title> <author>Tinker</author> <description>&lt;p&gt;原文链接：https://ma.ttias.be/how-to-clear-php-opcache/&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;PHP can be configured to store precompiled bytecode in shared memory, called &lt;strong&gt;Opcache&lt;/strong&gt;. It prevents the loading and parsing of PHP scripts on every request. This guide will tell you how to flush that bytecode Opcache, should you need it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You may want to &lt;a href=&#34;https://ma.ttias.be/clear-apc-cache-php/&#34;&gt;flush the APC (PHP &amp;lt; 5.5)&lt;/a&gt; or Opcache (PHP &amp;gt;= 5.5) in PHP when it has cached code you want to refresh. As of PHP 5.5, the APC cache has been replaced by Opcache and APC only exists as a user key/value cache, no longer a bytecode cache.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/04/05/how-to-clear-phps-opcache/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/04/05/how-to-clear-phps-opcache/</guid> </item> <item> <title>Improve the performance of your webapp: configure Nginx to cache</title> <author>Tinker</author> <description>&lt;p&gt;&lt;img alt=&#34;Nginx&#34; src=&#34;https://www.theodo.fr/uploads/blog//2016/06/800px-Nginx_logo.svg_.png&#34;&gt;&lt;/p&gt;&lt;p&gt;原文链接：&lt;a href=&#34;https://www.theodo.fr/blog/2016/06/improve-the-performance-of-your-webapp-configure-nginx-to-cache/&#34;&gt;https://www.theodo.fr/blog/2016/06/improve-the-performance-of-your-webapp-configure-nginx-to-cache/&lt;/a&gt;Sometimes, &lt;a href=&#34;https://www.theodo.fr/blog/2015/12/how-to-quickly-improve-users-loading-experience/&#34;&gt;improving the user’s loading experience&lt;/a&gt; is not enough, and you need real changes to make your application load faster.So you try CSS and JS &lt;a href=&#34;https://en.wikipedia.org/wiki/Minification_(programming)&#34;&gt;minification&lt;/a&gt; or &lt;a href=&#34;https://en.wikipedia.org/wiki/Portable_Network_Graphics#Optimizing_tools&#34;&gt;image compression&lt;/a&gt; but your app is only a bit faster to load. These tricks reduce the size of resources that need to be downloaded, but what if your users didn’t have to download anything at all? That’s what &lt;a href=&#34;https://en.wikipedia.org/wiki/Cache_(computing)&#34;&gt;caching&lt;/a&gt; is for!&lt;/p&gt;&lt;p&gt;In this article, I will explain how you can configure Nginx to enable the browser cache, thus avoiding painfully slow downloads. If you are not familiar with Nginx, I recommend reading &lt;a href=&#34;https://www.theodo.fr/blog/2014/08/learn-the-basics-of-nginx/&#34;&gt;this article&lt;/a&gt;.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/06/16/improve-the-performance-of-your-webapp-configure-nginx-to-cache/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/06/16/improve-the-performance-of-your-webapp-configure-nginx-to-cache/</guid> </item> <item> <title>JS实现继承的几种方式</title> <author>Tinker</author> <description>&lt;p&gt;JS无法像其他高级语言那样通过extend直接实现继承。只通过一定方式来实现继承机制。常见的几种实现继承的方式有：1. 对象冒充2. call/apply方法3. 原型链（prototype chain)4. 混合方式（call/apply+prototype chain)&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/02/14/js%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/02/14/js%E5%AE%9E%E7%8E%B0%E7%BB%A7%E6%89%BF%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/</guid> </item> <item> <title>Jupyter Notebook部署</title> <author>Tinker</author> <description>&lt;p&gt;&lt;a href=&#34;https://jupyter.org/&#34;&gt;Jupyter Notebook&lt;/a&gt; 是科学计算必备工具之一，它是一个开源的web应用程序，允许你创建和共享实时代码，可以用来进行数据清理和转换、统计建模、数据可视化、机器学习等等工作。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;http://static.cyub.vip/images/201812/jupyterpreview.png&#34;&gt;&lt;/p&gt;&lt;p&gt;下面是使用supervisour和nginx来部署公开jupyter notebook服务过程。&lt;/p&gt;&lt;h2&gt;安装jupyter notebook&lt;/h2&gt;&lt;p&gt;推荐python3环境下安装jupyter。我系统是&lt;code&gt;Ubuntu 18.04&lt;/code&gt;里面内置了python3，所以直接安装jupyter，如果系统python版本是python2.7，可以使用&lt;code&gt;virtualenvwrapper&lt;/code&gt;进行多版本python管理。&lt;/p&gt;&lt;p&gt;下面使用pip来安装jupyter notebook&lt;/p&gt;&lt;p&gt;&lt;code&gt;jssudo apt-get install python3-pip // 安装pip3sudo pip3 install jupyter // 安装jupyter&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/12/31/jupyter-notebook%E9%83%A8%E7%BD%B2/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/12/31/jupyter-notebook%E9%83%A8%E7%BD%B2/</guid> </item> <item> <title>Linux常用命令大全</title> <author>Tinker</author> <description>&lt;h2&gt;1. 文件与目录操作&lt;/h2&gt;&lt;h3&gt;touch - 创建文件&lt;/h3&gt;&lt;p&gt;若文件不存在则创建文件，若存在则修改文件的时间(存取时间和更改时间)&lt;code&gt;touch a.txt // 创建a.txttouch -r a.txt b.txt // 设置a.txt,b.txt时间一致&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/11/03/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/11/03/linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%A4%A7%E5%85%A8/</guid> </item> <item> <title>Nasm使用教程：基于X86编程教学</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://cs.lmu.edu/~ray/notes/nasmtutorial/&#34;&gt;NASM Tutorial&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;第一个程序&lt;/h2&gt;&lt;p&gt;在了解 nasm 之前，让我们确保你可以输入和运行程序。确保 nasm 和 gcc 都已安装。根据你的机器平台，将以下程序之一保存为 hello.asm。然后根据给定的说明运行程序。&lt;/p&gt;&lt;p&gt;如果你使用的是基于 Linux 的操作系统：&lt;/p&gt;&lt;p&gt;```as; ----------------------------------------------------------------------------------------; Writes &#34;Hello, World&#34; to the console using only system calls. Runs on 64-bit Linux only.; To assemble and run:;; nasm -felf64 hello.asm &amp;amp;&amp;amp; ld hello.o &amp;amp;&amp;amp; ./a.out; ----------------------------------------------------------------------------------------&lt;/p&gt;&lt;pre&gt;&lt;code&gt; global _start section .text&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;_start: mov rax, 1 ; system call for write mov rdi, 1 ; file handle 1 is stdout mov rsi, message ; address of string to output mov rdx, 13 ; number of bytes syscall ; invoke operating system to do the write mov rax, 60 ; system call for exit xor rdi, rdi ; exit code 0 syscall ; invoke operating system to exit&lt;/p&gt;&lt;pre&gt;&lt;code&gt; section .data&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;message: db &#34;Hello, World&#34;, 10 ; note the newline at the end```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2022/07/01/nasm%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E5%9F%BA%E4%BA%8Ex86%E7%BC%96%E7%A8%8B%E6%95%99%E5%AD%A6/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2022/07/01/nasm%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B%E5%9F%BA%E4%BA%8Ex86%E7%BC%96%E7%A8%8B%E6%95%99%E5%AD%A6/</guid> </item> <item> <title>PHP7各个版本新增特性</title> <author>Tinker</author> <description>&lt;p&gt;PHP从5.6 跳过6直接来到7，带来新的语言特性，更带来性能很大飞越。根据w3techs统计截止截止2019年5月18月有79%网站使用PHP做为服务端开发语言，这些网站使用的PHP版本统计如下：&lt;/p&gt;&lt;iframe src=&#34;https://export.cyub.vip/i?all=%7B%22chart%22%3A%7B%22plotBackgroundColor%22%3Anull%2C%22plotBorderWidth%22%3Anull%2C%22plotShadow%22%3Afalse%2C%22type%22%3A%22pie%22%7D%2C%22title%22%3A%7B%22text%22%3A%22PHP%E7%89%88%E6%9C%AC%E4%BD%BF%E7%94%A8%E5%88%86%E5%B8%83%22%7D%2C%22tooltip%22%3A%7B%22pointFormat%22%3A%22%7Bseries.name%7D%3A%20%3Cb%3E%7Bpoint.percentage%3A.1f%7D%25%3C%2Fb%3E%22%7D%2C%22plotOptions%22%3A%7B%22pie%22%3A%7B%22allowPointSelect%22%3Atrue%2C%22cursor%22%3A%22pointer%22%2C%22dataLabels%22%3A%7B%22enabled%22%3Atrue%2C%22format%22%3A%22%3Cb%3E%7Bpoint.name%7D%3C%2Fb%3E%3A%20%7Bpoint.percentage%3A.1f%7D%20%25%22%7D%7D%7D%2C%22series%22%3A%5B%7B%22name%22%3A%22Version%22%2C%22colorByPoint%22%3Atrue%2C%22data%22%3A%5B%7B%22name%22%3A%22PHP%205.x%22%2C%22y%22%3A66.9%7D%2C%7B%22name%22%3A%22PHP%207.x%22%2C%22y%22%3A32.5%2C%22color%22%3A%22%23e4d354%22%7D%2C%7B%22name%22%3A%22PHP%204.x%22%2C%22y%22%3A0.6%7D%2C%7B%22name%22%3A%22PHP%203.x%22%2C%22y%22%3A0.1%7D%5D%7D%5D%7D&amp;width=490&amp;height=360&#34; width=&#34;490&#34; height=&#34;370&#34; overflow=&#34;hide&#34; frameborder=&#34;0&#34;&gt;{% iframe https://export.cyub.vip/i?all=%7B%22chart%22%3A%7B%22plotBackgroundColor%22%3Anull%2C%22plotBorderWidth%22%3Anull%2C%22plotShadow%22%3Afalse%2C%22type%22%3A%22pie%22%7D%2C%22title%22%3A%7B%22text%22%3A%22PHP%E7%89%88%E6%9C%AC%E4%BD%BF%E7%94%A8%E5%88%86%E5%B8%83%22%7D%2C%22tooltip%22%3A%7B%22pointFormat%22%3A%22%7Bseries.name%7D%3A%20%3Cb%3E%7Bpoint.percentage%3A.1f%7D%25%3C%2Fb%3E%22%7D%2C%22plotOptions%22%3A%7B%22pie%22%3A%7B%22allowPointSelect%22%3Atrue%2C%22cursor%22%3A%22pointer%22%2C%22dataLabels%22%3A%7B%22enabled%22%3Atrue%2C%22format%22%3A%22%3Cb%3E%7Bpoint.name%7D%3C%2Fb%3E%3A%20%7Bpoint.percentage%3A.1f%7D%20%25%22%7D%7D%7D%2C%22series%22%3A%5B%7B%22name%22%3A%22Version%22%2C%22colorByPoint%22%3Atrue%2C%22data%22%3A%5B%7B%22name%22%3A%22Version%205%22%2C%22y%22%3A66.9%7D%2C%7B%22name%22%3A%22Version%207%22%2C%22y%22%3A32.5%2C%22color%22%3A%22%23e4d354%22%7D%2C%7B%22name%22%3A%22Version%204%22%2C%22y%22%3A0.6%7D%2C%7B%22name%22%3A%22Version%203%22%2C%22y%22%3A0.1%7D%5D%7D%5D%7D&amp;width=490&amp;height=360 %}</description><link>https://cyub.cyub.vip/blog/2019/05/19/php7%E5%90%84%E4%B8%AA%E7%89%88%E6%9C%AC%E6%96%B0%E5%A2%9E%E7%89%B9%E6%80%A7/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/05/19/php7%E5%90%84%E4%B8%AA%E7%89%88%E6%9C%AC%E6%96%B0%E5%A2%9E%E7%89%B9%E6%80%A7/</guid> </item> <item> <title>PHP反射API初探</title> <author>Tinker</author> <description>&lt;h2&gt;1. 什么是反射&lt;/h2&gt;&lt;p&gt;反射在百度百科里面的解释是“反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象”。&lt;/p&gt;&lt;p&gt;PHP提供了对类、函数、方法以及拓展进行反射的能力。通过反射我们可以在动态运行程序时候，获取类的名字，参数，方法、注释等信息以及动态调用对象方法，通过这些可以实现自动生成文档、自动注入依赖，插件管理。&lt;/p&gt;&lt;p&gt;反射的优点：1. 反射提高了程序的灵活性和扩展性。2. 降低耦合性，提高自适应能力。3. 它允许程序创建和控制任何类的对象，无需提前硬编码目标类。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/08/21/php%E5%8F%8D%E5%B0%84api%E5%88%9D%E6%8E%A2/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/08/21/php%E5%8F%8D%E5%B0%84api%E5%88%9D%E6%8E%A2/</guid> </item> <item> <title>PHP持续集成工具</title> <author>Tinker</author> <description>&lt;p&gt;&lt;a href=&#34;https://github.com/sensiolabs-de/deptrac&#34;&gt;deptrac&lt;/a&gt;在软件层之间执行依赖规则&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://phpunit.de/&#34;&gt;PHPUnit&lt;/a&gt;PHP单元测试工具&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/exakat/exakat&#34;&gt;exakat&lt;/a&gt;PHP自动化代码审查引擎&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/phpro/grumphp&#34;&gt;GrumPHP&lt;/a&gt;提供git hooks来检测每次提交的代码&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/etsy/phan&#34;&gt;phan&lt;/a&gt;来自etsy的现代化静态分析器&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/08/27/php%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%B7%A5%E5%85%B7/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/08/27/php%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%B7%A5%E5%85%B7/</guid> </item> <item> <title>PHP错误与异常处理详解（一）</title> <author>Tinker</author> <description>&lt;p&gt;在PHP开发过程中，错误和异常的处理是必不可少的，但由于两者比较相似，容易让人混淆。错误往往是自身问题，比如语法错误，使用未定的变量等，而异常是在程序运行过程中存在逻辑问题时候主动抛出的。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/05/17/php%E9%94%99%E8%AF%AF%E4%B8%8E%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E8%AF%A6%E8%A7%A3%E4%B8%80/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/05/17/php%E9%94%99%E8%AF%AF%E4%B8%8E%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E8%AF%A6%E8%A7%A3%E4%B8%80/</guid> </item> <item> <title>PHP项目中安全风险与防范</title> <author>Tinker</author> <description>&lt;p&gt;在PHP开发中，由于编码bug或者配置不正确，如果被恶意利用往往会导致严重安全问题。根据&lt;a href=&#34;https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project&#34;&gt;OWASP Top 10 2017&lt;/a&gt;里面的10大安全风险，现归纳总结了PHP项目中几种常见安全风险，攻击场景和防范措施。&lt;/p&gt;&lt;h2&gt;1. 注入-Injection&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;一般指不受信任的数据被伪装成命令或者查询语句的一部分，发送至解析器后发生了执行的过程。&lt;/li&gt;&lt;li&gt;攻击者的恶意数据能够欺骗解释器在未被授权的情况下执行非预期代码或者访问数据。&lt;/li&gt;&lt;li&gt;常见注入类型有SQL、NoSQL、OS命令、XML等注入&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;案例场景&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;例1.&lt;/strong&gt; 用户输入的数据直接用于SQL查询语句中&lt;code&gt;sql$sql = &#39;select * from news where id=&#34;&#39; . $_GET[&#39;id&#39;] . &#39;&#34;&#39;&lt;/code&gt;攻击方式：&lt;code&gt;jshttp://example.com/news?id=&#34; or 1=&#39;1&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/06/28/php%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9%E4%B8%8E%E9%98%B2%E8%8C%83/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/06/28/php%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%AE%89%E5%85%A8%E9%A3%8E%E9%99%A9%E4%B8%8E%E9%98%B2%E8%8C%83/</guid> </item> <item> <title>Pandas Cheat Sheet</title> <description>&lt;p&gt;Pandas作为python的库，包含易于使用的数据结构，是一个强大数据分析的工具&lt;/p&gt;&lt;p&gt;Pandas的主要数据结构有Series和DataFrame。Series是一种类似于一维数组的对象，它由一组数据以及一组与之相关的一组标签组成。DataFrame是一个表格型数据结构，它含有一组有序的列，每列可以是不同的值类型。&lt;/p&gt;&lt;p&gt;&lt;code&gt;pythonimport pandas as pdimport numpy as npfrom pandas import Series, DataFrame&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/10/09/pandas-cheat-sheet/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/10/09/pandas-cheat-sheet/</guid> </item> <item> <title>Pandas完全指南</title> <author>Tinker</author> <description>&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;Pandas 是一个Python语言实现的，开源，易于使用的数据架构以及数据分析工具。在Pandas中主要有两种数据类型，可以简单的理解为：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Series：一维数组(列表)&lt;/li&gt;&lt;li&gt;DateFrame：二维数组（矩阵）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在线实验：&lt;a href=&#34;https://nbviewer.jupyter.org/github/cyub/code-examples/blob/master/jupyter-notes/Pandas%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97.ipynb#&#34;&gt;Pandas完全指南.ipynb&lt;/a&gt;&lt;/p&gt;&lt;p&gt;学习资料：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://www.pypandas.cn/docs/&#34;&gt;Pandas中文文档&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version&#34;&gt;利用Python进行数据分析·第2版&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;导入pandas&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pythonimport pandas as pdimport numpy as npfrom IPython.display import Image&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/01/22/pandas%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/01/22/pandas%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Protocol buffers语法</title> <author>Tinker</author> <description>&lt;h2&gt;简介&lt;/h2&gt;&lt;p&gt;Protocol Buffers简称Protobuf，是google公司推出的一种数据描述语言。Protocol buffers具有平台无关、语言无关、二进制格式编码、编码后体积小，序列化和反序列化快、类型安全、向后兼容等特点。&lt;/p&gt;&lt;p&gt;Protocol buffers有专门的语法结构来定义数据结构。消息和RPC服务接口是Protocol buffers中两大基本组成。消息类似一个Json object，RPC服务接口定义了服务所具有的接口和所依赖的消息类型。&lt;/p&gt;&lt;p&gt;Protocol buffers定义的数据结构应该保存在.proto后缀名的文件中。目前最新版本的语法协议是proto3。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/12/03/protocol-buffers%E8%AF%AD%E6%B3%95/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/12/03/protocol-buffers%E8%AF%AD%E6%B3%95/</guid> </item> <item> <title>Raft：一种分布式一致性算法</title> <author>Tinker</author> <description>&lt;h2&gt;什么是分布式一致性&lt;/h2&gt;&lt;p&gt;分布式一致性（Distributed Consensus）简单来说就是在多个节点组成系统中各个节点的数据保持一致，并且可以承受某些节点数据不一致或操作失败造成的影响。分布式一致性是分布式系统的基石。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/07/26/raft%E4%B8%80%E7%A7%8D%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/07/26/raft%E4%B8%80%E7%A7%8D%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95/</guid> </item> <item> <title>SQL注入攻击示例与防范措施</title> <author>Tinker</author> <description>&lt;p&gt;注入攻击是OWASP总结的十大web安全风险中排在第一位的攻击形式， 而SQL注入(SQL Injection)攻击是注入攻击中最常见的一种形式。SQL注入漏洞可以从数据库读取敏感数据，修改数据库数据（插入/更新/删除），对数据库执行管理操作（例如关闭DBMS），恢复DBMS文件上存在的给定文件的内容系统，并在某些情况下向操作系统发出命令。&lt;/p&gt;&lt;p&gt;作为开发要防范这些攻击，就需要了解这些攻击方式。现列出Mysql数据库下几种常见SQL注入攻击示例，以作参考。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/03/28/sql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB%E7%A4%BA%E4%BE%8B%E4%B8%8E%E9%98%B2%E8%8C%83%E6%8E%AA%E6%96%BD/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/03/28/sql%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB%E7%A4%BA%E4%BE%8B%E4%B8%8E%E9%98%B2%E8%8C%83%E6%8E%AA%E6%96%BD/</guid> </item> <item> <title>SSH使用代理连接</title> <author>Tinker</author> <description>&lt;p&gt;使用ssh连接服务器，有时候我们需要使用代理来连接目标服务器。这时候有两个方法可以达到这个目的：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;使用ssh的ProxyCommand选项&lt;/li&gt;&lt;li&gt;使用xshell代理&lt;/li&gt;&lt;/ol&gt;&lt;h1&gt;1. 配置ProxyCommand选项&lt;/h1&gt;&lt;p&gt;ssh可以通过使用&lt;code&gt;ProxyCommand&lt;/code&gt;设置代理&lt;code&gt;jsssh root@192.168.33.10 -o &#34;ProxyCommand=nc -X connect -x 127.0.0.1:10080 %h %p&#34;&lt;/code&gt;其中&lt;code&gt;192.168.33.10&lt;/code&gt;是目的服务器ip，&lt;code&gt;%h&lt;/code&gt;表示目标地址即&lt;code&gt;192.168.33.10&lt;/code&gt;，&lt;code&gt;%p&lt;/code&gt;表示目标地址端口,默认&lt;code&gt;22&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/08/28/ssh%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86%E8%BF%9E%E6%8E%A5/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/08/28/ssh%E4%BD%BF%E7%94%A8%E4%BB%A3%E7%90%86%E8%BF%9E%E6%8E%A5/</guid> </item> <item> <title>SSL和SSL证书初学者指南</title> <author>Tinker</author> <description>&lt;p&gt;&lt;strong&gt;原文：&lt;/strong&gt; &lt;a href=&#34;https://www.steves-internet-guide.com/ssl-certificaates-explained/&#34;&gt;SSL and SSL Certificates Explained For Beginners&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安全套接字层 (SSL，全称Secure Sockets Layer)&lt;/strong&gt; 和&lt;strong&gt;传输层安全 (TLS，全称Transport Layer security)&lt;/strong&gt; 是通过计算机网络或链接提供安全通信的协议。它们通常用于网页浏览和电子邮件。在本教程中，我们将了解学习到：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;TLS 和 SSL&lt;/li&gt;&lt;li&gt;公钥和私钥&lt;/li&gt;&lt;li&gt;为什么我们需要证书以及它们的作用&lt;/li&gt;&lt;li&gt;如何获取数字证书并了解不同的常见证书类型&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;什么是 TLS?&lt;/h2&gt;&lt;p&gt;TLS 基于 SSL，并作为替代方案而开发以应对 SSLv3 中的已知漏洞。SSL 是常用术语，我们说的 SSL 通常指的就是 TLS。&lt;/p&gt;&lt;h2&gt;SSL/TLS 提供安全保障&lt;/h2&gt;&lt;p&gt;SSL/TLS 提供数据加密、数据完整性和身份验证功能。这意味着当使用 SSL/TLS 时，你可以确保：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;没有人读过你的消息&lt;/li&gt;&lt;li&gt;没有人篡改过你的消息&lt;/li&gt;&lt;li&gt;你正在与预期的人（服务器）通信&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在两方之间发送消息时，你需要解决两个问题。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;你怎么知道没有人读过这条消息？&lt;/li&gt;&lt;li&gt;你怎么知道没有人篡改过该消息？&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这些问题的解决办法是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;对其进行加密(Encrypt it)&lt;/strong&gt; ： 这会使内容无法读取，因此对于查看该消息的任何人来说，它只是乱码。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;签名(Sign it)&lt;/strong&gt; ： 这可以让收件人确信是你发送的邮件，并且邮件未被篡改。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这两个过程都需要使用密钥。这些密钥只是数字（常见的是 128 位），然后使用特定方法（通常称为算法）与消息组合，例如RSA，对消息进行加密或签名。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2024/01/04/ssl%E5%92%8Cssl%E8%AF%81%E4%B9%A6%E5%88%9D%E5%AD%A6%E8%80%85%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/01/04/ssl%E5%92%8Cssl%E8%AF%81%E4%B9%A6%E5%88%9D%E5%AD%A6%E8%80%85%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Spark简介PPT</title> <author>Tinker</author> <description>&lt;p&gt;9月份时候由于工作中涉及到大数据统计分析内容，研究了spark使用，10月份时候把研究内容在小组内简单做了一次分享。现在把分享的PPT贴出，分享过程中也涉及到真实项目使用spark演示，这部分为未贴出。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;http://static.cyub.vip/images/201812/spark/%E5%B9%BB%E7%81%AF%E7%89%8701.png&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/12/16/spark%E7%AE%80%E4%BB%8Bppt/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/12/16/spark%E7%AE%80%E4%BB%8Bppt/</guid> </item> <item> <title>Supervisor快速使用指南</title> <author>Tinker</author> <description>&lt;h2&gt;简介&lt;/h2&gt;&lt;p&gt;Supervisor是用于监控和管理类UNIX操作下进程的C/S系统。Supervisor不是作为进程id为1的&lt;code&gt;init&lt;/code&gt;的替代，它只是用来控制应用程序的进程，它会跟其他进程开机启动时候一样，通过pid为1的进程启动。为了高可用，它本身也需要监控。&lt;/p&gt;&lt;p&gt;Supervisor的构成有4部分：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;supervisord&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;supervisord是Supervisor的守护进程，是C/S中S端，它响应客户端的命令，监控，重启奔溃异常退出的子进程，以及记录子进程的&lt;code&gt;stdout&lt;/code&gt;和&lt;code&gt;stderr&lt;/code&gt;等。supervisord默认配置文件是&lt;code&gt;/etc/supervisord.conf&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;supervisorctl&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;supervisorctl是Supervisor的命令行客户端，supervisorctl工作原理是发送命令给supervisord，来对其他进程的启动，关闭等操作&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web Server&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Supervisor也支持web形式客户端&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;XML-RPC Interface&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Supervisor提供了XML-RPC接口，通过此接口，我们可以询问和控制supervisor&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2019/06/01/supervisor%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/06/01/supervisor%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>Tmux——终端复用神器</title> <author>Tinker</author> <description>&lt;p&gt;Tmux是终端复用器（terminal multiplexer）的缩写。通过启动Tmux会话，然后在该会话中打开多个窗口，并且分屏形成矩形窗格，执行不同操作，能极大提高终端操作效率。tmux支持的特性有：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;支持创建任意数量的窗口(window)&lt;/li&gt;&lt;li&gt;支持同一个窗口创建任意数量的窗格(panel)&lt;/li&gt;&lt;li&gt;支持垂直或水平分割窗口，并可以任意调整窗格大小&lt;/li&gt;&lt;li&gt;支持会话分离和重连&lt;/li&gt;&lt;li&gt;允许用户之间进行会话分享&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2019/07/22/tmux%E7%BB%88%E7%AB%AF%E5%A4%8D%E7%94%A8%E7%A5%9E%E5%99%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/07/22/tmux%E7%BB%88%E7%AB%AF%E5%A4%8D%E7%94%A8%E7%A5%9E%E5%99%A8/</guid> </item> <item> <title>Using PySpark to perform Transformations and Actions on RDD</title> <author>Tinker</author> <description>&lt;p&gt;&lt;img alt=&#34;pyspark&#34; src=&#34;https://cdn-images-1.medium.com/max/851/1*nPcdyVwgcuEZiEZiRqApug.jpeg&#34;&gt;&lt;/p&gt;&lt;p&gt;原文地址：&lt;a href=&#34;https://www.analyticsvidhya.com/blog/2016/10/using-pyspark-to-perform-transformations-and-actions-on-rdd/&#34;&gt;Using PySpark to perform Transformations and Actions on RDD&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Introduction&lt;/h2&gt;&lt;p&gt;In my previous article, I introduced you to the basics of Apache Spark, different data representations (RDD / DataFrame / Dataset) and basics of operations (Transformation and Action). We even solved a machine learning problem from one of our past hackathons. In this article, I will continue from the place I left in my previous article. I will focus on manipulating RDD in PySpark by applying operations (Transformation and Actions).&lt;/p&gt;&lt;p&gt;As you would remember, a RDD (Resilient Distributed Database) is a collection of elements, that can be divided across multiple nodes in a cluster to run parallel processing. It is also a fault tolerant collection of elements, which means it can automatically recover from failures. RDD is immutable, i.e. once created, we can not change a RDD. So, then how do I apply operations on a RDD? Well, we apply an operation and store results in another RDD&lt;/p&gt;&lt;p&gt;For this article, one must have some understanding about Apache Spark and hands on experience in python programming.&lt;/p&gt;&lt;h2&gt;Table of Contents&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Recap&lt;/li&gt;&lt;li&gt;What is Transformation and Action?&lt;ul&gt;&lt;li&gt;Transformation and Action&lt;/li&gt;&lt;li&gt;Major Categories&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Applying Transformation and Action&lt;ul&gt;&lt;li&gt;General&lt;/li&gt;&lt;li&gt;Mathematical and Statistical&lt;/li&gt;&lt;li&gt;Set Theory and Relational&lt;/li&gt;&lt;li&gt;Data-structure and IO&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2018/10/10/using-pyspark-to-perform-transformations-and-actions-on-rdd/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/10/10/using-pyspark-to-perform-transformations-and-actions-on-rdd/</guid> </item> <item> <title>Wireshark抓包分析的几个小技巧</title> <author>Tinker</author> <description>&lt;p&gt;&lt;a href=&#34;https://www.wireshark.org/&#34;&gt;Wireshark&lt;/a&gt;是一款强大的抓包分析工具。它支持抓取分析TCP数据段、UDP数据包，应用层协议比如Http、Http2、Https(但不支持Https解密)、gRPC等。这里面列几个我使用过程中的用到的小技巧。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/12/06/wireshark%E6%8A%93%E5%8C%85%E5%88%86%E6%9E%90%E7%9A%84%E5%87%A0%E4%B8%AA%E5%B0%8F%E6%8A%80%E5%B7%A7/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/12/06/wireshark%E6%8A%93%E5%8C%85%E5%88%86%E6%9E%90%E7%9A%84%E5%87%A0%E4%B8%AA%E5%B0%8F%E6%8A%80%E5%B7%A7/</guid> </item> <item> <title>k8s环境下部署grpc的几种方案</title> <author>Tinker</author> <description>&lt;p&gt;笔者前段时间负责所在广告部门的ssp系统核心的几个grpc服务由虚拟机部署迁移到k8s环境下的技术方案设计与实施。本篇博文就专门介绍下k8s环境的部署grpc几个方案。这里面不涉及具体实施细节。我们k8s环境是采用华为云的k8s集群服务，我们ssp系统都是go语言开发的，这里面的grpc专指grpc-go。&lt;/p&gt;&lt;p&gt;容器是微服务的基石，可以做到每个服务快速autoscale，但随之带来的是服务的消亡是任意不定的，服务如何能够被调用方找到的难题。为了解决这个问题，就需要系统支持服务的注册和服务的发现。对于grpc来说，就是服务提供者grpc server会部署到多个k8s的Pod上，Pod的创建和消亡是任意时刻，不可预测，那就需要有一套机制能够发现grpc server所有Pod的端点信息，保证调用方(grpc client)能够及时准确获取服务提供方信息。所以grpc部署在k8s的方案也必要解决服务的注册和服务的发现。&lt;/p&gt;&lt;p&gt;此外调用方(grpc client)会维持grpc长连接，以及grpc底层使用HTTP/2协议，负载均衡不同与http和tcp，这一点在设计方案时候，也需要特别关注。&lt;/p&gt;&lt;h2&gt;k8s service直连&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/service/&#34;&gt;K8s service&lt;/a&gt;是一个命名负载均衡器，它可以将流量代理到一个或多个Pod（这里面的service指的是&lt;code&gt;ClusterIP&lt;/code&gt;类型的service)。grpc-go可以通过拨号直连到service，让service进行服务发现和负载均衡处理。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202111/passthrough-service.png&#34;&gt;&lt;/p&gt;&lt;p&gt;k8s service直连方案部署和开发简单，Pod扩容和缩容都可以及时感知。但是由于service负载均衡工作在4层，无法识别7层的HTTP/2协议，会导致负载均衡不均匀的问题。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/11/09/k8s%E7%8E%AF%E5%A2%83%E4%B8%8B%E9%83%A8%E7%BD%B2grpc%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%A1%88/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/11/09/k8s%E7%8E%AF%E5%A2%83%E4%B8%8B%E9%83%A8%E7%BD%B2grpc%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%A1%88/</guid> </item> <item> <title>什么是双因素身份认证(2FA)?</title> <author>Tinker</author> <description>&lt;p&gt;英文原文:&lt;a href=&#34;http://searchsecurity.techtarget.com/definition/two-factor-authentication&#34;&gt;two-factor authentication (2FA)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Two-factor authentication (2FA), often referred to as two-step verification, is a security process in which the user provides two authentication factors to verify they are who they say they are. 2FA can be contrasted with single-factor authentication (SFA), a security process in which the user provides only one factor -- typically a password.&lt;/p&gt;&lt;p&gt;双因素身份认证(2FA)，经常被认为是两步骤认证(two-step verification)。它是一个安全处理措施，用户需要提供2个认证因素来证明他们的身份。2FA可以和单因素认证（single-factor authentication)进行一个对比，单因素认证只需要提供一个认证因素，典例的是密码认证&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/09/16/%E4%BB%80%E4%B9%88%E6%98%AF%E5%8F%8C%E5%9B%A0%E7%B4%A0%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%812fa/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/09/16/%E4%BB%80%E4%B9%88%E6%98%AF%E5%8F%8C%E5%9B%A0%E7%B4%A0%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%812fa/</guid> </item> <item> <title>y % x = y &amp; (x - 1)的数学证明</title> <author>Tinker</author> <description>&lt;p&gt;在基于哈希表实现的Map中一个常用技巧就是将哈希桶的数量设置为2的n次方，也就是$2^n$，此后通过取余操作定位key所在桶的位置可以转换成与运算。之所以将取余运算改成与运算，一方面这两者计算的结果是一样的，另外一方面是因为与运算具有更好的性能，因为与运算指令周期是小于取余运算的。Java中的 &lt;a href=&#34;https://github.com/openjdk/jdk/blob/jdk-21+10/src/java.base/share/classes/java/util/HashMap.java#L576&#34;&gt;HashMap&lt;/a&gt; 和Go中 &lt;a href=&#34;https://github.com/golang/go/blob/go1.20/src/runtime/map.go#L418-L419&#34;&gt;map&lt;/a&gt; 都使用到这个技巧。&lt;/p&gt;&lt;p&gt;基于哈希表实现的Map中的取余运算转换成与运算的技巧，用数学语言来表达：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;对于正整数x, y，如果x为2的n次方，n为正整数，那么$y\;\%\;x = y \;\&amp;amp;\; (x-1)$ 表达式是成立的。&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://cyub.cyub.vip/blog/2023/02/16/y--x--y--x---1%E7%9A%84%E6%95%B0%E5%AD%A6%E8%AF%81%E6%98%8E/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2023/02/16/y--x--y--x---1%E7%9A%84%E6%95%B0%E5%AD%A6%E8%AF%81%E6%98%8E/</guid> </item> <item> <title>《Nginx Cookbook 2019》中文版第一章基础知识</title> <author>Tinker</author> <description>&lt;h2&gt;0.0 最前面话&lt;/h2&gt;&lt;p&gt;最近看了一本关于NGINX的电子书，编排形式比较新颖，通过一问一答的方式来告诉读者如何快速上手NGINX，以及处理真实项目中的需求。书的内容简练概括，但涉及面较多，内容有4层和7层负载均衡，A/B测试，自动化部署，认证，Http2，debug和调优等，有些示例可以拿来直接用。由于原书暂无中文译本，姑且尝试翻译一下，90%机器翻译，10%人工修正。原书信息如下:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;名称：Nginx cookbook-Advanced Recipes for High Performance Load Balancing&lt;/li&gt;&lt;li&gt;作者：Derek DeJonghe&lt;/li&gt;&lt;li&gt;下载地址：https://www.nginx.com/resources/library/complete-nginx-cookbook&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;1.0 Introduction-简介&lt;/h2&gt;&lt;p&gt;To get started with NGINX Open Source or NGINX Plus, you firstneed to install it on a system and learn some basics. In this chapteryou will learn how to install NGINX, where the main configurationfiles are, and commands for administration. You will also learn howto verify your installation and make requests to the default server.&lt;/p&gt;&lt;p&gt;要开始使用开源版NGINX或NGINX Plus，你首先需要将在操作系统里面安装上并学习一些相关的基础知识。在本章中，你将学习如何安装nginx，其主要配置文件所在位置，以及管理命令。你还将学习如何验你的安装并向默认服务器发送请求。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/09/07/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%B8%80%E7%AB%A0%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/09/07/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%B8%80%E7%AB%A0%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</guid> </item> <item> <title>《Nginx Cookbook 2019》中文版第三章流量管理</title> <author>Tinker</author> <description>&lt;h2&gt;3.0 Introduction&lt;/h2&gt;&lt;p&gt;NGINX and NGINX Plus are also classified as web traffic control‐ lers. You can use NGINX to intellengently route traffic and control flow based on many attributes. This chapter covers NGINX’s ability to split client requests based on percentages, utilize geographical location of the clients, and control the flow of traffic in the form of rate, connection, and bandwidth limiting. As you read through this chapter, keep in mind that you can mix and match these features to enable countless possibilities.&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/10/02/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%B8%89%E7%AB%A0%E6%B5%81%E9%87%8F%E7%AE%A1%E7%90%86/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/10/02/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%B8%89%E7%AB%A0%E6%B5%81%E9%87%8F%E7%AE%A1%E7%90%86/</guid> </item> <item> <title>《Nginx Cookbook 2019》中文版第二章高性能负载均衡</title> <author>Tinker</author> <description>&lt;h2&gt;2.0 Introduction-简介&lt;/h2&gt;&lt;p&gt;Today’s internet user experience demands performance and uptime. To achieve this, multiple copies of the same system are run, and the load is distributed over them. As the load increases, another copy of the system can be brought online. This architecture technique is called horizontal scaling. Software-based infrastructure is increasing in popularity because of its flexibility, opening up a vast world of possibilities. Whether the use case is as small as a set of two for high availability or as large as thousands around the globe, there’s a need for a load-balancing solution that is as dynamic as the infrastructure. NGINX fills this need in a number of ways, such as HTTP, TCP, and UDP load balancing, which we cover in this chapter.&lt;/p&gt;&lt;p&gt;当今的互联网用户体验要求性能和时时在线。为了达到这个目的，同一个系统的多个副本需同时运行，并且将负载分布在这些副本上。随着负载的增加，系统的另一个副本可以联机。这种架构技术被称为水平拓展。基于软件的基础设施因其灵活性而越来越受欢迎，开辟了一个广阔的无限可能的世界。对于高可用性而言，用例小到两个，还是在全球范围内成千上万个，都需要一个与基础架构一样动态的负载均衡解决方案。NGINX以多种方式满足这一需求，我们在本章中将讨论超文本传输协议(HTTP)、TCP和UDP的负载平衡。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/09/07/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%AB%98%E6%80%A7%E8%83%BD%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/09/07/nginx-cookbook-2019%E4%B8%AD%E6%96%87%E7%89%88%E7%AC%AC%E4%BA%8C%E7%AB%A0%E9%AB%98%E6%80%A7%E8%83%BD%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/</guid> </item> <item> <title>《深入理解程序设计》读书笔记</title> <author>Tinker</author> <description>&lt;h2&gt;计算机体系结构&lt;/h2&gt;&lt;h3&gt;冯诺依曼体系&lt;/h3&gt;&lt;p&gt;&lt;img alt=&#34;冯诺依曼计算机体系&#34; src=&#34;https://static.cyub.vip/images/202007/fnym.png&#34;&gt;&lt;/p&gt;&lt;p&gt;当前计算机主要是基于&lt;strong&gt;冯诺依曼体系结构&lt;/strong&gt;设计的，主要由五大部件组成：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;存储器用来存放数据和程序&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;运算器主要运行算数运算和逻辑运算，并将中间结果暂存到运算器中&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;控制器主要用来控制和指挥程序和数据的输入运行，以及处理运算结果&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式，常见的有键盘，鼠标等&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;输出设备可以将机器运算结果转换为人们熟悉的信息形式，如打印机输出，显示器输出等&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2020/07/12/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/07/12/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/</guid> </item> <item> <title>一个PHPer的sublime插件指南</title> <author>Tinker</author> <description>&lt;p&gt;作为一名PHPer，在开发(ban zhuan)过程中，没有一个犀利的编辑器怎么能行。sublime是我最喜欢的编辑器，具有强大的拓展功能，有许多丰富的插件支撑。&lt;/p&gt;&lt;p&gt;下面是我目前使用的插件：&lt;/p&gt;&lt;h2&gt;插件管理&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://packagecontrol.io/&#34;&gt;Package Control&lt;/a&gt;强大的Sublime插件管理工具&lt;/p&gt;&lt;h2&gt;主题&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/ihodev/sublime-boxy&#34;&gt;Boxy&lt;/a&gt;一个十足极客范的Sublime主题，支持多种主题颜色切换&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/08/26/%E4%B8%80%E4%B8%AAphper%E7%9A%84sublime%E6%8F%92%E4%BB%B6%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/08/26/%E4%B8%80%E4%B8%AAphper%E7%9A%84sublime%E6%8F%92%E4%BB%B6%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>从ISO 639到BCP 47：语言码标准的发展与应用</title> <author>Tinker</author> <description>&lt;p&gt;随着全球化和信息化的快速发展，多语言环境成为不可或缺的一部分。在跨文化交流、软件国际化以及内容本地化的过程中，&lt;strong&gt;语言码&lt;/strong&gt;作为语言标识的核心工具，扮演着至关重要的角色。本文将探讨语言码的主要标准，从早期的 ISO 639 到目前广泛应用的 BCP 47，了解其发展历程和应用场景。&lt;/p&gt;&lt;h2&gt;什么是语言码？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;语言码是一种用来标识自然语言的标准化代码&lt;/strong&gt;，它提供了一种结构化的方式来表示语言、区域和书写系统。例如：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;en&lt;/code&gt; 代表英语（English）。&lt;/li&gt;&lt;li&gt;&lt;code&gt;zh-CN&lt;/code&gt; 代表简体中文（中国）。&lt;/li&gt;&lt;li&gt;&lt;code&gt;fr-CA&lt;/code&gt; 代表加拿大法语。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;通过语言码，系统可以识别用户的语言偏好，并相应地呈现内容。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2024/12/30/%E4%BB%8Eiso-639%E5%88%B0bcp-47%E8%AF%AD%E8%A8%80%E7%A0%81%E6%A0%87%E5%87%86%E7%9A%84%E5%8F%91%E5%B1%95%E4%B8%8E%E5%BA%94%E7%94%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/12/30/%E4%BB%8Eiso-639%E5%88%B0bcp-47%E8%AF%AD%E8%A8%80%E7%A0%81%E6%A0%87%E5%87%86%E7%9A%84%E5%8F%91%E5%B1%95%E4%B8%8E%E5%BA%94%E7%94%A8/</guid> </item> <item> <title>从零开始写一个哈希表</title> <author>Tinker</author> <description>&lt;p&gt;这篇笔记是对教程：&lt;a href=&#34;https://github.com/jamesroutley/write-a-hash-table&#34;&gt;write a hash table&lt;/a&gt; 的学习总结。该教程使用C语言，从零开始实现了一个哈希表，教程中哈希表实现使用了&lt;a href=&#34;https://en.wikipedia.org/wiki/Open_addressing&#34;&gt;开放地址法&lt;/a&gt;，&lt;a href=&#34;https://en.wikipedia.org/wiki/Double_hashing&#34;&gt;双重哈希&lt;/a&gt;等技术。本篇笔记中部分内容对原教程进行了拓展。&lt;/p&gt;&lt;h2&gt;什么是哈希表？&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Hash_table&#34;&gt;哈希表（Hash Table）&lt;/a&gt;是一种基于键值对（Key-Value）存储的高效数据结构，通过哈希函数（Hash Function）将键（Key）映射到数组的特定位置（桶），从而实现平均 O(1) 时间复杂度的插入、查找和删除操作。&lt;/p&gt;&lt;p&gt;下面是基于哈希表存储电话簿的结构图：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202506/Hash_table_3_1_1_0_1_0_0_SP.svg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2025/06/22/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E4%B8%80%E4%B8%AA%E5%93%88%E5%B8%8C%E8%A1%A8/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2025/06/22/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E5%86%99%E4%B8%80%E4%B8%AA%E5%93%88%E5%B8%8C%E8%A1%A8/</guid> </item> <item> <title>使用Consul作为配置中心的一种解决方案</title> <author>Tinker</author> <description>&lt;p&gt;最近上线了go语言写的一个接口服务，由于接口服务是分布式部署的，服务的配置就需要使用分布式配置中心来管理。在调研了其他配置中心工具方案后，最终采用了Consul作为配置工具。一方面其学习成本较低，二来Consul本身作为服务注册和发现工具，可以一次学习多次适用。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/04/26/%E4%BD%BF%E7%94%A8consul%E4%BD%9C%E4%B8%BA%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E7%9A%84%E4%B8%80%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/04/26/%E4%BD%BF%E7%94%A8consul%E4%BD%9C%E4%B8%BA%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83%E7%9A%84%E4%B8%80%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</guid> </item> <item> <title>使用Consul，Bind和Nginx实现服务端服务发现</title> <author>Tinker</author> <description>&lt;p&gt;在微服务架构实践中，一个难点是服务发现。每一个服务采用分布式部署，保证了拓展性和容错性，但带来了一个难点是如何监控这些服务，如何找到这些服务。&lt;/p&gt;&lt;p&gt;服务发现的种类有两种：客户端发现和服务端发现&lt;/p&gt;&lt;p&gt;&lt;strong&gt;客服端发现&lt;/strong&gt;-客户端或者API网关查询注册中心获取服务的位置信息。支持服务注册的软件有&lt;code&gt;Etcd&lt;/code&gt;，&lt;code&gt;Zookeeper&lt;/code&gt;，&lt;code&gt;Consul&lt;/code&gt;等&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/11/18/%E4%BD%BF%E7%94%A8consulbind%E5%92%8Cnginx%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/11/18/%E4%BD%BF%E7%94%A8consulbind%E5%92%8Cnginx%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/</guid> </item> <item> <title>使用Nginx+PHP-FPM+Coredns快速搭建本地PHP开发环境</title> <description></description><link>https://cyub.cyub.vip/blog/2017/06/25/%E4%BD%BF%E7%94%A8nginxphp-fpmcoredns%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E6%9C%AC%E5%9C%B0php%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/06/25/%E4%BD%BF%E7%94%A8nginxphp-fpmcoredns%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA%E6%9C%AC%E5%9C%B0php%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</guid> </item> <item> <title>使用Robo自动生成Nginx虚拟主机配置</title> <author>Tinker</author> <description>&lt;p&gt;在开发过程中，我们有时候是基于一个框架的脚手架来开发。先clone下来项目，然后配置Nginx或Apache服务器里面的虚拟主机，映射到当前项目。这个虚拟主机的配置可以由程序自动生成。&lt;/p&gt;&lt;p&gt;流程如下：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;composer create-project tink/slim-skeleton:dev-master blog // 使用slim-skeleton创建blog项目&lt;/li&gt;&lt;li&gt;cd blog // 切换到blog目录&lt;/li&gt;&lt;li&gt;ngto park // 执行命令，配置虚拟主机。blog.local域名自动配置到当前blog项目。&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2017/11/21/%E4%BD%BF%E7%94%A8robo%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90nginx%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E9%85%8D%E7%BD%AE/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/11/21/%E4%BD%BF%E7%94%A8robo%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90nginx%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA%E9%85%8D%E7%BD%AE/</guid> </item> <item> <title>使用Xdebug和Webgrind优化PHP代码</title> <author>Tinker</author> <description>&lt;p&gt;在PHP开发过程中找到并修复性能瓶颈（performance bottlenecks）往往是非常困难和耗时的。为了定位问题，我们可能会在疑似影响性能的代码的开始和结束之间打上标记点，计算时间差，来定位问题，CI框架提供的基准测试类就是这样工作，这种方式对小型项目起到方便快捷的作用，但对大项目往往吃力不讨好，好比在工业时代，却是用石器时代的工具。这时候我们可以借助Xdebug，webgrind这样的工具来定位到和可视化php代码中的性能瓶颈。&lt;/p&gt;&lt;p&gt;Xdebug是PHP拓展，可以用来跟踪，调试和分析PHP程序的运行状况。而Webgrind是Web应用，提供一个可视化工具，来分析、查看Xdebug性能日志功能。在Linux KDE环境下可以用&lt;code&gt;KChaceGrind&lt;/code&gt;，windows 下可以用&lt;code&gt;winChaceGrind&lt;/code&gt;来替换Webgrind查看分析Xdebug日志。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/07/03/%E4%BD%BF%E7%94%A8xdebug%E5%92%8Cwebgrind%E4%BC%98%E5%8C%96php%E4%BB%A3%E7%A0%81/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/07/03/%E4%BD%BF%E7%94%A8xdebug%E5%92%8Cwebgrind%E4%BC%98%E5%8C%96php%E4%BB%A3%E7%A0%81/</guid> </item> <item> <title>使用雪花算法生成分布式ID</title> <author>Tinker</author> <description>&lt;p&gt;Snowflake算法(雪花算法)是由Twitter提出的一个分布式全局唯一ID生成算法，该算法生成一个64bit大小的长整数。64bit位ID结构如下：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;Snowflake-64bit&#34; src=&#34;https://static.cyub.vip/images/202001/snowflake-64bit.jpeg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/02/01/%E4%BD%BF%E7%94%A8%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%E7%94%9F%E6%88%90%E5%88%86%E5%B8%83%E5%BC%8Fid/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/02/01/%E4%BD%BF%E7%94%A8%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95%E7%94%9F%E6%88%90%E5%88%86%E5%B8%83%E5%BC%8Fid/</guid> </item> <item> <title>几种找到php.ini文件的方法</title> <author>Tinker</author> <description>&lt;p&gt;查找&lt;code&gt;php.ini&lt;/code&gt;文件所在路径几种方法：&lt;/p&gt;&lt;h2&gt;1. 内置函数&lt;/h2&gt;&lt;h3&gt;phpinfo&lt;/h3&gt;&lt;p&gt;phpinfo输出&lt;code&gt;PHP&lt;/code&gt;当前状态的大量信息，包含了编译选项、启用的扩展、PHP 版本、服务器信息和环境变量（如果编译为一个模块的话）、PHP环境变量、操作系统版本信息、path 变量、配置选项的本地值和主值、HTTP 头和PHP授权信息(License)。包含所有 EGPCS(Environment, GET, POST, Cookie, Server) 数据&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/03/04/%E5%87%A0%E7%A7%8D%E6%89%BE%E5%88%B0phpini%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/03/04/%E5%87%A0%E7%A7%8D%E6%89%BE%E5%88%B0phpini%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/</guid> </item> <item> <title>十种常见软件架构模式</title> <author>Tinker</author> <description>&lt;p&gt;原文地址：&lt;a href=&#34;https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013&#34;&gt;10 Common Software Architectural Patterns in a nutshell&lt;/a&gt;&lt;/p&gt;&lt;p&gt;是否曾经好奇过大型企业系统是如何设计的？在主要软件开发之前，我们需要选择合适的架构，为我们提供所需的功能和质量属性。因为，在我们应用架构到我们的设计中之前，我们应该了解不同的架构&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;Software Architectural Patterns&#34; src=&#34;http://static.cyub.vip/images/201810/software-architectural-patterns.png&#34;&gt;&lt;/p&gt;&lt;h2&gt;什么是架构模式？&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;架构模式是对给定上下文中软件架构中常见问题的通用、可重用的解决方案。架构模式类似于软件设计模式，但范围更广。&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://cyub.cyub.vip/blog/2018/06/10/%E5%8D%81%E7%A7%8D%E5%B8%B8%E8%A7%81%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/06/10/%E5%8D%81%E7%A7%8D%E5%B8%B8%E8%A7%81%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E6%A8%A1%E5%BC%8F/</guid> </item> <item> <title>在Linux中如何使用logrotate管理日志</title> <author>Tinker</author> <description>&lt;p&gt;原文：&lt;a href=&#34;https://www.ostechnix.com/manage-log-files-using-logrotate-linux/&#34;&gt;How To Manage Log Files Using Logrotate In Linux&lt;/a&gt;&lt;/p&gt;&lt;p&gt;几天前，我们发布了一份指南，介绍了如何在CentOS系统上设置&lt;a href=&#34;https://www.ostechnix.com/setup-centralized-rsyslog-server-centos-7/&#34;&gt;集中式Rsyslog服务&lt;/a&gt;。今天，在本指南中，我们将了解如何在Linux上使用日志轮换来管理日志文件。该实用程序简化了日志文件的管理，尤其适用于每天生成大量日志文件的系统。顾名思义，LogRotate以固定的时间间隔将日志完全从系统中轮转出来。它还允许日志文件的自动轮转、压缩、删除和传输。每个日志文件可以每天、每周、每月或在变得太大时处理。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/11/17/%E5%9C%A8linux%E4%B8%AD%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8logrotate%E7%AE%A1%E7%90%86%E6%97%A5%E5%BF%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/11/17/%E5%9C%A8linux%E4%B8%AD%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8logrotate%E7%AE%A1%E7%90%86%E6%97%A5%E5%BF%97/</guid> </item> <item> <title>在Linux中查看和设置时区</title> <author>Tinker</author> <description>&lt;p&gt;在设置Linux时间时候，时区是一个很重要的部分。让我们来看如何查看和设置Linux系统的时区&lt;/p&gt;&lt;h2&gt;查看Linux当前时区&lt;/h2&gt;&lt;h2&gt;使用date命令查看时区&lt;/h2&gt;&lt;p&gt;&lt;code&gt;bashdate -R // 查看当前具体时区&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/01/17/%E5%9C%A8linux%E4%B8%AD%E6%9F%A5%E7%9C%8B%E5%92%8C%E8%AE%BE%E7%BD%AE%E6%97%B6%E5%8C%BA/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/01/17/%E5%9C%A8linux%E4%B8%AD%E6%9F%A5%E7%9C%8B%E5%92%8C%E8%AE%BE%E7%BD%AE%E6%97%B6%E5%8C%BA/</guid> </item> <item> <title>在Redis中使用Lua脚本</title> <author>Tinker</author> <description>&lt;h3&gt;简介&lt;/h3&gt;&lt;p&gt;Lua诞生于1993年，是一种脚本语言，用C语言编写，其设计目的是为了快捷、高效嵌入到程序应用，比如Nginx服务器脚本。Redis从2.6.0版本开始内置Lua解释器，支持使用Eval命令运行Lua脚本。&lt;/p&gt;&lt;p&gt;在Redis中使用Lua脚本有两大特性：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;原子性&lt;/p&gt;&lt;p&gt;Redis使用单个Lua解释器去运行所有脚本，当其在运行时，其他脚本或命令执行只能等待，这保证脚本已原子性方式运行。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;高性能&lt;/p&gt;&lt;p&gt;Lua脚本一次可以执行多个redis命令，可以减少网络开销。对于较大脚本可以先使用&lt;code&gt;SCRIPT LOAD&lt;/code&gt; 命令将其加载缓存中，然后使用&lt;code&gt;EVALSHA&lt;/code&gt;运行近一步减少网络开销&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>https://cyub.cyub.vip/blog/2019/12/01/%E5%9C%A8redis%E4%B8%AD%E4%BD%BF%E7%94%A8lua%E8%84%9A%E6%9C%AC/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/12/01/%E5%9C%A8redis%E4%B8%AD%E4%BD%BF%E7%94%A8lua%E8%84%9A%E6%9C%AC/</guid> </item> <item> <title>多网卡模式下Golang应用的流量从指定网卡流入流出方案</title> <author>Tinker</author> <description>&lt;p&gt;最近因业务需要，需要在多网卡模式下实现Go应用的流量从指定网卡流入，请求外网服务时候流量需要从该网卡流出功能。从指定网卡流入很容易实现，只要go应用listen对应网卡即可，但请求外网服务时候就相对麻烦些了。在实践中总结出有三种方案可行。各有优劣。&lt;/p&gt;&lt;p&gt;假定服务器网卡情况如下：&lt;/p&gt;&lt;p&gt;| 网卡 | 网卡IP | 对应的公网IP| ---- | ---- | --- || eth0 | 172.31.0.8 | 109.25.48.65| eth1 | 172.31.0.14 | 119.26.38.75&lt;/p&gt;&lt;p&gt;实际上我们的服务器使用云服务器，网卡是弹性网卡(eni)，绑定的是弹性ip(eip)。三种方案对普通服务器也是能达到目的的。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/11/07/%E5%A4%9A%E7%BD%91%E5%8D%A1%E6%A8%A1%E5%BC%8F%E4%B8%8Bgolang%E5%BA%94%E7%94%A8%E7%9A%84%E6%B5%81%E9%87%8F%E4%BB%8E%E6%8C%87%E5%AE%9A%E7%BD%91%E5%8D%A1%E6%B5%81%E5%85%A5%E6%B5%81%E5%87%BA%E6%96%B9%E6%A1%88/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/11/07/%E5%A4%9A%E7%BD%91%E5%8D%A1%E6%A8%A1%E5%BC%8F%E4%B8%8Bgolang%E5%BA%94%E7%94%A8%E7%9A%84%E6%B5%81%E9%87%8F%E4%BB%8E%E6%8C%87%E5%AE%9A%E7%BD%91%E5%8D%A1%E6%B5%81%E5%85%A5%E6%B5%81%E5%87%BA%E6%96%B9%E6%A1%88/</guid> </item> <item> <title>如何养成好的阅读习惯？</title> <author>Tinker</author> <description>&lt;p&gt;译文来自：&lt;a href=&#34;http://blog.jobbole.com/101517/&#34;&gt;伯乐在线&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Rick Webb写了一篇&lt;a href=&#34;https://medium.com/rick-webb/my-reading-habits-1e4039966f18&#34;&gt;关于阅读的好文&lt;/a&gt;，提到了他一年要读60本书，而他却是一个手头事情很多、忙忙碌碌的专业人士，那么他的阅读习惯是什么呢？我这里借鉴了他的观点，也加入了一些我自己的想法。&lt;/p&gt;&lt;h2&gt;经常阅读&lt;/h2&gt;&lt;p&gt;用电子阅读器或移动设备，只要有机会就读上几页，这种感觉很棒。&lt;/p&gt;&lt;h2&gt;设定一个目标&lt;/h2&gt;&lt;p&gt;我喜欢设定目标，但通常都达不到。今年，我要设定一个适中的目标，每月2本书，我知道，其中一本书是一个月度播客，需要做大量笔记。但只要24本书质量都很高的话，那这一年的成绩就很不错了。Rick提到自己过去设定的每周读一本《经济学人》的目标，从头读到尾。我也曾经试过，但痛苦地放弃了——这是一本容量惊人的周刊，有大量的干货，足以消耗掉你所有的阅读时间。&lt;/p&gt;&lt;h2&gt;不要尝试去读你或其他人认为你应该读的东西&lt;/h2&gt;&lt;p&gt;很有意思——我们经常有这样的倾向，就是从书籍排名前10名中选择，或者是靠同事推荐。但选些不同的东西读，找到你自己的路，会更有意思。我发现一本好书经常会引用其他很多好书，按照这个踪迹追索，往往收获不菲。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/06/10/%E5%A6%82%E4%BD%95%E5%85%BB%E6%88%90%E5%A5%BD%E7%9A%84%E9%98%85%E8%AF%BB%E4%B9%A0%E6%83%AF/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/06/10/%E5%A6%82%E4%BD%95%E5%85%BB%E6%88%90%E5%A5%BD%E7%9A%84%E9%98%85%E8%AF%BB%E4%B9%A0%E6%83%AF/</guid> </item> <item> <title>如何在Docker上构建符合12要素的微服务</title> <author>Tinker</author> <description>&lt;p&gt;原文地址：&lt;a href=&#34;https://hub.packtpub.com/how-to-build-12-factor-design-microservices-on-docker-part-1/&#34;&gt;How to Build 12 Factor Microservices on Docker&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;原文由两部分构成，我和并处理了，并去掉原先两部分中间过渡的引语。文章有删减处理，有些地方确实拿捏不准，翻译可能南辕北辙，望见谅。最后感谢&lt;a href=&#34;https://translate.google.cn/&#34;&gt;Google 翻译&lt;/a&gt;，完成了90%的翻译&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;随着企业持续从云计算上获得节约成本的好处，&lt;code&gt;Devops&lt;/code&gt;团队正逐渐把他们的基础架构迁移到自服务平台。如何将应用设计成云原生和反脆弱成了至关重要的工作。在接下里的一系列文章里面，我们将研究用于应用设计的12要素方法论，以及怎样设计接口来和大部分流行的&lt;code&gt;Pass&lt;/code&gt;提供者交互，以及演示怎么在&lt;code&gt;Deis PaaS&lt;/code&gt;上运行一个微服务&lt;/p&gt;&lt;p&gt;由&lt;code&gt;Netfix&lt;/code&gt;和&lt;code&gt;Heroku&lt;/code&gt;等创新者的引领下，面向服务架构的数据中心正意识到在云上采用微服务的巨大潜力。&lt;code&gt;Netfix&lt;/code&gt;是无可争议的第一个设计出可伸缩和反脆弱的应用，也就是有意引入chaos到他们的系统，他们的应用在面对错误时候变得更加稳定、弹性、优雅。同样通过帮助成千上万的客户在云上构建应用，&lt;code&gt;Heroku&lt;/code&gt;提出一系列通用原则并将它描述成12要素方法论&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2018/05/12/%E5%A6%82%E4%BD%95%E5%9C%A8docker%E4%B8%8A%E6%9E%84%E5%BB%BA%E7%AC%A6%E5%90%8812%E8%A6%81%E7%B4%A0%E7%9A%84%E5%BE%AE%E6%9C%8D%E5%8A%A1/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2018/05/12/%E5%A6%82%E4%BD%95%E5%9C%A8docker%E4%B8%8A%E6%9E%84%E5%BB%BA%E7%AC%A6%E5%90%8812%E8%A6%81%E7%B4%A0%E7%9A%84%E5%BE%AE%E6%9C%8D%E5%8A%A1/</guid> </item> <item> <title>如何正确选择一个HTTP状态码</title> <author>Tinker</author> <description>&lt;p&gt;HTTP状态码(HTTP Status Code)是3位数字代码，用来表示服务器HTTP响应状态，它由&lt;code&gt;RFC2616&lt;/code&gt; 规范定义的。所有状态码第一个数字代表其所属的状态分类。服务端返回响应数据时候，HTTP协议号和状态码作为&lt;code&gt;Response line&lt;/code&gt;返回给客户端&lt;/p&gt;&lt;p&gt;在开发过程中，特别是基于&lt;code&gt;RESTful架构&lt;/code&gt;，一个语义正确的HTTP状态码，显得十分有必要，它能够帮助客户端接受者能够从状态码快速甄别资源的状态。作为服务提供者，需要在客户端请求和服务的状态下选择一个正确的状态往往不是那么容易的事情。比如客户端访问一个受限的资源，返回401还是403就得细细考虑了。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/09/02/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AAhttp%E7%8A%B6%E6%80%81%E7%A0%81/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/09/02/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E9%80%89%E6%8B%A9%E4%B8%80%E4%B8%AAhttp%E7%8A%B6%E6%80%81%E7%A0%81/</guid> </item> <item> <title>并发编程系列：开篇</title> <author>Tinker</author> <description>&lt;p&gt;本文是并发编程系列博文的开篇。笔者将打算写一系列并发编程相关的博文。下面是具体索引，方便大家查看：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;[并发编程系列：谈谈锁的实现机制](https://www.cyub.vip/2022/07/28/%E8%B0%88%E8%B0%88%E9%94%81%E7%9A%84%E5%AE%9E%E7%8E%B0...&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2022/07/24/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2022/07/24/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E7%B3%BB%E5%88%97%E5%BC%80%E7%AF%87/</guid> </item> <item> <title>当今经济上的几个热点名词</title> <author>Tinker</author> <description>&lt;h1&gt;营改增&lt;/h1&gt;&lt;h2&gt;什么是营改增&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;营改增全称营业税改征增值税&lt;/strong&gt;。我们都知道税务局分为国家税务局（国税局）和地方税务局（地税局）两种，国税局主要征收增值税和企业所得税，地税局主要征收营业税和个人所得税。涉及到&lt;em&gt;衣食住行&lt;/em&gt;的行业，比如建筑业、交通业、服务业等。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/05/23/%E5%BD%93%E4%BB%8A%E7%BB%8F%E6%B5%8E%E4%B8%8A%E7%9A%84%E5%87%A0%E4%B8%AA%E7%83%AD%E7%82%B9%E5%90%8D%E8%AF%8D/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/05/23/%E5%BD%93%E4%BB%8A%E7%BB%8F%E6%B5%8E%E4%B8%8A%E7%9A%84%E5%87%A0%E4%B8%AA%E7%83%AD%E7%82%B9%E5%90%8D%E8%AF%8D/</guid> </item> <item> <title>数说2017</title> <author>Tinker</author> <description>&lt;p&gt;{% iframe //export.cyub.vip/i?all=%7B%22chart%22%3A%7B%22type%22%3A%22bar%22%7D%2C%22title%22%3A%7B%22text%22%3A%22GitHub%202017%E5%B9%B4%E5%BA%A6%E6%9C%80%E...&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/12/31/%E6%95%B0%E8%AF%B42017/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/12/31/%E6%95%B0%E8%AF%B42017/</guid> </item> <item> <title>服务网格和API网关在微服务架构中的角色</title> <author>Tinker</author> <description>&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202103/service_mesh.png&#34;&gt;&lt;/p&gt;&lt;p&gt;如果你对微服务感兴趣，那么你可能多次听说过这两个术语。人们常常把这两者混为一谈。在本文中，我将详细讨论服务网格和API网关，并讨论何时使用什么。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/03/13/%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E5%92%8Capi%E7%BD%91%E5%85%B3%E5%9C%A8%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E8%A7%92%E8%89%B2/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/03/13/%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC%E5%92%8Capi%E7%BD%91%E5%85%B3%E5%9C%A8%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E8%A7%92%E8%89%B2/</guid> </item> <item> <title>深入了解golang中的defer关键字</title> <author>Tinker</author> <description>&lt;p&gt;golang中的defer关键字是用来声明一个延迟函数，一般称这个函数为defer函数，该函数会在defer语句所在的函数返回之前会执行。通过defer关键字，我们可以修改函数命名返回值，进行资源释放等操作，总的来说defer函数有如下特点和功能：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;函数返回之前执行&lt;/li&gt;&lt;li&gt;可以放在函数中任意位置&lt;/li&gt;&lt;li&gt;可以同时设置多个defer函数，多个defer函数执行遵循FILO顺序&lt;/li&gt;&lt;li&gt;defer函数的传入参数在定义时就已经明确&lt;/li&gt;&lt;li&gt;可以修改函数中的命名返回值&lt;/li&gt;&lt;li&gt;用于文件资源，锁资源、数据库连接等释放和关闭&lt;/li&gt;&lt;li&gt;和recover一起处理panic&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;本文将介绍defer上面的几个特性，如果想深入了解defer底层实现机制，可以阅读笔者写的&lt;a href=&#34;https://go.cyub.vip/feature/defer.html&#34;&gt;《深入Go语言之旅 - 基础篇 - defer函数》&lt;/a&gt;。&lt;/p&gt;&lt;h3&gt;defer会在函数返回之前执行&lt;/h3&gt;&lt;p&gt;当程序执行一个函数时候，会将函数的上下文（输入参数，返回值，输出参数等信息）作为&lt;a href=&#34;https://go.cyub.vip/function/call-stack.html#id2&#34;&gt;栈帧&lt;/a&gt;放在程序内存的栈中，当函数执行完成之后，设置返回值并返回，此函数才真正完成执行。&lt;/p&gt;&lt;p&gt;defer语句函数会在函数返回之前执行，下面程序将会依次输出B A：&lt;/p&gt;&lt;p&gt;&lt;code&gt;gofunc main() { defer fmt.Println(&#34;A&#34;) fmt.Println(&#34;B&#34;)}&lt;/code&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/05/30/%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3golang%E4%B8%AD%E7%9A%84defer%E5%85%B3%E9%94%AE%E5%AD%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/05/30/%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3golang%E4%B8%AD%E7%9A%84defer%E5%85%B3%E9%94%AE%E5%AD%97/</guid> </item> <item> <title>深入探究Golang函数与函数调用栈</title> <author>Tinker</author> <description>&lt;p&gt;贴一下分享的《深入探究Golang函数与函数调用栈》的PPT。&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;&#34; src=&#34;https://static.cyub.vip/images/202103/go-share/feature.jpg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/04/12/%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%A9%B6golang%E5%87%BD%E6%95%B0%E4%B8%8E%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%A0%88/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/04/12/%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%A9%B6golang%E5%87%BD%E6%95%B0%E4%B8%8E%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%A0%88/</guid> </item> <item> <title>《统计思维》读书笔记之描述性统计量</title> <author>Tinker</author> <description>&lt;p&gt;清明放假三天，闲来无事，拿起角落里吃灰蛮久的《统计思维》一书聊以打发。现把读书笔记结合收集的相关资料内容记录如下。&lt;/p&gt;&lt;h2&gt;描述性统计量&lt;/h2&gt;&lt;p&gt;描述性统计是一种汇总统计，用于定量描述或总结信息集合的特征。描述性统计又分为集中趋势（Measures of central tendency）和离散趋势（Measures of Dispersion）&lt;/p&gt;&lt;h3&gt;均值&lt;/h3&gt;&lt;p&gt;均值(Mean)，即所有数据相加后的总和除以数据的个数得出的结果， 也称算术平均值。设一组样本数据为x1,x2,...,xn，样本数据的个数为n，则均值为：&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;均值计算公式&#34; src=&#34;https://static.cyub.vip/images/202004/mean.jpg&#34;&gt;&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/04/05/%E7%BB%9F%E8%AE%A1%E6%80%9D%E7%BB%B4%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0%E4%B9%8B%E6%8F%8F%E8%BF%B0%E6%80%A7%E7%BB%9F%E8%AE%A1%E9%87%8F/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/04/05/%E7%BB%9F%E8%AE%A1%E6%80%9D%E7%BB%B4%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0%E4%B9%8B%E6%8F%8F%E8%BF%B0%E6%80%A7%E7%BB%9F%E8%AE%A1%E9%87%8F/</guid> </item> <item> <title>网站性能指标</title> <author>Tinker</author> <description>&lt;h2&gt;QPS&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;每秒查询率（Query Per Second),每秒响应请求数&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;QPS = 完成Request量/所花时间（单位 Request/s)&lt;/p&gt;&lt;h2&gt;吞吐量（Throughput)&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;吞吐量是指系统在单位时间内响应的数据量&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;一个系统吞吐量通常由QPS（TPS）、并发数两个因素决定，每套系统这两个值都有一个相对极限值，在应用场景访问压力下，只要某一项达到系统最高值，系统的吞吐量就上不去了，如果压力继续增大，系统的吞吐量反而会下降，原因是系统超负荷工作，上下文切换、内存等等其它消耗导致系统性能下降&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/06/04/%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/06/04/%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD%E6%8C%87%E6%A0%87/</guid> </item> <item> <title>计算机术语之开源许可协议与软件版本</title> <description>&lt;h2&gt;开源许可协议&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;当你给软件附上许可证时，意味着你将保留对软件的所有权利。许可协议用来授权其他人具有某种使用你的作品的权利。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Open-source_license&#34;&gt;开源许可协议&lt;/a&gt; 使人们免去了研究那些专业的许可条款的麻烦，使人们更方便的对开源项目贡献出自己的代码。而且它还能保护你作为作品的原创作者，确保你至少拥有由于贡献参与而带来的署名荣誉。它还能用来阻止其他人企图声明对你的作品拥有所有权的行为。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/02/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%9C%AF%E8%AF%AD%E4%B9%8B%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE%E4%B8%8E%E8%BD%AF%E4%BB%B6%E7%89%88%E6%9C%AC/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/02/07/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%9C%AF%E8%AF%AD%E4%B9%8B%E5%BC%80%E6%BA%90%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE%E4%B8%8E%E8%BD%AF%E4%BB%B6%E7%89%88%E6%9C%AC/</guid> </item> <item> <title>记一次inode使用100%导致文件无法创建问题</title> <author>Tinker</author> <description>&lt;h2&gt;问题描述&lt;/h2&gt;&lt;p&gt;前几日个人网站无法打开，自搭科学上网工具也无法使用。原本以为是服务器ip被封，后来查看服务器能正常登陆，cpu和内存等负载正常范围，但按tab键命令提示和创建文件时候，提示&lt;code&gt;No space left on device&lt;/code&gt;。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2019/03/02/%E8%AE%B0%E4%B8%80%E6%AC%A1inode%E4%BD%BF%E7%94%A8100%E5%AF%BC%E8%87%B4%E6%96%87%E4%BB%B6%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%E9%97%AE%E9%A2%98/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2019/03/02/%E8%AE%B0%E4%B8%80%E6%AC%A1inode%E4%BD%BF%E7%94%A8100%E5%AF%BC%E8%87%B4%E6%96%87%E4%BB%B6%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%E9%97%AE%E9%A2%98/</guid> </item> <item> <title>这可能是你最想要的一份GDB使用指南</title> <author>Tinker</author> <description>&lt;h2&gt;GDB简介&lt;/h2&gt;&lt;p&gt;GDB（GNU symbolic Debugger）是Linux系统下的强大的调试工具，可以用来调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal 等多种语言。&lt;/p&gt;&lt;p&gt;我们以调试&lt;code&gt;go&lt;/code&gt;代码为示例来介绍GDB的使用。源码内容如下：&lt;/p&gt;&lt;p&gt;```gopackage main&lt;/p&gt;&lt;p&gt;import &#34;fmt&#34;&lt;/p&gt;&lt;p&gt;func add(a, b int) int { sum := 0 sum = a + b return sum}func main() { sum := add(10, 20) fmt.Println(sum)}```&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2021/03/22/%E8%BF%99%E5%8F%AF%E8%83%BD%E6%98%AF%E4%BD%A0%E6%9C%80%E6%83%B3%E8%A6%81%E7%9A%84%E4%B8%80%E4%BB%BDgdb%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2021/03/22/%E8%BF%99%E5%8F%AF%E8%83%BD%E6%98%AF%E4%BD%A0%E6%9C%80%E6%83%B3%E8%A6%81%E7%9A%84%E4%B8%80%E4%BB%BDgdb%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid> </item> <item> <title>那些有关人生、爱情、生活的句子</title> <author>Tinker</author> <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;生活中到处有负能量，当你疲倦时、失望时可以看看这些句子，或许能给你一些力量。这些句子从2012年断断续续收集过来，有的是来自书，有来自一部电影，有的来自歌词，不一而足。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;1、人的眼睛是由黑白两部分所组成的，可是神为什么要让人只能通过黑的部分去看东西？因为人生必须透过黑暗，才能看到光明——《塔木德》&lt;/p&gt;&lt;p&gt;2、一个人要获得实在的幸福，就必须既不太要聪明，也不太傻。人们把这种介于聪明和傻之间的状态叫做生活的智慧——周国平&lt;/p&gt;&lt;p&gt;3、每个圣人都有不可告人的过去，每个罪人都有洁白无瑕的未来&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2016/06/11/%E9%82%A3%E4%BA%9B%E6%9C%89%E5%85%B3%E4%BA%BA%E7%94%9F%E7%88%B1%E6%83%85%E7%94%9F%E6%B4%BB%E7%9A%84%E5%8F%A5%E5%AD%90/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2016/06/11/%E9%82%A3%E4%BA%9B%E6%9C%89%E5%85%B3%E4%BA%BA%E7%94%9F%E7%88%B1%E6%83%85%E7%94%9F%E6%B4%BB%E7%9A%84%E5%8F%A5%E5%AD%90/</guid> </item> <item> <title>长连接，RPC，RESTful乱弹</title> <author>Tinker</author> <description>&lt;p&gt;今天学习到很多知识，混混沌沌的大脑有时候就得需要轻敲一下，才能醍醐灌顶。&lt;/p&gt;&lt;p&gt;之前的对技术思考深度不够，涉及到东西浮于表面，蜻蜓点水而过。对于注意到不寻常现象，往往没有分析它的本质，思考现象本身原因就放过了。比如今天学习到RPC和Restful一个区别是RPC支持长连接，这对我之前对RPC的了解停留在客户端调用是无感知，无差别更深入本质了。&lt;/p&gt;&lt;h1&gt;长连接&lt;/h1&gt;&lt;p&gt;长连接(HTTP persistent connection)指的是在一个连接上可以持续不断的发送多个数据包，在TCP连接保持期间，如果没有数据包发送，需 要双方发检测包以维持此连接。&lt;/p&gt;&lt;p&gt;在&lt;code&gt;keep-alive&lt;/code&gt;机制出现之前，每次http请求都会打开一个tcp socket连接，请求完成之后就断开这个tcp连接。&lt;code&gt;keep-alive&lt;/code&gt;机制，能够保持TCP连接不断开(不发RST包、不四次握手)，减少了tcp连接次数，提交了传输速率。但是长时间不释放tcp连接数，也会极大的造成资源浪费。实现成千上万人同时在线的话，也就得保持住同样数量的tcp连接数。&lt;code&gt;keep-alive&lt;/code&gt;的timeout时间设置非常重要，能够及时的释放不需要的tcp连接。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2017/12/07/%E9%95%BF%E8%BF%9E%E6%8E%A5rpcrestful%E4%B9%B1%E5%BC%B9/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2017/12/07/%E9%95%BF%E8%BF%9E%E6%8E%A5rpcrestful%E4%B9%B1%E5%BC%B9/</guid> </item> <item> <title>音频编码知多少？</title> <author>Tinker</author> <description>&lt;p&gt;音频编码是指&lt;strong&gt;将声音信号（通常是模拟信号）转换为数字数据的一种技术和过程&lt;/strong&gt;。音频编码通过一定的算法或格式，对声音信号进行数字化处理和压缩，生成适合存储、传输或播放的音频文件。编码的核心是减少音频文件的体积，同时尽可能保留原始声音的质量。&lt;/p&gt;&lt;p&gt;音频编码分为&lt;strong&gt;采样与量化&lt;/strong&gt;以及&lt;strong&gt;数据压缩&lt;/strong&gt;两大部分。&lt;strong&gt;采样与量化&lt;/strong&gt;是将将连续的模拟声音信号转换为离散的数字信号（即数字化）。采样与量化具体过程包括：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;采样&lt;/strong&gt;：按固定频率（采样率）对声音信号取样。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：将采样值映射为有限范围的数字值，量化的精度由位深（Bit Depth）决定。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;数据压缩&lt;/strong&gt;是对数字化后的音频数据进行编码以减少文件大小。数据压缩分为：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;无损压缩&lt;/strong&gt;：如 FLAC、ALAC，完全保留原始音频数据。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;有损压缩&lt;/strong&gt;：如 MP3、AAC，牺牲部分音质以显著降低文件大小。&lt;/li&gt;&lt;/ul&gt;</description><link>https://cyub.cyub.vip/blog/2024/12/29/%E9%9F%B3%E9%A2%91%E7%BC%96%E7%A0%81%E7%9F%A5%E5%A4%9A%E5%B0%91/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2024/12/29/%E9%9F%B3%E9%A2%91%E7%BC%96%E7%A0%81%E7%9F%A5%E5%A4%9A%E5%B0%91/</guid> </item> <item> <title>高并发情况下服务器调优</title> <author>Tinker</author> <description>&lt;h2&gt;TCP内核参数调优&lt;/h2&gt;&lt;h3&gt;调整全连接队列长度&lt;/h3&gt;&lt;p&gt;TCP 建立连接时要经过 3 次握手，在客户端向服务器发起连接时，对于服务器而言，一个完整的连接建立过程，服务器会经历 2 种 TCP 状态：SYN_REVD, ESTABELLISHED。对应也会维护两个队列：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;一个存放SYN的队列（半连接队列，也成SYN队列）&lt;/li&gt;&lt;li&gt;一个存放已经完成连接的队列（全连接队列， 也称Accept队列）&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;当一个连接的状态是 SYN RECEIVED 时，它会被放在 SYN 队列中。当它的状态变为 ESTABLISHED 时，它会被转移到另一个队列。应用程序只从已完成的连接的队列中获取请求。&lt;/p&gt;</description><link>https://cyub.cyub.vip/blog/2020/01/02/%E9%AB%98%E5%B9%B6%E5%8F%91%E6%83%85%E5%86%B5%E4%B8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B0%83%E4%BC%98/</link> <pubDate>Sat, 10 Jan 2026 22:25:13 +0000</pubDate><source url="https://cyub.cyub.vip/feed.xml">Tink's Blog</source><guid isPermaLink="true">https://cyub.cyub.vip/blog/2020/01/02/%E9%AB%98%E5%B9%B6%E5%8F%91%E6%83%85%E5%86%B5%E4%B8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B0%83%E4%BC%98/</guid> </item> </channel></rss>