记清除kdevtmpfsi挖矿程序的过程

发表于 2 天前

其实从我的博客诞生不久,博客所在的服务器的cpu不知什么时候开始,常年使用率达到了100%。由于我是一名前端,对linux操作系统仅了解基本命令的使用。所以就一直没管它,任由它负载运行。今天我又闲来没事,使用xshell登录服务器折腾,无意中使用top命令,发现在一个可疑进程kdevtmpfsi,cpu占用非常高,达98%以上。在百度上一搜,好家伙,原来是挖矿程序!服务器运行了近一年,帮别人挖了不和矿吧。于是我开始着手把它删掉。 通过find命令查找kdevtmpfsi文件和它的守护进程文件kinsing find / -name kdevtmpfsi find / -name kinsing 找到后,通通删掉。守护进程会不断的重启挖矿程序,所以这个很关键。 排除是否有可疑定时任务 crontab -l 以上命令可查看本用户的定时任务。还可以直接进入/var/spool/cron 查看所有用户的定时任务。有不是自己定义的话都删除掉。 把kdevtmpfsi和kinsing进程kill掉。 ps aux | grep kdevtmpfsi ps aux | grep kinsing kill -9 进程id 怎么中的招 现在还不知道是怎么被植入挖矿程序的。通过前面3点操作,现在cpu终于降下来啦,开心。博客的访问速度也提升了一点。后续观察是否还会继续重启。 2020年2月22日10:59:52更新: 一夜过去了,反弹了。并没有解决问题。


[填坑] 使用uni-app开发小程序踩坑,持续更新中~

发表于 2019-12-24

前言 最近计划和小伙伴们开发一款小程序,工期一个月,由于我没有学过原生小程序的写法,开发框架选择了更新还算频繁的uni-app,美团的mpvue已经很久没更新了,所以就不考虑了。以下是在下使用uni-app过程遇到的坑点。在这里简单记录下 遇到的问题 引入小程序ui组件库 在开发小程序具体功能之前,首先当然是选择一款ui库了,这样能节省很多时间,我选择了vant-weapp。vant-weapp是一款小程序组件库,在uni-app框架中使用时要注意点是: 1. 小程序组件必需放在wxcomponents目录里的。 2. 当需要在 vue 组件中使用小程序组件时,pages.json配置引入时不要在页面的style的usingComponents下引入,而是应该在globalStyle下usingComponents引入。如果在页面级usingComponents引入小程序组件来使用,嵌套的vue组件是不能用小程序组件的,而且没有任何报错。 example: “globalStyle”: { “usingComponents”: { “van-button”: “/wxcomponents/vant-weapp/button/index” } } uni不支持使用Vue.use注册Vue全局组件 uni不支持使用Vue.use注册Vue全局组件,解决办法是直接在main.js里使用全局注册。 在组件定义标签上不能用v-show // 在组件定义的标签上使用v-show没作用 <my-component v-show=”flag”></my-component> // 在普通标签使用没有问题 <div v-show=”flag”>条件编译v-show</div> 解决办法: 使用v-if替换v-show。需要注意v-if与v-show的区别


[笔记]使用cube-ui popup弹窗,内容过多鼠标能滚动,触摸不能滚动的问题解决

发表于 2019-11-26

使用cube-ui popup弹窗时,发现移动端内容过多触摸不能滚动的问题,使用chrome调试发现使用鼠标滚轮能滚动,百思不得其解。 问题复现: <cube-popup> <div class=”content”> … </div> </cube-popup> .content { height: 100px; /* 固定高度 */ overflow: scroll; /* 超出滚动 */ } 解决方案: 在需要滑动的内容区加上touchmove事件并阻止事件冒泡。 <cube-popup> <div class=”content” @touchmove.stop> … </div> </cube-popup> 为什么这样能解决?知道的同学请告诉我。


HTML和CSS代码格式指南

发表于 2019-10-14

通用格式规则 缩进 使用两个空格为一个缩进级别,不要使用tab或者混合tab和空格来缩进。 注:由于我们使用习惯是按tab键进行缩进,所以编辑器要设置按tab键时填充的空格。 <ul> <li>Fantastic <li>Great </ul> .example { color: blue; } 大写 仅使用小写。 所有代码使用小写,适用于html元素名,属性和属性值(除了text/CDATA),css选择器,属性和属性值。html css属性值为字符串允许大写 <!– 不推荐 –> <A HREF=”/”>Home</A> <!– 推荐 –> <img src=”google.png” alt=”Google”> /* 不推荐 */ color: #E5E5E5; /* 推荐 */ color: #e5e5e5; 尾随空格 去掉尾随空格 <!– 不推荐 (_代表有一个空格) –> <p>What?_ <!– 推荐 –> <p>Yes please. HTML格式规则 通用格式化 为每个块,列表或表格使用新行,缩进每个子元素。将列表项li放在新行 <blockquote> <p><em>Space</em>, the final frontier.</p> </blockquote> <ul> <li>Moe <li>Larry <li>Curly </ul> <table> …


node glob入门

发表于 2019-09-06

glob是一种匹配模式,最早出现在类unix命令行中,用以匹配文件和目录路径。例如我们在命令行里输入ls *.js,在.gitignore写的规则build/*。 以下字符在路径中有特殊的意义: *匹配一个路径中一个或多个字符。 ?匹配一个字符。 […]匹配中括号里面指定范围的字符,类似于正则表达式范围。如果范围的第一个字符是!或^,表示取反,匹配不在范围内的字符。 !(pattern|pattern|pattern) 匹配不适合指定的模式的字符 ?(pattern|pattern|pattern) 匹配0个或1个符合指定模式的字符 +(pattern|pattern|pattern) 匹配1个或多个符合指定模式的字符 *(a|b|c) 匹配0个或多个符合指定模式的字符 @(pattern|pat*|pat?erN) 精确匹配指定的模式的字符 ** 两个星单独出现在路径的一部分,表示匹配0个或多个目录,包括匹配子目录。 点号(dots) 如果一个文件或目录的路径部分是以点号(.)作为第一个字符, 那么它不匹配任何模式除非模式对应的路径部分也是以点号(.)作为第一个字符。例如模式a/.*/c会匹配文件a/.b/c, 但是模式a/*/c不会匹配。因为*不是以点号开始。你可以传入选项dot: true使glob处理点号像正常字符一样。


我是如何入行前端开发的

发表于 2019-08-13

契机 由于一些原因,最近换了一份工作。面试的时候,面试官比较喜欢问的一个问题是:你的专业是农学,为什么要做前端开发?可能面试官想了解一下我的职业规划吧。其实我没有什么规划,想做前端是因为一篇文章而已。16年2月的时候,离毕业还有几个月,我还是很迷茫,不知道将来要干什么。没有感兴趣的东西,学习成绩一般。有一天晚上吧,和平常一样逛了知乎,看到一个培训机构的文章,里面介绍了前端开发这个行业和如何学习前端开发,看完后,我突然就像抓到了救命稻草一般,我心里想,这个我也能做!于是开始漫长的自学之旅。培训班我没有考虑,一个是因为费用太高,动则过万的学费负担不起,二是我对自己的自学能力有信心。所以选择了自学。 前端如何学习 那么,要做前端要学习什么东西呢。我在知乎上做了一番调查。当年的知乎是各行各业的人才的聚集地。程序员也比较多,而我正好遇到前端行业发展最后一波高潮。各种介绍前端的文章很多。我就是他们按照说的路线学习的。 这里推荐阅读几篇不错的文章: 怎样系统地自学前端? – 冴羽的回答 – 知乎 Web 前端怎样入门? – Hawintion的回答 – 知乎 零基础的前端开发初学者应如何系统地学习? – 张帅的回答 – 知乎 前端技术图谱


[翻译]Promise A+规范

发表于 2019-07-06

1.术语 1.1 “promise”是一个对象或函数,其then方法的行为符合本规范。 1.2 “thenable”是一个定义了then方法的对象或函数。 1.3 “value”是任何合法的JavaScript值(包括undefined,thenable或者promise)。 1.4 “exception”是使用throw语句抛出的值。 1.5 “reason”是一个值,表明promise被rejected的原因。 2.要求 2.1 Promise状态 一个promise必须是以下三种状态之一: pending、fulfilled或者rejected。 2.1.1 当promise处于pending状态:   2.1.1.1 可以转化为fulfilled或者rejected状态。 2.1.2 当promise处于fulfilled状态:   2.1.2.1 一定不能转化为任何其它状态。   2.1.2.2 有一个一定不会改变的”value”。 2.1.3 当promise处于rejected状态:   2.1.3.1 一定不能转化为任何其它状态。   2.1.3.2 有一个一定不会改变的”reason”。 此处,“一定不会改变”意思是标识不可改变(即===),并不意味着深度不可改变。 2.2 then方法 一个promise必须提供then方法来读取它当前或最终的”value”或”reason” 一个promise的then方法接受两个参数: promise.then(onFulfilled, onRejected) 2.2.1 onFulfilled和onRejected都是可选参数   2.2.1.1 如果onFulfilled不是一个函数,它会被忽略   2.2.1.2 如果onRejected不是一个函数,它会被忽略 2.2.2 如果onFulfilled是一个函数   2.2.2.1 当promise是fulfilled状态时,传入promise的”value”作为它的第一个参数调用。   2.2.2.2 在promise是fulfilled状态之前,它一定不会被调用。   2.2.2.3 它不会被调用超过一次。 2.2.3 如果onRejected是一个函数   2.2.3.1 当promise是rejected状态时,传入promise的”reason”作为它的第一个参数调用。   2.2.3.2 在promise是rejected状态之前,它一定不会被调用。   2.2.3.3 它不会被调用超过一次。 2.2.4 onFulfilled和onRejected一定不会调用,除非执行上下文堆栈只包含平台代码。[3.1]。 2.2.5 onFulfilled和onRejected必须作为函数调用。(即没有this值)[3.2] …


圣杯布局和双飞翼布局的实现

发表于 2019-06-09

什么是圣杯布局,什么是双飞翼布局? 对于入行前端比较晚的同学,我想这两个布局应该听得比较少,因为我自己就是(捂脸)。一些技术上听起来很吓人的名词,其背后的实现和原理有时候是很简单的。所以不知道不要紧,学就是了。经过一番查证,圣杯布局和双飞翼布局其实是一种三栏布局,就是我们常说的中间自适应,两侧固定宽度的布局。圣杯布局来源于文章In Search of the Holy Grail,而双飞翼布局来源于淘宝UED。我的理解是双飞翼布局是圣杯布局的一种优化实现。 一步一步实现圣杯布局和双飞翼布局 首先是DOM结构 <div class=”container”> <div class=”main”></div> <div class=”sub”></div> <div class=”extra”></div> </div> 这里需要注意的是三列的顺序是主列(main), 子列(sub), 附加列(extra)。这样主列内容是优先加载的。 下面我们编写css, 首先我们设置主列自适应宽度,子列和附加列固定宽度200px。并且三者左浮动 .main, .sub, .extra { float: left; } .main { width: 100%; } .sub, .extra { width: 200px; } 此时的效果是主列占满了整行,子列和附加列被挤到下一行 然后,为了把子列和附加列摆放到正确的位置,需要使用margin的负值定位。把挤到下一行的这两栏往前拉。 .sub { margin-left: -100%; } .extra { margin-left: -200px; } 这样,一个基本的三栏布局呼之欲出啦,但是你会发现主列并没有在正确的位置。它是占满一行的。(由它的内容被子列遮挡可以看出) 所以我们设置父容器container的左右padding,把主列挤出来 .container { padding: 0 200px 0 200px; } 主列是挤出来,但是子列和附加列的位置又不对,摔!它们跟着也被挤了出来,怎么办?这时就要发挥我们的想像啦。既然子列和附加列的位置不对,我们重新定位就好了,使用相对定位,根据自身定位 .sub, …


vue-router多个router-view导致组件重复渲染的问题

发表于 2019-05-29

踩坑 由于业务上需要,需要在标签切换的时候对组件的保持状态。所以用到keep-alive对动态组件进行缓存。这样切换标签时,除了第一次会创建组件外,下次不会再次创建。但是测试小姐姐却提了一个bug,说切换标签时数据没有进行保持。 分析 在debugger的过程中,发现切换标签的时候,组件的created生命周期函数又重新执行了一次,嗯,因为我们的数据获取是在created钩子获取的,所以我首先是检查这个地方。这就触及了我知识盲区了,因为明明用了keep-alive,组件却没有被缓存。请教了同事,也想不出是什么原因会导致组件被再次创建。由于组件中mixin进了其它生命周期钩子逻辑,我们曾一度怀疑是mixin惹得锅。有了怀疑对象,就要排除是不是因为它导致的问题。这里用控制变量法验证,去掉mixin的逻辑,看会不会重复渲染组件。事实证明不是mixin的锅。排除了mixin的问题后,我们陷入困境,无从下手。这时,我们只好重新检查使用keep-alive的代码: See the Pen eaLLBg by chwech (@chwech) on CodePen. 公司代码不方便贴出,还原回来,逻辑就如上面的一样。看完以后觉得没有任何问题啊。再看,感觉有点怪?此处使用了v-for循环了多个router-view! 按经验一般应该只有一个路由出口,会不会是多个路由出口导致的重复渲染?ok, 又有了怀疑的对象,还是按照套路,试试一个路由出口,再也没有重复渲染的问题。 总结 此bug非常隐蔽,找bug的过程也比较low, 都是猜测中排查,所以在此记录一下,以免下次犯同样的错误。


[笔记]javascript中的plain object是什么?

发表于 2019-05-22

axios文档里,配置对象config的params属性必须是一个无格式对象(plain object)或 URLSearchParams 对象。那么什么是无格式对象呢?抱着疑问查阅资料记录一下: plain object就是通过对象字面量或者new Object()创建的对象 以下是redux实现的判断是否是plain object的代码 /** * @param {any} obj The object to inspect. * @returns {boolean} True if the argument appears to be a plain object. */ export default function isPlainObject(obj) { if (typeof obj !== ‘object’ || obj === null) return false let proto = obj while (Object.getPrototypeOf(proto) !== null) { proto = Object.getPrototypeOf(proto) } return Object.getPrototypeOf(obj) === proto …