CS1-必学工具
翻墙
此链接出现在这里纯属二进制 bit 的随意组合,与本人毫无关系。
英文
此技能是通往后续所有课程的起点,与学习者个人有紧密关系。
工具集
此站点汇总了全球前沿技术指南工具,所有资源均来自网络。
Agent Center,正招募伙伴一起建设中。
侵删
Vim
为什么学习 Vim
在我看来 Vim 编辑器有如下的好处:
- 让你的整个开发过程手指不需要离开键盘,而且光标的移动不需要方向键使得你的手指一直处在打字的最佳位置。
- 方便的文件切换以及面板控制可以让你同时开发多份文件甚至同一个文件的不同位置。
- Vim 的宏操作可以批量化处理重复操作(例如多行 tab,批量加双引号等等)
- Vim 是很多服务器自带的命令行编辑器,当你通过
ssh
连接远程服务器之后,由于没有图形界面,只能在命令行里进行开发(当然现在很多 IDE 如 PyCharm 提供了ssh
插件可以解决这个问题)。 - 异常丰富的插件生态,让你拥有世界上最花里胡哨的命令行编辑器。
如何学习 Vim
不幸的是 Vim 的学习曲线确实相当陡峭,我花了好几个星期才慢慢适应了用 Vim 进行开发的过程。最开始你会觉得非常不适应,但一旦熬过了初始阶段,相信我,你会爱上 Vim。
Vim 的学习资料浩如烟海,但掌握它最好的方式还是将它用在日常的开发过程中,而不是一上来就去学各种花里胡哨的高级 Vim 技巧。个人推荐的学习路线如下:
- 先阅读这篇 tutorial,掌握基本的 Vim 概念和使用方式,不想看英文的可以阅读这篇教程。
- 用 Vim 自带的
vimtutor
进行练习,安装完 Vim 之后直接在命令行里输入vimtutor
即可进入练习程序。 - 最后就是强迫自己使用 Vim 进行开发,IDE 里可以安装 Vim 插件。
- 等你完全适应 Vim 之后新的世界便向你敞开了大门,你可以按需配置自己的 Vim(修改
.vimrc
文件),网上有数不胜数的资源可以借鉴。 - 如果你想对配置 Vim 有更加深入的了解,Learn Vim Script the Hard Way 是一个很好的资源。
关于键位映射
用 Vim 编辑代码的时候会频繁用到 ESC 和 CTRL 键, 但是这两个键都离 home row 很远, 可以把 CapsLock 键映射到 Esc 或者 Ctrl 键,让手更舒服一些。
Windows 系统可以使用 Powertoys 或者 AutoHotkey 重映射键位。
MacOS 系统提供了重映射键位的设置,另外也可以使用 Karabiner-Elements 重映射。
Linux 系统可以使用 xremap 进行映射,对于 wayland 和 x.org 都可以使用,并且支持分别映射点按和按住。
但更佳的做法是同时将 CapsLock 映射为 Ctrl 和 Esc,点按为 Esc,按住为 Ctrl。这是不同系统下的实现方法:
推荐参考资料
-
- Neil, Drew. Practical Vim: Edit Text at the Speed of Thought. N.p., Pragmatic Bookshelf, 2015.
- Neil, Drew. Modern Vim: Craft Your Development Environment with Vim 8 and Neovim. United States, Pragmatic Bookshelf.
Emacs
为什么学习 Emacs
Emacs 是一个与 Vim 齐名的强大编辑器,事实上 Emacs 几乎具有 Vim 的所有好处,例如:
- 只需要键盘就可以完成所有操作,大量使用快捷键,具有极高的编辑效率。
- 既可以在终端无图形界面的场景下使用,也可使用有图形界面的版本获得更现代、更美观的体验。
此外,Emacs 与其它大部分编辑器最大的不同就在于其强大的扩展性。Emacs 的内核没有对用户做出任何限制,使用 Emacs Lisp 编程语言可以为 Emacs 编写任意逻辑的插件来扩展 Emacs 的功能。经过几十年的积累,Emacs 的插件生态可谓编辑器中最为丰富和强大的生态之一。有一种说法是,“Emacs 表面上是个编辑器,其实是一个操作系统”。只要稍作学习,你也可以编写属于自己的 Emacs 扩展。
Emacs 对 Vim 用户也十分友好,有一个叫 evil 的插件可以让用户在 Emacs 中使用 Vim 的基本操作,只需要很低的迁移成本即可从 Vim 转到 Emacs。曾经有统计显示有相当一部分用户会从 Vim 转到 Emacs,但几乎没有用户从 Emacs 转到 Vim。事实上,Emacs 相对 Vim 最大的不足是纯文本编辑方面不如 Vim 的多模态编辑效率高,但凭借其强大的扩展性,Emacs 可以扬长避短,把 Vim 吸收进来,结合了二者的长处。
如何学习 Emacs
与 Vim 相同,Emacs 的学习曲线也比较陡峭,但一旦理解了 Emacs 的使用逻辑,就会爱不释手。然而,网上的 Emacs 资料大多不细致、不够准确,甚至有哗众取宠的嫌疑。
这里给大家推荐一个较新的中文教程《专业 Emacs 入门》,这篇教程比较系统和全面,且讲述相对比较耐心细致,在讲解 Emacs 基本逻辑的同时也给出了成套的插件推荐,读完后可以获得一个功能完善的、接近 IDE 的 Emacs,因此值得一读。学完教程只是刚刚开始,学会之后要经常使用,在使用中遇到问题勤于搜索和思考,最终才能得心应手。
关于键位映射
Emacs 的唯一缺点便是对 Ctrl 键的使用过多,对小手指不是很友好,强烈建议更改 Ctrl 键的键盘映射。更改映射的方式与 Vim 教程中的方法相同,这里不做赘述。
Git
为什么使用 Git
Git 是一款分布式的代码版本控制工具,Linux 之父 Linus 嫌弃当时主流的中心式的版本控制工具太难用还要花钱,就自己开发出了 Git 用来维护 Linux 的版本(给大佬跪了)。
Git 的设计非常优雅,但初学者通常因为很难理解其内部逻辑因此会觉得非常难用。对 Git 不熟悉的初学者很容易出现因为误用命令将代码给控制版本控制没了的状况(好吧是我)。
但相信我,和 Vim 一样,Git 是一款你最终掌握之后会感叹“它值得!”的神器。
如何学习 Git
和 Vim 不同,我不建议初学者在一知半解的情况下贸然使用 Git,因为它的内部逻辑并不能熟能生巧,而是需要花时间去理解。我推荐的学习路线如下:
- 阅读这篇 Git tutorial,视频的话可以看这个尚硅谷Git教程
- 阅读这本开源书籍 Pro Git 的 Chapter1 – Chapter5,是的没错,学 Git 需要读一本书(捂脸)。
- 此时你已经掌握了 Git 的原理和绝大部分用法,接下来就可以在实践中反复巩固 Git 的命令了。但用好它同样是一门哲学,我个人觉得这篇如何写好 Commit Message 的博客非常值得一读。
- 好的此时你已经爱上了 Git,你已经不满足于学会它了,你想自己实现一个 Git!巧了,我当年也有这样的想法,这篇 tutorial 可以满足你!
- 什么?光实现一个 Git 无法满足你?小伙子/小仙女有前途,巧的是我也喜欢造轮子,这两个 GitHub 项目 build-your-own-x 和 project-based-learning 收录了你能想到的各种造轮子教程,比如:自己造个编辑器、自己写个虚拟机、自己写个 docker、自己写个 TCP 等等等等。
GitHub
GitHub 是什么
从功能上来说,GitHub 是一个在线代码托管平台。你可以将你的本地 Git 仓库托管到 GitHub 上,供多人同时开发浏览。但现如今 GitHub 的意义已远不止如此,它已经演变为一个非常活跃且资源极为丰富的开源交流社区。全世界的软件开发者在 GitHub 上分享各式各样种类繁多的开源软件。大到工业级的深度学习框架 PyTorch, TensorFlow,小到几十行的实用脚本,既有硬核的知识分享,也有保姆级的教程指导,甚至很多技术书籍也在 GitHub上开源(例如诸位正在看的这本——如果我厚着脸皮勉强称之为书的话)。闲来无事逛逛 GitHub 已经成为了我日常生活的一部分。
在 GitHub 里,星星是对一个项目至高无上的肯定,如果你觉得这本书对你有用的话,欢迎通过右上角的链接进入仓库主页献出你宝贵的星星✨。
如何使用 GitHub
如果你还从未在 GitHub 上建立过自己的远程仓库,也没有克隆过别人的代码,那么我建议你从 GitHub的官方教程开始自己的开源之旅。
如果你想时刻关注 GitHub 上一些有趣的开源项目,那么我向你重磅推荐 HelloGitHub 这个网站以及它的同名微信公众号。它会定期收录 GitHub 上近期开始流行的或者非常有趣的开源项目,让你有机会第一时间接触各类优质资源。
GitHub 之所以成功,我想是得益于“我为人人,人人为我”的开源精神,得益于知识分享的快乐。如果你也想成为下一个万人敬仰的开源大佬,或者下一个 star 破万的项目作者。那就把你在开发过程中灵感一现的 idea 化作代码,展示在 GitHub 上吧~
不过需要提醒的是,开源社区不是法外之地,很多开源软件并不是可以随意复制分发甚至贩卖的,了解各类开源协议并遵守,不仅是法律的要求,更是每个开源社区成员的责任。
GNU Make
为什么学 GNU Make
大家第一次写 hello world 程序的时候一定都记得,在编辑完 helloworld.c
之后,需要用 gcc
编译生成可执行文件,然后再执行(如果你不理解前面这段话,请先自行谷歌 gcc 编译 并理解相关内容)。但如果你的项目由成百上千个 C 源文件组成,并且星罗棋布在各个子目录下,你该如何将它们编译链接到一起呢?假如你的项目编译一次需要半个小时(大型项目相当常见),而你只修改了一个分号,是不是还需要再等半个小时呢?
这时候 GNU Make 就闪亮登场了,它能让你在一个脚本里(即所谓的 Makefile
)定义整个编译流程以及各个目标文件与源文件之间的依赖关系,并且只重新编译你的修改会影响到的部分,从而降低编译的时间。
如何学习 GNU Make
这里有一篇写得深入浅出的文档供大家参考。
GNU Make 掌握起来相对容易,但用好它需要不断的练习。将它融入到自己的日常开发中,勤于学习和模仿其他优秀开源项目里的 Makefile
的写法,总结出适合自己的 template,久而久之,你对 GNU Make 的使用会愈加纯熟。
CMake
为什么学习 CMake
CMake 是类似于 GNU make 的跨平台自动软件构建工具,使用 CMakeLists.txt 定义构建规则,相比于 make 它提供了更多的功能,在各种软件构建上广泛使用。强烈建议学习使用 GNU Make 和熟悉 Makefile
后再学习 CMake。
如何学习 CMake
CMakeLists.txt
比 Makefile
更为抽象,理解和使用难度也更大。现阶段很多 IDE (如 Visual Studio, CLion) 提供了自动生成 CMakeLists.txt
的功能,但掌握 CMakeLists.txt
的基本用法仍然很有必要。除了 CMake 官方 Tutorial 外,上海交通大学 IPADS 组新人培训也提供了大约一小时的视频教程。
LaTeX
为什么学 LaTeX
如果你需要写论文,那么请直接跳到下一节,因为你不学也得学。
LaTeX 是一种基于 TeX 的排版系统,由图灵奖得主 Lamport 开发,而 Tex 则是由 Knuth 最初开发,这两位都是计算机界的巨擘。当然开发者强并不是我们学习 LaTeX 的理由,LaTeX 和常见的所见即所得的 Word 文档最大的区别就是用户只需要关注写作的内容,而排版则完全交给软件自动完成。这让没有任何排版经验的普通人得以写出排版非常专业的论文或文章。
Berkeley 计算机系教授 Christos Papadimitriou 曾说过一句半开玩笑的话:
Every time I read a LaTeX document, I think, wow, this must be correct!
如何学习 LaTeX
推荐的学习路线如下:
- LaTeX 的环境配置是个比较头疼的问题。如果你本地配置 LaTeX 环境出现了问题,可以考虑使用 Overleaf 这个在线 LaTeX 编辑网站。站内不仅有各种各样的 LaTeX 模版供你选择,还免去了环境配置的难题。
- 阅读下面三篇 Tutorial: Part-1, Part-2, Part-3。
- 学习 LaTeX 最好的方式当然是写论文,不过从一门数学课入手用 LaTeX 写作业也是一个不错的选择。
其他值得推荐的入门学习资料如下:
- 一份简短的安装 LaTeX 的介绍 [GitHub] 或者 TEX Live 指南(texlive-zh-cn)[PDF] 可以帮助你完成安装和环境配置过程
- 一份(不太)简短的 LaTeX2ε 介绍(lshort-zh-cn)[PDF] [GitHub] 是由 CTEX 开发小组翻译的,可以帮助你快速准确地入门,建议通读一遍
- 刘海洋的《LaTeX 入门》,可以当作工具书来阅读,有问题再查找,跳过 CTEX 套装部分
- 现代 LaTeX 入门讲座
- 一份其实很短的 LaTeX 入门文档
Docker
为什么使用 Docker
使用别人写好的软件/工具最大的障碍是什么——必然是配环境。配环境带来的折磨会极大地消解你对软件、编程本身的兴趣。虚拟机可以解决配环境的一部分问题,但它庞大笨重,且为了某个应用的环境配置好像也不值得模拟一个全新的操作系统。
Docker 的出现让环境配置变得(或许)不再折磨。简单来说 Docker 使用轻量级的“容器”(container)而不是整个操作系统去支持一个应用的配置。应用自身连同它的环境配置被打包为一个个 image 可以自由运行在不同平台的一个个 container 中,这极大地节省了所有人的时间成本。
如何学习 Docker
Docker 官方文档当然是最好的初学教材,但最好的导师一定是你自己——尝试去使用 Docker 才能享受它带来的便利。Docker 在工业界发展迅猛并已经非常成熟,你可以下载它的桌面端并使用图形界面。
当然,如果你像我一样,是一个疯狂的造轮子爱好者,那不妨自己亲手写一个迷你 Docker 来加深理解。
KodeKloud Docker for the Absolute Beginner 全面的介绍了 Docker 的基础功能,并且有大量的配套练习,同时提供免费的云环境来完成练习。其余的云相关的课程如 Kubernetes 需要付费,但个人强烈推荐:讲解非常仔细,适合从 0 开始的新手;有配套的 Kubernetes 的实验环境,不用被搭建环境劝退。
Scoop
为什么使用 Scoop
在 Windows 下,搭建开发环境一直是一个复杂且困难的问题。由于没有一个统一的标准,导致各种开发环境的安装方式差异巨大,需要付出很多不必要的时间成本。而 Scoop 可以帮助你统一安装并管理常见的开发软件,省去了手动下载安装,配置环境变量等繁琐步骤。
例如安装 python 和 nodejs 只需要执行:
scoop install python
scoop install nodejs
安装 Scoop
Scoop 需要 Windows PowerShell 5.1 或者 PowerShell 作为运行环境,如果你使用的是 Windows 10 及以上版本,Windows PowerShell 是内置在系统中的。而 Windows 7 内置的 Windows PowerShell 版本过于陈旧,你需要手动安装新版本的 PowerShell。
由于发现很多同学在设置 Windows 用户时使用了中文用户名,导致了用户目录也变成了中文名。如果按照 Scoop 的默认方式将软件安装到用户目录下,可能会造成部分软件执行错误。所以这里推荐安装到自定义目录,如果需要其他安装方式请参考: ScoopInstaller/Install
# 设置 PowerShell 执行策略
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 下载安装脚本
irm get.scoop.sh -outfile 'install.ps1'
# 执行安装, --ScoopDir 参数指定 Scoop 安装路径
.\install.ps1 -ScoopDir 'C:\Scoop'
使用 Scoop
Scoop 的官方文档对于新手非常友好,相对于在此处赘述更推荐阅读 官方文档 或 快速入门 。
Q&A
Scoop 能配置镜像源吗?
Scoop 社区仅维护安装配置,所有的软件都是从该软件官方提供的下载链接进行下载,所以无法提供镜像源。如果因为你的网络环境导致多次下载失败,那么你需要一点点 魔法。
为什么找不到 Java8?
原因同上,官方已不再提供 Java8 的下载链接,推荐使用 ojdkbuild8 替代。
我需要安装 python2 该如何操作?
对于已经过时弃用的软件,Scoop 社区会将其从 ScoopInstaller/Main 中移除并将其添加到 ScoopInstaller/Versions 中。如果你需要这些软件的话需要手动添加 bucket:
scoop bucket add versions
scoop install python27
日常学习工作流
Contributed by @HardwayLinka
计算机领域的知识覆盖面很广并且更新速度很快,因此保持终身学习的习惯很重要。但在日常开发和学习的过程中,我们获取知识的来源相对复杂且细碎。有成百上千页的文档手册,也有寥寥数语的博客,甚至闲暇时手机上划过的某则新闻和公众号都有可能包含我们感兴趣的知识。因此,如何利用现有的各类工具,形成一套适合自己的学习工作流,将不同来源的知识碎片整合进属于自己的知识库,方便之后的查阅与复习,就显得尤为重要。经过两年工作之余的学习后,我磨合出了以下学习工作流:

底层核心逻辑
一开始我学习新知识时会参考中文博客,但在代码实践时往往会发现漏洞和bug。我逐渐意识到我参考的信息可能是错误的,毕竟发博客的门槛低,文章可信度不高,于是我开始查阅一些相关的中文书籍。
中文书籍的确是比较全面且系统地讲解了知识点,但众所周知,计算机技术更迭迅速,又因为老美在 CS 方面一直都是灯塔,所以一般中文书籍里的内容会滞后于当前最新的知识,导致我跟着中文书籍实践会出现软件版本差异的问题。这时我开始意识到一手信息的重要性,有些中文书籍是翻译英文书籍的,一般翻译一本书也要一两年,这会导致信息传递的延迟,还有就是翻译的过程中信息会有损失。如果一本中文书籍不是翻译的呢,那么它大概率也参考了其他书籍,参考的过程会带有对英文原著中语义理解的偏差。
于是我就顺其自然地开始翻阅英文书籍。不得不说,英文书籍内容的质量整体是比中文书籍高的。后来随着学习的层层深入,以知识的时效性和完整性出发,我发现 源代码
> 官方文档
> 英文书籍
> 英文博客
> 中文博客
,最后我得出了一张 信息损失图
:

虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。
现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。
选择合适的笔记软件
工作流的骨架围绕 单个知识点多参考源,勤于提问给多个知识点之间建立联系
的底层核心逻辑建立。我们写论文其实就是遵循这个底层逻辑的。论文一般会有脚注去解释一些关键字,并且论文末尾会有多个参考的来源,但是我们平时写笔记会随意得多,因此需要更灵活的方式。
平时写代码习惯在 IDE 里一键跳转,把相关的函数和实现很好地联系在了一起。你也许会想,如果笔记也能像代码那样可以跳转就好了。现在市面上 双链笔记软件
就可以很好地解决这一痛点,例如 Roam Research、Logseq、Notion 和 Obsidian。Roam Research 和 Logseq 都是基于大纲结构的笔记软件,而 大纲结构
是劝退我使用这两款软件的原因。一是 大纲结构
做笔记容易使文章纵向篇幅太长,二是如果嵌套结构过多会占横向的篇幅。Notion 页面打开慢,弃之。最终我选择了 Obsidian,原因如下:
- Obsidian 基于本地,打开速度快,且可存放很多电子书。我的笔记本是 32g 内存的华硕天选一代,拿来跑 Obsidian 可以快到飞起
- Obsidian 基于 Markdown。这也是一个优势,如果笔记软件写的笔记格式是自家的编码格式,那么不方便其他第三方拓展,也不方便将笔记用其他软件打开,比如 qq 音乐下载歌曲有自己的格式,其他播放器播放不了,这挺恶心人的
- Obsidian 有丰富的插件生态,并且这个生态既大又活跃,即插件数量多,且热门插件的 star 多,开发者会反馈用户 issue,版本会持续迭代。借助这些插件,可以使 Obsidian 达到
all in one
的效果,即各类知识来源可以统一整合于一处
信息的来源
Obsidian 的插件使其可以支持 pdf 格式,而其本身又支持 Markdown 格式。如果想要 all in one
,那么可以基于这两个格式,将其他格式文件转换为 pdf 或者 Markdown。 那么现在就面临着两个问题:
- 有什么格式
- 怎么转换为 pdf 或 Markdown

有什么格式
文件格式依托于其展示的平台,所以在看有什么格式之前,可以罗列一下我平时获取信息的来源:

可以看到主要分为文章
、论文
、电子书
、课程
四类,包含的格式主要有 网页
、pdf
、mobi
、azw
、azw3
。
怎么转换为 pdf 或 Markdown
在线的文章和课程等大多以网页形式呈现,而将网页转换为 Markdown 可以使用剪藏软件,它可以将网页文章转换为多种文本格式文件。我选择的工具是简悦,使用简悦可以将几乎所有平台的文章很好地剪藏为 Markdown 并且导入到 Obsidian。

对于论文和电子书而言如果格式本身就是 pdf 则万事大吉,但如果是其他格式则可以使用 calibre 进行转换:

现在利用 Obsidian 的 pdf 插件和其原生的 markdown 支持就可以畅快无比地做笔记并且在这些文章的对应章节进行无缝衔接地引用跳转啦(具体操作参考下文的“信息的处理”模块)。

如何统一管理信息来源
对于 pdf 等文件类资源可以本地或者云端存储,而网页类资源则可以分门别类地放入浏览器的收藏夹,或者剪藏成 markdown 格式的笔记,但是网页浏览器不能实现移动端的网页收藏。为了实现跨端网页收藏我选用了 Cubox,在手机端看到感兴趣的网页时只需小手一划,便能将网页统一保存下来。虽然免费版只能收藏 100 个网页,但其实够用了,还可以在收藏满时督促自己赶紧剪藏消化掉这些网页,让收藏不吃灰。

除此之外,回想一下我们平时收藏的网页,就会发现有很多并不是像知乎、掘金这类有完整功能的博客平台,更多的是个人建的小站,而这些小站往往没有移动端应用,这样平时刷手机的时候也看不到,放到浏览器的收藏夹里又容易漏了看,有新文章发布我们也不能第一时间收到通知,这个时候就需要一种叫 RSS
的通信协议。
RSS
(英文全称:RDF Site Summary 或 Really Simple Syndication),中文译作简易信息聚合,也称聚合内容,是一种消息来源格式规范,用以聚合多个网站更新的内容并自动通知网站订阅者。电脑端可以借助 RSSHub Radar
来快速发现和生成 RSS
订阅源,接着使用 Feedly
来订阅这些 RSS
订阅源(RSSHub Radar
和 Feedly
在 chrome 浏览器中均有官方插件)。

到这里为止,收集信息的流程已经比较完备了。但资料再多,分类规整得再漂亮,也得真正内化成自己的才管用。因此在收集完信息后就得进一步地处理信息,即阅读这些信息,如果是英文信息的话还得搞懂英文的语义,加粗高亮重点句子段落,标记有疑问的地方,发散联想相关的知识点,最后写上自己的总结。那么在这过程中需要使用到什么工具呢?
信息的处理
英文信息
面对英文的资料,我以前是用 有道词典
来划词翻译,遇到句子的话就使用谷歌翻译,遇到大段落时就使用 deepl
,久而久之,发现这样看英语文献太慢了,得用三个工具才能满足翻译这一个需求,如果有一个工具能够同时实现对单词、句子和段落的划词翻译就好了。我联想到研究生们应该会经常接触英语文献,于是我就搜 研究生
+ 翻译软件
,在检索结果里我最终选择了 Quicker
+ 沙拉查词
这个搭配来进行划词翻译。

使用这套组合可以实现在浏览器外的其他软件内进行划词翻译,并且支持单词、句子和段落的翻译,以及每次的翻译会有多个翻译平台的结果。btw,如果查单词时不着急的话,可以顺便看看 科林斯高阶
的翻译,这个词典的优点就是会用英文去解释英文,可以提供多个上下文帮助你理解,对于学习英文单词也有帮助,因为用英文解释英文才更接近英语的思维。

多媒体信息
处理完文本类的信息后,我们还得思考一下怎么处理多媒体类的信息。此处的多媒体我特指英文视频,因为我没有用播客或录音学习的习惯,而且我已经基本不看中文教程了。现在很多国外名校公开课都是以视频的形式,如果能对视频进行做笔记会不会有帮助呢?不知道大家有没这样的想法,就是如果能把老师上课讲的内容转换成文本就好了,因为平时学习时我们看书的速度往往会比老师讲课的速度快。刚好 Language Reactor
这个软件可以将油管和网飞内视频的字幕导出来,同时附上中文翻译。
我们可以把 Language Reactor
导出的字幕复制到 Obsidian
里面作为文章来读。除了出于学习的需求,也可以在平时看油管的视频时打开这个插件,这个插件可以同时显示中英文字幕,并且可以单击选中英文字幕中你认为生僻的单词后显示单词释义。

但阅读文本对于一些抽象的知识点来说并不是效率最高的学习方式。俗话说,一图胜千言,能不能将某一段知识点的文本和对应的图片甚至视频画面操作联系起来呢?我在浏览 Obsidian
的插件市场时,发现了一个叫 Media Extended
的插件,这个插件可以在你的笔记里添加跳转到视频指定时间进度的链接,相当于把你的笔记和视频连接起来了!这刚好可以和我上文提到的生成视频中英文字幕搭配起来,即每一句字幕对应一个时间,并且能根据时间点跳转到视频的指定进度,如此一来如果需要在文章中展示记录了操作过程的视频的话,就不需要自己去截取对应的视频片段,而是直接在文章内就能跳转!

Obsidian
里还有一个很强大的插件,叫 Annotator
,它可以实现笔记内跳转到 pdf 原文

现在,使用 Obsidian
自带的双链功能,可以实现笔记间相互跳转,结合上述两个插件,可以实现笔记到多媒体的跳转,信息的处理过程已经完备。一般我们学习的过程相当于上山和下山,刚学的时候就好像上山,很陌生、吃力,所谓学而时习之,复习或练习的过程就像下山,没有陌生感,不见得轻松,但非走不可。那么如何把复习这一过程纳入工作流的环节里呢?
信息的回顾
Obsidian
内已经有一个连接 Anki
的插件,Anki
就是大名鼎鼎的、基于间隔重复的记忆软件。使用该插件可以截取笔记的片段导出到 Anki
并变成一张卡片,卡片内也有跳转回笔记原文的链接

总结
这个工作流是在我这两年业余时间学习时所慢慢形成的,在学习过程中因为对一些重复性的过程而感到厌倦,正是这种厌倦产生了某种特定的需求,恰好在平时网上冲浪时了解到的一些工具满足了我这些需求。不要为了虚无的满足感而将工具强行拼凑到自己的工作流中,人生苦短,做实事最紧要。
btw,此篇文章是讲解工作流的演化思路,如果对此工作流的实现细节感兴趣,建议阅读完本文后再按顺序阅读以下文章
实用工具箱
下载工具
- Sci-Hub: Elbakyan 女神向你挥手,旨在打破知识壁垒的革命性网站。
- Library Genesis: 电子书下载网站。
- Z-library: 电子书下载网站(在 Tor 下运行较佳,链接)。
- Z-ePub: ePub 电子书下载网站。
- PDF Drive: PDF 电子书搜索引擎。
- MagazineLib: PDF 电子杂志下载网站。
- BitDownloader: 油管视频下载器。
- qBittorrent: BitTorrent 客户端。
- uTorrent: BitTorrent 客户端。
- 全国标准信息公共服务平台:各类标准查询和下载官方平台。
- 标准知识服务系统:检索与阅读所需标准。
- MSDN,我告诉你: Windows 操作系统镜像下载站,也有许多其他软件的下载。
设计工具
- excalidraw: 一款手绘风格的绘图工具,非常适合绘制课程报告或者PPT内的示意图。
- tldraw: 一个绘图工具,适合画流程图,架构图等。
- draw.io: 强大简洁的在线的绘图网站,支持流程图,UML图,架构图,原型图等等,支持 Onedrive, Google Drive, Github 导出,同时提供离线客户端。
- origamiway: 手把手教你怎么折纸。
- thingiverse: 囊括各类 2D/3D 设计资源,其 STL 文件下载可直接 3D 打印。
- iconfont: 国内最大的图标和插画资源库,可用于开发或绘制系统架构图。
- turbosquid: 可以购买各式各样的模型。
- flaticon: 可下载免费且高质量的图标。
- 标准地图服务系统: 可以下载官方标准地图。
- PlantUML: 可以使用代码快速编写 UML 图。
编程相关
- sqlfiddle: 一个简易的在线 SQL Playground。
- sqlzoo:在线练习 sql 语句。
- sqlable:一个 SQL 工具网站(格式化器、验证器、生成器,SQL Playground)。
- godbolt: 非常方便的编译器探索工具。你可以写一段 C/C++ 代码,选择一款编译器,然后便可以观察生成的具体汇编代码。
- explainshell: 你是否曾为一段 shell 代码的具体含义感到困扰?manpage 看半天还是不明所以?试试这个网站!
- regex101: 正则表达式调试网站,支持各种编程语言的匹配标准。
- typingtom: 针对程序员的打字练习/测速网站。
- wrk: 网站压测工具。
- gbmb: 数据单位转换。
- tools: 在线工具合集。
- github1s: 用网页版 VS Code 在线阅读 GitHub 代码。
- visualgo: 算法可视化网站。
- DataStructureVisual: 数据结构可视化网站。
- Data Structure Visualizations: 数据结构与算法的可视化网站。
- learngitbranching: 可视化学习 git。
- UnicodeCharacter: Unicode 字符集网站。
- cyrilex: 一个用于测试和可视化正则表达式的网站,支持各种编程语言标准。
- mockium: 生成测试数据的平台。
学习网站
- HFS: 各类软件教程。
- Shadertoy: 编写各式各样的 shader。
- comments-for-awesome-courses: 名校公开课评价网。
- codetop: 企业题库。
- cs-video-courses: 带有视频讲座的计算机科学课程列表。
- bootlin: 在线阅读 Linux 源码。
- ecust-CourseShare: 华东师范大学研究生课程攻略共享计划。
- REKCARC-TSC-UHT: 清华大学计算机系课程攻略。
- seu-master: 东南大学研究生课程资料整理。
- 菜鸟教程: 计算机相关知识的简要的教程。
- FreeBSD 从入门到跑路: 一本 FreeBSD 的中文教程。
- MDN Web Docs: MDN 网络开发入门手册。
- Hello 算法: 动画图解、能运行、可提问的数据结构与算法快速入门教程。
百科网站/词典性质的网站
- os-wiki: 操作系统技术资源百科全书。
- FreeBSD Documentation: FreeBSD 官方文档。
- Python3 Documentation: Python3 官方中文文档。
- C++ Reference: C++ 参考手册。
- OI Wiki: 编程竞赛知识整合站点。
- Microsoft Learn: 微软官方的学习平台,包含了绝大多数微软产品的文档。
- Arch Wiki: 专为 Arch Linux 而写的 Wiki,包含了大量 Linux 相关的知识。
- Qt Wiki: Qt 官方 Wiki。
- OpenCV 中文文档: OpenCV 的社区版中文文档。
- npm Docs: npm 官方文档。
交流平台
- GitHub: 许多开源项目的托管平台,也是许多开源项目的主要交流平台,通过查看 issue 可以解决许多问题。
- StackExchange: Stack Exchange 是由 181 个问答社区组成(其中包括 Stack Overflow)的编程社区。
- StackOverflow: Stack Overflow 是一个与程序相关的 IT 技术问答网站。
- Gitee: 一个类似于 GitHub 的代码托管平台,可以在对应项目的 issue 里查找一些常见问题的解答。
- 知乎: 一个类似于 Quora 的问答社区,可以在其中提问,一些问答包含有计算机的知识。
- 博客园: 一个面向开发者的知识分享社区,拥有一些常见问题的博客,正确率不能保证,请谨慎使用。
- CSDN: 拥有一些常见问题的博客,正确率不能保证,请谨慎使用。
杂项
- tophub: 新闻热榜合集(综合了知乎、微博、百度、微信等)。
- feedly: 著名的 RSS 订阅源阅读器。
- speedtest: 在线网络测速网站。
- public-apis: 公共 API 合集列表。
- numberempire: 函数求导工具。
- sustech-application: 南方科技大学经验分享网。
- vim-adventures: 一款基于 vim 键盘快捷键的在线游戏。
- vimsnake: 利用 vim 玩贪吃蛇。
- keybr: 学习盲打的网站。
- Awesome C++: 很棒的 C/C++ 框架、库、资源精选列表。
- HelloGitHub: 分享 GitHub 上有趣、入门级的开源项目。
- Synergy: 一套键鼠能控制多台电脑。
毕业论文
为什么写这份教程
2022年,在开始动手写毕业论文的时候,尴尬地发现,对 Word 的掌握程度仅限于调节字体、保存导出这些傻瓜功能。曾想转战 Latex,但论文的段落格式要求调整起来还是用 Word 更为方便,经过一番痛苦缠斗之后,总算是有惊无险地完成了论文的写作和答辩。为了不让后来者重蹈覆辙,遂把相关资源整理成一份开箱即用的文档,供大家参考。
如何用 Word 写毕业论文
正如将大象装进冰箱需要三步,用 Word 写毕业论文也只需要简单三步:
- 确定论文的格式要求:通常学院都会下发毕业论文的格式要求(各级标题的字体字号、图例和引用的格式等等),如果更为贴心的话甚至会直接给出论文模版(如是此情况请直接跳转到下一步)。很不幸的是,我的学院并没有下发标准的论文格式要求,还提供了一份格式混乱几乎毫无用处的论文模版膈应我,被逼无奈之下我找到了北京大学研究生的论文格式要求,并按照其要求制作了一份模版,大家需要的话自取,本人不承担无法毕业等任何责任。
- 学习 Word 排版:到达这一步的童鞋分为两类,一是已经拥有了学院提供的标准模版,二是只有一份虚无缥缈的格式要求。那现在当务之急就是学习基础的 Word 排版技术,对于前者可以学会使用模版,对于后者则可以学会制作模版。此时切记不要雄心勃勃地选择一个十几个小时的 Word 教学视频开始头悬梁锥刺股,因为生产一份应付毕业的学术垃圾只要学半小时能上手就够了。我当时看的一个 B 站的教学视频,短小精悍非常实用,全长半小时极速入门。
- 生产学术垃圾:最容易的一步,大家八仙过海,各显神通吧,祝大家毕业顺利~~
信息检索
前言
碰到问题,记住第一件事是 翻阅文档 ,不要一开始就直接搜索或者找人问,翻阅FAQ可能会快速找到答案。
信息检索,我的理解来说,实际上就是灵活运用搜索引擎中,方便快捷的搜到需要的信息,包括但不限于编程。
编程最重要的,就是 STFW(search the fucking web) 和 RTFM(read the fucking Manual) ,首先要读文档,第二要学会搜索,网上那么多资源,怎么用,就需要信息检索。
要搜索,我们首先要搞清楚搜索引擎是如何工作的:
搜索引擎工作原理
搜索引擎的工作过程大体可以分成三阶段:[^1]
- 爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问网页,获取网页 HTML 代码存入数据库。
- 预处理:索引程序对抓取来的网页数据进行文字提取,中文分词,索引等处理,以备排名程序调用。
- 排名:用户输入关键词后,排名程序调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面。
第一步,就是大家经常听说的网络爬虫,一般 Python 卖课的都会吹这个东西。简单可以理解为,我用一个自动的程序,下载网站中的所有文本、图片等相关信息,然后存入本地的磁盘。
第二步是搜索引擎的核心,但是对于我们使用来说,并不是特别关键,大致可以理解为洗干净数据,然后入库页面,每个页面加入关键字等信息方便我们查询。
第三步跟我们息息相关,不管是什么搜索网站, google 、百度、 Bing ,都一样,输入关键字或者需要查询的内容,搜索引擎会给你返回结果。本文就是教你如何获取更好的结果。
基础搜索技巧
根据上述的工作原理,我们大致就能明白,其实可以把搜索引擎当作一个比较聪明的数据库,更好的使用查询条件就能更快速的找到你想要的信息,下面介绍一些搜索的技巧:
使用英文
首先我们要知道一件事,编程中,最好使用英文搜索。原因主要有几点:
- 编程和各种软件操作中,英文资料质量比中文资料和其他语言资料高,英文通用性还是更好些
- 因为翻译问题,英文的名词比中文准确通用
- 中文搜索中,分词系统不准会导致歧义,比如 Google 搜中文可能会搜不出几条有用结果
如果你英文不好,用百度翻译或者搜狗翻译,足够了。
当然下面的文档为了举例方便,都还是用中文例子。
提炼关键词
搜索时不要搜索整句话,虽然搜索引擎会自动帮助我们分词检索,但是整句和关键字搜索出来的结果再准确度和顺序上会有很大差别。搜索引擎是机器,并不是你的老师或者同事,看上面的流程,搜索实际上是去检索搜索引擎爬出来的数据库,你可以理解为关键字比模糊检索要快而且准确。
我们需要提炼问题,确定我们到底需要解决什么问题。
例如,我想知道 vcpkg 如何集成到工程上而不是全局中,那么搜索 vcpkg如何集成到工程上而不是全局中
这种长句可能无法找到相关的结果,最好是拆分成单词,vcpkg 集成到 工程 全局
这样的搜索。其实这里只是举个例子,针对本条其实都能搜索出相关信息,但是越具体的问题,机器分词越可能出问题,所以最好是拆分关键字,使用词组或者断句来进行搜索。
替换关键字
还是上面那个例子,如果搜不出来,可以试试把工程换成项目,或者移出集成,如果不行,试一下高级搜索。
高级搜索
普通搜索引擎一般都支持高级搜索,包括 google , bing ,百度, ecosia ,等等,大部分都支持,不过可能语法不同,一般通用的表示:
- 精准匹配: 精准匹配能保证搜索关键词完全被匹配上,一般是用双引号括起来
- 比如搜索线性代数,可以在输入框内输入 “线性代数”,搜索引擎将只匹配完整包含 “线性代数” 的页面,而不会搜索拆分成线性和代数两个词的页面
- 不包含关键字: 用 – 减号连接关键字,用于排除某些干扰词
- 包含关键字: 用 + 加号连接关键字
- 搜索特定文件类型:
filetype:pdf
直接搜索 pdf 文件 - 搜索特定网址:
site:stackoverflow.com
只搜索特定网站内的页面
一般可以参照网站说明,比如百度可以参照 高级搜索 ,Bing 可以参照 高级搜索关键字 和 高级搜索选项。
GitHub 的高级搜索
可以直接用 高级搜索页面 进行搜索,也可以参照 Github查询语法 进行查找,简单说几个:
in:name <关键字>
仓库名称带关键字查询in:description <关键字>
仓库描述带关键字查询in:readme <关键字>
README 文件带关键字查询stars(fork): >(=) <数字> <关键字>
star 或 fork 数大于(或等于)指定数字的带关键字查询stars(fork): 10..20 <关键词>
star 或 fork 数在 10 到 20 之间的带关键字查询size:>=5000 <关键词>
限定仓库大于等于 5000K 的带关键字查询pushed(created):>2019-11-15 <关键字>
更新 或 创建 日期在 2019 年 11 月 16 日之后的带关键字查询license:apache-2.0 <关键字>
LICENSE 为 apache-2.0 的带关键字查询language:java <关键词>
仓库语言为 Java 的带关键字查询user:<用户名>
查询某个用户的项目org:<组织名>
查询某个组织的项目 这些可以混合使用,也可以先查找某一类的 awesome 仓库,然后从 awesome 库里找相关的资源,github 里有很多归纳仓库,可以先看看已有的收集,有时候会节省很多时间
更多技巧
使用中,实际上我会去特定网站找一些问题:
- 如果是语言本身相关,比如 c++/Qt/OpenGL 如何实现什么功能,可以直接加上
site:stackoverflow.com
- 如果是具体的业务/开发环境或者软件相关,可以先在 BugList 、IssueList ,或者相关论坛里先找一下,比如 Qt 的问题就可以直接去 Qt 论坛,QGis 或者 GDAL 相关问题可以在 stackExchange 里去搜
- QQ 群也是一个提问的地方,但是需要你提的问题有意义,否则大部分人不会回你,而且 QQ 群回复并不及时。
- 知乎专栏、简书、博客园、 CSDN 中有大量中文笔记,这些都是别人嚼烂了的东西,基本是别人踩坑的经验
关于百度
大部分编程人都会告诉你别用百度,用 Google 或者 Bing 国际版,但是 Bing 中文搜索的准确率并不高, Google 需要科学上网,如果真的需要,可以使用 Ecosia 、 Yandex 之类的搜索引擎。而且中文搜索来说,百度可能还真是最好的。
百度的问题主要在于排序算法,可能两页都没啥对的内容,但是收录比 Bing 还是好一些的(百度以前并不遵守 robots.txt ,会抓取所有页面,所以有些个人网站甚至专门对百度做了屏蔽),甚至有时候比 Google 好。从数据库来说,百度比 Google 和 Bing 收录的中文内容要多,如果你碰到的时中文相关的问题而且确实找不到相关内容,那么就用百度,搜索引擎是工具,能用好用才是王道。
代码搜索
我们除了搜索引擎查找问题,还有可能会搜一些代码,可能是自己写的,也可能是项目中的,下面推荐一些工具:
代码检索有两种,第一是本地的代码检索,第二是要写个啥算法,需要在网上搜索
本地代码搜索
- ACK 或者 ACK2,老牌搜索工具,perl 写的
- The Silver Searcher c 实现的
- The Platinum Searcher go 实现的
- FreeCommander 自带的搜索,如果是固态硬盘速度还不错
- IDE 自带的,搜索有些时候并不太好用
开源代码搜索
- Searchcode 搜索开源代码,速度比较快
- 一行代码 国产的,有些国产工具很好用
all by csdiy.wiki