BigDecimal 加减乘除计算

BigDecimal有多种构造函数,常用的有2种。建议使用String构造方式,不建议使用double构造方式。

// 强制使用String的构造函数,double也有可能计算不太准确
// 原则是使用BigDecimal并且一定要用String来构造。
public BigDecimal(String val);
public BigDecimal(double val);

方法

  • add() 加法
  • subtract() 减法
  • multiply() 乘法
  • divide() 除法
  • abs() 绝对值

舍入

new BigDecimal("12.34").setScale(0, BigDecimal.ROUND_HALF_UP);
  • ROUND_UP 始终对非零舍弃部分前面的数字加1
  • ROUND_DOWN 从不对舍弃部分前面的数字加1,即截短
  • ROUND_CEILING 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同
  • ROUND_FLOOR 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同
  • ROUND_HALF_UP 四舍五入
  • ROUND_HALF_DOWN 五舍六入
  • ROUND_HALF_EVEN “银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。如果前一位为奇数,则入位,否则舍去

更多来源:https://www.jianshu.com/p/683b2406342f

ubuntu 安装 wireshark 抓包工具

安装方法:

sudo apt-add-repository ppa:wireshark-dev/stable
sudo apt-get update
sudo apt-get install wireshark

安装过程中需要设置,选择“是”。如果错过了或选错了,就安装好之后,运行下面命令行,出现上述页面选择“是”即可。

sudo dpkg-reconfigure wireshark-common

出于安全方面的考虑,普通用户不能够打开网卡设备进行抓包,Wireshark不建议用户通过sudo在root权限下运行,应当设置当前用户权限:

sudo usermod -aG wireshark $(whoami)

注销登录。

linux 下用 socat 模拟串口调试

$ socat -d -d pty,raw,echo=0 pty,raw,echo=0
2020/05/01 12:08:12 socat[8341] N PTY is /dev/pts/2
2020/05/01 12:08:12 socat[8341] N PTY is /dev/pts/3
2020/05/01 12:08:12 socat[8341] N starting data transfer loop with FDs [5,5] and [7,7]

-d -d 前面两个连续的 -d -d 代表调试信息的输出级别

启一个终端,运行:

echo "test string" > /dev/pts/3

再启一个终端 ,运行:

cat < /dev/pts/2

可以看到向 pts3 发送的数据,由 pts2 接收到了。开发调试的程序连接到 pts2 就可以实现数据接收了。

创建EMQX环境

EMQX 提供 MQTT 协议服务,使用 docker 可以方便部署:

docker run -d --name emqx -p 18083:18083 -p 31002:1883 emqx/emqx:latest

登录账号:admin,密码:public

SpringBoot 取出 JSONString 形式的 requestBody

@PostMapping("/getRequestBodyJson")
public void getRequestBodyJson(HttpServletRequest request) throws IOException {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(request.getInputStream(), "UTF-8"));
    String line;
    String result = "";
    while ((line = reader.readLine()) != null) {
        result += line;
    }
    System.out.println(result);
}

注意不能使用 @RequestBody 注解,否则会空指针错误。因为 request.getInputStream() 只能被读取一次,然后就会被清空。

tmux 窗口操作

SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。

为了解决这个问题,会话与窗口可以“解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。Tmux 的作用就是会话与窗口的“解绑”工具,将它们彻底分离。

继续阅读

阿里ECS部署jar包发生无法解析计算机名的问题

在ECS上利用 docker 部署 jar 包时出现如下错误:

redis.clients.jedis.HostAndPort - cant resolve localhost address

是因为spring-redis在初始化时会实例化LocalHost,但是ECS的host name并没有在设置,解决方案是在 /etc/hosts 中设置ECS的host name。

比如:ssh 登录后,界面显示 user@abcdefg ,则在 /etc/hosts 中添加 127.0.0.1 abcdefg

docker 轻量级管理工具 portainer

1、准备好 docker 环境
2、拉取镜像:

docker pull portainer/portainer

3、运行实例:

# 单机(本机)
docker run -d --name portainer -p 9000:9000 -v "/var/run/docker.sock:/var/run/docker.sock" portainer/portainer

# 群集
docker run -d --name portainer -p 9000:9000 portainer/portainer

4、添加 docker registries

名称:microsoft
地址:dockerhub.azk8s.cn