酥仁 发布的文章

MySQL VS Emoji

最近做了个用户登录功能,发现个别用户的名称无法正确存储到数据库中。

开始以为是前端传错了,将前端传的数据直接存到 Redis 中,花了一天的时间终于再次发现错误数据:用户名后中,Emoji 和后面的字符串都没了。手动跑 SQL 语句,直接抛错。

原因是我这个字段使用的 utf8_unicode_ci 无法存储 Emoji。

还有这种事情,utf8 诶。原来 utf8_unicode_ci 只能存储 3 个字节的字符,无法应对 Emoji 这种需要 4 个字节的字符。

弄清楚问题,解决起来就简单了,修改字符集为 utf8mb4。不过修改的时候又碰到 1 个问题:utf8mb4_bin, utf8mb4_unicode_ci, utf8mb4_general_ci 应该选哪个?

参考 MySQL 的 官方文档, ci 后缀表示不区分大小写(case insensitive),bin 因为通过二进制比较,所以区分大小写:参考 stackoverflow 的这篇 回答 unicode 在对很多语言来说排序和比较是准确的,但是相对慢一些,general 没有实现所有的 Unicode 排序规则,有些语言会有问题,但是快一些,不过到具体实践中,中文没什么差别,速度相差无几,我觉得用 unicode 更好一些,少留坑,

还好我的表数据量不大,线上很快就转换完了,几百万数据就得半夜三更弄了。

改完数据表还没结束,代码中连接数据库时指定的字符集也得改为 utf8mb4

Laravel 5.4 已经在配置文件中,默认使用 utf8mb4,赞!

以前用 Redis 和 Mongo 时,从来没遇到这个问题,不禁想问:为什么 MySQL 不只使用 unicode 字符集?为啥弄这么多字符集?utf8 还没支持全。大概是历史过于悠久,早期的时候,unicode 还没有发展成现在这样吧。

另外 这篇 谈字符集的也很不错。

Laravel queue 重复执行脚本的问题

现象

有时跑一些很耗费时间的异步脚本,会在 artisan queue:listen 时通过 --timeout=3600 设置长一点的时间,以避免超时。
如果: 1. 使用 Redis 存放 queue 信息; 2. 跑了多个进程 artisan queue:listen --timeout=3600;3. 监听同一个 queue;4. Job 的时间超过 60 秒。就会发生同一个脚本被运行多次的情况。

原因

  • 在 Laravel 的框架中,通过 Redis 获取下一个 Job 是通过 Illuminate\RedisQueue 完成的。
  • 获取下个 Job 的函数是 public function pop()
  • 假设 queue 的名称为 default,Laravel 在获取到脚本后,会将它放入 default:reserved 中。 default:reserved 的结构是 sorted hash,被放入的 Job 会被赋予一个权值:time() + this->expire,默认的 this->expire = 60,Laravel 官方的配置中(config/queue.php),也默认了 60 秒。
  • 这个函数在从 Redis queue 中 pop 一个数据前,会将所有过期的 Job 放回到原来的 queue 中。
  • 过期 Job 的来源包括 default:reserved,获取所有 default:reserved 中,权值小于当前时间的 Job。
  • 于是,超过 60 秒没有执行完成的 Job 被放入了 default queue 中,等待下一次执行。

解决方案

解决方法很简单,将 config/queue.php,相应配置的 expire 设置为 null 即可。
因为 Illuminate\RedisQueue 中,如果 expire 为 null,是不会做将将所有过期的 Job 放回到原来的 queue 中的操作的。

其它

  • 这个问题在 5.4 版本还有:5.4 版本的代码略有调整,但是原理相同。
  • 如果 queue 的驱动是 Database,应该也有相同的问题。而且看了 5.2 版本的实现,还没有办法通过设置 expire 为 null 来规避。
  • expire 这个设置,和 queue 的 timeout 的配置,是冲突的。Laravel 在这点的设计上没有考虑清楚:让开发者设置 2 个可能互相矛盾的参数。而且,文档中介绍了 timeout,教开发者避免超时,没有介绍 expire,还给 expire 一个默认的 60 秒设置,让开发者掉坑。打算找个时间去提 issue~

会哭的孩子有奶喝

看到范爷的电影,下意识是拒绝的。十几年下来,还是金锁的样子,有壳没有灵魂,任人(包括)导演摆布的样子。

阴差阳错下,还是看了《我不是潘金莲》。

演技

扮相上,范爷还是太爱惜羽毛,巩俐能土得掉渣,赵薇也能一副农妇像,但范爷还是太漂亮,不接地气。《秋菊打官司里》,巩俐一口陕西话,是不是正宗不知道,但至少不让人出戏,而范爷,一开口总让人想起来这是漂亮的范爷啊。连张译这种满口大碴子味的都能掩饰的还不错,作为主演还是应该用点心的。

张译的演技依然没得说,在领导面前拼命巴结,小心翼翼邀功,一副拼命钻营的嘴脸,十分到位。从士兵突击的班长,到亲爱的里丢了孩子的大老板,到追凶者也的杀人犯,一直让人印象深刻,功底真好。

剧情

看了 30 分钟时,有点烦,这么个没脑子的女人,说她故事做啥。等看到各路官员的嘴脸,和一系列为了掩饰错误做的事情,虚虚实实不明所以的对话,觉得还挺有意思。没有黑暗的让人不寒而栗,卷进这件事情的人,每个人有自己的不得已,好笑又无奈。

北京领导义愤填膺的批评,市长在最后对县长的谆谆教诲,让人以为开始放新闻联播,有点恶心,或许没有这些就无法过审吧,无奈。

正义

判这个案子的法官,没有判错,李雪莲办了正规的受法律保护的离婚手续,希望法院判决这是无效,这个诉求不可能被支持。

于是李雪莲开始闹,说法官收受贿赂。
闹到法院院长,被建议去检察院检举,没有去,我觉得这一点毛病都没有,检察院就是干这事情的。
闹到县长,县长推脱,从后门溜了,看起来一点都没有人民公仆的样子,但是从县长的角度考虑,每个这样的事情都亲力亲为去解决,那别的事情都不要做了。
跪在市委门口,被市长吩咐了一下,关了几天。是挺冤枉,但市长真的亲子解决或者吩咐更小的官去解决么,真的这么做,就回到了人治社会,青天大老爷的水品。
走运的是,闹到了北京的领导那里,一堆官员被撤职,可惜十年了还是解决不了这个事情。
十年后换了一波官员,解决的办法,还是做思想工作,围追堵截。

这事情怎么解决?没法解决。李雪莲要青天大老爷让她离婚,青天大老爷办好了。李雪莲说我上当后悔了,青天大老爷你给我做主判无效。青天大老爷又不是猴子,没法这么被耍。
于是哇哇大哭,贪污腐败,都是坏人,要找个能给自己说话的青天大老爷。

会哭的孩子有奶喝。

但这么做,降低了社会的效率。
有公证的离婚,就不认了,又怎么了。谁反对就是贪污腐败我要上诉。
我太累了,地铁我就不插个队早点上车抢个座位,又怎么了。谁反对就是不照顾老弱病残斤斤计较我就要吼你让你上微博。
白纸黑字的合同我就不认又怎么了,为什么不能通融一下,又不是我愿意这样的。
我们不是需要几个人看着的小孩,我们是成年人,为自己负责。

四年

博客放在 Linode 上,用的最低配置,每个月要 10$,太 TM 贵了,更搓的是,感谢 GFW,博客很久都不能正常访问。于是搬到现在的主机商,host1plus,按月付 2.5$ 一个月,而且能访问,赞。

博客代码换成了 typecho,手工把原来的文章一篇一篇搬过来,4 年多,才 34 篇而已..

博客和自己的 review 一样,写完了从来不看的。这次没办法看了一遍,嗯,有些真恶心..特别是那些有感而发、伤春感秋的,太可怕。

读书笔记类的,受益于书的质量,还能看一看;技术总结类的,有点实用性,还能看一看。

四年前刚刚被百姓网开除,觉得自己的技术真是烂,别说服务器运维,连 PHP 都弄不明白,当时觉得,弄个博客我就能开始积累技术了,嗯,就是这么朴实。

一开始用的是老薛主机,在一个笑话网站上看了几年的广告,开博客的时候用到了。当时只是一个空间,就是服务商提供一个 ftp 接口上传 php 代码,自己再绑个域名到指定 IP 上,就好了。当了一年半网站码农,当时这些都不懂,晕晕呼呼搭建了起来。

后来进了火花。

一开始在火花,日子很难熬。除了对 PHP 有些许的了解,其它技术基本没听过,比如建个 web 服务器,搭个搜索引擎,这些完全没有概念。技术之外,工作能力也很差,比如理解需求,出技术方案,管理自己的时间,管理自己手上的事情。

和在百姓网一样,每天加班到很晚,回家了也要做工作上的事情。只是没有在百姓网那么傻乐自嗨了,会被别人骂,会因为 Jim 说相信自己有能力只是心态不好而倍感压力。以为自己是因为“挡了别人的路”被开除,以为自己已经客观评价了自己的能力,其实自己比自己想象得差了很多。

受白老师对 Linode 经常有意无意的宣传影像,用上了 Linode 的服务器,除了能放博客,还能翻墙,划算。开博客的时候,已经没有日本节点了,用了新加坡节点,慢得出奇,勉强能用。

四年好快。做了很多很傻的事情,比如订年度目标,结果一大半没完成,也有更多开心的事情,和朋友去九寨沟玩,和父母去北京玩,买了房子,坐了不止一次过山车。

在火花呆了四年,获取的比付出的多,理解事情和做事情上,比四年前的 SB 程度低了很多。

期待 2017,这次我还要立 flag。