Loading

无用的知识.md

无用的知识

Linux

图形界面

  • 默认打开程序被决定: xdg-open ~/.config/mine.list /usr/share/mime
  • 图形界面的解压缩可以使用: xarchiver
  • firefox在90.0版本左右有个bug,大概是网络阻塞会导致整体卡死。关闭0rtt就可以了,方法是security.tls.enable_0rtt_data 设置为 false 附: 0RTT 是指双方通信的第一个数据包就可以携带有效的业务数据。详见https://zhuanlan.zhihu.com/p/142794794
  • valgrind可以探测程序是否有内存泄漏的情况

UNKNOW

  • 访问堆上的数据通常比栈上的慢,由于缓存原因
  • 不仅CPU有乱序执行,内存读取也有乱序读取
  • RUST语言语法和JavaScript的有些许类似
  • 自行车也会逆行,第一次逆行被抓罚款20元。过人行道时不允许骑车在人行道上,应该下车推行。如果不是逆行,可以骑车过马路但不能在人行道上骑,应该在人行道旁边骑。

Java

Spring和Junit测试

使用mock时,需要注意junit的版本不能混用。

// 这是Jnit4的例子
@RunWith(MockitoRunner.class)
class OneClassTest {
    
    // 注意这里必须导入junit4的Test
    @Test
    void getOne() {
        
    }
}

// 这是Jnit5的例子
@ExtendWith(MockitoExtension.class)
class OneClassTest {
    
    // 注意这里必须导入junit5的Test
    @Test
    void getOne() {
        
    }
}

Spring事务

​ 在spring cloud使用事务,一般都是直接添加注解: @Transactional(rollbackFor = Exception.class)。这个函数内部调用的所有数据库相关操作都会在一个事务内,这会导致在该函数执行完成之前,其他线程(函数)是看不到这里面的数据变动。如果需要在该函数调用的某个函数内,让其他线程看到数据变动,则对这个内部函数添加 @Transactional(propagation = Propagation.NOT_SUPPORTED)

// 执行主要逻辑操作
// 该函数所有数据库操作在一个事务之内
@Transactional(rollbackFor = Exception.class)
void mainOperate() {
    Utils.updateData();
    Utils2.updateData();
}

// 被mainOperate调用的方法
class Utils {
    static void updateData() {
        // 更新一些数据
        dataMapper.update();
    }
}

// 被mainOperate调用的方法
// 该注解会检查当前是否已有事务,如果有,则事务挂起(暂停),等函数执行完成之后,再将事务恢复
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class Utils2 {
    static void updateData() {
        // 更新一些数据
        dataMapper.update();
    }
}

// 想要观察mainOperate内部的数据更改
void watchDataChange() {
    // 在mainOperation执行完成之前(事务提交之前),是无法观察到Utils对updateData对数据的改动
    // 但是可以观察到Utils2对updateData对数据的改动
    // 观察数据变动
    // ...........
}

FastJson

反序列化含泛型类型的类时,需要使用TypeReference

class Macro<T> {
    T a;
}

// xxxxxxxxxxxxx
Macro<List> macro = JSON.parseObject("{xxxx}", new TypeReference<Macro<List>>(){});
// xxxxxxxxxxxxx

SpringBoot最大返回数据

SpringBoot一次http回应最大可以返回多少数据呢?可以做个测试

@GetMapping("/getLongResponseData")
public String longResponseData() {
    StringBuilder sb = new StringBuilder();
    sb.append("12");
    for (int i = 0; i < 25; i++) {
        sb.append(sb);
    }
    return sb.toString();
}

如上代码,长度为$2^{25}$大小,也就是32MB大小。

使用Postman请求,postman长度过大报错。使用curl请求,可以访问。

所以应该判断,springboot对响应数据长度没有大小限制,至少32MB是完全没问题的。

redis存入long类型的取出为Integer

Object obj =  redisTemplate.opsForValue().get(redisTestLongKey);
Long result = null;
if (obj instanceof Integer){
	result = ((Integer)obj).longValue();
}else {
	result = (Long) obj;
}

Linux

curl

使用curlcurl相关工具时,一直报错:curl: (52) Empty reply from server。但是服务其实是正常的,浏览器也可以正常打开。最后发现是,本地终端设置了代理:ALL_PROXY。代理转发有问题,curl工具也遵循了此设置。将代理环境变量取消即可:

unset ALL_PROXY

socket bind 自动选择端口

​ 在rust中,想要绑定一个网络设备,使用TcpSocketbind_device()接口,但可能会造成运行权限问题。可以使用bind()替代。这里需要传一个SocketAddr类型,需要指定端口,但我们不想自己设置端口值,想让系统自动选择,可以将端口设置为0

let local_addr = "192.168.19.10:0".parser()?;
let mut socket = socket.bind(local_addr)?;

终端因cat二进制导致乱码

终端执行cat [file]时,可能会读取二进制文件,导致终端乱码。此时执行reset指令,即可进行终端重新初始化恢复。

数据库

MYSQL的自动更新时间

mysql可以设置表字段在插入或更新时自动更新时间:比方说有create_timeupdate_time两个字段。

create_time datetime not null default current_timestamp comment '此数据创建时间',
update_time datetime not null default current_timestamp on update current_timestamp comment '此数据更新时间',

在新增或更新时会自动更新这两个字段。

但对于更新时自动更新update_time字段来说,如果要更新的内容与上次完全一致,即字段的内容不会发生变化,此时update_time不会更新

浏览器

浏览器中直接访问ipv6地址,可以这样输入: [2605:b100:80:14::2]

image-20221108170737232

posted @ 2022-05-27 14:11  nsfoxer  阅读(86)  评论(0编辑  收藏  举报