设计更快的网页(一):图片压缩
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/213800xzz7e7txh75t5hhl.jpg">Media</a>很多 Web 开发者都希望做出加载速度很快的网页。在移动设备浏览占比越来越大的背景下,使用响应式设计使得网站在小屏幕下看起来更漂亮只是其中一个方面。Browser Calories 可以展示网页的加载时间 —— 这不单单关系到用户,还会影响到通过加载速度来进行评级的搜索引擎。这个系列的文章介绍了如何使用 Fedora 提供的工具来给网页“瘦身”。准备工作在你开始缩减网页之前,你需要明确核心问题所在。为此,你可以使用 <a href="https://browserdiet.com/calories/">Browserdiet</a>. 这是一个浏览器插件,适用于 Firefox、Opera、 Chrome 和其它浏览器。它会对打开的网页进行性能分析,这样你就可以知道应该从哪里入手来缩减网页。然后,你需要一些用来处理的页面。下面的例子是针对 <a href="http://getfedora.org">getferoda.org</a> 的测试截图。一开始,它看起来非常简单,也符合响应式设计。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/213800fjped7j9c1p3ej15.jpg">Browser Diet - getfedora.org 的评分</a>然而,BroserDiet 的网页分析表明,这个网页需要加载 1.8MB 的文件。所以,我们现在有活干了!Web 优化网页中包含 281 KB 的 JavaScript 文件、203 KB 的 CSS 文件,还有 1.2 MB 的图片。我们先从最严重的问题 —— 图片开始入手。为了解决问题,你需要的工具集有 GIMP、ImageMagick 和 optipng. 你可以使用如下命令轻松安装它们:<pre class="prettyprint linenums">sudo dnf install gimp imagemagick optipng</pre>比如,我们先拿到这个 6.4 KB 的<a href="https://getfedora.org/static/images/cinnamon.png">文&#…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/213800xzz7e7txh75t5hhl.jpg">Media</a>很多 Web 开发者都希望做出加载速度很快的网页。在移动设备浏览占比越来越大的背景下,使用响应式设计使得网站在小屏幕下看起来更漂亮只是其中一个方面。Browser Calories 可以展示网页的加载时间 —— 这不单单关系到用户,还会影响到通过加载速度来进行评级的搜索引擎。这个系列的文章介绍了如何使用 Fedora 提供的工具来给网页“瘦身”。准备工作在你开始缩减网页之前,你需要明确核心问题所在。为此,你可以使用 <a href="https://browserdiet.com/calories/">Browserdiet</a>. 这是一个浏览器插件,适用于 Firefox、Opera、 Chrome 和其它浏览器。它会对打开的网页进行性能分析,这样你就可以知道应该从哪里入手来缩减网页。然后,你需要一些用来处理的页面。下面的例子是针对 <a href="http://getfedora.org">getferoda.org</a> 的测试截图。一开始,它看起来非常简单,也符合响应式设计。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/213800fjped7j9c1p3ej15.jpg">Browser Diet - getfedora.org 的评分</a>然而,BroserDiet 的网页分析表明,这个网页需要加载 1.8MB 的文件。所以,我们现在有活干了!Web 优化网页中包含 281 KB 的 JavaScript 文件、203 KB 的 CSS 文件,还有 1.2 MB 的图片。我们先从最严重的问题 —— 图片开始入手。为了解决问题,你需要的工具集有 GIMP、ImageMagick 和 optipng. 你可以使用如下命令轻松安装它们:<pre class="prettyprint linenums">sudo dnf install gimp imagemagick optipng</pre>比如,我们先拿到这个 6.4 KB 的<a href="https://getfedora.org/static/images/cinnamon.png">文&#…
使用开源同步工具 Syncthing 控制你的数据
决定如何存储和共享您的个人信息。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/221100kbn1vv61a3lt2b13.png">Media</a>如今,我们的一些最重要的财产 —— 从家人和朋友的照片和视频到财务和医疗文件 —— 都是数据。即便是云存储服务的迅猛发展,我们仍有对隐私和个人数据缺乏控制的担忧。从棱镜监控计划到谷歌<a href="https://gizmodo.com/google-says-it-doesnt-go-through-your-inbox-anymore-bu-1827299695">让 APP 开发者扫描你的个人邮件</a>,这些新闻的报道应该会让我们对我们个人信息的安全性有所顾虑。<a href="https://syncthing.net/">Syncthing</a> 可以让你放下心来。它是一款开源的点对点文件同步工具,可以运行在 Linux、Windows、Mac、Android 和其他(抱歉,没有iOS)。Syncthing 使用自定的协议,叫<a href="3">块交换协议</a>。简而言之,Syncting 能让你无需拥有服务器来跨设备同步数据。在这篇文章中,我将解释如何在 Linux 电脑和安卓手机之间安装和同步文件。LinuxSyncting 在大多数流行的发行版都能下载。Fedora 28 包含其最新版本。要在 Fedora 上安装 Syncthing,你能在软件中心搜索,或者执行以下命令:<pre class="prettyprint linenums">sudo dnf install syncthing syncthing-gtk</pre>一旦安装好后,打开它。你将会看到一个助手帮你配置 Syncthing。点击 “Next” 直到它要求配置 WebUI。最安全的选项是选择“Listen on localhost”。那将会禁止 Web 界面并且阻止未经授权的用户。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/221458enntztxnwoe9nnlm.png">Media</a><em>Syncthing 安装时的 WebUI 对话框</em>关闭对话框。现在 Syncthing 安装好了。现在可以分享文件夹,连接一台设…
决定如何存储和共享您的个人信息。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/221100kbn1vv61a3lt2b13.png">Media</a>如今,我们的一些最重要的财产 —— 从家人和朋友的照片和视频到财务和医疗文件 —— 都是数据。即便是云存储服务的迅猛发展,我们仍有对隐私和个人数据缺乏控制的担忧。从棱镜监控计划到谷歌<a href="https://gizmodo.com/google-says-it-doesnt-go-through-your-inbox-anymore-bu-1827299695">让 APP 开发者扫描你的个人邮件</a>,这些新闻的报道应该会让我们对我们个人信息的安全性有所顾虑。<a href="https://syncthing.net/">Syncthing</a> 可以让你放下心来。它是一款开源的点对点文件同步工具,可以运行在 Linux、Windows、Mac、Android 和其他(抱歉,没有iOS)。Syncthing 使用自定的协议,叫<a href="3">块交换协议</a>。简而言之,Syncting 能让你无需拥有服务器来跨设备同步数据。在这篇文章中,我将解释如何在 Linux 电脑和安卓手机之间安装和同步文件。LinuxSyncting 在大多数流行的发行版都能下载。Fedora 28 包含其最新版本。要在 Fedora 上安装 Syncthing,你能在软件中心搜索,或者执行以下命令:<pre class="prettyprint linenums">sudo dnf install syncthing syncthing-gtk</pre>一旦安装好后,打开它。你将会看到一个助手帮你配置 Syncthing。点击 “Next” 直到它要求配置 WebUI。最安全的选项是选择“Listen on localhost”。那将会禁止 Web 界面并且阻止未经授权的用户。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/221458enntztxnwoe9nnlm.png">Media</a><em>Syncthing 安装时的 WebUI 对话框</em>关闭对话框。现在 Syncthing 安装好了。现在可以分享文件夹,连接一台设…
如何列出在 Linux 上已启用/激活的仓库
有很多方法可以列出在 Linux 已启用的仓库。我们将在下面展示给你列出已激活仓库的简便方法。Media
via https://linux.cn/article-10168-1.html
有很多方法可以列出在 Linux 已启用的仓库。我们将在下面展示给你列出已激活仓库的简便方法。Media
via https://linux.cn/article-10168-1.html
如何列出在 Linux 上已启用/激活的仓库
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/235306c9l9v687b4q62575.jpg">Media</a>有很多方法可以列出在 Linux 已启用的仓库。我们将在下面展示给你列出已激活仓库的简便方法。这有助于你知晓你的系统上都启用了哪些仓库。一旦你掌握了这些信息,你就可以添加任何之前还没有准备启用的仓库了。举个例子,如果你想启用 epel 仓库,你需要先检查它是否已经启用了。这篇教程将会帮助你做这件事情。什么是仓库?存储特定程序软件包的中枢位置就是一个软件仓库。所有的 Linux 发行版都在维护自己的仓库,而且允许用户下载并安装这些软件包到他们的机器上。每个仓库提供者都提供了一套包管理工具,用以管理他们的仓库,比如搜索、安装、更新、升级、移除等等。大多数 Linux 发行版都作为免费软件,除了 RHEL 和 SUSE,要访问他们的仓库你需要先购买订阅。<strong>建议阅读:</strong><a href="https://www.2daygeek.com/how-to-add-enable-disable-a-repository-dnf-yum-config-manager-on-linux/">在 Linux 上,如何通过 DNF/YUM 设置管理命令添加、启用、关闭一个仓库</a><a href="https://www.2daygeek.com/how-to-list-installed-packages-by-size-largest-on-linux/">在 Linux 上如何按大小列出已安装的包</a><a href="https://www.2daygeek.com/how-to-view-list-the-available-packages-updates-in-linux/">在 Linux 上如何列出升级的包</a><a href="https://www.2daygeek.com/how-to-view-a-particular-package-installed-updated-upgraded-removed-erased-date-on-linux/">在 Linux 上如何查看一个特定包安装/升级/更新/移除/清除的日期</a><a href="https://www.2daygeek.com/how-to-view-detailed-information-about-a-package-in-linux/">在 Linux 上如何查看一个包的详细信息</a><a href="https://www.2daygeek.com/how-to-search-if-a-package-is-available-on-your-linux…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/28/235306c9l9v687b4q62575.jpg">Media</a>有很多方法可以列出在 Linux 已启用的仓库。我们将在下面展示给你列出已激活仓库的简便方法。这有助于你知晓你的系统上都启用了哪些仓库。一旦你掌握了这些信息,你就可以添加任何之前还没有准备启用的仓库了。举个例子,如果你想启用 epel 仓库,你需要先检查它是否已经启用了。这篇教程将会帮助你做这件事情。什么是仓库?存储特定程序软件包的中枢位置就是一个软件仓库。所有的 Linux 发行版都在维护自己的仓库,而且允许用户下载并安装这些软件包到他们的机器上。每个仓库提供者都提供了一套包管理工具,用以管理他们的仓库,比如搜索、安装、更新、升级、移除等等。大多数 Linux 发行版都作为免费软件,除了 RHEL 和 SUSE,要访问他们的仓库你需要先购买订阅。<strong>建议阅读:</strong><a href="https://www.2daygeek.com/how-to-add-enable-disable-a-repository-dnf-yum-config-manager-on-linux/">在 Linux 上,如何通过 DNF/YUM 设置管理命令添加、启用、关闭一个仓库</a><a href="https://www.2daygeek.com/how-to-list-installed-packages-by-size-largest-on-linux/">在 Linux 上如何按大小列出已安装的包</a><a href="https://www.2daygeek.com/how-to-view-list-the-available-packages-updates-in-linux/">在 Linux 上如何列出升级的包</a><a href="https://www.2daygeek.com/how-to-view-a-particular-package-installed-updated-upgraded-removed-erased-date-on-linux/">在 Linux 上如何查看一个特定包安装/升级/更新/移除/清除的日期</a><a href="https://www.2daygeek.com/how-to-view-detailed-information-about-a-package-in-linux/">在 Linux 上如何查看一个包的详细信息</a><a href="https://www.2daygeek.com/how-to-search-if-a-package-is-available-on-your-linux…
如何在 Linux 上锁定虚拟控制台会话
我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。Media
via https://linux.cn/article-10169-1.html
我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。Media
via https://linux.cn/article-10169-1.html
如何在 Linux 上锁定虚拟控制台会话
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/184916y0fikww5t8sh4z75.png">Media</a>当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么。如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。要感谢 <strong>Vlock</strong>(<strong>V</strong>irtual Console <strong>lock</strong>),这是一个命令行程序,用于锁定 Linux 控制台上的一个或多个会话。如有必要,你可以锁定整个控制台并完全禁用虚拟控制台切换功能。Vlock 对于有多个用户访问控制台的共享 Linux 系统特别有用。安装 Vlock在基于 Arch 的系统上,Vlock 软件包被替换为默认预安装的 <strong>kpd</strong> 包,因此你无需为安装烦恼。在 Debian、Ubuntu、Linux Mint 上,运行以下命令来安装 Vlock:<pre class="prettyprint linenums">$ sudo apt-get install vlock</pre>在 Fedora 上:<pre class="prettyprint linenums">$ sudo dnf install vlock</pre>在 RHEL、CentOS 上:<pre class="prettyprint linenums">$ sudo yum install vlock</pre>在 Linux 上锁定虚拟控制台会话Vlock 的一般语法是:<pre class="prettyprint linenums">vlock [ -acnshv ] [ -t <timeout> ] [ plugins... ]</pre>这里:a —— 锁定所有虚拟控制台会话,c —— 锁定当前虚拟控制台会话,n —— 在锁定所有会话之前切换到新的空控制台,s —— 禁用 SysRq 键机制,t —— 指定屏保插件的超时时间,h —— 显示帮助,v —— 显示版本。让我举几个例子。1、 锁定当前控制台会话在没有任何参数的情况下运行 Vlock 时,它默认锁定当前控制台会话 (TYY)。要解锁会话,你需要输入当前用户的密码或 root 密码。<pre class="prettyprint linenums">$ vlock</pre><a href="https://dn-linuxcn.qbox.me/data/atta…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/184916y0fikww5t8sh4z75.png">Media</a>当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么。如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。要感谢 <strong>Vlock</strong>(<strong>V</strong>irtual Console <strong>lock</strong>),这是一个命令行程序,用于锁定 Linux 控制台上的一个或多个会话。如有必要,你可以锁定整个控制台并完全禁用虚拟控制台切换功能。Vlock 对于有多个用户访问控制台的共享 Linux 系统特别有用。安装 Vlock在基于 Arch 的系统上,Vlock 软件包被替换为默认预安装的 <strong>kpd</strong> 包,因此你无需为安装烦恼。在 Debian、Ubuntu、Linux Mint 上,运行以下命令来安装 Vlock:<pre class="prettyprint linenums">$ sudo apt-get install vlock</pre>在 Fedora 上:<pre class="prettyprint linenums">$ sudo dnf install vlock</pre>在 RHEL、CentOS 上:<pre class="prettyprint linenums">$ sudo yum install vlock</pre>在 Linux 上锁定虚拟控制台会话Vlock 的一般语法是:<pre class="prettyprint linenums">vlock [ -acnshv ] [ -t <timeout> ] [ plugins... ]</pre>这里:a —— 锁定所有虚拟控制台会话,c —— 锁定当前虚拟控制台会话,n —— 在锁定所有会话之前切换到新的空控制台,s —— 禁用 SysRq 键机制,t —— 指定屏保插件的超时时间,h —— 显示帮助,v —— 显示版本。让我举几个例子。1、 锁定当前控制台会话在没有任何参数的情况下运行 Vlock 时,它默认锁定当前控制台会话 (TYY)。要解锁会话,你需要输入当前用户的密码或 root 密码。<pre class="prettyprint linenums">$ vlock</pre><a href="https://dn-linuxcn.qbox.me/data/atta…
如何移除或禁用 Ubuntu Dock
如果你想用其它 dock(例如 Plank dock)或面板来替换 Ubuntu 18.04 中的 Dock,或者你想要移除或禁用 Ubuntu Dock,本文会告诉你如何做。Media
via https://linux.cn/article-10170-1.html
如果你想用其它 dock(例如 Plank dock)或面板来替换 Ubuntu 18.04 中的 Dock,或者你想要移除或禁用 Ubuntu Dock,本文会告诉你如何做。Media
via https://linux.cn/article-10170-1.html
如何移除或禁用 Ubuntu Dock
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/193718cfrnf5uwtczfq38n.png">Media</a>如果你想用其它 dock(例如 Plank dock)或面板来替换 Ubuntu 18.04 中的 Dock,或者你想要移除或禁用 Ubuntu Dock,本文会告诉你如何做。Ubuntu Dock - 屏幕左侧栏,可用于固定应用程序或访问已安装的应用程序。使用默认的 Ubuntu 会话时,<a href="https://bugs.launchpad.net/ubuntu/+source/gnome-tweak-tool/+bug/1713020">无法</a>使用 Gnome Tweaks 禁用它(禁用无效)。但是如果你需要,还是有几种方法来摆脱它的。下面我将列出 4 种方法可以移除或禁用 Ubuntu Dock,以及每个方法的缺点(如果有的话),还有如何撤销每个方法的更改。本文还包括在没有 Ubuntu Dock 的情况下访问活动概览Activities Overview和已安装应用程序列表的其它方法。如何在没有 Ubuntu Dock 的情况下访问活动概览如果没有 Ubuntu Dock,你可能无法访问活动的或已安装的应用程序列表(可以通过单击 Dock 底部的“显示应用程序”按钮从 Ubuntu Dock 访问)。例如,如果你想使用 Plank Dock 就是这样。显然,如果你安装了 Dash to Panel 扩展来替代 Ubuntu Dock,那么还好。因为 Dash to Panel 提供了一个按钮来访问活动概览或已安装的应用程序。根据你计划用来替代 Ubuntu Dock 的软件,如果无法访问活动概览,那么你可以启用“活动概览热角”选项,只需将鼠标移动到屏幕的左上角即可打开活动概览。访问已安装的应用程序列表的另一种方法是使用快捷键:Super + A。如果要启用“活动概览热角”,使用以下命令:<pre class="prettyprint linenums">gsettings set org.gnome.shell enable-hot…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/193718cfrnf5uwtczfq38n.png">Media</a>如果你想用其它 dock(例如 Plank dock)或面板来替换 Ubuntu 18.04 中的 Dock,或者你想要移除或禁用 Ubuntu Dock,本文会告诉你如何做。Ubuntu Dock - 屏幕左侧栏,可用于固定应用程序或访问已安装的应用程序。使用默认的 Ubuntu 会话时,<a href="https://bugs.launchpad.net/ubuntu/+source/gnome-tweak-tool/+bug/1713020">无法</a>使用 Gnome Tweaks 禁用它(禁用无效)。但是如果你需要,还是有几种方法来摆脱它的。下面我将列出 4 种方法可以移除或禁用 Ubuntu Dock,以及每个方法的缺点(如果有的话),还有如何撤销每个方法的更改。本文还包括在没有 Ubuntu Dock 的情况下访问活动概览Activities Overview和已安装应用程序列表的其它方法。如何在没有 Ubuntu Dock 的情况下访问活动概览如果没有 Ubuntu Dock,你可能无法访问活动的或已安装的应用程序列表(可以通过单击 Dock 底部的“显示应用程序”按钮从 Ubuntu Dock 访问)。例如,如果你想使用 Plank Dock 就是这样。显然,如果你安装了 Dash to Panel 扩展来替代 Ubuntu Dock,那么还好。因为 Dash to Panel 提供了一个按钮来访问活动概览或已安装的应用程序。根据你计划用来替代 Ubuntu Dock 的软件,如果无法访问活动概览,那么你可以启用“活动概览热角”选项,只需将鼠标移动到屏幕的左上角即可打开活动概览。访问已安装的应用程序列表的另一种方法是使用快捷键:Super + A。如果要启用“活动概览热角”,使用以下命令:<pre class="prettyprint linenums">gsettings set org.gnome.shell enable-hot…
命令行:增强版
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204617yz2aaxzfrlyc22nl.jpg">Media</a>我不确定有多少 Web 开发者能完全避免使用命令行。就我来说,我从 1997 年上大学就开始使用命令行了,那时的 l33t-hacker 让我着迷,同时我也觉得它很难掌握。过去这些年我的命令行本领在逐步加强,我经常会去搜寻工作中能用的更好的命令行工具。下面就是我现在使用的用于增强原有命令行工具的列表。怎么忽略我所做的命令行增强通常情况下我会用别名将新的增强的命令行工具覆盖原来的命令(如 cat 和 ping)。如果我需要运行原来的命令的话(有时我确实需要这么做),我会像下面这样来运行未加修改的原始命令。(我用的是 Mac,你的用法可能不一样)<pre class="prettyprint linenums">$ \cat # 忽略叫 "cat" 的别名 - 具体解释: https://stackoverflow.com/a/16506263/22617$ command cat # 忽略函数和别名</pre>bat > catcat 用于打印文件的内容,如果你平时用命令行很多的话,例如语法高亮之类的功能会非常有用。我首先发现了 <a href="https://github.com/jingweno/ccat">ccat</a> 这个有语法高亮功能的工具,然后我发现了 <a href="https://github.com/sharkdp/bat">bat</a>,它的功能有语法高亮、分页、行号和 git 集成。bat 命令也能让我在(多于一屏的)输出里使用 / 搜索(和用 less 搜索功能一样)。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204653xppy14y8y4zu6h7s.gif">Simple bat output</a>我将别名 cat 指到了 bat 命令:<pre class="prettyprint linenums">alias cat='bat'</pre><a href="https://github.com/sharkdp/bat">安装指引</a>prettyping > pingping 非常有用,当我碰到“糟了,是不是 X 挂了?/我的网不通了?”这种情况下我最先想到的工具就是它了。但是 prettyping(“prettyping” 可不是指“pre typing”)在 ping 的基础上加了友好的输出,这可让我感觉命令行友好了很多呢。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204655zcznq3x70xjexzv3.gif">prettyping</a>我也将 ping 用别名链接到了 prettyping 命令:<pre class="prettyprint linenums">alias ping='prettyping --nolegend'</pre><a href="http://denilson.sa.nom.br/prettyping/">安装指引</a>fzf > ctrl+r在终端里,使用 ctrl+r 将允许你在命令历史里<a href="https://lifehacker.com/278888/ctrl%252Br-to-search-and-other-terminal-history-tricks">反向搜索</a>使用过的命令,这是个挺好的小技巧,尽管它有点麻烦。fzf 这个工具相比于 ctrl+r 有了<strong>巨大的</strong>进步。它能针对命令行历史进行模糊查询,并且提供了对可能的合格结果进行全面交互式预览。除了搜索命令历史,fzf 还能预览和打开文件,我在下面的视频里展示了这些功能。为了这个预览的效果,我创建了一个叫 preview 的别名,它将 fzf 和前文提到的 bat 组合起来完成预览功能,还给上面绑定了一个定制的热键 ctrl+o 来打开 VS Code:<pre class="prettyprint linenums">alias preview="fzf --preview 'bat --color \"always\" {}'"# 支持在 VS Code 里用 ctrl+o 来打开选择的文件export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"</pre><a href="https://github.com/junegunn/fzf">安装指引</a>htop > toptop 是当我想快速诊断为什么机器上的 CPU 跑的那么累或者风扇为什么突然呼呼大做的时候首先会想到的工具。我在生产环境也会使用这个工具。讨厌的是 Mac 上的 top 和 Linux 上的 top 有着极大的不同(恕我直言,应该是差的多)。不过,htop 是对 Linux 上的 top 和 Mac 上蹩脚的 top 的极大改进。它增加了包括颜色输出,键盘热键绑定以及不同的视图输出,这对理解进程之间的父子关系有极大帮助。一些很容易上手的热键:P —— 按 CPU 使用率排序M —— 按内存使用排序F4 —— 用字符串过滤进程(例如只看包括 node 的进程)space —— 锚定一个单独进程,这样我能观察它是否有尖峰状态<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204657hnfne1peg857gtdq.jpg">htop output</a>在 Mac Sierra 上 htop 有个奇怪的 bug,不过这个 bug 可以通过以 root 运行来绕过(我实在记不清这个 bug 是什么,但是这个别名能搞定它,有点讨厌的是我得每次都输入 root 密码。):<pre class="prettyprint linenums">alias top="sudo htop" # 给 top 加上别名并且绕过 Sierra 上的 bug</pre><a href="http://hisham.hm/htop/">安装指引</a>diff-so-fancy > diff我非常确定我是几年前从 Paul Irish 那儿学来的这个技巧,尽管我很少直接使用 diff,但我的 git 命令行会一直使用 diff。diff-so-fancy 给了我代码语法颜色和更改字符高亮的功能。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204658r8zajeo2b98ase4b.jpg">diff so fancy</a>在我的 ~/.gitconfig 文件里我用了下面的选项来打开 git diff 和 git show 的 diff-so-fancy 功能。<pre class="prettyprint linenums">[pager] diff = diff-so-fancy | less --tabs=1,5 -RFX show = diff-so-fancy | less --tabs=1,5 -RFX</pre><a href="https://github.com/so-fancy/diff-so-fancy">安装指引</a>fd > find尽管我使用 Mac,但我绝不是 Spotlight 的粉丝,我觉得它的性能很差,关键字也难记,加上更新它自己的数据库时会拖慢 CPU,简直一无是处。我经常使用 <a href="https://www.alfredapp.com/">Alfred</a>,但是它的搜索功能也不是很好。我倾向于在命令行中搜索文件,但是 find 的难用在于很难去记住那些合适的表达式来描述我想要的文件。(而且 Mac 上的 find 命令和非 Mac 的 find 命令还有些许不同,这更加深了我的失望。)fd 是一个很好的替代品(它的作者和 bat 的作者是同一个人)。它非常快而且对于我经常要搜索的命令非常好记。几个上手的例子:<pre class="prettyprint linenums">$ fd cli # 所有包含 "cli" 的文件名$ fd -e md # 所有以 .md 作为扩展名的文件$ fd cli -x wc -w # 搜索 "cli" 并且在每个搜索结果上运行 `wc -w`</pre><a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204700varcm94gce19m91g.png">fd output</a><a href="https://github.com/sharkdp/fd/">安装指引</a>ncdu > du对我来说,知道当前磁盘空间被什么占用了非常重要。我用过 Mac 上的 <a href="https://daisydiskapp.com/">DaisyDisk</a>,但是我觉得那个程序产生结果有点慢。du -sh 命令是我经常会运行的命令(-sh 是指结果以“汇总…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204617yz2aaxzfrlyc22nl.jpg">Media</a>我不确定有多少 Web 开发者能完全避免使用命令行。就我来说,我从 1997 年上大学就开始使用命令行了,那时的 l33t-hacker 让我着迷,同时我也觉得它很难掌握。过去这些年我的命令行本领在逐步加强,我经常会去搜寻工作中能用的更好的命令行工具。下面就是我现在使用的用于增强原有命令行工具的列表。怎么忽略我所做的命令行增强通常情况下我会用别名将新的增强的命令行工具覆盖原来的命令(如 cat 和 ping)。如果我需要运行原来的命令的话(有时我确实需要这么做),我会像下面这样来运行未加修改的原始命令。(我用的是 Mac,你的用法可能不一样)<pre class="prettyprint linenums">$ \cat # 忽略叫 "cat" 的别名 - 具体解释: https://stackoverflow.com/a/16506263/22617$ command cat # 忽略函数和别名</pre>bat > catcat 用于打印文件的内容,如果你平时用命令行很多的话,例如语法高亮之类的功能会非常有用。我首先发现了 <a href="https://github.com/jingweno/ccat">ccat</a> 这个有语法高亮功能的工具,然后我发现了 <a href="https://github.com/sharkdp/bat">bat</a>,它的功能有语法高亮、分页、行号和 git 集成。bat 命令也能让我在(多于一屏的)输出里使用 / 搜索(和用 less 搜索功能一样)。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204653xppy14y8y4zu6h7s.gif">Simple bat output</a>我将别名 cat 指到了 bat 命令:<pre class="prettyprint linenums">alias cat='bat'</pre><a href="https://github.com/sharkdp/bat">安装指引</a>prettyping > pingping 非常有用,当我碰到“糟了,是不是 X 挂了?/我的网不通了?”这种情况下我最先想到的工具就是它了。但是 prettyping(“prettyping” 可不是指“pre typing”)在 ping 的基础上加了友好的输出,这可让我感觉命令行友好了很多呢。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204655zcznq3x70xjexzv3.gif">prettyping</a>我也将 ping 用别名链接到了 prettyping 命令:<pre class="prettyprint linenums">alias ping='prettyping --nolegend'</pre><a href="http://denilson.sa.nom.br/prettyping/">安装指引</a>fzf > ctrl+r在终端里,使用 ctrl+r 将允许你在命令历史里<a href="https://lifehacker.com/278888/ctrl%252Br-to-search-and-other-terminal-history-tricks">反向搜索</a>使用过的命令,这是个挺好的小技巧,尽管它有点麻烦。fzf 这个工具相比于 ctrl+r 有了<strong>巨大的</strong>进步。它能针对命令行历史进行模糊查询,并且提供了对可能的合格结果进行全面交互式预览。除了搜索命令历史,fzf 还能预览和打开文件,我在下面的视频里展示了这些功能。为了这个预览的效果,我创建了一个叫 preview 的别名,它将 fzf 和前文提到的 bat 组合起来完成预览功能,还给上面绑定了一个定制的热键 ctrl+o 来打开 VS Code:<pre class="prettyprint linenums">alias preview="fzf --preview 'bat --color \"always\" {}'"# 支持在 VS Code 里用 ctrl+o 来打开选择的文件export FZF_DEFAULT_OPTS="--bind='ctrl-o:execute(code {})+abort'"</pre><a href="https://github.com/junegunn/fzf">安装指引</a>htop > toptop 是当我想快速诊断为什么机器上的 CPU 跑的那么累或者风扇为什么突然呼呼大做的时候首先会想到的工具。我在生产环境也会使用这个工具。讨厌的是 Mac 上的 top 和 Linux 上的 top 有着极大的不同(恕我直言,应该是差的多)。不过,htop 是对 Linux 上的 top 和 Mac 上蹩脚的 top 的极大改进。它增加了包括颜色输出,键盘热键绑定以及不同的视图输出,这对理解进程之间的父子关系有极大帮助。一些很容易上手的热键:P —— 按 CPU 使用率排序M —— 按内存使用排序F4 —— 用字符串过滤进程(例如只看包括 node 的进程)space —— 锚定一个单独进程,这样我能观察它是否有尖峰状态<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204657hnfne1peg857gtdq.jpg">htop output</a>在 Mac Sierra 上 htop 有个奇怪的 bug,不过这个 bug 可以通过以 root 运行来绕过(我实在记不清这个 bug 是什么,但是这个别名能搞定它,有点讨厌的是我得每次都输入 root 密码。):<pre class="prettyprint linenums">alias top="sudo htop" # 给 top 加上别名并且绕过 Sierra 上的 bug</pre><a href="http://hisham.hm/htop/">安装指引</a>diff-so-fancy > diff我非常确定我是几年前从 Paul Irish 那儿学来的这个技巧,尽管我很少直接使用 diff,但我的 git 命令行会一直使用 diff。diff-so-fancy 给了我代码语法颜色和更改字符高亮的功能。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204658r8zajeo2b98ase4b.jpg">diff so fancy</a>在我的 ~/.gitconfig 文件里我用了下面的选项来打开 git diff 和 git show 的 diff-so-fancy 功能。<pre class="prettyprint linenums">[pager] diff = diff-so-fancy | less --tabs=1,5 -RFX show = diff-so-fancy | less --tabs=1,5 -RFX</pre><a href="https://github.com/so-fancy/diff-so-fancy">安装指引</a>fd > find尽管我使用 Mac,但我绝不是 Spotlight 的粉丝,我觉得它的性能很差,关键字也难记,加上更新它自己的数据库时会拖慢 CPU,简直一无是处。我经常使用 <a href="https://www.alfredapp.com/">Alfred</a>,但是它的搜索功能也不是很好。我倾向于在命令行中搜索文件,但是 find 的难用在于很难去记住那些合适的表达式来描述我想要的文件。(而且 Mac 上的 find 命令和非 Mac 的 find 命令还有些许不同,这更加深了我的失望。)fd 是一个很好的替代品(它的作者和 bat 的作者是同一个人)。它非常快而且对于我经常要搜索的命令非常好记。几个上手的例子:<pre class="prettyprint linenums">$ fd cli # 所有包含 "cli" 的文件名$ fd -e md # 所有以 .md 作为扩展名的文件$ fd cli -x wc -w # 搜索 "cli" 并且在每个搜索结果上运行 `wc -w`</pre><a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/29/204700varcm94gce19m91g.png">fd output</a><a href="https://github.com/sharkdp/fd/">安装指引</a>ncdu > du对我来说,知道当前磁盘空间被什么占用了非常重要。我用过 Mac 上的 <a href="https://daisydiskapp.com/">DaisyDisk</a>,但是我觉得那个程序产生结果有点慢。du -sh 命令是我经常会运行的命令(-sh 是指结果以“汇总…
用这个漂亮的工具将方程式截图迅速转换为 LaTeX
Mathpix 是一个漂亮的小工具,它允许你截取复杂数学方程式的截图,并立即将其转换为 LaTeX 可编辑文本。Media
via https://linux.cn/article-10172-1.html
Mathpix 是一个漂亮的小工具,它允许你截取复杂数学方程式的截图,并立即将其转换为 LaTeX 可编辑文本。Media
via https://linux.cn/article-10172-1.html
理解 Linux 链接(一)
链接是可以将文件和目录放在你希望它们放在的位置的另一种方式。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/30/235607uc4dohmhoal96u28.jpg">Media</a>除了 cp 和 mv 这两个我们在<a href="https://www.linux.com/blog/2018/8/linux-beginners-moving-things-around">本系列的前一部分</a>中详细讨论过的,链接是可以将文件和目录放在你希望它们放在的位置的另一种方式。它的优点是可以让你同时在多个位置显示一个文件或目录。如前所述,在物理磁盘这个级别上,文件和目录之类的东西并不真正存在。文件系统是为了方便人类使用,将它们虚构出来。但在磁盘级别上,有一个名为分区表partition table的东西,它位于每个分区的开头,然后数据分散在磁盘的其余部分。虽然有不同类型的分区表,但是在分区开头的那个表包含的数据将映射每个目录和文件的开始和结束位置。分区表的就像一个索引:当从磁盘加载文件时,操作系统会查找表中的条目,分区表会告诉文件在磁盘上的起始位置和结束位置。然后磁盘头移动到起点,读取数据,直到它到达终点,您看:这就是你的文件。硬链接硬链接只是分区表中的一个条目,它指向磁盘上的某个区域,表示该区域<strong>已经被分配给文件</strong>。换句话说,硬链接指向已经被另一个条目索引的数据。让我们看看它是如何工作的。打开终端,创建一个实验目录并进入:<pre class="prettyprint linenums">mkdir test_dircd test_dir</pre>使用 <a href="https://www.linux.com/…
链接是可以将文件和目录放在你希望它们放在的位置的另一种方式。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/30/235607uc4dohmhoal96u28.jpg">Media</a>除了 cp 和 mv 这两个我们在<a href="https://www.linux.com/blog/2018/8/linux-beginners-moving-things-around">本系列的前一部分</a>中详细讨论过的,链接是可以将文件和目录放在你希望它们放在的位置的另一种方式。它的优点是可以让你同时在多个位置显示一个文件或目录。如前所述,在物理磁盘这个级别上,文件和目录之类的东西并不真正存在。文件系统是为了方便人类使用,将它们虚构出来。但在磁盘级别上,有一个名为分区表partition table的东西,它位于每个分区的开头,然后数据分散在磁盘的其余部分。虽然有不同类型的分区表,但是在分区开头的那个表包含的数据将映射每个目录和文件的开始和结束位置。分区表的就像一个索引:当从磁盘加载文件时,操作系统会查找表中的条目,分区表会告诉文件在磁盘上的起始位置和结束位置。然后磁盘头移动到起点,读取数据,直到它到达终点,您看:这就是你的文件。硬链接硬链接只是分区表中的一个条目,它指向磁盘上的某个区域,表示该区域<strong>已经被分配给文件</strong>。换句话说,硬链接指向已经被另一个条目索引的数据。让我们看看它是如何工作的。打开终端,创建一个实验目录并进入:<pre class="prettyprint linenums">mkdir test_dircd test_dir</pre>使用 <a href="https://www.linux.com/…
如何在 Linux 中一次重命名多个文件
在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件。 此命令用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。Media
via https://linux.cn/article-10174-1.html
在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件。 此命令用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。Media
via https://linux.cn/article-10174-1.html
如何在 Linux 中一次重命名多个文件
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/092758rlc51ctl3tlcr9cl.png">Media</a>你可能已经知道,我们使用 mv 命令在类 Unix 操作系统中重命名或者移动文件和目录。 但是,mv 命令不支持一次重命名多个文件。 不用担心。 在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件。 此命令用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。在 Linux 中一次重命名多个文件mmv 程序可在基于 Debian 的系统的默认仓库中使用。 要想在 Debian、Ubuntu、Linux Mint 上安装它,请运行以下命令:<pre class="prettyprint linenums">$ sudo apt-get install mmv</pre>我们假设你在当前目录中有以下文件。<pre class="prettyprint linenums">$ lsa1.txt a2.txt a3.txt</pre>现在,你想要将所有以字母 “a” 开头的文件重命名为以 “b” 开头的。 当然,你可以在几秒钟内手动执行此操作。 但是想想你是否有数百个文件想要重命名? 这是一个非常耗时的过程。 这时候 mmv 命令就很有帮助了。要将所有以字母 “a” 开头的文件重命名为以字母 “b” 开头的,只需要运行:<pre class="prettyprint linenums">$ mmv a\* b\#1</pre>让我们检查一下文件是否都已经重命名了。<pre class="prettyprint linenums">$ lsb1.txt b2.txt b3.txt</pre>如你所见,所有以字母 “a” 开头的文件(即 a1.txt、a2.txt、a3.txt)都重命名为 b1.txt、b2.txt、b3.txt。<strong>解释</strong>在上面的例子中,第一个参数(a\*)是 “from” 模式,第二个参数是 “to” 模式(b\#1)。根据上面的例子,mmv 将查找任何以字母 “a” 开头的文件名,并根据第二个参数重命名匹配的…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/092758rlc51ctl3tlcr9cl.png">Media</a>你可能已经知道,我们使用 mv 命令在类 Unix 操作系统中重命名或者移动文件和目录。 但是,mv 命令不支持一次重命名多个文件。 不用担心。 在本教程中,我们将学习使用 Linux 中的 mmv 命令一次重命名多个文件。 此命令用于在类 Unix 操作系统中使用标准通配符批量移动、复制、追加和重命名文件。在 Linux 中一次重命名多个文件mmv 程序可在基于 Debian 的系统的默认仓库中使用。 要想在 Debian、Ubuntu、Linux Mint 上安装它,请运行以下命令:<pre class="prettyprint linenums">$ sudo apt-get install mmv</pre>我们假设你在当前目录中有以下文件。<pre class="prettyprint linenums">$ lsa1.txt a2.txt a3.txt</pre>现在,你想要将所有以字母 “a” 开头的文件重命名为以 “b” 开头的。 当然,你可以在几秒钟内手动执行此操作。 但是想想你是否有数百个文件想要重命名? 这是一个非常耗时的过程。 这时候 mmv 命令就很有帮助了。要将所有以字母 “a” 开头的文件重命名为以字母 “b” 开头的,只需要运行:<pre class="prettyprint linenums">$ mmv a\* b\#1</pre>让我们检查一下文件是否都已经重命名了。<pre class="prettyprint linenums">$ lsb1.txt b2.txt b3.txt</pre>如你所见,所有以字母 “a” 开头的文件(即 a1.txt、a2.txt、a3.txt)都重命名为 b1.txt、b2.txt、b3.txt。<strong>解释</strong>在上面的例子中,第一个参数(a\*)是 “from” 模式,第二个参数是 “to” 模式(b\#1)。根据上面的例子,mmv 将查找任何以字母 “a” 开头的文件名,并根据第二个参数重命名匹配的…
MidnightBSD 发布 1.0!
Lucas 创建了 MightnightBSD,这成为桌面用户和 BSD 新手的一个选择。他想创造一个能让人们快速体验 BSD 桌面的东西。他认为其他发行版过于关注服务器市场。Media
via https://linux.cn/article-10175-1.html
Lucas 创建了 MightnightBSD,这成为桌面用户和 BSD 新手的一个选择。他想创造一个能让人们快速体验 BSD 桌面的东西。他认为其他发行版过于关注服务器市场。Media
via https://linux.cn/article-10175-1.html
MidnightBSD 发布 1.0!
几天前,Lucas Holt 宣布发布 MidnightBSD 1.0。让我们快速看一下这个新版本中包含的内容。什么是 MidnightBSD?<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/093807l88xtkvfcqob3tlk.jpg">MidnightBSD</a><a href="https://www.midnightbsd.org/">MidnightBSD</a> 是 FreeBSD 的一个分支。Lucas 创建了 MightnightBSD,这成为桌面用户和 BSD 新手的一个选择。他想创造一个能让人们快速体验 BSD 桌面的东西。他认为其他发行版过于关注服务器市场。MidnightBSD 1.0 中有什么?根据<a href="https://www.midnightbsd.org/notes/">发布说明</a>(<a href="https://www.youtube.com/embed/-rlk2wFsjJ4">视频</a>),1.0 中的大部分工作都是更新基础系统,改进包管理器和更新工具。新版本与 FreeBSD 10-Stable 兼容。Mports(MidnightBSD 的包管理系统)已经升级支持使用一个命令安装多个包。<code>mport upgrade</code> 命令已经修复。Mports 现在会跟踪已弃用和过期的包。它还引入了新的包格式。其他变化包括:现在支持 <a href="https://itsfoss.com/what-is-zfs/">ZFS</a> 作为启动文件系统。以前,ZFS 只能用于附加存储。 * 支持 NVME SSD。 * AMD Ryzen 和 Radeon 的支持得到了改善。 * Intel、Broadcom 和其他驱动程序已更新。 * 已从 FreeBSD 移植 bhyve 支持。 * 传感器框架已被删除,因为它导致锁定问题。 * 删除了 Sudo 并用 OpenBSD 中的 <a href="https://man.openbsd.org/doas">doas</a> 替换。 * 增加了对 Microsoft hyper-v 的支持。升级之前如果你当前是 MidnightBSD 的用户或正在考虑尝试新版本,那么还是再等一会。Lucas 目前正在重建软件包以支持新的软件包格式和工具。他还计划在未来几个月内升级软件包和移植桌面环境。他目前正致力于移植 Firefox 52 ESR,因为它是最后一È…
几天前,Lucas Holt 宣布发布 MidnightBSD 1.0。让我们快速看一下这个新版本中包含的内容。什么是 MidnightBSD?<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/093807l88xtkvfcqob3tlk.jpg">MidnightBSD</a><a href="https://www.midnightbsd.org/">MidnightBSD</a> 是 FreeBSD 的一个分支。Lucas 创建了 MightnightBSD,这成为桌面用户和 BSD 新手的一个选择。他想创造一个能让人们快速体验 BSD 桌面的东西。他认为其他发行版过于关注服务器市场。MidnightBSD 1.0 中有什么?根据<a href="https://www.midnightbsd.org/notes/">发布说明</a>(<a href="https://www.youtube.com/embed/-rlk2wFsjJ4">视频</a>),1.0 中的大部分工作都是更新基础系统,改进包管理器和更新工具。新版本与 FreeBSD 10-Stable 兼容。Mports(MidnightBSD 的包管理系统)已经升级支持使用一个命令安装多个包。<code>mport upgrade</code> 命令已经修复。Mports 现在会跟踪已弃用和过期的包。它还引入了新的包格式。其他变化包括:现在支持 <a href="https://itsfoss.com/what-is-zfs/">ZFS</a> 作为启动文件系统。以前,ZFS 只能用于附加存储。 * 支持 NVME SSD。 * AMD Ryzen 和 Radeon 的支持得到了改善。 * Intel、Broadcom 和其他驱动程序已更新。 * 已从 FreeBSD 移植 bhyve 支持。 * 传感器框架已被删除,因为它导致锁定问题。 * 删除了 Sudo 并用 OpenBSD 中的 <a href="https://man.openbsd.org/doas">doas</a> 替换。 * 增加了对 Microsoft hyper-v 的支持。升级之前如果你当前是 MidnightBSD 的用户或正在考虑尝试新版本,那么还是再等一会。Lucas 目前正在重建软件包以支持新的软件包格式和工具。他还计划在未来几个月内升级软件包和移植桌面环境。他目前正致力于移植 Firefox 52 ESR,因为它是最后一È…
用 350 行代码从零开始,将 Lisp 编译成 JavaScript
我们将会在本篇文章中看到从零开始实现的编译器,将简单的类 LISP 计算语言编译成 JavaScript。Media
via https://linux.cn/article-10176-1.html
我们将会在本篇文章中看到从零开始实现的编译器,将简单的类 LISP 计算语言编译成 JavaScript。Media
via https://linux.cn/article-10176-1.html
用 350 行代码从零开始,将 Lisp 编译成 JavaScript
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/101755m9sy6j1zdhzh9gh2.jpg">Media</a>我们将会在本篇文章中看到从零开始实现的编译器,将简单的类 LISP 计算语言编译成 JavaScript。完整的源代码在 <a href="https://gist.github.com/soupi/d4ff0727ccb739045fad6cdf533ca7dd">这里</a>。我们将会:自定义语言,并用它编写一个简单的程序实现一个简单的解析器组合器为该语言实现一个解析器为该语言实现一个美观的打印器为我们的用途定义 JavaScript 的一个子集实现代码转译器,将代码转译成我们定义的 JavaScript 子集把所有东西整合在一起开始吧!1、定义语言Lisp 族语言最迷人的地方在于,它们的语法就是树状表示的,这就是这门语言很容易解析的原因。我们很快就能接触到它。但首先让我们把自己的语言定义好。关于我们语言的语法的范式(BNF)描述如下:<pre class="prettyprint linenums">program ::= exprexpr ::= <integer> | <name> | ([<expr>])</pre>基本上,我们可以在该语言的最顶层定义表达式并对其进行运算。表达式由一个整数(比如 5)、一个变量(比如 x)或者一个表达式列表(比如 (add x 1))组成。整数对应它本身的值,变量对应它在当前环境中绑定的值,表达式列表对应一个函数调用,该列表的第一个参数是相应的函数,剩下的表达式是传递给这个函数的参数。该语言中,我们保留一些内建的特殊形式,这样我们就能做一些更有意思的事情:let 表达式使我们可以在它的 body 环境中引入新…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201810/31/101755m9sy6j1zdhzh9gh2.jpg">Media</a>我们将会在本篇文章中看到从零开始实现的编译器,将简单的类 LISP 计算语言编译成 JavaScript。完整的源代码在 <a href="https://gist.github.com/soupi/d4ff0727ccb739045fad6cdf533ca7dd">这里</a>。我们将会:自定义语言,并用它编写一个简单的程序实现一个简单的解析器组合器为该语言实现一个解析器为该语言实现一个美观的打印器为我们的用途定义 JavaScript 的一个子集实现代码转译器,将代码转译成我们定义的 JavaScript 子集把所有东西整合在一起开始吧!1、定义语言Lisp 族语言最迷人的地方在于,它们的语法就是树状表示的,这就是这门语言很容易解析的原因。我们很快就能接触到它。但首先让我们把自己的语言定义好。关于我们语言的语法的范式(BNF)描述如下:<pre class="prettyprint linenums">program ::= exprexpr ::= <integer> | <name> | ([<expr>])</pre>基本上,我们可以在该语言的最顶层定义表达式并对其进行运算。表达式由一个整数(比如 5)、一个变量(比如 x)或者一个表达式列表(比如 (add x 1))组成。整数对应它本身的值,变量对应它在当前环境中绑定的值,表达式列表对应一个函数调用,该列表的第一个参数是相应的函数,剩下的表达式是传递给这个函数的参数。该语言中,我们保留一些内建的特殊形式,这样我们就能做一些更有意思的事情:let 表达式使我们可以在它的 body 环境中引入新…