分类 技术 下的文章

本文将帮助你了解在 Ubuntu 和 Fedora 中设置 Python 开发环境的基础知识和步骤。

Python 由于其强大的库、简单的语法和可移植性,在过去几年中变得很流行。目前几乎所有的企业系统都在使用它。

因此,如果你正试图建立你的 Python 环境,并想知道如何开始等等,那么你就找到正确的地方了。在这里,我试图给你一些开始的步骤。

在 Ubuntu 和 Fedora 中设置 Python 开发环境

Python 版本

如果你刚刚开始 Python 开发,那么建议你使用最新的 Python 3.x 进行开发,因为 Python 2.x 已经不再支持了。几乎所有领先的 Linux 发行版都取消了对 Python 2 的依赖。

如果你正在运行 Fedora 或 Ubuntu 的最新发行版,那么你应该已经安装了 Python 3.x,并设置为默认解释器。例如,Fedora 37 和 Ubuntu 22.04 LTS 将 Python 3.11 作为默认的 Python 交互界面。

找到你的 Python 版本的一个快速方法是在 Ubuntu 和 Fedora 的终端运行以下命令:

python2
python3

python3

如果你运行的是早期版本的 Ubuntu 或 Fedora,那么你可以使用以下命令安装最新的 Python 3.x:

Ubuntu:

sudo apt install python3

Fedora:

sudo dnf install python3

另外,运行下面的命令,找出当前系统中 Python 可执行文件的路径:

Which python

切换默认解释器的版本

如果你的系统安装了多个 Python 版本 —— 2.x 和 3.x,并且你想在它们之间切换,也是可以的。

如果你只安装了一个版本,你可以跳过这一节。

要进行切换,首先,从终端运行 python,找出默认的可执行路径。理想情况下,它应该是 /usr/bin/python。现在,运行下面的程序,找出通往可执行文件的符号链接:

ln -l /usr/bin/python
lrwxrwxrwx 1 root root .... /usr/bin/pyhton -> python2

现在检查一下 $PATH 变量,确定系统查找可执行文件的路径连接顺序:

echo $PATH

PATH 变量

你可以看到 /usr/local/bin/usr/bin/ 之前,那么你可以创建一个软符号链接到 python3。然后你的解释器在运行 python 命令时就会找到最新的 Python 3 而不是 Python 2。

ls -s /usr/bin/python3 /usr/local/bin/python

现在你应该注销并再次登录以清除任何哈希条目,或者你可以运行 hash -r 来清除它们。

现在你可以从终端运行 python,你应该有最新的 Python 3 了。

Python IDE

集成开发环境(IDE)可以帮助你编写、编译和执行你的代码。有 几个免费的 Python 集成开发环境 —— 如 PyCharm、Eclipse、Eric 等,你可以使用。但那将是另一篇关于其优点和缺点的文章。

如果你从官方 python.org 网站下载 Python,Python 还带着一个叫做 IDLE 的默认开发环境。IDLE 适合于起步,之后你可以决定选择任何一个最好的免费 Python IDE。

在 Ubuntu 和 Fedora 中,IDLE 并没有和 Python 一起被默认包含,你必须手动安装它。从终端运行下面的命令来手动安装 IDLE:

Ubuntu:

sudo apt install idle

Fedora:

sudo dnf install python-tools

安装后,你可以从命令行空闲启动 IDLE 或从应用程序中搜索。

IDLE

现在,你可以使用 IDLE 开始你的开发。大部分的基本选项你可以在 IDLE 的文件菜单中找到。

我希望这篇指南解释了你在开始 Python 开发之前应该知道的东西。 尽管本指南主要是针对 Ubuntu 和 Fedora 的,但你仍然可以在所有基于 Ubuntu 和 Fedora 的发行版上参考它。如果你在 Python 环境设置方面遇到问题,请在下面的评论区告诉我。


via: https://www.debugpoint.com/setup-python-environment-ubuntu-fedora/

作者:Arindam 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本教程将指导你用最简单的步骤在 Windows 上的 Oracle VirtualBox 上安装 Ubuntu 桌面版。

VirtualBox 是 Oracle 的一款流行的虚拟化软件,可用于 Linux、mac 和 Windows 系统。它是灵活的,并提供了许多功能来实现虚拟化。这是在 Windows 中体验 Ubuntu 而不安装它的最佳且简单的方法。然而,我强烈建议将 Ubuntu 以双引导的方式安装在物理机上,从而更好地体验 Ubuntu。

下面列出的步骤假设你是第一次在 Windows 中安装 Ubuntu。因此,这些步骤有点描述性,也有点冗长。此外,以下步骤适用于 Windows 10 和 Windows 11 作为宿主机。

你需要什么

  • 可上网的 PC
  • 用于安装的 Ubuntu Linux ISO 镜像文件
  • 安装了 VirtualBox 的 Windows 系统

使用 VirtualBox 在 Windows 上安装 Ubuntu

下载并安装必要的东西

从以下链接下载 Ubuntu Linux 桌面版 ISO 镜像文件。

下载 Ubuntu 桌面版

此外,请从下面的官方网站下载 Oracle VirtualBox 安装程序。

下载 VirtualBox

VirtualBox for Windows 的下载位置

如何安装和配置 VirtualBox

Windows 中的 VirtualBox 需要 “Microsoft Visual C++ 2019 Redistrobutiable package”。你必须先安装它。从以下链接下载软件包(X64 架构):

下载 MSVC

下载 VirtualBox 的依赖项

安装 VirtualBox 的依赖项

完成以上安装后,从以下链接下载最新的 Python 包。Python 绑定也是 Windows 端 VirtualBox 安装所需的依赖项。

下载 Python for Windows

然后,启动 VirtualBox 安装程序并按照屏幕上的说明进行安装。

安装后,重新启动 Windows 系统。

为 Ubuntu 设置虚拟机

从开始菜单启动 VirtualBox。

从开始菜单中选择 VirtualBox

在 VirtualBox 窗口工具栏上,单击 “ 新建 New ”。

单击新建

  • 在创建虚拟机窗口中,输入虚拟机的名称。它可以是标识此版本 Ubuntu 的任何名称。
  • 保持 “ 文件夹 Folder ” 不变。这是创建虚拟机文件的路径。
  • 在 “ ISO 镜像文件 ISO Image ” 一栏,浏览你下载的 Ubuntu ISO 文件。
  • 然后选择 “ 跳过无人值守安装 Skip Unattended installation ”。如果不选择此选项,将在虚拟机中创建一个 默认用户 id(vboxuser)和密码。让我们暂时不要管它。

选择 ISO 文件

  • 单击 “ 硬件 Hardware ” 部分,并调整虚拟机所需的内存。一般的经验是,虚拟机的内存大小应该小于主机系统中的物理内存。我建议对于 8 GB 内存系统的虚拟机使用 2 GB 到 4 GB。要选择 4 GB 内存,拖动滑块(或键入)使其为 4096 MB(即 4×1024)。
  • 选择 2 或 4 核处理器。

选择硬件

  • 单击 “ 硬盘 Hard Disk ” 部分,并保持文件位置不变。
  • 为 Ubuntu 安装提供至少 20 GB 到 25 GB 的容量。
  • 硬盘文件类型值保持为 VDI(VirtualBox 磁盘镜像)
  • 不要选择 “ 预分配完整大小 Pre-allocate Full Size ”。
  • 最后,单击 “ 完成 Finish ”。

选择硬盘

你应该在 VirtualBox 的左侧面板上看到一个新条目,其中包含一个 Ubuntu 22.04 条目(你之前设置的名称)。

选择条目并单击 “ 开始 Start ” 以引导到虚拟机:

在 VirtualBox 中启动 Ubuntu

使用 VirtualBox 安装 Ubuntu

成功引导后,你应该看到以下屏幕,其中显示了安装 Ubuntu 的各种选项。选择 “ 尝试 Ubuntu Try Ubuntu ” 或 “ 安装 Ubuntu Install Ubuntu ”。

在欢迎屏幕中,单击 “ 尝试 Ubuntu Try Ubuntu ”。过了一会儿,你会看到下面的 Ubuntu 临场 Live 桌面。如果要更改分辨率,请右键单击桌面并选择显示设置。并将分辨率更改为 1400×900。

选择尝试 Ubuntu

在桌面上,双击 “ 安装 Ubuntu Install Ubuntu ”。

Ubuntu LIVE 桌面

在下一组屏幕中,根据需要选择 “ 语言 Language ” 和 “ 键盘布局 Keyboard Layout ”。

选择语言

选择键盘布局

安装屏幕为你提供所需的安装类型。选择 “ 正常安装 Normal Installation ”,然后在 “ 其他选项 Other options ” 下选择两个选项。

选择安装选项

由于你是在虚拟磁盘空间中安装的,即它只是一个文件,因此你可以安全地选择 “ 擦除磁盘并安装 Ubuntu Erase disk and install Ubuntu ” 选项。

安装类型

点击 “ 立即安装 Install Now ” 并 “ 继续 Continue ”。

将更改写入磁盘

然后选择 “ 地区 region ”,添加“ 你的名字 Your name ”、“ 计算机名称 Your computer's name ”、“ 用户名 Username ” 和 “ 密码 Password ”。这将是安装后登录 Ubuntu 的用户 id 和密码。

单击 “ 继续 Continue ” 开始安装。等到它完成。

创建用户帐户

安装完成后,单击 “ 立即重新启动 Restart Now ”。等待几秒钟,你将看到一个登录屏幕。使用用户 id 和密码登录。你应该看到 Ubuntu 桌面在 Windows 端 VirtualBox 中作为 VM 运行。

Ubuntu 安装完成

登录 Ubuntu

使用 Virtualbox 在 Windows 中运行的 Ubuntu

安装后配置和提示(可选)

安装客体机增强项

成功安装后,应为 Windows 宿主机和 Ubuntu 客体机安装 “ VirtualBox 客体机增强项 VirtualBox guest additions ”。客体机增强项是一组需要安装在客体虚拟机(即 Ubuntu)内的软件包,以启用 共享文件夹、双向复制 / 粘贴、自动更改分辨率 和许多类似功能。

要安装它,请引导到 Ubuntu。从 VirtualBox 菜单中,选择“ 设备 Devices > 插入客体机增强 CD 镜像 Insert Guest Additions CD Image ”。必要的软件包将安装在 Ubuntu 中。

从菜单中选择客体机增强

打开文件管理器并打开装入的文件夹,如下所示。然后右键单击 > 选择 “ 在终端中打开 open in terminal ”。

打开已挂载的光盘并选择带有终端的选项

然后运行以下命令:

sudo ./VBoxLinuxAdditions.run

VirtualBox 为 Windows 主机添加客体机增强项

完成上述命令后,重新启动 Ubuntu VM。

启用 Windows 和 Ubuntu 之间的复制和粘贴

要在 Windows 和 Ubuntu 系统之间启用复制和粘贴,请从菜单中选择 “ 设备 Devices > 共享剪贴板 Shared Clipboard > 双向 Bi-directional ”。

启用共享剪贴板

关闭 Ubuntu VM

理想情况下,你应该从自己的关机菜单中关闭 VM。但是,你也可以从 VirtualBox 主窗口关闭。右键单击虚拟机名称并选择 “ 关闭 Close > 关机 Poweroff ”。

关闭虚拟机

如何删除 Ubuntu 并删除所有数据

如果要完全删除虚拟机(例如 Ubuntu)及其数据,请选择 “ 删除 Remove ” 和 “ 删除所有文件 Delete All Files ”。

选择删除以移除虚拟机

选择删除选项

结语

在本教程中,你学习了使用 VirtualBox 在 Windows(10 或 11)上安装 Ubuntu 的最简单方法。此外,你还学习了几步安装后配置 Ubuntu VM 的基本步骤。你可以对 VirtualBox 中的其他任何 Linux 发行版使用上述步骤。

如果你有任何疑问,欢迎在下面发表评论。


via: https://www.debugpoint.com/install-ubuntu-windows-virtualbox/

作者:Arindam 选题:lkxed 译者:ZhangZhanhaoxiang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本指南中,你将学习如何在 virt-manager 的 KVM、QEMU 和 libvirt 的主机和客户机之间共享文件夹。

virt-manager 应用或软件包使用 libvirt 库来提供虚拟机管理服务。它有一个桌面界面,有助于创建、删除和管理多个虚拟机。

virt-manager 桌面界面及其组件为各种个人和商业场景提供了灵活的虚拟机管理服务。它是一个自由开源的应用,主要用于 KVM 虚拟机。然而,它也可以支持其他管理程序,如 Xen 和 LXC。

在之前的文章中,我解释了 如何使用 virt-manager 创建虚拟机。这篇文章介绍了如何在客户机和主机之间无缝访问文件和文件夹。

关于 virtiofs 的说明

共享文件和文件夹是由名为 virtiofs 的 libvirt 共享文件系统提供的。它提供了访问主机上的目录树的所有功能和参数。由于大多数 virt-manager 虚拟机的配置都被翻译成 XML,所以共享文件/文件夹也可以通过 XML 文件来指定。

在 virt-manager中共享文件夹

首先,确保你的客户机关闭了电源。在 virt-manager GUI 中,选择虚拟机,点击“ 打开 Open ”,弹出控制台设置。

打开设置

点击工具条上显示虚拟硬件细节的图标。然后点击左边面板上的“ 内存 Memory ”。

选择选项 “ 启用共享内存 Enable shared memory ”。点击应用。

启用共享内存选项

然后点击底部的 “ 添加硬件 Add hardware ”。

点击添加硬件

在添加新硬件的窗口中,从左边的面板上选择 “ 文件系统 File system ”。

然后在 “ 细节 Details ” 标签中选择 “ 驱动程序 Driver ” 为 “virtiofs”。点击 “ 浏览 Browse > 浏览本地 browse local ”,选择你想在客户机内访问的主机路径

在目标路径中,输入你想要的任何名字。这只是一个文件标签,将在挂载时使用。

所以,如果我想访问 Pictures/Screenshots 文件夹(/home/debugpoint/Pictures/Screenshots),示例设置可以是这样:

添加一个新的文件系统硬件

下面是上述配置的 XML 设置。你可以在 XML 标签中找到它。

<filesystem type="mount" accessmode="passthrough">
  <driver type="virtiofs"/>
  <binary path="/usr/libexec/virtiofsd"/>
  <source dir="/home/debugpoint/Pictures/Screenshots"/>
  <target dir="mount_tag_pictures"/>
  <alias name="fs1"/>
  <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
</filesystem>

点击 “ 完成 Finish ”。在 virt-manager 主窗口中,右键点击虚拟机,点击运行,启动虚拟机。确保点击“ 显示图形控制台 show the graphical console ”(如果虚拟机没有显示,点击工具条上的监视器图标)。

在客户机中,创建一个你想挂载主机文件夹的文件夹。在这个例子中,我使用了 /mnt/pictures

sudo mkdir /mnt/pictures

最后,使用你在上述步骤中创建的标签将主机文件夹挂载到这个新文件夹。使用下面的命令在终端做这件事。确保根据你的系统改变下面命令中的标签和文件夹名称。

sudo mount -t virtiofs mount_tag_pictures /mnt/pictures

现在你可以在 virt-manager 中的主机和客户机之间的无缝地浏览文件夹和添加/删除项目。

从 virt-manager 客户机访问主机文件

总结

我希望这个方案能帮助你从客户机上访问主机文件和文件夹。记住,你的用户 ID,也就是用来启动 virt-manager 应用的用户,应该有同样的权限来访问主机文件夹。

如果你遇到任何错误,上述指南帮助了你,请在下面留言。


via: https://www.debugpoint.com/share-folder-virt-manager/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我请社区的开源从业者分享了他们关于编写有用的 Git 提交信息的建议。

最近,当需要更新时,我一直在密切关注从产品和服务获得的变更日志。以下是一些示例:

  • 修复了一些错误。
  • 进行了一些可访问性改进。
  • 我们已经进行了改进,并修复了错误,以实现更顺畅地运行。

当我想到我还是一名初级开发人员写的一些首次提交信息时,我不得不沮丧地垂下头:

  • 用鼠标点了一下,现在一切似乎都正常了。
  • 执行了程序员 X 告诉我的操作,现在横幅是蓝色的。

这可真令人沮丧!我向我们的贡献者们提出了以下问题:

  • 什么是好的 Git 提交信息?
  • 什么是坏的 Git 提交信息?
  • 你认为一个项目应该有哪些关于提交信息所写内容的规则?

以下是他们的答案:

易阅读的文笔是关键

与你写任何东西一样,你应该考虑谁会阅读它。然后相应地调整信息的数量和深度。

提高你的自然语言和写作技能对于软件开发的职业生涯顺利发展至关重要。重要的不仅仅是代码。

—— Camilla Conte

具有描述性,不要假设

我在 OpenStack 社区中花了很多时间合作,与我在像“野外”的其他随意的项目中看到的相比,它的代码审查者有一些相当严格的标准。

我花在撰写一条可靠的提交信息的时间,往往要比编写实际的代码实现或修复程序的时间长得多。有时,提交信息可能会比它们解释的代码变化长很多倍。

总结一些贡献者指导:

  • 描述为什么要做出改变,而不仅仅是改变了什么
  • 第一个提交行是最重要的(就像电子邮件的主题行)
  • 不要假设审查者了解你正在修复的原始问题
  • 不要假设审查者可以访问外部 Web 服务或网站(总结缺陷报告和其他相关讨论)
  • 不要假设代码是不言自明的和自我说明的(尽管没有必要重复你在代码注释中也提出的观点)
  • 不要只包含与更改的早期修订相关的信息(我们希望贡献者将修订压扁在一起,并相应地编辑其提交信息)。

《OpenStack 贡献者指南》中有一个关于该主题的 简短章节

—— Jeremy Stanley

未来的你会感谢自己

我非常同意 Jeremy 的观点。+1000。

Jeremy 说:“描述为什么要做出改变,而不仅仅是改变了什么。”

想象一下,你是旁观者,在遥远的未来试图理解这个提交。

正如老话所说,设身处地为他人着想。

—— Leigh Morresi

使用 bug ID

我建议在提交信息的开头添加 bug ID,这样在以后使用 grep 命令 跟踪提交信息时就会更方便。

例如:

$ git commit -m "BZ#19xxxxx

要写出深思熟虑的提交,请考虑以下事项:

  • 我为什么要做这些更改?
  • 我的更改产生了什么影响?
  • 为什么有更改的必要?
  • 更改的依据是什么?

—— Agil Antony

讲述整个故事

我喜欢想象每个提交信息都有一个隐藏的前缀,上面写着 “By applying this(通过应用这个)”。

一个好的提交信息包括将要发生的事情以及原因。仅仅有工单作参考是不够的,因为这分散了信息;Git 是去中心化的。作为一名软件开发人员,我想知道为什么当前要考虑做出更改。正在解决的具体问题是什么?考虑(并放弃)了哪些替代解决方案?在创建变更集的过程中发现了哪些影响当前内容的意外情况?

缩短提交信息没有什么好处。你未来的自己和未来的同事会感激你深入地解释了问题,以及为什么这个变更集是解决方案。认真学习和利用那些内容丰富的“烹饪”博客。然而,在此,仅仅是把生活经验替换成了项目的问题罢了(LCTT 译注:意思是要认真学习和模仿优秀、详细的提交信息)。

—— Lisa Seelye

但不要过于冗长

一个好的 Git 提交信息包含有关所做操作的信息,而不要包含其他信息。例如,如果你需要更新 .gitignore,只需写 “更新了 .gitignore” 即可。人们可以自行深入到提交本身中了解更多细节。它不需要冗长。

糟糕的提交信息类似于“哦,糟糕”或“试试这个”。当然,我也曾经犯过这样的错误,但这对于任何需要一目了然地查看提交信息的人来说都没有任何帮助。

提交信息的规则非常主观。他们可能因领导和团队而异。但至少要提供一些有关提交的上下文信息。特别是如果它是一个大的更改。没有人有时间浏览 1000 多个具有大量更改历史的文件。

—— Miriam Goldman

使用现在时

我喜欢项目经理风格的提交信息,用现在时而不是将来时的术语编写(例如,“添加” 而不是“已添加”)。然而,这通常只有在频繁提交时才有可能。当你面临最后期限时,你能记住的只有“我是如何做的”而已。然而,写得好的提交不仅有助于合作者,而且有助于提交者回忆历史。

—— Chris Okpada

不要依赖链接

我想提醒同事们的一件事是,你不仅仅是向给你的提交作批准的人解释。你还要向未来的开发人员和用户解释,他们在使用 bisect 或 blame 定位问题时发现了这个提交,并试图了解其相关性。

如果提供的唯一的上下文是指向某个外部系统的链接,并且在未来很长一段时间内,它所链接的系统不再使用,或者该用户无法访问,那么你的提交信息将变得无用,可能还不如空白。

我经常去挖掘一些开源项目的 Git 历史,发现有些提交信息无非就是一个 Bug ID,或者是某个公司内部的和专用的缺陷跟踪器的链接。

不要依赖链接!

—— Jeremy Stanley

清晰简洁的变更日志

作为一名发布沟通经理,我会经常阅读整个发布版块。我还会与开发人员会面,讨论任何尚未明确的领域。然后我提前测试了版本。之后,我将通过寻找变更日志和相应的修订或新内容来撰写发布文章。

变更日志是开发人员的个人提醒,但也有相应的提议和工单。你应该适当地将产品名称大写,使用拼写检查器,与标点符号和句子结构保持一致。首席开发人员也应该校对这些。你的客户,即开发人员,正在阅读这些内容。在运行更新之前,他们应该了解哪些信息能更好地为客户服务?

—— Courtney Robertson

具体一点

作为一个经常性的发布经理,我喜欢带有组件名称的提交的信息,以及对更改内容的简要描述。在我们忘记了你聪明的分支名称之后,还可以参考一下这项工作的请求来自何处,这有助于将修复程序联系在一起。

  • “修复致命错误”并不是理想的提交。
  • “ISS-304: 修复具有合作伙伴角色的用户在登录访问控制功能中的致命错误”更好。
  • “ISS-304: 登录访问控制:修复 getPartnerId() 的致命错误”也更好。

我可以查看 Git 提交、分支、合并提交之间的整个关系,并检查更改的各个行和文件。但我在发布过程中没有这样的时间。我希望能够在项目管理工具回溯这项工作的源头,了解哪些组件正在被更改,以及以何种方式进行更改。

—— Ryan Price

让它成为一种习惯

我最喜欢犯的错误是“在我切换分支之前提交”,因为我必须处理其他更紧急的事情。有时候,我需要把我目前的工作提交给一个完全不同的项目。我的经理的策略是让我们像平时一样工作。但当我们变基时,他希望我们在有意义的地方压扁提交,并编写更好的信息。我不能说我们总是这样做,但他的方法确实有道理。

我也有很多“这个坏了,不知道为什么”类型的信息(哈哈),我尝试了一些东西,但想在尝试其他东西之前提交该尝试,以防方法 A 比方法 B 更接近解决问题。我已经写了 10 多年了。

—— RachieVee

你的提交信息建议或提示是什么?让我们在评论中知道。


via: https://opensource.com/article/22/12/git-commit-message

作者:AmyJune Hineline 选题:lkxed 译者:ZhangZhanhaoxiang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我写了一个名为 “Toy CPU” 的教育性复古计算机程序,以便我的学生能够学习机器语言。

我兼职教授大学课程,包括一个对所有专业开放的一般计算机主题的课程。这是一门入门课程,向学生讲授技术是如何运作的,以消除围绕计算的神秘感。

虽然不是计算机科学课程,但这门课的一个部分涉及计算机编程。我通常用非常抽象的术语谈论编程,所以不会让听众听不懂。但是今年,我想让我的学生以 “老派” 的方式做一些需要 “动手” 的编程。同时,我又想保持简单,以便让每个人都能跟上。

我喜欢将我的课程结构化,以显示你是如何从 “那里” 到 “这里” 的。理想情况下,我会让我的学生学习如何编写一个简单的程序。然后,我将从这里开始,展示现代编程是如何让开发人员创建更复杂的程序的。我决定尝试一种非常规的方法 —— 教学生学习终极的低级别编程语言:机器语言。

机器语言编程

早期的个人电脑如 Apple II(1977 年)、TRS-80(1977 年)和 IBM PC(1981 年)让用户用键盘输入程序,并在屏幕上显示结果。但计算机并不总是带有屏幕和键盘。

Altair 8800 和 IMSAI 8080(均为 1975 年制造)要求用户使用面板上的 “开关和灯” 输入程序。你可以用机器语言输入指令,使用一组开关,机器会点亮 LED 灯以代表每个二进制指令的 1 和 0。

Altair 8800 计算机的图片

对这些早期机器进行编程,需要了解被称为 “ 操作码 opcode ” (操作代码的简称)的机器语言指令,以执行基本操作,如将两个数字相加或将一个值存储到计算机的存储器中。我想向我的学生展示程序员是如何通过开关和灯,手工输入一系列指令和内存地址的。

然而,在这门课上,使用实际的 Altair 8800 就有点太复杂了。我需要一些简单的、任何初级水平的学生都能掌握的东西。理想情况下,我希望能找到一个简单的 “业余” 复古计算机,其工作原理与 Altair 8800 相似,但我无法找到一个价格低于 100 美元的合适的 “类似 Altair” 的设备。我找到了几个 “Altair” 软件模拟器,但它们忠实地再现了 Altair 8800 的操作码,这对我的需求来说太过沉重。

我决定编写我自己的 “教育” 复古计算机。我称它为 “Toy CPU”。你可以在我的 GitHub 代码库 上找到它,包括几个可以运行的版本。第一版是一个实验性的原型,运行在 FreeDOS 上。第二版是一个更新的原型,在 Linux 上用 ncurses 运行。版本 3 是一个 FreeDOS 程序,在图形模式下运行。

Toy CPU 的编程

Toy CPU 是一个非常简单的复古计算机。它只有 256 字节的内存和一个最小化的指令集,其目的是在复制 “开关和灯” 编程模式的同时保持简单化。它的界面模仿 Altair 8800,有一系列 8 个 LED 灯,分别代表计数器(程序的 “行号”)、指令、累积器(用于临时数据的内部存储器)和状态。

当你启动 Toy CPU 时,它通过清除内存来模拟 “启动”。当它启动时,它也会在屏幕右下方的状态灯中显示 “INI”(初始化)。“PWR”(电源)灯亮表示 Toy CPU 已被打开。

Toy CPU 的启动屏幕

当 Toy CPU 准备好让你进入一个程序时,它通过状态灯指示 “INP”(“输入”模式),并让你从程序的计数器 0 开始。Toy CPU 的程序总是从计数器 0 开始。

在 “输入” 模式下,用上下方向键显示不同的程序计数器,按回车键编辑当前计数器上的指令。当你进入 “编辑” 模式时,Toy CPU 的状态灯上会显示 “EDT”(“编辑” 模式)。

Toy CPU 编辑屏幕

Toy CPU 有一张速查表,被 “贴” 在显示屏的前面。它列出了 Toy CPU 可以处理的不同操作码。

  • 00000000STOP):停止程序执行。
  • 00000001RIGHT):将累加器中的位向右移动一个位置。值 00000010 变成 0000000100000001 变成 00000000
  • 00000010LEFT):将累加器中的位向左移动一个位置。值 01000000 变成 1000000010000000 变成 00000000
  • 00001111NOT):对累加器进行二进制非操作。例如,值 10001000 变成 01110111
  • 00010001AND):对累加器用存储在某一地址的值进行二进制与操作。该地址被存储在下一个计数器中。
  • 00010010OR):对累积器用存储在某一地址的值进行二进制或运算。
  • 00010011XOR):对累加器用存储在某一地址的值进行二进制异或运算。
  • 00010100LOAD):将一个地址的值加载(复制)到累加器中。
  • 00010101STORE): 存储(复制)累加器中的值到一个地址。
  • 00010110ADD):将存储在某一地址的数值加入到累加器中。
  • 00010111SUB):从累积器中减去储存在某一地址的数值。
  • 00011000GOTO):转到(跳到)一个计数器地址。
  • 00011001IFZERO):如果累加器为零,转到(跳到)一个计数器地址。
  • 10000000NOP):空操作,可以安全地忽略。

当处于 “编辑” 模式时,使用左右方向键选择操作码中的一个位,然后按空格键在关闭(0)和开启(1)之间翻转数值。当你完成编辑后,按回车键回到 “输入” 模式。

Toy CPU 输入模式屏幕

一个示例程序

我想通过输入一个简短的程序来探索 Toy CPU,将两个数值相加,并将结果存储在 Toy CPU 的内存中。实际上,这执行的是算术运算 A+B=C。要创建这个程序,你只需要几个操作码:

  • 00010100LOAD
  • 00010110ADD
  • 00010101STORE
  • 00000000STOP

LOADADDSTORE 指令需要一个内存地址,这个地址总是在下一个计数器的位置。例如,程序的前两条指令是:

计数器 0:00010100
计数器 1:某个内存地址,第一个值 A 存放在那里

计数器 0 中的指令是 LOAD 操作,计数器 1 中的值是你存储某个值的内存地址。这两条指令一起将内存中的数值复制到 Toy CPU 的累加器中,在那里你可以对该数值进行操作。

将一个数字 A 装入累加器后,你需要将数值 B 加到它上面。你可以用这两条指令来做:

计数器 2:00010110
计数器 3:存储第二个值 B 的内存地址

假设你把值 1A)装入累加器,然后把值 3B)加到它上面。现在累加器的值是 4。现在你需要用这两条指令把数值 4 复制到另一个内存地址(C):

计数器 4:00010101
计数器 5:一个内存地址(C),我们可以在那里保存新的值

把这两个值加在一起后,现在可以用这条指令结束程序:

计数器 6: 00000000

计数器 6 之后的任何指令都可以供程序作为存储内存使用。这意味着你可以用计数器 7 的内存来储存值 A,计数器 8 的内存来储存值 B ,计数器 9 的内存来储存值 C。你需要将这些分别输入到 Toy CPU 中:

计数器 7:00000001(1)
计数器 8:00000011(3)
计数器 9:00000000(0,以后会被覆盖)

在弄清了所有指令和 ABC 的内存位置后,现在可以将完整的程序输入到 Toy CPU 中。这个程序将数值 1 和 3 相加,得到 4:

计数器 0:00010100
计数器 1:00000111(7)
计数器 2:00010110
计数器 3:00001000(8)
计数器 4:00010101
计数器 5:00001001(9)
计数器 6:00000000
计数器 7:00000001(1)
计数器 8:00000011(3)
计数器 9:00000000(0,以后会被覆盖)

要运行程序,在 “输入” 模式下按下 R 键。Toy CPU 将在状态灯中显示 “RUN”(“运行” 模式),并从计数器 0 开始执行你的程序。

Toy CPU 有一个明显的延迟,所以你可以看到它执行程序中的每一步。随着程序的进行,你应该看到计数器从 00000000(0)移动到 00000110(6)。在计数器 1 之后,程序从内存位置 7 加载数值 1,累积器更新为 00000001(1)。在计数器 3 之后,程序将加数值 3,并更新累加器显示 00000100(4)。累加器将保持这种状态,直到程序在计数器 5 之后将数值存入内存位置 9,然后在计数器 6 结束。

在运行模式下的 Toy CPU

探索机器语言编程

你可以使用 Toy CPU 来创建其他程序,并进一步探索机器语言编程。通过用机器语言编写这些程序来测试你的创造力。

一个在累积器上闪灯的程序

你能点亮累加器上的右四位,然后是左四位,然后是所有的位吗?你可以用两种方法之一来写这个程序。

一种直接的方法是,从不同的内存地址加载三个数值,像这样:

计数器 0:LOAD
计数器 1:“右边”
计数器 2:LOAD
计数器 3:“左边”
计数器 4:LOAD
计数器 5:“所有”
计数器 6:STOP
计数器 7:00001111(“右边”)
计数器 8:11110000(“左边”)
计数器 9:11111111(“全部”)

写这个程序的另一种方法是尝试使用 NOTOR 二进制操作。这样可以得到一个更小的程序:

计数器 0:LOAD
计数器 1:“右边”
计数器 2:NOT
计数器 3:OR
计数器 4:“右边”
计数器 5:STOP
计数器 6:00001111(“右边”)

从一个数字开始倒数

你可以把 Toy CPU 作为一个倒数计时器。这个程序行使 IFZERO 测试,只有当累加器为零时,程序才会跳转到一个新的计数器:

计数器 0:LOAD
计数器 1:“初始值”
计数器 2:IFZERO(这也是倒计时的“开始”)
计数器 3:“结束”
计数器 4:SUB
计数器 5:“1”
计数器 6:GOTO
计数器 7:“开始”
计数器 8:STOP
计数器 9:00000111(“初始值”)
计数器 10:00000001(“1”)

Toy CPU 是学习机器语言的一个好方法。我在入门课程中使用了 Toy CPU,学生们说他们发现写第一个程序很困难,但写下一个程序就容易多了。学生们还表示,用这种方式编写程序其实很有趣,他们学到了很多关于计算机实际工作的知识。Toy CPU 既具有教育性,也很有趣味性!


via: https://opensource.com/article/23/1/learn-machine-language-retro-computer

作者:Jim Hall 选题:lkxed 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你想 在 Ubuntu 上使用终端卸载软件,可以使用:

sudo apt remove package_name

但是在很多论坛,你可能会看到别人说,如果你想彻底删除软件就用 apt purge

你可能会觉得很困惑,因为 apt purgeapt remove 看起来是一样的。

sudo apt purge package_name

为什么会有两个如此像的命令来删除软件包呢?两者之间有什么不同呢?下面将为你揭晓。

apt-remove 和 apt-purge 有什么不同?

apt-removeapt-purge 的相同之处就是都可以卸载软件包,但是运行 apt-purge 除了可以删除安装包之外,还可以清除相关的配置文件。这是两者之间唯一的不同点。要注意的是这两条命令都不能删除用户主目录中相关的应用程序文件。

你是否遇到过这样的情况,卸载一个软件然后重新安装,却发现之前的设置都还在。这是因为用 apt remove 不能删除该软件的相关配置文件。

哪些东西被删除了?哪些还在?

我分享一个使用 apt removeapt purge 两个命令分别卸载 mplayer 这个软件的实际例子。重点是看每次操作后还残余哪些文件。

这是删除前的文件:

mplayer before removal

现在运行 apt remove 这个命令:

apt uninstall package ubuntu

下面的是还残留在系统中的文件:

files after mplayer removal

我们可以看到,有两个地方残留着 mplayer 的文件: /etc/home/abhishek

这次我们重新安装 mplayer,然后用 apt purge 来卸载软件。

apt purge command

现在让我们看看与 mplayer 相关的文件:

files after mplayer removal

我们可以看到 /etc 目录下的文件已经没有了。

但是在主目录中的文件呢?apt purge 会删除它们吗?

答案是否定的。apt 命令不会删除主目录中的配置文件。所以它们仍然在系统中,除非你手动删除。但是这些文件所占的空间真的很小,几乎不占磁盘空间。

值得注意的是,不是所有的软件在主目录或者 /etc 目录下都有配置文件。

使用 apt remove 或者 apt purge 的效果

我能想到的一个实际例子就是 Discord,你用 deb 文件 在 Ubuntu 上安装了 Discord。然后登录自己的账号,之后又卸载并重新用 deb 文件安装。

现在如果你打开 Discord,你会发现你的账号自动登录了。是不是觉得很奇怪?

这是个功能,像一些软件,比如 Discord、VirtualBox,它们会提供更新,就是卸载现在的版本然后下载新的(尽管你不知道它内部怎么进行的),但是它在卸载的时候,这些软件的配置文件没有被删除,所以等你打开这些软件的时候就会自动登录。

当你想卸载一个软件,但是想保留你过去使用该软件留下的配置文件的时候,你就可以用 apt remove

但是,有时候用它不能满足你的需求,比如当你没有配置好一个软件的时候,你想要重新开始,这个时候用 apt purge 就比较合适。

运行 apt purge 是否可以用通配符删除?

当你删除一个包的时候,它会提示 removing package-name*。这意味着它会删除以这个包名开头的所有文件。

apt purge wild card

我在手册页之类的文档中没有找到关于这个问题的答案。所以我自己做了一个小测试,我安装了 espeak 和 espeak-ng 这两个软件,espeak* 应该可以通配扩展到 espeak-ng。

但是当我用 apt purge 删除 espeak 包时,espeak-ng 包还在,没有被一并删除。因此,这似乎是有一种防止通配符的扩展的机制。

那么,你应该使用 apt remove 还是 apt purge 呢?

很少有人会一直使用 apt purge

在我看来,一般清况下,用 apt remove 就可以了,但是当你想删除那些自定义配置文件时,你就得用 apt purge

不管是用 apt remove 还是 apt purge,你都需要从用户的主目录中删除残余的配置文件,并运行 apt autoremove 来清除任何依赖的包。

现在到你啦。你现在对 apt removeapt purge 的区别更加了解吗?你更喜欢使用哪一个呢?


via: https://itsfoss.com/apt-remove/

作者:Abhishek Prakash 选题:lkxed 译者:Tingze-G 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出