取得指定范围的数值

若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。
例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:
SELECT FLOOR(7 + (RAND() * 6));

发表在 基本语法 | 留下评论

存储过程建立临时数据

\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 | 留下评论