主页

那些年,玩过的炒鸡好玩的单机手游

住在郊区的一个成本就是上下班通勤时间太长了,从南沙到市区至少要一个小时,每天上下班来回,在地铁上的时间合计超过一个半小时。以前在地铁上比较多是看新闻、玩游戏、看漫画,近几年则是看 Kindle 比较多。回想智能手机刚兴起那会儿,有不少手游,虽然玩法简单,画质一般,也没啥社交功能,但是一次次陪我度过上班下班的时光,在忙碌的工作、生活中带来简单的快乐。谨以此文纪念一下吧。

这里列出来的,是一些相对冷门的、炒鸡好玩的单机游戏。有多好玩呢?这么说吧,以下任何一款游戏,每过一两年,我都有冲动拿出来重新通关(或者被虐),就这么好玩!另外一些比较热门的,例如纪念碑谷,地球人都知道,就不提了。

Abduction!

abduction

这款游戏实在太简单了,控制你的牛(或其它角色)向左或向右移动,一直往上跳,留意避开障碍、取得宝箱,跳的越高,分数越高,就这样,没了!没错这就是手机版的“是男人就上一百层”。但这么简单的一个游戏,也曾吸引我玩了一段时间,因为,它控制左右移动的方式是重!力!感!应!重力感应啊朋友们,在智能手机出来之前,谁曾想过居然还可以这样玩游戏!当年在我的 摩托罗拉 Milestone 上,这款游戏应该是我最早接触的手游之一了。

Unblock Me

unblock-me

类似华容道。类似的手游一大堆,但这款是我比较早接触到的,画面还算精致,各种难度都有。难度上去之后需要一定的推理、想像能力,消磨时间佳品!

Sudoku

sudoku

数独游戏千千万,我却独爱这一款。这一款是我玩过的最好的数独游戏,没有之一!它的界面其实一般,不算很精美,但胜在功能强大,铅笔标注什么的都有,并且还关联了数独的解题方法教程!看了这个教程的一些文章,我才知道原来数独是有一些高阶解法的,真是带我走入了一个新世界!

阅读更多

静态方法,mock 还是不 mock,这是个问题

王者 Mockito

不知从何时开始,Mockito 成了 Java 的单元测试框架王者,目前(2019年7月)Github 上 star 数直逼 10K。看看其他的单元测试工具:PowerMock 2K(无疑是沾了 Mockito 的光),easymock 600,JMockit 300。跟 Mockito 一比,好可怜啊,一个能打的都没有。

Mockito 当然很好。我从2012年还是2013年开始用 Mockito,看着它从 1.0x 版本一路走来,今年晚些时候估计会正式发布 3.0 版本。应该有不少人都跟我有类似的体验,从 Mockito 开始接触 mock / stub,一边赞叹 Mockito 语法的简练,一边享受着 mock 带来的单元测试的便利性。总说单元测试应该要隔离外部依赖和实现,很难想象,如果没有 mock,怎么写单元测试呢?

public void test() {
    when(userDao.update(any(User.class))).thenReturn(1);
    int actual = userService.update(aUser);
    Assert.assertTrue(acutal > 0);
    verify(userDao).update(aUser);
}

看看上面这个 Mockito 的例子,when(…).thenReturn(…),verify(…).doSomething(),这代码就像人类语言,多么简明易懂!

但是(没错转折来了),已经2019年了,Mockito 依然不支持 mock 静态方法、构造方法等。你可以说,这是设计理念,Mockito 首页上一直写着一句话 “Don’t mock everything” ,认为说应该做好功能代码的设计,尽量避免静态方法等,尽量使你的代码易于测试。这个理念,在理论上没问题,但这么多年的开发经验告诉我,理想归理想,实际上要你去维护的遗留代码总是一箩筐一箩筐的,避无可避。

Static methods, to mock or not to mock, that is the question

单元测试中是否要 mock 静态方法,一直争论不休,网上有 一个 一个 又一个 的讨论,各种意见都有。

我的个人意见,跟 这个观点 一样,我认为测试工具不应该替用户决定什么是好、什么是不好,而应该尽量提供选择,让用户自行判断、采取合适的方案。理论很美好,但实际情况就是,google 搜 “mockito how to mock static methods”,有近15万条结果,可想而知,全世界的开发者在这个问题上浪费了多少时间。

真要用 Mockito 来 mock 静态方法,一般都是结合 PowerMock 使用。这两年 PowerMock 发展的怎么样我不太清楚,但14、15年那会儿我用过 PowerMock,感受就是,真他妈累啊!理论上来说是可以的,但实际做起来就总是各种问题,然后各种 google 、解决,然后又继续各种问题,排查的我都快怀疑人生了。最终我是放弃了 PowerMock 的,这么费力地去结合两个工具一起用,往后很难说还有多少坑。

Mockito、EasyMock 等工具不支持 mock 静态方法,原理上是因为它们都是基于 cglib 的,只能通过创建子类或实现接口的方式去 mock。那除了 cglib ,就没有其他的 mock 实现方法了吗?当然有,修改字节码呀!

阅读更多

近几年最难啃的书——《玫瑰的名字》

翁贝托·埃科
沈萼梅 / 刘锡荣 译
上海译文出版社,2010

周日午后,我坐在客厅沙发上,第四次翻开《玫瑰的名字》,暗下决心这次要读完它。然而,我心里并没底,隐约能预见到,我读了100页,然后合上书本放回书架,跟自己说不行实在读不下去了下次再来吧,一如之前的三次一样。所以,当两周之后我读完了这本书时,我的第一感觉就是,好神奇,竟然读完了!

一句话总结,《玫瑰的名字》是一本难读、让人感动、好看的发抖的书!

《玫瑰的名字》,绝对是我近几年读过的书中,最难读的一本。原因之一,是书中讲述了大量中世纪、宗教、历史相关的知识。威廉和其他人讨论宗教、信仰问题时,那大段大段的文字,看的人都快精神错乱了。有时我简直怀疑,埃科是不是故意写成这样的,毕竟,这可是写出《带著鲑鱼去旅行》的埃科!难读的另一个原因,是书中人物、关系、阵营、历史也复杂交错,还夹杂着各种文学、药学、符号、密码、建筑等等信息和理论,真是一锅大杂烩,让人难以理清思绪。

为什么我会找这样一本书来读呢?其实是在和菜头那里种了草,和菜头说,他读过太多故事了,以至于翻开任何一本书,总有一些熟悉的、重复的地方,但埃科不一样,总能给人惊喜。和菜头的话让我想到朴赞郁。作为一个喜欢看电影、观影量不小的人,不少电影在我看来都了无新意,但朴赞郁不同,从复仇三部曲到《蝙蝠》、《雪国列车》,他的电影和故事总是那么新奇。而读完《玫瑰的名字》,我完全认同和菜头的说法,埃科真是很有趣的一个人,而且上知天文下知地理,强大无比。

《玫瑰的名字》的结局,看得我几欲落泪。屹立数百年的修道院,最后在一场大火中付之一炬,僧侣们视之为宝藏、传承着文化和智慧的藏书馆,也轰然倒塌。一个辉煌的时代黯然落幕,僧侣们或死或伤、纷纷离去。多年后阿德索故地重游,满眼只见废墟、残垣断壁,一切都灰飞烟灭。近几年读过的让人这么感动的新书不多了,《看见》算一本,《金色梦乡》算一本,《江城》也算,就这几本,屈指可数。

这本书不止一次让我想到《浪客行》。《浪客行》中,武藏一人对战吉冈七十人之后,一次一次地思考“天下无双”的意义,然后泽庵和尚对武藏说,“过去、未来早就由上天完美的决定了,因此,那是种完全的自由”。《玫瑰的名字》中,阿德索第一次也是最后一次说出一个神学结论:“认定上帝绝对的万能,以及他对选择的绝对自由,不就等于表明上帝的不存在吗?”我觉得,井上和埃科想表达的,是同样的东西。我们是自由的,尽管去做就好。

在这本书里,我读到的是推理,是宗教,是历史,是预言,是真理,是符号,是隐喻,是思考,是灵与肉,是光与血。

maze

阅读更多

很黄很暴力——《小城》

劳伦斯·布洛克
刘丽真 译
上海译文出版社,2017

第一本布洛克。在图书馆闲逛时,偶然看到这本书,然后发现劳伦斯·布洛克好像挺出名的,写了不少小说。于是就借回来看了。

读了开头100页,就觉得这书挺有意思的。同性恋、妓院、凶杀案、作家嫌疑犯,挺多元素在里面的,很生活化的描写,有种看美剧的感觉。接着读下去,多线推进,悬念重重,神经质的凶手,宝刀未老的前警察局长,天生一对的、都有些变态的男女主,慢慢被掰弯的直男等等。可以感受到布洛克的功力,比起钱德勒更有现代感、更生活化。对悬念的设置,案情的推动,凶手和侦探的心理描写都挺好的。有些神来之笔,例如酒保留下的那个酒杯。另外很关键的是,没有严重的 bug (除了凶手犯案过程太顺利了点)。最后,可以看出布洛克对纽约的感情,这份真挚和热爱,给本书增添了不少重量。

整本书有两点超乎我想像。第一是血腥的程度。奈斯博的《雪人》算挺血腥的了,但本书更甚,血手木匠完全就是“真·没有感情的杀手”,他的世界,在九一一那一天就死去了。之后,在他眼中,人,都不是人。

第二点超乎想象的,就是性描写。看的过程中,时不时总要提醒自己,这不是 porn ,这是侦探小说。然后又想,HBO 应该买下这书的版权呀,拍成美剧,肯定很精彩!有些片段,单单看文字都看的我脸红心跳的。不过说回来,书中对性的描写,以及苏珊这个角色的转变,感觉都有些刻意。性描写本身没问题,但没太理解这些描写在书中的意义。想了一下,结合911、暴力、性格扭曲的杀手、被掰弯的直男、慢慢变态的警察局长,这样看来,估计作者就是想表达一极端的环境下,被扭曲的人格吧。如此想来,也能理解。

有一点开阔了我的眼界,就是原来美国的畅销作家这么好赚的,一本书的版权费可以卖到300万美元!然后看看克雷顿一夜暴富、去到酒吧后受到的待遇,真是势利的社会啊。

会继续找布洛克来读,传说中的马修·斯卡德,貌似很有趣啊。

small-town

阅读更多

记一次线程挂死的排查过程(附 HttpClient 配置建议)

1、事发

我们有个视频处理程序,基于 SpringBoot,会启动几个线程来跑。要退出程序时,会发送一个信号给程序,每个线程收到信号后会平滑退出,等全部线程都退出后,整个进程再平滑退出。

整个程序平时运行都正常,然后有一天,我们发送了退出信号给程序后,发现程序无法自动退出了!肿么回事呢,grep 一下日志看到是这样的。

# grep 'receive exit signal' /PATH/TO/LOG

[2019-02-22 09:49:28,884][INFO ][Thread-75][n.p.j.e.l.l.PolyvQueueVideo:83] - receive exit signal ... exit current thread
[2019-02-22 09:49:56,271][INFO ][Thread-78][n.p.j.e.l.l.PolyvQueueVideo:83] - receive exit signal ... exit current thread
[2019-02-22 09:53:24,943][INFO ][Thread-74][n.p.j.e.l.l.PolyvQueueVideo:83] - receive exit signal ... exit current thread
[2019-02-22 09:55:23,317][INFO ][Thread-79][n.p.j.e.l.l.PolyvQueueVideo:83] - receive exit signal ... exit current thread
[2019-02-22 09:57:00,196][INFO ][Thread-77][n.p.j.e.l.l.PolyvQueueVideo:83] - receive exit signal ... exit current thread

这里的程序总共启动了6个线程的,但上面看到只有5个线程退出了,还有一个哪儿去了?不肯轻易就义么?好顽强的线程。。。

阅读更多

Life Release 2018

25 本书

《雪人》《一个叫欧维的男人决定去死》《与绝迹之鸟的短暂邂逅》《百年法》《刺杀骑士团长》《远山淡影》《一首小夜曲》《湖底女人》《OKR 工作法》《凶心人》《铁牛重临》《邮差总按两遍铃》《平原上的摩西》《来自新世界》《罗杰疑案》《希腊棺材之谜》《犹大之窗》《燃烧的法庭》《阿拉伯之夜杀人案》《斜屋犯罪》《在路上》《带着鲑鱼去旅行》《众病之王》《永恒的终结》《人件》

25本,量还行,但其中读了太多小说,太少科普类、专业类的书了,明年要加油(好像去年也这么说。。。)。

今年入了不少新的坑。其一是卡尔,一度沉迷,连读3本,我倒不是说特别喜欢密室,而是觉得卡尔对语言、节奏的把控很好,后面还会继续找来读。很喜欢年初读的奈斯博的《雪人》,阅读过程中时不时有看犯罪电影的感觉,好看的让人发抖!后面应该会补完哈利系列,这是挺大一个坑。雷蒙德·钱德勒也不错,读的第一本是《湖底女人》,就喜欢这种简洁有力的文字,不拖泥带水,估计会再读两三本。然后最近读了第一本阿西莫夫,《永恒的终结》,确实震撼,后续也应该会补上银河帝国系列,听说有15本,深坑啊!

有入坑,也有弃坑。第三本岛田庄司,《斜屋犯罪》,第二本奎因,《希腊棺材之谜》,这之后,应该跟这二位说拜拜了,前者太多水,后者太刻意。

阅读更多

做更难的事情,坚持做

今年趁着双十一,买了两件觊觎已久的东西。一件是椭圆机,迪卡侬 E-SHAPE+。一件是 4K 显示器,戴尔 P2415Q。

椭圆机

今年跑步挺多的,特别是在夏天,每个月跑100公里以上,湿湿碎。但从九月份开始,就跟每月100公里说拜拜了。原因之一是雯雯开始上幼儿园。每天6点40左右就得叫她起床,再晚的话就很难保证8点前送她到幼儿园、9点前我到公司了,起床后有一堆事情做——跟她刷牙、换衣服、扎头发、吃早餐等等。这种情况下我要早起跑步的话,得5点半起床,抱雯雯起来拉尿,然后换衣服、洗把脸、喝口水,热一下身然后出门,大概6点开始跑。由于时间关系没法像以前那样跑8公里了,只能跑半小时5公里,跑完回到家喝瓶脉动、拉伸、刷牙、洗澡,大概7点可以叫雯雯起床,还是比没跑步时稍晚一些,有时实在来不及,就只能让雯雯奶奶送她去幼儿园。

从8公里到5公里,从原来7、8月5点半天亮,到现在12月6点钟天都还是黑的,我坚持跑步。天还没亮就出发去跑,其实问题不大,顶着路灯和月光,我在文化宫的球场跑道上可以一圈一圈地顾自跑下去。但如果下雨,或者冬天降温到10度以下,就没法户外跑了。这就是我买椭圆机的第二个原因:天气。往年一到冬天,我的运动量就趋近于零。有了椭圆机之后,希望别再过囤积脂肪的冬天了。现在我一般是每周两次椭圆机,照样是早上5点半起床,每次踩椭圆机半小时左右,然后现在天还不太冷,周末可以一到两次户外跑,每次8到10公里,感觉挺好的。

这么坚持运动,看来我真的真的很喜欢跑步。之前读了《自控力》,还有看了连岳的一篇文章 《做难一点的事》,都很有启发,也成为我坚持跑步、坚持看书的动力。每天睡到七、八点起床,很舒服,但为何不试试更难一些的早起呢。每天在上下班的地铁上,刷手机、票圈、各种新闻八卦,很容易,但为何不试试更难一些的看看 Kindle 读读书呢。诚如连岳所说,我们绝大多数人不是天才,也没有很好的运气,想要出众,唯有努力。

戴尔 P2415Q

用戴尔 P2415Q 的感受,正如某些网友的评论,就是“MacBookPro 的绝配”!显示效果基本跟 Retina 屏幕一致。之前犹豫了一段时间,觉得 3K 软妹币不便宜啊。但除了做更难的事情之外,有时也要尝试做一些有代价但值得付出的事情,不是吗。

阅读更多

何谓简单

Lisp 往事

2011年,读《黑客与画家》,其中有一篇《拒绝平庸》,里面说道,“编程就应该使用最强大的语言”。虽然我不完全认同这句话,但这可是出自 Paul Graham 之口啊,他这句话勾起了我对 Lisp 的强烈好奇心。Lisp 号称是最强大的语言,真的这么强吗?将来会不会把 Java C++ 之类的都干掉?我迫不及待地想一探究竟。于是,读完《黑客与画家》之后,我找到了 Practical Common Lisp,开始学 Common Lisp。

结果证明,Lisp 是我遇到的最难学的语言,我断断续续读完了书的前八章,艰难的学会了关键的 macro,然后就没有然后了。至今想起来,没能把 Practical Common Lisp 读完,多少有些遗憾,因为,单纯从编程语言的角度来说,Lisp 的设计实在太独特、太巧妙了,学习这样一种元语言,绝对能开拓人的思路。另外,学会 Lisp 然后拿来装逼也是妥妥的,哈哈。

如今,在7年之后,我又一次有了跟当年类似的感觉:因为一篇文章(准确来说是一个演讲),对一种编程语言产生了浓厚的兴趣,迫不及待地想学这种语言。这个演讲,就是 Rich Hickey 的 Simple Made Easy。这种语言,就是 Clojure。真巧,又一种 Lisp 方言!

阅读更多