2021年10月

Mark Text 拥有的工具使得撰写 Markdown 变得容易,同时又提供了一个不会打扰我的简单的界面。

 title=

几年前,当我开始使用 Jupyter 笔记本时,我接触到了 Markdown 格式。许多作者都知道 Markdown,但这是我不熟悉的一种技能。

Markdown 是一种标准的文本写作方式,在这种方式中,你可以用精简的符号来标记你想要的文本样式。例如,你不用点击一个按钮来使一个词变粗体,而是用两个星号(**word**)包围这个词。这有两种效果:

  • 当作为纯文本查看时,视觉上显示出强调的文本
  • 如果有一个好的文本转换器或渲染器(如 Pandoc 或一个好的 Markdown 文本编辑器),就会显示为加粗。

Markdown 最大的优点之一是它的大部分符号都是直观的,并且来自我们大多数人已有的习惯。它使得用星号强调单词,用字符标记标题以区分它们等等变得很自然。

每个人都对它评价很高,但我不确定为什么我需要学习和使用 Markdown。然而,我是一个好奇的人,我开始探索 Markdown,以及它如何在我的写作中发挥作用。

学习 Markdown

我很喜欢在学习时使用 Markdown 速查表。我发现 Markdown 是一个很好的工具,可以写任何内容,而且我很喜欢甚至不需要一个专门的 Markdown 编辑器这一点。任何文本编辑器都可以写 Markdown,因为 Markdown 使用标准文本来表示样式。我开始使用简单的编辑器,如 Vim 或 gedit(或任何其他编辑器),并查阅这个速查表以记住简单的格式化规则。

今年我一直在写日记,作为组织我的想法和学习更多关于 Markdown 的方法。我最近尝试了 Ghostwriter 文本编辑器,这是一个优秀的编辑器,有一些额外的 Markdown 特定功能。Markdown 现在已经变得非常流行了,许多编辑器都加入了语法高亮、提示和其他使 Markdown 编写变得容易的功能,或者将其作为重点。它们不是必须的功能,但当你拥有它们时,还是很好的。

尝试 Mark Text

在阅读一个博客时,我发现了 Mark Text。Mark Text 使写 Markdown 变得很容易,同时提供了一个简单的界面,而且又不影响我。Mark Text 有六个主题,三个浅色和三个深色主题。深色主题对我来说更容易使用。它的 用户文档 非常好,而且也提供了 Markdown 的 语法帮助

Markdown 的实时预览

Mark Text 以简洁的界面提供了实时预览功能。它支持 Commonmark 规范、Github 风格的 Markdown 规范,以及 Pandoc Markdown。据其网站说,Mark Text 还支持 KaTex、front matter 和 emoji 等 Markdown 扩展。它还可以输出 HTML 和 PDF 文件。

Mark Text 有各种编辑模式,如打字模式、源代码模式和专注模式。添加图片是一件很容易的事,因为你可以简单地从剪贴板上复制和粘贴它们。

在 Mark Text 窗口的左上方有一个弹出窗口,显示迄今为止输入的字符和段落数量。作为一个作家,这真的很有帮助。

从 Mark Text 窗口左上方的菜单或使用 Ctrl+S 保存文件很容易。事实上,Mark Text 的菜单对任何习惯于基本文本编辑器或文字处理器的人来说都是友好和熟悉的。

 title=

我喜欢 Mark Text 用简单的快捷键支持各种格式,包括表格块、图表、行内格式、数学公式块和其他代码块。

你可以从以下链接中为你的操作系统下载 Mark Text:

Mark Text 以 MIT 许可证开源。你可以随时 下载 最新的版本。

另外,你可以用 brew install --cask mark-text 在 macOS 上安装 Mark Text,在 Windows 上用 Chocolatey 输入 choco install marktext 来安装它。

Mark Text 一直在寻找赞助商和开发者。该项目有一个给贡献者的 指南。此外,你可以在 Patreon 和 Open Collective 上支持该项目。


via: https://opensource.com/article/21/10/mark-text-markdown-editor

作者:Don Watkins 选题:lujun9972 译者:wxy 校对:wxy

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

想玩实体模型火车,却没有足够大的空间?试试 OpenTTD 中的虚拟火车吧。

 title=

我父亲一直很喜欢火车模型,我记得我小时候,曾看着他在圣诞树周围建了一整条轨道。当 乐高 火车套装发布时,因其便利性和固有可扩展性,我们转而投向了乐高火车的怀抱。多年来,我们热衷于建造和改装乐高火车及单轨轨道。我经常想象,未来我会有一个车库或地下室,专门用于微型景观和电动汽笛火车。强调一下,我沉迷于另一个爱好的可能性非常低,所以当发现 虚拟 模型铁路可以为我提供相同的满足感时,我很开心。我的虚拟爱好引擎是 OpenTTD,这是一款基于名为 Transport Tycoon Deluxe 的 90 年代老游戏的开源模拟游戏。

安装 OpenTTD

你可以在 openttd.org/downloads 下载适用于 Linux、macOS 和 Windows 的 OpenTTD。

如果你正使用 Debian Linux 或其衍生产品,甚至是在使用 Chromebook,你可以下载 .deb 包。使用 apt 命令安装它:

$ sudo apt install ./openttd*deb

如果你在使用其他 Linux 发行版,请下载通用安装程序,并使用 tar 命令解压缩包:

$ tar xvf openttd-x.yy.z-linux*.tar.xz

OpenTTD 已经在 Linux、macOS 和 Windows 的 Steam 中上架(Steam 是一个非开源的,但是很常见的跨平台游戏客户端)。

启动 OpenTTD

如果你安装了 OpenTTD,可以从应用程序菜单启动它。

如果你是下载了通用包,可以切换到游戏目录,使用本地的 openttd 命令启动游戏:

$ cd openttd*
$ ./openttd &

首次启动 OpenTTD 时,游戏会提示必须下载图像集,在 Steam 版中会自动安装,但在独立应用程序中需要单击一下鼠标。无论如何,因为 OpenTTD 是开源的,经过了很好的改进,所以在默认图像之外,你最终还会下载的还有很多其他图像。

下载图像集后,你会看到一个古色古香的小型界面。我觉得 640x480 的界面有点小,虽然旧图像界面确实更有年代感(那时计算能力还比较弱),但一些适配现代屏幕的轻度升级还是很好用的。因此,你的第一步操作就是点击“ 检查在线内容 Check online content ”按钮。

加载模组

内容下载 Content downloading ”界面是一个查看已通过审查的 OpenTTD 模组 mod 的窗口,可以提供个性化的改进图像界面、全新音乐、火车模型和地图名称。我使用了新西兰全套配置,所以对我来说,生成的所有城市都很熟悉,尽管 2020 年我转而开始使用“辐射 3”套装了。模组 非常多,可以使用右上角的搜索栏来缩小选择范围。

下面是一些个人认为必备的模组:

  • abase - 高分辨率图像。将近 300 MB,这可能是你玩此游戏需要的最大一次下载(游戏本身只有 50 MB)。
  • OpenSFX - 一个声音合集。让你能听到城市中的交通声、船运的喇叭声以及很棒的火车汽笛声。
  • Town names - 城镇名称。默认的城市名称很有趣,但我认为记一些本地化的名称更容易。
  • Trains - 火车模组。OpenTTD 有一组运行良好的默认火车模型,但如果你已经是一名火车观察员,那你可能会喜欢下载一些额外的火车模型。我使用的是 NZR 火车合集,但还有很多火车也是可用的,包括来自英国、美国、奥地利、比利时、捷克共和国的车,以及按字母表顺序排列的许多其他火车。
  • Beginner tutorial - 新手教程。是一个帮你学习游戏及界面的引导场景。

游戏引擎默认值

下载新素材后,你需要将它们设置为默认值。有两个设置的地方:游戏引擎默认值、游戏内脚本与素材。

 title=

OpenTTD 菜单(Seth Kenlon, CC BY-SA 4.0

单击“ 游戏选项 Game Options ”按钮。 在游戏选项屏幕中,调整以下设置:

  • 屏幕分辨率 screen resolution 设置为你喜欢的界面尺寸。
  • 基础图像集 base graphics set 设置为 abase
  • 基础声音设置 base sounds set 设置为 OpenSFX

关闭游戏选项屏幕。你的改动会自动保存。

游戏选项

在主菜单界面,单击“ NewGRF 设置 NewGRF Settings ”按钮。

 title=

NewGRF 设置菜单(Seth Kenlon, CC BY-SA 4.0

未活动的模组显示在 NewGRF 设置窗口的下半部分。要激活一个未活动的模组,请选择它并单击左下角的“ 添加 Add ”按钮。选择要激活的模组后,再单击“ 应用 Apply ”按钮。

教程

如果你下载了“ 初学者教程 Beginner tutorial ”场景,可以通过它来学习 OpenTTD。开始教程请单击主菜单屏幕顶部附近的“ 播放场景 Play scenario ” 按钮,然后选择该教程并开始。

初学者教程有着游戏界面的完整浏览流程,全部完成需要花费一些时间。

快速开始

现在我们快速介绍一下,此处你要了解以下内容:车辆出自仓库,一切活动都需要时间表。记住这两条规则,你可以立即开始建造火车(以及道路、海港和机场)。

建造车站

要在两个城市之间建立一条简单的铁路线,请单击顶部图标栏中的铁路轨道图标。

 title=

新建图标栏——铁路选项(Seth Kenlon, CC BY-SA 4.0

铁路以车站开始和结束,所以我通常在预定线路的两端各放置一个车站。单击火车站图标(将鼠标悬停在其上方可查看其标签)。一个火车站要服务于一个地区,其作用范围必须与该地区尽量多地重叠。要查看车站的覆盖范围,请通过单击车站对话框底部的“ 开启 On ”按钮以启用 覆盖区域高亮 Coverage area highlight 功能。

 title=

车站覆盖信息窗口(Seth Kenlon, CC BY-SA 4.0

黑色网格表示覆盖范围,而白色网格显示车站的物理占据范围。当你将鼠标悬停在一个区域上时,车站的覆盖范围所需耗材会在弹出窗口中列出。从简单的开始,创建一个单轨 4 辆车的站台。在地图上的两个城市之间重复执行此操作两次。

 title=

创建车站菜单(Seth Kenlon, CC BY-SA 4.0

铺设铁轨

接下来,用铁轨连接车站。 OpenTTD 的等距视图需要一些时间来适应,但是在单击铁路图标并在地图上单击拖动之后,你就开始大概有所了解了。X-rail 图标提供了“自动轨道”模式,该模式会根据用户单击的方块位置对齐轨道。

铺设导轨时要细心。OpenTTD 是不可撤回的,所以一旦点击一个正方形,轨道就会被构造出来。你必须使用炸药图标来移除导轨。和现实生活中一样,没有撤消按钮。

火车车库

火车来自 车库 depot 。因此,要在铁路上添加火车,必须在沿线的某处添加一个车库。单击车库图标并在现有铁路附近放置。将车库连接到现有轨道,以确保你的火车可以从车库到达适当线路的(在此简单示例中,线路是唯一的)。

 title=

建造车库菜单(Seth Kenlon, CC BY-SA 4.0

模型火车

终于,你可以将虚拟模型火车添加到虚拟铁路中了。要创建火车,请单击车库。

单击站点窗口底部的“ 新建车辆 New Vehicle ”按钮,会列出可用的火车引擎和汽车。列表会部分取决于你从可下载内容中添加的模型。一般来说,发动机分为三种:蒸汽发动机、柴油发动机和电动发动机。游戏内时间从 1950 年开始,所以早期你只有蒸汽可选。随着时间推进,你会获得可用于升级的创新型新模型。

 title=

创建火车菜单(Seth Kenlon, CC BY-SA 4.0

现在创建一个简单的火车,其中包括一节引擎、一节客车和一节邮车。如果想添加其他类型的车厢,请单击站点以确认它们的可提供车型(由其覆盖区域决定)

创建火车时刻表

现在有了铁路和火车,还需要创建一个火车时刻表。时间表与车辆关联,因此无论何时添加新车,都要记得添加时间表,以让新车投入使用。

要为火车添加时刻表,请单击其车库列表中列车左侧的编号。这样可以打开火车视口,窗口右侧会有按钮。单击箭头图标即可查看该列车的时刻表。

 title=

创建时刻表菜单(Seth Kenlon, CC BY-SA 4.0

要创建时间表,请单击时间表窗口底部的“ 前往 Go To ”按钮,然后单击要设置成第一个目的地的车站。然后点击下一站。你可以在时间表中选择一个停靠点,浏览“ 满载 Full load ”和“ 卸载 Unload ”下拉菜单中的选项,以此调整装卸要求,并且可以在“ 无停靠 Non-stop ”下拉菜单中调整路线(如果开发了新路线)。选项有很多,随着城市发展和地图完善,你可能需要随时调整策略。

但是现在,单击火车视口底部的红色“ 已停止 Stopped ”按钮,让火车投入使用吧!

 title=

在役中的火车(Seth Kenlon, CC BY-SA 4.0

试试 OpenTTD 吧

OpenTTD 是一个模拟器,同时也是一个游戏,所以确实会有一些限制,比如你可能想要优化的预算和参数。例如,你可以单击一个城市、农场或工厂,了解其可接受的进出口类型。你可以通过单击 OpenTTD 窗口右下角的预算按钮来借钱。它不仅仅是一个虚拟的火车集合游戏。你还可以建造道路、机场、海港等。记得所有车辆都需要车库和时间表,你就在实现虚拟企业的路上成功了一半。

OpenTTD 有着活跃而热情的社区,以及详细的维基,并且有大量的资源和教程在线可用。下载游戏并试试吧!


via: https://opensource.com/article/21/9/model-trains-openttd

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

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

2021 国庆前一天,欧拉操作系统按照既定的半年发布一个创新版本的节奏,发布了第三个创新版本 openEuler 21.09。在前不久召开的“华为全连接 2021 大会”上,我听到了欧拉即将进行“全新”发布的消息。作为一名长期观察欧拉发展的业内人士,我对这“全新”的说法是好奇的,这究竟是一种宣传的手法,亦或是真的有了很大不同?

怀着这个疑问,我对在“华为全连接 2021”后几天发布的 openEuler 21.09 是颇为关注的,希望可以第一时间拿到它的白皮书一窥究竟。几天后,欧拉发布了该版本的技术白皮书。我在翻阅后感觉,与其说欧拉是一辆粉饰一新的新车,不如说是它在引擎盖下做了颇多改进。

在这份几十页的《openEuler 21.09 技术白皮书》,颇有一些值得重视的技术变化被掩盖在了枯燥的技术术语之中,因此,本着一飨读者的想法,我对其中值得关注的地方,用更浅显的语言进行了一些解读。

openEuler 发布

首先回顾一下欧拉的基本情况。欧拉最初脱胎于华为内部的 Linux 发行版 EulerOS,后于 2019 年底宣布开源,成为 openEuler。其主要面对的是服务器基础设施领域,并在次年春季发布了第一个 LTS 版本。欧拉的主要技术路线沿袭了红帽系的技术方向,无论是从软件包管理、文件系统布局、操作系统体验方面,都吸收了不少 CentOS/RHEL 惯例。但是,欧拉又不是一个 CentOS 的某个版本的下游分支版本,因为其从内核、特性、技术演进方向,都有自己的独立而确定的发展计划,这一点和 SUSE 公司的 openSUSE/SLES 发行版家族类似。

欧拉采用了定期发布版本的发行计划,每两年发布一个长期支持版本(LTS)。除了作为服务器操作系统所重视的长期支持和特性稳定之外,欧拉也是一个技术孵化器,它每半年发布一次的创新版,集成了社区的最新技术成果,将社区验证成熟的特性逐步回合到发行版中。从 2020 年 3 月发布第一个 LTS 版本之后,它已经发布了三个创新版本,按照计划,下一个 LTS 版本将于 2022 年 3 月到来。

openEuler 版本图

如上所述,这次发布的 21.09 是一个创新版本,主要是迭代演进即将放入到下一个 LTS 版本中的新特性。在这个版本中,重点引入和发展的特性有:

  • 内核的创新:新介质文件系统和内存分级扩展
  • 云原生创新:容器操作系统、安全容器和双平面部署
  • 增强的特性:对语言编译器的支持、对运维的支持
  • 全场景创新:对编译计算、嵌入式场景的支持和集群加速引擎

下面,我们就这些特性展开来了解一下。

白话解析白皮书

如果不是欧拉社区的相关贡献者和长期参与者,你可能会觉得这份技术白皮书有些难读。我也是这样觉得的,不过,进行梳理之后,我把这几十页的内容凝聚成了几个关键字:内核特性容器技术架构支持场景支持

内核特性

Linux 系统给你的感受是什么?可能有很多答案,但是归根到底,这是一幢建立在 Linux 内核基础之上的华厦。内核提供的各种新特性,通过上层的应用最终提供了各种公用。因此,一个 Linux 操作系统的根本就是内核。

说句题外话,国内流行的 CentOS,主要的原因还是大家信任它的内核。这一点,谁做过运维谁知道。而华为作为国内首屈一指的在 Linux 内核方面颇有建树的企业,这些年来,在 Linux 内核方面已经做出了诸多贡献。

内核贡献图

华为在芯片架构、ACPI、内存管理、文件系统、介质、内核文档、内核质量加固及代码重构等方面,十余年来总计向社区贡献 17000+ 个补丁。而在 Linux 内核 5.10 和 5.14 版本中,欧拉内核研发团队代码贡献量排名全球第一。

那么我们来看看具体在这个版本中,欧拉在内核方面做了什么努力。

欧拉 21.09 还是基于 Linux 内核 5.10 构建,但在进程调度、内存管理、网络等方面带来了 12 处创新,这主要有:用来提升性能的进程调度优化、大页内存性能优化、OOM 内存回收优化、XDP 网络性能优化等。

除了这些隐蔽但重要的内核改进之外,如今在运维领域已经大量使用的非易失性内存(NVDIMM)存储介质,在使用传统的 ext4 文件系统时,尚缺乏针对性的优化,因为 Ext4 本身是针对旋转式硬盘设计的文件系统。尤其在元数据管理方面,基于现有日志同步机制,元数据管理开销大,且容易出现写放大问题,NVDIMM 优势无法充分发挥。华为推出的 Eulerfs 创新的元数据软更新技术,减少了元数据同步开销,有效提升文件系统的系统调用性能。在单机应用、云原生分布式应用高性能数据存储场景,可以代替 Ext4、XFS 等文件系统。

容器技术

现在的运维领域,几乎是言必称云原生。一个操作系统的对云原生、虚拟化的支持力度,也成了一种试金石。

欧拉面向云原生业务混合部署场景提出了一种 QAS 算法。它是一种适用于云原生场景,业务混合部署的全新调度算法,可以确保在线任务对 CPU 的快速抢占,确定性的调度运行,同时压制离线任务干扰。此外,在欧拉中还优化了 OOM(内存使用超量)时内存回收调度算法,在发生 OOM 时,优先对低优先级的进程组进行内存回收,保障在线业务的正常运行。这些改进适用于对交互类等时延敏感型业务(比如 MySQL、Redis、Nginx 等)和 CPU 消耗重且时延不敏感的业务(如 AI 离线训练)混合部署,它包括了容器与容器、容器与进程、容器与虚机、虚机与虚机等多种混合部署场景。

Kubernetes 已经成为事实上的云原生软件基础设施底座。业界的主流操作系统厂商都推出了针对云原生场景的操作系统。欧拉自然也不甘人后,推出了容器化操作系统 KubeOS,实现云原生集群操作系统的统一容器化管理。它可以对操作系统容器化管理、对接 Kubernetes、原子化的生命周期管理;它也对操作系统进行了轻量化裁剪,减少不必要的冗余包,可实现系统的快速升级、替换等。

再往底层看,欧拉结合虚拟化运行时 StratoVirt、容器管理引擎 iSulad 构建了安全容器方案,较之传统的 Docker + Qemu 方案,其底噪和启动时间优化高达 40% 以上,为应用提供了一个轻量、安全的执行环境,隔离了容器和宿主机操作系统间、容器间的安全风险。

架构支持

针对不同的硬件架构,欧拉在编程语言和架构方面还做了支持。

欧拉提供的毕昇 JDK 是基于 OpenJDK 开发的增强版本,具备高性能、高可用等优点,可用于生产环境。值得一提的是,它积累了大量使用场景,并针对 ARM 进行了性能优化。毕昇 JDK 支持 OpenJDK 8 和 OpenJDK 11 两个版本。

在欧拉中也有鲲鹏处理器打造的高性能编译器,Kunpeng GCC 编译器是基于 GCC 开发的,可以充分发挥鲲鹏的硬件特性,运行效率更高。

据测试,毕昇 JDK 在 SPECjbb2015 等基准测试中性能优于 OpenJDK。Kunpeng GCC 编译器在 SPEC CPU 2017 等基准测试中性能大幅优于上游社区的 GCC 10.3 版本。欧拉最初就是针对华为鲲鹏硬件架构开发的操作系统,因此,在欧拉中自然提供了针对性的优化,以充分发挥鲲鹏服务器硬件特性,这也算是应有之义。

在这次发布中,华为还重点提及,欧拉最初是作为对鲲鹏硬件的支持出现的,但是现在已经扩展到支持 x86、ARM、RISC-V 等多处理器架构,未来还会扩展 PowerPC、SW64 等更多芯片架构支持。但是从白皮书中,我们尚没有看到对其它处理器架构的特定优化工作和测试数据。

场景支持

从白皮书中我们看到,欧拉现在从对服务器场景的应用,逐步拓展到云计算、边缘计算、嵌入式等更多场景,正成为覆盖全场景的操作系统。

欧拉透露,它将发布面向边缘计算的版本 openEuler 21.09 Edge 和面向嵌入式的版本 openEuler 21.09 Embedded。这两个针对不同场景的版本突破了原有的服务器基础设施领域,但是,从我了解到的情况看,这其实已经不是 Linux 内核为基础的操作系统了,而是基于华为本身在这些领域的内核及应用开发的。可以理解为在一个统一的框架下的不同内核、不同操作系统。

欧拉的多场景支持

当然,除此以外,在这次发布的欧拉 21.09 中,还有很多具体方向的创新和改进,感兴趣的同学可以获取这份技术白皮书以了解究竟。

结语

每半年发布的一个创新版,我认为并不是很适合于需要特性稳定的产品环境部署,但是通过这些创新版本,社区和相关生态的企业可以提前针对新的特性进行开发、测试和优化。而无论是服务器环境,还是嵌入式、边缘技术,都需要一个具备稳定性、高性能、精细调优的操作系统,这就是明年 3 月将发布的下一个 LTS 版本的目标。而且,除了长期支持以外,我们可以期待在创新版中发布的新特性,也会经过打磨后融入到 LTS 版本中。

当然,我认为,LTS 版本并不是一个口号,而是需要真正地提供支持和维护。这是一种并不像发布新版本那么令人激动的工作,但是这种持续的支持,才是一个企业级的操作系统的根本。我们期望看到欧拉能够践行其对技术创新和长期支持的承诺和落实。


想要进一步了解这份《openEuler 21.09 技术白皮书》,可以点击此处下载

Linux 用户提交了更多、更好的错误报告

一个独立开发者发现了一个 有趣的情况。虽然他的游戏只有 5.8% 的买家在 Linux 上玩,但他们产生了超过 38% 的错误报告。这也不是因为 Linux 平台的错误更多。在 Linux 用户提交的大约 400 个错误报告中,只有 3 个是针对 Linux 平台的。而且,这些错误报告本身的质量也相当高,包括软件和操作系统版本、日志和复制的步骤。

老王点评:这可能就是 Linux 用户的特征吧,他们已经熟悉了报错和规范的报错方式了。我不知道对此是该哭还是该笑。

英特尔的 CPU 扳回一局

随着英特尔第 12 代 Alder Lake 移动处理器的即将到来,苹果的 M1 SoC 在 Geekbench 速度基准上的统治可能很快就会结束。基准测试结果显示,英特尔的这款预发布的移动 CPU 以微弱优势超过了苹果的旗舰产品 10 核 M1 Max,而后者还集成了 32 核 GPU 和 64GB 的统一内存。但英特尔的 Alder Lake 移动处理器以更大的优势击败了 AMD 的顶级移动 CPU Ryzen 5980HX。

老王点评:差距很小,但这个结果对英特尔来说很重要。

韩国电信澄清是路由错误导致中断

昨天我们 报道过,韩国电信全网中断了 40 分钟,最初怀疑是大规模 DDoS 攻击导致的。但在仔细检查后发现,该公司发现 原因是路由错误。韩国电信尚未公布是什么导致了路由错误,以及这如何导致了中断,预计将在晚些时候公布。

老王点评:我怀疑是人工操作错误导致的,这种骨干网上的操作都这样弱不禁风么?

基本的 Git 命令 对于通常的克隆、添加、提交推送已经足够好了。

但如果你在一个有多个贡献者的大型项目上工作,你可能需要将事情可视化。GUI 工具可以让你更好地了解 diffstashblame 的情况。

但是,如果你常用终端,又想要 Git 的舒适性,我为你准备了一个好工具。

它叫 GitUI,它提供了类似于 Git GUI 的用户体验和舒适度,但就在你的终端中。它是可移植的、快速的、自由而开源的。

GitUI:一个基于终端的 Git 工具

GitUI 并不是第一个用于 Linux 终端的 Git 客户端。那么,是什么让 GitUI 与其他类似项目如 lazygittig 不同?

GitUI 的开发者在项目的 README 文件中分享了一些基准数据。

名称时间内存(GB)二进制(MB)冻结崩溃
gitui24 s0.171.4
lazygit57 s2.616有时
tig4 m 20 s1.30.6有时

GitUI、LazyGit 和 Tig 之间的比较。

这种优化大部分来自于 Rust 语言的使用。

注意:该程序处于早期开发阶段,还没有为生产做好准备。

在 Linux 上安装 GitUI

不用说,你应该已经 在你的系统上安装了 Git

要使用 GitUI,首先需要 为你的 Linux 发行版安装 Rust 支持

在终端中,使用以下命令:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Installing Rust on Linux

当你被要求选择时,请选择选项 1。当脚本完成安装后,用这个命令正确设置配置:

source $HOME/.cargo/env

现在你已经安装了 Rust 和它的包管理器 Cargo,使用 Cargo 命令来安装 GitUI:

cargo install gitui

然后你就可以使用 GitUI了,只需在终端输入 gitui 就可以运行了。我做了一些示例文件来测试 Git 和 GitUI。

Starting gitui on terminal

值得一提的是,这个界面有一个快速而直观的纯键盘控制。一切都很简单,只需输入正确的字母即可将文件暂存、提交、分支或推送到 git 仓库中。

真正让我兴奋的是,你不仅可以做之前的四个动作,还可以编辑每个文件,拉取它,追溯 它,在其中导航等等,这一切都无需退出界面。 很棒,不是吗?

More functions inside the interface

祝贺你! 现在你知道了如何安装 GitUI 以及它在你的终端中的样子。

如果你喜欢这个项目,请在 GitHub 上点赞它的仓库。如果你使用其他工具来管理 Git,请在评论区提出你的建议。


via: https://itsfoss.com/gitui/

作者:Marco Carmona 选题:lujun9972 译者:geekpi 校对:wxy

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

Rust 的高性能、高可靠性和高生产力使它适合于嵌入式系统。

 title=

在过去的几年里,Rust 在程序员中获得了热情的追捧。技术潮流来来去去,所以很难将仅仅因为某项新技术而产生的兴奋与对某项技术的优点的兴奋区分开来,但我认为 Rust 是一种真正设计良好的语言。它的目标是帮助开发者建立可靠和高效的软件,而且它从一开始就是为这个目的设计的。你可能听过一些 Rust 的关键特性,在这篇文章中,我会证明这些特性正是 Rust 也恰好适合嵌入式系统的原因。比如:

  • 高性能:它速度快,内存利用率高
  • 可靠性:在编译过程中可以消除内存错误
  • 生产力:很棒的文档,友好的编译器,有用的错误信息,以及一流的工具化。它有一个集成的包管理器和构建工具,智能的多编辑器支持自动补完和类型检查、自动格式化等等。

为什么使用 Rust 进行嵌入式开发?

Rust 的设计是为了保证安全和高性能。嵌入式软件会出现的问题主要是内存的问题。从某种程度上说,Rust 是一种面向编译器的语言,所以你可以确保在编译时安全使用内存。以下是使用 Rust 在嵌入式设备上开发的一些好处:

  • 强大的静态分析
  • 灵活的内存
  • 无畏的并发性
  • 互操作性
  • 可移植性
  • 社区驱动

在这篇文章中,我使用开源的 RT-Thread 操作系统 来演示如何使用 Rust 进行嵌入式开发。

如何在 C 语言中调用 Rust

在 C 代码中调用 Rust 代码时,你必须将 Rust 源代码打包成静态库文件。当 C 代码编译时,将其链接进去。

用 Rust 创建一个静态库

在这个过程中,有两个步骤:

1、使用 cargo init --lib rust_to_c 在 Clion 中建立一个 lib 库。在 lib.rs 中加入以下代码。下面的函数计算两个类型为 i32 的值的总和并返回结果:

#![no_std]
use core::panic::PanicInfo;

#[no_mangle]
pub extern "C" fn sum(a: i32, b: i32) -> i32 {
    a + b
}

#[panic_handler]
fn panic(_info:&PanicInfo) -> !{
    loop{}
}

2、在你的 Cargo.toml 文件中添加以下代码,以告诉 Rustc 要生成什么类型的库:

[lib]
name = "sum"
crate-type = ["staticlib"]
path = "src/lib.rs"

交叉编译

你可以针对你的目标平台进行交叉编译。假设你的嵌入式系统是基于 Arm 的,步骤很简单:

$ rustup target add armv7a-none-eabi

生成静态库文件:

$ cargo build --target=armv7a-none-eabi --release --verbose
Fresh rust_to_c v0.1.0
Finished release [optimized] target(s) in 0.01s

生成头文件

你也需要头文件:

1、安装 cbindgencbindgen 工具会从 Rust 库中生成一个 C 或 C++11 的头文件:

$ cargo install --force cbindgen

2、在你的项目文件夹下创建一个新的 cbindgen.toml 文件。

3、生成一个头文件:

$ cbindgen --config cbindgen.toml --crate rust_to_c --output sum.h

调用 Rust 库文件

现在你可以对你的 Rust 库进行调用了。

1、把生成的 sum.hsum.a 文件放到 rt-thread/bsp/qemu-vexpress-a9/applications 目录下。

2、修改 SConscript 文件并添加一个静态库:

   from building import *
   
   cwd     = GetCurrentDir()
   src     = Glob('*.c') + Glob('*.cpp')
   CPPPATH = [cwd]
   
   LIBS = ["libsum.a"]
   LIBPATH = [GetCurrentDir()]
   
   group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, LIBS = LIBS, LIBPATH = LIBPATH)
   
   Return('group')

3、在主函数中调用 sum 函数,得到返回值,并 printf 该值:

   #include <stdint.h>
   #include <stdio.h>
   #include <stdlib.h>
   #include <rtthread.h>
   #include "sum.h"
   
   int main(void)
   {
       int32_t tmp;
   
       tmp = sum(1, 2);
       printf("call rust sum(1, 2) = %d\n", tmp);
   
       return 0;
   }

4、在 RT-Thread Env 环境中,使用 scons 来编译项目并运行:

$ scons -j6
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
[...]
scons: done building targets.

$ qemu.sh
 \ | /
- RT -     Thread Operating System
 / | \     4.0.4 build Jul 28 2021
2006 - 2021 Copyright by rt-thread team
lwIP-2.1.2 initialized!
[...]
call rust sum(1, 2) = 3

加、减、乘、除

你可以在 Rust 中实现一些复杂的数学运算。在 lib.rs 文件中,使用 Rust 语言来实现加、减、乘、除:

#![no_std]
use core::panic::PanicInfo;

#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[no_mangle]
pub extern "C" fn subtract(a: i32, b: i32) -> i32 {
    a - b
}

#[no_mangle]
pub extern "C" fn multiply(a: i32, b: i32) -> i32 {
    a * b
}

#[no_mangle]
pub extern "C" fn divide(a: i32, b: i32) -> i32 {
    a / b
}

#[panic_handler]
fn panic(_info:&PanicInfo) -> !{
    loop{}
}

构建你的库文件和头文件,并把它们放在应用程序目录中。使用 scons 来编译。如果在链接过程中出现错误,请在官方 Github 页面 中找到解决方案。

修改 rtconfig.py 文件,并添加链接参数 --allow-multiple-definition

       DEVICE = ' -march=armv7-a -marm -msoft-float'
       CFLAGS = DEVICE + ' -Wall'
       AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ -I.'
       LINK_SCRIPT = 'link.lds'
       LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,system_vectors,--allow-multiple-definition'+\
                         ' -T %s' % LINK_SCRIPT
   
       CPATH = ''
       LPATH = ''

编译并运行 QEMU 来看看你的工作。

在 Rust 中调用 C 语言

Rust 可以在 C 代码中调用,但是如何在你的 Rust 代码中调用 C 呢?下面是一个在 Rust 代码中调用 rt_kprintf C 函数的例子。

首先,修改 lib.rs 文件:

    // The imported rt-thread functions list
    extern "C" {
        pub fn rt_kprintf(format: *const u8, ...);
    }
   
    #[no_mangle]
    pub extern "C" fn add(a: i32, b: i32) -> i32 {
        unsafe {
            rt_kprintf(b"this is from rust\n" as *const u8);
        }
        a + b
    }

接下来,生成库文件:

$ cargo build --target=armv7a-none-eabi --release --verbose
Compiling rust_to_c v0.1.0
Running `rustc --crate-name sum --edition=2018 src/lib.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type staticlib --emit=dep-info,link -C opt-level=3 -C embed-bitcode=no -C metadata=a
Finished release [optimized] target(s) in 0.11s

而现在,要运行代码,将 Rust 生成的库文件复制到应用程序目录中,然后重新构建:

$ scons -j6 scons: Reading SConscript files ... scons: done reading SConscript files. [...]
scons: Building targets ... scons: done building targets.

再次运行 QEMU,可以在你的嵌入式镜像中看到结果。

你可以拥有这一切

在你的嵌入式开发中使用 Rust,你可以获得 Rust 的所有功能,而不需要牺牲灵活性或稳定性。今天就在你的嵌入式系统上试试 Rust 吧。关于嵌入式 Rust 的过程(以及 RT-Thread 本身)的更多信息,请查看 RT-Thread 项目的 YouTube 频道。请记住,嵌入式也可以是开放的。


via: https://opensource.com/article/21/10/rust-embedded-development

作者:Alan Smithee 选题:lujun9972 译者:wxy 校对:wxy

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