2023年3月

Artipie 是一个开源的自托管的仓库管理器,它不仅可以用于 Python。

在学生时代使用 Python 开发时,我发现我需要一些私人的集中存储。这样我就可以存储二进制和文本数据文件,以及 Python 软件包。我在 Artipie 中找到了答案,这是一个开源的自托管的软件仓库管理器。

在大学里,我和我的同事们对来自实验测量的大量数据进行研究。我使用 Python 来处理和可视化它们。当时我的大学同事是数学家,没有软件开发技术的经验。他们通常只是在闪存盘上或通过电子邮件传递数据和代码。我努力向他们介绍像 Git 这样的版本管理系统,但没有成功。

Python 仓库

Artipie 支持 PyPI 仓库,与 twinepip 兼容。这意味着你可以完全像在 PyPITestPyPI 仓库上安装或发布软件包那样使用 Artipie Python 仓库。

要创建你自己的 Python 仓库,你可以使用名为 Artipie Central 的 Artipie 托管实例。当你登录后,你会看到一个列出你的仓库的页面(开始时是空的),以及一个添加新仓库的表单。为你的新仓库选择一个名字(例如,mypython),选择 Python 作为仓库类型,然后点击 “ 添加 Add ” 按钮。

接下来,你会看到一个以 YAML 格式显示仓库设置的页面:

---
repo:
  type: pypi
  storage: default
  permissions:
    olenagerasimova:
      - upload
    "*":
      - download

配置中的 type 映射设置了仓库的类型。在这个例子中,Python 仓库被配置为默认的 Artipie Central 存储。

storage 映射定义了所有仓库包的存储位置。这可以是任何文件系统或 S3 存储兼容的位置。Artipie Central 有一个预先配置的 default 存储,可以使用它进行测试。

permissions 映射允许为用户 olenagerasimova 上传,并允许任何人下载任何软件包。

为了确保这个仓库的存在和工作,在你的浏览器中打开 索引页。显示的是软件包列表。如果你刚刚创建了一个新的版本库,但还没有上传软件包,那么仓库的索引页是空白的。

二进制仓库

你可以在 Artipie 中存储任何种类的文件。存储类型是 filebinary,我用这个作为实验数据的存储。我把它作为 Python 可视化的输入。在 Artipie Central 可以创建一个文件仓库,与 Python 仓库的方式相同。你给它一个名字,选择 binary 类型,然后点击 “ 添加 Add ” 按钮。

---
repo:
  type: file
  storage: default
  permissions:
    olenagerasimova:
      - upload
      - download
    "*":
      - download

这些设置基本上与 Python 相同。只有仓库的类型不同。在这个例子中,二进制仓库被称为 data。它包含三个带有一些数字的文本文件:

6
3.5
5
4
4.5
3
2.7
5
6
3
1.2
3.2
6

另外两个文件的形式相同(只是数字不同)。要想自己看这些文件,请在浏览器中打开链接 并下载文件,或者你可以用 httpie 执行 GET 请求:

httpie -a https://central.artipie.com/olenagerasimova/data/y1.dat > ./data/y1.da

这些文件是用 PUT 请求上传到 Artipie Central 的 data 存储库的:

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y1.dat @data/y1.dat

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y2.dat @data/y2.dat

httpie -a olenagerasimova:*** PUT 
https://central.artipie.com/olenagerasimova/data/y3.dat @data/y3.dat

由于这个二进制仓库的 API 非常简单(HTTP PUTGET 请求),用任何语言编写一段代码来上传和下载所需的文件都很容易。

Python 项目

可以从我的 GitHub 仓库中获得一个 Python 项目的示例源代码。这个示例的主要想法是,从 Artipie Central 下载三个数据文件,将数字读入数组,并使用这些数组来绘制一个图。使用 pip 来安装这个例子包并运行它:

$ python3 -m pip install --index-url \
  https://central.artipie.com/olenagerasimova/pypi/ \
  pypiexample
$ python3 -m pypiexample

通过设置 --index-url 到 Artipie Central 的 Python 仓库,pip 从它那里下载软件包,而不是通常默认的 PyPi 仓库。运行这些命令后,会显示一个带有三条曲线的极坐标图,这是数据文件的可视化。

要将软件包发布到 Artipie Central 仓库,请用 twine 构建并上传:

commandline
$ python setup.py sdist bdist_wheel

$ twine upload --repository-url \
  https://central.artipie.com/olenagerasimova/pypi
  -u olenagerasimova -p *** dist/*

在 Artipie Central 中设置 files 仓库,并创建一个 Python 示例项目是多么容易。不过,你不必使用 Artipie Central。Artipie 可以自托管,所以你可以在你自己的本地网络上运行一个仓库。

将 Artipie 作为一个容器运行

将 Artipie 作为一个容器运行,设置起来就像安装 Podman 或 Docker 一样容易。假设你已经安装了其中之一,打开终端:

$ podman run -it -p 8080:8080 -p 8086:8086 artipie/artipie:latest

这将启动一个运行最新 Artipie 版本的新容器。它还映射了两个端口。你的仓库在 8080 端口提供服务。Artipie 的 Rest API 和 Swagger 文档在 8086 端口提供。新的镜像会生成一个默认的配置,打印一个正在运行的仓库列表,测试证书,以及一个指向 Swagger 文档的链接到你的控制台。

你也可以使用 Artipie Rest API 来查看现有的仓库:

  • 进入 Swagger 文档页面 http://localhost:8086/api/index-org.html
  • 在 “ 选择一个定义 Select a definition ” 列表中,选择 “ 认证令牌 Auth token ”。
  • 生成并复制用户 artipie 的认证令牌,密码是 artipie
  • 切换到 “ 仓库 Repositories ” 定义,点击 “ 认证 Authorize ” 按钮,然后粘贴令牌。

Image of the Swagger documentation page,

/api/v1/repository/list 执行一个 GET 请求。在响应中,你会收到一个包含三个默认仓库的 JSON 列表:

[
  "artipie/my-bin",
  "artipie/my-docker",
  "artipie/my-maven"
]

默认配置中不包括 Python 仓库。你可以通过从 Swagger 接口向 /api/v1/repository/{user}/{repo} 执行 PUT 请求来纠正。在这种情况下,user 是默认用户的名字(artipie),repo 是新仓库的名字。你可以把你的新 Python 代码库称为 my-pypi。下面是一个请求体的例子,包含带仓库设置的 JSON 对象:

{ 
  "repo": {
    "type": "pypi",
    "storage": "default",
    "permissions": {
      "*": [
        "download"
      ],
      "artipie": [
        "upload"
      ]
    }
  }
}

所有的 JSON 字段都和你在仪表板上创建 YAML 格式的仓库时一样。我们版本库的类型是 pypi,使用默认存储,任何人都可以下载,但只有用户 artipie 可以上传。

再次向 /api/v1/repository/list 发出 GET 请求,确保你的仓库被创建。现在,你有四个仓库:

[
  "artipie/my-bin",
  "artipie/my-docker",
  "artipie/my-maven",
  "artipie/my-pypi"
]

你已经创建了你自己的 Artipie 安装,包含了几个仓库! Artipie 镜像既可以在个人电脑上运行,也可以在私人网络内的远程服务器上运行。你可以用它来在一个公司、团体或大学内交换软件包。这是一个建立你自己的软件服务的简单方法,而且它不仅仅适用于 Python。花些时间来探索 Artipie,看看它能为你带来什么。


via: https://opensource.com/article/22/12/python-package-index-repository-artipie

作者:Alena Gerasimova 选题:lkxed 译者:geekpi 校对:wxy

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

OpenAI 低价倾销 ChatGPT API

OpenAI 向开发者释放了它的 ChatGPT 和 Whisper 模型,他们现在可以通过 API 调用将这个聊天机器人互动和语音到文本转换整合到自己的应用程序中。新的 ChatGPT API 将使用与 ChatGPT 相同的人工智能模型,其 API 的价格为每 1000 个字元(约 750 个单词)0.2 美分。OpenAI 称这比以前的 GPT 模型便宜 10 倍。Whisper 是去年 9 月发布的一个自动语音识别系统,它能够将英语口语转化为文本。Whisper 的价格为 0.6 美分/分钟。

消息来源:The Register
老王点评:这可以起诉 OpenAI 反竞争了。别的 AI 厂商能力打不打,价格也打不过,要怎么办。

Fedora 38 仍将支持帧缓存 X11 和 NIS+

Fedora 38 原计划准备放弃对一些老旧技术的支持,但由于无法在发布前完成,而被推迟到以后的版本。比如,在 PAM 和用户空间中对 NIS+ 的支持将被保留,它是 Unix 的一个网络目录服务,现在基本上被 LDAP 取代。还有,虽然 X.org 还没有消失,但原计划在 Fedora 36/37 中删除老式驱动程序,如 VESA 和 fbdev 驱动程序。这很重要,因为删除旧的帧缓冲控制台和它的驱动是与合并实时内核的补丁联系在一起的。但现在,它们还存在。

消息来源:Phoronix
老王点评:即便是旧的驱动,想干干净净的打扫了,也没法一删了之。

近 40% 的软件工程师只愿意远程工作

根据 Hired 的《2023 年软件工程师状况》,近 40% 的软件工程师只喜欢远程角色,如果他们的雇主强制要求回到办公室,21% 的人表示他们会立即辞职,而另外 49% 的人表示他们会开始寻找另一份工作。这份报告从 68,500 名软件工程候选人以及对 1300 多名软件工程师和 120 名人才专业人士的调查中收集了数据。

消息来源:Tech Target
老王点评:真是回不去过去了。除了众所周知的原因外,还有一个原因是现在的基础设施也基本上满足了远程工作需求。

从千禧年间走过来的人,必然都经历过盗版的 Windows XP 满天飞的时代。而在那个时代,也有这么一撮儿 Geek,他们选择不与盗版共行,但又希望能够使用一个正版的操作系统,开源免费的 Linux 成为了最终的选择。毕竟,选择使用盗版虽然免费,但难免有风险。开源免费的 Linux 看起来也不错,还没有任何心理负担。何乐而不为?作为一个倒腾计算机比较早的人,我也有幸经历过那段时间,装过机,玩过 Linux 。我曾不止一次试图将 Linux 作为我的主要的操作系统,但都败在了当时国内软件对于 Linux 操作系统生态支持不佳的问题上

毕竟,作为一个年轻人,如果连 QQ 都不能在 Linux 上使用,不亚于断网造成的困扰。你可能可以用 Linux 来写完工作的文档,但你无法将其传递给你的同事们;你可能需要使用 FTP 将其上传到自己的网站上,再给同事链接,让同事去下载,抑或是使用海外的 Skype、Slack 等产品。虽然你连接着互联网,但你仿佛就是断网

但那个时候,腾讯尚未为 Linux 提供 QQ 应用。虽然有人通过其它的一些变通方式可以勉强在 Linux 上使用 QQ,但效果差强人意。直到 2009 年,腾讯才正式推出了 QQ 1.0 版本。随后的十年里,Linux 上的 QQ 就再无动静,一直到 2019 年,QQ 才 再次更新 了 2.0 版本。

图片来自 OSChina

但这个新的 2.0 版本,其应用界面却还停留在 10 年前。而随后,QQ for Linux 并为见到持续的更新。虽然缓解了部分 Linux 用户使用 QQ 的难处,但几年来,并未引来更多反响和改进。

直到最近,QQ for Linux 又有了 新的动作,先后推出了 3.0、3.1,并且比之前的版本有了突破性的改变,真正让 QQ For Linux ,成为一个可用的选项。

QQ For Linux 3.1 — 完成度堪比 Windows/macOS 版本的新版

之所以让我感受到 QQ For Linux 3.1 成为可用的,是它在功能和 UI 上的完备。和 2.0 的老式用户界面不同,QQ For Linux 3.1 使用了和 Windows QQ 和 macOS QQ 相同的 UI。

在产品的功能上,QQ For Linux 3.0 和我们所熟悉的 Windows QQ 、macOS 做到了常用功能的对标提供。诸如群管理、QQ 空间、甚至是最新的群频道,都已经在 QQ for Linux 当中提供。可以说,作为一个普通的 QQ 用户,这些功能已经可以满足你 90% 的需要了。

如果过去 QQ 是一个阻拦你选择 Linux 的拦路虎,如今这个拦路虎已经不复存在

从技术的角度来看,采用跨平台框架 Electron 的设计确实为 QQ For Linux 的开发带来了便利,不仅可以实现多平台兼容性,还可以大大降低开发人员的工作量。同时,采用跨平台框架也可以提高开发效率和质量,减少开发成本和维护成本。这种技术方案设计的优势不仅可以在 QQ For Linux 中得到体现,未来,还可以引导更多的国产应用提供对于 Linux 的支持。

稍有瑕疵,但进展迅速

QQ For Linux 3.1 并不是横空出世,其实在 2022 年 12 月底,QQ 便对外放出了 QQ For Linux 3.0 ,但 3.0 版本的 QQ For Linux 还有不少的问题,存在功能不完整。比如登录时每次都要扫码(在 3.1 版本已经修复)、不支持语音、视频(3.1 仍不支持)。

不过,多年来 QQ 团队在 Linux 上的懈怠,确实让社区用户对于 QQ 不敢抱有太高的期待,Linux 中国的贡献者们对于 QQ For Linux 的评价多是”腾讯能支持 QQ,已感激不尽“、”首先不折腾不闪退,可以平滑打字看图片我就算满意了。毕竟我也不会使用太多群功能。但是如果能过像 Windows qq 一样提供文件夹一键下载就好了,而且打开群聊也查看不到群Q号,不知道是不小心还是故意没放”。

多年的懈怠,使得大家不敢对腾讯抱有太高的期待,但 3.0 发布的一个多月后,QQ For Linux 便推送了新的 3.1 版本,其迭代速度,也让大家真的可以期待一下,相信腾讯 QQ 团队也在快速迭代,或许要不了多久,我们就可以在 QQ For Linux 上使用完整的 QQ 能力。

生态支持广泛,但可更进一步

Linux 生态和 Windows、macOS 生态有一个很大的不同,它有多种不同的发行版和包管理器机制。虽然可能底层的二进制完全相同,但对于普通的用户来说,自己去解包,再重新打包依然是一个不靠谱的方案。

这一点,QQ For Linux 已经完成了大部分工作:QQ For Linux 提供了 RPM、DEB、AppImage 方式的安装包,对于绝大多数主流的发行版都已经提供适配。

对于 QQ For Linux 来说,要想让更多的 Linux 用户方便地使用,确实需要更多的努力。QQ For Linux 虽然已经预装在一些国内常用的 Linux 桌面发行版,但目前还没有进入更多主流的 Linux 桌面发行版的官方仓库。这对于使用 Linux 桌面的更多用户来说,不能方便的在官方的软件仓库、软件中心中便捷的安装,还是稍显麻烦,也不利于 QQ 在 Linux 用户群体中的推广。

除了 QQ ,我们更值得关注背后的中国 Linux 生态

QQ For Linux 的出现,对于我们每一个 Linux 用户来说,是一件好事、大事。细想一下,这其实是中国 Linux 生态在不断变好的佐证。作为一个专注于 Linux 和 Linux 周边生态的技术人,近几年来,我们在不断感受到国产 Linux 的变化,开始逐渐丰满、完善。

从层出不穷的国产 Linux 发行版,到各个行业和领域开始使用 Linux 作为面向用户的主要界面系统,再到如今我们看到最重要的 QQ For Linux 也与时俱进的发布了新版。作为一名 Linux 老用户,我认为,用 Linux 作为日常办公,已经被搬开了最后一块石头

这对于整个中国的 Linux 生态来说,也起到了带头的作用。以往我们在说 Linux 的时候,常常说没有 QQ 、微信, 不可能推广下去的,但如今 QQ 已经入局参与到 Linux 生态的建设了,其他的厂商相信很快也会随之涌入,帮助大家可以在获得自由的同时,也与世界密切相接。

除了 x86,还有 ARM64 和龙芯,为国产芯注入强心剂

在 QQ For Linux 的安装页面上,除了我们熟悉的 x86 平台,还有 ARM 平台和 LoongArch 平台。x86 自不必说, PC 主机的核心战场;而 ARM 平台也一直伴随着 Linux 用户,毕竟树莓派几乎是每一个玩 Linux 人必备的小主机。LoongArch 便是我们所熟悉的龙芯平台。作为国产操作系统和国产芯片的主要阵地,龙芯过去一直也缺少一些杀手级应用。QQ 对于龙芯的支持,让普通群众从 x86 芯片切换到龙芯也成为了一个可能。

在信创飞速发展的大背景下, 可以预见到,在未来的若干年里,我们的一些公共基础设施,可能都将会使用 Linux 来提供服务。普通用户所需要的核心软件,在 Linux 下也都得到了完善的支持。

可以预期的是,虽然普通用户还会在许多场景使用 Windows、macOS ,但在未来,Linux 已经可能成为用户无感知使用上的主流。

除了功能对齐,QQ For Linux 还可以是什么?

和 Windows 不同,Linux 的用户群体大多是开发者或者极客们。这样的大背景下,QQ For Linux 可以探索更多的功能和应用场景,特别是在 Linux 用户群体中,他们更加熟悉命令行和自动化工具的使用,这也为 QQ For Linux 提供了更广阔的应用前景。

  1. 支持通过命令行工具进行 QQ 聊天:将 QQ 的聊天功能通过命令行封装成一个命令行工具,用户可以通过命令行工具发送消息、接收消息等,方便用户在终端界面中使用 QQ 进行聊天,让在 Emacs 里聊天成为可能。
  2. 提供原生 API ,让用户可以通过脚本语言来控制 QQ :QQ For Linux 可以提供一些原生 API 接口,例如 Python API、JavaScript API 等,用户可以通过脚本语言调用这些 API 接口,实现对 QQ 的控制,例如通过 Python 脚本来定时发送消息、自动回复消息等。
  3. 结合自动化工具提供更丰富的应用场景:QQ For Linux 可以和常用的自动化工具如 Cron、Jenkins、Ansible 等结合,实现更丰富的应用场景,例如在 Cron 中定时发送消息、在 Jenkins 中实现自动化测试中的通知功能等。

而所有的这些都能够为用户提供更加便捷、灵活的应用场景和功能,为开发者群体提供更多的便利和灵活性。

距离全面迁移 Linux ,我们还差多少?

QQ 给大家开了个好头,而其他领域的软件,其实也很早就开始深耕 Linux 操作系统。我简单数了一下,我们日常使用的浏览器都是有 Linux 版本的;而办公用的 WPS Office,同样也有 Linux 版本。如果你需要做日常沟通,QQ 和邮箱,都有相应的客户端来满足你的需求。至于微信,QQ 珠玉在前,微信的新版,也指日可待。

在我看来,日常使用 Linux 已是坦途。

下载 QQ for Linux 3.1

通过使用命令行让用户告诉程序要什么,可以让程序更加灵活。

 title=

在已经知道要处理什么文件和对文件进行哪些操作的情况下,编写处理文件的 C 语言程序就很容易了。如果将文件名“硬编码”在程序中,或者你的程序只以一种方式来处理文件,那么你的程序总是知道要做什么。

但是如果程序每次运行时能够对用户的输入做出反应,可以使程序更灵活。让用户告诉程序要处理什么文件,或者以不同的方式完成任务,要实现这样的功能就需要读取命令行参数。

读取命令行

一个 C 语言程序可以用如下声明开头:

int main()

这是启动 C 程序最简单的形式。但如果在圆括号中加入标准参数,你的程序就可以从命令行中读取选项了:

int main(int argc, char **argv)

argc 表示命令行中的参数个数。它总是一个至少为 1 的数。

argv 是一个二级指针,它指向一个字符串数组。这个数组中保存的是从命令行接收的各个参数。数组的第一个元素 *argv[0] 是程序的名称。**argv 数组的其它元素包含剩下的命令行参数。

下面我将写一个简单的示例程序,它能够回显通过命令行参数传递给它的选项。它跟 Linux 的 echo 命令类似,只不过我们的程序会打印出程序名。同时它还会调用 puts 函数将命令行选项按行打印输出。

#include <stdio.h>

int
main(int argc, char **argv)
{
  int i;

  printf("argc=%d\n", argc); /* debugging */

  for (i = 0; i < argc; i++) {
    puts(argv[i]);
  }

  return 0;
}

编译此程序,并在运行时提供一些命令行参数,你会看到传入的命令行参数被逐行打印出来:

$ ./echo this program can read the command line
argc=8
./echo
this
program
can
read
the
command
line

这个命令行将程序的 argc 置为 8,**argv 数组包含 8 个元素:程序名以及用户输入的 7 个单词。由于 C 语言中数组下标从 0 开始,所以这些元素的标号分别是 0 到 7。这也是在 for 循环中处理命令行参数时能够用 i < argc 作为比较条件的原因。

你也可以用这个方式实现自己的 catcp 命令。cat 命令的基本功能是显示一个或几个文件的内容。下面是一个简化版的cat 命令,它从命令行获取文件名:

#include <stdio.h>

void
copyfile(FILE *in, FILE *out)
{
  int ch;

  while ((ch = fgetc(in)) != EOF) {
    fputc(ch, out);
  }
}

int
main(int argc, char **argv)
{
  int i;
  FILE *fileptr;

  for (i = 1; i < argc; i++) {
    fileptr = fopen(argv[i], "r");

    if (fileptr != NULL) {
      copyfile(fileptr, stdout);
      fclose(fileptr);
    }
  }

  return 0;
}

这个简化版的 cat 命令从命令行读取文件名列表,然后将各个文件的内容逐字符地显示到标准输出上。假定我有一个叫做 hello.txt 的文件,其中包含数行文本内容。我能用自己实现的 cat 命令将它的内容显示出来:

$ ./cat hello.txt
Hi there!
This is a sample text file.

以这个简单程序为出发点,你也可以实现自己版本的其它 Linux 命令。比如 cp 命令,它从命令行读取两个文件名:要读取的文件和要写入的文件。

读取命令行选项

通过命令行读取文件名和其它文本固然很棒,但是如果想要程序根据用户给出的选项改变行为呢?比如 Linux 的 cat 命令就支持以下命令行选项:

  • -b 显示非空行的行号
  • -E 在行尾显示 $
  • -n 显示行号
  • -s 合并显示空行
  • -T 将制表符显示为 ^I
  • -v^xM-x 方式显示非打印字符,换行符和制表符除外

这些以一个连字符开头的单字母的选项叫做短选项。通常短选项是分开使用的,就像这样 cat -E -n。但是也可以将多个短选项合并,比如 cat -En

值得庆幸的是,所有 Linux 和 Unix 系统都包含 getopt 库。它提供了一种简单的方式来读取命令行参数。getopt 定义在头文件 unistd.h 中。你可以在程序中使用 getopt 来读取命令行短选项。

与其它 Unix 系统不同的是,Linux 上的 getopt 总是保证短选项出现在命令行参数的最前面。比如,用户输入的是 cat -E file -n-E 在最前面,-n 在文件名之后。如果使用 Linux 的 getopt 来处理,程序会认为用户输入的是 cat -E -n file。这样做可以使处理过程更顺畅,因为 getopt 可以解析完所有短选项,剩下的文件名列表可以通过 **argv 来统一处理。

你可以这样使用 getopt:

#include <unistd.h>

int getopt(int argc, char **argv, char *optstring);

optstring 是由所有合法的选项字符组成的字符串。比如你的程序允许的选项是 -E-n, 那么 optstring 的值就是 "En"

通常通过在循环中调用 getopt 来解析命令行选项。每次调用时 getopt 会返回找到的下一个短选项,如果遇到无法识别的选项则返回 '?'。当没有更多短选项时它返回 -1,并且设置全局变量 optind 的值指向 **argv 中所有段选项之后的第一个元素。

下面看一个简单的例子。这个演示程序没有实现 cat 命令的所有选项,但它只是能够解析命令行。每当发现一个合法的命令行选项,它就打印出相应的提示消息。在你自己的程序中,你可能会根据这些命令行选项执行变量赋值等者其它操作。

#include <stdio.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
  int i;
  int option;

  /* parse short options */

  while ((option = getopt(argc, argv, "bEnsTv")) != -1) {
    switch (option) {
    case 'b':
      puts("Put line numbers next to non-blank lines");
      break;
    case 'E':
      puts("Show the ends of lines as $");
      break;
    case 'n':
      puts("Put line numbers next to all lines");
      break;
    case 's':
      puts("Suppress printing repeated blank lines");
      break;
    case 'T':
      puts("Show tabs as ^I");
      break;
    case 'v':
      puts("Verbose");
      break;
    default:                          /* '?' */
      puts("What's that??");
    }
  }

  /* print the rest of the command line */

  puts("------------------------------");

  for (i = optind; i < argc; i++) {
    puts(argv[i]);
  }

  return 0;
}

假如你把程序编译为 args,你可以通过尝试不同的命令行参数组合,来了解程序是怎么解析短选项,以及是怎么将其它的命令行参数留下来的。最简单的例子是将所有的选项都放在最前面,就像这样:

$ ./args -b -T file1 file2
Put line numbers next to non-blank lines
Show tabs as ^I
------------------------------
file1
file2

现在试试将两个短选项合并使用的效果:

$ ./args -bT file1 file2
Put line numbers next to non-blank lines
Show tabs as ^I
------------------------------
file1
file2

如果有必要的话,getopt可以对命令行参数进行重排:

$ ./args -E file1 file2 -T
Show the ends of lines as $
Show tabs as ^I
------------------------------
file1
file2

如果用户输入了错误的短选项,getopt 会打印一条消息:

$ ./args -s -an file1 file2
Suppress printing repeated blank lines
./args: invalid option -- 'a'
What's that??
Put line numbers next to all lines
------------------------------
file1
file2

下载速查表

getopt 还有更多的功能。例如,通过设计 -s string-f file 这样的命令行语法规则,可以让短选项拥有自己的二级选项。你也可以告诉 getopt 在遇到无法识别的选项时不显示错误信息。使用 man 3 getopt 命令查看 getopt(3) 手册可以了解 getopt 的更多功能。

如果你需要 getopt()getopt_long()的使用语法和结构上的提示,可以 下载我制作的速查表。它提供了最小可行代码,并列出了你需要了解的一些全局变量的含义。速查表的一面是 getopt() 的用法,另一面是 getopt_long()的用法。


via: https://opensource.com/article/21/8/short-option-parsing-c

作者:Jim Hall 选题:lujun9972 译者:toknow-gh 校对:wxy

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

Canonical 正在为 Ubuntu 23.04 “Lunar Lobster” 开发一个新的精简 Ubuntu ISO 镜像。

在回答一位 Ubuntu 用户提出的关于精简 Ubuntu ISO 镜像的可能性的问题时,开发者确认正在开发一个官方的精简 ISO 镜像(小于 200MB)。上述工作已经在进行中,并取得了很大的进展。计划为即将发布的 Ubuntu 23.04 “Lunar Lobster” 引入一个替代性的精简安装程序。

Ubuntu 桌面的精简 ISO 镜像

Canonical/Ubuntu 从未正式支持过任何精简 ISO 镜像。在 Ubuntu 18.04 时代,遗留有一些非官方的 Ubuntu 精简 ISO 镜像,但它们都已经停产了。考虑到 Ubuntu Linux 的受欢迎程度,没有提供精简安装程序对一些人来说是个问题。

虽然有 Ubuntu 服务器镜像和 云镜像,但它们对于你的桌面使用情况来说,设置起来有点复杂。

例如,如果你想创建一个只有 GNOME 会话和基本功能的精简 Ubuntu 桌面,而不使用官方桌面安装程序,你只有一个选择:你需要安装 Ubuntu 服务器版作为基础,然后开始建立一个没有服务器组件的桌面。

虽然,Debian 已经提供了精简 ISO(即 netinst),它很容易使用,并且可以在任何程度上进行定制。但是,有一个类似于官方 Ubuntu 桌面定制版是一个好主意,可以根据需要建立你的系统(没有 Snap 或其他项目)。

根据邮件列表中的对话,ubuntu-mini-iso 的大小为 140MB,它需要通过网络下载几个软件包。它将提示你要下载的菜单项目。我猜它将类似于 Ubuntu 服务器版的菜单。

Ubuntu server install menu

同样,Ubuntu 的所有官方版本都可能有一个精简版本。然而,我不确定当你包括一个桌面环境时,它将如何精简。Xubuntu 的开发者 Sean Davis 宣布,一个精简版的 Xubuntu 镜像已经在开发中,并且可以作为 日常构建版 下载。

所以,总的来说,这是 Canonical 的一个令人兴奋的举动。如果一切顺利的话,你实际上可以使用这个 ISO 构建你自己的 Ubuntu。你可以只添加 GNOME 桌面、删除 Snap、从 Debian 软件库中安装 Firefox,并添加任何你想要的软件包。这将是一个不错的精简版 Ubuntu 桌面。

Ubuntu 23.04 BETA 计划于 2023 年 3 月 30 日发布;最终版本预计于 2023 年 4 月 20 日发布。那时候你就可以试试 minimal-ubuntu-iso 了。

参考自 邮件列表


via: https://debugpointnews.com/ubuntu-mini-iso-announcement/

作者:arindam 选题:lkxed 译者:wxy 校对:wxy

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

LastPass 被入侵源于其工程师家用电脑被黑

去年,著名的密码管理服务 LastPass 被入侵(#740),并被窃取了部分源代码和客户的保险库的 备份(859)。经过调查,该公司公布了更多关于其系统如何被攻击的细节,“威胁者利用从一名高级 DevOps 工程师那里偷来的有效凭证来访问一个共享的云存储环境……这是通过瞄准该工程师的家用电脑并利用一个脆弱的第三方媒体软件包来完成的。威胁者能够在员工用 MFA 认证后,捕捉到员工输入的主密码,并获得该工程师的 LastPass 公司保险库的访问权。”

消息来源:Dev Class
老王点评:远程工作越来越流行,其带来的安全风险敞口不可忽视。

Gmail 客户端加密现在公开可用

谷歌现在对谷歌工作空间企业版、教育版和教育标准版客户开放了 Gmail 客户端加密(CSE)。一旦启用,Gmail CSE确保作为电子邮件正文和附件(包括内联图像)的一部分发送的任何敏感数据在到达谷歌的服务器之前将是不可读和加密的。同样重要的是要注意,电子邮件的标题(包括主题、时间戳和收件人名单)将不会被加密。

消息来源:Bleeping Computer
老王点评:其实类似的技术,如 PGP,早就有了,但是一直难以推广开来。

OpenAI 现在与其承诺背道而驰

OpenAI 成立于 2015 年,原本是一家非营利性研究机构。在其成立声明中,该公司宣布其研究承诺 “以最有可能造福全人类的方式推进数字智能,不受产生经济回报的限制”。OpenAI 鼓励所有研究人员分享 “论文、博文或代码,我们的专利(如果有的话)将与世界共享”。但八年后的今天,我们面对的是一家既不透明也不以积极的人类影响为动力的公司。OpenAI 摆脱了其非盈利地位,建立了一个 “封顶利润” 部门,该公司现在可以接受投资,并将为投资者提供封顶为 100 倍的投资利润。OpenAI 也没有开源和公开它的技术,并且它开发的技术反而使更多人失业了。

消息来源:VICE
老王点评:终究成了自己当初最讨厌的模样——问题是,在商业上还挺成功。