-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Notes] 不足以构成Post的笔记,记录在此,持续更新 #20
Comments
Linux I/O 多路复用
参考:epoll详解和使用 |
Golang 反射三大定律:
|
a%(2^b) 如何用位运算实现? a&(1<<b-1) |
Go语言中的map是用hashtable实现的,解决哈希碰撞是用的拉链法。即数组+链表的组合,go源码中将链表称为bucket,桶。 topbit 保存的是某个key hash之后得到的数的高八位,如下图中的hashtop实现: 每个bucket最多可以保存八个elem,然后查询的时候,go可以利用topbit来快速的进行比对(而不是通过key的比较),加快查询速度。同时为了优化内存布局,每个bucket中的key、value是分开集中存储的(见bucket结构图) 参考: |
关于字节对齐的一篇文章 Data alignment: Straighten up and fly right ---- Updated 2020.10.31 ---- 今天在查原子操作相关资料又涉及到了这个字节aligned话题。这些话题说实话,跟底层硬件结合的挺紧密的,不像我们写业务代码,只需要关注业务逻辑。 要理解字节对齐产生的原因,需要知道三个东西:
|
为什么我们除了IP地址还需要MAC地址?
|
UNIX-LIKE 系统下如何设置daemon进程/让进程后台运行? 比如我用的是ubuntu桌面版本,因为有很多常用的软件是没有ubuntu版的(netease musical、wechat、qq),然后从github或其他办法下载到其他开发者实现的版本,往往是一个二进制可执行文件。 一般会先设置.bashrc快捷命令,然后比如在shell里执行wechat,但是这些大部分软件自身是没有实现daemon代码的,所以会在前台执行,然后hang住当前terminal,并且关闭当前terminal软件也会退出(相比之下,vscode就不会出现这种情况,自身实现了daemon化)。显然这并不是我们所期望的,so... 常见的办法,利用nohup和&的组合: 比如上面这条命令,之后在shell里输入calc,就可以直接打开gnome自带的calculator,并且退出terminal也不会对应用自身有任何影响。并将应用的stdin/stdout重定向到/dev/null,/dev/null代表空设备,这样控制台不会有应用相关的输出显示。 那,有的应用可能要sudo权限,你又想后台运行,如何做?利用 sudo -b: 有的应用不同,他可能是作为service一直要运行在后台,并且退出需要restart的。这时候就应该使用systemd来创建service。 参考链接: https://lo-li.cn/1168 |
io.Copy因为无法确定reader的大小,所以采取的策略是开一个buf字节数组,循环对Reader进行read(buf)操作,然后对Writer执行write(buf) bytes.NewReader/strings.NewReader适用于已经得到完整的字节切片数据了,直接构建Reader bytes.Buffer当未得到完整数据,或者是需要不断写入的场景时,new bytes.Buffer是更好的选择。它会自动地帮我们进行扩容来存储写进的数据 io.TeeReader(r Reader,w Writer) Readeroverride了r的Read方法,当调用r.Read(buf)时,内部也会调用w.Write(buf) |
Linux下快速找到占用端口的PID:lsof -i:PORT_NUMBER 在配合kill命令即可结束占用端口的对应进程 |
Mysql 目前仍然不支持text类型字段设置默认值,会报错 google也没看到官方一个明确的说法(一个靠谱的说法是因为text的实现机制与其他类型不同,单独存储),只能在应用里显式设置了 |
|
Golang : for range internalsgolang中的for range底层实现跟python不太一样。可以认为是在进行for range操作时,是对当时的range的对象进行了拷贝,然后对拷贝对象进行for range。所以在for range里对原range对象进行操作,不影响当下的for range |
bytes.Buffer -> io.Pipe 避免潜在的内存开销和垃圾回收 |
有限状态机(FSM)一般我们说状态机特指有限状态机。而有限状态机又分为确定有限状态机,不确定有限状态机(一个状态对于一个输入可能又多个状态转移路径)。 设计优化的流程:不确定有限状态机 -> 确定有限状态机 -> 最小确定有限状态机 |
Gorm Select某些时候,我们只select了一个字段,并且这个字段的类型为基础类型(int,string,etc) 但是直接用First会报错:destination should be slice or struct 这个时候,可以“回退”到标准库的database/sql用法: |
json.Marshal时关于slice的注意点:
a=="[]" b=="null" |
Golang 数据库操作是否可以通过context来取消?这里的数据库特指Mysql,其它的不了解。 我们知道在golang中可以利用context包来实现goroutine的“终止”。那当goroutine里的操作为db操作,在golang里cancle后,如果数据库已经在执行对应的statement,是否也会终止呢? 答案是否定的。我们都知道标准库database/sql内含一个db的连接池,每次db操作都会先从池子里去取。而如果需要terminate对应的sql语句,实际上也就是我们在terminal里使用的 所以一种解决方案是起一个独立conn,获取其connction_id,在该conn上执行sql语句,并在cancel的时候执行 |
一篇很好的讲述mysql连接&&语句执行的文章https://mysqlserverteam.com/mysql-connection-handling-and-scaling/ |
数据库中的
|
什么是闰秒,为什么会有闰秒,各个时间系统的诞生背景
1.格林尼治标准时间 2.协调世界时
3.闰秒 |
为什么需要 atomic load and store pointer这篇golang groups里有关的讨论:https://groups.google.com/g/golang-nuts/c/BZ-BTHQ9IYo 总结下来,还是底层硬件实现的差异化:
|
Mysql: Lock wait timeout exceeded; try restarting transaction最近一个代码的bug,大致逻辑就是在一个for循环里,每个循环开启一个事务,然后defer Close()。在某些场景下,会导致报如上的错误。 最终定位是因为所使用的mysql默认事务隔离级别是RC,在RC级别下,在事务A里对某行的更新(update),会使得事务A持有该行行锁;如果此时开启事务B,由于RC,导致业务逻辑也会走到更新该行,那便需要持有该行行锁。但是我们是用的defer,导致事务A没有及时commit,导致事务B等待行锁超时,报错返回。 解决方式也很简单,显式调用下tx.Commit。当然了,这是表因,根因的话其实还是需要深入了解innodb各个事务隔离级别下的事务实现(Todo |
Golang http client Do 方法源码阅读(概览最近遇到一些关于http 1.1 协议实现的问题和golang在实现上的一个小坑,于是整体浏览下do的工作流程。
Notice:
|
分享一个游戏安全的pdfTenProtect Conficential 顺带元旦第一天把cheat engine的9个tutorial给做了,更完整地熟悉了下ce地使用和wg原理。(最一开始接触到ce,还是百度云盘会员300s试用地时候:) ) |
聊聊 WebScoket和HTTP/2不说他们的具体实现细节吧,就譬如协议的位结构是怎样的啊,这种直接看rfc就好了 说说它们的异同和使用场景。http/2其实基本就是google spdy协议的标准化,将文本协议换位二进制协议,多路复用,支持hpack头压缩算法和其它的一些功能(grpc使用的http/2) websocket的出现则是为了解决服务器和客户端实时通信的痛点,在之前可能都是通过长轮询的方式来做,开销大且并不实时 所以,它们虽然都是二进制协议,都是基于tcp的应用层协议,http2目的主要为了解决ping-pong响应式的http请求的性能优化(不必再每个请求建一次tcp链接,不会有阻塞问题等);而websocket则是解决实时问题,适用于聊天室,实时协同编辑的场景 |
CPU位数的含义:cpu在一个时钟周期内能够处理的位数,也称作字长 CPU位数与地址总线位数的关系:没有必然联系,一般32位cpu地址总线为32位,64位cpu为36或4x位 CPU位数和操作系统位数的关系:一般相同,但是因为cpu64位兼容32位运行模式(向后兼容)。所以32位的操作系统也可以run在64位cpu上 物理地址和逻辑地址的关系编程中获取的指针地址都是va,会经由OS(还有专门的硬件辅助MMU)转换成物理地址 操作系统位数和编程语言中指针大小的关系这个理解起来可能有点难,因为实际上涉及到很多因素。我个人理解,一般来说,因为指针存储的是地址编号,本质也是一个数值(即数据),所以需要跟cpu位数(cpu寄存器)匹配。所以64位cpu的指针一般就是64位(除开运行在32位模式和一些非通用的cpu) Ref |
Golang http client 在处理302跳转的逻辑http包里的client在302跳转的时候会继承原有的header,除了带有私密,安全属性的header。譬如cookies,authentication。这些带有安全性质的header会进行一个check,比如校验是否域名相同或是否为子域,否则时不回带上原有cookie的。 比如 m.tiktok.com -> www.tiktok.com , Cookie Header是不会继承的 同理,cookieJar也时会进行类似的安全校验 ---- Updated 2021.4.18 ----Golang对query的处理逻辑也需要注意。譬如net.URL.Query().Encode(),内部实现是先unescape再escape,并且unescape return error 的pair会直接丢弃——对于rawquery为 |
Linux条件变量pthread_condition细节 |
No description provided.
The text was updated successfully, but these errors were encountered: