如何查询同时包含多个指定标签的文章

文章和标签是典型的一对多的关系,也就是说每一篇文章都可以包含多个标签,如图: 每一篇文章都可以包含多个标签 下面问题来了:如何查询 tag_id 同时包含 1、2、3 的 article_id?此问题看似简单,实际上也非常简单,本来是一道送分题,但是很多人却做不出来! 方法一: SELECT article_id FROM ( SELECT article_id, GROUP_CONCAT(tag_id ORDER BY tag_id) tag_ids FR

为什么「0.1+0.2!=0.3」,而「0.1+0.3==0.4」

我们都知道潮汐现象,上学的时候老师多半简单解释一句「月球引力所致」就算了,而我们也都觉得自己明白了,但是凡事就怕琢磨:如果涨潮仅仅是月球对地球万有引力的作用结果的话,那么每天同一个地点,应该仅仅在距离月球最近引力最强的时候有一次涨潮才对,但是住在海边的人都知道,同一个地点,每天会有两次涨潮,为什么? 我抛出这个问题并不是我转行搞物理学了,而是我发现很多司空见惯的问题,如果深究的话,你就会发现很多人根本就没搞懂。浮点数运算就是这样一个问题,每个人都知道浮点数运算有精度损失,但是

数据库ID生成器基准测试

在说明如何基准测试之前,我想聊聊我为什么要做这个事儿,话说最近做某后台的时候需要一个 ID 生成器,我不太想用 snowflake 等复杂的解决方案,也不太想用 redis 来实现,因为我手头只有 mysql,所以我琢磨着就用 mysql 实现吧。 实际上当初 flickr 就是这么干的,利用 LAST_INSERT_ID 返回最新插入的 id: mysql> CREATE TABLE `Tickets64` ( `id` bigint(20) unsigned

WRK:一个可编程的HTTP性能测试工具

同 ab 这种单线程 HTTP 性能测试工具相比,wrk 是一个足够现代化的 HTTP 性能测试工具,最重要的特性是:它是可编程的,借助内嵌 lua,我们可以控制测试的全过程。 关于 wrk 中 lua 扩展的数据结构,可以参考官方源代码中的 wrk.lua 文件: local wrk = { scheme = http, host = localhost, port = nil, method = GET, path =

如何在环境中存储配置

关于「在环境中存储配置」,是 The Twelve-Factor App 倡导的方法论之一。通常,应用的配置在不同环境(预发布、生产环境、开发环境等等)间会有很大差异,比如说数据库的用户名密码等等配置,通过把配置和代码分离,我们可以保证部署在不同环境的代码完全一致,如何把配置和代码分离呢?最佳实战是把配置存储到环境变量中,它可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;此外环境变量与语言和系统无关。 在实际应用中,

OpenResty 101

本文是 OpenResty 的初学者指南,提供一些资料的汇总。 OpenResty 初学者在刚开始学习 OpenResty 的时候,最好能先对 Nginx 有一定的了解,推荐阅读 OpenResty 作者 agentzh 撰写的 Nginx 教程,有中文版和英文版。 一旦对 Nginx 有了基本的认知,那么可以读十遍 lua-nginx-module 的官方文档,同时 iresty 上还提供了一份中文文档,文档中很多细节都值得牢记。 比如在描述 ngx.print 的时候,

关于手机App的Https抓包

我喜欢用 Mitmproxy 来处理手机 App 抓包之类的工作,本来用它来抓 Https 包是很容易的一件事,只要设置好代理,浏览 mitm.it 按提示安装证书即可,可是当 Android 版本升级到 7 以后,此方法就失效了,为什么呢?因为新版 Android 缺省情况下只信任系统级证书,而不再信任用户级证书,问题详细描述可以参考:听说安卓微信 7.0 不能抓 https? 普通的解决方法有很多,比如说用低版本的 Android 手机,或者干脆换个苹果手机。不过那些治

聊聊AES

说起加密,通常分为对称加密和非对称加密,所谓对称加密中的对称,指的是加密和解密使用的是同一个密钥,如此说来什么是非对称就不用我多做解释了。对称加密相对于非对称加密而言,优点是速度快,缺点是安全性相对低一点,不过只要能保证密钥不泄露,其安全性还是有保证的,所以在实际项目中,对称加密的使用非常广泛。 目前最流行的对称加密标准是 AES。需要说明的是:AES 是一个标准,而不是一个算法,实际上背后的算法是 Rijndael,二者很容易混淆,比如很多人会搞不清楚 AES256 和

Golang之Context的迷思

对我而言,Golang 中的 Context 一直是谜一样的存在,如果你还不了解它,建议阅读「快速掌握 Golang context 包,简单示例」,本文主要讨论一些我曾经的疑问。 Context 到底是干什么的? 如果你从没接触过 Golang,那么按其它编程语言的经验来推测,多半会认为 Context 是用来读写一些请求级别的公共数据的,事实上 Context 也确实拥有这样的功能,我曾写过一篇文章「在Golang的HTTP请求中共享数据」描述相关用法: Value(

如何优化Golang中重复的错误处理

Golang 错误处理最让人头疼的问题就是代码里充斥着「if err != nil」,它们破坏了代码的可读性,本文收集了几个例子,让大家明白如何优化此类问题。 让我们看看 Errors are values 中提到的一个 io.Writer 例子: _, err = fd.Write(p0[a:b]) if err != nil { return err } _, err = fd.Write(p1[c:d]) if err != nil { return