B+树

B+树的性质 一棵m阶的B+树满足如下性质: 每个节点最多有m个关键字 对于非空树,根节点有最少一个关键字 除了根节点,每个节点有最少ceil(m/2)个关键 所有的叶子节点都出现在同一层 有n个关键字的节点,也有n个孩子。关键字有序排列,并且对于非叶子节点:KeyWordi <= Childreni中所有的关键字 在B+树中,所有的关键字都存放在叶子节点。而在B树中,所有的节点都存放关键字。在B+ »

flume学习

前言 网络上关于flume的文档很多,因此本文主要作用是入门和介绍一些常用场景,并且也会将一些好的文档推荐给大家~ flume的工作原理 可以参考这篇文档,本文不再赘述。 Flume NG 1.x 是Flume 0.9.x的重构版本。在Flume NG中没有了之前的Master、Zookeeper、Collector以及Web console。只有source、sink、channel。 安装flume 安装JDK(省略) »

B树

前言 B树的英文名是B-Tree,在中文译名中,有的去掉了中划线,叫做B树;有的保留了中划线,叫做B-树。因此B树、B-树是一个概念。而B+树是B树的一个变种,所以B+树是另外一种树。 B树 B树是多路平衡树。一棵m阶的B树需要满足如下的5个性质: 每个节点最多有m-1关键字 根节点最少有一个关键字 除根节点外,每个节点最少有向上取整(m/2)-1个关键字 所有的叶子节点都出现在同一层 节点的孩子的数量比关键字数量多1。故每个节点形如: »

AC自动机

概述 AC自动机是进行多模式匹配的。可以认为AC自动机是建立在Trie树和KMP算法基础上的。关于KMP算法可以参考这篇文档,下面会先介绍下Trie树,然后深入介绍AC自动机。 Trie树 Trie树也叫字典树。它满足如下的性质: 除根节点外,每个节点都只包含一个字符 每个节点的所有子节点包含的字符都是不同的 从根节点到某个节点,路径上所经过的字符,就是该节点代表的字符串 下面看一个例子: 其中,红色的节点表示该字符是其所在字符串的结束字符(也就是最后一个字符)。我们会发现结束字符不一定非是叶子节点,也可能是内部节点。 如果两个字符串拥有相同的前缀,那么对于这个前缀而言,Trie树只会存储一次,这也是Trie树节省存储空间的原理。 AC自动机 »

棕榈岛户型图

棕榈岛户型图 温馨提示:如果看不清,请长按图片,将其保存到手机,然后在手机上查看~ A观澜名域(约210m2{四室两厅三卫}) B御景华庭(约1802{三室两厅三卫}) C1雍景熙境(约182m2{四室两厅两卫}) C雍景澜境(约198m2{四室两厅三卫}) G澜庭雅苑(约152m2{三室两厅两卫}) B御景华庭(约170m2{三室两厅两卫}) D朗悦明居(约902{ »

【金地·棕榈岛】便民链接

公告 热烈欢迎各位岛主把自己使用过的,感觉不错的师傅、商家推荐给大家。热心的岛主们可以将相关联系方式通过微信提供给我(微信号:timzhou002),之后,我会更新到便民电话列表中。 另外,想要找开发商、物业电话,可以点击这里查看;每栋楼的位置,可以点击这里查看;如果想要查看户型图,可以点击这里。 一般点击电话号码即可进行拨号;如果拨不了,请长按电话号码处复制电话号码,然后自己拨号。 便民电话列表 砸墙 王连柱 17302484434 收阳台、 »

二分查找算法

二分查找 二分查找也叫折半查找。它用于从一个有序序列中,查找目标元素所处的位置。 查找过程 假设,有序序列是升序的 将目标元素 与 序列 中间位置的元素 进行比较 如果相等,则查找结束 如果小于,则从左侧的子序列中,以相同的方式继续进行查找 如果大于,则从右侧的子序列中,以相同的方式继续进行查找 一直到,子序列为空,如果仍然没有查找到,则返回-1 代码实现 tim-chow的github »

KMP算法

什么是KMP算法 KMP算法是带有跳跃性的字符串匹配算法。具体请参考百度百科。 什么是next数组 next[ind]表示模式串Pattern的Pattern[0...ind]子串注释1的最长公共前后缀的长度。其中,next[0] = 0。 值得注意的是:在计算next数组的时候,可以根据前一个字符的next值,计算后一个字符的next值。 也就是说,当Pattern[ind] 等于 Pattern[j]的时候,next[ »

数据库范式

基本概念 实体 客观存在并可以被区别的事物。事物可以是看得到、摸得着的,比如一个建筑、一个人;也可以是虚拟的,比如老师与学校之间的关系 属性 实体的一个特性,称为一个属性。属性是一个逻辑上的概念,比如“性别”是“人”的一个属性。在关系型数据库中,属性是一个物理概念,一个属性对应一列 记录 表中的一行 分量 记录的某个属性的值 键 »

Git:从入门到精通

前言 git的命令行非常的简洁,博主基本上只使用git命令行工具,比如windows上的git bash。同时,为了加深理解,强烈建议初学某个功能或命令的时候,动手尝试一下。动手才是检验真理的唯一标准。 本文的立意并非是全面讲解git,而是从浅处着手,逐渐深入,直到接触到暂存区、底层存储等令人“眼花缭乱”的概念。 导读 概览 搭建git测试服务器 常规命令 git暂存区 git的底层存储 进阶命令 分支合并 git »

spark笔记

未完待续 导读 附录 RDD 参考文档 RDD RDD(弹性分布式数据集,Resilient Distributed DataSet)是spark的核心抽象。它是一个不可变的、带分区的记录集合,RDD的数据可以分布在多个节点上,它也是spark中的编程模型。 RDD的API主要分为两类: transformation(转换) 转换用于从一个现有的RDD,定义一个新的RDD 比如map、flatMap、filter action(动作) »

kafka采坑记

遇到的问题 关于kafka的入门,可以阅读这篇教程。下面主要讲述博主在安装过程中遇到的问题: 因为kafka的broker、producer和consumer都严重依赖ZooKeeper,所以必须保证这三者都能连接到ZooKeeper,博主在安装测试过程中,使用了dnsmasq统一做内网域名的管理,并且把kafka broker所在的机器的dns服务器都设置为dnsmasq的地址,同时server.properties中的zookeeper.connect配置使用的也是内网域名,所以broker连接ZK是没问题的。但是运行producer和consumer的机器,并没有修改dns服务器,所以此时producer和consumer是连接不上ZK的。解决方式就是: 将运行producer和consumer的机器的dns服务器设置为dnsmasq所在的机器 在zookeeper.connect中使用ip,而非内网域名 server.properties属性文件中的listeners属性是用来指定broker所监听的地址的,如果没有配置的话, »

逻辑地址、线性地址、物理地址

.divcss5{text-align:center} 前言 本文只是站在最方便理解的角度,来阐述一下逻辑地址、线性地址、物理地址。更多细节可以阅读参考资料。 导读 符号名空间 逻辑地址 线性地址 物理地址 参考资料 符号名空间 编写程序的时候,使用的地址空间叫符号名空间,在符号名空间中,通过符号(也就是变量名)来引用一块内存。 逻辑地址 编译后的程序,所使用的地址空间就是逻辑地址空间,逻辑地址是相对于段的基地址的偏移。 »

分布式程序的协调服务-ZooKeeper

.divcss5{text-align:center} 目录 安装配置 Paxos简介 ZooKeeper的基本原理 ZooKeeper的基本概念 ZooKeeper的客户端API ZooKeeper的应用 附录: 两阶段提交 和 Zab协议 参考文档 ZooKeeper的安装配置 准备工作: 安装JAVA(略过) 点击这里下载ZooKeeper的安装包(略过) 接下来,安装一个ZooKeeper 3.4.9伪集群: »

hadoop yarn配置

关于ResourceManager的高可用可以查看参考文档,也可参考这个配置。 概述 更多关于yarn的架构和工作原理的细节,可以查看:参考文档。 关于hadoop、yarn、mapreduce、spark之间的关系,可以用一句话来概括,hadoop提供了分布式文件系统hdfs,yarn提供了集群管理功能,可以管理MapReduce、Spark、Tez、storm等计算框架。 下面介绍yarn中的组件。 RM ResourceManager(简称RM)分为Scheduler和ApplicationsManager(简称ASM),其中: ASM 接收客户端发送来的应用程序提交请求 »

一些关于大数据的文档

HDFS Federation(HDFS 联盟)介绍 HDFS Federation和NameNode HA的搭建 Hadoop Journal Node 作用 Hadoop2.8HA安装部署 Hadoop中SecondaryNameNode工作机制 hdfs百度百科 yarn百度百科 MapReduce工作原理图文详解 初步掌握Yarn的架构及原理 深入浅出学hive HDFS Federation客户端(viewfs)配置攻略 »

python gettext使用简介

概要 gettext模块为Python模块和应用程序提供国际化(i18n)和本地化(l10n)支持。该模块既支持GNU gettext风格的API,也支持更高级的、基于类的API。通过gettext,在应用程序中,可以只使用一种自然语言。之后,在运行时,再将其翻译成多种不同的自然语言。 GNU gettext风格API 需要注意的是:GNU风格的API会全局地影响整个应用程序的翻译。因此,当应用程序需要在运行时切换语言的话,那么应该使用基于类的API。 gettext.bindtextdomain(domain, »

TCP滑动窗口

概要 TCP的Window表头用来指定滑动窗口的大小,单位是字节。因为Window占16位,所以TCP的标准滑动窗口最大为2^16-1=65535个字节。另外,Options表头包含了滑动窗口的扩大因子。 滑动窗口的主要作用有: 流量控制: 发送方不能以超过接收方所能接受的速率发送分段,主要的方式是:接收方在返回ACK的时候,会包含自己的接收窗口的大小,进而控制发送方的发送窗口的大小 保证TCP的可靠性: 可靠性是建立在“确认重传”的基础上的 发送窗口 在任何时刻,TCP会话的发送方的缓冲区中的数据都可以分为四类: 已发送 并且 得到对端ACK的 »

superset教程

前言 为了刺激自己学习和使用superset的欲望,可以点击这里,先看下github上的动图,并且个人感觉SQL Lab也是一个特别赞的功能。 关于superset 官网: http://airbnb.io/projects/superset/ 文档: http://airbnb.io/superset/ 主要功能: 快速创建可交互的、直观形象的数据集合 有丰富的可视化方法来分析数据,且具有灵活的扩展能力 具有可扩展的、高粒度的安全模型,可以用复杂规则来控制访问权限。 »

vagrant完全教程

vagrant是什么? vagrant是一个管理虚拟化软件的软件,vagrant本身并没有虚拟化的能力,它是通过调用虚拟化软件(比如VMWare、Virtual Box等)的API,来实现虚拟化的。 vagrant中的概念 Provider 为vagrant提供虚拟化支持的具体的软件,比如VMWare或Virtual Box Box 虚拟机镜像,vagrant根据Provider的不同提供了很多基础镜像。用户也可以根据需求使用vagrant package制作属于自己的Box Project 项目是由一个目录及该目录下的Vagrantfile组成的。项目中可以包含子项目,子项目的Vagrantfile配置文件会继承和重写父项目的配置。项目的虚拟机实例并不会存储在项目目录下,而是存储在~/.vagrant. »

ansible的authorized_key模块

摘要 用于向远程主机的某个账户的authorized_keys文件中增加公钥 或 从中移除公钥。 选项 exclusive 是否从authorized_keys文件中移除所有其他的未指定的公钥。当想要指定多个公钥的时候,可以将key参数指定为 新行 分隔的公钥列表。 需要注意的是,当使用with_*的时候,每次迭代都会进行移除操作。 (Choices: yes, no)[Default: no] key ssh公钥。可以是一个字符串,也可以是一个url。 »

ansible的wait_for模块

摘要 本文在ansible 2.2.1.0测试通过 用于等待指定的时间(默认是300秒)。在不指定任何选项的时候,这个模块什么都不做。 该模块可以用于等待端口可用。比如,调用java应用服务器的启动脚本的时候,脚本返回true,但是服务并不是立刻可用的。 该模块可以用于等待一个文件中出现匹配某个正则表达式的字符串。 该模块可以用于等待文件系统上的某个文件可用 或 被删除。 该模块可以用于等待活跃的链接被关闭。当从负载均衡池中摘除节点的时候,尤为有用。 选项 connect_timeout 连接的超时时间, »

ansible的lineinfile模块

摘要 该模块用于从一个文件中搜索一行,确保该行存在或删除该行。lineinfile模块主要用于改变一个文件的一行。如果想要改变文件中相似的多行,可以使用replace模块。如果想要插入/更新/删除一个行块,可以使用blockinfile模块。其他情形,可以使用copy或template模块。 常用选项 backrefs 和state=present一起使用。如果打开这个标记,那么在line参数中可以使用 位置分组 和 命名分组,lineinfile模块会使用regexp所捕获的分组填充它们。backrefs会改变模块的一些操作:insertbefore和insertafter参数会被忽略。当regexp不匹配文件中的任何行时,文件不会做任何修改, »

交换数组元素,使得数组的和的差最小

问题描述 设有两个 长度相等的、数值类型的 无序序列a,b; 要求:通过交换a,b中的元素,使得[a中所有元素的和] 与 [b中所有元素的和] 的差最小。 求解思路 在逻辑层面将两个序列,看成一个序列。则问题可以转换成:从一个长度为2n的数组中,选出n个元素,使得这n个元素的和接近[两个数组的所有数据元素的和的一半]。 因此可以通过动态规划来求解: 状态是 offset:某一子阶段可以从[ »

使用循环和栈消除递归调用

相关知识 关于递归调用,请查看这篇文章。 关于基于栈的运行时环境,请查看这篇文章。 基本思路 在基于栈的运行时环境中,每次函数调用都会在栈顶产生一个新的桢,并且将控制权交给被调用的函数;当被调用的函数返回时,相对应的桢从栈顶弹出,控制权将重新交回给调用方,调用方从函数调用的下一条语句继续执行。桢中保存的信息,主要分为两类: 相对应的函数 执行过程中的状态:实参和局部变量 恢复调用方所需的信息:前一个桢的桢指针和返回地址 返回值可以通过寄存器来传递,也就是说,被调用的函数在返回时,将返回值写进寄存器,调用方再从寄存器获取返回值。 递归调用就是一个函数直接或间接地调用自身, »

阻塞socket和非阻塞socket

写操作 阻塞socket: 一直到发送完所有的数据,写操作才返回 非阻塞socket: 当socket的发送缓冲区中没有空间时,直接返回EWOULDBLOCK错误 当socket的发送缓冲区中有足够的空间 或 不足以拷贝所有待发送数据的空间时,则拷贝前n个能够容纳的字节,并返回实际拷贝的字节数 读操作 阻塞socket: 当socket的接收缓冲区中没数据时,读操作会一直阻塞到有数据流入 当socket的接收缓冲区中的数据量大于期望读取的数据量时,读取期望的字节数,返回实际读取的字节数 当socket的接收缓冲区中的数据量小于期望读取的数据量时,读取全部的数据,返回实际读取的字节数 非阻塞socket: 当socket的接收缓冲区中没有数据时,直接返回EWOULDBLOCK错误 当socket的接收缓冲区中有数据时, »

IO多路复用

IO多路复用 IO多路复用就是通过一种机制,同时监视多个文件描述符,一旦某个文件描述符就绪(比如读就绪或写就绪),会通知应用程序进行相应的处理。 select、poll、epoll本质上都是同步IO,它们都需要在事件就绪后,由应用程序自己进行读写。而异步IO不需要应用程序自己进行读写,异步IO实现负责把数据从内核拷贝到用户空间。 Linux提供了select、poll、epoll,来实现IO多路复用机制,下面会分别对它们进行简要的说明。 select、poll 关于select、poll的原型和详细说明,请点击这个链接。 在这里,只对select和poll的执行过程,进行简要的说明: »

Java字符编码

Java中的字符编码 编译时,可以通过javac命令的-encoding选项,指定源代码文件的编码 运行时,可以通过java命令的-D选项,设置file.encoding属性,这个属性会作为reader、writer、String.getBytes()等操作的默认编码 class文件的编码是UTF-8 JVM运行时,使用UTF-16编码 UTF-16是双字节编码,Java的char也是双字节的 UTF-16并不是固定占用2个字节,根据字符在unicode字符集中的位置,可能占用2个字节,也可能占用4个字节 字符集、字符编码基础 字符集 字符集顾名思义就是字符的集合, »

有限状态机

概念 有限状态自动机(FSM:Finite State Machine),简称状态机。它是描述有限多个状态以及状态转移需要满足的条件和条件满足后触发的动作的数学模型。 状态机有四个要素: 现态:当前所处的状态 条件:又称为“事件”,当一个条件被满足,将触发一个动作或执行一次状态的转移 动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新的状态 次态: »

Java枚举

什么是枚举 枚举是一个“数据集”,这个数据集中的数值是稳定,并且有限的。 比如,“四季”这个数据集中,有四个元素---春、夏、秋、冬。 “星期”这个数据集中,有七个元素---“星期一”至“星期日”。 Java中的枚举 Java中的枚举可以被看成是一个普通的类。因此,它可以拥有实例成员变量、静态成员变量、实例成员方法、静态成员方法。相较于类, »

Spring之自定义Schema

概述 可以通过扩展Spring的Schema,来实现自定义配置。完成一个自定义配置一般需要完成下面的步骤: 设计属性并编写JavaBean 编写xsd 编写NamespaceHandler类和BeanDefinitionParser类 编写spring.schemas和spring.handlers串联所有的组件 在Bean配置文件中使用 下面是我测试的项目结构: 编写JavaBean person.java package cn.timd.spring.spring_schema; public class Person { private String »

基于ngx_lua的Mock Server

项目地址 https://github.com/tim-chow/ngx-lua-mock-server 基本思路 客户端将Mock Server设置成正向代理(所谓的“正向代理”就是通常所说的“代理”) Mock Server对发送给它的请求进行拦截,如果在数据源(目前只支持Redis,可以很方便地扩展,进而支持其他数据源)中存在该请求对应的Mock data,则返回Mock data,否则将该请求反向代理到“真正的”服务器上 »

Spring AOP

简介 AOP(面向切面编程,Aspect-Oriented Programming)是一种新的方法论,是对OOP(面向对象编程,Object-Oriented Programming)的补充。 AOP的主要编程对象是aspect(切面),而切面模块化了横切关注点。 AOP术语 切面(Aspect): 与类相似,类是对物体特征的抽象;切面是对横切关注点的抽象。切面包含切入点的描述和通知的描述。 连接点(JointPoint): 被拦截的点。在Spring中只支持方法型的连接点,实际上, »

JDK动态代理简解

例子 IBusiness.java public interface IBusiness { public void processBusiness(); } UserBusiness.java public class UserBusiness implements IBusiness { public void processBusiness() { System.out.println("User processBusiness..."); } } DynamicInvocationHandler.java »

SpEL:Spring表达式语言

概述 Spring表达式语言(简称SpEL):它是一个支持在运行时查询和操作对象图的强大的表达式语言 SpEL使用#{...}作为定界符,所有在花括号中的字符都被认为是SpEL 可以使用SpEL动态地为bean的属性进行赋值 通过SpEL可以实现: 通过bean的id对bean进行引用 访问对象的属性以及调用对象的方法 计算表达式的值 正则表达式的匹配 SpEL:字面值 可以使用SpEL给bean的属性赋字面值: 整数: <property name="age" value="#{28}" /> 小数: < »

spring配置文件中引用属性文件

概述 在spring的XML配置文件中引用外部的properties文件,有两种方式: 使用context名称空间 使用PropertyPlaceholderConfigurer 上面使用的是locations的list赋值方式,也可以单独一条: 在spring的配置文件中可以通过 value="${varName}" 的方式,来访问properties的值: 需要注意的地方 在使用context名称空间之前,需要先导入它(参考图1中头2个红框) 可以定义多个PropertyPlaceholderConfigurer 在路径中可以使用通配符,比如: classpath 和 classpath*的区别: classpath:在类搜索路径中查找属性文件 classpath* »

简单工厂模式的Java实现

引入 当创建了一个类的对象之后,这个对象就依赖这个类了。如果修改了该类,那么就需要修改所有与该对象有关的操作。 因此,简单工厂模式要解决的问题是:对象不能应对类的变化。 解决的思路是:封装变化点,哪里变化就封装哪里。在这个例子中,要实例化的类变了,就将实例化这个操作封装起来,我们可以创建一个专门负责根据条件,创建具体类的实例的类,也就是下面要说的简单工厂模式。 简单工厂模式 定义: 专门定义一个工厂类,负责创建其他类的实例,要被实例化的类通常具有相同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method) »

Java bean是什么

概念 Java bean是符合JavaBean规范的Java类。 JavaBean规范 JavaBean类必须是一个公共类,其访问权限为public。比如public class user {} JavaBean类必须有一个无参的公用的构造方法 JavaBean类的实例成员变量和类变量都是private的 JavaBean类的属性应该通过提供一组存取方法(getXyz和setXyz)来访问 一般JavaBean类的属性名是以小写字母开头的驼峰格式的。相应的getter/setter方法是get/set接上首字母大写的属性名。比如属性名为userName,其对应的getter/setter方法是getUserName/setUserName。下面是一些特殊情况: 如果属性名的第二个字母大写,那么getter/setter方法是get/ »

APIGateway和VIPServer

API Gateway 构建web应用的时候,往往需要在“真正的web服务”的基础上,增加一些通用功能,比如记录日志、授权管理、请求速率限制等。对于HTTP请求来说,API Gateway扮演着网关的角色,也可以说是进入系统的唯一节点,API Gateway能够集中地控制和管理通用的功能。 下面是一个来自Mashape Kong的对比: 在当前的架构中: 通用的功能在多个服务之间是重复的 业务系统变得庞大,且难于维护 在不影响其他服务的情况下,难于扩展 因为系统限制,生产效率降低 »