2022年7月

请下载我们的电子书获得在 Linux 和 FreeDOS 上 C 语言编程的提示和技巧。

有许多关于为什么 C 语言能够经久不衰的说法。或许是因为它语法简单明了。又或许是因为它常被认为是实用的语言,因为它不基于其他高级语言,可以在任何平台上编译运行。C 显然是一种强大的语言,并且我认为它经久不衰与它作为其他技术的基础的方式相关。这里有 5 项我喜爱的基于 C 语言的技术,希望它们能够帮助你更多的了解 C 语言。

1、GObject 和 GTK

C 语言不是面向对象编程的语言。它没有 class 关键字。 一些人用 C++ 进行面向对象编程,但是还有一些人坚持用 C 和 GObject 库。GObject 库为 C 语言提供了一个 class 结构体,GTK 项目以提供可通过 C 访问的工具包而闻名。没有 GTK ,就没有 GIMP (GTK 就是为此开发的)、GNOME 和其他成千上百流行的开源应用。

了解更多

GObject 和 GTK 是使用 C 开始进行 GUI 编程的绝佳方式。它们“装备精良”,可以让你用 C 语言进行图形应用的编程,因为开发者为你做了许多“繁重工作”。他们定义了类和数据类型,创建了工具包,你所要做的就是将所有东西放在一起。

2、Ncurses

如果 GTK 超过了你的需求,你或许认为一个 终端用户界面 terminal user interface (TUI)更适合你。Ncurses 库可以在终端创建“小部件”,创建一种在终端窗口上绘制图形的应用程序。你可以使用方向键控制界面,选择按钮和元素,就像不用鼠标来使用 GUI 应用一样。

了解更多

利用 Ncurses 库使用 C 语言写一个 猜数字 游戏。

3、Lua 和 Moonscript

Lua 是一种脚本语言,它可以使用内置的 C API 访问 C 语言库。它十分精巧、快捷以及简单,拥有约 30 个函数和少量内置库。你可以使用 Lua 进行系统自动化、游戏修改和脚本编写、使用 LÖVE 之类的前端进行游戏开发,或者使用 GTK 进行一般应用程序开发(例如 Howl 文本编辑器)。

了解更多

Lua 十分好的一点是你可以从它开始学习掌握基本的编程理念,然后当你有足够勇气直面基础编程语言时,再探索它的 C 语言 API 。另一方面,如果你只会 Lua ,那也没事儿。Lua 有很多的 外部库 ,使其成为各种开发方式的绝佳选择。

4、Cython

Lua 不是唯一带有 C 接口的编程语言。Cython 是一种编译器和编程语言,旨在使为 Python 编写 C 扩展就像编写 Python 代码一样容易。本质上,你可以编写 Python 并最终得到 C 语言程序。最简单的示例:

print("hello world")

创建一个 setup.py 脚本:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("hello.pyx")
)

运行该 setup 脚本:

$ python3 ./setup.py

最后你会在同一个目录中得到一个 hello.chello.cpython-39-x86_64-linux-gnu.so 文件。

了解更多

Cython 是 Python 的一个超集,支持 C 语言的函数和数据类型。它不可能帮你直接学习 C 语言,但它为希望学习 C 代码并将其集成到 Python 中的 Python 开发人员开辟了新的可能性。

5、FreeDOS

了解更多 C 语言的最好方式是编写 C 代码,没有什么比写你可以真正使用的代码更令人激动的了。FreeDOS 项目是 DOS 的开源实现, 而 DOS 是 Windows 的前身。或许你已经用过 FreeDOS 了,或者作为运行 BIOS 更新程序的便捷开源方法,或者在模拟器中玩经典的计算机游戏。你可以用 FreeDOS 做更多事情。它是学习 C 语言的理想平台,其中包含一系列工具,鼓励你编写自己的命令和简单(或不那么简单,如果你愿意)的应用程序。当然你可以在任何系统上写 C 代码,但是 FreeDOS 的便利可能会让你感到耳目一新。天空有极限,但即使在地面上,你也可以用 C 做一些非常有趣的事情。

下载电子书

你可以从我们编写的新 电子书 中学到更多 C 语言,并在我们的电子书中了解有关 FreeDOS 上 C 语言的更多信息。这些是编程文章的集合,可帮助你学习 C 语言,并演示如何以有用的方式用 C 写一些代码。

下载电子书

via: https://opensource.com/article/22/7/learn-c-linux

作者:Alan Smithee 选题:lkxed 译者:Donkey 校对:wxy

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

使用我在 Linux 上制作的这个 C 程序在旅途中聆听你喜爱的歌曲。

我最近在 Linux 中编写了一个 C 程序,从我广泛的 MP3 库中创建一个较小的随机 MP3 文件选集。该程序会遍历一个包含我的 MP3 库的目录,然后创建一个包含随机的、较小的歌曲选集的目录。然后我将这些 MP3 文件复制到我的智能手机上,以便随时随地收听。

瑞典是一个人口稀少的国家,有许多农村地区没有完整的手机覆盖。这就是在智能手机上拥有 MP3 文件的原因之一。另一个原因是我并不总是有钱购买流媒体服务,所以我喜欢拥有自己喜欢的歌曲的副本。

你可以从它的 Git 仓库 下载我的应用。我专门为 Linux 编写了它,部分原因是在 Linux 上很容易找到经过良好测试的文件 I/O 例程。多年前,我尝试使用专有的 C 库在 Windows 上编写相同的程序,但在尝试文件复制时遇到了困难。Linux 使用户可以轻松直接地访问文件系统。

本着开源的精神,我没费多少力气就找到了 Linux 的文件 I/O 代码来激发我的灵感。我还发现了一些启发了我的分配内存的代码。我编写了随机数生成的代码。

该程序的工作方式如下所述:

  1. 询问源目录和目标目录。
  2. 询问存放 MP3 文件的目录下的文件个数。
  3. 搜索你希望复制的收藏的百分比(从 1.0% 到 88.0%)。如果你有 1000 个文件的集合,并希望从你的集合中复制 125 个文件而不是 120 个文件,你也可以输入 12.5% 之类的数字。我将上限设置为 88%,因为复制超过 88% 的库将基本生成与你的基础库相似的库。当然,代码是开源的,因此你可以根据自己的喜好自由修改。
  4. 使用指针和 malloc 分配内存。一些操作需要内存,包括代表音乐收藏中文件的字符串列表。还有一个列表来保存随机生成的数字。
  5. 生成所有文件范围内的随机数列表(例如,如果集合有 1000 个文件,则为 1 到 1000)。
  6. 复制文件。

其中一些部分比其他部分更简单,但代码只有大约 100 行:

#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h> /* include necessary header files */
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define BUF_SIZE 4096 /* use buffer of 4096 bytes */
#define OUTPUT_MODE 0700 /*protect output file */
#define MAX_STR_LEN 256

int main(void) {
  DIR *d;
  struct dirent *dir;
  char strTemp[256], srcFile[256],
  dstFile[256], srcDir[256], dstDir[256];
  char **ptrFileLst;

  char buffer[BUF_SIZE];
  int nrOfStrs=-1, srcFileDesc,
  dstFileDesc, readByteCount,
  writeByteCount, numFiles;
  int indPtrFileAcc, q;

  float nrFilesCopy;
  // vars for generatingRandNumList
  int i, k, curRanNum, curLstInd,
  numFound, numsToGen, largNumRange;
  int *numLst;

  float procFilesCopy;
  printf("Enter name of source Directory\n");
  scanf("%s", srcDir);
  printf("Enter name of destionation Directory\n");
  scanf("%s", dstDir);
  printf("How many files does the directory with mp3 files contain?\n");
  scanf("%d", &numFiles);
  printf("What percent of the files do you wish to make a random selection of\n");
  printf("enter a number between 1 and 88\n");
  scanf("%f", &procFilesCopy);

  // allocate memory for filesList, list of random numbers
  ptrFileLst= (char**) malloc(numFiles * sizeof(char*));

  for (i = 0; i < numFiles; i++) {
    ptrFileLst[i] = (char*)malloc(MAX_STR_LEN * sizeof(char));
  }
  
  largNumRange = numFiles;
  nrFilesCopy = (procFilesCopy / 100) * numFiles;

  numsToGen = (int)((procFilesCopy / 100) * numFiles);
  printf("nrFilesCopy=%f", nrFilesCopy);
  printf("NumsToGen=%d", numsToGen);
  numLst = malloc(numsToGen * sizeof(int));
  srand(time(0));

  numLst[0] = rand() % largNumRange + 1;
  numFound=0;
  do { 
    curRanNum = (int)rand() % largNumRange + 1;
    if (numLst[0] == curRanNum) {
      numFound=1; 
    }
  } while(numFound == 1);

  numLst[1] = curRanNum;
  getchar();
  curLstInd = 1;
  i = 0;
  while(1) {
    do {
      numFound = 0;
      curRanNum = (int)rand() % largNumRange + 1;
      for (int k = 0; k <= curLstInd; k++){
        if (numLst[k] == curRanNum)
        numFound = 1;
      }
    } while(numFound == 1);
    numLst[curLstInd+1] = curRanNum;
    curLstInd++;
    i++;
    // numsToGen=Total numbers to generate minus two
    // already generated by the code above this loop
    if (i == (numsToGen-2))
      break;
    }

    d = opendir(srcDir);
    if (d) {
      while ( (dir = readdir(d)) != NULL ) {
      strcpy(strTemp, dir->d_name);

      if (strTemp[0] != '.') {
        nrOfStrs++;
        strcpy(ptrFileLst[nrOfStrs], strTemp);
      } 
    }
    closedir(d); 
  }

  for (q = 0; q <= curLstInd; q++) {
    indPtrFileAcc = numLst[q];
    strcpy(srcFile, srcDir);
    strcat(srcFile, "/");
    strcat(srcFile, ptrFileLst[indPtrFileAcc]);
    strcpy(dstFile, dstDir);
    strcat(dstFile, "/");
    strcat(dstFile, ptrFileLst[indPtrFileAcc]);
    
    srcFileDesc = open(srcFile, O_RDONLY);
    dstFileDesc = creat(dstFile, OUTPUT_MODE);

    while(1) {
      readByteCount = read(srcFileDesc, buffer, BUF_SIZE);
      if (readByteCount <= 0) 
        break;
      
      writeByteCount = write(dstFileDesc, buffer, readByteCount);
      if(writeByteCount <= 0)
        exit(4);
    }

    //close the files 
    close(srcFileDesc);
    close(dstFileDesc); 
  }
}

这段代码可能是最复杂的:

while(1) {
  readByteCount = read(srcFileDesc, buffer, BUF_SIZE);
  if (readByteCount <= 0) 
    break;

  writeByteCount = write(dstFileDesc, buffer, readByteCount);
  if (writeByteCount <= 0)
      exit(4); 
}

这将从指定的文件中读取多个字节(readByteCount)到字符缓冲区中。该函数的第一个参数是文件名(srcFileDesc)。第二个参数是一个指向字符缓冲区的指针,这之前在程序中声明过。该函数的最后一个参数是缓冲区的大小。

程序返回读取的字节数(在本例中为 4 个字节)。如果返回的数字为 0 或更少,则第一个 if 子句会跳出循环。

如果读取字节数为 0,则所有写入完成,循环中断以写入下一个文件。如果读取的字节数小于 0,则发生错误并退出程序。

当读取 4 个字节时,它会写入它们。write 函数接受三个参数。第一个是要写入的文件,第二个是字符缓冲区,第三个是要写入的字节数(4 个字节) .该函数返回写入的字节数。

如果写入了 0 个字节,则发生了写入错误,因此第二个 if 子句退出程序。

while 循环读取并复制文件,一次 4 个字节,直到文件被复制。复制完成后,你可以将随机生成的 mp3 文件的目录复制到你的智能手机。

复制和写入例程相当有效,因为它们使用 Linux 中的文件系统调用。

改进代码

该程序很简单,可以在用户界面和灵活性方面进行改进。例如,你可以实现一个计算源目录中文件数量的函数,这样你就不必手动输入它。你可以添加选项,这样你就可以非交互地传递百分比和路径。但是代码做了我需要它做的事情,它是 C 编程语言简单效率的演示。


via: https://opensource.com/article/22/7/c-linux-mp3

作者:Rikard Grossman-Nielsen 选题:lkxed 译者:geekpi 校对:wxy

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

在本指南中,我们将解释在 Arch Linux 中安装漂亮的深度桌面(DDE)所需的步骤。

指南的第一部分解释了安装 Arch 基本系统的步骤。第二部分是在 Arch Linux 的基础上安装完整的深度桌面。

什么是深度桌面(DDE)?

深度操作系统 是一个基于 Debian 稳定分支的、功能丰富且漂亮的桌面环境。深度桌面环境(DDE)是深度操作系统自主开发的桌面环境。它由它自己的 dde-kwin 窗口管理器驱动。深度桌面带有漂亮的停靠区和许多预装的深度原生的应用程序。

这个令人眼花缭乱的桌面环境 可在 Arch 仓库中找到;这篇文章介绍了如何在 Arch Linux 中安装深度桌面。

本指南安装深度桌面环境 20.1。然而,其他版本的步骤也应该是类似的。

第一部分:安装 Arch Linux

如果你已经安装了 Arch Linux,你可以跳过这一步,直接进入安装深度桌面部分。

要快速安装基本的 Arch Linux,请按照以下步骤进行。你也可以访问 本指南 了解以双启动或在虚拟机上安装 Arch Linux 的完整教程。

下载 Arch Linux

从下面的链接下载 Arch Linux 的 .iso 文件。这里有磁力链和 BT 链接。一旦你下载好了,就把 ISO 写入 U 盘。然后从该驱动器启动。

下载 Arch Linux

如果你打算通过 GNOME Boxesvirt-manager 将其安装为虚拟机镜像 —— 那么你不需要将其写入 U 盘。

启动和配置分区

从 Arch Linux ISO 启动后,你必须运行一系列的命令来安装基本系统。

首先,运行下面的命令,找出设备的标识符。

fdisk -l

fdisk -l 之前的分区

然后用此设备标识符,运行下面的命令,开始对你的磁盘进行分区。请确保根据你的系统而修改下面的 /dev/sda 参数。

cfdisk /dev/sda

在下一个提示中选择 label type = dos

选择可用空间,并从底部选择 “NEW” 选项。在这个例子中,我将创建三个分区,如下所示:

/dev/sda1 - 1G - for /boot
/dev/sda2 - 5G - for root
/dev/sda3 - 1G - for swap

cfdisk

在下一个屏幕中,提供启动分区(/boot)的大小(在这个例子中,我给出了 1GB)。选择它作为主分区。

对 5GB 大小的主根分区(/)重复同样的步骤。

改变交换分区的类型

用同样的步骤创建一个大小为 1G 的交换分区(你可以根据你的需要改变大小)。创建交换分区后,确保在底部选择类型,并将其标记为 “Linux Swap/Solaris” 选项的交换分区。

cfdisk 的最终分区列表

完成后,用底部的 “Write” 选项将变化写到磁盘上。确保你在写之前做一个备份,因为这是你系统中的一个永久性的改变。

在你继续之前,运行下面的命令来检查。在这个例子中,你可以看到,列出了三个分区。

fdisk -l

fdisk 中的最终分区列表

依次运行下面的命令,在上面新创建的分区中格式化并创建一个 ext4 文件系统。确保你根据你的需要改变 /dev/sda1/dev/sda2 参数。

mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/sda2
mkswap /dev/sda3
swapon /dev/sda3

完成后,挂载系统并创建必要的目录。

mount /dev/sda2 /mnt
mkdir /mnt/boot /mnt/var /mnt/home
mount /dev/sda1 /mnt/boot

同样,确保你根据你的系统改变 /dev/sda1/dev/sda2/dev/sda3 参数。

准备文件系统

安装基本系统

我希望你已经连接到互联网了。如果没有,请尝试使用 USB 网卡或有线网络连接,Arch 安装程序会自动配置和检测。如果你没有可用的有线连接,请按照本指南使用 Arch Linux 安装程序配置无线 Wi-Fi 网络。

依次运行下面的命令,将基本系统安装到挂载的分区中。下载的大小约为 400MB。

pacman -Syy
pacstrap /mnt base base-devel linux linux-firmware nano dhcpcd net-tools grub

安装基本系统

一旦完成,生成一个文件系统表,没有这个表你就无法启动系统。

genfstab -U /mnt >> /mnt/etc/fstab

配置基本系统

依次按照下面的命令来配置基本系统。这包括设置你的地区和语言,添加一个登录用户,以及设置互联网。

arch-chroot /mnt
nano /etc/locale.gen

去掉开头的 #,取消对你选择的语言环境的注释。在本指南中,我选择了 en_US.UTF-8 UTF-8。按 CTRL+O、回车和 CTRL+X 退出 nano。

改变语言环境

使用以下方法生成语言环境数据。

locale-gen

使用下面的命令设置语言。

echo LANG=en_US.UTF-8 > /etc/locale.conf
export LANG=en_US.UTF-8

设置本地时区。

ln -s /usr/share/zoneinfo/America/New_York /etc/localtime

同样,你可以根据你的需要来选择它们。你可以通过以下命令列出本地时区。

ls /usr/share/zoneinfo
ls /usr/share/zoneinfo/America

依次使用下面的命令设置硬件时钟、创建主机名并启用互联网的 DHCP。你可以根据你的想法把 debugpoint-pc 改为任何主机名。

hwclock --systohc --utc
echo debugpoint-pc > /etc/hostname
systemctl enable dhcpcd

下一步是设置 root 用户的密码、创建一个管理员用户,并将该用户添加到 sudoers 文件中。

按照下面的命令依次进行。确保根据你的需要将用户名debugpoint 改为其他名称。

passwd rootuseradd -m -g users -G wheel -s /bin/bash debugpointpasswd debugpoint

创建用户

打开 sudoers 文件,添加以下几行。

nano /etc/sudoers

添加下面几行。由于你已经创建了 root 用户,该条目应该已经有了。

root ALL=(ALL) ALL
debugpoint ALL=(ALL) ALL

更新 sudoers 文件

安装 GRUB,建立初始的 Ramdisk 环境,并使用下面的命令卸载系统。

grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
mkinitcpio -p linux
exit

配置 GRUB

然后重新启动你的系统。

umount /mnt/boot
umount /mnt
reboot

现在你已经成功地安装了 Arch Linux 基本系统。现在是安装完整的深度桌面的时候了。

第二部分:在 Arch Linux 中安装深度桌面

重新启动后,从 GRUB 中选择 Arch Linux。在 Arch Linux 的提示符下,开始依次运行以下命令。这些命令安装 Xorg 服务器、Lightdm 显示管理器和深度桌面组件。

对于所有的命令,使用默认的包版本,即在询问时按回车。

安装 Xorg 和显示管理器。大约安装大小为 80 MB。

sudo pacman -S --need xorg lightdm

安装额外的组件和应用程序(约 550 MB)。

sudo pacman -S --need deepin deepin-extra

安装完成后,通过修改 Lightdm 配置文件启用深度欢迎页。按照下面的命令。

nano /etc/lightdm/lightdm.conf

并添加下面这一行。保存该文件(CTRL+OCTRL+X)。

greeter-session=lightdm-deepin-greeter

在 Lightdm 登录页中添加深度欢迎欢迎页

现在是时候把显示管理器和网络管理器作为服务启用了。这样,下次登录时,它们就可以由 systemd 自动运行。

systemctl enable lightdm
systemctl enable NetworkManager

启用 Lightdm 和网络

使用 reboot 命令重新启动系统。

reboot

如果一切顺利,你应该看到深度桌面的登录提示。使用你刚刚在上面的步骤中创建的凭证登录。你应该会看到最新的深度桌面环境。

Arch Linux 中的深度 20.1 登录屏幕

Arch Linux中的深度桌面 20.1

总结

我希望这个指南能帮助你在 Arch Linux 中安装深度桌面。虽然它不是我的日常环境,我觉得深度的桌面在本质上有些慢。可能是因为有太多的颜色渲染和动画,而且尽管它是建立在 Qt 上的,但没有为深度桌面进行适当的优化。


via: https://www.debugpoint.com/deepin-arch-linux-install-20/

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

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

字节跳动提交补丁将内核重启时间降低高达半秒

通过使用 Kexec,可以避免了服务器加电重启等任务带来的停机时间。但是,即使使用 Kexec 来切换到一个新的内核,仍然可能需要太多的停机时间。通过字节跳动提交的新补丁,这些时间可以被优化掉 500ms,从而使启动内核功能的时间降低到只有 15ms。像许多其他大型组织一样,字节跳动依靠 Kexec 重启来转移到新的内核。

消息来源:Phoronix
老王点评:随着中国科技公司对 Linux 的重视,对 Linux 的贡献也越来越多,越来越重要。我认为,这才是取得在 Linux 和开源领域话语权的重要方式。

实时 Linux 内核支持接近进入主线

多年来,一直有关于 PREEMPT\_RT “即将” 进入主线的说法,但限于资金而最终没有实现。PREEMPT\_RT 支持是构建实时 Linux 内核的两个“路障”之一。今年的变化是英特尔收购了 Linutronix 公司,该公司是参与 PREEMPT\_RT 补丁的主要公司之一。如果在下周的合并窗口前及时审查/签署了最后几个剩余部分,那么对 PREEMPT\_RT 支持可能最终会在即将到来的 Linux 5.20 周期中被主线化。

消息来源:Phoronix
老王点评:一旦 Linux 对实时内核的支持能进入主线,Linux 的疆域将又扩大一大块。

统信 UOS 的软硬件生态适配数量突破 50 万

统信软件宣布,统信 UOS 软硬件兼容适配认证总数达 529903 款,其中包括:应用软件兼容适配组合数约 30 万,外设兼容适配组合数约 19 万。统信软件已经搭建了北京、武汉、广州三大适配中心,成立了 AI 信创联合攻关适配实验室。同时,统信与 4800 家厂商达成合作,统信生态社区累计注册 23 万用户。

消息来源:统信
老王点评:统信发力企业级操作系统以来,取得的进步也是有目共睹的。我已经感觉到了国内企业级操作系统战国群雄并起的形势了。

下面我将介绍我是如何在 Linux 的 GNOME 桌面上使用 Rhythmbox 听在线音乐和 MP3 列表的。

对我来说,在完全安静的环境下工作是很困难的。我需要某种背景音,最好是一些熟悉的音乐。我在音乐上的需求很简单:我只需要一个音乐播放器,可以播放我的 MP3 音乐库和少数几个我喜欢的网站的在线音乐。

我在 Linux 上尝试了多个音乐播放器,最终我还是选择了 Rhythmbox。 Rhythmbox 是一个 GNOME 桌面音乐播放器。如果你的 Linux 发行版使用的是 GNOME 桌面,很可能已经安装了 Rhythmbox。它很简单,用来播放我本地的音乐库和广播网站的在线音乐。我很乐意在 Linux 上使用 Rhythmbox 收听在线音乐和我自己的音乐库。

在 Linux 上收听在线音乐

Rhythmbox 支持多个在线音乐服务商。如果你拥有一个 Last.fm 或者 Libre.fm 的帐号,你可以点击左侧的标签登录。或者,你想收听在线广播,点击左侧的“ 广播 Radio ”标签,在预设的广播网站中选择一个。在我写代码的时候我通常喜欢听迷幻舞曲,HBR1 Tranceponder 是我最喜欢的一个在线广播网站。

Streaming HBR1 Traceponder

在 Linux 上播放我的音乐库

在过去的几年中,我收集了大量的 MP3 音乐。由于几年前 MP3 的专利在美国已经到期,它在 Linux 是一种很好用的开放的音乐格式。

我把我 20GB 的 MP3 音乐保存在我的主目录之外,在 /usr/local/music 。要把音乐导入 Rhythmbox,点击 “ 导入 Import ” 按钮,选择 usr/local/music 目录,或者任何你保存音乐的目录,让 Rhythmbox 去识别 MP3 音乐。结束以后点击 “ 导入列出的曲目 Import listed tracks ” 按钮导入就完成了。

Use the Import button to add music to Rhythmbox

Rhythmbox identifies new music files

Rhythmbox 可以播放我的音乐,并通过类型,艺术家和专辑组织歌曲,所以我可以很容易找到我想听的音乐。

Listening to a music library in Rhythmbox

旋律永存

我愿意在 Linux 上使用 Rhythmbox 作为我的音乐播放器,它是如此简洁,不会影响到我。而且听音乐可以帮我和谐掉日常的噪音,让我每一天都可以过的快一点。

(文内图片来自 Jim Hall,CC BY SA)


via: https://opensource.com/article/22/7/listen-music-rhythmbox-linux

作者:Jim Hall 选题:lkxed 译者:duoluoxiaosheng 校对:wxy

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

程序员奶爸用 AI 解决婴儿喂奶难题

国外一位程序员喜得贵子之后,颇受婴儿喂奶之苦 —— 我想养过孩子的人都有过这种体验。但是作为 AI 工程师,他花费了 50 个小时开发了一套 AI 系统,通过识别婴儿状态来判断是否该喂奶了,并通过手机发送通知给他去喂奶 —— 而不是给他老婆,从而可以让老婆有个良好睡眠。甚至,他还进一步开发了一套全自动喂奶装置,虽然还不太尽如人意,但是已经让全世界奶爸们感到了希望,纷纷催促他开源。

消息来源:Reddit
老王点评:真是技术解救程序员,如果你觉得你的编程技术没帮到你,那只是你的技术还不够好。

国内 Go 语言爱好者发起新编程语言:凹语言

国内三位 Go 语言爱好者发起了一种实验性的新编程语言:凹语言™(读作“Wa”)。但从其官网看,这个语言似乎从 2019 年就开始设计了。目前代码已经发布在 Github,并且提供了简单可执行的示例,不过该项目采用了“保留所有权利”的版权声明(可能是还没来得及确定许可证)。在语言设计中遵循了 Go 语言克制的风格,大量借鉴了 Go 的设计思想和具体实现。比较有趣的特性包括:披着 Go 和 Rust 语法外衣的 C++ 语言;其 WaGo 语法是 Go 的真子集;支持中文/英文双语关键字,任一关键字均有等价的中文及英文版。

消息来源:凹语言
老王点评:一个好玩的业余项目,不够最让我印象深刻的反而是这个语言的名字。

大多数开源开发者都在关注新的工作机会

根据一份基于面向全球 1400 名应用开发者、IT 管理人员、运营和业务管理专业人才的问卷报告显示,尽管还算满意,但 44% 的开发者仍在关注工作选择;另外 10% 的受访者对他们目前的工作不满意。2/3 的受访者声称分配给他们的工作量增加。调查还显示,1/3 的受访者会考虑离开目前的职位,以便有机会使用更尖端的技术,比 2021 年仅 16% 的比例高出一倍。

消息来源:Info World
老王点评:程序员嘛,要么少干活多拿钱,要么可以学技术,你总的至少满足一样。