Mac使用Vim快捷键
一、移动光标 移动到行尾”$”,移动到行首”0”(数字),移动到行首第一个字符处”^” 移动到段首”{“,移动到段尾”}” 移动到下一个词”w”,移动到上一个词”b” 移动到文档开始”gg”,移动到文档结束”G” 跳到第n行”ngg” 或 “nG” 或 “:n” 移动光标到屏幕顶端”H”,移动到屏幕中间”M”,移动到底部”L” 二、编辑操作 光标后插入”a”, 行尾插入”A” 后插一行插入”o”,前插一行插入”O” 删除字符插入”s”, 删除正行插入”S” 光标前插入”i”,行首插入”I” 删除一行”dd”,删除后进入插入模式”cc”或者”S” 删除一个单词”dw”,删除一个单词进入插入模式”cw” 删除一个字符”x”或者”dl”,删除一个字符进入插入模式”s”或者”cl” 粘贴”p”,交换两个字符”xp” 交换两行”ddp” 复制”y”,复制一行”yy” 拷贝当前行 “yy”或者”Y” 撤销”u”,重做”ctrl + r” 删除到行尾可以使用”D”或”C” 删除当前字符 “x” “ >>”缩进所有选择的代码 “<...
好看又好用并且安全的密码管理工具
为什么要使用密码管理工具 在日常的生活中,尤其是现在发达的网络环境下,每个人都在大量的网站注册了大量的账号,除却QQ登录、微信登录等登录方式之外,绝大部分网站都支持使用账号密码登录,一旦账号多了,密码多了,发现记录密码是一件非常麻烦的事,又不敢明文保存,还经常需要用到,此时密码管理工具的作用就凸显出来了。 什么密码管理工具好用之前自己使用过keepPass的开源版,它的理念是把账号密码的数据存储在本地,起到了安全性的作用,但是这样就造成了自己有多台电脑的时候,同步密码就成了一件非常费力的事情。 在百度上搜索好用的密码管理工具,基本上无外乎KeepPass、LastPass、1Password等,好评比较高的有LastPass,但是它数据是存储在云端,但是我们知道网络上别人的数据库是不可靠的,但是那个时候没有找到能取代它的好用的工具。 直到有一天搜到了一款密码管理工具:bitwarden,相信很多人没有听说过它,一旦使用之后才发现它的强大。 为什么好用bitwarden我比较喜欢的点有三个: 界面简洁,全中文 自己搭建服务,数据完全存储在自建数据库中 有完备的设备支持:win、...
HashMap浅谈-基本方法
HashMap的初始化过程HashMap的初始化有两种方法: 直接使用HashMap的无参构造方法,此时初始化的容量为:DEFAULT_LOAD_FACTOR 也就是161234567/** * Constructs an empty <tt>HashMap</tt> with the default initial capacity * (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted } 传入容量参数的有参构造方法,此时的初始化容量需要进行计算 12345678910/** * Constructs an empty <tt>HashMap</tt> with the specified initial * capacity and th...
HashMap浅谈-基本原理
HashMap的组成 HashMap的内部实现是一个数组,但是它是一个特殊的数组。如下图所示: HashMap的内部结构HashMap是一个特殊的数组实现,它的数据插入并不是按照顺序逐个写入的,而是按照一种特定算法来确定写入的位置, 然后将对象进行写入,它就是散列计算,就是计算出当前key的hash值,然后对hash值做一定的操作,再计算出当前的hash对应的是哪个桶,然后再将对应的输入写入到桶内(栗子:上图中的Node1节点) 当存在同hash值时,同一个桶内的数据会采用拉链法来使桶内的数据形成一个链表结构,这样同hash的值都会保存并且不会覆盖。 当链表长度达到一定的阈值时(阈值:8),为了提高它的性能,此时会将链表转化为红黑树进行存储(栗子:上图中的Node2节点) HashMap的核心概念 HashMap的存储结构 HashMap的底层实现是一个数组,源码如下: 1234567/** * The table, initialized on first use, and resized as * necessary. When allocated, len...
nginx配置https和跨域设置
简介为了网站快速响应,经常需要将前端页面放在cdn上,此时就需要后端服务支持跨域访问,所以 记录一下在tengine上的配置,用于集中管理多个服务和支持服务的跨域访问设置。关于nginx的安装可以参照 这里 第一步 将配置文件进行分离使用vi nginx.conf编辑nginx的配置文件,改成如下配置 12345678910111213141516171819202122232425262728293031323334353637#user nobody;worker_processes 1;error_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;error_log "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";pid logs/nginx.pid;events { worker_connections 1024...
线上事故记录-docker与Java的恩怨情仇
起因 上周五新建了一个项目,在开发完成后,和运维沟通准备上到生产环境中,套用了现有服务的通用启动命令行: 1java -jar -Xms3072m -Xmx8192m app.jar & 2>1 然后一切准备就绪,jenkins打包一切顺利,然后顺利部署到生产环境,由于前端项目暂未部署,k8s使用的内网集群通信,暂时没有办法调用接口进行服务部署成功验证,但是在测试环境进行了充分测试,一切OK 。 在周五即将下班的时候,运维给我这边发消息,说我的服务没有部署成功,然后把日志给我发了过来,内容大致如下: 服务启动日志并没有出现JVM的字样,日志一直没有打下去 经过经过排查,发现服务没启动完成,突然想起来前几天碰到一个问题,就是当内存不足时,docker会自动kill掉容器。最终确认是服务的相关资源配置没给到位,被docker给强制关闭了。 询问运维给的相关配置内存为1G,但是我启动时设置的最小初始化内存为3G,此时被k8s认为资源不足,给kill掉,导致服务无限重启 结果调整了启动参数为1G,服务顺利启动。 反思该问题其实是一个非常简单的启动参数设置不合理导致的服...
对Java异常的理解
开篇异常是因为异常在我们的代码开发中是无法避免的一个问题,也是最常见到的问题,简单了解一下异常的组成,对Java的异常有一个初步的了解,最重要的是在实践中遵守几个处理异常的原则,尽量减少处理异常过多而带来的资源消耗和减少因为异常处理不当引起的生产事故。 Exception与Error的区别都继承了Throwable类,在Java中,只有Throwable类型的实例才能被抛出(throw)或者捕获(catch),Throwable是异常处理机制的基本组成类型。 Error是程序性的错误状态,绝大多数的Error会导致程序处理不可用状态,所以基本不需要对Error进行捕获,常见的Error类型有OutOfMemoryError等。 Exception种类: 可检查异常,需要在程序编译时就进行检查 不检查异常,也是运行时异常,有NullPointerException等,是一般程序在运行中抛出的错误异常,一般在编码中可以尽量避免此类异常。 异常实践 try-catch-finally,finally中关闭需要关闭的对象 try(resource)-catch,可以自动关闭...
对Java的基础理解
文章的由来从大学学习到使用Java开发时间快超过三年,发现自己的系统化学习还是缺乏很多知识点,在此重新系统化的整理一下自己对Java学习的一些理解, 我相信走得更远不仅仅有聪明人,还有不聪明但是认真并努力的人。 对Java的理解Java是一种跨平台的,面向对象的,自动化程度高的编程语言。 为什么这样说呢?因为Java的特性有俩,其中一个是一次编译,到处运行,此处充分表达了Java的跨平台特性,Java的虚拟机(JVM)在win、linux都有相同效果的不同实现,为Java成为跨平台语言提供了强大的支持。Java程序的成功运行过程可以分为四步:编码->编译->运行->调试,编码的过程自然不用赘叙,编译指的是将.java文件编译成为.class文件,.class文件就是可以在各个平台运行的文件,在不同的平台中,.class被转化为不同的机器码(机器码指的是计算机的运行指令),但是实现的是相同的功能。 另外一个特性是Java有着日渐成熟的垃圾收集,分配、释放内存的处理机制(gc->Garbage Collection),垃圾收集功能由JVM提供响应的垃圾收...
关于Spring中@transactional的一些理解
简介在我们的数据库开发的过程中,很多关键性的操作都需要使用到事务,保证数据的一致性和安全性。Spring为事务管理提供了非常丰富的支持,主要分为编码式(通过编码方式实现事务)、声明式(基于AOP,将具体业务逻辑与事务处理逻辑进行解耦)。编码式的事务使用起来较为繁琐,会对代码造成侵入,破坏整体的协调性。声明式则不然,在日常使用中声明式的使用相对比较频繁,它可以在xml中做相关事务规则配置,还有一种则是@Transactional 注解的方式。今天就@Transactional 的注解使用来简单的谈一谈我的理解。 @Transactional 注解管理事务的实现步骤使用@Transactional 注解管理事务的实现步骤分为两步。 第一步,在 xml 配置文件中添加事务配置信息。除了用配置文件的方式,@EnableTransactionManagement 注解也可以启用事务管理功能。这里以简单的 DataSourceTransactionManager 为例。 一、 在 xml 配置中的事务配置信息12345<tx:annotation-driven /><...
更好用的日期工具
介绍在以往的JAVA开发中,我们只能使用Date作为日期开发的常用工具,但是随着时代的发展,对日期的操作有了更高的需求,Date无法满足,并且使用起来代码比较繁琐,在此情景下,JAVA8引入了新的日期类-LocalDate以及LocalDateTime,新的时间类都是不可变并且线程安全的,下面我们来学一学它的用法。 获取当前时间1234567891011121314151617181920212223242526272829public static void main(String[] args) { /** * 获取当前时间戳 */ Instant instant = Instant.now(); System.out.println(instant); /** * 获取当前日期 */ LocalDate localDate = LocalDate.now(); System.out.println(localDate); /** * 获取当前时刻 */ Local...