前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日拱一卒,麻省理工CS入门系列完结撒花

日拱一卒,麻省理工CS入门系列完结撒花

作者头像
TechFlow-承志
发布2022-09-21 10:59:31
4400
发布2022-09-21 10:59:31
举报
文章被收录于专栏:TechFlowTechFlow

作者 | 梁唐

出品 | 公众号:Coder梁(ID:Coder_LT)

大家好,日拱一卒,我是梁唐。

今天我们继续麻省理工missing smester,消失的学期的学习。这一节课的内容比较杂, 是一些使用过程当中的配置和技巧,算是杂项吧。

B站视频链接:https://www.bilibili.com/video/BV1x7411H7wa?p=9

在这一节课当中我们会学到一些配置和技巧,相当于往我们的工具库当中加入了更多的工具,说不定某一天就会用到。另外,一些常用的配置和工具也可以让我们的编程工作更加地方便。

日拱一卒,欢迎大家打卡一起学习。

键盘重映射

对于程序员来说,你的键盘是你的主要输入设备。就像是计算机当中的其他设备一样,它也是可配置的,并且非常值得你为此花费一点点时间。

最基础的一个改变是一些按键的重映射,通常这需要使用一些软件对按键进行监听,当发现某些按键被按下的时候,它会截取事件并且替换成我们设置的另外的按键。比如:

  • 将Caps Lock(大写锁定)键替换成Ctrl或者是Escape。大写锁定在键盘上一个非常方便的位置,但是它很少被使用,所以可以替换成我们常用的一些按键。比如如果经常使用vim的话,可以替换成Esc
  • 将PrtSc替换成播放/暂停按键,大部分操作系统支持播放/暂停键
  • 将Ctrl和Meta键交换(Windows徽标或者Mac中的command),如果是Mac党,推荐可以将command键和alt进行交换

你也可以将键位根据你的需要替换成一些命令,对于一些任务来说可能非常有用。一些软件可以监听特定的按键,当按键按下时执行某些特定的脚本。

  • 开启一个新的终端或者是浏览器窗口
  • 插入某些特定的文本,比如你的email地址或者是你的MIT学生ID
  • 进入休眠模式

还有一些更加复杂的改动:

  • 映射连续按键,比如按下shift五次开启大写锁定
  • 区别映射点击和长按,对于大写锁定键,如果只是单机表示Esc,长按替换成Ctrl
  • 对不同的键盘或软件进行区别设置

下面是一些修改键位映射的软件:

  • macOS - karabiner-elements, skhd 或者 BetterTouchTool
  • Linux - xmodmap 或者 Autokey
  • Windows - 控制面板,AutoHotkey 或者 SharpKeys
  • QMK - 如果你的键盘支持定制固件,QMK 可以直接在键盘的硬件上修改键位映射。保留在键盘里的映射免除了在别的机器上的重复配置。

守护进程

你可能听说过守护进程,即使这个概念看起来有些陌生。大多数计算机拥有一系列在后台运行的进程,不需要用户进行任何操作或者是交互。这些进程被称为守护进程,这些进程名称当中通常以d结尾。比如sshd,就是SSH的守护进程,它负责监听SSH请求,检查远程的用户是否有权限登录。

在Linux系统当中,systemd(系统守护进程)是最常用的用来运行守护进程的方法。你可以使用systemctl status来列举所有当前正在运行的守护进程。它们当中大多数可能看起来不太熟悉,但都负责了系统中的一些核心功能,比如管理网络,DNS解析,显示系统图形界面等等。

可以使用systemctl命令来enable, disable, start, stop, restart和status来和systemd进行交互。

并且systemd提供了一个很方便的界面用来进行配置和启动新的守护进程或服务。下面是一个使用守护进程来运行一个简单Python的应用。我们不会太过涉及细节,但相信绝大部分从名字上可以猜出它的功能。

代码语言:javascript
复制
# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target

[Service]
User=foo
Group=foo
WorkingDirectory=/home/foo/projects/mydaemon
ExecStart=/usr/bin/local/python3.7 app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

如果你只是想要定期运行一些程序,其实可以不用自定义守护进程,可以使用cron。它是一个你系统内置专门用来执行调度任务的守护进程。

FUSE

现在的软件系统通常由许多更小的模块构建而成。你的操作系统支持在后台使用不同的文件系统,这是因为操作文件系统的语言是通用的。比如,当你运行touch来创建一个文件,touch会执行一个system call(系统调用)给内核来创建文件。内核再通过类似的filesystem call来创建指定的文件。这里有一点要注意,UNIX中文件系统在传统上是以内核模块的形式实现的,只有内核可以进行文件系统的相关调用。

FUSE(filesystem in user space)允许用户的程序来实现文件系统。FUSE允许用户在用户空间执行filesystem call,并且将用户的调用和内核接口桥接起来。在实际中,这意味着用户可以使用filesystem call实现任意功能。

比如,FUSE可以实现:无论何时当你想要操作一个虚拟文件系统,这个操作会被通过SSH发送到远程的机器上,在远处执行之后,将结果返回。通过这个方法,本地的程序也可以操作远程服务器上的文件,就好像它们存在本地一样。sshfs就是实现了这样的功能。

一些有趣的 FUSE 文件系统包括:

  • sshfs:使用 SSH 连接在本地打开远程主机上的文件
  • rclone:将 Dropbox、Google Drive、Amazon S3、或者 Google Cloud Storage 一类的云存储服务挂载为本地文件系统
  • gocryptfs:覆盖在加密文件上的文件系统。文件以加密形式保存在磁盘里,但该文件系统挂载后用户可以直接从挂载点访问文件的明文
  • kbfs:分布式端到端加密文件系统。在这个文件系统里有私密(private),共享(shared),以及公开(public)三种类型的文件夹
  • borgbackup:方便用户浏览删除重复数据后的压缩加密备份

Backups

任何没有备份的数据都可能在某个时刻突然消失,在本地拷贝一份数据非常简单,但拥有一份可靠的备份很难。这里是一些关于备份的基础知识,以及一些常见的容易遇到的问题。

首先,在相同磁盘的拷贝不能算作是备份,因为对于所有数据来说,磁盘是一个单点故障。同样的,你家里的外部存储也同样很脆弱,比如可能因为火灾/抢劫等原因损坏。所以推荐的做法是将备份和原数据放在不同的地点。

同步方案也不是备份,比如Dropbox/GDrive非常方便,但云端的数据很容易因为本地数据的损坏或者是修改发生污染。同理,像是RAID这样的磁盘镜像方案也不是备份,它不能防止数据被删除、污染或者是被勒索软件加密。

一个好的备份解决方案的核心是版本控制,删除重复的数据,以及安全。版本控制保证了你可以获取你数据的历史版本并且高效地恢复数据。删除冗余的数据,保证增量的方式存储变更可以让备份变得非常高效,还可以减小存储开销。在安全性方面,你需要考虑对使用你数据的人进行限制(口令、验证)。最后,不要盲目相信备份,你需要经常检查你的备份是否还完好。

备份不限制于你本地计算机上的文件。随着网络应用的兴起,越来越多的数据被存储在了云端。比如你的邮箱、社交媒体上的照片、音乐播放列表以及在线文档等,如果你丢失了权限,这些数据都会消失。一种方式是对这些数据都存储一份离线拷贝,你可以找到一些工具可以帮助你对云端数据进行下载。

APIs

当今的互联网服务,大多线上服务拥有API,可以让你的程序通过它获得数据。比如说美国政府网站拥有API让你可以获取天气预报,这样你可以在你的shell当中轻易地知道天气情况。

大多数API格式相似,都是结构化的URL,通常使用api.service.com作为根路径。路径和请求参数表明了你想要获取的数据或者是你想要进行的操作。以美国天气数据为例,为了获得某个地点的天气预报,你可以发起GET请求到https://api.weather.gov/points/42.3604,-71.094.

返回的数据当中会包含一系列URL,可以让你获取你想要的指定地点的天气预报。通常返回数据以JSON的格式封装,你可以使用一些类似于jq的工具来过滤你想要的数据。

还有一些api需要验证,需要在请求当中加入一些特定的token。你需要阅读对应的文档来确定API需要的验证方式,OAuth是一种常用的协议。OAuth为用户提供一系列token服务。请记住,token是私密的,别人使用你的token发出的请求就相当于你自己发出的一样。

IFTTT可以将很多API整合在一起,它继承了成千上万的服务,可以让你串联平台上一系列的API来实现特定的功能。

常用命令行flag

命令行工具之间差异非常大,通常可以在使用之前通过man命令来查看基本用法。但通常有一些共同的特性是一样的:

  • 大部分工具支持--help这个flag来展示基础的用法
  • 会造成不可逆效果的工具通常支持空运行的功能,会打印出要进行的操作。相似的,往往也会提供交互的flag,让用户在执行的时候确认
  • 通常可以使用--version或者-v来打印它的版本信息
  • 大多数工具支持--verbose或者-vflag来输出详细的运行信息。通常可以使用-vvv来获得更加详细的信息来调试。类似的,很多工具也支持使用--quiet来去除除了报错以外的输出
  • 大多数工具当中,-代替文件名意味着标准输出或者标准输出
  • 会造成破坏性的工具通常默认不支持递归,通常使用-r开启递归模式
  • 有些时候你需要传入一个像是flag的普通参数,比如你想要删除一个叫做-r的文件,或者是你想要通过一个程序执行另一个程序,比如ssh machine foo,向foo程序传入一个参数。这个时候可以传入一个特殊的参数--让程序停止处理flag。 比如rm -- -r或者是ssh machine --for-ssh -- foo --for-foo,中间的--会让ssh知道之后的不再是它要处理的flag

窗口管理器

大部分人适应了拖拽式的窗口,比如Windows和Mac以及Ubuntu中的那样。在这些系统当中,窗口都是堆叠在一起的,你需要拖拽它们,将它们重新设置大小,以及让它们堆叠在一起。但这只是窗口管理的一种方式,通常称为浮动式。

除此之外,还有很多其他的窗口管理,尤其是在Linux上。一个特别的选项是平铺式的窗口管理器(tiling)。在平铺式窗口管理器当中,窗口永远不会互相覆盖,它们会平铺在一起像是地砖一样。

如果只有一个窗口, 那么它会占据整个屏幕,如果又开了一个新的窗口,原先的窗口会缩小到之前的2/3或者是1/3。打开更多的窗口会调整之前的窗口来适应新的窗口,有些像是tmux中的pane。你可以通过键盘在这些窗口当中浏览,你也可以进行移动、重新定义大小等操作。这些都可以摆脱鼠标完成,非常方便。

Markdown

在你的职业生涯当中,总会面临各种各样的文档需求。通常你需要在文本当中加入一些标记或者做一些修饰,比如说加粗、斜体,或者是你想要加入标题、链接以及代码片段等。和使用一些比较繁重的工具比如word或者是LaTeX相比,你可以考虑使用更加轻量级的标记语言Markdown。

你可能已经见过 Markdown 或者它的一个变种。很多环境都支持并使用 Markdown 的一些子功能。

Markdown 致力于将人们编写纯文本时的一些习惯标准化。比如:

  • 包围的文字表示强调(斜体*),或者用表示特别强调(粗体**);
  • 以#开头的行是标题,#的数量表示标题的级别,比如:##二级标题;
  • 以-开头代表一个无序列表的元素。一个数字加.(比如1.)代表一个有序列表元素;
  • 反引号 `(backtick)包围的文字会以代码字体显示。如果要显示一段代码,可以在每一行前加四个空格缩进,或者使用三个反引号包围整个代码片段:
代码语言:javascript
复制
```
code goes here
```
  • 如果要添加超链接,将 需要显示 的文字用方括号包围,并在后面紧接着用圆括号包围链接:显示文字。

Markdown 不仅容易上手,而且应用非常广泛。实际上本课程的课堂笔记和其他资料都是使用 Markdown 编写的

引导以及 Live USB

在计算机启动时,BIOS 或者 UEFI 会在加载操作系统之前对硬件系统进行初始化,这被称为引导(booting)。在这个过程当中,你可以通过按下计算机提示的键位组合来配置引导,比如 Press F9 to configure BIOS. Press F12 to enter boot menu。在 BIOS 菜单中你可以对硬件相关的设置进行更改,也可以在引导菜单中选择从硬盘以外的其他设备加载操作系统——比如 Live USB。

Live USB 是包含了完整操作系统的U盘。Live USB 的用途非常广泛,包括:

  • 作为安装操作系统的启动盘;
  • 在不将操作系统安装到硬盘的情况下,直接运行 Live USB 上的操作系统;
  • 对硬盘上的相同操作系统进行修复;
  • 恢复硬盘上的数据。

Live USB 通过在U盘上 写入 操作系统的镜像制作,而写入不是单纯的往闪存盘上复制 .iso 文件。你可以使用 UNetbootin 、Rufus 等 Live USB 写入工具制作。

Docker, Vagrant, VMs, Cloud, OpenStack

虚拟机(Virtual Machine)以及容器化(containerization)等工具可以帮助你模拟一个包括操作系统的完整计算机系统。虚拟机可以用于创建独立的测试或者开发环境,以及用作安全测试的沙盒。

Vagrant 是一个构建和配置虚拟开发环境的工具。它支持用户在配置文件中写入比如操作系统、系统服务、需要安装的软件包等描述,然后使用 vagrant up 命令在各种环境(VirtualBox,KVM,Hyper-V等)中启动一个虚拟机。Docker 是一个使用容器化概念的类似工具。

租用云端虚拟机可以享受以下资源的即时访问:

  • 便宜、持续维护、且有公共IP地址的虚拟机用来托管网站等服务
  • 有大量 CPU、磁盘、内存、以及 GPU 资源的虚拟机
  • 比物理机更多的资源(每秒钟近10亿台,如果你想要短时间内使用大量的计算资源,可以考虑)

受欢迎的 VPS 服务商有 Amazon AWS,Google Cloud、Microsoft Azure以及DigitalOcean。

交互式记事本编程

对于一些特定的交互式或者是探索式的开发来说,记事本编程环境非常好用。比如现在最受欢迎的记事本编程环境——jupyter,它的名字来源于它支持的三种核心语言:Julia、Python、R。除此之外,Wolfram Mathematica 常用来进行科学计算的编程环境。

GitHub

GitHub 是最受欢迎的开源软件开发平台之一。这节课上提到的很多工具,都托管在 Github 上。想要贡献代码很容易,大概有两种方式:

  • 创建一个问题(issue)。这可以用来反映程序运行的问题或者请求新的功能。高质量的问题报告对于开发者十分重要。对已有的issue发表评论也会有所帮助
  • 使用拉取请求(pull request)提交代码更改。由于涉及到阅读和编写代码,提交拉取请求总的来说比创建issue更加深入。你需要首先fork一个仓库,然后创建新的分支,在你的分支上修改之后,push到远程。最后创建一个pull request。通常维护者会审核你的改动,给你提出一些comment和反馈。如果一切顺利,你的代码会合并到上游的代码库当中。大型的项目通常会对这个过程做出引导,甚至有一些引导式的程序帮第一接触项目的开发者熟悉项目

喜欢本文的话不要忘记三连~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 键盘重映射
  • 守护进程
  • FUSE
  • Backups
  • APIs
  • 常用命令行flag
  • 窗口管理器
  • Markdown
  • 引导以及 Live USB
  • Docker, Vagrant, VMs, Cloud, OpenStack
  • 交互式记事本编程
  • GitHub
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档