2021年8月

这个 shell 脚本 styli.sh 可以帮助你每小时自动改变你的 Linux 桌面壁纸,并且有几个选项。

用一张漂亮的壁纸来开始你的一天,你的桌面让人耳目一新。但寻找壁纸,然后保存,最终设置为壁纸,是非常麻烦的。所有这些步骤都可以通过这个叫做 styli.sh 的脚本完成。

styli.sh - 每小时改变你的 Linux 桌面壁纸

这是一个 shell 脚本,你可以从 GitHub 上下载。当运行时,它从 Reddit 的热门版块中获取壁纸并将其设置为你的壁纸。

该脚本适用于所有流行的桌面环境,如 GNOME、KDE Plasma、Xfce 和 Sway 窗口管理器。

它有很多功能,你可以通过 crontab 来运行这个脚本,并在特定的时间间隔内得到一张新的壁纸。

下载并安装、运行

打开一个终端,并克隆 GitHub 仓库。如果没有安装的话,你需要安装 feh 和 git。

git clone https://github.com/thevinter/styli.sh
cd styli.sh

要设置随机壁纸,根据你的桌面环境运行以下内容。

Change your Linux Desktop Wallpaper Every Hour using styli.sh

GNOME:

./styli.sh -g

Xfce:

./styli.sh -x

KDE Plasma:

./styli.sh -k

Sway:

./styli.sh -y

每小时改变一次

要每小时改变背景,请运行以下命令:

crontab -e

并在打开的文件中加入以下内容。不要忘记改变脚本路径。

@hourly script/path/styli.sh

改变版块

在源目录中,有一个名为 subreddits 的文件。它填满了一些标准的版块。如果你想要更多一些,只需在文件末尾添加版块名称。

更多配置选项

壁纸的类型、大小,也可以设置。以下是这个脚本的一些独特的配置选项。

设置一个随机的 1920×1080 背景:

./styli.sh

指定一个所需的宽度或高度:

./styli.sh -w 1080 -h 720
./styli.sh -w 2560
./styli.sh -h 1440

根据搜索词设置壁纸:

./styli.sh -s island
./styli.sh -s “sea sunset”
./styli.sh -s sea -w 1080

从设定的一个版块中获得一个随机壁纸:

注意:宽度/高度/搜索参数对 reddit 不起作用。

./styli.sh -l reddit

从一个自定义的版块获得随机壁纸:

./styli.sh -r
./styli.sh -r wallpaperdump

使用内置的 feh -bg 选项:

./styli.sh -b
./styli.sh -b bg-scale -r widescreen-wallpaper

添加自定义的 feh 标志:

./styli.sh -c
./styli.sh -c –no-xinerama -r widescreen-wallpaper

自动设置终端的颜色:

./styli.sh -p

使用 nitrogen 而不是 feh:

./styli.sh -n

使用 nitrogen 更新多个屏幕:

./styli.sh -n -m

从一个目录中选择一个随机的背景:

./styli.sh -d /path/to/dir

最后说明

这是一个独特且方便的脚本,内存占用小,可以直接在一个时间间隔内比如一个小时获取图片。让你的桌面看起来 新鲜且高效。如果你不喜欢这些壁纸,你可以简单地从终端再次运行脚本来循环使用。

你喜欢这个脚本吗?或者你知道有什么像这样的壁纸切换器吗?请在下面的评论栏里告诉我。


via: https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/

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

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

亚马逊夺走了 Alexa 这个名字

Alexa 曾经是一个主要给婴儿的名字,现在它主要用于机器人。七年前,亚马逊发布了其语音助手 Alexa,随着这个设备的数量激增,它在美国父母中的受欢迎程度却直线下降。它是近年来所有流行名字中跌幅最大的一个。美国的父母们开始意识到,拥有这个名字可能是一种困扰。现在,估计有超过 9000 万美国成年人在家里有一个智能音箱。

还好我们没啥人愿意叫“天猫精灵”、“小度”、“小爱”。

微软在 Windows 11 中增加了切换默认浏览器的难度

与 Windows 10 一样,当你在 Windows 11 中安装一个新的浏览器并首次打开一个网络链接时,会有一个提示出现。不过,这也是唯一可以轻松切换浏览器的机会。除非你勾选“始终使用此应用程序”,否则默认值将永远不会被改变。微软已经改变了 Windows 11 中默认应用程序的分配方式,这意味着你现在必须按文件或链接类型设置默认,而不是单一的开关,你需要同时改变 HTM、HTML、PDF、SHTML、SVG、WEBP、XHT、XHTML、FTP、HTTP 和 HTTPS 等的默认文件类型。Mozilla、Opera 和 Vivaldi 等浏览器竞争对手对此表示担忧。微软将这些变化解释为允许 Windows 用户对默认值有更多控制。

我觉得微软使用这种小花招真是无趣和低级,不过其它浏览器只需要稍微内卷一点就能解决这个问题。

乌克兰反盗版公司要求 Google 屏蔽 127.0.0.1

乌克兰电视台 TRK 雇佣的反盗版公司向 Google 递交了 DMCA 通知,要求从搜索结果中移除 127.0.0.1:6878 下的一个 URL。127.0.0.1 通常指向的是本地计算机,该 IP 对应的应该是网站服务器上的一个文件,但没有开启对外访问,而 Google 也不可能对此采取任何行动。该反盗版之后回应说,它是在 tvizor.org 网站的 HTML 代码中发现这个 127.0.0.1 链接的。

这就是典型的 DMCA 滥用表现,它们只是随意对他们想提出申诉的内容提起 DMCA,反正也不花钱。

让用户用命令行选项调整你的 Java 应用程序运行方式。

 title=

通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用 命令行选项 options or switches or flags 以下简称选项)来修改应用程序的运行方式。这是 POSIX 规范 设定的标准,因此能够检测和解析选项对 Java 程序员而言是很有用的技能。

Java 中有若干种解析选项的方法,其中我最喜欢用的是 Apache Commons CLI 库,简称 commons-cli

安装 commons-cli

如果你使用类似 Maven 之类的项目管理系统以及 集成开发环境 Integrated Development Environment (简称 IDE),可以在项目属性(比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。

而如果你采用手动方式管理库,则可以从 Apache 网站下载 该库的最新版本。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 commons-cli-X.Y.jar(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。

将库导入至 Java 代码

在使用 commons-cli 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 Main.java 文件中简单写入以下标准代码:

package com.opensource.myoptparser;

import org.apache.commons.cli.*;

public class Main {
    public static void main(String[] args) {
    // code 
    }
}

至此在 Java 中解析选项的准备工作已经做好了。

在 Java 中定义布尔选项

要实现解析选项,首先要定义应用程序可接收的有效选项。使用 Option(注意是单数)类来创建选项对象,使用 Options(注意是复数)类来追踪项目中创建的所有选项。

首先为选项创建一个组,按照惯例命名为 options

    //code
    Options options = new Options();

接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 alpha 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 options 组对象中。在下面几行代码中,我只创建了一个选项,命名为 alpha

    //define options
    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
    options.addOption(alpha);

在 Java 中定义带参选项

有时用户需要通过选项提供 truefalse 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 builder 方法,根据选项名简写为其创建属性(例如,-c 是短选项,--config 是长选项)。完成定义后,再将定义好的选项添加到 options 组中:

    Option config = Option.builder("c").longOpt("config")
        .argName("config")
        .hasArg()
        .required(true)
        .desc("set config file").build();
    options.addOption(config);

builder 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 true,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。

使用 Java 解析选项

定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 CommandLine 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 CommandLineParser 对象,我在代码中将其命名为 parser。最后,还可以创建一个 HelpFormatter 对象(我将其命名为 helper),当参数中缺少某些必需项或者用户使用 --help-h 选项时,此对象可以自动向用户提供一些有用的信息。

    // define parser
    CommandLine cmd;
    CommandLineParser parser = new BasicParser();
    HelpFormatter helper = new HelpFormatter();

最后,添加一些条件判断来分析用户提供的选项,我们假设这些选项已经作为命令行输入被获取并存储在 cmd 变量中。这个示例应用程序有两种不同类型的选项,但对这两种类型都可以使用 .hasOption 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后,就可以对数据做进一步操作了。

try {
    cmd = parser.parse(options, args);
    if(cmd.hasOption("a")) {
    System.out.println("Alpha activated");
    }

    if (cmd.hasOption("c")) {
    String opt_config = cmd.getOptionValue("config");
    System.out.println("Config set to " + opt_config);
    }
} catch (ParseException e) {
    System.out.println(e.getMessage());
    helper.printHelp("Usage:", options);
    System.exit(0);
}

解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 -c--config 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 main 方法的开头要添加语句声明可能的异常:

public static void main(String[] args) throws ParseException {

示例程序至此就大功告成了。

测试代码

你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序,或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档,以及我写过的关于如何创建 JAR 文件的文章,或者参考 Daniel Oh 的关于如何使用 Maven 执行同样操作的文章。

首先,省略必需项 -c--config 选项,检测解析器的异常处理:

$ java -jar dist/myapp.jar                 
Missing required option: c
usage: Usage:
 -a,--alpha             Activate feature alpha
 -c,--config <config>   Set config file

然后提供输入选项再进行测试:

java -jar dist/myantapp.jar --config foo -a
Alpha activated
Config set to foo

选项解析

为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons,要实现这个功能并不难。

以下是完整的演示代码,供读者参考:

package com.opensource.myapp;

import org.apache.commons.cli.*;

public class Main {
    
    /**
     * @param args the command line arguments
     * @throws org.apache.commons.cli.ParseException
     */ 
    public static void main(String[] args) throws ParseException {
        // define options
        Options options = new Options();
        
        Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
        options.addOption(alpha);
        
        Option config = Option.builder("c").longOpt("config")
                .argName("config")
                .hasArg()
                .required(true)
                .desc("Set config file").build();
        options.addOption(config);
     
        // define parser
        CommandLine cmd;
        CommandLineParser parser = new BasicParser();
        HelpFormatter helper = new HelpFormatter();

        try {
            cmd = parser.parse(options, args);
            if(cmd.hasOption("a")) {
                System.out.println("Alpha activated");
            }
          
            if (cmd.hasOption("c")) {
                String opt_config = cmd.getOptionValue("config");
                System.out.println("Config set to " + opt_config);
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            helper.printHelp("Usage:", options);
            System.exit(0);
        }
    }
}

使用 Java 和选项

选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多,其中之一的 commons-cli 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。


via: https://opensource.com/article/21/8/java-commons-cli

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

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

封面图片选自文森特·梵高的《星空》,公共领域,通过维基共享资源发布

技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 计算机视觉。这个重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 OpenCV

什么是 OpenCV?

OpenCV( 开源计算机视觉库 Open Source Computer Vision Library )是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。

opencv.org – about

在 Fedora Linux 上安装 OpenCV

要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它:

$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy

注意: 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具:

rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy

接下来,在终端输入以下命令,以验证 OpenCV 是否已经安装:

$ python
Python 3.9.6 (default, Jul 16 2021, 00:00:00)
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print( cv.__version__ )
4.5.2
>>> exit()

当你输入 print 命令时,应该显示当前的 OpenCV 版本,如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。

此外,如果你想用 Jupyter Notebook 做笔记和写代码,并了解更多关于数据科学工具的信息,请查看早期的 Fedora Magazine 文章:Fedora 中的 Jupyter 和数据科学

开始使用 OpenCV

安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 S 键以 png 格式保存图像的副本并完成程序):

$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
$ python starry_night.py

starry_night.py 的内容:

import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:
    sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("starry_night.png", img)

通过在 cv.imread 函数中添加参数 0,对图像进行灰度处理,如下所示。

img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)

这些是一些可以用于 cv.imread 函数的第二个参数的替代值:

  • cv2.IMREAD_GRAYSCALE0:以灰度模式加载图像。
  • cv2.IMREAD_COLOR** 或1`:以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。
  • cv2.IMREAD_UNCHANGED** 或-1`:载入未经修改的图像。包括 alpha 通道。

使用 OpenCV 显示图像属性

图像属性包括行、列和通道的数量、图像数据的类型、像素的数量等等。假设你想访问图像的形状和它的数据类型。你可以这样做:

import cv2 as cv

img = cv.imread(cv.samples.findFile("starry_night.jpg"))
print("Image size is", img.shape)
print("Data type of image is", img.dtype)

Image size is (600, 752, 3)
Data type of image is uint8

print(f"Image 2D numpy array \n {img}")

Image 2D numpy array
 [[[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  • img.shape:返回一个行数、列数和通道数的元组(如果是彩色图像)。
  • img.dtype:返回图像的数据类型。

接下来用 Matplotlib 显示图像:

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
plt.imshow(img)
plt.show()

发生了什么?

该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 imshow 函数时,它不一定会以灰度显示。这是因为 imshow 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 imshow 函数的第二个参数设置为 cmap='gray',如下所示:

plt.imshow(img,cmap='gray')

这个问题在以彩色模式打开图片时也会发生,因为 Matplotlib 期望图片为 RGB(红、绿、蓝)格式,而 OpenCV 则以 BGR(蓝、绿、红)格式存储图片。为了正确显示,你需要将 BGR 图像的通道反转。

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.imshow(img)
ax1.set_title('BGR Colormap')
ax2.imshow(img[:,:,::-1])
ax2.set_title('Reversed BGR Colormap(RGB)')
plt.show()

分割和合并颜色通道

import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
b,g,r = cv.split(img)

fig,ax = plt.subplots(2,2)

ax[0,0].imshow(r,cmap='gray')
ax[0,0].set_title("Red Channel");
ax[0,1].imshow(g,cmap='gray')
ax[0,1].set_title("Green Channel");
ax[1,0].imshow(b,cmap='gray')
ax[1,0].set_title("Blue Channel");

# Merge the individual channels into a BGR image
imgMerged = cv.merge((b,g,r))
# Show the merged output
ax[1,1].imshow(imgMerged[:,:,::-1])
ax[1,1].set_title("Merged Output");
plt.show()

  • cv2.split:将一个多通道数组分割成几个单通道数组。
  • cv2.merge:将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。

注意: 白色较多的图像具有较高的颜色密度。相反,黑色较多的图像,其颜色密度较低。在上面的例子中,红色的密度是最低的。

转换到不同的色彩空间

cv2.cvtColor 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时,应明确指定通道的顺序(RGB2BGRBGR2RGB)。注意,OpenCV 中的默认颜色格式通常被称为 RGB,但它实际上是 BGR(字节是相反的)。 因此,标准(24 位)彩色图像的第一个字节将是一个 8 位蓝色分量,第二个字节是绿色,第三个字节是红色。然后第四、第五和第六个字节将是第二个像素(蓝色、然后是绿色,然后是红色),以此类推。

import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()

更多信息

关于 OpenCV 的更多细节可以在在线文档中找到。

感谢阅读。


via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/

作者:Onuralp SEZER 选题:lujun9972 译者:geekpi 校对:wxy

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

防火墙可以成为超大型 DDoS 攻击的武器

安全研究人员发现了一种滥用 TCP 协议、防火墙和其他网络中间设备的方法,可以对互联网上的任何目标发动超大型 DDoS 攻击。它首次描述了一种通过 TCP 协议进行 DDoS 反射放大攻击的方法,以前人们认为这种操作是不可能的。更糟糕的是,研究人员说,这些基于 TCP 的攻击的放大系数也远远大于 UDP 协议,使 TCP 协议的滥用成为迄今为止已知的进行 DDoS 攻击的最危险的形式之一,并且在未来非常可能被滥用。

如果这种 TCP 协议缺陷真的被利用起来,那造成的破坏要比现在的 DDoS 攻击可怕的多。

黑莓几个月之后终于承认其汽车软件存在漏洞

黑莓公司开发的 QNX 是一款很老的操作系统,至今仍有许多地方还在使用。今年 5 月被爆出存在一个名为 BadAlloc 的漏洞,受影响的黑莓软件存在于近 2 亿辆汽车以及成千上万的工业控制设备、医疗工具等。据称,黑莓公司否认该漏洞影响了他们的产品,并抵制政府发布关于该问题的公告的尝试。本周二,黑莓公司才对外承认,QNX 操作系统存在一个漏洞,可能会被黑客利用。

存在这种漏洞的设备所使用的场所都是与生命安全密切相关的,一旦被利用,后果非常严重。

微软 Office 网页版产品结束对 IE11 浏览器的支持

微软在近日更新的博文中提供了一些指导。基本上,从今天起,IE11 上对 Microsoft 365 应用程序和服务的支持已经结束。这意味着,你可能无法连接到某些服务,或者不得不忍受糟糕的用户体验。该公司已建议用户将其工作负载迁移到微软 Edge,该浏览器还为那些在仍然支持 IE11 的网站上遇到兼容性问题的用户提供了一个“IE 模式”。

眼看着,IE 就慢慢没人用了——除了某些政府机构。

Shell 作为 Linux 中的第一语言,几乎每一个使用 Linux 的人都用到或用过 Shell,但绝大多数人都并不能掌握 Shell 编程的基本能力和技巧。

但如果你的工作涉及到与 Linux 进行操作和交互,Shell 编程对于你来说,都是一个必学的选项。今天,Linux 中国将为大家带来系列公益训练营之 《Shell 编程训练营》,以帮助大家掌握 Shell 编程的精髓和奥义。本次训练营得到了阿里云开发者社区的大力支持。

在本次训练营当中,你将会学习到体系化的 Linux Shell 编程内容,从 0 开始,掌握 Shell 编程的各项基本信息。

本次课程将会分三天进行授课:

  • DAY 1:Shell 的基本介绍、常用命令以及 Shell 的流程控制
  • DAY 2:Shell 中的数组应用、参数处理和函数的应用
  • DAY 3:Shell 的编码规范、调试 Debug 方案以及公共函数库

在授课过程中, 老师将以实战与理论相结合的方式,带着你学习基础知识,并掌握实战能力。

在本次训练营中,训练营导师将会带着你用三天的时间,从 Shell 的基础开始,一起开发一个 Shell 脚本,帮助你掌握 Shell 编程的精髓,提升你的 Shell 编程能力。

此外,通过 Linux 中国专属渠道报名并完成训练营学习的同学,还将获得一张由 Linux 中国颁发的训练营结业证书、全网可查询的电子证书。并有机会获得一本赠送的最新计算机书籍(共计 30 本,直播时抽取赠送)。

课程安排

授课时间:2021年 9 月 6 日 - 2021 年 9 月 8 日 21:00 - 22:00(为期 3 晚)

授课方式:直播授课,有回放

授课费用:免费授课,无任何费用

上课地点:报名后进入专属钉钉群

报名链接:https://developer.aliyun.com/learning/trainingcamp/linux/2?utm_content=g_1000289929