分类 技术 下的文章

Python 开发者已经发布了 Python 3.10.0 的三个测试版本。现在,你可以在 Fedora Linux 中试用最新的版本尽早用 3.10 测试你的 Python 代码,为 10 月份的 3.10.0 最终版本做好准备。

在 Fedora Linux 上安装 Python 3.10

如果你运行 Fedora Linux,你可以用 dnf 从官方仓库安装 Python 3.10:

$ sudo dnf install python3.10

你可能需要启用 updates-testing 仓库来获得最新的预发布版本:

$ sudo dnf install --enablerepo=updates-testing python3.10

随着更多的测试版和候选版 发布,Fedora 包将得到更新。不需要编译你自己的 Python 开发版本,只要安装它就可以获得最新。从第一个测试版开始,Python 开发者不会再增加新的功能了。你已经可以享受所有的新东西了。

用 Python 3.10 测试你的项目

运行 python3.10 命令来使用 Python 3.10,或者用 内置的 venv 模块 tox 或用 pipenvpoetry 创建虚拟环境。下面是一个使用 tox 的例子:

$ git clone https://github.com/benjaminp/six.git
Cloning into 'six'...
$ cd six/
$ tox -e py310
py310 run-test: commands[0] | python -m pytest -rfsxX
================== test session starts ===================
platform linux -- Python 3.10.0b3, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
collected 200 items

test_six.py ...................................... [ 19%]
.................................................. [ 44%]
.................................................. [ 69%]
.................................................. [ 94%]
............                                       [100%]

================== 200 passed in 0.43s ===================
________________________ summary _________________________
  py310: commands succeeded
  congratulations :)

如果你在 Fedora Linux 上发现了 Python 3.10 的问题,请 在 Fedora 的 bugzilla 上提交 bug 报告 或在 Python 的问题追踪 上提交。如果你不确定这是否是 Python 的问题,你可以 通过电子邮件或 IRC 直接联系 Fedora 的 Python 维护者

Python 3.10 中的新内容

参见 Python 3.10 的全部新闻列表。例如,你可以尝试一下 结构模式匹配

$ python3.10
Python 3.10.0b3 (default, Jun 17 2021, 00:00:00)
[GCC 10.3.1 20210422 (Red Hat 10.3.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> point = (3, 10)
>>> match point:
...     case (0, 0):
...         print("Origin")
...     case (0, y):
...         print(f"Y={y}")
...     case (x, 0):
...         print(f"X={x}")
...     case (x, y):
...         print(f"X={x}, Y={y}")
...     case _:
...         raise ValueError("Not a point")
...
X=3, Y=10
>>> x
3
>>> y
10

敬请期待 Fedora Linux 35 中的 python3 —— Python 3.10


via: https://fedoramagazine.org/python-3-10-beta-in-fedora-linux/

作者:Miro Hrončok 选题:lujun9972 译者:geekpi 校对:wxy

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

dust 命令是用 Rust 编写的对 du 命令的一个更直观实现。

如果你在 Linux 命令行上工作,你会熟悉 du 命令。了解像 du 这样的命令,可以快速返回磁盘使用情况,是命令行使程序员更有效率的方法之一。然而,如果你正在寻找一种方法来节省更多的时间,使你的生活更加容易,看看 dust,它是用 Rust 重写的 du,具有更多的直观性。

简而言之,dust 是一个提供文件类型和元数据的工具。如果你在一个目录中运行了 dust,它将以几种方式报告该目录的磁盘利用率。它提供了一个信息量很大的图表,告诉你哪个文件夹使用的磁盘空间最大。如果有嵌套的文件夹,你可以看到每个文件夹使用的空间百分比。

安装 dust

你可以使用 Rust 的 Cargo 包管理器安装 dust

$ cargo install du-dust

另外,你可以在 Linux 上的软件库中找到它,在 macOS 上,可以使用 MacPortsHomebrew

探索 dust

在一个目录中执行 dust 命令,会返回一个图表,以树状格式显示其内容和每个项目所占的百分比。

$ dust
 5.7M   ┌── exa                                                           │                                                ██ │   2%
 5.9M   ├── tokei                                                         │                                                ██ │   2%
 6.1M   ├── dust                                                          │                                                ██ │   2%
 6.2M   ├── tldr                                                          │                                                ██ │   2%
 9.4M   ├── fd                                                            │                                                ██ │   4%
 2.9M   │ ┌── exa                                                         │                                              ░░░█ │   1%
  15M   │ ├── rustdoc                                                     │                                              ░███ │   6%
  18M   ├─┴ bin                                                           │                                              ████ │   7%
  27M   ├── rg                                                            │                                            ██████ │  11%
 1.3M   │     ┌── libz-sys-1.1.3.crate                                    │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   0%
 1.4M   │     ├── libgit2-sys-0.12.19+1.1.0.crate                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   1%
 4.5M   │   ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   2%
 4.5M   │ ┌─┴ cache                                                       │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   2%
 1.0M   │ │   ┌── git2-0.13.18                                            │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 1.4M   │ │   ├── exa-0.10.1                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.5M   │ │   │ ┌── src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.2M   │ │   ├─┴ idna-0.2.3                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.2M   │ │   │       ┌── linux                                           │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 1.6M   │ │   │     ┌─┴ linux_like                                        │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.6M   │ │   │   ┌─┴ unix                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.1M   │ │   │ ┌─┴ src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.1M   │ │   ├─┴ libc-0.2.94                                             │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.2M   │ │   │     ┌── test                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 2.6M   │ │   │   ┌─┴ zlib-ng                                             │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 904K   │ │   │   │   ┌── vstudio                                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 2.0M   │ │   │   │ ┌─┴ contrib                                           │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.4M   │ │   │   ├─┴ zlib                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 6.1M   │ │   │ ┌─┴ src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   2%
 6.1M   │ │   ├─┴ libz-sys-1.1.3                                          │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   2%
 1.6M   │ │   │     ┌── pcre                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.5M   │ │   │   ┌─┴ deps                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.8M   │ │   │   ├── src                                                 │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 7.4M   │ │   │ ┌─┴ libgit2                                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   3%
 7.6M   │ │   ├─┴ libgit2-sys-0.12.19+1.1.0                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   3%
  26M   │ │ ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │  10%
  26M   │ ├─┴ src                                                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │  10%
 932K   │ │   ┌── .cache                                                  │               ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ │   0%
  11M   │ │   │     ┌── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.idx │               ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ │   4%
 135M   │ │   │     ├── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.pack│               ░░░░░░▓▓███████████████████████████ │  53%
 147M   │ │   │   ┌─┴ pack                                                │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │   │ ┌─┴ objects                                               │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │   ├─┴ .git                                                    │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │ ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░█████████████████████████████ │  57%
 147M   │ ├─┴ index                                                       │               ░░░░░░█████████████████████████████ │  57%
 178M   ├─┴ registry                                                      │               ███████████████████████████████████ │  69%
 257M ┌─┴ .                                                               │██████████████████████████████████████████████████ │ 100%
$

dust 应用于一个特定的目录:

$ dust ~/Work/

 title=

-r 选项以相反的顺序显示输出,“根”在底部:

$ dust -r ~/Work/

使用 dust -d 3 会返回三层的子目录和它们的磁盘利用率:

$ dust -d 3 ~/Work/wildfly/jaxrs/target/classes
 4.0K     ┌── jaxrs.xml                                                           │                                         █ │   1%
 4.0K   ┌─┴ subsystem-templates                                                   │                                         █ │   1%
 4.0K   │   ┌── org.jboss.as.controller.transform.ExtensionTransformerRegistration│                                         █ │   1%
 4.0K   │   ├── org.jboss.as.controller.Extension                                 │                                         █ │   1%
 8.0K   │ ┌─┴ services                                                            │                                         █ │   2%
 8.0K   ├─┴ META-INF                                                              │                                         █ │   2%
 4.0K   │ ┌── jboss-as-jaxrs_1_0.xsd                                              │                                        ░█ │   1%
 8.0K   │ ├── jboss-as-jaxrs_2_0.xsd                                              │                                        ░█ │   2%
  12K   ├─┴ schema                                                                │                                        ██ │   3%
 408K   │   ┌── as                                                                │  ████████████████████████████████████████ │  94%
 408K   │ ┌─┴ jboss                                                               │  ████████████████████████████████████████ │  94%
 408K   ├─┴ org                                                                   │  ████████████████████████████████████████ │  94%
 432K ┌─┴ classes                                                                 │██████████████████████████████████████████ │ 100%
$

总结

dust 的魅力在于它是一个小而简单的、易于理解的命令。它使用颜色方案来表示最大的子目录,使你的目录易于可视化。这是一个受欢迎的项目,欢迎大家来贡献。

你是否使用或考虑使用 dust?如果是,请在下面的评论中告诉我们你的想法。


via: https://opensource.com/article/21/6/dust-linux

作者:Sudeshna Sur 选题:lujun9972 译者:geekpi 校对:wxy

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

这些有用的小技巧将改变你在当前最流行的版本控制系统下的工作方式。

 title=

Git 是当前最流行最普遍的版本控制系统之一,它被应用于私有系统和公开网站上各种各样的开发工作。不论我变得对 Git 有多熟悉,似乎总有些功能等待着被发掘。下面分享下和 Git 相关的改变我工作方式的一些小技巧。

1、Git 中的自动纠错

我们每个人都不时在输入时犯拼写错误,但是如果你使能了 Git 的自动纠错功能,你就能让 Git 自动纠正一些输入错误的子命令。

假如你想用命令 git status 来检查状态,但是你恰巧错误地输入了 git stats。通常情况下,Git 会告诉你 ‘stats’ 不是个有效的命令:

$ git stats
git: ‘stats’ is not a git command. See ‘git --help’.

The most similar command is
status

为了避免类似情形,只需要在你的 Git 配置中使能自动纠错功能。

$ git config --global help.autocorrect 1

如果你只想对当前的仓库生效,就省略掉选项 --global

这个命令会使能自动纠错功能。在相应的 Git 官方文档 中可以看到这个命令的详细说明,但是试着敲一下上面的错误命令会使你对这个设置干了什么有个直观的了解:

$ git stats
git: ‘stats’ is not a git command. See ‘git --help’.
On branch master
Your branch is up to date with ‘origin/master’.

nothing to commit, working tree clean

在上面的例子中,Git 直接运行了它建议命令的第一个,也就是 git status,而不是给你展示它所建议的子命令。

2、对提交进行计数

需要对提交进行计数的原因有很多。例如,一些开发人员利用提交计数来判断什么时候递增工程构建序号,也有一些开发人员用提交计数来对项目进展取得一个整体上的感观。

对提交进行计数相当简单而且直接,下面就是相应的 Git 命令:

$ git rev-list --count branch-name

在上述命令中,参数 branch-name 必须是一个你当前仓库里的有效分支名。

$ git rev-list –count master
32
$ git rev-list –count dev
34

3、仓库优化

你的代码仓库不仅对你来说很宝贵,对你所在的组织也一样。通过少数几个惯例你就能使自己的仓库整洁并且保持最新。使用 .gitignore 文件 就是这些最好的惯例之一。通过使用这个文件你可以告诉 Git 不要保存一些不需要记录的文件,如二进制文件、临时文件等等。

当然,你还可以使用 Git 的垃圾回收来进一步优化你的仓库。

$ git gc --prune=now --aggressive

这个命令在你和你的团队经常使用 pull 或者 push 操作的时候很有帮助。

它是一个内部工具,能清理掉你的仓库里没法访问或者说“空悬”的 Git 对象。

4、给未追踪的文件来个备份

大多数时候,删除所有未追踪的文件是安全的。但很多时候也有这么一种场景,你想删掉这些未追踪的文件同时也想做个备份防止以后需要用到。

Git 组合一些 Bash 命令和管道操作,可以让你可以很容易地给那些未追踪的文件创建 zip 压缩包。

$ git ls-files --others --exclude-standard -z |\
  xargs -0 tar rvf ~/backup-untracked.zip

上面的命令就生成了一个名字为 backup-untracked.zip 的压缩包文件(当然,在 .gitignore 里面忽略了的文件不会包含在内)。

5、了解你的 .git 文件夹

每个仓库都有一个 .git 文件夹,它是一个特殊的隐藏文件夹。

$ ls -a
. … .git

Git 主要通过两个东西来工作:

  1. 当前工作树(你当前检出的文件状态)
  2. 你的 Git 仓库的文件夹(准确地说,包含版本信息的 .git 文件夹的位置)

这个文件夹存储了所有参考信息和一些其他的如配置、仓库数据、HEAD 状态、日志等更多诸如此类的重要细节。

一旦你删除了这个文件夹,尽管你的源码没被删,但是类似你的工程历史记录等远程信息就没有了。删除这个文件夹意味着你的工程(至少本地的复制)不再在版本控制的范畴之内了。这也就意味着你没法追踪你的修改;你没法从远程仓拉取或推送到远程仓了。

通常而言,你需要或者应当对你的 .git 文件夹的操作并不多。它是被 Git 管理的,而且大多数时候是一个禁区。然而,在这个文件夹内还是有一些有趣的工件,比如说当前的 HEAD 状态在内的就在其中。

$ cat .git/HEAD
ref: refs/heads/master

它也隐含着对你仓库地描述:

$ cat .git/description

这是一个未命名的仓库;通过编辑文件 ‘description’ 可以给这个仓库命名。

Git 钩子文件夹连同一些钩子文件例子也在这里。参考这些例子你就能知道 Git 钩子能干什么了。当然,你也可以 参考这个 Seth Kenlon 写的 Git 钩子介绍

6、浏览另一个分支的文件

有时,你会想要浏览另一个分支下某个文件的内容。这其实用一个简单的 Git 命令就可以实现,甚至都不用切换分支。

设想你有一个命名为 README.md 的文件,并且它在 main 分支上。当前你正工作在一个名为 dev 的分支。

用下面的 Git 命令,在终端上就行。

$ git show main:README.md

一旦你执行这个命令,你就能在你的终端上看到 main 分支上该文件的内容。

7、Git 中的搜索

用一个简单的命令你就能在 Git 中像专业人士一样搜索了。更有甚者,尽管你不确定你的修改在哪次提交或者哪个分支上,你依然能搜索。

$ git rev-list --all | xargs git grep -F ''

例如,假设你想在你的仓库中搜索字符串 “font-size: 52 px;"

$ git rev-list –all | xargs git grep -F ‘font-size: 52 px;’
F3022…9e12:HtmlTemplate/style.css: font-size: 52 px;
E9211…8244:RR.Web/Content/style/style.css: font-size: 52 px;

试试这些小技巧

我希望这些小技巧对你是有用的,或者增加你的生产力或者节省你的大量时间。

你也有一些喜欢的 Git 技巧 吗?在评论区分享吧。


via: https://opensource.com/article/20/10/advanced-git-tips

作者:Rajeev Bera 选题:lujun9972 译者:BoosterY 校对:wxy

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

如果一切顺利的话,周日 Linus Torvalds 将会发布 Linux 5.13 稳定版,而不是发布 5.13-rc8 测试版并把最终版本再推后一个版本。不管是哪种情况,Linux 5.13 很快就会发布,而且会有很多新功能。

在合并窗口结束后,我们照例发布了 Linux 5.13 的功能概述。但是,对于那些不记得在 4 月底到 5 月初的合并窗口期间所有这些变化的人来说,这里回顾了这个下一个内核版本中最突出的变化:


via: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.13-Features

作者:Michael Larabel 选题:wxy 译者:wxy 校对:wxy

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

2021 年 06 月 24 日微软正式发布了 Windows 11 操作系统,这是微软时隔 6 年来的再次发布操作系统。根据其官方介绍,Windows 11 新增了许多特性,考虑到安装 Windows 11 到 PC 会耽误现在的正常工作(毕竟用 Windows 11 替换 PC 中的 Windows 10 后需要重新安装各种工程软件,这是件很耗时的事情),因此我想到用 QEMU 虚拟机来体验一下新发布的 Windows 11 尝尝鲜。

一、准备工作

我们需要准备 QEMU 环境、Windows 11 镜像文件、virtio-win 的镜像文件,这里罗列一下:

  • QEMU(本文是在 CentOS 环境下安装的 QEMU 工具)
  • Windows 11 镜像(下载地址:win11.iso),需要空间 4.5G
  • virtio-win 镜像(下载地址:virtio-win-0.1.190.iso),需要空间 479M

注意:下载完成后,为了简化,我这里将镜像都重新简化命名如下:

镜像文件简化命名
virtio-win-xxx.isovirtio-win.iso
xxx-windows11-xxx.isowindows11.iso

1、安装 qemu 命令

如果是 Ubuntu 系统,可以直接用sudo apt-get install qemu或者sudo apt-get install qemu-system-i386命令来安装 QEMU。

本文中是使用的 qemu-5.1.0(下载地址:qemu)来编译生成的 qemu-system-x86_64qemu-img 等命令。

操作步骤:

# 在根目录下解压 qemu-5.1.0.tar.xz
cp qemue-5.1.10.tar.xz /
cd /
tar xvf qemu-5.1.0.tar.xz

# 进入 qemu-5.1.0 源码目录
cd /qemu-5.1.0

# 编译
mkdir build
cd build
../configure
make

编译完之后,qemu-img 以及 qemu-system-x86_64 两个命令所在的位置分别是:

命令工具所在路径
qemu-img/qemu-5.1.0/build/qemu-img
qemu-system-x86_64/qemu-5.1.0/build/x86_64-softmmu/qemu-system-x86_64

2、制作 Windows 11 安装磁盘

我们重新创建一个目录,用来存放 windows11.isovirtio-win.iso 镜像文件以及马上就要生成的 windows11.qcow2 文件。

# 为了方便,依旧在根目录下操作(其实这是很不好的习惯)
cd /
mkdir win11
cd win11

# 将下载好的 windows 11 镜像以及 virtio-win 镜像拷贝进来
cp xxx/windows11.iso /win11/
cp xxx/virtio-win.iso /win11/

# 然后利用 qemu-img 命令制作系统安装磁盘,分配磁盘大小 120G 空间
/qemu-5.1.0/build/qemu-img create -f qcow2 ./windows11.qcow2 120G

此时,/win11/目录下应该是这样几个文件:

3、编写启动 Windows 11 脚本

为了方便后面启动 Windows 11 系统,将 qemu 启动命令写入一个脚本中。

编辑 start.sh 脚本:

vim /win11/start.sh

编写脚本命令内容:

/qemu-5.1.0/build/x86_64-softmmu/qemu-system-x86_64 \
  -enable-kvm \
  -smp 4 \
  -m 4G \
  -machine usb=on \
  -device usb-tablet \
  -display default \
  -vga virtio \
  -device e1000,netdev=net0 \
  -netdev user,id=net0,net=192.168.20.0/24,dhcpstart=192.168.20.20 \
  -drive file=/win11/windows11.qcow2,if=virtio \
  -drive file=/win11/virtio-win.iso,index=1,media=cdrom \
  -drive file=/win11/windows11.iso,index=2,media=cdrom \
  -spice port=8891,addr=172.17.81.26,disable-ticketing

脚本中的第 9 行与第 10 行指定了 Windows 11 中网卡驱动类型为 e1000,并指定其采用 dhcp 方式获取 IP 地址。第 14 行则指定了 spice 协议连接地址,其中172.17.81.26:8891是指的我的宿主机的 IP 地址和端口号(此处 IP 地址以及端口号需要根据个人的宿主机环境进行修改),待执行 start.sh 脚本后可以通过 spice 协议连接 Windows 11 系统界面。

赋予 start.sh 可执行权限:

chmod +x /win11/start.sh

4、安装 spice 客户端

推荐使用virt-vierer工具客户端,用来通过spice协议连接即将安装的windows11系统桌面。

下载地址:virt-viewer,推荐下载virt-vierer-x64-2.0.msi版本。

5、完成准备工作

至此,准备工作都完成了,此时/win11/目录下应该有 4 个文件,如下图所示。

二、安装 Windows 11 系统

1、启动 start.sh 脚本

执行 start.sh 脚本,然后用 spice 协议连接172.17.81.26:8891端口:

2、安装 Windows 11 系统

连接上远程界面后,首先看到的是经典的 Windows 界面:

然后进入语言、时区、键盘等选项,此处不用修改,一直选择默认的即可。

接着需要输入密钥,但我们并没有,此处选择“I don't have a product key”即可。

然后进入了磁盘选择页面,会发现没有磁盘可选,此时单击“Load driver”选项就进行扫描,然后就可以发现磁盘(此处便是 virtio-win.iso 在起作用了)。此处发现并没有 Windows 11 的选项,直接选择 “w10” 那一项即可(我猜测是因为 virtio-win.iso 还并未支持 Windows 11 选项,相信马上就会更新了)。

然后找到安装磁盘,并选择,然后下一步。

然后进入安装过程,稍作等待 3-5 分钟。

安装完成后,进入准备桌面过程,是不是很熟悉?

接着就到了“just a moment”界面了,马上就可以进入桌面了,是不是很激动了,哈哈哈哈。

进入了桌面,此处其实是个动态的过程,因为截屏所以看不出效果。这个 Windows 界面重新设计过 UI了,个人觉得更好看了。

3. 进入桌面前的准备

至此,Windows 11 安装即将完成,只差最后的初次设置步骤了。

首先是选择国家地区,此处也即默认即可,无需更改。

然后是检查更新,此处根据网速快慢,等待的时间不定,需要耐心等待。

Windows 11 这里非要让用户填写 “Microsoft 账户”,无法跳过,很是郁闷,只能填写账户,然后下一步了。没有账户的可能得先申请一个微软账户了(估计正式版本会增加跳过选项吧)。

然后设置开机登录密码。

最后,最后,最后,激动的时刻来了,进入桌面了。初次见面,什么感觉?

乍一看,怎么那么像 Mac 的风格和 UI 界面。

为了显示更舒适一点,推荐设置以下屏幕分辨率(根据个人电脑屏幕大小自行设定)。这里我选择的是1920*1080

三、体验 Windows 11 系统

根据微软官方的介绍,Windows 11 增加了很多新的功能。这里挑几个新功能体验一下。

1、新的 UI 外观以及菜单

确实,这个 UI 风格和 Windows 10 还是有较大区别的,和 Windows 7 相比,特别时尚了。我感觉这个 UI 风格是为了适配平板、Surface 等便携式设备而优化的。

2、“Snap Layout” 布局功能

这个功能说实用也实用,说没啥用我觉得也没啥多大用(可能是我还没体会到多任务同时处理的便捷性吧)。Windows 旧版本中也有桌面并排处理等功能,但和这个布局功能比,还是逊色了点。

在窗口的最大化按钮上,鼠标悬停,即可出现 “Snap Layout” 布局窗口,然后可以选择一种布局,将该任务放置到某个位置中。这样做的目的是为了方便多任务同时处理。

如下图所示,选择了四个桌面的布局,将两个任务放在了上面两个布局框中。

3、新的小工具窗口

这是由 Microsoft Edge 和 AI 提供的全新 Widgets功能,包含日历、天气、待办事项、照片等功能。

4、不同场景设置不同桌面

这个功能我觉得还蛮实用的,可以根据使用的场景不同,设置不同的桌面(甚至包含常用软件的设置)。比如设置“home”、 “game”、“work”三种不同的桌面环境,方便场景快速切换。

5、全新的应用商店

这个应该是比较重大的新功能了。微软官方介绍,Windows 11 正式版可以安装安卓 APP,极大地方便了用户的使用。

微软商店界面:

我们来安装个 tiktok 试试,看看效果如何。首先在商店中搜索“tiktok”。然后会发现,tiktok 有 PC 版、Moblie device 版本。

根据 tiktok 界面看,我觉得我这里安装的应该是 Mobile device 版本的 tiktok。这个界面是不是很类似手机和平板的 tiktok 界面风格呢?这应该是 Windows 11 的一个较为新颖的功能。

总结

本文简略的在 QEMU 的帮助体验了 Windows 11 操作系统。由于是在虚拟机中体验的,并不能真实的体验到 Windows 11 的触摸便捷性、游戏画面优化、声音优化、以及其他的一些新功能特性。期待在将来能在真实设备上体验 Windows 11 操作系统。

systemd 提供定时器有一段时间了,定时器替代了 cron 功能,这一特性值得看看。本文将向你介绍在系统启动后如何使用 systemd 中的定时器来运行任务,并在此后重复运行。这不是对 systemd 的全面讨论,只是对此特性的一个介绍。

快速回顾:cron、anacron 与 systemd

cron 可以以几分钟到几个月或更长时间的粒度调度运行一个任务。设置起来相对简单,它只需要一个配置文件。虽然配置过程有些深奥,但一般用户也可以使用。

然而,如果你的系统在需要执行的时间没有运行,那么 cron 会失败。

anacron 克服了“系统没有运行”的问题。它确保任务将在你的系统再次启动时执行。虽然它旨在给管理员使用,但有些系统允许普通用户访问 anacron。

但是,anacron 的执行频率不能低于每天一次。

cron 和 anacron 都存在执行上下文一致性的问题。必须注意任务运行时有效的环境与测试时使用的环境完全相同。必须提供相同的 shell、环境变量和路径。这意味着测试和调试有时会很困难。

systemd 定时器提供了 cron 和 anacron 二者的优点,允许调度到分钟粒度。确保在系统再次运行时执行任务,即使在预期的执行时间内系统处于关闭状态。它对所有用户都可用。你可以在它将要运行的环境中测试和调试执行。

但是,它的配置更加复杂,至少需要两个配置文件。

如果你的 cron 和 anacron 配置可以很好地为你服务,那么可能没有理由改变。但是 systemd 至少值得研究,因为它可以简化任何当前的 cron/anacron 工作方式。

配置

systemd 定时器执行功能至少需要两个文件。这两个是“ 定时器单元 timer unit ”和“ 服务单元 service unit ”。(其执行的)“动作”不仅仅是简单的命令,你还需要一个“作业”文件或脚本来执行必要的功能。

定时器单元文件定义调度表,而服务单元文件定义执行的任务。有关的更多详细信息请参考 man systemd.timer 中提供的 .timer 单元。服务单元的详细信息可在 man systemd.service 中找到。

单元文件存放在几个位置(在手册页中有列出)。然而,对于普通用户来说,最容易找到的位置可能是 ~/.config/systemd/user。请注意,这里的 user 是字符串 user

示例

此示例是一个创建用户调度作业而不是(以 root 用户身份运行的)系统调度作业的简单示例。它将消息、日期和时间打印到文件中。

1、首先创建一个执行任务的 shell 脚本。在你的本地 bin 目录中创建它,例如在 ~/bin/schedule-test.sh 中。

创建文件:

touch ~/bin/schedule-test.sh

然后将以下内容添加到你刚刚创建的文件中:

#!/bin/sh
echo "This is only a test: $(date)" >> "$HOME/schedule-test-output.txt"

记住赋予你的 shell 脚本执行权限。

2、创建 .service 单元调用上面的脚本。在以下位置创建目录与文件:~/.config/systemd/user/schedule-test.service

[Unit]
Description=A job to test the systemd scheduler

[Service]
Type=simple
ExecStart=/home/<user>/bin/schedule-test.sh

[Install]
WantedBy=default.target

请注意 <user> 应该是你的家目录地址,但是单元文件路径名中的 user 实际上是字符串 user

ExecStart 应该提供一个没有变量的绝对地址。例外情况是,对于用户单元文件,你可以用 %h 替换 $HOME。换句话说,你可以使用:

ExecStart=%h/bin/schedule-test.sh

这仅用于用户单元文件,而不适用于系统服务,因为在系统环境中运行时 %h 总是返回 /root。其他特殊符号可在 man systemd.unitSPECIFIERS 中找到。因为它超出了本文的范围,所以这就是我们目前需要了解的关于特殊符号的全部内容。

3、创建一个 .timer 单元文件,该文件实际上调度你创建的 .service 单元文件。在 .service 单元文件相同位置创建它:~/.config/systemd/user/schedule-test.timer。请注意,文件名仅在扩展名上有所不同,例如一个是 .service,一个是 .timer

[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no  # Allow manual starts
RefuseManualStop=no   # Allow manual stops

[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service

[Install]
WantedBy=timers.target

请注意,这个 .timer 单元文件使用了 OnUnitActiveSec 来指定调度表。OnCalendar 选项更加灵活。例如:

# run on the minute of every minute every hour of every day
 OnCalendar=*-*-* *:*:00
# run on the hour of every hour of every day
 OnCalendar=*-*-* *:00:00
# run every day
 OnCalendar=*-*-* 00:00:00
# run 11:12:13 of the first or fifth day of any month of the year
# 2012, but only if that day is a Thursday or Friday
 OnCalendar=Thu,Fri 2012-*-1,5 11:12:13

有关 OnCalendar 的更多信息参见 这里

4、所有的部件都已就位,但你应该进行测试,以确保一切正常。首先,启用该用户服务:

$ systemctl --user enable schedule-test.service

这将导致类似如下的输出:

Created symlink /home/<user>/.config/systemd/user/default.target.wants/schedule-test.service → /home/<user>/.config/systemd/user/schedule-test.service.

现在执行测试工作:

$ systemctl --user start schedule-test.service

检查你的输出文件($HOME/schedule-test-output.txt),确保你的脚本运行正常。应该只有一个条目,因为我们还没有启动定时器。必要时进行调试。如果你需要更改 .service 单元文件,而不是更改它调用的 shell 脚本,请不要忘记再次启用该服务。

5、一旦作业正常运行,通过为服务启用、启动用户定时器来实时调度作业:

$ systemctl --user enable schedule-test.timer
$ systemctl --user start schedule-test.timer

请注意,你已经在上面的步骤 4 中启动、启用了服务,因此只需要为它启用、启动定时器。

enable 命令会产生如下输出:

Created symlink /home/<user>/.config/systemd/user/timers.target.wants/schedule-test.timer → /home/<user>/.config/systemd/user/schedule-test.timer.

start 命令将只是返回命令行界面提示符。

其他操作

你可以检查和监控服务。如果你从系统服务收到错误,下面的第一个命令特别有用:

$ systemctl --user status schedule-test
$ systemctl --user list-unit-files

手动停止服务:

$ systemctl --user stop schedule-test.service

永久停止并禁用定时器和服务,重新加载守护程序配置并重置任何失败通知:

$ systemctl --user stop schedule-test.timer
$ systemctl --user disable schedule-test.timer
$ systemctl --user stop schedule-test.service
$ systemctl --user disable schedule-test.service
$ systemctl --user daemon-reload
$ systemctl --user reset-failed

总结

本文以 systemd 定时器为出发点,但是 systemd 的内容远不止于此。这篇文章应该为你提供一个基础。你可以从 Fedora Magazine systemd 系列 开始探索更多。

参考

更多阅读:


via: https://fedoramagazine.org/systemd-timers-for-scheduling-tasks/

作者:Richard England 选题:lujun9972 译者:dcoliversun 校对:wxy

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