分类 技术 下的文章

开源意味着我可以在任何终端上找到熟悉的 Linux。

十年前,我开始了我的第一份工作,它要求我使用 Linux 作为我的笔记本电脑的操作系统。如果我愿意的话,我可以使用各种 Linux 发行版,包括 Gentoo,但由于我过去曾短暂地使用过Ubuntu,所以我选择了 Ubuntu Lucid Lynx 10.04。

我的 Konsole 终端使用的是 Zenburn 主题,有一个类似于这样的 Bash 提示符:

machinename ~/path/to/folder $

现在,我使用 Mac,具体来说是 macOS Catalina,我使用 iTerm2Zenburn 主题,zsh 提示符是这样的:

machinename ~/path/to/folder
$

我想,十年来几乎相同的提示符,我已经赢得了老古板的称号,不过这只是标志着,我的喜好和习惯与现在耍酷的孩子们不一样而已。

仿佛是为了证明我的古板观点,我想改变我的终端和我的旧终端一样。在 Mac 上获得一个看起来和感觉像 Lucid Lynx 的设置并不简单,而且我很花了一些时间。

我最近最大的改变是从 Bash 转移到 zsh,并迁移了我的 Bash 魔改。但这只是其中一个重大的转变。我学到了许多新式的经验,现在我把这些经验赠送给你,亲爱的读者。

Coreutils 对选项的顺序更宽容

从 Ubuntu 转移到 macOS 并没有太大的转变,直到我开始觉得我失去了 Unix 范。我试着运行一些基本的操作,比如删除文件夹,但却被告知我错误地调用了 rm

事实证明,GNU 风格的实用程序可能看起来 BSD 风格的差不多,但最大的可用性差异之一是参数顺序。未命名参数的排列顺序并不一致。例如:rm

下面是我们熟悉的 GNU 风格的删除目录的命令:

$ rm path/to/folder -rf

这与同一命令的 BSD 风格版本形成鲜明对比:

$ rm path/to/folder -rf
rm: path/to/folder: is a directory
rm: -rf: No such file or directory

我通过 Homebrew 安装 Coreutils 解决了这个问题。这将 GNU 实用程序引入到了 macOS,并使我不必为那些已经深深扎根于我的肌肉记忆中的命令记住选项顺序,从而对选项顺序更加宽容。

强大的 iTerm2

我不知道有哪个操作系统的资深用户会对默认终端满意。在 macOS 这块土地上,我选择了 iTerm2,它允许我比基本的操作系统终端应用更灵活。我最喜欢的 iTerm 强大功能之一是能够使用 Command+DCommand+Shift+D 来垂直和水平分割窗格。还有很多技巧需要学习,但仅是简单的分割窗格就值得用 iTerm2 换掉默认终端。

上下文感知的插件

即使是一个古板的用户也会自定义终端提示,其中一个原因是为了获得一些情境感知。我喜欢终端给我提供上下文,并回答所有想到的问题。不仅仅是我在哪个文件夹里,而是:我在什么机器上?这是个 Git 仓库吗?如果是,我在哪个分支?我是在 Python 虚拟环境中吗?

这些问题的答案最终都归结为一类称之为“上下文感知插件”的终端扩展。

对于当前的 Git 分支,我使用了这个 parse\_git\_branch() 方法(如果你使用的是 Oh My Zsh,也有类似的插件)。对于 Python 来说,virtualenv 会自动给提示符加前缀。Oh My Zsh 有如此多的插件,你一定能找到改善你生活的东西。

至于我的本地机?我就直接用 PS1 格式,因为我喜欢这样的基本信息,而且 macOS 并没有真正让你给机器起个名字。

多行提示符也不错

观察力强的读者可能会注意到,十年来我的提示符有一个变化,就是现在它是两行。这是最近的一个变化,我慢慢学会了喜欢,因为我前面提到的所有这些插件都让我的提示符变得很长很长。你在文件系统中导航不能太深,要不你试图做任何基本的事情都会输入换行。随之而来的是偶尔的重绘问题和可读性问题。

我收到的关于解决这个问题的建议大多围绕着“哦,你在用 zsh?用 Powerlevel10k 吧!”这对于像我这样不固步自封的人来说是不错的,但我能够从这些主题中学习到一些,并从中获取一点技巧。

我所做的是在我的提示符中的最后一个 $ 前加一个 $'\n',这样我的上下文信息 —— 当前机器、当前文件夹、当前 GitHub 分支、当前 virtualenv 等等 —— 都可以在一行中出现,然后我的命令就可以顺利输入了。

我发现唯一的问题是学会在哪里。我习惯于让我的眼睛从行的中心开始,因为以前我的提示符就是从那里开始的。我正在慢慢学会向左看提示符,但这是一个缓慢的过程。我有十几年的眼睛习惯要撤销。

使用适合你的方法

如果你喜欢某种风格或工具,那么你的这种偏好是绝对有效的。你可以尝试其他的东西,但千万不要认为你必须使用最新和最伟大的,只是为了像很酷的孩子一样。你的风格和喜好可以随着时间的推移而改变,但千万不要被迫做出对你来说不舒服的改变。

等下一次,凯蒂阿姨再给你吐槽一下 IDE。


via: https://opensource.com/article/20/7/mac-terminal

作者:Katie McLaughlin 选题:lujun9972 译者:wxy 校对:wxy

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

用这个微软的开源工具,获取进程信息。

微软越来越心仪 Linux 和开源,这并不是什么秘密。在过去几年中,该公司稳步地增加了对开源的贡献,包括将其部分软件和工具移植到 Linux。2018 年底,微软宣布将其 Sysinternals 的部分工具以开源的方式移植到 Linux,Linux 版的 ProcDump是其中的第一个。

如果你在 Windows 上从事过调试或故障排除工作,你可能听说过 Sysinternals,它是一个“瑞士军刀”工具集,可以帮助系统管理员、开发人员和 IT 安全专家监控和排除 Windows 环境的故障。

Sysinternals 最受欢迎的工具之一是 ProcDump。顾名思义,它用于将正在运行的进程的内存转储到磁盘上的一个核心文件中。然后可以用调试器对这个核心文件进行分析,了解转储时进程的状态。因为之前用过 Sysinternals,所以我很想试试 ProcDump 的 Linux 移植版。

开始使用 Linux 上的 ProcDump

要试用 Linux 上的 ProcDump,你需要下载该工具并编译它。(我使用的是 Red Hat Enterprise Linux,尽管这些步骤在其他 Linux 发行版上应该是一样的):

$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
$
$ uname -r
4.18.0-193.el8.x86_64
$

首先,克隆 Linux 版 ProcDump 的版本库。

$ git clone https://github.com/microsoft/ProcDump-for-Linux.git
Cloning into 'ProcDump-for-Linux'...
remote: Enumerating objects: 40, done.
remote: Counting objects: 100% (40/40), done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 414 (delta 14), reused 14 (delta 6), pack-reused 374
Receiving objects: 100% (414/414), 335.28 KiB | 265.00 KiB/s, done.
Resolving deltas: 100% (232/232), done.
$
$ cd ProcDump-for-Linux/
$
$ ls
azure-pipelines.yml  CONTRIBUTING.md  docs     INSTALL.md  Makefile    procdump.gif  src
CODE_OF_CONDUCT.md   dist             include  LICENSE     procdump.1  README.md     tests
$

接下来,使用 make 构建程序。它能准确地输出编译源文件所需的 GCC 命令行参数。

$ make
rm -rf obj
rm -rf bin
rm -rf /root/ProcDump-for-Linux/pkgbuild
gcc -c -g -o obj/Logging.o src/Logging.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Events.o src/Events.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/ProcDumpConfiguration.o src/ProcDumpConfiguration.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Handle.o src/Handle.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Process.o src/Process.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/Procdump.o src/Procdump.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/TriggerThreadProcs.o src/TriggerThreadProcs.c -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/CoreDumpWriter.o src/CoreDumpWriter.c -Wall -I ./include -pthread -std=gnu99
gcc -o bin/procdump obj/Logging.o obj/Events.o obj/ProcDumpConfiguration.o obj/Handle.o obj/Process.o obj/Procdump.o obj/TriggerThreadProcs.o obj/CoreDumpWriter.o -Wall -I ./include -pthread -std=gnu99
gcc -c -g -o obj/ProcDumpTestApplication.o tests/integration/ProcDumpTestApplication.c -Wall -I ./include -pthread -std=gnu99
gcc -o bin/ProcDumpTestApplication obj/ProcDumpTestApplication.o -Wall -I ./include -pthread -std=gnu99
$

编译过程中会创建两个新的目录。第一个是 obj/ 目录,存放编译期间创建的对象文件。第二个(也是更重要的)目录是 bin/,它是存储编译出的 procdump 程序的地方。它还会编译另一个名为 ProcDumpTestApplication 的测试二进制文件:

$ ls obj/
CoreDumpWriter.o  Handle.o   ProcDumpConfiguration.o  ProcDumpTestApplication.o  TriggerThreadProcs.o
Events.o          Logging.o  Procdump.o               Process.o
$
$
$ ls bin/
procdump  ProcDumpTestApplication
$
$ file bin/procdump
bin/procdump: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=6e8827db64835ea0d1f0941ac3ecff9ee8c06e6b, with debug_info, not stripped
$
$ file bin/ProcDumpTestApplication
bin/ProcDumpTestApplication: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c8fd86f53c07df142e52518815b2573d1c690e4e, with debug_info, not stripped
$

在此情况下,每次运行 procdump 实用程序时,你都必须移动到 bin/ 文件夹中。要使它在系统中的任何地方都可以使用,运行 make install。这将这个二进制文件复制到通常的 bin/ 目录中,它是你的 shell $PATH 的一部分:

$ which procdump
/usr/bin/which: no procdump in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
$
$ make install
mkdir -p //usr/bin
cp bin/procdump //usr/bin
mkdir -p //usr/share/man/man1
cp procdump.1 //usr/share/man/man1
$
$ which procdump
/usr/bin/procdump
$

安装时,ProcDump 提供了一个手册页,你可以用 man procdump 访问:

$ man procdump
$

运行 ProcDump

要转储一个进程的内存,你需要向 ProcDump 提供它的进程 ID(PID)。你可以使用机器上任何正在运行的程序或守护进程。在这个例子中,我将使用一个永远循环的小 C 程序。编译程序并运行它(要退出程序,按 Ctrl+C,如果程序在后台运行,则使用 kill 命令并输入 PID):

$ cat progxyz.c
#include <stdio.h>

int main() {
        for (;;)
        {
                printf(".");
                sleep(1);
        }
        return 0;
}
$
$ gcc progxyz.c -o progxyz
$
$ ./progxyz &
[1] 350498
$

运行该程序,你可以使用 pgrepps 找到它的 PID。记下 PID:

$ pgrep progxyz
350498
$
$ ps -ef | grep progxyz
root      350498  345445  0 03:29 pts/1    00:00:00 ./progxyz
root      350508  347350  0 03:29 pts/0    00:00:00 grep --color=auto progxyz
$

当测试进程正在运行时,调用 procdump 并提供 PID。下面的输出表明了该进程的名称和 PID,并报告它生成了一个核心转储文件,并显示其文件名:

$ procdump -p 350498

ProcDump v1.1.1 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process exceeds the
specified criteria.

Process:                progxyz (350498)
CPU Threshold:          n/a
Commit Threshold:       n/a
Polling interval (ms):  1000
Threshold (s):  10
Number of Dumps:        1

Press Ctrl-C to end monitoring without terminating the process.

[03:30:00 - INFO]: Timed:
[03:30:01 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:30:00.350498
$

列出当前目录的内容,你应该可以看到新的核心文件。文件名与 procdump 命令显示的文件名一致,日期、时间、PID 都会附加在文件名上:

$ ls -l progxyz_time_2020-06-24_03\:30\:00.350498
-rw-r--r--. 1 root root 356848 Jun 24 03:30 progxyz_time_2020-06-24_03:30:00.350498
$
$ file progxyz_time_2020-06-24_03\:30\:00.350498
progxyz_time_2020-06-24_03:30:00.350498: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'
$

用 GNU 项目调试器分析核心文件。

要查看是否可以读取该转储文件,调用 GNU 项目调试器gdb)。记得提供测试二进制文件的路径,这样你就可以看到堆栈上所有的函数名。在这里,bt(回溯)表明,当转储被采集时,sleep() 函数正在执行:

$ gdb -q ./progxyz ./progxyz_time_2020-06-24_03\:30\:00.350498
Reading symbols from ./progxyz...(no debugging symbols found)...done.
[New LWP 350498]
Core was generated by `./progxyz'.
#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6
Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64
(gdb) bt
#0  0x00007fb6947e9208 in nanosleep () from /lib64/libc.so.6
#1  0x00007fb6947e913e in sleep () from /lib64/libc.so.6
#2  0x00000000004005f3 in main ()
(gdb)

gcore 怎么样?

Linux 用户会很快指出,Linux 已经有一个叫 gcore 的命令,大多数 Linux 发行版都有这个命令,它的作用和 ProcDump 完全一样。你说的对。如果你从来没有使用过它,可以尝试用 gcore 来转储一个进程的核心。再次运行测试程序,然后运行 gcore,并提供 PID 作为参数:

$ ./progxyz &
[1] 350664
$
$
$ pgrep progxyz
350664
$
$
$ gcore 350664
0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6
Saved corefile core.350664
[Inferior 1 (process 350664) detached]
$

gcore 打印一条消息,说它已将核心文件保存到一个特定的文件中。检查当前目录,找到这个核心文件,然后再次使用 gdb 加载它:

$
$ ls -l  core.350664
-rw-r--r--. 1 root root 356848 Jun 24 03:34 core.350664
$
$
$ file core.350664
core.350664: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'
$
$ gdb -q ./progxyz ./core.350664
Reading symbols from ./progxyz...(no debugging symbols found)...done.
[New LWP 350664]
Core was generated by `./progxyz'.
#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6
Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-101.el8.x86_64
(gdb) bt
#0  0x00007fefd3be2208 in nanosleep () from /lib64/libc.so.6
#1  0x00007fefd3be213e in sleep () from /lib64/libc.so.6
#2  0x00000000004005f3 in main ()
(gdb) q
$

为了使 gcore 可以工作,你需要确保以下设置到位。首先,确保为核心文件设置了 ulimit,如果设置为 0,核心文件将不会被生成。第二,确保 /proc/sys/kernel/core_pattern 有正确的设置来指定核心模式:

$ ulimit -c
unlimited
$

你应该使用 ProcDump 还是 gcore?

有几种情况下,你可能更喜欢使用 ProcDump 而不是 gcore,ProcDump 有一些内置的功能,在一些情况下可能很有用。

等待测试二进制文件的执行

无论是使用 ProcDump 还是 gcore,测试进程必须被执行并处于运行状态,这样才能提供一个 PID 来生成核心文件。但 ProcDump 有一个功能,就是等待特定的二进制文件运行,一旦发现运行的测试二进制文件与给定的名称相匹配,它就会为该测试二进制文件生成一个核心文件。它可以使用 -w 参数和程序名称而不是 PID 来启用。这个功能在测试程序快速退出的情况下很有用。

下面是它的工作原理。在这个例子中,没有名为 progxyz 的进程在运行:

$ pgrep progxyz
$

-w 参数调用 procdump,让它保持等待。在另一个终端,调用测试二进制 progxyz

$ procdump -w progxyz

ProcDump v1.1.1 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process exceeds the
specified criteria.

Process:                progxyz (pending)
CPU Threshold:          n/a
Commit Threshold:       n/a
Polling interval (ms):  1000
Threshold (s):  10
Number of Dumps:        1

Press Ctrl-C to end monitoring without terminating the process.

[03:39:23 - INFO]: Waiting for process 'progxyz' to launch...

然后,从另一个终端调用测试二进制 progxyz

$ ./progxyz &
[1] 350951
$

ProcDump 立即检测到该二进制正在运行,并转储这个二进制的核心文件:

[03:39:23 - INFO]: Waiting for process 'progxyz' to launch...
[03:43:22 - INFO]: Found process with PID 350951
[03:43:22 - INFO]: Timed:
[03:43:23 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:43:22.350951
$

$ ls -l progxyz_time_2020-06-24_03\:43\:22.350951
-rw-r--r--. 1 root root 356848 Jun 24 03:43 progxyz_time_2020-06-24_03:43:22.350951
$
$ file progxyz_time_2020-06-24_03\:43\:22.350951
progxyz_time_2020-06-24_03:43:22.350951: ELF 64-bit LSB core file, x86-64, version 1 (SYSV), SVR4-style, from './progxyz', real uid: 0, effective uid: 0, real gid: 0, effective gid: 0, execfn: './progxyz', platform: 'x86_64'
$

多个核心转储

另一个重要的 ProcDump 功能是,你可以通过使用命令行参数 -n <count> 指定要生成多少个核心文件。核心转储之间的默认时间间隔是 10 秒,但你可以使用 -s <sec> 参数修改。这个例子使用 ProcDump 对测试二进制文件进行了三次核心转储:

$ ./progxyz &
[1] 351014
$
$ procdump -n 3 -p 351014

ProcDump v1.1.1 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process exceeds the
specified criteria.

Process:                progxyz (351014)
CPU Threshold:          n/a
Commit Threshold:       n/a
Polling interval (ms):  1000
Threshold (s):  10
Number of Dumps:        3

Press Ctrl-C to end monitoring without terminating the process.

[03:45:20 - INFO]: Timed:
[03:45:21 - INFO]: Core dump 0 generated: progxyz_time_2020-06-24_03:45:20.351014
[03:45:31 - INFO]: Timed:
[03:45:32 - INFO]: Core dump 1 generated: progxyz_time_2020-06-24_03:45:31.351014
[03:45:42 - INFO]: Timed:
[03:45:44 - INFO]: Core dump 2 generated: progxyz_time_2020-06-24_03:45:42.351014
$
$ ls -l progxyz_time_2020-06-24_03\:45\:*
-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:20.351014
-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:31.351014
-rw-r--r--. 1 root root 356848 Jun 24 03:45 progxyz_time_2020-06-24_03:45:42.351014
$

基于 CPU 和内存使用情况的核心转储

ProcDump 还可以让你在测试二进制或进程达到一定的 CPU 或内存阈值时触发核心转储。ProcDump 的手册页显示了调用 ProcDump 时使用的命令行参数:

  • -C:当 CPU 超过或等于指定值时,触发核心转储生成(0 到 100 * nCPU)。
  • -c:当 CPU 小于指定值时,触发核心转储生成(0 到 100 * nCPU)。
  • -M:当内存提交超过或等于指定值(MB)时,触发核心转储生成。
  • -m:当内存提交小于指定值(MB)时,触发核心转储生成。
  • -T:当线程数超过或等于指定值时触发。
  • -F:当文件描述符数量超过或等于指定值时触发。
  • -I:轮询频率,单位为毫秒(默认为 1000)。

例如,当给定 PID 的 CPU 使用率超过 70% 时,可以要求 ProcDump 转储核心:

procdump -C 70 -n 3 -p 351014

结论

ProcDump 是一长串被移植到 Linux 的 Windows 程序中的一个有趣的补充。它不仅为 Linux 用户提供了额外的工具选择,而且可以让 Windows 用户在 Linux 上工作时更有熟悉的感觉。


via: https://opensource.com/article/20/7/procdump-linux

作者:Gaurav Kamathe 选题:lujun9972 译者:wxy 校对:wxy

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

Vim 编辑器是很好的 Rust 应用开发环境。

Rust 语言旨在以 C++ 开发人员熟悉的方式实现具有安全并发性和高内存性能的系统编程。它也是 Stack Overflow 的 2019 年开发人员调查中最受欢迎的编程语言之一。

文本编辑器和集成开发环境(IDE)工具使编写 Rust 代码更加轻松快捷。有很多编辑器可供选择,但是我相信 Vim 编辑器非常适合作为 Rust IDE。在本文中,我将说明如何为 Rust 应用开发设置 Vim。

安装 Vim

Vim 是 Linux 和 Unix 中最常用的命令行文本编辑器之一。最新版本(在编写本文时)是 8.2,它在使用方式上提供了前所未有的灵活性。

Vim 的下载页面提供了多种二进制或软件包形式安装。例如,如果使用 macOS,那么可以安装 MacVim 项目,然后通过安装 Vim 插件 扩展 Vim 的功能。

要设置 Rust 进行开发,请下载 Rustup,这是一个方便的 Rust 安装器工具,并在你的终端上运行以下命令(如果你使用 macOS、Linux 或任何其他类 Unix 系统):

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

在提示中选择安装选项。然后,你将看到如下输出:

stable installed - rustc 1.43.1 (8d69840ab 2020-05-04)

Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.

To configure your current shell run source $HOME/.cargo/env

语法高亮

Vim 能让你通过 .vimrc 文件配置你的运行时环境。要启用语法高亮,请打开 .vimrc 文件(如果不存在就创建一个):

$ vim ~/.vimrc

.vimrc 中添加以下内容并保存:

filetype plugin indent on
syntax on

第一行同时打开检测、插件和缩进配置。第二行启用语法高亮。这些功能将帮助你在 Rust 中管理开发流程。在 Vim 的帮助文件中了解更多信息。

在 Vim 中创建一个 Rust 应用

要使用 Vim 创建一个新的 Rust HelloWorld 应用(hello.rs),请输入:

$ vim hello.rs

输入以下 Rust 代码在控制台中打印 Hello World!

fn main() {
    println!("Hello World");
}

它看起来应该像这样:

 title=

没有语法高亮的样子如下:

 title=

你是否注意到 Vim 自动缩进和组织代码?那是因为你在 .vimrc 文件中输入了第一行。

很好!接下来,你将使用 Rust 的包管理器 Cargo 构建此应用。

Cargo 集成

Cargo 使创建应用更加容易。要查看操作方法,请创建一个基于 Cargo 的 HelloWorld 应用。如果你尚未在 Linux 或 macOS 系统上安装 Cargo,请输入:

$ curl https://sh.rustup.rs -sSf | sh

然后使用 Cargo 创建包:

$ cargo new my_hello_world

如果查看目录结构,你会看到 Cargo 自动生成一些源码和目录。如果你安装了 tree,请运行它查看目录结构:

$ tree my_hello_world
my_hello_world
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files

在 Vim 中打开 main.rs 源码文件:

$ vim my_hello_world/src/main.rs

它与你在上面手动创建的 HelloWorld 示例中的代码相同。用 Rust with Vim 代替 World

 fn main() {
      println!("Hello, Rust with Vim");
 }

使用 :wq 保存更改并退出 Vim。

编译你的应用

现在你可以使用 cargo build 编译你的第一个 Rust 应用:

$ cd my_hello_world
$ cargo build

你的终端输出将类似于以下内容:

   Compiling my_hello_world v0.1.0 (/Users/danieloh/cloud-native-app-dev/rust/my_hello_world)

    Finished dev [unoptimized + debuginfo] target(s) in 0.60s

你可能会看到一条警告消息,因为你重用了示例包名 my_hello_world,但现在可以忽略它。

运行应用:

$ target/debug/my_hello_world
Hello, Rust with Vim!

你也可以使用 cargo run 一次构建和运行应用:

$ cargo run
 
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/my_hello_world`
Hello, Rust with Vim!!

恭喜!你在本地的 Vim 编辑器中设置了 Rust IDE,开发了第一个 Rust 应用,并使用 Cargo 包管理器工具构建、测试和运行了它。如果你想学习其他 Cargo 命令,请运行 cargo help


via: https://opensource.com/article/20/7/vim-rust-ide

作者:Daniel Oh 选题:lujun9972 译者:geekpi 校对:wxy

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

使用 .gitignore 文件是提高代码和 Git 仓库质量的最佳实践之一。

我注意到很多开发者没有使用 .gitignore 文件,尽管使用 .gitignore 文件来指定你不希望 Git 在版本控制中跟踪的文件是最佳实践之一。.gitignore 可以提高代码质量,所以你不应该忽略版本库中的 .gitignore

什么是 .gitignore?

Git 仓库中的文件可以是:

  1. 未跟踪的:未被暂存或提交的变更。
  2. 跟踪的:已暂存或提交的变更。
  3. 忽略的:你让 Git 忽略的文件。

有些文件你希望 Git 忽略,不要在你的版本库中跟踪它,这些文件包括许多自动生成的或特定于平台的文件,以及其他本地配置文件,如:

  1. 含有敏感信息的文件
  2. 编译出的代码,如 .dll.class
  3. 系统文件,如 .DS_StoreThumbs.db
  4. 含有临时信息的文件,如日志、缓存等。
  5. 生成的文件,如 dist 文件夹。

如果你不想让 Git 跟踪版本库中的某些文件,不过这不能通过 Git 命令做到。(虽然你可以用 git rm 命令停止跟踪一个文件,比如 git rm --cached。)相反,你需要使用 .gitignore 文件,这是一个告诉 Git 不要跟踪哪些文件的文本文件。

创建 .gitignore 文件很简单,只需创建一个文本文件并命名为 .gitignore。记得在文件名的开头有一个点(.)。就这样就完成了。

编写 .gitignore 文件的规则

根据文档,“.gitignore 文件中的每一行都指定了一个模式。”

在此上下文中,“模式”可以指一个特定的文件名,或者指文件名的某些部分结合上通配符。换句话说,example.txt 是匹配名为 example.txt 的文件的有效模式,而 ex*txt 是匹配名为 example.txt 以及 export.txt 的文件的有效模式。

以下是一些帮助你正确设置 .gitignore 文件的基本规则:

  1. 任何以哈希(#)开头的行都是注释。
  2. \ 字符可以转义特殊字符。
  3. / 字符表示该规则只适用于位于同一文件夹中的文件和文件夹。
  4. 星号(*)表示任意数量的字符(零个或更多)。
  5. 两个星号(**)表示任意数量的子目录。
  6. 一个问号(?)代替零个或一个字符。
  7. 一个感叹号(!)会反转特定的规则(即包括了任何被前一个模式排除的文件)。
  8. 空行会被忽略,所以你可以用它们来增加空间,使你的文件更容易阅读。
  9. 在末尾添加 / 会忽略整个目录路径。

本地与全局 .gitignore 文件的比较

有两种类型的 .gitignore 文件:

  • 本地:放在 Git 仓库的根目录下,只在该仓库中工作,并且必须提交到该仓库中。
  • 全局:放在你的主目录根目录下,影响你在你的机器上使用的每个仓库,不需要提交。

很多开发者在项目仓库中使用本地的 .gitignore 文件,但很少有人使用全局的 .gitignore 文件。使用全局文件最显著的优势是,你不需要提交就可以使用它,而且做一个改动会影响你所有的版本库。

Git 忽略的优势

除了确保特定的文件不被 Git 追踪之外,使用 .gitignore 文件还有其他好处。

  1. 通过忽略不需要的文件,它可以帮助你保持代码库的干净。
  2. 它可以控制代码库的大小,这在你正在做一个大项目的时候特别有用。
  3. 你的每一次提交、推送和拉取请求都将是干净的。

结束语

Git 很强大,但归根结底,它只是一个计算机程序而已。使用最佳实践并保持你的代码仓库稳定是一个团队的努力,其中要做到一件事就是使用 .gitignore 文件。


via: https://opensource.com/article/20/8/dont-ignore-gitignore

作者:Rajeev Bera 选题:lujun9972 译者:wxy 校对:wxy

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

PDF Mix Tool 是一个简单、轻巧的开源 PDF 编辑应用,可让你从 PDF 中提取页面、合并两个 PDF、从 PDF 中删除页面等。

PDF Mix Tool:一个简单的开源 PDF 编辑工具

几个可以在 Linux 中使用的 PDF 编辑器,我通常将它们分为两类:

  • 可让你编辑内容(注释、高亮、更改文本、添加/删除图像等)的 PDF 编辑器,
  • 可让你通过合并、分割、提取页面等来修改文件的 PDF 编辑器。

PDF Mix Tool 属于第二类。它是用 C++ 和 Qt5 编写的开源软件。它可让你合并两个或更多 PDF 文件,并为每个文件指定页面,还有旋转页面、添加空白页、删除页面以及从 PDF 文件提取页面。

在本周的开源软件亮点中,让我们看一下使用 PDF Mix Tool。

使用 PDF Mix Tool 在 Linux 中编辑 PDF

PDF Mix Tool 并没有很多功能,但是有一些非常重要的功能。

合并 PDF 文件

你可以轻松合并多个 PDF 文件,同时指定确切的页面。它让你能够调整页面数、旋转,还能使用 “ 交替混合 Alternate mix ” 反转页面顺序合并。

你只需要单击 “ 添加 PDF 文件 Add PDF File ” 添加文件,然后使用可用的选项对其进行编辑(如上图所示),最后生成编辑的 PDF。

旋转页面

你可以在合并多个文件或仅对单个 PDF 文件进行操作时旋转 PDF 文件的页面。

对于合并文件,你可以参考上面的截图。但是当你选择一个文件时,它看上去像这样:

你有多种选择,但是要旋转页面,需要选择 “ 编辑页面布局 Edit page layout ” 选项,如上截图所示。

添加或删除页面

要从其他 PDF 文件添加新页面,最好利用此选项。

但是,如果要添加空白页,你可以选择一个文件进行添加。不只是添加空白页面,还可以删除特定页面。下面的截图圈出了高亮选项:

从 PDF 文件提取页面

除了所有其他选项之外,你还可以从给定的 PDF 文件中提取特定页面(或全部)。你还可以为所有提取的页面生成一个新的 PDF 文件,或者为提取的每个页面制作单独的 PDF 文件。在许多场景中,它应该派上用场。

其他功能

利用上面所有功能,你可以生成自己选择的全新 PDF,颠倒顺序、提取页面、制作单独的 PDF 文件等等。

它不会减小 PDF 文件的大小。你必须使用其他工具在 Linux 中压缩 PDF 文件

因此,当你组合使用可用选项时,它是功能丰富的工具。

在 Linux 上安装 PDF Mix Tool

PDF Mix Tool 存在于 Snap 和 Flatpak 软件包中。这意味着如果发行版支持这任意一种,你都可以在软件管理器中找到它。

或者,如果你启用了 Snap 软件包支持,那么可以使用以下命令进行安装:

sudo snap install pdfmixtool

如果你想使用 Flatpak,那么使用:

flatpak install flathub eu.scarpetta.PDFMixTool

如果你使用的是 Arch Linux,那么可以从社区仓库中获取。

sudo pacman -S pdfmixtool

你也可以选择查看它的 GitLab 页面获取源码。

总结

它可能不是功能最丰富的 PDF 编辑工具,但考虑到它是轻量级的开源工具,因此它是已安装的应用中非常有用的。过去我们也介绍过类似的工具 PDF Arranger。你可能会想了解一下。

你如何看待它?你有尝试过么?在下面的评论中让我知道你的想法。


via: https://itsfoss.com/pdf-mix-tool/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

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

在树莓派上运行 Fedora。

树莓派基金会这几年来生产了很多型号。本文的安装过程已经在第三代树莓派上进行了测试:3B v1.2B+(较旧的 树莓派 2 和新的 树莓派 4 都还没有测试)。这些是已经发布了几年的信用卡大小的树莓派。

获取硬件

你需要一些硬件组件,包括树莓派。你不需要任何 HaT(安装在顶部的硬件) 板或 USB 天线。如果你使用过树莓派,那么可能会有这些。

  • 当前网络。也许是你的家庭实验室。
  • 网线。连接当前网络到树莓派
  • 树莓派 3,型号 B 或 B+。
  • 电源
  • 8 GB 或更大容量的 micro-SD 卡
  • 键盘显示器

键盘和显示器共同组成本地控制台。即使没有控制台,也能进行操作(尽管很复杂),例如设置自动安装然后通过网络连接。在 Fedora 首次启动时,本地控制台可轻松回应配置问题。同样,在 AP 配置期间出错可能会破坏网络配置,从而阻止远程用户连入。

下载 Fedora Minimal

Fedora Minimal 镜像是 Fedora 的其他可选下载之一,它有所有必需的核心软件包和网络软件包(嗯,是几乎,注意下面的 dnsmasq)。该镜像包含一个现成的文件系统,它已经安装了 400 多个软件包。此最小镜像不包括流行的软件包,像开发环境、互联网服务或桌面。这些类型的软件不是这里所必需的,如果安装它们,可能会占用过多的内存。

Fedora Minimal 原始镜像可安装在小型 SD 卡上,并在少于 1GB 的内存中运行(这些旧的树莓派有 1GB 的内存)。

下载文件的名称类似于 Fedora-Minimal-32-1.6.aarch64.raw.xz。该文件已压缩,大小约为 700MB。文件解压缩后为 5GB。这是一个 ext4 文件系统,它大部分是空的:已使用约 1GB,空余 4GB。这些空的空间是压缩文件比未压缩的原始文件小得多的原因。

复制到 micro-SD 卡

  • 将镜像复制到 micro-SD 卡。

这可能比听起来更复杂,而且会带来痛苦的体验。找到一个良好的 micro-SD 卡需要花费精力。然后是将卡插到计算机的挑战。也许你的笔记本电脑有全尺寸的 SD 卡插槽,你还需要卡适配器,或者你需要一个 USB 适配器。然后,在进行复制时,操作系统可能会帮助你,也可能会妨碍你。你可能很幸运有 Fedora Media Writer,或使用这些 Linux 命令:

unxz ./Fedora-Minimal-32-1.6.aarch64.raw.xz
dd if=./Fedora-Minimal-32-1.6.aarch64.raw of=/dev/mmcblk0 bs=8M status=progress oflag=direct

安装 Fedora

  • 连接树莓派、电源线、网线和 micro-SD 卡。
  • 打开电源。
  • 当图形芯片通电时,看见彩色框。
  • 等待 anaconda 安装程序启动。
  • 回答 anaconda 的设置问题。

操作系统的初始配置需要几分钟的时间。等待启动需要花费几分钟,还需要花费一些时间填写 anaconda 的文本安装程序的问题。在下面的例子中,用户名为 nick,并且还是管理员(wheel 组的成员)。

恭喜你!你的树莓派已启动并可运行。

更新软件

  • dnf update 更新软件包。
  • 通过 systemctl reboot 重启。

多年来,很多人为使树莓派正常工作付出了很多工作。使用最新的软件,以确保你从他们的辛勤工作中受益。如果你跳过此步骤,你可能会发现有些东西无法正常工作。

此次更新下载并安装了约一百个软件包。由于存储设备是 micro-SD 卡,因此写入新软件的过程很慢。这就是 90 年代使用存储器的感觉。

可以摆弄的东西

如果你想摆弄的话,此时可以设置其他一些内容。这都是可选的。试试这些。

  • sudo hostnamectl set-hostname raspi 替换 localhost 主机名。
  • ip addr 查找 IP 地址。
  • 尝试 SSH 登录,甚至使用 ssh-copy-id 设置基于密钥的登录。
  • 使用 systemctl poweroff 关机。

via: https://fedoramagazine.org/install-fedora-on-a-raspberry-pi/

作者:Nick Hardiman 选题:lujun9972 译者:geekpi 校对:wxy

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