小朋友的晚睡

最近困惑于晚上不想睡,早上起不来,于是有此文。

有人说,熬夜是因为舍不得结束这一天,赖床是因为没有勇气开始这一天。

对于前者,家中年幼的娃娃应该心有戚戚然。

因为每晚让他睡觉时,他都喊着,没时间玩了,看起来是真舍不得。

熬不完的夜

每个人都知道早睡早起身体好,熬夜对身体不好。

但是现实中身边还是有很多人天天熬夜。

是舍不得结束这一天吗?

应该是有的。

尤其是像我们这种加班到10点多到家的,

感觉忙碌了一整天,还没有自己的时间,

于是下班后更加舍不得马上睡觉。

健康点的,去健身,去看书,熬夜到12点之后才依依不舍睡去。

不健康点的,吃东西,刷手机,看电影,直至深夜。

不想熬夜

手机上刷新闻,看到有人熬夜猝死的。

人到中年,渐感体力不支,身体状况越来越差的。

一边熬夜,一边懊悔的。

越来越多的人,开始想要戒掉熬夜的习惯。

熬夜与失眠

我之前是很少失眠的。

总在别人面前吹嘘,喝茶,咖啡,都不影响晚上睡眠。

而最近不知什么原因,

竟也出现了喝咖啡之后夜里失眠的情形,

深切的感觉到了夜里睡不着又拼命想睡着的无助感。

熬夜与加班

加班应该是导致晚睡的另一原因。

如前所述,我熬夜的情形很大一部分是由于最近一段时间工作很忙。

越忙,回到家里越不想睡。

有些讲自制力的书会归结于自制力差,

其实,人的自制力能控制的真的很少。

不找到背后的原因,单纯靠自制力,迟早会导致神经疲劳,甚至抑郁。

回到加班,有位老总说,能加班是福气。

很多人就说,看,资本家的嘴脸。

去研究下加班的历史,加班总出现在快速发展的国家或者行业。

罗素在20世纪初写的《幸福之路》里,说美国人只知道加班,不懂生活。

他是英国人,那时候欧洲比美国发达,美国还处于快速发展期。

而同时期的林语堂,也写了本书,叫《生活的艺术》,同样说美国人不会享受生活。

他出生在中国,那时候美国快速发展期,而中国还在自诩天朝上国。

看起来,加班,往往说明有机会快速发展。

其实,人家老总说的也没错。

对于那些想通过努力来提高自己的,不是福气吗?

毕竟,我们还有不加班的选择。

如何不熬夜

加班熬夜干活的毕竟还是少数,

很多时候是由于加班导致缺乏自己的时间而变相熬夜。

比如下班后刷手机到深夜。

若要不熬夜,想想什么时候会早睡什么时候会晚睡就知道怎么做了。

当我计划明天早晨要早起去跑步的时候,那么我很可能前一天晚上就不会熬夜了。

当我告诉家里的娃娃,明天早晨要带他去他喜欢的游乐场去玩,那么他可能就乖乖早点睡觉了。

当我不知道明天要干什么时,那么我可能就会刷手机到深夜,还觉得毫无睡意。

当我写下这篇文章时,我后面晚睡的几率应该就会比之前少了。

后记

在我的印象里,这个社会大多数人应该都会晚睡熬夜。

最近,与一些圈子外面的人聊天,得知他们晚上九点就睡觉了。

想想也是,不到6点下班的人,玩到9点也是觉得没啥事可干了。

有时候,人们总觉得自己看到的世界就是全部。

——2019年8月12日23点于上海

微信读书

手里有个Kindle,已经很久没开机了。

每次想看书的时候,总是发现没电了。于是充好电,继续等着下次想用的时候再次没电。

所以平时用手机上的Kindle APP比较多。好处是现在是机不离手了,不用每次到处找Kindle在哪里,找到了还总是没电。

最近朋友介绍了微信读书,于是下载下来试用了下,一口气在上面读完了三本书。

微信读书的好处是,里面书的种类不少,而且相比于Kindle,基本上免费的(送限期无限卡,而且读书和分享可以续期)。

于是,一口气把一直想看的三本书看完了。

《原则》

这本书听说好久了,在好多地方都看到有人推荐,但是一直没读。

这次在微信读书上利用零碎的时间大概花了11个半小时读完了整本书。

书中列出来了很多的关于生活和工作的原则,大部分都是经过作者瑞·达利欧实践沉淀出来的做事的原则。

对于这些原则,说实话,大部分我都不是很赞成,也不会在自己的生活工作中使用。

毕竟作者也说了,每个人都应该自己思考出自己的原则。

不过,总还是有一些内容会引起自己的一些心得,列在这里也算没白读了。

书中说到,“你最好弄明白其他时间,其他地点,其他人身上发生的事,因为如果你不这么做,你就不知道这些事情会不会发生在你身上,而且一旦发生在你身上,你将不知道如何应对”,这大概就是为啥要读历史的原因吧。

太阳底下无新事,我们现在经历的无非不是昨天的重演。所以,作者也说“几乎所有事情都以符合逻辑的因果关系不断的发生”。

作者在讲到要保持自己的心态透明时,是这么看待别人指出自己的错误的,“我的目标只是让自己正确-我并不关心正确的答案是不是来源于我”,这样以来,当别人指出我们的错误时,对我们的结果就是我们知道了正确的答案,这难道不就是我们想要的吗?

所以,当与别人讨论问题时,我们是要寻得最优答案,而不是说服对方。而现实中,人们总是试图去辩赢,说服对方。这点对自己的生活工作还是很有启发的。

说到投资,“因为大多数人都是情绪化倾向,不会严格遵守逻辑,所以他们通常会对短期结果反应过度:情况不好时他们放弃,并以过低的价格脱手,好的时候他们又以过高的价格买进”,这不就是韭菜的命运吗?大神们总是说,别人恐惧的时候我贪婪,别人贪婪时我恐惧。

关于幸福,当你实现了你的目标时,“一开始你会感到快乐,但不会很久,你将很快发现,你需要为另一些东西而奋斗”,“如果他们没有对另一些更大的更值得追求的东西产生热情的话,他们通常最终不会快乐”。所以,“发现自己的性格,过与性格相适应的生活,才是最幸福的”。

讲了很多原则和道理,其实,如果能实践其中一个,也算是没白读了。比如,在跟别人讨论问题时,不要总是想着说服对方。

《阿勒泰的角落》

作者是李娟,网上对她的评价很好,而且她的作品的评分都很高,豆瓣上评分9分左右。

读完这本书,感觉她的写作特点是有的,很朴实又有一些幽默。但是没觉得好在哪里,无法欣赏了。

据说,她写的关于阿勒泰的书,把阿勒泰这个地方的旅游给搞火了,很多人看完这系列书后去那旅游了。

当地的旅游部门真该给作者发个红包。

《邻人之妻》

同样很火的一本书。作者是美国新新闻主义之父,盖伊特立斯。

大家都知道在我们国家,淫秽色情出版物是被禁止的,而相反,美国是比较开放的。

但其实,作为一个宗教国家,美国也经历了多次对淫秽色情的抵制与自由的较量,并且忽有胜负。

本书作者除了是个作家,还是个记者,采用非虚构形式写作,展示了20世纪后半叶美国社会对待性的方式的变迁。

这里面写了《花花公子》杂志以及众多色情期刊的创立者与美国传统观念者的斗争与斡旋,起起落落的过程。

这些出版商多次把审判过程一直上升到美国最高法院,而最高法院的判决也是忽左忽右,对淫秽的定义标准也是出现了多次变化。

基本上是从性的角度展示了美国社会,宗教,法律与政治的变迁。

看完之后,不仅感叹,太阳底下无新事啊。彼之过去,何尝不是我们的未来呢。

Mockito不支持mock/spy如下的类型:

  • final classes
  • anonymous classes
  • primitive types

如果你mock这些类型,会抛出如下错误信息:

org.mockito.exceptions.base.MockitoException: Cannot mock/spy class java.lang.String Mockito cannot mock/spy following: - final classes - anonymous classes - primitive types

而如果你有确实有此需求,可以通过如下方法解决。先定义一个工具类,里面包含如下方法:

public static void injectField(final Object injectable, final String fieldname, final Object value) {
  try {
    final java.lang.reflect.Field field = injectable.getClass().getDeclaredField(fieldname);
    final boolean origionalValue = field.isAccessible();
    field.setAccessible(true);
    field.set(injectable, value);
    field.setAccessible(origionalValue);
  } catch (final NoSuchFieldException | IllegalAccessException e) {
    throw new RuntimeException(e.getMessage(), e);
  }
}

比如你有如下类需要测试:

public class Greeting {
  @Inject
  private String greeting;

  @Override
  public String toString() {
    return this.greeting;
  }
}

那么,你的测试类大概如下:

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

public class GreetingTest {
  @Test
  public void testToString() throws Exception {
    Greeting greeting = new Greeting();
    injectField(greeting, "greeting", "Hello, world");
    assertThat(greeting.toString(), is("Hello, world"));
  }
}

以上参考:https://dzone.com/articles/field-injection-when-mocking-frameworks-fail

当然,如果你使用Spring Test,你可以使用org.springframework.test.util.ReflectionTestUtils。 类似

ReflectionTestUtils.setField(testObject, "person", mockedPerson);

或者,如果你使用Mockito 1.*,可以使用

import org.mockito.internal.util.reflection.FieldSetter;
new FieldSetter(obj, obj.getClass().getDeclaredField("p")).set(new P());

//or
org.mockito.internal.util.reflection.Whitebox#setInternalState(Object target, String field, Object value)

针对Mockito 2.*,可以使用:

org.mockito.internal.util.reflection.FieldSetter.setField(Object target, Field field, Object value)

依赖注入(DI)是像Spring,EJB这样的控制反转(IOC)类容器的一个很强大的特性。把注入的值封装成类的私有字段是一个很好的主意,但是像这样把autowired的字段封装起来也降低了可测试性。本文将介绍针对这种情况,Mockito是如何来mock私有的autowired字段的。

首先被测试的类依赖的第一个类是这样子的,它是一个Spring单例bean,这个类将会在测试中被mock掉。


@Repository
public class OrderDao {
  public Order getOrder(int irderId){
    throw new UnsupportedOperationException("Fail is not mocked!");
  }
}

接下来是被测试的类依赖的第二个类,它也是Spring的一个Component。在测试中,这个类将会被spied(partially mocked)。它的方法calculatePriceForOrder将会原样被调用(不被stub),另外一个方法将会被stubbed。

@Service
public class PriceService {

  public int getActualPrice(Item item){
    throw new UnsupportedOperationException("Fail is not mocked!");
  }

  public int calculatePriceForOrder(Order order){
    int orderPrice = 0;
    for (Item item : order.getItems()){
      orderPrice += getActualPrice(item);
    }
    return orderPrice;
  }

}

然后是被测试的类,它使用autowire上面的两个依赖的类。

@Service
public class OrderService {

  @Autowired
  private PriceService priceService;

  @Autowired
  private OrderDao orderDao;

  public int getOrderPrice(int orderId){
    Order order = orderDao.getOrder(orderId);
    return priceService.calculatePriceForOrder(order);
  }

}

最后是测试类,它使用字段级别的注解:

  • @InjectMocks – 含有此注解的字段,Mockito将会实例化被测试的类,并且尝试把用@Mock或者@Spy注解的字段注入到被测试对象的私有字段中。
  • @Mock – 含有此注解的字段,Mockito会创建对应类的mock实例。
  • @Spy – 含有此注解的字段,Mockito会创建对应类的spy实例。
public class OrderServiceTest {

  private static final int TEST_ORDER_ID = 15;
  private static final int TEST_SHOES_PRICE = 2;
  private static final int TEST_SHIRT_PRICE = 1;

  @InjectMocks
  private OrderService testingObject;
  @Spy
  private PriceService priceService;
  @Mock
  private OrderDao orderDao;

  @Before
  public void initMocks(){
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testGetOrderService(){
    Order order = new Order(Arrays.asList(Item.SHOES, Item.SHIRT));
    Mockito.when(orderDao.getOrder(TEST_ORDER_ID)).thenReturn(order);
    //notice different Mockito syntax for spy
    Mockito.doReturn(TEST_SHIRT_PRICE).when(priceService).getActualPrice(Item.SHIRT);
    Mockito.doReturn(TEST_SHOES_PRICE).when(priceService).getActualPrice(Item.SHOES);
    //call testing method
    int actualOrderPrice = testingObject.getOrderPrice(TEST_ORDER_ID);
    Assert.assertEquals(TEST_SHIRT_PRICE + TEST_SHOES_PRICE, actualOrderPrice);
  }

}

让我们看下在执行这个测试类的时候会发生什么:
1)首先JUnit框架会在执行每个测试方法之前执行@Before注解的方法initMocks。
2)initMocks这个方法会调用Mockito的方法(MockitoAnnotations.initMocks(this))初始化被被注解的字段。如果没有这个调用,那么被注解的字段将会是null。也可以使用@RunWith(MockitoJUnitRunner.class)来注解被测试的类来达成相同的效果。
3)最后当所有的字段被初始化完成后,开始执行测试方法(被@Test注解的方法)。

这个例子中不包含Spring context的创建,这里的Spring注解(比如@Service,@Repository)只是为了说明实际生产中代码的例子。测试本身不包含对Spring的任何依赖并且或忽略Spring的任何注解。事实上这里可以换成EJB的注解,或者甚至换成普通的私有字段(不被任何IoC容器管理),测试依然可以执行。

开发者可能认为每次测试之前的 MockitoAnnotations.initMocks(this)调用是不必要的开销。但是其实这样很方便,因为它重置了被测试的对象和重新初始化了mock对象。当你的测试类里有多个测试方法(@Test注解的方法)时,可以避免互相干扰。

@Spy注解的对象可以通过两种方法来初始化:
1)如果有默认的构造器,则可以由Mockito框架来自动创建;
2)如果仅有非默认构造器,可以显示实例化它。比如

@Spy
private PriceService priceService = new PriceService();

类似的,被@InjectMocks注解的被测试对象也可以显式实例化。

参考:https://lkrnac.net/blog/2014/01/mock-autowired-fields/

今天是2019年1月16日,18年已经过去半月有余。一直在犹豫要不要写年终总结,毕竟已经连续三年没写年终总结了。

可能和往年一样,拖延一段时间,这件事情就过去了。不过最终还是决定要写一下。要知道,一旦坐下来开始写,这件事基本也就成了。

回想上次写年终总结还是2015年,一眨眼几年就过去了。回忆过去的这几年貌似一直很忙,被各种事情推着走,却很少静下心来做做总结,想想事情。

年终总结其实是很好的一个机会,回顾过去的一年做的事情,想想明年要做些什么。

可能会写几篇,本篇为2018年度读书报告。

去年看过的书

平时看过的书,一般会在豆瓣上标记了。整理了下,去年完整看完的书大约有十几本,另外还有一些专业的参考书和没看完的就不在这里列出了。标题后面的星星为个人评分。

  • 月亮与六便士 (威廉·萨默塞特·毛姆 )☆☆☆☆☆
  • 人类简史 (尤瓦尔·赫拉利)☆☆☆☆☆
  • 岛上书店   (加布瑞埃拉·泽文)☆☆☆☆
  • 浮生六记(沈复 )☆☆☆☆
  • 刻意练习 (安德斯·艾利克森)☆☆☆
  • 冥想 (斯瓦米·拉玛)☆☆☆
  • 深度思考 (莫琳·希凯)☆☆☆
  • 易经杂说(南怀瑾)☆☆☆
  • 金刚经说什么 (南怀瑾) ☆☆☆
  • 禅与摩托车维修艺术 (罗伯特·M.波西格)☆☆☆
  • 腾讯传 (吴晓波)☆☆
  • 小王子 (圣埃克苏佩里)

最喜欢的一本是《月亮与六便士》,“当人们都在看着地上的六便士时,他却抬头看见了月亮”。正如高晓松所说的,生活不只是眼前的苟且,还有诗和远方。不过终归,大多数的我们还是俗人。作为俗人,我给这本书五星。

读起来最气势磅礴的是《人类简史》,作者博学多识,从十万年前有生命迹象开始写到21世纪,在历史学之外,人类学、生态学、基因学等领域的知识信手拈来,从宏观角度切入的研究往往得出颇具新意而又耐人寻味的观点,读起来非常有趣。也给五星。

最温馨的是《岛上书店》,在各个网站排行榜上都看到在推荐这本书,很温情的故事,叙事方式也很特别。书中关于书店的出路与电子书的关系的讨论,值得思考。推荐。去年看的类似的书籍是《解忧杂货铺》,也是值得一看的。

传记类的看了《腾讯传》和香奈儿前CEO莫琳·希凯的《深度思考》,感觉都很一般,尤其是的《腾讯传》,公关味道很重,不是很喜欢。本来对传记类的书就不感冒,后续此类不再关注。

关于个人修养类的书看的比较多,占了1/3,涉及冥想,佛与禅,易经等,算是了解个大概,还没找到内心的认同感。不过读多了发现各种哲学宗教等多少会有一些相似之处。立竿见影的效果看不出来,潜移默化总会有一些吧。

2017年我的年度书籍是叔本华的《人生的智慧》,那么2018年我把此荣誉留给毛姆的《月亮与六便士》。

读书心得

庄子说,吾生也有涯,而知也无涯;以有涯随无涯,殆已!意思是说人生有限,知识是无限的,用有限的人生去追求无限的知识,就会搞得精疲力尽。

读书也是如此,所以,看书要有选择的读,不是读的越多越好。佛经里说,莫贪。其实,贪恋读书,也是贪。

关于选书,一般我会看豆瓣的评价。不过,评分高的,有时候也未必适合。有两种情况要特别小心:

  • 评分的人很少,虽然评分高,但是只有少数人评分,这种情况,未必是好书。
  • 高分的书,其实未必适合你。尤其是某些专业性的书,可能具备一定门槛,如果基础不好,可能看不懂。

新年读书规划

18年实体书和电子书一共买了有几十本,只读了10几本书。真可谓买书如山倒,读书如抽丝。新的一年,计划把存量的书看完。

统计了下近几年的读书记录,发现每年的年初和年末会读书比较多,剩下的时间读的很少。这个一方面和工作的忙闲有关,另外也是个人缺乏持续性。所以,今年要坚持做到,慢慢读,周周读(就不说日日读了)。

另外,在读书方法上,今年要更加专注,按照主题读书,这样才能把同一主题的相关内容关联起来,效果会更好。

最后,专业书今年会多看一点,保持专业竞争力。毕竟,winter is coming!

新年寄语

有句话说的好,道理懂那么多,却依然过不好自己的一生。读书也是一样,读万卷书,行万里路,知行合一。