<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[切糕的技术博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/supergao222</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; supergao222]]></copyright><item><title><![CDATA[etcd 中 raft 算法的使用方法]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/104027514</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/104027514</guid><author>supergao222</author><pubDate>Sat, 18 Jan 2020 09:54:12 +0800</pubDate><description><![CDATA[raft 协议是一个一致性算法，解决多台机器之间数据一致的问题。raft 声称简介明了，可以取代非常复杂的 PAXOS 算法。然而翻看 raft 的论文后，会发现即便声称简洁明了，自己完整地实现 raft 还是很麻烦的。
etcd是一个分布式的 key-value 存储组件，它通过 raft 算法保证多台机器数据的一致性。那么 etcd 中的 raft 算法可以提取出来用在自己的项目中吗？
答案是...]]></description><category></category></item><item><title><![CDATA[100行PHP解析LevelDB SSTable文件]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/100703552</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/100703552</guid><author>supergao222</author><pubDate>Tue, 10 Sep 2019 22:25:39 +0800</pubDate><description><![CDATA[&lt;?php
$data = file_get_contents('testdb/000009.ldb');
$size = strlen($data);
// footer = meta block handle + index block handle + padding + 8-byte magic number
// footer is fixed 48 byte, parse fro...]]></description><category></category></item><item><title><![CDATA[Linux如何将进程绑定CPU核心以提高性能]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/87957270</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/87957270</guid><author>supergao222</author><pubDate>Tue, 26 Feb 2019 23:43:39 +0800</pubDate><description><![CDATA[在Linux系统中，进程的调度切换是由内核自动完成的，在多核CPU上，进程有可能在不同的CPU核上来回切换执行，这对CPU的缓存不是很有利。为什么呢？先看一张 Intel i5 CPU 的缓存简单示意图：

在多核CPU结构中，每个核心有各自的L1、L2缓存，而L3缓存是共用的。如果一个进程在核心间来回切换，各个核心的缓存命中率就会受到影响。相反如果进程不管如何调度，都始终可以在一个核心上执行，那...]]></description><category></category></item><item><title><![CDATA[Nginx中的频控模块示例]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/86620011</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/86620011</guid><author>supergao222</author><pubDate>Thu, 24 Jan 2019 07:58:07 +0800</pubDate><description><![CDATA[简介
陶辉老师《深入理解Nginx》中的示例代码，支持IP+URL级别的频控。
频控以模块的方式嵌入Nginx。采用 红黑树+链表 的方式实现，每当一个IP访问一次URL，红黑树将会插入一个节点，节点包含本次访问时间。
当相同的IP短时间内访问同样的URL时，红黑树就会查找到刚插入的节点，找出上次的访问时间，判断间隔是否够长，间隔太短的会返回 403 Forbidden，间隔够长就允许访问，并把这...]]></description><category></category></item><item><title><![CDATA[《深入理解Nginx》upstream机制完整代码]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/82991175</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/82991175</guid><author>supergao222</author><pubDate>Wed, 10 Oct 2018 07:29:21 +0800</pubDate><description><![CDATA[陶辉老师写的《深入理解Nginx》一书很赞，书中 5.3节 使用upstream的示例 的代码略有缺失，编译通不过，我补充成了完整可跑的，供大家参考。nginx自制模块的编译见书本3.3节。
config文件：
ngx_addon_name=ngx_http_mytest_module
HTTP_MODULES=&amp;quot;$HTTP_MODULES ngx_http_mytest_module&amp;quot;
NGX_...]]></description><category></category></item><item><title><![CDATA[优化Visual Studio Code的自动补全]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/80658525</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/80658525</guid><author>supergao222</author><pubDate>Mon, 11 Jun 2018 21:58:11 +0800</pubDate><description><![CDATA[Visual Studio Code （简称VS Code）是个很棒的代码编辑器，内置多种语言的自动补全功能，写JavaScript也不例外，VS Code提供的自动补全还是很赞的。

不过自动补全功能在有些情况下会失效，比如 document.getElementById() 或 document.querySelector() 返回的对象，是没有自动补全的：



就像图中展示的，canvas...]]></description><category></category></item><item><title><![CDATA[Webpack 4.0 + Vue多页配置]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/80153736</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/80153736</guid><author>supergao222</author><pubDate>Tue, 01 May 2018 08:04:41 +0800</pubDate><description><![CDATA[Webpack 4.0 + Vue 的多页配置，注意 vue-loader 目前还请使用 14.2.2 版本，15版本在编译时会有问题。

package.json



{
  &quot;name&quot;: &quot;learn&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &q]]></description><category></category></item><item><title><![CDATA[Workerman如何在WebSocket响应中添加Header]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/80115609</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/80115609</guid><author>supergao222</author><pubDate>Sat, 28 Apr 2018 08:43:37 +0800</pubDate><description><![CDATA[最近在用 Workerman 学习 WebSocket 的时候，遇到了一个问题：



var ws = new WebSocket('ws://' + document.domain + ':8081', 'encrypt');

结果浏览器报了这个错：


  Error during WebSocket handshake: Sent non-empty ‘Sec-WebSocket-Pro...]]></description><category></category></item><item><title><![CDATA[PHP实现Huffman编码/解码]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/80009059</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/80009059</guid><author>supergao222</author><pubDate>Thu, 19 Apr 2018 18:34:08 +0800</pubDate><description><![CDATA[Huffman 编码是一种数据压缩算法。我们常用的 zip 压缩，其核心就是 Huffman 编码，还有在 HTTP/2 中，Huffman 编码被用于 HTTP 头部的压缩。

本文就来用 PHP 来实践一下 Huffman 编码和解码。



1. 编码



字数统计

Huffman编码的第一步就是要统计文档中每个字符出现的次数，PHP的内置函数 count_chars() 就可以做到：
...]]></description><category></category></item><item><title><![CDATA[PHP内核队列使用一例]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79871675</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79871675</guid><author>supergao222</author><pubDate>Mon, 09 Apr 2018 19:55:58 +0800</pubDate><description><![CDATA[写了一段代码，展示了PHP如何使用内核队列。

场景是：父进程产生消息，放入队列，子进程从队列读取消息，并处理。



&amp;lt;?php
$msg_key = ftok(__FILE__, 'a');
$msg_queue = msg_get_queue($msg_key, 0644);

/**
 * 父进程往队列发送消息
 * @param $msg_queue
 * @param $chil...]]></description><category></category></item><item><title><![CDATA[用 div 实现自制滚动条]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79635016</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79635016</guid><author>supergao222</author><pubDate>Wed, 21 Mar 2018 09:27:35 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/11]]></description><category></category></item><item><title><![CDATA[Bootstrap 4风格的select2下拉框]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79588094</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79588094</guid><author>supergao222</author><pubDate>Fri, 16 Mar 2018 23:14:53 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/8]]></description><category></category></item><item><title><![CDATA[Workerman的reusePort属性详解]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79406206</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79406206</guid><author>supergao222</author><pubDate>Wed, 28 Feb 2018 22:06:53 +0800</pubDate><description><![CDATA[http://math-digital.cn/blog/1]]></description><category></category></item><item><title><![CDATA[Bootstrap4 定制自己的颜色和风格]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79370345</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79370345</guid><author>supergao222</author><pubDate>Sun, 25 Feb 2018 17:47:16 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/2]]></description><category></category></item><item><title><![CDATA[Vue实现带进度条的文件拖动上传]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79348702</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79348702</guid><author>supergao222</author><pubDate>Thu, 22 Feb 2018 17:36:15 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/3]]></description><category></category></item><item><title><![CDATA[不另写CSS，Bootstrap 4 实现步骤条]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79303868</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79303868</guid><author>supergao222</author><pubDate>Sat, 10 Feb 2018 11:23:03 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/9]]></description><category></category></item><item><title><![CDATA[PHP OpenSSL扩展 - 非对称加密]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79293465</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79293465</guid><author>supergao222</author><pubDate>Thu, 08 Feb 2018 20:41:58 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/4]]></description><category></category></item><item><title><![CDATA[PHP OpenSSL扩展 - 对称加密]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79265306</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79265306</guid><author>supergao222</author><pubDate>Mon, 05 Feb 2018 22:11:29 +0800</pubDate><description><![CDATA[https://math-digital.cn/blog/5]]></description><category></category></item><item><title><![CDATA[图解Numpy的tile函数]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79174316</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79174316</guid><author>supergao222</author><pubDate>Fri, 26 Jan 2018 16:47:33 +0800</pubDate><description><![CDATA[Numpy的 tile() 函数，就是将原矩阵横向、纵向地复制。tile 是瓷砖的意思，顾名思义，这个函数就是把数组像瓷砖一样铺展开来。

举个例子，原矩阵：



mat = array([[1,2], [3, 4]])



横向：



tile(mat, (1, 4))
# 等同于
tile(mat, 4)



结果：



[[1 2 1 2 1 2 1 2]
 [3 4 3 4 3]]></description><category></category></item><item><title><![CDATA[Vue多页应用的极简配置]]></title><link>https://blog.youkuaiyun.com/supergao222/article/details/79081392</link><guid>https://blog.youkuaiyun.com/supergao222/article/details/79081392</guid><author>supergao222</author><pubDate>Wed, 17 Jan 2018 09:25:46 +0800</pubDate><description><![CDATA[Vue的官方脚手架工具 vue-cli 提供了很多种已配置好的模板，但这些模板的webpack配置看起来比较麻烦，而且有些配置在项目中也许根本用不到。本文就提供个思路，只保留最必须的代码，搭建出一个Vue多页应用的开发环境。整体思路整体思路如下图。每一个Vue组件，按照官方推荐的方式，写在单独的.vue文件中（图中绿色部分）。经过Webpack编译后，组件会全部打包到 Bundle.js 中，Bun]]></description><category></category></item></channel></rss>