2021年3月

以太坊矿工强烈反对变革,威胁发动 51% 攻击

以太坊创始人 Vitalik Buterin 强力推动的新提案 EIP-1559 被认为将让整个以太坊生态系统受益,但代价是大幅减少矿工们的收入,因此遭到了部分矿工们的强烈反对。而大型矿池由于有大量的 ETH 储蓄,因此可以从该提案对以太坊的改善中受益。

不满的以太坊矿工们组建了一个联盟威胁发动 51% 攻击。所谓 51% 攻击是指控制了整个网络 51% 以上算力之后可以对区块链网络进行重组,决定网络拒绝或接受哪个区块链版本。目前反对 EIP-1559 提议的矿工控制的算力已经远远超过了 51%。

为了应对 51% 攻击的威胁,以太坊创始人领导的社区准备快速的从工作量证明过渡到权益证明,以太坊面临严重分裂。

不管是不是矿工短视,但是这个危机可能是以太坊诞生以来最大的危机,因为以太坊还没有为权益证明做好准备。

比特币是过去 10 年中表现最好的资产

有人研究了顶级资产类别的表现,发现比特币的平均年化回报率为 230%,比排名第二的资产类别高出 10 倍以上。排名第二的是美国纳斯达克 100 指数,年化回报率 20%,其次是美国大盘股,即市值超过 100 亿美元的美国公司的股票,平均年化回报率为 14%。

数据显示,比特币在其历史上仅出现了两年的年度亏损,即在 2014 年和 2018 年分别下跌了 58% 和73%。而自 2011 年以来,黄金的年回报率仅为 1.5% ,过去 11 年中有 5 年出现了资产损失。今年以来黄金价格已经下跌了 8.5%。而今年以来 BTC 上涨了 108% ,3 月 14 日 BTC 触及 61,500 美元的历史新高。

这个事情吧,相信的人自然信,不信的也无须信。时间会证明一切。

SUSE 准备进行规模高达数十亿欧元的 IPO

拥有 520 亿欧元资产的瑞典私募股权投资公司 EQT 正准备将 Linux 发行版开发商 SUSE 再次分拆上市。据消息,SUSE IPO 的交易价值将达到 70 亿至 80 亿欧元。

此前,SUSE 多次易主。2004 年被 Novell 收购。接着,Attachmate 在微软的资助下,在 2010 年收购了 Novell 和 SUSE。随后在 2014 年,Micro Focus 收购了 Attachmate,SUSE 被分拆为一个独立的部门。最后,EQT 在 2019 年以 25 亿美元的价格从 Micro Focus 手中又收购了 SUSE。

若说哪个 Linux 发行版厂商最命运多舛,那就是 SUSE。不过随着开源和 Linux 持续变热,SUSE 也引来了命运转折点。祝福 SUSE!

在众多可用于简化 Node.js 开发的工具中,以下 9 种是最佳选择。

 title=

我最近在 StackOverflow 上读到了一项调查,该调查称超过 49% 的开发人员在其项目中使用了 Node.js。这结果对我来说并不意外。

作为一个狂热的技术使用者,我可以肯定地说 Node.js 的引入引领了软件开发的新时代。现在,它是软件开发最受欢迎的技术之一,仅次于JavaScript。

Node.js 是什么,为什么如此受欢迎?

Node.js 是一个跨平台的开源运行环境,用于在浏览器之外执行 JavaScript 代码。它也是建立在 Chrome 的 JavaScript 运行时之上的首选运行时环境,主要用于构建快速、可扩展和高效的网络应用程序。

我记得当时我们要花费几个小时来协调前端和后端开发人员,他们分别编写不同脚本。当 Node.js 出现后,所有这些都改变了。我相信,促使开发人员采用这项技术是因为它的双向效率。

使用 Node.js,你可以让你的代码同时运行在客户端和服务器端,从而加快了整个开发过程。Node.js 弥合了前端和后端开发之间的差距,并使开发过程更加高效。

Node.js 工具浪潮

对于 49% 的开发人员(包括我)来说,Node.js 处于在前端和后端开发的金字塔顶端。有大量的 Node.js 用例 帮助我和我的团队在截止日期之内交付复杂的项目。幸运的是,Node.js 的日益普及也产生了一系列开源项目和工具,以帮助开发人员使用该环境。

近来,对使用 Node.js 构建的项目的需求突然增加。有时,我发现管理这些项目,并同时保持交付高质量项目的步伐非常具有挑战性。因此,我决定使用为 Node.js 开发人员提供的许多开源工具中一些最高效的,使某些方面的开发自动化。

根据我在 Node.js 方面的丰富经验,我使用了许多的工具,这些工具对整个开发过程都非常有帮助:从简化编码过程,到监测再到内容管理。

为了帮助我的 Node.js 开发同道,我整理了这个列表,其中包括我最喜欢的 9 个简化 Node.js 开发的开源工具。

Webpack

Webpack 是一个容易使用的 JavaScript 模块捆绑程序 module bundler ,用于简化前端开发。它会检测具有依赖的模块,并将其转换为描述模块的静态 素材 asset

可以通过软件包管理器 npm 或 Yarn 安装该工具。

利用 npm 命令安装如下:

npm install --save-dev webpack

利用 Yarn 命令安装如下:

yarn add webpack --dev

Webpack 可以创建在运行时异步加载的单个捆绑包或多个素材链。不必单独加载。使用 Webpack 工具可以快速高效地打包这些素材并提供服务,从而改善用户整体体验,并减少开发人员在管理加载时间方面的困难。

Strapi

Strapi 是一个开源的 无界面 headless 内容管理系统(CMS)。无界面 CMS 是一种基础软件,可以管理内容而无需预先构建好的前端。它是一个使用 RESTful API 函数的只有后端的系统。

可以通过软件包管理器 Yarn 或 npx 安装 Strapi。

利用 Yarn 命令安装如下:

yarn create strapi-app my-project --quickstart

利用 npx 命令安装如下:

npx create-strapi-app my-project --quickstart

Strapi 的目标是在任何设备上以结构化的方式获取和交付内容。CMS 可以使你轻松管理应用程序的内容,并确保它们是动态的,可以在任何设备上访问。

它提供了许多功能,包括文件上传、内置的电子邮件系统、JSON Web Token(JWT)验证和自动生成文档。我发现它非常方便,因为它简化了整个 CMS,并为我提供了编辑、创建或删除所有类型内容的完全自主权。

另外,通过 Strapi 构建的内容结构非常灵活,因为你可以创建和重用内容组和可定制的 API。

Broccoli

Broccoli 是一个功能强大的构建工具,运行在 ES6 模块上。构建工具是一种软件,可让你将应用程序或网站中的所有各种素材(例如图像、CSS、JavaScript 等)组合成一种可分发的格式。Broccoli 将自己称为 “雄心勃勃的应用程序的素材管道”。

使用 Broccoli 你需要一个项目目录。有了项目目录后,可以使用以下命令通过 npm 安装 Broccoli:

npm install --save-dev broccoli
npm install --global broccoli-cli

你也可以使用 Yarn 进行安装。

当前版本的 Node.js 就是使用该工具的最佳版本,因为它提供了长期支持。它可以帮助你避免进行更新和重新安装过程中的麻烦。安装过程完成后,可以在 Brocfile.js 文件中包含构建规范。

在 Broccoli 中,抽象单位是“树”,该树将文件和子目录存储在特定子目录中。因此,在构建之前,你必须有一个具体的想法,你希望你的构建是什么样子的。

最好的是,Broccoli 带有用于开发的内置服务器,可让你将素材托管在本地 HTTP 服务器上。Broccoli 非常适合流线型重建,因为其简洁的架构和灵活的生态系统可提高重建和编译速度。Broccoli 可让你井井有条,以节省时间并在开发过程中最大限度地提高生产力。

Danger

Danger 是一个非常方便的开源工具,用于简化你的 拉取请求 pull request (PR)检查。正如 Danger 库描述所说,该工具可通过管理 PR 检查来帮助 “正规化” 你的代码审查系统。Danger 可以与你的 CI 集成在一起,帮助你加快审核过程。

将 Danger 与你的项目集成是一个简单的逐步过程:你只需要包括 Danger 模块,并为每个项目创建一个 Danger 文件。然而,创建一个 Danger 帐户(通过 GitHub 或 Bitbucket 很容易做到),并且为开源软件项目设置访问令牌更加方便。

可以通过 NPM 或 Yarn 安装 Danger。要使用 Yarn,请添加 danger -Dpackage.JSON 中。

将 Danger 添加到 CI 后,你可以:

  • 高亮显示重要的创建工件
  • 通过强制链接到 Trello 和 Jira 之类的工具来管理 sprint
  • 强制生成更新日志
  • 使用描述性标签
  • 以及更多

例如,你可以设计一个定义团队文化并为代码审查和 PR 检查设定特定规则的系统。根据 Danger 提供的元数据及其广泛的插件生态系统,可以解决常见的 议题 issue

Snyk

网络安全是开发人员的主要关注点。Snyk 是修复开源组件中漏洞的最著名工具之一。它最初是一个用于修复 Node.js 项目漏洞的项目,并且已经演变为可以检测并修复 Ruby、Java、Python 和 Scala 应用程序中的漏洞。Snyk 主要分四个阶段运行:

  • 查找漏洞依赖性
  • 修复特定漏洞
  • 通过 PR 检查预防安全风险
  • 持续监控应用程序

Snyk 可以集成在项目的任何阶段,包括编码、CI/CD 和报告。我发现这对于测试 Node.js 项目非常有帮助,可以测试或构建 npm 软件包时检查是否存在安全风险。你还可以在 GitHub 中为你的应用程序运行 PR 检查,以使你的项目更安全。Synx 还提供了一系列集成,可用于监控依赖关系并解决特定问题。

要在本地计算机上运行 Snyk,可以通过 NPM 安装它:

npm install -g snyk

Migrat

Migrat 是一款使用纯文本的数据迁移工具,非常易于使用。 它可在各种软件堆栈和进程中工作,从而使其更加实用。你可以使用简单的代码行安装 Migrat:

$ npm install -g migrat

Migrat 并不需要特别的数据库引擎。它支持多节点环境,因为迁移可以在一个全局节点上运行,也可以在每个服务器上运行一次。Migrat 之所以方便,是因为它便于向每个迁移传递上下文。

你可以定义每个迁移的用途(例如,数据库集、连接、日志接口等)。此外,为了避免随意迁移,即多个服务器在全局范围内进行迁移,Migrat 可以在进程运行时进行全局锁定,从而使其只能在全局范围内运行一次。它还附带了一系列用于 SQL 数据库、Slack、HipChat 和 Datadog 仪表盘的插件。你可以将实时迁移状况发送到这些平台中的任何一个。

Clinic.js

Clinic.js 是一个用于 Node.js 项目的开源监视工具。它结合了三种不同的工具 Doctor、Bubbleprof 和 Flame,帮助你监控、检测和解决 Node.js 的性能问题。

你可以通过运行以下命令从 npm 安装 Clinic.js:

$ npm install clinic

你可以根据要监视项目的某个方面以及要生成的报告,选择要使用的 Clinic.js 包含的三个工具中的一个:

  • Doctor 通过注入探针来提供详细的指标,并就项目的总体运行状况提供建议。
  • Bubbleprof 非常适合分析,并使用 async_hooks 生成指标。
  • Flame 非常适合发现代码中的热路径和瓶颈。

PM2

监视是后端开发过程中最重要的方面之一。PM2 是一款 Node.js 的进程管理工具,可帮助开发人员监视项目的多个方面,例如日志、延迟和速度。该工具与 Linux、MacOS 和 Windows 兼容,并支持从 Node.js 8.X 开始的所有 Node.js 版本。

你可以使用以下命令通过 npm 安装 PM2:

$ npm install pm2 --g

如果尚未安装 Node.js,则可以使用以下命令安装:

wget -qO- https://getpm2.com/install.sh | bash

安装完成后,使用以下命令启动应用程序:

$ pm2 start app.js

关于 PM2 最好的地方是可以在集群模式下运行应用程序。可以同时为多个 CPU 内核生成一个进程。这样可以轻松增强应用程序性能并最大程度地提高可靠性。PM2 也非常适合更新工作,因为你可以使用 “热重载” 选项更新应用程序并以零停机时间重新加载应用程序。总体而言,它是为 Node.js 应用程序简化进程管理的好工具。

Electrode

Electrode 是 Walmart Labs 的一个开源应用程序平台。该平台可帮助你以结构化方式构建大规模通用的 React/Node.js 应用程序。

Electrode 应用程序生成器使你可以构建专注于代码的灵活内核,提供一些出色的模块以向应用程序添加复杂功能,并附带了广泛的工具来优化应用程序的 Node.js 包。

可以使用 npm 安装 Electrode。安装完成后,你可以使用 Ignite 启动应用程序,并深入研究 Electrode 应用程序生成器。

你可以使用 NPM 安装 Electrode:

npm install -g electrode-ignite xclap-cli

你最喜欢哪一个?

这些只是不断增长的开源工具列表中的一小部分,在使用 Node.js 时,这些工具可以在不同阶段派上用场。你最喜欢使用哪些开源 Node.js 工具?请在评论中分享你的建议。


via: https://opensource.com/article/20/1/open-source-tools-nodejs

作者:Hiren Dhadhuk 选题:lujun9972 译者:stevenzdg988 校对:wxy

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

gImageReader 是一个 GUI 工具,用于在 Linux 中利用 Tesseract OCR 引擎从图像和 PDF 文件中提取文本。

gImageReaderTesseract 开源 OCR 引擎的一个前端。Tesseract 最初是由 HP 公司开发的,然后在 2006 年开源。

基本上,OCR(光学字符识别)引擎可以让你从图片或文件(PDF)中扫描文本。默认情况下,它可以检测几种语言,还支持通过 Unicode 字符扫描。

然而,Tesseract 本身是一个没有任何 GUI 的命令行工具。因此,gImageReader 就来解决这点,它可以让任何用户使用它从图像和文件中提取文本。

让我重点介绍一些有关它的内容,同时说下我在测试期间的使用经验。

gImageReader:一个跨平台的 Tesseract OCR 前端

为了简化事情,gImageReader 在从 PDF 文件或包含任何类型文本的图像中提取文本时非常方便。

无论你是需要它来进行拼写检查还是翻译,它都应该对特定的用户群体有用。

以列表总结下功能,这里是你可以用它做的事情:

  • 从磁盘、扫描设备、剪贴板和截图中添加 PDF 文档和图像
  • 能够旋转图像
  • 常用的图像控制,用于调整亮度、对比度和分辨率。
  • 直接通过应用扫描图像
  • 能够一次性处理多个图像或文件
  • 手动或自动识别区域定义
  • 识别纯文本或 hOCR 文档
  • 编辑器显示识别的文本
  • 可对对提取的文本进行拼写检查
  • 从 hOCR 文件转换/导出为 PDF 文件
  • 将提取的文本导出为 .txt 文件
  • 跨平台(Windows)

在 Linux 上安装 gImageReader

注意:你需要安装 Tesseract 语言包,才能从软件管理器中的图像/文件中进行检测。

你可以在一些 Linux 发行版如 Fedora 和 Debian 的默认仓库中找到 gImageReader。

对于 Ubuntu,你需要添加一个 PPA,然后安装它。要做到这点,下面是你需要在终端中输入的内容:

sudo add-apt-repository ppa:sandromani/gimagereader
sudo apt update
sudo apt install gimagereader

你也可以从 openSUSE 的构建服务中找到它,Arch Linux 用户可在 AUR 中找到。

所有的仓库和包的链接都可以在他们的 GitHub 页面中找到。

gImageReader 使用经验

当你需要从图像中提取文本时,gImageReader 是一个相当有用的工具。当你尝试从 PDF 文件中提取文本时,它的效果非常好。

对于从智能手机拍摄的图片中提取,检测很接近,但有点不准确。也许当你进行扫描时,从文件中识别字符可能会更好。

所以,你需要亲自尝试一下,看看它是否对你而言工作良好。我在 Linux Mint 20.1(基于 Ubuntu 20.04)上试过。

我只遇到了一个从设置中管理语言的问题,我没有得到一个快速的解决方案。如果你遇到此问题,那么可能需要对其进行故障排除,并进一步了解如何解决该问题。

除此之外,它工作良好。

试试吧,让我知道它是如何为你服务的!如果你知道类似的东西(和更好的),请在下面的评论中告诉我。


via: https://itsfoss.com/gimagereader-ocr/

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

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

FreeBSD 认为 BSD 许可证比 GPL 更重要

在一个访谈中,FreeBSD 开发者 Baldwin 说,“使我们独一无二的部分原因是我们的许可证,对很多厂商来说,与 GPL 尤其是 GPLv3 相比,BSD 许可证是非常重要的。”

FreeBSD 是一个采用 BSD 许可证的项目。许多采用 FreeBSD 的公司都会支持它。像 Netflix 这样的公司,他们开发的功能与工作会直接进入 FreeBSD 的上游。

而作为一个典型的被视为基于 BSD 内核发展起来其 macOS 操作系统的苹果公司,“并不像 Netflix 那样对上游做出超级积极的贡献。但我不怪他们。我们是一个 BSD 许可证项目,我们不是 GPL”,Baldwin 说。当然,他们也承认,苹果为 LLVM 项目贡献了很多,让 FreeBSD 项目受益匪浅。

从自由的角度看,BSD 许可证自然更让企业舒服一些;而从开源的可持续发展上,GPL 许可证更具有保障性。我认为,这两种许可证流派对开源生态都极其重要。

微软 Exchange 服务器漏洞被“至少 10 个骇客组织盯上”

上周,微软 Exchange 服务器中的四个漏洞成为新闻焦点,被至少 10 个高级持续性威胁(APT)的骇客组织盯上了,他们在横跨 115 个不同国家的约 5000 台服务器上安装了 Web shell 后门,以通过 Web 浏览器远程控制服务器。

虽然这些漏洞已经被微软打了补丁,但仍有大量的未打补丁的 Exchange 服务器。安全人员发现骇客组织借此展开勒索软件传播,试图利用 Exchange 服务器缓慢的打补丁速度,让攻击速度“每隔几个小时就会增加一倍”。

虽然就我的体验而已,并不喜欢 Exchange,但是它在企业环境中还是使用颇广,需要尽快更新或采用临时补救措施。

新的去中心化路由协议旨在取代 BGP

1994 年以来,用于将现代互联网“互联”起来的主要协议一直是 BGP 协议,但是随着互联网发展和技术的变化,BGP 协议无论是效率还是安全性都存在一定的问题。

而有一家名为 Syntropy 的初创公司提出了一种去中心化自主路由协议(DARP),旨在取代 BGP 作为互联网的默认路由方式,通过使用世界各地的节点不断收集当前网络的低效率数据。然后利用这些数据,通过最有效的路由来进行数据路由。通过数百台服务器的实际测试证明,延迟可以减少几十到几百毫秒。连接默认是加密的,网络抖动也会减少。

新的路由协议看起来不错,不过要得到广泛支持还需要很多考验。

使用 GNU 调试器来解决你的代码问题。

 title=

GNU 调试器常以它的命令 gdb 称呼它,它是一个交互式的控制台,可以帮助你浏览源代码、分析执行的内容,其本质上是对错误的应用程序中出现的问题进行逆向工程。

故障排除的麻烦在于它很复杂。GNU 调试器 并不是一个特别复杂的应用程序,但如果你不知道从哪里开始,甚至不知道何时和为何你可能需要求助于 GDB 来进行故障排除,那么它可能会让人不知所措。如果你一直使用 printechoprintf 语句来调试你的代码,当你开始思考是不是还有更强大的东西时,那么本教程就是为你准备的。

有错误的代码

要开始使用 GDB,你需要一些代码。这里有一个用 C++ 写的示例应用程序(如果你一般不使用 C++ 编写程序也没关系,在所有语言中原理都是一样的),其来源于 猜谜游戏系列 中的一个例子。

#include <iostream>
#include <stdlib.h> //srand
#include <stdio.h>  //printf

using namespace std;

int main () {

srand (time(NULL));
int alpha = rand() % 8;
cout << "Hello world." << endl;
int beta = 2;

printf("alpha is set to is %s\n", alpha);
printf("kiwi is set to is %s\n", beta);

 return 0;
} // main

这个代码示例中有一个 bug,但它确实可以编译(至少在 GCC 5 的时候)。如果你熟悉 C++,你可能已经看到了,但这是一个简单的问题,可以帮助新的 GDB 用户了解调试过程。编译并运行它就可以看到错误:

$ g++ -o buggy example.cpp
$ ./buggy
Hello world.
Segmentation fault

排除段故障

从这个输出中,你可以推测变量 alpha 的设置是正确的,因为否则的话,你就不会看到它后面的那行代码执行。当然,这并不总是正确的,但这是一个很好的工作理论,如果你使用 printf 作为日志和调试器,基本上也会得出同样的结论。从这里,你可以假设 bug 在于成功打印的那一行之后的某行。然而,不清楚错误是在下一行还是在几行之后。

GNU 调试器是一个交互式的故障排除工具,所以你可以使用 gdb 命令来运行错误的代码。为了得到更好的结果,你应该从包含有调试符号的源代码中重新编译你的错误应用程序。首先,看看 GDB 在不重新编译的情况下能提供哪些信息:

$ gdb ./buggy
Reading symbols from ./buggy...done.
(gdb) start
Temporary breakpoint 1 at 0x400a44
Starting program: /home/seth/demo/buggy

Temporary breakpoint 1, 0x0000000000400a44 in main ()
(gdb)

当你以一个二进制可执行文件作为参数启动 GDB 时,GDB 会加载该应用程序,然后等待你的指令。因为这是你第一次在这个可执行文件上运行 GDB,所以尝试重复这个错误是有意义的,希望 GDB 能够提供进一步的见解。很直观,GDB 用来启动它所加载的应用程序的命令就是 start。默认情况下,GDB 内置了一个断点,所以当它遇到你的应用程序的 main 函数时,它会暂停执行。要让 GDB 继续执行,使用命令 continue

(gdb) continue
Continuing.
Hello world.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6
(gdb)

毫不意外:应用程序在打印 “Hello world” 后不久就崩溃了,但 GDB 可以提供崩溃发生时正在发生的函数调用。这有可能就足够你找到导致崩溃的 bug,但为了更好地了解 GDB 的功能和一般的调试过程,想象一下,如果问题还没有变得清晰,你想更深入地挖掘这段代码发生了什么。

用调试符号编译代码

要充分利用 GDB,你需要将调试符号编译到你的可执行文件中。你可以用 GCC 中的 -g 选项来生成这个符号:

$ g++ -g -o debuggy example.cpp
$ ./debuggy
Hello world.
Segmentation fault

将调试符号编译到可执行文件中的结果是得到一个大得多的文件,所以通常不会分发它们,以增加便利性。然而,如果你正在调试开源代码,那么用调试符号重新编译测试是有意义的:

$ ls -l *buggy* *cpp
-rw-r--r--    310 Feb 19 08:30 debug.cpp
-rwxr-xr-x  11624 Feb 19 10:27 buggy*
-rwxr-xr-x  22952 Feb 19 10:53 debuggy*

用 GDB 调试

加载新的可执行文件(本例中为 debuggy)以启动 GDB:

$ gdb ./debuggy
Reading symbols from ./debuggy...done.
(gdb) start
Temporary breakpoint 1 at 0x400a44
Starting program: /home/seth/demo/debuggy

Temporary breakpoint 1, 0x0000000000400a44 in main ()
(gdb)

如前所述,使用 start 命令进行:

(gdb) start
Temporary breakpoint 1 at 0x400a48: file debug.cpp, line 9.
Starting program: /home/sek/demo/debuggy

Temporary breakpoint 1, main () at debug.cpp:9
9       srand (time(NULL));
(gdb)

这一次,自动的 main 断点可以指明 GDB 暂停的行号和该行包含的代码。你可以用 continue 恢复正常操作,但你已经知道应用程序在完成之前就会崩溃,因此,你可以使用 next 关键字逐行步进检查你的代码:

(gdb) next
10  int alpha = rand() % 8;
(gdb) next
11  cout << "Hello world." << endl;
(gdb) next
Hello world.
12  int beta = 2;
(gdb) next
14      printf("alpha is set to is %s\n", alpha);
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6
(gdb)

从这个过程可以确认,崩溃不是发生在设置 beta 变量的时候,而是执行 printf 行的时候。这个 bug 在本文中已经暴露了好几次(破坏者:向 printf 提供了错误的数据类型),但暂时假设解决方案仍然不明确,需要进一步调查。

设置断点

一旦你的代码被加载到 GDB 中,你就可以向 GDB 询问到目前为止代码所产生的数据。要尝试数据自省,通过再次发出 start 命令来重新启动你的应用程序,然后进行到第 11 行。一个快速到达 11 行的简单方法是设置一个寻找特定行号的断点:

(gdb) start
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Temporary breakpoint 2 at 0x400a48: file debug.cpp, line 9.
Starting program: /home/sek/demo/debuggy

Temporary breakpoint 2, main () at debug.cpp:9
9       srand (time(NULL));
(gdb) break 11
Breakpoint 3 at 0x400a74: file debug.cpp, line 11.

建立断点后,用 continue 继续执行:

(gdb) continue
Continuing.

Breakpoint 3, main () at debug.cpp:11
11      cout << "Hello world." << endl;
(gdb)

现在暂停在第 11 行,就在 alpha 变量被设置之后,以及 beta 被设置之前。

用 GDB 进行变量自省

要查看一个变量的值,使用 print 命令。在这个示例代码中,alpha 的值是随机的,所以你的实际结果可能与我的不同:

(gdb) print alpha
$1 = 3
(gdb)

当然,你无法看到一个尚未建立的变量的值:

(gdb) print beta
$2 = 0

使用流程控制

要继续进行,你可以步进代码行来到达将 beta 设置为一个值的位置:

(gdb) next
Hello world.
12  int beta = 2;
(gdb) next
14  printf("alpha is set to is %s\n", alpha);
(gdb) print beta
$3 = 2

另外,你也可以设置一个观察点,它就像断点一样,是一种控制 GDB 执行代码流程的方法。在这种情况下,你知道 beta 变量应该设置为 2,所以你可以设置一个观察点,当 beta 的值发生变化时提醒你:

(gdb) watch beta > 0
Hardware watchpoint 5: beta > 0
(gdb) continue
Continuing.

Breakpoint 3, main () at debug.cpp:11
11      cout << "Hello world." << endl;
(gdb) continue
Continuing.
Hello world.

Hardware watchpoint 5: beta > 0

Old value = false
New value = true
main () at debug.cpp:14
14      printf("alpha is set to is %s\n", alpha);
(gdb)

你可以用 next 手动步进完成代码的执行,或者你可以用断点、观察点和捕捉点来控制代码的执行。

用 GDB 分析数据

你可以以不同格式查看数据。例如,以八进制值查看 beta 的值:

(gdb) print /o beta
$4 = 02

要查看其在内存中的地址:

(gdb) print /o &beta
$5 = 0x2

你也可以看到一个变量的数据类型:

(gdb) whatis beta
type = int

用 GDB 解决错误

这种自省不仅能让你更好地了解什么代码正在执行,还能让你了解它是如何执行的。在这个例子中,对变量运行的 whatis 命令给了你一个线索,即你的 alphabeta 变量是整数,这可能会唤起你对 printf 语法的记忆,使你意识到在你的 printf 语句中,你必须使用 %d 来代替 %s。做了这个改变,就可以让应用程序按预期运行,没有更明显的错误存在。

当代码编译后发现有 bug 存在时,特别令人沮丧,但最棘手的 bug 就是这样,如果它们很容易被发现,那它们就不是 bug 了。使用 GDB 是猎取并消除它们的一种方法。

下载我们的速查表

生活的真相就是这样,即使是最基本的编程,代码也会有 bug。并不是所有的错误都会导致应用程序无法运行(甚至无法编译),也不是所有的错误都是由错误的代码引起的。有时,bug 是基于一个特别有创意的用户所做的意外的选择组合而间歇性发生的。有时,程序员从他们自己的代码中使用的库中继承了 bug。无论原因是什么,bug 基本上无处不在,程序员的工作就是发现并消除它们。

GNU 调试器是一个寻找 bug 的有用工具。你可以用它做的事情比我在本文中演示的要多得多。你可以通过 GNU Info 阅读器来了解它的许多功能:

$ info gdb

无论你是刚开始学习 GDB 还是专业人员的,提醒一下你有哪些命令是可用的,以及这些命令的语法是什么,都是很有帮助的。


via: https://opensource.com/article/21/3/debug-code-gdb

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

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

Python & Poetry on Fedora

Python 开发人员经常创建一个新的虚拟环境来分离项目依赖,然后用 pippipenv 等工具来管理它们。Poetry 是一个简化 Python 中依赖管理和打包的工具。这篇文章将向你展示如何在 Fedora 上使用 Poetry 来管理你的 Python 项目。

与其他工具不同,Poetry 只使用一个配置文件来进行依赖管理、打包和发布。这消除了对不同文件的需求,如 PipfileMANIFEST.insetup.py 等。这也比使用多个工具更快。

下面详细介绍一下开始使用 Poetry 时使用的命令。

在 Fedora 上安装 Poetry

如果你已经使用 Fedora 32 或以上版本,你可以使用这个命令直接从命令行安装 Poetry:

$ sudo dnf install poetry

编者注:在 Fedora Silverblue 或 CoreOs上,Python 3.9.2 是核心提交的一部分,你可以用下面的命令安装 Poetry:

rpm-ostree install poetry

初始化一个项目

使用 new 命令创建一个新项目:

$ poetry new poetry-project

用 Poetry 创建的项目结构是这样的:

├── poetry_project
│   └── init.py
├── pyproject.toml
├── README.rst
└── tests
    ├── init.py
    └── test_poetry_project.py

Poetry 使用 pyproject.toml 来管理项目的依赖。最初,这个文件看起来类似于这样:

[tool.poetry]
name = "poetry-project"
version = "0.1.0"
description = ""
authors = ["Kadermiyanyedi <[email protected]>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

这个文件包含 4 个部分:

  • 第一部分包含描述项目的信息,如项目名称、项目版本等。
  • 第二部分包含项目的依赖。这些依赖是构建项目所必需的。
  • 第三部分包含开发依赖。
  • 第四部分描述的是符合 PEP 517 的构建系统。

如果你已经有一个项目,或者创建了自己的项目文件夹,并且你想使用 Poetry,请在你的项目中运行 init 命令。

$ poetry init

在这个命令之后,你会看到一个交互式的 shell 来配置你的项目。

创建一个虚拟环境

如果你想创建一个虚拟环境或激活一个现有的虚拟环境,请使用以下命令:

$ poetry shell

Poetry 默认在 /home/username/.cache/pypoetry 项目中创建虚拟环境。你可以通过编辑 Poetry 配置来更改默认路径。使用下面的命令查看配置列表:

$ poetry config --list

cache-dir = "/home/username/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs"

修改 virtualenvs.in-project 配置变量,在项目目录下创建一个虚拟环境。Poetry 命令是:

$ poetry config virtualenv.in-project true

添加依赖

使用 poetry add 命令为项目安装一个依赖:

$ poetry add django

你可以使用带有 --dev 选项的 add 命令来识别任何只用于开发环境的依赖:

$ poetry add black --dev

add 命令会创建一个 poetry.lock 文件,用来跟踪软件包的版本。如果 poetry.lock 文件不存在,那么会安装 pyproject.toml 中所有依赖项的最新版本。如果 poetry.lock 存在,Poetry 会使用文件中列出的确切版本,以确保每个使用这个项目的人的软件包版本是一致的。

使用 poetry install 命令来安装当前项目中的所有依赖:

$ poetry install

通过使用 --no-dev 选项防止安装开发依赖:

$ poetry install --no-dev

列出软件包

show 命令会列出所有可用的软件包。--tree 选项将以树状列出软件包:

$ poetry show --tree

django 3.1.7 A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
├── asgiref >=3.2.10,<4
├── pytz *
└── sqlparse >=0.2.2

包含软件包名称,以列出特定软件包的详细信息:

$ poetry show requests

name         : requests
version      : 2.25.1
description  : Python HTTP for Humans.

dependencies
 - certifi >=2017.4.17
 - chardet >=3.0.2,<5
 - idna >=2.5,<3
 - urllib3 >=1.21.1,<1.27

最后,如果你想知道软件包的最新版本,你可以通过 --latest 选项:

$ poetry show --latest

idna     2.10      3.1    Internationalized Domain Names in Applications
asgiref  3.3.1     3.3.1  ASGI specs, helper code, and adapters

更多信息

Poetry 的更多详情可在文档中获取。


via: https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/

作者:Kader Miyanyedi 选题:lujun9972 译者:geekpi 校对:wxy

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