三款开发辅助神器(转)

好的工具不但提升我们的开发效率,也为工作带来乐趣。这三款工具你绝对值得拥有。

五一假期过完了,大家都去哪些地方浪了?上班第一天是不是倍感无趣?哈哈,不要紧,今天我来给大家推荐几个神器,让你明天神清气爽,这可是程序员开发必备之良品呀。


Api 与 Postman 的不离不弃

自从有了前后端的分离概念,我就一致在寻找着这样一款工具,我需要把我的接口如何使用告诉前端人员,我需要自己方便的测试api有没有问题,我需要能够自动化完整的测试一下我的接口运行流程有没有问题。当然它还是不能替代代码级别的自动化测试。

期间试过 swagger ,说实话也不错,界面也很漂亮,这是以前写过关于 swagger ui 的一篇文章,感兴趣的可以看看。当我找到 Postman 之后,就果断放弃了 swagger ,为什么呢?

swagger 我是通过注解的方式来自动生成文档,所以就导致代码里边又很多文档注释,本来代码只需要10行,结果为了注释,整个文件变成了30行,看代码的时候给人一种很不清爽的感觉;
团队作战的时候,改动很频繁,因为文档内置在代码里边,更容易出现冲突的问题;注解的格式需要额外的学习成本。

反观 Postman 是一个独立的应用,提供团队协作(需要购买);通过google帐号登陆,在任何地方登陆后可以获取到同步的数据;支持所有的http请求方法;能够自动化测试api接口;配合 Postman Interceptor chrome 浏览器插件,方便 phpstrome 进行debug。

image

  • 大家注意看截图,postman 的 collections 功能,方便不同模块的分类;
  • 其中标记为1圈红的地方,可以添加api的详细说明,比如干什么的,字段含义;
  • 标记2的地方,保存了各种情况的返回结果,可以不需要网络就查看各种情况的返回数据;
  • 标记3的地方,可以配置各种环境变量,方便切换。

我这里配置了常用的:dev:开发环境,test:测试环境,prod:线上环境。

postman如果团队开发需要购买,才能方便的同步看到更新的信息。价格还挺贵,我们小公司没钱,我用了一个偷懒的办法:share link 方法。

同类的工具还有 atom,不过没怎么用过,大家可以比较下。

charles 在我眼前没有秘密

程序员喜欢把自己的东西加密加密再加密,而面对别人的东西,总喜欢能够看的一清二楚,然后从中学习一些经验。

比如通过观察别人的app请求流程,可以看一下返回什么样的数据?一些基本的参数有哪些?有些接口如何组织请求流程等。

要完成上面的任务, charles 真的是不二之选。

image

截图我是监控到的某电商的请求数据,左边部分显示的是请求接口,右边是响应的结果。

我就通过这款工具学习过如何对api进行版本维护,如何有效组织首页数据的返回(到底是一个接口搞定所有还是多个接口,前端多次调用?)

当然上面仅仅是它的一个作用。另外一个效果就是,自己的应用出了问题,可以方便的通过它看到请求的数据,以此来进行一些判断,修复bug。特别是强烈推荐测试人员使用,有很多bug是有前后的因果关系,需要看到数据开发人员更容易进行修正。

如果想要查看 https 请求的数据,需要安装ssl证书到设备上,大家到官网看一下就知道。

图片压缩,我用 tinypng

今天推荐的最后一个工具tinypng。我之前再博客也推荐过 google 新的图片压缩算法 guetzli,这个算法真的非常牛逼。但是目前没有好用的客户端,只有命令行。

关于它没有太多的说的,就是压缩图片嘛。支持批量,压缩比率高,效果强。就是好用,把它分享给你的ui妹子,她会对你喜笑颜开。

下载地址:https://github.com/kyleduo/TinyPNG4Mac

额外赠品

最后推荐一个集成第三方支付的开源项目:https://github.com/helei112g/payment

目前已经集成:支付宝支付、微信支付、招商一网通支付。如果你在开发中被各个第三方支付提供的demo搞得焦头烂额,我相信它能够帮助到你。


本文写作时间:3小时(这效率……我也是醉了!)

我是:何磊,主要分享技术、生活。公众号:icanfo。个人博客:https://helei112g.github.io/

image

tomcat由于 “{}”报 url 400异常的问题(转)

Tomcat控制台报错,错误信息如下:

信息: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:235)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2549)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2538)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)

经过分析,发现问题是由URL中一个参数params引起的,

这个参数通过JSON2.stringify()转换为一个对象数组,所以包含了{},而恰恰就是这一步在Tomcat 7.0.81版本中出现 了问题,请求链接都是400的状态,就是请求参数有误。

这个问题是由于Tomcat的新版本中增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

既然分析出了原因,那么就要找解决方案了,其实,解决办法很简单,就是使用encodeURIComponent或encodeURI对包含{}的URL进行编码,这样就可以解决该问题。当然,还有一种办法就是更换Tomcat为支持大括号{}的版本。

mysql重连,连接丢失:The last packet successfully received from the server–转载

1.1 错误信息:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 20,820,001 milliseconds ago.  The last packet sent successfully to the server was 20,820,002 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
		at sun.reflect.GeneratedConstructorAccessor29.newInstance(Unknown Source) ~[na:na]
		at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.7.0_51]
		at java.lang.reflect.Constructor.newInstance(Constructor.java:526) ~[na:1.7.0_51]
		at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3988) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5372) ~[mysql-connector-java-5.1.29.jar:na]
		at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881) ~[c3p0-0.9.1.1.jar:0.9.1.1]
		at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98) ~[quartz-2.2.1.jar:na]

1.2 解决方法

– 如果使用的是JDBC,在JDBC URL上添加?autoReconnect=true,如:

jdbc:mysql://10.10.10.10:3306/mydb?autoReconnect=true

– 如果是在Spring中使用DBCP连接池,在定义datasource增加属性validationQuerytestOnBorrow,如:

<bean id="vrsRankDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${countNew.jdbc.url}" />
    <property name="username" value="${countNew.jdbc.user}" />
    <property name="password" value="${countNew.jdbc.pwd}" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true"/>
</bean>

– 如果是在Spring中使用c3p0连接池,则在定义datasource的时候,添加属性testConnectionOnCheckintestConnectionOnCheckout,如:

<bean name="cacheCloudDB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${cache.url}"/>
    <property name="user" value="${cache.user}"/>
    <property name="password" value="${cache.password}"/>
    <property name="initialPoolSize" value="10"/>
    <property name="maxPoolSize" value="${cache.maxPoolSize}"/>
    <property name="testConnectionOnCheckin" value="false"/>
    <property name="testConnectionOnCheckout" value="true"/>
    <property name="preferredTestQuery" value="SELECT 1"/>
</bean>

 

继续阅读mysql重连,连接丢失:The last packet successfully received from the server–转载

Windows下MySQL绿色版安装配置与使用

Windows下MySQL绿色版安装配置与使用

 Mysql-5.7.11-winx64操作步骤:

一、安装MySQL数据库

1、下载。

下载地址: http://downloads.mysql.com/archives/get/file/mysql-5.7.11-winx64.zip。

2、解压MySQL压缩包

解压到指定目录,D:\Dev\mysql-5.7.11。

3、添加环境变量

在Path中添加  D:\Dev\mysql-5.7.11\bin

4、修改配置文件

将my-default.ini名称改为:my.ini,文件里面的参数配置:
[mysqld]
# 设置mysql的安装目录
basedir=D:\Dev\mysql-5.7.11
# 设置mysql数据库的数据的存放目录,必须是data
datadir=D:\Dev\mysql-5.7.11\data
注意:路径是反斜线,也可以改为两个正斜线,还可以加上双引号
# mysql端口
port=3306
# 字符集
character_set_server=utf8 (我下载这个版本没有找到此项)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

5、安装MySQL服务

cmd进入到mysql的bin目录(D:\Dev\mysql-5.7.11\bin)

如果安装目录下存在“Data”目录,务必先删除data目录(或移动到其他地方)。

执行mysqld –initialize 。

自动:mysqld –install [服务名]
手动:mysqld –install -manual [服务名]
然后执行mysqld -install MySQL –defaults-file=”D:\Dev\mysql-5.7.11\my.ini”,当显示Service successfully installed时,即表示mysql服务安装成功。
注意:务必要把”-defaults”改为”–defaults”,mysqld指令没有-d选项,而MYSQL在解析参数时,只要碰到xxxx-dxxxx就会把-D当成选项去处理。
mysql默认查找c:\my.ini和c:\windows\my.ini,安装目录下的my.ini或my.cnf。

6、mysql服务启动与停止

方法一,在doc命令下进入到mysql的bin目录(D:\Dev\mysql-5.7.11\bin),
输入”net start mysql”启动mysql,
输入”net stop mysql”停止mysql服务。

方法二,打开管理工具 服务,找到MySQL服务。

通过右键选择启动或者直接点击左边的启动来启动服务。

二、卸载MySQL服务

在doc命令下进入到D:\Dev\mysql-5.7.11\bin>输入”mysqld -remove”或者”sc delete mysql”执行卸载服务。

三、root密码修改与登录

1、登录

本地登录mysql数据库在doc命令窗口里面,输入命令:mysql -u root -p
回车后提示输入密码。
注:mysql解压缩版初次安装管理员root的密码为空,直接再回车一次就登入mysql数据库。

如果出现ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)错误,编辑mysql配置文件my.ini,在[mysqld]这个条目下加入 skip-grant-tables,保存退出后重启mysql。

2、修改root密码      

刚安装完成时root账号默认密码为空,此时可以将密码修改为指定的密码。如:123456

方法一:

c:>mysql -u root -p

mysql>show databases;

mysql>use mysql;

mysql>UPDATE user SET password=PASSWORD(“123456”) WHERE user=’root’;

mysql>FLUSH PRIVILEGES; 【注意一定不要遗忘这句话,否则密码更改不能生效,刷新MySQL的系统权限相关表,第二种方法,就是重新启动mysql服务器】

mysql>QUIT

改好之后,再修改一下my.ini这个文件,把刚才加入的”skip-grant-tables”这行删除,保存退出,再重启mysql。

方法二:

利用第三方管理工具进行密码修改。如Navicat for MySQL

四、mysql 常用命令

create database name; 创建数据库

use databasename; 选择数据库

drop database name 直接删除数据库,不提醒

show tables; 显示表

describe tablename; 表的详细描述

select 中加上distinct去除重复字段

mysqladmin drop databasename 删除数据库前,有提示。

显示当前mysql版本和当前日期

select version(),current_date;

从文件中读取

mysql -h myhost -u root -p database < sql.txt 

五、mysql 中的SQL语句

1 . 数据库创建 : Create database db_name;
数据库删除 : Drop database db_name; 删除时可先判断是否存在,写成 : drop database if exits db_name

2 . 建表 : 创建数据表的语法 : create table table_name (字段1 数据类型 , 字段2 数据类型);
例 : create table mytable (id int , username char(20));
删表 : drop table table_name; 例 : drop table mytable;

3 . 添加数据 : Insert into 表名 [(字段1 , 字段2 , ….)] values (值1 , 值2 , …..);
如果向表中的每个字段都插入一个值,那么前面 [ ] 括号内字段名可写也可不写
例 : insert into mytable (id,username) values (1,’zhangsan’);

4 . 查询 : 查询所有数据 : select * from table_name;
查询指定字段的数据 : select 字段1 , 字段2 from table_name;
例 : select id,username from mytable where id=1 order by desc;多表查询语句————参照第17条实例

5 . 更新指定数据 , 更新某一个字段的数据(注意,不是更新字段的名字)
Update table_name set 字段名=’新值’ [, 字段2 =’新值’ , …..][where id=id_num] [order by 字段 顺序]
例 : update mytable set username=’lisi’ where id=1;
Order语句是查询的顺序 , 如 : order by id desc(或asc) , 顺序有两种 : desc倒序(100—1,即从最新数据往后查询),asc(从1-100),Where和order语句也可用于查询select 与删除delete

6 . 删除表中的信息 :
删除整个表中的信息 : delete from table_name;
删除表中指定条件的语句 : delete from table_name where 条件语句 ; 条件语句如 : id=3;

7 . 创建数据库用户
一次可以创建多个数据库用户如:
CREATE USER username1 identified BY ‘password’ , username2 IDENTIFIED BY ‘password’….

8 . 用户的权限控制:grant
库,表级的权限控制 : 将某个库中的某个表的控制权赋予某个用户
Grant all ON db_name.table_name TO user_name [ indentified by ‘password’ ];

9 . 表结构的修改
(1)增加一个字段格式:
alter table table_name add column (字段名 字段类型); —-此方法带括号
(2)指定字段插入的位置:
alter table table_name add column 字段名 字段类型 after 某字段;
删除一个字段:
alter table table_name drop字段名;
(3)修改字段名称/类型
alter table table_name change 旧字段名 新字段名 新字段的类型;
(4)改表的名字
alter table table_name rename to new_table_name;
(5)一次性清空表中的所有数据
truncate table table_name; 此方法也会使表中的取号器(ID)从1开始

10 . 增加主键,外键,约束,索引。。。。(使用方法见17实例)
① 约束(主键Primary key、唯一性Unique、非空Not Null)
② 自动增张 auto_increment
③外键Foreign key—–与reference table_name(col_name列名)配合使用,建表时单独使用
④ 删除多个表中有关联的数据—-设置foreign key 为set null —具体设置参考帮助文档

11 . 查看数据库当前引擎
SHOW CREATE TABLE table_name;
修改数据库引擎
ALTER TABLE table_name ENGINE=MyISAM | InnoDB;

程序员到45岁以后

“I’m convinced that the only thing that kept me going was that I loved what I did. You’ve got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do.”

—-Steve Jobs

最近看了阮一峰的一篇文章,《45岁以后的人生》,读了后心情有些不能平静。

真的,国内这种软件开发从业环境对于程序员来说真是如同坐台小姐一般,吃的是青春饭,干的是体力活。

他的这篇文章通篇举例全是华为,一方面说明华为对中国IT界的影响确实大,另外一方面,我觉得华为真是为中国IT界树立了一个很坏很坏的榜样。我记得我一个兄弟硕士一毕业就是去的华为,他说他有一年十一放假回家,在家睡了十天。我相信像他这样的华为人还有很多很多。

继续阅读程序员到45岁以后

常用疑难sql

  • 查找表中多余的重复记录重复记录是根据单个字段(peopleId)来判断
select * from people where peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1)
  • 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people where peopleId in (select   peopleId from people group by   peopleId   having count(peopleId) > 1)
and rowid not in (select min(rowid) from  people group by peopleId having count(peopleId)>1)
  • 查找表中多余的重复记录(多个字段) 
select * from vitae a
where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having
count(*) > 1)
  • 递归查询树形结构的SQL

    oracle中的select语句可以用START WITH…CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:

    select * from tablename start with cond1

    connect by cond2

    where cond3;

    简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:

    id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。

    用上述语法的查询可以取得这棵树的所有记录。

    其中COND1是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

    COND2是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID,即本记录的父亲是上一条记录。

    COND3是过滤条件,用于对返回的所有记录进行过滤。

    对于oracle进行简单树查询(递归查询)

    DEPTID           NUMBER                   部门id

    PAREDEPTID   NUMBER                   父部门id(所属部门id)

    NAME              CHAR (40 Byte)        部门名称

    通过子节点向根节点追朔.

    select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid

    通过根节点遍历子节点.

    select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid

    可通过level 关键字查询所在层次.

    select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid

    PS:start with 后面所跟的就是就是递归的种子,也就是递归开始的地方;

    connect by  prior后面的字段顺序是有讲究的;

    若prior缺省:则只能查询到符合条件的起始行,并不进行递归查询;

    例:

    select * from table

    start with org_id = ‘HBHqfWGWPy’

    connect by prior org_id = parent_id;

    简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:

    org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。

    用上述语法的查询可以取得这棵树的所有记录。

    其中:

    条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。

    条件2 是连接条件,其中用PRIOR表示上一条记录,

    比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。

    条件3 是过滤条件,用于对返回的所有记录进行过滤。

    简单介绍如下:

    在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:

    第一步:从根节点开始;

    第二步:访问该节点;

    第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节点,并执行第二步,否则执行第四步;

    第四步:若该节点为根节点,则访问完毕,否则执行第五步;

    第五步:返回到该节点的父节点,并执行第三步骤。

    总之:扫描整个树结构的过程也即是中序遍历树的过程。

    1. 树结构的描述

    树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述, 如 EMP 表中的 EMPNO 和 MGR 。 EMPNO 表示该雇员的编号, MGR 表示领导该雇员的人的编号,即子节点的 MGR 值等于父节点的 EMPNO 值。在表的每一行中都有一个表示父节点的 MGR (除根节点外),通过每个节点的父节点,就可以确定整个树结构。

    在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查询表中的树型结构关系。其命令格式如下:

    SELECT 。。。

    CONNECT BY {PRIOR 列名 1= 列名 2| 列名 1=PRIOR 裂名 2}

    [START WITH] ;

    其中: CONNECT BY 子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。 PRIORY 运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系, PRIOR 运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达 式。 START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。

    START WITH: 不但可以指定一个根节点,还可以指定多个根节点。

    2. 关于 PRIOR

    运算符 PRIOR 被放置于等号前后的位置,决定着查询时的检索顺序。

    PRIOR 被置于 CONNECT BY 子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下 的方式。如:

    CONNECT BY PRIOR EMPNO=MGR

    PIROR 运算符被置于 CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上 的方式。例如:

    CONNECT BY EMPNO=PRIOR MGR

    在这种方式中也应指定一个开始的节点。

    3. 定义查找起始节点

    在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何节点为起始节点,以此开始向下查找。这样查找的结果就是以该节点为开始的结构树的一枝。

    4.使用 LEVEL

    在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为 1 ,根节点的子节点为 2 , 依此类推。

    5.节点和分支的裁剪

    在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用 WHERE 子句来限定树型结构中的单个节点,以去掉树中的单个节点,但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)。

    6.排序显示

    象在其它查询中一样,在树结构查询中也可以使用 ORDER BY 子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。

  • MYSQL 年月统计相关

— 今天
select * from ticket_order_detail where to_days(use_time) = to_days(now());
— 7天
SELECT *FROM ticket_order_detail where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date( use_time)
— 近30天
SELECT *FROM ticket_order_detail where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date( use_time)
— 本月
SELECT *FROM ticket_order_detail WHERE DATE_FORMAT( use_time, ‘%Y%m’ ) = DATE_FORMAT( CURDATE( ) , ‘%Y%m’ )
— 上一月
SELECT *FROM ticket_order_detail WHERE PERIOD_DIFF( date_format( now( ) , ‘%Y%m’ ) , date_format( use_time, ‘%Y%m’ ) ) =1
#查询本季度数据
select * from `ticket_order_detail` where QUARTER(use_time)=QUARTER(now());
#查询上季度数据
select * from `ticket_order_detail` where QUARTER(use_time)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
#查询本年数据
select * from `ticket_order_detail` where YEAR(use_time)=YEAR(NOW());
#查询上年数据
select * from `ticket_order_detail` where year(use_time)=year(date_sub(now(),interval 1 year));
— 查询当前这周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now());
— 查询上周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now())-1;
— 查询当前月份的数据
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(now(),’%Y-%m’)
— 查询距离当前现在6个月的数据
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();
— 查询上个月的数据
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),’%Y-%m’)
select*from`user`whereDATE_FORMAT(pudate,‘%Y%m‘)=DATE_FORMAT(CURDATE(),‘%Y%m‘) ;
select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = WEEKOFYEAR(now())
select*
fromuser
whereMONTH(FROM_UNIXTIME(pudate,‘%y-%m-%d‘))=MONTH(now())
select*
from[user]
whereYEAR(FROM_UNIXTIME(pudate,‘%y-%m-%d‘))=YEAR(now())
andMONTH(FROM_UNIXTIME(pudate,‘%y-%m-%d‘))=MONTH(now())
select*
from[user]
— wherepudatebetween上月最后一天
— and下月第一天
where date(regdate) = curdate();
select * from test where year(regdate)=year(now()) and month(regdate)=month(now()) and day(regdate)=day(now())
SELECT date( c_instime ) ,curdate( )
FROM `t_score`
WHERE 1
LIMIT 0 , 30

搭建 WordPress 个人博客

搭建 WordPress 个人博客(转载自腾讯云)

准备 LNMP 环境

任务时间:30min ~ 60min

LNMP 是 Linux、Nginx、MySQL 和 PHP 的缩写,是 WordPress 博客系统依赖的基础运行环境。我们先来准备 LNMP 环境

安装 Nginx

使用 yum 安装 Nginx:

yum install nginx -y
修改 /etc/nginx/conf.d/default.conf,去除对 IPv6 地址的监听[?],可参考下面的示例:

示例代码:/etc/nginx/conf.d/default.conf

server {
listen 80 default_server;
# listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

}
修改完成后,启动 Nginx:

nginx
此时,可访问实验机器外网 HTTP 服务(http://<您的 CVM IP 地址>)来确认是否已经安装成功。

将 Nginx 设置为开机自动启动:

chkconfig nginx on

CentOS 6 不支持 IPv6,需要取消对 IPv6 地址的监听,否则 Nginx 不能成功启动。

安装 MySQL

使用 yum 安装 MySQL:

yum install mysql-server -y
安装完成后,启动 MySQL 服务:

service mysqld restart
设置 MySQL 账户 root 密码:[?]

/usr/bin/mysqladmin -u root password ‘MyPas$word4Word_Press’
将 MySQL 设置为开机自动启动:

chkconfig mysqld on

下面命令中的密码是教程为您自动生成的,为了方便实验的进行,不建议使用其它密码。如果设置其它密码,请把密码记住,在后续的步骤会使用到。

安装 PHP

使用 yum 安装 PHP:[?]

yum install php-fpm php-mysql -y
安装之后,启动 PHP-FPM 进程:

service php-fpm start
启动之后,可以使用下面的命令查看 PHP-FPM 进程监听哪个端口 [?]

netstat -nlpt | grep php-fpm
把 PHP-FPM 也设置成开机自动启动:

chkconfig php-fpm on

CentOs 6 默认已经安装了 PHP-FPM 及 PHP-MYSQL,下面命令执行的可能会提示已经安装。

 

PHP-FPM 默认监听 9000 端口

安装并配置 WordPress

任务时间:30min ~ 60min

安装 WordPress

配置好 LNMP 环境后,继续使用 yum 来安装 WordPress:

yum install wordpress -y
安装完成后,就可以在 /usr/share/wordpress 看到 WordPress 的源代码了。

配置数据库

进入 MySQL:[?]

mysql -uroot –password=’MyPas$word4Word_Press’
为 WordPress 创建一个数据库:

CREATE DATABASE wordpress;
MySQL 部分设置完了,我们退出 MySQL 环境:

exit
把上述的 DB 配置同步到 WordPress 的配置文件中,可参考下面的配置:

示例代码:/etc/wordpress/wp-config.php

<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don’t have to use the web site, you can
* copy this file to “wp-config.php” and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://codex.wordpress.org/Editing_wp-config.php
*
* @package WordPress
*/

// ** MySQL settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, ‘wordpress’);

/** MySQL database username */
define(‘DB_USER’, ‘root’);

/** MySQL database password */
define(‘DB_PASSWORD’, ‘MyPas$word4Word_Press’);

/** MySQL hostname */
define(‘DB_HOST’, ‘localhost’);

/** Database Charset to use in creating database tables. */
define(‘DB_CHARSET’, ‘utf8’);

/** The Database Collate type. Don’t change this if in doubt. */
define(‘DB_COLLATE’, ”);

/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
define(‘AUTH_KEY’, ‘put your unique phrase here’);
define(‘SECURE_AUTH_KEY’, ‘put your unique phrase here’);
define(‘LOGGED_IN_KEY’, ‘put your unique phrase here’);
define(‘NONCE_KEY’, ‘put your unique phrase here’);
define(‘AUTH_SALT’, ‘put your unique phrase here’);
define(‘SECURE_AUTH_SALT’, ‘put your unique phrase here’);
define(‘LOGGED_IN_SALT’, ‘put your unique phrase here’);
define(‘NONCE_SALT’, ‘put your unique phrase here’);

/**#@-*/

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = ‘wp_’;

/**
* See http://make.wordpress.org/core/2013/10/25/the-definitive-guide-to-disabling-auto-updates-in-wordpress-3-7
*/

/* Disable all file change, as RPM base installation are read-only */
define(‘DISALLOW_FILE_MODS’, true);

/* Disable automatic updater, in case you want to allow
above FILE_MODS for plugins, themes, … */
define(‘AUTOMATIC_UPDATER_DISABLED’, true);

/* Core update is always disabled, WP_AUTO_UPDATE_CORE value is ignore */

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the Codex.
*
* @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define(‘WP_DEBUG’, false);

/* That’s all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined(‘ABSPATH’) )
define(‘ABSPATH’, ‘/usr/share/wordpress’);

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . ‘wp-settings.php’);

如果你上面的步骤没有使用教程创建的密码,请修改下面命令中的密码登录

配置 Nginx

WordPress 已经安装完毕,我们配置 Nginx 把请求转发给 PHP-FPM 来处理

首先,重命名默认的配置文件:[?]

cd /etc/nginx/conf.d/
mv default.conf defaut.conf.bak
在 /etc/nginx/conf.d 创建 wordpress.conf 配置,参考下面的内容:

示例代码:/etc/nginx/conf.d/wordpress.conf

server {
listen 80;
root /usr/share/wordpress;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php index.php;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
配置后,通知 Nginx 进程重新加载:

nginx -s reload

默认的 Server 监听 80 端口,与 WordPress 的服务端口冲突,将其重命名为 .bak 后缀以禁用默认配置

准备域名和解析

任务时间:15min ~ 30min

域名注册

如果您还没有域名,可以在腾讯云上选购,过程可以参考下面的视频。

视频 – 在腾讯云上购买域名
域名解析

域名购买完成后, 需要将域名解析到实验云主机上,实验云主机的 IP 为:

<您的 CVM IP 地址>
在腾讯云购买的域名,可以到控制台添加解析记录,过程可参考下面的视频:

视频 – 如何在腾讯云上解析域名
域名设置解析后需要过一段时间才会生效,通过 ping 命令检查域名是否生效 [?],如:

ping www.yourdomain.com
如果 ping 命令返回的信息中含有你设置的解析的 IP 地址,说明解析成功。

 

注意替换下面命令中的 www.yourmpdomain.com 为您自己的注册的域名

大功告成!

恭喜,您的 WordPress 博客已经部署完成,您可以通过浏览器访问博客查看效果。

通过IP地址查看:

博客访问地址:http://<您的域名>/wp-admin/install.php

通过域名查看:

博客访问地址:http://www.yourdomain.com/wp-admin/install.php,其中替换 www.yourdomain.com 为之前申请的域名。

Linux定时器工具-crontab 各参数详解及如何查看日志记录

要使用crontab定时器工具,必须要启动cron服务:

service cron start

crontab的语法,以备日后救急。先上张超给力的图:

crontab各参数说明:

-e : 执行文字编辑器来编辑crontab,内定的文字编辑器是VI

-r : 删除目前的crontab

-l : 列出目前的crontab(查看专用)

-i : 会和-r 配合使用,在删除当前的crontab时询问,输入y 则删除

注意crontab是分用户的,以谁登录就会编辑到谁的crontab

crontab特殊的符号说明:

“*”代表所有的取值范围内的数字。特别要注意哦!

“/”代表每的意思,如”*/5″表示每5个单位

“-“代表从某个数字到某个数字

“,”分散的数字

crontab文件的使用示例:

30 21 * * * 表示每晚的21:30

45 4 1,10,22 * * 表示每月1、10、22日的4 : 45

10 1 * * 6,0 表示每周六、周日的1 : 10

0,30 18-23 * * * 表示在每天18 : 00至23 : 00之间每隔30分钟

0 23 * * 6 表示每星期六的11 : 00 pm

* */1 * * * 每一小时

* 23-7/1 * * * 晚上11点到早上7点之间,每隔一小时

* 8,13 * * 1-5 从周一到周五的上午8点和下午1点

0 11 4 * mon-wed 每月的4号与每周一到周三的11点

0 4 1 jan * 一月一号的4点

——————————– 如何启动crontab的日志服务 ——————————————————–

发现UBuntu下居然没有自动打开cron的日志服务功能,解决方法如下

cron的日志功能使用syslogd服务,不同版本linux可能装了不同的软件,这里介绍常见的两种:

sysklogd>>>>>>

1. 编辑 /etc/syslog.conf,并且打开以cron.*开始的那行注释。
2. 运行 /etc/init.d/sysklogd restart 。
3. 运行 /etc/init.d/cron restart 。

rsyslog>>>>>>

1. 修改rsyslog文件,将/etc/rsyslog.d/50-default.conf 文件中的#cron.*前的#删掉;
2. 重启rsyslog服务service rsyslog restart
3. 重启cron服务service cron restart

——————————– 如何查看crontab的日志记录 ——————————————————–

昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang在了什么地方。

1. linux
看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

2. unix
在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。

3. mail任务
在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。

CentOS系统下如何设置mysql每天自动备份_Mysql

大家都知道数据是一个比较重要的数据,经常需要备份,每次都手动比较麻烦。通过本文来一起来看看CentOS系统下如何设置mysql每天自动备份吧。

步骤如下

建备份文件夹:

mkdir mysql_data_bak

建脚本文件:

touch autobackupmysql.sh

打开文件

vi autobackupmysql.sh

在脚本中加入如下内容:

filename=`date +%Y%m%d`
/usr/bin/mysqldump -uroot -proot boss >>/home/mysql_data_bak/$filename.sql
/usr/bin/mysqldump为mysqldump所在的命令文件夹,boss为要备份的数据库

检查有没安装crond,如果没有,先安装

yum -y install vixie-cron
yum -y install crontabs

启动服务 :service crond start

在CentOS系统中加入开机自动启动: chkconfig --level 345 crond on

crontab -e

加入内容:00 03 * * * source /root/autobackupmysql.sh

每天凌晨3点运行此文件,对数据库进行备份

 service crond restart

好了,以上就完成了。

source为非root用户,如果为root用户:

vi /etc/crontab

在最下面添加一条:

0 3 * * * root /路径/backup_mydb.sh

意思就是在每天的3点0分执行这个文件;

写好后保存退出crontab。

重启crontab

chmod命令详细用法

指令名称 : chmod
使用权限 : 所有使用者
使用方式 : chmod [-cfvR] [–help] [–version] mode file…
说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。
参数 :
mode : 权限设定字串,格式如下 : [ugoa…][[+-=][rwxX]…][,…],其中
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本
范例 :将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt
将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py
将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *
此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
范例:
chmod a=rwx file

chmod 777 file
效果相同
chmod ug=rwx,o=x file

chmod 771 file
效果相同
若用chmod 4755 filename可使此程序具有root的权限.
指令名称 : chown
使用权限 : root

使用方式 : chmod [-cfhvR] [–help] [–version] user[] file…

说 明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由 系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才 有这样的权限。

把计 :

user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群 体(group)-c : 若该档案拥有者确实已经更改,才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结 (link)进行变更,而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者 变更(即以递回的方式逐个变更)–help : 显示辅助说明–version : 显示版本

范例 :
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt

将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *
-rw——- (600) — 只有属主有读写权限。
-rw-r–r– (644) — 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx—— (700) — 只有属主有读、写、执行权限。
-rwxr-xr-x (755) — 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x–x (711) — 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) — 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) — 所有用户都有读、写、执行权限。更不可取的做法。
以下是对目录的两个普通设定:

drwx—— (700) – 只有属主可在目录中读、写。
drwxr-xr-x (755) – 所有用户可读该目录,但只有属主才能改变目录中的内容。
————————————————————————–
运行 .sh 文件类型的文件:
用file命令测试一下看是什么类型的
file xxxx.sh
如果是Bourne-Again shell script 可以sh xxxx.sh 或者chmod +x xxxx.sh 再./xxx.sh
一般 .sh 的直接添加x(可执行属性) chmod +x xxx.sh 然后./xxx.sh就可以了
chmod是一个改变用户拥有指定文件的权限的命令.r:只读,w:写,x执行.也可以用数字