<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Programming on Eason Yang&#39;s Blog</title>
    <link>https://easonyang.com/categories/programming/</link>
    <description>Recent content in Programming on Eason Yang&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 15 Jun 2021 13:39:49 +0000</lastBuildDate>
    <atom:link href="https://easonyang.com/categories/programming/atom.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>单元测试怎么就成了银弹？</title>
      <link>https://easonyang.com/2021/06/15/is-unit-test-a-silver-bullet/</link>
      <pubDate>Tue, 15 Jun 2021 13:39:49 +0000</pubDate>
      <guid>https://easonyang.com/2021/06/15/is-unit-test-a-silver-bullet/</guid>
      <description>&lt;p&gt;近几年国内各厂似乎有将单测覆盖率演变成代码质量硬性标准的势头，你当然可以认为这是内卷的另一种体现，因为千行 bug 率、单测覆盖率等是难得的或许可以「量化」代码质量的手段，但我相信推动者或多或少地有将单元测试作为测试领域银弹的思想，本文就分析分析这种思想所存在的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于腾讯云Serverless的HTTP服务探活函数</title>
      <link>https://easonyang.com/2021/02/21/golang-qcloud-serverless-url-tester-func/</link>
      <pubDate>Sun, 21 Feb 2021 21:57:38 +0000</pubDate>
      <guid>https://easonyang.com/2021/02/21/golang-qcloud-serverless-url-tester-func/</guid>
      <description>&lt;p&gt;本文基于 Golang 开发了一款简单易用的 HTTP 拨测云函数，入口函数与腾讯云 Serverless SCF SDK 绑定。与目前腾讯云中默认的拨测函数不同的是， url-tester-func 支持将非 200 响应码作为预期值且通知机制由邮件变更为了 Telegram Bot 。使用者借助腾讯云提供的免费 Serverless 调用配额即可搭建一套简单的 HTTP 接口探活服务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;功能&#34;&gt;功能&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;周期性探测指定 HTTP 地址是否可正常响应，并将非正常的探测结果发送至指定即时通讯工具的对话中以实现近乎实时地异步监控网站状态&lt;/li&gt;&#xA;&lt;li&gt;支持将 Telegram/Server酱 V1(微信)/Server酱 V2(微信)/Qmsg酱 (QQ，支持单聊及群聊)&lt;/li&gt;&#xA;&lt;li&gt;可识别的包含 Bot 信息的自定义 User-Agent (url-tester-func BOT)&lt;/li&gt;&#xA;&lt;li&gt;基于腾讯云 Serverless SCF ，部署简单且用量小时零成本（具体成本见下文费用说明）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;项目地址&#34;&gt;项目地址&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/MrEasonYang/url-tester-func&#34;&gt;MrEasonYang/url-tester-func&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&#xA;&lt;h3 id=&#34;填写函数配置&#34;&gt;填写函数配置&lt;/h3&gt;&#xA;&lt;p&gt;首先需要根据腾讯云文档创建 Serverless 函数的配置文件, 可参照如下示例配合文档进行配置: &lt;a href=&#34;https://github.com/MrEasonYang/url-tester-func/blob/main/serverless.yaml.example&#34;&gt;serverless.yaml&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;构建&#34;&gt;构建&lt;/h3&gt;&#xA;&lt;p&gt;本地安装 Golang 并构建项目:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GOOS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;linux &lt;span class=&#34;nv&#34;&gt;GOARCH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;amd64 go build main.go&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Podistributor播客分发系统介绍</title>
      <link>https://easonyang.com/2021/02/19/podistributor-cn-readme/</link>
      <pubDate>Fri, 19 Feb 2021 13:27:02 +0000</pubDate>
      <guid>https://easonyang.com/2021/02/19/podistributor-cn-readme/</guid>
      <description>&lt;p&gt;一个基于 Golang 的播客分发程序。&#xA;Github Repo：&lt;a href=&#34;https://github.com/MrEasonYang/podistributor&#34;&gt;MrEasonYang/podistributor&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;特性&#34;&gt;特性&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;向用户暴露节目的别名 URL ，在用户访问时重定向至真实的目标资源 URL ，以高效地进行 CDN 切换和便捷地建立失效转移机制。&lt;/li&gt;&#xA;&lt;li&gt;异步转发请求至统计服务，以解耦用户请求和数据统计，可方便地接入多个数据统计服务或替换失效的统计服务。&lt;/li&gt;&#xA;&lt;li&gt;内建针对数据库的本地缓存层以提供高性能的服务并降低攻击流量带来的影响。&lt;/li&gt;&#xA;&lt;li&gt;内建基于 Prometheus 的监控和统计系统。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>编写Chrome插件来监控URL的变化</title>
      <link>https://easonyang.com/2017/10/24/chrome-plugin-to-monitor-url/</link>
      <pubDate>Tue, 24 Oct 2017 22:45:22 +0000</pubDate>
      <guid>https://easonyang.com/2017/10/24/chrome-plugin-to-monitor-url/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;最近写了个简单的 chrome 插件来简化工作流程，其中一个功能就是对当前页面的 URL 进行监控以根据 URL 中的参数发起网络请求获取数据，本文主要记录本功能相关逻辑的实现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;监控-url&#34;&gt;监控 URL&lt;/h2&gt;&#xA;&lt;p&gt;通过 &lt;code&gt;window.location.href&lt;/code&gt; 就可以轻松获取到当前页面的 URL ，然而想要响应当前页面的 URL 变化则需要对相应事件进行处理。&lt;/p&gt;&#xA;&lt;h3 id=&#34;弹出页获取页面-url&#34;&gt;弹出页获取页面 URL&lt;/h3&gt;&#xA;&lt;p&gt;首先在 manifest.json 中添加对 tab 的操作权限：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;permissions&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;tabs&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>SSL证书的格式与扩展名</title>
      <link>https://easonyang.com/2017/03/20/format-and-suffix-of-ssl-certification/</link>
      <pubDate>Mon, 20 Mar 2017 00:10:59 +0000</pubDate>
      <guid>https://easonyang.com/2017/03/20/format-and-suffix-of-ssl-certification/</guid>
      <description>&lt;h2 id=&#34;编码格式&#34;&gt;编码格式&lt;/h2&gt;&#xA;&lt;h3 id=&#34;pem&#34;&gt;PEM&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;内容：以 &lt;code&gt;-----BEGIN xxx-----&lt;/code&gt; 作为开头，以 &lt;code&gt;-----END xxx-----&lt;/code&gt; 作为结尾，主体部分使用 base64 对 ACII 进行编码。可以储存公钥证书（服务器证书及中检证书，「xxx」为 「CERTIFICATE」）和私钥（「xxx」为「RSA等加密算法名称 PRIVATE KEY」），也可以储存两者的联合，但通常情况下，Apache 等软件都会要求将公钥和私钥分开存储到不同的文件。&lt;/li&gt;&#xA;&lt;li&gt;场景：*NIX 操作系统下普遍倾向于使用这一编码格式。&lt;/li&gt;&#xA;&lt;li&gt;扩展名：&lt;code&gt;.pem&lt;/code&gt; 、&lt;code&gt;.key&lt;/code&gt; 、&lt;code&gt;.csr&lt;/code&gt; 、&lt;code&gt;.cer&lt;/code&gt; 、&lt;code&gt;.crt&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;生成：&lt;code&gt;openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365&lt;/code&gt; 扩展名参照上文&lt;/li&gt;&#xA;&lt;li&gt;查看：&lt;code&gt;openssl x509 -in certificate.pem -text -noout&lt;/code&gt; 扩展名参照上文&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;der&#34;&gt;DER&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;内容：由0、1组成的二进制数据，可以储存任何类型的公钥证书和私钥，不可读。&lt;/li&gt;&#xA;&lt;li&gt;使用场景：Windows 系统 及 Java 平台倾向于使用这一编码格式。&lt;/li&gt;&#xA;&lt;li&gt;扩展名：&lt;code&gt;.der&lt;/code&gt; 、&lt;code&gt;.key&lt;/code&gt; 、&lt;code&gt;.csr&lt;/code&gt; 、&lt;code&gt;.cer&lt;/code&gt; 、&lt;code&gt;.crt&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;生成：&lt;code&gt;openssl req -x509 -newkey rsa:4096 -keyout key.der -outform der -out cert.der -days 365&lt;/code&gt; 扩展名参照上文&lt;/li&gt;&#xA;&lt;li&gt;查看：&lt;code&gt;openssl x509 -in certificate.der -inform der -text -noout&lt;/code&gt; 扩展名参照上文&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;扩展名总结&#34;&gt;扩展名总结&lt;/h2&gt;</description>
    </item>
    <item>
      <title>Unix的IO模型中的同步、异步与阻塞、非阻塞</title>
      <link>https://easonyang.com/2017/02/28/sync-async-blocking-non-blocking-in-unix-io-model/</link>
      <pubDate>Tue, 28 Feb 2017 14:31:18 +0000</pubDate>
      <guid>https://easonyang.com/2017/02/28/sync-async-blocking-non-blocking-in-unix-io-model/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;同步、异步与阻塞、非阻塞这四个概念在多线程、多进程、I/O 相关编程中非常常见。然而在不同的场景下，定义中给不同框架、操作系统功能所打上的标签常常让不熟悉这四个概念区别的人疑惑不已。本文就从许多应用层框架所依赖的 Unix 中的 5 个 I/O 模型来理解这四个概念。&lt;/p&gt;&#xA;&lt;h2 id=&#34;unix-5-大-io-模型简述&#34;&gt;Unix 5 大 I/O 模型简述&lt;/h2&gt;&#xA;&lt;p&gt;在 Unix 中，有 5 种 I/O 模型：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;阻塞式 I/O&lt;/li&gt;&#xA;&lt;li&gt;非阻塞式 I/O&lt;/li&gt;&#xA;&lt;li&gt;I/O 多路复用&lt;/li&gt;&#xA;&lt;li&gt;信号驱动 I/O&lt;/li&gt;&#xA;&lt;li&gt;异步 I/O&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;在类 Unix 系统中，I/O 操作总是分为两个阶段：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;阶段一：内核等待数据到达，并在数据到达后内核将其拷贝到内核的缓冲区&lt;/li&gt;&#xA;&lt;li&gt;阶段二：内核将内核缓冲区中的相应数据拷贝到进程缓冲区&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;同步与异步&#34;&gt;同步与异步&lt;/h2&gt;&#xA;&lt;p&gt;结合生活理解这一对概念，我们假设一个场景：&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决Intellij Idea下从Maven创建项目时Loading archetype list的问题</title>
      <link>https://easonyang.com/2016/08/04/solve-maven-loading-archetype-list-problem-in-intellijidea/</link>
      <pubDate>Thu, 04 Aug 2016 11:16:38 +0000</pubDate>
      <guid>https://easonyang.com/2016/08/04/solve-maven-loading-archetype-list-problem-in-intellijidea/</guid>
      <description>&lt;p&gt;在某些场景下在 Intellij Idea 中使用 Maven 创建项目时会出现一直在 Loding archetype list 的问题，如下图。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
