开放文档格式（ODF）基于开放标准，你可以使用其它工具检查它们，甚至从中提取数据。你只需要知道从哪里开始。过去，文字处理文件是封闭的专有格式。在一些较旧的文字处理软件中，文档文件本质上是该软件的内存转储。虽然这样可以让加载文件更快，但也使文档文件格式变得不透明。2005 年左右， 结构化信息标准促进组织 Organization for the Advancement of Structured Information Standards （OASIS）为所有类型的办公文档定义了一种开放格式，即 办公应用程序开放文档格式 Open Document Format for Office Applications （ODF）。由于 ODF 是基于 OpenOffice.org 的 XML 文件规范的开放式标准，因此你也可以将其简称为 “开放文档格式”。ODF 包括几种文件类型，包括用于 开放文档文本OpenDocument Text 文档的 ODT。ODT 文件中有很多值得探索的内容，它的本质是一个 Zip 文件。ODT 文件结构跟所有 ODF 文件一样，ODT 文件实际上是一个 XML 文档和其它文件的 Zip 压缩包。使用 Zip 可以占用更少的磁盘空间，同时也意味着可以用标准 Zip 工具来检查它。我有一篇关于 IT 领导力的文章，名为“Nibbled to death by ducks”，我将其保存为 ODT 文件。由于 ODF 文件是一个 zip 容器，你可以用 unzip 命令来检查它：$ unzip -l 'Nibbled to death by ducks.odt' Archive: Nibbled to death by ducks.odt Length Date Time Name 39 07-15-2022 22:18 mimetype 12713 07-15-2022 22:18 Thumbnails/thumbnail.png 915001 07-15-2022 22:18 Pictures/10000201000004500000026DBF6636B0B9352031.png 10879 07-15-2022 22:18 content.xml 20048 07-15-2022 22:18 styles.xml 9576 07-15-2022 22:18 settings.xml 757 07-15-2022 22:18 meta.xml 260 07-15-2022 22:18 manifest.rdf 0 07-15-2022 22:18 Configurations2/accelerator/ 0 07-15-2022 22:18 Configurations2/toolpanel/ 0 07-15-2022 22:18 Configurations2/statusbar/ 0 07-15-2022 22:18 Configurations2/progressbar/ 0 07-15-2022 22:18 Configurations2/toolbar/ 0 07-15-2022 22:18 Configurations2/popupmenu/ 0 07-15-2022 22:18 Configurations2/floater/ 0 07-15-2022 22:18 Configurations2/menubar/ 1192 07-15-2022 22:18 META-INF/manifest.xml 970465 17 files 我想强调 Zip 文件结构的以下几个元素：mimetype 文件用于定义 ODF 文档。处理 ODT 文件的程序，如文字处理程序，可以使用该文件来验证文档的 MIME 类型。对于 ODT 文件，它应该总是：application/vnd.oasis.opendocument.text META-INF 目录中有一个 manifest.xml 文件。它包含查找 ODT 文件其它组件的所有信息。任何读取 ODT 文件的程序都从这个文件开始定位其它内容。例如，我的 ODT 文档的 manifest.xml 文件包含这一行，它定义了在哪里可以找到主要内容:<manifest:file-entry manifest:full-path="content.xml" manifest:media-type="text/xml"/> content.xml 文件包含文档的实际内容。我的文档中只有一张截图，它位于 Pictures 目录中。从 ODT 中提取文件由于 ODT 文档是一个具有特定结构的 Zip 文件，因此可以从中提取文件。你可以先解压缩整个 ODT 文件，例如使用 unzip 命令：$ unzip -q 'Nibbled to death by ducks.odt' -d Nibbled 一位同事最近向我要了一份我在文章中提到的图片。通过查看 META-INF/manifest.xml 文件，我找到了嵌入图像的确切位置。用 grep 命令可以找到描述图像的行:$ cd Nibbled $ grep image META-INF/manifest.xml <manifest:file-entry manifest:full-path="Thumbnails/thumbnail.png" manifest:media-type="image/png"/> <manifest:file-entry manifest:full-path="Pictures/10000201000004500000026DBF6636B0B9352031.png" manifest:media-type=" image/png”/> 我要找的图像保存在 Pictures 文件夹中。可以通过列出目录的内容来验证：$ ls -F Configurations2/ manifest.rdf meta.xml Pictures/ styles.xml content.xml META-INF/ mimetype settings.xml Thumbnails/ 就是这张图片：开放文档格式ODF 是一种开放的文件格式，它可以描述文字处理文件（ODT）、电子表格文件（ODS）、演示文稿（ODP）和其它文件类型。由于 ODF 格式基于开放标准，因此可以使用其他工具检查它们，甚至从中提取数据。你只需要知道从哪里开始。所有 ODF 文件都以 META-INF/manifest.xml 为“引导”文件，通过它你能找到其余的所有内容。（题图：MJ/d245ab34-f0b0-452c-b29a-ece9aa78f11a）via: https://opensource.com/article/22/8/odt-files作者：Jim Hall 选题：lkxed 译者：toknow-gh 校对：校对者ID本文由 LCTT 原创编译，Linux中国 荣誉推出
我很高兴分享我最喜欢的 26 个 FreeDOS 命令。我家最早的一批计算机中有一台运行着一款名称为 DOS 的命令行操作系统，即 “ 磁盘操作系统 Disk Operating System ”。我是在 DOS 系统环境中长大的，学会了利用命令行来使我的工作更轻松。很多其他的人也是如此。我们非常爱 DOS ，所以在 1994 年 6 月 29 日，我们创建了 FreeDOS 工程。如果你的 FreeDOS 的初学者，你可能会对如何使用其附带的不同的命令行程序感到困惑。让我们从我最喜欢的 26 个 FreeDOS 命令开始吧。要学习更多的信息，在大部分命令的后面添加 /? 选项来获取更多的信息:C:\>attrib /? ATTRIB v2.1 - 显示或更高文件属性。 版权所有 (c) 1998-2003，遵循 GPL2 协议。 语法：ATTRIB { options | [path][file] | /@[list] } 选项： +H 设置隐藏属性。 -H 清除隐藏属性。 +S 设置系统属性。 -S 清除系统属性。 +R 设置只读属性。 -R 清除只读属性。 +A 设置存档属性。 -A 清楚存档属性。 /S 处理具体指定路径中的所有目录中的文件。 /D 处理带有通配符的参数的目录名称。 /@ 处理文件，文件列在具体指定文件 中 [或 stdin]。 示例： attrib file -rhs attrib +a -r dir1 dir2*.dat /s attrib -hs/sd /@list.txt *.* A 是 ATTRIBATTRIB 程序显示或更改文件的 属性 。属性可以是以下四个值之一：隐藏（H）、系统 S）、只读（R）、存档（A）。标记为隐藏的文件将不会在目录列表中显示。例如，假设你想隐藏一个名称为 SECRET.TXT 的文件，这样就不会有人它在那里。首先，你可以显示该文件的属性，以便查看它的当前设置：C:\FILES>attrib secret.txt [----A] SECRET.TXT 为隐藏这个文件，使用加号（+）操作符来开启用隐藏属性，像这样：C:\FILES>attrib +h secret.txt [----A] -> [-H--A] SECRET.TXT C:\FILES>dir Volume in drive C is FREEDOS2022 Volume Serial Number is 333D-0B18 Directory of C:\FILES . 05-27-2022 9:22p .. 05-27-2022 9:22p 0 file(s) 0 bytes 2 dir(s) 279,560,192 bytes free ATTRIB 的另一种常见使用方法是操作只读属性，这样你就不会意外地覆盖重要的文件。假设你想要保护 SECRET.TXT 文件，这样你就不能删除或更改它。使用 +R 修饰符 ，打开只读属性，像这样:C:\FILES>attrib +r secret.txt [----A] -> [---RA] SECRET.TXT C:\FILES>del secret.txt C:\FILES\SECRET.TXT: Permission denied no file removed. B 是“哔哔”声如果你需要在一个批处理文件中添加一些激情活力，你可以使用 BEEP 命令来获取用户的注意力。BEEP 不会在屏幕上显示任何内容，但是会简单地发出一个 “哔哔” 的声音信号。注意：BEEP 使用个人计算机内置的扬声器来发出 “哔哔” 声。如果你使用一台虚拟机器来引导启用 FreeDOS，检查你的系统是否建立正确的模拟个人计算机扬声器。否则，你将不会听到任何声音。C 是 CD像 Linux 一样，FreeDOS 支持目录，这会允许你以一种来你有帮助的方式来组织你的文件。例如，你可以在一个名称为 FILES 的目录中存放你的全部文件，对于某些类型的文件，你可能会有其它的目录，例如，针对字处理器文件的 DOCS ，或者针对表格文件的 SPRDSHT。你可以使用 CD（即 “ 更改目录 change directory ”） 命令来导航到一个目录。CHDIR 命令和 CD 命令一样，如果你更喜欢使用这种语法的话。为更改到一个新的目录，使用 CD 目录和目标目录：C:\>cd files C:\FILES>cd sprdsht C:\FILES\SPRDSHT>dir Volume in drive C is FREEDOS2022 Volume Serial Number is 333D-0B18 Directory of C:\FILES\SPRDSHT . 05-27-2022 9:59p .. 05-27-2022 9:59p FIB WKS 2,093 05-27-2022 10:07p LAB1 WKS 2,087 05-27-2022 10:10p MIS100 WKS 2,232 05-27-2022 10:05p 3 file(s) 6,412 bytes 2 dir(s) 279,527,424 bytes free 你不必一次导航一层目录。相反，你可以使用一个 CD 命令和提供完整的你想要更改到的目录路径:C:\>cd \files\sprdsht C:\FILES\SPRDSHT>dir Volume in drive C is FREEDOS2022 Volume Serial Number is 333D-0B18 Directory of C:\FILES\SPRDSHT . 05-27-2022 9:59p .. 05-27-2022 9:59p FIB WKS 2,093 05-27-2022 10:07p LAB1 WKS 2,087 05-27-2022 10:10p MIS100 WKS 2,232 05-27-2022 10:05p 3 file(s) 6,412 bytes 2 dir(s) 279,527,424 bytes free D 是 DELTREE如果需要删除一个单个文件，你可以使用 DEL 命令。为删除一个空的目录，你可以使用 RMDIR 或 RD 命令。但是，如果你想删除一个有很多文件和子目录的目录?一个包含有其它目录的目录称为 目录树 。你可以使用 DELTREE 命令来删除整个目录树。例如，为删除你的 FILES 目录，包括其中包含的所有的文件和目录，输入这个命令:C:\>deltree files [DEFAULT-BUILD v1.02g] of DELTREE. The "ROOT-SAFETY-CHECK" is enabled. Delete directory "C:\FILES" and all its subdirectories? [Y] [N] [Q], [ENTER] ? Y ==> Deleting "C:\FILES" ... 你可以使用一个单一的 DELTREE 命令来轻松快捷地完成很多工作，因此，FreeDOS 的 DELTREE 提示会询问你是否真的想要这样做。谨慎地使用这个命令。E 是 EDIT如果你需要在 FreeDOS 上编辑一个文本文件，EDIT 程序会让你轻松快速地完成任务。例如，要开始编辑一个名称为 HELLO.TXT 的文件，输入 EDIT HELLO.TXT 。如果 HELLO.TXT 文件已经存在，EDIT 打开文件并开始编辑。如果 HELLO.TXT 尚未存在，那么 EDIT 为你开启一个新的文件。FreeDOS 的 EDIT 使用了一种友好的界面，对大多数人来说应该很容易使用。使用菜单来访问 EDIT 的各种特色功能，包括保存文件、打开一个新的文件、或者退出编辑器。为访问菜单，在你的键盘上按下 Alt 按键，然后使用箭头按键来避开和进入选择的动作。F 是 FIND如果你需要在一个文件中查找文本，FIND 命令可以完成这项工作。类似于在 Linux 上的 fgrep ，FIND 会打印一些包含一个字符串的行。例如，为检查 FDCONFIG.SYS 文件中的 "Menu Default" 条目项，像这样使用 FIND :C:\>find "MENUDEFAULT" fdconfig.sys ---------------- FDCONFIG.SYS MENUDEFAULT=2,5 如果你不确定你想要查找的字符串是使用的大写字母还是小写字母，添加 /I 选项来忽略字母的大小写情况:C:\>find /i "menudefault" fdconfig.sys ---------------- FDCONFIG.SYS MENUDEFAULT=2,5 G 是 GRAPHICS如果你想要捕捉屏幕，你可以使用你键盘上的 PrtScr（ 打印屏幕 Print Screen ）按键来直接将你显示器上的文本打印到打印机上。不过，这只对纯文本来说有效。如果你要打印图形屏幕，你需要加载 GRAPHICS 程序。GRAPHICS 支持不同的打印机类型，包括 HP 的 PCL 打印机、Epson 的点阵打印机，和兼容 PostScript 的打印机。例如，如果有一台连接到你的计算机的 HP 的激光打印机，你可以通过输入这条命令来为这台打印机加载支持:C:\>graphics hpdefault Running in MS GRAPHICS compatibility mode... Using HPPCL type for type hpdefault If you think this is not correct, mail me (see help text). Printing black as white and white as black which internally uses /I of this GRAPHICS. You can use the following command directly instead of GRAPHICS [your options] in the future: LH GRAPH-HP /I Note that GRAPH-HP allows extra options: /E economy mode, /1 use LPT1, /2 use LPT2, /3 use LPT3, /R for random instead of ordered dither /C for 300dpi instead of 600dpi Driver to make 'shift PrtScr' key work even in CGA, EGA, VGA, MCGA graphics modes loaded, in HP PCL mode. H 是 HELP如果你刚刚来到 FreeDOS 的世界，你可以通过输入 HELP 来获取如何使用不同命令的提示。这将带来 FreeDOS 的帮助系统，包含所有命令的文档:I 是 IF你可以使用 IF 语句来将条件语句添加到你的命令行或批处理文件 。IF 进行一次简短的测试，然后执行一个单个命令。例如，如果存在某个文件，那么打印结果 “It's there”，你可以输入:C:\>if exist kernel.sys echo It's there It's there 如果你想要测试相反的东西，在测试内容前，使用 NOT 关键字。例如，如果两个字符串的值不相同，那么打印结果 “Not equal” ，输入这条语句:C:\>if not "a"=="b" echo Not equal Not equal J 是 JOIN早期的 DOS 版本是相当简单的；DOS 的第一个版本甚至不支持目录。为向这些较旧的程序提供向后兼容性，我们需要 JOIN 程序来作为一种巧妙的应变方法。JOIN 使用驱动器字母代替路径，这样，你可以将旧程序放入其自己的子目录中，但是，使用一个单个驱动器字母来访问它。让我们假设你有一个名称为 VC 的旧应用程序，它不懂目录。为保持 VC 的工作，你可以将它的路径 连接 join 到一个驱动器字母。例如:JOIN V: D:\VC FreeDOS 将 JOIN 实施为 SWSUBST，它也兼备类似 SUBST 命令的特色功能。为将 D:\VC 路径链接到到一个名称为 V: 的驱动器字母，输入:C:\>swsubst v: d:\vc C:\>dir v: Volume in drive V is DATA Volume Serial Number is 212C-1DF8 Directory of V:\ . 02-21-2022 10:35p .. 02-21-2022 10:35p VC COM 27,520 07-14-2019 4:48p 1 file(s) 27,520 bytes 2 dir(s) 48,306,176 bytes free K 是 KEYBDOS 默认采用美式英语键盘布局。你的键盘是不同的，你可以使用 KEYB 命令来加载新的键盘语言布局。例如，为为加载一种德语键盘布局，输入:C:\>keyb gr FreeDOS KEYB 2.01 - (c) Aitor Santamaría Merino - GNU GPL 2.0 Keyboard layout : C:\FREEDOS\BIN\KEYBOARD.SYS:GR [858] (3) L 是 LABELFreeDOS 使用 标签 label 来命名每个软盘驱动器和硬盘驱动器。这些标签提供了一种识别磁盘可能包含内容的方法。当你需要将文件存储到单个不同的软盘上时，LABEL 命令是非常有用的，你可以标记一个软盘 “Data”，另一个软盘为 “Games” 。为分配一个新的标签到一个驱动器。或者更改在一个驱动器上的现存标签。像这样使用标签:D:\>label d: data D:\>dir /w Volume in drive D is DATA Volume Serial Number is 212C-1DF8 Directory of D:\ [123] [ABILITY] [ASEASY] [GAMES2] [QUATTRO] [SRC] [TEMP] [THE] [VC] [WORD] [WS400] EDLIN16.EXE EDLIN32.EXE MYENV.BAT 3 file(s) 113,910 bytes 11 dir(s) 48,306,176 bytes free M 是 MEM运行程序和加载驱动程序会占用内存。可以查看你的系统有多少内存，以及有多少可用来运行 DOS 程序，使用 MEM 命令:C:\>mem Memory Type Total Used Free ---------------- -------- -------- -------- Conventional 639K 11K 628K Upper 104K 18K 86K Reserved 281K 281K 0K Extended (XMS) 15,224K 537K 14,687K ---------------- -------- -------- -------- Total memory 16,248K 847K 15,401K Total under 1 MB 743K 29K 714K Total Expanded (EMS) 8,576K (8,781,824 bytes) Free Expanded (EMS) 8,192K (8,388,608 bytes) Largest executable program size 628K (643,104 bytes) Largest free upper memory block 84K ( 85,728 bytes) FreeDOS is resident in the high memory area. N 是 NANSI如果你想添加一点颜色到 FreeDOS 命令行，你可以使用 ANSI 转义序列。这些序列之所以叫“转义”，是因为每个序列都以代码 33（转义字符 ESC）和一个由美国国家标准化协会（ANSI）定义的特殊字符序列为开头。FreeDOS 通过 NANSI.SYS 驱动程序来支持 ANSI 转义序列。随着 NANSI 的加载，你的 FreeDOS 控制台将解释 ANSI 转义序列，例如，设置文本颜色。O 是 oZoneFreeDOS 是一款命令行操作系统，但是一些人们更喜欢使用可备选的图形化用户界面。这就是为什么 FreeDOS 的 1.3 发行版包含一些图形化桌面的原因。我喜欢的一款名称为 oZone 的图形化桌面，它提供一种时尚、现代化外观的界面。注意，oZone 有一点烦人的错误，可能还需要一些来自外部开发者的关爱。如果你想让 oZone 变得更好，可以下载源文件代码做些贡献。P 是 PROMPT标准的 FreeDOS 命令行提示符会告诉你：你所在文件系统中的位置。当你第一次启动 FreeDOS 时，你的提示符看起来像 C:\>, 这意味着 \（根）目录在 C: 驱动器。> 字符表示着你可以在那里输入命令。在你的提示符中，如果你更喜欢不同的信息，使用 PROMPT 目录来更改它。你可以使用一个带有 $ 的开头的特殊代码来显示不同的信息，例如，$D 用于日期、$T 用于时间。例如，你可以使用 $$ 指令来使你的 FreeDOS 命令行看起来像一个 Linux 提示符，来打印一个单个美元符号:C:\>prompt $$ $ 输入 PROMPT /? 来查看一份全部特殊代码的列表。Q 是 QBASICFreeDOS 实际上没有 QBASIC 。它是针对 MS-DOS 的专有 BASIC 语言环境。作为备选方案，我们提供一些开放源文件的编译器，包括一些针对 BASIC 编程的编译器。FreeBASIC 编译器可以编译外来的大多数 QBASIC 程序。这里有一个简单的 “猜数” 示例:dim number as integer dim guess as integer randomize timer number = int( 10 * rnd() ) + 1 print "Guess the number from 1 to 10:" do input guess if guess < number then print "Too low" if guess > number then print "Too high" loop while guess <> number print "That's right!" 使用 FBC 命令来编译 FreeBASIC 程序:C:\DEVEL\FBC>fbc guess.bas 这里是这个简单游戏的快速演示:C:\DEVEL\FBC>guess Guess the number from 1 to 10: ? 5 Too high ? 3 Too low ? 4 That's right! R 是 REM在编写程序时，注释是极好的；注释帮助我们理解程序应该要做什么。可以在批处理文件中使用 REM 来做同样的事。在批处理文件中，在 REM 的后面的任何东西都将会被忽略。REM this is a comment S 是 SETFreeDOS 命令行使用一系列称为 环境变量 environment variables 的变量，让你来自定义你的系统。你可以使用 SET 命令来设置这些变量。例如。使用 DIRCMD 变量来控制 DIR 如何排列目录列表。为设置 DIRCMD 变量，使用 SET 命令:SET DIRCMD=/O:GNE 这告诉 DIR 先按照目录分组（G）来排序（O）输出，然后再按照名称（N）和扩展名（E）来排序结果。T 是 TYPETYPE 命令是最常使用的 DOS 命令之一。TYPE 显示一个文件的内容，类似于在 Linux 上的 cat 。C:\DEVEL>type hello.c #include int main() { puts("Hello world"); return 0; } U 是 UNZIP在 Linux 上，你可能更熟悉标准的 Unix 存档命令: tar。在 FreeDOS 上也有一个 tar 版本（和其它大量的流行的存档程序），但是，在 DOS 上的事实上的标准的存档命令是 ZIP 和 UNZIP 。两者都默认安装在 FreeDOS 1.3 之中。比如说，我有一些文件的一个 zip 存档。如果我想提取整个 Zip 文件，我可以只使用 UNZIP 命令，并将 Zip 文件作为命令行的选项来提供。这将在我当前工作目录中开始提取存档文件。除非我正在恢复一些东西的先前版本，我通常不希望覆盖我的当前文件。在这种情况下，我将提取存档到一个新的目录。你可以使用 -d（“ 目标 destination ”）命令行选项来具体指定目标路径：D:\SRC>unzip monkeys.zip -d monkeys.new Warning: TZ environment variable not found, cannot use UTC times!! Archive: monkeys.zip creating: monkeys.new/monkeys/ inflating: monkeys.new/monkeys/banana.c inflating: monkeys.new/monkeys/banana.obj inflating: monkeys.new/monkeys/banana.exe creating: monkeys.new/monkeys/putimg/ inflating: monkeys.new/monkeys/putimg/putimg.c inflating: monkeys.new/monkeys/putimg/putimg.obj inflating: monkeys.new/monkeys/putimg/putimg.exe 为学习更多关于 ZIP 和 UNZIP 命令的信息，可以阅读 如何在 FreeDOS 上存档文件。V 是 VER在 DOS 的古老岁月中，VER 命令会报告你正在运行的 DOS 发行版本，例如：“MS-DOS 5.0.D”。对于 FreeDOS，VER 命令将给予你额外的详细信息，例如 FreeDOS Shell 的版本:C:\DEVEL>ver FreeCom version 0.85a - WATCOMC - XMS_Swap [Jul 10 2021 19:28:06] 如果你还想查看 FreeDOS 内核版本和 DOS 兼容性等级，添加 /R 选项:C:\DEVEL>ver /r FreeCom version 0.85a - WATCOMC - XMS_Swap [Jul 10 2021 19:28:06] DOS version 7.10 FreeDOS kernel 2043 (build 2043 OEM:0xfd) [compiled May 14 2021] W 是 WHICHFreeDOS 命令行可以运行来自记录在 PATH 变量中的不同的目录列表的程序。你可以使用 WHICH 命令来准确地识别出程序的位置。只需要输入 WHICH 加上你想要定位的程序名称：C:\>which xcopy xcopy C:\FREEDOS\BIN\XCOPY.EXE X 是 XCOPYCOPY 命令只能将文件从一个位置复制到另一个位置。如果你想扩大复制的范围来包括一些目录，使用 XCOPY 命令。我通常添加 /E 选项来包含所有的子目录，包括空的子目录，这样，我可以复制整个目录树。这样就可以有效地备份我正在工作的任意工程:D:\SRC>xcopy /e monkeys monkeys.bak Does MONKEYS.BAK specify a file name or directory name on the target (File/Directory)? d Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.C Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.OBJ Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.EXE Copying D:\SRC\MONKEYS\BANANA.C Copying D:\SRC\MONKEYS\BANANA.OBJ Copying D:\SRC\MONKEYS\BANANA.EXE 6 file(s) copied Y 是 Yellow这不是一个命令，而是关于 DOS 如何显示颜色的有趣的百科知识。如果你仔细留心过 FreeDOS，你可能已经注意到，文本只能获取有限的颜色范围—— 十六种文本颜色、八种背景颜色。IBM 的 5153 彩色显示器，通过点亮不同亮度等级的微小的红、绿、蓝荧光点的方式创建 16 种文本颜色和 8 种背景颜色来为用户显示颜色。早期的个人计算机只能以“标准强度”级别来显示背景颜色；只有文本颜色可以使用明亮颜色。如果你查看文本颜色，你有黑色、蓝色、绿色、蓝绿色、红色、品红色、橙色和白色。这些颜色的“明亮”版本有亮黑色（暗灰色）、亮蓝色、亮绿色、亮蓝绿色、亮红色、亮品红色、黄色和亮白色。橙色的“明亮”版本有实际上是黄色。没有“亮橙色”。如果你想要学习更多关于文本颜色的信息，阅读我们关于 FreeDOS 为什么有 16 种颜色 的文章。Z 是 ZIP你可以在 DOS 命令行中使用 ZIP 来创建文件和目录的存档。这是一种很便利的方法：可以备份你的工作，或者发布一个 “软件包” 来在未来的 FreeDOS 发行版中使用。例如，比如说，我想备份我的工程源文件代码，其中包含这些源文件文件:D:\SRC>zip -9r monkeys.zip monkeys zip warning: TZ environment variable not found, cannot use UTC times!! adding: monkeys/ (stored 0%) adding: monkeys/banana.c (deflated 66%) adding: monkeys/banana.obj (deflated 26%) adding: monkeys/banana.exe (deflated 34%) adding: monkeys/putimg/ (stored 0%) adding: monkeys/putimg/putimg.c (deflated 62%) adding: monkeys/putimg/putimg.obj (deflated 29%) adding: monkeys/putimg/putimg.exe (deflated 34%) ZIP 支持很多命令行选项来完成不同的工作，但是，我使用最多的命令行选项是： -r 用于递归处理目录和子目录、-9 用于提供尽可能大的压缩比。ZIP 和 UNZIP 使用类 Unix 命令行，因此，你可以在短划线后面合并选项: -9r 将在 Zip 文件中给予最大压缩比和包括子目录。关于如何使用 ZIP 和 UNZIP 命令的更多详细信息，阅读 如何在 FreeDOS 上存档文件。新的 FreeDOS 指南准备好你的 FreeDOS 旅程的下一步了吗?查看我们的新的电子书，现在开始尝试我们的 FreeDOS !FreeDOS 使用指南深入 FreeDOS 高级指南（题图：MJ/0b21dcc8-4c8d-457b-9e0d-fbbe5dd08c60）via: https://opensource.com/article/22/6/26-freedos-commands作者：Jim Hall 选题：lkxed 译者：robsean 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如何在 C 语言中安全地读取用户输入
getline() 提供了一种更灵活的方法，可以在不破坏系统的情况下将用户数据读入程序。在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时，程序员可能会尝试使用 C 标准库中的 gets 函数。它的用法非常简单：char *gets(char *string); gets() 从标准输入读取数据，然后将结果存储在一个字符串变量中。它会返回一个指向字符串的指针，如果没有读取到内容，返回 NULL 值。举一个简单的例子，我们可能会问用户一个问题，然后将结果读入字符串中：#include <stdio.h> #include <string.h> int main() { char city[10]; // 例如 "Chicago" // 这种方法很糟糕 .. 不要使用 gets puts("Where do you live?"); gets(city); printf("<%s> is length %ld\n", city, strlen(city)); return 0; } 输入一个相对较短的值就可以：Where do you live? Chicago <Chicago> is length 7 然而，gets() 函数非常简单，它会天真地读取数据，直到它认为用户完成为止。但是它不会检查字符串是否足够容纳用户的输入。输入一个非常长的值会导致 gets() 存储的数据超出字符串变量长度，从而导致覆盖其他部分内存。Where do you live? Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch <Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch> is length 58 Segmentation fault (core dumped) 最好的情况是，覆盖部分只会破坏程序。最坏的情况是，这会引入一个严重的安全漏洞，恶意用户可以通过你的程序将任意数据插入计算机的内存中。这就是为什么在程序中使用 gets() 函数是危险的。使用 gets()，你无法控制程序尝试从用户读取多少数据，这通常会导致缓冲区溢出。安全的方法fgets() 函数历来是安全读取字符串的推荐方法。此版本的 gets() 提供了一个安全检查，通过仅读取作为函数参数传递的特定数量的字符：char *fgets(char *string, int size, FILE *stream); fgets() 函数会从文件指针读取数据，然后将数据存储到字符串变量中，但最多只能达到 size 指定的长度。我们可以更新示例程序来测试这一点，使用 fgets() 而不是 gets()：#include <stdio.h> #include <string.h> int main() { char city[10]; // 例如 "Chicago" puts("Where do you live?"); // fgets 虽好但是并不完美 fgets(city, 10, stdin); printf("<%s> is length %ld\n", city, strlen(city)); return 0; } 如果编译运行，你可以在提示符后输入任意长的城市名称。但是，程序只会读取 size = 10 数据存储到字符串变量中。因为 C 语言在字符串末尾会添加一个空（\0）字符，这意味着 fgets() 只会读取 9 个字符到字符串中。Where do you live? Minneapolis <Minneapol> is length 9 虽然这肯定比 fgets() 读取用户输入更安全，但代价是如果用户输入过长，它会“切断”用户输入。新的安全方法更灵活的解决方案是，如果用户输入的数据比变量可能容纳的数据多，则允许字符串读取函数为字符串分配更多内存。根据需要调整字符串变量大小，确保程序始终有足够的空间来存储用户输入。getline() 函数正是这样。它从输入流读取输入，例如键盘或文件，然后将数据存储在字符串变量中。但与 fgets() 和 gets() 不同，getline() 使用 realloc() 调整字符串大小，确保有足够的内存来存储完整输入。ssize_t getline(char **pstring, size_t *size, FILE *stream); getline() 实际上是一个名为 getdelim() 的类似函数的装饰器，它会读取数据一直到特殊分隔符停止。本例中，getline() 使用换行符（\n）作为分隔符，因为当从键盘或文件读取用户输入时，数据行由换行符分隔。结果证明这是一种更安全的方法读取任意数据，一次一行。要使用 getline()，首先定义一个字符串指针并将其设置为 NULL ，表示还没有预留内存，再定义一个 size_t 类型的“字符串大小” 的变量，并给它一个零值。当你调用 getline() 时，你需要传入字符串和字符串大小变量的指针，以及从何处读取数据。对于示例程序，我们可以从标准输入中读取：#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *string = NULL; size_t size = 0; ssize_t chars_read; // 使用 getline 读取长字符串 puts("Enter a really long string:"); chars_read = getline(&string, &size, stdin); printf("getline returned %ld\n", chars_read); // 检查错误 if (chars_read < 0) { puts("couldn't read the input"); free(string); return 1; } // 打印字符串 printf("<%s> is length %ld\n", string, strlen(string)); // 释放字符串使用的内存 free(string); return 0; } 使用 getline() 读取数据时，它将根据需要自动为字符串变量重新分配内存。当函数读取一行的所有数据时，它通过指针更新字符串的大小，并返回读取的字符数，包括分隔符。Enter a really long string: Supercalifragilisticexpialidocious getline returned 35 <Supercalifragilisticexpialidocious > is length 35 注意，字符串包含分隔符。对于 getline()，分隔符是换行符，这就是为什么输出中有换行符的原因。 如果你不想在字符串值中使用分隔符，可以使用另一个函数将字符串中的分隔符更改为空字符。通过 getline()，程序员可以安全地避免 C 编程的一个常见陷阱：你永远无法知道用户可能会输入哪些数据。这就是为什么使用 gets() 不安全，而 fgets() 又太笨拙的原因。相反，getline() 提供了一种更灵活的方法，可以在不破坏系统的情况下将用户数据读入程序。（题图：MJ/4b23132f-8916-42ae-b2da-06fd2812bea8）via: https://opensource.com/article/22/5/safely-read-user-input-getline作者：Jim Hall 选题：lkxed 译者：MjSeven 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 Bash 中的 for 循环，为网页创建一个方便的调色板。当计算机显示器的调色板有限时，网页设计师通常使用一组 Web 安全颜色 来创建网站。虽然在较新设备上显示的现代网站可以显示比最初的 Web 安全调色板更多的颜色，但我有时喜欢在创建网页时参考 Web 安全颜色。这样我就知道我的网页在任何地方都看起来不错。你可以在网上找到 Web 安全调色板，但我想拥有自己的副本以方便参考。你也可以使用 Bash 中的 for 循环创建一个。Bash for 循环Bash 中的 for 循环 的语法如下所示：for 变量 in 集合 ; do 语句 ; done 例如，假设你想打印从 1 到 3 的所有数字。你可以快速在 Bash 命令行上编写一个 for 循环来为你完成这项工作：$ for n in 1 2 3 ; do echo $n ; done 1 2 3 分号是标准的 Bash 语句分隔符。它们允许你在一行中编写多个命令。如果你要在 Bash 脚本文件中包含这个 for 循环，你可以用换行符替换分号并像这样写出 for 循环：for n in 1 2 3 do echo $n done 我喜欢将 do 和 for 放在同一行，这样我更容易阅读：for n in 1 2 3 ; do echo $n done 一次多个 for 循环你可以将一个循环放在另一个循环中。这可以帮助你迭代多个变量，一次做不止一件事。假设你想打印出字母 A、B 和 C 与数字 1、2 和 3 的所有组合。你可以在 Bash 中使用两个 for 循环来实现，如下所示：#!/bin/bash for number in 1 2 3 ; do for letter in A B C ; do echo $letter$number done done 如果将这些行放在名为 for.bash 的 Bash 脚本文件中并运行它，你会看到九行显示了所有字母与每个数字配对的组合：$ bash for.bash A1 B1 C1 A2 B2 C2 A3 B3 C3 遍历 Web 安全颜色Web 安全颜色是从十六进制颜色 #000（黑色，即红色、绿色和蓝色值均为零）到 #fff（白色，即红色、绿色和蓝色均为最高），每个十六进制值的步进为 0、3、6、9、c 和 f。你可以在 Bash 中使用三个 for 循环生成 Web 安全颜色的所有组合的列表，其中循环遍历红色、绿色和蓝色值。#!/bin/bash for r in 0 3 6 9 c f ; do for g in 0 3 6 9 c f ; do for b in 0 3 6 9 c f ; do echo "#$r$g$b" done done done 如果将其保存在名为 websafe.bash 的新 Bash 脚本中并运行它，你就会看到所有 Web 安全颜色的十六进制值的迭代：$ bash websafe.bash | head #000 #003 #006 #009 #00c #00f #030 #033 #036 #039 要制作可用作 Web 安全颜色参考的 HTML 页面，你需要使每个条目成为一个单独的 HTML 元素。将每种颜色放在一个 元素中，并将背景设置为 Web 安全颜色。为了使十六进制值更易于阅读，将其放在单独的 元素中。将 Bash 脚本更新为如下：#!/bin/bash for r in 0 3 6 9 c f ; do for g in 0 3 6 9 c f ; do for b in 0 3 6 9 c f ; do echo " #$r$g$b " done done done 当你运行新的 Bash 脚本并将结果保存到 HTML 文件时，你可以在浏览器中查看所有 Web 安全颜色的输出：$ bash websafe.bash > websafe.html 这个网页不是很好看。深色背景上的黑色文字无法阅读。我喜欢应用一些 HTML 样式来确保十六进制值在颜色矩形内以黑色背景上的白色文本显示。为了使页面看起来非常漂亮，我还使用 HTML 网格样式来排列每行六个框，每个框之间留出一些空间。要添加这种额外的样式，你需要在 for 循环前后包含其他 HTML 元素。顶部的 HTML 代码定义样式，底部的 HTML 代码关闭所有打开的 HTML 标签：#!/bin/bash cat<<EOF Web-safe colors EOF for r in 0 3 6 9 c f ; do for g in 0 3 6 9 c f ; do for b in 0 3 6 9 c f ; do echo " #$r$g$b " done done done cat<<EOF EOF 这个完成的 Bash 脚本以 HTML 格式生成 Web 安全颜色指南。每当你需要引用网络安全颜色时，运行脚本并将结果保存到 HTML 页面。现在你可以在浏览器中看到 Web 安全颜色的演示，作为你下一个 Web 项目的简单参考：$ bash websafe.bash > websafe.html （题图：MJ/abf9daf2-b72f-4929-8dd8-b77fb5b9d39b）via: https://opensource.com/article/23/4/web-safe-color-guide-bash作者：Jim Hall 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
如果你和我一样，在 20 世纪七八十年代使用计算机长大，你可能学过一种常见的个人计算机编程语言，名为 BASIC（全称是 “ 初学者的通用符号指令代码 Beginner's All-purpose Symbolic Instruction Code ”）。那个时期，包括 TRS-80、Apple II 和 IBM PC 在内的每台个人计算机都可以找到 BASIC 实现。当时，我是一个自学的 BASIC 程序员，在尝试了 Apple II 上的 AppleSoft BASIC 后，转向 IBM PC 上的 GW-BASIC，后来在 DOS 上学习了 QuickBASIC。我通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 FOR 循环，以将数字列表从 1 加到 10。但是曾经，一种在科学编程领域受欢迎的语言是 FORTRAN（即 “ 公式翻译 FORmula TRANslation ”）。尽管在 1990 年对该语言进行的规范以后，该名称更常见的风格是 “Fortran”。当我在 1990 年代初作为大学本科物理学生学习物理学时，我利用自己在 BASIC 上的经验学习了 FORTRAN 77。那时我意识到 BASIC 许多概念都来源于 FORTRAN。当然，FORTRAN 和 BASIC 在很多其他方面也存在差异，但我发现了解一点 BASIC 可以帮助我快速学习 FORTRAN 编程。我想通过使用两种语言编写相同的程序，展示它们之间的一些相似之处。通过编写一个示例程序来探索 BASIC 和 FORTRAN 77 中的 FOR 循环，这个程序将把 1 到 10 之间的数字相加。Bywater BASICBASIC 存在许多种不同的版本，这取决于你的计算机，但该语言总体保持不变。我喜欢的一种 BASIC 版本是 Bywater BASIC，这是一种开源的 BASIC 实现，适用于包括 Linux 和 DOS 在内的不同平台。要在 FreeDOS 上使用 Bywater BASIC，你必须首先从 FreeDOS 1.3 Bonus CD 中 安装该软件包。然后进入 C: 目录并输入 bwbasic 命令，这将启动 BASIC 解释器。你可以在这个提示符下输入程序：bwBASIC: Bywater BASIC 使用较早的 BASIC 编程标准，需要你在每个程序指令上编写一个行号。将行号视为索引。你可以使用行号轻松地引用程序中的任何指令。当你将程序键入 Bywater BASIC 解释器时，请在每个指令前添加行号：bwBASIC: 10 print "Add the numbers from 1 to 10 ..." bwBASIC: 20 sum = 0 bwBASIC: 30 for i = 1 to 10 bwBASIC: 40 sum = sum + i bwBASIC: 50 next i bwBASIC: 60 print sum bwBASIC: 70 end 可以使用 list 命令查看你已经输入到解释器中的程序：bwBASIC: list 10 print "Add the numbers from 1 to 10 ..." 20 sum = 0 30 for i = 1 to 10 40 sum = sum + i 50 next i 60 print sum 70 end 这个简短的程序演示了 BASIC 中的 FOR 循环。 FOR 是任何编程语言中最基本的循环构造，允许你迭代一组值。在 Bywater BASIC 中，FOR 循环的一般语法看起来像这样：FOR 变量 = 起始值 TO 终止值 在这个示例程序中，指令 for i = 1 to 10 开始一个循环，迭代值为 1 到 10。在每个循环中，变量 i 被设置为新值。在 BASIC 中，所有到 next 指令前的指令都将作为 FOR 循环的一部分执行。因为你可以将一个 FOR 循环放入另一个 FOR 循环中，Bywater BASIC 使用语法 NEXT 变量 来指定要迭代的循环变量。在提示符下键入 run 来执行程序：bwBASIC: run Add the numbers from 1 to 10 ... 55 Bywater BASIC 被称为 BASIC 解释器，因为只能从 Bywater BASIC 环境中运行程序。这意味着解释器会处理与操作系统的交互的所有繁重工作，因此你的程序不需要自己完成这个工作。 这样做的代价是，程序在解释环境中运行会比它作为编译程序运行慢一些。FreeBASIC另一个流行的 BASIC 实现是 FreeBASIC，这是一个开源的 BASIC 编译器，适用于多个平台，包括 Linux 和 DOS。要使用 FreeBASIC，你需要从 FreeDOS 1.3 Bonus CD 安装 FreeBASIC 包，然后进入 C: 目录，你会在这里找到 FreeBASIC 程序。FreeBASIC 是一个编译器，因此你首先需要创建一个包含程序指令的源文件，然后使用源代码运行编译器以创建一个可运行的程序。我编写了一个类似于“将 1 到 10 的数字相加”的程序版本，将其保存为 BASIC 文件，并命名为 sum.bas：dim sum as integer dim i as integer print "Add the numbers from 1 to 10 ..." sum = 0 for i = 1 to 10 sum = sum + i next print sum end 如果你将这段代码与 Bywater BASIC 版本的程序进行比较，你可能会注意到 FreeBASIC 不需要行号。FreeBASIC 实现了一种更现代的 BASIC 版本，使得编写程序时不需要跟踪行号更容易。另一个主要的区别是你必须在源代码中定义或声明变量。使用 DIM 指令在 FreeBASIC 中声明变量，例如 dim sum as integer，以定义一个名为 sum 的整数变量。现在可以在命令行上使用 fbc 编译 BASIC 程序：C:\DEVEL\FBC> fbc sum.bas 如果你的代码没有任何错误，编译器将生成一个可以运行的程序。例如，我的程序现在称为 sum。运行我的程序将从 1 加到 10：C:\DEVEL\FBC> sum Add the numbers from 1 to 10 ... 55 FORTRAN 77FORTRAN 编程语言类似于旧式和现代 BASIC 之间的混合体。FORTRAN 比 BASIC 更早出现，而 BASIC 显然从 FORTRAN 中汲取灵感，就像后来的 FORTRAN 版本从 BASIC 中获得启示一样。你可以将 FORTRAN 程序以源代码的形式写成文件，但并不需要在每个地方使用行号。但是，FORTRAN 77 在某些指令中使用行号（称为标签），包括 FOR 循环。在 FORTRAN 77 中，FOR 实际上被称为 DO 循环，它执行相同的功能并具有几乎相同的用法。在 FORTRAN 77 中，DO 循环的语法如下：DO 行号 变量 = 起始值, 终止值 这种情况是需要行号来指示 DO 循环结束位置的一种情况。你在 BASIC 中使用了 NEXT 指令，但 FORTRAN 需要一个行标签。通常，该行是一个 CONTINUE 指令。查看这个示例 FORTRAN 程序，了解如何使用 DO 循环来循环一组数字。我将此源文件保存为 sum.f：PROGRAM MAIN INTEGER SUM,I PRINT *, 'ADD THE NUMBERS FROM 1 TO 10 ...' SUM = 0 DO 10 I = 1, 10 SUM = SUM + I 10 CONTINUE PRINT *, SUM END 在 FORTRAN 中，每个程序都需要以 PROGRAM 指令开始，并指定程序名称。你可能会将此程序命名为 SUM，但随后在程序中不能使用变量 SUM。当我学习 FORTRAN 时，我从 C 编程中借鉴了一些东西，并以 PROGRAM MAIN 开始了我的所有 FORTRAN 程序，做法类似于 C 程序中的 main() 函数，因为我不太可能使用名为 MAIN 的变量。FORTRAN 中的 DO 循环类似于 BASIC 中的 FOR 循环。它迭代从 1 到 10 的值。变量 I 在每次循环中获取新值。这样可以将 1 到 10 的每个数字相加，并在完成时打印总和。你可以在每个平台上找到适合的 FORTRAN 编译器，包括 Linux 和 DOS。FreeDOS 1.3 的 Bonus CD 中包括 OpenWatcom FORTRAN 编译器。在 Linux 上，你可能需要安装一个包来安装 GNU Fortran 支持（在 GNU 编译器集合（GCC）中）。在 Fedora Linux 上，你可以使用以下命令添加 GNU Fortran 支持：$ sudo dnf install gcc-gfortran 然后你可以使用以下命令编译 sum.f 并运行程序：$ gfortran -o sum sum.f $ ./sum ADD THE NUMBERS FROM 1 TO 10 ... 55 一点不同之处我发现 FORTRAN 和 BASIC 非常相似，但也存在一些不同之处。这些语言的核心是不同的，但如果你了解一些 BASIC，你可以学习 FORTRAN，同样，如果你了解一些 FORTRAN，你也可以学习 BASIC。如果你想探索这两种语言，有几点需要注意：FORTRAN 77 使用全大写，但后来的 FORTRAN 版本允许大小写混用，只要对变量、函数和子程序使用相同的大小写。大多数 BASIC 实现都不区分大小写，这意味着你可以自由地混合大小写字母。有许多不同版本的 BASIC，但它们通常做同样的事情。如果你学会了一种 BASIC 实现方式，很容易学会另一种。注意 BASIC 解释器或编译器的警告或错误信息，查阅手册了解差异。某些 BASIC 实现需要使用行号，例如 Bywater BASIC 和 GW-BASIC。更现代的 BASIC 版本允许你编写不使用行号的程序。FreeBASIC 需要使用 -lang 废弃选项编译带有行号的程序。（题图：MJ/dba28597-dd62-4ffe-bb4a-e38874a65239）via: https://opensource.com/article/23/4/basic-vs-fortran-77作者：Jim Hall 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用一个简单的计数程序比较古老的 C 语言和现代的 Go 语言。Go 是一种现代编程语言，它很大程度上源自于 C 编程语言。因此，对于写 C 程序的程序员来说，Go 应该会感觉很熟悉。Go 让编写新程序变得容易，同时让 C 程序员感觉熟悉，但避免了 C 编程语言的许多常见陷阱。本文比较了一个简单的 C 和 Go 程序，该程序将数字从一相加到十。由于这个程序只使用了小的数值，所以结果不会变得太大，因此只使用了普通的整数变量。像这样的循环在编程中非常常见，所以这个简单的程序很容易比较 C 和 Go。如何在 C 中执行循环C 语言中最基本的循环是 for 循环，它允许你对一组值进行迭代。for 循环的基本语法是：for (起始条件 ; 结束条件 ; 每次迭代后执行的操作) { 循环内要执行的内容 ; } 你可以编写一个 for 循环，以打印从 1 到 10 的数字，将起始条件设置为 count = 1，将结束条件设置为 count <= 10。这样就以 count 变量等于 1 时开始循环。结束条件意味着只要 count 变量小于或等于 10 ，循环就会继续。每次迭代之后，你使用 count = count + 1 将 count 变量的值增加 1。在循环内部，你可以使用 printf 打印 count 变量的值：for (count = 1; count <= 10; count = count + 1) { printf("%d\n", count); } C 程序中常见的惯例是 ++，它表示 “将某个值加一”。如果你写 count++，那就相当于 count = count + 1。大多数 C 程序员会使用 count++ 来编写 for 循环中每次迭代后要执行的操作，像这样：for (count = 1; count <= 10; count++) { printf("%d\n", count); } 这是一个示例程序，将从 1 到 10 的数字相加，然后打印结果。使用 for 循环对数字进行迭代，但不要打印数字，而是将数字添加到 sum 变量中：#include <stdio.h> int main() { int sum; int count; puts("adding 1 to 10 .."); sum = 0; for (count = 1; count <= 10; count++) { sum = sum + count; } 这个程序使用了两个不同的 C 函数来向用户打印结果。puts 函数打印引号中的字符串。如果你需要打印纯文本，使用 puts 是个不错的选择。printf 函数 使用特殊字符在格式字符串中打印格式化的输出。printf 函数可以打印许多不同种类的值。关键字 %d 打印十进制（整数）值。如果你编译并运行这个程序，你会看到这个输出：adding 1 to 10 .. The sum is 55 如何在 Go 中执行循环Go 提供了与 C 中非常相似的 for 循环。C 程序中的 for 循环可以直接转换为 Go 的 for 循环，并具有相似的表示形式：for count = 1; count <= 10; count++ { fmt.Printf("%d\n", count) } 使用这个循环，你可以直接转换为 Go 的示例程序：package main import "fmt" func main() { var sum, count int fmt.Println("adding 1 to 10 ..") for count = 1; count <= 10; count++ { sum = sum + count } fmt.Printf("The sum is %d\n", sum) } 虽然上述方式在 Go 中是正确的，但它并不是最常用的 Go 写法。采用惯例是“使用与本地语言为人所知的表达方式”。任何语言的目标都是高效的沟通，编程语言也不例外。在不同的编程语言之间进行转换时，重要的是意识到尽管物似而意不同，一种编程语言中的典型写法在另一种编程语言中可能不完全相同。为使用更符合惯例的 Go，你可以进行几个小修改：通过使用 += 操作符来将 sum = sum + count 更简洁地表达为 sum += count。通过使用 分配并推断类型运算符 来表达 count := 1 而不是 var count int 跟着 count = 1。:= 语法同时定义并初始化 count 变量。将 count 的声明移到 for 循环的头中。这减少了一些认知负担，也通过减少程序员在任何时候都必须心里记着的变量数目来提高可读性。这个更改还通过在最接近其使用的地方和最小的范围中声明变量来增加安全性，从而减少了在代码不断演进的过程中对变量进行意外操作的可能性。上述改动的组合将产生以下代码：package main import "fmt" func main() { fmt.Println("adding 1 to 10 ..") var sum int for count := 1; count <= 10; count++ { sum += count } fmt.Printf("The sum is %d\n", sum) } 你可以使用这个 Go.dev 的 链接 在 Go 试验场中尝试这个示例程序。C 和 Go 相似但不同通过在两种编程语言中编写相同的程序，你可以看到 C 和 Go 这两种语言虽然相似但仍然不同。将从 C 转换到 Go 时需要注意以下几点：在 C 中，每个程序指令都必须以分号结尾。这告诉编译器一个语句在哪里结束，下一个在哪里开始。在 Go 中，分号是有效的，但几乎总是可以推断出来。虽然大多数现代 C 编译器会为你将变量初始化为零值，但 C 语言规范指出，变量得到的是内存中的任意值。Go 值总是初始化为其零值。这有助于使 Go 成为一种更具内存安全的语言。这种差异在使用指针时变得更加有趣。注意 Go 程序包对导入标识符的使用方式。例如，fmt 是一个实现格式化输入和输出的函数，类似于 C 中的 stdio.h 中的 printf 和 scanf。fmt 程序包在 pkg.go.dev/fmt 中有文档描述。在 Go 中，main 函数总是以退出代码 0 返回。如果你希望返回其他值，你必须调用 os.Exit(n)，其中 n 通常为 1 以表示错误。这可以从任何地方调用，不仅仅是 main 函数，来终止程序。你可以在 C 中使用在 stdlib.h 中定义的 exit(n) 函数来实现相同的效果。（题图：MJ/8f731484-2dc3-4bac-b895-cbc92a63b48b）via: https://opensource.com/article/23/4/c-vs-go-programming-languages作者：Jim Hall 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
GNOME Linux 桌面环境的最新版本现已推出。了解 GNOME 44 中新的和改进的蓝牙、用户界面、应用程序和其他功能。我在家使用的 Linux PC 上采用 GNOME 作为我主要的桌面环境。GNOME 提供了方便易用的图形化桌面，不仅具备我所需的灵活性，而且在我专注工作时不会妨碍我的操作。最近 GNOME 发布了 GNOME 44，引入了许多新功能。我联系了 GNOME 团队，咨询了最新版本的新特性和改进。以下是品牌经理 Caroline Henriksen、GNOME 开发者和发布团队成员 Matthias Clasen，以及设计团队成员 Allan Day 分享的信息。GNOME 的新特性Jim Hall： 在 GNOME 44 中，有哪些令你们最为兴奋的新功能和更新的功能？GNOME 团队： 我们非常期待全新的、现代化的用户界面设计，这不仅体现在核心应用如 “ 文件 Files ”应用（文件管理器，即 Nautilus），还包括 “ 设置 Settings ” 应用，在上一个开发循环中我们对其中的很多面板做了大量改进。如果你有机会，欢迎试用全新的 “ 鼠标和触控板 Mouse & Touchpad ” 设置面板，享受其中的动态插图。GNOME 44 中有很多让人惊喜的功能。比如，文件选择器中全新的网格视图一定会让很多人感到惊喜，同时你也可以通过快速设置中的全新蓝牙菜单轻松地连接设备。Jim：发布说明提到了 GNOME Circle，同时增加了几个新应用程序。请问 GNOME Circle 是什么？团队：GNOME Circle 是一组优秀的应用程序，它们使用了 GNOME 平台。GNOME Circle 是 GNOME 推广使用我们技术的最佳应用程序，并支持应用程序开发人员的一个项目。为了被纳入 GNOME Circle，一个应用程序必须满足一组要求。一旦满足要求，开发人员就可以获得额外的公众宣传、GNOME 基金会会员资格，以及访问其他基础设施和旅行赞助支持。有关详细信息和如何申请，请参阅 GNOME Circle 页面。我们非常高兴看到 GNOME Circle 取得了巨大的成功。目前，它已经包含了超过 50 个应用程序！我特别喜欢其中不是所有的应用程序都与计算机有关，你可以找到健康跟踪器、节拍器或象棋钟等应用程序。Jim：GNOME 是几个 Linux 发行版的标准桌面环境。我们可以在哪里看到 GNOME 44？团队：已经发布的 Fedora 38 版本包含 GNOME 44。Ubuntu 23.04 也包含 GNOME 44。而且，GNOME 44 构建已经在一些主要的发行版中出现，例如 openSUSE 的 Tumbleweed 和 MicroOS 等。GNOME 社区Jim： GNOME 44 的发布名称是 Kuala Lumpur，请问这个名字的来源是什么？团队： GNOME 每年都有两个重要的大型会议，GUADEC 是在年中举办的（下一届会议将于 2023 年 7 月在拉脱维亚举行），GNOME Asia 则在年末举行。我们非常感谢马来西亚的本地团队在 吉隆坡 Kuala Lumpur 为我们举办 2022 年的 GNOME Asia 活动。组织这些活动需要 GNOME 的工作人员和当地团队投入大量的精力和承诺。作为对他们的感激之意，我们会将 GNOME 的发布版本以最近大会的地点命名。这个命名方案是几年前引入的。GNOME 3.18 的发布名称 哥德堡 Gothenburg 就是第一个采用这种方式命名的版本。Jim： GNOME 拥有一个充满活力的用户社区，有很多积极的成员。那么，GNOME 是如何保持社区的积极参与的呢？团队： GNOME 一直以来都是一个以社区为驱动的项目，具有强烈的协作和包容性。这也是成为 GNOME 贡献者和用户的回报之一。成为 GNOME 社区的一员，意味着你可以与来自全世界的人进行互动，共同实现目标并交流想法。这是一种丰富而鼓舞人心的体验，这也是我们的社区保持热情和积极性的原因之一。我们提高社区参与度的一个重要手段是，尽可能地满足社区用户的需求，使我们的活动对世界各地的人来说更易于参加。例如，我们的旗舰会议 GUADEC 去年在墨西哥的 瓜达拉哈拉 Guadalajara 举行，这是自欧洲以外的地方举办的第一个 GUADEC 会议，这有助于增加拉丁美洲的 GNOME 用户和贡献者的参与度。此外，我们还努力不仅在我们自己的会议和活动中，而且在其他活动如 Linux Application Summit、FOSDEM 或 SCaLE 中与我们的社区成员见面。如果你在这些活动中看到 GNOME 的展台，请过来打个招呼。通常你会发现，开发人员、设计师、基金会工作人员以及理事会成员都很乐意聊天和回答问题。如何参与 GNOMEJim： 如何开始编写自己的 GNOME 应用程序呢？如果我想学习如何编写我的第一个 GNOME “Hello World” 应用程序，有没有可以供我参考的教程？团队： 开始为 GNOME 开发应用程序 网站包括一系列教程，其中包括快速创建你的第一个应用程序的指南。随着 Flatpak 和 GNOME Builder 等新技术的出现，如今创建自己的应用程序变得非常容易。打开 Builder，单击 “ 新项目 new project ”，填写一些细节，就可以拥有自己的运行中的 GNOME 应用程序。确实如此简单。Jim： 参与者可以通过哪些方式做出贡献呢？团队： 如果有人对 GNOME 产生了兴趣，并有动力参与其中，那么他们可以做很多事情来帮助我们。如果你是初学者，参与我们 Discourse 实例上的讨论或报告问题是一个很好的开始。还有很多非技术性工作需要完成，比如帮助我们的文档、将 GNOME 翻译成不同的语言，甚至帮助组织我们的年度会议。许多这些活动都有友好的团队进行协作，他们会帮助你入门。或者，如果你有编码经验，你可以浏览我们的 “新手”任务，寻找你感兴趣的任务。另一个贡献的方式是通过对 GNOME 的 捐赠。作为一个开源项目和非营利基金会，定期的捐赠可以帮助我们继续建设 GNOME，提供必要的基础设施，以及支持新的倡议。（题图：MJ/addea707-a20a-4469-9131-cf958b942e7b）via: https://opensource.com/article/23/4/linux-gnome-44-features作者：Jim Hall 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 FreeDOS 上使用 C 语言编程与在 Linux 上使用 C 语言编程非常类似。当我第一次开始使用 DOS 时，我喜欢 DOS 自带的 BASIC 来编写游戏和其它一些有趣的程序。很长时间后，我才学习 C 编程语言。我马上爱上了使用 C 语言做开发！它是一种简单易懂的编程语言，在编写有用的程序时，这给予我很大的灵活性。实际上，很多 FreeDOS 的核心实用程序都是使用 C 语言和汇编语言编写的。因此，FreeDOS 的 1.3 RC4 包含一个 C 语言可能并不出人意料，此外还有其它编程语言的编译器。FreeDOS 的 1.3 RC4 LiveCD 包含两个 C 编译器：Bruce's C 编译器（一个简单的 C 编译器）和 OpenWatcom C 编译器 。在 Bonus CD 上，你也可以找到 DJGPP（一款基于 GNU 的 GCC 的 32 位 C 编译器）和 GCC 的 IA-16 移植（需要 386 或更好的 CPU 来编译，但是，生成的程序可以在低端系统上运行）。在 FreeDOS 上使用 C 语言编程与在 Linux 上使用 C 语言编程非常类似，但是有两个例外：你需要知道你使用了多少内存。 Linux 允许程序使用很多内存，但是 FreeDOS 有很多限制。DOS 程序只使用四种 内存模式（大、中、紧凑和小）中的其中一种，具体取决于它们需要多少内存。你可以直接访问控制台终端。 在 Linux 上，你可以创建 文本模式 的程序，使用一个诸如 ncurses 之类的库来绘制终端屏幕。但是，DOS 允许程序访问控制台终端和视频硬件。这为编写更有趣的程序提供了极大的灵活性。我喜欢在 GCC 的 IA-16 移植或 OpenWatcom 中编写我的 C 程序，具体取决于我正在编写的是哪种程序。OpenWatcom C 编译器更容易安装，因为它只是个单一的软件包。这就是为什么我们在 FreeDOS 的 LiveCD 中提供 OpenWatcom 的原因, 在你安装 FreeDOS 的 1.3 RC4 时，如果你选择 “ 完全的安装（包括安装应用程序和游戏） Full installation including applications and games ”，那么你也自动地安装 OpenWatcom。如果你选择安装 “ 纯 DOS 系统 Plain DOS system ”，那么，你将需要使用 FDIMPLES 软件包管理器来安装 OpenWatcom C 编译器。在 FreeDOS 1.3 RC4 上安装 OpenWatcom在 DOS 上使用 C 语言编程你可以在 OpenWatcom 项目网站 找到文档和库指南，以学习 OpenWatcom C 编译器所提供的独特的关于 DOS 的 C 语言编程库。简单描述几个最有用的函数:来自 conio.h 头文件：int getch(void)：从键盘上获取一个按下的单个按键int getche(void)：从键盘上获取一个按下的单个按键，并回显该按键来自 graph.h 头文件：_settextcolor(short color)：设置打印文本时的颜色_setbkcolor(short color)：设置打印文本时的背景颜色_settextposition(short y, short x)：移动光标到行 y 和 列 x_outtext(char _FAR *string)：从当前光标位置开始，直接将一串字符打印到屏幕DOS 只支持 16 种文本颜色 和 8 种背景颜色。你可以使用值 0（黑色）到 15（亮白色）来具体指定文本颜色，以及使用值 0（黑色）到 7（白色）来具体指定背景颜色:0：黑色1：蓝色2：绿色3：品蓝色4：红色5：品红色6：棕色7：白色8：亮黑色9：亮蓝色10：亮绿色11：亮品蓝色12：亮红色13：亮品红色14：黄色15：亮白色一个花哨的 “Hello world” 程序很多新开发者学习编写的第一个程序是为用户打印 “Hello world” 。我们可以使用 DOS 的 conio 和 graphics 库来制作一个更有趣的程序，并使用彩虹般的颜色打印 “Hello world” 。在这个实例中，我们将遍历每种文本颜色，从 0（黑色）到 15（亮白色）。随着我们打印每一行，我们都将为下一行缩进一个空格。在我们完成后，我们将等待用户按下任意按键，然后，我们将重置屏幕并退出。你可以使用任何文本编辑器来编写你的 C 源文件代码。我喜欢使用一些与众不同的编辑器，如 FreeDOS Edit 和 Freemacs，但是，我最近一直在使用 FED editor ，因为它提供 语法高亮 功能，使其很容易在我的程序源文件代码中看到关键字、字符串（LCCT 译注：C 语言中没有字符串）、变量。使用 C 语言编写一个简单的测试程序在你使用 OpenWatcom 编译前，你将需要设置 DOS 的 环境变量，以便 OpenWatcom 可以找到它的支持文件。OpenWatcom C 编译器软件包中包含了一个为你做这件事的设置 批处理文件：\DEVEL\OW\OWSETENV.BAT。运行这个批处理文件可以自动为你的 OpenWatcom 设置环境变量。在你的开发环境准备好后，你可以使用 OpenWatcom 编译器来编译这个 “Hello world” 程序。我已经将我的 C 源文件文件保存为 TEST.C ，因此，我可以输入 WCL TEST.C 来编译和连接该程序为一个名称为 TEST.EXE 的 DOS 可执行文件。在 OpenWatcom 的输出信息中，你将看到 WCL 实际上调用 OpenWatcom C 编译器（WCC）来编译，并调用 OpenWatcom 链接器（WLINK）来执行 对象/目标 object 链接阶段：使用 OpenWatcom 编译测试文件OpenWatcom 会打印一些无关的输出信息，这可能会使发现错误和警告变得困难。为了告诉编译器来抑制这些大量的额外信息，请在编译时使用 /Q（“Quiet”）选项： option to make OpenWatcom print less output")在编译 C 源文件文件时，如果你没有看到任何错误信息，那么你现在就可以运行你的 DOS 程序了。这个 “Hello World” 示例的程序名称是 TEST.EXE 。在 DOS 命令行中输入 TEST 来运行新的程序，你应该会看到这个非常漂亮的输出:C 语言是一种非常高效的编程语言，在像 DOS 之类的资源有限的系统上进行编程也可以很好的工作。在 DOS 上，你可以使用 C 语言来做更多的事。如果你是 C 语言的初学者，那么，你可以跟随我们在 FreeDOS 网站上的 《使用 C 语言编写 FreeDOS 程序》 的自学电子书，以及在 FreeDOS YouTube 频道 上的配套的 入门指南 how-to 系列视频，来自主学习 C 语言。（题图：MJ:Legacy sci-fi computer programming::1.7 celestial::1 edison bulb::1 satellite imagery::1 wooden::1 in high resolution, very detailed, 8k）via: https://opensource.com/article/21/6/program-c-freedos作者：Jim Hall 选题：lujun9972 译者：robsean 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
使用 CSS 让你的 HTML 项目更具风格。当你编写文档时，无论是为开源项目还是技术写作项目，你都应该有两个目标：文档应该写得好，同时要易于阅读。前者通过清晰的写作技巧和技术编辑来解决。第二个目标可以通过对 HTML 文档进行一些简单的更改来解决。超文本标记语言（HTML）是互联网的支柱。自 1994 年“万维网”问世以来，所有网络浏览器都使用 HTML 来显示文档和网站。几乎与此同时，HTML 一直支持样式表，它是对 HTML 文档的一种特殊添加，用于定义文本在屏幕上的呈现方式。单纯用 HTML 编写项目文档也是可以的。然而，纯 HTML 样式可能感觉有点简陋。因此，尝试向 HTML 文档添加一些简单的样式，为文档添加一点活力，并使文档更清晰、更易于阅读。定义一个 HTML 文档让我们从一个纯 HTML 文档开始，探索如何向其添加样式。一个空的 HTML 文档在顶部包含 定义，后面跟着一个 块来定义文档本身。 在 元素中，你还需要加上一个文档标头，其中包含有关文档的元数据，例如标题。文档正文的内容放在父 块内的 块中。你可以使用以下 HTML 代码定义一个空白页面： 这是一个新文档 在另一篇关于 用 HTML 编写项目文档 的文章中，我将一个开源棋盘游戏的自述文件从纯文本更新为 HTML 文档，并使用一些基本的 HTML 标记，如 和 作为标题和副标题， 用于段落， 和 用于粗体和斜体文本。让我们从那篇文章结束的地方继续讲： 简易 Senet 简易 Senet 游戏玩法 游戏会自动为你“投掷”投掷棒，并在屏幕右下角显示结果。 如果“投掷”结果为零，你失去本轮机会。 轮到你的时候，游戏会自动选择 你在棋盘上的第一块棋子。 你不一定 能够用这个棋子走棋，所以选择你的棋子 移动，然后按 Space（或 Enter）移动 它。 你可以通过几种不同的方法进行选择： 向上/向下/向左/向右 to 朝特定方块移动。 加号 (+) 或减号 (-) 使棋子在棋盘上向“左”或向“右”移动。 请注意，它们会自动遵循棋盘的“倒过来的 S”方向移动。 Tab在棋盘上选择下一个你想要移动的棋子。 要随时退出游戏，请按 Q（大写 Q）或按 Esc，这样游戏会提示你是否想要 放弃比赛。 如果你比对手更快将所有棋子移出棋盘，你就赢得了比赛。 这同时需要运气和游戏策略！ 此 HTML 文档演示了利用 HTML 的技术写作者经常使用的一些块和内联元素。块元素在围绕文本定义一个矩形。段落和标题就是块元素，因为它们从文档的左边缘延伸到右边缘。例如， 在段落周围包含一个不可见的矩形。相比之下，内联元素的使用则紧跟在它们包围的文本。如果你在段落中的某些文本上使用 ，则只有被 和 包围的文本会变为粗体。你可以将直接样式应用于此文档以更改字体、颜色和其他文本样式，但修改文档外观的更有效方法是将样式表应用于文档本身。你可以在 元素中使用其他元数据执行此操作。你可以为样式表引用文件，但在这个例子中，我使用 ... 定义样式由于你刚刚开始学习样式表，因此这里先演示一种基本样式：背景色。我喜欢从背景颜色开始，因为它有助于演示块和内联元素。让我们应用一个有点华丽的样式表，为所有 段落设置浅蓝色背景颜色，为 无序列表设置浅绿色背景。对任何粗体文本使用黄色背景，对任何斜体文本使用粉红色背景。你可以在 HTML 文档的 请注意，每个样式都以分号结尾。如果在网页浏览器中查看此 HTML 文档，你可以看到 和 块元素如何填充为矩形，而 和 内联元素仅突出显示粗体和斜体文本。 这种对比色的使用可能看起来不太好看，但我想你可以清楚看到块和内联元素：应用样式你可以使用样式使这个自述文件更易于阅读。 因为你刚刚开始学习样式，还是先只用一些简单的样式元素：background-color 设置背景颜色color 设置文字颜色font-family 使用不同的文本字体margin-top 在元素上方添加空间margin-bottom 在元素下方添加空间text-align 改变文本的对齐方式，例如靠左、靠右或居中让我们重新开始你的样式表并将这些新样式应用到文档中。首先，在文档中使用更令人愉悦的字体。如果你的 HTML 文档没有指定字体，网络浏览器会为你选择一种。根据浏览器的设置方式，这可能是衬线字体（如我的屏幕截图中使用的字体）或无衬线字体。衬线字体在每个字母上添加了一个小笔画，这样在打印时更容易阅读。无衬线字体缺少这种额外的笔划，这使得文本在计算机显示器上显得更清晰。常见的衬线字体包括 Garamond 或 Times New Roman。 流行的无衬线字体包括 Roboto 和 Arial。例如，要将文档正文字体设置为 Roboto，你可以使用以下样式：body { font-family: Roboto; } 通过设置字体，你假设查看文档的人也安装了该字体。有些字体已经十分常见，以至于它们被认为是事实上的“网页安全”字体。 这些字体包括 Arial 等无衬线字体和 Times New Roman 等衬线字体。Roboto 是一种较新的字体，可能还无法随处可用。因此，网页设计师通常不会只列出一种字体，而是设置一种或多种“备用”字体。你可以通过用逗号分隔来添加这些替代字体。 例如，如果用户的系统上没有 Roboto 字体，你可以使用以下样式定义将 Arial 字体用作文本正文：body { font-family: Roboto, Arial; } 所有网络浏览器都定义了默认的衬线和无衬线字体，你可以使用这些名称来引用它们。用户可以更改他们喜欢用于显示衬线和无衬线的字体，因此不太可能对每个人都一样，但在字体列表中使用 serif 或 sans-serif 通常是个好主意。通过添加该字体，至少用户可以大致了解你希望 HTML 文档的呈现方式：body { font-family: Roboto, Arial, sans-serif; } 如果字体名称不止一个单词，则你必须在其两边加上引号。HTML 允许你在此处使用单引号或双引号。 为标题和副标题定义一些衬线字体，包括 Times New Roman：h1 { font-family: "Times New Roman", Garamond, serif; } h2 { font-family: "Times New Roman", Garamond, serif; } 请注意，H1 标题和 H2 副标题使用完全相同的字体定义。如果你想避免无谓的打字，可以使用样式表快捷方式为 H1 和 22 使用相同的样式定义：h1, h2 { font-family: "Times New Roman", Garamond, serif; } 在编写文档时，许多技术作者更喜欢将主标题放在页面的中央。你可以在块元素（例如 H1 标题）上使用 text-align 来使标题居中：h1 { text-align: center; } 为了让粗体和斜体文本更突出，请将它们置于稍微不同的颜色中。对于某些文档，我可能会使用深蓝表示粗体文本，使用深绿表示斜体文本。这些颜色非常接近黑色，但颜色的细微差别足以吸引读者的注意力。b { color: darkblue; } i { color: darkgreen; } 最后，我更喜欢在我的列表元素周围添加额外的间距，以使它们更易于阅读。如果每个列表项只有几个词，额外的空间可能无关紧要。但是我的示例文本中的中间项很长，可以换到第二行。 额外的空间有助于读者更清楚地看到此列表中的每个项目。 你可以使用边距样式在块元素上方和下方添加空间：li { margin-top: 10px; margin-bottom: 10px; } 这种样式定义了一个距离，此处我将其指定为每个列表元素上方和下方的 10px（十个像素）。 你可以使用多种不同的距离度量。十像素实际上就是屏幕上十个像素的空间，无论是台式机显示器、笔记本电脑显示屏，还是手机或平板电脑屏幕。假设你真的只是想在列表元素之间添加一个额外的空行，你也可以使用 em 来测量。em 是一个旧的排版术语，如果你指的是左右间距，它就是大写 M 的宽度，或者对于垂直间距，就是大写 M 的高度。所以你可以改用 1em 来写边距样式：li { margin-top: 1em; margin-bottom: 1em; } HTML 文档中的完整样式列表如下所示： 简易 Senet 简易 Senet 游戏玩法 游戏会自动为你“投掷”投掷棒，并在屏幕右下角显示结果。 如果“投掷”结果为零，你失去本轮机会。 轮到你的时候，游戏会自动选择 你在棋盘上的第一块棋子。 你不一定 能够用这个棋子走棋。所以选择你的棋子 移动，然后按 Space（或 Enter）移动 它。 你可以通过几种不同的方法进行选择： 向上/向下/向左/向右 to 朝特定方块移动。 加号 (+) 或减号 (-) 使棋子在棋盘上向“左”或向“右”移动。 请注意，它们会自动遵循棋盘的“倒过来的 S”方向移动。 Tab在棋盘上选择下一个你想要移动的棋子。 要随时退出游戏，请按 Q（大写 Q）或按 Esc，这样游戏会提示你是否想要 放弃比赛。 如果你比对手更快将所有棋子移出棋盘，你就赢得了比赛。 这同时需要运气和游戏策略！ 在网页浏览器上查看时，你会看到采用无衬线字体的自述文件，标题和副标题使用衬线字体。 页面标题居中。粗体和斜体文本使用略有不同的颜色来吸引读者的注意力而不会分散注意力。 最后，列表项周围有额外的空间，使每个项目更易于阅读。这是在技术写作中使用样式的简单介绍。掌握了基础知识后，你可能会对 Mozilla 的 HTML 指南 感兴趣。它包括一些很棒的初学者教程，因此你可以学习如何创建自己的网页。有关 CSS 样式的更多信息，我推荐 Mozilla 的 CSS 指南。（题图： MJ:web internet traffic design）via: https://opensource.com/article/22/8/css-html-project-documentation作者：Jim Hall 选题：lkxed 译者：XiaotingHuang22 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用你的树莓派制作一个接近完美的圆。世界各地将 3 月 14 日定为圆周率日。许多人通过在房子周围找到的物体测量圆周率来庆祝圆周率日。我想用我的树莓派 3B 为今年的圆周率日做一些类似的事情。继续阅读以了解我如何使用我的树莓派测量圆周率。你需要什么：树莓派单板机方格纸带毫米和厘米测量值的标尺笔1、画一个圆圆周率是圆的周长与其直径的比值。要计算圆周率，我们需要测量一个完美绘制的圆的周长和直径。幸运的是，树莓派主板上的安装孔足够大，可以使用铅笔或钢笔。我通过一个树莓派板安装孔插入了一根图钉，小心地将针放在一张方格纸上两条线的交点上。握住别针，我将一支笔插入对面的安装孔中，并通过将笔绕着别针移动来画一个圆圈。树莓派主板底面的焊点会卡在纸上，但小心点还是可以画好圆圈的。2、把圆分成段通过画一条穿过圆心的垂直线将圆分成两半，通过画一条穿过圆心的水平线将圆再次分成四分之一。当我画圆的时候，我把图钉正好放在图画纸上两条线的交点上，这样就很容易找到垂直和水平的中心线。你可以通过在对角线上画一条线来创造一个 “八分” 片。进一步的划分是与尺子的练习。我用尺子找到“四分之一楔形”和“八分之一楔形”任意两个交点的中点，做成一个 1/16 的楔形。你可以使用相同的方法制作越来越小的 1/32 和 1/64 圆的切片。通过非常小心，我还能够在圆的 1/128 处测量出一个非常窄的楔形：3、估算周长我最小的楔形是一个圆的 1/128。如此小的切片，楔形的外弧非常小，我们可以用一条直线来近似它。这实际上不是圆周长的 1/128，但它足够接近，我们可以将其用作一个很好的估计。使用我的尺子上的毫米测量值，我测量了我的 1/128 楔形的外弧为 3.8 毫米。这样，我可以估计圆的周长为 3.8 毫米乘以 128，即 486.4 毫米。要转换为厘米，除以十：48.64cm。4、计算圆周率圆周率的值是圆的周长与其直径的比值。我们在步骤 3 中估算了周长。测量直径是使用尺子测量圆周的简单练习。我的圆是 15.4cm。现在我们知道了周长和直径，我们可以将圆周率计算为 48.64 除以 15.4，即 3.158。这与 pi 的实际值 3.141 相差不远。测量圆周率是一项有趣的数学练习！各个年龄段的数学爱好者都可以使用方格纸、笔和尺子等简单工具自行测量圆周率。以一种有趣的新方式使用你的树莓派来绘制圆并独立测量圆周率。这是一个估计值，因为我们将圆上的 1/128 弧近似为一条直线，但这使我们无需太多努力就足够接近了。（LCTT 校注：这真是对树莓派的“合理”应用，摔！）（题图：MJ: Circumference in high resolution, very detailed）via: https://opensource.com/article/23/3/measure-pi-raspberry-pi作者：Jim Hall 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出