0x9C40
June 2nd, 2022
0x9C40
January 5th, 2022
let mapleader = " "

set clipboard=unnamedplus,unnamed
set hlsearch
set incsearch
set ignorecase
set smartcase
set showmode
set number
set scrolloff=3
set history=100000
set multiple-cursors
set commentary
set easymotion
set exchange
set surround
set ideajoin
set clipboard+=ideaput
set ideamarks
set keep-english-in-normal-and-restore-in-insert
set relativenumber
set highlightedyank
set NERDTree
set showmode
set so=5
set incsearch
set nu
set idearefactormode=keep
set ideavimsupport

let g:EasyMotion_override_acejump = 0
let g:argtextobj_pairs="[:],(:),<:>"

map <leader>a :action $SelectAll<CR>
map <leader>x :action $Cut<CR>
map <leader>c :action $Copy<CR>
map <leader>z :action $Undo<CR>
map <leader>v :action $Paste<CR>

nnoremap <esc><esc> :noh<return>
nnoremap gd :action GotoDeclaration
nnoremap ,e :action SearchEverywhere<CR>
nnoremap ,g :action FindInPath<CR>
nnoremap ,s :action FileStructurePopup<CR>

nnoremap gd :action GotoDeclaration<CR>
nnoremap gs :action GotoSuperMethod<CR>
nnoremap gi :action GotoImplementation<CR>
nnoremap gb :action JumpToLastChange<CR>

nnoremap U :action FindUsages<CR>
nnoremap R :action RenameElement<CR>

nnoremap == :action ReformatCode<CR>
vnoremap == :action ReformatCode<CR>

nnoremap [] :action OptimizeImports<CR>
vnoremap [] :action OptimizeImports<CR>

nnoremap cc :action CommentByLineComment<CR>
vnoremap cc :action CommentByLineComment<CR>

nnoremap <C-CR> :action ShowIntentionActions<CR>

nnoremap ,a :action GotoAction<CR>
vnoremap ,a :action GotoAction<CR>

xnoremap p "0p
xnoremap p "_dP

" 搜索文件相关
nnoremap <leader>zc :action GotoClass<CR>
vnoremap <leader>zc :action GotoClass<CR>
nnoremap <leader>za :action GotoAction<CR>
nnoremap <leader>zh :action RecentChangedFiles<CR>
nnoremap <leader>zf :action GotoFile<CR>
nnoremap <leader>zd :action ActivateDebugToolWindow<CR>
nnoremap <leader>zr :action ActivateRunToolWindow<CR>
nnoremap <leader>zs :action ShelvedChangesToolbar<CR>
nnoremap <leader>zt :action ActivateTODOToolWindow<CR>
nnoremap <leader>zv :action ActivateVersionControlToolWindow<CR>
nnoremap <leader>zb :action ShowBookmarks<CR>
nnoremap <leader>zp :action ActivateProjectToolWindow<CR>

nnoremap <Leader>o :<C-u>action RecentProjectListGroup<CR>
noremap <Space>p :action SelectInProjectView<CR>
0x9C40
January 5th, 2022

个人认为 VIM 中各种指令的可组合性,是 VIM 保持经久不衰的最深层次的源泉,是实现各种高效操作的基石。

使用过 VIM 的人都知道,可以使用简短的 VIM 快捷键完成一些相对复杂的操作。以个人经常使用的快捷键 ciw 为例,ciw 并不是一个完整独立的命令,而是由 ciw 这 3 个命令组合起来,其中 c 为 Change 即修改,i 为 Inner 即内部,w 为 Word 即单词,整个命令组合并直译过来,即为“修改内部的单词”,实际上的效果是修改当前光标选中的单词。正是因为这些原子命令的可组合性,允许这些命令可以有机地结合,实现 1+1 > 2 的效果。一旦这种可组合性的特性让使用者产生印象,便会给人一种这样的隐喻:「组合中的指令是可以替换的」,使用者可能会通过自己的想法,在可组合的规则内自由的尝试其他的组合。例如将 ciw 中的 c 替换为 ddiw 这个指令即代表删除当前光标所在的单词,如果替换为 yyiw 即代表复制当前光标所在的单词。VIM 在这样用户的自由地实践中,通常会诞生一些连作者都未曾设想的操作,这使得 VIM 在用户的使用「迭代」中迸发出惊人的生产力。

可组合性不仅仅是 VIM 中最强大的理念,同时也是软件领域最为强大的武器。

  1. 编程语言只提供少量的关键词及对应的约束规则,使用有限的元件「组合」出可运行的程序。
  2. UNIX 中通过管道(pipe)将功能不同的程序组合成一个整体实现复杂的数据操作。
  3. 互联网中使用不同的通信协议或者 API 将不同的软件和服务组合起来,实现更加复杂的互动结构。
0x9C40
January 5th, 2022

在日常开发中通常使用 WebSocket 实现服务端的主动地数据推送,这里简单介绍两种其他的数据推送方案,ndjsonSSE

ndjson

ndjson 全称 Newline Delimited JSON,即使用换行符分割的 JSON,同时能够保证每一行的内容都是一个完整的 JSON。这里使用 ndjson 并不是因为它可以实现服务端数据推送,而是凭借 ndjson 的数据格式的特性,作为服务端的 JSON 数据流的数据输出,来更好地帮助我们实现数据推送的效果。

这里使用 Spring Boot 作为基础的服务端框架,简单演示一下相关代码及功能。首先要确保项目依赖中包含 spring-boot-starter-webflux 依赖包。

0x9C40
January 5th, 2022

详细内容可参考大佬整理的资料 Java 拾遗卷1:语言特性 · 语雀,以下的内容是从个人角度觉得需要额外记录的内容。

面向对象

里氏代换原则(Liskov Substitution Principle, LSP):凡是父类能够出现的地方,都可以用子类替换。

多态是一种允许子类或接口可以有多种实现的特性,这种特性使得代码在运行时,同一个行为可能在不同的情况下,具有不同的表现形式。

0x9C40
January 5th, 2022

最近使用 IDEA 启动 Java 项目时发现在编译阶段出现如下的错误:

  • java.lang.OutOfMemoryError: GC overhead limit exceeded
  • java.lang.InternalError
  • java.lang.OutOfMemoryError: Java heap space

出现上述的错误,通常在项目工程比较大的时候才会出现。此时只需要调整 IDEA 的设置, 将 File | Settings | Build, Execution, Deployment | Compiler 中的 Shared build process heap size(Mbytes) 配置的阈值适当提高,问题通常便会解决。

0x9C40
December 11th, 2021

最近在工作中遇到了 HTTP 请求长时间未响应的情况,初步判断是代码问题导致产生死锁,遂简单学习了下 JDK 中自带的 JConsole 工具。 以 Windows 为例,工具存放在 JDK 目录下的 bin/jconsole.exe,双击运行即可。

使用步骤:

  1. 新建连接,选择本地或远程的应用进程,并连接。
  2. 切换至线程选项卡。
  3. 点击左下方的「检测死锁」按钮。如果存在死锁进程,会展示对应的线程信息,同时展示线程死锁相关的堆栈信息,排查堆栈信息即可找到问题根源。