自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

架构师专栏

专注于后台技术

  • 博客(128)
  • 收藏
  • 关注

原创 C语言可变参数列表应用——多字符串复制和链接

C标准库中头文件中包含可变参数列表的实现,完成遍历未知数目和类型的函数参数列表的功能。提供以下3个宏以及va_list变量:                va_start(va_list ap, lastarg):在提取可变参数前必须调用这个宏实现初始化。                va_arg(va_list ap, type_of_var):用于提取变量,type_of_var是

2012-10-17 23:27:08 5403

原创 Python语法解析器PLY——lex and yacc in Python

PLY是lex和yacc的python实现,包含了它们的大部分特性。PLY采用COC(Convention Over Configuration,惯例优于配置)的方式实现各种配置的组织,比如:强制词法单元的类型列表的名字为tokens,强制描述词法单元的规则的变量名为t_TOKENNAME等。本文主要是对PLY做一个基本的介绍。一. 词法分析1. 词法单元的类型列表(token list)

2012-10-16 22:56:50 45517 4

原创 nginx源码分析(9)——filter模块

phase handler处理中介绍了content handler用于产生响应内容,随便找一个content phase的模块,比如:ngx_http_static_module.c,会发现在content handler中会调用ngx_http_send_header,然后最后调用ngx_http_output_filter。这两个函数就是发送响应头部和响应体的,在nginx中输出内容是通过f

2012-10-11 18:11:14 7692 7

原创 nginx源码分析(8)——phase handler处理

nginx将请求的处理过程划分为11个phase(阶段),相当于是对请求处理的一种抽象,便于定制处理过程。这个11个phase,分别是(定义在http/ngx_http_core_module.h):typedef enum { NGX_HTTP_POST_READ_PHASE = 0, /* 读取请求 */ NGX_HTTP_SERVER_REWRITE_PHAS

2012-10-10 14:12:55 9283 1

原创 nginx源码分析(7)——请求处理

在建立连接过程中,对于nginx监听到的每个客户端连接,都会将它的读事件的handler设置为ngx_http_init_request函数,这个函数就是请求处理的入口。在处理请求时,主要就是要解析http请求,比如:uri,请求行等,然后再根据请求生成响应。下面看一下nginx处理的具体过程。1. ngx_http_init_request        在ngx_http_in

2012-10-09 11:18:28 9255

原创 一个简单的解释器——python实现

一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解。我们编写的程序源代码实际上就是一串字符序列,编译器或者解释器可以直接理解并执行这个字符序列,这看起来实在是太奇妙了。本文会用python实现一个简单的解析器,用于解释一种小的列表操作语言(类似于python的list)。其实编译器、解释器并不神秘,只要对基本的理论理解之后,实现起来也比较简

2012-09-27 17:13:17 9950

原创 分布式定时任务框架——python定时任务框架APScheduler扩展

如果将定时任务部署在一台服务器上,那么这个定时任务就是整个系统的单点,这台服务器出现故障的话会影响服务。对于可以冗余的任务(重复运行不影响服务),可以部署在多台服务器上,让他们同时执行,这样就可以很简单的避免单点。但是如果任务不允许冗余,最多只能有一台服务器执行任务,那么前面的方法显然行不通。本篇文章就向大家介绍如何避免这种互斥任务的单点问题,最后再介绍一下基于APScheduler的分布式定时任

2012-08-30 17:46:57 20244 6

原创 进程调度模拟

进程调度就是在所有可运行的进程之间分配CPU资源,它使得在单个CPU上并发执行多个进程成为可能。本文通过java模拟时间片轮转算法,以具象化进程调度。进程是操作系统中一个重要的抽象,通过进程调度和虚拟内存机制实现了CPU和内存的虚拟化。在每个进程看来,自己是独占CPU和内存的。        下面看一下进程调度的大致原理,每个进程是程序的执行实体,相当于程序执行的容器。在进程执行时,进程有自己

2012-08-28 16:29:06 3678

原创 Apache反向代理配置

先确定Apache的proxy_module和proxy_http_module模块已经安装,如果没有,可以通过apxs安装。apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用LoadModule指令在运行时加载到Apache服务器中。        切换到Apache的源码目录下的modules/proxy,

2012-08-16 13:44:20 3000

原创 NodeJS自动安装脚本

每次安装都要解压锁、创建环境变量啥的,很麻烦,这里编写脚本将这些操作自动化,从繁琐的工作中解放~~        这个脚本会将tar文件下载到/home/download目录下,然后安装到/home/app/node-vx.x.x目录,最后会将node添加到PATH中,并设置NODE_PATH。        使用方法:sh node_setup.sh 0.8.2,将安装版本为0.8.2的

2012-08-14 10:58:22 4570

原创 nginx源码分析(6)——建立连接

对于web server来说,必须能够监听到客户端的连接才能与之通信,这篇文章就看一下nginx是如何实现连接的建立。监听到新的连接实际上就是监听socket上的读事件,此时监听socket的已完成连接队列是非空的,可以非阻塞的调用accpet获取新到的连接。在nginx中每个socket都会被封装成一个连接结构,就是ngx_connection_t类型。每个ngx_connection_t结构具

2012-08-09 18:03:48 5704 4

原创 Nginx实现jsonp调用

通过jsonp实现js跨域时,需要通过url参数指定回调函数名,比如:> curl localhost/jsonptest?callback=cb123> cb123({'name': 'kobe'});        下面就介绍如何在nginx中实现这一功能。        我们知道nginx中有着很多优秀的模块,这里也不例外,需要依赖几个第三方模块,包括:ngx_devel,s

2012-08-08 15:11:33 6682

原创 Python定时任务框架APScheduler

APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个python定时任务系统,写python还是要比java舒服多了。1. 安装        安装过程很简单,可以基于easy_install和源码。

2012-08-08 14:10:21 71199 4

原创 nginx源码分析(5)——监听socket初始化

在nginx源码分析(4)中,看到了nginx的事件模型,但其中没有介绍监听socket的初始化。而对于web server来说,需要通过监听socket来监听客户端的连接等。本篇将会具体介绍这方面的内容。还记得在前文介绍ngx_cycle_t结构时,它具有一个listening属性,是一个数组,存储所有监听socket,下面就来看看这些信息是什么时候添加的、以及如何初始化的。1. 重要的数据

2012-07-18 15:50:31 10650 2

原创 nginx源码分析(4)——事件模型

对于一个服务器来说,事件模型是至关重要的,nginx本身的高性能也要归功于其优秀的事件模型。一般地,nginx的事件模型是基于epoll的,而使用epoll需要调用epoll_create、epoll_ctl和epoll_wait三个函数。由于nginx本身的松耦合模块机制,这些函数的调用被隐藏在很难发现的地方,本篇文章就来介绍nginx的事件模型的初始化过程,从而大家可以清晰的知道epoll各个

2012-07-12 23:05:27 8816 1

原创 nginx源码分析(3)——进程模型

原本计划这一篇的内容是配置文件的解析,不过为了连贯性,还是继续nginx初始化的过程。nginx的进程模型与大多数http服务器采用的模型是一样的,都是Master-Worker模型。Master进程负责处理外部信号,同时管理所有的Worker进程。而Worker进程就是用来处理连接的建立、请求和响应,大部分的事件处理都是在worker进程中。1. 基本的数据结构        1. ng

2012-07-11 17:05:24 5542

原创 nginx源码分析(2)——http模块的初始化过程

前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块、事件模块等。这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函数背后隐藏了大量的细节吗?这里就揭开这层神秘的面纱,去看看几个重要的http模块是如何初始化的。这里依然沿用上一篇文章的结构,首先来看几个重要的数据结构。1. 重要的数据结构        1

2012-07-10 19:30:31 12056 1

原创 nginx源码分析(1)——启动过程

1. 重要的数据结构        1. ngx_module_t        nginx中所有模块的类型都是ngx_module_t类型的,定义了模块的一些属性。nginx是完全模块化的,所有的组件都是模块,从而实现了nginx的高度松耦合。同时,我们在进行nginx模块开发时,也离不开这个数据结构。struct ngx_module_s { /** * 在具体类

2012-07-09 18:19:34 8022 3

原创 系统调用的实现原理

系统调用概述        计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)。        系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进

2012-07-06 15:00:39 28024 6

原创 财经行情API架构优化实践

从3月份到5月份一直在做行情API的架构优化,在这个过程中遇到了很多问题,也尝试了很多的解决方案,但都没有寻找到一个最佳的方案,最后基于API的特点自己实现了一个基于共享内存的key-value存储touchdb。这里,和大家一起分享一下。1. 行情API及旧架构介绍        先简单介绍一下行情API,让大家对这个应用的特性、需求有一个足够的了解,才能清楚了解后续的优化过程。

2012-07-04 11:46:49 6321

原创 缓存系列(1)——浏览器缓存协商

“缓存”在计算机技术中被大量使用,比如从计算机体系结构中存储层次结构到Web系统中的web缓存、反向代理缓存以及浏览器缓存等。缓存主要用来解决费时操作的重复计算,主要是把费时操作的计算结果保存至磁盘、内存等介质中,下一个请求到来时直接将结果返回,这就避免了重复的操作,节省了cpu、带宽等资源。当然,万物都是有利弊的,缓存的缺点就是不能保证时效性,雪崩效应等。        对于高性能的Web应

2012-03-13 18:36:53 4195 2

原创 linux经验总结(持续更新)

1. 单个进程打开的文件描述符最大值默认是1024,可以通过ulimit -a查看所有的限制ulimit -n 可以查看文件描述符最大值。并可以通过ulimit -n 65535设置这一次会话的最大值。2. 查看linux机器的连接数netstat -est | grep established | grep -v packets    1186 connections e

2012-03-09 03:23:34 3869

原创 JS跨域请求

1. 同源策略        所有的浏览器都遵守同源策略,这个策略能够保证一个源的动态脚本不能读取或操作其他源的http响应和cookie,这就使浏览器隔离了来自不同源的内容,防止它们互相操作。所谓同源是指协议、域名和端口都一致的情况。举例来说,首先在Nginx上配置两个虚拟主机,一个监听80端口,另一个监听81端口:server { listen 80; server_name

2012-03-08 18:29:22 32783 3

原创 Python日志输出——logging模块

1. logging介绍        Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。        logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供logger

2012-03-06 00:18:44 165798 13

原创 Python日期操作

1. 日期输出格式化        所有日期、时间的api都在datetime模块内。        1. datetime => stringnow = datetime.datetime.now()now.strftime('%Y-%m-%d %H:%M:%S')        输出2012-03-05 16:26:23.870105        strftime是

2012-03-05 17:42:21 5785

原创 Redis的Python客户端redis-py

1. 安装1. redis-py        a. 使用easy_installsudo easy_install redis        b. 源码安装git clone https://github.com/andymccurdy/redis-py.gitcd redis-pypython setup.py install2. Parser安装

2012-03-05 13:38:47 53915 2

原创 JSON美化输出

JSON字符串就是一堆字符,查看起来很不方便。这里介绍两种方法查看格式化输出之后的JSON。1. chrome插件,JSONView安装之后,可以自动识别JSON字符串。2. 直接使用python的模块json.tool输入,echo '{"a": 1, "b": 2}' | python -m json.tool看起来是不很爽?

2012-03-01 13:19:06 11579

原创 使用ngx_lua构建高并发应用(2)

在之前的文章中,已经介绍了ngx_lua的一些基本介绍,这篇文章主要着重讨论一下如何通过ngx_lua同后端的memcached、redis进行非阻塞通信。1. Memcached        在Nginx中访问Memcached需要模块的支持,这里选用HttpMemcModule,这个模块可以与后端的Memcached进行非阻塞的通信。我们知道官方提供了Memcached,这个模块只支

2012-03-01 13:17:15 14799 2

原创 使用ngx_lua构建高并发应用(1)

一. 概述        Nginx是一个高性能,支持高并发的,轻量级的web服务器。目前,Apache依然web服务器中的老大,但是在全球前1000大的web服务器中,Nginx的份额为22.4%。Nginx采用模块化的架构,官方版本的Nginx中大部分功能都是通过模块方式提供的,比如Http模块、Mail模块等。通过开发模块扩展Nginx,可以将Nginx打造成一个全能的应用服务器,这样可

2012-02-29 14:18:27 58790 4

原创 压力测试shell脚本

一般情况下,用ab进行压测时,只执行一次的话,结果不是很准,所以我们就要手动的执行几次。这个操作很麻烦,这里写了个shell脚本,对apache的ab做了封装,只要传入指定的测试次数,自动进行,测试完成后返回平均的rps,以及最高和最低rps。        下面的脚本需要把ab_dir的值换成自己的ab的目录,具体的参数有:        n: 每次ab请求的次数。        c

2012-02-28 17:25:03 14363 1

原创 Nginx经验总结(持续更新)

1. post方法请求静态文件默认情况下,web服务器都不允许post方法请求静态文件,会返回响应403 Not Allowed。但是有些时候确实有这种需求。可以通过配置文件来改变这种设置:在需要处理静态文件的location里这样配置即可,location /static/ { root /path/to/files/; error_page 405 =200 $uri;

2012-02-28 11:44:56 11567

原创 Redis主从配置

Redis Replication的特点:1. 一个master可以有多个slave。2. slave还可以接受其他slave的连接,也就是说Redis Replication可以配置成图结构。3. 主从同步在master端是非阻塞的,在进行同步操作时,master依然可以进行查询。4. 主从同步在slave端也是非阻塞的,在进行同步操作时,slave依然可以使用旧的数据响应查询操

2012-02-27 16:06:09 2320

原创 linux下C include搜索的路径

C中可以通过#include 和#include "stidio.h",区别是:#include ,直接到系统指定目录去查找头文件。#include "stidio.h",会先到当前目录查找头文件,如果没找到在到系统指定目录查找。gcc编译时查找头文件,按照以下路径顺序查找:1. gcc编译时,可以设置-I选项以指定头文件的搜索路径,如果指定多个路径,则按照顺序依次查找。比

2012-01-19 15:34:27 61575

原创 Python包管理工具easy_install安装

easy_install是python的包管理工具,可以方便的下载、安装、更新python包,并可以自动处理相关依赖。类似于ruby的gem,java的maven,nodejs的npm。安装方法有两种:1. wget http://peak.telecommunity.com/dist/ez_setup.py 然后python ez_setup.py2. 按照官网的安装方法,根据p

2012-01-19 14:20:30 18380

原创 NodeJS环境搭建

1. NodeJS安装node依赖于ssl,通过sudo apt-get install libssl-dev安装。node需要python坏境支持gyp(Generate Your Project),以完成源码管理,所以需要安装python,默认linux下自带的。git clone git://github.com/ry/node.gitcd node./configuar

2012-01-18 15:50:58 5418

原创 Tokyo Cabinet及其Python接口的安装

1. 安装Tokyo Cabinet        tc依赖与zlib(直接上网搜下,现在官网打不开。。。)和bzip2,直接源码安装即可。        wget http://fallabs.com/tokyocabinet/tokyocabinet-1.4.47.tar.gz        tar zvxl tokyocabinet-1.4.47.tar.gz

2012-01-12 10:38:39 9540

原创 php重构优化一例——模板方法模式应用

最近优化php项目,记录下经验,直接上干活。。。        php在公司项目中主要用于页面展现,前端有个view,view向后端的service请求数据,数据的传输格式是json。下面看优化前的service的代码:<?phprequire_once('../../../global.php');require_once(INCLUDE_PATH . '/discache/Ca

2011-12-31 16:40:43 2029

原创 Python读写mongo时区问题

mongo中的date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。所以,在php中向mongo读写MongoDate或者java向mongo读写Date时,会根据当前系统的时区与GMT进行相互转化。我猜上述转化应该是由php和java的mongo驱动实现的。比如,在java或php中,时间2011-12-27 17:57:46.

2011-12-27 18:10:08 6843

原创 关于编程语言的思考——编译型和解释型

我们知道,任何编程语言编写的程序归根到底都是由底层机器的机器代码(01序列)执行的,无论是编译型语言还是解释型语言。而任何高级编程语言程序的源代码都是一个字符序列,这个字符序列到底层的01序列是通过编译器或解析器经过多次转换完成的。图1 编程语言的层次结构        这个层次结构中,从高到低越来越接近于机器硬件。机器代码就是01序列,汇编语言就是描述本地机器的指令集体系结构,而

2011-12-21 15:24:45 9278 5

转载 Linux下安装python模块时缺少Python.h

sudo apt-get install python-dev

2011-12-20 15:49:05 5868

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除