daliy dev

Table of Contents

linux

command

查看

这里推荐用less或者 more ,当然cat也可以,但是不方便阅读

批量文件删除

一般是删除一些 具有特定格式的文件find ../ -name '***.go' -delete 这个命令最好用,应该有些基于 pipe的命令

简易压测

可以用 apache benchmark 也就是ab进行压测,yay -S apache 最简单的使用就是ab -n 1000 -c 100 http://test/do1

关于PATH

一般通用的软件 sudo echo 这些都是在/usr/bin目录下的可执行文件 具体的路径可以/etc/profile里看到 三方软件可能会在 opt

关于desktop

在yay里,一些软件可能会在/home/xxx/.local/usr/applications,更通用的路径是/usr/share/applications,注意一些开源软件的desktop文件名可能是org.xxx.xxx.desktop

文件重命名

rename批量重命名,通常在对文件归类时使用,但是常见的博客,匹配模式写一堆,让人感觉命令的基本用法: rename “pattern” aim_file,实际上如果你想对含有XX123.suffix的文件变成YY123.suffix,直接 rename "XX" "YY" *就好了…否则三个参数传两个,连报错都没,如果是zsh还有个x号,sh只能一脸懵逼了

arp抑制

arp做lvs的时候必须关闭,我在局域网测试的时候,ping到了虚拟ip,但是实际上走的不是broker,应该是 arp这个ip获取了 mac地址

ip

ip这个命令,可以查看网卡的ip,我的环境网关是192.168.1.1 DHCP到ip 是 192.168.1.104实际上直接改同一网段的ip也可以,这样ip就固定,

jps

jps这个命令能迅速的找到java进程的pid,比ps -a | grep '*java*'快多了

简易批量

bash中可以做for配合do xxx done批量操作,对于一些批量的command,如果不熟悉,还是先测试,不要造成大面积的文件覆盖,还有就是文件名书写的时候一定要正确,今天docker搭集群的时候,redis-cluster写成了reids-cluster,然后docker在主目录创建正确的挂载了,导致我以为是配置问题

mount

-a, --all mount all filesystems mentioned in fstab这是 mount -h得到的信息,可以发现在 /etc/fstab 这个文件配置了挂载信息,之前挂载机械后,配置了nofail就没关了,mount -a就会提示错误,

vmstat

查看虚拟内存信息,主要看看memory inactive,swap

java

basic

对象比较

for (ColumnFamilyHandle handle : handles) {
		// 这里尝试将 byte对象 进行比较,显然 always false !!!
        // 基础不牢
   	if(handle.getName() != RocksDB.DEFAULT_COLUMN_FAMILY) {
  	// do something ...
    }
 }

JSON序列化

场景是使用 Vertx内置的jackson,有个对象内部是存在一个Map,这个时候必须提供getXXX方法,不然是不会放进JSONl里的,原因很简单,Map不支持

  public void removeBlockList(List<String> list) {
        list.forEach(t->{blockList.remove(t);});
    }
    public void removeWhiteList(List<String> list) {
        list.forEach(t->{whiteList.remove(t);});
    }

mvn

mvn组件version

mvn在存在多个依赖的时候,会优先选择版本较低的组件 feat: 又也遇到这个问题了,对spring降级的时候和dubbo的依赖冲突了,导致spring-contextversion本应该是6.x.x,但是实际引入的是5.x.x,关键这个问题不好排查,之前的组件较少的时候容易解决,或者对其他组件依赖较少的时候能迅速定位,但是遇到这种大量的组件依赖相同的时候,只能一个一个去查看pom的原始依赖了,所以如何解决这个问题呢,其实不需要,只有重构的时候可能遇到大面积的组件升降级问题

   <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.39.42.ALL</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 首先这是改进 是 alipay 的 sdk 使用了 okhttp的组件,和我的一个组件冲突-->

异常:Okhttp关于 java.lang.NoSuchMethodError: okio.BufferedSource报错 实际就是版本过低问题,排查mvn依赖后发现冲突故解决

spring

spring yml config bug

遇到一个配置bug,本来想提交一个issue,后来觉得也只有自己会配置这种奇怪的字段了,就是如果字段是off的话,并且是boolean 类型,会注入不进来,还有一个问题是这个配置类如果字段是private 的话,需要提供getter/setter方法

go

synatx

匿名函数

 d := func(a int) {
        if a == n {
            ans = append(ans,t)
        }
        // add this item
        t = append(t,nums[a])
		// 不事先申明d 变量的时候不允许直接在 匿名函数内部调用自身
        d(a + 1)
        // do  not add this one
        t = t[:len(t)-1]
        d(a + 1)
    }

解决办法

  var d func(int)
    d = func(a int) {
        if a == n {
            ans = append(ans,t)
        }
        // add this item
        t = append(t,nums[a])
        d(a + 1)
        // do  not add this one
        t = t[:len(t)-1]
        d(a + 1)
    }
  1. 切片 今天写一个gin的封装框架的时候,存在一个bug:gin可以启动成功,但是一打进去请求就会导致npe,排查后错误如下
// adaptor transmit PeroHandlerFunc -> gin.HandlerFunc
func (p *PeroHttp) adaptor(handlers []PeroHandlerFunc) []gin.HandlerFunc {
	// 表面上看这里好像完全无问题,但是实际上这里的ginHandlers已经有值了,就是nil
	//正确的写法是 make([]gin.HandlerFunc,0,len(handlers))
	//或者 := []gin.HandlerFunc{}
	ginHandlers := make([]gin.HandlerFunc, len(handlers))
	if handlers != nil {
		for _, v := range handlers {
			ginHandlers = append(ginHandlers, p.convert(v))
		}
	}
	return ginHandlers
}

debug的结果 debug 可以看到,在最开始的写法的时候,是分配了内存空间的,这就导致convert后的gin.HandlerFunc第一个nil,所以npe了,以后使用切片还是最简语法最好