一首小诗
寒蝉凄切,对长亭晚,骤雨初歇。都门帐饮无绪,留恋处,兰舟催发。执手相看泪眼,竟无语凝噎。念去去,千里烟波,暮霭沉沉楚天阔。 多情自古伤离别,更那堪,冷落清秋节!今宵酒醒何处?杨柳岸,晓风残月。此去经年,应是良辰好景虚设。便纵有千种风情,更与何人说?
原创
2020年06月13日 23:35
  • 翟码农
  • php
  • 240
  • 0
  • 0

工作项目中,传感器采集数据的存储是在每100毫秒的定时计划任务中完成的。这一步,是通过swoole中的tick方法实现的。


由于数据还同时往合作方系统的mq有发送,现在合作方感觉数据量太大,认为完全无此必要,设置成每隔几秒几分钟发送一次就好。


所以就诞生了本文要实现的任务:将定时任务的间隔时间,改成后台可以配置的方式。


这样一来,到底是要几秒,还是要几分钟,以后我们根据人家要求直接去后台改配置即可,就不用再去改代码。


本文翟码农主要分享实现思路,所以下面的代码可能有错误,敬请注意。


原本定时任务的实现大致如下:

$server = new swoole_websocket_server($ip,$port);
$server->set([
    'reactor_num' => 4,
    'worker_num' => 5
    ]);
$server->on('WorkerStart',function (swoole_websocket_server $server, $worker_id){
     if(0 == $worker_id){
	$server->tick(100, function(){...});
     }
}
原创
2020年06月12日 22:46
  • 翟码农
  • 每天一首诗
  • 233
  • 0
  • 0

雨打梨花深闭门,忘了青春,误了青春。此句出自于明代诗人唐伯虎之手,全诗如下:


《一剪梅·雨打梨花深闭门》

雨打梨花深闭门,忘了青春,误了青春。

赏心乐事共谁论?花下销魂,月下销魂。

愁聚眉峰尽日颦,千点啼痕,万点啼痕。

晓看天色暮看云,行也思君,坐也思君。


译文:

深闭房门隔窗只听雨打梨花的声音,就这样辜负了青春年华,虚度了青春年华。纵然有欢畅愉悦的心情又能跟谁共享?花下也黯然神伤,月下也黯然神伤。

整日里都是眉头紧皱如黛峰耸起,脸上留下千点泪痕,万点泪痕。从早晨到晚上一直在看着天色云霞,走路时想念你啊,坐着时也是想念你!


此诗一看就是写闺怨的,但如果抛开闺女这一对象,诗句所描述的情感,仿佛就是如今的你。


青春?都说青春像一场烟火,只可惜已不大记得那场烟火的灿烂,只知道是已经消失在了黑夜里了的。


如果说青春里,真的有热烈地恋过谁爱过谁,那倒也不算辜负了青春。可惜生活不是电影,青春期里的你,或许根本就生涩到没一丝丝开窍。


如今回首,也只能感慨“忘了青春,误了青春”。


结束学海生涯进入社会后,就开始与朋友天各一方。慢慢的,投缘的同事也开始都有了自己要关心的人,有自己要关注的事,再来一场聚会,也没得从前那么简单方便了。

原创
2020年06月11日 23:32
  • 翟码农
  • php
  • 197
  • 0
  • 0

写程序时,if语句随处可见。


有时,我们写if语句时,只知道在A条件下要做B动作,不然就做C动作。我们会如下写:

if( A ){
  do B;
}else{
  do C;
}

此种情况,我们并无需思考else对应的条件逻辑是什么。


当A条件很简单时,例如就一个表达式时,例如判断一个变量是否等于某个值:$a == 3,这种情况只要大脑没进水,就知道else走的是$a变量不等于3的逻辑。


但本文翟码农要分享的是,当A条件很复杂时,在else里要继续做if判断(即涉及到嵌套if了),该如何理清else对应的逻辑。


例如,当A条件为(Ea  && Eb )  ||  Ec )时, 该如何确定else对应的逻辑?这里Ea,Eb,Ec代表3个判断条件。


有时候头脑清醒,你可能还能想清楚。但疲累异常时,你很可能就实在想不清楚,到底哪些情况,会走else语句块。


方法就是:利用集合思想。


上面的(Ea  && Eb )  ||  Ec )条件表达式,我们可以转为(Ea ∩ Eb) U Ec这样的集合表达式。如此一来,else走的逻辑就是:^(  (Ea ∩ Eb) U Ec  )。

原创
2020年06月07日 22:46
  • 翟码农
  • 电影佳片
  • 142
  • 1
  • 0

之前在头条里偶然刷到《请回答1988》里德善被家人忽视的情节视频,这次出差高铁上12小时,正好无聊在爱奇艺里看到了这个剧。


这是一部关于双门洞里四个家庭的生活故事——从1988年到2000多年。里面关于父爱、母爱、友情、爱情的细节真是无处不有,演员演技也都好给力,真是很能骗人眼泪呢。


从一开始妈妈叫喊回家吃饭、德善一群玩伴整齐地坐在阿泽房间一起看电影的画面,再到结尾双门洞人去楼空巷静的画面,让人真是感慨过去的那些美好时光啊。


从前的桃李春风,变成了如今的江湖夜雨。从前的和睦邻居,变成了如今天各一方的羁旅。从前门前院后的欢声笑语,变成了如今来去匆匆而沉默少语的身影。即使是谈到从前的月色,似乎感觉也会显得比如今更加朦胧而又柔情。就如这双门洞,初始烟火气十足,落尾却尽显空荡荒凉。这一切的刽子手,都是时光,那抓不住又留不下的时光。


如果没有时光,时代就不会发展,我们也不会长大,双门洞的画面或许就是一眼温情一生的天堂。可惜这个如果,断然是没有的,双门洞的离散,也是必定的结局。


也许正是因为时光易逝,我们才会叹惋和感伤,我们才会知道去关心爱护自己所爱的人。所以看了《请回答1988》,虽然看的是双门洞的那段时光,却也是我们那些逝去的青春时光。

原创
2020年06月05日 23:55
  • 翟码农
  • 每天一首诗
  • 212
  • 0
  • 0

范仲淹的《苏幕遮·怀旧》全词如下:


《苏幕遮·怀旧》

碧云天,黄叶地,秋色连波,波上寒烟翠。
山映斜阳天接水,芳草无情,更在斜阳外。

黯乡魂,追旅思,夜夜除非,好梦留人睡。
明月楼高休独倚,酒入愁肠,化作相思泪。


翟码农欣赏此诗,主要就在于头两句的美景描写。


也许真实的情景并不美,但读起来,就让人感觉美。


碧云天,什么样的天,还有绿色的云?


经百度,才知道碧这个字,除了我们所理解的“青绿色”之外,还有青白色、浅蓝色之意。如此说来,浅蓝色跟云搭配就没有什么难以理解的了。









原创
2020年06月03日 00:34
  • 翟码农
  • 维护日常
  • 297
  • 2
  • 0

一天天的踩坑,时间就是这么不够用的。


工作这么多年,一直没用虚拟机过。这次由于工作需要,需要将环境都预先在虚拟机里搭建好。


这次虚拟机安装,不是与系统版本冲突就是各种问题,暂就不提了。主要就记录下费时较多印象较深的一些问题。


标题里错误原因,请看文章里第4个问题。


本文虚拟机软件:Vmware。


问题1:虚拟机里wampserver安装,总是提示少了msvcp110.dll或msvcp120.dll的?

以前遇到这种问题,都是缺啥补啥。这次从100到140版本,我都已经拷贝到C:\Windows\SysWOW64文件夹里进去了。


卸载又重装,折腾了三四次,仍然还是报这种少了文件的错误。


经过百度尝试,下载DirectX工具进行修复,修改C++ Redistuibute系列,最终解决。


问题2:代码从本机拷贝进虚拟机,速度超慢还有时中途失败。

从本机拷贝文件到虚拟机,安装Vmware Tools就可以直接复制往虚拟机里粘贴了。


开始拷贝一些文件还很快,后面遇到项目代码,可能是Vendor文件过于繁多的缘故,四五百兆的代码,一动就是要三四十分钟,有时还拷贝一大部分,结果给你抛个“没有权限生成目录”的啥错误提示。把代码压缩了,能很快复制过去,可是在虚拟机里提取又却很慢,有时也会失败导致根本不能解压。

原创
2020年05月29日 00:08
  • 翟码农
  • 前端综合
  • 138
  • 1
  • 0


1. Vue中动态变量的绑定

vue中v-model变量的绑定,要求变量需要先有在data里声明过。


当遇到v-for遍历数据时,v-model里变量就需要每一次都不一样。直接用后端唯一性数据作为变量,虽然保证了for遍历后,v-model绑定的变量都不一样,但是这些变量并没有在data里有声明,所以也会报错。


解决方法就是:

现在data里定义一个变量,然后在created方法里获取后端接口数据时,再初始化每一个v-model要绑定的变量。


例如,后端接口有个唯一性id数据。

先在data里定义个变量:

info_arr: []


然后created方法里调用后端接口,遍历接口结果,初始化数据:

created: function(){
backend_api({
}).then( (res) => {
res.data.data.forEach( item=> {
this.$set(this.info_arr, "info_" + item.field_name, '');
});
})
}


最后在页面v-for里,v-model动态绑定变量,你就可以如下这样用了:

原创
2020年05月24日 23:56
  • 翟码农
  • 每天一首诗
  • 234
  • 0
  • 0

文章标题里这句诗,出自于宋朝周邦彦的《苏幕遮》这首词,全词如下:

《苏幕遮·燎沉香》
燎沉香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳干宿雨、水面清圆,一一风荷举。
故乡遥,何日去。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。


一句诗,好不好,有时候尽管读者说不出个所以然,但也是能感觉到的。


一句诗,一旦和读者以前所见心中所想关联起来,就自然而然的让读者轻松地记住了它。本文要说的这句诗,翟码农认为好就好在这里。


叶上初阳干宿雨,水面清圆,一一风荷举。这句诗一念完,朝阳升起,水面如绿色圆盘似的荷叶一片一片漂浮着,泛着些许晶莹的雨水,其中一些出水的荷花,亭亭玉立,在风中曼妙起舞,就犹如这样的一幅似曾相似的画面感跃如脑海。


要能达到感觉相通的这般境界,诗句的每一个字都少不了要下苦功夫。


同样写荷花,你读“接天莲叶无穷碧,映日荷花别样红”,你就会感到这句诗所给的画面,是一种千千万万荷叶耸立着簇拥着的画面,给人一种蓬勃的生命力的感觉。跟本文里的这句诗比较,稍加体会就感觉本诗里的夏季,相较于《晓出净慈寺送林子方》的夏季,气候要凉快一些。事实上,从诗词里的时间也是可以看出来的。“毕竟西湖六月中”提的是六月,而本诗里却是五月,可见古人文采真是绝伦,才造就了如此精妙的诗词。

原创
2020年05月19日 00:18
  • 翟码农
  • redis
  • 114
  • 0
  • 0


一秒钟800条的采集数据往redis队列里丢,翟码农取出消费,多进程,lrange+ltrim每次500条,redis pipe管道全用上了,还是消费不过来。


之前处理一条数据产生5条警告数据,生成与消费两边速度相当。但当一条数据产生50多条警告时,消费就明显吃力。


为了更好的优化代码,打日志后发现其中有个redis 的incr命令方法严重影响到了性能。


当时多进程运行下,$id = $redis->incr($key)这一行代码耗时240毫秒,如果直接换成$id=1,就是微秒级了。


不难理解,redis由于是单线程的,在对$key进行自增时,防止多进程下生成相同id值,redis必然会对$key进行加锁,如此就相当于每个进程必须等待上一个进程处理自增结束后,才可开始自己的自增操作。


所以实在对代码感到无能为力时,就按这种傻瓜方法来吧,每段都加上时间耗时的计算日志,这样子也不用劳神苦思的想了,直接看耗时结果来找问题。


本文为翟码农个人博客里有关开发经验总结的原创文章,转载请注明出处:http://www.zhai14.com/blog/watch-the-command-of-incr-in-redis-when-run-multiple-process-program.html

原创
2020年05月10日 01:07
  • 翟码农
  • php
  • 173
  • 0
  • 0

昨天和今天两天,都在折腾这个问题,今晚总算是解决了。趁现在记忆还清晰,赶紧复盘一下。


项目分3个部分:

1. python采集传感器数据,lpush到采集队列

2. php从采集队列pop数据, 进行处理,同时提供后台系统接口

3. 后台用的vue框架,实时展现采集过来的设备数据


问题是:

后台有一项设备在线离线的状态数据,在连接上传感器之后,数据总是在在线和离线之间切换,也就是本文题目所说的数据闪烁的bug。


问题涉及在于项目的2、3部分,所以第1部分本人就在此忽略了。


下面就开始复盘排坑经历。


一.页面数据展示有问题,首先想到的就是确保接口是否有问题。


接口的设备在线状态数据,是从redis里设备数据种获取的。

而设备数据其中的状态,是在一个swoole定时任务里写入的。

这个swoole定时任务,就是遍历所有设备,来确定设备的真实状态,具体逻辑如下:


有一个redis hash key,存储设备最新采集的数据,每个设备最多只有一条数据(即可能也没有)

1. 用for循环遍历设备,当前时间,如果比采集数据里的采集时间大于一个设定值(此值后台可设定),就很有可能代表设备离线,否则就必定是在线。

2. 如果最新采集数据里没有当前设备的数据,则必定是离线