0%

前言

最近做了一个软件,但是有不同公司的版本,所以开始的时候都只是复制了一份,包名都是相同的,用户实际智慧装一个版本使用,但是销售推广的时候想一台手机上装多个版本,所以需要改动包名,以前用eclipse的时候还是挺难搞的,不过用Android studio还是非常方便的,下面记录一下过程

阅读全文 »

前言

最近项目上定时任务里遇到执行失败的情况,由于用的xxljob,详细的异常信息并没有打印出来,只是说有一个地方空指针了,由于没有现场环境,看了一遍代码也无法定位问题是出在哪里,后来将代码加上try catch之后,找到了问题所在

concat

这个是常用的一个字符连接函数,但是用不好的话可能回造成空指针问题,为什么会空指针呢,我们来看一下concat函数的源码

1
2
3
4
5
6
7
8
9
10
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}

可以看到,第二行中的str.length(),如果str是null,那肯定就空指针异常了

解决
  • 如果一定要用concat,可以使用三元符判断不为空再连接,否则返回空字符串“”
  • 换别的函数,比如StringBuilder
  • 或者用封装好的工具类,如Hutool里的StrUtil工具类
总结

​ 使用场景里一定要确保连接的字符串都不为null的才可以用,否则请做判空处理或者使用其他函数,亦或者使用封装好的第三方工具类

前言

​ 最近想要再idea中连接服务器里的docker,服务器时windows server2012的,里面开了一个VM虚拟机,虚拟机里装了一个centos 7的系统,再centos系统里开了一个docker,所以想要连接,需要多一些配置,直开放2375端口时无法连接的,还需要配置VM

开启2375端口

网上教程很多,这里简单说一下,首先看一下配置文件在哪里

阅读全文 »

前言

​ 最近不满足frp的内网映射,因为frp只能单独的将某个端口映射出来,需要多个端口就需要映射多个,很是麻烦,所以研究了一下open组建,从晚上9点一直研究到凌晨4点愣是没研究透彻,只能做到客户端和客户端之间的通行,无法在一个客户端访问另一个客户端内网的其他机器,第二天不甘心,又研究了大半天,终于研究透彻了,核心概念就是路由需要配置好,需要理解了路由的走向,才能正确配置,下面记录一下

组建条件
  • 家庭V客户端,以下统称C1
  • 云服务器V服务端,以下统称S
  • 公司内网服务器,以下统称C2
脚本

openVPN 手工搭建非常复锁,所以可以采用脚本快速搭建,以下推荐两个脚本
脚本1下载地址
脚本2下载地址(推荐)

安装
阅读全文 »

前言

​ 最近再项目上发现一个问题,就是打包jar后,放到服务器上启动很慢,系统是centos,以前还真没遇到过这种问题,网上的大多都是让改jdk里面java.security random改成urandom 或者./random,发现没什么用,后来又找到另外一种有效的方法

解决办法

​ 修改host文件,把主机名和127.0.0.1映射起来

1
2
3
4
5
6
7
8
9
10
11
# 首先找到 hostname,在终端输入hostname,输出的比如 vm-centos
hostname

# 然后编辑hosts文件
vim /ets/hosts

# 如果有127.0.0.1的映射,则直接在后面加一个就行,没有的话加一个
127.0.0.1 vm-centos

# 保存后刷新下
source /etc/hosts

经过以上操作,启动速度恢复正常,猜测可能是jar包服务用到了hostname,但是没有映射到本地,可能出现超时之类的

前言

​ linux挂起和恢复进程,最近在centos上启动了一个服务,启动有点慢,我想结束终止,一般ctrl + c即可退出,但是按了半天没用,发现可以曲线救国,先退到后台,再强制终止进程

使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先退出到后台
CTRL + Z

# 根据自己的服务找到进程ID
ps -ef | grep java

#强制结束
kill -9 123

# 有时可能是退出到后台后还想恢复,使用如下命令
jobs
# 找到id,然后执行以下命令
fg 1

#bg恢复后台执行
bg

前言

​ 最近发现.ignore文件添加的规则不生效,还是能被提交上去,原来是该文件已经被纳入版本管理,所以是无效的,需要清下缓存,使其重新剩下

1
2
3
4
5
6
7
# 清空缓存,别忽略了最后的点
git rm -r --cached .

# 重新纳入到版本管理,被忘了点(点是全部的意思)
git add .

git commit -m 'update .gitignore'

前言

​ 在项目中有时会用到自签名证书,因为在内网使用,如果用域名比较麻烦,还需要搭建DNS服务器,所以直接使用IP做https签名证书

实现

​ 最原始的做法肯定是用openssl等一系列操作,但是太麻烦,最近在github上看到了一个工具,非常的方便,下载地址,mkcert,非常简单好用,下面介绍下

mkcert基本使用

​ 从以上连接下载最新的对应的系统版本,windows的下载后最好放到system32下,这样使用起来比较方便,之后直接在cmd里输入mkcert,如下,会输出使用方法

阅读全文 »

前言

​ 在项目中很多情况下会在util等工具类中使用到其他注入的bean,如dao,service等

实现

​ 首先我们在工具类加入@Component注解,我们再声明要注入的类,最后使用set方式autowired注解实现

1
2
3
4
5
6
7
8
9
10
11
@Slf4j
@Component
public class NetUtil {

private RedisTemplate<String, String> redisTemplate;

@Autowired
private void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
}

前言

​ 最近一个项目因为大部分时间是离线使用,只在联网时提交和更新数据,所以需要用到本地数据库!之前一直用的是realm数据库,相对来说也是不错的,读写的性能还是还能很强悍的!但是最近项目完全使用了kotlin框架,而正好谷歌官方的room数据库也是使用kotlin,所以就记录下使用过程!

引入依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
dependencies {
def room_version = "2.4.2"

//必选,基本依赖
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

//可选,kotlin协程支持
implementation("androidx.room:room-ktx:$roomVersion")

// 可选 - Paging 3 Integration
implementation "androidx.room:room-paging:2.5.0-alpha01"
}
简单示例
阅读全文 »