存储过程建立临时数据

\d $$
  DROP PROCEDURE IF EXISTS insert_test_data;

  ##num_limit 要插入数据的数量,max_user_id 最大随机的数值
  CREATE PROCEDURE insert_test_data(in num_limit int,in max_user_id int)

  BEGIN
 
  DECLARE id int default 1;
  DECLARE asso_type int default 1;
  DECLARE asso_id int default 1;
  DECLARE user_id int default 1;
  DECLARE notice_type int default 1;
  DECLARE is_read int default 1;
  DECLARE create_ts int default 0;
  DECLARE update_ts int default 0;
 
  WHILE id <= num_limit do

  set asso_type = FLOOR(1 + rand() * 3);
  set asso_id = FLOOR(1 + rand() * 692051);
  set user_id = FLOOR(1 + rand() * max_user_id);
  set notice_type = FLOOR(21 + rand() * 3);
  set is_read = FLOOR(rand() * 2);
  set create_ts = unix_timestamp();
  set update_ts = unix_timestamp();

  INSERT INTO test . notices values (id, asso_type, asso_id, user_id, notice_type, is_read, create_ts, update_ts);

  set id = id + 1;
   
  END WHILE;
 
END$$
\d;

call insert_test_data(86556571, 113702);
发表在 基本语法 | 留下评论

线上查问题常用脚本

#计算qps:
grep -rn ’10/Oct/2017′ ~/logs/nginx/api.access.log.20171011 |awk ‘{ t=substr($4, 2); qps[t]++; }END{ for (q in qps) { print q” “qps[q] } }’ |sort -k2 -n -r |head

#计算时间段内 time ip uri qps
sed -n ‘/01\/Nov\/2017:12:0[0-9]/,/01\/Nov\/2017:12:0[0-9]/p’ ~/logs/nginx/api.access.log |awk ‘{ t=substr($4, 2); split($7, uris, “?”); key=t” “$1″ “uris[1]; qps[key]++; }END{ for ( key in qps ){ print key” “qps[key] } }’ |sort -k4 -n -r |head -n30

#查看报5xx错误的uri频率
awk ‘{ if( $(NF-2) >= 500 ){ split($7, uri, “?”); print uri[1]; } }’ ~/logs/nginx/api.access.log |sort -r |uniq -c

#查询占用内存主要进程
ps aux|head -1; ps aux | sort -k4nr | head -30

详情看下

http://www.ltwen.com/2017/11/01/%E6%9F%A5%E8%AF%A2%E5%8D%A0%E7%94%A8%E5%86%85%E5%AD%98%E4%B8%BB%E8%A6%81%E8%BF%9B%E7%A8%8B/

发表在 awk | 留下评论

创建git server

第一步,安装git:

$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git
第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

$ sudo chown -R git:git sample.git
第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。

参考:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000

发表在 git | 留下评论

SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY

公司扩容机器,memcached爆SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY错误

$mem->set($key, 'this is a test4');
echo $mem->get($key);
var_dump($mem->getResultMessage());exit;

不知道啥原因,比较郁闷

总结一下我当前查问题的思路:
定位问题 => 网上搜原因 => 技术交流群问大牛(但大牛一般不吊我) => 然后就不知道咋整了

发表在 memcache | 留下评论

linux下发送邮件带附件

echo ‘test mail’ |mail -s “邮件主题” -a /home/test/tmp/mobiles.txt test@sina.com

发表在 小技巧 | 留下评论

vim缩进、排版

1.按v进入visual状态,选择多行,用>或<缩进或缩出
2. 通常根据语言特征使用自动缩进排版:在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format。使用gg=G可对整篇代码进行排版。

发表在 vim | 留下评论

什么是DDD

第一章:什么是领域驱动设计

抛出观点:
1、领域驱动设计是一种解决大型复杂软件系统的一种设计思想、注重的是复杂问题域的构建和维护

2、强调代码模型要与业务理解的分析模型相结合,这样随着时间变化导致效用减弱,变成bbom

分析模型:描述一个软件应用程序的逻辑设计和结构,可以是示意图,也可以是uml建模语言,是一种软件的表现形式

3、缺乏组织结构,bbom就是为了快速实现功能,但是没有围绕问题域设计,导致后续的功能性扩展很难,让变更变得不可控

4、bbom模式随着时间推移,开发人员,老板都很痛苦,代码库的商业价值降低,越来越难以维护

5、设计缺乏对问题域的关注,问题域是你当前正在构建的软件的主题领域。DDD强调要专注领域高于一切的需要,问题域的专家要和开发团队一起工作,防止跑偏

如何管理复杂性

战略模式(用于提炼问题域并塑造应用程序架构)
1、DDD强调将精力和天赋专注于核心子域上的需要,核心子域是保留其最大价值和令其成功的关键
2、创建模型(满足业务用例的抽象体)
3、使用公共语言建模,主要目的是将软件模型和概念分析模型连接,从而可以让领域专家和开发团队进行协作
4、使用有界上下文防止各个功能代码模块相互污染,(有界上下文可以理解为小区的墙,整个小区可以理解为一个功能模块,小区与外部是通过小区的门进行通信的)
DDD的战术模式(或者叫构造块模式,帮助创建复杂有界上下文的有效模型的模式集合)
问题空间和解空间
问题空间可以将问题域提炼成更多可管理的子域
解空间是可以影响应用程序架构发展并让其更易于管理的模式

DDD的实践和原则

1、专注于核心子域 因为核心子域是产品成功与否的关键
2、要学会协作式学习 DDD强调开发团队与业务专家之间协作以生产出解决问题的有用模型
3、DDD老大说过,一个良好的设计都需要至少三个较差的设计,意思是不能止步于第一个有用的模型
4、通信的意思是利用通用语言,将代码模型与业务模型连接在一起,这对于业务和开发团队的协作是至关重要的
5、理解模型适用性,这里主要是说构建的模型能在上下文中被理解,并使用UL描述,这里有个问题,就是UL在不同的部分会有不同理解,通过定义上下文的语言边界来区分,类似于命名空间
6、再次强调复杂系统要围绕问题域进行开发协作

领域驱设计的常见误区

1、战术模式并不是关键,DDD强调开发前对产品的分析和协作
2、DDD并不是一套框架,在架构上具有不可知性
2、如果一个项目很少或没有领域逻辑,那么就没有必要应用DDD思想

发表在 DDD | 留下评论

Charles抓包工具

http://www.jianshu.com/p/5539599c7a25

发表在 小工具 | 留下评论

压力测试

参考资料:http://www.awaimai.com/628.html

发表在 nginx | 留下评论

ModSecurity安装

需求、现状:
1、公司用的是阿里云的机器
2、nginx是采用yum安装
3、需要给nginx添加mod_security模块

以下为简易安装步骤:

安装

#modsecurity安装
cd /home/haowenzhi/source
wget -O modsecurity-2.9.1.tar.gz https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
tar -zxvf modsecurity-2.9.1.tar.gz
cd modsecurity-2.9.1
chmod a+x ./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make

#nginx编译二进制nginx文件
cd ../
wget http://nginx.org/download/nginx-1.10.1.tar.gz
cd nginx-1.10.1

因为之前是nginx是yum安装的
nginx -V可以查看安装configure参数,这只是开发环境的,线上环境还是需要变化的

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --add-module=/home/haowenzhi/source/modsecurity-2.9.1/nginx/modsecurity

#千万不要make install 这样会直接覆盖现有的nginx二进制,为防止意外,需要备份原有的bin
make

下载规则库
cd /home/haowenzhi/source/
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
cp -R owasp-modsecurity-crs /etc/nginx/
mv owasp-modsecurity-crs/crs-setup.conf.example owasp-modsecurity-crs/crs-setup.conf


编写配置文件

vim /etc/nginx/modsecurity.conf
#开启规则
SecRuleEngine On
SecAuditLogFileMode 0550
SecAuditLogDirMode 0777
SecAuditLogStorageDir /var/log/nginx/modsecurity
#新增规则
Include owasp-modsecurity-crs/crs-setup.conf
Include owasp-modsecurity-crs/rules/*.conf

vim /etc/nginx/vhosts/haowenzhi_phpfpm 
location / {
	root			   /home/haowenzhi/tengyue/webroot;
	rewrite ^(.*)?$	/_mvc_entry_point.php$1 break;
	fastcgi_pass	   127.0.0.1:9016;
	fastcgi_index	  index.php;

	fastcgi_param	  TENGYUE_BASE_PATH "/home/haowenzhi/tengyue";
	fastcgi_param	  TENGYUE_ENV development;
	fastcgi_param	  TENGYUE_ENV_TAG haowenzhi;

	fastcgi_param	  SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include			fastcgi_params;

	ModSecurity 配置
	ModSecurityEnabled on;
	ModSecurityConfig /etc/nginx/modsecurity.conf;
}

cp /home/haowenzhi/source/modsecurity-2.9.1/modsecurity.conf-recommended /etc/nginx/modsecurity.conf
cp /home/haowenzhi/source/modsecurity-2.9.1/unicode.mapping /etc/nginx/

service nginx stop

cp /usr/sbin/nginx /usr/sbin/nginx_old

cp objs/nginx /usr/sbin/nginx

service nginx restart
发表在 nginx | 留下评论