<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[bdss58的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/bdss58</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; bdss58]]></copyright><item><title><![CDATA[go 内存模型和内存顺序(memory model and memory order in go)]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/119704839</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/119704839</guid><author>bdss58</author><pubDate>Sat, 14 Aug 2021 19:21:26 +0800</pubDate><description><![CDATA[内存模型
首先，官方文档有大致介绍
总结下来：
建议
多个goroutines 并发修改数据时候，那就串行化。具体可以用go 经典的channel，再不济用sync包里的 mutex 或者 atomic 也行。
如果你很屌，不想串行化并发控制，那么注意一下几点：
1. happens before
至于 happens before 和 happens after 的具体定义，可以看官方文档。
要知道，单 goroutine 下，hapens before 顺序就是程序书写顺序。
2. package in]]></description><category></category></item><item><title><![CDATA[红黑树演进]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/112427087</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/112427087</guid><author>bdss58</author><pubDate>Sun, 10 Jan 2021 13:30:23 +0800</pubDate><description><![CDATA[看这个 https://www.cs.princeton.edu/~rs/talks/LLRB/RedBlack.pdf，茫然。
看这个 https://zhuanlan.zhihu.com/p/340419231 拾人牙慧。

]]></description><category></category></item><item><title><![CDATA[iptables vs nftables, using firewall-cmd]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/112426238</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/112426238</guid><author>bdss58</author><pubDate>Sun, 10 Jan 2021 12:13:28 +0800</pubDate><description><![CDATA[最近用 firewall-cmd 做一些网络问题上的实验，困惑于本后的工作原理。做了一些quick search，整理一些文章，当作以后备忘吧。
https://medium.com/@iced_burn/compare-firewalld-iptables-nftables-netfilter-de08a8d21b5b
https://ungleich.ch/en-us/cms/blog/2018/08/18/iptables-vs-nftables/#:~:text=IPtables%20is%20ab]]></description><category></category></item><item><title><![CDATA[tcp网络协议图示]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/112062024</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/112062024</guid><author>bdss58</author><pubDate>Fri, 01 Jan 2021 17:26:26 +0800</pubDate><description><![CDATA[作者：小林coding
链接：https://zhuanlan.zhihu.com/p/146752547
来源：知乎
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。


01 TCP 三次握手的性能提升

TCP 是面向连接的、可靠的、双向传输的传输层通信协议，所以在传输数据之前需要经过三次握手才能建立连接。



那么，三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上，在网络状态不佳、高并发或者遭遇 SYN 攻击等场景中，如果不能有效正确的调节三次握手中的参数，就.]]></description><category></category></item><item><title><![CDATA[时间管理大师]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/109553402</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/109553402</guid><author>bdss58</author><pubDate>Sat, 07 Nov 2020 22:26:25 +0800</pubDate><description><![CDATA[时间管理自测
1、电话打扰我的工作，而且无比的冗长。
2、公司内外的人来拜访我，使我无法完成自己的工作。
3、会议时间拖得太长，会议结果效果不佳。
4、推迟要花费大量时间去处理的棘手工作，很难把它们做完，因为很难静得下心来。（能拖就拖）
5、做事没有明确的先后顺序，尝试同时解决很多工作，把太多的时间花费在琐碎的小事上，无法专注于最重要的任务。
6、只有在时间很紧迫的时候，才能按时间表完成任务，因为期间会发生没有预计到的情况，或者是做了太多别的事情。
7、写邮件和读邮件花了太多的时间。
8、与其他人的沟通存在]]></description><category></category></item><item><title><![CDATA[按下键盘计算机具体发生了点儿啥？]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/108966040</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/108966040</guid><author>bdss58</author><pubDate>Thu, 08 Oct 2020 18:18:58 +0800</pubDate><description><![CDATA[indexinterrupt如何通知到CPU？终端处理程序是啥？CPU怎么找到ISR？CPU怎么知道当前中断的interrupt number？
老问题了，在网上搜罗了一圈，没有啥靠谱的回答。其实这种问题，在大学里学习的计算机基础课程里都有很好的回答。可惜网上很少有人能够把这些基础只是串起来。
啥基础知识呢？对于计算机专业的学生来说（cs student)，就是《计算机组成原理》以及《操作系统》两门课。
键盘输入，这种操作就是典型的计算硬件和软件（这里的软件就是OS）相互配合来完成的。咋配合呢？
中断机制
]]></description><category></category></item><item><title><![CDATA[A/B test 实验分层正交]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/108488332</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/108488332</guid><author>bdss58</author><pubDate>Wed, 09 Sep 2020 13:58:02 +0800</pubDate><description><![CDATA[只是想收藏这个gif


]]></description><category></category></item><item><title><![CDATA[Atomic-Operations]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/107062728</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/107062728</guid><author>bdss58</author><pubDate>Wed, 01 Jul 2020 14:05:26 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[查看python进程运行栈]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/106809800</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/106809800</guid><author>bdss58</author><pubDate>Wed, 17 Jun 2020 15:46:50 +0800</pubDate><description><![CDATA[reference
首先保证进程运行机器上有GDB和pyrasite
# Redhat, CentOS, etc
$ yum install gdb

pip install pyrasite

找到卡住的python进程ID，然后用pyrasite-shell attach上去
# Assuming process ID is 12345
$ pyrasite-shell 12345

进入 python repl 环境，然后输入
from __future__ import print_function]]></description><category></category></item><item><title><![CDATA[随机提问 --- 持续更新]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/106783506</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/106783506</guid><author>bdss58</author><pubDate>Tue, 16 Jun 2020 11:16:59 +0800</pubDate><description><![CDATA[操作系统内核态运行占用虚拟内存么？为什么？

]]></description><category></category></item><item><title><![CDATA[数字签名与认证]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/104347543</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/104347543</guid><author>bdss58</author><pubDate>Sun, 10 May 2020 23:22:10 +0800</pubDate><description><![CDATA[https 协议在真正进行 http 通信之前，需要 浏览器与服务器 之间协商好加密密钥，而在协商之前，浏览器会先验证服务器的合法性。怎么验证浏览器的合法性呢？肯定需要第三方认证机构的支持，这个第三方就是CA机构。
CA机构
CA机构会给浏览器和服务器各自一个证书：

浏览器这边边的这书保存的是CA给服务器分配的公钥，比如：





服务器
公钥




baidu.com
key.pub A
...]]></description><category></category></item><item><title><![CDATA[tcpdump 速查]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/105408859</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/105408859</guid><author>bdss58</author><pubDate>Thu, 09 Apr 2020 13:50:59 +0800</pubDate><description><![CDATA[basic
tcpdump -nvvv -i any

-n: 打印ip port, 而非hostname, portname
-v: verbose, -vvv 三级 verbose
-i：指定网络interface
针对IP port 进行过滤
tcpdump -nvvv -i any -c 20 '(port 80 or port 443) and host 10.0.3.169'

打印包...]]></description><category></category></item><item><title><![CDATA[既然有GIL了那么为什么在python中多线程编码时候还需要加锁？]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/104069418</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/104069418</guid><author>bdss58</author><pubDate>Wed, 22 Jan 2020 15:37:55 +0800</pubDate><description><![CDATA[GIL
由于 python 解释器（Cpython interpreter）不是线程安全（thread-safe）的，所以 Cpython interpreter 的实现中使用了GIL（global interpreter lock)来阻止多线程同时在一个 pyobject 上操作。这里所说的 “不是线程安全“ 是指Cpython interpreter在内存管理上不是线程安全的。比如，两个线程同...]]></description><category></category></item><item><title><![CDATA[ssh 代理设置]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103408001</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103408001</guid><author>bdss58</author><pubDate>Thu, 05 Dec 2019 16:50:51 +0800</pubDate><description><![CDATA[1. 直接指定命令参数
- o 指定 ProxyCommand 。可以通过 ProxyCommand 告诉 ssh client 如何与代理进行通讯，通过代理与运程主机建立 ssh 链接。
ssh -p 36000 -o "ProxyCommand corkscrew  127.0.0.1 12759 %h %p" -o "ControlMaster auto" -o "ControlPath ~...]]></description><category></category></item><item><title><![CDATA[命令行（bash）并发请求（压测）server]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103341659</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103341659</guid><author>bdss58</author><pubDate>Sun, 01 Dec 2019 23:53:27 +0800</pubDate><description><![CDATA[while :; do for i in $(seq 4); do time PYTHONIOENCODING=utf-8 PYTHONHOME=venv http_proxy= venv/bin/python client.py 127.0.0.1 &amp; pids[$i]=$!; done; for pid in ${pids[*]}; do wait $pid; done; done

...]]></description><category></category></item><item><title><![CDATA[python 虚拟环境设置]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103204360</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103204360</guid><author>bdss58</author><pubDate>Fri, 22 Nov 2019 17:18:11 +0800</pubDate><description><![CDATA[参考下面的 shell 脚本设置
#! /bin/bash
set -eu

# generate python2.7 project
# it's the first time that I generate  project using python2.7 last week
# it took me a lot of time to handle the python2.7 virtual ...]]></description><category></category></item><item><title><![CDATA[检查环境变量设置]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103203885</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103203885</guid><author>bdss58</author><pubDate>Fri, 22 Nov 2019 16:57:43 +0800</pubDate><description><![CDATA[问题: 如何找到 LC_CTYPE 这个环境变量在哪儿定义的？
可以按照下面顺序检查
Some places to look first:

System wide

/etc/environment: specifically meant for environment variables
/etc/env.d/*: environment variables, split in multipl...]]></description><category></category></item><item><title><![CDATA[保留当前环境变量执行 sudo 操作]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103198347</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103198347</guid><author>bdss58</author><pubDate>Fri, 22 Nov 2019 11:51:21 +0800</pubDate><description><![CDATA[当执行
sudo "command"

或者
sudo bash -c "your command or scripts"

时候，你在当前执行当 interactive shell 上设置当环境变量或者定义在自己的 login shell 初始化脚本（比如~/.bashrc, ~/.bash_profile）里的环境变量不会生效。
如何让这些变量在 sudo 情况下生效呢？
sudo -E ba...]]></description><category></category></item><item><title><![CDATA[python repl 无法显示中文或者报错]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/103034401</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/103034401</guid><author>bdss58</author><pubDate>Tue, 12 Nov 2019 17:24:24 +0800</pubDate><description><![CDATA[尝试设置环境变量
export PYTHONIOENCODING=utf-8
`


]]></description><category></category></item><item><title><![CDATA[golang 标准库 http 的 client 为什么必须手动关闭 resp.Body]]></title><link>https://blog.youkuaiyun.com/bdss58/article/details/102225632</link><guid>https://blog.youkuaiyun.com/bdss58/article/details/102225632</guid><author>bdss58</author><pubDate>Sun, 06 Oct 2019 14:21:36 +0800</pubDate><description><![CDATA[使用 golang http client 请求，我们通常是这么干的
resp, err := http.Get(...)
if err != nil {
..
}
defer resp.Body.Close()

为啥必须 resp.Body.Close() 呢？
回答这个问题其实需要回答两个问题：

resp.Body.Close() 做了啥？
为啥这么做？

1  resp.Body.Clo...]]></description><category></category></item></channel></rss>