Code Monkey home page Code Monkey logo

blog's People

Stargazers

 avatar

Watchers

 avatar

blog's Issues

Ubuntu增加开机自启动

sudo vim /etc/rc.local 
python /home/junxia/XXXX/XXX/src/manage.py runserver 0.0.0.0:9000 > /dev/null &
cat /etc/rc.local 

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

sudo service gitlab restart
sudo python /home/junxia/XXXX/XXX/src/manage.py runserver 0.0.0.0:9000

exit 0

phantomjs与selenium安装

安装phantomjs

sudo apt-get install phantomjs

查看phantomjs版本

moma@moma-ThinkPad-X200:~$ phantomjs -v
1.9.0

安装selenium

 pip install selenium

测试selenium

moma@moma-ThinkPad-X200:~$ python

>>> from selenium import webdriver
>>> browser = webdriver.Chrome()

出错信息

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/moma/.local/lib/python2.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 62, in __init__
    self.service.start()
  File "/home/moma/.local/lib/python2.7/site-packages/selenium/webdriver/common/service.py", line 81, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

报错原因

以上错误说明没有安装chromedriver
下载驱动前查看本地chrome浏览器的版本

解决问题

在浏览器的地址栏中输入 chrome:version
或:
点击进入设置后,选择“关于”即可查看

下载对应版本的驱动

下载驱动地址

https://sites.google.com/a/chromium.org/chromedriver/downloads

下载将解压后的chromedrive放入/usr/bin/ 目录下

测试webdriver

>>> from selenium import webdriver
>>> browser = webdriver.Chrome()
>>> browser.get('http://www.baidu.com/')打开百度

测试selenium

selefrom selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.amazon.com/gp/goldbox")
selehelp( driver )
driver.page_source.find(" from and sold by Am")
driver.page_source[242560:242700]

ElasticSearch索引操作命令

1. 检查集群是否健康(确保9200端口号可用)

curl 'localhost:9200/_cat/health?v'

2. 获取集群节点列表

curl 'localhost:9200/_cat/nodes?v'

3. 列出所有索引

curl 'localhost:9200/_cat/indices?v'

4. 创建索引

#创建一个名为“customer”的索引
curl -XPUT 'localhost:9200/customer?pretty'
#查看所有索引
curl 'localhost:9200/_cat/indices?v'

5. 插入和获取(必须给ES指定索引的类型)

# "external" type, ID:1
#主体为JSON格式的语句: { "name": "John Doe" }
curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '{"name": "John Doe"}'
#获取customer索引下类型为external,id为1的数据,pretty参数表示返回结果格式美观。
curl -XGET 'localhost:9200/customer/external/1?pretty'

6.删除索引

根据wsdl文件生成客户端代码

项目路径下使用如下命令

wsimport -keep -p com.junxia.test.credilink.service.ws -s /Users/junxiawang/br_item/test/test-credilink/src/main/java http://consulta.confirmeonline.com.br/Integracao/Consulta?wsdl

说明

//指定生成文件包名
-p 参数后的 com.junxia.test.credilink.service.ws

//指定生成路径  参数:-d 或 -s(不生成.class文件)
-s 参数后的 /Users/junxiawang/br_item/test/test-credilink/src/main/java

//wsdl 文件访问路径
http://consulta.confirmeonline.com.br/Integracao/Consulta?wsdl

Apache common包的使用


title: Apache common包的使用

StringUtils 工具类

大部分对字符串的常用操作都有实现,不用担心空指针

判断字符串是否为空

StringUtils.isEmpty(null); //true
StringUtils.isEmpty(""); //true

判断字符串是否为空串

 * StringUtils.isBlank(null)      = true
 * StringUtils.isBlank("")        = true
 * StringUtils.isBlank(" ")       = true
 * StringUtils.isBlank("bob")     = false
 * StringUtils.isBlank("  bob  ") = false

判断字符串长度是否大于0

* StringUtils.hasLength(null) = false 
* StringUtils.hasLength("") = false 
* StringUtils.hasLength(" ") = true 
* StringUtils.hasLength("Hello") = true 

字符串截取

* StringUtils.substring(null, *)   = null 
* StringUtils.substring("", *)     = "" 
* StringUtils.substring("abc", 0)  = "abc" 
* StringUtils.substring("abc", 2)  = "c" 
* StringUtils.substring("abc", 4)  = "" 
* StringUtils.substring("abc", -2) = "bc" 
* StringUtils.substring("abc", -4) = "abc" 

两个字符串比较时忽略大小写

 * StringUtils.equalsIgnoreCase(null, null)   = true 
 * StringUtils.equalsIgnoreCase(null, "abc")  = false 
 * StringUtils.equalsIgnoreCase("abc", null)  = false 
 * StringUtils.equalsIgnoreCase("abc", "abc") = true 
 * StringUtils.equalsIgnoreCase("abc", "ABC") = true 

字符串比较

 * StringUtils.equals(null, null)   = true 
 * StringUtils.equals(null, "abc")  = false 
 * StringUtils.equals("abc", null)  = false 
 * StringUtils.equals("abc", "abc") = true 
 * StringUtils.equals("abc", "ABC") = false 

字符串首字母大写

 * StringUtils.capitalize(null)  = null 
 * StringUtils.capitalize("")    = "" 
 * StringUtils.capitalize("cat") = "Cat" 
 * StringUtils.capitalize("cAt") = "CAt" 

字母全部转为大写

StringUtils.upperCase("abc") = "ABC"

字母全部转为小写

StringUtils.lowerCase("ABC")  = "abc"

两个参数的 join 方法

 * StringUtils.join(null, *)               = null 
 * StringUtils.join([], *)                 = "" 
 * StringUtils.join([null], *)             = "" 
 * StringUtils.join(["a", "b", "c"], ';')  = "a;b;c" 
 * StringUtils.join(["a", "b", "c"], null) = "abc" 
 * StringUtils.join([null, "", "a"], ';')  = ";;a" 

NumberUtils 工具类

字符串转各种数值型,转换失败则返回defaultValue

NumberUtils.toInt(null) = 0
NumberUtils.toInt("") = 0
NumberUtils.toInt("123") = 123
toInt、toLong、toFloat、toDouble ......

查看系统时区,时间戳与时间转换

同一时间戳,不同时区显示时间不同

本机

本机mac 时区

localhost:.ssh junxiawang$ date
2018年 4月12日 星期四 11时52分49秒 CST

北京当前时间

localhost:.ssh junxiawang$ date +"%Y-%m-%d %H:%M:%S"
2018-04-12 11:52:49

当前时间戳

localhost:.ssh junxiawang$ date +%s
1523505170

mac端解析服务器端时间戳

date -r 1523505185
2018年 4月12日 星期四 11时53分05秒 CST
localhost:.ssh junxiawang$ date -r 1523505185 +"%Y-%m-%d %H:%M:%S"
2018-04-12 11:53:05

服务器

该时间戳UTC时间

ubuntu@jav-emp001br-p001:~$ date -d @1523505170
Thu Apr 12 03:52:50 UTC 2018
ubuntu@jav-emp001br-p001:~$ date -d @1523505170 +"%Y-%m-%d %H:%M:%S"
2018-04-12 03:52:50

服务器时区时间

ubuntu@jav-emp001br-p001:~$ date
Thu Apr 12 03:53:04 UTC 2018
ubuntu@jav-emp001br-p001:~$ date +"%Y-%m-%d %H:%M:%S"
2018-04-12 03:53:04

时间转时间戳命令

ubuntu@jav-emp001br-p001:~$ date -d '2018-04-12 03:53:04' +%s
1523505184

服务器当前时间戳

ubuntu@jav-emp001br-p001:~$ date +%s
1523505185

显示时区命令

ubuntu@jav-emp001br-p001:~$ date +"%Z %z"
UTC +0000
ubuntu@jav-emp001br-p001:~$ timedatectl | grep "Time zone"
       Time zone: Etc/UTC (UTC, +0000)
ubuntu@jav-emp001br-p001:~$ cat /etc/timezone
Etc/UTC

用到的命令

date #系统当前时间
date +"%Y-%m-%d %H:%M:%S" #指定格式显示系统当前时间
date +%s #显示当前时间戳
date -d @1523505170 #时间戳转时间
date -d @1523505170 +"%Y-%m-%d %H:%M:%S" #时间戳转时间,指定显示格式
date -d '2018-04-12 03:53:04' +%s #时间转时间戳
# 显示时区命令
date +"%Z %z"
cat /etc/timezone
timedatectl | grep "Time zone

Linux 系统使用时注意事项

Linux 严格区分大小写

中所有内容以文件形式保存,包括硬件

硬盘文件是 /dev/sd[a-p]

光盘文件是 /dev/sro 等

Linux 不靠扩展名区分文件类型

压缩包 *.gz *.bz2 *.tar.bz2 *.tgz

配置文件 *.conf

二进制软件包 .rpm

Linux 所有的存储设备都必须挂载之后用户才能使用,包括硬盘、U盘和光盘

##服务器管理和维护建议

Linux 各目录的作用

/bin

存放系统命令的目录,普通用户和超级用户都可以执行. 不过放在/bin下的命令在单用户模式下也可以执行 .

/sbin

保存和系统环境设置相关的命令,只有超级用户可以使用这些命令进行系统环境设置,但是有些命令可以允许普通用户查看.

/usr/bin

存放系统命令的目录,普通用户和超级用户都可以执行.这些命令和系统无关,在单用户模式下不能执行.

/usr/sbin

存放根文件系统不必要的系统管理命令,例如多数服务程序.只有超级用户可以使用.

/boot/:  系统启动目录,保存系统启动相关文件.如内核文件和启动引导程序.

/dev

设备文件保存位置.

/etc

配置文件保存位置.系统内所有采用默认安装(rpm安装)的服务的配置文件全部都保存在这个目录当中.如用户的账号和密码,服务的启动脚本.常用服务的配置文件等.
/etc/group : 组用户信息;
/etc/passwd : 包含所有的用户信息,如密码,登录shell等;
/etc/fstab : 配置系统有哪些文件系统;
/etc/inittab : 配置init在不同运行级别下分别如何启动系统;
/etc/hosts : 域名解析的配置信息;
/etc/inetd.conf : 进程控制信息;
/etc/printcap:配置如何与打印机通信;
/etc/XF86Config:包含XFree86的初始配置;

/home

普通用户的家目录.建立每个用户时,每个用户要有一个默认的登录位置,这个位置就是这个用户的家目录.所有普通用户的家目录就是在/home下建立一个和用户名相同的目录.

/lib

系统调用的函数库保存位置

/lost+found

当系统意外崩溃或意外关机,而产生一些文件碎片放在这里.当系统启动的过程中fsck工具会检查这里,并修复已损坏的文件系统.这个目录只在每个分区中出现,例如/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是/boot分区的备份恢复目录.

/media

挂载目录,系统建议是用来挂载媒体设备的,例如软盘和光盘.

/mnt

挂载目录,早期linux中只有这一个挂载目录,并没有细分,现在这个目录系统建议挂载额外设备,例如U盘,移动硬盘和其他操作系统的分区

/misc/

挂载目录. 系统建议用来挂载NFS服务的共享目录.

/opt

第三方安装的软件保存位置. 这个目录就是放置和安装其他软件的位置

/proc

虚拟文件系统,该目录中的数据并不保存到硬盘当中,而是保存到内存当中. 主要保存系统的内核,进程.外部设备状态和网络状态灯.如/proc/cpuinfo 是保存cpu信息的,/proc/devices是保存设备驱动的列表的,/proc/filesystems是保存文件系统列表的, /proc/net是保存网络协议信息的

/sys

虚拟文件系统,和/proc目录相似,都是保存在内存当中的,主要是保存于内核相关信息的.

/root

超级用户的家目录.普通用户家目录在"/home"下,超级用户家目录直接在 / 下.

/srv

服务数据目录.一些系统服务启动之后,可以在这个目录中保存所需要的数据

/tmp

临时目录.系统存在临时文件的目录. 该目录下所有用户都可以访问和写入,建议此目录中不能存放重要数据,最好每次开机都可以把该目录清空

/usr

系统软件资源目录."unix softwre resource"的缩写,存在系统软件资源的目录.系统中安装的软件大多数保存在这里.

/var

动态数据保存位置.主要保存缓存,日志已经软件运行所产生的文件

服务器注意事项

远程服务器不允许关机,只能重启

重启时应该关闭服务

不要在服务器访问高峰,运行高负载命令

远程配置防火墙时不要把自己踢出服务器

指定合理的密码规范并定期更新合理分配权限

定期备份重要数据和日志

ArrayList和LinkedList的区别

相同点:都实现了List接口
不同点:

区别 优势 查找时间复杂度 占用内存 底层实现
ArrayList 随机访问速度快 O(1) 数组
LinkedList 插入、删除速度快 O(n) 链表

JsonUnflattener将一维json串转为实体类对象

maven 依赖

	<dependency>
		<groupId>com.github.wnameless</groupId>
		<artifactId>json-flattener</artifactId>
		<version>0.4.1</version>
	</dependency>

JsonUnflattener.unflatten

JSONObject jsonObject = JSONObject.fromObject(elementService.getMap());
//logger.info(jsonObject.toString());
String unflattenJson = JsonUnflattener.unflatten(jsonObject.toString());
//logger.info(unflattenJson);

转换前字符串

{"registro.status":"1","registro.nome":"SUELI","registro.sobrenome":"BERNARDO BRITO","registro.telefone":"1100128500","registro.endereco":"RUA SIVI","registro.numero":"20","registro.complemento":"CS FR","registro.bairro":"CIDADE INDUSTRIAL SATELITE DE SAO PAULO","registro.cep":"07222190","registro.cidade":"GUARULHOS","registro.uf":"SP","registro.cpfcnpj":"12345678900","registro.mae":"TERESINHA","registro.sobrenomemae":"DE FATIMA BERNARDO","registro.nasc":"1995-08-05","registro.protocolo":"320978777"}

转换后字符串

{"registro":{"status":"1","nome":"SUELI","sobrenome":"BERNARDO BRITO","telefone":"1100128500","endereco":"RUA SIVI","numero":"20","complemento":"CS FR","bairro":"CIDADE INDUSTRIAL SATELITE DE SAO PAULO","cep":"00222100","cidade":"GUARULHOS","uf":"SP","cpfcnpj":"12345678900","mae":"TERESINHA","sobrenomemae":"DE FATIMA BERNARDO","nasc":"1995-08-05","protocolo":"320978116"}}

希尔排序

public class ShellSort {
    /**
     * 希尔排序
     * 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组记录中的下标相差d,
     * 对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
     * 当增量减到1时,进行直接插入排序后,排序完成
     */
    public static void main(String[] args) {
        int a[] = {49, 38, 68, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5};
        double d1 = a.length;
        int temp = 0;
        while (true) {
            d1 = Math.ceil(d1 / 2);
            int d = (int) d1;
            for (int x = 0; x < d; x++) {
                for (int i = x + d; i < a.length; i += d) {
                    int j = i - d;
                    temp = a[i];
                    for (; j >= 0 && temp < a[j]; j -= d) {
                        a[j + d] = a[j];
                    }
                    a[j + d] = temp;
                }
            }
            if (d == 1) {
                break;
            }
        }
        System.out.println(Arrays.toString(a));//[5, 12, 13, 27, 34, 38, 49, 49, 64, 68, 76, 78, 97]
    }
}

Arraylist动态扩容详解

https://www.cnblogs.com/kuoAT/p/6771653.html

ArrayList 概述

ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。
ArrayList不是线程安全的,只能用在单线程环境下。
实现了Serializable接口,因此它支持序列化,能够通过序列化传输;
实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;
实现了Cloneable接口,能被克隆。
综上所述,ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10 (如下图一);之后扩容会按照1.5倍增长。也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15(如下图二);当添加第16个数据时,继续扩容变为15 * 1.5 =22个(如下图四)。:

  向数组中添加第一个元素时,数组容量为10.

  向数组中添加到第10个元素时,数组容量仍为10.

  向数组中添加到第11个元素时,数组容量扩为15.

  向数组中添加到第16个元素时,数组容量扩为22.

每次扩容都是通过Arrays.copyOf(elementData, newCapacity) 这样的方式实现的。

  对比和总结:
  本文介绍了 ArrayList动态扩容的全过程。如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时,才真正分配容量。每次按照1.5倍(位运算)的比率通过copeOf的方式扩容。 在JKD1.6中实现是,如果通过无参构造的话,初始数组容量为10,每次通过copeOf的方式扩容后容量为原来的1.5倍,以上就是动态扩容的原理。

参考资料:http://blog.csdn.net/u010176014/article/details/52073339

https://www.cnblogs.com/kuoAT/p/6771653.html

SpringBoot中MongoDB注解

maven 依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

class 实体类

@Document(collection="credilink_wsEcompradorOnLine")
public class WsEcompradorOnLine {

    @Id
    private String id;
    @Indexed(unique = true)
    private String cpf;            
    private Registro registro;
    @Field("message")
    private String msg;            //未查到记录时会有此值
    private Date date;             //数据存库时间
    @Transient
    private String xml;            //接口返回xml结果
}

注解

@document

指定映射到 mongodb 中的集合(表)名

@id

主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。如果自己不设置@id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。

@indexed

声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。
唯一索引的话是@indexed(unique = true)。
也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。

@field

给映射存储到 mongodb 的字段取别名

@transient

被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。

git 命令ssh连接不成功Host key verification failed

junxiawangdeMacBook-Pro:wecash-credito-back junxiawang$ git pull
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for git.wecash.net has changed,
and the key for the corresponding IP address 192.168.1.1
is unknown. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:9+r77PJNlak9qKm0RZVM/thpIaKmkz0VBqDv2uoGDl0.
Please contact your system administrator.
Add correct host key in /Users/junxiawang/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/junxiawang/.ssh/known_hosts:8
RSA host key for git.wecash.net has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
//删除known_hosts文件
rm /Users/junxiawang/.ssh/known_hosts

Gson使用

gson 成员变量

private Gson gson = new GsonBuilder()
            .registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong()))
            .registerTypeAdapter(Date.class, (JsonSerializer<Date>) (date, type, jsonSerializationContext) -> new JsonPrimitive(date.getTime()))
            .create();

json串转实体类对象

//jsonStr 为json字符串
Pessoais pessoais = gson.fromJson(jsonStr, Pessoais.class);

Gson maven 依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>

spring boot 中加入prometheus

全局接口监控

增加依赖

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.1.0</version>
</dependency>

启动类上增加注解

@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector

增加配置

management.security.enabled=false

启动项目,访问 localhost:9010/prometheus 路径即可查看到所有接口访问状态及访问次数

直接插入排序

import java.util.Arrays;

public class InsertSort {
    /**
     * 要在排序的一组数中,假设前面(n-1)[n>=2]个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这几个数也是排好顺序的。如此循环,直到全部排好顺序
     */
    public static void main(String[] args) {

        method1();
        method2();
    }
    public static void method2(){
        int a[] = {49, 38, 68, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5};
        for(int i=1;i<a.length;i++){
            int j= i-1;
            int temp = a[i];
            for(;j>=0 && temp<a[j];j--){
                a[j+1] = a [j];
            }
            a[j+1]=temp;
        }
        System.out.println(Arrays.toString(a));
    }
    public static void method1(){
        int a[] = {49, 38, 68, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5};
        for (int i = 1; i < a.length; i++) {
            int temp = a[i];
            for (int j = 0; j < i; j++) {
                if (temp < a[j]) {
                    temp = a[j];
                    a[j] = a[i];
                    a[i] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
}

JsonValueProcessor方法自定义对象转json规则

//json to java bean
Pessoais pessoais = gson.fromJson(responseEntity.getBody().toString(), Pessoais.class);
//自定义类对象转json规则 
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerDefaultValueProcessor(String.class, new DefaultDefaultValueProcessor() {
    public Object getDefaultValue(Class type) {
        return null;//自定义字符串默认为null
    }
});
//pessoais to json object 字符类型对象默认设置为null
net.sf.json.JSONObject obj = net.sf.json.JSONObject.fromObject(pessoais,jsonConfig);

maven 依赖

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

org.dom4j.DocumentException: no protocol

错误信息

org.dom4j.DocumentException: no protocol
String result = linkCredito();//返回的是xml文件内容,encoding='iso-8859-1'
Document doc = saxReader.read(new ByteArrayInputStream(result.getBytes())); //错误代码
Document doc = saxReader.read(new ByteArrayInputStream(result.getBytes("UTF-8")));//改后代码,正常运行

Docker常用命令

Check versions of Docker Engine, Compose, and Machine

docker version
docker-compose
docker-machine

第一次运行nginx

docker run -d -p 80:80 --name webserver nginx
#In a web browser, go to http://localhost/ to bring up the home page.
#可以看到正在运行服务的信息,启动时间、端口号、服务名等信息
docker ps
# A stopped container will not show up with docker ps; for that, you need to run docker ps -a.
docker ps -a

Stop the webserver

docker stop webserver

Start it again

docker start webserver

To stop and remove the running container with a single command

docker rm -f webserver

List local images

docker images

To remove an image you no longer need

docker rmi nginx  #删除nginx图片

spring boot 接口返回值乱码解决方法

解决spring boot 乱码问题

//在方法上加
produces = "application/json;charset=utf-8"
@RequestMapping("/notice/call", produces = "application/json;charset=utf-8")

//在方法上加上注解
@ResponseBody

《瓦尔登湖》经典语录

◎ 人类之所以想要一个家,想要一个温暖的地方,或者舒适的地方,首先是为了获得身体的温暖,然后才是情感的温暖。

◎ "It is not enough to be industrious, so are the ants. What are you industrious for? 光勤劳是不够的,蚂蚁也是勤劳的。要看你为什么而勤劳。

◎ 城市是一个几百万人一起孤独地生活的地方。

◎ 有时间充实自己的精神生活,这才是真正的休闲。

◎ 人的灵魂所必需的东西,是不需要用钱来买的。

◎ 多余的财富只能购买多余的东西,人的灵魂必需的东西,是不需要花钱买的。

◎ 摒弃我们的偏见,从来不算为时太晚。任何一种思考方式或者行为方式,不管它有多么古老,如无确证都是不可信的。

◎ 当你实现你的梦想的时候,关键并不是你得到什么,而是在追求的过程的你变成了什么样的人。

◎ 文明人就是一种更有经验和更聪明的野蛮人。

◎ 我相信,有那么一天:我们会成为更好地自己,会成为父母的依靠,成为值得爱的人!

◎ 知道自己知道什么,也知道自己不知道什么,这就是真正的知识。

◎ 执着追求并从中得到快乐的人,才是成功者。

◎ 切记,一种机会只能出现一次。

lombok使用

maven 依赖

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

实体类中免写getter setter 方法

@Getter @Setter
public class Proposta {
    private String id;
    private Long userId;
    private String pessoaisId;
}

安装ZooKeeper

下载地址:

http://www.apache.org/dyn/closer.cgi/zookeeper

解压文件

tar zxvf zookeeper-3.4.8.tar.gz  

启动ZooKeeper Server

./bin/zkServer.sh start
# 或者 非后台运行ZooKeeper Server进程
bin/zkServer.sh start-foreground
#出现如下信息,说明启动成功
ZooKeeper JMX enabled by default
Using config: /Users/junxiawang/zookepper/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

验证Zookeeper 是否启动成功

telnet 127.0.0.1 2181

停止服务

/bin/zkServer.sh stop

ZooKeeper命令行

#建立ZooKeeper Client端到ZooKeeper集群的连接会话。
bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183  

自定义IdWorker类,生成id

IdWorker 类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class IdWorker {

    private static Logger logger = LoggerFactory.getLogger(IdWorker.class);

    private final long workerId;
    private final static long twepoch = 1361753741828L;
    private long sequence = 0L;
    private final static long workerIdBits = 4L;
    public final static long maxWorkerId = -1L ^ -1L << workerIdBits;
    private final static long sequenceBits = 10L;


    private final static long workerIdShift = sequenceBits;
    private final static long timestampLeftShift = sequenceBits + workerIdBits;
    public final static long sequenceMask = -1L ^ -1L << sequenceBits;


    private long lastTimestamp = -1L;

    public IdWorker() {
        workerId = 1;
        logger.info("workerId: {}", workerId);
    }


    public IdWorker(long workerId) {
        logger.info("workerId: {}", workerId);

        this.workerId = workerId;

        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format(
                    "worker Id can't be greater than %d or less than 0",
                    maxWorkerId));
        }
    }


    public synchronized long nextId() {
        long timestamp = this.timeGen();
        if (this.lastTimestamp == timestamp) {
            this.sequence = (this.sequence + 1) & sequenceMask;
            if (this.sequence == 0) {
                System.out.println("###########" + sequenceMask);
                timestamp = this.tilNextMillis(this.lastTimestamp);
            }
        } else {
            this.sequence = 0;
        }
        if (timestamp < this.lastTimestamp) {
            try {
                throw new Exception(
                        String.format(
                                "Clock moved backwards.  Refusing to generate id for %d milliseconds",
                                this.lastTimestamp - timestamp));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        this.lastTimestamp = timestamp;
        return ((timestamp - twepoch << timestampLeftShift))
                | (this.workerId << workerIdShift) | (this.sequence);
    }


    private long tilNextMillis(final long lastTimestamp) {
        long timestamp = this.timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = this.timeGen();
        }
        return timestamp;
    }


    private long timeGen() {
        return System.currentTimeMillis();
    }


}

spring-boot 启动类中增加 idWorker Bean

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	@Bean
	public IdWorker idWorker() {
		return new IdWorker(1);
	}
}

生成id

@Resource
private IdWorker idWorker;

id = idWorker.nextId();

Linux 系统定时任务

crond 服务管理与访问控制

service crond restart

chkconfig crond on

###查看是滞启用等信息

chkconfig --list | grep crond

查看此进程 ps aux | grep crond

用户的crontab 设置

crontab [选项]

####选项

-e 编辑crontab定时任务
-l 查询crontab任务
-r 删除当前用户的crontab任务
分钟 小时 天 月 星期


分钟:0-59
小时:0-23
天: 1-31
月: 1-12
星期:0-7 (0和7都代表星期日)

45 22 * * * 每天22点45分执行
10 * * * * 每小时的第10分钟执行

mongodb 常用操作命令

查询操作

查询所有记录

-- 查看pessoais表中所有记录,格式化显示
db.pessoais.find().pretty()

查询记录条数

db.pessoais.find().count()

指定显示的字段

-- 结果集显示id, name 字段,不显示amount字段
db.book.find( {}, {id:1, name:1, amount:0}).pretty()

排序

-- 查询结果按amount字段降序显示
db.book.find().sort({"amount":-1}).pretty()

分组

过滤 分组 排序

-- $match 过滤
-- $gte 大于等于
-- $lte 小于等于
-- $group 分组
-- $sum 累加和
-- $sort 排序
db.actionLog.aggregate({
    $match: {
    "createDate":{$gte:ISODate("2017-11-20T00:00:00.203Z"),$lte:ISODate("2017-11-24T06:00:00.203Z")}
    }
},
{
    $group:{_id:"$realIp",count:{$sum:1}}
},
{
    $sort: {"count": -1}
    
}).pretty()

null

# 查找telefone字段为null 该字段不存的 的记录条数
mongos> db.pessoais.find({"pessoaisBasicas.telefone":null}).count();
97734
# 
mongos> db.pessoais.find({"pessoaisBasicas.telefone":{$in:[null]}}).count();
97734

db.foo.find({name:{$in:[null],$exists:true}})

not null

db.pessoais.find({"pessoaisBasicas.telefone":{$ne:null}}).count();

启动mongo服务

启动mongodb服务端

# 可以按照默认的配置文件启动:
mongod --config /usr/local/etc/mongod.conf
#
nohup mongod --config /usr/local/etc/mongod.conf > /dev/null &

登录数据库

-- 连接本地数据库服务器
mongo
-- 使用用户名和密码连接登陆到指定数据库
mongo 127.0.0.1:27017/test -ujunxia -p'123456'
db.createUser({user:'junxia',pwd:'123456',roles:['userAdminAnyDatabase']})

数据库操作

创建或切换到 test 库

use test

查看当前数据库

db

查看所有数据库

show dbs

删除当前数据库

db.dropDatabase()

集合/表操作

创建集合操作

-- 指定当前库为test
use test 
-- 创建book集合
db.createCollection("book")

带有几个关键参数的 createCollection() 的用法

-- 创建固定集合 book1,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("book1", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )

自动创建集合

-- 插入文档/数据时,自动创建集合
> db.book2.insert({"name" : "junxia"})
> show collections
book2

查看已有集合/表

show collections
--
show tables

删除集合

db.book2.drop() -- 删除book2集合

xml转json

public static String xmlToJson(String xml){
        //创建 XMLSerializer对象
        XMLSerializer xmlSerializer = new XMLSerializer();
        //将xml转为json(注:如果是元素的属性,会在json里的key前加一个@标识)
        String result = xmlSerializer.read(xml).toString();
        return result;
}

maven 依赖

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>
<dependency>
    <groupId>xom</groupId>
    <artifactId>xom</artifactId>
    <version>1.2.5</version>
</dependency>
<dependency>
    <groupId>xom</groupId>
    <artifactId>xom</artifactId>
    <version>1.2.5</version>
    <classifier>sources</classifier>
</dependency>

mysql表中有多个timestamp类型字段

一个表中有多个timestamp类型

查看本机mysql版本

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.18    |
+-----------+
1 row in set (0.00 sec)

创建表测试表

mysql> create table test_time(
    -> time1 timestamp,
    -> time2 timestamp,
    -> time3 timestamp,
    -> id int
    -> );
ERROR 1067 (42000): Invalid default value for 'time2'

建表失败!

查看系统参数

mysql> show global variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+

错误原因分析

explicit_defaults_for_timestamp 值为off 说明timestamp 在不明确说明的情况下默认 NOT NULL

也就是说我们要给第二个以后的timestamp字段一个默认值(表中第一个timestamp字段,在不明确指定的情况下系统会给一个CURRENT_TIMESTAMP)

验证以上说法

mysql> create table test_time( time1 timestamp, time2 timestamp default '0000-00-00 00:00:00', time3 timestamp, id int );
ERROR 1067 (42000): Invalid default value for 'time3'

给time3同样的默认值,之后开始进行语法检查

mysql> create table test_time( time1 timestamp, time2 timestamp default '0000-00-00 00:00:00', time3 timestamp default '0000-00-00 00:00:00', id int );
ERROR 1067 (42000): Invalid default value for 'time2'

以上错误信息说明,'0000-00-00 00:00:00' 语法没有通过

查看sql_mode

mysql> show variables like 'sql_mode';  
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

去掉 NO_ZERO_IN_DATE, NO_ZERO_DATE,重新设置

mysql> set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'  ;
Query OK, 0 rows affected, 1 warning (0.01 sec)

建表成功!

mysql> create table test_time( time1 timestamp, time2 timestamp default '0000-00-00 00:00:00', time3 timestamp default '0000-00-00 00:00:00', id int );
Query OK, 0 rows affected (0.02 sec)

修改语法检查后,不指定字段默认值,也可以建表成功!

mysql> create table test_time( time1 timestamp, time2 timestamp , time3 timestamp, id int );
Query OK, 0 rows affected (0.01 sec)

查看表结构

mysql> show create table test_time\G;
*************************** 1. row ***************************
       Table: test_time
Create Table: CREATE TABLE `test_time` (
  `time1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `time2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `time3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

指定NULL为默认值,查看表结构

mysql> create table test_time( time1 timestamp null, time2 timestamp null , time3 timestamp, id int );
Query OK, 0 rows affected (0.01 sec)

mysql> show create table test_time\G;
*************************** 1. row ***************************
       Table: test_time
Create Table: CREATE TABLE `test_time` (
  `time1` timestamp NULL DEFAULT NULL,
  `time2` timestamp NULL DEFAULT NULL,
  `time3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

说明

NO_ZERO_IN_DATE:

在严格模式下,不允许日期和月份为零


NO_ZERO_DATE:

设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

八大排序算法

内部排序

插入排序

直接插入排序
希尔排序(最小增量排序)

交换排序

冒泡排序
快速排序(平均速度最快)

选择排序

直接选择排序
堆排序(所需辅助空间最少)

归并排序(所需辅助空间最多)

分配排序(基数排序)

不稳定:快速排序、希尔排序、堆排序

spring boot 测试controller时出错,Could not load TestContextBootstrapper [null]. Specify @BootstrapWith's

java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @BootstrapWith's 'value' attribute or make the default bootstrapper class available.

	at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:145)
	at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:124)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:142)
	at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
	at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NoSuchMethodError: org.springframework.util.Assert.state(ZLjava/util/function/Supplier;)V
	at org.springframework.test.context.BootstrapUtils.resolveExplicitTestContextBootstrapper(BootstrapUtils.java:157)
	at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:128)
	... 18 more

改前:版本为5.0.7

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>RELEASE</version>
        </dependency>

改后:版本为4.3.14

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>

Nginx 5种负载均衡策略(复制)

nginx的upstream目前支持的5种方式的分配

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}

2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

3、IP绑定 ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}

5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

Kafka常用命令

create topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

list all topic

bin/kafka-topics.sh --list --zookeeper localhost:2181

在终端输入一些消息,然后就会发送到server

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

Start a consumer

#kafka也可以通过命令行方式的consumer从集群获取一些消息并输出到标准输出
bin/kafka-console-consumer.sh --zookeeper 172.25.15.92:2181 --from-beginning --topic test

DateUtil

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

/**
 *
 */
public class DateUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);

    public static final String yyyy_MM_dd = "yyyy-MM-dd";

    public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";

    public static final String yyyy_MM_dd_plus_HH_mm_ss = "yyyy/MM/dd+HH:mm:ss";

    public static final String yyyy_MM_dd_blank_HH_mm_ss = "yyyy/MM/dd HH:mm:ss";


    /**
     * 1天的毫秒数
     */
    public static final Long MILLISECOND_ONE_DAY = 1000 * 60 * 60 * 24L;

    /**
     * 1小时的毫秒数
     */
    public static final Long MILLISECOND_ONE_HOUR = 1000 * 60 * 60L;

    /**
     * 1分钟的毫秒数
     */
    public static final Long MILLISECOND_ONE_MINUTE = 1000 * 60L;

    /**
     * 用指定的格式解析日期
     */
    public static Date parse(String date, String format) {
        DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern(format);
        return dateTimeFormat.parseDateTime(date).toDate();
    }

    /**
     *yyyy-MM-dd HH:mm:ss
     */
    public static Date parseAll(String date) {
        DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern(yyyy_MM_dd_HH_mm_ss);
        return dateTimeFormat.parseDateTime(date).toDate();
    }

    /**
     * yyyy-MM-dd
     */
    public static Date parseYYMMDD(String date) {
        DateTimeFormatter dateTimeFormat = DateTimeFormat.forPattern(yyyy_MM_dd);
        return dateTimeFormat.parseDateTime(date).toDate();
    }

    /**
     * 用指定的格式转成日期字符串
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return "";
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(format);
    }

    public static String formatYYYY_MM_DD(Date date) {
        if (date == null) {
            return "";
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(yyyy_MM_dd);
    }
    public static String formatAll(Date date) {
        if (date == null) {
            return "";
        }
        DateTime dateTime = new DateTime(date);
        return dateTime.toString(yyyy_MM_dd_HH_mm_ss);
    }


    /**
     * 转仅保留指定格式的日期。如取当前时间的 yyyy_MM_dd 日期:
     */
    public static Date formatDate(Date date, String format) {
        return parse(format(date, format), format);
    }

    /**
     * 按年增加日期
     */
    public static Date addDateByYear(Date date, int year) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusYears(year).toDate();
    }

    /**
     * 按月增加日期
     */
    public static Date addDateByMonth(Date date, int month) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMonths(month).toDate();
    }

    /**
     * 按天数增加日期
     */
    public static Date addDateByDay(Date date, int days) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusDays(days).toDate();
    }


    /**
     * 按月份增加日期
     */
    public static Date addDateByMonths(Date date, int months) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMonths(months).toDate();
    }

    /**
     * 按小时增加日期
     */
    public static Date addDateByHour(Date date, int hours) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusHours(hours).toDate();
    }

    /**
     * 取得两个日期间的天数
     */
    public static int getDaysOfTwoDate(Date startDate, Date endDate) {
        // 时间格式统一
        DateTime startDateTime = new DateTime(startDate);
        DateTime endDateTime = new DateTime(endDate);
        startDateTime = startDateTime.withTime(0, 0, 0, 0);
        endDateTime = endDateTime.withTime(0, 0, 0, 0);
        return Math.abs(Days.daysBetween(startDateTime, endDateTime).getDays());
    }

    /**
     * 获取年的第一天
     */
    public static Date getFirstDayOfYear(Date date) {
        DateTime dateTime = new DateTime(date);
        return dateTime.dayOfYear().withMinimumValue().toDate();
    }

    /**
     * 获取年的最后一天
     */
    public static Date getLastDayOfYear(Date date) {
        DateTime dateTime = new DateTime(date);
        return dateTime.dayOfYear().withMaximumValue().toDate();
    }

    /**
     * 获取月的第一天
     */
    public static Date getFirstDayOfMonth(Date date) {
        DateTime dateTime = new DateTime(date);
        return dateTime.dayOfMonth().withMinimumValue().toDate();
    }

    /**
     * 获取月的最后一天
     */
    public static Date getLastDayOfMonth(Date date) {
        DateTime dateTime = new DateTime(date);
        return dateTime.dayOfMonth().withMaximumValue().toDate();
    }

    /**
     * 获取当天0点
     */
    public static Date getToday0() {
        return DateTime.now().withTime(0, 0, 0, 0).toDate();
    }

    /**
     * 获取当天24点
     */
    public static Date getToday24() {
        return DateTime.now().withTime(23, 59, 59, 999).toDate();
    }

    /*
     * 获取昨天0点
     */
    public static Date getYesterDay0() {
        return addDateByDay(getToday0(), -1);
    }

    /**
     * 设置时分
     */
    public static Date resetTime(Date date, int hour, int minutes,int second) {
        DateTime dateTime = new DateTime(date.getTime());
        dateTime = dateTime.withTime(hour, minutes, second, 0);
        return dateTime.toDate();
    }

}

maven 依赖

<dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.0</version>
</dependency>

MySQL 四种事务隔离级别

read uncommitted (读取未提交)

在事务没有commit之前,仍然可读到其他事务未提交的数据
产生的问题:脏读

read committed (读取提交数据)

可读取其他事务commit之后数据
产生的问题:不可重复读(在同一个事务中,读取两次的结果可能不同)

repeatable read (可重读)

MySQL 默认隔离级别
保证同一事务中查询结果保持一致,不管其他事务有没有提交
产生的问题:幻读

serializable (可读,不可写)

当设置此隔离级别,其他事务对该表的写操作将被挂起(写数据必须等待另一个事务结束)
产生的问题:影响性能

测试实例可参照如下文章

五分钟搞清楚MySQL事务隔离级别

阻塞队列与非阻塞队列

阻塞队列

当队列为空时,从队列中获取元素的操作将会被阻塞;当队列满时,往队列里添加元素的操作会被阻塞。

阻塞队列和生产者-消费者模式

阻塞队列(Blocking queue)提供了可阻塞的put和take方法,它们与可定时的offer和poll是等价的。如果Queue已经满了,put方法会被阻塞直到有空间可用;如果Queue是空的,那么take方法会被阻塞,直到有元素可用。Queue的长度可以有限,也可以无限;无限的Queue永远不会充满,所以它的put方法永远不会阻塞。
阻塞队列支持生产者-消费者设计模式。一个生产者-消费者设计分离了“生产产品”和“消费产品”。该模式不会发现一个工作便立即处理,而是把工作置于一个任务(“to do”)清单中,以备后期处理。生产者-消费者模式简化了开发,因为它解除了生产者和消费者之间相互依赖的代码。生产者和消费者以不同的或者变化的速度生产和消费数据,生产者-消费者模式将这些活动解耦,因而简化了工作负荷的管理。

虽然生产者-消费者模式可以把生产者和消费者的代码相互解耦合,但是它们的行为还是间接地通过共享队列耦合在一起了

类库中包含一些BlockingQueue的实现,其中LinkedBlockingQueue和ArrayBlockingQueue是FIFO队列,与 LinkedList和ArrayList相似,但是却拥有比同步List更好的并发性能。PriorityBlockingQueue是一个按优先级顺序排序的队列,当你不希望按照FIFO的属性处理元素时,这个PriorityBolckingQueue是非常有用的。正如其他排序的容器一样,PriorityBlockingQueue可以比较元素本身的自然顺序(如果它们实现了Comparable),也可以使用一个 Comparator进行排序。

BlockingQueue的实现是SynchronousQueue,它根本上不是一个真正的队列,因为它不会为队列元素维护任何存储空间。不过,它维护一个排队的线程清单,这些线程等待把元素加入(enqueue)队列或者移出(dequeue)队列。因为SynchronousQueue没有存储能力,所以除非另一个线程已经准备好参与移交工作,否则put和take会一直阻止。SynchronousQueue这类队列只有在消费者充足的时候比较合适,它们总能为下一个任务作好准备。

find命令

命令所在路径/bin/find

描述:

find命令用来在目录结构中查找文件所在位置,并执行相应的操作。

语法:

find 搜索路径 搜索选项 执行动作

参数说明:

搜索路径:指明从哪里开始查找,find会递归地搜索其包含的所有子目录;

搜索选项:指明查找内容;

执行动作:指明一量找到所要的文件如何处理。


常用的搜索选项:

  • 按文件名
-name 按照文件名查找,支持通配符 "*" 和 "?"
-iname 按照文件名查找,文件名不区分大小写

eg:

# 搜索/etc 下文件名为init的文件
find /etc -name init  
  • 按文件属性(通过ls可以看到的文件属性)
-amin 访问时间 access
-cmin 文件属性 change
-mmin 文件内容 modify

eg.

# 在/etc下查找 5分钟内被修改文件属性的文件和目录
find /etc -cmin -5
  • 按文件类型
-type filetype
filetype可以是:f(普通文件) d(目录文件) l(软链接文件) b(块设备文件) p(管道文件) c(字符设备文件)
  • 按文件大小(单位为数据块)
#查找文件长度为n块的文件
# +n(大于) -n(小于) n(等于)
-size n

eg.

//查找根目录下大于100MB的文件
find / -size +204800 

/**
1数据块 = 512字节 = 0.5K
1K = 2数据块
100MB = 102400KB = 204800数据块
*/
  • 根据i节点
-inum 

eg.

find . -inum 31531
// 删除当前目录下i节点为31531的文件
find . -inum 31531 -exec rm {} \;

//当使用文件名删除不了文件时,可使用此方法
//可通过i节点的方式查找该文件的硬链接

/**
ls -i 查看文件的i节点
*/
  • 按访问天数
-atime n 查找n天前访问过的文件
-mtime n 查找n天前修改过的文件

//n表示正好第n天
//+n表示n天之前
//-n表示n天之后
-user username 按所有者查找
-group groupname 按文件所属组查找

常用的执行动作:

//对找到的文件执行command命令
-exec command {} \;
//和-exec命令作用相同,但在执行命令前要求确认
-ok command {} \;

eg.

// 在/etc下查找init文件并显示其详细信息
find /etc -name init -exec ls -l {} \;

find /etc -name init* -a -type f -exec ls -l {} \;

-a 两个条件同时满足
-o 两个条件满足任意个即可

eg.
//在/etc下查找大于80MB小于100MB的文件
find /etc -size +163840 -a -size -204800

安装Elasticsearch5.4.3 及head插件

安装Elasticsearch

在elasticsearch官网下载页面(https://www.elastic.co/downloads/elasticsearch) 上找到最新版本,当前的最新版本为elasticsearch-5.4.3.

下载安装启动

下载:curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.3.zip
解压:unzip elasticsearch-5.4.3.zip
进入到解压的目录: cd  elasticsearch-5.4.3
启动 es:./bin/elasticsearch
后台运行需要加-d参数

验证

浏览器中访问http://localhost:9200/,看到一个json结果集,表明安装成功

{
    name: "gh6xx2-",
    cluster_name: "elasticsearch",
    cluster_uuid: "5XDs0HsxSWaXzAEBVJ-Inw",
    version: {
        number: "5.4.3",
        build_hash: "eed30a8",
        build_date: "2017-06-22T00:34:03.743Z",
        build_snapshot: false,
        lucene_version: "6.5.1"
    },
    tagline: "You Know, for Search"
}

head插件

elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由HTML5编写的独立网页程序,你可以通过插件把它集成到es

安装head
(https://github.com/mobz/elasticsearch-head/blob/master/README.textile)

修改elasticsearch.yml文件,解决head连接elasticsearch跨域问题

vim config/elasticsearch.yml
增加如下字段

http.cors.enabled: true

http.cors.allow-origin: "*"

git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

open http://localhost:9100/
重启ES,浏览器中访问http://localhost:9100,验证是否成功

macOS 10.12.6 下安装scrapy

安装前的准备工作

若你的Mac OS系统为10.11或更高版本:

重新启动Mac OS
重启时按住Command+R,进入Recovery模式
打开命令行终端输入: csrutil disable
重新启动,回到Mac OS

安装Scrapy

sudo -H pip install Scrapy

查看scrapy版本

scrapy version

报错:

Traceback (most recent call last):
  File "/usr/local/bin/scrapy", line 7, in <module>
    from scrapy.cmdline import execute
  File "/Library/Python/2.7/site-packages/scrapy/cmdline.py", line 9, in <module>
    from scrapy.crawler import CrawlerProcess
  File "/Library/Python/2.7/site-packages/scrapy/crawler.py", line 7, in <module>
    from twisted.internet import reactor, defer
  File "/Library/Python/2.7/site-packages/twisted/internet/reactor.py", line 38, in <module>
    from twisted.internet import default
  File "/Library/Python/2.7/site-packages/twisted/internet/default.py", line 56, in <module>
    install = _getInstallFunction(platform)
  File "/Library/Python/2.7/site-packages/twisted/internet/default.py", line 50, in _getInstallFunction
    from twisted.internet.selectreactor import install
  File "/Library/Python/2.7/site-packages/twisted/internet/selectreactor.py", line 18, in <module>
    from twisted.internet import posixbase
  File "/Library/Python/2.7/site-packages/twisted/internet/posixbase.py", line 18, in <module>
    from twisted.internet import error, udp, tcp
  File "/Library/Python/2.7/site-packages/twisted/internet/tcp.py", line 28, in <module>
    from twisted.internet._newtls import (
  File "/Library/Python/2.7/site-packages/twisted/internet/_newtls.py", line 21, in <module>
    from twisted.protocols.tls import TLSMemoryBIOFactory, TLSMemoryBIOProtocol
  File "/Library/Python/2.7/site-packages/twisted/protocols/tls.py", line 63, in <module>
    from twisted.internet._sslverify import _setAcceptableProtocols
  File "/Library/Python/2.7/site-packages/twisted/internet/_sslverify.py", line 38, in <module>
    TLSVersion.TLSv1_1: SSL.OP_NO_TLSv1_1,
AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'

安装指定版本的twisted

#由于twisted版本过高
sudo pip install twisted==13.1.0

再次检查scrapy是否安装成功

scrapy version 
#Scrapy 1.4.0

python 获取当前年份,日,月,小时,分钟,秒

import datetime from datetime

    def someMethod():

       currentSecond= datetime.now().second
       currentMinute = datetime.now().minute
       currentHour = datetime.now().hour

       currentDay = datetime.now().day
       currentMonth = datetime.now().month
       currentYear = datetime.now().year
datetime.now().microsecond

权限管理命令 chmod

chmod

change the permissions mode of a file

命令所在路径

/bin/chmod

执行权限

所有用户

权限数字表示

r —— 4
w—— 2
x —— 1
rwx —— 7
rw- —— 6
r-- —— 4
功能
改变文件或目录权限
语法
chmod [{ugoa} {+-=} {rwx}][文件或目录] [mode=421][文件或目录] -R 递归修改
chmod u+x abc.txt
chmod g+w, o-r abc.txt
chmod g=rwx abc.txt

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.