数据库范式

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

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的对比: 在当前的架构中: 通用的功能在多个服务之间是重复的 业务系统变得庞大,且难于维护 在不影响其他服务的情况下,难于扩展 因为系统限制,生产效率降低 »

jar命令详解

jar命令 c - 创建一个jar包 t - 列出jar包中的文件 x - 从jar包提取指定的(或全部的)文件 u - 向已存在的jar包中添加文件 f - 指定jar包的文件名 m - 从指定的manifest文件获取清单信息 e - 指定应用程序的入口(主类的完全限定名称),用于生成可执行jar包 »

子对象以及基类子对象

子对象 对象能够包含其他对象,被包含的对象就叫子对象。子对象可以是成员子对象,基类子对象或者是数组的成员。如果一个对象不是任何对象的子对象,那么这个对象称为完全对象。 基类子对象 派生类是对基类的扩展,所以派生类对象内部一定有一份基类对象的存在,这份基类对象,本质上是派生类对象的一部分,直接存放在派生类对象内部,不是独立的对象,称之为基类子对象。 Java的super关键字 java中的super关键字就是指向基类子对象的引用。 而this关键是指向对象本身的引用。 子类会继承父类的非私有成员。如果子类的成员变量 和 从父类继承来的成员变量 同名,则子类的成员变量会隐藏父类的成员变量;如果子类的成员方法 和 »

Java访问权限修饰符

类的访问权限修饰符 类的访问权限修饰符: public: 可以被同包的类,以及非同包的类访问 default(没指定任何访问权限修饰符,也叫同包权限): 只能被同包的类访问,不能被非同包的类访问 类成员的访问权限修饰符 类成员的访问权限修饰符: private: 只能在本类内访问 default(没指定任何访问权限修饰符,也叫同包权限): 只能在本类内,同包的子类内,同包的非子类内访问 protected: 只能在本类内,同包的子类内,同包的非子类内,非同包的子类内访问 public: »

Java格式化字符串

format方法 格式化字符串是程序中经常用到的,主要包括日期格式化、时间格式化、日期/时间组合的格式化和常规类型的格式化。 在JDK1.5中,String类增加了一个新的静态方法format,用于将各种数据类型格式化成字符串。 format方法有两种重载形式: format(包含格式说明符的格式字符串format, 包含待被格式化的对象列表的不定长参数args) args:待格式化的对象列表可以包含额外的对象 作用:使用默认的语言环境,格式字符串以及对象列表生成一个格式化字符串 format(语言环境Locale, format, args) 作用:使用指定的语言环境,格式字符串以及对象列表生成一个格式化字符串 »

Java switch

语法 switch语句的语法是: switch (表达式) { case 常量1: 语句块1 [break;] ... case 常量n: 语句块n [break;] default: default语句块 [break;] } 支持的数据类型 switch语句中的表达式必须返回整型(byte、short、int,不包括long)或其对应的封装器类,或者字符类型,或者Enum类型,或者String类型。 执行流程 »

表达式求值顺序简介

前提 表达式有两种功能: 表达式一定会产生一个值 表达式可能会产生“副作用”(side effect) 比如,i++的返回值是i,副作用是导致i增加1。 比如,++i的返回值是i+1,副作用也是导致i增加1。 表达式中的副作用何时生效以及运算对象的求值顺序,会影响到表达式的值。比如: int a = 4, b; b = a++ + a; 如果“ »

JAVA书签

JDK、JRE、JVM三者间的关系 http://playkid.blog.163.com/blog/static/56287260201372113842153/ Java基本数据类型总结 http://www.cnblogs.com/doit8791/archive/2012/05/25/2517448.html Java从入门到精通 https://share. »

制作RPM包

概述 本文在“RPM version 4.8.0”下,测试通过。点击这里查看用于生成Openresty的rpm包的spec文件。 常见的Linux发行版主要分为两类:类RedHat系列和类Debian系列。类RedHat系统中,软件包的格式是rpm;类Debian系统中,软件包的格式是deb。类RedHat系统提供了rpm(全称是:RedHat Package Manager)命令来安装、卸载和升级rpm软件包;类Debian系统提供了dpkg命令来安装、卸载、升级deb软件包。 »

Python实现KMP算法

算法简介 百度百科 一篇很好的文章 next算法 注意:本文中,字符串的索引是从0开始的。 当模式串P的第0到第j个字符和主串S的第i-j到第i个字符相匹配,但是P的第j+1个字符和S的第i+1个字符失配的时候,根据KMP算法,需要根据P的第j个字符的next值,确定下次在S上开始搜索的位置(i+1-next[j])。 next值其实就是“最长公共前后缀”,求解思路如下: 假设当前字符的索引为ind,当第ind-1个字符的next值为k的时候,如果P[ind]等于P[k] »