三分钟上手git管理工具tower

虽然命令行git也很好用,但是gui的tower操作更直观,两者搭配使用可以提高效率

打开git仓库

File -> Open然后选择项目目录

查看分支历史

tower相比命令行git可以更方便的查看分支历史

单机左边栏的分支名称就可以查看这个分支的历史了,比如查看master分支历史,操作效果如下

右侧可以看到完整的修改细节

Read more   2019/6/24 posted in  GIT 三分钟系列

使用staruml画uml图

staruml图表类型

可以看到staruml支持的图的类型,一般下面两种类型比较常用

  1. Class Diagram: 类图
  2. Sequence Diagram: 时序图
Read more   2019/6/21 posted in  UML 一图胜千言 设计模式

xaop源码分析

项目地址:https://github.com/liqiongfan/xaop

思路: hook掉php执行函数的方法(zend_execute_ex),然后使用call_user_function调用自定义的回调函数

文件和作用

Xaop操作类的所有方法:kernel/xaop.c

Xaop操作类会使用的宏,比如解析和检查方法的参数:kernel/xaop.h

扩展调用php函数的函数:kernel/helper.c 和 kernel/helper.h

替换php的zend_execution_ex: kernel/exec.c 和 kernel/exec.c

解析用户编写的annotation的相关逻辑:kernel/parsing.c 和 kernel/parsing.h

全局变量定义在: php_xaop.h

全局工具类zend_class_entry的声明*annotation_ce, *doc_ce, *xaop_ce:kernel/classes.c

检查参数是否合法

#define CHECK_PARAM() do {\
    if ( Z_TYPE_P(class_name) != IS_STRING && Z_TYPE_P(class_name) != IS_NULL ) { \
        php_error_docref(NULL, E_ERROR, "First argument need to be a valid class name or NULL");\
        return ;\
    }\
    if ( ZSTR_LEN(function_name) && '*' == ZSTR_VAL(function_name)[0] ) { \
        php_error_docref(NULL, E_ERROR, "Function name mustn't be `*`.");\
        return ;\
    }\
    if ( !zend_is_callable(aop, IS_CALLABLE_CHECK_NO_ACCESS, NULL) ) {\
        php_error_docref(NULL, E_ERROR, "Third argument is expected to be a valid callback");\
        return ;\
    }\
} while(0)
Read more   2019/6/20 posted in  源码分析 PHP

小微http服务器Tinyhttpd源码分析

完整源代码参考:https://github.com/EZLippi/Tinyhttpd/blob/master/httpd.c

这个项目的调用关系图如下

库文件

#include <stdio.h> 提供perror函数
#include <sys/socket.h> 提供 accept等socket函数
#include <sys/types.h> 提供 u_short 类型
#include <netinet/in.h> 提供sockaddr_in结构体
#include <arpa/inet.h> 提供htons函数
#include <unistd.h> 提供close, dup, dup2等函数
#include <ctype.h> 提供isspace函数
#include <strings.h> 提供strcasecmp函数
#include <string.h> 提供strcat函数
#include <sys/stat.h> 提供检查文件是否存在的stat函数
#include <pthread.h> 提供pthread_create函数
#include <sys/wait.h> 提供wait函数
#include <stdlib.h> 提供printf函数
#include <stdint.h> 提供intptr_t类型
Read more   2019/6/17 posted in  源码分析

在mac os中使用phpbrew管理本地php版本

虽然mac下的mamp pro非常好用,并且提供gui操作界面,但是是收费软件,还比较贵,目前使用phpbrew作为mamp pro的替代品,除了没有gui界面,对php的版本管理不输mamp pro

安装phpbrew

先使用homebrew安装依赖

# xcode-select --install
brew install automake autoconf curl pcre bison re2c mhash libtool icu4c gettext jpeg openssl libxml2 mcrypt gmp libevent
brew link icu4c
brew link --force openssl
brew link --force libxml2

安装phpbrew

curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew

mv phpbrew /usr/local/bin/phpbrew
Read more   2019/6/11 posted in  PHP

职责链设计模式

职责链模式有这些特点:

  1. 需要解决一个问题
  2. 存在多个对象都可以解决这个问题
  3. 按照顺序依次排列对象(链条的特点)

拿数学函数举例,存在一个问题x,对应的解决方案有5种,分别是

  1. f1(x) 可以但不一定能解决问题,如果不能解决问题就调用f2(x)
  2. f2(x) 可以但不一定能解决问题,如果不能解决问题就调用f3(x)
  3. f3(x) 可以但不一定能解决问题,如果不能解决问题就调用f4(x)
  4. f4(x) 可以但不一定能解决问题,如果不能解决问题就调用f5(x)
  5. f5(x) 可以但不一定能解决问题,如果不能解决问题,则问题无法解决

调用方只允许调用f1(x)这个函数,调用方无需关心f2, f3, f4, f5链条的存在,只需要得到最终问题是否能够解决的结果即可。

体现职责链模式有下面几点

  1. f1, f2, f3, f4, f5都有职责解决问题x
  2. 链条体现在f1, f2, f3, f4, f5解决问题x必须按固定顺序进行尝试,比如按照f1, f2, f3, f4, f5的顺序
  3. 链条终止在问题x得到解决,如果所有方案都无法解决问题x,问题x则被标记为责任链无法解决
Read more   2019/6/10 posted in  设计模式

三分钟上手openldap帐号系统

公司内的帐号系统一般使用openldap,openldap相对于把帐号存入mysql等关系数据库中开发和维护成本都比较低,所以openldap成了公司内帐号体系最合适的选择

可以通过下面的内容快速上手这个openldap帐号系统

名词概念

这个ldap里面使用了很多的别名,下面列出了常用的别名

dn: 区别名,类比mysql的主键id

cn: 常用名,类比用户的呢称(全名)

sn: 用户的姓氏

giveName: 用户名字(不包含姓)

dc: 所属域名,类比命名空间,一个用户可以存在在多个dc中

uid: 登录使用的名称

c: 所属国家,比如CN表示中国

ou: 所属组织

LDIF: openldap的数据描述格式,类比linux的/etc/passwd文件格式,使用固定的格式来描述包含的数据

dn:uid=1,ou=firstunit,o=myorganization,dc=example,dc=org
objectclass:top
objectclass:person
objectclass:uidObject
objectclass:simpleSecurityObject
userPassword:123456
cn:第一个用户
sn:su
uid:1
telephoneNumber:13288888888

注意:很多objectClass都会提供额外的字段,比如上面的telephoneNumber字段就是person这个objectClass提供的

Read more   2019/6/9 posted in  帐号系统

在spring boot中三分钟上手阿里云日志服务Log Service

虽然可以自行搭建elk等日志系统,但是日志系统特别耗费系统资源,相对于阿里云提供日志服务,自行搭建的机器成本和运维成本较高,一般可以直接选择使用阿里云的日志服务

先来看一张阿里云日志服务的架构图

从上面这张图可以看到这个阿里云的日志服务不仅支持多个数据源,同时在日志服务的基础上衍生出不少数据二次加工的功能,比如MacCompute、Spark Streaming等

创建案例项目

Read more   2019/5/27 posted in  三分钟系列 Spring Boot PHP

使用资源配置工具terraform在aws上构建基础架构

Read more   2019/5/25 posted in  AWS OPS

使用prometheus + grafana + pushgateway搭建监控可视化系统

Read more   2019/5/21 posted in  监控 OPS

三分钟上手基于openresty开发的kong网关系统

kong作为非java全家桶的一员,在非java领域的网关系统中得到了广泛的应用

使用docker一键启动kong

参考项目:https://github.com/Kong/docker-kong/tree/master/compose

启动过程如下:

git clone https://github.com/Kong/docker-kong.git
cd docker-kong/compose
docker-compose up -d

查看操作效果:

可以看到kong监控了4个端口

Read more   2019/5/20 posted in  LUA OpenResty

使用gdb调试工具上手调试php和swoole源码

swoole作为php的核心项目,php和swoole都具有一定的研究价值,由于是c语言编写的项目,要上手进行调试,那么最好用的调试工具就是gdb了

这个gdb调试工具功能强大,支持的选项也是非常多,下面就总结出来常用的命令

编译源码添加调试信息

在编译时把调试信息编译进生成的二进制文件中,需要给gcc编译器加上-g参数,比如编译php的Makefile中是这样的

加上-g参数就已经有调试信息了,-O0是关闭gcc的优化,这个gcc优化后会在调试时丢失一部分调试信息,所以一般建议关闭

这样在gdb里面就可以随时查看当前执行到源码的那个地方了,能够显著提升调试的效率

查看源码

Read more   2019/5/18 posted in  GDB PHP SWOOLE 源码分析