<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[一介码农]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/FrancisHe</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; FrancisHe]]></copyright><item><title><![CDATA[如何排查 configure 问题——以使用 LibreSSL 替换 OpenSSL 编译 axel 为例]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/137226438</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/137226438</guid><author>FrancisHe</author><pubDate>Mon, 01 Apr 2024 12:07:29 +0800</pubDate><description><![CDATA[查看 configure 脚本发现，check 函数的过程是编译+链接，说变要么编译出错，要么链接出错，要是能查看编译和链接的详细参数就迎刃而解了。在我们编译出了静态的 LibreSSL 库之后，就要想办法怎么让 axel 使用私有目录的 LibreSSL 库。因此，解决这个问题就变成了升级 OpenSSL 以及使用静态库（因为升级生产环境所有机器的 OpenSSL 库不现实）。由于 LibreSSL 是 OpenSSL 的 fork, 因此，本质上它也是 OpenSSL, 我们通过。]]></description><category></category></item><item><title><![CDATA[如何找到 rpm 包对应的源码]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/137225499</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/137225499</guid><author>FrancisHe</author><pubDate>Mon, 01 Apr 2024 11:15:09 +0800</pubDate><description><![CDATA[有些比较古早的 rpm 包通过项目官网可能并不一定能找到对应源码的 tag, 排查问题时代码行可能对不上，因此，我们需要通过 rpm 发行方找到对应的源码。]]></description><category></category></item><item><title><![CDATA[如何正确使用 HTTP proxy]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/84667562</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/84667562</guid><author>FrancisHe</author><pubDate>Fri, 30 Nov 2018 20:31:13 +0800</pubDate><description><![CDATA[目录两种 HTTP 代理Proxy 如何获取目标服务器地址两种 request-URL 格式如何代理 HTTPS编程实现
两种 HTTP 代理
第一种是 RFC 7230 - HTTP/1.1: Message Syntax and Routing（即修订后的 RFC 2616，HTTP/1.1 协议的第一部分）描述的普通代理。其代理过程为：

client 请求 proxy
proxy 解析请求...]]></description><category></category></item><item><title><![CDATA[MySQL 并发场景下如何避免插入重复行]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/83831030</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/83831030</guid><author>FrancisHe</author><pubDate>Wed, 07 Nov 2018 20:17:11 +0800</pubDate><description><![CDATA[目录
文章目录目录场景问题解决方案LOCK TABLEINSERT IGNORE
场景

先查询，不存在则插入，存在则更新
更新需依赖于之前的记录并做复杂的计算，无法使用 “INSERT … ON DUPLICATE KEY UPDATE” 解决

问题
两个请求 A 和 B 如果同时到来，那么可能出现以下序列：

A select 记录不存在
B select 记录不存在
A 插入
B 插入

...]]></description><category></category></item><item><title><![CDATA[lsof - 根据 fd 或 socket 查找打开的文件或读写地址]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/80171949</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/80171949</guid><author>FrancisHe</author><pubDate>Wed, 02 May 2018 20:59:50 +0800</pubDate><description><![CDATA[通过日志发现某个进程一直阻塞在某处，通过 strace 查看系统调用：

$ strace -p 9441
Process 9441 attached
recvfrom(22, 

发现阻塞在读 22 socket 上，由于进程连接的地址非常多，想通过目前的信息找到进程是阻塞在哪类连接的读取上：

$ lsof -p 9441 | grep 22u
python  9441 userxxx   2...]]></description><category></category></item><item><title><![CDATA[C++11 bind]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/79996433</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/79996433</guid><author>FrancisHe</author><pubDate>Wed, 18 Apr 2018 20:39:34 +0800</pubDate><description><![CDATA[// bind example
#include &amp;lt;iostream&amp;gt;     // std::cout
#include &amp;lt;functional&amp;gt;   // std::bind

// a function: (also works with function object: std::divides&amp;lt;double&amp;gt; my_divide;)
double my...]]></description><category></category></item><item><title><![CDATA[DNS 工作机制全面剖析与应用探究]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/78715843</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/78715843</guid><author>FrancisHe</author><pubDate>Wed, 06 Dec 2017 21:35:30 +0800</pubDate><description><![CDATA[Hierarchy of DNS servers
域名解析过程
迭代式查询与递归式查询
DNS records
DNS caching
TTL 值设置多少合适
Anycast
Geolocation-aware DNS
如何获取来源 IP
ECSEDNS Client Subnet]]></description><category></category></item><item><title><![CDATA[Python函数参数默认值的陷阱和原理深究]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/78045147</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/78045147</guid><author>FrancisHe</author><pubDate>Wed, 20 Sep 2017 20:35:04 +0800</pubDate><description><![CDATA[本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害，以及其实现原理和设计目的]]></description><category></category></item><item><title><![CDATA[Nginx/OpenResty 谨慎配置 8.8.8.8 作为 DNS server]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/75452442</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/75452442</guid><author>FrancisHe</author><pubDate>Wed, 19 Jul 2017 22:31:33 +0800</pubDate><description><![CDATA[问题Nginx resolver 配置：resolver 127.0.0.1 8.8.8.8;项目中两处使用域名，一处为外网 CDN 域名，一处为 MySQL 集群域名（可能为内网私有域名，也可能为外网共有域名）。 
部署完之后测试两处都能正常解析，但运行一段时间之后会报 db.example.com could not be resolved (3: Host not found) 错误。分析用]]></description><category></category></item><item><title><![CDATA[FTP 协议那些事 - 弱网络传输、防火墙与代理]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72886297</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72886297</guid><author>FrancisHe</author><pubDate>Tue, 06 Jun 2017 18:55:01 +0800</pubDate><description><![CDATA[主动模式与被动模式和 HTTP 不同的是，FTP 采用两条链路通信，一条链路只做控制，一条链路只做数据传输。控制链路传输控制命令，数据链路传输文件内容或命令的输出结果，控制链路 server 监听 well-known 端口（默认 21），数据链路端口使用视传输模式而定。
被动模式（默认）
所谓被动模式，是指 server 端的数据连接是被动打开，即 server 监听某端口，client 连接该端]]></description><category></category></item><item><title><![CDATA[FTP 代理过程分析 - 使用 ftp.proxy]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72884427</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72884427</guid><author>FrancisHe</author><pubDate>Tue, 06 Jun 2017 16:10:14 +0800</pubDate><description><![CDATA[与 HTTP 代理相比，FTP 代理要特殊很多，因为 FTP 要使用随机端口来传输数据，端口号在运行时确定并通过控制链路（控制链路传输 FTP 命令和响应，数据链路传输文件内容）传输，因此代理服务器必须要解析控制链路的响应或请求并替换。HTTP 代理就要简单很多，客户端与 proxy 通信，并将 Host header 填成 real server 的地址，proxy 之间将整个 TCP messa]]></description><category></category></item><item><title><![CDATA[Quorum 机制在开源分布式系统中的应用]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871952</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871952</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:05:15 +0800</pubDate><description><![CDATA[IntroductionA quorum is the minimum number of votes that a distributed transaction has to obtain in order to be allowed to perform an operation in a distributed system. 
A quorum-based technique is imp]]></description><category></category></item><item><title><![CDATA[DNS 是否适合做容灾]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871948</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871948</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:04:40 +0800</pubDate><description><![CDATA[场景客户端：外网游戏玩家 
服务端：外网游戏玩家直连服务。部署架构如下：     ServerA
    /   |   \
   /    |    \
LB1    LB2    LB3
   \    |    /
    \   |   /
     ServerBDNS: example.com –> IP1(LB1), IP2(LB2), IP3(LB3)游戏客户端通过 example.]]></description><category></category></item><item><title><![CDATA[HTTP Message Length]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871929</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871929</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:02:53 +0800</pubDate><description><![CDATA[The transfer-length of a message is the length of the message-body as it appears in the message; that is, after any transfer-codings have been applied. When a message-body is included with a message, t]]></description><category></category></item><item><title><![CDATA[MySQL 记录被删除之后 AUTO_INCREMENT 值被复用问题分析]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871924</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871924</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:02:11 +0800</pubDate><description><![CDATA[结论
MyISAM 不会出现删除掉的 AUTO_INCREMENT 字段值被复用的问题，因为这个最大值会被写磁盘，每次初始化会从磁盘读取
InnoDB 会出现删除掉的 AUTO_INCREMENT 字段值被复用的问题，因为这个最大值不会写磁盘，每次都是用类似 SELECT MAX(ai_col) FROM table_name FOR UPDATE; 的方式初始化。
参考InnoDB AUTO_IN]]></description><category></category></item><item><title><![CDATA[多线程程序谨慎给 DB 加锁]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871922</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871922</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:01:49 +0800</pubDate><description><![CDATA[场景ServerA 起 N 个线程，每个线程执行相同的逻辑，就是去 DB 取一个待执行的任务来执行，也就是常见的任务队列。具体逻辑是：
lock tableA
get 1 new task
update task status
unlock tableA
execute task
lock tableA
update task status
unlock tableA
问题由于程序存在 bug, 但]]></description><category></category></item><item><title><![CDATA[巧用 MySQL 自定义变量一条语句实现 UPDATE + SELECT]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871910</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871910</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:00:51 +0800</pubDate><description><![CDATA[示例mysql> select * from t_job_queue order by id desc limit 1;
+------+--------+---------------+---------------------+------------+------------+
| id   | status | params        | result              | up]]></description><category></category></item><item><title><![CDATA[使用 MySQL 实现无锁任务队列(using MySQL as a job queue)]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871905</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871905</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 22:00:23 +0800</pubDate><description><![CDATA[场景N 个生产者往 db 里面插入新任务，N 个消费者从 db 取出新任务执行并更新任务状态为“已执行”。CREATE TABLE `t_job_queue` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `status` INT NOT NULL DEFAULT '0',
  `params` VARCHAR(1024) NOT NULL DEFAULT '',]]></description><category></category></item><item><title><![CDATA[OpenResty 中不当使用 MySQL 连接池导致事务被回滚]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871895</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871895</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 21:59:33 +0800</pubDate><description><![CDATA[场景为了使用方便，server 封装了一个执行 SQL 语句的函数：function query_db(sql)
    db, err = mysql:new()
    ok, err = db:connect(host, port, ...)
    res, err, errcode, sqlstate = db:query(sql)
    ok, err = db:set_keepali]]></description><category></category></item><item><title><![CDATA[使用 Nginx 搭建 HTTPS 服务器]]></title><link>https://blog.youkuaiyun.com/FrancisHe/article/details/72871877</link><guid>https://blog.youkuaiyun.com/FrancisHe/article/details/72871877</guid><author>FrancisHe</author><pubDate>Mon, 05 Jun 2017 21:57:22 +0800</pubDate><description><![CDATA[SSL/TLS client/server 交互过程浅析握手阶段server 下发证书给 client, 证书中包含 server 的公钥(public key), 但证书是使用第三方私钥加密的（这里的私钥不是 server 的私钥，通常为 CA 机构的私钥，不做特殊说明，本文默认证书是 CA 机构签发的证书），client 拥有 CA 机构的公钥，因此可以解密证书，获取 server 下发的公钥。]]></description><category></category></item></channel></rss>