我把学习一个常识点的进程分为:搜集信息 -> 处理信息 -> 应试,这篇文章也会以这个脉络为大纲来写 搜集信息分为两步,即“收”和“集”。
“收”,即从多个渠道获取文章(这儿之所以明确是文章,是针对计算机学习。关于摄影或其他范畴的学习就不仅仅文章了,还有图片之类方法的信息,这时候或许就不适用了,请读者自行酌量运用),电脑端我是用简悦(简悦能够把网页文章转成本地 Markdown ),而手机端我是用Cubox(Cubox 能够把手机上收藏的文章在电脑翻开)。
“集”,即将信息聚组成自己的笔记,然鹅信息有很多种方法,比如 pdf、网页视频/音频、图片、网页文章等等。Obsidian 刚好能很好地聚合这些方法,本文也侧重解说我是怎么玩转 Obsidian 的。
处理信息则是在搜集信息后,怎么把这些常识变成自己的东西,也能够说是转化吧。
应试很好理解,即各种考试、面试。这一步看状况而定,像假如我学习这些东西仅仅为了提升自己,应对日常开发的话,是不需求应试的,由于我不记得了就随时能够翻这些笔记,但假如做笔记是为了考试和面试,那么应试这步却是不可或缺的一环,毕竟应试是为了背诵然后去经历考试的挑选,挺无奈的。。。
什么是 Obsidian
简略地说,Obsidian 是一款支撑双链的本地 Markdown 笔记软件,拥有海量高效的插件增强,而且支撑多渠道。 详细的介绍就不说了,毕竟这篇不是入门级攻略,入门级攻略请看:
- 闲者时刻_王掌柜关于 Obsidian 的系列文章
- Obsidian 优质中文内容合集
笔者曾经也用过几款笔记软件,就不点名了,以免有拉踩的嫌疑。终究挑选 Obsidian 的原因是由于它处理了我在信息搜集处理进程中的以下痛点:
痛点
- 在笔记中引证了某本书的一些话,过一段时刻想回原文讲究时却很难找到出处
- 在依据某本书学习时,想要摘录原文的一些话却只能自己跟着书手敲一遍到自己的笔记中
- 想对视频做笔记
- 在流程图中想对特定关键字跳转到某篇自己的笔记
- 想把笔记内容导入到 anki 去背诵
- 想把网页文章变成自己本地的一篇笔记
- 笔记之间能想维基百科那样跳转
那么 Obsidian 是怎么处理这些痛点的呢:
处理痛点
-
在笔记中快速引证 pdf 原文
(对应痛点:在依据某本书学习时,想要摘录原文的一些话却只能自己跟着书手敲一遍到自己的笔记中)
-
能跳转到 pdf 原文
(对应痛点:在笔记中引证了某本书的一些话,过一段时刻想回原文讲究时却很难找到出处)
-
能跳转到视频的某个时刻点
(对应痛点:想对视频做笔记)
-
在流程图中跳转到自己的笔记
(对应痛点:在流程图中想对特定关键字跳转到某篇自己的笔记)
-
把笔记内容导入到 anki 去背诵
(对应痛点:想把笔记内容导入到 anki 去背诵)
-
剪藏网页文章到本地
(对应痛点:想把网页文章变成自己本地的一篇笔记)
-
笔记之间能跳转
(对应痛点:笔记之间能像维基百科那样跳转)
假如 Obsidian 处理的痛点满意你的需求,能够看 Obsidian 的装置、根底运用,本篇文章不介绍根底运用
目前我现已运用了此学习流安稳输出了 823 篇笔记,累计运用时刻为 6 个月,经过以下笔记的 关系图谱
能够看到我写的一切笔记之间的联络,而且能够看出我对不同范畴的积累量(看笔记的数量,一个点代表一篇笔记)
搜集信息
运用 Obsidian 做笔记时能够在学习进程中做到真实的有迹可循,也能够让常识点之间解耦,使常识点原子化,以强化常识点之间的联络。
衔接电子书
展现
装备进程
运用东西
-
Annotator
- 是一个用于给 pdf 做标示和跳转的开源插件
-
Linter
- 是一个用于格局化笔记的开源插件
装备 Linter
方针:修正其源代码,增加将 Annotator 款式修正为
增加规矩分类:
增加详细的规矩处理:
代码如下:
new Rule('Reform Annotation', '修正 Annotation 链接的款式', RuleType.MINE, (text, options = {}) => {
const searchRegex = new RegExp(`${options['Find']}`, "gm");
text = text.replace(searchRegex, `${options['Replace']}`);
return text;
},[
], [
new TextOption('Find', 'regular expression for finding', "\\[\\[([^@]+)@annote#([^|]+)\\|([^\\]]+)\\]\\]"),
new TextOption('Replace', 'result of replacement', '[[$1@annote#$2|]]$3')
])
保存后退出 ide,并重启 Obsidian,翻开 Linter 的设置,并敞开新功用的开关
测验一下: (测验前) (测验后)
日常作业流
OCR 字体辨认
假如方针 pdf 文件不能选中文本,那么先用 Acrobat 进行字体辨认:
点击 修正
接着就会自动辨认文档了
标示 pdf
翻开一个 pdf 文件,左键选中要标示的语句,然后会自动弹出 Hightlight 按钮并点击,就能够完结一个语句的标示
接着按如下操作即可完结链接到 pdf 中的标示
衔接网页
实践是网页剪藏和标示
展现
实用东西
-
简悦(版别为 2.2)
- 这是一个能够把网页文章保存为本地 markdown 格局笔记的东西
- 处理问题:github.com/Kenshin/sim…
装备
装置简悦
- 在 chrome 网上应用店装置简悦的浏览器插件
- 装置成功后
- 装置能在 简悦 内运用的脚本插件 能够看到在 插件中心 有挺多脚本插件的 然后在 插件中心 下载以下脚本插件 由于很多技术文章的标题都带有特殊符号,这会导致导入 Obsidian 失败,所以还得装置以下插件处理该问题:
- 设置“导入到 Obsidian”
- 设置“Markdown 模板辅佐增强插件”
- 设置“自动化辅佐增强”
- 设置快捷键 使按 ob 时只导出全文
装备 Linter
修正 Linter 源代码,增加能够将图片外链转化成自己图床的链接 ps. 我运用的图床是 github,而且运用 PicGo 快速上传图片到图床。
首先引入 http、https、fs 库
var fs = require('fs');
var http = require('http');
var https = require('https');
增加自定义的办法
ps. 我的前端能力很菜很菜,献丑了。大佬们能够自己写这部分的功用。这段代码的逻辑便是先在本地新建一个文件夹 temp_pic_folder
,然后经过正则表达式匹配到图片链接,然后经过这些链接把图片一个一个下载到文件夹 temp_pic_folder
中(没错,便是那么弱智的办法,由于不想在这方面花太多时刻,毕竟作业是后端),然后再把下载下来的图片一个一个上传到用户设置的图床中,并修正文章中这些图片链接为终究图床上的图片链接,最终再把文件夹 temp_pic_folder
及其内部的图片都从本地删了。
留意!我这段代码只能匹配结束有图片文件后缀名的链接,如 ,假如是
https://xxxx/xxx/.../xxx
就不能辨认,别问我为什么不处理这种状况,懒且够用
/**
* 将外链图片链接转化为自己的图床链接
*
* @param text 文档的文本
* @param options 插件在 setting tab 的设置
*/
async changeOuterLink (text, options = {}, app) {
// 获取当时修正文档的所在文件系统的绝对地址
const tempFolder = "temp_pic_folder";
const anchorFile = "anchor_file";
const parentPath = app.vault.getAbstractFileByPath(app.workspace.getActiveFile().path).parent.path;
// 以 \ 为分隔符的就当作是 path const tempFolderRelativePath = parentPath + "\\" + tempFolder;
// 以 / 为分隔符的就当作是 url const tempFolderRelativeUrl = parentPath + "/" + tempFolder;
const anchorFileRelativeUrl = tempFolderRelativeUrl + "/" + anchorFile;
const basePath = app.vault.adapter.getBasePath();
const absolutePath = basePath + "\\" + tempFolderRelativePath;
// 匹配图片网址的正则表达式(已测网站图床包括:知乎、CSDN等)
const searchRegex = new RegExp(`${options['Image regex']}`, "gm");
// 自己图床的 url let myPicBedUrl = `${options['Host']}` + `${options['Repository']}`;
// 现已下载的文件的列表
let fileList = [];
// 文件名到其相应文件后缀的映射
let fileExtMap = {};
// 下载图片后返回的多个 promise let promiseList = [];
// 寄存图片的文件夹里的文件列表
let tempFileSet = new Set();
let folderAbstractFile = app.vault.getAbstractFileByPath(tempFolderRelativeUrl);
if (folderAbstractFile) {
// 将文件名保存到 set 中
let downloadedPicList = app.fileManager.getNewFileParent(anchorFileRelativeUrl).children;
for (let i = 0; i < downloadedPicList.length; i++) {
tempFileSet.add(downloadedPicList[i].basename);
}
} else {
// 创立寄存图片的文件夹
await app.vault.createFolder(tempFolderRelativePath);
folderAbstractFile = app.vault.getAbstractFileByPath(tempFolderRelativeUrl);
await app.vault.create(anchorFileRelativeUrl, "");
}
text = text.replace(searchRegex, (rs, $1, $2) => {
// 检查是否是自己图床的图片
if ($1.indexOf(myPicBedUrl) === -1) {
// 检查本地是否现已下载
let picName = $1.slice($1.lastIndexOf('/') + 1).toString();
if (!tempFileSet.has(picName)) {
let perPromise = new Promise((resolve, reject) => {
let request;
if ($1[4] === "s") {
request = https.get($1 + $2, (res) => {
if (res.statusCode !== 200) {
console.log("download image error!");
return; }
let ext = res.headers['content-type'].split('/')[1];
let dest = absolutePath + "\\" + picName + "." + ext;
let file = fs.createWriteStream(dest);
res.on('end', () => {
console.log("图片下载完毕");
});
// 进度、超时等
file.on('finish', () => {
file.close();
fileList.push(dest);
fileExtMap[picName] = ext;
resolve();
}).on('error', (err) => {
fs.unlink(dest);
});
res.pipe(file);
});
} else {
// todo http 的不管用
// 和 https 一样的代码
}
request.on('error', reject);
request.end();
});
promiseList.push(perPromise);
} else {
console.log("图片已存在");
}
} else {
console.log("自己的地址");
}
return rs;
});
return Promise.allSettled(promiseList)
.then((results) => {
console.log("文件列表 " + fileList);
if (fileList.length > 0) {
return new Promise((resolve, reject) => {
const postOptions = {
hostname: `${options['PicGoUrl']}`,
port: `${options['PicGoPort']}`,
path: `${options['PicGoPath']}`,
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
}
const req = http.request(postOptions, async res => {
if (res.statusCode === 200) {
console.log("删去图片文件夹 " + folderAbstractFile.path);
await app.vault.delete(folderAbstractFile, true);
// 正则替换图片地址
text = text.replace(searchRegex, (rs, $1) => {
console.log("替换链接名");
// 依据文件名在 map 中找到对应的后缀
let picName = $1.slice($1.lastIndexOf('/') + 1);
let ext = fileExtMap[picName];
return "![](" + myPicBedUrl + picName + "." + ext;
});
} else {
console.log("上传失败");
}
resolve(text);
});
req.on('error', error => {
console.error(error);
reject(error);
});
req.write(JSON.stringify({list: fileList}));
req.end();
});
} else {
return new Promise((resolve, reject) => {
resolve(text);
});
}
});
}
该办法调用途也要做修正:
由于 changeOuterLink
办法是异步的,所以调用该办法的当地要加上 await
然后在 rules 上增加新的规矩
new Rule('Upload Image', 'Switch', RuleType.MINE, (text, options = {}, app, changeOuterLink) => {
return changeOuterLink(text, options, app);
},[
], [
new TextOption('PicGoUrl', '', "127.0.0.1"),
// PicGoPort 是 picgo 默认的端口号
new TextOption('PicGoPort', '', "36677"),
new TextOption('PicGoPath', '', "/upload"),
new TextOption('Host', 'target host', "https://raw.githubusercontent.com"),
// Repository 为 github 的仓库名
new TextOption('Repository', '', "/xxx/xx/"),
new TextOption('Image regex', '', '\\!\\[[^\\[\\]]*\\]\\(([a-zA-z]+://[^/]+/[^.?)]+)([^)?]*)')
])
日常作业流
导出全文
在网页内按 ob
,会看到如下画面
能够看到现已增加成功了
依据我个人拟定的信息可信度规范(一般是依据文章结束写的参考文献数量,假如是没写参考,除非是自己的一些经验总结,不然我都以为是抄袭,而且以为其参考价值极低,之所以会剪藏这篇低参考价值的文章仅仅是由于其他文章写得更烂),给文章增加可信等级标识
导出标示
当做了第一个标示后,文章信息框会呈现
修正文章信息框内的内容
其中,假如文章不是很可信,那么一定要设置对应的参考价值的标签:
信息处理完后给文件做符号
每个网页的信息处理进程如下图的复选框,三个选项都完结后就要给该文件增加一个图标,标识该文件现已处理完结
在阅览文章的进程中,不是很重要的语句就用 加粗
,特别重要的语句就用 高亮
, 把文章阅览完结后写一个 总结
,完结这三步才算真实看完一篇文章
衔接视频
展现
装备
运用东西
-
Media Extended
- 运用这个插件能够播映网络视频并能跳转进度条(我已测验能行的网站有 youtube,其他没试过)
-
Media Extended BiliBili Plugin
- 这个插件是支撑播映 bilibili 视频并能跳转进度条的插件
-
Regex Find and Replace
- 该插件可用于正则表达式查找和替换
-
Language Reactor
- 这是个 chrome 插件,能够在看 youtube 的时候把英文字幕翻译成中文(或其他言语),而且能选中字幕中的单词检查释义甚至能够把单词加入生词库,在生词库能够运用类似 anki 的温习方法背诵单词
装置 Obsidian 插件
直接在 Obsidian 里搜 Media Extended、Media Extended BiliBili Plugin 和 Regex Find and Replace 就能够下载了
装置 chrome 插件
设置 Regex Find and Replace
修正该插件的源代码
// 匹配 xxs
let regDocumentText = documentText.replace(/(^[0-5]?[0-9])s$/gm, (rs, $1) => {
return ">[" + $1 + "s](" + replaceString + "#t=" + $1 + ")";
});
// 匹配 mm:ssregDocumentText = regDocumentText.replace(/(^[0-5]?[0-9]):([0-5][0-9])$/gm, (rs, $1, $2) => {
return ">[" + $1 + ":" + $2 + "](" + replaceString + "#t=" + ($1 * 60 + $2 * 1) + ")";
});
// 匹配 hh:mm:ssregDocumentText = regDocumentText.replace(/((^[0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]))$/gm, (rs, $1, $2, $3) => {
return ">[" + $1 + ":" + $2 + ":" + $3 + "](" + replaceString + "#t=" + ($1 * 60 * 60 + $2 * 60 + $3 * 1) + ")";
});
editor.setValue(regDocumentText);
第一个正则表达式 ([0-5]?[0-9])s$
是转化 xxs\n
格局的字符串
第二个正则表达式 ([0-5]?[0-9]):([0-5][0-9])
是转化 m:ss
或 mm:ss
格局的字符串
第三个正则表达式 (([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]))$
是转化 hh:mm:ss
格局的字符串
以上一致终究转化为 >[$1s](网址#t=$1)
之所以要设置以上正则,是为了匹配 Language Reactor 生成的字幕文件,下面作业流会介绍到
然后设置一下该插件的快捷键:
日常作业流
导出视频的中英字幕
先翻开 Language Reactor
一开始翻开某个视频或许默认是中文字幕,要改成英文的:
点击 设置 检查字幕状况:
(一般没有人类翻译的话相应的单选框是挑选不了的) 由于依据上图能够知道这个视频是有人类翻译的,所以导出字幕时能够仅仅导出英文字幕和人类翻译:
接着按 导出 就会弹出字幕的 html:
接着 ctrl + a
全选整个 html 而且 ctrl + c
仿制:
新建新的关于这个视频笔记的 markdown 并刺进自己设置好的视频模板(其实就仅仅一些元数据):
接着在这个 markdown 里 ctrl + v
一下,能够看到仿制进来了,而且把选中的这三行没用的信息删了:
运用正则替换修正字幕笔记的格局
仿制一下视频的地址:
回到刚刚新建的笔记,按 ctrl + alt + f
进行正则替换:
能够看到替换成功了
留意:想跳转视频一定要切换到 检查视图
接着你就能够给这个视频的 markdwon 上做笔记了
衔接图片
展现
装备
运用东西
-
Excalidraw
- 该插件能够在 obsidian 中画各种图(有点像 visio)
- 能够去 这儿 大约试用一下
装置 Obsidian 插件
直接在 Obsidian 里搜
日常作业流
在需求跳转到某个笔记时,运用文字东西输入笔记链接就行了(语法和 Obsidian 的一样),如下图:
处理信息
处理信息的方法能够仿照维基百科,毕竟是运转了那么多年的渠道,必定有可取之处 我以为处理信息有几个比较重要的点:
- 常识点原子化
- 常识点之间的链接跳转
- 可信度标识
- 常识点的转化
- 常识点的归类
常识点原子化和常识点之间的链接跳转
常识点原子化
和 常识点之间的链接跳转
之间是相得益彰的
比如常识点——红黑树,红黑树是一种自平衡二叉树,红黑树和自平衡二叉树是独立的两篇文章,红黑树这篇文章运用链接的方法跳转到自平衡二叉树,而不要由于红黑树和自平衡二叉树有关就把两者写在一篇文章内
实践应用:
可信度标识
一般我对剪藏进笔记的文章都会增加上如下的可信度标识:(高参考价值的不需求标识) 我简略列一下自己拟定的==可信度规范==:
- 有标明牢靠的信息源
- 直接引证一手信息源
- 其被引证的信息源有引证一手信息源
- 文章内容
- 条理是否清晰
- 是否有自己的思考,有自己关于一个常识的转化(图、费曼学习法度描绘等等)
接着依托于以上的规范,我设置了以下==可信等级==:
-
高参考价值
- 标识:无
- 规范
- 满意一切可信度的规范
- 举例
- 没有修正主张的维基百科条目 如下: 但像下面这个便是有修正主张的:(有修正主张说明该条目有误)
- 官方文档
- 经典英文版计算机的书(如黑皮书等很多很多书)
- 源代码
-
中参考价值
- 标识
- 规范
- 不满意高参考价值的规范
- 有标明信息源,但短少一手资源
-
低参考价值
- 标识
- 规范
- 不满意中参考价值的规范
- 没有标明任何信息源
- 由于自己不明白这方面的常识,而且其他文章写得更烂,所以有那么一点点参考价值
-
不录入
- 标识:无
- 规范
- 不满意低参考价值的规范
- 文章写得没有条理,所以不录入我的笔记系统中
为什么要设置可信度规范? 由于网络上的信息良莠不齐,当你引证了这篇文章最好做一个符号,符号这个文章可不可信,假如不符号,等过一段时刻回头看就不知道这篇文章靠不靠谱,假如不靠谱还信了里面的内容,那真的是害了自己
常识点的转化
每个网页的信息处理进程如下图的复选框,三个选项都完结后就要给该文件增加一个图标,标识该文件现已处理完结
在阅览文章的进程中,不是很重要的语句就用 加粗
,特别重要的语句就用 高亮
, 把文章阅览完结后写一个 总结
,完结这三步才算真实看完一篇文章
总结
是能够是简略的常识导图,也能够是用自己的话去描绘一遍(即费曼学习法)
常识点的归类
在刚新建笔记时,给笔记增加标签,标签的作用便是分类
应试
衔接 anki
展现
装备
运用东西
-
Obsidian_to_Anki
- 该插件能够将笔记内的一段文字导入到 anki,而且导入后成为一个卡片后还能跳转回 obsidian
- 装置流程
日常作业流
初始创立
在笔记顶部增加:
ctrl + alt + l
格局化整篇笔记(能够一起将图片保存到自己的图床)
alt + s
删去笔记的剩余空行
增加卡片
卡片类型有两种:
- Neuracache flashcard style
- 即简略的正反面卡片
- Cloze Paragraph style
- 即挖空原文的卡片
Neuracache flashcard style
在问题后空格增加标签 #flashcard,在问题下紧接着的一行有必要跟上回答
确保问题的顶部和答案的底部都有空行
alt + a
同步到 anki
Cloze Paragraph style
这是完形填空式的笔记,两个空行之间的内容会被放进卡片中
用 {}
包围住需求挖空的文本,假如文本中有多个需求被挖空的目标,则全体一致运用 {1:文本}
(冒号前的数字表示所属的分组,数字相同则属于同一组,同组的会一起被挖空)
出来的作用:
alt + a
同步到 anki
删去卡片
在生成的 id 上一行增加 DELETE
alt + a
同步到 anki
结束
这篇文章结束就不写参考了,由于纯纯是我的经验分享,如有雷同是他抄我的。 该给的链接都给了,希望大家不要忘了给那些开源插件点个 star 哦~
本博客一切文章除特别声明外,均选用CC BY-SA 4.0 协议,转载请注明出处!