mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
Merge branch 'LCTT:master' into master
This commit is contained in:
commit
9d4ab8b2df
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1 @@
|
||||
blank_issues_enabled: true
|
18
.github/ISSUE_TEMPLATE/questions.yml
vendored
Normal file
18
.github/ISSUE_TEMPLATE/questions.yml
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
name: Ask Questions | 提问
|
||||
description: Please describe your problem. | 请描述您的问题。
|
||||
labels: ["question"]
|
||||
assignees: []
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please answer these questions before you submit the desired feature. | 请在您提交期望的功能之前,回答以下这些问题
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Your Questions
|
||||
description: Please describe your problem. | 请描述您的问题。
|
||||
placeholder: I have a question...
|
||||
validations:
|
||||
required: true
|
67
.github/ISSUE_TEMPLATE/topics.yml
vendored
Normal file
67
.github/ISSUE_TEMPLATE/topics.yml
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
name: 推荐选题
|
||||
description: 推荐一个选题
|
||||
title: "[推荐类型] 文章日期 文章标题"
|
||||
labels: []
|
||||
assignees:
|
||||
- lkxed
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
标题请使用 **`[推荐类型] 文章日期 文章标题`** 格式,选题类型、文章日期和文章标题中间有一个 **空格**。
|
||||
|
||||
完整示例:
|
||||
- [推荐选题] 20220823 The Lost Art of the Makefile
|
||||
- [推荐选题] 20220905 Linus Torvalds Uses Apple MacBook Hardware to Release Linux Kernel 5.19
|
||||
- type: input
|
||||
id: url
|
||||
attributes:
|
||||
label: 原文链接地址
|
||||
description: 填写原文章的链接地址
|
||||
placeholder: https://......
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: terms
|
||||
attributes:
|
||||
label: 版权协议
|
||||
description: 填写原文章的版权协议
|
||||
multiple: false
|
||||
options:
|
||||
- CC-SA-BY
|
||||
- 其它公域许可证
|
||||
- 已获取作者授权
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: difficulty
|
||||
attributes:
|
||||
label: 文章难度
|
||||
description: 选择文章的难度
|
||||
multiple: false
|
||||
options:
|
||||
- 困难
|
||||
- 一般
|
||||
- 容易
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: category
|
||||
attributes:
|
||||
label: 文章分类
|
||||
description: 选择文章的分类
|
||||
multiple: false
|
||||
options:
|
||||
- 新闻(news)
|
||||
- 观点(talk)
|
||||
- 技术(tech)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reason
|
||||
attributes:
|
||||
label: 推荐理由
|
||||
description: 填写你的推荐理由
|
||||
placeholder:
|
||||
validations:
|
||||
required: false
|
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
|
||||
|
173
Dict.md
173
Dict.md
@ -1,163 +1,90 @@
|
||||
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 中。
|
||||
### P
|
||||
|
||||
#### J ####
|
||||
#### Pod:容器荚
|
||||
|
||||
#### K ####
|
||||
在容器环境中使用 Pod 来代表一组容器。最初,我根据 Kubernetes 中大量采用了航海相关的比喻,而将其译为“吊舱”。但根据 Kubernetes [文档](https://kubernetes.io/docs/concepts/workloads/pods/#:~:text=A%20Pod%20(as%20in%20a,run%20in%20a%20shared%20context.),其来自对 “<ruby>鲸鱼荚<rt>Pod of Whales</rt></ruby>”、“<ruby>豌豆荚<rt>pea pod</rt></ruby>” 的比喻。因此这个词翻译为“容器荚”。也有有将其翻译为“容器组”。
|
||||
|
||||
#### L ####
|
||||
### 1. live CD:现场版 CD
|
||||
> 通常不翻译,但是如果翻译,可以译作“现场版”。
|
||||
### 2. live patch: 实时补丁/热补丁
|
||||
> 指 Linux 内核的 live patch 支持。
|
||||
- 提议者:wxy
|
||||
- 首次链接:https://linux.cn/article-14591-1.html
|
||||
|
||||
### 2. LTS(Long Term Support):长期支持
|
||||
> 该缩写词多见于操作系统发行版或者软件发行版名称中,表明该版本属于长期支持版。
|
||||
### R
|
||||
|
||||
#### M ####
|
||||
#### Repo/Repository:代码仓库、软件仓库
|
||||
|
||||
#### N ####
|
||||
Repository 主要用于两个场景,一个是用于版本管理的代码仓库,一个是用于分发软件/组件/制品的软件仓库。
|
||||
|
||||
#### O ####
|
||||
### 1. Orchestration:编排
|
||||
> 描述复杂计算机系统、中间件(middleware)和业务的自动化的安排、协调和管理(来自维基百科)。
|
||||
鉴于两种场景的差异,建议在使用时,分别注明“代码仓库”或“软件仓库”,也可简称为 “代码仓”或“软件仓”。
|
||||
|
||||
#### P ####
|
||||
### 1. P-code(Pseudo-code):伪代码语言
|
||||
> 一种解释型语言,执行方式介于编译型语言和解释型语言之间。和解释型语言一样,伪代码编程语言无需编译,在执行时自动转换成二进制形式。然而,和编译型语言不同的是,这种可执行的二进制文件是以伪代码的形式而不是机器语言的形式存储的。伪代码语言的例子有 Java、Python 和 REXX/Object REXX。
|
||||
### S
|
||||
|
||||
### 2. PAM(Pluggable Authentication Modules):可插拔认证模块
|
||||
> 用于系统安全性的可替换的用户认证模块,它允许在不知道将使用何种认证方案的情况下进行编程。这允许将来用其它模块来替换某个模块,却无需重写软件。
|
||||
#### Shebang [ʃɪ'bæŋ]:释伴
|
||||
|
||||
### 3. Port/Ported/Porting:移植
|
||||
> 一个过程,即获取为某个操作系统平台编写的程序,并对其进行修改使之能在另一 OS 上运行,并且具有类似的功能。
|
||||
Shebang(也称为 Hashbang)是一个由井号和叹号构成的字符序列(`#!`),出现在脚本文件的第一行的前两个字符,后跟解释器路径,如:`#!/bin/sh`,这通常是 Linux 中 shell 脚本的标准起始行。
|
||||
|
||||
### 4. POSIX(Portable Operating System Interface for uniX):UNIX 可移植操作系统接口
|
||||
> 一组编程接口标准,它们规定如何编写应用程序源代码以便应用程序可在操作系统之间移植。POSIX 基于 UNIX,它是 The Open Group 的 X/Open 规范的基础。
|
||||
长期以来,Shebang 都没有正式的中文名称。提议者将其翻译为:“释伴”,即解释伴随行的简称,同时又是 Shebang 的音译。(关于这个词汇的翻译,在下面的首次链接中有其它的建议和讨论。)
|
||||
|
||||
#### Q ####
|
||||
- 提议者:GoLinux
|
||||
- 首次链接:https://linux.cn/article-3664-1.html
|
||||
|
||||
#### R ####
|
||||
### 1. RCS(Revision Control System):修订控制系统
|
||||
> 一组程序,它们控制组环境下文件的共享访问并跟踪文本文件的变化。常用于维护源代码模块的编码工作。
|
||||
#### Shell :交互界面
|
||||
|
||||
### 2. RFS(Remote File Sharing):远程文件共享
|
||||
> 一个程序,它让用户访问其它计算机上的文件,就好象文件在用户的系统上一样。
|
||||
Shell 是 Unix/Linux 等系统的 `sh`、`bash` 等命令行的接口程序,包括 DOS/Windows 的 `command.com`/`cmd.exe` 等其实也属于此类,只是通常不这样称呼。
|
||||
|
||||
#### S ####
|
||||
### 1. shebang [ʃɪ'bæŋ]:释伴
|
||||
> Shebang(也称为Hashbang)是一个由井号和叹号构成的字符序列(#!),出现在文本文件的第一行的前两个字符,后跟解释器路径,如:#!/bin/sh,这通常是Linux中shell脚本的标准起始行。
|
||||
> 长期以来,shebang都没有正式的中文名称。Linux中国翻译组将其翻译为:释伴,即解释伴随行的简称,同时又是shebang的音译。
|
||||
这个词汇也是一个一直没有翻译而径直使用的计算机词汇。我们也没有见到(找到)合适的翻译。但是我们在 LCTT 译者 CanYellow 翻译的一篇文章中见到他将其翻译为 “交互界面”,我们认为这是一种好的翻译。
|
||||
|
||||
### 2. Spool(Simultaneous Peripheral Operation On-Line):假脱机
|
||||
> 将数据发送给一个程序,该程序将该数据信息放入队列以备将来使用(例如,打印假脱机程序)
|
||||
注:有些人对此次条的翻译持反对意见,此词条建议尝试性在部分语境中使用。
|
||||
|
||||
### 2. Steganography:隐写术
|
||||
> 将一段信息隐藏在另一段信息中的做法。一个示例是在数字化照片中放置不可见的数字水印。
|
||||
- 提议者:CanYellow
|
||||
- 首次链接:https://linux.cn/article-15469-1.html
|
||||
|
||||
### 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 ,欢迎大家提交议题或拉取请求来完善它。
|
||||
|
42
lctt2022.md
Normal file
42
lctt2022.md
Normal file
@ -0,0 +1,42 @@
|
||||
开源贡献者翻译组 LCTT 九岁啦
|
||||
======
|
||||
|
||||
九年前,也是这个上午,我创建了 LCTT 及其第一个项目 [TranslateProject](https://github.com/LCTT/TranslateProject/)。从最初只是有感于 Unix/Linux 上的中文手册页实在太糟糕,希望做一些事情;到最后变成了一个以翻译国外各个开源社区的技术文章和开源资讯/讨论的“流水”式项目,LCTT 已经走过了令我自己都非常吃惊的九年。
|
||||
|
||||
人的一生,几十年而已,能在一件事上持续投入九年时光,这是我从未想过的事情。驻足回望,LCTT 其实并没有完成我最初的想法,这是缺憾;但是 LCTT 就这样变成了另外一种并非在我计划中的样子,或许也有其必然性。现在看来,LCTT 做了一些事情,也有一些存在的意义。我试着总结一下:
|
||||
|
||||
LCTT 的主项目 TranslateProject,选题广泛,参与门槛低,从某种意义上,为初识开源的小伙伴提供一种成为开源贡献者的方式。一些人就是通过这个项目,迈出了成为开源贡献者的第一步,并在日后的学习和工作中,成为了开源爱好者、专业技术人员。
|
||||
|
||||
LCTT 持续翻译了数千篇(截至今日,已经翻译发布了 6395 篇文章),这些文章的专业程度横跨了入门到精通等不同难度,内容方向涉猎了开发、运维、使用和文化等各个方面。虽然,有些文章仅堪一读,但也有不少文章值得收藏、一再细读。我屡屡能从读者那里得到反馈,这些文章对他们提供了很大的帮助,我想这就是 LCTT 的存世价值之一吧。唯独可惜的是,这些文章,没有以很好的方式组织起来,甚憾。
|
||||
|
||||
LCTT 有数百成员(截至今日,成功地在仓库中进行了贡献的贡献者有 311 位),他们的年龄不等,最年轻的有初中的学生、最老的,嗯这个不需要说了;他们的职业各异,比较多的是大学生,也有很多从事技术工作的专业人员,甚至还有完全不从事技术工作的贡献者。但是,他们都有一个共同的身份就是 LCTT 贡献者,因此,他们都有很多开源兄弟姐妹。
|
||||
|
||||
按照惯例,每两年,我会写一篇 LCTT 总结。今年又快到这个时间了,我却有些不知道该如何下笔。恍惚间,我突然想到,LCTT 是一个贡献者组织,是大家的 LCTT,那么,为什么不让大家来为 LCTT 写两句话呢?于是,我在 LCTT 群内发起了号召,请诸位成员写写自己参与 LCTT 的经历、感受或收获,也可以是祝愿、建议。下面,是我收集到的其中一些成员的留言(以留言时的顺序列出):
|
||||
|
||||
- **译者-acyanbird**:Linux 中国是我的开源引路人,让我有机会从零开始参与开源社区,认识到了开源精神,见到了世界的另一个可能性。也借此机会参与不少活动,认识了很多开源人士。目前在组长的帮助下,我也开始自己建立社区,十分感谢您给我这个机会~希望我们都越来越好,有更多的人也来一起参与开源
|
||||
- **译者-mandeler**:LCTT community forever!
|
||||
- **译者-Kira-Pgr**:For a better open source world!
|
||||
- **译者-mengxinayan**:LCTT 不仅可以用来锻炼翻译能力,同时有专人进行校对,能有效找到自身不足。此外还可以用来接触新知新方向,最重要的是可以培养自身英文阅读的习惯。Thanks LCTT!
|
||||
- **译者-aftermath0703**:从 LCTT 我收获到了许多知识,有时间我就会去 GitHub 上读读新的文章,有更多时间我就会去翻译一篇。翻译过程中先自己翻译一遍,再用翻译网站翻译一遍,有偏差的地方相互比对,我觉得这对我的各项英语能力都有很大的帮助。希望 LCTT 蓬勃发展,越办越好!
|
||||
- **译者-MFGJT**:虽然因为工作原因很久没有翻译了,但是还是每天在看微信公众号。感觉到大家都很努力,希望今年有机会继续参加翻译 🌹
|
||||
- **译者-stevending1st**:加入 LCTT 最大的惊叹是核心贡献者能够做到维护一个几百人的贡献者群体,背后是他们巨大的努力。希望能在 LCTT 不断学习,努力提升自己的能力。也祝愿 LCTT 越来越好。
|
||||
- **译者-aREversez**:作为一个学翻译的学生,能参与到 LCTT 这样一个项目,了解更多关于开源与技术的知识,见识更宽阔的世界和更深远的历史,让自己能尽己所能为开源贡献一份力量,实属荣幸之至。希望咱们社区能够一直繁荣下去,传播更加丰富多彩的开源技术与思想!
|
||||
- **译者-mcfd**:LCTT 翻译的许多实用的技术文章,能够简明、易懂地为广大小白答疑解惑,扫除学习、日常中遇到的坑,间接且不断地为开源社区注入生机。清风不解凌云志,明月无声照九州。
|
||||
- **核心-lkxed**:在裸辞考研失败之后,我曾一度陷入迷茫。偶然间读到老王写的《如何以翻译贡献参与开源社区》,决心加入进来。自此,我从一个连 Git 和 GitHub 都搞不大懂的小白,成长为一名熟练的译者,又成长为一名熟练的选题。踏踏实实地做好一件小事,每天如此,不正是对抗焦虑和迷茫的好办法吗?感谢开源,给了我这个成长的机会;感谢 LCTT,领着我敲开了开源的大门;感谢老王,在我困惑时指点迷津。祝愿 LCTT 越办越好,我们一路与你同行!
|
||||
- **核心-bestony**:刚刚专门回到网站上看了一下,我参与 LCTT 已经 8 年了,8 年来,LCTT 见证了我从小透明到半透明,也经历了我人生的三分之一。希望在未来的时间里,我可以和 LCTT 共成长,也可以与 LCTT 共人生。
|
||||
- **核心-Locez**:今天是 LCTT 的生日,也是我的生日,一种奇妙的缘分。LCTT 是我接触 LC,接触开源以后第一个比较正式贡献的项目,对我来说意义比较非凡,重要的是通过这个项目在 LC 以及 LCTT 结识到了热爱分享的大家,特别是老王,viz,bestony 等人,很感谢大家在我学生时代起,就对我的一些耐心引导与帮助。
|
||||
- **译者-robsean**:科教兴国,实干兴邦
|
||||
- **译者-TravinDreek**:作为一位自由软件活动者,我主要从事技术伦理相关文章的翻译。我在 LCTT 的翻译动机,不止在于增进自己对当今技术伦理问题的认识,更在于让人们有机会了解到并利用自由(和开源)软件来应对这些问题。希望 LCTT 今后能在传播 FLOSS 方面起到更大的作用。Happy hacking.
|
||||
- **译者-Wlzzzz-del**:之前备考考研时,偶然接触到 LCTT。为了多了解一些 Linux 知识,同时提高自己的英语水平,因此选择加入了 LCTT,这也是我第一次参与开源项目。虽然因为很多原因,翻译的文章不多,但是 LCTT 发布的文章我都会认真阅读。在未来我希望能多抽出时间来,参与到翻译活动中来。
|
||||
- **译者-Veryzzj**:今年年初在朋友的介绍下认识了 LCTT 并参与到了其中,仔细回想 LCTT 的意义于我是什么?是打破开源项目于我的神秘面纱,是从申领到翻译每一篇收获的成就感,是发布了文章感受到的正反馈,是在翻译群中和大家交流时的友好气氛。正是这些点滴,是我对抗生命无意义感的武器。我们用语言打破边界,也用语言拓宽世界。预祝 LCTT 越来越好!
|
||||
- **译者-Chao-zhi**:加入 LCTT 已经六年了,我已经不记得自己是怎么加入 LCTT 了。但我一直记得我是通过 LCTT 的 wiki 学会使用 GitHub 的。也是通过 LCTT 慢慢了解开源世界的。希望能继续和 LCTT 一起成长。
|
||||
- **核心-MjSeven**:但愿 LCTT 长久,千里共婵娟
|
||||
- **译者-mudongliang**:LCTT 是早期我参与的开源项目,通过这个项目我学会了很多开源知识,熟练使用 Git 使用,为后期在内核项目贡献,奠定了坚实基础 😁
|
||||
- **译者-Northurland**:感谢 LC 治好了我的网友见面恐惧症(笑)。这是我在校园外参与的第一个项目,很感谢组长和 LC 的大家给予我这个机会。希望我们珍视的这个社区在未来能让更多人了解开源、参与开源。
|
||||
|
||||
说实话,LCTT 和 Linux 中国能走到今天,全赖这些贡献者的支持,这让我每每感觉吃力时,都有了不能放弃的理由。
|
||||
|
||||
那么,你是不是也想加入 LCTT 呢?很简单,访问 LCTT 官网:https://linux.cn/lctt/ 即可了解如何成为一名 LCTT 贡献者了。
|
||||
|
||||
最后,感谢大家九年来的支持和信任!顺祝大家中秋节、教师节快乐!
|
||||
|
@ -0,0 +1,94 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (CanYellow)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-15642-1.html)
|
||||
[#]: subject: (Roy Fielding's Misappropriated REST Dissertation)
|
||||
[#]: via: (https://twobithistory.org/2020/06/28/rest.html)
|
||||
[#]: author: (Two-Bit History https://twobithistory.org)
|
||||
|
||||
被误用的罗伊·菲尔丁的有关描述性状态迁移(REST)的博士论文
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
符合 <ruby>描述性状态迁移<rt>REpresentational State Transfer</rt></ruby>(LCTT 译注:REST,译自审定公布名词数据库)的应用程序接口(API)无处不在。有趣的是又有多少人真正了解“符合描述性状态迁移”的应有之义呢?
|
||||
|
||||
大概我们中的大多数人都会跟 [黑客新闻网站上的这篇公开问答][1] 产生共鸣:
|
||||
|
||||
> 我阅读了几篇介绍描述性状态迁移(REST)的文章,甚至包括原始论文的部分章节。然而我仍然对REST 到底是什么只有一个相当模糊的想法。我开始认为没有人真的了解它,它仅仅是一个定义相当不充分的概念。
|
||||
|
||||
我曾经计划写一篇有关 REST 的博客,在里面探讨 REST 是如何成为这样一个在网络通信领域占主导地位的范式的。我通过阅读 [2000 年发表的 <ruby>罗伊·菲尔丁<rt>Roy Fielding</rt></ruby> 的博士论文][2] 开始我的研究,这篇博士论文向世人介绍了 REST 的概念。在读过菲尔丁的博士论文以后,我意识到,相比之下,更引人注意的是菲尔丁的理论缘何受到如此普遍的误解。
|
||||
|
||||
(相对公平地说,)很多人知道 REST 源自菲尔丁的博士论文,但并没有读过该论文。因此对于这篇博士论文的原始内容的误解才得以流行。
|
||||
|
||||
最大的误解是:这篇博士论文直接解决了构建 API(API)的问题,我此前一直认为 REST 从一开始就打算成为构建在超文本传输协议(HTTP)之上的 <ruby>网络 API<rt>Web API</rt></ruby>的架构模型,我相信很多人也这样认为。我猜测此前可能存在一个混乱的试验时期,开发人员采用完全错误的方式在 HTTP 基础上开发 API,然后菲尔丁出现了,并提出了将 REST 做为网络应用程序开发的正确方式。但是这种想法的时间线对不上:我们今天所熟知的网络服务的 API 并非是在菲尔丁出版他的博士论文之后才出现的新生事物。
|
||||
|
||||
菲尔丁的博士论文《架构风格与基于网络的软件架构设计》不是讨论如何在 HTTP 的基础上构建 API,而恰恰是讨论 HTTP 本身。菲尔丁是 HTTP/1.0 版规范的贡献者,同时也是 HTTP/1.1 版的共同作者。有感于从 HTTP 的设计中获得的架构经验,他的博士论文将 REST 视为指导 HTTP/1.1 的标准化过程的架构原则的精华。举例而言,他拒绝了使用新的 `MGET` 和 `MHEAD` 方法进行批量请求的提议,因为他认为这违反了 REST 所定义的约束条件,尤其是在一个符合 REST 的系统中传递的消息应该是易于代理和缓存的约束条件。[^1] 因此,HTTP/1.1 转而围绕持久性连接设计,在此基础上可以发送多个 HTTP 请求。(菲尔丁同时认为网页保存在本地的浏览数据,即 cookie 是不符合 REST 的,因为它们在一个状态无关的系统中增加了状态描述,然而它们的应用已经根深蒂固了。[^2])菲尔丁认为,REST 并非构建基于 HTTP 的系统的操作指南,而是扩展 HTTP 的操作指南。
|
||||
|
||||
这并不意味着菲尔丁认为 REST 不能用于构建其他系统。只是他假定其他系统也是 “<ruby>分布式超媒体系统<rt>distributed hypermedia systems</rt></ruby>”。人们对 REST 还有另一个误解:认为它是一个可以用在任何网络应用中的通用架构。但是从这篇博士论文中菲尔丁介绍 REST 的部分你基本上能够得出如下的结论,“请注意,我们只设计了 HTTP,但是如果你发现你自己也在设计一个_分布式超媒体系统_,你也应该采用我们提出的称为 REST 的优秀架构,以让开发变得更容易”。有鉴于互联网已经存在了,我们尚不清楚为什么菲尔丁认为有人可能试图重新创建这样一个(和 HTTP 一样的)系统。或许在 2000 年的时候世界上仍然存在不只一个分布式超文本系统的空间吧。无论如何,菲尔丁已经说得很清楚了,REST 意在提供一套解决方案,来解决在试图经由网络连接超文本内容时出现的可扩展性与一致性问题,_而不是_ 作为分布式应用的通用架构模型。
|
||||
|
||||
我们现在只记得菲尔丁的博士论文提出了 REST 的概念,但事实上,他的博士论文是在讨论一刀切的软件架构有多么糟糕,以及如何更好地选择符合你需求的软件架构。这篇博士论文中仅用了一个章节来讨论 REST 本身,大量的文本内容都都花在了对你能够在网络应用中运用的不同的架构风格 [^3] 的分类上。这些架构风格包括:受 Unix 的管道设计启发的 <ruby>管道-过滤器<rt>Pipe-and-Filter</rt></ruby> (PF)风格,<ruby>客户-服务器<rt>Client-Server</rt></ruby> (CS)风格的多种改进,如 <ruby>分层-客户-服务器<rt>Layered-Client-Server</rt></ruby>(LCS)风格、<ruby>客户-缓存-无状态-服务器<rt>Client-Cache-Stateless-Server</rt></ruby>(C\$SS)风格和<ruby>分层-客户-缓存-无状态-服务器<rt>Layered-Client-Cache-Stateless-Server</rt></ruby>(LC\$SS)。这些缩略词未必实用,但是菲尔丁认为我们可以通过混合匹配现有风格提供的约束条件来派生出新的风格。REST 就是通过这种方式产生的,它本可以称之为 <ruby>一致性-分层-按需代码-客户-缓存-无状态-服务器<rt>Uniform-Layered-Code-on-Demand-Client-Cache-Stateless-Server</rt></ruby>(ULCODC\$SS)风格,显然我们并没有这样做。菲尔丁建立上述分类是为了强调(每一种风格对应的)约束适用于不同的应用,而上述最后一种风格对应的约束是他所认为的最适用于 HTTP 的。
|
||||
|
||||
今天,REST 的无处不在是极具讽刺意味的。REST 在各种各样的网络应用中被盲目使用,但是菲尔丁最初只是将 REST 视作一种指引,通过它指导人们裁剪一种软件架构来适应独立应用的特殊需求。
|
||||
|
||||
我很难弄清楚这是如何发生的,毕竟菲尔丁已经明确地指出了不能让形式服从功能的陷阱。他在论文的一开始就作出了警告:由于没有正确地理解软件架构而“使用流行的架构设计是经常发生的”[^4]。他在几页之后又重新强调了这一点:
|
||||
|
||||
> 一些架构风格经常被描述为适用于一切软件形式的“银弹”解决方案。然而,一名好的设计者应该选择能够满足解决特定问题的需要的架构风格[^5]。
|
||||
|
||||
REST 本身就是一个特别糟糕的 “银弹” 解决方案。正如菲尔丁所指出的,它包含了可能不合适的利弊权衡,除非你试图构建一个分布式超媒体应用:
|
||||
|
||||
> REST 设计用来高效地进行大粒度的超媒体数据传输,并对网络应用场景中的常用见情形做了优化,但是可能会导致其在与其他形式的软件架构相互作用时不协调。[^6]
|
||||
|
||||
菲尔丁提出 REST 是因为网络发展带来了“<ruby>超越政府的可扩展性<rt>anarchic scalability</rt></ruby>”这一棘手问题,菲尔丁的意思是需要以一种高性能的方式跨越组织和国家边界连接文件。REST 所施加的约束是经过精心选择的,以用来解决这一“超越政府的扩展性”问题。_面向公众_ 的网络服务 API 同样需要解决类似的问题,因此可以理解为什么 REST 在这些应用中是适用的。然而,时至今日,如果发现一个工程团队使用 REST 构建了一个后端,即使这个后端只与工程团队完全控制的客户端通讯,也不会令人惊讶。我们都成为了 [<ruby>蒙蒂巨蟒<rt>Monty Python</rt></ruby> 的独幕滑稽剧][9] 中的建筑师,那位建筑师按照屠宰场的风格设计了一座公寓大楼,因为屠宰场是他唯一具有的经验的建筑。(菲尔丁使用了这部滑稽剧中的一句台词作为他的博士论文的题词:打扰一下,你说的是“刀”吗?)(LCTT 校注:顺便说一句,Python 语言的名称来自于 “Monty Python” 这个英国超现实幽默表演团体的名字。)
|
||||
|
||||
有鉴于菲尔丁的博士论文一直在极力避免提供一种放之四海而皆准的软件架构,REST 又怎么会成为所有网络服务的事实上的标准呢?
|
||||
|
||||
我认为,在 21 世纪头十年的中期人们已经厌倦了简单对象访问协议(SOAP),因此想要创造另一种属于他们自己的四字首字母缩略词。
|
||||
|
||||
我只是半开玩笑。<ruby>简单对象访问协议<rt>Simple Object Access Protocol</rt></ruby>(SOAP)是一个冗长而复杂的协议,以致于你没法在不事先理解一堆互相关联的可扩展标记语言(XML)规范的基础上使用它。早期的网络服务提供基于 SOAP 的 API。在 21 世纪头十年中期,随着越来越多的 API 开始提供,被 SOAP 的复杂性激怒的软件开发者随之集体迁移。
|
||||
|
||||
SOAP 遭到了这群人的蔑视,Rails 之父 <ruby>戴维·海涅迈尔·汉森<rt>David Heinemeier Hansson</rt></ruby>(LCTT 译注:译自其所著的《重来》的中文版的作者译名)曾经评论:“我们感觉 SOAP 过于复杂了,它已经被企业人员接管。而当这一切发生的时候,通常没有什么好结果。”[^7] 始于这一标志性的评论,Ruby-on-Rails 于 2007 年放弃了对 SOAP 的支持。“企业人员”总是希望所有内容都被正式指定,反对者认为这是浪费时间。
|
||||
|
||||
如果反对者不再继续使用 SOAP,他们仍然需要一些标准化的方式来进行工作。由于所有人都在使用 HTTP,而且代理与缓存的所有支持,每个人都至少会继续使用 HTTP 作为传输层,因此最简单的解决方案就是依赖 HTTP 的现有语义。这正是他们所做的工作。他们曾经称之为:<ruby>去它的,重载 HTTP<rt>Fuck It, Overload HTTP</rt></ruby>(FIOH)。这会是一个准确的名称,任何曾经试图决定业务逻辑错误需要返回什么 HTTP 状态码的人都能证明这一点。但是在所有的 SOAP 正式规范工作的映衬下,这显得鲁莽而乏味。
|
||||
|
||||
幸运的是,出现了这篇由 HTTP/1.1 规范的共同作者创作的博士论文。这篇博士论文与扩展 HTTP 有某种模糊的联系,并给予了 FIOH 一个具有学术体面的外表。因此 REST 非常适合用来掩饰其实仅仅是 FIOH 的东西。
|
||||
|
||||
我并不是说事情就是这样发生的,也不是说在不敬业的创业者中确实存在着盗用 REST 的阴谋,但是这个故事有助于我理解,在菲尔丁的博士论文根本就不是讨论网络服务 API 的情况下,REST 是如何成为用于网络服务 API 的架构模型的。采用 REST 的约束存在一些效果,尤其是对于那些面向公众的需要跨越组织边界的 API 来说。这些 API 通常会从 REST 的“统一接口”中受益。这应该是 REST 起初在构建网络 API 时被提及的核心原因。但是,想象一下一种叫做 “FIOH” 的独立方法,它借用 “REST” 的名字只是为了营销,这有助于我解释我们今天所知道的 <ruby>REST 式<rt>RESTful</rt></ruby> API 与菲尔丁最初描述的 REST 的架构风格之间的诸多差异。
|
||||
|
||||
举例而言,REST 纯粹主义者经常抱怨,那些所谓 RESTful API 实际并不是 REST API,因为它们根本就没有使用 <ruby>超文本作为应用程序状态引擎<rt>Hypermedia as The Engine of Application State</rt></ruby>(HATEOAS)。菲尔丁本人也做出过 [这样的批评][11]。根据菲尔丁的观点,一个真正的 REST API 应当允许你通过跟随链接实现从一个基础端点访问所有的端点。如果你认为这些人的确在试图构建 RESTful API,那么存在一个明显的疏漏 —— 使用超文本作为应用程序状态引擎(HATEOAS)的确是菲尔丁最初提出的 REST 概念的基础,尤其是考虑到“描述性状态迁移(REST)”中的“状态迁移(ST)”意指使用资源之间的超链接进行状态机的导航(而不是像很多人所相信的那样通过线路传输资源状态)[^8]。但是你试想一下,如果每个人都只是在构建 FIOH 的 API,并明里暗里的将之作为 REST API 宣传,或者更诚实一点说是作为 “RESTful” API 宣传,那么自然使用超文本作为应用程序状态引擎(HATEOAS)也就不重要了。
|
||||
|
||||
类似的,你可能会感到惊讶:尽管软件开发者喜欢不断地争论使用 `PUT` 方法还是使用 `PATCH` 方法来更新资源更加 RESTful,菲尔丁的博士论文却没有讨论哪个 HTTP 的操作方法应该映射到增删改查(CURD)操作。在 HTTP 操作与 CURD 操作之间建立一个标准的映射表是有用的,但是这一映射表是 FIOH 的一部分而不是 REST 的一部分。
|
||||
|
||||
这就是为什么,与其说没有人理解 REST,不如说我们应该认为 “REST” 这一术语是被误用了。REST API 这一现代概念与菲尔丁的 REST 架构之间存在历史联系,但事实上它们是两个不同的概念。历史联系适合作为确定何时构建 RESTful API 的指引而留在心底。你的 API 需要像 HTTP 那样跨越组织和政府边界吗?如果是的话,那么构建具有统一的可预测的接口的 RESTful API 可能是正确的方式。如果不是的话,你最好记住,菲尔丁更倾向于形式服从功能。或许类似 GraphQL 的方案或者仅仅 JSON-RPC 更适合你试图完成的工作。
|
||||
|
||||
[^1]: Roy Fielding. “Architectural Styles and the Design of Network-based Software Architectures,” 128. 2000. University of California, Irvine, PhD Dissertation, accessed June 28, 2020, <https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation_2up.pdf>.
|
||||
[^2]: Fielding, 130.
|
||||
[^3]: Fielding distinguishes between software architectures and software architecture “styles.” REST is an architectural style that has an instantiation in the architecture of HTTP.
|
||||
[^4]: Fielding, 2.
|
||||
[^5]: Fielding, 15.
|
||||
[^6]: Fielding, 82.
|
||||
[^7]: Paul Krill. “Ruby on Rails 2.0 released for Web Apps,” InfoWorld. Dec 7, 2007, accessed June 28, 2020, <https://www.infoworld.com/article/2648925/ruby-on-rails-2-0-released-for-web-apps.html>
|
||||
[^8]: Fielding, 109.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://twobithistory.org/2020/06/28/rest.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
|
||||
[1]: https://news.ycombinator.com/item?id=7201871
|
||||
[2]: https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation_2up.pdf
|
||||
[9]: https://www.youtube.com/watch?v=vNoPJqm3DAY
|
||||
[11]: https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
|
||||
[13]: https://twitter.com/TwoBitHistory
|
||||
[14]: https://twobithistory.org/feed.xml
|
||||
[15]: https://twitter.com/TwoBitHistory/status/1247187881946275841?ref_src=twsrc%5Etfw
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/20/154318tpynlzzdi1yhug5h.jpg
|
@ -0,0 +1,90 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (cool-summer-021)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-15603-1.html)
|
||||
[#]: subject: (Open Source Security Foundation \(OpenSSF\): Reflection and Future)
|
||||
[#]: via: (https://www.linux.com/news/open-source-security-foundation-openssf-reflection-and-future/)
|
||||
[#]: author: (The Linux Foundation https://www.linuxfoundation.org/en/blog/openssf-reflection-and-future/)
|
||||
|
||||
开源安全基金会(OpenSSF):回顾和展望
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
[开源安全基金会][1](OpenSSF)正式 [成立于 2020 年 8 月 3 日][2]。本文将讨论 OpenSSF 创立的初衷,它成立之初六个月内的成就,以及它未来的愿景。
|
||||
|
||||
(LCTT 校注:原文发表于 2 年前, 但时至今日仍然有一些值得了解的信息。)
|
||||
|
||||
全世界都在推行开源软件(OSS)理念,所以开源软件的安全也至关重要。为了提升开源软件的安全性,业界已经做了大量工作,并取得了一些成果。这些成果包括:Linux 基金会的 <ruby>核心基础设施计划<rt>Core Infrastructure Initiative</rt></ruby>(CII)、GitHub 安全实验室的 <ruby>开源安全联盟<rt>Open Source Security Coalition</rt></ruby>(OSSC)和由谷歌以及其他公司创立的 <ruby>联合开源软件计划<rt>Joint Open Source Software Initiative</rt></ruby>(JOSSI)。
|
||||
|
||||
显然,如果这些成果合为一体,软件行业将发展得更加顺利。这三项成果在 2020 年合并为“旨在促进开源软件安全性的、由各行业巨头主导的跨行业联盟”。
|
||||
|
||||
OpenSSF 的确受益于这种“跨行业联盟”;它有几十个成员,(按字母顺序)包括 Canonical、 GitHub、谷歌、IBM、英特尔、微软和红帽。联盟的理事会成员还包括安全社区个人代表,这些个人代表是那些不能以企业名义作为联盟成员的个人。该联盟也创造了一些便于人们合作的组织结构:建立一些活跃的工作组,这种工作组确定(并公布)它存在的价值,其中的成员应当就该组织的技术愿景形成一致意见。
|
||||
|
||||
但是这并不重要,除非它们有实际成果。当时虽然处于早期,它们也确实取得了一些成果。它们发布了:
|
||||
|
||||
* [安全软件开发基础课程][3]:在 edX 平台上有 3 门免费课程,旨在教授软件开发人员软件安全方面的知识。这些课程注重实际操作,任何开发人员都可以较轻松地学习,而不是那些需要耗费大量资源的理论或案例。开发人员也可以付费参加测试,从而获得认证,表明自己掌握了这些课程地内容。
|
||||
* [安全评分卡][4]:为开源项目自动生成“安全分数”,帮助用户进行信任、风险和安全方面的决策。
|
||||
* [关键性分数][5]:基于一些参数,为开源项目自动生成关键性分数。临界分数可以让人们对世界上最重要的开源项目有更好的理解。
|
||||
* [安全度量仪表盘][6]:这是较早时候发布的成果,它结合安全评分卡、CII 最佳实践和其他数据来源,提供与 OSS 项目有关的安全和支持信息的仪表盘。
|
||||
* [OpenSSF CVE 基准测试][7]:基准测试由超过 200 个历史上的 JavaScript/TypeScript 漏洞(CVE)的脆弱代码和元数据组成。这将帮助安全团队评估市场上的各种安全工具,使他们能够用真实的代码库(而不是合成的测试代码)确定误报和漏报率。
|
||||
* [OWASP 安全知识框架][8]:与 OWASP 的合作成果,它是一个知识库,包含了带检查清单的项目和使用多种编程语言的最佳代码样例。它还提供针对开发者如何使用特定的语言编写安全代码的培训材料,以及用于实际操作的安全实验室。
|
||||
* 2020 年自由/开源软件贡献者调查报告:OpenSSF 和 LISH 发布了一份报告,其中详细说明了对开源软件贡献者的调查结果,并以此为依据,研究和确定提高 OSS 安全性和可持续性的方法。一共调查了 1200 名受访者。
|
||||
|
||||
现有的 [CII 最佳实践徽章][10] 项目已经与 OpenSSF 合并,将继续升级。现在项目有很多中文译者,翻译为斯瓦希里语的工作也在进行中,项目也进行了很多小改进,详细阐明获得徽章的要求。
|
||||
|
||||
2020 年 11 月举行的 OpenSSF 大会讨论了 OpenSSF 正在进行中的工作。最近,OpenSSF 有这些工作组:
|
||||
|
||||
* 漏洞披露
|
||||
* 安全工具
|
||||
* 安全最佳实践
|
||||
* 对开源项目安全漏洞的识别(重点关注指标仪表盘)
|
||||
* 对关键项目的保障
|
||||
* 数字身份认证
|
||||
|
||||
除了持续更新已发布的项目,未来可能的工作还包括:
|
||||
|
||||
* 为减少重复工作,在多种技术指标中确定哪些是重复和关联的安全需求。这就是作为领导者与 OWASP 协作开发,也称为 <ruby>[通用需求枚举][12]<rt>Common Requirements Enumeration</rt></ruby>(CRE)。CRE 旨在使用一种公共主题标识符,将标准和指南的各个部分联系起来,这种公共主题标识符的作用是令标准和方案制定者高效工作,令标准使用者能搜索到需要的信息,从而使双方对网络安全有相同的理解。
|
||||
* 建一个网站,提供对安全度量仪表盘的免安装访问。再次强调,这将会提供各种来源(包括安全计分卡和 CII 最佳实践)的数据的简单展示。
|
||||
* 开发对关键 OSS 项目的识别功能。哈佛大学和 LF 已经做过一些识别关键 OSS 项目的工作。未来一年内,他们会改进方法,添加新的数据来源,从而更好地进行鉴别工作。
|
||||
* 资助一些关键的 OSS 项目,提高它们的安全性。预期将关注那些财力不足的项目,帮助这些项目提升整体性能。
|
||||
* 识别和实现已改进和简化的技术,用于数字签名的提交和对身份的校验。
|
||||
|
||||
跟所有的 Linux 基金会项目一样,OpenSSF 的工作是由其成员决定的。如果你对大家所依赖的 OSS 安全有兴趣,你可以访问 OpenSSF 网站并以某种方式加入它们。参与的最好方式是出席工作组会议——会议每隔一周就举行,而且非常随意。通过合作,我们可以有所作为。欲了解更多信息,可以访问:
|
||||
|
||||
> **[https://openssf.org][1]**
|
||||
|
||||
作者:[David A. Wheeler][13] Linux 基金会开源供应链安全总监
|
||||
|
||||
[本文][14] 首次发表于 [Linux 基金会网站][15]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/news/open-source-security-foundation-openssf-reflection-and-future/
|
||||
|
||||
作者:[The Linux Foundation][a]
|
||||
选题:[lujun9972][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.linuxfoundation.org/en/blog/openssf-reflection-and-future/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://openssf.org/
|
||||
[2]: https://www.linuxfoundation.org/en/press-release/technology-and-enterprise-leaders-combine-efforts-to-improve-open-source-security/
|
||||
[3]: https://openssf.org/blog/2020/10/29/announcing-secure-software-development-edx-course-sign-up-today/
|
||||
[4]: https://openssf.org/blog/2020/11/06/security-scorecards-for-open-source-projects/
|
||||
[5]: https://github.com/ossf/criticality_score
|
||||
[6]: https://github.com/ossf/Project-Security-Metrics
|
||||
[7]: https://openssf.org/blog/2020/12/09/introducing-the-openssf-cve-benchmark/
|
||||
[8]: https://owasp.org/www-project-security-knowledge-framework/
|
||||
[9]: https://www.linuxfoundation.org/en/press-release/new-open-source-contributor-report-from-linux-foundation-and-harvard-identifies-motivations-and-opportunities-for-improving-software-security/
|
||||
[10]: https://bestpractices.coreinfrastructure.org/
|
||||
[11]: https://openssf.org/blog/2020/11/23/openssf-town-hall-recording-now-available/
|
||||
[12]: https://owasp.org/www-project-integration-standards/
|
||||
[13]: mailto:dwheeler@linuxfoundation.org
|
||||
[14]: https://www.linuxfoundation.org/en/blog/openssf-reflection-and-future/
|
||||
[15]: https://www.linuxfoundation.org/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/07/083725e6zk5pc2atq86qt9.jpg
|
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
|
112
published/20211014 9 ways to use open source every day.md
Normal file
112
published/20211014 9 ways to use open source every day.md
Normal file
@ -0,0 +1,112 @@
|
||||
[#]: subject: "9 ways to use open source every day"
|
||||
[#]: via: "https://opensource.com/article/21/10/open-source-tools"
|
||||
[#]: author: "Don Watkins https://opensource.com/users/don-watkins"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "XiaotingHuang22"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15604-1.html"
|
||||
|
||||
每天使用开源的 9 种方法
|
||||
======
|
||||
|
||||
> 你可能会惊奇地发现,那些你每天使用的工具竟是开源的。
|
||||
|
||||
![][0]
|
||||
|
||||
最近,我受邀介绍网络上可用的免费和开放资源。这次演讲是当地为保持我们社区的正常运转而做出的部分尝试 —— 由我家附近的 <ruby>圣文德大学<rt>St. Bonaventure University</rt></ruby> [Foster Center][2] 赞助。 我分享的一些资源不是开源的而是免费的,但许多工具是开源的。
|
||||
|
||||
看到有不少人知道我所提到的工具真的很有趣。很多人并不知道他们每天使用的工具都是开源的,并且他们还可以与他人分享。
|
||||
|
||||
### 开源浏览器
|
||||
|
||||
使用网络需要一个好的浏览器,而 [Firefox 是开源的][3],这一点很多在场的人并不清楚。除了是开源,Firefox 还具有强烈的隐私意识,这是许多用户越来越关注的问题。不过,有趣的是,即使是微软的新浏览器也是基于开源 Chromium 项目的。
|
||||
|
||||
### 开源网络隐私
|
||||
|
||||
通常,保护你的隐私和改善你的网络体验的另一种方法是使用 uBlock Origin 来阻止广告。根据他们的网站:
|
||||
|
||||
> uBlock Origin 是一个免费、开源、跨平台的内容过滤浏览器扩展——主要旨在以一种高效、用户友好的方法消除隐私侵犯。
|
||||
|
||||
其代码采用 [GPL v. 3.0][4] 许可证。
|
||||
|
||||
<ruby>电子前沿基金会<rt>Electronic Frontier Foundation</rt></ruby>(EFF)还维护 [Privacy Badger][5]———— 这是一个根据 GPL v.3.0 许可的网络浏览器扩展程序。根据他们的 GitHub 存储库,它是:
|
||||
|
||||
> 一个可以自动学习阻止隐形的跟踪器的浏览器扩展程序。Privacy Badger 没有一个要阻止的列表,而是根据它们的行为自动发现跟踪器。
|
||||
|
||||
除了隐私之外,我的演讲还分享了安全密码的重要性。我的听众了解到了 [Bitwarden][6]。许多人不知道如何生成安全密码、区分不同网站的密码以及如何安全地存储它们。我演示了该软件如何创建密码并使用 Bitwarden 将这些密码存储在云中。我解释了用户如何通过浏览器插件、台式机和笔记本电脑应用程序以及在安卓或 iOS 移动设备上访问这些凭证。
|
||||
|
||||
### 开源通讯工具
|
||||
|
||||
本次演讲中,我谈到了通讯工具在我们生活中的无处不在,但同时它本身固有的不安全性。观众不知道 [Signal][7]。我已经使用 Signal 几年了,并经常鼓励其他人将其视为一个安全的消息传递平台。在 Linux、macOS、Windows、[安卓][9] 和 [iOS][10] 上 [安装 Signal][8] 很容易,它提供了出色的 [文档][11] 支持,对不同的操作系统都有着详细的安装说明。Signal 使用你现有的手机号码,只要它可以发送和接收短信和打电话。当你第一次在手机上设置 Signal 时,它会在你的通讯录上搜索同样使用 Signal 的联系人。
|
||||
|
||||
### 开源办公工具
|
||||
|
||||
如果不提及我最喜欢的内容创建工具 [LibreOffice][12],那么关于开源工具的介绍是不完整的。尽管它很受欢迎,但还是有许多人并不知道它的存在以及使用它所带来的自由。我每天都用它来写文章。我使用它来做表格而不是 Excel,有时我用它来做演示文稿。你可以在 Linux、macOS 和 Windows 上下载并安装它。LibreOffice 的优点之一是你真正拥有自己的文档,不需要昂贵的程序来访问它们。
|
||||
|
||||
### 开源博客软件
|
||||
|
||||
[WordPress][13] 是我最喜欢的博客引擎,你可以通过多种方式使用它,无论是分享你对世界大事的看法、为你的 [学生][14] 提供低成本写作平台,还是在网上为你的 [业务][15] 做宣传。
|
||||
|
||||
### 开源媒体库
|
||||
|
||||
在创建内容时,你需要可以轻松合法共享的图片来说明你的作品。[OpenClipart][16] 是我的首选。这里有数以千计的各种流行格式的图片,可以放在你的 LibreOffice 文档和博客文章中。此外,你可以通过 <ruby>[知识共享][17]<rt>Creative Commons</rt></ruby> 找到你可以分享的图片,并注明适当的出处。知识共享提供的许可,使共享变得更容易。它是版权的延伸,让分享图片变得更容易。但请务必熟悉许可证之间的细微差别。
|
||||
|
||||
### 开源视频会议
|
||||
|
||||
疫情改变了会议和聚会的模式。正如 Chris Hermansen [此处][18] 所报告的那样,Jitsi、Big Blue Button 和其他一些软件已经彻底改变了我们互动和学习的方式。
|
||||
|
||||
### 开源教育资源
|
||||
|
||||
开放教育资源解放了学习。通过 [OER Commons][19],你可以找到满足你需求的内容,从学前班到研究生和专业学位,它是公开许可的,因此你可以使用它并与他人分享。麻省理工学院(MIT)开放课件提供了麻省理工学院几乎所有的本科生和研究生项目内容,均根据知识共享 [非商业性共享方式][20] 许可提供。[OpenStax][21] 是莱斯大学的一项开放教科书计划,提供经过同行评审的教科书,这些教科书已公开许可并免费提供。
|
||||
|
||||
### 开源播客工具
|
||||
|
||||
播客已成为了解最新 [开源新闻][22] 的好方法。你有没有想过做自己的播客?我熟悉一些很棒的开源工具能够帮你实现这一目标。[Audacity][23] 是我最喜欢的录音应用程序。我用它来翻录我的课堂教学、记录访谈和试验音效。它是一个 16 轨音频编辑器,你可以通过多种方式使用它。如果你有话要说或有技能要传授,你应该使用 [Open Broadcaster Software][24](OBS)。
|
||||
|
||||
### Linux
|
||||
|
||||
最后,向你的朋友介绍 Linux,他们中的许多人仍然不了解 Linux,让他们体验所有现成的免费软件。
|
||||
|
||||
除了在 [YouTube][25] 上录制和分享的演讲外,我还编制了一份资源链接列表,并在 [GitHub][26] 上分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/10/open-source-tools
|
||||
|
||||
作者:[Don Watkins][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[XiaotingHuang22](https://github.com/XiaotingHuang22)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_hardware_purple.png?itok=3NdVoYhl (Tools illustration)
|
||||
[2]: https://www.sbu.edu/academics/schools-at-sbu/school-of-business/foster-center-for-responsible-leadership/foster-center-events
|
||||
[3]: https://opensource.com/article/21/9/switch-to-firefox
|
||||
[4]: https://github.com/gorhill/uBlock
|
||||
[5]: https://privacybadger.org/
|
||||
[6]: https://github.com/bitwarden
|
||||
[7]: https://opensource.com/article/19/10/secure-private-messaging
|
||||
[8]: https://signal.org/download/
|
||||
[9]: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms&referrer=utm_source%3DOWS%26utm_medium%3DWeb%26utm_campaign%3DNav
|
||||
[10]: https://apps.apple.com/us/app/signal-private-messenger/id874139669
|
||||
[11]: https://support.signal.org/
|
||||
[12]: https://opensource.com/article/21/9/libreoffice-tips
|
||||
[13]: https://opensource.com/article/18/10/setting-wordpress-raspberry-pi
|
||||
[14]: https://opensource.com/article/20/4/wordpress-virtual-machine
|
||||
[15]: https://opensource.com/article/21/3/wordpress-plugins-retail
|
||||
[16]: https://openclipart.org/
|
||||
[17]: https://search.creativecommons.org/
|
||||
[18]: https://opensource.com/article/20/5/open-source-video-conferencing
|
||||
[19]: https://www.oercommons.org/
|
||||
[20]: https://ocw.mit.edu/help/faq-cite-ocw-content/
|
||||
[21]: https://openstax.org/
|
||||
[22]: https://opensource.com/article/19/10/linux-podcasts-Jupiter-Broadcasting
|
||||
[23]: https://opensource.com/article/20/4/audacity
|
||||
[24]: https://opensource.com/article/20/4/open-source-live-stream
|
||||
[25]: https://youtu.be/aUgaYtN_sUU
|
||||
[26]: https://github.com/donwatkins/Presentations/blob/master/fostercenter.md
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/07/153419u0nfxeogevozebfv.jpg
|
75
published/202206/20210104 10 ways Ansible is for everyone.md
Normal file
75
published/202206/20210104 10 ways Ansible is for everyone.md
Normal file
@ -0,0 +1,75 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Donkey-Hao)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14739-1.html)
|
||||
[#]: subject: (10 ways Ansible is for everyone)
|
||||
[#]: via: (https://opensource.com/article/21/1/ansible)
|
||||
[#]: author: (James Farrell https://opensource.com/users/jamesf)
|
||||
|
||||
分享 10 篇 Ansible 文章
|
||||
======
|
||||
|
||||
> 通过这些 Ansible 文章扩展你的知识和技能。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/21/111840akw4bjd13dh8ayky.jpg)
|
||||
|
||||
我希望能够激发刚刚接触 Ansible 的初学者的兴趣。这里有一系列总结文章,我已将其包括在内,以供你随意后续查阅。
|
||||
|
||||
### 适合初学者的 Ansible
|
||||
|
||||
这五篇文章对于 Ansible 新手来说是一个非常好的起点。前三篇文章由 Seth Kenlon 撰写。
|
||||
|
||||
* 如果你不了解 Ansible ,[现在可以做这 7 件事][2] 来入手。这是很好的入门指导,它收集了用于管理硬件、云、容器等的链接。
|
||||
* 在 《[编排与自动化有何区别?][3]》 这篇文章中,你会学到一些术语和技术路线,将会激发你对 Ansible 感兴趣。
|
||||
* 文章 《[如何用 Ansible 安装软件][4]》 覆盖了一些脚本概念和一些 Ansible 的好惯例,给出了一些本地或远程管理软件包的案例。
|
||||
* 在 [我编写 Ansible 剧本时学到的 3 个教训][5] 中,使自己养成 Jeff Geerling 所传授的好习惯,他是一位真正的 Ansible 资深人士。源代码控制、文档、测试、简化和优化是自动化成功的关键。
|
||||
* 《[我使用 Ansible 的第一天][6]》 介绍了记者 David Both 在解决重复性开发任务时的思考过程。这篇文章从 Ansible 的基础开始,并说明了一些简单的操作和任务。
|
||||
|
||||
### 尝试 Ansible 项目
|
||||
|
||||
一旦你掌握了基础和并拥有良好习惯,就可以开始一些具体主题和实例了。
|
||||
|
||||
* Ken Fallon 在 《[使用 Ansible 管理你的树莓派机群][7]》 一文中介绍了一个部署和管理树莓派设备机群的示例。它介绍了受限环境中的安全和维护概念。
|
||||
* 在 《[将你的日历与 Ansible 融合以避免日程冲突][8]》一文中,Nicolas Leiva 快速介绍了如何使用前置任务和条件在自动日程安排中中强制执行隔离窗口
|
||||
* Nicolas 在 《[创建一个整合你的谷歌日历的 Ansible 模块][9]》中完成了他的日历隔离的理念。他的文章深入探讨了在 Go 中编写自定义 Ansible 模块以实现所需的日历连接。 Nicolas 介绍了构建和调用 Go 程序并将所需数据传递给 Ansible 并接收所需输出的不同方法。
|
||||
|
||||
### 提升你的 Ansible 技巧
|
||||
|
||||
Kubernetes 是近来的热门话题,以下文章提供了一些很好的示例来学习新技能。
|
||||
|
||||
* 在 《[适用于 Kubernets 自动编排你的 Ansible 模块][10]》 文章中,Seth Kenlon 介绍了 Ansible Kubernetes 模块, 介绍了用于测试的基本 Minikube 环境,并提供了一些用于<ruby>荚<rt>Pod</rt></ruby> 控制的 `k8s` 模块的基本示例。
|
||||
* Jeff Geerling 在 《[使用 Ansible 的 Helm 模块构建 Kubernetes Minecraft 服务器][11]》 中解释了 Helm Chart 应用程序、Ansible 集合以及执行一个有趣的项目以在 k8s 集群中设置你自己的 Minecraft 服务器的概念。
|
||||
|
||||
我希望你的 Ansible 旅程已经开始,并能常从这些文章中充实自己。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/ansible
|
||||
|
||||
作者:[James Farrell][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Donkey](https://github.com/Donkey-Hao)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jamesf
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/innovation_lightbulb_gears_devops_ansible.png?itok=TSbmp3_M (gears and lightbulb to represent innovation)
|
||||
[2]: https://opensource.com/article/20/9/ansible
|
||||
[3]: https://opensource.com/article/20/11/orchestration-vs-automation
|
||||
[4]: https://opensource.com/article/20/9/install-packages-ansible
|
||||
[5]: https://opensource.com/article/20/1/ansible-playbooks-lessons
|
||||
[6]: https://opensource.com/article/20/10/first-day-ansible
|
||||
[7]: https://opensource.com/article/20/9/raspberry-pi-ansible
|
||||
[8]: https://opensource.com/article/20/10/calendar-ansible
|
||||
[9]: https://opensource.com/article/20/10/ansible-module-go
|
||||
[10]: https://opensource.com/article/20/9/ansible-modules-kubernetes
|
||||
[11]: https://opensource.com/article/20/10/kubernetes-minecraft-ansible
|
||||
[12]: https://opensource.com/article/20/1/ansible-news-edition-six
|
||||
[13]: https://opensource.com/article/20/2/ansible-news-edition-seven
|
||||
[14]: https://opensource.com/article/20/3/ansible-news-edition-eight
|
||||
[15]: https://opensource.com/article/20/4/ansible-news-edition-nine
|
||||
[16]: https://opensource.com/article/20/5/ansible-news-edition-ten
|
||||
[17]: https://opensource.com/how-submit-article
|
@ -0,0 +1,245 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (turbokernel)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14747-1.html)
|
||||
[#]: subject: (Docker Compose: a nice way to set up a dev environment)
|
||||
[#]: via: (https://jvns.ca/blog/2021/01/04/docker-compose-is-nice/)
|
||||
[#]: author: (Julia Evans https://jvns.ca/)
|
||||
|
||||
Docker Compose:搭建开发环境的好方式
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/23/180033lpg4v4bz0bbb1719.jpg)
|
||||
|
||||
大家好!我又写了一篇关于 [我最喜欢的电脑工具][1] 的文章。这一篇讲的是 Docker Compose!
|
||||
|
||||
本文主要就是讲一讲我对 Docker Compose 有多么满意啦(不讨论它的缺点)!咳咳,因为它总能够完成它该做的,并且似乎总能有效,更棒的是,它的使用还非常简单。另外,在本文中,我只讨论我是如何用 Docker Compose 来搭建开发环境的,而不涉及它在生产中的使用。
|
||||
|
||||
最近,我考虑了很多关于这种个人开发环境的搭建方式,原因是,我现在把所有的计算工作都搬到了一个私有云上,大概 20 美元/月的样子。这样一来,我就不用在工作的时候花时间去思考应该如何管理几千台 AWS 服务器了。
|
||||
|
||||
在此之前,我曾花了两天的时间,尝试使用其他的工具来尝试搭建一个开发环境,搭到后面,我实在是心累了。相比起来,Docker Compose 就简单易用多了,我非常满意。于是,我和妹妹分享了我的 `docker-compose` 使用经历,她略显惊讶:“是吧!你也觉得 Docker Compose 真棒对吧!” 嗯,我觉得我应该写一篇博文把过程记录下来,于是就有了你们看到的这篇文章。
|
||||
|
||||
### 我们的目标是:搭建一个开发环境
|
||||
|
||||
目前,我正在编写一个 Ruby on Rails 服务(它是一个计算机“调试”游戏的后端)。在我的生产服务器上,我安装了:
|
||||
|
||||
* 一个 Nginx 服务器
|
||||
* 一个 Rails 服务
|
||||
* 一个 Go 服务(使用了 [gotty][2] 来代理一些 SSH 连接)
|
||||
* 一个 Postgres 数据库
|
||||
|
||||
在本地搭建 Rails 服务非常简单,用不着容器(我只需要安装 Postgres 和 Ruby 就行了,小菜一碟)。但是,我还想要把匹配 `/proxy/*` 的请求的发送到 Go 服务,其他所有请求都发送到 Rails 服务,所以需要借助 Nginx。问题来了,在笔记本电脑上安装 Nginx 对我来说太麻烦了。
|
||||
|
||||
是时候使用 `docker-compose` 了!
|
||||
|
||||
### docker-compose 允许你运行一组 Docker 容器
|
||||
|
||||
基本上,Docker Compose 的作用就是允许你运行一组可以互相通信 Docker 容器。
|
||||
|
||||
你可以在一个叫做 `docker-compose.yml` 的文件中,配置你所有的容器。我在下方将贴上我为这个服务编写的 `docker-compose.yml` 文件(完整内容),因为我觉得它真的很简洁、直接!
|
||||
|
||||
```
|
||||
version: "3.3"
|
||||
services:
|
||||
db:
|
||||
image: postgres
|
||||
volumes:
|
||||
- ./tmp/db:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_PASSWORD: password # yes I set the password to 'password'
|
||||
go_server:
|
||||
# todo: use a smaller image at some point, we don't need all of ubuntu to run a static go binary
|
||||
image: ubuntu
|
||||
command: /app/go_proxy/server
|
||||
volumes:
|
||||
- .:/app
|
||||
rails_server:
|
||||
build: docker/rails
|
||||
command: bash -c "rm -f tmp/pids/server.pid && source secrets.sh && bundle exec rails s -p 3000 -b '0.0.0.0'"
|
||||
volumes:
|
||||
- .:/app
|
||||
web:
|
||||
build: docker/nginx
|
||||
ports:
|
||||
- "8777:80" # this exposes port 8777 on my laptop
|
||||
```
|
||||
|
||||
这个配置包含了两种容器。对于前面两个容器,我直接使用了现有的镜像(`image: postgres` 和 `image: ubuntu`)。对于后面两个容器,我不得不构建一个自定义容器镜像,其中, `build: docker/rails` 的作用就是告诉 Docker Compose,它应该使用 `docker/rails/Dockerfile` 来构建一个自定义容器。
|
||||
|
||||
我需要允许我的 Rails 服务访问一些 API 密钥和其他东西,因此,我使用了 `source secrets.sh`,它的作用就是在环境变量中预设一组密钥。
|
||||
|
||||
### 如何启动所有服务:先 “build” 后 “up”
|
||||
|
||||
我一直都是先运行 `docker-compose build` 来构建容器,然后再运行 `docker-compose up` 把所有服务启动起来。
|
||||
|
||||
你可以在 yaml 文件中设置 `depends_on`,从而进行更多启动容器的控制。不过,对于我的这些服务而言,启动顺序并不重要,所以我没有设置它。
|
||||
|
||||
### 网络互通也非常简单
|
||||
|
||||
容器之间的互通也是一件很重要的事情。Docker Compose 让这件事变得超级简单!假设我有一个 Rails 服务正在名为 `rails_server` 的容器中运行,端口是 3000,那么我就可以通过 `http://rails_server:3000` 来访问该服务。就是这么简单!
|
||||
|
||||
以下代码片段截取自我的 Nginx 配置文件,它是根据我的使用需求配置的(我删除了许多 `proxy_set_headers` 行,让它看起来更清楚):
|
||||
|
||||
```
|
||||
location ~ /proxy.* {
|
||||
proxy_pass http://go_server:8080;
|
||||
}
|
||||
location @app {
|
||||
proxy_pass http://rails_server:3000;
|
||||
}
|
||||
```
|
||||
|
||||
或者,你可以参考如下代码片段,它截取自我的 Rails 项目的数据库配置,我在其中使用了数据库容器的名称(`db`):
|
||||
|
||||
```
|
||||
development:
|
||||
<<: *default
|
||||
database: myproject_development
|
||||
host: db # <-------- 它会被“神奇地”解析为数据库容器的 IP 地址
|
||||
username: postgres
|
||||
password: password
|
||||
```
|
||||
|
||||
至于 `rails_server` 究竟是如何被解析成一个 IP 地址的,我还真有点儿好奇。貌似是 Docker 在我的计算机上运行了一个 DNS 服务来解析这些名字。下面是一些 DNS 查询记录,我们可以看到,每个容器都有它自己的 IP 地址:
|
||||
|
||||
```
|
||||
$ dig +short @127.0.0.11 rails_server
|
||||
172.18.0.2
|
||||
$ dig +short @127.0.0.11 db
|
||||
172.18.0.3
|
||||
$ dig +short @127.0.0.11 web
|
||||
172.18.0.4
|
||||
$ dig +short @127.0.0.11 go_server
|
||||
172.18.0.5
|
||||
```
|
||||
|
||||
### 是谁在运行这个 DNS 服务?
|
||||
|
||||
我(稍微)研究了一下这个 DNS 服务是怎么搭建起来的。
|
||||
|
||||
以下所有命令都是在容器外执行的,因为我没有在容器里安装很多网络工具。
|
||||
|
||||
**第一步:**:使用 `ps aux | grep puma`,获取 Rails 服务的进程 ID。
|
||||
|
||||
找到了,它是 `1837916`!简单~
|
||||
|
||||
**第二步:**:找到和 `1837916` 运行在同一个网络命名空间的 UDP 服务。
|
||||
|
||||
我使用了 `nsenter` 来在 `puma` 进程的网络命令空间内运行 `netstat`(理论上,我猜想你也可以使用 `netstat -tupn` 来只显示 UDP 服务,但此时,我的手指头只习惯于打出 `netstat -tulpn`)。
|
||||
|
||||
```
|
||||
$ sudo nsenter -n -t 1837916 netstat -tulpn
|
||||
Active Internet connections (only servers)
|
||||
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
|
||||
tcp 0 0 127.0.0.11:32847 0.0.0.0:* LISTEN 1333/dockerd
|
||||
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 1837916/puma 4.3.7
|
||||
udp 0 0 127.0.0.11:59426 0.0.0.0:* 1333/dockerd
|
||||
```
|
||||
|
||||
我们可以看到,此时有一个运行在 `59426` 端口的 UDP 服务,它是由 `dockerd` 运行的!或许它就是我们要找的 DNS 服务?
|
||||
|
||||
**第三步**:确定它是不是我们要找的 DNS 服务
|
||||
|
||||
我们可以使用 `dig` 工具来向它发送一个 DNS 查询:
|
||||
|
||||
```
|
||||
$ sudo nsenter -n -t 1837916 dig +short @127.0.0.11 59426 rails_server
|
||||
172.18.0.2
|
||||
```
|
||||
|
||||
奇怪,我们之前运行 `dig` 的时候,DNS 查询怎么没有发送到 `59426` 端口,而是发送到了 `53` 端口呢?这到底是怎么回事呀?
|
||||
|
||||
**第四步**:iptables
|
||||
|
||||
对于类似“这个服务似乎正运行在 X 端口上,但我却在 Y 端口上访问到了它,这是什么回事呢?”的问题,我的第一念头都是“一定是 iptables 在作怪”。
|
||||
|
||||
于是,我在运行了容器的网络命令空间内执行 `iptables-save`,果不其然,真相大白:
|
||||
|
||||
```
|
||||
$ sudo nsenter -n -t 1837916 iptables-save
|
||||
.... redacted a bunch of output ....
|
||||
-A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 59426 -j SNAT --to-source :53
|
||||
COMMIT
|
||||
```
|
||||
|
||||
在输出中有一条 iptables 规则,它将 `53` 端口的流量发送到了 `59426` 上。哈哈,真有意思!
|
||||
|
||||
### 数据库文件储存在一个临时目录中
|
||||
|
||||
这样做有一个好处:我可以直接挂载 Postgres 容器的数据目录 `./tmp/db`,而无需在我的笔记本电脑上管理 Postgres 环境。
|
||||
|
||||
我很喜欢这种方式,因为我真的不想在笔记本电脑上独自管理一个 Postgres 环境(我也真的不知道该如何配置 Postgres)。另外,出于习惯,我更喜欢让开发环境的数据库和代码放在同一个目录下。
|
||||
|
||||
### 仅需一行命令,我就可以访问 Rails 控制台
|
||||
|
||||
管理 Ruby 的版本总是有点棘手,并且,即使我暂时搞定了它,我也总是有点担心自己会把 Ruby 环境搞坏,然后就要修它个十年(夸张)。
|
||||
|
||||
(使用 Docker Compose)搭建好这个开发环境后,如果我需要访问 Rails <ruby>控制台<rt>console</rt></ruby>(一个交互式环境,加载了所有我的 Rails 代码),我只需要运行一行代码即可:
|
||||
|
||||
```
|
||||
$ docker-compose exec rails_server rails console
|
||||
Running via Spring preloader in process 597
|
||||
Loading development environment (Rails 6.0.3.4)
|
||||
irb(main):001:0>
|
||||
```
|
||||
|
||||
好耶!
|
||||
|
||||
### 小问题:Rails 控制台的历史记录丢失了
|
||||
|
||||
我碰到了一个问题:Rails 控制台的历史记录丢失了,因为我一直在不断地重启它。
|
||||
|
||||
不过,我也找到了一个相当简单的解决方案(嘿嘿):我往容器中添加了一个 `/root/.irbrc` 文件,它能够把 IRB 历史记录文件的保存位置指向一个不受容器重启影响的地方。只需要一行代码就够啦:
|
||||
|
||||
```
|
||||
IRB.conf[:HISTORY_FILE] = "/app/tmp/irb_history"
|
||||
```
|
||||
|
||||
### 我还是不知道它在生产环境的表现如何
|
||||
|
||||
到目前为止,这个项目的生产环境搭建进度,还停留在“我制作了一个 DigitalOcean droplet(LCCT 译注:一种 Linux 虚拟机服务),并手工编辑了很多文件”的阶段。
|
||||
|
||||
嗯……我相信以后会在生产环境中使用 docker-compose 来运行一下它的。我猜它能够正常工作,因为这个服务很可能最多只有两个用户在使用,并且,如果我愿意,我可以容忍它在部署过程中有 60 秒的不可用时间。不过话又说回来,出错的往往是我想不到的地方。
|
||||
|
||||
推特网友提供了一些在生产中使用 docker-compose 的注意事项:
|
||||
|
||||
* `docker-compose up` 只会重启那些需要重启的容器,这会让重启速度更快。
|
||||
* 有一个 Bash 小脚本 [wait-for-it][3],你可以用它来保持等待一个容器,直到另一个容器的服务可用。
|
||||
* 你可以准备两份 `docker-compose.yaml` 文件:用于开发环境的 `docker-compose.yaml` 和用于生产环境的 `docker-compose-prod.yaml`。我想我会在分别为 Nginx 指定不同的端口:开发时使用 `8999`,生产中使用 `80`。
|
||||
* 人们似乎一致认为,如果你的项目是一台计算机上运行的小网站,那么 docker-compose 在生产中不会有问题。
|
||||
* 有个人建议说,如果愿意在生产环境搭建复杂那么一丢丢,Docker Swarm 就或许会是更好的选择,不过我还没试过(当然,如果要这么说的话,干嘛不用 Kubernetes 呢?Docker Compose 的意义就是它超级简单,而 Kubernetes 肯定不简单 : ))。
|
||||
|
||||
Docker 似乎还有一个特性,它能够 [把你用 docker-compose 搭建的环境,自动推送到弹性容器服务(ESC)上][4],听上去好酷的样子,但是我还没有试过。
|
||||
|
||||
### docker-compose 会有不适用的场景吗
|
||||
|
||||
我听说 docker-compose 在以下场景的表现较差:
|
||||
|
||||
* 当你有很多微服务的时候(还是自己搭建比较好)
|
||||
* 当你尝试从一个很大的数据库中导入数据时(就像把几百 G 的数据存到每个人的笔记本电脑里一样)
|
||||
* 当你在 Mac 电脑上运行 Docker 时。我听说 Docker 在 macOS 上比在 Linux 上要慢很多(我猜想是因为它需要做额外的虚拟化)。我没有 Mac 电脑,所以我还没有碰到这个问题。
|
||||
|
||||
### 以上就是全部内容啦!
|
||||
|
||||
在此之前,我曾花了一整天时间,尝试使用 Puppet 来配置 Vagrant 虚拟机,然后在这个虚拟机里配置开发环境。结果,我发现虚拟机启动起来实在是有点慢啊,还有就是,我也不喜欢编写 Puppet 配置(哈哈,没想到吧)。
|
||||
|
||||
幸好,我尝试了 Docker Compose,它真好简单,马上就可以开始工作啦!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://jvns.ca/blog/2021/01/04/docker-compose-is-nice/
|
||||
|
||||
作者:[Julia Evans][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[turbokernel](https://github.com/turbokernel)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://jvns.ca/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://jvns.ca/#cool-computer-tools---features---ideas
|
||||
[2]: https://github.com/yudai/gotty/
|
||||
[3]: https://github.com/vishnubob/wait-for-it
|
||||
[4]: https://docs.docker.com/cloud/ecs-integration/
|
@ -0,0 +1,134 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Donkey-Hao)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14776-1.html)
|
||||
[#]: subject: (Configure a Linux workspace remotely from the command line)
|
||||
[#]: via: (https://opensource.com/article/21/1/remote-configuration-xfce4)
|
||||
[#]: author: (David Both https://opensource.com/users/dboth)
|
||||
|
||||
从命令行远程配置 Xfce4 工作区
|
||||
======
|
||||
|
||||
> 几乎所有的事情都可以从 Linux 命令行完成,包括对 Xfce4 进行远程配置。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/30/114747lfub5hh0b5nyquf3.jpg)
|
||||
|
||||
与专有操作系统相比,我很欣赏 Linux 的一个特点是,几乎所有的东西都可以从命令行中进行管理和配置。意味着几乎所有的事情都可以在本地或者通过 SSH 远程登录进行管理。虽然有时候需要花费一点时间在互联网上搜索,但是你能想到的任务,是有可能从命令行完成的。
|
||||
|
||||
### 问题
|
||||
|
||||
有时候需要使用命令行对桌面进行远程配置。在这种特殊情况下,我需要响应远程用户的请求将在 [Xfce][2] 控制板上的工作区从四个减少到三个。这种配置只需要在互联网上搜索约 20 分钟就找到了。
|
||||
|
||||
xfwm4 的默认工作区数量和许多其他设置可以在 `/usr/share/xfwm4/defaults` 这个文件中找到和修改。因此将 `workspace_count=2` 设置为 `workspace_count=4` 就改变了主机上所有用户的默认值。同时,非 root 用户可以执行 `xfconf-query` 命令来查询和设置 xfwm4 窗口管理器的各种属性。它应该由需要改变设置的用户使用,而不是由 root 使用。
|
||||
|
||||
在下面的例子中,首先我验证了当前工作区数量为 `4` ,然后将数量改为 `2`,最后确认了新设置。
|
||||
|
||||
```
|
||||
[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count
|
||||
4
|
||||
[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count -s 2
|
||||
[user@test1 ~]# xfconf-query -c xfwm4 -p /general/workspace_count
|
||||
2
|
||||
[user@test1 ~]#
|
||||
```
|
||||
|
||||
此更改会立即生效,用户可以马上看到,无需重新启动,甚至无需注销并重新登录。我曾在我的工作站上玩过这个游戏,当我输入设置不同数量的工作空间的命令时,可以观察到工作空间切换器的变化。我在哪儿都能找到乐子。;- )
|
||||
|
||||
### 更多探索
|
||||
|
||||
现在我解决了这个问题,我决深入了解一下 `xfconf-query` 命令。不幸的是,该工具没有手册或信息页,`/usr/share` 中也没有任何文档。退而求其次,使用 `-h` 选项获取一些帮助信息。
|
||||
|
||||
```
|
||||
$ xfconf-query -h
|
||||
Usage:
|
||||
xfconf-query [OPTION…] - Xfconf commandline utility
|
||||
Help Options:
|
||||
-h, --help 显示帮助选项
|
||||
Application Options:
|
||||
-V, --version 版本信息
|
||||
-c, --channel 查询/修改通道
|
||||
-p, --property 查询/修改属性
|
||||
-s, --set 更新权限的值
|
||||
-l, --list 罗列属性(或者通道,如果没有用 -c 指定)
|
||||
-v, --verbose 详细输出
|
||||
-n, --create 当新属性不存在,则创建它
|
||||
-t, --type 指定属性值类型
|
||||
-r, --reset 重置属性
|
||||
-R, --recursive 递归(与 -r 一起使用)
|
||||
-a, --force-array 即使只有一个元素也强制采用数组
|
||||
-T, --toggle 反转现有的布尔属性
|
||||
-m, --monitor 监视属性更改的通道
|
||||
```
|
||||
|
||||
这没有多大帮助,但我们还是可以从中找出一些有用的东西。首先,_通道_ 是可以修的属性的分组。我对 `general` 通道下的 `workspace_count` 属性进行了更改。让我们看看完整的通道列表:
|
||||
|
||||
```
|
||||
$ xfconf-query -l
|
||||
Channels:
|
||||
xfwm4
|
||||
xfce4-keyboard-shortcuts
|
||||
xfce4-notifyd
|
||||
xsettings
|
||||
xfdashboard
|
||||
thunar
|
||||
parole
|
||||
xfce4-panel
|
||||
xfce4-appfinder
|
||||
xfce4-settings-editor
|
||||
xfce4-power-manager
|
||||
xfce4-session
|
||||
keyboards
|
||||
displays
|
||||
keyboard-layout
|
||||
ristretto
|
||||
xfcethemer
|
||||
xfce4-desktop
|
||||
pointers
|
||||
xfce4-settings-manager
|
||||
xfce4-mixer
|
||||
```
|
||||
|
||||
给定通道的属性也可以用下列的命令来查看。我使用 `less` 分页器,因为结果是一长串数据。我对下面的列表进行了裁剪,但留下了足够多的条目,你可以看到这些条目的类型。
|
||||
|
||||
```
|
||||
$ xfconf-query -c xfwm4 -l | less
|
||||
/general/activate_action
|
||||
/general/borderless_maximize
|
||||
/general/box_move
|
||||
/general/box_resize
|
||||
/general/button_layout
|
||||
/general/button_offset
|
||||
<裁剪>
|
||||
/general/workspace_count
|
||||
/general/workspace_names
|
||||
/general/wrap_cycle
|
||||
/general/wrap_layout
|
||||
/general/wrap_resistance
|
||||
/general/wrap_windows
|
||||
/general/wrap_workspaces
|
||||
/general/zoom_desktop
|
||||
(END)
|
||||
```
|
||||
|
||||
你可以用这种方式探索所有的通道。我发现通道通常对应“设置管理器”中的各种设置。这些属性是你在这些对话框中设置的。请注意,并非你在“设置管理器”对话窗口中找到的所有设置都是 Xfce 桌面的一部分,因此它们没有对应的通道。屏幕保护程序就是一个例子,因为它是通用的 GNU 屏幕保护程序,并不是 Xfce 独有的。“设置管理器” 是 Xfce 定位这些配置工具的一个很好的中心位置。
|
||||
|
||||
### 文档
|
||||
|
||||
综上所述,`xconf-query` 命令似乎没有任何手册或信息页,并且我在网上发现了很多不正确的、记录不全的信息。我发现对 Xfce4 来说最好的文档是 [Xfce 网站][2],关于 `xconf-query` 的一些具体信息可以在这里找到。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/remote-configuration-xfce4
|
||||
|
||||
作者:[David Both][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Donkey-Hao](https://github.com/Donkey-Hao)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer)
|
||||
[2]: https://www.xfce.org/
|
@ -0,0 +1,66 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Donkey-Hao)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14773-1.html)
|
||||
[#]: subject: (3 stress-free steps to tackling your task list)
|
||||
[#]: via: (https://opensource.com/article/21/1/break-down-tasks)
|
||||
[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
|
||||
|
||||
轻松解决你的任务清单的三个步骤
|
||||
======
|
||||
|
||||
> 将你的大任务分为小步骤,避免自己不堪重负。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/29/145852zcqqw24v2svulswl.jpg)
|
||||
|
||||
本周开始,我先回顾我的日程安排,看看我需要或想要完成的事情。通常,列表上有些较大的项目。无论来自工作上的问题,还是一系列关于生产力的文章,或者改进我家的鸡舍,当作为一项工作时,这个任务真的很艰巨。很有可能我无法坐下来,在一个时间段内,甚至在一天内完成类似(请注意,只是举例)21 篇文章之类的事情。
|
||||
|
||||
![21 Days of Productivity project screenshot][2]
|
||||
|
||||
*21 天的生产力 (Kevin Sonney, [CC BY-SA 4.0][3])*
|
||||
|
||||
所以当我的清单上有这样的东西时,我做的第一件事就是把它分解成更小的部分。如著名的诺贝尔文学奖得主 [William Faulkner][4] 说的“移山的人,从小石头开始。”(LCTT 译注:感觉与“千里之行,始于足下”是一个意思) 我们要解决大任务(山)并且需要完成各个步骤(小石头)。
|
||||
|
||||
我使用下面的步骤将大任务分割为小步骤:
|
||||
|
||||
1. 我通常很清楚完成一项任务需要做什么。如果没有,我会做一些研究来弄清楚这一点。
|
||||
2. 我会顺序的写下完成的步骤。
|
||||
3. 最后,我坐下来拿着我的日历和清单,开始将任务分散到几天(或几周或几个月),以了解我何时可以完成它。
|
||||
|
||||
现在我不仅有计划,还知道多久能完成。逐步完成,我可以看到这项大任务不仅变得更小,而且更接近完成。
|
||||
|
||||
军队有句古话,“遇敌无计”。 几乎可以肯定的是,有一两点(或五点)我意识到像“截屏”这样简单的事情需要扩展到更复杂的事情。事实上,在 [Easy!Appointments][5] 的截图中,竟然是:
|
||||
|
||||
1. 安装和配置 Easy!Appointments
|
||||
2. 安装和配置 Easy!Appointments WordPress 插件
|
||||
3. 生成 API 密钥来同步日历
|
||||
4. 截屏
|
||||
|
||||
即便如此,我也不得不将这些任务分解成更小的部分——下载软件、配置 NGINX、验证安装……你明白了吧。没关系。一个计划或一组任务不是一成不变的,可以根据需要进行更改。
|
||||
|
||||
![project completion pie chart][6]
|
||||
|
||||
*今年的计划已经完成了 2/3 ! (Kevin Sonney, [CC BY-SA 4.0][3])*
|
||||
|
||||
这是一项后天习得的技能,最初几次需要一些努力。学习如何将大任务分解成更小的步骤可以让您跟踪实现目标或完成大任务的进度,而不会在过程中不知所措。
|
||||
|
||||
--------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/break-down-tasks
|
||||
|
||||
作者:[Kevin Sonney][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Donkey](https://github.com/Donkey-Hao)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/ksonney
|
||||
[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://opensource.com/sites/default/files/day14-image1.png
|
||||
[3]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[4]: https://en.wikipedia.org/wiki/William_Faulkner
|
||||
[5]: https://opensource.com/article/21/1/open-source-scheduler
|
||||
[6]: https://opensource.com/sites/default/files/day14-image2_1.png
|
@ -0,0 +1,97 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (godgithubf)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14756-1.html)
|
||||
[#]: subject: (3 ways to play video games on Linux)
|
||||
[#]: via: (https://opensource.com/article/21/2/linux-gaming)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
在 Linux 上玩电子游戏的三种方式
|
||||
======
|
||||
|
||||
> 如果你准备放下爆米花,想从各个角度体验游戏的话,那么就在 Linux 下打开游戏吧!
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/25/143306xijsi5aaz5jsj2aj.jpg)
|
||||
|
||||
如今,人们有更多喜欢 Linux 的理由。在这个系列里,我将分享 21 个使用 Linux 的理由。今天,我将从游戏开始。
|
||||
|
||||
我过去认为“游戏玩家”是一种非常特殊的生物,要由科学家们在数年的研究和测试之后严谨地认定才行。我从来没有把自己归类为游戏玩家,因为我所玩过的游戏要么是桌面游戏(棋盘类游戏和纸笔角色扮演游戏),要么是 NetHack、俄罗斯方块。现在,在移动设备、游戏机、电脑和电视机上都有游戏,我觉得现在的承认有各种形式的游戏玩家们了。如果你想自称为游戏玩家,你就可以是,不需任何资格认定。你不用必须在心里熟记那些“上上下下左右左右BA”的科乐美秘籍(你甚至可以不知道这是什么);你也不用必须买过和玩过 3A 级游戏。如果你时不时地玩游戏,你就完全可以自称为玩家。如果你想成为一名玩家,那么现在使用 Linux 正当其时。
|
||||
|
||||
### 欢迎来到游戏世界
|
||||
|
||||
剥除光鲜的广告,在其下面,你肯定会发现一个欣欣向荣的游戏世界。在人们相信不是电子表格也不是练习打字一类的软件能挣钱以前,新兴的游戏市场已经开始发展起来了。<ruby>独立游戏<rt>indie game</rt></ruby>已经在流行文化上以各种方式打上了自己的烙印(或许你不相信,《我的世界》尽管不是开源的,但一开始就是一款独立游戏),这也证实了,在玩家眼里,可玩性高于产品价值。
|
||||
|
||||
独立开发者和开源开发者之间有很多交集。没有什么比带着你的 Linux 笔记本电脑,浏览 itch.io 或你的发行版的软件库,寻找鲜为人知但珍贵的开源游戏宝藏更有意义了。
|
||||
|
||||
有各种各样的开源游戏,包括大量的第一视角射击游戏、Nodulus 之类的益智游戏、运输大亨之类的策略经营游戏、Jethook 之类的竞速游戏、Sauerbraten 之类的竞速逃生游戏,以及很多未提到的(多亏了像 Open Jam 这样伟大的活动,每年都有新增的游戏)。
|
||||
|
||||
![Jethook game screenshot][10]
|
||||
|
||||
总的来说,探索开源游戏的世界的体验,和购买大型游戏工作室的产品带来的即时满足感有很大的不同。大型游戏工作室生产的游戏提供大量的视听刺激、知名演员、和长达 60 小时以上的游戏时长。而独立和开源游戏不能与之相提并论。但是话又说回来,大型游戏工作室无法提供的是,当你发现一款别人未曾听说过的游戏时的产生的发现感和与个人相关的感受。当你意识到别人都非常想知道你刚玩过的哪个出色游戏时,大型工作室也并不能提供这种紧迫感。(LCTT 校注:此处大概的意思是指大型工作室的作品已被人熟知,没有什么挖掘的新鲜感)
|
||||
|
||||
花点时间找出你最喜欢的游戏,然后浏览下你的发行商的软件仓库、Flathub、开源的游戏仓库,看看你能发现什么,如果发现你很喜欢的游戏,就帮忙推广一下吧。
|
||||
|
||||
#### Proton 和 WINE
|
||||
|
||||
Linux 上的游戏并没有止步于开源,但是从开源开始的。数年前 Valve 软件公司通过发行 Linux 版的 Steam 客户端把 Linux 重新带入游戏市场时,人们希望这可以推动游戏工作室能编写原生的 Linux 游戏。一些工作室这样做了,但 Valve 公司并没有成功的把 Linux 推为主要的平台,即使是 Valve 品牌的游戏电脑。并且大多数游戏工作室又转回仅在 Windows 平台上开发游戏的旧方式。
|
||||
|
||||
有趣的是,最终的结果是产生了更多的开源代码。Valve 公司为 Linux 兼容创建了 Proton 工程,一个可以转换 Windows 游戏到 Linux 的兼容层。在 Proton 的内核层面,它使用了WINE(Wine Is Not an Emulator) —— 以开源的方式极好地重新实现了主要的 Windows 库。
|
||||
|
||||
游戏市场的成果,如今已经变成了开源世界的宝藏。今天,来自大型工作室的大多数游戏都可以在 Linux 上像原生游戏一样运行。
|
||||
|
||||
当然,如果你是必须要在发行日就玩上最新版游戏的这类玩家,你可能会遇到一些令人不愉快的“惊喜”。尽管那不是惊喜,很少有大型游戏在发行时毫无漏洞,一周后才补上补丁。这些游戏在 Proton 和 WINE 上运行时遇到这些错误可能更糟糕,因此 Linux 玩家通过避免尽早上车而避免这些问题。这种妥协可能是值得的。我玩过一些游戏,它们在 Proton 平台运行完美,后来从愤怒的论坛帖子中发现,它在最新版的 Windows 上运行显然充满了致命的错误。总之,似乎来自大型工作室的游戏并不完美,但你可能在 Linux 上遇到相似但不同的问题,正如你在 Windows 上遇到的。
|
||||
|
||||
#### Flatpak
|
||||
|
||||
Linux 近来历史上最令人激动的发展就是 Flatpak 了,它是本地容器和打包的结合,它和游戏无关(或者它和游戏息息相关),它使得 Linux 应用基本上能被分发到任意的 Linux 发行版上。这也适用于游戏,因为在游戏中使用了相当多的前沿技术,而对发行版维护者来说,要跟上任何特定游戏所需的所有最新版本可能是相当苛刻的。
|
||||
|
||||
Flapak 通过为应用程序库抽象出一种通用的 Flatpak 特定的层,而将其从发行版中抽象出来。Flatpak 软件包的发行者知道,如果一个库不在 Flatpak SDK 中,那么它必须要包含在 Flatpak 软件包中,简单而直接。
|
||||
|
||||
多亏了 Flatpak,Steam 客户端可以运行在像 Fedora 这样的常用发行版上,也可以运行在 RHEL、Slackware 等从传统角度看并不面向游戏市场的操作系统上。
|
||||
|
||||
#### Lutris
|
||||
|
||||
如果你并不急于在 Steam 上注册账号,那么可以用我比较偏爱的游戏客户端 Lutris 。表面上看,Lutris 是一个简单的游戏启动器,当你想玩游戏但还没决定玩什么的时候,你可以到这这里找找。有了 Lutris,你可以将系统上的所有游戏添加到你的游戏库,然后从 Lutris 界面启动并立即玩起来。更好的是,Lutris 贡献者(像我一样)会定期发布安装脚本,使你可以轻松安装自己的游戏。这并不是必须的,但它可以是一个很好的捷径,可以绕过一些繁琐的配置。
|
||||
|
||||
Lutris 也可以借助运行器或子系统,来运行那些不能从应用菜单直接启动的游戏。比如你想玩开源的《<ruby>魔兽塔防<rt>Warcraft Tower Defense</rt></ruby>》这样的游戏机游戏,你必须运行模拟器。如果你已经安装过模拟器的话,Lutris 可以帮你处理这一切。除此以外,如果你有一个 GOG.com 游戏账号,Lutris 可以访问它,并可以把游戏导入你的游戏库中。
|
||||
|
||||
没有比这更容易的管理你的游戏的方式了。
|
||||
|
||||
### 去玩游戏吧
|
||||
|
||||
Linux 游戏是一种充实且给人力量的体验。我过去避免玩电脑游戏,因为我不觉得我有太多的选择。似乎昂贵的游戏总是在不断发布,并且不可避免的获得好或者不好的极端体验,然后很快又转向下一个。另一方面,开源游戏把我引入了游戏的圈子。我见到过其他玩家和开发者。我见到过艺术家和音乐家、粉丝以及推广者。我玩过各种各样的我从来不知道的游戏。其中一些甚至不够我玩一下午,而其他的却让我长久的着迷于游戏、修改、关卡设计和乐趣。
|
||||
|
||||
如果你准备好放下爆米花,从各个角度体验下游戏的话,那就在 Linux 上开始游戏吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/2/linux-gaming
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[godgithubf](https://github.com/godgithubf)
|
||||
校对:[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/gaming_grid_penguin.png?itok=7Fv83mHR (Gaming with penguin pawns)
|
||||
[2]: https://opensource.com/alternatives/minecraft
|
||||
[3]: https://itch.io/jam/open-jam-2020
|
||||
[4]: https://opensource.com/article/20/5/open-source-fps-games
|
||||
[5]: https://hyperparticle.itch.io/nodulus
|
||||
[6]: https://www.openttd.org/
|
||||
[7]: https://rcorre.itch.io/jethook
|
||||
[8]: http://sauerbraten.org/
|
||||
[9]: https://opensource.com/article/18/9/open-jam-announcement
|
||||
[10]: https://opensource.com/sites/default/files/game_0.png
|
||||
[11]: http://flathub.org
|
||||
[12]: https://github.com/ValveSoftware/Proton
|
||||
[13]: http://winehq.org
|
||||
[14]: https://opensource.com/business/16/8/flatpak
|
||||
[15]: https://www.redhat.com/en/enterprise-linux-8
|
||||
[16]: http://lutris.net
|
||||
[17]: https://opensource.com/article/18/10/lutris-open-gaming-platform
|
||||
[18]: https://ndswtd.wordpress.com/download
|
@ -3,50 +3,50 @@
|
||||
[#]: author: (Chris Collins https://opensource.com/users/clcollins)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Donkey-Hao)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14731-1.html)
|
||||
|
||||
使用树莓派做一个倒计时闹钟
|
||||
使用树莓派做一个倒计时器
|
||||
======
|
||||
使用树莓派和 ePaper 显示器开始倒计时您的下一个假期。
|
||||
![Alarm clocks with different time][1]
|
||||
|
||||
2021年[ Pi Day ][2]来了又走,留下美好的回忆以及[许多树莓派项目][3]等待我们去尝试。在任何令人精神振奋、充满欢乐的假期后回到工作中都很难, Pi Day 也不例外。当我们回望三月的时候,渴望那些天的快乐。但是不用害怕,亲爱的 Pi Day 庆祝者们,我们开始下一个 Pi Day 的漫长倒计时!
|
||||
> 使用树莓派和电子纸显示屏开始倒计时你的下一个假期。
|
||||
|
||||
好了,严肃点。我做了一个 Pi Day 倒计时器,你也可以!
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/19/145133beh3yp1s3ky6bi5b.jpg)
|
||||
|
||||
不久前,我购买了一个 [树莓派 Zero W][4] 并且用它来 [解决 WiFi 较差的原因][5] 。我也对使用 ePaper 来作为显示器十分感兴趣。而我却没有一个很好的用途,但是那看起来很有趣!我买了一个十分适合放在树莓派的顶部的 2.13 英寸的 [ WaveShare 显示器][6] 。安装很简单:只需要将显示器接到树莓派的 GPIO 上即可。
|
||||
<ruby>[圆周率日][2]<rt>Pi Day</rt></ruby>(3 月 14 日) 来了又走,留下美好的回忆以及 [许多树莓派项目][3] 等待我们去尝试。在任何令人精神振奋、充满欢乐的假期后回到工作中都很难,圆周率日也不例外。当我们回望三月的时候,渴望那些天的快乐。但是不用害怕,亲爱的圆周率日庆祝者们,我们开始下一个节日的漫长倒计时!
|
||||
|
||||
我使用 [树莓派系统][7] 来实现该项目,虽然其他的操作系统肯定也能完成。但是下面的 `raspi-config` 指令在树莓派系统上很容易使用。
|
||||
好了,严肃点。我做了一个圆周率日倒计时器,你也可以!
|
||||
|
||||
### 设置树莓派和 ePaper 显示器
|
||||
不久前,我购买了一个 [树莓派 Zero W][4],并且用它来 [解决 WiFi 信号较差的原因][5] 。我也对使用<ruby>电子纸<rt>ePaper</rt></ruby>来作为它的显示屏十分感兴趣。虽然我不知道该用它来干什么,但是!它看起来真的很有趣!我买了一个十分适合放在树莓派的顶部的 2.13 英寸的 [WaveShare 显示器][6] 。安装很简单:只需要将显示器接到树莓派的 GPIO 上即可。
|
||||
|
||||
设置树莓派和 ePaper 显示器一起工作,需要你在树莓派上启用串行外设接口 (SPI) 软件,安装 BCM2835 C 库(来访问树莓派上的 Broadcom BCM 2835 芯片的 GPIO 函数),安装 Python GPIO 库来控制 ePaper 显示器。最后,你需要安装 WaveShare 的库来使用 Python 控制 2.13 英寸的显示器。
|
||||
我使用 [树莓派操作系统][7] 来实现该项目,虽然其他的操作系统肯定也能完成。但是下面的 `raspi-config` 命令在树莓派系统上很容易使用。
|
||||
|
||||
### 设置树莓派和电子纸显示屏
|
||||
|
||||
设置树莓派和电子纸显示屏一起工作,需要你在树莓派软件中启用串行外设接口(SPI),安装 BCM2835 C 库(来访问树莓派上的博通 BCM 2835 芯片的 GPIO 功能),安装 Python GPIO 库来控制电子纸显示屏。最后,你需要安装 WaveShare 的库来使用 Python 控制这个 2.13 英寸的显示屏。
|
||||
|
||||
下面是完成这些的步骤。
|
||||
|
||||
#### 启用 SPI
|
||||
|
||||
树莓派上启用 SPI 最简单的方式是使用`raspi-config` 命令。SPI 总线允许串行数据通信与设备一起使用——在本例中,ePaper 显示:
|
||||
|
||||
树莓派上启用 SPI 最简单的方式是使用 `raspi-config` 命令。SPI 总线允许与设备进行串行数据通信——在本例中,电子纸显示:
|
||||
|
||||
```
|
||||
`$ sudo raspi-config`
|
||||
$ sudo raspi-config
|
||||
```
|
||||
|
||||
从弹出的菜单中, 选择 **Interfacing Options** -> **SPI** -> **Yes** 来启用 SPI 接口,然后启动。
|
||||
从弹出的菜单中, 选择 “<ruby>接口选项<rt>Interfacing Options</rt> -> SPI -> <ruby>是<rt>Yes</rt></ruby>” 来启用 SPI 接口,然后启动。
|
||||
|
||||
#### 安装 BCM2835 库
|
||||
|
||||
如上所述,BCM2835 库是用在树莓派 Broadcom BCM2385 芯片的软件,它允许访问 GPIO 引脚来控制设备。
|
||||
|
||||
在我写这篇文章之时,用于树莓派的最新 Broadcom BCM2385 库版本是 v1.68 。安装此库需要下载软件压缩包然后使用 `make` 来安装:
|
||||
如上所述,BCM2835 库是用于树莓派博通 BCM2385 芯片的软件,它允许访问 GPIO 引脚来控制设备。
|
||||
|
||||
在我写这篇文章之时,用于树莓派的最新博通 BCM2385 库版本是 v1.68 。安装此库需要下载软件压缩包然后使用 `make` 来安装:
|
||||
|
||||
```
|
||||
# 下载 BCM2853 库并解压
|
||||
$ curl -sSL <http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz> -o - | tar -xzf -
|
||||
$ curl -sSL http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.g> -o - | tar -xzf -
|
||||
|
||||
# 进入解压后的文件夹
|
||||
$ pushd bcm2835-1.68/
|
||||
@ -62,8 +62,7 @@ $ popd
|
||||
|
||||
#### 安装需要的 Python 库
|
||||
|
||||
你用 Python 控制 ePaper 显示器需要安装 Python 库 `RPi.GPIO` ,还需要 `python3-pil` 包画图。显然, PIL 包已经不行了, Pillow 可以作为代替方案。我还没有为该项目测试 Pillow ,但它可行:
|
||||
|
||||
你用 Python 控制电子纸显示屏需要安装 Python 库 `RPi.GPIO`,还需要使用 `python3-pil` 包来画图。显然,PIL 包已经不行了,但 Pillow 可以作为代替方案。我还没有为该项目测试过 Pillow ,但它可行:
|
||||
|
||||
```
|
||||
# 安装需要的 Python 库
|
||||
@ -76,45 +75,42 @@ _注意:这些是 Python3 的指令。你可以在 WaveShare 网站查到 Pyth
|
||||
|
||||
#### 下载 WaveShare 示例和 Python 库
|
||||
|
||||
Waveshare 维护一个 Python 和 C 的 Git 库,用于使用其 ePaper 显示器和一些展示如何使用它们的示例。对这个倒计时时钟而言,你需要克隆这个库并用于 2.13 英寸的显示器:
|
||||
Waveshare 维护了一个 Python 和 C 的 Git 库,用于使用其电子纸显示屏和一些展示如何使用它们的示例。对这个倒计时时钟而言,你需要克隆这个库并使用用于 2.13 英寸显示屏的库:
|
||||
|
||||
```
|
||||
# 克隆这个 WaveShare e-Paper git 库
|
||||
$ git clone <https://github.com/waveshare/e-Paper.git>
|
||||
$ git clone https://github.com/waveshare/e-Paper.gi>
|
||||
```
|
||||
|
||||
如果你用不同的显示器或者其他公司产品,需要使用适配软件。
|
||||
|
||||
Waveshare 提供了很多指导:
|
||||
|
||||
* [WaveShare ePaper 设置指导][9]
|
||||
* [WaveShare ePaper 库安装指导][10]
|
||||
|
||||
|
||||
* [WaveShare 电子纸设置指导][9]
|
||||
* [WaveShare 电子纸库安装指导][10]
|
||||
|
||||
#### 获得有趣的字体(选做)
|
||||
|
||||
你可以随心所欲的使用显示器,为什么不搞点花样?找一个炫酷的字体!
|
||||
|
||||
这有大量 [开放字体许可][11] 的字体可用。我十分喜爱 Bangers 字体。如果你看过 YouTube 那你见过这种字体了,它十分流行。你可以下载到本地的共享字体目录文件中,并且所有的应用都可以使用,包括这个项目:
|
||||
这有大量 [开放字体许可][11] 的字体可供选择。我十分喜爱 Bangers 字体。如果你看过 YouTube 那你见过这种字体了,它十分流行。你可以下载到本地的共享字体目录文件中,并且所有的应用都可以使用,包括这个项目:
|
||||
|
||||
```
|
||||
# “Bangers” 字体是 Vernon Adams 用 Google 字体开放许可授权的字体
|
||||
# “Bangers” 字体是 Vernon Adams 使用 Google 字体开放许可授权的字体
|
||||
$ mkdir -p ~/.local/share/fonts
|
||||
$ curl -sSL <https://github.com/google/fonts/raw/master/ofl/bangers/Bangers-Regular.ttf> -o fonts/Bangers-Regular.ttf
|
||||
$ curl -sSL https://github.com/google/fonts/raw/master/ofl/bangers/Bangers-Regular.ttf -o fonts/Bangers-Regular.ttf
|
||||
```
|
||||
|
||||
### 创建一个 Pi Day 倒计时器
|
||||
### 创建一个圆周率日倒计时器
|
||||
|
||||
现在你已经安装好了软件,可以使用带有炫酷字体的 ePaper 显示器了。你可以创建一个有趣的项目:倒计时到下一个 Pi Day !
|
||||
现在你已经安装好了软件,可以使用带有炫酷字体的电子纸显示屏了。你可以创建一个有趣的项目:倒计时到下一个圆周率日!
|
||||
|
||||
如果你想,你可以从该项目的 [GitHub repo][13] 直接下载 [countdown.py][12] 这个 Python 文件并跳到文章结尾。
|
||||
如果你想,你可以从该项目的 [GitHub 仓库][13] 直接下载 [countdown.py][12] 这个 Python 文件并跳到文章结尾。
|
||||
|
||||
为了满足大家的好奇心,我将逐步讲解。
|
||||
|
||||
#### 导入一些库
|
||||
|
||||
|
||||
```
|
||||
#!/usr/bin/python3
|
||||
# -*- coding:utf-8 -*-
|
||||
@ -134,11 +130,11 @@ waveshare_base = basedir.joinpath('e-Paper', 'RaspberryPi_JetsonNano', 'python')
|
||||
libdir = waveshare_base.joinpath('lib')
|
||||
```
|
||||
|
||||
开始先导入一些标准库之后脚本中用。也需要你添加一些 PIL 的包: `Image`, `ImageDraw` ,和 `ImageFont` ,你会 用到这些包来画一些简单的图形。最后,为包含用于 2.13 英寸显示器的 Waveshare Python 库的本地 `lib` 目录设置一些变量,稍后你可以使用这些变量从本地目录加载库。
|
||||
开始先导入一些标准库之后脚本中用。也需要你从 PIL 添加 `Image`、`ImageDraw` 和 `ImageFont`,你会用到这些来画一些简单的图形。最后,为本地 `lib` 目录设置一些变量,该目录包含了用于 2.13 英寸显示屏的 Waveshare Python 库,稍后你可以使用这些变量从本地目录加载库。
|
||||
|
||||
#### 字体大小辅助函数
|
||||
|
||||
下一部分是为你选择的字体建立一个修改大小的辅助函数: Bangers-Regular.ttf 。该函数将整型变量作为大小参数并返回一个图形字体对象来用于显示:
|
||||
下一部分是为你选择的 Bangers-Regular.ttf 字体建立一个修改大小的辅助函数。该函数将整型变量作为大小参数,并返回一个图形字体对象来用于显示:
|
||||
|
||||
```
|
||||
def set_font_size(font_size):
|
||||
@ -148,15 +144,14 @@ def set_font_size(font_size):
|
||||
|
||||
#### 倒计时逻辑
|
||||
|
||||
接下来是计算这个项目的一个函数:距下次 Pi Day 还有多久。如果 Pi Day 在一月,那么计算剩余天数将很简单。但是你需要考虑是否今年的 Pi Day 这一天已经过去了。如果是这样的话,那么计算量将会很大:
|
||||
|
||||
接下来是计算这个项目的一个函数:距下次圆周率日还有多久。如果是在一月,那么计算剩余天数将很简单。但是你需要考虑是否今年的圆周率日是否已经过去了(允悲)。如果是的话,那么计算在你可以再次庆祝之前还有多少天:
|
||||
|
||||
```
|
||||
def countdown(now):
|
||||
piday = datetime(now.year, 3, 14)
|
||||
|
||||
# 如果错过了就增加一年
|
||||
if piday < now:
|
||||
if piday < now:
|
||||
piday = datetime((now.year + 1), 3, 14)
|
||||
|
||||
days = (piday - now).days
|
||||
@ -167,8 +162,7 @@ def countdown(now):
|
||||
|
||||
#### 主函数
|
||||
|
||||
最后,到了主函数,需要初始化显示器并向它写数据。这时,你应该写一个欢迎语然后再开始倒计时。但是首先,你需要加载 Waveshare 库:
|
||||
|
||||
最后,到了主函数,需要初始化显示屏并向它写数据。这时,你应该写一个欢迎语然后再开始倒计时。但是首先,你需要加载 Waveshare 库:
|
||||
|
||||
```
|
||||
def main():
|
||||
@ -181,9 +175,9 @@ def main():
|
||||
sys.exit(1)
|
||||
```
|
||||
|
||||
上面的代码片段检查以确保该库已下载到倒计时脚本旁边的目录中,然后加载“epd2in13_V2”库。 如果你使用不同的显示器,则需要使用不同的库。 如果你愿意,也可以自己编写。我发现阅读 Waveshare 随显示器提供的 Python 代码很有趣,它比我想象的要简单得多。
|
||||
上面的代码片段检查以确保该库已下载到倒计时脚本旁边的目录中,然后加载`epd2in13_V2` 库。如果你使用不同的显示屏,则需要使用不同的库。如果你愿意,也可以自己编写。我发现阅读 Waveshare 随显示屏提供的 Python 代码很有趣,它比我想象的要简单得多。
|
||||
|
||||
下一段代码创建一个 EPD( ePaper 显示器)对象以与显示器交互并初始化硬件:
|
||||
下一段代码创建一个 EPD(电子纸显示屏)对象以与显示器交互并初始化硬件:
|
||||
|
||||
```
|
||||
logging.info("Starting...")
|
||||
@ -198,11 +192,10 @@ def main():
|
||||
epd.Clear(0xFF)
|
||||
```
|
||||
|
||||
关于 ePaper 的一个有趣之处:它仅在将像素从白色变为黑色或从黑色变为白色时才使用电源。这意味着当设备断电或应用程序因任何原因停止时,屏幕上的任何内容都会保留下来。从功耗的角度来看,这很好,但这也意味着您需要在启动时清除显示,否则您的脚本只会覆盖屏幕上已有的内容。 因此,`epd.Clear(0xFF)` 用于在脚本启动时清除显示。
|
||||
关于电子纸的一个有趣之处:它仅在将像素从白色变为黑色或从黑色变为白色时才耗电。这意味着当设备断电或应用程序因任何原因停止时,屏幕上的任何内容都会保留下来。从功耗的角度来看,这很好,但这也意味着你需要在启动时清除显示,否则你的脚本只会覆盖屏幕上已有的内容。 因此,`epd.Clear(0xFF)` 用于在脚本启动时清除显示。
|
||||
|
||||
接下来,创建一个“画布”来绘制剩余的显示输出:
|
||||
|
||||
|
||||
```
|
||||
# 创建一个图形对象
|
||||
# 注意:"epd.heigh" 是屏幕的长边
|
||||
@ -217,15 +210,12 @@ def main():
|
||||
|
||||
#### 欢迎语
|
||||
|
||||
接下来,你将开始画一些画。这涉及在你之前创建的“画布”对象上设置数据。这还没有将它绘制到 ePaper 显示器上——你现在只是在构建你想要的图像。由你为这个项目绘制带有一块馅饼的图像,来创建一个庆祝 Pi Day 的欢迎信息:
|
||||
接下来,你将开始画一些画。这涉及在你之前创建的“画布”对象上设置数据。这还没有将它绘制到电子纸显示屏上——你现在只是在构建你想要的图像。由你为这个项目绘制带有一块馅饼的图像,来创建一个庆祝圆周率日的欢迎信息:
|
||||
|
||||
![画一块馅饼][14]
|
||||
|
||||
(Chris Collins, [CC BY-SA 4.0][15])
|
||||
|
||||
很可爱,不是吗?
|
||||
|
||||
|
||||
```
|
||||
logging.info("Set text text...")
|
||||
bangers64 = set_font_size(64)
|
||||
@ -235,20 +225,20 @@ def main():
|
||||
bmp = Image.open(basedir.joinpath("img", "pie.bmp"))
|
||||
image.paste(bmp, (150,2))
|
||||
```
|
||||
最后,_最后_,你可以展示你画的图画:
|
||||
最后,_真是是最后了_,你可以展示你画的图画:
|
||||
|
||||
```
|
||||
logging.info("Display text and BMP")
|
||||
epd.display(epd.getbuffer(image))
|
||||
```
|
||||
|
||||
That bit above updates the display to show the image you drew.
|
||||
上面那段话更新了显示屏,以显示你所画的图像。
|
||||
|
||||
接下来,准备另一幅图像展示你的倒计时:
|
||||
|
||||
#### Pi Day 倒计时
|
||||
首先,创建一个用来展示倒计时的项目。也需要设置数字的字体大小:
|
||||
#### 圆周率日倒计时
|
||||
|
||||
首先,创建一个用来展示倒计时的图像对象。也需要设置数字的字体大小:
|
||||
|
||||
```
|
||||
logging.info("Pi Date countdown; press CTRL-C to exit")
|
||||
@ -262,15 +252,13 @@ That bit above updates the display to show the image you drew.
|
||||
|
||||
为了使它显示的时候更像一个倒计时,更新图像的一部分是更加有效的手段,仅更改已经改变的显示数据部分。下面的代码准备以这样方式运行:
|
||||
|
||||
|
||||
```
|
||||
# 准备更新显示
|
||||
epd.displayPartBaseImage(epd.getbuffer(piday_image))
|
||||
epd.init(epd.PART_UPDATE)
|
||||
```
|
||||
|
||||
最后,需要计时,开始一个无限循环来检查据下次 Pi Day 还有多久并显示在 ePaper上。如果到了 Pi Day ,你可以输出一些庆祝短语:
|
||||
|
||||
最后,需要计时,开始一个无限循环来检查据下次圆周率日还有多久,并显示在电子纸上。如果到了圆周率日,你可以输出一些庆祝短语:
|
||||
|
||||
```
|
||||
while (True):
|
||||
@ -295,7 +283,7 @@ That bit above updates the display to show the image you drew.
|
||||
time.sleep(5)
|
||||
```
|
||||
|
||||
脚本最后做了一些错误处理,包括捕获键盘中断,这样你可以使用 **Ctrl**+**C** 来结束无限循环,以及一个根据计数来打印 'day' 或 'days' 的函数:
|
||||
脚本最后做了一些错误处理,包括捕获键盘中断,这样你可以使用 `Ctrl + C` 来结束无限循环,以及一个根据计数来打印 `day` 或 `days` 的函数:
|
||||
|
||||
```
|
||||
except IOError as e:
|
||||
@ -319,19 +307,16 @@ if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
现在你已经拥有一个倒计时脚本并显示剩余天数!这是在我的树莓派上的显示(视频经过加速,我没有足够的磁盘空间来保存一整天的视频):
|
||||
现在你已经拥有一个倒计时并显示剩余天数的脚本!这是在我的树莓派上的显示(视频经过加速,我没有足够的磁盘空间来保存一整天的视频):
|
||||
|
||||
![Pi Day Countdown Timer In Action][16]
|
||||
|
||||
(Chris Collins, [CC BY-SA 4.0][15])
|
||||
|
||||
#### 安装 systemd 服务(选做)
|
||||
|
||||
如果你希望在系统打开时运行倒计时显示并且无需登录并运行脚本,您可以将可选的 systemd 单元安装为 [systemd 用户服务][17].
|
||||
如果你希望在系统打开时运行倒计时显示,并且无需登录并运行脚本,你可以将可选的 systemd 单元安装为 [systemd 用户服务][17]。
|
||||
|
||||
将 GitHub 上的 [piday.service][18] 文件复制到 `${HOME}/.config/systemd/user`,如果该目录不存在,请先创建该目录。然后你可以启用该服务并启动它:
|
||||
|
||||
|
||||
```
|
||||
$ mkdir -p ~/.config/systemd/user
|
||||
$ cp piday.service ~/.config/systemd/user
|
||||
@ -345,11 +330,11 @@ $ loginctl enable-linger $USER
|
||||
|
||||
该脚本将输出到 systemd 日志,可以使用 `journalctl` 命令查看输出。
|
||||
|
||||
### 它开始看起来很像 Pi Day !
|
||||
### 它开始看起来像是圆周率日了!
|
||||
|
||||
现在你拥有了一个树莓派 Zero W 显示在 ePaper显示器上的 Pi Day 倒计时器!并在系统启动时使用 systemd 单元文件启动!现在只有 350 天左右我们才可以再次相聚庆祝奇妙的设备———树莓派。通过我们的小项目,我们可以一目了然地看到确切的天数。
|
||||
这就是你的作品!一个显示在电子纸显示屏上的树莓派 Zero W 圆周率日倒计时器!并在系统启动时使用 systemd 单元文件启动!现在距离我们可以再次相聚庆祝圆周率日还有好多天的奇妙设备———树莓派。通过我们的小项目,我们可以一目了然地看到确切的天数。
|
||||
|
||||
但事实上,任何人都可以全年都在心中举行 Pi Day,因此请享受使用自己的树莓派创建一些有趣且具有教育意义的项目吧!
|
||||
但实际上,每个人都可以在每一天在心中庆祝圆周率日,因此请使用自己的树莓派创建一些有趣且具有教育意义的项目吧!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -358,7 +343,7 @@ via: https://opensource.com/article/21/3/raspberry-pi-countdown-clock
|
||||
作者:[Chris Collins][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Donkey](https://github.com/Donkey-Hao)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,23 +3,22 @@
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14751-1.html"
|
||||
|
||||
一起来学习 Lisp 编程语言吧!
|
||||
======
|
||||
许多大型代码库中都有 Lisp 代码的身影,因此,熟悉一下这门语言是一个明智之举。
|
||||
|
||||
![科技和计算领域的女性][1]
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/24/124147v0loy4e3y0hneih8.jpg)
|
||||
|
||||
图源:kris krüg
|
||||
> 许多大型代码库中都有 Lisp 代码的身影,因此,熟悉一下这门语言是一个明智之举。
|
||||
|
||||
Lisp 在 1958 年就被发明出来了,它是世界上第二老的计算机编程语言(LCTT 译注:最老的是 Fortran,诞生于 1957 年)。它有许多现代的衍生品,包括 Common Lisp、Emacs Lisp(Elisp)、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。
|
||||
早在 1958 年,Lisp 就被发明出来了,它是世界上第二古老的计算机编程语言(LCTT 译注:最古老的编程语言是 Fortran,诞生于 1957 年)。它有许多现代的衍生品,包括 Common Lisp、Emacs Lisp(Elisp)、Clojure、Racket、Scheme、Fennel 和 GNU Guile 等。
|
||||
|
||||
那些喜欢思考编程语言设计的人,往往都喜欢 Lisp,因为它的语法和数据有者相同的结构:Lisp 代码实际上是<ruby>一个列表的列表<rt>a list of lists</rt></ruby>,它的名字其实是 <ruby>“列表处理”<rt>LISt Processing</rt></ruby> 的首字母缩写。那些喜欢思考编程语言美学的人,往往都讨厌 Lisp,因为它经常使用括号来定义范围;事实上,编程界也有一个广为流传的笑话:Lisp 代表的其实是 <ruby>“大量烦人的多余括号”<rt>Lots of Irritating Superfluous Parentheses</rt></ruby>。
|
||||
那些喜欢思考编程语言的设计的人,往往都喜欢 Lisp,因为它的语法和数据有着相同的结构:Lisp 代码实际上是<ruby>一个列表的列表<rt>a list of lists</rt></ruby>,它的名字其实是 “<ruby>列表处理<rt>LISt Processing</rt></ruby>” 的简写。而那些喜欢思考编程语言的美学的人,往往都讨厌 Lisp,因为它经常使用括号来定义范围;事实上,编程界也有一个广为流传的笑话:Lisp 代表的其实是 <ruby>“大量烦人的多余括号”<rt>Lots of Irritating Superfluous Parentheses</rt></ruby>。
|
||||
|
||||
不管你是喜欢还是讨厌 Lisp 的设计哲学,你都不得不承认,它都是一门有趣的语言,过去如此,现在亦然(这得归功于现代方言 Clojure 和 Guile)。你可能会感到惊讶,但事实就是,Lisp 在任何行业的大型代码库中都占有一席之地。因此,现在开始学习 Lisp,至少熟悉一下它,不失为一个好主意。
|
||||
不管你是喜欢还是讨厌 Lisp 的设计哲学,你都不得不承认,它都是一门有趣的语言,过去如此,现在亦然(这得归功于现代方言 Clojure 和 Guile)。你可能会惊讶于在任何特定行业的大代码库中潜伏着多少 Lisp 代码,因此,现在开始学习 Lisp,至少熟悉一下它,不失为一个好主意。
|
||||
|
||||
### 安装 Lisp
|
||||
|
||||
@ -55,7 +54,7 @@ $ brew install clisp
|
||||
|
||||
### 列表处理
|
||||
|
||||
Lisp 源代码的基本单元是 <ruby>“表达式”<rt>expression</rt></ruby>,它在形式上是一个列表。举个例子,下面就是一个列表,它由一个操作符(`+`)和两个整数(`1` 和 `2`)组成的:
|
||||
Lisp 源代码的基本单元是 “<ruby>表达式<rt>expression</rt></ruby>”,它在形式上是一个列表。举个例子,下面就是一个列表,它由一个操作符(`+`)和两个整数(`1` 和 `2`)组成:
|
||||
|
||||
```
|
||||
(+ 1 2)
|
||||
@ -85,7 +84,7 @@ $ clisp
|
||||
|
||||
### 函数
|
||||
|
||||
在了解了 Lisp 表达式的基本结构后,你可以使用函数来做更多有用的事。譬如,`print` 函数可以接受任意数量的参数,然后把它们都显示在你的终端上,`pprint` 函数还可以实现格式化打印。还有更多不同的打印函数,不过,`pprint` 在 REPL 中的效果还挺好的:
|
||||
在了解了 Lisp 表达式的基本结构后,你可以使用函数来做更多有用的事。譬如,`print` 函数可以接受任意数量的参数,然后把它们都显示在你的终端上,`pprint` 函数还可以实现格式化打印。还有更多不同的打印函数,不过,`pprint` 在 REPL 中的效果就挺好的:
|
||||
|
||||
```
|
||||
[1]> (pprint "hello world")
|
||||
@ -121,7 +120,7 @@ MYPRINTER
|
||||
[3]>
|
||||
```
|
||||
|
||||
你可以往表达式里嵌套表达式(就像使用某种管道一样)。举个例子,你可以先使用 `string-upcase` 函数,把某个字符串的所有字符转换成大写,然后再使用 `pprint` 函数,将它的内容格式化打印到终端上:
|
||||
你可以在表达式里嵌套表达式(就像使用某种管道一样)。举个例子,你可以先使用 `string-upcase` 函数,把某个字符串的所有字符转换成大写,然后再使用 `pprint` 函数,将它的内容格式化打印到终端上:
|
||||
|
||||
```
|
||||
[3]> (pprint (string-upcase foo))
|
||||
@ -142,7 +141,6 @@ Lisp 是动态类型语言,这意味着,你在给变量赋值时不需要声
|
||||
|
||||
如果你想让整数被当作字符串来处理,你可以给它加上引号:
|
||||
|
||||
|
||||
```
|
||||
[4]> (setf foo "2")
|
||||
"2"
|
||||
@ -215,7 +213,7 @@ $
|
||||
|
||||
### 编写脚本
|
||||
|
||||
Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你刚开始学习的时候,后者很可能是最容易的选项,特别是当你已经熟悉 Python 或 [Shell 脚本][9] 时。
|
||||
Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你刚开始学习的时候,后者很可能是最容易的方式,特别是当你已经熟悉 Python 或 [Shell 脚本][9] 时。
|
||||
|
||||
下面是一个用 Common Lisp 编写的简单的“掷骰子”脚本:
|
||||
|
||||
@ -231,7 +229,7 @@ Lisp 可以被编译,也可以作为解释型的脚本语言来使用。在你
|
||||
(roller userput)
|
||||
```
|
||||
|
||||
脚本的第一行注释告诉了你的 POSIX 终端,该使用什么可执行文件来运行这个脚本。
|
||||
脚本的第一行注释(LCTT 译注:称之为“<ruby>释伴<rt>shebang</rt></ruby>”)告诉了你的 POSIX 终端,该使用什么可执行文件来运行这个脚本。
|
||||
|
||||
`roller` 函数使用 `defun` 函数创建,它在内部使用 `random` 函数来打印一个伪随机数,这个伪随机数严格小于 `num` 列表中下标为 0 的元素。在脚本中,这个 `num` 列表还没有被创建,不过没关系,因为只有当脚本被调用时,函数才会执行。
|
||||
|
||||
@ -278,7 +276,7 @@ via: https://opensource.com/article/21/5/learn-lisp
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,72 @@
|
||||
[#]: subject: (Get started with Kubernetes using chaos engineering)
|
||||
[#]: via: (https://opensource.com/article/21/5/kubernetes-chaos)
|
||||
[#]: author: (Jessica Cherry https://opensource.com/users/cherrybomb)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Donkey-Hao)
|
||||
[#]: reviewer: (turbokernel, wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14743-1.html)
|
||||
|
||||
在 Kubernetes 中使用混沌工程
|
||||
======
|
||||
|
||||
> 在这篇文章中学习混沌工程的基础知识。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/22/110901xbb88ccb8lfcgcrl.jpg)
|
||||
|
||||
混沌工程是由科学、规划以及实验组成的。它是一门在系统上进行实验的学科,用来建立系统在生产中承受混乱条件能力的信心。
|
||||
|
||||
首先,我会在文章导论部分解释混沌系统如何工作。
|
||||
|
||||
### 如何开始学习混沌系统呢?
|
||||
|
||||
以我的经验,开始学习混沌系统的最好方式是触发一个此前生产中出现的事故来进行实验。使用过去的数据,制定一个计划,以相同的方式破坏你的系统,然后建立修复策略,并确认结果满足你预期。如果计划失败,你就有了一种新的实验方式,并朝着快速处理问题的新方式前进。
|
||||
|
||||
最重要的是,你可以随时记录所有内容,这意味着,随着时间的推移,整个系统将被完整记录下来,任何人都可以值守而无需太多加码,每个人都可以在周末好好休息。
|
||||
|
||||
### 你要在混沌工程中做什么?
|
||||
|
||||
混沌系统实验运行背后有一些科学依据。我记录了其中一些步骤:
|
||||
|
||||
1. **定义一个稳定状态:** 使用监控工具来搜集当系统没有问题或事故时,看起来功能正常的数据。
|
||||
2. **提出假设或使用先前的事故:** 现在你已经定义了一个稳定状态,请提出一个关于在事故或中断期间会发生(或发生过)的情况的假设。用这个假设来得出一系列将会发生的事故,以及如何解决问题的理论。然后你可以制定一个故意引发该问题的计划。
|
||||
3. **引发问题:** 用这个计划来破坏系统,并开始在真实环境中测试。收集破坏时的指标状态,按计划修复,并追踪提出解决方案所需时长。确保你把所有的东西都记录下来,以备将来发生故障时使用。
|
||||
4. **试图推翻你的假设:** 实验中最精彩的部分是尝试推翻你的思考或计划。你要创建一个不同的状态,看看你能走多远,并在系统中生成一个不同的稳定状态。
|
||||
|
||||
确保在你在另一个系统中生成的破坏因素前,建立一个处于稳定状态的控制系统。这将使你更容易在实验前、期间和之后发现各种稳定状态的差异。
|
||||
|
||||
### 混沌工程需要什么?
|
||||
|
||||
这有一些初学混沌工程很好的工具:
|
||||
|
||||
* 良好的文档编制方法
|
||||
* 一个捕捉你系统是否处于稳定状态的监控系统
|
||||
* Grafana
|
||||
* Prometheus
|
||||
* 混沌工程工具:
|
||||
* Chaos mesh
|
||||
* Litmus
|
||||
* 之后的文章我会介绍更多
|
||||
* 一个假设
|
||||
* 一个计划
|
||||
|
||||
### 去搞破坏吧
|
||||
|
||||
现在你已经掌握了基础,是时候去安全的摧毁你的系统了。我计划每年制造四次混乱,然后努力实现每月一次的破坏。
|
||||
|
||||
混沌工程是一种很好的实践,也是推进你的内部文档保持最新的好方法。此外,随着时间的推移,新升级或应用程序部署将更加顺畅,你的日常生活管理将通过 Kubernetes 变得更加轻松。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/5/kubernetes-chaos
|
||||
|
||||
作者:[Jessica Cherry][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Donkey](https://github.com/Donkey-Hao)
|
||||
校对:[turbokernel](https://github.com/turbokernel), [wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/cherrybomb
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brett-jordan-chaos-unsplash.jpg?itok=sApp5dVd (Scrabble letters spell out chaos for chaos engineering)
|
@ -0,0 +1,186 @@
|
||||
[#]: subject: (9 reasons I love to use the Qt Creator IDE)
|
||||
[#]: via: (https://opensource.com/article/21/6/qtcreator)
|
||||
[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hadisi1993)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14767-1.html)
|
||||
|
||||
我爱用 Qt Creator IDE 的九个原因
|
||||
======
|
||||
|
||||
> Qt Creator 就是丰富的 Qt 库和程序员之间的粘合剂。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/27/192023otvmu77tl808lltl.jpg)
|
||||
|
||||
Qt Creator 是 Qt 框架的默认集成开发环境(IDE),同时也是丰富的 Qt 库和用户之前的粘合剂。除了如智能代码补全、调试、项目管理等基础功能外,Qt Creator 还提供了很多让软件开发变得更简单的特性。
|
||||
|
||||
在这篇文章中,我会重点介绍一些我最喜欢的 [Qt Creator][2] 特性。
|
||||
|
||||
### 深色模式
|
||||
|
||||
当我使用一个新的应用时,我的第一个问题是:_它有深色模式吗?_ Qt Creator 的回答是:_你更喜欢哪一种深色模式呢?_
|
||||
|
||||
你可以在“<ruby>选项<rt>Options</rt></ruby>”菜单中激活深色模式。在顶部的菜单栏中,点击“<ruby>工具<rt>Tools</rt></ruby>”,选择“<ruby>选项<rt>Options</rt></ruby>”,然后转到“<ruby>环境<rt>Environment</rt></ruby>”部分。下面是你能选择的常用外观:
|
||||
|
||||
![QT Creator 深色模式][3]
|
||||
|
||||
### 定制外观
|
||||
|
||||
像每一个 Qt 应用一样,借助样式表,Qt Creator 的外观是高度可定制化的。下面,你可以按照我的做法给 Qt Creator一个想要的外观。
|
||||
|
||||
将下面这些内容写入 `mycustomstylesheet.css` 文件中:
|
||||
|
||||
```
|
||||
QMenuBar { background-color: olive }
|
||||
QMenuBar::item { background-color: olive }
|
||||
QMenu { background-color : beige; color : black }
|
||||
QLabel { color: green }
|
||||
```
|
||||
|
||||
然后使用命令行开启 Qt Creator,将样式表作为参数传入:
|
||||
|
||||
```
|
||||
qtcreator -stylesheet=mycustomstylesheet.css
|
||||
```
|
||||
|
||||
IDE 现在看上去应该会变成这样:
|
||||
|
||||
![QT Creator 定制样式表][5]
|
||||
|
||||
在这份 [文档][6] 中可以查阅更多的样式表。
|
||||
|
||||
### 命令行参数
|
||||
|
||||
Qt Creator 可接受很多命令行选项。例如,如果想在启动时自动加载当前项目,那么你可以将它的路径传入:
|
||||
|
||||
```
|
||||
qtcreator ~/MyProject/MyQtProject.pro
|
||||
```
|
||||
|
||||
你甚至可以将默认应该打开的文件和行数作为参数传递。下面这个命令打开 `main.cpp` 20 行处:
|
||||
|
||||
```
|
||||
qtcreator ~/MyProject/main.cpp:20
|
||||
```
|
||||
|
||||
在这份 [文档][7] 中可以查阅更多 Qt 特有的命令行选项。
|
||||
|
||||
|
||||
Qt Creator 和一般的 Qt 应用无二,所以,除了自己的命令行参数以外,它也接收 [QApplication][8] 和 [QGuiApplication][9] 的一般参数。
|
||||
|
||||
### 交叉编译
|
||||
|
||||
Qt Creator 允许你定义一些被称为“<ruby>配套<rt>Kit</rt></ruby>”的工具链。 “配套” 定义了构建和运行应用所需要的二进制库和 SDK。
|
||||
|
||||
![QT Creator kits][10]
|
||||
|
||||
这使得你通过两次点击,就在完全不同的工具链之间切换。
|
||||
|
||||
![在 Qt Creator 中切换配套][11]
|
||||
|
||||
在这份 [手册][12] 中可以查阅更多关于配套的内容。
|
||||
|
||||
### 分析工具
|
||||
|
||||
Qt Creator 集成了一些最流行的性能分析工具,例如:
|
||||
|
||||
* [Linux 性能分析器][13](需要特定的内核)
|
||||
* [Valgrind][14] 内存分析器
|
||||
* [Clang-Tidy 和 Clazy][15],一种检查 C/C++ 的 <ruby>静态分析器<rt>Linter</rt></ruby>
|
||||
|
||||
![Qt Creator 分析工具][16]
|
||||
|
||||
### 调试器
|
||||
|
||||
在调试方面,Qt Creator 为 GNU Debugger(GDB)配备了一个很好的界面。我喜欢它检查容器类型和创建条件断点的方式,很简单。
|
||||
|
||||
![Qt Creator 调试器][17]
|
||||
|
||||
### FakeVim
|
||||
|
||||
如果你喜欢 Vim,你可以在设置中开启 FakeVim,来像 Vim 一样控制 Qt Creator。点击“<ruby>工具<rt>Tools</rt></ruby>”,选择“<ruby>选项<rt>Options</rt></ruby>”。在 “FakeVim” 选项中,你可以找到许多开关来定制 FakeVim。除了编辑器的功能外,你可以将自己设置的功能和命令关联起来,定制 Vim 命令。
|
||||
|
||||
举个例子,你可以将“<ruby>构建项目<rt>Build Project</rt></ruby>”的功能和 `build` 命令关联到一起:
|
||||
|
||||
![Qt Creator中的FakeVim][18]
|
||||
|
||||
回到编辑器中,当你按下冒号(`:`)并输入 `build`,Qt Creator 利用配置的工具链,开始进行构建:
|
||||
|
||||
![Qt Creator中的FakeVim][19]
|
||||
|
||||
你可以在这份 [文档][20] 中找到 FakeVim 的更多信息。
|
||||
|
||||
### 类检测器
|
||||
|
||||
当使用 C++ 开发时,点击 Qt Creator 右下角的按钮可打开右边的窗口。然后在窗口顶部拉下的菜单中选择“<ruby>大纲<rt>Outline</rt></ruby>”。如果你在左侧窗体中有头文件打开,你可以很好地纵览定义的类和类型。如果你切换到源文件中(`*.cpp`),右侧窗体会列出所有定义的方法,双击其中一个,你可以跳转到这个方法:
|
||||
|
||||
![Qt Creator 中的类列表][21]
|
||||
|
||||
### 项目配置
|
||||
|
||||
Qt Creator 的项目建立在项目目录里的 `*.pro-file` 之上。你可以为你的项目在 `*.pro-file` 中添加定制的配置。我向 `*.pro-file` 中添加了 `my_special_config`,它向编译器的定义添加 `MY_SPECIAL_CONFIG`。
|
||||
|
||||
```
|
||||
QT -= gui
|
||||
|
||||
CONFIG += c++11 console
|
||||
CONFIG -= app_bundle
|
||||
|
||||
CONFIG += my_special_config
|
||||
|
||||
my_special_config {
|
||||
DEFINES += MY_SPECIAL_CONFIG
|
||||
}
|
||||
```
|
||||
|
||||
Qt Creator 自动根据当前配置设置代码高亮:
|
||||
|
||||
![Qt Creator 的特殊配置][22]
|
||||
|
||||
`*.pro-file` 使用 [qmake 语言][23] 进行编写。
|
||||
|
||||
### 总结
|
||||
|
||||
这些特性仅仅是 Qt Creators 所提供的特性的冰山一角。初学者们应该不会感到被其众多的功能所淹没,Qt Creator 是一款对初学者很友好的 IDE。它甚至可能是入门 C++ 开发最简单的方式。如果要获得 QT Creator 特性的全面概述,请参考它的 [官方文档][24]。
|
||||
|
||||
*(插图来自 Stephan Avenwedde, [CC BY-SA 4.0][4])*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/qtcreator
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hadisi1993](https://github.com/hadisi1993)
|
||||
校对:[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/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating)
|
||||
[2]: https://www.qt.io/product/development-tools
|
||||
[3]: https://opensource.com/sites/default/files/uploads/qt_creator_dark_mode.png ( QT Creator dark mode)
|
||||
[4]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[5]: https://opensource.com/sites/default/files/uploads/qt_creator_custom_stylesheet2.png (QT Creator custom stylesheet)
|
||||
[6]: https://doc.qt.io/qt-5/stylesheet-reference.html
|
||||
[7]: https://doc.qt.io/qtcreator/creator-cli.html
|
||||
[8]: https://doc.qt.io/qt-5/qapplication.html#QApplication
|
||||
[9]: https://doc.qt.io/qt-5/qguiapplication.html#supported-command-line-options
|
||||
[10]: https://opensource.com/sites/default/files/uploads/qt_creator_cross_compiling.png (QT Creator kits)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/qt_creator_select_kits.png (Switching between Kits in Qt Creator)
|
||||
[12]: https://doc.qt.io/qtcreator/creator-targets.html
|
||||
[13]: https://doc.qt.io/qtcreator/creator-cpu-usage-analyzer.html
|
||||
[14]: https://doc.qt.io/qtcreator/creator-valgrind-overview.html
|
||||
[15]: https://doc.qt.io/qtcreator/creator-clang-tools.html
|
||||
[16]: https://opensource.com/sites/default/files/uploads/qt_creator_analyzer.png (Qt Creator analyzer)
|
||||
[17]: https://opensource.com/sites/default/files/uploads/qt_creator_debugger2.png (Qt Creator debugger)
|
||||
[18]: https://opensource.com/sites/default/files/uploads/qt_creator_fakevim_ex_commands.png (FakeVim in Qt Creator)
|
||||
[19]: https://opensource.com/sites/default/files/uploads/qt_creator_fakevim_build_commands.png (FakeVim in Qt Creator)
|
||||
[20]: https://doc.qt.io/qtcreator/creator-editor-fakevim.html
|
||||
[21]: https://opensource.com/sites/default/files/uploads/qtcreator_class_overview.png (List of classes in Qt Creator)
|
||||
[22]: https://opensource.com/sites/default/files/uploads/qtcreater_special_config.png (Special configuration in Qt Creator)
|
||||
[23]: https://doc.qt.io/qt-5/qmake-language.html
|
||||
[24]: https://doc.qt.io/qtcreator/
|
@ -3,17 +3,16 @@
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14740-1.html"
|
||||
|
||||
编写你的第一段 JavaScript 代码
|
||||
======
|
||||
JavaScript 是为 Web 而生的,但它可以做的事远不止于此。本文将带领你了解它的基础知识,然后你可以下载我们的备忘清单,以便随时掌握详细信息。
|
||||
|
||||
![开源编程][1]
|
||||
> JavaScript 是为 Web 而生的,但它可以做的事远不止于此。本文将带领你了解它的基础知识,然后你可以下载我们的备忘清单,以便随时掌握详细信息。
|
||||
|
||||
图源:Opensource.com
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/21/114718zzb8f6na6lgb28cn.jpg)
|
||||
|
||||
JavaScript 是一种充满惊喜的编程语言。许多人第一次遇到 JavaScript 时,它通常是作为一种 Web 语言出现的。所有主流浏览器都有一个 JavaScript 引擎;并且,还有一些流行的框架,如 JQuery、Cash 和 Bootstrap 等,它们可以帮助简化网页设计;甚至还有用 JavaScript 编写的编程环境。它似乎在互联网上无处不在,但事实证明,它对于 [Electron][2] 等项目来说也是一种有用的语言。Electron 是一个构建跨平台桌面应用程序的开源工具包,它使用的语言就是 JavaScript。
|
||||
|
||||
@ -21,11 +20,11 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
|
||||
|
||||
### 安装 JavaScript
|
||||
|
||||
随着你的 JavaScript 水平不断提高,你可能会发现自己需要高级的 JavaScript 库和运行时。不过,刚开始学习的时候,你是根本不需要安装 JavaScript 的。因为所有主流的 Web 浏览器都包含一个 JavaScript 引擎来运行代码。你可以使用自己喜欢的文本编辑器编写 JavaScript,将其加载到 Web 浏览器中,接着你就能看到代码的作用。
|
||||
随着你的 JavaScript 水平不断提高,你可能会发现自己需要高级的 JavaScript 库和运行时环境。不过,刚开始学习的时候,你是根本不需要安装 JavaScript 环境的。因为所有主流的 Web 浏览器都包含一个 JavaScript 引擎来运行代码。你可以使用自己喜欢的文本编辑器编写 JavaScript,将其加载到 Web 浏览器中,接着你就能看到代码的作用。
|
||||
|
||||
### 上手 JavaScript
|
||||
|
||||
要编写你的第一个 JavaScript 代码,请打开你喜欢的文本编辑器,例如 [Notepad++][3]、[Atom][4] 或 [VSCode][5] 等。因为它是为 Web 开发的,所以 JavaScript 可以很好地与 HTML 配合使用。因此,我们先来尝试一些基本的 HTML:
|
||||
要编写你的第一个 JavaScript 代码,请打开你喜欢的文本编辑器,例如 [Atom][4] 或 [VSCode][5] 等。因为它是为 Web 开发的,所以 JavaScript 可以很好地与 HTML 配合使用。因此,我们先来尝试一些基本的 HTML:
|
||||
|
||||
```
|
||||
<html>
|
||||
@ -66,9 +65,9 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
|
||||
|
||||
![在浏览器中显示带有 JavaScript 的 HTML][7]
|
||||
|
||||
如你所见,`<p>` 标签仍然包含字符串 “Nothing here”,但是当它被渲染时,JavaScript 会改变它,使其包含 “Hello world”。是的,JavaScript 具有重建(或只是帮助构建)网页的能力。
|
||||
如你所见,`<p>` 标签仍然包含字符串 `"Nothing here"`,但是当它被渲染时,JavaScript 会改变它,使其包含 `"Hello world"`。是的,JavaScript 具有重建(或只是帮助构建)网页的能力。
|
||||
|
||||
这个简单脚本中的 JavaScript 做了两件事。首先,它创建一个名为 `myvariable` 的变量,并将字符串 “Hello world!” 放置其中。然后,它会在当前文档(浏览器呈现的网页)中搜索 ID 为 “example” 的所有 HTML 元素。当它找到 `example` 时,它使用了 `innerHTML` 函数将 HTML 元素的内容替换为 `myvariable` 的内容。
|
||||
这个简单脚本中的 JavaScript 做了两件事。首先,它创建一个名为 `myvariable` 的变量,并将字符串 `"Hello world!"` 放置其中。然后,它会在当前文档(浏览器呈现的网页)中搜索 ID 为 `example` 的所有 HTML 元素。当它找到 `example` 时,它使用了 `innerHTML` 函数将 HTML 元素的内容替换为 `myvariable` 的内容。(LCTT 译注:这里作者笔误了,`innerHTML` 是“属性”而非“函数”。)
|
||||
|
||||
当然,我们也可以不用自定义变量。因为,使用动态创建的内容来填充 HTML 元素也是容易的。例如,你可以使用当前时间戳来填充它:
|
||||
|
||||
@ -94,7 +93,7 @@ JavaScript 语言的用途多到令人惊讶,它拥有各种各样的库,而
|
||||
|
||||
在编程中,<ruby>语法<rt>syntax</rt></ruby> 指的是如何编写句子(或“行”)的规则。在 JavaScript 中,每行代码必须以分号(`;`)结尾,以便运行代码的 JavaScript 引擎知道何时停止阅读。(LCTT 译注:从实用角度看,此处的“必须”其实是不正确的,大多数 JS 引擎都支持不加分号。Vue.js 的作者尤雨溪认为“没有应该不应该,只有你自己喜欢不喜欢”,他同时表示,“Vue.js 的代码全部不带分号”。详情可以查看他在知乎上对于此问题的 [回答][10]。)
|
||||
|
||||
单词(或 <ruby>“字符串”<rt>strings</rt></ruby>)必须用引号(`"`)括起来,而数字(或 <ruby>“整数”<rt>integers</rt></ruby>)则不用。
|
||||
单词(或 <ruby>字符串<rt>strings</rt></ruby>)必须用引号(`"`)括起来,而数字(或 <ruby>整数<rt>integers</rt></ruby>)则不用。
|
||||
|
||||
几乎所有其他东西都是 JavaScript 语言的约定,例如变量、数组、条件语句、对象、函数等等。
|
||||
|
||||
@ -111,7 +110,7 @@ document.getElementById("example").innerHTML = typeof(myvariable);
|
||||
</string>
|
||||
```
|
||||
|
||||
接着,你就会发现 Web 浏览器中显示出 “string” 字样,因为该变量包含的数据是 “Hello world!”。在 `myvariable` 中存储不同类型的数据(例如整数),浏览器就会把不同的数据类型打印到示例网页上。尝试将 `myvariable` 的内容更改为你喜欢的数字,然后重新加载页面。
|
||||
接着,你就会发现 Web 浏览器中显示出 “string” 字样,因为该变量包含的数据是 `"Hello world!"`。在 `myvariable` 中存储不同类型的数据(例如整数),浏览器就会把不同的数据类型打印到示例网页上。尝试将 `myvariable` 的内容更改为你喜欢的数字,然后重新加载页面。
|
||||
|
||||
### 在 JavaScript 中创建函数
|
||||
|
||||
@ -160,7 +159,7 @@ document.getElementById("example").innerHTML = typeof(myvariable);
|
||||
|
||||
学习 JavaScript 既简单又有趣。网络上有很多网站提供了相关教程,还有超过一百万个 JavaScript 库可帮助你与设备、外围设备、物联网、服务器、文件系统等进行交互。在你学习的过程中,请将我们的 [JavaScript 备忘单][9] 放在身边,以便记住语法和结构的细节。
|
||||
|
||||
正文中的配图来自:Seth Kenlon,CC BY-SA 4.0
|
||||
> **[JavaScript 备忘单][9]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -169,7 +168,7 @@ via: https://opensource.com/article/21/7/javascript-cheat-sheet
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,91 @@
|
||||
[#]: subject: "How to Enable Minimize, Maximize Window Buttons in elementary OS"
|
||||
[#]: via: "https://www.debugpoint.com/2021/08/enable-minimize-maximize-elementary/"
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14778-1.html"
|
||||
|
||||
如何在 elementary OS 中启用最小化、最大化窗口按钮
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/30/141133zfwflwefqwyeffff.jpg)
|
||||
|
||||
> 这是如何在 elementary OS 中启用最小化、最大化窗口按钮的方法。
|
||||
|
||||
许多人(大多数是 elementary OS 的新用户)在各种论坛上问这些问题:
|
||||
|
||||
1. 我怎样才能在 elementary OS 中启用最小化按钮?
|
||||
2. 我如何启用还原、最小化、最大化?
|
||||
3. 有可能恢复最小化和最大化按钮吗?
|
||||
|
||||
这些都是完全正常的问题,而且问问题也是可以的。对吧?这篇指南可以帮助他们在 elementary OS 中获得这些按钮。
|
||||
|
||||
Elementary OS 所使用的 Pantheon 桌面并没有默认的标准窗口按钮。其主要原因是通过 Dock 和应用菜单处理用户行为和活动的不同理念。可以说,这种设计或实现的行为模仿了macOS。
|
||||
|
||||
不过,许多用户更喜欢窗口按钮,因为这是一个所谓的“肌肉记忆”,而且有些人是从其他桌面环境(甚至是 Windows)迁移过来的。
|
||||
|
||||
尽管 Elementary 没有为你提供这个默认设置,你仍然可以启用它。下面是方法。
|
||||
|
||||
### 启用最小化最大化按钮 - elementary OS
|
||||
|
||||
打开终端,安装添加 PPA 所需的 `software-properties-common` 软件包。默认情况下,这个包在 elementary OS 中没有安装(不要问我为什么,真的)。
|
||||
|
||||
```
|
||||
sudo apt install software-properties-common
|
||||
```
|
||||
|
||||
#### elementary OS 6 Odin
|
||||
|
||||
elementary Tweak 工具被重新换了个名字,它现在被称为 [Pantheon Tweaks][1],并正在单独开发中。使用以下命令,你可以安装它:
|
||||
|
||||
```
|
||||
sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks
|
||||
sudo apt install -y pantheon-tweaks
|
||||
```
|
||||
|
||||
#### elementary OS 5 Juno 及更低版本
|
||||
|
||||
如果你使用的是 elementary OS 5 June 及更低版本,你可以使用相同的 PPA 安装早期的 [elementary-tweaks][2]。在终端按照以下命令进行操作:
|
||||
|
||||
```
|
||||
sudo add-apt-repository -y ppa:philip.scott/elementary-tweaks
|
||||
sudo apt install -y elementary-tweaks
|
||||
```
|
||||
|
||||
#### 更改设置
|
||||
|
||||
* 安装后,点击顶部栏的“<ruby>应用<rt>Application</rt></ruby>”,打开“<ruby>系统设置<rt>System settings</rt></ruby>”。在系统设置窗口中,点击“<ruby>个人<rt>Personal</rt></ruby>”下的 “Tweaks”。
|
||||
* 在 Tweaks 窗口中,进入“<ruby>外观<rt>Appearance</rt></ruby>”。
|
||||
* 在窗口控制下,选择布局:“Windows”。
|
||||
|
||||
![enable minimize maximize buttons elementary OS][3]
|
||||
|
||||
* 然后在顶部窗口栏的右侧应该有最小化、最大化和关闭按钮了。
|
||||
|
||||
也有其他组合形式,如 Ubuntu、macOS 等。你可以选择任何你觉得合适的:
|
||||
|
||||
![Other Options of Window buttons in elementary][4]
|
||||
|
||||
这篇指南至此就结束了。系统设置中还有其他选项,你可以尝试使用,但窗口管理器 gala 最近删除了这些选项。因此,它们目前可能无法工作。
|
||||
|
||||
我希望这个指南能帮助你启用 elementary OS 的最小化最大化按钮。如果你需要任何帮助,请在下面的评论栏告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.debugpoint.com/2021/08/enable-minimize-maximize-elementary/
|
||||
|
||||
作者:[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://github.com/pantheon-tweaks/pantheon-tweaks
|
||||
[2]: https://github.com/elementary-tweaks/elementary-tweaks
|
||||
[3]: https://www.debugpoint.com/wp-content/uploads/2021/08/enable-minimize-maximize-buttons-elementary-OS.png
|
||||
[4]: https://www.debugpoint.com/wp-content/uploads/2021/08/Other-Options-of-Window-buttons-in-elementary.jpg
|
@ -0,0 +1,303 @@
|
||||
[#]: subject: "Apache Kafka: Asynchronous Messaging for Seamless Systems"
|
||||
[#]: via: "https://www.opensourceforu.com/2021/11/apache-kafka-asynchronous-messaging-for-seamless-systems/"
|
||||
[#]: author: "Krishna Mohan Koyya https://www.opensourceforu.com/author/krishna-mohan-koyya/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14772-1.html"
|
||||
|
||||
Apache Kafka:为“无缝系统”提供异步消息支持
|
||||
======
|
||||
|
||||
> Apache Kafka 是最流行的开源消息代理之一。它已经成为了大数据操作的重要组成部分,你能够在几乎所有的微服务环境中找到它。本文对 Apache Kafka 进行了简要介绍,并提供了一个案例来展示它的使用方式。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/29/094326fbo6zzsrxiava661.jpg)
|
||||
|
||||
你有没有想过,电子商务平台是如何在处理巨大的流量时,做到不会卡顿的呢?有没有想过,OTT 平台是如何在同时向数百万用户交付内容时,做到平稳运行的呢?其实,关键就在于它们的分布式架构。
|
||||
|
||||
采用分布式架构设计的系统由多个功能组件组成。这些功能组件通常分布在多个机器上,它们通过网络,异步地交换消息,从而实现相互协作。正是由于异步消息的存在,组件之间才能实现可伸缩、无阻塞的通信,整个系统才能够平稳运行。
|
||||
|
||||
### 异步消息
|
||||
|
||||
异步消息的常见特性有:
|
||||
|
||||
* 消息的<ruby>生产者<rt>producer</rt></ruby>和<ruby>消费者<rt>consumer</rt></ruby>都不知道彼此的存在。它们在不知道对方的情况下,加入和离开系统。
|
||||
* 消息<ruby>代理<rt>broker</rt></ruby>充当了生产者和消费者之间的中介。
|
||||
* 生产者把每条消息,都与一个“<ruby>主题<rt>topic</rt></ruby>”相关联。主题是一个简单的字符串。
|
||||
* 生产者可以在多个主题上发送消息,不同的生产者也可以在同一主题上发送消息。
|
||||
* 消费者向代理订阅一个或多个主题的消息。
|
||||
* 生产者只将消息发送给代理,而不发送给消费者。
|
||||
* 代理会把消息发送给订阅该主题的所有消费者。
|
||||
* 代理将消息传递给针对该主题注册的所有消费者。
|
||||
* 生产者并不期望得到消费者的任何回应。换句话说,生产者和消费者不会相互阻塞。
|
||||
|
||||
市场上的消息代理有很多,而 Apache Kafka 是其中最受欢迎的之一。
|
||||
|
||||
### Apache Kafka
|
||||
|
||||
Apache Kafka 是一个支持流式处理的、开源的分布式消息系统,它由 Apache 软件基金会开发。在架构上,它是多个代理组成的集群,这些代理间通过 Apache ZooKeeper 服务来协调。在接收、持久化和发送消息时,这些代理分担集群上的负载。
|
||||
|
||||
#### 分区
|
||||
|
||||
Kafka 将消息写入称为“<ruby>分区<rt>partition</rt></ruby>”的桶中。一个特定分区只保存一个主题上的消息。例如,Kafka 会把 `heartbeats` 主题上的消息写入名为 `heartbeats-0` 的分区(假设它是个单分区主题),这个过程和生产者无关。
|
||||
|
||||
![图 1:异步消息][2]
|
||||
|
||||
不过,为了利用 Kafka 集群所提供的并行处理能力,管理员通常会为指定主题创建多个分区。举个例子,假设管理员为 `heartbeats` 主题创建了三个分区,Kafka 会将它们分别命名为 `heartbeats-0`、`heartbeats-1` 和 `heartbeats-2`。Kafka 会以某种方式,把消息分配到这三个分区中,并使它们均匀分布。
|
||||
|
||||
还有另一种可能的情况,生产者将每条消息与一个<ruby>消息键<rt>key</rt></ruby>相关联。例如,同样都是在 `heartbeats` 主题上发送消息,有个组件使用 `C1` 作为消息键,另一个则使用 `C2`。在这种情况下,Kafka 会确保,在一个主题中,带有相同消息键的消息,总是会被写入到同一个分区。不过,在一个分区中,消息的消息键却不一定相同。下面的图 2 显示了消息在不同分区中的一种可能分布。
|
||||
|
||||
![图 2:消息在不同分区中的分布][3]
|
||||
|
||||
#### 领导者和同步副本
|
||||
|
||||
Kafka 在(由多个代理组成的)集群中维护了多个分区。其中,负责维护分区的那个代理被称为“<ruby>领导者<rt>leader</rt></ruby>”。只有领导者能够在它的分区上接收和发送消息。
|
||||
|
||||
可是,万一分区的领导者发生故障了,又该怎么办呢?为了确保业务连续性,每个领导者(代理)都会把它的分区复制到其他代理上。此时,这些其他代理就称为该分区的<ruby>同步副本<rt>in-sync-replicas</rt></ruby>(ISR)。一旦分区的领导者发生故障,ZooKeeper 就会发起一次选举,把选中的那个同步副本任命为新的领导者。此后,这个新的领导者将承担该分区的消息接受和发送任务。管理员可以指定分区需要维护的同步副本的大小。
|
||||
|
||||
![图 3:生产者命令行工具][4]
|
||||
|
||||
#### 消息持久化
|
||||
|
||||
代理会将每个分区都映射到一个指定的磁盘文件,从而实现持久化。默认情况下,消息会在磁盘上保留一个星期。当消息写入分区后,它们的内容和顺序就不能更改了。管理员可以配置一些策略,如消息的保留时长、压缩算法等。
|
||||
|
||||
![图 4:消费者命令行工具][5]
|
||||
|
||||
#### 消费消息
|
||||
|
||||
与大多数其他消息系统不同,Kafka 不会主动将消息发送给消费者。相反,消费者应该监听主题,并主动读取消息。一个消费者可以从某个主题的多个分区中读取消息。多个消费者也可以读取来自同一个分区的消息。Kafka 保证了同一条消息不会被同一个消费者重复读取。
|
||||
|
||||
Kafka 中的每个消费者都有一个组 ID。那些组 ID 相同的消费者们共同组成了一个消费者组。通常,为了从 N 个主题分区读取消息,管理员会创建一个包含 N 个消费者的消费者组。这样一来,组内的每个消费者都可以从它的指定分区中读取消息。如果组内的消费者比可用分区还要多,那么多出来的消费者就会处于闲置状态。
|
||||
|
||||
在任何情况下,Kafka 都保证:不管组内有多少个消费者,同一条消息只会被该消费者组读取一次。这个架构提供了一致性、高性能、高可扩展性、准实时交付和消息持久性,以及零消息丢失。
|
||||
|
||||
### 安装、运行 Kafka
|
||||
|
||||
尽管在理论上,Kafka 集群可以由任意数量的代理组成,但在生产环境中,大多数集群通常由三个或五个代理组成。
|
||||
|
||||
在这里,我们将搭建一个单代理集群,对于生产环境来说,它已经够用了。
|
||||
|
||||
在浏览器中访问 [https://kafka.apache.org/downloads][5a],下载 Kafka 的最新版本。在 Linux 终端中,我们也可以使用下面的命令来下载它:
|
||||
|
||||
```
|
||||
wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka_2.12-2.8.0.tgz
|
||||
```
|
||||
|
||||
如果需要的话,我们也可以把下载来的档案文件 `kafka_2.12-2.8.0.tgz` 移动到另一个目录下。解压这个档案,你会得到一个名为 `kafka_2.12-2.8.0` 的目录,它就是之后我们要设置的 `KAFKA_HOME`。
|
||||
|
||||
打开 `KAFKA_HOME/config` 目录下的 `server.properties` 文件,取消注释下面这一行配置:
|
||||
|
||||
```
|
||||
listeners=PLAINTEXT://:9092
|
||||
```
|
||||
|
||||
这行配置的作用是让 Kafka 在本机的 `9092` 端口接收普通文本消息。我们也可以配置 Kafka 通过<ruby>安全通道<rt>secure channel</rt></ruby>接收消息,在生产环境中,我们也推荐这么做。
|
||||
|
||||
无论集群中有多少个代理,Kafka 都需要 ZooKeeper 来管理和协调它们。即使是单代理集群,也是如此。Kafka 在安装时,会附带安装 ZooKeeper,因此,我们可以在 `KAFKA_HOME` 目录下,在命令行中使用下面的命令来启动它:
|
||||
|
||||
```
|
||||
./bin/zookeeper-server-start.sh ./config/zookeeper.properties
|
||||
```
|
||||
|
||||
当 ZooKeeper 运行起来后,我们就可以在另一个终端中启动 Kafka 了,命令如下:
|
||||
|
||||
```
|
||||
./bin/kafka-server-start.sh ./config/server.properties
|
||||
```
|
||||
|
||||
到这里,一个单代理的 Kafka 集群就运行起来了。
|
||||
|
||||
### 验证 Kafka
|
||||
|
||||
让我们在 `topic-1` 主题上尝试下发送和接收消息吧!我们可以使用下面的命令,在创建主题时为它指定分区的个数:
|
||||
|
||||
```
|
||||
./bin/kafka-topics.sh --create --topic topic-1 --zookeeper localhost:2181 --partitions 3 --replication-factor 1
|
||||
```
|
||||
|
||||
上述命令还同时指定了<ruby>复制因子<rt>replication factor</rt></ruby>,它的值不能大于集群中代理的数量。我们使用的是单代理集群,因此,复制因子只能设置为 1。
|
||||
|
||||
当主题创建完成后,生产者和消费者就可以在上面交换消息了。Kafka 的发行版内附带了生产者和消费者的命令行工具,供测试时用。
|
||||
|
||||
打开第三个终端,运行下面的命令,启动生产者:
|
||||
|
||||
```
|
||||
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic-1
|
||||
```
|
||||
|
||||
上述命令显示了一个提示符,我们可以在后面输入简单文本消息。由于我们指定的命令选项,生产者会把 `topic-1` 上的消息,发送到运行在本机的 9092 端口的 Kafka 中。
|
||||
|
||||
打开第四个终端,运行下面的命令,启动消费者:
|
||||
|
||||
```
|
||||
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-1 –-from-beginning
|
||||
```
|
||||
|
||||
上述命令启动了一个消费者,并指定它连接到本机 9092 端口的 Kafka。它订阅了 `topic-1` 主题,以读取其中的消息。由于命令行的最后一个选项,这个消费者会从最开头的位置,开始读取该主题的所有消息。
|
||||
|
||||
我们注意到,生产者和消费者连接的是同一个代理,访问的是同一个主题,因此,消费者在收到消息后会把消息打印到终端上。
|
||||
|
||||
下面,让我们在实际应用场景中,尝试使用 Kafka 吧!
|
||||
|
||||
### 案例
|
||||
|
||||
假设有一家叫做 ABC 的公共汽车运输公司,它拥有一支客运车队,往返于全国不同城市之间。由于 ABC 希望实时跟踪每辆客车,以提高其运营质量,因此,它提出了一个基于 Apache Kafka 的解决方案。
|
||||
|
||||
首先,ABC 公司为所有公交车都配备了位置追踪设备。然后,它使用 Kafka 建立了一个操作中心,以接收来自数百辆客车的位置更新。它还开发了一个<ruby>仪表盘<rt>dashboard</rt></ruby>,以显示任一时间点所有客车的当前位置。图 5 展示了上述架构:
|
||||
|
||||
![图 5:基于 Kafka 的架构][6]
|
||||
|
||||
在这种架构下,客车上的设备扮演了消息生产者的角色。它们会周期性地把当前位置发送到 Kafka 的 `abc-bus-location` 主题上。ABC 公司选择以客车的<ruby>行程编号<rt>trip code</rt></ruby>作为消息键,以处理来自不同客车的消息。例如,对于从 Bengaluru 到 Hubballi 的客车,它的行程编号就会是 `BLRHL003`,那么在这段旅程中,对于所有来自该客车的消息,它们的消息键都会是 `BLRHL003`。
|
||||
|
||||
仪表盘应用扮演了消息消费者的角色。它在代理上注册了同一个主题 `abc-bus-location`。如此,这个主题就成为了生产者(客车)和消费者(仪表盘)之间的虚拟通道。
|
||||
|
||||
客车上的设备不会期待得到来自仪表盘应用的任何回复。事实上,它们相互之间都不知道对方的存在。得益于这种架构,数百辆客车和操作中心之间实现了非阻塞通信。
|
||||
|
||||
#### 实现
|
||||
|
||||
假设 ABC 公司想要创建三个分区来维护位置更新。由于我们的开发环境只有一个代理,因此复制因子应设置为 1。
|
||||
|
||||
相应地,以下命令创建了符合需求的主题:
|
||||
|
||||
```
|
||||
./bin/kafka-topics.sh --create --topic abc-bus-location --zookeeper localhost:2181 --partitions 3 --replication-factor 1
|
||||
```
|
||||
|
||||
生产者和消费者应用可以用多种语言编写,如 Java、Scala、Python 和 JavaScript 等。下面几节中的代码展示了它们在 Java 中的编写方式,好让我们有一个初步了解。
|
||||
|
||||
##### Java 生产者
|
||||
|
||||
下面的 `Fleet` 类模拟了在 ABC 公司的 6 辆客车上运行的 Kafka 生产者应用。它会把位置更新发送到指定代理的 `abc-bus-location` 主题上。请注意,简单起见,主题名称、消息键、消息内容和代理地址等,都在代码里硬编码的。
|
||||
|
||||
```
|
||||
public class Fleet {
|
||||
public static void main(String[] args) throws Exception {
|
||||
String broker = “localhost:9092”;
|
||||
Properties props = new Properties();
|
||||
props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
|
||||
props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
|
||||
StringSerializer.class.getName());
|
||||
props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
|
||||
StringSerializer.class.getName());
|
||||
|
||||
Producer<String, String> producer = new KafkaProducer<String, String>(props);
|
||||
String topic = “abc-bus-location”;
|
||||
Map<String, String> locations = new HashMap<>();
|
||||
locations.put(“BLRHBL001”, “13.071362, 77.461906”);
|
||||
locations.put(“BLRHBL002”, “14.399654, 76.045834”);
|
||||
locations.put(“BLRHBL003”, “15.183959, 75.137622”);
|
||||
locations.put(“BLRHBL004”, “13.659576, 76.944675”);
|
||||
locations.put(“BLRHBL005”, “12.981337, 77.596181”);
|
||||
locations.put(“BLRHBL006”, “13.024843, 77.546983”);
|
||||
|
||||
IntStream.range(0, 10).forEach(i -> {
|
||||
for (String trip : locations.keySet()) {
|
||||
ProducerRecord<String, String> record
|
||||
= new ProducerRecord<String, String>(
|
||||
topic, trip, locations.get(trip));
|
||||
producer.send(record);
|
||||
}
|
||||
});
|
||||
producer.flush();
|
||||
producer.close();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### Java 消费者
|
||||
|
||||
下面的 `Dashboard` 类实现了一个 Kafka 消费者应用,运行在 ABC 公司的操作中心。它会监听 `abc-bus-location` 主题,并且它的消费者组 ID 是 `abc-dashboard`。当收到消息后,它会立即显示来自客车的详细位置信息。我们本该配置这些详细位置信息,但简单起见,它们也是在代码里硬编码的:
|
||||
|
||||
```
|
||||
public static void main(String[] args) {
|
||||
String broker = “127.0.0.1:9092”;
|
||||
String groupId = “abc-dashboard”;
|
||||
Properties props = new Properties();
|
||||
props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
|
||||
props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
|
||||
StringDeserializer.class.getName());
|
||||
props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
|
||||
StringDeserializer.class.getName());
|
||||
props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, groupId);
|
||||
|
||||
@SuppressWarnings(“resource”)
|
||||
Consumer<String, String> consumer = new KafkaConsumer<String, String>(props);
|
||||
consumer.subscribe(Arrays.asList(“abc-bus-location”));
|
||||
while (true) {
|
||||
ConsumerRecords<String, String> records
|
||||
= consumer.poll(Duration.ofMillis(1000));
|
||||
|
||||
for (ConsumerRecord<String, String> record : records) {
|
||||
String topic = record.topic();
|
||||
int partition = record.partition();
|
||||
String key = record.key();
|
||||
String value = record.value();
|
||||
System.out.println(String.format(
|
||||
“Topic=%s, Partition=%d, Key=%s, Value=%s”,
|
||||
topic, partition, key, value));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### 依赖
|
||||
|
||||
为了编译和运行这些代码,我们需要 JDK 8 及以上版本。看到下面的 `pom.xml` 文件中的 Maven 依赖了吗?它们会把所需的 Kafka 客户端库下载并添加到类路径中:
|
||||
|
||||
```
|
||||
<dependency>
|
||||
<groupId>org.apache.kafka</groupId>
|
||||
<artifactId>kafka-clients</artifactId>
|
||||
<version>2.8.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>1.7.25</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
#### 部署
|
||||
|
||||
由于 `abc-bus-location` 主题在创建时指定了 3 个分区,我们自然就会想要运行 3 个消费者,来让读取位置更新的过程更快一些。为此,我们需要同时在 3 个不同的终端中运行仪表盘。因为所有这 3 个仪表盘都注册在同一个组 ID 下,它们自然就构成了一个消费者组。Kafka 会为每个仪表盘都分配一个特定的分区(来消费)。
|
||||
|
||||
当所有仪表盘实例都运行起来后,在另一个终端中启动 `Fleet` 类。图 6、7、8 展示了仪表盘终端中的控制台示例输出。
|
||||
|
||||
![图 6:仪表盘终端之一][7]
|
||||
|
||||
仔细看看控制台消息,我们会发现第一个、第二个和第三个终端中的消费者,正在分别从 `partition-2`、`partition-1` 和 `partition-0` 中读取消息。另外,我们还能发现,消息键为 `BLRHBL002`、`BLRHBL004` 和 `BLRHBL006` 的消息写入了 `partition-2`,消息键为 `BLRHBL005` 的消息写入了 `partition-1`,剩下的消息写入了 `partition-0`。
|
||||
|
||||
![图 7:仪表盘终端之二][8]
|
||||
|
||||
使用 Kafka 的好处在于,只要集群设计得当,它就可以水平扩展,从而支持大量客车和数百万条消息。
|
||||
|
||||
![图 8:仪表盘终端之三][9]
|
||||
|
||||
### 不止是消息
|
||||
|
||||
根据 Kafka 官网上的数据,在《财富》100 强企业中,超过 80% 都在使用 Kafka。它部署在许多垂直行业,如金融服务、娱乐等。虽然 Kafka 起初只是一种简单的消息服务,但它已凭借行业级的流处理能力,成为了大数据生态系统的一环。对于那些喜欢托管解决方案的企业,Confluent 提供了基于云的 Kafka 服务,只需支付订阅费即可。(LCTT 译注:Confluent 是一个基于 Kafka 的商业公司,它提供的 Confluent Kafka 在 Apache Kafka 的基础上,增加了许多企业级特性,被认为是“更完整的 Kafka”。)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2021/11/apache-kafka-asynchronous-messaging-for-seamless-systems/
|
||||
|
||||
作者:[Krishna Mohan Koyya][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.opensourceforu.com/author/krishna-mohan-koyya/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Digital-backgrund-connecting-in-globe.jpg
|
||||
[2]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-1-Asynchronous-messaging.jpg
|
||||
[3]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-2-Message-distribution-among-the-partitions.jpg
|
||||
[4]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-3-Command-line-producer.jpg
|
||||
[5]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-4-Command-line-consumer.jpg
|
||||
[5a]: https://kafka.apache.org/downloads
|
||||
[6]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-5-Kafka-based-architecture.jpg
|
||||
[7]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-6-Dashboard-Terminal-1.jpg
|
||||
[8]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-7-Dashboard-Terminal-2.jpg
|
||||
[9]: https://www.opensourceforu.com/wp-content/uploads/2021/09/Figure-8-Dashboard-Terminal-3.jpg
|
@ -0,0 +1,193 @@
|
||||
[#]: subject: "Install Specific Package Version With Apt Command in Ubuntu"
|
||||
[#]: via: "https://itsfoss.com/apt-install-specific-version-2/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "robsean"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14760-1.html"
|
||||
|
||||
如何在 Ubuntu 中安装具体指定的软件包版本
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/26/145335zcrpducpup4p2ugy.jpg)
|
||||
|
||||
在 Ubuntu 中想安装一个软件包的一个特别指定的版本?你可以通过下面的方式来轻松地完成:
|
||||
|
||||
```
|
||||
sudo apt install package_name=package_version
|
||||
```
|
||||
|
||||
你如何知道某个软件包有哪些可用的版本?可以使用这个命令:
|
||||
|
||||
```
|
||||
apt list --all-versions package_name
|
||||
```
|
||||
|
||||
在下面的屏幕截屏中,你可以看到,我有两个可用的 VLC 版本,我使用命令来安装较旧的版本:
|
||||
|
||||
![install specific versions apt ubuntu][1]
|
||||
|
||||
听起来像一个简单的任务,对吧?但是事情并非看起来那么简单。这里有一些不确定是否会出现,但是可能会涉及的东西。
|
||||
|
||||
这篇教程将涵盖使用 `apt` 或 `apt-get` 命令来安装一个具体指定的程序的版本的所有的重要的方面。
|
||||
|
||||
### 安装一个具体指定版本的程序需要知道的事
|
||||
|
||||
在基于 Ubuntu 和 Debian 发行版中,你需要知道一些关于 APT 和存储库是如何工作的知识。
|
||||
|
||||
#### 同一个软件包源没有较旧的版本
|
||||
|
||||
Ubuntu 在其存储库中不保留较旧版本的软件包。在特殊的情况下,你可以暂时性地看到多个版本。例如,你运行 APT 更新(但不升级)时,可能会有一个可用的新版本。在 APT 缓存中,你可以看到同一个软件包的两个版本。但是,一旦软件包被升级到了新的版本,较旧版本的软件包将从 **APT 缓存** 和存储库中移除。
|
||||
|
||||
#### 使用多个软件包源来使用不同的版本
|
||||
|
||||
为获取同一个的软件包的多个版本,你必须得添加多个软件包源。例如,VLC 是版本 3.x 系列。添加 [VLC 每日构建 PPA][2] 将会提供(不稳定的)版本 4.x 系列。
|
||||
|
||||
同样,**你可以下载不同版本的 DEB 文件,并安装它**。
|
||||
|
||||
#### 较高版本编号的版本通常有优先权
|
||||
|
||||
如果你有来自多个软件包源的相同名称的软件,默认情况下,Ubuntu 将安装可用的最高版本编号的版本。
|
||||
|
||||
在前面的示例中,如果我安装 VLC ,那么它将会安装 4.x 系列的版本,而不是 3.x 系列的版本。
|
||||
|
||||
#### 较旧版本将升级到可用的较新版本
|
||||
|
||||
这是另外一个可能存在的问题。即使你安装较旧版本的软件包,它也会升级到较新的版本(如果存在可用的较新版本)。你必须 [保留该软件包来防止其升级][3] 。
|
||||
|
||||
#### 依赖关系也需要安装
|
||||
|
||||
如果软件包有依赖关系,你也需要安装必要的依赖关系软件包。
|
||||
|
||||
现在,你已经知道一些可能存在的问题,让我们看看如何解决它们。
|
||||
|
||||
### 安装一个软件包的具体指定版本
|
||||
|
||||
在这篇教程中,我将以 VLC 为例。在 Ubuntu 的存储库中可获得 VLC 版本。我添加了每日构建 PPA ,它将向我提供 VLC 的 4.0 版本的候选版本。
|
||||
|
||||
如你所见,在现在的系统中,我有两个可用的 VLC 版本:
|
||||
|
||||
![install specific versions apt ubuntu][4]
|
||||
|
||||
```
|
||||
~$ apt list -a vlc
|
||||
Listing... Done
|
||||
vlc/jammy 4.0.0~rc1~~git20220516+r92284+296~ubuntu22.04.1 amd64
|
||||
vlc/jammy 3.0.16-1build7 amd64
|
||||
vlc/jammy 3.0.16-1build7 i386
|
||||
```
|
||||
|
||||
因为较高版本编号版本有优先权,使用 `apt install vlc` 命令将会导致安装 VLC 的 4.0 版本。但是,因为这篇教程的缘由,我想安装较旧的版本 3.0.16 。
|
||||
|
||||
```
|
||||
sudo apt install vlc=3.0.16-1build7
|
||||
```
|
||||
|
||||
但是,这里会有这样的事。VLC 软件包有一些依赖关系,并且这些依赖关系也需要具体指定的版本。因此,在 Ubuntu 为其尝试安装最新的版本时,你将会遇到经典的 <ruby>[你已保留残缺软件包][5]<rt>you have held broken packages</rt></ruby> 错误。
|
||||
|
||||
![problem installing specific version apt ubuntu][6]
|
||||
|
||||
为修复这个错误,你需要为其提供它所投诉的所有依赖关系的软件包的具体指定版本。因此,该命令会变成这样:
|
||||
|
||||
```
|
||||
sudo apt install vlc=3.0.16-1build7 \
|
||||
vlc-bin=3.0.16-1build7 \
|
||||
vlc-plugin-base=3.0.16-1build7 \
|
||||
vlc-plugin-qt=3.0.16-1build7 \
|
||||
vlc-plugin-video-output=3.0.16-1build7 \
|
||||
vlc-l10n=3.0.16-1build7 \
|
||||
vlc-plugin-access-extra=3.0.16-1build7 \
|
||||
vlc-plugin-notify=3.0.16-1build7 \
|
||||
vlc-plugin-samba=3.0.16-1build7 \
|
||||
vlc-plugin-skins2=3.0.16-1build7 \
|
||||
vlc-plugin-video-splitter=3.0.16-1build7 \
|
||||
vlc-plugin-visualization=3.0.16-1build7
|
||||
```
|
||||
|
||||
说明一下,每行结尾处的 `\` 只是用来将多行命令来写入同一个命令的一种方式。
|
||||
|
||||
**它有作用吗?在很多情况下,它是有作用的。** 但是,我选择了一个复杂的 VLC 示例,它有很多依赖关系。甚至这些所涉及的依赖关系也依赖于其它的软件包。所以,它就变得令人难以处理。
|
||||
|
||||
一种替代的方法是在安装时指定软件包源。
|
||||
|
||||
#### 替代方式,指定存储库
|
||||
|
||||
你已经添加多个软件包源,因此,你应该对这些软件包的来源有一些了解。
|
||||
|
||||
使用下面的命令来搜索存储库:
|
||||
|
||||
```
|
||||
apt-cache policy | less
|
||||
```
|
||||
|
||||
注意存储库名称后面的行:
|
||||
|
||||
```
|
||||
500 http://security.ubuntu.com/ubuntu jammy-security/multiverse i386 Packages
|
||||
release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=multiverse,b=i386
|
||||
origin security.ubuntu.com
|
||||
```
|
||||
|
||||
你可以具体指定 `o`、`l`、`a` 等参数。
|
||||
|
||||
在我原来的示例中,我想安装来自 Ubuntu 存储库的 VLC(获取版本 3.16),而不是安装来 PPA 的版本(它将向我提供版本 4)。
|
||||
|
||||
因此,下面的命令将安装 VLC 版本 3.16 及其所有的依赖关系:
|
||||
|
||||
```
|
||||
sudo apt install -t "o=ubuntu" vlc
|
||||
```
|
||||
|
||||
![install from repository source][7]
|
||||
|
||||
看起来令人满意?但是,当你必须更新系统时,问题就来了。它接下来会控诉找不到指定的软件包版本。
|
||||
|
||||
**还能做什么?**
|
||||
|
||||
为安装较旧的软件包版本,从你的系统中移除较新版本的软件包源(如果可能的话)。它将有助于逃脱这些依赖关系地狱。
|
||||
|
||||
如果不能这么做,检查你是否可以从其它一些软件包的打包格式来获取,像 Snap、Flatpak、AppImage 等等。事实上,Snap 和 Flatpak 也允许你从可用的版本中选择和安装。因为这些应用程序是沙盒模式的,所以它很容易管理不同版本的依赖关系。
|
||||
|
||||
#### 保留软件包,防止升级
|
||||
|
||||
如果你完成安装一个指定的程序版本,你可能想避免意外地升级到较新的版本。实现这一点并不太复杂。
|
||||
|
||||
```
|
||||
sudo apt-mark hold package_name
|
||||
```
|
||||
|
||||
你可以免除保留软件包,以便它能稍后升级:
|
||||
|
||||
```
|
||||
sudo apt-mark unhold package_name
|
||||
```
|
||||
|
||||
注意,软件包的依赖关系不会自动地保留。它们需要单独地指明。
|
||||
|
||||
### 结论
|
||||
|
||||
如你所见,安装选定软件包版本有一定之规。只有当软件包有依赖关系时,那么事情就会变得复杂,然后,你就会进入依赖关系地狱。
|
||||
|
||||
我希望你在这篇教程中学到一些新的东西。如果你有问题或建议来改善它,请在评论区告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/apt-install-specific-version-2/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/wp-content/uploads/2022/05/install-specific-versions-apt-ubuntu.png
|
||||
[2]: https://launchpad.net/~videolan/+archive/ubuntu/master-daily
|
||||
[3]: https://itsfoss.com/prevent-package-update-ubuntu/
|
||||
[4]: https://itsfoss.com/wp-content/uploads/2022/05/install-specific-versions-apt-ubuntu.png
|
||||
[5]: https://itsfoss.com/held-broken-packages-error/
|
||||
[6]: https://itsfoss.com/wp-content/uploads/2022/05/problem-installing-specific-version-apt-ubuntu-800x365.png
|
||||
[7]: https://itsfoss.com/wp-content/uploads/2022/05/install-from-repository-source-800x578.png
|
@ -3,27 +3,32 @@
|
||||
[#]: author: "Dan Whiting https://www.linuxfoundation.org/blog/why-do-enterprises-use-and-contribute-to-open-source-software/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "aREversez"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14725-1.html"
|
||||
|
||||
企业为何使用开源软件,又为何推动开源软件的发展
|
||||
======
|
||||
每当人们知道我在 <ruby>Linux 基金会<rt>Linux Foundation</rt></ruby> 工作,他们总是会问我们的工作具体是做什么的。有时候,他们会一直问我是不是开发 Linux 操作系统的。我只能回答说,我们做的是开源软件,并试图在他们失去兴趣之前,将对世界的重大影响赌在短短的 20 秒上。如果他们的兴趣还在,想要进一步了解,我就会给他们深入分析一番:企业为何想参与到开源软件项目之中?它们为何会使用开源软件?没错,企业确实会这样做,无论它们有没有意识到这一点。此外,成千上万的企业会将企业内部代码捐给开源项目,为推动开源软件的进一步开发和优化投入大量的时间和资源。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/18/160635ejcmee273zmmxh72.jpg)
|
||||
|
||||
每当人们知道我在 <ruby>Linux 基金会<rt>Linux Foundation</rt></ruby> 工作,他们总是会问我们的工作具体是做什么的。有时候,他们会一直问我是不是开发 Linux 操作系统的。我只能回答说,我们做的是开源软件,并试图在他们失去兴趣之前,在短短的 20 秒钟内介绍它对世界的影响力。如果他们的兴趣还在,想要进一步了解,我就会给他们深入分析一番:企业为何想参与到开源软件项目之中?它们为何会使用开源软件?没错,企业确实会这样做,无论它们有没有意识到这一点。此外,成千上万的企业会将企业内部代码捐给开源项目,为推动开源软件的进一步开发和优化投入大量的时间和资源。
|
||||
|
||||
### 开源软件的使用范围有多广
|
||||
|
||||
引用我们基金会最近发表的一项报告 <ruby>《企业开源指南》<rt>A Guide to Enterprise Open Source</rt></ruby>,“<ruby>开源软件<rt>open source software</rt></ruby>(OSS)改变了世界,是数字经济的支柱,数字世界的基石。从我们日常使用的互联网和移动应用到开拓未来的操作系统和程序语言,开源软件无不发挥着重要的作用,可谓是科技行业的命脉。在今天,开源软件驱动数字经济发展,推进科学技术取得突破,不断改善人们的生活水平。手机、汽车和飞机等设备,家庭、企业和政府等群体都在使用着开源软件。但就在 20 年前,开源软件还仅仅为少数人所知,为少数热心爱好者们组成的群体所用。”
|
||||
引用我们最近发表的一项报告《<ruby>企业开源指南<rt>A Guide to Enterprise Open Source</rt></ruby>》:“<ruby>开源软件<rt>open source software</rt></ruby>(OSS)改变了世界,是数字经济的支柱,数字世界的基石。从我们日常使用的互联网和移动应用到开拓未来的操作系统和编程语言,开源软件无不发挥着重要的作用,可谓是科技行业的命脉。在今天,开源软件驱动数字经济发展,推进科学技术取得突破,不断改善人们的生活水平。手机、汽车和飞机等设备,家庭、企业和政府等群体都在使用着开源软件。但就在 20 年前,开源软件还仅仅为少数人所知,它的使用也仅限于一小部分专门的爱好者。”
|
||||
|
||||
如今,情况可大不相同了:
|
||||
开源软件(OSS)已经改变了我们的世界,成为我们数字经济的支柱和数字世界的基础。
|
||||
|
||||
* 在各行业的 <ruby>垂类软件栈<rt>vertical software stacks</rt></ruby> 中,开源软件的占比达到了 20%-85%。
|
||||
而它实际上:
|
||||
|
||||
* 在各行业的 <ruby>垂类软件栈<rt>vertical software stacks</rt></ruby> 中,开源软件的占比达到了 20% - 85%。
|
||||
* 超过 90% 的网站服务器和联网设备都依靠 Linux 来运行。
|
||||
* 安卓手机系统也是基于 Linux 内核。
|
||||
* 用于应用程序开发的 AMP、Appium、Dojo、jQuery、Marko、Node.js 等 [主流的库和工具][1] 均属于开源项目。
|
||||
* 世界上排名位列前 100 名的超级计算机都在使用 Linux。
|
||||
* 大型机客户均在使用 Linux。
|
||||
* AWS、Google 以及 Microsoft 三大云服务供应商都在使用开源软件运行服务,策划并在云端发起开源解决方案。
|
||||
* 亚马逊、谷歌以及微软三大云服务供应商都在使用开源软件运行服务,并在云端托管开源解决方案。
|
||||
|
||||
### 企业为何想参与到开源软件项目之中
|
||||
|
||||
@ -35,7 +40,7 @@
|
||||
|
||||
人们经常会问,为什么这些企业愿意放弃自家软件的所有权?为什么它们不让员工专攻自家软件的开发呢?
|
||||
|
||||
从整体上来看,这一问题的答案就是,企业和组织聚集起来,合力解决共同的难题,如此一来,他们就可以各自专注于在这基础上的各类难题。这些企业明白,将资源聚集在一起,能够更好地解决基础问题。有时,这种现象被叫做“竞合”,大概的意思是企业在一些领域可能互为竞争对手,但是它们在另一些领域则会互相合作。
|
||||
从整体上来看,这一问题的答案就是,企业和组织聚集起来,合力解决共同的难题,如此一来,他们就可以各自专注于在这基础上的各类难题。这些企业明白,将资源聚集在一起,能够更好地解决基础问题。有时,这种现象被叫做“<ruby>竞合<rt>coopetition</rt></ruby>”,大概的意思是企业在一些领域可能互为竞争对手,但是它们在另一些领域则会互相合作。
|
||||
|
||||
“竞合”现象的一些典型例子:
|
||||
|
||||
@ -45,25 +50,19 @@
|
||||
|
||||
如今,企业、组织以及个体在合力解决难题的同时,也在不断地改进自身的产品与业务。
|
||||
|
||||
[<ruby>来此加密<rt>Let’s Encrypt</rt></ruby>][2] 是一个免费开放的自动化证书颁发机构,旨在通过简化安装程序,减低安装费用,快速扩大安全网络协议的应用范围。该机构为超过 2.25 亿个网站提供服务,每天平均发放证书约 150 万张。
|
||||
* <ruby>[来此加密][2]<rt>Let’s Encrypt</rt></ruby>(LCTT译注:Let’s Encrypt 官网并没有用“来此加密”这样的称呼,但是在一些场合有这样的译名。我们认为此翻译很贴切。) 是一个免费的、开放的自动化证书颁发机构,旨在通过简化安装程序,减低安装费用,快速扩大安全网络协议的应用范围。该机构为超过 2.25 亿个网站提供服务,每天平均发放证书约 150 万张。
|
||||
* 好莱坞成立的 <ruby>[学院软件基金会][3]<rt>Academy Software Foundation</rt></ruby> 通过共同开发软件,推动娱乐、游戏和媒体等产业的增长,为产业发展提供开放标准,在电影行业内 [创造了巨大的价值][4]。
|
||||
* <ruby>超级账本<rt>Hyperledger</rt></ruby> 基金会管理多个企业级区块链软件项目。众所周知,这些项目 [消耗的能源远比其他解决方案要少][5]。
|
||||
* <ruby>[LF 能源基金会][6]<rt>LF Energy</rt></ruby> 推动 [电网朝着更加模块化、互操作和可拓展的方向发展][7],助力提升可再生能源的利用率。
|
||||
* <ruby>[无人机代码基金会][8]<rt>Dronecode</rt></ruby> 致力于无人机软件的开发,促进企业在无人机领域进一步开拓创新。
|
||||
* <ruby>[开源软件软件安全基金会][9]<rt>OpenSSF</rt></ruby> 聚集了顶尖的科技企业,共同强化开源软件的安全与韧性。
|
||||
* [Kubernetes][10] 是 Google 捐赠给 Linux 基金会下属的云原生计算基金会(CNCF)的一个项目,是管理基于云计算软件的首选方案。
|
||||
|
||||
好莱坞成立的 [<ruby>学院软件基金会<rt>Academy Software Foundation</rt></ruby>][3] 通过共同开发软件,推动娱乐、游戏和媒体等产业的增长,为产业发展提供开放标准,在电影行业内 [创造了巨大的价值][4]。
|
||||
|
||||
<ruby>超级账本<rt>Hyperledger</rt></ruby> 基金会发起了多个企业级区块链软件项目。众所周知,这些项目 [消耗的能源远比其他解决方案要少][5]。
|
||||
|
||||
[LF Energy 基金会][6] 推动 [电网朝着更加模块化、互操作和可拓展的方向发展][7],助力提升可再生能源的利用率。
|
||||
|
||||
[Dronecode 基金会][8] 致力于无人机软件的开发,促进企业在无人机领域进一步开拓创新。
|
||||
|
||||
[<ruby>开源软件软件安全基金会<rt>OpenSSF</rt></ruby>][9] 聚集了顶尖的科技企业,共同强化开源软件的安全与韧性。
|
||||
|
||||
[Kubernetes][10] 是 Google 捐赠给 Linux 基金会下属的云原生计算基金会(CNCF)的一个项目,是管理基于云计算软件的首选方案。
|
||||
|
||||
上述只是企业参与的一小部分开源软件项目,点击[此处][11],在 Linux 基金会官网浏览全部项目列表。
|
||||
上述只是企业参与的一小部分开源软件项目,点击 [此处][11],可以在 Linux 基金会官网浏览全部项目列表。
|
||||
|
||||
### 企业如何有效利用和参与开源软件项目?
|
||||
|
||||
若想要更好地利用开源项目,更有效地参与开源项目,企业可以向 Linux 基金会寻求帮助。我们最新发布的报告 [《企业开源指南》][12] 提供了企业与组织需要了解的大部分信息。这份报告凝聚了来自多家顶级企业、具有几十年丰富经验的开源领袖的知识与智慧,报告主要分为以下六个章节:
|
||||
若想要更好地利用开源项目,更有效地参与开源项目,企业可以向 Linux 基金会寻求帮助。我们最新发布的报告 《[企业开源指南][12]》 提供了企业与组织需要了解的大部分信息。这份报告凝聚了来自多家顶级企业、具有几十年丰富经验的开源领袖的知识与智慧,报告主要分为以下六个章节:
|
||||
|
||||
* 使用开源软件
|
||||
* 准备参与开源
|
||||
@ -74,19 +73,16 @@
|
||||
|
||||
此外,Linux 基金会还提供了许多开源 [培训课程][13]、全年 [活动][14]、[LFX 平台][15],发起开源项目,协助企业与组织利用和参与开源项目,比如:
|
||||
|
||||
[TODO 工作组][16] 为开源项目办公室的建立和运作提供资源,包括其自身 [丰富的指导意见][17]。
|
||||
* [TODO 工作组][16] 为开源项目办公室的建立和运作提供资源,包括其自身 [丰富的指导意见][17]。
|
||||
* [Openchain 项目][18] 旨在提供和维护国际开源许可标准,包括各种许可规定的相关信息。依赖于此,企业可以确保自身行为符合法律规定。
|
||||
* [FinOps 基金会][19] 目前正在将自身打造为“不断发展的云财务管理和文化实践平台,通过促进工程、财务、技术以及商业团队之间在数据驱动支出决策方面的合作,确保企业能够最大化实现商业价值”。
|
||||
* <ruby>[软件数据包交换标准][20]<rt>Software Data Package Exchange</rt></ruby>(SPDX)是一个用于交流 <ruby>软件物料清单<rt>software bill of materials</rt></ruby>(SBOM)的开放标准。在该标准下,每个用户都能清楚了解整个软件包中包括哪些软件。
|
||||
|
||||
[Openchain 项目][18] 旨在提供和维护国际开源许可标准,包括各种许可规定的相关信息。依赖于此,企业可以确保自身行为符合法律规定。
|
||||
|
||||
[FinOps 基金会][19] 目前正在将自身打造为“不断发展的云财务管理和文化实践平台,通过促进工程、财务、技术以及商业团队之间在数据驱动支出决策方面的合作,确保企业能够最大化实现商业价值”。
|
||||
|
||||
[Software Data Package Exchange (SPDX)][20] 是一个用于交流 <ruby>软件构成清单<rt>software bill of materials</rt></ruby>(SBOMs)的开放标准。在该标准下,每个用户都能清楚了解整个软件包中包括哪些软件。
|
||||
|
||||
重复一遍,上述这些只是 Linux 基金会所有项目中的一小部分。所有这些项目都致力于帮助企业接受和使用开源项目,引导企业为开源项目做出贡献、提供捐赠。
|
||||
同样,上述这些只是 Linux 基金会所有项目中的一小部分。所有这些项目都致力于帮助企业接受和使用开源项目,引导企业为开源项目做出贡献、提供捐赠。
|
||||
|
||||
总而言之,目前,企业正在迅速投向开源软件项目,借此解决共同的难题,并探索进一步的创新发展,而 Linux 基金会将为它们提供帮助。
|
||||
|
||||
该文 [《企业为何使用开源软件,又为何推动开源软件的发展》][21] 首发于 [Linux 基金会][22] 官网。
|
||||
*该文 [《企业为何使用开源软件,又为何推动开源软件的发展》][21] 首发于 [Linux 基金会][22] 官网。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -95,7 +91,7 @@ via: https://www.linux.com/news/why-do-enterprises-use-and-contribute-to-open-so
|
||||
作者:[Dan Whiting][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[aREversez](https://github.com/aREversez)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,17 +3,16 @@
|
||||
[#]: author: "Jayashree Huttanagoudar https://opensource.com/users/jayashree-huttanagoudar"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14742-1.html"
|
||||
|
||||
JVM 垃圾回收的工作原理
|
||||
======
|
||||
对于程序员来说,掌握 Java 的内存管理机制并不是必须的,但它能够帮助你更好地理解 JVM 是如何处理程序中的变量和类实例的。
|
||||
|
||||
![咖啡豆][1]
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/22/094238qvh45pv2jtpde9td.jpg)
|
||||
|
||||
图源:Pixabay. CC0.
|
||||
> 对于程序员来说,掌握 Java 的内存管理机制并不是必须的,但它能够帮助你更好地理解 JVM 是如何处理程序中的变量和类实例的。
|
||||
|
||||
Java 之所以能够如此流行,自动 <ruby>垃圾回收<rt>Garbage Collection</rt></ruby>(GC)功不可没,它也是 Java 最重要的几个特性之一。在这篇文章中,我将说明为什么垃圾回收如此重要。本文的主要内容为:自动的分代垃圾回收、JVM 划分内存的依据,以及 JVM 垃圾回收的工作原理。
|
||||
|
||||
@ -21,10 +20,10 @@ Java 之所以能够如此流行,自动 <ruby>垃圾回收<rt>Garbage Collecti
|
||||
|
||||
Java 程序的内存空间被划分为以下四个区域:
|
||||
|
||||
1. 堆区(Heap):对象实例就是在这个区域分配的。不过,当我们声明一个对象时,堆中不会有任何内存分配发生,只是在栈中创建了一个对象的引用而已。
|
||||
2. 栈区(Stack):方法、局部变量和类的实例变量就是在这个区域分配的。
|
||||
3. 代码区(Code):这个区域存放了程序的字节码。
|
||||
4. 静态区(Static):这个区域存放了程序的静态数据和静态方法。
|
||||
1. <ruby>堆区<rt>Heap</rt></ruby>:对象实例就是在这个区域分配的。不过,当我们声明一个对象时,堆中不会发生任何内存分配,只是在栈中创建了一个对象的引用而已。
|
||||
2. <ruby>栈区<rt>Stack</rt></ruby>:方法、局部变量和类的实例变量就是在这个区域分配的。
|
||||
3. <ruby>代码区<rt>Code</rt></ruby>:这个区域存放了程序的字节码。
|
||||
4. <ruby>静态区<rt>Static</rt></ruby>:这个区域存放了程序的静态数据和静态方法。
|
||||
|
||||
### 什么是自动垃圾回收?
|
||||
|
||||
@ -34,13 +33,13 @@ Java 程序的内存空间被划分为以下四个区域:
|
||||
|
||||
垃圾回收的基本步骤如下:
|
||||
|
||||
#### 1. 标记已使用和未使用的对象
|
||||
#### 1、标记已使用和未使用的对象
|
||||
|
||||
在这一步骤中,已使用和未使用的对象会被分别做上标记。这是一个及其耗时的过程,因为需要扫描内存中的所有对象,才能够确定它们是否正在被使用。
|
||||
|
||||
![标记已使用和未使用的对象][2]
|
||||
|
||||
#### 2. 扫描/删除对象
|
||||
#### 2、扫描/删除对象
|
||||
|
||||
有两种不同的扫描和删除算法:
|
||||
|
||||
@ -62,56 +61,56 @@ Java 程序的内存空间被划分为以下四个区域:
|
||||
|
||||
为了提升垃圾回收中的“标记清除”的效率,JVM 将对内存划分成以下三个“代”:
|
||||
|
||||
* 年轻代
|
||||
* 老年代
|
||||
* 永久代
|
||||
* <ruby>新生代<rt>Young Generation</rt></ruby>
|
||||
* <ruby>老年代<rt>Old Generation</rt></ruby>
|
||||
* <ruby>永久代<rt>Permanent Generation</rt></ruby>
|
||||
|
||||
![Hotspot 堆内存结构][5]
|
||||
|
||||
下面我将介绍每个“代”及其主要特征。
|
||||
|
||||
#### 年轻代
|
||||
#### 新生代
|
||||
|
||||
所有创建不久的对象都存放在这里。年轻代被进一步分为以下两个区域:
|
||||
所有创建不久的对象都存放在这里。新生代被进一步分为以下两个区域:
|
||||
|
||||
1. 伊甸区(Eden):所有新创建的对象都在此处分配内存。
|
||||
2. 幸存者区(Survivor,分为 S0 和 S1):经历过一次垃圾回收后,仍然存活的对象会被移动到两个幸存者区中的一个。
|
||||
1. <ruby>伊甸区<rt>Eden</rt></ruby>:所有新创建的对象都在此处分配内存。
|
||||
2. <ruby>幸存者区<rt>Survivor</rt></ruby>,分为 S0 和 S1:经历过一次垃圾回收后,仍然存活的对象会被移动到两个幸存者区中的一个。
|
||||
|
||||
![对象分配][6]
|
||||
|
||||
在年轻代发生的分代垃圾回收被称为 “Minor GC”。Minor GC 过程中的每个阶段都是“<ruby>停止世界<rt>Stop The World</rt></ruby>”(STW)的,这会导致其他应用程序暂停运行,直到垃圾回收结束。这也是 Minor GC 更快的原因。
|
||||
在新生代发生的分代垃圾回收被称为 “<ruby>次要回收<rt>Minor GC</rt></ruby>”(LCTT 译注:也称为“<ruby>新生代回收<rt>Young GC</rt></ruby>”)。Minor GC 过程中的每个阶段都是“<ruby>停止世界<rt>Stop The World</rt></ruby>”(STW)的,这会导致其他应用程序暂停运行,直到垃圾回收结束。这也是次要回收更快的原因。
|
||||
|
||||
一句话总结:伊甸区存放了所有新创建的对象,当它的可用空间被耗尽,第一次垃圾回收就会被触发。
|
||||
|
||||
![填充伊甸区][7]
|
||||
|
||||
Minor GC:在该垃圾回收过程中,所有存活和死亡的对象都会被做上标记。其中,存活对象会被移动到 S0 幸存者区。当所有存活对象都被移动到了 S0,未被引用的对象就会被删除。
|
||||
次要回收:在该垃圾回收过程中,所有存活和死亡的对象都会被做上标记。其中,存活对象会被移动到 S0 幸存者区。当所有存活对象都被移动到了 S0,未被引用的对象就会被删除。
|
||||
|
||||
![拷贝被引用的对象][8]
|
||||
|
||||
S0 中的对象年龄为 1,因为它们挺过了一次 Minor GC。此时,伊甸区和 S1 都是空的。
|
||||
S0 中的对象年龄为 1,因为它们挺过了一次次要回收。此时,伊甸区和 S1 都是空的。
|
||||
|
||||
每当完成清理后,伊甸区就会再次接受新的存活对象。随着时间的推移,伊甸区和 S0 中的某些对象被宣判死亡(不再被引用),并且伊甸区的可用空间也再次耗尽(填满了),那么 Minor GC 又将再次被触发。
|
||||
每当完成清理后,伊甸区就会再次接受新的存活对象。随着时间的推移,伊甸区和 S0 中的某些对象被宣判死亡(不再被引用),并且伊甸区的可用空间也再次耗尽(填满了),那么次要回收 又将再次被触发。
|
||||
|
||||
![对象年龄增长][9]
|
||||
|
||||
这一次,伊甸区和 S0 中的死亡和存活的对象会被做上标记。其中,伊甸区的存活对象会被移动到 S1,并且年龄增加至 1。S0 中的存活对象也会被移动到 S1,并且年龄增加至 2(因为它们挺过了两次 Minor GC)。此时,伊甸区和 S0 又是空的了。每次 Minor GC 之后,伊甸区和两个幸存者区中的一个都会是空的。
|
||||
这一次,伊甸区和 S0 中的死亡和存活的对象会被做上标记。其中,伊甸区的存活对象会被移动到 S1,并且年龄增加至 1。S0 中的存活对象也会被移动到 S1,并且年龄增加至 2(因为它们挺过了两次次要回收)。此时,伊甸区和 S0 又是空的了。每次次要回收之后,伊甸区和两个幸存者区中的一个都会是空的。
|
||||
|
||||
新对象总是在伊甸区被创建,周而复始。当下一次垃圾回收发生时,伊甸区和 S1 都会被清理,它们中的存活对象会被移动到 S0 区。每次 Minor GC 之后,这两个幸存者区(S0 和 S1)就会交换一次。
|
||||
新对象总是在伊甸区被创建,周而复始。当下一次垃圾回收发生时,伊甸区和 S1 都会被清理,它们中的存活对象会被移动到 S0 区。每次次要回收之后,这两个幸存者区(S0 和 S1)就会交换一次。
|
||||
|
||||
![额外年龄增长][10]
|
||||
|
||||
这个过程会一直进行下去,直到某个存活对象的年龄达到了某个阈值,然后它就会被移动到一个叫做“老年代”的地方,这是通过一个叫做“晋升”的过程来完成的。
|
||||
|
||||
使用 `-Xmn` 选项可以设置年轻代的大小。
|
||||
使用 `-Xmn` 选项可以设置新生代的大小。
|
||||
|
||||
### 老年代
|
||||
|
||||
这个区域存放着那些挺过了许多次 Minor GC,并且达到了某个年龄阈值的对象。
|
||||
这个区域存放着那些挺过了许多次次要回收,并且达到了某个年龄阈值的对象。
|
||||
|
||||
![晋升][11]
|
||||
|
||||
在上面这个示例图表中,晋升的年龄阈值为 8。在老年代发生的垃圾回收被称为 “Major GC”。
|
||||
在上面这个示例图表中,晋升的年龄阈值为 8。在老年代发生的垃圾回收被称为 “<ruby>主要回收<rt>Major GC</rt></ruby>”。(LCTT 译注:也被称为“<ruby>全回收<rt>Full GC</rt></ruby>”)
|
||||
|
||||
使用 `-Xms` 和 `-Xmx` 选项可以分别设置堆内存大小的初始值和最大值。(LCTT 译注:结合上面的 `-Xmn` 选项,就可以间接设置老年代的大小了。)
|
||||
|
||||
@ -123,13 +122,13 @@ S0 中的对象年龄为 1,因为它们挺过了一次 Minor GC。此时,伊
|
||||
|
||||
#### 元空间
|
||||
|
||||
Java 8 引入了元空间,并用它替换了永久代。这么做的好处是自动调整大小,避免了 <ruby>内存不足<rt>OutOfMemory</rt></ruby>(OOM)错误。
|
||||
Java 8 引入了<ruby>元空间<rt>Metaspace</rt></ruby>,并用它替换了永久代。这么做的好处是自动调整大小,避免了 <ruby>内存不足<rt>OutOfMemory</rt></ruby>(OOM)错误。
|
||||
|
||||
### 总结
|
||||
|
||||
本文讨论了各种不同的 JVM 内存“代”,以及它们是如何在分代垃圾回收算法中起作用的。对于程序员来说,掌握 Java 的内存管理机制并不是必须的,但它能够帮助你更好地理解 JVM 处理程序中的变量和类实例的方式。这种理解使你能够规划和排除代码故障,并理解特定平台固有的潜在限制。
|
||||
|
||||
正文配图来自:Jayashree Huttanagoudar,CC BY-SA 4.0
|
||||
*正文配图来自:Jayashree Huttanagoudar,CC BY-SA 4.0*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -138,7 +137,7 @@ via: https://opensource.com/article/22/6/garbage-collection-java-virtual-machine
|
||||
作者:[Jayashree Huttanagoudar][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,65 +3,68 @@
|
||||
[#]: author: "Pradeep Kumar https://www.linuxtechi.com/author/pradeep/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14750-1.html"
|
||||
|
||||
如何启动 Ubuntu 22.04 进入救援/紧急模式
|
||||
======
|
||||
极客们好,将 Ubuntu 22.04(Jammy Jellyfish)启动到救援和紧急模式有助于重置忘记的用户密码,修复文件系统错误以及在启动过程中禁用或启用 systemd 服务。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/24/101647n4nru1ayaw4nrnue.jpg)
|
||||
|
||||
极客们好,将 Ubuntu 22.04(Jammy Jellyfish)启动到<ruby>救援<rt>Rescue</rt></ruby>和<ruby>紧急<rt>Emergency</rt></ruby>模式可以重置忘记的用户密码、修复文件系统错误,以及在启动过程中禁用或启用 systemd 服务。
|
||||
|
||||
在这篇文章中,我们将学习如何启动 Ubuntu 22.04 LTS 系统进入救援和应急模式。救援模式类似于单用户模式,所有的故障排除步骤都在这里进行。救援模式加载最小的环境并挂载根文件系统。
|
||||
|
||||
而在紧急模式下,我们得到的是单用户 shell,而不启动任何系统服务。因此,当我们无法启动系统进入救援模式时,就需要紧急模式。
|
||||
而在紧急模式下,我们得到的是单用户 Shell,而不启动任何系统服务。因此,当我们无法启动系统进入救援模式时,就需要紧急模式。
|
||||
|
||||
### 启动 Ubuntu 22.04 进入救援或单用户模式
|
||||
|
||||
前往你想启动到救援或单用户模式的目标系统。在启动时按下 “SHIFT+ESC” 键,进入 grub bootloader 页面。
|
||||
前往你想启动到救援或单用户模式的目标系统。在启动时按下 `SHIFT + ESC` 键,进入 GRUB 引导加载器页面。
|
||||
|
||||
![Default-Grub-Screen-Ubuntu-22-04][1]
|
||||
|
||||
选择第一个选项 Ubuntu,并按 “e” 键进入编辑模式。
|
||||
选择第一个选项 “Ubuntu”,并按 `e` 键进入编辑模式。
|
||||
|
||||
在以 linux 开头的一行末尾,删除字符串 “$vt_handoff” 并添加字符串 “systemd.unit=rescue.target”。
|
||||
在以 `linux` 开头的一行末尾,删除字符串 `$vt_handoff` 并添加字符串 `systemd.unit=rescue.target`。
|
||||
|
||||
![rescue-target-ubuntu-22-04][2]
|
||||
|
||||
做完修改后,按 Ctrl+x 或 F10 在救援模式下启动。
|
||||
做完修改后,按 `Ctrl + X` 或 `F10` 在救援模式下启动。
|
||||
|
||||
![Troubleshooting-Commands-in-Rescue-Mode][3]
|
||||
|
||||
进入救援模式后,运行所有的故障排除命令,并运行 “systemctl reboot” 命令来重启系统。
|
||||
进入救援模式后,运行所有的故障排除命令,并运行 `systemctl reboot` 命令来重启系统。
|
||||
|
||||
### 另一种启动系统进入救援模式的方法
|
||||
|
||||
重新启动系统并按下 “ESC+Shift” 键,进入 grub 启动界面。
|
||||
重新启动系统并按下 `ESC + Shift` 键,进入 GRUB 启动界面。
|
||||
|
||||
选择第二个选项 “Advanced Options for Ubuntu”->选择恢复模式选项并点击回车->选择 Root(进入 root shell 提示)。
|
||||
选择第二个选项 “<ruby>Ubuntu 高级选项<rt>Advanced Options for Ubuntu</rt></ruby>”->选择“<ruby>恢复模式<rt>recovery mode</rt></ruby>”选项并点击回车->选择 <ruby>root(进入 root shell 提示符)<rt>root (Drop to root shell prompt)</rt></ruby>。
|
||||
|
||||
下面是一个例子
|
||||
下面是一个例子:
|
||||
|
||||
![Boot-Ubuntu-22-04-Rescue-Mode][4]
|
||||
|
||||
当你有了 root shell,运行命令来恢复和修复系统问题,最后使用 “systemctl reboot” 来重启系统。
|
||||
当你有了 root Shell,运行命令来恢复和修复系统问题,最后使用 `systemctl reboot` 来重启系统。
|
||||
|
||||
### 引导 Ubuntu 22.04 进入紧急模式
|
||||
|
||||
要启动系统进入紧急模式,首先进入 grub 页面。
|
||||
要启动系统进入紧急模式,首先进入 GRUB 页面。
|
||||
|
||||
![Default-Grub-Screen-Ubuntu-22-04][5]
|
||||
|
||||
选择第一个选项 “Ubuntu” 并按 “e” 键进行编辑。寻找以 linux 开头的一行,移到该行的末尾,删除字符串 $vt_handoff 并添加字符串 “systemd.unit=emergency.target”。
|
||||
选择第一个选项 “Ubuntu” 并按 `e` 键进行编辑。寻找以 `linux` 开头的一行,移到该行的末尾,删除字符串 `$vt_handoff` 并添加字符串 `systemd.unit=emergency.target`。
|
||||
|
||||
![Emergency-Mode-Ubuntu-22-04][6]
|
||||
|
||||
按 Ctrl+x 或 F10 将系统启动到紧急模式。
|
||||
按 `Ctrl + X` 或 `F10` 将系统启动到紧急模式。
|
||||
|
||||
![Command-in-Emergency-Mode-Ubuntu-22-04][7]
|
||||
|
||||
同样,在救援模式下,你可以在这个模式下执行所有的故障排除,完成后,就用 “systemctl reboot” 命令重启系统。
|
||||
同样,在紧急模式下,你可以在这个模式下执行所有的故障排除,完成后,就用 `systemctl reboot` 命令重启系统。
|
||||
|
||||
这篇文章的内容就这些。我发现它内容丰富,不要犹豫,在你的技术朋友中分享这个。请在下面的评论区发表你的疑问和反馈。
|
||||
这篇文章的内容就这些。文章内容丰富,不要犹豫,请在你的技术朋友中分享它。请在下面的评论区发表你的疑问和反馈。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -70,7 +73,7 @@ via: https://www.linuxtechi.com/boot-ubuntu-22-04-rescue-emergency-mode/
|
||||
作者:[Pradeep Kumar][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
143
published/202206/20220607 Integrating Zeek with ELK Stack.md
Normal file
143
published/202206/20220607 Integrating Zeek with ELK Stack.md
Normal file
@ -0,0 +1,143 @@
|
||||
[#]: subject: "Integrating Zeek with ELK Stack"
|
||||
[#]: via: "https://www.opensourceforu.com/2022/06/integrating-zeek-with-elk-stack/"
|
||||
[#]: author: "Tridev Reddy https://www.opensourceforu.com/author/tridev-reddy/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14770-1.html"
|
||||
|
||||
将 Zeek 与 ELK 栈集成
|
||||
======
|
||||
|
||||
> Zeek 是一个开源的网络安全监控工具。本文讨论了如何将 Zeek 与 ELK 集成。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/28/164550v4nuk3g7ux77y77v.jpg)
|
||||
|
||||
在本杂志 2022 年 3 月版发表的题为“用 Zeek 轻松实现网络安全监控”的文章中,我们研究了 Zeek 的功能,并学习了如何开始使用它。现在我们将把我们的学习经验再进一步,看看如何将其与 ELK(即 Elasticsearch、Kibana、Beats 和 Logstash)整合。
|
||||
|
||||
为此,我们将使用一个叫做 Filebeat 的工具,它可以监控、收集并转发日志到 Elasticsearch。我们将把 Filebeat 和 Zeek 配置在一起,这样后者收集的数据将被转发并集中到我们的 Kibana 仪表盘上。
|
||||
|
||||
### 安装 Filebeat
|
||||
|
||||
让我们首先将 Filebeat 与 Zeek 安装在一起。使用 `apt` 来安装 Filebeat,使用以下命令:
|
||||
|
||||
```
|
||||
sudo apt install filebeat
|
||||
```
|
||||
|
||||
接下来,我们需要配置 `.yml` 文件,它位于 `/etc/filebeat/` 文件夹中:
|
||||
|
||||
```
|
||||
sudo nano /etc/filebeat/filebeat.yml
|
||||
```
|
||||
|
||||
我们只需要在这里配置两件事。在 Filebeat 输入部分,将类型改为 `log`,并取消对 `enabled:false` 的注释,将其改为 `true`。我们还需要指定存储日志的路径,也就是说,我们需要指定 `/opt/zeek/logs/current/*.log`。
|
||||
|
||||
完成这些后,设置的第一部分应该类似于图 1 所示的内容。
|
||||
|
||||
![Figure 1: Filebeat config (a)][2]
|
||||
|
||||
第二件要修改的事情是在输出下的 Elasticsearch 输出部分,取消对 `output.elasticsearch` 和 `hosts` 的注释。确保主机的 URL 和端口号与你安装 ELK 时配置的相似。我们把它保持为 `localhost`,端口号为 `9200`。
|
||||
|
||||
在同一部分中,取消底部的用户名和密码的注释,输入安装后配置 ELK 时生成的 Elasticsearch 用户的用户名和密码。完成这些后,参考图 2,检查设置。
|
||||
|
||||
![Figure 2: Filebeat config (b)][3]
|
||||
|
||||
现在我们已经完成了安装和配置,我们需要配置 Zeek,使其以 JSON 格式存储日志。为此,确保你的 Zeek 实例已经停止。如果没有,执行下面的命令来停止它:
|
||||
|
||||
```
|
||||
cd /opt/zeek/bin
|
||||
./zeekctl stop
|
||||
```
|
||||
|
||||
现在我们需要在 `local.zeek` 中添加一小行,它存在于 `opt/zeek/share/zeek/site/` 目录中。
|
||||
|
||||
以 root 身份打开该文件,添加以下行:
|
||||
|
||||
```
|
||||
@load policy/tuning/json-logs.zeek
|
||||
```
|
||||
|
||||
参考图 3,确保设置正确。
|
||||
|
||||
![Figure 3: local.zeek file][4]
|
||||
|
||||
由于我们改变了 Zeek 的一些配置,我们需要重新部署它,这可以通过执行以下命令来完成:
|
||||
|
||||
```
|
||||
cd /opt/zeek/bin
|
||||
./zeekctl deploy
|
||||
```
|
||||
|
||||
现在我们需要在 Filebeat 中启用 Zeek 模块,以便它转发 Zeek 的日志。执行下面的命令:
|
||||
|
||||
```
|
||||
sudo filebeat modules enable zeek
|
||||
```
|
||||
|
||||
我们几乎要好了。在最后一步,配置 `zeek.yml` 文件要记录什么类型的数据。这可以通过修改 `/etc/filebeat/modules.d/zeek.yml` 文件完成。
|
||||
|
||||
在这个 .yml 文件中,我们必须提到这些指定的日志存放在哪个目录下。我们知道,这些日志存储在当前文件夹中,其中有几个文件,如 `dns.log`、`conn.log`、`dhcp.log` 等等。我们需要在每个部分提到每个路径。如果而且只有在你不需要该文件/程序的日志时,你可以通过把启用值改为 `false` 来舍弃不需要的文件。
|
||||
|
||||
例如,对于 `dns`,确保启用值为 `true`,并且路径被配置:
|
||||
|
||||
```
|
||||
var.paths: [ “/opt/zeek/logs/current/dns.log”, “/opt/zeek/logs/*.dns.json” ]
|
||||
```
|
||||
|
||||
对其余的文件重复这样做。我们对一些我们需要的文件做了这个处理。我们添加了所有主要需要的文件。你也可以这样做。请参考图 4。
|
||||
|
||||
![Figure 4: zeek.yml configuration][5]
|
||||
|
||||
现在是启动 Filebeat 的时候了。执行以下命令:
|
||||
|
||||
```
|
||||
sudo filebeat setup
|
||||
sudo service filebeat start
|
||||
```
|
||||
|
||||
现在一切都完成了,让我们移动到 Kibana 仪表板,检查我们是否通过 Filebeat 接收到来自 Zeek 的数据。
|
||||
|
||||
![Figure 5: Dashboard of Kibana (Destination Geo)][6]
|
||||
|
||||
进入仪表板。你可以看到它所捕获的数据的清晰统计分析(图 5 和图 6)。
|
||||
|
||||
![Figure 6: Dashboard of Kibana (Network)][7]
|
||||
|
||||
现在让我们进入发现选项卡,通过使用查询进行过滤来检查结果:
|
||||
|
||||
```
|
||||
event.module: "zeek"
|
||||
```
|
||||
|
||||
这个查询将过滤它在一定时间内收到的所有数据,只向我们显示名为 Zeek 的模块的数据(图 7)。
|
||||
|
||||
![Figure 7: Filtered data by event.module query][8]
|
||||
|
||||
### 鸣谢
|
||||
|
||||
*作者感谢 VIT-AP 计算机科学与工程学院的 Sibi Chakkaravarthy Sethuraman、Sudhakar Ilango、Nandha Kumar R.和Anupama Namburu 的不断指导和支持。特别感谢人工智能和机器人技术卓越中心(AIR)。*
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2022/06/integrating-zeek-with-elk-stack/
|
||||
|
||||
作者:[Tridev Reddy][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.opensourceforu.com/author/tridev-reddy/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Integrating-Zeek-with-ELK-Stack-Featured-image.jpg
|
||||
[2]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-1-Filebeat-config-a.jpg
|
||||
[3]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-2-Filebeat-config-b.jpg
|
||||
[4]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-3-local.zeek-file-1.jpg
|
||||
[5]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-4-zeek.yml-configuration.jpg
|
||||
[6]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-5-Dashboard-of-Kibana-Destination-Geo.jpg
|
||||
[7]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-6-Dashboard-of-Kibana-Network-1.jpg
|
||||
[8]: https://www.opensourceforu.com/wp-content/uploads/2022/04/Figure-7-Filtered-data-by-event.jpg
|
@ -3,41 +3,44 @@
|
||||
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lightchaserhy"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14735-1.html"
|
||||
|
||||
我如何利用 Linux Xface 桌面赋予旧电脑新生命
|
||||
我如何利用 Xfce 桌面为旧电脑赋予新生
|
||||
======
|
||||
当我为了一场会议的样例演示,用笔记本电脑安装 Linux 系统后,发现旧电脑运行 Linux 系统和 Xfce 桌面非常流畅。
|
||||
|
||||
几周前,我要在一个会议上简要演示自己在 Linux 下编写的一款小软件。我需要带一台 Linux 笔记本电脑参会,因此我翻出一台旧笔记本电脑并且安装上 Linux 系统。我使用的是 Fedora 36 Xfce spin,使用还不错。
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/20/143325vfdibhvv22qvddiv.jpg)
|
||||
|
||||
这台我用的笔记本是在 2012 年购买的。1.70 GHZ 的 CPU,4 GB 的 内存,128 GB 的驱动器,也许和我现在的桌面电脑比性能很弱,但是 Linux 和 Xfce 桌面赋予这台旧电脑新的生命。
|
||||
> 当我为了在一场会议上做演示,用笔记本电脑安装 Linux 系统后,发现 Linux 和 Xfce 桌面让我的这台旧电脑健步如飞。
|
||||
|
||||
几周前,我要在一个会议上简要演示自己在 Linux 下编写的一款小软件。我需要带一台 Linux 笔记本电脑参会,因此我翻出一台旧笔记本电脑,并且安装上 Linux 系统。我使用的是 Fedora 36 Xfce 版,使用还不错。
|
||||
|
||||
这台我用的笔记本是在 2012 年购买的。1.70 GHZ 的 CPU、4 GB 的 内存、128 GB 的硬盘,也许和我现在的桌面电脑比性能很弱,但是 Linux 和 Xfce 桌面赋予了这台旧电脑新的生命。
|
||||
|
||||
### Linux 的 Xfce 桌面
|
||||
|
||||
Xfce 桌面是一个轻量级桌面,它提供一个精美、现代的外观。熟悉的界面,有任务栏或者顶部“面板”可以启动应用程序,在系统托盘可以改变虚拟桌面,或者查看通知信息。
|
||||
Xfce 桌面是一个轻量级桌面,它提供一个精美、现代的外观。熟悉的界面,有任务栏或者顶部“面板”可以启动应用程序,在系统托盘可以改变虚拟桌面,或者查看通知信息。屏幕底部的快速访问停靠区让你可以启动经常使用的应用程序,如终端、文件管理器和网络浏览器。
|
||||
|
||||
![Image of Xfce desktop][6]
|
||||
|
||||
要开始一个新应用程序,点击左上角的应用程序按钮。这将打开一个应用程序启动菜单,顶部有常用的应用程序比如终端和文件管理。另外的应用程序会分组排列,这样你可以找到所需要的应用。
|
||||
要开始一个新应用程序,点击左上角的应用程序按钮。这将打开一个应用程序启动菜单,顶部有常用的应用程序,比如终端和文件管理。其它的应用程序会分组排列,这样你可以找到所需要的应用。
|
||||
|
||||
![Image of desktop applications][7]
|
||||
|
||||
### 管理文件
|
||||
|
||||
Xfce 的文件管理器时叫 Thunar,它能非常好地管理我的文件。我喜欢 Thunar 可以连接远程系统,在家里,我用一个开启 SSH 的树莓派作为个人文件服务器。Thunar 可以打开一个 SSH 文件传输窗口,这样我可以在笔记本电脑和树莓派之间拷贝文件。
|
||||
Xfce 的文件管理器时叫 Thunar,它能很好地管理我的文件。我喜欢 Thunar 可以连接远程系统,在家里,我用一个开启 SSH 的树莓派作为个人文件服务器。Thunar 可以打开一个 SSH 文件传输窗口,这样我可以在笔记本电脑和树莓派之间拷贝文件。
|
||||
|
||||
![Image of Thunar remote][9]
|
||||
|
||||
另一个访问文件和文件夹的方式是通过屏幕底部的快速访问停靠栏。点击文件夹图标可以打开一个常规操作菜单,如在终端窗口打开一个文件夹、新建一个文件夹或进入指定文件夹等。
|
||||
另一个访问文件和文件夹的方式是通过屏幕底部的快速访问停靠区。点击文件夹图标可以打开一个常用操作的菜单,如在终端窗口打开一个文件夹、新建一个文件夹或进入指定文件夹等。
|
||||
|
||||
![Image of desktop with open folders][10]
|
||||
|
||||
### 其它应用程序
|
||||
|
||||
我热爱探索 Xfce 提供的其他应用程序。Mousepad 看起来像一个简单的文本编辑器,但是比起纯文本编辑,它包含更多有用的功能。Mousepad 支持许多文件类型,程序员和其他高级用户也许会非常喜欢。在文档菜单检验一下可用的部分编程语言列表。
|
||||
我喜欢探索 Xfce 提供的其他应用程序。Mousepad 看起来像一个简单的文本编辑器,但是比起纯文本编辑,它包含更多有用的功能。Mousepad 支持许多文件类型,程序员和其他高级用户也许会非常喜欢。可以在文档菜单中查看一下部分编程语言的列表。
|
||||
|
||||
![Image of Mousepad file types][11]
|
||||
|
||||
@ -46,21 +49,20 @@ Xfce 的文件管理器时叫 Thunar,它能非常好地管理我的文件。
|
||||
![Image of Mousepad in color scheme solarized][12]
|
||||
|
||||
磁盘工具可以让你管理储存设备。虽然我不需要修改我的系统磁盘,磁盘工具是一个初始化或重新格式化 USB 闪存设备的好方式。我认为这个界面非常简单好用。
|
||||
|
||||
![Image of disk utility][13]
|
||||
|
||||
我非常钦佩带有 Geany 集成开发的环境,我有一点惊讶一个旧系统可以如此流畅地运行一个完整的 IDE 开发软件。
|
||||
Geany 集成开发环境也给我留下了深刻印象,我有点惊讶于一个完整的集成开发软件(IDE)可以在一个旧系统可以如此流畅地运行。Geany 宣称自己是一个“强大、稳定和轻量级的程序员文本编辑器,提供大量有用的功能,而不会拖累你的工作流程”。而这正是 Geany 所提供的。
|
||||
|
||||
我用一个简单的 “hello world” 程序测试 Geany,当我输入每一个函数名称时,很高兴地看到 IDE 弹出语法帮助,弹出的信息并不唐突且刚好提供了我需要的信息。同时 printf 函数非常容易记住,我总是忘记其它函数的选项顺序,比如 fputs 和 realloc,这就是我需要弹出语法帮助的地方。
|
||||
我用一个简单的 “hello world” 程序测试 Geany,当我输入每一个函数名称时,很高兴地看到 IDE 弹出语法帮助,弹出的信息并不特别显眼,且刚好提供了我需要的信息。虽然我能很容易记住 `printf` 函数,但总是忘记诸如 `fputs` 和 `realloc` 之类的函数的选项顺序,这就是我需要弹出语法帮助的地方。
|
||||
|
||||
![Image of Geany workspace][14]
|
||||
|
||||
在 Xfce 里探索菜单寻找其它应用程序让你的工作更简单,你将找到可以播放音乐、访问终端或浏览网页的应用程序。
|
||||
深入了解 Xfce 的菜单,寻找其它应用程序,让你的工作更简单,你将找到可以播放音乐、访问终端或浏览网页的应用程序。
|
||||
|
||||
当我安装 Linux 到笔记本电脑,在会议上演示一些样例后,发现 Linux 和 Xfce 桌面让这台旧电脑变得更时尚。这个系统运行得如此流畅,当会议结束后,我决定把这台笔记本电脑作为备用机。
|
||||
当我在笔记本电脑上安装了 Linux,在会议上做了一些演示后,我发现 Linux 和 Xfce 桌面让这台旧电脑变得相当敏捷。这个系统运行得如此流畅,以至于当会议结束后,我决定把这台笔记本电脑作为备用机。
|
||||
|
||||
我喜爱在 Xfce 上使用应用程序工作,尽管它有非常低的系统开销和极简单的方法,但我并没有感觉到不够用,我可以用 Xfce 和上面的应用程序做任何事情。如果你有一台需要翻新的旧电脑,试试安装 Linux,给旧硬件带来新的生命。
|
||||
|
||||
图片来源: (Jim Hall, CC BY-SA 40)
|
||||
我确实喜欢在 Xfce 中工作和使用这些应用程序,尽管系统开销不大,使用也很简单,但我并没有感觉到不够用,我可以用 Xfce 和上面的应用程序做任何事情。如果你有一台需要翻新的旧电脑,试试安装 Linux,给旧硬件带来新的生命。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -69,7 +71,7 @@ via: https://opensource.com/article/22/6/linux-xfce-old-laptop
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lightchaserhy](https://github.com/lightchaserhy)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,27 +3,26 @@
|
||||
[#]: author: "Michael Korotaev https://opensource.com/users/michaelk"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14761-1.html"
|
||||
|
||||
用这些开源工具在 Linux 上编辑 PDF 文件
|
||||
======
|
||||
Adobe Acrobat 的开源替代品具有创建、编辑和注释 PDF 的所有必要功能。
|
||||
|
||||
![a checklist for a team][1]
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/26/152728d3kajokj34t3agwm.jpg)
|
||||
|
||||
图片由:Opensource.com
|
||||
> Adobe Acrobat 的开源替代品具有创建、编辑和注释 PDF 的所有必要功能。
|
||||
|
||||
开源的 PDF 阅读和编辑工具通常比 “PDF 编辑器”搜索结果第一页中的应用更安全和可靠。在那里,你很可能看到带有隐藏限制和关税的专有应用,缺乏关于数据保护政策和托管的足够信息。你可以有更好的。
|
||||
开源的 PDF 阅读和编辑工具通常比 “PDF 编辑器” 搜索结果第一页中的应用更安全和可靠。在那里,你很可能看到带有隐藏的限制和关税的专有应用,缺乏关于数据保护政策和托管的足够信息。你可以有更好的。
|
||||
|
||||
这里有五个应用,可以安装在你的 Linux 系统上(和其他系统)或托管在服务器上。每一个都是免费和开源的,具有创建、编辑和注释 PDF 文件的所有必要功能。
|
||||
这里有五个应用,可以安装在你的 Linux 系统上(和其他系统)或托管在服务器上。每一个都是自由而开源的,具有创建、编辑和注释 PDF 文件的所有必要功能。
|
||||
|
||||
### LibreOffice
|
||||
|
||||
使用 [LibreOffice][2] 套件,你对应用的选择取决于最初的任务。虽然文字处理器 LibreOffice Writer,可以让你创建 PDF 文件,并从 ODF 和其他文本格式导出,但 Draw 更适合于处理现有的 PDF 文件。
|
||||
|
||||
Draw 是用来创建和编辑图形文件的,如小册子、杂志和海报。因此,该工具集主要集中在视觉对象和布局上。然而,对于 PDF 编辑,当文件具有编辑属性时,LibreOffice Draw 提供了用于修改和添加 PDF 内容的工具。如果没有的话,你仍然可以在现有的内容层上添加新的文本字段,并对文件进行注释或完成。
|
||||
Draw 是用来创建和编辑图形文件的,如小册子、杂志和海报。因此,其工具集主要用于视觉对象和布局上。然而,对于 PDF 编辑,当文件具有可编辑属性时,LibreOffice Draw 提供了用于修改和添加 PDF 内容的工具。如果没有的话,你仍然可以在现有的内容层上添加新的文本字段,并对文件进行注释或完成。
|
||||
|
||||
Draw 和 Writer 都被捆绑在 LibreOffice 桌面套件中,可在 Linux 系统、macOS 和 Windows 上安装。
|
||||
|
||||
@ -39,7 +38,7 @@ ONLYOFFICE Docs 可以作为一个网络套件(内部或云端)集成到文
|
||||
|
||||
### PDF Arranger
|
||||
|
||||
[PDF Arranger][4] 是 PikePDF 库的一个前端应用。它不像 LibreOffice 和 ONLYOFFICE 那样对 PDF 的内容进行编辑,但它对于重新排序页面、将 PDF 分割成更小的文件、将几个 PDF 合并成一个、旋转或裁剪页面等都很好。它的界面是直观的,易于使用。
|
||||
[PDF Arranger][4] 是 PikePDF 库的一个前端应用。它不像 LibreOffice 和 ONLYOFFICE 那样用于对 PDF 的内容进行编辑,但它对于重新排序页面、将 PDF 分割成更小的文件、将几个 PDF 合并成一个、旋转或裁剪页面等都很好。它的界面是直观的,易于使用。
|
||||
|
||||
PDF Arranger 可用于 Linux 和 Windows。
|
||||
|
||||
@ -67,7 +66,7 @@ Xournal++ 可在 Linux 系统(Ubuntu、Debian、Arch、SUSE)、MacOS 和 Win
|
||||
|
||||
如果你正在寻找一个免费和安全的专有 PDF 浏览和编辑软件的替代品,不难找到一个开源的选择,无论是桌面还是在线使用。只要记住,目前可用的解决方案在不同的使用情况下有各自的优势,没有一个工具在所有可能的任务中都同样出色。
|
||||
|
||||
这五个方案因其功能或对小众 PDF 任务的有用性而脱颖而出。对于企业使用和协作,我建议 ONLYOFFICE 或 LibreOffice Draw。PDF Arranger 是一个简单的、轻量级的工具,当你不需要改变文本时,可以用它来处理页面。Okular 为多种文件类型提供了很好的查看功能,如果你想在 PDF 中画草图和做笔记,Xournal++ 是最佳选择。
|
||||
这五个方案因其功能或对小众 PDF 任务的有用性而脱颖而出。对于企业使用和协作,我建议使用 ONLYOFFICE 或 LibreOffice Draw。PDF Arranger 是一个简单的、轻量级的工具,当你不需要改变文本时,可以用它来处理页面。Okular 为多种文件类型提供了很好的查看功能,如果你想在 PDF 中画草图和做笔记,Xournal++ 是最佳选择。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -76,7 +75,7 @@ via: https://opensource.com/article/22/6/open-source-pdf-editors-linux
|
||||
作者:[Michael Korotaev][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,13 +3,16 @@
|
||||
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14736-1.html"
|
||||
|
||||
使用 Flatseal 管理 Flatpak 的权限
|
||||
======
|
||||
了解如何使用 Flatseal 应用管理 Flatpak 权限,它为你提供了一个友好的 GUI 和额外的功能。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/20/151550qkrkpjw4f9dpjo50.jpg)
|
||||
|
||||
> 了解如何使用 Flatseal 应用管理 Flatpak 权限,它为你提供了一个友好的 GUI 和额外的功能。
|
||||
|
||||
从新用户的角度来看,在 Linux 中安装应用可能是一个挑战。主要原因是有这么多的 [Linux 发行版][1]。而你需要为各种 Linux 发行版提供不同的安装方法或说明。对于一些用户来说,这可能会让他们不知所措。此外,对于开发者来说,为不同的发行版创建独立的软件包和构建也很困难。
|
||||
|
||||
@ -39,7 +42,7 @@ Flatseal 是一个 Flatpak 应用,它为你提供了一个友好的用户界
|
||||
|
||||
当打开 Flatseal 应用时,它应该在左边的导航栏列出所有的 Flatpak 应用。而当你选择了一个应用,它就会在右边的主窗口中显示可用的权限设置。
|
||||
|
||||
现在,对于每个 Flatpak 权限控制,当前值显示在切换开关中。如果该权限正在使用中,它应该被设置。否则,它应该是灰色的。
|
||||
现在,对于每个 Flatpak 权限控制,当前值显示在切换开关中。如果该权限正在使用中,它应该被启用。否则,它应该是灰色的。
|
||||
|
||||
首先,要设置权限,你必须进入你的系统的应用。然后,你可以从权限列表中启用或禁用任何各自的控制。
|
||||
|
||||
@ -57,7 +60,7 @@ Flatseal 是一个 Flatpak 应用,它为你提供了一个友好的用户界
|
||||
|
||||
![Figure 3: Telegram Desktop Flatpak App does not have permission to the home folders][4]
|
||||
|
||||
现在,如果我想允许所有的用户文件和任何特定的文件夹(例如:/home/Downloads),你可以通过打开启用开关来给予它。请看下面的图 4。
|
||||
现在,如果我想允许所有的用户文件和某个特定的文件夹(例如:`/home/Downloads`),你可以通过打开启用开关来给予它。请看下面的图 4。
|
||||
|
||||
![Figure 4: Permission changed of Telegram Desktop to give access to folders][5]
|
||||
|
||||
@ -69,7 +72,7 @@ Flatseal 是一个 Flatpak 应用,它为你提供了一个友好的用户界
|
||||
flatpak override org.telegram.desktop --filesystem=/home/Downloads
|
||||
```
|
||||
|
||||
而要删除:
|
||||
而要删除权限:
|
||||
|
||||
```
|
||||
flatpak override org.telegram.desktop --nofilesystem=/home/Downloads
|
||||
@ -79,7 +82,7 @@ Flatseal 还有一个很酷的功能,它在用户特定的权限变化旁边
|
||||
|
||||
### 我可以在所有的 Linux 发行版中安装 Flatseal 吗?
|
||||
|
||||
是的,你可以把 [Flatseal][6] 作为 Flatpak 安装在所有 Linux 发行版中。你可以使用[本指南][7]设置你的系统,并运行以下命令进行安装。或者,[点击这里][8]直接启动特定系统的安装程序。
|
||||
是的,你可以把 [Flatseal][6] 作为 Flatpak 安装在所有 Linux 发行版中。你可以使用 [本指南][7] 设置你的系统,并运行以下命令进行安装。或者,[点击这里][8] 直接启动特定系统的安装程序。
|
||||
|
||||
```
|
||||
flatpak install flathub com.github.tchx84.Flatseal
|
||||
@ -96,7 +99,7 @@ via: https://www.debugpoint.com/2022/06/manage-flatpak-permission-flatseal/
|
||||
作者:[Arindam][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,178 @@
|
||||
[#]: subject: "Run Windows Apps And Games Using WineZGUI On Linux"
|
||||
[#]: via: "https://ostechnix.com/winezgui-run-windows-apps-and-games-on-linux/"
|
||||
[#]: author: "sk https://ostechnix.com/author/sk/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14744-1.html"
|
||||
|
||||
在 Linux 上使用 WineZGUI 运行 Windows 应用和游戏
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/22/160322tds2ut05d8jqdlzz.jpg)
|
||||
|
||||
> WineZGUI - 一个使用 Zenity 的 Wine GUI 前台
|
||||
|
||||
不久前,我们写了关于 [Bottles][1] 的文章,这是一个开源的图形应用,可以在 Linux 操作系统上轻松运行 Windows 软件和游戏。今天,我们将讨论一个类似的有趣项目。向 **WineZGUI** 打个招呼,它是一个 Wine GUI 前台,可以 [在 Linux 上用 Wine 运行 Windows 应用和游戏][2]。
|
||||
|
||||
### 什么是 WineZGUI?
|
||||
|
||||
WineZGUI 是一个 Bash 脚本的集合,它允许你轻松地管理 Wine 前缀,并在 Linux 上使用 **Zenity** 提供更轻松的 Wine 游戏体验。
|
||||
|
||||
(LCTT 译注:Wine 前缀是一个特殊文件夹,Wine 在其中放置所有 Wine 特定的文件,安装 Windows 程序、库和注册表代码,以及用户首选项。)
|
||||
|
||||
使用 WineZGUI,我们可以直接从文件管理器中启动 Windows EXE 文件或游戏,而无需安装它们。
|
||||
|
||||
WineZGUI 为每个应用或游戏创建快捷方式,以便于访问,同时也为每个 EXE 二进制文件创建单独的前缀。
|
||||
|
||||
当你用 WineZGUI 启动一个 Windows EXE 文件时,它会提示你是否使用默认的 Wine 前缀或创建一个新的前缀。默认的前缀是 `~/.local/share/winezgui/default`。
|
||||
|
||||
如果你选择为 Windows 二进制文件(EXE)创建一个新的前缀,WineZGUI 将尝试从 EXE 文件中提取产品名称和图标,并创建一个桌面快捷方式。
|
||||
|
||||
当你以后启动相同的二进制文件(EXE)时,它将建议你用先前的相关前缀来运行它。
|
||||
|
||||
说得通俗一点,WineZGUI 只是一个用于官方原始 Wine 的简单 GUI。当我们启动一个 EXE 来玩游戏时,Wine 前缀的设置是自动的。
|
||||
|
||||
你只需打开一个 EXE,它就会创建一个前缀和一个桌面快捷方式,并从该 EXE 中提取名称和图标。
|
||||
|
||||
它使用 `exiftool` 和 `icotool` 工具来分别提取名称和图标。你可以通过现有的前缀打开一个 EXE 来启动该游戏,或者使用桌面快捷方式。
|
||||
|
||||
WineZGUI 是一个在 GitHub 上免费托管的 shell 脚本。你可以抓取源代码,改进它,修复错误和增加功能。
|
||||
|
||||
### Bottles Vs WineZGUI
|
||||
|
||||
你可能想知道 WineZGUI 与 Bottles 相比如何。但这些应用之间有一个微妙的区别。
|
||||
|
||||
**Bottles 是面向前缀的**和**面向运行器的**。意思是:Bottles 首先创建一个前缀,然后使用不同的 EXE 文件。Bottles 不会记住 EXE 的前缀。Bottles 使用不同的运行器。
|
||||
|
||||
**WineZGUI 是面向 EXE 的**。它使用 EXE 并只为该 EXE 创建一个前缀。下次我们打开一个 EXE 时,它将询问是否用现有的 EXE 前缀启动。
|
||||
|
||||
WineZGUI 不提供像 Bottles 或 [lutris][3] 那样的高级功能,如运行程序、在线安装程序等。
|
||||
|
||||
### 如何在 Linux 中安装 WineZGUI
|
||||
|
||||
确保你已经安装了 WineZGUI 的必要先决条件。
|
||||
|
||||
Debian/Ubuntu:
|
||||
|
||||
```
|
||||
$ sudo dpkg --add-architecture i386
|
||||
$ sudo apt install zenity wine winetricks libimage-exiftool-perl icoutils gnome-terminal
|
||||
```
|
||||
|
||||
Fedora:
|
||||
|
||||
```
|
||||
$ sudo dnf install zenity wine winetricks perl-Image-ExifTool icoutils gnome-terminal
|
||||
```
|
||||
|
||||
官方推荐的安装 WineZGUI 的方法是使用 [Flatpak][4]。
|
||||
|
||||
安装完 Flatpak 后,逐一运行以下命令,在 Linux 中安装 WineZGUI。
|
||||
|
||||
```
|
||||
$ flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
```
|
||||
|
||||
```
|
||||
$ flatpak --user -y install flathub org.winehq.Wine/x86_64/stable-21.08
|
||||
```
|
||||
|
||||
```
|
||||
$ wget https://github.com/fastrizwaan/WineZGUI-Releases/releases/download/WineZGUI-0.4_20220608/io.github.WineZGUI_0_4_20220608.flatpak
|
||||
```
|
||||
|
||||
```
|
||||
$ flatpak --user -y install io.github.WineZGUI_0_4_20220608.flatpak
|
||||
```
|
||||
|
||||
### 在 Linux 中用 WineZGUI 运行 Windows 应用和游戏
|
||||
|
||||
从 Dash 或菜单中启动 WineZGUI。
|
||||
|
||||
![Launch WineZGUI][5]
|
||||
|
||||
这就是 WineZGUI 的默认界面的样子。
|
||||
|
||||
![WineZGUI Interface][6]
|
||||
|
||||
正如你在上面的截图中看到的,WineZGUI 的界面非常简单易懂。从主窗口中,你可以:
|
||||
|
||||
* 打开一个 EXE 文件。
|
||||
* 打开 Winetricks GUI 和 CLI。
|
||||
* 启动 Wine 配置。
|
||||
* 启动资源管理器。
|
||||
* 打开 BASH Shell。
|
||||
* 关闭所有的应用/游戏,包括 WineZGUI 界面。
|
||||
* 删除 Wine 前缀。
|
||||
* 查看已安装的 WineZGUI 版本。
|
||||
|
||||
为了演示,我将打开一个 EXE 文件。
|
||||
|
||||
在下一个窗口中,选择要运行的 EXE 文件。在我的例子中,它是 WinRAR。
|
||||
|
||||
![Choose The EXE File To Run][7]
|
||||
|
||||
接下来,你是想用默认的前缀运行 EXE 文件,还是创建一个新的前缀。我选择默认的前缀。
|
||||
|
||||
![Run WinRAR With Default Prefix][8]
|
||||
|
||||
几秒钟后,会出现 WinRAR 安装向导。点击安装,继续。
|
||||
|
||||
![Install WinRAR In Linux][9]
|
||||
|
||||
点击 “OK” 来完成 WinRAR 的安装。
|
||||
|
||||
![Complete WinRAR Installation][10]
|
||||
|
||||
点击 “<ruby>运行 WinRAR<rt>Run WinRAR</rt></ruby>” 来启动它。
|
||||
|
||||
![Run WinRAR][11]
|
||||
|
||||
下面是 WinRAR 在我的 Fedora 36 桌面上的运行情况!
|
||||
|
||||
![WinRAR Is Running In Fedora Using Wine][12]
|
||||
|
||||
### 总结
|
||||
|
||||
WineZGUI 是俱乐部的新人。如果你正在寻找一种在 Linux 桌面上使用 Wine 运行 Windows 应用和游戏的更简单方法,WineZGUI 可能是一个不错的选择。
|
||||
|
||||
在 WineZGUI 的帮助下,用户可以选择在与 EXE 相同的文件夹中创建一个 Wine 前缀,并创建一个相对链接的 `.desktop` 条目来自动执行此操作。
|
||||
|
||||
原因是使用 Wine 前缀备份和删除游戏更容易,并且让它生成一个 `.desktop` 将使其能够适应移动和转移。
|
||||
|
||||
一个很酷的场景是使用该应用进行设置,然后将 Wine 前缀分享给你的朋友和其他人,他们只需要一个具有所有依赖性和保存的工作 Wine 前缀。
|
||||
|
||||
请试一试它,在下面的评论区告诉我们你对这个项目的看法。
|
||||
|
||||
**资源:**
|
||||
|
||||
* [WineZGUI GitHub 仓库][13]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://ostechnix.com/winezgui-run-windows-apps-and-games-on-linux/
|
||||
|
||||
作者:[sk][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://ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://ostechnix.com/run-windows-software-on-linux-with-bottles/
|
||||
[2]: https://ostechnix.com/run-windows-games-softwares-ubuntu-16-04/
|
||||
[3]: https://ostechnix.com/manage-games-using-lutris-linux/
|
||||
[4]: https://ostechnix.com/how-to-install-and-use-flatpak-in-linux/
|
||||
[5]: https://ostechnix.com/wp-content/uploads/2022/06/Launch-WineZGUI.png
|
||||
[6]: https://ostechnix.com/wp-content/uploads/2022/06/WineZGUI-Interface.png
|
||||
[7]: https://ostechnix.com/wp-content/uploads/2022/06/Choose-The-EXE-File-To-Run.png
|
||||
[8]: https://ostechnix.com/wp-content/uploads/2022/06/Run-WinRAR-With-Default-Prefix.png
|
||||
[9]: https://ostechnix.com/wp-content/uploads/2022/06/Install-WinRAR-In-Linux.png
|
||||
[10]: https://ostechnix.com/wp-content/uploads/2022/06/Complete-WinRAR-Installation.png
|
||||
[11]: https://ostechnix.com/wp-content/uploads/2022/06/Run-WinRAR.png
|
||||
[12]: https://ostechnix.com/wp-content/uploads/2022/06/WinRAR-Is-Running-In-Fedora-Using-Wine.png
|
||||
[13]: https://github.com/fastrizwaan/WineZGUI
|
@ -3,19 +3,20 @@
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14729-1.html"
|
||||
|
||||
Adobe 推出了开源工具包以减少视觉错误信息
|
||||
为减少视觉错误信息,Adobe 推出了开源工具包
|
||||
======
|
||||
![Adobe][1]
|
||||
|
||||
Adobe 设想了一个充满照片和视频的网络,照片和视频上标注关于它们来自哪里的信息。该公司的主要目标是减少视觉错误信息的传播,不过,该系统也可以使那些“希望将自己的名字与工作关联起来”的内容创作者受益。
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/19/105844yauuhdz1u1189ffr.jpg)
|
||||
|
||||
Adobe 的 <ruby>内容真实性计划<rt>Content Authenticity Initiative</rt></ruby> (CAI) 项目于 2019 年首次宣布,此后,它发布了一份关于实现该目标的技术白皮书,将该系统集成了到自己的软件中,并与新闻编辑室和硬件制造商展开了合作,以帮助普及其愿景。
|
||||
Adobe 设想的是为网络上充斥的照片和视频标注关于它们的来源。该公司的主要目标是减少视觉错误信息的传播,不过,该系统也可以使那些“希望将自己的名字与工作关联起来”的内容创作者受益。
|
||||
|
||||
现在,该公司发布了一个由三部分组成的开源工具包,从而把该技术交到开发人员手中并投入使用。Adobe 的新开源工具包括用于开发“在浏览器中显示内容凭据”的 JavaScript SDK、命令行实用程序和用于开发桌面应用程序、移动应用程序和其他用于创建、查看和验证嵌入式内容凭据的 Rust SDK。
|
||||
Adobe 在 2019 年首次宣布了其 <ruby>内容真实性计划<rt>Content Authenticity Initiative</rt></ruby>(CAI)项目,此后,它发布了一份关于实现该目标的技术白皮书,将该系统集成了到自己的软件中,并与新闻编辑室和硬件制造商展开了合作,以帮助普及其愿景。
|
||||
|
||||
现在,该公司发布了一个由三部分组成的开源工具包,从而把该技术交到开发人员手中,并投入使用。Adobe 的新开源工具包括一个用于开发“在浏览器中显示内容凭据”的 JavaScript SDK、一个命令行实用程序,和一个用于开发桌面应用程序、移动应用程序和其他应用的 Rust SDK,以创建、查看和验证嵌入式内容凭据。
|
||||
|
||||
众所周知,照片的 EXIF 数据中记录了有关光圈和快门速度的信息,这个新标准也采用了这种方式,它还记录有关文件创建的信息,例如文件的创建和编辑方式。如果该公司的共同愿景成真,这些 Adobe 称之为“内容凭证”的元数据,将在社交媒体平台、图像搜索平台、图像编辑器、搜索引擎中广泛可见。
|
||||
|
||||
@ -34,7 +35,7 @@ via: https://www.opensourceforu.com/2022/06/adobe-launches-open-source-toolkit-t
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -4,30 +4,29 @@
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "turbokernel"
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14726-1.html"
|
||||
|
||||
用 tmate 分享你的 Linux 终端
|
||||
======
|
||||
Tmate 扩展了你与 Linux 终端共享会话的选项。
|
||||
|
||||
![Terminal command prompt on orange background][1]
|
||||
> tmate 扩展了你分享 Linux 终端会话的方式。
|
||||
|
||||
图片提供: [iradaturrahmat][2] 通过 [Pixabay][3],CC0
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/18/170815hfrcdfd4lltd737z.jpg)
|
||||
|
||||
作为 Fedora Linux QA 团队的一员,我有时会发现自己执行了一堆我想广播给其他开发者的命令。如果你曾经使用过像 [tmux][5] 或 [GNU Screen][6] 这样的[终端复用器][4],你可能会认为这是一个相对容易的任务。但并不是所有我想看我的演示的人都是从笔记本电脑或台式机连接到我的终端会话的。有些人可能是随便从他们的手机浏览器中打开的,他们可以很容易地做到这一点,因为我使用了[tmate][7]。
|
||||
作为 Fedora Linux QA 团队的一员,我有时想将自己执行的一堆命令广而告之给其他开发者。如果你曾经使用过像 [tmux][5] 或 [GNU Screen][6] 这样的 [终端复用器][4],你可能会认为这是一个挺轻松的任务。不是所有看我的示范的人都是从笔记本电脑或台式机连接到我的终端会话的,有些人可能是随手在他们的手机浏览器中打开的,因为我使用了 [tmate][7],所以他们可以很容易地做到这一点。
|
||||
|
||||
### 使用 tmate 共享 Linux终端
|
||||
### 使用 tmate 分享 Linux 终端
|
||||
|
||||
看别人在 Linux 终端工作是非常有教育意义的。你可以学到新的命令,新的工作流程,或者新的调试和自动化的方法。但要捕捉到你所看到的东西,以便你以后可以自己尝试,这可能很困难。你可能会诉诸于截图或共享终端会话的屏幕记录,这样你就可以在以后打出每个命令。唯一的选择是由演示命令的人使用 [Asciinema][8] 或 [script 和 scriptreplay][9] 等工具来记录会话。
|
||||
观看别人在 Linux 终端的工作是非常有教育意义的。你可以学到新的命令、新的工作流程,或者新的调试和自动化的方法。但要抓住你所看到的东西,以便你以后可以自己尝试,这可能很困难。你可能会借助截图或一个共享终端会话的屏幕记录,这样你就可以在以后打出每个命令。剩下的唯一选择是由演示命令的人使用 [Asciinema][8] 或 [script 和 scriptreplay][9] 等工具来记录会话。
|
||||
|
||||
但是通过 tmate,用户可以在只读模式下或通过 SSH 共享一个终端。SSH 和只读会话都可以通过终端或以 HTML 网页的形式访问。
|
||||
但是通过 `tmate`,用户可以在只读模式下或通过 SSH 分享终端。SSH 和只读会话都可以通过终端或以 HTML 网页的形式访问。
|
||||
|
||||
当我为 Fedora QA 团队培训人员时,我使用只读模式,因为我需要运行命令并显示输出,但有了 tmate,人们可以通过从他们的浏览器复制和粘贴到文本编辑器来保持笔记。
|
||||
当我为 Fedora QA 团队培训人员时,我使用只读模式,因为我需要运行命令并显示输出,但有了 `tmate`,人们可以通过从他们的浏览器复制和粘贴到文本编辑器来记录笔记。
|
||||
|
||||
### Linux tmate 上手
|
||||
|
||||
在 Linux 上,你可以用你的包管理器安装 tmate。例如,在 Fedora 上:
|
||||
在 Linux 上,你可以用你的包管理器安装 `tmate`。例如,在 Fedora 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install tmate
|
||||
@ -39,43 +38,41 @@ $ sudo dnf install tmate
|
||||
$ sudo apt install tmate
|
||||
```
|
||||
|
||||
在 macOS 上,你可以用 [Homebrew][10] 或 [MacPorts][11] 安装它。如果你需要其他 Linux 发行版的说明,请参考[安装][12]指南。
|
||||
在 macOS 上,你可以用 [Homebrew][10] 或 [MacPorts][11] 安装它。如果你需要其他 Linux 发行版的说明,请参考 [安装][12] 指南。
|
||||
|
||||
![Screenshot of terminal showing the options for tmate sharing: web session (regular and read-only) and ssh session (regular and read-only)][13]
|
||||
|
||||
安装后,启动 tmate:
|
||||
安装后,启动 `tmate`:
|
||||
|
||||
```
|
||||
$ tmate
|
||||
```
|
||||
|
||||
当 tmate 启动时,会产生链接,通过 HTTP 和 SSH 提供对终端会话的访问。每个协议都有一个只读选项以及一个反向的 SSH 会话。
|
||||
当 `tmate` 启动时,会生成链接,通过 HTTP 和 SSH 提供对终端会话的访问。每个协议都有一个只读方式,以及一个反向的 SSH 会话。
|
||||
|
||||
下面是一个网络会话的样子:
|
||||
|
||||
![Screenshot showing tmate terminal window and 2 versions of sharing sessions demonstrating the same code][14]
|
||||
|
||||
Tmate 的网络控制台是 HTML5 的,因此,用户可以复制整个屏幕并粘贴到终端来运行相同的命令。
|
||||
`tmate` 的网络控制台是 HTML5 的,因此,用户可以复制整个屏幕并粘贴到终端来运行相同的命令。
|
||||
|
||||
### 保持会话活跃
|
||||
### 保持会话
|
||||
|
||||
你可能想知道如果你不小心关闭了你的终端会发生什么。你也可能想知道如何与不同的控制台应用共享你的终端。毕竟,tmate 是一个多路复用器,所以它应该能够保持会话的活力,脱离并重新连接到一个会话,等等。
|
||||
你可能想知道如果你不小心关闭了你的终端会发生什么。你也可能想知道如何与不同的控制台应用共享你的终端。毕竟,`tmate` 是一个多路复用器,所以它应该能够保持会话,脱离并重新连接到一个会话,等等。
|
||||
|
||||
当然,这正是 tmate 所能做到的。如果你曾经使用过 tmux,这可能是相当熟悉的。
|
||||
当然,这正是 `tmate` 所能做到的。如果你曾经使用过 `tmux`,这可能是相当熟悉的。
|
||||
|
||||
```
|
||||
$ tmate -F -n web new-session vi console
|
||||
```
|
||||
|
||||
这个命令在 Vi 中打开了 `new-session`,`-F` 选项确保会话在关闭时也能重新产生。
|
||||
这个命令在 `vi` 中打开了 `new-session`,`-F` 选项确保会话在关闭时也能重新产生。
|
||||
|
||||
![A screenshot of the terminal showing the output after using the new-session and -F options: connection information for either a web session (regular or read-only) or ssh session (regular or read-only)][15]
|
||||
|
||||
### 社交复用
|
||||
|
||||
Tmate 给你带来了 tmux 或 GNU Screen 的自由,以及与他人共享会话的能力。对于教其他用户如何使用终端,演示一个新命令的功能,或调试意外的行为,这是一个有价值的工具。它是开源的,所以请试一试!
|
||||
|
||||
图片提供(Sumantro Mukherjee,CC BY-SA 4.0)
|
||||
`tmate` 给你带来了 `tmux` 或 GNU Screen 的自由度,以及与他人分享会话的能力。这是一个有价值的工具,可以教其他用户如何使用终端、演示一个新命令的功能,或调试意外的行为。它是开源的,所以请试一试!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
@ -3,23 +3,24 @@
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14734-1.html"
|
||||
|
||||
有研究表明,推特能够推动开源项目的普及
|
||||
======
|
||||
|
||||
![推特][1]
|
||||
|
||||
由 HongBo Fang 博士领导的研究团队发现,推特是一种吸引更多人关注和贡献 GitHub 开源项目的有效方式。Fang 博士在国际软件工程会议上发表了这项名为“‘这真是太棒了!’估计推文对开源项目受欢迎程度和新贡献者的影响”的研究,并获得了杰出论文奖。这项研究显示,发送和一个项目有关的推文,导致了该项目受欢迎程度增加了 7%(在 GitHub 上至少增加了一颗 star),贡献者数量增加了 2%。一个项目收到的推文越多,它收到的 star 和贡献者就越多。
|
||||
由 HongBo Fang 博士领导的研究团队发现,推特是一种吸引更多人关注和贡献 GitHub 开源项目的有效方式。Fang 博士在国际软件工程会议上发表了这项名为“‘这真是太棒了!’估计推文对开源项目受欢迎程度和新贡献者的影响”的研究,并获得了杰出论文奖。这项研究显示,发送和一个项目有关的推文,导致了该项目受欢迎程度增加了 7%(在 GitHub 上至少增加了一个星标),贡献者数量增加了 2%。一个项目收到的推文越多,它收到的星标和贡献者就越多。
|
||||
|
||||
Fang 说:“我们已经意识到社交媒体在开源社区中变得越来越重要,吸引关注和新的贡献者将带来更高质量和更好的软件。”
|
||||
|
||||
大多数开源软件都是由志愿者创建和维护的。参与项目的人越多,结果就越好。开发者和其他人使用该软件、报告问题并努力解决这些问题。然而,不受欢迎的项目有可能得不到应有的关注。这些劳动力(几乎都是志愿者),维护了数百万人每天依赖的软件。例如,几乎每个 HTTPS 网站都使用开源的 OpenSSL 保护其内容。Heartbleed 是 OpenSSL 中发现的一个安全漏洞,在 2014 年被发现后,企业花费了数百万美元来修复它。另一个开源软件 cURL 允许连接的设备相互发送数据,并安装在大约 10 亿台设备上。开源软件之多,不胜枚举。
|
||||
|
||||
此次“推特对提高开源项目的受欢迎程度和吸引新贡献者的影响”的研究,其实是 “Vasilescu 数据挖掘与社会技术研究实验室” (STRUDEL) 的一个更大项目的其中一部分,该研究着眼于如何建立开源社区并且其工作更具可持续性。毕竟,支撑现代技术的数字基础设施、道路和桥梁都是开源软件。如果维护不当,这些基础设施可能会崩溃。
|
||||
此次“推特对提高开源项目的受欢迎程度和吸引新贡献者的影响”的研究,其实是 “Vasilescu 数据挖掘与社会技术研究实验室”(STRUDEL)的一个更大项目的其中一部分,该研究着眼于如何建立开源社区并且其工作更具可持续性。毕竟,支撑现代技术的数字基础设施、道路和桥梁都是开源软件。如果维护不当,这些基础设施可能会崩溃。
|
||||
|
||||
研究人员检查了 44544 条推文,其中包含指向 2370 个开源 GitHub 存储库的链接,以证明这些推文确实吸引了新的 star 和项目贡献者。在这项研究中,研究人员使用了一种科学的方法:将 Twitter 上提及的 GitHub 项目的 star 和贡献者的增加,与 Twitter 上未提及的一组项目进行了比较。该研究还描述了高影响力推文的特征、可能被帖子吸引到项目的人的类型,以及这些人与通过其他方式吸引的贡献者有何不同。来自项目支持者而不是开发者的推文最能吸引注意力。请求针对特定任务或项目提供帮助的帖子会收到更高的回复率。推文往往会吸引新的贡献者,**他们是 GitHub 的新手,但不是经验不足的程序员**。还有,**新的关注可能不会带来新的帮助**。
|
||||
研究人员检查了 44544 条推文,其中包含指向 2370 个开源 GitHub 存储库的链接,以证明这些推文确实吸引了新的星标和项目贡献者。在这项研究中,研究人员使用了一种科学的方法:将推特上提及的 GitHub 项目的星标和贡献者的增加,与推特上未提及的一组项目进行了比较。该研究还描述了高影响力推文的特征、可能被帖子吸引到项目的人的类型,以及这些人与通过其他方式吸引的贡献者有何不同。来自项目支持者而不是开发者的推文最能吸引注意力。请求针对特定任务或项目提供帮助的帖子会收到更高的回复率。推文往往会吸引新的贡献者,**他们是 GitHub 的新手,但不是经验不足的程序员**。还有,**新的关注可能不会带来新的帮助**。
|
||||
|
||||
提高项目受欢迎程度也存在其缺点,研究人员讨论后认为,它的潜在缺点之一,就是注意力和行动之间的差距。**更多的关注通常会导致更多的功能请求或问题报告,但不一定有更多的开发者来解决它们**。社交媒体受欢迎程度的提高,可能会导致有更多的“巨魔”或“有毒行为”出现在项目周围。
|
||||
|
||||
@ -32,7 +33,7 @@ via: https://www.opensourceforu.com/2022/06/according-to-studies-twitter-drives-
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,59 @@
|
||||
[#]: subject: "How I use LibreOffice keyboard shortcuts"
|
||||
[#]: via: "https://opensource.com/article/22/6/libreoffice-keyboard-shortcuts"
|
||||
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14765-1.html"
|
||||
|
||||
使用 LibreOffice 键盘快捷键的小技巧
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/27/144807lc4csplt17xm6mee.jpg)
|
||||
|
||||
> 键盘快捷键让我专注于我要传递的内容,而不是它的外观。
|
||||
|
||||
从我记事起,我就一直在使用文字处理软件。当文字处理器从直接格式化转向利用样式来改变文本在页面上的显示方式时,这对我的写作有很大的推动作用。
|
||||
|
||||
LibreOffice 提供了多种样式,你可以使用它们来创建各种内容。 LibreOffice 将段落样式应用于文本块,例如正文、列表和代码示例。字符样式类似,只是这些样式适用于段落内的内联词或其他短文本。使用“<ruby>视图<rt>View</rt></ruby> -> <ruby>样式<rt>Styles</rt></ruby>”菜单,或使用 `F11` 键盘快捷键,调出样式选择器。
|
||||
|
||||
![Image of LibreOffice styles][2]
|
||||
|
||||
使用样式可以更轻松地编写更长的文档。看看这个例子:作为咨询实践的一部分,我写了很多工作簿和培训材料。一个工作簿可能有 40 或 60 页长,具体取决于主题,并且可以包含各种内容,例如正文、表格和列表。我的一些技术培训材料可能还包括源代码示例。
|
||||
|
||||
我有一个提供给客户的标准培训集,但我也做定制的培训计划。在处理自定义程序时,我可能会先从另一个工作簿导入文本,然后从那里开始工作。根据客户的不同,我可能还会调整字体和其他样式元素以匹配客户的样式偏好。对于其他材料,我可能需要添加源代码示例。
|
||||
|
||||
要使用直接格式输入示例源代码,我需要设置字体并调整工作簿中每个代码块的边距。如果我后来决定我的工作簿应该对正文文本或源代码示例使用不同的字体,我需要返回并更改所有内容。对于包含多个代码示例的工作簿,这可能需要几个小时来查找每个源代码示例并调整字体和边距以匹配新的首选格式。
|
||||
|
||||
但是,通过使用样式,我可以更新定义一次,为正文样式使用不同的字体,并且 LibreOffice Writer 会在所有使用正文样式的地方更新我的文档。同样,我可以调整预格式化文本样式的字体和边距,LibreOffice Writer 会将这种新样式应用到每个具有预格式化文本样式的源代码示例中。这对于其他文本块也是如此,包括标题、源代码、列表以及页眉和页脚。
|
||||
|
||||
我最近有了一个好主意,更新 LibreOffice 键盘快捷键以简化我的写作过程。我重新定义了 `Ctrl + B` 设置加粗强调字符样式,`Ctrl + I` 设置强调字符样式,`Ctrl + 空格` 设置取消字符样式。这使我的写作变得更加容易,因为我不必暂停写作,这样我就可以高亮显示一些文本并选择一种新的风格。相反,我可以使用新的 `Ctrl + I` 键盘快捷键来设置字符样式,它本质上是斜体文本。之后我输入的任何内容都使用强调样式,直到我按 `Ctrl + 空格` 将字符样式重置为默认的无字符样式。
|
||||
|
||||
![Image of LibreOffice character styles][3]
|
||||
|
||||
如果你想自己设置的,请使用“<ruby>工具<rt>Tools</rt></ruby> -> <ruby>自定义<rt>Customize</rt></ruby>”, 然后单击“<ruby>键盘<rt>Keyboard</rt></ruby>”选项卡以修改键盘快捷键。
|
||||
|
||||
![Image of LibreOffice keyboard customizations][4]
|
||||
|
||||
LibreOffice 通过样式使技术写作变得更加容易。通过利用键盘快捷键,我简化了我的写作方式,让我专注于我要交付的内容,而不是它的外观。稍后我可能会更改格式,但样式保持不变。
|
||||
|
||||
*图片来源:(Jim Hall,CC BY-SA 40)*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/6/libreoffice-keyboard-shortcuts
|
||||
|
||||
作者:[Jim Hall][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/jim-hall
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://opensource.com/sites/default/files/lead-images/programming_keyboard_coding.png
|
||||
[2]: https://opensource.com/sites/default/files/2022-06/libreofficestyles.png
|
||||
[3]: https://opensource.com/sites/default/files/2022-06/libreofficecharstyles.png
|
||||
[4]: https://opensource.com/sites/default/files/2022-06/libreofficekeyboardcustom.png
|
@ -3,17 +3,18 @@
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14723-1.html"
|
||||
|
||||
Mozilla 刚刚使 Firefox 成为所有用户最安全的 Web 浏览器
|
||||
Mozilla 刚刚使 Firefox 成为所有人的最安全的网页浏览器
|
||||
======
|
||||
Mozilla 终于启用了一项隐私保护功能,这可能使其成为当下最安全的网络浏览器。你怎么看?
|
||||
|
||||
> Mozilla 终于启用了一项隐私保护功能,这可能使其成为当下最安全的网页浏览器。你怎么看?
|
||||
|
||||
![Mozilla Firefox][1]
|
||||
|
||||
Mozilla Firefox 是市面上最安全的开源 Web 浏览器之一。
|
||||
Mozilla Firefox 是市面上最安全的开源网页浏览器之一。
|
||||
|
||||
毫无疑问,你可以自由定制它来进一步增强安全性,这就是 Tor 浏览器使用 Firefox 作为其核心的原因。
|
||||
|
||||
@ -21,39 +22,39 @@ Mozilla Firefox 是市面上最安全的开源 Web 浏览器之一。
|
||||
|
||||
现在,Mozilla 终于为**所有桌面用户**启用了一项新功能,这使其成为最安全的浏览器(或是他们声称的“最安全”)。
|
||||
|
||||
本文中,我讨论的不是任何新功能,而是 Firefox 中的现有功能,即 <ruby>全面的 Cookie 保护<rt>Total Cookie Protection</rt></ruby>。它是在去年与 [Firefox 86][3] 一起引入的,但默认情况下并未对所有用户启用。
|
||||
本文中,我讨论的不是任何新功能,而是 Firefox 中的现有功能,即 <ruby>Cookie 全面保护<rt>Total Cookie Protection</rt></ruby>。它是在去年与 [Firefox 86][3] 一起引入的,但默认情况下并未对所有用户启用。
|
||||
|
||||
### 为所有用户提供的全面的 Cookie 保护
|
||||
|
||||
“全面的 Cookie 保护”正在向所有人推出,无论你使用的是 Windows、Mac 还是 Linux,它将成为默认启用的核心功能之一。
|
||||
“Cookie 全面保护”正在向所有人推出,无论你使用的是 Windows、Mac 还是 Linux,它将成为默认启用的核心功能之一。
|
||||
|
||||
最初,要使用该功能,你必须启用严格模式(<ruby>增强跟踪保护<rt>Enhanced Tracking Protection</rt></ruby>)。但现在,你不再需要这样做了。
|
||||
|
||||
**它是什么?**
|
||||
#### 它是什么?
|
||||
|
||||
如果你好奇的话,“全面的 Cookie 保护”会隔离每个网站和它们的 cookie。其中,Cookie 是网站向你的浏览器发送的少量数据。
|
||||
如果你好奇的话,“Cookie 全面保护”会隔离每个网站和它们的 Cookie。Cookie 是网站向你的浏览器发送的少量数据。
|
||||
|
||||
因此,cookie 不会在网站之间共享,从而防止了<ruby>跨站点跟踪<rt>cross-site tracking</rt></ruby>。
|
||||
因此,Cookie 不会在网站之间共享,从而防止了<ruby>跨站跟踪<rt>cross-site tracking</rt></ruby>。
|
||||
|
||||
浏览器将为你访问的每个网站都创建单独的 cookie 罐。
|
||||
浏览器将为你访问的每个网站都创建单独的“<ruby>饼干罐<rt>Cookie Jar</rt></ruby>”。(LCTT 译注:Cookie 原意是小饼干。)
|
||||
|
||||
![][4]
|
||||
|
||||
Mozilla 的博文对此进行了更多解释:
|
||||
|
||||
> 在任何时候,网站或嵌入网站的 [第三方内容][5] 在浏览器中存储的 cookie,都将仅限于分配给该网站的 cookie 罐。其他网站无法进入不属于它们的 cookie 罐,以得到那些网站的 cookie 对你的了解。这可以让你免受侵入性广告的影响,并减少公司收集的关于你的信息量。
|
||||
> 在任何时候,网站或嵌入网站的 [第三方内容][5] 在浏览器中存储的 Cookie,都将仅限于分配给该网站的 “饼干罐”。其他网站无法进入不属于它们的“饼干罐”,以得到你存储在那些 Cookie 中的信息。这可以让你免受侵入性广告的影响,并减少公司收集的关于你的信息量。
|
||||
|
||||
### 那么,这有什么大不了的吗?
|
||||
|
||||
即使你配备了所有的隐私跟踪保护和内容拦截器,你也不一定知道,其实还有个问题叫做“跨站点跟踪”。
|
||||
即使你配备了所有的隐私跟踪保护和内容拦截器,你也不一定知道,其实还有个问题叫做“跨站跟踪”。
|
||||
|
||||
因此,通过跨站点 cookie 交互,你的许多个人活动和习惯,都可以帮助数字跟踪公司建立你的在线个人资料。
|
||||
因此,通过跨站点的 Cookie 交互,你的许多个人活动和习惯,都可以帮助数字跟踪公司建立你的在线个人资料。
|
||||
|
||||
但是,对于 Mozilla Firefox 来说,它在所有其他隐私措施之上,默认额外启用了该功能,这可确保你获得最私密的体验。
|
||||
|
||||
并且,所有这些都不需要你调整任何东西,这应该为那些“以隐私为中心”的用户提供方便。
|
||||
并且,所有这些都不需要你调整任何东西,这应该为那些“重视隐私”的用户提供方便。
|
||||
|
||||
如果你还是好奇的话,你可以查看 Mozilla 的 [官方公告][6]。
|
||||
想了解进一步信息,你可以查看 Mozilla 的 [官方公告][6]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -62,7 +63,7 @@ via: https://news.itsfoss.com/mozilla-firefox-secure/
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,17 +3,16 @@
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14769-1.html"
|
||||
|
||||
使用 Python 的 requests 和 Beautiful Soup 来分析网页
|
||||
======
|
||||
学习这个 Python 教程,轻松提取网页的有关信息。
|
||||
|
||||
![带问号的 Python 语言图标][1]
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/28/132859owwf9az49k2oje2o.jpg)
|
||||
|
||||
图源:Opensource.com
|
||||
> 学习这个 Python 教程,轻松提取网页的有关信息。
|
||||
|
||||
浏览网页可能占了你一天中的大部分时间。然而,你总是需要手动浏览,这很讨厌,不是吗?你必须打开浏览器,然后访问一个网站,单击按钮,移动鼠标……相当费时费力。如果能够通过代码与互联网交互,岂不是更好吗?
|
||||
|
||||
@ -69,7 +68,7 @@ print(SOUP.p)
|
||||
|
||||
### 循环
|
||||
|
||||
使用 Beautiful Soup 的 `find_all` 函数,你可以创建一个 for 循环,从而遍历 `SOUP` 变量中包含的整个网页。除了 `<p>` 标签之外,你可能也会对其他标签感兴趣,因此最好将其构建为自定义函数,由 Python 中的 `def` 关键字(意思是 <ruby>“定义”<rt>define</rt></ruby>)指定。
|
||||
使用 Beautiful Soup 的 `find_all` 函数,你可以创建一个 `for` 循环,从而遍历 `SOUP` 变量中包含的整个网页。除了 `<p>` 标签之外,你可能也会对其他标签感兴趣,因此最好将其构建为自定义函数,由 Python 中的 `def` 关键字(意思是 <ruby>“定义”<rt>define</rt></ruby>)指定。
|
||||
|
||||
```
|
||||
def loopit():
|
||||
@ -77,7 +76,7 @@ def loopit():
|
||||
print(TAG)
|
||||
```
|
||||
|
||||
你可以随意更改临时变量 `TAG` 的名字,例如 `ITEM` 或 `i` 或任何你喜欢的。每次循环运行时,`TAG` 中都会包含`find_all` 函数的搜索结果。在此代码中,它搜索的是 `<p>` 标签。
|
||||
你可以随意更改临时变量 `TAG` 的名字,例如 `ITEM` 或 `i` 或任何你喜欢的。每次循环运行时,`TAG` 中都会包含 `find_all` 函数的搜索结果。在此代码中,它搜索的是 `<p>` 标签。
|
||||
|
||||
函数不会自动执行,除非你显式地调用它。你可以在代码的末尾调用这个函数:
|
||||
|
||||
@ -92,7 +91,7 @@ if __name__ == '__main__':
|
||||
|
||||
### 只获取内容
|
||||
|
||||
你可以通过指定只需要 <ruby>“字符串”<rt>string</rt></ruby>(它是 <ruby>“单词”<rt>words</rt></ruby> 的编程术语)来排除打印标签。
|
||||
你可以通过指定只需要 “<ruby>字符串<rt>string</rt></ruby>”(它是 “<ruby>单词<rt>words</rt></ruby>” 的编程术语)来排除打印标签。
|
||||
|
||||
```
|
||||
def loopit():
|
||||
@ -125,8 +124,8 @@ def loopit():
|
||||
你可以使用 Beautiful Soup 和 Python 提取更多信息。以下是有关如何改进你的应用程序的一些想法:
|
||||
|
||||
* [接受输入][3],这样你就可以在启动应用程序时,指定要下载和分析的 URL。
|
||||
* 统计页面上图片(<img> 标签)的数量。
|
||||
* 统计另一个标签中的图片(<img> 标签)的数量(例如,仅出现在 `<main>` div 中的图片,或仅出现在 `</p>` 标签之后的图片)。
|
||||
* 统计页面上图片(`<img>` 标签)的数量。
|
||||
* 统计另一个标签中的图片(`<img>` 标签)的数量(例如,仅出现在 `<main>` div 中的图片,或仅出现在 `</p>` 标签之后的图片)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -135,7 +134,7 @@ via: https://opensource.com/article/22/6/analyze-web-pages-python-requests-beaut
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,12 +3,13 @@
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14738-1.html"
|
||||
|
||||
Mattermost 7.0 发布,扩展了工作流平台
|
||||
======
|
||||
|
||||
![Mattermost][1]
|
||||
|
||||
自 2016 年开源以来,Mattermost 一直在开发一个具有不断增加的用例的消息传递平台。6 月 16 日,Mattermost 7.0 平台发布,其中包括了新的语音呼叫、工作流模板和用于开源技术的应用框架。新版本扩展了 2021 年 10 月发布的 6.0 版本引入的功能。一直以来,Mattermost 都在与包括 Slack、Atlassian 和 Asana 在内的几家大公司,竞争不断增长的协作工具市场。另一方面,Mattermost 侧重于对开发者的支持,尽管该平台也可用于安全和 IT 运营。
|
||||
@ -17,11 +18,11 @@ Mattermost 的软件同时提供有商业版和开源版,目前它们都升级
|
||||
|
||||
Tien 认为开源也关乎社区贡献。Mattermost 开源项目有超过 4000 名个人贡献者,他们贡献了超过 30000 行代码。
|
||||
|
||||
以前,Mattermost 依赖集成第三方呼叫服务(例如 Zoom)来启用语音呼叫功能。在 7.0 版本中,它通过开源 WebRTC 协议引入了呼叫功能的直接集成,所有现代 Web 浏览器都支持该协议。直接集成呼叫功能的目标是为写作提供单一平台,这符合 Tien 对该平台的总体愿景。现在,除了提供集成工具以实现协作之外,该平台还会增加“工作流模板”功能,以帮助(用户)组织构建可重复的流程。
|
||||
以前,Mattermost 依赖集成第三方呼叫服务(例如 Zoom)来启用语音呼叫功能。在 7.0 版本中,它通过开源 WebRTC 协议引入了呼叫功能的直接集成,所有现代 Web 浏览器都支持该协议。直接集成呼叫功能的目标是为协作提供单一平台,这符合 Tien 对该平台的总体愿景。现在,除了提供集成工具以实现协作之外,该平台还会增加“工作流模板”功能,以帮助(用户)组织构建可重复的流程。
|
||||
|
||||
工作流概念采用了 <ruby>剧本<rt>playbooks</rt></ruby>,其中包含了为“特定类型的操作”所执行的动作和操作的清单。例如,在发生服务故障或网络安全事件时,公司可以为事件响应创建工作流模板。
|
||||
工作流概念采用了 <ruby>剧本<rt>playbook</rt></ruby>,其中包含了为“特定类型的操作”所执行的动作和操作的清单。例如,在发生服务故障或网络安全事件时,公司可以为事件响应创建工作流模板。
|
||||
|
||||
这个清单可以链接到 Mattermost 操作,例如让特定用户发起呼叫,并协助生成报告。Tien 表示,Mattermost 还与常见的开发者工具集成,并且工作流模板的功能将随着时间的推移而扩展,以便使用第三方工具来实现更多自动化。
|
||||
这个清单可以链接到 Mattermost <ruby>操作<rt>operation</rt></ruby>,例如让特定用户发起呼叫,并协助生成报告。Tien 表示,Mattermost 还与常见的开发者工具集成,并且工作流模板的功能将随着时间的推移而扩展,以便使用第三方工具来实现更多自动化。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -30,7 +31,7 @@ via: https://www.opensourceforu.com/2022/06/mattermost-extends-workflow-platform
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,13 +3,14 @@
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14724-1.html"
|
||||
|
||||
Travis CI 漏洞暴露了敏感的开源项目凭证
|
||||
======
|
||||
![Travis CI][1]
|
||||
|
||||
![Travis CI](https://img.linux.net.cn/data/attachment/album/202206/18/095734heuo8nc7g7n0ibtd.jpg)
|
||||
|
||||
Travis CI 持续集成工具中的一个缺陷暴露了来自数千个在线开源项目的敏感数据。这并不是该软件第一次遇到此类安全问题。
|
||||
|
||||
@ -17,9 +18,9 @@ Travis CI 是一个持续集成工具,它帮助软件开发者实现自动化
|
||||
|
||||
攻击者可以从这些明文存储的日志中,提取出用于登录 GitHub、Docker Hub 和 AWS 等云服务的用户身份验证令牌。研究人员在 800 万份日志样本中,发现了 70000 多个敏感令牌和其他机密凭证。Aqua 团队认为“所有 Travis CI 免费用户都有可能暴露”。根据 2019 年的数据,Travis CI 被超过 60 万名独立用户,用于超过 932977 个开源项目。
|
||||
|
||||
这种对高级用户凭证的访问,会给使用该产品的软件开发者及其客户带来风险。“趋势科技”英国和爱尔兰安全技术总监 Bharat Mistry 解释道:“如果攻击者获得了这些凭据,就没有什么能阻止他们将恶意代码引入库或构建过程。这个缺陷无疑会导致数字供应链攻击。”
|
||||
这种对高级用户凭证的访问,会给使用该产品的软件开发者及其客户带来风险。趋势科技英国和爱尔兰安全技术总监 Bharat Mistry 解释道:“如果攻击者获得了这些凭据,就没有什么能阻止他们将恶意代码引入库或构建过程。这个缺陷无疑会导致数字供应链攻击。”
|
||||
|
||||
供应链攻击可能极具破坏性。2020 年的 <ruby>太阳风<rt>Solar Winds</rt></ruby> 攻击,使国家资助的俄罗斯黑客能够访问数千家企业和政府组织的系统。2021 年的 Kaseya 供应链攻击,使犯罪分子可以同时加密 1500 多家公司的数据,将他们全部扣为人质。
|
||||
供应链攻击可能极具破坏性。2020 年的 <ruby>太阳风<rt>Solar Winds</rt></ruby> 攻击,使国家资助的俄罗斯黑客能够访问数千家企业和政府组织的系统。2021 年的 Kaseya 供应链攻击,使犯罪分子可以同时加密 1500 多家公司的数据,将它们全部扣为人质。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -28,7 +29,7 @@ via: https://www.opensourceforu.com/2022/06/the-travis-ci-vulnerability-exposes-
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,13 +3,14 @@
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14730-1.html"
|
||||
|
||||
Ubuntu Core 22 来了,适用于物联网和边缘设备
|
||||
======
|
||||
Ubuntu Core 22 基于 Ubuntu 22.04 LTS,为物联网和嵌入式设备带来了最佳的安全性和性能。
|
||||
|
||||
> Ubuntu Core 22 基于 Ubuntu 22.04 LTS,为物联网和嵌入式设备带来了最佳的安全性和性能。
|
||||
|
||||
![Ubuntu][1]
|
||||
|
||||
@ -19,7 +20,7 @@ Ubuntu Core 22 是一个容器化的 Ubuntu 22.04 LTS 变体,针对嵌入式
|
||||
|
||||
在发布 Ubuntu Core 22 时,Canonical 的 CEO **Mark Shuttleworth** 说:
|
||||
|
||||
> “Canonical 的目标是在任何地方提供安全、可靠的开源技术,从开发环境到云,再到边缘和设备。”
|
||||
> “Canonical 的目标是在从开发环境到云、再到边缘和设备的任何地方提供安全、可靠的开源技术。”
|
||||
|
||||
### Ubuntu Core 22 更新介绍
|
||||
|
||||
@ -31,11 +32,11 @@ Ubuntu Core 22 版本带来了针对安全性和可靠性的改进。其中包
|
||||
|
||||
正如公告中提到的,Ubuntu 22.04 LTS 提供了一个实时内核(测试版可用),它能为那些时间敏感的工业、汽车和机器人用例,提供高性能、超低延迟和工作负载可预测性。
|
||||
|
||||
此外,如果你有 Ubuntu 认证的硬件,你还能充分利用高级的实时功能。
|
||||
此外,如果你有 Ubuntu 认证的硬件,你还能充分利用先进的实时功能。
|
||||
|
||||
#### Snapcraft 框架
|
||||
|
||||
整个 Ubuntu 映像分解为许多个包(快照),使得内核、操作系统和应用程序隔离在一个沙箱中。
|
||||
整个 Ubuntu 镜像分解为许多个包(Snap),使得内核、操作系统和应用程序隔离在一个沙箱中。
|
||||
|
||||
这可以让你轻松地安装应用程序,而无需担心来自专用 <ruby>物联网应用商店<rt>IoT App Store</rt></ruby> 的依赖。对于企业而言,通过软件商店进行的软件管理解决方案,应该能够带来一系列内部部署的机会。
|
||||
|
||||
@ -64,7 +65,7 @@ via: https://news.itsfoss.com/ubuntu-core-22-release/
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,89 @@
|
||||
[#]: subject: "Ubuntu Runs on a Google Nest Hub, Wait, What?"
|
||||
[#]: via: "https://news.itsfoss.com/ubuntu-google-nest/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14746-1.html"
|
||||
|
||||
Ubuntu 可以运行在谷歌 Nest Hub 上了?!
|
||||
======
|
||||
|
||||
> 一名安全专家成功地在谷歌 Nest Hub(第 2 代)上运行了 Ubuntu,嗯,然后呢?
|
||||
|
||||
![Ubuntu Google][1]
|
||||
|
||||
我刚刚看到了一个关于在谷歌 Nest Hub(第 2 代)上运行的 Ubuntu 的消息。
|
||||
|
||||
嗯,这实在是让人兴奋!
|
||||
|
||||
所以,让我在这里分享更多关于它的信息吧。
|
||||
|
||||
### 破解谷歌 Nest Hub 以安装 Ubuntu
|
||||
|
||||
是的,破解使得这成为可能。
|
||||
|
||||
网络安全专家 Frédéric Basse 破解了谷歌 Nest Hub(第 2 代)的安全启动,并成功运行 Ubuntu。
|
||||
|
||||
当然,谷歌 Nest Hub 并没有正式支持启动一个自定义操作系统。但是,Fred 使用了一个安全漏洞,从而成功运行了 Ubuntu。
|
||||
|
||||
虽然这很有趣,但对于始终在线的谷歌智能家居显示器来说,这也是一个严重的安全问题。
|
||||
|
||||
![](https://news.itsfoss.com/wp-content/uploads/2022/06/ubuntu-google-nest-hacked.gif)
|
||||
|
||||
正如这位安全专家在 [博客文章][2] 中所解释的,他使用了树莓派 Pico 微控制器,利用引导加载程序中的 USB 漏洞,从而破坏了安全启动链。
|
||||
|
||||
这位安全专家得出结论:
|
||||
|
||||
> 因此,攻击者可以通过插入恶意 USB 设备并按下两个按钮,从而在早期启动阶段(内核执行之前)执行任意代码。
|
||||
|
||||
如果你想进行实验(适合安全研究人员),他还在 [GitHub][3] 上提供了相关代码(关于如何利用这个引导加载程序漏洞)。
|
||||
|
||||
### 让 Ubuntu 在 Google Nest 上运行
|
||||
|
||||
![][4]
|
||||
|
||||
该漏洞允许攻击者启动未签名的操作系统。但是,在那之前,攻击者必须对为树莓派(64 位 ARM 版)量身定制的预装 Ubuntu 镜像进行一些修改。
|
||||
|
||||
这位安全专家还提到了以下内容:
|
||||
|
||||
> 我们构建了一个自定义 U-Boot 引导加载程序,禁用了安全引导,并更改了引导流程以从 USB 闪存驱动器加载环境。我们还为 elaine 构建了一个自定义 Linux 内核,其中包括包括了一些 [额外驱动,例如 USB 鼠标][5] 。重新打包了来自 Ubuntu 的初始 ramdisk(initrd),以集成触摸屏所需的固件二进制文件。引导镜像是基于自定义 Linux 内核和修改的 initrd 创建的。
|
||||
|
||||
因此,很明显,你不会获得完整的 Ubuntu 体验,但由于该漏洞,我们现在知道,如果你愿意破解 谷歌 Nest 进行测试的话(真心不建议!),Ubuntu 是可以在谷歌 Nest 上作运行的。
|
||||
|
||||
### 智能家居安全担忧 + Linux
|
||||
|
||||
网络安全专家指出,该漏洞已在上游(两次)修复。
|
||||
|
||||
但是,研究人员也指出,缺乏分配的 CVE 编号可能会导致修复程序无法向下游传播。
|
||||
|
||||
毫无疑问,看到有人在不受支持的设备上运行 Linux 真是太棒了。这让我思考,我们是否应该也制造一些 **由 Linux 驱动的商业智能家居设备?**
|
||||
|
||||
*或者说,已经有类似的东西了吗?*
|
||||
|
||||
然而,智能家居设备容易受到简单攻击,也同样令人担忧。
|
||||
|
||||
你怎么看?在下面的评论中分享你的想法吧。
|
||||
|
||||
**本文最初发布于** [Liliputing][6]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/ubuntu-google-nest/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[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/wp-content/uploads/2022/06/hacker-installs-ubuntu-on-google-nest-hub.jpg
|
||||
[2]: https://fredericb.info/2022/06/breaking-secure-boot-on-google-nest-hub-2nd-gen-to-run-ubuntu.html
|
||||
[3]: https://github.com/frederic/chipicopwn
|
||||
[4]: https://news.itsfoss.com/wp-content/uploads/2022/06/ubuntu-google-nest.jpg
|
||||
[5]: https://github.com/frederic/elaine-linux/commit/11068237d9178e77d79e3a5d27fc4f8f9b923c51
|
||||
[6]: https://liliputing.com/2022/06/hacker-installs-ubuntu-on-a-google-nest-hub-2nd-gen-smart-display.html
|
@ -0,0 +1,108 @@
|
||||
[#]: subject: "Compress Images in Linux Easily With Curtail GUI App"
|
||||
[#]: via: "https://itsfoss.com/curtail-image-compress/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14748-1.html"
|
||||
|
||||
用 Curtail GUI 应用轻松压缩 Linux 中的图像
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/23/182901s4d060uu98g8qquv.jpg)
|
||||
|
||||
有一大堆文件尺寸巨大的图片占用了太多的磁盘空间?或者你必须将图片上传到有文件大小限制的门户网站?
|
||||
|
||||
你可能有很多原因想要压缩图片。有大量的工具可以帮助你,我在这里说的不是命令行的工具。
|
||||
|
||||
你可以使用一个成熟的图像编辑器,如 GIMP。你也可以使用像 [Squoosh][1] 这样的网络工具,这是谷歌的一个开源项目。它甚至可以让你比较每个压缩级别的文件。
|
||||
|
||||
然而,所有这些工具都是针对单个图像工作的。如果你想批量压缩照片怎么办?Curtail 是一个能帮助你的应用。
|
||||
|
||||
### Curtail: Linux 中用于图像压缩的灵巧工具
|
||||
|
||||
使用 Python 和 GTK3 构建的 Curtail 是一个简单的 GUI 应用,使用 OptiPNG、[jpegoptim][2] 等开源库来提供图像压缩功能。
|
||||
|
||||
它有一个 [Flatpak 应用][3]。请确保你的系统已启用 [Flatpak 支持][4]。
|
||||
|
||||
首先添加 Flathub 仓库:
|
||||
|
||||
```
|
||||
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
```
|
||||
|
||||
然后使用下面的命令来安装 Curtail:
|
||||
|
||||
```
|
||||
flatpak install flathub com.github.huluti.Curtail
|
||||
```
|
||||
|
||||
安装后,在你的 Linux 系统的菜单中寻找它,并从那里启动它。
|
||||
|
||||
![curtail app][5]
|
||||
|
||||
界面朴素而简单。你可以选择你想要无损压缩还是有损压缩。
|
||||
|
||||
有损压缩会有质量差的图像,但尺寸较小。无损压缩会有更好的质量,但尺寸可能不会比原来的小很多。
|
||||
|
||||
![curtail app interface][6]
|
||||
|
||||
你可以浏览图片,或者把它们拖到应用中。
|
||||
|
||||
是的,你可以用 Curtail 一键压缩多张图片。
|
||||
|
||||
事实上,你甚至不需要点击。只要你选择图片或拖放它们,它们就会被压缩,你会看到压缩过程的摘要。
|
||||
|
||||
![curtail image compression summary][7]
|
||||
|
||||
正如你在上面的图片中看到的,我的一张图片的尺寸减少了 35%,另外两张图片的尺寸减少了 3% 和 8%。这是在无损压缩的情况下。
|
||||
|
||||
这些图片以 `-min` 为后缀(默认),保存在与原始图片相同的目录中。
|
||||
|
||||
虽然它看起来很简约,但有几个选项可以配置 Curtail。点击菜单,你会看到一些设置选项。
|
||||
|
||||
![curtail configuration options][8]
|
||||
|
||||
你可以选择是将压缩文件保存为新文件还是替换现有文件。如果你选择新文件(默认行为),你也可以为压缩后的图像提供一个不同的后缀。保留文件属性的选项也在这里。
|
||||
|
||||
在下一个选项卡中,你可以配置有损压缩的设置。默认情况下,压缩级别为 90%。
|
||||
|
||||
![curtail compression options][9]
|
||||
|
||||
高级选项卡让你可以选择配置 PNG 和 WebP 文件的无损压缩级别。
|
||||
|
||||
![curtain advanced options][10]
|
||||
|
||||
### 总结
|
||||
|
||||
正如我前面所说,这不是一个突破性的工具。你可以用其他工具如 GIMP 做同样的事情。它只是使图像压缩的任务更简单,特别是对于批量图像压缩。
|
||||
|
||||
我很想看到在压缩时有[转换图像文件格式][11]的选项,就像我们在 Converseen 等工具中所拥有的那样。
|
||||
|
||||
总的来说,对于图像压缩的具体目的来说,这是一个不错的小工具。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/curtail-image-compress/
|
||||
|
||||
作者:[Abhishek Prakash][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/abhishek/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://squoosh.app/
|
||||
[2]: https://github.com/tjko/jpegoptim
|
||||
[3]: https://itsfoss.com/what-is-flatpak/
|
||||
[4]: https://itsfoss.com/flatpak-guide/
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-app.png
|
||||
[6]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-app-interface.png
|
||||
[7]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-image-compression-summary.png
|
||||
[8]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-configuration-options.png
|
||||
[9]: https://itsfoss.com/wp-content/uploads/2022/06/curtail-compression-options.png
|
||||
[10]: https://itsfoss.com/wp-content/uploads/2022/06/curtain-advanced-options.png
|
||||
[11]: https://itsfoss.com/converseen/
|
@ -0,0 +1,92 @@
|
||||
[#]: subject: "Manjaro 21.3.0 ‘Ruah’ Release Adds Latest Calmares 3.2, GNOME 42, and More Upgrades"
|
||||
[#]: via: "https://news.itsfoss.com/manjaro-21-3-0-release/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14754-1.html"
|
||||
|
||||
Manjaro 21.3.0 Ruah 发布:增加了最新的 Calmares 3.2、GNOME 42 和更多升级
|
||||
======
|
||||
|
||||
> Manjaro Linux 21.3.0 发行包包含一些最新和最强大的更新,包括改进的安装程序。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/25/093727pqm59kkragcaga4c.jpg)
|
||||
|
||||
Manjaro Linux 是一个滚动发布的发行版。因此,从技术上讲,如果你定期更新系统的话,你一直都会使用最新版本。
|
||||
|
||||
升级到 Manjaro 21.3.0 应该没什么大不了的,考虑到我已经在正式发布前几天就已经在稳定运行它了,毫无问题。
|
||||
|
||||
**另外**,你可能想阅读一下我 [从 Ubuntu 切换到 Manjaro][2] 的初步体验(如果你对于升级仍然犹豫不决的话)。
|
||||
|
||||
那么,Manjaro 21.3.0 带来了什么更新呢?
|
||||
|
||||
### Manjaro 21.3.0 更新内容
|
||||
|
||||
![][3]
|
||||
|
||||
桌面环境升级到了最新的稳定版本,而内核版本仍然是 [Linux 内核 5.15 LTS][4]。
|
||||
|
||||
此外,这个版本还包括最终的 Clamares v3.2 版本。让我们来看看它有哪些变化吧。
|
||||
|
||||
#### Calamares v3.2.59
|
||||
|
||||
Calamares v3.2.59 安装程序是 3.2 系列的最终版本,它有许多有意义的改进。这次,分区模块包含了对 LUKS 分区的支持和更多改进,以避免那些可能会弄乱 Manjaro 安装的设置。
|
||||
|
||||
Calamares 3.2 的所有未来版本都将仅是错误修复。
|
||||
|
||||
#### GNOME 42 + Libadwaita
|
||||
|
||||
最初的版本包含了 GNOME 42,而最新的版本包含了 GNOME 42.2(附带最新的更新)。
|
||||
|
||||
总体而言,你将获得 [GNOME 42][5] 引入的所有优点,包括系统范围的深色模式、基于 GTK 4 的 GNOME 应用的现代用户界面、升级的应用程序以及其他一些重大变化。
|
||||
|
||||
![][6]
|
||||
|
||||
#### KDE Plasma 5.24
|
||||
|
||||
不幸的是,考虑到它差不多是在同一周发布的,因此该版本无法包含 [KDE Plasma 5.25][7]。
|
||||
|
||||
[KDE Plasma 5.24][8] 是一个不错的升级,具有更新的主题和概览效果。
|
||||
|
||||
#### XFCE 4.16
|
||||
|
||||
在 Xfce 4.16 中,窗口管理器得到了许多更新和改进,以支持小数倍数的缩放和更多功能。
|
||||
|
||||
### 下载 Manjaro 21.3.0
|
||||
|
||||
到目前为止,我在 Manjaro 21.3.0 GNOME 版本中没有遇到任何问题。一切看起来都不错,升级也很顺利。
|
||||
|
||||
但是,如果你不想重新安装或丢失重要文件,则应始终进行备份。
|
||||
|
||||
你可以从 [Manjaro 的下载页面][9] 下载最新版本。你也应该可以通过 pamac 包管理器获得更新。
|
||||
|
||||
无论哪种情况,你都可以在终端中输入以下命令进行升级:
|
||||
|
||||
```
|
||||
sudo pacmane -Syu
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/manjaro-21-3-0-release/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[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/wp-content/uploads/2022/06/manjaro-21-3-0-ruah-release.jpg
|
||||
[2]: https://news.itsfoss.com/manjaro-linux-experience/
|
||||
[3]: https://news.itsfoss.com/wp-content/uploads/2022/06/manjaro-gnome-42-2-1024x576.jpg
|
||||
[4]: https://news.itsfoss.com/linux-kernel-5-15-release/
|
||||
[5]: https://news.itsfoss.com/gnome-42-release/
|
||||
[6]: https://news.itsfoss.com/wp-content/uploads/2022/06/manjaro-21-3-neofetch.png
|
||||
[7]: https://news.itsfoss.com/kde-plasma-5-25-release/
|
||||
[8]: https://news.itsfoss.com/kde-plasma-5-24-lts-release/
|
||||
[9]: https://manjaro.org/download/
|
@ -0,0 +1,40 @@
|
||||
[#]: subject: "Microsoft To Charge For Available Open Source Software In Microsoft Store"
|
||||
[#]: via: "https://www.opensourceforu.com/2022/06/microsoft-to-charge-for-available-open-source-software-in-microsoft-store/"
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14755-1.html"
|
||||
|
||||
微软将对应用商店中开源软件的收费进行限制
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/25/101648dlxnqxkaox00xc3l.jpg)
|
||||
|
||||
2022 年 6 月 16 日,微软更新了其应用商店的策略。其中一项禁止了发布者对开源或免费的软件收取费用,另一项则针对的是商店使用的不合理高价。如果你在过去几年中访问过微软应用商店,你可能已经注意到,它正在成为越来越多的开源和免费产品的所在地。如果原始开发者将应用程序和游戏上传到商店,这将是有益的,但情况并非如此,因为它们是由第三方上传的。
|
||||
|
||||
更糟糕的是,其中许多程序仅作为付费应用提供,而不是免费下载。换句话说,微软的客户必须付费才能购买应用商店的版本,而它们在其他地方是免费的!在应用商店中,免费版和付费版有时并存。为免费应用付费已经够糟糕的了,但这并不是用户在购买时可能遇到的唯一问题。更新也可能是一个问题,因为山寨应用可能不会像源头应用程序那样频繁或快速地更新。
|
||||
|
||||
在更新的微软商店政策中,微软在 10.8.7 节下指出:
|
||||
|
||||
> 在您决定产品或应用内购买的定价时,您的数字产品或服务的所有定价(包括销售或折扣)必须:
|
||||
>
|
||||
> 遵守所有适用的法律、法规和监管要求,包括联邦贸易委员会的《反欺骗性定价指南》。您不得试图从开源软件或其他可免费获得的软件中获利,您的产品也不应提供一个(与它提供的特性和功能相比)过高的不合理定价。
|
||||
|
||||
这个新策略在更新部分中得到了确认。如果开源和免费产品普遍免费提供,则它们不得在微软应用商店上出售,发布者也不得对其产品收取不合理的高价。开源和免费应用的开发者可以在微软应用商店上为其产品收费。例如,Paint.net 的开发者就是这样做的。如果微软强制执行这些策略,许多应用将从应用商店中删除。以前,开发者可以向微软报告应用程序,但在新策略下,微软可以直接控制应用的列出和提交。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2022/06/microsoft-to-charge-for-available-open-source-software-in-microsoft-store/
|
||||
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.opensourceforu.com/author/laveesh-kocher/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.opensourceforu.com/wp-content/uploads/2022/06/microsoft-e1655714723942.jpg
|
@ -0,0 +1,76 @@
|
||||
[#]: subject: "Mysterious GeckoLinux Creator Reveals a New Debian Remix Distro"
|
||||
[#]: via: "https://news.itsfoss.com/debian-remix-spiral-linux/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14758-1.html"
|
||||
|
||||
神秘的 GeckoLinux 创建者推出了一个新的 Debian 合成发行版
|
||||
======
|
||||
|
||||
> GeckoLinux 创建者推出了一个基于 Debian 的新 Linux 发行版,专注于简单性和可用性。
|
||||
|
||||
![Linux 螺旋][1]
|
||||
|
||||
GeckoLinux 改进了的 openSUSE 体验,它的创建者一直保持匿名。
|
||||
|
||||
我不会评论这是好事还是坏事,但现在,开发者又带着另一个基于 Debian 的类似项目回来了。
|
||||
|
||||
**SpiralLinux**,这是一个基于 Debian 的发行版,旨在使 Debian 适合最终用户使用。
|
||||
|
||||
### SpiralLinux:基于 Debian 构建的发行版
|
||||
|
||||
![SpiralLinux][2]
|
||||
|
||||
毫不奇怪,大多数用户友好的 Linux 发行版都将 Debian 作为其原始基础。Ubuntu 就是在此基础上进行了大量改进,从而提供了良好的桌面体验,即使对于没有 Linux 经验的用户也是如此。
|
||||
|
||||
那么,这个发行版有什么不同呢?
|
||||
|
||||
嗯,它的创建者说,这个项目旨在帮助你获得 Debian 的所有核心优势,而无需定制很多东西。
|
||||
|
||||
如果你想在桌面上使用 Debian,SpiralLinux 是一种接近原版的体验。你还可以根据需要升级到最新的稳定 Debian 版本(或不稳定/测试版),而不会丢失方便易用的自定义设置。
|
||||
|
||||
换句话说,SpiralLinux 使 Debian 适合桌面使用,而最终用户只需付出最小的努力。
|
||||
|
||||
为了实现这一点,SpiralLinux 使用了 Debian 官方软件包存储库,并提供了现场安装方式,让你能够定制自己的 Debian 系统。
|
||||
|
||||
此外,SpiralLinux 还具有以下功能:
|
||||
|
||||
* 开箱即用的 VirtualBox 支持
|
||||
* 预装了专有的媒体编解码器和非自由软件包存储库
|
||||
* 预装了专有固件
|
||||
* 打印机支持
|
||||
* 通过 GUI(软件中心)支持 Flatpak
|
||||
* 默认启用 zRAM 交换
|
||||
* 多种桌面环境(Cinnamon、XFCE、Gnome、Plasma、MATE、Budgie、LXQt)
|
||||
|
||||
Debian 始终坚持使用开源和自由软件包,最终用户必须自己搞定编解码器、驱动程序和其他软件包,才能使许多功能正常工作,获得令他们满意的桌面体验。
|
||||
|
||||
而 SpiralLinux 似乎可以作为 Debian 的一个有用的替代品,就像 GeckoLinux 之于 openSUSE 一样。
|
||||
|
||||
### 下载 SpiralLinux
|
||||
|
||||
如果你一直想尝试 Debian,但又不想在初始配置上费尽心思,你可以尝试 SpiralLinux。
|
||||
|
||||
你可以前往其托管在 GitHub 上的官网以了解更多信息,链接如下:
|
||||
|
||||
> **[SpiralLinux][3]**
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/debian-remix-spiral-linux/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[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/wp-content/uploads/2022/06/spiral-linux-debian-remix-distro.jpg
|
||||
[2]: https://news.itsfoss.com/wp-content/uploads/2022/06/spirallinux.jpg
|
||||
[3]: https://spirallinux.github.io/
|
@ -0,0 +1,45 @@
|
||||
[#]: subject: "The Final Version Of 7-Zip 22.00 Is Now Available"
|
||||
[#]: via: "https://www.opensourceforu.com/2022/06/the-final-version-of-7-zip-22-00-is-now-available/"
|
||||
[#]: author: "Laveesh Kocher https://www.opensourceforu.com/author/laveesh-kocher/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14764-1.html"
|
||||
|
||||
7-Zip 22.00 最终版现已推出
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/27/110310hwrmxuwyqlor1olp.jpg)
|
||||
|
||||
7-Zip 是用于 Windows、Mac 和 Linux 的知名开源文件归档器。它的最新版本 22.00 现已推出。它是 2022 年的第一个稳定版本。上一个版本是 21.07,于 2021 年 12 月发布。7-Zip 的用户可以从官方网站获取该应用的最新版本,下载适用于 Windows 64 位、32 位和 ARM 版本。该应用仍然与过时的 Windows 版本兼容,例如 XP 和 Vista。它还支持所有官方支持的 Windows 版本,包括服务器版本。适用于 Linux 的 7-Zip 22.00 已经可以下载,但 Mac OS 版本还不可用。
|
||||
|
||||
7-Zip 22.00 包含一些增强了应用功能的新特性。这个归档器现在支持提取<ruby>苹果文件系统<rt>Apple File System</rt></ruby>(APFS)镜像。几年前,苹果公司在 Mac OS 10.13 和 iOS 中引入了苹果文件系统。该文件系统在设计时就考虑到了闪存(Flash)和固态硬盘(SSD)存储。
|
||||
|
||||
7-Zip 22.00 包括了对其 TAR 存档支持的多项增强。使用选项 `-ttar -mm=pax` 或 `-ttar -mm=posix`,7-Zip 现在可以创建符合 POSIX 标准的 tar 格式的 TAR 档案。此外,使用选项 `ttar -mm=pax -mtp=3 -mtc -mta`,7-Zip 可以在 tar/pax 存档中存储高精度的文件时间戳。
|
||||
|
||||
最后,Linux 用户可以在 TAR 归档文件中使用以下两个新选项:
|
||||
|
||||
* `snoi`:将所有者/组 ID 保存在存档中,或将所有者/组 ID 从存档复制到提取的文件中。
|
||||
* `snon`:在存档中保留所有者/组的名称。
|
||||
|
||||
适用于 Windows 的 7-Zip 22.00 添加了对 `-snz` 选项的支持,该选项用于传播区识别符(LCTT 译注:区标识符是微软在 2013 年为 IE 设计的安全功能,它会标记那些用户自网络上所下载的文件,并在用户准备打开时跳出警告)。
|
||||
|
||||
要提取文件,请使用标识符流。出于安全目的,Windows 使用了该流,它可用于确定文件是在本地创建的还是从互联网下载的。
|
||||
|
||||
在“<ruby>添加到存档<rt>add to archive</rt></ruby>”配置对话框中,7-Zip 22.00 包含一个新的选项窗口。它包括用于更改时间戳精度、更改其他与时间相关的配置选项,以及防止更改源文件的最后访问时间等选项。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.opensourceforu.com/2022/06/the-final-version-of-7-zip-22-00-is-now-available/
|
||||
|
||||
作者:[Laveesh Kocher][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.opensourceforu.com/author/laveesh-kocher/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://www.opensourceforu.com/wp-content/uploads/2022/06/7-zip-2200-500x312-1.jpg
|
@ -0,0 +1,70 @@
|
||||
[#]: subject: "This Open-Source Project Proves Chrome Extensions Can Track You"
|
||||
[#]: via: "https://news.itsfoss.com/chrome-extension-tracking/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14768-1.html"
|
||||
|
||||
你安装的 Chrome 扩展的组合可以跟踪你
|
||||
======
|
||||
|
||||
> 这会成为放弃基于 Chromium 的浏览器并开始使用 Firefox 的一个理由吗?也许吧,决定权在你。
|
||||
|
||||
![Chrome 扩展追踪器][1]
|
||||
|
||||
即使你有了所有的隐私扩展和各种保护功能,别人仍然有方法可以识别你或跟踪你。
|
||||
|
||||
请注意,并非所有浏览器都是如此,本文中,我们主要关注基于 Chromium 的浏览器,并将谷歌 Chrome 作为“主要嫌疑人”。
|
||||
|
||||
以前,在 Chromium 浏览器上,尽管别人已经能够检测到你已安装的扩展程序,但许多扩展程序都实施了某些保护措施来防止这种检测。
|
||||
|
||||
然而,一位名为 “**z0ccc**” 的安全研究人员发现了一种检测已安装 Chrome 浏览器扩展程序的新方法,该方法可进一步用于**通过“浏览器指纹识别”来跟踪你**。
|
||||
|
||||
如果你还不知道的话:<ruby>浏览器指纹识别<rt>Browser Fingerprinting</rt></ruby>是指收集有关你的设备/浏览器的各种信息,以创建唯一的指纹 ID(哈希),从而在互联网上识别你的一种跟踪方法。“各种信息”包括:浏览器名称、版本、操作系统、已安装的扩展程序、屏幕分辨率和类似的技术数据。
|
||||
|
||||
这听起来像是一种无害的数据收集技术,但可以使用这种跟踪方法在线跟踪你。
|
||||
|
||||
### 检测谷歌 Chrome 扩展
|
||||
|
||||
研究人员发布了一个开源项目 “**Extension Fingerprints**”,你可以使用它来测试你安装的 Chrome 扩展是否能被检测到。
|
||||
|
||||
新技术涉及一种“时间差”方法,该工具比较了扩展程序获取资源的时间。与浏览器上未安装的其他扩展相比,受保护的扩展需要更多时间来获取资源。因此,这有助于从 1000 多个扩展列表中识别出一些扩展。
|
||||
|
||||
关键是:即使有了各种新的进步和技术来防止跟踪,Chrome 网上应用店的扩展也可以被检测到。
|
||||
|
||||
![][2]
|
||||
|
||||
并且,在检测到已安装的扩展程序后,别人可以就使用浏览器指纹识别,对你进行在线跟踪。
|
||||
|
||||
令人惊讶的是,即使你安装有 uBlocker、AdBlocker、或 Privacy Badger(一些流行的以隐私为重点的扩展程序)之类的扩展程序,使用了这种方法,它们也都可以被检测到。
|
||||
|
||||
你可以在它的 [GitHub 页面][3] 上查看所有技术细节。如果你想自己测试它,请前往它的 [扩展指纹识别网站][4] 自行检查。
|
||||
|
||||
### 拯救 Firefox?
|
||||
|
||||
嗯,似乎是的,毕竟我出于各种原因,[不断回到 Firefox][5]。
|
||||
|
||||
这个新发现的(跟踪)方法应该适用于所有基于 Chromium 的浏览器。我在 Brave 和谷歌 Chrome 上都测试了这个方法。研究人员还提到,该工具不能在使用微软应用商店中的扩展的微软 Edge 上工作。但是,相同的跟踪方法仍然有效。
|
||||
|
||||
正如研究人员指出,Mozilla Firefox 可以避免这种情况,因为每个浏览器实例的扩展 ID 都是唯一的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/chrome-extension-tracking/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[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/wp-content/uploads/2022/06/opensource-project-tracker-chrome-extensions.jpg
|
||||
[2]: https://news.itsfoss.com/wp-content/uploads/2022/06/extension-fingerprints.jpg
|
||||
[3]: https://github.com/z0ccc/extension-fingerprints
|
||||
[4]: https://z0ccc.github.io/extension-fingerprints/
|
||||
[5]: https://news.itsfoss.com/why-mozilla-firefox/
|
@ -0,0 +1,142 @@
|
||||
[#]: subject: "Manage your Rust toolchain using rustup"
|
||||
[#]: via: "https://opensource.com/article/22/6/rust-toolchain-rustup"
|
||||
[#]: author: "Gaurav Kamathe https://opensource.com/users/gkamathe"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "turbokernel"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14779-1.html"
|
||||
|
||||
使用 rustup 管理你的 Rust 工具链
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/30/145426h9he5z111149ctcj.jpg)
|
||||
|
||||
> rustup 可用于 Rust 安装与更新。它还能够在稳定版、测试版和每日更新版之间无缝切换 Rust 编译器及其工具。
|
||||
|
||||
[Rust 编程语言][2] 如今变得越来越流行,受到爱好者和公司的一致好评。它受欢迎的原因之一是 Rust 提供的令人惊叹的工具,使其成为开发人员使用的乐趣。[rustup][3] 是管理 Rust 工具的官方工具。它不仅可以安装和更新 Rust ,它还能够在稳定版、测试版和每日更新版之间无缝切换 Rust 编译器及其工具。本文将向你介绍 `rustup` 及其一些常用命令。
|
||||
|
||||
### 默认 Rust 安装方式
|
||||
|
||||
如果你想在 Linux 上安装 Rust,你可以使用你的包管理器。在 Fedora 或 CentOS Stream 上,你可以这样:
|
||||
|
||||
```
|
||||
$ sudo dnf install rust cargo
|
||||
```
|
||||
|
||||
这提供了一个稳定版的 Rust 工具链,如果你是 Rust 的初学者,并想尝试编译和运行简单的程序,它会非常有用。但是,由于 Rust 是一种新的编程语言,它变化很快,并且经常添加许多新功能。这些功能是 Rust 工具链的每日更新版和之后测试版的一部分。要试用这些功能,你需要安装这些较新版本的工具链,而不会影响系统上的稳定版本。不幸的是,你的发行版的包管理器在这里无法做到。
|
||||
|
||||
### 使用 rustup 安装 Rust 工具链
|
||||
|
||||
要解决上述问题,你可以下载安装脚本:
|
||||
|
||||
```
|
||||
$ curl --proto '=https' --tlsv1.2 \
|
||||
-sSf https://sh.rustup.rs > sh.rustup.rs
|
||||
```
|
||||
|
||||
检查它,然后运行它。它不需要 root 权限,并根据你的本地用户权限安装 Rust:
|
||||
|
||||
```
|
||||
$ file sh.rustup.rs
|
||||
sh.rustup.rs: POSIX shell script, ASCII text executable
|
||||
$ less sh.rustup.rs
|
||||
$ bash sh.rustup.rs
|
||||
```
|
||||
|
||||
出现提示时选择选项 `1`:
|
||||
|
||||
```
|
||||
1) Proceed with installation (default)
|
||||
2) Customize installation
|
||||
3) Cancel installation
|
||||
> 1
|
||||
```
|
||||
|
||||
安装后,你必须获取环境变量以确保 `rustup` 命令立即可供你运行:
|
||||
|
||||
```
|
||||
$ source $HOME/.cargo/env
|
||||
```
|
||||
|
||||
验证是否安装了 Rust 编译器(`rustc`)和 Rust 包管理器(`cargo`):
|
||||
|
||||
```
|
||||
$ rustc --version
|
||||
$ cargo --version
|
||||
```
|
||||
|
||||
### 查看已安装和可用的工具链
|
||||
|
||||
你可以使用以下命令查看已安装的不同工具链以及哪个工具链是可用的:
|
||||
|
||||
```
|
||||
$ rustup show
|
||||
```
|
||||
|
||||
### 在工具链之间切换
|
||||
|
||||
你可以查看默认工具链并根据需要进行更改。如果你当前使用的是稳定版工具链,并希望尝试每日更新版中提供的新功能,你可以轻松切换到每日更新版工具链:
|
||||
|
||||
```
|
||||
$ rustup default
|
||||
$ rustup default nightly
|
||||
```
|
||||
|
||||
要查看 Rust 的编译器和包管理器的完整路径:
|
||||
|
||||
```
|
||||
$ rustup which rustc
|
||||
$ rustup which cargo
|
||||
```
|
||||
|
||||
### 检查和更新工具链
|
||||
|
||||
要检查是否有新的 Rust 工具链可用:
|
||||
|
||||
```
|
||||
$ rustup check
|
||||
```
|
||||
|
||||
假设一个新版本的 Rust 发布了,其中包含一些有趣的特性,并且你想要获取最新版本的 Rust。你可以使用 `update` 子命令来做到这一点:
|
||||
|
||||
```
|
||||
$ rustup update
|
||||
```
|
||||
|
||||
### 帮助和文档
|
||||
|
||||
以上命令对于日常使用来说绰绰有余。尽管如此,`rustup` 有多种命令,你可以参考帮助部分了解更多详细信息:
|
||||
|
||||
```
|
||||
$ rustup --help
|
||||
```
|
||||
|
||||
`rustup` 在 GitHub 上有完整的 [参考手册][4],你可以用作参考。所有 Rust 文档都安装在你的本地系统上,不需要你连接到互联网。你可以访问包括书籍、标准库等在内的本地文档:
|
||||
|
||||
```
|
||||
$ rustup doc
|
||||
$ rustup doc --book
|
||||
$ rustup doc --std
|
||||
$ rustup doc --cargo
|
||||
```
|
||||
|
||||
Rust 是一种正在积极开发中的令人兴奋的语言。如果你对编程的发展方向感兴趣,请关注 Rust!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/22/6/rust-toolchain-rustup
|
||||
|
||||
作者:[Gaurav Kamathe][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[turbokernel](https://github.com/turbokernel)
|
||||
|
||||
本文由 [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/tools_hardware_purple.png
|
||||
[2]: https://www.rust-lang.org/
|
||||
[3]: https://github.com/rust-lang/rustup
|
||||
[4]: https://rust-lang.github.io/rustup/
|
@ -0,0 +1,131 @@
|
||||
[#]: subject: "Minetest, an Open Source Minecraft Alternative"
|
||||
[#]: via: "https://itsfoss.com/minetest/"
|
||||
[#]: author: "John Paul https://itsfoss.com/author/john/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14774-1.html"
|
||||
|
||||
Minetest:一个开源的 Minecraft 替代品
|
||||
======
|
||||
|
||||
早在 2009 年,Minecraft 就来到了这个世界。从那时起,它已经成为一种文化现象。在这段时间里,一些开发者发布了具有类似想法和机制的开源游戏。今天,我们将看看其中最大的一个:Minetest。
|
||||
|
||||
### 什么是 Minetest?
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202206/29/151524eem52oyatm2tz2dr.jpg)
|
||||
|
||||
[Minetest][2],简单地说,是一个基于<ruby>体素<rt>voxel</rt></ruby>的沙盒游戏,与 Minecraft 非常相似。与 Minecraft 不同的是,Minetest 是用 C++ 编写的,并被设计成可以在大多数系统上原生运行。它也有一个非常大的地图区域。地图大小为 “62,000 × 62,000 × 62,000 块”,“你可以向下开采 31,000 块,或向上建造 31,000 块”。
|
||||
|
||||
有趣的是,Minetest 最初是以专有许可证发布的,但后来被重新授权为 GPL。此后,它又被重新授权为 LGPL。
|
||||
|
||||
Minetest 有几种模式。你可以建造并发挥创意,或者你可以尝试在各种元素中生存。你并不局限于这些模式。Minetest 有大量的 [额外内容][3],包括 <ruby>模组<rt>mod</rt></ruby>、纹理包和在 Minetest 中建立的游戏。这主要是通过 Minetest 的 [模组 API][4] 和 Lua 完成的。
|
||||
|
||||
![minetest packages][5]
|
||||
|
||||
对于那些玩过 Minecraft 的人来说,你会发现 Minetest 中的体验非常相似。你可以挖掘资源,建造结构,并结合材料来制作工具。我在 Minetest 中没有注意到的一件事是怪物。我认为 Minetest 中没有任何生物,但话说回来,我只在创意模式中玩过。我还没有玩过生存模式。
|
||||
|
||||
Minetest 也被用于 [教育][6]。例如,瑞士 CERN 的人用 Minetest 创造了一个游戏,以 [展示互联网是如何工作的][7] 以及它是如何被创造出来的。Minetest 还被用于 [教授][8] 编程、地球科学以及微积分和三角学。
|
||||
|
||||
![minetes map1][9]
|
||||
|
||||
### 如何安装 Minetest?
|
||||
|
||||
Minetest 几乎在每个系统上都可以使用。下面是一个命令列表,你可以用它来在一些最流行的 Linux 发行版中安装 Minetest。
|
||||
|
||||
#### Ubuntu 或者 Debian
|
||||
|
||||
如果你有一个基于 Ubuntu 或 Debian 的发行版,只要在终端输入这个命令:
|
||||
|
||||
```
|
||||
sudo apt install mintest
|
||||
```
|
||||
|
||||
#### Arch 或者 Manjaro
|
||||
|
||||
对于基于 Arch 的系统(如 Manjaro),使用:
|
||||
|
||||
```
|
||||
sudo pacman -S minetest
|
||||
```
|
||||
|
||||
#### Fedora
|
||||
|
||||
你可以从 Fedora 服务器中输入以下命令安装 Mintest:
|
||||
|
||||
```
|
||||
sudo dnf install mintest
|
||||
```
|
||||
|
||||
#### openSUSE
|
||||
|
||||
openSUSE 用户可以用这个命令安装 Minetest:
|
||||
|
||||
```
|
||||
sudo zypper in mintest
|
||||
```
|
||||
|
||||
#### FreeBSD
|
||||
|
||||
FreeBSD 用户很幸运。他们可以用这个命令安装 Mintest:
|
||||
|
||||
```
|
||||
pkg install minetest minetest_game
|
||||
```
|
||||
|
||||
#### Snap
|
||||
|
||||
要安装 Minetest 的 Snap 包,请在终端输入以下命令:
|
||||
|
||||
```
|
||||
sudo snap install minetest
|
||||
```
|
||||
|
||||
#### Flathub
|
||||
|
||||
要安装,请输入:
|
||||
|
||||
```
|
||||
flatpak install flathub net.minetest.Minetest
|
||||
```
|
||||
|
||||
你可以在 [这里][11] 下载 Windows 的可移植执行文件。你也可以在 Android 上安装 Minetest,可以通过 [Google Play][12] 或 [下载 APK][13]。
|
||||
|
||||
### 总结
|
||||
|
||||
![minetest about][14]
|
||||
|
||||
我已经在 Minetest 中花了几个小时在我的本地系统上进行构建和探索。它非常有趣。我还没来得及尝试任何额外的内容,因为我对我玩过的相对较少的游戏部分非常满意。我遇到的唯一麻烦是,由于某种原因,它在 Fedora 上运行缓慢。我可能存在一些配置上的错误。
|
||||
|
||||
如果你曾经认为 Minecraft 看起来很有趣,但不想花钱,那就去看看 Minetest。你会很高兴你这么做。
|
||||
|
||||
如果你玩过 Minetest,在评论中告诉我们你的体验如何。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/minetest/
|
||||
|
||||
作者:[John Paul][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/john/
|
||||
[b]: https://github.com/lkxed
|
||||
[1]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-start-800x411.jpg
|
||||
[2]: https://www.minetest.net/
|
||||
[3]: https://content.minetest.net/
|
||||
[4]: https://dev.minetest.net/Modding_Intro
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-packages-800x411.jpg
|
||||
[6]: https://www.minetest.net/education/
|
||||
[7]: https://forum.minetest.net/viewtopic.php?t=22871
|
||||
[8]: https://en.wikipedia.org/wiki/Minetest#Usage_in_education
|
||||
[9]: https://itsfoss.com/wp-content/uploads/2022/03/minetes-map1-800x411.png
|
||||
[10]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-map2-800x413.png
|
||||
[11]: https://www.minetest.net/downloads/
|
||||
[12]: https://play.google.com/store/apps/details?id=net.minetest.minetest&utm_source=website&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1
|
||||
[13]: https://github.com/minetest/minetest/releases/download/5.5.0/app-armeabi-v7a-release.apk
|
||||
[14]: https://itsfoss.com/wp-content/uploads/2022/03/minetest-about-800x407.jpg
|
@ -0,0 +1,91 @@
|
||||
[#]: subject: "GitHub Copilot is Now Available for All and Not Everyone Likes It"
|
||||
[#]: via: "https://news.itsfoss.com/github-copilot/"
|
||||
[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14759-1.html"
|
||||
|
||||
GitHub Copilot 现已可供所有人使用,但并非所有人都喜欢它
|
||||
======
|
||||
|
||||
> GitHub Copilot 来了,它能帮助程序员,为他们提供人工智能的编码建议,不过,它是否会让事情变得更糟呢?
|
||||
|
||||
![GitHub][1]
|
||||
|
||||
在 2021 年,我曾花了好几个小时来翻阅 GitHub Copilot 文档,试图弄清楚如何能够加入它的技术预览计划。还好,这一切都得到了回报,我成功加入了预览计划。
|
||||
|
||||
而现在,它终于可供所有人使用啦!
|
||||
|
||||
如果你还不知道的话,[GitHub Copilot][2] 是一个 AI 助手,可帮助你更快、更高效地编写代码。
|
||||
|
||||
我能想到的最类似的东西,就是你手机上的(输入法的)自动完成功能。不过,与自动完成功能不同,GitHub Copilot 编写代码,就相当于是在完成整段的句子。
|
||||
|
||||
### Copilot 现已可供大众使用
|
||||
|
||||
正如我在前面提到的,Copilot 已经处于技术预览阶段将近一年了。这意味着,GitHub 只允许非常有限数量的开发者免费使用它,以换取同意 GitHub 监控他们的使用情况,从而改进程序的最终版本。
|
||||
|
||||
看起来 GitHub 终于满意地向公众发布了它。现在,任何拥有 GitHub 帐户的人都应该能够使用它,尽管需要付出一定的代价(我很快就会在下面提到)。
|
||||
|
||||
[公告][3] 中提到:
|
||||
|
||||
> 直到不久前,人工智能都没有能够帮助改进代码,开发软件的过程几乎完全是手动的。现在,这种情况正在改变。今天,我很高兴地宣布,我们正在向所有个人开发者提供 [GitHub Copilot][4]。你的 AI 配对程序员来啦。
|
||||
>
|
||||
> —— [Thomas Dohmke][5],GitHub CEO
|
||||
|
||||
Copilot 作为免费的编辑器扩展,已经帮助数百万开发者加快了他们的编程速度。然而,它确实是有代价的,无论是直接的还是间接的。
|
||||
|
||||
### GitHub Copilot 定价
|
||||
|
||||
与几乎所有令人兴奋的新技术一样,Copilot 对某些人来说可能过于昂贵。它将花费你 10 美元/月或 100 美元/年。
|
||||
|
||||
如果你是开源项目维护者或经过验证的学生,那么你可以免费使用它。
|
||||
|
||||
### GitHub Copilot 不道德吗?
|
||||
|
||||
围绕 GitHub Copilot 产品的争议巨大且令人担忧。从技术上讲,这个人工智能是使用大家托管在 GitHub 上的代码来进行训练的。
|
||||
|
||||
因此,基本上,GitHub 是通过使用你的代码来提供一个新产品(如果你愿意的话,还可以加点料)。而且,关于 Copilot,可别忘了,自由软件基金会(FSF)也 [建议][6] 不要在 GitHub 上托管代码。
|
||||
|
||||
我们知道,企业总是喜欢利用事物,但有些人认为这应该不会直接损害托管在 GitHub 上的项目/代码。
|
||||
|
||||
**但是,是这样吗?**
|
||||
|
||||
简而言之,在 Copilot 发布后,许多开发者都分享说,他们发现 GitHub Copilot 生成了受版权保护的代码:
|
||||
|
||||
> 我试了下 GitHub Copilot,这是一项付费服务,来看看它是否会使用带有限制性许可证的存储库的代码。我检查了它,看看它是否有我在之前雇主那里编写的代码,该代码有一个许可证,只允许其用于免费游戏,并且需要附加许可证。是的,它确实有。
|
||||
|
||||
![图源:推特上的 Chris Green][7]
|
||||
|
||||
当然,如果我们查看 GitHub Copilot 的常见问题解答(FAQ),其中提到:
|
||||
|
||||
> GitHub 不拥有 GitHub Copilot 生成的建议。您在 GitHub Copilot 的帮助下编写的代码属于您自己,由您自己负责。
|
||||
|
||||
所以说,你为一项服务付了费,最终却为你的项目增加了不便和更多的工作?
|
||||
|
||||
在我看来,就简化开发者的任务而言,这听起来一点儿也不令人兴奋。
|
||||
|
||||
*你对此有什么想法?请在下面的评论区中分享一下吧!*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/github-copilot/
|
||||
|
||||
作者:[Jacob Crume][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [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/wp-content/uploads/2022/06/github-copilot.jpg
|
||||
[2]: https://copilot.github.com/
|
||||
[3]: https://github.blog/2022-06-21-github-copilot-is-generally-available-to-all-developers/
|
||||
[4]: http://copilot.github.com
|
||||
[5]: https://github.blog/author/ashtom/
|
||||
[6]: https://www.fsf.org/blogs/licensing/fsf-funded-call-for-white-papers-on-philosophical-and-legal-questions-around-copilot
|
||||
[7]: https://pbs.twimg.com/media/FV45qM_VEAALLv6?format=png&name=medium
|
||||
[8]: https://twitter.com/ChrisGr93091552/status/1539731632931803137?ref_src=twsrc%5Etfw
|
@ -0,0 +1,64 @@
|
||||
[#]: subject: "Linus Torvalds Expects to See Rust Support in the Kernel Soon"
|
||||
[#]: via: "https://news.itsfoss.com/linux-kernel-rust/"
|
||||
[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "lkxed"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14763-1.html"
|
||||
|
||||
Linus Torvalds 暗示很快就可以在内核中看到对 Rust 的支持
|
||||
======
|
||||
|
||||
> 正如 Linus Torvalds 所暗示,Linux Kernel 5.20 发布时可能会提供对 Rust 的支持。你怎么看?
|
||||
|
||||
![Linus][1]
|
||||
|
||||
市面上已经有许多用 Rust 重写的开源项目。因此,如今 Rust 被认为是 Linux 内核的第二语言,也就不足为奇了。
|
||||
|
||||
几天前,在 [Linux 基金会开源峰会][2] 上,Linus Torvals 提到他们预计将在下一个内核版本(即 Linux 内核 5.20)中对 Rust 进行试验。
|
||||
|
||||
或许你不知道,正如 [Phoronix][3] 率先报道的那样,Linux 已经有了 Rust 内核补丁,包含了少量的示例驱动程序,以及基本的基础设施的启用代码。
|
||||
|
||||
因此,Linus Torvalds 对可能合并 Rust 支持的暗示,也不足为奇。但是,这无疑是令人兴奋的!
|
||||
|
||||
### 用于 Linux 内核的 Rust
|
||||
|
||||
这么做的最终目标是让 Linux 内核变得更好,但它现在仍然处于试运行阶段。
|
||||
|
||||
凭借其各种优势,Rust 正日益成为一种流行的编程语言。还记得吗,[System76 也在开发一个用 Rust 编写的新桌面环境][4]。
|
||||
|
||||
然而,并不是所有参与维护 Linux 内核的人都熟悉这种编程语言。
|
||||
|
||||
那么,这会是一个问题吗?
|
||||
|
||||
Linus Torvalds 并不认为这是一个大问题,因为内核中也有其他语言。他还提到希望看到 Rust 成为新的一份子。
|
||||
|
||||
[The Register][5] 报道称,Linus Torvalds 表示会信任维护者,除非他们犯了错误。
|
||||
|
||||
### Linux 5.20:何时发布?
|
||||
|
||||
Linux 内核 5.19 版本将于 7 月底左右发布。因此,5.20 版本的合并窗口应该会在其稳定版发布后开启(假设没有意外延迟的话)。
|
||||
|
||||
除了 Rust 以外,Linux 内核 5.20 应该也是对包括 RDNA3 在内的下一代硬件支持的重要更新,它同时提供了更多功能。
|
||||
|
||||
*你如何看待 Rust 将在不久的将来进入 Linux 呢?你感到兴奋吗?欢迎在下方评论区告诉我们~*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://news.itsfoss.com/linux-kernel-rust/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[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/wp-content/uploads/2022/06/linus-expects-rust-support-in-linux-kernel-soon.jpg
|
||||
[2]: https://events.linuxfoundation.org/open-source-summit-north-america/
|
||||
[3]: https://www.phoronix.com/scan.php?page=news_item&px=Rust-Linux-v7-Plus-New-Uutils
|
||||
[4]: https://news.itsfoss.com/system76-rust-cosmic-desktop/
|
||||
[5]: https://www.theregister.com/2022/06/23/linus_torvalds_rust_linux_kernel/
|
@ -0,0 +1,267 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14792-1.html)
|
||||
[#]: subject: (Djinn: A Code Generator and Templating Language Inspired by Jinja2)
|
||||
[#]: via: (https://theartofmachinery.com/2021/01/01/djinn.html)
|
||||
[#]: author: (Simon Arneaud https://theartofmachinery.com)
|
||||
|
||||
Djinn:一个受 Jinja2 启发的代码生成器和模板语言
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/04/101711nq2we7z7x7wz2z7e.jpg)
|
||||
|
||||
代码生成器是非常有用的工具。我有时使用 [jinja2][1] 的命令行版本来生成高度冗余的配置文件和其他文本文件,但它在转换数据方面功能有限。显然,Jinja2 的作者有不同的想法,而我想要类似于 <ruby>列表推导<rt>list comprehensions</rt></ruby> 或 D 语言的 <ruby>可组合范围<rt>composable range</rt></ruby> 算法之类的东西。
|
||||
|
||||
我决定制作一个类似于 Jinja2 的工具,但让我可以通过使用范围算法转换数据来生成复杂的文件。这个想法非常简单:一个直接用 D 语言代码重写的模板语言。因为它 _就是_ D 语言,它可以支持 D 语言所能做的一切。我想要一个独立的代码生成器,但是由于 [D 语言的 `mixin` 特性][2],同样的模板语言可以作为嵌入式模板语言工作(例如,Web 应用程序中的 HTML)。有关该技巧的更多信息,请参阅 [这篇关于在编译时使用 mixins 将 Brainfuck 转换为 D 和机器代码的文章][3]。
|
||||
|
||||
像往常一样,[源码在 GitLab 上][4]。[这篇文章中的例子也可以在这里找到][5]。
|
||||
|
||||
### Hello world 示例
|
||||
|
||||
这是一个演示这个想法的例子:
|
||||
|
||||
```
|
||||
Hello [= retro("dlrow") ]!
|
||||
[: enum one = 1; :]
|
||||
1 + 1 = [= one + one ]
|
||||
```
|
||||
|
||||
`[= some_expression ]` 类似于 Jinja2 中的 `{{ some_expression }}`,它在输出中呈现一个值。`[: some_statement; :]` 类似于 `{% some_statement %}` ,用于执行完整的代码语句。我更改了语法,因为 D 也大量使用花括号,并且将两者混合使模板难以阅读(还有一些特殊的非 D 指令,比如 `include`,它们被包裹在 `[<` 和 `>]` 中)。
|
||||
|
||||
如果你将上面的内容保存到一个名为 `hello.txt.dj` 的文件中并运行 `djinn` 命令行工具,你会得到一个名为 `hello.txt` 的文件,其中包含你可能猜到的内容:
|
||||
|
||||
```
|
||||
Hello world!
|
||||
1 + 1 = 2
|
||||
```
|
||||
|
||||
如果你使用过 Jinja2,你可能想知道第二行发生了什么。Djinn 有一个简化格式化和空格处理的特殊规则:如果源代码行包含 `[:` 语句或 `[<` 指令但不包含任何非空格输出,则整行都会被忽略输出。空行则仍会原样呈现。
|
||||
|
||||
### 生成数据
|
||||
|
||||
好的,现在来讲一些更实用的东西:生成 CSV 数据。
|
||||
|
||||
```
|
||||
x,f(x)
|
||||
[: import std.mathspecial;
|
||||
foreach (x; iota(-1.0, 1.0, 0.1)) :]
|
||||
[= "%0.1f,%g", x, normalDistribution(x) ]
|
||||
```
|
||||
|
||||
一个 `[=` 和 `]` 对可以包含多个用逗号分隔的表达式。如果第一个表达式是一个由双引号包裹的字符串,则会被解释为 [格式化字符串][6]。下面是输出结果:
|
||||
|
||||
```
|
||||
x,f(x)
|
||||
-1.0,0.158655
|
||||
-0.9,0.18406
|
||||
-0.8,0.211855
|
||||
-0.7,0.241964
|
||||
-0.6,0.274253
|
||||
-0.5,0.308538
|
||||
-0.4,0.344578
|
||||
-0.3,0.382089
|
||||
-0.2,0.42074
|
||||
-0.1,0.460172
|
||||
0.0,0.5
|
||||
0.1,0.539828
|
||||
0.2,0.57926
|
||||
0.3,0.617911
|
||||
0.4,0.655422
|
||||
0.5,0.691462
|
||||
0.6,0.725747
|
||||
0.7,0.758036
|
||||
0.8,0.788145
|
||||
0.9,0.81594
|
||||
```
|
||||
|
||||
### 制作图片
|
||||
|
||||
这个例子展示了一个图片的生成过程。[经典的 Netpbm 图像库定义了一堆图像格式][7],其中一些是基于文本的。例如,这是一个 3 x 3 向量的图像:
|
||||
|
||||
```
|
||||
P2 # PGM 格式标识
|
||||
3 3 # 宽和高
|
||||
7 # 代表纯白色的值(0 代表黑色)
|
||||
7 0 7
|
||||
0 0 0
|
||||
7 0 7
|
||||
```
|
||||
|
||||
你可以将上述文本保存到名为 `cross.pgm` 之类的文件中,很多图像工具都知道如何解析它。下面是一些 Djinn 代码,它以相同的格式生成 [Mandelbrot 集][8] 分形:
|
||||
|
||||
```
|
||||
[:
|
||||
import std.complex;
|
||||
enum W = 640;
|
||||
enum H = 480;
|
||||
enum kMaxIter = 20;
|
||||
ubyte mb(uint x, uint y)
|
||||
{
|
||||
const c = complex(3.0 * (x - W / 1.5) / W, 2.0 * (y - H / 2.0) / H);
|
||||
auto z = complex(0.0);
|
||||
ubyte ret = kMaxIter;
|
||||
while (abs(z) <= 2 && --ret) z = z * z + c;
|
||||
return ret;
|
||||
}
|
||||
:]
|
||||
P2
|
||||
[= W ] [= H ]
|
||||
[= kMaxIter ]
|
||||
[: foreach (y; 0..H) :]
|
||||
[= "%(%s %)", iota(W).map!(x => mb(x, y)) ]
|
||||
```
|
||||
|
||||
生成的文件大约为 800 kB,但它可以很好地被压缩为 PNG:
|
||||
|
||||
```
|
||||
$ # 使用 GraphicsMagick 进行转换
|
||||
$ gm convert mandelbrot.pgm mandelbrot.png
|
||||
```
|
||||
|
||||
结果如下:
|
||||
|
||||
![][9]
|
||||
|
||||
### 解决谜题
|
||||
|
||||
这里有一个谜题:
|
||||
|
||||
![][10]
|
||||
|
||||
一个 5 行 5 列的网格需要用 1 到 5 的数字填充,每个数字在每一行中限使用一次,在每列中限使用一次(即,制作一个 5 行 5 列的<ruby>拉丁方格<rt>Latin square</rt></ruby>)。相邻单元格中的数字还必须满足所有 `>` 大于号表示的不等式。
|
||||
|
||||
[几个月前我使用了 <ruby>线性规划<rt>linear programming</rt></ruby>(LP)][11]。线性规划问题是具有线性约束的连续变量系统。这次我将使用<ruby>混合整数线性规划<rt>mixed integer linear programming</rt></ruby>(MILP),它通过允许整数约束变量来归纳 LP。事实证明,这足以成为 NP 完备的,而 MILP 恰好可以很好地模拟这个谜题。
|
||||
|
||||
在上一篇文章中,我使用 Julia 库 JuMP 来帮助解决这个问题。这次我将使用 [CPLEX:基于文本的格式][12],它受到多个 LP 和 MILP 求解器的支持(如果需要,可以通过现成的工具轻松转换为其他格式)。这是上一篇文章中 CPLEX 格式的 LP:
|
||||
|
||||
```
|
||||
Minimize
|
||||
obj: v
|
||||
Subject To
|
||||
ptotal: pr + pp + ps = 1
|
||||
rock: 4 ps - 5 pp - v <= 0
|
||||
paper: 5 pr - 8 ps - v <= 0
|
||||
scissors: 8 pp - 4 pr - v <= 0
|
||||
Bounds
|
||||
0 <= pr <= 1
|
||||
0 <= pp <= 1
|
||||
0 <= ps <= 1
|
||||
End
|
||||
```
|
||||
|
||||
CPLEX 格式易于阅读,但复杂度高的问题需要大量变量和约束来建模,这使得手工编码既痛苦又容易出错。有一些特定领域的语言,例如 [ZIMPL][13],用于以高级方式描述 MILP 和 LP。对于许多问题来说,它们非常酷,但最终它们不如具有良好库(如 JuMP)支持的通用语言或使用 D 语言的代码生成器那样富有表现力。
|
||||
|
||||
我将使用两组变量来模拟这个谜题:`v_{r,c}` 和 `i_{r,c,v}`。`v_{r,c}` 将保存 r 行 c 列单元格的值(从 1 到 5)。`i_{r,c,v}` 是一个二进制指示器,如果 r 行 c 列的单元格的值是 v,则该指示器值为 1,否则为 0。这两组变量是网格的冗余表示,但第一种表示更容易对不等式约束进行建模,而第二种表示更容易对唯一性约束进行建模。我只需要添加一些额外的约束来强制这两个表示是一致的。但首先,让我们从每个单元格必须只有一个值的基本约束开始。从数学上讲,这意味着给定行和列的所有指示器都必须为 0,但只有一个值为 1 的例外。这可以通过以下等式强制约束:
|
||||
|
||||
```
|
||||
[i_{r,c,1} + i_{r,c,2} + i_{r,c,3} + i_{r,c,4} + i_{r,c,5} = 1]
|
||||
```
|
||||
|
||||
可以使用以下 Djinn 代码生成对所有行和列的 CPLEX 约束:
|
||||
|
||||
```
|
||||
\ 单元格只有一个值
|
||||
[:
|
||||
foreach (r; iota(N))
|
||||
foreach (c; iota(N))
|
||||
:]
|
||||
[= "%-(%s + %)", vs.map!(v => ivar(r, c, v)) ] = 1
|
||||
[::]
|
||||
```
|
||||
|
||||
`ivar()` 是一个辅助函数,它为我们提供变量名为 `i` 的字符串标识符,而 `vs` 存储从 1 到 5 的数字以方便使用。行和列内唯一性的约束完全相同,但在 `i` 的其他两个维度上迭代。
|
||||
|
||||
为了使变量组 `i` 与变量组 `v` 保持一致,我们需要如下约束(请记住,变量组 `i` 中只有一个元素的值是非零的):
|
||||
|
||||
```
|
||||
[i_{r,c,1} + 2i_{r,c,2} + 3i_{r,c,3} + 4i_{r,c,4} + 5i_{r,c,5} = v_{r,c}]
|
||||
```
|
||||
|
||||
CPLEX 要求所有变量都位于左侧,因此 Djinn 代码如下所示:
|
||||
|
||||
```
|
||||
\ 连接变量组 i 和变量组 v
|
||||
[:
|
||||
foreach (r; iota(N))
|
||||
foreach (c; iota(N))
|
||||
:]
|
||||
[= "%-(%s + %)", vs.map!(v => text(v, ' ', ivar(r, c, v))) ] - [= vvar(r,c) ] = 0
|
||||
[::]
|
||||
```
|
||||
|
||||
不等符号相邻的和左下角值为为 4 单元格的约束写起来都很简单。剩下的便是将指示器变量声明为二进制,并为变量组 `v` 设置边界。加上变量的边界,总共有 150 个变量和 111 个约束 [你可以在仓库中看到完整的代码][14]。
|
||||
|
||||
[GNU 线性规划工具集][15] 有一个命令行工具可以解决这个 CPLEX MILP。不幸的是,它的输出是一个包含了所有内容的体积很大的转储,所以我使用 awk 命令来提取需要的内容:
|
||||
|
||||
```
|
||||
$ time glpsol --lp inequality.lp -o /dev/stdout | awk '/v[0-9][0-9]/ { print $2, $4 }' | sort
|
||||
v00 1
|
||||
v01 3
|
||||
v02 2
|
||||
v03 5
|
||||
v04 4
|
||||
v10 2
|
||||
v11 5
|
||||
v12 4
|
||||
v13 1
|
||||
v14 3
|
||||
v20 3
|
||||
v21 1
|
||||
v22 5
|
||||
v23 4
|
||||
v24 2
|
||||
v30 5
|
||||
v31 4
|
||||
v32 3
|
||||
v33 2
|
||||
v34 1
|
||||
v40 4
|
||||
v41 2
|
||||
v42 1
|
||||
v43 3
|
||||
v44 5
|
||||
|
||||
real 0m0.114s
|
||||
user 0m0.106s
|
||||
sys 0m0.005s
|
||||
```
|
||||
|
||||
这是在原始网格中写出的解决方案:
|
||||
|
||||
![][16]
|
||||
|
||||
这些例子只是用来玩的,但我相信你已经明白了。顺便说一下,Djinn 代码仓库的 `README.md` 文件本身是使用 Djinn 模板生成的。
|
||||
|
||||
正如我所说,Djinn 也可以用作嵌入在 D 语言代码中的编译期模板语言。我最初只是想要一个代码生成器,得益于 D 语言的元编程功能,这算是一个额外获得的功能。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://theartofmachinery.com/2021/01/01/djinn.html
|
||||
|
||||
作者:[Simon Arneaud][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://theartofmachinery.com
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://jinja2docs.readthedocs.io/en/stable/
|
||||
[2]: https://dlang.org/articles/mixin.html
|
||||
[3]: https://theartofmachinery.com/2017/12/31/compile_time_brainfuck.html
|
||||
[4]: https://gitlab.com/sarneaud/djinn
|
||||
[5]: https://gitlab.com/sarneaud/djinn/-/tree/v0.1.0/examples
|
||||
[6]: https://dlang.org/phobos/std_format.html#format-string
|
||||
[7]: http://netpbm.sourceforge.net/doc/#formats
|
||||
[8]: https://en.wikipedia.org/wiki/Mandelbrot_set
|
||||
[9]: https://theartofmachinery.com/images/djinn/mandelbrot.png
|
||||
[10]: https://theartofmachinery.com/images/djinn/inequality.svg
|
||||
[11]: https://theartofmachinery.com/2020/05/21/glico_weighted_rock_paper_scissors.html
|
||||
[12]: http://lpsolve.sourceforge.net/5.0/CPLEX-format.htm
|
||||
[13]: https://zimpl.zib.de/
|
||||
[14]: https://gitlab.com/sarneaud/djinn/-/tree/v0.1.0/examples/inequality.lp.dj
|
||||
[15]: https://www.gnu.org/software/glpk/
|
||||
[16]: https://theartofmachinery.com/images/djinn/inequality_solution.svg
|
@ -0,0 +1,547 @@
|
||||
[#]: subject: "A hands-on tutorial for using the GNU Project Debugger"
|
||||
[#]: via: "https://opensource.com/article/21/1/gnu-project-debugger"
|
||||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "Maisie-x"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14853-1.html"
|
||||
|
||||
手把手教你使用 GNU 调试器
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/22/122211c2fgo53m9tw3xe2p.jpg)
|
||||
|
||||
> GNU 调试器是一个发现程序缺陷的强大工具。
|
||||
|
||||
如果你是一个程序员,想在你的软件增加某些功能,你首先考虑实现它的方法:例如写一个方法、定义一个类,或者创建新的数据类型。然后你用编译器或解释器可以理解的编程语言来实现这个功能。但是,如果你觉得你所有代码都正确,但是编译器或解释器依然无法理解你的指令怎么办?如果软件大多数情况下都运行良好,但是在某些环境下出现缺陷怎么办?这种情况下,你得知道如何正确使用调试器找到问题的根源。
|
||||
|
||||
<ruby>GNU 调试器<rt>GNU Project Debugger</rt></ruby>([GDB][2])是一个发现项目缺陷的强大工具。它通过追踪程序运行过程中发生了什么来帮助你发现程序错误或崩溃的原因。(LCTT 校注:GDB 全程是“GNU Project Debugger”,即 “GNU 项目调试器”,但是通常我们简称为“GNU 调试器”)
|
||||
|
||||
本文是 GDB 基本用法的实践教程。请跟随示例,打开命令行并克隆此仓库:
|
||||
|
||||
```
|
||||
git clone https://github.com/hANSIc99/core_dump_example.git
|
||||
```
|
||||
|
||||
### 快捷方式
|
||||
|
||||
GDB 的每条命令都可以缩短。例如:显示设定的断点的 `info break` 命令可以被缩短为 `i break`。你可能在其他地方看到过这种缩写,但在本文中,为了清晰展现使用的函数,我将所写出整个命令。
|
||||
|
||||
### 命令行参数
|
||||
|
||||
你可以将 GDB 附加到每个可执行文件。进入你克隆的仓库(`core_dump_example`),运行 `make` 进行编译。你现在能看到一个名为 `coredump` 的可执行文件。(更多信息,请参考我的文章《[创建和调试 Linux 的转储文件][3]》。)
|
||||
|
||||
要将 GDB 附加到这个可执行文件,请输入: `gdb coredump`。
|
||||
|
||||
你的输出应如下所示:
|
||||
|
||||
![gdb coredump output][4]
|
||||
|
||||
返回结果显示没有找到调试符号。
|
||||
|
||||
调试信息是<ruby>目标文件<rt>object file</rt></ruby>(可执行文件)的组成部分,调试信息包括数据类型、函数签名、源代码和操作码之间的关系。此时,你有两种选择:
|
||||
|
||||
* 继续调试汇编代码(参见下文“无符号调试”)
|
||||
* 使用调试信息进行编译,参见下一节内容
|
||||
|
||||
### 使用调试信息进行编译
|
||||
|
||||
为了在二进制文件中包含调试信息,你必须重新编译。打开 `Makefile`,删除第 9 行的注释标签(`#`)后重新编译:
|
||||
|
||||
```
|
||||
CFLAGS =-Wall -Werror -std=c++11 -g
|
||||
```
|
||||
|
||||
`-g` 告诉编译器包含调试信息。运行 `make clean`,接着运行 `make`,然后再次调用 GDB。你得到如下输出后就可以调试代码了:
|
||||
|
||||
![GDB output with symbols][5]
|
||||
|
||||
新增的调试信息会增加可执行文件的大小。在这种情况下,执行文件增加了 2.5 倍(从 26,088 字节 增加到 65,480 字节)。
|
||||
|
||||
输入 `run -c1`,使用 `-c1` 开关启动程序。当程序运行到达 `State_4` 时将崩溃:
|
||||
|
||||
![gdb output crash on c1 switch][6]
|
||||
|
||||
你可以检索有关程序的其他信息,`info source` 命令提供了当前文件的信息:
|
||||
|
||||
![gdb info source output][7]
|
||||
|
||||
* 101 行代码
|
||||
* 语言: C++
|
||||
* 编译器(版本、调优、架构、调试标志、语言标准)
|
||||
* 调试格式:[DWARF 2][8]
|
||||
* 没有预处理器宏指令(使用 GCC 编译时,宏仅在 [使用 -g3 标志编译][9] 时可用)。
|
||||
|
||||
`info shared` 命令打印了动态库列表机器在虚拟地址空间的地址,它们在启动时被加载到该地址,以便程序运行:
|
||||
|
||||
![gdb info shared output][10]
|
||||
|
||||
如果你想了解 Linux 中的库处理方式,请参见我的文章 [在 Linux 中如何处理动态库和静态库][11]。
|
||||
|
||||
### 调试程序
|
||||
|
||||
你可能已经注意到,你可以在 GDB 中使用 `run` 命令启动程序。`run` 命令接受命令行参数,就像从控制台启动程序一样。`-c1` 开关会导致程序在第 4 阶段崩溃。要从头开始运行程序,你不用退出 GDB,只需再次运行 `run` 命令。如果没有 `-c1` 开关,程序将陷入死循环,你必须使用 `Ctrl+C` 来结束死循环。
|
||||
|
||||
![gdb output stopped by sigint][12]
|
||||
|
||||
你也可以一步一步运行程序。在 C/C++ 中,入口是 `main` 函数。使用 `list main` 命令打开显示 `main` 函数的部分源代码:
|
||||
|
||||
![gdb output list main][13]
|
||||
|
||||
`main` 函数在第 33 行,因此可以输入 `break 33` 在 33 行添加断点:
|
||||
|
||||
![gdb output breakpoint added][14]
|
||||
|
||||
输入 `run` 运行程序。正如预期的那样,程序在 `main` 函数处停止。输入 `layout src` 并排查看源代码:
|
||||
|
||||
![gdb output break at main][15]
|
||||
|
||||
你现在处于 GDB 的文本用户界面(TUI)模式。可以使用键盘向上和向下箭头键滚动查看源代码。
|
||||
|
||||
GDB 高亮显示当前执行行。你可以输入 `next`(`n`)命令逐行执行命令。如果你没有指定新的命令,GBD 会执行上一条命令。要逐行运行代码,只需按回车键。
|
||||
|
||||
有时,你会发现文本的输出有点显示不正常:
|
||||
|
||||
![gdb output corrupted][16]
|
||||
|
||||
如果发生这种情况,请按 `Ctrl+L` 重置屏幕。
|
||||
|
||||
使用 `Ctrl+X+A` 可以随时进入和退出 TUI 模式。你可以在手册中找到 [其他的键绑定][17] 。
|
||||
|
||||
要退出 GDB,只需输入 `quit`。
|
||||
|
||||
### 设置监察点
|
||||
|
||||
这个示例程序的核心是一个在无限循环中运行的状态机。`n_state` 变量枚举了当前所有状态:
|
||||
|
||||
```
|
||||
while(true){
|
||||
switch(n_state){
|
||||
case State_1:
|
||||
std::cout << "State_1 reached" << std::flush;
|
||||
n_state = State_2;
|
||||
break;
|
||||
case State_2:
|
||||
std::cout << "State_2 reached" << std::flush;
|
||||
n_state = State_3;
|
||||
break;
|
||||
|
||||
(.....)
|
||||
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
如果你希望当 `n_state` 的值为 `State_5` 时停止程序。为此,请在 `main` 函数处停止程序并为 `n_state` 设置监察点:
|
||||
|
||||
```
|
||||
watch n_state == State_5
|
||||
```
|
||||
|
||||
只有当所需的变量在当前上下文中可用时,使用变量名设置监察点才有效。
|
||||
|
||||
当你输入 `continue` 继续运行程序时,你会得到如下输出:
|
||||
|
||||
![gdb output stop on watchpoint_1][18]
|
||||
|
||||
如果你继续运行程序,当监察点表达式评估为 `false` 时 GDB 将停止:
|
||||
|
||||
![gdb output stop on watchpoint_2][19]
|
||||
|
||||
你可以为一般的值变化、特定的值、读取或写入时来设置监察点。
|
||||
|
||||
### 更改断点和监察点
|
||||
|
||||
输入 `info watchpoints` 打印先前设置的监察点列表:
|
||||
|
||||
![gdb output info watchpoints][20]
|
||||
|
||||
#### 删除断点和监察点
|
||||
|
||||
如你所见,监察点就是数字。要删除特定的监察点,请先输入 `delete` 后输入监察点的编号。例如,我的监察点编号为 2;要删除此监察点,输入 `delete 2`。
|
||||
|
||||
*注意:* 如果你使用 `delete` 而没有指定数字,*所有* 监察点和断点将被删除。
|
||||
|
||||
这同样适用于断点。在下面的截屏中,我添加了几个断点,输入 `info breakpoint` 打印断点列表:
|
||||
|
||||
![gdb output info breakpoints][21]
|
||||
|
||||
要删除单个断点,请先输入 `delete` 后输入断点的编号。另外一种方式:你可以通过指定断点的行号来删除断点。例如,`clear 78` 命令将删除第 78 行设置的断点号 7。
|
||||
|
||||
#### 禁用或启用断点和监察点
|
||||
|
||||
除了删除断点或监察点之外,你可以通过输入 `disable`,后输入编号禁用断点或监察点。在下文中,断点 3 和 4 被禁用,并在代码窗口中用减号标记:
|
||||
|
||||
![disabled breakpoints][22]
|
||||
|
||||
也可以通过输入类似 `disable 2 - 4` 修改某个范围内的断点或监察点。如果要重新激活这些点,请输入 `enable`,然后输入它们的编号。
|
||||
|
||||
### 条件断点
|
||||
|
||||
首先,输入 `delete` 删除所有断点和监察点。你仍然想使程序停在 `main` 函数处,如果你不想指定行号,可以通过直接指明该函数来添加断点。输入 `break main` 从而在 `main` 函数处添加断点。
|
||||
|
||||
输入 `run` 从头开始运行程序,程序将在 `main` 函数处停止。
|
||||
|
||||
`main` 函数包括变量 `n_state_3_count`,当状态机达到状态 3 时,该变量会递增。
|
||||
|
||||
基于 `n_state_3_count` 的值添加一个条件断点,请输入:
|
||||
|
||||
```
|
||||
break 54 if n_state_3_count == 3
|
||||
```
|
||||
|
||||
![Set conditional breakpoint][23]
|
||||
|
||||
继续运行程序。程序将在第 54 行停止之前运行状态机 3 次。要查看 `n_state_3_count` 的值,请输入:
|
||||
|
||||
```
|
||||
print n_state_3_count
|
||||
```
|
||||
|
||||
![print variable][24]
|
||||
|
||||
#### 使断点成为条件断点
|
||||
|
||||
你也可以使现有断点成为条件断点。用 `clear 54` 命令删除最近添加的断点,并通过输入 `break 54` 命令添加一个简单的断点。你可以输入以下内容使此断点成为条件断点:
|
||||
|
||||
```
|
||||
condition 3 n_state_3_count == 9
|
||||
```
|
||||
|
||||
`3` 指的是断点编号。
|
||||
|
||||
![modify breakpoint][25]
|
||||
|
||||
#### 在其他源文件中设置断点
|
||||
|
||||
如果你的程序由多个源文件组成,你可以在行号前指定文件名来设置断点,例如,`break main. cpp:54`。
|
||||
|
||||
#### 捕捉点
|
||||
|
||||
除了断点和监察点之外,你还可以设置捕获点。捕获点适用于执行系统调用、加载共享库或引发异常等事件。
|
||||
|
||||
要捕获用于写入 STDOUT 的 `write` 系统调用,请输入:
|
||||
|
||||
```
|
||||
catch syscall write
|
||||
```
|
||||
|
||||
![catch syscall write output][26]
|
||||
|
||||
每当程序写入控制台输出时,GDB 将中断执行。
|
||||
|
||||
在手册中,你可以找到一整章关于 [断点、监察点和捕捉点][27] 的内容。
|
||||
|
||||
### 评估和操作符号
|
||||
|
||||
用 `print` 命令可以打印变量的值。一般语法是 `print <表达式> <值>`。修改变量的值,请输入:
|
||||
|
||||
```
|
||||
set variable <variable-name> <new-value>.
|
||||
```
|
||||
|
||||
在下面的截屏中,我将变量 `n_state_3_count` 的值设为 `123`。
|
||||
|
||||
![catch syscall write output][28]
|
||||
|
||||
`/x` 表达式以十六进制打印值;使用 `&` 运算符,你可以打印虚拟地址空间内的地址。
|
||||
|
||||
如果你不确定某个符号的数据类型,可以使用 `whatis` 来查明。
|
||||
|
||||
![whatis output][29]
|
||||
|
||||
如果你要列出 `main` 函数范围内可用的所有变量,请输入 `info scope main` :
|
||||
|
||||
![info scope main output][30]
|
||||
|
||||
`DW_OP_fbreg` 值是指基于当前子程序的堆栈偏移量。
|
||||
|
||||
或者,如果你已经在一个函数中并且想要列出当前堆栈帧上的所有变量,你可以使用 `info locals` :
|
||||
|
||||
![info locals output][31]
|
||||
|
||||
查看手册以了解更多 [检查符号][32] 的内容。
|
||||
|
||||
### 附加调试到一个正在运行的进程
|
||||
|
||||
`gdb attach <进程 ID>` 命令允许你通过指定进程 ID(PID)附加到一个已经在运行的进程进行调试。幸运的是,`coredump` 程序将其当前 PID 打印到屏幕上,因此你不必使用 [ps][33] 或 [top][34] 手动查找 PID。
|
||||
|
||||
启动 `coredump` 应用程序的一个实例:
|
||||
|
||||
```
|
||||
./coredump
|
||||
```
|
||||
|
||||
![coredump application][35]
|
||||
|
||||
操作系统显示 PID 为 `2849`。打开一个单独的控制台窗口,移动到 `coredump` 应用程序的根目录,然后用 GDB 附加到该进程进行调试:
|
||||
|
||||
```
|
||||
gdb attach 2849
|
||||
```
|
||||
|
||||
![attach GDB to coredump][36]
|
||||
|
||||
当你用 GDB 附加到进程时,GDB 会立即停止进程运行。输入 `layout src` 和 `backtrace` 来检查调用堆栈:
|
||||
|
||||
![layout src and backtrace output][37]
|
||||
|
||||
输出显示在 `main.cpp` 第 92 行调用 `std::this_thread::sleep_for<...>(. ..)` 函数时进程中断。
|
||||
|
||||
只要你退出 GDB,该进程将继续运行。
|
||||
|
||||
你可以在 GDB 手册中找到有关 [附加调试正在运行的进程][38] 的更多信息。
|
||||
|
||||
#### 在堆栈中移动
|
||||
|
||||
在命令窗口,输入 `up` 两次可以在堆栈中向上移动到 `main.cpp` :
|
||||
|
||||
![moving up the stack to main.cpp][39]
|
||||
|
||||
通常,编译器将为每个函数或方法创建一个子程序。每个子程序都有自己的栈帧,所以在栈帧中向上移动意味着在调用栈中向上移动。
|
||||
|
||||
你可以在手册中找到有关 [堆栈计算][40] 的更多信息。
|
||||
|
||||
#### 指定源文件
|
||||
|
||||
当调试一个已经在运行的进程时,GDB 将在当前工作目录中寻找源文件。你也可以使用 [目录命令][41] 手动指定源目录。
|
||||
|
||||
### 评估转储文件
|
||||
|
||||
阅读 [创建和调试 Linux 的转储文件][42] 了解有关此主题的信息。
|
||||
|
||||
参考文章太长,简单来说就是:
|
||||
|
||||
1. 假设你使用的是最新版本的 Fedora
|
||||
2. 使用 `-c1` 开关调用 coredump:`coredump -c1`
|
||||
|
||||
![Crash meme][44]
|
||||
|
||||
3. 使用 GDB 加载最新的转储文件:`coredumpctl debug`
|
||||
4. 打开 TUI 模式并输入 `layout src`
|
||||
|
||||
![coredump output][45]
|
||||
|
||||
`backtrace` 的输出显示崩溃发生在距离 `main.cpp` 五个栈帧之外。回车直接跳转到 `main.cpp` 中的错误代码行:
|
||||
|
||||
![up 5 output][46]
|
||||
|
||||
看源码发现程序试图释放一个内存管理函数没有返回的指针。这会导致未定义的行为并引起 `SIGABRT`。
|
||||
|
||||
### 无符号调试
|
||||
|
||||
如果没有源代码,调试就会变得非常困难。当我在尝试解决逆向工程的挑战时,我第一次体验到了这一点。了解一些 [汇编语言][47] 的知识会很有用。
|
||||
|
||||
我们用例子看看它是如何运行的。
|
||||
|
||||
找到根目录,打开 `Makefile`,然后像下面一样编辑第 9 行:
|
||||
|
||||
```
|
||||
CFLAGS =-Wall -Werror -std=c++11 #-g
|
||||
```
|
||||
|
||||
要重新编译程序,先运行 `make clean`,再运行 `make`,最后启动 GDB。该程序不再有任何调试符号来引导源代码的走向。
|
||||
|
||||
![no debugging symbols][48]
|
||||
|
||||
`info file` 命令显示二进制文件的内存区域和入口点:
|
||||
|
||||
![info file output][49]
|
||||
|
||||
`.text` 区段始终从入口点开始,其中包含实际的操作码。要在入口点添加断点,输入 `break *0x401110` 然后输入 `run` 开始运行程序:
|
||||
|
||||
![breakpoint at the entry point][50]
|
||||
|
||||
要在某个地址设置断点,使用取消引用运算符 `*` 来指定地址。
|
||||
|
||||
#### 选择反汇编程序风格
|
||||
|
||||
在深入研究汇编之前,你可以选择要使用的 [汇编风格][51]。 GDB 默认是 AT&T,但我更喜欢 Intel 语法。变更风格如下:
|
||||
|
||||
```
|
||||
set disassembly-flavor intel
|
||||
```
|
||||
|
||||
![changing assembly flavor][52]
|
||||
|
||||
现在输入 `layout asm` 调出汇编代码窗口,输入 `layout reg` 调出寄存器窗口。你现在应该看到如下输出:
|
||||
|
||||
![layout asm and layout reg output][53]
|
||||
|
||||
#### 保存配置文件
|
||||
|
||||
尽管你已经输入了许多命令,但实际上还没有开始调试。如果你正在大量调试应用程序或尝试解决逆向工程的难题,则将 GDB 特定设置保存在文件中会很有用。
|
||||
|
||||
该项目的 GitHub 存储库中的 [gdbinit][54] 配置文件包含最近使用的命令:
|
||||
|
||||
```
|
||||
set disassembly-flavor intel
|
||||
set write on
|
||||
break *0x401110
|
||||
run -c2
|
||||
layout asm
|
||||
layout reg
|
||||
```
|
||||
|
||||
`set write on` 命令使你能够在程序运行期间修改二进制文件。
|
||||
|
||||
退出 GDB 并使用配置文件重新启动 GDB : `gdb -x gdbinit coredump`。
|
||||
|
||||
#### 阅读指令
|
||||
|
||||
应用 `c2` 开关后,程序将崩溃。程序在入口函数处停止,因此你必须写入 `continue` 才能继续运行:
|
||||
|
||||
![continuing execution after crash][55]
|
||||
|
||||
`idiv` 指令进行整数除法运算:`RAX` 寄存器中为被除数,指定参数为除数。商被加载到 `RAX` 寄存器中,余数被加载到 `RDX` 中。
|
||||
|
||||
从寄存器角度,你可以看到 `RAX` 包含 `5`,因此你必须找出存储堆栈中位置为 `rbp-0x4` 的值。
|
||||
|
||||
#### 读取内存
|
||||
|
||||
要读取原始内存内容,你必须指定比读取符号更多的参数。在汇编输出中向上滚动一点,可以看到堆栈的划分:
|
||||
|
||||
![stack division output][56]
|
||||
|
||||
你最感兴趣的应该是 `rbp-0x4` 的值,因为它是 `idiv` 的存储参数。你可以从截图中看到`rbp-0x8` 位置的下一个变量,所以 `rbp-0x4` 位置的变量是 4 字节宽。
|
||||
|
||||
在 GDB 中,你可以使用 `x` 命令*查看*任何内存内容:
|
||||
|
||||
|
||||
> `x/` < 可选参数 `n`、`f`、`u` > < 内存地址 `addr` >
|
||||
|
||||
可选参数:
|
||||
|
||||
* `n`:单元大小的重复计数(默认值:1)
|
||||
* `f`:格式说明符,如 [printf][57]
|
||||
* `u`:单元大小
|
||||
* `b`:字节
|
||||
* `h`:半字(2 个字节)
|
||||
* w: 字(4 个字节)(默认)
|
||||
* g: 双字(8 个字节)
|
||||
|
||||
要打印 `rbp-0x4` 的值,请输入 `x/u $rbp-4` :
|
||||
|
||||
![print value][58]
|
||||
|
||||
如果你能记住这种模式,则可以直接查看内存。参见手册中的 [查看内存][59] 部分。
|
||||
|
||||
#### 操作汇编
|
||||
|
||||
子程序 `zeroDivide()` 发生运算异常。当你用向上箭头键向上滚动一点时,你会找到下面信息:
|
||||
|
||||
```
|
||||
0x401211 <_Z10zeroDividev> push rbp
|
||||
0x401212 <_Z10zeroDividev+1> mov rbp,rsp
|
||||
```
|
||||
|
||||
这被称为 [函数前言][60]:
|
||||
|
||||
1. 调用函数的基指针(`rbp`)存放在栈上
|
||||
2. 栈指针(`rsp`)的值被加载到基指针(`rbp`)
|
||||
|
||||
完全跳过这个子程序。你可以使用 `backtrace` 查看调用堆栈。在 `main` 函数之前只有一个堆栈帧,所以你可以用一次 `up` 回到 `main` :
|
||||
|
||||
![Callstack assembly][61]
|
||||
|
||||
在你的 `main` 函数中,你会找到下面信息:
|
||||
|
||||
```
|
||||
0x401431 <main+497> cmp BYTE PTR [rbp-0x12],0x0
|
||||
0x401435 <main+501> je 0x40145f <main+543>
|
||||
0x401437 <main+503> call 0x401211<_Z10zeroDividev>
|
||||
```
|
||||
|
||||
子程序 `zeroDivide()` 仅在 `jump equal (je)` 为 `true` 时进入。你可以轻松地将其替换为 `jump-not-equal (jne)` 指令,该指令的操作码为 `0x75`(假设你使用的是 x86/64 架构;其他架构上的操作码不同)。输入 `run` 重新启动程序。当程序在入口函数处停止时,设置操作码:
|
||||
|
||||
```
|
||||
set *(unsigned char*)0x401435 = 0x75
|
||||
```
|
||||
|
||||
最后,输入 `continue` 。该程序将跳过子程序 `zeroDivide()` 并且不会再崩溃。
|
||||
|
||||
### 总结
|
||||
|
||||
你会在许多集成开发环境(IDE)中发现 GDB 运行在后台,包括 Qt Creator 和 VSCodium 的 [本地调试][62] 扩展。
|
||||
|
||||
![GDB in VSCodium][63]
|
||||
|
||||
了解如何充分利用 GDB 的功能很有用。一般情况下,并非所有 GDB 的功能都可以在 IDE 中使用,因此你可以从命令行使用 GDB 的经验中受益。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/1/gnu-project-debugger
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[Maisie-x](https://github.com/Maisie-x)
|
||||
校对:[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/sites/default/files/lead-images/mistake_bug_fix_find_error.png
|
||||
[2]: https://www.gnu.org/software/gdb/
|
||||
[3]: https://opensource.com/article/20/8/linux-dump
|
||||
[4]: https://opensource.com/sites/default/files/uploads/gdb_output_no_dbg_symbols.png
|
||||
[5]: https://opensource.com/sites/default/files/uploads/gdb_output_with_symbols.png
|
||||
[6]: https://opensource.com/sites/default/files/uploads/gdb_output_crash_on_c1_switch.png
|
||||
[7]: https://opensource.com/sites/default/files/uploads/gdb_output_info_source.png
|
||||
[8]: http://dwarfstd.org/
|
||||
[9]: https://sourceware.org/gdb/current/onlinedocs/gdb/Compilation.html#Compilation
|
||||
[10]: https://opensource.com/sites/default/files/uploads/gdb_output_info_shared.png
|
||||
[11]: https://opensource.com/article/20/6/linux-libraries
|
||||
[12]: https://opensource.com/sites/default/files/uploads/gdb_output_stopped_by_sigint.png
|
||||
[13]: https://opensource.com/sites/default/files/uploads/gdb_output_list_main.png
|
||||
[14]: https://opensource.com/sites/default/files/uploads/gdb_output_breakpoint_added.png
|
||||
[15]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_main.png
|
||||
[16]: https://opensource.com/sites/default/files/images/gdb_output_screen_corrupted.png
|
||||
[17]: https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html#TUI-Keys
|
||||
[18]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_1.png
|
||||
[19]: https://opensource.com/sites/default/files/uploads/gdb_output_stop_on_watchpoint_2.png
|
||||
[20]: https://opensource.com/sites/default/files/uploads/gdb_output_info_watchpoints.png
|
||||
[21]: https://opensource.com/sites/default/files/uploads/gdb_output_info_breakpoints.png
|
||||
[22]: https://opensource.com/sites/default/files/uploads/gdb_output_disabled_breakpoints.png
|
||||
[23]: https://opensource.com/sites/default/files/uploads/gdb_output_set_conditional_breakpoint.png
|
||||
[24]: https://opensource.com/sites/default/files/uploads/gdb_output_print_variable.png
|
||||
[25]: https://opensource.com/sites/default/files/uploads/gdb_output_modify_breakpoint.png
|
||||
[26]: https://opensource.com/sites/default/files/uploads/gdb_output_syscall_catch.png
|
||||
[27]: https://sourceware.org/gdb/current/onlinedocs/gdb/Breakpoints.html#Breakpoints
|
||||
[28]: https://opensource.com/sites/default/files/uploads/gdb_output_print_and_modify.png
|
||||
[29]: https://opensource.com/sites/default/files/uploads/gdb_output_whatis.png
|
||||
[30]: https://opensource.com/sites/default/files/uploads/gdb_output_info_scope_main.png
|
||||
[31]: https://opensource.com/sites/default/files/uploads/gdb_output_info_locals_main.png
|
||||
[32]: https://sourceware.org/gdb/current/onlinedocs/gdb/Symbols.html
|
||||
[33]: https://man7.org/linux/man-pages/man1/ps.1.html
|
||||
[34]: https://man7.org/linux/man-pages/man1/top.1.html
|
||||
[35]: https://opensource.com/sites/default/files/uploads/coredump_running.png
|
||||
[36]: https://opensource.com/sites/default/files/uploads/gdb_output_attaching_to_process.png
|
||||
[37]: https://opensource.com/sites/default/files/uploads/gdb_output_backtrace.png
|
||||
[38]: https://sourceware.org/gdb/current/onlinedocs/gdb/Attach.html#Attach
|
||||
[39]: https://opensource.com/sites/default/files/uploads/gdb_output_stackframe_up.png
|
||||
[40]: https://sourceware.org/gdb/current/onlinedocs/gdb/Stack.html#Stack
|
||||
[41]: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_48.html#SEC49
|
||||
[42]: https://opensource.com/article/20/8/linux-dump
|
||||
[43]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[44]: https://opensource.com/sites/default/files/uploads/crash.png
|
||||
[45]: https://opensource.com/sites/default/files/uploads/gdb_output_coredump.png
|
||||
[46]: https://opensource.com/sites/default/files/uploads/gdb_output_up_five.png
|
||||
[47]: https://en.wikipedia.org/wiki/Assembly_language
|
||||
[48]: https://opensource.com/sites/default/files/uploads/gdb_output_no_debugging_symbols.png
|
||||
[49]: https://opensource.com/sites/default/files/uploads/gdb_output_info_file.png
|
||||
[50]: https://opensource.com/sites/default/files/uploads/gdb_output_break_at_start.png
|
||||
[51]: https://en.wikipedia.org/wiki/X86_assembly_language#Syntax
|
||||
[52]: https://opensource.com/sites/default/files/uploads/gdb_output_disassembly_flavor.png
|
||||
[53]: https://opensource.com/sites/default/files/uploads/gdb_output_layout_reg_asm.png
|
||||
[54]: https://github.com/hANSIc99/core_dump_example/blob/master/gdbinit
|
||||
[55]: https://opensource.com/sites/default/files/uploads/gdb_output_asm_div_zero.png
|
||||
[56]: https://opensource.com/sites/default/files/uploads/gdb_output_stack_division.png
|
||||
[57]: https://en.wikipedia.org/wiki/Printf_format_string#Type_field
|
||||
[58]: https://opensource.com/sites/default/files/uploads/gdb_output_examine_1.png
|
||||
[59]: https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html
|
||||
[60]: https://en.wikipedia.org/wiki/Function_prologue
|
||||
[61]: https://opensource.com/sites/default/files/uploads/gdb_output_callstack_assembly_0.png
|
||||
[62]: https://github.com/WebFreak001/code-debug
|
||||
[63]: https://opensource.com/sites/default/files/uploads/vs_codium_native_debug.png
|
@ -0,0 +1,84 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "void-mori"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14833-1.html"
|
||||
[#]: subject: "Highlighted Text Not Visible in gedit in Dark Mode? Here’s What You Can Do"
|
||||
[#]: via: "https://itsfoss.com/gedit-dark-mode-problem/"
|
||||
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||
|
||||
gedit 深色模式下高亮文本不可见?以下是你能做的
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/16/094145b0gdwez5zo0zyuhz.jpg)
|
||||
|
||||
我喜欢 [在 Ubuntu 中使用深色模式][1]。在我看来深色模式能够缓解视觉疲劳,让系统看起来更加的赏心悦目。
|
||||
|
||||
我发现了一个 [gedit][2] 文本编辑器的小麻烦,如果你在深色模式下使用它,你也许也会遇到。
|
||||
|
||||
默认情况下 gedit 高亮当前光标所在的行。这是一个非常有用的功能,但是如果你在 Linux 系统中开启了深色模式,那么你将会感到痛苦。为什么?因为被高亮的文本将不再变得可读。你自己看吧:
|
||||
|
||||
![Text on the highlighted line is hardly visible][3]
|
||||
|
||||
如果你选择文本,它将变得可读,但这并不是一个让人感到有多么愉快的阅读或者编辑体验。(LCTT 校注:在新的 Ubuntu 22.04 中,这一情况已经有所改善,“高亮当前行”已被取消勾选)
|
||||
|
||||
![Selecting the text makes it better but that’s not a convenient thing to do for all lines][4]
|
||||
|
||||
好消息是你不需要再忍受它。我将演示几个步骤让你能够同时享受 gedit 以及系统的深色模式。
|
||||
|
||||
### 让 gedit 在深色模式下阅读体验友好
|
||||
|
||||
你基本上有两个选择:
|
||||
|
||||
1. 禁用高亮当前行,但也同时意味着你必须清楚地知道你在哪一行。
|
||||
2. 改变默认的颜色设置,但编辑器的颜色会变得稍微有些不同,而且如果你更改系统主题,它不会自动切换到浅色模式。
|
||||
|
||||
在 gedit 或者 GNOME 的开发者解决这个问题之前,这是你必须要做的应变和妥协。
|
||||
|
||||
#### 选项1: 禁止高亮当前行
|
||||
|
||||
当你打开 gedit 后,点击汉堡菜单然后选择“<ruby>首选项<rt>Preferences</rt></ruby>”。
|
||||
|
||||
![Go to Preferences][5]
|
||||
|
||||
在查看选项卡,你应该看到在 “<ruby>高亮<rt>Highlighting</rt></ruby>” 区域的下方的 “<ruby>高亮当前行<rt>Highlight current line</rt></ruby>” 选项。取消勾选这个选项,马上就可以看到效果。
|
||||
|
||||
![Disable highlighting current line][6]
|
||||
|
||||
“高亮当前行”是一个有用的功能,如果你想继续使用它,请选择第二个选项。
|
||||
|
||||
#### 选项2: 更改编辑器的颜色主题
|
||||
|
||||
在“<ruby>首选项<rt>Preferences</rt></ruby>”窗口,找到 “字体与颜色<rt>Font & Colors</rt></ruby>” 标签页,然后将颜色主题更改为 “Oblivion”、“Solarized Dark”,或者 “Cobalt”。
|
||||
|
||||
![Change the color scheme][7]
|
||||
|
||||
正如我前面所提到的,缺点就是当你把系统主题切换为浅色模式时,编辑器将不会自动切换到浅色模式。
|
||||
|
||||
### 开发者应该修复的一个 bug
|
||||
|
||||
这里 [有几个 Linux 可用的文本编辑器][8] ,但是为了快速阅读或编辑文本文件,我更推荐使用 gedit。尽管如此,小烦恼仍旧是小烦恼。开发者应该在将来的版本中为这个很好的文本编辑器修复这个问题,让我们不再求助于这些应对办法。
|
||||
|
||||
你呢?你在你的系统上使用深色模式还是浅色模式?你注意到 gedit 的这个问题了吗?你有使用什么方法去解决它吗?欢迎分享你的经验。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/gedit-dark-mode-problem/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[void-mori](https://github.com/void-mori)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/dark-mode-ubuntu/
|
||||
[2]: https://wiki.gnome.org/Apps/Gedit
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-dark-mode-problem.png?resize=779%2C367&ssl=1
|
||||
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-dark-mode-issue.png?resize=779%2C367&ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/gedit-preference.jpg?resize=777%2C527&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/01/disable-highlight-line-gedit.jpg?resize=781%2C530&ssl=1
|
||||
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/01/change-color-scheme-gedit.jpg?resize=785%2C539&ssl=1
|
||||
[8]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/
|
67
published/202207/20210511 What is fog computing.md
Normal file
67
published/202207/20210511 What is fog computing.md
Normal file
@ -0,0 +1,67 @@
|
||||
[#]: subject: (What is fog computing?)
|
||||
[#]: via: (https://opensource.com/article/21/5/fog-computing)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14782-1.html)
|
||||
|
||||
什么是雾计算?
|
||||
======
|
||||
|
||||
> 了解由我们生活中的所有连接设备组成的网络。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/01/120728yne9qv0e2vc5ucm3.jpg)
|
||||
|
||||
在早期,计算机既笨重又昂贵,计算机用户很少,他们必须在计算机上的预留时间内亲自来处理他们的<ruby>打孔卡<rt>punchcard</rt></ruby>。被称为 <ruby>[大型机][2]<rt>Mainframe</rt></ruby> 的系统进行了许多创新,并在<ruby>终端机<rt>terminal</rt></ruby>(没有自己的 CPU 的桌面计算机)上实现了<ruby>分时<rt>time-shared</rt></ruby>任务。
|
||||
|
||||
时至今日,强大的计算设备能做到 [价格低至 35 美元,且大小不超过一张信用卡][3]。这甚至还没有涵盖现代生活中负责收集和处理数据的所有小设备。从高层次的角度来看这些计算机的集合,你可以想象得到,所有这些设备多得像云中的水滴一样。
|
||||
|
||||
碰巧“<ruby>云计算<rt>cloud computing</rt></ruby>”一词已经被占用,因此需要为由物联网(IoT)和其他具有战略意义的服务器组成的网络提供一个独特的名称。此外,如果已经有一个代表数据中心节点的云,那么在云之外与我们交融的这些节点肯定有其独特之处。
|
||||
|
||||
### 欢迎来到雾计算
|
||||
|
||||
云通过互联网提供计算服务。构成云的数据中心很大,但与潜在客户的数量相比相对较少。这表明当数据在云及其众多用户之间来回传送时存在潜在的瓶颈。
|
||||
|
||||
相比之下,<ruby>雾计算<rt>Fog Computing</rt></ruby>可以在数量上超过其潜在客户,而不会出现瓶颈,因为设备执行大部分数据的收集或计算。它是云的外部“边缘”,是云落地的部分。
|
||||
|
||||
### 雾和边缘计算
|
||||
|
||||
雾计算和 <ruby>[边缘计算][4]<rt>edge computing</rt></ruby> 本质上是同义词。两者都与云和物联网密切相关,并做出相同的架构假设:
|
||||
|
||||
- 你离 CPU 越近,数据传输就越快。
|
||||
- 像 [Linux][5] 一样,小型专用计算机,可以“做一件事并把它做好”,这是一个强大的优势(当然,我们的设备实际上不仅仅做一件事,但从高层次上看,你购买的用于监测健康的智能手表本质上是在做“一”件事)。
|
||||
- 离线是不可避免的,但好的设备可以在此期间同样有效地运行,然后在重新连接时同步。
|
||||
- 本地设备能比大型数据中心更简单、更便宜。
|
||||
|
||||
### 边缘网络
|
||||
|
||||
将雾计算视为与云完全分离的实体很诱人,但它们毕竟是组成一个整体的两个部分。云需要数字企业的基础设施,包括公共云提供商、电信公司,甚至是运行自己服务的专业公司。本地化服务也很重要,可以在云核心与其数以百万计的客户之间提供<ruby>中转站<rt>waystations</rt></ruby>。
|
||||
|
||||
雾计算位于云的边缘,无论客户身在何处,都与他们紧密联系在一起。有时这是一个消费环境,例如你自己的家或汽车,而另一些时候这是一种商业利益,例如零售店中的价格监控设备或工厂车间的重要的安全传感器。
|
||||
|
||||
### 雾计算就在你身边
|
||||
|
||||
雾计算由我们生活中的所有连接设备组成:<ruby>无人机<rt>drone</rt></ruby>、电话、手表、健身监视器、安全监视器、家庭自动化、便携式游戏设备、园艺自动化、天气传感器、空气质量监视器等等。理想情况下,它提供的数据有助于建立一个更好、更明智的未来。有许多伟大的开源项目正朝着改善健康的方向而努力 —— 甚至只是让生活变得更有趣一点儿 —— 这一切都得益于雾和云计算。无论如何,_我们的_ 工作是确保它 [保持开放][7]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/5/fog-computing
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[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/computer_laptop_code_programming_mountain_view.jpg?itok=yx5buqkr (Man at laptop on a mountain)
|
||||
[2]: https://opensource.com/article/19/9/linux-mainframes-part-1
|
||||
[3]: https://opensource.com/resources/raspberry-pi
|
||||
[4]: https://www.redhat.com/en/topics/edge-computing/what-is-edge-computing
|
||||
[5]: https://opensource.com/resources/linux
|
||||
[6]: https://www.redhat.com/architect/edge-computing-essentials
|
||||
[7]: https://opensource.com/article/20/10/keep-cloud-open
|
93
published/202207/20210511 What is the OSI model.md
Normal file
93
published/202207/20210511 What is the OSI model.md
Normal file
@ -0,0 +1,93 @@
|
||||
[#]: subject: (What is the OSI model?)
|
||||
[#]: via: (https://jvns.ca/blog/2021/05/11/what-s-the-osi-model-/)
|
||||
[#]: author: (Julia Evans https://jvns.ca/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hanszhao80)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14786-1.html)
|
||||
|
||||
OSI 模型是什么?
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/02/153620k7nwc6nn2b6n6p2c.jpg)
|
||||
|
||||
(LCTT 校注:作者原文已经大篇幅进行了修订更新,本文据之前的版本翻译。)
|
||||
|
||||
今天我在推特上发布了一些关于 OSI 模型如何与 TCP/IP 工作原理的实际表现不相符的观点,这让我思考——OSI 模型到底是什么?通过阅读推特上的一些回复发现,似乎至少存在三种不同的思考方式:
|
||||
|
||||
1. TCP/IP 工作原理的字面描述
|
||||
2. 一个可以用来描述和比较很多不同的网络协议的抽象模型
|
||||
3. 对 1980 年代的一些计算机网络协议的字面描述,这些协议如今大多已不再使用
|
||||
|
||||
在这篇文章中,我不打算试图争辩以上哪一个才是“真正”的 OSI 模型——似乎不同的人以所有这些方式思考它。这不重要。
|
||||
|
||||
### OSI 模型有七层
|
||||
|
||||
在我们讨论 OSI 模型的含义之前,让我们大致地讨论一下它是什么。它是一个抽象模型,用于描述网络如何在七个编号的层上工作:
|
||||
|
||||
- 第一层:物理层
|
||||
- 第二层:数据链路层
|
||||
- 第三层:网络层
|
||||
- 第四层:传输层
|
||||
- 第五层:会话层
|
||||
- 第六层:表示层
|
||||
- 第七层:应用层
|
||||
|
||||
我不会再费时地去解释每一层的含义,网上有上千种解释可供查询。
|
||||
|
||||
### OSI 模型:TCP/IP 工作原理的字面描述
|
||||
|
||||
首先,我想谈谈人们在实践中使用 OSI 模型的一种常见方式:作为对 TCP/IP 工作原理的字面描述。OSI 模型的某些层非常容易映射到 TCP/IP:
|
||||
|
||||
- 第二层对应以太网
|
||||
- 第三层对应 IP
|
||||
- 第四层对应 TCP 或 UDP(或 ICMP 等)
|
||||
- 第七层对应 TCP 或 UDP 包内的任何内容(例如 DNS 查询)
|
||||
|
||||
这种映射对第二、三、四层很有意义——TCP 数据包有三个<ruby>标头<rt>header</rt></ruby>对应于这三个层(以太网标头、IP 标头和 TCP 标头)。
|
||||
|
||||
用数字来描述 TCP 数据包中的不同标头非常有用——如果你说“第二层”,很显然它位于第三层“下方”,因为二比三小。
|
||||
|
||||
“OSI 模型作为字面描述”的古怪之处在于,第五层和第六层并不真正对应于 TCP/IP 中的任何内容——我听说过很多关于第五层或第六层可能是什么的不同解释(你可以说第五层是 TLS 或其他东西!)但它们没有像第二、三、四层那样“每一层在 TCP 数据包中都有相应的标头”这样的明确对应关系。
|
||||
|
||||
此外,TCP/IP 的某些部分即使在第二层到第四层也不能很好地适应 OSI 模型——例如,哪一层是 ARP 数据包?ARP 数据包发送一些带有以太网标头的数据,这是否意味着它们是第三层?或是第二层?列出不同 OSI 层的维基百科文章将其归类为“第 2.5 层”,这并不令人满意。
|
||||
|
||||
因为 OSI 模型有时用于教授 TCP/IP,若搞不清楚它的哪些部分可以映射到 TCP/IP,而哪些部分不能,则会令人困惑。这才是真的问题。
|
||||
|
||||
### OSI 模型:用于比较网络协议的一个抽象
|
||||
|
||||
我听说过的另一种关于 OSI 的思考方式是,它是一种抽象,可以用来在许多不同的网络协议之间进行类比。例如,如果你想了解蓝牙协议的工作原理,也许你可以使用 OSI 模型来帮助你——这是我在 [这个网页][1] 上找到的一张图表,显示了蓝牙协议如何适配 OSI 模型。
|
||||
|
||||
![][2]
|
||||
|
||||
另一个例子是,[这篇维基百科文章][3] 有一个 OSI 层列表,详细划分了哪些特定的网络协议对应于这些 OSI 层。
|
||||
|
||||
### OSI 模型:一些过时协议的字面描述
|
||||
|
||||
维基百科上的一些非常简短的研究表明,除了对这七层的抽象描述之外,OSI 模型还包含了 [一组实现这些层的特定协议][4]。显然,这发生在 70 年代和 80 年代的 [协议战争][5] 时期,OSI 模型失败了,TCP/IP 则取得了胜利。
|
||||
|
||||
这就解释了为什么 OSI 模型无法与 TCP/IP 很好地对应,因为如果当时“获胜”的是 OSI 协议,那么 OSI 模型 _将_ 完全对应于互联网网络的实际工作方式。
|
||||
|
||||
### 结语
|
||||
|
||||
我写这篇文章的初衷是,当我最初学习 OSI 模型时,我发现它非常令人困惑(所有这些层是什么?它们是真实存在的吗?这是网络的实际工作原理吗?发生了什么?)我希望有人告诉我这个只使用 TCP/IP 网络协议的人,只需了解 OSI 模型第二、三、四和七层与 TCP/IP 的关系,然后忽略它的所有其他内容即可。所以我希望这篇文章对某些人能有所帮助!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://jvns.ca/blog/2021/05/11/what-s-the-osi-model-/
|
||||
|
||||
作者:[Julia Evans][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://jvns.ca/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://flylib.com/books/en/4.215.1.116/1/
|
||||
[2]: https://jvns.ca/images/bluetooth.gif
|
||||
[3]: https://en.wikipedia.org/wiki/List_of_network_protocols_(OSI_model)
|
||||
[4]: https://en.wikipedia.org/wiki/OSI_protocols
|
||||
[5]: https://en.wikipedia.org/wiki/Protocol_Wars
|
@ -0,0 +1,207 @@
|
||||
[#]: subject: (Establish an SSH connection between Windows and Linux)
|
||||
[#]: via: (https://opensource.com/article/21/6/ssh-windows)
|
||||
[#]: author: (Stephan Avenwedde https://opensource.com/users/hansic99)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (yjacks)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14855-1.html)
|
||||
|
||||
如何从 Windows 上用 SSH 连接到 Linux
|
||||
======
|
||||
|
||||
> 使用开源的 PuTTY 工具,从 Windows 建立到 Linux 的 SSH 连接。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/23/110039pjbd9jbbc84gbz2f.jpg)
|
||||
|
||||
在 Linux 世界中,<ruby>安全外壳<rt>secure shell</rt></ruby>(SSH)协议是最为常用的、通过命令行控制远程计算机的方式。SSH 是真正的 Linux 原创,但是它在 Windows 世界中也越来越流行。甚至有了一份官方的 [Windows 的 SSH 文档][2],那篇文档阐述了使用 [OpenSSH][3] 控制 Windows 的方法。
|
||||
|
||||
这篇文章展示了如何使用了流行的开源工具 [PuTTY][4],建立一个从 Windows 到 Fedora 33 Linux 系统的 SSH 连接。
|
||||
|
||||
### 使用 SSH 的方法
|
||||
|
||||
SSH 使用客户端-服务器模式,即 SSH 客户端会创建到 SSH 服务端的连接。SSH 服务器通常会作为<ruby>守护进程<rt>Daemon</rt></ruby>运行,所以它常被称为 SSHD。你很难找到一个不自带 SSH 守护进程的 Linux 发行版。在 Fedora 33 中,已安装了 SSH 守护进程,但是并未激活。
|
||||
|
||||
你可以使用 SSH 控制几乎所有的 Linux 机器,无论它是作为虚拟机还是作为网络上的物理设备运行。一个常见的用例是<ruby>无头<rt>headless</rt></ruby>配置的嵌入式设备,如树莓派。SSH 也可以用做一个其它网络服务的隧道。因为 SSH 连接是加密的,所以你可以使用 SSH 作为一个任何默认不提供加密的协议的传输层。
|
||||
|
||||
在这篇文章中,我将解释使用 SSH 的四个方式:1、如何在 Linux 端配置 SSH 守护进程;2、如何设置远程控制台连接;3、如何通过网络复制文件,4. 如何将 SSH 作为某些协议的隧道。
|
||||
|
||||
### 1、配置 SSHD
|
||||
|
||||
将 Linux 系统(文中是 Fedora 33)作为 SSH 服务器,允许 PuTTY SSH 客户端进行连接。首先,检查守护进程的 SSH 配置。配置文件放在 `/etc/ssh/sshd_config`,它包含了许多选项,通过取消掉相关行的注释就可以激活:
|
||||
|
||||
```
|
||||
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
|
||||
|
||||
# This is the sshd server system-wide configuration file. See
|
||||
# sshd_config(5) for more information.
|
||||
|
||||
# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
|
||||
|
||||
# The strategy used for options in the default sshd_config shipped with
|
||||
# OpenSSH is to specify options with their default value where
|
||||
# possible, but leave them commented. Uncommented options override the
|
||||
# default value.
|
||||
|
||||
Include /etc/ssh/sshd_config.d/*.conf
|
||||
|
||||
#Port 22
|
||||
#AddressFamily any
|
||||
#ListenAddress 0.0.0.0
|
||||
#ListenAddress ::
|
||||
```
|
||||
|
||||
没有取消任何注释的默认配置在这个示例中应该是可以工作的。要检查 SSH 守护进程是否已经运行,输入 `systemctl status sshd`:
|
||||
|
||||
```
|
||||
$ systemctl status sshd
|
||||
● sshd.service - OpenSSH server daemon
|
||||
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
|
||||
Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
|
||||
Docs: man:sshd(8)
|
||||
man:sshd_config(5)
|
||||
Main PID: 577 (sshd)
|
||||
Tasks: 1 (limit: 26213)
|
||||
CGroup: /system.slice/sshd.service
|
||||
└─577 /usr/sbin/sshd -D -oCiphers=[aes256-gcm@openssh.com][5],chacha20-[...]
|
||||
```
|
||||
|
||||
如果它处于<ruby>未激活<rt>inactive</rt></ruby>状态,使用 `systemctl start sshd` 命令启动它。
|
||||
|
||||
### 2、设置远程控制台
|
||||
|
||||
在 Windows 下 [下载 PuTTY 安装程序][6],然后安装并打开它。你应看到一个像这样的窗口:
|
||||
|
||||
![PuTTY configuration screen][7]
|
||||
|
||||
在“<ruby>主机名(或 IP 地址)<rt>Host Name (or IP address)</rt></ruby>”输入框,键入你的 Linux 系统的连接信息。本文设置了一个 Fedora 33 虚拟机,它使用桥接网络适配器,使我可以由 IP 地址 `192.168.1.60` 连接这个系统。点击“<ruby>打开<rt>Open</rt></ruby>”,应会如图示的打开一个窗口:
|
||||
|
||||
![PutTTY security alert][9]
|
||||
|
||||
这是 SSH 的安全措施之一,是为了防止<ruby>[中间人攻击][10]<rt>man-in-the-middle attack</rt></ruby>。消息中的指纹应该匹配 Linux 系统中放在 `/etc/ssh/ssh_host_ed25519_key.pub` 的密钥。PuTTY 将这个密钥以 [MD5 哈希值][11] 的方式打印出来。要检查它的真实性,切换到 Linux 系统并打开一个控制台,然后输入:
|
||||
|
||||
```
|
||||
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
|
||||
```
|
||||
|
||||
输出应该和 PuTTY 展示的指纹一致:
|
||||
|
||||
```
|
||||
$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
|
||||
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)
|
||||
```
|
||||
|
||||
点击“<ruby>是<rt>Yes</rt></ruby>”以确认 PuTTY 的安全提示。主机系统的指纹现在存储在 PuTTY 的信任列表中,其位于 Windows 的注册表中的:
|
||||
|
||||
```
|
||||
HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys
|
||||
```
|
||||
|
||||
输入正确的登录凭证,然后你应该进入控制台了,位置在你的用户主目录。
|
||||
|
||||
![Logged in to SSH][12]
|
||||
|
||||
### 3、通过网络复制文件
|
||||
|
||||
除了远程控制台,你同样可以使用 PuTTY 通过 SSH 来传输文件。PuTTY 的安装目录在 `C:\Program Files (x86)\PuTTY`,在该目录下寻找 `ppscp.exe`。你既可以使用它从 Linux 系统复制文件,也可以复制文件到 Linux 系统。
|
||||
|
||||
使用 `Windows + R` 然后输入 `cmd` 来打开命令提示符,从你的 Linux 用户主目录复制 `MYFile.txt` 到你的 Windows 主目录,输入:
|
||||
|
||||
```
|
||||
C:\"Program Files (x86)"\PuTTY\pscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .
|
||||
```
|
||||
|
||||
要从 Windows 主目录复制文件到 Linux 用户主目录,输入:
|
||||
|
||||
```
|
||||
C:\"Program Files (x86)"\PuTTY\pscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/
|
||||
```
|
||||
|
||||
就像你也许已经发现的那样,复制的命令通常构造为:
|
||||
|
||||
```
|
||||
pscp.exe <source> <target>
|
||||
```
|
||||
|
||||
### 4、隧道化一个协议
|
||||
|
||||
假设你拥有一个 Linux 机器,为某些特别的应用运行一个基于 HTTP 的服务。你想从你的 Windows 机器通过互联网访问这个 HTTP 服务。而且,你不能将相关的 TCP 端口暴露在公网,因为:
|
||||
|
||||
1. 这个服务通过 HTTP 而非 HTTPS 运行
|
||||
2. 根本没有用户管理和登录系统
|
||||
|
||||
乍一看,建立这种架构不产生可怕的漏洞似乎是不可能的。但是 SSH 可简单的为这种情况建立一个安全的解决方案。
|
||||
|
||||
我将用我的软件项目 [Pythonic][13] 来演示这个过程。在容器中运行。Pythonic 作为容器运行,开放两个 TCP 端口:TCP 端口 7000(主要编辑器)和 TCP 端口 8000([code-server][14] 代码编辑器)。
|
||||
|
||||
要在一个 Linux 机器上安装 Pythonic ,运行:
|
||||
|
||||
```
|
||||
podman pull pythonicautomation/pythonic
|
||||
podman run -d -p 7000:7000 -p 8000:8000 pythonic
|
||||
```
|
||||
|
||||
转向你的 Windows 机器,打开 PuTTy,转到 “<ruby>连接<rt>Connection</rt></ruby> -> SSH -> <ruby>隧道<rt>Tunnels</rt></ruby>”。加入你要转发的两个 TCP 端口:
|
||||
|
||||
* 源:`7000` / 目标:`localhost:7000`
|
||||
* 源:`8000` / 目标:`localhost:8000`
|
||||
|
||||
![Port forwarding in PuTTY][15]
|
||||
|
||||
然后返回 “<ruby>会话<rt>Session</rt></ruby>” 部分,并像之前那样建立一个 SSH 链接。打开网页浏览器,然后转到 `http://localhost:7000`;你应该看见像这样的窗口:
|
||||
|
||||
![Pythonic][16]
|
||||
|
||||
你成功的设置了端口转发!
|
||||
|
||||
**警告**: 如果你选择在公网上暴露 TCP 端口 22 ,不要使用易于猜测的登录凭证。你将接受来自全世界的登录请求,它们使用常见的、标准的登录凭证以尝试登录你的 Linux 机器。相反,只允许已知的用户登录。这种登录限制可以通过 [公钥加密][17] 来实现,它使用一个密钥对,其中公钥存储在 SSH 主机上,而私钥保留在客户端。
|
||||
|
||||
### 调试
|
||||
|
||||
如果你难以连接你的 Linux 机器,你可以跟踪你的 SSH 守护进程的处理过程:
|
||||
|
||||
```
|
||||
journalctl -f -u sshd
|
||||
```
|
||||
|
||||
这是一个普通的登录进程,但是其日志级别为 DEBUG,它看起来是这样的 :
|
||||
|
||||
![LogLevel DEBUG output][18]
|
||||
|
||||
### 了解更多
|
||||
|
||||
这篇文章几乎没有涉及到使用 SSH 的方法。如果你正在寻找一个特定用例的信息,你也许可以在互联网中找到无数的教程。我在工作中使用 PuTTY ,因为它易于设置,在两个操作系统间又具有良好的可操作性,使得它成为连接解决方案里的瑞士军刀。
|
||||
|
||||
(文内图片来自:Stephan Avenwedde,[CC BY-SA 4.0][8])
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/ssh-windows
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[yjacks](https://github.com/yjacks)
|
||||
校对:[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/cloud-windows-building-containers.png?itok=0XvZLZ8k (clouds in windows)
|
||||
[2]: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview
|
||||
[3]: https://www.openssh.com/
|
||||
[4]: https://www.putty.org/
|
||||
[5]: mailto:aes256-gcm@openssh.com
|
||||
[6]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
|
||||
[7]: https://opensource.com/sites/default/files/uploads/putty_connection_settings.png (PuTTY configuration screen)
|
||||
[8]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[9]: https://opensource.com/sites/default/files/uploads/putty_host_key.png (PutTTY security alert)
|
||||
[10]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack
|
||||
[11]: https://en.wikipedia.org/wiki/MD5
|
||||
[12]: https://opensource.com/sites/default/files/uploads/ssh_successfull_login.png (Logged in to SSH)
|
||||
[13]: https://github.com/hANSIc99/Pythonic
|
||||
[14]: https://github.com/cdr/code-server
|
||||
[15]: https://opensource.com/sites/default/files/uploads/ssh_port_forwarding.png (Port forwarding in PuTTY)
|
||||
[16]: https://opensource.com/sites/default/files/uploads/pythonic_screen.png (Pythonic)
|
||||
[17]: https://opensource.com/article/21/4/encryption-decryption-openssl
|
||||
[18]: https://opensource.com/sites/default/files/uploads/sshd_debug_log.png (LogLevel DEBUG output)
|
@ -0,0 +1,80 @@
|
||||
[#]: subject: (How to use the FreeDOS text editor)
|
||||
[#]: via: (https://opensource.com/article/21/6/freedos-text-editor)
|
||||
[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (yjacks)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14847-1.html)
|
||||
|
||||
如何使用 FreeDOS Edit
|
||||
======
|
||||
|
||||
> FreeDOS 提供了一个叫做 FreeDOS Edit 的用户友好的文本编辑器。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/20/173027t6ctk5cwf9u988p9.jpg)
|
||||
|
||||
在任何操作系统中,编辑文件都是一项常有的任务。当你想去做一个某事的笔记、写封信给朋友或升级一个系统配置 —— 你需要一个文本编辑器。FreeDOS 提供了一个用户友好的文本编辑器(也许没啥想象力)叫做 “FreeDOS Edit”。
|
||||
|
||||
### 编辑文件
|
||||
|
||||
最简单的启用 FreeDOS Edit 的方式就就是输入 `EDIT`。它提供一个空的编辑器窗口。图案背景显示为一个空的“桌面”——提醒你没有编辑任何文件。
|
||||
|
||||
![FreeDOS Edit:未加载任何文件][2]
|
||||
|
||||
就像多数 DOS 应用程序一样,你可以按下你键盘上的 `Alt` 键来访问 Edit 的菜单。这就激活了这个菜单。在你按下 `Alt` 后,Edit 将切换到“菜单”访问方式,并高亮 “<ruby>文件<rt>File</rt></ruby>” 菜单。如果你想要访问菜单栏上的一个不同的菜单,可以使用左右方向键。按向下的方向键并按下回车键来“进入”菜单。
|
||||
|
||||
![高亮菜单][3]
|
||||
|
||||
你注意到所有菜单标题的第一个字母是不同的颜色么?这种高亮字母显示了一种快捷方式。例如,“<ruby>文件<rt>File</rt></ruby>”菜单的“F”高亮为红色。所以你可以按下 `Alt+F`(`Alt` 和 `F` 同时按下),Edit 会显示“<ruby>文件<rt>File</rt></ruby>”菜单。
|
||||
|
||||
![文件菜单][4]
|
||||
|
||||
你可以使用“<ruby>文件<rt>File</rt></ruby>”菜单来开始一个新的(空)文件,或打开一个存在的文件。让我们开始一个新文件,使用方向键移动到“<ruby>新建<rt>New</rt></ruby>“然后按下回车键。你也可以用 `Ctrl+N` (`Ctrl` 和 `N` 同时按下)打开一个新文件。
|
||||
|
||||
![编辑一个新的文件][5]
|
||||
|
||||
此后,编辑文件应该非常简单。大多数熟悉的快捷键都可以在 FreeDOS Edit 中使用:`Ctrl+C` 复制文本,`Ctrl+X` 剪贴文本,和 `Ctrl+V` 将复制的或剪贴的文本粘贴到新的地方。如果你需要在一个长文档中寻找一个特殊文本,按下 `Ctrl+F`。保存你的工作成果,请使用 `Ctrl+S` 以将变更提交到硬盘。
|
||||
|
||||
### 在 Edit 中编程
|
||||
|
||||
如果你是个程序员,你也许会发现扩展的 ASCII 表是一个有用的工具。DOS 系统支持“拓展的” ASCII字符集,通常被称之为“代码页 437”。0 到 127 的标准字符包括字母 A 到 Z(大写和小写)、数字和特殊字符,如标点符号。但是,从 128 到 255 的 DOS 拓展字符包括其它语言字符和“画线”元素。DOS 程序员有时需要使用这些拓展 ASCII 字符,所以 FreeDOS Edit 可以很容易地查看所有 ASCII 码和它们的相关字符的表格。
|
||||
|
||||
要查看这个 ASCII 表,请使用“<ruby>工具<rt>Utilities</rt></ruby>”菜单,选择“<ruby>ASCII 表<rt>ASCII Table</rt></ruby>”菜单项,这将显示一个包含该表格的窗口。
|
||||
|
||||
![在工具菜单找到 ASCII 表][6]
|
||||
|
||||
沿着左边,这张表显示十六进制值“00”到“F0”,顶部展示了单一值“0”到“F”。这些为每个字符的十六进制代码提供了一个快速参考。例如,第一行(00)和第一列(0)中的项目具有十六进制值 00 + 0,即0x00(“NULL”值)。而第五行(40)和第二列(1)中的字符,其数值为 40 + 1,即 0x41(字母 “A”)。
|
||||
|
||||
![ASCII 表提供一个便于参考的扩展字符表][7]
|
||||
|
||||
当你在表格内移动光标高亮不同的字符时,你会看到表格底部的值发生变化,展示了字符的十进制、十六进制和八进制编码。例如,移动光标以高亮在 C0 行和第 5 列的“行交叉”字符,显示这个扩展字符的代码为 197(十进制)、0xc5(十六进制)和 305(八进制)。在一个程序中,你可以通过输入十六进制值 0xc5 或八进制“转义代码” \305 来引用这个扩展字符。
|
||||
|
||||
![“行交叉”字符是 197(十进制)、0xc5(十六进制)和 305(八进制)][8]
|
||||
|
||||
请随意浏览 Edit 中的菜单,以发现其他不错的功能。例如,“<ruby>选项<rt>Options</rt></ruby>”菜单允许你更改 Edit 的行为和外观。如果你喜欢使用更密集的显示,可以使用“<ruby>显示<rt>Display</rt></ruby>”菜单(在“<ruby>选项<rt>Options</rt></ruby>”下)将 Edit
|
||||
设置为 25、43 或 50 行。你还可以强制 Edit 以单色(黑底白字)或反转模式(白底黑字)显示。
|
||||
|
||||
(文内图片来自 Jim Hall,CC-BY SA 4.0)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/6/freedos-text-editor
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[yjacks](https://github.com/yjacks)
|
||||
校对:[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/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop)
|
||||
[2]: https://opensource.com/sites/default/files/uploads/edit.png (FreeDOS Edit without any files loaded)
|
||||
[3]: https://opensource.com/sites/default/files/uploads/edit-menu.png (Highlighting the menu)
|
||||
[4]: https://opensource.com/sites/default/files/uploads/edit-file.png (The File menu)
|
||||
[5]: https://opensource.com/sites/default/files/uploads/edit-new.png (Editing a new file)
|
||||
[6]: https://opensource.com/sites/default/files/uploads/utilities-ascii.png (Find the ASCII Table in the Utilities menu)
|
||||
[7]: https://opensource.com/sites/default/files/uploads/ascii-table-0x00.png (The ASCII Table provides a handy reference for extended characters)
|
||||
[8]: https://opensource.com/sites/default/files/uploads/ascii-0xc5.png
|
@ -0,0 +1,137 @@
|
||||
[#]: subject: (How to Convert File Formats With Pandoc in Linux [Quick Guide])
|
||||
[#]: via: (https://itsfoss.com/pandoc-convert-file/)
|
||||
[#]: author: (Bill Dyer https://itsfoss.com/author/bill/)
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lkxed)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-14785-1.html)
|
||||
|
||||
如何在 Linux 中使用 Pandoc 转换文件格式
|
||||
======
|
||||
|
||||
在之前的一篇文章中,我介绍了 [使用 pandoc 将少量 Markdown 文件批量转换为 HTML 的过程][1]。在那篇文章中,我创建了多个 HTML 文件,但 Pandoc 可以做的更多。它被称为文档转换的“瑞士军刀” —— 这是有充分理由的。很少有它做不到的事情。
|
||||
|
||||
[Pandoc][2] 可以将 .docx、.odt、.html、.epub、LaTeX、DocBook 等格式互相转换,或者转换为其他格式,例如 JATS、TEI Simple、AsciiDoc 等。
|
||||
|
||||
是的,这意味着 Pandoc 可以将 .docx 文件转换为 .pdf 和 .html 文件,但你可能会想:“Word 也可以将文件导出为 .pdf 和 .html。为什么我需要 Pandoc 呢?”
|
||||
|
||||
嗯,本来呢,你这个说法也没错,但考虑到 Pandoc 可以转换这么多格式,它很可能成为你所有转换任务的首选工具。例如,我们中的许多人都知道 [Markdown 编辑器][3] 可以将其 Markdown 文件导出为 .html。而使用 Pandoc 文件也可以转换为许多其他格式。
|
||||
|
||||
我很少将 Markdown 导出为 HTML。我通常让 Pandoc 来做这件事。
|
||||
|
||||
### 使用 Pandoc 转换文件格式
|
||||
|
||||
![][4]
|
||||
|
||||
本文中,我会将 Markdown 文件转换成几种不同的格式。我几乎所有的写作都使用 Markdown 语法,但我经常需要转换为另一种格式:学校作业通常需要的 .docx 格式;我创建的网页通常需要的 .html 格式;工作需要的 .epub 格式;传单和讲义需要的 .pdf 格式;甚至包括一个大学数字人文项目偶尔需要的 TEI Simple 格式。Pandoc 可以轻松处理所有这些格式,甚至更多。
|
||||
|
||||
首先,你需要 [安装 pandoc][5]。此外,要创建 .pdf 文件,还需要 LaTeX。我最喜欢的套件是 [TeX Live][6]。
|
||||
|
||||
**注意**:如果你想在安装前试用 pandoc,这里有一个在线试用页面:<http://pandoc.org/try/>。
|
||||
|
||||
#### 安装 pandoc 和 texlive
|
||||
|
||||
Ubuntu 和其他 Debian 发行版的用户可以在终端中输入以下命令:
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get install pandoc texlive
|
||||
```
|
||||
|
||||
请注意第二行,你将一次性安装 `pandoc` 和 `texlive`。[apt-get 命令][7] 支持你这样做。不过,我建议你先去喝杯咖啡,因为这可能需要几分钟的时间。
|
||||
|
||||
#### 开始转换
|
||||
|
||||
安装完成 `pandoc` 和 `texlive` 后,你就可以尝试用它们来完成一些工作了!
|
||||
|
||||
该项目的示例文档将是一篇文章,该文章于 1894 年 12 月首次发表在《北美评论》上,标题为“如何击退火车劫匪”。我将使用的 Markdown 文件是前一段时间创建的,该文章的一个恢复项目的一部分(LCTT 译注:这是篇一百多年前发表的文章,这是一个数字化“恢复”项目)。
|
||||
|
||||
我把这篇文章保存为 `how_to_repel_train_robbers.md`,它位于我的 `Documents` 目录下,名为 `samples` 的子目录中。它在 Ghostwriter 中看起来是这样的:
|
||||
|
||||
![在 Ghostwriter 中查看原始的 Markdown 文件][8]
|
||||
|
||||
我想创建此文件的 .docx、.pdf 和 .html 版本。
|
||||
|
||||
#### 第一次转换
|
||||
|
||||
首先,我将制作一个 .pdf 副本,因为我在安装 LaTeX 包时遇到了些麻烦。
|
||||
|
||||
在 `~/Documents/samples/` 目录中,我输入以下,以创建一个 .pdf 文件:
|
||||
|
||||
```
|
||||
pandoc -o htrtr.pdf how_to_repel_train_robbers.md
|
||||
```
|
||||
|
||||
上述命令将基于 `how_to_repel_train_robbers.md` 文件,创建一个名为 `htrtr.pdf` 的文件。我使用 `htrtr` 作为名称的原因是:嗯,它比 `how_to_repel_train_robbers` 短。`htrtr` 其实是长标题中的单词首字母排列。
|
||||
|
||||
这是 .pdf 文件制作完成后的一个截图:
|
||||
|
||||
![在 Ocular 中查看的转换后的 PDF 文件][9]
|
||||
|
||||
#### 第二次转换
|
||||
|
||||
接下来,我想创建一个 .docx 文件。该命令与我用来创建 .pdf 的命令几乎相同,它是:
|
||||
|
||||
```
|
||||
pandoc -o htrtr.docx how_to_repel_train_robbers.md
|
||||
```
|
||||
|
||||
很快,一个 .docx 文件就创建好了。这是它在 Libre Writer 中的样子:
|
||||
|
||||
![在 Libre Writer 中查看转换后的 DOCX 文件][10]
|
||||
|
||||
#### 第三次转换
|
||||
|
||||
我可能会想在网上发布这个,所以再多一个支持网页的格式也不错。我将使用以下命令创建一个 .html 文件:
|
||||
|
||||
```
|
||||
pandoc -o htrtr.html how_to_repel_train_robbers.md
|
||||
```
|
||||
|
||||
同样,创建它的命令与前两次转换非常相似。这是该 .html 文件在浏览器中的样子:
|
||||
|
||||
![在 Firefox 中查看的转换后的 HTML 文件][11]
|
||||
|
||||
#### 注意到什么了吗?
|
||||
|
||||
让我们再看看之前的命令。它们是:
|
||||
|
||||
```
|
||||
pandoc -o htrtr.pdf how_to_repel_train_robbers.md
|
||||
pandoc -o htrtr.docx how_to_repel_train_robbers.md
|
||||
pandoc -o htrtr.html how_to_repel_train_robbers.md
|
||||
```
|
||||
|
||||
这三个命令唯一不同的是 `htrtr` 后的扩展名。这提示你 pandoc 会依赖于你提供的输出文件扩展名(来决定目标转换格式)。
|
||||
|
||||
### 总结
|
||||
|
||||
Pandoc 可以做的远不止这里完成的三个小转换。如果你选择使用一个首选格式编写文件,但时不时又需要将文件转换为另一种格式,pandoc 很大概率都能为你完成。
|
||||
|
||||
现在,既然你已经学会了,你会用它做什么呢?你会把它自动化吗?如果你有一个网站,想供读者下载文章怎么办?你可以修改这些小命令,把它们编写成一个脚本,你的读者可以决定他们想要哪种格式。你可以提供 .docx、.pdf、.odt、.epub 或更多格式。你的读者只需要选择一种格式,然后对应的转换脚本就会执行,最后,你的读者下载他们想要的文件。这是完全可以做到的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/pandoc-convert-file/
|
||||
|
||||
作者:[Bill Dyer][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lkxed](https://github.com/lkxed)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/bill/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/convert-markdown-files/
|
||||
[2]: https://pandoc.org/
|
||||
[3]: https://itsfoss.com/best-markdown-editors-linux/
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/pandoc-quick-guide.png?resize=800%2C450&ssl=1
|
||||
[5]: https://pandoc.org/installing.html
|
||||
[6]: https://www.tug.org/texlive/
|
||||
[7]: https://itsfoss.com/apt-get-linux-guide/
|
||||
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_ghostwriter.png?resize=800%2C516&ssl=1
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_ocular.png?resize=800%2C509&ssl=1
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_libre_writer.png?resize=800%2C545&ssl=1
|
||||
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/convert_with_pandoc_firefox.png?resize=800%2C511&ssl=1
|
107
published/202207/20211017 How I use open source to play RPGs.md
Normal file
107
published/202207/20211017 How I use open source to play RPGs.md
Normal file
@ -0,0 +1,107 @@
|
||||
[#]: subject: "How I use open source to play RPGs"
|
||||
[#]: via: "https://opensource.com/article/21/10/open-source-rpgs"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "perfiffer"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14859-1.html"
|
||||
|
||||
我如何使用开源玩 RPG 游戏
|
||||
======
|
||||
|
||||
> 为角色扮演游戏的所有元素找到一个开源工具。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/24/075445ymf5nvigh4t4htfd.jpg)
|
||||
|
||||
我玩过很多桌面角色扮演游戏(RPG),无论是从频率还是种类来说。一般来说,我更喜欢和朋友一起玩 RPG,但在过去的 2 年里,我一直在玩网络游戏。(LCTT 校注:这里的 RPG 游戏指的是那种“传统”的面对面的桌面游戏,而非很多人最初接触的 RPG 电子游戏。)
|
||||
|
||||
起初,我不确定如何在线长期的进行游戏。我知道有很多的工具可以实现,但直到我发现在线桌面游戏的开源世界之前,这些工具没有一个引起我的兴趣。通过一小部分开源应用程序,我已经能够在开源平台上进行我的所有游戏。
|
||||
|
||||
这也是一年中的好时机,因为最近是 [免费 RPG 日][2](LCTT 校注:今年的这个节日在 7 月 23 日举办)。在免费 RPG 日,桌面角色扮演游戏行业的发行商们会免费发放游戏,鼓励玩家尝试新游戏和新冒险。尽管它在 2020 年被取消了,但今年它又作为现场活动回归,并通过 [Dungeon Crawl Classics][3] 和 [Paizo][4] 的免费 RPG 示例下载提供了一些虚拟支持。
|
||||
|
||||
如果这个活动提供的虚拟产品还不够,我还整理了一份 [你可能尚未尝试过的 5 个开源桌面 RPG 游戏列表][5]。
|
||||
|
||||
当你准备好开始玩游戏时,请尝试其中一些开源工具,看看它们能在多大程度上增强你的游戏体验。
|
||||
|
||||
### 聊天
|
||||
|
||||
在线 RPG 游戏最基本的(从技术上讲,也是唯一的)要求是交流。这是游戏的媒介:玩家需要一种说话的途径。
|
||||
|
||||
有几个不错的选择。我发现 [Mumble][6] 是对带宽需求最低的工具。这是一个纯语音聊天应用程序,可以使用非常高效的 Opus 编解码器让每个人一次交谈数小时而不会中断。
|
||||
|
||||
![Mumble client][7]
|
||||
|
||||
它在世界各地都运行有公共实例,所以下载 Mumble 客户端后,你可以加入其中任何一个开放的实例,并使用它来在线运行游戏。有一个“按下通话”设置,你可以用此来消除背景噪音,当你的其他家庭成员在进行其它工作而不想被你的桌面会话打扰时,这个功能将会非常实用。
|
||||
|
||||
还有一个文本聊天客户端。我的游戏组通常使用它来发布与游戏相关的链接,但你也可以将其用于其它无关内容的交谈,而让口头游戏保持在主题上。
|
||||
|
||||
如果你的玩家更喜欢看到面部表情,或者只是习惯于视频聊天网页应用。那么 [Jitsi][8] 是面对面围坐在桌子旁聚会的绝佳替代品。Jitsi 和你曾经使用过的其它视频聊天软件几乎一样,甚至更简单。你可以设置一个“房间”,邀请朋友,将陌生人拒之门外,并玩上几个小时。静音和关闭摄像都很直观,界面很吸引人,并且还定期开发和推出了新功能。
|
||||
|
||||
![Jitsi][9]
|
||||
|
||||
Mumble 和 Jitsi 都有适用于台式机和移动设备的客户端,因此任何人都可以在任何设备上使用。
|
||||
|
||||
### 角色表
|
||||
|
||||
我发布了我的 [数字角色表][10] 解决方案,但任何 RPG 玩家都知道管理角色不仅仅是统计数据。
|
||||
|
||||
在延续多个会话的在线游戏中,我发现每次游戏之间有很长的停止时间。我突然想到,虽然我发现要求我的玩家在现场纸笔游戏中计算损耗是不合理的,但当一切都是数字化时,要求他们跟踪损耗很容易。
|
||||
|
||||
网上有很多可用的电子表格,但开源的选择是 [Ethercalc][11]。由于其实例遍布世界各地,因此很容易找到免费的 Ethercalc 主机。或者,你可以使用 Podman 或者 Docker 轻松安装和运行你自己的实例。
|
||||
|
||||
![Ethercalc spreadsheet of inventory][12]
|
||||
|
||||
Etherclac 提供了一些基本要素:一个共享的账本,这样玩家就可以跟踪他们的团队所携带的物品(以及在任何给定的时间持有该物品的人)、每件物品的重量和价值。当队伍在游戏过程中收集到战利品时,就会输入该物品,所以他们知道什么自己何时会因为负担过重而无法拿起新物品。
|
||||
|
||||
在不同的游戏会话之间,可以引用和整理这份共享的电子表格,以便玩家(PC)知道哪些物品可以卖掉,哪些物品可以放入储物袋,哪些物品可以在下一次会话发现更好的战利品时安全的丢弃。
|
||||
|
||||
### 地图
|
||||
|
||||
Mythic Table 是一款开源的桌面游戏共享地图系统。这意味着你可以加载图片作为游戏地图,并在地图上移动数字标记以表示玩家角色所在的位置。
|
||||
|
||||
自从 [上次我介绍了关于 Mythic Table][13] 以来,它已经在 Kickstarter 上成功地进行了一次众筹,以确保它的持续发展。它还增加了一些新功能,其中最引人注目的是“战争迷雾”功能,它允许地下城主掩盖地图并仅显示玩家探索过的部分。
|
||||
|
||||
![A dungeon map rendered by Mythic Table and user interface choices for chat, maps, and characters][14]
|
||||
|
||||
在过去的几个月里,我一直在 Mythic Table 上运行两款游戏,这是一款优秀且直观的地图系统。它还提供了一个数字骰子筒,所以如果你的玩家没有骰子,或者你更喜欢在公开场合掷骰子,你就可以用它作为共享的骰子池。
|
||||
|
||||
你可以在 [mythictable.com][15] 上试用 Mythic Table,或者访问他们在 [Github][16] 上的代码库。
|
||||
|
||||
### 开源的开放游戏
|
||||
|
||||
我使用的开源工具是通用的,因此它们适用于你想玩的任何游戏系统。因为它们都是开源的,所以无论你的玩家使用什么操作系统,他们都可以在线使用,并且它们都可以自托管。
|
||||
|
||||
如果你既是程序员又是游戏玩家,请访问他们的 Git 代码仓库,看看是否有任何你可以贡献的东西。如果你是游戏玩家或者游戏管理员,在下次坐在数字版的游戏桌前请尝试使用一下这些工具。你可能会惊讶于你只需要很少的在线账户就可以使用一些可用于游戏的最佳应用程序。
|
||||
|
||||
*(文内图片来自:Seth Kenlon,CC-BY-SA 4.0)*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/10/open-source-rpgs
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[perfiffer](https://github.com/perfiffer)
|
||||
校对:[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/header_dice.png?itok=dOMrHopO (Dice as a random number generator)
|
||||
[2]: https://www.freerpgday.com/
|
||||
[3]: https://goodman-games.com/blog/2021/10/06/pdf-previews-of-our-free-rpg-day-releases/
|
||||
[4]: https://paizo.com/community/blog/v5748dyo6shte
|
||||
[5]: https://opensource.com/article/21/10/rpg-tabletop-games
|
||||
[6]: http://mumble.info/
|
||||
[7]: https://opensource.com/sites/default/files/mumble-client.png (Mumble client)
|
||||
[8]: https://jitsi.org/
|
||||
[9]: https://opensource.com/sites/default/files/jitsi-client.jpg (Jitsi)
|
||||
[10]: https://opensource.com/article/21/10/3-ways-manage-your-character-sheets-open-source
|
||||
[11]: http://ethercalc.net/
|
||||
[12]: https://opensource.com/sites/default/files/uploads/ethercalc.jpeg (Ethercalc)
|
||||
[13]: https://opensource.com/article/20/11/open-source-battle-maps
|
||||
[14]: https://opensource.com/sites/default/files/uploads/mythic.jpeg (Mythic Table)
|
||||
[15]: http://mythictable.com/
|
||||
[16]: https://gitlab.com/mythicteam/mythictable
|
@ -0,0 +1,270 @@
|
||||
[#]: subject: "Beginner’s Guide to Installing Arch Linux on VirtualBox"
|
||||
[#]: via: "https://itsfoss.com/install-arch-linux-virtualbox/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "hanszhao80"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-14834-1.html"
|
||||
|
||||
在 VirtualBox 安装 Arch Linux 的新手操作指南
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/202207/16/100738bceesesazv6rsxl4.jpg)
|
||||
|
||||
[Arch Linux 在桌面 Linux 世界中非常流行][1]。受欢迎的原因之一是 [安装 Arch Linux][2] 本身就是一项复杂的任务。
|
||||
|
||||
我没有夸大其词。安装 [Ubuntu 或 Debian][3] 比 Arch Linux 容易得多,因为官方没给后者提供图形界面的安装程序。
|
||||
|
||||
这时虚拟机就派上用场了。
|
||||
|
||||
你可以先在 VirtualBox 中尝试安装 Arch Linux,看看它是否是你想在实际硬件上运行的系统。通过这种方式,你可以在不弄乱当前操作系统的情况下体验 Arch Linux。
|
||||
|
||||
在本文,我将一步一步指导你完成一个实用的 Arch Linux 虚拟机的安装过程。
|
||||
|
||||
### 在 VirtualBox 上安装 Arch Linux
|
||||
|
||||
毫无疑问,你需要先 [在 Linux 上安装 VirtualBox][4](或在 Windows 上)。在 Windows 上,只需访问 Oracle 的网站并下载 VirtualBox。
|
||||
|
||||
> **[下载 VirtualBox][5]**
|
||||
|
||||
如果你使用的是 Windows 10 或更高版本,请确保你的系统已启用虚拟化。
|
||||
|
||||
完成后,你需要到 [Arch Linux 官方网站][6] 下载 ISO 文件。你应该找到 [使用 torrent 下载][7] 或直接下载文件的选项。
|
||||
|
||||
![][8]
|
||||
|
||||
你可以保留 ISO 文件以备不时之需,安装成功后也可以将其删除以 [释放系统上的空间][9]。
|
||||
|
||||
现在,让我们开始在 VirtualBox 上安装 Arch Linux 吧。
|
||||
|
||||
#### 第一部分 创建虚拟机
|
||||
|
||||
**第一步**:首先,你需要在 VirtualBox 中设置一下。启动 VirtualBox 并单击 “<ruby>新建<rt>New</rt></ruby>” 来创建一个虚拟机。
|
||||
|
||||
![][10]
|
||||
|
||||
注意,你可以使用 “<ruby>向导模式<rt>guided mode</rt></ruby>” 继续创建虚拟机,但使用 “<ruby>专家模式<rt>expert mode</rt></ruby>” 可以一目了然地获得更多选项。
|
||||
|
||||
![][11]
|
||||
|
||||
因此,我推荐使用专家模式来创建虚拟机。
|
||||
|
||||
不用担心,专家模式同样简单,只是多了一些额外的可选项,无需担心其他任何事情。
|
||||
|
||||
**第二步**:输入你的虚拟机名称。当你在 “<ruby>名称<rt>Name</rt></ruby>” 字段中输入 “Arch Linux” 时,它会分别自动检测 “<ruby>类型<rt>Type</rt></ruby>” 和 “<ruby>版本<rt>Version</rt></ruby>”。
|
||||
|
||||
![][12]
|
||||
|
||||
你应该增加内存大小以舒适地使用虚拟机。如果只是用于小型测试,你可以继续使用默认设置。
|
||||
|
||||
我在这个例子中分配了 **4 GB 左右的内存**。
|
||||
|
||||
另外,请确保在 “<ruby>硬盘<rt>Hard disk</rt></ruby>”选项下选择 “<ruby>现在创建虚拟硬盘<rt>create a virtual hard disk</rt></ruby>”。它应该是默认选项。
|
||||
|
||||
现在,继续设置虚拟硬盘大小。
|
||||
|
||||
**第三步**:你可以选择虚拟硬盘的存放位置,并根据你的需求调整大小。最小分配大小(8 GB)对于安装系统应该不是问题,但安全起见,你可能得分配至少 10 到 15 GB。
|
||||
|
||||
![][13]
|
||||
|
||||
接下来,你需要将硬盘硬盘文件类型选择为 “VDI(VirtualBox Disk Image)” ,将存储选择为 “<ruby>动态分配<rt>Dynamically assigned</rt></ruby>”,如上图所示。
|
||||
|
||||
VDI 是虚拟硬盘最常见的硬盘类型。
|
||||
|
||||
当你为硬盘存储选择 “<ruby>动态分配<rt>Dynamically allocated</rt></ruby>” 选项时,这意味着存储空间将根据使用情况进行使用。换言之,当创建虚拟机后,并不会立即将这 15 GB 的空间从你的磁盘中锁定。
|
||||
|
||||
现在,你所要做的就是点击 “<ruby>创建<rt>Create</rt></ruby>” 来添加虚拟机。
|
||||
|
||||
#### 第二部分 添加 ISO 文件以开始安装 Arch Linux
|
||||
|
||||
![][14]
|
||||
|
||||
当虚拟机在左侧列表中出现后,你可以查看其配置并在 “<ruby>存储<rt>Storage</rt></ruby>” 选项下选择 ISO 文件作为磁盘驱动。
|
||||
|
||||
你也可以单独前往虚拟机设置以探索更多内容并选择 ISO 文件。
|
||||
|
||||
![][15]
|
||||
|
||||
为此,你需要导航至虚拟机设置的 “<ruby>存储<rt>Storage</rt></ruby>” 标签页。
|
||||
|
||||
![][16]
|
||||
|
||||
在这里,你必须单击 “<ruby>控制器<rt>Controller</rt></ruby>” 下的 “<ruby>没有盘片<rt>Empty</rt></ruby>”,然后继续选择 Arch Linux ISO 文件作为磁盘文件(如上图所示)。
|
||||
|
||||
![][17]
|
||||
|
||||
完成选择后,点击 “OK” 以保存设置的变更。
|
||||
|
||||
将 ISO 设置为要引导的磁盘时,虚拟机设置应如下所示:
|
||||
|
||||
![][18]
|
||||
|
||||
现在,点击 “<ruby>启动<rt>Start</rt></ruby>” 启动虚拟机并开始安装。
|
||||
|
||||
#### 第三部分 使用引导式安装程序安装 Arch Linux
|
||||
|
||||
使用 [介绍一个引导式安装程序][19] 的方法使安装 Arch Linux 变得更容易,也就是说,它为你提供了设置成熟的 Arch Linux 系统所需的所有选项。
|
||||
|
||||
因此,在引导式安装程序的帮助下,你不必单独安装桌面环境和其他基本软件包。你所要做的就是按照屏幕上的说明选择适合你的选项。
|
||||
|
||||
在本文中,我们将重点介绍引导式安装程序。如果你想自己做,你应该遵循我们的 [Arch 安装指南][2]。
|
||||
|
||||
继续安装流程,当你启动虚拟机时,将看到以下屏幕:
|
||||
|
||||
![][20]
|
||||
|
||||
第一个选项是理想的处理方式。如果你有特定的要求,可以选择其他选项来启动 Arch Linux。
|
||||
|
||||
现在,你应该正在查看一个终端窗口。以下是如何开始:
|
||||
|
||||
**第一步**:输入 `archinstall` 以使用引导式安装程序启动安装。
|
||||
|
||||
![][21]
|
||||
|
||||
**第二步**:根据你的要求选择键盘布局,美式布局应该是最常见的选择。简单地输入一个数字即可进行选择,如下图所示(例如,26):
|
||||
|
||||
![][22]
|
||||
|
||||
**第三步**:接下来,你需要选择一个区域来下载包。
|
||||
|
||||
![][23]
|
||||
|
||||
选择首选地区而不是 “<ruby>全球<rt>Worldwide</rt></ruby>”。这至关重要,因为如果你选择 **全球** 作为你的地区,它会下载许多不必要的包。
|
||||
|
||||
**第四步**:选择区域后,它会要求你选择驱动器进行安装。在这个例子中,我们已经创建了一个大约 15 GB 的虚拟驱动器,显示为 `/dev/sda`。
|
||||
|
||||
类似的,根据大小检查你创建的驱动器,然后选择该磁盘继续。在这里,我输入 `1` 作为输入;你的可能会有所不同。
|
||||
|
||||
![][24]
|
||||
|
||||
**第五步**:接下来,你将被询问以下内容:
|
||||
|
||||
- 选择文件系统类型
|
||||
- 加密密码(可选的)
|
||||
- 主机名
|
||||
- 创建 root 密码(可选的)
|
||||
- 创建超级用户
|
||||
- 选择一个预编程的配置文件
|
||||
|
||||
![][25]
|
||||
|
||||
在我的测试中,我选择了 btrfs 作为文件系统,没有设置任何磁盘加密密码。
|
||||
|
||||
主机名可随心所欲的设置,但我建议保持简短。
|
||||
|
||||
你可以选择创建一个 root 密码,即使不这么做也应该没什么问题。不过,你需要创建一个具有 sudo 权限的超级用户。
|
||||
|
||||
我使用 `admin`/`pass` 作为用户名和密码。不过,如果你不想让其他人访问你计算机上的虚拟机,则不应使用易于猜测的密码。
|
||||
|
||||
然后,你将看到一个选择配置文件的选项。在这种情况下,我们需要一个成熟的 Arch Linux 桌面。因此,我们通过输入 `0` 来选择 “<ruby>桌面<rt>desktop</rt></ruby>”。
|
||||
|
||||
**第六步**:接下来,你将被要求选择桌面环境。我决定使用 KDE。你可以选择任何你喜欢的。
|
||||
|
||||
![][26]
|
||||
|
||||
**第七步**:最后,你将被要求选择显卡驱动程序。由于我们是在 VirtualBox 上安装的 Arch Linux,你可以选择选项 4:VMware/VirtualBox,如下图所示:
|
||||
|
||||
![][27]
|
||||
|
||||
你可能还会被要求输入“是(`y`)或否(`n`)”选择 pipewire 而不是 PulseAudio 作为音频服务。选任何一个都应该都可以。
|
||||
|
||||
**第八步**:接下来是重要的一步。在这里,如果你需要内核的 LTS 版本,你可以选择使用 “linux-lts”,或者继续使用默认值。
|
||||
|
||||
![][28]
|
||||
|
||||
安装程序会提示你输入想安装的软件包。在这里,我们没有任何特殊要求,因此我们将其留空并按回车键跳过。
|
||||
|
||||
**第九步**:你将被要求选择所需的网络适配器以启用互联网访问。你必须选择以下选项:
|
||||
|
||||
“<ruby>使用网络管理器来控制和管理你的互联网连接<rt>Use network manager to control and manage your internet connection</rt></ruby>”
|
||||
|
||||
![][29]
|
||||
|
||||
**第十步**:下一步需要定义时区。选择适用于你的时区,或继续使用默认选项。
|
||||
|
||||
**第十一步**:完成后,它将显示你选择的大部分选项以供确认。按回车键继续。
|
||||
|
||||
![][30]
|
||||
|
||||
**第十二步**:安装完成需要花费几分钟时间,这取决于你的互联网连接速度。
|
||||
|
||||
安装完成后,它会要求你 “chroot 进入新创建的安装以进行安装后配置”,但我们不需要。因此输入 `N` 以完成安装。
|
||||
|
||||
**第十三步**:最后,你应该会再次看到终端窗口。输入:
|
||||
|
||||
```
|
||||
shutdown now
|
||||
```
|
||||
|
||||
这将安全地退出安装并关闭虚拟机。
|
||||
|
||||
一切就绪!在启动安装了 Arch 的虚拟机之前,你还需要做一件事 —— **移除选择作为光驱的 ISO 磁盘**。与添加启动 ISO 的方式类似,你可以前往虚拟机设置并将其删除,如下所示:
|
||||
|
||||
![][31]
|
||||
|
||||
到此为止你已在 VirtualBox 上安装了 Arch Linux。
|
||||
|
||||
你所要做的就是启动虚拟机,在我的例子中它是这样的:
|
||||
|
||||
![virtualbox arch][32]
|
||||
|
||||
尽管浏览这些选项需要一些时间,但 Arch Linux 上新的引导式安装程序可以节省大量时间使必填项配置正确。
|
||||
|
||||
![][33]
|
||||
|
||||
同样的步骤也适用于在你的计算机上安装 Arch Linux。你需要用 Arch Linux ISO 文件 [使用 Etcher 制作单独的可启动 USB 盘][34]。
|
||||
|
||||
### 总结
|
||||
|
||||
[Arch Linux 成为一种流行的选择][1] 有多种原因。但是,如果这是你第一次安装,或者你想对其进行测试,那么虚拟机是在不打乱主机的情况下体验它的最佳方式。
|
||||
|
||||
我希望这可以帮助你在 VirtualBox 上安装 Arch Linux。在下面的评论中让我知道你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/install-arch-linux-virtualbox/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hanszhao80](https://github.com/hanszhao80)
|
||||
校对:[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/lujun9972
|
||||
[1]: https://itsfoss.com/why-arch-linux/
|
||||
[2]: https://itsfoss.com/install-arch-linux/
|
||||
[3]: https://itsfoss.com/debian-vs-ubuntu/
|
||||
[4]: https://itsfoss.com/install-virtualbox-ubuntu/
|
||||
[5]: https://www.virtualbox.org/wiki/Downloads
|
||||
[6]: https://archlinux.org/download/
|
||||
[7]: https://itsfoss.com/best-torrent-ubuntu/
|
||||
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archlinux-downloads.png?resize=800%2C419&ssl=1
|
||||
[9]: https://itsfoss.com/free-up-space-ubuntu-linux/
|
||||
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-new.png?resize=800%2C562&ssl=1
|
||||
[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-expert-mode.png?resize=707%2C438&ssl=1
|
||||
[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-create.png?resize=800%2C536&ssl=1
|
||||
[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-disk.png?resize=800%2C528&ssl=1
|
||||
[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/choose-disk-virtualbox-arch.png?resize=800%2C440&ssl=1
|
||||
[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-settings-option.png?resize=800%2C551&ssl=1
|
||||
[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-choose-iso.png?resize=800%2C314&ssl=1
|
||||
[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch-iso-select.png?resize=800%2C348&ssl=1
|
||||
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-set-start.png?resize=800%2C548&ssl=1
|
||||
[19]: https://news.itsfoss.com/arch-linux-easy-install/
|
||||
[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-archlinux-boot.png?resize=800%2C593&ssl=1
|
||||
[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/vb-archinstall-guided.png?resize=800%2C400&ssl=1
|
||||
[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/vb-archinstall-kb-layout.png?resize=800%2C694&ssl=1
|
||||
[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-region.png?resize=800%2C664&ssl=1
|
||||
[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-selectdisk.png?resize=800%2C199&ssl=1
|
||||
[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-desktop-configure.png?resize=800%2C497&ssl=1
|
||||
[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-virtualbox-desktop-environment.png?resize=800%2C415&ssl=1
|
||||
[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-environment.png?resize=419%2C173&ssl=1
|
||||
[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-linux-kernel.png?resize=800%2C692&ssl=1
|
||||
[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch-network-manager.png?resize=800%2C151&ssl=1
|
||||
[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/archinstall-confirmation.png?resize=800%2C697&ssl=1
|
||||
[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/iso-remove-archinstall.png?resize=800%2C286&ssl=1
|
||||
[32]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/virtualbox-arch.png?resize=800%2C635&ssl=1
|
||||
[33]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/kde-arch-virtualbox.png?resize=800%2C453&ssl=1
|
||||
[34]: https://itsfoss.com/install-etcher-linux/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user