跳至主要內容
Docker笔记

Docker笔记

1.快速入门

要想让 Docker 帮我们安装和部署软件,肯定要保证你的机器上有 Docker. 由于大家的操作系统各不相同,安装方式也不同。为了便于大家学习,我们统一在 CentOS 的虚拟机中安装 Docker,统一学习环境。

1.1.部署 MySQL

首先,我们利用 Docker 来安装一个 MySQL 软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。

如果是利用传统方式部署 MySQL,大概的步骤有:

  • 搜索并下载 MySQL 安装包
  • 上传至 Linux 环境
  • 编译和配置环境
  • 安装

狸猫不会跑大约 26 分钟Docker
免费申请SSL证书

免费申请SSL证书

Certbot 简介

Github 地址:https://github.com/certbot/certbot 本质上来说,certbot 就是一个 ACME client,这也是 Let’s Encrypt 官网推荐的签发证书的方式,适用于对自己的 domain 具有 shell 访问能力的情况,使用所谓的 ACME 协议来自动化的签发证书,很大程度上简化了证书签发的步骤


狸猫不会跑大约 2 分钟SSLSSLhttps建站
在Jetbrains全家桶中使用ideavim

在Jetbrains全家桶中使用ideavim

1.安装必备的一些插件

AceJump

IdeaVim-EasyMotion、IdeaVim-Quickscope、IdeaVim-Sneak、IdeaVimExtension、Which-Key

2.ideavim配置文件 .ideavimrc

":actionlist 可以查询所有的命令
let mapleader=','
Plug 'easymotion/vim-easymotion'
set file encodings=utf-8,gb2312,gbk,gb18030
set term encoding=utf-8
" Plugins
set ignorecase
set smartcase
set easymotion
set sneak
set quickscope

set encoding=prc
inoremap <c-e> <c-o>$
inoremap <c-a> <c-o>^
nmap <Space>jn i<CR><Esc>
nmap <Space>jo i<CR><Esc>k$
nmap <Space>sv :vsp<CR>
nmap <Space>sg :sp<CR>
nmap <Space>sq :q<CR>
nmap <Space>sQ :qa<CR>
nmap <Space>sa ggVG
nmap <Leader><Space> :nohl<CR>
nmap <Space><CR> o<Esc>
nmap <c-h> <c-w>h
nmap <c-j> <c-w>j
nmap <c-k> <c-w>k
nmap <c-l> <c-w>l
set clipboard=unnamed
map Y y$
map D d$
"vmap p "_dp



"set nu
"set rnu
set ideajoin
set surround
set matchit
" 突出显示当前行
set cursorline
" 在状态栏显示正在输入的命令
set showcmd
"set multiple-cursors
set commentary
set ReplaceWithRegister
set exchange
set argtextobj
set highlightedyank
set which-key
" -- which key --
set notimeout
"let g:WhichKey_ShowVimActions = "true"
set timeoutlen = 5000
" 相对当前行行数显示
" set relativenumber
set scrolloff=3
set history=100000
set relativenumber
set hlsearch
set incsearch
" 去掉搜索高亮
nnoremap <leader>/ :nohls<CR>
" clear the highlighted search result
nnoremap <Leader>sc :nohlsearch<CR>
"set vim-paragraph-motion
set NERDTree

nmap <Leader>ed <Action>(ShowErrorDescription)
nmap <Leader>me <Action>(ShowPopupMenu)
    " 选择模式扩大选择范围
vmap v <Action>(EditorSelectWord)
" 选择模式缩小选择范围
vmap V <Action>(EditorUnSelectWord)
    " 多光标选中单词
nmap <Leader>va <Action>(SelectAllOccurrences)
vmap <Leader>va <Action>(SelectAllOccurrences)

set showmode
"set vim-textobj-entire
set clipboard+=ideaputset ideajoinset clipboard+=ideaput


nmap H :action PreviousTab<CR>
nmap L :action NextTab<CR>

"nmap <C-m> :action SelectNextOccurrence<cr>
"xmap <C-m> :action SelectNextOccurrence<cr>
nmap <C-s> :action FindNext<cr>
xmap <C-s> :action FindNext<cr>
"FindPrevious
nmap <C-o> :action UnselectPreviousOccurrence<cr>
xmap <C-o> :action UnselectPreviousOccurrence<cr>
nmap <S-C-m> :action SelectAllOccurrences<cr>
xmap <S-C-m> :action SelectAllOccurrences<cr>

" Do incremental searching.
nnoremap [[ :action MethodUp<CR>
nnoremap ]] :action MethodDown<CR>

" 清除当前行,撤销重写
“ 输入模式下,dd映射两个命令,返回普通模式,光标移动到最开始,C命令
"inoremap dd <ESC>:normal ddO<CR>i
"inoremap dw <esc>diw<CR>i
"输入模式下左右移动字符
inoremap <C-h> <Left>
inoremap <C-l> <Right>

"Move code up and down
inoremap <c-j> <Esc>:action MoveStatementDown<CR>i
inoremap <c-k> <Esc>:action MoveStatementUp<CR>i
inoremap <c-q> <Esc>:action QuickJavaDocL<CR>i
vnoremap J :action MoveStatementDown<CR>
vnoremap K :action MoveStatementUp<CR>
nnoremap <C-w> viw

inoremap <c-l> <Esc>:action EditorCompleteStatement<CR>
nnoremap <Space>t :action Refactorings.QuickListPopupAction<CR>
vnoremap <Space>t :action Refactorings.QuickListPopupAction<CR>
nnoremap <leader>t :action ActivateTerminalToolWindow<CR>
"nnoremap <leader>t :action TerminalOpenInTerminal<CR>
nnoremap <Space>q :action HideActiveWindow<CR>
"nnoremap <leader>e :e ~/.ideavimrc<CR>
"nnoremap <leader>kr :action IdeaVim.ReloadVimRc.reload<CR>
nnoremap <leader>n :action ContextRun<CR>
nnoremap <leader>b :action ShowNavBar<CR>
nnoremap <leader>p :action Back<CR>
nnoremap <leader>c :action ChooseRunConfiguration<CR>
nnoremap <leader>d :action ChooseDebugConfiguration<CR>
nnoremap <leader>s :action FileStructurePopup<CR>
nnoremap <Space>kr :action RunAnything<CR>
nnoremap <Space>kn :action ContextRun<CR>
nnoremap <Space>kl :action Git.Pull<CR>
nnoremap <Space>kc :action RunClass<CR>
nnoremap <Space>f :action GotoFile<CR>
nnoremap <leader>a :action GotoAction<CR>
nnoremap <leader>h :action HideAllWindows<CR>
nnoremap <Space>kf :action RerunFailedTests<CR>
nnoremap <Space>w :action GotoNextError<CR>
nnoremap <c-f> :action GotoNextError<CR>
nnoremap <Space>b :action GotoPreviousError<CR>
nnoremap <c-b> :action GotoPreviousError<CR>
nnoremap <Space>u :action FindUsages<CR>
nnoremap <c-z> :action ToggleDistractionFreeMode<CR>
" 搜索文件相关
nnoremap <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>
noremap  <leader>zm <ESC>:action GotoSymbol<CR>

" 关闭当前标签页
nnoremap <leader>qq :q<CR>
nnoremap <leader>qa :action CloseAllEditors<CR>
nnoremap <leader>qu :action CloseAllUnmodifiedEditors<CR>
nnoremap <leader>qo :action CloseAllEditorsButActive<CR>

" 代码跳转相关
" 不用leader的话g没有任何意义,所以必须要加leader
nnoremap <leader>gd :action GotoDeclaration<CR>
nnoremap <leader>gi :action GotoImplementation<CR>
nnoremap <leader>gf :action FileStructurePopup<CR>
nnoremap <leader>gc :action EditorContextInfo<CR>
nnoremap <leader>gh :action TypeHierarchy<CR>
nnoremap <leader>gl :action Forward<CR>
nnoremap <leader>ge :action RecentFiles<CR>
nnoremap <leader>go :action RecentProjectListGroup<CR>
nnoremap <leader>gs :action GotoSuperMethod<CR>
nnoremap <leader>gt :action GotoTest<CR>
noremap <leader>gj <ESC>:action SliceBackward<CR>
noremap <leader>gk <ESC>:action SliceForward<CR>
noremap <leader>gg <ESC>:action Generate<CR>
noremap <leader>gq <ESC>:action CloseEditor<CR>
nnoremap <leader>gn g*
nnoremap <leader>gp g#


    " 窗口管理相关
nnoremap <leader>wf :action HideAllWindows<CR>
nnoremap <leader>wF :action ToggleFullScreen<CR>
nnoremap <leader>wm :action VimWindowOnly<CR>
nnoremap <leader>w- :action VimWindowSplitHorizontal<CR>
nnoremap <leader>w/ :action VimWindowSplitVertical<CR>
nnoremap <leader>wd :q<CR>
nnoremap <leader>wq :q<CR>
nnoremap <leader>wj :action VimWindowDown<CR>
nnoremap <leader>wk :action VimWindowUp<CR>
nnoremap <leader>wl :action VimWindowRight<CR>
nnoremap <leader>wh :action VimWindowLeft<CR>
nnoremap <leader>wn :action VimWindowNext<CR>
nnoremap <leader>wp :action VimWindowPrev<CR>

" 运行相关
nnoremap <leader>eb :action ChooseRunConfiguration<CR>
nnoremap <leader>ec :action CompileDirty<CR>
nnoremap <leader>ed :action Debug<CR>
nnoremap <leader>eD :action DebugClass<CR>
nnoremap <leader>er :action Run<CR>
nnoremap <leader>eR :action RunClass<CR>

" AceJump集成
nnoremap <leader>sj :action AceAction<CR>
nnoremap <leader>sJ :action AceTargetAction<CR>
nnoremap <leader>sg :action AceLineAction<CR>

" code代码修改相关
nnoremap <leader>js :action SurroundWith<CR>
nnoremap <leader>jp :action SmartSplit<CR>
nnoremap <leader>jt :action SurroundWithLiveTemplate<CR>
nnoremap <leader>j= :action FormatElement<CR>
nnoremap <leader>j+ :action ReformatCode<CR>
    " 视野左右移动
nnoremap zh 50zh
nnoremap zl 50zl
" 剪贴板
" 删除不剪切
nnoremp d "_d
nnoremap dd "_dd
nnoremap D "_D
" nnoremap <leader>d ""d
" nnoremap <leader>dd ""dd
" nnoremap <leader>D ""D
nnoremap c "_c
nnoremap cc "_cc
nnoremap C "_C
" nnoremap <leader>c ""c
" nnoremap <leader>cc ""cc
" nnoremap <leader>C ""C
vnoremap d "_d

vnoremap D "_D
" vnoremap <leader>d ""d
" vnoremap <leader>dd ""dd
" vnoremap <leader>D ""D
vnoremap c "_c
vnoremap cc "_cc
vnoremap C "_C
" vnoremap <leader>c ""c
" vnoremap <leader>cc ""cc
" vnoremap <leader>C ""C
vnoremap p "_dp
vnoremap P "_dP
" 删除不剪切
" 组合命令删除不剪切
nnoremap diw "_diw
nnoremap di" "_di"
nnoremap di' "_di'
nnoremap di( "_di(
nnoremap di[ "_di[
nnoremap di{ "_di{
nnoremap di< "_di<

nnoremap daw "_daw
nnoremap da" "_da"
nnoremap da' "_da'
nnoremap da( "_da(
nnoremap da[ "_da[
nnoremap da{ "_da{
nnoremap da< "_da<

nnoremap ciw "_ciw
nnoremap ci" "_ci"
nnoremap ci' "_ci'
nnoremap ci( "_ci(
nnoremap ci[ "_ci[
nnoremap ci{ "_ci{
nnoremap ci< "_ci<

nnoremap caw "_caw
nnoremap ca" "_ca"
nnoremap ca' "_ca'
nnoremap ca( "_ca(
nnoremap ca[ "_ca[
nnoremap ca{ "_ca{
nnoremap ca< "_ca<

" 快速跳转行首与行尾
nnoremap <C-l> $
nnoremap <C-h> ^
vnoremap <C-l> $
vnoremap <C-h> ^
" 快速跳转行首与行尾
" 移动多行
noremap <C-j> 5j
noremap <C-k> 5k

" 保存行(不含换行符)
nnoremap yir ^v$y
nnoremap yar ^v$y
" 保存行(不含换行符)
" 删除行(不含换行符)
nnoremap dir ^v$"_d
nnoremap dar ^v$"_d
" 删除行(不含换行符)
" 删除行(不含换行符)
nnoremap cir ^v"_C
nnoremap car ^v"_C
" 删除行(不含换行符)
" 删除&复制行(不含换行符)
nnoremap yxr ^v$x
" 删除&复制行(不含换行符)
" 选中行(不含换行符)
nnoremap vir ^v$
nnoremap var ^v$
" 选中行(不含换行符)
" 框选指定符号结束的多行
nnoremap vs( ^V/(<CR>%
nnoremap vs{ ^V/{<CR>%
nnoremap vs[ ^V/[<CR>%
nnoremap vs) ^V%
nnoremap vs} ^V%
nnoremap vs] ^V%
nnoremap vs; ^V/;<CR>

inoremap jk <Esc>
inoremap kj <Esc>
"inoremap <Space><Space> <Esc>
"nnoremap <Space>u :action ShowUsages<CR>
"gD可以替代这个

"Refactor
nnoremap <Space>n :action Inline<CR>
vnoremap <Space>n :action Inline<CR>

"Extract Method
nnoremap <Space>m :action ExtractMethod<CR>
nnoremap <c-m> :action ExtractMethod<CR>
vnoremap <Space>m :action ExtractMethod<CR>
vnoremap <c-m> :action ExtractMethod<CR>

nnoremap <Space>v :action IntroduceVariable<CR>
vnoremap <Space>v :action IntroduceVariable<CR>
nnoremap <Space>i :action ShowIntentionActions<CR>
nnoremap <c-i> :action ShowIntentionActions<CR>
nnoremap <Space>e :action ReformatCode<CR>
nnoremap <Space>l :action ReformatCode<CR>
nnoremap <Space>o :action Move<CR>
noremap \r <ESC>:source ~/.ideavimrc<CR>
"Rename
nnoremap <Space>r :action RenameElement<CR>
nnoremap <c-r> :action RenameElement<CR>
" g
nmap U :action $Redo<CR>
nnoremap <Space>p :action IntroduceParameter<CR>
nnoremap <Space>c :action ExtractClass<CR>

nnoremap <leader>v :action Vcs.QuickListPopupAction<CR>
nnoremap <Space>kh :action TypeHierarchy<CR>



" l
"noremap gl <ESC>:action <CR>
"打断点
nnoremap <Leader>bb :action ToggleLineBreakpoint<CR>

"查看所有断点
nnoremap <Leader>br :action ViewBreakpoints<CR>
" z
"noremap gz <ESC>:action <CR>
" close all but this

" compile
nnoremap <leader>r :action Maven.Reimport<CR>
" v
"noremap gv <ESC>:action <CR>
" b

nnoremap <leader>f :action FindInPath<CR>

狸猫不会跑大约 6 分钟Java开发工具VimJetbrains IDEA
在win10上使用dockerdesktop部署xiaoyaalist

在win10上使用dockerdesktop部署xiaoyaalist

小雅alist的官网:https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f

Alist官网:https://alist.nn.ci/zh/

因为本电脑使用curl命令拉取脚本无效,所以使用docker逐步构建

1.拉取xiaoya镜像

docker pull xiaoyaliu/alist

狸猫不会跑大约 1 分钟Win10DockerNASAlist影视工具
数据脱敏-通过mybatis拦截器

数据脱敏-通过mybatis拦截器

1. 添加脱敏拦截器

package cn.cmcc.common.datasource.config;

import cn.cmcc.common.utils.bean.ObjectUtils;
import cn.hutool.crypto.digest.DigestUtil;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import javax.annotation.PostConstruct;
import java.util.*;

/**
 * @author leijiahao
 * @date 2023-11-07
 */
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),})
public class DataMasInterceptor implements Interceptor {


    private List<String> encryptionList;
    private Set<String> targetMappers; // 存储目标 Mapper 的集合
    public DataMasInterceptor(Set<String> targetMappers) {
        this.targetMappers = targetMappers;
    }

    public static String maskChineseString(String input) {
        if (input == null || input.length() <= 2 || "null".equals(input)) {
            return input;
        }
        // 查找倒数两个汉字的索引
        int lastIndex = -1;
        int count = 0;
        for (int i = input.length() - 1; i >= 0; i--) {
            char c = input.charAt(i);
            if (isChineseCharacter(c)) {
                count++;
                if (count == 2) {
                    lastIndex = i;
                    break;
                }
            }
        }
        // 使用 * 号替换前面的部分
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < lastIndex; i++) {

            sb.append("*");
        }
        // 保留倒数两个汉字及后面的部分
        sb.append(input.substring(lastIndex));
        return sb.toString();
    }

    public static boolean isChineseCharacter(char c) {
        Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
        return block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || block == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
    }

    public static double maskLonLat(double value) {
        if (ObjectUtils.isEmpty(value)) {
            return value;
        }
        Random random = new Random();
        double offset = random.nextDouble() * 0.0001 + 0.0001;
        return value + offset;
    }

    @PostConstruct
    public void init() {
        encryptionList = new ArrayList<>();
        // TODO: 2023-11-08 设置加密字段
//        encryptionList.add("cgi");
//        encryptionList.add("enb_id");
//        encryptionList.add("enb_name");
//        encryptionList.add("enodeb_name");
//        encryptionList.add("cell_name");
//        encryptionList.add("cell_id");
//        encryptionList.add("project_name");
//        encryptionList.add("project_id");
//        encryptionList.add("user_name");
    }

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object arg1 = invocation.getArgs()[0];
        // 拦截通用查询,加密字段
        if ((arg1 instanceof MappedStatement)
//                && targetMappers.contains(((MappedStatement) arg1).getId())
                && !encryptionList.isEmpty()
        ) {
            Object result = invocation.proceed();
            if (result instanceof ArrayList) {
                ArrayList resultList = (ArrayList) result;
                for (Object o : resultList) {
                    if (o instanceof Map) {
                        Map<String, Object> resultMap = (Map<String, Object>) o;
                        for (String key : encryptionList) {
                            if (resultMap.containsKey(key)) {
                                if (key.endsWith("name")) {
                                    resultMap.put(key, maskChineseString(String.valueOf(resultMap.get(key))));
                                } else if (key.endsWith("lon") || key.endsWith("lat")) {
                                    resultMap.put(key, maskLonLat(Double.parseDouble(String.valueOf(resultMap.get(key)))));
                                } else {
                                    //MD5加密
                                    resultMap.put(key, DigestUtil.md5Hex(String.valueOf(resultMap.get(key))
                                                                               .getBytes()));
                                }
                            }
                        }
                    }
                }
            }
            return result;
        } else {
            return invocation.proceed();
        }
    }
}

狸猫不会跑大约 2 分钟JavaMybatisSpring安全
flask服务注册到nacos

flask服务注册到nacos

Java调用

1.添加pom依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

狸猫不会跑小于 1 分钟pythonnacos