mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-25 23:11:02 +08:00
commit
fd589d35d7
2
.github/workflows/lctt-article-checker.yml
vendored
2
.github/workflows/lctt-article-checker.yml
vendored
@ -12,6 +12,8 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: ensure source branch is not "master"
|
||||
run: '[ "${{ github.head_ref }}" != master ]'
|
||||
- name: "checkout master branch & return to pull request branch"
|
||||
run: CURRENT=$(echo ${{github.ref}} | sed "s|refs/|refs/remotes/|") && git checkout master && git checkout $CURRENT
|
||||
- name: run check
|
||||
|
172
Dict.md
172
Dict.md
@ -1,163 +1,79 @@
|
||||
LCTT 术语词典
|
||||
======
|
||||
|
||||
<img src="https://avatars3.githubusercontent.com/u/5432002?v=3&s=200" align="right" width="100" height="100"></img>
|
||||
<font face='黑体' size=6><b><center>Linux中国术语词典</center></b></font>
|
||||
<br />
|
||||
<font face='微软雅黑' size=3><b><center>[Linux中国](http://www.linux.cn)出品</center></b></font>
|
||||
****************************************************
|
||||
****************************************************
|
||||
<font face='微软雅黑'><b>本词典为规范Linux中国翻译组(LCTT)技术术语翻译而编写,同时也方便广大翻译志愿者查阅。限于编写者的水平,其中可能有不完善或疏漏的地方,希望广大翻译志愿者不吝指正。同时,希望广大翻译志愿者能提供相关术语的翻译供大家参考。另外,若在翻译过程中对某些术语有疑虑,可在我们的QQ专门群中进行讨论。在此,谨代表LCTT感谢各位志愿者的辛勤劳动和无私奉献。</b></font>
|
||||
<font face='微软雅黑' size=3><b><p align='right'>LCTT翻译组</p></b></font>
|
||||
****************************************************
|
||||
本文收录了 LCTT 自创和选用的翻译词汇。
|
||||
|
||||
#### A ####
|
||||
### 1. APM:高级电源管理
|
||||
### 2.
|
||||
#### B ####
|
||||
### 1. Backbone:骨干
|
||||
> 是一个网络的一部分,其作为所有网络运输的一个基本通道,其需要非常高的带宽。一个骨干网络的服务提供者连接许多企业子网和较小服务提供者的网络。一个企业骨干网络连接许多局域网和数据中心。
|
||||
为什么要自创翻译词汇?在翻译过程中,我们发现一些非缩写的英语术语沿袭使用了英语单词/短语,而没有得体的、公认的、正式的对应中文翻译。我们认为,中英文混杂是对原生语言的一种污染(英文缩写除外,这是为了减少冗长的语句),按照本地化的宗旨,应该对这些词汇进行翻译,并在必要时创造新的词汇。故此,我们在几年的翻译中,逐渐推敲和形成了一些新的译法,并在我们翻译的文章中使用和推广。
|
||||
|
||||
### 2. B channel(Bearer channel):承载信道
|
||||
> 承载信道(Bearer Channel),也叫做B channel,是一个全双工DS0时间槽(64-kbps),其携带模拟语音或数字资料通过综合服务数字网(ISDN)。
|
||||
对这些译法,我们尽量遵循“信达雅”的原则。但鉴于水平所及,肯定会有所不足,虽然也有不断的调整和改进,但仍希望得到大家的反馈和指正。
|
||||
|
||||
### 3. Backchannel:反向通道
|
||||
> 是指当其他实时在线会话在进行中时,习惯使用网络化的计算机来维持一个实时的在线会话。
|
||||
我们采用的方法是:
|
||||
|
||||
### 4. Back End:后台
|
||||
> 在一个计算机系统中,是指为一个前台作业提供服务的一个节点或软件程序。前台直接影响用户,后台可能与其他系统相连接,如数据库和其它系统。
|
||||
- 音似:中文读音近似于英文原词
|
||||
- 意近:中文字的意思接近英文原意
|
||||
- 组词:根据上述两条组成新的词汇,以避免和原有词汇混淆
|
||||
|
||||
### 5. Back-haul:回程线路
|
||||
> 是一个通信信道,它使携带信息流到远于最终目的地的地方,然后将它送回。这样做是因为传输到更远的远程区域的代价要远比直接发送的代价低地多。
|
||||
此外,需要说明的是,有些译法可能已经被其他人在别的地方更早提出,但限于我们的学识和搜索能力,并未发现和了解到,并非我们故意剽窃。
|
||||
|
||||
### 6. Backoff:退避
|
||||
> 是指当一个主机已经在有MAC 协议的网络中经历了一个冲突之后试图去重发之前的等待时期。这个退避时间通常是任意的来最小化相同节点再次冲突的可能性。在每次冲突后增加退避时期也能帮助预防重复碰撞,特别当这个网络负担很重时。
|
||||
顺便说一句,2014 年对 “Shebang”(`#!`)一词翻译时,来自于 LCTT 早期重要贡献者 GOLinux 提出的 “[释伴](https://linux.cn/article-3664-1.html)” 译法,是我们第一次创造新的翻译词汇,也是我们形成这样的想法的起点。
|
||||
|
||||
### 7. Backplane:附加卡
|
||||
> 在许多网络中是一个物理接口模块,例如,连接在一个界面处理器或卡和在一个总线机箱内数据总线和功率分配总线之间的一个路由器或转换器。
|
||||
除了自创的翻译词汇外,这里还收录了一些选用的翻译词汇。有一些词汇存在多种译法,我们在翻译和使用过程中,采用了某个译法,在此列出以保持一致。
|
||||
|
||||
### 8. Back Pressure:背压
|
||||
> 在计算机系统中,是指网络拥塞信息逆流通过一个Internet网络。
|
||||
### F
|
||||
|
||||
### 9. Balun(balanced-unbalanced):不平衡变压器
|
||||
> 意味着平衡-非平衡。不平衡变压器是一个设计用来转换平衡和不平衡之间的电信号的设备。
|
||||
#### Fork
|
||||
|
||||
### 10. Baseband:基带
|
||||
> 是一种类型的网络技术,在那里仅仅一种载波频率被使用。在一个基带网中,信息在传送介质中以数字的形式被携带在一个单一的多元信号通道中。
|
||||
Fork 行为/操作广泛用于进程管理、版本管理和软件衍生方面。此词汇也长期缺乏确定的译法。
|
||||
|
||||
### 11. Bastion Host:防御主机
|
||||
> 是在内部网络和外部网络之间的一个网关,它被设计来防御针对内部网络的攻击。这个系统在非武装区(DMZ)的公共一边,不被防火墙或过滤路由器保护,它对攻击是完全暴露的。
|
||||
此前,提议者对 Fork 给出了 “复刻” 的译法。基本意思是,根据上游/父本复制一份,然后在此基础上进行修改,从而形成“衍生品”。
|
||||
|
||||
### 12: Bc(Committed Burst):约定资讯讯务
|
||||
> 是一个用在帧中继系统的术语,是一个帧中继交互网约定接受和传输和通过一个帧中继网络数据链路控制(DLC)和一个特殊的时帧的最大数据量(用比特表示)。
|
||||
|
||||
### 13. BCP(Best Current Practices):最优现行方法
|
||||
> 是副系列的IETF RFCs,其被用于描述在Internet上的最优配置技术。
|
||||
有趣的是,我们发现 GitHub 的 [部分中文文档](https://docs.github.com/zh/actions/managing-workflow-runs/approving-workflow-runs-from-public-forks) 中也采用了此译法,不知道是不是受到了我们的影响。
|
||||
|
||||
### 14. BCU(Balanced Configuration Unit):平衡配置单元
|
||||
> 是一个综合的IBM解决方法,它由软件和硬件组成。BCUs是综合的和测试作为数据仓库系统的预配置功能块。
|
||||
- 提议者:wxy
|
||||
- 首次链接:https://linux.cn/article-7877-1.html
|
||||
|
||||
### 15. BECN(Backward Explicit Congestion Notification):显式拥塞通知
|
||||
> 是在帧中继报头的一个1比特域,其发信号到任何接收帧的事物(转换器和数据终端设备),拥塞就发生在帧的反面(后面)。帧中继转换器和数据终端设备可能遵照显式拥塞通知位来减慢那个方向的数据传输率。
|
||||
### L
|
||||
|
||||
### 16. BER(Bit Error Rate):误码率
|
||||
> 是接收到的位包含错误的比率。BER通常被表示成十足的负面力量。
|
||||
#### Live
|
||||
|
||||
### 17. BIP(Bit Interleaved Parity):位交叉奇偶校验
|
||||
> 一个用在ATM中的术语,是一个通常用来检测链接错误的一种方法。一个检测位或字被嵌入到以前发生阻塞或帧的链接中。位错误在有效载荷中能够作为维护信息被删除和报告。
|
||||
Live 原意多指“现场”、“实时”,在计算机环境中使用时也多引用此意。但对它的翻译就颇费神,因为无论是在 Live Patch,还是更多见的 Live USB/CD、Live Session,其实都不好翻译为“现场”、“实时”。
|
||||
|
||||
#### C ####
|
||||
提议者之前曾经尝试创造了新的“[临场](https://linux.cn/article-12854-1.html)”词汇,但是感觉有些不够达意。经过推敲,提议者再次推荐使用“立付”,在照顾发音的同时,取其“立时交付”之意。这样,Live USB/CD 可以译做 “立付 USB/CD”,Live Session 可以译做 “立付会话”。
|
||||
|
||||
#### D ####
|
||||
### 1. daemon:守护进程
|
||||
### 2.
|
||||
#### F ####
|
||||
而对于 Live Stream,提议者建议依旧翻译为“直播”、“实时流”。对于 Live Patch,还是采用 “热补丁” 这样的意译。
|
||||
|
||||
#### G ####
|
||||
- 提议者:wxy
|
||||
- 首次链接(临场):https://linux.cn/article-12854-1.html
|
||||
- 首次链接(立付):https://linux.cn/article-15499-1.html
|
||||
|
||||
#### H ####
|
||||
### 1. Home Directory:家目录
|
||||
#### I ####
|
||||
### 1. issue:工单
|
||||
> 有翻译做“问题”的,但是应该译作“工单”,尤其是用于 GitHub 中。
|
||||
#### Repo/Repository
|
||||
|
||||
#### J ####
|
||||
Repository 主要用于两个场景,一个是用于版本管理的代码仓库,一个是用于分发软件/组件/制品的软件仓库。
|
||||
|
||||
#### K ####
|
||||
鉴于两种场景的差异,建议在使用时,分别注明“代码仓库”或“软件仓库”,也可简称为 “代码仓”或“软件仓”。
|
||||
|
||||
#### L ####
|
||||
### 1. live CD:现场版 CD
|
||||
> 通常不翻译,但是如果翻译,可以译作“现场版”。
|
||||
### 2. live patch: 实时补丁/热补丁
|
||||
> 指 Linux 内核的 live patch 支持。
|
||||
### S
|
||||
|
||||
### 2. LTS(Long Term Support):长期支持
|
||||
> 该缩写词多见于操作系统发行版或者软件发行版名称中,表明该版本属于长期支持版。
|
||||
#### Shebang [ʃɪ'bæŋ]:释伴
|
||||
|
||||
#### M ####
|
||||
Shebang(也称为 Hashbang)是一个由井号和叹号构成的字符序列(`#!`),出现在脚本文件的第一行的前两个字符,后跟解释器路径,如:`#!/bin/sh`,这通常是 Linux 中 shell 脚本的标准起始行。
|
||||
|
||||
#### N ####
|
||||
长期以来,Shebang 都没有正式的中文名称。提议者将其翻译为:“释伴”,即解释伴随行的简称,同时又是 Shebang 的音译。(关于这个词汇的翻译,在下面的首次链接中有其它的建议和讨论。)
|
||||
|
||||
#### O ####
|
||||
### 1. Orchestration:编排
|
||||
> 描述复杂计算机系统、中间件(middleware)和业务的自动化的安排、协调和管理(来自维基百科)。
|
||||
- 提议者:GoLinux
|
||||
- 首次链接:https://linux.cn/article-3664-1.html
|
||||
|
||||
#### P ####
|
||||
### 1. P-code(Pseudo-code):伪代码语言
|
||||
> 一种解释型语言,执行方式介于编译型语言和解释型语言之间。和解释型语言一样,伪代码编程语言无需编译,在执行时自动转换成二进制形式。然而,和编译型语言不同的是,这种可执行的二进制文件是以伪代码的形式而不是机器语言的形式存储的。伪代码语言的例子有 Java、Python 和 REXX/Object REXX。
|
||||
#### Shell :交互界面
|
||||
|
||||
### 2. PAM(Pluggable Authentication Modules):可插拔认证模块
|
||||
> 用于系统安全性的可替换的用户认证模块,它允许在不知道将使用何种认证方案的情况下进行编程。这允许将来用其它模块来替换某个模块,却无需重写软件。
|
||||
Shell 是 Unix/Linux 等系统的 `sh`、`bash` 等命令行的接口程序,包括 DOS/Windows 的 `command.com`/`cmd.exe` 等其实也属于此类,只是通常不这样称呼。
|
||||
|
||||
### 3. Port/Ported/Porting:移植
|
||||
> 一个过程,即获取为某个操作系统平台编写的程序,并对其进行修改使之能在另一 OS 上运行,并且具有类似的功能。
|
||||
这个词汇也是一个一直没有翻译而径直使用的计算机词汇。我们也没有见到(找到)合适的翻译。但是我们在 LCTT 译者 CanYellow 翻译的一篇文章中见到他将其翻译为 “交互界面”,我们认为这是一种好的翻译。
|
||||
|
||||
### 4. POSIX(Portable Operating System Interface for uniX):UNIX 可移植操作系统接口
|
||||
> 一组编程接口标准,它们规定如何编写应用程序源代码以便应用程序可在操作系统之间移植。POSIX 基于 UNIX,它是 The Open Group 的 X/Open 规范的基础。
|
||||
注:有些人对此次条的翻译持反对意见,此词条建议尝试性在部分语境中使用。
|
||||
|
||||
#### Q ####
|
||||
- 提议者:CanYellow
|
||||
- 首次链接:https://linux.cn/article-15469-1.html
|
||||
|
||||
#### R ####
|
||||
### 1. RCS(Revision Control System):修订控制系统
|
||||
> 一组程序,它们控制组环境下文件的共享访问并跟踪文本文件的变化。常用于维护源代码模块的编码工作。
|
||||
### 说明
|
||||
|
||||
### 2. RFS(Remote File Sharing):远程文件共享
|
||||
> 一个程序,它让用户访问其它计算机上的文件,就好象文件在用户的系统上一样。
|
||||
|
||||
#### S ####
|
||||
### 1. shebang [ʃɪ'bæŋ]:释伴
|
||||
> Shebang(也称为Hashbang)是一个由井号和叹号构成的字符序列(#!),出现在文本文件的第一行的前两个字符,后跟解释器路径,如:#!/bin/sh,这通常是Linux中shell脚本的标准起始行。
|
||||
> 长期以来,shebang都没有正式的中文名称。Linux中国翻译组将其翻译为:释伴,即解释伴随行的简称,同时又是shebang的音译。
|
||||
|
||||
### 2. Spool(Simultaneous Peripheral Operation On-Line):假脱机
|
||||
> 将数据发送给一个程序,该程序将该数据信息放入队列以备将来使用(例如,打印假脱机程序)
|
||||
|
||||
### 2. Steganography:隐写术
|
||||
> 将一段信息隐藏在另一段信息中的做法。一个示例是在数字化照片中放置不可见的数字水印。
|
||||
|
||||
### 3. Swap:交换
|
||||
> 暂时将数据(程序和/或数据文件)从随机存取存储器移到磁盘存储器(换出),或反方向移动(换入),以允许处理比物理内存所能容纳的更多的程序和数据。
|
||||
|
||||
### 4. Scheduling:调度
|
||||
> 将任务分配至资源的过程,在计算机或生产处理中尤为重要(来自维基百科)。
|
||||
|
||||
#### T ####
|
||||
### 1. Time-sharing:分时
|
||||
> 一种允许多个用户分享处理器的方法,它以时间为基础给每个用户分配一部分处理器资源,按照这些时间段轮流运行每个用户的进程。
|
||||
|
||||
### 2. TL;DR:长篇摘要
|
||||
> Too Long;Didn't Read的缩写词,即太长,未阅的意思。该词多见于互联网社区论坛中,用于指出该文太长,没有阅读,或者标示出一篇长文章的摘要。在论坛回复中,该缩写词也多作为灌水用。因此,Linux中国翻译组将其翻译为:长篇摘要。
|
||||
|
||||
#### U ####
|
||||
|
||||
#### V ####
|
||||
### 1. VRML(Virtual Reality Modeling Language):虚拟现实建模语言
|
||||
> 一种主要基于 Web 的语言,用于 3D 效果(如构建遍历)。
|
||||
|
||||
#### W ####
|
||||
### 1. Wrapper:封装器
|
||||
> 用于启动另一个程序的程序。
|
||||
|
||||
#### X ####
|
||||
|
||||
#### Y ####
|
||||
|
||||
#### Z ####
|
||||
此文档会根据建议不断更新,其固定地址为: https://github.com/LCTT/TranslateProject/blob/master/Dict.md ,欢迎大家提交议题或拉取请求来完善它。
|
273
published/20210819 Short option parsing using getopt in C.md
Normal file
273
published/20210819 Short option parsing using getopt in C.md
Normal file
@ -0,0 +1,273 @@
|
||||
[#]: subject: "Short option parsing using getopt in C"
|
||||
[#]: via: "https://opensource.com/article/21/8/short-option-parsing-c"
|
||||
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "toknow-gh"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15589-1.html"
|
||||
|
||||
在 C 语言中使用 getopt 解析命令行短选项
|
||||
======
|
||||
|
||||
> 通过使用命令行让用户告诉程序要什么,可以让程序更加灵活。
|
||||
|
||||
![][0]
|
||||
|
||||
在已经知道要处理什么文件和对文件进行哪些操作的情况下,编写处理文件的 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` 作为比较条件的原因。
|
||||
|
||||
你也可以用这个方式实现自己的 `cat` 或 `cp` 命令。`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` 用 `^x` 和 `M-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()`的使用语法和结构上的提示,可以 [下载我制作的速查表][8]。它提供了最小可行代码,并列出了你需要了解的一些全局变量的含义。速查表的一面是 `getopt()` 的用法,另一面是 `getopt_long()`的用法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/8/short-option-parsing-c
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[toknow-gh](https://github.com/toknow-gh)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_code_programming_laptop.jpg?itok=ormv35tV (Person programming on a laptop on a building)
|
||||
[2]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html
|
||||
[3]: http://www.opengroup.org/onlinepubs/009695399/functions/puts.html
|
||||
[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html
|
||||
[5]: http://www.opengroup.org/onlinepubs/009695399/functions/fputc.html
|
||||
[6]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html
|
||||
[7]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html
|
||||
[8]: https://opensource.com/downloads/c-getopt-cheat-sheet
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/02/141038srs54y5t4pv3r1ym.jpg
|
@ -0,0 +1,96 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (CanYellow)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-15388-1.html)
|
||||
[#]: subject: (How open principles will impact the future of work)
|
||||
[#]: via: (https://opensource.com/open-organization/21/1/open-is-future-of-work)
|
||||
[#]: author: (Ron McFarland https://opensource.com/users/ron-mcfarland)
|
||||
|
||||
开放原则将如何影响未来工作
|
||||
======
|
||||
|
||||
> 在许多方面,我们的工作性质塑造了我们。那么,未来工作的性质将发生巨大变化,我们又该做何准备呢?
|
||||
|
||||
![][0]
|
||||
|
||||
如果我们将“工作”定位为获得某种回报的任何形式的付出,那么工作是,并且一直是,决定我们是谁的主要因素之一。工作是我们生活的一个重要方面。在工作中(不论这对我们意味着什么),我们结识朋友,我们获得智力激励和情感满足的源泉,我们得到成长,我们感受自身无穷的创造性。对于我们的家人、朋友、社区和社会而言,工作极其重要,我们不应轻视工作的重要性亦或视其为理所当然。
|
||||
|
||||
因此如果未来 [工作的性质将发生变化][2],这可能意味着恰恰是我们 _自我认知_ 中的某些关键要素将发生变化。我们应该认真准备应对这些转变。
|
||||
|
||||
考察自第一次工业革命(18、19世纪)以来的工作转变,很多人从从事农业劳动转为进入城市工厂工作,这从根本上改变了他们的生活方式。新的工作方式需要全新的、更专业的工作技能,而不再是农村经济中常见的手艺。接下来的几十年里,当我们检视我们的个人工作环境时,我们可能会发现工业时代以来的这一趋势可能发生逆转:从层级制度、可代替的通用技术与活动,重新转变为横向协作与对专业知识的熟练掌握的更高要求(回到手艺时代)。
|
||||
|
||||
不过,这一次,这些转变的到来将是全球性的而非区域性的,而且转变的速度要快的多。
|
||||
|
||||
在这一新的工作环境中,[开放组织原则][3] 将扮演关键性的角色。
|
||||
|
||||
本系列中,我将回顾 [Lynda Gratton 教授的作品《转变》][4](LCTT 译注:中译本:《转变:未来社会工作岗位需求变化及应对策略》,ISBN:9787121152894),本书成书于 2014 年(LCTT 译注:本书原版有 [2011 版][T1] 与 [2014 版][T2]),书中数据于 2010 年收集,但今天仍然适用(将来也一样)。本书中,Gratton 教授指出了工作将在 2025 到 2050 年间如何变化。这是关键信息,因为它有助于我们在准备和发展我们的职业生涯时作出正确的选择。
|
||||
|
||||
Gratton 教授阐释了在上述时间段内影响未来工作的主要因素。本系列中,我们将对它们做一个总结并解释开放组织原则如何融入它们之中。
|
||||
|
||||
### 影响未来工作的五个因素
|
||||
|
||||
煤炭与蒸汽动力的发明推动了第一次工业革命。[Gratton 教授][5] 说,今天,五种微妙的力量导致了类似的转变:
|
||||
|
||||
1. 日益增长的全球化活动
|
||||
2. 技术的快速进步
|
||||
3. 人类寿命与人口数量
|
||||
4. 社会与家庭结构变化
|
||||
5. 低碳经济的需求
|
||||
|
||||
简而言之,计算机更快了,材料更强了,药物能治疗更多的疾病使得人类的寿命更长。这些都在不同程度上影响了我们未来的工作方式。以下针对上述每一点的一些说明。
|
||||
|
||||
#### 1、全球化
|
||||
|
||||
在以前的文章 [《全球化:开放的历史》][6] 中,我讨论了全球化的多种动力与影响因素,其中之一就是贸易。从 1950 年到 2010 年的 60 年间,全球贸易量增加了 60 倍,与此同时运输成本降低了,发展中国家不仅看到了贸易增长,而且看到了新的创新。我还在我的另一篇文章 [《历史变迁中的开放组织》][7] 中讨论了历史早期的全球化。我另外在我的文章 [《全球性的开放组织是怎么样的》][8] 中探讨了从现在到未来全球治理的重要性。如 Gratton 教授所言,全球化在未来工作中将发挥不可否认与不可避免的影响。
|
||||
|
||||
> 如果未来工作的性质将发生变化,这可能意味着恰恰是我们自我认知中的某些关键要素将发生变化。我们应该认真准备应对这些转变。
|
||||
|
||||
#### 2、技术
|
||||
|
||||
计算成本一直在以惊人的速度下降,它还将继续下降。这有助于连接到目前为止仍然大部分被隔离在更大的全球经济之外的数十亿人。他们将开始进入劳动力市场并成为更有影响力的消费者。与此同时,计算机与高级自动化在未来将 [取代人类工作][9],这都将影响未来的工作转变。
|
||||
|
||||
#### 3、人口数量与寿命
|
||||
|
||||
Gratton 教授还记录了不同世代的人对未来工作的影响,尤其是在美国。年轻一代在未来将扮演主要角色,他们的态度将不同于上一代。此外,全球不同地区的出生率将影响经济繁荣。由于一些地区的人口降低而另一些的将会增加,将会出现更多的移民。他们将移民至 Gratton 教授谓之“创新集群”的地方。最后,Gratton 教授认为全球预期寿命将会变化。截至 2025 年,世界人口的 10% 将超过 65 岁,这些人口将更可能希望继续工作,以得到持续的收入、精神刺激、身体活动,与他人的联系以及生活的意义与目的的源泉。考虑到今天的很多儿童都更可能拥有超过 100 岁的寿命,如果他们在 65 岁退休,他们余下的至少 35 年里将做不了太多事情。基于这样的考虑,在未来职业道路的多次转换以及在社区与志愿服务项目中的积极参与将会大大拓展。
|
||||
|
||||
#### 4、社会
|
||||
|
||||
常规的变化之外,Gratton 教授还描述了一些社会变化。她说,未来女性在工作上的角色将会变化,人们将比以往拥有更多的选择来塑造他们希望的生活;随着个人劳动生产率的提升,平均空闲时间将比以往更多。
|
||||
|
||||
#### 5、能源
|
||||
|
||||
我在 [资源工业革命][10] 上的一篇演讲中讨论了资源节约型工业的扩张。格拉特教授为该对话补充了一些有价值的观点。她认为气候变化将逐渐成为主要议题,并导致运输与消费的降低。尤其是世界范围内的水资源供给将无法跟上用水需求。海水淡化项目将大幅扩张(可能由正在开发的 [第四代][11] 分布式小型模块化核电站提供动力)。环境灾难将使人们背井离乡,并在世界范围内形成移民社区。更多能效高的生活方式将会被发现和引入,这将影响未来工作。
|
||||
|
||||
### 为未来提前准备
|
||||
|
||||
上述五种力量将推动未来工作方式发生根本性的改变,Gratton 教授认为我们现在就需要开始为这样的未来提前做准备。本系列的下一篇文章中,我将介绍 Gratton 教授对未来的展望以及应对快速变化的未来的一些情境。个人如何将这些变化视作职业机会?另一方面,如果简单地选择对即将到来的变化 _视而不见_ 又会发生什么?我将回顾 Gratton 教授在这些问题上的思考。同样的,我也将解释开放原则如何形成必经的变革的核心。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/open-organization/21/1/open-is-future-of-work
|
||||
|
||||
作者:[Ron McFarland][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/ron-mcfarland
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife)
|
||||
[2]: https://opensource.com/open-organization/18/7/transformation-beyond-digital-2
|
||||
[3]: https://theopenorganization.org/definition/
|
||||
[4]: http://lyndagratton.com/books/the-shift/
|
||||
[5]: https://en.wikipedia.org/wiki/Lynda_Gratton
|
||||
[6]: https://opensource.com/open-organization/20/7/globalization-history-open
|
||||
[7]: https://opensource.com/open-organization/20/8/global-history-collaboration
|
||||
[8]: https://opensource.com/open-organization/20/9/global-open-organization
|
||||
[9]: https://opensource.com/open-organization/19/9/claiming-human-age-of-AI
|
||||
[10]: https://www.slideshare.net/RonMcFarland1/the-starting-of-the-third-industrial-revolution
|
||||
[11]: https://en.wikipedia.org/wiki/Generation_IV_reactor
|
||||
|
||||
[T1]: https://isbnsearch.org/isbn/9780007427956
|
||||
[T2]: https://isbnsearch.org/isbn/9780007525850
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/28/094540cru0c2b8g2rz2ur2.jpg
|
@ -0,0 +1,90 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (CanYellow)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-15344-1.html)
|
||||
[#]: subject: (Understanding Linus's Law for open source security)
|
||||
[#]: via: (https://opensource.com/article/21/2/open-source-security)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
理解开源安全中的林纳斯定律
|
||||
======
|
||||
|
||||
<ruby>林纳斯定律<rt>Linus's Law</rt></ruby>即“<ruby>只要有足够多的眼睛关注,任何漏洞都无处隐藏<rt>given enough eyeballs, all bugs are shallow</rt></ruby>”。那么林纳斯定律是如何应用于开源软件安全的呢?
|
||||
|
||||
![][0]
|
||||
|
||||
这篇文章讨论 Linux 对开源软件安全的影响。
|
||||
|
||||
开源软件的一个常被赞扬的优点是它的代码能够被任何人审查(安全专家通常称之为“代码审计”)。然而,如果你真的去问很多开源软件用户他们上一次检查代码是什么时候。你大概只能收获他们茫然的眼神或者是喃喃的低语。此外,对于一些相当大型的开源应用,有效地审查每一行代码也是困难的。
|
||||
|
||||
根据上述这些稍显不安的事实,我们不得不思考:如果没有人察看这些代码,它是开源还是闭源真的有关系吗?
|
||||
|
||||
### 你应该相信开源吗?
|
||||
|
||||
计算机爱好者倾向于作出认为开源软件比其他软件更加安全的传统假设。我们通常不会讨论这意味者什么:比较的基础是什么(比什么“更”安全?),或者上述结论是如何得到的。这是一个危险的陈述,因为它表明只要你将一些东西称之为“开源”,它就自动如魔法般地继承了更高的安全性。这不是开源,事实上,这正是开源安全非常反对的。
|
||||
|
||||
除非你已经亲自审计并理解了软件代码,否则就不应该假定一个应用程序是安全的。一但你做到了这一点,就可以给予它 <ruby>终极信任<rt>ultimate trust</rt></ruby>。_终极信任_ 不是对计算机而言的,而是对你本人而言的,至少在这一应用程序被渗透攻击之前,你信任它是因为你选择了相信它是安全的。
|
||||
|
||||
使用者本人是唯一可以对软件代码给予终极信任的人,因此任何人想要获得这样的享受都必须亲自审查代码。相信其他人的话是不管用的。
|
||||
|
||||
在你已经亲自审计并理解了软件代码之前,你对一个应用程序给予的最大信任度是一个范围,可以是从 _根本不信任_ 到 _相当信任_ 之间。然而我们并没有一个关于信任程度的标准对照表,这是一个你必须亲自做出的个人选择。如果你已经从非常信任的人那里听说了一款应用程序是安全的,那么你可能会更信任这个软件,而不是信任那些你没有得到信任建议的东西。
|
||||
|
||||
然而,因为无法审计专有(闭源)软件代码,你不可能给予它 _终极信任_。
|
||||
|
||||
### 林纳斯定律
|
||||
|
||||
现实很骨感,并不是每个人都是程序员,同时也不是每个程序员都有时间检查数以万计的代码行。因此如果你没有亲自审查代码,你就只能选择(一定程度上)相信那些 _亲自_ 审查了代码的人。
|
||||
|
||||
那么,有哪些人会审查代码呢?
|
||||
|
||||
林纳斯定律声称 _只要有足够的眼睛关注,任何漏洞都无处隐藏_,然而我们并不知道多少双眼睛是“足够”的。请不要低估这一数量,应用程序往往经过了远超你想象数量的人员审查。原始开发人员以及后续开发人员显然清楚他们自己写下的代码,不过开源软件往往都是团队成果,开源时间越长,阅读了代码的开发人员越多。新加入的开发人员也必须回顾项目代码的核心部分,因为他们必须学习基础代码以加入新的功能。
|
||||
|
||||
同时,为了使开源软件能够在 Linux 发行版上可用,负责开源软件打包分发的开发人员会加入多个项目。有时一个应用程序可能会在不熟悉项目代码的情况下打包,但是大多数时候,开源软件打包人员都是熟悉所打包的项目代码的。这不仅仅是因为他们不想在他们不信任的软件上签名,还由于他们可能不得不修改代码来使得程序能够正确编译。漏洞报告人员和漏洞修复人员一般也是熟悉代码库的,因为他们需要尝试解决小到运行异常,大到程序崩溃的问题。当然,一些漏洞报告人员不是通过亲自审查项目代码,而是通过关注明显未按预期工作的现象,无意中揭示了代码漏洞。系统管理员通常都是通晓用户依赖的重要应用软件的代码的。最后,还有一些安全研究人员,他们专门深入代码内部以揭露潜在的漏洞。
|
||||
|
||||
### 信任与透明
|
||||
|
||||
很多人先入为主的认为大型软件的审计是基本不可能的,因为它由数以万计的代码行组成。不要被软件运行所需的代码量欺骗了。我们不需要真的阅读数以万计的代码行。代码是高度结构化的,可被利用的代码漏洞仅仅只是其中的一行,不过它通常影响软件的全部功能。
|
||||
|
||||
当然,也有例外。有时仅仅一个系统调用或者链接一个有缺陷的库文件就可能引入一系列漏洞。幸运的是,多亏安全研究人员以及漏洞数据库所扮演的积极角色,这些错误相对而言是容易发现的。
|
||||
|
||||
一些人指着错误追踪系统,比如 <ruby>[通用漏洞披露][2]<rt>Common Vulnerabilities and Exposures</rt></ruby>(CVE)网站,并推断开源软件显而易见是不安全的。毕竟已经向公众公开了大量的安全风险,涉及许多开源项目。但是不要被数据欺骗了。只是因为我们看不到现闭源软件的漏洞,并不意味着闭源软件中不存在漏洞。事实上,已经有很多针对闭源软件的漏洞攻击提出了,闭源软件也是存在漏洞的。区别在于开发者(以及用户)可以查看开源软件的 _所有的漏洞_ 从而降低漏洞的影响。这是扩大对开源软件信任的系统机制的一部分,却正是闭源软件软件所缺少的。
|
||||
|
||||
对于任何代码而言,可能永远没有“足够的眼睛”来发现漏洞,但是开发社区越壮大、越多样化,越有机会发现和修复代码中的缺陷。
|
||||
|
||||
### 信任与人
|
||||
|
||||
在开源社区中,参与同一项目的众多开发者已经发现“不安全”的漏洞,却保持沉默的的可能性是微乎其微的,因为人们很少同意以这样的方式合谋。我们已经看到了在应对 COVID-19 的过程中,人类的行为是如何不一致了,在这里也一样:
|
||||
|
||||
* 我们都发现了漏洞(病毒)。
|
||||
* 我们知晓如何避免它传播(待在家里)。
|
||||
* 然而病毒还是在持续传播,因为总是有一个或者多个人偏离了消减疫情的计划。
|
||||
|
||||
开源软件中的漏洞也一样,如果有人发现了漏洞总会公之于众(当然,我们说的是“假如”能够发现)。
|
||||
|
||||
然而就专有软件而言,有很大可能参与项目的众多开发者即使注意到不安全的漏洞却仍然保持沉默,因为专有模式依赖于薪水。如果一个开发者将漏洞泄漏出来,他可能只是伤害了该专有软件的声誉,进而降低软件的销售额;或者,在更糟糕的情况下,他可能因此而丢了工作。开发人员拿着薪水秘密地研究软件,往往不会谈论其缺陷。如果你曾经是一名开发者,你可能曾经签署过 NDA (LCTT 译注:<ruby>保密协议<rt>Non-Disclosure Agreement</rt></ruby>),也被培训过商业秘密的重要性,等等不一而足。专有软件鼓励在面对严重的秘密缺陷时保持沉默,更多时候甚至是强制要求沉默。
|
||||
|
||||
### 信任与软件
|
||||
|
||||
不要信任未经你审计的软件。
|
||||
|
||||
如果你必须相信未经你审计的软件,那么选择相信已经面向那些更有可能将软件缺陷公之于众的开发者公开代码的软件。
|
||||
|
||||
开源软件并没有比专有软件继承更高的安全性,但是修复它的系统得到了更好的规划、实施和人员配置。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/2/open-source-security
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer)
|
||||
[2]: https://cve.mitre.org
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/13/114637dg6w34suucuupucv.jpg
|
94
published/202212/20210330 A DevOps guide to documentation.md
Normal file
94
published/202212/20210330 A DevOps guide to documentation.md
Normal file
@ -0,0 +1,94 @@
|
||||
[#]: subject: "A DevOps guide to documentation"
|
||||
[#]: via: "https://opensource.com/article/21/3/devops-documentation"
|
||||
[#]: author: "Will Kelly https://opensource.com/users/willkelly"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "Veryzzj"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15349-1.html"
|
||||
|
||||
文档写作的 DevOps 指南
|
||||
======
|
||||
|
||||
> 将文档写作加入到 DevOps 的生命周期中。
|
||||
|
||||
![][0]
|
||||
|
||||
DevOps 正在挑战技术文档的规范,这在 IT 历史上是前所未有的。从自动化到提高交付速度,再到拆除瀑布式软件开发生命周期模型,这意味着业务和技术文档写作的理念需要做出巨大改变。
|
||||
|
||||
以下是 DevOps 对技术文档写作不同方面的影响。
|
||||
|
||||
### 技术写手的角色变化
|
||||
|
||||
技术写手必须适应 DevOps。好消息是,许多技术写手已经加入到开发团队中,并且拥有合作关系和不断增长的产品知识的技术写手很具优势。
|
||||
|
||||
但是如果一个技术写手习惯于独立工作,并依赖于领域专家的草稿作为文档的基础,那么就需要做一些调整。
|
||||
|
||||
进行一些投资,以确保文档和其他与项目有关的内容开发工作获得所需的工具、结构和支持。从改变 [技术写手聘用方式][2] 开始。以 [DevOps 的速度][3] 编写文档需要重新思考内容规划,并打破 DevOps 团队和支持项目的技术写手之间长期存在的隔阂。
|
||||
|
||||
DevOps 使开发团队摆脱了传统文档实践的束缚。首先,文档 [完成的定义][4] 必须改变。一些企业的文化使技术写手成为软件开发的被动参与者。DevOps 提出了新的要求:随着 DevOps 文化的转变,技术写手的角色也应发生变化。技术写手需要(且必须适应)DevOps 提供的透明度。他们必须融入 DevOps 团队。取决于组织如何塑造这个角色,将技术写手带入团队可能会带来技能上的挑战。
|
||||
|
||||
### 文档标准、方法和规格
|
||||
|
||||
虽然 DevOps 还没有影响到技术文档本身,但开源社区已经加强了对应用编程接口(API)文档的帮助,已经有不同规模的企业的 DevOps 团队正在使用这些文档。
|
||||
|
||||
用于记录 API 的开源规范和工具是个非常值得关注的领域。我想这是由于 [谷歌文档季][5] 的影响,它使开源软件项目能够获得专业的技术写作人才来解决他们最关键的文档项目。
|
||||
|
||||
开源 API 属于 DevOps 文档讨论的一部分。云原生应用集成需求的重要性正在上升。[OpenAPI 规范][6](一个定义和记录 API 的开放标准)是在 DevOps 环境下 API 文档的良好资源。然而,该规范会导致文档的创建和更新过程变得很费时,这使其饱受批评。
|
||||
|
||||
曾经也有短暂尝试过创建 <ruby>[持续文档][7]<rt>Continuous Documentation</rt></ruby>,并且还有一个来自 CA(现在的 Broadcom)的创建 [DocOps][8] 框架的运动。然而,DocOps 从来没有作为一个行业运动流行起来。
|
||||
|
||||
DevOps 文档标准的现状意味着 DevOps 团队(包括技术写手)需要在项目的最初阶段就开始创建文档。要做到这一点,你需要把文档作为一个敏捷故事和(同样重要的)管理期望,并且把它与年度绩效评估放在一起执行。
|
||||
|
||||
### 文档工具
|
||||
|
||||
文档的编写应该以一种所有团队成员都可以使用的格式或平台在线进行。MediaWiki、DokuWiki、TikiWiki 和其他 [开源维基][9] 为 DevOps 团队提供了一个编写和维护文档的中央仓库。
|
||||
|
||||
让团队选择他们的维基平台,就像让他们选择他们的其他持续集成/持续开发(CI/CD)工具链一样。开源维基强大之处在于其可扩展性。例如,DokuWiki 包括一系列的扩展,你可以通过安装这些扩展来创建一个符合你的 DevOps 团队的创作要求的平台。
|
||||
|
||||
如果你有足够的野心来加强你的团队的编写和协作能力,[Nextcloud][10](一个开源的云协作套件)是一个让你的 DevOps 团队上网并给他们提供编写文档所需工具的选择。
|
||||
|
||||
### DevOps 最佳实践
|
||||
|
||||
文档在 DevOps 转型中也发挥着作用。例如,你会想要记录组织从 DevOps 实现效率和流程增益的最佳实践,这些信息太重要了,不能靠着 DevOps 团中之间口耳相传。如果你所在的组织有多个 DevOps 团队,那么文档就是统一的力量,它可以促进最佳实践的标准化,并设置了衡量代码质量的基准指标。
|
||||
|
||||
一般情况下,开发人员承担了记录 DevOps 实践的工作。即使他们的组织有技术写手,他们也可能跨开发团队工作。因此,开发人员和系统管理员能够捕捉、记录和交流他们的最佳实践是很重要的。这里有一些朝正确的方向发展的提示:
|
||||
|
||||
* 提前花时间为 DevOps 最佳实践创建标准模板。不要陷入复制在线模板的陷阱。采访利益相关者和团队来创建一个符合团队需求的模板。
|
||||
* 寻找一些创造性的信息收集的方法,例如记录团队会议和使用聊天系统日志来作为文档的基础。
|
||||
* 建立一个用于发布最佳实践的维基。使用维基可以跟踪编辑和更新。这样的平台可以帮助团队在最佳实践发生变化时进行更新和维护。
|
||||
|
||||
当在构建 CI/CD 工具链时记录依赖关系是非常明智的。尤其是当加入新的团队成员时,你会发现这些记录非常有用,另外当团队成员忘记一些事情时,这也是一种保险。
|
||||
|
||||
最后,自动化对 DevOps 利益相关者和从业者都很有吸引力。在自动化中断之前,一切都很有趣。拥有自动化运行手册、管理指南和其他内容的文档(并且是最新的)意味着无论何时发生故障,员工都可以让自动化重新工作。
|
||||
|
||||
### 最后一些想法
|
||||
|
||||
DevOps 对于技术文档来说是一个积极的因素。它将内容开发纳入 DevOps 生命周期,并打破组织文化中开发人员和技术作者之间的隔阂。在没有技术写手的情况下,团队就可以使用工具来加快文档创作的速度,以与 DevOps 的速度相匹配。
|
||||
|
||||
你的组织将如何把文档加入到 DevOps 生命周期?请在评论区分享你的经验。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/3/devops-documentation
|
||||
|
||||
作者:[Will Kelly][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Veryzzj](https://github.com/Veryzzj)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/willkelly
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/typewriter-hands.jpg?itok=oPugBzgv "Typewriter with hands"
|
||||
[2]: https://opensource.com/article/19/11/hiring-technical-writers-devops
|
||||
[3]: https://searchitoperations.techtarget.com/opinion/Make-DevOps-documentation-an-integral-part-of-your-strategy?_ga=2.73253915.980148481.1610758264-908287796.1564772842
|
||||
[4]: https://www.agilealliance.org/glossary/definition-of-done
|
||||
[5]: https://developers.google.com/season-of-docs
|
||||
[6]: https://swagger.io/specification/
|
||||
[7]: https://devops.com/continuous-documentation
|
||||
[8]: https://www.cmswire.com/cms/information-management/the-importance-of-docops-in-the-new-era-of-business-027489.php
|
||||
[9]: https://opensource.com/article/20/7/sharepoint-alternative
|
||||
[10]: https://opensource.com/article/20/7/nextcloud
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/15/101537c4kcxxzqzh6fxkor.jpg
|
82
published/202212/20210917 Open source game achievements.md
Normal file
82
published/202212/20210917 Open source game achievements.md
Normal file
@ -0,0 +1,82 @@
|
||||
[#]: subject: "Open source game achievements"
|
||||
[#]: via: "https://fedoramagazine.org/open-source-game-achievements/"
|
||||
[#]: author: "Dennis Payne https://fedoramagazine.org/author/dulsi/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "toknow-gh"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15389-1.html"
|
||||
|
||||
Gamerzilla:一个开源游戏成就系统
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
Photo by [Michał Parzuchowski][2] on [Unsplash][3]
|
||||
|
||||
> 了解开源游戏成就系统 Gamerzilla。它使游戏开发者能够独立于游戏平台实现成就系统。
|
||||
|
||||
一些开源游戏的质量已经媲美商业游戏。尽管还难以比肩 3A 大作,但开源游戏在独立游戏中已颇具竞争力。不过,游戏玩家的期望是随时间变化的。早期的游戏只有高分成就。不断增加的成就种类促使玩家反复重玩游戏。比如你可能达到了满级,却还没有找到所有隐藏物品或没有完成全物品收集。Xbox 360 推出了首个在线多游戏成就系统。随后其它游戏平台也纷纷推出了自己的成就系统。
|
||||
|
||||
开源游戏在很大程度被游戏平台的成就系统排除在外。你可以在 Stream 上发布开源游戏,但这需要付费。游戏平台主要与公司合作,而不是与自由软件社区合作。这也进一步把玩家锁定在了非自由的游戏平台上。
|
||||
|
||||
商业游戏开发商也没有得到太多好处。由于不能共享成就,一些享受成就的玩家拒绝从其他商店购买游戏。这种锁定效应增强了游戏平台的话语权。由于各个游戏平台使用不同的系统,开发者不得不针对它们分别进行适配和测试。较小的游戏平台则可能完全被忽略掉。并且平台方能够访问到所有使用该平台的公司的成就数据,这些数据可以被用来扩大竞争优势。
|
||||
|
||||
### Gamerzilla 的架构
|
||||
|
||||
[Gamerzilla][4] 是一个致力于改善这种现状的开源游戏成就系统。Gamerzilla 在设计上同时考虑了开源游戏和商业游戏。你可以运行自己的 Gamerzilla 服务器,使用游戏商店提供的服务器,甚至 Linux 发行版提供的服务器。服务器也可以由其他团体来运行。在哪里购买游戏不再重要。成就数据都会上传到你的 Gamerzilla 服务器上。
|
||||
|
||||
一个基本的成就系统需要两个要素:游戏和 Gamerzilla 服务器。然而随着游戏数量增长,这种设计会暴露出其缺点。每个游戏都需要证书才能上传数据到服务器。由于拥有大量的游戏资源,并且能够在不同游戏商店之间同步数据,游戏启动器成为了众多玩家的选择。通过让启动器支持 Gamerzilla,游戏本身就不再需要证书了。游戏结果直接从启动器上传到 Gamerzilla 服务器。
|
||||
|
||||
freegamedev.net 曾提供了社交网络系统 Hubzilla。我们基于此开发了一个插件来进行 Gamerzilla 的开发。不幸的是 Hubzilla 的一次升级导致了 freegamedev.net 的服务故障,因此 freegamedev.net 决定不再提供它了。
|
||||
|
||||
目前 Gamerzilla 服务器有两种实现。维护 Hubzilla 是一项复杂的工作,所以我们用 .Net 和 React 开发了一个独立的 Gamerzilla 服务器。游戏调用的 API 是相同的,所以不用关心连接的服务器是哪种实现。
|
||||
|
||||
游戏启动器的开发和支持工作通常是滞后的。为了方便启动器增加对 Gamerzilla 的支持,我们开发了 libgamerzilla。这个库负责处理启动器、游戏和 Gamerzilla 服务器之间的交互。目前只有 GameHub 实现了一个支持 Gamerzilla 的版本,并将在近期整合到项目中。Fedora 上的 libgamerzilla-server 是一个临时解决方案。它不启动游戏,而是监听成就并把成就上传到服务器。
|
||||
|
||||
支持 Gamerzilla 的游戏在不断增长。与游戏启动器一样,开发者使用 libgamerzilla 来完成 Gamerzilla 的集成工作。这个库由 C 语言实现,已经被 Python 和 nim 等多种编程语言使用。对于那些已经有成就系统的游戏,只需要花几天时间就可以完成对 Gamerzilla 的支持。其他游戏想要支持 Gamerzilla,大部分时间都是花在收集信息和授予成就上。
|
||||
|
||||
### 架设服务器
|
||||
|
||||
架设服务器最容易的方式是使用 Hubzilla 插件。但是运行 Hubzilla 站点却不是一件轻松的事情。在 Fedora 上架设基于 .Net 和 React 的服务器相对来说要容易一些,尽管这仍然需要许多步骤。详细步骤请参考 [readme][5] 文件。需要这么多步骤的一部分原因是目前没有预编译好的发布版本。这意味着你需要自己安装 .Net,动手构建 React 源码部分。构建完成之后,React 代码会直接运行在 Apache 中。.Net 后端则运行在单独的服务上。Apache 作为代理负责把所有 Gamerzilla API 请求转发给后端服务。
|
||||
|
||||
按上面的步骤操作,Gamerzilla 已经运行起来了,但是现在还没有用户。当然应该有一个简单的方式来创建管理员和注册新用户。但是该功能还没有完成。目前只能通过 sqlite3 命令行来录入用户信息。具体步骤请参考 [readme][5] 文件。用户可以是公开可见的,也可以是隐藏的。批准标记可以让新用户不立刻使用该系统,但是网络注册是必须的。在设计时我们已经考虑了用户相关模块的可替换性。通过替换 `backend/Service/UserService.cs` 就可以与其他站点进行集成。游戏网站也可以通过这种方式来为用户提供 Gamerzilla 成就系统。
|
||||
|
||||
目前 Gamerzilla 的后端使用的是 sqlite 数据库。我们还没有对它进行过性能测试。我们预计较大型的应用安装需要改进系统以使用更鲁棒的数据库。
|
||||
|
||||
### 测试
|
||||
|
||||
目前要找一个支持 Gamerzilla 的游戏启动器太难了。如果你安装了 libgamerzilla-server,就可以在命令行中运行 `gamerzillaserver` 命令。首次运行该命令时需要输入 URL 和登录信息。以后再运行时会直接从配置文件读取这些信息。目前更正错误的唯一方法是删除 `.local/share/gamerzillaserver/server.cfg` 再重新运行 `gamerzillaserver` 命令。
|
||||
|
||||
大多数游戏还没有支持 Gamerzilla 的版本。[itch.io 上的 《Pinball Disc Room》][6],它的 Linux 版本支持 Gamerzilla,但是它的网页版是没有成就系统的。这款游戏只有两个成就:一个是存活 10 秒钟,另一个是解锁并使用隧道。只需要稍加练习,你就能获得一个成就。由于这款游戏没有可视化的成就提示消息,你需要查看 Gamerzila 服务器才能确认成就。
|
||||
|
||||
目前打包到 Fedora 中的游戏都还不支持 Gamerzila。《SuperTuxKart》 已经整合了对 Gamerzila 的支持,正在等待发布新版本。《Seahorse adventures》 和 《Shippy 1984》 添加了成就,但是新发布版本还没有打包。还有一部分游戏由我们独立完成了对 Gamerzila 的支持,但我们的<ruby>拉取请求<rt>pull request</rt></ruby>或其它联系尝试还没有得到开发者的回应。
|
||||
|
||||
### 后续工作
|
||||
|
||||
Gamerzilla 需要更多游戏的支持。目前已经有很多游戏支持 Gamerzilla,并且正在以大约每月一个的速度增长。如果你有喜欢的游戏,可以请求开发方支持 Gamerzilla。如果你是游戏开发者,并且在支持 Gamerzilla 上需要技术支持,请联系我们。
|
||||
|
||||
服务器的开发工作在缓步开展中,我们希望不久之后就会有一个可用的注册系统。在那之后我们可能会建立一个永久托管站点。目前你可以看到我们的 [测试服务器][7]。一些人对于使用 .Net 作为后端表示担忧。我们的 API 并不复杂,可以很容易用 Python 重写。
|
||||
|
||||
最大的不确定性来自游戏启动器方面。GameHub 希望有一个通过用的成就接口。未来我们可能会在这方面与他们开展合作。增加对 itch.io 应用的支持可以提升系统的关注度。另一种方案是完全抛开启动器。也许可以将 gamerzillaserver 添加到 Gnome 中。然后你就可以在一个设置页面里配置 URL 和登录信息。这样任何启动的游戏都可以记录成就了。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/open-source-game-achievements/
|
||||
|
||||
作者:[Dennis Payne][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[toknow-gh](https://github.com/toknow-gh)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/dulsi/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2021/09/game_acheivements-816x345.jpg
|
||||
[2]: https://unsplash.com/@mparzuchowski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[3]: https://unsplash.com/s/photos/jenga?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[4]: http://identicalsoftware.com/gamerzilla/
|
||||
[5]: https://github.com/dulsi/gamerzilla.net#readme
|
||||
[6]: https://dulsi.itch.io/pinball-disc-room
|
||||
[7]: http://108.49.106.217/
|
@ -0,0 +1,96 @@
|
||||
[#]: subject: "WiFi 6 Promises Much More than Faster Speeds"
|
||||
[#]: via: "https://www.opensourceforu.com/2022/06/wifi-6-promises-much-more-than-faster-speeds/"
|
||||
[#]: author: "Sharon Katta https://www.opensourceforu.com/author/sharon-katta/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "cool-summer-021"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15369-1.html"
|
||||
|
||||
WiFi 6 带来的不仅是高速
|
||||
======
|
||||
|
||||
> WiFi 6 提高了网络连通性,它在不久的将来有望为数万亿台设备组网,并且能够不间断而高效地工作。它虽然在 2019 年就取得了官方认证,但由于疫情原因,它的测试工作面临不少挑战。本文旨在对这项技术进行概述。
|
||||
|
||||
![WiFi-6][1]
|
||||
|
||||
WiFi 技术的下一代标准,称为 “WiFi 6”,也可以称为 “AX WiFi” 或 “802.11ax”。它是为满足指数级增长的设备组网需求而产生的,因此也可以用于 VR 和智能家居。它是现有的 802.11ac WiFi 标准的升级版,可以应对现有技术在容量、效率、覆盖范围和性能方面遇到的挑战。
|
||||
|
||||
![Figure 1: WiFi 6][2]
|
||||
|
||||
这项技术是在 2014 年进行研发,完成于 2018 年,由 IEEE 高性能无线网络研究组(HEW SG)发布。产品认证于 2019 年后期进行,此时三星 Galaxy Note 10 和 Ruckus R750 使用了这种技术。WiFi 6 运行于 1GHz 和 6GHz 波段,主要的频率为 2.4GHz-5GHz。
|
||||
|
||||
如今,每个家庭平均有九台设备需要连接 WiFi。WiFi 6 主要致力于改善网络质量,而不是提升某些设备的速度。
|
||||
|
||||
### WiFi 6的特点
|
||||
|
||||
- **多用户、多输入、多输出(MU-MIMO):** 路由器和多台设备可以同时通信。在 2.4GHz 和 5GHz 频率上,它支持四个同步的数据流,当这些数据流添加到一个用户时,可以从智能路由器接收到相当大的输入数据的带宽。
|
||||
- **1024-QAM:** 这令 WiFi 6 的每个数据包能编码的字节数更多,吞吐量增加了 25%。它不仅提高了大业务量情况下的通信效率,也最大限度增加了传输速率。这在现代企业应用系统领域有很大的优势。
|
||||
- **正交频分复用(OFDM):** 支持四倍的副载波,速度也提高了 11%。扩展的信号支持用户同时进行更多数据包传输。所以数据包之间的等待时间和延迟就减少了。
|
||||
- **增加的信道宽度:** 80MHz 的波段加入了 160MHz 的信道通信,信道宽度增加了一倍。因此,路由器可以容纳更多用户,为每个用户提供更大的数据流。
|
||||
- **目标唤醒时间(TWT):** 这是 WiFi 6 特有的。它支持每台设备独立协商发送和接收的唤醒时间。它可以增加总体睡眠时间,令电池寿命最大化。它还支持许多额外的网络选项,特别是对 IoT 设备的支持。
|
||||
- **提升安全性:** 一切支持 WiFi 6 的设备都需要包含 WPA3 协议。它可以对未经验证的通信进行加密,针对暴力字典攻击提供了强大的密码保护,以及对敏感信息进行 192 位的加密,提升数据的可靠性。
|
||||
- **波束赋形:** 借助八根天线,波束赋形能提高传输速率,通信范围也因直接定向到某个客户端而扩大。它对快速移动的、可能面临多用户、多输入、多输出的设备起到了支撑作用。波束赋形也有利于控制那些蓄意发出干扰信号的天线的传输。然后信号会被重新定向到新的目标。
|
||||
|
||||
### 支持 WiFi 6 的设备
|
||||
|
||||
到目前为止,路由器、中继器、网状网络和多数 WiFi 使用者还是以 WiFi 5 为标准。WiFi 6 是 2019 年推出的。一些支持 WiFi 5 的早期设备存在一些兼容性问题 —— 它们可以使用 WiFi 6 的网络,但得不到相应的支持服务。
|
||||
|
||||
WiFi 6 的路由器是向后兼容的。应该确保网络已经为此做好了准备。
|
||||
|
||||
WiFi 6 实现了较低的电量消耗,在任何场景(包括 IoT)下,都是个不错的选择。它减少了不必要的数据流动,还会通知设备何时将数据激活或令其睡眠。所以不必要的数据流动减少了,性能和电池寿命也提高了。
|
||||
|
||||
三星 Galaxy Note 10 和 Ruckus R750 是全球第一款经认证支持 WiFi 6 的智能手机和接入设备,苹果的最新款 iPhone 也紧随其后。WiFi 联盟已经确立了认证方案,正如人们预期的那样,等待入市的那些新款无线产品也开始申请认证了。下列设备已支持 WiFi 6:
|
||||
|
||||
* iPhone 11 和之后的型号
|
||||
* 三星 Galaxy S10、S20、Note 10 和 Note 20
|
||||
* 配置 M1 处理器的苹果电脑
|
||||
* 智能电视
|
||||
|
||||
> 为了全面享受到 802.11ax 标准带来的改进,硬件和软件的功能都需要基于这种 WiFi 技术进行升级。
|
||||
|
||||
### 硬件测试
|
||||
|
||||
为了充分挖掘最新款设备的潜力,需要一台 WiFi 6 路由器来运行网络。几年前,这么做的成本很高,但现在我们有多种选择,甚至可以使用网格系统、游戏路由器、范围扩展器等等。只有在进行实际测试时,才可以购买最划算的设备。如今,在速度方面,TP-Link Archer AX6000 是最快的,它击败了所有的竞争者。这款路由器可以以 1523 Mbps 的速率无线传输数据,有效传输距离为 1.5米(5 英尺)。
|
||||
|
||||
很重要的一点,请务必记住,这些路由器提速,并不是在变魔术。理论上的最大速率 9.6 Gbps是实现不了的。这种理论上的最大速率,实际上也会被多台设备分摊掉。
|
||||
|
||||
WiFi 6 侧重于在连接设备密集的地方提供高质量的连接。它不会令单台设备的速率指数级增长,但会使相关的设备运行处于理想水平。
|
||||
|
||||
只有各大互联网服务提供商(ISP)的加速计划与 WiFi 6 路由器结合起来,才能体现它的真正潜力。真正的挑战是那些 ISP 承受的,因为它们需要铺设新型的光纤来利用这种下一代技术。存在一个重要的问题:当ISP 的通信速率变得更快,现有的硬件会变得多余吗?
|
||||
|
||||
### WiFi 6 的应用
|
||||
|
||||
- **大型公共场所(LPV):** 体育馆和会议中心是上千台设备同时联网的公共场所。WiFi 6 能改善参会者体验,增强消费者互动,还能提供附加服务,比如即时回放,订购餐食等。它还支持 LPV 业主开拓新的商业机会。
|
||||
- **交通枢纽:** 公共交通站点也是人们需要同时联网的场所。OFDMA 和 BSS 这类明显具有 WiFi 6 色彩的技术为解决这种问题提供了必要的工具。
|
||||
- **物联网和智慧城市建设:** WiFi 6 的能效令物联网设备可以进入休眠模式,并且可以在预定的间隔内开启信号发射器,以便在无需过多维护的情况下增加现场作业时间。
|
||||
- **教育机构:** 大学校园内的图书馆、礼堂和报告厅内的日间 WiFi 使用密度是最高的,夜晚几乎没有人。WiFi 6 是这类场景的完美选项。
|
||||
|
||||
(LCTT 译注:相关产品推荐部分节略。)
|
||||
|
||||
### 面临的挑战
|
||||
|
||||
WiFi 6 不一定使速度更快,但它能确保在一定范围内的设备速率不会在未来几年变慢。虽然它面临三重挑战,但这些问题常常被忽视。
|
||||
|
||||
- 需要对不支持的设备进行升级:即使 Wifi 6 向后兼容,但只能在最大限度使用这种技术时才能做得合理。这意味着每次都要更新设备。
|
||||
- 内部网络以外的速度和性能:WiFi 6 能为诸如云文件共享之类服务提供极好的连接性。然而,ISP 的相关资源也会影响速度和性能。
|
||||
- 覆盖范围问题:在各个国家,传输信号和带宽都是由法律规定上限的。因此,为了符合法律规定的上限,WiFi 6 的覆盖范围也是受限的。
|
||||
|
||||
尽管存在这些挑战,一些企业,像 Aruba、华硕、AT&T、Boingo、博通、思科、Comcast、CommScope、Cypress、Extreme Networks、英特尔、Netgear、Orange、高通、TP-Link 和小米,都在关注 WiFi 6 更多的可能性。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2022/06/wifi-6-promises-much-more-than-faster-speeds/
|
||||
|
||||
作者:[Sharon Katta][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[cool-summer-021](https://github.com/cool-summer-021)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.opensourceforu.com/author/sharon-katta/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.opensourceforu.com/wp-content/uploads/2022/05/WiFi-6.jpg
|
||||
[2]: https://www.opensourceforu.com/wp-content/uploads/2022/05/WiFi-6-1.jpg
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/21/165355hi20ky6mchmj0h38.jpg
|
@ -0,0 +1,152 @@
|
||||
[#]: subject: "Linux su vs sudo: what's the difference?"
|
||||
[#]: via: "https://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin"
|
||||
[#]: author: "David Both https://opensource.com/users/dboth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "chai001125"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15347-1.html"
|
||||
|
||||
Linux 中的 su 和 sudo 命令有什么区别?
|
||||
======
|
||||
|
||||
> 本文将比较非 root 用户提权为 root 用户的两个 Linux 命令 的区别。
|
||||
|
||||
![][0]
|
||||
|
||||
`su` 和 `sudo` 命令都允许用户执行非特权用户不允许做的系统管理任务,即只有 root 用户能执行的命令。有些人更喜欢 `sudo` 命令:例如 [Seth Kenlon][2] 最近发布的一篇 《[在 Linux 上使用 sudo 的 5 个理由][3]》,他在其中详细阐述了 `sudo` 命令的许多优点。
|
||||
|
||||
但是,相较于 `sudo` 命令,我**更偏好于 `su` 命令** 来做系统管理工作。在本文中,我比较了这两个命令的区别,并解释了为什么我更喜欢 `su` 而不是 `sudo`,但我仍然同时使用这两个命令的原因。
|
||||
|
||||
### 过去的系统管理员主要使用 su 命令
|
||||
|
||||
`su` 和 `sudo` 命令是为**不同的世界**设计的。早期的 Unix 计算机需要全职系统管理员,他们使用 root 用户作为唯一的管理帐户。在这个古老的世界里,有管理员密码的人会在电传打字机或 CRT 终端(例如 DEC VT100)上以 root 用户登录,然后执行一些管理 Unix 计算机的工作。
|
||||
|
||||
管理员还会有一些非 root 帐户,用于执行一些非 root 的任务,例如编写文档和管理电子邮件等。在这些 Unix 计算机上通常有许多非 root 帐户,他们都不需要完全的 root 访问权限,只需要以 root 权限运行很少的命令,大约 1 至 2 个就可以了。许多系统管理员以 root 用户登录,完成 root 工作,并在任务完成后,退出 root 会话。有时候,系统管理员需要整天以 root 用户来登录,因为 `sudo` 命令需要键入更多的内容才能运行必要的命令,因此大多数系统管理员很少使用 `sudo` 命令。
|
||||
|
||||
`sudo` 和 `su` 这两个命令都能够提权为 root 用户,但它们实现的方式大不相同。这种差异是由于它们**最初打算用于不同的情况**。
|
||||
|
||||
### sudo 命令
|
||||
|
||||
`sudo` 命令的初衷是让 root 用户能够让几个非 root 用户访问他们经常需要的一两个特权命令。`sudo` 命令允许非 root 用户暂时地获得更高权限,来执行一些特权命令,例如添加和删除用户、删除属于其他用户的文件、安装新软件以及管理现代 Linux 主机所需的任何命令。
|
||||
|
||||
`sudo` 命令允许非 root 用户访问一两个 _需要更高权限_ 的常用命令,这样可以帮助系统管理员节省来自用户的许多请求,并减少等待时间。`sudo` 命令不会将用户帐户切换为 root 用户,因为大多数非 root 用户永远不应该拥有完全的 root 访问权限。在大多数情况下,`sudo` 允许用户执行一两个命令,然后提权就会过期。在这个通常为 5 分钟的短暂的提权时间内,用户可以执行任何需要提权的管理命令。需要继续使用提权的用户可以运行 `sudo -v` 命令来重新验证 root 访问权限,并将提权时间再延长 5 分钟。
|
||||
|
||||
使用 `sudo` 命令还有一些副作用,例如生成非 root 用户使用命令的日志条目及其 ID。这些日志可以在之后作为出现问题的检验,来给用户更多的操作培训。(你以为我会说“问责”用户,对吧?)
|
||||
|
||||
### su 命令
|
||||
|
||||
`su` 命令能够将非 root 用户提权到 root 权限 —— 事实上,能让非 root 用户成为 root 用户。唯一的要求是用户知道 root 密码。因为用户已经以 root 权限登录,所以之后的操作就没有限制了。
|
||||
|
||||
`su` 命令所提供的提权没有时间限制。用户可以作为 root 执行命令,不需要进行重新验证是否有 root 权限。完成任务后,用户可以执行退出命令 `exit`,从 root 用户恢复到自己原来的非 root 帐户。
|
||||
|
||||
### su 和 sudo 在使用上的争议和变化
|
||||
|
||||
最近在 `su` 与 `sudo` 的使用上存在一些分歧。
|
||||
|
||||
> 真正的系统管理员不会使用 `sudo`。—— Paul Venezia
|
||||
|
||||
Venezia 在他的 [InfoWorld 文章][4] 中辩称,对于许多担任系统管理员的人来说,`sudo` 是一个不必要的工具。他没有花太多时间为这个观点进行解释,他只是把它说成了一个事实。我同意他对于系统管理员的观点,因为我们不需要 `sudo` 来完成我们的工作。事实上,`sudo` 使得事情变得更复杂了。
|
||||
|
||||
然而,
|
||||
|
||||
> 时代在“改变”。—— Bob Dylan
|
||||
|
||||
Bob Dylan 是对的,尽管他唱的歌不是指计算机(LCTT 译注:Bob Dylan 是美国创作歌手、艺术家和作家,这里指他不是针对于电脑而说的)。
|
||||
|
||||
自从人手一台的**个人计算机**时代到来,计算机的管理方式发生了重大变化。在许多环境中,计算机的使用者也是它的管理员,这使得为这些用户提供一些对 root 权限的访问是有必要的。
|
||||
|
||||
一些现代发行版,例如 Ubuntu 及其衍生版本,只能使用 `sudo` 命令来执行特权命令。在这些发行版中,用户无法直接以 root 用户身份登录,甚至无法通过 `su` 切换到 root,因此需要 `sudo` 命令来允许非 root 用户获得 root 权限。在这一环境中,所有系统管理任务均使用 `sudo` 来执行。
|
||||
|
||||
通过锁定 root 帐户并将常规用户帐户添加到“轮子”组(`wheel`),可以实现此配置,但是这种配置很容易被绕过。接下来,让我们在 Ubuntu 主机或虚拟机上尝试一些小实验吧。我在这里说明一些我的设置,以便你可以根据需要来重现它。我安装的是 Ubuntu 16.04 LTS1,并使用 VirtualBox 将其安装在虚拟机中。在安装过程中,我创建了一个非 root 用户 `student`,为了简便起见我给这个用户设置了一个简单的密码。
|
||||
|
||||
以 `student` 用户身份登录 Ubuntu,并打开终端。查看 `/etc/shadow` 文件中的 root 条目,其中存储了经哈希的密码。
|
||||
|
||||
```
|
||||
student@ubuntu1:~$ cat /etc/shadow
|
||||
cat: /etc/shadow: Permission denied
|
||||
```
|
||||
|
||||
可以看到终端拒绝了我们对 `/etc/shadow` 的访问,因此我们无法查看 `/etc/shadow` 文件。所有发行版都是如此,以防止非特权用户看到和访问加密的密码,因为非特权用户可能会使用常见的黑客工具来破解这些密码。
|
||||
|
||||
现在,让我们使用 `su -` 命令来成为 root 用户。
|
||||
|
||||
```
|
||||
student@ubuntu1:~$ su -
|
||||
Password: <Enter root password – but there isn't one>
|
||||
su: Authentication failure
|
||||
```
|
||||
|
||||
认证失败的原因是因为 root 帐户没有密码、并且被锁定了。接下来,使用 `sudo` 命令查看 `/etc/shadow` 文件。
|
||||
|
||||
```
|
||||
student@ubuntu1:~$ sudo cat /etc/shadow
|
||||
[sudo] password for student: <enter the student password>
|
||||
root:!:17595:0:99999:7:::
|
||||
<截取>
|
||||
student:$6$tUB/y2dt$A5ML1UEdcL4tsGMiq3KOwfMkbtk3WecMroKN/:17597:0:99999:7:::
|
||||
<截取>
|
||||
```
|
||||
|
||||
在这里,我仅截取了部分结果,只显示 root 和 `student` 用户的条目。我还缩短了加密密码,以便该条目能显示在一行中。各个字段以冒号(`:`)分隔,第二个字段是密码。请注意,root 的密码字段是一个感叹号(`!`),这表明 root 帐户已被锁定,且无法使用。
|
||||
|
||||
现在,要将 root 帐户变成一个合适的系统管理员,你只需为 root 帐户设置密码。
|
||||
|
||||
```
|
||||
student@ubuntu1:~$ sudo su -
|
||||
[sudo] password for student: <Enter password for student>
|
||||
root@ubuntu1:~# passwd root
|
||||
Enter new UNIX password: <Enter new root password>
|
||||
Retype new UNIX password: <Re-enter new root password>
|
||||
passwd: password updated successfully
|
||||
root@ubuntu1:~#
|
||||
```
|
||||
|
||||
现在,你可以直接以 root 身份登录到控制台,或者直接使用 `su` 登录到 root,而不是在每个命令前都加一个 `sudo`。当然,你也可以在每次想以 root 身份登录时,使用 `sudo su -`,但这又是何必呢?
|
||||
|
||||
请不要误解我的意思。像 Ubuntu 这样的发行版及其上下游衍生版非常好,多年来我已经使用了其中的几个。在使用 Ubuntu 和相关发行版时,我做的第一件事就是设置一个 root 密码,这样我就可以直接以 root 身份登录。其他发行版,如 Fedora 及其相关发行版,现在在安装过程中提供了一些有趣的选择。我注意到的第一个 Fedora 版本是 Fedora 34,我在写我的一本即将出版的书时安装了很多次。
|
||||
|
||||
在安装页面上,可以找到其中一个安装选项,来设置 root 密码。这个新选项允许用户选择“<ruby>锁定 root 帐户<rt> Lock root account </rt></ruby>”,就像 Ubuntu 锁定 root 帐户的方式一样。此页面上还有一个选项,允许使用密码以 root 身份远程 SSH 登录到此主机,但这仅在 root 帐户解锁时有效。第二个选项位于允许创建非 root 帐户的页面上。此页面上的选项之一是“<ruby>让此用户成为管理员<rt> Make this user administrator </rt></ruby>”。选中此选项后,用户 ID 将添加到一个名为 `wheel` 组的特殊组中,该组授权该组的成员使用 `sudo` 命令。Fedora 36 甚至在该复选框的描述中提到了 `wheel` 组。
|
||||
|
||||
可以将多个非 root 用户设置为管理员。使用此方法指定为管理员的任何人都可以使用 `sudo` 命令在 Linux 计算机上执行所有管理任务。Linux 在安装时只允许创建一个非 root 用户,所以其他新用户可以在创建时添加到 `wheel` 组中。root 用户或其他管理员可以使用文本编辑器或 `usermod` 命令直接将现有用户添加到 `wheel` 组。
|
||||
|
||||
在大多数情况下,今天的管理员只需要执行一些基本任务,例如添加新的打印机、安装更新或新软件,或者删除不再需要的软件。这些 GUI 工具需要 root 或管理密码,并将接受来自管理员用户的密码。
|
||||
|
||||
### 在 Linux 上,我是怎么使用 su 和 sudo 的呢
|
||||
|
||||
我**同时使用 `su` 和 `sudo`**。它们都是我所使用的很重要的系统管理员工具。
|
||||
|
||||
我不锁定 root 帐户,因为我需要用 root 帐户来运行我的 [Ansible][5] 脚本和我编写的 [rsbu][6] Bash 程序,来执行备份。这两个程序都需要以 root 身份运行,我编写的其他几个管理 Bash 的脚本也是如此。我**使用 `su` 命令**切换到 root 用户,这样我就可以执行这些脚本和许多其他常见的命令。当我需要确定问题和解决问题时,使用 `su` 命令将我的权限提升到 root 十分有用,因为我不希望 `sudo` 带来的提权会话超时。
|
||||
|
||||
当非 root 用户需要执行这些任务时,我**使用 `sudo` 命令**,来执行需要 root 权限的任务。我在 `sudoers` 文件中设置了非 root 帐户,只允许访问完成任务所需的一两个命令。当我只需要运行一两个需要提权的快速命令时,我自己也会使用 `sudo` 命令。
|
||||
|
||||
### 结论
|
||||
|
||||
实际上只要你把工作完成好了,你使用什么工具都无大碍。你使用的是 Vim 还是 Emacs,是 systemd 还是 SystemV,是 RPM 亦或是 DEB,是 `sudo` 亦或是 `su`,在结果上会有什么区别呢?这里的关键在于你应该使用**最适合你的工具**。Linux 和开源软件的最大优势之一是通常有许多选项可用于我们需要完成的任务。
|
||||
|
||||
`su` 和 `sudo` 都各有长处,如果正确使用的话,两者都是非常安全的。我选择同时使用 `su` 和 `sudo` 命令,基于它们的历史功能,因为这对我来说十分有用。对于我自己的大部分工作,我更喜欢 `su` 命令,因为它与我的工作流程最适配。
|
||||
|
||||
在评论区分享你喜欢的工作方式吧!
|
||||
|
||||
本文摘自于我的书《<ruby>系统管理员的 Linux 哲学<rt>The Linux Philosophy for Sysadmins</rt></ruby>(Apress,2018 年)》一书的第 19 章,并经许可后重新发布。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/6/linux-su-vs-sudo-sysadmin
|
||||
|
||||
作者:[David Both][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[chai001125](https://github.com/chai001125)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/dboth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/bash_command_line.png
|
||||
[2]: https://opensource.com/users/seth
|
||||
[3]: https://opensource.com/article/22/5/use-sudo-linux
|
||||
[4]: http://www.infoworld.com/t/unix/nine-traits-the-veteran-unix-admin-276?page=0,0&source=fssr
|
||||
[5]: https://opensource.com/article/20/10/first-day-ansible
|
||||
[6]: https://opensource.com/article/17/1/rsync-backup-linux
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/14/171220a47je4l0teaonzos.jpg
|
241
published/202212/20220729 Learn Rust by debugging Rust.md
Normal file
241
published/202212/20220729 Learn Rust by debugging Rust.md
Normal file
@ -0,0 +1,241 @@
|
||||
[#]: subject: "Learn Rust by debugging Rust"
|
||||
[#]: via: "https://opensource.com/article/22/7/learn-rust-rustlings"
|
||||
[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "yzuowei"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15395-1.html"
|
||||
|
||||
以调试 Rust 的方式来学习 Rust
|
||||
======
|
||||
|
||||
> Rustlings 是由 Rust 团队维护的开源项目,旨在帮助你通过调试代码的方式来学习 Rust。
|
||||
|
||||
![Ferris the crab under the sea, unofficial logo for Rust programming language][1]
|
||||
|
||||
在我上一篇 [关于 Rustup 的文章][2] 中,我向你们展示了如何安装 Rust 工具链。但是,如果不能上手操作一下 Rust 的话下载工具链又有什么用?学习任何语言都包括阅读现有的代码和写很多的示例程序,这是精通一门语言的好方法。然而,我们还可以走第三条路:调试代码。
|
||||
|
||||
通过调试来学习牵扯到尝试去编译一个已经写好的(满是漏洞的)示例程序,理解编译器生成的错误信息,修复示例代码,然后再重新编译。重复这个过程直到代码能够成功被编译并运行。
|
||||
|
||||
[Rustlings][3] 是一个由 Rust 团队维护的开源项目,旨在帮助你通过调试代码来学习 Rust。它也会一路为你提供提示。如果你是一名 Rust 初学者,并且刚开始阅读或已经读完了 Rust 书籍,那么 Rustlings 就是理想的下一步。Rustllings 帮助你将运用书中所学,并转向开发更大的项目。
|
||||
|
||||
### 安装 Rustlings
|
||||
|
||||
我使用(并推荐)Fedora 电脑来体验 Rustlings,但是任何 Linux 发行版都可以。要安装 Rustlings,你必须下载并运行它的安装脚本。通常建议你以不具备任何特别权限的普通用户(非 root 用户)来运行脚本。
|
||||
|
||||
记住,你需要 Rust 工具链来使用 Rustlings。如果你还没有这些工具链,请参考我 [关于 Rustup 的文章][4]。
|
||||
|
||||
当你准备好时,下载这个安装脚本:
|
||||
|
||||
```
|
||||
$ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh > rustlings_install.sh
|
||||
$ file rustlings_install.sh
|
||||
rustlings_install.sh: Bourne-Again shell script, ASCII text executable
|
||||
```
|
||||
|
||||
阅读脚本以了解它会做什么:
|
||||
|
||||
```
|
||||
$ less rustlings_install.sh
|
||||
```
|
||||
|
||||
然后运行安装:
|
||||
|
||||
```
|
||||
$ bash rustlings_install.sh
|
||||
[...]
|
||||
Installing /home/tux/.cargo/bin/rustlings
|
||||
Installed package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`)
|
||||
All done!
|
||||
```
|
||||
|
||||
运行 `rustlings` 以开始。
|
||||
|
||||
### Rustlings 练习
|
||||
|
||||
你现在可以使用命令 `rustlings`。与标志 `--help` 一起执行来查看可选的选项。
|
||||
|
||||
```
|
||||
$ rustlings --help
|
||||
```
|
||||
|
||||
这个安装脚本也克隆了 Rustlings 的 Git 仓库,并安装了运行示例程序所需的依赖。你可以在 `ruslings` 下的 `exercises` 目录查阅这些示例程序。
|
||||
|
||||
```
|
||||
$ cd rustlings
|
||||
$ pwd
|
||||
/home/tux/rustlings
|
||||
$ ls
|
||||
AUTHORS.md Cargo.toml CONTRIBUTING.md info.toml install.sh README.md target Cargo.lock CHANGELOG.md exercises install.ps1 LICENSE src tests
|
||||
$ ls -m exercises/
|
||||
advanced_errors, clippy, collections, conversions, enums, error_handling, functions, generics, if, intro, macros, mod.rs,
|
||||
modules, move_semantics, option, primitive_types, quiz1.rs, quiz2.rs, quiz3.rs, quiz4.rs, README.md,
|
||||
standard_library_types, strings, structs, tests, threads, traits, variables
|
||||
```
|
||||
|
||||
### 从命令行列出所有练习
|
||||
|
||||
命令 `ruslings` 提供给你一个 `list` 命令用以展示每个示例程序,它的完整路径,以及状态 (默认为 “待定”)。
|
||||
|
||||
```
|
||||
$ rustlings list
|
||||
Name Path Status
|
||||
intro1 exercises/intro/intro1.rs Pending
|
||||
intro2 exercises/intro/intro2.rs Pending
|
||||
variables1 exercises/variables/variables1.rs Pending
|
||||
variables2 exercises/variables/variables2.rs Pending
|
||||
variables3 exercises/variables/variables3.rs Pending
|
||||
[...]
|
||||
```
|
||||
|
||||
在显示结尾处,你会有一个进度报告用来追踪进度。
|
||||
|
||||
```
|
||||
Progress: You completed 0 / 84 exercises (0.00 %).
|
||||
```
|
||||
|
||||
### 查看示例程序
|
||||
|
||||
命令 `rustlings list` 向你展示了现有的程序,所以你可以在任何时候查看这些程序的代码,你只需要将完整路径复制到你的终端作为命令 [cat][5] 或者 [less][6] 的参数:
|
||||
|
||||
```
|
||||
$ cat exercises/intro/intro1.rs
|
||||
```
|
||||
|
||||
### 验证你的程序
|
||||
|
||||
现在你可以开始调试程序了。你可以使用命令 `verify` 来做这件事。注意 Rustlings 选择了列表里的第一个程序(`intro1.rs`)并尝试去编译它,最后编译成功:
|
||||
|
||||
```
|
||||
$ rustlings verify
|
||||
Progress: [-----------------------------------] 0/84
|
||||
✅ Successfully ran exercises/intro/intro1.rs!
|
||||
|
||||
You can keep working on this exercise,
|
||||
or jump into the next one by removing the `I AM NOT DONE` comment:
|
||||
|
||||
6 | // Execute the command `rustlings hint intro1` for a hint.
|
||||
7 |
|
||||
8 | // I AM NOT DONE
|
||||
9 |
|
||||
```
|
||||
|
||||
正如你从结果中所见,尽管示例代码成功编译了,你依然需要做一些工作。每个示例程序的源文件中都带有以下注释:
|
||||
|
||||
```
|
||||
$ grep "NOT DONE" exercises/intro/intro1.rs
|
||||
// I AM NOT DONE
|
||||
```
|
||||
|
||||
虽然第一个程序的编译没有问题,除非你去掉注释 `I AM NOT DONE`,Rustlings 不会移到下一个程序。
|
||||
|
||||
### 来到下一个练习
|
||||
|
||||
一旦你从 `intro1.rs` 中去掉这些注释,你就可以通过再一次运行命令 `rustlings verify` 来到下一个练习。这一次,你会发现 Rustlings 尝试去编译这个系列中的下一个程序(`intro2.rs`),但是遇到了一个错误。你应该调试并修复这个问题,并前进。这是你理解为什么 Rust 说程序有漏洞的至关重要的一步。
|
||||
|
||||
```
|
||||
$ rustlings verify
|
||||
Progress: [>------------------------] 1/84
|
||||
⚠️ Compiling of exercises/intro/intro2.rs failed! Please try again. Here's the output:
|
||||
error: 1 positional argument in format string, but no arguments were given
|
||||
--> exercises/intro/intro2.rs:8:21
|
||||
|
|
||||
8 | println!("Hello {}!");
|
||||
| ^^
|
||||
|
||||
error: aborting due to previous error
|
||||
```
|
||||
|
||||
### 来点提示
|
||||
|
||||
Rustlings 有一个非常好用的 `hint` 参数,这个参数会告诉你示例程序中哪里出错了,以及如何去修复它。你可以认为这是在编译错误信息基础之上,一个额外的帮助选项。
|
||||
|
||||
```
|
||||
$ rustlings hint intro2
|
||||
Add an argument after the format string.
|
||||
```
|
||||
|
||||
基于以上提示,修复这个程序就很简单了。你只需要在语句 `println` 中加一个额外的参数。这个 diff 对比应该能帮你理解发生的变化:
|
||||
|
||||
```
|
||||
< println!("Hello {}!", "world");
|
||||
---
|
||||
> println!("Hello {}!");
|
||||
```
|
||||
|
||||
一旦你做出了修改,并从源代码中去掉了注释 `NOT DONE`,你可以再一次运行 `rustlings verify` 来编译并运行代码。
|
||||
|
||||
```
|
||||
$ rustlings verify
|
||||
Progress: [>-------------------------------------] 1/84
|
||||
✅ Successfully ran exercises/intro/intro2.rs!
|
||||
```
|
||||
|
||||
### 追踪进度
|
||||
|
||||
你无法在一天之内做完所有的练习,忘记练到哪也很常见。你可以执行命令 `list` 来查看你的练习状态。
|
||||
|
||||
```
|
||||
$ rustlings list
|
||||
Name Path Status
|
||||
intro1 exercises/intro/intro1.rs Done
|
||||
intro2 exercises/intro/intro2.rs Done
|
||||
variables1 exercises/variables/variables1.rs Pending
|
||||
variables2 exercises/variables/variables2.rs Pending
|
||||
variables3 exercises/variables/variables3.rs Pending
|
||||
[...]
|
||||
```
|
||||
|
||||
### 运行特定的练习
|
||||
|
||||
如果你不想从头开始并且想要跳过一些练习,Rustlings 允许你使用命令 `rustlings run` 来专注特定的练习。如此可以运行指定的程序而不需要验证之前的课程。例如:
|
||||
|
||||
```
|
||||
$ rustlings run intro2
|
||||
Hello world!
|
||||
✅ Successfully ran exercises/intro/intro2.rs
|
||||
$ rustlings run variables1
|
||||
```
|
||||
|
||||
敲入练习名字可能会变得乏味,但 Rustlings 为你准备了便利的命令 `next` 用来移向系列中的下一个练习。
|
||||
|
||||
```
|
||||
$ rustlings run next
|
||||
```
|
||||
|
||||
### 替代命令 watch
|
||||
|
||||
如果你不想在每次修改后还要敲一次 `verify`,你可以在终端窗口中运行命令 `watch`,然后再继续修改源代码以解决问题。命令 `watch` 会检测到这些修改,然后重新编译以查看这些问题是否被解决。
|
||||
|
||||
```
|
||||
$ rustlings watch
|
||||
```
|
||||
|
||||
### 通过调试学习
|
||||
|
||||
Rust 编译器以提供非常有意义的错误信息而被熟知,这些错误信息会帮助你理解在你代码中的问题。这通常意味着更快的调试。Rustlings 是练习 Rust,学会阅读错误信息,并理解 Rust 语言的优秀途径。来看看 [GitHub][7] 上 Rustlings 5.0.0 的最新功能吧。
|
||||
|
||||
> **[下载 Rust 速查表][8]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/7/learn-rust-rustlings
|
||||
|
||||
作者:[Gaurav Kamathe][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[yzuowei](https://github.com/yzuowei)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/gkamathe
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/rust_programming_crab_sea.png
|
||||
[2]: https://opensource.com/article/22/6/rust-toolchain-rustup
|
||||
[3]: https://github.com/rust-lang/rustlings
|
||||
[4]: https://opensource.com/article/22/6/rust-toolchain-rustup
|
||||
[5]: https://opensource.com/article/19/2/getting-started-cat-command
|
||||
[6]: https://opensource.com/article/18/4/using-less-view-text-files-command-line
|
||||
[7]: https://github.com/rust-lang/rustlings/releases/tag/5.0.0
|
||||
[8]: https://opensource.com/downloads/rust-cheat-sheet
|
@ -0,0 +1,185 @@
|
||||
[#]: subject: "How to Record Streaming Audio in Ubuntu and other Linux Distributions"
|
||||
[#]: via: "https://itsfoss.com/record-streaming-audio/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "FYJNEVERFOLLOWS"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15381-1.html"
|
||||
|
||||
如何在 Ubuntu 中录制流媒体音频
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 如何在 Ubuntu 和其他 Linux 发行版中录制音频?
|
||||
|
||||
如果你想通过计算机的麦克风录制语音,可以使用 GNOME <ruby>录音机<rt>Sound Recorder</rt></ruby> 或 Audacity。
|
||||
|
||||
使用 GNOME 录音机很简单,但它功能不足。Audacity 最初可能会让人无从入手,但它有很多专业级录音的功能。不过,在本教程中,我不打算详细讨论这个问题。
|
||||
|
||||
GNOME 录音机能与麦克风配合使用。还有一个叫做 Audio recorder 的工具,除了麦克风输入,你可以使用它来录制流媒体音乐(来自 Sptify、YouTube、互联网广播、Skype 和其他大多数来源)。
|
||||
|
||||
总而言之,我将向你展示以下步骤:
|
||||
|
||||
* 使用 GNOME 录音机录制声音
|
||||
* 使用 Audio Recorder 录制流音频
|
||||
|
||||
### 使用 GNOME 录音机从麦克风录制音频
|
||||
|
||||
GNOME 桌面环境有很多有用的应用程序,录音机就是其中之一。
|
||||
|
||||
你可以从 Ubuntu 软件中心安装 [录音机][1]。
|
||||
|
||||
![Sound Recorder can be installed from the Ubuntu Software Center][2]
|
||||
|
||||
或者,你可以在终端中使用此命令来安装它:
|
||||
|
||||
```
|
||||
sudo apt install gnome-sound-recorder
|
||||
```
|
||||
|
||||
安装后,你可以在系统菜单中找到它,并从那里启动它。
|
||||
|
||||
![GNOME Sound Recorder][3]
|
||||
|
||||
在开始使用它之前,应确保在系统设置中选择了正确的输入源:
|
||||
|
||||
![Ensure that you have chosen correct input in system settings][4]
|
||||
|
||||
打开录音机,它将显示如下界面:
|
||||
|
||||
![Hit the Record button to start audio recording][5]
|
||||
|
||||
点击“<ruby>录制<rt>Record</rt></ruby>”按钮,它立即开始录制音频。录制时,你可以选择暂停、停止或取消录制。
|
||||
|
||||
![Options while recording audio][6]
|
||||
|
||||
你的录音将保存并可从应用程序界面本身获得。单击保存的录音以突出显示。
|
||||
|
||||
你可以回放或删除该录音。你可以通过单击“保存/下载”按钮选择将其保存到其他位置。你也可以使用“编辑”按钮重命名该录音。
|
||||
|
||||
![Saved recordings][7]
|
||||
|
||||
这很方便,对吧?你可以选择以 `MP3`、`FLAC` 和多种格式录制。
|
||||
|
||||
#### 删除 GNOME 录音机
|
||||
|
||||
不喜欢它或发现它缺乏功能?
|
||||
|
||||
你可以从 Ubuntu 软件中心删除 GNOME 录音机,或使用以下命令:
|
||||
|
||||
```
|
||||
sudo apt remove gnome-sound-recorder
|
||||
```
|
||||
|
||||
GNOME 录音机应用功能有限,它只从麦克风录制,在某些情况下这不是你想要的。
|
||||
|
||||
想象一下你想录制 Skype 通话或在应用程序或网络浏览器中播放的内容?在这种情况下,漂亮的 Audio Recorder 会有所帮助。
|
||||
|
||||
### 使用 Audio Recorder 来录制流媒体音频
|
||||
|
||||
你可以使用 [官方 PPA][10] 在 Ubuntu 和 LinuxMint 中安装 `Audio Recorder`。在终端中依次使用以下命令:
|
||||
|
||||
```
|
||||
sudo apt-add-repository ppa:audio-recorder/ppa
|
||||
sudo apt update
|
||||
sudo apt install audio-recorder
|
||||
```
|
||||
|
||||
或者,你可以从 [启动台][11] 下载源代码。安装后,你可以从“<ruby>活动概述<rt>Activity Overview</rt></ruby>”里启动应用程序:
|
||||
|
||||
![Audio Recorder][12]
|
||||
|
||||
#### 记录不同来源的各种声音
|
||||
|
||||
Audio Recorder 记录计算机产生的各种声音。
|
||||
|
||||
它记录通过系统声卡、麦克风、浏览器、网络摄像头等播放的音频。
|
||||
|
||||
换句话说,即使你的系统打喷嚏,它也会记录(如果你想记录的话)。它允许你选择录制设备,如网络摄像头、麦克风、Skype 等。
|
||||
|
||||
要录制流媒体音乐,请选择适当的源。例如,如果你正在 Rhythmbox 中播放流媒体广播,请选择 Rythmbox。
|
||||
|
||||
![Audio-Recorder Audio Settings][13]
|
||||
|
||||
#### 在你方便的时候录制
|
||||
|
||||
Audio Recorder 还提供了设置计时器的选项。你可以在给定的时钟时间或预定义的间隔开始、停止或暂停录制。你还可以设置录制文件大小的限制。
|
||||
|
||||
此外,你可以在没有音频(或声音很低)时暂停(和停止),并在声音恢复时继续。
|
||||
|
||||
你所要做的就是编辑计时器面板中的文本。注释掉你不想应用的“规则”,并根据你的要求编辑这些规则。
|
||||
|
||||
![Audio-recorder Timer Settings][14]
|
||||
|
||||
它提供了其他设置,如登录时自动启动、显示托盘图标和其他记录设置。
|
||||
|
||||
![Audio-recorder Additional Settings][15]
|
||||
|
||||
#### 以各种文件格式保存录制的音乐文件
|
||||
|
||||
另一个宝藏。你可以将录制的文件保存为你喜爱的文件格式。支持的文件格式有 OGG 音频、Flac、MP3、SPX 和 WAV。我录音时更喜欢用 MP3 格式。
|
||||
|
||||
录制的文件存储在 `~/Audio` 中,即主目录中的“音频”文件夹中。
|
||||
|
||||
![Audio-recorder Audio Formats][16]
|
||||
|
||||
#### Audio Recorder 有多好?
|
||||
|
||||
我在 Ubuntu 中使用 Audio Recorder [录制 YouTube 上播放的音乐][17]。我用 MP3 格式保存了一段 2 分钟的视频,占用了 934 KB 的空间。但我必须说,我没想到录制的音质会这么好。老实说,我无法将它与 YouTube 上的原始歌曲区分开来。
|
||||
|
||||
#### 删除 Audio Recorder
|
||||
|
||||
如果你不喜欢 Audio Recorder,可以使用以下命令将其删除:
|
||||
|
||||
```
|
||||
sudo apt remove audio-recorder
|
||||
```
|
||||
|
||||
[同时删除 PPA][18] 是个好主意:
|
||||
|
||||
```
|
||||
sudo apt-add-repository -r ppa:audio-recorder/ppa
|
||||
```
|
||||
|
||||
### 结论
|
||||
|
||||
Linux 中可能还有其他几种用于音频录制的工具。像 GNOME 一样,其他桌面环境也可能有录音应用程序。我知道深度操作系统肯定有一个。
|
||||
|
||||
GNOME 录音机是一个不错的工具,用于从麦克风录制声音。对于录制各种来源的声音,Audio Recorder 是一个不错的选择。
|
||||
|
||||
我希望这篇文章能满足你的录音需求。如果你有什么建议,请告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/record-streaming-audio/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://wiki.gnome.org/Apps/SoundRecorder
|
||||
[2]: https://itsfoss.com/wp-content/uploads/2022/08/sound-recorder-ubuntu.png
|
||||
[3]: https://itsfoss.com/wp-content/uploads/2022/08/sound-recorder.png
|
||||
[4]: https://itsfoss.com/wp-content/uploads/2022/08/microphone-settings-ubuntu.png
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/08/using-sound-recorder-linux.png
|
||||
[6]: https://itsfoss.com/wp-content/uploads/2022/08/sound-recording-with-sound-recorder.png
|
||||
[7]: https://itsfoss.com/wp-content/uploads/2022/08/sound-recorder-interface.png
|
||||
[8]: https://youtu.be/o7Ia2QGeB7Q
|
||||
[9]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
|
||||
[10]: https://launchpad.net/~audio-recorder/+archive/ubuntu/ppa
|
||||
[11]: https://launchpad.net/audio-recorder
|
||||
[12]: https://itsfoss.com/wp-content/uploads/2022/08/audio-recorder-in-overview.png
|
||||
[13]: https://itsfoss.com/wp-content/uploads/2022/08/audio-recorder-audio-settings.png
|
||||
[14]: https://itsfoss.com/wp-content/uploads/2022/08/audio-recorder-timer-settings.png
|
||||
[15]: https://itsfoss.com/wp-content/uploads/2022/08/audio-recorder-additional-settings.png
|
||||
[16]: https://itsfoss.com/wp-content/uploads/2022/08/audio-recorder-audio-formats.png
|
||||
[17]: https://itsfoss.com/youtube-dl-audio-only/
|
||||
[18]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/25/154829ol11lp47i8o6222c.jpg
|
104
published/202212/20221004 Learn the OSI model in 5 minutes.md
Normal file
104
published/202212/20221004 Learn the OSI model in 5 minutes.md
Normal file
@ -0,0 +1,104 @@
|
||||
[#]: subject: "Learn the OSI model in 5 minutes"
|
||||
[#]: via: "https://opensource.com/article/22/10/osi-model-network-communications"
|
||||
[#]: author: "Anamika https://opensource.com/users/anamika"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "cool-summer-021"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15352-1.html"
|
||||
|
||||
5 分钟内了解 OSI 模型
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 理解 OSI 框架的基本概念,掌握计算机系统通信机制。
|
||||
|
||||
<ruby>开放系统互联<rt>Open Systems Interconnection</rt></ruby>(OSI)模型是一个定义计算机、服务器和用户如何在一个系统内通信的标准。它是第一个网络通信标准模型,在上世纪 80 年代早期,所有主流的计算机和通信公司都采用了这个标准。
|
||||
|
||||
OSI 模型提供了一种用于描述网络的通用语言,并以离散的块或层的方式来描述。
|
||||
|
||||
### OSI 模型的各个层
|
||||
|
||||
该模型描述了计算机系统通过网络进行通信的七个层。
|
||||
|
||||
- 7 应用层
|
||||
- 6 表示层
|
||||
- 5 会话层
|
||||
- 4 传输层
|
||||
- 3 网络层
|
||||
- 2 数据链路层
|
||||
- 1 物理层
|
||||
|
||||
每个层都有自己的工作方式和一系列跟其他层不同的协议。本文将逐个剖析这些层级。
|
||||
|
||||
### 应用层
|
||||
|
||||
应用层是在软件中实现的。它是与应用程序交互的层级。
|
||||
|
||||
用发送消息作为例子。发送消息的程序与应用层进行交互,并发送消息。接着,应用层向 OSI 模型的下一个层级(即表示层)发送消息。
|
||||
|
||||
### 表示层
|
||||
|
||||
来自应用层的数据被转发到表示层。表示层接收到文字、字符、字母、数字等形式的数据,并把它们转换为机器可识读的二进制格式数据。这个过程叫做编译。
|
||||
|
||||
在此阶段,ASCII(美国信息交换标准码)字符被转换为扩充的二进制编码的十进制交换码(EBCDIC)。转换后的数据在继续传输前,也会进行编码和加密过程,使用 SSL 协议进行加密和解密。
|
||||
|
||||
表示层的作用是抽象化,它假设下面的层级会处理它们收到的数据。它也负责压缩数据。数据的压缩可能是有损的,也有可能是无损的,这取决于很多因素,这不属于本文的讨论范围。
|
||||
|
||||
### 会话层
|
||||
|
||||
会话层的作用是建立和管理连接。该层级的主要工作是建立会话。例如,你登录网上商城,就在你的机器和服务器之间建立了会话。
|
||||
|
||||
会话层的作用是实现数据的发送和接收,完成后连接的会话就终止了。在一个会话建立前,会进行身份验证。与上一层类似,会话层也假设在它的工作完成后,下面的层级也会准确无误地处理数据。
|
||||
|
||||
### 传输层
|
||||
|
||||
传输层的作用是管理数据传输和其自身的关于数据如何传输的一些协议。从会话层传到这里的数据被分为更小的数据单元,这些数据单元称为片段。这个过程叫做“分段”。每个片段包含来源端口号、目标端口号和一个序列号。端口号用来识别发送数据的应用程序。注意,数据以块的形式传输。序列号用于把这些片段按正确的顺序排列。
|
||||
|
||||
传输层负责控制流量或在给定的时间内传输的数据量。它也负责错误控制,比如数据丢失、损坏等情况。它利用一种错误检测值,通常叫做校验和。传输层对每个数据片段加上校验和,就可以检查所发送的数据是否被正确接收。然后数据传输到网络层。
|
||||
|
||||
### 网络层
|
||||
|
||||
网络层的作用是跟其他网络进行通信。它把从一台机器接收到的数据片段传输给另一台位于不同网络的机器。路由器是作用于网络层的。
|
||||
|
||||
网络层的功能是逻辑寻址(就是确定 IP 地址)。它为发送方和接收方分配 IP 地址,数据包附带了这个地址,就可以被传输到正确的目标机器。接着网络层对数据包进行路由。负载均衡也是在网络层进行的,旨在确保不会发生过载。下一步,数据传输到数据链路层。
|
||||
|
||||
### 数据链路层
|
||||
|
||||
数据链路层支持跟其他设备直接通信。
|
||||
|
||||
它接收到来自网络层、包含发送方和接收方 IP 地址的数据包,进行物理寻址,然后将发送方和接收方的 MAC 地址分配给数据包,形成帧。
|
||||
|
||||
### 物理层
|
||||
|
||||
物理层由系统的所有硬件和物理设备(包括网线、导航系统、适配器等)组成。在这里,从前面层级接收到的数据都是 0 和 1 形式的。物理层把这些数据转换并通过各种方式(如果是光纤电缆,有电线、电信号、光信号;如果是 WIFI,则为无线电信号)传输至本地媒介。
|
||||
|
||||
注意,物理层作用于接收方的一端,把接收到的信号以帧的形式传输到数据链路层(把它转换回二进制数据形式)。然后帧传输到上面的层级,最终应用层(应用软件)会接收到需要的数据。
|
||||
|
||||
### 结语
|
||||
|
||||
当你需要描述网络架构或排除网络问题时,OSI 模型的相关知识会对你有所帮助。我希望本文能令你对这个模型的方方面面有清晰的理解。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/10/osi-model-network-communications
|
||||
|
||||
作者:[Anamika][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[cool-summer-021](https://github.com/cool-summer-021)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/anamika
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/code_computer_development_programming.png
|
||||
[2]: https://opensource.com/article/22/10/osi-model-network-communications#application-layer
|
||||
[3]: https://opensource.com/article/22/10/osi-model-network-communications#presentation-layer
|
||||
[4]: https://opensource.com/article/22/10/osi-model-network-communications#session-layer
|
||||
[5]: https://opensource.com/article/22/10/osi-model-network-communications#transport-layer
|
||||
[6]: https://opensource.com/article/22/10/osi-model-network-communications#network-layer
|
||||
[7]: https://opensource.com/article/22/10/osi-model-network-communications#data-link-layer
|
||||
[8]: https://opensource.com/article/22/10/osi-model-network-communications#physical-layer
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/16/092612etn6gwaecb91bweg.jpg
|
@ -0,0 +1,112 @@
|
||||
[#]: subject: "Our open source startup journey"
|
||||
[#]: via: "https://opensource.com/article/22/10/tooljet-open-source-journey"
|
||||
[#]: author: "Navaneeth PK https://opensource.com/users/navaneeth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "CanYellow"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15359-1.html"
|
||||
|
||||
我们的开源创业之旅
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 以下是开源项目 ToolJet 是如何在一年的时间里取得 13000 颗星标和 200 个贡献者的故事。
|
||||
|
||||
[ToolJet][1] 是一款开源的低代码框架,用于快速构建和部署内部工具。它的代码库完全由 JavaScript 和 TypeScript 组成。
|
||||
|
||||
2021 年 4 月,一名开发者独自开始了 ToolJet 的开发,并于 2021 年 6 月推出公测版本,一炮而红。此后,ToolJet 成立了基金会。目前,我们已经有一个 20 人的开发团队。
|
||||
|
||||
### 为什么选择开源
|
||||
|
||||
在开发 ToolJet 之前,我曾担任一些企业客户的顾问。这些客户中的许多都庞大到足以维护构建几十个内部工具。尽管来自销售人员、支持人员以及运营人员不断要求对内部工具添加更多功能和修复错误,但开发团队却很难有精力来开发内部工具。
|
||||
|
||||
我尝试使用过多个平台来构建和维护内部工具。这些工具大多非常昂贵,而且经常不符合要求。我们需要进行修改,而且大多数工具不支持内部托管。
|
||||
|
||||
作为一名 Ruby 开发者,我最初使用 ActiveAdmin 和 RailsAdmin 来构建内部工具。这两款工具都是极好的,只是将它们应用在使用多个数据源的任务上比较困难。于是我意识到市场上需要一种可以构建用户界面,并能够连接多个数据源的框架。我相信任何为开发者制作的工具都应当是开源的。开发者日常使用的大部分工具与框架都源自世界各地人们的公开协作。
|
||||
|
||||
### 第一次提交
|
||||
|
||||
制作像 ToolJet 这样的工具需要全身心的投入,通过出售我的一个业余项目,我获得了五六个月的空闲,于是我立即着手将在我脑海里酝酿了两年的想法付诸现实。
|
||||
|
||||
2021 年 4 月 1 日,我完成了 ToolJet 的第一次提交(使用 `rails new` 命令)。
|
||||
|
||||
稍等!我刚刚说 ToolJet 的代码是完全基于 JavaScript 的?请接着往下看。
|
||||
|
||||
### 构建完成并推销给投资者
|
||||
|
||||
4、5 月间,我一直坐在电脑屏幕前编写代码和向种子轮的投资者推销我的工具。
|
||||
|
||||
我的工作还包括创建拖放式应用程序构建器,撰写所有的文档以保证有在主流平台上设置 ToolJet 的文档,创建项目网站,制作发布时所需的海报以及博客文章等等。这一过程进展顺利,没有遇到大的挑战。当时,ToolJet 的前端使用的是 React ,而后端则用的是 Ruby on Rails 。
|
||||
|
||||
编程工作进行得很顺利,然而向投资者推广的工作进行得并不顺利。我向专注于初创时期投资的风投和天使投资人发送了大约 40 封电子邮件,都石沉大海。大部分邮件都被忽略了,不过也有一些公司向我说明了拒绝的原因,另外一些则给我回了电话。
|
||||
|
||||
大部分的电话内容都是一样的:我无法说服他们接受开源商业模式。
|
||||
|
||||
### 工具发布
|
||||
|
||||
6 月 7 日是发布日。我们首先在 ProductHunt(LCTT 译注:[ProductHunt][11] 是一个新品发布平台)上发布。六个小时后,只有 70 名用户注册。但是我们有成为当天第一名产品的趋势(最终在那一周的产品中排名第三)。这里是原始的 [发布帖][2]。
|
||||
|
||||
下午 6 点左右,我又在 [HackerNews][3] 上发帖,一个小时内,这个帖子便升至榜首。大量的访问者注册并给我的版本库点亮星标,我对此很高兴。许多访问者和用户报告了软件和文档中的错误。距离在 HackNews 上发帖八个小时之后,超过 1000 名 GitHub 用户给 ToolJet 的 GitHub 版本库点亮了星标,并且有数百人注册了 ToolJet 云。上升趋势一直持续到三天后,ToolJet 版本库总计得到了 2400 个星标。
|
||||
|
||||
![ToolJet repo stats on GitHub][4]
|
||||
|
||||
### 获得资助
|
||||
|
||||
ToolJet 项目在 GitHub 上的吸引力足以被风投(VC)世界注意到。发布之后的日子被各种来电挤满了。我们也有其他的选择,但从没有认真考虑过这些它们。这些选择包括:
|
||||
|
||||
- 引导性融资:在项目初期,难以获得付费用户,而我此前也没有足够的储蓄来支撑整个项目。
|
||||
- 作为业余项目:在开发小型项目上这是可以的,但我不认为这在 ToolJet 的开发上行得通,毕竟在 ToolJet 平台能够为客户所用之前,我们需要创建大量的集成和 UI 控件。作为一个业余项目,要实现这些可能需要花费数月甚至数年时间。
|
||||
|
||||
我知道如果将 ToolJet 作为一个业余项目来开发,我可能需要花几个月的时间才能达到我期望的程度。而我希望通过扩大团队加速项目的成熟。鉴于该项目的吸引力,引入风险投资(VC)的资助是显而易见的选择。
|
||||
|
||||
好消息是在 HackNews 上发布之后的两周内我们成功募集了 [155 万美元的资金][5]。
|
||||
|
||||
### 在开源中积累很重要
|
||||
|
||||
发布后不久,我们发现许多人希望为 ToolJet 项目做贡献,但是他们几乎都是 JavaScript 开发者。我们也意识到像 ToolJet 这样的项目在未来会有成百上千的数据接口,只有基于插件的架构才行得通。我们于 2021 年 8 月决定从 Ruby 迁移到 TypeScript 上来。即使这花费了一个月的时间和巨大的努力,这仍然是我们在 ToolJet 项目上作出的最正确的决定。今天,我们有一个由我们的 [插件开发套件][6] 支持的可扩展的基于插件的架构。我们获得了来自超过 200 名开发者的贡献。关于这次迁移的文章参见 [这篇博客][7] 和 [另一篇博客][8]。
|
||||
|
||||
### 发布 v1.0 版本
|
||||
|
||||
自 8 月份以后,很多用户已经在生产环境中使用 ToolJet ,该平台并没有出现过任何稳定性或扩展性的问题。我们准备在发布 v1.0 版本之前完成开发人员平台的功能。开发人员平台允许任何 JavaScript 开发者构建和发布 ToolJet 插件。这样开发人员就可以为 ToolJet 开发数据接口。把集成测试的时间算上,创建一个 ToolJet 接口的时间也只需要30分钟。
|
||||
|
||||
### 创建持续成长的社区
|
||||
|
||||
![ToolJet star history][9]
|
||||
|
||||
我们没有在销售上投入资金,我们的大部分精力都放在了传播 ToolJet 的消息、撰写我们的经验教训以及维持开发社区的活跃上。我们有一个关注社区里问题的三人团队。
|
||||
|
||||
### 商业模式
|
||||
|
||||
如果没有 [商业产品][10] 来支付账单,ToolJet 就无法成为一项可持续的业务。我们构建了 ToolJet 的客户付费的企业版本。ToolJet 的免费的社区版本没有任何使用限制,企业版中的额外功能都只与大型团队有关。我们现在的客户已经有超大型公司。我们有足够的银行存款来打造更好的 ToolJet ,因此我们目前正聚焦于产品提升上。
|
||||
|
||||
### 接下来做什么
|
||||
|
||||
我们在开源社区的不断反馈和贡献的帮助下,我们可以经常性发布更好的 ToolJet 版本。很多主要的优化、大量的数据接口以及 UI 组件正在开发进程中。我们正以前所未有的速度朝着我们的最初目标前进,即成为一个可以连接到数百个数据源和构建最复杂的用户界面的开源框架。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/10/tooljet-open-source-journey
|
||||
|
||||
作者:[Navaneeth PK][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/navaneeth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://github.com/ToolJet/ToolJet
|
||||
[2]: https://www.producthunt.com/products/tooljet-0-5-3
|
||||
[3]: https://news.ycombinator.com/item?id=27421408
|
||||
[4]: https://opensource.com/sites/default/files/2022-10/tooljet-repo-stats.png
|
||||
[5]: https://blog.tooljet.com/raising-vc-funding-for-open-source-project
|
||||
[6]: https://www.npmjs.com/package/@tooljet/cli
|
||||
[7]: https://blog.tooljet.com/migrating-toojet-from-ruby-on-rails-to-nodejs
|
||||
[8]: https://blog.tooljet.com/how-we-migrated-tooljet-server-from-ruby-to-node-js
|
||||
[9]: https://opensource.com/sites/default/files/2022-10/tooljet-star-history.png
|
||||
[10]: https://opensource.com/article/19/11/product-vs-project
|
||||
[11]: https://www.producthunt.com/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/17/221548rbp2t6z8ah3h031s.jpg
|
@ -0,0 +1,88 @@
|
||||
[#]: subject: "Write documentation like you develop code"
|
||||
[#]: via: "https://opensource.com/article/22/10/docs-as-code"
|
||||
[#]: author: "Lorna Mitchell https://opensource.com/users/lornajane"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "CanYellow"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15364-1.html"
|
||||
|
||||
像书写代码一样撰写文档
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 不想让文档成为事后的想法?或许你该尝试一下全新的写作方式。
|
||||
|
||||
很多工程师与手工艺者都对他们使用的工具有特别的要求。为了顺利的完成工作,你需要最好的工具和使用它们的技巧。软件开发中最好的工具在应用到其他的数字创作领域中也可以是很强大的。<ruby>[文档即代码][1]<rt>Docs as Code</rt></ruby> 的方式就是很好的例子。“文档即代码”意味着使用与代码开发相同的工具和工作流来撰写文档。文档即代码的支持者认为,这样的方式可以在降低写作者的工作量的同时,也带来了更好的文档。
|
||||
|
||||
### 文本格式与源文件控制
|
||||
|
||||
从传统的写作平台切换到文档即代码方式时,最主要的调整是将写作内容保存在基于文本的标记格式中。这一转变使得基于纯文本的工具都适用于文档写作。无论你选择 [DocBook][2]、[Markdown][3] 或者其他的标记语言,从只使用一种工具到使用一种标准格式配合多种工具是一种巨大的转变。
|
||||
|
||||
找到支持你的工作流程的工具是非常重要的。很多开发者在文档即代码项目中使用他们的 [代码编辑器][4]。因为他们已经是这些工具的高阶用户,一切都很顺利。而找到适合团队里其他专业人员,比如技术撰稿、编辑、信息架构师和文档产品责任人的工具可能需要一番努力。这里有一些选项可供参考:
|
||||
|
||||
- 各种 [优秀的 Markdown 编辑器][5] 之一
|
||||
- 附带良好的预览工具的代码编辑器可能更适合非程序员
|
||||
- 流行的 Git 托管服务的网页界面尤其适用于偶尔有需要的贡献者
|
||||
|
||||
一旦内容以标记语言的格式安全地保存,就可以使用 [Git][6] 这样的版本控制进行管理。Git 相比大多数文档平台具有更多的功能:
|
||||
|
||||
- 清晰详细的文档版本历史:谁在什么时候改变了什么。如果你有良好的提交信息惯例,你甚至可以了解到为什么会有这样的变更。
|
||||
- 简明的并行修改过程。在 Git 中使用分支工作意味着任何人可以做出他们想要的任何改变,并在最后合并所做的变更。
|
||||
- 先进的协作与审查工具。所有的源代码管理平台都被设计成支持详细审查每一个变更,并根据需要进行讨论,使每个人都确信这个变更可以继续进行。
|
||||
- 自动质量检查,比如拼写检查和链接检查。这不仅节省了时间,而且可以发现可能遗漏的错误。
|
||||
|
||||
源代码管理有很多优点。但要记住,如果你准备入门源代码管理,它有一定的学习曲线。这是一些有助于撰写者入门的优秀的 [学习资源][7] 和 [文章][8]。你也可以让具有好奇心的文档撰写者自行寻找对他们有用的学习材料,而不是请你的工程师来培训他们。(问我是怎么学会的? —— 当然是通过艰苦的方式!)
|
||||
|
||||
### 拉取请求和评审循环
|
||||
|
||||
所有的源代码管理平台都围绕 <ruby>拉取请求<rt>Pull Request</rt></ruby> 这一概念设计的,这有时也称为 <rbuy>合并请求<rt>Merge Request</rt></ruby>:有时候,某个人或某个团队先将一系列改变整合到一起,然后请求把这些修改拉到主项目中。不过从许多方面来说,在文档中一次处理多个变更比在代码中更容易。改变一篇文章中的某个地方,比更改代码并发现有其它几个地方依赖它,副作用更小。
|
||||
|
||||
最强大的协作工具是 [diff][9],它可以通过一个易于理解的方式展示旧版本与新版本之间的差异。该工具有许多不同的版本,可以使比较视图更易于查看:双栏模式、行内模式,甚至是渲染过的 Markdown 模式。团队中的每一个成员都可以选择最适合他们的工具。举例而言,网页视图通常用于查看细微变更,而对于更大的变更,我习惯于使用 `vimdiff` 或 [Meld][10] 在本地浏览。
|
||||
|
||||
评审意见可以被添加到整个修改中,也可以添加到拟议的变更的个别行中。一些项目限制了行的最大长度,即硬换行,或者一行一句,以使得向文本的特定的部分添加注释更加容易。可以添加进一步的修改与评论,直到审查过程结束,修改被接受。由于拉取请求在项目仓库以队列形式展示,这是一种很好的方式,可以展示目前正在进行的任务以及需要进行检查操作的任务。`diff` 工具使得评审人员更方便地添加他们的思考。尤其是你在与技术受众工作时,你可以通过他们日常使用的工具获得来自他们的评论。
|
||||
|
||||
### 持续集成与部署
|
||||
|
||||
以纯文本形式提供你的文档的源代码有很多益处,你可以轻易找到每一个需要修改的位置,你可以使用现有的诸如 [wc][11]、[grep][12] 或 `tree` 之类的工具,来处理潜在的大型文档集。当你将这些与源代码管理平台结合起来之后,你可能获得更多的可用工具,并且它们都是开源的。
|
||||
|
||||
另一个工作流程上的巨大提升是持续部署的能力。简单来说,这意味着,每当一个拉取请求被合并到主项目中,项目可以直接自动化部署到位。如果这个变更足够好,就可以放进项目中,它也足够好到可以在放到文档网站上帮助你的读者。典型情况下,持续部署是配置在一台单独的自动化服务器上的,比如 [Jenkins][13] 或者 [Git 钩子][14]。不论哪种方式,基于文本的标记语言与文档即代码平台(通常是静态网页生成器,比如 [Hugo][15] 或 [Sphinx][16])结合来生成文档网站,然后自动部署。
|
||||
|
||||
在部署之前,同样的自动化流程可以被用于对将要合并的拉取请求进行检查。在一个编程项目中,通过计算机自行进行代码检查、代码测试和其他的质量检查已经习以为常。通过类似 [Vale][17] 之类的工具可以对文本进行检查,文档项目也可以同样对待。你也可以添加其他的工具,比如添加一个链接检查器来确保文中所有的链接都是有效的。
|
||||
|
||||
### 用于文档流程的代码工具
|
||||
|
||||
被工程师们熟知并喜爱的工具都是非常好的工具,它们同时也可以用于其他类型的项目中。对于文档而言,它们提升了宝贵的效率,尤其是当你希望你的文档与你的团队同步推进的时候。上面讨论到的所有工具都是开源的,你可以亲自尝试,也可以为大型全球团队,亦或者介于两者之间的团队,部署它们。愿你的成文过程和编程过程一样顺畅。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/10/docs-as-code
|
||||
|
||||
作者:[Lorna Mitchell][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/lornajane
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.writethedocs.org/guide/docs-as-code
|
||||
[2]: https://opensource.com/article/17/9/docbook
|
||||
[3]: http://commonmark.org
|
||||
[4]: https://opensource.com/article/20/12/eclipse
|
||||
[5]: https://opensource.com/article/21/10/markdown-editors
|
||||
[6]: https://opensource.com/downloads/cheat-sheet-git
|
||||
[7]: https://opensource.com/article/18/1/step-step-guide-git
|
||||
[8]: https://opensource.com/article/19/4/write-git
|
||||
[9]: https://opensource.com/article/21/11/linux-diff-patch
|
||||
[10]: https://opensource.com/article/20/3/meld
|
||||
[11]: https://www.redhat.com/sysadmin/linux-wc-command?intcmp=7013a000002qLH8AAM
|
||||
[12]: https://opensource.com/downloads/grep-cheat-sheet
|
||||
[13]: https://www.jenkins.io
|
||||
[14]: https://www.redhat.com/sysadmin/git-hooks
|
||||
[15]: https://opensource.com/article/18/3/start-blog-30-minutes-hugo
|
||||
[16]: https://opensource.com/article/19/11/document-python-sphinx
|
||||
[17]: https://vale.sh
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/19/215600m3bzhqlu23lskssl.jpg
|
@ -0,0 +1,530 @@
|
||||
[#]: subject: "How To Securely Transfer Files With SCP In Linux"
|
||||
[#]: via: "https://ostechnix.com/securely-transfer-files-with-scp-in-linux/"
|
||||
[#]: author: "sk https://ostechnix.com/author/sk/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "MjSeven"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15377-1.html"
|
||||
|
||||
如何在 Linux 中使用 SCP 安全地传输文件
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
在网络上文件传输可以通过各种不同的方式和协议来完成。**远程复制文件**最常用的协议是 **Rsync**、**SCP** 和 **SFTP**。在本文中,我们将了解**什么是 SCP** 以及如何在 Linux 和类 Unix 操作系统中**使用 SCP 在本地和远程计算机之间安全地传输文件**。
|
||||
|
||||
### 什么是 SCP?
|
||||
|
||||
SCP,代表 <ruby>安全复制<rt>Secure Copy</rt></ruby>,它是一个命令行程序,在 Linux 和类 Unix 操作系统中以安全的方式在本地和远程系统之间,或在两个远程系统之间复制文件和目录。
|
||||
|
||||
使用 `scp` 命令,你可以安全地复制文件或目录:
|
||||
|
||||
- 从本地到远程系统
|
||||
- 从远程系统到本地
|
||||
- 在两个远程系统之间
|
||||
|
||||
使用 `scp` 命令传输数据时,文件和目录都是加密的。因此,即使网络被破坏,作恶者也无法获得任何有意义的数据。
|
||||
|
||||
SCP 是 openSSH 程序的一个组件,它使用 SSH 协议安全地传输文件。几乎所有现代 Linux 和 Unix 发行版都预装了 OpenSSH,所以不必费心安装它。
|
||||
|
||||
#### 提醒一句:
|
||||
|
||||
根据 openSSH 开发人员的**官方公告**:
|
||||
|
||||
> **scp 协议已经过时了**,它不灵活且不易修复。我们建议使用更现代的协议,如 `sftp` 和 `rsync` 来代替。
|
||||
>
|
||||
> 参考 - [https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html][1]
|
||||
|
||||
但是,大多数用户仍然更喜欢 SCP 协议。因为,SCP 处理远程文件传输比同行 SFTP 和 Rsync 更快。
|
||||
|
||||
另外,SCP 的工作原理与 `cp` 命令完全相同,而 `rsync` 则会判断源目录是否有**结尾斜杠**而出现不同的行为。看一看下面的命令:
|
||||
|
||||
- `rsync source destination/` - 将 `source` 目录复制到 `destination` 文件夹内。
|
||||
- `rsync source/ destination/` - 将 `source` 目录的内容复制到 `destination` 文件夹中。
|
||||
|
||||
所以,你必须反复检查是否在路径中添加了斜杠。
|
||||
|
||||
我个人使用 **[Rsync][2]** 在两台主机之间复制大文件,使用 SCP 在网络上复制单个文件。
|
||||
|
||||
### SCP 命令语法
|
||||
|
||||
SCP 的通用语法如下:
|
||||
|
||||
```
|
||||
scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ... target
|
||||
```
|
||||
|
||||
根据文件传输路径的不同,语法也会有所不同。这里我罗列了一些语法格式示例。
|
||||
|
||||
从本地复制一个文件到远程系统:
|
||||
|
||||
```
|
||||
scp <options> SourceFile User@RemoteHost:RemotePath
|
||||
```
|
||||
|
||||
类似的,从本地系统复制一个目录到远程系统,使用 `-r` 参数:
|
||||
|
||||
```
|
||||
scp -r SourceDirectory User@RemoteHost:RemotePath
|
||||
```
|
||||
|
||||
复制多个文件到远程系统:
|
||||
|
||||
```
|
||||
scp <options> SourceFile1 SourceFile2 User@RemoteHost:RemotePath
|
||||
```
|
||||
|
||||
远程系统复制文件到本地:
|
||||
|
||||
```
|
||||
scp <options> User@RemoteHost:RemoteFilePath DestinationFile
|
||||
```
|
||||
|
||||
远程系统复制目录到本地:
|
||||
|
||||
```
|
||||
scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory
|
||||
```
|
||||
|
||||
在本地将文件在两个远程系统之间复制:
|
||||
|
||||
```
|
||||
scp <options> User@RemoteHost1:RemoteFile1 User@RemoteHost2:RemotePath
|
||||
```
|
||||
|
||||
注意,当你在两个远程系统之间复制文件时,流量不会通过本地系统。操作直接在两个远程系统之间进行。但是,你可以使用 `-3` 参数让流量经过你运行 `scp` 命令的系统。
|
||||
|
||||
从你的本地系统将一个远程系统的目录复制到另一个远程系统:
|
||||
|
||||
```
|
||||
scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath
|
||||
```
|
||||
|
||||
### SCP 命令参数
|
||||
|
||||
SCP 命令最常用的参数有:
|
||||
|
||||
- `-C`:启用压缩。`C` 代表 <ruby>压缩<rt>Compression</rt></ruby>。使用此参数时,数据传输速度会更快,因为数据是压缩的。SCP 将自动在源系统上压缩,并在目标系统上解压缩。
|
||||
- `-c <cipher>`:`c` 代表 <ruby>加密<rt>Cipher</rt></ruby>。默认情况下,SCP 使用 **AES-128** 加密方法对数据进行加密。你可以使用 `-c` 参数更改加密方法。
|
||||
- `-i <identity_file>`:`i` 代表 <ruby>身份<rt>Identity</rt></ruby> 文件或私钥。如你所知,SSH 中使用基于密码或密钥的身份验证。如果希望在传输文件时使用基于密钥的身份验证,可以使用 `-i` 参数指定身份文件或私钥。
|
||||
- `-l limit`:`l` 代表 <ruby>限制<rt>Limit</rt></ruby> 带宽。通过此参数,可以设置传输数据的最大带宽。它的单位是 `Kbit/s`。
|
||||
- `-F <ssh_config>`:有时你可能需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器,这种情况下,你可以使用 `-F` 参数使用不同的 `ssh_config` <ruby>文件<rt>File</rt></ruby>。
|
||||
- `-P port`:`P` 代表 <ruby>端口<rt>Port</rt></ruby>。注意,这是大写的 `P`。默认情况下,SSH 使用端口 22。但出于安全原因,你可能已经更改了目标主机中的端口号。这种情况下,你应该使用 `-P` 参数显示指定新端口号。
|
||||
- `-p`:如果希望 <ruby>保留<rt>Preserve</rt></ruby> 原始文件的修改时间、访问时间和模式,你需要使用 `-p` 参数。注意是小写 `p`。
|
||||
- `-r`:<ruby>递归<rt>Recursively</rt></ruby> 复制整个目录。
|
||||
- `-B`:`B` 代表 <ruby>批处理<rt>Batch</rt></ruby> 模式。它用于在传输文件时选择批处理模式。可以防止询问密码。
|
||||
- `-S program`:用于加密连接的 <ruby>程序<rt>Program</rt></ruby> 名称。
|
||||
- `-v`:`v` 代表 <ruby>详细<rt>Verbose</rt></ruby>。当使用 `-v` 参数时,命令将会在终端屏幕上打印进度。你会看到文件传输时到底发生了什么。它在调试连接、身份验证和配置问题时非常有用。
|
||||
|
||||
SCP 有很多参数,你可以查看它的手册页来了解其他参数。让我们看一些**有用的 scp 命令示例**。
|
||||
|
||||
### 开始前要记住的重要事项
|
||||
|
||||
- `scp` 命令依赖于 `ssh` 进行安全的文件传输。因此,你必须有一个 **ssh 密钥**或**密码**才能向远程系统进行身份验证。
|
||||
- 为了能传输文件,你必须对**源文件有读权限**,对**目标位置有写权限**。
|
||||
- `scp` 命令在写入前不会检查目标位置。目标位置中具有相同名称的任何文件都将被**覆盖而不通知**。
|
||||
- 为了能够区分本地和远程位置,使用**冒号**(`:`)。
|
||||
- 传输大文件时,建议在 **[Screen][3]** 或 **[Tmux][4]** 会话内启动任务。
|
||||
|
||||
### 在 Linux 中使用 SCP 传输文件
|
||||
|
||||
正如我所说,我们可以使用 `scp` 命令将文件或目录从本地复制到远程系统,反之亦然,或者在两台远程系统之间复制文件或目录。
|
||||
|
||||
#### 1. 使用 SCP 从本地系统复制文件到远程系统
|
||||
|
||||
使用 `scp` 命令将文件从本地复制到远程系统,运行:
|
||||
|
||||
```
|
||||
$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
ostechnix@192.168.1.40's password:
|
||||
File1.txt 100% 104 814.0KB/s 00:00
|
||||
```
|
||||
|
||||
让我们分析一下上面的命令,看看每个参数都做了什么。
|
||||
|
||||
- `File1.txt` - 源文件
|
||||
- `ostechnix` - 远程系统的用户名
|
||||
- `192.168.1.40` - 远程系统的 IP 地址
|
||||
- `/home/ostechnix/` - 远程系统中的目标目录。这是我们想要传输源文件的绝对路径,如 `File.txt`。
|
||||
|
||||
你还可以修改目标文件的名称。下面的命令将 `File1.txt` 传输到目的地,保存为 `myfile.txt`。
|
||||
|
||||
```
|
||||
$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/myfile.txt
|
||||
```
|
||||
|
||||
![将文件从本地复制到远程系统][5]
|
||||
|
||||
#### 2. 使用 SCP 从本地系统复制多个文件到远程系统
|
||||
|
||||
使用 `scp` 命令将多个文件从本地系统传输到远程系统,运行:
|
||||
|
||||
```
|
||||
$ scp File1.txt File2.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
ostechnix@192.168.1.40's password:
|
||||
File1.txt 100% 104 689.4KB/s 00:00
|
||||
File2.txt 100% 496 6.3MB/s 00:00
|
||||
```
|
||||
|
||||
![从本地复制多个文件到远程系统][6]
|
||||
|
||||
这里:
|
||||
|
||||
- `File1.txt` 和 `File2.txt` - 源文件名
|
||||
- `ostechnix@192.168.1.40` - 远程系统的用户名和 IP 地址
|
||||
- `/home/ostechnix` - 目标文件的路径
|
||||
|
||||
如果文件具有相同的扩展名,你可以使用以下替代命令来实现相同的目标。
|
||||
|
||||
```
|
||||
$ scp {File1,File2}.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
或者,
|
||||
|
||||
```
|
||||
$ scp *.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 3. 使用 SCP 从本地到远程系统递归复制目录
|
||||
|
||||
递归地将整个目录(包括子目录及其内容)从本地复制到远程系统,使用 `-r` 参数。
|
||||
|
||||
```
|
||||
$ scp -r Documents/ ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
![从本地复制目录到远程系统][7]
|
||||
|
||||
上述命令将整个 `Documents` 目录包括其内容复制到目标系统。
|
||||
|
||||
其中,
|
||||
|
||||
- `-r` - 递归复制文件和目录,包括子目录及其内容
|
||||
- `Documents` - 源目录名称
|
||||
- `ostechnix@192.168.1.40` - 远程系统的用户名和 IP 地址
|
||||
- `/home/ostechnix` - 目标目录的路径
|
||||
|
||||
#### 4. 用 SCP 将文件从远程系统传输到本地
|
||||
|
||||
还记得我们从本地系统复制了 `File1.txt` 到远程系统,让我们把它复制回本地。
|
||||
|
||||
使用 `scp` 命令从远程系统复制文件到本地,运行:
|
||||
|
||||
```
|
||||
$ scp ostechnix@192.168.1.40:/home/ostechnix/File1.txt Downloads/
|
||||
```
|
||||
|
||||
其中
|
||||
|
||||
- `ostechnix@192.168.1.40` - 远程系统的用户名和 IP 地址
|
||||
- `/home/ostechnix/File.txt` - 远程系统文件的绝对路径
|
||||
- `Downloads` - 本地保存复制文件的位置
|
||||
|
||||
![从远程系统传输文件到本地][8]
|
||||
|
||||
#### 5. 使用 SCP 将多个文件从远程系统传输到本地
|
||||
|
||||
将多个文件从远程系统复制到本地,在**花括号内**注明文件的绝对路径,如下所示:
|
||||
|
||||
```
|
||||
$ scp ostechnix@192.168.1.40:/home/ostechnix/\{File1.txt,File2.txt\} Downloads/
|
||||
```
|
||||
|
||||
![将多个文件从远程系统传输到本地][9]
|
||||
|
||||
上述命令将从远程系统的 `/home/ostechnix/` 目录中复制 `File1.txt` 和 `File2.txt` 到本地的 `Downloads` 目录中。
|
||||
|
||||
注意,**花括号内的逗号后面没有空格**。
|
||||
|
||||
#### 6. 从远程系统递归复制目录到本地
|
||||
|
||||
使用 `scp` 从远程系统递归复制整个目录(包括子目录及其内容)到本地系统,使用 `-r` 参数。
|
||||
|
||||
```
|
||||
$ scp -r ostechnix@192.168.1.40:/home/ostechnix/Documents Downloads/
|
||||
```
|
||||
|
||||
上述命令将从远程系统将整个 `Documents` 目录复制到本地的 `Downloads` 目录。
|
||||
|
||||
#### 7. 使用 SCP 在两台远程计算机之间复制文件
|
||||
|
||||
使用 `scp` 命令将文件从一个远程系统直接复制到另一个远程系统,运行:
|
||||
|
||||
```
|
||||
$ scp senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/
|
||||
```
|
||||
|
||||
它会要求你输入两个远程系统的密码:
|
||||
|
||||
其中,
|
||||
|
||||
- `senthil@192.168.1.40` - 文件源端远程系统的用户名和 IP 地址
|
||||
- `/home/senthil/File1.txt` - 复制的文件名及其位置
|
||||
- `kumar@192.168.1.20` - 复制文件到目标端的用户名和 IP 地址
|
||||
- `/home/kumar` - 在目标端上保存复制文件的位置
|
||||
|
||||
上述命令将从远程主机 `192.168.1.40` 复制 `/home/senthil/File1.txt` 到 `192.168.1.20` 上的 `/home/kumar/` 目录。
|
||||
|
||||
在这种方法中,数据将直接从一个远程系统传输到另一个远程系统。如果你想通过本地机器路由流量,使用 `-3` 参数,如下所示:
|
||||
|
||||
```
|
||||
$ scp -3 senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/
|
||||
```
|
||||
|
||||
#### 8. 使用 SCP 复制文件时启用压缩
|
||||
|
||||
到目前为止,我们在没有压缩的情况下传输了文件。现在我们将使用 `-C` 参数在传输文件时启用压缩。
|
||||
|
||||
```
|
||||
$ scp -C File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
`-C` 参数将在源端启用压缩,并在目标端自动解压数据。
|
||||
|
||||
通过启用压缩,可以显著提高文件复制或传输速度。
|
||||
|
||||
#### 9. 使用 SCP 传输文件时限制带宽
|
||||
|
||||
我们可以使用 `-l` 参数限制带宽。注意,最大带宽单位为 Kbits/s。1 Byte = 8 bit。因此,如果你想将带宽限制在 200KB/s,`-l` 的值将是 **1600**(200*8)。
|
||||
|
||||
```
|
||||
$ scp -l 1600 File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
这在传输大文件时非常有用,可以防止 SCP 限制带宽。
|
||||
|
||||
#### 10. 使用 SCP 复制文件时使用不同端口
|
||||
|
||||
作为系统管理员,出于安全原因,你可能在远程服务器上 [更改了 SSH 协议的默认端口][10]。这种情况下,你可以在传输文件时使用 `-P` 参数指定端口号。注意:大写的 `P`。
|
||||
|
||||
```
|
||||
$ scp -P 2022 File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 11. 使用 SCP 复制文件时使用不同的加密方法
|
||||
|
||||
默认情况下,SCP 使用 `AES-128` 对文件进行加密。如果你想使用不同的加密方法,使用 `c` 参数。
|
||||
|
||||
例如,如果你想使用 **3des-cbc** 加密方法,命令如下所示:
|
||||
|
||||
```
|
||||
$ scp -c 3des-cbc File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
要查看支持的密码列表,执行:
|
||||
|
||||
```
|
||||
$ ssh -Q cipher localhost | paste -d, -s -
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
|
||||
```
|
||||
|
||||
#### 12. 在详细模式下使用 SCP 复制文件
|
||||
|
||||
如果你想知道使用 `scp` 复制文件时幕后发生了什么,你可以使用 `-v` 参数。使用详细模式传输文件时,终端上会显示执行 `scp` 命令执行的每一步过程。这在故障排除时很方便。
|
||||
|
||||
```
|
||||
$ scp -v File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
在详细模式下发送文件时,你将看到大量输出,如下所示:
|
||||
|
||||
![在详细模式下使用 SCP 复制文件][11]
|
||||
|
||||
#### 13. 在安静模式下使用 SCP 传输文件
|
||||
|
||||
我们可以使用 `-q` 参数在安静模式下传输文件。在安静模式下共享文件时,不会在输出中显示进度、警告或诊断信息。
|
||||
|
||||
```
|
||||
$ scp -q File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 14. 使用 SCP 传输文件时保留文件属性
|
||||
|
||||
使用 `-p` 参数可以保留文件修改时间、访问时间和模式等文件属性。注意,这是**小写的 p**。
|
||||
|
||||
```
|
||||
$ scp -p File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 15. 使用 SCP 复制文件时使用身份文件
|
||||
|
||||
SSH 同时支持基于密码和密钥的身份验证。密钥是 Linux 环境中使用最广泛的身份验证方法。
|
||||
|
||||
如果你想在传输文件时使用基于密钥的身份验证,使用 `-i` 参数指定身份文件或私钥。
|
||||
|
||||
```
|
||||
$ scp -i my_private_key.pem File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 16. 使用不同的 ssh 配置文件
|
||||
|
||||
在某些情况下,你需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器。这在情况下,你可以配合 `-F` 参数使用不同的 `ssh_config` 文件。
|
||||
|
||||
```
|
||||
$ scp -F /home/ostechnix/my_ssh_config File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
#### 17. 使用 IPv4 或 IPv6 复制文件
|
||||
|
||||
在复制文件时,我们可以强制 SCP 只使用 IPv4 或 IPv6 地址。IPv4 网络添加 `-4` 参数,IPv6 网络添加 `-6` 参数可以实现这一点。
|
||||
|
||||
```
|
||||
$ scp -6 File1.txt ostechnix@192.168.1.40:/home/ostechnix/
|
||||
```
|
||||
|
||||
### 常见问题
|
||||
|
||||
#### 问题 1:什么是 SCP?
|
||||
|
||||
SCP 是一个命令行程序,旨在将文件和目录从本地系统安全地传输到远程系统,反之亦然,或者直接在两个远程系统之间传输。
|
||||
|
||||
#### 问题 2: 如何使用 SCP 将文件从本地复制到远程计算机?
|
||||
|
||||
将文件从本地复制到远程系统,命令如下:
|
||||
|
||||
```
|
||||
scp SourceFile.txt User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 3:如何递归复制文件和目录?
|
||||
|
||||
递归复制包含子目录的目录,使用 `-r` 参数:
|
||||
|
||||
```
|
||||
scp -r /some/local/directory User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 4:使用 SCP 可以传输多个文件吗?
|
||||
|
||||
当然,只要用空格分隔源文件名即可。
|
||||
|
||||
从本地复制多个文件到远程:
|
||||
|
||||
```
|
||||
scp file1.txt file2.txt file3.txt User@RemoteHost:/some/remote/directory
|
||||
scp {file1,file2,file3}.txt User@RemoteHost:/some/remote/directory
|
||||
scp *.txt User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
从远程复制多个文件到本地:
|
||||
|
||||
```
|
||||
scp User@RemoteHost:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} /some/local/directory
|
||||
```
|
||||
|
||||
从一个远程系统复制多个文件到另一个远程系统:
|
||||
|
||||
```
|
||||
$ scp User@RemoteHost1:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} User@RemoteHost2:/some/remote/directory/
|
||||
```
|
||||
|
||||
#### 问题 5:如何传输目录下的所有文件?
|
||||
|
||||
传输整个目录,首先进入该目录:
|
||||
|
||||
```
|
||||
cd dir_name
|
||||
```
|
||||
|
||||
然后,
|
||||
|
||||
```
|
||||
scp *.txt User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 6:可以压缩文件吗?
|
||||
|
||||
当然。使用 `-C` 压缩文件。文件会在源端压缩,在目标端自动解压缩。
|
||||
|
||||
```
|
||||
scp -C /some/large/file User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 7:可以保留文件属性吗?
|
||||
|
||||
保留原始文件的修改时间、访问时间和模式等文件属性,使用 `-p` 参数。
|
||||
|
||||
```
|
||||
scp -p file.txt User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 8: 可以使用其他端口吗?
|
||||
|
||||
当然。SCP 配合 `-P` 参数允许你使用其他端口。
|
||||
|
||||
```
|
||||
scp -P 2022 file.txt User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 9: 可以使用不同的加密方法吗?
|
||||
|
||||
当然。使用 `-c` 参数。
|
||||
|
||||
```
|
||||
scp -c 3des-cbc User@RemoteHost:/some/remote/directory
|
||||
```
|
||||
|
||||
#### 问题 10: 如何列出 SSH 支持的加密方法?
|
||||
|
||||
使用以下命令查看 SSH 和 SCP 支持的加密方法列表:
|
||||
|
||||
```
|
||||
ssh -Q cipher localhost | paste -d, -s -
|
||||
```
|
||||
|
||||
#### 问题 11:SCP 真的安全吗?
|
||||
|
||||
当然,它用起来是完全安全的。SCP 和 openSSH 使用相同的 SSH 机制。传输的数据在源端加密,目标端解密。
|
||||
|
||||
#### 问题 12:可以从 Windows 系统传输文件到 Linux 吗?
|
||||
|
||||
当然。使用 `PSCP` 程序将文件从 windows 传输到 Linux 平台,你也可以使用 `WinSCP`。
|
||||
|
||||
### 总结
|
||||
|
||||
在这篇全面指南中,我们了解了什么是 SCP,以及如何在 Linux 中使用 **SCP 安全地传输文件**,其中包括 **17 个 SCP 命令示例**,另外还回答了关于 SCP 的常见问题。
|
||||
|
||||
无论你是 Linux 管理人员、开发人员还是普通用户,你都会面临某个时候将文件复制到远程系统或从远程系统复制文件的情况,知道如何**使用 SCP 安全地复制文件**将是非常有用的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://ostechnix.com/securely-transfer-files-with-scp-in-linux/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html
|
||||
[2]: https://ostechnix.com/linux-rsync-command-examples-for-beginners/
|
||||
[3]: https://ostechnix.com/screen-command-examples-to-manage-multiple-terminal-sessions/
|
||||
[4]: https://ostechnix.com/tmux-command-examples-to-manage-multiple-terminal-sessions/
|
||||
[5]: https://ostechnix.com/wp-content/uploads/2022/11/Copy-Files-from-Local-System-to-Remote-System.png
|
||||
[6]: https://ostechnix.com/wp-content/uploads/2022/11/Copy-Multiple-Files-from-Local-System-to-Remote-System.png
|
||||
[7]: https://ostechnix.com/wp-content/uploads/2022/11/Copy-Directory-from-Local-System-to-Remote-System.png
|
||||
[8]: https://ostechnix.com/wp-content/uploads/2022/11/Transfer-Files-from-Remote-System-to-Local-System.png
|
||||
[9]: https://ostechnix.com/wp-content/uploads/2022/11/Transfer-Multiple-Files-from-Remote-System-to-Local-System.png
|
||||
[10]: https://ostechnix.com/how-to-change-apache-ftp-and-ssh-default-port-to-a-custom-port-part-3/
|
||||
[11]: https://ostechnix.com/wp-content/uploads/2022/11/Copying-Files-with-SCP-in-Verbose-Mode.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/24/152224vy4glx9x39mtth9b.jpg
|
@ -3,48 +3,50 @@
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "robsean"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15350-1.html"
|
||||
|
||||
如何在 Linux Mint 上安装 GNOME 桌面环境
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
Linux Mint 是一款极好的 Linux 发行版,特别适合初学者。
|
||||
|
||||
我喜欢它仍然保持常见的 Ubuntu/Debian 字体,但是它还做了一些 [比 Ubuntu 更好的][1] 工作。其中之一就是它没有使用 Snaps 。
|
||||
我喜欢它仍然保持常见的 Ubuntu/Debian 习惯,但是它还做了一些 [比 Ubuntu 更好的][1] 工作,其中之一就是它没有使用 Snap。
|
||||
|
||||
然而,我不是 Cinnamon 桌面环境的粉丝,因为我从来没有真正地喜欢过 Windows XP 或 7 的默认设置。
|
||||
|
||||
当我在为 Linux Mint 寻找能提供稳定使用 GNOME 的能力时,这便是我最终获得的结果:
|
||||
当我寻求保持 Linux Mint 稳定的同时而提供 GNOME 的能力时,这便是我最终获得的结果:
|
||||
|
||||
![install gnome in linux mint][2]
|
||||
|
||||
这就是我运行 GNOME 42.5 的 Linux Mint 21 。
|
||||
不太炫,这就是我运行 GNOME 42.5 的 Linux Mint 21 。
|
||||
|
||||
如果你想在 Linux Mint 上安装 GNOME ,那么这篇指南非常适合你。
|
||||
|
||||
### 在 Linux Mint 上安装GNOME 之前所要知道的事
|
||||
|
||||
你真的应该有足够的理由来在 Mint 上安装 GNOME 。如果你只是为了尝鲜,可以在虚拟机中尝试。我使用 [在 VirtualBox 中安装的 Linux Mint][3] 来演示这篇教程。
|
||||
要在 Mint 上安装 GNOME,你务必需要有足够的理由。如果你只是为了尝鲜,可以在虚拟机中尝试。我使用 [在 VirtualBox 中安装的 Linux Mint][3] 来演示这篇教程。
|
||||
|
||||
在发行版上安装一种桌面环境与直接使用来自发行版所提供的桌面环境相比,移除桌面环境部分会使其变成一件很复杂化的事。
|
||||
安装除发行版提供的桌面环境之外的其他桌面环境,移除桌面环境部分会使其变成一件很复杂的事。
|
||||
|
||||
Cinnamon 使用一些 GNOME 元素。如果你决定稍后移除 GNOME ,这可能会影响到 Cinnamon 的一部分功能。
|
||||
Cinnamon 使用了一些 GNOME 元素。如果你决定稍后移除 GNOME ,这可能会影响到 Cinnamon 的一部分功能。
|
||||
|
||||
这可能会导致缺少实战经验用户的恐慌。当然,在 TTY 屏幕中重新安装 Cinnamon 桌面环境可能是一种可行的解决方案。
|
||||
|
||||
最重要的一点是,如果你很容易惊慌地不知所措和不喜欢解决难题,那么你就不应该在你的主力计算机上做这些 ‘试验’ 。
|
||||
最重要的一点是,如果你很容易惊慌地不知所措和不喜欢解决难题,那么你就不应该在你的主力计算机上做这些 “试验” 。
|
||||
|
||||
抛开这些顾虑,让我们看看在 Linux Mint 上获取 GNOME 的简单过程。
|
||||
|
||||
### 在 Linux Mint 上安装 GNOME 桌面环境
|
||||
|
||||
在这里,你有两个选项。1、你可以使用包含所有的 GNOME 实用程序的完整的 GNOME 桌面,2、你也可以使用包含极少数软件包的 GNOME 精简版本、
|
||||
在这里,你有两个选项:1、你可以使用包含所有的 GNOME 实用程序的完整的 GNOME 桌面,2、你也可以使用包含极少数软件包的 GNOME 精简版本。
|
||||
|
||||
我都将讲解一下。
|
||||
|
||||
为 **安装精简版本的 GNOME** ,你需要安装一个名称为 `vanilla-GNOME` 的软件包,使用下面给定的命令:
|
||||
为 **安装精简版本的 GNOME** ,你需要安装一个名称为 `vanilla-gnome-desktop` 的软件包,使用下面给定的命令:
|
||||
|
||||
```
|
||||
sudo apt install vanilla-gnome-desktop
|
||||
@ -60,29 +62,29 @@ sudo apt install gnome
|
||||
|
||||
![choose display manager][4]
|
||||
|
||||
`gdm3` 是 GNOME 桌面的显示管理器,而 Linux Mint 使用 `lightdm` 作为默认的显示管理器,这两种显示器都可以正常工作,但是,我建议你使用 gdm3 来获取完整的 GNOME 体验。
|
||||
`gdm3` 是 GNOME 桌面的显示管理器,而 Linux Mint 使用 `lightdm` 作为默认的显示管理器,这两种显示器都可以正常工作,但是,我建议你使用 `gdm3` 来获取完整的 GNOME 体验。
|
||||
|
||||
#### 切换到 GNOME
|
||||
|
||||
在完成后,注销并按一次 enter 按键,在这里,你将看到一个小齿轮图标。从这里选择 GNOME :
|
||||
在完成后,注销并按一次回车键,在这里,你将看到一个小齿轮图标。从这里选择 “GNOME” :
|
||||
|
||||
![choose gnome while logging in][5]
|
||||
|
||||
现在,你拥有以 Linux Mint 为基础的 GNOME 桌面环境!
|
||||
|
||||
#### 额外提示:如何应用整体风格一致的主题
|
||||
#### 额外提示:如何应用整体风格一致的主题
|
||||
|
||||
你可以继续使用 Cinnamon 桌面的主题,但是它们大多不能如前工作,因此,我建议使用 GNOME 桌面的主题(例如 Adwaita )来保持桌面环境的一致性。
|
||||
|
||||
对我而言,其默认的字体没有一点效果。并且,我更喜欢 Fedora 提供的一些字体。因此,从系统菜单打开 <ruby>GNOME 调整<rt>GNOME tweaks</rt></ruby> 窗口,并作出如下更改:
|
||||
对我而言,其默认的字体没有一点效果。并且,我更喜欢 Fedora 提供的一些字体。因此,从系统菜单打开 <ruby>GNOME 调整<rt>GNOME tweaks</rt></ruby>,并作出如下更改:
|
||||
|
||||
![change fonts in ubuntu to have vanilla gnome experience][6]
|
||||
|
||||
这里是我使用的一些东西:
|
||||
这里是我使用的一些设置:
|
||||
|
||||
- **Cantarell Regular (11)** 用于界面和文档文本。
|
||||
- **Noto Sans Mono Regular (13)** 用于等宽字体文本。
|
||||
- **Cantarell Bold (11)** 用于窗口标题。
|
||||
- `Cantarell Regular (11)` 用于界面和文档文本。
|
||||
- `Noto Sans Mono Regular (13)` 用于等宽字体文本。
|
||||
- `Cantarell Bold (11)` 用于窗口标题。
|
||||
|
||||
它们的结果是,比默认的 Ubuntu 字体方案要好得多。
|
||||
|
||||
@ -101,7 +103,7 @@ via: https://itsfoss.com/install-gnome-linux-mint/
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[robsean](https://github.com/robseans)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
@ -114,3 +116,4 @@ via: https://itsfoss.com/install-gnome-linux-mint/
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/11/choose-gnome-while-logging-in.png
|
||||
[6]: https://itsfoss.com/wp-content/uploads/2022/11/change-fonts-in-ubuntu-to-have-vanilla-gnome-experience.png
|
||||
[7]: https://itsfoss.com/install-switch-themes-gnome-shell/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/15/104944fkv32vbys5x1hiv9.jpg
|
@ -0,0 +1,292 @@
|
||||
[#]: subject: "Introducing Rust calls to C library functions"
|
||||
[#]: via: "https://opensource.com/article/22/11/rust-calls-c-library-functions"
|
||||
[#]: author: "Marty Kalin https://opensource.com/users/mkalindepauledu"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "yzuowei"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15353-1.html"
|
||||
|
||||
从 Rust 调用 C 库函数
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Rust FFI 和 bindgen 工具是为 Rust 调用 C 库而设计的。Rust 很容易与 C 语言对话,从而与任何其它可以与 C 语言对话的语言对话。
|
||||
|
||||
为什么要从 Rust 调用 C 函数?简短的答案就是软件库。冗长的答案则触及到 C 在众多编程语言中的地位,特别是相对 Rust 而言。C、C++,还有 Rust 都是系统语言,这意味着程序员可以访问机器层面的数据类型与操作。在这三个系统语言中,C 依然占据主导地位。现代操作系统的内核主要是用 C 来写的,其余部分依靠汇编语言补充。在标准系统函数库中,输入与输出、数字处理、加密计算、安全、网络、国际化、字符串处理、内存管理等等,大多都是用 C 来写的。这些函数库所代表的是一个庞大的基础设施,支撑着用其他语言写出来的应用。Rust 发展至今也有着可观的函数库,但是 C 的函数库 —— 自 1970 年代就已存在,迄今还在蓬勃发展 —— 是一种无法被忽视的资源。最后一点是,C 依然还是编程语言中的 [通用语][1]:大部分语言都可以与 C 交流,透过 C,语言之间可以互相交流。
|
||||
|
||||
### 两个概念证明的例子
|
||||
|
||||
Rust 支持 FFI(<ruby>外部函数接口<rt>Foreign Function Interface</rt></ruby>)用以调用 C 函数。任何 FFI 所需要面临的问题是调用方语言是否涵盖了被调用语言的数据类型。例如,`ctypes` 是 Python 调用 C 的 FFI,但是 Python 并没有包括 C 所支持的无符号整数类型。结果就是,`ctypes` 必须寻求解决方案。
|
||||
|
||||
相比之下,Rust 包含了所有 C 中的原始(即,机器层面)类型。比如说,Rust 中的 `i32` 类对应 C 中的 `int` 类。C 特别声明了 `char` 类必须是一个字节大小,而其他类型,比如 `int`,必须至少是这个大小(LCTT 译注:原文处有评论指出 `int` 大小依照 C 标准应至少为 2 字节);然而如今所有合理的 C 编译器都支持四字节的 `int`,以及八字节的 `double`(Rust 中则是 `f64` 类),以此类推。
|
||||
|
||||
针对 C 的 FFI 所面临的另一个挑战是:FFI 是否能够处理 C 的裸指针,包括指向被看作是字符串的数组指针。C 没有字符串类型,它通过结合字符组和一个非打印终止符(大名鼎鼎的 _空终止符_)来实现字符串。相比之下,Rust 有两个字符串类型:`String` 和 `&str` (字符串切片)。问题是,Rust FFI 是否能将 C 字符串转化成 Rust 字符串——答案是 _肯定的_。
|
||||
|
||||
出于对效率的追求,结构体指针在 C 中也很常见。一个 C 结构体在作为一个函数的参数或者返回值的时候,其默认行为是传递值(即,逐字节复制)。C 结构体,如同它在 Rust 中的对应部分一样,可以包含数组和嵌套其他结构体,所以其大小是不定的。结构体在两种语言中的最佳用法是传递或返回引用,也就是说,传递或返回结构体的地址而不是结构体本身的副本。Rust FFI 再一次成功处理了 C 的结构体指针,其在 C 函数库中十分普遍。
|
||||
|
||||
第一段代码案例专注于调用相对简单的 C 库函数,比如 `abs`(绝对值)和 `sqrt`(平方根)。这些函数使用非指针标量参数并返回一个非指针标量值。第二段代码案例则涉及了字符串和结构体指针,在这里会介绍工具 [bindgen][2],其通过 C 接口(头文件)生成 Rust 代码,比如 `math.h` 以及 `time.h`。C 头文件声明了 C 函数的调用语法,并定义了会被调用的结构体。两段代码都能在 [我的主页上][3] 找到。
|
||||
|
||||
### 调用相对简单的 C 函数
|
||||
|
||||
第一段代码案例有四处 Rust 对标准数学库内的 C 函数的调用:两处分别调用了 `abs`(绝对值)和 `pow`(幂),两处重复调用了 `sqrt`(平方根)。这个程序可以直接用 `rustc` 编译器进行构建,或者使用更方便的命令 `cargo build`:
|
||||
|
||||
```
|
||||
use std::os::raw::c_int; // 32位
|
||||
use std::os::raw::c_double; // 64位
|
||||
|
||||
// 从标准库 libc 中引入三个函数。
|
||||
// 此处是 Rust 对三个 C 函数的声明:
|
||||
extern "C" {
|
||||
fn abs(num: c_int) -> c_int;
|
||||
fn sqrt(num: c_double) -> c_double;
|
||||
fn pow(num: c_double, power: c_double) -> c_double;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: i32 = -123;
|
||||
println!("\n{x}的绝对值是: {}.", unsafe { abs(x) });
|
||||
|
||||
let n: f64 = 9.0;
|
||||
let p: f64 = 3.0;
|
||||
println!("\n{n}的{p}次方是: {}.", unsafe { pow(n, p) });
|
||||
|
||||
let mut y: f64 = 64.0;
|
||||
println!("\n{y}的平方根是: {}.", unsafe { sqrt(y) });
|
||||
|
||||
y = -3.14;
|
||||
println!("\n{y}的平方根是: {}.", unsafe { sqrt(y) }); //** NaN = NotaNumber(不是数字)
|
||||
}
|
||||
```
|
||||
|
||||
顶部的两个 `use` 声明是 Rust 的数据类型 `c_int` 和 `c_double`,对应 C 类型里的 `int` 和 `double`。Rust 标准模块 `std::os::raw` 定义了 14 个类似的类型以确保跟 C 的兼容性。模块 `std::ffi` 中有 14 个同样的类型定义,以及对字符串的支持。
|
||||
|
||||
位于 `main` 函数上的 `extern "C"` 区域声明了 3 个 C 库函数,这些函数会在 `main` 函数内被调用。每次调用都使用了标准的 C 函数名,但每次调用都必须发生在一个 `unsafe` 区域内。正如每个新接触 Rust 的程序员所发现的那样,Rust 编译器极度强制内存安全。其他语言(特别是 C 和 C++)作不出相同的保证。`unsafe` 区域其实是说:Rust 对外部调用中可能存在的不安全行为不负责。
|
||||
|
||||
第一个程序输出为:
|
||||
|
||||
```
|
||||
-123的绝对值是: 123.
|
||||
9的3次方是: 729.
|
||||
64的平方根是: 8.
|
||||
-3.14的平方根是: NaN.
|
||||
```
|
||||
|
||||
输出的最后一行的 `NaN` 表示<ruby>不是数字<rt>Not a Number</rt></ruby>:C 库函数 `sqrt` 期待一个非负值作为参数,这使得参数 `-3.14` 生成了 `NaN` 作为返回值。
|
||||
|
||||
### 调用涉及指针的 C 函数
|
||||
|
||||
C 库函数为了提高效率,经常在安全、网络、字符串处理、内存管理,以及其他领域中使用指针。例如,库函数 `asctime`(ASCII 字符串形式的时间)期待一个结构体指针作为其参数。Rust 调用类似 `asctime` 的 C 函数就会比调用 `sqrt` 要更加棘手一些,后者既没有牵扯到指针,也不涉及到结构体。
|
||||
|
||||
函数 `asctime` 调用的 C 结构体类型为 `struct tm`。一个指向此结构体的指针会作为参数被传递给库函数 `mktime`(时间作为值)。此结构体会将时间拆分成诸如年、月、小时之类的单位。此结构体的<ruby>字段<rt>field</rt></ruby>类型为 `time_t`,是 `int`(32位)和 `long`(64 位)的别名。两个库函数将这些破碎的时间片段组合成了一个单一值:`asctime` 返回一个以字符串表示的时间,而 `mktime` 返回一个 `time_t` 值表示自 “<ruby>[纪元][4]<rt>Epoch</rt></ruby> 以来所经历的秒数,这是一个系统的时钟和时间戳的相对时间。典型的纪元设置为 1900 年或 1970 年,1 月 1 日 0 时 0 分 0 秒。(LCTT 校注:Unix、Linux 乃至于如今所有主要的计算机和网络的时间纪元均采用 1970 年为起点。)
|
||||
|
||||
以下的 C 程序调用了 `asctime` 和 `mktime`,并使用了其他库函数 `strftime` 来将 `mktime` 的返回值转化成一个格式化的字符串。这个程序可被视作 Rust 对应版本的预热:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
int main () {
|
||||
struct tm sometime; /* 时间被打破细分 */
|
||||
char buffer[80];
|
||||
int utc;
|
||||
|
||||
sometime.tm_sec = 1;
|
||||
sometime.tm_min = 1;
|
||||
sometime.tm_hour = 1;
|
||||
sometime.tm_mday = 1;
|
||||
sometime.tm_mon = 1;
|
||||
sometime.tm_year = 1; /*LCTT 校注:注意,相对于 1900 年的年数*/
|
||||
sometime.tm_hour = 1;
|
||||
sometime.tm_wday = 1;
|
||||
sometime.tm_yday = 1;
|
||||
|
||||
printf("日期与时间: %s\n", asctime(&sometime));
|
||||
|
||||
utc = mktime(&sometime);
|
||||
if( utc < 0 ) {
|
||||
fprintf(stderr, "错误: mktime 无法生成时间\n");
|
||||
} else {
|
||||
printf("返回的整数值: %d\n", utc);
|
||||
strftime(buffer, sizeof(buffer), "%c", &sometime);
|
||||
printf("更加可读的版本: %s\n", buffer);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
程序输出为:
|
||||
|
||||
```
|
||||
日期与时间: Fri Feb 1 01:01:01 1901
|
||||
返回的整数值: 2120218157
|
||||
更加可读的版本: Fri Feb 1 01:01:01 1901
|
||||
```
|
||||
|
||||
(LCTT 译注:如果你尝试在自己电脑上运行这段代码,然后得到了一行关于 `mktime` 的错误信息,然后又在网上随便找了个在线 C 编译器,复制代码然后得到了跟这里的结果有区别但是没有错误的结果,不要慌,我的电脑上也是这样的。导致本地机器上 `mktime` 失败的原因是作者没有设置 `tm_isdst`,这个是用来标记夏令时的标志。[`tm_isdst` 大于零则夏令时生效中,等于零则不生效,小于零标记未知][5]。加入 `sometime.tm_isdst = 0` 或 `= -1` 后应该就能得到跟在线编译器大致一样的结果。不同的地方在于结果第一行我得到的是 `Mon Feb ...`,这个与作者代码中 `sometime.tm_wday = 1` 对应,这里应该是作者**写错了**;第二行我和作者和网上得到的数字都不一样,这大概是合理的,因为这与机器的纪元有关;第三行我跟作者的结果是一样的,1901 年 2 月 1 日也确实是周五,这是因为 [`mktime` 其实会修正时间参数中不合理的地方][6]。至于夏令时具体是如何影响 `mktime` 这个问题,我能查到的只有 `mktime` 的计算受时区影响,更底层的原因我也不知道了。)
|
||||
|
||||
总的来说,Rust 在调用库函数 `asctime` 和 `mktime` 时,必须处理以下两个问题:
|
||||
|
||||
- 将裸指针作为唯一参数传递给每个库函数。
|
||||
- 把从 `asctime` 返回的 C 字符串转化为 Rust 字符串。
|
||||
|
||||
### Rust 调用 asctime 和 mktime
|
||||
|
||||
工具 `bindgen` 会根据类似 `math.h` 和 `time.h` 之类的 C 头文件生成 Rust 支持的代码。下面这个简化版的 `time.h` 就可以用来做例子,简化版与原版主要有两个不同:
|
||||
|
||||
- 内置类型 `int` 被用来取代别名类型 `time_t`。工具 bindgen 可以处理 `time_t` 类,但是会生成一些烦人的警告,因为 `time_t` 不符合 Rust 的命名规范:`time_t` 以下划线区分 `time` 和 `t`;Rust 更偏好驼峰式命名方法,比如 `TimeT`。
|
||||
- 出于同样的原因,这里选择 `StructTM` 作为 `struct tm` 的别名。
|
||||
|
||||
以下是一份简化版的头文件,`mktime` 和 `asctime` 在文件底部:
|
||||
|
||||
```
|
||||
typedef struct tm {
|
||||
int tm_sec; /* 秒 */
|
||||
int tm_min; /* 分钟 */
|
||||
int tm_hour; /* 小时 */
|
||||
int tm_mday; /* 日 */
|
||||
int tm_mon; /* 月 */
|
||||
int tm_year; /* 年 */
|
||||
int tm_wday; /* 星期 */
|
||||
int tm_yday; /* 一年中的第几天 */
|
||||
int tm_isdst; /* 夏令时 */
|
||||
} StructTM;
|
||||
|
||||
extern int mktime(StructTM*);
|
||||
extern char* asctime(StructTM*);
|
||||
```
|
||||
|
||||
`bindgen` 安装好后,`mytime.h` 作为以上提到的头文件,以下命令(`%` 是命令行提示符)可以生成所需的 Rust 代码并将其保存到文件 `mytime.rs`:
|
||||
|
||||
```
|
||||
% bindgen mytime.h > mytime.rs
|
||||
```
|
||||
|
||||
以下是 `mytime.rs` 中的重要部分:
|
||||
|
||||
```
|
||||
/* automatically generated by rust-bindgen 0.61.0 */
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub struct tm {
|
||||
pub tm_sec: ::std::os::raw::c_int,
|
||||
pub tm_min: ::std::os::raw::c_int,
|
||||
pub tm_hour: ::std::os::raw::c_int,
|
||||
pub tm_mday: ::std::os::raw::c_int,
|
||||
pub tm_mon: ::std::os::raw::c_int,
|
||||
pub tm_year: ::std::os::raw::c_int,
|
||||
pub tm_wday: ::std::os::raw::c_int,
|
||||
pub tm_yday: ::std::os::raw::c_int,
|
||||
pub tm_isdst: ::std::os::raw::c_int,
|
||||
}
|
||||
|
||||
pub type StructTM = tm;
|
||||
|
||||
extern "C" {
|
||||
pub fn mktime(arg1: *mut StructTM) -> ::std::os::raw::c_int;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
pub fn asctime(arg1: *mut StructTM) -> *mut ::std::os::raw::c_char;
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn bindgen_test_layout_tm() {
|
||||
const UNINIT: ::std::mem::MaybeUninit<tm> = ::std::mem::MaybeUninit::uninit();
|
||||
let ptr = UNINIT.as_ptr();
|
||||
assert_eq!(
|
||||
::std::mem::size_of::<tm>(),
|
||||
36usize,
|
||||
concat!("Size of: ", stringify!(tm))
|
||||
);
|
||||
...
|
||||
```
|
||||
|
||||
Rust 结构体 `struct tm`,跟原本在 C 中的一样,包含了 9 个 4 字节的整型字段。这些字段名称在 C 和 Rust 中是一样的。`extern "C"` 区域声明了库函数 `astime` 和 `mktime` 分别需要只一个参数,一个指向可变实例 `StructTM` 的裸指针。(库函数可能会通过指针改变作为参数传递的结构体。)
|
||||
|
||||
`#[test]` 属性下的其余代码是用来测试 Rust 版的时间结构体的布局。通过命令 `cargo test` 可以进行这些测试。问题在于,C 没有规定编译器应该如何对结构体中的字段进行布局。比如说,C 的 `struct tm` 以字段 `tm_sec` 开头用以表示秒;但是 C 不需要编译版本遵循这个排序。不管怎样,Rust 测试应该会成功,而 Rust 对库函数的调用也应如预期般工作。
|
||||
|
||||
### 设置好第二个案例并开始运行
|
||||
|
||||
从 `bindgen` 生成的代码不包含 `main` 函数,所以是一个天然的模块。以下是一个 `main` 函数初始化了 `StructTM` 并调用了 `asctime` 和 `mktime`:
|
||||
|
||||
```
|
||||
mod mytime;
|
||||
use mytime::*;
|
||||
use std::ffi::CStr;
|
||||
|
||||
fn main() {
|
||||
let mut sometime = StructTM {
|
||||
tm_year: 1,
|
||||
tm_mon: 1,
|
||||
tm_mday: 1,
|
||||
tm_hour: 1,
|
||||
tm_min: 1,
|
||||
tm_sec: 1,
|
||||
tm_isdst: -1,
|
||||
tm_wday: 1,
|
||||
tm_yday: 1
|
||||
};
|
||||
|
||||
unsafe {
|
||||
let c_ptr = &mut sometime; // 裸指针
|
||||
|
||||
// 调用,转化,并拥有
|
||||
// 返回的 C 字符串
|
||||
let char_ptr = asctime(c_ptr);
|
||||
let c_str = CStr::from_ptr(char_ptr);
|
||||
println!("{:#?}", c_str.to_str());
|
||||
|
||||
let utc = mktime(c_ptr);
|
||||
println!("{}", utc);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这段 Rust 代码可以被编译(直接用 `rustc` 或使用 `cargo`)并运行。输出为:
|
||||
|
||||
```
|
||||
Ok(
|
||||
"Mon Feb 1 01:01:01 1901\n",
|
||||
)
|
||||
2120218157
|
||||
```
|
||||
|
||||
对 C 函数 `asctime` 和 `mktime` 的调用必须再一次被放在 `unsafe` 区域内,因为 Rust 编译器无法对这些外部函数的潜在内存安全风险负责。此处声明一下,`asctime` 和 `mktime` 并没有安全风险。调用的两个函数的参数是裸指针 `ptr`,其指向结构体 `sometime` (在<ruby>栈<rt>stack</rt></ruby>中)的地址。
|
||||
|
||||
`asctime` 是两个函数中调用起来更棘手的那个,因为这个函数返回的是一个指向 C `char` 的指针,如果函数返回 `Mon` 那么指针就指向 `M`。但是 Rust 编译器并不知道 C 字符串 (`char` 的空终止数组)的储存位置。是内存里的静态空间?还是<ruby>堆<rt>heap</rt></ruby>?`asctime` 函数内用来储存时间的文字表达的数组实际上是在内存的静态空间里。无论如何,C 到 Rust 字符串转化需要两个步骤来避免编译错误:
|
||||
|
||||
- 调用 `Cstr::from_ptr(char_ptr)` 来将 C 字符串转化为 Rust 字符串并返回一个引用储存在变量 `c_str` 中。
|
||||
- 对 `c_str.to_str()` 的调用确保了 `c_str` 是所有者。
|
||||
|
||||
Rust 代码不会增加从 `mktime` 返回的整型值的易读性,这一部分留作课外作业给感兴趣的人去探究。Rust 模板 `chrono::format` 也有一个 `strftime` 函数,它可以被当作 C 的同名函数来使用,两者都是获取时间的文字表达。
|
||||
|
||||
### 使用 FFI 和 bindgen 调用 C
|
||||
|
||||
Rust FFI 和工具 `bindgen` 都能够出色地协助 Rust 调用 C 库,无论是标准库还是第三方库。Rust 可以轻松地与 C 交流,并透过 C 与其他语言交流。对于调用像 `sqrt` 一样简单的库函数,Rust FFI 表现直截了当,这是因为 Rust 的原始数据类型覆盖了它们在 C 中的对应部分。
|
||||
|
||||
对于更为复杂的交流 —— 特别是 Rust 调用像 `asctime` 和 `mktime` 一样,会涉及到结构体和指针的 C 库函数 —— `bindgen` 工具是优秀的帮手。这个工具会生成支持代码以及所需要的测试。当然,Rust 编译器无法假设 C 代码对内存安全的考虑会符合 Rust 的标准;因此,Rust 必须在 `unsafe` 区域内调用 C。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/rust-calls-c-library-functions
|
||||
|
||||
作者:[Marty Kalin][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[yzuowei](https://github.com/yzuowei)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/mkalindepauledu
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://baike.baidu.com/item/lingua%20franka/5359711
|
||||
[2]: https://github.com/rust-lang/rust-bindgen
|
||||
[3]: https://condor.depaul.edu/mkalin
|
||||
[4]: https://baike.baidu.com/item/UNIX时间/8932323
|
||||
[5]: https://cplusplus.com/reference/ctime/tm/
|
||||
[6]: https://cplusplus.com/reference/ctime/mktime/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/16/110147q4kk0qoqe0e3m6bb.jpg
|
@ -0,0 +1,135 @@
|
||||
[#]: subject: "Create a holiday light display with your Raspberry Pi and ping pong balls"
|
||||
[#]: via: "https://opensource.com/article/22/11/raspberry-pi-holiday-light-display"
|
||||
[#]: author: "Brian McCafferty https://opensource.com/users/bdm"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "Return7g"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15365-1.html"
|
||||
|
||||
利用树莓派和乒乓球制作一个假日彩灯
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 这个树莓派教程用于制作一个可编程的 LED 灯光显示器,非常适合各种技能水平的人。
|
||||
|
||||
我喜欢圣诞装饰品和灯饰,因此很长一段时间以来我一直想做一个可编程的 LED 项目。最近,我制作了一个由 LED 灯、乒乓球和树莓派 Zero 组成的灯阵列。这个项目相对简单并且具有教学价值,因此我认为它非常值得分享。
|
||||
|
||||
整个彩灯由我设计,但其中一些灵感也来自 YouTube。你可以在我的 [Git 存储库][1] 中找到源代码和制作说明。
|
||||
|
||||
### 购物清单
|
||||
|
||||
- [树莓派 Zero][2]
|
||||
- [树莓派保护壳][3]
|
||||
- 5V 2A 的电源线
|
||||
- 展架
|
||||
- 255 个乒乓球
|
||||
- 热熔胶枪和若干热熔胶棒
|
||||
- 烙铁
|
||||
- 焊锡丝
|
||||
- 22 AWG 0.35mm 实芯线
|
||||
- 10 米 WS2812(B) LED 灯带(每米 30 像素)
|
||||
- 万用表
|
||||
- 钢丝钳
|
||||
- 剥线钳
|
||||
|
||||
### 设计树莓派的灯光效果
|
||||
|
||||
这个设计是根据我展框的大小决定的。我在全球速卖通买到了每米 30 像素的灯带,它可以轻松地切成 0.5 米的长度,每条有 15 个 LED 灯。乒乓球的直径是 40 毫米,所以我测量并隔开 40 毫米划了线,LED 灯条放在每隔 40 毫米的中间部分,这就产生了 17 条线。因此我的灯光阵列是 15×17。你可以根据实际情况来调整尺寸。
|
||||
|
||||
为了给灯带和树莓派供电,我在电路板底部设置了数据线和电源线。我的 LED 灯不需要很多电,所以我使用树莓派 Zero 的 5V 输出 GPIO 为它们供电。当我以 50% 的亮度运行时,这个亮度已经足以在白天和晚上透过我的窗户看到。
|
||||
|
||||
### 布线
|
||||
|
||||
我从电路板的底部以之字形开始布线,这使得焊接非常容易,因为每行的末尾不必返回到每行的开头。
|
||||
|
||||
我的线路大致像这样(为清楚起见,这里进行了简化,实际上它一共有 17 行):
|
||||
|
||||
```
|
||||
<---------------\
|
||||
|
|
||||
/---------------/
|
||||
|
|
||||
\---------------< # 这里连接树莓派
|
||||
```
|
||||
|
||||
### 使用树莓派制作显示屏
|
||||
|
||||
当设计和布线的工作完成后就可以开始制作显示屏了。
|
||||
|
||||
我在展板上测量并绘制了线路。我的灯带背面有胶带,所以我只需要取下背衬并将其贴在展板上。我检查了每个灯带的位置和数据线的方向,以确保灯带可以按照树莓派的指令正确串联起来。
|
||||
|
||||
连接好所有灯带后,我剪下三段长度相同的电线,并将每个灯带末端的电源线、数据线和接地线连接到其上方。
|
||||
|
||||
![Connect each light strip at the end of each line.][4]
|
||||
|
||||
在线路连接完成后,我检查了每条灯带之间的电源线和地线之间的连接,以确保其连通性。我还检查了是否存在错误的桥接,所以我验证了电源线和地线之间的连接。我还进行了一些测试以确保所有灯都正常点亮(链路测试参阅 [测试代码][5])。
|
||||
|
||||
完成上述工作后,我开始在乒乓球上剪洞,用剪刀刺入乒乓球的底部,然后剪一个小洞让 LED 灯穿进去。手工不太行,每个球都不太一样,但效果真的很好。我使用的每米 30 个像素的 LED 灯,所以每个 LED 之间有大约 30 毫米的空隙。一个乒乓球是 40 毫米宽,但我不打算开始单独焊接每一个 LED!我想,这是很重要的。首先,我并不擅长焊接(正如我的照片所显示的),而且无论如何,我想“好吧,它们是乒乓球。我可以把它们压在一起!”
|
||||
|
||||
我是这样做的:
|
||||
|
||||
在 LED 灯上滴上热熔胶,然后在 LED 上放了一个乒乓球并按住大约五秒钟,就粘好了一个乒乓球。粘贴下一个乒乓球时我只需要挤着上一个乒乓球,就能让所有乒乓球都变得整齐了。我对它的外观很满意。它还有一个很好的好处,就是掩盖了我糟糕的焊接工作;)
|
||||
|
||||
![It's a tight fit, but the 40mm ping pong balls fit in a 30mm space just fine.][6]
|
||||
|
||||
我继续为余下的乒乓球进行焊接。尽管这个过程中有几个乒乓球被压碎了,但最终还是顺利完成了制作。
|
||||
|
||||
![255 LEDs and 255 ping pong balls in an array.][7]
|
||||
|
||||
### 测试代码
|
||||
|
||||
测试代码需要确保所有部件都能正常工作,为此我使用了这个 [Adafruit 指南][8],它以红、绿和蓝点亮每个 LED,然后依次进行循环。我在测试时使用它来确保我连接无误并且焊接正常。
|
||||
|
||||
在此之后,我在电子表格中设计了一个网格,将每个像素映射到一个网格位置。由于我的像素编号呈之字形排列,因此很难跟踪每个 LED(例如 A1 为 256,B1 为 226)。重新映射网格位置能使得我在构建图像时更容易。
|
||||
|
||||
在所有准备工作完成之后,我就可以在纸上和电子表格中设计图像,然后编码。于是我开始添加一些动画(使用循环并将像素变为一种颜色,然后变为另一种颜色)。
|
||||
|
||||
最终的结果还算顺利。
|
||||
|
||||
![A Christmas gift in LED.][9]
|
||||
|
||||
![Reindeer painted with light.][10]
|
||||
|
||||
![An LED snowflake.][11]
|
||||
|
||||
### 能玩一年的树莓派彩灯
|
||||
|
||||
我不确定这是否已经完全完成了。自从把它摆放到橱窗里,几乎每个晚上我都会添加一些新的图像和动画。我已经在考虑除夕夜的时候要做成什么样了。它不会像圣诞装饰品一起在圣诞节后被放进储藏室。我只需要在上面显示其它图案,就能使它成为一个能玩一年的彩灯!我的一个朋友推荐了像素版马里奥,这听起来是个好主意!
|
||||
|
||||
我的代码仍然需要完善。例如,我做了一些滚动文本,但当我为文本的每个位置重新绘制时却花了很多时间。我想我可以用循环做一些事情,或者图像库可以帮助更轻松地滚动字母,并使添加文本更容易,而不是在每一步打开和关闭每个像素。
|
||||
|
||||
这里有一张照片记录了我制作的全过程:[LED 乒乓墙][12]。
|
||||
|
||||
可以在此处观看它的运行视频:[XMas 灯光展示][13]。
|
||||
|
||||
这个彩灯最终的效果我非常满意。以后我也会尝试更多利用 LED 彩灯完成的项目。我也鼓励大家亲自动手制作一个这样的彩灯,它会比你想象中更简单。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/raspberry-pi-holiday-light-display
|
||||
|
||||
作者:[Brian McCafferty][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[Return7g](https://github.com/Return7g)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/bdm
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://github.com/bmccafferty/ping-pong-led-wall
|
||||
[2]: https://shop.pimoroni.com/products/raspberry-pi-zero-wh-with-pre-soldered-header
|
||||
[3]: https://shop.pimoroni.com/products/pibow-zero-w
|
||||
[4]: https://opensource.com/sites/default/files/2022-11/IMG_20201126_115520.jpeg
|
||||
[5]: https://opensource.com#the-code
|
||||
[6]: https://opensource.com/sites/default/files/2022-11/IMG_20201127_101409.webp
|
||||
[7]: https://opensource.com/sites/default/files/2022-11/IMG_20201127_160500.webp
|
||||
[8]: https://learn.adafruit.com/neopixels-on-raspberry-pi/python-usage
|
||||
[9]: https://opensource.com/sites/default/files/2022-11/IMG_20201127_181931.webp
|
||||
[10]: https://opensource.com/sites/default/files/2022-11/IMG_20201202_215902.webp
|
||||
[11]: https://opensource.com/sites/default/files/2022-11/IMG_20201127_215314.webp
|
||||
[12]: https://projects.bdm.scot/Xmas%20LED%20Wall%202020/
|
||||
[13]: https://youtu.be/zc0501GzpMw
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/20/095754r7q0z001lvx6p600.jpg
|
@ -3,18 +3,20 @@
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15346-1.html"
|
||||
|
||||
Monica:个人关系管理的开源应用
|
||||
Monica:人际关系管理的开源应用
|
||||
======
|
||||
|
||||
你可能已经知道 CRM 代表 **客户关系管理**。 我们已经有了一份帮助小型企业的[开源 CRM 软件][1]列表。
|
||||
![][0]
|
||||
|
||||
在这里,我将讨论一个有趣的开源 Web 应用,它采用相同的人际关系概念。 听起来很独特,对吧?
|
||||
你可能已经知道 CRM 代表 <ruby>客户关系管理<rt>Customer Relationship Management</rt></ruby>。 我们已经有了一份帮助小型企业的 [开源 CRM 软件][1] 列表。
|
||||
|
||||
Monica 是一款可让你组织和记录你与亲人互动的应用。 **如果你自行托管,它是免费的,如果你需要托管版本那么订阅**。
|
||||
在这里,我将讨论一个有趣的开源 Web 应用,它采用相同的人际关系概念。听起来很独特,对吧?
|
||||
|
||||
Monica 是一款可让你组织和记录你与亲人互动的应用。**如果你自行托管,它是免费的,如果你需要托管版本那么订阅**。
|
||||
|
||||
### Monica:跟踪社交互动
|
||||
|
||||
@ -22,11 +24,11 @@ Monica 是一款可让你组织和记录你与亲人互动的应用。 **如果
|
||||
|
||||
很难记住与家人、朋友或同事互动的每一个细节。
|
||||
|
||||
你可以使用[笔记应用][3]或 [CubyText][4] 等知识管理应用来添加一些信息。 但这些并不是为记录你的互动而量身定制的。 因此,你将不得不付出一些努力,以在需要时得心应手的方式添加信息。
|
||||
你可以使用 [笔记应用][3] 或 [CubyText][4] 等知识管理应用来添加一些信息。但这些并不是为记录你的互动而量身定制的。 因此,你将不得不付出一些努力,以在需要时得心应手的方式添加信息。
|
||||
|
||||
使用 Monica,添加你的家庭、工作、联系人之间的关系、活动、日记、重要日期的提醒、债务等信息变得更加容易。
|
||||
|
||||
可以将其安装在自己的服务器上或选择 **$90/年**的订阅以获得托管版本。
|
||||
可以将其安装在自己的服务器上或选择 **$90/年** 的订阅以获得托管版本。
|
||||
|
||||
有趣的是,开发人员最初是根据他的个人要求构建它的。
|
||||
|
||||
@ -34,26 +36,26 @@ Monica 是一款可让你组织和记录你与亲人互动的应用。 **如果
|
||||
|
||||
![dashboard][5]
|
||||
|
||||
你可以获得大量选项来添加有关你日常生活中的人和互动的信息。 其中一些包括:
|
||||
你可以获得大量选项来添加有关你日常生活中的人和互动的信息。其中一些包括:
|
||||
|
||||
- 添加关于一个人的注释
|
||||
- 列出与联系人相关的重要其他人的姓名(他们的孩子、宠物等)
|
||||
- 通话记录
|
||||
- 每个联系人的备用联系方式
|
||||
- 重要约会和重要事件提醒。 生日会自动设置为提醒。
|
||||
- 重要约会和重要事件提醒。生日会自动设置为提醒。
|
||||
- 管理礼物信息
|
||||
- 有用的仪表板,一目了然
|
||||
- 支持日记条目
|
||||
|
||||
Monica 似乎配备了各种功能,使其成为写日记、做笔记、添加联系信息、添加事件等的一体化工具。
|
||||
|
||||
不幸的是,没有可用的移动应用。 你可以从 Web 浏览器访问它,但它可能不是每个人的最佳体验。 所以,如果你坚持用智能手机做笔记和其他东西,你可能想看看其他的。
|
||||
不幸的是,没有可用的移动应用。你可以从 Web 浏览器访问它,但它可能不是每个人的最佳体验。所以,如果你坚持用智能手机做笔记和其他东西,你可能想看看其他的。
|
||||
|
||||
### 自托管或订阅访问
|
||||
|
||||
如果你想要 Monica 的托管版本,可以查看它的[定价页面][6]了解更多信息。
|
||||
如果你想要 Monica 的托管版本,可以查看它的 [定价页面][6] 了解更多信息。
|
||||
|
||||
对于自托管,你需要前往其 [GitHub 页面][7]并按照说明下载并安装它。 可以选择在 Platform.sh 或 Heroku 上快速部署。
|
||||
对于自托管,你需要前往其 [GitHub 页面][7] 并按照说明下载并安装它。可以选择在 Platform.sh 或 Heroku 上快速部署。
|
||||
|
||||
在选择服务器来托管 Monica 之前,请检查最低系统要求。
|
||||
|
||||
@ -61,7 +63,7 @@ Monica 似乎配备了各种功能,使其成为写日记、做笔记、添加
|
||||
|
||||
这一切都很方便。 所以,选择对你来说不错的。
|
||||
|
||||
前往其[官方网站][8]获取所有详细信息并开始使用。
|
||||
前往其 [官方网站][8] 获取所有详细信息并开始使用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -84,3 +86,4 @@ via: https://itsfoss.com/monica/
|
||||
[6]: https://www.monicahq.com/pricing
|
||||
[7]: https://github.com/monicahq/monica#get-started
|
||||
[8]: https://www.zdnet.com/article/microsoft-office-365-banned-in-german-schools-over-privacy-fears/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/14/093133zpw06jndpzbdpphp.jpg
|
@ -0,0 +1,68 @@
|
||||
[#]: subject: "Try this Java file manager on Linux"
|
||||
[#]: via: "https://opensource.com/article/22/12/linux-file-manager-jfileprocessor"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15357-1.html"
|
||||
|
||||
在 Linux 上试试这个 Java 文件管理器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> JFileProcessor 作为一个 Linux 文件管理器,在设计和功能上都采取了极简理念。
|
||||
|
||||
计算机是一个奇特的文件柜,里面装满了虚拟文件夹和文件,等待着被引用、交叉引用、编辑、更新、保存、复制、移动、重命名和归类。在本文中,我将介绍一下 Linux 系统的文件管理器。
|
||||
|
||||
在 <ruby>昇阳微系统<rt>Sun Microsystem</rt></ruby> 时代的末期,出现了一种叫做 <ruby>Java 桌面系统<rt>Java Desktop System</rt></ruby> 的东西,奇怪的是它 _不是_ 用 Java 编写的。相反,它是(根据当时的 sun.com 上的描述)“对集成和优化的桌面软件的明智选择,大部分基于开源代码和开放标准”。它基于 GNOME,带有办公套件、电子邮件和日历应用、即时消息和“Java 技术”。我发现自己在思考用 Java 创建桌面需要什么。客观地说,桌面实际上并不包括那么多东西。一般的共识似乎是桌面由面板、系统托盘、应用菜单和文件管理器组成。
|
||||
|
||||
想象一个实际的 Java 桌面是一个有趣的思维练习。虽然不足以以此为目标启动一个开源项目,但足以在网络上快速搜索必要的组件。事实证明,有人用 Java 编写并维护了一个文件管理器。
|
||||
|
||||
### JFileProcessor
|
||||
|
||||
我找到的 Java 文件管理器叫做 JFileProcessor,简称 JFP。它不仅是用 Java 编写的,更具体是说是用 [Groovy][1](一种流行的 Java 脚本语言)进行的一项迷人的实践。
|
||||
|
||||
![Image of the JfileProcessor folders.][2]
|
||||
|
||||
作为文件管理器,JFileProcessor 在设计和功能上都采用了极简方式。它允许你查看、打开、移动、复制、剪切或删除本地系统和远程系统上的文件。它不是特别定制化的,它没有如拆分面板或可移动面板等额外功能。除了管理文件外,它没什么别的中心主题。JFileProcessor 在某种程度上令人耳目一新,因为它很简单。这是一个文件管理器,仅此而已。有时这就是你在文件管理器中想要的全部。
|
||||
|
||||
我之前写过关于 [设置 Java Swing 主题][3] 的方式,从技术上讲,该技术可以应用于这个开源应用。但是,我认为这个应用的部分魅力在于 OpenSolaris 称之为 “Blueprint” 的主题。这是 Java 的怀旧外观,我喜欢以其原生 GUI 外观运行它,作为对我的 OpenSolaris(现为 OpenIndiana)笔记本电脑的回忆。
|
||||
|
||||
### 用户体验
|
||||
|
||||
除了设计,真正重要的是用户体验。JFileProcessor 只有三个你日常使用的按钮:向上、后退和前进。它们未绑定到键盘快捷键,因此你必须单击按钮才能导航(或使用 `Tab` 键选择按钮)。在使用图形应用时,我经常使用键盘快捷键,所以当我尝试浏览我的系统时,这大大减慢了我的速度。但是,有时我实际上只是懒洋洋地浏览文件,因此 JFileProcessor 完全按照我的需要工作。
|
||||
|
||||
JFileProcessor 也有一个搜索组件。只要你设置合理的起始文件夹,搜索就会快速而智能,同时允许使用通配符和正则模式搜索。例如,当我搜索特定的电子书或漫画档案或游戏规则手册时,或者当我粗略地知道该目录包含一个项目但懒得一直点击到目的地址。在子目录中快速搜索,必然会得到明显的结果,然后双击打开文件,不管我设置了什么 XDG 偏好(Evince 用于 PDF,Foliate 用于电子书,等等)。
|
||||
|
||||
右键单击任何文件或目录会弹出上下文菜单。它具有你期望的大部分常见任务:复制、剪切、粘贴、删除、重命名、新建。它也有一些不错的额外功能。
|
||||
|
||||
![Right-click context menu in JFileProcessor][4]
|
||||
|
||||
例如,你可以只将文件名复制到剪贴板或保存文件路径。你还可以运行一些脚本,包括用于批量重命名文件的脚本、用于对选定文件运行命令的脚本、用于创建 ZIP 或 TAR 存档的脚本等等。当然,编码器有多种选择,包括在当前位置打开终端和打开新的编码窗口。
|
||||
|
||||
### 安装
|
||||
|
||||
我是 Java 的忠实粉丝。它是一种清晰的语言,具有合理的分隔符和对跨平台兼容性的坚定立场。我喜欢它作为一种语言,我喜欢看到程序员用它创造的东西。
|
||||
|
||||
JFileProcessor 的名字很贴切。这是一种处理文件的有效方法,从某种意义上说,JFileProcessor 为你提供了一个简单的窗口来查看系统上的文件数据,并允许你以图形方式与它们进行交互,就像你可能在终端中与它们交互一样。它不是我用过的最高效的文件管理器,也不是功能最多的一个。然而,这是一个令人愉快的应用,为你提供了文件管理所需的基本工具,其相对较小的代码库使你可以在下午阅读一些精彩的内容。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/linux-file-manager-jfileprocessor
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/20/12/groovy
|
||||
[2]: https://opensource.com/sites/default/files/2022-09/jfileprocessor.webp
|
||||
[3]: https://opensource.com/article/22/3/beautify-java-applications
|
||||
[4]: https://opensource.com/sites/default/files/2022-09/jfileprocessor-menu.webp
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/17/121727uuepuz1q3qhgippd.jpg
|
@ -31,7 +31,7 @@ $ sudo dnf install cinnamon-desktop
|
||||
在 Linux Mint、Debian 和类似系统上:
|
||||
|
||||
```
|
||||
$ sudo dnf install cinnamon-desktop-environment
|
||||
$ sudo apt install cinnamon-desktop-environment
|
||||
```
|
||||
|
||||
当然,作为该桌面的发源地,Linux Mint 也预装了 Cinnamon。
|
@ -0,0 +1,125 @@
|
||||
[#]: subject: "How to Access UEFI Settings in Linux Systems"
|
||||
[#]: via: "https://itsfoss.com/access-uefi-from-linux/"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15361-1.html"
|
||||
|
||||
如何在 Linux 系统中访问 UEFI 设置
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
想要在固件级别检查启动顺序或电源设置? **你可以在系统启动时按 `F2`、`F10` 或 `Del` 按键访问 UEFI 设置**。
|
||||
|
||||
这种方法的问题是你可能不知道确切的键,并且必须警惕在正确的时间按下这些键。
|
||||
|
||||
![Mr. Bean][1a]
|
||||
|
||||
如果你不想像上面 Gif 中的憨豆先生,你可以从 Linux 中的 [Grub 引导加载器][1] 页面访问 UEFI 设置。
|
||||
|
||||
![uefi firmware settings grub linux][2]
|
||||
|
||||
当你打开 Linux 系统时,你会看到这个页面。Fedora 和 Ubuntu 等大多数 Linux 发行版都使用 Grub,它们允许你像这样从 Grub 页面访问 UEFI 设置。
|
||||
|
||||
如果你没有看到此页面,或你的发行版不使用 Grub 怎么办? 仍然有一些方法可以从 Linux 中访问 UEFI 设置。
|
||||
|
||||
在你了解如何操作之前,请 [确保你的系统使用的是 UEFI][3]。
|
||||
|
||||
另一件重要的事情。你的系统重启才能进入 UEFI 设置。你无法从操作系统中访问和修改固件设置。
|
||||
|
||||
### 从 Linux 启动到 UEFI 设置
|
||||
|
||||
此方法仅适用于具有 systemd 的 Linux 发行版。这意味着这种方法适用于任何基于 Ubuntu、Debian、Fedora 和任何主流的基于 Arch 的发行版,包括 Manjaro 和 EndeavourOS。
|
||||
|
||||
[确保你的 Linux 发行版使用 systemd][4] 仍然是一个好主意。使用给定的命令,如果它返回 systemd,你就可以开始了:
|
||||
|
||||
```
|
||||
ps --no-headers -o comm 1
|
||||
```
|
||||
|
||||
![how to know if i am using systemd on linux?][5]
|
||||
|
||||
当你发现你的发行版正在使用 systemd,你可以使用给定的命令启动到 UEFI 设置:
|
||||
|
||||
```
|
||||
systemctl reboot --firmware-setup
|
||||
```
|
||||
|
||||
让我首先分解使用的选项:
|
||||
|
||||
- `reboot`:顾名思义,它将重启你的系统。
|
||||
- `--firmware-setup`: 当此选项与 `reboot` 一起使用时,它会指示系统固件启动进入固件设置界面。
|
||||
|
||||
就是这样! 一个命令,你将进入 UEFI 设置。我知道 Windows 允许 [从 Windows 中启动进入 UEFI 固件设置][6]。很高兴在 Linux 中看到类似的东西。
|
||||
|
||||
#### 创建桌面快捷方式以启动到 UEFI 设置(可选)
|
||||
|
||||
如果你经常发现自己启动进入 UEFI 设置,并且不记得所有命令,你可以通过创建桌面快捷方式让你的生活更轻松。这将使你可以通过单击桌面图标启动到 UEFI。
|
||||
|
||||
不过,对于大多数 Linux 用户来说,这是不必要的,也不是必需的。只有当你觉得有必要时才去做。该方法需要 [在命令行中编辑文件][7]。
|
||||
|
||||
首先,使用给定的命令为 UEFI 设置创建桌面快捷方式文件:
|
||||
|
||||
```
|
||||
sudo nano /usr/share/applications/uefi-reboot.desktop
|
||||
```
|
||||
|
||||
并将以下内容粘贴到文件中:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=UEFI Firmware Setup (Reboot)
|
||||
Comment=Access the motherboard configuration utility
|
||||
Exec=systemctl reboot --firmware-setup
|
||||
Icon=system-restart
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=System;Settings;
|
||||
```
|
||||
|
||||
![create a desktop shortcut to boot into uefi settings][8]
|
||||
|
||||
完成后,[保存更改并退出 nano][9] 文本编辑器。
|
||||
|
||||
现在,你将在系统菜单中找到 UEFI 固件设置的快捷方式:
|
||||
|
||||
![boot into uefi firmware from system menu][10]
|
||||
|
||||
完成了!一种进入 UEFI 设置的巧妙方法。
|
||||
|
||||
### 总结
|
||||
|
||||
访问启动设置的经典方法对某些人来说可能有点不方便。Grub 页面可能不会显示旧版本的 UEFI 选项。
|
||||
|
||||
这就是 systemd 方法的亮点所在。当我的系统崩溃并且我的功能键没有响应时,我发现这种方法是救命稻草,这是启动到 UEFI 所必需的(我当时就是这么想的!)。
|
||||
|
||||
我希望你发现它同样有用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/access-uefi-from-linux/
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1a]: https://img.linux.net.cn/data/attachment/album/202212/19/092256nkeoyuou6h3ykud6.gif
|
||||
[1]: https://itsfoss.com/what-is-grub/
|
||||
[2]: https://itsfoss.com/wp-content/uploads/2022/12/uefi-firmware-settings-grub-linux.webp
|
||||
[3]: https://itsfoss.com/check-uefi-or-bios/
|
||||
[4]: https://linuxhandbook.com/check-if-systemd/
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/12/how-to-know-if-i-am-using-systemd-on-linux.png
|
||||
[6]: https://itsfoss.com/access-uefi-settings-windows-10/
|
||||
[7]: https://learnubuntu.com/edit-files-command-line/
|
||||
[8]: https://itsfoss.com/wp-content/uploads/2022/12/create-a-desktop-shortcut-to-boot-into-uefi-settings.png
|
||||
[9]: https://linuxhandbook.com/nano-save-exit/
|
||||
[10]: https://itsfoss.com/wp-content/uploads/2022/12/boot-into-uefi-firmware-from-system-menu.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/19/092450oi0c0c7cp4ng2nem.jpg
|
@ -0,0 +1,88 @@
|
||||
[#]: subject: "Convert and Manipulate Images With ‘Converter’ GUI Tool in Linux"
|
||||
[#]: via: "https://itsfoss.com/converter-tool/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15368-1.html"
|
||||
|
||||
在 Linux 中使用 “Converter” GUI 工具转换和操作图像
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
你可以随时在你的系统上 [安装 ImageMagick][1] 来转换图像,但并不是每个人都喜欢使用终端来转换和操作图像。
|
||||
|
||||
那么,如果你有一个 GUI 应用作为前端来帮助解决这个问题呢? **Converter** 就是这样的工具。
|
||||
|
||||
它是 ImageMagick 的前端。所以你不需要使用命令来转换和操作图像。
|
||||
|
||||
请注意,大多数 Ubuntu 系统通常都预装了 ImageMagick。如果你的系统上还没有安装,你可以随时参考我们的 [安装指南][1]。
|
||||
|
||||
### Converter:ImageMagick 的图形前端
|
||||
|
||||
![converter gui][2]
|
||||
|
||||
转换图像不应该花费很多精力。这是一项简单的任务,而且应该如此。
|
||||
|
||||
我不想键入命令来快速转换图像。因此,我更喜欢使我能够更快地做事的图形工具。
|
||||
|
||||
[Converter][3] 是一个开源图形前端,可以让你做到这点。它是一个 GTK4 + libadwaita 应用。
|
||||
|
||||
你可以将图像转换为各种文件格式,包括 png、webp、jpeg、heif、heic 和 bmp。可以肯定地说,你获得了对最流行的图像文件格式的支持。所以,它应该会派上用场。
|
||||
|
||||
![file format converter][4]
|
||||
|
||||
你可以设置一个位置来保存所有文件,转换后的图像将自动存储在该位置。
|
||||
|
||||
![customize converter][5]
|
||||
|
||||
你还可以调整图像的质量、大小和背景颜色。要访问这些选项,请在转换图像之前单击用户界面中的“<ruby>更多选项<rt>More Options</rt></ruby>”。
|
||||
|
||||
![converter more options][6]
|
||||
|
||||
可以使用百分比、精确像素或比率自定义图像大小。对于精确操作,更改尺寸可能更有用。如果你希望图像缩放到一定程度,百分比或比例功能应该可以帮助你做到这一点。你还可以选择为图像添加滤镜。
|
||||
|
||||
总体而言,你可以获得使用 Converter 调整大小、转换和优化图像质量的基本功能。
|
||||
|
||||
你还可以 [调整 Nautilus][7] 以获得 [右键单击上下文菜单中的调整大小选项][8]。但它不像这个工具那样通用。
|
||||
|
||||
### 在 Linux 上安装 Converter
|
||||
|
||||
Converter 在 [Flathub][9] 上以 Flatpak 的形式提供,可以安装在你选择的任何 Linux 发行版上。
|
||||
|
||||
遗憾的是,你无法在 Linux 系统上安装任何二进制包。因此,你可能需要参考我们的 [Flatpak 指南][10] 来安装它。
|
||||
|
||||
```
|
||||
flatpak install flathub io.gitlab.adhami3310.Converter
|
||||
```
|
||||
|
||||
你可以在其 [GitLab 页面][3] 上探索更多相关信息。
|
||||
|
||||
_你对我们接下来要重点介绍的此类有趣工具有什么建议吗? 让我们在评论中知道。_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/converter-tool/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/install-imagemagick-ubuntu/
|
||||
[2]: https://itsfoss.com/wp-content/uploads/2022/12/converter-gui.png
|
||||
[3]: https://gitlab.com/adhami3310/Converter
|
||||
[4]: https://itsfoss.com/wp-content/uploads/2022/12/file-format-converter.png
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/12/customize-converter.png
|
||||
[6]: https://itsfoss.com/wp-content/uploads/2022/12/converter-more-options.png
|
||||
[7]: https://itsfoss.com/nautilus-tips-tweaks/
|
||||
[8]: https://itsfoss.com/resize-images-with-right-click/
|
||||
[9]: https://flathub.org/apps/details/io.gitlab.adhami3310.Converter
|
||||
[10]: https://itsfoss.com/flatpak-guide/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/21/161705qzvydyyd8v8y3cyh.jpg
|
@ -0,0 +1,262 @@
|
||||
[#]: subject: "7 pro tips for using the GDB step command"
|
||||
[#]: via: "https://opensource.com/article/22/12/gdb-step-command"
|
||||
[#]: author: "Alexandra https://opensource.com/users/ahajkova"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "chai001125"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15362-1.html"
|
||||
|
||||
GDB 的 7 个单步调试命令
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 即使是复杂的函数,也有几种方法可以单步调试,所以下次在排除代码故障时,可以尝试一下这些 GDB 技术。
|
||||
|
||||
**调试器** 是一个可以运行你的代码并检查问题的软件。[GNU Debugger][1](GBD)是最流行的调试器之一,在这篇文章中,我研究了 GDB 的 `step` 命令和其他几种常见情况的相关命令。`step` 是一个被广泛使用的命令,但它有一些人们不太了解的地方,可能会使得他们十分困惑。此外,还有一些方法可以**在不使用 `step` 命令的情况下进入一个函数**,比如使用不太知名的 `advance` 命令。
|
||||
|
||||
### 1、无调试符号
|
||||
|
||||
考虑以下这个简单的示例程序:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
int num() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
void bar(int i) {
|
||||
printf("i = %d\n", i);
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
bar(num());
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
如果你在没有 <ruby>调试符号<rt> debugging sysbols </rt></ruby> 的情况下进行编译(LCTT 译注:即在使用 `gcc` 编译程序时没有写 `-g` 选项),然后在 `bar` 上设置一个断点,然后尝试在这个函数内使用 `step` 来单步执行语句。GDB 会给出一个 <ruby>没有行号信息<rt> no line number information </rt></ruby> 的错误信息。
|
||||
|
||||
```
|
||||
gcc exmp.c -o exmp
|
||||
gdb ./exmp
|
||||
(gdb) b bar
|
||||
Breakpoint 1 at 0x401135
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, 0x0000000000401135 in bar ()
|
||||
(gdb) step
|
||||
Single stepping until exit from function bar,
|
||||
which has no line number information.
|
||||
i = 2
|
||||
0x0000000000401168 in main ()
|
||||
```
|
||||
|
||||
### 2、stepi 命令
|
||||
|
||||
但是你仍然可以在没有行号信息的函数内部单步执行语句,但要使用 `stepi` 命令来代替 `step`。`stepi` 一次只执行一条指令。当使用 GDB 的 `stepi` 命令时,先做 `display/i $pc` 通常很有用,这会在每一步之后**显示** <ruby>程序计数器<rt> program counter </rt></ruby> 的值和**相应的** <ruby>机器指令<rt> machine instruction </rt></ruby>:
|
||||
|
||||
```
|
||||
(gdb) b bar
|
||||
Breakpoint 1 at 0x401135
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, 0x0000000000401135 in bar ()
|
||||
(gdb) display/i $pc
|
||||
1: x/i $pc
|
||||
=> 0x401135 <bar+4>: sub $0x10,%rsp
|
||||
```
|
||||
|
||||
在上述的 `display` 命令中,`i` 代表机器指令,`$pc` 表示程序计数器寄存器(即 PC 寄存器)。
|
||||
|
||||
使用 `info registers` 命令,来**打印寄存器的内容**,也是十分有用的。
|
||||
|
||||
```
|
||||
(gdb) info registers
|
||||
rax 0x2 2
|
||||
rbx 0x7fffffffdbc8 140737488346056
|
||||
rcx 0x403e18 4210200
|
||||
(gdb) print $rax
|
||||
$1 = 2
|
||||
(gdb) stepi
|
||||
0x0000000000401139 in bar ()
|
||||
1: x/i $pc
|
||||
=> 0x401139 <bar+8>: mov %edi,-0x4(%rbp)
|
||||
```
|
||||
|
||||
### 3、复杂的函数调用
|
||||
|
||||
在带调试符号的 `-g` 选项,重新编译示例程序后,你可以使用行号在 `main` 中 `bar` 调用上设置断点,然后再单步执行 `bar` 函数的语句:
|
||||
|
||||
```
|
||||
gcc -g exmp.c -o exmp
|
||||
gdb ./exmp
|
||||
(gdb) b exmp.c:14
|
||||
Breakpoint 1 at 0x401157: file exmp.c, line 14.
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, main () at exmp.c:14
|
||||
14 bar(num());
|
||||
```
|
||||
|
||||
接下来,用 `step`,来单步执行 `bar()` 函数的语句:
|
||||
|
||||
```
|
||||
(gdb) step
|
||||
num () at exmp.c:4
|
||||
4 return 2;
|
||||
```
|
||||
|
||||
函数调用的参数需要在实际的函数调用之前进行处理,`bar()` 函数的参数是 `num()` 函数,所以 `num()` 会在 `bar()` 被调用之前执行。但是,通过 GDB 调试,你怎么才能如愿以偿地进入 `bar()` 函数呢?你可以使用 `finish` 命令,并再次使用 `step` 命令。
|
||||
|
||||
```
|
||||
(gdb) finish
|
||||
Run till exit from #0 num () at exmp.c:4
|
||||
0x0000000000401161 in main () at exmp.c:14
|
||||
14 bar(num());
|
||||
Value returned is $1 = 2
|
||||
(gdb) step
|
||||
bar (i=2) at exmp.c:9
|
||||
9 printf("i = %d\n", i);
|
||||
```
|
||||
|
||||
### 4、tbreak 命令
|
||||
|
||||
`tbreak` 命令会设置一个**临时断点**。如果你不想设置永久断点,那么这个命令是很有用的。举个例子🌰,你想进入一个复杂的函数调用,例如 `f(g(h()), i(j()), ...)`,在这种情况下,你需要一个很长的 `step/finish/step` 序列,才能到达 `f` 函数。如果你设置一个临时断点,然后再使用 `continue` 命令,这样就不需要以上的序列了。为了证明这一点,你需要像以前一样将断点设置在 `main` 的 `bar` 调用上。然后在 `bar` 上设置临时断点。当到达该临时断点后,临时断点会被自动删除。
|
||||
|
||||
```
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, main () at exmp.c:14
|
||||
14 bar(num());
|
||||
(gdb) tbreak bar
|
||||
Temporary breakpoint 2 at 0x40113c: file exmp.c, line 9.
|
||||
```
|
||||
|
||||
在调用 `bar` 的时候遇到断点,并在 `bar` 上设置临时断点后,你只需要使用 `continue` 继续运行直到 `bar` 结束。
|
||||
|
||||
```
|
||||
(gdb) continue
|
||||
Continuing.
|
||||
Temporary breakpoint 2, bar (i=2) at exmp.c:9
|
||||
9 printf("i = %d\n", i);
|
||||
```
|
||||
|
||||
### 5、disable 命令
|
||||
|
||||
类似地,你也可以在 `bar` 上设置一个正常的断点,然后执行 `continue`,然后在不再需要第二个断点时,使用 `disable` 命令禁用这个断点,这样也能达到与 `tbreak` 相同的效果。
|
||||
|
||||
```
|
||||
(gdb) b exmp.c:14
|
||||
Breakpoint 1 at 0x401157: file exmp.c, line 14.
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, main () at exmp.c:14
|
||||
14 bar(num());
|
||||
(gdb) b bar
|
||||
Breakpoint 2 at 0x40113c: file exmp.c, line 9.
|
||||
(gdb) c
|
||||
Continuing.
|
||||
Breakpoint 2, bar (i=2) at exmp.c:9
|
||||
9 printf("i = %d\n", i);
|
||||
(gdb) disable 2
|
||||
```
|
||||
|
||||
正如你所看到的,`info breakpoints` 命令在 `Enb` 列下显示为 `n`,这意味着这个断点已被禁用。但你也能在再次需要这个断点时,再启用它。
|
||||
|
||||
```
|
||||
(gdb) info breakpoints
|
||||
Num Type Disp Enb Address What
|
||||
1 breakpoint keep y 0x0000000000401157 in main at exmp.c:14
|
||||
breakpoint already hit 1 time
|
||||
2 breakpoint keep n 0x000000000040113c in bar at exmp.c:9
|
||||
breakpoint already hit 1 time
|
||||
(gdb) enable 2
|
||||
(gdb) info breakpoints
|
||||
Num Type Disp Enb Address What
|
||||
1 breakpoint keep y 0x000000000040116a in main at exmp.c:19
|
||||
breakpoint already hit 1 time
|
||||
2 breakpoint keep y 0x0000000000401158 in bar at exmp.c:14
|
||||
breakpoint already hit 1 time
|
||||
```
|
||||
|
||||
### 6、advance 命令运行程序到指定的位置
|
||||
|
||||
另一个进入函数内部的方法是 `advance` 命令。你可以简单地用 `advance bar`,来代替 `tbreak bar ; continue`。这一命令会将程序继续运行到指定的位置。
|
||||
|
||||
`advance` 命令的一个很棒的地方在于:如果程序并没有到达你试图进入的位置,那么 GDB 将在当前函数运行完成后停止。因此,程序的执行会受到限制:
|
||||
|
||||
```
|
||||
Breakpoint 1 at 0x401157: file exmp.c, line 14.
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, main () at exmp.c:14
|
||||
14 bar(num());
|
||||
(gdb) advance bar
|
||||
bar (i=2) at exmp.c:9
|
||||
9 printf("i = %d\n", i);
|
||||
```
|
||||
|
||||
### 7、skip 命令
|
||||
|
||||
进入 `bar` 函数的另一种方式是使用 `skip num` 命令:
|
||||
|
||||
```
|
||||
(gdb) b exmp.c:14
|
||||
Breakpoint 1 at 0x401157: file exmp.c, line 14.
|
||||
(gdb) skip num
|
||||
Function num will be skipped when stepping.
|
||||
(gdb) r
|
||||
Starting program: /home/ahajkova/exmp
|
||||
Breakpoint 1, main () at exmp.c:14
|
||||
14 bar(num());
|
||||
(gdb) step
|
||||
bar (i=2) at exmp.c:9
|
||||
9 printf("i = %d\n", i);
|
||||
```
|
||||
|
||||
请使用 `info skip` 命令,来了解 GDB 跳过了哪些函数。`num()` 函数被标记为 `y`,表示跳过了 `num()` 函数:
|
||||
|
||||
```
|
||||
(gdb) info skip
|
||||
Num Enb Glob File RE Function
|
||||
1 y n <none> n num
|
||||
```
|
||||
|
||||
如果不再需要 `skip`,可以禁用(并稍后重新启用)或完全删除它。你可以添加另一个 `skip`,并禁用第一个 `skip`,然后全部删除。要禁用某个 `skip`,必须指定其编号(例如,`skip disable 1`),如果没有指定,则会禁用所有的 `skip`。启用或删除 `skip` 的工作原理相同:
|
||||
|
||||
```
|
||||
(gdb) skip bar
|
||||
(gdb) skip disable 1
|
||||
(gdb) info skip
|
||||
Num Enb Glob File RE Function
|
||||
1 n n <none> n num
|
||||
2 y n <none> n bar
|
||||
(gdb) skip delete
|
||||
(gdb) info skip
|
||||
Not skipping any files or functions.
|
||||
```
|
||||
|
||||
### GDB 的 step 命令
|
||||
|
||||
使用 GDB 的 `step` 命令是调试程序的一个有用工具。即使是复杂的函数,也有几种方法可以单步调试这些函数,所以下次你在排除代码问题的时候,可以尝试一下这些 GDB 技术。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/gdb-step-command
|
||||
|
||||
作者:[Alexandra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[chai001125](https://github.com/chai001125)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/ahajkova
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/21/3/debug-code-gdb
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/19/093831nrjrmozx1mixmgii.jpg
|
@ -0,0 +1,64 @@
|
||||
[#]: subject: "Install open source solar power at home"
|
||||
[#]: via: "https://opensource.com/article/22/12/open-source-solar-power-home"
|
||||
[#]: author: "Joshua Pearce https://opensource.com/users/joshuapearce"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15374-1.html"
|
||||
|
||||
在家里安装开源光伏支架
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 看看这两个你可以为你的家庭建造的开源的光伏支架设计。
|
||||
|
||||
你可能已经考虑过用太阳能为你的家供电。将太阳光直接转化为电能的太阳能光伏电池板的成本已大幅下降,因此在任何地方都具有经济意义。这就是为什么大公司投入大量太阳能,甚至电力公司也开始安装大型太阳能发电场的原因,因为它的成本低于过时的化石燃料。像大多数房主一样,你想省钱并节省电费,但你可能对前期费用有点畏缩。为了大致了解成本,一个 5 千瓦系统,以 3 美元/瓦的价格为普通家庭供电,成本约为 15,000 美元,而更大的家庭可能需要 10 千瓦才能满足所有电力购买,成本为 30,000 美元。如果你想要电池,成本加倍(你不需要电池,因为大多数太阳能电池阵列连接到电网,但如果电网瘫痪,你的太阳能电池阵列也会瘫痪,直到它重新开启)。支付你未来几十年所有的电费是一种投资,即使你存了很多钱。
|
||||
|
||||
有一些好消息。首先,美国和加拿大都对太阳能实行了 30% 的税收抵免。此项优惠将价格降至约 2 美元/瓦。其次,[我们之前讨论][1] 过你可以获得一本免费书籍 《[捕捉阳光][2]》,它会引导你完成如何设计自己的系统(你仍然需要一个合格的电工和检查来把它连接到电网)。如果你有一点手艺,你可以将剩余成本削减约 50%。这些成本主要用于材料,包括太阳能电池板、布线、电子设备和支架。令人惊讶的是,对于小型太阳能系统(比如你家的太阳能系统)来说,太阳能电池板的成本下降得如此之低,以至于支架(支撑太阳能电池板的机械结构)的成本可能比面板还高!
|
||||
|
||||
### 开源再次拯救
|
||||
|
||||
将开源开发范式应用于软件可以加快创新速度、改进产品并降低成本。开源硬件也是如此,甚至在光伏支架这个相对不为人知的领域也是如此。几乎所有的商业光伏支架都是由专有的奇特铝型材制成。它们会花很多钱。如果你有一些没有遮挡的后院,有一些开源的支架解决方案可以选择。
|
||||
|
||||
### 开源太阳能支架设计
|
||||
|
||||
第一个 DIY 太阳能支架设计符合以下标准:(1) 由当地可获得的可再生材料制成,(2) 25 年的使用寿命与太阳能保修相匹配,(3)能够由普通消费者制造,(4)能够符合加拿大结构建筑规范(如果你住在没有雪的地方,这有点矫枉过正,但是,嘿,你可能有其他极端天气需要应对,例如飓风),(5)低成本,(6)它是共享的,使用开源许可证。[开源的木质固定倾斜地面安装双面光伏支架设计][3] 在整个北美都适用。与商业专有支架相比,该支架系统可节省 49% 至 77%。然而,支架设计高度依赖于世界各地不同的木材成本。
|
||||
|
||||
在深入研究这个开源设计之前,请检查你当地的木材成本。
|
||||
|
||||
![Non-tilting solar rack plans][4]
|
||||
|
||||
如果你更喜欢冒险,你可能会考虑第二种允许改变倾斜角度的设计。[第二项研究][5] 的结果表明,具有最佳可变季节性倾斜角的支架系统具有最佳的终身能量产生,与固定倾斜系统相比,产生的能量多 5.2%(或者,如果最大倾斜角限制为 60°,能量多 4.8%)。固定和可变木制支架系统的电力成本相似,仅为专有商业金属货架的 29%。可变倾斜支架提供了最低成本的选择,即使包括适度的劳动力成本,也可能为 [农业光伏][6] 等应用提供特定优势(即,你可以在面板下面种菜,对于莴苣等耐阴作物来说,能惊人地增加产量)。此设计已通过 [具有 CERN-OHL-S-2.0 许可证的 OSHWA][7] 的认证。
|
||||
|
||||
![Tilt-adjustable solar racks][8]
|
||||
|
||||
所示的 2 个光伏模块架中的每一个大约有 1 千瓦。所以一所房子大约需要五个。这两篇论文都提供了完整的计算和分步建造说明。
|
||||
|
||||
正如拥有太阳能系统的任何人都会告诉你的那样,获得负电费是非常有益的。如果你的系统规模能满足你所有的负荷,并且住在该国的净计量地区,就会出现这种情况。请注意,电力公司不会向你付款;额度会一直延续到你在冬天使用它为止。
|
||||
|
||||
享受一点开源太阳能带来的乐趣!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/open-source-solar-power-home
|
||||
|
||||
作者:[Joshua Pearce][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/joshuapearce
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/21/11/open-source-solar-power
|
||||
[2]: https://tocatchthesun.com/
|
||||
[3]: https://doi.org/10.3390/designs6030041
|
||||
[4]: https://opensource.com/sites/default/files/2022-11/nontilt.png
|
||||
[5]: https://doi.org/10.3390/designs6030054
|
||||
[6]: https://www.academia.edu/18406368/The_potential_of_agrivoltaic_systems
|
||||
[7]: https://certification.oshwa.org/ca000013.html
|
||||
[8]: https://opensource.com/sites/default/files/2022-11/tilt.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/23/094653pn7mn3j22ymwymuw.jpg
|
@ -0,0 +1,83 @@
|
||||
[#]: subject: "Simplify your Linux PC with the PCManFM file manager"
|
||||
[#]: via: "https://opensource.com/article/22/12/linux-file-manager-pcmanfm"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15378-1.html"
|
||||
|
||||
使用 PCManFM 文件管理器让你的 Linux PC 轻装上阵
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> PCMan 文件管理器是一个让旧电脑感觉更有效率的好选择。
|
||||
|
||||
PCMan 文件管理器,或简称 PCManFM,是一个功能齐全的快速轻量级文件管理器。它是为 [LXDE][1] 桌面环境开发的,但它是一个独立的应用,可以与你选择的桌面或窗口管理器一起使用。
|
||||
|
||||
### 安装 PCManFM
|
||||
|
||||
在 Linux 上,你可能可以在软件仓库中找到 PCManFM。例如,在 Fedora、Mageia 和类似软件上:
|
||||
|
||||
```
|
||||
$ sudo dnf install pcmanfm
|
||||
```
|
||||
|
||||
在 Debian、Elementary 和类似系统上:
|
||||
|
||||
```
|
||||
$ sudo apt install pcmanfm
|
||||
```
|
||||
|
||||
![Image of the PCMan file manager.][2]
|
||||
|
||||
不必用 PCManFM 替换你的桌面文件管理器,但某些发行版认为当你安装“第三方”文件管理器时,你会希望它优先于默认的文件管理器。根据你使用的桌面,有不同的方法来设置默认文件管理器。通常,它位于 <ruby>系统设置<rt>System Settings</rt></ruby> 下的 <ruby>默认应用<rt>Default Applications</rt></ruby> 中。
|
||||
|
||||
如果你的桌面环境或窗口管理器没有选择默认应用的界面,你可以在 `~/.local/share/applications/mimeapps.list` 文件中设置你的首选项。要将一个文件管理器指定为默认的,请将其放在 `[Default Applications]` 部分的顶部,首先指定文件类型,然后指定你想用于打开的应用文件的名称(在 `/usr/share/applications` 下):
|
||||
|
||||
```
|
||||
inode/directory=myfilemanager.desktop;
|
||||
```
|
||||
|
||||
### PCManFM
|
||||
|
||||
如果你是 GNOME 2 或 Mate 项目的 [Caja 文件管理器][3] 的粉丝,那么 PCManFM 是一个不错的选择。PCManFM 在设计上很像 Caja,但它不像 Caja 那样绑定到桌面,所以它甚至可以在最新的 GNOME 桌面上使用。
|
||||
|
||||
PCManFM 的默认布局在窗口顶部附近有一个有用的工具栏,一个提供对常用目录和驱动器的快速访问的侧面板,以及一个包含有关你当前选择的详细信息的状态栏。你可以使用 <ruby>视图<rt>View</rt></ruby> 菜单隐藏或显示这些元素中的任何一个。
|
||||
|
||||
### 选项卡和面板
|
||||
|
||||
PCManFM 也使用选项卡。如果你以前从未使用过选项卡式文件管理器,那么想想 Web 浏览器以及它如何使用选项卡让你在一个窗口中打开多个网页。PCManFM 可以类似地在同一窗口中打开多个目录。
|
||||
|
||||
要将文件或文件夹从一个选项卡传输到另一个选项卡,只需将文件的图标拖动到选项卡并悬停即可。少许延迟后,PCManFM 将目标选项卡置于最前面,以便你可以继续进行拖放操作。如果你不习惯与文件管理器中的选项卡进行交互,则需要一些时间来适应,但这不会花很长时间,而且它是整理工作区的一项非常强大的功能。
|
||||
|
||||
PCManFM 界面的另一个不错的功能是它能够将一个窗口分成两个面板。每个面板实际上都是一个选项卡,但每个面板只占窗口的一半。
|
||||
|
||||
![Image of dual panels in PCMan.png][4]
|
||||
|
||||
这使得从一个面板拖到另一个面板就像将文件拖到文件夹中一样简单自然。我发现它对于比较文件夹的内容也很有用。
|
||||
|
||||
### 使用 PCMan 进行文件管理
|
||||
|
||||
PCManFM 是一款很棒的小型文件管理器,具有你日常所需的所有基本功能。它是你可能会觉得过于复杂的文件管理器的自然替代品,也是 [老旧计算机][5] 上的一个很好的选择,这些电脑可能对不断绘制缩略图、刷新和生成动画的文件管理器举步维艰。PCMan 专注于文件管理器的核心任务:管理文件。在你的 Linux 电脑上试试吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/linux-file-manager-pcmanfm
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/19/12/lxqt-lxde-linux-desktop
|
||||
[2]: https://opensource.com/sites/default/files/2022-10/pcmanfilemanager.png
|
||||
[3]: https://opensource.com/article/22/12/linux-file-manager-caja
|
||||
[4]: https://opensource.com/sites/default/files/2022-10/%E2%80%8BDual.panel_.in%20PCManFM.png
|
||||
[5]: https://opensource.com/article/22/10/obsolete-computer-linux-opportunity
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/24/161333mssnim76ssugskie.jpg
|
@ -0,0 +1,146 @@
|
||||
[#]: subject: "Linux Kernel 6.1 Released With Initial Rust Code"
|
||||
[#]: via: "https://news.itsfoss.com/linux-kernel-6-1-release/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15343-1.html"
|
||||
|
||||
Linux 内核 6.1 发布,包含初始 Rust 支持
|
||||
======
|
||||
|
||||
> Linux 内核 6.1 现在可以使用了!考虑到这是今年最后一个稳定版本,它有可能是 LTS 版本。
|
||||
|
||||
![Linux 内核 6.1 发布,包含初始 Rust 支持][1]
|
||||
|
||||
Linux 内核 6.1 终于来了,它以改进和支持新硬件的形式为我们提前带来了节日礼物。🎄
|
||||
|
||||
它是在 Linux 内核 6.0 发布的几个月后出现的,当时的命名方案从 5.x.x 改为 6.x,以减少小版本号太多带来的混乱。
|
||||
|
||||
像往常一样,今年的最后一个内核版本 **可能被作为一个长期发布的版本**,从而得到几年的支持。
|
||||
|
||||
Linux 内核 6.1 如约带来了许多改进,并初步支持了 AMD 和英特尔尚未发布的硬件。
|
||||
|
||||
在发布公告中,Linus Torvalds 提到:
|
||||
|
||||
> 所以到现在,我们晚了一个星期,不过上周已经没那么紧迫了,而且很顺利,我对 6.1 的状态要比几个星期前感到放心多了,当时似乎还比较紧迫。当然,这意味着现在我们有一个可怕的合并窗口,就在节日假期之前,而且我也有一些节前的旅行要安排。因此,虽然推迟一周是正确的做法,但它确实使 6.2 合并窗口的时间变得很尴尬。
|
||||
|
||||
他进一步补充说,考虑到每个人都应该过一个平静的假日季,他将会更严格的对合并窗口的规则进行要求。
|
||||
|
||||
### 🆕 Linux 内核 6.1 有什么新内容?
|
||||
|
||||
在这个版本中,我们看到了各种变化,例如改进了对 ARM SoC 的支持,初步支持英特尔即将推出的 Meteor Lake CPU,以及 AMD 的 RDNA 3 GPU。
|
||||
|
||||
你可以在其 [公告][2] 中找到更多技术细节。
|
||||
|
||||
#### 对 Rust 的实验性支持
|
||||
|
||||
![linux 6.1 rust][3]
|
||||
|
||||
虽然我们预计这将发生在 Linux 内核 6.0,但它在 Linux 内核 6.1 中才出现,这将允许开发者用 Rust 编写内核代码。
|
||||
|
||||
#### 英特尔 Meteor Lake 的启用
|
||||
|
||||
![英特尔][4]
|
||||
|
||||
英特尔的开源开发者一直在努力工作,为即将到来的 Meteor Lake 芯片提供初步支持。
|
||||
|
||||
它被称为英特尔的第一个 7 纳米微架构,开发人员已经向 DRM-next 推送了各种提交。
|
||||
|
||||
这些包括各种固件提交,对 Meteor Lake CPU 及其集成 GPU 的初步支持。
|
||||
|
||||
#### 对 AMD RDNA 3 图形的初始支持
|
||||
|
||||
![AMD][5]
|
||||
|
||||
这段时间,AMD 一直在为 Linux 内核 6.1 添加 RDNA 3 图形架构的代码。
|
||||
|
||||
这包括对他们即将推出的 GPU 的支持和对他们之前的 GPU 产品的各种修复。
|
||||
|
||||
你可以通过 [这里][6] 查看完整的补丁列表。
|
||||
|
||||
#### 对 AMD 电脑的优化
|
||||
|
||||
![优化 AMD][7]
|
||||
|
||||
AMD PMF(AMD 平台管理框架)已经被引入这个内核版本。
|
||||
|
||||
该驱动旨在为 AMD PC 更安静、更高效的运行提供支持。
|
||||
|
||||
它利用板载传感器与 AMD 的各种热能和功率内核驱动来实现这一目标。
|
||||
|
||||
#### 改进的 ARM SoC 支持
|
||||
|
||||
![arm soc][8]
|
||||
|
||||
Linux 内核 6.1 带来了对 ARM SoC 的更多支持,例如:
|
||||
|
||||
- 联发科 MT8186
|
||||
- 德州仪器 AM62A
|
||||
- 恩智浦 i.MX8DXL
|
||||
- 高通 IPQ8064 的各种变体
|
||||
|
||||
该内核还对一些智能手机提供了支持,如 PINE64 PinePhone Pro、索尼 Xperia 1 IV 和三星 Galaxy E5/E7/Grand Max。
|
||||
|
||||
#### 存储的改进
|
||||
|
||||
内核在存储方面有很多改进。
|
||||
|
||||
例如,Btrfs 在这次更新中带来了异步缓冲写入,提供了超过 2 倍的吞吐量。
|
||||
|
||||
然后是对 EXT4 的改进,包括性能优化和一些错误修复。
|
||||
|
||||
与此同时,[EROFS][9] 为 Linux 内核 6.1 引入了基于 FSCache 的共享域支持。
|
||||
|
||||
#### 🛠️ 其他改进措施
|
||||
|
||||
这些并不是 Linux 内核 6.1 提供的唯一改进,以下是其他一些值得注意的改进:
|
||||
|
||||
- 对微软 Surface Pro 9 和 Surface Laptop 5 的支持。
|
||||
- 启用 AMD Zen 4 LbrExtV2。
|
||||
- AMD CPU “缓存到缓存”和内存报告功能。
|
||||
- 引入 AMD IOMMU v2。
|
||||
- 为 Wi-Fi 802.11be/Wi-Fi 7 做准备。
|
||||
|
||||
### 如何安装 Linux 内核 6.1?
|
||||
|
||||
如果你使用基于 Arch 的发行版或 Fedora,你可以轻松升级。
|
||||
|
||||
不幸的是,如果你使用其他 Linux 发行版(Pop!_OS 和 Linux Lite 在某种程度上可以是个例外),你可能无法直接从发行版中获得升级。
|
||||
|
||||
然而,几乎所有的 Linux 发行版都明确地允许你安装最新的内核。这里有一个关于 Ubuntu 的指南👇
|
||||
|
||||
> **[如何在 Ubuntu 中安装最新的主线 Linux 内核版本](https://itsfoss.com/upgrade-linux-kernel-ubuntu/)**
|
||||
|
||||
所以,如果你乐于冒险(并且知道自己在做什么),你可以在 [Linux 内核档案][10] 上找到列出的较新的内核。你可以下载 [tarball][11] 来测试它。
|
||||
|
||||
然而,像往常一样,如果你不想冒任何风险,我们建议等待你的 Linux 发行版推送更新。最好是坚持使用你的 Linux 发行版默认提供的东西。
|
||||
|
||||
> **[下载 Linux 6.1][12]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/linux-kernel-6-1-release/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/linux-kernel-6-1-release.png
|
||||
[2]: https://lore.kernel.org/lkml/CAHk-=wj_HcgFZNyZHTLJ7qC2613zphKDtLh6ndciwopZRfH0aQ@mail.gmail.com/T/#u
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/linux-6-1-rust.png
|
||||
[4]: https://news.itsfoss.com/content/images/2022/12/intel-meteor.png
|
||||
[5]: https://news.itsfoss.com/content/images/2022/12/amd-rdna-3.png
|
||||
[6]: https://lists.freedesktop.org/archives/dri-devel/2022-September/373430.html
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/amd-rdna-3--1-.png
|
||||
[8]: https://news.itsfoss.com/content/images/2022/12/amd-rdna-3--2-.png
|
||||
[9]: https://en.wikipedia.org/wiki/EROFS
|
||||
[10]: https://www.kernel.org/
|
||||
[11]: https://git.kernel.org/torvalds/t/linux-6.1.tar.gz
|
||||
[12]: https://www.kernel.org
|
@ -0,0 +1,229 @@
|
||||
[#]: subject: "5 Best Linux Phones to Watch Out for in 2023"
|
||||
[#]: via: "https://www.debugpoint.com/best-linux-phones/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "chai001125"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15371-1.html"
|
||||
|
||||
2023 年值得期待的 5 款最佳 Linux 手机
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 以下是一份可能在 2023 年成为主流的最佳 Linux 手机榜单,并介绍了各个 Linux 手机的特点和价格。
|
||||
|
||||
安卓和 iOS 智能手机是世界上最流行的手机。然而,还有许多人都想要更“开放”、且**在隐私方面做得更好的手机**。如果你使用安卓手机,那么你就是放弃了你的隐私。在个人隐私保护方面,苹果的 iOS 手机表现得要好一点,但它也仅提供了有限的隐私保护。
|
||||
|
||||
这就是现在 Linux 手机变得很流行的原因,因为它们为开发者和终端用户提供了许多选择。虽然目前有各种类型的 Linux 手机,但是要选择最好的 Linux 手机仍然令人困惑。从 2022 年的趋势来看,以下是一些可能在 2023 年成为主流的 Linux 手机。
|
||||
|
||||
### 关于 Linux 手机,你需要知道的事情
|
||||
|
||||
当你浏览或者计划购买一部 Linux 手机之前,你应该先了解以下关于 Linux 手机的事情:
|
||||
|
||||
- Linux 手机使用的是主流 Linux 发行版的修改版,它有一个适合手机的桌面环境。这对今天的大多数手机(例如安卓、苹果 iOS)来说,也是类似的。
|
||||
- 如果你打算买一部 Linux 手机,并将其作为你日常所使用的手机的话,请不要太期待这个 Linux 手机。因为 Linux 手机的操作系统、功能和应用生态系统仍处于早期发展阶段,远远比不上与安卓或 iOS 手机。
|
||||
- 然而,Linux 手机的操作系统提供了最好的隐私功能,这会成为你想要出手买一部 Linux 手机的原因。
|
||||
|
||||
### 最好的 Linux 手机
|
||||
|
||||
#### 1、Librem🥇
|
||||
|
||||
**Purism** 公司是 Linux 手机市场上一个相当著名的品牌。Purism 公司推出的 **Librem 5 Linux** 智能手机支持 **PureOS**。PureOS 是一个专为 Linux 手机设计的操作系统,不基于安卓或 iOS 系统,它是一个原生设计的自由开源的操作系统;它还支持 <ruby>融合<rt> convergence </rt></ruby>,这意味着你可以通过 USB 集线器将手机插入电脑显示器,并将其作为一个桌面操作系统使用🆒。
|
||||
|
||||
这款手机拥有优质的硬件和手感,还十分注重安全和隐私。但是,这款令人印象深刻的智能手机价格有点贵,售价为 1299 美元💔。
|
||||
|
||||
Librem 5 Linux 的主要特点和规格:
|
||||
|
||||
- 完全的自由开源,基于 Linux 的移动操作系统:PureOS
|
||||
- 拥有独立的调制解调器、Wi-Fi 和蓝牙芯片
|
||||
- 拥有 3 个专门的硬件键,来启用和禁用互联网、相机、Wi-Fi 和蓝牙
|
||||
- 拥有智能卡读卡器
|
||||
- 拥有 SD 卡读卡器
|
||||
- 电池可更换
|
||||
|
||||
![Librem 5][1]
|
||||
|
||||
| 规格 | 描述 |
|
||||
| :- | :- |
|
||||
| **屏幕** | 5.7 英寸(IPS TFT 720×1440) |
|
||||
| **内存** | 3 GB |
|
||||
| **存储** | 32 GB eMMC |
|
||||
| **电池容量** | 4500 mAh |
|
||||
| **CPU** | NXP i.MX 8M QUAD CORE Cortex-A53(四核),64 位 ARM,最高主频为 1.5GHz |
|
||||
| **GPU** | Vivante GC7000 Lite |
|
||||
| **屏幕** | 5.7 英寸,IPS TFT,720×1440 像素 |
|
||||
| **摄像头** | 带 LED 闪光灯的 1300 万像素(后置)摄像头和 800 万像素(前置)摄像头 |
|
||||
| **USB 接口** | Type C 接口 |
|
||||
|
||||
有点兴趣?你可以进一步浏览 [Librem 5 的购买官网][2]。
|
||||
|
||||
#### 2、Pinephone🥈
|
||||
|
||||
Linux 手机榜单的第 2 名是 **Pinephone**。Pinephone 也许是市场上最完善、最实用的 Linux 手机了。它由 **Pine64** 公司开发,具有出色的功能,并是支持多种 Linux ARM 的移动发行版。
|
||||
|
||||
此外,PinePhone 同时有很多个版本,其中包括专业版本。PinePhone 的价格比较便宜,并且十分注重用户的隐私和可扩展性,如果你是第一次使用 Linux 手机,PinePhone 将会是一个不错的选择😌。
|
||||
|
||||
Pinephone 的主要特点和规格:
|
||||
|
||||
- 支持的操作系统有 KDE Plasma mobile、Manjaro mobile、Sailfish OS 和 Ubuntu touch。
|
||||
- 配备启用和禁用 LTE、摄像头、Wifi/BT 和麦克风的 5 个开关
|
||||
- 可启动的 microSD 和 16GB/32GB eMMC 的内存空间
|
||||
- Type C 接口(可用于电源、数据和视频输出)
|
||||
- 拥有 6 个 Pogo 引脚,允许自定义硬件扩展,如热像仪、无线充电、NFC、扩展电池盒或键盘盒。
|
||||
- 拥有 3.5 毫米耳机插孔
|
||||
- 支持融合,可将其插到一台电脑上
|
||||
- 价格实惠,2 种型号的售价分别为 149 美元和 199 美元起
|
||||
|
||||
![Pinephone][3]
|
||||
|
||||
| 规格 | 描述 |
|
||||
| :- | :- |
|
||||
| **屏幕** | 5.95 英寸,高清 IPS 电容式触摸屏 |
|
||||
| **CPU** | Allwinner A64 ARM QUAD Core Cortex-A53(四核),64 位 |
|
||||
| **GPU** | Mali-400 MP2 |
|
||||
| **内存** | 2 种型号:2GB 和 3GB LPDDR3 SDRAM |
|
||||
| **存储** | 2 种型号:16GB and 32GB eMMC |
|
||||
| **摄像头** | 500 万像素、1/4英寸、LED 闪光灯(后置)摄像头和 200 万像素、1/5英寸(前置)摄像头 |
|
||||
| **电池** | 锂离子电池(容量为 2800 mAh) |
|
||||
| **音频插孔** | 3.5 毫米 |
|
||||
|
||||
想要入手你的第一部 Linux 手机?请进一步浏览 [Pinephone 的购买官网][4] 吧。
|
||||
|
||||
#### 3、Pro 1 X – F(X)tec🥉
|
||||
|
||||
[**Pro 1 X** – F(X)tec][5] 是一款提供各种操作系统选择的智能手机,因此它是 Linux 手机榜单中十分令人激动的一项产品。
|
||||
|
||||
Pro 1 X **支持各种操作系统**,例如 LineageOS、安卓、Ubuntu Touch 等。此外,一个**内置的滑出式键盘**使它看起来更加独特且十分有吸引力。
|
||||
|
||||
Pro 1 X 由伦敦的 **F(x)tec** 公司开发。它是 Linux 手机市场上新出的产品,很有前景。然而,这个手机还没有上市,计划在 2022 年 12 月开始发货。因此,你可能需要等待几天,才能看到别人对这部手机的评价。
|
||||
|
||||
![Pro 1 X][6]
|
||||
|
||||
Pro 1 X 的主要特点和规格:
|
||||
|
||||
- 首款基于 Linux 的、有内置滑出式的 QUERTY 键盘的智能手机
|
||||
- 支持 Ubuntu touch 操作系统,并有安卓选项
|
||||
- 已解锁的启动程序
|
||||
- 拥有 3.5 毫米耳机插孔
|
||||
- 拥有 AMOLED 显示屏
|
||||
- 128 GB 存储/6 GB 内存:售价为 829 美元起
|
||||
- 256 GB 存储/8 GB 内存:售价为 899 美元起
|
||||
|
||||
| 规格 | 描述 |
|
||||
| :- | :- |
|
||||
| **CPU** | Snapdragon 662 Qualcomm |
|
||||
| **GPU** | Adreno 610 Qualcomm |
|
||||
| **内存** | 2 种型号:6GB 和 8GB LPDDR4 |
|
||||
| **存储** | 128 GB(可扩展至 2 TB) |
|
||||
| **屏幕** | 5.99英寸,弧形边缘,Corning® Gorilla® Glass 3(分辨率为 2160 x 1080 像素的 AMOLED 显示屏) |
|
||||
| **摄像头** | 1200 万像素 Sony IMX363(后置)摄像头和800万像素(前置)摄像头 |
|
||||
| **电池容量** | 3200 mAh |
|
||||
| **音频插孔** | 3.5 毫米 |
|
||||
|
||||
它的内置滑出式键盘是否吸引了你?去 [pro 1 x 的购买官网][5] 看看吧。
|
||||
|
||||
#### 4、Volla Phone
|
||||
|
||||
[Volla Phone][7] 可以同时运行**两个操作系统:Ubuntu Touch 和 VollaOS**。
|
||||
|
||||
VollaOS 是一个安卓操作系统的修改版,没有谷歌专有的部分,同时也很注重用户的隐私;Ubuntu Touch 是一个流行的 Linux 手机发行版。
|
||||
|
||||
Volla Phone 的主要特点和规格:
|
||||
|
||||
- 没有谷歌专有部分及其服务
|
||||
- 不依赖云计算
|
||||
- 加密的设备存储
|
||||
- 使用安卓操作系统的修改版:Volla OS
|
||||
- 支持的操作系统有 Ubuntu Touch,Manjaro,Sailfish OS
|
||||
- 拥有 USB C 充电口
|
||||
- 拥有 3.5 毫米耳机插孔
|
||||
- 可以用指纹解锁
|
||||
- 拥有离线地图
|
||||
|
||||
![Volla Phone][8]
|
||||
|
||||
| 规格 | 描述 |
|
||||
| :- | :- |
|
||||
| **CPU** | MediaTek Helio P23 |
|
||||
| **GPU** | ARM Mali-G71 MP2 |
|
||||
| **内存** | 4 GB DDR3 RAM |
|
||||
| **存储** | 64 GB,eMMC |
|
||||
| **屏幕** | 6.3 英寸,IPS,2340×1080 像素 |
|
||||
| **摄像头** | 1600万像素带闪光灯的(后置)摄像头和1600万像素(前置)摄像头 |
|
||||
| **电池容量** | 4700 mAh |
|
||||
| **USB 接口** | Type C 接口和 3.5 毫米音频插孔 |
|
||||
|
||||
这个手机看起来也很不错呢,不妨到 [Volla 的购买官网][9] 看看吧。
|
||||
|
||||
#### 5、Fairphone 4
|
||||
|
||||
[Fairphone 4][10] 是另一款具有模块化硬件的 Linux 智能手机。它支持 PostmarketOS 操作系统,并使用安卓操作系统的修改版本:FairPhone OS。这个手机的主要卖点是它的 <ruby>模块化<rt> modularity </rt></ruby>,你可以替换手机的任何模块:你可以毫不费力地更换它的电池🔋;此外,不仅仅是更换电池,你还可以简单地用螺丝刀来更换它的显示屏等部件。
|
||||
|
||||
![][14]
|
||||
|
||||
Fairphone 4 的规格:
|
||||
|
||||
| 规格 | 描述 |
|
||||
| :- | :- |
|
||||
| **CPU** | Octa-Core Kryo 570(八核) |
|
||||
| **内存** | 2 种型号:6GB 和 8GB |
|
||||
| **存储** | 2 种型号:128GB 和 256GB |
|
||||
| **GPU** | Adreno 619 |
|
||||
| **屏幕** | 6.3 英寸,全高清,IPS |
|
||||
| **摄像头** | 2 个 4800 万像素(后置)摄像头和 2500 万像素(前置)摄像头 |
|
||||
| **电池** | 锂离子电池(容量为 3905 mAh)|
|
||||
| **芯片组** | Qualcomm SM7225 Snapdragon 750G |
|
||||
|
||||
进一步可浏览 [FairPhone 的购买官网][11]。
|
||||
|
||||
#### 是否有支持 Linux 操作系统的主流安卓手机呢?
|
||||
|
||||
如果你不想购买上述现成的 Linux 手机,那么你也可以在**安卓手机**上使用 Linux 移动操作系统,因为安卓是基于 Linux 内核上修改的。因此,这些手机应该也能使用 Ubuntu Touch 或 PostmarketOS 操作系统。
|
||||
|
||||
- Google Pixel 3a/3a XL
|
||||
- Sony Xperia X (F5121 & F5122)
|
||||
- Google Nexus 5
|
||||
- OnePlus One
|
||||
- 支持 Ubuntu Touch OS 操作系统的 [完整列表][12]
|
||||
- Xiaomi Redmi 2
|
||||
- Xiaomi Mi Note 2
|
||||
- OnePlus GT
|
||||
- OnePlus 6
|
||||
- 支持 PostmarketOS 操作系统的 [完整列表][13]
|
||||
|
||||
### 结语
|
||||
|
||||
以上就是关于如今市场上最好的 Linux 手机的全部内容了。你可以从这些手机的官方网站上了解更多信息。因为手机的隐私保护在当下变得越来越重要了,我相信在未来会有越来越多的人使用 Linux 手机。
|
||||
|
||||
诚然,Linux 手机本身的功能及其操作系统比不上安卓和苹果 iOS 手机。但是,对于 Linux 手机来说,更重要的是它的标准的设立、全球购买的可行性、在这一新兴市场的低入门价格以及对 Linux 手机应用生态系统的大力投资。在 Linux 手机的生态系统中需要更简化的界面,没有简单的界面,Linux 手机将变得更加零散,就像台式机一样。Linux 手机的制造商还需要和自由及开源软件(FOSS)参与者一起合作,最终才能使 Linux 手机广受欢迎。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/best-linux-phones/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[chai001125](https://github.com/chai001125)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/12/Librem-5-image2.jpg
|
||||
[2]: https://puri.sm/products/librem-5/
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/12/Pinephone.jpg
|
||||
[4]: https://pine64.com/product-category/pinephone
|
||||
[5]: https://www.fxtec.com/pro1x
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2022/12/Pro-1-X.jpg
|
||||
[7]: https://volla.online/de/index.html
|
||||
[8]: https://www.debugpoint.com/wp-content/uploads/2022/12/Volla-Phone.jpg
|
||||
[9]: https://volla.online/de/shop/
|
||||
[10]: https://shop.fairphone.com/en/buy-fairphone-4
|
||||
[11]: https://shop.fairphone.com/
|
||||
[12]: https://devices.ubuntu-touch.io/
|
||||
[13]: https://wiki.postmarketos.org/wiki/Devices
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/22/145904l88upudto8u7y3ui.jpg
|
||||
[14]: https://img.linux.net.cn/data/attachment/album/202212/22/150220zuowaoguya3azajw.jpg
|
@ -0,0 +1,109 @@
|
||||
[#]: subject: "Linux Mint Upgrade Tool: Usage Guide"
|
||||
[#]: via: "https://www.debugpoint.com/mint-upgrade-tool/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15372-1.html"
|
||||
|
||||
Linux Mint 升级工具使用指南
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 以下是如何使用 Mint 升级工具升级到新的 Linux Mint 版本,即带有实际升级过程截图的 mintupgrade GUI。
|
||||
|
||||
如果你正在寻找最近发布的 **Linux Mint 21 Vanessa** 的**详细升级**步骤,请阅读本指南👉
|
||||
|
||||
> **[从 Linux Mint 20.3 升级到 21][1]**
|
||||
|
||||
### Linux Mint 升级工具
|
||||
|
||||
Linux Mint 团队 [宣布][2] 在几个月前,他们构建了一个新的程序来升级 Linux Mint 的主要版本。它被称为 “mintupgrade2”。现在开发已经完成,目前正在支持和计划升级到主要版本,例如 Linux Mint 20 到 21,而不是小版本升级。
|
||||
|
||||
尽管你可以使用标准的 `apt` 命令升级版本,但 Mint 团队认为重大版本升级是棘手的。新用户很难进行无缝升级,因为它涉及终端和一系列复杂的命令步骤。
|
||||
|
||||
此外,该图形界面是一个封装器,为 `mintupgrade` 程序带来了更多功能,它带来了一组系统前检查和带有一键修复的升级过程。
|
||||
|
||||
此外,`mintupgrade` 会进行基本检查,比如你是否连接到电源、系统是否是最新的、磁盘空间可用性等。
|
||||
|
||||
为了向你展示它的外观和工作情况,我们安装了一台 LMDE 4 测试机测试。
|
||||
|
||||
但在此之前,看一下它的功能集:
|
||||
|
||||
- 完全由 GUI 驱动的升级过程
|
||||
- 多语言支持
|
||||
- 升级前检查:系统备份、电源、磁盘空间、已删除包列表
|
||||
- 可配置
|
||||
- 提醒你有关先前版本中的孤儿包
|
||||
- 它为你提供了解决问题的选项
|
||||
|
||||
### 它如何运作
|
||||
|
||||
当我们通过命令 `mintupgrade` 运行 Mint 升级程序时,GUI 友好的欢迎屏幕为你提供了一个很好的起点并开始升级过程。然后,它开始自己进行一系列检查。
|
||||
|
||||
![开始升级过程][3]
|
||||
|
||||
除此之外,当它在你的系统中发现问题时,它会停止并为你提供足够的详细信息。单击“<ruby>修复<rt>Fix</rt></ruby>”后,它可以再次恢复该过程。
|
||||
|
||||
不止如此,如果由于网络或互联网或任何其他问题而中断,它可以恢复升级过程。
|
||||
|
||||
这个程序在我们的测试过程中在我们的测试系统中发现了以下错误,并且只需单击一下即可修复它们。
|
||||
|
||||
![Apt 缓存检查][4]
|
||||
|
||||
![Mint Upgrade 检测到系统快照不存在][5]
|
||||
|
||||
![检查孤立包][6]
|
||||
|
||||
![升级前状态][7]
|
||||
|
||||
![Mint Upgrade 可以检测需要降级的包][8]
|
||||
|
||||
最后,我们成功地将测试系统从 LMDE 4 升级到 LMDE 5。
|
||||
|
||||
![升级完成][9]
|
||||
|
||||
#### 如何获取此升级程序
|
||||
|
||||
使用以下命令可以轻松安装该程序。但是,如果你正在运行最新版本的 Linux Mint 21,它应该已经安装并尝试从终端运行 mintupgrade。
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
```
|
||||
sudo apt install mintupgrade
|
||||
```
|
||||
|
||||
### 结束语
|
||||
|
||||
最后,我认为它是 Linux Mint 团队最好的程序之一。正如你在上面看到的,它自己处理了许多错误。我所做的只是单击“修复”按钮。该程序足够智能,可以了解所有故障点并采取补救措施。
|
||||
|
||||
> **[GitHub 上的 mintupgrade 源码][10]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/mint-upgrade-tool/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/upgrade-linux-mint-21-from-20-3/
|
||||
[2]: https://www.debugpoint.com/2022/04/linux-mint-21-announcement/
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/04/Starting-the-upgrade-process.jpg
|
||||
[4]: https://www.debugpoint.com/wp-content/uploads/2022/04/Apt-Cache-check.jpg
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2022/04/Mint-Upgrade-detects-that-system-snapshots-not-present.jpg
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2022/04/Check-for-Orphan-Packages.jpg
|
||||
[7]: https://www.debugpoint.com/wp-content/uploads/2022/04/Status-before-upgrade.jpg
|
||||
[8]: https://www.debugpoint.com/wp-content/uploads/2022/04/Mint-Upgrade-can-detect-the-packages-require-downgrade.jpg
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/04/Upgrade-Complete.jpg
|
||||
[10]: https://github.com/linuxmint/mintupgrade
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/22/152601upz4gujhajauj5rj.jpg
|
@ -0,0 +1,101 @@
|
||||
[#]: subject: "Try this Linux web browser as your file manager"
|
||||
[#]: via: "https://opensource.com/article/22/12/linux-file-manager-konqueror"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15392-1.html"
|
||||
|
||||
试试这个 Linux 网络浏览器作为你的文件管理器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> KDE Plasma 桌面将 Konqueror 列为网络浏览器,但它也是一个功能性的 Linux 文件管理器。
|
||||
|
||||
Konqueror 是 KDE Plasma 桌面的文件管理器和 Web 浏览器。在许多方面,Konqueror 定义了“网络透明度”,因为它适用于个人桌面。使用 Konqueror,你可以像浏览本地文件一样轻松地浏览远程网络文件(包括互联网本身,它实际上只是通过花哨的镜头查看的远程文件的集合)。有时需要进行一些配置和设置,具体取决于你需要访问的文件共享类型。但最终,通过 Konqueror 实现了即时访问你有权查看的所有数据的目标,这是其他文件管理器无法实现的。在其巅峰时期,它开发的开源网络引擎(KHTML) 被苹果和谷歌采用,并作为现代网络浏览和 Electron 应用开发的核心库延续至今。
|
||||
|
||||
今天,KDE Plasma 桌面将 Konqueror 作为网络浏览器。文件管理功能已正式转移到 [Dolphin][1],但 Konqueror 仍然能够完成这项工作。要获得完整和经典的 Konqueror 体验,你应该尝试 Plasma 桌面 3.x 的复刻 [TDE][2],但在本文中,我在 KDE Plasma 桌面版本 5 中使用 Konqueror。
|
||||
|
||||
### 安装 Konqueror
|
||||
|
||||
如果你已经在运行 KDE Plasma 桌面,你可能已经安装了 Konqueror。如果没有,你可以从发行版软件仓库中安装它。在 Fedora、CentOS、Mageia、OpenMandriva 和类似软件上:
|
||||
|
||||
```
|
||||
$ sudo dnf install -y konqueror konqueror-plugins
|
||||
```
|
||||
|
||||
在 Debian、Linux Mint、Elementary 和类似软件上:
|
||||
|
||||
```
|
||||
$ sudo apt install -y konqueror konqueror-plugins
|
||||
```
|
||||
|
||||
![Image of Konqueror's file manager.][3]
|
||||
|
||||
### 将 Konqueror 配置为文件管理器
|
||||
|
||||
Konqueror 最方便的功能是它除了是一个文件管理器之外,还是一个网络浏览器。至少,这在理论上是它最方便的功能。如果你没有将 Konqueror 用作网络浏览器,那么你可能不希望每个文件管理器窗口顶部都有 URL 区域或搜索引擎区域。
|
||||
|
||||
与大多数 KDE 应用一样,Konqueror 是高度可配置的。你可以重新定位并添加和删除工具栏、添加或删除按钮等。
|
||||
|
||||
要调整显示的工具栏,请启动 Konqueror 并转到 “<ruby>设置<rt>Settings</rt></ruby>” 菜单并选择 “<ruby>显示的工具栏<rt>Toolbars Shown</rt></ruby>”。主工具栏可能是你真正需要的文件管理工具栏。它是带有导航按钮的工具栏。但是,你甚至可能不需要它,只要你乐于使用键盘快捷键或使用 “Go” 菜单进行导航即可。
|
||||
|
||||
Konqueror 中的键盘导航与 Dolphin 中的相同:
|
||||
|
||||
- `Alt + ←`:后退一步
|
||||
- `Alt + ↑`:移动到父目录
|
||||
- `Alt + Home`:转到主目录
|
||||
|
||||
### 侧边栏
|
||||
|
||||
要获得包含常用文件夹列表的侧边栏,请按 `F9` 或从 “<ruby>设置<rt>Settings</rt></ruby>” 菜单中选择 “<ruby>显示边栏<rt>Show Sidebar</rt></ruby>”。这会在 Konqueror 窗口的左侧添加一个按钮栏。单击 “Home” 图标以显示你的主目录的文件树。
|
||||
|
||||
![Image of Konqueror with a sidebar.][4]
|
||||
|
||||
正如按钮栏所暗示的那样,此侧边栏可用于多种用途。你可以显示书签位置,你最近访问过的位置的历史,远程文件系统等。
|
||||
|
||||
### 应用
|
||||
|
||||
有些人习惯于应用菜单。它高效快捷,并且始终在同一个地方。其他人更喜欢从终端启动应用。
|
||||
|
||||
不过,还有另一种查看应用启动器的方法。Konqueror 的 “Go” 菜单允许你转到名为 “<ruby>应用程序<rt>Applications</rt></ruby>” 的元位置,它按类别列出了应用程序启动器,就像文件管理器中的文件一样。
|
||||
|
||||
![Image of applications in Konqueror.][5]
|
||||
|
||||
你也可以在 Dolphin 中看到这个,方法是在位置区域中手动输入 `applications:`,此外,Konqueror 提供了一个菜单选项,可以直接进入该位置。
|
||||
|
||||
### 网络文件夹
|
||||
|
||||
类似地,Konqueror 还提供了一个菜单选择进入网络文件夹。其中最好的网络文件夹是“互联网”,但“网络文件夹”是 HTTP 以外的网络协议的元位置。大多数远程位置需要一些设置,因为它们通常需要身份验证才能访问。它们中的大多数都可以通过 “<ruby>系统设置<rt>System Settings</rt></ruby>” 进行配置,包括可通过蓝牙、SMB 或 CIFS、MTP 设备、Fish(通过 SSH 的文件系统)访问的文件系统,甚至是 Google Drive。
|
||||
|
||||
### 拆分视图
|
||||
|
||||
你可以将 Konqueror 窗口拆分为多个窗格,这样你就可以同时查看两个文件夹而无需打开两个窗口。有两种拆分选项:垂直拆分,一个窗格在左侧,另一个窗格在右侧;或者水平拆分,一个窗格在另一个窗格之上。
|
||||
|
||||
要分割 Konqueror 窗口,进入 “<ruby>窗口<rt>Window</rt></ruby>” 菜单,选择 “<ruby>左/右分割视图<rt>Split View Left/Right</rt></ruby>” 或 “<ruby>上/下分割视图<rt>Spit View Top/Bottom</rt></ruby>”。每个窗格都是独立的,所以你可以在一个窗格中浏览,然后把文件从一个窗格拖到另一个窗格。
|
||||
|
||||
### 征服你的文件系统
|
||||
|
||||
Konqueror 不 _仅仅_ 是一个文件管理器,我认为 Plasma 桌面的开发者并不期望你把它作为你的主要文件管理器。在 “<ruby>文件<rt>File</rt></ruby>” 菜单中甚至有一个选项可以在 **Dolphin** 中打开一个位置,这表明 Konqueror 是一个带有文件管理器组件的网络浏览器。但是,当你需要时,这个文件管理器组件是一个不错的功能。如果你不喜欢 Dolphin 提供的所有功能,Konqueror 可能是一个合适的替代品。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/linux-file-manager-konqueror
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/22/12/linux-file-manager-dolphin
|
||||
[2]: https://opensource.com/article/19/12/linux-trinity-desktop-environment-tde
|
||||
[3]: https://opensource.com/sites/default/files/2022-10/konqueror-filemanager.png
|
||||
[4]: https://opensource.com/sites/default/files/2022-10/konqueror-sidebar.png
|
||||
[5]: https://opensource.com/sites/default/files/2022-10/konqueror-applications.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/29/141332adtz8mb8m8h8z3d4.jpg
|
@ -0,0 +1,243 @@
|
||||
[#]: subject: "Improve your documentation with JavaScript"
|
||||
[#]: via: "https://opensource.com/article/22/12/dynamic-documentation-javascript"
|
||||
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "duoluoxiaosheng"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15375-1.html"
|
||||
|
||||
使用 JavaScript 增强你的文档
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 让你的开源项目文档充满活力,从而吸引各种经验水平的用户。
|
||||
|
||||
开源软件项目通常拥有非常多样化的用户人群。有些用户非常擅长使用该系统,并且只需要很少的文档。对于这些实力派用户,文档只需要提供必要的提示,并且可以包含更多的技术信息,比如说在 Shell 中运行的命令行。有些用户可能只是初学者。这些用户需要更多的帮助来设置系统并学习如何使用它。
|
||||
|
||||
写一个同时适合这两个用户群体的文档是令人生畏的。网站文档需要在 “提供详细的技术信息” 和 “提供更多的概述和指导” 之间寻求一个平衡。这是一个很难找到的平衡。如果你的文档不能同时满足这两个用户人群,那么考虑一下另外一个选择 —— 动态文档。
|
||||
|
||||
探索在网页中添加一点 [JavaScript][1] 使用户可以选择自己想看的内容。
|
||||
|
||||
### 构建你的内容
|
||||
|
||||
你可以把例程添加的你的文档中需要同时满足 <ruby>专家<rt>expert</rt></ruby> 和 <ruby>初学者<rt>novice</rt></ruby> 的地方。在这个例程中,我们可以使用一个虚构的名为 AwesmeProject 的音乐播放器。
|
||||
|
||||
你可以用 HTML 编写一个简短的安装文档,通过 HTML 的 <ruby>类<rt>class</rt></ruby> 功能同时为专家和初学者提供操作指南。
|
||||
|
||||
例如,你可以用下面的代码来为专家定义一个段落:
|
||||
|
||||
```
|
||||
<p class="expert reader">
|
||||
```
|
||||
|
||||
这同时指派了 “专家类” 和 “读者类”。你可以用下面的代码来为初学者创建一个相同的段落。
|
||||
|
||||
```
|
||||
<p class="novice reader">
|
||||
```
|
||||
|
||||
完整的 HTML 文件同时包含初学者的段落和专家的段落。
|
||||
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
|
||||
<title>How to install the software</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>How to install the software</h1>
|
||||
|
||||
<p>Thanks for installing AwesomeProject! With AwesomeProject,
|
||||
you can manage your music collection like a wizard.</p>
|
||||
|
||||
<p>But first, we need to install it:</p>
|
||||
|
||||
<p class="expert reader">You can install AwesomeProject from
|
||||
source. Download the tar file, extract it, then run:
|
||||
<code>./configure ; make ; make install</code></p>
|
||||
|
||||
<p class="novice reader">AwesomeProject is available in
|
||||
most Linux distributions. Check your graphical package manager and search for AwesomeProject to install it.</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
```
|
||||
|
||||
例子中的 HTML 文档没有与之关联的样式表,所以浏览器中会显示所有的段落。
|
||||
|
||||
![Image of html in black text.][2]
|
||||
|
||||
我们可在文档中添加一些简单的样式来为 <ruby>读者<rt>reader</rt></ruby>、<ruby>专家<rt>expert</rt></ruby> 或者 <ruby>初学者<rt>novice</rt></ruby> 突出任何元素。为了使不同的文本更容易区分,让我们把读者类的背景颜色设置成米白色,专家类的字体颜色设置为深红色,初学者的字体颜色则设置为深蓝色。
|
||||
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
|
||||
<title>How to install the software</title>
|
||||
|
||||
<style>
|
||||
|
||||
.reader {
|
||||
background-color: ghostwhite;
|
||||
}
|
||||
|
||||
.expert {
|
||||
color: darkred;
|
||||
}
|
||||
|
||||
.novice {
|
||||
color: darkblue;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>How to install the software</h1>
|
||||
```
|
||||
|
||||
当你在浏览器中查看这个网页时,这些样式有助于突出这两个段落。安装指导的所有段落都有一个米白色背景,因为他们都有 <ruby>读者<rt>reader</rt></ruby> 这个类。第一个段落的字体是深红色的,这是由 <ruby>专家<rt>expert</rt></ruby> 这个类定义的。第二个段落的字体是深蓝色的,则是由 <ruby>初学者<rt>novice</rt></ruby> 这个类定义的。
|
||||
|
||||
![Image of html in red and black text.][3]
|
||||
|
||||
### 添加 JavaScript 控件
|
||||
|
||||
这些类的应用,使你可以添加一些简单的 JavaScript 函数,只显示其中一个内容块。一个方法是,首先给所有的读者类元素设置 `display:none` 。这会将内容隐藏,使其不会在页面上显示。然后,用函数将你想显示的类元素设置为 `display:block` :
|
||||
|
||||
```
|
||||
<script>
|
||||
function readerview(audience) {
|
||||
var list, item;
|
||||
// hide all class="reader"
|
||||
list = document.getElementsByClassName("reader");
|
||||
for (item = 0; item < list.length; item++) {
|
||||
list[item].style.display = "none";
|
||||
}
|
||||
// show all class=audience
|
||||
list = document.getElementsByClassName(audience);
|
||||
for (item = 0; item < list.length; item++) {
|
||||
list[item].style.display = "block";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
要在 HTML 文档中使用这个 JavaScript,你可以吧这个功能附加到一个按钮上。由于 `readerview` 函数需要一个<ruby>听众<rt>audience</rt></ruby>(这应该是相对那个虚拟音乐播放器来说的)作为参数,你可以使用你想查看的听众类别来调用这个函数,可以是<ruby>读者<rt>reader</rt></ruby>,<ruby>专家<rt>expert</rt></ruby> 或者 <ruby>初学者<rt>novice</rt></ruby> 。
|
||||
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>How to install the software</title>
|
||||
<style>
|
||||
.reader {
|
||||
background-color: ghostwhite;
|
||||
}
|
||||
|
||||
.expert {
|
||||
color: darkred;
|
||||
}
|
||||
|
||||
.novice {
|
||||
color: darkblue;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script>
|
||||
function readerview(audience) {
|
||||
var list, item;
|
||||
|
||||
// hide all class="reader"
|
||||
list = document.getElementsByClassName("reader");
|
||||
|
||||
for (item = 0; item < list.length; item++) {
|
||||
list[item].style.display = "none";
|
||||
}
|
||||
|
||||
// show all class=audience
|
||||
list = document.getElementsByClassName(audience);
|
||||
|
||||
for (item = 0; item < list.length; item++) {
|
||||
list[item].style.display = "block";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<h1>How to install the software</h1>
|
||||
|
||||
<nav>
|
||||
|
||||
<button onclick="readerview('novice')">view novice text</button>
|
||||
|
||||
<button onclick="readerview('expert')">view expert text</button>
|
||||
|
||||
</nav>
|
||||
|
||||
<p>Thanks for installing AwesomeProject! With AwesomeProject,
|
||||
you can manage your music collection like a wizard.</p>
|
||||
|
||||
<p>But first, we need to install it:</p>
|
||||
<p class="expert reader">You can install AwesomeProject from
|
||||
source. Download the tar file, extract it, then run
|
||||
<code>./configure ; make ; make install</code></p>
|
||||
|
||||
<p class="novice reader">AwesomeProject is available in
|
||||
most Linux distributions. Check your graphical package
|
||||
manager and search for AwesomeProject to install it.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
有了这些设置,用户可以在网页上选择他们想看的文本。
|
||||
|
||||
![Image of window that allows you to select between novice and expert text.][4]
|
||||
|
||||
点击任何一个按钮都将只显示用户想要阅读的文本。例如,如果你点击了 “<ruby>阅读初学者内容<rt>view novice text</rt></ruby>” 按钮,你就只会看到蓝色段落。
|
||||
|
||||
![Image showing blue text when you press the novice button.][5]
|
||||
|
||||
点击 “<ruby>阅读专家内容<rt>view expert text</rt></ruby>” 按钮,就会隐藏初学者文本,只显示红色的专家文本。
|
||||
|
||||
![Image of red text after the expert button is clicked.][6]
|
||||
|
||||
### 将此扩展到你的文档
|
||||
|
||||
如果你的项目需要你为不同的听众编写多个操作文档,你可以考虑使用这种方法,一次发布,多次阅读。为所有的用户编写一个文档,是每个人都能很容易的发现和分享你项目的文档。而你也不必同时维护尽在细节上有所不同的多个文档。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/dynamic-documentation-javascript
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[duoluoxiaosheng](https://github.com/duoluoxiaosehng)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/downloads/learn-javascript
|
||||
[2]: https://opensource.com/sites/default/files/2022-12/publishonec.textblack.png
|
||||
[3]: https://opensource.com/sites/default/files/2022-12/publishone.red_.blue_.png
|
||||
[4]: https://opensource.com/sites/default/files/2022-12/publishone.novicexpert.png
|
||||
[5]: https://opensource.com/sites/default/files/2022-12/publishone.blue_.png
|
||||
[6]: https://opensource.com/sites/default/files/2022-12/publishone.red_.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/23/100615quu385qf83bu3p35.jpg
|
@ -0,0 +1,85 @@
|
||||
[#]: subject: "Pulsar: A Community-Led Open Source Code Editor to Continue the Legacy of Atom"
|
||||
[#]: via: "https://news.itsfoss.com/pulsar-editor/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15356-1.html"
|
||||
|
||||
Pulsar:一个由社区主导的以继承 Atom 的开源代码编辑器
|
||||
======
|
||||
|
||||
> Pulsar 的目标是成为 Atom 的替代品,随着其开发的进一步深入,将挑战 Visual Studio Code。
|
||||
|
||||
![Pulsar:一个由社区领导的开源代码编辑器,以延续 Atom 遗志][1]
|
||||
|
||||
微软决定杀死 Atom 文本编辑器,以支持 Visual Studio Code,这并不奇怪。
|
||||
|
||||
如果你不知道,你可以看一下我们以前的报道:
|
||||
|
||||
> [为了支持微软 VS Code,微软的 GitHub 正在扼杀 GitHub 的 Atom 编辑器][5]
|
||||
|
||||
虽然你可能有了更好的选择,但曾经流行的 Atom 是一个令人印象深刻的工具。
|
||||
|
||||
**它有一个可用的社区构建版**;然而,还有一个新的版本(**Pulsar**),旨在实现与原始 Atom 对等的功能,并引入现代功能和更新架构。
|
||||
|
||||
根据它的文档,原来开发 Atom 社区版的团队现在参与创建了 Pulsar。他们之所以做一个独立的复刻版本,是因为项目的目标不同。
|
||||
|
||||
**Pulsar** 希望将一切现代化,以成为 Atom 的继承者。
|
||||
|
||||
> 💡 Pulsar 是一个新项目,作为 Atom 的新复刻,有开发/测试版本可供测试。
|
||||
|
||||
### Pulsar 编辑器看起来怎么样?
|
||||
|
||||
![Pulsar 编辑器][2]
|
||||
|
||||
当然,用户界面也是大同小异。考虑到 Pulsar 还没有一个稳定的版本,看起来有时会显得有些混淆。
|
||||
|
||||
然而,文档、软件包以及从 Git 仓库安装软件包的能力等基本要素看起来都已具备。
|
||||
|
||||
根据官方网站的介绍,Pulsar 的主要功能亮点包括:
|
||||
|
||||
- 跨平台支持(Linux、macOS 和 Windows)
|
||||
- 内置的软件包管理器
|
||||
- 智能自动补全
|
||||
- 文件系统浏览器
|
||||
- 多窗格的用户界面
|
||||
- 查找和替换功能
|
||||
|
||||
在写这篇文章时,Pulsar 还不能自动更新。你可以通过官方网站安装较新的版本。
|
||||
|
||||
![Pulsar 编辑器设置][3]
|
||||
|
||||
你可以自定义编辑器、改变键盘绑定、管理软件包、应用主题,并通过所有可用选项配置你的体验。
|
||||
|
||||
到目前为止,要说 Pulsar 是否会比 Atom 社区版更好还为时过早。然而,这是我们可以关注的事情。
|
||||
|
||||
### 下载并试用 Pulsar
|
||||
|
||||
如前所述,Pulsar 正处于早期开发阶段。因此,你可以找到用于 Linux 发行版的二进制文件和 AppImage 文件,你可以在任何发行版上试用。
|
||||
|
||||
在我的测试中,它 **在 Linux Mint 不能正常运行**,但在 **Ubuntu 22.04 LTS** 上工作良好。
|
||||
|
||||
你可以到它的 [官方下载页面][4] 去获取你的系统所需的软件包,并进行测试。
|
||||
|
||||
> **[Pulsar 编辑器][4]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/pulsar-editor/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/pulsar-hackable-text-editor.png
|
||||
[2]: https://news.itsfoss.com/content/images/2022/12/pulsar-editor.png
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/pulsar-editor-settings.png
|
||||
[4]: https://pulsar-edit.dev/download.html#releases
|
||||
[5]: https://news.itsfoss.com/atom-being-discontinued/
|
@ -0,0 +1,138 @@
|
||||
[#]: subject: "XFCE 4.18 Release Looks Impressive!"
|
||||
[#]: via: "https://news.itsfoss.com/xfce-4-18-release/"
|
||||
[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15355-1.html"
|
||||
|
||||
Xfce 4.18 版本发布:令人印象深刻
|
||||
======
|
||||
|
||||
> Xfce 4.18 已发布,添加了一些有趣的功能和细微的变化。
|
||||
|
||||
![Xfce 4.18 版本看起来令人印象深刻!][1]
|
||||
|
||||
Xfce 是目前最好的桌面环境之一。它因其简单性而受欢迎,是一个轻量级的选择。
|
||||
|
||||
不像其他桌面环境,你不会看到 Xfce 定期的添加功能。所以,等待升级总是令人兴奋的。
|
||||
|
||||
Xfce 4.18 是最新的版本,它增加了一些有用的功能和其他技术改进。让我重点介绍一下。
|
||||
|
||||
### Xfce 4.18 的新变化
|
||||
|
||||
![Xfce 4.18 有新的默认壁纸][2]
|
||||
|
||||
虽然这不是一个完整的变化列表,但其中一些比较明显的变化包括:
|
||||
|
||||
- 文件管理器的改进。
|
||||
- 桌面和面板的变化。
|
||||
- 更多的设置。
|
||||
- 新的壁纸。
|
||||
|
||||
#### 文件管理器的改进
|
||||
|
||||
![Xfce 4.18 文件管理器的分割视图][3]
|
||||
|
||||
Xfce 的默认文件管理器 Thunar 在这个版本中得到了相当多的改变。作为许多 Linux 用户的最爱,Thunar 有一个干净直观的用户界面,使其对不同技能水平的人都很简单易用。
|
||||
|
||||
在这个版本中,这个有用的工具获得了几个新功能。比如说:
|
||||
|
||||
- 工具条上新的搜索图标使用户能够快速搜索文件和文件夹。
|
||||
- 你现在可以添加一个分割视图。
|
||||
- 启用独立的图像预览。
|
||||
|
||||
还有一个有趣的新增功能,可以帮助你**高亮文件**,以便快速发现它们。你可以设置一个前景和背景颜色,如果你不想要这个功能,也可以重置。
|
||||
|
||||
![xfce 4.18 文件高亮][4]
|
||||
|
||||
你可以从文件的属性选项中访问这个功能。
|
||||
|
||||
Thunar 文件管理器还增加了一些其他功能,包括:
|
||||
|
||||
- 一个用于定制键盘快捷键的新标签。
|
||||
- 新的书签菜单。
|
||||
|
||||
#### 精致的设置和桌面变化
|
||||
|
||||
Xfce 桌面的大部分都保持不变。你不应该期待开箱后有不同的用户体验。
|
||||
|
||||
虽然没有重大的视觉改造,但有细微的完善和功能改进。
|
||||
|
||||
例如,你可以发现日历小部件的新能力。显示设置提供了更多选项,即使你没有连接多个显示器。
|
||||
|
||||
Xfce 面板也有一些变化。
|
||||
|
||||
![Xfce 4.18 面板设置][5]
|
||||
|
||||
这些变化包括用像素而不是百分比来调整高度,以及一个新的 “保持面板在窗口上方” 选项。这使得窗口可以在面板下面延伸,而不是在顶部被切断。
|
||||
|
||||
更不用说,时钟小程序现在可以自定义其字体类、字体大小和布局。
|
||||
|
||||
![Xfce 4.18 时钟][6]
|
||||
|
||||
#### 新壁纸
|
||||
|
||||
当然,我们也得到了一些新的壁纸;你已经在本文的开头看到了新的默认壁纸。
|
||||
|
||||
![Xfce 4.18 新壁纸集][7]
|
||||
|
||||
如果你很好奇,你可以看看其他为 [壁纸竞赛][8] 提交的各种作品。也许你会发现别人不喜欢的东西。
|
||||
|
||||
![Xfce 4.18 新壁纸集锦][9]
|
||||
|
||||
这些是计划添加到背景集的其它候选作品。
|
||||
|
||||
#### 其他变化
|
||||
|
||||
除了之前提到的那些,这个版本还引入了一些其他变化。
|
||||
|
||||
- 初步的 Wayland 支持,它允许 Xfce 在 Wayland 显示服务器上运行。
|
||||
- GTK4 的更新,提供了更好的性能和稳定性。
|
||||
- 一些核心应用程序的小更新,包括对 Xfdesktop、Xfwm4 和 Xfce4-panel 应用程序的改进。
|
||||
|
||||
关于完整的变化列表,你可以参考 [官方博客文章][10]。
|
||||
|
||||
### 获得 Xfce 4.18
|
||||
|
||||
你可以通过软件库为滚动发布的发行版(如 Arch Linux)安装它。对于其他发行版,如果你不想自己做实验,你可能必须等待官方的更新。
|
||||
|
||||
要想快速尝试,你可以安装 Xubuntu 23.04 日常构建版来获得这些功能。
|
||||
|
||||
如果你使用的是其他为了稳定起见而不提供快速桌面环境更新的 Linux 发行版,如果你知道自己在做什么,你可以尝试手动安装。
|
||||
|
||||
> **[下载 Xfce 4.18][11]**
|
||||
|
||||
### 总结
|
||||
|
||||
Xfce 4.18 是 Xfce 桌面环境的一次重大更新,有许多新的功能和改进。
|
||||
|
||||
Thunar 文件管理器的更新尤其值得注意,因为它们为用户提供了更多的控制和定制选项。初步的 Wayland 支持和 GTK4 更新将提高性能和稳定性。
|
||||
|
||||
总的来说,Xfce 4.18是一个受欢迎的更新,将改善 Xfce 用户的用户体验。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/xfce-4-18-release/
|
||||
|
||||
作者:[Jacob Crume][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/jacob/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/xfce-4-18-release.png
|
||||
[2]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-hero.jpg
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-file-manager.jpg
|
||||
[4]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-file-highlight.jpg
|
||||
[5]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-panel.jpg
|
||||
[6]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-clock-settings.jpg
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-new-wallaper.jpg
|
||||
[8]: https://gitlab.xfce.org/artwork/public/-/issues/1#note_58300
|
||||
[9]: https://news.itsfoss.com/content/images/2022/12/xfce-4-18-new-wallpapers.jpg
|
||||
[10]: https://alexxcons.github.io/blogpost_8.html
|
||||
[11]: https://www.xfce.org/
|
@ -0,0 +1,108 @@
|
||||
[#]: subject: "Harmonoid: A Beautiful Cross-Platform Music Player With Essential Features"
|
||||
[#]: via: "https://itsfoss.com/harmonoid/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15386-1.html"
|
||||
|
||||
Harmonoid:基本够用的漂亮的跨平台音乐播放器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
幸运的是,[Linux 的优秀开源音乐播放器][1] 并不缺乏。过去我们已经介绍了多种选择。
|
||||
|
||||
在这里,我重点介绍一款免费使用(但不是自由开源软件),可用于多种平台(包括 Linux、Windows 和 Android)的音乐播放器。
|
||||
|
||||
### Harmonoid:Material Design 的直观用户体验
|
||||
|
||||
![harmonoid player][2]
|
||||
|
||||
Harmonoid 是用 Dart 语言编写的。它利用 [libmpv][3] 和 [mpv][4] 在桌面平台上实现媒体播放功能。
|
||||
|
||||
它提供了一个优秀的用户界面。并且不使用 electron.js。所以,如果你讨厌 Electron,你可以试试这个。
|
||||
|
||||
通常,你会在 Android 上看到应用具有 Material Design UI。如果你不知道,Material 是谷歌的开源设计系统。
|
||||
|
||||
![harmonoid player info][5]
|
||||
|
||||
没有多少创作者将它用于桌面应用。作为一种改变,Harmonoid 具有 Material Design 用户体验,可以同时做到快速和直观。
|
||||
|
||||
这让 Harmonoid 为 Linux 用户呈现了独特的用户体验。动画感觉流畅且易于导航,并提供大量有价值的功能来帮助管理你的音乐库。
|
||||
|
||||
![harmonoid url][6]
|
||||
|
||||
如果你想要一个有良好 UI 和功能集的音乐播放器,我建议你尝试一下 Harmonoid。
|
||||
|
||||
### Harmonoid 的特点
|
||||
|
||||
![harmonoid player options][7]
|
||||
|
||||
[Harmonoid][8] 可能看起来像一个简单的音乐播放器,但它包含了一些最有价值的功能。他们包括:
|
||||
|
||||
- 跟唱功能,你可以找到歌词,或者你可以手动添加它们
|
||||
- 编辑歌曲详细信息,包括艺术家、年份、流派、曲目编号、专辑和标题
|
||||
- 轻松分类和排序你的音乐列表
|
||||
- 一个快速搜索功能来找到你要找的东西
|
||||
- 缓存元数据以在你每次加载时提供快速体验
|
||||
- 与 Windows 和 Linux 的良好集成支持
|
||||
- 支持在 Discord 中展示,可以显示你的音乐以及插图和播放按钮
|
||||
- 调整音乐的速度、音量和音高
|
||||
- 原始元数据读取器可读取你库中任何文件或歌曲的标签
|
||||
- 播放由 MPV 提供
|
||||
- .LRC 文件兼容性
|
||||
- 支持在线 URL(YouTube)和广播流
|
||||
- 跨平台
|
||||
- 多位艺术家支持
|
||||
- 深色/浅色模式
|
||||
|
||||
除了这些之外,还有一些小功能可以发挥很大的作用,例如**无缝播放和上下文菜单集成,并且它通常是一个轻量级应用**。
|
||||
|
||||
Harmonoid 应该非常适合想要同时播放音乐或整理收藏的用户。我会说它提供了两全其美的方法。
|
||||
|
||||
![harmonoid settings][9]
|
||||
|
||||
### 在 Linux 上安装 Harmonoid
|
||||
|
||||
你可以从其 [下载页面][10] 获取 .deb/.rpm 包并将其安装在基于 Ubuntu 的发行版或 Fedora 上。
|
||||
|
||||
此外,你需要使用以下命令安装 mpv 和 libmpv(对于 Ubuntu):
|
||||
|
||||
```
|
||||
sudo apt install mpv lipmpv-dev
|
||||
```
|
||||
|
||||
确保安装这些软件包可以让你用 Harmonoid 处理所有类型的文件进行播放。
|
||||
|
||||
你还可以在 [AUR][11] 上找到基于 Arch 的发行版的 Harmonoid。要探索有关该播放器的更多信息,请访问其 [GitHub 页面][12]和[官方网站][8]。
|
||||
|
||||
你是否尝试过 Harmonoid 在你的 Linux 系统上播放和整理音乐? 你最喜欢的 Linux 音乐播放器是什么? 在下面的评论中让我知道你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/harmonoid/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/best-music-players-linux/
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/12/harmonoid-player.png
|
||||
[3]: https://github.com/mpv-player/mpv/tree/master/libmpv
|
||||
[4]: https://mpv.io
|
||||
[5]: https://itsfoss.com/content/images/wordpress/2022/12/harmonoid-player-info.png
|
||||
[6]: https://itsfoss.com/content/images/wordpress/2022/12/harmonoid-url.png
|
||||
[7]: https://itsfoss.com/content/images/wordpress/2022/12/harmonoid-player-options.png
|
||||
[8]: https://harmonoid.com
|
||||
[9]: https://itsfoss.com/content/images/wordpress/2022/12/harmonoid-settings.png
|
||||
[10]: https://harmonoid.com/downloads
|
||||
[11]: https://aur.archlinux.org/packages/harmonoid-bin
|
||||
[12]: https://github.com/harmonoid/harmonoid
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/27/173656kmq05d54llttls55.jpg
|
@ -0,0 +1,88 @@
|
||||
[#]: subject: "Better Late Than Never! GNOME's File Picker Adds Thumbnail View After 18 Years"
|
||||
[#]: via: "https://news.itsfoss.com/gnome-file-picker/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15380-1.html"
|
||||
|
||||
虽迟但到!GNOME 的文件选取器在 18 年后增加了缩略图视图
|
||||
======
|
||||
|
||||
> 一个长期缺位、也是急需的功能请求,终于通过了!
|
||||
|
||||
![][1]
|
||||
|
||||
如今,程序的用户界面是非常重要的;即使是最简单的交互也能决定用户的体验。
|
||||
|
||||
GNOME 的文件选取器在查看文件时缺乏适当的缩略图预览,而是依赖于一个普通的列表视图。这对许多人来说可能是不直观的。
|
||||
|
||||
多年来,缺乏这一功能也成了许多段子和讨论的主题。
|
||||
|
||||
但是现在,在最初的 [功能请求][2] 提出 18 年之后,GNOME 终于可以支持一个合适的缩略图视图了。
|
||||
|
||||
让我们来看看这个即将到来的对 GNOME 文件选取器的改变。
|
||||
|
||||
### 该功能将随着 GNOME 44 到来
|
||||
|
||||
![GNOME 文件缩略图视图][3]
|
||||
|
||||
正如这个由 GNOME 开发者 [Matthias Clasen][4] 提供的早期构建截图所展示的。GNOME 上的文件选取器将具有一个缩略图视图。
|
||||
|
||||
这就是它在 GNOME 43 上的样子:
|
||||
|
||||
![GNOME 43 的文件选取器][5]
|
||||
|
||||
**如何访问它?** 在 GNOME 上文件选取器的网格视图里,可以显示文件和文件夹的缩略图预览。
|
||||
|
||||
现在将很容易区分文件管理器中的项目;不再需要打开一个文件来查看它包含的内容了!
|
||||
|
||||
![GNOME 文件缩略图视图选取器][6]
|
||||
|
||||
当这个功能到来时,你可以通过点击右上方的新视图切换按钮来启用它。
|
||||
|
||||
**有什么变化?** 对于一个简单的功能添加来说,18 年是一个很长的时间。众多的技术原因使其实施成为一项艰巨的任务。
|
||||
|
||||
但我很高兴,它终于来了。😃
|
||||
|
||||
使之成为可能的原因之一是最近在 GTK 代码库中进行的废弃和现代化工作。
|
||||
|
||||
> 💡 GTK 是 GNOME 的一切的核心的工具箱。
|
||||
|
||||
而且,这些变化导致 [GtkListView][7] 和 [GtkGridView][8] 使用相同的数据模型来实现这个功能。
|
||||
|
||||
**预期何时?** 这个历史上的 [合并请求][9] 已经被接受,并为其引入 GNOME 铺平道路。
|
||||
|
||||
你可以期待它在 2023 年的某个时候与 GNOME 44 一起到来。
|
||||
|
||||
我很期待!😁
|
||||
|
||||
我们将把它作为 GNOME 44 功能提供的一部分来报道。所以,请继续关注我们的报道吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/gnome-file-picker/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/gtk-file-chooser-gets-thumbnail-preview-support.png
|
||||
[2]: https://bugzilla.gnome.org/show_bug.cgi?id=141154
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/GNOME_File_Thumbnail.png
|
||||
[4]: https://twitter.com/matthias_clasen
|
||||
[5]: https://news.itsfoss.com/content/images/2022/12/file-picker-now.png
|
||||
[6]: https://news.itsfoss.com/content/images/2022/12/GNOME_File_Thumbnail-2.png
|
||||
[7]: https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gtk/gtklistview.c
|
||||
[8]: https://gitlab.gnome.org/GNOME/gtk/-/blob/main/gtk/gtkgridview.c
|
||||
[9]: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/5163
|
||||
[10]: https://mastodon.social/@itsfoss
|
||||
[11]: https://twitter.com/itsfoss2
|
||||
[12]: https://notion.grsm.io/front-static/logo-ios.png
|
||||
[13]: https://www.notion.so/front-static/meta/default.png
|
@ -0,0 +1,113 @@
|
||||
[#]: subject: "Try this Python-based file manager on Linux"
|
||||
[#]: via: "https://opensource.com/article/22/12/linux-file-manager-dragonfly-navigator"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15396-1.html"
|
||||
|
||||
在 Linux 上试试这个基于 Python 的文件管理器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Dragonfly Navigator 是用 Python 和 Qt 编写的通用文件管理器。
|
||||
|
||||
Dragonfly Navigator 是用 Python 和 Qt 编写的通用文件管理器。它易于安装和使用,并且是 Python 可以做什么的一个很好的例子。
|
||||
|
||||
Python 是一种流行的语言有几个原因,但我认为它的主要优势之一是它对初级程序员和有经验的编码人员同样有用。你可以从一门语言中获得一些令人兴奋的东西,从 [绘制基本几何形状][1] 到 [抓取网页][2] 再到编写僵尸启示录 [游戏][3],或者编写你每天都可以使用的桌面应用。这就是 Dragonfly Navigator:一个人人都可以使用的桌面程序。
|
||||
|
||||
### 安装 Dragonfly Navigator
|
||||
|
||||
要安装 Dragonfly Navigator,首先从 [Git 仓库][4] 下载源代码。如果你使用的是 Debian Linux 或类似软件,请下载 `.deb` 文件。如果你使用的是 Fedora、CentOS、Mageia、OpenMandriva 或类似软件,请下载 `.tar.gz` 文件。
|
||||
|
||||
Dragonfly Navigator 只有很少的依赖。因为你不是通过包管理器安装它,所以由你来解决这些问题。它只有两个依赖,所以使用你的包管理器(`dnf` 或 `apt`)找到并安装它们:
|
||||
|
||||
- PyQt5,也称为 `python-qt5`
|
||||
- Python PIL,也称为 `pillow`
|
||||
|
||||
### 启动 Dragonfly Navigator
|
||||
|
||||
要启动 Dragonfly Navigator,请安装 `.deb` 文件(在基于 Debian 的系统上)或解压缩 `.tar.gz` 文件:
|
||||
|
||||
```
|
||||
$ tar xvf dragonfly*gz
|
||||
```
|
||||
|
||||
在基于 Debian 的系统上,Dragonfly Navigator 出现在你的应用菜单中。在其他系统上,你必须手动启动它,除非你 [手动安装][5]。
|
||||
|
||||
现在,我没有安装它,所以我手动启动它:
|
||||
|
||||
```
|
||||
$ cd dragonfly
|
||||
$ ./dragonfly
|
||||
```
|
||||
|
||||
![Dragonfly Navigator is a two-panel file manager][6]
|
||||
|
||||
### 双面板
|
||||
|
||||
Dragonfly Navigator 是一个双面板文件管理器,这意味着它总是向你显示两个目录。在启动时,这两个目录恰好是你的主目录。你可以在任一面板中浏览文件和文件夹。它们的功能完全相同,只有当你开始复制或移动文件时你“位于”哪个面板中才重要。
|
||||
|
||||
### 打开目录
|
||||
|
||||
要打开目录,请双击它。默认情况下,该目录在同一面板中打开。但是,如果你想使用双面板布局,请在双击时按住 `Ctrl` 键以在另一个面板中显示其内容。
|
||||
|
||||
### 打开文件
|
||||
|
||||
要打开文件,请双击或右键单击它。
|
||||
|
||||
是的,你可以右键单击文件将其打开。如果你习惯于右键单击调出上下文菜单,那么这需要一些时间来适应。不过,Dragonfly Navigator 中没有上下文菜单,你可能会惊讶地发现,当你将打开文件这一非常常见的操作减少到只需单击一次时,你会觉得自己节省了多少时间。现在可能看起来很傻,但相信我,你会逐渐珍惜它的。
|
||||
|
||||
### 快速预览
|
||||
|
||||
某些文件可用于快速预览,因此你不必在某个特定应用中打开它们。要预览文件,请将鼠标悬停在文件上,然后按键盘上的 `Alt` 键。预览出现在对面的面板中。
|
||||
|
||||
![The second panel of Dragonfly Navigator can be used as a preview pane.][7]
|
||||
|
||||
### 复制和移动文件
|
||||
|
||||
要将文件从一个目录复制或移动到另一个目录(或从一个目录到另一个目录),有几个步骤。
|
||||
|
||||
- 在一个面板中,进入目标目录。这是你要将文件复制到的位置。
|
||||
- 在另一个面板中,选择要复制的文件。
|
||||
- 单击 Dragonfly Navigator 中间条中的 “<ruby>复制<rt>Copy</rt></ruby>” 按钮。
|
||||
|
||||
要移动文件,请按照相同的步骤操作,但要单击 “<ruby>移动<rt>Move</rt></ruby>” 按钮。
|
||||
|
||||
如果你不习惯双面板文件管理器,一开始会觉得很陌生。但是你仔细想想,在你常用的文件管理器中复制一个文件需要几个步骤(找到文件,打开另一个窗口,拖放等等)。做几次之后,它成为第二天性。
|
||||
|
||||
### 选择文件
|
||||
|
||||
通常,你单击一个文件或文件夹以使其成为你的活动选择。这可能与你当前的文件管理器没有什么不同,或者至少与你过去使用过的某些文件管理器没有什么不同。
|
||||
|
||||
要选择一个范围内的多个项目,请单击一个文件,然后按住 `Shift` 键并单击另一个文件。你单击的两个文件之间的所有项目也被选中。
|
||||
|
||||
要选择多个任意文件,请按住 `Ctrl` 键并单击要选择的文件。
|
||||
|
||||
### Qt 和 Python 的力量
|
||||
|
||||
Qt 工具包是一个强大的编程程序,Python 能够用它创建出色的应用。我在本文中只介绍了 Dragonfly Navigator 的基础知识,所以请下载它,阅读文档,点击并探索它,也许你会发现一个有趣的新文件管理器。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/linux-file-manager-dragonfly-navigator
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/17/10/python-101#turtle
|
||||
[2]: https://opensource.com/article/20/5/web-scraping-python
|
||||
[3]: https://opensource.com/downloads/python-gaming-ebook
|
||||
[4]: https://github.com/suncore/dflynav/releases
|
||||
[5]: https://opensource.com/article/18/1/how-install-apps-linux
|
||||
[6]: https://opensource.com/sites/default/files/2022-10/dragonfly-navigator.webp
|
||||
[7]: https://opensource.com/sites/default/files/2022-10/dragonfly-navigator-preview.webp
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/30/105706fk81jdkd1jkh9xpc.jpg
|
@ -0,0 +1,156 @@
|
||||
[#]: subject: "Linux Mint 21.1 Arrives with a Ton of Visual Changes and Improvements"
|
||||
[#]: via: "https://news.itsfoss.com/linux-mint-21-1-release/"
|
||||
[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15383-1.html"
|
||||
|
||||
Linux Mint 21.1 发布:大量的视觉变化和改进
|
||||
======
|
||||
|
||||
> Linux Mint 21.1 带有一个新的默认主题和其他一些改进。
|
||||
|
||||
![][1]
|
||||
|
||||
Linux Mint 21 已经收到了它的第一个更新,即 **Linux Mint 21.1 “Vera”**。
|
||||
|
||||
如果你想了解 Linux Mint 21 “Venessa”,我们的官方点评应该能让你尽快了解:
|
||||
|
||||
> **[Linux Mint 21:最好的发行版变得更好了](https://itsfoss.com/linux-mint-21-review/)**
|
||||
|
||||
这个版本与通常的小版本相似。它包括了对外观、感觉和功能的各种变化,这些变化可能看起来很细微,但会影响用户体验。
|
||||
|
||||
让我们来看看主要的亮点。我们关注的是 Linux Mint 的 Cinnamon 版。
|
||||
|
||||
### Linux Mint 21.1 Vera:有什么新内容?
|
||||
|
||||
基于 **Ubuntu 22.04 LTS**,该版本的底层将继续使用 **Linux 5.15 LTS** 内核。
|
||||
|
||||
![][2]
|
||||
|
||||
#### 👀 焕然一新的用户界面
|
||||
|
||||
当你第一次启动进入桌面时,你应该很快注意到光标的新外观。它默认采用了新的 Bibata 主题。
|
||||
|
||||
![][3]
|
||||
|
||||
光标、图标主题列表增加了一些新的主题,如 Yaru、Breeze 和 GoogleDot,以及传统的 DMZ 主题。
|
||||
|
||||
![][4]
|
||||
|
||||
除了传统的 Mint-X、Mint-Y 和 Mint-Legacy 主题外,用户还可以找到一组独特的应用图标主题,这包括 Papirus、Breeze、Numix 和 Yaru。
|
||||
|
||||
![][5]
|
||||
|
||||
另一件你可能会注意到的有趣的事情,默认的强调色不再是传统的绿色,这是因为 **桌面主题现在换成了 Aqua**。强调色库提供了更多鲜艳的颜色,使桌面看起来更干净、更有吸引力。
|
||||
|
||||
对于那些希望恢复传统外观的人,你可以在主题中选择 “Mint-Y-Legacy”。
|
||||
|
||||
此外,以前在桌面上可见的 **电脑、主文件夹、网络和垃圾箱图标** 被默认删除,它们可以在文件管理器中访问。主文件夹的图标则显示在面板上。如果你想恢复以前的方式,你可以通过进入 <ruby>系统首选项<rt>System Preferences</rt></ruby> 来恢复。
|
||||
|
||||
#### ✨ 增强的驱动器管理器
|
||||
|
||||
由于驱动器管理器在用户模式下运行,所以当你启动它时不再要求输入密码。
|
||||
|
||||
![][6]
|
||||
|
||||
有专门的屏幕来显示离线连接和检测到 <ruby>现场 USB<rt>Live USB</rt></ruby> 时的情况。你也应该发现挂载现场 USB 比以前更顺畅了。
|
||||
|
||||
![][7]
|
||||
|
||||
对它也进行了一些修复。
|
||||
|
||||
Packagekit 现在可以清除已删除的驱动程序和软件包。这解决了一个众所周知的问题,即用户想要在不同版本的英伟达驱动之间进行切换。
|
||||
|
||||
此外,Debconf 也进行了修补,以解决启用安全启动时英伟达驱动程序的一个问题。
|
||||
|
||||
#### 👨💻 Flatpak 集成和软件管理器的改进
|
||||
|
||||
很高兴看到 <ruby>软件管理器<rt>Software Manager</rt></ruby> 和 <ruby>更新管理器<rt>Update Manager</rt></ruby> 都支持 Flatpak 了。
|
||||
|
||||
安装和更新 Flatpak 应用程序的过程没有什么不同,应该是很容易的。
|
||||
|
||||
![][8]
|
||||
|
||||
例如,软件管理器已被更新,以帮助区分用户正在查看的应用程序是哪个版本:Flatpak 版本还是系统版本。还有一个下拉框,用于在一个应用程序的系统版本和 Flatpak 版本之间切换。
|
||||
|
||||
卸载 Flatpak 应用程序和快捷方式不再需要密码了。在进行多项操作时也是如此。
|
||||
|
||||
#### 🔨 对 XApp 的改进
|
||||
|
||||
用户现在可以配置登录屏幕的光标大小和主题。以前,这些设置是全局设置。
|
||||
|
||||
另一方面,Warpinator 获得了更好的安全性,而 <ruby>WebApp 管理器<rt>WebApp Manager</rt></ruby> 在编辑 WebApp 时具有额外的设置,包括私人浏览和导航栏。
|
||||
|
||||
#### ⭐ 新的 ISO 验证工具
|
||||
|
||||
在大多数情况下,人们想验证一个下载的 ISO 镜像的完整性。
|
||||
|
||||
因此,更简单方便的方法是,你可以通过右击 ISO 镜像,选择 “<ruby>验证<rt>Verify</rt></ruby>”来完成。这就打开了 <ruby>ISO 验证<rt>ISO Verification</rt></ruby>工具,你可以在那里填写必要的细节来进行验证。
|
||||
|
||||
![][9]
|
||||
|
||||
值得注意的是,对于 Linux Mint 和 Ubuntu 的 ISO 镜像,SHA256sum 和 GPG 文件的 URL 是自动填写的。
|
||||
|
||||
#### 🎨 Cinnamon 5.6 桌面
|
||||
|
||||
Linux Mint 的旗舰桌面环境也有一些微小的视觉更新和变化。
|
||||
|
||||
在桌面的面板上,你会注意到主菜单和应用程序之间有一个细细的分隔线。像 Windows 一样,在最右边的角落里增加了一个新的角栏小程序,可配置,并支持创新的操作。
|
||||
|
||||
![][10]
|
||||
|
||||
说到视觉效果,默认的文件管理器 Nemo 已经经历了一些变化:
|
||||
|
||||
- 当选择一个或多个项目时,只有名称保持高亮,而图标则没有。
|
||||
- 日期现在以等宽字体显示。
|
||||
- 路径栏也得到了一些改进。
|
||||
|
||||
你可以毫不费力地访问 <ruby>显示设置<rt>Display Settings</rt></ruby>,因为它的快捷方式已被添加到桌面的上下文菜单中。
|
||||
|
||||
### 🛠️ 其他改进措施
|
||||
|
||||
其他两个桌面环境已经分别更新到 **MATE 1.26** 和 **XFCE 4.16**。
|
||||
|
||||
美术作品集也得到了扩展,包括几张很酷的壁纸。
|
||||
|
||||
虽然我们只介绍了这个版本的主要亮点,但你可以通过 [官方更新日志][11] 了解更多细节。
|
||||
|
||||
### 获得 Linux Mint 21.1
|
||||
|
||||
现有的 Mint 用户应该得到通知,可以通过更新管理器轻松升级到 Mint 21.1。
|
||||
|
||||
那些想要重新安装 Linux Mint 的人可以从 [官方下载页面][12] 获得 ISO。
|
||||
|
||||
> **[Linux Mint 21.1][12]**
|
||||
|
||||
如果你的网络较慢或不稳定,你也可以 [使用 Torrent 链接][13]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/linux-mint-21-1-release/
|
||||
|
||||
作者:[Rishabh Moharir][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/rishabh/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/linux-mint-21-1-release.png
|
||||
[2]: https://news.itsfoss.com/content/images/2022/12/Home.png
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/bibata.png
|
||||
[4]: https://news.itsfoss.com/content/images/2022/12/Themes.png
|
||||
[5]: https://news.itsfoss.com/content/images/2022/12/linux-mint-new-look.png
|
||||
[6]: https://news.itsfoss.com/content/images/2022/12/Drivemanager1.png
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/DriverManager2.png
|
||||
[8]: https://news.itsfoss.com/content/images/2022/12/Software_Manager.png
|
||||
[9]: https://news.itsfoss.com/content/images/2022/12/ISOVerify.png
|
||||
[10]: https://news.itsfoss.com/content/images/2022/12/Folder.png
|
||||
[11]: https://www.linuxmint.com/rel_vera_cinnamon_whatsnew.php
|
||||
[12]: https://www.linuxmint.com/download.php
|
||||
[13]: https://linuxmint.com/torrents/
|
@ -0,0 +1,79 @@
|
||||
[#]: subject: "Open source solutions for EV charging"
|
||||
[#]: via: "https://opensource.com/article/22/12/open-source-ev-charging"
|
||||
[#]: author: "Joshua Pearce https://opensource.com/users/jmpearce"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "duoluoxiaosheng"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15385-1.html"
|
||||
|
||||
开源电动汽车充电解决方案
|
||||
======
|
||||
|
||||
> 利用太阳能、硬件和开源来建立你自己的电动车充电站。
|
||||
|
||||
![][0]
|
||||
|
||||
也许你讨厌在寒冷或者酷热的时候加油,也许你关心环境问题。也许不断上涨的油价和通胀让你不得不考虑怎么更合理的安排开支。也许你只是认为电动汽车看起来很酷。不管什么原因,你都会因为即将拥有一辆电动汽车而感到激动,激动的不仅仅只有你。电动汽车的市场份额将在 [2040 年增长到 30%][1] 。[美国政府提供了一个简易的比较工具][2],用来展示维护一辆电动汽车的花费比维护一辆化石燃料汽车要少很多。尽管如此,电动汽车的充电费用仍然会给你的钱包带来沉重的负担。
|
||||
|
||||
通常,解决成本问题的最优雅的方法之一是应用开源原则来加速创新。幸运的是,在电动汽车充电领域已经找到了一种获得低成本电力和充电桩的方法。
|
||||
|
||||
为了控制电动汽车充电的成本,首先,你需要低成本的电力。在过去,这意味着从石油倒退到煤炭。如今,能将太阳能直接转化为电能的 <ruby>[光伏发电][3]<rt>solar photovolataic</rt></ruby>(PV) 设备提供的电力通常被认为成本是最低的。煤炭公司正在因为无法继续与清洁的太阳能竞争而破产。这也是 [太阳能发电在世界各地都爆炸性增长][4] 的原因。许多房主把 [太阳能电池板放到他们的房顶][5] 或者后院的支架上,以满足他们家庭的电力需求。但是,如果你的屋顶面积有限或者后院很小,你怎样才能使用太能能给你的电动汽车充电呢?
|
||||
|
||||
### 开源光伏停车篷
|
||||
|
||||
大型企业正在采取的一个方法是在他们的停车场上建造一个光伏顶篷。如果你自己想做一个,一个新的 [研究][6] 提供了三种新型开源光伏顶篷系统全面的机械和经济方面的分析。
|
||||
|
||||
- 使用纯木材的单一停车位横跨系统
|
||||
- 使用木材和铝的双停车位横跨系统
|
||||
- 使用木材和铝的悬臂系统
|
||||
|
||||
这些设计是以 5 * 6 个停车位的样式呈现的,但是这三个系统都可以扩展到任何需要的停车位数量。包括一个 6 千瓦的家用单车充电系统(如下图)。所有的支架都有 25 年的预期寿命来配合标准的光伏保修。
|
||||
|
||||
![Image of a single car PV canopy.][7]
|
||||
|
||||
这些开源光伏顶篷都是为了抵御加拿大残酷的冬天而设计的,它们遵循加拿大严格的建筑规范。所以,不管你住在其他任何地方,这些系统的设计都仍然可以为你工作。顶篷的 [完整设计][8] 以及材料清单,包括基本说明都有提供。它们以开源许可的方式发布,保证任何人都可以依照关于 DIY 太阳能收集器的免费书籍 《<ruby>[拥抱太阳][9]<rt>To Catch the Sun</rt></ruby>》 制作它。
|
||||
|
||||
前面提到的 [研究][6] 结果显示,开源设计比专利产品的成本低很多。单跨系统可节省成本 82% 到 85%,双跨系统节省成本 43% 到 50%,悬臂系统节省 31% 到 40% 。
|
||||
|
||||
最重要的是,这些设计给你提供了足够多的能源(如果你只是正常通勤)来满足你的充电需求。在运行的第一年,光伏顶篷可以提供目前市场上效率最低的电动汽车充电所需电量的 157% 。
|
||||
|
||||
![Image of an OpenEVSE charging station.][10]
|
||||
|
||||
### 开源电动汽车充电桩
|
||||
|
||||
减少电动车维护成本的另一个办法是安装一个开源的电动车充电桩。[OpenEVSE][11] 是一个基于 Arduino 的充电桩,由 [开源软件][12] 和硬件组成,可以以 DIY 的方式制作。它们体积小,重量轻,便于携带,你可以在家里或者旅途上使用它们。
|
||||
|
||||
OpenEVSE 为世界各地的许多电动车制造商提供充电站。你可以根据自己的需求调整它。OpenEVSE 已经相当成熟,支持许多先进的功能,包括可调电流,温度检测和实时功率显示。你可以购买预先组装好的硬件马上体验。如果你想<ruby>体验更多的乐趣<rt>节省更多的钱</rt></ruby>,可以购买一套套件自己动手制作。
|
||||
|
||||
![Image of the OpenEVSE kit.][13]
|
||||
|
||||
我希望未来可以看到更多关于电动汽车充电解决方案的设计。睁大眼睛,撸起袖子加油干,享受组装你的开源太阳能充电桩的乐趣。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/open-source-ev-charging
|
||||
|
||||
作者:[Joshua Pearce][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[duoluoxiaosheng](https://github.com/duoluoxiaosheng)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jmpearce
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://about.bnef.com/electric-vehicle-outlook/
|
||||
[2]: https://fueleconomy.gov/feg/Find.do?action=sbsSelect
|
||||
[3]: https://opensource.com/article/21/11/open-source-solar-power
|
||||
[4]: https://www.alliedmarketresearch.com/photovoltaic-market
|
||||
[5]: https://linux.cn/article-15374-1.html
|
||||
[6]: https://doi.org/10.3390/technologies10060114
|
||||
[7]: https://opensource.com/sites/default/files/2022-12/Single%20car%20open%20source%20PV%20canopy.png
|
||||
[8]: https://www.appropedia.org/Open-source_Photovoltaic_-_Electrical_Vehicle_Carport_Designs
|
||||
[9]: https://tocatchthesun.com/
|
||||
[10]: https://opensource.com/sites/default/files/2022-12/OpenEVSE%20charging%20an%20electric%20car.png
|
||||
[11]: https://openevse.com/index.html
|
||||
[12]: https://github.com/OpenEVSE
|
||||
[13]: https://opensource.com/sites/default/files/2022-12/OpenEVSE%20kit.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202212/27/171530ayuyongagafyxp5o.jpg
|
@ -0,0 +1,102 @@
|
||||
[#]: subject: "Manjaro Linux 22.0 Releases Featuring Xfce 4.18 and Linux Kernel 6.1"
|
||||
[#]: via: "https://news.itsfoss.com/manjaro-22-0-release/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15391-1.html"
|
||||
|
||||
Manjaro Linux 22.0 发布
|
||||
======
|
||||
|
||||
> Manjaro Linux 22.0 带着各种升级来了!
|
||||
|
||||
![][1]
|
||||
|
||||
Manjaro Linux 是一个基于 Arch Linux 的滚动发布发行版,专注于提供用户友好和无障碍体验。
|
||||
|
||||
自 6 月发布 “[Ruah][2]” 以来,Manjaro 的开发仍在继续,并为最新的版本铺平了道路,它被称为 “Sikaris”。
|
||||
|
||||
这是 2022 年最后的流行的发行版之一。让我们看看它提供了什么。
|
||||
|
||||
### Manjaro 22 “Sikaris” 有什么新内容?
|
||||
|
||||
![][3]
|
||||
|
||||
Sikaris 版本带来了许多改进,一些值得注意的包括:
|
||||
|
||||
- 桌面环境的升级
|
||||
- Linux 内核 6.1
|
||||
- 动态墙纸
|
||||
- 各种用户体验的改进
|
||||
|
||||
#### 桌面环境的升级
|
||||
|
||||
这个版本对 Manjaro Linux 的三个不同版本进行了许多改进。让我带你看看这些改进。
|
||||
|
||||
**对于 Manjaro GNOME:** 它使用是的 GNOME 43,有一个重新设计的系统状态菜单,可以让你在常用的设置之间快速切换。
|
||||
|
||||
他们还更新了他们的 “<ruby>布局切换器<rt>Layouts Switcher</rt></ruby>” 应用程序,包括各种改进和修复。
|
||||
|
||||
![][4]
|
||||
|
||||
此外,你可以创建你的动态壁纸并使用 [Gradience][5] 来定制你的主题。
|
||||
|
||||
**对于 Manjaro KDE:** “Sikaris” 版本采用了最新的 Plasma 5.26 桌面环境,具有许多改进,如动画壁纸、新的小工具,以及 Plasma 大屏幕的改进。
|
||||
|
||||
![][6]
|
||||
|
||||
还有一些其它的调整,允许壁纸根据系统的主题来改变。
|
||||
|
||||
此外,Dolphin 文件管理器现在有一个新的功能叫“<ruby>选择模式<rt>Selection Mode</rt></ruby>”,可以让你选择多个文件或文件夹。
|
||||
|
||||
**对于 Manjaro Xfce:** 使用的是 Xfce 4.18,该版本在 Thunar 文件管理器中获得了新的文件高亮显示和递归搜索功能。
|
||||
|
||||
可能是第一个包括 [新发布的 Xfce 4.18][7] 的开箱即用发行版。
|
||||
|
||||
面板也被更新了,允许最大化的应用程序填满面板后面的区域,而且面板的长度现在是以像素而不是百分比计算的。
|
||||
|
||||
![][8]
|
||||
|
||||
此外,“<ruby>控制中心<rt>Control Center</rt></ruby>”现在将所有用于管理系统的桌面模块集中到一个易于使用的窗口。
|
||||
|
||||
这些功能应该会改善你的整体体验! 😃
|
||||
|
||||
#### Linux 内核 6.1
|
||||
|
||||
Manjaro 22 ”Sikaris“ 使用 [Linux 内核 6.1][9] 提供了各种增强功能。
|
||||
|
||||
这些包括对 Rust 的实验性支持,对英特尔即将推出的 Meteor Lake 芯片的初步支持,改进的 ARM SoC 支持,以及更多。
|
||||
|
||||
### 下载 Manjaro 22
|
||||
|
||||
Manjaro 22 “Sikaris” 可用于 X86_64 和 ARM 系统,前往官方 [下载页面][10] 获取。
|
||||
|
||||
> **[下载 Manjaro 22][10]**
|
||||
|
||||
**对于现有的用户,** 你只需在命令行中运行 `sudo pacman -Syu` 就可以得到这个版本的 Manjaro Linux。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/manjaro-22-0-release/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/manjaro-22-0-release.png
|
||||
[2]: https://news.itsfoss.com/manjaro-21-3-0-release/
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/Manjaro_Linux_KDE_2.png
|
||||
[4]: https://news.itsfoss.com/content/images/2022/12/Manjaro_Linux_GNOME.png
|
||||
[5]: https://github.com/GradienceTeam/Gradience
|
||||
[6]: https://news.itsfoss.com/content/images/2022/12/Manjaro_Linux_KDE.png
|
||||
[7]: https://news.itsfoss.com/xfce-4-18-release/
|
||||
[8]: https://news.itsfoss.com/content/images/2022/12/Manjaro_Linux_XFCE.png
|
||||
[9]: https://news.itsfoss.com/linux-kernel-6-1-release/
|
||||
[10]: https://manjaro.org/download/
|
@ -0,0 +1,121 @@
|
||||
[#]: subject: "5 Upcoming Code Editors that May Challenge the Supremacy of Visual Studio Code"
|
||||
[#]: via: "https://news.itsfoss.com/upcoming-code-editors/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15399-1.html"
|
||||
|
||||
5 个即将推出的可能会挑战 VS Code 的代码编辑器
|
||||
======
|
||||
|
||||
> 这些有趣的代码编辑器可能会在 2023 年取代 VS Code!
|
||||
|
||||
![5 Upcoming Code Editors that May Challenge the Supremacy of Visual Studio Code][1]
|
||||
|
||||
嗯,2022 年即将结束。
|
||||
|
||||
我们推出了针对 Linux 发布的新的卓越代码编辑器,从 [Lite XL][2] 到 [Pulsar][3] 等。
|
||||
|
||||
因此,为了纪念这一点,我编制了这份即将推出的 Linux 代码编辑器列表,它们很有可能挑战 [VS Code][4] 的霸主地位。
|
||||
|
||||
让我带你了解它。
|
||||
|
||||
### 1、Pulsar
|
||||
|
||||
![pulsar][5]
|
||||
|
||||
[Pulsar][6] 是一个社区主导的开源代码编辑器,旨在替代著名的 Atom 代码编辑器。
|
||||
|
||||
它使用与 Atom 相同的代码库,有一个开源的后端(得益于逆向工程的工作),更新了依赖性。
|
||||
|
||||
他们有计划在不久的将来对其进行改进。
|
||||
|
||||
它可以从 [官方网站][7] 下载,但请记住,它还处于早期开发阶段。
|
||||
|
||||
### 2、Atom 社区版
|
||||
|
||||
![atom community][8]
|
||||
|
||||
“[Atom 社区版][10]” 也是从现已停止维护的 Atom 编辑器的 [灰烬][9] 中重生的,它是一个旨在接管其前身的概念和想法的项目。
|
||||
|
||||
他们的目标是从提供最基本的特性开始,并使其与 [atom-ide-ui][11] 包中的可用功能相媲美。
|
||||
|
||||
它可能会有更多东西,但就目前的形式而言,我现在不建议新用户这样做。与 Pulsar 相比,他们的长期目标略有不同,这使它成为另一个值得一看的项目。
|
||||
|
||||
但是,到 2023 年,情况可能会有所不同。
|
||||
|
||||
尽管如此,那些喜欢冒险的人可以使用 [源代码][12] 来构建它。
|
||||
|
||||
### 3、Lapce
|
||||
|
||||
![lapce][13]
|
||||
|
||||
一个轻量级和快速的开源代码编辑器?
|
||||
|
||||
这就是 [Lapce][14]!
|
||||
|
||||
它是一个基于 Rust 的开源代码编辑器,专注于提供这样的体验。
|
||||
|
||||
我们在它处于 pre-alpha 阶段时对其进行了介绍,但在 2023 年它可能会引起注意。
|
||||
|
||||
### 4、Zed
|
||||
|
||||
![zed breadcrumbs][15]
|
||||
|
||||
[Zed][16] 是即将推出的代码编辑器,旨在挑战 VS Code 的统治地位。
|
||||
|
||||
它有许多功能,例如实时协作、极简界面、代码动作、命令面板等 [更多功能][17]。
|
||||
|
||||
事实上,Atom 的创始人 [Nathan Sobo][18] 是这一切的幕后推手,并将其称为 Atom 的“_精神继承者_”。
|
||||
|
||||
### 5、Lite XL
|
||||
|
||||
![lite xl][19]
|
||||
|
||||
[Lite XL][2] 是一个用 Lua 编写的开源代码编辑器,仅使用 3MB 的存储空间和大约 20MB 的内存。(与 VS Code 的 ~550 MB 相比)。
|
||||
|
||||
如果你正在寻找一个完全最小化的代码编辑器,它可能会合你的口味。
|
||||
|
||||
你现在可以从 [官方网站][20] 获取它,它会定期更新,预计 2023 年也会如此。
|
||||
|
||||
**好了,这是这份名单的结束,也是 2022 年的结束。** 😃
|
||||
|
||||
_我可能错过了一些代码编辑器,我知道你会在评论部分告诉我。随时分享你的想法!_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/upcoming-code-editors/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/upcoming-editors-which-may-challenge-vs-code.png
|
||||
[2]: https://itsfoss.com/lite-xl/
|
||||
[3]: https://news.itsfoss.com/pulsar-editor/
|
||||
[4]: https://code.visualstudio.com
|
||||
[5]: https://news.itsfoss.com/content/images/2022/12/Pulsar.png
|
||||
[6]: https://pulsar-edit.dev
|
||||
[7]: https://pulsar-edit.dev/download.html#releases
|
||||
[8]: https://news.itsfoss.com/content/images/2022/12/Atom_Community.jpg
|
||||
[9]: https://github.blog/2022-06-08-sunsetting-atom/
|
||||
[10]: https://atom-community.github.io
|
||||
[11]: https://github.com/facebookarchive/atom-ide-ui
|
||||
[12]: https://github.com/atom-community/atom
|
||||
[13]: https://news.itsfoss.com/content/images/2022/12/Lapce.jpg
|
||||
[14]: https://lapce.dev
|
||||
[15]: https://news.itsfoss.com/content/images/2022/12/Zed_Early.jpg
|
||||
[16]: https://zed.dev/
|
||||
[17]: https://zed.dev/features
|
||||
[18]: https://twitter.com/nathansobo
|
||||
[19]: https://news.itsfoss.com/content/images/2022/12/LiteXL.jpg
|
||||
[20]: https://lite-xl.com/en/downloads
|
||||
[21]: https://mastodon.social/@itsfoss
|
||||
[22]: https://twitter.com/itsfoss2
|
@ -0,0 +1,123 @@
|
||||
[#]: subject: "Be Delighted! Unity Teases Version 7.7 as the Sign of Active Development"
|
||||
[#]: via: "https://news.itsfoss.com/unity-7-7-dev/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15398-1.html"
|
||||
|
||||
Unity 正在积极开发,预告 7.7 版
|
||||
======
|
||||
|
||||
> Unity 7.7 版的更新计划为该桌面环境带来一些视觉上的改革。
|
||||
|
||||
![][1]
|
||||
|
||||
Unity,经典的桌面环境,从 2010 年到 2017 年都是 Ubuntu 的一部分,将收到一个大的新版本。你可以期待它在 2023 年的某个时候发布,但目前还没有具体的发布日期。
|
||||
|
||||
但不是由 [Canonical][2] 发布。
|
||||
|
||||
**如果你不知道:** Unity 的开发由一位年轻的开发者 [Rudra Saraswat][3] 接手,他也是 [Ubuntu Unity][4] 衍生版的创造者,这是 Ubuntu 的一个官方特色版。
|
||||
|
||||
在最近的一篇 [博文][5] 中,Rudra 向我们揭示了 Unity 7.7 的一角和即将到来的各种改进。
|
||||
|
||||
让我带你看看这些。
|
||||
|
||||
### Unity 7.7 值得期待的地方
|
||||
|
||||
![unity 7.7 一窥][6]
|
||||
|
||||
这次披露的内容有很多,其中包括:
|
||||
|
||||
- 更新的欢迎应用程序
|
||||
- UWidgets
|
||||
- 改进的仪表盘
|
||||
- 面板的调整
|
||||
- 增强的通知指示器
|
||||
|
||||
#### 更新的欢迎应用程序
|
||||
|
||||
![][7]
|
||||
|
||||
一个新的欢迎应用程序将被引入 Unity,它基于 Ubuntu Flutter 社区开发的原型(用 [Flutter][8] 编写)。
|
||||
|
||||
这个应用程序将不只限于一个发行版,而是适用于 Unity 所支持的所有发行版。
|
||||
|
||||
#### UWidgets
|
||||
|
||||
![][9]
|
||||
|
||||
终于有了,Unity 桌面上的小部件?像 KDE 一样?
|
||||
|
||||
好吧,在 Unity 中引入用 Python 编写的小部件,应该很简单就可以设置(只是复制几个文件的问题)。
|
||||
|
||||
屏幕截图展示了一堆小部件,如时钟、系统监视器、Spotify 的小部件等等。
|
||||
|
||||
这还不是全部,Rudra 还提到:
|
||||
|
||||
> 我们将为 UWidgets 建立一个网页商店/仓库,在那里你可以提交你自己的小部件,或者下载并试用 Unity 7.7 上所有这些令人惊叹的小部件。
|
||||
|
||||
这应该会使用户更容易找到和下载小部件!
|
||||
|
||||
#### 改进的仪表盘
|
||||
|
||||
![][10]
|
||||
|
||||
<ruby>仪表盘<rt>Dash</rt></ruby>也被刷新了,新的设计基于 Unity 7 的原始设计概念(在 Canonical 放弃它之前)。
|
||||
|
||||
按照截图,它应该不会占用大量的屏幕空间,而且还很有用。
|
||||
|
||||
#### 面板的调整
|
||||
|
||||
![][11]
|
||||
|
||||
现在的面板比之前的版本略大且更精致。
|
||||
|
||||
#### 增强的通知指示器
|
||||
|
||||
![][12]
|
||||
|
||||
这对 Unity 来说是一个巨大的可用性改进;用户现在终于可以利用一个适当的通知指示器了。
|
||||
|
||||
它将显示与你的应用程序、系统和更多相关的基本通知。
|
||||
|
||||
#### 其他变化
|
||||
|
||||
![][13]
|
||||
|
||||
一些更有用的技术改进包括:
|
||||
|
||||
- unity-control-center 的外壳 UI 得到了改进
|
||||
- 默认的面板不透明度降低到 0.75
|
||||
- 默认的启动器图标尺寸被缩小了
|
||||
- 启动器按钮(Ubuntu 图标)被替换为半透明的图标,类似于 Ubuntu Unity 21.04 的启动器按钮。
|
||||
|
||||
_对 Unity 7.7 感到激动?请在下面的评论中告诉我你的想法。_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/unity-7-7-dev/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/ubuntu-unity-7-7-release.png
|
||||
[2]: https://canonical.com
|
||||
[3]: https://about.ruds.io
|
||||
[4]: https://ubuntuunity.org
|
||||
[5]: https://unityd.org/unity-7-7-peek/
|
||||
[6]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek.jpg
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek_Welcome.jpg
|
||||
[8]: https://flutter.dev
|
||||
[9]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek_UWidgets.jpg
|
||||
[10]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek_Dash.jpg
|
||||
[11]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek_Panels.jpg
|
||||
[12]: https://news.itsfoss.com/content/images/2022/12/Unity_7.7_Sneakpeek_Notif.jpg
|
||||
[13]: https://news.itsfoss.com/content/images/2022/12/unity-control-center.png
|
223
published/20221220.2 ⭐️⭐️ How I use Artipie, a PyPI repo.md
Normal file
223
published/20221220.2 ⭐️⭐️ How I use Artipie, a PyPI repo.md
Normal file
@ -0,0 +1,223 @@
|
||||
[#]: subject: "How I use Artipie, a PyPI repo"
|
||||
[#]: via: "https://opensource.com/article/22/12/python-package-index-repository-artipie"
|
||||
[#]: author: "Alena Gerasimova https://opensource.com/users/olena"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15592-1.html"
|
||||
|
||||
Artipie:可用于 Python 的开源仓库管理器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Artipie 是一个开源的自托管的仓库管理器,它不仅可以用于 Python。
|
||||
|
||||
在学生时代使用 Python 开发时,我发现我需要一些私人的集中存储。这样我就可以存储二进制和文本数据文件,以及 Python 软件包。我在 [Artipie][1] 中找到了答案,这是一个开源的自托管的软件仓库管理器。
|
||||
|
||||
在大学里,我和我的同事们对来自实验测量的大量数据进行研究。我使用 Python 来处理和可视化它们。当时我的大学同事是数学家,没有软件开发技术的经验。他们通常只是在闪存盘上或通过电子邮件传递数据和代码。我努力向他们介绍像 [Git][2] 这样的版本管理系统,但没有成功。
|
||||
|
||||
### Python 仓库
|
||||
|
||||
Artipie 支持 [PyPI][3] 仓库,与 [twine][4] 和 [pip][5] 兼容。这意味着你可以完全像在 [PyPI][3] 和 [TestPyPI][6] 仓库上安装或发布软件包那样使用 Artipie Python 仓库。
|
||||
|
||||
要创建你自己的 Python 仓库,你可以使用名为 [Artipie Central][7] 的 Artipie 托管实例。当你登录后,你会看到一个列出你的仓库的页面(开始时是空的),以及一个添加新仓库的表单。为你的新仓库选择一个名字(例如,`mypython`),选择 `Python` 作为仓库类型,然后点击 “<ruby>添加<rt>Add</rt></ruby>” 按钮。
|
||||
|
||||
接下来,你会看到一个以 [YAML][8] 格式显示仓库设置的页面:
|
||||
|
||||
```
|
||||
---
|
||||
repo:
|
||||
type: pypi
|
||||
storage: default
|
||||
permissions:
|
||||
olenagerasimova:
|
||||
- upload
|
||||
"*":
|
||||
- download
|
||||
```
|
||||
|
||||
配置中的 `type` 映射设置了仓库的类型。在这个例子中,Python 仓库被配置为默认的 Artipie Central 存储。
|
||||
|
||||
`storage` 映射定义了所有仓库包的存储位置。这可以是任何文件系统或 S3 存储兼容的位置。Artipie Central 有一个预先配置的 `default` 存储,可以使用它进行测试。
|
||||
|
||||
`permissions` 映射允许为用户 `olenagerasimova` 上传,并允许任何人下载任何软件包。
|
||||
|
||||
为了确保这个仓库的存在和工作,在你的浏览器中打开 [索引页][9]。显示的是软件包列表。如果你刚刚创建了一个新的版本库,但还没有上传软件包,那么仓库的索引页是空白的。
|
||||
|
||||
### 二进制仓库
|
||||
|
||||
你可以在 Artipie 中存储任何种类的文件。存储类型是 `file` 或 `binary`,我用这个作为实验数据的存储。我把它作为 Python 可视化的输入。在 Artipie Central 可以创建一个文件仓库,与 Python 仓库的方式相同。你给它一个名字,选择 `binary` 类型,然后点击 “<ruby>添加<rt>Add</rt></ruby>” 按钮。
|
||||
|
||||
```
|
||||
---
|
||||
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
|
||||
```
|
||||
|
||||
另外两个文件的形式相同(只是数字不同)。要想自己看这些文件,请在浏览器中打开链接 [一][10]、[二][11] 和 [三][12] 并下载文件,或者你可以用 `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 `PUT` 和 `GET` 请求),用任何语言编写一段代码来上传和下载所需的文件都很容易。
|
||||
|
||||
### Python 项目
|
||||
|
||||
可以从我的 [GitHub 仓库][13]中获得一个 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][14] 文档的链接到你的控制台。
|
||||
|
||||
你也可以使用 Artipie Rest API 来查看现有的仓库:
|
||||
|
||||
- 进入 Swagger 文档页面 `http://localhost:8086/api/index-org.html`。
|
||||
- 在 “<ruby>选择一个定义<rt>Select a definition</rt></ruby>” 列表中,选择 “<ruby>认证令牌<rt>Auth token</rt></ruby>”。
|
||||
- 生成并复制用户 `artipie` 的认证令牌,密码是 `artipie`。
|
||||
- 切换到 “<ruby>仓库<rt>Repositories</rt></ruby>” 定义,点击 “<ruby>认证<rt>Authorize</rt></ruby>” 按钮,然后粘贴令牌。
|
||||
|
||||
![Image of the Swagger documentation page,][15]
|
||||
|
||||
对 `/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][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/olena
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://github.com/artipie
|
||||
[2]: https://opensource.com/tags/git
|
||||
[3]: https://pypi.org/
|
||||
[4]: https://github.com/pypa/twine
|
||||
[5]: https://pip.pypa.io/en/stable/
|
||||
[6]: https://test.pypi.org/
|
||||
[7]: https://central.artipie.com/signin
|
||||
[8]: https://www.redhat.com/sysadmin/yaml-beginners
|
||||
[9]: https://central.artipie.com/olenagerasimova/pypi
|
||||
[10]: https://central.artipie.com/olenagerasimova/data/y1.dat
|
||||
[11]: https://central.artipie.com/olenagerasimova/data/y2.dat
|
||||
[12]: https://central.artipie.com/olenagerasimova/data/y3.dat
|
||||
[13]: https://github.com/artipie/pypi-example
|
||||
[14]: https://swagger.io/
|
||||
[15]: https://opensource.com/sites/default/files/2022-11/artipie-swagger.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/02/232208fgy56v5egv7ipgg2.jpg
|
125
published/202301/20190331 Codecademy vs. The BBC Micro.md
Normal file
125
published/202301/20190331 Codecademy vs. The BBC Micro.md
Normal file
@ -0,0 +1,125 @@
|
||||
[#]: subject: "Codecademy vs. The BBC Micro"
|
||||
[#]: via: "https://twobithistory.org/2019/03/31/bbc-micro.html"
|
||||
[#]: author: "Two-Bit History https://twobithistory.org"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "CanYellow"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15469-1.html"
|
||||
|
||||
上世纪的 BBC Micro 和如今的 Codecademy
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
20 世纪 70 年代末期,计算机突然成为了某种普罗大众能够买回家的商品;而此前的几十年间,它一直只是听命于企业级霸主的神秘而笨重的机器。少数狂热的爱好者注意到了它是多么的吸引人,并争相购买了属于自己的计算机。对更多的人而言,微型计算机的到来引发了对未来的无助焦虑。同时期的杂志上的一则广告承诺,家用计算机将“让您的孩子在学校享有不公平的优势”。广告中展示了一位打着领带,身着时髦的西装外套的男孩子急切地举手回答问题,而在他的身后,他的那些显得不那么聪明的同学们闷闷不乐地望着他。这则广告以及其它类似的广告在暗示:世界正在疾速改变,而如果你不立即学习如何使用这些令人生畏的新设备之一,你和你的家人就会被时代所抛弃。
|
||||
|
||||
在英国,这些焦虑转化为政府高层对国家竞争力的担忧。从各种意义上,20 世纪 70 年代对英国来说都是平平无奇的十年,通胀与失业率高企。与此同时,一系列的罢工让伦敦陷于一次又一次的停电中。一篇 1979 年的政府报告担心:没有跟上计算机技术浪潮将“为我们糟糕的工业表现平添又一个影响因素”[^1]。英国似乎已经在计算机技术的角逐中落后了 —— 所有的大型的计算机公司都是美国的,而集成电路则在日本和中国台湾制造。
|
||||
|
||||
由英国政府建立的公共服务广播公司英国广播公司(BBC)作出了一个大胆的举动,决定通过帮助英国人战胜他们对计算机的反感,来解决英国的国家竞争力问题。BBC 发起了 “<ruby>[计算机认知计划][T3]<rt>Computer Literacy Project</rt></ruby>”,该计划包括多个教育方向的努力:几部电视连续剧、一些相关书籍、一个支持团队网络以及一款名为 [BBC Micro][T2] 的特别定制的微型计算机。该项目是如此成功,以致于 1983 年 《[BYTE][T4]》杂志的一位编辑写道:“与美国相比,英国人对微型计算机感兴趣的比例更高。”[^2] 这位编辑惊讶于在英国举办的 <ruby>第五届个人计算机世界展<rt>Fifth Personal Computer World Show</rt></ruby> 的人数比参加当年的西海岸计算机展的人数更多。超过六分之一的英国人观看了由该计划制作的第一部电视连续剧,并最终售出了 150 万台 BBC Micro 微型计算机。[^3]
|
||||
|
||||
去年,一份包含了由计算机认知计划制作的每一部电视连续剧和所有出版资料的 [档案][4] 被发布在了互联网上。我抱着极大的兴趣观看了这些电视连续剧,并试图想象在 20 世纪 80 年代早期学习计算机使用是什么样子。但事实证明,更有趣的是计算机是如何被教授的。今天,我们仍然担心技术发展使人们落伍。富有的科技企业家与政府花费大量的资金试图教孩子们“编码”。我们拥有诸如 [Codecademy][T1] 这样的网站,通过新技术的运用进行交互式编程教学。我们可能假定这种方式比 80 年代的呆板的电视连续剧更高效,不过真的是这样吗?
|
||||
|
||||
### 计算机认知计划
|
||||
|
||||
1975 年发布的 [Altair 8800][5] 拉开了微型计算机革命的大幕。不到两年,Apple II、TRS-80 以及 Commodore PET 也都相继发布。全新的计算机的销量爆发式增长。1978 年,BBC 在一部名为 《<ruby>[芯片来了][T5]<rt>Now the Chips Are Down</rt></ruby>》(LCTT 译注:对于非英国区域的读者,可以在 [这里][T6] 观看该纪录片)的纪录片中探讨了这些新机器必将会带来的剧烈的社会变革。
|
||||
|
||||
该纪录片充满担忧。在前 5 分钟内,解说员提到这种微电子器件将“彻底改变我们的生活方式”。随着诡异的合成音乐的播放,屏幕上绿色的电脉冲围绕着放大后的芯片起舞,解说员进一步说,这种芯片“正是日本放弃造船业的原因,也将成为我们的孩子们长大后失业的原因”。该纪录片继续探讨了机器人如何用于汽车自动化组装,以及欧洲的手表业如何在与美国的电子表行业竞争中败下阵来。它指责英国政府在应对未来的大规模失业的准备上做得不够。
|
||||
|
||||
该纪录片据信可能在英国议会上展示过。[^4] 包括工业署和人力服务委员会在内的一些政府代表,开始对尝试提高英国公众对计算机的认识感兴趣。人力服务委员会为来自 BBC 的教育部门提供了资助,让他们的一个团队到日本、美国以及其他国家进行了实地考察。该研究团队完成了一份报告,历数了微电子技术在工业制造、劳动关系与办公室工作等领域的哪些方面将发生重大改变。70 年代末,BBC 决定制作一部十集电视连续剧,帮助普通英国人“学习如何使用和控制计算机,避免产生被计算机支配的感受”[^5]。这一努力最终成为了一个与 “<ruby>成人认知计划<rt>Adult Literacy Project</rt></ruby>” 相似的多媒体项目。成人认知计划是 BBC 此前进行的一项工作,包括一部电视连续剧以及补充课程,帮助两百万人提高他们的阅读能力。
|
||||
|
||||
计算机认知计划背后的制作方热衷于以“实操”示例为特色的电视连续剧。这样如果观众拥有一台微型计算机在家里,他们就可以亲自动手尝试。这些例子必须使用 BASIC 语言,因为这是在几乎所有的微型计算机上都使用的编程语言(实际是整个 <ruby>交互界面<rt>shell</rt></ruby>)。但是制作者面临一个棘手的问题:微型计算机制造商均拥有他们自己的 BASIC 方言,因此不论他们选择哪一种方言,他们都不可避免地疏远大部分的观众。唯一切实可行的方案是创造一种全新的 BASIC 方言 —— BBC BASIC,以及与之配合使用的微型计算机。英国公众可以购买这种全新的微型计算机,并依照示例操作,而不需要担心软硬件上的差异带来的问题。
|
||||
|
||||
BBC 的电视制作人与节目主持人并不具备自行制造微型计算机的能力,因此他们汇总了一份他们预期的计算机的规范,并邀请英国的微型计算机公司推出满足该规范要求的新机器。这份规范要求提供一种相对更强劲的计算机,因为 BBC 的制作方认为相应的设备应当能够运行真实有用的应用程序。计算机认知计划的技术顾问还建议:如果必须要教授全体国人一种 BASIC 方言的话,那么最好选择表现良好的方言(他们可能没有确切地这样说,不过我认为这就是他们的真实想法)。BBS BASIC 通过允许递归调用与局部变量弥补了一些 BASIC 语言的常见缺点。[^6]
|
||||
|
||||
BBC 最终决定由一家位于剑桥的名为 Acorn Computers 的公司制造 BBC Micro 计算机。在选择 Acorn 公司的时候,BBC 没有接受来自 [Clive Sinclair][T7] 的申请,他经营着一家 Sinclair Research 公司。1980 年,Sinclair 公司通过 Sinclair ZX80 为英国开拓了微型计算机的大众市场。虽然 Sinclair 公司的新产品 ZX81 更便宜,但是性能不足以满足 BBC 的要求。而 Acorn 的新型计算机(内部被称为 Proton)的原型机更加昂贵,但是性能更好,更具备扩展性。BBC 对此印象深刻。该型号的计算机从未以 “Proton” 的名字上市或销售过,因为它在 1981 年 12 月以 “BBC Micro” 的名字发布了。BBC Micro 又被亲切地称为 “The Beeb”,你可以以 235 英磅的价格购得其 16k 内存的版本,或者以 335 英磅的价格获得其 32k 内存的版本。
|
||||
|
||||
到了 1980 年,Acorn 在英国计算机行业逐渐衰微,但是 BBC Micro 帮助 Acorn 公司创立了其遗留至今的宝贵遗产。时至今日,世界范围内最流行的微处理器指令集是 ARM 架构,“ARM” 如今代表的是 “<ruby>先进 RISC 架构设备<rt>Advanced RISC Machine</rt></ruby>”,然而最初它代表的是 “<ruby>Acorn RISC 架构设备<rt>Acorn RISC Machine</rt></ruby>”。ARM 架构背后的 ARM 控股公司就是 Acorn 公司在 1990 年之后的延续。
|
||||
|
||||
![Picture of the BBC Micro.][9]
|
||||
|
||||
_BBC Micro 的一幅差劲的图片,我摄于美国加州山景城的<ruby>计算机历史博物馆<rt>Computer History Museum</rt></ruby>_
|
||||
|
||||
### 《计算机程序》电视连续剧
|
||||
|
||||
作为计算机认知计划的一部分,他们最终制作了十几部不同的电视连续剧。第一部作品是一部名为 《计算机程序<rt>The Computer Programme</rt></ruby>》 的十集电视连续剧。该连续剧在 1982 年初播出了十周。每周晚上有一百万人收看该节目,还有 25 万人在每周日与周一的下午收看该节目的重播。
|
||||
|
||||
该电视节目由两名主持人主持:Chris Serle 和 Ian McNaught-Davis。Serle 扮演初学者,而 McNaught-Davis 扮演专家,他具有专业的大型计算机编程经验。这是一个启发性的方式,有些 [略显笨拙的过渡][10] —— Serle 经常直接从与 McNaught-Davis 的对话中,过渡到面向镜头的边走边说的讲述,此时你不禁会疑惑 McNaught-Davis 是否还站在画面之外。不过这意味着 Serle 可以表达观众肯定会有的关注 —— 他可能会惊恐地看着满屏的 BASIC 语言,并提出类似“这些美元符号是什么意思”的问题。在节目中的某些时刻,Serle 与 McNaught-Davis 会坐在计算机前进行事实上的结对编程。McNaught-Davis 会在各个地方留下一些线索,而 Serle 则试图将它们弄清楚。如果这一节目仅仅由一个无所不知的讲述者主持,那么它的亲和力就会差很多。
|
||||
|
||||
该节目也在努力展示计算在普通人生活中的实际应用。到 80 年代早期,家用电脑已经开始与年轻男孩和电子游戏联系在一起。计算机认知计划的制作方试图避免采访“令人印象深刻的、有能力的年轻人”,因为这可能会“加剧老年观众的焦虑”,而该节目正打算吸引这一人群对计算感兴趣 [^7]。在该系列的第一集中,该节目的 “现场” 记者 Gill Nevill 采访了一位女性,她购买了一台 Commodore PET 计算机用于辅助管理她的糖果店。这位名叫 Phyllis 的女性受访者看上去大约 60 多岁,但她在使用 PET 完成她的会计工作上没有任何问题,甚至已经开始使用 PET 为其他企业做计算机工作,这听上去像是一个有前途的自由职业的开端。Phyllis 说她并不介意计算机工作逐步取代她的糖果店生意,因为她更喜欢计算机工作。这次采访要是换成对一名青少年的采访,介绍了他是如何修改 《[Breakout][T8]》 电子游戏,以使之运行更快并更具挑战性,不过这就几乎鼓舞不了任何人。另一方面,如果普罗大众中的 Phyllis 都会使用计算机,那么你当然也可以。
|
||||
|
||||
虽然该节目以大量的 BASIC 编程为特色,不过它实际想要教给观众的是,计算机通常是如何工作的。该节目通过类比的方法解释了其中的一般原则。在第二集中,有一个关于 [Jacquard][T9] 织机(LCTT 译注:中文网络译为雅卡尔提布机)的延伸讨论,主要是两个方面:其一,它揭示了计算机并不仅仅基于昨天发明的神秘技术 —— 计算的一些基本原则可以上溯到两百年前,就跟你可以在卡片上打孔来控制纺织机的想法一样简单;其二,经线与纬线的交织用来证明二元选择(即纬线是从上方还是下方穿过经线)在不断重复时足以产生巨大变化。当然,节目接下来继续讨论信息是如何使用二进制存储的。
|
||||
|
||||
在该节目中接下来是一个蒸汽管风琴的章节,该管风琴能够演奏编码在一卷长长的、分段的打孔卡片的音乐。这个类比用以解释 BASIC 中的 <ruby>子程序<rt>subroutine</rt></ruby>。Serle 与 McNaught-Davis 将整卷的打孔卡片摊开在演播室的地板上,然后指出看上去像是重复的副歌的分段。McNaught-Davis 解释说,如果你将这些重复的卡片分段剪下,并以某种方式添加一条指令,回到第一次播放该副歌的最初的分段,这就是子程序。这是一个绝妙的解释,它在人们的脑海中的印象非常深刻。
|
||||
|
||||
我仅仅摘录了一些例子,不过我认为,总的来看该节目尤为擅长通过解释计算机实现功能所依赖的原理,使计算机不再神秘。这一节目本可以专注于 BASIC 教学,不过它并没有这样做。这被证明是一个相当明智的选择。在 1983 年写就的一篇回忆文章中,计算机认知计划的总制作人 John Radcliffe 如是写道:
|
||||
|
||||
> 如果计算机将如我们所相信的那样重要,对这一新主题的真正理解对每个人都很重要,也许与文字读写能力同等重要。不管是在我们这里还是在美国,在计算机认知的主要路线上的早期思路均集中于编程上。然而随着我们思想的发展,尽管我们意识到“动手”体验在个人计算机上的价值,但我们开始降低对编程的重视,而更多的强调广泛的理解,将微型计算机与大型计算机联系起来,鼓励人们获取一系列应用程序与高级语言的经验,并将这些经验同现实世界中的工业与商业活动中的经验联系起来……。我们相信,一旦人们掌握了这些最简单的原则,它们将可以进一步深入该主题。
|
||||
|
||||
后来,Radcliffe 又以类似的口吻写道:
|
||||
|
||||
> 围绕着这一系列节目的主要阐释目标有很多争论。一些人认为,在使用微型计算机上的实际细节上给予建议,对本项目而言尤为重要。但我们的结论是,如果该系列节目要拥有可持续性的教育价值,它就必须通过对计算原理的解释,成为进入真实计算世界的一种方式。这需要通过对微型计算机上的室内演示,通过类比方式解释其中的原则,以及通过电影说明实际应用的真实例子来实现。不仅仅是微型计算机,小型机以及大型机也将被展示。
|
||||
|
||||
我喜爱这一连续剧,尤其是其中关于小型机与大型机的部分。计算机认知计划背后的制作方旨在帮助英国人找准定位:计算身处何处又去向何方?计算机现在能做什么,未来又能做什么?学习一些 BASIC 语言是回答这些问题的一个部分,但是仅仅理解 BASIC 语言似乎不足以使人们认知计算机。
|
||||
|
||||
### 如今的计算机认知
|
||||
|
||||
如果你现在搜索“学习编码”,你看到的排在第一的是指向 Codecademy 网站的链接。如果要说存在一个“计算机认知计划”的现代替代品 —— 具有相同的影响与目标,那就是 Codecademy。
|
||||
|
||||
“<ruby>学习编码<rt>learn to code</rt></ruby>” 是 Codecademy 的口号。我认为我不是第一个指出这一点的人 —— 事实上我可能在某个地方读过这句话,只是现在拿来用而已。但是这里使用的是 “<ruby>编码<rt>code</rt></ruby>” 而非 “<ruby>编程<rt>program</rt></ruby>”,这说明了一些问题。这表明你学习的重要内容是如何读懂代码,如何阅读满屏的 Python 代码的意思,而不是目光呆滞、不知所云。我能够理解为什么对于普通人而言,这似乎是成为专业程序员的主要障碍。专业程序员整日盯着布满编程术语的计算机屏幕,如果我想要成为一个专业程序员,我最好确保我能够理解这些天书一样的字符。但是理解语法并不是成为程序员的最大的挑战。在更大的障碍面前,它很快将变成微不足道。仅仅以掌握一门编程语言的语法为目标,你可能能够 _阅读_ 代码,但是无法做到 _编写_ 代码以解决全新的问题。
|
||||
|
||||
我最近学习了 Codecademy 的 《编程基础》 课程。如果你对编程感兴趣(而不是对网页开发或者数据科学),并且没有任何编程经验,这是 Codecademy 推荐你学习的课程。里面有几节关于计算机科学史的课时,不过都是流于表面而没有深入研究。(感谢上帝,[一位高尚的互联网秩序义务维护者][12] 指出了其中存在的一个特别恶劣的错误)。该课程的主要目的是教授你编程语言的通用结构要素:变量、函数、控制流、循环等。换句话说,该课程聚焦于为了让你理解天书般的代码中的模式,而所需要知道的内容。
|
||||
|
||||
公平地看,Codecademy 也提供了其他内容深入的课程。但是即使是如 《计算机科学之路》 这样的课程也几乎只仅仅专注于编程以及程序中表达的概念。有人可能会反驳说这才是重点 —— Codecademy 的主要特点就是提供给你一些交互式的、带有自动反馈的编程课程。在有限的自动化课程中能够灌输给学员的内容只有这么多,因此学员的脑海里也没有更多的空间容纳更多其他的内容。但是负责启动计算机认知计划的 BBC 的制作人也面临同样的问题。他们意识到受限于他们的传播媒介,“通过电视节目所能获得的学习内容的容量也是受限的”[^8]。虽然在他们所能传达的信息总量上存在相似的限制,但是 BBC 的制作人选择强调在学习 BASIC 语言上的一般原则。难道 Codecademy 就不能将其中一两节交互式可视化的课时替换为编织经线与纬线的 Jacquard 织机的案例吗?
|
||||
|
||||
我一直在大声鼓吹 “一般原则”,因此让我再解释下我认为的一般原则是什么,以及为什么它们如此重要。J. Clark Scott 出了一本有关计算机的书,书名为 《<ruby>但是它怎么知道?<rt>But How Do It Know?</rt></ruby>》。这个书名来自书的序言里的一则笑话:一个店员向人群推销保温瓶,说保温瓶可以让热食始终是热的,冷食始终是冷的。一名听众对这个新发明感到惊讶,问道,但是它怎么知道(根据你给它的食物类型的不同选择做相应的事情呢)?笑点在于保温瓶当然不能感知食物的温度然后据此做出决定 —— 保温瓶仅仅制作成保证冷食必然保持冷的,热食必然保持热的就可以了。人们也以(笑话中的那个听众)一样的方式看待计算机,相信计算机就是数字大脑,能够基于提供给它们的代码 “选择” 做一件事或者另一件事。但是了解一些有关计算机如何工作的知识,哪怕是很初级水平的理解,也能让(人们理解中的)计算机摆脱(做判断的)侏儒。这就是为什么 Jacquard 织机是一个很好的有助理解的例子。一开始它似乎是一种难以置信的设备,它读取打孔卡片,然后以某种方式“知道”编织正确的样式。现实是显而易见的:每一行孔都对应一根线,而一行中有孔的地方对应着提起的线。理解了这些虽然不会有助于你用计算机完成新的事情,但是将使你自信于你不是在跟某些神秘事物打交道。我们应当尽快将这种自信的感受传授给初学者。
|
||||
|
||||
唉,可能真正的问题是没有人想要了解 Jacquard 织机。根据 Codecademy 如何强调他们教授的专业应用来判断,很多人开始使用 Codecademy 可能是因为他们相信这有助于 “提升” 他们的职业水平。他们没有来由地相信,首要的问题是理解编程的专业术语,因此他们才想要 “学习编码”。他们想要在他们所拥用的。每天晚上晚餐与就寝之间的一两个小时里尽快完成这件事。Codecademy 毕竟只是一门投其所好的生意,而非一些有关 18 世纪就发明了的机器的间接说明。
|
||||
|
||||
另一方面,计算机认知计划是供职于 BBC 的一群制作人与公务员所认为的,将计算机的使用教给国民的最好的方式。我承认,因为这一群人教会大众他们无法以己之力所能求得的事物,而赞美这一群人的建议多少有点精英主义。但我情不自禁认为他们做对了。许多人使用 BBC Micro 第一次学会了使用计算机,他们中的很多人进而成为了成功的软件开发者或游戏设计师。[正如我曾经所说的][14],我怀疑在计算机已经变得相对简单的时代里,学习使用计算机是一个巨大的优势。不过或许这群人所拥有的另一个优势在于有像 《计算机程序》 这样的尽己所能不仅仅教授编程,而且教授计算机是为什么又是如何运行程序的节目。在看完 《计算机程序》 之后,你可能并不能理解计算机屏幕上的所有天书般的编程术语,但是实际上你也并不需要,因为你知道无论 “代码” 是什么样子,计算机总是在重复做基础的事情。在完成了 Codecademy 上的一到两个课程之后,你可能能够感受一些天书般的编程术语,但是对你来说,一台计算机仍然只是一台能够以某种方式将天书般的字符转化为运行的软件的魔法机器。但这并不是计算机认知。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://twobithistory.org/2019/03/31/bbc-micro.html
|
||||
|
||||
作者:[Two-Bit History][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://twobithistory.org
|
||||
[b]: https://github.com/lujun9972
|
||||
[4]: https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/
|
||||
[5]: https://twobithistory.org/2018/07/22/dawn-of-the-microcomputer.html
|
||||
[9]: https://twobithistory.org/images/beeb.jpg
|
||||
[10]: https://twitter.com/TwoBitHistory/status/1112372000742404098
|
||||
[12]: https://twitter.com/TwoBitHistory/status/1111305774939234304
|
||||
[14]: https://twobithistory.org/2018/09/02/learning-basic.html
|
||||
[15]: https://twitter.com/TwoBitHistory
|
||||
[16]: https://twobithistory.org/feed.xml
|
||||
[17]: https://twitter.com/TwoBitHistory/status/1091148050221944832?ref_src=twsrc%5Etfw
|
||||
[20]: https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/media/Towards%20Computer%20Literacy.pdf
|
||||
|
||||
|
||||
[^1]: Robert Albury and David Allen, Microelectronics, report (1979).
|
||||
[^2]: Gregg Williams, “Microcomputing, British Style”, Byte Magazine, 40, January 1983, accessed on March 31, 2019, <https://archive.org/stream/byte-magazine-1983-01/1983_01_BYTE_08-01_Looking_Ahead#page/n41/mode/2up>.
|
||||
[^3]: John Radcliffe, “Toward Computer Literacy,” Computer Literacy Project Achive, 42, accessed March 31, 2019, <https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/media/Towards%20Computer%20Literacy.pdf>.
|
||||
[^4]: David Allen, “About the Computer Literacy Project,” Computer Literacy Project Archive, accessed March 31, 2019, <https://computer-literacy-project.pilots.bbcconnectedstudio.co.uk/history>.
|
||||
[^5]: ibid.
|
||||
[^6]: Williams, 51.
|
||||
[^7]: Radcliffe, 11.
|
||||
[^8]: Radcliffe, 5.
|
||||
|
||||
[T1]: https://www.codecademy.com/
|
||||
[T2]: https://bbcmicro.computer/
|
||||
[T3]: https://clp.bbcrewind.co.uk/history
|
||||
[T4]: https://archive.org/details/byte-magazine?tab=about
|
||||
[T5]: https://www.bbc.co.uk/iplayer/episode/p01z4rrj/horizon-19771978-now-the-chips-are-down
|
||||
[T6]: https://archive.org/details/BBCHorizon19771978NowTheChipsAreDown
|
||||
[T7]: https://en.wikipedia.org/wiki/Sinclair_Research
|
||||
[T8]: https://en.wikipedia.org/wiki/Breakout_(video_game)
|
||||
[T9]: https://www.scienceandindustrymuseum.org.uk/objects-and-stories/jacquard-loom
|
||||
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/23/131931eegzjokllq1j440z.jpg
|
162
published/202301/20210718 Is Open-Source Software Secure.md
Normal file
162
published/202301/20210718 Is Open-Source Software Secure.md
Normal file
@ -0,0 +1,162 @@
|
||||
[#]: subject: (Is Open-Source Software Secure?)
|
||||
[#]: via: (https://news.itsfoss.com/open-source-software-security/)
|
||||
[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (CanYellow)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-15423-1.html)
|
||||
|
||||
开源软件安全吗?
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
作为一个偏爱 [在桌面电脑上使用 Linux][1],并鼓励使用开源软件的人,你可能期待就标题中提出的问题得到一个响亮的**肯定**回答。
|
||||
|
||||
然而,我并不打算仅限于讨论开源软件的优点。让我们一起探索更多观点!
|
||||
|
||||
在本文,我计划分享我关于开源软件是否安全的思考,以及哪些事情与开源软件的安全性相关。
|
||||
|
||||
### 为什么你需要关注开源软件是否安全?
|
||||
|
||||
不论你是使用 [Linux][2] 系统还是使用其他类型的操作系统,你都会在某种程度上(直接地/间接地)被开源软件所包围。
|
||||
|
||||
举个例子,大多数专有软件工具依赖于某种形式的开源库来保证其正常工作。
|
||||
|
||||
此外,各种规模的公司(包括谷歌、微软和 Facebook)依赖开源软件或者以某种途径向开源社区贡献资源是有原因的。
|
||||
|
||||
因此,开源软件的安全性是有必要了解的。
|
||||
|
||||
### 有关开源软件安全性的迷思
|
||||
|
||||
![][3]
|
||||
|
||||
虽然有多种理由证明开源软件在安全性方面的缺陷,然而其中一些实际毫无意义。
|
||||
|
||||
#### 任何人都可以查看并恶意利用开源软件代码
|
||||
|
||||
是的,开源软件代码对于任何人都是可访问的。但是你可以查看代码并不意味着你可以利用它。
|
||||
|
||||
**不现实。**
|
||||
|
||||
即使任何人都可以复刻(或者拷贝)该软件,原始软件也不能轻易地被修改使用。
|
||||
|
||||
通常,项目维护人员(或者维护团队)管理代码仓库,并且接受来自贡献者的提交。开源软件代码在接受之前会被审查。没有人可以就这样劫持代码。
|
||||
|
||||
**不论是开源软件还是闭源软件,攻击者都需要付出努力来利用软件中的代码漏洞或者添加恶意代码。**
|
||||
|
||||
#### 没有专职团队,安全性无从谈起
|
||||
|
||||
很多人相信如果开源软件没有专职人员或者专职团队,维护软件安全性是困难的。
|
||||
|
||||
恰恰相反,由于各种各样类型的贡献者的加入与离开,开源软件获得了来自更大范围的开发者的更多关注。
|
||||
|
||||
他们可能比由专有软件所聘用的少数开发者更能够发现安全问题。
|
||||
|
||||
一些来自 Mozilla 等同类公司的项目拥有自己的专职团队来高效处理安全问题。同样的,大部分成功的开源项目拥有大量的资源用于保障安全性。
|
||||
|
||||
因此,开源软件的生态系统是安全性的组合包。即使没有专职团队,开源项目也可以得到来自各类贡献者的帮助,他们中的一些很大程度上是有利可图的,这有助于他们投入更多的精力。
|
||||
|
||||
### 开源软件是安全的,以下是原因
|
||||
|
||||
![][5]
|
||||
|
||||
既然我们已经澄清了这些有关开源软件安全性的迷思,让我重点展示一下开源软件是如何处理安全问题的。
|
||||
|
||||
换句话说,开源软件在安全性上的优势。
|
||||
|
||||
请不要忘记,开源软件的优势也是 [Linux 比 Windows 更好][4] 的一些原因。
|
||||
|
||||
#### 更多的眼晴关注开源软件代码
|
||||
|
||||
不像专有软件,(对开源软件的)代码访问并不局限于少数几个开发者。
|
||||
|
||||
一些开源项目甚至可能拥有数以万记的开发者可以查看代码、审查它们并标记和修复其中的安全性问题。
|
||||
|
||||
相比闭源软件,这给予了开源项目拥有**快速识别问题并尽快修复它们的能力**的优势。
|
||||
|
||||
不仅仅限于拥有更多的开发者,企业通常也会参与他们所使用的开源项目。当他们这样做的时候,他们也会查阅代码并审查它们。
|
||||
|
||||
这提供了另一条外部审查的途径,而这可能有助于提升开源软件的安全性。
|
||||
|
||||
反之,就闭源软件而言,数量有限的开发者可能并不能找出所有种类的安全问题。而且他们可能需要花费更长的时间来一一修复发现的问题。
|
||||
|
||||
#### 社区决定安全问题的优先级
|
||||
|
||||
闭源软件的开发者可能在处理什么问题和什么时候解决问题等方面有某些限制或者优先等级。
|
||||
|
||||
而如果是开源项目,贡献者社区可以自行决定优先级,并自行安排他们想解决的问题以及决定合适修复问题。你不需要依赖于供应商的决定或者按照他们的指示来解决一个安全问题。
|
||||
|
||||
着手处理和修复安全问题的决策在开源软件项目中更加透明和灵活。因此,它可以被证明是更有效的,并为你带来以下三个益处:
|
||||
|
||||
* 透明度
|
||||
* 不依赖供应商
|
||||
* 更快的安全更新
|
||||
|
||||
### 开源软件不是防弹的,以下是原因
|
||||
|
||||
![][6]
|
||||
|
||||
虽然在某些情况下,开源软件可能在安全性上具有优势,然而仍有一些因素影响它。
|
||||
|
||||
承认这些问题的存在是很重要的,据此,企业或者个人可以就开源软件的安全情况做出更好的决定。
|
||||
|
||||
#### 并无足够的眼睛来审查代码和不确定性
|
||||
|
||||
即使开源软件代码可以被全世界的开发者自由访问,**项目没有足够的贡献者/开发者彻底审查开源代码**的可能性仍然存在。
|
||||
|
||||
既如此,我们不能对开源软件的同行审查抱有极高的信心,因为它恰好缺失了这一点。
|
||||
|
||||
开源软件可能“声称”拥有最高的安全性因为它们是开源的。在没有足够的开发者致力于该项目时,这是一种误导。
|
||||
|
||||
同样,我们也无从得知有多少开发者在查看/检查代码,也不知道代码的检查进行到什么程度了。
|
||||
|
||||
举例而言,<ruby>[心脏出血漏洞][T1]<rt>Heartbleed</rt></ruby> 是在一个被广泛使用的项目(OpenSSL)中引入了 2 年以后才被发现的。
|
||||
|
||||
#### 软件责任与问责
|
||||
|
||||
对于个人用户这可能并不重要,但是**开源项目通常并无任何保证**。
|
||||
|
||||
因此,如果一家公司使用它,它们必须自行承担任何由该软件使用造成的数据丢失与损坏。
|
||||
|
||||
这告诉你,没有什么是 100% 安全和没有漏洞的。无论有多少眼睛聚焦在代码上或者贡献者的技术多么精湛,总会存在某种形式的风险,无论是安全风险还是数据丢失。
|
||||
|
||||
这告诉我们一个现实:开源软件并非防弹的。
|
||||
|
||||
### 开源软件有其更高安全性的优势,但是...
|
||||
|
||||
就安全性而言没有什么优胜者。不论是闭源还是开源,当涉及安全问题时都适用同一套原则。
|
||||
|
||||
有很多外部因素可以影响软件安全性,而**其中很多因素并不依赖于源代码**。
|
||||
|
||||
必须以某种形式监控代码,以保证安全。
|
||||
|
||||
是的,**开源道路提供了闭源软件所不具备的优势**,但是这并不意味着开源软件是防弹的。
|
||||
|
||||
_你对开源软件安全状况有何思考?你又是否认为开源软件比专有软件解决方案更好呢?_
|
||||
|
||||
提前感谢你在下面的评论中提出的宝贵意见。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/open-source-software-security/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://news.itsfoss.com/linux-foundation-linux-desktop/
|
||||
[2]: https://itsfoss.com/what-is-linux-distribution/
|
||||
[3]: https://news.itsfoss.com/content/images/wordpress/2021/07/hacker-exploit-illustration.png
|
||||
[4]: https://itsfoss.com/linux-better-than-windows/
|
||||
[5]: https://news.itsfoss.com/content/images/wordpress/2021/07/open-source-security-illustration.png
|
||||
[6]: https://news.itsfoss.com/content/images/wordpress/2021/07/open-source-security-issue.jpg
|
||||
|
||||
[T1]: https://www.cve.org/CVERecord?id=CVE-2014-0160
|
||||
[0]: https://news.itsfoss.com/content/images/size/w2000/wordpress/2021/07/open-source-security.jpg
|
275
published/202301/20211012 Create a timer on Linux.md
Normal file
275
published/202301/20211012 Create a timer on Linux.md
Normal file
@ -0,0 +1,275 @@
|
||||
[#]: subject: "Create a timer on Linux"
|
||||
[#]: via: "https://opensource.com/article/21/10/linux-timers"
|
||||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "FigaroCao"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15427-1.html"
|
||||
|
||||
在 Linux 中创建定时器
|
||||
======
|
||||
|
||||
> 这是一个演示如何创建 POSIX 兼容的间隔定时器的教程。
|
||||
|
||||
![][0]
|
||||
|
||||
对开发人员来说,定时某些事件是一项常见任务。定时器的常见场景是看门狗、任务的循环执行,或在特定时间安排事件。在这篇文章中,我将演示如何使用 [timer_create(...)][2] 创建一个 POSIX 兼容的间隔定时器。
|
||||
|
||||
你可以从 [GitHub][3] 下载下面样例的源代码。
|
||||
|
||||
### 准备 Qt Creator
|
||||
|
||||
我使用 [Qt Creator][4] 作为该样例的 IDE。为了在 Qt Creator 运行和调试样例代码,请克隆 [GitHub][3] 上的仓库,打开 Qt Creator,在 “<ruby>文件<rt>File</rt></ruby> -> <ruby>打开文件或项目……<rt>Open File or Project...</rt></ruby>” 并选择 “CMakeLists.txt”:
|
||||
|
||||
![Qt Creator open project][5]
|
||||
|
||||
*在 Qt Creator 中打开项目*
|
||||
|
||||
选择工具链之后,点击 “<ruby>配置项目<rt>Configure Project</rt></ruby>”。这个项目包括三个独立的样例(我们在这篇文章中将只会用到其中的两个)。使用绿色标记出来的菜单,可以在每个样例的配置之间切换,并为每个样例激活在终端运行 “<ruby>在终端中运行<rt>Run in terminal</rt></ruby>”(用黄色标记)。当前用于构建和调试的活动示例可以通过左下角的“<ruby>调试<rt>Debug</rt></ruby>” 按钮进行选择(参见下面的橙色标记)。
|
||||
|
||||
![Project configuration][6]
|
||||
|
||||
*项目配置*
|
||||
|
||||
### 线程定时器
|
||||
|
||||
让我们看看 `simple_threading_timer.c` 样例。这是最简单的一个。它展示了一个调用了超时函数 `expired` 的间隔定时器是如何被创建的。在每次过期时,都会创建一个新的线程,在其中调用函数 `expired`:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
void expired(union sigval timer_data);
|
||||
|
||||
pid_t gettid(void);
|
||||
|
||||
struct t_eventData{
|
||||
int myData;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
int res = 0;
|
||||
timer_t timerId = 0;
|
||||
|
||||
struct t_eventData eventData = { .myData = 0 };
|
||||
|
||||
/* sigevent 指定了过期时要执行的操作 */
|
||||
struct sigevent sev = { 0 };
|
||||
|
||||
/* 指定启动延时时间和间隔时间
|
||||
* it_value和it_interval 不能为零 */
|
||||
|
||||
struct itimerspec its = { .it_value.tv_sec = 1,
|
||||
.it_value.tv_nsec = 0,
|
||||
.it_interval.tv_sec = 1,
|
||||
.it_interval.tv_nsec = 0
|
||||
};
|
||||
|
||||
printf("Simple Threading Timer - thread-id: %d\n", gettid());
|
||||
|
||||
sev.sigev_notify = SIGEV_THREAD;
|
||||
sev.sigev_notify_function = &expired;
|
||||
sev.sigev_value.sival_ptr = &eventData;
|
||||
|
||||
/* 创建定时器 */
|
||||
res = timer_create(CLOCK_REALTIME, &sev, &timerId);
|
||||
|
||||
if (res != 0){
|
||||
fprintf(stderr, "Error timer_create: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* 启动定时器 */
|
||||
res = timer_settime(timerId, 0, &its, NULL);
|
||||
|
||||
if (res != 0){
|
||||
fprintf(stderr, "Error timer_settime: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
printf("Press ETNER Key to Exit\n");
|
||||
while(getchar()!='\n'){}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void expired(union sigval timer_data){
|
||||
struct t_eventData *data = timer_data.sival_ptr;
|
||||
printf("Timer fired %d - thread-id: %d\n", ++data->myData, gettid());
|
||||
}
|
||||
```
|
||||
|
||||
这种方法的优点是在代码和简单调试方面用量小。缺点是由于到期时创建新线程而增加额外的开销,因此行为不太确定。
|
||||
|
||||
### 中断信号定时器
|
||||
|
||||
超时定时器通知的另一种可能性是基于 [内核信号][12]。内核不是在每次定时器过期时创建一个新线程,而是向进程发送一个信号,进程被中断,并调用相应的信号处理程序。
|
||||
|
||||
由于接收信号时的默认操作是终止进程(参考 [signal][13] 手册页),我们必须要提前设置好 Qt Creator,以便进行正确的调试。
|
||||
|
||||
当被调试对象接收到一个信号时,Qt Creator 的默认行为是:
|
||||
|
||||
* 中断执行并切换到调试器上下文。
|
||||
* 显示一个弹出窗口,通知用户接收到信号。
|
||||
|
||||
这两种操作都不需要,因为信号的接收是我们应用程序的一部分。
|
||||
|
||||
Qt Creator 在后台使用 GDB。为了防止 GDB 在进程接收到信号时停止执行,进入 “<ruby>工具<rt>Tools</rt></ruby> -> <ruby>选项<rt>Options</rt></ruby>” 菜单,选择 “<ruby>调试器<rt>Debugger</rt></ruby>”,并导航到 “<ruby>本地变量和表达式<rt>Locals & Expressions</rt></ruby>”。添加下面的表达式到 “<ruby>定制调试助手<rt>Debugging Helper Customization</rt></ruby>”:
|
||||
|
||||
```
|
||||
handle SIG34 nostop pass
|
||||
```
|
||||
|
||||
![Signal no stop with error][14]
|
||||
|
||||
*Sig 34 时不停止*
|
||||
|
||||
你可以在 [GDB 文档][15] 中找到更多关于 GDB 信号处理的信息。
|
||||
|
||||
接下来,当我们在信号处理程序中停止时,我们要抑制每次接收到信号时通知我们的弹出窗口:
|
||||
|
||||
![Signal 34 pop up box][16]
|
||||
|
||||
*Signal 34 弹出窗口*
|
||||
|
||||
为此,导航到 “GDB” 标签并取消勾选标记的复选框:
|
||||
|
||||
![Timer signal windows][17]
|
||||
|
||||
*定时器信号窗口*
|
||||
|
||||
现在你可以正确的调试 `signal_interrupt_timer`。真正的信号定时器的实施会更复杂一些:
|
||||
|
||||
```
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#define UNUSED(x) (void)(x)
|
||||
|
||||
static void handler(int sig, siginfo_t *si, void *uc);
|
||||
pid_t gettid(void);
|
||||
|
||||
struct t_eventData{
|
||||
int myData;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
int res = 0;
|
||||
timer_t timerId = 0;
|
||||
|
||||
struct sigevent sev = { 0 };
|
||||
struct t_eventData eventData = { .myData = 0 };
|
||||
|
||||
/* 指定收到信号时的操作 */
|
||||
struct sigaction sa = { 0 };
|
||||
|
||||
/* 指定启动延时的时间和间隔时间 */
|
||||
struct itimerspec its = { .it_value.tv_sec = 1,
|
||||
.it_value.tv_nsec = 0,
|
||||
.it_interval.tv_sec = 1,
|
||||
.it_interval.tv_nsec = 0
|
||||
};
|
||||
|
||||
printf("Signal Interrupt Timer - thread-id: %d\n", gettid());
|
||||
|
||||
sev.sigev_notify = SIGEV_SIGNAL; // Linux-specific
|
||||
sev.sigev_signo = SIGRTMIN;
|
||||
sev.sigev_value.sival_ptr = &eventData;
|
||||
|
||||
/* 创建定时器 */
|
||||
res = timer_create(CLOCK_REALTIME, &sev, &timerId);
|
||||
|
||||
if ( res != 0){
|
||||
fprintf(stderr, "Error timer_create: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* 指定信号和处理程序 */
|
||||
sa.sa_flags = SA_SIGINFO;
|
||||
sa.sa_sigaction = handler;
|
||||
|
||||
/* 初始化信号 */
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
||||
printf("Establishing handler for signal %d\n", SIGRTMIN);
|
||||
|
||||
/* 注册信号处理程序 */
|
||||
if (sigaction(SIGRTMIN, &sa, NULL) == -1){
|
||||
fprintf(stderr, "Error sigaction: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* 启动定时器 */
|
||||
res = timer_settime(timerId, 0, &its, NULL);
|
||||
|
||||
if ( res != 0){
|
||||
fprintf(stderr, "Error timer_settime: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
printf("Press ENTER to Exit\n");
|
||||
while(getchar()!='\n'){}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
handler(int sig, siginfo_t *si, void *uc)
|
||||
{
|
||||
UNUSED(sig);
|
||||
UNUSED(uc);
|
||||
struct t_eventData *data = (struct t_eventData *) si->_sifields._rt.si_sigval.sival_ptr;
|
||||
printf("Timer fired %d - thread-id: %d\n", ++data->myData, gettid());
|
||||
}
|
||||
```
|
||||
|
||||
与线程定时器相比,我们必须初始化信号并注册一个信号处理程序。这种方法性能更好,因为它不会导致创建额外的线程。因此,信号处理程序的执行也更加确定。缺点显然是正确调试需要额外的配置工作。
|
||||
|
||||
### 总结
|
||||
|
||||
本文中描述的两种方法都是接近内核的定时器的实现。不过,即使 [timer_create(...)][2] 函数是 POSIX 规范的一部分,由于数据结构的细微差别,也不可能在 FreeBSD 系统上编译样例代码。除了这个缺点之外,这种实现还为通用计时应用程序提供了细粒度控制。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/10/linux-timers
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[FigaroCao](https://github.com/FigaroCao)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hansic99
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist)
|
||||
[2]: https://linux.die.net/man/2/timer_create
|
||||
[3]: https://github.com/hANSIc99/posix_timers
|
||||
[4]: https://www.qt.io/product/development-tools
|
||||
[5]: https://opensource.com/sites/default/files/posix_timers_open_project_0.png
|
||||
[6]: https://opensource.com/sites/default/files/posix_timers_project_configuration_2.png
|
||||
[7]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html
|
||||
[8]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html
|
||||
[9]: http://www.opengroup.org/onlinepubs/009695399/functions/strerror.html
|
||||
[10]: http://www.opengroup.org/onlinepubs/009695399/functions/exit.html
|
||||
[11]: http://www.opengroup.org/onlinepubs/009695399/functions/getchar.html
|
||||
[12]: https://man7.org/linux/man-pages/man3/signal.3p.html
|
||||
[13]: https://linux.die.net/man/7/signal
|
||||
[14]: https://opensource.com/sites/default/files/posix_timers_sig34_nostop_pass.png
|
||||
[15]: https://sourceware.org/gdb/onlinedocs/gdb/Signals.html
|
||||
[16]: https://opensource.com/sites/default/files/posix_timers_sig34_pop_up_2.png
|
||||
[17]: https://opensource.com/sites/default/files/posix_timers_signal_windows.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/09/150238f1d60cmvssr9d0js.jpg
|
@ -0,0 +1,109 @@
|
||||
[#]: subject: "Pandas: The Popular Python Library for Data Analysis and Data Science"
|
||||
[#]: via: "https://www.opensourceforu.com/2022/08/pandas-the-popular-python-library-for-data-analysis-and-data-science/"
|
||||
[#]: author: "Phani Kiran https://www.opensourceforu.com/author/phani-kiran/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "chai001125"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15484-1.html"
|
||||
|
||||
Pandas:用于数据分析和数据科学的最热门 Python 库
|
||||
======
|
||||
|
||||
> Pandas 是一个十分流行的 Python 第三方库。本文介绍了 Pandas 库中的一些特性和函数,并且我们鼓励读者亲手使用 Pandas 库,来解决实际的业务问题。
|
||||
|
||||
Pandas 为 Python 中数据分析提供了基础和高级的构建组件。Pandas 库是用于数据分析与数据操作的最强大和最灵活的开源**分析工具**之一,并且它还提供了用于建模和操作表格数据(以行和列组织的数据)的**数据结构**。
|
||||
|
||||
Pandas 库有两个主要的数据结构:第一个是 “<ruby>系列<rt>Series</rt></ruby>”,该数据结构能够很方便地从 Python 数组或字典中**按位置或指定的索引名称**来检索数据;第二个是“<ruby>数据帧<rt>DataFrames</rt></ruby>”,该数据结构将数据存储在行和列中。列可以通过列名访问,行通过索引访问。列可以有不同类型的数据,包括列表、字典、序列、数据帧、NumPy 数组等。
|
||||
|
||||
### Pandas 库可以处理各种文件格式
|
||||
|
||||
有各种各样的文件格式。用于数据分析的工具必须能够提供处理各种文件格式的方法。
|
||||
|
||||
Pandas 可以读取各种文件格式,例如 CSV 文件、JSON 文件、XML 文件、Parquet 文件、SQL 文件,详见下表。
|
||||
|
||||
| | 写入 | 读取 |
|
||||
| :- | :- | :- |
|
||||
| CSV 文件 | `to_csv` 函数 | `read_csv` 函数 |
|
||||
| JSON 文件 | `to_json` 函数 | `read_json` 函数 |
|
||||
| Parquet 文件 | `to_parquet` 函数 | `read_parquet` 函数 |
|
||||
| SQL 文件 | `to_sql` 函数 | `read_sql` 函数,`read_sql_query` 函数,`read_sql_table` 函数 |
|
||||
| XML 文件 | `to_xml` 函数 | `read_xml` 函数 |
|
||||
|
||||
### 使用 Pandas 进行数据清理
|
||||
|
||||
在现实场景中,很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。此外,数据还会有需要 <ruby>屏蔽<rt>mask</rt></ruby> 的敏感和机密信息。接下来,Pandas 提供了清理、丢弃、替换、屏蔽等方法,来处理这些坏数据。
|
||||
|
||||
#### Pandas 清洗空值:
|
||||
|
||||
a. 空行可以使用 `df.dropna(inplace=True)` 方法来删除。
|
||||
|
||||
b. 空值可以使用 `df.fillna(<value>, inplace=True)` 方法来替换。还可以指定某一个列来替换该列的空数据。
|
||||
|
||||
#### Pandas 屏蔽数据:
|
||||
|
||||
c. 要屏蔽所有不满足条件 `my_list.where(my_list < 5)` 的敏感数据的值,可以使用 `my_list.mask(my_list < 5)`。
|
||||
|
||||
#### Pandas 清洗重复数据:
|
||||
|
||||
d. 要删除重复数据,可以使用 `drop_duplicates()` 方法:
|
||||
|
||||
```
|
||||
df.drop_duplicates(‘<column>’, keep = False)
|
||||
df.drop_duplicates(‘<column>’, keep = ‘first’)
|
||||
df.drop_duplicates(‘<column>’, keep = ‘last’)
|
||||
```
|
||||
|
||||
### 使用 Pandas 进行数据分析
|
||||
|
||||
下面的表格列出了 Pandas 中进行数据分析的各种函数,以及其语法。(请注意:`df` 代表一个 <ruby>数据帧<rt>DataFrame</rt></ruby> 数据结构的实例。)
|
||||
|
||||
| 语法 | 描述 |
|
||||
| :- | :- |
|
||||
| `df.head(x)` | `head()` 函数用于读取前面的 x 行,如果不填参数 x,默认返回 5 行 |
|
||||
| `df.tail(x)` | `tail()` 函数用于读取尾部的 x 行,如果不填参数 x ,默认返回最后 5 行,空行各个字段的值返回 NaN |
|
||||
| `loc(x:y)` | Loc 函数返回指定行的数据,也可以对数据进行切片 |
|
||||
| `groupby('<column>')` | 对指定列的数据进行分组 |
|
||||
| `df['column'].sum()` | 计算指定列数据的总和 |
|
||||
| `df['column']. mean()` | 计算指定列数据的算术平均值 |
|
||||
| `df['column'].min()` | 计算指定列数据的最小值 |
|
||||
| `df['column'].max()` | 计算指定列数据的最大值 |
|
||||
| `df.sort_values(['column'])` | 在指定列上根据数值进行排序,默认升序 |
|
||||
| `df.size` | 返回元素的个数,即为行数 * 列数 |
|
||||
| `df.describe` | 返回对各列的统计汇总 |
|
||||
| `pd.crosstab(df['column1'], df['column2'], margins = True)` | 创建 `column1` 和 `column2` 的交叉表 |
|
||||
| `df.duplicated([column1, 'column2'])` | 根据 `column1` 和 `column2` 中的重复值,返回 `True` 或 `False` |
|
||||
|
||||
### Pandas 的优点
|
||||
|
||||
* 支持多索引(层次索引),方便分析多维数据。
|
||||
* 支持数据透视表的创建,堆栈和取消堆栈操作。
|
||||
* 可以使用 Pandas 处理有限值的分类数据。
|
||||
* 支持分组和聚合运算。
|
||||
* 可以禁用排序。
|
||||
* 支持行级过滤(获取满足过滤条件的行)和列级过滤(只选择需要的列)。
|
||||
* 有助于重塑数据集(数组的维度变换)。还可以转置数组的值,并转换为列表。当你使用 Python 处理数据时,可以将 Pandas 数据帧转换为多维 NumPy 数组。
|
||||
* 支持面向标签的数据切片。
|
||||
|
||||
### Pandas 的不足
|
||||
|
||||
Pandas 的代码和语法与 Python 不同,所以人们需要额外再学习 Pandas。此外,相较于 Pandas,像三维数据这样的高维数据会在 NumPy 等其他库有更好的处理。
|
||||
|
||||
### 总结
|
||||
|
||||
Pandas 能够大幅提升数据分析的效率。它与其他库的兼容性使它在其他 Python 库中都能有效地使用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2022/08/pandas-the-popular-python-library-for-data-analysis-and-data-science/
|
||||
|
||||
作者:[Phani Kiran][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[chai001125](https://github.com/chai001125)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.opensourceforu.com/author/phani-kiran/
|
||||
[b]: https://github.com/lkxed
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/27/163400o6afgegh0nf4nfec.jpg
|
@ -0,0 +1,107 @@
|
||||
[#]: subject: "Give your Terminal a Retro Look Using this Neat Application"
|
||||
[#]: via: "https://www.debugpoint.com/cool-retro-terminal/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15493-1.html"
|
||||
|
||||
给你的终端一个复古的外观
|
||||
======
|
||||
|
||||
> 想让你的终端有一个复古的外观?本指南将帮助你在 Linux 发行版中安装 Cool Retro Terminal 应用程序。
|
||||
|
||||
![酷炫复古终端][1]
|
||||
|
||||
你有没有想过如何在你的 Linux 终端中模仿那些老式 CRT 显示器的外观?
|
||||
|
||||
那些 CRT 屏幕有自己的粉丝。如果你把苹果 2 或 IBM 3278 终端之类与今天的 4K 显示器显示相比较,它们的外观真的很酷。我并不是说 4K 显示器不好,但有时传统的显示器会让我们想起那些过去的日子。闲话少说。让我们开始安装这个应用程序。
|
||||
|
||||
### Cool Retro Terminal
|
||||
|
||||
该应用程序是自由开源的。它被称为 [cool-retro-term][2]。它是轻量级的,有许多自定义选项,有预先设置的配置文件,如 Apple 2 等。它还能在你的终端中提供那些静态噪音和扫描线效果。很酷,不是吗?
|
||||
|
||||
它是用 Qt 构建的,需要 Qt 5.2 或更高版本。如果你使用的是最新的 Linux 发行版,在依赖性方面你应该没问题。
|
||||
|
||||
![绿色扫描线主题][3]
|
||||
|
||||
### 如何下载和安装 Cool Retro Terminal
|
||||
|
||||
Ubuntu、Linux Mint 和其他基于 Debian 的发行版:
|
||||
|
||||
使用下面的简单命令在你的 Ubuntu 和其他相关发行版中安装这个应用程序:
|
||||
|
||||
```
|
||||
sudo apt install cool-retro-term
|
||||
```
|
||||
|
||||
Arch Linux:
|
||||
|
||||
这个软件包在 Arch 用户仓库(AUR)中可用。如果你没有启用 AUR,请使用 [本指南][4] 启用它,然后使用以下命令来安装它:
|
||||
|
||||
```
|
||||
pacman -S cool-retro-term
|
||||
```
|
||||
|
||||
Fedora、RHEL 和其他相关发行版:
|
||||
|
||||
对于 Fedora 和其他相关的 Linux,使用下面的命令来安装这个应用程序:
|
||||
|
||||
```
|
||||
sudo dnf install cool-retro-term
|
||||
```
|
||||
|
||||
Appimage:
|
||||
|
||||
也有一个 AppImage 格式的独立的可执行程序,你可以直接下载并运行。不需要安装。按照下面的命令来做:
|
||||
|
||||
```
|
||||
wget https://github.com/Swordfish90/cool-retro-term/releases/download/1.1.1/Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||
chmod a+x Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||
./Cool-Retro-Term-1.1.1-x86_64.AppImage
|
||||
```
|
||||
|
||||
注意:在 GitHub 中,没有 1.2.0 以后的版本的 AppImage 构建版。
|
||||
|
||||
### 配置
|
||||
|
||||
安装完成后,你可以在应用程序菜单中找到终端应用程序 “Cool Retro Term”。那么,启动该应用程序并享受其中吧。
|
||||
|
||||
请记住,这覆盖你的 Linux 发行版中的默认控制台/终端应用程序。它是一个独立的控制台应用程序。
|
||||
|
||||
配置选项可以通过右键菜单访问。
|
||||
|
||||
上下文菜单给你提供了以下预设。然后你可以通过设置窗口对它们中的每一个进行颜色和外观设置的配置。例如,如果你想要更多的透明度、对比度或更多的噪音、环境光或闪烁。所有这些都可以从下面的设置窗口通过几个选项进行配置。
|
||||
|
||||
而且,你可以轻松地制作你自己的主题。
|
||||
|
||||
![Cool Retro Term 中的预装主题][5]
|
||||
|
||||
![设置中的各种效果][6]
|
||||
|
||||
### 总结
|
||||
|
||||
Cool Retro Terminal 是一个用于 Linux 桌面的老式显示管终端,它可以让你体验到如同坐在复古终端前的感觉。你可能喜欢,也可能不喜欢,而且人们几乎不把它作为日常使用。但它仍然是一个漂亮的终端,可以时不时地体验一下,以摆脱平凡的终端。
|
||||
|
||||
你喜欢复古的外观吗?你最喜欢的主题是什么?请在下面的评论区告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/cool-retro-terminal/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2021/12/cool-retro-terminal-1024x576.jpg
|
||||
[2]: https://github.com/Swordfish90/cool-retro-term
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2021/12/Green-Scanlines-Theme-1024x594.jpg
|
||||
[4]: https://www.debugpoint.com/2021/01/install-yay-arch/
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2021/12/Pre-loaded-Themes-in-Cool-Retro-Term-1024x599.jpg
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2021/12/Various-Effects-in-Settings.jpg
|
@ -0,0 +1,142 @@
|
||||
[#]: subject: "10 universal steps for open source code review"
|
||||
[#]: via: "https://opensource.com/article/22/10/code-review"
|
||||
[#]: author: "Martin Kopec https://opensource.com/users/martin-kopec"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "yzuowei"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15489-1.html"
|
||||
|
||||
开源代码评审的十个通用步骤
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 只要你遵循这些通用流程,代码评审并不可怕。
|
||||
|
||||
你是否需要在你还没有完全理解整个项目时就对代码进行评审?抑或你避开了评审,以免让你看起来不知道如何进行。
|
||||
|
||||
本篇文章想要告诉你一个更好的方法。<ruby>代码评审<rt>code review</rt></ruby> 并不需要你知道所有事情。实际上,就我个人经验而言,这种情况非常普遍。
|
||||
|
||||
我还记得作为实习生加入 <ruby>红帽<rt>Red Hat</rt></ruby> 的时候,被要求参与代码评审。我们当时采取的是 +1 或 -1 的投票系统,而我在一开始的时候常常踌躇于该如何评审。我发现我会问自己,如果我对于一处改动给予了 +1,而别人却投了 -1,我是不是看起来很蠢?
|
||||
|
||||
如果你对一处改动投了 +1,而别人投了 -1,这又意味着什么呢?答案是不意味任何事!你可能只是漏掉了一处别人注意到的细节。这不意味着世界末日。这也是为什么我们会用投票系统。正如同所有开源项目一样,代码合并是一项协同工作。
|
||||
|
||||
最近,我接到了太多的代码评审工作,以至于我几乎做不过来。我同时也注意到,参与评审的贡献者数量正在稳步减少。
|
||||
|
||||
出于这个原因,我想要写一篇文章阐述我对代码评审的个人观点。在这篇文章里,我会分享一些诀窍与技巧。我将会向你展示几个用来问自己的问题,以及在评审代码时需要注意的一些地方。
|
||||
|
||||
### 代码评审的目的是什么?
|
||||
|
||||
你是否曾写过一个非常简单的补丁?你认为它是如此微不足道,不需要审查。或许你直接就合并了它。直到晚些时候,你意识到你犯了个错误,一个明显的或是愚蠢的错误,比如错误的缩进,比如几行重复的代码而不是调用函数(是的,这些都是经验之谈!)。
|
||||
|
||||
如果有其他人来审查代码,就会发现这些东西。
|
||||
|
||||
代码评审的一个目的便是为你带来一双新的眼睛,从新的视角看待你要尝试解决的问题。这种新的背景也正是为什么代码评审至关重要。
|
||||
|
||||
你可能认为你必须是一个语言专家,才能审查别人的代码、项目,或两者。让我来告诉你一个所有代码评审者都想跟你说的秘密吧:大错特错!你并不需要完全理解该项目或者编程语言,就可以为一个改动提供全新的视角。下面,我将向你展示代码评审的通用流程。
|
||||
|
||||
### 代码评审的通用流程
|
||||
|
||||
这是我的代码评审流程,拆分成了几个要点。这个流程包含了我会问自己的一些问题,以帮助我专注于代码的变化以及其后果。你不需要严格依照这个顺序来进行评审。如果有任何原因导致你无法执行其中的某一步,跳过那一步就好。
|
||||
|
||||
#### 1、理解改动,它想要解决的问题,以及为什么要这么做
|
||||
|
||||
为什么需要改动的解释以及任何相关背景都应该被放在 <ruby>提交<rt>commit</rt></ruby> 信息里。如果没有,请要求提供,并请投 -1 直到相关信息被提供。
|
||||
|
||||
改动想解决的问题需要被解决吗?它是项目应当关注的问题,还是与项目完全无关?
|
||||
|
||||
#### 2、你会如何实现解决方案?它会不一样吗?
|
||||
|
||||
在这个时候,你应该已经知道代码改动是为了什么。换做是你会怎么做?在进一步对改动进行细节评审前,先思考这个问题。如果你想出了一个不一样的解决方案,并且你认为你的方案更好,在评审中提出来。你不需要投 -1;去问问作者为什么没有往那个方向走,看看这次讨论会把你们带向何方。
|
||||
|
||||
#### 3、运行有改动和没有改动的代码
|
||||
|
||||
我通常会在代码中设置几个断点,运行代码并检查新代码是如何与其余部分互动的。
|
||||
|
||||
如果你无法运行整个代码,试着将带有新代码的函数复制到一个新的本地文件,模拟输入数据,然后运行。这在你不知道怎么运行整个项目,或者无法接触到运行所需的特殊环境时很有帮助。
|
||||
|
||||
#### 4、新代码会破坏任何东西吗?
|
||||
|
||||
我是说,任何东西。想一想可能的后果。
|
||||
|
||||
以一个新的命令行选项为例,它会总是被目标所接受吗?
|
||||
|
||||
是否存在这样一种情况,使得新选项无法被接受或是会与其他东西起冲突?
|
||||
|
||||
或许新代码是导入了新的东西。那么这个新的库,以及可能的新的依赖关系,能够在老版本或者项目的运行系统中被找到吗?
|
||||
|
||||
安全方面呢?新的依赖足够安全吗?你至少可以在网上快速地搜索一下。还有,注意一下控制台日志里的警告。有的时候在同一个库里也可以找到更安全的函数。
|
||||
|
||||
#### 5、新代码是否有效?
|
||||
|
||||
你刚刚确认了被提出的解决方案大概是正确的。现在该检查代码本身了。你需要关注代码的有效性和必要性。
|
||||
|
||||
检查新代码的风格。它与项目的代码风格相匹配吗?任何开源项目都(应该)有一份文档告知(新)贡献者项目所遵循的风格和优秀实践。
|
||||
|
||||
比如说,OpenStack 社区的所有项目都有一份 HACKING.rst 文件。你经常也能找到一份[新贡献者指南][1]包含所有必须知道的信息。
|
||||
|
||||
#### 6、确认所有新增的变量和导入都被使用
|
||||
|
||||
你正在评审的代码常常已经过多次迭代,有的时候代码的最终版本与初始版已迥然不同。所以我们很容易忘记一些在历史版本中加入的变量与引用。自动化检测通常会用到 lint 工具,类似 Python 中的 [flake8][12]。
|
||||
|
||||
(LCTT 译注:[lint][5] 指编程中用来发现代码潜在错误和约束代码风格的工具,起源于 C 语言编程中的静态分析工具 `lint`。“lint” 本意为衣服上积累的绒毛与灰尘,“lint” 的取名寓意则在于捕捉编程时产生的“绒毛与灰尘”)
|
||||
|
||||
(LCTT 校注:我建议,“Lint” 工具可以翻译为 “代码清理” 或 “代码清洁” 工具。)
|
||||
|
||||
你可以在不声明新变量的情况下重写代码吗?通常情况下你可以,但问题是这样是否更好。这会带来什么益处吗?我们的目标不是要创造尽可能多的单行代码,而是写出高效且易读的代码。
|
||||
|
||||
#### 7、新的函数和方法是否必要?
|
||||
|
||||
项目里的别的地方是否存在可以被复用的功能类似的函数?确保避免重新发明轮子以及重新实现已经被定义的逻辑永远都是值得的。
|
||||
|
||||
#### 8、有单元测试吗?
|
||||
|
||||
如果补丁增加了新的函数或者在函数内添加了新的逻辑,它也应该附带对应的单元测试。新函数的作者总是比别人更适合写该函数的单元测试。
|
||||
|
||||
#### 9. 验证重构
|
||||
|
||||
如果这次提交对现有代码进行了重构(它可能重命名了某个变量,或者是改变了的变量的作用域,或者是通过加减参数来改变函数的足迹,又或者是删去了某个东西),问一问你自己:
|
||||
|
||||
- 这个可以被删除吗?它会影响到稳定分支吗?
|
||||
- 所有出现的地方都删掉了吗?
|
||||
|
||||
你可以利用 [grep 命令][3] 来查找。你不会相信有多少次我投 -1 就是因为这个。这是一个任何人都会犯的简单错误,也正因如此任何人都可以发现它。
|
||||
|
||||
提交的所有者很容易忽略这些事情,这完全可以理解。我也犯过很多次这种错误。我最终发现问题的根源在于我太急于提出评审,以至于我忘记了对仓库进行整体检查。
|
||||
|
||||
除了对项目仓库的检查外,检查其他代码用户也十分必要。如果有别的项目导入了这个项目,它们可能也需要进行重构。在 OpenStack 社区中,我们有对应的工具来查询别的社区项目。
|
||||
|
||||
#### 10、项目文档是否需要做出更改?
|
||||
|
||||
你可以再一次使用 [grep 命令][4] 来检查在项目文档中是否提到了相关的代码改动。用常识来判断这次改动是否需要被收入文档以告知最终用户,还是只是一个不会影响用户体验的内部变化。
|
||||
|
||||
#### 额外提示:考虑周到
|
||||
|
||||
当你在评审完新代码后提出建议或评论时,要考虑周到,反馈准确,描述详尽。如果有你不理解的地方就发出提问。如果你认为代码存在错误,解释你的理由。记住,如果作者不知道什么地方出了问题,他们就无法修复它。
|
||||
|
||||
### 最后几句
|
||||
|
||||
唯一的坏评审是没有评审。通过评审和投票,你提供了你的观点并为此投票。没有人指望你来做出最终决定(除非你是核心维护者),但是投票系统允许你提供你的观点和意见。相信我,补丁所有者会很高兴你这么做了的。
|
||||
|
||||
你能想到别的要点来给出好的评审吗?你是否有我不知道的特殊技巧?在评论中分享它们吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/10/code-review
|
||||
|
||||
作者:[Martin Kopec][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[yzuowei](https://github.com/yzuowei)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/martin-kopec
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://docs.openstack.org/tempest/latest/contributor/contributing.html
|
||||
[2]: https://opensource.com/article/19/5/python-flake8
|
||||
[3]: https://opensource.com/downloads/grep-cheat-sheet
|
||||
[4]: https://www.redhat.com/sysadmin/how-to-use-grep
|
||||
[5]: https://codedocs.org/what-is/lint-software
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/29/140840wsbypukbubp69buv.jpg
|
@ -0,0 +1,101 @@
|
||||
[#]: subject: "What you actually need to know about open source to get started"
|
||||
[#]: via: "https://opensource.com/article/22/11/get-started-open-source"
|
||||
[#]: author: "Katie Edwards https://opensource.com/users/kaedward"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "yzuowei"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15492-1.html"
|
||||
|
||||
关于开源,你需要知道些什么
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 一份用简单直白的语句来解释开源的新手指南。
|
||||
|
||||
要是你想要(或需要)知道 [开源][1] 的意思究竟是什么。我会介绍开源的一些基础,无论你是对项目贡献感兴趣,还是在想要融入的新工作圈子里总是听到这个名词,因为这个词总是被人不断的提起。
|
||||
|
||||
我坦白,我这个人没什么技术经验,在极具技术性的开源社区中从事着内容设计的边缘工作。考虑到我原来的背景是营销与传播,我决定换工作时感觉就像离了水的鱼儿。[Git][2]、数据科学、软件的来龙去脉……直到一年后的今天,我依然感到难以消化。
|
||||
|
||||
但这正是为什么我要写这篇文章。我想要让开源变得不那么令人生畏。毕竟,开源的中心是一个支持型的学习社区 —— 这个社区对所有人开放,无论你是否有技术经验。
|
||||
|
||||
我会从基础中的基础开始。
|
||||
|
||||
### 什么是开源?
|
||||
|
||||
在此声明,业界对开源的定义可以在 <ruby>[开放源代码促进会][3]<rt>Open Source Initiative</rt></ruby> 的网站找到。
|
||||
|
||||
然而,大众对“开源”软件的认知通常为它不用花钱,它的源代码是公开的,任何人都可以对其贡献,你可以重新发布它或者用它做任何你想做的事。
|
||||
|
||||
这里面有些是真的,而有些则属于常见的误解,其中之一就是关于花费。
|
||||
|
||||
#### 开源只要 0 元
|
||||
|
||||
这是真的吗?大部分情况下是,但不是所有情况。开源软件的本质在于代码的公开性,所以获取软件本身确实不需要花费。但是,依赖开源项目营利的公司也确实存在。但如果软件不需要花钱,开源公司又是如何生存的?他们该如何盈利?
|
||||
|
||||
拥有“免费产品”这个概念本身是反直觉的。但你要知道:一个公司不一定要靠出售软件来赚钱,它也可以从产品的管理,数据的储存,以及对客户的支持中获利。
|
||||
|
||||
很多公司都采用了订阅模式,他们提供客户支持服务以帮助客户解决软件问题并为客户解答疑惑。数据储存也并非免费,这也是能为公司带来收入的另一领域。从这个角度来说,在销售的“产品”不是软件,而是订阅服务。
|
||||
|
||||
- **开源代码是公开访问的**:这是真的吗?是的,永远都是。“开源”一词的先决条件正是这份公开性。源代码必须允许被查看、使用、修改和重新发布。
|
||||
- **你可以用这份代码做任何你想做的事**:这是真的吗?依情况而定。许可证条款会对你对代码的使用方式作出限制,但你通常都可以用代码做你想做的事。无论是调整该项目以满足特殊需求,还是以此为基础做些别的,开源软件允许你和其他所有人对其修改。
|
||||
- **任何人都可以贡献开源项目**:这是真的吗?是的,但有限制。所有有 [合适技能][4] 的人都可以贡献开源。但是,这不意味着所有的贡献都会被接受和采纳。
|
||||
|
||||
比如说,你对一个目标是对地球上所有的鸟类进行分类的项目感兴趣。你恰好很喜欢恐龙,特别是那些最终进化成如今的鸟类的恐龙。于是,你为所有最像鸟类的恐龙提交了条目。项目所有者在看到这些后可能会想:“不错,这都是些很棒的史前鸟类。”但他们也可能会认为:“嗯……这些恐龙看起来像鸟,但他们还不是鸟,因此他们不属于鸟类百科。”
|
||||
|
||||
幸运的是,项目里的工作通常有法可依。开源项目通常有着贡献指南和行为准则,所以你不用担心你会加入什么使得项目脱轨的东西。
|
||||
|
||||
### 为什么选择开源呢?
|
||||
|
||||
那么,在众多贡献之后(如果这些贡献完成的话),为什么人们愿意免费赠送他们的软件?如果有那么多人为此付出了时间与精力,他们为什么不能联合起来为软件明码标价?
|
||||
|
||||
这个问题有很多回答。我在这里给出了一些:
|
||||
|
||||
- 创业是艰难的,如果你开发的项目展现不出赚钱的潜力则尤其如此。召集一群志同道合的人,没有承诺也没有对薪水的期望,相对而言要简单得多。
|
||||
- 大部分开源社区的成员对软件的改进或者实现感兴趣,但他们没有时间或者不愿意将项目作为他们的全职工作。有时候开源代表的是热情驱动的项目、极客组成的团体,还有凝聚众人智慧对恼人问题的解决方案。
|
||||
- 围绕各种规模的开源项目形成的团体促进了支持型社区的成形,在这里贡献者与旁观者都可以练习他们的技能,改进他们常用的软件,互教互学,并为发声被听到而感到振奋。很多开源社区本质上就是高度集中的线上爱好者俱乐部。
|
||||
|
||||
### 我该如何参与呢?
|
||||
|
||||
现在你可能会问你自己:“我知道了这些信息又可以做些什么呢?我能贡献开源项目吗?如果我不够优秀的话该怎么办?”
|
||||
|
||||
不要害怕 —— 即便是 [新手][5] 也欢迎为开源项目做贡献。在与社区一起朝着更大的目标共同努力的同时,你也得到了一个磨练技能的绝佳机会。况且,正如我之前所说,最坏的情况也不过是你的提交不被“鸟类百科”所接受(而这也是因为项目的所有者看不到你对鸟类百科的愿景,那是一片关于鸟类知识的网络天地,鸟与他们的祖先在那里愉快地共存)。
|
||||
|
||||
你需要会写代码来贡献开源吗?与大众认知相违的是,[你不需要][6]。项目“需要举全村之力”以兴旺,这意味着他们需要来自不同背景的人的贡献。视觉设计师、撰稿人、营销、评审、翻译、主题爱好者,甚至只是最终产品的用户,都是可贵的贡献者。他们不仅是帮忙搭建并改进了产品,他们也识别出了漏洞,提出了修改建议,为项目做出宣传,最终使得社区强大。
|
||||
|
||||
简单来说,不论你的背景是什么,经验有多少,只要你对开源或是某个特别的项目感兴趣,你几乎可以保证会被张开双臂欢迎。
|
||||
|
||||
### 现在就加入开源吧
|
||||
|
||||
还是不确定应该从哪开始?这里有些能帮助你的想法和资源:
|
||||
|
||||
- [Up For Grabs][7] 是一份“专门为新贡献者策划任务的开源项目清单。”这里很适合新贡献者们来寻找简单的初次 PR 机会,这次机会也能让你探寻你更喜欢哪种贡献。
|
||||
- 来看看 GitHub 上的这份 [新手友好项目][8] 列表吧。
|
||||
- 如果你还是缺乏灵感,考虑一下[贡献][9](或一起“飞”) <ruby>红帽<rt>Red Hat</rt></ruby>的开放设计系统 [PatternFly][10]。
|
||||
- LCTT 夹带私货:你还可以通过参与 LCTT 的翻译工作来首次体验如何参与开源,这几乎简单到你只需要懂一点点英文和一些热情,本文就是由开源贡献者翻译贡献而成的。入口在此: https://linux.cn/lctt/
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/get-started-open-source
|
||||
|
||||
作者:[Katie Edwards][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[yzuowei](https://github.com/yzuowei)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/kaedward
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/resources/what-open-source
|
||||
[2]: https://opensource.com/resources/what-is-git
|
||||
[3]: https://opensource.org/osd
|
||||
[4]: https://opensource.com/life/16/1/8-ways-contribute-open-source-without-writing-code
|
||||
[5]: https://opensource.com/article/18/4/get-started-open-source-project
|
||||
[6]: https://opensource.com/article/22/8/non-code-contribution-powers-open-source
|
||||
[7]: https://up-for-grabs.net/?ref=hackernoon.com#/
|
||||
[8]: https://github.com/MunGell/awesome-for-beginners
|
||||
[9]: https://github.com/patternfly
|
||||
[10]: https://www.patternfly.org/v4/get-started/design
|
||||
[11]: https://img.linux.net.cn/data/attachment/album/202301/30/110936lhhk216wajijdh22.jpg
|
@ -0,0 +1,84 @@
|
||||
[#]: subject: "4 key differences between Twitter and Mastodon"
|
||||
[#]: via: "https://opensource.com/article/22/11/twitter-vs-mastodon"
|
||||
[#]: author: "Don Watkins https://opensource.com/users/don-watkins"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "onionstalgia"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15486-1.html"
|
||||
|
||||
Twitter 和 Mastodon 的四个关键区别
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Mastodon 并不是一家公司。所有 Mastodon 实例都由各自所属服务器的贡献者负责支持维护的。以下是它的一些其他优势。
|
||||
|
||||
社交媒体并不总是社交性的,有时我们还需要足够的推动力来改变我们工作和阅读的内容。我在 2008 年开始使用 Twitter 作为 RSS 阅读器的替代品,这彻底颠覆了我那时的阅读和学习方式。世界各地的教育家和自由与开放源码(FOSS)倡导者的推文让我了解并参与到一个无与伦比的学习网络中。但这在过去的六年间,事情发生了变化,以及最近它的所有权发生了变化,造成我阅读的内容更多是由算法驱动的,而不是出于我个人的兴趣和选择。在几年前的 Opensource.com 记者编辑碰头会中,[Seth Kenlon][1] 建议我试试 [Mastodon][2]。于是我在 2019 年加入了 [Fosstodon][3]。Fosstodon 是一个专为喜欢自由和开源软件的同好们搭建的实例。
|
||||
|
||||
### Mastodon 与 Twitter 对比
|
||||
|
||||
作为一个墨守成规的人,改变对我来说并不容易,尽管 Twitter 变得越来越让人厌倦,我还一直在使用。可是到了 2022 年的春天,Twitter 的出售危机让我重新考虑使用 Fosstodon 了。
|
||||
|
||||
### 1、收藏而不是点赞
|
||||
|
||||
Mastodon 的界面与 Twitter 很相似。但在 Mastodon上,你不是“点赞”一个帖子,而是通过点击帖子下方的星标来“收藏”一个帖子。
|
||||
|
||||
![Favorite button][4]
|
||||
|
||||
### 2、分享帖子
|
||||
|
||||
在 Twitter 上,重新分享是“<ruby>转推<rt>retweet</rt></ruby>”,但在 Mastodon,它是“<ruby>转嘟<rt>boost</rt></ruby>”。你可以点击帖子下方的双箭头图标来转嘟。
|
||||
|
||||
![Boost button][5]
|
||||
|
||||
### 3、Mastodon 实例
|
||||
|
||||
任何人都可以运行一个 Mastodon 实例,这让不同的实例上发展出了独特的社区(类似在 Twitter 上围绕特定标签形成的社区,不过 Mastodon 也有标签),有些实例有一套独特的规则。举个例子,和我以前的社交网络不同,Fosstodon 上采取了内容审核制度。最初这让我觉得有些严格,我发了一个与自由与开放源码软件无关的帖子,然后帖子就被删除了。我被告知的删除原因是,我没有给帖子打上 “内容警告”。这惹怒了我,于是我尝试寻找别的实例,发现了几个更符合我胃口的。其中一个是 [Mastodon.social][6],另一个是 [Scholar.social][7],前者是一个泛用的实例,没有预设的发帖主题,后者则是一个学术专用的实例。当然,他们也都制定有严格的行为规范。
|
||||
|
||||
每个实例都有规则,虽然在表述上略有不同,但都清楚地说明了可以接受和不可接受的行为。Fosstodon 公布了它的 [行为规范][8],确立了站点的规则和预期。
|
||||
|
||||
### 4、开源社交网络
|
||||
|
||||
如果你也想运行自己的 Mastodon 实例或协助开发一个,好消息是,Mastodon 是开源的。它使用 AGPLv3 许可证,它的源代码可以在 [Git 仓库][9] 获得。Mastodon 使用 [ActivityPub][10] 协议与世界各地的服务器通信。
|
||||
|
||||
Mastodon 不是互联网上的单一的网站,而是一系列横跨全球并相互通信的网站们。这个联邦网络被称为 “<ruby>联邦宇宙<rt>Fediverse</rt></ruby>”。不像其他社交网站有单一的所有者,任何人都可以在服务器上运行 Mastodon 或者其他 ActivityPub 协议网站。
|
||||
|
||||
从用户的角度来看,这一开始时其实并不重要。你可以在任何 Mastodon 实例上注册,然后连接到其余所有的实例。
|
||||
|
||||
不过,这种分布式设计是有其好处的。如果你碰见一个实例上的社区内容你不想看,你可以从屏蔽该实例中的某个用户,或者屏蔽整个实例。
|
||||
|
||||
过去的一个月里,我又回到了 Fosstodon,主要还是因为我热衷开源。我很享受在 Fosstodon 上分享开源内容,而 Fosstodon 上的其他用户也都能乐于看到关于自由和开源软件的帖子。当我有一些内容不适合在 Fosstodon 上分享时,我会分享到 Scholar.social 或者 Mastodon.social 上。
|
||||
|
||||
不是所有的实例都有关注的主题,即便是那些有主题的实例,主题常常也是仅作参考,而不是严格作为删帖的依据。如果你有特定的兴趣,也许就能找到一个围绕这个话题建立的社区,然后马上就能收获及时的关注。当然,你也依然能够与其他实例的用户交流。
|
||||
|
||||
### 试试 Mastodon
|
||||
|
||||
Mastodon 不是一家公司,所有 Mastodon 实例都是由各自所属的服务器的贡献者负责支持维护的。有些能很容易地通过 Patreon 或 PayPal 提供支持。
|
||||
|
||||
我发现,联邦宇宙是个很温馨的地方,把快乐带回给了社交网络。你加入了 Mastodon 了吗?有没有什么收获?请在评论中告诉我们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/twitter-vs-mastodon
|
||||
|
||||
作者:[Don Watkins][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[onionstalgia](https://github.com/onionstalgia)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/don-watkins
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/users/seth
|
||||
[2]: https://joinmastodon.org/
|
||||
[3]: https://fosstodon.org/about/
|
||||
[4]: https://opensource.com/sites/default/files/2022-11/favorite-button.webp
|
||||
[5]: https://opensource.com/sites/default/files/2022-11/boost-button.webp
|
||||
[6]: https://mastodon.social/about
|
||||
[7]: https://scholar.social/about/more
|
||||
[8]: https://hub.fosstodon.org/coc/
|
||||
[9]: https://github.com/mastodon/mastodon
|
||||
[10]: https://en.wikipedia.org/wiki/ActivityPub
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/28/093152q9c5yeo9dyebp2mj.jpg
|
194
published/202301/20221111.4 ⭐️⭐️ Drop swap for zram on Linux.md
Normal file
194
published/202301/20221111.4 ⭐️⭐️ Drop swap for zram on Linux.md
Normal file
@ -0,0 +1,194 @@
|
||||
[#]: subject: "Drop swap for zram on Linux"
|
||||
[#]: via: "https://opensource.com/article/22/11/zram-swap-linux"
|
||||
[#]: author: "David Both https://opensource.com/users/dboth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15487-1.html"
|
||||
|
||||
在 Linux 上用 zram 替代传统交换空间
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> zram 是一个用于创建内存压缩缓存的工具,特别是可以用作交换空间。
|
||||
|
||||
我在我的电脑上花了很多时间(我是说工作),我发现了很多有趣的东西。其中最近引起我注意的是 `zram0` 设备。我是在几个月前写一篇文章时第一次注意到它,它显示在 `lsblk` 命令的输出中:
|
||||
|
||||
```
|
||||
# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sda 8:0 0 931.5G 0 disk
|
||||
├─sda1 8:1 0 600M 0 part
|
||||
[...]
|
||||
zram0 252:0 0 8G 0 disk [SWAP]
|
||||
```
|
||||
|
||||
它被识别为交换空间,这就是首先引起我的好奇心的原因,所以我做了一些研究。zram 最初被称为 “<ruby>压缩缓存<rt>compcache</rt></ruby>”,即 “压缩的高速缓存”。事实证明,zram 是一个用于创建内存内压缩缓存的工具,特别是作为交换空间使用。
|
||||
|
||||
但为什么呢?
|
||||
|
||||
当我开始研究 zram 时,我只发现了几篇关于将 zram 用于交换空间的基础文章。起初,这对我来说似乎有点违反直觉。毕竟,如果你的内存快用完了,你把页面交换到内存中的虚拟驱动器中,有什么好处呢?
|
||||
|
||||
然后我找到了 Fedora 项目的维基页面,它提议使用 <ruby>[zram 交换空间][1]<rt>swap-on-zram</rt></ruby>。该建议说:“交换是有用的,除了它的速度很慢。zram 是一个使用了压缩的内存驱动器。在启动时创建一个 zram 交换空间,并且不再使用默认的交换分区。”
|
||||
|
||||
该页面的其余部分是关于它的细节、好处、副作用和反馈。
|
||||
|
||||
### Linux 上用于交换空间的 zram
|
||||
|
||||
使用 zram 作为交换空间,与常规的基于分区或基于文件的交换空间做的事情相同。当内存压力过大时,一些最近使用最少的数据会被移到交换空间。平均来说,它会被压缩到其原始大小的 50% 左右,并被放置在内存的 zram 空间中。这比将这些内存页存储在硬盘上要快得多,并可以释放出它所使用的内存用于其他用途。
|
||||
|
||||
### 节省交换空间
|
||||
|
||||
我试图找到关于配置多少交换空间或 zram 交换空间的总结建议。这使我重新回顾了交换空间的设置,以及我之前的文章《[现代 Linux 系统的正确交换空间是多少?][2]》。就我所知,从 RHEL 和 Fedora 的最新文档来看,推荐的交换空间数量并没有改变。不过,该文档忽略了 zram 的使用。
|
||||
|
||||
然而,在不使用 zram 的旧版 Linux 或 zram 被禁用的情况下,之前文章中的表格仍然为交换空间的分配提供了一个好的起点。
|
||||
|
||||
我找到的关于 zram 功能的文档在 zram 如何根据内存大小分配空间,以及分配给 zram 交换空间的数量方面是不一致的。
|
||||
|
||||
由于缺乏权威性的文档,我进行了一些实验来凭经验确定用于分配 zram 交换空间的算法。我为此使用了我自己的物理和虚拟系统。结果很有趣,与我迄今为止发现的任何文档都不一致。
|
||||
|
||||
在所有足够大的系统上,zram 的默认大小是 8GB,但在内存较小的主机上通常会大大减少。在我用于测试的一台虚拟机(VM)上,可以访问 4GB 的内存,zram 的虚拟交换空间被分配为 3.8GB。我的一台旧戴尔电脑拥有 8GB 的内存,zram 被设置为 7.6GB。当内存减少到 2GB 时,zram 就减少到 1.9GB。
|
||||
|
||||
我拥有的所有内存超过 8GB 的物理和虚拟主机都显示正好是 8GB 的 zram。这包括我拥有 64GB 内存的主工作站和其他拥有 16GB 或 32GB 内存的主机。
|
||||
|
||||
基于这几个数据点,我可以得出这样的结论:目前的默认设置是最多 8GB 的 zram,而在 8GB 或以下的主机上,zram 占内存的 95%。
|
||||
|
||||
我读过一些文章,其中提到了 zram 交换空间的其他大小,甚至高达 100% 的内存,但这些似乎都是理论上的,而不是现实。
|
||||
|
||||
你的发行版可能不同,但这里是 Fedora 和类似发行版的实际 zram 交换空间的分配情况:
|
||||
|
||||
- 内存 ⇐ 8 GB:0.95 × 内存
|
||||
- 内存 > 8 GB:8 GB
|
||||
|
||||
请注意,zram 交换空间大小的算法并没有基于对任何给定的现实世界的系统或应用程序的 “最佳” 交换大小的建议。这种 zram 交换空间的分配是一种相当概率性的方法,它应该在广泛的 Linux 主机上运行良好。然而,最大的 zram 交换空间大小被配置为 8GB,而且我一直推荐 8GB 作为传统交换空间的最大容量,我想我可以说它反映了 zram 交换空间的最佳大小。
|
||||
|
||||
### 管理 zram 交换空间
|
||||
|
||||
zram 的默认值保存在 `/usr/lib/systemd/zram-generator.conf` 配置文件中。以下是我的一个测试虚拟机,分配了 5097GB 的内存。
|
||||
|
||||
```
|
||||
# cat /usr/lib/systemd/zram-generator.conf
|
||||
# This config file enables a /dev/zram0 device with the default settings:
|
||||
# - size - same as available RAM or 8GB, whichever is less
|
||||
# - compression - most likely lzo-rle
|
||||
#
|
||||
# To disable, uninstall zram-generator-defaults or create empty
|
||||
# /etc/systemd/zram-generator.conf file.
|
||||
[zram0]zram-size= min(ram, 8192)
|
||||
```
|
||||
|
||||
你可以在 `zram-generator.conf` 配置文件的最后一行改变默认的 zram 交换空间大小。但我建议不要这样做,除非你能明确说明这样做的原因,并在你做任何改变后测试你的结果。像 Linux 中的许多其他配置默认值一样,zram 的默认值已经被很好地测试过了,适合大多数使用情况。
|
||||
|
||||
### 监控 zram
|
||||
|
||||
可以使用 `zramctl` 工具来查看 zram 的当前状态。
|
||||
|
||||
```
|
||||
# zramctl
|
||||
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
|
||||
/dev/zram0 lzo-rle 4.8G 4K 80B 12K 4[SWAP]
|
||||
```
|
||||
|
||||
传统的 `swapon` 命令也可以用来查看交换,包括作为交换使用的 zram:
|
||||
|
||||
```
|
||||
# swapon --show
|
||||
NAME TYPE SIZE USED PRIO
|
||||
/dev/zram0 partition 4.8G 0B 100
|
||||
```
|
||||
|
||||
需要注意的是,`zramctl` 在不包含数据时不报告 zram,所以结果会包含空输出。而像 `lsblk`、`swapon`、 `top`、`free`、`htop` 等工具,即使不包含数据,也会显示 zram。
|
||||
|
||||
### 停用 zram
|
||||
|
||||
`swapoff -a` 命令会关闭 zram 交换空间以及用作交换的传统 HDD 或 SSD 存储。`swapon -a` 命令在 zram 为空时不显示它,可以使用 `zramctl /dev/zram0` 代替。
|
||||
|
||||
```
|
||||
# swapon --show# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||
sda 8:00 120G 0 disk
|
||||
├─sda1 8:10 1G 0 part /boot/efi
|
||||
├─sda2 8:20 1G 0 part /boot
|
||||
└─sda3 8:30 118G 0 part
|
||||
├─vg01-root 253:00 10G 0 lvm /
|
||||
├─vg01-swap 253:10 3G 0 lvm [SWAP]
|
||||
├─vg01-usr 253:10 30G 0 lvm /usr
|
||||
├─vg01-home 253:20 10G 0 lvm /home
|
||||
├─vg01-var 253:30 30G 0 lvm /var
|
||||
└─vg01-tmp 253:40 10G 0 lvm /tmp
|
||||
sr0 11:01 1024M 0 rom
|
||||
zram0 252:00 0B 0 disk
|
||||
# zramctl## zramctl /dev/zram0
|
||||
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
|
||||
/dev/zram0 lzo-rle 0B 0B 0B 0B 4
|
||||
```
|
||||
|
||||
注意,`/dev/zram0` 在这些命令中并没有显示为交换空间,直到它被用于该目的。这给我造成了一些困惑,直到我的实验表明这是事实。
|
||||
|
||||
### 创建 zram 交换空间
|
||||
|
||||
zram 本身已经存在了大约 20 年,但只是在过去的一两年里才在一些发行版上作为交换空间使用。你的一些或所有主机上当前的 Linux 环境可能没有用 zram 创建交换空间。如果是这种情况,它可以很容易地被补救。
|
||||
|
||||
对于 Fedora 32,它是默认使用 zram 交换空间之前的最后一个版本,它只需要三个简单的命令。
|
||||
|
||||
首先,验证是否存在 `zram-swap.service` 文件,它作为 `zram` RPM 包的一部分安装:
|
||||
|
||||
```
|
||||
# systemctl status zram-swap
|
||||
● zram-swap.service - Enable compressed swap in memory using zram
|
||||
Loaded: loaded (/usr/lib/systemd/system/zram-swap.service; disabled; vendor preset: disabled)
|
||||
Active: inactive (dead)
|
||||
```
|
||||
|
||||
接下来,安装 `zram-generator-defaults` 和 `zram-generator` 软件包:
|
||||
|
||||
```
|
||||
# dnf install zram-generator-defaults zram-generator
|
||||
```
|
||||
|
||||
启用并启动 `zram-swap` 服务:
|
||||
|
||||
```
|
||||
# systemctl enable zram-swap.service# systemctl start zram-swap.service
|
||||
```
|
||||
|
||||
然后验证 `zram0` 是否存在并被用作交换空间:
|
||||
|
||||
```
|
||||
# lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
||||
sda 8:00 120G 0 disk
|
||||
├─sda1 8:10 2G 0 part /boot
|
||||
└─sda2 8:20 118G 0 part
|
||||
├─vg01-root 253:00 10G 0 lvm /
|
||||
├─vg01-swap 253:10 3G 0 lvm [SWAP]
|
||||
├─vg01-usr 253:20 35G 0 lvm /usr
|
||||
├─vg01-tmp 253:30 15G 0 lvm /tmp
|
||||
├─vg01-var 253:40 35G 0 lvm /var
|
||||
└─vg01-home 253:50 20G 0 lvm /home
|
||||
sr0 11:01 1024M 0 rom
|
||||
zram0 252:00 7.5G 0 disk [SWAP]
|
||||
```
|
||||
|
||||
### 用 zram 改进交换空间
|
||||
|
||||
这就是全部内容了。在 Fedora 上这很容易。不同的发行版可能也一样简单,只是软件包名称和命令的细节可能不同。在你的电脑上试试 zram 交换空间吧。在我的下一篇文章中,我将进一步演示一些 zram 选项。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/zram-swap-linux
|
||||
|
||||
作者:[David Both][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/dboth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://fedoraproject.org/wiki/Changes/SwapOnZRAM
|
||||
[2]: https://opensource.com/article/19/2/swap-space-poll
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/28/113826twvkkbrso9ws2kss.jpg
|
@ -0,0 +1,190 @@
|
||||
[#]: subject: "7 Reasons Why Cinnamon is a Fantastic (Yet Underrated) Linux Desktop Environment"
|
||||
[#]: via: "https://itsfoss.com/why-cinnamon/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15450-1.html"
|
||||
|
||||
Cinnamon 是一个被低估的神奇 Linux 桌面环境
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Linux Mint 是我最喜欢的发行版之一,其旗舰版的默认 Cinnamon 桌面是我如此喜欢它的原因。
|
||||
|
||||
Cinnamon 桌面提供的用户体验可能并不炫目花哨。但是,用户有充分的理由喜欢这个桌面环境,并可以轻松地用它来完成工作。
|
||||
|
||||
在日复一日工作中,我们想要的是,一个能按预期工作且不造成妨碍的用户界面。
|
||||
|
||||
我认为 Cinnamon 桌面做对了几件事,可以给你带来了令人兴奋的体验。让我在这里介绍其中一些。
|
||||
|
||||
> 如果你还不知道,Cinnamon 桌面是由 Linux Mint 的创建者 Clement Lefebvre 于 2011 年创建的 GNOME 3 复刻版,并经过多年的改进。
|
||||
|
||||
### 1、熟悉的用户界面
|
||||
|
||||
![Linux Mint 21][1]
|
||||
|
||||
构建 Cinnamon 的主要目的是为了保持 GNOME 2 的桌面风格。
|
||||
|
||||
而这就是为什么与最流行的消费级桌面操作系统 Windows 相比,你会看到一个熟悉的桌面布局。
|
||||
|
||||
当然,随着时间的推移,Windows 11 已经进化了它的通常布局。但是,访问开始菜单、任务栏、托盘中的系统图标和几个窗口装饰使其易于掌握。
|
||||
|
||||
无论你是 Windows 用户还是 macOS 用户,Cinnamon 的桌面布局都不应该让你感到有什么挑战。
|
||||
|
||||
![Linux Mint 欢迎屏幕][2]
|
||||
|
||||
为了进一步帮助你,Linux Mint 的 “欢迎屏幕” 为你迅速提供了各种信息。
|
||||
|
||||
### 2、轻量级
|
||||
|
||||
为了获得舒适的 Cinnamon 桌面体验(通常使用 Linux Mint),有以下最低系统要求:
|
||||
|
||||
- 4GB 内存
|
||||
- 100 GB 的磁盘空间
|
||||
- 1024×768 分辨率的屏幕
|
||||
|
||||
在现代计算时代,这些规格应该适合几乎所有人。所以,你不必担心需要一个疯狂的内存或磁盘空间来运行由 Cinnamon 驱动的 Linux 发行版。
|
||||
|
||||
当然,你可以尝试 [在 Ubuntu 上安装 Cinnamon 桌面][3]。
|
||||
|
||||
但是,在本文中,我们认为 Linux Mint 是理想的使用案例。
|
||||
|
||||
### 3、快速的性能而不牺牲用户体验
|
||||
|
||||
当我们想到一个轻量级的桌面环境时,我们通常会想象一个注重性能的、平淡无奇的用户界面。
|
||||
|
||||
![Linux Mint 首选项][4]
|
||||
|
||||
在 Cinnamon 桌面上,情况并非如此。它确实包括了各种细微的动画和特色的图标/主题,即使不是最好的,其外观也相当现代。
|
||||
|
||||
它以极简的方式让你看起来很赏心悦目。
|
||||
|
||||
通常情况下,我很喜欢漂亮的用户界面,但我仍然可以接受 Linux Mint 的简单直接的用户体验,并在双显示器设置(1440p + 1080p)上运行它。
|
||||
|
||||
它可能不是 Linux Mint Cinnamon 版最好的双显示器体验(对我来说,第二个屏幕上没有停靠区和面板),但需要改进地方不多。
|
||||
|
||||
### 4、默认的自定义选项
|
||||
|
||||
你可能已经知道,在提供开箱即用的定制能力方面,KDE 可能是最棒的。
|
||||
|
||||
如果你对这种方式感到好奇,我们有超级有用的指南:
|
||||
|
||||
- [KDE 定制指南][5]
|
||||
- [如何正确地给 KDE Plasma 定制主题(深度指南)][6]
|
||||
- [最佳的 KDE Plasma 华丽主题][7]
|
||||
|
||||
但是,对于许多用户来说,这有些过于复杂了。
|
||||
|
||||
我认为 Linux Mint 给出了适量的额外控制/定制,你也可以在它的欢迎屏幕上了解到这些。
|
||||
|
||||
![Cinnamon 主题定制][8]
|
||||
|
||||
一些你可以轻松定制的元素包括:
|
||||
|
||||
- 桌面颜色(强调色)
|
||||
- 浅色/深色主题切换
|
||||
- 面板布局
|
||||
- 图标、按钮和鼠标指针
|
||||
|
||||
你可以前往系统设置,并导航到 “主题”,找到必要的调整项。
|
||||
|
||||
推荐阅读:
|
||||
|
||||
> **[在 Linux 上定制 Cinnamon 桌面的 7 种方法][9]**
|
||||
|
||||
### 5、为你的体验增色的官方附加组件
|
||||
|
||||
![Cinnamon 桌面部件][10]
|
||||
|
||||
Linux Mint 支持各种插件来增强你的体验。这些都是 [Cinnamon 调味品][11] 产品的一部分。它们包括:
|
||||
|
||||
- 主题
|
||||
- 扩展程序
|
||||
- <ruby>小程序<rt>Applet</rt></ruby>
|
||||
- <ruby>桌面组件<rt>Desklet</rt></ruby>
|
||||
|
||||
小程序和桌面组件是小型程序,你可以分别在面板(靠近系统托盘)和桌面上添加。
|
||||
|
||||
![小程序][12]
|
||||
|
||||
你可以管理系统默认的小程序,也可以从官方软件库下载更多的小程序。
|
||||
|
||||
![小程序][13]
|
||||
|
||||
同样,你可以从可用的默认程序中添加桌面组件,或者从软件库中获得新的。
|
||||
|
||||
![桌面组件][14]
|
||||
|
||||
大量有价值的实用程序可以用来监控系统资源、检查天气,以及更多。
|
||||
|
||||
此外,你还可以访问社区构建的各种主题,可以很容易地给你一个你一直想要的外观。
|
||||
|
||||
![Cinnamon 主题][15]
|
||||
|
||||
通过补充上述所有的 “调味品”,你可以使用扩展来使面板透明,在桌面上添加水印,启用窗口平铺,并添加一些令人兴奋的窗口动画。
|
||||
|
||||
![Linux Mint 扩展][16]
|
||||
|
||||
### 6、兼容和无缝的用户体验
|
||||
|
||||
为什么我再次强调用户体验?
|
||||
|
||||
Cinnamon 桌面最棒的地方在于它以尊重和支持所有功能的方式发展。
|
||||
|
||||
例如,如果你想安装一个你在 KDE Plasma 上喜欢使用的应用程序,它在这里也应该以同样的方式工作。Cinnamon 桌面没有什么特别之处,会破坏这种体验。
|
||||
|
||||
![GNOME 账户应用][17]
|
||||
|
||||
同样地,该桌面增加了一些试图与其他桌面环境的服务共存的功能。例如,支持使用 GNOME 在线账户的日历事件。
|
||||
|
||||
### 7、面板定制
|
||||
|
||||
![Linux Mint 面板][18]
|
||||
|
||||
停靠区、任务栏或面板是用户界面的一个组成部分。
|
||||
|
||||
是的,其他的桌面环境也允许你在某种程度上同样定制这些。但在 Cinnamon 中,你可以得到大量的控制权来调整它。
|
||||
|
||||
我认为你可以得到一个用户想要的所有基本选项。
|
||||
|
||||
### 总结
|
||||
|
||||
GNOME 和 KDE Plasma 是流行的桌面环境。然而,Cinnamon 在提供最佳用户体验的基本部分上并不逊色。
|
||||
|
||||
你对 Cinnamon 桌面环境有什么看法?你更喜欢用 Linux Mint 来尝试它吗?在下面的评论部分分享你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/why-cinnamon/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/content/images/wordpress/2022/11/linux-mint-21-full.jpg
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/11/linux-mint-welcome.png
|
||||
[3]: https://itsfoss.com/install-cinnamon-on-ubuntu/
|
||||
[4]: https://itsfoss.com/content/images/wordpress/2022/11/linux-mint-perf.png
|
||||
[5]: https://itsfoss.com/kde-customization/
|
||||
[6]: https://itsfoss.com/properly-theme-kde-plasma/
|
||||
[7]: https://itsfoss.com/best-kde-plasma-themes/
|
||||
[8]: https://itsfoss.com/content/images/wordpress/2022/11/cinnamon-theme-customize.png
|
||||
[9]: https://itsfoss.com/customize-cinnamon-desktop/
|
||||
[10]: https://itsfoss.com/content/images/wordpress/2022/11/cinnamon-desklet.png
|
||||
[11]: https://cinnamon-spices.linuxmint.com
|
||||
[12]: https://itsfoss.com/content/images/wordpress/2022/11/applet-cinnamon.png
|
||||
[13]: https://itsfoss.com/content/images/wordpress/2022/11/applets-cinnamon.png
|
||||
[14]: https://itsfoss.com/content/images/wordpress/2022/11/desklet-cinnamon.png
|
||||
[15]: https://itsfoss.com/content/images/wordpress/2022/11/cinnamon-theme.png
|
||||
[16]: https://itsfoss.com/content/images/wordpress/2022/11/linux-mint-extensions.png
|
||||
[17]: https://itsfoss.com/content/images/wordpress/2022/11/gnome-accounts-cinnamon.png
|
||||
[18]: https://itsfoss.com/content/images/wordpress/2022/11/linux-mint-panel.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/16/164642rr27xxt3zo72t7vl.jpg
|
@ -0,0 +1,140 @@
|
||||
[#]: subject: "How to Setup Python Development Environment in Ubuntu and Fedora"
|
||||
[#]: via: "https://www.debugpoint.com/setup-python-environment-ubuntu-fedora/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15475-1.html"
|
||||
|
||||
如何在 Ubuntu 和 Fedora 中设置 Python 开发环境
|
||||
======
|
||||
|
||||
> 本文将帮助你了解在 Ubuntu 和 Fedora 中设置 Python 开发环境的基础知识和步骤。
|
||||
|
||||
[Python][1] 由于其强大的库、简单的语法和可移植性,在过去几年中变得很流行。目前几乎所有的企业系统都在使用它。
|
||||
|
||||
因此,如果你正试图建立你的 Python 环境,并想知道如何开始等等,那么你就找到正确的地方了。在这里,我试图给你一些开始的步骤。
|
||||
|
||||
### 在 Ubuntu 和 Fedora 中设置 Python 开发环境
|
||||
|
||||
#### Python 版本
|
||||
|
||||
如果你刚刚开始 Python 开发,那么建议你使用最新的 Python 3.x 进行开发,因为 Python 2.x 已经不再支持了。几乎所有领先的 Linux 发行版都取消了对 Python 2 的依赖。
|
||||
|
||||
如果你正在运行 Fedora 或 Ubuntu 的最新发行版,那么你应该已经安装了 Python 3.x,并设置为默认解释器。例如,Fedora 37 和 Ubuntu 22.04 LTS 将 [Python 3.11][2] 作为默认的 Python 交互界面。
|
||||
|
||||
找到你的 Python 版本的一个快速方法是在 Ubuntu 和 Fedora 的终端运行以下命令:
|
||||
|
||||
```
|
||||
python2
|
||||
```
|
||||
|
||||
```
|
||||
python3
|
||||
```
|
||||
|
||||
![python3][3]
|
||||
|
||||
如果你运行的是早期版本的 Ubuntu 或 Fedora,那么你可以使用以下命令安装最新的 Python 3.x:
|
||||
|
||||
Ubuntu:
|
||||
|
||||
```
|
||||
sudo apt install python3
|
||||
```
|
||||
|
||||
Fedora:
|
||||
|
||||
```
|
||||
sudo dnf install python3
|
||||
```
|
||||
|
||||
另外,运行下面的命令,找出当前系统中 Python 可执行文件的路径:
|
||||
|
||||
```
|
||||
Which python
|
||||
```
|
||||
|
||||
#### 切换默认解释器的版本
|
||||
|
||||
如果你的系统安装了多个 Python 版本 —— 2.x 和 3.x,并且你想在它们之间切换,也是可以的。
|
||||
|
||||
如果你只安装了一个版本,你可以跳过这一节。
|
||||
|
||||
要进行切换,首先,从终端运行 `python`,找出默认的可执行路径。理想情况下,它应该是 `/usr/bin/python`。现在,运行下面的程序,找出通往可执行文件的符号链接:
|
||||
|
||||
```
|
||||
ln -l /usr/bin/python
|
||||
```
|
||||
|
||||
```
|
||||
lrwxrwxrwx 1 root root .... /usr/bin/pyhton -> python2
|
||||
```
|
||||
|
||||
现在检查一下 `$PATH` 变量,确定系统查找可执行文件的路径连接顺序:
|
||||
|
||||
```
|
||||
echo $PATH
|
||||
```
|
||||
|
||||
![PATH 变量][4]
|
||||
|
||||
你可以看到 `/usr/local/bin` 在 `/usr/bin/` 之前,那么你可以创建一个软符号链接到 `python3`。然后你的解释器在运行 `python` 命令时就会找到最新的 Python 3 而不是 Python 2。
|
||||
|
||||
```
|
||||
ls -s /usr/bin/python3 /usr/local/bin/python
|
||||
```
|
||||
|
||||
现在你应该注销并再次登录以清除任何哈希条目,或者你可以运行 `hash -r` 来清除它们。
|
||||
|
||||
现在你可以从终端运行 `python`,你应该有最新的 Python 3 了。
|
||||
|
||||
#### Python IDE
|
||||
|
||||
集成开发环境(IDE)可以帮助你编写、编译和执行你的代码。有 [几个免费的 Python 集成开发环境][5] —— 如 PyCharm、Eclipse、Eric 等,你可以使用。但那将是另一篇关于其优点和缺点的文章。
|
||||
|
||||
如果你从官方 [python.org][1] 网站下载 Python,Python 还带着一个叫做 IDLE 的默认开发环境。IDLE 适合于起步,之后你可以决定选择任何一个最好的免费 Python IDE。
|
||||
|
||||
在 Ubuntu 和 Fedora 中,IDLE 并没有和 Python 一起被默认包含,你必须手动安装它。从终端运行下面的命令来手动安装 IDLE:
|
||||
|
||||
Ubuntu:
|
||||
|
||||
```
|
||||
sudo apt install idle
|
||||
```
|
||||
|
||||
Fedora:
|
||||
|
||||
```
|
||||
sudo dnf install python-tools
|
||||
```
|
||||
|
||||
安装后,你可以从命令行空闲启动 IDLE 或从应用程序中搜索。
|
||||
|
||||
![IDLE][6]
|
||||
|
||||
现在,你可以使用 IDLE 开始你的开发。大部分的基本选项你可以在 IDLE 的文件菜单中找到。
|
||||
|
||||
我希望这篇指南解释了你在开始 Python 开发之前应该知道的东西。 尽管本指南主要是针对 Ubuntu 和 Fedora 的,但你仍然可以在所有基于 Ubuntu 和 Fedora 的发行版上参考它。如果你在 Python 环境设置方面遇到问题,请在下面的评论区告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/setup-python-environment-ubuntu-fedora/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.python.org/
|
||||
[2]: https://www.debugpoint.com/install-python-3-11-ubuntu/
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2020/06/python3.jpg
|
||||
[4]: https://www.debugpoint.com/wp-content/uploads/2020/06/PATH-Variable.png
|
||||
[5]: https://www.debugpoint.com/5-best-python-ide-code-editor/
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2020/06/IDLE-environment.png
|
||||
[7]: https://www.debugpoint.com/bash-base64-encode-decode/
|
@ -0,0 +1,124 @@
|
||||
[#]: subject: "apt remove vs apt purge: What’s the Difference?"
|
||||
[#]: via: "https://itsfoss.com/apt-remove/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "Tingze-G"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15458-1.html"
|
||||
|
||||
apt remove 和 apt purge: 有什么区别?
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
如果你想 [在 Ubuntu 上使用终端卸载软件][1],可以使用:
|
||||
|
||||
```
|
||||
sudo apt remove package_name
|
||||
```
|
||||
|
||||
但是在很多论坛,你可能会看到别人说,如果你想彻底删除软件就用 `apt purge`。
|
||||
|
||||
你可能会觉得很困惑,因为 `apt purge` 和 `apt remove` 看起来是一样的。
|
||||
|
||||
```
|
||||
sudo apt purge package_name
|
||||
```
|
||||
|
||||
为什么会有两个如此像的命令来删除软件包呢?两者之间有什么不同呢?下面将为你揭晓。
|
||||
|
||||
### apt-remove 和 apt-purge 有什么不同?
|
||||
|
||||
`apt-remove` 和 `apt-purge` 的相同之处就是都可以卸载软件包,但是运行 `apt-purge` 除了可以删除安装包之外,还可以清除相关的配置文件。这是两者之间唯一的不同点。要注意的是这两条命令都不能删除用户主目录中相关的应用程序文件。
|
||||
|
||||
你是否遇到过这样的情况,卸载一个软件然后重新安装,却发现之前的设置都还在。这是因为用 `apt remove` 不能删除该软件的相关配置文件。
|
||||
|
||||
#### 哪些东西被删除了?哪些还在?
|
||||
|
||||
我分享一个使用 `apt remove` 和 `apt purge` 两个命令分别卸载 mplayer 这个软件的实际例子。重点是看每次操作后还残余哪些文件。
|
||||
|
||||
这是删除前的文件:
|
||||
|
||||
![mplayer before removal][2]
|
||||
|
||||
现在运行 `apt remove` 这个命令:
|
||||
|
||||
![apt uninstall package ubuntu][3]
|
||||
|
||||
下面的是还残留在系统中的文件:
|
||||
|
||||
![files after mplayer removal][4]
|
||||
|
||||
我们可以看到,有两个地方残留着 mplayer 的文件: `/etc` 和 `/home/abhishek`。
|
||||
|
||||
这次我们重新安装 mplayer,然后用 `apt purge` 来卸载软件。
|
||||
|
||||
![apt purge command][5]
|
||||
|
||||
现在让我们看看与 mplayer 相关的文件:
|
||||
|
||||
![files after mplayer removal][6]
|
||||
|
||||
我们可以看到 `/etc` 目录下的文件已经没有了。
|
||||
|
||||
但是在主目录中的文件呢?`apt purge` 会删除它们吗?
|
||||
|
||||
答案是否定的。`apt` 命令不会删除主目录中的配置文件。所以它们仍然在系统中,除非你手动删除。但是这些文件所占的空间真的很小,几乎不占磁盘空间。
|
||||
|
||||
值得注意的是,不是所有的软件在主目录或者 `/etc` 目录下都有配置文件。
|
||||
|
||||
#### 使用 apt remove 或者 apt purge 的效果
|
||||
|
||||
我能想到的一个实际例子就是 Discord,你用 deb 文件 [在 Ubuntu 上安装了 Discord][7]。然后登录自己的账号,之后又卸载并重新用 deb 文件安装。
|
||||
|
||||
现在如果你打开 Discord,你会发现你的账号自动登录了。是不是觉得很奇怪?
|
||||
|
||||
这是个功能,像一些软件,比如 Discord、VirtualBox,它们会提供更新,就是卸载现在的版本然后下载新的(尽管你不知道它内部怎么进行的),但是它在卸载的时候,这些软件的配置文件没有被删除,所以等你打开这些软件的时候就会自动登录。
|
||||
|
||||
当你想卸载一个软件,但是想保留你过去使用该软件留下的配置文件的时候,你就可以用 `apt remove`。
|
||||
|
||||
但是,有时候用它不能满足你的需求,比如当你没有配置好一个软件的时候,你想要重新开始,这个时候用 `apt purge` 就比较合适。
|
||||
|
||||
#### 运行 apt purge 是否可以用通配符删除?
|
||||
|
||||
当你删除一个包的时候,它会提示 `removing package-name*`。这意味着它会删除以这个包名开头的所有文件。
|
||||
|
||||
![apt purge wild card][8]
|
||||
|
||||
我在手册页之类的文档中没有找到关于这个问题的答案。所以我自己做了一个小测试,我安装了 espeak 和 espeak-ng 这两个软件,espeak* 应该可以通配扩展到 espeak-ng。
|
||||
|
||||
但是当我用 `apt purge` 删除 espeak 包时,espeak-ng 包还在,没有被一并删除。因此,这似乎是有一种防止通配符的扩展的机制。
|
||||
|
||||
### 那么,你应该使用 apt remove 还是 apt purge 呢?
|
||||
|
||||
很少有人会一直使用 `apt purge`。
|
||||
|
||||
在我看来,一般清况下,用 `apt remove` 就可以了,但是当你想删除那些自定义配置文件时,你就得用 `apt purge`。
|
||||
|
||||
不管是用 `apt remove` 还是 `apt purge`,你都需要从用户的主目录中删除残余的配置文件,并运行 `apt autoremove` 来清除任何依赖的包。
|
||||
|
||||
现在到你啦。你现在对 `apt remove` 和 `apt purge` 的区别更加了解吗?你更喜欢使用哪一个呢?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/apt-remove/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[Tingze-G](https://github.com/Tingze-G)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/apt-remove/
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/11/mplayer-before-removal.png
|
||||
[3]: https://itsfoss.com/content/images/wordpress/2022/11/apt-uninstall-package-ubuntu.png
|
||||
[4]: https://itsfoss.com/content/images/wordpress/2022/11/files-after-mplayer-removal.png
|
||||
[5]: https://itsfoss.com/content/images/wordpress/2022/11/apt-purge-command.png
|
||||
[6]: https://itsfoss.com/content/images/wordpress/2022/11/files-after-apt-purge.png
|
||||
[7]: https://itsfoss.com/install-discord-linux/
|
||||
[8]: https://itsfoss.com/content/images/wordpress/2022/11/apt-purge-wild-card.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/19/113744ucqk6f69t4hbi8h8.jpg
|
@ -0,0 +1,143 @@
|
||||
[#]: subject: "5 NeoVim GUI Editors You Could Try If You are Not a Total Terminal Junkie"
|
||||
[#]: via: "https://itsfoss.com/neovim-gui-editors/"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15455-1.html"
|
||||
|
||||
你可以尝试的 5 个 NeoVim GUI 编辑器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
Vim 很不错,但 NeoVim 更新一些,甚至更棒。Vim 和 NeoVim 都是基于终端的文本编辑器,具有类似的功能。
|
||||
|
||||
如果你是一个习惯于使用 [像 VS Code 这样的 GUI 文本编辑器][1] 的人,并且希望拥有 NeoVim 提供的类似功能,你应该了解一下这些 GUI 编辑器。
|
||||
|
||||
虽然我知道你可以把 NeoVim 作为你目前的文本编辑器的插件,但直接使用 NeoVim 工作要比管理插件更有效和方便。
|
||||
|
||||
在选择 NeoVim 的 GUI 时,有一些不同的选择,我把一些最好的 GUI 列在下面:
|
||||
|
||||
### 1、Neovide
|
||||
|
||||
![neovide][2]
|
||||
|
||||
主要特点:
|
||||
|
||||
- 动画光标
|
||||
- 平滑滚动
|
||||
- 动画窗口
|
||||
- 模糊的浮动窗口
|
||||
- 支持表情符号
|
||||
|
||||
[Neovide][3] 旨在成为一个简单的 NeoVim GUI。
|
||||
|
||||
虽然你不会看到很多图形元素,它只是增加了一些诸如动画之类的 GUI 功能。它使用了一个叫 Skulpin 的库来渲染动画。
|
||||
|
||||
而我在使用 Neovide 时最喜欢的地方是它拥有一个动画光标和平滑滚动。你看一看这个就明白了:
|
||||
|
||||
![][3a]
|
||||
|
||||
看起来很酷。对吗?
|
||||
|
||||
### 2、Neovim Qt
|
||||
|
||||
![neovim Qt][4]
|
||||
|
||||
主要特点:
|
||||
|
||||
- 悬停功能
|
||||
- 多个 GUI 标签
|
||||
- 自动制表符补完
|
||||
- 跨平台支持
|
||||
|
||||
顾名思义,[Neovim Qt][5] 是用 Qt5 库构建的,你会经常看到它在 KDE 中使用。它没有太多花哨的东西,只是增加了一些额外的 GUI 功能,如多个标签,自动制表符补完等。
|
||||
|
||||
因此,如果你已经在使用 Qt5 库,并希望为 NeoVim 提供一个精简的 GUI,它将工作的很好,并为你省去一些依赖安装。
|
||||
|
||||
推荐:
|
||||
|
||||
> **[Vim vs Nano:你应该选择哪个?][6]**
|
||||
|
||||
### 3、Uivonim
|
||||
|
||||
![uivonim][7]
|
||||
|
||||
主要特点:
|
||||
|
||||
- WebGL GPU 渲染和多线程
|
||||
- 支持 VSCode 扩展
|
||||
- Nyancat(经典猫咪动画的 ANSI 文本程序)
|
||||
- 悬停和代码动作
|
||||
|
||||
[Uivonim][8] 是 Veonim(一个建立在 VSCode 插件和 NeoVim 上的简单 IDE)的复刻版,采用 Electron 框架编写,如果你从 VSCode 转换过来,它是一个完美的选择。
|
||||
|
||||
而 Uivonim 的唯一目标是提供丰富的 NeoVim 体验,支持 NeoVim 的最新功能,包括浮动窗口、内置 LSP 等等。你不需要依赖 VSCode 扩展来获得这些功能。
|
||||
|
||||
### 4、FVim
|
||||
|
||||
![fvim][9]
|
||||
|
||||
主要特点:
|
||||
|
||||
- 脱离窗口(使用 `Ctrl+w`,`GE`)
|
||||
- 自定义弹出式菜单条目图标
|
||||
- 支持 HiDPI
|
||||
- GPU 加速
|
||||
|
||||
[FVim][10] 是一个用 F# + Avalonia 构建的 NeoVim 的跨平台 GUI,带有一些突破性的功能,如高性能渲染(在 4K 显示器上支持 60FPS)。
|
||||
|
||||
而我经常使用脱离窗口的功能,因为我更喜欢为不同的文本文件设置独立的窗口。另外,如果你是一个资深的远程用户,FVim 也不会让你失望。
|
||||
|
||||
### 5、Goneovim
|
||||
|
||||
![goneovim][11]
|
||||
|
||||
主要特点:
|
||||
|
||||
- 支持一个带有 Bash 和 Zsh 的终端
|
||||
- 迷你地图
|
||||
- 动画光标
|
||||
- HiDPI 缩放
|
||||
- 外部浮动窗口
|
||||
|
||||
顾名思义,[Goneovim][12] 是用 Go 语言编写的,是 Gonvim 的一个复刻品。它提供了足够的 GUI 功能来完成你的工作,如动画光标、像素级滚动等。
|
||||
|
||||
而且它在让你获得基本的文本编辑功能方面也并不差,比如对文本文件的拖放支持。
|
||||
|
||||
### 总结
|
||||
|
||||
这是我对 NeoVim 的图形用户界面的一些好的选择,我希望你能找到你想要的东西。
|
||||
|
||||
如果我错过了任何你喜欢的东西,请在评论中告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/neovim-gui-editors/
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/11/neovide.png
|
||||
[3]: https://neovide.dev/index.html
|
||||
[3a]: https://itsfoss.com/content/images/wordpress/2022/11/neovide.gif
|
||||
[4]: https://itsfoss.com/content/images/wordpress/2022/11/neovim-qt.png
|
||||
[5]: https://github.com/equalsraf/neovim-qt
|
||||
[6]: https://itsfoss.com/vim-vs-nano/
|
||||
[7]: https://itsfoss.com/content/images/wordpress/2022/11/uivonim.png
|
||||
[8]: https://github.com/smolck/uivonim
|
||||
[9]: https://itsfoss.com/content/images/wordpress/2022/11/fvim-1.png
|
||||
[10]: https://github.com/yatli/fvim
|
||||
[11]: https://itsfoss.com/content/images/wordpress/2022/11/goneovim-1.png
|
||||
[12]: https://github.com/akiyosi/goneovim
|
||||
[13]: https://itsfoss.com/install-latest-vim-ubuntu/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/18/160357g9mrmohow8wm68iw.jpg
|
@ -0,0 +1,323 @@
|
||||
[#]: subject: "Write a C++ extension module for Python"
|
||||
[#]: via: "https://opensource.com/article/22/11/extend-c-python"
|
||||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "MjSeven"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15405-1.html"
|
||||
|
||||
为 Python 写一个 C++ 扩展模块
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 使用 C 扩展为 Python 提供特定功能。
|
||||
|
||||
在前一篇文章中,我介绍了 [六个 Python 解释器][1]。在大多数系统上,CPython 是默认的解释器,而且根据民意调查显示,它还是最流行的解释器。Cpython 的独有功能是使用扩展 API 用 C 语言编写 Python 模块。用 C 语言编写 Python 模块允许你将计算密集型代码转移到 C,同时保留 Python 的易用性。
|
||||
|
||||
在本文中,我将向你展示如何编写一个 C++ 扩展模块。使用 C++ 而不是 C,因为大多数编译器通常都能理解这两种语言。我必须提前说明缺点:以这种方式构建的 Python 模块不能移植到其他解释器中。它们只与 CPython 解释器配合工作。因此,如果你正在寻找一种可移植性更好的与 C 语言模块交互的方式,考虑下使用 [ctypes][2] 模块。
|
||||
|
||||
### 源代码
|
||||
|
||||
和往常一样,你可以在 [GitHub][3] 上找到相关的源代码。仓库中的 C++ 文件有以下用途:
|
||||
|
||||
- `my_py_module.cpp`: Python 模块 `MyModule` 的定义
|
||||
- `my_cpp_class.h`: 一个头文件 - 只有一个暴露给 Python 的 C++ 类
|
||||
- `my_class_py_type.h/cpp`: Python 形式的 C++ 类
|
||||
- `pydbg.cpp`: 用于调试的单独应用程序
|
||||
|
||||
本文构建的 Python 模块不会有任何实际用途,但它是一个很好的示例。
|
||||
|
||||
### 构建模块
|
||||
|
||||
在查看源代码之前,你可以检查它是否能在你的系统上编译。[我使用 CMake][4] 来创建构建的配置信息,因此你的系统上必须安装 CMake。为了配置和构建这个模块,可以让 Python 去执行这个过程:
|
||||
|
||||
```
|
||||
$ python3 setup.py build
|
||||
```
|
||||
|
||||
或者手动执行:
|
||||
|
||||
```
|
||||
$ cmake -B build
|
||||
$ cmake --build build
|
||||
```
|
||||
|
||||
之后,在 `/build` 子目录下你会有一个名为 `MyModule. so` 的文件。
|
||||
|
||||
### 定义扩展模块
|
||||
|
||||
首先,看一下 `my_py_module.cpp` 文件,尤其是 `PyInit_MyModule` 函数:
|
||||
|
||||
```
|
||||
PyMODINIT_FUNC
|
||||
PyInit_MyModule(void) {
|
||||
PyObject* module = PyModule_Create(&my_module);
|
||||
|
||||
PyObject *myclass = PyType_FromSpec(&spec_myclass);
|
||||
if (myclass == NULL){
|
||||
return NULL;
|
||||
}
|
||||
Py_INCREF(myclass);
|
||||
|
||||
if(PyModule_AddObject(module, "MyClass", myclass) < 0){
|
||||
Py_DECREF(myclass);
|
||||
Py_DECREF(module);
|
||||
return NULL;
|
||||
}
|
||||
return module;
|
||||
}
|
||||
```
|
||||
|
||||
这是本例中最重要的代码,因为它是 CPython 的入口点。一般来说,当一个 Python C 扩展被编译并作为共享对象二进制文件提供时,CPython 会在同名二进制文件中(`<ModuleName>.so`)搜索 `PyInit_<ModuleName>` 函数,并在试图导入时执行它。
|
||||
|
||||
无论是声明还是实例,所有 Python 类型都是 [PyObject][5] 的一个指针。在此函数的第一部分中,`module` 通过 `PyModule_Create(...)` 创建的。正如你在 `module` 详述(`my_py_module`,同名文件)中看到的,它没有任何特殊的功能。
|
||||
|
||||
之后,调用 [PyType_FromSpec][6] 为自定义类型 `MyClass` 创建一个 Python [堆类型][7] 定义。一个堆类型对应于一个 Python 类,然后将它赋值给 `MyModule` 模块。
|
||||
|
||||
_注意,如果其中一个函数返回失败,则必须减少以前创建的复制对象的引用计数,以便解释器删除它们。_
|
||||
|
||||
### 指定 Python 类型
|
||||
|
||||
`MyClass` 详述在 [my_class_py_type.h][8] 中可以找到,它作为 [PyType_Spec][9] 的一个实例:
|
||||
|
||||
```
|
||||
static PyType_Spec spec_myclass = {
|
||||
"MyClass", // name
|
||||
sizeof(MyClassObject) + sizeof(MyClass), // basicsize
|
||||
0, // itemsize
|
||||
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // flags
|
||||
MyClass_slots // slots
|
||||
};
|
||||
```
|
||||
|
||||
它定义了一些基本类型信息,它的大小包括 Python 表示的大小(`MyClassObject`)和普通 C++ 类的大小(`MyClass`)。`MyClassObject` 定义如下:
|
||||
|
||||
```
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
int m_value;
|
||||
MyClass* m_myclass;
|
||||
} MyClassObject;
|
||||
```
|
||||
|
||||
Python 表示的话就是 [PyObject][5] 类型,由 `PyObject_HEAD` 宏和其他一些成员定义。成员 `m_value` 视为普通类成员,而成员 `m_myclass` 只能在 C++ 代码内部访问。
|
||||
|
||||
[PyType_Slot][10] 定义了一些其他功能:
|
||||
|
||||
```
|
||||
static PyType_Slot MyClass_slots[] = {
|
||||
{Py_tp_new, (void*)MyClass_new},
|
||||
{Py_tp_init, (void*)MyClass_init},
|
||||
{Py_tp_dealloc, (void*)MyClass_Dealloc},
|
||||
{Py_tp_members, MyClass_members},
|
||||
{Py_tp_methods, MyClass_methods},
|
||||
{0, 0} /* Sentinel */
|
||||
};
|
||||
```
|
||||
|
||||
在这里,设置了一些初始化和析构函数的跳转,还有普通的类方法和成员,还可以设置其他功能,如分配初始属性字典,但这是可选的。这些定义通常以一个哨兵结束,包含 `NULL` 值。
|
||||
|
||||
要完成类型详述,还包括下面的方法和成员表:
|
||||
|
||||
```
|
||||
static PyMethodDef MyClass_methods[] = {
|
||||
{"addOne", (PyCFunction)MyClass_addOne, METH_NOARGS, PyDoc_STR("Return an incrmented integer")},
|
||||
{NULL, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
static struct PyMemberDef MyClass_members[] = {
|
||||
{"value", T_INT, offsetof(MyClassObject, m_value)},
|
||||
{NULL} /* Sentinel */
|
||||
};
|
||||
```
|
||||
|
||||
在方法表中,定义了 Python 方法 `addOne`,它指向相关的 C++ 函数 `MyClass_addOne`。它充当了一个包装器,它在 C++ 类中调用 `addOne()` 方法。
|
||||
|
||||
在成员表中,只有一个为演示目的而定义的成员。不幸的是,在 [PyMemberDef][12] 中使用的 [offsetof][11] 不允许添加 C++ 类型到 `MyClassObject`。如果你试图放置一些 C++ 类型的容器(如 [std::optional][13]),编译器会抱怨一些内存布局相关的警告。
|
||||
|
||||
### 初始化和析构
|
||||
|
||||
`MyClass_new` 方法只为 `MyClassObject` 提供一些初始值,并为其类型分配内存:
|
||||
|
||||
```
|
||||
PyObject *MyClass_new(PyTypeObject *type, PyObject *args, PyObject *kwds){
|
||||
std::cout << "MtClass_new() called!" << std::endl;
|
||||
|
||||
MyClassObject *self;
|
||||
self = (MyClassObject*) type->tp_alloc(type, 0);
|
||||
if(self != NULL){ // -> 分配成功
|
||||
// 赋初始值
|
||||
self->m_value = 0;
|
||||
self->m_myclass = NULL;
|
||||
}
|
||||
return (PyObject*) self;
|
||||
}
|
||||
```
|
||||
|
||||
实际的初始化发生在 `MyClass_init` 中,它对应于 Python 中的 [\_\_init__()][14] 方法:
|
||||
|
||||
```
|
||||
int MyClass_init(PyObject *self, PyObject *args, PyObject *kwds){
|
||||
|
||||
((MyClassObject *)self)->m_value = 123;
|
||||
|
||||
MyClassObject* m = (MyClassObject*)self;
|
||||
m->m_myclass = (MyClass*)PyObject_Malloc(sizeof(MyClass));
|
||||
|
||||
if(!m->m_myclass){
|
||||
PyErr_SetString(PyExc_RuntimeError, "Memory allocation failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
try {
|
||||
new (m->m_myclass) MyClass();
|
||||
} catch (const std::exception& ex) {
|
||||
PyObject_Free(m->m_myclass);
|
||||
m->m_myclass = NULL;
|
||||
m->m_value = 0;
|
||||
PyErr_SetString(PyExc_RuntimeError, ex.what());
|
||||
return -1;
|
||||
} catch(...) {
|
||||
PyObject_Free(m->m_myclass);
|
||||
m->m_myclass = NULL;
|
||||
m->m_value = 0;
|
||||
PyErr_SetString(PyExc_RuntimeError, "Initialization failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
如果你想在初始化过程中传递参数,必须在此时调用 [PyArg_ParseTuple][15]。简单起见,本例将忽略初始化过程中传递的所有参数。在函数的第一部分中,`PyObject` 指针(`self`)被强转为 `MyClassObject` 类型的指针,以便访问其他成员。此外,还分配了 C++ 类的内存,并执行了构造函数。
|
||||
|
||||
注意,为了防止内存泄漏,必须仔细执行异常处理和内存分配(还有释放)。当引用计数将为零时,`MyClass_dealloc` 函数负责释放所有相关的堆内存。在文档中有一个章节专门讲述关于 C 和 C++ 扩展的内存管理。
|
||||
|
||||
### 包装方法
|
||||
|
||||
从 Python 类中调用相关的 C++ 类方法很简单:
|
||||
|
||||
```
|
||||
PyObject* MyClass_addOne(PyObject *self, PyObject *args){
|
||||
assert(self);
|
||||
|
||||
MyClassObject* _self = reinterpret_cast<MyClassObject*>(self);
|
||||
unsigned long val = _self->m_myclass->addOne();
|
||||
return PyLong_FromUnsignedLong(val);
|
||||
}
|
||||
```
|
||||
|
||||
同样,`PyObject` 参数(`self`)被强转为 `MyClassObject` 类型以便访问 `m_myclass`,它指向 C++ 对应类实例的指针。有了这些信息,调用 `addOne()` 类方法,并且结果以 [Python 整数对象][17] 返回。
|
||||
|
||||
### 3 种方法调试
|
||||
|
||||
出于调试目的,在调试配置中编译 CPython 解释器是很有价值的。详细描述参阅 [官方文档][18]。只要下载了预安装的解释器的其他调试符号,就可以按照下面的步骤进行操作。
|
||||
|
||||
#### GNU 调试器
|
||||
|
||||
当然,老式的 [GNU 调试器(GDB)][19] 也可以派上用场。源码中包含了一个 [gdbinit][20] 文件,定义了一些选项和断点,另外还有一个 [gdb.sh][21] 脚本,它会创建一个调试构建并启动一个 GDB 会话:
|
||||
|
||||
![Gnu 调试器(GDB)对于 Python C 和 C++ 扩展非常有用][22]
|
||||
|
||||
GDB 使用脚本文件 [main.py][23] 调用 CPython 解释器,它允许你轻松定义你想要使用 Python 扩展模块执行的所有操作。
|
||||
|
||||
#### C++ 应用
|
||||
|
||||
另一种方法是将 CPython 解释器嵌入到一个单独的 C++ 应用程序中。可以在仓库的 [pydbg.cpp][24] 文件中找到:
|
||||
|
||||
```
|
||||
int main(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
Py_SetProgramName(L"DbgPythonCppExtension");
|
||||
Py_Initialize();
|
||||
|
||||
PyObject *pmodule = PyImport_ImportModule("MyModule");
|
||||
if (!pmodule) {
|
||||
PyErr_Print();
|
||||
std::cerr << "Failed to import module MyModule" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
PyObject *myClassType = PyObject_GetAttrString(pmodule, "MyClass");
|
||||
if (!myClassType) {
|
||||
std::cerr << "Unable to get type MyClass from MyModule" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
PyObject *myClassInstance = PyObject_CallObject(myClassType, NULL);
|
||||
|
||||
if (!myClassInstance) {
|
||||
std::cerr << "Instantioation of MyClass failed" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_DecRef(myClassInstance); // invoke deallocation
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
使用 [高级接口][25],可以导入扩展模块并对其执行操作。它允许你在本地 IDE 环境中进行调试,还能让你更好地控制传递或来自扩展模块的变量。
|
||||
|
||||
缺点是创建一个额外的应用程序的成本很高。
|
||||
|
||||
#### VSCode 和 VSCodium LLDB 扩展
|
||||
|
||||
使用像 [CodeLLDB][26] 这样的调试器扩展可能是最方便的调试选项。仓库包含了一些 VSCode/VSCodium 的配置文件,用于构建扩展,如 [task.json][27]、[CMake Tools][28] 和调用调试器([launch.json][29])。这种方法结合了前面几种方法的优点:在图形 IDE 中调试,在 Python 脚本文件中定义操作,甚至在解释器提示符中动态定义操作。
|
||||
|
||||
![VSCodium 有一个集成的调试器。][30]
|
||||
|
||||
### 用 C++ 扩展 Python
|
||||
|
||||
Python 的所有功能也可以从 C 或 C++ 扩展中获得。虽然用 Python 写代码通常认为是一件容易的事情,但用 C 或 C++ 扩展 Python 代码是一件痛苦的事情。另一方面,虽然原生 Python 代码比 C++ 慢,但 C 或 C++ 扩展可以将计算密集型任务提升到原生机器码的速度。
|
||||
|
||||
你还必须考虑 ABI 的使用。稳定的 ABI 提供了一种方法来保持旧版本 CPython 的向后兼容性,如 [文档][31] 所述。
|
||||
|
||||
最后,你必须自己权衡利弊。如果你决定使用 C 语言来扩展 Python 中的一些功能,你已经看到了如何实现它。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/11/extend-c-python
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hansic99
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/22/9/python-interpreters-2022
|
||||
[2]: https://docs.python.org/3/library/ctypes.html#module-ctypes
|
||||
[3]: https://github.com/hANSIc99/PythonCppExtension
|
||||
[4]: https://opensource.com/article/21/5/cmake
|
||||
[5]: https://docs.python.org/release/3.9.1/c-api/structures.html?highlight=pyobject#c.PyObject
|
||||
[6]: https://docs.python.org/3/c-api/type.html#c.PyType_FromSpec
|
||||
[7]: https://docs.python.org/3/c-api/typeobj.html#heap-types
|
||||
[8]: https://github.com/hANSIc99/PythonCppExtension/blob/main/my_class_py_type.h
|
||||
[9]: https://docs.python.org/3/c-api/type.html#c.PyType_Spec
|
||||
[10]: https://docs.python.org/release/3.9.1/c-api/type.html?highlight=pytype_slot#c.PyType_Slot
|
||||
[11]: https://en.cppreference.com/w/cpp/types/offsetof
|
||||
[12]: https://docs.python.org/release/3.9.1/c-api/structures.html?highlight=pymemberdef#c.PyMemberDef
|
||||
[13]: https://en.cppreference.com/w/cpp/utility/optional
|
||||
[14]: https://docs.python.org/3/library/dataclasses.html?highlight=__init__
|
||||
[15]: https://docs.python.org/3/c-api/arg.html#c.PyArg_ParseTuple
|
||||
[16]: https://docs.python.org/3/c-api/memory.html
|
||||
[17]: https://docs.python.org/3/c-api/long.html
|
||||
[18]: https://docs.python.org/3/c-api/intro.html#debugging-builds
|
||||
[19]: https://opensource.com/article/21/3/debug-code-gdb
|
||||
[20]: https://github.com/hANSIc99/PythonCppExtension/blob/main/gdbinit
|
||||
[21]: https://github.com/hANSIc99/PythonCppExtension/blob/main/gdb.sh
|
||||
[22]: https://opensource.com/sites/default/files/2022-11/gdb_session_b_0.png
|
||||
[23]: https://github.com/hANSIc99/PythonCppExtension/blob/main/main.py
|
||||
[24]: https://github.com/hANSIc99/PythonCppExtension/blob/main/pydbg.cpp
|
||||
[25]: https://docs.python.org/3/extending/embedding.html#very-high-level-embedding
|
||||
[26]: https://github.com/vadimcn/vscode-lldb
|
||||
[27]: https://github.com/hANSIc99/PythonCppExtension/blob/main/.vscode/tasks.json
|
||||
[28]: https://github.com/microsoft/vscode-cmake-tools
|
||||
[29]: https://github.com/hANSIc99/PythonCppExtension/blob/main/.vscode/launch.json
|
||||
[30]: https://opensource.com/sites/default/files/2022-11/vscodium_debug_session.png
|
||||
[31]: https://docs.python.org/3/c-api/stable.html
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/02/173501o26htajatlpj0lqt.jpg
|
@ -0,0 +1,133 @@
|
||||
[#]: subject: "How I Fixed Buzzing Noise Coming from Speakers in Linux"
|
||||
[#]: via: "https://itsfoss.com/buzzing-noise-speaker-linux"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15415-1.html"
|
||||
|
||||
如何修复 Linux 中扬声器发出的嗡嗡声
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
我使用笔记本电脑很长时间了,但最近才切换到台式机上,以便进行远程工作。
|
||||
|
||||
我注意到我的扬声器不断发出嗡嗡声。这很烦人,让我头疼。我开始着手解决这个问题。了解问题的根本原因非常有趣。
|
||||
|
||||
我将分享我在 Linux 中修复扬声器嗡嗡声的经验。我发现它可以在同一硬件上对 Ubuntu、Debian 和 Pop OS 都有效。
|
||||
|
||||
需要考虑的一件事是,如果本指南不适合你,你可能遇到了严重的硬件问题。对于大多数用户来说,给定的方案应该可以解决问题。
|
||||
|
||||
**在尝试修复之前**
|
||||
|
||||
我试图让事情变得容易安全地遵循。你可以尝试临时修复,如果有效,则将更改永久化。但是,最好使用 Timeshift 制作系统快照。如果你在出现故障时很容易惊慌失措,你可以将系统恢复到之前的状态。
|
||||
|
||||
另外,检查你的声卡。在我的例子中,它是 `snd_hda_intel`。对于 USB 卡,它可以是 `snd_usb_audio`。你必须根据你的声卡更改命令。
|
||||
|
||||
```
|
||||
cat /proc/asound/modules
|
||||
```
|
||||
|
||||
### Linux 中扬声器发出嗡嗡声的原因
|
||||
|
||||
梳理了无数的论坛帖子和网站后,我了解了问题的根本原因。这是因为扬声器中的电容放电。它可以通过关闭声卡的省电设置来解决。
|
||||
|
||||
通过关闭省电,你允许系统在这些电容放电时为其充电。这类似于在一直充电时使用电话。
|
||||
|
||||
你可以使用给定的命令检查你的系统是否启用了声卡的省电设置:
|
||||
|
||||
```
|
||||
cat /sys/module/snd_hda_intel/parameters/power_save
|
||||
```
|
||||
|
||||
![power saving setting in sound card making buzzing sound in linux][1]
|
||||
|
||||
如果你像我一样输出是 `1`,那么省电功能已打开。因此,让我们看一下方案。
|
||||
|
||||
不用担心。这不会显著影响你的电池百分比,因为所示方法仅适用于声卡。
|
||||
|
||||
### 尝试修复嗡嗡声问题(临时)
|
||||
|
||||
我之所以包括临时方法是为了确定嗡嗡声是由于电容放电引起的,还是存在严重的硬件问题。
|
||||
|
||||
如果此临时方案有效,你可以继续使用永久方案。
|
||||
|
||||
第一步是切换到 root 用户:
|
||||
|
||||
```
|
||||
sudo su
|
||||
```
|
||||
|
||||
然后,执行给定的命令,它应该停止嗡嗡声直到下次启动:
|
||||
|
||||
```
|
||||
echo 0 > /sys/module/snd_hda_intel/parameters/power_save
|
||||
```
|
||||
|
||||
如果你使用的是 **USB 声卡**,则必须将 `snd_hda_intel` 替换为 `snd_usb_audio`,如下所示:
|
||||
|
||||
```
|
||||
echo 0 > /sys/module/snd_usb_audio/parameters/power_save
|
||||
```
|
||||
|
||||
如果上述技巧解决了问题,那么你必须使变更永久化。否则,下次重启系统时更改将丢失。
|
||||
|
||||
### 修复嗡嗡声问题(永久)
|
||||
|
||||
在这里,我将对内核参数进行更改。
|
||||
|
||||
将你的工作目录更改为 `/etc/modprobe.d`:
|
||||
|
||||
```
|
||||
cd /etc/modprobe.d
|
||||
```
|
||||
|
||||
现在,创建一个名为 `audio_disable_powersave.conf` 的新文件,并使用给定命令使用 nano 文本编辑器打开:
|
||||
|
||||
```
|
||||
sudo nano audio_disable_powersave.conf
|
||||
```
|
||||
|
||||
并在该文件中放入以下行以永久关闭声卡中的省电设置:
|
||||
|
||||
```
|
||||
options snd_hda_intel power_save=0
|
||||
```
|
||||
|
||||
![fix buzzing sound in linux][2]
|
||||
|
||||
对于 **USB 声卡**,你需要使用 `snd_usb_audio`:
|
||||
|
||||
```
|
||||
options snd_usb_audio power_save=0
|
||||
```
|
||||
|
||||
现在,[保存更改并退出 Nano 文本编辑器][3] 并按 `Ctrl+X` 键。重启你的系统,你就可以享受无噪音的工作空间。
|
||||
|
||||
### 总结
|
||||
|
||||
本指南解释了嗡嗡声的原因以及如何直接解决该问题。
|
||||
|
||||
同样,除了电容放电之外,你可能还有其他问题,因此你应该始终尝试临时方法。
|
||||
|
||||
让我知道你是否能够以这种方式解决 Linux 中扬声器发出的嗡嗡声。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/buzzing-noise-speaker-linux
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/content/images/wordpress/2022/11/power-saving-setting-in-sound-card-making-buzzing-sound-in-linux.png
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/11/fix-buzzing-sound-in-linux.png
|
||||
[3]: https://linuxhandbook.com/nano-save-exit/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/05/150250sqbeq35bh699r157.jpg
|
@ -0,0 +1,132 @@
|
||||
[#]: subject: "lnav: Advanced Log File Viewer for Linux Desktops and Servers"
|
||||
[#]: via: "https://www.debugpoint.com/advanced-log-file-viewer-lnav-ubuntu-linux/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15454-1.html"
|
||||
|
||||
lnav: 用于 Linux 的高级日志文件浏览器
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 如果你想调试或排除任何问题,你需要一个像 lnav 这样的高级日志文件查看器。它在任何 Linux 系统的终端都能创造奇迹。
|
||||
|
||||
### lnav: 日志文件查看器
|
||||
|
||||
`lnav` 可以即时解压缩所有的压缩日志文件,并将它们合并在一起进行漂亮的显示。显示是根据错误/警告的类型进行解析和格式化的,这有助于快速浏览成千上万的日志,特别是在服务器中。
|
||||
|
||||
在分析日志的时候,时间戳是非常重要的。所以 `lnav` 会根据时间戳合并多个日志,这对追踪系统问题很有帮助。
|
||||
|
||||
大多数重要的日志文件格式检测都是内置的,包括如下:
|
||||
|
||||
- <ruby>通用网络访问日志<rt>Common Web Access Log</rt></ruby>格式
|
||||
- CUPS page_log
|
||||
- Syslog
|
||||
- Glog
|
||||
- VMware ESXi/vCenter 日志
|
||||
- dpkg.log
|
||||
- uwsgi
|
||||
- “通用”:任何以时间戳开头的信息
|
||||
- Strace
|
||||
- sudo
|
||||
- GZIP、BZIP
|
||||
|
||||
这还不是全部,`lnav` 还能实现以下功能,使其成为 Linux 系统的重要应用:
|
||||
|
||||
- 根据正则表达式过滤消息
|
||||
- 错误日志的时间轴视图
|
||||
- 漂亮的打印视图,这有助于重新格式化
|
||||
- 使用 SQL 查询日志
|
||||
- 在搜索时,日志会实时更新
|
||||
- 通过正则表达式高亮显示语法(比如你想在整个日志中找出一个 IP 地址)
|
||||
- 显示的日志中任何单词的 Tab 补全!!
|
||||
|
||||
![lnav 在 ubuntu 中运行][1]
|
||||
|
||||
要查看上述功能的截图和了解更多信息,请访问 [本页面][2] 。
|
||||
|
||||
### 如何安装
|
||||
|
||||
这个程序在 Ubuntu、Debian 的官方仓库中可以找到。使用以下命令安装它。
|
||||
|
||||
```
|
||||
sudo apt install lnav
|
||||
```
|
||||
|
||||
而对于 Fedora、RHEL 用户,使用下面的命令:
|
||||
|
||||
```
|
||||
sudo dnf install lnav
|
||||
```
|
||||
|
||||
另外,开发者还提供了一个离线的独立可执行文件,你不需要安装。你可以从 [GitHub 发布页][3] 下载压缩包,然后按以下方式执行:
|
||||
|
||||
```
|
||||
./lnav
|
||||
```
|
||||
|
||||
**注意**:它也可用于 macOS,你可以在上述 GitHub 页面找到。
|
||||
|
||||
### lnav: 如何使用(基础)
|
||||
|
||||
简单的命令语法是:
|
||||
|
||||
```
|
||||
lnav [options] [logfile1 logfile2 …]
|
||||
```
|
||||
|
||||
如果你直接运行 `lnav` 命令,它会显示你系统中的所有日志(`/var/log/messages` 和 `/var/log/syslog`)
|
||||
|
||||
```
|
||||
lnav
|
||||
```
|
||||
|
||||
要查看任何特定的日志文件,在命令行中输入:
|
||||
|
||||
```
|
||||
lnav /var/log/syslog
|
||||
```
|
||||
|
||||
使用 `-t` 参数在你的日志输出中添加时间戳:
|
||||
|
||||
```
|
||||
lnav -t /var/log/syslog
|
||||
```
|
||||
|
||||
以下是 `lnav` 的一些关键开关:
|
||||
|
||||
- `-d file`:将调试信息写入给定的文件。
|
||||
- `-a`:加载所有最新的日志文件类型。
|
||||
- `-r`:也加载较早的轮转的日志文件。
|
||||
- `-t`:在标准输入中读入的数据行上预加时间戳。
|
||||
- `-w file`:将标准输入的内容写入该文件。
|
||||
- `-c cmd`:在文件加载后执行命令。
|
||||
- `-f path`:执行给定文件中的命令。
|
||||
- `-n`:不使用 curses UI 运行(无头模式)。
|
||||
|
||||
![lnav 在 Ubuntu 22.04 中运行][4]
|
||||
|
||||
要进一步阅读和探索,请访问 [官方文档][5]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/advanced-log-file-viewer-lnav-ubuntu-linux/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2016/11/lnav-Running-in-Ubutu.png
|
||||
[2]: http://lnav.org/features/
|
||||
[3]: https://github.com/tstack/lnav/releases/
|
||||
[4]: https://www.debugpoint.com/wp-content/uploads/2016/11/lnav-running-in-Ubuntu-22.04.jpg
|
||||
[5]: https://docs.lnav.org/en/latest/intro.html
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/18/101616eio2v80m1v34ol2o.jpg
|
@ -0,0 +1,145 @@
|
||||
[#]: subject: "What is Firefox ESR? How to Install it in Ubuntu?"
|
||||
[#]: via: "https://itsfoss.com/firefox-esr-ubuntu/"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15421-1.html"
|
||||
|
||||
什么是 Firefox ESR?如何在 Ubuntu 中安装它?
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
Ubuntu 的 Snap 版本你不喜欢?不喜欢每一次 Firefox 的发布都要不断地改变东西?如果你重视稳定性而不是功能,你可以试试 Firefox ESR 版本。
|
||||
|
||||
### 什么是 Firefox ESR?
|
||||
|
||||
Firefox ESR 是 Firefox 的特别版,它不一定像普通版那样每月都有新功能,但它能提供稳定和安全的浏览体验。这适用于企业、组织和机构,在这些地方,稳定性和核心功能比闪亮的新功能更重要。
|
||||
|
||||
可以把 Firefox ESR 看作是 Linux 发行版的长期稳定版本。它们不一定得到全新的功能,但它们会得到定期的安全和维护更新。这给了用户一个熟悉和稳定的环境。
|
||||
|
||||
#### 你为什么要关心 Firefox ESR?
|
||||
|
||||
Firefox 几乎每个月都会发布一个新版本。它包含安全和功能更新。
|
||||
|
||||
但有些人可能不喜欢各种功能的加入和删除。如果在更新之后,你一直想知道某些设置到哪里去了,或者不喜欢与以前不同的东西,Firefox ESR 可能值得一试。
|
||||
|
||||
基本上,如果你更看重稳定性而不是新功能,那么 Firefox ESR 就适合你。这也是 Debian 中携带的 Firefox 版本,Debian 以其是市场上最稳定的发行版之一而闻名。
|
||||
|
||||
让我告诉你如何在 Ubuntu 上获得 Firefox ESR。**你可以同时安装 Firefox 和 Firefox-ESR 两个版本。它们的标识没有视觉上的区别,所以你必须注意你打开的是哪个火狐版本。**
|
||||
|
||||
### 在 Ubuntu 中安装 Firefox ESR
|
||||
|
||||
在进入安装之前,让我来分享一下普通 Firefox 和 Firefox-ESR 之间的版本差异是什么。在写这篇文章的时候:
|
||||
|
||||
- Firefox 的版本是 **107.0-2**。
|
||||
- Firefox-ESR 目前的版本是 **102.5.0esr**。
|
||||
|
||||
所以,如果这对你来说没问题,让我们看看第一个方法。
|
||||
|
||||
#### 方法 1:使用 PPA 安装 Firefox-ESR
|
||||
|
||||
Firefox-ESR 在 Ubuntu 的默认仓库中是不可用的,所以你可以使用 PPA。
|
||||
|
||||
PPA 只不过是一个由个别技术人员或开发者维护的仓库,拥有默认仓库所没有的东西。
|
||||
|
||||
如果你想了解更多关于 PPA 的信息,我建议你查看我们的其他指南,其中解释了 [如何在 Linux 上使用 PPA][1]。
|
||||
|
||||
打开你的终端,使用给定的命令来添加 Firefox-ESR 的 PPA:
|
||||
|
||||
```
|
||||
sudo add-apt-repository ppa:mozillateam/ppa
|
||||
```
|
||||
|
||||
然后按回车键确认你要添加 PPA:
|
||||
|
||||
![add firefox esr repository in ubuntu][2]
|
||||
|
||||
完成后,你需要更新 Ubuntu 中的仓库索引,以便从这些变化中生效:
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
```
|
||||
|
||||
现在,你可以通过使用给定的命令来安装 Firefox-ESR:
|
||||
|
||||
```
|
||||
sudo apt install firefox-esr
|
||||
```
|
||||
|
||||
接下来,你可以使用给定的命令来检查你系统中 Firefox-ESR 的安装版本:
|
||||
|
||||
```
|
||||
firefox-esr -v
|
||||
```
|
||||
|
||||
![check installed version of firefox esr in ubuntu][3]
|
||||
|
||||
如何从 Ubuntu 卸载 Firefox-ESR?
|
||||
|
||||
如果 ESR 对你的工作来说感觉太过时了,或者由于其他原因你想从你的系统中删除它,你可以按照以下步骤删除 Firefox-ESR 包和仓库。
|
||||
|
||||
首先,让我们用下面的方法删除 Firefox-ESR 包:
|
||||
|
||||
```
|
||||
sudo apt remove firefox-esr
|
||||
```
|
||||
|
||||
现在,你可以使用给定的命令来 [从 Ubuntu 删除 PPA][4]:
|
||||
|
||||
```
|
||||
sudo add-apt-repository --remove ppa:mozillateam/ppa
|
||||
```
|
||||
|
||||
这就完成了!
|
||||
|
||||
#### 方法 2:使用 Snap 安装 Firefox-ESR
|
||||
|
||||
不管你爱不爱它,Snap 在 Ubuntu 上是预先配置好的,我发现使用 Snap 是安装软件包的一个很好的方法,特别是当你想避免从源码构建它们或使用 PPA 时。
|
||||
|
||||
使用 Snap 安装 Firefox-ESR,你需要做的就是使用给定的命令:
|
||||
|
||||
```
|
||||
sudo snap install firefox --channel=esr/stable
|
||||
```
|
||||
|
||||
![install firefox esr using snaps in ubuntu][5]
|
||||
|
||||
如何删除 Firefox-ESR Snap?
|
||||
|
||||
要删除 Firefox-ESR(snap 包),请使用 [snap remove 命令][6]:
|
||||
|
||||
```
|
||||
sudo snap remove firefox
|
||||
```
|
||||
|
||||
这就完成了!
|
||||
|
||||
### 总结
|
||||
|
||||
我在本指南中解释了如何使用多种方法在 Ubuntu 中安装 Firefox-ESR。我个人使用 Firefox-ESR 而不是普通版本,因为我有随机崩溃的情况。
|
||||
|
||||
自从我改用 Firefox-ESR 后,一切都变得稳如磐石。如果你也有同样的问题,你应该试一试。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/firefox-esr-ubuntu/
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/ppa-guide/
|
||||
[2]: https://itsfoss.com/content/images/wordpress/2022/11/add-firefox-esr-repository-in-ubuntu.png
|
||||
[3]: https://itsfoss.com/content/images/wordpress/2022/11/check-installed-version-of-firefox-esr-in-ubuntu.png
|
||||
[4]: https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/
|
||||
[5]: https://itsfoss.com/content/images/wordpress/2022/11/install-firefox-esr-using-snaps-in-ubuntu.png
|
||||
[6]: https://itsfoss.com/remove-snap/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/07/165704ojar9wfkvptwop0w.jpg
|
@ -0,0 +1,150 @@
|
||||
[#]: subject: "8 ideas for measuring your open source software usage"
|
||||
[#]: via: "https://opensource.com/article/22/12/open-source-usage-metrics"
|
||||
[#]: author: "Georg Link https://opensource.com/users/georglink"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "CanYellow"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15411-1.html"
|
||||
|
||||
衡量你的开源软件使用情况的 8 个方法
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 想知道如何为你的开源软件项目收集使用指标?考虑一下使用这些替代方案的利弊。
|
||||
|
||||
我们这些支持开源项目社区的人经常被问到很多有关使用指标的问题。这些指标通常是为了通过用户量和知名度来衡量软件的重要性。我们一般都想知道有多少人使用该软件,有多少次安装,以及有多少人生活接触过它。
|
||||
|
||||
但简而言之,我们尚无法直接回答上述问题。
|
||||
|
||||
如果你想要寻找一个明确的解决方案,那很抱歉要让你失望了。有关使用指标的问题,没有人有完美的答案,至少没有准确的答案。
|
||||
|
||||
好消息是,有一些近似的和替代指标至少能够部分地满足你对软件使用情况了解的渴求。本文探讨了这些替代方案以及它们的优点和缺点。
|
||||
|
||||
### 下载量
|
||||
|
||||
当你浏览提供软件的网站时,你通常可以看到软件的下载次数。映入我脑海的一个例子是 Firefox ,它曾经有一个下载计数器。Firefox 的下载量是一个印象深刻的数字,给人的印象是 Firefox 是一个流行的浏览器,在一段时间内确实如此。
|
||||
|
||||
然而,个人行为会直接影响这一数字的准确性。举例而言,当一个人定期重置他们的设备时,每一次重建都会引发一次独立的下载。考虑到这一现实,需要设计一种方法从下载量中去除几十次(或许是几百次)的下载次数,因为那是一个人。
|
||||
|
||||
下载量不仅会高估使用量,还会低估使用量。例如,一个系统管理员可能会下载一个新版本的 Firefox 一次并将其拷贝到 U 盘上,然后安装到数百台设备上。
|
||||
|
||||
下载量指标是易于收集的,你可以在服务器上记录每一个下载请求。问题在于你不知道在这些软件下载以后会发生什么。下载它的人是否如预期的那样使用软件,还是遇到了问题而放弃了它。
|
||||
|
||||
对于开源项目而言,你可以考虑各种下载量指标,比如来自以下途径的下载指标:
|
||||
|
||||
- 项目官网
|
||||
- 包管理器,比如 npm、PyPi 和 Maven
|
||||
- 代码仓库,如 GitHub、GitLab、Gitee 等
|
||||
|
||||
你可能还对源代码的下载量感兴趣,因为下游项目更可能使用源代码形式(参见 [《如何衡量你的开源项目的影响》][1]一文)。相应的下载指标包括:
|
||||
|
||||
- 从代码仓库克隆的数量,比如 GitHub、GitLab 和 Gitee
|
||||
- 从官网下载的归档文件(tar、zip)的数量
|
||||
- 通过像 npm、PyPi 和 Maven 这样的包管理器下载的源代码数量
|
||||
|
||||
源代码的下载指标比二进制代码的下载指标更不可靠(虽然尚无相关研究表明如此)。试想一下,一名开发人员想要你的最新版本的源代码,并将他们的构建管道配置为每次构建都克隆你的仓库。再想象一下,一个自动构建过程失败了,它试图重新构建而不断地克隆你的版本库。你还可以考虑这样一个下载量低于预期的场景——源代码仓库在某些地方缓存了,下载来源是由这些缓存所提供的。
|
||||
|
||||
> **[相关阅读:跟踪你的开源社区的 5 个指标][2]**
|
||||
|
||||
总而言之,下载量指标是用于提供当前使用情况和探测趋势的很好的指征。我们无法明确地定义一次下载是如何转化为使用的。不过我们可以认为增加的下载量是更多潜在用户的标志。举例而言,如果你为你的软件做了广告并在活动期间得到了更高的下载量,可以合理地假定广告推动了更多人下载该软件。下载行为的来源与元数据还可以提供额外的与使用行为相关的内容。你的软件的哪些版本仍在使用中?什么操作系统或者特定语言的版本更加流行?这有助于社区决定将哪个平台的软件作为支持与测试的优先选项。
|
||||
|
||||
### 议题
|
||||
|
||||
作为一个开源项目,你可能有一个议题追踪器。当某个人提出一个议题时一般有两个目标,报告一个漏洞或者请求增加一项功能。提议者很可能已经使用过你的软件了。作为一名用户,他可能发现了一个漏洞或者发现了对一个新功能的需求。
|
||||
|
||||
很明显,大多数用户不会执行额外的步骤来提交议题。提议者是我们的忠实用户,我们对他们表示感谢。此外,通过提出议题,他们已经成为了非代码贡献者,他们也有希望成为代码贡献者。经验法则是大约每 10000 名用户中,可能有 100 名提议者,以及 1 名代码贡献者。当然取决于用户类型,上述比例可能有出入。
|
||||
|
||||
回到指标问题,你可以将提议者数量作为评估使用量的下界。相关的指标包括:
|
||||
|
||||
- 提议者数量
|
||||
- 活跃提议者的数量(在过去 6 个月内提出议题的提议者)
|
||||
- 同时有代码贡献的提议者的数量
|
||||
- 尚未解决的议题的数量
|
||||
- 对议题发布的评论数量
|
||||
|
||||
### 邮件列表、论坛和问答网站
|
||||
|
||||
很多开源项目都拥有用户邮件列表、论坛,并且出现在类似 Stack Overflow 的问答网站上。与提问者一样,在这些地方发帖的人可被视作用户的冰山一角。与邮件列表、论坛和问答网站上的社区活跃程度相关的指标也可用于反映用户数量的上升或下降。相关指标可以集中于以下地方的活动,包括:
|
||||
|
||||
- 用户邮件列表的订阅量
|
||||
- 论坛用户的数量
|
||||
- 问题的数量
|
||||
- 答案的数量
|
||||
- 发布信息的数量
|
||||
|
||||
### 上报功能
|
||||
|
||||
为了获得精确的用户数量,一个方案是让软件在使用时上报信息。
|
||||
|
||||
这是令人毛骨悚然的。想象一下,系统管理员的防火墙报告了一个非预期的到你的服务器的网络连接,你不仅无法再收到软件报告(被防火墙拦截了),恐怕连你的软件也可能在未来被禁止使用。
|
||||
|
||||
负责任的设置上报功能的方式为设置一项可选服务来检查更新并让用户知道使用最新版本。另一项可选功能可以集中在使用遥测上,你可以通过该功能询问用户是否允许匿名上报软件使用情况。如果经过深思熟虑的实施,这种方式可以允许用户通过他们使用软件的方式帮助优化软件。用户可以持有这样的意见:我一般不允许这种使用信息的分享;但对于一些软件,因为希望开发人员在长期内将软件优化得更好,我愿意这样做。
|
||||
|
||||
### 星标与复刻
|
||||
|
||||
星标与复刻是如 GitHub、GitLab、Gitee 等社交化编程平台的功能。这些平台上的用户可以给一个项目加星标。为什么他们要给项目加星标呢?GitHub 的文档作出了解释:你可以给一个仓库和主题加星标,以跟踪感兴趣的项目,和在你的新闻订阅中发现相关的内容。给一个项目加星标与将其加入书签的效果一样,并且还提供了一种向项目仓库的维护者展示赞赏的方式。星标的数量已经成为了项目流行程度的标志。当一个项目发布重大公告并获得相当的关注时,项目的星标数量会呈上升趋势。星标的数量指标并不反映软件的使用量。
|
||||
|
||||
在社交化编程平台上的<ruby>复刻<rt>Fork</rt></ruby>是将项目仓库复制一份在自己名下。仓库的非维护者可以在他们自己的克隆仓库中做修改,并将修改通过<ruby>拉取请求<rt>pull request</rt></ruby>(PR)的方式提交审核。复刻比星标更能反映软件社区的规模。开发者也可能为了保存一份代码副本而克隆一个项目,以便在原始仓库消失后他们仍能访问代码。因为复刻功能在代码贡献工作流中的应用,复刻量是衡量开发社区的良好指标。复刻量通常也不反映非开发人员的使用,因为非开发人员一般不创建复刻。
|
||||
|
||||
### 社交媒体
|
||||
|
||||
包括 Facebook、Instagram、LinkIn、Reddit、Twtter 等社交媒体平台提供了相同兴趣的人们聚集的平台。采用社交媒体策略,开源项目可以通过在平台上设置相应的聚集空间来吸引对项目感兴趣的人们。通过这些社交媒体途径,开源项目可以分享项目新闻、更新,指出贡献者和用户。这些社交媒体途径还可以用于认识那些本不会通过其他途径与项目互动的人。
|
||||
|
||||
我在犹豫是否建议关注以下指标,因为它与软件的真实使用量没有清晰的联系,并通常需要分析其中的积极、消极和中性的情绪。人们可能因为很多不同的原因对你的项目感到激动而关注它,但并不实际使用它。然而与之前已经讨论过的指标一样,能够在社交媒体上吸收人群本就是项目受关注的整体指标。不同社交媒体平台的指标包括:
|
||||
|
||||
- 关注者与订阅者的数量
|
||||
- 消息的数量
|
||||
- 活跃的消息作者的数量
|
||||
- 喜欢、分享、回复以及其他交互的数量
|
||||
|
||||
### 网站分析与文档
|
||||
|
||||
网站流量也是一个有用的指标。这一指标主要受到你的服务范围以及市场营销活动影响,而不是用户量。然而,我们还有一张王牌:我们的用户文档、教程、手册以及 API 文档。我们可以发现我们的网站以及文档中的什么主题更引人注意。文档的访问者数量应当大致随着软件的使用者数量增长而增长。因此我们可以通过网站的访问量探知对项目的普遍兴趣,并进一步通过观察文档的访问者来观察用户风向。这些指标包括:
|
||||
|
||||
- 网站访问者数量
|
||||
- 文档访问者的数量
|
||||
- 访问者在你的网站与文档上所花的时间
|
||||
|
||||
### 活动
|
||||
|
||||
活动的指标可以在你主持与项目相关的活动时使用。这是建立社区的很好的方式。有多少人提交摘要想要在你的活动中发言?有多少人出席你的活动?不论是在线下活动还是线上活动这可能都很有趣。当然,你如何推广你的活动在很大程度上决定有多少人到场。同时你可以将自己的活动与人们出行的大型活动放在一起以方便人们参加你的活动。只要你使用一贯的活动策略,你可以通过演讲者提交的材料与参会者注册的增加来表征软件受欢迎程度与用户群的增加。
|
||||
|
||||
你并不需要举办你自己的活动来收集有用的指标。如果你在开源活动中主持有关你项目的讨论,你可以衡量有多少人出席主要关注你的项目的会议。像 [FOSDEM][T1] 这样的活动,一些讨论特别聚焦于开源项目的更新与发布,会议室中都挤满了人(像 FOSDEM 的所有会议一样)。
|
||||
|
||||
你可以考虑如下指标:
|
||||
|
||||
- 以你的项目为中心的活动的出席人数
|
||||
- 提交到以你的项目为中心的活动的演讲数量
|
||||
- 以你的项目为中心的演讲的出席人数
|
||||
|
||||
### 关于估算开源软件使用的结论
|
||||
|
||||
正如我们已经如上展现的,有很多指标可以反映软件使用的趋势,没有一个指标是完美的。在大多数情况下,这些指标可能被个人行为、系统设计和噪音所严重影响。因此,考虑到每一个指标的相对不确定性,我们建议你不要孤立地使用任何一个指标。但是如果你从不同的来源收集了一系列的指标,你应当能够探测到用户行为与软件使用的趋势。如果你有办法在多个具有共性的开源项目中比较同一组指标,例如类似的功能、强大的相互依赖性、在同一基础设施上托管,以及其他特征,你就可以提升你对用户行为基线的感知。
|
||||
|
||||
需要注意的是,在这篇概述中,我们选择突出能够评估直接使用情况的指标。而大多数软件都依赖于其他各种软件包,如果我们不提及作为软件依赖链的一部分而被间接使用的严重影响,这就是我们的疏忽。因此,我们建议将上下游依赖的合计数量作为你的分析中的另一层内容。
|
||||
|
||||
最后,作为数据与指标的使用者,我们鼓励你认识到你的利益相关方的权利与责任。你发布的任何指标都有可能影响用户行为。最好的做法是经常一同分享你的背景信息——基础、来源、估算方法和其他关键上下文信息,这有助于其他人解释你的结果。
|
||||
|
||||
感谢 [CHAOSS][T2] 社区在爱尔兰都柏林举行的 CHAOSScon EU 2022 上的富有洞察力的对话,上述对话激发这篇博文的想法。我们还要感谢 CHAOSS 社区的成员审阅并帮助优化本文。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/open-source-usage-metrics
|
||||
|
||||
作者:[Georg Link, Sophia Vargas][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[CanYellow](https://github.com/CanYellow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/georglink
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/18/5/metrics-project-success
|
||||
[2]: https://opensource.com/article/22/11/community-metrics
|
||||
|
||||
[T1]: https://fosdem.org/
|
||||
[T2]: https://chaoss.community
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/04/173129vmnstoxnzmjlnsxw.jpg
|
@ -0,0 +1,188 @@
|
||||
[#]: subject: "Top 5 Live Streaming Applications for Ubuntu and Other Linux [2022 Edition]"
|
||||
[#]: via: "https://www.debugpoint.com/live-streaming-applications-linux-2022/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15443-1.html"
|
||||
|
||||
适用于 Linux 的五大流媒体直播应用
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 本文列出了 Linux 上的五大流媒体直播应用,包括了它们的功能、亮点、下载详情和对比。
|
||||
|
||||
现在是为你的业务纳入在线视频内容的最佳时机。为什么?因为研究表明,全球在线视频市场正以每年约 20% 的速度增长。
|
||||
|
||||
而且,由于开发者们提供的一些优秀软件,任何人都可以轻松地创建视频内容,并在 YouTube 和 Twitch 等几个流行的平台上传播。如果你仔细想想,你会发现如今你在网上观看的视频内容比基于文本的内容更多。
|
||||
|
||||
因此,在这篇文章中,我们将列出一些适用于 Ubuntu 和其他 Linux 的免费软件,这些软件很容易用于为你和你的企业创建超级有趣的流媒体内容。
|
||||
|
||||
### Linux 的五大流媒体直播应用
|
||||
|
||||
#### OBS Studio
|
||||
|
||||
本列表中的第一个免费应用程序是 OBS Studio(即 Open Broadcaster Software)。它是一个具有屏幕广播功能的流媒体直播应用程序,可用于 Linux、Windows 和 macOS。
|
||||
|
||||
出于几个原因,OBS Studio 是这个名单上最好的一个。它内置了编码,支持 RTMP 广播、多源、网络摄像头、绿屏、捕捉卡和你的应用程序窗口。
|
||||
|
||||
其用户界面相当简单明了,功能丰富。你可以从第三方开发的插件中获得帮助,以扩展其功能,例如,在直播时将 Twitter 上的实时推文混入你的流媒体。不过,OBS 不支持多比特率流媒体。
|
||||
|
||||
![OBS Studio - 适用于Linux的直播应用程序][1]
|
||||
|
||||
如何安装:
|
||||
|
||||
OBS Studio 可以在所有 Linux 发行版的官方软件库中找到。详细的安装说明见下面的链接。
|
||||
|
||||
> **[下载 OBS Studio][2]**
|
||||
|
||||
更多信息:
|
||||
|
||||
- [主页][3]
|
||||
- [文档][4]
|
||||
|
||||
#### VokoscreenNG
|
||||
|
||||
我们将在这个列表中介绍的第二个应用程序是 VokoscreenNG。它复刻了已停止的 Vokoscreen 项目。这个新的应用程序完全用 Qt 和 GStreamer 库编写。它可以记录你的屏幕,并接受多个音频源和视频源。VokoscreenNG 的工具箱也相当引人注目。它包括一个放大镜、计时器、系统托盘插件,可以简化你的工作流程。
|
||||
|
||||
它可以免费用于 Linux 和 Windows。
|
||||
|
||||
![vokoscreenNG - 适用于Linux的流媒体直播应用程序][5]
|
||||
|
||||
如何安装:
|
||||
|
||||
你可以从下面的链接下载用于 Linux 系统的压缩可执行文件。下载后,将其解压,然后执行二进制文件来启动该应用程序。
|
||||
|
||||
记住,这个应用程序需要在你的 Linux 系统中安装 X11、PulseAudio 和 GStreamer 插件才能工作。如果你使用的是带有 Wayland 和 Pipewire 声音服务器的现代 Linux 系统(例如 Fedora),这个应用程序可能无法工作。
|
||||
|
||||
> **[下载 VokoscreenNG][6]**
|
||||
|
||||
更多信息:
|
||||
|
||||
- [主页][7]
|
||||
|
||||
#### Restreamer
|
||||
|
||||
Restreamer 应用程序可以让你直接在你的网站上直播视频和截屏,而无需任何流媒体服务商。也可以用这个应用程序使用流行的流媒体解决方案,如 YouTube、Twitch等。
|
||||
|
||||
这个应用程序功能丰富,有一个不错的功能列表。下面是对其功能的快速介绍:
|
||||
|
||||
- 支持 H.264 流媒体
|
||||
- 内置 HTML5 视频播放
|
||||
- 可用于 Linux、macOS、Windows 和 Docker 镜像
|
||||
- 支持你自己的网站和 YouTube、Twitchm、Facebook、Vimeo、Wowza 等。
|
||||
- 支持多个视频源:[网络摄像机][8]、USB 摄像机或任何 H.2645 流媒体
|
||||
- 编码和音频源支持
|
||||
- 支持 JPEG 形式的定期快照
|
||||
- 通过 JSON HTTP API 访问流状态,以便进行额外的编程
|
||||
|
||||
![Restreamer][9]
|
||||
|
||||
如何安装:
|
||||
|
||||
安装 Restreamer 有点麻烦,因为它是通过 Docker 镜像发布的。你可以在下面的链接中找到在 Linux、Windows 和 MacOS 安装的说明。
|
||||
|
||||
> **[下载 Restreamer][10]**
|
||||
|
||||
更多信息:
|
||||
|
||||
- [主页][11]
|
||||
- [文档][12]
|
||||
- [源代码][13]
|
||||
|
||||
#### ffscreencast
|
||||
|
||||
ffscreencast 是一个使用 ffmpeg 库的命令行流媒体应用程序。它利用了 ffmpeg 的强大功能,并作为它的一个封装器。尽管它是以命令行的形式出现的,但你可以直接通过终端使用其强大的功能,如多源和录音设备。它也支持多种显示设置。你还可以在你的桌面截屏上叠加你的摄像机画面。
|
||||
|
||||
如何安装:
|
||||
|
||||
要安装这个应用程序,你需要克隆它的 Git 代码库,然后将其内容复制到 `/bin`目录,以便全局执行 `ffscreencast` 命令。
|
||||
|
||||
```
|
||||
git clone https://github.com/cytopia/ffscreencast
|
||||
cd ffscreencastsudo
|
||||
cp bin/ffscreencast /usr/local/bin
|
||||
```
|
||||
|
||||
你可以在终端用 `ffscreencast` 命令来运行这个应用程序。
|
||||
|
||||
> **[源代码和主页][15]**
|
||||
|
||||
#### Open Streaming Platform
|
||||
|
||||
本列表中的最后一个应用是 Open Streaming Platform(OSP),这是一个开源的 RTMP 流媒体软件,可以作为 YouTube LIVE、Twitch.tv 等的自托管替代品。
|
||||
|
||||
![Open Streaming Platform][14]
|
||||
|
||||
如果使用得当,这个应用程序功能丰富且强大。因为它有以下的基本功能:
|
||||
|
||||
- 从 Open Broadcast Software(OBS)等输入源进行 RTMP 直播。
|
||||
- 每个用户有多个频道,允许一个用户同时广播多个流,而不需要多个账户。
|
||||
- 视频流记录和按需播放。
|
||||
- 手动上传来源于 OSP 之外的 MP4 视频。
|
||||
- 视频剪辑,为值得注意的时刻创建更短的视频。
|
||||
- 频道所有者的实时聊天管理(禁止/解禁)。
|
||||
- 管理员控制的自适应流媒体。
|
||||
- 受保护的频道,只允许你想要的观众访问。
|
||||
- 实时频道,当流媒体没有直播时,继续聊天和闲逛。
|
||||
- Webhooks:通过完全可定制的 HTTP 请求将 OSP 连接到其他服务,这可以传递信息。
|
||||
- 将你的流媒体或视频直接嵌入到另一个网页中,很容易。
|
||||
- 通过 Facebook 或 Twitter 快速分享频道或视频。
|
||||
- 能够将用户界面定制为你自己的个人外观的主题
|
||||
|
||||
如何安装:
|
||||
|
||||
要安装 Open Streaming Platform,请按照以下页面的详细说明进行。
|
||||
|
||||
> **[下载 Open Streaming Platform][16]**
|
||||
|
||||
更多信息:
|
||||
|
||||
- [主页][17]
|
||||
- [源代码][18]
|
||||
- [文档][19]
|
||||
|
||||
### 总结
|
||||
|
||||
可用于 Linux 的自由开源的流媒体应用程序不多。然而,有几个商业性的流媒体应用程序,它们可能会给你更多的选择、质量和支持。但正如我所说,它们可能要花费你一些钱。所以,如果你是流媒体世界的新手,你可能想从上面列出的用于 Linux 系统的免费流媒体应用程序开始。我希望这篇文章能给你一些想法,让你根据自己的需要使用,并让你开始使用。
|
||||
|
||||
请在下面的评论栏里告诉我你最喜欢的流媒体软件。
|
||||
|
||||
加油。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/live-streaming-applications-linux-2022/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/02/OBS-Studio.jpg
|
||||
[2]: https://obsproject.com/wiki/install-instructions#linux
|
||||
[3]: https://obsproject.com/
|
||||
[4]: https://obsproject.com/wiki/Home
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2022/02/vokoscreenNG.jpg
|
||||
[6]: https://linuxecke.volkoh.de/vokoscreen/vokoscreen-download.html
|
||||
[7]: https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html
|
||||
[8]: https://www.debugpoint.com/2018/08/onvifviewer-internet-camera-viewer-for-linux/
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/02/Restreamer.jpg
|
||||
[10]: https://datarhei.github.io/restreamer/docs/installation-index.html
|
||||
[11]: https://datarhei.github.io/restreamer/
|
||||
[12]: https://datarhei.github.io/restreamer/docs/index.html
|
||||
[13]: https://github.com/datarhei/restreamer
|
||||
[14]: https://www.debugpoint.com/wp-content/uploads/2022/02/Open-Streaming-Platform-2048x1026.jpg
|
||||
[15]: https://github.com/cytopia/ffscreencast
|
||||
[16]: https://wiki.openstreamingplatform.com/Install/Standard
|
||||
[17]: https://openstreamingplatform.com/
|
||||
[18]: https://gitlab.com/Deamos/flask-nginx-rtmp-manager
|
||||
[19]: https://wiki.openstreamingplatform.com/
|
||||
[20]: https://www.debugpoint.com/how-to-create-ubuntu-linux-os-bootable-usb-in-windows/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/14/172408h1rpephh9hutsrkd.jpg
|
@ -0,0 +1,130 @@
|
||||
[#]: subject: "How to Update Flatpak Packages in Linux"
|
||||
[#]: via: "https://itsfoss.com/update-flatpak/"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15408-1.html"
|
||||
|
||||
如何在 Linux 中更新 Flatpak 软件包
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
我相信几乎所有的 Linux 用户都会保持他们系统的更新。
|
||||
|
||||
但这种更新通常是针对默认的 [包管理器][1]。例如,[更新 Ubuntu][2] 往往意味着更新所有的 APT 软件包。
|
||||
|
||||
然而,还有其他的打包格式,如 Snap 和 Flatpak。Snap 应用程序会自动更新,但 Flatpak 不会。
|
||||
|
||||
那么你如何更新 Flatpak 软件包呢?好吧,你可以用这个命令来更新所有已安装和可更新的 Flatpak 包:
|
||||
|
||||
```
|
||||
flatpak update
|
||||
```
|
||||
|
||||
这很简单。但让我再讨论一下关于更新 Flatpak 的一些事情,比如说:
|
||||
|
||||
- 更新所有或特定的 Flatpak 包
|
||||
- 通过软件中心更新 Flatpak 包
|
||||
|
||||
让我们先从终端的方法开始。
|
||||
|
||||
### 方法 1:使用终端来更新 Flatpak 包
|
||||
|
||||
首先让我从最实用的方法开始,你也应该从这个方法开始。
|
||||
|
||||
#### 更新每一个过时的 Flatpak 包
|
||||
|
||||
更新现有的 Flatpak 包的整个目录是很容易的。
|
||||
|
||||
输入给定的命令,就可以得到过期包的列表:
|
||||
|
||||
```
|
||||
flatpak update
|
||||
```
|
||||
|
||||
![update flatpak packages in linux][3]
|
||||
|
||||
你只需输入 `Y` 并按下回车键,就能搞定每一个更新。
|
||||
|
||||
#### 更新特定的 Flatpak 包
|
||||
|
||||
要更新特定的软件包,你需要可以更新的软件包的列表。你用的是你之前看到的那个命令。
|
||||
|
||||
```
|
||||
flatpak update
|
||||
```
|
||||
|
||||
![update flatpak packages in linux][4]
|
||||
|
||||
从输出中复制你要更新的软件包的名称。在以下命令中使用软件包的名称:
|
||||
|
||||
```
|
||||
flatpak update package_name
|
||||
```
|
||||
|
||||
例如,如果你想更新 Telegram,下面的命令可以完成这项工作:
|
||||
|
||||
```
|
||||
flatpak update org.telegram.desktop
|
||||
```
|
||||
|
||||
![update specific package in flatpak][5]
|
||||
|
||||
这就完成了。
|
||||
|
||||
### 方法 2:从软件中心更新 Flatpak 应用
|
||||
|
||||
有 Flatpak 内置支持的发行版会在软件中心提供 Flatpak 应用的更新。Fedora 和 Linux Mint 就是这样的发行版。
|
||||
|
||||
但如果你使用的是 Ubuntu,你就需要在 GNOME 软件中心添加 Flatpak 支持:
|
||||
|
||||
```
|
||||
sudo apt install gnome-software-plugin-flatpak
|
||||
```
|
||||
|
||||
完成后,你将在 Ubuntu 中拥有两个软件中心。这是因为默认的软件中心不是 GNOME 的,而是 Snap Store。
|
||||
|
||||
从系统菜单中打开这个新的软件中心:
|
||||
|
||||
![open software center in ubuntu][6]
|
||||
|
||||
进入“<ruby>更新<rt>Update</rt></ruby>”页面,你会发现过时的软件包列表。这包括 APT 和 Flatpak 软件包。
|
||||
|
||||
![update flatpak from software center][7]
|
||||
|
||||
在这里,你可以一次更新所有的软件包,或者你可以有选择地更新什么。
|
||||
|
||||
### 总结
|
||||
|
||||
许多 Linux 桌面用户往往忘记更新 Flatpak 软件包,因为它们不包括在定期的系统更新中。
|
||||
|
||||
由于 Flatpak 是一个沙盒式的打包解决方案,你可能不会面临任何与过时的软件包有关的问题,但你肯定会错过新的功能和修复。
|
||||
|
||||
这就是为什么我建议每隔几周运行一次 Flatpak 更新命令。
|
||||
|
||||
我希望你喜欢这个快速的 Flatpak 小技巧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/update-flatpak/
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/package-manager/
|
||||
[2]: https://itsfoss.com/update-ubuntu/
|
||||
[3]: https://itsfoss.com/content/images/wordpress/2022/12/3.-update-flatpak-packages-in-linux.png
|
||||
[4]: https://itsfoss.com/content/images/wordpress/2022/12/3.-update-flatpak-packages-in-linux.png
|
||||
[5]: https://itsfoss.com/content/images/wordpress/2022/12/4.-update-specific-package-in-flatpak.png
|
||||
[6]: https://itsfoss.com/content/images/wordpress/2022/12/1.-open-software-center-in-ubuntu.png
|
||||
[7]: https://itsfoss.com/content/images/wordpress/2022/12/2.-update-flatpak-from-software-center.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/03/154131lop17rnnrkiprkl7.jpg
|
@ -0,0 +1,262 @@
|
||||
[#]: subject: "Battle of the Texts and the Unicode Savior"
|
||||
[#]: via: "https://itsfoss.com/unicode-linux/"
|
||||
[#]: author: "Sylvain Leroux https://www.yesik.it/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "yzuowei"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15483-1.html"
|
||||
|
||||
文字间的战斗与其救世主 Unicode
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
我们都知道如何从键盘输入文字,不是吗?
|
||||
|
||||
那么,请允许我挑战你在你最爱的文本编辑器中输入这段文字:
|
||||
|
||||
![«Ayumi moved to Tokyo in 1993 to pursue her career» said Dmitrii][1]
|
||||
|
||||
这段文字难以被输入因为它包含着:
|
||||
|
||||
- 键盘上没有的印刷符号,
|
||||
- 平假名日文字符,
|
||||
- 为符合平文式罗马字标准,日本首都的名字中的两个字母 “o” 头顶带有长音符号,
|
||||
- 以及最后,用西里尔字母拼写的名字德米特里。
|
||||
|
||||
毫无疑问,想要在早期的电脑中输入这样的句子是不可能的。这是因为早期电脑所使用的字符集有限,无法兼容多种书写系统。而如今类似的限制已不复存在,马上我们就能在文中看到。
|
||||
|
||||
### 电脑是如何储存文字的?
|
||||
|
||||
计算机将字符作为数字储存。它们再通过表格将这些数字与含有意义的字形一一对应。
|
||||
|
||||
在很长一段时间里,计算机将每个字符作为 0 到 255 之间的数字储存(这正好是一个字节的长度)。但这用来代表人类书写所用到的全部字符是远远不够的。而解决这个问题的诀窍在于,取决于你住在地球上的哪一块区域,系统会分别使用不同的对照表。
|
||||
|
||||
这里有一张在法国常被广泛使用的对照表 [ISO 8859-15][2]:
|
||||
|
||||
![The ISO 8859-15 encoding][3]
|
||||
|
||||
如果你住在俄罗斯,你的电脑大概会使用 [KOI8-R][4] 或是 [Windows-1251][5] 来进行编码。现在让我们假设我们在使用后者:
|
||||
|
||||
![The Windows-1251 encoding is a popular choice to store text written using the Cyrillic alphabets][6]
|
||||
|
||||
对于 128 之前的数字,两张表格是一样的。这个范围与 [US-ASCII][7] 相对应,这是不同字符表格之间的最低兼容性。而对于 128 之后的数字,这两张表格则完全不同了。
|
||||
|
||||
比如,依据 Windows-1251,字符串 “said Дмитрий” 会被储存为:
|
||||
|
||||
```
|
||||
115 97 105 100 32 196 236 232 242 240 232 233
|
||||
```
|
||||
|
||||
按照计算机科学的常规方法,这十二个数字可被写成更加紧凑的十六进制:
|
||||
|
||||
```
|
||||
73 61 69 64 20 c4 ec e8 f2 f0 e8 e9
|
||||
```
|
||||
|
||||
如果德米特里发给我这份文件,我在打开后可能会看到:
|
||||
|
||||
```
|
||||
said Äìèòðèé
|
||||
```
|
||||
|
||||
这份文件 _看起来_ 被损坏了,实则不然。这些储存在文件里的数据,即数字,并没有发生改变。被显示出的字符与 _另一张表格_ 中的数据相对应,而非文字最初被写出来时所用的编码表。
|
||||
|
||||
让我们来举一个例子,就以字符 “Д” 为例。按照 Windows-1251,“Д” 的数字编码为 196(c4)。储存在文件里的只有数字 196。而正是这同样的数字在 ISO8859-15 中与 “Ä” 相对应。这就是为什么我的电脑错误地认为字形 “Ä” 就是应该被显示的字形。
|
||||
|
||||
![When the same text file is written then read again but using a different encoding][8]
|
||||
|
||||
多提一句,你依然可以时不时地看到一些错误配置的网站展示,或由 [用户邮箱代理][9] 发出的对收件人电脑所使用的字符编码做出错误假设的邮件。这样的故障有时被称为乱码(LCTT 译注:原文用词为 [mojibake][10], 源自日语 _文字化け_)。好在这种情况在今天已经越来越少见了。
|
||||
|
||||
![Example of Mojibake on the website of a French movie distributor. The website name has been changed to preserve the innocent.][11]
|
||||
|
||||
### Unicode 拯救了世界
|
||||
|
||||
我解释了不同国家间交换文件时会遇到的编码问题。但事情还能更糟,同一个国家的不同生产商未必会使用相同的编码。如果你在 80 年代用 Mac 和 PC 互传过文件你就懂我是什么意思了。
|
||||
|
||||
也不知道是不是巧合,[Unicode][12] 项目始于 1987 年,主导者来自<ruby>施乐<rt>Xerox</rt></ruby>和……<ruby>苹果<rt>Apple</rt></ruby> 。
|
||||
|
||||
这个项目的目标是定义一套通用字符集来允许同一段文字中 _同时_ 出现人类书写会用到的任何文字。最初的 Unicode 项目被限制在 65536 个不同字符(每个字符用 16 位表示,即每个字符两字节)。这个数字已被证实是远远不够的。
|
||||
|
||||
于是,在 1996 年 Unicode 被扩展以支持高达 100 万不同的 <ruby>[代码点][13]<rt>code point</rt></ruby>。粗略来说,一个“代码点”可被用来识别字符表中的一个条目。Unicode 项目的一个核心工作就是将世界上正在被使用(或曾被使用)的字母、符号、标点符号以及其他文字仓管起来,并给每一项条目分配一个代码点用以准确分辨对应的字符。
|
||||
|
||||
这是一个庞大的项目:为了让你有个大致了解,发布于 2017 年的 Unicode 版本 10 定义了超过 136,000 个字符,覆盖了 139 种现代和历史上的语言文字。
|
||||
|
||||
随着如此庞大数量的可能性,一个基本的编码会需要每个字符 32 位(即 4 字节)。但对于主要使用 US-ASCII 范围内字符的文字,每个字符 4 字节意味着 4 倍多的储存需求以及 4 倍多的带宽用以传输这些文字。
|
||||
|
||||
![Encoding text as UTF-32 requires 4 bytes per character][14]
|
||||
|
||||
所以除了 [UTF-32][15],Unicode 联盟还定义了更加节约空间的 [UTF-16][16] 和 [UTF-8][17] 编码,分别使用了 16 位和 8 位。但只有 8 位该如何储存超过 100,000 个不同的值呢?事实是,你不能。但这其中窍门在于用一个代码值(UTF-8 中的 8 位以及 UTF-16 中的 16 位)来储存最常用的一些字符。再用几个代码值储存最不常用的一些字符。所以说 UTF-8 和 UTF-16 是 _可变长度_ 编码。尽管这样也有缺陷,但 UTF-8 是空间与时间效率之间一个不错的折中。更不用提 UTF-8 可以向后兼容大部分 Unicode 之前的 1 字节编码,因为 UTF-8 经过了特别设计,任何有效的 US-ASCII 文件都是有效的 UTF-8 文件。你也可以说,UTF-8 是 US-ASCII 的超集。而在今天已经找不到不用 UTF-8 编码的理由了。当然除非你书写主要用的语言需要多字节编码,或是你不得不与一些残留的老旧系统打交道。
|
||||
|
||||
在下面两张图中,你可以亲自比较一下同一字符串的 UTF-16 和 UTF-8 编码。特别注意 UTF-8 使用了一字节来储存拉丁字母表中的字符,但它使用了两字节来存储西里尔字母表中的字符。这是 Windows-1251 西里尔编码储存同样字符所需空间的两倍。
|
||||
|
||||
![UTF-16 is a variable length encoding requiring 2 bytes to encode most characters. Some character still requires 4 bytes though (for example][18]
|
||||
|
||||
![UTF-8 is a variable length encoding requiring 1, 2, 3 or 4 bytes per character][19]
|
||||
|
||||
### 而这些对于打字有什么用呢?
|
||||
|
||||
啊……知道一些你的电脑的能力与局限以及其底层机制也不是什么坏事嘛。特别是我们马上就要说到 Unicode 和十六进制。现在……让我们再聊点历史。真的就一点,我保证……
|
||||
|
||||
……就说从 80 年代起,电脑键盘曾经有过 [`Compose` 键][20](有时候也被标为 `Multi` 键)就在 `Shift` 键的下边。当按下这个键时,你会进入 “<ruby>组合<rt>Compose</rt></ruby>” 模式。一旦在这个模式下,你便可以通过输入助记符来输入你键盘上没有的字符。比如说,在组合模式下,输入 RO 便可生成字符 ®(当作是 O 里面有一个 R 就能很容易记住)。
|
||||
|
||||
![Compose key on lk201 keyboard][21]
|
||||
|
||||
现在很难在现代键盘上看到 `Compose` 键了。这大概是因为占据主导地位的 PC 不再用它了。但是在 Linux 上(可能还有其他系统)你可以模拟 `Compose` 键。这项设置可以通过 GUI 开启,在大多数桌面环境下调用“键盘”控制面板:但具体的步骤取决于你的桌面环境以及版本。如果你成功启用了那项设置,不要犹豫,在评论区分享你在你电脑上所采取的具体步骤。
|
||||
|
||||
(LCTT 译注:如果有读者想要尝试,建议将 `Compose` 键设为大写锁定键,或是别的不常用的键,`Ctrl` 和 `Alt` 会被大部分 GUI 程序优先识别为功能键。还有一些我自己试验时遇到过的问题,在开启 `Compose` 键前要确认大写锁定是关闭的,输入法要切换成英文,组合模式下输入大小写敏感。我试验的系统是 Ubuntu 22.04 LTS。)
|
||||
|
||||
至于我自己嘛,我现在先假设你用的就是默认的 `Shift+AltGr` 组合来模拟 `Compose` 键。(LCTT 校注:`AltGr` 在欧洲键盘上是指右侧的 `Alt` 键,在国际键盘上等价于 `Ctrl+Alt` 组合键。)
|
||||
|
||||
那么,作为一个实际例子,尝试输入 “LEFT-POINTING DOUBLE ANGLE QUOTATION MARK(左双角引号)”(LCTT 译注:Guillemet,是法语和一些欧洲语言中的引号,与中文的书名号不同),你可以输入 `Shift+AltGr` `<<`(你在敲助记符时不需要一直按着 `Shift+AltGr`)。如果你成功输入了这个符号,你自己应该也能猜到要怎么输入 “RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK(右双角引号)” 了。
|
||||
|
||||
来看看另一个例子,试试 `Shift+AltGr` `---` 来生成一个 “EM DASH(长破折号)”(LCTT 译注:中文输入法的长破折号由两个 “EM DASH” 组成)。要做到这个,你需要按下主键盘上的的 [连字符减号][22] 键而非数字键盘上的那个。
|
||||
|
||||
值得注意的是 `Compose` 键在非 GUI 环境下也能工作。但是取决于你使用的是 X11 控制台还是只显示文字的控制台,它们所支持的组合按键顺序并不相同。
|
||||
|
||||
在控制台上,你可以通过命令 `dumpkeys` 来查看支持的组合按键列表(LCTT 译注:可能需要 root 权限):
|
||||
|
||||
```
|
||||
dumpkeys --compose-only
|
||||
```
|
||||
|
||||
在 GUI 下,组合键是在 Gtk/X11 层被实现的。想要知道 Gtk 所支持的助记符,可以查看页面:[https://help.ubuntu.com/community/GtkComposeTable][23]
|
||||
|
||||
### 我们可以避免对 Gtk 字符组合的依赖吗?
|
||||
|
||||
或许我是个纯粹主义者,但是我为 Gtk 这种对 Compose 键进行硬编码的方式感到悲哀。毕竟,不是所有 GUI 应用都会使用 Gtk 库。而且我如果想要添加我自己的助记符的话就只能重新编译 Gtk 了。
|
||||
|
||||
幸好在 X11 层也有对字符组合的支持。在以前则是通过令人尊敬的 [X 输入法(XIM)][24]。
|
||||
|
||||
这个方法在比起基于 Gtk 的字符组合能够在更加底层的地方工作,同时具备优秀的灵活性并兼容很多 X11 应用。
|
||||
|
||||
比如说,假设我只是想要添加 `-->` 组合来输入字符 `→` (U+2192,RIGHTWARDS ARROW(朝右箭头)),我只需要新建 `~/.XCompose` 文件并写入以下代码:
|
||||
|
||||
```
|
||||
cat > ~/.XCompose << EOT
|
||||
# Load default compose table for the current local
|
||||
include "%L"
|
||||
|
||||
# Custom definitions
|
||||
<Multi_key> <minus> <minus> <greater> : U2192 # RIGHTWARDS ARROW
|
||||
EOT
|
||||
```
|
||||
|
||||
然后你就可以启动一个新的 X11 应用,强制函数库使用 XIM 作为输入法,并开始测试:
|
||||
|
||||
```
|
||||
GTK_IM_MODULE="xim" QT_IM_MODULE="xim" xterm
|
||||
```
|
||||
|
||||
新的组合排序应该可以在你刚启动的应用里被输入了。我鼓励你通过 `man 5 compose` 来进一步学习组合文件格式。
|
||||
|
||||
在你的 `~/.profile` 中加入以下两行来将 XIM 设为你所有应用的默认输入法。这些改动会在下一次你登录电脑时生效:
|
||||
|
||||
```
|
||||
export GTK_IM_MODULE="xim"
|
||||
export QT_IM_MODULE="xim"
|
||||
```
|
||||
|
||||
这挺酷的,不是吗?这样你就可以随意的加入你想要的组合排序。而且在默认的 XIM 设置中已经有几个有意思的组合了。试一下输入组合键 `LLAP`。
|
||||
|
||||
但我不得不提到两个缺陷。XIM 已经比较老了,而且只适合我们这些不太需要多字节输入法的人。其次,当你用 XIM 作为输入法的时候,你就不能利用 `Ctrl+Shift+u` 加上代码点来输入 Unicode 字符了。什么?等一下?我还没聊过那个?让我们现在来聊一下吧:
|
||||
|
||||
### 如果我需要的字符没有对应的组合键排序该怎么办?
|
||||
|
||||
组合键是一个不错的工具,它可以用来输入一些键盘上没有的字符。但默认的组合集有限,而切换 XIM 并为一个你一生仅用一次的字符来定义一个新的组合排序十分麻烦。
|
||||
|
||||
但这能阻止你在同一段文字里混用日语、拉丁语,还有西里尔字符吗?显然不能,这多亏了 Unicode。比如说,名字 “あゆみ” 由三个字母组成:
|
||||
|
||||
- [“HIRAGANA LETTER A(平假名字母 あ)” (U+3042)][25]
|
||||
- [“HIRAGANA LETTER YU(平假名字母 ゆ)” (U+3086)][26]
|
||||
- 以及 [“HIRAGANA LETTER MI(平假名字母 み)” (U+307F)][27]
|
||||
|
||||
我在上文提及了 Unicode 字符的正式名称,并遵循了全部用大写拼写的规范。在它们的名字后面,你可以找到它们的 Unicode 代码点,位于括号之间并写作 16 位的十六进制数字。这让你想到什么了吗?
|
||||
|
||||
不管怎样,一旦你知道了的一个字符的代码点,你就可以按照以下组合输入:
|
||||
|
||||
- `Ctrl+Shift+u`,然后是 `XXXX`(你想要的字符的 _十六进制_ 代码点)然后回车。
|
||||
|
||||
作为一种简写方式,如果你在输入代码点时不松开 `Ctrl+Shift`,你就不用敲回车。
|
||||
|
||||
不幸的是,这项功能的实现是在软件库层而非 X11 层,所以对其支持在不同应用间并不统一。以 LibreOffice 为例,你必须使用主键盘来输入代码点。而在基于 Gtk 的应用则接受来自数字键盘的输入。
|
||||
|
||||
最后,当我和我的 Debian 系统上的控制台打交道时,我发现了一个类似的功能,但它需要你按下 `Alt+XXXXX` 而 `XXXXX` 是你想要的字符的 _十进制_ 的代码点。我很好奇这究竟是 Debian 独有的功能,还是因为我使用的语言环境(Locale) 是 `en_US.UTF-8`。如果你对此有更多信息,我会很愿意在评论区读到它们的!
|
||||
|
||||
| GUI | 控制台 | 字符 |
|
||||
| :- | :- | :- |
|
||||
| `Ctrl+Shift+u` `3042` `Enter` | `Alt+12354` | あ |
|
||||
| `Ctrl+Shift+u` `3086` `Enter` | `Alt+12422` | ゆ |
|
||||
| `Ctrl+Shift+u` `307F` `Enter` | `Alt+12415` | み |
|
||||
|
||||
### 死键
|
||||
|
||||
最后值得一提的是,想要不(必须)依赖 Compose 键来输入键组合还有一个更简单的方法。
|
||||
|
||||
你的键盘上的某些键是专门用来创造字符组合的。这些键叫做 <ruby>[死键][28]<rt>Dead Key</rt></ruby>。这是因为当你按下它们一次,看起来什么都没有发生,但它们会悄悄地改变你下一次按键所产生的字符。这个行为的灵感来自于机械打字机:在使用机械打字机时,按下一个死键会印下一个字符,但不会移动字盘。于是下一次按键则会在同一个地方印下另一个字符。视觉效果就是两次按键的组合。
|
||||
|
||||
我们在法语里经常用到这个。举例来说,想要输入字母 `ë` 我必须按下死键 `¨` 然后再按下 `e` 键。同样地,西班牙人的键盘上有着死键 `~`。而在北欧语系下的键盘布局,你可以找到 `°` 键。我可以念很久这份清单。
|
||||
|
||||
![hungary dead keys][29]
|
||||
|
||||
显然,不是所有键盘都有所有死键。实际上,你的键盘上是找不到大部分死键的。比如说,我猜在你们当中只有小部分人——如果真的有的话——有死键 `¯` 来输入 `Tōkyō` 所需要的长音符号(“平变音符”)。
|
||||
|
||||
对于那些你键盘上没有的死键,你需要寻找别的解决方案。好消息是,我们已经用过那些技术了。但这一次我们要用它们来模拟死键,而非“普通”键。
|
||||
|
||||
那么,我们的第一个选择是利用 `Compose` `-` 来生成长音符号(你键盘上有的连字符减号)。按下时屏幕上什么都不会出现,但当你接着按下 `o` 键你就能看到 `ō`。
|
||||
|
||||
Gtk 在组合模式下可以生成的一系列死键都能在 [这里][30] 找到。
|
||||
|
||||
另一个解决方法则是利用 Unicode 字符 “COMBINING MACRON(组合长音符号)”(U+0304),然后字母 `o`。我把细节都留给你。但如果你好奇的话,你会发现你打出的结果有着微妙的不同,你并没有真地打出 “LATIN SMALL LETTER O WITH MACRON(小写拉丁字母 O 带长音符号)”。我在上一句话的结尾用了大写拼写,这就是一个提示,引导你寻找通过 Unicode 组合字符按更少的键输入 `ō` 的方法……现在我将这些留给你的聪明才智去解决了。
|
||||
|
||||
### 轮到你来练习了!
|
||||
|
||||
所以,你都学会了吗?这些在你的电脑上工作吗?现在轮到你来尝试了:根据上面提出的线索,加上一点练习,现在你可以完成文章开头给出的挑战了。挑战一下吧,然后把成果复制到评论区作为你成功的证明。
|
||||
|
||||
赢了也没有奖励,或许来自同伴的惊叹能够满足你!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/unicode-linux/
|
||||
|
||||
作者:[Sylvain Leroux][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[yzuowei](https://github.com/yzuowei)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.yesik.it/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/content/images/wordpress/2017/10//text-challenge.png
|
||||
[2]: https://en.wikipedia.org/wiki/ISO/IEC_8859-15
|
||||
[3]: https://itsfoss.com/content/images/wordpress/2017/10//ISO_8859-15.png
|
||||
[4]: https://en.wikipedia.org/wiki/KOI8-R
|
||||
[5]: https://en.wikipedia.org/wiki/Windows-1251
|
||||
[6]: https://itsfoss.com/content/images/wordpress/2017/10//Windows-1251.png
|
||||
[7]: https://en.wikipedia.org/wiki/ASCII
|
||||
[8]: https://itsfoss.com/content/images/wordpress/2017/10//windows-1251-to-iso8859-15-encoding-decoding-error-example.png
|
||||
[9]: https://en.wikipedia.org/wiki/Email_client
|
||||
[10]: https://en.wikipedia.org/wiki/Mojibake
|
||||
[11]: https://itsfoss.com/content/images/wordpress/2017/10/Mojibake-french-example.png
|
||||
[12]: https://en.wikipedia.org/wiki/Unicode
|
||||
[13]: https://en.wikipedia.org/wiki/Code_point
|
||||
[14]: https://itsfoss.com/content/images/wordpress/2017/10//unicode-utf-32-encoding-example.png
|
||||
[15]: https://en.wikipedia.org/wiki/UTF-32
|
||||
[16]: https://en.wikipedia.org/wiki/UTF-16
|
||||
[17]: https://en.wikipedia.org/wiki/UTF-8
|
||||
[18]: https://itsfoss.com/content/images/wordpress/2017/10//unicode-utf-16-encoding-example.png
|
||||
[19]: https://itsfoss.com/content/images/wordpress/2017/10//unicode-utf-8-encoding-example.png
|
||||
[20]: https://en.wikipedia.org/wiki/Compose_key
|
||||
[21]: https://itsfoss.com/content/images/wordpress/2022/12/compose_key_on_lk201_keyboard.jpg
|
||||
[22]: https://en.wikipedia.org/wiki/Hyphen-minus
|
||||
[23]: https://help.ubuntu.com/community/GtkComposeTable
|
||||
[24]: https://en.wikipedia.org/wiki/X_Input_Method
|
||||
[25]: http://www.fileformat.info/info/unicode/char/3042/index.htm
|
||||
[26]: http://www.fileformat.info/info/unicode/char/3086/index.htm
|
||||
[27]: http://www.fileformat.info/info/unicode/char/307F/index.htm
|
||||
[28]: https://en.wikipedia.org/wiki/Dead_key
|
||||
[29]: https://itsfoss.com/content/images/wordpress/2022/12/hungary_dead_keys.png
|
||||
[30]: https://help.ubuntu.com/community/GtkDeadKeyTable
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/27/123501fod5doujjgo5jfjk.jpg
|
@ -0,0 +1,117 @@
|
||||
[#]: subject: "How to Downgrade Flatpak Packages in Linux"
|
||||
[#]: via: "https://itsfoss.com/downgrade-flatpak-packages/"
|
||||
[#]: author: "Sagar Sharma https://itsfoss.com/author/sagar/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15402-1.html"
|
||||
|
||||
如何在 Linux 中降级 Flatpak 软件包
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> Flatpak 软件包的一个鲜为人知的特点是,它允许你对已安装的应用程序进行降级。下面是如何使用它的方法。
|
||||
|
||||
从技术上讲,小版本或次要更新是为了解决问题。但是,当某些更新破坏你当前的工作流程时,情况可能会变得更糟。
|
||||
|
||||
无论是 Flatpak 包还是 Snap,当出现问题时,一切都会在某个时候崩溃。作为一个沙盒打包方案,它可能不会影响整个系统,但如果你遇到一个让你的应用体验变差的错误,你可能会后悔更新。
|
||||
|
||||
比如之前 [Black Box][1] 的更新就带来了一些错误,无法选择文字!开发人员现在已经解决了这个问题,但在他们没有解决之前,我降级了那个特定的包以使其正常工作。
|
||||
|
||||
所以,如果你想降级特定的 Flatpak 应用,你可以按照本指南进行操作。
|
||||
|
||||
### 在 Linux 中降级 Flatpak 包
|
||||
|
||||
**免责声明:** 与安装 Flatpak 不同,你需要 `sudo` 权限才能降级 Flatpak 包。如果你的用户没有该权限,你可以按照我们关于 [如何向用户授予 sudo 访问权限][2] 的详细指南进行操作。
|
||||
|
||||
以下是步骤:
|
||||
|
||||
#### 1、获取包的应用 ID
|
||||
|
||||
第一步是找到要降级的包的应用 ID。你可以列出已安装的软件包轻松找到它:
|
||||
|
||||
```
|
||||
flatpak list --app
|
||||
```
|
||||
|
||||
![find flatpak package id in linux][4]
|
||||
|
||||
记下要降级的包的应用 ID。
|
||||
|
||||
这里,我要降级 Black Box,所以我的应用 ID 将是 `com.raggesilver.BlackBox`。
|
||||
|
||||
#### 2、列出以前的版本并获取该提交的代码
|
||||
|
||||
获得应用 ID 后,你需要列出以前的版本。
|
||||
|
||||
你可以按照给定的命令语法做到这点:
|
||||
|
||||
```
|
||||
flatpak remote-info --log flathub <Application ID>
|
||||
```
|
||||
|
||||
![find previous releases in flatpak][5]
|
||||
|
||||
找到首选的先前版本后,复制如上所示的提交的代码。
|
||||
|
||||
#### 3、降级 Flatpack 包
|
||||
|
||||
执行前两个步骤后,你应该有以下内容:
|
||||
|
||||
- 包的应用 ID。
|
||||
- 首选旧版本的提交代码。
|
||||
|
||||
现在,你必须将它们放在以下命令中:
|
||||
|
||||
```
|
||||
sudo flatpak update --commit=<commit_code> <Application ID>
|
||||
```
|
||||
|
||||
当我将 Black Box 降级到以前的版本时,我将使用以下命令:
|
||||
|
||||
```
|
||||
sudo flatpak update --commit=c4ef3f4be655cbe2559451a9ef5977ab28139c54bb5adbd7db812f3482bd0db5 com.raggesilver.BlackBox
|
||||
```
|
||||
|
||||
![downgrade flatpak package in linux][6]
|
||||
|
||||
这就完成了!
|
||||
|
||||
要检查你是否已成功降级软件包,你可以列出需要更新的软件包(考虑到其他所有内容都是最新的)。它应该包括你最近降级的软件包的名称:
|
||||
|
||||
```
|
||||
flatpak update
|
||||
```
|
||||
|
||||
![downgrade flatpak package][7]
|
||||
|
||||
如你所见,Black Box 已过时,需要更新,这意味着包已成功降级!
|
||||
|
||||
### 总结
|
||||
|
||||
在本快速教程中,我解释了如何降级 Flatpak 软件包,希望对你有所帮助。
|
||||
|
||||
如果你有任何疑问或建议,请在评论中告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/downgrade-flatpak-packages/
|
||||
|
||||
作者:[Sagar Sharma][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sagar/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/blackbox-terminal/
|
||||
[2]: https://itsfoss.com/add-sudo-user-ubuntu/
|
||||
[4]: https://itsfoss.com/content/images/wordpress/2022/12/find-flatpak-package-id-in-linux.png
|
||||
[5]: https://itsfoss.com/content/images/wordpress/2022/12/find-previous-releases-in-flatpak-1.png
|
||||
[6]: https://itsfoss.com/content/images/wordpress/2022/12/downgrade-flatpak-package-in-linux.png
|
||||
[7]: https://itsfoss.com/content/images/wordpress/2022/12/downgrade-flatpak-package.png
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/01/160400h0mmppwwvxd004bm.jpg
|
@ -0,0 +1,135 @@
|
||||
[#]: subject: "EndeavourOS: Your Search for Perfect Arch Distro Ends Here"
|
||||
[#]: via: "https://www.debugpoint.com/endeavouros-review/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15476-1.html"
|
||||
|
||||
EndeavourOS:你对完美的 Arch 发行版的搜寻到此为止
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 我们整体点评了最近发布的 EndeavourOS “Cassini”。
|
||||
|
||||
每年,个人和小型团队们推出了数以百计的 Linux 发行版。它们大多是 Debian、Ubuntu、Fedora 或 Arch Linux 的直接衍生品,再加上一些定制的东西。这也难怪每年都有因为缺乏贡献、愿景和坚持而死亡的发行版。
|
||||
|
||||
三年前,作为已停止的 Antergos 项目的延续,一个由贡献者们组成的小团队发起了 EndeavourOS 项目。从那时起,由于其安装简单,用户体验和功能,它已经变得很受欢迎。
|
||||
|
||||
![具备 Xfce 桌面的 EndeavourOS][1]
|
||||
|
||||
### 点评 EndeavourOS
|
||||
|
||||
如果你曾经试过它,你就会很明显地发现,他们花了很多心血来开发这个发行版。这个发行版的口号是成为一个面向大众的 “通用” Arch Linux 发行版,摒弃了新用户对 Arch Linux 安装的恐惧,以及使用 Arch 时的优越感。
|
||||
|
||||
如果你曾经尝试过 EndeavourOS,你一定会 “感觉” 到作为一个 Arch 发行版,对最终用户来说,在桌面上执行的事情是多么的 “容易”。
|
||||
|
||||
#### 安装和可供选择的桌面
|
||||
|
||||
通过 “独有的” Calamares 安装程序,它的安装变得超级简单。除此之外,EndeavourOS 团队还特别注意在安装步骤中为你提供了大部分的选项。例如,无需用户干预的临场介质直接启动。它会启动欢迎屏幕。欢迎屏幕要做的事就是提供让你在系统中安装它所有必要选项。
|
||||
|
||||
![EndeavourOS 欢迎屏幕][2]
|
||||
|
||||
默认情况下,ISO 提供了一个轻量级的 Xfce 桌面。然而,EndeavourOS 也为你提供了各种桌面环境和窗口管理器(见下文)。而且它们都经过测试,可以正常工作。如果你在安装过程中连接到了互联网,你可以通过 Calamares 安装程序来安装这些。这意味着你不需要在基本的 Xfce 设置后重新安装它们。
|
||||
|
||||
此外,如果你是一个资深用户,只想安装一个基本的 Arch Linux,不需要任何桌面,那也是可以的。只要在安装时使用 “<ruby>无桌面<rt>No desktop</rt></ruby>” 选项就可以了!
|
||||
|
||||
尽管 Arch Linux 最近创建了一个自动脚本 `archinstall` 来使安装更容易,但通过 EndeavourOS 的 ISO 来获得 Arch 的基本安装仍然更快、更容易。
|
||||
|
||||
![EndeavourOS 安装程序显示无桌面和其他选项][3]
|
||||
|
||||
此外,你可以在三个选项中选择:GRUB、systemd-boot 或 “<ruby>无启动器<rt>no bootloader</rt></ruby>”,这是 EndeavourOS “Cassini” 版本的亮点功能之一。此外,你还可以选择你要安装的软件包(仅在线模式支持)。例如,你可能需要一个基本的系统来开始使用。或者,你可能想安装一些与视频/音频或开发工作有关的应用程序。所有这些你都可以在这个版本中选择。
|
||||
|
||||
安装通过检测我的测试机中安装的其他操作系统而完成,很顺利。在“Cassini” 版本中,该团队还将 mkinitcpio 换成了 [dracut][4],以获得更好的性能,减少启动相关问题的失败。
|
||||
|
||||
#### “Xfce” 旗舰版的桌面体验
|
||||
|
||||
第一次登录后,你会再次看到欢迎程序,其中有一个 “安装后” 可以做的项目列表。开发人员提供了一个非常周到的列表。这包括改变墙纸、更新 Arch 镜像、安装英伟达驱动等初始任务。许多 Linux 发行版都有一个欢迎程序,但我认为这个程序是一个完善的软件包。
|
||||
|
||||
![欢迎应用中的安装后项目][5]
|
||||
|
||||
默认的外观是你能得到的定制的最好的 Xfce 桌面。通过定制,它成为一个外观良好的发行版,远非默认的 Xfce 可比。定制包括 GRUB 菜单、登录屏幕和桌面等等。
|
||||
|
||||
Xfce 主菜单配置了更多的项目,终端略带透明,使用 Qogir 图标主题。所有这些变化都辅以令人惊叹的壁纸和 Arc-Darker 默认 Xfce 主题。
|
||||
|
||||
![EndeavourOS “Cassini” 桌面带有 Xfce 4.18][6]
|
||||
|
||||
#### 性能
|
||||
|
||||
尽管有桌面环境,Arch Linux 的性能总是更好。它总是令人感觉更快,因为它的内部并不臃肿。除此之外,[Xfce 桌面 4.18][7] 在 “Cassini” 版本中还做了额外的性能优化,你可以在浏览桌面的时候感受到。
|
||||
|
||||
在空闲状态下,它使用了大约 700MB 的内存和平均 4% 的 CPU 占用。这是性能基线。资源使用量可能会根据你打开的应用程序的数量而增加。在我之前对 EndeavourOS 的点评中,其性能表现也类似。
|
||||
|
||||
不仅如此,它在默认的 Xfce 安装中只使用了 4GB 的磁盘空间。然而,你可能需要安装额外的重型软件,如 LibreOffice、GIMP 或 KDenlive,这将占用更多磁盘空间。
|
||||
|
||||
![EndeavourOS “Cassini” 的性能][8]
|
||||
|
||||
#### 在 EndeavourOS 中执行日常任务有多容易?
|
||||
|
||||
EndeavourOS 的一大特点是一些基于 Python 的 GUI 工具,可以使你在 Arch Linux 中的生活变得简单。例如,你可以从 Arch 和 EndeavourOS 的软件仓库中获得更新通知、一键从 AUR 安装软件、一键更新镜像和你的系统。你不需要从终端运行任何命令。这对 Arch Linux 的新用户来说是一个很大的帮助。
|
||||
|
||||
![一键安装软件][9]
|
||||
|
||||
![软件包清理器和更新管理器][10]
|
||||
|
||||
#### 处理滚动发布的独特方式,以实现稳定性
|
||||
|
||||
Arch Linux 作为一个滚动发布的发行版,往往会出现故障。例如,在 Arch 主仓库的每个月的内核更新期间,一些系统可能会出现故障。由于它的受欢迎程度和开发者的主动性,如果出现问题,你会得到通知和相关的解决方法。
|
||||
|
||||
最近 Arch Linux 中的 GRUB 问题,给用户带来了大量的启动问题,EndeavourOS 团队通过适当的沟通,给用户提供了解决方法,真的 [处理得很好][11]。
|
||||
|
||||
因此,如果你最终遇到一个不稳定的系统,你也不会真的迷失。
|
||||
|
||||
此外,Pacman 的配置已被定制过,使用 EndeavourOS 选择的镜像,以确保你的体验是完美的。
|
||||
|
||||
#### 对开源硬件和 ARM 的正式支持
|
||||
|
||||
在这个 EndeavourOS “Cassini” 版本中,官方支持了 Pinebook Pro 笔记本电脑。该团队在 Manjaro 软件包的基础上与 Pine64 团队合作,为你提供了独家的 Arch 软件包,使该笔记本开箱即用。此外, EndeavourOS ARM 镜像也可用于树莓派 4。
|
||||
|
||||
#### 社区帮助
|
||||
|
||||
EndeavourOS 最大的好处之一是社区帮助 —— 这是即时的!这主要是指其专门的 [Telegram 频道][12],在那里你可以在几分钟内得到对你的 EndeavourOS 的任何问题的回应。我曾经去过这个频道,管理员/贡献者们都很友好,很有帮助。
|
||||
|
||||
此外,你也可以从官方论坛和其他社交渠道获得帮助。
|
||||
|
||||
### 总结
|
||||
|
||||
在结束对 EndeavourOS 的 [“Cassini” 版本][13] 的点评时,我想说这是一个构建得最好的发行版,而且组织良好。开发者和团队有一个建立通用的 Arch Linux 发行版的清晰路线图。另外,通过对 ARM 和 Pinebook Pro 的支持以及其他举措,其愿景也很明确。
|
||||
|
||||
总而言之,对于每一个希望在 Arch Linux 中拥有一个运行时间更长、更稳定的系统的人来说,这是一个完美的发行版。
|
||||
|
||||
你可以从 [官方网站][14] 下载 EndeavourOS。
|
||||
|
||||
让我们举杯!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/endeavouros-review/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/12/Xubuntu-22.04-with-Xfce-4.18-Desktop-2.jpg
|
||||
[2]: https://www.debugpoint.com/wp-content/uploads/2022/12/EndeavourOS-Welcome-Screen.jpg
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/12/EndeavourOS-installer-showing-22no-desktop22-and-other-options.jpg
|
||||
[4]: https://wiki.archlinux.org/title/Dracut
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2022/12/After-install-items-in-Welcome-app.jpg
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2022/12/EndeavourOS-22Cassini22-Desktop-with-Xfce-4.18.jpg
|
||||
[7]: https://www.debugpoint.com/xfce-4-18-features/
|
||||
[8]: https://www.debugpoint.com/wp-content/uploads/2022/12/EndeavourOS-performance-22Cassini22.jpg
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/12/One-click-installation-of-software.jpg
|
||||
[10]: https://www.debugpoint.com/wp-content/uploads/2022/12/Package-cleaner-and-update-manager.jpg
|
||||
[11]: https://endeavouros.com/news/full-transparency-on-the-grub-issue/
|
||||
[12]: https://endeavouros.com/community/
|
||||
[13]: https://endeavouros.com/news/cassini-packed-with-new-features-is-here/
|
||||
[14]: https://endeavouros.com/download/
|
||||
[15]: https://www.debugpoint.com/mint-upgrade-tool/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/24/205819zhx7kx5899ra9ka9.jpg
|
@ -0,0 +1,258 @@
|
||||
[#]: subject: "11 New Distros to look forward to in 2023"
|
||||
[#]: via: "https://news.itsfoss.com/new-distros-2023/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "Cubik65536"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15463-1.html"
|
||||
|
||||
2023 年值得期待的 11 个新发行版
|
||||
======
|
||||
|
||||
> 你对 2023 年有什么期待?试试这些发行版吧!
|
||||
|
||||
![2023 年值得期待的 11 个新发行版][1]
|
||||
|
||||
是时候向 2022 年说再见了!📆
|
||||
|
||||
2022 年有很多发行版发布,其中有一些非常出色。
|
||||
|
||||
随着人们越来越关注用户体验和性能,Linux 发行版在过去的一年中有了显著的发展。
|
||||
|
||||
对于你我这样的最终用户,可以有几个选择。你可以尝试一些 [对初学者友好的选项][2] 或者尝试一些 [面向资深用户的发行版][3]。
|
||||
|
||||
在本文中,我将重点介绍一些你可以尝试一下看看的新发行版。这些发行版可能不一定能取代现有的流行发行版。但是,如果你想尝试一些新的东西,可以试试列表中的这些。
|
||||
|
||||
所以,你在 2023 年可以期待什么?🤔
|
||||
|
||||
好吧,为了回答这个问题,让我们踏上发行版之旅吧!
|
||||
|
||||
> 💡 新的发行版可能不适合生产环境。如果你不介意尝试新的东西,可以尝试这些选项。
|
||||
|
||||
### 1、Vanilla OS
|
||||
|
||||
![Vanilla OS][4]
|
||||
|
||||
Vanilla OS 是一个基于 Ubuntu 的发行版,它是 [Bottles][5] 的创建者 Mirko Brombin 的心血结晶。
|
||||
|
||||
它旨在提供一个具有**干净、原生的 GNOME 体验,以及<ruby>按需不变性<rt>on-demand immutability</rt></ruby>**和优秀的首次安装体验。
|
||||
|
||||
> LCTT 译注:<ruby>按需不变性<rt>on-demand immutability</rt></ruby>,指一个可以按需让文件不可更改的功能,用于确保系统文件不会被随意更新。 可参考 [此链接](https://documentation.vanillaos.org/docs/almost/)。
|
||||
|
||||
如果你想尝试一些新的东西并且想尝试一下按需不变性这个令 Vanilla OS 如此独特的功能,可以尝试一下这个发行版。
|
||||
|
||||
它还没有稳定版本,在一段时间内也不会有,预计将在 2023 年进行许多改进。
|
||||
|
||||
> **[Vanilla OS][6]**
|
||||
|
||||
### 2、XeroLinux
|
||||
|
||||
![XeroLinux][7]
|
||||
|
||||
这个兴趣项目 [XeroLinux][8] 是 Steve(即 TechXero)启动的,这个项目并不打算成为一个主流发行版,也没有各种花里胡哨的东西。
|
||||
|
||||
这个 “养眼” 版的 Arch Linux 衍生版提供了令人愉快的开箱即用体验和一些令人兴奋的功能。
|
||||
|
||||
如果你希望获得更加易用的 Arch Linux 体验,可以尝试这个。
|
||||
|
||||
**从 2023 年 1 月起**,XeroLinux 将切换到每月发布的计划。所以,你可以期待 2023 年有很多更新!
|
||||
|
||||
> **[XeroLinux][9]**
|
||||
|
||||
### 3、Crystal Linux
|
||||
|
||||
![Crystal Linux][10]
|
||||
|
||||
Crystal Linux 是一个即将发布的基于 Arch 的发行版,它希望**提供一个易于使用的桌面体验,以及现代 Linux 技术**。
|
||||
|
||||
在目前的状态下,它可能不适合新手,而具有 Linux 使用经验的人更有可能喜欢它。
|
||||
|
||||
所以,就目前而言,我建议已经熟悉 Linux 的用户可以尝试一下 Crystal Linux。
|
||||
|
||||
我预计 Crystal Linux 将在 2023 年有一个稳定版本,该版本将具有许多功能和改进,而这些功能和改进都是基于目前可用的 [beta 版本][12]。
|
||||
|
||||
> **[Crystal Linux][12]**
|
||||
|
||||
### 4、TUXEDO OS
|
||||
|
||||
![TUXEDO OS][13]
|
||||
|
||||
[TUXEDO OS][14] 是一个由 TUXEDO 计算机公司(一个专注 Linux 的硬件制造商)提供的基于 Ubuntu 的发行版。
|
||||
|
||||
它提供了 KDE Plasma 桌面环境,还有一些额外的功能,例如用于微调硬件的 **TUXEDO 控制中心**,以及一个用于解决驱动程序与缺少软件包的问题的配置服务 **TUXEDO Tomte**。
|
||||
|
||||
如果你想要一个**不同的 KDE 驱动的体验**,我建议你尝试一下。
|
||||
|
||||
最开始,它只作为预装系统在 TUXEDO 的笔记本和台式电脑上提供。
|
||||
|
||||
但是后来,它在 2022 年 9 月获得了一个通用版本,称为 “TUXEDO OS 1”。它将在 2023 年获得大量更新。
|
||||
|
||||
> **[TUXEDO OS][15]**
|
||||
|
||||
### 5、EuroLinux
|
||||
|
||||
![EuroLinux][16]
|
||||
|
||||
[EuroLinux][17] 是一个具有**企业级特性**的、基于 RHEL 的发行版。它以可靠的软件包提供了稳定性和安全性。
|
||||
|
||||
它基于 **RHEL 9**,可以提供与其他 [基于 RHEL 的服务器发行版][18](如 Rocky Linux,CentOS,AlmaLinux 等)的无缝兼容性。
|
||||
|
||||
它旨在以熟悉的用户界面布局吸引 Windows 和 macOS 用户,在屏幕底部提供了一个半透明的菜单栏。
|
||||
|
||||
你应该尝试一下,因为整个软件包相当充分,可以同时满足 Linux 和 Windows/macOS 用户的需要。
|
||||
|
||||
它现在已经发布了稳定版本,也在 2023 年有更新计划。
|
||||
|
||||
> **[EuroLinux][19]**
|
||||
|
||||
### 6、Zinc
|
||||
|
||||
![Zinc][20]
|
||||
|
||||
[Zinc][21] 是一个 **基于 Ubuntu 的发行版**,经过了调整后提供了一个独特的体验。现有的 Ubuntu 用户可能会惊讶于它所提供的内容。
|
||||
|
||||
它基于 **Xubuntu** 的最新 LTS 版本,使用了 XFCE 桌面环境,并对其进行了许多改进,例如集成的 Linux AppImage 支持、deb-get 包安装程序、BTRFS 作为默认文件系统等。
|
||||
|
||||
如果你正确的配置了它,它可以成为你的日用操作系统的替代品。
|
||||
|
||||
它遵循稳定的发布模式,因此你可以期待 2023 年的重大更新!
|
||||
|
||||
> **[Zinc][21]**
|
||||
|
||||
### 7、CachyOS
|
||||
|
||||
![CachyOS][22]
|
||||
|
||||
[CachyOS][23] 尝试使 **Arch Linux 变得对初学者更加友好**,让任何人都可以使用。它很受欢迎,因为它具有高度的可定制性,而且还拥有最新的软件。
|
||||
|
||||
它旨在为你提供一个快速、安全且易于使用的操作系统。
|
||||
|
||||
该操作系统适用于想要试验和尝试新事物的用户。
|
||||
|
||||
CachyOS 是一个滚动发布的发行版,因此你可以期待它在 2023 年获得大量更新。
|
||||
|
||||
> **[CachyOS][23]**
|
||||
|
||||
### 8、risiOS
|
||||
|
||||
![risiOS][24]
|
||||
|
||||
在基于 Arch 和 Ubuntu 的 Linux 发行版的海洋中,[risiOS][25] 是一道难得的风景。
|
||||
|
||||
该项目基于 Fedora Linux,其起源于美国西雅图。
|
||||
|
||||
它使用 **GNOME 桌面环境** 为用户提供了一个高度可定制的体验,同时还提供了 **自定义的 ZSH 版本**。
|
||||
|
||||
如果你希望尝试一个基于 Fedora 的发行版,这可能是你的新选择!
|
||||
|
||||
risiOS 会在稳定版本间隔中推送一些小更新。在 2023 年,它还有更多的东西可以提供给你。
|
||||
|
||||
> **[risiOS][25]**
|
||||
|
||||
### 9、Exodia OS
|
||||
|
||||
![Exodia OS][26]
|
||||
|
||||
#$**!又是一个基于 Arch 的 Linux 发行版?
|
||||
|
||||
是的。🤭 好吧,看起来今年我们已经受够了基于 Arch 的发行版了,这并不一定是坏事!
|
||||
|
||||
认识一下 [Exodia OS][27],一个基于 Arch 的 Linux 发行版,旨在为安全领域的用户提供高度可定制的体验。
|
||||
|
||||
其功能包括**为各种网络安全领域预装的工具、命令行界面应用、ElKowars wacky widgets (EWW)、Zsh 等**。
|
||||
|
||||
如果你是一个网络安全专家或爱好者,你可以试试!
|
||||
|
||||
他们为三个不同的使用场景提供了三个版本。你可以期待他们在 2023 年继续推送必要的更新和功能添加。
|
||||
|
||||
> **[Exodia OS][27]**
|
||||
|
||||
### 10、Kumandar Linux
|
||||
|
||||
![Kumandar Linux][28]
|
||||
|
||||
乍一看,你可能会认为这是 Windows 7,但如果仔细观察,你会发现这是 [Kumandar Linux][29]。
|
||||
|
||||
它基于**Debian 11,并使用自定义的 XFce 版本**。
|
||||
|
||||
该名称在中文中的含义为 “指挥官”,以向开发者的第一台电脑 [Commodore VIC20][30] 致敬。
|
||||
|
||||
如果你喜欢 Windows 7,但想在 Linux 上体验同样的体验,那么你可以试试!
|
||||
|
||||
目前,该系统只发布了早期的候选版本。但是,你可以期待在 2023 年发布稳定版本,希望如此!
|
||||
|
||||
> **[Kumander][29]**
|
||||
|
||||
### 11、Ubuntu Unity
|
||||
|
||||
![Ubuntu Unity][31]
|
||||
|
||||
[今年早些时候][32],Ubuntu Unity 被宣布为 Ubuntu 的官方版本,是 Ubuntu 的一个翻版。
|
||||
|
||||
它使用了 2010 - 2017 年间 Ubuntu 中使用的 Unity 桌面界面,该界面后来被 Canonical 使用 GNOME 取代。
|
||||
|
||||
开发工作如火如荼,年轻的首席开发人员正在推动更新和增加新功能。
|
||||
|
||||
想要尝试不同风格的 Ubuntu 的用户可以试试这个系统。它提供了 LTS 和非 LTS 版本。
|
||||
|
||||
> **[Ubuntu Unity][33]**
|
||||
|
||||
### 总结
|
||||
|
||||
即使有了这份全面的清单,我也可能遗漏了一些。 🤔
|
||||
|
||||
但是。
|
||||
|
||||
或许 2023 年会有惊喜的发布占据头版,或者一些现有的发行版会尝试一些不同的东西。
|
||||
|
||||
但在那之前,
|
||||
|
||||
_💬 请告诉我你在 2023 年期待着哪些发行版?_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/new-distros-2023/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[Cubik65536](https://github.com/Cubik65536)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/distros-to-look-forward-in-2023.png
|
||||
[2]: https://itsfoss.com/best-linux-beginners/
|
||||
[3]: https://itsfoss.com/advanced-linux-distros/
|
||||
[4]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-1.png
|
||||
[5]: https://usebottles.com
|
||||
[6]: https://vanillaos.org
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/XeroLinux.jpg
|
||||
[8]: https://itsfoss.com/xerolinux/
|
||||
[9]: https://xerolinux.xyz
|
||||
[10]: https://news.itsfoss.com/content/images/2022/12/Crystal-Linux.jpg
|
||||
[11]: https://git.getcryst.al/crystal
|
||||
[12]: https://getcryst.al
|
||||
[13]: https://news.itsfoss.com/content/images/2022/12/TuxedoOS.jpg
|
||||
[14]: https://news.itsfoss.com/tuxedo-os/
|
||||
[15]: https://www.tuxedocomputers.com/en/TUXEDO-OS_1.tuxedo
|
||||
[16]: https://news.itsfoss.com/content/images/2022/12/EuroLinux.jpg
|
||||
[17]: https://news.itsfoss.com/eurolinux-desktop/
|
||||
[18]: https://itsfoss.com/rhel-based-server-distributions/
|
||||
[19]: https://en.euro-linux.com/eurolinux/desktop/
|
||||
[20]: https://news.itsfoss.com/content/images/2022/12/Zinc.png
|
||||
[21]: https://teejeetech.com/tag/zinc/
|
||||
[22]: https://news.itsfoss.com/content/images/2022/12/CachyOS.jpg
|
||||
[23]: https://cachyos.org
|
||||
[24]: https://news.itsfoss.com/content/images/2022/12/risiOS.png
|
||||
[25]: https://risi.io
|
||||
[26]: https://news.itsfoss.com/content/images/2022/12/Exodia-OS.jpg
|
||||
[27]: https://exodia-os.github.io/exodia-website/
|
||||
[28]: https://news.itsfoss.com/content/images/2022/12/Kumander-Linux.jpg
|
||||
[29]: https://www.kumander.org
|
||||
[30]: https://en.wikipedia.org/wiki/VIC-20
|
||||
[31]: https://news.itsfoss.com/content/images/2022/12/UbuntuUnity.jpg
|
||||
[32]: https://news.itsfoss.com/unity-remix-official-flavor/
|
||||
[33]: https://ubuntuunity.org/
|
@ -0,0 +1,96 @@
|
||||
[#]: subject: "3 delightful features of the Linux QtFM file manager"
|
||||
[#]: via: "https://opensource.com/article/22/12/linux-file-manager-qtfm"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15404-1.html"
|
||||
|
||||
Linux QtFM 文件管理器的 3 个令人愉快的功能
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 这个 Linux 文件管理器做了你所期望的一切,没有留下不愉快的惊喜。但这里有一些令人惊喜的事情,使它值得一试。
|
||||
|
||||
QtFM 是一个简单的文件管理器,旨在通过一个快速直观的界面提供文件管理的基本功能。它适用于 Linux、BSD 和 macOS。
|
||||
|
||||
QtFM,顾名思义,使用 Qt(规范发音为 “cute”)编程工具包。我在 C++ 和 Python 中使用过 Qt 工具包,使用它总是一种乐趣。它是跨平台的,具有多个有用的抽象级别,因此开发人员不必直接与特定于供应商的 SDK 交互,而且它具有高度可配置性。从用户的角度来看,无论你使用的是最新的硬件还是[旧计算机][1],这都是一种“自然”且快速的体验。
|
||||
|
||||
### 使用 QtFM
|
||||
|
||||
QtFM 没有太多内容。它专注于实现其名称所声称的:Qt 的文件管理器(FM)。其布局可能是你对文件管理器的期望:左侧是常用位置和设备的列表,右侧是文件列表。
|
||||
|
||||
![QtFM file manager][2]
|
||||
|
||||
它只有四个菜单:
|
||||
|
||||
- <ruby>文件<rt>File</rt></ruby>:创建新文件或文件夹,打开新选项卡或窗口,或退出应用。
|
||||
- <ruby>编辑<rt>Edit</rt></ruby>:在左侧面板中复制、粘贴、移至垃圾箱或创建新书签。
|
||||
- <ruby>视图<rt>View</rt></ruby>:在列表视图和图标视图之间切换,调整布局。
|
||||
- <ruby>帮助<rt>Help</rt></ruby>:许可信息和在线文档链接。
|
||||
|
||||
与 QtFM 交互与你可能习惯使用的任何标准文件管理器的体验大致相同。你可以点击导航、在其默认应用中打开文件、拖放文件和文件夹、复制和粘贴文件和文件夹、启动应用,以及你在与计算机内容交互时执行的任何其他操作。它很熟悉,所以基本上没有学习曲线,也没有不愉快的惊喜。
|
||||
|
||||
然而,也有一些惊喜。这是我最喜欢的三个。
|
||||
|
||||
### 1、将命令放入上下文菜单
|
||||
|
||||
使用 QtFM,你可以将可以在终端中运行的任何命令添加到右键单击上下文菜单中。例如,假设你想要一个将图像转换为 [webp 格式][3] 的选项到右键菜单。无需学习复杂的框架或脚本语言,无需开发插件。你只需 3 个步骤即可完成:
|
||||
|
||||
- 转到 “<ruby>编辑<rt>Edit</rt></ruby>” 菜单并选择 “<ruby>设置<rt>Settings</rt></ruby>”。
|
||||
- 单击 “<ruby>自定义操作选项卡<rt>Custom actions tab</rt></ruby>”。
|
||||
- 单击 “<ruby>添加<rt>Add</rt></ruby>” 按钮并输入要运行的命令,用 `%f` 代表源文件,用 `%n` 代表新文件。
|
||||
|
||||
![QtFM custom actions][4]
|
||||
|
||||
该操作现在出现在你的 QtFM 上下文菜单中。
|
||||
|
||||
### 2、灵活的布局
|
||||
|
||||
Qt 工具包的内置功能之一是它的许多组件(“小部件”)是可分离的。QtFM 利用了这一点,并允许你从 “<ruby>视图<rt>View</rt></ruby>” 菜单中解锁其布局。解锁后,你可以拖动工具栏和侧面板,将它们固定在窗口周围的新位置。我能够将菜单栏、导航工具栏和 URI 字段组合到一个统一的面板中,并且为了方便,我在窗口的右侧放置了一个文件树。
|
||||
|
||||
![QtFM unlocking the layout][5]
|
||||
|
||||
这不需要应用设计甚至配置的特殊知识。你只需解锁、拖放和锁定。
|
||||
|
||||
### 3、标签视图
|
||||
|
||||
许多 Linux 文件管理器提供选项卡的方式与大多数 Web 浏览器相同。这是一个简单的界面技巧,可让你方便地保留多个位置。我不知道它是否真的节省了时间,但我总觉得它确实如此。QtFM 也提供选项卡,我特别喜欢它实现选项卡的方式有两点。
|
||||
|
||||
首先,选项卡默认位于窗口底部(你可以在 “<ruby>设置<rt>Settings</rt></ruby>” 中更改它)。因为我倾向于从左到右、从上到下阅读,所以我通常更喜欢在窗口的底部和右端设置“额外”信息。当然,“额外”信息的构成因用户而异,因此我不会责怪任何开发人员将小部件和面板放置在我不会放置小部件和面板的地方。不过,当开发人员不小心同意我的偏好时,这很好。
|
||||
|
||||
其次,标签是响应式的。只需将鼠标悬停在目标选项卡上,即可将文件或文件夹从一个选项卡拖动到另一个选项卡中。感觉就像从一个窗口拖放到另一个窗口一样自然。
|
||||
|
||||
### 安装 QtFM
|
||||
|
||||
在 Linux 上,你的发行版可能会将 QtFM 打包在它的软件仓库中。如果是这样,你可以使用包管理器进行安装。例如,在 Debian 和基于 Debian 的系统上:
|
||||
|
||||
```
|
||||
$ sudo apt install qtfm
|
||||
```
|
||||
|
||||
如果你的发行版不提供 QtFM,你可以在其 [网站][6] 上找到它的软件包,或者你可以从它的 [Git 仓库][7] 下载源码。
|
||||
|
||||
---
|
||||
|
||||
via: https://opensource.com/article/22/12/linux-file-manager-qtfm
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux 中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/article/22/10/obsolete-computer-linux-opportunity
|
||||
[2]: https://opensource.com/sites/default/files/2022-12/qtfm.webp
|
||||
[3]: https://opensource.com/article/20/4/webp-image-compression
|
||||
[4]: https://opensource.com/sites/default/files/2022-12/qtfm-custom-action.webp
|
||||
[5]: https://opensource.com/sites/default/files/2022-12/qtfm-layout-unlock.webp
|
||||
[6]: https://qtfm.eu/
|
||||
[7]: https://github.com/rodlie/qtfm/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/02/170250zuwyuzzr9o3myl3l.jpg
|
@ -0,0 +1,224 @@
|
||||
[#]: subject: "oh my zsh and powerlevel10k: A Match Made in Heaven"
|
||||
[#]: via: "https://www.debugpoint.com/oh-my-zsh-powerlevel10k/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15432-1.html"
|
||||
|
||||
Oh My Zsh 和 Powerlevel10k:天作之合
|
||||
======
|
||||
|
||||
> 这是一篇快速而简单的指南,用 Oh My Zsh 和 Powerlevel10k 主题改造你的 Zsh 终端 Shell,使其在 Ubuntu 和其他 Linux 发行版中看起来很酷。
|
||||
|
||||
![][1]
|
||||
|
||||
大多数 Linux 发行版中的默认 Shell 是 Bash。Bash 是一个可靠的和传统的工具。然而,它缺乏一些自定义功能,比如漂亮的颜色、光标支持等等。
|
||||
|
||||
你可以使用另一个 Shell,即 Zsh 来得到更多的设置调整,并帮助你扩展你的 Bash Shell 体验。
|
||||
|
||||
这个简单的指南解释了如何安装 Zsh、Oh My Zsh 并应用 Powerlevel10k 主题。
|
||||
|
||||
### Oh My Zsh 和 Powerlevel10k 安装和配置指南
|
||||
|
||||
#### 1、安装 Zsh 和改变 Shell
|
||||
|
||||
打开一个终端,使用以下适用于你的发行版的命令安装 Zsh。
|
||||
|
||||
Ubuntu、Debian、Linux Mint 和所有相关的发行版:
|
||||
|
||||
```
|
||||
sudo apt install zsh
|
||||
```
|
||||
|
||||
Fedora:
|
||||
|
||||
```
|
||||
sudo dnf install zsh
|
||||
```
|
||||
|
||||
Arch:
|
||||
|
||||
```
|
||||
pacman -S zsh
|
||||
```
|
||||
|
||||
安装完成后,找出 Zsh 的安装路径:
|
||||
|
||||
```
|
||||
whereis zsh
|
||||
```
|
||||
|
||||
然后使用当前用户的 Zsh 可执行路径改变 Shell。
|
||||
|
||||
```
|
||||
chsh -s /usr/bin/zsh <用户名 >
|
||||
```
|
||||
|
||||
![改变当前用户的 Shell][2]
|
||||
|
||||
关闭并再次打开终端。然后你应该看到 Zsh 的首次设置。选择选项 2。它将用一个默认的主题改变你的 Shell 提示符的外观,如下图所示:
|
||||
|
||||
![Zsh 的首次设置][3]
|
||||
|
||||
#### 2、安装 Oh My Zsh
|
||||
|
||||
Oh My Zsh 是一套可以进一步定制 Zsh 的脚本。
|
||||
|
||||
首先,我们将从 GitHub 上下载 Oh My Zsh 脚本来安装它。如果你有 `wget` 和 `git` 软件包,那就最好了。如果还没有安装,请使用以下命令 [安装 wget][4] & git:
|
||||
|
||||
```
|
||||
sudo apt install wget
|
||||
sudo apt install git
|
||||
```
|
||||
|
||||
然后用下面的命令安装 Oh My Zsh:
|
||||
|
||||
```
|
||||
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
|
||||
```
|
||||
|
||||
然后你应该看到 Oh My Zsh 及默认主题 Robbyrussell 应用到了你的终端。
|
||||
|
||||
![安装 Oh My Zsh 和默认主题][5]
|
||||
|
||||
Oh My Zsh 还附带了其他的主题,你可以 [使用这篇指南][6] 安装它们。然而,在本教程中,我将谈论一个特定的主题,即 Powerlevel10k。
|
||||
|
||||
#### 3、为 Oh My Zsh 安装 Powerlevel10k 主题
|
||||
|
||||
打开终端,运行以下命令,从 GitHub 上克隆 Powerlevel10k 代码库,并将文件放到 Oh My Zsh 的配置文件夹中。
|
||||
|
||||
```
|
||||
git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
|
||||
```
|
||||
|
||||
用文本编辑器打开 `~/.zshrc` 文件,将 `ZSH_THEME` 变量设为 `"powerlevel10k/powerlevel10k"`。
|
||||
|
||||
```
|
||||
cd ~
|
||||
```
|
||||
|
||||
```
|
||||
nano .zshrc
|
||||
```
|
||||
|
||||
默认情况下,它应该是 Robbyrussell。删除 `”robbyrussell"`,添加下面的 `"powerlevel10k/powerlevel10k"`。
|
||||
|
||||
更改后,你的 `~/.zshrc` 文件应该是这样的:
|
||||
|
||||
```
|
||||
ZSH_THEME="powerlevel10k/powerlevel10k”
|
||||
```
|
||||
|
||||
保存并关闭该文件(`CTRL+O`、回车和 `CTRL+X`)。
|
||||
|
||||
![改变 Oh My Zsh 主题为 Powerlevel10k][7]
|
||||
|
||||
重新启动你的终端,启动首次向导来设置 Powerlevel10k 主题。
|
||||
|
||||
#### 4、Powerleve10k 的首次设置
|
||||
|
||||
安装后启动终端时,Powerlevel10k 会提示你各种问题以了解你的 Linux 发行版设置。所以,根据你的需要按下键,按照你的口味来定制你的终端。下面是一些问题的例子截图,可以给你一些启发。
|
||||
|
||||
![Powerlevel10k - wizard1][8]
|
||||
|
||||
![Powerlevel10k - wizard2][9]
|
||||
|
||||
最后,你可以保存文件,享受你的终端的新面貌。
|
||||
|
||||
![应用 Powerlevel10k Zsh 主题设置后][10]
|
||||
|
||||
如果你想再次重启配置向导,运行以下程序。你可以随心所欲地做,次数不限。
|
||||
|
||||
```
|
||||
p10k configure
|
||||
```
|
||||
|
||||
基本设置就这样结束了。如果你想了解更多,请继续阅读。
|
||||
|
||||
### 更多配置(高级用法)
|
||||
|
||||
#### 5、安装 Dracula GNOME 终端主题
|
||||
|
||||
如果你使用的是带有原生终端应用的 GNOME 桌面,你可以试试令人惊叹的 Drakula 主题。要做到这一点,打开一个终端,运行下面的命令来下载该主题:
|
||||
|
||||
```
|
||||
git clone https://github.com/dracula/gnome-terminalcd gnome-terminal
|
||||
```
|
||||
|
||||
打开 GNOME “终端”应用,进入偏好设置。通过点击 “+” 添加一个新的配置文件,并命名为 “drakula”。然后进入颜色标签,取消勾选 “<ruby>使用系统主题的颜色<rt>use colors from system theme</rt></ruby>” 选项。
|
||||
|
||||
![为终端创建一个新的配置文件][11]
|
||||
|
||||
回到终端,运行以下程序。当出现提示时,选择你刚才创建的配置文件名称,如上所述。
|
||||
|
||||
```
|
||||
./install.sh
|
||||
```
|
||||
|
||||
![为 GNOME “终端”应用 Drakula 主题][12]
|
||||
|
||||
一旦安装完成,回到偏好设置中,将 Drakula 配置文件标记为默认。
|
||||
|
||||
#### 6、Zsh 的自动补完和语法高亮
|
||||
|
||||
你可能想试试由社区开发的两个可用于 Zsh 的插件。它们是 zsh-autosuggestions 和 zsh-syntax-highlighting。
|
||||
|
||||
打开终端,运行以下程序,下载 zsh-autosuggestions,并将其放在插件文件夹中:
|
||||
|
||||
```
|
||||
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
|
||||
```
|
||||
|
||||
同样地,为语法高亮插件运行以下程序:
|
||||
|
||||
```
|
||||
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
|
||||
```
|
||||
|
||||
通过文本编辑器打开 `~/.zshrc`文件(使用以下命令),并找到 `plugins=(git)` 一行。并将其替换为以下内容:
|
||||
|
||||
```
|
||||
nano ~/.zshrc
|
||||
```
|
||||
|
||||
```
|
||||
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
|
||||
```
|
||||
|
||||
使用 `CTRL+O`、回车和 `CTRL+X` 保存并关闭该文件。
|
||||
|
||||
关闭并打开你的终端。现在,你应该可以使用自动建议和语法高亮了。
|
||||
|
||||
### 总结
|
||||
|
||||
这样就好了!你现在应该已经在你的系统上安装了 Oh My Zsh 和 Powerlevel10k 主题。你可以根据自己的需要,进一步定制 Powerlevel10k 主题的外观和行为。
|
||||
|
||||
干杯。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/oh-my-zsh-powerlevel10k/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2022/12/ohp10k.jpg
|
||||
[2]: https://www.debugpoint.com/wp-content/uploads/2022/12/change-the-shell-for-the-current-user.jpg
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2022/12/first-time-setup-for-zsh.jpg
|
||||
[4]: https://www.debugpoint.com/wget-not-found-error/
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2022/12/Install-oh-my-zsh-and-default-theme.jpg
|
||||
[6]: https://www.debugpoint.com/install-use-zsh/
|
||||
[7]: https://www.debugpoint.com/wp-content/uploads/2022/12/change-oh-my-zsh-theme-to-powerlevel10k.jpg
|
||||
[8]: https://www.debugpoint.com/wp-content/uploads/2022/12/powerlevel10k-wizard1.jpg
|
||||
[9]: https://www.debugpoint.com/wp-content/uploads/2022/12/powerlevel10k-wizard-2.jpg
|
||||
[10]: https://www.debugpoint.com/wp-content/uploads/2022/12/After-applying-settings-in-powerlevel10k-zsh-theme.jpg
|
||||
[11]: https://www.debugpoint.com/wp-content/uploads/2022/12/create-a-new-profile-for-terminal.jpg
|
||||
[12]: https://www.debugpoint.com/wp-content/uploads/2022/12/applying-the-drakula-theme-for-gnome-terminal.jpg
|
@ -0,0 +1,188 @@
|
||||
[#]: subject: "11 tips for writing a good Git commit message"
|
||||
[#]: via: "https://opensource.com/article/22/12/git-commit-message"
|
||||
[#]: author: "AmyJune Hineline https://opensource.com/users/amyjune"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "ZhangZhanhaoxiang"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15467-1.html"
|
||||
|
||||
编写好 Git 提交信息的 11 个技巧
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 我请社区的开源从业者分享了他们关于编写有用的 Git 提交信息的建议。
|
||||
|
||||
最近,当需要更新时,我一直在密切关注从产品和服务获得的变更日志。以下是一些示例:
|
||||
|
||||
- 修复了一些错误。
|
||||
- 进行了一些可访问性改进。
|
||||
- 我们已经进行了改进,并修复了错误,以实现更顺畅地运行。
|
||||
|
||||
当我想到我还是一名初级开发人员写的一些首次提交信息时,我不得不沮丧地垂下头:
|
||||
|
||||
- 用鼠标点了一下,现在一切似乎都正常了。
|
||||
- 执行了程序员 X 告诉我的操作,现在横幅是蓝色的。
|
||||
|
||||
这可真令人沮丧!我向我们的贡献者们提出了以下问题:
|
||||
|
||||
- 什么是好的 Git 提交信息?
|
||||
- 什么是坏的 Git 提交信息?
|
||||
- 你认为一个项目应该有哪些关于提交信息所写内容的规则?
|
||||
|
||||
以下是他们的答案:
|
||||
|
||||
### 易阅读的文笔是关键
|
||||
|
||||
与你写任何东西一样,你应该考虑谁会阅读它。然后相应地调整信息的数量和深度。
|
||||
|
||||
提高你的自然语言和写作技能对于软件开发的职业生涯顺利发展至关重要。重要的不仅仅是代码。
|
||||
|
||||
—— [Camilla Conte][1]
|
||||
|
||||
### 具有描述性,不要假设
|
||||
|
||||
我在 [OpenStack][2] 社区中花了很多时间合作,与我在像“野外”的其他随意的项目中看到的相比,它的代码审查者有一些相当严格的标准。
|
||||
|
||||
我花在撰写一条可靠的提交信息的时间,往往要比编写实际的代码实现或修复程序的时间长得多。有时,提交信息可能会比它们解释的代码变化长很多倍。
|
||||
|
||||
总结一些贡献者指导:
|
||||
|
||||
- 描述为什么要做出改变,而不仅仅是改变了什么
|
||||
- 第一个提交行是最重要的(就像电子邮件的主题行)
|
||||
- 不要假设审查者了解你正在修复的原始问题
|
||||
- 不要假设审查者可以访问外部 Web 服务或网站(总结缺陷报告和其他相关讨论)
|
||||
- 不要假设代码是不言自明的和自我说明的(尽管没有必要重复你在代码注释中也提出的观点)
|
||||
- 不要只包含与更改的早期修订相关的信息(我们希望贡献者将修订压扁在一起,并相应地编辑其提交信息)。
|
||||
|
||||
《OpenStack 贡献者指南》中有一个关于该主题的 [简短章节][3]。
|
||||
|
||||
—— [Jeremy Stanley][4]
|
||||
|
||||
### 未来的你会感谢自己
|
||||
|
||||
我非常同意 Jeremy 的观点。+1000。
|
||||
|
||||
Jeremy 说:“描述为什么要做出改变,而不仅仅是改变了什么。”
|
||||
|
||||
想象一下,你是旁观者,在遥远的未来试图理解这个提交。
|
||||
|
||||
正如老话所说,设身处地为他人着想。
|
||||
|
||||
—— [Leigh Morresi][5]
|
||||
|
||||
### 使用 bug ID
|
||||
|
||||
我建议在提交信息的开头添加 bug ID,这样在以后使用 [grep 命令][6] 跟踪提交信息时就会更方便。
|
||||
|
||||
例如:
|
||||
|
||||
```
|
||||
$ git commit -m "BZ#19xxxxx
|
||||
```
|
||||
|
||||
要写出深思熟虑的提交,请考虑以下事项:
|
||||
|
||||
- 我为什么要做这些更改?
|
||||
- 我的更改产生了什么影响?
|
||||
- 为什么有更改的必要?
|
||||
- 更改的依据是什么?
|
||||
|
||||
—— [Agil Antony][7]
|
||||
|
||||
### 讲述整个故事
|
||||
|
||||
我喜欢想象每个提交信息都有一个隐藏的前缀,上面写着 “By applying this(通过应用这个)”。
|
||||
|
||||
一个好的提交信息包括将要发生的事情以及原因。仅仅有工单作参考是不够的,因为这分散了信息;Git 是去中心化的。作为一名软件开发人员,我想知道为什么当前要考虑做出更改。正在解决的具体问题是什么?考虑(并放弃)了哪些替代解决方案?在创建变更集的过程中发现了哪些影响当前内容的意外情况?
|
||||
|
||||
缩短提交信息没有什么好处。你未来的自己和未来的同事会感激你深入地解释了问题,以及为什么这个变更集是解决方案。认真学习和利用那些内容丰富的“烹饪”博客。然而,在此,仅仅是把生活经验替换成了项目的问题罢了(LCTT 译注:意思是要认真学习和模仿优秀、详细的提交信息)。
|
||||
|
||||
—— [Lisa Seelye][8]
|
||||
|
||||
### 但不要过于冗长
|
||||
|
||||
一个好的 Git 提交信息包含有关所做操作的信息,而不要包含其他信息。例如,如果你需要更新 `.gitignore`,只需写 “更新了 .gitignore” 即可。人们可以自行深入到提交本身中了解更多细节。它不需要冗长。
|
||||
|
||||
糟糕的提交信息类似于“哦,糟糕”或“试试这个”。当然,我也曾经犯过这样的错误,但这对于任何需要一目了然地查看提交信息的人来说都没有任何帮助。
|
||||
|
||||
提交信息的规则非常主观。他们可能因领导和团队而异。但至少要提供一些有关提交的上下文信息。特别是如果它是一个大的更改。没有人有时间浏览 1000 多个具有大量更改历史的文件。
|
||||
|
||||
—— [Miriam Goldman][9]
|
||||
|
||||
### 使用现在时
|
||||
|
||||
我喜欢项目经理风格的提交信息,用现在时而不是将来时的术语编写(例如,“添加” 而不是“已添加”)。然而,这通常只有在频繁提交时才有可能。当你面临最后期限时,你能记住的只有“我是如何做的”而已。然而,写得好的提交不仅有助于合作者,而且有助于提交者回忆历史。
|
||||
|
||||
—— [Chris Okpada][10]
|
||||
|
||||
### 不要依赖链接
|
||||
|
||||
我想提醒同事们的一件事是,你不仅仅是向给你的提交作批准的人解释。你还要向未来的开发人员和用户解释,他们在使用 bisect 或 blame 定位问题时发现了这个提交,并试图了解其相关性。
|
||||
|
||||
如果提供的唯一的上下文是指向某个外部系统的链接,并且在未来很长一段时间内,它所链接的系统不再使用,或者该用户无法访问,那么你的提交信息将变得无用,可能还不如空白。
|
||||
|
||||
我经常去挖掘一些开源项目的 Git 历史,发现有些提交信息无非就是一个 Bug ID,或者是某个公司内部的和专用的缺陷跟踪器的链接。
|
||||
|
||||
不要依赖链接!
|
||||
|
||||
—— [Jeremy Stanley][4]
|
||||
|
||||
### 清晰简洁的变更日志
|
||||
|
||||
作为一名发布沟通经理,我会经常阅读整个发布版块。我还会与开发人员会面,讨论任何尚未明确的领域。然后我提前测试了版本。之后,我将通过寻找变更日志和相应的修订或新内容来撰写发布文章。
|
||||
|
||||
变更日志是开发人员的个人提醒,但也有相应的提议和工单。你应该适当地将产品名称大写,使用拼写检查器,与标点符号和句子结构保持一致。首席开发人员也应该校对这些。你的客户,即开发人员,正在阅读这些内容。在运行更新之前,他们应该了解哪些信息能更好地为客户服务?
|
||||
|
||||
—— [Courtney Robertson][11]
|
||||
|
||||
### 具体一点
|
||||
|
||||
作为一个经常性的发布经理,我喜欢带有组件名称的提交的信息,以及对更改内容的简要描述。在我们忘记了你聪明的分支名称之后,还可以参考一下这项工作的请求来自何处,这有助于将修复程序联系在一起。
|
||||
|
||||
- “修复致命错误”并不是理想的提交。
|
||||
- “ISS-304: 修复具有合作伙伴角色的用户在登录访问控制功能中的致命错误”更好。
|
||||
- “ISS-304: 登录访问控制:修复 `getPartnerId()` 的致命错误”也更好。
|
||||
|
||||
我可以查看 Git 提交、分支、合并提交之间的整个关系,并检查更改的各个行和文件。但我在发布过程中没有这样的时间。我希望能够在项目管理工具回溯这项工作的源头,了解哪些组件正在被更改,以及以何种方式进行更改。
|
||||
|
||||
—— [Ryan Price][12]
|
||||
|
||||
### 让它成为一种习惯
|
||||
|
||||
我最喜欢犯的错误是“在我切换分支之前提交”,因为我必须处理其他更紧急的事情。有时候,我需要把我目前的工作提交给一个完全不同的项目。我的经理的策略是让我们像平时一样工作。但当我们变基时,他希望我们在有意义的地方压扁提交,并编写更好的信息。我不能说我们总是这样做,但他的方法确实有道理。
|
||||
|
||||
我也有很多“这个坏了,不知道为什么”类型的信息(哈哈),我尝试了一些东西,但想在尝试其他东西之前提交该尝试,以防方法 A 比方法 B 更接近解决问题。我已经写了 10 多年了。
|
||||
|
||||
—— [RachieVee][13]
|
||||
|
||||
你的提交信息建议或提示是什么?让我们在评论中知道。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/12/git-commit-message
|
||||
|
||||
作者:[AmyJune Hineline][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[ZhangZhanhaoxiang](https://github.com/ZhangZhanhaoxiang)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/amyjune
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/users/spotlesstofu
|
||||
[2]: https://opensource.com/resources/what-is-openstack
|
||||
[3]: https://docs.openstack.org/contributors/common/git.html#commit-messages
|
||||
[4]: https://opensource.com/users/fungi
|
||||
[5]: https://opensource.com/users/dgtlmoon
|
||||
[6]: https://opensource.com/downloads/grep-cheat-sheet
|
||||
[7]: https://opensource.com/users/agantony
|
||||
[8]: https://opensource.com/users/lisa
|
||||
[9]: https://opensource.com/users/miriamgoldman
|
||||
[10]: https://opensource.com/users/ojchris
|
||||
[11]: https://opensource.com/users/courtneyrdev
|
||||
[12]: https://opensource.com/users/liberatr
|
||||
[13]: https://opensource.com/users/rachievee
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/22/184300vcsqmm85ub1ssh4b.jpg
|
@ -0,0 +1,80 @@
|
||||
[#]: subject: "An Open-Source Alternative to Google, Alexa, and Siri in Works for Home Assistant Platform"
|
||||
[#]: via: "https://news.itsfoss.com/open-source-assistant/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15426-1.html"
|
||||
|
||||
Home Assistant:谷歌助理、Alexa 和 Siri 的开源替代品
|
||||
======
|
||||
|
||||
> 一个开源助手可以取代谷歌助理、Alexa 和 Siri?
|
||||
|
||||
![An Open-Source Alternative to Google, Alexa, and Siri in Works for Home Assistant Platform][1]
|
||||
|
||||
**Home Assistant** 是一个开源的智能家居平台,专注于为用户提供本地控制和隐私。它可以从树莓派或甚至本地服务器上运行。
|
||||
|
||||
他们还有一个订阅服务,可以获得额外的功能,如支持 Alexa 和谷歌助理,它由一家名为 “[Nabu Casa][2]” 的公司管理。
|
||||
|
||||
> 💡 该公司由 Home Assistant 的创始人 [Paulus Schoutsen][3] 领导。
|
||||
|
||||
在上周的 [博客][4] 中,Paulus 宣布了**一个新的开源项目,旨在提供一个没有主动互联网连接的语音助手**,也无需任何其他大型科技公司的语音助手。
|
||||
|
||||
这是 _一个对谷歌助理、Alexa 和 Siri 的开源挑战者?_ 😲
|
||||
|
||||
让我们看看这到底是怎么回事。
|
||||
|
||||
**它是什么?** 这将是 Home Assistant 应用的一部分,将提供在本地运行语音命令的能力,以控制连接的智能设备。
|
||||
|
||||
Paulus 还断言,他们最重要的优先事项是支持不同的语言,他说:
|
||||
|
||||
> 人们需要能够用自己的语言说话,因为对于智能家居的语音助手来说,这是最容易接受和唯一可以接受的语言。
|
||||
|
||||
为了推动这一努力,Rhasspy 的创造者 [Mike Hansen][5] 已经被拉来实现这一目标。
|
||||
|
||||
对于那些不知道的人来说,[Rhasspy][6] 是另一个开源软件,专门提供一个由其用户社区支持的完全离线的语音助手。
|
||||
|
||||
如果你问我,我觉得 Home Assistant 的这个功能将由 Rhasspy 提供,这是一件好事。
|
||||
|
||||
_为什么要重新发明已经存在的东西?最好是在它的基础上进行改进。_
|
||||
|
||||
**可以期待什么?** 最初,这个语音助手做不到做你可能期待的事情。因此,像进行网络搜索、打电话、玩语音游戏等,都是不可能的。
|
||||
|
||||
它所关注的反而是**语音助手应该有的基本功能**。这样做是为了确保他们面前的工作是可控的。
|
||||
|
||||
他们的目标是从几个动作开始,然后围绕它们建立语言模型。
|
||||
|
||||
在目前的状态下,Home Assistant 在其用户界面上支持 62 种不同的语言。他们计划用他们的语音助手增加对所有这些语言的支持。
|
||||
|
||||
**何时期待?** 他们已经开始了这方面的工作,为每种语言建立一个 [意图匹配句子集合][7]。
|
||||
|
||||
这意味着社区可以通过将智能设备的命令改编成各自的母语,来为语音助手的发展做出贡献。
|
||||
|
||||
他们的目标是在 **2023** 年的某个时候发布,并提到这将是“_语音年_”。
|
||||
|
||||
我认为一个可以离线工作的开源语音助手可以是一个非常有用的东西。它可以让你不受大科技公司的任何追踪。
|
||||
|
||||
💬 _还有一个额外的好处是,它的开发背后有一个庞大的社区,有什么理由不喜欢呢?_
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/open-source-assistant/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/open-source-home-assistant-in-works.png
|
||||
[2]: https://www.nabucasa.com
|
||||
[3]: https://twitter.com/balloob
|
||||
[4]: https://www.home-assistant.io/blog/2022/12/20/year-of-voice/
|
||||
[5]: https://synesthesiam.com
|
||||
[6]: https://rhasspy.readthedocs.io
|
||||
[7]: https://github.com/home-assistant/intents
|
@ -0,0 +1,137 @@
|
||||
[#]: subject: "Vanilla OS Stable Release Has Landed!"
|
||||
[#]: via: "https://news.itsfoss.com/vanilla-os-release/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15401-1.html"
|
||||
|
||||
不普通的普通操作系统:Vanilla OS 稳定版发布了!
|
||||
======
|
||||
|
||||
> Vanilla OS 已经准备好让你尝试!在这里了解令人兴奋的地方。
|
||||
|
||||
![][1]
|
||||
|
||||
Vanilla OS 是一个基于 Ubuntu 的发行版,旨在为用户提供一个具有随需应变能力和自由选择软件包的 GNOME 体验。(LCTT 译注:Vanilla —— “香草”,因为作为太普通的香料,所以也有“普普通通”的意思。)
|
||||
|
||||
经过几个月的测试,**Vanilla OS 的第一个版本** 终于以 **Vanilla 22.10 Kinetic** 的形式出现了,其提供了原汁原味的 **GNOME 43**。
|
||||
|
||||
在最近的一次采访中,我们问创建者:“很多人认为我们已经有太多的发行版了。为什么还要有 Vanilla OS?”,**Mirko Brombin**,分享了一些有趣的见解享。请看下面我们与他的对话,探索关于 Vanilla OS 的令人兴奋的事情:
|
||||
|
||||
> **[“不要害怕做出贡献”:Mirko Brombin 谈 Vanilla OS 和其他未来项目][22]**
|
||||
|
||||
Vanilla OS 有几个特点,你可能会觉得有帮助,请允许我向你介绍一下。
|
||||
|
||||
### 主要亮点
|
||||
|
||||
![Vanilla OS 22.10 Kinetic][2]
|
||||
|
||||
作为一个新的发行版,Vanilla OS 有一个装备精良的功能集,你可能会喜欢。一些值得注意的亮点包括:
|
||||
|
||||
- 原生安装程序
|
||||
- Vanilla OS <ruby>首次设置<rt>First Setup</rt></ruby> 功能
|
||||
- Vanilla OS 控制中心
|
||||
- apx 软件包管理器
|
||||
- 随需应变能力
|
||||
|
||||
#### 原生安装程序
|
||||
|
||||
![Vanilla OS 安装程序][3]
|
||||
|
||||
Vanilla OS 有一个用 [GTK4][4] 和 [libadwaita][5] 编写的原生的安装程序,它取代了该操作系统在早期开发阶段时使用的 [Calamares][6] 安装程序。
|
||||
|
||||
![Vanilla OS 安装程序正在进行][7]
|
||||
|
||||
之前,他们还宣布将使用来自 Crystal Linux 团队的 [Jade][8] 安装程序。
|
||||
|
||||
但是,他们改变了主意,选择在现有的 [Vanilla 首次设置][10] 项目之上建立 [Vanilla 安装程序][9]。
|
||||
|
||||
#### Vanilla OS 首次设置
|
||||
|
||||
![Vanilla OS 首次设置][11]
|
||||
|
||||
Vanilla OS 的安装完成后,你会看到一个快速设置屏幕,上面用各种语言写着 “欢迎”。
|
||||
|
||||
![Vanilla OS 软件包管理器选择][12]
|
||||
|
||||
然后它将带你完成各种设置,如选择颜色方案,选择你想要的软件包管理器,是否要安装受限制的编解码器,等等。
|
||||
|
||||
我必须说,这很方便! 😃️
|
||||
|
||||
#### Vanilla OS 控制中心
|
||||
|
||||
![Vanilla OS 控制中心][13]
|
||||
|
||||
这个图形化工具使你能够对操作系统进行修改,如运行关键更新和安装额外的驱动程序。
|
||||
|
||||
#### 随需应变的不变性
|
||||
|
||||
![展示 - Vanilla OS 中的 ABRoot 事务性更新][14]
|
||||
|
||||
正如上面 Vanilla OS 的创始人所展示的,这个操作系统可以提供完全的不变性和原子性,允许你在两个根分区(A/B)之间进行交易。
|
||||
|
||||
你问这是什么意思? 🤔
|
||||
|
||||
嗯,这意味着你的系统的核心部分被锁定,以防止任何不必要的变化,特别是那些由损坏的应用程序或错误的更新引起的变化。
|
||||
|
||||
Vanilla OS 使用 [ABRoot][15] 来实现这一目标,之前,他们曾尝试使用 [Almost][16],但结果并不理想。
|
||||
|
||||
![][17]
|
||||
|
||||
它还有一个**智能更新功能**,他们解释如下:
|
||||
|
||||
> VSO(Vanilla System Operator)是一个工具,它将定期检查更新,然后如果设备没有处于大量使用状态,就在后台下载和安装。事实上,VSO 检查是否满足某些检查条件,如资源是否空闲(CPU/RAM),连接是否允许,电池是否至少有 30% 的电量等。
|
||||
|
||||
更新是通过 ABroot 应用的,并在下一次重启时得到修补,而不需要花费额外时间。
|
||||
|
||||
#### apx 软件包管理器
|
||||
|
||||
![Vanilla OS apx][18]
|
||||
|
||||
Vanilla OS 带有 [apx][19] 工具,允许你在不修改根文件系统的情况下在管理的容器内安装软件包。
|
||||
|
||||
### 下载 Vanilla OS
|
||||
|
||||
如果你认为 Vanilla OS 解决了你在 Ubuntu 上遇到的问题,并且想要一个原汁原味的 GNOME 体验,那就来试试吧。
|
||||
|
||||
你可以在其 [官方博客文章][20] 中了解更多关于 Vanilla OS 22.10 的信息。
|
||||
|
||||
> **[下载 Vanilla OS][21]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/vanilla-os-release/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2022/12/vanilla-os-release.png
|
||||
[2]: https://youtu.be/aDvIJ_Hu90Y
|
||||
[3]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-Installer.png
|
||||
[4]: https://news.itsfoss.com/gtk-4-release/
|
||||
[5]: https://news.itsfoss.com/gnome-libadwaita-library/
|
||||
[6]: https://calamares.io
|
||||
[7]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-Installer-2.png
|
||||
[8]: https://github.com/crystal-linux/jade
|
||||
[9]: https://github.com/Vanilla-OS/vanilla-installer
|
||||
[10]: https://github.com/Vanilla-OS/first-setup
|
||||
[11]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-First-Setup.png
|
||||
[12]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-Package-Manager.png
|
||||
[13]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-Control-Center.png
|
||||
[14]: https://youtu.be/hIN-x3P12Tk
|
||||
[15]: https://github.com/Vanilla-OS/ABRoot
|
||||
[16]: https://documentation.vanillaos.org/docs/almost/
|
||||
[17]: https://news.itsfoss.com/content/images/2022/12/vanilla-os-updates.png
|
||||
[18]: https://news.itsfoss.com/content/images/2022/12/Vanilla-OS-apx.png
|
||||
[19]: https://github.com/Vanilla-OS/apx
|
||||
[20]: https://vanillaos.org/2022/12/29/vanilla-os-22-10-kinetic.html
|
||||
[21]: https://vanillaos.org
|
||||
[22]: https://news.itsfoss.com/interview-mirko-brombin/
|
@ -0,0 +1,116 @@
|
||||
[#]: subject: "How to read and write files in Rust"
|
||||
[#]: via: "https://opensource.com/article/23/1/read-write-files-rust"
|
||||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15442-1.html"
|
||||
|
||||
如何在 Rust 中读取和写入文件
|
||||
======
|
||||
|
||||
> 跟随这个演示,学习如何在 Rust 中使用文件系统模块。
|
||||
|
||||
![][0]
|
||||
|
||||
知道如何读写文件对各种用途都很有用。在 Rust 中,这项任务是通过标准库中的文件系统模块([std::fs][1])完成的。在这篇文章中,我将向你介绍如何使用这个模块。
|
||||
|
||||
为了演示这项任务,我准备了一些示例代码,也可以在 [GitHub][2] 上找到。
|
||||
|
||||
### 准备工作
|
||||
|
||||
在使用 Rust 时,失败的函数会返回 [Result][3] 类型。尤其是文件系统模块会返回专门的类型 [std::io::Result<T, Error>][4]。有了这些知识,你可以从 `main()` 函数中返回相同的类型:
|
||||
|
||||
```
|
||||
fn main() -> std::io::Result<()> {
|
||||
/* ...code comes here... */
|
||||
```
|
||||
|
||||
### Rust 文件写入
|
||||
|
||||
在 Rust 中执行文件的 I/O 操作是相对容易的。写入文件可以简化为一行:
|
||||
|
||||
```
|
||||
use std::fs;
|
||||
fs::write("favorite_websites.txt", b"opensource.com")?;
|
||||
Ok(())
|
||||
```
|
||||
|
||||
使用错误传播操作符 `(?)`,错误信息被传递到调用函数中,随后可以处理错误。由于 `main()` 是调用栈中唯一的其他函数,如果写操作失败,错误信息将被传递到控制台输出。
|
||||
|
||||
[fs::write][5] 函数的语法是非常先进的。第一个参数是文件路径,它必须是 [std::path::Path][6] 类型。第二个参数是内容,它实际上是一个字节切片(`[u8]`)。Rust 将传递的参数转换为正确的类型。幸运的是,这些类型基本上是下面的例子中所处理的唯一类型。
|
||||
|
||||
使用文件描述符类型 [std::fs::File][7] 可以实现对写操作更简洁的访问:
|
||||
|
||||
```
|
||||
let mut file = fs::File::create("favorite_websites.txt")?;
|
||||
file.write_all(b"opensource.com\n")?;
|
||||
Ok(())
|
||||
```
|
||||
|
||||
由于文件类型实现了 [Write][8] 特性,所以可以使用相关的方法来写入文件。然而,`create` 方法可以覆盖一个已经存在的文件。
|
||||
|
||||
为了获得对文件描述符的更多控制,必须使用 [std::fs::OpenOptions][9] 类型。这提供了类似于其他语言中的打开模式:
|
||||
|
||||
```
|
||||
let mut file = fs::OpenOptions::new()
|
||||
.append(true)
|
||||
.open("favorite_websites.txt")?;
|
||||
|
||||
file.write_all(b"sourceforge.net\n")?;
|
||||
```
|
||||
|
||||
### Rust 文件读取
|
||||
|
||||
适用于写的东西也适用于读。读取也可以通过简单的一行代码来完成:
|
||||
|
||||
```
|
||||
let websites = fs::read_to_string("favorite_websites.txt")?;
|
||||
```
|
||||
|
||||
以上一行读取文件的内容并返回一个字符串。除了读取字符串,还有 [std::fs::read][10] 函数,如果文件包含二进制数据,该函数会将数据读成一个字节向量。
|
||||
|
||||
下一个例子显示了如何将文件的内容读入内存,随后逐行打印到控制台:
|
||||
|
||||
```
|
||||
let file = fs::File::open("favorite_websites.txt")?;
|
||||
let lines = io::BufReader::new(file).lines();
|
||||
|
||||
for line in lines {
|
||||
if let Ok(_line) = line {
|
||||
println!(">>> {}", _line);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
如果你已经熟悉了其他编程语言,你可能已经注意到没有 `close-` 函数(或类似的)来释放文件句柄。在 Rust 中,当相关变量超出作用域,文件句柄就会被释放。为了定义关闭行为,可以在文件表示的周围应用作用域 `({ })`。我建议你熟悉 [Read][11] 和 [Write][8] 特性,因为你可以在许多其他类型中找到这个特性的实现。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/23/1/read-write-files-rust
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hansic99
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://doc.rust-lang.org/std/fs/
|
||||
[2]: https://github.com/hANSIc99/rust_file_io
|
||||
[3]: https://doc.rust-lang.org/std/result/enum.Result.html
|
||||
[4]: https://doc.rust-lang.org/std/io/type.Result.html
|
||||
[5]: https://doc.rust-lang.org/std/fs/fn.write.html
|
||||
[6]: https://doc.rust-lang.org/std/path/struct.Path.html
|
||||
[7]: https://doc.rust-lang.org/std/fs/struct.File.html
|
||||
[8]: https://doc.rust-lang.org/std/io/trait.Write.html
|
||||
[9]: https://doc.rust-lang.org/std/fs/struct.OpenOptions.html#
|
||||
[10]: https://doc.rust-lang.org/std/fs/fn.read.html
|
||||
[11]: https://doc.rust-lang.org/std/io/trait.Read.html
|
||||
[0]: https://opensource.com/sites/default/files/lead-images/rust_programming_crab_sea.png
|
@ -0,0 +1,137 @@
|
||||
[#]: subject: "who Command in Linux: Explanation with Examples"
|
||||
[#]: via: "https://www.debugpoint.com/who-command-linux/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15430-1.html"
|
||||
|
||||
who 命令的解释与示例
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 这里是一个关于理解 Linux 中 who 命令的初学者指南,并带有几个例子。
|
||||
|
||||
这篇文章是 [Linux 命令][1]学习系列的一部分。
|
||||
|
||||
### who 命令
|
||||
|
||||
Linux 中的 `who` 命令用于显示当前登录到系统中的用户的信息。它显示用户的登录名,用户登录的终端,用户登录的时间,以及远程主机名(如果有)。
|
||||
|
||||
#### 语法
|
||||
|
||||
下面是 `who` 命令的基本语法:
|
||||
|
||||
```
|
||||
who [OPTION]... [ FILE | ARG1 ARG2 ]
|
||||
```
|
||||
|
||||
### 各种 who 命令和开关的例子
|
||||
|
||||
默认情况下,`who` 读取文件 `/var/run/utmp`,其中包含当前登录的用户的信息。如果没有指定选项,它会显示每个用户的登录名、终端和登录时间。
|
||||
|
||||
```
|
||||
who
|
||||
```
|
||||
|
||||
它给出了以下输出。你可以看到它显示了登录名是 `debugpoint`,终端 ID `tty2` 和登录的日期和时间。
|
||||
|
||||
```
|
||||
debugpoint tty2 2023-01-01 11:22 (tty2)
|
||||
```
|
||||
|
||||
![who 命令 - 默认示例][2]
|
||||
|
||||
然而,如果你在虚拟机中运行上述命令,你应该看到同样的情况,但终端 ID 将是 x11 服务器的显示名称,即 `:0`。
|
||||
|
||||
```
|
||||
❯ who
|
||||
debugpoint :0 2023-01-01 23:36 (:0)
|
||||
```
|
||||
|
||||
要显示当前用户的用户名和信息,使用下面的方法:
|
||||
|
||||
```
|
||||
whoami
|
||||
```
|
||||
|
||||
使用 `-b` 选项查看最后一次系统启动时间:
|
||||
|
||||
```
|
||||
❯ who -b
|
||||
system boot 2023-01-01 23:36
|
||||
```
|
||||
|
||||
显示当前系统中登录的用户数:
|
||||
|
||||
```
|
||||
❯ who -q
|
||||
debugpoint
|
||||
users=1
|
||||
```
|
||||
|
||||
所有上述命令与 `-H` 选项配对时,你会有一个更好的含标题行的信息,如下所示:
|
||||
|
||||
```
|
||||
who -H
|
||||
|
||||
NAME LINE TIME COMMENT
|
||||
debugpoint tty2 2023-01-01 11:22 (tty2)
|
||||
```
|
||||
|
||||
如果你想在 Linux 中显示与 `who` 命令有关的所有信息,请使用选项 `-a`:
|
||||
|
||||
```
|
||||
who -aH
|
||||
|
||||
NAME LINE TIME IDLE PID COMMENT EXIT
|
||||
system boot 2023-01-01 11:19
|
||||
run-level 5 2023-01-01 11:19
|
||||
debugpoint + tty2 2023-01-01 11:22 13:26 2042 (tty2)
|
||||
```
|
||||
|
||||
像往常一样,你可以使用下面的重定向将 `who` 命令的输出保存到任何文件:
|
||||
|
||||
```
|
||||
who > user_details.txt
|
||||
```
|
||||
|
||||
#### who 命令选项的例子总结
|
||||
|
||||
下面是一些 `who` 命令的例子和它们的解释:
|
||||
|
||||
下面是一些可以与 `who` 命令一起使用的选项:
|
||||
|
||||
- `-a`: 显示每个用户的主机名、登录时间和进程
|
||||
- `-b`: 显示上次系统启动的时间
|
||||
- `-d`: 显示死进程(已终止但未从 utmp 文件中删除的进程)
|
||||
- `-H`: 显示标题行
|
||||
- `-l`: 显示长格式的登录进程
|
||||
- `-m`: 只显示在 `ARG1 ARG2` 指定的终端上登录的用户的名字和行。
|
||||
- `-q`: 显示已登录用户的数量
|
||||
- `-u`: 显示拥有未脱离进程的用户的信息
|
||||
- `-w`: 显示已经登录的用户信息,格式与 utmp 文件相同
|
||||
|
||||
### 总结
|
||||
|
||||
我希望这篇文章能够帮助你了解 `who` 命令及其基本原理。你也可以阅读 [who 手册页][3]来了解更多。如果你有任何问题,请告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/who-command-linux/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/category/linux-commands
|
||||
[2]: https://www.debugpoint.com/wp-content/uploads/2023/01/who-command-default-example.jpg
|
||||
[3]: https://man7.org/linux/man-pages/man1/who.1.html
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/10/130213zb6odhv8gl8cvxvo.jpg
|
@ -0,0 +1,107 @@
|
||||
[#]: subject: "Colorblind Filters: GNOME Extension to help Colorblind Users"
|
||||
[#]: via: "https://www.debugpoint.com/colorblind-filters-gnome-extension/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15464-1.html"
|
||||
|
||||
Colorblind Filters:帮助色盲用户的 GNOME 扩展
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 一个不错的 GNOME 扩展:Colorblind Filters,它为色盲用户带来了许多调整选项。
|
||||
|
||||
无障碍是计算和操作系统的一个重要方面。它包括对视力障碍、色盲和许多其他健康症状的管理设置。流行的 Linux 桌面环境,如 GNOME 和 KDE Plasma,具有无障碍设置,以帮助所有这些情况。
|
||||
|
||||
感谢 GNOME 扩展生态系统,有大量的专门扩展可以帮助这些用户。我遇到的其中一个扩展是[“Colorblind Filters”][1]。
|
||||
|
||||
### Colorblind Filters – GNOME 扩展
|
||||
|
||||
根据维基百科,_"色盲通常涉及无法区分红色和绿色的深浅。遗传性色盲症没有治疗方法。如果色盲是由其他疾病引起的,治疗潜在的原因会有帮助。"_。
|
||||
|
||||
因此,你有可以调整你的 Linux 桌面设置的选项是很重要的。
|
||||
|
||||
#### 设置扩展程序和 Flatpak
|
||||
|
||||
首先,确保你已经启用了 Flatpak 和 GNOME 扩展。并且安装了扩展管理器。你可以参考这个关于如何 [设置 flatpak][2] 和启用 [GNOME 扩展][3] 的详细指南,或者从终端运行以下命令(对于 Ubuntu、Linux Mint 等)。
|
||||
|
||||
```
|
||||
sudo apt install flatpak
|
||||
sudo apt install gnome-software-plugin-flatpak
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
reboot
|
||||
|
||||
```
|
||||
|
||||
对于 Fedora 用户,使用以下命令。
|
||||
|
||||
```
|
||||
sudo dnf install flatpak
|
||||
sudo dnf install gnome-software-plugin-flatpak
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
reboot
|
||||
```
|
||||
|
||||
完成后,安装扩展管理器:
|
||||
|
||||
```
|
||||
flatpak install com.mattjakeman.ExtensionManager
|
||||
```
|
||||
|
||||
#### 安装扩展
|
||||
|
||||
从应用菜单中打开扩展管理器。搜索 “colorblind”。并安装该扩展(见下图)。
|
||||
|
||||
![安装扩展][4]
|
||||
|
||||
安装后,你可以在系统托盘上看到一个小眼睛图标。你可以点击它来启用预定义的颜色过滤器。
|
||||
|
||||
![Colorblind Filters 扩展托盘图标][5]
|
||||
|
||||
右键点击眼睛图标以获得更多设置。这个扩展带来了色盲集合、模拟和额外选项的所有必要定制。目前有以下选项:
|
||||
|
||||
- 纠正和模拟(具有高对比度)
|
||||
- 红色盲
|
||||
- 绿色盲
|
||||
- 蓝黄色盲
|
||||
- 额外的调整
|
||||
- GBR 和 BRG 的通道混合器
|
||||
- 亮度反转
|
||||
- 颜色反转
|
||||
|
||||
![Colorblind Filters - 选项][6]
|
||||
|
||||
使用最适合你的眼睛的那个。
|
||||
|
||||
### 总结
|
||||
|
||||
我认为苹果的 macOS 和 iOS 已经实现了比 Windows 或 Linux 更好的无障碍。然而,Linux 桌面在这些应用和扩展方面也不落后。另外,还有一些专门的 Linux 发行版,如 “[Accessible Coconut][7]”,它是为专门的需求而建立的。
|
||||
|
||||
我希望 Colorblind GNOME 扩展对你日常使用 Linux 和 GNOME 桌面有帮助。
|
||||
|
||||
干杯。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/colorblind-filters-gnome-extension/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://extensions.gnome.org/extension/5589/colorblind-filters/
|
||||
[2]: https://www.debugpoint.com/how-to-install-flatpak-apps-ubuntu-linux/
|
||||
[3]: https://www.debugpoint.com/how-to-install-and-use-gnome-shell-extensions-in-ubuntu/
|
||||
[4]: https://www.debugpoint.com/wp-content/uploads/2023/01/Install-the-extension.jpg
|
||||
[5]: https://www.debugpoint.com/wp-content/uploads/2023/01/Colorblind-Filters-extension-tray-icon.gif
|
||||
[6]: https://www.debugpoint.com/wp-content/uploads/2023/01/Colorblind-Filters-options.jpg
|
||||
[7]: https://www.debugpoint.com/accessible-coconut-linux-visually-impaired/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202301/21/122942m49s8o25s9ai6szs.jpg
|
@ -0,0 +1,87 @@
|
||||
[#]: subject: "Ultramarine Linux 37 Release Adds Pop OS-Style KDE Plasma, Drops Cutefish"
|
||||
[#]: via: "https://debugpointnews.com/ultramarine-linux-37-release/"
|
||||
[#]: author: "arindam https://debugpointnews.com/author/dpicubegmail-com/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15410-1.html"
|
||||
|
||||
Ultramarine Linux 37 版本发布
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
> Ultramarine Linux 的新版本来了。Ultramarine Linux 37 带有新的自定义软件仓库、KDE Plasma 特色版等等。
|
||||
|
||||
如果你不知道,Ultramarine Linux 是一个基于 Fedora 的发行版,提供了 Budgie、Pantheon、GNOME 等桌面环境。这个发行版通过这些令人赞叹的桌面环境给你提供了最好的 Fedora 体验。
|
||||
|
||||
最近,这个小项目被 [FyraLabs][2] 收购,后者是 PhotonBrowser 和 tauOS 背后的公司。而这使得 Ultramarine 项目有了必要的人力和资金来继续建设他们的发行版。
|
||||
|
||||
自 Fedora 37 发布以来,该团队一直致力于重件当前版本,这包括采用新的基础设施和 CI/CD 管道迁移。终于,Ultramarine Linux 37 登场了。
|
||||
|
||||
那么,它有什么新东西呢?
|
||||
|
||||
### Ultramarine Linux 37 的新功能
|
||||
|
||||
自从被 Fyralabs 收购后,该团队升级并迁移到用于自动化 CI/CD 构建的 GitHub Actions。Ultramarine 自己的软件仓库用于分发其精心组织的软件包(例如 Pantheon 桌面),它在这个版本中会发生变化,并转移到 FyraLabs 的基础设施上。
|
||||
|
||||
因此,如果你正在运行 Ultramarine 36 版本,它可能无法正常工作。你最好重新安装这个版本,因为显然没有从 36 版到 37 版的升级路径。
|
||||
|
||||
此外,Ultramarine 37 为 Fedora 软件包引入了一个名为 [Terra][3] 的滚动仓库,其中包括数百个 Fedora 不提供的应用程序。你可以认为它类似于 [RPM Fusion][4],尽管有所不同。
|
||||
|
||||
要了解更多,请访问 [本页][3] 或从命令行添加以下软件仓库:
|
||||
|
||||
```
|
||||
sudo dnf config-manager --add-repo https://terra.fyralabs.com/terra.repo
|
||||
```
|
||||
|
||||
事实上,这开启了一种可能性,因为你也可以尝试在 Fedora Linux 中谨慎地使用它。如果上述软件仓库能在普通的 Fedora 安装中开箱即用,那就更棒了。
|
||||
|
||||
在上述变化的基础上,Ultramarine Linux 37 首次引入了 KDE Plasma 作为官方版本。KDE Plasma 特色版带来了含有 Latte Dock 和 Lightly Qt 主题的 Pop OS 风格外观。
|
||||
|
||||
![Ultramarine Linux 37 具有独特的 Pop OS 风格的 KDE Plasma 主题][5]
|
||||
|
||||
Ultramarine Linux 37 也放弃了 Cutefish 桌面,因为它目前正处于 [混乱的开发状态,没有可见的路线图][6]。这是该团队的一个很好的决定,因为打包一个已经停止的项目是没有意义的。
|
||||
|
||||
Budgie 桌面旗舰版使用上游的 Fedora 软件包,有更多的默认应用程序。最近,Fedora Linux 删除了对 elementary OS 的 Pantheon 桌面的支持,很遗憾。感谢 Ultramarine Linux 开发者,你仍然可以体验它,因为它已经被转移到新的 Terra 软件仓库中。
|
||||
|
||||
你应该庆幸,Ultramarine Linux 是唯一一个的基于 Fedora 的支持令人赞叹的 Pantheon 桌面的发行版。
|
||||
|
||||
最后,Ultramarine Linux 37 的核心基于 [Fedora 37][7],采用 Linux 主线内核 6.0。因此,所有更新的软件包和工具链都在这个版本中。
|
||||
|
||||
所以,这就是关于这个版本的总结。请继续关注几天后对这个版本的官方点评。如果有兴趣,你可以在这里阅读之前的版本(36)的评论。
|
||||
|
||||
> **[Ultramarine Linux:带有 Budgie、Cutefish 和 Pantheon 桌面的终极 Fedora 特色版][8]**
|
||||
|
||||
### 下载和升级
|
||||
|
||||
由于没有升级路径,建议你对该版本进行全新安装。你可以在下面下载各个桌面环境的 ISO 文件。
|
||||
|
||||
> **[下载 Ultramarine Linux 37][9]**
|
||||
|
||||
参考自:[发布公告][10]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://debugpointnews.com/ultramarine-linux-37-release/
|
||||
|
||||
作者:[arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://debugpointnews.com/author/dpicubegmail-com/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://debugpointnews.com/wp-content/uploads/2023/01/ultra37head.jpg
|
||||
[2]: https://twitter.com/UltramarineProj/status/1579991853478182914
|
||||
[3]: https://terra.fyralabs.com/
|
||||
[4]: https://www.debugpoint.com/enable-rpm-fusion-fedora-rhel-centos/
|
||||
[5]: https://debugpointnews.com/wp-content/uploads/2023/01/Ultramarine-Linux-37-with-unique-Pop-OS-style-KDE-Plasma-Theme.jpg
|
||||
[6]: https://www.debugpoint.com/cutefish-development-restarts/
|
||||
[7]: https://debugpointnews.com/fedora-37-release-accouncement/
|
||||
[8]: https://www.debugpoint.com/ultramarine-linux-36/
|
||||
[9]: https://repos.fyralabs.com/isos/ultramarine/37/
|
||||
[10]: https://github.com/Ultramarine-Linux/build-scripts/releases/tag/37-1.0
|
@ -0,0 +1,147 @@
|
||||
[#]: subject: "Whereis Command in Linux and BSD with Examples"
|
||||
[#]: via: "https://www.debugpoint.com/whereis-command-linux/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15446-1.html"
|
||||
|
||||
whereis 命令的解释与示例
|
||||
======
|
||||
|
||||
> 这是一份关于如何理解 Linux 和 BSD 中 `whereis` 命令的初学者指南,还包括几个例子。
|
||||
|
||||
![][1]
|
||||
|
||||
这篇文章是 [Linux 命令][2] 学习系列的一部分。
|
||||
|
||||
### whereis 命令
|
||||
|
||||
`whereis` 命令是一个命令行程序,可以帮助你找出任何二进制可执行文件、源文件或手册页的路径或位置。
|
||||
|
||||
在告诉你如何使用 `whereis` 命令之前,让我们先看看其语法。
|
||||
|
||||
### 语法
|
||||
|
||||
以下是 whereis 命令的语法:
|
||||
|
||||
```
|
||||
whereis [OPTIONS] FILE_NAME
|
||||
```
|
||||
|
||||
`whereis` 命令的参数是你要搜索的程序名或文件名。该参数是必须的。
|
||||
|
||||
默认情况下,它在环境变量(如 `HOME`、`USER`、`SHELL` 等)中定义的路径中搜索程序。
|
||||
|
||||
让我们看下一些例子。
|
||||
|
||||
### Linux 和 BSD 中 whereis 命令的例子
|
||||
|
||||
下面是 `whereis` 命令的一个简单例子,我试图搜索 `firefox`。在下面的输出中,你可以看到包含 `firefox` 文件或可执行文件的路径列表。
|
||||
|
||||
```
|
||||
$ whereis firefox
|
||||
|
||||
firefox: /usr/bin/firefox /usr/lib64/firefox /etc/firefox /usr/share/man/man1/firefox.1.gz
|
||||
```
|
||||
|
||||
![Linux 中 whereis 命令的简单例子][3]
|
||||
|
||||
带有选项 `-l` 的命令会显示其搜索的路径列表。比如:
|
||||
|
||||
```
|
||||
$ whereis -l
|
||||
|
||||
bin: /usr/bin
|
||||
bin: /usr/sbin
|
||||
bin: /usr/lib
|
||||
bin: /usr/lib64
|
||||
bin: /etc
|
||||
bin: /usr/games
|
||||
bin: /usr/local/bin
|
||||
bin: /usr/local/sbin
|
||||
bin: /usr/local/etc
|
||||
bin: /usr/local/lib
|
||||
bin: /usr/local/games
|
||||
```
|
||||
|
||||
如果 `whereis` 命令没有找到任何东西,它只显示参数的名称。例如,如果我在 Linux 中搜索 `nano`,它没有安装,它的输出如下:
|
||||
|
||||
```
|
||||
$ whereis nano
|
||||
```
|
||||
|
||||
```
|
||||
nano:
|
||||
```
|
||||
|
||||
如果你想搜索更多的参数,你可以随时添加多个参数。例如,下面的命令同时搜索 `bash` 和 `nano`,输出结果是这样的:
|
||||
|
||||
```
|
||||
$ whereis bash nano
|
||||
|
||||
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
|
||||
nano: /usr/bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz
|
||||
```
|
||||
|
||||
你也可以使用 `-b` 选项搜索特定的文件类型,比如二进制文件。下面的命令只告诉你 `nano` 的二进制路径。
|
||||
|
||||
```
|
||||
$ whereis -b nano
|
||||
|
||||
nano: /usr/bin/nano /usr/share/nano
|
||||
```
|
||||
|
||||
同样,`-s` 选项可以搜索源文件,而 `-m` 选项可以搜索手册页。
|
||||
|
||||
```
|
||||
$ whereis -m nano
|
||||
|
||||
nano: /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz
|
||||
```
|
||||
|
||||
你也可以结合上面的选项来进行更广泛的搜索。例如,下面的命令可以搜索 `nano` 和 `firefox` 的二进制、手册页;而对于 `bash`,只搜索手册页。
|
||||
|
||||
```
|
||||
$ whereis -bm nano firefox -m bash
|
||||
|
||||
nano: /usr/bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz
|
||||
firefox-m:
|
||||
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
|
||||
```
|
||||
|
||||
下面是选项的摘要:
|
||||
|
||||
| 选项 | 描述 |
|
||||
| :- | :- |
|
||||
| `-b` | 只搜索二进制文件。|
|
||||
| `-m` | 只搜索手册页部分。|
|
||||
| `-s` | 只搜索源码。|
|
||||
| `-u` | 搜索不寻常的条目。如果一个文件没有所要求的每种类型的条目,就被称为不寻常。因此,`whereis -m -u *` 会查询当前目录中没有文档的那些文件。|
|
||||
| `-B` | 改变或限制 `whereis` 搜索二进制文件的地方。|
|
||||
| `-M` | 更改或限制 `whereis` 搜索手册的位置。|
|
||||
| `-S` | 更改或以其他方式限制 `whereis` 搜索源码的位置。|
|
||||
| `-f` | 终止上一个目录列表并指示文件名的开始,并且必须在使用任何 `-B`、`-M` 或 `-S` 选项时使用。|
|
||||
|
||||
### 总结
|
||||
|
||||
我希望这篇文章能够帮助你理解 `whereis` 命令及其基本原理。你也可以阅读 [whereis 手册页][4] 来了解更多。如果你有任何问题,请告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/whereis-command-linux/
|
||||
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.debugpoint.com/author/admin1/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.debugpoint.com/wp-content/uploads/2023/01/whereis-head.jpg
|
||||
[2]: https://www.debugpoint.com/category/linux-commands
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2023/01/Simple-example-of-whereis-command-in-Linux.jpg
|
||||
[4]: https://linux.die.net/man/1/whereis
|
@ -0,0 +1,215 @@
|
||||
[#]: subject: "Learn to code with my retro computer program"
|
||||
[#]: via: "https://opensource.com/article/23/1/learn-machine-language-retro-computer"
|
||||
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15461-1.html"
|
||||
|
||||
用复古电脑程序 Toy CPU 学习低级编程
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 我写了一个名为 “Toy CPU” 的教育性复古计算机程序,以便我的学生能够学习机器语言。
|
||||
|
||||
我兼职教授大学课程,包括一个对所有专业开放的一般计算机主题的课程。这是一门入门课程,向学生讲授技术是如何运作的,以消除围绕计算的神秘感。
|
||||
|
||||
虽然不是计算机科学课程,但这门课的一个部分涉及计算机编程。我通常用非常抽象的术语谈论编程,所以不会让听众听不懂。但是今年,我想让我的学生以 “老派” 的方式做一些需要 “动手” 的编程。同时,我又想保持简单,以便让每个人都能跟上。
|
||||
|
||||
我喜欢将我的课程结构化,以显示你是如何从 “那里” 到 “这里” 的。理想情况下,我会让我的学生学习如何编写一个简单的程序。然后,我将从这里开始,展示现代编程是如何让开发人员创建更复杂的程序的。我决定尝试一种非常规的方法 —— 教学生学习终极的低级别编程语言:机器语言。
|
||||
|
||||
### 机器语言编程
|
||||
|
||||
早期的个人电脑如 Apple II(1977 年)、TRS-80(1977 年)和 IBM PC(1981 年)让用户用键盘输入程序,并在屏幕上显示结果。但计算机并不总是带有屏幕和键盘。
|
||||
|
||||
Altair 8800 和 IMSAI 8080(均为 1975 年制造)要求用户使用面板上的 “开关和灯” 输入程序。你可以用机器语言输入指令,使用一组开关,机器会点亮 LED 灯以代表每个二进制指令的 1 和 0。
|
||||
|
||||
![Altair 8800 计算机的图片][1]
|
||||
|
||||
对这些早期机器进行编程,需要了解被称为 “<ruby>操作码<rt>opcode</rt></ruby>” (操作代码的简称)的机器语言指令,以执行基本操作,如将两个数字相加或将一个值存储到计算机的存储器中。我想向我的学生展示程序员是如何通过开关和灯,手工输入一系列指令和内存地址的。
|
||||
|
||||
然而,在这门课上,使用实际的 Altair 8800 就有点太复杂了。我需要一些简单的、任何初级水平的学生都能掌握的东西。理想情况下,我希望能找到一个简单的 “业余” 复古计算机,其工作原理与 Altair 8800 相似,但我无法找到一个价格低于 100 美元的合适的 “类似 Altair” 的设备。我找到了几个 “Altair” 软件模拟器,但它们忠实地再现了 Altair 8800 的操作码,这对我的需求来说太过沉重。
|
||||
|
||||
我决定编写我自己的 “教育” 复古计算机。我称它为 “Toy CPU”。你可以在我的 [GitHub 代码库][2] 上找到它,包括几个可以运行的版本。第一版是一个实验性的原型,运行在 [FreeDOS][3] 上。第二版是一个更新的原型,在 Linux 上用 [ncurses][4] 运行。版本 3 是一个 FreeDOS 程序,在图形模式下运行。
|
||||
|
||||
### Toy CPU 的编程
|
||||
|
||||
Toy CPU 是一个非常简单的复古计算机。它只有 256 字节的内存和一个最小化的指令集,其目的是在复制 “开关和灯” 编程模式的同时保持简单化。它的界面模仿 Altair 8800,有一系列 8 个 LED 灯,分别代表计数器(程序的 “行号”)、指令、累积器(用于临时数据的内部存储器)和状态。
|
||||
|
||||
当你启动 Toy CPU 时,它通过清除内存来模拟 “启动”。当它启动时,它也会在屏幕右下方的状态灯中显示 “INI”(初始化)。“PWR”(电源)灯亮表示 Toy CPU 已被打开。
|
||||
|
||||
![Toy CPU 的启动屏幕][5]
|
||||
|
||||
当 Toy CPU 准备好让你进入一个程序时,它通过状态灯指示 “INP”(“输入”模式),并让你从程序的计数器 0 开始。Toy CPU 的程序总是从计数器 0 开始。
|
||||
|
||||
在 “输入” 模式下,用上下方向键显示不同的程序计数器,按回车键编辑当前计数器上的指令。当你进入 “编辑” 模式时,Toy CPU 的状态灯上会显示 “EDT”(“编辑” 模式)。
|
||||
|
||||
![Toy CPU 编辑屏幕][6]
|
||||
|
||||
Toy CPU 有一张速查表,被 “贴” 在显示屏的前面。它列出了 Toy CPU 可以处理的不同操作码。
|
||||
|
||||
- `00000000`(`STOP`):停止程序执行。
|
||||
- `00000001`(`RIGHT`):将累加器中的位向右移动一个位置。值 `00000010` 变成 `00000001`,`00000001` 变成 `00000000`。
|
||||
- `00000010`(`LEFT`):将累加器中的位向左移动一个位置。值 `01000000` 变成 `10000000`,`10000000` 变成 `00000000`。
|
||||
- `00001111`(`NOT`):对累加器进行二进制非操作。例如,值 `10001000` 变成 `01110111`。
|
||||
- `00010001`(`AND`):对累加器用存储在某一地址的值进行二进制与操作。该地址被存储在下一个计数器中。
|
||||
- `00010010`(`OR`):对累积器用存储在某一地址的值进行二进制或运算。
|
||||
- `00010011`(`XOR`):对累加器用存储在某一地址的值进行二进制异或运算。
|
||||
- `00010100`(`LOAD`):将一个地址的值加载(复制)到累加器中。
|
||||
- `00010101`(`STORE`): 存储(复制)累加器中的值到一个地址。
|
||||
- `00010110`(`ADD`):将存储在某一地址的数值加入到累加器中。
|
||||
- `00010111`(`SUB`):从累积器中减去储存在某一地址的数值。
|
||||
- `00011000`(`GOTO`):转到(跳到)一个计数器地址。
|
||||
- `00011001`(`IFZERO`):如果累加器为零,转到(跳到)一个计数器地址。
|
||||
- `10000000`(`NOP`):空操作,可以安全地忽略。
|
||||
|
||||
当处于 “编辑” 模式时,使用左右方向键选择操作码中的一个位,然后按空格键在关闭(0)和开启(1)之间翻转数值。当你完成编辑后,按回车键回到 “输入” 模式。
|
||||
|
||||
![Toy CPU 输入模式屏幕][7]
|
||||
|
||||
### 一个示例程序
|
||||
|
||||
我想通过输入一个简短的程序来探索 Toy CPU,将两个数值相加,并将结果存储在 Toy CPU 的内存中。实际上,这执行的是算术运算 `A+B=C`。要创建这个程序,你只需要几个操作码:
|
||||
|
||||
- `00010100`(`LOAD`)
|
||||
- `00010110`(`ADD`)
|
||||
- `00010101`(`STORE`)
|
||||
- `00000000`(`STOP`)
|
||||
|
||||
`LOAD`、`ADD` 和 `STORE` 指令需要一个内存地址,这个地址总是在下一个计数器的位置。例如,程序的前两条指令是:
|
||||
|
||||
```
|
||||
计数器 0:00010100
|
||||
计数器 1:某个内存地址,第一个值 A 存放在那里
|
||||
```
|
||||
|
||||
计数器 0 中的指令是 `LOAD` 操作,计数器 1 中的值是你存储某个值的内存地址。这两条指令一起将内存中的数值复制到 Toy CPU 的累加器中,在那里你可以对该数值进行操作。
|
||||
|
||||
将一个数字 `A` 装入累加器后,你需要将数值 `B` 加到它上面。你可以用这两条指令来做:
|
||||
|
||||
```
|
||||
计数器 2:00010110
|
||||
计数器 3:存储第二个值 B 的内存地址
|
||||
```
|
||||
|
||||
假设你把值 `1`(`A`)装入累加器,然后把值 `3`(`B`)加到它上面。现在累加器的值是 `4`。现在你需要用这两条指令把数值 `4` 复制到另一个内存地址(`C`):
|
||||
|
||||
```
|
||||
计数器 4:00010101
|
||||
计数器 5:一个内存地址(C),我们可以在那里保存新的值
|
||||
```
|
||||
|
||||
把这两个值加在一起后,现在可以用这条指令结束程序:
|
||||
|
||||
```
|
||||
计数器 6: 00000000
|
||||
```
|
||||
|
||||
计数器 6 之后的任何指令都可以供程序作为存储内存使用。这意味着你可以用计数器 7 的内存来储存值 `A`,计数器 8 的内存来储存值 `B` ,计数器 9 的内存来储存值 `C`。你需要将这些分别输入到 Toy CPU 中:
|
||||
|
||||
```
|
||||
计数器 7:00000001(1)
|
||||
计数器 8:00000011(3)
|
||||
计数器 9:00000000(0,以后会被覆盖)
|
||||
```
|
||||
|
||||
在弄清了所有指令和 `A`、`B` 和 `C` 的内存位置后,现在可以将完整的程序输入到 Toy CPU 中。这个程序将数值 1 和 3 相加,得到 4:
|
||||
|
||||
```
|
||||
计数器 0:00010100
|
||||
计数器 1:00000111(7)
|
||||
计数器 2:00010110
|
||||
计数器 3:00001000(8)
|
||||
计数器 4:00010101
|
||||
计数器 5:00001001(9)
|
||||
计数器 6:00000000
|
||||
计数器 7:00000001(1)
|
||||
计数器 8:00000011(3)
|
||||
计数器 9:00000000(0,以后会被覆盖)
|
||||
```
|
||||
|
||||
要运行程序,在 “输入” 模式下按下 `R` 键。Toy CPU 将在状态灯中显示 “RUN”(“运行” 模式),并从计数器 0 开始执行你的程序。
|
||||
|
||||
Toy CPU 有一个明显的延迟,所以你可以看到它执行程序中的每一步。随着程序的进行,你应该看到计数器从 `00000000`(0)移动到 `00000110`(6)。在计数器 1 之后,程序从内存位置 7 加载数值 `1`,累积器更新为 `00000001`(1)。在计数器 3 之后,程序将加数值 `3`,并更新累加器显示 `00000100`(4)。累加器将保持这种状态,直到程序在计数器 5 之后将数值存入内存位置 9,然后在计数器 6 结束。
|
||||
|
||||
![在运行模式下的 Toy CPU][8]
|
||||
|
||||
### 探索机器语言编程
|
||||
|
||||
你可以使用 Toy CPU 来创建其他程序,并进一步探索机器语言编程。通过用机器语言编写这些程序来测试你的创造力。
|
||||
|
||||
### 一个在累积器上闪灯的程序
|
||||
|
||||
你能点亮累加器上的右四位,然后是左四位,然后是所有的位吗?你可以用两种方法之一来写这个程序。
|
||||
|
||||
一种直接的方法是,从不同的内存地址加载三个数值,像这样:
|
||||
|
||||
```
|
||||
计数器 0:LOAD
|
||||
计数器 1:“右边”
|
||||
计数器 2:LOAD
|
||||
计数器 3:“左边”
|
||||
计数器 4:LOAD
|
||||
计数器 5:“所有”
|
||||
计数器 6:STOP
|
||||
计数器 7:00001111(“右边”)
|
||||
计数器 8:11110000(“左边”)
|
||||
计数器 9:11111111(“全部”)
|
||||
```
|
||||
|
||||
写这个程序的另一种方法是尝试使用 `NOT` 和 `OR` 二进制操作。这样可以得到一个更小的程序:
|
||||
|
||||
```
|
||||
计数器 0:LOAD
|
||||
计数器 1:“右边”
|
||||
计数器 2:NOT
|
||||
计数器 3:OR
|
||||
计数器 4:“右边”
|
||||
计数器 5:STOP
|
||||
计数器 6:00001111(“右边”)
|
||||
```
|
||||
|
||||
### 从一个数字开始倒数
|
||||
|
||||
你可以把 Toy CPU 作为一个倒数计时器。这个程序行使 `IFZERO` 测试,只有当累加器为零时,程序才会跳转到一个新的计数器:
|
||||
|
||||
```
|
||||
计数器 0:LOAD
|
||||
计数器 1:“初始值”
|
||||
计数器 2:IFZERO(这也是倒计时的“开始”)
|
||||
计数器 3:“结束”
|
||||
计数器 4:SUB
|
||||
计数器 5:“1”
|
||||
计数器 6:GOTO
|
||||
计数器 7:“开始”
|
||||
计数器 8:STOP
|
||||
计数器 9:00000111(“初始值”)
|
||||
计数器 10:00000001(“1”)
|
||||
```
|
||||
|
||||
Toy CPU 是学习机器语言的一个好方法。我在入门课程中使用了 Toy CPU,学生们说他们发现写第一个程序很困难,但写下一个程序就容易多了。学生们还表示,用这种方式编写程序其实很有趣,他们学到了很多关于计算机实际工作的知识。Toy CPU 既具有教育性,也很有趣味性!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/23/1/learn-machine-language-retro-computer
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/2022-12/MITS_Altair_8800_Computer_%281975%29.png
|
||||
[2]: https://github.com/freedosproject/toycpu
|
||||
[3]: https://opensource.com/downloads/guide-using-freedos
|
||||
[4]: https://opensource.com/article/21/8/ncurses-linux
|
||||
[5]: https://opensource.com/sites/default/files/2022-12/toycpu.png
|
||||
[6]: https://opensource.com/sites/default/files/2022-12/edit0-load.png
|
||||
[7]: https://opensource.com/sites/default/files/2022-12/input0-load.png
|
||||
[8]: https://opensource.com/sites/default/files/2022-12/run-3.png
|
||||
[0]: https://opensource.com/sites/default/files/lead-images/retro_old_unix_computer.png
|
@ -0,0 +1,68 @@
|
||||
[#]: subject: "Official Fedora Budgie & Sway Spins to Arrive With Fedora 38 Release"
|
||||
[#]: via: "https://news.itsfoss.com/fedora-budgie-sway-official/"
|
||||
[#]: author: "Sourav Rudra https://news.itsfoss.com/author/sourav/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "wxy"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15418-1.html"
|
||||
|
||||
Fedora 38 将发布 Budgie 和 Sway 官方定制版
|
||||
======
|
||||
|
||||
> 两款新的 Fedora 定制版将在 Fedora 38 发布时首次亮相。
|
||||
|
||||
![][1]
|
||||
|
||||
我们期待着它们在 Fedora 37 时出现,但在 Fedora 38 中终于来了!
|
||||
|
||||
早在 2022 年 5 月,Budgie 项目的主要开发者 Joshua Strobl [宣布][2],Budgie 已被提交到 Fedora 中。
|
||||
|
||||
遗憾的是,在那之后不久,我们并没有看到任何官方 [Fedora 定制版][3] 发布的迹象,尽管它在 [Fedora 37 发布][4] 期间进入了 Fedora 软件库。
|
||||
|
||||
**但现在有了。**
|
||||
|
||||
随着 Fedora 38 的发布,看起来我们会得到一个 [Budgie][5] 的官方定制版,同时还有一个 [Sway][6] 窗口管理器的定制版。
|
||||
|
||||
### Fedora Budgie 和 Sway
|
||||
|
||||
在 [最近的一次会议][9] 上,Fedora 工程和指导委员会(FESCo)投票决定将 Budgie 和 Sway 窗口管理器的 Fedora 官方定制版纳入 Fedora 38 的发布中。
|
||||
|
||||
根据 Budgie 和 Sway 的初步修改建议,我们可以期待很多变化。
|
||||
|
||||
对于 Budgie:
|
||||
|
||||
- Fedora 38 将提供 Budgie 桌面环境,包含一套核心应用程序,如用于更新/软件包管理的 GNOME “软件”应用、一个文本编辑器、一个网页浏览器和一个终端。
|
||||
- 它还将使用 [Materia GTK][10] 和 [Papirus][11] 图标主题,整个系统采用 GTK 主题设计。
|
||||
- Budgie 定制版还将采用 lightdm + slick-gtk-greeter,以获得更直观的用户问候体验。
|
||||
|
||||
对于 Sway 定制版:它旨在提供一个极简体验,只包括默认配置之上的一些元素。
|
||||
|
||||
预期时间:随着 Fedora 38 的开发在未来几个月内的加快,你可以期待这些定制版在 2023 年 4 月期间出现。当然,会有预装了 Budgie 和 Sway 的单独 ISO 文件。
|
||||
|
||||
因此,我认为看到 Budgie 与 Fedora 的体验会非常吸引人,特别是当 Budgie 的开发似乎正在发生一些有趣的变化。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/fedora-budgie-sway-official/
|
||||
|
||||
作者:[Sourav Rudra][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://news.itsfoss.com/author/sourav/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://news.itsfoss.com/content/images/size/w2000/2023/01/fedora-budgie-sway-spins-arrive.png
|
||||
[2]: https://www.reddit.com/r/Fedora/comments/uq3gah/budgie_desktop_has_now_been_submitted_for/
|
||||
[3]: https://spins.fedoraproject.org
|
||||
[4]: https://news.itsfoss.com/fedora-37-release/
|
||||
[5]: https://blog.buddiesofbudgie.org
|
||||
[6]: https://swaywm.org
|
||||
[7]: https://unlocator.com/favicon.ico
|
||||
[8]: https://unlocator.com/wp-content/uploads/2019/05/unlocatoricon.jpg
|
||||
[9]: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/RNJZUX3ZI34DIX6E4PVDKYQWCOFDQ4UY/
|
||||
[10]: https://github.com/nana-4/materia-theme
|
||||
[11]: https://github.com/PapirusDevelopmentTeam/papirus-icon-theme
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user