Seth Kenlon 发布的文章

为角色扮演游戏的所有元素找到一个开源工具。

 title=

我玩过很多桌面角色扮演游戏(RPG),无论是从频率还是种类来说。一般来说,我更喜欢和朋友一起玩 RPG,但在过去的 2 年里,我一直在玩网络游戏。(LCTT 校注:这里的 RPG 游戏指的是那种“传统”的面对面的桌面游戏,而非很多人最初接触的 RPG 电子游戏。)

起初,我不确定如何在线长期的进行游戏。我知道有很多的工具可以实现,但直到我发现在线桌面游戏的开源世界之前,这些工具没有一个引起我的兴趣。通过一小部分开源应用程序,我已经能够在开源平台上进行我的所有游戏。

这也是一年中的好时机,因为最近是 免费 RPG 日(LCTT 校注:今年的这个节日在 7 月 23 日举办)。在免费 RPG 日,桌面角色扮演游戏行业的发行商们会免费发放游戏,鼓励玩家尝试新游戏和新冒险。尽管它在 2020 年被取消了,但今年它又作为现场活动回归,并通过 Dungeon Crawl ClassicsPaizo 的免费 RPG 示例下载提供了一些虚拟支持。

如果这个活动提供的虚拟产品还不够,我还整理了一份 你可能尚未尝试过的 5 个开源桌面 RPG 游戏列表

当你准备好开始玩游戏时,请尝试其中一些开源工具,看看它们能在多大程度上增强你的游戏体验。

聊天

在线 RPG 游戏最基本的(从技术上讲,也是唯一的)要求是交流。这是游戏的媒介:玩家需要一种说话的途径。

有几个不错的选择。我发现 Mumble 是对带宽需求最低的工具。这是一个纯语音聊天应用程序,可以使用非常高效的 Opus 编解码器让每个人一次交谈数小时而不会中断。

 title=

它在世界各地都运行有公共实例,所以下载 Mumble 客户端后,你可以加入其中任何一个开放的实例,并使用它来在线运行游戏。有一个“按下通话”设置,你可以用此来消除背景噪音,当你的其他家庭成员在进行其它工作而不想被你的桌面会话打扰时,这个功能将会非常实用。

还有一个文本聊天客户端。我的游戏组通常使用它来发布与游戏相关的链接,但你也可以将其用于其它无关内容的交谈,而让口头游戏保持在主题上。

如果你的玩家更喜欢看到面部表情,或者只是习惯于视频聊天网页应用。那么 Jitsi 是面对面围坐在桌子旁聚会的绝佳替代品。Jitsi 和你曾经使用过的其它视频聊天软件几乎一样,甚至更简单。你可以设置一个“房间”,邀请朋友,将陌生人拒之门外,并玩上几个小时。静音和关闭摄像都很直观,界面很吸引人,并且还定期开发和推出了新功能。

 title=

Mumble 和 Jitsi 都有适用于台式机和移动设备的客户端,因此任何人都可以在任何设备上使用。

角色表

我发布了我的 数字角色表 解决方案,但任何 RPG 玩家都知道管理角色不仅仅是统计数据。

在延续多个会话的在线游戏中,我发现每次游戏之间有很长的停止时间。我突然想到,虽然我发现要求我的玩家在现场纸笔游戏中计算损耗是不合理的,但当一切都是数字化时,要求他们跟踪损耗很容易。

网上有很多可用的电子表格,但开源的选择是 Ethercalc。由于其实例遍布世界各地,因此很容易找到免费的 Ethercalc 主机。或者,你可以使用 Podman 或者 Docker 轻松安装和运行你自己的实例。

 title=

Etherclac 提供了一些基本要素:一个共享的账本,这样玩家就可以跟踪他们的团队所携带的物品(以及在任何给定的时间持有该物品的人)、每件物品的重量和价值。当队伍在游戏过程中收集到战利品时,就会输入该物品,所以他们知道什么自己何时会因为负担过重而无法拿起新物品。

在不同的游戏会话之间,可以引用和整理这份共享的电子表格,以便玩家(PC)知道哪些物品可以卖掉,哪些物品可以放入储物袋,哪些物品可以在下一次会话发现更好的战利品时安全的丢弃。

地图

Mythic Table 是一款开源的桌面游戏共享地图系统。这意味着你可以加载图片作为游戏地图,并在地图上移动数字标记以表示玩家角色所在的位置。

自从 上次我介绍了关于 Mythic Table 以来,它已经在 Kickstarter 上成功地进行了一次众筹,以确保它的持续发展。它还增加了一些新功能,其中最引人注目的是“战争迷雾”功能,它允许地下城主掩盖地图并仅显示玩家探索过的部分。

 title=

在过去的几个月里,我一直在 Mythic Table 上运行两款游戏,这是一款优秀且直观的地图系统。它还提供了一个数字骰子筒,所以如果你的玩家没有骰子,或者你更喜欢在公开场合掷骰子,你就可以用它作为共享的骰子池。

你可以在 mythictable.com 上试用 Mythic Table,或者访问他们在 Github 上的代码库。

开源的开放游戏

我使用的开源工具是通用的,因此它们适用于你想玩的任何游戏系统。因为它们都是开源的,所以无论你的玩家使用什么操作系统,他们都可以在线使用,并且它们都可以自托管。

如果你既是程序员又是游戏玩家,请访问他们的 Git 代码仓库,看看是否有任何你可以贡献的东西。如果你是游戏玩家或者游戏管理员,在下次坐在数字版的游戏桌前请尝试使用一下这些工具。你可能会惊讶于你只需要很少的在线账户就可以使用一些可用于游戏的最佳应用程序。

(文内图片来自:Seth Kenlon,CC-BY-SA 4.0)


via: https://opensource.com/article/21/10/open-source-rpgs

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

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

了解一下自由软件基金会(FSF)。

早在 1985 年,自由软件基金会(FSF)就开始提倡源代码共享的理念,并从此打响了为计算机用户和开发者捍卫权利的斗争。FSF 认为,用“ 开放 Open ”和“ 封闭 Closed ”这两个词来划分软件,十分具有局限性;于是,在为程序分类时,转而使用了以下词语:尊重自由(这个“ 自由 free ”或这个“ 自由 Libre ”)或践踏自由(“ 非自由 non-free ”或“ 专有 proprietary ”)。不管用语如何,关键之处在于,计算机必须受用户控制,而不是任由开发了计算机软件的公司来摆布。正因如此,GNU 工程、Linux 内核、Freedesktop.org 等众多自由软件项目,才会如此重要。

最近,FSF 新上任了一位执行董事,她叫 Zoë Kooyman。我初见 Zoë 时,是在 2019 年的一个 All Things Open 大会上。当然,那个时候她还不是 FSF 的执行董事,不过已经在管理 FSF 不断增长的重大活动了 —— 包括 LibrePlant。她之前递给我了一份自由软件作者的名单,名单长得一眼望不尽,而且那些软件都是我每天在用的。由此,我也很受她那充沛的精力和诚恳的态度所打动。我只是偶然参加了一次 FSF 的聚会,但最后却和那些人成了朋友。是他们让我的数字生活有了意义,是他们保障了我能够拥有 Zoë 和 FSF 所说的 四项基本自由

  • 无论用户出于何种目的,用户必须可以按照自己的意愿,自由地运行该软件(自由之零)。
  • 用户可以自由地学习并修改该软件,使它按照你的意愿进行计算(自由之一)。作为前提,用户必须可以得到该软件的源代码。
  • 用户可以自由地分发该软件的副本,这样就可以帮助别人(自由之二)。
  • 用户可以自由地分发该软件修改后的副本(自由之三)。借此,用户可以把改进后的软件分享给整个社区,令他人也从中受益。作为前提,用户必须可以得到该软件的源代码。

听说了 Zoë 受任为执行董事后,我给她发了一封邮件,提出想和她进行一次采访。她十分热心,在百忙之中抽出了一点时间来和我畅谈。

Seth Kenlon:你当上 FSF 的执行董事了!你是怎么走到今天的呢?

Zoë Kooyman: 在我的工作生涯中,我最开始是一位活动组织者。我环游世界,举办着一些世界上最大的音乐节目。在不断变更的地点、各具特色的文化中工作,是十分有趣的,因为不管是演出、技艺还是别的现场元素,所有各异的制作元素都结合在一起了。让一切事物都在恰当时候安排到位,就像是耍杂技一样。很多时候,我都是在不同的国家生活和工作。多亏了我的工作,我才能学到这么多的组织和交流的技巧。我也对不同形式的媒体有过研究和工作,了解它们的体验,以及它们与社会的关系。

大学时期,我第一次了解到了“ 左版 copyleft ”(LCTT 译注:与 版权 copyright 相对。是一种分享软件的思想和方法;简而言之,其目的是保障一款软件对其每一位接收者来说都是自由的),它是关于我们如何才能使用现有的结构来造福自己,并推动变革的。也正是在那时,媒体(以及互联网和软件)的格局开始迅速变化,而这种变化却是以自由为代价的。搬到美国后,我的生活变了许多。在美国,我对社会责任问题有了更加强烈的紧迫感,因此我决定为此付诸行动。我很感激 John Sullivan(时任 FSF 执行董事),他根据我对自由软件的了解以及我在活动组织方面的经验聘任了我,由此我也得以把这两方面的能力结合到一起。

Seth:你是如何了解到自由软件的?

Zoë: 我们常常会觉得,自由软件主要影响的是懂技术的人。但是,自由软件运动的目的是捍卫每一位计算机用户的自由。其实,软件自由影响着边缘化社区(LCTT 译注:因条件受限或受到排斥等,落后于主流社会的发展,而被置于社会边缘的群体)的成员,他们很少有机会使用计算机。而软件也塑造了他们的生活。

GNU 工程和左版的概念所取得的成就是十分卓越的。去真正观察社会发展的方向,然后说:“不一定非得那样才行,我们可以把事情掌握在自己手中。”这在早期改变了我的人生观。我开始有了一种想法,把现有的材料用起来,再把它重新引入不同的亚文化之中。在娱乐行业,这已是家常便饭。从他人的作品中得到灵感,并基于此创造新的作品,其结果就是对我们所处时代的反映,同时也是对历史的致敬。没有这般自由,也不会有真正的进步。

谈谈我对电影版权的看法吧。我曾经与荷兰电影研究所合作,做了一个由许多“孤立的电影片段”组合而成的混剪。然后,在一次有几千名年轻人参加的大型舞蹈活动中,那个混剪就在一个 170 米的全景屏幕上播放了,而且还有现场 DJ 在配合演奏。他们之后也经常在别的活动中播放它,比如说荷兰的 博物馆之夜 Museumnacht

我并不懂技术,于是我通过文化来表达了这些观点。但这些年来,我越来越多地接触到了自由软件的思想。我于是意识到,随着软件不断融入我们的生活(有时还是身体),为自由软件而战的重要性正日益凸显。在当今的世界,专有软件处于称霸地位,我们社会的发展呈现出以利益驱动、为少数人着想的趋势,而这种趋势是以多数人的自由为代价的。如果没有自由软件,生活中的许多方面、社会的许多重要事业,就不可能真正取得成功。

Seth: 你是什么时候加入 FSF 的?

Zoë: 在 2019 年初,LibrePlanet 最后一期现场版的前一周(LCTT 译注:LibrePlant 之后因为疫情而改成了线上活动)。

Seth: 是什么吸引了你去担任执行董事这一职位?

Zoë: FSF 只是一个致力于让社会更加公平、更加协作、更加理解软件的组织,但它长期以来一直是这场运动的核心。社会正在迅速变化,而许多人却还没准备好如何应对当今社会的数字产物,例如软件。这是一项十分重要的工作,但是去做这项工作的人还是太少了。能有一个组织来应对未来的各种挑战,这是十分重要的。

执行董事这一职位,在某种程度上,不过是辅助工作人员和社区的角色,好让他们为自由软件作出关键的改变。我相信,我们继续传播自由软件的思想,是非常重要的;并且,有了 FSF 的团队协助,我也相信,我能利用好工作在不同文化和人群中的经验,以及组织高挑战性的全球项目的经验,来使我们发挥出最大的潜能。我的这项决定,得到了来自工作人员、管理层和社区和董事会的支持,由此我相信,这个决定是正确的。

Seth: 你认为当今的软件自由,面临的最大的挑战是什么?FSF 在应对这些挑战的时候,应该承担怎样的使命?

Zoë: 随着软件越来越多地融入了社会的基本结构,软件也更加无形了。如今,软件的存在是如此的广泛,我们却习惯性地忽视它。我们只关注着程序的功能,却无视了实现这种功能的手段,更别说它尊不尊重你作为一位用户的自由了。而与此同时,软件又比以往任何时候都更快的扩散。如果人们无法理解程序是如何构成的,而只是整天地用着这些程序,那我们该怎么向他们解释,他们正遭受着不公呢?

FSF 的职责就是,让每个人重新谈起用户自由,并提醒人们,我们所使用的工具并没有那么好。因此,教育行业和政府的认可是十分重要的。如果我们让人们关注软件自由在这些领域的问题,那我们必将取得成效。通过教育,我们可以确保后代也有选择自由的权利;而政府采用自由软件,可以保护公民免遭专有软件的不正影响(维护数字主权)。

我们可以告诉人们,当今社会给我们灌输了错误的观点:你的自由受到侵犯是正常的,毕竟事情“太复杂,你理解不了”。如果你想要图个便利,想要相互联系,或者就是想要满足你的需求,那你就得相信这些组织,按照他们的意愿来。这是不对的。我们整个社区都相信,我们能构建一个无需抛弃自由也能处在其中的社会。并且我们也有这样的法律框架来支持我们的观点。每天,不同背景、不同能力的人都加入我们的对话,越来越多的人关心自己的自由,并且每个人都是出于真心的。我们每天都在学习如何去保护自己以及他人,并且我也希望,未来能够更加自由。


via: https://opensource.com/article/22/7/meet-fsf-executive-director-zoe-kooyman

作者:Seth Kenlon 选题:lkxed 译者:Peaksol 校对:wxy

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

基于 Fedora 的系统上的 mktemp 命令和基于 Debian 的系统上的 tempfile 是专门为减轻这种负担而设计的,它使创建、使用和删除独特的文件变得容易。

使用 Bash 脚本语言进行编程时,有时需要创建一个临时文件。例如,你可能需要一个可以提交到磁盘的中间文件,以便你可以使用另一个命令对其进行处理。创建诸如 temp 之类的文件或任何以 .tmp 结尾的文件很容易。但是,这些名称很可能是由其他进程生成的,因此你可能会不小心覆盖现有的临时文件。除此之外,你不应该花费脑力想出看起来独特的名字。基于 Fedora 的系统上的 mktemp 命令和基于 Debian 的系统上的 tempfile 是专门为减轻这种负担而设计的,它使创建、使用和删除独特的文件变得容易。

创建一个临时文件

mktemptempfile 都创建一个临时文件作为它们的默认操作,并打印文件的名称和位置作为输出:

$ tempfile
/tmp/fileR5dt6r

$ mktemp 
/tmp/tmp.ojEfvMaJEp

除非你指定不同的路径,否则系统会将临时文件放在 /tmp 目录中。

对于 mktemp,可以使用 -p 选项指定路径:

$ mktemp -p ~/Demo
/home/tux/Demo/tmp.i8NuhzbEJN

对于 tempfile,可以使用 --directory-d 选项:

$ tempfile --directory ~/Demo/
/home/sek/Demo/fileIhg9aX

找到你的临时文件

使用自动生成的临时文件的问题是你无法知道它的名字是什么。这就是为什么两个命令都返回生成的文件名作为输出的原因。你可以使用 Konsole、GNOME 终端或 rxvt 等交互式 shell 来使用终端上显示的文件名与文件进行交互。

但是,如果你正在编写脚本,则无法通过读取文件名并在以下命令中使用它来进行干预。

mktemptempfile 的作者想到了这个问题,并且有一个简单的解决方法。终端将输出发送到名为“标准输出”的流。你可以通过将变量设置为在子 shell 中启动的命令的结果来捕获标准输出:

$ TMPFILE=$(mktemp -p ~/Demo)

$ echo $TMPFILE
/home/tux/Demo/tmp.PjP3g6lCq1

引用文件时使用 $TMPFILE,它与直接与文件本身交互相同。

使用 mktemp 创建一个临时目录

你还可以使用 mktemp 命令创建目录而不是文件:

$ mktemp --directory -p ~/Demo/
/home/tux/Demo/tmp.68ukbuluqI

$ file /home/tux/Demo/tmp.68ukbuluqI
/home/tux/Demo/tmp.68ukbuluqI: directory

自定义临时名称

有时你甚至可能希望在伪随机生成的文件名中加入可预测性元素。你可以使用这两个命令自定义临时文件的名称。

使用 mktemp,你可以为文件名添加后缀:

$ mktemp -p ~/Demo/ --suffix .mine
/home/tux/Demo/tmp.dufLYfwJLO.mine

使用 tempfile,你可以设置前缀和后缀:

$ tempfile --directory ~/Demo/ --prefix tt_ --suffix .mine
/home/tux/Demo/tt_0dfu5q.mine

把 tempfile 作为 touch 使用

你还可以使用 tempfile 设置自定义名称:

$ tempfile --name not_random
not_random

当你使用 --name 选项时,它是绝对的,忽略所有其他形式的自定义。事实上,它甚至忽略了 --directory 选项:

$ tempfile --directory ~/Demo --prefix this_is_ --suffix .all --name not_random_at
not_random_at

在某种程度上,tempfile 可以替代 touchtest,因为它拒绝创建已经存在的文件:

$ tempfile --name example.txt
open: file exists

tempfile 命令并非默认安装在所有 Linux 发行版上,因此在将其用作脚本中的 test 的 hack 之前,你必须确保它存在。

安装 mktemp 和 tempfile

GNU Core Utils 包括 mktemp 命令。主要发行版默认包括 Core Utils(它是包含 chmodcutdu 和其他基本命令的同一个软件包)。

Debian Utils 软件包包含 tempfile 命令,默认安装在大多数基于 Debian 的发行版和 Slackware Linux 上。

总结

临时文件很方便,因为不会混淆它们是否可以安全删除。它们是临时的,意在根据需要使用并毫不犹豫地丢弃。在需要时使用它们,并在完成后清除它们。


via: https://opensource.com/article/22/6/make-temporary-file-bash

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

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

了解由我们生活中的所有连接设备组成的网络。

 title=

在早期,计算机既笨重又昂贵,计算机用户很少,他们必须在计算机上的预留时间内亲自来处理他们的 打孔卡 punchcard 。被称为 大型机 Mainframe 的系统进行了许多创新,并在 终端机 terminal (没有自己的 CPU 的桌面计算机)上实现了 分时 time-shared 任务。

时至今日,强大的计算设备能做到 价格低至 35 美元,且大小不超过一张信用卡。这甚至还没有涵盖现代生活中负责收集和处理数据的所有小设备。从高层次的角度来看这些计算机的集合,你可以想象得到,所有这些设备多得像云中的水滴一样。

碰巧“ 云计算 cloud computing ”一词已经被占用,因此需要为由物联网(IoT)和其他具有战略意义的服务器组成的网络提供一个独特的名称。此外,如果已经有一个代表数据中心节点的云,那么在云之外与我们交融的这些节点肯定有其独特之处。

欢迎来到雾计算

云通过互联网提供计算服务。构成云的数据中心很大,但与潜在客户的数量相比相对较少。这表明当数据在云及其众多用户之间来回传送时存在潜在的瓶颈。

相比之下, 雾计算 Fog Computing 可以在数量上超过其潜在客户,而不会出现瓶颈,因为设备执行大部分数据的收集或计算。它是云的外部“边缘”,是云落地的部分。

雾和边缘计算

雾计算和 边缘计算 edge computing 本质上是同义词。两者都与云和物联网密切相关,并做出相同的架构假设:

  • 你离 CPU 越近,数据传输就越快。
  • Linux 一样,小型专用计算机,可以“做一件事并把它做好”,这是一个强大的优势(当然,我们的设备实际上不仅仅做一件事,但从高层次上看,你购买的用于监测健康的智能手表本质上是在做“一”件事)。
  • 离线是不可避免的,但好的设备可以在此期间同样有效地运行,然后在重新连接时同步。
  • 本地设备能比大型数据中心更简单、更便宜。

边缘网络

将雾计算视为与云完全分离的实体很诱人,但它们毕竟是组成一个整体的两个部分。云需要数字企业的基础设施,包括公共云提供商、电信公司,甚至是运行自己服务的专业公司。本地化服务也很重要,可以在云核心与其数以百万计的客户之间提供 中转站 waystations

雾计算位于云的边缘,无论客户身在何处,都与他们紧密联系在一起。有时这是一个消费环境,例如你自己的家或汽车,而另一些时候这是一种商业利益,例如零售店中的价格监控设备或工厂车间的重要的安全传感器。

雾计算就在你身边

雾计算由我们生活中的所有连接设备组成: 无人机 drone 、电话、手表、健身监视器、安全监视器、家庭自动化、便携式游戏设备、园艺自动化、天气传感器、空气质量监视器等等。理想情况下,它提供的数据有助于建立一个更好、更明智的未来。有许多伟大的开源项目正朝着改善健康的方向而努力 —— 甚至只是让生活变得更有趣一点儿 —— 这一切都得益于雾和云计算。无论如何,我们的 工作是确保它 保持开放


via: https://opensource.com/article/21/5/fog-computing

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

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

学习这个 Python 教程,轻松提取网页的有关信息。

浏览网页可能占了你一天中的大部分时间。然而,你总是需要手动浏览,这很讨厌,不是吗?你必须打开浏览器,然后访问一个网站,单击按钮,移动鼠标……相当费时费力。如果能够通过代码与互联网交互,岂不是更好吗?

在 Python 的 requests 模块的帮助下,你可以使用 Python 从互联网中获取数据:

import requests

DATA = "https://opensource.com/article/22/5/document-source-code-doxygen-linux"
PAGE = requests.get(DATA)

print(PAGE.text)

在以上代码示例中,你首先导入了 requests 模块。接着,你创建了两个变量:其中一个叫做 DATA,它用来保存你要下载的 URL。在之后的代码中,你将能够在每次运行应用程序时提供不同的 URL。不过,就目前而言,最简单的方法是“硬编码”一个测试 URL,以达到演示目的。

另一个变量是 PAGE。代码读取了存储在 DATA 中的 URL,然后把它作为参数传入 requests.get 函数,最后用变量 PAGE 来接收函数的返回值。requests 模块及其 .get 函数的功能是:“读取”一个互联网地址(一个 URL)、访问互联网,并下载位于该地址的任何内容。

当然,其中涉及到很多步骤。幸运的是,你不必自己弄清楚,这也正是 Python 模块存在的原因。最后,你告诉 Python 打印 requests.get 存储在 PAGE 变量的 .text 字段中的所有内容。

Beautiful Soup

如果你运行上面的示例代码,你会得到示例 URL 的所有内容,并且,它们会不加选择地输出到你的终端里。这是因为在代码中,你对 requests 收集到的数据所做的唯一事情,就是打印它。然而,解析文本才是更加有趣的。

Python 可以通过其最基本的功能来“读取”文本,但解析文本允许你搜索模式、特定单词、HTML 标签等。你可以自己解析 requests 返回的文本,不过,使用专门的模块会容易得多。针对 HTML 和 XML 文本,我们有 Beautiful Soup 库。

下面这段代码完成了同样的事情,只不过,它使用了 Beautiful Soup 来解析下载的文本。因为 Beautiful Soup 可以识别 HTML 元素,所以你可以使用它的一些内置功能,让输出对人眼更友好。

例如,在程序的末尾,你可以使用 Beautiful Soup 的 .prettify 函数来处理文本(使其更美观),而不是直接打印原始文本:

from bs4 import BeautifulSoup
import requests

PAGE = requests.get("https://opensource.com/article/22/5/document-source-code-doxygen-linux")
SOUP = BeautifulSoup(PAGE.text, 'html.parser')

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # do a thing here
    print(SOUP.prettify())

通过以上代码,我们确保了每个打开的 HTML 标签都输出在单独的一行,并带有适当的缩进,以帮助说明标签的继承关系。实际上,Beautiful Soup 能够通过更多方式来理解 HTML 标签,而不仅仅是将它打印出来。

你可以选择打印某个特定标签,而不是打印整个页面。例如,尝试将打印的选择器从 print(SOUP.prettify()) 更改为:

print(SOUP.p)

这只会打印一个 <p> 标签。具体来说,它只打印遇到的第一个 <p> 标签。要打印所有的 <p> 标签,你需要使用一个循环。

循环

使用 Beautiful Soup 的 find_all 函数,你可以创建一个 for 循环,从而遍历 SOUP 变量中包含的整个网页。除了 <p> 标签之外,你可能也会对其他标签感兴趣,因此最好将其构建为自定义函数,由 Python 中的 def 关键字(意思是 “定义” define )指定。

def loopit():
    for TAG in SOUP.find_all('p'):
        print(TAG)

你可以随意更改临时变量 TAG 的名字,例如 ITEMi 或任何你喜欢的。每次循环运行时,TAG 中都会包含 find_all 函数的搜索结果。在此代码中,它搜索的是 <p> 标签。

函数不会自动执行,除非你显式地调用它。你可以在代码的末尾调用这个函数:

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # do a thing here
    loopit()

运行代码以查看所有的 <p> 标签和它们的内容。

只获取内容

你可以通过指定只需要 “ 字符串 string ”(它是 “ 单词 words ” 的编程术语)来排除打印标签。

def loopit():
    for TAG in SOUP.find_all('p'):
        print(TAG.string)

当然,一旦你有了网页的文本,你就可以用标准的 Python 字符串库进一步解析它。例如,你可以使用 lensplit 函数获得单词个数:

def loopit():
    for TAG in SOUP.find_all('p'):
        if TAG.string is not None:
            print(len(TAG.string.split()))

这将打印每个段落元素中的字符串个数,省略那些没有任何字符串的段落。要获得字符串总数,你需要用到变量和一些基本数学知识:

def loopit():
    NUM = 0
    for TAG in SOUP.find_all('p'):
        if TAG.string is not None:
            NUM = NUM + len(TAG.string.split())
    print("Grand total is ", NUM)

Python 作业

你可以使用 Beautiful Soup 和 Python 提取更多信息。以下是有关如何改进你的应用程序的一些想法:

  • 接受输入,这样你就可以在启动应用程序时,指定要下载和分析的 URL。
  • 统计页面上图片(<img> 标签)的数量。
  • 统计另一个标签中的图片(<img> 标签)的数量(例如,仅出现在 <main> div 中的图片,或仅出现在 </p> 标签之后的图片)。

via: https://opensource.com/article/22/6/analyze-web-pages-python-requests-beautiful-soup

作者:Seth Kenlon 选题:lkxed 译者:lkxed 校对:wxy

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

如果你准备放下爆米花,想从各个角度体验游戏的话,那么就在 Linux 下打开游戏吧!

 title=

如今,人们有更多喜欢 Linux 的理由。在这个系列里,我将分享 21 个使用 Linux 的理由。今天,我将从游戏开始。

我过去认为“游戏玩家”是一种非常特殊的生物,要由科学家们在数年的研究和测试之后严谨地认定才行。我从来没有把自己归类为游戏玩家,因为我所玩过的游戏要么是桌面游戏(棋盘类游戏和纸笔角色扮演游戏),要么是 NetHack、俄罗斯方块。现在,在移动设备、游戏机、电脑和电视机上都有游戏,我觉得现在的承认有各种形式的游戏玩家们了。如果你想自称为游戏玩家,你就可以是,不需任何资格认定。你不用必须在心里熟记那些“上上下下左右左右BA”的科乐美秘籍(你甚至可以不知道这是什么);你也不用必须买过和玩过 3A 级游戏。如果你时不时地玩游戏,你就完全可以自称为玩家。如果你想成为一名玩家,那么现在使用 Linux 正当其时。

欢迎来到游戏世界

剥除光鲜的广告,在其下面,你肯定会发现一个欣欣向荣的游戏世界。在人们相信不是电子表格也不是练习打字一类的软件能挣钱以前,新兴的游戏市场已经开始发展起来了。 独立游戏 indie game 已经在流行文化上以各种方式打上了自己的烙印(或许你不相信,《我的世界》尽管不是开源的,但一开始就是一款独立游戏),这也证实了,在玩家眼里,可玩性高于产品价值。

独立开发者和开源开发者之间有很多交集。没有什么比带着你的 Linux 笔记本电脑,浏览 itch.io 或你的发行版的软件库,寻找鲜为人知但珍贵的开源游戏宝藏更有意义了。

有各种各样的开源游戏,包括大量的第一视角射击游戏、Nodulus 之类的益智游戏、运输大亨之类的策略经营游戏、Jethook 之类的竞速游戏、Sauerbraten 之类的竞速逃生游戏,以及很多未提到的(多亏了像 Open Jam 这样伟大的活动,每年都有新增的游戏)。

Jethook game screenshot

总的来说,探索开源游戏的世界的体验,和购买大型游戏工作室的产品带来的即时满足感有很大的不同。大型游戏工作室生产的游戏提供大量的视听刺激、知名演员、和长达 60 小时以上的游戏时长。而独立和开源游戏不能与之相提并论。但是话又说回来,大型游戏工作室无法提供的是,当你发现一款别人未曾听说过的游戏时的产生的发现感和与个人相关的感受。当你意识到别人都非常想知道你刚玩过的哪个出色游戏时,大型工作室也并不能提供这种紧迫感。(LCTT 校注:此处大概的意思是指大型工作室的作品已被人熟知,没有什么挖掘的新鲜感)

花点时间找出你最喜欢的游戏,然后浏览下你的发行商的软件仓库、Flathub、开源的游戏仓库,看看你能发现什么,如果发现你很喜欢的游戏,就帮忙推广一下吧。

Proton 和 WINE

Linux 上的游戏并没有止步于开源,但是从开源开始的。数年前 Valve 软件公司通过发行 Linux 版的 Steam 客户端把 Linux 重新带入游戏市场时,人们希望这可以推动游戏工作室能编写原生的 Linux 游戏。一些工作室这样做了,但 Valve 公司并没有成功的把 Linux 推为主要的平台,即使是 Valve 品牌的游戏电脑。并且大多数游戏工作室又转回仅在 Windows 平台上开发游戏的旧方式。

有趣的是,最终的结果是产生了更多的开源代码。Valve 公司为 Linux 兼容创建了 Proton 工程,一个可以转换 Windows 游戏到 Linux 的兼容层。在 Proton 的内核层面,它使用了WINE(Wine Is Not an Emulator) —— 以开源的方式极好地重新实现了主要的 Windows 库。

游戏市场的成果,如今已经变成了开源世界的宝藏。今天,来自大型工作室的大多数游戏都可以在 Linux 上像原生游戏一样运行。

当然,如果你是必须要在发行日就玩上最新版游戏的这类玩家,你可能会遇到一些令人不愉快的“惊喜”。尽管那不是惊喜,很少有大型游戏在发行时毫无漏洞,一周后才补上补丁。这些游戏在 Proton 和 WINE 上运行时遇到这些错误可能更糟糕,因此 Linux 玩家通过避免尽早上车而避免这些问题。这种妥协可能是值得的。我玩过一些游戏,它们在 Proton 平台运行完美,后来从愤怒的论坛帖子中发现,它在最新版的 Windows 上运行显然充满了致命的错误。总之,似乎来自大型工作室的游戏并不完美,但你可能在 Linux 上遇到相似但不同的问题,正如你在 Windows 上遇到的。

Flatpak

Linux 近来历史上最令人激动的发展就是 Flatpak 了,它是本地容器和打包的结合,它和游戏无关(或者它和游戏息息相关),它使得 Linux 应用基本上能被分发到任意的 Linux 发行版上。这也适用于游戏,因为在游戏中使用了相当多的前沿技术,而对发行版维护者来说,要跟上任何特定游戏所需的所有最新版本可能是相当苛刻的。

Flapak 通过为应用程序库抽象出一种通用的 Flatpak 特定的层,而将其从发行版中抽象出来。Flatpak 软件包的发行者知道,如果一个库不在 Flatpak SDK 中,那么它必须要包含在 Flatpak 软件包中,简单而直接。

多亏了 Flatpak,Steam 客户端可以运行在像 Fedora 这样的常用发行版上,也可以运行在 RHEL、Slackware 等从传统角度看并不面向游戏市场的操作系统上。

Lutris

如果你并不急于在 Steam 上注册账号,那么可以用我比较偏爱的游戏客户端 Lutris 。表面上看,Lutris 是一个简单的游戏启动器,当你想玩游戏但还没决定玩什么的时候,你可以到这这里找找。有了 Lutris,你可以将系统上的所有游戏添加到你的游戏库,然后从 Lutris 界面启动并立即玩起来。更好的是,Lutris 贡献者(像我一样)会定期发布安装脚本,使你可以轻松安装自己的游戏。这并不是必须的,但它可以是一个很好的捷径,可以绕过一些繁琐的配置。

Lutris 也可以借助运行器或子系统,来运行那些不能从应用菜单直接启动的游戏。比如你想玩开源的《 魔兽塔防 Warcraft Tower Defense 》这样的游戏机游戏,你必须运行模拟器。如果你已经安装过模拟器的话,Lutris 可以帮你处理这一切。除此以外,如果你有一个 GOG.com 游戏账号,Lutris 可以访问它,并可以把游戏导入你的游戏库中。

没有比这更容易的管理你的游戏的方式了。

去玩游戏吧

Linux 游戏是一种充实且给人力量的体验。我过去避免玩电脑游戏,因为我不觉得我有太多的选择。似乎昂贵的游戏总是在不断发布,并且不可避免的获得好或者不好的极端体验,然后很快又转向下一个。另一方面,开源游戏把我引入了游戏的圈子。我见到过其他玩家和开发者。我见到过艺术家和音乐家、粉丝以及推广者。我玩过各种各样的我从来不知道的游戏。其中一些甚至不够我玩一下午,而其他的却让我长久的着迷于游戏、修改、关卡设计和乐趣。

如果你准备好放下爆米花,从各个角度体验下游戏的话,那就在 Linux 上开始游戏吧。


via: https://opensource.com/article/21/2/linux-gaming

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

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