一些常用位运算技巧
int v; // 需要获得 v 的符号 int sign; // 结果
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
int v; // 需要获得 v 的符号 int sign; // 结果
本文介绍一些 C/C++ 中宏的正常用法。 以及一些你绝对不会想让你家孩子知道的令人惊叹的技术。
这是几年前在一个系统中的 DEBUG 经历,最近又发现了类似的错误,觉得应该 分享出来。
物理计算中,数值都不是独立的,大多数物理量都附带有量纲。 随着计算变得越来越复杂,维持物理量的正确量纲能够避免诸 如“将质量赋给长度”之类不经意间犯下的错误。我们接下来就 要为数值建立一个类型系统。
本文中我们尝试以标准库编写者的身份实现C++标准程序库里最简单的 算法之一:iterswap。它卑微的职责就是接受两个迭代器 并交换他们各自指向的对象的值,就像这样:
C++ lambda 表达式 出现10多年了,还是有人不甚了解。这就是 C++ 最垃圾的地方: 你需要知道编译器是怎么做的,才能真正理解它的语法。本文是对 C++ lambda 表达式的一个简述,争取做到深入浅出彻底理解。注意我们不讲 Lambda 演算。
C++代码中嵌入C语言,是可能的;C语言中嵌入C++也是可能的。这里将介绍如何将它们混编, 如何解决混编时出现的问题。
typename 和template 并不仅仅出现在模板参数中,例如下面的这个例子:
文本编辑器里的 "undo" 和 "redo",数据库系统的 MVCC,git 的历史记录,mac 的 Time Machine,等等功能,他们都有一个共同点,就是记录历史。这个功能依赖一种数据结 构:持久化数据结构 (Persistent data structure)。持久化数据结构记录所有历史版本, 你可以读取任…
二分查找,也叫 binary search,half-interval search,logarithmic search, binary chop,是在可随机寻址的有序列表中根据元素的值查找元素的位置的算法。它拥有和 排序二叉树相似的查询效率,也就是 $O(\log n)$ 的时间复杂度。通俗的讲,在一个长度为 $n…
高频数据项问题 (Heavy Hitters),在互联网时代有许多应用场景,如计算热门 商品、计算热搜、识别高流量的TCP流、识别高频交易的股票。计数再排序的方 法太消耗内存了,本文介绍一个 \( O(n) \) 时间,常量空间的概率算法,解决 这个问题。
字符串匹配,是开发工作中最常见的问题之一。它要求从一个较长的字符串中查找一个较短 的字符串的位置。例如从字符串 $Tbacbababaabcbab$ 中查找字符串 $Pababaca$ 的位置。 $T$ 称为主串, 字符串 $P$ 称为模式串。
正则表达式,是计算机科学史上闪闪发光的优秀理论:有好的理论,好的代码, 好的程序,应用广泛。70 年代末,正则表达式已经成为 unix 的关键特性,并 且拥有大量以正则表达式为主要功能的优秀程序: ed, sed, grep, egrep, awk, lex。如今,正则表达式在程序设计中被广泛使用。
我在超过10个土法炼钢项目里看到有问题 CBC 用法了。
一次一密是安全性最高的加密算法,除非使用不当。本文介绍一次一密的原理、 使用方法、使用不当时会发生什么、以及它的缺陷。
函数依赖: 设R(U)是属性集U上的关系模式。X,Y是U的子集。若对于R(U)的任意一个 可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不相等, 则称X函数确定Y或者Y函数依赖于X。记为X->Y。
Leveldb 实现了key-value形式的缓存,淘汰算法是LRU。实现代码在 leveldb/util/cache.cc,一共400行,非常简洁。我曾以为他提供的一些逻辑是多余的,在 工作中遇到同样需求时尝试精简这个实现,后来发现我是错的,最终只改了注释上的拼写错 误。
leveldb是个由Google开发key-value数据库,具有很高的写性能,但是读比较慢。现实世界 大多数应用都是写多读少的,所以有人用leveldb作为数据库的存储引擎。直接使用leveldb 的项目比较少见,最常见的是使用 rocksdb,rocksdb是facebook基于leveldb的项目,做了 一些优化…
在真实世界中,任何电子原件或软件系统都会故障。为了在混乱的世界里寻得一 丝安心,提出了高可用的概念。高可用 (High availability, HA) 是互联网时 代常被提及的词语。在产品设计、开发、发布、交付过程中,通常都会提到一个 系统的可用性,提到系统是否保证高可用。本文介绍高可用的意义,而后演示一 个系统…
"将请求封装成对象,从而允许对象经过队列、允许日志打印、支持撤销和恢复。 " —— 这就是命令模式的全部内容。
一直使用 doxygen 生成 C 程序库的文档,还是相对简单的,只要按照它的注释格式给每个 符号写注释就可以。 有一个人忽然说要中文的PDF文档,别的格式还不行,确实折腾了一番。 主要是因为 latex 的中文支持我到现在都没明白。 这里把整个支持的过程记录下来,希望 能对有相同需求的朋友提供帮助。
内存碎片化是内存回收器需要解决的问题之一。尽管堆中仍有可用空间,但是内存管 理器却无法分配找到一块连续内存块来满足较大对象的分配需求,或者需要花费较长 时间才能找到合适的空闲内存,这就是内存碎片化的问题。
原文链接: Handling 1 Million Requests per Minute with Go
libevent 封装了底层多路复用接口,让我们可以更方便地跨平台使用异步网络IO。同时, libevent 还实现了定时任务,使用它我们就不用自己实现一遍了,还是比较方便。
这是我第一次使用 kubernetes,它是个使用容器技术,帮助我们管理多个主机或虚拟机上的计 算、存储、网络资源,让服务集群的部署、升级、扩展变得更容易的软件工具。 部署过程 遇到许多问题,这里把经验记录下来,希望将来对他人有所帮助。
网络程序的开发少不了缓冲区,用来保存即将发送出去的数据,以及已经收到但尚未处理或 解码的数据。实现方法大同小异,libevent 的缓冲区实现也跟其它实现有很多共通之处, 了解它的实现,可以达到举一反三的目的,对今后根据业务需要实现自己的缓冲区也有一些 借鉴作用。
几乎每次阅读 linux 源码都会遇到 ACCESSONCE,它是用来干什么的, 以及它如何做到的呢?
Daemon进程生命周期长且在后台运行。编写daemon进程需要遵循哪些规则呢?
内核进程struct taskstruct中有一个保存这个进程文件表的字段taskstruct->files。
SYN 是 TCP 三次握手的一部分,开发网络应用时通常不会关注,但它与请求中偶发 的长时延 (latency spike) 密切相关,是服务器维护环节中不可忽视的重要部分。如果 SYN 在发送过程中丢包了,通常客户端会在 1s, 3s, 7s, 15s, 31s 后重,这就是长延迟 的来源之一。备受游戏公司困扰的 S…
sysctl -w net.ipv4.tcptimestamps0
./men-hir.png
redis 的代码清晰不卖弄,也有很详细的注释,如果已经开始阅读代码,这篇不 算详细的文章是多余的。但是,如果你拿到了一份代码但不知道何处入手,也许 阅读代码时参考本文是个不错的选择。
# /etc/sysctl.d/zzz-mysysctl.conf fs.nropen2000000 fs.file-max2000000
Linux内核实现了4种调度类,优先级从高到低分别是:
linux (本文使用linux4.8.4) 下,进程状态大致有7种。
并行,是目前计算机领域性能优化的主要方法。指令级并行让编译器优化技术火 热好几年,近年数据级并行因为人工智能的普及也有不小的发展。分布式架构、 微服务、云原生,让软件的并行变得更简单。
访问权限的行为。一般指利用安全缺陷绕过限定的访问限制,拿到更高的访问 权限。
本文介绍怎么安全地把密码存储在数据库里。简短地说:去看 OWASP 规则。
本以为 Web 技术发展那么久,XSS、SQL注入、CSRF 这类过去常见的漏洞已经被处理得很好 了。最近工作发现并不是这样的,可能就是因为框架和工具把这些事情做得很好了,大家都 忘记了这些漏洞的存在,及时使用了框架也没有把它们提供的漏洞预防功能使用起来。我觉 得即使是今天,了解常见的安全漏洞类型也是必要的。
我们经常需要在脚本中获取命令行参数,而 getopts 就是实现解析命令行参数 的可靠工具,但也有它的局限性。 getopts 在频繁使用的小脚本中,getopts 可以说是完美的选择,它可以让你写更少的代 码:
# 去前面空格 var"${var#"${var%%[![:space:]]}"}" # 去后面空格 var"${var%"${var##[![:space:]]}"}" # 去掉首尾空白 trimstring() { # Usage: trimstring " example string " : "${1#"${1…
一致性哈希是现代分布式系统最常用的算法,它能让数据节点增减变化时,尽可 能地保持原来再某个节点上的数据仍然还在那个节点上。最初,一致性哈希被应用 peer-to-peer 网络上,最开始是Chord,后来也被用在 BitTorrent 上。如今, 所有的分布式数存储都用了,大概是 Amazon 的 Dynamo 的文章…
网络服务中,限流器用于控制一个客户端的请求频率或数据速率。速率限制 器常见的场景如下:
都说架构是演化出来的,而不是设计出来的,有一定道理。
JSON Web Token (JWT, 发音为 "jot") 是一个附带签名的字符串,常常作为服务调用的令牌。作为令牌时, 由于 JWT 可以附带 Session 信息,可以简化服务逻辑,在微服务结构盛行的今天应用广泛。 互联网上单点登录和身份管理的通用标准 OpenID Connect 也使用 JWT 作为身份令牌…
OAuth2 是互联网中广泛使用的授权标准,常用于实现单点登录、第三方授权。虽然当前有 更完善的流程,但国内主要还是使用OAuth标准。国内一些服务商的OAuth是自己修改过的, 没有依照标准文档实现,经常发生标准库没办法完成授权的情况,不知意欲何为,使用时还 是需要依照服务商的开发文档。
OAuth2 是现代 Web 应用的通用登录标准,使用 OAuth2 可以将用户系统从业务 系统中抽离出来,实现单点登录(SSO)。如果你还不熟悉的话,建议你去看看: