2020,活着努力,努力活着

前言

这篇文章本是2020年12月30日夜里开始起草的,但是到现在才写完。我也不知道具体是什么原因,年纪大了?工作太忙不想写东西?还是把握不好哪些东西想写出来,哪些内心的想法又不想表露?可能是自己一直琢磨不好,一直有犹豫到现在吧!管它呢,内心一直认为自己是刚毕业的学生,甚至于总觉得自己是个孩子。最近经历了很多,希望看到的,不希望看到的都遇到了。感觉更像是生活在推着前进,逼着我成长。父母年迈身体开始出现不好的状况,孩子稚嫩需要悉心陪伴。深深地感受到了什么叫“上有老,下有小”的处境。文章写到现在已经不简单是2020年的总结,因为21年已经过了将近一半(现在是2020年五一劳动节假期)。

继续阅读

空空2019

2019年,转眼间又要过去了。

渐渐地,习惯了把不忿的事情放在心里。也渐渐的少了写东西的习惯。如果说这就是成熟的步伐,那确实,我就在路上。

2019年春节过后,各方面让我觉得,工作上可能不在是我感兴趣的方向。不是没了动力,而是没了机会。正如我去年所说,在我眼里,机会远比结果更重要。学长安利我去杭州阿里西溪园区的天猫。在京东几年来,我第一次没有拒绝。本着面着玩的心态,简单整理了一下简历后,也没做什么准备,便迎来了裸面。好在陆陆续续的几轮笔试,面试都顺利通过。最后的HR薪资也给我定了。跟当前的薪资比较有一定涨幅,但不是特别大。这才真到了抉择的时候,妻子说:杭州离家确实太远,但是还是一如既往的支持我的选择。我很幸运遇到这样一个愿意走到哪儿陪到哪儿的老婆。母亲表示,还是希望我留在北京,毕竟离家近,各方面也比杭州要好些。我犹豫了好段时间,迟迟没有给HR答复。而最终决定留下来,除了各种因素外,有一大原因就是,今年需要安稳的要个Baby,而这段时间父母过来照看会方便许多。

最终还是放弃了这次机会,我觉得在目前的岗位虽然没有了更多的项目挑战,但说不好就有新的机会呢?毕竟我的运气一直还是不错的。

然而,今天揭晓答案,这一年大部分时间确实是浪费了。一个网关的运营工作浪费了我将近一半以上的精力。虽然近两个月迎来了好些事情。项目对银行的输出,导致各种前往上海出差。以及APP场景下的消息Push亟需这个通道的建设,其实就是IOT场景的MQ。对于我,这才算来了机会,虽然,它来的有些太迟了。

如果说19年满意的事情,那就是Baby很健康,期盼20年健康的诞生吧。

APP后台架构设计

项目背景&前期铺垫

2018年金融组织结构大调整,新的组织结构是中台研发。期初我对这个名称也感觉新鲜,了解后就发现,是连接前端部门与各业务部门桥接与提供公共服务的部门。
新组织架构调整伊始,开始对接各种项目,最繁琐的或许就是重前端的活动页搭建项目,也许因为这个原因吧,领导把我安排到了接收这个项目的“营销与权益”组。接手别人的项目总是痛苦的,以至于最后我们打算自己做一套。虽然很复杂,但是慢慢来应该不成问题。所以我决定全新用Spring boot2+,管理界面界面采用ElementUI做SPA,搭了一套还算比较完整的项目。总觉得以往的项目还是太过于陈旧,新项目就全部用最新的技术和框架重新搭建。小组成员们边了解需求边尝试,用了几周的时间做好了基础版的拖拽生成页面的Demo。当然没有专业前端的加入,界面还是比较丑陋的。

突然降临的挑战

上层领导决定公司APP大改版,时间很紧迫,任务非常重。原先交接过来的系统不能够支持新版APP的页面数据结构。虽然时间非常紧迫,从接到任务到上线预计也就一个月的时间,但考虑的需求比较简单还是决定全部重新做(后来发现,先期了解的需求并不全面,真是把自己给坑了)!有了上面“活动搭建”项目的后台,新项目进展还是比较迅速的。经过了解需求,思考了一下午,我大致想做一套基于领域模型驱动的架构(虽然由于自己才疏学浅,并没有在项目中把领域模型驱动设计发挥出来,但初衷还是有的),也就有了第一次小组会议我在墙上画下的初步架构设想图如图1:

第一次会议架构设想图
继续阅读

硬盘序列号获取之坑

前言:

发文近些年越来越少,这并非自己所愿。但是确实感觉没什么好写的,尤其是工作中遇到的一些问题,如果很容易Google到答案,那我是肯定不会再自己赘述一遍的。再就是感觉工作愈发枯燥,心里也是惴惴不安,如果工作环境,内容,团队,缺乏激情,就应该慎重考虑一下了!这样并不是自己想要的~恰巧工作中遇到的这个问题,解决费了很大功夫,并且Google,Baidu上资料很少,没有找到现成的解决方案,所以就有了此文。以希望后来人遇到此问题时,能检索到此文,给予帮助。

场景:

首先场景时发生在自己写的量化交易客户端软件上,券商交易,要求记录用户操作计算机的IP,网卡MAC地址,硬盘序列号信息。其中IP与网卡MAC地址是很容易获取到的,硬盘序列号其实获取也不难,只不过在低版本Windows系统行就有了坑,比如Windows7,通过相关命令获取到的并不是真正的序列号,而是经过每4位HEX字符经过little endian的总长为40为的字符串。比如:

命令:wmic diskdrive get serialnumber | wmic path win32_physicalmedia get SerialNumber | wmic path Win32_DiskDrive get SerialNumber
结果:32535554574e4741314134313532204a20202020

而通过专业软件获取到的真实硬盘序列号:S2TUNWAGA11425J

继续阅读

基于WebSocket的实时动态图表

本文介绍一下基于WebSocket的实时数据双向通讯的小范畴应用,来实现实时动态图表的展示功能。其实实现图表动态更新又岂止是只有这一种方法。用户页面端的js心跳轮询一样可以获取来自后台的最新数据,只是我感觉那是伪实时。

首先介绍一下什么是WebSocket?

WebSocket是HTML5开始提供的一种在单个TCP 连接上进行全双工通讯的协议。 WebSocket通讯协议定于2011年被IETF定为标准RFC 6455,WebSocketAPI被W3C定为标准。 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。 两者之间就直接可以数据互相传送。或者看一下来自国内知乎上的解释:https://www.zhihu.com/question/20215561

项目需求:

其实标题说的很清晰了,就是要实现图标的实时动态更新,当时我的第一感觉就是要采用WebSocket去解决这个问题。而我的数据来源是来自MQ(消息队列),也就是触发数据推送就是在消息消费的地方。

继续阅读

北京的2016

时间真快,多俗气的感叹!可又是最真实的内心写照。每年的最后一夜,每年的一文总结。这一年365天,综合而言,这段日子过来了,虽然穷些,但还算温馨。过了年就27了,可我更喜欢周岁,这样看起来是不是小一点?写之前,先看了一下去年的同一时间。里面有感概,有过往,有收获,也有期望。就如同昨日的感慨一样,这一切忽然之间就画上了年的分隔符。不管怎样,时间没有骗人,加完班,抢完红包,着手起草此文。
败家于电子设备
14年有梦想的实现,有种种的获得,当然也有种种的愿望。15年上半年,便拿下了去年底一心挂念的Macbook,愿望实现的还算快(或者说败家败得挺快的)。继iPad,Macbook之后,下半年又入手了iPhone6s。我说我怎么没攒住钱呢?终于找到了一点原因!
投身运动
在韩都的收获之一,就是让我爱上了运动。羽毛球,很有价值的一个体育项目。这一年,没少运动,当然还有很大的原因就是一直在减肥。自从工作至今,已经从120斤要跑步到150斤了。必须及时制止,要不然要毁在这体重上面。 继续阅读

Spring Batch与MyBatis结合案例

看了一下博客,好几个月没写什么文章了。再不写,估计Google再也不来了!^_^闲话少说,这次的主题就讲一下Spring Batch。Spring Batch是Spring与Accenture的合作产物。作为前Accenture员工,感觉还是很亲切的。当然这是不是我在工作中技术选型的主要原因,更重要的是看中他的强大!
业务背景:
金融系统中有一种表叫台账表,这也是在接触这个领域后才知道的。而针对这张表,每天会进行定时全表遍历进行计算利息,费用等相关操作,也就是俗称的跑批。而跑批无非就是遍历循环表中数据再进行运算而已,可是一旦数据量上去了,很多看似简单的事情往往实现起来就不再是原先的逻辑了。一张上亿行数的表,查询出来,放到内存?那肯定是不明智的做法。当然应该采用游标或者分页的查询方式去实现更好的性能。而自己去写这类方法,其实并不难,如果只是简单地为了分页查询,确实可以自己去写一个。而之所以此处选择Spring Batch,是因为它不仅仅支持这一点特性,它能做的还有很多很多。
系统背景:
系统是典型的Java Web系统架构,Spring MVC与MyBatis。当然其他诸如服务治理,消息消费等就不赘述了,此处跟那些没有太大关系。而之所以有这篇文章的出现,正是因为MyBatis。因为在我使用过程中,查询大量资料,唯独与MyBatis集成的相关资料特别少。官方的jar包里也是针对ibatis做的封装(并且已经标注为废弃状态),而MyBatis自身针对Spring Batch做了分页Writer和Reader,此次我们主要就是用这两个类。外加用Java Config自动生成Step与Job方式,避免使用xml配置,对于有代码洁癖的人来讲,过多的配置文件感觉很乱很脏。 继续阅读

Java垃圾回收机制详解

对于Java垃圾回收机制这个问题,一直是Java招聘面试津津乐道的一个问题之一。就好像答不上此问题就证明你不够NX一样。在此将这个问题做一下整理,以备后人方便。

Java语言中一个显着的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制, Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 继续阅读

Activiti生成动态流程图

最近又开始忙活工作流的相关工作了,第一次接触工作流也就是我在埃森哲的第一个项目,也是最后一个项目。那时候用的是日本的一整套解决方案好像叫-iMart。而进入金山工作后第二个项目也是和工作流密切相关的项目,那时候才接触到了这个开源工作流引擎-Activiti。那时候也是第一次真正了解这些东西。只是从金山离职后回到现在的公司,没想到还要用这些东西,好像又回到了去年的这个时间。
这一次需要重新集成这个引擎,以插件包的方式。其实工作量不大,因为Activiti已经自己封装的很好了,完全可以在日常开发中直接引用它的Service。闲话少说,这次解决工作流流程图问题。简而言之,在任何一条已启动的流程实例查看流程状态,用流程图片的形式展示一下。
提供的Service方法如下:

继续阅读

Scala快速入门

#定义变量var

var name = “chen”

name = “zhiguo”

#定义常量val 首次复制后不可以再改变

val two = 1+ 1

#定义函数def,等号左侧是函数名、函数列表和返回值,右侧是函数体实现的表达式。

scala> def addOne(m:Int): Int = m+ 1

addOne: (m: Int)Int

scala> var x = addOne(123)

x: 124 继续阅读