深入理解事件循环和异步流程控制
javascript的执行分为三个部分:运行时,事件循环,js引擎。运行时提供了诸如注入全局API(dom,setTimeout之类)这样的功能。js引擎负责代码编译执行,包括内存管理。之前写了一篇关于javascript内存管理的文章,具体可见javascript内存管理以及三种常见的内存泄漏javascript执行示意图如下所示:事件循环与回调队列相对应,负责处理我们的异步逻辑。本篇文章将会从事件循环的诞生背景(解决什么问题),处理异步执行问题的思路(怎样解决的问题)以及javascript语言层面对于异步逻辑编写的封装事件循环(eventloop)为什么我们需要事件循环作为前端工程师,我们都知道javascript是单线程的。所谓单线程,就是在同一时间我们只能响应一个操作,这带来的问题是如果某个操作极为耗时,比如处理复杂的图像运算或者等待服务器返回数据的过程,典型的场景如下所示://Thisisassumingthatyou'reusingjQueryjQuery.ajax({url:'https:/
用commander做一个自己的eslint脚手架
如今前端工程化,自动化已经成为了新趋势,如果我们要重新开始做一个项目,你会花费多久的时间在前期环境的搭建上呢?在我们前端的的积累中,我们需要将这些技术沉淀下来,便于我们开始一个新的项目,而不必花费过多的经历在环境搭建中。这次我做的是一个集成了eslint、stylelint、githook的前端代码检查工具。项目已经开源在github上,名字叫做oishi,一开始想起名叫husky(哈士奇),后来这个名字被占了(无奈脸)。先来理一下我们这个工具需要做什么事情需要让他初始化eslint,stylelint的配置文件安装好我们需要的依赖挂载git钩子,在代码提交时进行进行eslint检查有了目标我们开始实现我们这样的一个工具:1.准备工作这次我们采用commander来开发我们的命令行,利用chalk来美化我们控制台的输出,利用shelljs来执行我们文件中的一些脚本在本地调试时需要在package.json中配置bin选项,然后开发好后npmlink发布到本地的全局,就可以开始使用自己的命令行了2.进
Jenkins多个HTML注入漏洞(CVE-2017-17383)
局域网内利用GitLab+Jenkins自动生成GitBook并发布(Nginx)http://www.linuxidc.com/Linux/2016-05/131136.htmLinux+Git+Maven+Jenkins+Neuxs自动化编译环境搭建http://www.linuxidc.com/Linux/2016-02/128652.htmCentOS6安装Jenkinshttp://www.linuxidc.com/Linux/2016-05/131365.htmJenkins服务器搭建指南-官方文档翻译整理http://www.linuxidc.com/Linux/2017-10/147281.htm使用Jenkins配置Git+Maven的自动化构建http://www.linuxidc.com/Linux/2016-02/128641.htmJenkins+Maven+Git搭建持续集成和自动化部署的配置手记http://www.linuxidc.com/Lin
前端常用类库资源
Particles.js—一个用来在web中创建炫酷的浮动粒子的库Three.js—一个用来在web中创建3d物体和3d空间的库Fullpage.js—快速实现全屏滚动特性Typed.js—打字机效果Waypoints.js—滚动到某个元素位置时触发一个功能Highlight.js—web语法高亮Chart.js—使用JavaScript创建漂亮的图表Instantclick—能够明显加速网站加载时间,鼠标hover时预加载资源Chartist—另一个图表库Motio—一个基于动画和平移的雪碧图库Animsition—CSS实现动画过渡的jQuery插件Barba.js—流式页面过渡TwentyTwenty—一个对比图片的可视化diff工具Vivus.js—在SVG上绘制动画Wow.
实验进行中:.NET WebAssembly支持
目前四大主流浏览器都默认支持WebAssembly,而.NET社区也在继续推动为.NET开发者提供相关能力,来将他们的代码编译成WebAssembly,然后在浏览器上运行。WebAssembly是一种二进制web格式,旨在以接近原生的性能运行不是用JavaScript语言编写的应用。目前,C、C++和Rust都可以通过基于LLVM的工具链来编译成wasm格式。这些语言编译成原生代码,然后可以在没有任何附加代码的情况下运行。当然,.NET通常需要一个运行时平台来执行代码,因此在浏览器中使用它在理论上是可行的,只是需要一些额外的工作来让它更高效地运行。其中一个非常可能实现.NETWebAssembly的项目,是被SteveSanderson称作Blazor的项目,虽然它还只是一个进行中的实验,远远没有生产价值。Blazor在Mono运行时平台上,运行被编译成wasdm格式的.NET代码。目前,这导致一个“HelloWorld”应用的负载比预期中要大,Sanderson说:自从迁移到Mono运行时平台,新的Bl
深港澳大湾区第三次.NET技术交流会圆满成功
深港澳大湾区第三次.NET技术交流会圆满成功2017年12月10日,一场以云、devops、微服务、容器是现在这个发展阶段的软件形态,本次活动我们围绕这些话题介绍.NET生态下的发展本地社区活动,这次活动还得到如鹏网杨中科老师的大力支持开通网上直播,网上有229位参与活动,现场场地有限,也有40多位,中间有些同学走了,坚持到最后一起拍照只有20多位,这次活动还是在大湾区标志的深圳深圳湾科技生态园。本次活动有3位讲师给大家带来SQLServer2017,微服务和VSTS介绍的内容,SQLServer2017可根据需要运行本地部署的SQLServer还可以跨平台运行,当可以采用云服务时使用AzureSQLDatabase。舒永春是资深的SQLServer专家,给大家分享了SQLServer2017的最新信息供大家选型参考。陈文奖对微服务进行了深入而全面的介绍,迁移到微服务的绞杀模式才是正确的做法给大家印象深刻。最后我花了半个小时给大家简要的介绍VSTS在Azure香港数据中心落地后,对VSTS的利用。舒
这是程序员迄今为止被黑最惨的一次!
我倒是很理解软件工程师的自黑行为。软件工程师自黑收入低,我觉得和清北的学生觉得自己是学渣一样,不单纯是得了便宜卖乖,而是在它所处的环境确实比较低。用一种老土的说法就是,软件工程师作为无产阶级中收入最高的群体,能够接触到很多资产阶级的人群,相比之下就能感受到无产阶级的苦逼,而其他无产阶级,连接触的机会都没有。年仅25岁的程序员小张走在上班的途中,朝气蓬勃!勾引我?不存在的我还有代码!
你见过黑程序员黑的最好的段子是什么?
今天给大家分享程序员9个看到就会笑喷的图片,就在下面了,但是分享之前先来段笑话:有一天,渔夫、工程师、程序员聚到了一起,忽然争论起谁的职业最早出现这个问题。渔夫:渔夫这个职业从人类近来出捕食的本能时就应该存在了。我应该是最早的。工程师:是上帝创造了世界和人类,所以上帝算一个工程师。所以工程师是最早出现的职业。程序员:那上帝创造世界之前这里是什么样的?渔夫:是一片混乱。程序员很兴奋的说:对啊,对啊,你们知道是谁创造了混乱吗?
《程序员的自我修养》读书总结
最初买《程序员的自我修养》这本书,只因为在京东买书差一些钱,不够用优惠券。买回来以后的很长一段时间,我都以为这本书只是程序员用来调侃和自黑的。不过翻读了第一章以后,我就发现自己错的太离谱。我觉得即使一个不使用C/C++,甚至是写解释性语言(如JS等)的程序员,也有必要抽空读一读这本书。作为使用OC或Swift的iOS开发者,我认为这本书是必读的。所以这篇文章会简单梳理一下《程序员的自我修养》这本书的脉络结构,如果时间有限,又想快速阅读这本书,可以先看看这篇文章。标注了页号的地方表示详细知识可以在给出的页数获取详细的知识。为了简化问题,有些地方会省略一些原文中的细节,一切为了保证读者快速了解这本书。对于不是专门从事C和底层开发的程序猿来说,个人认为完整的看完本书的所有内容是不太现实,也不太必要的。这本书中有两大部分的知识点对于新手来说非常有必要了解:一段源代码是怎么变成最后可执行的程序的一个进程,在内存中是什么样的带着这两个问题去读书,收获会更大。在阅读原书之前,这里有几个相关内容的总结,我尽可能用简单的语言介绍某些知识背景。即使不能完
mysql踩坑系列之查询空格
业务背景某个雷电交加上线夜的凌晨zzz:测试小伙伴突然反馈了问题,某个业务去重失败导致db中重复插入数据。知识背景mysql作为传说中的开源界RDBMS翘楚,在官方文档上如是描述11.4.1TheCHARandVARCHARTypesTheCHARandVARCHARtypesaresimilar,butdifferinthewaytheyarestoredandretrieved.Theyalsodifferinmaximumlengthandinwhethertrailingspacesareretained.TheCHARandVARCHARtypesaredeclaredwithalengththatindicatesthemaximumnumberofcharactersyouwanttostore.Forexample,CHAR(30)canholdupto30characters.The
MySql优化器的bug?
104052_Cwfr_871390.png优化器选择了先走C表的全表扫描【而m表上有id_own_org的索引】假设我们使用强制索引104205_xHsI_871390.png基本耗时在0.23s左右效率相差数十倍104238_CUIm_871390.png执行计划明显走了m的id_own_org索引。那么很明显其实该表的索引区分度并不高104254_LDaO_871390.png由于我们是SAAS系统那么id_own_org作为每一家门店的标志想必也是应该作为高频查询条件。但是为何这边没有走到索引呢?分析首先了解一下业务由于系统中同一个公司不同门店下面的车辆是通用的,所以存在如下问题一开始做数据系统迁移时系统中大量导入比如某个公司大约有20家门店【所有的车辆投在同一个门店内导入】那么假设存在8w两车辆那么这8w辆车基本全部存在某个对应的id_own_org下。因此考虑是否可能是id_own_org分布不均导致出现走的全表扫描呢?首先找到某个主门店同时去除对应门店使用如下查询104402_NLZ
mybatis 批量更新
此前的方案在做批量时使用mybatis提供的batchmodel,该模式下将推迟所有的update(包括insert和delete)语句直到提交事务或者遇到一次查询语句@OverridepublicintdoUpdate(MappedStatementms,ObjectparameterObject)throwsSQLException{finalConfigurationconfiguration=ms.getConfiguration();finalStatementHandlerhandler=configuration.newStatementHandler(this,ms,parameterObject,RowBounds.DEFAULT,null,null);finalBoundSqlboundSql=handler.getBoundSql();finalStringsql=boundSql.getSql();finalStatementstmt;if(sql.eq
MySQL 引擎特性:InnoDB Buffer Pool
原文出处:水中的泪前言用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入了这一中间层,数据库对内存的管理变得相对比较复杂。本文主要分析MySQLBufferPool的相关技术以及实现原理,源码基于阿里云RDSMySQL5.6分支,其中部分特性已经开源到AliSQL。BufferPool相关的源代码在buf目录下,主要包括LRUList,FluList,Doublewritebuffer,预读预写,BufferPool预热,压缩页内存管理等模块,包括头文件和IC文件,一共两万行代码。基础知识BufferPoolInstance:大小等于innodb_buffer_pool_size/innodb_buffer_pool_instances,每个instance都有自己的锁,信号量,物理块(Bufferchunks)以及逻辑链表(下面的各种List),即各个inst
javascript设计模式——单例模式
javascript设计模式——单例模式前面的话单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式是一种常用的模式,有一些对象往往只需要一个,比如线程池、全局缓存、浏览器中的window对象等。在javaScript开发中,单例模式的用途同样非常广泛。试想一下,单击登录按钮时,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建标准单例要实现一个标准的单例模式并不复杂,无非是用一个变量来标志当前是否已经为某个类创建过对象,如果是,则在下一次获取该类的实例时,直接返回之前创建的对象。代码如下:varSingleton=function(name){this.name=name;this.instance=null;};Singleton.prototype.getName=function(){alert(this.name);};Singleton.getInstance=function(
重构:从Promise到Async/Await
constPromise=require("bluebird")varreadFile=Promise.promisify(require("fs").readFile)//使用PromisefunctionusePromise(){letareadFile("a.txt","utf8").then(tmp=>{a=tmpreturnreadFile("b.txt","utf8")}).then(b=>{letresult=a+bconsole.log(result)//输出"Hello,Fundebug!"})}//使用Async/AwaitasyncfunctionuseAsyncAwait(){leta=awaitreadFile("a.txt","utf8")letb=awaitreadFile("b.txt","utf8")letresult=a+bconsole.log(result)//输出"Hello,Fundebug!"}usePromis
前端基础-CSS-1
前两篇我们简单说了下html基本知识,从这篇开始我们谈一下css内容,这篇主要还是从最基本的内容说起,让大家对css有个初步认识,掌握了css,在后续理解bootstrap的样式就比较容易了,对于了解css的小伙伴来说可能知道怎么用,但为什么要有css?它的出现解决了什么问题?这个我想可能大多数人没有思考过,接下来我们就谈一下这个问题,因为在最早期的网站中,网页的样式都写在Html页面里,这样的问题就是会让html页面特别复杂,在越来越堆积后,如果再改某个地方会非常困难,说白了就是自己写的代码都没法维护了,那这时候呢为解决这个问题,w3c就发明了css,让html只负责页面结构内容,所有的表现分离出来单独写到一个文件里,这个文件就是样式文件css,css全称是层叠样式表(CascadingStyleSheets),它定义了如何显示html中的元素,比如居中、字体、背景颜色等,有了它我们就实现了内容和表现的分离,使我们的代码就简单清晰了。以上就是css的来历,下面我们实际以代码为例看如何使用,首先我们需要让我们的html文
Hexi Flexi Grid Layout
在《Sass绘制多边形》和《使用Sass制作菱形网格布局》文章中,我们了解了怎么通过Sass来实现多边形和菱形相关的网格布局,但这些在实际的布局中使用场景并不常见。最近@vmcreative的HexiFlexiGrid让我感到CSSGrid布局更强大的一面。而这种布局在实际的布局也可以一用。今天把这个仓库中的功能集成了SassMagic中。那么简单的花点时间来看看HexiFlexiGrid布局。案例先上一个Demo的效果:简单点说就是一个六边形的网格布局。简介HexiFlexiGrid是一个SCSS组件,它是基于CSS的网格布局上创建了一个六边形的网格布局。为这样的布局创建了一个@mixin,而这个@mixin包含了许多可定制的设置,这些设置主要用来控制六边形网格的大小、布局和外观效果等。特性HexiFlexiGrid布局具有一定的特性:纯CSS实现的六边形网格布局,没有任何的JavaScript代码灵活的高度、宽度、列和行数单个单元格、列和行具有独特的样式支持自动背景图像支持的浏览器如果
学习Key与Value的集合hashtable
你可以创建一个hashtable:你可以使用foreach方法,把hashtable的key与value循环写出来:在控制台屏幕输出:如果只需把key输出:如果只想把值循环输出:测试输出结果:往hashtable集合添加key与value:有添加就是移除:测试上面的添加Add和移除:key值为"A"已经被移除。接下来,再练习2个方法,就是判断key或avlue是否已经存在集合:完整练习代码:classAv{publicHashtableHashtableEntity=newHashtable(){{"A","Leo"},{"B","Insus.NET"},{"C","Jack"}};
webMagic+RabbitMQ+ES爬取京东建材数据
本次爬虫所要爬取的数据为京东建材数据,在爬取京东的过程中,发现京东并没有做反爬虫动作,所以爬取的过程还是比较顺利的。为什么要用WebMagic:WebMagic作为一款轻量级的Java爬虫框架,可以极大的减少爬虫的开发时间为什么要使用MQ(本项目用的RabbitMq,其他的MQ也可以):解耦各个模块,实现各个爬虫之间相互独立项目健壮性,不管是主动还是被动原因(断电等状况)停下了项目,只需要重新读取MQ中的数据就能继续工作拆分了业务逻辑,使每个模块更加简单。代码易于编写为什么要用ES:方便后期搜索业务需求项目大体架构图:此处有多个spider,前面几层的spider分别处理不同模块的数据,将处理好的数据放入mq,供下一级的spider来调用。本次爬取的最终页面是商品的详情页,所以最后一级的spider将详情数据爬取完之后存储到ES之中。spider1处理京东建材主页:spider2:处理京东分页栏:spider3:处理京东列表:spider4:处理产品详情:
3年工作经验的程序员应该具备的技能
每个程序员、或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来。今天小编给大家分享的是一篇来自阿里Java工程师对3年工作经验程序员的职业建议,希望对你有启发。程序员的三个阶段第一阶段-——三年我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发。我们知道如何团队协作、如何使用项目管理工具、项目版本如何控制、我们写的代码如何测试如何在线上运行等等,积累了一定的开发经验,也对代码有了一定深入的认识,是一个比较纯粹的Coder的阶段。第二阶段——五年五年又是区分程序员的第二个门槛。有些人在三年里,除了完成工作,在空余时间基本不会研究别的东西,热衷于研究各种技术实现细节、看了N多好书、写一些博客、在Github上分享技术,这些人在五年后必然具备在技术上独当一面的能力并且清楚自己未来的发展方向,从一个Coder逐步走向系统分析师或是架构师,成为项目组中不可或缺的人物。