格式
删除线
~~{content}~~
示例
加粗
**{content}**
示例
删除线
~~{content}~~
示例
加粗
**{content}**
示例
1 | pip3 install jupyter |
1 | jupyter notebook |
1 | 生成配置文件 |
1 | jupyter notebook --ip 0.0.0.0 --port 18800 |
1 | AttributeError: partially initialized module 'charset_normalizer' has no attribute 'md__mypyc' (most likely due to a circular import) |
解决
1 | pip3 install --force-reinstall charset-normalizer |
1 | jupyter lab --notebook-dir=$PWD --ip 0.0.0.0 --port 18800 --NotebookApp.token=token |
行存储和列存储用于描述数据组织方式,通常,行存储存取单位是整条记录,列存储存储单位是数据记录的一列。

| 姓名 | 年龄 | 省份 |
|---|---|---|
| Li | 25 | 山东 |
| Zhao | 23 | 北京 |
| Zhang | 22 | 辽宁 |
以上面数据为例,基于行存储,数据可能组织如下。
1 | Li,25,山东 |
基于列存储,数据可能组织如下。
1 | Li,Zhao,Zhang |
两者各有优劣,对比如下。
| 对比项 | 行存储 | 列存储 |
|---|---|---|
| 格式 | 按行存储 | 按列,每一列单独存储 |
| 粒度 | 记录 | 记录单列 |
| 索引 | 需要额外索引提高效率 | 数据即索引 |
| 读取 | 读取整条记录,可能存在冗余读取 | 按列多次读取,性能可能会更差 |
| 写入 | 一次写入,数据完整性更容易保证 | 按列多次写入,性能可能会更差 |
| 性能 | 建立索引、物化视图、冗余读写消耗大量资源 | 无需索引、视图 |
| 扩展 | 随着数据量增加为维持性能需要大量膨胀数据库 | 可横向扩展 |
| 应用 | OLTP | OLAP |
| 全量操作 | 全量更新、聚合字段效率差 | 粒度更细,效率较高 |
| 压缩 | 压缩率较低 | 每一列数据同质,无二义性,且顺序存储,可达到较高压缩率 |
关系型数据库一般采用行存储,存储结构化数据,随着数据量增加,要提升性能需要付出很大的代价。列存储数据库一般具备可伸缩、可分区的特点,可以高效实现数据序列化、存储、检索。
| 行存储 | 列存储 |
|---|---|
| MySQL | HBase |
| MongoDB |
docker command
1 | docker run -d --name koel \ |
koel.env
1 | APP_NAME=Koel |
启动后进终端运行。
1 | php artisan key:generate # 生成 APP_KEY |
忽略前端编译问题。
最后,账号密码。
1 | Username |
/etc/systemd/system1 | [required] 1. 创建可执行服务程序 |
1 | 启动 |
使用 LazyVim 进行配置。
1 | git clone https://github.com/LazyVim/starter ~/.config/nvim |
如果是通过 ssh 远程登录,需要在本地机器安装,并设置 terminal font。
1 | wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/JetBrainsMono.zip |
ubuntu
1 | sudo apt install fontconfig |
NeoVim 以 Buffer List 的方式管理打开的文件,每个打开的文件是一个 Buffer,并且有唯一的 id(:ls 可查看打开的文件列表及 id)。
. 命令重复上次的修改。
1 | # 缩进当前行 |
1 | gd # 跳转到上一个编辑的位置,可跨文件 |
1 | Ctrl+[,j/k # Ctrl+[ 后快速按 j/k 键可以移动当前行上移/下移一行,注意必须要快;此外 Ctrl+[ 后会进入 command 模式 |
默认是 \ ,如果使用 LazyVim,会被替换为 <Space> 空格键。
i、a、o 进入 Insert Mode
A 在行尾插入: 进入 Command Line Modev、V 进入 Visual Mode;v 按字符选择,V 按行选择Esc 中止该状态Esc、C+[ 进入 Normal ModeC+v 进入按块选择操作 = 操作符 + 动作命令
operation = {operator} + {motion}
. 重复上次操作; 重复上次 f 命令的查找, 上次 f 的反方向查找* 查找当前光标所在单词| 复合命令 | 等效命令 | 解释 |
|---|---|---|
| C | c$ | 删除从当前位置到行尾的内容,并进入插入模式 |
| s | cl | 删除当前光标所在字符,并进入插入模式 |
| S | ^c | 删除当前行,并进入插入模式 |
| I | ^i | 将光标移动到行首,并进入插入模式 |
| A | $a | 将光标移动到行尾,并进入插入模式 |
| o | A<CR> |
在下方新开一行,并进入插入模式 |
| O | ko |
在上方新开一行,并进入插入模式 |
| 命令 | 用途 |
|---|---|
| c | 修改 |
| d | 删除 |
| y | 复制到寄存器 |
| g~ | 反转大小写 |
| gu | 转换为小写 |
| gU | 转换为大写 |
| > | 增加缩进 |
| < | 减少缩进 |
| = | 自动缩进 |
| ! | 使用外部程序过滤{motion} 所跨越的行 |
| 目的 | 操作 | 重复 | 回退 |
|---|---|---|---|
| 修改 | {edit} | . | u |
| 行内查找下一个字符 | f{char}/t{char} |
; | , |
| 行内查找上一个字符 | F{char}/T{char} |
; | , |
| 文档内查找下一处匹配 | /pattern<CR> |
n | N |
| 文档内查找上一处匹配 | ?pattern<CR> |
n | N |
| 行内替换 | :s/target/replacement |
& | u |
| 执行一系列修改 | qx{changes}q |
@x | u |
1 | b # 移动光标到单词开头,不包含标点符号 |
>>、yy1 | vib / viB # 选中当前/下一个 () {} 内的内容,b: (), B: {} |
1 | <space>-e # 打开 NeoTree |
1 | bd # 删除当前 buffer |
1 | ? # 打开帮助框 |
1 | 行首添加 |
1 | z{?} |
进入 Normal 模式
在 Neovim 终端界面中,按 Ctrl+\ + Ctrl+N(快速连续按键)切换到 Normal 模式,之后可使用以下操作:
j/k:逐行上下滚动Ctrl+u/Ctrl+d:半屏滚动gg/G:跳转到顶部/底部退出 Normal 模式
i<C-b>/<C-f> 可以滚动 Preview 窗口修改 terminal font,以 iterm2 为例。字体可从 nerd fonts 下载。

场景是,登录到远程机器,并使用 nvim 编译,无法复制选中的文本,解决方案是使用快捷键,下面是 Max OS 下的快捷键操作,Windows/Linux 下可尝试探索。
1 | <option + 拖动鼠标> : 选中连续文本,可跨行 |
选中后,再按系统的复制快捷键即可(或右键弹出菜单、选择复制)。
核心思想是针对 fzf 窗口,自定义快捷键,调用 getreg() 来获取寄存器内容,搜索到使用 getreg(nr2char(getchar())) 命令,但是不行。在 init.lua 文件中添加任意一个方案的内容,在搜索时使用快捷键 Ctrl + V 即可粘贴寄存器内容。
方案一,使用 nvim 的 lua api 命令创建。
1 | local autogrp = vim.api.nvim_create_augroup("FZF", { clear = true }) |
方案二,使用 vim.cmd。
1 | vim.cmd([[ |
1 | :Mason |


修改 Mason 配置后,可手动唤出 Mason 面板安装。
1 | <space> -> <shift> + \ : 水平分屏 |
切换分屏。
1 | <ctrl> + H/左 : 左 |
1 | :checkhealth which-key |
1 | :"+y |
配置 V 模式下复制快捷键,修改 lua/config/keymaps.lua。
1 | -- 可视模式下 <leader>y 复制到系统剪贴板 |
Iterm2 额外配置

1 | nvim --headless "+Lazy! sync" +qa |
1 | :LspInfo # 打印 Lsp 信息,用于排查 |
1 | ~/.local/state/nvim |
1 | nvim --headless "+Lazy! sync" +qa |
1 | // 为当前函数添加测试代码 |
1 | 检查配置文件 |
centos 下 nginx 配置默认是在 /etc/nginx/nginx.conf 及 /etc/nginx/conf.d/。
1 | # 在配置文件的 server 配置的 location 配置中添加 autoindex on |
1 | upstream [us-name] { |
1 | 1. 安装 apache2-utils (Debian, Ubuntu) / httpd-tools (RHEL/CentOS/Oracle Linux) |
可能原因
修改 root
1 | # /etc/nginx/nginx.conf |
查看权限
1 | namei -om /home/wii/www |
查看 nginx 启动时使用的用户
1 | ps aux | grep nginx |
可以看到,nginx 使用 nginx 启动,且没有 /home/wii 的访问权限,可以通过 chomd 设置 /home/wii 的权限,或更换其他路径。
root 更换为 /www
1 | sudo mkdir /www |
使用 ginx-upsync-module 模块,下载 nginx 源码,然后把模块代码放在 modules 下,用下面命令编译 nginx。
1 | !/bin/sh |
1 | upstream main { |
mirror 有个坑,nginx 以 subrequest 的方式请求 mirror 地址,只有在所有 subrequest 完成之后才会处理下一个请求。如果用来复制流量给开发环境,那么开发环境的响应时间会作用在线上环境的请求上面。
1 | upstream main { |
1 | ## |
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。
在传统可变服务器基础架构中,服务器在创建之后会不断更新和修改,包括软件环境、配置等,在这种架构中存在配置漂移、雪花服务器等问题。配置漂移 是指对操作系统的更改不被记录,独特和可变的配置,无法/很难在其他机器复现。雪花服务器 存在配置漂移问题的服务器,很难被复制。凤凰服务器 对配置进行版本管理,减少或解决配置漂移问题。
在不可变基础架构/设施中,对配置进行版本控制,服务器一但部署,不会再手动更改。如需更新配置、软件环境,通过部署版本化的配置解决,或通过部署打包的公共镜像。这种方式,有更高的一致性、可靠性及可预测的部署过程。
AddressSanitizer (ASan) C/C++ 程序的内存错误检测器,可以检查如下错误。
1 | CMAKE_CXX_FLAGS |
指定 Asan Library 路径
1 | export LD_LIBRARY_PATH=/path/to/libasan.so.x |

1 | -fsanitize=address # 开启内存越界检测 |
示例
1 | ASAN_CFLAGS += -fsanitize=address -fsanitize-recover=address |
1 | ASAN_LDFLAGS += -fsanitize=address -g1 # 如果使用gcc链接,此处可忽略 |
ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。
1 | halt_on_error=0/1 # 检测内存错误后继续运行 |
更多
示例
1 | 1 |
1 | asan 链接sys |
1 | ==1867==ERROR: AddressSanitizer: heap-use-after-free on address 0x7f69c0e59823 at pc 0x000001f1f50c bp 0x7f69c02624e0 sp 0x7f69c02624d0 |