Merge pull request #1 from LCTT/master

20170718
This commit is contained in:
bigdimple 2017-07-18 23:53:19 +08:00 committed by GitHub
commit 145b4464ad
200 changed files with 18329 additions and 8832 deletions

View File

@ -76,13 +76,20 @@
#### H ####
### 1. Home Directory家目录
#### I ####
### 1. issue工单
> 有翻译做“问题”的,但是应该译作“工单”,尤其是用于 GitHub 中。
#### J ####
#### K ####
#### L ####
### 1. LTS(Long Term Support):长期支持
### 1. live CD现场版 CD
> 通常不翻译,但是如果翻译,可以译作“现场版”。
### 2. live patch 实时补丁/热补丁
> 指 Linux 内核的 live patch 支持。
### 2. LTS(Long Term Support):长期支持
>该缩写词多见于操作系统发行版或者软件发行版名称中,表明该版本属于长期支持版。
#### M ####

View File

@ -0,0 +1,207 @@
使用 Apex 和 Compose MongoDB 开发 serverless
============
Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文、部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 JavaJavascript 和 Ptyhon 语言,甚至包括 Go 语言。
两年前 Express (基本上是 NodeJS 事实标准上的网络框架层)的作者,[离开][12]了 Node 社区,而将其注意力转向 Go (谷歌创造的后端服务语言),以及 Lambda由 AWS 提供的函数即服务)。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 [Apex][13] 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。
### 什么是 Lambda?
如今,人们如果不能使用自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们会部署一个完整的协议栈如 Node、Express和一个自定义应用。或者如果他们更进一步使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。
在这个抽象的阶梯上的下一步是单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件而函数即服务FaaS的供应方根据要求执行匹配的函数。
### Apex 起步
Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了从 AWS 获取的命令行工具(详情请查看 [AWS CLI Getting Started][14] 或者 [Apex documentation][15])。
接下来,安装 Apex
```
curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
```
然后为你的新项目创建一个目录并运行:
```
apex init
```
![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png)
这步会配置好一些必须的安全策略,并且将项目名字附在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件和默认的 “Hello World" 风格的 Javascript 函数的 functions 目录。
![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png)
Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录,然后在其中创建项目。如果想要使用 Go 语言,你可以创建一个叫 `simpleGo` 的目录然后在其中创建一个小型的 `main` 函数:
```
// serverless/functions/simpleGo/main.go
package main
import (
"encoding/json"
"github.com/apex/go-apex"
"log"
)
type helloEvent struct {
Hello string `json:"hello"`
}
func main() {
apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
var h helloEvent
if err := json.Unmarshal(event, &h); err != nil {
return nil, err
}
log.Print("event.hello:", h.Hello)
return h, nil
})
}
```
Node 是 Lambda 所支持的运行环境Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 `event` 传入二进制文件的 STDIN将从二进制返回的 STDOUT 作为 `value`。通过 STDERR 来显示日志。`apex.HandleFunc` 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 `go run main.go` 来测试它。
![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png)
通过 Apex 向云端部署稍显琐碎:
![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png)
注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 `staging``production`配置`env`。
通过 `apex invoke` 在云端执行也比较琐碎:
![apexInvoke](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620796/jccxskukvy5utgegy2hr.png)
当然我们也可以追踪一些日志:
![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png)
这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见,但是当在另一个终端参照此结果来署它会更快。
### 窥探内部的秘密
来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外,它会提前做好配置如入口与安全条例:
![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png)
Lambda 服务实际上接受一个包含所有依赖的 zip 压缩包,它会被部署到服务器来执行指定的函数。我们可以使用 `apex build <functionName>` 在本地创建一个压缩包用来在以后解压以探索。
![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png)
这里的 `_apex_index.js handle` 函数是原始的入口。它会配置好一些环境变量然后进入 `index.js`
`index.js` 孕育一个 `main` Go 的二进制文件的子进程并且将所有关联联结在一起。
### 使用 `mgo` 继续深入
`mgo` 是 Go 语言的 MongoDB 驱动。使用 Apex 来创建一个函数来连接到 Compose 的 MongoDB 就如同我们已经学习过的 `simpleGo` 函数一样直观。这里我们会通过增加一个 `mgoGo` 目录和另一个 `main.go` 来创建一个新函数。
```
// serverless/functions/mgoGo/main.go
package main
import (
"crypto/tls"
"encoding/json"
"github.com/apex/go-apex"
"gopkg.in/mgo.v2"
"log"
"net"
)
type person struct {
Name string `json:"name"`
Email string `json:"email"`
}
func main() {
apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) {
tlsConfig := &tls.Config{}
tlsConfig.InsecureSkipVerify = true
//connect URL:
// "mongodb://<username>:<password>@<hostname>:<port>,<hostname>:<port>/<db-name>
dialInfo, err := mgo.ParseURL("mongodb://apex:mountain@aws-us-west-2-portal.0.dblayer.com:15188, aws-us-west-2-portal.1.dblayer.com:15188/signups")
dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
return conn, err
}
session, err := mgo.DialWithInfo(dialInfo)
if err != nil {
log.Fatal("uh oh. bad Dial.")
panic(err)
}
defer session.Close()
log.Print("Connected!")
var p person
if err := json.Unmarshal(event, &p); err != nil {
log.Fatal(err)
}
c := session.DB("signups").C("people")
err = c.Insert(&p)
if err != nil {
log.Fatal(err)
}
log.Print("Created: ", p.Name," - ", p.Email)
return p, nil
})
}
```
发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API
![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png)
最终结果是 `insert` 到在 [Compose 之上 的 MongoDB][16] 中。
![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png)
### 还有更多……
尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 [Terraform][17] 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript、Java、Python 以及 Go。你也可以为开发、演示以及产品环境配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。
和大多数事物一样Apex 和 Lambda 并不是在所有场景下都完美。 但是,在你的工具箱中增加一个完全不需要你来管理底层建设的工具完全没有坏处。
--------------------------------------------------------------------------------
作者简介:
Hays Hutton 喜欢写代码并写一些与其相关的东西。喜欢这篇文章?请前往[Hays Huttons author page][a] 继续阅读其他文章。
--------------------------------------------------------------------------------
via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
作者:[Hays Hutton][a]
译者:[xiaow6](https://github.com/xiaow6)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.compose.com/articles/author/hays-hutton/
[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&amp;url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&amp;via=composeio
[2]:https://www.facebook.com/sharer/sharer.php?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
[3]:https://plus.google.com/share?url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/
[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&amp;t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB
[5]:https://www.compose.com/articles/rss/
[6]:https://unsplash.com/@esaiastann
[7]:https://www.compose.com/articles
[8]:https://www.compose.com/articles/tag/go/
[9]:https://www.compose.com/articles/tag/mgo/
[10]:https://www.compose.com/articles/tag/mongodb/
[11]:https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/#search
[12]:https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b#.dc9vkeybx
[13]:http://apex.run/
[14]:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
[15]:http://apex.run/
[16]:https://www.compose.com/articles/composes-new-primetime-mongodb/
[17]:https://www.terraform.io/

View File

@ -0,0 +1,165 @@
为树莓派 3 构建 64 位内核
============================================================
> 编辑:在写完这个这篇文章之后,我在树莓派 3 上基于 Debian 开始打造 64 位的系统。你可以[在这里找到][3]。
**树莓派 3** 配有 Broadcom BCM2837 64 位 ARMv8 四核 Cortex A53 处理器,它是一个 **64 位 CPU**。如果你有一块,运行以下命令可能会让你感到惊讶:
```
uname -a
Linux raspberrypi 4.4.34-v7+ #930 SMP Wed Nov 23 15:20:41 GMT 2016 armv7l GNU/Linux
```
是的,这是一个 **32 位内核**。这是因为树莓派基金会还没有为官方的树莓派系统 Raspbian 提供 64 位版本。然而你可以构建一个,多亏了 [Electron752][9] 提供的许多补丁。
### 构建内核
树莓派基金会维护着[它们自己的 Linux 内核分支][10],它为它们的设备特别裁剪过,同时定期地从上游合并。
我们将会遵照[这个页面][11]的指导来**构建一个 64 位内核**。
我们不能使用“本地构建”的方法,因为它需要一块 64 位的树莓派,这个我们明显还没有。因此我们需要**交叉编译**它,**Ubuntu** 是推荐的系统。我个人没有 Ubuntu因此我在一个有 2 个 CPU 的 Ubuntu 16.04 Digital Ocean 实例上构建,这应该花费我 $0.03。如果你也想这么做,你可以通过[这个链接][12]得到 $10 的免费额度。或者你可以通过使用 Virtualbox 中的 Ubuntu VM 作为实例。
首先,我们需要一些**构建工具**以及** aarch64 交叉编译器**
```
apt-get update
apt-get install -y bc build-essential gcc-aarch64-linux-gnu git unzip
```
接着我们可以下载 **Linux 内核源码**
```
git clone depth=1 -b rpi-4.8.y https://github.com/raspberrypi/linux.git
```
进入到创建的 git 目录。另外你可以为你的内核添加额外的版本标签,可以通过编辑 `Makefile` 的开始几行完成:
```
VERSION = 4
PATCHLEVEL = 8
SUBLEVEL = 13
EXTRAVERSION = +bilal
```
为了**构建它**,运行下面的命令:
```
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcmrpi3_defconfig
make -j 3 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
```
第一个应该很快。第二个则会完全不同,我没有精确计时,但是对我来说大概要半个小时。根据你的 CPU 数nproc * 1.5)调整 `-j` 标志。
### 选择一个 Linux 发行版
在内核编译的时候,我们可以开始准备它的 Linux 发行版了。在本教程中为了简单我使用 **Raspbian**,即使这是一个只有 32 位的发行版。
> 如果你想要一直用 64 位系统,你应该选一个有 aarch64 支持的发行版Debian 有一个健壮的 [ARM64 移植版][4]。得到它基本有三种方式:
> - 下载一个预构建的根文件系统,这很可能会如页面中提到的那样给你一个过期的版本。
> - 如果你熟悉 debootstrap用它构建你自己的这回比较棘手因为它需要一些手工调整它最初的目的是在已经运行的主机上进行 chroot而不是为其他机器构建根文件系统
> - 我建议使用 multistrap这里有一个很好的教程http://free-electrons.com/blog/embdebian-with-multistrap/
回到 Raspbian我们现在可以下载官方系统并开始准备了。
打开一个新的 shell 会话并运行下面的命令:
```
wget -O raspbian.zip https://downloads.raspberrypi.org/raspbian_lite_latest
unzip raspbian.zip
```
我们用下面的命令审查:
```
fdisk -l 2016-11-25-raspbian-jessie-lite.img
Disk 2016-11-25-raspbian-jessie-lite.img: 1.3 GiB, 1390411776 bytes, 2715648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x244b8248
Device Boot Start End Sectors Size Id Type
2016-11-25-raspbian-jessie-lite.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
2016-11-25-raspbian-jessie-lite.img2 137216 2715647 2578432 1.2G 83 Linux
```
我们可以看到它有**两个分区**。第一个是**启动分区**,它主要包含了 bootloader、Linux 内核以及少量配置文件。第二个是**根分区**。
我们可以在我们的文件系统上**挂载这些分区**,从**根分区**开始:
```
mount -o loop,offset=70254592 2016-11-25-raspbian-jessie-lite.img /mnt
```
`offset` 取决于扇区大小51270254592 = 512 * 137216
接着是**启动分区**
```
mount -o loop,offset=4194304,sizelimit=66060288 2016-11-25-raspbian-jessie-lite.img /mnt/boot
```
`offset` 4194304 = 512 * 8192`sizelimit`66060288 = 512 * 129024 。
树莓派系统现在应该可以在 `/mnt` 中看到了。我们基本要完成了。
### 打包内核
内核编译完成后,最后一步包括**复制 Linux 内核**以及**设备树**到启动分区中:
```
cp arch/arm64/boot/Image /mnt/boot/kernel8.img
cp arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dtb /mnt/boot/
```
调整 `config.txt` :
```
echo “kernel=kernel8.img” >> /mnt/boot/config.txt
```
安装**内核模块** :
```
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu INSTALL_MOD_PATH=/mnt modules_install
umount /mnt/boot
umount /mnt
```
就是这样了,用于树莓派 3 的** ARM64 Linux 内核**诞生了!
现在你可以压缩镜像,通过 scp 下载下来,并按照标准的步骤放到你的 SD 卡中。
最后你会得到:
```
uname -a
Linux raspberrypi 4.8.13+bilal-v8+ #1 SMP Wed Dec 14 14:09:38 UTC 2016 aarch64 GNU/Linux
```
--------------------------------------------------------------------------------
via: https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
作者:[Bilal Amarni][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://devsidestory.com/about-me
[1]:https://devsidestory.com/author/bamarni/
[2]:https://devsidestory.com/build-a-64-bit-kernel-for-your-raspberry-pi-3/
[3]:https://github.com/bamarni/pi64
[4]:https://wiki.debian.org/Arm64Port
[5]:https://devsidestory.com/#twitter
[6]:https://devsidestory.com/#linkedin
[7]:https://devsidestory.com/#google_plus
[8]:https://www.addtoany.com/share#url=https%3A%2F%2Fdevsidestory.com%2Fbuild-a-64-bit-kernel-for-your-raspberry-pi-3%2F&title=Build%20a%2064-bit%20Kernel%20for%20your%20Raspberry%20Pi%203
[9]:https://github.com/Electron752
[10]:https://github.com/raspberrypi/linux
[11]:https://www.raspberrypi.org/documentation/linux/kernel/building.md
[12]:https://m.do.co/c/8ef9c5832a9c

View File

@ -0,0 +1,477 @@
如何为安卓开发搭建一个持续集成CI服务器
============================================================
我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro13 寸2011 年后期发布16GB 内存, 500G 的固态硬盘,内核是 i5主频 2.4GHz64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成CI服务器。
写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始:
1. 配置一个新的 Ubuntu ,以便运行 Android SDK。
2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。
3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。
4. Android app 配置需求。
### 第一步-安装 Ubuntu
我将使用 Ubuntu 作为持续集成的 SO因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了我就不废话了贴个下载链接就行了。
- [下载 Ubuntu Desktop 16.04 LTS][1]
有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。
### 第二步-远程管理:
#### SSH 服务器
Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。
```
$ sudo apt-get install openssh-server
```
#### NoMachine 远程桌面
可能你的持续集成服务器没有挨着你而是在你的路由器后面或者其它屋子甚至还可能远离你数里。我试过各种远程桌面方案不得不说IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。
- [NoMachine - 任何人都能用的免费的远程访问工具][3]
### 第三步-配置环境:
这里我打算安装 Java8Git和 Android SDKJenkins 需要它们来拉取、编译和运行 android 项目。
#### SDKMAN!
这个超级厉害的命令行工具让你可以安装各种流行的 SDK比如说Gradle、Groovy、Grails、Kotlin、 Scala……并可以以容易方便的方式列出它们和在各个并行版本中切换。
- [SDKMAN! - SDK 管理器][5]
它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN话说回来最好还是装上因为我们以后应该会用到。
安装 SDKMAN! 很容易,执行以下命令即可:
```
$ curl -s "https://get.sdkman.io" | bash
```
#### Oracle JAVA8
因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了:
```
$ sdk install java
```
或者使用 webupd8 这个仓库
- [在 Ubuntu 或 Linux Mint 上通过 PPA 仓库安装 Oracle Java 8 [JDK8]][6]
#### Git:
安装git的命令也非常直观就不废话了。
```
$ sudo apt install git
```
#### Android SDK
这下面这篇文章的底部
- [下载 Android Studio 和 SDK Tools | Android Studio][8]
你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如:
```
https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
```
下载,然后解压到 `/opt/android-sdk-linux` 下:
```
$ cd /opt
$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux
```
我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。
```
$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/
```
然后,在 `~/.bashrc` 文件下设置 SDK 的环境变量
```
$ cd
$ nano .bashrc
```
在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前):
```
export ANDROID_HOME="/opt/android-sdk-linux"
export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH"
```
关闭此终端,再打开一个新的终端看看环境变量是否正确生效:
```
$ echo $ANDROID_HOME
/opt/android-sdk-linux
```
然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖:
```
$ android
```
![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png)
*运行 Android SDK Manager 的图形交互界面*
### 第四步Jenkins 服务器
这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。
#### 安装 Jenkins
你可以在下面的链接找到 Jenkins 服务器相关信息:
- [Jenkins][12]
我们有许多办法运行 Jenkins比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。
我起初是想把它当做 Docker 容器运行但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。
少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。
```
$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
```
编辑 `source.list`,写入这一行:
```
$ sudo nano /etc/apt/sources.list
```
```
#Jenkin Stable
deb https://pkg.jenkins.io/debian-stable binary/
```
然后安装:
```
sudo apt-get update
sudo apt-get install jenkins
```
在你的用户组里面增加 `jenkins` ,允许其读写 Android SDK 文件夹。
```
$ sudo usermod -a -G 你的用户组 jenkins
```
Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问:
安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。
![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png)
*启用安装成功的 Jenkins 服务器。*
#### Jenkins 配置
启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。
* [JUnit 插件][16]
* [JaCoCo 插件][18]
* [EnvInject 插件][20]
* [GitHub 插件][22]
![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png)
*安装 Jenkins 插件*
创建管理员用户,并完成安装。
要完成安全需要配置环境变量 `ANDROID_HOME``JAVA_HOME`。
点击 Manage Jenkins接着 Configure System。
滚动文件至底部,在全局属性模块中找到环境变量,并增加 `ANDROID_HOMOE`,和 `JAVA_HOME` 变量。
![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png)
*给所有 Jenkins 任务增加全局变量*
#### 创建 Jenkins 任务
一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。
- [pamartineza/helloJenkins][24]
首先创建一个新的 Freestyle 任务项目,取名为 `Hello_Android`。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。
![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png)
*创建一个 Freestyle Jenkins 任务*
接下来就是配置了,我给每一部分都做了截屏。
**概况**
这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL不要 *.git这是 url 的部分,不是仓库的)。
![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png)
*项目 Url 配置*
**源代码管理**
这时候我们就要选择我们的 CVS 作为 Git并且增加仓库的 url这次就要包括 *.git然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。
相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。
另外如果你已经使用了双因子认证Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。
![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png)
*配置仓库*
**构建触发器**
你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。
最好的情况肯定是一旦你更改了某些地方就会立刻触发构建事件Github 为此提供了一个名叫 webhooks 的系统。
- [Webhooks | GitHub 开发者指南][26]
这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。
你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。
![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png)
*仓库轮询配置*
**构建环境**
这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。
![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png)
*构建超时*
**构建**
现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下Android 项目带有 Gradle Wrapper不要忘记把它检入到 Git ),然后定义你要执行哪些任务:
1. clean清除之前构建的所有历史输出这样可以确保没有东西缓存从头构建。
2. asseembleDebug 生成调试 .apk 文件。
3. test在所有模块上执行 JUnit 测试。
4. connectedDebugAndroidTest在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。
![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png)
*配置 Gradle*
**构建后操作**
我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。
我们 app 模块中,测试运行结果的路径是: `app/build/test-results/debug/*.xml`
在多模块项目中,其它的“纯” Java 模块中测试结果在这里:`*/build/test-results/*.xml`。
![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png)
还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。
![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png)
#### 运行 Jenkins 任务
只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。
![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png)
*手动执行任务*
最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。
![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png)
*控制台输出的开始部分*
如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。
![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png)
*哈哈哈哈,构建成功,测试结果符合预期*
### 第五步SonarQube
这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。
- [Continuous Code Quality | SonarQube][28]
SonarQube 是个代码静态分析工具它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。
- [JetBrains Plugin Repository :: SonarQube Community Plugin][30]
#### 安装 Docker
安装 Docker 十分容易,按照下面的教程即可:
- [在 Ubuntu 上安装 Docker][32]
#### 生成容器
**MySQL**
我们先搭建一个 MySQL5.7.17 服务器容器,命名为 `mysqlserver`,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 `YOUR_USER``YOUR_MYSQL_PASSWORD` 替换为你自己账号密码)。
```
$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17
```
**phpMyAdmin**
想要优雅简单地管理 MySQL服务器我强烈推荐 phpMyAdmin。你只要建立个容器命名为 `phpmyadmin`,然后链接到我们的 `mysqlserver` 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。
```
$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin
```
你可以用你的 mysql 密码 `YOUR_MYSQL_PASSWORD` ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar使用`uft8_general_ci` 字符集。此外,也创建一个 sonar 的新用户,密码 `YOUR_SONAR_PASSWORD`,并给它 sonar 数据库的权限。
**SonarQube**
现在我们已经创建好了我们的 SonarQube 容器,就叫 `sonarqube`,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090使用 5.6.4 版本。
```
$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4
```
#### 配置 SonarQube
如果一起都正常,你将在 localhost:9000 看到如下页面:
![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png)
好了,让我们来配置必要的插件和基本的配置文件:
1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin
2. 进入到 Administration然后点击 System接下来是 Updata Center最后是 Updates Only。
* 如果需要的话更新 Java 插件。
3. 现在启用,并安装以下插件
* Android 提供 Android lint 规则)
* Checkstyle
* Findbugs
* XML
4. 返回顶部,点击重启按钮完成整个安装。
#### SonarQube 配置文件
我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。
同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。
就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。
将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。
![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png)
*继承链*
#### 运行 Sonarqube 分析器
现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 `sonarqube` 到我们的 Jenkins 任务。我们在最后执行。
![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png)
再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。
![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png)
*分析结果的显示*
点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。
在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。
![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png)
### 第六步 附加:配置其他 Android 应用
想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息
- [pamartineza/helloJenkins][34]
你也可以看看我在云上测试的文章:
- [使用 Jenkins CI 服务器在云设备上运行 Android 测试][36]
### 最后
啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。
--------------------------------------------------------------------------------
作者简介:
![](https://cdn-images-1.medium.com/fit/c/60/60/0*DQl4jAoi2wXr6S3p.jpg)
Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller
--------------------------------------------------------------------------------
via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98
作者:[Pablo A. Martínez][a]
译者:[Taylor1024](https://github.com/Taylor1024)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://medium.com/@pamartineza
[1]:https://www.ubuntu.com/download/desktop
[2]:https://www.nomachine.com/download
[3]:https://www.nomachine.com/download
[4]:http://sdkman.io/
[5]:http://sdkman.io/
[6]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
[7]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html
[8]:https://developer.android.com/studio/index.html
[9]:https://developer.android.com/studio/index.html
[10]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
[11]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip
[12]:https://jenkins.io/
[13]:https://jenkins.io/
[14]:https://pkg.jenkins.io/debian-stable/jenkins.io.key
[15]:http://localhost:8080/
[16]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin
[17]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin
[18]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin
[19]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin
[20]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
[21]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
[22]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin
[23]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin
[24]:https://github.com/pamartineza/helloJenkins
[25]:https://github.com/pamartineza/helloJenkins
[26]:https://developer.github.com/webhooks/
[27]:https://developer.github.com/webhooks/
[28]:https://www.sonarqube.org/
[29]:https://www.sonarqube.org/
[30]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin
[31]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin
[32]:https://docs.docker.com/engine/installation/linux/ubuntulinux/
[33]:https://docs.docker.com/engine/installation/linux/ubuntulinux/
[34]:https://github.com/pamartineza/helloJenkins
[35]:https://github.com/pamartineza/helloJenkins
[36]:https://pamartinezandres.com/running-android-tests-on-cloud-devices-using-a-jenkins-ci-server-firebase-test-lab-amazon-device-b67cb4b16c40

View File

@ -0,0 +1,77 @@
深入实时 Linux
============================================================
![Jan Altenberg](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-altenberg-elc.png?itok=mgQeKpEK "Jan Altenberg")
> 实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。
实时 LinuxRTL是一种启用 PREEMPT_RT 的主线 Linux在过去十年中已经走了很长的路。大约 80 的确定性的 [PREEMPT_RT][3] 补丁现在可用于主线内核本身。然而Linux 上单内核 RTL 的最强大的替代品——双内核 Xenomai——继续声称在减少延迟上有巨大的优势。在去年 10 月的 [欧洲嵌入式 Linux 会议][4]的演讲中Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。
德国嵌入式开发公司 [Linutronix][5] 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在实际使用中。争议较少的是,他认为 RTL 更易于开发和维护。
在我们深入永恒的 Xenomai 与 RTL 的辩论之前请注意2015 年 10 月,[开源自动化开发实验室][6]OSADL将 RTL 项目的[控制权][7]转移给了管理 Linux.com 的 Linux 基金会。此外Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。
RTL 的进步是过去十年中 Linux 从实时操作系统RTOS中[获得市场占有率][8]的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如 Linux的单用途设备上实现实时很简单。
Altenberg 通过清除关于实时确定性的内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行,这基本上是决定论和定时保证。实时为你提供保证某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽快指定。”
在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的推动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。
Altenberg 说:“实时需求包括确定性的定时行为、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。”
Altenberg 强烈建议不要使用术语“软实时”来描述轻量级实时解决方案。“你可以是确定性的或者不是,但两者之间什么也没有。”
### 双内核实时
像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说“使用双内核当优先级实时程序不在微内核上运行时Linux 可以获得一些运行时间。 “问题是人们需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行所以你需要一个硬件抽象层HAL。有两件事要维护你通常会落后主流内核一步。”
Altenberg说“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员并不需要维护一个微内核或 HAL。
Altenberg 继续解释了 RTAI 和 Xenomai 之间的差异。“使用 RTAI你将编写一个由微内核调度的内核模块。这就像内核开发 - 真的很难深入,很难调试。”
RTAI 的开发可能会更加复杂,因为工业用户通常希望包括封闭的源代码以及 GPL 内核代码。 Altenberg 说:“你必须决定哪些部分可以进入用户态,哪些部分可以通过实时的方式进入内核。”
RTAI 与 RTL 想必支持更少的硬件平台,特别是 x86 之外。双内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是Altenberg 说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。”
然而,使用 Xenomai你仍然需要维护一个单独的微内核和 HAL。有限的开发工具是另一个问题。Altenberg说“与 RTAI 一样,你不能使用标准的 C 库。你需要专门的工具和库。即使对于 POSIX 来说,你也必须链接到 POSIX 层,这更复杂。” 他补充说,任何一个平台,很难将超过 8 到 16 个 CPU 的微内核扩展到金融服务中使用的大型服务器集群。
### 睡眠自旋锁
主要的单内核解决方案是基于 PREEMPT.RT 的 RTL它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。PREEMPT.RT 最初称为睡眠自旋锁补丁)
PREEMPT.RT 不是在硬中断环境中运行中断处理程序而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在进程列表中,有自己的 PID。所以你可以把低优先级的放在不重要的中断上高优先级的放在重要的用户态任务上。”
由于大约 80 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用面向 PREEMPT.RT 的内核组件如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。”
因为 RTL 主要在 Linux 主线上Altenberg 说“PREEMPT.RT 被广泛接受,拥有庞大的社区。如果你编写一个实时应用程序,你不需要知道很多关于 PREEMPT.RT 的知识。你不需要任何特殊的库或 API只需要标准的 C 库、Linux 驱动程序和 POSIX 程序。”
你仍然需要运行一个补丁来使用 PREEMPT.RT它每隔两个 Linux 版本更新一次。然而,在两年内,剩下的 20 的 PREEMPT.RT 应该会进入 Linux所以你就“不再需要补丁”了。
最后Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好的问题。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。”
Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的性能抖动,但是差异不如一些 Xenomai 拥护者声称的高达 300% 至 400 的延迟优势。当用户空间任务执行测试时Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。
当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时Altenberg 表示这相当普遍PREEMPT.RT 执行得更好大约80微秒。有关详细信息请查看大约第 33 分钟的视频。)
Altenberg 承认与 OSADL 的两到三年测试相比,他的 12 小时测试是最低标准,而且它不是一个“数学证明”。无论如何,考虑到 RTL 更简单的开发流程,它都值得一试。他总结说:“在我看来,将完整功能的 Linux 系统与微内核进行比较是不公平的。”
--------------------------------------------------------------------------------
via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux
作者:[ERIC BROWN][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/ericstephenbrown
[1]:https://www.linux.com/licenses/category/linux-foundation
[2]:https://www.linux.com/files/images/jan-altenberg-elcpng
[3]:https://www.linux.com/blog/intro-real-time-linux-embedded-developers
[4]:http://events.linuxfoundation.org/events/archive/2016/embedded-linux-conference-europe
[5]:https://linutronix.de/
[6]:http://archive.linuxgizmos.com/celebrating-the-open-source-automation-development-labs-first-birthday/
[7]:http://linuxgizmos.com/real-time-linux-shacks-up-with-the-linux-foundation/
[8]:https://www.linux.com/news/embedded-linux-keeps-growing-amid-iot-disruption-says-study

View File

@ -0,0 +1,63 @@
幼犬式免费:免费软件中的无形消费
============================================================
![幼犬式免费:免费软件中的无形消费](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "幼犬式免费: 免费软件中的无形消费")
Image by : opensource.com
我们习惯于软件被描述为“<ruby>自由式免费<rt>free as in freedom</rt></ruby>”和“<ruby>啤酒式免费<rt>free as in beer</rt></ruby>”。但还有另一种不常被提起的“免费”——“<ruby>幼犬式免费<rt>free as in puppy</rt></ruby>”。这个概念来自于当别人送你一只免费的小狗,但那只小狗不是真的免费。日常照顾它需要花费大量精力与金钱。商业术语是“总体拥有成本”,即 TCO ,这适用于所有场景,不仅仅是开源软件和小狗。
既然免费小狗问题适用于所有事,那么它是如何对于开源软件特别重要的呢?有一些解释。首先,如果你已经购买了软件,就会因为消费对它设定期望值。软件起初免费后来需要花钱似乎是很无理的要求。其次,如果这发生在一个组织首次采用开源项目的时候,就会阻碍该组织下一次采用开源项目。最终且违反直觉的是,看起来开源软件需要花钱可能使得它更轻易“卖出”,如果它真的免费,未免也太好了一点。
接下来的部分是软件消费渐显的共同之处。这绝不是一个详尽的列表。
### 起始消费
开始使用软件之前,你必须首先拥有这个软件。
* **软件:** 因为它是开源的不一定意味着它是_免费的_。
* **硬件:** 考虑到软件的需求。如果你没有使用软件所需的硬件(可能是服务器硬件或者客户端硬件),你得买。
* **培训:** 很少有软件完全直白如话的。在于你是选择培训还是自己去弄清楚。
* **实战:** 把所有零部件放在一起只是开始,现在,是时候把所有东西拼在一起了。
* **安装和配置:** 至少这将花费一些员工的工作时间。如果这是一个大项目,你可能需要花钱请一个系统整合服务商或者其他供应商来做这件事。
* **数据导入:** 如果要取代现成的系统,存在数据搬家的问题。皆大欢喜的是所有都是相同标准编译的,这样就没什么问题。然而在很多情况,需要写一些脚本来提取和重载数据。
* **其他系统的接口:** 说到写脚本,这个软件能和你使用的其他软件(例如,目录服务或者工资软件)很好联系起来吗?
* **定制:** 如果原本的软件不能满足你所有的需求,那它可能需要定制。你可以做到,但是仍需要努力或者是一些原材料。
* **商业变化:** 当你的组织希望有所提升时,新软件也可能会变化。然而这种转换不是免费的。例如,生产效率刚开始可能会下降因为员工还在适应新软件。
### 经营成本
安装软件是简单部分,现在你得使用它。
* **更多培训:** 什么,你认为我们已经做好了? 过段时间,你的组织会加入新人,他们需要学习如何使用这个软件,或者说是添加了额外功能的新版本软件发布了。
* **维护:**
* **订阅费:** 有些软件通过收取订阅费来提供更新。
* **补丁:**取决于软件的自身,打补丁需要费很多功夫。包括测试和部署。
* **开发:**你自己做所有定制吗?现在你必须维护下去了。
* **支持:** 当它坏了得有人来修,无论是供应商还是自己的团队,确实需要一笔花费。
* **良好的做法:** 这个不是必需品,但如果你在使用开源软件,无论如何给一些回馈是非常好的。比如代码贡献、在邮件列表提供支持、赞助年度会议等等。
* **商业利益:** 好吧,这不是一个付费项,而且它抵消了一些费用。使用软件对你的组织意味着什么呢?如果它使得量产产品减少了 25% 的浪费,这就是价值。再换个例子,它可能帮助你减少 30% 不盈利部分。
这样例子数不胜数,确实需要一定想象力来想出所有的花费。算出正确的价值需要一些实验和大量的的优质客户,但是这样分析一遍的话会使得它更加清晰。就好像一只小狗狗,如果预先知道自己会付出多少,这可能会是一个有价值的实验。
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/2/hidden-costs-free-software
作者:[Ben Cotton][a]
译者:[XYenChi](https://github.com/XYenChi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/bcotton
[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4
[2]:https://opensource.com/user/30131/feed
[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments
[4]:https://opensource.com/users/bcotton

View File

@ -0,0 +1,66 @@
在物联网中使用脚本语言面临的挑战与对策
============================================================
![Scripting IoT](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/scripting-languages-iot.jpg?itok=d6uog0Ss "Scripting IoT")
> 在即将到来的嵌入式 Linux 会议 + OpenIoT 峰会中Paul Sokolovsky 将会讨论在嵌入式开发中使用脚本语言的一些挑战。
脚本语言(又称作<ruby>超高级语言<rt>Very High-Level Languages</rt></ruby>或 VHLLs ),例如 Python、 PHP 以及 JavaScript 常用在桌面、服务器和网页开发中。它们强大的内置功能能够让你花费少量的时间和精力来开发小型却有用的应用Paul SokolovskyLinaro 公司物联网工程师如是说。然而,目前在物联网中使用超高级语言深度开发嵌入式应用相对来说有些别扭。
在即将到来的[嵌入式 Linux 会议][6] + [OpenIoT 峰会][7]中Sokolovsky 会讨论在嵌入式开发中使用 VHLLs 的挑战并且基于 MicroPython 的例子与 JerryScript + Zephyr.js 项目比较不同的对策。 我们与Sokolovsky 进行了一番交谈来获得更多信息。
**Linux.com您可以给我们的读者一些 VHLLs 的背景知识吗?**
Paul Sokolovsky: 超高级语言成为计算机科学和信息技术风景中的一部分已经几十年了。也许第一个流行的脚本语言是 Unix shellsh尽管由于较小的特征集它很少被认为是一种超高级语言而是一种特定领域语言。所以第一个真正破纪录的 VHLLs 是 Perl1987和 Tcl1988很快紧跟着出现了 Python1991Ruby1995PHP1995JavaScript1995以及许多其它语言。
不同 VHLLs 之间的区别特性包括:它们的解析本能(从使用者的角度来看,也许是因为其中复杂的编译器作祟),内置可用的强大的数据类型如任意大小的列表和映射,可观的标准库,以及允许用户访问甚至更大的第三方库的外部模块系统。所有的这些特性都与相对容易使用的感觉(更少的输入,不需要构建等)和简单的学习曲线相耦合。
**Linux.com: 使用这些语言做开发有哪些优势?**
Sokolovsky: 优势的根源来自于以上描述的这些特性。一个新手可以非常轻松的开始使用脚本语言并且快速的学习它。很多 VHLLs 提供了一个强大的交互模式,所以你不需要去读那些厚厚的使用手册来开始使用脚本语言,而是直接去探索和体验它们。强大的内置功能允许你去开发小而有用的应用(脚本),而仅仅使用很少的时间和精力(这就是“脚本语言”名字的来源)。如果要转向开发大型应用,广泛的第三方库和可以轻而易举使用的模块系统使得开发变得流畅和高产。
**Linux.com: 在嵌入式平台上使用脚本开发和在其他平台开发有什么区别?**
Sokolovsky: 鉴于之前我们讨论过的 VHLLs 振奋人心的能力,有一个创意——为什么我们不能享受使用 VHLLs 为嵌入式设备做开发而具有所有(或者至少一部分)优势呢?这里我提到的“嵌入式设备”不仅仅是拥有 8-32 MB RAM 的小型 Linux 系统还有运行在微控制器MCU上有几千字节内存的深度嵌入式系统。少量有些时候几乎没有的相关资源肯定使这个创意的实现变得更加复杂。 另一个问题是设备访问和交互。嵌入式设备通常没有显示屏和键盘,但是幸运的是解决这个问题的答案已经存在几十年了,这里要感谢 Unix它提供了使用串口UART来搭建一个终端连接的方法。当然在主机端有些用户喜欢使用图形集成开发环境IDE来隐藏串口通信细节。
所以,由于嵌入式设备所有的这些不同特性,这个创意就是提供一个尽可能熟悉的工作环境。但熟悉只是其中一方面,另一方面,为了适应甚至最小的设备,工作环境需要尽可能的缩小。要想解决这些矛盾需要嵌入式 VHLLs 的操作可以高度配置,来适应不同的项目和硬件的需求。
**Linux.com只有在物联网中使用这些语言才会遇到的挑战有哪些比如说你如何处理内存限制**
Sokolovsky: 当然,解释程序本身几乎不怎么消耗硬件资源。但是在当今世界,最珍贵的资源是人类的时间。不管你是一个研发工程师、一个仅仅有几个小时的周末创客、一个被 bug 和安全问题淹没的支持工程师,或者一个计划开发新产品的产品经理——你手头上大概都没有什么多余时间。因此需要将 VHLLs 的生产力提供到嵌入式工程师手上。
当前的工艺水平使得这些需求变得可行。公正的来讲甚至于微处理器单元MCU平均 都有 16-32 KB RAM 128-256 KB ROM。这仅仅足够搭载一个核心解释程序一个标准库类型的规范子集一些硬件驱动以及一个很小但是依旧有用的应用程序。假如你的硬件配置稍微越过了中间线其能力得到了快速的增长——这实际上是由于一个从 1970 年代就闻名的技巧使用自定义的字节码和精码pcode相比原始机器代码能够让你获得更大的代码/特性密度。
在这条道路上有很多挑战RAM 不够用是主要的一个。我是在一个 16 GB RAM 的笔记本上写下的这些话(但不断切换的话依然会很卡),而刚才提到的 16KB 比它小一百万倍!不过,通过小心的选择算法和编程技巧,在这样小的 RAM 下仍有可能通过脚本语言来执行简单程序,而相当复杂的程序可能需要 128-256K。
有很多的技术挑战需要解决(它们已经被成功的解决了),这里没有足够的篇幅来涵盖它们。不过,我在 OpenIoT 峰会上的演讲会涵盖使用两种嵌入式脚本语言的经验和成就MicroPythonPython3 的子集)和 Zephyr.jsJavaScript/Node.js 的子集),都运行在 Linux 基金会的 Zephyr 实时操作系统上,它被寄希望于在 IoT 工业界取得和 Linux 在移动互联网和服务器方面一样的成就。(相关 PPT 会为无法参加 OpenIoT 会议的朋友在会议后放出。)
**Linux.com: 你能给我们一些 VHLLs 最适用的应用的例子吗?以及一些它们不适用的例子?**
Sokolovsky以上是很多关于 VHLLs 的光明前景,公正的来说:在嵌入式开发中,这里有很多一厢情愿的幻想(或者说希望其是能够自我实现的预言)。在嵌入式开发中 VHLLs 现在可以提供的是:快速成型,以及教育/创客市场上所必须的易学性和易用性。有一些先行者在其它领域使用 VHLLs但是就目前来看它需要在基础构造和工具开发上投入更多。重要的是这样的投入应遵循开源原则并分享否则会逐渐损害到 VHLLs 能够节省使用者时间和精力的优势。
谨记这些,嵌入式 VHLLs 是发育完全(“逐渐变的完整”)的语言,能够适应各种类型的应用,但是要受制于硬件。例如,假如一个微处理器的规格低于之前提到的阈值,如一个老旧的 8-bit 微处理器,那么只有同样古老而优秀的 C 语言能够为你所用。另外一个限制是当你真的想要充分利用硬件时—— C 语言或者汇编程序才是正确的选择。但是,这里有一个惊喜——嵌入式 VHLLs 的开发者也想到了这一点,例如 MicroPython 允许你将 Python 和汇编程序在同一个应用中结合起来。
嵌入式 VHLLs 的优势是其可配置性和可(重复)编程性,外加灵活的连接性支持。这恰恰是 IoT 和智能设备最需要的,很多 IoT 应用使用起来也不需要太复杂。考虑一下,例如,一个可以贴在任何地方用来完成各种任务的智能按钮。但是,如果你需要调整双击的时间时怎么办?使用脚本语言,你可以做到。也许你完全不会考虑三连击,但是现在在某些情况下四连击都可能是有用的。使用脚本语言,你可以轻易修改它。
(题图:来自 Pixabay基于 CC0 协议)
--------------------------------------------------------------------------------
via: https://www.linux.com/news/event/elcna/2017/2/using-scripting-languages-iot-challenges-and-approaches
作者:[AMBER ANKERHOLZ][a]
译者:[xiaow6](https://github.com/xiaow6)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/aankerholz
[1]:https://www.linux.com/licenses/category/used-permission
[2]:https://www.linux.com/licenses/category/creative-commons-zero
[3]:https://www.linux.com/files/images/paul-sokolovsky-2014-09-21jpg
[4]:https://www.linux.com/files/images/scripting-languages-iotjpg
[5]:http://events.linuxfoundation.org/events/embedded-linux-conference/program/schedule?utm_source=linux&amp;utm_campaign=elc17&amp;utm_medium=blog&amp;utm_content=video-blog
[6]:http://events.linuxfoundation.org/events/embedded-linux-conference
[7]:https://events.linuxfoundation.org/events/openiot-summit/program/schedule

View File

@ -0,0 +1,80 @@
GitHub 对软件开发业造成的冲击
============================================================
![The impact GitHub is having on your software career](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/github-universe.jpg?itok=HCU81VX8 "The impact GitHub is having on your software career")
在未来的 12 到 24 个月内(也就是说,在 2018 年,或者是 2019 年),人们雇佣软件开发者的方式将会发生彻底的改变。
2004 至 2014 期间,我曾经就职于红帽,这是世界上最大的开源软件公司。还记得 2004 年七月的一天,我第一次来到这家公司,我的老板 Marty Messer 就跟我说,“所有你在这里所做的工作都会被开源,在未来,你将不需要任何的简历,因为所有的人都可以 Google 到你。”
供职于红帽的一个独特的好处是,在这种开源的工作期间,我们有机会建立自己的个人品牌和树立自己的声誉。我们可以通过邮件列表和 bug 追踪器与其它的软件工程师进行沟通,而且提交到 mercurial、subversion 和 CVS 仓库的源代码都会被开源,并且可以通过 google 找到。
(写本文时)马上就到 2017 年了,我们将生活在一个处处充满开源的世界。
以下两点会让你对这个新时代有一个真正意义上的了解:
1. 微软在过去的一段很长的时间里都在坚持闭源,甚至是排斥开源。但是现在也从心底里开始拥抱开源了。它们成立了 .NET 基金会(红帽也是其中的一个成员),并且也加入了 Linux 基金会。 .NET 项目现在是以一个开源项目的形式在开发着。
2. Github 已经成为了一个独特的社交网络,并将问题追踪器和分布式源码版本控制融入其中。
对于那些从闭源走过来的软件开发者来说,他们可能还不知道发生了什么。对于他们来说 ,开源就意味着“将业余时间的所有工作成果都免费开放”。
对于我们这些在过去十年创造了一家十亿美元的开源软件公司的人来说参与开源以后就没有什么空闲的时间可言了。当然为开源事业献身的好处也是很明显的所得到的名誉是你自己的并不隶属于某个公司。GitHub 是一个社交网络,在这个地方,你可以创建你的提交、你可以在你所专长的领域为一些全球性的组织做出贡献,你临时做的一些工作并不附属于所任职的公司。
聪明的人会利用这种工作环境。他们会贡献他们的补丁、工单issue、评论给他们平时在工作中使用的语言和框架比如 TypeScript、 .NET 和 Redux 。
他们也拥抱开源,并会尽可能多的开源他们的创新成果。甚至会提交他们的贡献给私有仓库。
GitHub 对平等居功至伟。比如说,你也许很难在澳大利亚得到一份来自印度的工作,但是,在 GitHub 上,却没有什么可以阻止你在印度跟澳大利亚的工作伙伴一起工作。
在过去十年里,想从红帽获得一个工作机会的方式很简单。你只需要在一些某些小的方面,与红帽的软件工程师在开源的项目上协作,然后当他们觉得你在某些方面做出了很多有价值的贡献,而且成为一个很好的工作伙伴时,那么你就可以申请一个红帽的工作机会了,或许他们会邀请你。
现在,在不同的技术领域,开源给了我们所有人同样的机会,随着开源在世界的各处都流行开来,这样的事情将会在不同的地方盛行开来。
在[最近一个访谈][3]中Linux 和 git 的发明者 Linux Torvalds在 GitHub 上有 49K 粉丝0 关注),这么说,
> “你提交了很多小补丁,而在某个时候项目的维护者开始信任你,在那一刻,你跟一般人不同的是,你不仅仅是提交了一些补丁,而是真正成为了这个组织里被信任的一部分。”
实际上你的名声存在于那个你被信任的网络。我们都知道,当你离开一家公司以后,你的人脉和名声可能会削弱,有的甚至会丢失。就好像,你在一个小村庄里生活了很长的一段时间,这里所有的人都会知道你。然而,当你离开这个村庄,来到一个新的地方,这个地方可能没人听说过你,更糟糕的是,没有人认识任何知道你的人。
你已经失去了一度和二度连接关系甚至有可能会失去这三度连接关系LCTT 译注:指六度连接理论)。除非你通过在会议或其他大型活动中演讲来建立自己的品牌,否则你通过在公司内部提交代码建立起来的信任早晚都会过去的,但是,如果你在 GitHub 上完成你的工作,这些东西依然全部都在,对这个信任网络的连接仍然可见。
首先会发生的事情就是,一些弱势群体可能会利用这个。包括像学生、新毕业生、移民者--他们可能会利用这个“去往”澳大利亚。
这将会改变目前的现状。以前的一些开发人员可能会有过人际网络突然中断的情况,开源的一个原则是精英——最好的创意、最多的提交、最多的测试,和最快的落实执行,等等。
它并不完美,当然也没有什么事情是完美的,不能和伙伴一起工作,在人们对你的印象方面也会大打折扣。红帽公司会开除那些不能和团队和谐相处的人,而在 GitHub 工作的这些员工,他们主要是和其它的贡献者之间的交流。
GitHub 不仅仅是一个代码仓库或是一个原始提交成员的列表,因为有些人总是用稻草人论点描述它。它是一个社交网络。我会这样说:
> GitHub 有多少代码并不重要,重要的是有多少关于你代码的讨论。
GitHub 可以说是伴你而走的名声,并且在以后的 12 到 24 个月中,很多开发者使用它,而另外的一些依然并不使用,这将会形成一个很明显的差异。就像有电子邮件和没有电子邮件的区别(现在每个人都有电子邮件了),或者是有移动电话和没有移动电话的区别(现在每个人都有移动电话了),最终,绝大多数的人都会为开源工作,这将会是与别人的竞争中的一个差异化的优势。
但是现在,开发者的职业生涯已经被 GitHub 打乱了。
(题图: GitHub
--------------------------------------------------------------------------------
作者简介:
Josh Wulf - 我是 Just Digital People 的传奇招聘者前红帽员工CoderDojo 导师, Magikcraft.io 创始人之一The JDP Internship 出品人——这是世界第一的软件开发真人秀,世界上最好的科技播客主持人,也是一位父亲。一直致力于昆士兰州的“硅经济”。
-----------------------
via: https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50
作者:[Josh Wulf][a]
译者:[SysTick](https://github.com/SysTick)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/sitapati
[1]:https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50#.dl79wpyww
[2]:https://opensource.com/article/17/3/impact-github-software-career?rate=2gi7BrUHIADt4TWXO2noerSjzw18mLVZx56jwnExHqk
[3]:http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/
[4]:https://opensource.com/user/118851/feed
[5]:https://opensource.com/article/17/3/impact-github-software-career#comments
[6]:https://opensource.com/users/sitapati

View File

@ -1,40 +1,26 @@
开发 Linux 调试器第三部分:寄存器和内存
开发一个 Linux 调试器(三):寄存器和内存
============================================================
上一篇博文中我们给调试器添加了一个简单的地址断点。这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器、观察状态和改变程序的行为。
* * *
### 系列文章索引
随着后面文章的发布,这些链接会逐渐生效。
1. [启动][3]
1. [准备环境][3]
2. [断点][4]
3. [寄存器和内存][5]
4. [Elves 和 dwarves][6]
5. [源码和信号][7]
6. [源码级逐步执行][8]
7. 源码级断点
8. 调用栈展开
9. 读取变量
10. 下一步
译者注ELF[Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式DWARF一种广泛使用的调试数据格式参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")
* * *
### 注册我们的寄存器
在我们真正读取任何寄存器之前,我们需要告诉调试器更多关于我们平台,也就是 x86_64 的信息。除了多组通用和专用目的寄存器x86_64 还提供浮点和向量寄存器。为了简化我将跳过后两种寄存器但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。
在我们真正读取任何寄存器之前,我们需要告诉调试器一些关于我们的目标平台的信息,这里是 x86_64 平台。除了多组通用和专用目的寄存器x86_64 还提供浮点和向量寄存器。为了简化我将跳过后两种寄存器但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称、它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。
```
enum class reg {
@ -89,7 +75,7 @@ const std::array<reg_descriptor, n_registers> g_register_descriptors {{
如果你想自己看看的话,你通常可以在 `/usr/include/sys/user.h` 找到寄存器数据结构,另外 DWARF 寄存器编号取自 [System V x86_64 ABI][11]。
现在我们可以编写一堆函数来和寄存器交互。我们想要读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始:
现在我们可以编写一堆函数来和寄存器交互。我们希望可以读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始:
```
uint64_t get_register_value(pid_t pid, reg r) {
@ -101,7 +87,7 @@ uint64_t get_register_value(pid_t pid, reg r) {
`ptrace` 使得我们可以轻易获得我们想要的数据。我们只需要构造一个 `user_regs_struct` 实例并把它和 `PTRACE_GETREGS` 请求传递给 `ptrace`
现在取决于被请求的寄存器,我们想要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct`。[1][9]
现在根据要请求的寄存器,我们要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct` 就行。(你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。)
```
auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors),
@ -110,9 +96,9 @@ uint64_t get_register_value(pid_t pid, reg r) {
return *(reinterpret_cast<uint64_t*>(&regs) + (it - begin(g_register_descriptors)));
```
`uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是未定义的行为undefined behavior。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。
`uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是<ruby>未定义的行为<rt>undefined behavior</rt></ruby>。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。
`set_register_value` 非常类似,我们只是写入到地址并在最后写回寄存器:
`set_register_value` 非常类似,我们只是写入该位置并在最后写回寄存器:
```
void set_register_value(pid_t pid, reg r, uint64_t value) {
@ -167,11 +153,9 @@ void debugger::dump_registers() {
}
```
正如你看到的iostreams 有非常精确的接口用于美观地输出十六进制数据[2][10]。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。
正如你看到的iostreams 有非常精确的接口用于美观地输出十六进制数据(啊哈哈哈哈哈哈)。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。
这些已经足够支持我们在调试器接下来的部分轻松地处理寄存器,因为我们现在可以把这些添加到我们的用户界面。
* * *
这些已经足够支持我们在调试器接下来的部分轻松地处理寄存器,所以我们现在可以把这些添加到我们的用户界面。
### 显示我们的寄存器
@ -192,11 +176,10 @@ void debugger::dump_registers() {
}
```
* * *
### 接下来做什么?
设置断点的时候我们已经读取和写入内存,因此我们只需要添加一些函数用于隐藏 `ptrace`调用。
设置断点的时候我们已经读取和写入内存,因此我们只需要添加一些函数用于隐藏 `ptrace` 调用。
```
uint64_t debugger::read_memory(uint64_t address) {
@ -226,13 +209,11 @@ void debugger::write_memory(uint64_t address, uint64_t value) {
}
```
* * *
### 给  `continue_execution` 打补丁
在我们测试我们的更改之前,我们现在可以实现一个更健全的 `continue_execution` 版本。由于我们可以获取程序计数器,我们可以检查我们的断点映射来判断我们是否处于一个断点。如果是的话,我们可以停用断点并在继续之前跳过它。
为了清晰和简洁,首先我们要添加一些帮助函数:
为了清晰和简洁起见,首先我们要添加一些帮助函数:
```
uint64_t debugger::get_pc() {
@ -289,11 +270,9 @@ void debugger::continue_execution() {
}
```
* * *
### 测试效果
现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 call 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 call 参数设置代码的地址写入程序计数器(`rip`) 并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出:
现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 `call` 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 `call` 参数设置代码的地址写入程序计数器(`rip`并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出:
```
@ -309,33 +288,27 @@ void debugger::continue_execution() {
```
你要将程序计数器移回 `0x40093a` 使得正确设置 `esi` and `edi` 寄存器。
你要将程序计数器移回 `0x40093a` 以便正确设置 `esi` 和 `edi` 寄存器。
在下一篇博客中,我们会第一次接触到 DWARF 信息并给我们的调试器添加一系列逐步调试的功能。之后,我们会有一个功能工具,它能逐步执行代码、在想要的地方设置断点、修改数据以及其它。一如以往,如果你有任何问题请留下你的评论!
你可以在[这里][13]找到这篇博文的代码。
* * *
1. 你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。 [↩][1]
2. Ahahahahahahahahahahahahahahahaha [↩][2]
--------------------------------------------------------------------------------
via: https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/
作者:[ TartanLlama ][a]
作者:[Simon Brand][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[校对者ID](https://github.com/校对者ID)
校对:[jasminepeng](https://github.com/jasminepeng)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.twitter.com/TartanLlama
[1]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:2
[2]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:1
[3]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/
[4]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/
[3]:https://linux.cn/article-8626-1.html
[4]:https://linux.cn/article-8645-1.html
[5]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/
[6]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/
[7]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/

View File

@ -0,0 +1,57 @@
为什么可以在任何地方工作的开发者们要聚集到世界上最昂贵的城市?
============================================================
![](https://tctechcrunch2011.files.wordpress.com/2017/04/img_20170401_1835042.jpg?w=977)
政治家和经济学家都在[哀嚎][10]某几个阿尔法地区——旧金山、洛杉矶、纽约、波士顿、多伦多、伦敦、巴黎——在吸引了所有最好的工作的同时变得令人却步的昂贵,降低了经济流动性而增大了贫富差异。为什么那些最好的工作不能搬到其它地区呢?
当然,很多工作都不能搬走。工作在纽约或者伦敦(当然,在英国脱欧毁灭伦敦的银行体系之前)普通的金融从业人员如果告诉他们的老板他们想要以后在清迈工作,将会在办公室里受到嘲笑而且不再受欢迎。
但是这对(大部分)软件领域不适用。大部分 web/app 开发者如果这样要求的话可能会被拒绝;但是它们至少不会被嘲笑或者被炒。优秀开发者往往供不应求,而且我们处在 Skype 和 Slack 的时代,软件开发完全可以不依赖物质世界的交互。
(这一切对作家来说更加正确,真的;事实上我是在波纳佩发表的这篇文章。但是作家并不像软件开发者一样具有足够的影响力。)
有些人会告诉你远程协助的团队天生比本地团队效率和生产力低下一些,或者那些“不经意的灵感碰撞”是如此重要以致于每一位员工每天都必须强制到一个地方来人为的制造这样的碰撞。这些人错了,有这种问题的团队只是讨论次数不够多——数量级不过几次、十几次或者几十次,而不是成百上千——也不够专注。
我知道:在 [HappyFunCorp][11] 时,我们广泛的与远程团队工作,而且长期雇佣远程开发者,而结果难以置信的好。我在我旧金山的家中与斯德哥尔摩、圣保罗、上海、布鲁克林、新德里的开发者交流和合作的一天,完全没有任何不寻常。
在这一点上,不管它是不是个好主意,但我有点跑题了。供求关系指出那些拥有足够技能的开发者可以成为被称为“数字流浪者”的人,如果他们愿意的话。但是许多可以做到的人却不愿意。最近,我在雷克雅维克的一栋通过 Airbnb 共享的房子和一伙不断变化的临时远程工作团队度过了一段时间,我按照东海岸的时间来跟上他们的工作,也把早上和周末的时光都花费在探索冰岛了——但是最后几乎所有人都回到了湾区生活。
从经济层面来说,当然,这太疯狂了。搬到东南亚工作光在房租一项上每月就会为我们省下几千美金。 为什么那些可以在哥斯达黎加挣着旧金山的工资,或者在柏林赚着纽约水平薪资的人们,选择不这样做?为什么那些据说冷静固执的工程师在财政方面如此荒谬?
当然这里有社交和文化原因。清迈很不错,但没有大都会博物馆或者蒸汽朋克化装舞会,也没有 15 分钟脚程可以到的 50 家美食餐厅。柏林也很可爱,但没法提供风筝冲浪或者山脉远足和加州气候。当然也无法保证拥有无数和你一样分享同样价值观和母语的人们。
但是我觉得原因除了这些还有很多。我相信相比贫富之间的差异还有一个更基础的经济分水岭存在。我认为我们在目睹世界上可以实现超凡成就的“极端斯坦Extremistan”城市和无法成就伟大但可以工作和赚钱的“平均斯坦Mediocristan”城市之间正在生成巨大的裂缝。这些名词是从伟大的纳西姆·塔勒布那里偷来的
LCTT 译者注:[平均斯坦与极端斯坦的概念是美国学者纳西姆·塔勒布首先提出来的。他发现在我们所处的世界上,有些事物表现出相当的平均性,大部分个体都靠近均值,离均值越远则个体数量越稀少,与均值的偏离达到一定程度的个体数量将趋近于零。有些事物则表现出相当的极端性,均值这个概念在这个领域没有太多的意义,剧烈偏离均值的个体大量存在,而且偏离程度大得惊人。他把前者称为平均斯坦,把后者称为极端斯坦。][15]
艺术行业有着悠久历史的“极端斯坦”城市。这也解释了为什么有抱负的作家纷纷搬到纽约城,而那些已经在国际上大获成功的导演和演员仍然在不断被吸引到洛杉矶,如同飞蛾扑火。现在,这对技术行业同样适用。即使你不曾想试着(帮助)构造一些非凡的事物 —— 如今创业神话如此恢弘,很难想象有工程师完全没有梦想过它 —— _伟大事物发生的地方_正在以美好的前景如梦如幻的吸引着人们。
但是关于这一切有趣的是,理论上讲,它会改变;因为 —— 直到最近 —— 分布式的、分散管理的团队实际上可以获得超凡的成就。 情况对这些团队很不利因为风投的目光趋于短浅。但是没有任何法律指出独角兽公司只能诞生在加州和某些屈指可数的次级地域上而且似乎不管结果好坏极端斯坦正在扩散。如果这样的扩散最终可以矛盾地导致米申地区的房租变_便宜_那就太棒了
--------------------------------------------------------------------------------
via: https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
作者:[Jon Evans][a]
译者:[xiaow6](https://github.com/xiaow6)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://techcrunch.com/author/jon-evans/
[1]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#comments
[2]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#
[3]:http://twitter.com/share?via=techcrunch&amp;url=http://tcrn.ch/2owXJ0C&amp;text=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&amp;hashtags=
[4]:https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3A%2F%2Ftechcrunch.com%2F2017%2F04%2F02%2Fwhy-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities%2F&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F
[5]:https://plus.google.com/share?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[6]:http://www.reddit.com/submit?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F
[7]:http://www.stumbleupon.com/badge/?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[8]:mailto:?subject=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities?&amp;body=Article:%20https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[9]:https://share.flipboard.com/bookmarklet/popout?v=2&amp;title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&amp;url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/
[10]:https://mobile.twitter.com/Noahpinion/status/846054187288866
[11]:http://happyfuncorp.com/
[12]:https://twitter.com/rezendi
[13]:https://techcrunch.com/author/jon-evans/
[14]:https://techcrunch.com/2017/04/01/discussing-the-limits-of-artificial-intelligence/
[15]:http://blog.sina.com.cn/s/blog_5ba3d8610100q3b1.html

View File

@ -0,0 +1,118 @@
如何开始学习编程?
======================================================
> 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。
![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself")
最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。
但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。
### 你的学习方式是什么?
在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24]gnothi seauton意思是“认识你自己”。投入到一个大型的编程学习过程中难度不小。足够的自我认识是非常有必要的这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题
* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。
* **你的需要和要求是什么?**你为什么想学习如何编程是因为你只是想换一份工作吗如果是这样的话你需要多次时间才能完成呢你要牢记这些是_需要的_ 不是_想要的_ 。你可能_想要_下周就换份新工作但是_需要_在接下来的一年里供养你正在成长的家庭。当你在人生的道路上面临方向的抉择时时间的安排特别重要。
* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个可以提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。
### 选择一门编程语言
当你打算开始你的编程学习之路和考虑你的选择的时候请记住不管其他人说什么选择哪门编程语言来开始你的编程学习_关系不大_。是的是有些编程语言比其他的更流行。比如根据一份调查研究目前 JavaScriptJavaPHP 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,它们的底层原理基本是一致的。只有语法和社区的最佳实践会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。
### 试水
除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是下水之前先用脚趾头来试试水温之类的来判断这水适不适合。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。 
谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,另外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。
### 参考的学习资料
你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。
* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K 或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,在学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少——通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其它的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。
* **社区学院/职业培训中心**:社区学院常常被那些调研自己学习编程的方式的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。
* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了 [Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。
* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux 基金会][9]致力于通过开源技术使人们获得成功。其他的像 [O'Reilly Media][10]、[Lynda.com][11] 和 [Coursera][12] 在软件开发涉及的许多方面提供培训。[Codecademy][13] 提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。
* **MOOC**:在过去的几年里,大规模开放在线课程的发展势头已经很好了。像 [哈佛][14]、[斯坦福][15]、[MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。
* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过像 [Safari][17] 和 [Amazon][18] 这样的在线服务订购和访问图书,但是也不要忘了检查你本地的公共图书馆。
### 网络支持
无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个放心的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区经常举行会议和黑客马拉松活动,这是在你学习的时候结识并建立一个支持网络的很好的方式。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的 [PyCon][32] 会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如 [BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。
你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员社区所支持的聚会和用户组的地区,那么这一点特别有用。
### 开始学习编程的几个步骤
简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会:
1. 将你的需要/需求和参考学习资料列出清单并进行收集
2. 搜寻在你的当地那里能够可用的选择
3. 放弃不能符合你的需求和参考学习资料的选择
4. 选择最符合你需求的和最适合你的学习参考资源
5. 找到一个能够得到支持的网络
务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。
祝你好运!
(题图 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品
--------------------------------------------------------------------------------
作者简介:
VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com推特是 @vmbrasseur。 
--------
via: https://opensource.com/article/17/4/how-get-started-learning-program
作者:[VM (Vicky) Brasseur][a]
译者:[WangYueScream](https://github.com/WangYueScream)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/vmbrasseur
[1]:https://opensource.com/tags/python?src=programming_resource_menu
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu
[3]:https://opensource.com/tags/perl?src=programming_resource_menu
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu
[5]:https://www.appacademy.io/
[6]:https://www.bloc.io/
[7]:http://codeoregon.org/
[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start
[9]:https://training.linuxfoundation.org/
[10]:http://shop.oreilly.com/category/learning-path.do
[11]:https://www.lynda.com/
[12]:https://www.coursera.org/
[13]:https://www.codecademy.com/
[14]:https://www.edx.org/school/harvardx
[15]:http://online.stanford.edu/courses
[16]:https://ocw.mit.edu/index.htm
[17]:https://www.safaribooksonline.com/
[18]:https://amazon.com/
[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M
[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg
[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/
[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25
[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction
[24]:https://en.wikipedia.org/wiki/Know_thyself
[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies
[26]:https://learn.perl.org/tutorials/
[27]:http://shop.oreilly.com/product/0636920045946.do
[28]:https://doc.rust-lang.org/book/
[29]:https://www.meetup.com/
[30]:https://www.womenwhocode.com/
[31]:http://www.code2040.org/
[32]:https://us.pycon.org/
[33]:http://pybee.org/
[34]:https://opensource.com/user/10683/feed
[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments
[36]:https://opensource.com/users/vmbrasseur

View File

@ -0,0 +1,358 @@
Samba 系列(十一):如何配置并集成 iRedMail 服务到 Samba4 AD DC 中
=========================================================
在本教程中,将学习如何修改提供邮件服务的 iRedMail 主要守护进程,相应地,[Postfix 用于邮件传输Dovecot 将邮件传送到帐户邮箱][4],以便将它们集成到 [Samba4 AD 域控制器][5]中。
将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:通过 Samba AD DC 得到用户身份验证、管理和状态,在 AD 组和 Roundcube 中的全局 LDAP 地址簿的帮助下创建邮件列表。
### 要求
1. [在 CentOS 7 中为 Samba4 AD 集成安装 iRedMail][1]
### 第一步:准备 iRedMail 系统用于 Samba4 AD 集成
1、 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。
运行 [ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。
root 权限运行 nmtui-edit 命令。
```
# ifconfig
# nmtui-edit eno16777736
```
[![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9]
*找出网络接口名*
2、 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。
[![Configure Network Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png)][10]
*配置网络设置*
3、 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。
```
# systemctl restart network.service
# cat /etc/resolv.conf # 验证 DNS 解析器配置是否对域解析使用了正确的 DNS 服务器 IP
# ping -c2 tecmint.lan # ping 域名
# ping -c2 adc1 # ping 第一个 AD DC
# ping -c2 adc2 # Ping 第二个 AD DC
```
[![Verify Network DNS Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png)][11]
*验证网络 DNS 配置*
4、 接下来,用下面的命令安装 `ntpdate` 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器:
```
# yum install ntpdate
# ntpdate -qu tecmint.lan # querry domain NTP servers
# ntpdate tecmint.lan # Sync time with the domain
```
[![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12]
*与 Samba NTP 服务器同步时间*
5、 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。
```
0 */1 * * * /usr/sbin/ntpdate tecmint.lan > /var/log/ntpdate.lan 2>&1
```
[![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14]
*自动与 Samba NTP 同步时间*
### 第二步:为 iRedMail 集成准备 Samba4 AD DC
6、 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。
打开 DNS 管理器,转到你的域转发查找区并添加新的 A 记录、MX记录还有 PTR 记录指向你的 iRedMail 系统的 IP 地址。使用以下截图作为指导。
添加一条 A 记录(相应地用 iRedMail 机器的名字和 IP 替换)。
[![Create DNS A Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png)][17]
*为 iRedMail 创建 DNS A 记录*
添加 MX 记录(将子域留空,优先级为 10
[![Create DNS MX Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png)][18]
*为 iRedMail 创建 DNS MX 记录*
在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程:[从 Windows 管理 Samba4 DNS 组策略][2]
[![Create DNS PTR Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png)][19]
*为 iRedMail 创建 DNS PTR 记录*
7、添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。
Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。
```
# yum install bind-utils
# host tecmint.lan
# host mail.tecmint.lan
# host 192.168.1.245
```
[![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20]
*安装 Bind 并查询邮件记录*
在一台 Windows 机器上,打开命令行窗口并使用 [nslookup 命令][21]查询上面的邮件服务器记录。
8、 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。
vmail 帐户将被 iRedMail 服务用来查询 Samba4 AD DC LDAP 数据库并拉取电子邮件帐户。
要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 [samba-tool 命令行][3]直接在域控制器中运行。
在本指导中,我们会使用上面提到的第一种方法。
[![Active Directory Users and Computers](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png)][22]
*AD 用户和计算机*
[![Create New User for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png)][23]
*为 iRedMail 创建新的用户*
[![Set Strong Password for User](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png)][24]
*为用户设置强密码*
9、 在 iRedMail 系统中,用下面的命令测试 vmail 用户能够查询 Samba4 AD DC LDAP 数据库。返回的结果应该是你的域的对象总数, 如下截图所示。
```
# ldapsearch -x -h tecmint.lan -D 'vmail@tecmint.lan' -W -b 'cn=users,dc=tecmint,dc=lan'
```
注意:相应地替换域名以及 Samba4 AD 的 LDAP dn `cn=users,dc=tecmint,dc=lan`)。
[![Query Samba4 AD DC LDAP](https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png)][25]
*查询 Samba4 AD DC LDAP*
### 第三步:将 iRedMail 服务集成到 Samba4 AD DC 中
10、 现在是时候修改 iRedMail 服务Postfix、Dovecot 和 Roundcube以便为邮箱帐户查询 Samba4 域控制器。
第一个要修改的服务是 MTA 代理Postfix。执行以下命令禁用一系列的 MTA 设置,添加你的域名到 Postfix 本地域以及邮箱域中,并使用 Dovecot 代理发送已接收的邮件到用户邮箱中。
```
# postconf -e virtual_alias_maps=' '
# postconf -e sender_bcc_maps=' '
# postconf -e recipient_bcc_maps= ' '
# postconf -e relay_domains=' '
# postconf -e relay_recipient_maps=' '
# postconf -e sender_dependent_relayhost_maps=' '
# postconf -e smtpd_sasl_local_domain='tecmint.lan' #用你自己的域替换
# postconf -e virtual_mailbox_domains='tecmint.lan' #用你自己的域替换
# postconf -e transport_maps='hash:/etc/postfix/transport'
# postconf -e smtpd_sender_login_maps='proxy:ldap:/etc/postfix/ad_sender_login_maps.cf' # 检查 SMTP 发送者
# postconf -e virtual_mailbox_maps='proxy:ldap:/etc/postfix/ad_virtual_mailbox_maps.cf' # 检查本地邮件帐户
# postconf -e virtual_alias_maps='proxy:ldap:/etc/postfix/ad_virtual_group_maps.cf' # 检查本地邮件列表
# cp /etc/postfix/transport /etc/postfix/transport.backup # 备份 transport 配置
# echo "tecmint.lan dovecot" > /etc/postfix/transport # 添加带 dovecot transport 的域
# cat /etc/postfix/transport # 验证 transport 文件
# postmap hash:/etc/postfix/transport
```
11、 接下来,用你最喜欢的文本编辑器创建 Postfix `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。
```
server_host = tecmint.lan
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = vmail@tecmint.lan
bind_pw = ad_vmail_account_password
search_base = dc=tecmint,dc=lan
scope = sub
query_filter = (&(userPrincipalName=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute= userPrincipalName
debuglevel = 0
```
12、 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`
```
server_host = tecmint.lan
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = vmail@tecmint.lan
bind_pw = ad_vmail_account_password
search_base = dc=tecmint,dc=lan
scope = sub
query_filter = (&(objectclass=person)(userPrincipalName=%s))
result_attribute= userPrincipalName
result_format = %d/%u/Maildir/
debuglevel = 0
```
13、 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`
```
server_host = tecmint.lan
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = vmail@tecmint.lan
bind_pw = ad_vmail_account_password
search_base = dc=tecmint,dc=lan
scope = sub
query_filter = (&(objectClass=group)(mail=%s))
special_result_attribute = member
leaf_result_attribute = mail
result_attribute= userPrincipalName
debuglevel = 0
```
替换上面三个配置文件中的 `server_host`、`bind_dn`、`bind_pw` 和 `search_base` 以反应你自己域的设置。
14、 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#` 注释,搜索并禁用 iRedAPD 的 `check_policy_service``smtpd_end_of_data_restrictions`
```
# nano /etc/postfix/main.cf
```
注释下面的行:
```
#check_policy_service inet:127.0.0.1:7777
#smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777
```
15、 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD如以下示例所示。
结果应与下面的截图类似。
```
# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_virtual_mailbox_maps.cf
# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_sender_login_maps.cf
# postmap -q linux_users@tecmint.lan ldap:/etc/postfix/ad_virtual_group_maps.cf
```
[![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26]
*验证 Postfix 绑定到了 Samba AD*
相应替换 AD 用户及组帐户。同样,确保你使用的 AD 组已被分配了一些成员。
16、 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。
```
hosts = tecmint.lan:389
ldap_version = 3
auth_bind = yes
dn = vmail@tecmint.lan
dnpass = ad_vmail_password
base = dc=tecmint,dc=lan
scope = subtree
deref = never
user_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_attrs = userPassword=password
default_pass_scheme = CRYPT
user_attrs = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/
```
Samba4 AD 帐户的邮箱将会存储在 `/var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/` 中。
17、 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 `quota``acl` 邮件插件,并检查这些值是否存在。
[![Enable Pop3 and Imap in Dovecot](https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png)][27]
*在 Dovecot 中启用 POP3 和 IMAP*
18、 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 `/etc/dovecot/dovecot.conf` 文件中添加以下行。
```
quota_rule = *:storage=500M
```
19、 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。
```
# systemctl restart postfix dovecot
# systemctl status postfix dovecot
```
20、 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或 [netcat 命令][28],如下所示。
```
# nc localhost 143
a1 LOGIN ad_user@your_domain.tld ad_user_password
a2 LIST “” “*”
a3 LOGOUT
```
[![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29]
*测试 iRedMail 配置*
如果你可以使用 Samba4 用户帐户从命令行执行 IMAP 登录,那么 iRedMail 服务器似乎已经准备好发送和接收 AD 帐户的邮件。
在下一个教程中将讨论如何将 Roundcube webmail 与 Samba4 AD DC 集成,并启用全局 LDAP 地址簿,自定义 Roudcube从浏览器访问 Roundcube Web 界面,并禁用某些不需要的 iRedMail 服务。
--------------------------------------------------------------------------------
作者简介:
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
-----
via: https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/
作者:[Matei Cezar][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/cezarmatei/
[1]:https://linux.cn/article-8567-1.html
[2]:https://linux.cn/article-8258-1.html
[3]:https://linux.cn/article-8070-1.html
[4]:https://www.tecmint.com/setup-postfix-mail-server-and-dovecot-with-mariadb-in-centos/
[5]:https://linux.cn/article-8065-1.html
[6]:https://linux.cn/article-3977-1.html
[7]:https://www.tecmint.com/ifconfig-command-examples/
[8]:https://linux.cn/article-5410-1.html
[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png
[13]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png
[15]:https://linux.cn/article-8097-1.html
[16]:https://linux.cn/article-8097-1.html
[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png
[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png
[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png
[20]:https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png
[21]:https://www.tecmint.com/8-linux-nslookup-commands-to-troubleshoot-dns-domain-name-server/
[22]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png
[23]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png
[24]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png
[25]:https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png
[26]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png
[27]:https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png
[28]:https://www.tecmint.com/check-remote-port-in-linux/
[29]:https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png
[30]:https://www.tecmint.com/author/cezarmatei/
[31]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[32]:https://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -0,0 +1,277 @@
Samba 系列(十二):如何在 Samba4 AD 中集成 iRedMail Roundcube
============================================================
[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面它可以与所有邮件服务进行交互以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议包括安全的邮件协议如IMAPS、POP3S 或者 submission。
在本文中,我们将讨论如何在 iRedMail 中使用 IMAPS 以及 submission 安全端口配置 Roundcube以检索和发送 Samba4 AD 帐户的电子邮件、如何从浏览器访问 iRedMail Roundcube Web 界面,并添加网址别名、如何启用 Samba4 AD 集成全局 LDAP 地址簿以及如何禁用某些不需要的 iRedMail 服务。
### 要求
1. [如何在 CentOS 7 上安装 iRedMail用于Samba4 AD集成][1]
2. [在 CentOS 7 上配置 iRedMail用于 Samba4 AD 集成][2]
### 第一步:在 Samba4 AD DC 中声明域帐户的电子邮件地址
1、 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。
[![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5]
*添加邮箱帐户来加入 Samba4 AD DC*
2、 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。
这步创建了一个邮件列表,所有 Samba4 AD 组成员的邮箱都会收到给这个 AD 组邮箱地址的邮件。使用下面的截图作为指导为 Samba4 组声明电子邮件字段,并为组添加域成员。
确保所有的域账户成员都添加到了声明了邮件地址的组中。
[![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6]
*为 Samba4 AD DC 创建组管理员*
[![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7]
*将用户添加到组*
在本例中,发送给 admins@tecmint.lan 的所有邮件地址将被该组的每个成员邮箱接收,它是 “Domain Admins” 组声明的电子邮件地址。
3、 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。
使用下面其中一个命令创建一个指定邮件地址的用户:
```
# samba-tool user add --mail-address=user_email@domain.tld --surname=your_surname --given-name=your_given_name your_ad_user
```
创建一个指定邮件地址的组:
```
# samba-tool group add --mail-address=group_email@domain.tld your_ad_group
```
将成员添加到组中:
```
# samba-tool group addmembers your_group user1,user2,userX
```
使用下面的语法列出 samba-tool 中有关用户或者组的命令字段:
```
# samba-tool user add -h
# samba-tool group add -h
```
### 第二步:安全 Roundcube Webmail
4、 开始修改 Roundcube 配置文件之前,首先使用 [netstat 命令][8]管道输出给 egrep 过滤器来列出 [Dovecot 和 Postfix][9] 监听的套接字并确保安全端口IMAPS 是 993submission 是 587 )是活跃的并且已启用。
```
# netstat -tulpn| egrep 'dovecot|master'
```
5、 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 `/var/www/roundcubemail/config/config.inc.php` 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 `localhost`,如下片段所示:
```
// For IMAPS
$config['default_host'] = 'ssl://127.0.0.1';
$config['default_port'] = 993;
$config['imap_auth_type'] = 'LOGIN';
// For SMTP
$config['smtp_server'] = 'tls://127.0.0.1';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['smtp_auth_type'] = 'LOGIN';
```
这步强烈建议在远程主机中安装 Roudcube而不是提供了邮件服务的主机中IMAP、POP3 或者 SMTP 守护进程)。
6、 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。
```
$config['force_https'] = true;
$config['useragent'] = 'Your Webmail'; // Hide version number
$config['username_domain'] = 'domain.tld'
```
7、 同样禁用下面的插件managesieve 和 password通过在以 `$config[plugins]` 开头的行前添加注释 `//`
一旦登录并验证了域,用户将从连接到 Samba4 AD DC 的 Windows 或 Linux 机器上更改密码。系统管理员将全局管理域帐户的所有筛选规则。
```
// $config['plugins'] = array('managesieve', 'password');
```
8、 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。
由于浏览器使用的是自签名证书,所以你首次访问 Roundcube 会在浏览器上看到一个警告。接受证书并用 Samba AD 帐户凭证登录。
```
https://iredmail-FQDN/mail
```
[![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10]
*Roundcube Webmail 登录*
### 第三步:在 Roundcube 中启用 Samba AD 联系人
9、 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改:
到达文件的底部,并辨认以 `# Global LDAP Address Book with AD` 开头的部分,删除到文件底部的所有内容,并替换成如下代码段:
```
# Global LDAP Address Book with AD.
#
$config['ldap_public']["global_ldap_abook"] = array(
'name' => 'tecmint.lan',
'hosts' => array("tecmint.lan"),
'port' => 389,
'use_tls' => false,
'ldap_version' => '3',
'network_timeout' => 10,
'user_specific' => false,
'base_dn' => "dc=tecmint,dc=lan",
'bind_dn' => "vmail@tecmint.lan",
'bind_pass' => "your_password",
'writable' => false,
'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'),
'fieldmap' => array(
'name' => 'cn',
'surname' => 'sn',
'firstname' => 'givenName',
'title' => 'title',
'email' => 'mail:*',
'phone:work' => 'telephoneNumber',
'phone:mobile' => 'mobile',
'department' => 'departmentNumber',
'notes' => 'description',
),
'sort' => 'cn',
'scope' => 'sub',
'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))',
'fuzzy_search' => true,
'vlv' => false,
'sizelimit' => '0',
'timelimit' => '0',
'referrals' => false,
);
```
在这段代码中替换相应的 `name`、`hosts`、`base_dn`、`bind_dn` 和 `bind_pass` 的值。
10、 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。
所有域名帐户(用户和组)与其指定的电子邮件地址的联系人列表都将被显示在全局地址簿上。
[![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11]
*Roundcube 用户联系人列表*
### 第四步:为 Roundcube Webmail 界面添加一个别名
11、 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。
在已安装 RSAT 工具的已加入的 Windows 机器上打开 DNS 管理器,并如下所示,添加一条 iRedMail FQDN、named webmail 的 CNAME 记录。
[![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12]
*DNS Webmail 属性*
12、 接下来,在 iRedMail 机器中,打开位于 `/etc/httpd/conf.d/ssl.conf` 的 Apache Web 服务器的 SSL 配置文件,将 `DocumentRoot` 指向 `/var/www/roundcubemail/`
修改 `/etc/httpd/conf.d/ssl.conf` 片段:
```
DocumentRoot “/var/www/roundcubemail/”
```
重启 Apache 使更改生效。
```
# systemctl restart httpd
```
13、 现在打开下面的地址Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。
```
https://webmail.domain.tld
```
### 第五步:禁用 iRedMail 未使用的服务
14、 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。
```
# systemctl stop slapd iredpad
# systemctl disable slapd iredpad
```
15、 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释 `#`,禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。
```
# crontab -e
```
[![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13]
*禁用 iRedMail 任务*
### 第六步:在 Postfix 中使用邮件别名
16、 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 `/etc/postfix/aliases` 中的 Postfix 别名配置文件,并修改 `root` 行,如下所示:
```
root: your_AD_email_account@domain.tld
```
17、 应用别名配置文件,以便 Postfix 可以通过执行 `newaliases` 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。
```
# echo “Test mail” | mail -s “This is roots email” root
```
18、 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail并验证先前发送的邮件应该在你的帐户收件箱中。
[![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14]
*验证用户邮件*
就是这样了!现在你已经有了一个完全工作的与 Samba4 AD 集成的邮件服务器了。域帐户可以用它们的内部或者其他外部域发送和接收邮件了。
本教程中使用的配置可以成功将 iRedMail 服务器集成到 Windows Server 2012 R2 或 2016 AD 中。
--------------------------------------------------------------------------------
作者简介:
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
-----------
via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/
作者:[Matei Cezar][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/cezarmatei/
[1]:https://linux.cn/article-8567-1.html
[2]:https://linux.cn/article-8673-1.html
[3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/
[4]:https://linux.cn/article-8097-1.html
[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg
[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png
[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png
[8]:https://www.tecmint.com/20-netstat-commands-for-linux-network-management/
[9]:https://www.tecmint.com/configure-postfix-and-dovecot-with-virtual-domain-users-in-linux/
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg
[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png
[15]:https://www.tecmint.com/author/cezarmatei/
[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[17]:https://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -0,0 +1,177 @@
Samba 系列(十三):如何在 Samba4 AD 中使用 iRedMail 配置 Thunderbird
============================================================
本教程将指导你如何使用 iRedMail 服务器配置 Mozilla Thunderbird 客户端,以便通过 IMAPS 和 SMTP 提交协议发送和接收邮件,如何使用 Samba AD LDAP 服务器设置联系人数据库以及如何配置其他相关的邮件功能,例如通过 LDAP 数据库离线副本启用 Thunderbird 联系人。
安装和配置 Mozilla Thunderbird 客户端的过程适用于安装在 Windows 或 Linux 操作系统上的 Thunderbird 客户端。
#### 要求
1. [如何在 CentOS 7 上安装 iRedMail 集成到 Samba4 AD][0]
2. [如何配置和集成 iRedMail 服务到 Samba4 AD DC][1]
3. [将 iRedMail Roundcube 与 Samba4 AD DC 集成][2]
### 第一步:为 iRedMail 服务器配置 Thunderbird
1、 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。
[![Thunderbird System Integration](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png)][3]
*Thunderbird 系统集成*
2、 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。
在 Thunderbird 客户端尝试识别由 iRedMail 服务器提供的正确的IMAP设置后点击手动配置按钮手动设置 Thunderbird。
[![Thunderbird Mail Account Setup](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png)][4]
*Thunderbird 邮箱帐户设置*
3、 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置为邮件服务添加安全端口IMAPS 为 993发送为 587为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。
[![Thunderbird iRedMail Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png)][5]
*Thunderbird iRedMail 设置*
4、 由于你的 iRedMail 服务器使用自签名证书屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常Thunderbird 客户端应该就被成功配置了。
[![Thunderbird Security Exception](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png)][6]
*Thunderbird 安全异常*
你会看到你的域帐号的所有已收文件,并且你能够从你的域或者其他域发送或者接收文件。
[![Domain Mails Inbox](https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png)][7]
*域邮箱收件箱*
### 第二步:使用 Samba AD LDAP 设置 Thunderbird 联系人数据库
5、 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories”
[![Thunderbird Samba AD LDAP Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png)][8]
*Thunderbird Samba AD LDAP 设置*
[![Thunderbird Composition & Addressing Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png)][9]
*Thunderbird Composition & Addressing 设置*
6、 LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中:
在 “常规” 选项卡上添加此对象的描述性名称,添加你的域的名称或 Samba 域控制器的 FQDN你的域的基本 DN 形式是 “dc=你的域,dc=tld”LDAP 端口号 389vmail 绑定 DN 帐户用于以 vmail@your_domain.tld 的形式查询 Samba AD LDAP 数据库。
使用下面的截图作为指导:
[![Directory Server Properties](https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png)][10]
*目录服务器属性*
7、 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容:
```
(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))
```
[![Add Search Filter](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png)][11]
*添加搜索过滤*
让其他的设置保持默认,并点击 OK 按钮来应用更改,再次点击 OK 按钮关闭 LDAP 目录服务器窗口,在账户设置界面点击 OK 关闭窗口。
[![Select LDAP Directory Server](https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png)][12]
*选择 LDAP 目录服务器*
8、 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。
添加绑定 DN 帐户密码来查询 AD LDAP 服务器,勾选使用密码管理器记住密码,然后点击确定按钮保存更改并关闭窗口。
[![Thunderbird Samba AD LDAP Testing](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png)][13]
*Thunderbird Samba AD LDAP 测试*
9、 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。
[![Search Samba AD Mail Contacts](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png)][14]
*搜索 Samba AD 邮件联系人*
10、 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。
[![Search Mail Contacts in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png)][15]
*在 Thunderbird 中搜索联系人*
11、 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。
[![Send Mail in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg)][16]
*在 Thunderbird 发送邮件*
12、 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU如下所示。
```
ou=your_specific_ou,dc=your_domain,dc=tld
```
[![Search Contacts in Samba LDAP Database](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png)][17]
*Samba LDAP 数据库中搜索联系人*
### 第三步:设置 LDAP 离线副本
13、 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。
接着切换到离线选项卡并点击“现在下载”按钮开始在本地复制 Samba AD LDAP 数据库。
[![Setup LDAP Offline Replica in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png)][18]
*在 Thunderbird 设置 LDAP 离线副本*
[![Download LDAP Database for Offline](https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png)][19]
*为离线下载 LDAP 数据库*
当同步联系人完成后,你将收到消息复制成功通知。点击 OK 并关闭所有窗口。在无法访问 Samba 域控制器的情况下,你仍然可以通过离线方式进行搜索。
--------------------------------------------------------------------------------
作者简介:
我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。
--------------
via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/
作者:[Matei Cezar][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/cezarmatei/
[0]:https://linux.cn/article-8567-1.html
[1]:https://linux.cn/article-8673-1.html
[2]:https://linux.cn/article-8678-1.html
[3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png
[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png
[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png
[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png
[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png
[8]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png
[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png
[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png
[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png
[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png
[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png
[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png
[15]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png
[16]:https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg
[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png
[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png
[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png
[20]:https://www.tecmint.com/author/cezarmatei/
[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[22]:https://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -0,0 +1,290 @@
Linux 的 EXT4 文件系统的历史、特性以及最佳实践
============================================================
> 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的几代 EXT 文件系统有何不同。
在之前关于 Linux 文件系统的文章里,我写过一篇 [Linux 文件系统介绍][12] 和一些更高级的概念例如 [一切都是文件][13]。现在我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有特点:
1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个结构化的容器来存储和获取数据。
2. **命名空间:** 命名空间是一个提供了用于命名与组织数据的命名规则和数据结构的方法学。
3. **安全模型:** 一个用于定义访问权限的策略。
4. **API** 操作这个系统的对象的系统功能调用,这些对象诸如目录和文件。
5. **实现:** 能够实现以上几点的软件。
本文内容的讨论主要集中于上述几点中的第一项,并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。
### EXT 文件系统历史
虽然 EXT 文件系统是为 Linux 编写的,但其真正起源于 Minix 操作系统和 Minix 文件系统,而 Minix 最早发布于 1987早于 Linux 5 年。如果我们从 EXT 文件系统大家族的 Minix 起源来观察其历史与技术发展那么理解 EXT4 文件系统就会简单得多。
### Minix
当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时它也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统最初编写它的原因是用于教育用途。Minix 的代码是自由可用的并有适当的许可协议,所以 Torvalds 可以把它用 Linux 的最初版本里。
Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中:
* [**引导扇区**][6] 是硬盘安装后的第一个扇区。这个引导块包含了一个非常小的引导记录和一个分区表。
* 每一个分区的第一个块都是一个包含了元数据的**超级块superblock** ,这些元数据定义了其他的文件系统结构并将其定位于物理硬盘的具体分区上。
* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。
* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息,包括其所处的数据块的位置,也就是该文件所处的区域。
* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。
* 一个 **数据区**, 这里是数据存储的地方。
对上述了两种位图类型来说一个位bit表示一个指定的数据区或者一个指定的 inode。 如果这个位是 0 则表示这个数据区或者这个 inode 是未使用的,如果是 1 则表示正在使用中。
那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户 ID、文件模式即访问权限以及三个时间戳用于指定该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。
同时,这个 inode 还包含了位置数据,指向了其所对应的文件数据在硬盘中的位置。在 Minix 和 EXT 1-3 文件系统中这是一个数据区和块的列表。Minix 文件系统的 inode 支持 9 个数据块,包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统结构][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速了解。
### EXT
原生的 [EXT 文件系统][20] (意即扩展的extended) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 UFS其也被称为伯克利快速文件系统FFS。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被确证的,显然这是因为其存在着严重的问题,并且它很快地被 EXT2 文件系统取代了。
### EXT2
[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 5.0 时接触的第一个文件系统。实际上EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多供将来使用的磁盘空间。
和 Minix 类似EXT2 也有一个[引导扇区][23] ,它是硬盘安装后的第一个扇区。它包含了非常小的引导记录和一个分区表。接着引导扇区之后是一些保留的空间,它填充了引导记录和硬盘驱动器上的第一个分区(通常位于下一个柱面)之间的空间。[GRUB2][24] - 也可能是 GRUB1 - 将此空间用于其部分引导代码。
每个 EXT2 分区中的空间被分为柱面组cylinder group它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为 8MB。 下面的图 1 显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为 4K。
![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png)
*图 1 EXT 文件系统中的柱面组的结构*
柱面组中的第一个块是一个超级块superblock它包含了元数据定义了其它文件系统的结构并将其定位于物理硬盘的具体分区上。分区中有一些柱面组还会有备用超级块但并不是所有的柱面组都有。我们可以使用例如 `dd` 等磁盘工具来拷贝备用超级块的内容到主超级块上,以达到修复损坏的超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 `dumpe2fs` 命令来备份了我的系统上的分区描述符信息。
以下是 `dumpe2fs` 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。
```
# dumpe2fs /dev/sda1
Filesystem volume name: boot
Last mounted on: /boot
Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 122160
Block count: 488192
Reserved block count: 24409
Free blocks: 376512
Free inodes: 121690
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 238
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8144
Inode blocks per group: 509
Flex block group size: 16
Filesystem created: Tue Feb 7 09:33:34 2017
Last mount time: Sat Apr 29 21:42:01 2017
Last write time: Sat Apr 29 21:42:01 2017
Mount count: 25
Maximum mount count: -1
Last checked: Tue Feb 7 09:33:34 2017
Check interval: 0 (<none>)
Lifetime writes: 594 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60
Journal backup: inode blocks
Journal features: journal_64bit
Journal size: 32M
Journal length: 8192
Journal sequence: 0x00000213
Journal start: 0
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-239
Block bitmap at 240 (+240)
Inode bitmap at 255 (+255)
Inode table at 270-778 (+270)
24839 free blocks, 7676 free inodes, 16 directories
Free blocks: 7929-32767
Free inodes: 440, 470-8144
Group 1: (Blocks 32768-65535)
Backup superblock at 32768, Group descriptors at 32769-32769
Reserved GDT blocks at 32770-33007
Block bitmap at 241 (bg #0 + 241)
Inode bitmap at 256 (bg #0 + 256)
Inode table at 779-1287 (bg #0 + 779)
8668 free blocks, 8142 free inodes, 2 directories
Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247
Free inodes: 8147-16288
Group 2: (Blocks 65536-98303)
Block bitmap at 242 (bg #0 + 242)
Inode bitmap at 257 (bg #0 + 257)
Inode table at 1288-1796 (bg #0 + 1288)
6326 free blocks, 8144 free inodes, 0 directories
Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207
Free inodes: 16289-24432
Group 3: (Blocks 98304-131071)
<截断>
```
每一个柱面组都有自己的 inode 位图,用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了一个文件的相关信息,包括属于该文件的数据块的位置。而块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,柱面组的数据可以多达数百页的长度。柱面组的元数据包括组中所有空闲数据块的列表。
EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。
我所遇见的关于 EXT2 文件系统最大的问题是 `fsck` (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有的不一致性从而导致在系统崩溃crash后其会花费了数个小时来修复。有一次我的其中一台电脑在崩溃后重新启动时共花费了 28 个小时恢复磁盘,而且并且是在磁盘被检测量只有几百兆字节大小的情况下。
### EXT3
[EXT3 文件系统][25]是应一个目标而生的,就是克服 `fsck` 程序需要完全恢复在文件更新操作期间发生的不正确关机而损坏的磁盘结构所需的大量时间。它对 EXT 文件系统的唯一新增功能就是 [日志][26],它将提前记录将对文件系统执行的更改。 EXT3 的磁盘结构的其余部分与 EXT2 中的相同。
除了同先前的版本一样直接写入数据到磁盘的数据区域外EXT3 上的日志会将文件数据随同元数据写入到磁盘上的一个指定数据区域。一旦这些(日志)数据安全地到达硬盘,它就可以几乎零丢失率地被合并或被追加到目标文件上。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在日志中的所有数据提交之前,系统发生故障时文件系统将保持一致状态。在下次启动时,将检查文件系统的不一致性,然后将仍保留在日志中的数据提交到磁盘的数据区,以完成对目标文件的更新。
日志功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性、安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。
日志功能将失败后检查硬盘驱动器所需的时间从几小时(甚至几天)减少到了几分钟。 多年来,我遇到了很多导致我的系统崩溃的问题。要详细说的话恐怕还得再写一篇文章,但这里需要说明的是大多数是我自己造成的,就比如不小心踢掉电源插头。 幸运的是EXT 日志文件系统将启动恢复时间缩短到两三分钟。此外,自从我开始使用带日志记录的 EXT3我从来没有遇到丢失数据的问题。
EXT3 的日志功能可以关闭,然后其功能就等同于 EXT2 文件系统了。 该日志本身仍然是存在的,只是状态为空且未使用。 只需在 `mount` 命令中使用文件系统类型参数来重新挂载即可指定为 EXT2。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,不过你也可以更改 `/etc/fstab` 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3 文件系统挂载为 EXT2 ,因为这会有丢失数据和增加恢复时间的潜在可能性。
EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。
```
tune2fs -j /dev/sda1
```
`/dev/sda1` 表示驱动器和分区的标识符。同时要注意修改 `/etc/fstab` 中的文件系统类型标识符并重新挂载分区,或者重启系统以确保修改生效。
### EXT4
[EXT4 文件系统][27]主要提高了性能、可靠性和容量。为了提高可靠性,它新增了元数据和日志校验和。同时为了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳,并在时间戳字段中添加了两个高位来延缓时间戳的 [2038 年问题][28] ,这样 EXT4 文件系统至少可用到 2446 年。
在 EXT4 中数据分配从固定块改为扩展盘区extent方式扩展盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理上连续的文件,这可以显著减少描述大文件中所有数据的位置所需的指针数。其它在 EXT4 中已经实施的分配策略可以进一步减少碎片化。
EXT4 通过将新创建的文件散布在磁盘上,使其不会像早期的 PC 文件系统一样全部聚集在磁盘起始位置,从而减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地散布文件,并且当文件(由于太大)需要分段存储时,使不连续的文件扩展盘区尽可能靠近同一文件中的其他部分,以尽可能减少磁头寻道和电机旋转等待时间。当创建新文件或扩展现有文件时,使用其它策略来预先分配额外的磁盘空间。这有助于确保扩展文件时不会自动导致其分段。新文件不会紧挨这现有文件立即分配空间,这也可以防止现有文件的碎片化。
除了磁盘上数据的实际位置外EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集到所有正在写入磁盘的数据,这可以提高数据空间连续的可能性。
较旧的 EXT 文件系统(如 EXT2 和 EXT3可以作为 EXT4 进行 `mount` ,以使其性能获得较小的提升。但不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。
自 Fedora 14 以来EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [流程][29] 将 EXT3 文件系统升级到 EXT4但是由于仍然存留的之前的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 `mkfs` 命令将空 EXT4 文件系统写入分区,然后从备份中恢复所有数据。
### Inode
之前介绍过的 inode 是 EXT 文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode在这种情况下可能会产生高度碎片化。 EXT 文件系统可以主动地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘区的文件。 实际上你在下面将会看到EXT 文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,而不使用间接指针。
![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png)
*图 2 inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。*
inode 不包含文件的名称。通过目录项访问文件,目录项本身就是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其它文件系统(甚至是相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对 [硬链接][30] 存在影响,但是这个讨论超出了本文的范围。
inode 包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空位用于描述柱面组数据部分中数据块或扩展盘区的位置和长度。12 个指针提供对数据扩展盘区的直接访问应该足以满足大多数文件的需求。然而对于具有明显分段的文件需要以间接节点node的形式提供一些额外的容量——从技术上讲这些不是真正的“inode”所以为了方便起见我在这里使用这个术语“节点node”。
间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如4K 的块大小可以支持 512 个 4 字节的间接节点,允许单个文件有 **12直接+ 512间接= 524** 个扩展盘区。还支持双重和三重间接节点,但我们大多数人不太可能遇到需要那么多扩展盘区的文件。
### 数据碎片
对于许多较旧的 PC 文件系统,如 FAT及其所有变体和 NTFS碎片一直是导致磁盘性能下降的重大问题。 碎片整理本身就成为一个行业,有各种品牌的整理软件,其效果范围从非常有效到仅仅是微乎其微。
Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 `fsck` 命令检查整个文件系统的碎片。 以下示例检查我的主工作站的家目录,只有 1.5 的碎片。 确保使用 `-n` 参数,因为它会防止 `fsck` 对扫描的文件系统采取任何操作。
```
fsck -fn /dev/mapper/vg_01-home
```
我曾经进行过一些理论计算,以确定磁盘碎片整理是否会产生任何明显的性能提升。 我做了一些假设条件,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的轨到轨寻道时间。 此示例中的文件数是我在计算的当天的文件系统中存在的实际数。 我假设每天有相当大量的碎片化文件(约 20会被用到。
| **全部文件** | **271,794** |
|---|---|
| 碎片率 % | 5.00% |
| 不连续数 | 13,590 |
|   |   |
| % 每天用到的碎片化文件 | 20% (假设) |
| 额外寻道次数 | 2,718 |
| 平均寻道时间 | 10.90 ms |
| 每天全部的额外寻道时间 | 29.63 sec |
|   | 0.49 min |
|   |   |
| 轨到轨寻道时间 | 2.00 ms |
| 每天全部的额外寻道时间 | 5.44 sec |
|   | 0.091 min |
*表 1: 碎片对磁盘性能的理论影响*
我对每天的全部的额外寻道时间进行了两次计算,一次是轨到轨寻道时间,这是由于 EXT 文件分配策略而导致大多数文件最可能的情况,一个是平均寻道时间,我假设这是一个合理的最坏情况。
从表 1 可以看出,对绝大多数应用程序而言,碎片化甚至对性能适中的硬盘驱动器上的现代 EXT 文件系统的影响是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些对碎片化及其对系统的理论影响的洞察。
我的大部分分区的碎片率都在 1.5 左右或 1.6%,我有一个分区有 3.3 的碎片,但是这是一个大约 128GB 文件系统,具有不到 100 个非常大的 ISO 映像文件;多年来,我扩展过该分区几次,因为它已经太满了。
这并不是说一些应用的环境并不需要更少的碎片的环境。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以针对特定的工作负载类型调整参数。这个工作可以在文件系统创建的时候或稍后使用 `tune2fs` 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上混用文件系统类型以匹配每个文件系统上的不同负载是常见的。
由于大多数 EXT 文件系统的碎片数量较少因此无需进行碎片整理。目前EXT 文件系统没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片程度或文件系统中剩余可用空间的碎片程度。有一个工具,`e4defrag`,它可以对允许使用的剩余可用空间、目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。
如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件移动从而进行碎片整理,并在确保安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全去碎片化。
### 总结
EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和性能。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统同时我发现了它们适用于任何主流负载。毫无疑问EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显需要使用其它文件系统的理由。
--------------------------------------------------------------------------------
作者简介:
David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在北卡罗莱纳州的罗利。他从事 IT 行业有 40 余年并在 IBM 中从事 OS/2 培训约 20 余年。在 IBM 就职期间,他在 1981 年为最早的 IBM PC 写了一个培训课程。他已经为红帽教授了 RHCE 课程,曾在 MCI Worldcom思科和北卡罗来纳州工作。 他使用 Linux 和开源软件工作了近 20 年。
-------------------
via: https://opensource.com/article/17/5/introduction-ext4-filesystem
作者:[David Both][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/dboth
[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu
[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu
[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ
[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ
[5]:https://opensource.com/tags/linux?src=linux_resource_menu
[6]:https://en.wikipedia.org/wiki/Boot_sector
[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs
[8]:https://www.flickr.com/photos/wwarby/11644168395
[9]:https://www.flickr.com/photos/wwarby/11644168395
[10]:https://opensource.com/users/jason-baker
[11]:https://creativecommons.org/licenses/by/2.0/
[12]:https://opensource.com/life/16/10/introduction-linux-filesystems
[13]:https://opensource.com/life/15/9/everything-is-a-file
[14]:https://en.wikipedia.org/wiki/MINIX_file_system
[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum
[16]:https://en.wikipedia.org/wiki/MINIX
[17]:https://en.wikipedia.org/wiki/Inode
[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf
[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure
[20]:https://en.wikipedia.org/wiki/Extended_file_system
[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card
[22]:https://en.wikipedia.org/wiki/Ext2
[23]:https://en.wikipedia.org/wiki/Boot_sector
[24]:https://opensource.com/article/17/2/linux-boot-and-startup
[25]:https://en.wikipedia.org/wiki/Ext3
[26]:https://en.wikipedia.org/wiki/Journaling_file_system
[27]:https://en.wikipedia.org/wiki/Ext4
[28]:https://en.wikipedia.org/wiki/Year_2038_problem
[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html
[30]:https://en.wikipedia.org/wiki/Hard_link
[31]:https://opensource.com/user/14106/feed
[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments
[33]:https://opensource.com/users/dboth

View File

@ -0,0 +1,175 @@
用 NMAP 探测操作系统
============================
有时能够知道一个网络里的机器的操作系统OS是有一定好处的。当你知道一台机器的操作系统后因为你可以在网上搜索专门针对该系统的安全漏洞所以入侵系统也会更加容易。当然安全漏洞通常都会很快被修补但安全漏洞存在时你需要知道。
对你自己的网络进行扫描以便发现操作系统类型可以帮助你了解黑客将如何侵入你的网络。
### 操作系统探测数据库
NAMP 带有一个数据库,它在你安装 NAMP 的时候就会被安装。这个数据库用于操作系统的探测,但是它不会自动更新。
这个数据库位于 `/usr/share/nmap/nmap-os-db`。进行更新的最简单方式是首先找到数据库的版本号,用文本编辑器打开这个文件,版本号通常位于第二行。我的数据库的第二行是 `# $Id: nmap-os-db 35407 2015-11-10 04:26:26Z dmiller $`,即这个文件的数据库版本是 35407。
要在网上查找一个可更新版本,可以浏览 https://svn.nmap.org/nmap如图 1 所示:
![Figure 01.jpg](https://www.linux.org/attachments/figure-01-jpg.699/)
*图 1*
你可以从图中看到版本号为 36736与我的系统上的版本号相比这个版本号似乎是一个更新的版本。为了对更新的操作系统进行准确的操作系统探测当然需要对这个数据库进行更新。
保留较旧的数据库版本也是一个不错的主意。我当前和版本是 35407我将在终端执行下面的命令
```
sudo mv /usr/share/nmap/nmap-os-db /usr/share/nmap/nmap-os-db-35407
```
这个数据库被以包含版本号的方式重命名了,下一步就是从网站上下载新版本的数据库,在终端执行下面命令:
```
cd /usr/share/nmap
sudo su
wget  https://svn.nmap.org/nmap/nmap-os-db
```
新的数据库即将开始被下载,但是你应该加上版本号,就像你在图 1 中看到的版本号 36736。使用文本编辑器打开这个数据库然后在第二行加上版本号。当版本号变化后你可以更新你的数据库然后在其中加入版本号以便在再次检查更新时做好准备。
### 系统探测过程
在我们开始使用实际的命令并执行系统探测之前,我们应该详细介绍扫描过程中将会发生的事情。
会执行五种不同的测试,每种测试由一个或者多个数据包组成,目标系统对每个数据包作出的响应有助于确定操作系统的类型。
五种不同的测试是:
1. 序列生成Sequence Generation
2. ICMP 回显
3. TCP 显式拥塞通知Explicit Congestion Notification
4. TCP
5. UDP
现在让我们分别看看他们各自在做什么。
**序列生成**
序列生成测试由六个数据包组成,这六个包是每隔 100 毫秒分开发送的,且都是 TCP SYN 包。
每个 TCP SYN 包的结果将有助于 NMAP 确定操作系统的类型。
**ICMP 回显**
两个有着不同设置的 ICMP 请求包被送到目标系统,由此产生的反应将有助于实现验证操作系统类型。
**TCP 显式拥塞通知Explicit Congestion Notification**
当生成许多包通过路由器时会导致其负载变大,这称之为拥塞。其结果就是系统会变慢以降低拥堵,以便路由器不会发生丢包。
这个包仅为了得到目标系统的响应而发送。因为不同的操作系统以不同的方式处理这个包,所以返回的特定值可以用来判断操作系统。
**TCP**
在这个测试中会发送六个数据包。
一些带有特定的包设置的包被发送用来到打开的或关闭的端口。结果也将会因为操作系统的不同而不同。
所有 TCP 包都是以如下不同的标志被发送:
1. 无标志
2. SYN、FIN、URG 和 PSH
3. ACK
4. SYN
5. ACK
6. FIN、PSH 和 URG
**UDP**
这个测试由一个被发送给一个关闭的端口的数据包组成。
如果目标系统上的这个端口是关闭的,而且返回一条 ICMP 端口不可达的信息,那么就说明没有防火墙。
### NMAP 操作系统检测命令
现在我们开始实际动手进行系统探测。如果你已经读过一些我写的关于 NMAP 的文章,那么最好不要执行 PING 操作。为了跳过 PING我们使用参数 `Pn`。为了看到详细的信息,你应该使用 `-v` 参数用于动态显示。为了获取系统的信息,需要使用 `-O` 参数。
为了使命令顺利运行和执行 TCP SYN 扫描,你需要以管理员的身份来执行这个命令。在我的例子中,我将只在一个系统上而不是整个网络上进行扫描,使用的命令是:
```
sudo nmap -v -Pn -O 192.168.0.63
```
扫描的结果如图2所示扫描显示七个开放的端口。
![Figure 02.jpg](https://www.linux.org/attachments/figure-02-jpg.700/)
*图 2*
开放的端口是:
1. 21/tcp ftp
2. 22/tcp ssh
3. 111/tcp rpcbind
4. 139/tcp netbios-ssn
5. 445/tcp microsoft-ds
6. 2049/tcp nfs
7. 54045/tcp unknown
系统的 MAC 地址为为:`00:1E:4F:9F:DF:7F`。
后面部分显示系统类型为:
```
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.6
Uptime guess: 0.324 days (since Sun Apr 23 08:43:32 2017)
```
系统当前运行的是 Ubuntu Server 16.04Linux 内核为 4.8,运行时间猜的较准确。
我在另一个系统了又进行了一次测试结果如图3所示
![Figure 03.jpg](https://www.linux.org/attachments/figure-03-jpg.701/)
*图 3*
这次扫描中开放的端口与上次不同。所猜的系统为 Microsoft Windows 2000|XP实际上是 Windows XP sp3。
### 端口嗅探结果
让我们来看看图 2 所示的第一次扫描中在后台发生了什么。
首先 NMAP 执行一次 TCP 隐秘扫描,在本次系统探测实例中以一个如图 4 所示的数据包 2032 开始。
![Figure 04.jpg](https://www.linux.org/attachments/figure-04-jpg.702/)
*图 4*
序列生成Sequence Generation开始于数据包 2032/2033第六个数据包是 2047/2048。注意每个都被发送两次且每隔 100ms 发送下一个数据包。
发送的 ICMP 数据包是 2050 - 20532 个数据包重复一遍,实际上是 4 个数据包。
2056-2057 是 TCP 显式拥塞通知数据包。
对 TCP 的 6 个测试是 2059、2060、2061、2063、2065、2067。
最后的 UDP 测试是 2073。
这些就是用于确定目标系统上操作系统的类型的测试。
我希望这将有助于你理解如何更新 NMAP 系统探测数据库和执行对系统的扫描。请注意,你可以和你不在同一个网络中的系统进行扫描,所以可以对互联网上的任何系统进行扫描。
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/nmap-os-detection.4564/
作者:[Jarret B][a]
译者:[zhousiyu325](https://github.com/zhousiyu325)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/jarret-b.29858/
[1]:https://svn.nmap.org/nmap
[2]:https://svn.nmap.org/nmap/nmap-os-db

View File

@ -0,0 +1,165 @@
游戏版 Linux Ubuntu GamePack
===============
很多 Linux 爱好者喜欢用他们的 Linux 系统玩游戏看起来似乎并不需要一个可以玩游戏的操作系统。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白,并把这个基于 Ubuntu 16.04 的操作系统OS命名为 Ubuntu GamePack .
### 内容
Linux 上的)游戏现在已经相当丰富,而游戏公司宣称可以访问超过 22,381 款游戏。
这个 GamePack 包括 Lutris 和 Steam 两部分,允许您访问发行版厂商提供的特定游戏服务。
对于基于 Windows 的游戏,可以用 PlayOnLinuxWINE 和 CrossOver 转换到 Linux 上运行。
对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器
也安装了 Sparky APTus Gamer ,可以访问众多主机游戏模拟器。 模拟器包括:
*  AdvanceMENU - AdvanceMAME、 AdvanceMESS、 MAME、 MESS、 xmame、 Raine 以及其他的模拟器的前端
*  Atari800 - Atari 8 位系统、XE 游戏系统和 Atari 5200 超级系统的模拟器
*   DeSmuME - 任天堂 DS 模拟器
*   Desura - 支持 Windows、Linux 和 X 系统的数字化分发平台 - 在线安装器
* DOSBox - 支持 BeOS、Linux、Mac X、OS2 和 Windows 的 DOS 模拟器
* DOSEMU - 支持 Linux 的 DOS 模拟器
* ePSXe - 增强的 PSX 模拟器
* FCEUX - 任天堂娱乐系统NES、红白机Famicom和红白机磁盘系统FDS模拟器仿真器
* FS-UAE - 跨平台的 Amiga 模拟器
* GNOME Video Arcade - 简化的 MAME 前端
* Hatari - 支持 Linux 和其他系统的 Atari ST、STE、TT 和 Falcon 模拟器(仿真器)
* Higan - 任天堂 SNES、NES、Gameboy、Gameboy Color 和 Gameboy Advance 的模拟器
* Kega_Fusion - 世嘉 SG/SC/SF主系统、Master System、 Game Gear、 Genesis/Megadrive、 SVP、 Pico、 SegaCD/MegaCD 模拟器
* MAME - 忠实重现了许多街机效果的硬件模拟器
* Mednafen - Atari Lynx、GameBoy、NES、SNES、PC-FX、世嘉索尼游戏站等系统
* MESS - 各种主机和计算机游戏的模拟器
* Nestopia - 任天堂娱乐系统/红白机模拟器
*   PCSX - 索尼游戏站模拟器
*   PlayOnLinux - Wine 前端
* PPSSPP - PPSSPP 是支持 Windows、MacOS、Linux 和 Android 的开源 PSP 仿真器
* Steam - Steam 软件分发服务的启动器 - 在线安装程序
* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器
* VisualBoyAdvance - 全功能 Game Boy Advance 的模拟器
* Virtual Jaguar - 用于 Atari 的 infamous Jaguar 主机游戏的跨平台模拟器
*   Wine - Windows 二进制在 Linux 中运行
*   Winetricks - 一个用于 WINE 的 POSIX shell 脚本的软件包管理器,能够很容易安装一些 Windows软件
*   Yabause - 世嘉土星32位游戏机模拟器
* ZSNES - 超级任天堂娱乐系统模拟器
GamePack 还包括被一些游戏所必须的 Oracle java 和 Adobe Flash。
如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。
### 下载
下载此操作系统镜像的主要地方是 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。由于此链接来自国外所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果你没有种子下载程序你可以下载“Transmission”。有了种子下载程序后你可以通过 [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]下载。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。
下载的文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB。
 
如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 GamePack ,或者你可以使用 “USB Image Writer”把 ISO 写入到优盘,并利用此优盘安装系统。
 
硬件需求和 Ubuntu 16.04 保持一致:
 
*   2 GHz 双核处理器或者更高
*   2 GB 系统内存
*   25 GB 的磁盘空间
*   用于安装介质的 DVD 驱动器或者 USB 端口
*   在线游戏系统(如 Steam需要互联网接入。
不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款显存大一点的正统显卡。
您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。
 
###安装过程
当你用安装介质的 ISO 镜像文件启动了系统,您就可以准备进行下一步了。
从 Ubuntu Gamepack 介质启动,你会看到一个类似图 1 的屏幕。
![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/)
*图 1*
一旦加载完毕,安装程序就可以继续安装了。图 2 显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意你可以点击 “Try Ubuntu” 在不改变硬盘内容的情况下把它加载到内存中来试试它。
![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/)
*图 2*
接下来继续选择 Install Ubuntu 进行安装了。
下一个屏幕,如图 3 所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件图形、WiFi、Flash、 MP3 和其他更新。
 
当定制好你的系统后就可以点击“Continue” 
 
![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/)
*图 3*
接下来,您必须指定驱动器将如何配置使用,如图 4 所示。如果您计划使用整个驱动器那么可以更容易地设置选择此驱动器即可然后单击“Install Now”。
![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/)
*图 4*
接下来在图 5 中可以根据提示确认所选择硬件配置。如果同意以上的更改请单击“Continue”。 
 
![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/)
*图 5*
接下来,如图 6 所示你将按照提示选择时区选择完毕后点击“Continue”。
![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/)
*图 6*
接下来,如图 7 所示一个窗口需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。
![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/)
*图 7*
最后一个配置屏幕是为您设置一个用户帐户,如图 8 所示。键入您的姓名、计算机名、用户名、密码并选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。
![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/)
*图 8*
安装将按指定来设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图 9 所示。所有内容复制到硬盘并设置好,您将被提示移除引导介质并允许重新启动系统。
![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/)
*图 9*
重新启动后,您需要选择要求用户登录,会得到类似于图 10 的屏幕。输入指定的用户密码登录到 Ubuntu Gamepack。
![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/)
*图 10*
当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的软件升级。打开一个终端并输入以下两个命令:
```
sudo apt-get update && sudo apt-get upgrade
```
Any updates which are not installed should be installed to bring the GamePack system up-to-date.
任何没有安装的更新都应该安装,以便 GamePack 系统保持更新。
现在,只要看看菜单,找到你想玩的游戏就行了,打开模拟器或其它像 Steam 的游戏服务 。
希望你喜欢 Gamepack 并且玩得高兴!
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/ubuntu-gamepack.4559/
作者:[Jarret B][a]
译者:[stevenzdg988](https://github.com/stevenzdg988)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/jarret-b.29858/
[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack
[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html

View File

@ -0,0 +1,123 @@
什么是开源?
===========================
![](https://opensource.com/sites/default/files/styles/image-full-size/public/images/resources/OSDC_Resource_Main_Page.png?itok=HP4NenAL)
<ruby>开源<rt>open source</rt></ruby>”这个词,指的是事物规划为可以公开访问的,因此人们可以修改并分享。
这个词最初是起源于软件开发中,指的是一种开发软件的特殊形式。但到了今天,“开源”已经泛指一组概念——就是我们称之为的“[开源的方式][1]”。这些概念包括开源项目、产品,或是自发倡导并欢迎开放变化、协作参与、快速原型、公开透明、精英体制以及面向社区开发的原则。
### 什么是开源软件?
开源软件的源代码任何人都可以审查、修改和增强。
<ruby>源代码<rt>source code</rt></ruby>”是软件中大部分计算机用户都没见过的部分,程序员可以修改代码来改变一个软件(“程序”或“应用”)工作的方式。程序员如果可以接触到计算机程序源代码,就可以通过添加功能或修复问题来改进这个软件。
### 开源软件和其它类型的软件有什么不同?
有些软件只有创建它的人、团队、组织才能修改,并且控制维护工作。人们称这种软件是“<ruby>专有<rt>proprietary</rt></ruby>”或“<ruby>闭源<rt>closed source</rt></ruby>”软件。
专有软件只有原作者可以合法地复制、审查,以及修改这个软件。为了使用专有软件,计算机用户必须同意(通常是在软件第一次运行的时候签署一份显示的许可)他们不会对软件做软件作者没有表态允许的事情。微软 Office 和 Adobe Photoshop 就是专有软件的例子。
开源软件不一样。它的作者[让源代码对其他人提供][2],需要的人都可以查看、复制、学习、修改或分享代码。[LibreOffice][3] 和 [GIMP][4] 是开源软件的例子。
就像专有软件那样,用户在使用开源软件时必须接受一份[许可证][5]的条款——但开源许可的法律条款和专有软件的许可截然不同。
开源许可证影响人们[使用、学习、修改以及分发][6]的方式。总的来说,开源许可证赋予计算机用户[按他们想要的目的来使用开源软件的许可][7]。一些开源许可证(人们称之为<ruby>左版<rt>copyleft</rt></ruby>”)规定任何发布了修改过的开源软件的人,同时还要一同发布它的源代码。此外,[另一些开源许可][8]规定任何修改和分享一个程序给其他人的人,还要分享这个程序的源代码,而且不能收取许可费用。
开源软件许可证有意地提升了协作和分享,因为它们允许其他人对代码作出修改并将改动包含到他们自己的项目中。开源许可证鼓励开发者随时访问、查看、修改开源软件,前提是开发者在分享成果的时候允许其他人也能够做相同的事情。
### 开源软件只是对开发者很重要?
不。开源技术和开源思想对开发者和非开发者都有益。
因为早期的创造者基于开源技术构建了互联网本身的大部分——比如 [Linux 操作系统][9]和 [Apache Web 服务器][10]应用——任何今天使用互联网的人都受益于开源软件。
每当计算机用户浏览网页、检查邮件、和朋友聊天、在线收听流媒体音乐、玩多人游戏的时候,他们的电脑、手机或游戏主机都会连接到一个全球性的计算机网络,使用开源软件来路由并将他们的数据传输到面前的“本地”设备上。完成这些重要工作的计算机通常位于很远的地方,用户不会实际看到或物理接触到它们——所以有些人称之为“远程计算机”。
越来越多的人开始依赖于远程计算机,在可以在本地完成的任务在线完成。举个例子,人们可能会使用在线文字处理、电子邮件管理、图片编辑工具,而在本地的个人电脑并没有安装运行相应的软件。人们轻松地使用浏览器或手机应用访问这些程序。当他们这么做的时候,他们参与到了“远程计算”中。
一些人将远程计算称为“云计算”,因为它涉及的活动(像是存储文件、分享照片、观看视频)不仅包含本地设备,还有一个远程计算机全球网络,像是围绕在周围的大气。
云计算是日常生活一个越来越重要的概念,离不开连接互联网的设备。一些云计算应用,比如 Google 应用,是专有的。其它的,像 OwnCloud 和 NextCould 是开源的。
云计算应用运行在一些额外的软件“之上”这些软件帮助它们流畅高效地操作所以人们经常说那个软件运行在云计算应用“之下”为那些应用扮演一个“平台”。云计算平台可以是开源或闭源的。OpenStack 是一个开源云计算平台的例子。
### 为什么人们更倾向于使用开源软件?
人们相对于专有软件更倾向于开源软件有很多原因,包括:
**可控**。很多人青睐开源软件因为相对其它类型软件他们可以[拥有更多的可控][11]。他们可以检查代码来保证它没有做任何不希望它做的事情,并且可以改变不喜欢的部分。不是开发者的用户也可以从开源软件获益,因为他们可以以任何目的使用这个软件——而不仅仅是某些人认为他们应该有的目的。
**训练**。其他人喜欢开源软件是因为它可以帮助他们[成为更好的开发者][12]。因为开源代码可以公开访问,学生可以在学习创建更好的软件时轻松地从中学习。学生还可以在提升技能的时候分享他们的成果给别人,获得评价和批评。当人们发现程序源代码中的错误的时候,可以将这个错误分享给其他人,帮助他们避免犯同样的错误。
**安全**。一些人倾向开源软件是因为他们认为它比专有软件更[安全][13]和稳定。因为任何人都可以查看和修改开源软件,就会有人可能会注意到并修正原作者遗漏的错误或疏忽。并且因为这么多的开发者可以在同一开源软件上工作,而不用事先联系获取原作者的授权,相比专有软件,他们可以更[快速][14]地修复、更新和升级开源软件。
**稳定**。许多用户在重要、长期的项目中相较专有软件更加青睐开源软件。因为开发者[公开分发][15]开源软件的源代码,如果最初的开发者停止开发了,关键任务依赖该软件的用户可以确保他们的工具不会消失,或是陷入无法修复的状态。另外,开源软件趋向于同时包含和按照开放标准进行操作。
### “开源”不是只是意味着某样东西是免费的吗?
不。这是个“开源”实践中的[常见误解][16],“开源”概念的含义[不只是指经济方面的][17]。
开源软件开发者可以为他们创建或贡献的开源软件收取费用。但在一些情况下,由于开源许可证可能会要求他们在将软件卖给他人的时候发布源代码,一些开发者发现向用户收取软件服务和支持(而不是软件本身)的费用会更加合算。通过这种方式,他们的软件仍然保持免费,而他们[从帮助他人][18]安装、使用、解决问题中赚取费用。
尽管一些开源软件可能是免费的,但开源软件的编程和解决问题的技能可能[十分有价值][19]。许多雇主特别寻求[雇佣在开源软件方面有工作经验的开发者][20]。
### 什么是“在软件之外”的开源?
在 Opensource.com我们想说我们对于开源价值和原则应用到软件之外领域的方式很有兴趣。我们更愿意不仅将开源视为一种计算机软件开发和许可的方式也把它视作一种态度。
实现“[开源方式][21]”的生活的各个方面,意味着表达一种分享的意愿,通过透明的方式和他人协作(这样其他人也可以关注和加入),拥抱失败,将它作为一种改进的手段,以及期待(甚至鼓励)所有人都可以这么做。
这也意味着在让世界变得更好的过程中扮演一个积极的角色,这只有在[每个人都可以接触][22]到对世界进行规划的途径时才有可能。
这个世界充满了“源代码”——[蓝图][23]、[食谱][24]、[规则][25]——它们引导和塑造我们思考和行动的方式。我们相信这些深层代码(无论是什么形式)应该是开放、可接触、分享的——这样人们可以参与其中并让它变得更好。
在这里,我们诉说开源价值对生活所有领域的影响的故事——[科学][26]、[教育][27]、[政府][28]、[工业][29]、健康、法律,以及[组织动态][30]。我们是一个社区,告诉他人开源的方式如何成为最好的方式,因为对开源的爱和其它一样:当它被分享的时候它会变得更好。
在哪里能够获得关于开源的更多信息?
我们编辑了一些资源来帮助你学到更多关于开源的内容。我们推荐你从阅读我们的[开源问答、指南、教程][31]开始。
--------------------------------------------------------------------------------
via: https://opensource.com/resources/what-open-source
作者:[opensource.com][a]
译者:[alim0x](https://github.com/alim0x)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: opensource.com
[1]:https://opensource.com/open-source-way
[2]:https://opensource.com/business/13/5/open-source-your-code
[3]:https://www.libreoffice.org/
[4]:http://www.gimp.org/
[5]:https://opensource.com/law/13/1/which-open-source-software-license-should-i-use
[6]:https://opensource.com/law/10/10/license-compliance-not-problem-open-source-users
[7]:https://opensource.org/docs/osd
[8]:https://opensource.com/law/13/5/does-your-code-need-license
[9]:https://opensource.com/resources/what-is-linux
[10]:http://httpd.apache.org/
[11]:https://opensource.com/life/13/5/tumblr-open-publishing
[12]:https://opensource.com/life/13/6/learning-program-open-source-way
[13]:https://opensource.com/government/10/9/scap-computer-security-rest-us
[14]:https://opensource.com/government/13/2/bug-fix-day
[15]:https://opensource.com/life/12/9/should-we-develop-open-source-openly
[16]:https://opensource.com/education/12/7/clearing-open-source-misconceptions
[17]:https://opensource.com/open-organization/16/5/appreciating-full-power-open
[18]:https://opensource.com/business/14/7/making-your-product-free-and-open-source-crazy-talk
[19]:https://opensource.com/business/16/2/add-open-source-to-your-resume
[20]:https://opensource.com/business/16/5/2016-open-source-jobs-report
[21]:https://opensource.com/open-source-way
[22]:https://opensource.com/resources/what-open-access
[23]:https://opensource.com/life/11/6/architecture-open-source-applications-learn-those-you
[24]:https://opensource.com/life/12/6/open-source-like-sharing-recipe
[25]:https://opensource.com/life/12/4/day-my-mind-became-open-sourced
[26]:https://opensource.com/resources/open-science
[27]:https://opensource.com/resources/what-open-education
[28]:https://opensource.com/resources/open-government
[29]:https://opensource.com/resources/what-open-hardware
[30]:https://opensource.com/resources/what-open-organization
[31]:https://opensource.com/resources

View File

@ -0,0 +1,122 @@
Apache Spark 大规模应用:一个 60TB+ 规模的产品使用案例
===========
Facebook 经常使用数据驱动的分析方法来做决策。在过去的几年,用户和产品的增长已经需要我们的分析工程师一次查询就要操作数十 TB 大小的数据集。我们的一些批量分析执行在古老的 [Hive][1] 平台( Apache Hive 由 Facebook 贡献于 2009 年)和 [Corona][2] 上——这是我们定制的 MapReduce 实现。Facebook 还不断增加其对 Presto 的用量,用于对几个包括 Hive 在内的内部数据存储的 ANSI-SQL 查询。我们也支持其他分析类型比如图数据库处理graph processing和机器学习[Apache Giraph][3])和流(例如:[Puma][4]、[Swift][5] 和 [Stylus][6])。
同时 Facebook 的各种产品涵盖了广泛的分析领域,我们与开源社区不断保持沟通,以便共享我们的经验并从其他人那里学习。[Apache Spark][7] 于 2009 年在加州大学伯克利分校的 AMPLab 由 Matei Zaharia 发起后来在2013 年贡献给 Apache。它是目前增长最快的数据处理平台之一由于它能支持流、批量、命令式RDD、声明式SQL、图数据库和机器学习等用例而且所有这些都内置在相同的 API 和底层计算引擎中。Spark 可以有效地利用更大量级的内存优化整个流水线pipeline中的代码并跨任务重用 JVM 以获得更好的性能。最近我们感觉 Spark 已经成熟,我们可以在一些批量处理用例方面把它与 Hive 相比较。在这篇文章其余的部分,我们讲述了在扩展 Spark 来替代我们一个 Hive 工作任务时的所得到经验和学习到的教训。
### 用例:实体排名的特征准备
Facebook 会以多种方式做实时的实体entity排名。对于一些在线服务平台原始特征值是由 Hive 线下生成的,然后将数据加载到实时关联查询系统。我们在几年前建立的基于 Hive 的老式基础设施属于计算资源密集型,且很难维护,因为其流水线被划分成数百个较小的 Hive 任务。为了可以使用更加新的特征数据和提升可管理性,我们拿一个现有的流水线试着将其迁移至 Spark。
### 以前的 Hive 实现
基于 Hive 的流水线由三个逻辑阶段stage组成每个阶段对应由 entity_id 划分的数百个较小的 Hive 作业,因为在每个阶段运行大型 Hive 作业job不太可靠并受到每个作业的最大任务task数量的限制。
![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14050196_257613611304247_245043082_n.jpg?oh=4dceed87af2b5ece78651a11ac2a0d7a&oe=59E87E32)
这三个逻辑阶段可以总结如下:
1. 过滤出非产品的特征和噪点。
2. 在每个entity\_id, target\_id对上进行聚合。
3. 将表格分割成 N 个分片,并通过自定义二进制文件管理每个分片,以生成用于在线查询的自定义索引文件。
基于 Hive 的流水线建立该索引大概要三天完成。它也难于管理,因为该流水线包含上百个分片的作业,使监控也变得困难。同时也没有好的方法来估算流水线进度或计算剩余时间。考虑到 Hive 流水线的上述限制,我们决定建立一个更快、更易于管理的 Spark 流水线。
### Spark 实现
全量的调试会很慢,有挑战,而且是资源密集型的。我们从转换基于 Hive 流水线的最资源密集型的第二阶段开始。我们以一个 50GB 的压缩输入例子开始,然后逐渐扩展到 300GB、1TB然后到 20TB。在每次规模增长时我们都解决了性能和稳定性问题但是实验到 20TB 时,我们发现了最大的改善机会。
运行 20TB 的输入时,我们发现,由于大量的任务导致我们生成了太多输出文件(每个大小在 100MB 左右)。在 10 小时的作业运行时中,有三分之一是用在将文件从阶段目录移动到 HDFS 中的最终目录。起初,我们考虑两个方案:要么改善 HDFS 中的批量重命名来支持我们的用例,或者配置 Spark 生成更少的输出文件(这很难,由于在这一步有大量的任务 — 70000 个)。我们退一步来看这个问题,考虑第三种方案。由于我们在流水线的第二步中生成的 tmp_table2 表是临时的,仅用于存储流水线的中间输出,所以对于 TB 级数据的单一读取作业任务,我们基本上是在压缩、序列化和复制三个副本。相反,我们更进一步:移除两个临时表并整合 Hive 过程的所有三个部分到一个单独的 Spark 作业,读取 60TB 的压缩数据然后对 90TB 的数据执行重排shuffle和排序sort。最终的 Spark 作业如下:
![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14146896_1073876729364007_1912864323_n.jpg?oh=77200f03e6713b6adc91033230dcd588&oe=59E17E46)
### 对于我们的作业如何规划 Spark
当然,为如此大的流水线运行一个单独的 Spark 任务第一次尝试没有成功甚至是第十次尝试也没有。据我们所知从重排shuffle的数据大小来说这是现实世界最大的 Spark 作业([Databrick 的 PB 级排序](https://databricks.com/blog/2014/10/10/spark-petabyte-sort.html)是以合成数据来说)。我们对核心 Spark 基础架构和我们的应用程序进行了许多改进和优化使这个作业得以运行。这种努力的优势在于,许多这些改进适用于 Spark 的其他大型作业任务,我们将所有的工作回馈给开源 Apache Spark 项目 - 有关详细信息请参阅 JIRA。下面我们将重点讲述将实体排名流水线之一部署到生产环境所做的重大改进。
### 可靠性修复
#### 处理频繁的节点重启
为了可靠地执行长时间运行作业,我们希望系统能够容错并可以从故障中恢复(主要是由于平时的维护或软件错误导致的机器重启所引发的)。虽然 Spark 设计为可以容忍机器重启,但我们发现它在足够强健到可以处理常见故障之前还有各种错误/问题需要解决。
- **使 PipedRDD 稳健的获取fetch失败**SPARK-13793PipedRDD 以前的实现不够强大,无法处理由于节点重启而导致的获取失败,并且只要出现获取失败,该作业就会失败。我们在 PipedRDD 中进行了更改,优雅的处理获取失败,使该作业可以从这种类型的获取失败中恢复。
- **可配置的最大获取失败次数**SPARK-13369对于这种长时间运行的作业由于机器重启而引起的获取失败概率显着增加。在 Spark 中每个阶段的最大允许的获取失败次数是硬编码的,因此,当达到最大数量时该作业将失败。我们做了一个改变,使它是可配置的,并且在这个用例中将其从 4 增长到 20从而使作业更稳健。
- **减少集群重启混乱**长时间运行作业应该可以在集群重启后存留所以我们不用等着处理完成。Spark 的可重启的重排shuffle服务功能可以使我们在节点重启后保留重排shuffle文件。最重要的是我们在 Spark 驱动程序中实现了一项功能,可以暂停执行任务调度,所以不会由于集群重启而导致的过多的任务失败,从而导致作业失败。
#### 其他的可靠性修复
- **响应迟钝的驱动程序**SPARK-13279在添加任务时由于 O(N ^ 2) 复杂度的操作Spark 驱动程序被卡住,导致该作业最终被卡住和死亡。 我们通过删除不必要的 O(N ^ 2) 操作来修复问题。
- **过多的驱动推测speculation**我们发现Spark 驱动程序在管理大量任务时花费了大量的时间推测。 在短期内,我们禁止这个作业的推测。在长期,我们正在努力改变 Spark 驱动程序,以减少推测时间。
- **由于大型缓冲区的整数溢出导致的 TimSort 问题**SPARK-13850我们发现 Spark 的不安全内存操作有一个漏洞,导致 TimSort 中的内存损坏。 感谢 Databricks 的人解决了这个问题,这使我们能够在大内存缓冲区中运行。
- **调整重排shuffle服务来处理大量连接**:在重排阶段,我们看到许多执行程序在尝试连接重排服务时超时。 增加 Netty 服务器的线程spark.shuffle.io.serverThreads和积压spark.shuffle.io.backLog的数量解决了这个问题。
- **修复 Spark 执行程序 OOM**SPARK-13958deal maker首先在每个主机上打包超过四个聚合reduce任务是很困难的。Spark 执行程序会内存溢出因为排序程序sorter中存在导致无限增长的指针数组的漏洞。当不再有可用的内存用于指针数组增长时我们通过强制将数据溢出到磁盘来修复问题。因此现在我们可以每主机运行 24 个任务,而不会内存溢出。
### 性能改进
在实施上述可靠性改进后,我们能够可靠地运行 Spark 作业了。基于这一点,我们将精力转向与性能相关的项目,以充分发挥 Spark 的作用。我们使用 Spark 的指标和几个分析器来查找一些性能瓶颈。
#### 我们用来查找性能瓶颈的工具
- **Spark UI 指标**Spark UI 可以很好地了解在特定阶段所花费的时间。每个任务的执行时间被分为子阶段,以便更容易地找到作业中的瓶颈。
- **Jstack**Spark UI 还在执行程序进程上提供了一个按需分配的 jstack 函数,可用于中查找热点代码。
- **Spark 的 Linux Perf / 火焰图Flame Graph支持**:尽管上述两个工具非常方便,但它们并不提供同时在数百台机器上运行的作业的 CPU 分析的聚合视图。在每个作业的基础上,我们添加了支持 Perf 分析(通过 libperfagent 的 Java 符号),并可以自定义采样的持续时间/频率。使用我们的内部指标收集框架,将分析样本聚合并显示为整个执行程序的火焰图。
#### 性能优化
- **修复排序程序sorter中的内存泄漏**SPARK-1436330 速度提升):我们发现了一个问题,当任务释放所有内存页时指针数组却未被释放。 因此,大量的内存未被使用,并导致频繁的溢出和执行程序 OOM。 我们现在进行了改变,正确地释放内存,并使大的分类运行更有效。 我们注意到,这一变化后 CPU 改善了 30
- **Snappy 优化**SPARK-1427710 速度提升):有个 JNI 方法Snappy.ArrayCopy在每一行被读取/写入时都会被调用。 我们发现了这个问题Snappy 的行为被改为使用非 JNI 的 System.ArrayCopy 代替。 这一改变节约了大约 10 的 CPU。
- **减少重排的写入延迟**SPARK-5581高达 50 的速度提升在映射map方面当将重排数据写入磁盘时映射任务为每个分区打开并关闭相同的文件。 我们做了一个修复,以避免不必要的打开/关闭,对于大量写入重排分区的作业来说,我们观察到高达 50 的 CPU 提升。
- **解决由于获取失败导致的重复任务运行问题**SPARK-14649当获取失败发生时Spark 驱动程序会重新提交已运行的任务,导致性能下降。 我们通过避免重新运行运行的任务来解决这个问题,我们看到当获取失败发生时该作业会更加稳定。
- **可配置 PipedRDD 的缓冲区大小**SPARK-1454210 速度提升):在使用 PipedRDD 时,我们发现将数据从分类程序传输到管道进程的默认缓冲区的大小太小,我们的作业要花费超过 10 的时间复制数据。我们使缓冲区大小可配置,以避免这个瓶颈。
- **缓存索引文件以加速重排获取**SPARK-15074我们观察到重排服务经常成为瓶颈减少程序reducer花费 10 至 15 的时间等待获取映射map数据。通过深入了解问题我们发现重排服务为每个重排获取打开/关闭重排索引文件。我们进行了更改以缓存索引信息,以便我们可以避免文件打开/关闭,并重新使用该索引信息以便后续获取。这个变化将总的重排时间减少了 50
- **降低重排字节写入指标的更新频率**SPARK-15569高达 20 的速度提升):使用 Spark 的 Linux Perf 集成,我们发现大约 20 的 CPU 时间正在花费探测和更新写入的重排字节写入指标上。
- **可配置排序程序sorter的初始缓冲区大小**SPARK-15958高达 5 的速度提升排序程序sorter的默认初始缓冲区大小太小4 KB我们发现它对于大型工作负载而言非常小 - 所以我们在缓冲区耗尽和内容复制上浪费了大量的时间。我们做了一个更改,使缓冲区大小可配置,并且缓冲区大小为 64 MB我们可以避免大量的数据复制使作业的速度提高约 5
- **配置任务数量**:由于我们的输入大小为 60T每个 HDFS 块大小为 256M因此我们为该作业产生了超过 250,000 个任务。尽管我们能够以如此多的任务来运行 Spark 作业但是我们发现当任务数量过高时性能会下降。我们引入了一个配置参数使映射map输入大小可配置因此我们可以通过将输入分割大小设置为 2 GB 来将该数量减少 8 倍。
在所有这些可靠性和性能改进之后,我们很高兴地报告,我们为我们的实体排名系统之一构建和部署了一个更快、更易于管理的流水线,并且我们提供了在 Spark 中运行其他类似作业的能力。
### Spark 流水线与 Hive 流水线性能对比
我们使用以下性能指标来比较 Spark 流水线与 Hive 流水线。请注意,这些数字并不是在查询或作业级别的直接比较 Spark 与 Hive ,而是比较使用灵活的计算引擎(例如 Spark构建优化的流水线而不是比较仅在查询/作业级别(如 Hive操作的计算引擎。
CPU 时间:这是从系统角度看 CPU 使用。例如,你在一个 32 核机器上使用 50% 的 CPU 10 秒运行一个单进程任务,然后你的 CPU 时间应该是 32 * 0.5 * 10 = 160 CPU 秒。
![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14146892_595234533986285_2004398348_n.jpg?oh=42b2bcc2b5b0d2b2f3141ee5639a62f2&oe=59DC7E21)
CPU 预留时间:这是从资源管理框架的角度来看 CPU 预留。例如,如果我们保留 32 位机器 10 秒钟来运行作业则CPU 预留时间为 32 * 10 = 320 CPU 秒。CPU 时间与 CPU 预留时间的比率反映了我们如何在集群上利用预留的CPU 资源。当准确时,与 CPU 时间相比,预留时间在运行相同工作负载时可以更好地比较执行引擎。例如,如果一个进程需要 1 个 CPU 的时间才能运行,但是必须保留 100 个 CPU 秒,则该指标的效率要低于需要 10 个 CPU 秒而仅保留 10 个 CPU 秒来执行相同的工作量的进程。我们还计算内存预留时间,但不包括在这里,因为其数字类似于 CPU 预留时间,因为在同一硬件上运行实验,而在 Spark 和 Hive 的情况下我们不会将数据缓存在内存中。Spark 有能力在内存中缓存数据,但是由于我们的集群内存限制,我们决定类似与 Hive 一样工作在核心外部。
![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14129680_325754934432503_513809233_n.jpg?oh=c2c26e6ef20724eef32771c5953d386a&oe=59D61914)
等待时间:端到端的工作流失时间。
![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14129681_178723715883876_1030939470_n.jpg?oh=9bc18e548bbd23ee675e15ac03ea8600&oe=599C4F25)
### 结论和未来工作
Facebook 的性能和可扩展的分析在产品开发中给予了协助。Apache Spark 提供了将各种分析用例统一为单一 API 和高效计算引擎的独特功能。我们挑战了 Spark来将一个分解成数百个 Hive 作业的流水线替换成一个 Spark 作业。通过一系列的性能和可靠性改进之后,我们可以将 Spark 扩大到处理我们在生产中的实体排名数据处理用例之一。 在这个特殊用例中,我们展示了 Spark 可以可靠地重排和排序 90 TB+ 的中间数据,并在一个单一作业中运行了 25 万个任务。 与旧的基于 Hive 的流水线相比,基于 Spark 的流水线产生了显着的性能改进4.5-6 倍 CPU3-4 倍资源预留和大约 5 倍的延迟),并且已经投入使用了几个月。
虽然本文详细介绍了我们 Spark 最具挑战性的用例,越来越多的客户团队已将 Spark 工作负载部署到生产中。 性能
、可维护性和灵活性是继续推动更多用例到 Spark 的优势。 Facebook 很高兴成为 Spark 开源社区的一部分,并将共同开发 Spark 充分发挥其潜力。
--------------------------------------------------------------------------------
via: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/
作者:[Sital Kedia][a], [王硕杰][b], [Avery Ching][c]
译者:[wyangsun](https://github.com/wyangsun)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.facebook.com/sitalkedia
[b]: https://www.facebook.com/shuojiew
[c]: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email#
[1]: https://code.facebook.com/posts/370832626374903/even-faster-data-at-the-speed-of-presto-orc/
[2]: https://www.facebook.com/notes/facebook-engineering/under-the-hood-scheduling-mapreduce-jobs-more-efficiently-with-corona/10151142560538920/
[3]: https://code.facebook.com/posts/509727595776839/scaling-apache-giraph-to-a-trillion-edges/
[4]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/
[5]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/
[6]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/
[7]: http://spark.apache.org/

View File

@ -0,0 +1,211 @@
在 LXD 2.3 及以上版本中管理网络
===========
![LXD logo](https://linuxcontainers.org/static/img/containers.png)
### 介绍
当 LXD 2.0 随着 Ubuntu 16.04 一起发布时LXD 联网就简单了。要么你可以使用 `lxd init` 来配置,为你的容器自己提供一个 “lxdbr0” 网桥,要么使用一个已存在的物理接口。
虽然这确实有效,但是有点混乱,因为大部分的桥接配置发生在 Ubuntu 打包的 LXD 之外。那些脚本只能支持一个桥接,并且没有通过 API 暴露,这使得远程配置有点痛苦。
直到 LXD 2.3LXD 终于发展了自己的网络管理 API ,并有相应的命令行工具。这篇文章试图来简述这些新的功能。
### 基础联网
在初始情况下LXD 2.3 没有定义任何网络。`lxd init` 会为你设置一个,并且默认情况下将所有新的容器连接到它,但是让我们亲手尝试看下究竟发生了些什么。
要创建一个新的带有随机 IPv4 和 IP6 子网,并启用 NAT 的网络,只需要运行:
```
stgraber@castiana:~$ lxc network create testbr0
Network testbr0 created
```
你可以如下查看它的配置:
```
stgraber@castiana:~$ lxc network show testbr0
name: testbr0
config:
ipv4.address: 10.150.19.1/24
ipv4.nat: "true"
ipv6.address: fd42:474b:622d:259d::1/64
ipv6.nat: "true"
managed: true
type: bridge
usedby: []
```
如果你不想要那些自动配置的子网,你可以这么做:
```
stgraber@castiana:~$ lxc network create testbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true
Network testbr0 created
```
那就会这样:
```
stgraber@castiana:~$ lxc network show testbr0
name: testbr0
config:
ipv4.address: 10.0.3.1/24
ipv4.nat: "true"
ipv6.address: none
managed: true
type: bridge
usedby: []
```
如果你的容器没有使用它,那么创建的网络对你也没什么用。要将你新创建的网络连接到所有容器,你可以这么做:
```
stgraber@castiana:~$ lxc network attach-profile testbr0 default eth0
```
要将一个网络连接到一个已存在的容器中,你可以这么做:
```
stgraber@castiana:~$ lxc network attach my-container default eth0
```
现在,假设你已经在机器中安装了 openvswitch并且要将这个网桥转换成 OVS 网桥,只需更改为正确的驱动:
```
stgraber@castiana:~$ lxc network set testbr0 bridge.driver openvswitch
```
如果你想要一次性做一系列修改。`lxc network edit` 可以让你在编辑器中交互编辑网络配置。
### 静态租约及端口安全
使用 LXD 管理 DHCP 服务器的一个好处是可以使得管理 DHCP 租约很简单。你所需要的是一个容器特定的网卡设备以及正确的属性设置。
```
root@yak:~# lxc init ubuntu:16.04 c1
Creating c1
root@yak:~# lxc network attach testbr0 c1 eth0
root@yak:~# lxc config device set c1 eth0 ipv4.address 10.0.3.123
root@yak:~# lxc start c1
root@yak:~# lxc list c1
+------+---------+-------------------+------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+---------+-------------------+------+------------+-----------+
| c1 | RUNNING | 10.0.3.123 (eth0) | | PERSISTENT | 0 |
+------+---------+-------------------+------+------------+-----------+
```
IPv6 也是相同的方法,但是换成 `ipv6.address` 属性。
相似地,如果你想要阻止你的容器更改它的 MAC 地址或者为其他 MAC 地址转发流量(比如嵌套),你可以用下面的命令启用端口安全:
```
root@yak:~# lxc config device set c1 eth0 security.mac_filtering true
```
### DNS
LXD 在网桥上运行 DNS 服务器。除了设置网桥的 DNS 域( `dns.domain` 网络属性)之外,还支持 3 种不同的操作模式(`dns.mode`
* `managed` :每个容器都会有一条 DNS 记录,匹配它的名字以及已知的 IP 地址。容器无法通过 DHCP 改变这条记录。
* `dynamic` :允许容器通过 DHCP 在 DNS 中自行注册。因此,在 DHCP 协商期间容器发送的任何主机名最终都出现在 DNS 中。
* `none` 针对那些没有任何本地 DNS 记录的递归 DNS 服务器。
默认的模式是 `managed`,并且典型的是最安全以及最方便的,因为它为容器提供了 DNS 记录,但是不允许它们通过 DHCP 发送虚假主机名嗅探其他的记录。
### 使用隧道
除了这些LXD 还支持使用 GRE 或者 VXLAN 隧道连接到其他主机。
LXD 网络可以连接任何数量的隧道,从而轻松地创建跨多个主机的网络。这对于开发、测试和演示非常有用,生产环境通常更喜欢使用 VLAN 进行分割。
所以说,你想在主机 “edfu” 上有一个运行 IPv4 和 IPv6 的基础 “testbr0” 网络,并希望在主机 “djanet” 上使用它来生成容器。最简单的方法是使用组播 VXLAN 隧道。这种类型的隧道仅在两个主机位于同一物理段上时才起作用。
```
root@edfu:~# lxc network create testbr0 tunnel.lan.protocol=vxlan
Network testbr0 created
root@edfu:~# lxc network attach-profile testbr0 default eth0
```
它在主机 “edfu” 上定义了一个 “testbr0” 桥接,并为其他主机能加入它设置了一个组播 VXLAN。在这个设置中“edfu” 为这个网络扮演了一个路由器角色,提供 DHCP、DNS 等等,其他主机只是通过隧道转发流量。
```
root@djanet:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.lan.protocol=vxlan
Network testbr0 created
root@djanet:~# lxc network attach-profile testbr0 default eth0
```
现在你可以在任何一台主机上启动容器,并看到它们从同一个地址池中获取 IP通过隧道直接互相通讯。
如先前所述,这个使用了组播,它通常在跨越路由器时无法很好工作。在这些情况下,你可以用单播模式使用 VXLAN 或者 GRE 隧道。
要使用 GRE 加入另一台主机,首先配置服务主机:
```
root@edfu:~# lxc network set testbr0 tunnel.nuturo.protocol gre
root@edfu:~# lxc network set testbr0 tunnel.nuturo.local 172.17.16.2
root@edfu:~# lxc network set testbr0 tunnel.nuturo.remote 172.17.16.9
```
接着是“客户端”主机:
```
root@nuturo:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.edfu.protocol=gre tunnel.edfu.local=172.17.16.9 tunnel.edfu.remote=172.17.16.2
Network testbr0 created
root@nuturo:~# lxc network attach-profile testbr0 default eth0
```
如果你像使用 VXLAN只要这么做
```
root@edfu:~# lxc network set testbr0 tunnel.edfu.id 10
root@edfu:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
```
还有:
```
root@nuturo:~# lxc network set testbr0 tunnel.edfu.id 10
root@nuturo:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
```
这里需要隧道 id 以防与已经配置的多播 VXLAN 隧道冲突。
这就是如何使用最近的 LXD 简化跨主机联网了!
### 总结
LXD 使得从简单的单主机网络到数千个容器的非常复杂的跨主机网络的定义变得更加容易。它也使为一些容器定义一个新网络或者给容器添加第二个设备,并连接到隔离的私有网络变得很简单。
虽然这篇文章介绍了支持的大部分功能,但仍有一些可以微调 LXD 网络体验的窍门。可以在这里找到完整的列表:[https://github.com/lxc/lxd/blob/master/doc/configuration.md][2] 。
### 额外信息
- LXD 主站:[https://linuxcontainers.org/lxd][3]
- Github 地址: [https://github.com/lxc/lxd][4]
- 邮件列表支持:[https://lists.linuxcontainers.org][5]
- IRC 频道:#lxcontainers on irc.freenode.net
- 在线尝试 LXD[https://linuxcontainers.org/lxd/try-it][6]
--------------------------------------------------------------------------------
via: https://www.stgraber.org/2016/10/27/network-management-with-lxd-2-3/
作者:[Stéphane Graber][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.stgraber.org/author/stgraber/
[1]:https://www.stgraber.org/author/stgraber/
[2]:https://github.com/lxc/lxd/blob/master/doc/configuration.md#network-configuration
[3]:https://linuxcontainers.org/lxd
[4]:https://github.com/lxc/lxd
[5]:https://lists.linuxcontainers.org/
[6]:https://linuxcontainers.org/lxd/try-it
[7]:https://www.stgraber.org/2016/10/27/network-management-with-lxd-2-3/

View File

@ -0,0 +1,74 @@
2017 年的八大系统运维和工程发展趋势
=================
![](https://d3tdunqjn7n0wj.cloudfront.net/720x480/operations-circle-binoculars-crop-84d7249dda092338c1a6f3b562203b3d.jpg)
预测趋势是棘手的尤其是在快速发展的系统运维和工程领域。2016 年,在我们的 Velocity 大会上我们讨论了分布式系统、SRE、容器化、无服务架构人员倦怠以及与提供软件相关的人力与技术挑战等诸多问题。以下是我们认为的下一年的趋势
### 1、 分布式系统
我们认为这个很重要,我们[在整个 Velocity 会议上再次关注了它][1]。
### 2、 站点可靠性工程SRE
[站点可靠性工程Site Reliability Engineering][3]SRE-它只是运维么?[或者它是 DevOps 的另外一个名称吗][4]?这是 Google 对那些需要做大量系统及软件工程的运维专业人士的称呼。它由在像 Dropbox 公司的前 Google 人向业内推广,[招聘 SRE 的职位][5]正不断增加特别是有大型数据中心的面向网络的公司。在某些情况下SRE 的作用更多地是帮助开发人员运营自己的服务。
### 3、 容器化
公司将继续容器化它们的软件交付。Docker 公司本身已经将 Docker 定位为“[增量革命][6]”的工具对遗留应用进行容器化已成为企业的常见案例。Docker 的未来是什么?随着工程师继续采用诸如 Kubernetes 和 Mesos 之类的编排工具,更高层次的抽象可能为其他容器(如 rkt、Garden 等)提供更多空间。
### 4、 Unikernels
unikernels 是容器化之后的下一步么?它们不合适产品环境么?有些人吹捧 unikernels 的安全和性能好处。关注一下 unikernels 在 2017 是如何进化的,[特别要关注下 Dokcer 公司在这个领域做的][7]。(今年它已经收购了 Unikernel Systems
### 5、 无服务架构Serverless
无服务架构视功能为基础的计算单元。有些人认为这个术语是误导性的(让人想起 “noops”并且更倾向于把这个趋势称为“功能即服务Functions-as-a-ServiceFaaS。开发人员和架构师正在越来越多地尝试这个技术并期望看到有越来越多的程序用这个范式编写。更多关于 serverless/FaaS 对运维的意义,请查看 Michael Hausenblas 的 [Serverless 运维][8]免费电子书。
### 6、 原生云程序开发
就像 DevOps这个术语已经被市场人员使用并滥用很久了但是云计算基金会Cloud Native Computing FoundationCNCF为这些新工具通常是谷歌发起的做了一个很好的例子这些工具不仅利用了云而且特别还在于分布式系统即微服务容器化和动态编排所提供的优势和机会。
### 7、 监控
随着行业从 Nagios 风格的监控发展到流化指标和可视化,我们在生产越来越多的系统数据,而如何理解它们则是下一个挑战,因此,我们看到供应商开始提供具有机器学习功能的监控服务,以及更普遍的是 IT 运营人员开始去研究让机器学习分析系统数据的技术。同样,随着我们的基础设施变得更加动态和分布式,监控越来越少地检查某个资源的健康状况,更多的是在服务之间追踪流量。因此,分布式跟踪已经出现。
### 8、 DevOps 安全
随着 DevOps 安全的普及,[安全性正在迅速成为团队范围的关注][9]。当重视安全和合规方面的公司在速度的竞争上感到了压力时,要同时满足速度和可靠性的 DevOps 所面对的经典挑战尤其明显。
### 告诉我们关于你的工作
作为一名 IT 运维专业人员 - 你是否使用系统管理的术语如 DevOps、SRE、DBA 等等。- [欢迎你来分享你的见解][10]。
--------------------------------------------------------------------------------
作者简介:
Courtney Nash 主持 O'Reilly Media 的多个会议,是专注于现代网络运维、高性能程序和安全性的战略内容总监。一位前学术神经科学家,她仍然对大脑着迷,以及它如何告诉我们与技术互动和对技术的期望。自从移居西雅图,在一家蓬勃发展的在线书店工作之后,她花了 17 年的时间从事技术行业的各种工作。在外面,你可以看到 Courtney 在骑自行车、徒步旅行、滑雪。。。
O'Reilly Media 的基础架构和运维编辑 Brian Anderson 介绍了从传统系统管理到云计算、Web 性能、Docker 和 DevOps 等软件交付的重要内容。他一直从事在线教育,服务于学习者的需求超过十多年。
--------------------------------------------------------------------------------
via: https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017
作者:[Courtney Nash][a], [Brian Anderson][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.oreilly.com/people/3f5d7-courtneyw-nash
[b]:https://www.oreilly.com/people/brian_anderson
[1]:https://www.oreilly.com/ideas/velocity-a-new-direction
[2]:https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017?imm_mid=0ec113&cmp=em-webops-na-na-newsltr_20170106
[3]:https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering
[4]:http://conferences.oreilly.com/velocity/devops-web-performance-ny/public/content/devops-sre-ama-video
[5]:https://www.glassdoor.com/Salaries/site-reliability-engineer-salary-SRCH_KO0,25.htm
[6]:http://blog.scottlowe.org/2016/06/21/dockercon-2016-day-2-keynote/
[7]:http://www.infoworld.com/article/3024410/application-virtualization/docker-kicks-off-unikernel-revolution.html
[8]:http://www.oreilly.com/webops-perf/free/serverless-ops.csp?intcmp=il-webops-free-lp-na_new_site_top_8_systems_operations_and_engineering_trends_for_2017_body_text_cta
[9]:https://www.oreilly.com/learning/devopssec-securing-software-through-continuous-delivery
[10]:http://www.oreilly.com/webops-perf/2016-ops-survey.html
[11]:http://www.oreilly.com/webops-perf/2016-ops-survey.html

View File

@ -0,0 +1,89 @@
给非英语母语的人从事开源项目的若干建议
====================================================
![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects")
大多数的开源项目的主要语言都是英语,但是开源项目的用户和贡献者却遍布全球。非英语母语的人在参与这个生态系统时会面临许多沟通和文化上的挑战。
在这篇文章中,作为不以英语为母语的 OpenStack 的贡献者的我们将会分享一些所面临挑战——如何去克服它们,还有一些好的方案,它们能够减轻不以英语为母语且刚开始从事的人的焦虑。我们的总部在日本、巴西和中国,每天都会与世界各地的大型 OpenStack 社区合作。
OpenStack 的官方语言是英语,这意味着我们是作为非英语为母语的人士来进行交流。
### 挑战
非英语为母语的人士在开源社区工作时会面临具体沟通挑战:它们与有限的语言技能和文化差异有关。
#### 语言技能
让我们来关注在阅读、写作、听力和口语背后的具体语言技能。
**阅读**:这是最简单也是最重要的技能。最简单是因为:如果你不明白写了什么,你有机会再次阅读它,或者需要的话可以多次阅读。如果你遇到了一个不常见的短语、表达式或者缩写,你可以使用一个词典或者翻译器。在另一方面,它是最重要的技能是因为:对大多数开源项目而言,主要的交流方式都是邮件列表和 IRC。
**写作**:英语语法是一个问题,尤其是对句子结构不同的语言而言。这可能会在用电子邮件进行通信和通过 IRC 频道进行通信时产生问题。对一些人来说,写出又长又漂亮的句子比较困难,而普遍依赖于简单句子,这是因为这些易于书写和理解。
**听力**:这对非英语为母语的人来说比阅读和写作更加困难。通常,英语为母语的人之间的对话在非常快的,这就使得那些仍然处于刚从事阶段的人很难理解他们的讨论,同时也限制了他们参与到讨论当中。此外,试图理解一个遍布全球的社区的各种口音也增加了复杂性。有意思的是,美国人的发音往往比其他的容易理解。
**口语**:口语比听力更加的困难,因为参与者的词汇量可能会比较有限。而且,英语的音素和语法通常与那些母语不是英语的人的母语相差很大,这就使得互动更加的难以理解。
#### 文化差异
在开源社区与其他人交流时,每种文化都有它自己不同的规范。例如,日本人通常不会明确的说好的或者不,他们认为这是尊重别人的一种方式,可以避免彼此间的争论。这通常与其他的文化大不一样,可能会对所表达的内容造成误解。
在中国文化中,人们倾向于只是说好的,而不是说不,或者试图商讨。在一个像 OpenStack 这样的分布于全球的社区里,这通常会导致在表达意见时缺乏自信。另外,中国人喜欢首先列出事实,然后在后面给出结论,而这会对来自其他文化中的人造成困惑,因为这不是他们所期望的。
例如,巴西人可能会认为讨论是以类似的方式进行的;然而,其他文化的反应会很直接和简短,这听起来可能会有点粗鲁。
### 克服障碍
语言技能方面的挑战要比文化差异方面的挑战容易克服。文化差异需要被受到尊重,然而英语技能却总是可以被改善的。
为了刷新你的语言技能,你应该尽可能多地接触该语言。不要担心你的局限,只管尽自己所能,你终将会得到改善。
尽可能多的阅读,因为这有助于你积累词汇。通过日常的聊天和邮件列表进行交流也很有帮助。一些工具,如实时字典和翻译器,对这些平台非常有用。
与别人或者你自己交谈可以帮助你更自如地频繁地说话。进行一对一的对话来表达你的想法比在更大的群体中讨论更容易。
### 新手的融入
来自新手和母语者的一些举措可能会对学习过程产生积极的影响。
#### 新手
说出和写下你的意见,并且提出你的问题;参与其中总是一个练习你的英语的很好的机会。不要害怕。
对于会议,确保你提前准备过,这样你将会对会议主题比较熟悉,而且会对自己要表达的意见更加的自信。
与英语为母语的人结交朋友,多和他们讨论来提高你的英语技能。
用英语写博客和技术文章也是不错的主意。
#### 给英语为母语的人士的建议
请说话慢一点儿,同时使用一些简单的单词和句子。如果你发现了非英语为母语的人使用英语中的一些错误请不要嘲笑他们,尝试鼓励新来的人表达自己的意见,让他们非常舒适地表达意见。
*这篇文章由 Masayuki Igawa、Dong Ma 和 Samuel de Medeiros Queiroz 共同协作完成,可以在 Hobart 的 linux.conf.au 2017([#lca2017][1])[开源社区中的非英语母语者:一个真实的故事][2]中了解更多*
题图opensource.com
-------------------------------------------
作者简介:
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/myface_s.jpg?itok=-dy9_LQd)
Masayuki Igawa 是一名拥有 15 年大量软件项目经验的软件工程师,目前正在开发与 Linux 内核和虚拟化相关开源软件。自 2013 年起,他就一直是一名活跃的 OpenStack 项目贡献者。他是像 Tempest 和 subunit2sql 这样一些 OpenStack QA 项目的核心成员。他目前就职于 HPE 的 Upstream OpenStack 团队,该团队目的是使 OpenStack 更适合所有人。他以前曾在 OpenStack 峰会上发表演讲。
---
via: https://opensource.com/article/17/1/non-native-speakers-take-open-source-communities
作者:[Masayuki Igawa][a]
译者:[zhousiyu325](https://github.com/zhousiyu325)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/masayukig
[1]:https://twitter.com/search?q=%23lca2017&src=typd
[2]:https://linux.conf.au/schedule/presentation/70/

View File

@ -1,13 +1,11 @@
Why every business should consider an open source point of sale system
============================================================
为什么每家企业都应该考虑使用开源的 POS 系统
============================================================
![Why every business should consider an open source point of sale system](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUS_lovemoneyglory2.png?itok=WxnzxyWP "Why every business should consider an open source point of sale system")
图片来源  
图片来源  opensource.com
opensource.com
销售点终端 (POS) 系统是从很久以前的简单的收银机发展而来的。如今的 POS 系统可以提供一体化解决方案,包括支付流程,库存管理,营销工具等等。零售店也可以使用移动设备来接收现金流和各种成本支出相关的日报表。
销售点终端 (POS) 系统是从很久以前的简单的收银机发展而来的。如今的 POS 系统可以提供一体化解决方案,包括支付流程、库存管理、营销工具等等。零售店也可以使用移动设备来接收现金流和各种成本支出相关的日报表。
POS 系统是每家企业重要的生命线,那就意味着你在选择 POS 系统的过程中要非常谨慎。目前可供选择的收银系统也很多,但是如果你想节约成本,适应不断变化的业务需求,跟上技术发展的脚步,你应该很明智地考虑使用开源系统。你可以随意使用一款源代码公开的开源 POS 系统,这比那些严格保密源代码的专有系统要有更大的优势。
@ -15,7 +13,7 @@ POS 系统是每家企业重要的生命线,那就意味着你在选择 POS
### 无限的灵活性
开源系统与其它系统的兼容性非常好。它们与第三方厂家系统进行集成的能力——从帐务和客户关系管理软件到订单管理和库存管理系统——当企业管理者想要扩展专有 POS 系统以外的其它功能时,开源系统有更强大的优势。
开源系统与其它系统的兼容性非常好。它们与第三方厂家系统进行集成的能力——从帐务和客户关系管理软件CRM到订单管理和库存管理系统——使得当企业管理者想要扩展专有 POS 系统以外的其它功能时,开源系统有更强大的优势。
在 [2014 年科技调查][7] 活动中,很多餐厅管理者声称 POS 系统的功能集成度将会是他们考虑更换新系统的主要因素。这是开源系统最具亮点的一方面。专有系统买来什么样就是什么样,很难与其它厂家的系统进行集成。但是使用开源系统,你就可以进行无限的集成及定制功能。如果你觉得你们公司的商业模式会不断的增长和变化,那么只有考虑使用开源的 POS 系统才能根据需要实时调整系统。
@ -25,11 +23,11 @@ POS 系统是每家企业重要的生命线,那就意味着你在选择 POS
### 更低的成本
也就是说,“更低的成本”意味着“基本免费”。你还需要购买相关硬件产品,只是软件本身是免费使用的。开源 POS 系统不像专有 POS 系统那样在购买时或是后期维护过程中需要支付高昂的费用,其每年的维护费在 3000 至 50000 美元之间,开源系统也不会像专有系统那样需要花钱来购买。
也就是说,“更低的成本”意味着“基本免费”。你还需要购买相关硬件产品,只是软件本身是免费使用的。开源 POS 系统不像专有 POS 系统那样在购买时或是后期维护过程中需要支付高昂的费用,其每年的维护费在 3000 至 50000 美元之间,而开源系统则不会像专有系统那样需要花钱来购买。
在 [2013 年版][8] 的餐饮行业技术服务调查研究过程中,有超过一半的受访餐厅老板表示他们从很多的技术产商购买服务——有些餐厅所面对的技术厂家多达 10 个。而使用纯粹的开源定制化系统不需要支付维护费用,这从节约成本上来说意义非常重大。
然而,有一点我还得提醒大家。如果你们公司没有一个技术精湛的员工提供技术支持,你可能还需要聘请外部技术人员来帮助你们安装,调试和升级系统。开源系统允许用户无限制集成和定制化开发,但是你还需要有技术精湛的专家来支持才行,这也会产生额外的费用。尽管如此,开源系统仍然是一个非常具有成本效益的选择。
然而,有一点我还得提醒大家。如果你们公司没有一个技术精湛的员工提供技术支持,你可能还需要聘请外部技术人员来帮助你们安装,调试和升级系统。开源系统允许用户无限制集成和定制化开发,但是你还需要有技术精湛的专家来支持才行,这也会产生额外的费用。尽管如此,开源系统仍然是一个非常具有成本效益的选择。
### 更好的安全性

View File

@ -0,0 +1,70 @@
10 个使用 Cinnamon 作为 Linux 桌面环境的理由
============================================================
> Cinnamon 是一个让人怀旧 GNOME 2 的 Linux 桌面环境,它灵活、快速,并提供了种种的功能。
![10 reasons to use Cinnamon as your Linux desktop environment](https://opensource.com/sites/default/files/styles/image-full-size/public/cinnamon.jpg?itok=rPZvjqGr "10 reasons to use Cinnamon as your Linux desktop environment")
最近我安装了 Fedora 25我觉得当前的 [KDE][3] Plasma 版本并不稳定。在我决定尝试其它的桌面之前一天崩溃了好几次。在我安装了几个其它的桌面,并每个尝试了几个小时后,我最终决定在 Plasma 打上补丁并且稳定之前就使用 Cinnamon 了。以下是我所发现的。
### Cinnamon 简介
在 2011带有新的 GNOME Shell 的 GNOME 3 发布了,新的界面马上引来了或正或反的反馈。许多用户以及开发者非常喜欢原先的 GNOME 界面,因此有多个组织复刻了它,其中一个结果就是 Cinnamon。
开发 GNOME 3 的 GNOME shell 背后的原因之一是许多原先的 GNOME 用户界面组件不再活跃开发了。这同样也是 Cinnamon 以及其他 GNOME 复刻项目的问题。 Linux Mint 项目是 Cinnamon 的一个首要推动者,因为 GNOME 是 Mint 的官方桌面环境。Mint 开发者已经将 Cinnamon 推进到了不需要 GNOME 本身的地步Cinnamon 已经是一个完全独立的桌面环境,它保留了许多用户喜欢的 GNOME 界面的功能。
![cinnamon-desktop-environment.jpg](https://opensource.com/sites/default/files/images/life-uploads/cinnamon-desktop-environment.jpg)
*图 1打开系统设置工具的默认 Cinnamon 桌面。*
Cinnamon 3.2 是当前发布版本。除了 MintCinnamon 还在许多发行版中可用,包括 Fedora、Arch、Gentoo、Debian 和 OpenSUSE 等。
### 使用 Cinnamon 的理由
这是我的使用 Cinnamon 的 10 个重要理由:
1. **集成。** 桌面的选择并不取决于在较长时间内是否有为它写的应用。我使用过的所有应用程序不管它是在哪个桌面下写的它都可以在任何其它桌面上运行正常Cinnamon 也不例外。要运行那些为 KDE、GNOME 或其他桌面编写的程序所需要的库都有,可以在 Cinnamon 上面顺滑地使用这些程序。
2. **外观。** 让我们面对它外观是很重要的。Cinnamon 有一个明快的、干净的外观,它使用了易于阅读的字体以及颜色的组合。桌面没有不必要的阻碍,你可以使用“系统设置” => “桌面” 菜单配置显示在桌面上的的图标。这个菜单还允许你指定是否在主监视器、次监视器或者所有监视器上显示桌面图标。
3. **桌面组件。** 桌面组件是一些小型的、可以添加到桌面的单一用途的程序。只有一些是可用的,但是你可以从 CPU 或者磁盘监视器、天气应用、便利贴、桌面相簿、时间和日期等之中选择。我喜欢时间和日期桌面组件,因为它比 Cinnamon 面板中的小程序易于阅读。
4. **速度。** Cinnamon 快速又敏捷。程序加载和显示很快。桌面自身在登录时加载也很快,虽然这只是我的主观体验,并没有基于时间测试。
5. **配置。 ** Cinnamon 不如 KDE Plasma 那样可配置但是也要比我第一次尝试它的时候有更多的配置。Cinnamon 控制中心提供了许多桌面配置选项的集中访问。它有一个主窗口,可以从它启动特定功能的配置窗口。可以很容易地在 “系统设置” 的 “主题” 的可用外观中选择新的外观。你可以选择窗口边框、图标、控件、鼠标指针和桌面基本方案。其它选择还包括字体和背景。我发现这些配置工具中有许多是我遇到的最好的。它有适量的桌面主题,从而能够显著改变桌面的外观,而不会像 KDE 那样面临选择困难。
6. **Cinnamon 面板。** Cinnamon 面板,即工具栏,最初的配置非常简单。它包含用于启动程序的菜单、基本的系统托盘和应用程序选择器。这个面板易于配置,并且添加新的程序启动器只需要定位你想要添加到主菜单的程序,右键单击程序图标,然后选择“添加到面板”。你还可以将启动器图标添加到桌面本身,以及 Cinnamon 的 “收藏” 的启动栏中。你还可以进入面板的**编辑**模式并重新排列图标。
7. **灵活性。** 有时可能很难找到最小化或者隐藏的正在运行的程序,如果有许多正在运行的应用程序,则在工具栏的程序选择器上查找它可能会有挑战性。 在某种程度上,这是因为程序并不总是有序地排在选择器中使其易于查找,所以我最喜欢的功能之一就是可以拖动正在运行的程序的按钮并将其重新排列在选择器上。这可以使查找和显示属于程序的窗口更容易,因为现在它们现在在我放的位置上。
Cinnamon 桌面还有一个非常好的弹出菜单,你可以右键单击访问。此菜单有一些常用任务,例如访问桌面设置、添加桌面组件以及其他与桌面相关的任务。
其它菜单项之一是 “创建新文档”,它使用位于 `~/Templates` 目录中的文档模板,并列出它们中的每一个。只需点击要使用的模板,使用这个模板的文档就会使用默认的 Office 程序创建。在我的情况下,那就是 LibreOffice。
8. **多工作空间。** Cinnamon 像其他桌面环境一样提供了多个桌面。Cinnamon 称它为“工作区”。工作区选择器位于 Cinnamon 面板中并展示每个工作区的窗口概览。窗口可以在工作区之间移动或指定到所有工作区。我确实发现工作区选择器有时候会比窗口位置的显示慢一些,所以我将工作区选择器切换为显示工作区编号,而不是在工作区中显示窗口概览。
9. **Nemo。** 大部分桌面因种种目而使用它们自己偏好的默认程序Cinnamon 也不例外。我偏好的桌面文件管理器是 Krusader但是 Cinnamon 默认使用 Nemo因此在测试中我就用它了。我发现我很喜欢 Nemo。它有一个美丽干净的界面我喜欢大部分功能并经常使用。它易于使用同时对我的需求也足够灵活。虽然 Nemo 是 Nautilus 的复刻,但是我发现 Nemo 更好地被集成进了 Cinnamon 环境。Nautilus 界面看上去没有与 Cinnamon 很好集成,与 Cinnamon 不太和谐。
10. **稳定性。**  Cinnamon 非常稳定且可用。
### 总结
Cinnamon 是 GNOME 3 桌面的复刻,它看上去像一个前所未有的 GNOME 桌面。它的发展看起来是符合逻辑的改进, Cinnamon 开发者认为需要在提升和扩展 GNOME 的同时保留它的独特性以及被大家非常喜欢的特性。它不再是 GNOME 3 - 它是不同的并且是更好的。Cinnamon 看上去很棒,并且对我而言也工作得很好,并且从 KDE 这个我仍旧非常喜欢的环境切换过来也很顺畅。我花费了几天时间学习 Cinnamon 的差异如何使我的桌面体验更好,并且我非常高兴了解这个很棒的桌面。
虽然我喜欢 Cinnamon但我仍然喜欢体验其它的环境我目前正切换到 LXDE 桌面,并已经用了几个星期。在我使用一段时间时候,我会分享我的 LXDE 体验。
(题图: [Sam Mugraby][1]Photos8.com. [CC BY 2.0][2]
--------------------------------------------------------------------------------
作者简介:
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/david-crop.jpg?itok=oePpOpyV)
David Both 是一个 Linux 和开源倡导者,他居住在北卡罗莱纳州的 Raleigh。他在 IT 行业已经超过 40 年,在他工作的 IBM 公司教授 OS/2 超过 20 年,他在 1981 年为最早的 IBM PC 写了第一个培训课程。他教过 Red Hat 的 RHCE 课程,在 MCI Worldcom、 Cisco 和北卡罗莱纳州 工作过。他一直在使用 Linux 和开源软件近 20 年。
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/1/cinnamon-desktop-environment
作者:[David Both][a]
译者:[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/dboth
[1]:https://commons.wikimedia.org/wiki/File:Cinnamon-other.jpg
[2]:https://creativecommons.org/licenses/by/2.0/deed.en
[3]:https://opensource.com/life/15/4/9-reasons-to-use-kde

View File

@ -1,8 +1,8 @@
如何从参与开源项目的过程中获取自信
===============
![如何从参与开源项目的过程中获取自信](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/open_community_lead.jpg?itok=anXgpnwG "How to gain confidence to participate in open source")
图片来源:[Gabriel Kamener, Sown Together][1] 原创,经 Jen Wike Huger 修改。
随着大脑的发育,你渐渐学会了这世上什么事情可以/应该做,以及什么事情不能/不应该做。你所有的行为都受到周围大众的影响,很多时候,阻碍你参与某事的原因就是你缺乏自信。
@ -18,13 +18,13 @@
你要时刻谨记着:你是完全独立的个人,他人对你做出的评论就像是不存在一样,只有这样才能更好的获得自信。
我们都习惯了这样理解,周围的人都是根据我们的行为来做出评判的。这一习惯相当于学习如何更像社会群体一样生活的副产品。而且很可能在我们的童年,父母根据我们的行为设置的奖励机制时,这个习惯就根植我们心底。到了青春期,老师们对我们的表现来评价,给我们划分等级和分数,拿我们和身边的小伙伴对比。这样的动力和奖励机制给我们的大脑建立了一个包括自我反思在内的反馈回路。我们需要预测自己能否得到回报,并要为那些可能发生的事情做好应对。
我们都习惯了这样认知,周围的人都是根据我们的行为来做出评判的。这一习惯是学习如何更像社会群体一样生活的副产品。而且很可能在我们的童年,父母根据我们的行为设置的奖励机制时,这个习惯就根植我们心底。到了青春期,老师们对我们的表现来评价,给我们划分等级和分数,拿我们和身边的小伙伴对比。这样的动力和奖励机制给我们的大脑建立了一个包括自我反思在内的反馈回路。我们需要预测自己能否得到回报,并要为那些可能发生的事情做好应对。
现今的我们都有这样第一个疑惑:身边的人是如何看我的?然而,真相是多数人都不会花太多时间来对你进行正确客观的评价。我们所有人只是关注自己的回报,我们有自己热衷于某件事的的热情、有大量急待解决的问题。也有一些人忙于关心他们自己如何影响身边的人,他们并不会在身上花费时间。他们根本不会注意到你是否出错、大声谈话还是向他们的背景乐一样。所有的那些疑惑都只是在你自己的脑海中而已,而非在其他任何人脑中。
现今的我们都有这样第一个疑惑:身边的人是如何看我的?然而,真相是多数人都不会花太多时间来对你进行正确客观的评价。我们所有人只是关注自己的回报,我们有自己热衷于某件事的的热情、有大量急待解决的问题。也有一些人忙于关心他们自己如何影响身边的人,他们并不会在身上花费时间。他们根本不会注意到你是否出错、大声谈话还是像他们的背景音乐一样。所有的那些疑惑都只是在你自己的脑海中而已,而非在其他任何人脑中。
我们需要人们所接受的愿望也是人生意义的一部分,但是这类受我们所遇之人的一时兴起。这些人可能对我们缺乏全面认识,比如我们叫什么、我们来自哪里、形成我们认知的经历,等等。我们能否为人们所接受是一件不受我们自身控制的事情。但是,我们是可以通过与之交流来改变的。
我们需要人们所接受的愿望也是人生意义的一部分,但是这类受我们所遇之人的一时兴起。这些人可能对我们缺乏全面认识,比如我们叫什么、我们来自哪里、形成我们认知的经历,等等。我们能否为人们所接受是一件不受我们自身控制的事情。但是,我们是可以通过与之交流来改变的。
在开源的高密度社区的世界里,记住这一点是非常重要的:人们是不会过多的考虑你的。因为你的同事和导师都在忙于其他项目或则社区成员。
在开源的社区化世界里,记住这一点是非常重要的:人们是不会过多的考虑你的感受的。因为你的同事和导师都在忙于其它项目或则社区成员。
一旦你认知了这一点,通过积极地沟通来热情拥抱这个世界吧。寻求帮助、告知他人你的需求、指出你的贡献、让人们知道你和他们在一起努力、你也是这个社区中的活跃分子。当人们向你靠拢 ——而非相反 —— 时,你的开源可信度和自信会得到极大的提高。
@ -32,9 +32,9 @@
任何成功的开源社区都是一个包含教和学的社区。为沐浴在开源中,你不仅需要用到自身的已有知识,还需要不断的吸收消化其他人提供课程中的知识。幸运的是,人们都普遍热衷于分享他们熟悉的事情。
思考一下,当他人问及你的观点时,你是什么感受。得知他人认可了你所说的观点,对你的 ID 和个人精神是多么美好的一件事。
思考一下,当他人问及你的观点时,你是什么感受。得知他人认可了你所说的观点,对你的本我和自我是多么美好的一件事。
在儿童期时,我们的大脑并没有那么发达,无法为我们容纳现实世界中大量的信息量。我们曾一度认为自己是世界的中心。在六岁以前,我们的认知一直在不断成长。在此期间,我们的父母会因我们哭泣而做出回应,周围的成年人都会满足我们要求。这会在我们心底形成自己在世界上最重要的证据。
在儿童期时,我们的大脑并没有那么发达,无法为我们容纳现实世界中大量的信息量。我们曾一度认为自己是世界的中心。在六岁以前,我们的认知一直在不断成长。在此期间,我们的父母会因我们哭泣而做出回应,周围的成年人都会满足我们要求。这会在我们心底形成自己在世界上最重要的证据。
我们的神经回路在此期间建立完成,我们的性格也在此期间形成。随着我们学会参与社会和城市的生活,我们逐渐的认识到自己并非世界的中心。然而,最初形成并深植我们心底那种意识并不会因此马上就消除掉。正确理解我们在整个社会氛围中的个人意识将有助于你与他人建立连接并融洽相处。
@ -44,10 +44,9 @@
自信的人也许会说“是的,我不知道”,但却不会因此而沮丧。
### 一分耕耘,一分收获 (You reap what you sow)
### 一分耕耘,一分收获
你一定听过“不懂装懂,永远是饭桶”。这样说吧,自信就像其他很多的心理现象。
积极地提示自己:我很聪明、有趣、引人关注、极富天赋、健谈、是一个很好的伙伴、独一无二、知识面广、学习能力强、常常自省的思想者,或者是其他你想要具备的特质,久而久之你就会觉得自己就是这样的人。并且,如果这可以在你身上生效,在其他人身上也一样。。
你一定听过“不懂装懂,永远是饭桶”。这样说吧,自信就像其他很多的心理现象。积极地提示自己:我很聪明、有趣、引人关注、极富天赋、健谈、是一个很好的伙伴、独一无二、知识面广、学习能力强、常常自省的思想者,或者是其他你想要具备的特质,久而久之你就会觉得自己就是这样的人。并且,如果这可以在你身上生效,在其他人身上也一样。。
我们把这个称为自我肯定。
@ -55,13 +54,15 @@
那么,你是否有其他增强自信的方法呢?记得在评论区告诉我们哦。
(题图:[Gabriel Kamener, Sown Together][1] 原创,经 Jen Wike Huger 修改。)
----------------------------------
作者简介:
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/profilepicsq_0.jpg?itok=CVMJs36A)
Laura Hilliger - 艺术家、教育事业者、作家、技术专家。她是一个多媒体设计师和开发者、技术联络员、项目经理、一个开放且喜欢协作环境的网络黑客。她主张变革,目前为发展壮大绿色和平组织辛勤工作。Alum @MozillaUC BerkeleyBAVC Adobe。Twitter @epilepticrabbit
Laura Hilliger - 艺术家、教育事业者、作家、技术专家。她是一个多媒体设计师和开发者、技术联络员、项目经理、一个开放且喜欢协作环境的网络黑客。她主张变革,目前为发展壮大绿色和平组织辛勤工作。Alum @MozillaUC BerkeleyBAVC Adobe。Twitter @epilepticrabbit
----------------------------------

View File

@ -0,0 +1,128 @@
六大标志性的开源形象概览
=====================
![六大标志性的开源形象概览](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_brandbalance.png?itok=opwotgEh "A look at 6 iconic open source brands")
品牌是营销的重要组成部分。完成了品牌的塑造并形成一定的影响力之后,一个简单的 Logo (比如说耐克旋风一样) 就会成为这个品牌的强大广告。如果你常常在美国各州之间穿梭你将会看各种描述品牌的标志符号如麦当劳的金色拱门golden arches。即便是没有任何文字或图像的简单色彩组合也是可以用来作为一个品牌的比如美国弗吉尼亚理工大学的栗色和橙色这种独特的色彩结合是很难被认错的。
所以,现在的问题是:品牌对于开源社区是否真的那么重要呢?
对于我和其他很多的人来说,是的,非常重要。开源软件要与付费软件进行竞争,那么它必须要将自己定义为切实可行的替代品。并且,它也必须要让人容易记住以及形成一定程度的影响力。如果某个开源软件项目以一种设计难看的 Logo、糟糕的口号、前后矛盾的信息来表现自己的话那它就很难引起大众的注意、难以记住和得到广泛使用。
现有很多项目这方面做得很好,我们可以从中寻找灵感和指导方法。以下是我最喜欢的六个开源品牌。
### 六大开源品牌
#### Linux
![Linux&#039;s Tux 吉祥物](https://opensource.com/sites/default/files/resize/linux-300x354.png "Linux&amp;#039;s Tux mascot")
这个可爱的 Linux 企鹅叫做 Tux人们通常将其称为吉祥物而非 Logo。
Tux 是 Larry Ewing 在 1996 年使用 GIMP 0.54 创建出来的。按 Jeff Ayers 讲述的[故事][4]:自从 Linus Torvalds 1993 年在澳大利亚的某个动物园被一只企鹅咬了一口之后他就特别的钟爱它们。Torvalds 当时正在为 Linux 寻找一个有趣的形象他觉得一个饱食后正在休息的胖企鹅是一个不错的选择。Tux 同时也出现在视频游戏和麦片广告中,它甚至还有一个叫做 Gown 的异性同伴。正如 Mac 用户熟知那个被咬了一口的苹果、Windows 用户熟知那个飘动的窗口那样,作为 Linux 用户,你肯定也非常熟悉 Tux。
#### Mozilla
![Mozilla 2017 的新 Logo ](https://opensource.com/sites/default/files/resize/mozilla_1-650x185.png "Mozilla new logo 2017")
[Mozilla][5] 基金会是一个非营利组织和 [自由软件社区][6]。
近期,它完成了[品牌重建行动][7],其创意团队负责人 Tim Murray 这样写道:“该项目的核心就是应让人们更好地理解 Mozilla 自身的目的和商标的需求而生。我们的品牌标识,包括 Logo、口号及其设计是我们用以传递我们自身的信仰和所做的工作的重要信号。”
以真正的开源方式Mozilla 邀请所有的人来为项目贡献自己的力量。“数千个电子邮件、数百场会议、几十种理念,以及之后的三轮讨究,我们把自己的想法都分享了出来。”但是,他们仍然遵循指导方针进行,还需要你参与到贡献中来。
#### Firefox
![Firefox logo](https://opensource.com/sites/default/files/firefox_0.png "Firefox logo")
[Firefox][8] 是 Mozilla 开发的一款旗舰级软件产品,是一个非常受欢迎的 [web 浏览器][9]。
Firefox 中的 "fox" 实际上是一只红色的熊猫这是一种中国本土的像猫一样的真实动物。故事是这样的Firefox 原本有个 "Phoenix" 的别称,表明它是由 Netscape 浏览器发展而来的。但在经历了 Phoenix 科技的商标起诉之后,它更名为 Mozilla Firebird。然后Firebird RDMS 项目说它给其自己项目带来了歧义,其名称最终在 2004 年 02 月变更为 Mozilla Firefox。
平面设计师 Steve Garrity 对 Firefox 和 Phoenix 早期的 Logo 作出了批评,在“[品牌化 Mozilla走向 Mozilla 2.0][10] ”一文中详细阐述了各种缺陷。所以Mozilla 邀请 Garrity 来领导更好的品牌化工作。新的形象是由 silverorange 开发出来的,但最终的渲染却是 Jon Hicks 完成的,他同时也为 Camino、MailChimp 和 Opera 进行过品牌化工作。
早在 2013 年,[Jeopardy!][11] 上边关于询问 Firefox 使用哪个动物做 Logo 的帖子则成了最后的线索。三位回答者都不知道答案就是一个红色熊猫,而是回答了 “su”、 “raccoon” 和 “Excel”。
#### GIMP
![Wilber the Gimp logo](https://opensource.com/sites/default/files/resize/gimp-300x300.png "Wilber the Gimp logo")
GIMP 的 Logo 是由 Tuomas Kuosmanen 在 1997 年 09 月 25 日创建的 [Wilber the GIMP][12]。
GIMP 是 GNU 图像处理程序GNU Image Manipulation Program的缩写主要用于相片修整和图像处理。Wilber 现在已经有了一些配饰,比如 Simon Budig 设计的一顶安全帽、Raphaël Quintet 设计的巫师帽。根据 GIMP 的“[链接到我们][13]” 页面,它高度鼓励人们使用 Wilber你甚至可以在源代码中的 `/docs/Wilber_Construction_Kit.xcf.gz` 获得 Wilber 的构建素材。
那么Wilber 到底是那一种生物呢?很显然,这是一个值得热烈讨论的问题。在 [gimper.net][14] 上的一个论坛众说纷纭一种产于北美大草原的小狼coyote、熊猫、狗或者“高飞”Goofy的一种衍生形象仅举几例。而 [GimpChat.com][15] 上一位叫做 TheWarrior 的用户直接发邮件给 Wilber 的创造者 Kuosmanen被告知说 “Wilber 是一种独立物种的动物 —— 就叫 GIMP。什么是 GIMP这是个玩笑因为人们一直在问说它是一只狗、狐狸或者其他什么的就太没意思了。我设计的这一个形象的时候在我脑袋中并没有特定哪种动物原型。”
#### PostgreSQL
![PostgreSQL logo](https://opensource.com/sites/default/files/postgresql.png "PostgreSQL logo")
正如你所见和熟悉的一样,使用动物头像来做 Logo 非常普遍。
一只名为 [Slonik][16] 的大象就是 [PostgreSQL][17] 的 Logo 的一部分,这是一个开源的关系型数据库管理系统 RDMS。Patrycja Dybka 在 Vertabelo 上写过博文解释了这一名称是由俄语单词的大象slony演化而来的。Oleg Bartunov 也说过,这个 Logo 是在一个[邮件讨论][18]中初步形成的。在讨论里,在费城圣约瑟夫大学的 David Yang 建议使用大象:“……但如果你想要一个动物头像的 Logo那么使用某种大象如何 毕竟就像阿加莎·克里斯蒂(侦探小说家 Agatha Christie说的那样_大象让人印象深刻_。”
#### VLC 媒体播放器
![VLC logo](https://opensource.com/sites/default/files/resize/vlc-300x340.png "VLC logo")
该 Logo 不再是动物主题了,而是交通锥筒。
VLC 是一款无处不在的媒体播放器它神奇地出现在很多人的桌面电脑上让很多人体验到了开源即使不知道它是开源的。VLC 是由总部在法国的 VideoLAN 组织所支持的 VideoLAN 项目的一款产品。VideoLAN 源自 1996 年在法国中央理工大学的一个学生项目。根据维基百科的描述,这个交通锥标图标参考了由法国中央理工大学的网络学生协会收集自巴黎街道上的交通锥筒。最初的手绘 Logo 在 2006 年由 Richard Oistad 重新进行了渲染。
一些有趣的花絮:
* Seamus Islwyn 的帖子 “[VLC 中的交通锥表达了哪些含义?][1]” 告诉我们在十二月的时候VLC 锥筒会戴着一顶圣诞帽,但在 12 月 31 日它就会消失不见,恢复原样的锥筒。
* 有人说VLC 的意思是 “非常大的锥筒Very Large Cone” 或者选用它仅仅是为了和法国那些交通锥筒相关联而已。
* “官方” 的故事背景是否准确?在 VLC 的 jean-baptiste Kempf 和用户在 [VideoLAN 论坛][2] 上的交流似乎表明,交通锥筒收集说法以及漏斗、建筑区、扩音器和其他一些说法,可能是不正确的。
我们是否完全解答了 VLC 的交通锥筒起源的问题了呢?我个人觉得:那就是 “星期六夜现场” 的尖头外星人。他们就是来自法国的,记得吗?确切地说是来自 Remulak 星球。
**我很期待看到你关于自己喜欢、讨厌以及为它所代表的品牌而倍感激动的那些开源 Logo 的评论。**
题图opensource.com
------------
作者简介:
Jeff Macharyas - 他有多年的出版和印刷工作经验他曾担任过快速印刷、美国观察家、USO 巡逻、今天校园和其他出版物的艺术总监以及项目经理、编辑和发行经理。杰夫持有佛罗里达州立大学的通信信息、罗格斯大学的社会媒体营销研究生证书以及 Utica 学院的网络安全与计算机取证硕士学位。
------------
译者简介:
[GHLandy](http://ghlandy.com) —— 另一种生活中,有属于你也适合你的舞台。或许有你狠心放弃的专业,或者不必上妆,不用摆出另外一副面孔。—— 摘自林特特《以自己喜欢的方式过一生》
------
via: https://opensource.com/article/17/2/six-open-source-brands
作者:[Jeff Macharyas][a]
译者:[GHLandy](https://github.com/GHLandy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/jeffmacharyas
[1]:http://www.ehow.com/info_10029162_traffic-cone-mean-vlc.html
[2]:https://forum.videolan.org/viewtopic.php?f=5&t=92513
[3]:https://opensource.com/article/17/2/six-open-source-brands?rate=Lmf1lD4etve4Apqfhw3NUV3SeENsNXhGqTh8OO4PzzQ
[4]:https://en.wikipedia.org/wiki/Tux
[5]:https://www.mozilla.org/en-US/
[6]:https://en.wikipedia.org/wiki/Mozilla
[7]:https://blog.mozilla.org/opendesign/arrival/
[8]:https://en.wikipedia.org/wiki/Firefox
[9]:https://en.wikipedia.org/wiki/Web_browser
[10]:http://actsofvolition.com/steven/mozillabranding/
[11]:http://www.complex.com/pop-culture/2013/09/firefox-jeopardy-answer
[12]:https://www.gimp.org/about/ancient_history.html
[13]:https://www.gimp.org/about/linking.html
[14]:https://gimper.net/threads/what-is-wilber.793/
[15]:http://gimpchat.com/viewtopic.php?f=4&t=10265
[16]:http://www.vertabelo.com/blog/notes-from-the-lab/the-history-of-slonik-the-postgresql-elephant-logo
[17]:https://wiki.postgresql.org/wiki/Logo
[18]:http://www.pgsql.ru/db/mw/msg.html?mid=1238939
[19]:https://opensource.com/user/83821/feed
[20]:https://opensource.com/article/17/2/six-open-source-brands#comments
[21]:https://opensource.com/users/jeffmacharyas

View File

@ -0,0 +1,64 @@
教职人员是否可以运用维基百科教学?
============
![Can academic faculty members teach with Wikipedia?](https://camo.githubusercontent.com/47dfe3fec215387fa7bb1f2c038f4e78e0e2e47d/68747470733a2f2f6f70656e736f757263652e636f6d2f73697465732f64656661756c742f66696c65732f7374796c65732f696d6167652d66756c6c2d73697a652f7075626c69632f696d616765732f656475636174696f6e2f4544555f61636164656d6963735f353230783239325f6d612e706e673f69746f6b3d397846574f637436)
图片来自 : opensource.com
自从 2010 年,已经有 29000 个学生完成了 Wiki Ed 这一项目。他们在维基百科上添加了 2500 万词条,相当于 85000 页纸张的内容。这相当于最新出版的 Britannica 百科全书中全部词条的 66%。Wiki Ed 的学生们最积极的时候,他们贡献了维基百科上 10% 的内容, 极大地补充了贫乏的学术板块。
为了了解更多关于这个项目的信息,我联络了 LiAnna Davis -- Wiki Ed 项目的负责人。他极富热情地同意来回答我的问题。
提示:[Wiki 教育基金会 (Wiki Ed)](https://wikiedu.org/) 的平台是用自由软件搭建的,你可以在这里找到: [WikiEdu Dashboard GitHub](https://github.com/WikiEducationFoundation/WikiEduDashboard)。
**Wiki Ed 这一项目是如何启动的?说说你的背景以及你是如何参与进这个项目的。**
在2010年[维基基金会](https://wikimediafoundation.org/wiki/Home)(简称 WMF运营维基百科的非营利组织注意到了一个趋势 -- 大学的教职人员如果本身也是维基词条的编辑者会成功地将编辑维基词条作为一项任务交给了自己课堂里的学生。WMF 就此开展了一个试行项目试图解决这个问题:如果本身不编辑维基词条的教职人员支持课程中包含维基词条的编辑任务,他们是否可以通过维基百科实现教学呢?
我是这个团队的一员,在 2010 年被试行雇用,我对这个问题的回答是:“可以。” 在 2013年WMF 将这个项目的美国分部和加拿大分部拆分,形成了一个新的非营利性组织 -- 维基教育基金会( Wiki Ed自此我也从 WMF 到了Wiki Ed。自那以后我们便成为了一个独立组织我们可以专注于这个项目并且将这个项目拓展开来 -- 起初 WMF 时期每年只有 75 个班级参与,而这个学期已经有 275 班级参与了 Wiki Ed。
**人们总是觉得大学生对科技相关的一切事物都很敏感,尤其是互联网,但是你们的网站上写道,“大学本科学生可能具有高科技敏感度,但这并不代表他们具有数字信息素养。” 你可以稍微解释一下这句话吗?**
仅仅因为一个人可以搞明白自己的 iPhone 如何使用不代表他们可以明辨他们在网上阅读的信息是否值得信赖。 [斯坦福的一项研究](https://sheg.stanford.edu/upload/V3LessonPlans/Executive%20Summary%2011.21.16.pdf) (“评估信息:公民在线推理的基石 November 22, 2016.”)在近期表明:学生们并不具有数字信息素养。然而,当学生们在撰写维基百科文章之时,他们必须这样。他们需要严格遵守维基百科的[可信来源](https://en.wikipedia.org/wiki/Wikipedia:Identifying_reliable_sources) 规范,这些规范明确了维基百科上的任何信息都必须注明来源,这些来源必须是独立的,而且是可以追溯的事实。对于很多学生,这样注明来源还是第一次,多数人之前仅仅是通过谷歌搜索话题或者注明他们亲眼所见的第一手资料来进行资料的检索和查证。他们需要理解哪些资料可靠,哪些资料不可靠,从而成为足够成熟的电子信息消费者。
**你想对那些声称“维基百科不是一个可靠的来源”的人说些什么?**
维基百科是一本百科全书,根据在词典中的定义,它是一个第三手资料。当学生们开始读本科的时候,他们应该学会参考一手和二手资料,而不是第三手资料,因此学生不应该,且不能引用维基百科的内容。但是维基百科在研究之初会是一个不错的选择,它可以给你对这个话题一个广泛的认识,并且帮你发现页面底部那些你可以参考的文章来源。就像我们所鼓励的:“不要引用!用你的语言写!”
> 这样做可以让学生们代入知识生产者的身份,而不是知识的消费者……
**一个教授在 Wiki Ed 项目中的参与是如何影响到他的学生的呢?**
通过运用维基百科教学,导师们可以给学生们提供有价值的媒体素养、批判性思维、线上交流以及写作能力,不论他们在毕业之后会继续选择科研或是加入工作大军,这些极富价值的品质和技能都能帮助他们成功。这样做可以让学生们代入知识生产者的身份,而不是知识的消费者,而且这可以给予他们一个真正在这个世界做出改变的机会,而不是学生们到了学期末便会抛之脑后的生硬习题。
我们正在积极鼓励新的班级在春季学期加入这个项目。感兴趣的教职人员可以点击 [维基教育基金会的教学页](https://teach.wikiedu.org/) 由此开始。
**一个教师会需要哪些职业素养来参与这个项目?学生又是需要哪些训练呢?**
当你在[维基教育基金会的教学页](http://teach.wikiedu.org/)上注册的时候,你会发现 Wiki Ed 为新加入的教职人员提供了如何运用维基百科实现教学的在线指南。我们还有为学生提供的一系列的在线训练,根据他们不同的任务自动分配不同的指南(例如,如果你希望你的学生在文章中插入图片,他们会得到一个如何插入编辑图片的教学单元,如果你不需要,他们便不会得到这个单元的指南)。在部分十几个学科中,我们还有特定的指南书展示了这几个学科的特定编辑方式。除此之外,我们还有熟练维基百科编辑的工作人员帮助回答学生和导师们的问题。我们的系统已经在逐步扩大;我们在这个秋季学期已经支持了超过 6300 个学生,并且已经适应了与没有维基编辑经验的教职人员合作,因此这样就保证了没有人会因为资历不够而无法参与。
**“<ruby>访问学者<rt>Visiting Scholars</rt></ruby>”这个项目是指?**
我们正在试着建立学术界和维基百科之间的联系,而鼓励运用维基百科教学的项目只是其中的一环。在“<ruby>访问学者<rt>Visiting Scholars</rt></ruby>”这一项目中,大学图书馆或者教学部门将公开他们的资料,并提供给一个缺乏资料的认证的维基百科编辑人员(被称作是“访问学者”)。通过大学这一渠道,“访问学者”们可以有机会使用这些资源来完善维基百科广泛领域中的文章。这是一个规模相对小却伟大的项目,因为我们花了很多时间来建立这样的联系,但是这些“学者”们都产出了许多真的很精彩的内容。
**你的合作伙伴有谁?他们的参与如何影响到你现在的成功呢,或者在未来将会如何呢?**
我们与那些将我们工作的价值看做对他们的学科的一种服务的学术机构合作。让我们面对这个现实:当人们想要获取关于一个话题的知识之时,他们不会去读那些同行审议过,并在这些机构发表的学术论文,他们会去维基百科。通过鼓励这些机构中的教职人员用维基百科教学,正可以完善维基百科的在这些学科中的内容和信息。我们的合作伙伴扩充了我们的潜在成员,并且让我们以合作身份大量完善了维基百科上特定学科的内容。
我们欢迎读者点击这个[支持我们](http://wikiedu.org/donate) 的页面通过捐赠来支持我们的工作。
***
作者简介:
Don Watkins 是一个教育家专注教育技术创业家开源提倡者。教育心理学硕士、教育领导力硕士、Linux 系统管理员、思科认证网络支持工程师、Virtual Box 虚拟化认证。关注他: @Don_Watkins
----
via: https://opensource.com/article/17/1/Wiki-Education-Foundation
作者Don Watkins
译者:[scoutydren](https://github.com/scoutydren)
校对:[Bestony](https://github.com/Bestony)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -0,0 +1,101 @@
软件定义存储SDS的发展十个你应当知道的项目
============================================================
![Software defined Storage](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/software-defined.jpg?itok=fRTy33a8 "Software Defined Storage")
*凭借 SDS组织机构可以更好抽象出底层存储的管理功能并且通过不同策略实现灵活配置。下面将要向你展示一些你应当知道的此类开源项目。Creative Commons ZeroPixabay *
纵观 2016 年SDSSoftware-Defined Storage软件定义存储方面取得了很多里程碑式的进步并且日益紧密的与云部署结合在了一起。凭借 SDS ,组织机构可以更好抽象出底层存储的管理功能,并且通过不同策略实现灵活配置。当然,他们也可以选择自由开源的 SDS 解决方案。人们熟知的 Ceph 正是凭借 OpenStack 部署在不断扩大自己的影响力,但是它离成为唯一的 SDS 开源项目还有很长的路要走。
Gartner 的一份市场调查报告中预测,截至到 2019 年70% 已有的存储部署解决方案会支持以纯软件的方式来实施。同时 Gartner 还预测截至到 2020 年70% 到 80% 的非结构化数据会存储在由 SDS 管理的廉价存储设备中。
最近Dell EMC 公司加入到了由 Linux 基金会发起的 [OpenSDS][4] 项目中。 OpenSDS 致力于寻求解决 SDS 集成所面临的挑战,并推动企业对开放标准的采用。它由存储客户与厂商组成,包括 FujitsuHitachi Data SystemsHuaweiOregon State University 以及 Vodafone。同时 OpenSDS 也寻求与其它的上游开源社区进行合作,比如 Cloud Native Computing Foundation、Docker、OpenStack 以及 Open Container Initiative。
根据 Open SDS 项目的 [主页][5]2017 年会是 SDS 的一个元年:“社区希望在 2017 第二季度完成原型的发布并且在第三季度中发布一个测试版本。OpenSDS 的最初组织者期望能通过这个项目来影响到一些开源技术,比如来自 Openstack 社区的 Cinder 和 Manila 项目,并且能够支持更广泛的云存储解决方案。”
与此同时SDS 相关项目也呈现了爆发式的增长,其范围横跨 Apache Cassandra 到 Cehp。Linux 基金会最近发布了 2016 年度报告“[开放云指南:当前的趋势及开源项目][7]”,报告从整体上分析了开放云计算的现状,其中有一章涵盖了 SDS。你可以[下载][8]这篇报告需要注意的是这是一份综合了容器发展趋势、SDS以及云计算的重新定义等等很多内容。报告中涵盖了当今对于开源云计算最重要的一些项目并分类给出了描述和链接。
在这个系列的文章中,我们从该报告中整理了很多项目,并且针对它们是如何发展的提供了一些额外的视角及信息。在下面的内容当中,你会看到现今对 SDS 来说很重要的项目,并且能了解到它们为什么具有这么大的影响力。同时,根据上面的报告,我们提供了相关项目的 GitHub 仓库链接,方便大家查看。
### 软件定义存储SDS
- [Apache Cassandra][9]
Apache Cassandra 是一个可扩展的、高可用的,面向任务优先应用的数据库。它可以运行在商业设备或者云架构上,并且能实现跨数据中心的低延迟数据传输,同时具备良好的容错性。[Cassandra 的 GitHub 仓库][10]。
- [Ceph][11]
Ceph 是 Red Hat 构建的一个企业级可扩展的块设备、对象以及文件存储平台并且可部署在公有云或者私有云之上。Ceph 目前被广泛应用于 OpenStack。[Ceph 的 GitHub 仓库][12]。
- [CouchDB][13]
CouchDB 是一个 Apache 软件基金会项目是一个单节点或者集群数据库管理系统。CouchDB 提供了 RESTful HTTP 接口来读取和更新数据库文件。[CouchDB 的 GitHub 仓库][14]。
- [Docker 数据卷插件][15]
Docker Engine 数据卷插件可以使 Engine 与外部的存储系统一起集成部署,并且数据卷的生命周期与单一 Engine 主机相同。目前存在很多第三方的数据卷管理插件,包括 Azure File Storage、NetApp、VMware vSphere 等等。你可以在 GitHub上查找到更多的插件。
- [GlusterFS][16]
Gluster 是 Red Hat 的可扩展网络文件系统同时也是数据管理平台。Gluster 可以部署在公有云,私有云或者混合云之上,可用于 Linux 容器内的流媒体处理任务、数据分析任务,以及其它数据和带宽敏感型任务的执行。[GlusterFS 的 GitHub 仓库][17]。
- [MongoDB][18]
MongoDB 是一个高性能的文件数据库,并且部署和扩展都非常简单。[MongoDB 的 GitHub 仓库][19]。
- [Nexenta][20]
NexentaStor 是一个可扩展的、统一的软件定义的文件和块设备管理服务,同时支持数据管理功能。它能够与 VMware 集成,并且支持 Docker 和 OpenStack。[Nexenta 的 GitHub 仓库][21]。
- [Redis][22]
Redis 是一个基于内存的数据存储一般被用作数据库、缓存以及消息代理。它支持多种数据结构并且本身支持复制、Lua 脚本、LRU 算法、事务,以及多层级的硬盘持久化。
- [Riak CS][24]
Riak CSCloud Storage是基于 Basho 的分布式数据库 Riak KV 构建的对象存储软件。它提供了在不同规模的分布式云存储能力,可以用于公有云和私有云,还能为大压力的应用和服务提供基础的存储服务。其 API 兼容 Amazon S3并且支持租户级别的费用计算和测量能力。[Riak CS 的 GitHub 仓库][25]。
- [Swift][26]
Swift 是 OpenStack 项目中的对象存储系统,设计初衷是通过简单 API 存储和获取非结构化数据。Swift 设计之初就是可扩展的,并且针对持久性、可靠性以及并发数据读取做了优化。[Swift 的 GitHub 仓库][27]。
_了解更多的开源云计算趋势以及更完整的开源云计算项目列表请[下载 Linux 基金会的“开放云指南”][3]。_
--------------------------------------------------------------------------------
via: https://www.linux.com/news/open-cloud-report/2016/guide-open-cloud-software-defined-storage-opens
作者:[SAM DEAN][a]
译者:[toutoudnf](https://github.com/toutoudnf)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/sam-dean
[1]:https://www.linux.com/licenses/category/creative-commons-zero
[2]:https://www.linux.com/files/images/software-definedjpg
[3]:http://bit.ly/2eHQOwy
[4]:http://ctt.marketwire.com/?release=11G125514-001&id=10559023&type=0&url=https%3A%2F%2Fwww.opensds.io%2F
[5]:https://www.opensds.io/
[6]:https://www.linux.com/blog/linux-foundation-issues-2016-guide-open-source-cloud-projects
[7]:http://ctt.marketwire.com/?release=11G120876-001&id=10172077&type=0&url=http%3A%2F%2Fgo.linuxfoundation.org%2Frd-open-cloud-report-2016-pr
[8]:http://go.linuxfoundation.org/l/6342/2016-10-31/3krbjr
[9]:http://cassandra.apache.org/
[10]:https://github.com/apache/cassandra
[11]:http://ceph.com/
[12]:https://github.com/ceph/ceph
[13]:http://couchdb.apache.org/
[14]:https://github.com/apache/couchdb
[15]:https://docs.docker.com/engine/extend/plugins_volume/
[16]:https://www.gluster.org/
[17]:https://github.com/gluster/glusterfs
[18]:https://www.mongodb.com/
[19]:https://github.com/mongodb/mongo
[20]:https://nexenta.com/
[21]:https://github.com/Nexenta
[22]:http://redis.io/
[23]:https://github.com/antirez/redis
[24]:http://docs.basho.com/riak/cs/2.1.1/
[25]:https://github.com/basho/riak_cs
[26]:https://wiki.openstack.org/wiki/Swift
[27]:https://github.com/openstack/swift

View File

@ -0,0 +1,401 @@
许多 SQL 性能问题来自于“不必要的强制性工作”
=====================================
在编写高效 SQL 时,你可能遇到的最有影响的事情就是[索引][1]。但是,一个很重要的事实就是很多 SQL 客户端要求数据库做很多**“不必要的强制性工作”**。
跟我再重复一遍:
> 不必要的强制性工作
什么是**“不必要的强制性工作”**?这个意思包括两个方面:
### 不必要的
假设你的客户端应用程序需要这些信息:
[
![](https://lukaseder.files.wordpress.com/2017/03/title-rating.png?w=662)
][2]
这没什么特别的。我们运行着一个电影数据库([例如 Sakila 数据库][3]),我们想要给用户显示每部电影的名称和评分。
这是能产生上面结果的查询:
```
SELECT title, rating
FROM film
```
然而,我们的应用程序(或者我们的 ORMLCTT 译注Object-Relational Mapping对象关系映射运行的查询却是
```
SELECT *
FROM film
```
我们得到什么?猜一下。我们得到很多无用的信息:
[
![](https://lukaseder.files.wordpress.com/2017/03/useless-information.png?w=662&h=131)
][4]
甚至一些复杂的 JSON 数据全程在下列环节中加载:
* 从磁盘
* 加载到缓存
* 通过总线
* 进入客户端内存
* 然后被丢弃
是的,我们丢弃了其中大部分的信息。检索它所做的工作完全就是不必要的。对吧?没错。
### 强制性
这是最糟糕的部分。现今随着优化器变得越来越聪明这些工作对于数据库来说都是强制执行的。数据库没有办法_知道_客户端应用程序实际上不需要其中 95% 的数据。这只是一个简单的例子。想象一下如果我们连接更多的表...
你想想那会怎样呢?数据库还快吗?让我们来看看一些之前你可能没有想到的地方:
### 内存消耗
当然,单次执行时间不会变化很大。可能是慢 1.5 倍但我们可以忍受是吧为方便起见有时候确实如此。但是如果你_每次_都为了方便而牺牲性能这事情就大了。我们不说性能问题单个查询的速度而是关注在吞吐量上时系统响应时间事情就变得困难而难以解决。你就会受阻于规模的扩大。
让我们来看看执行计划,这是 Oracle 的:
```
--------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
--------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 166K|
| 1 | TABLE ACCESS FULL| FILM | 1000 | 166K|
--------------------------------------------------
```
对比一下:
```
--------------------------------------------------
| Id | Operation | Name | Rows | Bytes |
--------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 20000 |
| 1 | TABLE ACCESS FULL| FILM | 1000 | 20000 |
--------------------------------------------------
```
当执行 `SELECT *` 而不是 `SELECT film, rating` 的时候,我们在数据库中使用了 8 倍之多的内存。这并不奇怪,对吧?我们早就知道了。在很多我们并不需要其中全部数据的查询中我们都是这样做的。我们为数据库产生了**不必要的强制性工作**,其后果累加了起来,就是我们使用了多达 8 倍的内存(当然,数值可能有些不同)。
而现在,所有其它的步骤(比如,磁盘 I/O、总线传输、客户端内存消耗也受到相同的影响我这里就跳过了。另外我还想看看...
### 索引使用
如今大部分数据库都有[涵盖索引][5]LCTT 译注covering index包括了你查询所需列、甚至更多列的索引可以直接从索引中获取所有需要的数据而无需访问物理表的概念。涵盖索引并不是特殊的索引。但对于一个特定的查询它可以“意外地”或人为地转变为一个“特殊索引”。
看看这个查询:
```
SELECT *
FROM actor
WHERE last_name LIKE 'A%'
```
执行计划中没有什么特别之处。它只是个简单的查询。索引范围扫描、表访问,就结束了:
```
-------------------------------------------------------------------
| Id | Operation | Name | Rows |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 |
| 1 | TABLE ACCESS BY INDEX ROWID| ACTOR | 8 |
|* 2 | INDEX RANGE SCAN | IDX_ACTOR_LAST_NAME | 8 |
-------------------------------------------------------------------
```
这是个好计划吗?如果我们只是想要这些,那么它就不是:
[
![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png?w=662)
][6]
当然,我们浪费了内存之类的。再来看看这个查询:
```
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'A%'
```
它的计划是:
```
----------------------------------------------------
| Id | Operation | Name | Rows |
----------------------------------------------------
| 0 | SELECT STATEMENT | | 8 |
|* 1 | INDEX RANGE SCAN| IDX_ACTOR_NAMES | 8 |
----------------------------------------------------
```
现在我们可以完全消除表访问,因为有一个索引涵盖了我们查询需要的所有东西……一个涵盖索引。这很重要吗?当然!这种方法可以将你的某些查询加速一个数量级(如果在某个更改后你的索引不再涵盖,可能会降低一个数量级)。
你不能总是从涵盖索引中获利。索引也有它们自己的成本,你不应该添加太多索引,例如像这种情况就是不明智的。让我们来做个测试:
```
SET SERVEROUTPUT ON
DECLARE
v_ts TIMESTAMP;
v_repeat CONSTANT NUMBER := 100000;
BEGIN
v_ts := SYSTIMESTAMP;
FOR i IN 1..v_repeat LOOP
FOR rec IN (
-- Worst query: Memory overhead AND table access
SELECT *
FROM actor
WHERE last_name LIKE 'A%'
) LOOP
NULL;
END LOOP;
END LOOP;
dbms_output.put_line('Statement 1 : ' || (SYSTIMESTAMP - v_ts));
v_ts := SYSTIMESTAMP;
FOR i IN 1..v_repeat LOOP
FOR rec IN (
-- Better query: Still table access
SELECT /*+INDEX(actor(last_name))*/
first_name, last_name
FROM actor
WHERE last_name LIKE 'A%'
) LOOP
NULL;
END LOOP;
END LOOP;
dbms_output.put_line('Statement 2 : ' || (SYSTIMESTAMP - v_ts));
v_ts := SYSTIMESTAMP;
FOR i IN 1..v_repeat LOOP
FOR rec IN (
-- Best query: Covering index
SELECT /*+INDEX(actor(last_name, first_name))*/
first_name, last_name
FROM actor
WHERE last_name LIKE 'A%'
) LOOP
NULL;
END LOOP;
END LOOP;
dbms_output.put_line('Statement 3 : ' || (SYSTIMESTAMP - v_ts));
END;
/
```
结果是:
```
Statement 1 : +000000000 00:00:02.479000000
Statement 2 : +000000000 00:00:02.261000000
Statement 3 : +000000000 00:00:01.857000000
```
注意,表 actor 只有 4 列,因此语句 1 和 2 的差别并不是太令人印象深刻,但仍然很重要。还要注意我使用了 Oracle 的提示来强制优化器为查询选择一个或其它索引。在这种情况下语句 3 明显胜利。这是一个好_很多_的查询也是一个十分简单的查询。
当我们写 `SELECT *` 语句时,我们为数据库带来了**不必要的强制性工作**,这是无法优化的。它不会使用涵盖索引,因为比起它所使用的 `LAST_NAME` 索引,涵盖索引开销更多一点,不管怎样,它都要访问表以获取无用的 `LAST_UPDATE` 列。
使用 `SELECT *` 会变得更糟。考虑一下……
### SQL 转换
优化器工作的很好,因为它们转换了你的 SQL 查询([看我最近在 Voxxed Days Zurich 关于这方面的演讲][7])。例如,其中有一个称为“表连接消除”的转换,它真的很强大。看看这个辅助视图,我们写了这个视图是因为我们非常讨厌总是连接所有这些表:
```
CREATE VIEW v_customer AS
SELECT
c.first_name, c.last_name,
a.address, ci.city, co.country
FROM customer c
JOIN address a USING (address_id)
JOIN city ci USING (city_id)
JOIN country co USING (country_id)
```
这个视图仅仅是把 `CUSTOMER` 和他们不同的 `ADDRESS` 部分所有“对一”关系连接起来。谢天谢地,它很工整。
现在,使用这个视图一段时间之后,想象我们非常习惯这个视图,我们都忘了所有它底层的表。然后,我们运行了这个查询:
```
SELECT *
FROM v_customer
```
我们得到了一个相当令人印象深刻的计划:
```
----------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 599 | 47920 | 14 |
|* 1 | HASH JOIN | | 599 | 47920 | 14 |
| 2 | TABLE ACCESS FULL | COUNTRY | 109 | 1526 | 2 |
|* 3 | HASH JOIN | | 599 | 39534 | 11 |
| 4 | TABLE ACCESS FULL | CITY | 600 | 10800 | 3 |
|* 5 | HASH JOIN | | 599 | 28752 | 8 |
| 6 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 |
| 7 | TABLE ACCESS FULL| ADDRESS | 603 | 17487 | 3 |
----------------------------------------------------------------
```
当然是这样。我们运行了所有这些表连接以及全表扫描,因为这就是我们让数据库去做的:获取所有的数据。
现在,再一次想一下,对于一个特定场景,我们真正想要的是:
[
![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png?w=662)
][8]
是啊,对吧?现在你应该知道我的意图了。但想像一下,我们确实从前面的错误中学到了东西,现在我们实际上运行下面一个比较好的查询:
```
SELECT first_name, last_name
FROM v_customer
```
再来看看结果!
```
------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 599 | 16173 | 4 |
| 1 | NESTED LOOPS | | 599 | 16173 | 4 |
| 2 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 |
|* 3 | INDEX UNIQUE SCAN| SYS_C007120 | 1 | 8 | 0 |
------------------------------------------------------------------
```
这是执行计划一个_极大的_进步。我们的表连接被消除了因为优化器可以证明它们是**不必要的**,因此一旦它可以证明这点(而且你不会因使用 `select *` 而使其成为**强制性**工作),它就可以移除这些工作并不执行它。为什么会发生这种情况?
每个 `CUSTOMER.ADDRESS_ID` 外键保证了_有且只有一个_ `ADDRESS.ADDRESS_ID` 主键值,因此可以保证 `JOIN` 操作是对一连接,它不会产生或者删除行。如果我们甚至不选择行或查询行,当然我们就不需要真正地去加载行。可以证实地移除 `JOIN` 并不会改变查询的结果。
数据库总是会做这些事情。你可以在大部分数据库上尝试它:
```
-- Oracle
SELECT CASE WHEN EXISTS (
SELECT 1 / 0 FROM dual
) THEN 1 ELSE 0 END
FROM dual
-- 更合理的 SQL 语句,例如 PostgreSQL
SELECT EXISTS (SELECT 1 / 0)
```
在这种情况下,当你运行这个查询时你可能预料到会抛出算术异常:
```
SELECT 1 / 0 FROM dual
```
产生了:
```
ORA-01476: divisor is equal to zero
```
但它并没有发生。优化器(甚至解析器)可以证明 `EXISTS (SELECT ..)` 谓词内的任何 `SELECT` 列表达式不会改变查询的结果,因此也就没有必要计算它的值。呵!
### 同时……
大部分 ORM 最不幸问题就是事实上他们很随意就写出了 `SELECT *` 查询。事实上,例如 HQL / JPQL就设置默认使用它。你甚至可以完全抛弃 `SELECT` 从句,因为毕竟你想要获取所有实体,正如声明的那样,对吧?
例如:
`FROM` `v_customer`
例如 [Vlad Mihalcea][9](一个 Hibernate 专家和 Hibernate 开发倡导者建议你每次确定不想要在获取后进行任何更改时再使用查询。ORM 使解决对象图持久化问题变得简单。注意:持久化。真正修改对象图并持久化修改的想法是固有的。
但如果你不想那样做为什么要抓取实体呢为什么不写一个查询让我们清楚一点从性能角度针对你正在解决的用例写一个查询_总是_会胜过其它选项。你可以不会在意因为你的数据集很小没关系。可以。但最终你需要扩展并重新设计你的应用程序以便在强制实体图遍历之上支持查询语言就会变得很困难。你也需要做其它事情。
### 计算出现次数
资源浪费最严重的情况是在只是想要检验存在性时运行 `COUNT(*)` 查询。例如:
> 这个用户有没有订单?
我们会运行:
```
SELECT count(*)
FROM orders
WHERE user_id = :user_id
```
很简单。如果 `COUNT = 0`:没有订单。否则:是的,有订单。
性能可能不会很差,因为我们可能有一个 `ORDERS.USER_ID` 列上的索引。但是和下面的这个相比你认为上面的性能是怎样呢:
```
-- Oracle
SELECT CASE WHEN EXISTS (
SELECT *
FROM orders
WHERE user_id = :user_id
) THEN 1 ELSE 0 END
FROM dual
-- 更合理的 SQL 语句,例如 PostgreSQL
SELECT EXISTS (
SELECT *
FROM orders
WHERE user_id = :user_id
)
```
它不需要火箭科学家来确定一旦它找到一个实际存在谓词就可以马上停止寻找额外的行。因此如果答案是“没有订单”速度将会是差不多。但如果结果是“是的有订单”那么结果在我们不计算具体次数的情况下就会_大幅_加快。
因为我们_不在乎_具体的次数。我们告诉数据库去计算它**不必要的**),而数据库也不知道我们会丢弃所有大于 1 的结果(**强制性**)。
当然,如果你在 JPA 支持的集合上调用 `list.size()` 做同样的事情,情况会变得更糟!
[近期我有关于该情况的博客以及在不同数据库上的测试。去看看吧。][10]
### 总结
这篇文章的立场很“明显”。别让数据库做**不必要的强制性工作**。
它**不必要**因为对于你给定的需求你_知道_一些特定的工作不需要完成。但是你告诉数据库去做。
它**强制性**,因为数据库无法证明它是**不必要的**。这些信息只包含在客户端中,对于服务器来说无法访问。因此,数据库需要去做。
这篇文章大部分在介绍 `SELECT *`,因为这是一个很简单的目标。但是这并不仅限于数据库。这关系到客户端要求服务器完成**不必要的强制性工作**的任何分布式算法。你的 AngularJS 应用程序平均有多少个 N+1 问题UI 在服务结果 A 上循环,多次调用服务 B而不是把所有对 B 的调用打包为一个调用?这是一个复发的模式。
解决方法总是相同。你给执行你命令的实体越多信息,(理论上)它能更快执行这样的命令。每次都写一个好的查询。你的整个系统都会为此感谢你的。
### 如果你喜欢这篇文章...
再看看近期我在 Voxxed Days Zurich 的演讲,其中我展示了一些在数据处理算法上为什么 SQL 总是会胜过 Java 的双曲线例子
--------------------------------------------------------------------------------
via: https://blog.jooq.org/2017/03/08/many-sql-performance-problems-stem-from-unnecessary-mandatory-work
作者:[jooq][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://blog.jooq.org/
[1]:http://use-the-index-luke.com/
[2]:https://lukaseder.files.wordpress.com/2017/03/title-rating.png
[3]:https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/Sakila
[4]:https://lukaseder.files.wordpress.com/2017/03/useless-information.png
[5]:https://blog.jooq.org/2015/04/28/do-not-think-that-one-second-is-fast-for-query-execution/
[6]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png
[7]:https://www.youtube.com/watch?v=wTPGW1PNy_Y
[8]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png
[9]:https://vladmihalcea.com/2016/09/13/the-best-way-to-handle-the-lazyinitializationexception/
[10]:https://blog.jooq.org/2016/09/14/avoid-using-count-in-sql-when-you-could-use-exists/

View File

@ -0,0 +1,110 @@
使用 Go 一年的体验
============================================================
![](https://bugfender.com/wp-content/uploads/2017/03/one-year-using-go-social-1.jpg)
我们公司 [Mobile Jazz][6] 从一个内部试验性项目开始使用 [Go][5]。如公司名暗示的那样,我们是开发移动应用的。
在发布一个应用给公众后,我们很快意识到我们缺失一个工具来检查用户实际发生的情况以及他们是如何与应用交互的 - 如果有任何问题或者 bug 的报告,这将会相当方便。
现在有几款工具声称能在这个方面帮助开发者,但是没有一个能完全满足要求,因此我们决定自己构建一个。我们开始创建一组基础的脚本,如今它很快进化成了完整的工具,称为 [Bugfender][7]
由于这最初是一个实验,我们决定使用一种新的趋势技术。对学习以及持续教育的热爱是 Mobile Jazz 的核心价值的之一,因此我们决定使用 Go 构建。这是一个由 Google 开发的相对较新的编程语言。它是编程世界的的新玩家,已经有许多受尊敬的开发者对它赞不绝口。
一年后,这个实验变成了一个初创项目,我们拥有了一个已经帮助了来自全世界的数以千计的开发者的令人难以置信的工具。我们的服务器每天处理来自 700 万台设备的超过 200GB 的数据。
在使用 Go 一年之后,我们想要分享我们将一个小小的实验变成处理百万日志的生产服务器的一些想法和经验。
### Go 生态系统
公司中没有人有使用 Go 的经验。Bugfender 是我们第一次深入这个语言。
学习基本上相当直接的。我们之前在 C/C++/Java/Objective-C/PHP 的经验让我们学习 Go 相当快,并且在几天内就开始开发了。当然会有一些新的和不常见的东西需要学习,包括 GOPATH 还有如何处理包,但这在我们的预期之内。
几天之内我们意识到即使是一个以简化为设计目的的语言Go 也是非常强大的。它能够做任何现代编程语言应该能做的事:能够处理 JSON、服务器之间通讯甚至访问数据库也没问题并且只需要几行代码
在构建一个服务器时,你应该首先决定是否使用任何第三方库或者框架。对于 Bugfender我们决定使用
#### Martini
[Martini][8] 是一个强大的 Go 的 web 框架。我们开始这个实验时,它是一个很棒的解决方案,至今也是,我们还没遇到任何问题。然而如果我们今天再次开始这个实验的话,我们会选择一个不同的框架,因为 Martini 不在维护了。
我们还试验了 [Iris][9](我们目前的最爱)还有 [Gin][10]。Gin 是 Martini 继任者,并且迁移到这上能让我们重用已有的代码。
在过去的一年中,我们意识到 Go 的标准库是非常强大的,你不必依靠一个臃肿的 web 框架来构建一个服务器。最好在特定任务上使用专门的高性能库。
~~Iris 是我们目前最喜欢的,并且将来我们将使用它重写服务来替代 Martini/Gin但这目前并不是优先的。~~
**修改:** 在讨论了 Iris 的各个方面之后,我们意识到 Iris 或许不是最好的选择。如果我们决定重写我们的 web 组件,我们或许会研究其他的选择,我们欢迎你的建议。
#### Gorm
有些人喜欢 ORM而有些人则不喜欢。我们决定使用 ORM更确切地说是 [GORM][11]。我们的实现只针对 web 前端,对于日志提取 API 仍然继续使用手工优化的 SQL。在一开始我们确实很喜欢它但是随着时间的推移我们开始发现问题并且我们很快将它从代码中完全移除并且使用 [sqlx][12] 这个标准 SQL 库。
GORM 的一个主要问题是 Go 的生态系统。作为一个新语言,自我们开始开发产品以来 Go 已经有很多新版本。在这些新版本中的一些改变并不向后兼容,因此要使用最新的库版本,我们要经常重写已有代码并检查我们为解决版本问题所做的 hack。
上述这两个库是大多数 web 服务的主要组件,因此做一个好的选择很重要,因为将来更改会很困难,并且会影响你服务器的性能。
### 第三方服务
在创建一个实际使用的产品的另外一个重要方面是考虑库、第三方服务和工具的可用性。在这方面Go 还缺乏成熟度,大多数公司还没有提供 Go 库,因此你或许需要依赖其他人写的不能一直保证质量的库。
比如,对于使用 [Redis][13] 和 [ElasticSearch][14] 有很好的库,但是对于其他服务比如 Mixpanel 或者 Stripe 还没有好的。
我们建议在使用 Go 之前事先检查对于你需要的产品是否有好的库可用。
我们在 Go 的包管理系统上也遇到了很多问题。它处理版本的方式远没有达到最好,并且在过去的一年中,我们在不同的团队成员之间使用同一个库的不同版本上遇到了很多问题。然而,最近要归功于 Go 新支持的 vendor 包特性,除了 [gopkg.in][15] 服务外,这个问题基本被解决了。
### 开发者工具
![](https://bugfender.com/wp-content/uploads/2017/03/go-ide.jpg)
由于 Go 是一门相对新的语言,你或许发现相比其他成熟的语言像 Java它可用的开发工具并不很好。当我们开始 Bugfender 时,使用任何 IDE 都很困难,似乎没有 IDE 支持 Go。但是在过去的一年中随着 [IntelliJ][16] 和 [Visual Studio Code Go][17] 插件的引入,这一切改善了很多。
最后看下其他的 Go 工具,调试器并不很好,而分析器甚至更糟,因此有时调试你的代码或者尝试优化它会很困难。
### 前往生产
这确实是 Go 最好的东西之一,如果你想要部署一些东西到生产环境中,你只需要构建你的二进制并发送到服务器中,没有依赖,不需要安装额外的软件,你只需要能在服务器中运行二进制文件就行。
如果你习惯于处理那些需要包管理器或者需要小心你使用的语言解释器的语言,用 Go 工作会感到很高兴。
我们对 Go 的稳定性也很满意,因为服务器似乎从没有崩溃过。我们在发送大量数据给 Go Routines 时遇到过一个问题,但是我们几乎没见到任何崩溃。注意:如果你需要发送大量数据给 Go Routine你需要小心堆溢出。
如果你对性能感兴趣,我们没法与其他语言相比较,因为我们从零开始使用 Go但是对于我们处理的数据量我们感觉性能是非常好的我们绝对不能如此轻松地使用 PHP 处理同等数量的请求。
### 总结
在过去的一年中,我们对 Go 的感觉起起伏伏。最初我们是兴奋的,但是在实验变成真实的产品后我们开始发现问题。我们几次考虑过用 Java 完全重写,但是目前为止,仍旧使用的是 Go并且过去的一年中 Go 生态已经有了很大的提升,这简化了我们的工作。
如果你想要使用 Go 构建你的产品,你可以保证它可以工作,但是你确实需要小心一件事:可以雇佣的开发者。硅谷中只有很少的高级 Go 开发者,并且在其他地方寻找也是一件非常困难的任务。
--------------------------------------------------------------------------------
via: https://bugfender.com/one-year-using-go
作者:[ALEIX VENTAYOL][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://bugfender.com/author/aleixventayol
[1]:https://bugfender.com/#facebook
[2]:https://bugfender.com/#twitter
[3]:https://bugfender.com/#google_plus
[4]:https://www.addtoany.com/share#url=https%3A%2F%2Fbugfender.com%2Fone-year-using-go&title=One%20Year%20Using%20Go
[5]:https://golang.org/
[6]:http://mobilejazz.com/
[7]:https://www.bugfender.com/
[8]:https://github.com/go-martini/martini
[9]:https://github.com/kataras/iris
[10]:https://github.com/gin-gonic/gin
[11]:https://github.com/jinzhu/gorm
[12]:https://github.com/jmoiron/sqlx
[13]:https://github.com/go-redis/redis
[14]:https://github.com/olivere/elastic
[15]:http://labix.org/gopkg.in
[16]:https://plugins.jetbrains.com/plugin/5047-go
[17]:https://github.com/Microsoft/vscode-go
[18]:https://bugfender.com/one-year-using-go

View File

@ -0,0 +1,141 @@
Linux GRUB2 配置简介
============================================================
> 学习 GRUB 引导加载程序是如何预备你的系统并启动操作系统内核的。
![Linux GRUB2 配置简介](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Linux GRUB2 配置简介")
自从上个月为我的文章《[Linux 引导和启动过程简介][2]》做研究开始,我对更深入了解 GRUB2 产生了兴趣。这篇文章提供了配置 GRUB2 的简要介绍。为了简便起见,我大多数情况下会使用 GRUB 指代 GRUB2。
### GRUB
GRUB 来自 GRand Unified Bootloader 的缩写。它的功能是在启动时从 BIOS 接管掌控、加载自身、加载 Linux 内核到内存然后再把执行权交给内核。一旦内核开始掌控GRUB 就完成了它的任务,也就不再需要了。
GRUB 支持多种 Linux 内核,并允许用户在启动时通过菜单在其中选择。我发现这是一种非常有用的工具,因为我有很多次遇到一个应用程序或者系统服务在特定内核版本下失败的问题。有好几次,引导到一个较旧的内核时就可以避免类似的问题。默认情况下,使用 `yum` 或 `dnf` 进行更新时会保存三个内核 - 最新的以及两个比较旧的。在被包管理器删除之前所保留的内核数目可以在 `/etc/dnf/dnf.conf` 或 `/etc/yum.conf` 文件中配置。我通常把 `installonly_limit` 的值修改为 9 以便保留 9 个内核。当我不得不恢复到低几个版本的内核时这非常有用。
### GRUB 菜单
GRUB 菜单的功能是当默认的内核不是想要的时,允许用户从已经安装的内核中选择一个进行引导。通过上下箭头键允许你选中想要的内核,敲击回车键会使用选中的内核继续引导进程。
GRUB 菜单也提供了超时机制因此如果用户没有做任何选择GRUB 就会在没有用户干预的情况下使用默认内核继续引导。敲击键盘上除了回车键之外的任何键会停止终端上显示的倒数计时器。立即敲击回车键会使用默认内核或者选中的内核继续引导进程。
GRUB 菜单提供了一个 “<ruby>救援<rt>rescue</rt></ruby>” 内核,用于故障排除或者由于某些原因导致的常规内核不能完成启动过程。不幸的是,这个救援内核不会引导到救援模式。文章后面会更详细介绍这方面的东西。
### grub.cfg 文件
`grub.cfg` 文件是 GRUB 配置文件。它由 `grub2-mkconfig` 程序根据用户的配置使用一组主配置文件以及 grub 默认文件而生成。`/boot/grub2/grub.cfg` 文件在 Linux 安装时会初次生成,安装新内核时又会重新生成。
`grub.cfg` 文件包括了类似 Bash 脚本的代码以及一个按照安装顺序排序的已安装内核列表。例如,如果你有 4 个已安装内核,最新的内核索引是 0前一个内核索引是 1最旧的内核索引是 3。如果你能访问 `grub.cfg` 文件,你应该去看看感受一下它看起来是什么样。`grub.cfg` 太大也就没有包含在这篇文章中。
### GRUB 配置文件
`grub.cfg` 的主要配置文件都在 `/etc/grub.d` 目录。该目录中的每个文件都包含了最终会整合到 `grub.cfg` 文件中的 GRUB 代码。这些配置文件的命名模式以排序方式设计,这使得最终的 `grub.cfg` 文件可以按正确的顺序整合而成。每个文件都有注释表明该部分的开始和结束,这些注释也是最终的 `grub.cfg` 文件的一部分,从而可以看出每个部分是由哪个文件生成。分隔注释看起来像这样:
```
### BEGIN /etc/grub.d/10_linux ###
### END /etc/grub.d/10_linux ###
```
不要修改这些文件,除非你是一个 GRUB 专家并明白更改会发生什么。无论如何,修改 `grub.cfg` 文件时你也总应该保留一个原始文件的备份。 `40_custom` 和 `41_custom` 这两个特别的文件用于生成用户对 GRUB 配置的修改。你仍然要注意对这些文件的更改的后果,并保存一份原始 `grub.cfg` 文件的备份。
你也可以把你自己的文件添加到 `/etc/grub.d` 目录。这样做的一个可能的原因是为非 Linux 操作系统添加菜单行。要注意遵循命名规则,确保配置文件中额外的菜单选项刚好在 `10_linux` 条目之前或之后。
### GRUB 默认文件
老版本 GRUB 的配置非常简单而明了,我只需要修改 `/boot/grub/grub.conf` 就可以了。对于新版本的 GRUB2我虽然还可以通过更改 `/boot/grub2/grub.cfg` 来修改,但和老版本的 GRUB 相比,新版本相对更加复杂。另外,安装一个新内核时 `grub.cfg` 可能会被重写因此任何修改都可能消失。当然GNU.org 的 GRUB 手册确实有过直接创建和修改 `/boot/grub2/grub.cfg` 的讨论。
一旦你明白了如何做,更改 GRUB2 配置就会变得非常简单。我为之前的文章研究 GRUB2 的时候才明白这个。秘方就在 `/etc/default` 目录里面,一个自然而然称为 `grub` 的文件,它可以通过简单的终端命令操作。`/etc/default` 目录包括了一些类似 Google Chrome、 useradd、 和 grub 程序的配置文件。
`/etc/default/grub` 文件非常简单。这个 `grub` 默认文件已经列出了一些有效的键值对。你可以简单地更改现有键值或者添加其它文件中还没有的键。下面的列表 1 显示了一个没有更改过的 `/etc/default/grub` 文件。
```
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g'
/etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora_fedora25vm/root
rd.lvm.lv=fedora_fedora25vm/swap
rd.lvm.lv=fedora_fedora25vm/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
```
_列表 1Fedora 25 一个原始 grub 默认文件。_
[GRUB 手册 5.1 章节][7]包括了所有可以添加到该 `grub` 文件的键的信息。我只需要修改 `grub` 默认文件已经有的一些键值就够了。让我们看看这些键值以及一些在 grub 默认文件中没有出现的每个键的意义。
* `GRUB_TIMEOUT` 这个键的值决定了显示 GRUB 选择菜单的时间长度。GRUB 提供了同时保存多个安装内核并在启动时使用 GRUB 菜单在其中选择的功能。这个键的默认值是 5 秒,但我通常修改为 10 秒使得有更多时间查看选项并作出选择。
* `GRUB_DISTRIBUTOR` 这个键定义了一个从 `/etc/system-release` 文件中提取发行版本的 [sed][3] 表达式。这个信息用于生成出现在 GRUB 菜单中的每个内核发布版的文本名称,例如 “Fedora” 等。由于不同发行版之间 `system-release` 文件结构的差异,在你的系统中这个 sed 表达式可能有些不同。
* `GRUB_DEFAULT` 决定默认引导哪个内核。如果是 `saved`,这代表最新内核。这里的其它选项如果是数字则代表了 `grub.cfg` 中列表的索引。使用索引号 3就会总是加载列表中的第四个内核即使安装了一个新内核之后也是。因此使用索引数字的话在安装一个新内核后会加载不同的内核。要确保引导特定内核版本的唯一方法是设置 `GRUB_DEFAULT` 的值为想要内核的名称,例如 `4.8.13-300.fc25.x86_64`
* `GRUB_SAVEDEFAULT` 通常grub 默认文件中不会指定这个选项。当选择不同内核进行引导时,正常操作下该内核只会启动一次。默认内核不会改变。当其设置为 `true` 并和 `GRUB_DEFAULT=saved` 一起使用时,这个选项会保存一个不同内核作为默认值。当选择不同内核进行引导时会发生这种情况。
* `GRUB_DISABLE_SUBMENU` 一些人可能会希望为 GRUB 菜单创建一个内核的层级菜单结构。这个键和 `grub.cfg` 中一些额外内核配置允许创建这样的层级结构。例如,主菜单中可能有 `production``test` 子菜单,每个子菜单中包括了一些合适的内核。设置它为 `false` 可以启用子菜单。
* `GRUB_TERMINAL_OUTPUT` 一些环境下可能需要或者必要将输出重定向到一个不同的显示控制台或者终端。默认情况下是把输出发送到默认终端,通常 `console` 等价于 Intel 系列个人电脑的标准输出。另一个有用的选择是在使用串行终端或者 Integrated Lights Out (ILO) 终端连接的数据中心或者实验室环境中指定 `serial`
* `GRUB_TERMINAL_INPUT` 和 `GRUB_TERMINAL_OUTPUT` 类似,可能需要或者必要重定向输入为串行终端或者 ILO 设备、而不是标准键盘输入。
* `GRUB_CMDLINE_LINUX` 这个键包括了在启动时会传递给内核的命令行参数。注意这些参数会被添加到 `grub.cfg` 所有已安装内核的内核行。这意味着所有已安装的内核在启动时都会有相同的参数。我通常删除 `rhgb``quiet` 参数以便我可以看到引导和启动时内核和 systemd 输出的所有内核信息消息。
* `GRUB_DISABLE_RECOVERY` 当这个键的值被设置为 `false`GRUB 菜单中就会为每个已安装的内核创建一个恢复条目。当设置为 `true` 时就不会创建任何恢复条目。但不管这个设置怎样,最后的内核条目总是一个 `rescue` 选项。不过在 rescue 选项中我遇到了一个问题,下面我会详细介绍。
还有一些你可能觉得有用但我没有在这里介绍的键。它们的描述可以在 [GRUB 手册 2][8] 的 5.1 章节找到。
### 生成 grub.cfg
完成所需的配置之后,就需要生成 `/boot/grub2/grub.cfg` 文件。这通过下面的命令完成。
```
grub2-mkconfig > /boot/grub2/grub.cfg
```
这个命令按照顺序使用位于 `/etc/grub.d` 的配置文件构建 `grub.cfg` 文件,然后使用 grub 默认文件的内容修改输出以便获得最终所需的配置。`grub2-mkconfig` 命令会尝试定位所有已安装的内核并在 `grub.cfg` 文件的 `10_Linux` 部分新建条目。它还创建一个 `rescue` 条目提供一个用于从 Linux 不能启动的严重问题中恢复的方法。
强烈建议你不要手动编辑 `grub.cfg` 文件,因为任何对该文件的直接修改都会在下一次安装新内核或者手动运行 `grub2-mkconfig` 时被重写。
### 问题
我遇到一个如果没有意识到就可能导致严重后果的 GRUB2 问题。这个救援内核没有启动,反而启动了另外一个内核。我发现那是列表中索引为 1 的内核,也就是列表中的第二个内核。额外的测试发现不管使用原始的还是我生成的 `grub.cfg` 配置文件都会发生这个问题。我在虚拟机和真实硬件上都尝试过而且都发生了这个问题。我只测试了 Fedora 25因此其它 Fedora 发行版本可能没有这个问题。
注意,从救援内核生成的 “recovery” 内核条目不能引导到维护模式。
我推荐将 grub 默认文件中 `GRUB_DISABLE_RECOVERY` 的值更改为 “false”然后生成你自己的 `grub.cfg`。这会在 GRUB 菜单中为每个已安装的内核生成可用的恢复条目。这些恢复配置能像期望那样工作,从而从那些需要输入密码登录的内核条目中引导到运行级别 1也就是进入不需要密码的单用户维护模式。你也可以按 `Ctrl-D` 继续正常的引导进入默认运行级别。
### 总结
GRUB 是引导 Linux 计算机到可用状态过程的一系列事件中,发生在 BIOS 之后的第一步。理解如何配置 GRUB 对于恢复或者处理多种类型的问题非常重要。
这么多年来我多次不得不引导到恢复或者救援模式以便解决多种类型的问题。其中的一些问题确实是类似 `/etc/fstab` 或其它配置文件中不恰当条目导致的引导问题,也有一些是由于应用程序或者系统软件和最新的内核不兼容的问题。硬件兼容性问题也可能妨碍特定的内核启动。
我希望这些信息能对你开启 GRUB 配置之旅有所帮助。
题图  Internet Archive [Book][5] [Images][6]. Opensource.com 修改。 CC BY-SA 4.0
--------------------------------------------------------------------------------
作者简介:
David Both - David Both 是一个居住在 Raleigh北卡罗来纳州的 Linux 和开源倡导者。他在 IT 界已经有超过 40 年,并在他工作的 IBM 执教 OS/2 20 多年。在 IBM 的时候,他在 1981 年开设了第一个最初 IBM 个人电脑的培训课程。他在红帽教授过 RHCE 课程并在 MCI Worldcom、 Cisco、 和北卡罗来纳州工作过。他已经在 Linux 和开源软件方面工作将近 20 年。
----------------
via: https://opensource.com/article/17/3/introduction-grub2-configuration-linux
作者:[David Both][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/dboth
[1]:https://opensource.com/article/17/2/linux-boot-and-startup
[2]:https://opensource.com/article/17/2/linux-boot-and-startup
[3]:https://en.wikipedia.org/wiki/Sed
[4]:https://opensource.com/article/17/3/introduction-grub2-configuration-linux?rate=QrIzRpQ3YhewYlBD0AFp0JiF133SvhyAq783LOxjr4c
[5]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt
[6]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP
[7]:https://www.gnu.org/software/grub/manual/grub.html#Simple-configuration
[8]:https://www.gnu.org/software/grub/manual/grub.html#Simple-configuration
[9]:https://opensource.com/user/14106/feed
[10]:https://opensource.com/article/17/3/introduction-grub2-configuration-linux#comments
[11]:https://opensource.com/users/dboth

View File

@ -0,0 +1,184 @@
AWS 云服务清单
============================================================
![AWS Cloud terminology](http://cdn2.kerneltalks.com/wp-content/uploads/2017/03/AWS-Cloud-terminology-150x150.png)
_认识 71 个 AWS 云服务的术语 ! 通过了解 AWS 世界中使用的术语开始你的 AWS 云服务使用生涯 !_
AWS<ruby>亚马逊 Web 服务<rt>Amazon Web Services</rt></ruby>,是一个提供了一系列按使用计费的 web 服务的云平台。 它是迄今为止最为著名的云平台之一。由于其灵活性、有效性、弹性、可测量性和无须维护,所以有一些企业正逐步把他们的业务迁移到云端。 由于许多公司目前在使用这些服务,所以对于系统管理员和运维人员来说应该了解一下 AWS。
这篇文章旨在列出这些 AWS 提供的服务并且解释在 AWS 中出现的术语。
截止到目前为止2017 年 3 月AWS 提供了分为 17 组的共计 71 种服务:
### 计算型服务
这是一个提供了虚拟服务器配置功能的服务,即所谓的云计算。它提供了包括以下这一系列的服务。
1. EC2EC2 代表弹性计算云。这种服务提供了可根据个人需求扩展的 [虚拟机][11]。
2. EC2 容器服务:其高性能,高可扩展性使其可在 EC2 集群环境中运行服务。
3. Lightsail该服务使用户非常容易地启动和管理虚拟服务器EC2
4. Elastic Beanstalk该服务能够自动管理你的应用程序的容量配置、负载平衡、扩展以及健康监控从而减少你的管理压力。
5. Lambda它允许你只在你需要的时候运行代码而不用去管理服务器。
6. Batch它使用户能够以自定义的管理方式运行计算工作负载批处理
### 存储型服务
它是一种云存储服务,即由 Amazon 提供的云存储设施。 该组服务包括:
1. S3S3 代表简单存储服务3 个 S。 它给你提供了在线存储服务,你可随时从任何地方存储/检索任何数据。
2. EFSEFS 代表弹性文件系统。 它是一个可以和 EC2 服务器一起使用的在线存储服务。
3. Glacier它是一种低成本/低性能数据存储解决方案,主要针对存档或长期备份。
4. Storage Gateway这种服务的接口会将你的内部应用程序托管在 AWS 之外)与 AWS 存储连接。
### 数据库
AWS 还提供在其基础设施上托管数据库,以便客户可以利用亚马逊最先进的技术来获得更快/高效/安全的数据处理。 该组包括:
1. RDSRDS 代表关系数据库服务。 用于在云上设置,操作和管理关系数据库。
2. DynamoDB其 NoSQL 数据库提供了快速处理和高可扩展性。
3. ElastiCache这是一种为你的 Web 应用程序管理内存缓存以便更快运行它们的方案
4. Redshift它是一个巨大的PB 级)的完全可升级的云端数据仓库服务。
### 网络 & 内容分发
由于 AWS 提供云端的 EC2 服务器,因此网络相关内容也将在出现在这里。 内容分发用于向位于最近位置的用户提供文件。 现如今有许多非常有名的加速网站。
1. VPCVPC 代表虚拟私有云。 它是你自己的虚拟网络,是你的专用 AWS 帐户。
2. CloudFront这是 AWS 的内容分发网络CDN服务。
3. Direct Connect它是将数据中心/场所与 AWS 连接起来的网络方式,以提高吞吐量,降低网络成本,并避免由于基于互联网的连接而导致的连接问题。
4. Route 53它是一个云端的域名系统的 DNS Web 服务。
### 迁移
它提供了一系列服务来帮助你实现本地服务到 AWS 的迁移工作。 这包括
1. Application Discovery Service专门用于分析您的服务器、网络、应用程序以帮助/加速迁移的服务。
2. DMSDMS 指的是数据库迁移服务。 它用于将数据从本地数据库迁移到 EC2 上托管的 RDS 或 DB。
3. Server Migration也称为 SMS服务器迁移服务是一种无代理服务将您的工作负载从本地移动到 AWS。
4. Snowball 当你想要使用物理存储设备而不是基于互联网/基于网络的传输)将大量数据传入/迁出 AWS 时,你应该使用它。
### 开发者工具
顾名思义, 这是一系列帮助开发者简化在云端编码的服务。
1. CodeCommit它是一个安全的、可扩展的、可管理的源代码管理服务用于托管代码仓库。
2. CodeBuild这是一个云端的代码生成器。主要用于执行、测试代码和构建部署软件包。
3. CodeDeploy这是一个可在 AWS 服务器或本地进行自动化应用程序部署的部署服务。
4. CodePipeline这个部署服务可以使编码人员可以在发布之前将其应用程序可视化。
5. X-Ray它可以使用事件调用分析应用程序。
### 管理工具
这是一组可帮助你管理 AWS 上的 Web 服务的服务。
1. CloudWatch监控你的 AWS 资源或应用程序的监控服务。
2. CloudFormation基础设施即代码以集体有序的方式管理 AWS 架构的方式。
3. CloudTrailAWS 帐户的审计和合规工具。
4. Config : AWS 的资源清单、配置历史记录和配置更改通知,以实现安全性和治理。
5. OpsWorks它可以自动化地配置部署 EC2 或内部部署计算。
6. Service Catalog创建和管理被批准在你/公司帐户中使用的 IT 服务目录。
7. Trusted Advisor它的 AWS AI 可以通过审查你的 AWS 基础设施使你的 AWS 基础设施更好,更省钱
8. Managed Service提供持续的基础设施管理。
### 安全性、身份和合规
这是一组很重要的 AWS 服务以确保你的 AWS 空间的安全性。
1. IAMIAM 即身份和访问管理,控制用户访问你的 AWS 资源和服务。
2. Inspector自动安全评估可帮助你在 AWS 上的应用安全和合规。
3. Certificate Manager为 AWS 应用程序提供,管理和部署 SSL / TLS 证书。
4. Directory Service相当于 AWS 的 Microsoft Active Directory。
5. WAF & ShieldWAF 即 Web 应用防火墙。 监控和控制对 CloudFront 或负载均衡器上的内容的访问。
6. Compliance ReportsAWS 基础设施空间的合规报告,以确保您的应用程序符合您的策略。
### 数据分析
AWS 空间的数据分析服务,以帮助您查看、计划和对帐户中的事件采取行动。
1. Athena它是一个基于 SQL 查询的服务,用于分析 S3 存储的数据。
2. EMREMR 的全写是 Elastic Map Reduce。 是一个主要用于大数据处理和分析的服务。
3. CloudSearchAWS 在应用和服务中的搜索功能。
4. Elasticsearch Service它可以创建一个域并在 AWS Cloud 中部署、操作和扩展 Elasticsearch 集群。
5. Kinesis这种服务可以实现实时的大量流数据处理。
6. Data Pipeline它可以帮助我们在不同的 AWS 服务之间实现数据迁移。
7. QuickSight收集、分析和呈现 AWS 的业务数据。
### 人工智能
AWS 的 AI!
1. Lex它可以帮助我们在一些使用语音和文本的应用中构建会话界面。
2. Polly这是一个提供文字到语音转换的服务。
3. Rekognition使您能够将图像分析添加到应用程序。
4. Machine Learning它具有学习数据中的模式的算法。
### 物联网
这个服务保证了 AWS 在不同设备上的高可用性。
1. AWS IoT它使联网硬件设备与 AWS 的应用程序能够交互。
### 游戏开发
顾名思义,这个服务旨在游戏开发。
1. Amazon GameLift该服务旨在部署、管理用于会话的多人游戏的专用游戏服务器。
### 移动服务
这是一组主要针对手持设备的服务。
1. Mobile Hub帮助您创建移动应用的后台功能并将其集成到移动应用。
2. Cognito在连接了互联网设备上控制移动用户的身份验证和 AWS 的访问。
3. Device Farm移动应用测试服务使你可以在 Android 上托管的真实手机上跨 Android、iOS 测试应用。
4. Mobile Analytics在 AWS 上测量、跟踪和分析移动应用数据。
5. Pinpoint针对性的推送通知和移动互动。
### 应用服务
这是一组可以和你在 AWS 上的应用一起使用的服务。
1. Step Functions定义和使用应用程序中的各种功能。
2. SWFSWF 代表简单的工作流服务。其云工作流程管理可帮助开发人员在应用程序生命周期的不同阶段进行协调和贡献。
3. API Gateway帮助开发人员创建、管理和托管 API。
4. Elastic Transcoder帮助开发人员将媒体文件转换为在各种设备上可以播放的格式。
### 消息
AWS 中的通知和消息服务。
1. SQSSQS 表示简单队列服务。完全管理的消息队列服务,用于在 AWS 中的服务和应用之间进行通信。
2. SNSSNS 代表简单通知服务。 为 AWS 用户推送通知服务,提醒他们有关其在 AWS 空间中的服务。
3. SESSES 代表简单电子邮件服务。 这是 AWS 为自己的客户提供高性价比的电子邮件服务。
### 企业生产率
一组帮你提高业务生产率的服务。
1. WorkDocs协同文件共享、存储和编辑服务。
2. WorkMail安全的商务邮件、日程服务。
3. Amazon Chime在线的企业会议
### 桌面和应用程序流式传输
实现桌面应用程序通过云端进行流传输。
1. WorkSpaces完全管理且安全的云计算服务。
2. AppStream 2.0:来自云端的流式桌面应用。
--------------------------------------------------------------------------------
via: http://kerneltalks.com/virtualization/aws-cloud-terminology/
作者:[Shrikant Lavhate][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://kerneltalks.com/virtualization/aws-cloud-terminology/

View File

@ -0,0 +1,454 @@
如何用树莓派控制 GOIO 引脚并操作继电器
==========================================
> 学习如何用 PHP 和温度传感器实现树莓派控制 GPIO 并操作继电器
![How to control GPIO pins and operate relays with the Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/raspberry_pi_day_lead_0.jpeg?itok=lCxmviRD "How to control GPIO pins and operate relays with the Raspberry Pi")
你是否曾经想知道怎样使用手机或者电脑在任何地方控制你的风扇和灯等一些家用电器?
我现在想控制我的圣诞彩灯,是使用手机呢,还是使用平板电脑呢,或者是使用笔记本电脑呢?都不是,而是仅仅使用一个树莓派。让我来告诉你如何使用 PHP 和温度传感器实现树莓派控制 GPIO 引脚并操作继电器。我使用 AJAX 把它们整合在了一起。
### 硬件要求:
* 树莓派
* 安装有 Raspbian 系统的 SD 卡(任何一张 SD 卡都可以,但是我更偏向使用大小为 32GB 等级为 class 10 的 SD 卡)
* 电源适配器
* 跳线(母对母跳线和公转母跳线)
* 继电器板(我使用一个用于 12V 继电器的继电器板)
* DS18B20 温度传感器
* 树莓派的 Wi-Fi 适配器
* 路由器(为了访问互联网,你需要有一个拥有端口转发的路由器)
* 10KΩ 的电阻
### 软件要求:
* 下载并安装 Raspbian 系统到你的 SD 卡
* 有效的互联网连接
* Apache web 服务器
* PHP
* WiringPi
* 基于 Mac 或者 Windows 的 SSH 客户端
### 一般的配置和设置
1、 插入 SD 卡到树莓派,然后使用以太网网线将它连接到路由器;
2、 连接 WiFi 适配器;
3、 使用 SSH 方式登录到树莓派,然后使用下面的命令编辑 `interfaces` 文件:
```
sudo nano /etc/network/interfaces
```
这个命令会用一个叫做 `nano` 的编辑器打开这个文件。它是一个非常简单又易于使用的文本编辑器。如果你不熟悉基 Linux 的操作系统,可以使用键盘上的方向键来操作。
`nano` 打开这个文件后,你会看到这样一个界面:
![File editor nano](https://opensource.com/sites/default/files/putty_0.png "File editor nano")
4、要配置你的无线网络按照下面所示修改这个文件
```
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "Your Network SSID"
wpa-psk "Your Password"
```
5、 按 `CTRL+O` 保存,然后按 `CTRL+X` 退出编辑器。
到目前为止,一切都已经配置完成,接下来你需要做的就是使用命令重新加载网络:
```
sudo service networking reload
```
(警告:如果你是使用远程连接的方式连接的树莓派,连接将会中断。)
### 软件配置
#### 安装 Apache web 服务器
Apache 是一个受欢迎的服务器应用你可以在树莓派安装这个程序让它提供网页服务。Apache 原本就可以通过 HTTP 方式提供 HTML 文件服务添加其他模块后Apache 还可以使用像 PHP 这样的脚本语言来提供动态网页的服务。
可以在命令行输入下面命令安装 Apache
```
sudo apt-get install apache2 -y
```
安装完成后,可以在浏览器地址栏输入树莓派的 IP 地址来测试 web 服务器。如果你可以获得下面图片的内容,说明你已经成功地安装并设置好了你的服务器。
![Successful server setup](https://opensource.com/sites/default/files/itworks.png "Successful server setup")
要改变这个默认的页面和添加你自己的 html 文件,进入 `var/www/html` 目录:
```
cd /var/www/html
```
添加一些文件来测试是否成功。
#### 安装 PHP
PHP 是一个预处理器,这意味着它是当服务器收到网页请求时才会运行的一段代码。它开始运行,处理网页上需要被显示的内容,然后把网页发送给浏览器。不像静态的 HTMLPHP 在不同的环境下可以显示不同的内容。其他的语言也可以做到这一点,但是由于 WordPress 是用 PHP 编写的有些时候你需要使用它。PHP 是 web 上一种非常受欢迎的语言,像 Facebok 和 Wikipeadia 这样的大型项目都是用 PHP 编写的。
使用下面的命令安装 PHP 和 Apache 软件包:
```
sudo apt-get install php5 libapache2-mod-php5 -y
```
#### 测试 PHP
创建文件 `index.php`
```
sudo nano index.php
```
在里面写入一些 PHP 内容:
```
<?php echo "hello world"; ?>
```
保存文件,接下来删除 `index.html`,因为它比 `index.php` 的优先级更高:
```
sudo rm index.html
```
刷新你的浏览器,你会看到 “hello world”。这并不是动态的但是它仍然由 PHP 提供服务。如果你在上面看到提原始的 PHP 文件而不是“hello world”重新加载和重启 ApahceLCTT 译注,重启即可):
```
sudo /etc/init.d/apache2 reload
sudo /etc/init.d/apache2 restart
```
#### 安装 WiringPi
为了可以对代码的更改进行跟踪WiringPi 的维护采用 git。但假如你因为某些原因而没法使用 git还有一种可以替代的方案。通常你的防火墙会把你隔离开来所以请先检查一下你的防火墙的设置情况
如果你还没有安装 git那么在 Debian 及其衍生版本中(比如 Raspbian你可以这样安装它
```
sudo apt-get install git-core
```
若是你遇到了一些错误,请确保你的树莓派是最新版本的 Raspbian 系统:
```
sudo apt-get update sudo apt-get upgrade
```
使用 git 获取最 WiringPi
```
sudo git clone git://git.drogon.net/wiringPi
```
如果你之前已经使用过 clone 操作,那么可以使用下面命令:
```
cd wiringPi && git pull origin
```
这个命令会将会获取更新的版本,你然后可以重新运行下面的构建脚本。
有一个新的简化的脚本来构建和安装:
```
cd wiringPi && ./build
```
这个新的构建脚本将会为你完成编译和安装 WiringPi。它曾一度需要使用 `sudo` 命令,所以在运行这它之前你可能需要检查一下这个脚本。
#### 测试 WiringPi
运行 `gpio` 命令来检查安装成功与否:
```
gpio -v gpio readall
```
这将给你一些信心,软件运行良好。
#### 连接 DS18B20 传感器到树莓派
* 传感器上的黑线用于 GND。
* 红线用于 VCC。
* 黄线是 GPIO 线。
![GPIO image](https://opensource.com/sites/default/files/gpio_0.png "GPIO image")
连线:
* VCC 连接 3V 的 1 号引脚。
* GPIO 线连接 7 号引脚GPIO4
* 地线连接 GND 的 9 号引脚。
#### 软件配置
为了用 PHP 使用 DS18B20 温度传感器模块,你需要执行下面的命令来激活用于树莓派上 GPIO 引脚和 DS18B20 的内核模块:
```
sudo modprobe w1-gpio
sudo modprobe w1-therm
```
你不想每次 Raspberry 重启后都手动执行上述命令,所以你想每次开机能自动启动这些模块。可以在文件 `/etc/modules` 中添加下面的命令行来做到:
```
sudo nano /etc/modules/
```
添加下面的命令行到它里面:
```
w1-gpio
w1-therm
```
为了测试,输入:
```
cd /sys/bus/w1/devices/
```
现在输入 `ls`
你会看到你的设备信息。在设备驱动程序中,你的 DS18B20 传感器应该作为一串字母和数字被列出。在本例中,设备被记录为 `28-000005e2fdc3`。然后你需要使用 `cd` 命令来访问传感器,用你自己的序列号替代我的: `cd 28-000005e2fdc3`
DS18B20 会周期性的将数据写入文件 `w1_slave`,所以你只需要使用命令 `cat`来读出数据: `cat w1_slave`
这会生成下面的两行文本,输出中 `t=` 表示摄氏单位的温度。在前两位数后面加上一个小数点(例如,我收到的温度读数是 30.125 摄氏度)。
### 连接继电器
1、 取两根跳线,把其中一根连接到树莓派上的 GPIO2418 号引脚),另一根连接 GND 引脚。你可以参考下面这张图。
2、 现在将跳线的另一端连接到继电器板。GND 连接到继电器上的 GNDGPIO 输出线连接到继电器的通道引脚号,这取决于你正使用的继电器型号。记住,将树莓派上的 GND 与继电器上的 GND 连接连接起来,树莓派上的 GPIO 输出连接继电器上的输入引脚。
![Headers](https://opensource.com/sites/default/files/headers.png "Headers")
注意!将继电器连接树莓派的时候小心一些,因为它可能会导致电流回流,这会造成短路。
3、 现在将电源连接继电器,可以使用 12V 的电源适配器,也可以将 VCC 引脚连接到什么破上的 3.3V 或 5.5V 引脚。
### 使用 PHP 控制继电器
让我们先写一个借助于 WiringPi 软件用来控制 Paspberry Pi 上 GPIO 引脚的 PHP 脚本。
1、在 Apache 服务器的网站根目录下创建一个文件,使用下面命令切换到该目录:
```
cd /var/www/html
```
2、 新建一个叫 `Home` 的文件夹:
```
sudo mkdir Home
```
3、 新建一个叫 `on.php`的脚本
```
sudo nano on.php
```
4、 在脚本中加入下面的代码:
```
<?php
system("gpio-g mode 24 out");
system("gpio-g write 24 1");
?>
```
5、 使用 `CTRL+O` 保存文件,`CTRL+X` 退出。
上面的代码中,你在第一行使用命令将 24 号 GPIO引脚设置为 output 模式:
```
system("gpio-g mode 24 out") ;
```
在第二行,你使用 `1` 将 24 号引脚 GPIO 打开,在二进制中"1"表示打开,"0"表示关闭。
6、 为了关闭继电器,可以创建另外一个 `off.php` 文件,并用 `0` 替换 `1`
```
<?php
system(" gpio-g mode 24 out ");
system(" gpio-g write 24 1 ");
?>
```
7、 如果你已经将继电器连接了树莓派,可以在浏览器中输入你的树莓派的 IP 地址,并在后面加上目录名和文件名来进行访问:
```
http://{IPADDRESS}/home/on.php
```
这将会打开继电器。
8、 要关闭它,可以访问叫 `off.php` 的文件:
```
http://{IPADDRESS}/home/off.php
```
现在你需要能够在一个单独的页面来控制这两样事情,而不用单独的刷新或者访问这两个页面。你可以使用 AJAX 来完成。
9、 新建一个 HTML 文件,并在其中加入下面代码:
```
[html + php + ajax codeblock]
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">// <![CDATA[
$(document).ready(function() {
$('#on').click(function(){
var a= new XMLHttpRequest();
a.open("GET", "on.php"); a.onreadystatechange=function(){
if(a.readyState==4){ if(a.status ==200){
 } else alert ("http error"); } }
a.send();
});
});
$(document).ready(function()
{ $('#Off').click(function(){
var a= new XMLHttpRequest();
a.open("GET", "off.php");
a.onreadystatechange=function(){
if(a.readyState==4){
if(a.status ==200){
 } else alert ("http error"); } }
a.send();
});
});
</script>
<button id="on" type="button"``Switch Lights On </button>
<button id="off" type="button"``Switch Lights Off </button>
```
10、 保存文件,进入你的 web 浏览器目录,然后打开那个网页。你会看到两个按钮,它们可以打开和关闭灯泡。基于同样的想法,你还可以使用 bootstrap 和 CSS 来创建一个更加漂亮的 web 界面。
### 在这个网页上观察温度
1、 新建一个 `temperature.php` 的文件:
```
sudo nano temperature.php
```
2、 在文件中加入下面的代码,用你自己的设备 ID 替换 `10-000802292522`
```
<?php
//File to read
$file = '/sys/devices/w1_bus_master1/10-000802292522/w1_slave';
//Read the file line by line
$lines = file($file);
//Get the temp from second line
$temp = explode('=', $lines[1]);
//Setup some nice formatting (i.e., 21,3)
$temp = number_format($temp[1] / 1000, 1, ',', '');
//And echo that temp
echo $temp . " °C";
?>
```
3、 打开你刚刚创建的 HTML 文件,并创建一个新的带有 `id` 为 “screen” 的 `<div>`标签
```
<div id="screen"></div>
```
4、 在这个标签后或者这个文档的尾部下面的代码:
```
<script>
$(document).ready(function(){
setInterval(function(){
$("#screen").load('temperature.php')
}, 1000);
});
</script>
```
其中,`#screen` 是标签 `<div>``id` ,你想在它里面显示温度。它会每隔 1000 毫秒加载一次 `temperature.php` 文件。
我使用了 bootstrap 框架来制作一个漂亮的面板来显示温度,你还可以加入多个图标和图形让网页更有吸引力。
这只是一个控制继电器板并显示温度的基础的系统,你可以通过创建基于定时和从恒温器读数等基于事件触发来进一步地对系统进行开发。
题图opensource.com
--------------------------------------------------------------------------------
作者简介:
Abdul Hannan Mustajab: 我 17 岁,生活在印度。我正在追求科学,数学和计算机科学方面的教育。我在 spunkytechnology.com 上发表关于我的项目的博客。我一直在对使用不同的微控制器和电路板的基于物联网的 AI 进行研究。
via: https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi
作者:[Abdul Hannan Mustajab][a]
译者:[zhousiyu325](https://github.com/zhousiyu325)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/mustajabhannan
[1]:http://www.php.net/system
[2]:http://www.php.net/system
[3]:http://www.php.net/system
[4]:http://www.php.net/system
[5]:http://www.php.net/system
[6]:http://www.php.net/file
[7]:http://www.php.net/explode
[8]:http://www.php.net/number_format
[9]:https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi?rate=RX8QqLzmUb_wEeLw0Ee0UYdp1ehVokKZ-JbbJK_Cn5M
[10]:https://opensource.com/user/123336/feed
[11]:https://opensource.com/users/mustajabhannan

View File

@ -0,0 +1,99 @@
你为什么使用 Linux 和开源软件?
============================================================
> LinuxQuestions.org 的用户分享了他们使用 Linux 和开源技术的原因。我们的用户如何回答这个问题?
![Why do you use Linux and open source software?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUS_consensuscollab2.png?itok=j5vPMv-V "Why do you use Linux and open source software?")
>图片来源opensource.com
在网站问答区发布时我曾经提到过,尽管我一般会回答来自用户问题,但偶尔我也会反过来问读者一些问题。我并没有在问答区第一期文章这样做,看起来有点姗姗来迟。我最近在 LinuxQuestions.org 上提问了两个相关的问题,收到了很多回复。让我们看看我们的用户对同样的问题和 LinuxQuestions.org 的回答的对比。
### 你为什么使用 Linux
我向 LinuxQuestions.org 社区提问的第一个问题是:**[你们使用 Linux 的原因是什么?][1]**
#### 回答集锦
_oldwierdal_我用 Linux 是因为它运行快速、安全、可靠。在全世界的贡献者的参与下Linux 或许已经成为当前我们能用到的最先进和最具创新的软件。Linux 的用户体验就像红丝绒蛋糕上的糖衣一样令人回味无穷此外Linux 是免费的。
_Timothy Miller_我最开始使用 Linux 是因为它免费的,而且那时候我的经济条件无法承受购买新的 Windows 系统正版授权的费用。
_ondoho_ :因为它是一个拥有全球性社区为之努力、独立的草根操作系统。因为它在各方面都是自由的。因为它有足够多的理由让我们信任它。
_joham34_稳定、免费、安全能够运行在低配置的电脑上提供良好技术支持的社区感染病毒的几率更小。
_Ook_我用 Linux 是因为它可以完成工作,对我来说 Windows 系统在某些事上从来都不能做好。我不得不浪费时间和金钱让 Windows 继续正常运行下去。
_rhamel_我非常担心个人隐私泄露在网上。我意识到我不得不在隐私和便利性之间做出妥协。我可能是在骗自己但我确实认为 Linux 至少在某种程度上给了我一定的隐私权。
_educateme_我使用 Linux 因为它的开放、好学、热情乐于助人的社区。而且,它是免费的。
_colinetsegers_我为什么用 Linux原因不止一个。简单的说有以下几点
1. 自由分享知识的理念。
2. 浏览网页的时候有安全感。
3. 大量免费、有用的软件。
_bamunds_因为我热爱自由。
_cecilskinner1989_我用 Linux 的两个原因:稳定性和隐私。
### 你为什么使用开源软件?
第二个问题相对更加宽泛:**[你为什么使用开源软件?][2]**你会注意到尽管有些回复是有重复的部分,但用户的回答大体上的语气是不同的,有些用户的回答得到很多人的赞同和支持,也有不少用户的回答不怎么被其他人认同。
#### 回答集锦
_robert leleu_温馨、合作的氛围是我沉溺于开源的主要原因。
_cjturner_对于应用而言开源正好反映了帕累托法则不做二次开发的话一个软件包最终可能只能满足你的 80% 的需求,而你需要自己解决剩下的 20%。开源给了你一个途径,通过社区来解决这种问题,你可以自己努力实现(如果你有相关的技能)或者花钱有偿请人实现你的需求。
_Timothy Miller_我喜欢这种体验我能够自己检查源代码来确定我所选择的软件是安全的。
_teckk_没有繁琐的许可要求或者数字版权管理DRM而且每个人都可以获得它。
_rokytnji_ :像零花钱,摩托车部件,孙辈的生日礼物那样令人愉悦。
_timl_没有自由软件避免隐私的泄露是不可能。
_hazel_我喜欢自由软件的哲学但如果 Linux 是一个糟糕的操作系统我也会理性的不去使用它。我使用 Linux 是因为我热爱 Linux而且你也能免费获得它就像免费的啤酒一样。事实上它也如言论自由一般自由不受拘束使用开源软件让我感觉很舒服。但是如果我发现我的计算机有一个硬件需要专有固件的配合才能发挥功能我也会使用专有固件。
_lm8_我使用开源软件是因为我不必担心由于开发公司的破产或者决定停止维护它而导致它可能会变得过时或者被废弃。我能够自己来完成后续的更新、维护。如果我想让软件能够做我想的任何事情我也可以进一步定制它但是如果有更多的特性那就更好了。我也喜欢开源因为开源我才能够和朋友、同事们分享我喜欢的程序。
_donguitar_因为它能够让我学到很多也让我让别人学到了很多。
### 该你回答了
所以_**你**_ 使用 Linux 的原因是什么? _**你**_ 使用开源软件的原因是什么?请在评论区告诉我们。
#### 最后的补充
最后,在以后的文章里你想看到什么问题的回答?是社区的建立和维护的相关问题,还是你想知道如何对一个开源项目作出贡献,还是更有技术性的问题 — [向我们提交你对 Linux 和 开源的问题][5]。
--------------------------------------------------------------------------------
作者简介:
Jeremy Garcia - Jeremy Garcia 是 LinuxQuestions.org 的创立者同时也是一位热情中不乏现实主义的开源倡导者。你可以在 Twitter 上关注 Jeremy@linuxquestions
------------------
via: https://opensource.com/article/17/3/why-do-you-use-linux-and-open-source-software
作者:[Jeremy Garcia][a]
译者:[WangYueScream](https://github.com/WangYueScream)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/jeremy-garcia
[1]:http://www.linuxquestions.org/questions/linux-general-1/what-are-the-reasons-you-use-linux-4175600842/
[2]:http://www.linuxquestions.org/questions/linux-general-1/what-are-the-reasons-you-use-open-source-software-4175600843/
[3]:https://opensource.com/article/17/3/why-do-you-use-linux-and-open-source-software?rate=lVazcbF6Oern5CpV86PgNrRNZltZ8aJZwrUp7SrZIAw
[4]:https://opensource.com/tags/queue-column
[5]:https://opensource.com/thequeue-submit-question
[6]:https://opensource.com/user/86816/feed
[7]:https://opensource.com/article/17/3/why-do-you-use-linux-and-open-source-software#comments
[8]:https://opensource.com/users/jeremy-garcia

View File

@ -1,7 +1,17 @@
开发 Linux 调试器第一部分:启动
开发一个 Linux 调试器(一):准备环境
============================================================
任何写过 hello world 程序的人都应该使用过调试器(如果你还没有,那就停下手头的工作先学习一下吧)。但是,尽管这些工具已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发[1][1],尤其是和其它类似编译器等工具链技术相比的时候。
任何写过比 hello world 复杂一些的程序的人都应该使用过调试器(如果你还没有,那就停下手头的工作先学习一下吧)。但是,尽管这些工具已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发,尤其是和其它那些比如编译器等工具链技术相比而言。
> 此处有一些其它的资源可以参考:
> - http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1
> - https://t-a-w.blogspot.co.uk/2007/03/how-to-code-debuggers.html
> - https://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger
> - http://system.joekain.com/debugger/
我们将会支持以下功能:
@ -29,37 +39,32 @@
在本项目中我会将重点放在 C 和 C++,但对于那些将源码编译为机器码并输出标准 DWARE 调试信息的语言也应该能起作用(如果你还不知道这些东西是什么,别担心,马上就会介绍到啦)。另外,我只关注如何将程序运行起来并在大部分情况下能正常工作,为了简便,会避开类似健壮错误处理方面的东西。
* * *
### 系列文章索引
随着后面文章的发布,这些链接会逐渐生效。
1. [启动][2]
1. [准备环境][2]
2. [断点][3]
3. 寄存器和内存
4. Elves 和 dwarves
5. 逐步、源码和信号
6. 使用 DWARF 调试信息逐步执行
5. 源码和信号
6. 源码层逐步执行
7. 源码层断点
8. 调用栈
9. 读取变量
10. 下一步
10. 之后步骤
译者注ELF[Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式DWARF一种广泛使用的调试数据格式参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")
* * *
LCTT 译注ELF —— <ruby>可执行文件格式<rt>[Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format")</rt></ruby>DWARF一种广泛使用的调试数据格式参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI"))。
### 准备环境
在我们正式开始之前,我们首先要设置环境。在这篇文章中我会依赖两个工具:[Linenoise][4] 用于处理命令行输入,[libelfin][5] 用于解析调试信息。你也可以使用更传统的 libdwarf 而不是 libelin但是界面没有那么友好另外 libelfin 还提供大部分完整的 DWARF 表达式求值程序,当你想读取变量的值时这能帮你节省很多时间。确认你使用的是我 libelfin 仓库中的 fbreg 分支,因为它提供 x86 上读取变量的额外支持。
在我们正式开始之前,我们首先要设置环境。在这篇文章中我会依赖两个工具:[Linenoise][4] 用于处理命令行输入,[libelfin][5] 用于解析调试信息。你也可以使用更传统的 libdwarf 而不是 libelfin但是界面没有那么友好另外 libelfin 还提供了基本完整的 DWARF 表达式求值器,当你想读取变量的值时这能帮你节省很多时间。确认你使用的是 libelfin 我的 fbreg 分支,因为它提供 x86 上读取变量的额外支持。
一旦你在系统上安装或者使用你喜欢的编译系统编译好了这些依赖工具,就可以开始啦。我在 CMake 文件中把它们设置为和我其余的代码一起编译。
* * *
### 启动可执行程序
在真正调试任何程序之前,我们需要启动被调试的程序。我们会使用经典的 fork/exec 模式。
在真正调试任何程序之前,我们需要启动被调试的程序。我们会使用经典的 `fork`/`exec` 模式。
```
int main(int argc, char* argv[]) {
@ -82,7 +87,7 @@ int main(int argc, char* argv[]) {
}
```
我们调用 `fort` 把我们的程序分成两个进程。如果我们是在子进程,`fork` 返回 0如果我们是在父进程它会返回子进程的进程ID。
我们调用 `fork` 把我们的程序分成两个进程。如果我们是在子进程,`fork` 返回 0如果我们是在父进程它会返回子进程的进程 ID。
如果我们是在子进程,我们要用希望调试的程序替换正在执行的程序。
@ -91,22 +96,20 @@ int main(int argc, char* argv[]) {
execl(prog.c_str(), prog.c_str(), nullptr);
```
这里我们第一次遇到了 `ptrace`,它会在我们编写调试器的时候经常遇到。`ptrace` 通过读取寄存器、内存、逐步调试等让我们观察和控制另一个进程的执行。API 非常简单;你需要给这个简单函数提供一个枚举值用于你想要进行的操作,然后是一些取决于你提供的值可能会被使用也可能会被忽略的参数。函数签名看起来类似:
这里我们第一次遇到了 `ptrace`,它会在我们编写调试器的时候经常遇到。`ptrace` 通过读取寄存器、内存、逐步调试等让我们观察和控制另一个进程的执行。API 非常简单;你需要给这个简单函数提供一个枚举值指定你想要进行的操作,然后是一些取决于你提供的值可能会被使用也可能会被忽略的参数。函数原型看起来类似:
```
long ptrace(enum __ptrace_request request, pid_t pid,
void *addr, void *data);
```
`request` 是我们想对被跟踪进程进行的操作;`pid` 是被跟踪进程的进程 ID`addr` 是一个内存地址,用于在一些调用中指定被跟踪程序的地址;`data` 是 `request` 相应的资源。返回值通常是一些错误信息,因此在你实际的代码中你也许应该检查返回值;为了简洁我这里就省略了。你可以查看 man 手册获取更多(关于 ptrace的信息。
`request` 是我们想对被跟踪进程进行的操作;`pid` 是被跟踪进程的进程 ID`addr` 是一个内存地址,用于在一些调用中指定被跟踪程序的地址;`data` 是 `request` 相应的资源。返回值通常是一些错误信息,因此在你实际的代码中你也许应该检查返回值;为了简洁我这里就省略了。你可以查看 man 手册获取更多(关于 ptrace的信息。
上面代码中我们发送的请求 `PTRACE_TRACEME` 表示这个进程应该允许父进程跟踪它。所有其它参数都会被忽略,因为 API 设计并不是很重要
上面代码中我们发送的请求 `PTRACE_TRACEME` 表示这个进程应该允许父进程跟踪它。所有其它参数都会被忽略,因为 API 设计并不是很重要,哈哈。
下一步,我们会调用 `execl`,这是很多类似的 `exec` 函数之一。我们执行指定的程序,通过命令行参数传递它的名称,然后用一个 `nullptr` 终止列表。如果你愿意,你还可以传递其它执行你的程序所需的参数。
下一步,我们会调用 `execl`,这是很多诸多的 `exec` 函数格式之一。我们执行指定的程序,通过命令行参数传递它的名称,然后用一个 `nullptr` 终止列表。如果你愿意,你还可以传递其它执行你的程序所需的参数。
在完成这些后,我们就会结束子进程的执行;在我们结束它之前它会一直执行。
* * *
在完成这些后,我们就会和子进程一起结束;在我们结束它之前它会一直执行。
### 添加调试循环
@ -134,7 +137,7 @@ private:
};
```
`run` 函数中,我们需要等待,直到子进程完成启动,然后一直从 linenoise 获取输入直到收到 EOFctrl+d)。
`run` 函数中,我们需要等待,直到子进程完成启动,然后一直从 `linenoise` 获取输入直到收到 `EOF``CTRL+D`)。
```
void debugger::run() {
@ -151,15 +154,13 @@ void debugger::run() {
}
```
当被跟踪的进程启动时,会发送一个 `SIGTRAP` 信号给它,这是一个跟踪或者断点中断。我们可以使用 `waitpid` 函数等待直到这个信号发送。
当被跟踪的进程启动时,会发送一个 `SIGTRAP` 信号给它,这是一个跟踪或者断点中断。我们可以使用 `waitpid` 函数等待这个信号发送。
当我们知道进程可以被调试之后,我们监听用户输入。`linenoise` 函数它自己会用一个窗口显示和处理用户输入。这意味着我们不需要做太多的工作就会有一个有历史记录和导航命令的命令行。当我们获取到输入时,我们把命令发给我们写的小程序 `handle_command`,然后我们把这个命令添加到 linenoise 历史并释放资源。
* * *
当我们知道进程可以被调试之后,我们监听用户输入。`linenoise` 函数它自己会用一个窗口显示和处理用户输入。这意味着我们不需要做太多的工作就会有一个支持历史记录和导航命令的命令行。当我们获取到输入时,我们把命令发给我们写的小程序 `handle_command`,然后我们把这个命令添加到 `linenoise` 历史并释放资源。
### 处理输入
我们的命令和 gdb 以及 lldb 有类似的格式。要继续执行程序,用户需要输入 `continue``cont` 甚至只需 `c`。如果他们想在一个地址中设置断点,他们会输入 `break 0xDEADBEEF`,其中 `0xDEADBEEF` 就是所需地址的 16 进制格式。让我们来增加对这些命令的支持吧。
我们的命令类似 gdb 以及 lldb 的格式。要继续执行程序,用户需要输入 `continue``cont` 甚至只需 `c`。如果他们想在一个地址中设置断点,他们会输入 `break 0xDEADBEEF`,其中 `0xDEADBEEF` 就是所需地址的 16 进制格式。让我们来增加对这些命令的支持吧。
```
void debugger::handle_command(const std::string& line) {
@ -222,9 +223,9 @@ void debugger::continue_execution() {
via: http://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/
作者:[Simon Brand ][a]
作者:[Simon Brand][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[校对者ID](https://github.com/校对者ID)
校对:[jasminepeng](https://github.com/jasminepeng)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,31 +1,26 @@
开发 Linux 调试器第二部分:断点
开发一个 Linux 调试器(二):断点
============================================================
在该系列的第一部分,我们写了一个小的进程启动器作为我们调试器的基础。在这篇博客中,我们会学习断点如何在 x86 Linux 上工作以及给我们工具添加设置断点的能力。
在该系列的第一部分,我们写了一个小的进程启动器作为我们调试器的基础。在这篇博客中,我们会学习在 x86 Linux 上断点是如何工作的,以及如何给我们工具添加设置断点的能力。
* * *
###系列文章索引
### 系列文章索引
随着后面文章的发布,这些链接会逐渐生效。
1. [启动][2]
1. [准备环境][2]
2. [断点][3]
3. 寄存器和内存
4. Elves 和 dwarves
5. 逐步、源码和信号
6. 使用 DWARF 调试信息逐步执行
7. 源码层断点
8. 调用栈
9. 读取变量
10. 下一步
5. 源码和信号
6. 源码层逐步执行
7. 源码层断点
8. 调用栈
9. 读取变量
10.之后步骤
译者注ELF[Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式DWARF一种广泛使用的调试数据格式参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")
* * *
### 断点是如何形成的?
### 断点如何形成?
有两种类型的断点:硬件和软件。硬件断点通常涉及设置和体系结构相关的寄存器来为你产生断点,而软件断点则涉及修改正在执行的代码。在这篇文章中我们只会关注软件断点,因为它们比较简单,而且足够完成你想要的功能。在 x86 机器上任一时刻你最多只能有 4 个硬件断点,但是它们能使你通过读取或者写入给定地址生效,而不是只有当执行到那里的时候。
有两种类型的断点:硬件和软件。硬件断点通常涉及到设置与体系结构相关的寄存器来为你产生断点,而软件断点则涉及到修改正在执行的代码。在这篇文章中我们只会关注软件断点,因为它们比较简单,而且可以设置任意多断点。在 x86 机器上任一时刻你最多只能有 4 个硬件断点,但是它们能让你在读取或者写入给定地址时触发,而不是只有当代码执行到那里的时候。
我前面说软件断点是通过修改正在执行的代码实现的,那么问题就来了:
@ -33,15 +28,13 @@
* 为了设置断点我们要做什么修改?
* 如何告知调试器?
第一个问题的答案显然是 `ptrace`。我们之前已经用它来启动我们的程序以便跟踪和继续它的执行,但我们也可以用它来读或者写内存。
第一个问题的答案显然是 `ptrace`。我们之前已经用它为我们的程序设置跟踪并继续程序的执行,但我们也可以用它来读或者写内存。
当执行到断点时,我们的更改要让处理器暂停并给程序发送信号。在 x86 机器上这是通过 `int 3` 重写该地址上的指令实现的。x86 机器有个`interrupt vector table`(中断向量表),操作系统能用它来为多种事件注册处理程序,例如页故障、保护故障和无效操作码。它就像是注册错误处理回调函数,但是在硬件层面的。当处理器执行 `int 3` 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给进程发送 `SIGTRAP` 信号。你可以在下图中看到这个进程,我们用 `0xcc`-`int 3` 的指令编码 - 覆盖了 `mov` 指令的第一个字节。
当执行到断点时,我们的更改要让处理器暂停并给程序发送信号。在 x86 机器上这是通过 `int 3` 重写该地址上的指令实现的。x86 机器有个中断向量表interrupt vector table),操作系统能用它来为多种事件注册处理程序,例如页故障、保护故障和无效操作码。它就像是注册错误处理回调函数,但是在硬件层面的。当处理器执行 `int 3` 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给进程发送 `SIGTRAP` 信号。你可以在下图中看到这个进程,我们用 `0xcc` 覆盖了 `mov` 指令的第一个字节,它是 `init 3` 的指令代码
![断点](http://blog.tartanllama.xyz/assets/breakpoint.png)
最后一个谜题是调试器如何被告知中断的。如果你回顾前面的文章,我们可以用 `waitpid` 来监听被发送给被调试程序的信号。这里我们也可以这样做:设置断点、继续执行程序、调用 `waitpid` 然后等待直到发生 `SIGTRAP`。然后就可以通过打印已运行到的源码位置、或改变有图形用户界面的调试器中关注的代码行从而将这个断点传达给用户。
* * *
谜题的最后一个部分是调试器如何被告知中断的。如果你回顾前面的文章,我们可以用 `waitpid` 来监听被发送给被调试的程序的信号。这里我们也可以这样做:设置断点、继续执行程序、调用 `waitpid` 并等待直到发生 `SIGTRAP`。然后就可以通过打印已运行到的源码位置、或改变有图形用户界面的调试器中关注的代码行,将这个断点传达给用户。
### 实现软件断点
@ -67,9 +60,10 @@ private:
uint64_t m_saved_data; //data which used to be at the breakpoint address
};
```
这里的大部分代码都是跟踪状态;真正神奇的地方是 `enable``disable` 函数。
正如我们上面学到的,我们要用 `int 3` 指令 - 编码为 `0xcc` - 替换当前指定地址的指令。我们还要保存该地址之前的值,以便后面恢复代码;我们不想忘了执行用户的代码。
正如我们上面学到的,我们要用 `int 3` 指令 - 编码为 `0xcc` - 替换当前指定地址的指令。我们还要保存该地址之前的值,以便后面恢复代码;我们不想忘了执行用户(原来)的代码。
```
void breakpoint::enable() {
@ -82,9 +76,9 @@ void breakpoint::enable() {
}
```
`ptrace` 的 `PTRACE_PEEKDATA` 请求完成如何读取被跟踪进程的内存。我们给它一个进程 ID 和一个地址,然后它返回给我们该地址当前的 64 位内容。 `(m_saved_data & ~0xff)` 把这个数据的低位字节置零,然后我们用它和我们的 `int 3` 指令按位或 `OR` 来设置断点。然后我们通过 `PTRACE_POKEDATA` 用我们的新数据覆盖那部分内存来设置断点。
`PTRACE_PEEKDATA` 请求告知 `ptrace` 如何读取被跟踪进程的内存。我们给它一个进程 ID 和一个地址,然后它返回给我们该地址当前的 64 位内容。 `(m_saved_data & ~0xff)` 把这个数据的低位字节置零,然后我们用它和我们的 `int 3` 指令按位或`OR`)来设置断点。最后我们通过 `PTRACE_POKEDATA` 用我们的新数据覆盖那部分内存来设置断点。
`disable` 的实现比较简单,我们只需要恢复用 `0xcc` 覆盖的原始数据。
`disable` 的实现比较简单,我们只需要恢复用 `0xcc` 覆盖的原始数据。
```
void breakpoint::disable() {
@ -93,8 +87,6 @@ void breakpoint::disable() {
}
```
* * *
### 在调试器中增加断点
为了支持通过用户界面设置断点,我们要在 debugger 类修改三个地方:
@ -116,7 +108,7 @@ private:
}
```
`set_breakpoint_at_address` 函数中我们会新建一个 breakpoint 对象、启用它、把它添加到数据结构里、并给用户打印一条信息。如果你喜欢的话,你可以重构所有的输出信息,从而你可以将调试器作为库或者命令行工具使用,为了简便,我把它们都整合到了一起。
`set_breakpoint_at_address` 函数中我们会新建一个 breakpoint 对象,启用它,把它添加到数据结构里,并给用户打印一条信息。如果你喜欢的话,你可以重构所有的输出信息,从而你可以将调试器作为库或者命令行工具使用,为了简便,我把它们都整合到了一起。
```
void debugger::set_breakpoint_at_address(std::intptr_t addr) {
@ -147,23 +139,19 @@ void debugger::handle_command(const std::string& line) {
}
```
我删除了字符串中的前两个字符并对结果调用 `std::stol`,为了让解析更加强壮,你也可以修改它。`std::stol` 可以将字符串按照所给基数转化为整数。
* * *
我删除了字符串中的前两个字符并对结果调用 `std::stol`,你也可以让该解析更健壮一些。`std::stol` 可以将字符串按照所给基数转化为整数。
### 从断点继续执行
如果你尝试这样做,你可能会发现如果你从断点处继续执行,不会发生任何事情。这是因为断点仍然在内存中,因此一直被命中。简单的解决办法就是停用这个断点、运行到下一步、再次启用这个断点、然后继续执行。不幸的是我们还需要更改程序计数器指回断点前面,我们会将这部分内容留到下一篇博客学习了如何操作寄存器之后。
* * *
如果你尝试这样做,你可能会发现,如果你从断点处继续执行,不会发生任何事情。这是因为断点仍然在内存中,因此一直被重复命中。简单的解决办法就是停用这个断点、运行到下一步、再次启用这个断点、然后继续执行。不过我们还需要更改程序计数器,指回到断点前面,这部分内容会留到下一篇关于操作寄存器的文章中介绍。
### 测试它
当然,如果你不知道要设置的地址,设置断点并非很有帮助。后面我们会学习如何在函数名或者代码行设置断点,但现在我们可以通过手动实现。
当然,如果你不知道要在哪个地址设置,那么在某些地址设置断点并非很有用。后面我们会学习如何在函数名或者代码行设置断点,但现在我们可以通过手动实现。
测试你调试器的简单方法是写一个 hello world 程序,这个程序输出到 `std::err`(为了避免缓存),并在调用输出操作符的地方设置断点。如果你继续执行被调试的程序,执行很可能会停止而不会输出任何东西。然后你可以重启调试器并在调用之后设置一个断点,现在你应该看到成功地输出了消息。
查找地址的一个方法是使用 `objdump`。如果你打开一个终端并执行 `objdump -d <your program>`,然后你应该看到你程序的反汇编代码。然后你就可以找到 `main` 函数并定位到你想设置断点的 `call` 指令。例如,我编译了一个 hello world 程序,反汇编它,然后得到了 `main` 的反汇编代码:
查找地址的一个方法是使用 `objdump`。如果你打开一个终端并执行 `objdump -d <your program>`,然后你应该看到你程序的反汇编代码。你就可以找到 `main` 函数并定位到你想设置断点的 `call` 指令。例如,我编译了一个 hello world 程序,反汇编它,然后得到了如下的 `main` 的反汇编代码:
```
0000000000400936 <main>:
@ -179,8 +167,6 @@ void debugger::handle_command(const std::string& line) {
正如你看到的,要没有输出,我们要在 `0x400944` 设置断点,要看到输出,要在 `0x400949` 设置断点。
* * *
### 总结
现在你应该有了一个可以启动程序、允许在内存地址上设置断点的调试器。后面我们会添加读写内存和寄存器的功能。再次说明,如果你有任何问题请在评论框中告诉我。
@ -191,13 +177,13 @@ void debugger::handle_command(const std::string& line) {
via: http://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/
作者:[Simon Brand ][a]
作者:[Simon Brand][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[校对者ID](https://github.com/校对者ID)
校对:[jasminepeng](https://github.com/jasminepeng)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://blog.tartanllama.xyz/
[1]:http://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/
[2]:http://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/
[2]:https://linux.cn/article-8626-1.html
[3]:https://github.com/TartanLlama/minidbg/tree/tut_break

View File

@ -0,0 +1,211 @@
FreeFileSync在 Ubuntu 中对比及同步文件
============================================================
FreeFileSync 是一个自由、开源以及跨平台的文件夹对比及同步软件它可以帮助你[同步 Linux、Windows 和 Mac OS 中的文件和文件夹][2]。
它是便携的,也可以被安装在本地系统中,它的功能丰富,旨在节省设置和执行备份操作的时间,同时具有有吸引力的图形界面。
#### FreeFileSync 功能
下面是它的主要功能:
1. 它可以同步网络共享和本地磁盘。
2. 它可以同步 MTP 设备Android、iPhone、平板电脑、数码相机
3. 它也可以通过 [SFTPSSH 文件传输协议)][1]进行同步。
4. 它可以识别被移动和被重命名的文件和文件夹。
5. 使用目录树显示磁盘空间使用情况。
6. 支持复制锁定文件(卷影复制服务)。
7. 识别冲突并同步删除propagate deletions
8. 支持按内容比较文件。
9. 它可以配置为处理符号链接。
10. 支持批量自动同步。
11. 支持多个文件夹比较。
12. 支持深入详细的错误报告。
13. 支持复制 NTFS 扩展属性,如(压缩、加密、稀疏)。
14. 还支持复制 NTFS 安全权限和 NTFS 备用数据流。
15. 支持超过 260 个字符的长文件路径。
16. 支持免故障的文件复制防止数据损坏。
17. 允许扩展环境变量,例如 `UserProfile`
18. 支持通过卷名访问可变驱动器盘符U盘
19. 支持管理已删除/更新文件的版本。
20. 通过最佳同步序列防止光盘空间问题。
21. 完全支持 Unicode。
22. 提供高度优化的运行时性能。
23. 支持过滤器包含和排除文件等。
### 如何在 Ubuntu 中安装 FreeFileSync
我们会添加官方的 FreeFileSync PPA这只在 Ubuntu 14.04  Ubuntu 15.10 上有,那么像这样更新系统仓库列表并安装它:
```
-------------- 在 Ubuntu 14.04 和 15.10 上 --------------
$ sudo apt-add-repository ppa:freefilesync/ffs
$ sudo apt-get update
$ sudo apt-get install freefilesync
```
对于 Ubuntu 16.04 或者更新的版本,进入 [FreeFileSync 的下载页][3]为你的 Ubuntu 和 Debian 获取合适的包。
接下来,进入下载文件夹,如下解压 FreeFileSync_*.tar.gz 到 `/opt` 目录中:
```
$ cd Downloads/
$ sudo tar xvf FreeFileSync_*.tar.gz -C /opt/
$ cd /opt/
$ ls
$ sudo unzip FreeFileSync/Resources.zip -d /opt/FreeFileSync/Resources/
```
下载我们会使用 Gnome 面板创建一个程序启动器(`.desktop` 文件)。要浏览系统中 `.desktop` 文件的例子,列出 `/usr/share/applications` 目录的内容:
```
$ ls /usr/share/applications
```
为防你没有安装 Gnome 面板,输入下面的命令来安装:
```
$ sudo apt-get install --no-install-recommends gnome-panel
```
接下来,运行下面的命令来创建程序启动器:
```
$ sudo gnome-desktop-item-edit /usr/share/applications/ --create-new
```
并定义下面的值:
```
Type: Application
Name: FreeFileSync
Command: /opt/FreeFileSync/FreeFileSync
Comment: Folder Comparison and Synchronization
```
要为启动器添加一个图标,只需要点击图标选择:`/opt/FreeFileSync/Resources/FreeFileSync.png`。
当你设置完成之后,点击 OK 创建。
[
![Create Desktop Launcher](http://www.tecmint.com/wp-content/uploads/2017/03/Create-Desktop-Launcher.png)
][4]
*创建桌面启动器*
如果你不想要创建桌面启动器,你可以从目录中启动 FreeFileSync。
```
$ ./FreeFileSync
```
### 如何在 Ubuntu 中使用 FreeFileSync
在 Ubuntu 中,在 Unity Dash 中搜索 FreeFileSync然而在 Linux Mint 中,在 System Menu 中搜索,并点击 FreeFileSync 图标打开。
[
![FreeFileSync ](http://www.tecmint.com/wp-content/uploads/2017/03/FreeFileSync-launched.png)
][5]
*FreeFileSync*
#### 使用 FreeFileSync 比较两个文件夹
在下面的例子中,我们使用:
```
Source Folder: /home/aaronkilik/bin
Destination Folder: /media/aaronkilik/J_CPRA_X86F/scripts
```
要比较文件时间以及两个文件夹的大小(默认设置),只要点击比较按钮。
[
![Compare Two Folders in Linux](http://www.tecmint.com/wp-content/uploads/2017/03/compare-two-folders.png)
][6]
*在 Linux 中比较两个文件夹*
通过下面的界面,可以在两个文件夹中按 `F6` 来更改要比较的内容:文件时间和大小、内容或文件大小。请注意,你选择的每个选项的含义也包括在内。
[
![File Comparison Settings](http://www.tecmint.com/wp-content/uploads/2017/03/comparison-settings.png)
][7]
*文件比较设置*
#### 使用 FreeFileSync 同步两个文件夹
你可以开始比较两个文件夹,接着点击 Synchronize 按钮启动同步进程。在之后出现的对话框中点击 Start
```
Source Folder: /home/aaronkilik/Desktop/tecmint-files
Destination Folder: /media/aaronkilik/Data/Tecmint
```
[
![Compare and Synchronize Two Folders](http://www.tecmint.com/wp-content/uploads/2017/03/compare-and-sychronize-two-folders.png)
][8]
*比较以及同步两个文件夹*
[
![Start File Synchronization](http://www.tecmint.com/wp-content/uploads/2017/03/start-sychronization.png)
][9]
*开始文件同步*
[
![File Synchronization Completed](http://www.tecmint.com/wp-content/uploads/2017/03/synchronization-complete.png)
][10]
*文件同步完成*
在下面的界面中按下 `F8` 设置默认同步选项two way、mirror、update 或 custom。每个选项的意义不言自明。
[
![File Synchronization Settings](http://www.tecmint.com/wp-content/uploads/2017/03/synchronization-setttings.png)
][11]
*文件同步设置*
要了解更多信息,访问 FreeFileSync 主页:[http://www.freefilesync.org/][12]
就是这样了!在本篇中,我们向你展示了如何在 Ubuntu 以及它的衍生版 Linux Mint、Kubuntu 等等中安装 FreeFileSync。在下面的评论栏中分享你的想法。
--------------------------------------------------------------------------------
作者简介:
Ravi SaiveTecMint 的原创作者。一个喜爱在互联网上分享技巧和提示的计算机 geek 和 Linux 老手。我的大多数服务运行在 Linux 开源平台上。请在 Twitter、Facebook、Google+ 上关注我。
--------------------------------------------------------------------------------
via: http://www.tecmint.com/freefilesync-compare-synchronize-files-in-ubuntu/
作者:[Ravi Saive][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.tecmint.com/author/admin/
[00]:https://twitter.com/ravisaive
[01]:https://www.facebook.com/ravi.saive
[02]:https://plus.google.com/u/0/+RaviSaive
[1]:http://www.tecmint.com/sftp-command-examples/
[2]:http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/
[3]:http://www.freefilesync.org/download.php
[4]:http://www.tecmint.com/wp-content/uploads/2017/03/Create-Desktop-Launcher.png
[5]:http://www.tecmint.com/wp-content/uploads/2017/03/FreeFileSync-launched.png
[6]:http://www.tecmint.com/wp-content/uploads/2017/03/compare-two-folders.png
[7]:http://www.tecmint.com/wp-content/uploads/2017/03/comparison-settings.png
[8]:http://www.tecmint.com/wp-content/uploads/2017/03/compare-and-sychronize-two-folders.png
[9]:http://www.tecmint.com/wp-content/uploads/2017/03/start-sychronization.png
[10]:http://www.tecmint.com/wp-content/uploads/2017/03/synchronization-complete.png
[11]:http://www.tecmint.com/wp-content/uploads/2017/03/synchronization-setttings.png
[12]:http://www.freefilesync.org/
[13]:http://www.tecmint.com/author/admin/
[14]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[15]:http://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -0,0 +1,95 @@
Linux 大爆炸:一个内核,无数发行版
============================================================
![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg)
即使你是一个 Linux 新人,你可能也已经知道它不是一个单一的、整体的操作系统,而是一群项目。这个星座中不同的“星”组成了“发行版”。每个都提供了自己的 Linux 模式。
感谢这一系列发行版所提供的多种选择,这有助于了解 Linux 如何开始并随后激增的。因此,这里会简要介绍一下 Linux 的历史。
### Linus Torvalds内核构建者
大多数熟悉 Linux 的人都已经听说过它的创建者 Linus Torvalds (上图中的人),但是并不知道他最初为何创建它。在 1991 年Torvalds 还是一名在芬兰学习计算机的大学生。作为一个独立的个人项目,他希望为他的独特硬件创建一个类 Unix 内核。
“内核”是操作系统的一部分,它介乎于操作系统和硬件之间,通过其固件进行协调。本质上,它是系统的核心。开发内核不是一个小工程,但是 Torvalds 渴望挑战,并且发现他自己有这个罕见的技能。
由于他刚接触内核,他希望得到其他人的帮助来确保他走在正确的轨道上,因此他通过在早期的互联网论坛 Usenet 发布他的内核代码,并征求了老牌的老手的经验。然后贡献者就涌来了。
在建立了一个对论坛提交的补丁进行审查以及选择性地集成它们的流程后Torvalds 意识到他聚集起了一个非正式的团队。在项目发展之后,它很快成为了一个比较正式的开发团队。
### Richard Stallman 的角色
虽然 Torvalds 以及他的团建创造了 Linux 内核,但是没有 Richard Stallman 的工作也不会有随后 Linux 众多发行版的传播Richard 在十年之前发起了一个自由软件运动。
受到许多核心 Unix 程序和系统功能缺乏透明度的阻挠Stallman 决定自己编写一个,与任何想要它的人自由共享源代码,并且开放提交。他创造了许多核心程序的主体,并在 1983 年发布,统称为 “GNU 项目”。
没有它们,内核不会有那么多的用量。基于 Linux 的操作系统的早期设计人员很乐意将 GNU 工具集成到他们的项目中。
不同的团队开始出现 - 每个团队都有自己的计算功能和架构的理念。他们将 Linux 内核、GNU 实用程序和他们自己的原始软件结合在一起,然而“发行”了 Linux 操作系统的变体。
### 服务器发行版
每个发行版有它自己的设计逻辑和目的,但是要了解它们的细微差别,需要了解上游和下游开发人员之间的区别。“上游开发人员”负责实际创建项目并发布,以供个人下载或将其包含在其他项目中。相比之下,“下游开发人员”或“软件包维护人员”是指每个发布上游程序的人员,他们对每个上游程序的版本进行调整以适应下游项目的使用情况。
虽然大多数 Linux 发行版包含一些(自己的)原生项目,但大部分发行版开发主要是对 Linux 内核、GNU 工具和庞大的用户程序生态系统的“下游”工作。
许多发行通过优化特定使用场景来彰显它们的特征。例如,某些项目被设计作为服务器运行。为部署服务器而量身定制的发行版通常会避开上游项目中快速推出的最新功能,而倾向于发布一个经过彻底测试的、基础的基本软件,系统管理员可以依靠它来顺利运行。
针对服务器的发行版的的开发团队经常很大,并且有富有经验的程序员可以为每个版本提供多年的支持。
### 桌面发行版
也有很多的发行版针对桌面用户。事实上,一些知名的发行版通过提供简单的安装以及直观的界面来与商业的操作系统竞争。这些发行版通常包含了大量的软件仓库,它包含了用户可以想到的每个软件,这样用户可以定制它们自己的系统。
由于可用性是关键,他们可能会投入部门大量的员工来创建一个特征鲜明的、发行版特定的桌面,或调整已有的桌面以适应其设计理念。以用户为中心的发行版往往会加快其下游开发时间表,有助于及时为用户提供新功能。
“滚动发布”项目,这是一种桌面发行版的子集,其被设计成紧跟潮流。滚动发布项目的包维护人员在为每个上游程序完成调整后分别发布其新版本,而不是等待所需的上游程序的开发达到某一特定的节点,然后将其集成到单个版本中。
这种方法的一个优点是安全性,因为其关键补丁的发布将比非滚动发行版更快。另一个好处是新功能立即可用,不然用户需要等待才行。滚动发布的缺点是需要更多的人工干预和仔细维护,因为某些升级可能会与其他升级相冲突从而破坏系统。
### 嵌入式系统
另外一个 Linux 发行版类别是“嵌入式系统”,它被极致裁剪(相对与服务器和桌面发行版)来适应特定的使用情况。
我们经常会忘记那些连接到因特网的任何东西,或者比一个简单的计算器复杂的东西,都是计算机。而计算机需要操作系统。因为 Linux 是自由的并且高度模块化,所以它通常是硬件厂商的选择。
在大多数情况下,如果你看见一台智能电视、一台连接互联网的照相机、甚至是一辆车,你看到的都是 Linux 设备。特别是每部非 iPhone 的智能手机都运行着不同的嵌入式 Linux。
### Linux 现场版
最后,有一些 Linux 发行版并不需要永久性地安装在计算机中,而是驻留在 USB 记忆棒上,并允许在其它的计算机上启动它们,而无需计算机硬盘。
这些 “现场版live” 的系统可以被优化来执行一些任务。从修复损坏的系统到进行安全评估到高度安全地浏览因特网。
由于这些 现场版 Linux 发行版通常针对解决特定的问题,因此它们一般都包含特定的工具,像磁盘分析和恢复程序、网络监控程序和加密工具。它们还占用很小的空间,因此它们可以快速启动。
### 你如何选择?
这绝不是 Linux 发行版类型的全面列表,但它应该可以让你大致了解 Linux 生态系统的范围和多样化了。
在每个类别下都有许多选择,因此你会如何选择一个最能符合你需求的版本呢?
一种方式是试验。在 Linux 社区中,来回尝试不同的发行版,或者为用户根据他们的需求在不同的机器上运行不同的发行版,这都很常见。
在将来的文章中,我会展示每种类型发行版的几个例子,以便你可以自己尝试,并开始探索最喜欢的发行版的旅程。
--------------------------------------------------------------------------------
作者简介:
自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。
------
via: http://www.linuxinsider.com/story/84489.html
作者:[Jonathan Terrasi][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline
[1]:http://www.linuxinsider.com/story/84489.html?rss=1#
[2]:http://www.linuxinsider.com/perl/mailit/?id=84489

View File

@ -0,0 +1,93 @@
开源硬件起步的 8 个步骤
============================================================
> 制造自己的硬件比以往任何时候都更容易,更便宜。以下是你设计、构建和测试你的第一块板子所需的事情。
![8 ways to get started with open source hardware](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "8 ways to get started with open source hardware")
著名的计算机科学家阿伦凯Alan Kay曾经说过“认真对待软件的人应该制造他们自己的硬件。” 我认为如今就如 同 1982 年他所说的一样。然而,现在和那时之间的不同是硬件变得越来越快、越来越小,最重要的是:更便宜。 现在可以用 5 美元购买一台完整的电脑。
随着大公司降低自己产品的价格,能够生产生产级硬件的制造业生态系统得以增长,这些硬件的成本足够便宜,并且达到了普通人都可以接受的程度。这种可用性以及可负担性正在帮助推动诸如众筹和创客运动之类的事情,但同时它们也让更多的个人能够通过开源硬件参与到开源当中。
> 探索开源硬件
> * [什么是开源硬件?][1]
> * [什么是树莓派?][2]
> * [什么是 Arduino][3]
开源硬件和非开源硬件有很多区别但是开源硬件联盟OSHWA定义了一个大多数人同意的定义如果你熟悉开源软件这不会听上去太奇怪
> “开源硬件OSHW是一个指有形的造物机器、设备或者其它物理东西的术语——其设计向公众发布任何人可以制造、修改、分发并使用那些造物。”
我们身边已经有很多开源硬件了。你可能没有注意到你在使用的主板实际上可能是开源硬件。从低调而多能的 [Arduino][13],一直到像 [BeagleBone][14] 系列和 [C.H.I.P.][15] 计算机这样的完整功能的电脑,有很多开源硬件的例子,还有更多的在设计中。
硬件可能很复杂,对初学者而言有时候不太理解为什么设计需要某些东西。但开源硬件使你不仅可以看到工作示例,还可以更改这些设计,或者在你自己的设计中剔除或复制所需的部分,就如复制和粘贴一样简单。
### 我该如何开始?
我们先要指出硬件很“硬”,它很复杂甚至很深奥,你可能用到的工具并不总是最人性化的。任何一个玩微处理器的时间足够长的人都可以向你证实:你会烧坏一些东西,看到神奇的烟雾在某个时刻冒出来。没关系,我们都遇到过,有些人还会反复遭遇,因为我们在做一件事情的前 100 次时都不会得到教训,但不要让这些阻碍你:当做错事情时,你会学到教训,而且你将来还可以将有趣的故事告诉别人。
#### 建模
首先要做的是使用现有的电路板、跳线、面包板以及你要连接的任何设备来建模你想要做的事情。在许多情况下,最简单的事情就是在板上添加更多的 LED并以新颖的方式让它们闪烁起来。这是一个很好的做出原型的方式也是一个常见的做法。它看上去并不漂亮你可能会发现你的线接错了但这些都是原型 - 你只是想证明硬件可以工作。当硬件不工作时,一定要仔细检查一切,不要害怕寻求帮助 - 有时第二双眼睛会发现你奇怪的接地短路。
#### 设计
当你弄清楚你想要构建的硬件,现在是时候把你的想法从跳线和面包板变成实际的设计了。这时事情会变得让人气馁,但是从小处开始,事情上,可以从熟悉加工和处理这样非常小的地方开始,所以为什么不从制作一块带有 LED 和电池的印刷电路板开始?认真地说,这可能听起来过于简单,但在这里有很多新的基础要了解。
1. **找到一个电子设计自动化EDA工具来使用。** 有很多好的开源软件可以选择,但是它们并不总是用户友好的。[Fritzing][5]、[gEDA][6] 还有 [KiCad][7] 都是开源的并且其可用性一个比一个好。如果你想要尝试更多的商业软件那么还有一些其他的选择。Eagle 有个受限的免费版本可供使用,有许多的开源硬件是用它设计的。
2. **在 EDA 工具中设计你的电路板。** 依据你选择的工具,这可能会非常快,或者可能是学习如何设计的很好的练习。这是我建议从小的硬件开始的原因之一。一个带 LED 的电路可以如一块电池、一个电阻、一个 LED 一样简单。电路图非常简单,并且板子也会非常小、非常简单。
3. **为打样而导出设计。** 这与列表中的下一件事情紧密相连,但如果你以前没有这样做过,这也可能是一个令人困惑的过程。当你在导出时,你会有很多细节需要调整,并且需要以某种方式导出以便电路板工厂能确切知道你要做的。
4. **找到一个电路板工厂。** 有许多电路板工厂可以制作你的设计,并且一些比其他更加友好及有帮助。一个特别棒的地方是 [OSH Park][8],这些人非常友好并支持开源硬件。他们也有一个非常扎实的流程来确认你发送给它的就是会被制造的,所以他们值得一试。还有很多其他选择;看看 [PCB Shopper][9],它可以让你比较不同实体 PCB 商家的价格、周转时间等等。
5. **等待。** 这或许是在制造你自己的电路板中最难的一部分了,因为它会花费时间将数字部分变成物理产品。计划好两周时间来拿到你的电路板。这是你继续下个项目的绝好时间,买到或确保你当前制造的所有部分都有了,或者随便试试而不要担心。你的第一块电路板是艰难的 - 你现在非常想要,但是保持耐心。
6. **修补并提升。** 一旦拿到你的板子,是时候上电测试了。如果你是以 LED 电路开始,那么它很容易调试,并且你会得到一些可以工作起来的东西。如果你有更复杂的电路,那么需要有条理并且有耐心。有时候电路不工作,并且你需要用你的调试技能来追踪问题。
7. **最后,如果你做的是开源硬件,那就发布它。*** 我们谈论的是开源硬件,因此确保它包含了一个许可,发布它、共享它,把它放在人们可以看见你所做的地方。你或许会想写一篇博客并提交到如 Hackaday 上面。
8. **最重要的是,玩得开心。** 坦白说,如果你在做一些事但是你不开心,你应该停止这样做。开源硬件可以很有趣,虽然有时是困难而且复杂的。但是不是一切都工作:见鬼,我已经设计了一半的电路不工作;或者我(意外地)在电源和接地之间造成了 12 次短路;这些电路板是双层板:是的。我在这个过程中学到了一些东西:非常多,并且我不会再犯同样的错误。我会做出新的板子,但不是这些。(我会支持并盯着这些板子和它们的错误,悲伤的是,它们不会在我盯着它们时感到良心会痛)。
现在有许多的开源硬件,有许多好的例子从中可以查看、复制、衍生,并且有很多信息使制造硬件变得简单。这就是开源硬件:一个人们制造它们、共享它们的社区,每个人可以制作他们自己的东西并构建他们想要的硬件——而不是他们可以得到的硬件。
题图Thomas Hawk on [Flickr][11]. [CC BY-NC 2.0][12]. 由 Opensource.com 修改)
--------------------------------------------------------------------------------
作者简介:
John 'Warthog9' Hawley - John 在 VMWare 的开源项目办公室为上游开源项目工作。在以前的生活中,他曾在 MinnowBoard 开源硬件项目上工作,领导了 kernel.org 的系统管理团队,并在桌面集群变得很酷之前构建了它们。为了乐趣,他构建了多个明星项目,比如一个受欢迎的英国电视节目 K-9 的复制品,在无人机的飞行计算机视觉处理中完成,设计并制作了一堆自己的硬件。
-------------------------------------
via: https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware
作者:[John 'Warthog9' Hawley][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware
[1]:https://opensource.com/resources/what-open-hardware?src=open_hardware_resources_menu
[2]:https://opensource.com/resources/what-raspberry-pi?src=open_hardware_resources_menu
[3]:https://opensource.com/resources/what-arduino?src=open_hardware_resources_menu
[4]:https://opensource.com/tags/hardware?src=open_hardware_resources_menu
[5]:http://fritzing.org/home/
[6]:http://www.geda-project.org/
[7]:http://kicad-pcb.org/
[8]:https://oshpark.com/
[9]:http://pcbshopper.com/
[10]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware?rate=jPBGDIa2vBXW6kb837X8JWdjI2V47hZ4KecI8-GJBjQ
[11]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG
[12]:https://creativecommons.org/licenses/by-nc/2.0/
[13]:https://opensource.com/node/20751
[14]:https://opensource.com/node/35211
[15]:https://opensource.com/node/24891
[16]:https://opensource.com/user/130046/feed
[17]:https://opensource.com/users/warthog9

View File

@ -0,0 +1,88 @@
关于开源项目如何选择沟通渠道的思考
============================================================
> 开源项目的首要挑战是找出最佳的贡献者协作方式
![Much ado about communication](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/rh_003601_05_mech_osyearbook2016_business_cc.png?itok=xZestz1h "Much ado about communication")
开源项目要面对的首要挑战之一是如何在贡献者之间沟通。这里有很多的选择论坛、聊天频道、工单issue、邮件列表、拉取请求pull request等等。我们该选择哪个合适的来使用我们又该如何做呢
令人遗憾的是,项目本身往往不愿做出约束性的决定,而是选择“上述所有”。这就导致了一个支离破碎的社区:有些人使用 Slack/Mattermost/IRC而有些人使用论坛有些使用邮件列表有些则存在于工单之中很少有人能够读到所有这些途径的内容。
在我[帮助其建立内外部社区][2]的组织中,这是一个常见的问题。我们会选择哪个渠道,以及出于什么目的?另外,何时可以对它们之一说不呢?
这就是我想在此处深度探讨的。
### 结构化和非结构化
我并不是个聪明人。因此,我倾向于将问题分成小的部分,这样我可以更好地理解它们。类似地,我倾向于将一个情景中各种选择拆解成更小的部分,来更好地理解它们的目的。我在沟通渠道的选择上也使用这种方法。
我认为有两大沟通渠道的分类:结构化和非结构化。
结构化渠道在每个单独的沟通单元中都有非常具体的重点。例子如GitHub / GitLab /Jira 的工单issue。一个工单是与 bug 或功能有关的一个非常具体的信息。在初始的工单帖子发布之后引发的系列讨论中,通常非常集中在该特定话题上,并会有一个结果(比如 bugfix 或者一个功能的最终计划)。结果通常都反映在状态(例如 “FIXED”、“WONTFIX” 或 “INVALID”中。这意味着你可以了解沟通的始末而无需阅读中间的内容。
类似的,拉取/合并请求也是结构化的。它们集中在特定类型(通常是代码)的贡献上。在最初的拉取/合并请求后,讨论会非常集中在一个结果上:让贡献符合要求,且合并入代码库中。
另一个例子是 StackOverflow/AskBot 这类的问答帖子。这些帖子以一个问题开始,接着被编辑以及回复来提供对这个问题的精确答案。
通过这些结构化机制,通常几乎不会偏离其本来结构。你不会在工单、拉取请求或问答话题上看到有人问别人他们的孩子/猫/狗/家人在做什么。偏离话题在社区是不可接受的,这是结构化媒体的力量的一部分:它是集中和(通常)高效的。
反之,非结构化媒体包括聊天频道和论坛。在这些环境中,通常会有一个主题(例如频道或分论坛的主题),但是其中的会话与特定结果或结论的关系要小得多,而且通常情况下可能会更普遍。例如,在开发者邮件列表中,你会看到一系列讨论,包括一般问题、新功能的想法、架构争论以及与社区自身运营相关的讨论。每一个讨论都希望让参与者保持对话的焦点、主题和工作效率。但你可以想象,情况往往不是这样的, 这种讨论可能会偏离一个富有成效的结果。
### 记录的影响
除了结构化和非结构化沟通的微妙不同外,所记录的内容以及它们如何搜索的所带来的影响也很重要。
典型的,所有的结构化渠道都是记录的。人们可以参考以前的 bug来自 StackOverflow 的问题可以被反复地重新利用。你可以搜索一些东西,即使有很多讨论、常见问题、拉取请求或者提问,都会被更新以反映最终结论。
这是一个重点:我们希望能够快速、轻松地挖掘旧问题/提问/拉取请求等,并链接到它们、引用它们。这里的一个关键部分是我们把这个内容转换成可以引用的材料,从而可以用来教育和告知人们以前的知识。随着社区的发展,我们的结构化沟通成为一种知识库,可以通过以往的经验来告知未来。
而非结构化沟通变得越来越糟。一方面,论坛的搜索通常都简单高效,但是它们当然充满了非结构化的对话,所以你正在寻找的东西可能被埋在讨论之中。例如,许多社区使用论坛作为支持工具。虽然这是一个更强大的平台,但是问题在于,一个问题的答案可能是在 16 楼或者 340 楼中有回复。随着越来越多的信息来源(比如 Twitter的轰炸我们越来越不耐烦地阅读大量的材料这对于非结构化媒体来说可能是一个问题。
一个有趣的特定案例是实时聊天。历史上很多年来IRC 为实时聊天铺平了道路,对于大多数 IRC 用户而言很少有(如果有的话)记录这些讨论的念头。的确,一些项目(比如 Ubuntu记录了 IRC 日志,但是这通常不是有用的资源。如我的伙伴 Atwood 有一次跟我说的:“如果你不得不在聊天中搜索一些东西时,你已经输了。”
虽然 IRC 在记录上有所不足,而 Slack 和 Mattermost 会好点。交流会被归档,但是问题仍旧存在:你为什么会想在海量的聊天信息中找出一个人提出的观点呢?其他的渠道能更好地引用先前的讨论。
不过,这的确创造了一个有趣的机会。聊天相比其他媒体有个一贯的好处是能体现这是个怎样的人。结构化的渠道,甚至非结构化的渠道,如论坛和邮件列表,很少鼓励闲聊。但聊天是的,聊天时你会问:“你周末怎么样?”、 “你见过这个游戏吗?”还有“你下周会看 TestamentSepultura 和 Prong 吗?” (好吧,也许问最后一个问题的只有我。)
因此,虽然实时聊天相比前面的那些方式也许更低效一些,但是它的确增进了人们的关系。
### 你想喝点什么
因此,回到我们最初的对于开源社区的提问:我们要选择哪个?
虽然这个答案对于不同的项目会不同,但我想在两个层面思考。
首先,你通常应该优先考虑结构化沟通。这是完成有形工作的地方:问题/工单、拉取请求、问答讨论等等。如果你资源有限,那么专注在这些渠道上,你可以用较少的时间和金钱支出,获得社区的高效产出。
再者,如果你热衷于建立一个可以专注于工程、宣传、翻译、文档等方面的更广泛的社区,那么探究是否引入非结构化渠道就有意义了。 社区不仅仅是为了完成工作,也是为了建立关系和友谊,在工作中相互支持,帮助人们在社区中发展壮大。非结构化通信是一个有用的工具。
当然,我只是在一个大的话题上浅谈辄止。 不过我希望在如何评估和选择沟通渠道的价值方面,为大家提供了一些辨析。记住,少即是多:不要被拥有所有的渠道的妄想而诱惑,否则你会得到一个支离破碎社区,就像一个空荡荡的餐厅一样。
愿原力与你同在,请让我知道你进行的如何。你可以通过我的[网站][3]和邮箱 [jono@jonobacon.com][4] 联系到我。
题图 Opensource.com
--------------------------------------------------------------------------------
作者简介:
Jono Bacon 是一名领先的社区管理者、演讲者、作者和播客。他是 Jono Bacon Consulting 的创始人,提供社区策略/执行、开发者工作流程和其他服务。他以前曾担任 GitHub、Canonical、XPRIZE、OpenAdvantage 的社区总监,并为很多组织曾经提供建议和咨询。
--------------------
via: https://opensource.com/article/17/5/much-ado-about-communication
作者:[Jono Bacon][a]
译者:[geekpi](https://github.com/geekpi)
校对:[jasminepeng](https://github.com/jasminepeng)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/jonobacon
[1]:https://opensource.com/article/17/5/much-ado-about-communication?rate=fBsUIx1TCGIXAFnRdYGTUqSG1pMmMCpdhYlyrFtRLS8
[2]:http://www.jonobaconconsulting.com/
[3]:http://www.jonobacon.com/
[4]:mailto:jono@jonobacon.com
[5]:https://opensource.com/user/26312/feed
[6]:https://opensource.com/users/jonobacon

View File

@ -1,25 +1,24 @@
更快的机器学习即将来到 Linux 内核
============================================================
### Linux 内核新增的异构内存管理将解锁加速 GPU 的新途径,并挖掘其它机器学习硬件的潜能
> Linux 内核新增的异构内存管理将解锁加速 GPU 的新途径,并挖掘其它机器学习硬件的潜能
![更快的机器学习正在来到你身边的 Linux 内核 Faster machine learning is coming to a Linux kernel near you](http://images.techhive.com/images/article/2015/12/machine_learning-100633721-primary.idge.jpg)
![更快的机器学习正在来到你身边的 Linux 内核](http://images.techhive.com/images/article/2015/12/machine_learning-100633721-primary.idge.jpg)
>Credit: Thinkstock
一项开发了很久的内存管理技术将会给机器学习和其它 GPU 驱动的程序很大幅度的提升,而它也将在接下来的几个版本中进入 Linux 内核。
异构内存管理HMM可以允许设备驱动为在其自身内存管理下的进程镜像地址空间。正如红帽的开发者 Jérôme Glisse [所解释的][10],这让像 GPU 这样的硬件设备可以直接访问进程内存,而不用花费复制带来的额外开销。它还不违反现代才做系统提供的内存保护功能。
异构内存管理HMM可以允许设备驱动为在其自身内存管理下的进程镜像地址空间。正如红帽的开发者 Jérôme Glisse [所解释的][10],这让像 GPU 这样的硬件设备可以直接访问进程内存,而不用花费复制带来的额外开销。它还不违反现代操作系统提供的内存保护功能。
一类会从 HMM 中获益最多的应用是基于 GPU 的机器学习。像 OpenCL 和 CUDA 这样的库能够从 HMM 中获得速度的提升。HMM 实现这个的方式和[加速基于 GPU 的机器学习][11]相似,就是让数据留在原地,靠近 GPU 的地方,在那里直接操作数据,尽可能少地移动数据。
一类会从 HMM 中获益最多的应用是基于 GPU 的机器学习。像 OpenCL 和 CUDA 这样的库能够从 HMM 中获得速度的提升。HMM 实现这个的方式和[加速基于 GPU 的机器学习][11]相似,就是让数据留在原地,靠近 GPU在那里直接操作数据尽可能少地移动数据
像这样的加速对于 CUDA英伟达基于 GPU 的处理库)来说,只会有益于在英伟达 GPU 上的操作,这些 GPU 也是目前加速数据处理的主要硬件。但是OpenCL 设计用来编写可以针对多种硬件的代码——CPU、GPU、FPGA 等等——随着这些硬件的成熟HMM 能够提供更加广泛的益处
像这样的加速对于 CUDA英伟达基于 GPU 的处理库)来说,只会有益于在英伟达 GPU 上的操作,这些 GPU 也是目前加速数据处理的主要硬件。但是OpenCL 设计用来编写可以针对多种硬件的代码——CPUGPUFPGA等等——随着这些硬件的成熟HMM 能够提供更加广泛的益处
要让 Linux 中的 HMM 处于可用状态还有一些阻碍。第一个是内核支持,在很长一段时间里都受到限制。[早在 2014][12]年HMM 最初作为 Linux 内核补丁集提出,红帽和英伟达都是关键开发者。需要做的工作不少,但是开发者认为代码可以提交上去,也许接下来的几个内核版本就能把它包含进去
要让 Linux 中的 HMM 处于可用状态还有一些阻碍。第一个是内核支持,在很长一段时间里都很不明了。[早在 2014][12]年HMM 最初作为 Linux 内核补丁集提出,红帽和英伟达都是关键开发者。需要做的工作不少,但是开发者相信可以提交代码,也许接下来的几个内核版本就能把它包含进去。
第二个阻碍是显卡驱动支持,英伟达一直在自己单独做一些工作。据 Glisse 的说法AMD 的 GPU 可能也会支持 HMM所以这种特殊优化不会仅限于英伟达的 GPU。AMD 一直都在尝试提升它的 GPU 市场占有率,有可能会[将 GPU 和 CPU 整合][13]到同一模具。但是,软件生态系统依然更偏向英伟达;要让可以选择成为现实,还需要更多的像 HMM 这样的中立项目,以及让 OpenCL 提供和 CUDA 相当的性能。
第二个阻碍是显卡驱动支持,英伟达一直在自己单独做一些工作。据 Glisse 的说法AMD 的 GPU 可能也会支持 HMM所以这种特殊优化不会仅限于英伟达的 GPU。AMD 一直都在尝试提升它的 GPU 市场占有率,有可能会[将 GPU 和 CPU 整合][13]到同一模具。但是,软件生态系统依然更青睐英伟达;要使其兑现,还需要更多的像 HMM 这样的中立项目,以及让 OpenCL 提供和 CUDA 相当的性能。
第三个阻碍是硬件支持,因为 HMM 的工作需要一项称作可重现页面故障replayable page faults的硬件特性。只有英伟达的帕斯卡系列高端 GPU 才支持这项特性。从某些意义上来说这是个好消息,因为这意味着英伟达只需要提供单一硬件的驱动支持就能让 HMM 正常使用,工作量就少了。
@ -31,7 +30,7 @@ via: http://www.infoworld.com/article/3196884/linux/faster-machine-learning-is-c
作者:[Serdar Yegulalp][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,121 @@
我是如何开始踏上 bash 脚本编程之路的?
============================================================
> 通过一些简单的 Google 搜索,即使是编程入门者也可以尝试编写代码将以往枯燥和冗长的任务自动化。
![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting")
我前几天写了一个脚本。对于一些人来说,这句话听起来没什么了不起的。而对于另一些人来说,这句话意义重大。要知道,我不是一个程序员,而是一个作家。
### 我需要解决什么?
我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面并移动到一个已按照我文件分类的需要进行了结构化的目录时一位作家同事给我提了建议_“不就是写个脚本的事吗”_
我心想_“就写个脚本”_——说得好像这是世界上最容易做的事情一样。
### Google 是如何解救我的?
同事的问题促使我思考,并且经过思考后,我进行了 Google 搜索。
**Linux 上使用的是什么脚本编程语言?**
这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我听说过 Bash 。呃,我要分类的文件中有一个里面就有 Bash那无处不在的 `#!/bin/bash` 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。
这引导我进行了下一个 Google 搜索。
**如何从一个 URL 下载 zip 文件?**
那确实是我的基本任务。我有一个带有 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在这个收获的推动下,我写了最简单的脚本:
```
#!/bin/sh
curl http://rather.long.url | tar -xz -C my_directory --strip-components=1
```
我迫不及待地运行看看。但我发现一个问题: URL 是会变的,根据我要访问的文件的分组不同而不同。我有新的问题需要解决,这使我进行了下一轮搜索。
**参数如何传递给 Bash 脚本?**
我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 `$1`、`$2` 等等来替换我在命令行中运行脚本时输入的内容。比如:
```
bash myscript.sh http://rather.long.url my_directory
```
这就好多了。一切如我所愿,灵活,实用。最重要的是我只要输入一条简短的命令就可以节省 30 分钟无聊的复制、粘贴工作。这个早上的时间花得值得。
然后我发现还有一个问题:我很健忘,并且我知道我几个月才运行一次这个脚本。这留给我两个疑问:
* 我要如何记得运行脚本时输入什么URL 先,还是目录先)?
* 如果我被货车撞了,其它作家如何知道该怎样运行我的脚本?
我需要一个使用说明 —— 如果我使用不正确,则脚本会提示。比如:
```
usage: bash yaml-fetch.sh <'snapshot_url'> <directory>
```
否则,则直接运行脚本。我的下一个搜索是:
**如何在 Bash 脚本里使用 “if/then/else”?**
幸运的是,我已经知道编程中 `if/then/else` 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 `echo` 打印。我的最终成果如下:
```
#!/bin/sh
URL=$1
DIRECTORY=$2
if [ $# -eq 0 ];
then
echo "usage: bash yaml-fetch.sh <'snapshot_url'> <directory>".
else
# 如果目录不存在则创建它
echo 'create directory'
mkdir $DIRECTORY
# 下载并解压 yaml 文件
echo 'fetch and untar the yaml files'
curl $URL | tar -xz -C $DIRECTORY --strip-components=1
fi
```
### Google 和脚本编程如何颠覆我的世界?
好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本之外)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑时,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了可以一直拥有并可以简化其它任务的新技能,这是我之前所没有的。
别止步于第一个脚本(或者编程的第一步)。这是一个技能,和其它的技能并无不同,有大量的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码的需求,并对它进行分支、合并、修复错误。但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这样的一个小脚本和小小的自信就能够让你启程脚本编程之路。
(题图: opensource.com
--------------------------------------------------------------------------------
作者简介:
Sandra McCann 是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。Sandra McCann 目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。
----
via: https://opensource.com/article/17/5/how-i-learned-bash-scripting
作者:[Sandra McCann][a]
译者:[xllc](https://github.com/xllc)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/sandra-mccann
[1]:https://opensource.com/tags/python?src=programming_resource_menu
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu
[3]:https://opensource.com/tags/perl?src=programming_resource_menu
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu
[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk
[6]:https://opensource.com/user/39771/feed
[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments
[8]:https://opensource.com/users/sandra-mccann

View File

@ -0,0 +1,58 @@
微软正在成为一个 Linux 供应商
=====================================
> 微软通过将 Linux 融入自己的产品中来弥合与 Linux 的裂隙。
![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg)
Linux 以及开源技术在数据中心、云以及 IoT 中变得如此主流,以至于微软无法忽视他们。
在微软自己的云中,三分之一的机器运行着 Linux。这些是运行 Linux 的微软客户。微软需要支持他们使用的平台,否则他们将到别处去了。
以下就是微软如何将 Linux 战略落实到它的开发者平台 Windows 10、云 Azure 以及数据中心 Windows Server 上的。
**Windows 中的 Linux** IT 专家管理公共或者私有 Linux 机器需要原生的 UNIX 工具。Linux 以及 macOS 是仅有的二个提供原生能力的平台。这也难怪你在各种会议如 DockerCon、OpenStack Summit 或者 CoreOS Fest 看到的都是 MacBook 或者少量的 Linux 桌面。
为了弥补这之间的裂隙,微软与 Canonical 协作在 Windows 内部构建了一个 Linux 子系统,它提供了原生的 Linux 工具。这是一个很棒的妥协,这样 IT 专家可以在继续使用 Windows 10 桌面的同时能够使用大多数 Linux 工具来管理他们的 Linux 机器。
**Azure 中的 Linux** 不能完整支持 Linux 的云有什么好的呢?微软一直以来与 Linux 供应商合作来使客户能够在 Azure 中运行 Linux 程序以及任务。
微软不仅与三家主要的 Linux 供应商 Red Hat、SUSE 和 Canonical 签署了协议,还与无数的其他公司合作,为 Debian 这样的基于社区的发行版提供了支持。
**Windows Server 中的 Linux** 这是剩下的最后一块拼图。客户使用的 Linux 容器是一个巨大的生态系统。Docker Hub 上有超过 90 万个 Docker 容器,它们只能在 Linux 机器上运行。微软希望把这些容器带到自己的平台上。
在 DockerCon 中,微软宣布在 Windows Server 中支持 Linux 容器,将这些容器都带到 Windows 中。
事情正变得更加有趣,在 Windows 10 上的 Bash on Ubuntu 成功之后,微软正将 Ubuntu bash 带到 Windows Server 中。是的你听的没错。Windows Server 也将会有一个 Linux 子系统。
微软的高级项目经理 Rich Turne 告诉我:“服务器上的 WSL 为管理员提供了偏好的 *NIX 管理脚本和工具,以便让他们可以在更熟悉的工作环境工作。”
微软在一个通告中称它将允许 IT 专家 “可以在 Windows Server 容器主机上使用在 Linux 容器上所用的相同的脚本、工具、流程和容器镜像。这些容器使用我们的 Hyper-V 隔离技术结合你选择的 Linux 内核来托管负载,而主机上的管理脚本以及工具使用 WSL。”
在覆盖了上面三个情况后,微软已经成功地创建了一个客户不必选择任何 Linux 供应商的环境。
### 它对微软意味着什么?
通过将 Linux 融入它自己的产品,微软已经成为了一个 Linux 供应商。它是 Linux 基金会的一份子,它是众多 Linux 贡献者之一,并且它现在在自己的商店中分发 Linux。
只有一个小问题。微软没有拥有任何 Linux 技术。它完全依赖于外部的厂家,目前 Canonical 为其提供了完全的 Linux 层。如果 Canonical 被强力的竞争对手收购,那会是一个很大的风险。
或许对微软而言尝试收购 Canonical 是有意义的,并且会将核心技术收入囊中。这是有道理的。
### 这对 Linux 供应商意味着什么
表面上,很显然这对微软是个胜利,因为它的客户可以留存在 Windows 世界中。它还将包含 Linux 在数据中心中的发展势头。它或许还会影响 Linux 桌面,由于现在 IT 专家不必为了寻找 *NIX 工具使用 Linux 桌面了,它们可以在 Windows 中做任何事。
微软的成功是传统 Linux 厂家的失败么?某种程度上来说,是的,微软已经成为了一个直接竞争者。但是这里明显的赢家是 Linux。
--------------------------------------------------------------------------------
via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html
作者:[Swapnil Bhartiya][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.cio.com/author/Swapnil-Bhartiya/

View File

@ -0,0 +1,92 @@
Hugo 对比 Jekyll :两大领先的静态页面生成器之间的比较
============================================================
> 如果你正在建一个新的网站,静态页面生成器或许是个正确的选择。
![Hugo vs. Jekyll: Comparing the leading static website generators ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "Hugo vs. Jekyll: Comparing the leading static website generators ")
除非你是像艾米莉·狄金森那样深居简出的人,否则,当做了点事情后,你就会想要与这个世界分享。分享你的作品意味着需要一个网站。当然,你可以只是享受数字时代的便利,使用任何不同的社交网站来将你的作品呈现在观众面前。还有很多选择,不仅仅是传统的社交网站,例如 Artstation、Flickr、Soundcloud、Wattpad不管你的媒介是什么总有一款属于你的网站。
实际上你_应该_使用这些网站毕竟人们都在这些网站上。然而没有一个地方是真正属于你的。没有一个网站是你能保证不管社交趋势如何人们都能在该网站上找到你的作品的。
控制权,这是拥有一个在网上属于自己的地方的意义。
但是这篇文章不打算介绍注册域名和托管你的网站。要介绍的是_后续_的步骤真正地制作网页。对于很多人来说典型的选择是使用像 [WordPress][6] 那一类的软件。在大多数主机托管商上,只需一次点击即可安装,然后就会有海量的插件和主题可供选择。插件和主题的选择取决于你想要制作的网页的类型。但是 WordPress 不仅对于大部分网站来说有点过犹不及,还给了你一个有许多活动部件的动态页面。如果你没有保持这些部件最新,这些部件可能造成重大安全隐患,你的页面因此被劫持。
替代方法是拥有一个静态网页,在服务端没有任何动态内容生成。只有一些原先的 HTML 和 CSS (或许还有点 Javascript 也挺好)。这种选择的不好的一面是以后你要亲自动手编写所有的代码。虽然可行,但你只是想要个地方来展示你的作品而已,你并不想知道底层网页设计的特性(和重要的但却令人头疼的跨浏览器兼容性)。
使用静态页面生成器。你得到了静态 HTML 页面的速度与安全,但是是以有着接近于动态页面的便利性的工作流程完成的。在静态页面生成器世界的两大先驱是 [Hugo][7] 和 [Jekyll][8] 顺道说下Paolo Bonzini 的文章 《[Jekyll 起步][9]》 写得不错)但是哪一个才是你的正确选择?希望阅读完这篇文章,你会更加了解。我们将基于易上手性、主题可用性、编辑方式和拓展性这几点评估这两个静态页面生成器。
### 开始
公平地提醒一下,这两个都需要你在命令行下使用他们。大部分命令都很直接和易于记忆,但是让我们相应地调整下我们的期望吧,这不是点击几下鼠标就能做事的界面。
Jekyll 和 Hugo 的安装都相当的简单。 Jekyll 以 RubyGem 的方式安装Hugo 提供了一个方便的集成的二进制文件让你迅速上手。因为安装包单一Hugo 以微弱优势领先。虽然 Jekyll 的 RubyGems 安装方式本身就很简单但是它_确实_需要你已经在你的电脑上正确安装并且配置好 Ruby 环境。除了社区设计者和网页开发者,大部分的使用者并没有提前安装好。
虽说是这样但是一旦安装好Hugo 和 Jekyll 都很好用。它们都有良好的文档和快速开始指南。你用一个简单命令新建一个页面(在 Jekyll 里是 `jekyll new <your_site>` ,在 Hugo 里是 `hugo new site <your_site>`,译者注:`<your_site>` 指代你网页的名称。这一步新建了一个通用目录结构和你网站的大致内容。目录结构和基本的配置都十分相似。Jekyll 使用一个 `_config.yml` 文件Hugo 使用 `config.toml`虽然你_能_在 Hugo 的配置里使用 YMAL 或者 JSON 语法如果觉得其中一个使用起来更舒服的话。每个内容文件的前置配置front matter元数据使用相同的配置语法。然后所有的内容都是用 Markdown 写的。
我想说就帮助你开始第一个静态网页这一点来说Jekyll 稍微领先于 Hugo 因为它能以一些基本的内容和一个默认主题开始着手使用。当在建设网页时你能使用这些内容作为一个样板。Hugo 没有样例内容,甚至没有一个默认主题。即便如此,样例内容和默认主题是我在用任何工具建设网站时第一个删除的内容,因此 Hugo 事实上帮我节省了这一步。
### 主题
正如我所提到的Hugo 根本没有默认主题所以主题可能是你打算最先设置的。Jekyll 有一个得体的默认主题,虽然它只是个骨架。你或许也会想去为你的 Jekyll 页面找一个主题。
Hugo 和 Jekyll 都有多种多样的各类主题网页样式从单页面的主题到带有博客和评论的完善的多页面主题都有一应俱全。尽管如此想找到满足你需求的主题事实上并不简单。无论使用哪个主题网站——Hugo 的 [themes.gohugo.io][10] 和 Jekyll 的 [jekyllthemes.org][11] 基本上都是一个充满主题截图的巨大页面。一旦你点击主题你能得到关于该主题的一些十分详细的信息但是对于初步搜索相当困难。Hugo 的主题站有一些基本的标签分类,但是大体上在我看来,主题搜索和展示都是这两个项目需要继续努力的。
主题管理也是一个有趣的主题。在两个项目中,几乎每一个主题都是一个 Git 仓库(经常是托管在 Github 上你需要克隆clone下来到你的网页建设地。在 Jekyll 里,有额外的使用 RubyGems 的 bundle 的步骤来确保主题是由网站管理的。大部分主题都有一个 Gemfile使得这一步骤轻松不少。如果主题没有一个 Gemfile添加也相当简单。在 Hugo 里没有捆绑这一操作,只要在 `config.toml` 指向你的主题即可。
我发现我偏爱 Hugo 的主题处理。你可以克隆clone或者新建主题到 `themes` 里它们自己的子文件夹里。这不仅使得当你开始时能轻松地切换主题,而且也能让你用自己的文件替换主题里的任何组件。这意味着你能根据自己的品味自定义主题,而不用弄乱原始主题,使得这主题也可以通用于其他人。当然如果有一个你觉得其他用户会觉得值得的改变,你仍然可以编辑源文件,提交一个 PR拉取请求pull request给主题维护者。
### 工作流程
一旦你设置好初始的配置Jekyll 和 Hugo 的网站建设流程都很相似。两者都有一个实时的 `serve` 命令,能在你的电脑上运行一个小型、轻量级的网页服务器,所以你能在在本地测试你的网站而不用上传到哪里。很棒的是无论你是运行着 `jekyll serve` 还是 `hugo serve`,都默认配置为当你为之开发时,监视你对网站的任何修改。当你在浏览器里看本地版的网站时,它会根据你的修改自动更新,不管你改的是内容、配置、主题、还仅仅是一张图片。这确实很方便和节约时间。
在两个系统中都是用 [Markdown][12] 写你的网站内容。如果碰巧你不熟悉 Markdown我来解释下它是种很简单的纯文本编写方式还能有一些很好用的格式化符号。它很容易使用而且可阅读。而且因为是纯文本你的内容其实是你的网站很容易进行版本控制。这是我最近写几乎所有东西的主要方式。
新内容能通过在正确的地方手动创建文件添加到网站里。新的文件只需要是有恰当的前置配置front matter元数据的 Markdown 文件即可。至于配置文件Jekyll 对于前置配置使用 YAML 语法Hugo 接受 TOML、YAML 或者 JSON默认是 TOML。新文件需要放置在正确的文件夹内在 Jekyll 里你需要把你编写中的文件和已经完成了的内容页分别放在 `_drafts``_posts` 目录中。在 Hugo 中只有单独一个 `content` 目录。你可以根据文件的前置配置判断这是否是一个草稿。
现在,虽然可以手动完成所有这些事情,但是 Hugo 提供了一些方便的功能确保你的新文件创建在正确的文件里,那些文件也用恰当的前置配置预先配置好了。简单地在终端中进入你网站的目录,输入 `hugo new content/<page.md>` `<page.md>` 代表着你想新建的新页面。你甚至可以设置些包含为不同页面自定义的前置配置、叫**原型**的模版(例如在你的网页上同时有博客和播客)。
当你的网页弄好后,你能关闭你的预览服务器,并用一个命令来建立你网站的真正页面。在 Jekyll 里是 `jekyll build`Hugo 就仅仅是 `hugo`Jekyll 把完成好的页面放在 `_site` 的子目录中。然而 Hugo 把这些文件放在名为 `public` 的子目录中。不管哪种情况,一旦你完成后,你就有了一个完整的静态网站,你能上传并把它托管在几乎任何地方。
### 可拓展性
Hugo 和 Jekyll 都能让你自定义你自己的网站上哪怕最小的一个点。然而就可拓展性而言,现在 Jekyll 因其插件 API 而远远领先。因为这种插件结构,很容易为你用 Jekyll 生成的网站添加功能,通过 Jekyll 社区或者你自己写的相当短的代码片段就能完成。
Hugo 现在根本没有插件 API所以添加功能有点难。希望以后支持编写并包含插件。但是现在看不出有人在做这一点。
### 结论
大体上讲Hugo 和 Jekyll 十分相似。归根结底由你工作体验和你的网站需求决定。如果你已经设置好了 RubyGems 环境而且你需要插件的可拓展性Jekyll 是你的选择。然而,如果你看重一个简单的工作流程,一个直接自定义网站的方式,那你首选 Hugo。
我发现我更喜欢 Hugo 的方法,而且在建设一个小型网站,我不需要任何插件。当然,每个人的需求都不同。你会为你的网站选择哪一个静态页面生成器?
题图opensource.com
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/5/hugo-vs-jekyll
作者:[Jason van Gumster][a]
译者:[ypingcn](https://ypingcn.github.io/wiki/lctt)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jason-van-gumster
[1]: https://opensource.com/tags/python?src=programming_resource_menu
[2]: https://opensource.com/tags/javascript?src=programming_resource_menu
[3]: https://opensource.com/tags/perl?src=programming_resource_menu
[4]: https://developers.redhat.com/?intcmp=7016000000127cYAAQ&amp;amp;amp;amp;src=programming_resource_menu
[5]: https://opensource.com/article/17/5/hugo-vs-jekyll?rate=lZDKuqOQ7lVUon-ZKebR5SUCyXDz5oCQ_zoCSBPolOQ
[6]: http://wordpress.org/
[7]: http://gohugo.io/
[8]: https://jekyllrb.com/
[9]: https://opensource.com/article/17/4/getting-started-jekyll
[10]: https://themes.gohugo.io/
[11]: http://jekyllthemes.org/
[12]: https://daringfireball.net/projects/markdown/
[13]: https://opensource.com/user/26430/feed
[14]: https://opensource.com/article/17/5/hugo-vs-jekyll#comments
[15]: https://opensource.com/users/jason-van-gumster

View File

@ -0,0 +1,181 @@
Linux 中高效编写 Bash 脚本的 10 个技巧
============================================================
[Shell 脚本编程][4] 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 [系统管理员要处理着自动化任务][5],且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。
本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括:
### 1、 脚本中多写注释
这是不仅可应用于 shell 脚本程序中,也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本时了解脚本的不同部分所做的工作。
对于刚入门的人来说,注释用 `#` 号来定义。
```
# TecMint 是浏览各类 Linux 文章的最佳站点
```
### 2、 当运行失败时使脚本退出
有时即使某些命令运行失败bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行:
```
# 如果命令运行失败让脚本退出执行
set -o errexit
# 或
set -e
```
### 3、 当 Bash 用未声明变量时使脚本退出
Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行:
```
# 若有用未设置的变量即让脚本退出执行
set -o nounset
# 或
set -u
```
### 4、 使用双引号来引用变量
当引用时(使用一个变量的值)用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。
看看下面的例子:
```
#!/bin/bash
# 若命令失败让脚本退出
set -o errexit
# 若未设置的变量被使用让脚本退出
set -o nounset
echo "Names without double quotes"
echo
names="Tecmint FOSSMint Linusay"
for name in $names; do
echo "$name"
done
echo
echo "Names with double quotes"
echo
for name in "$names"; do
echo "$name"
done
exit 0
```
保存文件并退出,接着如下运行一下:
```
$ ./names.sh
```
[![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6]
*在脚本中用双引号*
### 5、 在脚本中使用函数
除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。
写函数的语法如下所示:
```
function check_root(){
command1;
command2;
}
# 或
check_root(){
command1;
command2;
}
```
写成单行代码时,每个命令后要用终止符号:
```
check_root(){ command1; command2; }
```
### 6、 字符串比较时用 `=` 而不是 `==`
注意 `==` 是 `=` 的同义词,因此仅用个单 `=` 来做字符串比较,例如:
```
value1=”tecmint.com”
value2=”fossmint.com”
if [ "$value1" = "$value2" ]
```
### 7、 用 `$(command)` 而不是老旧的 \`command` 来做代换
[命令代换][7] 是用这个命令的输出结果取代命令本身。用 `$(command)` 而不是引号 \`command` 来做命令代换。
这种做法也是 [shellcheck tool][8] (可针对 shell 脚本显示警告和建议)所建议的。例如:
```
user=`echo “$UID”`
user=$(echo “$UID”)
```
### 8、 用 `readonly` 来声明静态变量
静态变量不会改变;它的值一旦在脚本中定义后不能被修改:
```
readonly passwd_file=”/etc/passwd”
readonly group_file=”/etc/group”
```
### 9、 环境变量用大写字母命名,而自定义变量用小写
所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突:
```
# 定义自定义变量用小写,而环境变量用大写
nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl”
perl “$nikto_file” -h “$1”
```
### 10、 总是对长脚本进行调试
如果你在写有数千行代码的 bash 脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。通过阅读下面给出的指南来掌握此技巧:
1. [如何在 Linux 中启用 Shell 脚本调试模式][1]
2. [如何在 Shell 脚本中执行语法检查调试模式][2]
3. [如何在 Shell 脚本中跟踪调试命令的执行][3]
本文到这就结束了,你是否有一些其他更好的 bash 脚本编程经验想要分享?若是的话,在下面评论框分享出来吧。
--------------------------------------------------------------------------------
作者简介:
Aaron Kili 是一个 Linux 和 F.O.S.SFree and Open-Source Software自由及开放源代码软件爱好者未来的 Linux 系统管理员、Web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,且崇尚分享知识。
----------------
via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/
作者:[Aaron Kili][a]
译者:[ch-cn](https://github.com/ch-cn)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/aaronkili/
[1]:https://linux.cn/article-8028-1.html
[2]:https://linux.cn/article-8045-1.html
[3]:https://linux.cn/article-8120-1.html
[4]:https://www.tecmint.com/category/bash-shell/
[5]:https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/
[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png
[7]:https://www.tecmint.com/assign-linux-command-output-to-variable/
[8]:https://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/

View File

@ -1,27 +1,26 @@
D 编程语言是用于开发的绝佳语言的 5 个理由
============================================================
### D 语言的模块化、开发效率、可读性以及其它一些特性使其非常适合用于协同软件的开发。
> D 语言的模块化、开发效率、可读性以及其它一些特性使其非常适合用于协同软件的开发。
![Why the D programming language is great for open source development](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_development_programming.png?itok=eYK4UXiq "Why the D programming language is great for open source development")
>图片来自 opensource.com
[D 编程语言][8]是一种静态类型的通用编程语言,它具有和 C 语言类似的语法,能够编译为本地代码。许多理由使得它很适合用于开源软件开发,下面讲到的是其中一些理由。
### 模块化能力
在大多数情况下,当你有一个好的想法,你可以完全按照你的内心所想的方式通过代码来实现它。然而,有的时候,你不得不向你的想法妥协,从而来适应代码,而不是通过模块化代码来适应想法。 D 语言支持多种[编程范式][9],包括函数式风格、命令式、面向对象、元编程、并发(演员模式)和并行集成。你可以选择任何一种方便的编程范式来模块化代码,从而适应你的想法
在大多数情况下,当你有一个好的想法,你可以完全按照你的内心所想的方式通过代码来实现它。然而,有的时候,你不得让你的想法向代码妥协而不是通过模块化代码来适应想法。D 语言支持多种[编程范式][9],包括函数式风格、命令式、面向对象、元编程、并发(演员模式),这些全都和谐共存。你可以选择任何一种方便的编程范式来将你的想法转换为代码
通过使用[模板][10],可以生成额外的 D 代码并在编译的过程中把它编排进去,你可以把这些代码描述成编译器生成代码的一种模式。这是一种非常有用的设计算法,无需把它们绑定到任何特定的类型。平台无关的代码很容易加入到自然的模板中。通过将模板与[条件编译][11]结合,跨平台的应用变得更加容易实现,也更容易接受来自使用不同操作系统的开发者的贡献。有了这一点,一个程序员可以通过很少的代码,利用有限的时间实现很多东西。
通过使用[模板][10],可以生成额外的 D 代码并在编译的过程中把它编排进去,你可以把这些代码描述成编译器生成代码的一种模式。这是一种非常有用的设计算法,无需把它们绑定到任何特定的类型。由于模版的通用性,就很容易生成平台无关的代码。通过将模板与[条件编译][11]结合,跨平台的应用变得更加容易实现,也更容易接受来自使用不同操作系统的开发者的贡献。有了这一点,一个程序员可以通过很少的代码,利用有限的时间实现很多东西。
[排列][12] 已经深度集成到了 D 语言中,抽象出当和一个实际执行冲突时如何访问容器元素比如数组、关联数组和链表等。这个抽象使得可以在许多容器类型中设计和使用大量的算法而无需绑定到特定的数据结构。D 的[数组切片][13]是排列的一个实现。在最后,你可以用很少的时间写很少的代码,并且只需要很低的维护成本。
[range][12] 已经深度集成到了 D 语言中,相对于具体实现,它抽象出容器元素(比如数组、关联数组和链表等)是如何访问的。这个抽象使得可以在许多容器类型中设计和使用大量的算法而无需绑定到特定的数据结构。D 的[数组切片][13]是 range 的一个实现。最终,你可以用很少的时间写很少的代码,并且只需要很低的维护成本。
### 开发效率
大多数开源软件的代码贡献者都是基于有限的时间志愿工作的。 D 语言能够极大的提高开发效率因为你可以用更少的时间完成更多的事情。D 的模板和排列使得程序员在开发通用代码和可复用代码时效率更高,但这些仅仅是 D 开发效率高的其中几个优势。另外一个主要的吸引力是, D 的编译速度看起来感觉就像解释型语言,比如 Python、JavaScript、Ruby 和 PHP它使得 D 能够快速成型。
大多数开源软件的代码贡献者都是基于有限的时间志愿工作的。 D 语言能够极大的提高开发效率因为你可以用更少的时间完成更多的事情。D 的模板和 range 使得程序员在开发通用代码和可复用代码时效率更高,但这些仅仅是 D 开发效率高的其中几个优势。另外一个主要的吸引力是, D 的编译速度看起来感觉就像解释型语言一样,比如 Python、JavaScript、Ruby 和 PHP它使得 D 能够快速成型。
D 可以很容易的与旧的代码进行对接,减少了端口的需要。它的设计目的是自然地[与 C 代码进行对接][14],毕竟, C 语言是遗留代码、精心编写和测试代码、库以及低级系统调用(特别是 Linux 系统)的主人。C++ 代码在[ D 中也是可调用的][15],从而进行更大的扩展。事实上,[Python][16]、[Objective-C][17]、[Lua][18] 和 [Fortran][19] 这些语言在技术层面上也是可以在 D 中使用的,还有许多第三方努力在把 D 语言推向这些领域。这使得大量的开源库在 D 中均可使用,这符合开源软件开发的惯例。
D 可以很容易的与旧的代码进行对接,减少了移植的需要。它的设计目的是[与 C 代码进行自然地对接][14],毕竟, C 语言大量用在遗留代码、精心编写而测试过的代码、库以及低级系统调用(特别是 Linux 系统)上。C++ 代码在[ D 中也是可调用的][15],从而进行更大的扩展。事实上,[Python][16]、[Objective-C][17]、[Lua][18] 和 [Fortran][19] 这些语言在技术层面上都是可以在 D 中使用的,有许多第三方正在努力在把 D 语言推向这些领域。这使得大量的开源库在 D 中均可使用,这符合开源软件开发的惯例。
### 可读性和可维护性
@ -35,23 +34,23 @@ void main()
*D 语言的 Hello, World 演示*
对于熟悉 C 语言的人来说, D 代码很容易理解。另外, D 代码的可读性很强,即使是复杂的代码这使得很容易发现错误。可读性对于吸引贡献者来说也是很重要的,这是开源软件成长的关键。
对于熟悉 C 语言的人来说, D 代码很容易理解。另外, D 代码的可读性很强,即使是复杂的代码这使得很容易发现错误。可读性对于吸引贡献者来说也是很重要的,这是开源软件成长的关键。
在 D 中一个非常简单但很有用的[语法][20]是支持使用下滑线分隔数字,这使得数字的可读性更高。这在数学上很有用:
在 D 中一个非常简单但很有用的[语法][20]是支持使用下滑线分隔数字,这使得数字的可读性更高。这在数学上很有用:
```
int count = 100_000_000;
double price = 20_220.00 + 10.00;
int number = 0x7FFF_FFFF; // in hexadecimal system
int number = 0x7FFF_FFFF; // 16 进制系统
```
[Ddoc][21] 是一个内建的工具,它能够很容易的自动根据代码注释生成文档,而不需要使用额外的工具。文档写作、改进和更新变得更加简单,不具挑战性,因为它伴随代码同时生成。
[ddoc][21] 是一个内建的工具,它能够很容易的自动根据代码注释生成文档,而不需要使用额外的工具。文档写作、改进和更新变得更加简单,不具挑战性,因为它伴随代码同时生成。
[契约][22] 能够进行检查,从而确保 D 代码的行为能够像期望的那样。就像法律契约签订是为了确保每一方在协议中做自己该做的事情,在 D 语言中的契约式编程,能够确保实现的每一个函数、类等能够像期望的那样产生期望的结果和行为。这样一个特性对于错误检查非常实用特别是在开源软件中当多个人合作一个项目的时候。契约是大项目的救星。D 语言强大的契约式编程特性是内建的,而不是后期添加的。契约不仅使得使用 D 语言更加方便,也减少了正确写作和维护困难的头痛。
[Contract][22] 能够检查代码的实现,从而确保 D 代码的行为能够像期望的那样。就像法律契约签订是为了确保每一方在协议中做自己该做的事情,在 D 语言中的契约式编程,能够确保实现的每一个函数、类等如期望的那样产生预期的结果和行为。这样一个特性对于错误检查非常实用特别是在开源软件中当多个人合作一个项目的时候。契约是大项目的救星。D 语言强大的契约式编程特性是内建的,而不是后期添加的。契约不仅使得使用 D 语言更加方便,也减少了正确写作和维护困难的头痛。
### 方便
协同开发是具有挑战性的因为代码经常发生变化并且有许多移动部分。D 语言通过支持在本地范围内导入模块,从而缓解了些问题:
协同开发是具有挑战性的因为代码经常发生变化并且有许多移动部分。D 语言通过支持在本地范围内导入模块,从而缓解了些问题:
```
// 返回偶数
@ -64,11 +63,11 @@ int[] evenNumbers(int[] numbers)
}
```
*通过**过滤**使用 "!"运算符是[模板参数][5]的一个语法*
*对 filter 使用 `!` 运算符是[模板参数][5]的一个语法*
上面的函数可以在不破坏代码的情况下调用,因为它不依赖任何全局导入模块。像这样实现的函数都可以在后期无需破坏代码的情况下增强,这是协同开发的好东西。
[通用函数调用语法][23]是 D 语言中的一个特殊语法,它允许像调用一个对象的成员函数那样调用正则函数。一个函数的定义如下:
[通用函数调用语法UFCS][23]是 D 语言中的一个语法,它允许像调用一个对象的成员函数那样调用常规函数。一个函数的定义如下:
```
void cook(string food, int quantity)
@ -87,7 +86,7 @@ int quantity = 3;
cook(food, quantity);
```
通过 UFCS这个函数也可以像下面这样调用看起来好像 **cook** 是一个成员函数:
通过 UFCS这个函数也可以像下面这样调用看起来好像 `cook` 是一个成员函数:
```
string food = "rice";
@ -96,7 +95,7 @@ int quantity = 3;
food.cook(quantity);
```
在编译过程中,编译器会自动把 **food** 作为 **cook** 函数的第一个参数。UFCS 使得它能够连接正则函数给你的代码产生一种函数风格编程的自然感觉。UFCS 在 D 语言中被大量使用,就像在上面的 **evenNumbers** 函数中使用的**过滤**和**数组**功能那样。结合模板、排列、条件编译和 UFCS 能够在不牺牲方便性的前提下给予你强大的力量。
在编译过程中,编译器会自动把 `food` 作为 `cook` 函数的第一个参数。UFCS 使得它能够链起来常规函数给你的代码产生一种函数风格编程的自然感觉。UFCS 在 D 语言中被大量使用,就像在上面的 `evenNumbers` 函数中使用的 `filter``array` 函数那样。结合模板、range、条件编译和 UFCS 能够在不牺牲方便性的前提下给予你强大的力量。
`auto` 关键词可以用来代替任何类型。编译器在编译过程中会静态推断类型。这样可以省去输入很长的类型名字,让你感觉写 D 代码就像是在写动态类型语言。
@ -114,7 +113,7 @@ auto dictionary = ["one": 1, "two": 2, "three": 3]; // type of int[string]
auto cook(string food) {...} // auto for a function return type
```
D 的[foreach][24] 循环允许遍历集合和所有不同的强调数据类型
D 的[foreach][24] 循环允许遍历各种不同的底层数据类型的集合和 range
```
foreach(name; ["John", "Yaw", "Paul", "Kofi", "Ama"])
@ -131,7 +130,7 @@ Student[] students = [new Student(), new Student()];
foreach(student; students) {...}
```
D 语言中内建的[单元测试][25]不仅免除了使用外部工具的需要,也方便了程序员在自己的代码中执行测试。所有的测试用例都位于定制的 `unittest{}` 块中:
D 语言中内建的[单元测试][25]不仅免除了使用外部工具的需要,也方便了程序员在自己的代码中执行测试。所有的测试用例都位于定制的 `unittest{}` 块中:
```
int[] evenNumbers(int[] numbers)
@ -149,17 +148,19 @@ unittest
使用 D 语言的标准编译器 DMD你可以通过增加 `-unittest` 编译器标志把所有的测试编译进可执行结果中。
[Dub][26] 是 D 语言的一个内建包管理器和构建工具,使用它可以很容易的添加来自 [Dub package registry][27] 的第三方库。Dub 可以在编译过程中下载、编译和链接这些包,同时也会升级到新版本。
[Dub][26] 是 D 语言的一个内建包管理器和构建工具,使用它可以很容易的添加来自 [Dub package registry][27] 的第三方库。Dub 可以在编译过程中下载、编译和链接这些包,同时也会升级到新版本。
### 选择
除了提供多种编程范例和功能特性外D 还提供其他的选择。它目前有三个可用的开源编译器。官方编译器 DMD 使用它自己的后端,另外两个编译器 GDC 和 LDC分别使用 GCC 和 LLVM 后端。DMD 以编译速度块而著称,而 LDC 和 GDC 则以在很短的编译时间内生成快速生成机器代码而著称。你可以自由选择其中一个以适应你的使用情况。
默认情况下, D 语言是采用[垃圾收集][28]的内存分配方式的。你也可以选择手动进行内存管理,如果你想的话,甚至可以进行引用计数。一切选择都是你的。
默认情况下D 语言是采用[垃圾收集][28]的内存分配方式的。你也可以选择手动进行内存管理,如果你想的话,甚至可以进行引用计数。一切选择都是你的。
### 更多
在这个简要的讨论中,还有许多 D 语言好的特性没有涉及到。我强烈推荐阅读 [D 语言的特性概述][29],隐藏在[标准库][30]中的宝藏,以及[ D 的使用区域][31],从而进一步了解人们用它来干什么。许多阻止已经[使用 D 语言来进行开发][32]。最后,如果你打算开始学习 D 语言,那么请看这本书 *[D 语言编程][6]*
在这个简要的讨论中,还有许多 D 语言好的特性没有涉及到。我强烈推荐阅读 [D 语言的特性概述][29],这是隐藏在[标准库][30]中的宝藏,以及 [D 语言的使用区域][31],从而进一步了解人们用它来干什么。许多组织已经[使用 D 语言来进行开发][32]。最后,如果你打算开始学习 D 语言,那么请看这本书 *[D 语言编程][6]*
题图opensource.com
--------------------------------------------------------------------------------
@ -167,7 +168,7 @@ via: https://opensource.com/article/17/5/d-open-source-software-development
作者:[Lawrence Aberba][a]
译者:[ucasFL](https://github.com/ucasFL)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -0,0 +1,345 @@
通过 SYCL 在 GPU 上加速 C++
============================================================
在机器学习、计算机视觉以及高性能计算领域,充分利用显卡计算应用程序的能力已成为当前的热门。类似 OpenCL 的技术通过硬件无关的编程模型展现了这种能力,使得你可以编写抽象于不同体系架构的代码。它的目标是“一次编写,到处运行”,不管它是 Intel CPU、AMD 独立显卡还是 DSP 等等。不幸的是对于日常程序员OpenCL 的学习曲线陡峭;一个简单的 Hello World 程序可能就需要上百行晦涩难懂的代码。因此为了减轻这种痛苦Khronos 组织已经开发了一个称为 [SYCL][4] 的新标准,这是一个在 OpenCL 之上的 C++ 抽象层。通过 SYCL你可以使用干净、现代的 C++ 开发出这些通用 GPUGPGPU应用程序而无需拘泥于 OpenCL。下面是一个使用 SYCL 开发,通过并行 STL 实现的向量乘法事例:
```
#include <vector>
#include <iostream>
#include <sycl/execution_policy>
#include <experimental/algorithm>
#include <sycl/helpers/sycl_buffers.hpp>
using namespace std::experimental::parallel;
using namespace sycl::helpers;
int main() {
constexpr size_t array_size = 1024*512;
std::array<cl::sycl::cl_int, array_size> a;
std::iota(begin(a),end(a),0);
{
cl::sycl::buffer<int> b(a.data(), cl::sycl::range<1>(a.size()));
cl::sycl::queue q;
sycl::sycl_execution_policy<class Mul> sycl_policy(q);
transform(sycl_policy, begin(b), end(b), begin(b),
[](int x) { return x*2; });
}
}
```
为了作为对比,下面是一个通过 C++ API 使用 OpenCL 编写的大概对应版本(无需花过多时间阅读,只需注意到它看起来难看而且冗长)。
```
#include <iostream>
#include <array>
#include <numeric>
#include <CL/cl.hpp>
int main(){
std::vector<cl::Platform> all_platforms;
cl::Platform::get(&all_platforms);
if(all_platforms.size()==0){
std::cout<<" No platforms found. Check OpenCL installation!\n";
exit(1);
}
cl::Platform default_platform=all_platforms[0];
std::vector<cl::Device> all_devices;
default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
if(all_devices.size()==0){
std::cout<<" No devices found. Check OpenCL installation!\n";
exit(1);
}
cl::Device default_device=all_devices[0];
cl::Context context({default_device});
cl::Program::Sources sources;
std::string kernel_code=
" void kernel mul2(global int* A){"
" A[get_global_id(0)]=A[get_global_id(0)]*2;"
" }";
sources.push_back({kernel_code.c_str(),kernel_code.length()});
cl::Program program(context,sources);
if(program.build({default_device})!=CL_SUCCESS){
std::cout<<" Error building: "<<program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"\n";
exit(1);
}
constexpr size_t array_size = 1024*512;
std::array<cl_int, array_size> a;
std::iota(begin(a),end(a),0);
cl::Buffer buffer_A(context,CL_MEM_READ_WRITE,sizeof(int)*a.size());
cl::CommandQueue queue(context,default_device);
if (queue.enqueueWriteBuffer(buffer_A,CL_TRUE,0,sizeof(int)*a.size(),a.data()) != CL_SUCCESS) {
std::cout << "Failed to write memory;n";
exit(1);
}
cl::Kernel kernel_add = cl::Kernel(program,"mul2");
kernel_add.setArg(0,buffer_A);
if (queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(a.size()),cl::NullRange) != CL_SUCCESS) {
std::cout << "Failed to enqueue kernel\n";
exit(1);
}
if (queue.finish() != CL_SUCCESS) {
std::cout << "Failed to finish kernel\n";
exit(1);
}
if (queue.enqueueReadBuffer(buffer_A,CL_TRUE,0,sizeof(int)*a.size(),a.data()) != CL_SUCCESS) {
std::cout << "Failed to read result\n";
exit(1);
}
}
```
在这篇博文中我会介绍使用 SYCL 加速你 GPU 上的 C++ 代码。
### GPGPU 简介
在我开始介绍如何使用 SYCL 之前,我首先给那些不熟悉这方面的人简要介绍一下为什么你可能想要在 GPU 上运行计算任务。如果已经使用过 OpenCL、CUDA 或类似的库,可以跳过这一节。
GPU 和 CPU 的一个关键不同就是 GPU 有大量小的、简单的处理单元,而不是少量(对于普通消费者桌面硬件通常是 1-8 个)复杂而强大的核。
![CPU 架构](https://blog.tartanllama.xyz/assets/cpu.png)
上面是一个 4 核 CPU 的简单漫画示意图。每个核都有一组寄存器以及不同等级的缓存(有些是共享缓存、有些不是),然后是主内存。
![GPU 架构](https://blog.tartanllama.xyz/assets/gpu.png)
在 GPU 上,多个小处理单元被组成一个执行单元。每个小处理单元都附有少量内存,每个执行单元都有一些共享内存用于它的处理单元。除此之外,还有一些 GPU 范围的内存,然后是 CPU 使用的主内存。执行单元内部的单元是 _lockstep_ ,每个单元都在不同的数据片上执行相同的指令。
这可以使 GPU 同时处理大量的数据。如果是在 CPU 上,也许你可以使用多线程和向量指令在给定时间内完成大量的工作,但是 GPU 所能处理的远多于此。在 GPU 上一次性能够处理的数据规模使得它非常适合于类似图形duh、数学处理、神经网络等等。
GPGPU 编程的很多方面使得它和日常的 CPU 编程完全不同。例如,从主内存传输数据到 GPU 是_很慢的_。_真的_很慢。会完全干掉你的性能使你慢下来。因此GPU 编程的权衡是尽可能多地利用加速器的高吞吐量来掩盖数据来往的延迟。
这里还有一些不那么明显的问题,例如分支的开销。由于执行单元内的处理单元按照 lockstep 工作,使它们执行不同路径(不同的控制流)的嵌套分支就是个真正的问题。这通常通过在所有单元上执行所有分支并标记出无用结果来解决。这是一个基于嵌套级别的指数级的复杂度,这当然是坏事情。当然,有一些优化方法可以拯救该问题,但需要注意:你从 CPU 领域带来的简单假设和知识在 GPU 领域可能导致大问题。
在我们回到 SYCL 之前需要介绍一些术语。主机host是主 CPU 运行的机器设备device是会运行你 OpenCL 代码的地方。设备可能就是主机但也可能是你机器上的一些加速器、模拟器等。内核kernel是一个特殊函数它是在你设备上运行代码的入口点。通常还会提供一些主机设置好的缓存给它用于输入和输出数据。
### 回到 SYCL
这里有两个可用的 SYCL 实现:[triSYCL](https://github.com/Xilinx/triSYCL),由 Xilinx 开发的实验性开源版本(通常作为标准的试验台使用),以及 [ComputeCpp](https://www.codeplay.com/products/computesuite/computecpp),由 Codeplay我在 Codeplay 工作,但这篇文章是在没有我雇主建议的情况下使用我自己时间编写的) 开发的工业级实现(当前处于开发测试版)。只有 ComputeCpp 支持在 GPU 上执行内核,因此在这篇文章中我们会使用它。
第一步是在你的机器上配置以及运行 ComputeCpp。主要组件是一个实现了 SYCL API 的运行时库,以及一个基于 Clang 的编译器,它负责编译你的主机代码和设备代码。在本文写作时,已经在 Ubuntu 和 CentOS 上官方支持 Intel CPU 以及某些 AMD GPU。在其它 Linux 发行版上让它工作也非常简单(例如,我让它在我的 Arch 系统上运行)。对更多的硬件和操作系统的支持正在进行中,查看[支持平台文档][5]获取最新列表。[这里][6]列出了依赖和组件。你也可能想要下载 [SDK][7],其中包括了示例、文档、构建系统集成文件,以及其它。在这篇文章中我会使用 [SYCL 并行 STL][8],如果你想要自己在家学习的话也要下载它。
一旦你设置好了一切,我们就可以开始通用 GPU 编程了!正如简介中提到的,我的第一个示例使用 SYCL 并行 STL 实现。我们现在来看看如何使用纯 SYCL 编写代码。
```
#include <CL/sycl.hpp>
#include <array>
#include <numeric>
#include <iostream>
int main() {
const size_t array_size = 1024*512;
std::array<cl::sycl::cl_int, array_size> in,out;
std::iota(begin(in),end(in),0);
{
cl::sycl::queue device_queue;
cl::sycl::range<1> n_items{array_size};
cl::sycl::buffer<cl::sycl::cl_int, 1> in_buffer(in.data(), n_items);
cl::sycl::buffer<cl::sycl::cl_int, 1> out_buffer(out.data(), n_items);
device_queue.submit([&](cl::sycl::handler &cgh) {
constexpr auto sycl_read = cl::sycl::access::mode::read;
constexpr auto sycl_write = cl::sycl::access::mode::write;
auto in_accessor = in_buffer.get_access<sycl_read>(cgh);
auto out_accessor = out_buffer.get_access<sycl_write>(cgh);
cgh.parallel_for<class VecScalMul>(n_items,
[=](cl::sycl::id<1> wiID) {
out_accessor[wiID] = in_accessor[wiID]*2;
});
});
}
}
```
我会把它划分为一个个片段。
```
#include <CL/sycl.hpp>
```
我们做的第一件事就是包含 SYCL 头文件,它会在我们的命令中添加 SYCL 运行时库。
```
const size_t array_size = 1024*512;
std::array<cl::sycl::cl_int, array_size> in,out;
std::iota(begin(in),end(in),0);
```
这里我们构造了一个很大的整型数组并用数字 `0` 到 `array_size-1` 初始化(这就是 `std::iota` 所做的)。注意我们使用 `cl::sycl::cl_int` 确保兼容性。
```
{
//...
}
```
接着我们打开一个新的作用域,其目的为二:
1. `device_queue` 将在该作用域结束时解构,它将阻塞,直到内核完成。
2. `in_buffer``out_buffer` 也将解构,这将强制数据传输回主机并允许我们从 `in``out` 中访问数据。
```
cl::sycl::queue device_queue;
```
现在我们创建我们的命令队列。命令队列是所有工作(内核)在分发到设备之前需要入队的地方。有很多方法可以定制队列,例如说提供设备用于入队或者设置异步错误处理器,但对于这个例子默认构造器就可以了;它会查找兼容的 GPU如果失败的话会回退到主机 CPU。
```
cl::sycl::range<1> n_items{array_size};
```
接下来我们创建一个范围,它描述了内核在上面执行的数据的形状。在我们简单的例子中,它是一个一维数组,因此我们使用 `cl::sycl::range<1>`。如果数据是二维的,我们就会使用 `cl::sycl::range<2>`,以此类推。除了 `cl::sycl::range`,还有 `cl::sycl::ndrange`,它允许你指定工作组大小以及越界范围,但在我们的例子中我们不需要使用它。
```
cl::sycl::buffer<cl::sycl::cl_int, 1> in_buffer(in.data(), n_items);
cl::sycl::buffer<cl::sycl::cl_int, 1> out_buffer(out.data(), n_items);
```
为了控制主机和设备之间的数据共享和传输SYCL 提供了一个 `buffer` 类。我们创建了两个 SYCL 缓存用于管理我们的输入和输出数组。
```
device_queue.submit([&](cl::sycl::handler &cgh) {/*...*/});
```
设置好了我们所有数据之后,我们就可以入队真正的工作。有多种方法可以做到,但设置并行执行的一个简单方法是在我们的队列中调用 `.submit` 函数。对于这个函数我们传递了一个运行时调度该任务时会被执行的“命令组伪函数”(伪函数是规范,不是我创造的)。命令组处理器设置任何内核需要的余下资源并分发它。
```
constexpr auto sycl_read = cl::sycl::access::mode::read_write;
constexpr auto sycl_write = cl::sycl::access::mode::write;
auto in_accessor = in_buffer.get_access<sycl_read>(cgh);
auto out_accessor = out_buffer.get_access<sycl_write>(cgh);
```
为了控制到我们缓存的访问并告诉该运行时环境我们会如何使用数据,我们需要创建访问器。很显然,我们创建了一个访问器用于从 `in_buffer` 读入,一个访问器用于写到 `out_buffer`
```
cgh.parallel_for<class VecScalMul>(n_items,
[=](cl::sycl::id<1> wiID) {
out_accessor[wiID] = in_accessor[wiID]*2;
});
```
现在我们已经完成了所有设置,我们可以真正的在我们的设备上做一些计算了。这里我们根据范围 `n_items` 在命令组处理器 `cgh` 之上分发一个内核。实际内核自身是一个使用 work-item 标识符作为输入、输出我们计算结果的 lamda 表达式。在这种情况下,我们从 `in_accessor` 使用 work-item 标识符作为索引读入,将其乘以 `2`,然后将结果保存到 `out_accessor` 相应的位置。`<class VecScalMul>` 是一个为了在标准 C++ 范围内工作的不幸的副产品,因此我们需要给内核一个唯一的类名以便编译器能完成它的工作。
```
}
```
在此之后,我们现在可以访问 `out` 并期望看到正确的结果。
这里有相当多的新概念在起作用,但使用这些技术你可以看到这些能力和所展现出来的东西。当然,如果你只是想在你的 GPU 上执行一些代码而不关心定制化,那么你就可以使用 SYCL 并行 STL 实现。
### SYCL 并行 STL
SYCL 并行 STL 是一个 TS 的并行化实现,它分发你的算法函数对象作为 SYCL 内核。在这个页面前面我们已经看过这样的例子,让我们来快速过一遍。
```
#include <vector>
#include <iostream>
#include <sycl/execution_policy>
#include <experimental/algorithm>
#include <sycl/helpers/sycl_buffers.hpp>
using namespace std::experimental::parallel;
using namespace sycl::helpers;
int main() {
constexpr size_t array_size = 1024*512;
std::array<cl::sycl::cl_int, array_size> in,out;
std::iota(begin(in),end(in),0);
{
cl::sycl::buffer<int> in_buffer(in.data(), cl::sycl::range<1>(in.size()));
cl::sycl::buffer<int> out_buffer(out.data(), cl::sycl::range<1>(out.size()));
cl::sycl::queue q;
sycl::sycl_execution_policy<class Mul> sycl_policy(q);
transform(sycl_policy, begin(in_buffer), end(in_buffer), begin(out_buffer),
[](int x) { return x*2; });
}
}
```
```
constexpr size_t array_size = 1024*512;
std::array<cl::sycl::cl_int, array_size> in, out;
std::iota(begin(in),end(in),0);
```
到现在为止一切如此相似。我们再一次创建一组数组用于保存我们的输入输出数据。
```
cl::sycl::buffer<int> in_buffer(in.data(), cl::sycl::range<1>(in.size()));
cl::sycl::buffer<int> out_buffer(out.data(), cl::sycl::range<1>(out.size()));
cl::sycl::queue q;
```
这里我们创建类似上个例子的缓存和队列。
```
sycl::sycl_execution_policy<class Mul> sycl_policy(q);
```
这就是有趣的部分。我们从我们的队列中创建 `sycl_execution_policy`,给它一个名称让内核使用。这个执行策略然后可以像 `std::execution::par` 或 `std::execution::seq` 那样使用。
```
transform(sycl_policy, begin(in_buffer), end(in_buffer), begin(out_buffer),
[](int x) { return x*2; });
```
现在我们的内核分发看起来像提供了一个执行策略的 `std::transform` 调用。我们传递的闭包会被编译并在设备上执行,而不需要我们做其它更加复杂的设置。
当然,除了 `transform` 你可以做更多。开发的时候SYCL 并行 STL 支持以下算法:
* `sort`
* `transform`
* `for_each`
* `for_each_n`
* `count_if`
* `reduce`
* `inner_product`
* `transform_reduce`
这就是这篇短文需要介绍的东西。如果你想和 SYCL 的开发保持同步,那就要看 [sycl.tech][9]。最近重要的开发就是移植 [Eigen][10] 和 [Tensorflow][11] 到 SYCL ,为 OpenCL 设备带来引入关注的人工智能编程。对我个人而言,我很高兴看到高级编程模型可以用于异构程序自动优化,以及它们是怎样支持类似 [HPX][12] 或 [SkelCL][13] 等更高级的技术。
--------------------------------------------------------------------------------
via: https://blog.tartanllama.xyz/c++/2017/05/19/sycl/
作者:[TartanLlama][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.twitter.com/TartanLlama
[1]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fnref:1
[2]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fn:1
[3]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fn:2
[4]:https://www.khronos.org/sycl
[5]:https://www.codeplay.com/products/computesuite/computecpp/reference/platform-support-notes
[6]:https://www.codeplay.com/products/computesuite/computecpp/reference/release-notes/
[7]:https://github.com/codeplaysoftware/computecpp-sdk
[8]:https://github.com/KhronosGroup/SyclParallelSTL
[9]:http://sycl.tech/
[10]:https://github.com/ville-k/sycl_starter
[11]:http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/
[12]:https://github.com/STEllAR-GROUP/hpx
[13]:https://github.com/skelcl/skelcl

View File

@ -0,0 +1,234 @@
掌握 Git 之美
=====================================================
![](https://cdn-images-1.medium.com/max/2000/1*wOJzZIRawP0SmlPDu32mxw.jpeg)
> 使用 7 条简单的 Git 命令开始你的软件开发之旅
你是否曾经想知道如何学好 Git你长期以来都是跌跌撞撞地在使用 Git。最终你总需要掌握它的窍门。这就是我写这篇文章的原因我将带你去启蒙之旅。这儿是我关于如何加快 Git 学习过程的基本指南。我将介绍 Git 的实际情况以及我使用最多的 7 条 Git 命令。本文主要针对有兴趣的开发人员和大学新生,他们需要关于 Git 的介绍以及如何掌握基础知识。
***
你可以往前继续阅读整篇文章,或者只读 TLDR; 部分,尽管这将使我很受伤。
### TLDR;
在学习 Git 的过程中,请养成下面这些步骤的习惯:
1. 随时使用 `git status`
2. 只更改那些你真正想更改的文件。
3. `git add -A` 会是你的朋友。
4. 随时使用命令 `git commit -m "meaningful messages"`
5. 做任何推送push之前先使用命令 `git pull`,但是这需要在你提交过一些更改之后。
6. 最后,`git push`推送提交的更改。
***
### 良宵莫辜负
对任何开发人员来说,通常第一步都是选择一个广泛使用的地方托管他或她的代码库。那就是,[GitHub][4]。它是一切有关代码的聚集地。要理解 GitHub 的概念,你先需要知道什么是 Git。
Git 是一款基于命令行的版本控制软件,在 Windows 和 Mac 系统上也有几款可用的桌面应用。 Git 由 Linux 之父 Linus Torvalds 开发Linus Torvalds 还是是计算机科学中最有影响力的人物之一。因为这一优势Git 已经成为绝大多数软件开发人员关于共享和维护代码的标准。这一大段话,让我们将其细细道来。正如它的名字所说,版本控制软件 Git 让你可以预览你写过的代码的所有版本。从字面上来说, 开发人员的每个代码库都将永远存储在其各自的仓库中,仓库可以叫做任何名字,从 *pineapple**express* 都行。在此仓库开发代码的过程中,你将进行出无数次的更改,直到第一次正式发布。这就是版本控制软件如此重要的核心原因所在。它让作为开发人员的你可以清楚地了解对代码库进行的所有更改、修订和改进。从另外一个方面说,它使协同合作更容易,下载代码进行编辑,然后将更改上传到仓库。然而,尽管有了这么多好处,然而还有一件事可以锦上添花。你可以下载并使用这些文件,即使你在整个开发过程中什么事也没有做。
让我们回到文章的 GitHub 部分。它只是所有仓库的枢纽hub这些仓库可以存储在其中并在线浏览。它是一个让有着共同兴趣的人相聚的地方。
### 千里之行始于足下
OK记住Git 是一款软件,像任何其他软件一样,你首先需要安装它:
[Git - 安装 Git如果你希望从源代码安装 Git你需要安装这些 Git 的依赖库: autotools —— 来自 git-scm.com][5]
*Tips请点击上面的链接然后按照说明开始。*
完成了安装过程,很好。现在你需要在你的浏览器地址栏输入 [github.com][7] 访问该网站。如果你还没有帐号的话需要新创建一个帐号,这就是你的起舞之处。登录并创建一个新仓库,命名为 Steve ,没有什么理由,只是想要一个名为史蒂夫的仓库好玩而已。选中 “Initialize this repository with a README” 复选框并点击创建按钮。现在你有了一个叫做 Steve 的仓库。我相信你会为你自己感到自豪。
![](https://cdn-images-1.medium.com/max/1000/1*Hw0s4yAfViZQNXO7YB0X8A.png)
### 现在开始在使用 Git
现在是比较有趣的部分。你将把 Steve 克隆到你本地的机器上。可以把这个过程看作从 Github 上复制仓库到你的电脑上。点击 “clone or download” 按钮,你将看到一个类似下面这样的 URL:
```
https://github.com/yourGithubAccountName/Steve.git
```
复制这个 URL 并打开命令提示符窗口。现在输入并运行条命令:
```
git clone https://github.com/yourGithubAccountName/Steve.git
```
AbrakadabraSteve 仓库已经被自动克隆到了你的电脑上。查看你克隆这个仓库的目录,你会看到一个叫做 Steve 的文件夹。这个本地的文件夹现在已经链接到了它的 “origin” ,也就是 GitHub 上的远程仓库。
记住这个过程,在你的软件开发工程人员的职业生涯中你一定会重复这个过程很多次的。完成所有这些准备工作之后,你就可以开始使用最普通且常用的 Git 命令了。
![蹩脚的电视游戏使用说明](https://cdn-images-1.medium.com/max/800/1*txfAZdt3U0u9V9WTEZiyNQ.jpeg)
### 你现在已经开始在真实场景使用 Git 了
找到 Steve 目录并在该目录中打开命令提示符窗口,运行下面的命令:
```
git status
```
这会输出你的工作目录的状态,让你知道所有你编辑过的文件。这意味着它显示了远程库中和本地工作目录中之间的文件差异。`status` 命令被用来作为 `commit` 的模版,我将在这篇教程后面进一步谈论 `commit` 。简单的说,`[git status][1]` 告诉你你编辑过哪些文件,以给你一个你想要上传到远程库的概述。
但是,在你做任何上传之前,你首先需要做的是选择你需要发送回远程库的文件。使用下面命令完成:
```
git add
```
接着在 Steve 目录新建一个文本文件,可以取一个好玩的名字 `pineapple.txt`。在这个文件里面随便写些你想写的内容,返回命令提示符,然后再次输入 `git status`。现在,你将看到这个文件以红色出现在标记 “untracked files” 下面。
```
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be commited)
pineapple.txt
```
下一步就是将它添加到暂存区staging。暂存区可以看作是这样的一个环境你做过的所有更改在提交时都将捆绑为一个更改而被提交。现在你可以将这个文件加入暂存区
```
git add -A
```
`-A` 选项意味着所有你更改过的文件都会被加到暂存区等待提交。然而, `git add` 非常灵活,它也可以像这样一个文件一个文件的添加:
```
git add pineapple.txt
```
这种方法让你有能力选择你想要暂存的每一个文件,而不用担心加入那些你不想改变的东西。
再次运行 `git status`,你会看到如下输出:
```
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: pineapple.txt
```
准备好提交更改了吗?开始吧。
```
git commit -m "Write your message here"
```
[Git commit][9] 命令会将存储在暂存区中的文件和来自用户的用于描述更改的日志信息一起存储在一个新的地方。`-m`选项加入了写在双引号内的信息。
再次检查状态,你会看到:
```
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
```
所有的更改现在都被加入到一次提交当中了,同时会有一条与你所做相关的信息。现在你可以用 `git push` 将这次提交推送到远程库 “origin”了。这条命令就像字面意义所说它会把你提交的更改从本地机器上传到 GitHub 的远程仓库中。返回到命令提示符,然后运行:
```
git push
```
你会被要求输入你的 GitHub 帐号和密码,之后你会看到类似下面的这些内容:
```
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/yourGithubUserName/Steve.git
c77a97c..08bb95a master -> master
```
就是这样。你已经成功上传了你本地的更改。看看你在 GitHub 上的仓库,你会看到它现在包含了一叫做 `pineapple.txt` 的文件。
如果你是一个开发小组的一员呢?如果他们都推送提交到 “origin”将会发生什么这就是 Git 真正开始发挥它的魔力的时候。你可以使用一条简单的命令轻松地将最新版本的代码库 [pull][10] 到你本地的机器上:
```
git pull
```
但是 Git 也有限制:你需要有相匹配的版本才能推送到 “origin”。这意味着你本地的版本需要和 origin 的版本大致一样。当你从 “origin” 拉取pull文件时在你的工作目录中不能有文件因为它们将会在这个过程中被覆盖。因此我给出了这条简单的建议。在学习 Git 的过程中,请养成下面这些步骤的习惯:
1. 随时使用 `git status`
2. 只更改那些你真正想更改的文件。
3. `git add -A` 会是你的朋友。
4. 随时使用命令 `git commit -m "meaningful messages"`
5. 做任何推送push之前先使用命令 `git pull`,但是这需要在你提交过一些更改之后。
6. 最后,`git push`推送提交的更改。
***
嘿!你还在看这篇文章吗?你已经看了很久了,休息一下吧!
![[又一个蹩脚的电视游戏使用说明](https://cdn-images-1.medium.com/max/800/1*vrNe9wt2zHczmXx-tkGipw.jpeg)
休息好了吗?好的!让我们来处理一些错误。如果你不小心更改了一些你本不应该更改的文件后怎么办呢?不需要担心,只需要使用 [git checkout][3]。让我们在文件 `pineapple.txt` 里更改一些内容在文件中加入一行比方说“Steve is mega-awesome!” 。然后保存更改并用 `git status` 检查一下:
```
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: pineapple.txt
no changes added to commit (use "git add" and/or "git commit -a")
```
正如预料的那样,它已经被记录为一次更改了。但是,假如 Steve 实际上并不是很优秀呢?假如 Steve 很差劲呢?不用担心!最简单的还原更改的方式是运行命令:
```
git checkout -- pineapple.txt
```
现在你会看到文件已经恢复到了先前的状态。
但是假如你玩砸了呢?我是说,事情已经变得混乱,并且需要把所有东西重置到与 “origin” 一样的状态。也不需要担心,在这种紧急情况下我们可以享受 Git 的美妙之处:
```
git reset --hard
```
[Git reset][11] 命令和 `--hard` 选项一起可以抛弃自上次提交以来的所有更改,有些时候真的很好用。
***
最后,我想鼓励你尽可能多地使用 Git。这是能够熟练使用它的最好学习方式。除此之外养成阅读 Git 文档的习惯。一开始可能会有些云里雾里,但是过段时间后你就会明白它的窍门了。
*希望你们(小伙子和姑娘们)读这篇文章的时候会和我写它时一样的开心。如果你认为这篇文章对别人有用,你尽可以与别人分享它。或者,如果你喜欢这篇文章,你可以在下面点下赞以便让更多的人看到这篇文章。*
--------------------------------------------------------------------------------
via: https://hackernoon.com/how-to-master-the-art-of-git-68e1050f3147
作者:[Adnan Rahić][a]
译者:[zhousiyu325](https://github.com/zhousiyu325)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://hackernoon.com/@adnanrahic
[1]:https://git-scm.com/docs/git-status
[2]:https://git-scm.com/docs/git-push
[3]:https://git-scm.com/docs/git-checkout
[4]:https://github.com/
[5]:https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
[6]:https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
[7]:https://github.com/
[8]:https://git-scm.com/docs/git-add
[9]:https://git-scm.com/docs/git-commit
[10]:https://git-scm.com/docs/git-pull
[11]:https://git-scm.com/docs/git-reset

View File

@ -1,13 +1,11 @@
针对新手的 Linux `comm` 命令教程
使用 comm 比较两个排序好的文件
===========================================================
Linux 中的 `comm` 命令可以让用户按行比较两个已经排序好的文件。在本教程中,我们将使用一些浅显易懂的例子来讨论这个命令行工具。在开始之前,请注意,本教程中提到的所有例子都已经在 Ubuntu 16.04LTS 版本中测试过。
### Linux `comm` 命令
Linux 中的 `comm` 命令可以让用户按行比较两个**已经排序好**的文件。在本教程中,我们将使用一些浅显易懂的例子来讨论这个命令行工具。在开始之前,请注意,本教程中提到的所有例子都已经在 Ubuntu 16.04LTS 版本中测试过。
下面的例子将会告诉你 `comm` 命令是如何工作的。
### 1\. 如何使用 `comm` 比较两个排序好的文件
### 1 如何使用 `comm` 比较两个排序好的文件
要使用 `comm` 命令比较两个排序好的文件,只需要把它们的名字作为 `comm` 命令的参数。下面是通常的语法:
@ -15,7 +13,7 @@ Linux 中的 `comm` 命令可以让用户按行比较两个已经排序好的文
comm [name-of-first-file] [name-of-second-file]
```
比如,假设 file1 和 file2 是这种情况下的两个文件。前者包含下面几行内容:
比如,假设 `file1``file2` 是这种情况下的两个文件。前者包含下面几行内容:
```
001
@ -41,11 +39,11 @@ comm file1 file2
[![](https://www.howtoforge.com/images/linux_comm_command/comm-output.png)][8]
你可以看到,输出包含 3 列。第一列是仅包含在 file1 中的内容,第二列是仅包含在 file2 中的内容,最后,第三列是两个文件中均包含的内容。
你可以看到,输出包含 3 列。第一列是仅包含在 `file1` 中的内容,第二列是仅包含在 `file2` 中的内容,最后,第三列是两个文件中均包含的内容。
### 2\. 如何不输出 `comm` 命令输出中的某些列
### 2 如何不输出 `comm` 命令输出中的某些列
如果你想,你可以不输出 `comm` 命令输出中的某些列。对于该特性,你有三个命令行选项可用:**-1**、**-2** 和 **-3** 。正如你所猜想的,这些数字表示你不想输出的列。
如果你想,你可以不输出 `comm` 命令输出中的某些列。对于该特性,你有三个命令行选项可用:`-1`、`-2` 和 `-3` 。正如你所猜想的,这些数字表示你不想输出的列。
比如,下面这个命令将会不输出上面例子中的第三列:
@ -65,13 +63,13 @@ comm -12 file1 file2
上面这个命令将会不输出第一、二列。
### 3\. 如何使用 `comm` 命令比较两个未排序好的文件
### 3 如何使用 `comm` 命令比较两个未排序好的文件
正如我们所知道的,`comm` 只可用于排序好的文件。如果发现其中一个文件未排序好,那么便会在输出中产生一条信息来告诉用户。比如,我们交换 file1 的第一行和第二行,然后与 file2 进行比较。下面是该命令的输出:
正如我们所知道的,`comm` 只可用于排序好的文件。如果发现其中一个文件未排序好,那么便会在输出中产生一条信息来告诉用户。比如,我们交换 `file1` 的第一行和第二行,然后与 `file2` 进行比较。下面是该命令的输出:
[![](https://www.howtoforge.com/images/linux_comm_command/comm-not-sorted-message.png)][10]
你可以看到这个命令产生一个输出告诉我们file1 还没有排序好。此时,如果你不想让这个工具检查输入是否已经排序好,那么你可以使用 `--nocheck-order` 选项:
你可以看到,这个命令产生一个输出告诉我们:`file1` 还没有排序好。此时,如果你不想让这个工具检查输入是否已经排序好,那么你可以使用 `--nocheck-order` 选项:
```
comm --nocheck-order file1 file2
@ -83,21 +81,21 @@ comm --nocheck-order file1 file2
注意,如果你想明确告诉 `comm` 命令来检查输入文件是否排序好,那么你可以使用 `--check-order` 选项。
### 4\. 如何用自定义字符串分隔 `comm` 命令的输出列
### 4 如何用自定义字符串分隔 `comm` 命令的输出列
默认情况下,`comm` 命令的输出列之间是以空格分隔的。然而,如何你想使用一个自定义字符串作为分隔符,那么你可以使用 `--output-delimiter` 选项。使用该选项时需要指定你想用来作为分隔符的字符串。
```
comm --output-delimiter=STR file1 file2
comm --output-delimiter=+ file1 file2
```
比如,我们使用加号来作为分隔符:
[![](https://www.howtoforge.com/images/linux_comm_command/comm-output-delimiter.png)][12]
### 5\. 如何使 `comm` 的输出行以空字符终止
### 5、 如何使 `comm` 的输出行以 `NUL` 字符终止
默认情况下,`comm` 命令的输出行以新行终止。然而,如果你想,那么你可以改为以字符终止,只需要使用 `-z` 选项即可:
默认情况下,`comm` 命令的输出行以新行终止。然而,如果你想,那么你可以改为以 `NUL` 字符终止,只需要使用 `-z` 选项即可:
```
comm -z file1 file2
@ -113,7 +111,7 @@ via: https://www.howtoforge.com/linux-comm-command/
作者:[Himanshu Arora][a]
译者:[ucasFL](https://github.com/ucasFL)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@ -130,4 +128,4 @@ via: https://www.howtoforge.com/linux-comm-command/
[10]:https://www.howtoforge.com/images/linux_comm_command/big/comm-not-sorted-message.png
[11]:https://www.howtoforge.com/images/linux_comm_command/big/comm-nocheck-order.png
[12]:https://www.howtoforge.com/images/linux_comm_command/big/comm-output-delimiter.png
[13]:https://linux.die.net/man/1/comm
[13]:https://linux.cn/man/1/comm

View File

@ -0,0 +1,219 @@
Linux 系统中修复 SambaCry 漏洞CVE-2017-7494
============================================================
Samba 很久以来一直是为 *nix 系统上的 Windows 客户端提供共享文件和打印服务的标准。家庭用户,中型企业和大型公司都在使用它,它作为最佳解决方案在多种操作系统共存的环境中脱颖而出。
由于广泛使用的工具很可能发生这种情况,大多数 Samba 安装都面临着可能利用已知漏洞的攻击的风险,这个漏洞直到 WannaCry 勒索软件攻击的新闻出来之前都被认为是不重要的。
在本文中,我们将解释这个 Samba 漏洞是什么以及如何保护你负责的系统。根据你的安装类型(从仓库或者源码),你需要采取不同的方法。
如果你目前有在任何环境中使用 Samba 或者知道有人在使用,请继续阅读!
### 漏洞
过时和未修补的系统容易受到远程代码执行漏洞的攻击。简单来说,这意味着访问可写共享的人可以上传一段任意代码,并使用服务器中的 root 权限执行该代码。
这个问题在 Samba 网站上被描述为 [CVE-2017-7494][1],并且已知会影响 Samba v3.52010 年 3 月初发布)及以后版本。由于与 WannaCry 有相似之处,它被非官方地被命名为 SambaCry它们均针对 SMB 协议,并且可能是蠕虫病毒 - 这可能导致其从一个系统传播到另一个系统中。
Debian、Ubuntu、CentOS 和 Red Hat 已采取快速的行动来保护它们的用户,并为其支持的版本发布了补丁。另外,还提供了不受支持的安全临时解决方案。
### 更新 Samba
如先前提到的那样,根据你之前安装的方法有两种方式更新:
#### 如果你从发行版的仓库中安装的 Samba
让我们看下在这种情况下你需要做什么:
**在 Debian 下修复 SambaCry**
添加下面的行到你的源列表中(`/etc/apt/sources.list`)以确保 [apt][2] 能够获得最新的安全更新:
```
deb http://security.debian.org stable/updates main
deb-src http://security.debian.org/ stable/updates main
```
接下来,更新可用的软件包:
```
# aptitude update
```
最后,确保 samba 软件包的版本符合漏洞修复的版本(见 [CVE-2017-7494][3]
```
# aptitude show samba
```
![Fix Sambacry in Debian](https://www.tecmint.com/wp-content/uploads/2017/05/Fix-Sambacry-in-Debian.png)
*在 Debian 中修复 SambaCry*
**在 Ubuntu 中修复 SambaCry**
要开始修复,如下检查新的可用软件包并更新 Samba 软件包:
```
$ sudo apt-get update
$ sudo apt-get install samba
```
已经修复 CVE-2017-7494 的 Samba 版本有下面这些:
* 17.04: samba 2:4.5.8+dfsg-0ubuntu0.17.04.2
* 16.10: samba 2:4.4.5+dfsg-2ubuntu5.6
* 16.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.16.04.7
* 14.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.14.04.8
最后,运行下面命令验证你的 Ubuntu 已经安装了正确的版本。
```
$ sudo apt-cache show samba
```
**在 CentOS/RHEL 7 中修复 SambaCry**
在 EL 7 中打过补丁的 Samba 版本是 samba-4.4.4-14.el7_3。要安装它这些做
```
# yum makecache fast
# yum update samba
```
像先前那样,确保你已经安装了打补丁的 Samba 版本:
```
# yum info samba
```
![Fix Sambacry in CentOS](https://www.tecmint.com/wp-content/uploads/2017/05/Fix-Sambacry-in-CentOS.png)
*在 CentOS 中修复 SambaCry*
旧支持的 CentOS 以及 RHEL 更老的版本也有修复。参见 [RHSA-2017-1270][4] 获取更多。
#### 如果你从源码安装的 Samba
注意:下面的过程假设你先前从源码构建的 Samba。强烈建议你在部署到生产服务器之前先在测试环境尝试。
此外,开始之前确保你备份了 `smb.conf` 文件。
在这种情况下,我们也会从源码编译并更新 Samba。然而在开始之前我们必须先确保安装了所有的依赖。注意这也许会花费几分钟。
**在 Debian 和 Ubuntu 中:**
```
# aptitude install acl attr autoconf bison build-essential \
debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user \
libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev \
libcap-dev libcups2-dev libgnutls28-dev libjson-perl \
libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl \
libpopt-dev libreadline-dev perl perl-modules pkg-config \
python-all-dev python-dev python-dnspython python-crypto xsltproc \
zlib1g-dev libsystemd-dev libgpgme11-dev python-gpgme python-m2crypto
```
**在 CentOS 7 或相似的版本中:**
```
# yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
python-crypto gnutls-devel libattr-devel keyutils-libs-devel \
libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
pam-devel popt-devel python-devel readline-devel zlib-devel
```
停止服务LCTT 译注:此处不必要):
```
# systemctl stop smbd
```
下载并解压源码(在写作时 4.6.4 是最新的版本):
```
# wget https://www.samba.org/samba/ftp/samba-latest.tar.gz
# tar xzf samba-latest.tar.gz
# cd samba-4.6.4
```
出于了解信息的目的,用以下命令检查可用的配置选项。
```
# ./configure --help
```
如果你在先前的版本的构建中有使用到一些选项,你或许可以在上面命令的返回中包含一些选项,或者你可以选择使用默认值:
```
# ./configure
# make
# make install
```
最后重启服务。
```
# systemctl restart smbd
```
并验证你正在使用的是更新后的版本:
```
# smbstatus --version
```
这里返回的应该是 4.6.4。
### 其它情况
如果你使用的是不受支持的发行版本,并且由于某些原因无法升级到最新版本,你或许要考虑下面这些建议:
* 如果 SELinux 是启用的,你是处于保护之下的!
* 确保 Samba 共享是用 `noexec` 选项挂载的。这会阻止二进制文件从被挂载的文件系统中执行。
还有将:
```
nt pipe support = no
```
添加到 `smb.conf``[global]` 字段中。你或许要记住,根据 Samba 项目,这“或许禁用 Windows 客户端的某些功能”。
重要:注意 `nt pipe support = no` 选项会禁用 Windows 客户端的共享列表。比如:当你在一台 Samba 服务器的 Windows Explorer 中输入 `\\10.100.10.2\` 时,你会看到 “permission denied”。Windows 客户端不得不手动执行共享,如 `\\10.100.10.2\share_name` 来访问共享。
### 总结
在本篇中,我们已经描述了 SambaCry 漏洞以及如何减轻影响。我们希望你可以使用这个信息来保护你负责的系统。
如果你有关于这篇文章的任何提问以及评论,欢迎使用下面的评论栏让我们知道。
--------------------------------------------------------------------------------
作者简介:
Gabriel Cánepa 是一名 GNU/Linux 系统管理员,阿根廷圣路易斯 Villa Mercedes 的 web 开发人员。他为一家国际大型消费品公司工作,在日常工作中使用 FOSS 工具以提高生产力,并从中获得极大乐趣。
--------------
via: https://www.tecmint.com/fix-sambacry-vulnerability-cve-2017-7494-in-linux/
作者:[Gabriel Cánepa][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/gacanepa/
[1]:https://www.samba.org/samba/security/CVE-2017-7494.html
[2]:https://www.tecmint.com/apt-advanced-package-command-examples-in-ubuntu/
[3]:https://security-tracker.debian.org/tracker/CVE-2017-7494
[4]:https://rhn.redhat.com/errata/RHSA-2017-1270.html
[5]:https://www.tecmint.com/author/gacanepa/
[6]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[7]:https://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -0,0 +1,108 @@
使用 Python 开始你的机器学习之旅
============================================================
> 机器学习是你的简历中必需的一门技能。我们简要概括一下使用 Python 来进行机器学习的一些步骤。
![Get started with machine learning using Python](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_khan_520x292_FINAL.png?itok=lCkXsudF "Get started with machine learning using Python")
>图片来自 opensource.com
你想知道如何开始机器学习吗?在这篇文章中,我将简要概括一下使用 [Python][16] 来开始机器学习的一些步骤。Python 是一门流行的开源程序设计语言,也是在人工智能及其它相关科学领域中最常用的语言之一。机器学习简称 ML是人工智能的一个分支它是利用算法从数据中进行学习然后作出预测。机器学习有助于帮助我们预测我们周围的世界。
从无人驾驶汽车到股市预测,再到在线学习,机器学习通过预测来进行自我提高的方法几乎被用在了每一个领域。由于机器学习的实际运用,目前它已经成为就业市场上最有需求的技能之一。另外,使用 Python 来开始机器学习很简单,因为有大量的在线资源,以及许多可用的 [Python 机器学习库][16]。
你需要如何开始使用 Python 进行机器学习呢?让我们来总结一下这个过程。
### 提高你的 Python 技能
由于 Python 在工业界和科学界都非常受欢迎,因此你不难找到 Python 的学习资源。如果你是一个从未接触过 Python 的新手,你可以利用在线资源,比如课程、书籍和视频来学习 Python。比如下面列举的一些资源
* [Python 学习之路][5]
* [Google 开发者 Python 课程(视频)][6]
* [Google 的 Python 课堂][7]
### 安装 Anaconda
下一步是安装 [Anacona][2]。有了 Anaconda ,你将可以开始使用 Python 来探索机器学习的世界了。Anaconda 的默认安装库包含了进行机器学习所需要的工具。
### 基本的机器学习技能
有了一些基本的 Python 编程技能,你就可以开始学习一些基本的机器学习技能了。一个实用的学习方法是学到一定技能便开始进行练习。然而,如果你想深入学习这个领域,那么你需要准备投入更多的学习时间。
一个获取技能的有效方法是在线课程。吴恩达的 Coursera [机器学习课程][20] 是一个不错的选择。其它有用的在线训练包括:
* [Python 机器学习: Scikit-Learn 教程][8]
* [Python 实用机器学习教程][9]
你也可以在 [LiveEdu.tv][21] 上观看机器学习视频,从而进一步了解这个领域。
### 学习更多的 Python 库
当你对 Python 和机器学习有一个好的感觉之后,可以开始学习一些[开源的 Python 库][22]。科学的 Python 库将会使完成一些简单的机器学习任务变得很简单。然而,选择什么库是完全主观的,并且在业界内许多人有很大的争论。
一些实用的 Python 库包括:
* [Scikit-learn][10] :一个优雅的机器学习算法库,可用于数据挖掘和数据分析任务。
* [Tensorflow][11] :一个易于使用的神经网络库。
* [Theano][12] : 一个强大的机器学习库,可以帮助你轻松的评估数学表达式。
* [Pattern][13] 可以帮助你进行自然语言处理、数据挖掘以及更多的工作。
* [Nilearn][14] :基于 Scikit-learn它可以帮助你进行简单快速的统计学习。
### 探索机器学习
对基本的 Python、机器学习技能和 Python 库有了一定理解之后,就可以开始探索机器学习了。接下来,尝试探索一下 Scikit-learn 库。一个不错的教程是 Jake VanderPlas 写的 [Scikit-learn 简介][23]。
然后,进入中级主题,比如 [K-均值聚类算法简介][24]、线性回归、[决策树][25]和逻辑回归。
最后,深入高级机器学习主题,比如向量机和复杂数据转换。
就像学习任何新技能一样,练习得越多,就会学得越好。你可以通过练习不同的算法,使用不同的数据集来更好的理解机器学习,并提高解决问题的整体能力。
使用 Python 进行机器学习是对你的技能的一个很好的补充,并且有大量免费和低成本的在线资源可以帮助你。你已经掌握机器学习技能了吗?可以在下面留下你的评论,或者[提交一篇文章][26]来分享你的故事。
--------------------------------------------------------------------------------
作者简介:
Michael J. Garbade 博士是旧金山 LiveEdu IncLivecoding.tv的创始人兼首席执行官。Livecoding.tv 是世界上观看工程师直播编代码最先进的直播平台。你可以通过观看工程师们写网站、移动应用和游戏来将你的技能提升到一个新的水平。MichaelJ. Garbade 博士拥有金融学博士学位,并且是一名自学成才的工程师,他喜欢 Python、Django、Sencha Touch 和视频流。
-----------
via: https://opensource.com/article/17/5/python-machine-learning-introduction
作者:[Michael J. Garbade][a]
译者:[ucasFL](https://github.com/ucasFL)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/drmjg
[1]:https://opensource.com/tags/python?src=programming_resource_menu
[2]:https://opensource.com/tags/javascript?src=programming_resource_menu
[3]:https://opensource.com/tags/perl?src=programming_resource_menu
[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&amp;amp;amp;amp;src=programming_resource_menu
[5]:https://learnpythonthehardway.org/book/
[6]:https://www.youtube.com/playlist?list=PLfZeRfzhgQzTMgwFVezQbnpc1ck0I6CQl
[7]:https://developers.google.com/edu/python/
[8]:https://www.datacamp.com/community/tutorials/machine-learning-python#gs.HfAvLRs
[9]:https://pythonprogramming.net/machine-learning-tutorial-python-introduction/
[10]:http://scikit-learn.org/stable/
[11]:https://opensource.com/article/17/2/machine-learning-projects-tensorflow-raspberry-pi
[12]:http://deeplearning.net/software/theano/
[13]:https://github.com/clips/pattern
[14]:https://github.com/nilearn/nilearn
[15]:https://opensource.com/article/17/5/python-machine-learning-introduction?rate=jgAmIV_YqoWTbnSgNjZ0EE5lyhJtzf-ukzhiMmXtfMQ
[16]:https://opensource.com/article/17/2/3-top-machine-learning-libraries-python
[17]:https://www.liveedu.tv/learn/python/
[18]:https://opensource.com/article/17/2/3-top-machine-learning-libraries-python
[19]:http://docs.continuum.io/anaconda/install
[20]:https://www.coursera.org/learn/machine-learning
[21]:https://www.liveedu.tv/
[22]:https://opensource.com/article/17/5/4-practical-python-libraries
[23]:http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-intro.ipynb
[24]:https://www.datascience.com/blog/introduction-to-k-means-clustering-algorithm-learn-data-science-tutorials
[25]:http://machinelearningmastery.com/implement-decision-tree-algorithm-scratch-python/
[26]:https://opensource.com/story
[27]:https://opensource.com/user/78291/feed
[28]:https://opensource.com/users/drmjg

View File

@ -1,53 +1,48 @@
Understand Linux Load Averages and Monitor Performance of Linux
理解 Linux 的平均负载和性能监控
============================================================
在本文中,我们将解释 Linux 系统中最关键的管理任务之一——关于系统 / CPU 的负载load和平均负载Load average的性能监控。
首先来看所有的类 UNIX 系统中两个重要的表述:
In this article, we will explain one of the critical Linux system administration tasks performance monitoring in regards to system/CPU load and load averages.
* 系统负载 / CPU 负载 – 衡量 Linux 系统的 CPU 过载或利用率低的指标,即处于运算状态或等待状态的 CPU 核心数。
* 平均负载 – 通过固定的时间周期如 1、5、15 分钟计算出的平均的系统负载。
Before we move any further, lets understand these two important phrases in all Unix-like systems:
Linux 中,平均负载一般指在内核运行队列中被标记为运行或不可打断状态的进程的平均数。
* System load/CPU Load  is a measurement of CPU over or under-utilization in a Linux system; the number of processes which are being executed by the CPU or in waiting state.
注意:
* Load average  is the average system load calculated over a given period of time of 1, 5 and 15 minutes.
* 几乎没有 Linux 或类 Unix 系统不为用户展示平均负载的值。
* 完全空闲的 Linux 系统平均负载为 0不包括空闲进程。
* 绝大多数类 Unix 系统只统计运行和等待状态的进程。但是在 Linux 中,平均负载也包括处于不可打断的睡眠状态的进程——它们是在等待其它系统资源如磁盘 I/O 等的进程。
In Linux, the load-average is technically believed to be a running average of processes in its (kernel) execution queue tagged as running or uninterruptible.
### 如何监测 Linux 系统平均负载
Note that:
* All if not most systems powered by Linux or other Unix-like systems will possibly show the load average values somewhere for a user.
* A downright idle Linux system may have a load average of zero, excluding the idle process.
* Nearly all Unix-like systems count only processes in the running or waiting states. But this is not the case with Linux, it includes processes in uninterruptible sleep states; those waiting for other system resources like disk I/O etc.
### How to Monitor Linux System Load Average
There are numerous ways of monitoring system load average including uptime which shows how long the system has been running, number of users together with load averages:
有诸多方式监测系统平均负载,如 `uptime`,它会展示系统运行时间、用户数量及平均负载:
```
$ uptime
07:13:53 up 8 days, 19 min, 1 user, load average: 1.98, 2.15, 2.21
```
The numbers are read from left to right, and the output above means that:
平均负载的数字从左到右的含义依次为:
* load average over the last 1 minute is 1.98
* 最近 1 分钟的平均负载为 1.98
* 最近 5 分钟的平均负载为 2.15
* 最近 15 分钟的平均负载为 2.21
* load average over the last 5 minutes is 2.15
高平均负载意味着系统是过载的:许多进程在等待 CPU 时间。
* load average over the last 15 minutes is 2.21
下一节将介绍平均负载和 CPU 核数的关系。此外,常用的工具 [top][5] 和 [glances][6] 可以实时显示 Linux 系统的运行状态:
High load averages imply that a system is overloaded; many processes are waiting for CPU time.
We will uncover this in the next section in relation to number of CPU cores. Additionally, we can as well use other well known tools such as [top][5] and [glances][6] which display a real-time state of a running Linux system, plus many other tools:
#### Top Command
#### Top命令
```
$ top
```
Display Running Linux Processes
显示运行中的Linux进程
```
top - 12:51:42 up 2:11, 1 user, load average: 1.22, 1.12, 1.26
Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie
@ -69,12 +64,14 @@ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
....
```
#### Glances Tool
#### Glances 工具
```
$ glances
```
Glances Linux System Monitoring Tool
Glances Linux系统监测工具
```
TecMint (LinuxMint 18 64bit / Linux 4.4.0-21-generic) Uptime: 2:16:06
CPU 16.4% nice: 0.1% LOAD 4-core MEM 60.5% active: 4.90G SWAP 0.1%
@ -96,99 +93,89 @@ ram13 0 0 1.6 4.8 1.45G 382M 3272 tecmint 0 S 6:25.
...
```
The load averages shown by these tools is read /proc/loadavg file, which you can view using the [cat command][7] as below:
这些工具中的平均负载是从 `/proc/loadavg` 文件中读取的,也可以直接使用 [cat 命令][7]查看:
```
$ cat /proc/loadavg
2.48 1.69 1.42 5/889 10570
```
To monitor load averages in graph format, check out: [ttyload Shows a Color-coded Graph of Linux Load Average in Terminal][8]
想要图形样式监测平均负载,请戳:[ttyload 终端中颜色编码图形显示 Linux 平均负载][8]。
On desktop machines, there are graphical user interface tools that we can use to view system load averages.
在桌面计算机中,可以使用图形用户接口工具查看系统平均负载。
### Understanding System Average Load in Relation Number of CPUs
### 理解系统平均负载和 CPU 核心数的关系
We cant possibly explain system load or system performance without shedding light on the impact of the number of CPU cores on performance.
考虑了 CPU 核心数的影响,才能解释系统负载。
#### Multi-processor Vs Multi-core
#### 多处理器 Vs 多核处理器
* Multi-processor  is where two or more physical CPUs are integrated into a single computer system.
* 多处理器 – 一个计算机系统中集成两个或多个物理 CPU
* 多核处理器 – 单个物理 CPU 有两个或多个单独的核并行工作也叫处理单元。双核意味着有两个处理单元4 核有 4 个处理单元,以此类推。
* Multi-core processor  is a single physical CPU which has at least two or more separate cores (or what we can also refer to as processing units) that work in parallel. Meaning a dual-core has 2 two processing units, a quad-core has 4 processing units and so on.
此外Intel 引入了超线程技术用来提高并行计算能力。
Furthermore, there is also a processor technology which was first introduced by Intel to improve parallel computing, referred to as hyper threading.
通过超线程技术,在操作系统中,单个物理 CPU 表现的和两个逻辑 CPU 一样。(实际在硬件上只有一个 CPU
Under hyper threading, a single physical CPU core appears as two logical CPUs core to an operating system (but in reality, there is one physical hardware component).
注意,单个 CPU 核同一时间只能执行一个任务,于是产生了多 CPU/处理器、多核 CPU以及多线程技术。
Note that a single CPU core can only carry out one task at a time, thus technologies such as multiple CPUs/processors, multi-core CPUs and hyper-threading were brought to life.
多 CPU 时,多个程序可以同时执行。如今的 Intel CPU 使用了多核心和超线程技术。
With more than one CPU, several programs can be executed simultaneously. Present-day Intel CPUs use a combination of both multiple cores and hyper-threading technology.
To find the number of processing units available on a system, we may use the [nproc or lscpu commands][9] as follows:
可以使用 [nproc 或 lscpu 命令][9]查看系统中的处理器单元数量。
```
$ nproc
4
OR
# 或者
lscpu
```
Another way to find the number of processing units using [grep command][10] as shown.
也可以使用 [grep 命令][10]
```
$ grep 'model name' /proc/cpuinfo | wc -l
4
```
Now, to further understand system load, we will take a few assumptions. Lets say we have load averages below:
为了进一步理解系统负载,需要做一些假设。假设系统负载如下:
```
23:16:49 up 10:49, 5 user, load average: 1.00, 0.40, 3.35
```
###### On a single core system this would mean:
**在单核系统中意味着:**
* The CPU was fully (100%) utilized on average; 1 processes was running on the CPU (1.00) over the last 1 minute.
* CPU 被充分利用100%);最近的 1 分钟有 1 个进程在运行。
* CPU 有 60% 处于空闲状态;在最近的 5 分钟没有进程等待 CPU 时间。
* CPU 平均过载了 235%;最近的 15 分钟平均有 2.35 个进程在等待 CPU 时间。
* The CPU was idle by 60% on average; no processes were waiting for CPU time (0.40) over the last 5 minutes.
**在双核系统中意味着:**
* The CPU was overloaded by 235% on average; 2.35 processes were waiting for CPU time (3.35) over the last 15 minutes.
* 有一个 CPU 处于完全空闲状态,另一个 CPU 被使用;最近的 1 分钟没有进程等待 CPU 时间。
* CPU 平均 160% 处于空闲状态;最近的 5 分钟没有进程等待 CPU 时间。
* CPU 平均过载了 135%;最近的 15 分钟有 1.35 个进程等待 CPU 时间。
###### On a dual-core system this would mean:
也许你还会喜欢:
* The one CPU was 100% idle on average, one CPU was being used; no processes were waiting for CPU time(1.00) over the last 1 minute.
1. [20 个监控系统性能的命令行工具(一)][1]
2. [13 个 Linux 性能监控工具(二)][2]
3. [Perf一个 Linux 上的性能监控分析工具][3]
4. [使用 Nmon 监控 Linux 的系统性能][4]
* The CPUs were idle by 160% on average; no processes were waiting for CPU time. (0.40) over the last 5 minutes.
* The CPUs were overloaded by 135% on average; 1.35 processes were waiting for CPU time. (3.35) over the last 15 minutes.
You might also like:
1. [20 Command Line Tools to Monitor Linux Performance Part 1][1]
2. [13 Linux Performance Monitoring Tools Part 2][2]
3. [Perf- A Performance Monitoring and Analysis Tool for Linux][3]
4. [Nmon: Analyze and Monitor Linux System Performance][4]
In conclusion, if you are a system administrator then high load averages are real to worry about. When they are high, above the number of CPU cores, it signifies high demand for the CPUs, and low load averages below the number of CPU cores tells us that CPUs are underutilized.
总而言之,如果你是系统管理员,你应该关注高的平均负载。平均负载高于 CPU 核心数意味着需要增加 CPU反之则意味着 CPU 未被充分利用。
--------------------------------------------------------------------------------
作者简介:
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.
Aaron Kili 是 Linux 和自由软件的热心者,热衷于分享知识,现在是 TecMint 网站的内容创作者,不久之后将成为 Linux 系统管理员web 开发者。
-----
via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performance/
作者:[Aaron Kili ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
作者:[Aaron Kili][a]
译者:[kylecao](https://github.com/kylecao)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@ -196,11 +183,11 @@ via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performa
[1]:https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/
[2]:https://www.tecmint.com/linux-performance-monitoring-tools/
[3]:https://www.tecmint.com/perf-performance-monitoring-and-analysis-tool-for-linux/
[4]:https://www.tecmint.com/nmon-analyze-and-monitor-linux-system-performance/
[4]:https://linux.cn/article-6886-1.html
[5]:https://www.tecmint.com/12-top-command-examples-in-linux/
[6]:https://www.tecmint.com/glances-an-advanced-real-time-system-monitoring-tool-for-linux/
[6]:https://linux.cn/article-6882-1.html
[7]:https://www.tecmint.com/13-basic-cat-command-examples-in-linux/
[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/
[8]:https://linux.cn/article-8553-1.html
[9]:https://www.tecmint.com/check-linux-cpu-information/
[10]:https://www.tecmint.com/12-practical-examples-of-linux-grep-command/
[11]:https://www.tecmint.com/author/aaronkili/

View File

@ -0,0 +1,125 @@
cron 与 anacron如何在 Linux 中计划任务
============================================================
在本篇中,我们会解释 cron 和 anacron并向你展示如何在 Linux 中设置 anacron。我们也会比较这两个工具。
要[在一个给定时间或者稍后安排一个任务][1],你可以使用 `at` 或者 `batch` 命令,要使命令能够重复运行,你可以使用 cron 以及 anacron 工具。
[cron][2] - 是一个用于运行计划任务如系统备份、更新等的守护进程。它适合在那些 24X7 不间断运行的机器如服务器上运行的计划任务。
命令/脚本被写在 cron 任务脚本中,它是在 `crontab` 文件中被安排的。系统默认的 `crontab` 文件是 `/etc/crontab`,但是每个用户也可以创建自己的 `crontab` 文件来在特定时间运行用户定义的命令。
要创建一份个人 `crontab` 文件,只要输入:
```
$ crontab -e
```
### 如何在 Linux 中设置 anacron
anacron 用于以天为单位的频率运行命令。它的工作与 cron 稍有不同,**它假设机器不会一直开机**。
cron 也适合在那些不会 24X7 运行如笔记本以及桌面电脑的机器上运行每日、每周以及每月的计划任务LCTT 译注:不适合按小时、分钟执行任务)。
假设你有一个计划任务(比如备份脚本)要使用 cron 在每天半夜运行,也许你以及睡着,那时你的桌面/笔记本电脑已经关机。你的备份脚本就不会被运行。
然而,如果你使用 anacron你可以确保在你下次开启桌面/笔记本电脑的时候,备份脚本会被执行。
### anacron 如何在 Linux 工作
anacron 任务被列在 `/etc/anacrontab`任务可以使用下面的格式anacron 文件中的注释必须以 `#` 号开始)安排。
```
period delay job-identifier command
```
从上面的格式中:
* `period` - 这是任务的频率,以天来指定,或者是 `@daily`、`@weekly`、`@monthly` 代表每天、每周、每月一次。你也可以使用数字:`1` - 每天、`7` - 每周、`30` - 每月,或者 `N` - 几天。
* `delay` - 这是在执行一个任务前等待的分钟数。
* `job-id` - 这是写在日志文件中任务的独特名字。
* `command` - 这是要执行的命令或 shell 脚本。
要浏览示例文件,输入:
```
$ ls -l /var/spool/anacron/
total 12
-rw------- 1 root root 9 Jun 1 10:25 cron.daily
-rw------- 1 root root 9 May 27 11:01 cron.monthly
-rw------- 1 root root 9 May 30 10:28 cron.weekly
```
这是实际发生的:
* anacron 会检查任务是否已经在 `period` 字段指定的时间被被执行了。如果没有,则在等待 `delay` 字段中指定的分钟数后,执行 `command` 字段中指定的命令。
* 一旦任务被执行了,它会使用 `job-id`(时间戳文件名)字段中指定的名称将日期记录在 `/var/spool/anacron` 目录中的时间戳文件中。
现在让我们看一个例子。这个会每天运行 `/home/aaronkilik/bin/backup.sh` 脚本:
```
@daily 10 example.daily /bin/bash /home/aaronkilik/bin/backup.sh
```
当机器在 `backup.sh` 期望被运行时是关机的anacron 会在机器开机十分钟之后运行它,而不用再等待 7 天。
这里有两个你应该理解的 anacrontab 文件的重要变量:
* `START_HOURS_RANGE` - 这个设置任务开始运行的时间范围(也就是任务只在这几个小时内运行)。
* `RANDOM_DELAY` - 这定义添加到用户定义的任务延迟的最大随机延迟(默认为 45
这是你的 anacrontab 文件可能看上去的样子。
Anacron `/etc/anacrontab`
```
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
@daily 10 example.daily /bin/bash /home/aaronkilik/bin/backup.sh
```
下面是 cron 以及 anacron 的比较,帮助你理解何时用他们其中一个。
| cron | anacron |
|------|---------|
| 它是守护进程 | 它不是守护进程 |
| 适合服务器 | 适合桌面/笔记本电脑 |
| 可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
| 关机时不会执行计划任务 | 如果计划任务到期,机器是关机的,那么它会在机器下次开机后执行计划任务 |
| 普通用户和 root 用户都可以使用 | 只有 root 用户可以使用(使用特定的配置启动普通任务) |
cron 和 anacron 主要的区别在于 cron 能在那些持续运行的机器上有效地运行,而 anacron 是针对那些会在一天内或者一周内会关机的机器。
如果你还知道其他方式,请在评论栏中与我们分享。
--------------------------------------------------------------------------------
作者简介:
Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者、Linux 系统管理员、网络开发人员,现在也是 TecMint 的内容创作者,他喜欢和电脑一起工作,坚信共享知识。
------
via: https://www.tecmint.com/cron-vs-anacron-schedule-jobs-using-anacron-on-linux/
作者:[Aaron Kili][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.tecmint.com/author/aaronkili/
[1]:https://www.tecmint.com/linux-cron-alternative-at-command-to-schedule-tasks/
[2]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/
[3]:https://www.tecmint.com/author/aaronkili/
[4]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
[5]:https://www.tecmint.com/free-linux-shell-scripting-books/

View File

@ -1,23 +1,21 @@
mimipenguin - 从当前 Linux 用户转储登录密码
mimipenguin从当前 Linux 用户转储登录密码
============================================================
现在下载你的免费电子书 - [10 本给管理员的免费 Linux 电子书][8] | [4 本免费的 shell 脚本电子书][9]
mimipenguin 是一个免费、开源、简单但是强大的 shell/python 脚本,用来从当前 Linux 桌面用户转储登录凭证(用户名和密码),并且已在不同的 Linux 发行版中测试过。
另外它还支持如VSFTPd活跃的 FTP 客户端连接、Apache2活跃/旧的 HTTP 基础认证会话但是这需要 Gcore还有 openssh-server使用[ sudo 命令][5]展示活跃 SSH 链接)。重要的是,它逐渐被移植到其他语言中去来支持所有可想到的以后可以利用的情况。
另外它还支持如VSFTPd活跃的 FTP 客户端连接、Apache2活跃/旧的 HTTP 基础认证会话但是这需要 Gcore还有 openssh-server活跃的 SSH 链接,需用 [sudo 命令][5])。重要的是,它逐渐被移植到其他语言中,以支持所有可想到的以后可以利用的情况。
### mimipenguin 是如何工作的?
要理解 mimipenguin 是如何工作的,你需要记住所有或者大多数的 Linux 发行版会在内存中存储大量的重要信息, 如: 凭据、加密密钥以及个人数据。
要理解 mimipenguin 是如何工作的,你需要知道所有或者大多数的 Linux 发行版会在内存中存储大量的重要信息, 如:凭据、加密密钥以及个人数据。
尤其是用户名和密码是由进程运行程序保存在内存中并以明文形式存储较长时间。mimipenguin 在技术上利用这些在内存中的明文凭证 - 它会转储一个进程,并提取可能包含明文凭据的行。
尤其是用户名和密码是由进程(运行中的程序保存在内存中并以明文形式存储较长时间。mimipenguin 在技术上利用这些在内存中的明文凭证 - 它会转储一个进程,并提取可能包含明文凭据的行。
然后,通过以下内容的哈希值来尝试计算每个单词的出现几率:/etc/shadow、内存和 regex 搜索。一旦找到任何内容,它就会在标准输出上打印出来。
然后,通过以下内容的哈希值来尝试计算每个单词的出现几率:`/etc/shadow`、内存和 regex 搜索。一旦找到任何内容,它就会在标准输出上打印出来。
### 在 Linux 中安装 mimipenguin
我们将使用 git 来 clone mimipenguin 仓库,因此如果你还没安装,那么首先在系统上安装 git。
我们将使用 git 来克隆 mimipenguin 仓库,因此如果你还没安装,那么首先在系统上安装 git。
```
$ sudo apt install git #Debian/Ubuntu systems
@ -25,7 +23,7 @@ $ sudo yum install git #RHEL/CentOS systems
$ sudo dnf install git #Fedora 22+
```
接着像这样在你的家目录(或者其他任何地方)clone mimipenguin 目录:
接着像这样在你的家目录(或者其他任何地方)克隆 mimipenguin 目录:
```
$ git clone https://github.com/huntergregal/mimipenguin.git
@ -47,11 +45,11 @@ Even mimikatz requires administrator
![Dump Login Passwords in Linux](https://www.tecmint.com/wp-content/uploads/2017/06/Dump-Login-Passwords-in-Linux.png)
在 Linux 中转储登录密码
*在 Linux 中转储登录密码*
从上面的输出中mimipenguin 向你提供了桌面环境的用户名和密码。
另外,还可以如下运行 python 脚本:
另外,还可以如下运行 python 脚本:
```
$ sudo ./mimipenguin.py
@ -64,11 +62,8 @@ $ sudo ./mimipenguin.py
下面是将会被添加到 mimipenguin 的功能:
* 提升总体效率
* 添加更多支持以及其他的凭据位置
* 包括支持非桌面环境
* 添加 LDAP 的支持
mimipenguin 的 Github 仓库:[https://github.com/huntergregal/mimipenguin][6]
@ -76,12 +71,9 @@ mimipenguin 的 Github 仓库:[https://github.com/huntergregal/mimipenguin][6]
同样,请查阅:
1. [如何在 Linux 中用密码保护一个 vim 文件][1]
2. [如何在 Linux 中生成/加密/解密随机密码][2]
3. [如何在 RHEL/CentOS/Fedora 中用密码保护 GRUB][3]
4 [在 CentOS 7 中重置/恢复忘记的 root 用户账号密码][4]
4. [在 CentOS 7 中重置/恢复忘记的 root 用户账号密码][4]
在下面的评论栏中分享你关于这个工具的额外想法或者对 Linux 中内存中明文凭据的问题。
@ -95,17 +87,17 @@ Aaron Kili 是 Linux 和 F.O.S.S 爱好者,即将成为 Linux SysAdmin 和网
via: https://www.tecmint.com/mimipenguin-hack-login-passwords-of-linux-users/
作者:[Aaron Kili ][a]
作者:[Aaron Kili][a]
译者:[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/) 荣誉推出
[a]:https://www.tecmint.com/author/aaronkili/
[1]:https://www.tecmint.com/password-protect-vim-file-in-linux/
[1]:https://linux.cn/article-8547-1.html
[2]:https://www.tecmint.com/generate-encrypt-decrypt-random-passwords-in-linux/
[3]:https://www.tecmint.com/password-protect-grub-in-linux/
[4]:https://www.tecmint.com/reset-forgotten-root-password-in-centos-7-rhel-7/
[4]:https://linux.cn/article-8212-1.html
[5]:https://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/
[6]:https://github.com/huntergregal/mimipenguin
[7]:https://www.tecmint.com/author/aaronkili/

View File

@ -0,0 +1,254 @@
ps_mem一个用于精确报告 Linux 核心内存用量的简单 Python 脚本
============================================================
[ps_mem][2] 是一个可以帮助我们精确获取 Linux 中各个程序核心内存使用情况的简单 python 脚本。虽然在 Linux 上有很多可用于查看内存使用情况的工具,比如 `free`、`vmstat`、`smem`、`top` 等,但这个工具和其它的区别在于其精确显示核心内存使用情况。
它会分别计算一个程序私有内存总量和共享内存总量,并以更准确的方式给出了总的内存使用量。很明显的,它将帮助大家知道系统中哪个程序正在占用更多的内存。
你可以通过包管理器、`pip` 、或直接运行 `ps_mem.py` 脚本等多种方式来安装 `ps_mem` 工具。需要注意的是:需要有 root 权限。
另外,推荐阅读以下内存工具:
- [free 一个在 Linux 上查看内存用量统计(可用和已用)的标准工具][3]
- [smem Linux 内存报告/统计工具][4]
- [vmstat 一个好用的用于虚拟内存统计的标准工具][5]
### 通过包管理器安装 ps_mem
基于 RHEL 的系统默认仓库就包含 ps_mem 工具,所以我们可以简单地通过包管理器进行安装。
对于 RHEL/CentOS ,使用 [yum 包管理器][6] 安装 `ps_mem` 包:
```
$ sudo yum install ps_mem
```
对于Fedora ,使用 [dnf 包管理器][7] 安装 ps_mem 包:
```
$ sudo dnf install ps_mem
```
对于 Arch Linux ,使用 [pacman 包管理器][8] 安装 ps_mem 包:
```
$ sudo pacman -S ps_mem
```
#### 通过 pip 安装 ps_mem
`pip` 是在 Linux 上推荐使用的一种安装 Python 包的工具。可以使用 `pip` 命令而不是包管理器去获取最新的版本。使用 `pip` 包前,请确保你的系统上已安装过 `pip` 包。否则,先使用发行版本的包管理器安装 `python-pip` 包。
对于基于 Debian 的系统:
```
$ sudo apt-get install python-pip
```
对于基于 RHEL/CentOS 的系统:
```
$ sudo yum install python-pip
```
对于 Fedora
```
$ sudo dnf install python-pip
```
对于 openSUSE
```
$ sudo zypper install python-pip
```
对于基于 Arch Linux 的系统:
```
$ sudo pacman -S python-pip
```
最后,在 Linux 上运行 `pip` 工具安装 `ps_mem`
```
$ sudo pip install ps_mem
```
### 直接运行 ps_mem.py 脚本
我们也可以从开发者 github 页面下载文件,并直接运行 `ps_mem.py` 脚本。
```
$ git clone https://github.com/pixelb/ps_mem.git && cd ps_mem
$ sudo python ps_mem.py
```
### ps_mem 使用方法
不带任何参数直接运行 `ps_mem` 以精确获取每个程序的的核心内存使用情况。
```
$ sudo ps_mem
Private + Shared = RAM used Program
1.6 MiB + 438.5 KiB = 2.1 MiB packagekitd
1.7 MiB + 498.0 KiB = 2.1 MiB indicator-application-service
912.0 KiB + 1.3 MiB = 2.2 MiB window-stack-bridge
2.0 MiB + 350.5 KiB = 2.3 MiB gnome-keyring-daemon
1.8 MiB + 575.0 KiB = 2.3 MiB whoopsie
2.4 MiB + 304.5 KiB = 2.7 MiB systemd-journald
2.7 MiB + 157.5 KiB = 2.8 MiB ibus-engine-simple
2.7 MiB + 182.0 KiB = 2.9 MiB ibus-dconf
2.7 MiB + 332.5 KiB = 3.0 MiB NetworkManager
3.1 MiB + 169.5 KiB = 3.2 MiB polkitd
1.9 MiB + 1.7 MiB = 3.6 MiB systemd (2)
3.4 MiB + 172.5 KiB = 3.6 MiB deja-dup-monitor
2.9 MiB + 685.0 KiB = 3.6 MiB zeitgeist-datahub
2.9 MiB + 848.0 KiB = 3.7 MiB python2.7
3.5 MiB + 442.0 KiB = 4.0 MiB dbus-daemon (3)
3.2 MiB + 951.0 KiB = 4.1 MiB evolution-addressbook-factory
3.9 MiB + 435.0 KiB = 4.3 MiB lightdm (2)
3.7 MiB + 826.5 KiB = 4.5 MiB polkit-gnome-authentication-agent-1
3.7 MiB + 853.0 KiB = 4.6 MiB unity-fallback-mount-helper
3.7 MiB + 884.0 KiB = 4.6 MiB ibus-x11
4.1 MiB + 590.5 KiB = 4.6 MiB indicator-sound-service
4.5 MiB + 167.0 KiB = 4.7 MiB udisksd
4.3 MiB + 571.0 KiB = 4.9 MiB gnome-session-binary
4.5 MiB + 519.0 KiB = 5.0 MiB zeitgeist-fts
4.2 MiB + 900.5 KiB = 5.1 MiB indicator-printers-service
4.1 MiB + 1.0 MiB = 5.1 MiB bash (2)
3.9 MiB + 1.2 MiB = 5.2 MiB update-notifier
4.8 MiB + 426.0 KiB = 5.2 MiB pulseaudio
4.5 MiB + 1.5 MiB = 6.0 MiB url-dispatcher
4.3 MiB + 1.7 MiB = 6.0 MiB python3.5
5.2 MiB + 856.5 KiB = 6.1 MiB evolution-addressbook-factory-subprocess
5.6 MiB + 494.5 KiB = 6.1 MiB colord
5.0 MiB + 1.2 MiB = 6.2 MiB bamfdaemon
5.7 MiB + 1.1 MiB = 6.8 MiB evolution-source-registry
5.6 MiB + 1.3 MiB = 6.9 MiB indicator-keyboard-service
5.5 MiB + 1.5 MiB = 7.1 MiB ibus-ui-gtk3
5.4 MiB + 1.8 MiB = 7.2 MiB notify-osd
6.3 MiB + 1.1 MiB = 7.4 MiB nm-applet
6.4 MiB + 1.4 MiB = 7.8 MiB evolution-calendar-factory
6.3 MiB + 1.5 MiB = 7.8 MiB hud-service
6.5 MiB + 1.5 MiB = 8.0 MiB unity-panel-service
8.2 MiB + 1.8 MiB = 10.0 MiB unity-settings-daemon
11.1 MiB + 126.5 KiB = 11.2 MiB snapd
8.2 MiB + 3.0 MiB = 11.2 MiB indicator-datetime-service
10.3 MiB + 1.7 MiB = 12.0 MiB evolution-calendar-factory-subprocess (2)
12.5 MiB + 2.8 MiB = 15.3 MiB redshift-gtk
14.5 MiB + 1.8 MiB = 16.3 MiB fluxgui
13.5 MiB + 2.9 MiB = 16.4 MiB gnome-terminal-server
12.7 MiB + 7.6 MiB = 20.4 MiB apache2 (6)
20.8 MiB + 503.0 KiB = 21.3 MiB fwupd
22.8 MiB + 70.0 KiB = 22.9 MiB collectl
22.2 MiB + 10.8 MiB = 33.0 MiB nautilus
70.9 MiB + 1.5 MiB = 72.4 MiB gnome-software
97.9 MiB + 24.8 MiB = 122.8 MiB Xorg
131.9 MiB + 168.0 KiB = 132.1 MiB mysqld
222.1 MiB + 9.4 MiB = 231.5 MiB compiz
286.2 MiB + 11.8 MiB = 298.0 MiB firefox
---------------------------------
1.3 GiB
=================================
```
输出中打印出全路径:
```
$ sudo ps_mem -s
Private + Shared = RAM used Program
3.2 MiB + 951.0 KiB = 4.1 MiB /usr/lib/evolution/evolution-addressbook-factory
3.7 MiB + 826.5 KiB = 4.5 MiB /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
3.7 MiB + 853.0 KiB = 4.6 MiB /usr/lib/unity-settings-daemon/unity-fallback-mount-helper
3.7 MiB + 884.0 KiB = 4.6 MiB /usr/lib/ibus/ibus-x11 --kill-daemon
4.1 MiB + 590.5 KiB = 4.6 MiB /usr/lib/x86_64-linux-gnu/indicator-sound/indicator-sound-service
4.5 MiB + 167.0 KiB = 4.7 MiB /usr/lib/udisks2/udisksd --no-debug
4.3 MiB + 571.0 KiB = 4.9 MiB /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
4.5 MiB + 519.0 KiB = 5.0 MiB /usr/lib/x86_64-linux-gnu/zeitgeist-fts
4.2 MiB + 900.5 KiB = 5.1 MiB /usr/lib/x86_64-linux-gnu/indicator-printers/indicator-printers-service
4.1 MiB + 1.0 MiB = 5.1 MiB bash (2)
3.9 MiB + 1.2 MiB = 5.2 MiB update-notifier
4.8 MiB + 426.0 KiB = 5.2 MiB /usr/bin/pulseaudio --start --log-target=syslog
5.0 MiB + 863.0 KiB = 5.9 MiB /usr/lib/evolution/evolution-calendar-factory-subprocess --factory local --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.Calendarx2573x3 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/Calendar/2573/3
4.5 MiB + 1.5 MiB = 6.0 MiB /usr/lib/x86_64-linux-gnu/url-dispatcher/url-dispatcher
4.3 MiB + 1.7 MiB = 6.0 MiB python3 -v
5.2 MiB + 856.5 KiB = 6.1 MiB /usr/lib/evolution/evolution-addressbook-factory-subprocess --factory local --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.AddressBookx2637x2 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/AddressBook/2637/2
5.6 MiB + 494.5 KiB = 6.1 MiB /usr/lib/colord/colord
5.2 MiB + 913.0 KiB = 6.1 MiB /usr/lib/evolution/evolution-calendar-factory-subprocess --factory contacts --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.Calendarx2573x2 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/Calendar/2573/2
5.0 MiB + 1.2 MiB = 6.2 MiB /usr/lib/x86_64-linux-gnu/bamf/bamfdaemon
5.7 MiB + 1.1 MiB = 6.8 MiB /usr/lib/evolution/evolution-source-registry
5.6 MiB + 1.3 MiB = 6.9 MiB /usr/lib/x86_64-linux-gnu/indicator-keyboard/indicator-keyboard-service --use-gtk
5.5 MiB + 1.5 MiB = 7.1 MiB /usr/lib/ibus/ibus-ui-gtk3
5.4 MiB + 1.8 MiB = 7.2 MiB /usr/lib/x86_64-linux-gnu/notify-osd
6.3 MiB + 1.1 MiB = 7.4 MiB nm-applet
6.4 MiB + 1.4 MiB = 7.8 MiB /usr/lib/evolution/evolution-calendar-factory
6.3 MiB + 1.5 MiB = 7.8 MiB /usr/lib/x86_64-linux-gnu/hud/hud-service
6.5 MiB + 1.5 MiB = 8.0 MiB /usr/lib/x86_64-linux-gnu/unity/unity-panel-service
8.2 MiB + 1.8 MiB = 10.0 MiB /usr/lib/unity-settings-daemon/unity-settings-daemon
11.1 MiB + 126.5 KiB = 11.2 MiB /usr/lib/snapd/snapd
8.2 MiB + 3.0 MiB = 11.2 MiB /usr/lib/x86_64-linux-gnu/indicator-datetime/indicator-datetime-service
12.5 MiB + 2.8 MiB = 15.3 MiB /usr/bin/python3 /usr/bin/redshift-gtk
14.5 MiB + 1.8 MiB = 16.3 MiB /usr/bin/python /usr/bin/fluxgui
13.6 MiB + 2.9 MiB = 16.4 MiB /usr/lib/gnome-terminal/gnome-terminal-server
12.7 MiB + 7.6 MiB = 20.4 MiB /usr/sbin/apache2 -k start (6)
20.8 MiB + 503.0 KiB = 21.3 MiB /usr/lib/x86_64-linux-gnu/fwupd/fwupd
22.8 MiB + 70.0 KiB = 22.9 MiB /usr/bin/perl -w /usr/bin/collectl -D
22.2 MiB + 10.8 MiB = 33.0 MiB nautilus -n
70.9 MiB + 1.5 MiB = 72.4 MiB /usr/bin/gnome-software --gapplication-service
97.9 MiB + 24.8 MiB = 122.8 MiB /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
131.9 MiB + 168.0 KiB = 132.1 MiB /usr/sbin/mysqld
222.1 MiB + 9.4 MiB = 231.5 MiB /usr/bin/compiz
286.2 MiB + 11.8 MiB = 298.1 MiB /usr/lib/firefox/firefox
---------------------------------
1.3 GiB
=================================
```
只显示特定的 PID 列表的内存使用情况:
```
$ sudo ps_mem -p 2886,4386
Private + Shared = RAM used Program
13.5 MiB + 2.9 MiB = 16.4 MiB gnome-terminal-server
286.2 MiB + 11.8 MiB = 298.0 MiB firefox
---------------------------------
314.4 MiB
=================================
```
每 N 秒打印进程内存。以下命令每 2 秒报告一次内存使用情况:
```
$ sudo ps_mem w 2
```
只显示内存总量:
```
$ sudo ps_mem -t
1329884160
```
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/ps_mem-report-core-memory-usage-accurately-in-linux/
作者:[2DAYGEEK][a]
译者:[xllc](https://github.com/xllc)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/author/2daygeek/
[2]:https://github.com/pixelb/ps_mem
[3]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
[4]:http://www.2daygeek.com/smem-linux-memory-usage-statistics-reporting-tool/
[5]:http://www.2daygeek.com/linux-vmstat-command-examples-tool-report-virtual-memory-statistics/
[6]:http://www.2daygeek.com/yum-command-examples/
[7]:http://www.2daygeek.com/dnf-command-examples/
[8]:http://www.2daygeek.com/pacman-command-examples/

View File

@ -0,0 +1,144 @@
PowerlineVim 和 Bash 中的一个强大状态栏插件
============================================================
[Powerline][2] 是 vim、zsh、bash、tmux、IPython、Awesome、bar、fish、lemonbar、pdb、rc、shell、tcsh、wm、i3 和 Qtil 中的一个状态栏插件。它给程序提供了状态栏,并使程序更好看。它用 Python 写成。
它是可扩展的并且功能丰富,它用 Python 写成,非常轻便不需要任何第三方的依赖,只需要一个 Python 解释器。
它的稳定以及可测试的代码库经过完整的测试,并且在 Python 2.6+ 和 Python 3 中工作良好。
最初该状态栏只在 vim 中可用,随后项目进化为许多 Linux 程序如 zsh、bash、tmux、IPython、Awesome、i3 和 Qtil 提供状态栏。
其配置以及配色方案用 JSON 写成。它是一种标准简易的文件格式,可以让用户配置 Powerline 支持的程序。
快速并且轻量级,支持守护进程可以提供更好的性能。
### 安装预先要求
确保你的系统有下面预先要求的包。如果没有,在安装 powerline 之前先安装它们。
对于 Debian 用户,使用 [APT 包管理器][3]或者[Apt-Get 包管理器][4]安装需要的包。
```
$ sudo apt-get install python-pip git
```
对于 openSUSE 用户,使用 [Zypper 包管理器][5]安装需要的包。
```
$ sudo zypper install python-pip git
```
对于 Fedora 用户,使用 [dnf 包管理器][6]安装需要的包。
```
$ sudo dnf install python-pip git
```
对于 Arch Linux 用户,使用 [pacman 包管理器][7]安装需要的包。
```
$ sudo pacman -S python-pip git
```
对于 CentOS/RHEL 用户,使用 [yum 包管理器][8]安装需要的包。
```
$ sudo yum install python-pip git
```
### 如何在 Linux 中安装 Powerline
在本篇中,我们将向你展示如何安装 Powerline。以及如何在基于 Debian 以及 RHEL 的系统中在 Bash、tumx 和 Vim 中使用。
```
$ sudo pip install git+git://github.com/Lokaltog/powerline
```
找出 powerline 安装位置以便配置程序。
```
$ pip show powerline-status
Name: powerline-status
Version: 2.6.dev9999+git.517f38c566456d65a2170f9bc310e6b4f8112282
Summary: The ultimate statusline/prompt utility.
Home-page: https://github.com/powerline/powerline
Author: Kim Silkebaekken
Author-email: kim.silkebaekken+vim@gmail.com
License: MIT
Location: /usr/lib/python2.7/site-packages
Requires:
```
### 在 Bash Shell 中添加/启用 Powerline
添加下面的行到 `.bashrc` 中,它会默认在基础 shell 中启用 powerline。
```
if [ -f `which powerline-daemon` ]; then
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/local/lib/python2.7/site-packages/powerline/bindings/bash/powerline.sh
fi
```
重新加载 `.bashrc` 文件使得 powerline 在当前窗口中立即生效。
```
$ source ~/.bashrc
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-1.png)][9]
### 在 tmux 中添加/启用 Powerline
tmux 是最好的终端仿真程序之一,它提供多窗口以及状态栏,但是相比 powerline 的状态栏看上去不那么好。添加下面的的行到 `.tmux.conf` 中,它会默认在 tmux 中启用 powerline。如果你没有找到 `.tmux.conf` 文件,那么创建一个新的。
```
# vi ~/.tmuc.conf
source "/usr/local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf"
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-2.png)][10]
### 在 Vim 中添加/启用 Powerline
vim 是管理员最爱的文本编辑器之一。添加下面的行到 `.vmrc` 中,启用 powerline 使 vim 更加强大。注意,在 vim 7.x 中,你可能不会在系统中发现 .vimrc 文件,因此不必担心,创建一个新的文件,并添加下面行。
```
# vi ~/.vmrc
set rtp+=/usr/local/lib/python2.7/site-packages/powerline/bindings/vim/
set laststatus=2
set t_Co=256
```
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-3.png)][11]
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-4.png)][12]
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/powerline-adds-powerful-statusline-to-vim-bash-tumx-in-ubuntu-fedora-debian-arch-linux-mint/
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/author/2daygeek/
[2]:https://github.com/powerline/powerline
[3]:http://www.2daygeek.com/apt-command-examples/
[4]:http://www.2daygeek.com/apt-get-apt-cache-command-examples/
[5]:http://www.2daygeek.com/zypper-command-examples/
[6]:http://www.2daygeek.com/dnf-command-examples/
[7]:http://www.2daygeek.com/pacman-command-examples/
[8]:http://www.2daygeek.com/yum-command-examples/
[9]:http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-1.png
[10]:http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-2.png
[11]:http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-3.png
[12]:http://www.2daygeek.com/wp-content/uploads/2017/06/install-powerline-in-linux-4.png

View File

@ -0,0 +1,148 @@
在 Linux 中使用 shell 脚本自动创建/移除并挂载交换文件
======
几天前我们写了一篇关于在 Linux 中 3 种创建交换文件的方法,它们是常见的方法,但是需要人工操作。
今天我发现了一个 [Gary Stafford][3] 写的 shell 小脚本(两个 shell 脚本,一个用于创建交换文件,另外一个用于移除交换文件),它可以帮助我们在 Linux 中创建/移除并且自动挂载交换文件。
默认这个脚本创建并挂载 512MB 的交换文件。如果你想要更多的交换空间和不同的文件名,你需要相应地修改脚本。修改脚本不是一件困难的事,因为这是一个容易上手而且很小的脚本。
**推荐阅读:** [Linux 中 3 种简易创建或扩展交换空间的方法][4]
### 如何检查当前交换文件大小
使用 [free][1] 和 `swapon` 命令检查已经存在交换空间。
```
$ free -h
total used free shared buff/cache available
Mem: 2.0G 1.3G 139M 45M 483M 426M
Swap: 2.0G 655M 1.4G
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 655.2M -1
```
上面的输出显示我当前的交换空间是 `2GB`
### 创建交换文件
创建 `create_swap.sh` 文件并添加下面的内容来自动化交换空间的创建和挂载。
```
$ nano create_swap.sh
#!/bin/sh
# size of swapfile in megabytes
swapsize=1024
# does the swap file already exist?
grep -q "swapfile" /etc/fstab
# if not then create it
if [ $? -ne 0 ]; then
echo 'swapfile not found. Adding swapfile.'
fallocate -l ${swapsize}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
echo 'swapfile found. No changes made.'
fi
echo '--------------------------------------------'
echo 'Check whether the swap space created or not?'
echo '--------------------------------------------'
swapon --show
```
给文件添加执行权限。
```
$ sudo +x create_swap.sh
```
运行文件来创建和挂载交换文件。
```
$ sudo ./create_swap.sh
swapfile not found. Adding swapfile.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=d9004261-396a-4321-a45f-9923e3e1328c
--------------------------------------------
Check whether the swap space created or not?
--------------------------------------------
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 954.1M -1
/swapfile file 1024M 0B -2
```
你可以看到新的 1024M 的 `swapfile`。重启系统以使用新的交换文件。
### 移除交换文件
如果不再需要交换文件,接着创建 `remove_swap.sh` 文件并添加下面的内容来移除交换文件以及它的 `/etc/fstab` 挂载点。
```
$ nano remove_swap.sh
#!/bin/sh
# does the swap file exist?
grep -q "swapfile" /etc/fstab
# if it does then remove it
if [ $? -eq 0 ]; then
echo 'swapfile found. Removing swapfile.'
sed -i '/swapfile/d' /etc/fstab
echo "3" > /proc/sys/vm/drop_caches
swapoff -a
rm -f /swapfile
else
echo 'No swapfile found. No changes made.'
fi
echo '--------------------------------------------'
echo 'Check whether the swap space removed or not?'
echo '--------------------------------------------'
swapon --show
```
并给文件添加可执行权限。
```
$ sudo +x remove_swap.sh
```
运行脚本来移除并卸载交换文件。
```
$ sudo ./remove_swap.sh
swapfile found. Removing swapfile.
swapoff: /dev/sda5: swapoff failed: Cannot allocate memory
--------------------------------------------
Check whether the swap space removed or not?
--------------------------------------------
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 951.8M -1
```
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/shell-script-create-add-extend-swap-space-linux/
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
[2]:http://www.2daygeek.com/author/2daygeek/
[3]:https://programmaticponderings.com/2013/12/19/scripting-linux-swap-space/
[4]:http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/

View File

@ -0,0 +1,76 @@
使用 Ubuntu Cleaner 为 Ubuntu/LinuxMint 释放空间
============================================================
我们中的大部分人都会经常忘记清理 Linux 系统中的垃圾文件,这会导致我们的系统空间不足。
一般情况下我们不得不按标准的程序来释放 Linux 发行版中的空间(删除发行版缓存、系统日志、应用程序缓存和垃圾邮件),但如果我们每次以手动方式执行相同的过程,那么会花费大量的时间和困难。
在 Linux 的应用程序中,可以使这个任务更容易。今天我们将教你如何使用 Ubuntu Cleaner它衍生自 Ubuntu Tweak 中的 Janitor 模块。
[Ubuntu Cleaner][2]  是一个可以简化你清理 Ubuntu 系统的工具。如我们所知道Ubuntu Tweak 是帮助我们调整 Ubuntu 及其衍生发行版的最佳实用程序之一。但由于它的主要开发人员没有时间维护它,因此已被弃用。
建议阅读:
- [Stacer - Linux 系统优化和监控工具][3]
- [BleachBit - 在 Linux 中清理系统的快速而最佳方法][4]
因为许多用户在最新版本中仍使用 Ubuntu Tweak 这个工具(因为他们不想离开这个工具),所以 Ubuntu Cleaner 的开发人员从 Ubuntu Tweak 工具中复刻了 janitor 模块,并将这个有用的功能带回 Ubuntu 社区,并命名为 Ubuntu Cleaner。它也成为了 Ubuntu 多年来最受欢迎的实用程序之一。
建议阅读:
- [uCareSystem - 用于 Ubuntu / LinuxMint 的一体化系统更新和维护工具][5]
我猜所有那些怀念 Ubuntu Tweak 的人都会因为有 Ubuntu Cleaner 而感到高兴,因为它是从 janitor 模块衍生出来的。
Ubuntu Cleaner 将删除 Ubuntu 及其衍生发行版中的以下垃圾文件:
* 应用缓存 (浏览器缓存)
* 缩略图缓存
* Apt 缓存
* 旧的内核
* 包的配置文件
* 不需要的包
### 如何安装 Ubuntu Cleaner
因为开发者提供官方 PPA ,我们可以通过 PPA 轻松地将 Ubuntu Cleaner 安装到 Ubuntu 及其衍生发行版。 Ubuntu Cleaner 目前支持 Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS。
```
$ sudo add-apt-repository ppa:gerardpuig/ppa
$ sudo apt update
$ sudo apt install ubuntu-cleaner
```
### 如何使用 Ubuntu Cleaner
从主菜单启动 Ubuntu Cleaner 你可以看到得以下默认界面。
![](http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_001.png)
勾选你要清理的文件前面的 “复选框”。 最后点击 “清理” 按钮从系统中删除垃圾文件。
![](http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_002.png)
现在我们已经成功清除了系统中的垃圾。
![](http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_003.png)
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/ubuntu-cleaner-system-cleaner-ubuntu-tweak-alternative-janitor/
作者:[2DAYGEEK][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/author/2daygeek/
[2]:http://ubuntu-cleaner.blogspot.in/
[3]:http://www.2daygeek.com/stacer-linux-system-optimizer-and-monitoring-tool/
[4]:http://www.2daygeek.com/bleachbit-system-cleaner-on-ubuntu-debian-fedora-opensuse-arch-linux-mint/
[5]:http://www.2daygeek.com/ucaresystem-system-update-and-maintenance-tool-for-ubuntu-linuxmint/
[6]:http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_001.png
[7]:http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_002.png
[8]:http://www.2daygeek.com/wp-content/uploads/2017/06/Ubuntu-Cleaner_003.png

View File

@ -0,0 +1,63 @@
Linus Torvalds 说 Linux 仍然惊讶和激励着他
============================================================
![Linus Torvalds](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/linus-torvalds-lc3.jpg?itok=lzZupevU "Linus Torvalds")
> Linus Torvalds 和 VMware 开源负责人 Dirk Hohndel 上周在中国 LinuxCon 上进行了一次“炉边聊天”。
周一Linus Torvalds 首次来到中国参加[在北京召开的 LinuxCon + ContainerCon + CloudOpen][3]。在近 2000 名观众面前Linus Torvalds 和 VMware 开源负责人 Dirk Hohndel 进行了进行了一次“炉边聊天”,谈及是什么在惊讶和激励着他,以及有志的开源开发者们该如何上手。下面是他们谈话中的一些亮点。
### Linux 开发中有什么令人惊讶的事情?
> “我觉得有趣的是我认为已经稳定的代码仍然在不断的得到改进,有些东西我们已经很多年没有碰了,然后有人来改进了它们,或者在我以为根本就不会有人用的东西上提交了 Bug 报告。我们有了新的硬件,开发了新的功能,但是 25 年后,我们仍然有老的、非常基础的东西,并且人们依然在关心和改善着它们。”
### 什么在激励着他
> “我真的很喜欢我正在做的事情。我喜欢醒来时有一个在技术上有趣而富有挑战性并且不太紧张的工作,因此我可以长时间的为此工作;或者做一些我感觉我正在做一个真正有影响的事情,做一些不仅仅是对我来说有意义的事情。
> “我偶尔在工作中休息一下,例如我在 Git 上工作两到三周的时候就开始休息了。但是每次休息的时间比较长我都会感到无聊厌倦。当我出去潜水一周,就想着要回来,我从没有感觉我需要一个更长的假期。”
LCTT 译注:此处“在 Git 上工作” 是指 Linus 在 Git 版本仓库里面开发 Linux 内核,而非开发 Git 软件——事实上Linus 在早期开发完 Git 的原型之后,主要的 Git 开发已经有别人接手了,虽然他被称之为 Git 之父。而“潜水”是真的指潜水运动Linus 喜好玩潜水运动。)
### Linux 的未来领导力
> “我们的工作进程不会只是 25 年,我们仍然有非常强大的维护团队。我们常常抱怨我们没有足够的维护者 - 这是真的,我们只有数十名顶级维护者做日常合并的工作,这对于一个开源项目来说是一个非常强大的团队。而且随着这些顶级维护者慢慢变老变胖,我们不断有新人进来。一个新人成长为一个顶级维护者需要几年的时间,因此我不觉得我们应该为 Linux 的下一个 20 年担心。”
### Linux 会被替代吗?
> “或许会有一些新的项目将来会并且表明他们比我们做的更好,但是我不担心这个。有很多非常成功的 Linux 的分支fork人们不会把它们看作是分支是因为他们很和谐。如果有人想要改变一切并且让内核变得更好我的感觉是干吧证明你自己。我可能觉得那是一个坏主意但是你可以证明我是错的。”
LCTT 译注:此处所说的分支,应该是指类似 Android、AGL 等 Linux 分支并没有分裂 Linux 生态,而是彼此补充。)
### 对 Git 的想法
> “我对 Git 的广泛传播感到非常的惊讶。显然我非常高兴,它验证了我对分布式开发的看法。然而那时,已经有如此之多的源码版本控制工具,很难再去推出一个新的版本控制系统。我预计它主要限于内核开发 - 因为它是针对我们所做的。”
> “在刚开始的三到四年里,关于 Git 的抱怨是它如此的与众不同,难以使用。大约五年前,事情发生了改变。有足够多的项目和开发者开始使用 Git ,它变得不再与众不同;人们习惯于使用 Git 。他们开始利用这种开发模式,使用 Git 的安全感,意味着任何东西都不会损坏或者丢失。”
> “在某些方面Git 比 Linux 更为人所知。Linux 常常被隐藏起来,例如安卓手机就运行在 Linux 之上,但是你并不知道。但是使用 Git 时,你确切地知道你在使用 Git 。”
### 分支 Linux
> “当我坐下来开始写 Git ,一个首要的原则就是你应该能 fork 并且在此基础上做你自己的事情。如果你有友好的 fork能证明我错了并且能够改进内核在这种情况下人们可以回来说我们实际上改进了内核这没有什么不好的感觉。我会采纳你的改进并且将其合并进来。这就是为什么你应该鼓励 fork 。你也想让良好的回馈变得很简单。”
### 开源开发者应该如何开始
> “于我而言,我总是自我激励,知道自己想要做什么,我从来没有被告知要去做什么。我不确定我的例子是否适合人们效仿。如果你是一个新手程序员,你可以从成千上万的开源项目中找到你所感兴趣的,你可以长期关注这个项目,去了解它的代码,以至于你可以在某个部分的代码上可以成为专家,不需要是整个项目。没有人是整个内核的专家,但是你可以很好地了解其中的一个领域。”
> “如果你能成为社区的一份子,能提交补丁,那将不仅仅是编程,而是有开源社会方面的意义。你作为一个程序员提升了你自己并且和外界联系了起来。你基本上可以向外展示 - 我做了这些改进,我有能力在我的社区或者工作上走得更远。你不得不花费一定的时间来学习一个项目,但是你将有一个巨大的上升空间 - 不仅仅是从职业方面,而且在你的生活中有一个惊人的项目。”
--------------------------------------------------------------------------------
via: https://www.linux.com/blog/event/lc3-china/20176/6/linus-torvalds-explains-how-linux-still-surprises-and-motivates-him
作者:[Linux 基金会][a]
译者:[rieonke](https://github.com/rieonke)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.com/users/lfadmin
[1]:https://www.linux.com/licenses/category/linux-foundation
[2]:https://www.linux.com/files/images/linus-torvalds-lc3jpg
[3]:https://www.lfasiallc.com/linuxcon-containercon-cloudopen-china

View File

@ -0,0 +1,141 @@
如何以 LaTex 创建文档
============================================================
> 学习以 LaTex 文本标记语言排版文档
![A introduction to creating documents in LaTeX](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_kid_education.png?itok=jpetC9wJ "A introduction to creating documents in LaTeX")

LaTeX读作 `lay-tech` )是使用纯文本创建文档的方法,使用与 HTML/CSS 或 Markdown 类似的标记标签进行风格化。 LaTeX 最常用于为学术界(如学术期刊)创建文档。 在 LaTeX 中,作者不必直接对文档进行风格化,就像在 Microsoft WordLibreOffice Writer 或 Apple Pages 等文字处理程序中一样; 而是用纯文本编写代码,这些代码必须经过编译才能生成 PDF 文档。
![computer screen with LaTeX markup language](https://opensource.com/sites/default/files/u128651/intro.png "computer screen with LaTeX markup language")
### 起步
要想使用 LaTex 来书写文档,首先你必须要安装一个 LaTex 编辑器。我用的是一款自由开源软件FOSS其在学术界也是大受欢迎,叫做 [TexStudio][8],它可以运行在 Windows、Unix/Linux、BSD 和 Mac OS X 上。同时你还需要安装一个 **Tex** 排版系统的分发版。因为我都是在 MacOS 上书写文档,所以我使用的分发版是 [MacTex 或 BasicTex][9]。对于 Windows 用户你可以使用 [MiKTex][10]而且 Linux 用户也可以在软件库中找到它。
当你完成了 TexStudio 和某个 LaTex 的分发版的下载,你就可以开始对你的文档进行排版了。
### 创建你的第一个文档
在这个简短的教程里,我们会创建一个简单的文章,包括一个大标题、一个子标题和两个段落。
在启动 TexStudio 后,保存一份新的文档。 (我将其保存为 `helloworld.tex` ,因为我正在编写本教程的 HelloWorld文档。这是编程的一个传统。接下来你需要在你的 `.tex` 文件顶部添加一些样板代码用于指定文档的类型和大小。 这与 HTML5 文件中使用的样板代码类似。
我的代码(如下方)将会把页面大小设置为 A4文本大小设置为 12pt 。 你可以直接把这些代码放入 TexStudio并指定你自己的页面大小、字体大小、名称、标题和其他详细信息进行编辑
```
\documentclass[a4paper,12pt]{article}
\begin{document}
\title{Hello World! My first LaTeX document}
\author{Aaron Cocker}
\date{\today}
\maketitle
content will go here
\end{document}
```
接下来,点击那个大的绿色箭头来编译该文档。就是下方截图中的中间的那个按钮。
![compile button in TexStudio](https://opensource.com/sites/default/files/u128651/compile.png "compile button in TexStudio")
如果这期间发生了什么错误,它将显示在底部的对话框里。
在你编译了这个文档之后,你可以看到它就像一个 PDF 一样显示在程序的 WYSIWYG (所见即所得)预览区域中。记住一旦你修改了代码就必须重新编译,就像我们在 C++ 中编程一样。
通过点击 **Tools > Commands > View PDF** 可以来预览你的文档,如下截图所示。
![Menu to view a PDF](https://opensource.com/sites/default/files/u128651/view_as_pdf.png "Menu to view a PDF")
PDF 的输出将会显示在右侧,就像这样:
![Viewing the LaTeX code as PDF](https://opensource.com/sites/default/files/u128651/pdf_output.png "Viewing the LaTeX code as PDF")
现在你可以添加一个段落。首先先通过 `\section{}` 命令来写一个子标题。在命令的大括号中输入你的子标题;我写的是 `Introduction`
```
\section{Introduction}
```
现在你已经给你的段落标记了一个子标题,是时候来写一个段落了。在这个例子中,我使用了 Lipsum 的 [lorem ipsum 生成器][11]。要创建一个段落,要使用 `\paragraph{}` 命令, 将你的文本插入到 `\maketitle``\end{document}` 之间的 `\paragraph{}` 大括号下方,而不是中间。
以下就是我创建的段落的代码:
```
\section{Introduction}
\paragraph{}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin.
\paragraph{}
Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo.
```
现在你的文档就已经完成了,你可以将其通过 **Save As** 选项导出并保存为一个 PDF 文档(和大多数程序一样)。
这是一个我已经完成的文档及其相应的代码:
![The finished document with code and the PDF output side-by-side](https://opensource.com/sites/default/files/u128651/finished_document.png "The finished document with code and the PDF output side-by-side")
本教程所有的代码如下所示:
```
\documentclass[a4paper,12pt]{article}
\begin{document}
\title{Hello World! My first LaTeX document}
\author{Aaron Cocker}
\date{\today}
\maketitle
\section{Introduction}
\paragraph{}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin.
\paragraph{}
Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo.
\end{document}
```
### 更多
在 LaTeX 撰写的数以千计的优秀资源中,大多数大学制作的指南是可索引的,同时也可以在 Google 搜索中找到。 [普林斯顿大学][12] 提供了一个很好的扩展教程,为了更深入的了解,普林斯顿大学的导师 Donald Knuth 提供了 [The TexBook][13],这是关于 LaTeX 的最好的教程。
(题图 : opensource.com
--------------------------------------------------------------------------------
作者简介:
Aaron Cocker - 一名在英国上大学的计算机学士。我是一个有抱负的数据科学家。我最喜欢的语言是 Python。 你可以随时通过邮箱联系我 : aaron@aaroncocker.org.uk 或者访问我的个人网站 : https://aaroncocker.org.uk
---------------
via: https://opensource.com/article/17/6/introduction-latex
作者:[Aaron Cocker][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/aaroncocker
[1]:https://opensource.com/file/356521
[2]:https://opensource.com/file/356526
[3]:https://opensource.com/file/356541
[4]:https://opensource.com/file/356536
[5]:https://opensource.com/file/356531
[6]:https://opensource.com/article/17/6/introduction-latex?rate=n5CmhY55ZhQRMjd6n5-f2p9f7iGg0nAWh_Bi6jqMMyc
[7]:https://opensource.com/user/123226/feed
[8]:http://www.texstudio.org/
[9]:https://www.tug.org/mactex/morepackages.html
[10]:https://miktex.org/download
[11]:http://www.lipsum.com/feed/html
[12]:https://www.cs.princeton.edu/courses/archive/spr10/cos433/Latex/latex-guide.pdf
[13]:http://www.ctex.org/documents/shredder/src/texbook.pdf
[14]:https://opensource.com/users/aaroncocker
[15]:https://opensource.com/article/17/6/introduction-latex#comments

View File

@ -0,0 +1,225 @@
pass一款简单的基于 Linux 命令行的密码管理工具
============================================================
现如今要记住类似 email、银行、社交媒体、在线支付、ftp 等等这么多的密码相信对每一个人来说都是一个巨大的挑战。
由于需求和使用,密码管理器现如今变得非常的流行。在 Linux 中我们可以有很多选择,包括基于 GUI 和基于 CLI 两种。今天我们要讲的是一款基于 CLI 的密码管理器叫做 pass 。
[pass][2] 是 Linux 上的一个简单的命令行密码管理器,它将密码存储在一个 `gpg` 加密后的文件里。这些加密后的文件很好地组织按目录结构存放。
所有密码都存在于 `~/.password-store` 中,它提供了添加、编辑、生成和检索密码等简单命令。
- 建议阅读:[KeePass - 存储/安全密码的最佳密码管理工具][3]
它是一个非常简短和简单的 shell 脚本。 它能够临时将密码放在剪贴板上,并使用 `git` 跟踪密码的修改。
这是一个很小的 shell 脚本,它还使用了少量的默认工具比如 `gnupg`、`tree` 和 `git`,同时还有活跃的社区为它提供 GUI 和扩展。
### 如何在 Linux 中安装 Pass
Pass 可从大多数 Linux 的主要发行版的仓库中获得。 所以,你可以使用你的分布式包管理器来安装它。
对于基于 Debian 的系统,你可以使用 [apt-get][4] 或 [apt][5] 包管理器命令来安装 pass。
```
$ sudo apt-get install pass
```
对于基于 RHEL/CentOS 的操作系统, 使用 [yum][6] 包管理器命令来安装它。
```
$ sudo yum install pass
```
Fedora 系统可用 [dnf][7] 包管理器命令来安装。
```
$ sudo dnf install pass
```
openSUSE 系统可以用 [zypper][8] 包管理器命令来安装。
```
$ sudo zypper in password-store
```
对于基于 Arch Linux 的操作系统用 [pacman][9] 包管理器来安装它。
```
$ pacman -S pass
```
### 如何生成 GPG 密钥对
确保你拥有你个人的 GPG 密钥对。如果没有的话,你可以通过在终端中输入以下的命令并安装指导来创建你的 GPG 密钥对。
```
$ gpg --gen-key
```
运行以上的命令以生成 GPG 密钥对时会有一系列的问题询问,谨慎输入问题的答案,其中有一些只要使用默认值即可。
### 初始化密码存储
如果你已经有了 GPG 密钥对,请通过运行以下命令初始化本地密码存储,你可以使用 email-id 或 gpg-id 初始化。
```
$ pass init 2daygeek@gmail.com
mkdir: created directory '/home/magi/.password-store/'
Password store initialized for 2daygeek@gmail.com
```
上述命令将在 `~/.password-store` 目录下创建一个密码存储区。
`pass` 命令提供了简单的语法来管理密码。 我们一个个来看,如何添加、编辑、生成和检索密码。
通过下面的命令检查目录结构树。
```
$ pass
or
$ pass ls
or
$ pass show
Password Store
```
我没有看到任何树型结构,所以我们将根据我们的需求来创建一个。
### 插入一个新的密码信息
我们将通过运行以下命令来保存 gmail 的 id 及其密码。
```
$ pass insert eMail/2daygeek@gmail.com
mkdir: created directory '/home/magi/.password-store/eMail'
Enter password for eMail/2daygeek@gmail.com:
Retype password for eMail/2daygeek@gmail.com:
```
执行重复操作,直到所有的密码插入完成。 比如保存 Facebook 密码。
```
$ pass insert Social/Facebook_2daygeek
mkdir: created directory '/home/magi/.password-store/Social'
Enter password for Social/Facebook_2daygeek:
Retype password for Social/Facebook_2daygeek:
```
我们可以列出存储中的所有现有的密码。
```
$ pass show
Password Store
├── 2g
├── Bank
├── eMail
│   ├── 2daygeek@gmail.com
│   └── magesh.maruthamuthu@gmail.com
├── eMail
├── Social
│   ├── Facebook_2daygeek
│   └── Gplus_2daygeek
├── Social
└── Sudha
└── sudha21.magesh@gmail.com
```
### 显示已有密码
运行以下命令从密码存储中检索密码信息,它会询问你输入密码以解锁。
[![](http://www.2daygeek.com/wp-content/uploads/2017/06/pass-command-line-package-manager-for-linux-1.png)][10]
```
$ pass eMail/2daygeek@gmail.com
*******
```
### 在剪贴板中复制密码
要直接将密码直接复制到剪贴板上,而不是在终端上输入,请使用以下更安全的命令,它会在 45 秒后自动清除密码。
```
$ pass -c eMail/magesh.maruthamuthu@gmail.com
Copied eMail/magesh.maruthamuthu@gmail.com to clipboard. Will clear in 45 seconds.
```
### 生成一个新密码
如果你想生成一些比较难以猜测的密码用于代替原有的奇怪密码,可以通过其内部的 `pwgen` 功能来实现。
```
$ pass generate eMail/2daygeek@gmail.com 15
An entry already exists for eMail/2daygeek@gmail.com. Overwrite it? [y/N] y
The generated password for eMail/2daygeek@gmail.com is:
y!NZ<%T)5Iwym_S
```
生成没有符号的密码。
```
$ pass generate eMail/2daygeek@gmail.com 15 -n
An entry already exists for eMail/2daygeek@gmail.com. Overwrite it? [y/N] y
The generated password for eMail/2daygeek@gmail.com is:
TP9ACLyzUZUwBwO
```
### 编辑现有的密码
使用编辑器插入新密码或编辑现有密码。 当你运行下面的命令时,将会在包含密码的文本编辑器中打开文件 `/dev/shm/pass.wUyGth1Hv0rnh/6kOBG-eMail-2daygeek@gmail.com.txt`。 只需在其中添加新密码,然后保存并退出即可。
```
$ pass edit eMail/2daygeek@gmail.com
File: /dev/shm/pass.wUyGth1Hv0rnh/6kOBG-eMail-2daygeek@gmail.com.txt
TP9ACLyzUZUwBwO
```
### 移除密码
删除现有密码。 它将从 `~/.password-store` 中删除包含 `.gpg` 的条目。
```
$ pass rm eMail/2daygeek@gmail.com
Are you sure you would like to delete eMail/2daygeek@gmail.com? [y/N] y
removed '/home/magi/.password-store/eMail/2daygeek@gmail.com.gpg'
```
### 多选项功能
要保存详细信息,如 URL、用户名、密码、引脚等信息可以使用以下格式。 首先确保你要将第一项设置为密码,因为它用于在使用剪贴板选项时将第一行复制为密码,以及后续行中的附加信息。
```
$ pass insert eMail/2daygeek@gmail.com -m
Enter contents of eMail/2daygeek@gmail.com and press Ctrl+D when finished:
H3$%hbhYT
URL : http://www.2daygeek.com
Info : Linux Tips & Tricks
Ftp User : 2g
```

--------------------------------------------------------------------------------
via: http://www.2daygeek.com/pass-command-line-password-manager-linux/
作者:[2DAYGEEK][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/author/2daygeek/
[2]:https://www.passwordstore.org/
[3]:http://www.2daygeek.com/keepass-best-linux-password-manager-arch-linux-mint-ubuntu-debian-fedora-opensuse/
[4]:http://www.2daygeek.com/apt-get-apt-cache-command-examples/
[5]:http://www.2daygeek.com/apt-command-examples/
[6]:http://www.2daygeek.com/yum-command-examples/
[7]:http://www.2daygeek.com/dnf-command-examples/
[8]:http://www.2daygeek.com/zypper-command-examples/
[9]:http://www.2daygeek.com/pacman-command-examples/
[10]:http://www.2daygeek.com/wp-content/uploads/2017/06/pass-command-line-package-manager-for-linux-1.png

View File

@ -0,0 +1,138 @@
uCareSystemUbuntu/Linux Mint 的一体化系统更新和维护工具
============================================================
[uCareSystem Core][2] 是一种能够自动执行基本的系统维护活动的轻型实用程序,另一方面它可以通过多种方式减少系统管理员的任务,节省大量时间。它没有任何 GUI并提供纯粹的命令行界面来执行活动。
Ubuntu 中有几种实用程序来执行系统维护活动。每种工具有它们相应的独特功能和设计。你可以添加一个 cron 任务来自动化这些任务。
uCareSystem Core 会自动刷新发行版仓库、更新可用包列表、卸载包(过期包、孤儿包和旧的 Linux 内核)以及清理取回的包来节省系统磁盘空间。
- 建议阅读:[Stacer - Linux 系统优化器及监控工具][3]
- 建议阅读:[BleachBit 快速及最佳的方式清理你的 Linux 系统][4]
- 建议阅读:[用 Ubuntu Cleaner 在 Ubuntu/LinuxMint 中释放一些空间][5]
### uCareSystem Core 功能
* 更新包列表(它将刷新包索引)
* 下载及安装更新
* 更新包及系统库到最新版本
* 移除不需要的、过期的和孤儿包。
* 移除旧内核(它为了安全保留当前和之前一个内核)
* 移除不需要的配置文件
* 清理已下载的临时包
### 在 Ubuntu/LinuxMint 中安装 uCareSystem Core
因为开发者提供了自己的 PPA因此我们可以轻易地通过 PPA 在 Ubuntu/LinuxMint 中安装 uCareSystem Core。
```
$ sudo add-apt-repository ppa:utappia/stable
$ sudo apt update
$ sudo apt install ucaresystem-core
```
我们已经成功安装了 `uCareSystem Core` 包,并且在执行 CareSystem Core 命令之前要了解它是否会节省磁盘空间,使用 `df -h` 命令检查当前磁盘利用率。
```
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 979M 0 979M 0% /dev
tmpfs 200M 6.4M 194M 4% /run
/dev/sda1 38G 19G 17G 54% /
tmpfs 999M 216K 999M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 999M 0 999M 0% /sys/fs/cgroup
tmpfs 200M 112K 200M 1% /run/user/1000
```
只需在终端中运行 `ucaresystem-core` 命令,在结束之前它会自动执行而不需要人类交互。
```
$ sudo ucaresystem-core
_______________________________________________________
uCareSystem Core v3.0
~ '' ~
Welcome to all-in-one System Update and maintenance
assistant app.
This simple script will automatically
refresh your packagelist, download and
install updates (if there are any), remove any old
kernels, obsolete packages and configuration files
to free up disk space, without any need of user
interference.
_______________________________________________________
uCareSystem Core will start in 5 seconds...
#########################
Started
#########################
Ign:1 https://wire-app.wire.com/linux/debian stable InRelease
Hit:2 https://wire-app.wire.com/linux/debian stable Release
Hit:4 https://deb.nodesource.com/node_6.x yakkety InRelease
Hit:5 https://repo.skype.com/deb stable InRelease
Hit:6 http://in.archive.ubuntu.com/ubuntu yakkety InRelease
Hit:7 http://archive.canonical.com/ubuntu yakkety InRelease
.
.
.
Removing linux-image-extra-4.8.0-34-generic (4.8.0-34.36) ...
Purging configuration files for linux-image-extra-4.8.0-34-generic (4.8.0-34.36) ...
Removing linux-image-extra-4.8.0-32-generic (4.8.0-32.34) ...
Purging configuration files for linux-image-extra-4.8.0-32-generic (4.8.0-32.34) ...
#####################################
Finished removing unused config files
#####################################
Reading package lists... Done
Building dependency tree
Reading state information... Done
Del tilix 1.5.6-1~webupd8~yakkety1 [449 kB]
Del tilix-common 1.5.6-1~webupd8~yakkety1 [174 kB]
Del libfreetype6 2.6.3-3ubuntu1.2 [336 kB]
Del terminix 1.5.6-1~webupd8~yakkety1 [13.7 kB]
######################################
Cleaned downloaded temporary packages
######################################
#########################
Done
#########################
```
我可以看见它如预期那样工作。同样也可以发现大概在`/` 分区节省了 `2GB`
```
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 979M 0 979M 0% /dev
tmpfs 200M 6.4M 194M 4% /run
/dev/sda1 38G 18G 19G 49% /
tmpfs 999M 216K 999M 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 999M 0 999M 0% /sys/fs/cgroup
tmpfs 200M 112K 200M 1% /run/user/1000
```
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/ucaresystem-system-update-and-maintenance-tool-for-ubuntu-linuxmint/
作者:[2DAYGEEK][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/author/2daygeek/
[2]:https://github.com/cerebrux/uCareSystem
[3]:http://www.2daygeek.com/stacer-linux-system-optimizer-and-monitoring-tool/
[4]:http://www.2daygeek.com/bleachbit-system-cleaner-on-ubuntu-debian-fedora-opensuse-arch-linux-mint/
[5]:https://linux.cn/article-8642-1.html

View File

@ -0,0 +1,81 @@
Linux 上如何安装并切换最新版本的 Python 3.6
============================================================
![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/1496865727_python-logo.png)
**Python** 是 [Linux][3] 中一种最流行的编程语言。它被写成了各种工具和库。除此之外Python 在开发者之间很流行因为它非常简单,并且实际很容易掌握。如果你安装了 [Linux mint][4] 系统,正在学习 **Python** 并想要使用最新的版本的话,那么这篇文章就是为你而写的。现在我已经安装好了 [Linux Mint 18][5]。默认安装的版本是 2.7 和 3.5。你可以用这个命令检查:
```
$ python -V
$ python2 -V
$ python3 -V
```
**安装最新的 Python 3.6 到 Linux 中**
```
$ sudo add-apt-repository ppa:jonathonf/python-3.6
$ sudo apt update
$ sudo apt install python3.6
```
检查已安装的 Python 3.6 版本
```
$ python3.6 -V
```
**请注意**旧版本仍然还在,它仍然可以通过 `python3` 可用,新的版本可以通过命令 `python3.6`。如果你想要默认使用这个版本而不是 3.5 运行所有的程序,这有个工具叫 `update-alternatives`。但是如果你尝试获取可能的列表,我们会得到错误:
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6]
这是正常的,你首先需要为那个问题设置文件,因为维护者没有设置这个:
```
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
```
现在再次查看:
```
$ update-alternatives --list python3
```
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7]
现在我们选择需要的版本并按需切换。对于设置使用配置命令:
```
$ sudo update-alternatives --config python3
```
[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8]
在提示符中,你需要指定默认使用的编号。
> 选择版本时要小心,不要去动 pythonpython2只使用我说的 python3Python 2.7 编写了各种系统工具,如果你尝试用错误的解释器版本运行它们,可能就不会工作。
愿原力与你同在,好运!!!
--------------------------------------------------------------------------------
via: https://mintguide.org/other/794-python-3-6-install-latest-version-into-linux-mint.html
作者:[Shekin][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://mintguide.org/user/Shekin/
[1]:http://www.codeweavers.com/?ad=708
[2]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D
[3]:https://mintguide.org/
[4]:https://mintguide.org/
[5]:https://mintguide.org/
[6]:https://mintguide.org/uploads/posts/2017-06/1496871711_linux_mint_001.png
[7]:https://mintguide.org/uploads/posts/2017-06/1496871720_linux_mint_002.png
[8]:https://mintguide.org/uploads/posts/2017-06/1496871722_linux_mint_003.png
[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D
[10]:https://mintguide.org/other/

View File

@ -0,0 +1,206 @@
三种在 Linux 上创建或扩展交换分区的简单方法
============================================================
用户可以在任何 Linux 操作系统的安装过程中或者是其它必要的时候创建交换空间。如果你在安装 Linux 的时候忘记了创建或是你想要再增加交换分区的空间,你随时都可以再创建或增加。
有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 1GB 升级到 2GB 你,那么你就不得不将你的交换分区空间也升级一下(从 2GB 到 4GB这是因为它使用的容量是物理 RAM 的双倍容量。LCTT 译注:其实这里是个误区,交换分区不一定非得是双倍的物理内存容量,只是惯例如此。事实上,如果你的物理内存足够的话,你完全可以不用交换分区——在这里的情形下,或许你增加了物理内存,就没必要增加交换分区大小了。)
交换空间是当物理内存RAM 随机存取存储器)的用量已满时,被保留用作虚拟内存的磁盘上的空间。 如果系统在 RAM 满载时需要更多的内存资源,内存中的非活动页面将被移动到交换空间,这样可以帮助系统运行应用程序更多的时间,但不应该把它当做 RAM 的扩展。
建议你创建一个专用的交换分区,但是如果你没有可用的分区,那么可以使用交换文件,或交换分区和交换文件的组合。 交换空间通常建议用户至少 4 GB用户也可以根据自己的要求和环境创建交换空间。
我发现大部分 VM 和 云服务器都没有交换分区,所以在这种情况下,我们可以使用以下三种方法创建,扩展或增加交换空间。
### 如何检测当前交换分区大小
通过 [free][1] & `swapon` 命令来检测当前的交换分区空间的大小。 
```
$ free -h
total used free shared buff/cache available
Mem: 2.0G 1.3G 139M 45M 483M 426M
Swap: 2.0G 655M 1.4G
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 655.2M -1
```
上面的输出显示了当前的交换分区空间是 `2GB`
### 方法 1 : 通过 fallocate 命令创建交换文件
`fallocate` 程序是立即创建预分配大小的文件的最佳方法。
下面这个命令会创建一个 1GB 大小的 `/swapfile`
```
$ sudo fallocate -l 1G /swapfile
```
检查一下创建的文件的大小是否正确。
```
$ ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Jun 7 09:49 /swapfile
```
将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。
```
$ sudo chmod 600 /swapfile
```
通过运行以下的命令来将此文件转换为交换文件。
```
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=cda50e0e-41f3-49c7-af61-b8cb4a33a464
```
通过运行以下的命令来使交换文件生效。
```
$ sudo swapon /swapfile
```
将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。
```
$ vi /etc/fstab
/swapfile swap swap defaults 0 0
```
检查一下新创建的交换文件。
```
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 657.8M -1
/swapfile file 1024M 0B -2
```
现在我可以看到一个新的  1GB 的 `/swapfile1` 文件了。重启系统以使新的交换文件生效。
### 方法 2 : 通过 dd 命令来创建交换文件
`dd` 命令是另一个实用程序,可以帮助我们立即创建预分配大小的文件。
以下 dd 命令将创建 1GB 的 `/swapfile1`
```
$ sudo dd if=/dev/zero of=/swapfile1 bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.6154 s, 64.6 MB/s
```
**详解:**
* `if=/dev/zero` 是输入文件,`/dev/zero` 是类 Unix 操作系统中的一个特殊文件它提供从它读取的尽可能多的空字符ASCII NUL0x00
* `of=/swapfile1` 设置输出文件。
* `bs=1G` 一次性读写的大小为 1GB
* `count=1` 仅复制一个输入块
检查一下创建的文件的大小是否正确。
```
$ ls -lh /swapfile1
-rw-r--r-- 1 root root 1.0G Jun 7 09:58 /swapfile1
```
将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。
```
$ sudo chmod 600 /swapfile1
```
通过运行以下的命令来将此文件转换为交换文件。
```
$ sudo mkswap /swapfile1
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=96def6d7-b2da-4954-aa72-aa32316ec993
```
通过运行以下的命令来使交换文件生效。
```
$ sudo swapon /swapfile1
```
将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。
```
$ vi /etc/fstab
/swapfile1 swap swap defaults 0 0
```
检查新创建的交换文件。
```
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 1.3G -1
/swapfile file 1024M 0B -2
/swapfile1 file 1024M 0B -3
```
现在我可以看到一个新的  1GB 的 `/swapfile1` 了。重启系统以使新的交换文件生效。
### 方法 3 : 通过硬盘分区来创建交换文件
我们也推荐使用通过硬盘分区的方式来创建交换分区。
如果你已经在你的另一个硬盘上通过 `fdisk` 命令创建了一个新的分区,假设我们已经创建了一个叫做 `/dev/sda4` 的分区。
使用 `mkswap` 命令来将这个分区转换成交换分区。
```
$ sudo mkswap /dev/sda4
```
通过运行以下命令来使交换文件生效。
```
$ sudo swapon /dev/sda4
```
把新增的交换文件添加到 `fstab` 文件中,这样即使是重启了系统交换分区的修改也能生效。
```
$ vi /etc/fstab
/dev/sda4 swap swap defaults 0 0
```
检查新创建的交换文件。
```
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/sda5 partition 2G 1.3G -1
/swapfile file 1024M 0B -2
/swapfile1 file 1024M 0B -3
/dev/sda4 partition 1G 0B -4
```
我可以看到新的交换分区 1GB 的 `/dev/sda4`。重启系统就可以使用新的交换分区了。
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/
作者:[2DAYGEEK][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/2daygeek/
[1]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
[2]:http://www.2daygeek.com/author/2daygeek/

View File

@ -0,0 +1,81 @@
在 MacBook Air 上安装 Fedora 26
======================
(写本文时)距离 Fedora 26 测试版发布已有几天,我认为是时候把它安装在我的 13 寸 MacBook Air 上了。
我这个 MacBook Air 的型号为 A1466 EMC 2925拥有 8gb 内存2.2GHz i7 处理器512gb SSD以及与 2015 款相似的外观。
首先我下载了 beta 版镜像,你能够从 [GetFedora][1] 网站获取。一旦你下载完成,就可将它安装在 USB 闪存驱动器上。在 Linux 上,你可以用 `dd` 命令方便的完成这个操作。
将 USB 驱动器插入到你的电脑上,并使用 `tail` 命令读取 `/var/log/syslog``/var/log/messages` 文件的最后几行。你也可以使用 `df -h` 命令查看存储设备从而找到正确的 /dev/sdX。
在下面的例子中,我们假设 USB 闪存驱动器为 `/dev/sdc`
```
dd if=/home/rob/Downloads/Fedora-Workstation-Live-x86_64-26_Beta-1.4.iso of=/dev/sdc bs=8M status=progress oflag=direct
```
这将花费一点点时间……让我们耐心等待。
接下来,我关掉 MacBook等待 5 秒后将它重新启动。在按下电源键后,我按住 “option” 键来呼出启动选项。我的选择如下图:
![macbook-air-fedora.jpg](https://www.linux.org/attachments/macbook-air-fedora-jpg.2763/)
点击 “fedora” 下面的箭头进入安装过程。
在进入安装过程后我注意到我没有 wifi 网络。幸运的是我有个雷电口转以太网的转接器,因为这个笔记本实际上没有以太网接口。我寄希望于谷歌搜索,并于 [此处][2] 找到了一些很棒的指导。
设置 wifi 前先更新内核:
```
sudo dnf update kernel
```
(然后重启)
安装 rpmfusion 仓库:
```
su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm'
```
安装 akmods 和 kernel-devel 包:
```
sudo dnf install -y akmods "kernel-devel-uname-r == $(uname -r)"
```
从 rpmfusion 仓库安装 broadcom-wl 包:
```
sudo dnf install -y broadcom-wl
```
重构内核扩展:
```
sudo akmods
```
然后重启连接你的 wifi
到目前为止我们已经解决,这使我印象非常深刻!所有我关心的功能键都能够正常工作,如屏幕亮度、键盘背光、音量。
接下来,等 7 月份发布非测试版时,我将马上使用 dnf 升级LCTT 译注Fedora 26 正式版已经发布)
感谢你Fedora
--------------------------------------------------------------------------------
via: https://www.linux.org/threads/installing-fedora-26-beta-on-a-macbook-air.12464/
作者:[Rob][a]
译者:[cycoe](https://github.com/cycoe)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linux.org/members/rob.1/
[1]:https://getfedora.org/en/workstation/prerelease/
[2]:https://gist.github.com/jamespamplin/7a803fd5be61d4f93e0c5dcdea3f99ee

View File

@ -0,0 +1,83 @@
arm64 服务器中的 Debian armhf 虚拟机
=============
在 Collabora 公司,我们所做的许多工作之一就是为客户构建包括 32 位和 64 位 ARM 系统在内的各种架构的 [Debian][1] 衍生版。就像 Debian 做的那样,我们的 [OBS][2] 系统建立在原生系统而不是仿真器上。
幸运的是随着几年前 ARM 服务器系统的出现,为这些系统原生构建不再像以前那么痛苦了。对于 32 位的 ARM我们一直依赖 [Calxeda][3] 刀片服务器,然而不幸的是 Calxeda 在不久前淘汰,硬件开始显露其年龄(尽管幸运的是 Debian Stretch 还支持它,因此至少软件还是新的)。
在 64 位 ARM 方面,我们运行在基于 Gigabyte MP30-AR1 的服务器上,该服务器可以运行 32 位的 ARM 代码(与之相反,比如基于 ThunderX 的服务器只能运行 64 位代码)。像这样在它们之上运行 armhf 虚拟机作为从构建服务器build slaves似乎是一个很好的选择但是设置起来可能会需要更多东西的介入。
第一个陷阱是 Debian 中没有标准的 bootloader 或者 boot 固件来启动 qemu 仿真的 “virt” 设备(我不想使用真实机器的仿真)。这也意味着在启动时客户机内没有任何东西会加载内核,也不会从客户机网络引导,这意味着需要直接的内核引导。
第二个陷阱是当前的 Debian Stretch 的 armhf 内核并不支持 qemu 虚拟机所提供的通用 PCI 主机控制器,这意味着客户机中不会出现存储器和网络。希望这会被尽快解决([Debian bug 864726][4]),并出现在 Stretch 更新中,那在之前需要使用 bug 报告中附带的补丁的自定义内核,但在这篇文章中我不想进一步说。
高兴的假设我们有一个可用的内核,剩下的挑战是很好地管理直接内核加载。或者更具体地说,如何确保主机启动客户机通过标准 apt 工具安装的内核,而不必在客户机/主机之间复制内核,这本质上归结于客户机将 `/boot` 暴露给主机。我们选择的方案是使用 qemu 的 9pfs 支持来从主机共享一个文件夹,并将其用作客户机的 `/boot`。对于 9p 文件夹,似乎需要 “mapped” 安全模式,因为 “none” 模式对 dpkg 有问题([Debian bug 864718] [5])。
由于我们使用 libvirt 作为我们的虚拟机管理器,剩下的事情就是如何将它们组合到一起。
第一步是安装系统,基本和平常一样。可以直接引导进入由普通的 Stretch armhf netboot 安装程序提供的 `vmlinuz``initrd.gz`(下载到如 `/tmp` 中)。 设置整体来说很直接,会有一些小的调整:
* `/srv/armhf-vm-boot` 设置为 9p 共享文件夹(这个应该存在,并且由 libvirt-qemu 拥有),这之后会被用于共享 `/boot`
* 内核参数中在 `root=` 后面加上 VM 中的 root 分区,根据你的情况调整。
* 镜像文件使用 virtio 总线,这似乎不是默认的。
除了这些调整,最后的示例命令与 virt-install 手册页中的相似。
```
virt-install --name armhf-vm --arch armv7l --memory 512 \
--disk /srv/armhf-vm.img,bus=virtio
--filesystem /srv/armhf-vm-boot,virtio-boot,mode=mapped \
--boot=kernel=/tmp/vmlinuz,initrd=/tmp/initrd.gz,kernel_args="console=ttyAMA0,root=/dev/vda1"
```
按照通常的方式运行安装。到最后安装程序可能会提示它不知道如何安装引导程序,这个没什么问题。只要在结束安装和重启之前,切换到 shell 并以某种方式将目标系统中的 `/boot/vmlinuz``/boot/initrd.img` 复制到主机中(比如 chroot 进入 `/target` 并在已安装的系统中使用 scp。 这是必需的,因为安装程序不支持 9p但是要启动系统需要 initramfs 以及能够挂载根文件系统的模块,这由已安装的 initramfs 提供。这些完成后,安装就可以完成了。
接下来,引导已安装的系统。调整 libvirt 配置(比如使用 virsh 编辑并调整 xml来使用从安装程序复制过来的内核以及 initramfs而不只是使用它提供的。再次启动虚拟机它应该就能愉快地进入安装的 Debian 系统中了。
要在客户机这一侧完成,`/boot` 应该移动到共享的 9pfs 中,`/boot` 的新 fstab 条目看上去应该这样:
```
virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0
```
有了这一步,这只是将 `/boot` 中的文件混到新的文件系统里面,并且客户机完事了(确保 `vmlinuz`/`initrd.img` 保持符号链接)。内核可以如常升级,并对主机可见。
这时对于主机端,有另外一个问题需要跨过,由于客户机使用 9p 映射安全模式,客户机的符号链接对主机而言将是普通的包含链接目标的文件。为了解决这个问题,我们在客户机启动前使用 libvirt qemu 的 hook 支持来设置合适的符号链接。作为一个例子,下面是我们最终使用的脚本(`/etc/libvirt/hooks/qemu`
```
vm=$1
action=$2
bootdir=/srv/${vm}-boot
if [ ${action} != "prepare" ] ; then
exit 0
fi
if [ ! -d ${bootdir} ] ; then
exit 0
fi
ln -sf $(basename $(cat ${bootdir}/vmlinuz)) ${bootdir}/virtio-vmlinuz
ln -sf $(basename $(cat ${bootdir}/initrd.img)) ${bootdir}/virtio-initrd.img
```
有了这个,我们可以简单地定义 libvirt 使用 `/srv/${vm}-boot/virtio-{vmlinuz,initrd.img}` 作为机器的内核 / `initramfs`,并且当 VM 启动时,它会自动获取客户机安装的最新内核 / `initramfs`
只有最后一个边缘情况了,当从 VM libvirt 重启会让 qemu 处理它而不是重启 qemu。如果这不幸发生的话意味着重启不会加载新内核。所以现在我们通过配置 libvirt 来解决这个问题,从而在重启时停止虚拟机。由于我们通常只在升级内核(安装)时重启 VM虽然这有点乏味但这避免了重启加载的是旧内核 / `initramfs` 而不是预期的。
--------------------------------------------------------------------------------
via: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/
作者:[Sjoerd Simons][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/
[1]:https://debian.org/
[2]:http://openbuildservice.org/
[3]:https://en.wikipedia.org/wiki/Calxeda
[4]:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864726
[5]:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864718

View File

@ -0,0 +1,296 @@
如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364
============================================================
在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题攻击者能够利用它来破坏内存数据并执行任意代码。攻击者可以利用这个及另一个漏洞来执行任意代码并获得管理帐户root权限。
在 Linux 中该如何解决这个问题?
[![the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris](https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg)][22]
Qualys 研究实验室在 GNU C LibraryCVE-2017-1000366的动态链接器中发现了许多问题它们通过与 Linux 内核内的堆栈冲突来允许本地特权升级。这个 bug 影响到了 i386 和 amd64 上的 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存数据并执行任意代码。
### 什么是 CVE-2017-1000364 bug
[来自 RHN][13]
> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域的受控内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB从而使成功利用这个功能变得困难。
[据原研究文章][14]
> 计算机上运行的每个程序都使用一个称为堆栈的特殊内存区域。这个内存区域是特别的,因为当程序需要更多的堆栈内存时,它会自动增长。但是,如果它增长太多,并且与另一个内存区域太接近,程序可能会将堆栈与其他内存区域混淆。攻击者可以利用这种混乱来覆盖其他内存区域的堆栈,或者反过来。
### 受到影响的 Linux 发行版
1. Red Hat Enterprise Linux Server 5.x
2. Red Hat Enterprise Linux Server 6.x
3. Red Hat Enterprise Linux Server 7.x
4. CentOS Linux Server 5.x
5. CentOS Linux Server 6.x
6. CentOS Linux Server 7.x
7. Oracle Enterprise Linux Server 5.x
8. Oracle Enterprise Linux Server 6.x
9. Oracle Enterprise Linux Server 7.x
10. Ubuntu 17.10
11. Ubuntu 17.04
12. Ubuntu 16.10
13. Ubuntu 16.04 LTS
14. Ubuntu 12.04 ESM (Precise Pangolin)
15. Debian 9 stretch
16. Debian 8 jessie
17. Debian 7 wheezy
18. Debian unstable
19. SUSE Linux Enterprise Desktop 12 SP2
20. SUSE Linux Enterprise High Availability 12 SP2
21. SUSE Linux Enterprise Live Patching 12
22. SUSE Linux Enterprise Module for Public Cloud 12
23. SUSE Linux Enterprise Build System Kit 12 SP2
24. SUSE Openstack Cloud Magnum Orchestration 7
25. SUSE Linux Enterprise Server 11 SP3-LTSS
26. SUSE Linux Enterprise Server 11 SP4
27. SUSE Linux Enterprise Server 12 SP1-LTSS
28. SUSE Linux Enterprise Server 12 SP2
29. SUSE Linux Enterprise Server for Raspberry Pi 12 SP2
### 我需要重启我的电脑么?
是的,由于大多数服务依赖于 GNU C Library 的动态连接器,并且内核自身需要在内存中重新加载。
### 我该如何在 Linux 中修复 CVE-2017-1000364
根据你的 Linux 发行版来输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本:
```
$ uname -a
$ uname -mrs
```
示例输出:
```
Linux 4.4.0-78-generic x86_64
```
### Debian 或者 Ubuntu Linux
输入下面的 [apt 命令][15] / [apt-get 命令][16]来应用更新:
```
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
```
示例输出:
```
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
libc-bin libc-dev-bin libc-l10n libc6 libc6-dev libc6-i386 linux-compiler-gcc-6-x86 linux-headers-4.9.0-3-amd64 linux-headers-4.9.0-3-common linux-image-4.9.0-3-amd64
linux-kbuild-4.9 linux-libc-dev locales multiarch-support
14 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/62.0 MB of archives.
After this operation, 4,096 B of additional disk space will be used.
Do you want to continue? [Y/n] y
Reading changelogs... Done
Preconfiguring packages ...
(Reading database ... 115123 files and directories currently installed.)
Preparing to unpack .../libc6-i386_2.24-11+deb9u1_amd64.deb ...
Unpacking libc6-i386 (2.24-11+deb9u1) over (2.24-11) ...
Preparing to unpack .../libc6-dev_2.24-11+deb9u1_amd64.deb ...
Unpacking libc6-dev:amd64 (2.24-11+deb9u1) over (2.24-11) ...
Preparing to unpack .../libc-dev-bin_2.24-11+deb9u1_amd64.deb ...
Unpacking libc-dev-bin (2.24-11+deb9u1) over (2.24-11) ...
Preparing to unpack .../linux-libc-dev_4.9.30-2+deb9u1_amd64.deb ...
Unpacking linux-libc-dev:amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
Preparing to unpack .../libc6_2.24-11+deb9u1_amd64.deb ...
Unpacking libc6:amd64 (2.24-11+deb9u1) over (2.24-11) ...
Setting up libc6:amd64 (2.24-11+deb9u1) ...
(Reading database ... 115123 files and directories currently installed.)
Preparing to unpack .../libc-bin_2.24-11+deb9u1_amd64.deb ...
Unpacking libc-bin (2.24-11+deb9u1) over (2.24-11) ...
Setting up libc-bin (2.24-11+deb9u1) ...
(Reading database ... 115123 files and directories currently installed.)
Preparing to unpack .../multiarch-support_2.24-11+deb9u1_amd64.deb ...
Unpacking multiarch-support (2.24-11+deb9u1) over (2.24-11) ...
Setting up multiarch-support (2.24-11+deb9u1) ...
(Reading database ... 115123 files and directories currently installed.)
Preparing to unpack .../0-libc-l10n_2.24-11+deb9u1_all.deb ...
Unpacking libc-l10n (2.24-11+deb9u1) over (2.24-11) ...
Preparing to unpack .../1-locales_2.24-11+deb9u1_all.deb ...
Unpacking locales (2.24-11+deb9u1) over (2.24-11) ...
Preparing to unpack .../2-linux-compiler-gcc-6-x86_4.9.30-2+deb9u1_amd64.deb ...
Unpacking linux-compiler-gcc-6-x86 (4.9.30-2+deb9u1) over (4.9.30-2) ...
Preparing to unpack .../3-linux-headers-4.9.0-3-amd64_4.9.30-2+deb9u1_amd64.deb ...
Unpacking linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
Preparing to unpack .../4-linux-headers-4.9.0-3-common_4.9.30-2+deb9u1_all.deb ...
Unpacking linux-headers-4.9.0-3-common (4.9.30-2+deb9u1) over (4.9.30-2) ...
Preparing to unpack .../5-linux-kbuild-4.9_4.9.30-2+deb9u1_amd64.deb ...
Unpacking linux-kbuild-4.9 (4.9.30-2+deb9u1) over (4.9.30-2) ...
Preparing to unpack .../6-linux-image-4.9.0-3-amd64_4.9.30-2+deb9u1_amd64.deb ...
Unpacking linux-image-4.9.0-3-amd64 (4.9.30-2+deb9u1) over (4.9.30-2) ...
Setting up linux-libc-dev:amd64 (4.9.30-2+deb9u1) ...
Setting up linux-headers-4.9.0-3-common (4.9.30-2+deb9u1) ...
Setting up libc6-i386 (2.24-11+deb9u1) ...
Setting up linux-compiler-gcc-6-x86 (4.9.30-2+deb9u1) ...
Setting up linux-kbuild-4.9 (4.9.30-2+deb9u1) ...
Setting up libc-l10n (2.24-11+deb9u1) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up libc-dev-bin (2.24-11+deb9u1) ...
Setting up linux-image-4.9.0-3-amd64 (4.9.30-2+deb9u1) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.9.0-3-amd64
cryptsetup: WARNING: failed to detect canonical device of /dev/md0
cryptsetup: WARNING: could not determine root device from /etc/fstab
W: initramfs-tools configuration sets RESUME=UUID=054b217a-306b-4c18-b0bf-0ed85af6c6e1
W: but no matching swap device is available.
I: The initramfs will attempt to resume from /dev/md1p1
I: (UUID=bf72f3d4-3be4-4f68-8aae-4edfe5431670)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-4.9.0-3-amd64
Found kernel: /boot/vmlinuz-3.16.0-4-amd64
Updating /boot/grub/menu.lst ... done
Setting up libc6-dev:amd64 (2.24-11+deb9u1) ...
Setting up locales (2.24-11+deb9u1) ...
Generating locales (this might take a while)...
en_IN.UTF-8... done
Generation complete.
Setting up linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u1) ...
```
使用 [reboot 命令][17]重启桌面/服务器:
```
$ sudo reboot
```
### Oracle/RHEL/CentOS/Scientific Linux
输入下面的 [yum 命令][18]
```
$ sudo yum update
$ sudo reboot
```
### Fedora Linux
输入下面的 dnf 命令:
```
$ sudo dnf update
$ sudo reboot
```
### Suse Enterprise Linux 或者 Opensuse Linux
输入下面的 zypper 命令:
```
$ sudo zypper patch
$ sudo reboot
```
### SUSE OpenStack Cloud 6
```
$ sudo zypper in -t patch SUSE-OpenStack-Cloud-6-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Server for SAP 12-SP1
```
$ sudo zypper in -t patch SUSE-SLE-SAP-12-SP1-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Server 12-SP1-LTSS
```
$ sudo zypper in -t patch SUSE-SLE-SERVER-12-SP1-2017-996=1
$ sudo reboot
```
### SUSE Linux Enterprise Module for Public Cloud 12
```
$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1
$ sudo reboot
```
### 验证
你需要确认你的版本号在 [reboot 命令][19]之后改变了。
```
$ uname -a
$ uname -r
$ uname -mrs
```
示例输出:
```
Linux 4.4.0-81-generic x86_64
```
### 给 OpenBSD 用户的注意事项
见[此页][20]获取更多信息。
### 给 Oracle Solaris 的注意事项
[见此页][20]获取更多信息。
### 参考
* [堆栈冲突][4]
--------------------------------------------------------------------------------
作者简介:
Vivek Gite
作者是 nixCraft 的创始人,对于 Linux 操作系统/Unix shell脚本有经验丰富的系统管理员和培训师。他曾与全球客户及各行各业包括 IT、教育、国防和空间研究以及非营利部门合作。在 [Twitter][1]、[Facebook] [2]、[Google +] [3] 上关注他。
--------------------------------------------------------------------------------
via: https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/
作者:[Vivek Gite][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://plus.google.com/+CybercitiBiz
[1]:https://twitter.com/nixcraft
[2]:https://facebook.com/nixcraft
[3]:https://plus.google.com/+CybercitiBiz
[4]:https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash
[5]:https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/
[6]:https://www.cyberciti.biz/faq/category/centos/
[7]:https://www.cyberciti.biz/faq/category/debian-ubuntu/
[8]:https://www.cyberciti.biz/faq/category/linux/
[9]:https://www.cyberciti.biz/faq/category/redhat-and-friends/
[10]:https://www.cyberciti.biz/faq/category/security/
[11]:https://www.cyberciti.biz/faq/category/suse/
[12]:https://www.cyberciti.biz/faq/category/linux/
[13]:https://access.redhat.com/security/cve/cve-2017-1000364
[14]:https://blog.qualys.com/securitylabs/2017/06/19/the-stack-clash
[15]:https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/
[16]:https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html
[17]:https://www.cyberciti.biz/faq/linux-reboot-command/
[18]:https://www.cyberciti.biz/faq/rhel-centos-fedora-linux-yum-command-howto/
[19]:https://www.cyberciti.biz/faq/linux-reboot-command/
[20]:https://ftp.openbsd.org/pub/OpenBSD/patches/6.1/common/008_exec_subr.patch.sig
[21]:http://www.oracle.com/technetwork/security-advisory/alert-cve-2017-3629-3757403.html
[22]:https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg

View File

@ -0,0 +1,111 @@
Boot Repair Tool 可以修复与启动相关的大部分问题
=========
[![boot repair tool repair the most boot related problems ](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/boot-repair-tool-repair-the-most-boot-related-problems_orig.jpg)][1]
​我们都碰到过启动相关的问题,并且大部分时候都是简单的 **GRUB** 上的问题。 有时候很多人会觉得、输入一段很长的命令或在论坛中搜索来找到解决方法太麻烦了。今天我要告诉你如何使用一个简单而轻巧的软件来解决大部分的启动相关的问题。这个工具就是著名的 **Boot Repair Tool** 。好了,话不多说,让我们开始吧。
### 如何在 Linux 中安装和使用启动修复工具
你需要一个你所安装的操作系统的现场版的 USB 棒或 DVD这是安装这个应用并使用它的前提条件。 引导到操作系统[17] 并打开终端并输入以下命令
```
sudo add-apt-repository -y ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair && boot-repair
```
[![install boot repair tool in linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-boot-repair-tool-in-linux.jpg?1498051049)][2]
在安装结束以后,你可以从应用菜单或或其它你在系统上启动应用的地方启动你的修复工具。
[![run boot-repair from apps menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/run-boot-repair-from-apps-menu.jpg?1498051112)][3]
你可以在菜单栏中看到 Boot Repair。
[![Picture](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-boot-issues-with-boot-repair.jpg?1498051197)][4]
​启动它,它就会开始进行一些扫描操作,我们只要等它自己结束就好了。
[![boot repair app menu to repair system](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/boot-repair-app-menu-to-repair-system.jpg?1498051265)][5]
现在你会看到这个界面,这是基于之前扫描的建议修复。 在底部还可以有一个高级选项,你可以在高级选项里进行各方面的设置。 我建议没有经验的用户使用推荐维修,因为它很简单,在大多数情况下我们都可以这样做。
[![apply recommended fixes to fix grub issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/apply-recommended-fixes-to-fix-grub-issues.jpg?1498051332)][6]
选择推荐的更新后,它将开始修复。 等待进一步的处理。
[![fix the grub menu using boot repair](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fix-the-grub-menu-using-boot-repair.jpg?1498051422)][7]
你现在会看到一个指令界面。 现在是轮到我们操作的时候了。打开终端,逐个复制并粘贴其中高亮的命令到终端中。
[![download and install grub using the given commands](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/confirm-grub-packages-installation.jpg?1498051588)][8]
命令完成后,你会看到一个上面提及的要求确认的界面。 使用箭头键或 Tab 键选择“Yes”然后按回车键。 现在在 **启动修复工具** 界面中点击 “forward”。
[![install grub menu and kernel to fix boot menu](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub-menu-and-kernel-to-fix-boot-menu.jpg?1498055715)][9]
现在你会看到这个界面。 复制在那里提到的命令,并将其粘贴到终端中,然后按回车并让其执行此操作。 需要一段时间所以请耐心等待它将下载GRUB、内核或任何修复您的引导所需的内容。
[![install grub](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/install-grub.jpg?1498055780)][10]
现在你可能会看到一些选项用于配置安装 GRUB 的位置。 选择“yes”然后按回车你会看到上面的界面。使用空格键选择选项和按 TAB 以浏览选项。 选择并安装 GRUB 后,可以关闭终端。 现在在启动修复工具屏幕中选择 “forward” 选项。
[![scan for the boot issues](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/scan-for-the-boot-issues.jpg?1498055908)][11]
现在它会做一些扫描操作,并且会询问你一些需要确认的一些选项。 每个选项都选择是即可。
[![fixed boot issues with boot rescue](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/fixed-boot-issues-with-boot-rescue.jpg?1498056040)][12]
它会显示一个成功的确认消息。 如果没有,并且显示失败的消息,则将生成链接。 转到该链接获取更多帮助。
成功后,重启你的电脑。 当你重新启动时,你会看到 GRUB。 现在已成功维修您的电脑。 一切顺利。
### 引导修复的高级技巧
当我的电脑出现双引导启动画面时,我发现在修复时,它无法识别 [安装在另一个分区上的 Windows 7][19]。 这里有一个简单的提示来帮你解决这个问题。
打开终端并安装 os-prober。 它很简单,可以在软件中心或通过终端找到。
os-prober 可以帮助您识别安装在 PC 上的其他操作系统。
[![install os-prober](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-os-prober_orig.jpg)][13]
os-prober 安装完成后,通过输入 `os-prober` 在终端运行它。 如果失败了那么试着用 root 账号运行它。 之后运行`update-grub` 命令。 这就是你可以用于从 GRUB 中启动 Windows 的所需要做的全部。
[![upgrade-grub in linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/upgrade-grub-in-linux.jpg?1498056179)][14]
### 总结
以上就是全部的内容。现在你已经成功地修复了你的 PC。
--------------------------------------------------------------------------------
via: http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
作者:[linuxandubuntu][a]
译者:[chenxinlong](https://github.com/chenxinlong)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
[1]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-boot-repair-tool-in-linux_orig.jpg
[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/run-boot-repair-from-apps-menu_orig.jpg
[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/scan-boot-issues-with-boot-repair_orig.jpg
[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/boot-repair-app-menu-to-repair-system_orig.jpg
[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/apply-recommended-fixes-to-fix-grub-issues_orig.jpg
[7]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/fix-the-grub-menu-using-boot-repair_orig.jpg
[8]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/confirm-grub-packages-installation_orig.jpg
[9]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-grub-menu-and-kernel-to-fix-boot-menu_orig.jpg
[10]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-grub_orig.jpg
[11]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/scan-for-the-boot-issues_orig.jpg
[12]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/fixed-boot-issues-with-boot-rescue_orig.jpg
[13]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/install-os-prober_orig.jpg
[14]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/upgrade-grub-in-linux_orig.jpg
[15]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems
[16]:http://www.linuxandubuntu.com/home/boot-repair-tool-repair-the-most-boot-related-problems#comments
[17]:http://www.linuxandubuntu.com/home/category/distros
[18]:http://www.linuxandubuntu.com/home/linux-kernel-40-codenamed-hurr-durr-im-a-sheep-released-installupgrade-in-ubuntulinux-mint
[19]:http://www.linuxandubuntu.com/home/how-to-dual-boot-windows-7-and-ubuntu

View File

@ -0,0 +1,119 @@
如何关闭一个不活动的或者空闲的 SSH 会话
============================================================
让我们来假设一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因会导致你的会话连接断开。
你可能会再次登录服务器继续工作也可能不会,但是你始终会留下之前没有关闭的 ssh 会话。
如何关闭一个不活动的 ssh 会话?首先使用 `w` 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 `pstree` 命令来获取空闲会话的 PID最后就是使用 `kill` 命令来关闭会话了。
建议阅读:[MoshMobile Shell- 最好的SSH 远程连接替代选项][3]
### 如何识别不活动的或者是空闲的 SSH 会话
登录系统通过 `w` 命令来查看当前有多少用户登录着。如果你识别出了自己的会话连接就可以记下其它不活动或者是空闲的 ssh 会话去关闭。
在我当前的例子中,能看见两个用户登录着,其中一个是我当前在执行 `w` 命令的 ssh 会话另一个就是之前的空闲会话了。
```
# w
10:36:39 up 26 days, 20:29, 2 users, load average: 0.00, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash
root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w
```
### 如何获取 SSH 会话的 PID
为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 PID。我们可以执行 `pstree` 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。
你会获得与下方示例中相似的输出。`pstree` 命令的输出会比这个多得多,为了更好的理解我删去了许多不相关的内容。
```
# pstree -p
init(1)-+-abrtd(2131)
|-acpid(1958)
|-httpd(32413)-+-httpd(32442)
|
|-mingetty(2198)
|-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
|
|-php(32456)-+-php(32457)
|
|-sshd(2023)-+-sshd(10132)---bash(10136)
| `-sshd(10199)---bash(10208)---pstree(10226)
|-udevd(774)-+-udevd(2191)
`-udevd(27282)
```
从上方的输出中,你可以看到 `sshd` 进程与分支的树形图。`sshd` 的主进程是 `sshd2023`,另两个分支分别为 `sshd10132``sshd10199`
跟我在文章开始讲的相同,其中一个是我新的会话连接 `sshd10199` 它展示了我正在执行的 `pstree` 命令,因此空闲会话是另一个进程为 `sshd10132`
- 建议阅读:[如何通过标准的网页浏览器来接入 Secure Shell (SSH) 服务器][4]
- 建议阅读:[PSSH - 在多台 Linux 服务器上并行的执行命令][5]
### 如何关闭空闲 SSH 会话
我们已经获得了有关空闲会话的所有信息。那么,就让我们来使用 `kill` 命令来关闭空闲会话。请确认你将下方的 PID 替换成了你服务器上的空闲会话 PID。
```
# kill -9 10132
```
LCTT 译注:这里介绍另一个工具 `pkill`,使用 `pkill -t pts/0 -kill` 就可以关闭会话, debian 8 下可用,有些版本似乎需要更改 `-kill` 的位置)
### 再次查看空闲会话是否已经被关闭
再次使用 `w` 命令来查看空闲会话是否已经被关闭。没错,只有那个我自己的当前会话还在,因此那个空闲会话已经被关闭了。
```
# w
10:40:18 up 26 days, 20:33, 1 user, load average: 0.11, 0.04, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w
```
- 建议阅读:[rtop - 一个好用的通过 SSH 来监控远程服务器的工具][6]
- 建议阅读:[DSH - 同时在多台 Linux 服务器上执行命令][7]
### 再次使用 pstree 命令检查
再次使用 `pstree` 命令确认。是的,只有那个我自己的 ssh 会话还在。
```
# pstree -p
init(1)-+-abrtd(2131)
|-acpid(1958)
|
|-httpd(32413)-+-httpd(32442)
|
|-mingetty(2198)
|-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378)
|
|-php(32456)-+-php(32457)
|
|-sshd(2023)---sshd(10199)---bash(10208)---pstree(10431)
|-udevd(774)-+-udevd(2191)
`-udevd(27282)
```
--------------------------------------------------------------------------------
via: http://www.2daygeek.com/kill-inactive-idle-ssh-sessions/
作者:[Magesh Maruthamuthu][a]
译者:[wcnnbdk1](https://github.com/wcnnbdk1)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://www.2daygeek.com/author/magesh/
[1]:http://www.2daygeek.com/author/magesh/
[2]:http://www.2daygeek.com/category/ssh-tutorials/
[3]:https://linux.cn/article-6262-1.html
[4]:http://www.2daygeek.com/shellinabox-web-based-ssh-terminal-to-access-remote-linux-servers/
[5]:http://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/
[6]:https://linux.cn/article-8199-1.html
[7]:http://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/

View File

@ -0,0 +1,92 @@
8 种在你没有时间的时候为开源做贡献的方式
============================================================
> 在忙碌的生活中抽出时间回馈给你关心的项目。
![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time")
人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][3]之一是缺乏时间。人艰不拆,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢?
为了充分披露,我需要提醒你,我延误了把这篇文章给编辑的时间,因为我抽不出时间写它,所以是否接受我的建议,请自行承担风险。
### 找出你所关心的
贡献的第一步是弄清楚你正在做些什么。你有一个你自己的为之努力的项目吗有没有一个你想要帮助的具体项目或者你只是想做_某个事情_弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。
### 找出其他的方法贡献
编写新功能可能需要数小时的设计、编码和测试。这对于那种只有几分钟时间就得离开,然后再从原来的地方重新开始的情况下并不容易。如果你没有办法进行长于 30 分钟的无中断工作,当你试着完成一个大的任务时,你或许会感到沮丧。
但还有或许可以满足你的需求的其它贡献方式,可以让你利用起来空闲的时间。其中一些可以通过智能手机快速完成,这意味着人们可以避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表:
* **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给出正确的范围,正确的严重程度等)了么?
* **邮件列表支持:** 用户或其他贡献者在邮件列表中提出了问题?也许你可以帮忙。
* **文档修补:** 文档经常(但不总是)可以比代码用更小块的时间来处理。也许有几个地方你可以补充一下,或者也许是时候浏览一下文档并确保它们仍然准确了。
* **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。在新闻聚合里投票和评论。
### 与你的老板交谈
你可能会认为在上班时间里你不能在开源项目上工作但是你有_问过么_ 特别是如果这个项目以某种方式与你的日常工作相关,那你或许可以和你的老板谈谈,让你可在工作时做出贡献。请注意,这可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做一下研究并以书面形式获得授权。
### 设置最后期限
我所学到的最佳时间管理建议可以归纳为两个规则:
1. 如果要完成,它必须有一个截止日期
2. 可以更改最后期限
这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。但你知道发生了什么事么?我设定了一个新的期限(二手才最棒!)。
如果有些事_是_时间敏感的在你需要返工一两次时设置最后期限也可以给你一些空间。
### 将它放到你的日程上
如果你使用日历安排你的生活,那用它安排一些时间来开展你的开源项目,可能是完成此项工作的唯一方法。你计划多少时间取决于你自己,但即使你每周只用一小时作为开源时间,这仍会给你每周一小时的开源时间。
这有一个秘密:有时候,如果你需要时间去做别的事情,或者什么都不想做,那么可以自己取消它。
### 开拓未使用的时间
你在通勤中感到无聊吗?你晚上睡觉困难么?也许你可以利用这个时间来贡献。现在我认为“每周完全投入工作 169 个小时”的生活方式是一件非常可怕的事情。也就是说,有些夜晚你不能入睡。也许你已经意识到了可以做贡献,而不是躺在床上看看你的 Twitter 上的朋友在世界的另一边做了什么(如我做的)。但是不要养成放弃睡眠的习惯。
### 停止
有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避开你的生理和心理的需要,它们会找上你。花点时间来休息,这也许可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。
### 说“不”
我不擅长这个,所以我做的并不好。但是没有人能做到任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。
几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出下台。我已经做了一两次,没有人想要替代我,所以我继续保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导了。我还是很喜欢这份工作,但我有一份全职的工作,而且在研究生读到一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。
如果你正在努力抽出时间来满足你的义务(自我强加的或者不是),那么也许现在是重新考虑你的角色了。这对于你自己创建的或者已经大量投资的项目来说很困难,但有时你不得不这么做——为了你自己好以及项目本身。
### 其他还有什么?
你如何找到时间作出贡献? 让我们在评论中知道。
题图 opensource.com
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
----------
via: https://opensource.com/article/17/6/find-time-contribute
作者:[Ben Cotton][a]
译者:[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/bcotton
[1]:https://opensource.com/article/17/6/find-time-contribute?rate=qWRgPXlhEZchh_vXEplj6jLXd7P0QCwzxZFWYkqawCc
[2]:https://opensource.com/user/30131/feed
[3]:http://naramore.net/blog/why-people-don-t-contribute-to-os-projects-and-what-we-can-do-about-it
[4]:https://opensource.com/users/bcotton
[5]:https://opensource.com/article/17/6/find-time-contribute#comments

View File

@ -0,0 +1,79 @@
Ring :一个专注隐私,开源的 Skype 替代品
============================================================
![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png)
**如果你对 Linux 上的 Skype 进度不满意,或者对即将[换代的、旧的但是优秀的Qt Skype 客户端][3]感到不快,这有一个 GNU 替代品叫 Ring。**
GNU Ring 是一个跨平台、关注隐私的交流程序,它很快得到了 FOSS 以及安全圈的注意。
就像一个 **Skype 的开源替代品**,不用背负微软 VoIP 客户端的那些东西Ring 不仅能够做大多数 Skype 能够做的,还能以安全、让人放心的私密方式做到:
* 语音电话
* 电话会议
* 视频电话
* 即时通信
所有这些功能也可以跨设备运行。你同伴使用的是使用 Windows 版 Ring 或者 Android 版 Ring 都不重要。只要他们在 Ring 上,你就能联系他们!
Ring 通过分布式对等网络工作。这意味着它不用依赖于一个大型集中式服务器以存储你所有详细信息、通话记录和帐户信息。相反,该服务使用分布式哈希表建立通信。
[Ring 网站][9]使用端到端加密的认证sic、使用 X.509 证书管理身份、并且基于 RSA/AES/DTLS/SRTP 技术。
### 下载 Linux 版 Ring
你可以从项目网站或者按照下面的安装指导在 Ubuntu 上添加 Ring 的官方仓库来[下载 Linux 版 Ring][11]。这里有两个版本的客户端KDE 版本和 GNOME 版本。
如果你运行的 Ubuntu 带有 Unity 或者 GNOME Shell就选择 GNOME 版本。
如果你对安装感到疑惑,项目网站上有一个一个[手把手的教程][12]。
官方网站上还有直接的 Windows、macOS 和 Android 版链接。
#### 在 Ubuntu 上设置 Ring
当你安装完 Linux 版客户端后,你就能够使用了:在开始打电话前,你只需注册一个 Ring ID。
Ring 的注册不同于 Skype、Telegram 和 WhatsApp 那样。你**不必**绑定一个手机号或者邮箱。
取而代之的是 Ring 会要求你输入一个用户名(你可以任意输入),接着会分配你一个冗长的身份号码。你需要给其他 Ring 用户发送这个身份号码,那么他们可以给你打电话。
要**在 Ring 中打第一通电话**,你需要主程序的搜索栏输入联系人的 Ring ID接着点击电话按钮拨打电话。
其他事情应该相对直接。你可以在其他设备上安装 Ring 并用你的帐户验证,这样你就不会错过任何一个电话(如果你在 Android 设备上安装,你可以扫描二维码来快速设置)。
Ring 的细节以及配置存储你家目录下的配置文件夹内的 `dring.yml` 中。
### Ring 怎么样?
这篇文章“垃圾”的部分是告诉你 Ring 怎么样:我不知道因为我不认识任何使用 Ring 的人。因此我没有机会真正使用它。
我尝试 Google 来查找 Ring 的评测,但是这是一个噩梦,因为程序的名字太普遍了(虽然我现在非常了解 Ring 视频门铃)。
_**如果你已经使用 Ring 或者你能够劝说至少一个你认识的人使用,那么记得回来分享一下关于连接质量和性能。**_
--------------------------------------------------------------------------------
via: https://mintguide.org/internet/795-ring-is-a-privacy-focused-open-source-skype-alternative.html
作者:[fabiomorales9999][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://mintguide.org/user/fabiomorales9999/
[1]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D
[2]:https://mintguide.org/
[3]:https://linux.cn/article-7606-1.html
[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4
[5]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D
[6]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE
[7]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html
[8]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html
[9]:https://ring.cx/
[10]:https://mintguide.org/
[11]:https://ring.cx/en/download/gnu-linux
[12]:https://ring.cx/en/tutorials/gnu-linux#RingID
[13]:https://mintguide.org/uploads/posts/2017-06/1498158697_screenshot-at-2017-06-22-12-08-39.png
[14]:https://mintguide.org/internet/

View File

@ -0,0 +1,89 @@
Chromebook 如何双启动Ubuntu 17.04 GNOME 和 Chrome OS
============================================================
> 本教程使用著名的 Crouton 安装器
![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg)
在去年我拿到我的 Acer Chromebook 11 (C740) 时,我写了一篇教程教你们如何[如何移除 Google Chrome OS 并根据你的选择安装一个 GNU/Linux 发行版][1],但是很快我觉得没意思了。
因此几个月之后,我使用了 Google 在网站上提供的恢复镜像重新安装了 Chrome OS我写入了 USB 并从 Chromebook 启动。最近,我又感到无聊了,因此我决定使用 Crouton 在我的 Acer Chromebook 11 (C740) 上安装 Ubuntu。
为什么?因为在一次会议中来的一位朋友带了他的笔记本,一台 Dell Chromebook 13在上面他运行了 Ubuntu Linux 还有 Chrome OS。看他用快捷键在两个操作系统之间切换很酷这让我也想这么做。
现在有很多教程解释如何安装不同的发行版 Ubuntu、Debian 或者 Kali Linux这些是当前 Crouton 安装器支持的 GNU/Linux 发行版),但是我想要运行最新的 Ubuntu当前是 Ubuntu 17.04 (Zesty Zapus),它有 GNOME 3.24 桌面环境。
### 如何启用开发者模式并下载 Crouton
当我询问我的朋友他在他的 Chromebook 上运行的是什么 Ubuntu 时,回答是 Ubuntu 14.04 LTS (Trusty Tahr),我不得不承认这让我有点失望。我回家后立刻拿出我的 Chromebook 并尝试看看我是否能运行带有桌面环境的 Ubuntu 17.04。
我做的第一件事情是将我的 Chromebook 变成开发者模式。为此,你需要关闭你的 Chromebook 但不关闭翻盖,接着同时按住 `ESC`、`Refresh` 和 `Power` 键几秒直到进入恢复模式,这会擦除 Chromebook 上的所有数据。
进入开发者模式会花费你几分钟,所以耐心点。当准备完成后,你需要登录你的 Google 账户,并设置各种东西,比如壁纸或者头像之类。现在你进入开发者模式了,在你的 Chromebook 中访问这篇教程并[下载 Crouton][2],它会保存在下载文件夹中。
### 如何使用 Crouton 安装带有 GNOME 3.24 的 Ubuntu 17.04
现在打开 Google Chrome 并按下 `CTRL+ALT+T` 打开 Chrome OS 的终端模拟器,它叫做 crosh。在命令提示符中输入 `shell` 命令,按下回车进入 Linux shell。让我们看看 Crouton 能为我们做什么。
这有两个命令(下面列出的),你可以运行它们查看 Crouton 支持的 GNU/Linux 发行版和桌面环境,并且我可以告诉你这可以安装 Debian 7 “Wheezy”、Debian 8 “Jessie”、Debian 9 “Stretch” 和 Debian Sid、Kali Linux 滚动版还有 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS 等等。
```
sh -e /Downloads/crouton -r list -  ### 会列出支持的发行版
sh -e /Downloads/crouton -t list -  ### 会列出支持的桌面
```
Crouton 也会列出一系列 Debian、Kali 和 Ubuntu 的旧发行版,但它们在上游被中止支持了(这些的名字后面都被标记了感叹号),并且因为安全风险你不应该安装它们,还有两个尚未支持的 Ubuntu 版本Ubuntu 16.10 和 Ubuntu 17.04。
Crouton 开发者说这些“不支持”的 Ubuntu 版本用一些方法可能也可以使用,但是我试了一下并使用下面的命令安装了带有 GNOME 3.24 桌面环境(没有额外的应用)的 Ubuntu 17.04 (Zesty Zapus)。我使用 `-e` 参数来加密安装。
```
sh -e /Downloads/crouton -e -r zesty -t gnome
```
将所有的都下载下来并安装在 Crouton 在你的 Chromebook 中创建的 chroot 环境中会花费一些时间,因此再说一次,请耐心。当一切完成后,你会知道,并且你能通过在 shell 中运行下面的命令启动 Ubuntu 17.04。
```
sudo startgnome
```
瞧!我在我的旧 Acer Chromebook 11 (C740) 上运行着带有 GNOME 3.24 桌面环境的 Ubuntu 17.04 (Zesty Zapus),这笔记本 Google 还尚未支持 Android 程序。最棒的部分是我能够使用 `CTRL+ALT+Shift`+`Back`/`Forward` 键盘快捷键快速在 Chrome OS 和 Ubuntu 17.04 之间切换。
![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg)
作为这篇笔记的结尾,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”当你看到它时请按 `CTRL+D`。玩得开心!
![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg)
![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg)
--------------------------------------------------------------------------------
via: http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
作者:[Marius Nestor][a]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:http://news.softpedia.com/editors/browse/marius-nestor
[1]:http://news.softpedia.com/news/here-s-how-to-install-any-linux-operating-system-on-your-chromebook-506212.shtml
[2]:https://goo.gl/fd3zc
[3]:http://news.softpedia.com/editors/browse/marius-nestor
[4]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml#
[5]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml&t=1498358928&utm_campaign=widgets&utm_medium=web&utm_source=flipit&utm_content=news.softpedia.com
[6]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml#
[7]:http://twitter.com/intent/tweet?related=softpedia&via=mariusnestor&text=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
[8]:https://plus.google.com/share?url=http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml
[9]:http://news.softpedia.com/newsTag/Ubuntu%2017.04
[10]:http://news.softpedia.com/newsTag/GNOME%203.24
[11]:http://news.softpedia.com/newsTag/Chromebook
[12]:http://news.softpedia.com/newsTag/Acer%20Chrombook%2011
[13]:http://news.softpedia.com/newsTag/Linux
[14]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg
[15]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg
[16]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg
[17]:https://twitter.com/intent/follow?screen_name=mariusnestor
[18]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg

View File

@ -0,0 +1,96 @@
如何将树莓派变成电子书服务器
============================================================
> Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。
![How to turn a Raspberry Pi into an eBook server](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_mobile_phone.png?itok=Ep49JfKU "How to turn a Raspberry Pi into an eBook server")
最近 [Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读电子书!注意 Raspbian 的仓库还没有更新它(截至写作时)。
电子书是教师、图书馆员和其他人与学生共享书籍、课堂资料或其他文件的好方法,只需要你有可靠的带宽接入即可。但是,即使你的连接速度较慢或无法连接,还有一个简单的解决方案:使用在树莓派 3 上运行的开源 Calibre 电子书管理软件创建电子书服务器。这是我所做的,你也可以。
首先我下载了最新的 [Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD连接了键盘、鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 `sudo apt-get update` 以获取操作系统的最新更新。
![Updating Raspbian Pixel](https://opensource.com/sites/default/files/u128651/1updateos.png "Updating Raspbian Pixel")
接下来,我在终端中输入 `sudo apt-get install calibre` 来安装 [Calibre][15]。
![Installing Calibre](https://opensource.com/sites/default/files/u128651/2install_calibre.png "Installing Calibre")
我从命令行启动了 Calibre注意它也可以从 GUI 启动。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 “Calibre Library” 更改为 “CalibreLibrary”一个词因为这启动内容服务器时更容易。
在选择完我的 Calibre 内容位置后,我准备好开始下载书了。
![Calibre's interface](https://opensource.com/sites/default/files/u128651/3calibre-interface.png "Calibre's interface")
我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM][16] 的材料,所以我选择 [Project Gutenberg][17] 作为我的源。Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”并得到10个结果。
![Searching for e-books](https://opensource.com/sites/default/files/u128651/4books.png "Searching for e-books")
我选择了 _Adventures of Huckleberry Finn_ 这本书。在下一页面上,我可以选择 **MOBI****EPUB** 这两种电子书格式。我选择了 EPUB这本书下载得很快。
![Choosing the e-book format](https://opensource.com/sites/default/files/u128651/5ebook-formats.png "Choosing the e-book format")
你也可以从其他内容提供商向库中添加图书,而不是在 Calibre 的列表中添加图书。例如,老师可以通过该内容服务器与学生分享电子书格式的开放教育资源。要加载内容,请使用界面最左侧的 “Add Books” 选项。
根据你图书库的大小,你也许需要增加 microSD 卡的大小。
![start_the_server.png](https://opensource.com/sites/default/files/images/life-uploads/start_the_server.png)
将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 `ifconfig` 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。
![Identifying the IP address with ipconfig](https://opensource.com/sites/default/files/u128651/6ipconfig.png "Identifying the IP address with ipconfig")
我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **http://192.168.1.10:8080** (根据你 Pi 的地址来适配)。
你会在浏览器中看到主页:
![Calibre's client homepage](https://opensource.com/sites/default/files/u128651/7calibre-home.png "Calibre's client homepage")
我已经测试,并能用 iPhone、Linux、MacOS 计算机轻易连接到服务器。
你可以在这个主页总探索选项,或者点击 **All Books** 显示服务器上的所有内容。
![Browsing e-books](https://opensource.com/sites/default/files/u128651/8browsing-books.png "Browsing e-books")
从这里,你可以下载书到你的设备并离线阅读了。
你还没有设置一台电子书服务器么?或者你考虑自己设置一台么?在评论中分享你的建议或者问题。
--------------------------------------------------------------------------------
作者简介:
Don Watkins - 教育家、教育技术专家、企业家、开源倡导者。教育心理学硕士、教育领导硕士、Linux 系统管理员、CCNA、使用 Virtual Box 虚拟化。关注我 @Don_Watkins
-----------------
via: https://opensource.com/article/17/6/raspberrypi-ebook-server
作者:[Don Watkins][a]
译者:[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/don-watkins
[1]:https://opensource.com/file/356446
[2]:https://opensource.com/file/356451
[3]:https://opensource.com/file/356456
[4]:https://opensource.com/file/356461
[5]:https://opensource.com/file/356466
[6]:https://opensource.com/file/356471
[7]:https://opensource.com/file/356476
[8]:https://opensource.com/file/356481
[9]:https://opensource.com/article/17/6/raspberrypi-ebook-server?rate=60Tv_hObNU1MQs2f3G6kNoT4qLyxJ03S1q75p2UEOYg
[10]:http://192.168.1.10:8080/
[11]:https://opensource.com/user/15542/feed
[12]:https://the-digital-reader.com/2017/06/19/calibre-3-0-released/
[13]:https://www.raspberrypi.org/downloads/raspbian/
[14]:https://www.raspberrypi.org/forums/viewtopic.php?t=5851
[15]:https://calibre-ebook.com/
[16]:https://en.wikipedia.org/wiki/Digital_rights_management
[17]:https://www.gutenberg.org/
[18]:https://opensource.com/users/don-watkins
[19]:https://opensource.com/article/17/6/raspberrypi-ebook-server#comments

View File

@ -0,0 +1,70 @@
FreeDOS 已经积极开发了 23 年的 DOS
============================================================
> 23 年后FreeDOS 仍在积极开发,并将 MS-DOS 的生命延长了几年
![4 cool facts you should know about FreeDOS ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/wings_freedos_game.jpg?itok=3O_GB-7o "4 cool facts you should know about FreeDOS ")
在 90 年代早期,我是一位 DOS 的 “资深用户”。我用 DOS 做任何事,甚至写我自己的工具来扩展 DOS 命令行。当然,我们有 Microsoft Windows但是如果你还记得当时的计算机Windows 3.1 并不是那么好,我更喜欢在 DOS 中工作。
你可能会理解,在 1994 年,当微软(在科技杂志的采访中)宣布下一个版本的 Windows 将会取消 MS-DOS 时,我感到有些困惑和不安。我想:“如果 Windows 3.2 或 4.0 看起来像 Windows 3.1 一样,我不想用它了。” 我四处选择,并决定如果 DOS 要继续下去的话,那么需要有人创建一个 DOS在 MS-DOS 消失的时候,让每个人都可以使用它。
因此在 1994 年 6 月 29 日,我在 Usenet 讨论组写了一个信息,宣布了新的 “free DOS” 项目:
> 几个月前,我发表了一篇关于启动公共领域版本的 DOS 的文章。当时对此的普遍支持是很强烈的,并且很多人同意这个声明,“开始编写!”
>
> 所以,我要……
>
> 宣布首次尝试制作 PD-DOS。我写了一份描述这样一个项目的目标和工作纲要的“清单”以及一份“任务清单”展示了需要编写些什么。我会在这里发贴让我们进行讨论。
今天,已经是 23 年之后了,[FreeDOS][3] 仍在变得更强大!
我们继续发布有新功能和特性的版本。我们的 FreeDOS 1.2 发布于 2016 年 12 月 25 日,这证明很多人喜欢使用和在 FreeDOS 上工作。当我回顾我们的历史,有一个你应该知道的关于 FreeDOS 的很酷的事实列表:
### 可以立即开始的软件开发
在原始的 DOS 中很难做任何编程。DOS 提供了一个简单的 BASIC 解释器,一些用户可以用 DEBUG 做些精巧的事情,但是你不能在 DOS 中做真正编程的事情。在 FreeDOS 中,有许多不同的工具做软件开发:编译器、汇编器、调试器、解释器和编写脚本。在你安装 FreeDOS 之后,你可以立即用 C、汇编、Pascal、Perl 和几种其他语言编写代码。
### 浏览 web
DOS 是一个老式系统,并且原本不支持开箱即用的网络。通常,你必须安装硬件的设备驱动程序才能连接到网络,一般是像 IPX 这样的简单网络。只有很少的系统会支持 TCP/IP。
在 FreeDOS 中,我们不仅包含了 TCP/IP 网络栈,我们还包含了让你浏览 web 的工具和程序。使用 Dillo 作为图形 web 浏览体验,或则使用 Lynx 以纯文本形式浏览 web。如果你只想要抓取 HTML 代码并自己操作,使用 Wget 或者 Curl。
### 玩很棒的 DOS 游戏
我们知道很多的人安装 FreeDOS 来玩经典的 DOS 游戏,运行古老的商业程序或者做嵌入式开发。使用 FreeDOS 的许多人只是拿来玩游戏那对我们来说是件很酷的事因为一个游戏很老并不意味着它很无趣。DOS 有许多很棒的游戏!安装你最喜欢的经典游戏,你会玩得很开心。
因为有如此多的人使用 FreeDOS 来玩游戏,我们现在包含了不同的 DOS 游戏。FreeDOS 1.2 包含了第一人称射击游戏像 FreeDOOM、街机射击像 Kiloblaster、飞行模拟器像 Vertigo 等等。我们目标是为每人提供一些东西。
### FreeDOS 现在已经比 MS-DOS 活的更久了
微软在 1981 年 8 月发布了 MS-DOS 1.0。13 年之后,微软在 1995 年 8 月发布 Windows 95 后抛弃了 MS-DOS虽然 MS-DOS 直到 2000 年 9 月之前一直存在。总的来说MS-DOS 是一件已经存在了 19 年的东西。
我们在 1994 年 6 月宣布了 FreeDOS并且在同年的 9 月发布了第一个 Alpha 版本。因此 FreeDOS 已经大约有 23 年了,比微软的 MS-DOS 还多了几年。确实我们在 FreeDOS 上努力的时间已经比 MS-DOS 更长了。而 FreeDOS 还将继续保持强大。
FreeDOS 与其他 DOS 另外一个重要的不同是_它仍在开发中_。我们有一个积极的开发者社区并一直在寻找新人来帮助。请加入社区并帮助构造新的 FreeDOS 版本吧。
题图 FreeDOS
--------------------------------------------------------------------------------
作者简介:
Jim Hall - 我是 FreeDOS 项目的创始人和协调者。我还担任 GNOME 基金董事会董事。在工作中,我是明尼苏达州拉姆齐县的首席信息官。在业余时间,我致力于开源软件的可用性,并通过 Outreachy之前针对妇女的 GNOME Outreach 项目)指导 GNOME 中的可用性测试。
--------
via: https://opensource.com/article/17/6/freedos-still-cool-today
作者:[Jim Hall][a]
译者:[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
[1]:https://opensource.com/article/17/6/freedos-still-cool-today?rate=_5nJLfJhQp2bzfmjkORKyU-H0g8T3mzl7gPCymnb_y0
[2]:https://opensource.com/user/126046/feed
[3]:https://opensource.com/article/17/6/www.freedos.org
[4]:https://opensource.com/users/jim-hall

View File

@ -0,0 +1,60 @@
LinkArchiver自动提交链接给互联网档案Internet Archive
============================================================
> 在 Twitter 上分享的链接可以永久保存,用户不用担心。
![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive")
互联网是永远的,当发生下面的情况的就不是了。 “链接腐烂” - 当页面移动或者站点脱机,随着时间的流逝,到网站的有效链接就会断开 - 对于尝试在线做研究的人来说,这是一个真正的问题。[互联网档案馆Internet Archive][4]通过在它的“时光机Wayback Machine”中提供提交的内容来帮助解决这个问题。
当然,困难的是让人们记得提交档案链接。
这就是 Parker Higgins 的新 Twitter 机器人所切入的地方。[@LinkArchiver][5] 会自动提交关注了[互联网档案馆Internet Archive][4]的帐户所提交的链接。如果一个 Twitter 用户关注了 [@LinkArchiver][6],它会回关,即使用户取消关注机器人,它也会继续添加链接。这意味着在 Twitter 上共享的链接可以永久保存,用户不用担心。
无需留意这个方面对 Higgins 非常有吸引力。他对 Opensource.com 说“我对整个装置的被动程度非常在意。如果你依靠人们选择什么是_重要的_来存档你会错过很多最重要的东西只要抓取每个发表链接的副本这个机器人应该有助于确保我们不会错过上下文。”
在最初开发机器人之后Higgins 联系了[互联网档案馆Internet Archive][4]。他对自动化造成问题的担忧很快被消除。尽管他在请求时给 API 请求用了一个自定义的用户代理字符串,但是他说:“他们处理的流量实际上是个舍入错误。”扩展性的问题在 Twitter 方面:其服务限制了帐户的关注者数量和新关注者的比例。这限制了 LinkArchiver 的单个实例的能力。
幸运的是LinkArchiver 以 AGPLv3 授权在 [GitHub][7] 上发布。
有了一台小的服务器和一个 Twitter 账号, 任何人都可以运行这个机器人。Higgins 设想人们运行一个关注特定的兴趣或社交圈子的 LinkArchiver 的实例。“发生在我身上的一件事是,你可以关闭回关行为,并关注特定的组或者兴趣。例如,机器人可以关注一群朋友或同学,或主要媒体,或每一个美国参议员和代表,并存档他们发表的 tweet。”
这不是 Higgins 第一次写 Twitter 机器人:[@securethenews][8]、[@pomological][9] 以及受欢迎的 [@choochoobot][10] 是他之前的作品。这些机器人都是只写的。 LinkArchiver 是他开发的第一个互动机器人,这需要学习几种新技能。这是 Higgins 参与 [Recurse Center][11] 的一部分,这是为程序员进行的为期 12 周的活动。
Higgins 鼓励大家的拉取请求以及其他的 LinkArchiver 机器人实例。
题图Beatrice Murch 拍摄的 Inernet Archive 总部; CC BY ([on Flickr][3])
--------------------------------------------------------------------------------
作者简介:
Ben Cotton - Ben Cotton 是一个受训过的气象学家和一名高性能计算机工程师。Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco)
---
via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive
作者:[Ben Cotton][a]
译者:[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/bcotton
[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8
[2]:https://opensource.com/user/30131/feed
[3]:https://www.flickr.com/photos/blmurch/5079018246/
[4]:https://archive.org/
[5]:https://twitter.com/linkarchiver
[6]:https://twitter.com/linkarchiver
[7]:https://github.com/thisisparker/linkarchiver
[8]:https://twitter.com/securethenews
[9]:https://twitter.com/pomological
[10]:https://twitter.com/choochoobot
[11]:https://www.recurse.com/
[12]:https://opensource.com/users/bcotton
[13]:https://opensource.com/users/bcotton

View File

@ -1,83 +1,84 @@
安卓编年史
安卓编年史20安卓 4.1果冻豆——Google Now 指明未来
================================================================================
![](http://cdn.arstechnica.net/wp-content/uploads/2014/03/playicons2.png)
Ron Amadeo 供图
### 安卓 4.1果冻豆——Google Now指明未来
![华硕制造的 Nexus 7安卓 4.1 的首发设备。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/ASUS_Google_Nexus_7_4_11.jpg)
华硕制造的 Nexus 7安卓 4.1 的首发设备。
![华硕制造的 Nexus 7安卓 4.1 的首发设备](http://cdn.arstechnica.net/wp-content/uploads/2014/03/ASUS_Google_Nexus_7_4_11.jpg)
随着2012年7月安卓 4.1 果冻豆的发布,谷歌的安卓发布节奏进入每六个月一发布的轨道。平台已经成熟,三个月的发布周期就没那么必要了,更长的发布周期也给了 OEM 厂商足够的时间跟上谷歌的节奏。和蜂巢不同小数点后的更新发布现在是主要更新4.1 带来了主要的界面更新和框架变化。
*华硕制造的 Nexus 7安卓 4.1 的首发设备*
果冻豆最大的变化之一,并且你在截图中看不到的是“黄油计划”,谷歌工程师齐心努力让安卓的动画顺畅地跑在 30FPS 上。还有一些核心变化,像垂直同步和三重缓冲,每个动画都经过优化以流畅地绘制。动画和顺滑滚动一直是安卓和 iOS 相比之下的弱点。经过在核心动画框架和单独的应用上的努力,果冻豆让安卓的流畅度大幅接近 iOS
随着 2012 年 7 月安卓 4.1 果冻豆的发布,谷歌的安卓发布节奏进入每六个月一发布的轨道。平台已经成熟,三个月的发布周期就没那么必要了,更长的发布周期也给了 OEM 厂商足够的时间跟上谷歌的节奏。和蜂巢不同小数点后的更新发布现在是主要更新4.1 带来了主要的界面更新和框架变化
和果冻豆一起到来的还有 [Nexus][2] 7由华硕生产的7英寸平板。不像之前主要是横屏模式的 XoomNexus 7 主要以竖屏模式使用像个大一号的手机。Nexus 7 展现了经过一年半的生态建设,谷歌已经准备好了给平板市场带来一部旗舰设备。和 Nexus One 和 GSM Galaxy Nexus 一样Nexus 7 直接由谷歌在线销售。尽管那些早先的设备对习惯于运营商补贴的消费者来说拥有惊人的高价Nexus 7 以仅仅 200 美元的价格推向大众市场。这个价格给你带来一部7英寸1280x800 英寸显示屏,四核 1.2GHz Tegra 3 处理器1GB 内存8GB 内置存储的设备。Nexus 7 的性价比如此之高,许多人都想知道谷歌到底有没有在其旗舰平板上赚到钱
果冻豆最大的变化之一,并且你在截图中看不到的是“黄油计划”,这个名字代表了谷歌工程师让安卓的动画顺畅地跑在 30FPS 上的努力。还有一些核心变化,像垂直同步和三重缓冲,每个动画都经过优化以流畅地绘制。动画和顺滑滚动一直是安卓和 iOS 相比之下的弱点。经过在核心动画框架和单独的应用上的努力,果冻豆让安卓的流畅度大幅接近 iOS
更小更轻7英寸这些因素促成了谷歌巨大的成功并且将谷歌带向了引领行业潮流的位置。一开始制造10英寸 iPad 的苹果,最终也不得不推出和 Nexus 7 相似的 iPad Mini 来应对。
和果冻豆一起到来的还有 [Nexus][2] 7由华硕生产的 7 英寸平板。不像之前主要是横屏模式的 XoomNexus 7 主要以竖屏模式使用像个大一号的手机。Nexus 7 展现了经过一年半的生态建设,谷歌已经准备好了给平板市场带来一部旗舰设备。和 Nexus One 和 GSM Galaxy Nexus 一样Nexus 7 直接由谷歌在线销售。尽管那些早先的设备对习惯于运营商补贴的消费者来说价格高的惊人Nexus 7 以仅仅 200 美元的价格推向大众市场。这个价格给你带来一部 7 英寸、1280x800 英寸显示屏、四核 1.2GHz Tegra 3 处理器、1GB 内存、8GB 内置存储的设备。Nexus 7 的性价比如此之高,许多人都想知道谷歌到底有没有在其旗舰平板上赚到钱。
更小、更轻、7 英寸,这些因素促成了谷歌巨大的成功,并且将谷歌带向了引领行业潮流的位置。一开始制造 10 英寸 iPad 的苹果,最终也不得不推出和 Nexus 7 相似的 iPad Mini 来应对。
![4.1 的新锁屏设计,壁纸,以及系统按钮新的点击高亮。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/picture.png)
4.1 的新锁屏设计,壁纸,以及系统按钮新的点击高亮。
Ron Amadeo 供图
*4.1 的新锁屏设计,壁纸,以及系统按钮新的点击高亮。
[Ron Amadeo 供图]*
蜂巢引入的电子风格在冰淇淋三明治中有所减少,果冻豆在此之上走得更远。它开始从系统中大范围地移除蓝色。迹象就是系统按钮的点击高亮从蓝色变为了灰色。
![新应用阵容合成图以及新的消息可展开通知面板。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/jb-apps-and-notications.png)
新应用阵容合成图以及新的消息可展开通知面板。
Ron Amadeo 供图
通知中心面板完全重制了这个设计一直沿用到今天的奇巧巧克力KitKat。新面板扩展到了屏幕顶部并且覆盖了状态栏图标这意味着通知面板打开的时候不再能看到状态栏。时间突出显示在左上角旁边是日期和设置按钮。清除所有通知按钮冰淇淋三明治中显示为一个“X”按钮现在变为阶梯状的按钮象征着清除所有通知的时候消息交错滑动的动画效果。底部的面板把手从一个小圆换成了一条直线和面板等宽。所有的排版都发生了变化——通知面板的所有项现在都使用了更大更细的字体。通知面板是另一个从冰淇淋三明治和蜂巢中引入的蓝色元素被移除的屏幕。除了触摸高亮之外整个通知面板都是灰色的。
*新应用阵容合成图以及新的消息可展开通知面板。
[Ron Amadeo 供图]*
通知面板也引入了新功能。相较于之前的两行设计现在的通知消息可以展开以显示更多信息。通知消息可以显示最多8行文本甚至还能在消息底部显示按钮。屏幕截图通知消息底部有个分享按钮你也可以直接从未接来电通知拨号或者将一个正在响铃的闹钟小睡这些都可以在通知面板完成。新通知消息默认展开但当它们堆叠到一起时会恢复原来的尺寸。在通知消息上双指向下滑动可以展开消息。
通知中心面板完全重制了这个设计一直沿用到今天的奇巧巧克力KitKat。新面板扩展到了屏幕顶部并且覆盖了状态栏图标这意味着通知面板打开的时候不再能看到状态栏。时间突出显示在左上角旁边是日期和设置按钮。清除所有通知的按钮在冰淇淋三明治中显示为一个“X”按钮现在变为阶梯状的按钮象征着清除所有通知的时候消息交错滑动的动画效果。底部的面板把手从一个小圆换成了一条直线和面板等宽。所有的排版都发生了变化——通知面板的所有项现在都使用了更大更细的字体。通知面板是另一个从冰淇淋三明治和蜂巢中引入的蓝色元素被移除的屏幕。除了触摸高亮之外整个通知面板都是灰色的。
通知面板也引入了新功能。相较于之前的两行设计,现在的通知消息可以展开以显示更多信息。通知消息可以显示最多 8 行文本,甚至还能在消息底部显示按钮。屏幕截图通知消息底部有个分享按钮,你也可以直接从未接来电通知中拨号,或者将一个正在响铃的闹钟小睡,这些都可以在通知面板完成。新通知消息默认展开,但当它们堆叠到一起时会恢复原来的尺寸。在通知消息上双指向下滑动可以展开消息。
![新谷歌搜索应用,带有 Google Now 卡片,语音搜索,以及文字搜索。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/googlenow.png)
新谷歌搜索应用,带有 Google Now 卡片,语音搜索,以及文字搜索。
Ron Amadeo 供图
果冻豆中不止对安卓而言也是对谷歌来说最大的特性是新版谷歌搜索应用。它带来了“Google Now”一个预测性搜索功能。Google Now 在搜索框下面显示为几张卡片,它会提供谷歌认为你所关心的事物的搜索结果。就比如谷歌地图搜索你最近在桌面电脑查找的地点或日历的约会地点,天气,以及旅行时回家的时间。
*新谷歌搜索应用,带有 Google Now 卡片,语音搜索,以及文字搜索。
[Ron Amadeo 供图]*
新版谷歌搜索应用自然可以从谷歌图标启动,但它还可以在任意屏幕从系统栏上滑访问。长按系统栏会唤出一个类似锁屏解锁的环。卡片部分纵向滚动,如果你不想看到它们,可以滑动消除它们。语音搜索是更新的一个大部分。提问不是无脑地输入进谷歌,如果谷歌知道答案,它还会用文本语音转换引擎回答你。传统的文字搜索当然也受支持。只需点击搜索栏然后开始输入即可
果冻豆中不止对安卓而言也是对谷歌来说最大的特性是新版谷歌搜索应用。它带来了“Google Now”一个预测性搜索功能。Google Now 在搜索框下面显示为几张卡片,它会提供谷歌认为你所关心的事物的搜索结果。就比如谷歌地图搜索你最近在桌面电脑查找的地点或日历的约会地点、天气,以及旅行时回家的时间
谷歌经常将 Google Now 称作“谷歌搜索的未来”。告诉谷歌你想要什么这还不够好。谷歌想要在你之前知道你想要什么。Google Now 用谷歌所有的数据挖掘关于你的知识为你服务,这也是谷歌对抗搜索引擎竞争对手,比如必应,最大的优势所在。智能手机比你拥有的其它设备更了解你,所以该服务在安卓上首次亮相。但谷歌慢慢也将 Google Now 加入 Chrome最终似乎会到达 Google.com
新版谷歌搜索应用自然可以从谷歌图标启动,但它还可以在任意屏幕从系统栏上滑访问。长按系统栏会唤出一个类似锁屏解锁的环。卡片部分纵向滚动,如果你不想看到它们,可以滑动消除它们。语音搜索是更新的一个大部分。提问不是无脑地输入进谷歌,如果谷歌知道答案,它还会用文本语音转换引擎回答你。传统的文字搜索当然也支持。只需点击搜索栏然后开始输入即可
尽管功能很重要,但同时 Google Now 是谷歌产品有史以来最重要的设计工作也是毋庸置疑的。谷歌搜索应用引入的白色卡片审美将会成为几乎所有谷歌产品设计的基础。今天,卡片风格被用在 Google Play 商店以及所有的 Play 内容应用Youtube谷歌地图DriveKeepGmailGoogle+以及其它产品。同时也不限于安卓应用。不少谷歌的桌面站点和 iOS 应用也以此设计为灵感。设计是谷歌历史中的弱项之一,但 Google Now 开始谷歌最终在设计上采取了行动,带来一个统一的,全公司范围的设计语言。
谷歌经常将 Google Now 称作“谷歌搜索的未来”。告诉谷歌你想要什么这还不够好。谷歌想要在你之前知道你想要什么。Google Now 用谷歌所有的数据挖掘关于你的知识为你服务,这也是谷歌对抗搜索引擎竞争对手,比如必应,的最大优势所在。智能手机比你拥有的其它设备更了解你,所以该服务在安卓上首次亮相。但谷歌慢慢也将 Google Now 加入 Chrome最终似乎会到达 Google.com。
尽管功能很重要,但同时 Google Now 是谷歌产品有史以来最重要的设计工作也是毋庸置疑的。谷歌搜索应用引入的白色卡片审美将会成为几乎所有谷歌产品设计的基础。今天,卡片风格被用在 Google Play 商店以及所有的 Play 内容应用Youtube、谷歌地图、Drive、Keep、Gmail、Google+ 以及其它产品。同时也不限于安卓应用。不少谷歌的桌面站点和 iOS 应用也以此设计为灵感。设计是谷歌历史上的弱项之一,但 Google Now 开始谷歌最终在设计上采取了行动,带来一个统一的,全公司范围的设计语言。
![又一个 Youtube 重新设计,信息密度有所下降。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/yotuube.png)
又一个 Youtube 的重新设计,信息密度有所下降。
Ron Amadeo 供图
又一个版本,又一个 Youtube 的重新设计。这次列表视图主要基于略缩图,大大的图片占据了屏幕的大部分。信息密度在新列表设计中有所下降。之前 Youtube 每屏大约能显示6个项目现在只能显示3个。
*又一个 Youtube 的重新设计,信息密度有所下降。
[Ron Amadeo 供图]*
又一个版本,又一个 Youtube 的重新设计。这次列表视图主要基于略缩图,大大的图片占据了屏幕的大部分。信息密度在新列表设计中有所下降。之前 Youtube 每屏大约能显示 6 个项目,现在只能显示 3 个。
Youtube 是首批在应用左侧加入滑动抽屉的应用之一,该特性会成为谷歌应用的标准设计风格。抽屉中有你的账户的链接和订阅频道,这让谷歌可以去除页面顶部标签页设计。
![Google Play 服务的职责以及安卓的剩余部分职责。](http://cdn.arstechnica.net/wp-content/uploads/2013/08/playservicesdiagram2.png)
Google Play 服务的职责以及安卓的剩余部分职责。
Ron Amadeo 供图
### Google Play Services—fragmentation and making OS versions (nearly) obsolete ###
*Google Play 服务的职责以及安卓的剩余部分职责。
[Ron Amadeo 供图]*
### Google Play 服务——碎片化和让系统版本(几乎)过时 ###
碎片化那时候看起来这并不是个大问题但2012年12月Google Play 服务 1.0 面向所有安卓2.2及以上版本的手机推出。它添加了一些 Google+ API 和对 OAuth 2.0 的支持。
碎片化那时候看起来这并不是个大问题,但 2012 12 Google Play 服务 1.0 面向所有安卓 2.2 及以上版本的手机推出。它添加了一些 Google+ API 和对 OAuth 2.0 的支持。
尽管这个升级听起来很无聊,但 Google Play 服务最终会成长为安卓整体的一部分。Google Play 服务扮演着正常应用和安卓系统的中间角色,使得谷歌可以升级或替换一些核心组件,并在不发布新安卓版本的前提下添加 API。
有了 Play 服务,谷歌有了直接接触安卓手机核心部分的能力,而不用通过 OEM 更新一集运营商批准的过程。谷歌使用 Play 服务添加了全新的位置系统,恶意软件扫描,远程擦除功能,以及新的谷歌地图 API所有的这一切都不用通过发布一个系统更新实现。正如我们在姜饼部分的结尾提到的感谢 Play 服务里这些“可移植的”API 实现,姜饼仍然能够下载现代版本的 Play 商店和许多其他的谷歌应用。
有了 Play 服务,谷歌有了直接接触安卓手机核心部分的能力,而不用通过 OEM 更新一集运营商批准的过程。谷歌使用 Play 服务添加了全新的位置系统、恶意软件扫描、远程擦除功能,以及新的谷歌地图 API所有的这一切都不用通过发布一个系统更新实现。正如我们在姜饼部分的结尾提到的感谢 Play 服务里这些“可移植的”API 实现,姜饼仍然能够下载现代版本的 Play 商店和许多其他的谷歌应用。
另一个巨大的益处是安卓用户基础的兼容性。最新版本的安卓系统要经过很长时间到达大多数用户手中,这意味着最新版本系统绑定的 API 在大多数用户升级之前对开发者来说没有任何意义。Google Play 服务兼容冻酸奶及以上版本换句话说就是99%的活跃设备,并且更新可以直接通过 Play 商店直接推送到手机上。通过将 API 包含在 Google Play 服务中而不是安卓中,谷歌可以在一周内将新 API 推送到几乎所有用户手中。这对许多版本碎片化引起的问题来说是个[伟大的解决方案][3]。
另一个巨大的益处是安卓用户基础的兼容性。最新版本的安卓系统要经过很长时间到达大多数用户手中,这意味着最新版本系统绑定的 API 在大多数用户升级之前对开发者来说没有任何意义。Google Play 服务兼容冻酸奶及以上版本,换句话说就是 99% 的活跃设备,并且更新可以直接通过 Play 商店直接推送到手机上。通过将 API 包含在 Google Play 服务中而不是安卓中,谷歌可以在一周内将新 API 推送到几乎所有用户手中。这对许多版本碎片化引起的问题来说是个[伟大的解决方案][3]。
----------
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
![Ron Amadeo](https://cdn.arstechnica.net/wp-content/uploads/2016/05/r.amadeo-45843.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron 是 Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/21/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/21/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,62 +1,70 @@
安卓编年史
安卓编年史21安卓 4.2,果冻豆——全新 Nexus 设备,全新平板界面
================================================================================
### Android 4.2,果冻豆——全新 Nexus 设备,全新平板界面 ###
### 安卓 4.2,果冻豆——全新 Nexus 设备,全新平板界面 ###
安卓平台成熟的脚步越来越快,谷歌也将越来越多的应用托管到 Play 商店需要通过系统更新来更新的应用越来越少。但是不间断的更新还是要继续的2012 年 11 月,安卓 4.2 发布。4.2 还是叫做“果冻豆”,这个版本主要是一些少量变动。
![LG 生产的 Nexus 4 和三星生产的 Nexus 10。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/unnamed.jpg)
LG 生产的 Nexus 4 和三星生产的 Nexus 10。
Google/Ron Amadeo 供图
和安卓 4.2 一同发布的还有两部旗舰设备Nexus 4 和 Nexus 10都由谷歌直接在 Play 商店出售。Nexus 4 使用了 Nexus 7 的策略,令人惊讶的低价和高质量,并且无锁设备售价 300 美元。Nexus 4 有一个 4 核 1.5GHz 骁龙 S4 Pro 处理器2GB 内存以及 1280×768 分辨率 4.7 英寸 LCD 显示屏。谷歌的新旗舰手机由 LG 生产并和制造商一起将关注点转向了材料和质量。Nexus 4 有着正反两面双面玻璃这会让你爱不释手他是有史以来触感最佳的安卓手机之一。Nexus 4 最大的缺点是没有 LTE 支持,那时候大部分手机,包括 Version Galaxy Nexus 都有更快的基带。但 Nexus 4 的需求仍大大超出了谷歌的预料——发布当日大量的流量拖垮了 Play 商店网站。手机在一小时之内销售一空。
*LG 生产的 Nexus 4 和三星生产的 Nexus 10。
[Google/Ron Amadeo 供图]*
Nexus 10 是谷歌的第一部 10 英寸 Nexus 平板。该设备的亮点是 2560×1600 分辨率的显示屏,在其等级上是分辨率最高的。这背后是双核 1.7GHz Cortex A15 处理器和 2GB 内存的强力支持。随着时间一个月一个月地流逝Nexus 10 似乎逐渐成为了第一部也是最后一部 10 英寸 Nexus 平板。通常这些设备每年都升级,但 Nexus 10 至今面世 16 个月了,可预见的未来还没有新设备的迹象。谷歌在小尺寸的 7 英寸平板上做得很出色,它似乎更倾向于让[像三星][1]这样的合作伙伴探索更大的平板家族。
和安卓 4.2 一同发布的还有两部旗舰设备Nexus 4 和 Nexus 10都由谷歌直接在 Play 商店出售。Nexus 4 使用了 Nexus 7 的策略,令人惊讶的低价和高质量,并且无锁设备售价 300 美元。Nexus 4 有一个 4 核 1.5GHz 骁龙 S4 Pro 处理器2GB 内存以及 1280×768 分辨率 4.7 英寸 LCD 显示屏。谷歌的新旗舰手机由 LG 生产并和制造商一起将关注点转向了材料和质量。Nexus 4 有着正反两面双面玻璃这会让你爱不释手它是有史以来触感最佳的安卓手机之一。Nexus 4 最大的缺点是没有 LTE 支持,那时候大部分手机,包括 Version Galaxy Nexus 都有更快的基带。但 Nexus 4 的需求仍大大超出了谷歌的预料——发布当日大量的流量拖垮了 Play 商店网站。手机在一小时之内销售一空。
Nexus 10 是谷歌的第一部 10 英寸 Nexus 平板。该设备的亮点是 2560×1600 分辨率的显示屏,在这个等级上是分辨率最高的。这背后是双核 1.7GHz Cortex A15 处理器和 2GB 内存的强力支持。随着时间一个月一个月地流逝Nexus 10 似乎逐渐成为了第一部也是最后一部 10 英寸 Nexus 平板。通常这些设备每年都升级,但 Nexus 10 至今面世 16 个月了,可预见的未来还没有新设备的迹象。谷歌在小尺寸的 7 英寸平板上做得很出色,它似乎更倾向于让[像三星][1]这样的合作伙伴探索更大的平板家族。
![新的锁屏,壁纸,以及时钟小部件设计。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/JBvsjb.jpg)
新的锁屏,壁纸,以及时钟小部件设计。
Ron Amadeo 供图
*新的锁屏,壁纸,以及时钟小部件设计。
[Ron Amadeo 供图]*
4.2 为锁屏带来了很多变化。文字居中,并且对小时使用了较大的字重,对分钟使用了较细的字体。锁屏现在是分页的,可以自定义小部件。锁屏不仅仅是一个简单的时钟,用户还可以将其替换成其它小部件或者添加额外的页面和更多的小部件。
![锁屏的添加小部件页面,小部件列表,锁屏上的 Gmail 部件,以及滑动到相机。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/locksc2reen.jpg)
锁屏的添加小部件页面,小部件列表,锁屏上的 Gmail 部件,以及滑动到相机。
Ron Amadeo 供图
*锁屏的添加小部件页面,小部件列表,锁屏上的 Gmail 部件,以及滑动到相机。
[Ron Amadeo 供图]*
锁屏现在就像是一个精简版的主屏幕。页面轮廓会显示在锁屏的左右两侧来提示用户可以滑动到有其他小部件的页面。向左滑动页面会显示一个中间带有加号的简单空白页面,点击加号会打开兼容锁屏的小部件列表。锁屏每个页面限制一个小部件,将小部件向上或向下拖动可以展开或收起。最右侧的页面保留给了相机——一个简单的滑动就能打开相机界面,但是你没办法滑动回来。
![新的快速设置面板以及内置应用集合。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/42fix.png)
新的快速设置面板以及内置应用集合。
Ron Amadeo 供图
4.2 最大的新增特性之一就是“快速设置”面板。安卓 3.0 为平板引入了快速改变电源设置的途径4.2 终于将这种能力带给了手机。通知中心右上角加入了一枚新图标,可以在正常的通知列表和新的快速设置之间切换。快速设置提供了对屏幕亮度,网络连接,电池以及数据用量更加快捷的访问,而不用打开完整的设置界面。安卓 4.1 中顶部的设置按钮移除掉了,快速设置中添加了一个按钮来替代它。
*新的快速设置面板以及内置应用集合。
[Ron Amadeo 供图]*
应用抽屉和 4.2 中的应用阵容有很多改变。得益于 Nexus 4 更宽的屏幕横纵比53Galaxy Nexus 是 169应用抽屉可以显示一行五个应用图标的方阵。4.2 将自带的浏览器替换为了 Google Chrome自带的日历换成了 Google Calendar他们都带来了新的图标设计。时钟和相机应用在 4.2 中经过了重制新的图标也是其中的一部分。“Google Settings”是个新应用用于提供对系统范围内所有存在的谷歌账户设置的快捷方式它有着和 Google Search 和 Google+ 图标一致的风格。谷歌地图拥有了新图标,谷歌纵横,以往是谷歌地图的一部分,作为对 Google+ location 的支持在这个版本退役。
4.2 最大的新增特性之一就是“快速设置”面板。安卓 3.0 为平板引入了快速改变电源设置的途径4.2 终于将这种能力带给了手机。通知中心右上角加入了一枚新图标,可以在正常的通知列表和新的快速设置之间切换。快速设置提供了对屏幕亮度、网络连接、电池以及数据用量更加快捷的访问,而不用打开完整的设置界面。安卓 4.1 中顶部的设置按钮移除掉了,快速设置中添加了一个按钮来替代它。
应用抽屉和 4.2 中的应用阵容有很多改变。得益于 Nexus 4 更宽的屏幕横纵比5:3Galaxy Nexus 是 16:9应用抽屉可以显示一行五个应用图标的方阵。4.2 将自带的浏览器替换为了 Google Chrome自带的日历换成了 Google Calendar它们都带来了新的图标设计。时钟和相机应用在 4.2 中经过了重制新的图标也是其中的一部分。“Google Settings”是个新应用用于提供对系统范围内所有存在的谷歌账户设置的快捷方式它有着和 Google Search 和 Google+ 图标一致的风格。谷歌地图拥有了新图标,谷歌纵横,以往是谷歌地图的一部分,作为对 Google+ location 的支持在这个版本退役。
![浏览器替换为 Chrome带有全屏取景器的新相机界面。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/chroemcam.jpg)
浏览器替换为 Chrome带有全屏取景器的新相机界面。
Ron Amadeo 供图
原自带浏览器在一段时间内对 Chrome 的模仿上下了不少功夫——它引入了许多 Chrome 的界面元素,许多 Chrome 的特性,甚至还使用了 Chrome 的 javascript 引擎——但安卓 4.2 来临的时候,谷歌认为安卓版的 Chrome 已经准备好替代这个模仿者了。表面上看起来没有多大不同;界面看起来不一样,而且早期版本的 Chrome 安卓版滚动起来没有原浏览器顺畅。不过深层次来说,一切都不一样。安卓的主浏览器开发现在由 Google Chrome 团队负责,而不是作为安卓团队的子项目存在。安卓的默认浏览器从绑定安卓版本发布停滞不前的应用变成了不断更新的 Play 商店应用。现在甚至还有一个每个月接收一些更新的 beta 通道。
*浏览器替换为 Chrome带有全屏取景器的新相机界面。
[Ron Amadeo 供图]*
原来的自带浏览器在一段时间内对 Chrome 的模仿上下了不少功夫——它引入了许多 Chrome 的界面元素,许多 Chrome 的特性,甚至还使用了 Chrome 的 javascript 引擎——但安卓 4.2 来临的时候,谷歌认为安卓版的 Chrome 已经准备好换下这个模仿者了。表面上看起来没有多大不同;界面看起来不一样,而且早期版本的 Chrome 安卓版滚动起来没有原浏览器顺畅。不过从深层次来说,一切都不一样。安卓的主浏览器开发现在由 Google Chrome 团队负责,而不是作为安卓团队的子项目存在。安卓的默认浏览器从绑定安卓版本发布、停滞不前的应用变成了不断更新的 Play 商店应用。现在甚至还有一个每个月接收一些更新的 beta 通道。
相机界面经过了重新设计。它现在完全是个全屏应用,显示摄像头的实时图像并且在上面显示控制选项。布局审美和安卓 1.5 的[相机设计][2]有很多共同之处:带对焦的最小化的控制放置在取景器显示之上。中间的控制环在你长按屏幕或点击右下角圆形按钮的时候显示。你的手指保持在屏幕上时,你可以滑动来选择环上的选项,通常是展开进入一个子菜单。在高亮的选项上释放手指选中它。这灵感很明显来自于安卓 4.0 浏览器中的快速控制,但是将选项安排在一个环上意味着你的手指几乎总会挡住一部分界面。
![时钟应用,从一个只有两个界面的应用变成功能强大,实用的应用。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/clock-1.jpg)
时钟应用,从一个只有两个界面的应用变成功能强大,实用的应用。
Ron Amadeo 供图
时钟应用经过了完整的改造,从一个简单的两个界面的闹钟,到一个世界时钟,闹钟,定时器,以及秒表俱全。时钟应用的设计和谷歌之前引入的完全不同,有着极简审美和红色高亮。它看起来像是谷歌的一个试验。甚至是几个版本之后,这个设计语言似乎也仅限于这个应用。
*时钟应用,从一个只有两个界面的应用变成功能强大,实用的应用。
[Ron Amadeo 供图]*
时钟的时间选择器是经过特别精心设计的。它显示一个简单的数字盘,会智能地禁用会导致无效时间的数字。设置闹钟时间也不可能没有隐式选择选择的 AM 和 PM永远地解决了不小心将 9am 的闹钟设置成 9pm 的问题。
时钟应用经过了完整的改造,从一个简单的两个界面的闹钟,到一个世界时钟、闹钟、定时器,以及秒表俱全。时钟应用的设计和谷歌之前引入的完全不同,有着极简审美和红色高亮。它看起来像是谷歌的一个试验。甚至是几个版本之后,这个设计语言似乎也仅限于这个应用。
时钟的时间选择器是经过特别精心设计的。它显示一个简单的数字盘,会智能地禁用会导致无效时间的数字。设置闹钟时间也不能在没有明确选择 AM 和 PM 时设置,永远地解决了不小心将 9am 的闹钟设置成 9pm 的问题。
![平板的新系统界面使用了延展版的手机界面。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/tablet2.jpg)
平板的新系统界面使用了延展版的手机界面。
Ron Amadeo 供图
*平板的新系统界面使用了延展版的手机界面。
[Ron Amadeo 供图]*
安卓 4.2 中最有争议的改变是平板界面,从单独一个统一的底部系统栏变成带有顶部状态栏和底部系统栏的双栏设计。新设计统一了手机和平板的界面,但批评人士说将手机界面延展到 10 英寸的横向平板上是浪费空间。因为导航按键现在拥有了整个底栏,所以他们像手机界面那样被居中。
![平板上的多用户,以及新的手势键盘。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/2014-03-06-14.55.png)
平板上的多用户,以及新的手势键盘。
Ron Amadeo 供图
*平板上的多用户,以及新的手势键盘。
[Ron Amadeo 供图]*
在平板上,安卓 4.2 带来了多用户支持。在设置里,新增了“用户”部分,你可以在这里管理一台设备上的用户。设置在每个用户账户内完成,安卓会给每个用户保存单独的设置,主屏幕,应用以及应用数据。
@ -64,17 +72,15 @@ Ron Amadeo 供图
----------
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
![Ron Amadeo](https://cdn.arstechnica.net/wp-content/uploads/2016/05/r.amadeo-45843.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/22/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/22/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,52 +1,54 @@
安卓编年史
安卓编年史22周期外更新——谁需要一个新系统
================================================================================
![Play 商店又一次重新设计!这一版非常接近现在的设计,卡片结构让改变布局变得易如反掌。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/get-em-Kirill.jpg)
Play 商店又一次重新设计!这一版非常接近现在的设计,卡片结构让改变布局变得易如反掌。
Ron Amadeo 供图
*Play 商店又一次重新设计!这一版非常接近现在的设计,卡片结构让改变布局变得易如反掌。
[Ron Amadeo 供图]*
### 周期外更新——谁需要一个新系统? ###
在安卓 4.2 和安卓 4.3 之间,谷歌进行了一次周期外更新,显示了有多少安卓可以不经过费力的 OTA 更新而得到改进。得益于[谷歌 Play 商店和 Play 服务][1],这些更新可以在不更新任何系统核心组件的前提下送达。
在安卓 4.2 和安卓 4.3 之间,谷歌进行了一次周期外更新,显示了有多少安卓可以不经过费力的 OTA 更新而得到改进。得益于[谷歌 Play 商店和 Play 服务][1],这些更新可以在不更新任何系统核心组件的前提下送达。
2013 年 4 月,谷歌发布了谷歌 Play 商店的一个主要设计改动。就如同在这之后的大多数重新设计,新的 Play 商店完全接受了 Google Now 审美,即在灰色背景上的白色卡片。操作栏基于当前页面内容部分更改颜色,由于首屏内容以商店的各部分为主,操作栏颜色是中性的灰色。导航至内容部分的按钮指向热门付费,在那下面通常是一块促销内容或一组推荐应用。
![独立的内容部分有漂亮的颜色。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/content-rainbow.jpg)
独立的内容部分有漂亮的颜色。
Ron Amadeo 供图
*独立的内容部分有漂亮的颜色。
[Ron Amadeo 供图]*
新的 Play 商店展现了谷歌卡片设计语言的真正力量在所有的屏幕尺寸上能够拥有响应式布局。一张大的卡片能够和若干小卡片组合大屏幕设备能够显示更多的卡片而且相对于拉伸来适应横屏模式可以通过在一行显示更多卡片来适应。Play 商店的内容编辑们也可以自由地使用卡片布局;需要关注的大更新可以获得更大的卡片。这个设计最终会慢慢渗透向其它谷歌 Play 内容应用,最后拥有一个统一的设计。
![Hangouts 取代了 Google Talk现在仍由 Google+ 团队继续开发。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/talkvhangouts2.jpg)
Hangouts 取代了 Google Talk现在仍由 Google+ 团队继续开发。
Ron Amadeo 供图
*Hangouts 取代了 Google Talk现在仍由 Google+ 团队继续开发。
[Ron Amadeo 供图]*
Google I/O谷歌的年度开发者会议通常会宣布一个新的安卓版本。但是 2013 年的会议,谷歌只是发布了一些改进而没有系统更新。
谷歌宣布的大事件之一是 Google Talk 的更新谷歌的即时消息平台。在很长一段时间里谷歌随安卓附四个文本交流应用Google TalkGoogle+ Messenger信息短信应用Google Voice。拥有四个应用来完成相同的任务——给某人发送文本消息——对用户来说很混乱。在 I/O 上,谷歌结束了 Google Talk 并且从头开始创建全新的消息产品 [Google Hangouts][2]。虽然最初只是想替代 Google TalkHangouts 的计划是统一所有谷歌的不同的消息应用到统一的界面下。
谷歌宣布的大事件之一是 Google Talk 的更新,谷歌的即时消息平台。在很长一段时间里,谷歌随安卓附四个文本交流应用Google TalkGoogle+ Messenger信息短信应用Google Voice。拥有四个应用来完成相同的任务——给某人发送文本消息——对用户来说很混乱。在 I/O 上,谷歌结束了 Google Talk 并且从头开始创建全新的消息产品 [Google Hangouts][2]。虽然最初只是想替代 Google TalkHangouts 的计划是统一所有谷歌的不同的消息应用到统一的界面下。
Hangouts 的用户界面布局真的和 Google Talk 没什么大的差别。主页面包含你的聊天会话点击某一项就能进入聊天页面。界面设计上有所更新聊天页面现在使用了卡片风格来显示每个段落并且聊天列表是个“抽屉”风格的界面这意味着你可以通过水平滑动打开它。Hangouts 有已读回执和输入状态指示,并且群聊现在是个主要特性。
Google+ 是 Hangouts 的中心所以产品的全名实际上是“Google+ Hangouts”。Hangouts 完全整合到了 Google+ 桌面站点。身份和头像直接从 Google+ 拉取,点击头像会打开用户的 Google+ 资料。和将浏览器换为 Google Chrome 类似核心安卓功能交给了一个单独的团队——Google+ 团队——作为对应用成为繁忙的安卓工程师的副产品的反对。随着 Google+ 团队的接手,安卓的主要即时通讯客户端现在成为一个持续开发的应用。它被放进了 Play 商店并且有稳定的更新频率。
Google+ 是 Hangouts 的中心所以产品的全名实际上是“Google+ Hangouts”。Hangouts 完全整合到了 Google+ 桌面站点。身份和头像直接从 Google+ 拉取,点击头像会打开用户的 Google+ 资料。和将浏览器换为 Google Chrome 类似核心安卓功能交给了一个单独的团队——Google+ 团队,这是变得越发繁忙的安卓工程师的抗议的结果。随着 Google+ 团队的接手,安卓的主要即时通讯客户端现在成为一个持续开发的应用。它被放进了 Play 商店并且有稳定的更新频率。
![新导航抽屉界面。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/navigation_drawer_overview1.png)
新导航抽屉界面。
图片来自 [developer.android.com][3]
谷歌还给操作栏引入了新的设计元素:导航抽屉。这个抽屉显示为在左上角应用图标旁的三道横线。点击或从屏幕左边缘向右滑动,会出现一个侧边菜单目录。就像名字所指明的,这个是用来应用内导航的,它会显示若干应用内的顶层位置。这使得应用首屏可以用来显示内容,也给了用户一致的,易于访问的导航元素。导航抽屉基本上就是个大号的菜单,可以滚动并且固定在左侧。
*新导航抽屉界面。
图片来自 [developer.android.com][3]*
谷歌还给操作栏引入了新的设计元素:导航抽屉。这个抽屉显示为在左上角应用图标旁的三道横线。点击或从屏幕左边缘向右滑动,会出现一个侧边菜单目录。就像名字所指明的,这个是用来在应用内导航的,它会显示若干应用内的顶层位置。这使得应用首屏可以用来显示内容,也给了用户一致的、易于访问的导航元素。导航抽屉基本上就是个大号的菜单,可以滚动并且固定在左侧。
----------
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
![Ron Amadeo](https://cdn.arstechnica.net/wp-content/uploads/2016/05/r.amadeo-45843.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/23/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/23/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,44 +1,51 @@
安卓编年史
安卓编年史23Android 4.3,果冻豆——早早支持可穿戴设备
================================================================================
![漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/Goooogleplaymusic.jpg)
漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。
Ron Amadeo 供图
*漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。
[Ron Amadeo 供图]*
在 I/O 大会推出的另一个应用更新是 Google Music 应用。音乐应用经过了完全的重新设计最终摆脱了蜂巢中引入的蓝底蓝色调的设计。Play Music 的设计和几个月前发布的 Play 商店一致有着响应式的白色卡片布局。Music 同时还是最早采用新抽屉导航样式的主要应用之一。谷歌还随新应用发布了 Google Play Music All Access每月 10 美元的包月音乐订阅服务。Google Music 现在拥有订阅计划音乐购买以及云端音乐存储空间。这个版本还引入了“Instant Mix”谷歌会在云端给相似的歌曲计算出一份歌单。
![一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述登陆游戏触发的权限对话框Play Games 通知,以及成就界面。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/gooooogleplaygames.jpg)
一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述登陆游戏触发的权限对话框Play Games 通知,以及成就界面。
Ron Amadeo 供图
谷歌还引入了“Google Play Games”一个后端服务开发者可以将其附加到游戏中。这项服务简单说就是安卓版的 Xbox Live 或苹果的 Game Center。开发者可以给游戏添加 Play Games 支持,这样就能通过使用谷歌的后端服务,更简单地集成成就,多人游戏,游戏匹配,用户账户以及云端存档到游戏中。
*一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述登陆游戏触发的权限对话框Play Games 通知,以及成就界面。
[Ron Amadeo 供图]*
谷歌还引入了 “Google Play Games”一个后端服务开发者可以将其附加到游戏中。这项服务简单说就是安卓版的 Xbox Live 或苹果的 Game Center。开发者可以给游戏添加 Play Games 支持,这样就能通过使用谷歌的后端服务,更简单地将成就、多人游戏、游戏配对、用户账户以及云端存档集成到游戏中。
Play Games 是谷歌在游戏方面推进的开始。就像单独的 GPS 设备,翻盖手机,以及 MP3 播放器,智能手机的生产者希望游戏设备能够变成智能手机的一个功能点。当你有部智能手机的时候你为什么还有买个任天堂 DS 或 PS Vita 呢?一个易于使用的多人游戏服务是这项计划的重要部分,我们仍能看到这个决定最后的成果。在今天,坊间都在传言谷歌和苹果有关于客厅游戏设备的计划。
![Google Keep谷歌自 Google Notebook 以来第一个笔记服务。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/goooglekeep.jpg)
Google Keep谷歌自 Google Notebook 以来第一个笔记服务。
Ron Amadeo 供图
*Google Keep谷歌自 Google Notebook 以来第一个笔记服务。
[Ron Amadeo 供图]*
毫无疑问一些产品为了赶上 Google I/O 大会的发布准时开发完成了,[但是三个半小时内的主题][1]已经够多了一些产品在大会的发布上忽略了。Google I/O 大会的三天后一切都清楚了,谷歌带来了 Google Keep一个用于安卓和在线的笔记应用。Keep 看起来很简单,就是一个用上了响应式 Google-Now 风格设计的笔记应用。用户可以改变卡片的尺寸,从多栏布局改为单列视图。笔记可以由文本,清单,自动转文本的语音或者图片组成。笔记卡片可以拖动并在主界面重新组织,你甚至可以给笔记换个颜色。
![Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。](http://cdn.arstechnica.net/wp-content/uploads/2014/05/gmail.png)
Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。
Ron Amadeo 供图
在 I/O 大会之后没有哪些应用不在谷歌的周期外更新里。2013 年 6 月,谷歌发布了新版设计的 Gmail。最显眼的变化就是一个月前 Google I/O 大会引入的新导航抽屉界面。最吸引眼球的变化是用上了 Google+ 资料图片来取代复选框。虽然复选框看起来被去掉了,它们其实还在那,点击邮件左边的图片就是了。
*Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。
[Ron Amadeo 供图]*
在 I/O 大会之后没有哪些应用没出现在谷歌的周期外更新里。2013 年 6 月,谷歌发布了新版设计的 Gmail。最显眼的变化就是一个月前 Google I/O 大会引入的新导航抽屉界面。最吸引眼球的变化是用上了 Google+ 资料图片来取代复选框。虽然复选框看起来被去掉了,它们其实还在那,点击邮件左边的图片就是了。
![新谷歌地图,换上了全白的 Google-Now 风格主题。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/newmaps11.png)
新谷歌地图,换上了全白的 Google-Now 风格主题。
Ron Amadeo 供图
*新谷歌地图,换上了全白的 Google-Now 风格主题。
[Ron Amadeo 供图]*
一个月后,谷歌在 Play 商店发布了全新的谷歌地图。这是谷歌地图自冰淇淋三明治以来第一个经过细致地重新设计的版本。新版本完全适配了 Google Now 白色卡片审美,还大大减少了屏幕上显示的元素。新版谷歌地图似乎设计时有意使地图总是显示在屏幕上,你很难找到除了设置页面之外还能完全覆盖地图显示的选项。
这个版本的谷歌地图看起来活在它自己的小小设计世界中。白色的搜索栏“浮动”在地图之上,地图显示部分在它旁边和上面都有。这和传统的操作栏设计有所不同。一般在应用左上角的导航抽屉,在这里是在左下角。这里的主界面没有向上按钮应用图标,也没有浮动按钮。
这个版本的谷歌地图看起来活在它自己的小小设计世界中。白色的搜索栏“浮动”在地图之上,地图显示部分在它旁边和上面都有。这和传统的操作栏设计有所不同。一般在应用左上角的导航抽屉,在这里是在左下角。这里的主界面没有向上按钮应用图标,也没有浮动按钮。
![新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/newmaps21.png)
新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。
Ron Amadeo 供图
左边的图片显示的是点击了搜索栏后的效果(带键盘,这里关闭了)。过去谷歌在空搜索栏下面显示一个空页面,但在地图中,谷歌利用这些空间链接到新的“本地”页面。搜索结果页显示一般信息的结果,比如餐馆,加油站,以及景点。在结果页的底部是个列表,显示你的搜索历史和手动缓存部分地图的选项。
*新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。
[Ron Amadeo 供图]*
左边的图片显示的是点击了搜索栏后的效果(带键盘,这里关闭了)。过去谷歌在空搜索栏下面显示一个空页面,但在地图中,谷歌利用这些空间链接到新的“本地”页面。搜索结果页显示一般信息的结果,比如餐馆、加油站,以及景点。在结果页的底部是个列表,显示你的搜索历史和手动缓存部分地图的选项。
右侧图片显示的是地点页面。上面地图 7.0 的截图里显示的地图不是略缩图,它是完整的地图视图。在新版的谷歌地图中,地点作为卡片浮动显示在主地图之上,地图重新居中显示该地点。向上滑动可以让卡片覆盖地图,向下滑动可以显示带有底部一小条结果的完整地图。如果该地点是搜索结果列表中的一个,左右滑动可以在结果之间切换。
@ -46,12 +53,13 @@ Ron Amadeo 供图
### Android 4.3,果冻豆——早早支持可穿戴设备 ###
如果谷歌没有在安卓 4.3 和安卓 4.2 之间通过 Play 商店发布更新的话,安卓 4.3 会是个不可思议的更新。如果新版 Play 商店Gmail地图书籍音乐Hangouts 环聊,以及 Play Games 打包作为新版安卓的一部分,它将会作为有史以来最大的发布受到欢呼。虽然谷歌没必要延后新功能的发布。有了 Play 服务框架只剩很少的部分需要系统更新2013 年 7 月底谷歌发布了看似无关紧要的“安卓 4.3”。
如果谷歌没有在安卓 4.3 和安卓 4.2 之间通过 Play 商店发布更新的话,安卓 4.3 会是个不可思议的更新。如果新版 Play 商店、Gmail、地图、书籍、音乐、Hangouts 环聊,以及 Play Games 打包作为新版安卓的一部分,它将会作为有史以来最大的发布受到欢呼。虽然谷歌没必要延后新功能的发布。有了 Play 服务框架只剩很少的部分需要系统更新2013 年 7 月底谷歌发布了看似无关紧要的“安卓 4.3”。
![安卓 4.3 通知访问权限界面的可穿戴设备选项。
](http://cdn.arstechnica.net/wp-content/uploads/2014/03/2014-03-28-12.231.jpg)
安卓 4.3 通知访问权限界面的可穿戴设备选项。
Ron Amadeo 供图
*安卓 4.3 通知访问权限界面的可穿戴设备选项。
[Ron Amadeo 供图]*
谷歌也毫无疑问地认为 4.3 的重要性不高,将新版也叫做“果冻豆”(第三个叫果冻豆的版本了)。安卓 4.3 的新功能列表像是谷歌无法通过 Play 商店或谷歌 Play 服务更新的部分的细目清单,大部分包含了为开发者作出的底层架构改动。
@ -65,15 +73,13 @@ Ron Amadeo 供图
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/24/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/24/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,48 +1,52 @@
安卓编年史
安卓编年史24Android 4.4,奇巧——更完美,更少的内存占用
================================================================================
![LG 制造的 Nexus 5奇巧KitKat的首发设备。
](http://cdn.arstechnica.net/wp-content/uploads/2014/03/nexus56.jpg)
LG 制造的 Nexus 5奇巧KitKat的首发设备。
Android 4.4,奇巧——更完美;更少的内存占用
*LG 制造的 Nexus 5奇巧KitKat的首发设备。*
### Android 4.4,奇巧——更完美,更少的内存占用
谷歌安卓 4.4 的发布确实很讨巧。谷歌和[雀巢公司合作][1]新版系统的代号是“奇巧KitKat并且它是在 2013 年 10 月 31 日发布的,也就是万圣节。雀巢公司推出了限量版带安卓机器人的奇巧巧克力,它的包装也帮助新版系统推广,消费者有机会赢取一台 Nexus 7。
一部新的 Nexus 设备也随奇巧一同发布,就是 Nexus 5。新旗舰拥有迄今最大的显示屏一块五英寸1920x1080 分辨率的 LCD 显示屏。除了更大尺寸的屏幕LG——Nexus 5 的制造商——还将 Nexus 5 的机器大小控制得和 Galaxy Nexus 或 Nexus 4 差不多。
一部新的 Nexus 设备也随奇巧一同发布,就是 Nexus 5。新旗舰拥有迄今最大的显示屏一块五英寸、1920x1080 分辨率的 LCD 显示屏。除了更大尺寸的屏幕Nexus 5 的制造商 LG 还将 Nexus 5 的机器大小控制得和 Galaxy Nexus 或 Nexus 4 差不多。
Nexus 5 相对同时期的高端手机配置算是标准了,拥有 2.3Ghz 骁龙 800 处理器和 2GB 内存。手机再次在 Play 商店销售无锁版,相同配置的大多数手机价格都在 600 到 700 美元之间,但 Nexus 5 的售价仅为 350 美元。
奇巧最重要的改进之一你并不能看到显著减少的内存占用。对奇巧而言谷歌齐心协力开始了降低系统和预装应用内存占用的努力称作“Project Svelte”。经过了无数的优化工作和通过一个“低内存模式”禁用图形开销大的特效安卓现在可以在 340MB 内存下运行。低内存需求是件了不起的事,因为在发展中国家的设备——智能手机增长最快的市场——许多设备的内存仅有 512MB。冰淇淋三明治更高级的 UI 显著提高了对安卓设备的系统配置要求,这使得很多低端设备——甚至是新发布的低端设备——的安卓版本停留在姜饼。奇巧更低的配置需求意味着这些廉价设备能够跟上脚步。有了奇巧,谷歌希望完全消灭姜饼(写下本文时姜饼的市场占有率还在 20% 左右)。为了防止更低的系统需求还不够有效,甚至有报道称谷歌将[不再授权][2]谷歌应用给姜饼设备。
奇巧最重要的改进之一你并不能看到显著减少的内存占用。对奇巧而言谷歌齐心协力开始了降低系统和预装应用内存占用的努力称作“Project Svelte”。经过了无数的优化工作和通过一个“低内存模式”禁用图形开销大的特效安卓现在可以在 340MB 内存下运行。低内存需求是件了不起的事,因为在发展中国家的设备——智能手机增长最快的市场——许多设备的内存仅有 512MB。冰淇淋三明治更高级的 UI 显著提高了对安卓设备的系统配置要求,这使得很多低端设备——甚至是新发布的低端设备——的安卓版本停留在姜饼。奇巧更低的配置需求意味着这些廉价设备能够跟上脚步。有了奇巧,谷歌希望完全消灭姜饼(写下本文时姜饼的市场占有率还在 20% 左右)。只是降低系统需求还不够,甚至有报道称谷歌将[不再授权][2]谷歌应用给姜饼设备。
除了给低端设备带来更现代版本的系统Project Svelte 更低的内存需求同样对可穿戴设备也是个好消息。Google Glass [宣布][3]它会切换到这个更精简的系统,[Android Wear][4] 同样也运行在奇巧之上。安卓 4.4 带来的更低的内存需求以及 4.3 中的通知消息 API 和低功耗蓝牙支持给了可穿戴计算漂亮的支持。
奇巧的亮点还有无数精心打磨过的核心系统界面,它们无法通过 Play 商店升级。系统界面,拨号盘,时钟还有设置都能看到升级。
![奇巧在 Google Now 启动器下的透明系统栏。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/1homescreenz.png)
奇巧在 Google Now 启动器下的透明系统栏。
Ron Amadeo 供图
*奇巧在 Google Now 启动器下的透明系统栏。
[Ron Amadeo 供图]*
奇巧不仅去掉了讨人厌的锁屏左右屏的线框——它还默认完全禁用了锁屏小部件!谷歌明显感觉到了多屏锁屏和锁屏主屏对新用户来说有点复杂,所以锁屏小部件现在需要从设置里启用。锁屏和时钟里不平衡的时间字体换成了一个对称的字重,看起来好看多了。
在奇巧中,应用拥有将系统栏和状态栏透明的能力,显著地改变了系统的外观。系统栏和状态栏现在混合到壁纸和启用透明栏的应用中去了。这些栏还能通过新功能“沉浸”模式完全被应用隐藏。
奇巧是“电子”科幻风格棺材上的最后一颗钉子,几乎完全移除了系统的蓝色痕迹。状态栏图标由蓝色变成中性的白色。主屏的状态栏和系统栏并不是完全透明的;它们有深色的渐变,这样在使用浅色壁纸的时候白色的图标还能轻易地识别出来。
奇巧是“电子”科幻风格棺材上的最后一颗钉子,几乎完全移除了系统的蓝色痕迹。状态栏图标由蓝色变成中性的白色。主屏的状态栏和系统栏并不是完全透明的;它们有深色的渐变,这样在使用浅色壁纸的时候白色的图标还能轻易地识别出来。
![Google Now 和文件夹的调整。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/nowfolders.png)
Google Now 和文件夹的调整。
Ron Amadeo 供图
在 Nexus 5 上随奇巧到来的主屏实际上由 Nexus 5 独占了几个月,但现在任何 Nexus 设备都能拥有它了。新的主屏叫做“Google Now Launcher”它实际上是[谷歌搜索应用][5]。是的谷歌搜索从一个简单的搜索框成长到了整个主屏幕并且在奇巧中它涉及了壁纸图标应用抽屉小部件主屏设置Google Now当然还有搜索框。由于搜索现在运行在整个主屏幕任何时候只要打开了主屏并且屏幕是点亮的就可以通过说“OK Google”激活语音命令。在搜索栏有引导用户说出“OK Google”的文本在几次使用后这个介绍会隐去。
*Google Now 和文件夹的调整。
[Ron Amadeo 供图]*
Google Now 的集成度现在更高了。除了通常的系统栏上滑激活Google Now 还占据了最左侧的主屏。新版还引入了一些设计上的调整。谷歌的 logo 移到了搜索栏内,整个顶部区域更紧凑了。显示更多卡片的设计被去除了,新添加的一组底部按钮指向备忘录,自定义选项,以及一个更多操作按钮,里面由设置,反馈,以及帮助。因为 Google Now 是主屏幕的一部分,所以它也拥有透明 的系统栏和状态栏。
在 Nexus 5 上随奇巧到来的主屏实际上由 Nexus 5 独占了几个月,但现在任何 Nexus 设备都能拥有它了。新的主屏叫做“Google Now Launcher”它实际上是[谷歌搜索应用][5]。是的谷歌搜索从一个简单的搜索框成长到了整个主屏幕并且在奇巧中它涉及了壁纸、图标、应用抽屉、小部件、主屏设置、Google Now当然还有搜索框。由于搜索现在运行在整个主屏幕任何时候只要打开了主屏并且屏幕是点亮的就可以通过说“OK Google”激活语音命令。在搜索栏有引导用户说出“OK Google”的文本在几次使用后这个介绍会隐去。
Google Now 的集成度现在更高了。除了通常的系统栏上滑激活Google Now 还占据了最左侧的主屏。新版还引入了一些设计上的调整。谷歌的 logo 移到了搜索栏内,整个顶部区域更紧凑了。显示更多卡片的设计被去除了,新添加的一组底部按钮指向备忘录、自定义选项,以及一个更多操作按钮,里面有设置、反馈,以及帮助。因为 Google Now 是主屏幕的一部分,所以它也拥有透明 的系统栏和状态栏。
透明以及让系统的特定部分“更明亮”是奇巧的设计主题。黑色调通过透明化从状态栏和系统栏移除了,文件夹的黑色背景也换为了白色。
![新的,更加干净的应用列表,以及完整的应用阵容。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/apps.png)
新的,更加清爽的应用列表,以及完整的应用阵容。
Ron Amadeo 供图
奇巧的图标阵容相对 4.3 有显著的变化。更戏剧化地说,这是一场大屠杀,谷歌从 4.3 的配置中移除了七个图标。谷歌 Hangouts 现在能够处理短信所以信息应用被去除了。Hangouts 同时还接手了 Google Messenger 的职责所以它的图标也不见了。Google Currents 不再作为默认应用预装,因为它不久后就会被终结——和它一起的还有 Google Play MagazinesPlay 杂志),取代它们的是 Google Play NewsstandPlay 报刊亭)。谷歌地图被打回一个图标,这意味着本地和导航的快捷方式被去掉了。难以理解的 Movie Studio 也被去除了——谷歌肯定已经意识到了没人想在手机上剪辑电影。有了主屏的“OK Google”关键词检测语音搜索图标的呈现就显得多余了因而将其移除。令人沮丧的是没人用的新闻和天气应用还在。
*新的,更加清爽的应用列表,以及完整的应用阵容。
[Ron Amadeo 供图]*
奇巧的图标阵容相对 4.3 有显著的变化。更戏剧化地说,这是一场大屠杀,谷歌从 4.3 的配置中移除了七个图标。谷歌 Hangouts 现在能够处理短信所以“信息”应用被去除了。Hangouts 同时还接手了 Google Messenger 的职责所以它的图标也不见了。Google Currents 不再作为默认应用预装,因为它不久后就会被终结——和它一起的还有 Google Play MagazinesPlay 杂志),取代它们的是 Google Play NewsstandPlay 报刊亭)。谷歌地图被打回一个图标,这意味着本地和导航的快捷方式被去掉了。难以理解的 Movie Studio 也被去除了——谷歌肯定已经意识到了没人想在手机上剪辑电影。有了主屏的“OK Google”关键词检测语音搜索图标的呈现就显得多余了因而将其移除。令人沮丧的是没人用的新闻和天气应用还在。
有个新应用“Photos相片”——实际上是 Google+ 的一部分——接手了图片管理的工作。在 Nexus 5 上,相册和 Google+ 相片十分相似,但在 Google Play 版设备上更新版的奇巧中,相册已经完全被 Google+ 相片所取代。Play Games 是谷歌的后端多用户游戏服务——谷歌版的 Xbox Live 或苹果的 Game Center。Google Drive已经在 Play 商店存在数年的应用,终于成为了内置应用。谷歌 2012 年 6 月收购的 Quickoffice 也进入了内置应用阵容。Drive 可以打开 Google 文档Quickoffice 可以打开微软 Office 文档。如果细细追究起来,在大多数奇巧中包含了两个文档编辑应用和两个相片编辑应用。
@ -50,15 +54,13 @@ Ron Amadeo 供图
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/25/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/25/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,79 +1,67 @@
安卓编年史
安卓编年史25Android 4.4奇巧——更完美更少的内存占用2
================================================================================
![新的“添加到主屏幕”界面无疑受到了蜂巢的启发。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/homesetupthrowback.png)
新的“添加到主屏幕”界面无疑受到了蜂巢的启发。
Ron Amadeo 供图
*新的“添加到主屏幕”界面无疑受到了蜂巢的启发。
[Ron Amadeo 供图]*
奇巧的主屏幕配置界面漂亮地对蜂巢进行了复古。在有巨大的 10 英寸屏幕的蜂巢平板上(上方右侧图片),长按主屏背景会向你展现一个所有主屏幕的缩放视图。可以从下面的小部件抽屉里将它们拖放到任意主屏上——这很方便。在将蜂巢的界面带到手机上时,从安卓 4.0 直到 4.3,谷歌都跳过了这个设计,把它留给了大屏幕设备,在手机上长按后只显示一个选项列表(中间的图片)。
但在奇巧上谷歌最终给出了解决方案。在长按后4.4 呈现一个略微缩放的视图——你可以看到当前主屏以及它左右侧的屏幕。点击“小部件”按钮会打开一个小部件略缩图的完整列表,但是长按一个小部件后,你会回到缩放视图,并且你可以在主屏页面之间滚动,将图标放在你想要的位置。将图标或者小部件拖动过最右侧的主屏页面,你可以创建一个新的主屏页面。
![联系人和去掉所有蓝色痕迹的键盘。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/RIP33B5E5.png)
联系人和去掉所有蓝色痕迹的键盘。
Ron Amadeo 供图
奇巧是电子风格设计的完结。在系统的大多数部分,剩下的蓝色高亮都被换成了灰色。在联系人应用中,头部和联系人列表字母分割线的蓝色都移除掉了。图片的位置换了一侧,底栏变成了浅灰色以和顶部相称。几乎将蓝色渗透进每个应用的键盘,现在是灰底灰色灰高亮。这可不是件坏事。应用应该允许有它们自己的配色方案——在键盘上强迫存在潜在的颜色冲突可不是个好设计。
*联系人和去掉所有蓝色痕迹的键盘。
[Ron Amadeo 供图]*
奇巧是电子风格设计的完结。在系统的大多数地方,剩下的蓝色高亮都被换成了灰色。在联系人应用中,头部和联系人列表字母分割线的蓝色都移除掉了。图片的位置换了一侧,底栏变成了浅灰色以和顶部相称。几乎将蓝色渗透进每个应用的键盘,现在是灰底、灰色、灰高亮。这可不是件坏事。应用应该允许有它们自己的配色方案——在键盘上强迫存在潜在的颜色冲突可不是个好设计。
![前三张是奇巧的拨号盘,最后一张是 4.3 的。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/phone.png)
前三张是奇巧的拨号盘,最后一张是 4.3 的。
Ron Amadeo 供图
*前三张是奇巧的拨号盘,最后一张是 4.3 的。
[Ron Amadeo 供图]*
谷歌完全重制了奇巧中的拨号,创造了一个疯狂的设计,改变了用户对手机的思考方式。实际上新版拨号中的数字都被尽可能地隐藏了——在首屏上甚至没有拨号盘。打电话的主要界面现在是个搜索栏!如果你想给你的联系人打电话,只要在搜索栏输入他的名字;如果你想给一个公司打电话,只要输入公司的名字,拨号会通过谷歌地图庞大的数据库找到号码。它工作得令人难以置信的好,这是只有谷歌才能完成的事情。
如果搜索不是你的菜的话,应用还会智能地显示通话记录列表,最常联系人,还有指向所有联系人的链接。底部的链接指向你的通话记录,传统的拨号盘,以及常规的更多操作按钮,包含一个设置页面。
![Office 相关:新的内置应用 Google Drive以及打印支持。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/googledrive-and-printing.png)
Office 相关:新的内置应用 Google Drive以及打印支持。
Ron Amadeo 供图
在奇巧中 Google Drive 终于作为内置应用包含了进来令人惊奇的是这居然用了这么长时间。Drive 允许用户创建和编辑 Google Docs 表格和文档,用相机扫描文档并作为 PDF 上传或者查看不能编辑演示文稿。Drive 的设计十分现代,侧面拥有滑出式导航抽屉,并且是 Google Now 风格卡片式设计。
*Office 相关:新的内置应用 Google Drive以及打印支持。
[Ron Amadeo 供图]*
在奇巧中 Google Drive 终于作为内置应用包含了进来令人惊奇的是这居然等了这么长时间。Drive 允许用户创建和编辑 Google Docs 表格和文档,用相机扫描文档并作为 PDF 上传或者查看不能编辑演示文稿。Drive 的设计十分现代,侧面拥有滑出式导航抽屉,并且是 Google Now 风格卡片式设计。
为了有更多的移动办公乐趣,奇巧包含了系统级打印框架。在设置的底部有“打印”设置界面,任何打印机 OEM 厂商都可以为它写个插件。谷歌云打印自然是首批支持者之一。只要你的打印机和云打印相连接,无论是本地或通过一台装有 Chrome 浏览器的电脑,你都可以借助网络进行打印。应用同样也需要支持打印框架。点击 Google Drive 里的“i”按钮会显示文档信息并且给你打印的选项。就像桌面系统那样会弹出一个设置对话框有打印份数纸张尺寸以及页面选择等选项。
![Google+ 应用的“相片”部分,它取代了相册。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/that-is-one-dead-gallery.png)
Google+ 应用的“相片”部分,它取代了相册。
Ron Amadeo 供图
*Google+ 应用的“相片”部分,它取代了相册。
[Ron Amadeo 供图]*
Google+ 相片和相册最初都在 Nexus 5 上随附,但在 Google Play 设备稍晚版本的奇巧上相册被砍掉了Google+ 完全接手了相片管理。新应用的主题从深色变成了浅色Google+ 相片还带来了现代的导航抽屉设计。
安卓一直以来都有即时上传功能,它会自动备份所有图片到谷歌的云存储,开始是 Picasa 后来是 Google+。G+ 相片相比相册最大的好处是它可以管理那些云端存储的图片。图片右下角的云图标指示备份状态,它会从右到左地填满来指示正在上传。G+ 相片带来了它自己的照片编辑器,还有许多其它的 Google+ 图片功能,比如高亮,自动美化,当然,还有分享到 Google+。
安卓一直以来都有即时上传功能,它会自动备份所有图片到谷歌的云存储,开始是 Picasa 后来是 Google+。G+ 相片相比相册最大的好处是它可以管理那些云端存储的图片。图片右下角的云图标指示备份状态,它会从右到左地填满来指示上传状态。G+ 相片带来了它自己的照片编辑器,还有许多其它的 Google+ 图片功能,比如高亮,自动美化,当然,还有分享到 Google+。
![时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/clocks.png)
时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。
Ron Amadeo 供图
*时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。
[Ron Amadeo 供图]*
谷歌将 4.2 引入的优秀时间选择器换成了一个奇怪的时钟界面,操作起来比旧界面更慢了也更不精确了。首先是个可以选择小时的单指针时钟,然后显示的是另一个选择分钟的单指针时钟。选择的时候要转动分针或点击数字,这让用用户很难选择不是整五分钟的时间增量。不像之前的时间选择器需要选择一个时间段,这里默认时间段是 AM重复一下这样设置的时候容易不小心偏差 12 小时)。
### 今日安卓无处不在 ###
![](http://cdn.arstechnica.net/wp-content/uploads/2014/05/android-everywhere2.png)
图片来自 Google/Sony/Motorola/Ron Amadeo
一开始从一家搜索引擎公司的古怪的黑莓复制品一步一步到如今科技界巨头之一在世界上最流行的系统。安卓已经成为谷歌的实际消费者操作系统它驱动着手机平板Google GlassGoogle TV甚至更多。[它的一部分][1]甚至还用到了 Chromecast 中。在未来,谷歌还会将 [Android Wear][2] 带到手表和可穿戴设备上,[开放汽车联盟][3] 要将安卓带到汽车上。不久后会谷歌再次承诺对客厅的计划,带上 [Android TV][4]。这个系统对谷歌是如此重要的支柱,原本应该覆盖全公司产品的大会活动,比如 Google I/O俨然成为了安卓发布派对。
![上排:谷歌 Play 内容商店。下排:谷歌 Play 应用。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/2014-03-30-03.08.jpg)
上排:谷歌 Play 内容商店。下排:谷歌 Play 应用。
Ron Amadeo 供图
移动产业曾经的的丑小鸭脱胎换骨,它的用户界面还[赢得了设计奖项][5]。像 Google Now 一样的设计风格影响了整个公司的产品甚至连像搜索Google+Youtube以及地图这样的桌面站点都加入了卡片式设计中。设计也在不断地演进。谷歌下一步[统一设计][6]的计划不仅是面对安卓,也包括了所有的产品。谷歌的目标是让你不管在安卓,还是桌面浏览器,或是一个手表上,使用像 Gmail 这样的服务时都能有一样的体验。
谷歌将很多安卓的组件转移到 Play 商店,这样版本发布就越来越不重要了。谷歌决定了解决运营商和 OEM 厂商更新问题的最佳途径,就是完全绕开这些绊脚石。从这里开始,在一个安卓更新里除了核心底层变动外就没什么内容了——但是更多的 API 被加入了谷歌 Play 服务。如果你只看版本更新的话,相对安卓高峰期 2.5 个月的发布周期来说开发已经放缓了。但实际情况是谷歌现在可以持续将改进推送到 Play 商店,从周期发布变成了永无止境,有些微妙的更新流。
每天 150 万台设备激活,安卓除了增长就是增长。在未来,安卓会是手机和平板到汽车和手表的领军者,奇巧更低的系统配置要求也会让发展中国家的手机价格更低。结果呢?越来越多的人会来到线上。对那里的大多数人来说,安卓不止是他们的手机,也是他们首要的计算设备。随着安卓为谷歌领导掌管众多领域,从一个小收购而来的系统逐渐成长为了谷歌最重要的产品。
----------
![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg)
![Ron Amadeo](https://cdn.arstechnica.net/wp-content/uploads/2016/05/r.amadeo-45843.jpg)
[Ron Amadeo][a] / Ron是Ars Technica的评论编缉专注于安卓系统和谷歌产品。他总是在追寻新鲜事物还喜欢拆解事物看看它们到底是怎么运作的。
[@RonAmadeo][t]
[Ron Amadeo][a] / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t]
--------------------------------------------------------------------------------
via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/26/
via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/26/
译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID)
译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出

View File

@ -1,36 +1,23 @@
安卓编年史
安卓编年史26Android Wear
================================================================================
>让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
### Android Wear
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/g-watch-150x150.png)
][1]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Untitled-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/home-screen33-640x261-150x150.png)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/feature-640x212-150x150.png)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/superlayout2000-150x150.png)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/darker-150x150.png)
][6]
![The LG G Watch. One of the first Android Wear devices.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/g-watch.png)
2014 年 6 月安卓装备上了新元素:智能手表。谷歌在 2014 的 Google I/O 上发布了“[Android Wear][10]”,意图在你的手腕上装备一台小电脑。为[一块 1.6 英寸的屏幕][11]进行设计意味着需要从头构思整个界面,所以谷歌精简了安卓 4.4 KitKat并创建出了一个小巧的智能手表操作系统。Android Wear 设备不是独立的计算机。它们依赖于运行着配套 Android Wear 应用的安卓智能手机进行连接,认证,以及应用数据获取。
![ The typical Android Wear home screen.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/home-screen33-640x261.png)
Android Wear 智能手表主要是一个通知机器。有了安卓 4.3 及以上版本内建的新 API任何手机收到的通知都能同时显示在手表上——无需任何应用支持。通知操作按钮也带到了手表上让用户可以从手表上与通知进行交互。在手表上清除一条通知会同时在手机上将其清除用户无需拿出另一台设备就可以管理通知消息。每个手表还带有一个语音命令系统和一个麦克风让用户可以抬腕唤醒手表说“OK Google”并发出一条命令。你还可以通过语音回复信息。手表上甚至还有一个装有原生手表应用的应用抽屉。
![Three Android Wear screens, showing music on the home screen, the voice command system, and a Google Now traffic card.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/feature-640x212.png)
主屏幕上显示的自然是时间了,它还允许用户切换无数不同的表盘风格。通知界面采用了卡片风格设计。一个垂直滚动的通知列表会在手表上堆积,包括一些显示天气或交通信息的 Google Now 卡片。向左滑动能够清除一条通知,向右滑动会一次打开一个操作按钮。在主屏幕点击会打开语音命令系统,在哪里你可以激活设置或应用抽屉。除了这些以外最初的 Android Wear 的主屏幕没有多少内容。
2014 年 Android Wear 设备仅仅发售了 720000 部,从那之后我们就没有从软件或硬件上看到多少发展。时至今日,智能手机的销售[一年不如一年][12],甚至在 [Apple Watch][13] 发布后,没人能够真正确定他们想要让小腕上计算机做什么。明显这种情况会持续到 2017 年 Android Wear 2.0 发布。从 Moto 360 给市场带来圆形设备以来,我们还没从硬件厂商那边看到一些新玩意。
![The layout of the OS.](https://cdn.arstechnica.net/wp-content/uploads/2016/10/superlayout2000-980x821.png)
2014 年 Android Wear 设备仅仅发售了 720000 部,从那之后我们就没有从软件或硬件上看到多少发展。时至今日,智能手表的销售[一年不如一年][12],甚至在 [Apple Watch][13] 发布后,没人能够真正确定他们想要让小腕上计算机做什么。明显这种情况会持续到 2017 年 Android Wear 2.0 发布。从 Moto 360 给市场带来圆形设备以来,我们还没从硬件厂商那边看到一些新玩意。
### Android 5.0 Lollipop——有史以来最重要的安卓版本
@ -38,27 +25,21 @@ Android Wear 智能手表主要是一个通知机器。有了安卓 4.3 及以
2014 年 11 月,谷歌发布了 [安卓 5.0 棒棒糖][14]。很多系统更新都被称作“有史以来最大的”,但那些陈词滥调在安卓 5.0 棒棒糖的身上成真了。首先,它改变了安卓发布的方式。谷歌与这个版本的安卓一同开始了“开发者预览”计划,可以以 beta 的形式提前几个月看到新版本。由于版本代号和版本号现在被用作市场营销工具,最终的名称在 beta 期间始终保密,仅以字母指代。在 2014 年的 Google I/O 大会谷歌宣布了“Android L 开发者预览”。
### 延伸阅读
给开发者(以及全世界)四个月的时间接触学习这个版本肯定是有必要的。安卓 L 包含了大范围的变动,它们在系统中都是首次亮相,直到今天还能感受到这些变动。棒棒糖引入了 Material Design 设计理念作为修改安卓每个界面的指南。一个新的运行时环境“ART”它代表着驱动安卓应用引擎的完全革新。谷歌的“OK Google”语音命令系统升级到能在任意界面生效在一些设备上它甚至可以在设备锁定的时候工作。多用户系统从平板来到了手机上。棒棒糖还铺设了 Android for Work 的基础,这是一个关注企业与个人双重应用的特性。
[安卓 5.0 棒棒糖,完全评测][7]
#### Material Design 给了安卓以及谷歌的所有产品一个统一形象
给开发者(以及全世界)四个月的时间接触学习这个版本肯定是有必要的。安卓 L 包含大范围的变动,它们在系统中都是首次亮相,直到今天还能感受到这些变动。棒棒糖引入了 Material Design 设计理念作为修改安卓每个界面的指南。一个新的运行时环境“ART”它代表着驱动安卓应用引擎的完全革新。谷歌的“OK Google”语音命令系统升级到能在任意界面生效在一些设备上它甚至可以在设备锁定的时候工作。多用户系统从平板来到了手机上。棒棒糖还铺设了 Android for Work 的基础,这是一个关注企业与个人双重应用的特性
当 Matias Duarte 踏上 I/O 大会的舞台并宣布 Material Design 时它公布的不仅仅是一个安卓的统一设计蓝图还是谷歌的所有产品以及第三方应用生态的统一设计蓝图。这个想法是安卓、iOS、Chrome OS以及 Web 版的谷歌产品都应该有一致的界面风格、字体以及行为。它们在不需要在不同尺寸的屏幕上有相同的布局Material Design 提供了有一致行为的构建元素,它们能够基于屏幕尺寸自适应布局
#### Material Design 给了安卓以及谷歌的所有产品一个统一
当 Matias Duarte 踏上 I/O 大会的舞台并宣布 Material Design 时他公布的不仅仅是一个安卓的统一设计蓝图还是谷歌的所有产品以及第三方应用生态的统一设计蓝图。这个想法是安卓iOSChrome OS以及 Web 版的谷歌产品都应该有一致的界面风格字体以及行为。它们在不需要在不同尺寸的屏幕上有相同的布局Material Design 提供了有一致行为的构建元素,它们能够基于屏幕尺寸自适应布局。
Duarte 和他的团队在蜂巢中尝试了“电子”风格审美,以及在果冻豆中的“卡片”主题风格,但 Material Design 最终代表了被选中的设计系统应用到谷歌的所有产品线。Material Design 已经超出了一个用户界面设计指南的概念,成为了谷歌作为一个公司的一致性代表。
Duarte 和他的团队在蜂巢中尝试了“电子”风格审美,以及在果冻豆中的“卡片”主题风格,但 Material Design 最终成了被选中的设计系统应用到谷歌的所有产品线。Material Design 已经超出了一个用户界面设计指南的概念,成为了谷歌作为一个公司的一致性代表。
Material Design 主要的比喻是“纸和墨”。所有的用户界面是“纸”的片层,漂浮于最底端平面之上。阴影用来提供界面的层次结构——用户界面的每个层在 Z 轴上拥有一个位置,并在其之下的元素上投射一个阴影。这是在安卓 4.1 的 Google Now 中使用的“卡片”风格更清晰的进化版本。“墨”是用来指代谷歌推荐开发者在界面的重要项目上使用的泼色。这个概念也引用了真实世界的物体概念,与 Windows 8 和 iOS 7 带来的反拟物化“不惜一切代价扁平化”的趋势相违。
动画也是一个重点,思想是任何东西都不应该“弹出”到屏幕上。组件应该滑进,缩小,或放大。“纸”表面和真实世界中的纸还有点不同,们可以缩小,扩展,合并以及增大。为了让动画系统协同图像资源工作,阴影不像之前版本中那样整合进用户界面组件——实际上谷歌创造了一个实时的 3D 阴影系统,这样阴影就能够在这些动画和转换中正确渲染。
动画也是一个重点,思想是任何东西都不应该“弹出”到屏幕上。组件应该滑进,缩小,或放大。“纸”表面和真实世界中的纸还有点不同,它们可以缩小,扩展,合并以及增大。为了让动画系统协同图像资源工作,阴影不像之前版本中那样整合进用户界面组件——实际上谷歌创造了一个实时的 3D 阴影系统,这样阴影就能够在这些动画和转换中正确渲染。
![棒棒糖的层状界面和阴影的夸张侧视图。](https://cdn.arstechnica.net/wp-content/uploads/2014/07/2014-07-10_21-56-05.jpg)
<figcaption class="caption" style="box-sizing: inherit; position: relative; margin-top: -6px;">棒棒糖的层状界面和阴影的夸张侧视图。[Google I/O 2014 - Material design principles][8]</figcaption>
为了将 Material Design 带到谷歌的其它地方以及应用生态系统,谷歌创建并持续维护着[一个统一的设计指南][15],描述了一切设计的规范。那里有应该与不应该做的,基线,基线网格,色板,库存图解,字体,库,布局建议以及更多内容。谷歌甚至开始定期举办[针对设计的会议][16],来听取设计者的声音以及给他们教学,还成立了[Material Design 奖项][17]。在发布 Material Design 后不久Duarte 离开了安卓团队并成为了谷歌的 Material Design 总监,创建了一个完全专注于设计的部门。
为了将 Material Design 带到谷歌的其它地方以及应用生态系统,谷歌创建并持续维护着[一个统一的设计指南][15],描述了一切设计的规范。那里有应该与不应该做的,基线、基线网格、色板、堆叠图解、字体、库、布局建议以及更多内容。谷歌甚至开始定期举办[针对设计的会议][16],来听取设计者的声音以及给他们教学,还成立了 [Material Design 奖项][17]。在发布 Material Design 后不久Duarte 离开了安卓团队并成为了谷歌的 Material Design 总监,创建了一个完全专注于设计的部门。
--------------------------------------------------------------------------------
@ -66,7 +47,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,11 +1,9 @@
安卓编年史
安卓编年史28Android 5.0 Lollipop——有史以来最重要的安卓版本2
================================================================================
>让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
#### ART——为未来提供了一个平台的安卓运行时
安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年 Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。
安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年 Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。
解决方案就是用 ART 这个安卓运行时替换 Dalvik这是一个完全为现代智能手机硬件重写的应用引擎。ART 更强调性能表现和用户界面流畅度。ART 带来了一个从 JITJust-in-time即时编译到 AOTAhead-of-time提前编译的转变。JIT 会在每次应用运行的时候即时编译,节省存储空间,因为编译后的代码从不写入存储,但它消耗更多的 CPU 和内存资源。AOT 会将编译后的代码保存到存储让应用启动的时候更快并减少内存使用。ART 会在设备上将编译代码作为安装的一部分进行而不分发预编译的代码这样编译器可以进行一些针对特定设备的优化。ART 还带来了 64 位支持,扩大了内存寻址范围,由 64 位指令集带来更佳的性能表现(特别是在媒体和加密应用上)。
@ -14,74 +12,52 @@
#### 一个系统层级的界面刷新
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg)
][1]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg)
][6]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg)
][7]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg)
][8]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg)
Material Design 带来了一个几乎对安卓所有界面的完全翻新。首先,整个核心系统界面改变了。安卓得到了一个全新的按钮集合,看起来有点像是 PlayStation 的手柄:三角形,圆形以及正方形按钮,分别代表后退,主屏幕,和最近应用。得益于全新的图标集,状态栏也是焕然一新。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg)
最近应用获得了大翻新。从一个小略缩图纵向列表变成了一个巨大的几乎全屏的略缩图串联列表。它还获得了一个新名字也没那么守旧“概览Overview”。这明显是受到了前面版本的 Chrome 标签页切换器效果的启发。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg)
顺带一说,在这个安卓版本里 Chrome 的标签页切换器效果消失了。作为一种将 Web 应用与本地应用同等对待的尝试Chrome 标签合并到了概览列表。是的:最近“应用”列表现在显示的是最近打开的应用,加上最近打开的网站。在棒棒糖中,最近应用列表还采取了一种“以文档为中心”的方法,意味着应用可以在最近应用列表中显示多个项目。比如你在 Google Docs 中打开了两个文档,它们都会显示在最近应用中,让你可以在它们之间轻松切换,而不用到应用的文件列表去来回切换。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg)
通知面板是全新的。谷歌给通知面板带来了“卡片”主题,将每个项目归整到它自己的矩形中。单个通知条目从黑色背景变成了白色背景,有了更佳的排版和圆形图标。这些新通知来到了锁屏上,将它从一个最没用的中间屏变成了很有用的屏幕,用于展示“这里是你不在的时候发生的事情”。
全屏的通知,比如来电以及闹钟,都被抛弃了,取而代之的是在屏幕顶部弹出一个“抬头”通知。抬头通知也对“高优先级”应用可用,最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定,在开发者意识到这可以让他们的通知更显眼之后,所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg)
全屏的通知比如来电以及闹钟都被抛弃了取而代之的是在屏幕顶部弹出一个“抬头HUD”通知。抬头通知也对“高优先级”应用可用最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定在开发者意识到这可以让他们的通知更显眼之后所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg)
谷歌还给棒棒糖添加了一个单独的,但很相似的“优先”通知系统。“优先”通知是一个介于完全静音和“提醒一切消息”之间的模式,允许用户将特定的联系人和应用标记为重要。优先模式只会为这些重要的人发出提醒。在界面上来看,它采用了音量控制附加通知优先级控制以及设置中心添加一项优先通知新设置的形式。当你处在优先模式的时候,状态栏会有一颗星形标识。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg)
快速设置获得了一系列的大改善。控制项现在是一块在通知_上面_的面板所以它可以通过“两次下拉”手势来打开它。第一次下拉会打开通知面板第二次下拉手势会缩小通知面板并打开快速设置。快速设置的布局变了抛弃了平铺排列转为一个单独面板上的一系列浮动按钮。顶部是十分方便的亮度调节条之后是连接自动旋转手电筒GPS以及 Chromecast 的按钮。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg)
快速设置现在还有了实际的内嵌面板。它可以在主界面显示无线网络接入点,蓝牙设备,以及移动数据使用量。
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg)
][9]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg)
][10]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg)
][11]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg)
][12]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg)
][13]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg)
][14]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png)
][15]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg)
Material Design 革新给了几乎每个应用一个新图标并带来了一个更明亮白色背景的应用抽屉。默认应用阵容也有了很大的变化。和这些新应用问声好吧通讯录谷歌文档Fit信息照片Play 报亭以及谷歌幻灯片。和这些死去的应用说再见吧相册G+ 照片PeoplePlay 杂志,电子邮件,以及 Quickoffice。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg)
这些新应用中很多来自 Google Drive从一个单独的大应用分割成每个产品一个应用。现在我们有了云端硬盘文档表格以及幻灯片都来自于云端硬盘团队。云端硬盘同时也要对 Quickoffice 的死亡负责云端硬盘团队令它元气大伤。在“谷歌从来没法做好决定”分类下通讯录从“People”改回了“Contacts”短信应用在运营商的要求下叫回了“Messenger”。那些运营商_不_喜欢谷歌环聊插手短信的职能。我们有项真正的新服务谷歌健身一个健康追踪应用可以在安卓手机和安卓手表上工作。Play 杂志也有了新的设计添加了网站内容所以它改名叫“Play 报亭”。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png)
还有更多的谷歌专有应用接管 AOSP 的例子。
* “G+ 照片”变成了“谷歌照片”,并取代了 AOSP 的相册成为默认照片应用,而相册也就随之消亡了。改名成“谷歌照片”是为照片应用[退出 Google+][16]并成为独立服务做准备。谷歌照片的发布在棒棒糖发布之后六个月——暂时应用只像是 Google+ 应用换了个图标和界面设计。
@ -94,7 +70,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,40 +1,16 @@
安卓编年史
安卓编年史29Android 5.0 Lollipop——有史以来最重要的安卓版本3
============================================================
### 让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
毫不夸张地说谷歌搜索在棒棒糖中无处不在。“持续开启语音识别”这项特性让用户可以在任何界面随时说出“OK Google”即时是在息屏状态也没有问题。谷歌应用依然是谷歌的首要主屏这项特性是自奇巧时引入的。现在搜索栏也会显示在新的最近应用界面。
Google Now 依然是最左侧的主屏,但现在 Material Design 对它进行了大翻新,给了它一个色彩大胆的头部以及重新设计的排版。
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play-store-1-150x150.jpg)
][1]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play2-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/6-150x150.jpg)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/5-150x150.jpg)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/12-2-150x150.jpg)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/14-1-150x150.jpg)
][6]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/19-1-150x150.jpg)
][7]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/13-2-150x150.jpg)
][8]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play-store-1-1440x707.jpg)
Play 商店遵从了和其它棒棒糖应用相似的轨迹。它在视觉上焕然疑一新,大胆的色彩,新排版,还有一个全新的布局。通常这里不会有什么新增功能,就只是给一切换件新马甲。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play2-1440x707.jpg)
Play 商店的导航面板现在真的可以用于导航了,每个分类有各自的入口。棒棒糖也不再在操作栏放“更多”按钮了,取而代之的是一个独立的操作按钮(通常是搜索),并且去掉了导航栏中多余的选项。这给了用户一个单独的地方来查找项目,而不用在两个菜单中寻找搜索的地方。
棒棒糖还给了应用让状态栏透明的能力。这让操作栏的颜色可以渗透到状态栏,让它只比周围的界面暗一点点。一些界面甚至在顶部使用了全幅英雄图片,同时显示到了状态栏上。
@ -43,47 +19,11 @@ Play 商店的导航面板现在真的可以用于导航了,每个分类有各
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-1-980x481.jpg)
][38]
谷歌日历完全重写了,获得了很多新设计,也失去了很多特性。你不再能够双指缩放来调整时间视图,月份视图也从手机上消失了,周视图从七天退化成了五天的视图。在用户抱怨之后,谷歌将会花费接下来几个版本的时间来重新添加回这里面的一些特性。“谷歌日历”还加强了“谷歌”部分,去除了直接在应用内添加第三方账户的能力。非谷歌账户现在需要从 Gamil 来添加。
尽管如此,它看起来还是很棒。在一些视图上,月份开头带有头图,就像是真实的纸质日历。带有地点的事件会附带显示来自那个地点的照片。举个例子,我的“去往旧金山”会显示金门大桥。谷歌日历还会从 Gamil 获取事件并在你的日历中显示。
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/7-150x150.jpg)
][9]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/8-150x150.jpg)
][10]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/12-150x150.jpg)
][11]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/13-150x150.jpg)
][12]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/3-1-150x150.jpg)
][13]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/14-150x150.jpg)
][14]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/6-2-150x150.jpg)
][15]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/5-3-150x150.jpg)
][16]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/7-2-150x150.jpg)
][17]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/9-1-150x150.jpg)
][18]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/10-1-150x150.jpg)
][19]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/28-1-150x150.jpg)
][20]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/9-1-1440x2560.jpg)
其它应用都可以套用基本相同的描述:功能上没有太多新鲜的,但新设计换掉了奇巧中的灰色以大胆,明亮的色彩。环聊获得了收取 Google Voice 信息的能力,时钟应用的背景颜色会随着每天时间的变化而改变。
@ -99,70 +39,36 @@ Play 商店的导航面板现在真的可以用于导航了,每个分类有各
#### 开机设置获得面向未来的新设计
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/25-1-150x150.jpg)
][21]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/26-150x150.jpg)
][22]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup2-150x150.jpg)
][23]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup3-150x150.jpg)
][24]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup4-150x150.jpg)
][25]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup5-150x150.jpg)
][26]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup6-150x150.png)
][27]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/25-1-1440x707.jpg)
开机设置经过了大翻新,它不止是为了跟上 Material Design 指南,还是“面向未来”的,这样不管未来谷歌采用什么新的登录和验证方案,它都能够适应。记住,写“安卓编年史”的部分原因就是一些旧版安卓已经不再能工作了。这些年来,谷歌已经为用户升级了更佳加密的验证方案以及二次验证,但添加这些新的登录要求破坏了旧客户端的兼容性。很多安卓特性要求访问谷歌云设施,所以你没法登录的话,像安卓 1.0 的 Gmail 这样的就没法工作了。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/26-1440x1454.jpg)
在棒棒糖中,开机设置工作的前几个界面和之前的很像。你可以看到“欢迎使用安卓界面”以及一些设置数据和 Wi-Fi 连接的选项。但在这个界面之后就有了变化。一旦棒棒糖连接到了互联网它会连接到谷歌的服务器来“检查更新”。这并不是检查系统或应用的更新是在检查即将执行的设置工作的更新。安卓下载了最新版本的设置_然后_它会要求你登录你的谷歌账户。
在今天登录进棒棒糖和奇巧的时候这个好处很明显。有可以可升级的设置流程“2014”的棒棒糖系统可以适应 2016 的改进,像是谷歌新的“[触碰登录][39]”双重认证。奇巧在这就卡住了,但幸运的是它有个“浏览器登录”可以解决双重认证的问题。
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup3.jpg)
棒棒糖的开机设置对将你的谷歌账户和密码放在单独的页面持极端立场。[谷歌讨厌密码][40]并提供了一些[实验性的方式][40]来不用单独页面登录到谷歌。如果你的账户设置为不使用密码,棒棒糖可以跳过密码页面。如果你设置了双重认证,设置页面就会进入到“输入双因素码”的设置流程。每个登录部分都是在单独的一个页面,所以设置流程是模块化的。页面可以随要求添加或移除。
![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup5.jpg)
开机设置还给了用户对应用还原的控制。安卓在这之前也提供了一些数据还原,但那是无法理解的,因为它仅仅只是在没有任何用户输入的情况下选择你的一台设备并开始恢复。开机设置流程中的一个新界面让用户可以看到在云端的设备配置集合,并选择合适的那个。你还可以选择要从那个备份还原的应用。备份有应用,你的主屏布局,以及一些小设置如 Wi-Fi 热点。它不是完全的应用数据备份。
#### 设置
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/29-1-150x150.jpg)
][28]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/settings-1-150x150.jpg)
][29]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2014-11-11-16.45.47-150x150.png)
][30]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/battery-150x150.jpg)
][31]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/user1-150x150.jpg)
][32]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/users2-150x150.jpg)
][33]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/30-1-150x150.jpg)
][34]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/31-150x150.jpg)
][35]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/settings-1-1440x848.jpg)
设置从暗色主题切换到了亮色。除了新外观,它还有方便的搜索功能。每个界面用户都能访问放大镜,让他们可以更容易地找到难找的选项。
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2014-11-11-16.45.47-1440x2560.png)
这里有一些和伏特计划有关的额设置。“网络限制”允许用户将一个 Wi-Fi 连接标记为计费的,让任务调度器处理后台处理时避免使用它。同时作为伏特计划的一部分,添加了一个“节电模式”。它会限制后台任务并限制 CPU 性能,给你更长的续航但更慢的设备。
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/user1.jpg)
多用户支持已经出现在安卓平板中有一段时间了,但棒棒糖终于将它带到了安卓手机上。设置界面添加了一个新的“用户”页面,让你添加额外的账户或设置一个“访客”账户。访客账户是临时的——它们可以一次点击轻松删除。它不会像正常账户那样尝试下载关联到你账户的每个应用,因为它注定要在不久后被删除。
--------------------------------------------------------------------------------
@ -177,7 +83,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,160 +1,62 @@
安卓编年史
安卓编年史30Android TV 和 Android Auto
============================================================
> 让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。
### Android TV
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/IMG_0002-22-150x150.jpg)
][2]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-172334-150x150.png)
][3]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/play-store-2-150x150.png)
][4]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-2-150x150.png)
][5]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-1-150x150.png)
][6]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-150246-150x150.png)
][7]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-1548581-150x150.png)
][8]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-170651-150x150.png)
][9]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-174128-150x150.png)
][10]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/IMG_0002-22-1440x545.jpg)
2014 年 11 月谷歌公布了安卓 TV安卓继续进行它带着一块屏幕征服一切的征程。这家公司里的一个部门之前在蜂巢时代尝试过用谷歌 TV 掌控客厅,但这次完全是来自安卓团队的新点子。安卓 TV 使用安卓 5.0 棒棒糖,并给了它一个为室内最大屏幕设计的 Material Design 界面。首发硬件谷歌选择了华硕来代工“Nexus Player”这是一个配置不足但够用的机顶盒。
安卓 TV 专注于三样东西:视频,音乐,以及游戏。你可以用一个小遥控器控制电视,它只有四向方向键以及四个按钮,后退、主页、麦克风以及播放/暂停。至于游戏,华硕克隆了一个 Xbox 360 手柄,给了玩家一堆按键和一对摇杆。
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-172334.png)
安卓 TV 的界面很简单。大幅的媒体略缩图占据了屏幕,可以横向滚动,这些媒体中有 Youtube、Google Play、Netflix、Hulu 以及其它来源。这些略缩图实际上是来自不同媒体源的“推荐”项目,它不是简单地将一个应用的内容填满屏幕。在那下面你可以直接访问应用和设置。
![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-2.png)
语音界面很赞。你可以告诉安卓 TV 播放任意你想要的内容,而不用通过图形界面去寻找。你还能在内容里获得更聪明的搜索结果,比如“显示和 Harrison Ford 有关的电影”。每个应用都可以给索引服务提供内容,而不是简单的应用集合。所有的这些应用都在 Play 商店有一个 TV 版本。开发者对安卓 TV 的特别支持还包括谷歌 cast 协议,允许用户从他们的手机和平板向电视投射视频和音乐。
### Android 5.1 Lollipop
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/lock1-150x150.jpg)
][11]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/2015-03-14-17.33.58-150x150.png)
][12]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/quick-150x150.jpg)
][13]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/new-quick-panels-150x150.jpg)
][14]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumepress-150x150.jpg)
][15]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumetouch-150x150.jpg)
][16]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumebell-150x150.jpg)
][17]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/interrupts1-150x150.jpg)
][18]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/heads-up1-150x150.jpg)
][19]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-2-150x150.jpg)
][20]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-150x150.jpg)
][21]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/gif1-150x150.gif)
][22]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/Untitled-1-150x150.gif)
][23]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/51-150x150.jpg)
][24]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/scrollbar-150x150.jpg)
][25]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/simcard-150x150.jpg)
][26]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/sip-150x150.jpg)
][27]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/status-screen-150x150.jpg)
][28]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/time-picker-150x150.jpg)
][29]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/icons-150x150.jpg)
][30]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/play-store-150x150.jpg)
][31]
安卓 5.1 在 2015 年 3 月发布,这是安卓最小的更新。它的目的主要是[修复 Nexus 6 上的加密性能问题][43],还添加了设备保护和一些小的界面调整。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/lock1.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/2015-03-14-17.33.58.png)
设备保护是唯一的新增界面,采用的是在开机设置显示新警告的形式。这个特性在设备被偷了之后“保护你的设备不被再次利用”。一旦设置了锁屏,设备保护就开始介入,并且会在擦除设备的时候被触发。如果你以机主正常的方式擦除设备——解锁手机并从设置选择“重置”——什么都不会发生。但如果你通过开发者工具擦除,设备会在下次开机设置的时候要求你“验证之前同步的谷歌账户”。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-2.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/time-picker.jpg)
这个想法是基于开发者是会知道之前登录的谷歌帐号凭证的,但小偷就不知道了,他们会卡在设置这一步。在现实中这引发了[一个猫鼠游戏][44],人们寻找漏洞来绕过设备保护,而谷歌知道了这个 bug 并修补它。OEM 定制也引入了一些有趣的 bug 来绕过设备保护。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/icons.jpg)
还有很多特别微小的界面改动,我们没法一一列在上面的图中。除了上面的图片描述之外没什么可说的了。
### Android Auto
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android_Auto_The_right_information_for_the_road_ahead_-_YouTube_-_Google_Chrome_2016-10-29_19-49-56-150x150.jpg)
][32]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android-Auto-150x150.jpg)
][33]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105548-150x150.png)
][34]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-091514-150x150.png)
][35]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-194221-150x150.png)
][36]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-110323-150x150.png)
][37]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-113659-150x150.png)
][38]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105654-150x150.png)
][39]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-1117341-150x150.jpg)
][40]
* [
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/IMG_3594-150x150.jpg)
][41]
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android_Auto_The_right_information_for_the_road_ahead_-_YouTube_-_Google_Chrome_2016-10-29_19-49-56-1440x810.jpg)
![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android-Auto-1440x882.jpg)
同样是在 2015 年 3 月,谷歌发布了“安卓 Auto”一个基于安卓界面的全新车载娱乐信息系统。安卓 Auto 是谷歌面对苹果的 CarPlay 交出的答卷,它们很多地方都很相似。安卓 Auto 不完全是个操作系统——它是一个运行在你手机上的“投射”界面,使用车载显示屏作为一块外置显示器。运行安卓 Auto 意味着拥有一款兼容的汽车,在手机上(安卓 5.0 及以上版本)安装了安卓 Auto 应用,并用 USB 线将手机连接到汽车。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105548.png)
安卓 Auto 给你已有的车载系统带来了谷歌的 Material Design 界面,给这个[通常挣扎于]设计好软件的平台带来了顶级的软件设计。安卓 Auto 是个对安卓界面的完全重新设计,以遵循世界各地对车载系统无数的规定。它没有通常充满应用图标的“主屏”,安卓的导航栏也变为了一个常驻的应用启动器(几乎像是个标签页式的界面)。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-113659.png)
算下来特性实际上只有四部分,导航栏从左到右是:谷歌地图,一个拨号/联系人界面,“主屏”部分混合了 Google Now 和一个通知面板还有一个音乐页面。最后一个按钮是一个“OEM”页面让你可以退出安卓 Auto返回到自带的车载系统这也是为了放置汽车制造商的定制特性。安卓 Auto 还带有谷歌的语音命令系统,以一个麦克风按钮的形式显示在屏幕右上角。
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-091514.png)
![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-110323.png)
安卓 Auto 的应用没有多少。它只允许两个类别的应用:音乐和信息应用。车载信息娱乐系统的规定意味着自定义界面不是个好选择。信息应用没有界面,并且可以接入语音系统,音乐应用也不会太多地改变界面,仅仅只是调整一下谷歌默认的“音乐应用”模板的颜色和图标。但实际上重要的是音乐和消息的送达,在不让驾驶员太多分心的情况下,一般的应用就没法使用了。
安卓 Auto 在它的最初发布之后就没看到多少更新了,但已经逐渐有很多汽车制造商支持了。到了 2017 年,将会有[超过 100][46] 款支持的汽车型号。
@ -172,7 +74,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor
作者:[RON AMADEO][a]
译者:[alim0x](https://github.com/alim0x)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,121 +0,0 @@
What is open source
===========================
The term "open source" refers to something people can modify and share because its design is publicly accessible.
The term originated in the context of software development to designate a specific approach to creating computer programs. Today, however, "open source" designates a broader set of values—what we call "[the open source way][1]." Open source projects, products, or initiatives embrace and celebrate principles of open exchange, collaborative participation, rapid prototyping, transparency, meritocracy, and community-oriented development.
### What is open source software?
Open source software is software with source code that anyone can inspect, modify, and enhance.
"Source code" is the part of software that most computer users don't ever see; it's the code computer programmers can manipulate to change how a piece of software—a "program" or "application"—works. Programmers who have access to a computer program's source code can improve that program by adding features to it or fixing parts that don't always work correctly.
### What's the difference between open source software and other types of software?
Some software has source code that only the person, team, or organization who created it—and maintains exclusive control over it—can modify. People call this kind of software "proprietary" or "closed source" software.
Only the original authors of proprietary software can legally copy, inspect, and alter that software. And in order to use proprietary software, computer users must agree (usually by signing a license displayed the first time they run this software) that they will not do anything with the software that the software's authors have not expressly permitted. Microsoft Office and Adobe Photoshop are examples of proprietary software.
Open source software is different. Its authors [make its source code available][2] to others who would like to view that code, copy it, learn from it, alter it, or share it. [LibreOffice][3] and the [GNU Image Manipulation Program][4] are examples of open source software.
As they do with proprietary software, users must accept the terms of a [license][5] when they use open source software—but the legal terms of open source licenses differ dramatically from those of proprietary licenses.
Open source licenses affect the way people can [use, study, modify, and distribute][6] software. In general, open source licenses grant computer users [permission to use open source software for any purpose they wish][7]. Some open source licenses—what some people call "copyleft" licenses—stipulate that anyone who releases a modified open source program must also release the source code for that program alongside it. Moreover, [some open source licenses][8] stipulate that anyone who alters and shares a program with others must also share that program's source code without charging a licensing fee for it.
By design, open source software licenses promote collaboration and sharing because they permit other people to make modifications to source code and incorporate those changes into their own projects. They encourage computer programmers to access, view, and modify open source software whenever they like, as long as they let others do the same when they share their work.
### Is open source software only important to computer programmers?
No. Open source technology and open source thinking both benefit programmers and non-programmers.
Because early inventors built much of the Internet itself on open source technologies—like [the Linux operating system][9] and the[ Apache Web server][10] application—anyone using the Internet today benefits from open source software.
Every time computer users view web pages, check email, chat with friends, stream music online, or play multiplayer video games, their computers, mobile phones, or gaming consoles connect to a global network of computers using open source software to route and transmit their data to the "local" devices they have in front of them. The computers that do all this important work are typically located in faraway places that users don't actually see or can't physically access—which is why some people call these computers "remote computers."
More and more, people rely on remote computers when performing tasks they might otherwise perform on their local devices. For example, they may use online word processing, email management, and image editing software that they don't install and run on their personal computers. Instead, they simply access these programs on remote computers by using a Web browser or mobile phone application. When they do this, they're engaged in "remote computing."
Some people call remote computing "cloud computing," because it involves activities (like storing files, sharing photos, or watching videos) that incorporate not only local devices but also a global network of remote computers that form an "atmosphere" around them.
Cloud computing is an increasingly important aspect of everyday life with Internet-connected devices. Some cloud computing applications, like Google Apps, are proprietary. Others, like ownCloud and Nextcloud, are open source.
Cloud computing applications run "on top" of additional software that helps them operate smoothly and efficiently, so people will often say that software running "underneath" cloud computing applications acts as a "platform" for those applications. Cloud computing platforms can be open source or closed source. OpenStack is an example of an open source cloud computing platform.
### Why do people prefer using open source software?
People prefer open source software to proprietary software for a number of reasons, including:
Control. Many people prefer open source software because they [have more control][11] over that kind of software. They can examine the code to make sure it's not doing anything they don't want it to do, and they can change parts of it they don't like. Users who aren't programmers also benefit from open source software, because they can use this software for any purpose they wish—not merely the way someone else thinks they should.
Training. Other people like open source software because it helps them [become better programmers][12]. Because open source code is publicly accessible, students can easily study it as they learn to make better software. Students can also share their work with others, inviting comment and critique, as they develop their skills. When people discover mistakes in programs' source code, they can share those mistakes with others to help them avoid making those same mistakes themselves.
Security. Some people prefer open source software because they consider it more [secure][13] and stable than proprietary software. Because anyone can view and modify open source software, someone might spot and correct errors or omissions that a program's original authors might have missed. And because so many programmers can work on a piece of open source software without asking for permission from original authors, they can fix, update, and upgrade open source software more [quickly][14] than they can proprietary software.
Stability. Many users prefer open source software to proprietary software for important, long-term projects. Because programmers [publicly distribute][15] the source code for open source software, users relying on that software for critical tasks can be sure their tools won't disappear or fall into disrepair if their original creators stop working on them. Additionally, open source software tends to both incorporate and operate according to open standards.
### Doesn't "open source" just mean something is free of charge?
No. This is a [common misconception][16] about what "open source" implies, and the concept's implications are [not only economic][17].
Open source software programmers can charge money for the open source software they create or to which they contribute. But in some cases, because an open source license might require them to release their source code when they sell software to others, some programmers find that charging users money for software services and support (rather than for the software itself) is more lucrative. This way, their software remains free of charge, and they [make money helping others][18] install, use, and troubleshoot it.
While some open source software may be free of charge, skill in programming and troubleshooting open source software can be [quite valuable][19]. Many employers specifically seek to [hire programmers with experience][20] working on open source software.
### What is open source "beyond software"?
At Opensource.com, we like to say that we're interested in the ways open source values and principles apply to the world beyond software. We like to think of open source as not only a way to develop and license computer software, but also an attitude.
Approaching all aspects of life "[the open source way][21]" means expressing a willingness to share, collaborating with others in ways that are transparent (so that others can watch and join too), embracing failure as a means of improving, and expecting—even encouraging—everyone else to do the same.
It also means committing to playing an active role in improving the world, which is possible only when [everyone has access][22] to the way that world is designed.
The world is full of "source code"—[blueprints][23], [recipes][24], [rules][25]—that guide and shape the way we think and act in it. We believe this underlying code (whatever its form) should be open, accessible, and shared—so many people can have a hand in altering it for the better.
Here, we tell stories about the impact of open source values on all areas of life—[science][26], [education][27], [government][28], [manufacturing][29], health, law, and [organizational dynamics][30]. We're a community committed to telling others how the open source way is the best way, because a love of open source is just like anything else: it's better when it's shared.
Where can I learn more about open source?
We've compiled several resources designed to help you learn more about [open source. We recommend you read our open source FAQs, how-to guides, and tutorials][31] to get started.
--------------------------------------------------------------------------------
via: https://opensource.com/resources/what-open-source
作者:[opensource.com][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: opensource.com
[1]:https://opensource.com/open-source-way
[2]:https://opensource.com/business/13/5/open-source-your-code
[3]:https://www.libreoffice.org/
[4]:http://www.gimp.org/
[5]:https://opensource.com/law/13/1/which-open-source-software-license-should-i-use
[6]:https://opensource.com/law/10/10/license-compliance-not-problem-open-source-users
[7]:https://opensource.org/docs/osd
[8]:https://opensource.com/law/13/5/does-your-code-need-license
[9]:https://opensource.com/resources/what-is-linux
[10]:http://httpd.apache.org/
[11]:https://opensource.com/life/13/5/tumblr-open-publishing
[12]:https://opensource.com/life/13/6/learning-program-open-source-way
[13]:https://opensource.com/government/10/9/scap-computer-security-rest-us
[14]:https://opensource.com/government/13/2/bug-fix-day
[15]:https://opensource.com/life/12/9/should-we-develop-open-source-openly
[16]:https://opensource.com/education/12/7/clearing-open-source-misconceptions
[17]:https://opensource.com/open-organization/16/5/appreciating-full-power-open
[18]:https://opensource.com/business/14/7/making-your-product-free-and-open-source-crazy-talk
[19]:https://opensource.com/business/16/2/add-open-source-to-your-resume
[20]:https://opensource.com/business/16/5/2016-open-source-jobs-report
[21]:https://opensource.com/open-source-way
[22]:https://opensource.com/resources/what-open-access
[23]:https://opensource.com/life/11/6/architecture-open-source-applications-learn-those-you
[24]:https://opensource.com/life/12/6/open-source-like-sharing-recipe
[25]:https://opensource.com/life/12/4/day-my-mind-became-open-sourced
[26]:https://opensource.com/resources/open-science
[27]:https://opensource.com/resources/what-open-education
[28]:https://opensource.com/resources/open-government
[29]:https://opensource.com/resources/what-open-hardware
[30]:https://opensource.com/resources/what-open-organization
[31]:https://opensource.com/resources

View File

@ -1,89 +0,0 @@
Tips for non-native English speakers working on open source projects
============================================================
![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects")
Image by : 
opensource.com
The primary language of most open source projects is English, but open source users and contributors span the globe. Non-native speakers face many communication and cultural challenges when participating in the ecosystem.
In this article, we will share challenges, how to overcome them, and best practices for easing onboarding of non-native speakers, as non-native English speakers and contributors to OpenStack. We are based in Japan, Brazil, and China, and work daily with the huge OpenStack community that is spread around the world.
The official language of OpenStack is English, which means we communicate daily as non-native speakers.
### Challenges
Non-native English speakers face specific communication challenges when starting out in open source communities: they are related to limited language skills and cultural disparity.
### Language skills
Let's focus on the specific language skills behind reading, writing, listening, and speaking.
Reading: This is the easiest but also the most important skill. It is the easiest because if you can't understand what is written you have the opportunity to read it again, or as many times as needed. If you encounter an uncommon phrase, expression, or abbreviation, you can use a dictionary or translator. On the other hand, it is the most important skill because for most open source projects the main means of communication are mailing lists and IRC.
Writing: English grammar is an issue especially for languages that structure sentences differently. This may pose a problem for communication in writing emails and communicating via IRC channels. For some, writing long and beautiful sentences is difficult, and the reliance on simpler sentences is prevalent because these are easy to write and convey understanding.
Listening: This is more problematic than reading and writing for non-native speakers. Normally, conversation between native English speakers is very fast, which makes following the discussions for those still learning difficult and limits their participation in those discussions. Furthermore, trying to understand the variety of accents in a globally spread community adds to the complexity. Interestingly, American pronunciation is often easier to understand than others.
Speaking: Speaking is more difficult than listening because the participant's vocabulary may a bit limited. Furthermore, English's phonemes and grammar are often very different from a non-native speaker's mother language, making an interaction even more difficult to understand.
### Cultural differences
Each culture has different norms when interacting with other people in the open source community. For example, the Japanese tend not to say yes or no clearly as a way to respect others and to avoid fighting each other. This is often very different from other cultures and may cause misunderstanding of what was expressed.
In Chinese culture, people prefer to just say yes, instead of saying no or trying to negotiate. In a globally distributed community as OpenStack, this often leads to the lack of confidence when expressing opinions. Furthermore, Chinese people like to list the facts first and give the thesis at the end, and this can cause confusion for people from other cultures because it is not what they expect.
A Brazilian, for instance, may find that discussions are driven in a similar way; however, some cultures are very short and direct in responses, which may sound a bit rude.
### Overcoming obstacles
Challenges related to language skills are easier to overcome than cultural ones. Cultural differences need to be respected, while English skills can always be improved.
In order to brush up on your language skills, be in contact with the language as much as you can. Do not think about your limitations. Just do your best and you will improve eventually.
Read as much as you can, because this will help you gather vocabulary. Communicating through chat and mailing lists daily helps, too. Some tools, such as real-time dictionaries and translators, are very useful with these platforms.
Talking to others or yourself helps you become comfortable speaking out more frequently. Having one-on-one conversations to express your ideas is easier than discussing in larger groups.
### Onboarding newcomers
A few initiatives from both newcomers and native speakers may positively affect the onboarding process.
### Newcomers
Speak and write your opinion, and ask your questions; this participation is always a good opportunity to exercise your English. Do not be afraid.
For meetings, make sure you prepare yourself in advance so you will be comfortable with the subject and more confident about the opinions you are expressing.
Make friends who are English speakers and talk more to practice your English skills.
Writing blogs and technical articles in English are also great ideas.
### Tips for native English speakers
Please speak slowly and use simple words and sentences. Don't make fun of non-native English speakers if you find something wrong about the English they used. Try to encourage newcomers to express their opinions, and make them comfortable enough to do so.
_This article was co-written by Masayuki Igawa, Dong Ma, and Samuel de Medeiros Queiroz. Learn more in their talk at linux.conf.au 2017 ([#lca2017][1]) in Hobart: [Non-native English speakers in Open Source communities: A True Story.][2]_
--------------------------------------------------------------------------------
作者简介:
![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/myface_s.jpg?itok=-dy9_LQd)
Masayuki Igawa - Masayuki Igawa is a software engineer for over 15 years on a wide range of software projects, and developing open source software related to Linux kernel and virtualization. He's been an active technical contributor to OpenStack since 2013. He is a core member of some OpenStack QA projects such as Tempest, subunit2sql, openstack-health and stackviz. He currently works for HPE's Upstream OpenStack team to make OpenStack better for everyone. He has previously been a speaker at OpenStack Summits,
--------------------------------------------------------------------------------
via: https://opensource.com/article/17/1/non-native-speakers-take-open-source-communities
作者:[Masayuki Igawa][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://opensource.com/users/masayukig
[1]:https://twitter.com/search?q=%23lca2017&src=typd
[2]:https://linux.conf.au/schedule/presentation/70/

Some files were not shown because too many files have changed in this diff Show More