简客-记忆

抽象的才是永恒的

0%

主要玩法:

1、用户上划屏幕,将飞剑“出鞘”,飞到之前的瞄准准心处
顺时针轮流到当前剑阵某点,将飞剑“出鞘”,飞剑降落到刚才点进行打击点

2、瞄准准心左右移动,飞剑到达准心后,垂直下落。

3、用户控制左右“飞剑轮盘”,将飞剑进行“二次打击”。

4、飞剑出鞘后如果没有进行“二次打击”,将回到主角身边

5、敌方发出攻击,需要“飞剑”进行防御,只有飞剑停留在“防御点”,飞剑还能进行“二次打击”,否则将回到主角身边

cocos知识点

暂无

背景

公司测试服务器上,跑了N多的应用,某天mysql的CPU占用超高,http的请求部分也有超20%以上的。

参考

mysql/mariadb知识点总结(24):慢查询日志
http://www.zsythink.net/archives/1260
关于MySQL 通用查询日志和慢查询日志分析
https://www.jianshu.com/p/ac4f291b806a
mysql中slow query log慢日志查询分析
https://www.cnblogs.com/musings/p/5913186.html

过程

记录全部的log

开启全部的sql记录,先看看全局的

1
2
3
4
5
6
7
8
9
show variables like '%general%';

+------------------+--------------+
| Variable_name | Value |
+------------------+--------------+
| general_log | OFF |
| general_log_file | ecs-248d.log |
+------------------+--------------+
2 rows in set (0.00 sec)

发现没有开,

1
set global general_log=on;

我们打算用文件的形式记录下来

1
2
show variables like '%log_output%';
set global log_output='FILE';

这个时候就可以去查看

1
/var/lib/mysql/ecs-248d.log

(注意:上述命令只对当前生效,当MySQL重启失效,如果要永久生效,需要配置 my.cnf)

记录慢查询log

先查看下

1
show variables like ‘%quer%’;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+-------------------------------+-------------------+
| Variable_name | Value |
+-------------------------------+-------------------+
| expensive_subquery_limit | 100 |
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| log_queries_not_using_indexes | OFF |
| log_slow_queries | ON |
| long_query_time | 10.000000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 262144 |
| query_cache_min_res_unit | 2048 |
| query_cache_size | 1073741824 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | ecs-248d-slow.log |
+-------------------------------+-------------------+
16 rows in set (0.00 sec)

开启慢查询的条件,设置long_query_time为1秒

1
set long_query_time=1;

试一试有没有生效

1
select sleep(2);

/var/lib/mysql/ecs-248d-slow.log查看下有没有

1
2
3
4
5
6
# Time: 190605 17:32:20
# User@Host: root[root] @ localhost []
# Thread_id: 2223 Schema: QC_hit: No
# Query_time: 2.000163 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1559727140;
select sleep(2);

如果太多了,用

1
mysqldumpslow -s t /var/lib/mysql/ecs-248d-slow.log

帮我们统一下

背景

自己写的php代码,执行mysql时,占用了很大的CPU,排查问题修改代码后,发现公司服务器已经没有这个问题,连续请求,mysql的内存不会增加。但是客户的机子上,连续请求还是会出现这个问题。

经排查后,应该是客户服务器上的CPU处理速度跟不上,导致mysql执行效率跟不上,被阻塞住。导致CPU会因为请求数量的累加而上升。而公司服务器因为处理速度快,即使请求速不断累加,其CPU的值也上升很少。

参考

在linux 下怎么查看服务器的cpu和内存的硬件信息
https://zhidao.baidu.com/question/155943069.html
intel xeon(skylake) platinum 8163 性能评测 阿里云第四代ECS服务器
https://yq.aliyun.com/articles/622603

背景

一直想弄一个小游戏出来,但是因为想用框架,在框架的选择上面兜兜转转,用了一遍,cocos是我最早接触的那时,还是叫cocos-js,后来出了个cocos-creator之后就没怎么深入了。2018年下半年又重新去接触微信小游戏,选了白鹭引擎,刚看完文档,有个同事说laya不错,看了一下laya的基础代码,感觉比白鹭简单(入坑)。但随着自己不断的深入已经想了解一些功能的实现时,laya的文档和教程可以几乎没什么帮助。查看github上的项目,也就那么几个。最后又去看白鹭社区,白鹭的开源项目还是很多的,有想重新用回白鹭的冲动,但忍住了。但某天一个简单功能在laya的模拟器跑正常,但到了微信开发工具里却始终无效,看了社区,这个问题据说已经在早几个版本里已经修复(当然不知道mac上面有没有修复),之后彻底对laya失去了希望。
重新看了白鹭和cocos-creator,最后发现cocos-creator的设计模式,很符合我的口味,突然有种为什么之前不先考虑cocos的遗憾。

后来看到了一个“小猫钓鱼”的cocos项目。作者的教程真的写的很详细,果断重新入坑cocos。

参考

CocosCreator微信小游戏入门实战《小猫钓鱼》
https://blog.csdn.net/zzx023/article/details/83063363

背景

给客户的服务器上安装ftp环境

参考链接

Linux下如何进行FTP设置:vsftp
https://www.cnblogs.com/eagling/articles/4848669.html
FTP主动模式和被动模式的区别
https://www.cnblogs.com/dancheblog/p/3799448.html
Linux Vsftpd 连接超时解决方法(被动模式)
https://blog.51cto.com/5468755/1594648

配置过程

vsftpd安装,执行以下命令:

1
yum -y install vsftpd

我们选择了“vsftp配置虚拟用户”
使用vsftpd虚拟用户登录FTP服务器进行常见的操作。
首先安装FTP 虚拟用户需要用到的软件及认证模块

1
2
3
yum  install  pam*  libdb-utils libdb* –skip-broken  –y (Centos7

yum install db4* -y (Centos6

编辑vim /etc/vsftpd/ftpusers.txt

1
2
user001
user001

第一行为FTP虚拟用户,登录用户名,第二行为密码,第三行为用户名,依次类推。

创建并生成vsftpd数据库文件,生成数据库文件命令:

1
2
3
db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db

chmod 700 /etc/vsftpd/vsftpd_login.db

配置PAM验证文件:

在配置文件vi /etc/pam.d/vsftpd 行首加入如下两行认证语句:(如果是32位,lib64需改成lib,如果RedHat,加入的语句不一样,需注意)

1
2
3
auth        sufficient      /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login

account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

创建vsftpd映射本地用户:

所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码,也不需要登录。主要用来做虚拟用户映射使用。

1
useradd -s /sbin/nologin ftpuser

修改vsftpd.conf配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

listen=YES

guest_enable=YES

guest_username=ftpuser

pam_service_name=vsftpd

user_config_dir=/etc/vsftpd/vsftpd_user_conf


保存重启,service vsftpd restart 即可使用虚拟用户登录,这时候所有的虚拟用户共同使用/home/ftpuser目录上传下载,如果想使用自己独立的目录,可以在/etc/vsftpd/vsftpd_user_conf目录创建各自的配置文件,如给admin创建独立的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir -p /etc/vsftpd/vsftpd_user_conf

vim /etc/vsftpd/vsftpd_user_conf/user001,内容如下,建立自己的FTP目录。

local_root=/home/ftpuser/user001

write_enable=YES

anon_world_readable_only=YES

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

以上内容是参照其他博文做的,到这个时候,我以为已经大功告成,结果
结果出现各种
500 Illegal PORT command
227 Entering Passive Mode…

一大堆问题,总之引出了 “主动和被动的问题”

看了半天,主动和被动的关系,决定采用“主动模式”(开始入坑)
当初为什么选主动,因为博文里说了主动,服务器安全些。而且在配置21端口和20端口的时候,移动云的虚拟防火墙把我坑了一把。
可是无论我怎么配,都搞不定。。。登录成功目录出不来

在最后发现了第三篇博文,被动模式(本想直接跳过去的,但看见他报的错误和我一模一样,抱着转被动试试看)

1,vi /etc/vsftpd/vsftpd.conf

1
2
3
4
5
6
7
pasv_enable=YES
pasv_min_port=61001 (注意端口和客户端的保持一致)
pasv_max_port=62000
anon_max_rate=1000000
local_max_rate=2000000
max_clients=10
max_per_ip=100

2、加载内核 ip_conntrack_ftp 和 ip_nat_ftp(终端执行)

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

3.配置 iptables 开放 61001 到 62000 端口

vi /etc/sysconfig/iptables 在*filter下加入下

-A OUTPUT -p tcp –sport 61001:62000 -j ACCEPT
-A INPUT -p tcp –dport 61001:62000 -j ACCEPT

过程遇到的坑

1、坑1—移动运的虚拟
21端口 在安全组里加了 没在虚拟防火墙中配置

2、坑2—主动模式的选择

3、坑3— -A OUTPUT -p tcp –sport 61001:62000 -j ACCEPT 没有配置

背景

库存数据统计

库存的数量动态的,列出产品的同时,将批次表里的同product_id的cur_num相加,作为该产品的库存

以前的做法

先将产品列表取出(一条sql)
foreach 每个产品,并查询总数(当前页数*1条sql)

改进后的做法

先用子查询获取查询的总数,然后一下group,group后的字段作为leftjoin的关联字段

1
2
3
4
5
6
7
8
9
10
11
 $storeProductBatchQuery = M('store_product_batch as spb')->field('SUM(cur_num) as spb_cur_num_count,product_id')->group('product_id')->buildSql(); // group的使用
$list = M("product as p")
->join('left join '.$storeProductBatchQuery.' as spb on spb.product_id = p.id')
->field('p.*,spb.spb_cur_num_count')
->where($newmap)
->order($order)
->limit($offset.','.$page_size)
->select(false);

dump($list);
exit();

背景

安装TensorFlow

安装python3

1
brew install python3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Pip, setuptools, and wheel have been installed. To update them
pip3 install --upgrade pip setuptools wheel

You can install Python packages with
pip3 install <package>

They will install into the site-package directory
/usr/local/lib/python3.6/site-packages

See: https://docs.brew.sh/Homebrew-and-Python.html
==> Summary
🍺 /usr/local/Cellar/python3/3.6.3: 7,973 files, 111.1MB, built in 19 minutes 38 seconds
➜ tensorflow python3 --version
Python 3.6.3

背景

一个wordpress项目里的自带的邮件(代发)发送邮件不稳定。

参考

WordPress 使用阿里云邮件推送实现SMTP发送邮件
https://www.wpdaxue.com/wordpress-aliyun-smtp.html

来自第三方的介绍

6、切换到“发信地址”界面,新建发信地址:
现在很多虚拟主机都是默认不支持 mail() 函数发送邮件的,不过一般都提供 smtp 发件支持。要找一个好用的 smtp 发送邮件方可不容易,不是发件数量限制太小,就是经常被判为垃圾邮件。所以倡萌此前一直在服务器搭建邮件发送功能,并想办法优化提高邮件可行度,避免被判为垃圾邮件,但效果还是不太理想。前些天,想起了阿里云的邮件推送服务,并进行了测试,发现真的不错哦。

步骤

1、要了解和开通阿里云邮件推送服务,请查看:https://www.aliyun.com/product/directmail

2、开通以后,在控制台进入“发信域名”新建域名
阿里云里提示最好用二级域名,但是service@email.jk-kj.com类似的邮箱还是会被某些插件不认可。最后我还是用上了service@jk-kj.com
3、添加域名后,点击配置,可以查看到域名配置信息
4、按照域名配置信息的提示,到你的域名解析后台添加3条解析记录:
5、添加完解析记录,回到阿里云后台,点击“验证”,返回“验证通过”说明解析生效:
6、切换到“发信地址”界面,新建发信地址:
7、选择刚才添加的发信域名,然后输入你要使用的账号,输入回信地址,选择发信类型:批量邮件
注:发信类型有:
触发邮件:注册确认、订单确认、密码重置、交易通知等
批量邮件:自有用户的产品促销、期刊订阅等
但是有些用户反馈,触发邮件方式不太稳定,你可以根据自己的实际选择吧,这里我选择的是批量邮件
8、添加完返回到界面,点击“验证回信地址”,然后会发送邮件到你的回信地址,到你的邮件箱点击邮件的链接验证通过即可,注意哦,验证邮件可能在垃圾箱里。然后设置SMTP 密码。
9、完成上面的步骤后,阿里云的邮件推送的SMTP发送功能就设置好了

背景

之前开发微信时,做过类似的简单统计。那时对于mysql的理解比较浅,有些数据都是预先存入数据去实现的。这时就会出现多个时间,比如create_time create_date。
现在开发开单宝的统计,特意搜索了一下关于统计时mysql处理的文章

参考

MySql按周,按月,按日分组统计数据
https://blog.csdn.net/lqclh502/article/details/50157483
MySQL中distinct和count(*)的使用方法比较
http://www.jb51.net/article/74559.htm

几个关键词

网上的资料

关键词:DATE_FORMAT
对时间进行格式化
例子:

1
2
3
4
5
select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks;

select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days;

select DATE_FORMAT(create_time,'%Y%m') months,count(caseid) count from tc_case group by months;

DATE_FORMAT(date,format)

根据format字符串格式化date值。下列修饰符可以被用在format字符串中:

%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”

动手实战

网上写的是DATE类型的字段的处理,可是我习惯用int类型的时间戳保存时间
需要改进一下

1
2
3
DATE_FORMAT( FROM_UNIXTIME(create_time),'%Y-%m-%d' ) AS  days
DATE_FORMAT( FROM_UNIXTIME(create_time),'%Y-%m' ) AS months
DATE_FORMAT( FROM_UNIXTIME(create_time),'%u' ) AS weeks

接下来只要对 days months weeks进group就OK
thinkphp下的代码

1
2
3
4
5
$list = M("Order")
->field(" DATE_FORMAT( FROM_UNIXTIME(create_time),'%Y-%m-%d' ) AS days, SUM(total_money) total_money_count , COUNT( DISTINCT customer_id ) AS customer_id_count , COUNT( id ) AS order_count")
->where($newmap)
->group(' days ')
->select();

关键词:DISTINCT
在count不重复的记录的时候就能用到它,
上面的代码里就用到了COUNT( DISTINCT customer_id ) AS customer_id_count,有了这个关键词,就不用以前的笨方法了

背景

将pdf转png图片

参考

在wamp server环境下安装php_imagick拓展
http://www.smallerpig.com/673.html
windows php安装ImageMagick扩展
http://blog.csdn.net/livelinux/article/details/50319853
Centos 安装ImageMagick 与 imagick for php步骤详解
https://www.cnblogs.com/xingmeng/p/4268043.html#undefined

本机wamp下安装php_imagick拓展

步骤

1.在php安装目录的ext文件夹下新建imagick文件夹
2.将该文件夹的路径添加到系统路径(path值).
3.从网址http://windows.php.net/downloads/pecl/releases/imagick/下载对应php版本的imagick(phpinfo中看php version,Compiler ,Architecture,这三个属性)
4.这里需要注意的是下载的文件区别,我们从文件名中来区分,例如php_imagick-3.2.0b2-5.5-nts-vc11-x86.zip

其中5.5是对应的php版本.
nts值代表该文件适用于IIS,ts代表该文件适用于Apache,
VC11和VC9是编译器的版本.我们可以适用phpinfo()命令来查看我们机器上php适用的是哪个版本(如图1)
x86代表适用32位系统,x64代表适用64位系统

5.下载好对应的zip文件后,将所有文件解压到我们第一步新建的imagick文件夹!

6.添加php_imagick.dll的完整路径到php.ini文件中.例如:extension=C:\wamp\bin\php\php5.5.12\ext\ext\imagick\php_imagick.dll

7.重启wamp服务器

8.运行phpinfo看看是不是已经成功添加拓展了

9.查看phpinfo中,查看ImageMagick supported formats内的值

输入phpinfo()看到imagick,就算装成功了,但这个时候还不能用,你会看到ImageMagick number of supported formats 为0,ImageMagick supported formats no value,还要安装ImageMagick ,phpinfo里面会写出要安装那个版本的,如:

1
ImageMagick 6.9.3-7 Q16 x64 2016-03-27 http://www.imagemagick.org 

然后去下载这个ImageMagick 6.9.3-7 Q16 x64 版本的安装

记得版本要对得上号,要不然就会出现ImageMagick supported formats no value

安装完后重启,再输入phpinfo,就会看到ImageMagick supported formats不是空的了,这个时候就算安全成功

Centos 安装ImageMagick

1. 依次运行以下命令

1
2
3
4
5
yum install ImageMagick

yum install ImageMagick-devel

yum install php-pear [for PECL]
1
yum -y install php-devel

2. 安装C编译器

1
yum install gcc

如果装不了gcc就用这个命令:

1
yum install gcc gcc-c++ autoconf automake

3. 安装imagick

1
pecl install imagick

4. 加载imagick到php

在/etc/php.ini 加上extension=imagick.so

5. 重启service httpd restart

6. 使用 phpinfo() 或运行 php -m | grep imagick 来查看是否安装成功

mac 上安装

安装php的imagick拓展

1
brew reinstall php56-imagick --build-from-source

安装ghostscript

1
brew install ghostscript

linux上安装

这次被坑惨了,linux是最近新的服务器里面没有安装过GD库,这个导致我后面多个坑

第一次安装走的是
https://www.cnblogs.com/xingmeng/p/4268043.html#undefined
里面的方法,

1
2
3
4
5
6
7
8
9
yum install ImageMagick
yum install ImageMagick-devel
yum install php-pear
yum -y install php-devel
yum install gcc
yum install gcc gcc-c++ autoconf automake
pecl install imagick


加载imagick到php
在/etc/php.ini 加上extension=imagick.so

重启service httpd restart

使用 phpinfo() 或运行 php -m | grep imagick 来查看是否安装成功

这次

1
Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator,(ImagickKernel  不知道为什么没有这个,本机和mac上都有)  

结果提示错误,具体忘记了,估计是因为GD库没有引起的
之后照着
http://blog.csdn.net/snow_small/article/details/79173575
进行了编译安装
1、安装ImageMagic

1
2
3
4
5
6
7
[root@localhost download]# wget http://www.imagemagick.org/download/ImageMagick.tar.gz  

[root@localhost download]# tar -xzvf ImageMagick
[root@localhost download]# cd ImageMagick-7.0.7-22/
[root@localhost ImageMagick-7.0.7-22]# ./configure --prefix=/usr/local/imagemagick
[root@localhost ImageMagick-7.0.7-22]# make
[root@localhost ImageMagick-7.0.7-22]# make install

2、检查是否安装成功

1
2
3
4
5
6
[root@localhost ImageMagick-7.0.7-22]# /usr/local/imagemagick/bin/convert -version  
Version: ImageMagick 7.0.7-22 Q16 x86_64 2018-01-26 http://www.imagemagick.org
Copyright: © 1999-2018 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP
Delegates (built-in): fontconfig freetype jng jpeg png x xml zlib

我的坑

但是报下面这个错误

1
Postscript delegate failed

ghostscript没安装,可实际是安装的在/usr/bin/gs中,但apache死活说找不到(是权限问题),网上有个解决方案是把’/usr/local/bin/gs’做软连接到/usr/bin/gs,可是我这边的情况刚好是倒过来的。

一狠心把ghostscript给卸载了,重新编译安装了gs,这次真出现在了/usr/local/bin/gs,建立了个软连接,真把这个问题解决了。

这次因为没有安装GD库,用的png版本太老,Delegates (built-in): fontconfig freetype jng jpeg (png 没显示) x xml zlib

一直提示
no decode delegate for this image format PNG
因为没有安装GD库,我在编译ImageMagick-7.0.7-22时没有将png编译进行

直到手动添加了png库,才最终发现没有安装GD库

我们在Centos安装ImageMagick教程中讲述了如何安装ImageMagick,安装完毕之后发现程序并不支持png和jpeg格式的图片,但是这两种图片又是我们平时所常见的,所以我们还要进一步地配置,是其支持png和jpeg格式.

首先我们安装所需的库文件.

1
yum install tcl-devel libpng-devel libjpeg-devel ghostscript-devel