2023年1月

这个 "猜数字 "游戏是学习新编程语言的一个很好的入门程序,因为它以一种相当直接的方式锻炼了几个常见的编程概念。

当你想 学习一种新的编程语言 时,把注意力放在编程语言的共同点上是很好的:

  • 变量
  • 表达式
  • 语句

这些概念是大多数编程语言的基础。一旦你理解了它们,你就可以开始琢磨其他的东西了。因为编程语言通常有相似之处,一旦你知道一种语言,你就可以通过了解其差异来学习另一种语言的基础知识。

学习新语言的一个好方法是用一个标准程序进行练习。这使你能够专注于语言,而不是程序的逻辑。在这个系列文章中,我使用了一个“猜数字”的程序,在这个程序中,计算机在 1 到 100 之间挑选一个数字,并要求你猜出来。程序循环进行,直到你猜对数字为止。

这个程序锻炼了编程语言中的几个概念:

  • 变量
  • 输入
  • 输出
  • 条件判断
  • 循环

这是一个学习新的编程语言的很好的实践实验。

安装 Ada

Ada 编程语言 是一种独特的、高度结构化的语言,有专门一群开发者使用它。Ada 的工具链是 GNU Ada 开发环境,多被称为 GNAT。

你可以使用你的发行版的包管理器在 Linux 上安装 GNAT。在 Fedora、CentOS 或类似系统上:

$ sudo dnf install gcc-gnat

在 Debian、Linux Mint 及衍生版上:

$ sudo apt install gnat

在 macOS 和 Windows 上,你可以从 Adacore 网站 下载一个安装程序(从下拉菜单中选择你的平台)。

在 Ada 中猜数字

创建一个名为 game.adb 的文件。

这个程序使用的两个内置 Ada 库:Text_IONumerics.Discrete_Random

with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Numerics.Discrete_Random;

过程头

过程 procedure 的名称必须与文件的名称一致。第一部分是定义变量。

注意,discrete_random 是专门针对特定范围的。在这里,允许数字范围:

procedure Game is
   type randRange is range 1..100;
   package Rand_Int is new ada.numerics.discrete_random(randRange);
   use Rand_Int;
   gen : Generator;
   num : randRange;
   incorrect: Boolean := True;
   guess: randRange;

过程逻辑

该逻辑从 reset(gen) 开始。这将初始化随机数发生器,确保每次运行程序时,用 random(gen) 初始化的数字将是不同的。

下一步是运行循环:

  • 输出猜测的指令
  • 读取该行
  • 将其转换为 randRange
  • 将其与数字进行核对

如果数字匹配,incorrect 被设置为 False,导致循环的下一次迭代退出。

最后,程序在退出前会打印出对猜测正确性的确认:

begin
   reset(gen);
   num := random(gen);
   while incorrect loop
       Put_Line ("Guess a number between 1 and 100");
       declare
          guess_str : String := Get_Line (Current_Input);
       begin
          guess := randRange'Value (guess_str);
       end;
       if guess < num then
           Put_line("Too low");
       elsif guess > num then
           Put_line("Too high");
       else
           incorrect := False;
       end if;
   end loop;
   Put_line("That's right");
end Game;

编译程序

编译 Ada 程序的最简单方法是使用 gnatmake

$ gnatmake game.adb
aarch64-linux-gnu-gcc-10 -c game.adb
aarch64-linux-gnu-gnatbind-10 -x game.ali
aarch64-linux-gnu-gnatlink-10 game.ali

这将生成一个名为 game 的二进制文件。

运行程序

程序的每次运行都会有一些不同。这是一个例子:

$ ./game 
Guess a number between 1 and 100
50
Too low
Guess a number between 1 and 100
75
Too low
Guess a number between 1 and 100
82
Too low
Guess a number between 1 and 100
90
Too high
Guess a number between 1 and 100
87
Too low
Guess a number between 1 and 100
88
That's right

学习 Ada

这个“猜数字”游戏是学习新的编程语言的一个很好的入门程序,因为它以一种相当直接的方式锻炼了几个常见的编程概念。通过在不同的编程语言中实现这个简单的游戏,你可以展示这些语言的一些核心概念,并比较它们的细节。

你有喜欢的编程语言吗?你会如何用它来写“猜数字”的游戏?请关注本系列文章,看看你可能感兴趣的其他编程语言的例子吧!


via: https://opensource.com/article/23/1/learn-ada-simple-game

作者:Moshe Zadka 选题:lkxed 译者:geekpi 校对:wxy

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

OBS Studio 29 是一个令人兴奋的版本,在所有平台上都有关键的改进。

OBS Studio 是最受欢迎的开源屏幕录制和流媒体软件之一。

许多 Linux 用户和内容创作者都在使用它,它有一套相当不错的工具和功能,可以让你录制和串流内容。

它的上一个主要版本发布于 2022 年 9 月,它带来了对苹果芯片的原生支持、更新了用户界面、改进了颜色支持等等。

它的下一个版本,即 v29,似乎有点意思,但对 Linux 用户来说变化不大 ?

OBS Studio 29 的新变化

OBS Studio 29

这个版本有大量的改进和修复;其中一些亮点包括:

  • 对 Linux 的媒体键支持
  • 新的音频过滤器
  • 改进的英伟达视频和音频过滤器
  • 更好的编码器支持
  • 各种修复和改进

媒体键支持: 你终于可以用键盘上的媒体键来控制 Linux 上的 OBS 的播放或音量了。

新的音频过滤器: OBS Studio 29 具有两个新的音频滤波器,一个向上压缩滤波器和一个 3 波段均衡器滤波器。

改进的英伟达视频和音频过滤器: 对这些过滤器进行了各种改进。

增加了一个新的屏蔽刷新滑块,同时支持时间处理,这应该是为了提供更好的屏蔽质量。

更好的编码器支持:,OBS Studio 29 对几个编码器的支持得到了改善,例如:

  • Windows 上的用于 AMD RX7000 系列 的 AV1 编码器。
  • Windows 上的用于英特尔 Arc GPU 的 AV1 编码器。
  • Windows 上的英特尔 HEVC 编码器。
  • macOS 上的原生 HEVC 和 ProRes 编码器。
? 注意,这些编码器只支持 Windows 或 macOS。可悲的是,他们少了对 Linux 的支持。我们希望在 OBS Studio 的未来版本中加入这些功能。

各种修复和改进: 除了上面列出的那些,OBS Studio 29 还有很多其他的变化,例如:

  • Websockets 5.1.0
  • 回放缓冲区的内存限制现在被限制在已安装的系统内存的 75%,而不是固定在 8GB。
  • 支持对 SRT 和 RIST 输出的加密和认证。
  • 能够检查和/或静音个别的浏览器底座。
  • 在视频捕获的情况下,支持更高的刷新率。

关于更多的技术细节,你可以查看 官方发布说明

下载 OBS Studio 29

要获得最新的 OBS Studio 29,你可以使用 Flatpak,这是推荐的方法。

你也可以看看其官方下载页面中提到的其他安装方法。

OBS Studio 29

via: https://news.itsfoss.com/obs-studio-29-release/

作者:Sourav Rudra 选题:lkxed 译者:wxy 校对:wxy

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

GPT-4 将有 100 万亿参数,与人类大脑神经元数量相当!

OpenAI 发布于 2020 年的 GPT-3 有 1750 亿个参数。根据传闻,即将在 2023 年初发布的 GPT-4 的参数约为 100 万亿。如果将参数比作人类的神经元,这一数量的参数大致相当于人类大脑中存在的神经元连接的数量,而人类实际上并没有使用我们大脑的全部容量。按照 GPT-3 对其前代产品的进步,GPT-4 将在能力、范围和潜力方面与我们目前的 GPT-3 版本的 ChatGPT 相比,可能拥有一个质的飞跃。

消息来源:Impakter
老王点评:我已经无法用想象力来想象 AI 能做到什么了,希望打开的不是潘多拉魔盒吧。

美联邦机构 1/5 的密码在安全审计中被破解

美国内政部最近的一次的安全审计发现,在测试的近 9 万个加密哈希值中,只用了 90 分钟就破解了 16% 的密码,最后有 21% 的账户密码被破解。这些被破解的密码涉及 28 个高价值资产中的 25 个,占比近 90%。破解这些密码只使用了一台价值 15000 美元的设备。值得注意的是,被破解的绝大多数密码都符合密码复杂性要求,该要求规定密码必须至少有 12 个字符,并且至少包含大写、小写、数字和特殊字符等四种字符类型中的三种。

消息来源:Ars Technica
老王点评:传统的“强密码”理论已经不合时宜。多个无关联的单词组成的长密码会更安全一些,最好是使用密码管理器生成随机密码,以及辅助使用多因子认证。

美国原住民要求阿帕奇基金会改名

美国的一个民间组织呼吁 阿帕奇软件基金会 Apache Software Foundation (ASF)改名,以尊重美国原住民,并遵守其自身的行为准则。他们指责 ASF 出于品牌推广的目的盗用原住民文化。该团体对他们所说的阿帕奇部落只存在于过去的历史背景中的说法提出异议。ASF 表示已经知晓此事,但“变化需要时间与成员、董事会和我们的法律团队进行仔细权衡。我们的成员正在探索其他解决方法。”

消息来源:The Register
老王点评:我觉得,要是没有 ASF,可能很多人都不知道阿帕奇部落,我不觉得这是恶意滥用。而且,据我所知,Apache 起名的部分灵感来自于对 NCSA 服务器的修补版。

下面是一份关于理解 Linux 和 BSD 中的 w 命令的初学者指南,并附有几个例子。

这篇文章是 Linux 命令学习系列的一部分。

w 命令

w 命令是 Linux 中的一个工具,它显示当前登录到系统中的用户及其进程的信息。它显示谁已登录,以及他们正在做什么活动。这意味着它可以显示他们在系统中运行什么进程。

语法

下面是 w 命令的基本语法:

w [options] [username]

w 命令接受一个可选的选项列表,然后是一个可选的用户名。如果指定了用户名,w 将只显示该用户拥有的进程信息。

w 命令的例子及其用法

下面是一些使用 w 命令的例子。

当你只用 w 运行它时,它显示以下输出:

$ w
 21:45:07 up 1 day, 12:48,  1 user,  load average: 1.05, 0.85, 0.56
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
debugpoi tty2       Thu08   36:48m  0.03s  0.03s /usr/libexec/gnome-session-binary

Linux 中 w 命令的基本输出

解释:USER 列给出了用户名,然后是终端号、登录日期时间、空闲时间、CPU 使用率,以及用户正在执行的进程。

  • USER - 在你的 Linux 或 BSD 系统中登录的用户名称。
  • TTY - 当前会话的终端标识符号。
  • FROM - 用户的主机名或 IP 地址。
  • LOGIN@ - 用户登录的时间。它有时会根据你的系统设置显示日期。
  • IDLE - 用户与终端交互后的空闲时间。
  • JCPU - 该会话的所有用户进程使用的 CPU 时间。
  • PCPU - 该用户的进程(在 WHAT 字段中提到)使用的时间。
  • WHAT - 当前带参数的进程。

下面是 w 命令的另一个例子,有两个用户在虚拟机环境中登录。正如你所看到的,显示了两个用户名与当前运行的带有进程参数的独立进程。

演示多用户环境的 w 命令输出

让我们看一下这个命令的一些选项。

要停止显示标题,使用 -h 选项。它与 --no-header 开关相同。

$ w -h

-f 选项可以在输出中切换 FROM 字段的可见性。

$ w -f

使用 -s 选项打印一个简短的输出,不包括 JCPUPCPULOGIN@ 信息。

$ w -s

要显示一个特定用户(例如,debugpoint)拥有的所有进程的列表:

$ w debugpoint

结束语

我希望这篇文章能帮助你了解 w 命令及其基本原理。你也可以阅读 w 手册页 来了解更多。如果你有任何问题,请告诉我。


via: https://www.debugpoint.com/w-command-linux-examples/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

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

微软准备向 OpenAI 追投 100 亿美元

OpenAI 开发了聊天机器人原型 ChatGPT 和文本图像创作工具 DALL-E。微软此前已经向 OpenAI 投资了 10 亿美元,如果再追投 100 亿美元,OpenAI 将达到 290 亿美元估值。根据融资条款,一旦 OpenAI 找到方法从 ChatGPT 等产品上赚钱,微软将获得利润的四分之三,直到收回初始投资,之后微软将拥有 OpenAI 的 49% 的股份。

消息来源:路透社
老王点评:这应该是微软近年来不多的最成功的投资之一。

Mastodon 用户活跃度下降三成

在 Twitter 被收购前,Mastodon 有大约 50 万活跃用户。之后,Mastodon 在 11 月份涌入了大量用户,到 12 月初它的活跃用户数达到了 250 万。据 Mastodon 统计,活跃用户数量自高峰期以来已经下降了 30% 以上,并且正在继续缓慢下降,1 月第一周约有 180 万活跃用户。许多从 Twitter 转移到 Mastodon 的用户可能重新回到了 Twitter,但仍然有很多用户留了下来。

消息来源:卫报
老王点评:虽然略有回落,但是 Mastodon 应该还会更好,我在考虑是不是也搭建一个服务器。

苹果应用商店的开发者迄今已赚取了 3200 亿美元

苹果公司今天分享了其订阅业务和全球应用程序商店的最新情况,指出自 2008 年以来,苹果公司已经向应用程序开发人员支付了创纪录的 3200 亿美元。苹果表示,它现在拥有超过 9 亿的苹果服务的付费用户,每周有来自全球 175 个地区的超过 6.5 亿访客访问其应用商店。

消息来源:Tech Crunch
老王点评:无论如何,苹果应用商店开创了一个新的时代。

在刚刚结束的 openEuler Summit 2022 上,华为服务器 OS 首席架构师、openEuler 社区技术委员会委员熊伟为广大开发者介绍了 openEuler 在过去 3 年的成就和成果。而其中最值得关注的是,openEuler 在云、服务器、边缘计算、嵌入式等四大场景下的八个技术方向的创新。

用熊伟博士的话来说,“在过去的三年里,openEuler 深入行业和产业,用八个技术方向的纵深创新,引领全场景的产业领先”。接下来,作为一个一直关注开源操作系统的技术人,我分享一下我的理解。

可编程内核:系统调度的极限追求

首先介绍一下可编程内核。

我们知道,内核是一个操作系统的核心。对于我们所熟悉的 PC 和服务器,由于对资源的消耗和性能的需求没有那么的敏感,无需毫厘必争,所以往往不太需要在内核层面做删减,正常使用即可。删减内核功能的成本可能远高于增加内存的成本。

但对于资源消耗和成本更加敏感的边缘计算、嵌入式设备来说,每一丝的资源占有,都是难以估量的成本。对于资源集群量级极大的云计算场景而言,每 0.1% 的性能优化,对于整个集群而言,都是十分可观的收益。一个可编程的内核相比于模块化的内核,为生产环境下的优化提供了更多的可能性 —— 工程师可以根据业务的实际变化,随时调整内核的实现和策略,从而优化系统的性能。

在这种情况下,对于内核进行组装,支持可编程能力,就变得极其重要。openEuler 创新性地借鉴了社区当中 eBPF 的思想,并在此基础之上,将内核的机制和框架进行了分离,将框架内置到内核,实现的功能和策略则可以在开发完成后,注入到内核中即可实现对内核二次编程的效果。

说起来简单,但在具体落实层面,openEuler 做了不少的工作来达成这个目标:

可编程内核

openEuler 在系统内核层面,提供了编写用户态策略的基础库函数和可配置的调度策略模板,可以帮助用户快速理解内核的编程方式。支持用户快速编排和扩展,降低用户对内核实现调整时的成本,降低上手的门槛。在具体的管理机制方面,则提供了对任务 / 进程 / 组 / 用户等对象的自定义拓展标签,从而承载了用户态与内核态、内核态组件之间协同调度的语义,实现了整个内核的统一调度,确保力往一处使。此外,openEuler 还在内核层面提供了丰富的钩子点位和辅助函数,从而支持对 CFS 调度类的选核、选任务、抢占流程的自定义策略注入。

对于普通的开发人员来说,也可以基于 openEuler 提供的可编程框架,来实现针对不同的应用场景来开发自定义策略,动态加载到内核执行,提升内核的执行效率,为整个业务系统降本增效。

除了内核级别的资源调度,在 openEuler 操作系统中,还实现了两种不同层面的混合部署:在线/离线业务混部和软硬实时混部。从这个角度看,openEuler 志在实现更多更大场景的统一管理和运筹。我们先来看一下在线/离线业务混部:

在线/离线业务混部:资源利用率和系统性能的极限平衡追求

对于任何规模化的业务来说,必然会存在波峰和波谷。如何平衡不同业务之间分配的资源从而实现资源的最大化利用,是一个极为重要的课题。

在 openEuler 当中,你可以使用可编程的内核来完成内核级别的资源调度;而在更上一层,openEuler 提供了完整的在线/离线业务混部能力。openEuler 为开发者提供了三层不同的层次的资源调度能力

在内核层,基于内核优先级隔离调度技术,对于 CPU、内存、IO/NET 等资源维度实现干扰隔离,从根源上优化资源调度和隔离的能力。在用户态,为用户提供了基于 Rubik 的动态配置和拓扑编排能力,同时配合新一代 QoS 感知资源调度器 Skylark 所提供的资源调度能力,从而实现为不同的 QoS 要求的混部业务提供合适的资源调度。

在线/离线业务混部

Rubik 为开发者提供了基于应用画像的应用调度机制,来实现自动的资源调度能力。通过自动注入技术,来实现业务的自动画像和自动分析,得出不同业务负载对于资源的敏感度和压力度。再基于画像和标记,对各节点的资源进行调度(如 CPU、内存带宽、缓存带宽、磁盘带宽、网络带宽等)和数据收集,并基于历史数据二次调度资源,均衡各不同业务对于资源的平均利用水平。

在应用调度之上,Rubik 还会基于业务指标进行一定程度上的节点资源超卖。通过对业务资源维度的采样,预测可压缩资源的使用情况,从而实现基于预测情况的超卖。在为在线业务准确预留所需资源,保障其 QoS 的同时,将未使用资源尽可能多地分配给离线业务,最大化离线业务的吞吐率,提升节点的资源利用率。

通过引入 Rubik 在离线混部解决方案,在保证业务 SLA 不下降的情况下,资源利用率从业界平均的 15% 提升到 35%。

Rubik 混部解决方案

除了在线/离线业务混部之外,openEuler 还支持软硬件层面的实时混部:

软硬实时混部:多层次确定性时延需求满足

在 openEuler 当中,集成了一个新的硬实时内核 uniProton,帮助开发者磨平底层的硬件平台的差异,提供一套标准统一的操作系统平台。uniProton 支持任务管理、事件管理、队列管理、硬中断管理等管理方式,兼容 POSIX 标准接口的开发,降低了开发者的开发成本。

而对于开发者而言,更重要的是 uniProton 是鸿蒙系统和 openEuler 共同支持的内核。开发者可以开发一套应用,同时运行在 openEuler 计算设备和鸿蒙设备上,降低了开发者的开发成本。

对于需要硬实时方案的开发者来说,配合 uniProton 和 openEuler 的系统镜像裁剪能力,可以实现 KB 级的系统镜像调度时延 < 3us;而可以接受软实时方案的开发者则可以选择基于内核自旋锁和信号量优先级继承机制,配合周期性、Workqueue 延时、负载均衡等任务驱逐机制,实现 20us 中断响应。

通过软硬实时方案的混部能力,openEuler 实现了 CPU 、内存等全域资源的隔离分区,满足了数控机床、传统工业场景下对于多层次确定性时延的需求,帮助 openEuler 开发者可以进行传统工业场景的开发。

openEuler 除了和鸿蒙系统共建 uniProton,还提供了一个更有价值的特性 —— 多芯片架构的支持。

异构互联:泛架构算力存储统一调度

openEuler 全版本支持 x86、ARM、申威、龙芯、RISC-V 等五大架构,并支持英特尔、AMD、兆芯等多款 CPU 芯片,支持多个硬件厂商发布的多款整机型号、板卡型号,对于开发者来说,可以轻松完成多个不同型号的设备之间的互联和统一调度。

异构融合统一调度

配合分布式软总线,可以实现鸿蒙设备和 openEuler 系统设备之间的即插即用、高效传输。开发者可以无需关注设备的发现机制,借助分布式软总线提供的通信机制,快速完成设备的发现、组网、连接和传输能力。开发者可以通过使用分布式软总线提供的 API 实现设备间的高速通信,无需关心通信细节,进而实现业务平台的高效部署与运行能力。

SysMaster: 安全可靠机制可靠的服务管理系统

除了上面介绍的各种内核、硬件方面的技术突破以外,openEuler 还在开发者最熟悉的初始化系统上做了一些探索和改进。

SysMaster

我们过去熟悉的初始化系统(比如 sysVinit、systemd、upstart),大多是使用 C 写的,且往往因为设计复杂,功能大一统等有违 UNIX 传统思维的做法而广受诟病。openEuler 社区为社区提供了一个全新的、采用 Rust 编写的初始化系统 —— SysMaster。

和 systemd 相比,由于 SysMaster 采用 Rust 语言编写,原生地规避了内存泄漏问题,开发者无需担心内存泄漏导致的 1 号进程挂掉。而从零构建的 SysMaster,也摒弃了之前的初始化系统中存在问题,为开发者提供了新一代的初始化系统

SysMaster

相比于过去的初始化系统,SysMaster 提供了全新的架构设计,分为 SysMaster Core 和 SysMaster Extend 两类。SysMaster Core 提供了极度轻量的调度方式,占用更少的资源,以及更快的启动速度。拆分的架构则可以支持拓展多种服务类型,实现 1+1+N 的架构,满足初始化系统的多样化诉求。而它的生态兼容工具,则可以让开发者可以自由选择 systemd 和 SysMaster,无需担心被生态绑定。

总结

openEuler 的技术创新覆盖的场景相当地丰富和深入,以至于我无法在一篇文章中逐一分析和披露所有细分场景和技术创新点。在撰写这篇文章时,给我的最大感受是“他们居然实现了!

对于一个产业的研发人员来说,毫无疑问,openEuler 的这些技术创新,将帮助产业和行业的开发者节省大量的时间,用更短的时间完成应用的建设,将精力投放在产业和业务当中,产生价值。

从过去的“要打造根社区”,到如今的“成为根社区,并从根出发,进入纵深领域创新”,openEuler 给我了太多的惊喜。假以时日,我相信,openEuler 还给我带来更多的震撼。