Laravel单元测试错误:1205 Lock wait timeout exceeded

错误信息:

1205 Lock wait timeout exceeded; try restarting transaction

原因之一是测试用例里重写的tearDown()方法中没有调用父类的该方法。因为DatabaseTransaction这个trait自动开启了事务,对应的回滚方法在测试用例基类的tearDown()中执行。

用Charles拦截iOS APP HTTPS请求

实践环境

  • Charles 4.2
  • iOS 11.2.1

安装证书

按照Charles菜单(Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser)的指示,设置iOS的系统代理。

为了以后使用方便,可以在代理工具(如ShadowRocket)里设置,注意使用时应配置代理工具对全部流量使用代理,如果使用PAC之类动态代理可能会拦截不到。

在iOS的Safari中访问上面提示中的网址,会弹出提示安装证书。iOS 10.3以后还要设置信任该证书(设置->通用->关于本机->证书信任设置)。

配置Charles拦截HTTPS请求

路径为:Proxy -> SSL Proxying Settings

可以设置对特定的主机名和端口拦截,也可以直接保存,此时对所有请求均会拦截。

拦截

iOS中打开上述代理,APP中发送的请求就会在Charles里列出来。

测试驱动开发的实际收益

我并不试图系统地谈TDD,因为我在这方面的经验还不足以做到这一点。但是TDD的一些方法论和工具确实解决了我在实际开发过程中遇到的一些问题。

第一个问题是健壮性。尤其是对于我这样思维发散、容易迷失又喜欢重构的人,TDD给了我一个明确的目标,在一切刚开始的时候,我要做的只是满足测试用例,让它们由红变绿。到了重构阶段,我就可以把精力放到优化代码上面,且不必对健壮性有过多的担心。在此之前,由于手动测试比较麻烦,很多时候惰性会说服潜意识告诉自己这部分逻辑很简单、不会有什么bug,结果提交测试后却一再地发生问题。

第二个问题是效率。曾经只有不忙的时候才会写测试用例,但是现在一般都会写,因为确实可以提高开发效率,而不只是保证重构的健壮性。可能对于所有对单元测试不熟悉的人来说,这都是匪夷所思的,我也曾认为单元测试只是用来保证健壮性的,必然和开发效率是一对矛盾,因为要花很多时间写测试代码。这种想法首先是因为对单元测试不熟悉,所以才需要花很多时间在上面。其次是没有看到它所带来的好处。

例如你要实现一整套退款单的功能,退款单是依赖订单的,这意味著你需要不只一条符合条件的订单数据。但是订单是有状态的,随著时间的推移、人为的操作或者开发过程中程序的影响,状态会变得不再符合你的要求,这时候你就必须停下来去做更多符合要求的订单。而创建订单也存在很多麻烦,你需要找到有库存的商品,有时候还要去库管系统中补充库存,然后下单并支付。最后花了很多时间做出来的订单,因为正在开发的退款单的程序出现的一个小问题变得不能使用!时间被大量浪费在创建所依赖的上游数据上。

这时候如果用单元测试并mock出依赖关系,就可以随时随地、无限制地执行相关的业务逻辑。对效率的提高不言而喻。

特别的,mock并不是随时可以抓起的救命稻草,它的原罪在于:不负责任地滥用mock会导致很多问题被掩盖。因此,对mock的使用应该是节制的、目标明确的。

当然,这并不包括单纯地为了提高代码覆盖率而使用mock,只所以这是个在很多强制TDD的团队里的普遍现象,归根结底是因为KPI是万恶之源,任何好的方法论,一旦沦为KPI,就离死不远了。

BaiduPCS:当前最好用的百度网盘下载工具

BaiduPCS是个命令行工具,用于下载百度网盘中的资源。之前用的是浏览器插件,需要先创建分享,再拿到下载链接,最后用下载工具下载。这个工具可以直接执行一条命令下载指定的资源,非常方便。

这里有安装说明,然后按照使用说明操作即可。

iOS垃圾短信过滤器:熊猫吃短信

“熊猫吃短信”是个新上架的App,用于过滤垃圾短信。据说是基于机器学习训练出来的,用了一周,识别得非常准确。

之前用的腾讯手机管家,即使把“精准识别”、“上传到云端”等选项都打开,还会有漏网之鱼,而且会牺牲隐私。这个App声称不会主动上传短信。最重要的是,这一周里所有不关心的短信都被过滤掉了,而且没有失误。

全新Kindle Oasis使用感受

fullsizeoutput_358

早在Paperwhite 1的时候我就不喜欢它的工业设计:边框太宽,屏幕内陷。此外,非人体工学设计和没有实体翻页键导致单手握持体验很差。再有就是做工的问题,机身表面接缝处缝隙明显而不均匀、通体强烈的塑料感。然而还是从一代用到了三代,除了kpw是kindle全系列里性价比最高的产品线之外,还有就是没有其它任何一款产品解决了kpw的主要问题。

例如Voage,虽然屏幕不内陷了、楔形机身优化了握持感、增加了翻页键,但整体的设计只算是在kpw基础上的优化,何况各项硬件配置和kpw3几乎无差。

后来当第一代Oasis发布的时候,看了第一眼就瞬间失掉了兴趣。捆绑的充电保护壳绝对是体验杀手,装上壳比kpw还要厚重,不装的话本体的续航又很差,频繁拆装也很不方便,这样的体验连kpw都不如。所以我很不看好它,果然很快在今年六月就下架了。

十月刚看到新Oasis的消息时,马上觉得这回终于有买的价值了。

首先是7寸的屏幕,瞬间和其它产品线拉开了距离。更大的屏幕意味著能展示更多内容,增加了宽度后也更接近实体书的观感。

工业设计相对于我的kpw3当然是有了质的改变。玻璃材质的纯平表面,金属背壳,没有了kpw的塑料感,显得更精致。得益于窄边框,7寸屏的机身长度比6寸的kpw还短。虽然因为加宽了屏幕和增加了单手握持的边框导致机身宽度超过kpw很多,不过在平时携带中并没有造成很多困扰。

单手握持是ko系列的主要卖点,实际使用体验当然很好。为握持设计的宽边框加上实体翻页键非常方便。虽然因为加大屏幕和增加续航导致194g的重量远远超过1代的131g,但还是比kpw轻了10g,而且主要重量集中在单手握持的一边,杠杆效应很小。配合重力感应,随时换手可以有效缓解疲劳。当然,作为长时间单手握持的阅读设备,重量自然越轻越好,这一点上,ko还有很大优化的空间。

此外,新ko的做工远远好于kpw,没有了廉价感。12颗背光灯使得背光的均匀度比kpw强了很多,几乎不会有kpw上明显的光影。性能上是现在kindle全系列里最高的,翻页时虽然还会看到闪屏,但比以前已经快了很多。自动亮度调节算是个聊胜于无的功能吧。至于防水和有声书,我没有这方面的需求。

如果说缺点的话,还是续航。虽然相对于1代本体,续航已经达到可用的水平,但是对于被其它产品线惯坏的我们来说,新ko电量的消耗还是快了点。我没有精确的对比,但是能明显地感觉到比kpw掉得快不少。

清洁手机的最佳实践

以前的做法是先用湿巾清理,再用纸巾擦干。后来屏幕的触感逐渐不如开始时顺滑,也更容易沾指纹和灰尘,而且不容易清除。估计应该是湿巾的酒精会腐蚀屏幕的涂层,纸巾粗糙的表面也会造成磨损。

现在先用软毛刷扫除灰尘,然后用3M魔布擦拭。效果应该会更好。

Firefox Quantum:狐狸的反击

不知不觉已经很多年没有用过Firefox了。在Chrome发布之前,这只狐狸以一己之力扛著互联网承前启后的大旗。后来被Chrome在网页加载速度上吊打,逐渐式微。之后还在用Firefox的人一般也只是因为受不了Chrome的内存占用。

Firefox Quantum刚发布的时候我就安装了,以为是个全新的项目,新项目初期往往特性不健全,所以就没有太多关注。

然后发现版本号接续了旧版,也兼容原Firefox的插件,所以就装上几个必要的插件,尝试了一下。新的UI借鉴了Chrome,不像原来那么过时。最重要的是内存占用和网页打开速度比Chrome有优势。如官方宣传语所说——快而不俗。

准备把默认浏览器改成FQ,用一段时间看看。

Vim最好的PHP语法高亮插件

StanAngeloff/php.vim应该是目前最新、最全的PHP语法高亮插件了,它解决了旧版本无法高亮@throws的问题。

默认会把方法注释全部当做普通注释显示,也就是没有高亮,需要专门做配置:

1
2
3
4
5
6
7
8
9
function! PhpSyntaxOverride()
hi! def link phpDocTags phpDefine
hi! def link phpDocParam phpType
endfunction

augroup phpSyntaxOverride
autocmd!
autocmd FileType php call PhpSyntaxOverride()
augroup END
iPhone X官方硅胶保护壳使用感受

我相信所有注重体验的人都不愿意用保护壳,我也一样,所以用iPhone 6的两年多里绝大部分时间也都是裸奔。

对于给X加壳这件事,我是很矛盾的,然而面对这个既易碎又碎不起的东西,贫穷限制了我对体验的偏执。

对于壳的选择,我有这些考虑:

  • 防护性好:毕竟这是加壳的唯一目的,所以那些超薄的壳就在考虑范围内了。
  • 易装卸:只有出门时会加壳,在家要去掉,所以这是个很频繁的行为,既要容易操作,又要不伤手机。
  • 易维护:方便清洁,所以皮质的就不考虑了。
  • 贴合度高,触感好:体验还是很重要,软壳一般很难做到这一点,所以范围限制在硬壳上。
  • 外观简约。
  • 材料安全。
  • 试错成本低:少花冤枉钱,节省时间精力。

符合这些条件的就只剩下官方硅胶壳了,然而我还是在颜色的选择上纠结了很长时间。因为硅胶壳容易粘灰,所以越是浅色越不明显,然而深色可以减少和X黑色前面板的割裂感。最终选择了钴蓝色。

IMG_0008

IMG_0009

用了一周的时间,完全符合预期。