更适合开发者的知识管理方案

年底了,不少开发者都开始做年终总结,总结一年来学习的各种知识点,年初目标完成了多少,明年又要计划做什么?期间可能要翻翻自己的笔记、代码、开发文档!看着满满的知识体系,内心应该都是十分有成就感的!

我之前一直是使用有道云笔记的 Markdown 来总结知识的,个人感觉就是两个字“好用”,小而美的字体,兼容大部分 Markdown 平台(简书、Github、Hexo)的渲染样式,实时预览,跨平台,分享,导入导出等!配合一个 Chrome 浏览器插件,完全可以解决我的基本需求!

对于记笔记而言,它已经足够优秀了。但是,对于开发者而言,做笔记固然重要,因为这是经验的累积,更重要的是做笔记的意义,使自己受惠,在阅读,检索笔记上,大多数云笔记都做的不好,有的甚至出现笔记丢失的情况!

需求

我有一个博客,经常整理一些东西发在上面,我一般是直接在有道云笔记中复制出来,因为笔记头部信息中没有类似于

1
2
3
4
title: 更适合开发者的知识管理方案
categories: [Markdown]
tags: [Markdown,VNote,PicGo,OneIndex,OneDrive,Arch Linux]
date: 2020-01-05 03:22:26

这样的模板,所以每次都要生成一遍,再粘贴内容,稍微修改一下,否则 Hexo 不会识别和分类

我经常记录一些代码段,这对程序员来说很正常,谁没有存过一些 Spring 的配置呢(手动滑稽)?通常大的代码段下去,会占用大量的可视空间,鼠标滚轮就要没停,所以我会在 Markdown 中插入 details 标签来收缩一些内容

1
2
3
4
5
<details>
<summary>收缩标题</summary>

内容描述。。。
</details>

有时候写一些注意事项,可能还需要在标签中添加 style="color:#ff0000" 这样的颜色样式,方便观看,那么就要手写很多重复的操作

有时候,我需要在文档中插入一些图片,我一般会使用 Chrome 中的微博图床插件,唯一缺点是我得登录一下微博才能使用(原谅我太懒),后来我用了 PicGoGithub ,感觉还不错,借助 Github 的无限存储,也不用怕资源丢失,就是上传慢了点(敲碎狗头),所以后面基本上是使用的 PicGo 中的 SM.MS 图床

我的第一篇博客比较长,就是这个【ArchLinux搭建Java开发环境】,统计了下,三万多字吧!里面涉及到各种资源,安装包,依赖包,有下载地址的附地址,没有下载地址的提供地址,用过百度网盘,老是失效啥的,太狗了,Google Driver 啥的国内人有看不到,虽然里面有翻墙教程,翻墙工具又没有,后来用了个 MEGAsync 网盘,感觉也还不错,用来同步和分享一些文件

写好的笔记和博客,不只是分享,我自己有时候也会看,比如好多关于 Linux 的配置,那些脚本,命令啥的,没必要记的长条命令,或者几个月都用不到一次的命令,电脑一生只配置一次的命令,比如

1
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"        #查看日志,以后直接输入 git lg 即可

这样少用又好用的东西,怎么能不收藏一下,万一找不到了呢!(多可惜)

想知道我刚才怎么十秒钟找到这个长命令的么?

20200105044215.png

直接高级检索文件夹,精确到文件的 394 行,找到匹配项(就问你六不六)

基本是可以说解决了看笔记,找笔记,整理笔记的大难题!

安装 PicGo

这个比较容易,windows 用户直接上下载页下载即可,然后配置 Github 可以看我博客【图床工具PicGo+Github】,将 Github 图床设置为默认图床,并且在 PicGo 开启 Mini 窗口置顶和上传提示即可

使用的时候,直接用系统截图到剪贴板快捷键,然后右击 Mini 窗口,选择剪贴板图片上传即可

安装 Onedrive

windows 用户直接在微软商城就有下载,注册账号啥的,这个应该不需要教!这里主要讲下 Arch Linux 的安装,其他的 Linux 用户可以直接看项目文档

1
2
3
4
5
6
sudo pacman -S curl sqlite dlang    #安装这三个东西

git clone https://github.com/skilion/onedrive.git #克隆项目到本地
cd onedrive #进入项目文件夹
make #编译
sudo make install #安装

安装成功之后,你会发现这个是没有客户端的,也就是说它没有图形界面,你在开始菜单中找不到它的,所以直接在终端启动

1
onedrive    #运行

由于是首次运行,会出现一段非常长的链接,然后提示你回车提交链接;这时候在浏览器中打开终端中这个链接,然后接受 Onedrive 的授权,授权成功会跳转到一个空白页面,将空白页面地址栏的链接复制,粘贴到终端提示中,回车即可

20200105050812.png

像这样,之后它下载一些配置,并且在 ~/ 目录创建一个 OneDrive 文件夹,并且同步一写数据和配置信息,将它们下载到本地

1
2
3
systemctl --user enable onedrive    #开机自启 Onedrive 同步
systemctl --user start onedrive
systemctl --user status onedrive #查看运行状态
注意:千万,千万要记住正确的 Onedrive 正确使用方式

如果本地 ~/OneDrive 中没有文件,被我们手动删除,一定不要运行 onedrive 命令,onedrive 命令不带参数运行的时候,首先是进行上传,发现没有文件,匹配之后就会将云端所有文件删除,在进行下载同步!正确操作应该是运行 onedrive -d 仅下载!

如果登录状态失效,运行 onedrive -d 命令的时候提示使用 --logout 重新登录,那么首先使用 onedrive --logout 再运行 onedrive 命令,他会和首次运行一样,先从云端下载,再进行同步,这时候如果你还有修改过,没有同步到云端的文件,他会提示你是否修改,一定记得点No,否则修改过的文件会被云端的历史文件覆盖,所有修改操作宣布作废

搭建 OneIndex

OneIndex 主要是给 Onedrive 提供一个网页的下载页面,这样我们至于要将文章中用到的安装包放在 ~/OneDrive 文件夹下,就可以自动上传到你的网盘中,然后给指定的文件夹提供一个网页版的访问页面,可以直接点击文件即可下载

20200105053005.png

类似于 163 源的那种 FTP 文件服务器效果;安装方法也很简单,去 Vultr 准备一台 Debian 系服务器(Ubuntu、Debian 都可以,我是 Debian 10),配置好 SSH 公钥后使用命令登录

1
ssh root@139.180.202.71

首次会提示存储秘钥,输入 yes 回车即可登录上去

安装 Docker

首先需要安装下 Docker 容器,这里直接参照官方文档安装

1
2
apt update # 检查源更新
sudo apt install docker.io # 安装docker

安装成功可以运行 docker --version 查看版本及 docker ps 查看容器(一般为空)

然后就可以正式安装 OneIndex 容器了

1
docker run -d --name oneindex -p 8080:80 --restart=always -v ~/oneindex/config:/var/www/html/config -v ~/oneindex/cache:/var/www/html/cache -e REFRESH_TOKEN='0 * * * *' -e REFRESH_CACHE='*/10 * * * *' setzero/oneindex    #直接运行OneIndex容器

运行成功可使用 docker ps查看运行状态

1
2
3
root@pixiv:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06e8135dc8f9 setzero/oneindex "/docker-entrypoint.…" 43 hours ago Up 43 hours 0.0.0.0:8080->80/tcp, 9000/tcp oneindex

如果后期你想停止容器和删除容器可以用以下两个命令

1
2
docker stop oneindex    #停止
docker rm -v oneindex #删除
绑定域名

刚好我在 Godaddy 有个域名,所以我就直接使用它去解析一条 A 记录到 139.180.202.71 服务器

类型 名称 TTL
A ftp 139.180.202.71 1小时

然后可以 ping ftp.teaper.dev 看看解析生效没有

注意:如果你的主机是 Vultr 的主机的话,是无法解析到服务器去的

这时候就需要先在 Vultr 创建一个 Domain

20200106031945.png

并且将 Godaddy 中的 DNS 解析记录复制到这个 Domain 中

20200106032051.png

最后在 Godaddy 中修改域名服务器为 Vultr 的 ns1.vultr.comns2.vultr.com

20200106032212.png

安装 Caddy
1
2
curl https://getcaddy.com | bash -s personal # 安装Caddy
which caddy # 检查caddy是否安装成功,若成功则输出/usr/local/bin/caddy

Caddy 的使用需要配置 Caddyfile,且需要一个文件夹放置 SSL 证书。以下代码功能是创建 Caddy 运行所需的文件夹

1
2
3
4
5
6
mkdir /etc/caddy                      # 在指定目录创建 caddy 文件夹
touch /etc/caddy/Caddyfile # 创建 Caddyfile 文件,用于稍后的配置
chown -R root:www-data /etc/caddy # 文件夹权限设置
mkdir /etc/ssl/caddy # 创建文件夹,存放 ssl 证书
chown -R www-data:root /etc/ssl/caddy # 文件夹权限设置
chmod 0770 /etc/ssl/caddy # 文件夹权限设置

设置 Caddy 令其开启自启动

1
2
3
4
curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service   # 从 Github 下载 systemd 配置文件
systemctl daemon-reload # 重新加载 systemd 配置
systemctl enable caddy.service # 设置 Caddy 服务自启动
systemctl status caddy.service # 查看 Caddy 状态,现在应该是 not run 状态

配置 Caddyfile 文件

1
2
3
4
5
echo "ftp.teaper.dev {
gzip
tls www@teaper.dev
proxy / http://127.0.0.1:8080
}" > /etc/caddy/Caddyfile # 请修改代码后全选复制,这个不要一行一行地复制粘贴

这里你们主要替换掉 ftp.teaper.devwww@teaper.dev 即可,端口 8080 是和 docker ps 中保持一致的

1
systemctl restart caddy.service # 重启 Caddy 服务

查看一下运行状态,如果显示和我这个一样,应该就已经实现 HTTPS 访问了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@pixiv:~# systemctl status caddy.service    #查看运行状态
● caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: en
Active: active (running) since Mon 2020-01-06 03:09:26 CST; 9s ago
Docs: https://caddyserver.com/docs
Main PID: 3059 (caddy)
Tasks: 6 (limit: 1149)
Memory: 4.6M
CGroup: /system.slice/caddy.service
└─3059 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=

Jan 06 03:09:26 pixiv systemd[1]: Started Caddy HTTP/2 web server.
Jan 06 03:09:26 pixiv caddy[3059]: [INFO] Caddy version: v1.0.4
Jan 06 03:09:26 pixiv caddy[3059]: Activating privacy features... [INFO][cache:0
Jan 06 03:09:26 pixiv caddy[3059]: done.
Jan 06 03:09:26 pixiv caddy[3059]: Serving HTTP on port 80
Jan 06 03:09:26 pixiv caddy[3059]: http://ftp.teaper.dev
Jan 06 03:09:26 pixiv caddy[3059]: [INFO] Serving http://ftp.teaper.dev
Jan 06 03:09:26 pixiv caddy[3059]: Serving HTTPS on port 443
Jan 06 03:09:26 pixiv caddy[3059]: https://ftp.teaper.dev
Jan 06 03:09:26 pixiv caddy[3059]: [INFO] Serving https://ftp.teaper.dev
后续部署

配置成功之后就可以在浏览器打开域名网址开始部署,像这样 https://ftp.teaper.dev

20200105060324.png

20200105060407.png

这里点击蓝色的获取应用ID和机密,会跳转到 Onedrive 的官网,获取 client_idclient_secret

20200105060636.png

20200105060656.png

将 OneDrive 那边获取到的 client_idclient_secret 配置到 OneIndex 中(图二),确定无误后点“下一步”绑定账号,然后会提示授权啥的,最后提示安装成功,授权成功之后会在微软隐私中创建一个应用
注意:如果没有提示安装成功,而是转到了一个 http://127.0.0.1:8080?code=**** 之类的地址,将地址中的 http://127.0.0.1:8080 替换为 https://ftp.teaper.dev 这个域名地址即可

20200105061112.png

接下来就是配置 OneIndex 后台,打开 https://ftp.teaper.dev/admin ,输入初始密码 oneindex

  • 基本设置:网站名称、网站主题 nexmoe、OneDrive 起始目录 /share/ (没有就创建一个)
  • 页面缓存:本地同步上传文件之后,如果 https://ftp.teaper.dev 没有刷新文件列表,可以点一下重建缓存
  • 修改密码:这个不用多说了吧!

到这里基本也就结束了,如果我们要分享一个文件给别人,只需要把文件放在 ~/OneDrive/share 文件夹中,他会自动上传到 OneDrive 中,并且你打开 https://ftp.teaper.dev 可以看到文件,右击获取文件的下载地址 ,将其插入到你的 Markdown 中即可

常见问题:浏览器报错 404 或 500 错误,或者微软应用授权被删除

如果是报 404 Site 139.180.202.71 is not served on this interface 表示你的域名已经解析好了,后面所有要填写 http://139.180.202.71 的都改成 https://A记录.顶级域名 的方式

如果报 500 的服务器内部错误,首先 systemctl status caddy.service查看运行状态,必须必须是我上面提供那样的日志那样的,有 [INFO] Serving http://ftp.teaper.dev[INFO] Serving https://ftp.teaper.dev 而不是什么 [INFO] Serving https://ftp.teaper.dev:1080[INFO] Serving https://ftp.teaper.dev:80 这样的,确定这个没有问题后,使用 docker stop 停止对应容器,删除~/cache 文件夹,然后重启容器,他会重新创建 cache 文件夹,最后登录域名地址 https://ftp.teaper.dev重新部署授权即可

如果是 systemctl start caddy.service 首次启动都启动不起来的,建议换个最新的主机,因为可能是系统太老导致用了老的内核

安装 VNote

最后就是我们的主角 VNote 上场了,windows 用户直接去 GitHub releases 下载安装包即可

1
sudo pacman -S vnote-git    #ArchLinux 安装

首次打开会提示需要创建一个文件夹,这里就选择 ~/OneDrive/开发经验 ,因为我们希望自己的笔记可以同步到云服务器上,让它自己保存嘛!

Screenshot from 2020-01-04 10-43-35.png

首先介绍下布局,最上面是菜单栏,这没啥好说的;其次是工具栏,除了常用 Markdown 样式按钮之外,有三个非常好用的东西

  • 灵犀页(Ctrl+Alt+L):可以用来打草稿,比如想写又不知道写什么的时候
  • 快速访问(Ctrl+Alt+I):可以右击文档设置,快速访问只能设置一个文档文件
  • 通用入口(Ctrl+G):比高级搜索还方便的工具,输入 qArchlinux可以在全部笔记中搜索名字带 Archlinux的文件夹或笔记;输入 agit可以在全部笔记中搜索带 git内容的笔记;第一个字母是搜索选项,后接搜索内容,基本上可以做到搜到即打开,打开及定位(吹爆)

左边是导航栏,分为两块,上半部分显示 开发经验 文件夹下的所有子文件夹(注意:文件不显示);下半部分显示文件夹中的文件,你要单击 ~/OneDrive/开发经验下的子文件夹才会有出现,导航栏在编写文档过程中可以隐藏(快捷键:Ctrl+E,E)

中间是编辑区,右击文件夹新建笔记的时候打开,打开之后可以使用 Markdown 自由书写,同样可以使用一个快捷键 Ctrl+E,I 打开一个预览面板

20200105065004.png

左边是工具栏和高级搜索栏,工具栏可以看文章大纲、添加和使用片段、小推车。文章大纲就会看文件标题结构的,片段是一些常用的内容,配合幻词可以插入你想要的东西,可以点击 + 添加三个片段 detailsdetails-redspan-red,类型选择纯文本,例如:

1
2
3
4
5
<details>
<summary>$$@@</summary>


</details>
1
2
3
4
5
<details>
<summary style="color:#ff0000;">$$@@</summary>


</details>
1
<span style="color:#ff0000;">$$@@</span>

这样我每次需要使用的时候,只需要双击片段名称就可以在文本中插入这些标签,也可以选中文字后再双击片段名称,它会插入标签,并把 $$@@ 替换为你选中的文本

小推车的话,就类似于购物车,在导航栏右击笔记,添加到小推车,就会出现在这个小推车列表,结算方式就是文件菜单 -> 导出,选择导出笔记下拉中的小推车,这个好处就是你可以批量导出你想要的文章,而且导出格式可以选择 PDF 等,也算是个非常赞的小功能吧!

20200105070544.png

左边的搜索模块是高级搜索 ,普通的编辑区搜索是 Ctrl+F,高级搜索是 Ctrl+Alt+F,可以检索到 ~/OneDrive/开发经验及其同级文件夹,甚至是电脑根目录 / ;一般普通高级检索就好了,当然还可以正则匹配,模糊查询什么的可以选择,检索过程也提供了日志输出面板(我一般不开)

最底下是状态栏,会显示当前文档的行列字数信息,在旁边有个添加标签选项(我喜欢),我一般保持和 Hexo 的一致,添加标签后,就可以在导航栏左边的标签列表中快速分类选择

最后一个就是我开头讲的模板,我 Hexo 需要的那种格式开头,这个在右击文件夹 -> 新建笔记,在弹出的快捷菜单中有个模板选项,点击右边的文件夹图标,手动创建两个 Markdown 文件,note.mdblog.md,内容如下

1
## <center>%no%</center>
1
2
3
4
5
6
---
title: %no%
categories: [categories]
tags: [tag1,tag2]
date: %yyyy%-%MM%-%dd% %time%
---

在新建笔记的时候可以选择套用哪个模板,他会自动将文件名替换到 %no% 的位置,还有一些时间的替换,更多参数可以看官方文档的幻词

最后,如果你和我一样拥有一个 Hexo 博客的话,可以直接将文件夹地址设置为 ~/OneDrive/hexoblog/source/_posts/开发经验 ,三位一体武魂融合技(手动狗头)

常见问题:无法读取目录文件夹或者目录结构不正确

VNote 在每个文件夹下都使用了一个 _vnote.json 用来存储目录结构,如果该文件不存在,就会提示重新修复,如果存在,但是里面的 json 配置出错,就会读取不出文件目录,除了 _vnote.json之外,也在每个文件夹下创建了一个 _v_recycle_bin 文件夹,用来存放在 VNote 中被删除的文件,在编辑区右击文件标题选择回收站可以看到所有被删除的文件