清明的花信

image.png

古代有二十四番花信之说,宋朝周辉《清波杂记》中说过:

江南自初春至首夏,有二十四番风信,梅花风最先,楝花风居后。

这二十四番花信与二十四节气有关。每年春日,自小寒至谷雨,一百二十日,八个节气,每五日为一候,计二十四候,人们在每一候内开花的植物中,挑选一种花期最准确的植物为代表,应一种花信,这就是二十四番花信风。

所谓花信风,就是指某种节气时开的花,因为是应花期而来的风,所以叫信风。人们挑选一种花期最准确的花为代表,叫做这一节气中的花信,意即带来开花音讯的风候。

立春:一候迎春、二候樱桃、三候望春
雨水:一候菜花、二候杏花、三候李花
惊蛰:一候桃花、二候棣棠、三候蔷薇
春分:一候海棠、二候梨花、三候木兰
清明:一候桐花、二候麦花、三候柳花
谷雨:一候牡丹、二候酴醾、三候楝花

按照二十四番花信的说法,清明三信是桐花、麦花、柳花,桐花是清明的标志,即所谓花信风

古代诗人也常借桐花来照应清明。

家住江南,又过了清明寒食。算年年落尽刺桐花,寒无力。
—— 辛弃疾《满江红·暮春》词

Spring远程命令执行漏洞

这周Spring被爆出存在RCE 0day漏洞,看目前提供的解决方案以及漏洞触发条件似乎可以大致反推测一下原因。

目前解决方案主要还是过滤请求流量中class.*Class.**.class.**.Class.*等关键字,再关联RCE字样,大致可以猜测漏洞是由RCE故障频发的Java序列化机制导致的,在查找了数篇博客确认后,在spring-framework的仓库中我发现了这个PR。

image.png

https://github.com/spring-projects/spring-framework/pull/28075/files

看代码上的注释以及提交时间,似乎漏洞的原因就很明显了。

Java的对象序列化是遵循对象序列化流协议的,所以可以轻易地分析出流中的信息,并且可以进行篡改。

  1. 通过修改序列化流中的数据,可以篡改请求中的数据。
  2. 当篡改的数据不符合序列化对象的格式要求时候,可能会导致在反序列化对象的过程中抛出异常,从而拒绝服务,而频繁的异常又有可能导致CPU Load高等一系列问题。
  3. 反序列化对象时的运行环境中存在有漏洞的jar包,攻击者通过构造恶意数据流可以达到命令执行的效果,这次Spring漏洞触发场景有spring-beans-*.jarCachedIntrospectionResults.class就值得深挖原因了。

推荐一些Serialization相关的文章和工具。

踩坑分享

equal与unique

这周遇到一个很有意思的坑,场景是这样,我们有一张配置表,unique index是name字段,这个name是可以有中文、英文字母和数字组成的,在每次业务在页面修改提交配置时,服务端会去判断时新增或修改后的name以及判断是否和表中现有数据的name重复了(数据量少,查全量对比),使用的是Object.equal。有一次业务修改了name中字母的大小写进行了保存,结果问题就来了,Object.equal会区分大小写,而在向数据库提交时unqie index不会区分大小写,这就导致了更新失败。

这个问题让我想到了另一个有意思的坑,就是汉字的unicode其实是有很多种类的,常用的CJK,以及Kangxi Radical

Unicode字符百科

可以看到下图我两次在console输入的内容是一样的,但得到的结果却不同。

image.png

> console.log('⽹' == '网')
false
> console.log('网' == '网')
true

这是因为第一行两个字分别是Kangxi RadicalCJK,第二行两个字都是CJK

这可能会导致我们日常在文件转化时文字识别出现问题,比如PDF转Word之后突然少了些字。

飞盘运动

飞盘1948年发明于美国,1970年代风行欧美,日本是亚洲最早推展的国家,我国台湾地区首先传入。1994~2000台湾曾四度击败日本,蝉联勇气赛世界冠军的头衔。

具有十余种国际比赛项目,最受欢迎的项目是:飞盘争夺赛Ultimate(或称:极限飞盘), 飞盘高尔夫Disc Golf, 自由花式Freestyle勇气赛Guts四大项。

image.png

2022.04.02

飞盘运动是一种老少咸宜的健身项目,只要有一片空旷的场地就能开心的锻炼与玩耍,其中由于投接的手法千变万化,最能吸引爱好健身及喜爱户外运动的朋友。

书籍推荐

《思考,快与慢》

这周听同事的分享介绍了这本书,觉得很有意思。

大脑有快(直觉性,系统1),慢(理性,系统2)两种思维模式,系统1存在许多偏见,威力巨大且过于自信,系统2因为惰性往往选择相信系统1。

过分的相信系统1往往会导致一些先入为主的偏见和失误,过分相信直觉有的时候并不是一件好事,在我们日常记忆中的过程忽视和峰终定律下,系统1会使决策和体验不协调,即选择出记忆中相对不那么差的(非峰终)、但实际上是相对更差(时间更长)的体验。

这本书我也正在阅读中,所以只是在这里推荐一下。

《思考,快与慢》作者: [美国] 丹尼尔·卡尼曼/[美国]

文章推荐

The JVM Write Barrier - Card Marking

垃圾收集器在新生代中建立了名为记忆集(Remembered Set)的数据结构,用以避免把整个老年代加进GC Roots扫描范围。事实上并不只是新生代、老年代之间才有跨代引用的问题,所有涉及部分区域收集(Partial GC)行为的垃圾收集器,典型的如G1、ZGC和Shenandoah收集器,都会面临相同的问题。

——《深入理解Java虚拟机》HotSpot的算法细节实现

下面这篇文章主要介绍了记忆集卡精度的实现。

《The JVM Write Barrier - Card Marking》

你最好的一条职业建议是什么?

Twitter上有人发了一个推,说他之前问过一个问题:“你最好的一条职业建议是什么?”,他得到了1300多个答案,最后他整理了12条最好的建议。这些建议,也被人整理成了中文发到了微博:

Twitter地址 | 微博地址

  1. 尽可能为别人减少不确定性

    • Uber解决了打车的不确定性
    • 亚马逊解决了送包裹的不确定性
    • 你也可以通过及时更新项目进展来帮老板解决不确定性
  2. 公司比职位更重要

  3. 一旦接受了一个任务,无论多小或者多么不起眼,要把它做的特别好,超出别人的预期。这样你就能建立起一个良好的声誉,让别人知道你总能高质量的完成工作。当你建立了这种声誉,你就能得到更多的机会,更大的知名度,以及更大的成功。

  4. 如果我不能信任你,你再聪明都没用。

  5. 在你的职业生涯中,陪你走到最后的只有你自己。不是你的公司,不是你的经理,不是你的团队,只有你自己。
    在做你所有职业生涯的决定时,优先考虑你自己。

  6. 影响你职业生涯的三件事:

    • 你做什么?(工作)
    • 你为谁工作?(客户)
    • 和你一起工作的人是谁?(团队)

    如果你热爱你的工作、客户和团队,你会非常非常幸运。

  7. 和一个聪明的能激励你走向伟大的人结婚。

  8. 要么能学东西,要么能赚钱。
    否则果断离职,去找一个这两者至少占一样的工作。

  9. 如果一个问题你不问,那么答案一定是“不”。

  10. 选择你的老板。
    你有权选择谁当你的老板,而在找工作的过程中很多人没有考虑到这一点。
    一个优秀的老板可以为你的职业发展提供极大的助力。

  11. 学会阐明你所做的事情的商业价值,而不仅仅是你的工作头衔或者项目。
    不好的例子:“我是一个数据科学家。我创建了3个自服务数据应用”
    更好的例子:“我帮助管理层发现了一个可以节约2300万美元成本的机会”

  12. 职业,本质是一个营销名词,是由那些经营特定类别的梦想的人卖给你的,而他们在贩卖这个梦想时赚了很多钱。
    赚钱,承担风险,有冒险精神。
    但不要让“职业”来限制自己。

Q.E.D.


Talk is cheap, show me the code.