diff --git a/translated/tech/20180806 Anatomy of a Linux DNS Lookup - Part IV.md b/published/20180806 Anatomy of a Linux DNS Lookup - Part IV.md similarity index 77% rename from translated/tech/20180806 Anatomy of a Linux DNS Lookup - Part IV.md rename to published/20180806 Anatomy of a Linux DNS Lookup - Part IV.md index 9f3dd93437..e2f893b210 100644 --- a/translated/tech/20180806 Anatomy of a Linux DNS Lookup - Part IV.md +++ b/published/20180806 Anatomy of a Linux DNS Lookup - Part IV.md @@ -16,12 +16,8 @@ Linux DNS 查询剖析(第四部分) 在第四部分中,我将介绍容器如何完成 DNS 查询。你想的没错,也不是那么简单。 -* * * - ### 1) Docker 和 DNS -============================================================ - 在 [Linux DNS 查询剖析(第三部分)][3] 中,我们介绍了 `dnsmasq`,其工作方式如下:将 DNS 查询指向到 localhost 地址 `127.0.0.1`,同时启动一个进程监听 `53` 端口并处理查询请求。 在按上述方式配置 DNS 的主机上,如果运行了一个 Docker 容器,容器内的 `/etc/resolv.conf` 文件会是怎样的呢? @@ -72,29 +68,29 @@ google.com.             112     IN      A       172.217.23.14 在这个问题上,Docker 的解决方案是忽略所有可能的复杂情况,即无论主机中使用什么 DNS 服务器,容器内都使用 Google 的 DNS 服务器 `8.8.8.8` 和 `8.8.4.4` 完成 DNS 查询。 - _我的经历:在 2013 年,我遇到了使用 Docker 以来的第一个问题,与 Docker 的这种 DNS 解决方案密切相关。我们公司的网络屏蔽了 `8.8.8.8` 和 `8.8.4.4`,导致容器无法解析域名。_ +_我的经历:在 2013 年,我遇到了使用 Docker 以来的第一个问题,与 Docker 的这种 DNS 解决方案密切相关。我们公司的网络屏蔽了 `8.8.8.8` 和 `8.8.4.4`,导致容器无法解析域名。_ -这就是 Docker 容器的情况,但对于包括 Kubernetes 在内的容器 _编排引擎orchestrators_,情况又有些不同。 +这就是 Docker 容器的情况,但对于包括 Kubernetes 在内的容器 编排引擎orchestrators,情况又有些不同。 ### 2) Kubernetes 和 DNS -在 Kubernetes 中,最小部署单元是 `pod`;`pod` 是一组相互协作的容器,共享 IP 地址(和其它资源)。 +在 Kubernetes 中,最小部署单元是 pod;它是一组相互协作的容器,共享 IP 地址(和其它资源)。 Kubernetes 面临的一个额外的挑战是,将 Kubernetes 服务请求(例如,`myservice.kubernetes.io`)通过对应的解析器resolver,转发到具体服务地址对应的内网地址private network。这里提到的服务地址被称为归属于“集群域cluster domain”。集群域可由管理员配置,根据配置可以是 `cluster.local` 或 `myorg.badger` 等。 -在 Kubernetes 中,你可以为 `pod` 指定如下四种 `pod` 内 DNS 查询的方式。 +在 Kubernetes 中,你可以为 pod 指定如下四种 pod 内 DNS 查询的方式。 -* Default +**Default** -在这种(名称容易让人误解)的方式中,`pod` 与其所在的主机采用相同的 DNS 查询路径,与前面介绍的主机 DNS 查询一致。我们说这种方式的名称容易让人误解,因为该方式并不是默认选项!`ClusterFirst` 才是默认选项。 +在这种(名称容易让人误解)的方式中,pod 与其所在的主机采用相同的 DNS 查询路径,与前面介绍的主机 DNS 查询一致。我们说这种方式的名称容易让人误解,因为该方式并不是默认选项!`ClusterFirst` 才是默认选项。 如果你希望覆盖 `/etc/resolv.conf` 中的条目,你可以添加到 `kubelet` 的配置中。 -* ClusterFirst +**ClusterFirst** 在 `ClusterFirst` 方式中,遇到 DNS 查询请求会做有选择的转发。根据配置的不同,有以下两种方式: -第一种方式配置相对古老但更简明,即采用一个规则:如果请求的域名不是集群域的子域,那么将其转发到 `pod` 所在的主机。 +第一种方式配置相对古老但更简明,即采用一个规则:如果请求的域名不是集群域的子域,那么将其转发到 pod 所在的主机。 第二种方式相对新一些,你可以在内部 DNS 中配置选择性转发。 @@ -115,27 +111,27 @@ data: 在 `stubDomains` 条目中,可以为特定域名指定特定的 DNS 服务器;而 `upstreamNameservers` 条目则给出,待查询域名不是集群域子域情况下用到的 DNS 服务器。 -这是通过在一个 `pod` 中运行我们熟知的 `dnsmasq` 实现的。 +这是通过在一个 pod 中运行我们熟知的 `dnsmasq` 实现的。 ![kubedns](https://zwischenzugs.files.wordpress.com/2018/08/kubedns.png?w=525) 剩下两种选项都比较小众: -* ClusterFirstWithHostNet +**ClusterFirstWithHostNet** -适用于 `pod` 使用主机网络的情况,例如绕开 Docker 网络配置,直接使用与 `pod` 对应主机相同的网络。 +适用于 pod 使用主机网络的情况,例如绕开 Docker 网络配置,直接使用与 pod 对应主机相同的网络。 -* None +**None** `None` 意味着不改变 DNS,但强制要求你在 `pod` 规范文件specification的 `dnsConfig` 条目中指定 DNS 配置。 ### CoreDNS 即将到来 -除了上面提到的那些,一旦 `CoreDNS` 取代Kubernetes 中的 `kube-dns`,情况还会发生变化。`CoreDNS` 相比 `kube-dns` 具有可配置性更高、效率更高等优势。 +除了上面提到的那些,一旦 `CoreDNS` 取代 Kubernetes 中的 `kube-dns`,情况还会发生变化。`CoreDNS` 相比 `kube-dns` 具有可配置性更高、效率更高等优势。 如果想了解更多,参考[这里][5]。 -如果你对 OpenShift 的网络感兴趣,我曾写过一篇[文章][6]可供你参考。但文章中 OpenShift 的版本是 `3.6`,可能有些过时。 +如果你对 OpenShift 的网络感兴趣,我曾写过一篇[文章][6]可供你参考。但文章中 OpenShift 的版本是 3.6,可能有些过时。 ### 第四部分总结 @@ -152,14 +148,14 @@ via: https://zwischenzugs.com/2018/08/06/anatomy-of-a-linux-dns-lookup-part-iv/ 作者:[zwischenzugs][a] 译者:[pinewall](https://github.com/pinewall) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://zwischenzugs.com/ -[1]:https://zwischenzugs.com/2018/06/08/anatomy-of-a-linux-dns-lookup-part-i/ -[2]:https://zwischenzugs.com/2018/06/18/anatomy-of-a-linux-dns-lookup-part-ii/ -[3]:https://zwischenzugs.com/2018/07/06/anatomy-of-a-linux-dns-lookup-part-iii/ +[1]:https://linux.cn/article-9943-1.html +[2]:https://linux.cn/article-9949-1.html +[3]:https://linux.cn/article-9972-1.html [4]:https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#impacts-on-pods [5]:https://coredns.io/ [6]:https://zwischenzugs.com/2017/10/21/openshift-3-6-dns-in-pictures/ diff --git a/translated/tech/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md b/published/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md similarity index 66% rename from translated/tech/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md rename to published/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md index 02bc39addc..36c159ac16 100644 --- a/translated/tech/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md +++ b/published/20180918 How To Force APT Package Manager To Use IPv4 In Ubuntu 16.04.md @@ -3,7 +3,7 @@ ![](https://www.ostechnix.com/wp-content/uploads/2018/09/ipv4-720x340.png) -**APT**, 是 **A** dvanced **P** ackage **T** ool 的缩写,是基于 Debian 的系统的默认包管理器。我们可以使用 APT 安装、更新、升级和删除应用程序。最近,我一直遇到一个奇怪的错误。每当我尝试更新我的 Ubuntu 16.04 时,我都会收到此错误 - **“0% [Connecting to in.archive.ubuntu.com (2001:67c:1560:8001::14)]”** ,同时更新流程会卡住很长时间。我的网络连接没问题,我可以 ping 通所有网站,包括 Ubuntu 官方网站。在搜索了一番谷歌后,我意识到 Ubuntu 镜像有时无法通过 IPv6 访问。在我强制将 APT 包管理器在更新系统时使用 IPv4 代替 IPv6 访问 Ubuntu 镜像后,此问题得以解决。如果你遇到过此错误,可以按照以下说明解决。 +**APT**, 是 **A** dvanced **P** ackage **T** ool 的缩写,是基于 Debian 的系统的默认包管理器。我们可以使用 APT 安装、更新、升级和删除应用程序。最近,我一直遇到一个奇怪的错误。每当我尝试更新我的 Ubuntu 16.04 时,我都会收到此错误 - **“0% [Connecting to in.archive.ubuntu.com (2001:67c:1560:8001::14)]”** ,同时更新流程会卡住很长时间。我的网络连接没问题,我可以 ping 通所有网站,包括 Ubuntu 官方网站。在搜索了一番谷歌后,我意识到 Ubuntu 镜像站点有时无法通过 IPv6 访问。在我强制将 APT 包管理器在更新系统时使用 IPv4 代替 IPv6 访问 Ubuntu 镜像站点后,此问题得以解决。如果你遇到过此错误,可以按照以下说明解决。 ### 强制 APT 包管理器在 Ubuntu 16.04 中使用 IPv4 @@ -11,13 +11,12 @@ ``` $ sudo apt-get -o Acquire::ForceIPv4=true update - $ sudo apt-get -o Acquire::ForceIPv4=true upgrade ``` 瞧!这次更新很快就完成了。 -你还可以使用以下命令在 **/etc/apt/apt.conf.d/99force-ipv4** 中添加以下行,以便将来对所有 **apt-get** 事务保持持久性: +你还可以使用以下命令在 `/etc/apt/apt.conf.d/99force-ipv4` 中添加以下行,以便将来对所有 `apt-get` 事务保持持久性: ``` $ echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4 @@ -25,7 +24,7 @@ $ echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4 **免责声明:** -我不知道最近是否有人遇到这个问题,但我今天在我的 Ubuntu 16.04 LTS 虚拟机中遇到了至少四五次这样的错误,我按照上面的说法解决了这个问题。我不确定这是推荐的解决方案。请浏览 Ubuntu 论坛来确保此方法合法。由于我只是一个 VM,我只将它用于测试和学习目的,我不介意这种方法的真实性。请自行承担使用风险。 +我不知道最近是否有人遇到这个问题,但我今天在我的 Ubuntu 16.04 LTS 虚拟机中遇到了至少四、五次这样的错误,我按照上面的说法解决了这个问题。我不确定这是推荐的解决方案。请浏览 Ubuntu 论坛来确保此方法合法。由于我只是一个 VM,我只将它用于测试和学习目的,我不介意这种方法的真实性。请自行承担使用风险。 希望这有帮助。还有更多的好东西。敬请关注! @@ -40,7 +39,7 @@ via: https://www.ostechnix.com/how-to-force-apt-package-manager-to-use-ipv4-in-u 作者:[SK][a] 选题:[lujun9972](https://github.com/lujun9972) 译者:[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/) 荣誉推出 diff --git a/sources/talk/20180123 Moving to Linux from dated Windows machines.md b/sources/talk/20180123 Moving to Linux from dated Windows machines.md index 74bf66df68..6acd6e53f2 100644 --- a/sources/talk/20180123 Moving to Linux from dated Windows machines.md +++ b/sources/talk/20180123 Moving to Linux from dated Windows machines.md @@ -1,4 +1,3 @@ -translating by leowang Moving to Linux from dated Windows machines ====== diff --git a/sources/talk/20180127 Write Dumb Code.md b/sources/talk/20180127 Write Dumb Code.md index 505e8198df..acc647b0e5 100644 --- a/sources/talk/20180127 Write Dumb Code.md +++ b/sources/talk/20180127 Write Dumb Code.md @@ -1,5 +1,3 @@ -translating by ynmlml - Write Dumb Code ====== The best way you can contribute to an open source project is to remove lines of code from it. We should endeavor to write code that a novice programmer can easily understand without explanation or that a maintainer can understand without significant time investment. diff --git a/sources/talk/20180308 20 questions DevOps job candidates should be prepared to answer.md b/sources/talk/20180308 20 questions DevOps job candidates should be prepared to answer.md index b862ce311e..da43855266 100644 --- a/sources/talk/20180308 20 questions DevOps job candidates should be prepared to answer.md +++ b/sources/talk/20180308 20 questions DevOps job candidates should be prepared to answer.md @@ -1,4 +1,4 @@ -Translating by FelixYFZ 20 questions DevOps job candidates should be prepared to answer +20 questions DevOps job candidates should be prepared to answer ====== ![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hire-job-career.png?itok=SrZo0QJ3) diff --git a/sources/talk/20180410 Microservices Explained.md b/sources/talk/20180410 Microservices Explained.md index 5a2151a00b..1d7e946a12 100644 --- a/sources/talk/20180410 Microservices Explained.md +++ b/sources/talk/20180410 Microservices Explained.md @@ -1,4 +1,3 @@ -(translating by runningwater) Microservices Explained ====== diff --git a/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md b/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md index 1f9b80cd13..29e4ea2f48 100644 --- a/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md +++ b/sources/talk/20180419 3 tips for organizing your open source project-s workflow on GitHub.md @@ -1,4 +1,3 @@ -translating by aiwhj 3 tips for organizing your open source project's workflow on GitHub ====== diff --git a/sources/talk/20180724 Why moving all your workloads to the cloud is a bad idea.md b/sources/talk/20180724 Why moving all your workloads to the cloud is a bad idea.md index c4a6162068..1d97805178 100644 --- a/sources/talk/20180724 Why moving all your workloads to the cloud is a bad idea.md +++ b/sources/talk/20180724 Why moving all your workloads to the cloud is a bad idea.md @@ -1,5 +1,3 @@ -Translating by jessie-pang - Why moving all your workloads to the cloud is a bad idea ====== diff --git a/sources/tech/20140805 How to Install Cinnamon Desktop on Ubuntu.md b/sources/tech/20140805 How to Install Cinnamon Desktop on Ubuntu.md index 78ba32e2a2..6c6e54934b 100644 --- a/sources/tech/20140805 How to Install Cinnamon Desktop on Ubuntu.md +++ b/sources/tech/20140805 How to Install Cinnamon Desktop on Ubuntu.md @@ -1,4 +1,4 @@ -How to Install Cinnamon Desktop on Ubuntu +dianbanjiu Tranting How to Install Cinnamon Desktop on Ubuntu ====== **This tutorial shows you how to install Cinnamon desktop environment on Ubuntu.** diff --git a/sources/tech/20171111 A CEOs Guide to Emacs.md b/sources/tech/20171111 A CEOs Guide to Emacs.md index ad75b856f0..a694d07917 100644 --- a/sources/tech/20171111 A CEOs Guide to Emacs.md +++ b/sources/tech/20171111 A CEOs Guide to Emacs.md @@ -1,4 +1,4 @@ -# mandeler translating A CEO's Guide to Emacs +A CEO's Guide to Emacs ============================================================ Years—no, decades—ago, I lived in Emacs. I wrote code and documents, managed email and calendar, and shelled all in the editor/OS. I was quite happy. Years went by and I moved to newer, shinier things. As a result, I forgot how to do tasks as basic as efficiently navigating files without a mouse. About three months ago, noticing just how much of my time was spent switching between applications and computers, I decided to give Emacs another try. It was a good decision for several reasons that will be covered in this post. Covered too are `.emacs` and Dropbox tips so that you can set up a good, movable environment. diff --git a/sources/tech/20180215 Build a bikesharing app with Redis and Python.md b/sources/tech/20180215 Build a bikesharing app with Redis and Python.md index 67ddd07730..06e4c6949a 100644 --- a/sources/tech/20180215 Build a bikesharing app with Redis and Python.md +++ b/sources/tech/20180215 Build a bikesharing app with Redis and Python.md @@ -1,5 +1,3 @@ -hankchow translating - Build a bikesharing app with Redis and Python ====== diff --git a/sources/tech/20180516 Manipulating Directories in Linux.md b/sources/tech/20180516 Manipulating Directories in Linux.md deleted file mode 100644 index 4cc8ca4ea1..0000000000 --- a/sources/tech/20180516 Manipulating Directories in Linux.md +++ /dev/null @@ -1,183 +0,0 @@ -Translating by way-ww -Manipulating Directories in Linux -====== - -![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/branches-238379_1920_0.jpg?itok=2PlNpsVu) - -If you are new to this series (and to Linux), [take a look at our first installment][1]. In that article, we worked our way through the tree-like structure of the Linux filesystem, or more precisely, the File Hierarchy Standard. I recommend reading through it to make sure you understand what you can and cannot safely touch. Because this time around, I’ll show how to get all touchy-feely with your directories. - -### Making Directories - -Let's get creative before getting destructive, though. To begin, open a terminal window and use `mkdir` to create a new directory like this: -``` -mkdir - -``` - -If you just put the directory name, the directory will appear hanging off the directory you are currently in. If you just opened a terminal, that will be your home directory. In a case like this, we say the directory will be created _relative_ to your current position: -``` -$ pwd #This tells you where you are now -- see our first tutorial -/home/ -$ mkdir newdirectory #Creates /home//newdirectory - -``` - -(Note that you do not have to type the text following the `#`. Text following the pound symbol `#` is considered a comment and is used to explain what is going on. It is ignored by the shell). - -You can create a directory within an existing directory hanging off your current location by specifying it in the command line: -``` -mkdir Documents/Letters - -``` - -Will create the _Letters_ directory within the _Documents_ directory. - -You can also create a directory above where you are by using `..` in the path. Say you move into the _Documents/Letters/_ directory you just created and you want to create a _Documents/Memos/_ directory. You can do: -``` -cd Documents/Letters # Move into your recently created Letters/ directory -mkdir ../Memos - -``` - -Again, all of the above is done relative to you current position. This is called using a _relative path_. - -You can also use an _absolute path_ to directories: This means telling `mkdir` where to put your directory in relation to the root (`/`) directory: -``` -mkdir /home//Documents/Letters - -``` - -Change `` to your user name in the command above and it will be equivalent to executing `mkdir Documents/Letters` from your home directory, except that it will work from wherever you are located in the directory tree. - -As a side note, regardless of whether you use a relative or an absolute path, if the command is successful, `mkdir` will create the directory silently, without any apparent feedback whatsoever. Only if there is some sort of trouble will `mkdir` print some feedback after you hit _[Enter]_. - -As with most other command-line tools, `mkdir` comes with several interesting options. The `-p` option is particularly useful, as it lets you create directories within directories within directories, even if none exist. To create, for example, a directory for letters to your Mom within _Documents/_ , you could do: -``` -mkdir -p Documents/Letters/Family/Mom - -``` - -And `mkdir` will create the whole branch of directories above _Mom/_ and also the directory _Mom/_ for you, regardless of whether any of the parent directories existed before you issued the command. - -You can also create several folders all at once by putting them one after another, separated by spaces: -``` -mkdir Letters Memos Reports - -``` - -will create the directories _Letters/_ , _Memos/_ and _Reports_ under the current directory. - -### In space nobody can hear you scream - -... Which brings us to the tricky question of spaces in directory names. Can you use spaces in directory names? Yes, you can. Is it advised you use spaces? No, absolutely not. Spaces make everything more complicated and, potentially, dangerous. - -Say you want to create a directory called _letters mom/_. If you didn't know any better, you could type: -``` -mkdir letters mom - -``` - -But this is WRONG! WRONG! WRONG! As we saw above, this will create two directories, _letters/_ and _mom/_ , but not _letters mom/_. - -Agreed that this is a minor annoyance: all you have to do is delete the two directories and start over. No big deal. - -But, wait! Deleting directories is where things get dangerous. Imagine you did create _letters mom/_ using a graphical tool, like, say [Dolphin][2] or [Nautilus][3]. If you suddenly decide to delete _letters mom/_ from a terminal, and you have another directory just called _letters/_ under the same directory, and said directory is full of important documents, and you tried this: -``` -rmdir letters mom - -``` - -You would risk removing _letters/_. I say "risk" because fortunately `rmdir`, the instruction used to remove directories, has a built in safeguard and will warn you if you try to delete a non-empty directory. - -However, this: -``` -rm -Rf letters mom - -``` - -(and this is a pretty standard way of getting rid of directories and their contents) will completely obliterate _letters/_ and will never even tell you what just happened. - -The `rm` command is used to delete files and directories. When you use it with the options `-R` (delete _recursively_ ) and `-f` ( _force_ deletion), it will burrow down into a directory and its subdirectories, deleting all the files they contain, then deleting the subdirectories themselves, then it will delete all the files in the top directory and then the directory itself. - -`rm -Rf` is an instruction you must handle with extreme care. - -My advice is, instead of spaces, use underscores (`_`), but if you still insist on spaces, there are two ways of getting them to work. You can use single or double quotes (`'` or `"`) like so: -``` -mkdir 'letters mom' -mkdir "letters dad" - -``` - -Or, you can _escape_ the spaces. Some characters have a special meaning for the shell. Spaces, as you have seen, are used to separate options and arguments on the command line. "Separating options and arguments" falls under the category of "special meaning". When you want the shell to ignore the special meaning of a character, you need to _escape_ it and to escape a character, you put a backslash (`\`) in front of it: -``` -mkdir letters\ mom -mkdir letter\ dad - -``` - -There are other special characters that would need escaping, like the apostrophe or single quote (`'`), double quotes (`"`), and the ampersand (`&`): -``` -mkdir mom\ \&\ dad\'s\ letters - -``` - -I know what you're thinking: If the backslash has a special meaning (to wit, telling the shell it has to escape the next character), that makes it a special character, too. Then, how would you escape the escape character which is `\`? - -Turns out, the exact way you escape any other special character: -``` -mkdir special\\characters - -``` - -will produce a directory called _special\characters_. - -Confusing? Of course. That's why you should avoid using special characters, including spaces, in directory names. - -For the record, here is a list of special characters you can refer to just in case. - -### Things to Remember - - * Use `mkdir ` to create a new directory. - * Use `rmdir ` to delete a directory (only works if it is empty). - * Use `rm -Rf ` to annihilate a directory -- use with extreme caution. - * Use a relative path to create directories relative to your current directory: `mkdir newdir.`. - * Use an absolute path to create directories relative to the root directory (`/`): `mkdir /home//newdir` - * Use `..` to create a directory in the directory above the current directory: `mkdir ../newdir` - * You can create several directories all in one go by separating them with spaces on the command line: `mkdir onedir twodir threedir` - * You can mix and mash relative and absolute paths when creating several directories simultaneously: `mkdir onedir twodir /home//threedir` - * Using spaces and special characters in directory names guarantees plenty of headaches and heartburn. Don't do it. - - - -For more information, you can look up the manuals of `mkdir`, `rmdir` and `rm`: -``` -man mkdir -man rmdir -man rm - -``` - -To exit the man pages, press _[q]_. - -### Next Time - -In the next installment, you'll learn about creating, modifying, and erasing files, as well as everything you need to know about permissions and privileges. See you then! - -Learn more about Linux through the free ["Introduction to Linux" ][4]course from The Linux Foundation and edX. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/learn/2018/5/manipulating-directories-linux - -作者:[Paul Brown][a] -选题:[lujun9972](https://github.com/lujun9972) -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/bro66 -[1]:https://www.linux.com/blog/learn/intro-to-linux/2018/4/linux-filesystem-explained -[2]:https://userbase.kde.org/Dolphin -[3]:https://projects-old.gnome.org/nautilus/screenshots.html -[4]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux diff --git a/sources/tech/20180518 How to Manage Fonts in Linux.md b/sources/tech/20180518 How to Manage Fonts in Linux.md index 12b450c778..0faca7fa17 100644 --- a/sources/tech/20180518 How to Manage Fonts in Linux.md +++ b/sources/tech/20180518 How to Manage Fonts in Linux.md @@ -1,5 +1,3 @@ -translating by Auk7F7 - How to Manage Fonts in Linux ====== diff --git a/sources/tech/20180528 What is behavior-driven Python.md b/sources/tech/20180528 What is behavior-driven Python.md deleted file mode 100644 index 100e0b0313..0000000000 --- a/sources/tech/20180528 What is behavior-driven Python.md +++ /dev/null @@ -1,308 +0,0 @@ -translating by Flowsnow -What is behavior-driven Python? -====== -![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk) -Have you heard about [behavior-driven development][1] (BDD) and wondered what all the buzz is about? Maybe you've caught team members talking in "gherkin" and felt left out of the conversation. Or perhaps you're a Pythonista looking for a better way to test your code. Whatever the circumstance, learning about BDD can help you and your team achieve better collaboration and test automation, and Python's `behave` framework is a great place to start. - -### What is BDD? - - * Submitting forms on a website - * Searching for desired results - * Saving a document - * Making REST API calls - * Running command-line interface commands - - - -In software, a behavior is how a feature operates within a well-defined scenario of inputs, actions, and outcomes. Products can exhibit countless behaviors, such as: - -Defining a product's features based on its behaviors makes it easier to describe them, develop them, and test them. This is the heart of BDD: making behaviors the focal point of software development. Behaviors are defined early in development using a [specification by example][2] language. One of the most common behavior spec languages is [Gherkin][3], the Given-When-Then scenario format from the [Cucumber][4] project. Behavior specs are basically plain-language descriptions of how a behavior works, with a little bit of formal structure for consistency and focus. Test frameworks can easily automate these behavior specs by "gluing" step texts to code implementations. - -Below is an example of a behavior spec written in Gherkin: -``` -Scenario: Basic DuckDuckGo Search - -  Given the DuckDuckGo home page is displayed - -  When the user searches for "panda" - -  Then results are shown for "panda" - -``` - -At a quick glance, the behavior is intuitive to understand. Except for a few keywords, the language is freeform. The scenario is concise yet meaningful. A real-world example illustrates the behavior. Steps declaratively indicate what should happen—without getting bogged down in the details of how. - -The [main benefits of BDD][5] are good collaboration and automation. Everyone can contribute to behavior development, not just programmers. Expected behaviors are defined and understood from the beginning of the process. Tests can be automated together with the features they cover. Each test covers a singular, unique behavior in order to avoid duplication. And, finally, existing steps can be reused by new behavior specs, creating a snowball effect. - -### Python's behave framework - -`behave` is one of the most popular BDD frameworks in Python. It is very similar to other Gherkin-based Cucumber frameworks despite not holding the official Cucumber designation. `behave` has two primary layers: - - 1. Behavior specs written in Gherkin `.feature` files - 2. Step definitions and hooks written in Python modules that implement Gherkin steps - - - -As shown in the example above, Gherkin scenarios use a three-part format: - - 1. Given some initial state - 2. When an action is taken - 3. Then verify the outcome - - - -Each step is "glued" by decorator to a Python function when `behave` runs tests. - -### Installation - -As a prerequisite, make sure you have Python and `pip` installed on your machine. I strongly recommend using Python 3. (I also recommend using [`pipenv`][6], but the following example commands use the more basic `pip`.) - -Only one package is required for `behave`: -``` -pip install behave - -``` - -Other packages may also be useful, such as: -``` -pip install requests    # for REST API calls - -pip install selenium    # for Web browser interactions - -``` - -The [behavior-driven-Python][7] project on GitHub contains the examples used in this article. - -### Gherkin features - -The Gherkin syntax that `behave` uses is practically compliant with the official Cucumber Gherkin standard. A `.feature` file has Feature sections, which in turn have Scenario sections with Given-When-Then steps. Below is an example: -``` -Feature: Cucumber Basket - -  As a gardener, - -  I want to carry many cucumbers in a basket, - -  So that I don’t drop them all. - -  - -  @cucumber-basket - -  Scenario: Add and remove cucumbers - -    Given the basket is empty - -    When "4" cucumbers are added to the basket - -    And "6" more cucumbers are added to the basket - -    But "3" cucumbers are removed from the basket - -    Then the basket contains "7" cucumbers - -``` - -There are a few important things to note here: - - * Both the Feature and Scenario sections have [short, descriptive titles][8]. - * The lines immediately following the Feature title are comments ignored by `behave`. It is a good practice to put the user story there. - * Scenarios and Features can have tags (notice the `@cucumber-basket` mark) for hooks and filtering (explained below). - * Steps follow a [strict Given-When-Then order][9]. - * Additional steps can be added for any type using `And` and `But`. - * Steps can be parametrized with inputs—notice the values in double quotes. - - - -Scenarios can also be written as templates with multiple input combinations by using a Scenario Outline: -``` -Feature: Cucumber Basket - - - -  @cucumber-basket - -  Scenario Outline: Add cucumbers - -    Given the basket has “” cucumbers - -    When "" cucumbers are added to the basket - -    Then the basket contains "" cucumbers - - - -    Examples: Cucumber Counts - -      | initial | more | total | - -      |    0    |   1  |   1   | - -      |    1    |   2  |   3   | - -      |    5    |   4  |   9   | - -``` - -Scenario Outlines always have an Examples table, in which the first row gives column titles and each subsequent row gives an input combo. The row values are substituted wherever a column title appears in a step surrounded by angle brackets. In the example above, the scenario will be run three times because there are three rows of input combos. Scenario Outlines are a great way to avoid duplicate scenarios. - -There are other elements of the Gherkin language, but these are the main mechanics. To learn more, read the Automation Panda articles [Gherkin by Example][10] and [Writing Good Gherkin][11]. - -### Python mechanics - -Every Gherkin step must be "glued" to a step definition, a Python function that provides the implementation. Each function has a step type decorator with the matching string. It also receives a shared context and any step parameters. Feature files must be placed in a directory named `features/`, while step definition modules must be placed in a directory named `features/steps/`. Any feature file can use step definitions from any module—they do not need to have the same names. Below is an example Python module with step definitions for the cucumber basket features. -``` -from behave import * - -from cucumbers.basket import CucumberBasket - - - -@given('the basket has "{initial:d}" cucumbers') - -def step_impl(context, initial): - -    context.basket = CucumberBasket(initial_count=initial) - - - -@when('"{some:d}" cucumbers are added to the basket') - -def step_impl(context, some): - -    context.basket.add(some) - - - -@then('the basket contains "{total:d}" cucumbers') - -def step_impl(context, total): - -    assert context.basket.count == total - -``` - -Three [step matchers][12] are available: `parse`, `cfparse`, and `re`. The default and simplest marcher is `parse`, which is shown in the example above. Notice how parametrized values are parsed and passed into the functions as input arguments. A common best practice is to put double quotes around parameters in steps. - -Each step definition function also receives a [context][13] variable that holds data specific to the current scenario being run, such as `feature`, `scenario`, and `tags` fields. Custom fields may be added, too, to share data between steps. Always use context to share data—never use global variables! - -`behave` also supports [hooks][14] to handle automation concerns outside of Gherkin steps. A hook is a function that will be run before or after a step, scenario, feature, or whole test suite. Hooks are reminiscent of [aspect-oriented programming][15]. They should be placed in a special `environment.py` file under the `features/` directory. Hook functions can check the current scenario's tags, as well, so logic can be selectively applied. The example below shows how to use hooks to set up and tear down a Selenium WebDriver instance for any scenario tagged as `@web`. -``` -from selenium import webdriver - - - -def before_scenario(context, scenario): - -    if 'web' in context.tags: - -        context.browser = webdriver.Firefox() - -        context.browser.implicitly_wait(10) - - - -def after_scenario(context, scenario): - -    if 'web' in context.tags: - -        context.browser.quit() - -``` - -Note: Setup and cleanup can also be done with [fixtures][16] in `behave`. - -To offer an idea of what a `behave` project should look like, here's the example project's directory structure: - -![](https://opensource.com/sites/default/files/uploads/behave_dir_layout.png) - -Any Python packages and custom modules can be used with `behave`. Use good design patterns to build a scalable test automation solution. Step definition code should be concise. - -### Running tests - -To run tests from the command line, change to the project's root directory and run the `behave` command. Use the `–help` option to see all available options. - -Below are a few common use cases: -``` -# run all tests - -behave - - - -# run the scenarios in a feature file - -behave features/web.feature - - - -# run all tests that have the @duckduckgo tag - -behave --tags @duckduckgo - - - -# run all tests that do not have the @unit tag - -behave --tags ~@unit - - - -# run all tests that have @basket and either @add or @remove - -behave --tags @basket --tags @add,@remove - -``` - -For convenience, options may be saved in [config][17] files. - -### Other options - -`behave` is not the only BDD test framework in Python. Other good frameworks include: - - * `pytest-bdd` , a plugin for `pytest``behave`, it uses Gherkin feature files and step definition modules, but it also leverages all the features and plugins of `pytest`. For example, it can run Gherkin scenarios in parallel using `pytest-xdist`. BDD and non-BDD tests can also be executed together with the same filters. `pytest-bdd` also offers a more flexible directory layout. - - * `radish` is a "Gherkin-plus" framework—it adds Scenario Loops and Preconditions to the standard Gherkin language, which makes it more friendly to programmers. It also offers rich command line options like `behave`. - - * `lettuce` is an older BDD framework very similar to `behave`, with minor differences in framework mechanics. However, GitHub shows little recent activity in the project (as of May 2018). - - - -Any of these frameworks would be good choices. - -Also, remember that Python test frameworks can be used for any black box testing, even for non-Python products! BDD frameworks are great for web and service testing because their tests are declarative, and Python is a [great language for test automation][18]. - -This article is based on the author's [PyCon Cleveland 2018][19] talk, [Behavior-Driven Python][20]. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/18/5/behavior-driven-python - -作者:[Andrew Knight][a] -选题:[lujun9972](https://github.com/lujun9972) -译者:[译者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/andylpk247 -[1]:https://automationpanda.com/bdd/ -[2]:https://en.wikipedia.org/wiki/Specification_by_example -[3]:https://automationpanda.com/2017/01/26/bdd-101-the-gherkin-language/ -[4]:https://cucumber.io/ -[5]:https://automationpanda.com/2017/02/13/12-awesome-benefits-of-bdd/ -[6]:https://docs.pipenv.org/ -[7]:https://github.com/AndyLPK247/behavior-driven-python -[8]:https://automationpanda.com/2018/01/31/good-gherkin-scenario-titles/ -[9]:https://automationpanda.com/2018/02/03/are-gherkin-scenarios-with-multiple-when-then-pairs-okay/ -[10]:https://automationpanda.com/2017/01/27/bdd-101-gherkin-by-example/ -[11]:https://automationpanda.com/2017/01/30/bdd-101-writing-good-gherkin/ -[12]:http://behave.readthedocs.io/en/latest/api.html#step-parameters -[13]:http://behave.readthedocs.io/en/latest/api.html#detecting-that-user-code-overwrites-behave-context-attributes -[14]:http://behave.readthedocs.io/en/latest/api.html#environment-file-functions -[15]:https://en.wikipedia.org/wiki/Aspect-oriented_programming -[16]:http://behave.readthedocs.io/en/latest/api.html#fixtures -[17]:http://behave.readthedocs.io/en/latest/behave.html#configuration-files -[18]:https://automationpanda.com/2017/01/21/the-best-programming-language-for-test-automation/ -[19]:https://us.pycon.org/2018/ -[20]:https://us.pycon.org/2018/schedule/presentation/87/ diff --git a/sources/tech/20180531 How to Build an Amazon Echo with Raspberry Pi.md b/sources/tech/20180531 How to Build an Amazon Echo with Raspberry Pi.md index 0bf792f769..a5d4767706 100644 --- a/sources/tech/20180531 How to Build an Amazon Echo with Raspberry Pi.md +++ b/sources/tech/20180531 How to Build an Amazon Echo with Raspberry Pi.md @@ -1,5 +1,3 @@ -heart4lor translating - How to Build an Amazon Echo with Raspberry Pi ====== diff --git a/sources/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md b/sources/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md index a1d721ae3c..e548213483 100644 --- a/sources/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md +++ b/sources/tech/20180615 Complete Sed Command Guide [Explained with Practical Examples].md @@ -1,4 +1,3 @@ -translating by amwps290 Complete Sed Command Guide [Explained with Practical Examples] ====== In a previous article, I showed the [basic usage of Sed][1], the stream editor, on a practical use case. Today, be prepared to gain more insight about Sed as we will take an in-depth tour of the sed execution model. This will be also an opportunity to make an exhaustive review of all Sed commands and to dive into their details and subtleties. So, if you are ready, launch a terminal, [download the test files][2] and sit comfortably before your keyboard: we will start our exploration right now! diff --git a/sources/tech/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md b/sources/tech/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md deleted file mode 100644 index 2f9a6636e7..0000000000 --- a/sources/tech/20180618 What-s all the C Plus Fuss- Bjarne Stroustrup warns of dangerous future plans for his C.md +++ /dev/null @@ -1,155 +0,0 @@ -Translating by qhwdw -What's all the C Plus Fuss? Bjarne Stroustrup warns of dangerous future plans for his C++ -====== - -![](https://regmedia.co.uk/2018/06/15/shutterstock_38621860.jpg?x=442&y=293&crop=1) - -**Interview** Earlier this year, Bjarne Stroustrup, creator of C++, managing director in the technology division of Morgan Stanley, and a visiting professor of computer science at Columbia University in the US, wrote [a letter][1] inviting those overseeing the evolution of the programming language to “Remember the Vasa!” - -Easy for a Dane to understand no doubt, but perhaps more of a stretch for those with a few gaps in their knowledge of 17th century Scandinavian history. The Vasa was a Swedish warship, commissioned by King Gustavus Adolphus. It was the most powerful warship in the Baltic Sea from its maiden voyage on the August 10, 1628, until a few minutes later when it sank. - -The formidable Vasa suffered from a design flaw: it was top-heavy, so much so that it was [undone by a gust of wind][2]. By invoking the memory of the capsized ship, Stroustrup served up a cautionary tale about the risks facing C++ as more and more features get added to the language. - -Quite a few such features have been suggested. Stroustrup cited 43 proposals in his letter. He contends those participating in the evolution of the ISO standard language, a group known as [WG21][3], are working to advance the language but not together. - -In his letter, he wrote: - ->Individually, many proposals make sense. Together they are insanity to the point of endangering the future of C++. - -He makes clear that he doesn’t interpret the fate of the Vasa to mean that incremental improvements spell doom. Rather, he takes it as a lesson to build a solid foundation, to learn from experience and to test thoroughly. - -With the recent conclusion of the C++ Standardization Committee Meeting in Rapperswil, Switzerland, earlier this month, Stroustrup addressed a few questions put to him by _The Register_ about what's next for the language. (The most recent version is C++17, which arrived last year; the next version C++20 is under development and expected in 2020.) - -**_Register:_ In your note, Remember the Vasa!, you wrote:** - ->The foundation begun in C++11 is not yet complete, and C++17 did little to make our foundation more solid, regular, and complete. Instead, it added significant surface complexity and increased the number of features people need to learn. C++ could crumble under the weight of these – mostly not quite fully-baked – proposals. We should not spend most our time creating increasingly complicated facilities for experts, such as ourselves. - -**Is C++ too challenging for newcomers, and if so, what features do you believe would make the language more accessible?** - -_**Stroustrup:**_ Some parts of C++ are too challenging for newcomers. - -On the other hand, there are parts of C++ that makes it far more accessible to newcomers than C or 1990s C++. The difficulty is to get the larger community to focus on those parts and help beginners and casual C++ users to avoid the parts that are there to support implementers of advanced libraries. - -I recommend the [C++ Core Guidelines][4] as an aide for that. - -Also, my “A Tour of C++” can help people get on the right track with modern C++ without getting lost in 1990s complexities or ensnarled by modern facilities meant for expert use. The second edition of “A Tour of C++” covering C++17 and parts of C++20 is on its way to the stores. - -I and others have taught C++ to 1st year university students with no previous programming experience in 3 months. It can be done as long as you don’t try to dig into every obscure corner of the language and focus on modern C++. - -“Making simple things simple” is a long-term goal of mine. Consider the C++11 range-for loop: -``` -for (int& x : v) ++x; // increment each element of the container v - -``` - -where v can be just about any container. In C and C-style C++, that might look like this: -``` -for (int i=0; i