MySQL引擎特性:InnoDB IO子系统
前言InnoDB做为一款成熟的跨平台数据库引擎,其实现了一套高效易用的IO接口,包括同步异步IO,IO合并等。本文简单介绍一下其内部实现,主要的代码集中在os0file.cc这个文件中。本文的分析默认基于MySQL5.6,CentOS6,gcc4.8,其他版本的信息会另行指出。基础知识WAL技术:日志先行技术,基本所有的数据库,都使用了这个技术。简单的说,就是需要写数据块的时候,数据库前台线程把对应的日志先写(批量顺序写)到磁盘上,然后就告诉客户端操作成功,至于真正写数据块的操作(离散随机写)则放到后台IO线程中。使用了这个技术,虽然多了一个磁盘写入操作,但是由于日志是批量顺序写,效率很高,所以客户端很快就能得到相应。此外,如果在真正的数据块落盘之前,数据库奔溃,重启时候,数据库可以使用日志来做崩溃恢复,不会导致数据丢失。数据预读:与数据块A“相邻”的数据块B和C在A被读取的时候,B和C也会有很大的概率被读取,所以可以在读取B的时候,提前把他们读到内存中,这就是数据预读技术。这里说的相邻有两种含义,一种是物理上的相邻,一种是
MySQL UPDATE语句一个“经典”的坑
最近好几次有开发同学在钉钉上问我,比如下图:问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新...刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是有区别,这里我用测试数据来模拟下:有问题的SQL语句:updateappssetowner_code='43212'andowner_name='李四'whereowner_code='13245'andowner_name='张三';执行之前的记录是这样的:执行之后的记录是这样的:可以看到,结果并不像这位开发同学说的“好像没有效果”,实际上是有效果的:owner_name的值没有变,但owner_code变成了0!why?看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法:看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写:
使用 forRoot() 幫助 SharedModule 提供單一實例服務
在Angular專案中,我們會把共用的元件(Component)、指令(Directive)、管道(Pipe)放在一個SharedModule中做管理,那服務(Service)呢?一般來說,我們希望服務是單一實例(SingletonService)的狀態,但基於底層運作的方式,直接在SharedModule建立服務,會產生多個重複的單一實例服務,而可能引發問題,這時我們可以透過forRoot()來幫我們避免這狀況的發生。模組分割Angular提供模組化的概念讓我們能輕鬆管理應用程式的各個功能,在官方的StyleGuide針對模組架構也做了相當多的建議。根據StyleGuide的模組章節,會建議我們會將Angular專案分成以下幾個模組:共享模組(SharedModule)核心模組(CoreModule)特性模組(FeatureModule)特性模組不是只做一個模組叫FeatureModule,而且將多個功能特性區分成多個模組,例如AFeatureMod
Angular 上用 MathJax 的一些问题
写文章登录Angular上用MathJax的一些问题Axurez4hoursago首发于Eliseos:我是如何解决Angular上用MathJax的一些问题的-Eliseos话说我本来是倾向于KaTeX的,因为我感觉他很快,而且MathJax似乎很难配。但是大家表示对缺少功能的KaTeX并无好感,给我提供了一些钻研MathJax的动力。其实也不算钻研,因为实际上MathJax很简单,调用MathJax.Hub.Queue(['Typeset',MathJax.Hub,this.element.nativeElement]);就可以渲染一个元素(这个this.element.nativeElement是从Angular中调用它DOM的语法),这个.Queue实际上是MathJax自己实现的回调格式,语法非常清奇,参数个数不定,每个都是数组,代表一个回调,顺序执行。比如这个['Typeset',MathJax.Hub,this.element.nativeElem
过渡与动画 - steps调速函数&CSS值与单位之ch
撰写于2017-12-13修改于2017-12-14分类web开发/CSS标签CSS/animation写在前面上一篇中我们熟悉五种内置的缓动曲线和(三次)贝塞尔曲线,并且基于此完成了缓动效果.但是如果我们想要实现逐帧动画,基于贝塞尔曲线的调速函数就显得有些无能为力了,因为我们并不需要帧与帧之间的过渡状态,就像上篇中所看到的,所有基于贝塞尔曲线的调速函数都会在关键帧之间进行插值运算,从而产生平滑的过渡效果。这个特性显然很棒,平滑的效果确实是我们使用css过渡和动画所追求的。但是在逐帧动画的场景下,这种平滑的特性恰恰毁掉了我们想要实现的逐帧动画的效果.逐帧动画我们经常会看到一段卡通影片、一个复杂进度的提示框、一个小loading,我们不会单纯的选择一张GIF动画胜任,因为它的局限性和短板表现的很明显.GIF图片所能使用的颜色数量被限制在256色GIF不具有Alpha透明的特性,GIF动画一旦生成,参数就固定在文件内部,只能通过图像处理软件去重新生成.在某些场景下,基于图片的逐帧动
「文经课表」当日课表界面实现方法
先简单介绍一下「文经课表」:基于微信小程序MINA框架的WXML、WXSS、JS为代码语言进行开发,视图层采用Flex弹性布局,逻辑层采用模块化模式开发。发布一周累计用户人数1000+,烟台大学文经学院、烟台大学文经学院学生会等官方微信公众号主动关联小程序,更多介绍:https://lab.sangsir.com/kb/。为什么要单独说这个界面的实现方法,其实这与课表数据是分不开的。好,装逼完成,开始说一下当日课表界面的实现方法。分析先看一下我处理的课表数据,这是一个由上到下,由左到右进行的分组。每一大节课为1个数组,数组内包含8个数组,里面包含星期一到星期日的两小节的课程内容。嗯,有点绕,总之这样写有利于for循环出当日课表。因此这样一个for循环出来之后的数据是无法使用css选择器直接控制格式,可以看一下直出后的效果。所有内容都挤在了一行之中,那该怎么办?这样也未免太不注重用户体验了吧?每循环一次加一个
总可以了吧?不不不,前言中说了,微信小程序中的代码语言为WXML、
CSS Flexbox详解
Flexbox是一个强大而灵活的布局,本篇文章主要对其进行学习了解。一、Flexbox简介Flexbox布局(FlexibleBox)模块旨在提供一个更加有效的方式制定、调整和分布一个容器里的项目布局,即使他们的大小是未知或者是动态的。简单的理解,就是可以自动调整,计算元素在容器空间中的大小,并进行有效合理的布局。Flexbox布局中有两个重要的概念:Flex容器和Flex项目。Flex容器包含多个Flex项目,通过对Flex容器和Flex项目的具体属性进行设置,可以达到各种各样灵活的布局样式。Flexbox使用Flexbox的使用非常简单,只需要对Flex容器设置display:flex或者display:inline-flex,就可以具体操作使用Flexbox布局了。下面以具体示例演示:html代码
浏览器里的黑天鹅:不可预知的前端变革点
『黑天鹅』是这样的事件:难以预测、冲击性大,并且能马后炮地事后分析。少数的黑天鹅事件几乎能解释这个世界上发生的所有事情。难道前端领域的演化也不是循序渐进,而是黑天鹅式的吗?让我们换一种角度回顾一下历史吧…不可预知的黑天鹅审视一下你周围的环境,回顾自你出生以来周围发生的重大事件、技术变革和发明,把它们与人们此前关于它们的预期相比较,然后看一下它们中有多少是在预料之中的?看看你自己的生活,你的职业选择、你与配偶的邂逅、你被迫离开故土、你面临的背叛、你突然的致富或潦倒,这些事有多少是按照计划发生的?——《黑天鹅》许多史书、传记都以一种决定论的视角来阐述历史演化的必然性,但实际上对于生存在当时的芸芸众生而言,历史上的巨大变革点往往在某个平凡的日子里突然地发生,没有一点点防备也没有一丝顾虑。比如,当年一位准备离休当教授的江南老人,怎么就突然去了北京呢?我的这个经历就是到了上海,到了89年的年初的时候,我在想我估计是快要离休了,我想我应该去当教授……我绝对不知道,我作为一个上海市委书记怎么把我选到北京去了。——:eyeglasses:
踩坑:Vue2.0与1.0命名的区别
ThereareonlytwothingsinComputerSciences:cacheinvalidationandnamingthings.---PhilKarlton今天在vue-cli中使用iview时,控制给了这个警告:两种解决办法:1.在main.js里面添加代码2.使用iview-loader之前用vue1.0的时候,都没有这个警告,经查阅相关资料得知:vue升级2.0后才会出现这个问题,这里涉及变量命名的问题,Vue组件的名称最好不要和原生HTML标签相同。为了避免重名,通常会在组件名称前面加上一个前缀,如el-button、i-input、等。这通常不会有什么问题,但有时候你的模板中混杂了原生HTML标签和组件标签,要想区分它们并不是很容易。
vue源码
vuejs内置组件component实现tab切换懒加载和表单输入框内容的清空vuejs内置组件component的使用vue的双向绑定原理及实现vue的双向绑定原理及实现Vue.js2.0快速上手精华梳理自从Vue2.0发布后,Vue就成了前端领域的热门话题,github也突破了三万的star,那么对于新手来说,如何高效快速的学习Vue2.0呢。Vue基础对于没有接触过es6和webpack的童鞋来说,不建议直接用官方的脚手架vue-cli构件项目。先按文档顺序最少学习完组…Vuex源码分析之前大致分析过了vue-cli源码和vue-router源码,这两个工具也是vue生态中比较重要的组件.而最近因为业务上的需要,接触到了vuex的一些组件源码.vuex集中于MVC模式中的Model层,规定所有的数据操作必须通过action-mutation-statechange的流程来进行,再结合vue的数据视图双向绑定特性来实现页面的展示更新:合格前端系
数组方法的封装/代码的复用加强
前言在编写JavaScript代码的时候存在一些对于数组的方法,可能涉及的页面会很多,然后每次去写一堆代码。长期下去代码会特别的繁多,是时候进行一波封装了,话不多说开始书写优美的代码代码已上传github,需要的欢迎star(https://github.com/Xieguoiang...)。关于数组一些方法的封装1.数组去重`上文提到的Set的封装`//ES6新增的Set数据结构,类似于数组,但是里面的元素都是唯一的,其构造函数可以接受一个数组作为参数//ES6中Array新增了一个静态方法from,可以把类似数组的对象转换为数组//方法二newfunctionremoveRepeatArray(arr){returnArray.from(newSet(arr))}2.数组顺序打乱functionupsetArr(arr){returnarr.sort(function(){returnMath.random()-0.5});}3.数组最大值最小值//这一
Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于MVVM设计模式的框架,而组件化开发思想也越来越深入人心。这其中不得不提到Vue.js这个专注于VM层的框架。本文主要对Vue.js组件化开发中子组件的异步加载和其生命周期进行一些探讨。阅读本文需要对Vue.js有一定的了解。注意:本文中的一些例子代码,是以vue-cli采用webpack模板初始化的项目为基础。异步组件讨论异步加载,需要先了解下异步组件。Vue.js的异步组件是把组件定义为一个工厂函数,在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。例如注册一个全局异步组件:Vue.component('async-demo',function(resolve,reject){setTimeout(function(){//将组件定义传入resolve回调函数resolve({template:'<div>Iamasync!</div>' &nb
Vue笔记系列(一)Vue.js入门
Vue笔记系列2、Vue.js渐进3、Vue.js进阶Vue.js的概述如官网所说,Vue.js是一款轻量级的以数据驱动的渐进式JavaScript框架。老卜的前端开发之走进Vue.js介绍到:Vue.js数据驱动的原理在于View层的视图发生改变时,Vue会通过DOMListeners来监听并改变Model层的数据。反之,当Model层的数据发生改变时,也会通过DataBingings来监听并改变View层的展示。从而实现双向数据绑定的功能。例如:jQuery通过操作DOM来改变页面的显示,而Vue通过操作数据来实现页面的更新与展示。这样我们就能很直观的理解数据驱动的意思了。上面介绍到的是Vue.js的原理,下面再来科普一下MVVM这个概念(一像素写的《Vue.js和MVVM小细节》),可以让你更好的理解Vue,但是没有太大的实践作用,但是可以装B,更重要的是可以在面试的时候装B。MVVM是Model-View-ViewModel的缩写,它是一种基于前端开发的架构模式,其核心是提供对View和ViewM
vue简易表格全选
最近以为公司业务需要不让用我最爱的elementUI了,刚开始感觉没啥,后来真到开始写了,真的就懵逼,组件不让用啥都得自己写了。。最常用表格全选都都变成了一个坎。对于表格全选,我们一定能想到就是判断表格的个数和表格选中的个数相比较,相等全选按钮就处于选中状态,不等就不选中,可是这又不是jQuery,选择器又不能用。对于刚接触vue半年而且大部分时间都在用饿了么组件的我真的是不知所措。搜了很多资料,看到很多解决方案都是要在数据中加入checked状态,我是拒绝的,就算我愿意后台哥哥也不愿意啊,这不是脏数据嘛!而且还不是组件式的,谁想用都得copy一大坨代码,我相信我们组长是拒绝的。感觉好难哦。。。但是问题还是要解决,饭还是要吃的。回家的想了想,看了看vue的官网,灵感就来了,很快就把解决了。你以为就这就完了??全选反选只是checkbox选中,我们的选中是为了获取数据啊,不然选它干啥!刚开始想为每行的checkbox的click事件传值,后来具体操作发现这是有bug的。然后又各种尝试最后解决了问题。下面上代码:Vue.com
关于vue自定义事件中,传递参数的一点理解
例如有如下场景<!--父组件--><template><div><!--我们想在这个dealName的方法中传递额外参数name--><test-sonv-for="iteminlist"@dealName="todo(item.name,arguments)":item="item"></test-son></div></template><script>exportdefault{name:'test-p',data(){return{list:[{name:'小王'},{name:'小刚'}]}},methods:{todo(name,data){co
基于手淘 flexible 的 Vue 组件:TextScroll -- 文字滚动
vue-flexible-components基于手淘flexible.js的Vue组件前言:目前手头的移动端Vue项目是用手淘的lib-flexible作适配的,并用px2rem来自动转换成rem。关于lib-flexible和px2rem的配置,请移步vue-cli配置flexible。由于使用rem作适配,导致现有的很多移动端UI框架不能与之很好的配合,往往需要大动干戈更改UI框架的样式,背离了使用UI框架达到快速开发的初衷。为了以后项目的组件复用,以及提高开发可复用组件的能力,特把平时项目中常用的、简单的组件单独拎出来。此为小白之作,论代码质量、难易程度、复用度,远不及各位大佬之杰作,求轻喷。同时,也恳请各位,提出意见和建议,不胜感激!GitHub地址:vue-flexible-componentsTextScroll--文字滚动效果展示 代码分析利用vue的列表过渡transition-group来进行动画渲染。滚动元素都是相对于滚动视口绝对定
kafka-0.9消费者新API
kafka-0.9消费者新API注:以下仅限kafka版本0.9以上Consumer新版apiConsumer自动提交示例:Propertiesprops=newProperties();props.put("bootstrap.servers",kafkaBrokerURL);props.put("group.id",groupId);props.put("enable.auto.commit","true");props.put("auto.commit.interval.ms","1000");props.put("session.timeout.ms","30000");props.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeseria
RabbitMQ高可用镜像队列
RabbitMQ高可用镜像队列在分布式系统中,通常使用多个术语来标识主要副本和辅助副本。本指南通常使用“主”来引用队列的主要副本,而对于辅助副本则使用“镜像”。但是,你会发现“master”在这里和那里使用。这是因为RabbitMQCLI工具历史上一直使用术语“master”来指代辅助。因此这两个术语目前可以互换使用,但我们希望最终摆脱传统的术语。如何配置镜像镜像参数是使用策略配置的。策略按名称(使用正则表达式模式)匹配一个或多个队列,并包含添加到匹配队列的整个属性集中的定义(可选参数的映射)。有关策略的更多信息,请参阅运行时参数和策略。参考文档:http://www.rabbitmq.com/parameters.html#policies控制镜像的队列参数如上所述,队列通过策略启用镜像。政策可以随时更改;创建一个非镜像的队列是有效的,然后在稍后的某个点上镜像(反之亦然)。非镜像队列和没有任何镜像的镜像队列之间是有区别的-前者缺少额外的镜像基础架构,可能会提供更高的吞吐量。要使队列变成镜像,您需要创建一个与之匹配的策略
为什么程序员不是出轨率最高的群体(支持双十二程序员脱单专场)
程序员是出轨率最低的群体,出轨率第二低不知道是什么,反正不是金融男。听到这个调查报告,一大群人表示惊讶,尤其是年轻女人,这个世界上怎么可能会有这么好的男人,还是一个群体??1.程序员在互联网世界是有话语权的,这是真的众所周知,互联网时代是一个公平的时代,只要你想说,你就可以发声,比如前段时间某平台上就有人看似有依据地宣称程序员是出轨率最高的群体,这也是可以的。但程序员肯定是更有话语权的群体?为什么,因为X书虽然不会因为某豚公然污蔑而做出惩罚,但可能会因为用户的自由言论而屏蔽他的评论功能。像这样的情况,虽然话语权被扼杀了,但我们还有知乎,还有掘金,实在不行我们还有github,stackoverflow,如果这些都被屏蔽了,大不了就自己开发一个出来呗,我的话语权我做主。2.程序员木讷,老实,内向,不善勾搭,这肯定是假的。为什么程序员喜欢说搬砖,码农?这是有据可依的,众所周知,一个公司里面不同岗位负责不同的职业,程序员负责互联网产品的开发,也就相当于农民伯伯栽种庄稼,所以有码农一说,搬砖也是同理。外行心思太细腻,看着不理解所以曲解了就难免会觉
Android系统架构,方方面面都在这
Android关于Android系统Android,本义指“机器人”,是Google于2007年11月5日宣布的基于Linux平台的操作系统。Android系统优缺点开放性在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。丰富的硬件这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,如同从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带iPhone上使用、联系人等资料更是可以方便地转移。跨平台由于使用Java进行