Intellij Idea 高效搬砖插件之 codehelper.generator

codehelper.generator

可以在创建一个对象并赋值的时候,快速的生成代码,不需要一个一个属性的向里面set,根据new关键字,自动生成掉用set方法的代码,还可以一键填入默认值。

GenAllSetter 特性

  • 在Java方法中, 根据 new 关键词, 为Java Bean 生成所有Setter方法。
  • 按GenAllSetter键两次, 会为Setter方法生成默认值。
  • 可在Intellij Idea中为GenAllSetter设置快捷键。

Intellij Idea 装逼插件之 grep-console,让你的控制台日志多姿多彩

简介

Grep Console是一款和IDEA Console相关的插件,可以通过expression表达式过滤日志、给不同级别的日志或者给不同pattern的日志加上背景颜色与上层颜色。

安装方法

1、File→Settings→Plugins,输入grep console,本地没搜到,就可以点击Search in repositories(或直接点击Browse repositories进入搜索),搜到Grep Console后选择Install进行安装即可,安装后需重启IDEA。

Intellij Idea 装逼插件之 grep-console,让你的控制台日志多姿多彩

使用方法

1、安装成功后就可以在File→Settings→Other Settings,找到Grep Console选项卡,在Highlighting & Folding中可以配置对应的规则,比如默认就有根据日志输出级别来定义不同的颜色。如下:

Intellij Idea 装逼插件之 grep-console,让你的控制台日志多姿多彩

2、输出效果如下:

Intellij Idea 装逼插件之 grep-console,让你的控制台日志多姿多彩

3、在console面板,右键选择Grep,就可以进入控制台日志过滤的界面,可以根据关键字对输出的日志进行过滤。

Intellij Idea 装逼插件之 grep-console,让你的控制台日志多姿多彩

 

SIP与HTTP的区别联系

人们通常会问 SIP 是否使用 HTTP 作为底层协议。答案是否定的。SIP 是一种与 HTTP 在同一层(即应用层)运作的协议,它使用 TCP、UDP 或 SCTP 作为底层协议。但是,SIP 与 HTTP 有很多相似之处。例如,与 HTTP 类似,SIP 基于文本而且是用户可读的。SIP 使用带有特定方法、响应代码和头部的“请求响应”机制,这一点也与 HTTP 类似。HTTP 和 SIP 的一个显著不同是,SIP 中的“请求响应”机制是异步的——请求不需要在后面紧跟相应的响应。实际上,一个 SIP 请求可能导致生成一个或多个请求。

SIP 是一种对等协议。这意味着用户代理既可以作为服务器,也可以作为客户机。这是 SIP 和 HTTP 的另一个不同之处,在 HTTP 中,客户机始终是客户机,而服务器始终是服务器。

idea StreamTrace debug 调试 java 8 流处理代码

Java的stream编程给调试带来了极大的不便,idea 推出了StreamTrace功能,可以详细看到每一步操作的关系、结果,非常方便进行调试。

初遇StreamTrace

这里简单将字符串转成它的字符数,并设置断点开启debug模式。

如上图所示,可以看到每一步操作的元素个数、操作的结果、元素转换前后的对应关,非常清晰明了;还可以查看具体的对象内容。

使用StreamTrace

StreamTrace只有在debug模式下才能使用,当在Stream代码上设置断点后,启动debug,点击流按钮,如图所示。

点击后,默认Split 模式显示。

可以点击左下方按钮切换到FlatMode模式,当然也可以再切换回去。

实战演示

这里演示一段字符转长度并过滤长度小于5的stream操作

Java 自定义注解结合 Aop 切面和本地缓存实现接口防重复请求提交

自定义注解类

缓存配置类

这边本地缓存用的是google guava cache,缓存有效期是3秒。

切面类

接口

 

mybatis plus 新增插入保存成功后获取自增Id

mybatis plus 新增插入保存成功后获取自增Id,

继承com.baomidou.mybatisplus.extension.service.IService,save()方法

userinfoMapper.insert(userInfo);

不管用什么方法保存,最后,直接userInfo.getId(),就可以获取到自增的主键id了,其实uuid也一样。

MySQL 官方Docker镜像的使用

Docker镜像是用来创建容器的,我们可以基于官方提供的镜像或自已构建的镜像来创建容器。https://hub.docker.com/_/mysql/是Docker及MySQL提供、维护的一个官方镜像,我们可以基于该镜像构建自己的MySQL数据库镜像,也可以直接使用这个镜像创建MySQL数据库容器。下面介绍MySQL 官方Docker镜像的使用。

MySQL 官方Docker镜像的使用
MySQL 官方Docker镜像的使用

1. 启动一个mysql服务器实例

使用mysql镜像创建或启动MySQL容器时,可以先将镜像下载到本地:

也可以直接使用以下命令来启动MySQL实例:

这样,我们就创建了一个名为sww-mysql的MySQL数据库服务器容器实例。在创建数据库时,通过环境变量MYSQL_ROOT_PASSWORD设置数据库的root密码,还通过5.7标签指定了所使用的镜像版本。

容器创建完成后,可以通过docker ps命令看到所创建的MySQL容器实例:

2. 在其它Docker容器应用中连接MySQL

在这个镜像中,导出的是MySQL的标准端口3306。这样我们就可以在需要访问MySQL服务器的容器中,使用--link参数通过容器链接的方式,将MySQL服务器容器实例连接到包含了需要使用MySQL的应用容器中。

使用容器连接的示例如下:

注意:以上示例中的application-that-uses-镜像并不存在,仅为操作演示,下同。

除了进行容器连接的方式在其它容器中访问MySQL服务器容器外,还可以通过以下两种方式访问MySQL数据库服务器容器:

  • 在创建MySQL服务器容器实例时通过-p-P参数将数据库服务器端口映射到宿主机,再直接通过宿主机进行访问。这种方式较为简单,但需要向外暴露数据库端口。
  • 能过Docker网络(Networking)进行连接。这种方式操作较为复杂,但更为灵活,可以适用于更加复杂的网络环境。

3. MySQL命令行客户端连接MySQL

在前面创建的MySQL服务器容器中,我们并没有向外暴露访问端口,我们可以通过以下方式启动命令行客户端,并基于命令行客户端对数据库服务器进行管理。

运行另一个MySQL交互式容器,该容器会在运行后启动mysql命令行客户端:

如果需要通过非Docker的方式,或远程访问MySQL服务器容器,就可以在创建容器时通过-p-P与宿主机进行端口绑定,之后就可以像普通MySQL服务器那样进行访问或操作。

4. 在Shell中访问容器及日志查看

docker exec命令使我们可以在Docker容器内部执行命令,我们可以通过以下方式与mysql容器建立一个shell连接:

而MySQL服务器日志,可以直接通过Docker容器日志访问(实时日志查看可以添加-f参数):

5. 使用自定义MySQL配置文件

默认情况下,MySQL的启动配置文件是/etc/mysql/my.cnf,而/etc/mysql/conf.d目录下的存在任何.cnf格式的文件时,都会使用该文件中配置项替换默认配置。

因此,如果要使用自定义配置,可以在宿主机创建一个配置文件,然后在创建容器时通过-v参数,以数据卷的方式将自定义配置挂载到mysql容器的/etc/mysql/conf.d目录下。

如,在宿主机中存在/my/custom/config-file.cnf配置文件,这时就可以通过以下方式启动MySQL容器:

以上示例会启动一个名为sww-mysql的MySQL服务器容器,该文件启动时会同时使用/etc/mysql/my.cnf/etc/mysql/conf.d/config-file.cnf中的配置。

不使用cnf文件的配置方式

除使用.cnf文件进行配置外,还可以在启动容器通过参数的形式将配置传递给mysqld

如,启动一个MySQL服务器容器,并使用UTF-8(utf8mb4)格式的表编码:

详细配置参数可以通过以下命令查看:

6. 环境变量

当启动mysql容器时,我们可以向docker run命令传入一或多个环境变量来调整MySQL实例的配置。可设置的环境变量有:

  • MYSQL_ROOT_PASSWORD:必须。用于设置MySQLroot用户的密码
  • MYSQL_DATABASE:可选。用于指定镜像启动容器时要创建的数据库。如果提供了用户/密码,则会将该用户做为此数据库的超级用户。
  • MYSQL_USERMYSQL_PASSWORD:可选。用于创建一个新用户并设置密码。
  • MYSQL_ALLOW_EMPTY_PASSWORD:可选。设置为yes时,则可以使用空密码登录
  • MYSQL_RANDOM_ROOT_PASSWORD:可选。设置为yes时会为root用户设置一个随机密码(使用pwgen),所生成的随机密码会被输出到stdout
  • MYSQL_ONETIME_PASSWORD:可选。为root用户指定一个一次性密码,该密码会在用户首次登录时强制修改

7. 关于数据存储

在使用 mysql镜像创建MySQL容器时,数据库数据存储可能会有以下两种方式:

  • 数据卷容器:使用Docker默认的数据管理方式来管理数据库的数据存储,在这种方式下,数据库文件会被写入数据库的内部。这种方式对于用户非常简单,缺点是很在宿主机上找到所存储的数据。
  • 外部数据卷:在宿主机创建一个数据目录,再将数据目录挂载到容器内部。这种方式可以很方便的在宿主机上找到并进行数据管理,但需要确保数据目录的存在。

当使用外部数据卷时,假在宿主机有/my/own/datadir目录,我们可以像下面这样启动mysql容器,并将目录挂载到容器内:

其中,-v /my/own/datadir:/var/lib/mysql是数据卷的挂载,表示将宿主机的/my/own/datadir目录挂载到容器内的/var/lib/mysql目录。这个目录是MySQL的默认数据目录,当使用自定义配置时,应该也做相应的修改。

数据库备份

在非Docker环境下使用的MySQL备份工具,大多数在容器环境下仍然可用,只要其能访问mysqld服务器即可。

下面是一个通过docker exec来对mysql容器中的数据库执行备份的示例:

Redis集群迁移工具redis-migrate-tool使用介绍

Redis集群迁移工具redis-migrate-tool,基于redis复制实现,有快速,稳定的特点。

特点

  • 快速
  • 多线程
  • 基于redis复制
  • 实时迁移
  • 迁移过程中,源集群不影响对外提供服务
  • 异构迁移
  • 支持Twemproxy集群,redis cluster集群,rdb文件 和 aof文件
  • 过滤功能
  • 当目标集群是Twemproxy,数据会跳过Twemproxy直接导入到后端的redis
  • 迁移状态显示
  • 完善的数据抽样校验

redis-migrate-tool迁移工具的数据来源可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件,aof文件。

redis-migrate-tool迁移工具的目标可以是:单独的redis实例,twemproxy集群,redis cluster,rdb文件。

版本说明

https://github.com/vipshop/redis-migrate-tool #仅支持redis3及以下版本

https://github.com/tanruixing88/redis-migrate-tool #基于上述版本修改,支持redis4及以上版本

依赖


安装


配置文件rmt.conf

配置文件示例:从redis cluster集群迁移数据到twemproxy集群


配置文件示例:从redis cluster集群迁移数据到另外一个cluster集群


配置文件示例:从rdb文件恢复数据到redis cluster集群


运行


状态

通过redis-cli连接redis-migrate-tool监控的端口,运行info命令


数据校验


 

Nginx开机自动启动脚本

Nginx开机自动启动脚本

 

Linux shell用法和技巧

检查远程端口是否对bash开放:

让进程转入后台:


将进程转到前台:


产生随机的十六进制数,其中n是字符数:


在当前shell里执行一个文件里的命令:


截取前5个字符:


SSH debug 模式:


SSH with pem key:


用wget抓取完整的网站目录结构,存放到本地目录中:


一次创建多个目录:


列出包括子进程的进程树:


创建 war 文件:


测试硬盘写入速度:


测试硬盘读取速度:


获取文本的md5 hash:


检查xml格式:


将tar.gz提取到新目录里:


使用curl获取HTTP头信息:

修改文件或目录的时间戳(YYMMDDhhmm):


用wget命令执行ftp下载:


生成随机密码(例子里是16个字符长):


快速备份一个文件:


访问Windows共享目录:


执行历史记录里的命令(这里是第100行):


解压:


输入多行文字(CTRL + d 退出):


创建空文件或清空一个现有文件:


与Ubuntu NTP server同步时间:


用netstat显示所有tcp4监听端口:


qcow2镜像文件转换:


重复运行文件,显示其输出(缺省是2秒一次):


所有用户列表:


Mount root in read/write mode:


挂载一个目录(这是不能使用链接的情况):


动态更新DNS server:


递归grep所有目录:


列出前10个最大的文件:


显示剩余内存(MB):


打开Vim并跳到文件末:


Git 克隆指定分支(master):


Git 切换到其它分支(develop):

Git 删除分支(myfeature):

Git 删除远程分支


Git 将新分支推送到远程服务器:


打印历史记录中最后一次cat命令:


运行历史记录里最后一次cat命令:


找出/home/user下所有空子目录:


获取test.txt文件中第50-60行内容:

运行最后一个命令(如果最后一个命令是mkdir /root/test, 下面将会运行: sudo mkdir /root/test):


创建临时RAM文件系统 – ramdisk (先创建/tmpram目录):


Grep whole words:


在需要提升权限的情况下往一个文件里追加文本:


列出所有kill signal参数:


在bash历史记录里禁止记录最后一次会话:


扫描网络寻找开放的端口:

设置git email:


To sync with master if you have unpublished commits:


将所有文件名中含有”txt”的文件移入/home/user目录:


将文件按行并列显示:


shell里的进度条:


使用netcat将数据发送到Graphite server:


将tabs转换成空格:


Skip bash history:


去之前的工作目录:


拆分大体积的tar.gz文件(每个100MB),然后合并回去:


使用curl获取HTTP status code:


设置root密码,强化MySQL安全安装:


当Ctrl + c不好使时:


获取文件owner:


block设备列表:


找出文件名结尾有空格的文件:


找出文件名有tab缩进符的文件


用”=”打印出横线: