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软件包。 »

Nginx配置HTTPS的例子

Nginx配置单向HTTPS 自建CA [root@iZ23dastruaZ ~]# mkdir test_ngx_https [root@iZ23dastruaZ ~]# cd test_ngx_https/ [root@iZ23dastruaZ test_ngx_https]# mkdir certs private [root@iZ23dastruaZ test_ngx_ »

HTTPS和Nginx的HTTPS配置

HTTPS协议和原理 想要深入了解HTTPS协议和原理,请移步这里。 接下来会着重介绍SSL握手协议。 注意:如果没有特殊说明,本文中SSL和TLS是同义词。 SSL握手协议 SSL握手协议(SSL Handshake Protocol)可以分为四个阶段: 1,客户端和服务器端安全信息的互相发送 客户端发送ClientHello信息,包含如下内容: (1)客户端可以支持的SSL的最高版本号 (2)一个用于生成密钥的32字节的随机数 (3)一个确定会话的会话ID (4)一个客户端可以支持的密码套件列表 (5) »

OpenSSL介绍

OpenSSL是什么 OpenSSL是一个开源的程序套件,这个套件由三部分组成: libcrypto:具有通用功能的加密库,里面实现了众多的加密算法 libssl:实现了ssl/tls功能 openssl:多功能的命令行工具,可以实现加密解密,甚至自建CA,创建证书,吊销证书 本文主要介绍,使用OpenSSL自建CA,使用OpennSSL生成SSL证书,以及吊销证书。 基础概念 非对称加密: 对称加密算法在加密和解密时,使用的是同一个密钥。非对称加密算法需要两个密钥:公开密钥和私有密钥,公开密钥和私有密钥是一对, »

Gossip protocol

概述 流言协议是一种计算机对计算机的沟通协议(该协议的灵感来源于社会网络中的“八卦”)。在现代的分布式系统中,通常使用流言协议来解决其它方式难以解决的问题,比如:底层的网络结构非常复杂,或者流言协议是最有效的解决方案等。 流行病协议有时被当做流言协议的同义词,因为流言协议传播信息的方式与生物群落中病毒的传播方式相似。 流言协议 流言协议的概念可以类比为办公室工作人员散播传闻。假设每小时办公室工作人员都在饮水机周围聚集,每个雇员都随机地和另外一个人结成一对,然后分享最新的传闻。最开始的时候,Alice开始传播一个新的传闻,她告诉Bob:Charlie染胡子了。在下次会议的时候,Bob把这个传闻告诉了Dave,而Alice又把这个传闻告诉了eva。在每次饮水机会议之后,听说传闻的人数都大致会翻倍。计算机系统通常以随机的“ »

ngx_lua之rewrite

rewrite_by_lua指令 syntax: rewrite_by_lua <lua-script-str> context: http, server, location, location if phase: rewrite tail WARNING Since the v0.9.17 release, »

Nginx之rewrite

ngx_http_rewrite_module提供的rewrite指令 Syntax: rewrite regex replacement [flag]; Default: — Context: server, location, if 如果请求的URI匹配指定的正则表达式regex,URI会被改变为replacement字符串指定的值。rewrite指令会按照它们在配置文件中出现的顺序依次执行。可以通过使用flag标记,来终止这个指令的进一步处理,如果replacement字符串以http://或https://开头,那么会终止处理,并返回重定向给客户端。 可选的flag参数是下面中的一个: last »

ngx_lua之ngx.timer.at

语法 ok, err = ngx.timer.at(delay, callback, user_arg1, user_arg2, ...) 上下文 init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua* »

Lua 常用函数

函数原型: next (table [, index]) 功能: 用于遍历表中所有的域。它的第一个参数是一个表,第二个参数是这个表的一个索引。该函数返回表的下一个索引和与之相关联的值。当使用nil作为第二个参数调用这个函数的时候,它会返回初始的索引和与之相关联的值。当使用最后一个索引作为第二个参数调用这个函数的时候,它会返回nil;当第一个参数是空表,第二个参数是nil时,它也会返回nil。第二个参数的默认值是nil。通常,可以使用next(t)来检查一个表是否是空表。 索引被枚举的顺序是不确定的,即使对整型索引也是如此,因此为了按照整型顺序遍历一个表可以使用数值for循环或ipairs函数。 next函数的行为是undefined if, »

递归、尾递归

递归 递归就是一个函数直接或间接的调用自身。一般来说,递归需要有边界条件、递归前进段、递归返回段,当边界条件不满足时,递归前进;边界条件满足时,递归返回。使用递归时,需要注意以下两点: 递归就是在函数或过程里调用自身 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口 下面是使用线性递归实现斐波那契数列的例子(Lua版): local function fibo(n) if n < 2 »

Lua-输入输出处理

IO标准库提供两种不同的方式进行文件处理 io表调用方式:使用io表,io.open可以打开文件,并返回文件句柄,所有的操作都将围绕着这个文件句柄。 进程在启动的时候,会打开三个文件:标准输入、标准输出、标准错误输出,在Lua中,这三个文件所对应的文件句柄分别是:io.stdin、io.stdout、io.stderr。 文件句柄直接调用方式:即使用file:XXX()函数方式进行操作,其中file为io.open返回的文件句柄。 »

也说12306

需求分解 对于查询余票:从从库查询,并且允许延迟,保证查询系统基本可用即可。 对于支付:本文不做分析,但是需要明确:下单和支付不是耦合的,而是完全分离的两个系统。 对于退票:视为购票数量为-1的下单。 对于下单:以下重点说明。 下单系统分析 高并发:由分布式的部署进行缓解,使用高强度验证码、限流等方式过滤异常请求,分时段放票,必要时放弃部分有效请求等。 CAP三角形中的CP:C由事务型数据库保证,P从架构设计上消灭。 算法说明 把每次列车的每个席别都看成一个单独的车次, »

Json Web Token(JWT)简介

JSON Web Token的结构 JSON Web Token包含用点(.)分隔的三部分: Header(头) Payload Signature(签名) 因此,一个JWT的形式是: xxxxx.yyyyy.zzzzz Header Header通常包含两部分: token的类型(就是JWT) 哈希算法(比如:HMAC SHA256或RSA) 下面是一个例子: »

OAuth2.0学习笔记

概述 OAuth:OAuth(开放授权)是一个关于授权(authorization)的开放网络标准。OAuth允许用户授权第三方应用程序(third-party application)访问他们存储在其他的服务提供商(HTTP service)上的资源(resource),而不需要将用户名和密码提供给第三方应用程序或分享他们的所有的资源。 应用场景 有一个“云冲印”网站,可以将用户存在Google上的照片,冲印出来。用户为了使用该服务,必须让“云冲印”读取自己储存在Google上的照片。 »

lua系列-2-Chunk

Chunk(代码块) Lua的一个执行单元被称作Chunk,一个Chunk就是一个语句(赋值、控制结构、函数调用、变量声明)序列,它们会按次序执行。每个语句可以以一个分号结束: chunk ::= {stat [';']} (语句结尾的分号是可选的,但是如果同一行有多个语句最好使用分号隔开。) Lua中不允许有空的语句,所以 ';;' 是非法的。(lua5.3支持空语句) Lua把Chunk当作拥有不定参数的匿名函数处理,正是这样可以在Chunk内部定义局部变量、 »

lua系列-1-安装Lua

安装依赖: sudo yum install -y readline ncurses readline-devel ncurses-devel 下载源代码: wget http://www.lua.org/ftp/lua-5.3.2.tar.gz 安装: tar zxvf lua-5.3. »

Nginx的upstream连接池

keepalive指令 语法:keepalive connections; 上下文:upstream 激活Nginx worker到upstream服务器的连接的缓存。 connections参数用来设置连接池中空闲的连接的最大数量,这些连接会被保存在每个worker的缓存中。当连接数量达到这个值的时候,后续建立的连接不会被缓存(在使用完之后,就会关闭)。 需要特别注意的是:keepalive指令不会限制nginx worker进程到upstream服务器的连接的总数。 下面是使用keepalive连接的memcached upstream的示例配置: upstream memcached_backend { server 127.0.0. »

java-语句、表达式、运算符及其优先级、结合性

语句 语句是组成程序的基本单位,java语句是java标识符的集合,由关键字、常量、变量和表达式组成,是成员方法的主要组成部分,必须包含在类的方法体中。语句以“;”作为结束标志。 执行语句是为了完成某个操作或修改某个数据。 java的语句类型有: 变量声明语句,比如:int x, y = 10; 执行语句: 流程控制语句:if-else,switch-case,while,do-while,for,break, »

基于栈的运行时环境

函数堆栈 程序要想运行,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。光有代码段和数据段是不够的,进程在运行过程中,还要有其动态环境,其中最重要的就是堆栈。下图是linux下进程的地址空间布局: TIPS: 代码段就是存储程序文本的,所以也叫文本段,指令指针中的指令就是从这里取得,对应图中的text。这个段是可以被共享的,比如在Linux下开了两个vim编辑文本,那么一般来说这两个vim是共享一个代码段的,但是数据段不同(这有点类似c++中类的不同对象共享相同的成员函数)。代码段的特点是:可读可执行不可写。 数据段是存储数据用的,包括初始化的数据和未初始化的数据(BSS段)两部分, »

python:logging模块

概述 python的logging模块(logging是线程安全的)给应用程序提供了标准的日志信息输出接口。logging不仅支持把日志输出到文件,还支持把日志输出到TCP/UDP服务器,EMAIL服务器,HTTP服务器,UNIX的syslog系统等。在logging中主要有四个概念:logger、handler、filter和formatter,下面会分别介绍。 logger Logger对象扮演了三重角色: 它给应用程序暴漏了几个方法,以便应用程序能在运行时记录日志。 Logger对象根据日志的级别或根据Filter对象,来决定记录哪些日志。 Logger对象负责把日志信息传递给相关的handler。 在Logger对象中,最常使用的方法分为两类:configuration,message »

Python算法和数据结构

说明 本文主要是对Problem Solving with Algorithms and Data Structures Using Python的翻译和自己的一些理解。 目标 回顾计算机科学,编程和解决问题的思想 理解抽象化和它在问题解决过程中所扮演的角色 理解和实现抽象数据类型的概念 回顾Python编程语言 开始 (我们回想:)过去的编程方式经历了许多挑战,因为首先电子计算机需要跳接电缆(patch cables)和交换机,把指令从人传输到机器。就像人类社会的许多方面,计算机技术的变革给计算机科学家提供了越来越多的工具和平台来实践他们的想法。 »

初识云计算

云计算层次(Stack) 云计算常被描述为一个层次堆栈(stack),每个层次都建立在另一个层次的顶部,并向上提供服务接口。美国国家标准与技术研究院(NIST)将云计算定义为一个模型 :简易的管理即可方便地按需配置网络访问,并可以配置计算资源(如网络,服务器,存储,应用程序和服务)。 NIST还提供了以下几个被认为在云服务中必不可少的特点: 按需自助式服务。用户通过注册获得服务,而传统的IT技术需要很长时间才能为用户提供服务。 广泛的网络访问资源。可以通过标准平台(如台式机,笔记本电脑,手机等)来访问服务。 资源池。 »

http的multipart/form-data请求

简单的HTTP POST 使用post请求向http服务器提交数据,通常是使用form表单提交: <html> <head> <title>x-www-form-urlencoded</title> </head> <body> <form action= »

任务队列:gearman

介绍 gearman是一个通用的应用程序框架,用来在机器或进程之间分发任务。它支持并发的执行任务,负载均衡处理,和多语言系统集成。gearman能够应用的领域非常广泛,比如:高可用的网站,数据库复制事件的传输等。 原理 gearman的请求处理过程涉及三个角色:client->jobserver->worker: client 请求的发起者,可以是C,PHP,Perl,MySQL UDF等等。 jobserver 请求的调度者,负责协调把client发出的请求转发给合适的worker。 worker »

python任务队列:celery

什么是任务队列? 任务队列是一种在进程或机器之间分发任务的机制。 任务队列的输入是被称为任务(task)的工作单元。专用的工作进程会时刻监控任务队列,来获取要执行的任务。 celery的client和worker通过消息来“沟通”,但是celery本身并不提供消息服务,因此它使用第三方的消息服务来传递任务,目前celery支持的消息服务有RabbitMQ、Redis甚至是数据库。为了开始一个任务,client需要向队列中发送任务消息,然后broker会把任务投递给worker处理。 一个celery系统可以包含多个worker和broker,以便实现高可用和可水平扩展。 celery是用python编写的,但是协议可以用任何语言来实现,目前为止有用于ruby的RCelery,用于nodejs的node-celery,和一个php客户端。其他的语言也可以通过webhooks来调用celery的task。 celery的架构如下 Celery需要什么? »

使用Setuptools构建和分发python包

Setuptools是disutils(python2.6+)的增强版,它使得开发者可以更容易地构建和分发python包,尤其是依赖其他包的包。 对用户来说,使用Setuptools构建和分发的包看起来就像普通的基于distuils的python包。为了使用Setuptools,用户不必安装或了解它们,开发者也不必在发行版中包含全部的Setuptools工具。通过包含一个单独的bootstrap模块,如果用户使用源码构建包,并且没有安装相应版本的Setuptools,那么包会自动的下载和安装它。 功能亮点 使用easy_install工具的时候,在构建期间会自动的寻找/下载/安装/升级依赖包。easy_install支持通过HTTP,FTP,Subversion和SourceForge下载包, »

python单元测试框架:unittest

单元测试 什么是单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况来判定,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。 单元测试是由程序员自己来完成的,最终收益的也是程序员自己,可以说程序员有责任编写功能代码,也就有责任为自己的代码编写单元测试,执行单元测试就是为了证明这段代码的行为和我们的期望一致。 测试用例、输入数据、预期输出 参考文档: 单元测试_ »

nginx限速

基础知识 map指令 map指令是ngx_http_map_module模块提供的。ngx_http_map_module模块用于创建值依赖于其他变量的值的变量。 示例配置: map $http_host $name { hostnames; default 0; example.com 1; *.example.com 1; example.org »

python用户负载测试工具:locust

locust是什么 locust是一个易于使用的,分布式的,用户负载测试工具。用于web站点(或其他系统)的负载测试,然后算出系统能够处理多少并发用户。 locust的思想是:在测试期间,一大群"蝗虫"会攻击你的网站,每一个"蝗虫"的行为都是由你自己定义的,同时,可以在一个web界面上实时的监控这群进程。这会帮助你更好的"进行战斗",在真正的用户进入之前,就找出代码中的瓶颈。 locust完全是事件驱动的,因此它能够在单机支持数以千计的并发用户,相比许多其他的基于事件的应用,locust不使用回调函数。 »

python性能测试框架:Multi-Mechanize

Multi-Mechanize | 性能测试框架 主页 pypi github License: GNU LGPLv3 Author: Corey Goldberg - copyright © 2010-2012 使用python进行性能和负载测试 multi-mechanize是一个开源的性能和负载测试框架,它并发的运行python脚本来生成一个远程站点或服务的负载。 multi-mechanize通常用于web性能和扩展性测试,但是也能用于使用python来生成任何远程的可访问的api的负载。 测试输出报告既能存储为HTML,也可以存储为JMeter兼容的XML。 安装 multi-mechanize需要python2.6或2.7 pip »

nginx的uwsgi配置

ngx_http_uwsgi_module模块 ngx_http_uwsgi_module模块允许把请求传递给uwsgi服务器。 配置示例: location / { include uwsgi_params; uwsgi_pass localhost:9000; } uwsgi_bind address | off; nginx所在的服务器可能有多个ip地址,uwsgi_bind指令用于设置nginx向后端的uwsgi服务器发起请求的时候,所使用的ip地址;如果没有指定的话, »

python:ctypes学习笔记

ctypes ctypes是python的一个外部函数库,提供和C语言兼容的数据类型,可以直接调用动态链接库中的导出函数。 ctypes is very cool! Great piece of work.---Just van Rossum 为了使用ctypes,必须依次完成以下步骤: 加载动态链接库 将python对象转换成ctypes所能识别的参数 使用ctypes所能识别的参数调用动态链接库中的函数 动态链接库加载方式有三种: cdll windll oledll 它们的不同之处在于:动态链接库中的函数所遵守的函数调用方式( »