diff --git a/published/20090211 Page Cache the Affair Between Memory and Files.md b/published/20090211 Page Cache the Affair Between Memory and Files.md
new file mode 100644
index 0000000000..726ea23041
--- /dev/null
+++ b/published/20090211 Page Cache the Affair Between Memory and Files.md
@@ -0,0 +1,86 @@
+页面缓存、内存和文件之间的那些事
+============================================================
+
+
+上一篇文章中我们学习了内核怎么为一个用户进程 [管理虚拟内存][2],而没有提及文件和 I/O。这一篇文章我们将专门去讲这个重要的主题 —— 页面缓存。文件和内存之间的关系常常很不好去理解,而它们对系统性能的影响却是非常大的。
+
+在面对文件时,有两个很重要的问题需要操作系统去解决。第一个是相对内存而言,慢的让人发狂的硬盘驱动器,[尤其是磁盘寻道][3]。第二个是需要将文件内容一次性地加载到物理内存中,以便程序间*共享*文件内容。如果你在 Windows 中使用 [进程浏览器][4] 去查看它的进程,你将会看到每个进程中加载了大约 ~15MB 的公共 DLL。我的 Windows 机器上现在大约运行着 100 个进程,因此,如果不共享的话,仅这些公共的 DLL 就要使用高达 ~1.5 GB 的物理内存。如果是那样的话,那就太糟糕了。同样的,几乎所有的 Linux 进程都需要 ld.so 和 libc,加上其它的公共库,它们占用的内存数量也不是一个小数目。
+
+幸运的是,这两个问题都用一个办法解决了:页面缓存 —— 保存在内存中的页面大小的文件块。为了用图去说明页面缓存,我捏造出一个名为 `render` 的 Linux 程序,它打开了文件 `scene.dat`,并且一次读取 512 字节,并将文件内容存储到一个分配到堆中的块上。第一次读取的过程如下:
+
+![Reading and the page cache](http://static.duartes.org/img/blogPosts/readFromPageCache.png)
+
+1. `render` 请求 `scene.dat` 从位移 0 开始的 512 字节。
+2. 内核搜寻页面缓存中 `scene.dat` 的 4kb 块,以满足该请求。假设该数据没有缓存。
+3. 内核分配页面帧,初始化 I/O 请求,将 `scend.dat` 从位移 0 开始的 4kb 复制到分配的页面帧。
+4. 内核从页面缓存复制请求的 512 字节到用户缓冲区,系统调用 `read()` 结束。
+
+读取完 12KB 的文件内容以后,`render` 程序的堆和相关的页面帧如下图所示:
+
+![Non-mapped file read](http://static.duartes.org/img/blogPosts/nonMappedFileRead.png)
+
+它看起来很简单,其实这一过程做了很多的事情。首先,虽然这个程序使用了普通的读取(`read`)调用,但是,已经有三个 4KB 的页面帧将文件 scene.dat 的一部分内容保存在了页面缓存中。虽然有时让人觉得很惊奇,但是,**普通的文件 I/O 就是这样通过页面缓存来进行的**。在 x86 架构的 Linux 中,内核将文件认为是一系列的 4KB 大小的块。如果你从文件中读取单个字节,包含这个字节的整个 4KB 块将被从磁盘中读入到页面缓存中。这是可以理解的,因为磁盘通常是持续吞吐的,并且程序一般也不会从磁盘区域仅仅读取几个字节。页面缓存知道文件中的每个 4KB 块的位置,在上图中用 `#0`、`#1` 等等来描述。Windows 使用 256KB 大小的视图,类似于 Linux 的页面缓存中的页面。
+
+不幸的是,在一个普通的文件读取中,内核必须拷贝页面缓存中的内容到用户缓冲区中,它不仅花费 CPU 时间和影响 [CPU 缓存][6],**在复制数据时也浪费物理内存**。如前面的图示,`scene.dat` 的内存被存储了两次,并且,程序中的每个实例都用另外的时间去存储内容。我们虽然解决了从磁盘中读取文件缓慢的问题,但是在其它的方面带来了更痛苦的问题。内存映射文件是解决这种痛苦的一个方法:
+
+![Mapped file read](http://static.duartes.org/img/blogPosts/mappedFileRead.png)
+
+当你使用文件映射时,内核直接在页面缓存上映射你的程序的虚拟页面。这样可以显著提升性能:[Windows 系统编程][7] 报告指出,在相关的普通文件读取上运行时性能提升多达 30% ,在 [Unix 环境中的高级编程][8] 的报告中,文件映射在 Linux 和 Solaris 也有类似的效果。这取决于你的应用程序类型的不同,通过使用文件映射,可以节约大量的物理内存。
+
+对高性能的追求是永恒不变的目标,[测量是很重要的事情][9],内存映射应该是程序员始终要使用的工具。这个 API 提供了非常好用的实现方式,它允许你在内存中按字节去访问一个文件,而不需要为了这种好处而牺牲代码可读性。在一个类 Unix 的系统中,可以使用 [mmap][11] 查看你的 [地址空间][10],在 Windows 中,可以使用 [CreateFileMapping][12],或者在高级编程语言中还有更多的可用封装。当你映射一个文件内容时,它并不是一次性将全部内容都映射到内存中,而是通过 [页面故障][13] 来按需映射的。在 [获取][15] 需要的文件内容的页面帧后,页面故障句柄 [映射你的虚拟页面][14] 到页面缓存上。如果一开始文件内容没有缓存,这还将涉及到磁盘 I/O。
+
+现在出现一个突发的状况,假设我们的 `render` 程序的最后一个实例退出了。在页面缓存中保存着 `scene.dat` 内容的页面要立刻释放掉吗?人们通常会如此考虑,但是,那样做并不是个好主意。你应该想到,我们经常在一个程序中创建一个文件,退出程序,然后,在第二个程序去使用这个文件。页面缓存正好可以处理这种情况。如果考虑更多的情况,内核为什么要清除页面缓存的内容?请记住,磁盘读取的速度要慢于内存 5 个数量级,因此,命中一个页面缓存是一件有非常大收益的事情。因此,只要有足够大的物理内存,缓存就应该保持全满。并且,这一原则适用于所有的进程。如果你现在运行 `render` 一周后, `scene.dat` 的内容还在缓存中,那么应该恭喜你!这就是什么内核缓存越来越大,直至达到最大限制的原因。它并不是因为操作系统设计的太“垃圾”而浪费你的内存,其实这是一个非常好的行为,因为,释放物理内存才是一种“浪费”。(LCTT 译注:释放物理内存会导致页面缓存被清除,下次运行程序需要的相关数据,需要再次从磁盘上进行读取,会“浪费” CPU 和 I/O 资源)最好的做法是尽可能多的使用缓存。
+
+由于页面缓存架构的原因,当程序调用 [write()][16] 时,字节只是被简单地拷贝到页面缓存中,并将这个页面标记为“脏”页面。磁盘 I/O 通常并**不会**立即发生,因此,你的程序并不会被阻塞在等待磁盘写入上。副作用是,如果这时候发生了电脑死机,你的写入将不会完成,因此,对于至关重要的文件,像数据库事务日志,要求必须进行 [fsync()][17](仍然还需要去担心磁盘控制器的缓存失败问题),另一方面,读取将被你的程序阻塞,直到数据可用为止。内核采取预加载的方式来缓解这个矛盾,它一般提前预读取几个页面并将它加载到页面缓存中,以备你后来的读取。在你计划进行一个顺序或者随机读取时(请查看 [madvise()][18]、[readahead()][19]、[Windows 缓存提示][20] ),你可以通过提示帮助内核去调整这个预加载行为。Linux 会对内存映射的文件进行 [预读取][21],但是我不确定 Windows 的行为。当然,在 Linux 中它可能会使用 [O_DIRECT][22] 跳过预读取,或者,在 Windows 中使用 [NO_BUFFERING][23] 去跳过预读,一些数据库软件就经常这么做。
+
+一个文件映射可以是私有的,也可以是共享的。当然,这只是针对内存中内容的**更新**而言:在一个私有的内存映射上,更新并不会提交到磁盘或者被其它进程可见,然而,共享的内存映射,则正好相反,它的任何更新都会提交到磁盘上,并且对其它的进程可见。内核使用写时复制(CoW)机制,这是通过页面表条目(PTE)来实现这种私有的映射。在下面的例子中,`render` 和另一个被称为 `render3d` 的程序都私有映射到 `scene.dat` 上。然后 `render` 去写入映射的文件的虚拟内存区域:
+
+![The Copy-On-Write mechanism](http://static.duartes.org/img/blogPosts/copyOnWrite.png)
+
+1. 两个程序私有地映射 `scene.dat`,内核误导它们并将它们映射到页面缓存,但是使该页面表条目只读。
+2. `render` 试图写入到映射 `scene.dat` 的虚拟页面,处理器发生页面故障。
+3. 内核分配页面帧,复制 `scene.dat` 的第二块内容到其中,并映射故障的页面到新的页面帧。
+4. 继续执行。程序就当做什么都没发生。
+
+上面展示的只读页面表条目并不意味着映射是只读的,它只是内核的一个用于共享物理内存的技巧,直到尽可能的最后一刻之前。你可以认为“私有”一词用的有点不太恰当,你只需要记住,这个“私有”仅用于更新的情况。这种设计的重要性在于,要想看到被映射的文件的变化,其它程序只能读取它的虚拟页面。一旦“写时复制”发生,从其它地方是看不到这种变化的。但是,内核并不能保证这种行为,因为它是在 x86 中实现的,从 API 的角度来看,这是有意义的。相比之下,一个共享的映射只是将它简单地映射到页面缓存上。更新会被所有的进程看到并被写入到磁盘上。最终,如果上面的映射是只读的,页面故障将触发一个内存段失败而不是写到一个副本。
+
+动态加载库是通过文件映射融入到你的程序的地址空间中的。这没有什么可奇怪的,它通过普通的 API 为你提供与私有文件映射相同的效果。下面的示例展示了映射文件的 `render` 程序的两个实例运行的地址空间的一部分,以及物理内存,尝试将我们看到的许多概念综合到一起。
+
+![Mapping virtual memory to physical memory](http://static.duartes.org/img/blogPosts/virtualToPhysicalMapping.png)
+
+这是内存架构系列的第三部分的结论。我希望这个系列文章对你有帮助,对理解操作系统的这些主题提供一个很好的思维模型。
+
+--------------------------------------------------------------------------------
+
+via:https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/
+
+作者:[Gustavo Duarte][a]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://duartes.org/gustavo/blog/about/
+[1]:https://manybutfinite.com/post/page-cache-the-affair-between-memory-and-files/
+[2]:https://linux.cn/article-9393-1.html
+[3]:https://manybutfinite.com/post/what-your-computer-does-while-you-wait
+[4]:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
+[5]:http://ld.so
+[6]:https://manybutfinite.com/post/intel-cpu-caches
+[7]:http://www.amazon.com/Windows-Programming-Addison-Wesley-Microsoft-Technology/dp/0321256190/
+[8]:http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321525949/
+[9]:https://manybutfinite.com/post/performance-is-a-science
+[10]:https://manybutfinite.com/post/anatomy-of-a-program-in-memory
+[11]:http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html
+[12]:http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
+[13]:http://lxr.linux.no/linux+v2.6.28/mm/memory.c#L2678
+[14]:http://lxr.linux.no/linux+v2.6.28/mm/memory.c#L2436
+[15]:http://lxr.linux.no/linux+v2.6.28/mm/filemap.c#L1424
+[16]:http://www.kernel.org/doc/man-pages/online/pages/man2/write.2.html
+[17]:http://www.kernel.org/doc/man-pages/online/pages/man2/fsync.2.html
+[18]:http://www.kernel.org/doc/man-pages/online/pages/man2/madvise.2.html
+[19]:http://www.kernel.org/doc/man-pages/online/pages/man2/readahead.2.html
+[20]:http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx#caching_behavior
+[21]:http://lxr.linux.no/linux+v2.6.28/mm/filemap.c#L1424
+[22]:http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
+[23]:http://msdn.microsoft.com/en-us/library/cc644950(VS.85).aspx
\ No newline at end of file
diff --git a/published/20100419 10 Tools To Add Some Spice To Your UNIX-Linux Shell Scripts.md b/published/20100419 10 Tools To Add Some Spice To Your UNIX-Linux Shell Scripts.md
new file mode 100644
index 0000000000..022f9229bd
--- /dev/null
+++ b/published/20100419 10 Tools To Add Some Spice To Your UNIX-Linux Shell Scripts.md
@@ -0,0 +1,408 @@
+10 个增加 UNIX/Linux Shell 脚本趣味的工具
+======
+
+有些误解认为 shell 脚本仅用于 CLI 环境。实际上在 KDE 或 Gnome 桌面下,你可以有效的使用各种工具编写 GUI 或者网络(socket)脚本。shell 脚本可以使用一些 GUI 组件(菜单、警告框、进度条等),你可以控制终端输出、光标位置以及各种输出效果等等。利用下面的工具,你可以构建强壮的、可交互的、对用户友好的 UNIX/Linux bash 脚本。
+
+制作 GUI 应用不是一项困难的任务,但需要时间和耐心。幸运的是,UNIX 和 Linux 都带有大量编写漂亮 GUI 脚本的工具。以下工具是基于 FreeBSD 和 Linux 操作系统做的测试,而且也适用于其他类 UNIX 操作系统。
+
+### 1、notify-send 命令
+
+`notify-send` 命令允许你借助通知守护进程发送桌面通知给用户。这种避免打扰用户的方式,对于通知桌面用户一个事件或显示一些信息是有用的。在 Debian 或 Ubuntu 上,你需要使用 [apt 命令][1] 或 [apt-get 命令][2] 安装的包:
+
+```bash
+sudo apt-get install libnotify-bin
+```
+
+CentOS/RHEL 用户使用下面的 [yum 命令][3]:
+
+```bash
+sudo yum install libnotify
+```
+
+Fedora Linux 用户使用下面的 dnf 命令:
+
+```bash
+`$ sudo dnf install libnotify`
+In this example, send simple desktop notification from the command line, enter:
+### 发送一些通知 ###
+notify-send "rsnapshot done :)"
+```
+
+示例输出:
+
+![Fig:01: notify-send in action ][4]
+
+下面是另一个附加选项的代码:
+
+```bash
+...
+alert=18000
+live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}' | sed 's/,//g;s/\.[0-9]*//g')
+[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i "BSE Sensex touched 18k"; notify_counter=1; }
+...
+```
+
+示例输出:
+
+![Fig.02: notify-send with timeouts and other options][5]
+
+这里:
+
+ * `-t 5000`:指定超时时间(毫秒) (5000 毫秒 = 5 秒)
+ * `-u low`: 设置紧急等级 (如:低、普通、紧急)
+ * `-i gtk-dialog-info`: 设置要显示的图标名称或者指定的图标(你可以设置路径为:`-i /path/to/your-icon.png`)
+
+关于更多使用 `notify-send` 功能的信息,请参考 man 手册。在命令行下输入 `man notify-send` 即可看见:
+
+```bash
+man notify-send
+```
+
+### 2、tput 命令
+
+`tput` 命令用于设置终端特性。通过 `tput` 你可以设置:
+
+ * 在屏幕上移动光标。
+ * 获取终端信息。
+ * 设置颜色(背景和前景)。
+ * 设置加粗模式。
+ * 设置反转模式等等。
+
+下面有一段示例代码:
+
+```bash
+#!/bin/bash
+
+# clear the screen
+tput clear
+
+# Move cursor to screen location X,Y (top left is 0,0)
+tput cup 3 15
+
+# Set a foreground colour using ANSI escape
+tput setaf 3
+echo "XYX Corp LTD."
+tput sgr0
+
+tput cup 5 17
+# Set reverse video mode
+tput rev
+echo "M A I N - M E N U"
+tput sgr0
+
+tput cup 7 15
+echo "1. User Management"
+
+tput cup 8 15
+echo "2. Service Management"
+
+tput cup 9 15
+echo "3. Process Management"
+
+tput cup 10 15
+echo "4. Backup"
+
+# Set bold mode
+tput bold
+tput cup 12 15
+read -p "Enter your choice [1-4] " choice
+
+tput clear
+tput sgr0
+tput rc
+```
+
+示例输出:
+
+![Fig.03: tput in action][6]
+
+关于 `tput` 命令的详细信息,参见手册:
+
+```bash
+man 5 terminfo
+man tput
+```
+
+### 3、setleds 命令
+
+`setleds` 命令允许你设置键盘灯。下面是打开数字键灯的示例:
+
+```bash
+setleds -D +num
+```
+
+关闭数字键灯,输入:
+
+```bash
+setleds -D -num
+```
+
+ * `-caps`:关闭大小写锁定灯
+ * `+caps`:打开大小写锁定灯
+ * `-scroll`:关闭滚动锁定灯
+ * `+scroll`:打开滚动锁定灯
+
+查看 `setleds` 手册可看见更多信息和选项 `man setleds`。
+
+### 4、zenity 命令
+
+[zenity 命令显示 GTK+ 对话框][7],并且返回用户输入。它允许你使用各种 Shell 脚本向用户展示或请求信息。下面是一个 `whois` 指定域名目录服务的 GUI 客户端示例。
+
+```bash
+#!/bin/bash
+# Get domain name
+_zenity="/usr/bin/zenity"
+_out="/tmp/whois.output.$$"
+domain=$(${_zenity} --title "Enter domain" \
+ --entry --text "Enter the domain you would like to see whois info" )
+
+if [ $? -eq 0 ]
+then
+ # Display a progress dialog while searching whois database
+ whois $domain | tee >(${_zenity} --width=200 --height=100 \
+ --title="whois" --progress \
+ --pulsate --text="Searching domain info..." \
+ --auto-kill --auto-close \
+ --percentage=10) >${_out}
+
+ # Display back output
+ ${_zenity} --width=800 --height=600 \
+ --title "Whois info for $domain" \
+ --text-info --filename="${_out}"
+else
+ ${_zenity} --error \
+ --text="No input provided"
+fi
+```
+
+示例输出:
+
+![Fig.04: zenity in Action][8]
+
+参见手册获取更多 `zenity` 信息以及其他支持 GTK+ 的组件:
+
+```bash
+zenity --help
+man zenity
+```
+
+### 5、kdialog 命令
+
+`kdialog` 命令与 `zenity` 类似,但它是为 KDE 桌面和 QT 应用设计。你可以使用 `kdialog` 展示对话框。下面示例将在屏幕上显示信息:
+
+```bash
+kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
+```
+
+示例输出:
+
+![Fig.05: Suppressing the display of a dialog ][9]
+
+参见 《[KDE 对话框 Shell 脚本编程][10]》 教程获取更多信息。
+
+### 6、Dialog
+
+[Dialog 是一个使用 Shell 脚本的应用][11],显示用户界面组件的文本。它使用 curses 或者 ncurses 库。下面是一个示例代码:
+
+```bash
+#!/bin/bash
+dialog --title "Delete file" \
+--backtitle "Linux Shell Script Tutorial Example" \
+--yesno "Are you sure you want to permanently delete \"/tmp/foo.txt\"?" 7 60
+
+# Get exit status
+# 0 means user hit [yes] button.
+# 1 means user hit [no] button.
+# 255 means user hit [Esc] key.
+response=$?
+case $response in
+ 0) echo "File deleted.";;
+ 1) echo "File not deleted.";;
+ 255) echo "[ESC] key pressed.";;
+esac
+```
+
+参见 `dialog` 手册获取详细信息:`man dialog`。
+
+#### 关于其他用户界面工具的注意事项
+
+UNIX、Linux 提供了大量其他工具来显示和控制命令行中的应用程序,shell 脚本可以使用一些 KDE、Gnome、X 组件集:
+
+ * `gmessage` - 基于 GTK xmessage 的克隆
+ * `xmessage` - 在窗口中显示或询问消息(基于 X 的 /bin/echo)
+ * `whiptail` - 显示来自 shell 脚本的对话框
+ * `python-dialog` - 用于制作简单文本或控制台模式用户界面的 Python 模块
+
+### 7、logger 命令
+
+`logger` 命令将信息写到系统日志文件,如:`/var/log/messages`。它为系统日志模块 syslog 提供了一个 shell 命令行接口:
+
+```bash
+logger "MySQL database backup failed."
+tail -f /var/log/messages
+logger -t mysqld -p daemon.error "Database Server failed"
+tail -f /var/log/syslog
+```
+
+示例输出:
+
+```bash
+Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal
+Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed
+```
+
+参见 《[如何写消息到 syslog 或 日志文件][12]》 获得更多信息。此外,你也可以查看 logger 手册获取详细信息:`man logger`
+
+### 8、setterm 命令
+
+`setterm` 命令可设置不同的终端属性。下面的示例代码会强制屏幕在 15 分钟后变黑,监视器则 60 分钟后待机。
+
+```bash
+setterm -blank 15 -powersave powerdown -powerdown 60
+```
+
+下面的例子将 xterm 窗口中的文本以下划线展示:
+
+```bash
+setterm -underline on;
+echo "Add Your Important Message Here"
+setterm -underline off
+```
+
+另一个有用的选项是打开或关闭光标显示:
+
+```bash
+setterm -cursor off
+```
+
+打开光标:
+
+```bash
+setterm -cursor on
+```
+
+参见 setterm 命令手册获取详细信息:`man setterm`
+
+### 9、smbclient:给 MS-Windows 工作站发送消息
+
+`smbclient` 命令可以与 SMB/CIFS 服务器通讯。它可以向 MS-Windows 系统上选定或全部用户发送消息。
+
+```bash
+smbclient -M WinXPPro </dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"
+```
+
+下面的代码片段,你可以利用 [bash 循环找出已打开的端口][14]:
+
+```bash
+echo "Scanning TCP ports..."
+for p in {1..1023}
+do
+ (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open"
+done
+```
+
+示例输出:
+
+```bash
+Scanning TCP ports...
+22 open
+53 open
+80 open
+139 open
+445 open
+631 open
+```
+
+下面的示例中,你的 bash 脚本将像 HTTP 客户端一样工作:
+
+```bash
+#!/bin/bash
+exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80
+
+printf "GET / HTTP/1.0\r\n" >&3
+printf "Accept: text/html, text/plain\r\n" >&3
+printf "Accept-Language: en\r\n" >&3
+printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}" >&3
+printf "\r\n" >&3
+
+while read LINE <&3
+do
+ # do something on $LINE
+ # or send $LINE to grep or awk for grabbing data
+ # or simply display back data with echo command
+ echo $LINE
+done
+```
+
+参见 bash 手册获取更多信息:`man bash`
+
+### 关于 GUI 工具和 cron 任务的注意事项
+
+如果你 [使用 crontab][15] 来启动你的脚本,你需要使用 `export DISPLAY=[用户机器]:0` 命令请求本地显示或输出服务。举个例子,使用 `zenity` 工具调用 `/home/vivek/scripts/monitor.stock.sh`:
+
+```
+@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh
+```
+
+你有喜欢的可以增加 shell 脚本趣味的 UNIX 工具么?请在下面的评论区分享它吧。
+
+### 关于作者
+
+本文作者是 nixCraft 创始人、一个老练的系统管理员、Linux 操作系统和 UNIX shell 编程培训师。他服务来自全球的客户和不同的行业,包括 IT 、教育、防务和空间探索、还有非营利组织。你可以在 [Twitter][16],[Facebook][17],[Google+][18] 上面关注他。
+
+--------------------------------------------------------------------------------
+
+via: https://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
+
+作者:[Vivek Gite][a]
+译者:[pygmalion666](https://github.com/pygmalion666)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.cyberciti.biz
+[1]:https://www.cyberciti.biz/faq/ubuntu-lts-debian-linux-apt-command-examples/ (See Linux/Unix apt command examples for more info)
+[2]:https://www.cyberciti.biz/tips/linux-debian-package-management-cheat-sheet.html (See Linux/Unix apt-get command examples for more info)
+[3]:https://www.cyberciti.biz/faq/rhel-centos-fedora-linux-yum-command-howto/ (See Linux/Unix yum command examples for more info)
+[4]:https://www.cyberciti.biz/media/new/tips/2010/04/notify-send.png (notify-send: Shell Script Get Or Send Desktop Notifications )
+[5]:https://www.cyberciti.biz/media/new/tips/2010/04/notify-send-with-icons-timeout.png (Linux / UNIX: Display Notifications From Your Shell Scripts With notify-send)
+[6]:https://www.cyberciti.biz/media/new/tips/2010/04/tput-options.png (Linux / UNIX Script Colours and Cursor Movement With tput)
+[7]:https://bash.cyberciti.biz/guide/Zenity:_Shell_Scripting_with_Gnome
+[8]:https://www.cyberciti.biz/media/new/tips/2010/04/zenity-outputs.png (zenity: Linux / UNIX display Dialogs Boxes From The Shell Scripts)
+[9]:https://www.cyberciti.biz/media/new/tips/2010/04/KDialog.png (Kdialog: Suppressing the display of a dialog )
+[10]:http://techbase.kde.org/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs
+[11]:https://bash.cyberciti.biz/guide/Bash_display_dialog_boxes
+[12]:https://www.cyberciti.biz/tips/howto-linux-unix-write-to-syslog.html
+[13]:https://www.cyberciti.biz/tips/freebsd-sending-a-message-to-windows-workstation.html
+[14]:https://www.cyberciti.biz/faq/bash-for-loop/
+[15]:https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/
+[16]:https://twitter.com/nixcraft
+[17]:https://facebook.com/nixcraft
+[18]:https://plus.google.com/+CybercitiBiz
\ No newline at end of file
diff --git a/translated/tech/20150703 Let-s Build A Simple Interpreter. Part 2..md b/published/20150703 Let-s Build A Simple Interpreter. Part 2..md
similarity index 68%
rename from translated/tech/20150703 Let-s Build A Simple Interpreter. Part 2..md
rename to published/20150703 Let-s Build A Simple Interpreter. Part 2..md
index a22a94bae0..e9591cddd1 100644
--- a/translated/tech/20150703 Let-s Build A Simple Interpreter. Part 2..md
+++ b/published/20150703 Let-s Build A Simple Interpreter. Part 2..md
@@ -1,9 +1,9 @@
-让我们做个简单的解释器(2)
+让我们做个简单的解释器(二)
======
-在一本叫做 《高效思考的 5 要素》 的书中,作者 Burger 和 Starbird 讲述了一个关于他们如何研究 Tony Plog 的故事,一个举世闻名的交响曲名家,为一些有才华的演奏者开创了一个大师班。这些学生一开始演奏复杂的乐曲,他们演奏的非常好。然后他们被要求演奏非常基础简单的乐曲。当他们演奏这些乐曲时,与之前所演奏的相比,听起来非常幼稚。在他们结束演奏后,老师也演奏了同样的乐曲,但是听上去非常娴熟。差别令人震惊。Tony 解释道,精通简单符号可以让人更好的掌握复杂的部分。这个例子很清晰 - 要成为真正的名家,必须要掌握简单基础的思想。
+在一本叫做 《高效思考的 5 要素》 的书中,作者 Burger 和 Starbird 讲述了一个关于他们如何研究 Tony Plog 的故事,他是一位举世闻名的交响曲名家,为一些有才华的演奏者开创了一个大师班。这些学生一开始演奏复杂的乐曲,他们演奏的非常好。然后他们被要求演奏非常基础简单的乐曲。当他们演奏这些乐曲时,与之前所演奏的相比,听起来非常幼稚。在他们结束演奏后,老师也演奏了同样的乐曲,但是听上去非常娴熟。差别令人震惊。Tony 解释道,精通简单音符可以让人更好的掌握复杂的部分。这个例子很清晰 —— 要成为真正的名家,必须要掌握简单基础的思想。
-故事中的例子明显不仅仅适用于音乐,而且适用于软件开发。这个故事告诉我们不要忽视繁琐工作中简单基础的概念的重要性,哪怕有时候这让人感觉是一种倒退。尽管熟练掌握一门工具或者框架非常重要,了解他们背后的原理也是极其重要的。正如 Palph Waldo Emerson 所说:
+故事中的例子明显不仅仅适用于音乐,而且适用于软件开发。这个故事告诉我们不要忽视繁琐工作中简单基础的概念的重要性,哪怕有时候这让人感觉是一种倒退。尽管熟练掌握一门工具或者框架非常重要,了解它们背后的原理也是极其重要的。正如 Palph Waldo Emerson 所说:
> “如果你只学习方法,你就会被方法束缚。但如果你知道原理,就可以发明自己的方法。”
@@ -15,11 +15,11 @@
2. 识别输入字符串中的多位整数
3. 做两个整数之间的减法(目前它仅能加减整数)
-
新版本计算器的源代码在这里,它可以做到上述的所有事情:
+
```
# 标记类型
-# EOF (end-of-file 文件末尾) 标记是用来表示所有输入都解析完成
+# EOF (end-of-file 文件末尾)标记是用来表示所有输入都解析完成
INTEGER, PLUS, MINUS, EOF = 'INTEGER', 'PLUS', 'MINUS', 'EOF'
@@ -168,9 +168,10 @@ if __name__ == '__main__':
main()
```
-把上面的代码保存到 calc2.py 文件中,或者直接从 [GitHub][2] 上下载。试着运行它。看看它是不是正常工作:它应该能够处理输入中任意位置的空白符;能够接受多位的整数,并且能够对两个整数做减法和加法。
+把上面的代码保存到 `calc2.py` 文件中,或者直接从 [GitHub][2] 上下载。试着运行它。看看它是不是正常工作:它应该能够处理输入中任意位置的空白符;能够接受多位的整数,并且能够对两个整数做减法和加法。
这是我在自己的笔记本上运行的示例:
+
```
$ python calc2.py
calc> 27 + 3
@@ -182,21 +183,21 @@ calc>
与 [第一部分][1] 的版本相比,主要的代码改动有:
- 1. get_next_token 方法重写了很多。增加指针位置的逻辑之前是放在一个单独的方法中。
- 2. 增加了一些方法:skip_whitespace 用于忽略空白字符,integer 用于处理输入字符的多位整数。
- 3. expr 方法修改成了可以识别 “整数 -> 减号 -> 整数” 词组和 “整数 -> 加号 -> 整数” 词组。在成功识别相应的词组后,这个方法现在可以解释加法和减法。
+ 1. `get_next_token` 方法重写了很多。增加指针位置的逻辑之前是放在一个单独的方法中。
+ 2. 增加了一些方法:`skip_whitespace` 用于忽略空白字符,`integer` 用于处理输入字符的多位整数。
+ 3. `expr` 方法修改成了可以识别 “整数 -> 减号 -> 整数” 词组和 “整数 -> 加号 -> 整数” 词组。在成功识别相应的词组后,这个方法现在可以解释加法和减法。
-[第一部分][1] 中你学到了两个重要的概念,叫做 **标记** 和 **词法分析**。现在我想谈一谈 **词法**, **解析**,和**解析器**。
+[第一部分][1] 中你学到了两个重要的概念,叫做 标记 和词法分析。现在我想谈一谈词法、 解析 和解析器。
-你已经知道标记。但是为了让我详细的讨论标记,我需要谈一谈词法。词法是什么?**词法** 是一个标记中的字符序列。在下图中你可以看到一些关于标记的例子,还好这可以让它们之间的关系变得清晰:
+你已经知道了标记。但是为了让我详细的讨论标记,我需要谈一谈词法。词法是什么?词法是一个标记中的字符序列。在下图中你可以看到一些关于标记的例子,这可以让它们之间的关系变得清晰:
![][3]
-现在还记得我们的朋友,expr 方法吗?我之前说过,这是数学表达式实际被解释的地方。但是你要先识别这个表达式有哪些词组才能解释它,比如它是加法还是减法。expr 方法最重要的工作是:它从 get_next_token 方法中得到流,并找出标记流的结构然后解释已经识别出的词组,产生数学表达式的结果。
+现在还记得我们的朋友,`expr` 方法吗?我之前说过,这是数学表达式实际被解释的地方。但是你要先识别这个表达式有哪些词组才能解释它,比如它是加法还是减法。`expr` 方法最重要的工作是:它从 `get_next_token` 方法中得到流,并找出该标记流的结构,然后解释已经识别出的词组,产生数学表达式的结果。
-在标记流中找出结构的过程,或者换种说法,识别标记流中的词组的过程就叫 **解析**。解释器或者编译器中执行这个任务的部分就叫做 **解析器**。
+在标记流中找出结构的过程,或者换种说法,识别标记流中的词组的过程就叫解析。解释器或者编译器中执行这个任务的部分就叫做解析器。
-现在你知道 expr 方法就是你的解释器的部分,**解析** 和 **解释** 都在这里发生 - expr 方法首先尝试识别(**解析**)标记流里的 “整数 -> 加法 -> 整数” 或者 “整数 -> 减法 -> 整数” 词组,成功识别后 (**解析**) 其中一个词组,这个方法就开始解释它,返回两个整数的和或差。
+现在你知道 `expr` 方法就是你的解释器的部分,解析和解释都在这里发生 —— `expr` 方法首先尝试识别(解析)标记流里的 “整数 -> 加法 -> 整数” 或者 “整数 -> 减法 -> 整数” 词组,成功识别后 (解析了) 其中一个词组,这个方法就开始解释它,返回两个整数的和或差。
又到了练习的时间。
@@ -206,15 +207,12 @@ calc>
2. 扩展这个计算器,让它能够计算两个整数的除法
3. 修改代码,让它能够解释包含了任意数量的加法和减法的表达式,比如 “9 - 5 + 3 + 11”
-
-
**检验你的理解:**
1. 词法是什么?
2. 找出标记流结构的过程叫什么,或者换种说法,识别标记流中一个词组的过程叫什么?
3. 解释器(编译器)执行解析的部分叫什么?
-
希望你喜欢今天的内容。在该系列的下一篇文章里你就能扩展计算器从而处理更多复杂的算术表达式。敬请期待。
--------------------------------------------------------------------------------
@@ -223,12 +221,12 @@ via: https://ruslanspivak.com/lsbasi-part2/
作者:[Ruslan Spivak][a]
译者:[BriFuture](https://github.com/BriFuture)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://ruslanspivak.com
-[1]:http://ruslanspivak.com/lsbasi-part1/ (Part 1)
+[1]:https://linux.cn/article-9399-1.html
[2]:https://github.com/rspivak/lsbasi/blob/master/part2/calc2.py
[3]:https://ruslanspivak.com/lsbasi-part2/lsbasi_part2_lexemes.png
[4]:https://ruslanspivak.com/lsbasi-part2/lsbasi_part2_exercises.png
diff --git a/translated/tech/20150812 Let-s Build A Simple Interpreter. Part 3..md b/published/20150812 Let-s Build A Simple Interpreter. Part 3..md
similarity index 83%
rename from translated/tech/20150812 Let-s Build A Simple Interpreter. Part 3..md
rename to published/20150812 Let-s Build A Simple Interpreter. Part 3..md
index d50e5ce8f4..a70c10f9b0 100644
--- a/translated/tech/20150812 Let-s Build A Simple Interpreter. Part 3..md
+++ b/published/20150812 Let-s Build A Simple Interpreter. Part 3..md
@@ -1,11 +1,11 @@
-让我们做个简单的解释器(3)
+让我们做个简单的解释器(三)
======
早上醒来的时候,我就在想:“为什么我们学习一个新技能这么难?”
我不认为那是因为它很难。我认为原因可能在于我们花了太多的时间,而这件难事需要有丰富的阅历和足够的知识,然而我们要把这样的知识转换成技能所用的练习时间又不够。
-拿游泳来说,你可以花上几天时间来阅读很多有关游泳的书籍,花几个小时和资深的游泳者和教练交流,观看所有可以获得的训练视频,但你第一次跳进水池的时候,仍然会像一个石头那样沉入水中,
+拿游泳来说,你可以花上几天时间来阅读很多有关游泳的书籍,花几个小时和资深的游泳者和教练交流,观看所有可以获得的训练视频,但你第一次跳进水池的时候,仍然会像一个石头那样沉入水中,
要点在于:你认为自己有多了解那件事都无关紧要 —— 你得通过练习把知识变成技能。为了帮你练习,我把训练放在了这个系列的 [第一部分][1] 和 [第二部分][2] 了。当然,你会在今后的文章中看到更多练习,我保证 :)
@@ -17,7 +17,7 @@
![][3]
-什么是语法图? **语法图** 是对一门编程语言中的语法规则进行图像化的表示。基本上,一个语法图就能告诉你哪些语句可以在程序中出现,哪些不能出现。
+什么是语法图? **语法图** 是对一门编程语言中的语法规则进行图像化的表示。基本上,一个语法图就能告诉你哪些语句可以在程序中出现,哪些不能出现。
语法图很容易读懂:按照箭头指向的路径。某些路径表示的是判断,有些表示的是循环。
@@ -28,9 +28,7 @@
* 它们用图形的方式表示一个编程语言的特性(语法)。
* 它们可以用来帮你写出解析器 —— 你可以根据下列简单规则把图片转换成代码。
-
-
-你已经知道,识别出记号流中的词组的过程就叫做 **解析**。解释器或者编译器执行这个任务的部分叫做 **解析器**。解析也称为 **语法分析**,并且解析器这个名字很合适,你猜的对,就是 **语法分析**。
+你已经知道,识别出记号流中的词组的过程就叫做 **解析**。解释器或者编译器执行这个任务的部分叫做 **解析器**。解析也称为 **语法分析**,并且解析器这个名字很合适,你猜的对,就是 **语法分析器**。
根据上面的语法图,下面这些表达式都是合法的:
@@ -38,9 +36,8 @@
* 3 + 4
* 7 - 3 + 2 - 1
-
-
因为算术表达式的语法规则在不同的编程语言里面是很相近的,我们可以用 Python shell 来“测试”语法图。打开 Python shell,运行下面的代码:
+
```
>>> 3
3
@@ -53,6 +50,7 @@
意料之中。
表达式 “3 + ” 不是一个有效的数学表达式,根据语法图,加号后面必须要有个 term (整数),否则就是语法错误。然后,自己在 Python shell 里面运行:
+
```
>>> 3 +
File "", line 1
@@ -63,9 +61,10 @@ SyntaxError: invalid syntax
能用 Python shell 来做这样的测试非常棒,让我们把上面的语法图转换成代码,用我们自己的解释器来测试,怎么样?
-从之前的文章里([第一部分][1] 和 [第二部分][2])你知道 expr 方法包含了我们的解析器和解释器。再说一遍,解析器仅仅识别出结构,确保它与某些特性对应,而解释器实际上是在解析器成功识别(解析)特性之后,就立即对表达式进行评估。
+从之前的文章里([第一部分][1] 和 [第二部分][2])你知道 `expr` 方法包含了我们的解析器和解释器。再说一遍,解析器仅仅识别出结构,确保它与某些特性对应,而解释器实际上是在解析器成功识别(解析)特性之后,就立即对表达式进行评估。
以下代码片段显示了对应于图表的解析器代码。语法图里面的矩形方框(term)变成了 term 方法,用于解析整数,expr 方法和语法图的流程一致:
+
```
def term(self):
self.eat(INTEGER)
@@ -85,9 +84,10 @@ def expr(self):
self.term()
```
-你能看到 expr 首先调用了 term 方法。然后 expr 方法里面的 while 循环可以执行 0 或多次。在循环里面解析器基于标记做出判断(是加号还是减号)。花一些时间,你就知道,上述代码确实是遵循着语法图的算术表达式流程。
+你能看到 `expr` 首先调用了 `term` 方法。然后 `expr` 方法里面的 `while` 循环可以执行 0 或多次。在循环里面解析器基于标记做出判断(是加号还是减号)。花一些时间,你就知道,上述代码确实是遵循着语法图的算术表达式流程。
+
+解析器并不解释任何东西:如果它识别出了一个表达式,它就静默着,如果没有识别出来,就会抛出一个语法错误。改一下 `expr` 方法,加入解释器的代码:
-解析器并不解释任何东西:如果它识别出了一个表达式,它就静默着,如果没有识别出来,就会抛出一个语法错误。改一下 expr 方法,加入解释器的代码:
```
def term(self):
"""Return an INTEGER token value"""
@@ -113,14 +113,16 @@ def expr(self):
return result
```
-因为解释器需要评估一个表达式, term 方法被改成返回一个整型值,expr 方法被改成在合适的地方执行加法或减法操作,并返回解释的结果。尽管代码很直白,我建议花点时间去理解它。
+因为解释器需要评估一个表达式, `term` 方法被改成返回一个整型值,`expr` 方法被改成在合适的地方执行加法或减法操作,并返回解释的结果。尽管代码很直白,我建议花点时间去理解它。
+
进行下一步,看看完整的解释器代码,好不?
-这时新版计算器的源代码,它可以处理包含有任意多个加法和减法运算的有效的数学表达式。
+这是新版计算器的源代码,它可以处理包含有任意多个加法和减法运算的有效的数学表达式。
+
```
# 标记类型
#
-# EOF (end-of-file 文件末尾) 标记是用来表示所有输入都解析完成
+# EOF (end-of-file 文件末尾)标记是用来表示所有输入都解析完成
INTEGER, PLUS, MINUS, EOF = 'INTEGER', 'PLUS', 'MINUS', 'EOF'
@@ -265,9 +267,10 @@ if __name__ == '__main__':
main()
```
-把上面的代码保存到 calc3.py 文件中,或者直接从 [GitHub][4] 上下载。试着运行它。看看它能不能处理我之前给你看过的语法图里面派生出的数学表达式。
+把上面的代码保存到 `calc3.py` 文件中,或者直接从 [GitHub][4] 上下载。试着运行它。看看它能不能处理我之前给你看过的语法图里面派生出的数学表达式。
这是我在自己的笔记本上运行的示例:
+
```
$ python calc3.py
calc> 3
@@ -297,15 +300,13 @@ Traceback (most recent call last):
Exception: Invalid syntax
```
-
-记得我在文章开始时提过的练习吗:他们在这儿,我保证过的:)
+记得我在文章开始时提过的练习吗:它们在这儿,我保证过的:)
![][5]
* 画出只包含乘法和除法的数学表达式的语法图,比如 “7 * 4 / 2 * 3”。认真点,拿只钢笔或铅笔,试着画一个。
修改计算器的源代码,解释只包含乘法和除法的数学表达式。比如 “7 * 4 / 2 * 3”。
- * 从头写一个可以处理像 “7 - 3 + 2 - 1” 这样的数学表达式的解释器。用你熟悉的编程语言,不看示例代码自己思考着写出代码。做的时候要想一想这里面包含的组件:一个 lexer,读取输入并转换成标记流,一个解析器,从 lexer 提供的记号流中取食,并且尝试识别流中的结构,一个解释器,在解析器成功解析(识别)有效的数学表达式后产生结果。把这些要点串起来。花一点时间把你获得的知识变成一个可以运行的数学表达式的解释器。
-
+ * 从头写一个可以处理像 “7 - 3 + 2 - 1” 这样的数学表达式的解释器。用你熟悉的编程语言,不看示例代码自己思考着写出代码。做的时候要想一想这里面包含的组件:一个词法分析器,读取输入并转换成标记流,一个解析器,从词法分析器提供的记号流中获取,并且尝试识别流中的结构,一个解释器,在解析器成功解析(识别)有效的数学表达式后产生结果。把这些要点串起来。花一点时间把你获得的知识变成一个可以运行的数学表达式的解释器。
**检验你的理解。**
@@ -314,8 +315,6 @@ Exception: Invalid syntax
3. 什么是语法分析器?
-
-
嘿,看!你看完了所有内容。感谢你们坚持到今天,而且没有忘记练习。:) 下次我会带着新的文章回来,尽请期待。
--------------------------------------------------------------------------------
@@ -323,14 +322,14 @@ Exception: Invalid syntax
via: https://ruslanspivak.com/lsbasi-part3/
作者:[Ruslan Spivak][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[BriFuture](https://github.com/BriFuture)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://ruslanspivak.com
-[1]:http://ruslanspivak.com/lsbasi-part1/ (Part 1)
-[2]:http://ruslanspivak.com/lsbasi-part2/ (Part 2)
+[1]:https://linux.cn/article-9399-1.html
+[2]:https://linux.cn/article-9520-1.html
[3]:https://ruslanspivak.com/lsbasi-part3/lsbasi_part3_syntax_diagram.png
[4]:https://github.com/rspivak/lsbasi/blob/master/part3/calc3.py
[5]:https://ruslanspivak.com/lsbasi-part3/lsbasi_part3_exercises.png
diff --git a/sources/tech/20170101 How to resolve mount.nfs- Stale file handle error.md b/published/20170101 How to resolve mount.nfs- Stale file handle error.md
similarity index 50%
rename from sources/tech/20170101 How to resolve mount.nfs- Stale file handle error.md
rename to published/20170101 How to resolve mount.nfs- Stale file handle error.md
index d57280df28..056c9bf450 100644
--- a/sources/tech/20170101 How to resolve mount.nfs- Stale file handle error.md
+++ b/published/20170101 How to resolve mount.nfs- Stale file handle error.md
@@ -1,14 +1,15 @@
-How to resolve mount.nfs: Stale file handle error
+如何解决 “mount.nfs: Stale file handle”错误
======
-Learn how to resolve mount.nfs: Stale file handle error on Linux platform. This is Network File System error can be resolved from client or server end.
+
+> 了解如何解决 Linux 平台上的 `mount.nfs: Stale file handle` 错误。这个 NFS 错误可以在客户端或者服务端解决。
_![][1]_
-When you are using Network File System in your environment, you must have seen`mount.nfs: Stale file handle` error at times. This error denotes that NFS share is unable to mount since something has changed since last good known configuration.
+当你在你的环境中使用网络文件系统时,你一定不时看到 `mount.nfs:Stale file handle` 错误。此错误表示 NFS 共享无法挂载,因为自上次配置后有些东西已经更改。
-Whenever you reboot NFS server or some of the NFS processes are not running on client or server or share is not properly exported at server; these can be reasons for this error. Moreover its irritating when this error comes to previously mounted NFS share. Because this means configuration part is correct since it was previously mounted. In such case once can try following commands:
+无论是你重启 NFS 服务器或某些 NFS 进程未在客户端或服务器上运行,或者共享未在服务器上正确输出,这些都可能是导致这个错误的原因。此外,当这个错误发生在先前挂载的 NFS 共享上时,它会令人不快。因为这意味着配置部分是正确的,因为是以前挂载的。在这种情况下,可以尝试下面的命令:
-Make sure NFS service are running good on client and server.
+确保 NFS 服务在客户端和服务器上运行良好。
```
# service nfs status
@@ -18,9 +19,7 @@ nfsd (pid 12009 12008 12007 12006 12005 12004 12003 12002) is running...
rpc.rquotad (pid 11988) is running...
```
-> Stay connected to your favorite windows applications from anywhere on any device with [ windows 7 cloud desktop ][2] from CloudDesktopOnline.com. Get Office 365 with expert support and free migration from [ Apps4Rent.com ][3].
-
-If NFS share currently mounted on client, then un-mount it forcefully and try to remount it on NFS client. Check if its properly mounted by `df` command and changing directory inside it.
+如果 NFS 共享目前挂载在客户端上,则强制卸载它并尝试在 NFS 客户端上重新挂载它。通过 `df` 命令检查它是否正确挂载,并更改其中的目录。
```
# umount -f /mydata_nfs
@@ -32,9 +31,9 @@ If NFS share currently mounted on client, then un-mount it forcefully and try to
server:/nfs_share 41943040 892928 41050112 3% /mydata_nfs
```
-In above mount command, server can be IP or [hostname ][4]of NFS server.
+在上面的挂载命令中,服务器可以是 NFS 服务器的 IP 或[主机名][4]。
-If you are getting error while forcefully un-mounting like below :
+如果你在强制取消挂载时遇到像下面错误:
```
# umount -f /mydata_nfs
@@ -43,7 +42,8 @@ umount: /mydata_nfs: device is busy
umount2: Device or resource busy
umount: /mydata_nfs: device is busy
```
-Then you can check which all processes or users are using that mount point with `lsof` command like below:
+
+然后你可以用 `lsof` 命令来检查哪个进程或用户正在使用该挂载点,如下所示:
```
# lsof |grep mydata_nfs
@@ -55,9 +55,9 @@ bash 20092 oracle11 cwd unknown
bash 25040 oracle11 cwd unknown /mydata_nfs/MUYR (stat: Stale NFS file handle)
```
-If you see in above example that 4 PID are using some files on said mount point. Try killing them off to free mount point. Once done you will be able to un-mount it properly.
+如果你在上面的示例中看到共有 4 个 PID 正在使用该挂载点上的某些文件。尝试杀死它们以释放挂载点。完成后,你将能够正确卸载它。
-Sometimes it still give same error for mount command. Then try mounting after restarting NFS service at client using below command.
+有时 `mount` 命令会有相同的错误。接着使用下面的命令在客户端重启 NFS 服务后挂载。
```
# service nfs restart
@@ -71,19 +71,19 @@ Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
```
-Also read : [How to restart NFS step by step in HPUX][5]
+另请阅读:[如何在 HPUX 中逐步重启 NFS][5]
-Even if this didnt solve your issue, final step is to restart services at NFS server. Caution! This will disconnect all NFS shares which are exported from NFS server. All clients will see mount point disconnect. This step is where 99% you will get your issue resolved. If not then [NFS configurations][6] must be checked, provided you have changed configuration and post that you started seeing this error.
+即使这没有解决你的问题,最后一步是在 NFS 服务器上重启服务。警告!这将断开从该 NFS 服务器输出的所有 NFS 共享。所有客户端将看到挂载点断开。这一步将 99% 解决你的问题。如果没有,请务必检查 [NFS 配置][6],提供你修改的配置并发布你启动时看到的错误。
-Outputs in above post are from RHEL6.3 server. Drop us your comments related to this post.
+上面文章中的输出来自 RHEL6.3 服务器。请将你的评论发送给我们。
--------------------------------------------------------------------------------
via: https://kerneltalks.com/troubleshooting/resolve-mount-nfs-stale-file-handle-error/
作者:[KernelTalks][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20170201 Prevent Files And Folders From Accidental Deletion Or Modification In Linux.md b/published/20170201 Prevent Files And Folders From Accidental Deletion Or Modification In Linux.md
new file mode 100644
index 0000000000..0af616dccd
--- /dev/null
+++ b/published/20170201 Prevent Files And Folders From Accidental Deletion Or Modification In Linux.md
@@ -0,0 +1,296 @@
+
+如何在 Linux 系统中防止文件和目录被意外的删除或修改
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2017/02/Prevent-Files-And-Folders-From-Accidental-Deletion-Or-Modification-In-Linux-720x340.jpg)
+
+有时,我会不小心的按下 `SHIFT+DELETE`来删除我的文件数据。是的,我是个笨蛋,没有再次确认下我实际准备要删除的东西。而且我太笨或者说太懒,没有备份我的文件数据。结果呢?数据丢失了!在一瞬间就丢失了。
+
+这种事时不时就会发生在我身上。如果你和我一样,有个好消息告诉你。有个简单又有用的命令行工具叫`chattr`(**Ch**ange **Attr**ibute 的缩写),在类 Unix 等发行版中,能够用来防止文件和目录被意外的删除或修改。
+
+通过给文件或目录添加或删除某些属性,来保证用户不能删除或修改这些文件和目录,不管是有意的还是无意的,甚至 root 用户也不行。听起来很有用,是不是?
+
+在这篇简短的教程中,我们一起来看看怎么在实际应用中使用 `chattr` 命令,来防止文件和目录被意外删除。
+
+### Linux中防止文件和目录被意外删除和修改
+
+默认,`chattr` 命令在大多数现代 Linux 操作系统中是可用的。
+
+默认语法是:
+
+```
+chattr [operator] [switch] [file]
+```
+
+`chattr` 具有如下操作符:
+
+ * 操作符 `+`,追加指定属性到文件已存在属性中
+ * 操作符 `-`,删除指定属性
+ * 操作符 `=`,直接设置文件属性为指定属性
+
+`chattr` 提供不同的属性,也就是 `aAcCdDeijsStTu`。每个字符代表一个特定文件属性。
+
+ * `a` – 只能向文件中添加数据
+ * `A` – 不更新文件或目录的最后访问时间
+ * `c` – 将文件或目录压缩后存放
+ * `C` – 不适用写入时复制机制(CoW)
+ * `d` – 设定文件不能成为 `dump` 程序的备份目标
+ * `D` – 同步目录更新
+ * `e` – extend 格式存储
+ * `i` – 文件或目录不可改变
+ * `j` – 设定此参数使得当通过 `mount` 参数:`data=ordered` 或者 `data=writeback` 挂载的文件系统,文件在写入时会先被记录在日志中
+ * `P` – project 层次结构
+ * `s` – 安全删除文件或目录
+ * `S` – 即时更新文件或目录
+ * `t` – 不进行尾部合并
+ * `T` – 顶层目录层次结构
+ * `u` – 不可删除
+
+在本教程中,我们将讨论两个属性的使用,即 `a`、`i` ,这个两个属性可以用于防止文件和目录的被删除。这是我们今天的主题,对吧?来开始吧!
+
+### 防止文件被意外删除和修改
+
+我先在我的当前目录创建一个`file.txt`文件。
+
+```
+$ touch file.txt
+```
+
+现在,我将给文件应用 `i` 属性,让文件不可改变。就是说你不能删除或修改这个文件,就算你是文件的拥有者和 root 用户也不行。
+
+```
+$ sudo chattr +i file.txt
+```
+
+使用`lsattr`命令检查文件已有属性:
+
+```
+$ lsattr file.txt
+```
+
+输出:
+
+```
+----i---------e---- file.txt
+```
+
+现在,试着用普通用户去删除文件:
+
+```
+$ rm file.txt
+```
+
+输出:
+
+```
+# 不能删除文件,非法操作
+rm: cannot remove 'file.txt': Operation not permitted
+```
+
+我来试试 `sudo` 特权:
+
+```
+$ sudo rm file.txt
+```
+
+输出:
+
+```
+# 不能删除文件,非法操作
+rm: cannot remove 'file.txt': Operation not permitted
+```
+
+我们试试追加写内容到这个文本文件:
+
+```
+$ echo 'Hello World!' >> file.txt
+```
+
+输出:
+
+```
+# 非法操作
+bash: file.txt: Operation not permitted
+```
+
+试试 `sudo` 特权:
+
+```
+$ sudo echo 'Hello World!' >> file.txt
+```
+
+输出:
+
+```
+# 非法操作
+bash: file.txt: Operation not permitted
+```
+
+你应该注意到了,我们不能删除或修改这个文件,甚至 root 用户或者文件所有者也不行。
+
+要撤销属性,使用 `-i` 即可。
+
+```
+$ sudo chattr -i file.txt
+```
+
+现在,这不可改变属性已经被删除掉了。你现在可以删除或修改这个文件了。
+
+```
+$ rm file.txt
+```
+
+类似的,你能够限制目录被意外删除或修改,如下一节所述。
+
+### 防止目录被意外删除和修改
+
+创建一个 `dir1` 目录,放入文件 `file.txt`。
+
+```
+$ mkdir dir1 && touch dir1/file.txt
+```
+
+现在,让目录及其内容(`file.txt` 文件)不可改变:
+
+```
+$ sudo chattr -R +i dir1
+```
+
+命令中,
+
+ * `-R` – 递归使 `dir1` 目录及其内容不可修改
+ * `+i` – 使目录不可修改
+
+
+现在,来试试删除这个目录,要么用普通用户,要么用 `sudo` 特权。
+
+```
+$ rm -fr dir1
+$ sudo rm -fr dir1
+```
+
+你会看到如下输出:
+
+```
+# 不可删除'dir1/file.txt':非法操作
+rm: cannot remove 'dir1/file.txt': Operation not permitted
+```
+
+尝试用 `echo` 命令追加内容到文件,你成功了吗?当然,你做不到。
+
+撤销此属性,输入:
+
+```
+$ sudo chattr -R -i dir1
+```
+
+现在你就能想平常一样删除或修改这个目录内容了。
+
+### 防止文件和目录被意外删除,但允许追加操作
+
+我们现已知道如何防止文件和目录被意外删除和修改了。接下来,我们将防止文件被删除但仅仅允许文件被追加内容。意思是你不可以编辑修改文件已存在的数据,或者重命名这个文件或者删除这个文件,你仅可以使用追加模式打开这个文件。
+
+为了设置追加属性到文件或目录,我们像下面这么操作:
+
+针对文件:
+
+```
+$ sudo chattr +a file.txt
+```
+
+针对目录:
+
+```
+$ sudo chattr -R +a dir1
+```
+
+一个文件或目录被设置了 `a` 这个属性就仅仅能够以追加模式打开进行写入。
+
+添加些内容到这个文件以测试是否有效果。
+
+```
+$ echo 'Hello World!' >> file.txt
+$ echo 'Hello World!' >> dir1/file.txt
+```
+
+查看文件内容使用cat命令
+
+```
+$ cat file.txt
+$ cat dir1/file.txt
+```
+
+输出:
+
+```
+Hello World!
+```
+
+你将看到你现在可以追加内容。就表示我们可以修改这个文件或目录。
+
+现在让我们试试删除这个文件或目录。
+
+```
+$ rm file.txt
+```
+
+输出:
+
+```
+# 不能删除文件'file.txt':非法操作
+rm: cannot remove 'file.txt': Operation not permitted
+```
+
+让我们试试删除这个目录:
+
+```
+$ rm -fr dir1/
+```
+
+输出:
+
+```
+# 不能删除文件'dir1/file.txt':非法操作
+rm: cannot remove 'dir1/file.txt': Operation not permitted
+```
+
+删除这个属性,执行下面这个命令:
+
+针对文件:
+
+```
+$ sudo chattr -R -a file.txt
+```
+
+针对目录:
+
+```
+$ sudo chattr -R -a dir1/
+```
+
+现在,你可以想平常一样删除或修改这个文件和目录了。
+
+更多详情,查看 man 页面。
+
+```
+man chattr
+```
+
+### 总结
+
+保护数据是系统管理人员的主要工作之一。市场上有众多可用的免费和收费的数据保护软件。幸好,我们已经拥有这个内置命令可以帮助我们去保护数据被意外的删除和修改。在你的 Linux 系统中,`chattr` 可作为保护重要系统文件和数据的附加工具。
+
+然后,这就是今天所有内容了。希望对大家有所帮助。接下来我将会在这提供其他有用的文章。在那之前,敬请期待。再见!
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/prevent-files-folders-accidental-deletion-modification-linux/
+
+作者:[SK][a]
+译者:[yizhuoyan](https://github.com/yizhuoyan)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.ostechnix.com/author/sk/
diff --git a/translated/tech/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md b/published/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md
similarity index 88%
rename from translated/tech/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md
rename to published/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md
index 5af00db0f9..6b31355f02 100644
--- a/translated/tech/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md
+++ b/published/20170508 Ansible Tutorial- Intorduction to simple Ansible commands.md
@@ -39,7 +39,7 @@ $ ansible -m setup -a "filter=ansible_distribution"
### 传输文件
-对于传输文件,我们使用模块 “copy” ,完整的命令是这样的:
+对于传输文件,我们使用模块 `copy` ,完整的命令是这样的:
```
$ ansible -m copy -a "src=/home/dan dest=/tmp/home"
@@ -47,7 +47,7 @@ $ ansible -m copy -a "src=/home/dan dest=/tmp/home"
### 管理用户
-要管理已连接主机上的用户,我们使用一个名为 “user” 的模块,并如下使用它。
+要管理已连接主机上的用户,我们使用一个名为 `user` 的模块,并如下使用它。
#### 创建新用户
@@ -65,7 +65,7 @@ $ ansible -m user -a "name=testuser state=absent"
### 更改权限和所有者
-要改变已连接主机文件的所有者,我们使用名为 ”file“ 的模块,使用如下。
+要改变已连接主机文件的所有者,我们使用名为 `file` 的模块,使用如下。
#### 更改文件权限
@@ -81,7 +81,7 @@ $ ansible -m file -a "dest=/home/dan/file1.txt mode=777 owner=dan group=
### 管理软件包
-我们可以通过使用 ”yum“ 和 ”apt“ 模块来管理所有已连接主机的软件包,完整的命令如下:
+我们可以通过使用 `yum` 和 `apt` 模块来管理所有已连接主机的软件包,完整的命令如下:
#### 检查包是否已安装并更新
@@ -109,7 +109,7 @@ $ ansible -m yum -a "name=ntp state=absent"
### 管理服务
-要管理服务,我们使用模块 “service” ,完整命令如下:
+要管理服务,我们使用模块 `service` ,完整命令如下:
#### 启动服务
@@ -129,7 +129,7 @@ $ ansible -m service -a "name=httpd state=stopped"
$ ansible -m service -a "name=httpd state=restarted"
```
-这样我们简单的,单行 Ansible 命令的教程就完成了。此外,在未来的教程中,我们将学习创建 playbook,来帮助我们更轻松高效地管理主机。
+这样我们简单的、单行 Ansible 命令的教程就完成了。此外,在未来的教程中,我们将学习创建 playbook,来帮助我们更轻松高效地管理主机。
--------------------------------------------------------------------------------
diff --git a/published/20170915 Deep learning wars- Facebook-backed PyTorch vs Google-s TensorFlow.md b/published/20170915 Deep learning wars- Facebook-backed PyTorch vs Google-s TensorFlow.md
new file mode 100644
index 0000000000..43c2c988f6
--- /dev/null
+++ b/published/20170915 Deep learning wars- Facebook-backed PyTorch vs Google-s TensorFlow.md
@@ -0,0 +1,81 @@
+深度学习战争:Facebook 支持的 PyTorch 与 Google 的 TensorFlow
+======
+
+![](https://hub.packtpub.com/wp-content/uploads/2018/03/iStock-621901930-1068x832.jpg)
+
+有一个令人震惊的事实,即人工智能和机器学习的工具和技术在近期迅速兴起。深度学习,或者说“注射了激素的机器学习”,数据科学家和机器学习专家在这个领域有数不胜数等可用的库和框架。很多这样的框架都是基于 Python 的,因为 Python 是一个更通用,相对简单的语言。[Theano] [1]、[Keras] [2]、 [TensorFlow] [3] 是几个基于 Python 构建的流行的深度学习库,目的是使机器学习专家更轻松。
+
+Google 的 TensorFlow 是一个被广泛使用的机器学习和深度学习框架。 TensorFlow 开源于 2015 年,得到了机器学习专家社区的广泛支持,TensorFlow 已经迅速成长为许多机构根据其机器学习和深度学习等需求而选择的框架。 另一方面,PyTorch 是由 Facebook 最近开发的用于训练神经网络的 Python 包,改编自基于 Lua 的深度学习库 Torch。 PyTorch 是少数可用的深度学习框架之一,它使用基于磁带的自动梯度系统,以快速和灵活的方式构建动态神经网络。
+
+在这篇文章中,我们将 PyTorch 与 TensorFlow 进行不同方面的比较。
+
+让我们开始吧!
+
+### 什么编程语言支持 PyTorch 和 TensorFlow?
+
+虽然主要是用 C++ 和 CUDA 编写的,但 TensorFlow 包含一个位于核心引擎上的 Python API,使得更便于被Python 支持者使用。 除了 Python,它还包括 C++、Haskell、Java、Go 和 Rust 等其他 API,这意味着开发人员可以用他们的首选语言进行编码。
+
+虽然 PyTorch 是一个 Python 软件包,但你也可以提供使用基本的 C/C++ 语言的 API 进行编码。 如果你习惯使用 Lua 编程语言,你也可以使用 Torch API 在 PyTorch 中编写神经网络模型。
+
+### PyTorch 和 TensorFlow 有多么易于使用?
+
+如果将 TensorFlow 作为一个独立的框架使用,它可能会有点复杂,并且会给深度学习模型的训练带来一些困难。 为了减少这种复杂性,可以使用位于 TensorFlow 复杂引擎之上的 Keras 封装,以简化深度学习模型的开发和训练。 TensorFlow 也支持 PyTorch 目前没有的[分布式培训] [4]。 由于包含 Python API,TensorFlow 也可以在生产环境中使用,即可用于培训练和部署企业级深度学习模型。
+
+PyTorch 由于 Torch 的复杂用 Python 重写。 这使得 PyTorch 对于开发人员更为原生。 它有一个易于使用的框架,提供最大化的灵活和速度。 它还允许在训练过程中快速更改代码而不妨碍其性能。 如果你已经有了一些深度学习的经验,并且以前使用过 Torch,那么基于它的速度、效率和易用性,你会更喜欢 PyTorch。 PyTorch 包含定制的 GPU 分配器,这使得深度学习模型具有更高的内存效率。 由此,训练大型深度学习模型变得更容易。 因此,Pytorch
+在 Facebook、Twitter、Salesforce 等大型组织广受欢迎。
+
+### 用 PyTorch 和 TensorFlow 训练深度学习模型
+
+PyTorch 和 TensorFlow 都可以用来建立和训练神经网络模型。
+
+TensorFlow 工作于 SCG(静态计算图)上,包括在模型开始执行之前定义静态图。 但是,一旦开始执行,在模型内的调整更改的唯一方法是使用 [tf.session and tf.placeholder tensors][5]。
+
+PyTorch 非常适合训练 RNN(递归神经网络),因为它们在 [PyTorch] [6] 中比在 TensorFlow 中运行得更快。 它适用于 DCG(动态计算图),可以随时在模型中定义和更改。 在 DCG 中,每个模块可以单独调试,这使得神经网络的训练更简单。
+
+TensorFlow 最近提出了 TensorFlow Fold,这是一个旨在创建 TensorFlow 模型的库,用于处理结构化数据。 像 PyTorch 一样,它实现了 DCG,在 CPU 上提供高达 10 倍的计算速度,在 GPU 上提供超过 100 倍的计算速度! 在 [Dynamic Batching] [7] 的帮助下,你现在可以执行尺寸和结构都不相同的深度学习模型。
+
+### GPU 和 CPU 优化的比较
+
+TensorFlow 的编译时间比 PyTorch 短,为构建真实世界的应用程序提供了灵活性。 它可以从 CPU、GPU、TPU、移动设备到 Raspberry Pi(物联网设备)等各种处理器上运行。
+
+另一方面,PyTorch 包括张量计算,可以使用 GPU 将深度神经网络模型加速到 [50 倍或更多] [8]。 这些张量可以停留在 CPU 或 GPU 上。 CPU 和 GPU 都是独立的库, 无论神经网络大小如何,PyTorch 都可以高效地利用。
+
+### 社区支持
+
+TensorFlow 是当今最流行的深度学习框架之一,由此也给它带来了庞大的社区支持。 它有很好的文档和一套详细的在线教程。 TensorFlow 还包括许多预先训练过的模型,这些模型托管和提供于 [GitHub] [9]。 这些模型提供给热衷于使用 TensorFlow 开发者和研究人员一些现成的材料来节省他们的时间和精力。
+
+另一方面,PyTorch 的社区相对较小,因为它最近才发展起来。 与 TensorFlow 相比,文档并不是很好,代码也不是很容易获得。 然而,PyTorch 确实允许个人与他人分享他们的预训练模型。
+
+### PyTorch 和 TensorFlow —— 力量悬殊的故事
+
+就目前而言,由于各种原因,TensorFlow 显然比 PyTorch 更受青睐。
+
+TensorFlow 很大,经验丰富,最适合实际应用。 是大多数机器学习和深度学习专家明显的选择,因为它提供了大量的功能,最重要的是它在市场上的成熟应用。 它具有更好的社区支持以及多语言 API 可用。 它有一个很好的文档库,由于从准备到使用的代码使之易于生产。 因此,它更适合想要开始深度学习的人,或者希望开发深度学习模型的组织。
+
+虽然 PyTorch 相对较新,社区较小,但它速度快,效率高。 总之,它给你所有的优势在于 Python 的有用性和易用性。 由于其效率和速度,对于基于研究的小型项目来说,这是一个很好的选择。 如前所述,Facebook、Twitter 等公司正在使用 PyTorch 来训练深度学习模型。 但是,使用它尚未成为主流。 PyTorch 的潜力是显而易见的,但它还没有准备好去挑战这个 TensorFlow 野兽。 然而,考虑到它的增长,PyTorch 进一步优化并提供更多功能的日子并不遥远,直到与 TensorFlow可以 比较。
+
+作者: Savia Lobo,非常喜欢数据科学。 喜欢更新世界各地的科技事件。 喜欢歌唱和创作歌曲。 相信才智上的艺术。
+
+--------------------------------------------------------------------------------
+
+via: https://datahub.packtpub.com/deep-learning/dl-wars-pytorch-vs-tensorflow/
+
+作者:[Savia Lobo][a]
+译者:[Wuod3n](https://github.com/Wuod3n)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://datahub.packtpub.com/author/savial/
+[1]:https://www.packtpub.com/web-development/deep-learning-theano
+[2]:https://www.packtpub.com/big-data-and-business-intelligence/deep-learning-keras
+[3]:https://www.packtpub.com/big-data-and-business-intelligence/deep-learning-tensorflow
+[4]:https://www.tensorflow.org/deploy/distributed
+[5]:https://www.tensorflow.org/versions/r0.12/get_started/basic_usage
+[6]:https://www.reddit.com/r/MachineLearning/comments/66rriz/d_rnns_are_much_faster_in_pytorch_than_tensorflow/
+[7]:https://arxiv.org/abs/1702.02181
+[8]:https://github.com/jcjohnson/pytorch-examples#pytorch-tensors
+[9]:https://github.com/tensorflow/models
+
+
+
diff --git a/published/20170927 Best Linux Distros for the Enterprise.md b/published/20170927 Best Linux Distros for the Enterprise.md
new file mode 100644
index 0000000000..516a01ef58
--- /dev/null
+++ b/published/20170927 Best Linux Distros for the Enterprise.md
@@ -0,0 +1,81 @@
+面向企业的最佳 Linux 发行版
+====
+
+在这篇文章中,我将分享企业环境下顶级的 Linux 发行版。其中一些发行版用于服务器和云环境以及桌面任务。所有这些可选的 Linux 具有的一个共同点是它们都是企业级 Linux 发行版 —— 所以你可以期待更高程度的功能性,当然还有支持程度。
+
+### 什么是企业级的 Linux 发行版?
+
+企业级的 Linux 发行版可以归结为以下内容 —— 稳定性和支持。在企业环境中,使用的 Linux 版本必须满足这两点。稳定性意味着所提供的软件包既稳定又可用,同时仍然保持预期的安全性。
+
+企业级的支持因素意味着有一个可靠的支持机制。有时这是单一的(官方)来源,如公司。在其他情况下,它可能是一个非营利性的治理机构,向优秀的第三方支持供应商提供可靠的建议。很明显,前者是最好的选择,但两者都可以接受。
+
+### Red Hat 企业级 Linux(RHEL)
+
+[Red Hat][1] 有很多很棒的产品,都有企业级的支持来保证可用。其核心重点如下:
+
+- Red Hat 企业级 Linux 服务器:这是一组服务器产品,包括从容器托管到 SAP 服务的所有内容,还有其他衍生的服务器。
+- Red Hat 企业级 Linux 桌面:这些是严格控制的用户环境,运行 Red Hat Linux,提供基本的桌面功能。这些功能包括访问最新的应用程序,如 web 浏览器、电子邮件、LibreOffice 等。
+- Red Hat 企业级 Linux 工作站:这基本上是 Red Hat 企业级 Linux 桌面,但针对高性能任务进行了优化。它也非常适合于大型部署和持续管理。
+
+#### 为什么选择 Red Hat 企业级 Linux?
+
+Red Hat 是一家非常成功的大型公司,销售围绕 Linux 的服务。基本上,Red Hat 从那些想要避免供应商锁定和其他相关问题的公司赚钱。这些公司认识到聘用开源软件专家和管理他们的服务器和其他计算需求的价值。一家公司只需要购买订阅来让 Red Hat 做支持工作就行。
+
+Red Hat 也是一个可靠的社会公民。他们赞助开源项目以及像 OpenSource.com 这样的 FoSS 支持网站(LCTT 译注:FoSS 是 Free and Open Source Software 的缩写,意为自由及开源软件),并为 Fedora 项目提供支持。Fedora 不是由 Red Hat 所有的,而是由它赞助开发的。这使 Fedora 得以发展,同时也使 Red Hat 受益匪浅。Red Hat 可以从 Fedora 项目中获得他们想要的,并将其用于他们的企业级 Linux 产品中。 就目前来看,Fedora 充当了红帽企业 Linux 的上游渠道。
+
+### SUSE Linux 企业版本
+
+[SUSE][2] 是一家非常棒的公司,为企业用户提供了可靠的 Linux 选择。SUSE 的产品类似于 Red Hat,桌面和服务器都是该公司所关注的。从我自己使用 SUSE 的经验来看,我相信 YaST 已经证明了,对于希望在工作场所使用 Linux 操作系统的非 Linux 管理员而言,它拥有巨大的优势。YaST 为那些需要一些基本的 Linux 命令行知识的任务提供了一个友好的 GUI。
+
+SUSE 的核心重点如下:
+
+- SUSE Linux 企业级服务器(SLES):包括任务特定的解决方案,从云到 SAP,以及任务关键计算和基于软件的数据存储。
+- SUSE Linux 企业级桌面:对于那些希望为员工提供可靠的 Linux 工作站的公司来说,SUSE Linux 企业级桌面是一个不错的选择。和 Red Hat 一样,SUSE 通过订阅模式来对其提供支持。你可以选择三个不同级别的支持。
+
+#### 为什么选择 SUSE Linux 企业版?
+
+SUSE 是一家围绕 Linux 销售服务的公司,但他们仍然通过专注于简化操作来实现这一目标。从他们的网站到其提供的 Linux 发行版,重点是易用性,而不会牺牲安全性或可靠性。尽管在美国毫无疑问 Red Hat 是服务器的标准,但 SUSE 作为公司和开源社区的贡献成员都做得很好。
+
+我还会继续说,SUSE 不会太严肃,当你在 IT 领域建立联系的时候,这是一件很棒的事情。从他们关于 Linux 的有趣音乐视频到 SUSE 贸易展位中使用的 Gecko 以获得有趣的照片机会,SUSE 将自己描述成简单易懂和平易近人的形象。
+
+### Ubuntu LTS Linux
+
+[Ubuntu Long Term Release][3] (LTS) Linux 是一个简单易用的企业级 Linux 发行版。Ubuntu 看起来比上面提到的其他发行版更新更频繁(有时候也更不稳定)。但请不要误解,Ubuntu LTS 版本被认为是相当稳定的,不过,我认为一些专家可能不太同意它们是安全可靠的。
+
+#### Ubuntu 的核心重点如下:
+
+- Ubuntu 桌面版:毫无疑问,Ubuntu 桌面非常简单,可以快速地学习并运行。也许在高级安装选项中缺少一些东西,但这使得其更简单直白。作为额外的奖励,Ubuntu 相比其他版本有更多的软件包(除了它的父亲,Debian 发行版)。我认为 Ubuntu 真正的亮点在于,你可以在网上找到许多销售 Ubuntu 的厂商,包括服务器、台式机和笔记本电脑。
+- Ubuntu 服务器版:这包括服务器、云和容器产品。Ubuntu 还提供了 Juju 云“应用商店”这样一个有趣的概念。对于任何熟悉 Ubuntu 或 Debian 的人来说,Ubuntu 服务器都很有意义。对于这些人来说,它就像手套一样,为你提供了你已经熟知并喜爱的命令行工具。
+- Ubuntu IoT:最近,Ubuntu 的开发团队已经把目标瞄准了“物联网”(IoT)的创建解决方案。包括数字标识、机器人技术和物联网网关。我的猜测是,我们将在 Ubuntu 中看到大量增长的物联网用户来自企业,而不是普通家庭用户。
+
+#### 为什么选择 Ubuntu LTS?
+
+社区是 Ubuntu 最大的优点。除了在已经拥挤的服务器市场上的巨大增长之外,它还与普通用户在一起。Ubuntu 的开发和用户社区是坚如磐石的。因此,虽然它可能被认为比其他企业版更不稳定,但是我发现将 Ubuntu LTS 安装锁定到 “security updates only” 模式下提供了非常稳定的体验。
+
+### CentOS 或者 Scientific Linux 怎么样呢?
+
+首先,让我们把 [CentOS][4] 作为一个企业发行版,如果你有自己的内部支持团队来维护它,那么安装 CentOS 是一个很好的选择。毕竟,它与 Red Hat 企业级 Linux 兼容,并提供了与 Red Hat 产品相同级别的稳定性。不幸的是,它不能完全取代 Red Hat 支持订阅。
+
+那么 [Scientific Linux][5] 呢?它的发行版怎么样?好吧,它就像 CentOS,它是基于 Red Hat Linux 的。但与 CentOS 不同的是,它与 Red Hat 没有任何隶属关系。 Scientific Linux 从一开始就有一个目标 —— 为世界各地的实验室提供一个通用的 Linux 发行版。今天,Scientific Linux 基本上是 Red Hat 减去所包含的商标资料。
+
+这两种发行版都不能真正地与 Red Hat 互换,因为它们缺少 Red Hat 支持组件。
+
+哪一个是顶级企业发行版?我认为这取决于你需要为自己确定的许多因素:订阅范围、可用性、成本、服务和提供的功能。这些是每个公司必须自己决定的因素。就我个人而言,我认为 Red Hat 在服务器上获胜,而 SUSE 在桌面环境中轻松获胜,但这只是我的意见 —— 你不同意?点击下面的评论部分,让我们来谈谈它。
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.datamation.com/open-source/best-linux-distros-for-the-enterprise.html
+
+作者:[Matt Hartley][a]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.datamation.com/author/Matt-Hartley-3080.html
+[1]:https://www.redhat.com/en
+[2]:https://www.suse.com/
+[3]:http://releases.ubuntu.com/16.04/
+[4]:https://www.centos.org/
+[5]:https://www.scientificlinux.org/
diff --git a/published/20170927 Linux directory structure- -lib explained.md b/published/20170927 Linux directory structure- -lib explained.md
new file mode 100644
index 0000000000..66ec8e41f4
--- /dev/null
+++ b/published/20170927 Linux directory structure- -lib explained.md
@@ -0,0 +1,105 @@
+Linux 目录结构:/lib 分析
+======
+
+[![linux 目录 lib][1]][1]
+
+我们在之前的文章中已经分析了其他重要系统目录,比如 `/bin`、`/boot`、`/dev`、 `/etc` 等。可以根据自己的兴趣进入下列链接了解更多信息。本文中,让我们来看看 `/lib` 目录都有些什么。
+
+- [目录结构分析:/bin 文件夹][2]
+- [目录结构分析:/boot 文件夹][3]
+- [目录结构分析:/dev 文件夹][4]
+- [目录结构分析:/etc 文件夹][5]
+- [目录结构分析:/lost+found 文件夹][6]
+- [目录结构分析:/home 文件夹][7]
+
+### Linux 中,/lib 文件夹是什么?
+
+`/lib` 文件夹是 **库文件目录** ,包含了所有对系统有用的库文件。简单来说,它是应用程序、命令或进程正确执行所需要的文件。在 `/bin` 或 `/sbin` 目录中的命令的动态库文件正是在此目录中。内核模块同样也在这里。
+
+以 `pwd` 命令执行为例。执行它需要调用一些库文件。让我们来探索一下 `pwd` 命令执行时都发生了什么。我们需要使用 [strace 命令][8] 找出调用的库文件。
+
+示例:
+
+```
+root@linuxnix:~# strace -e open pwd
+open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
+open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
+open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
+/root
++++ exited with 0 +++
+root@linuxnix:~#
+```
+
+如果你注意到的话,会发现我们使用的 `pwd` 命令的执行需要调用两个库文件。
+
+### Linux 中 /lib 文件夹内部信息
+
+正如之前所说,这个文件夹包含了目标文件和一些库文件,如果能了解这个文件夹的一些重要子文件,想必是极好的。下面列举的内容是基于我自己的系统,对于你的来说,可能会有所不同。
+
+```
+root@linuxnix:/lib# find . -maxdepth 1 -type d
+./firmware
+./modprobe.d
+./xtables
+./apparmor
+./terminfo
+./plymouth
+./init
+./lsb
+./recovery-mode
+./resolvconf
+./crda
+./modules
+./hdparm
+./udev
+./ufw
+./ifupdown
+./systemd
+./modules-load.d
+```
+
+`/lib/firmware` - 这个文件夹包含了一些硬件、固件代码。
+
+> **硬件和固件之间有什么不同?**
+
+> 为了使硬件正常运行,很多设备软件由两部分软件组成。加载到实际硬件的代码部分就是固件,用于在固件和内核之间通讯的软件被称为驱动程序。这样一来,内核就可以直接与硬件通讯,并确保硬件完成内核指派的工作。
+
+`/lib/modprobe.d` - modprobe 命令的配置目录。
+
+`/lib/modules` - 所有的可加载内核模块都存储在这个目录下。如果你有多个内核,你会在这个目录下看到代表美国内核的目录。
+
+`/lib/hdparm` - 包含 SATA/IDE 硬盘正确运行的参数。
+
+`/lib/udev` - 用户空间 /dev 是 Linux 内核设备管理器。这个文件夹包含了所有的 udev 相关的文件和文件夹,例如 `rules.d` 包含了 udev 规范文件。
+
+### /lib 的姊妹文件夹:/lib32 和 /lib64
+
+这两个文件夹包含了特殊结构的库文件。它们几乎和 `/lib` 文件夹一样,除了架构级别的差异。
+
+### Linux 其他的库文件
+
+`/usr/lib` - 所有软件的库都安装在这里。但是不包含系统默认库文件和内核库文件。
+
+`/usr/local/lib` - 放置额外的系统文件。这些库能够用于各种应用。
+
+`/var/lib` - 存储动态数据的库和文件,例如 rpm/dpkg 数据和游戏记录。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxnix.com/linux-directory-structure-lib-explained/
+
+作者:[Surendra Anne][a]
+译者:[CYLeft](https://github.com/CYLeft)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.linuxnix.com/author/surendra/
+[1]:https://www.linuxnix.com/wp-content/uploads/2017/09/The-lib-folder-explained.png
+[2]:https://www.linuxnix.com/linux-directory-structure-explained-bin-folder/
+[3]:https://www.linuxnix.com/linux-directory-structure-explained-boot-folder/
+[4]:https://www.linuxnix.com/linux-directory-structure-explained-dev-folder/
+[5]:https://www.linuxnix.com/linux-directory-structure-explainedetc-folder/
+[6]:https://www.linuxnix.com/lostfound-directory-linuxunix/
+[7]:https://www.linuxnix.com/linux-directory-structure-home-root-folders/
+[8]:https://www.linuxnix.com/10-strace-command-examples-linuxunix/
diff --git a/published/20170928 Process Monitoring.md b/published/20170928 Process Monitoring.md
new file mode 100644
index 0000000000..b8654a1a42
--- /dev/null
+++ b/published/20170928 Process Monitoring.md
@@ -0,0 +1,55 @@
+对进程的监视
+======
+
+由于复刻了 mon 项目到 [etbemon][1] 中,我花了一些时间做监视脚本。事实上监视一些事情通常很容易,但是决定监视什么才是困难的部分。进程监视脚本 `ps.monitor` 是我重新设计过的一个。
+
+对于进程监视我有一些思路。如果你对进程监视如何做的更好有任何建议,请通过评论区告诉我。
+
+给不使用 mon 的人介绍一下,如果一切 OK 该监视脚本就返回 0,而如果有问题它会返回 1,并使用标准输出显示错误信息。虽然我并不知道有谁将 mon 脚本挂进一个不同的监视系统中,但是,那样做其实很容易实现。我计划去做的一件事情就是,将来实现 mon 和其它的监视系统如 Nagios 之间的互操作性。
+
+### 基本监视
+
+```
+ps.monitor tor:1-1 master:1-2 auditd:1-1 cron:1-5 rsyslogd:1-1 dbus-daemon:1- sshd:1- watchdog:1-2
+```
+
+我现在计划重写该进程监视脚本的某些部分。现在的功能是在命令行上列出进程名字,它包含了要监视的进程的最小和最大实例数量。上面的示例是一个监视的配置。在这里有一些限制,在这个实例中的 `master` 进程指的是 Postfix 的主进程,但是其它的守护进程使用了相同的进程名(这是那些错误的名字之一,因为它太直白了)。一个显而易见的解决方案是,给一个指定完整路径的选项,这样,那个 `/usr/lib/postfix/sbin/master` 就可以与其它命名为 `master` 的程序区分开了。
+
+下一个问题是那些可能以多个用户身份运行的进程。比如 `sshd`,它有一个以 root 身份运行的单独的进程去接受新的连接请求,以及在每个登入用户的 UID 下运行的进程。因此,作为 root 用户运行的 sshd 进程的数量将比 root 登录会话的数量大 1。这意味着如果一个系统管理员直接以 root 身份通过 `ssh` 登入系统(这是有争议的,但它不是本文的主题—— 只是有些人需要这样做,所以我们必须支持这种情形),然后 master 进程崩溃了(或者系统管理员意外或者故意杀死了它),这时对于该进程丢失并不会产生警报。当然正确的做法是监视 22 号端口,查找字符串 `SSH-2.0-OpenSSH_`。有时候,守护进程的多个实例运行在需要单独监视的不同 UID 下面。因此,我们需要通过 UID 监视进程的能力。
+
+在许多情形中,进程监视可以被替换为对服务端口的监视。因此,如果在 25 号端口上监视,那么有可能意味着,Postfix 的 `master` 在运行着,不用去理会其它的 `master` 进程。但是对于我而言,我可以在方便地进行多个监视,如果我得到一个关于无法向一个服务器发送邮件的 Jabber 消息,我可以通过这个来自服务器的 Jabber 消息断定 `master` 没有运行,而不需要挨个查找才能发现问题所在。
+
+### SE Linux
+
+我想要的一个功能就是,监视进程的 SE Linux 上下文,就像监视 UID 一样。虽然我对为其它安全系统编写一个测试不感兴趣,但是,我很乐意将别人写好的代码包含进去。因此,不管我做什么,都希望它能与多个安全系统一起灵活地工作。
+
+### 短暂进程
+
+大多数守护进程在进程启动期间都有一个相同名字的次级进程。这意味着如果你为了精确地监视一个进程的一个实例,当 `logrotate` 或者类似的守护进程重启时,你或许会收到一个警报说有两个进程运行。如果在重启期间,恰好在一个错误的时间进行检查,你也或许会收到一个警报说,有 0 个实例。我现在处理这种情况的方法是,在与 `alertafter 2` 指令一起的次级进程失败事件之前我的服务器不发出警报。当监视处于一个失败的状态时,`failure_interval` 指令允许指定检查的时间间隔,将其设置为一个较低值时,意味着在等待一个次级进程失败结果时并不会使提示延迟太多。
+
+为处理这种情况,我考虑让 `ps.monitor` 脚本在一个指定的延迟后再次进行自动检查。我认为使用一个单个参数的监视脚本来解决这个问题比起使用两个配置指令的 mon 要好一些。
+
+### CPU 使用
+
+mon 现在有一个 `loadavg.monitor` 脚本,它用于检查平均负载。但是它并不能捕获一个单个进程使用了太多的 CPU 时间而没有使系统平均负载上升的情况。同样,也没有捕获一个渴望获得 CPU 的进程进入沉默(例如,SETI at Home 停止运行)(LCTT 译注:SETI,由加州大学伯克利分校创建的一项利用全球的联网计算机的空闲计算资源来搜寻地外文明的科学实验计划),而其它的进程进入一个无限循环状态的情况。解决这种问题的一个方法是,让 `ps.monitor` 脚本也配置另外的一个选项去监视 CPU 的使用,但是这也可能会让人产生迷惑。另外的选择是,使用一个独立的脚本,它用来报警任何在它的生命周期或者最后几秒中,使用 CPU 时间超过指定百分比的进程,除非它在一个豁免这种检查的进程或用户的白名单中。或者每个普通用户都应该豁免这种检查,因为你压根就不知道他们什么时候运行一个文件压缩程序。也应该有一个包含排除的守护进程(像 BOINC)和系统进程(像 gzip,有几个定时任务会运行它)的简短列表。
+
+### 对例外的监视
+
+一个常见的编程错误是在 `setgid()` 之前调用 `setuid()`,这意味着那个程序没有权限去调用 `setgid()`。如果没有检查返回代码(而犯这种低级错误的人往往不会去检查返回代码),那么进程会保持较高的权限。检查以 GID 0 而不是 UID 0 运行的进程是很方便的。顺利说一下,对一个 Debian/Testing 工作站运行的一个快速检查显示,一个使用 GID 0 的进程并没有获得较高的权限,但是可以使用一个 `chmod 770` 命令去改变它。
+
+在一个 SE Linux 系统上,应该只有一个进程与 `init_t` 域一起运行。目前在运行守护进程(比如,mysqld 和 tor)的 Debian Stretch 系统中,并不会发生策略与守护进程服务文件所请求的 systemd 的最新功能不匹配的情况。这样的问题将会不断发生,我们需要对它进行自动化测试。
+
+对配置错误的自动测试可能会影响系统安全,这是一个很大的问题,我将来或许写一篇关于这方面的单独的博客文章。
+
+--------------------------------------------------------------------------------
+
+via: https://etbe.coker.com.au/2017/09/28/process-monitoring/
+
+作者:[Andrew][a]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://etbe.coker.com.au
+[1]:https://doc.coker.com.au/projects/etbe-mon/
diff --git a/translated/tech/20171002 Linux Gunzip Command Explained with Examples.md b/published/20171002 Linux Gunzip Command Explained with Examples.md
similarity index 99%
rename from translated/tech/20171002 Linux Gunzip Command Explained with Examples.md
rename to published/20171002 Linux Gunzip Command Explained with Examples.md
index 9d509c56e5..fb6a25bcba 100644
--- a/translated/tech/20171002 Linux Gunzip Command Explained with Examples.md
+++ b/published/20171002 Linux Gunzip Command Explained with Examples.md
@@ -74,7 +74,6 @@ gunzip -c file1.gz > /home/himanshu/file1
> `gunzip` 在命令行接受一系列的文件,并且将每个文件内容以正确的魔法数开始,且后缀名为 `.gz`、`-gz`、`.z`、`-z` 或 `_z` (忽略大小写)的压缩文件,用未压缩的文件替换它,并删除其原扩展名。 `gunzip` 也可识别一些特殊扩展名的压缩文件,如 `.tgz` 和 `.taz` 分别是 `.tar.gz` 和 `.tar.Z` 的缩写。在压缩时,`gzip` 在必要情况下使用 `.tgz` 作为扩展名,而不是只截取掉 `.tar` 后缀。
> `gunzip` 目前可以解压 `gzip`、`zip`、`compress`、`compress -H`(`pack`)产生的文件。`gunzip` 自动检测输入文件格式。在使用前两种压缩格式时,`gunzip` 会检验 32 位循环冗余校验码(CRC)。对于 pack 包,`gunzip` 会检验压缩长度。标准压缩格式在设计上不允许相容性检测。不过 `gunzip` 有时可以检测出坏的 `.Z` 文件。如果你解压 `.Z` 文件时出错,不要因为标准解压没报错就认为 `.Z` 文件一定是正确的。这通常意味着标准解压过程不检测它的输入,而是直接产生一个错误的输出。SCO 的 `compress -H` 格式(lzh 压缩方法)不包括 CRC 校验码,但也允许一些相容性检查。
-```
### 结语
diff --git a/sources/tech/20171010 How to test internet speed in Linux terminal.md b/published/20171010 How to test internet speed in Linux terminal.md
similarity index 58%
rename from sources/tech/20171010 How to test internet speed in Linux terminal.md
rename to published/20171010 How to test internet speed in Linux terminal.md
index 85c1832153..066d473d69 100644
--- a/sources/tech/20171010 How to test internet speed in Linux terminal.md
+++ b/published/20171010 How to test internet speed in Linux terminal.md
@@ -1,21 +1,21 @@
-Translating by FelixYFZ
-How to test internet speed in Linux terminal
+如何在Linux的终端测试网速
======
-Learn how to use speedtest cli tool to test internet speed in Linux terminal. Also includes one liner python command to get speed details right away.
-![test internet speed in linux terminal][1]
+> 学习如何在 Linux 终端使用命令行工具 `speedtest` 测试网速,或者仅用一条 python 命令立刻获得网速的测试结果。
-Most of us check the internet bandwidth speed whenever we connect to new network or wifi. So why not our servers! Here is a tutorial which will walk you through to test internet speed in Linux terminal.
+![在Linux终端测试网速][1]
-Everyone of us generally uses [Speedtest by Ookla][2] to check internet speed. Its pretty simple process for a desktop. Goto their website and just click GO button. It will scans your location and speed test with nearest server. If you are on mobile, they have their app for you. But if you are on terminal with command line interface things are little different. Lets see how to check internet speed from Linux terminal.
+我们都会在连接到一个新的网络或者 WIFI 的时候去测试网络带宽。 为什么不用我们自己的服务器!下面将会教你如何在 Linux 终端测试网速。
-If you want to speed check only once and dont want to download tool on server, jump here and see one liner command.
+我们多数都会使用 [Ookla 的 Speedtest][2] 来测试网速。 这在桌面上是很简单的操作,访问他们的网站点击“Go”浏览即可。它将使用最近的服务器来扫描你的本地主机来测试网速。 如果你使用的是移动设备,他们有对应的移动端 APP。但如果你使用的是只有命令行终端,界面的则会有些不同。下面让我们一起看看如何在Linux的终端来测试网速。
-### Step 1 : Download speedtest cli tool
+如果你只是想偶尔的做一次网速测试而不想去下载测试工具,那么请往下看如何使用命令完成测试。
-First of all, you have to download speedtest CLI tool from [github repository][3]. Now a days, its also included in many well known Linux repositories as well. If its their in yours then you can directly [install that package on your Linux distro][4].
+### 第一步:下载网速测试命令行工具。
-Lets proceed with Github download and install process. [Install git package][4] depending on your distro. Then clone Github repo of speedtest like belwo :
+首先,你需要从 [GitHub][3] 上下载 `speedtest` 命令行工具。现在,它也被包含在许多其它的 Linux 仓库中,如果已经在你的库中,你可以直接[在你的 Linux 发行版上进行安装][4]。
+
+让我们继续下载和安装过程,安装的 git 包取决于你的 Linux 发行版。然后按照下面的方法来克隆 Github speedtest 存储库
```
[root@kerneltalks ~]# git clone https://github.com/sivel/speedtest-cli.git
@@ -24,10 +24,9 @@ remote: Counting objects: 913, done.
remote: Total 913 (delta 0), reused 0 (delta 0), pack-reused 913
Receiving objects: 100% (913/913), 251.31 KiB | 143.00 KiB/s, done.
Resolving deltas: 100% (518/518), done.
-
```
-It will be cloned to your present working directory. New directory named `speedtest-cli` will be created. You can see below files in it.
+它将会被克隆到你当前的工作目录,新的名为 `speedtest-cli` 的目录将会被创建,你将在新的目录下看到如下的文件。
```
[root@kerneltalks ~]# cd speedtest-cli
@@ -45,13 +44,13 @@ total 96
-rw-r--r--. 1 root root 333 Oct 7 16:55 tox.ini
```
-The python script `speedtest.py` is the one we will be using to check internet speed.
+名为 `speedtest.py` 的 Python 脚本文件就是用来测试网速的。
-You can link this script for a command in /usr/bin so that all users on server can use it. Or you can even create [command alias][5] for it and it will be easy for all users to use it.
+你可以将这个脚本链接到 `/usr/bin` 下,以便这台机器上的所有用户都能使用。或者你可以为这个脚本创建一个[命令别名][5],这样就能让所有用户很容易使用它。
-### Step 2 : Run python script
+### 运行 Python 脚本
-Now, run python script without any argument and it will search nearest server and test your internet speed.
+现在,直接运行这个脚本,不需要添加任何参数,它将会搜寻最近的服务器来测试你的网速。
```
[root@kerneltalks speedtest-cli]# python speedtest.py
@@ -66,13 +65,13 @@ Testing upload speed............................................................
Upload: 323.95 Mbit/s
```
-Oh! Dont amaze with speed. 😀 I am on [AWS EC2 Linux server][6]. Thats the bandwidth of Amazon data center! 🙂
+Oh! 不要被这个网速惊讶道。我在 AWE EX2 的服务器上。那是亚马逊数据中心的网速!
-### Different options with script
+### 这个脚本可以添加有不同的选项。
-Few options which might be useful are as below :
+下面的几个选项对这个脚本可能会很有用处:
- **To search speedtest servers** nearby your location use `--list` switch and `grep` for your location name.
+**要搜寻你附近的网路测试服务器**,使用 `--list` 和 `grep` 加上地名来列出所有附近的服务器。
```
[root@kerneltalks speedtest-cli]# python speedtest.py --list | grep -i mumbai
@@ -90,11 +89,11 @@ Few options which might be useful are as below :
6403) YOU Broadband India Pvt Ltd., Mumbai (Mumbai, India) [1.15 km]
```
-You can see here, first column is server identifier followed by name of company hosting that server, location and finally its distance from your location.
+然后你就能从搜寻结果中看到,第一列是服务器识别号,紧接着是公司的名称和所在地,最后是离你的距离。
- **To test internet speed using specific server** use `--server` switch and server identifier from previous output as argument.
+**如果要使用指定的服务器来测试网速**,后面跟上 `--server` 加上服务器的识别号。
-```
+```
[root@kerneltalks speedtest-cli]# python speedtest.py --server 2827
Retrieving speedtest.net configuration...
Testing from Amazon (35.154.184.126)...
@@ -107,7 +106,7 @@ Testing upload speed............................................................
Upload: 69.25 Mbit/s
```
-**To get share link of your speed test** , use `--share` switch. It will give you URL of your test hosted on speedtest website. You can share this URL.
+**如果想得到你的测试结果的分享链接**,使用 `--share`,你将会得到测试结果的链接。
```
[root@kerneltalks speedtest-cli]# python speedtest.py --share
@@ -121,24 +120,23 @@ Download: 621.00 Mbit/s
Testing upload speed................................................................................................
Upload: 367.37 Mbit/s
Share results: http://www.speedtest.net/result/6687428141.png
-
```
-Observe last line which includes URL of your test result. If I download that image its the one below :
+输出中的最后一行就是你的测试结果的链接。下载下来的图片内容如下 :
![Speedtest result on Linux][7]
-Thats it! But hey if you dont want all this technical jargon, you can even use below one liner to get speed test done right away.
+这就是全部的过程!如果你不想了解这些技术细节,你也可以使用如下的一行命令迅速测出你的网速。
-### Internet speed test using one liner in terminal
+### 要想在终端使用一条命令测试网速。
-We are going to use [curl tool ][8]to fetch above said python script online and supply it to python for execution on the go!
+我们将使用 `curl` 工具来在线抓取上面使用的 Python 脚本然后直接用 Python 执行脚本。
```
[root@kerneltalks ~]# curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -
```
-Above command will run the script and show you result on screen!
+上面的脚本将会运行脚本输出结果到屏幕上。
```
[root@kerneltalks speedtest-cli]# curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -
@@ -153,24 +151,24 @@ Testing upload speed............................................................
Upload: 355.84 Mbit/s
```
-I tested this tool on RHEL 7 server but process is same on Ubuntu, Debian, Fedora or CentOS.
+这是在 RHEL 7 上执行的结果,在 Ubuntu、Debian、Fedora 或者 CentOS 上一样可以执行。
--------------------------------------------------------------------------------
via: https://kerneltalks.com/tips-tricks/how-to-test-internet-speed-in-linux-terminal/
作者:[Shrikant Lavhate][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[FelixYFZ](https://github.com/FelixYFZ)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://kerneltalks.com
-[1]:https://c1.kerneltalks.com/wp-content/uploads/2017/10/check-internet-speed-from-Linux.png
+[1]:https://a1.kerneltalks.com/wp-content/uploads/2017/10/check-internet-speed-from-Linux.png
[2]:http://www.speedtest.net/
[3]:https://github.com/sivel/speedtest-cli
[4]:https://kerneltalks.com/tools/package-installation-linux-yum-apt/
[5]:https://kerneltalks.com/commands/command-alias-in-linux-unix/
[6]:https://kerneltalks.com/howto/install-ec2-linux-server-aws-with-screenshots/
-[7]:https://c3.kerneltalks.com/wp-content/uploads/2017/10/speedtest-on-linux.png
+[7]:https://a3.kerneltalks.com/wp-content/uploads/2017/10/speedtest-on-linux.png
[8]:https://kerneltalks.com/tips-tricks/4-tools-download-file-using-command-line-linux/
diff --git a/translated/tech/20171014 Proxy Models in Container Environments.md b/published/20171014 Proxy Models in Container Environments.md
similarity index 53%
rename from translated/tech/20171014 Proxy Models in Container Environments.md
rename to published/20171014 Proxy Models in Container Environments.md
index 4e5b329d68..3592ce567e 100644
--- a/translated/tech/20171014 Proxy Models in Container Environments.md
+++ b/published/20171014 Proxy Models in Container Environments.md
@@ -1,41 +1,43 @@
容器环境中的代理模型
============================================================
-### 我们大多数人都熟悉代理如何工作,但在基于容器的环境中有什么不同?看看有什么改变。
+> 我们大多数人都熟悉代理如何工作,但在基于容器的环境中有什么不同?让我们来看看有什么改变。
-内联,side-arm,反向和前向。这些曾经是我们用来描述网络代理架构布局的术语。
+内联、侧臂、反向和前向。这些曾经是我们用来描述网络代理架构布局的术语。
如今,容器使用一些相同的术语,但它们正在引入新的东西。这对我是个机会来阐述我最爱的所有主题:代理。
-云的主要驱动之一(我们曾经有过成果控制的白日梦)就是可扩展性。在过去五年中,扩展在各种调查中面临着敏捷性的挑战(有时甚至获胜),因为这是机构在云计算环境中部署应用的最大追求。
+云的主要驱动之一(我们曾经有过成本控制的白日梦)就是可扩展性。在过去五年中,扩展在各种调查中面临着敏捷性的挑战(有时甚至获胜),因为这是机构在云计算环境中部署应用的最大追求。
-这在一定程度上是因为在数字经济 (我们现在运营的) 中,应用已经成为数字等同于实体店的“开放/关闭”的标志和数字客户援助的体现。缓慢、无响应的应用程序等同于把灯关闭或者商店人员不足。
+这在一定程度上是因为在(我们现在运营的)数字经济中,应用已经成为像实体店的“营业/休息”的标牌和导购一样的东西。缓慢、无响应的应用如同商店关灯或缺少营业人员一样。
-应用程序需要可用且响应满足需求。扩展是实现这一业务目标的技术响应。云不仅提供了扩展的能力,而且还提供了_自动_扩展的能力。要做到这一点,需要一个负载均衡器。因为这就是我们扩展应用程序的方式 - 使用代理负载均衡流量/请求。
+ [![](https://devcentral.f5.com/Portals/0/Users/038/38/38/unavailable_is_closed_thumb.png?ver=2017-09-12-082119-957)][4]
+
+应用需要随时可用且能够满足需求。扩展是实现这一业务目标的技术响应。云不仅提供了扩展的能力,而且还提供了_自动_扩展的能力。要做到这一点,需要一个负载均衡器。因为这就是我们扩展应用程序的方式 :使用代理来负载均衡流量/请求。
-容器在扩展上与预期没有什么不同。容器必须进行扩展 - 并自动扩展 - 这意味着使用负载均衡器(代理)。
+容器在扩展上与预期没有什么不同。容器必须进行扩展(并自动扩展)这意味着使用负载均衡器(代理)。
-如果你使用的是本机,则你正在基于 TCP/UDP 进行基本的负载平衡。一般来说,基于容器的代理实现在 HTTP 或其他应用层协议中不流畅,除了一般的旧的负载均衡([POLB][1])之外,不提供其他功能。这通常足够好,因为容器扩展是在一个克隆的水平预置环境中进行的 - 要扩展一个应用程序,添加另一个副本并在其上分发请求。在入口处(在[入口控制器][2]和 API 网关中)可以找到第 7 层(HTTP)路由功能,并且可以使用尽可能多(或更多)的应用程序路由来扩展应用程序。
+如果你使用的是原有的代理机制,那就是采用基于 TCP/UDP 进行基本的负载平衡。一般来说,基于容器的代理的实现在 HTTP 或其他应用层协议中并不流畅,并不能在旧式的负载均衡([POLB][1])之外提供其他功能。这通常足够了,因为容器扩展是在一个克隆的、假定水平扩展的环境中进行的:要扩展一个应用程序,就添加另一个副本并在其上分发请求。在入口处(在[入口控制器][2]和 API 网关中)可以找到第 7 层(HTTP)路由功能,并且可以使用尽可能多(或更多)的应用路由来扩展应用程序。
-然而,在某些情况下,这还不够。如果你希望(或需要)更多以应用程序为中心的扩展或插入其他服务的能力,那么你将获得更健壮的产品,可提供可编程性或以应用程序为中心的可伸缩性,或者两者兼而有之。
+然而,在某些情况下,这还不够。如果你希望(或需要)更多以应用程序为中心的扩展或插入其他服务的能力,那么你就可以获得更健壮的产品,可提供可编程性或以应用程序为中心的可伸缩性,或者两者兼而有之。
-这意味着[插入代理][3]。你正在使用的容器编排环境在很大程度上决定了代理的部署模型,无论它是反向代理还是前向代理。为了让事情有趣,还有第三个模型 - sidecar - 这是由新兴的服务网格实现支持的可扩展性的基础。
+这意味着[插入代理][3]。你正在使用的容器编排环境在很大程度上决定了代理的部署模型,无论它是反向代理还是前向代理。更有趣的是,还有第三个模型挎斗模式 ,这是由新兴的服务网格实现支持的可扩展性的基础。
### 反向代理
- [![Image title](https://devcentral.f5.com/Portals/0/Users/038/38/38/unavailable_is_closed_thumb.png?ver=2017-09-12-082119-957 "Image title")][4]
+![](https://devcentral.f5.com/Portals/0/Users/038/38/38/per-app_reverse_proxy.jpg)
-反向代理最接近于传统模型,在这种模型中,虚拟服务器接受所有传入请求,并将其分发到资源池(服务器中心,集群)中。
+反向代理最接近于传统模型,在这种模型中,虚拟服务器接受所有传入请求,并将其分发到资源池(服务器中心、集群)中。
-每个“应用程序”有一个代理。任何想要连接到应用程序的客户端连接到代理,代理然后选择并转发请求到适当的实例。如果绿色应用想要与蓝色应用通信,它会向蓝色代理发送请求,蓝色代理会确定蓝色应用的两个实例中的哪一个应该响应该请求。
+每个“应用程序”有一个代理。任何想要连接到应用程序的客户端都连接到代理,代理然后选择并转发请求到适当的实例。如果绿色应用想要与蓝色应用通信,它会向蓝色代理发送请求,蓝色代理会确定蓝色应用的两个实例中的哪一个应该响应该请求。
在这个模型中,代理只关心它正在管理的应用程序。蓝色代理不关心与橙色代理关联的实例,反之亦然。
### 前向代理
- [![Image title](https://devcentral.f5.com/Portals/0/Users/038/38/38/per-node_forward_proxy_thumb.jpg?ver=2017-09-14-072422-213)][5]
+ [![](https://devcentral.f5.com/Portals/0/Users/038/38/38/per-node_forward_proxy.jpg?ver=2017-09-14-072422-213)][5]
-这种模式更接近传统出站防火墙的模式。
+这种模式更接近传统的出站防火墙的模式。
在这个模型中,每个容器 **节点** 都有一个关联的代理。如果客户端想要连接到特定的应用程序或服务,它将连接到正在运行的客户端所在的容器节点的本地代理。代理然后选择一个适当的应用实例,并转发客户端的请求。
@@ -43,31 +45,31 @@
在这个模型中,每个代理必须知道每个应用,以确保它可以将请求转发给适当的实例。
-### sidecar 代理
+### 挎斗代理
- [![Image title](https://devcentral.f5.com/Portals/0/Users/038/38/38/per-pod_sidecar_proxy_thumb.jpg?ver=2017-09-14-072425-620)][6]
+ [![](https://devcentral.f5.com/Portals/0/Users/038/38/38/per-pod_sidecar_proxy.jpg?ver=2017-09-14-072425-620)][6]
这种模型也被称为服务网格路由。在这个模型中,每个**容器**都有自己的代理。
-如果客户想要连接到一个应用,它将连接到 sidecar 代理,它会选择一个合适的应用程序实例并转发客户端的请求。此行为与_前向代理_模型相同。
+如果客户想要连接到一个应用,它将连接到挎斗代理,它会选择一个合适的应用程序实例并转发客户端的请求。此行为与_前向代理_模型相同。
-sidecar 和前向代理之间的区别在于,sidecar 代理不需要修改容器编排环境。例如,为了插入一个前向代理到 k8s,你需要代理_和_一个 kube-proxy 的替代。sidecar 代理不需要此修改,因为应用会自动连接到 “sidecar” 代理而不是通过代理路由。
+挎斗代理和前向代理之间的区别在于,挎斗代理不需要修改容器编排环境。例如,为了插入一个前向代理到 k8s,你需要代理_和_一个 kube-proxy 的替代。挎斗代理不需要这种修改,因为应用会自动连接到 “挎斗” 代理而不是通过代理路由。
### 总结
-每种模式都有其优点和缺点。三者共同依赖环境数据(远程监控和配置变化),以及融入生态系统的需求。有些模型是根据你选择的环境预先确定的,因此需要仔细考虑将来的需求 - 服务插入、安全性、网络复杂性 - 在建立模型之前需要进行评估。
+每种模式都有其优点和缺点。三者共同依赖环境数据(远程监控和配置变化),以及融入生态系统的需求。有些模型是根据你选择的环境预先确定的,因此需要仔细考虑将来的需求(服务插入、安全性、网络复杂性)在建立模型之前需要进行评估。
在容器及其在企业中的发展方面,我们还处于早期阶段。随着它们继续延伸到生产环境中,了解容器化环境发布的应用程序的需求以及它们在代理模型实现上的差异是非常重要的。
-我是急性写下这篇文章的。现在就这么多。
+这篇文章是匆匆写就的。现在就这么多。
--------------------------------------------------------------------------------
via: https://dzone.com/articles/proxy-models-in-container-environments
-作者:[Lori MacVittie ][a]
+作者:[Lori MacVittie][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/) 荣誉推出
diff --git a/published/20171016 5 SSH alias examples in Linux.md b/published/20171016 5 SSH alias examples in Linux.md
new file mode 100644
index 0000000000..bcfc643750
--- /dev/null
+++ b/published/20171016 5 SSH alias examples in Linux.md
@@ -0,0 +1,210 @@
+Linux 中的 5 个 SSH 别名例子
+======
+
+[![][1]][1]
+
+作为一个 Linux 用户,我们常用 [ssh 命令][2] 来登入远程机器。`ssh` 命令你用得越多,你在键入一些重要的命令上花的时间也越多。我们可以用 [定义在你的 .bashrc 文件里的别名][3] 或函数来大幅度缩减花在命令行界面(CLI)的时间。但这不是最佳解决之道。最佳办法是在 `ssh` 配置文件中使用 **SSH 别名** 。
+
+这里是我们能把 `ssh` 命令用得更好的几个例子。
+
+ssh 登入到 AWS(译注:Amazon Web Services,亚马逊公司旗下云计算服务平台)实例的连接是一种痛。仅仅输入以下命令,每次也完全是浪费你时间。
+
+```
+ssh -p 3000 -i /home/surendra/mysshkey.pem ec2-user@ec2-54-20-184-202.us-west-2.compute.amazonaws.com
+```
+
+缩短到:
+
+```
+ssh aws1
+```
+
+调试时连接到系统。
+
+```
+ssh -vvv the_good_user@red1.taggle.abc.com.au
+```
+
+缩短到:
+
+```
+ssh xyz
+```
+
+在本篇中,我们将看到如何不使用 bash 别名或函数实现 `ssh` 命令的缩短。`ssh` 别名的主要优点是所有的 `ssh` 命令快捷方式都存储在一个单一文件,如此就易于维护。其他优点是 **对于类似于 SSH 和 SCP 的命令** 我们能用相同的别名。
+
+在我们进入实际配置之前,我们应该知道 `/etc/ssh/ssh_config`、`/etc/ssh/sshd_config` 和 `~/.ssh/config` 文件三者的区别。以下是对这些文件的解释。
+
+### /etc/ssh/ssh_config 和 ~/.ssh/config 间的区别
+
+系统级别的 SSH 配置项存放在 `/etc/ssh/ssh_config`,而用户级别的 SSH 配置项存放在 `~/.ssh/config` 文件中。
+
+### /etc/ssh/ssh_config 和 /etc/ssh/sshd_config 间的区别
+
+系统级别的 SSH 配置项是在 `/etc/ssh/ssh_config` 文件中,而系统级别的 SSH **服务端**配置项存放在 `/etc/ssh/sshd_config` 文件。
+
+### 在 ~/.ssh/config 文件里配置项的语法
+
+`~/.ssh/config` 文件内容的语法:
+
+```
+配置项 值
+配置项 值1 值2
+```
+
+**例 1:** 创建主机(www.linuxnix.com)的 SSH 别名
+
+编辑 `~/.ssh/config` 文件写入以下内容:
+
+```
+Host tlj
+ User root
+ HostName 18.197.176.13
+ port 22
+```
+
+保存此文件。
+
+以上 ssh 别名用了
+
+ 1. `tlj` 作为一个别名的名称
+ 2. `root` 作为将要登入的用户
+ 3. `18.197.176.13` 作为主机的 IP 地址
+ 4. `22` 作为访问 SSH 服务的端口
+
+输出:
+
+```
+sanne@Surendras-MacBook-Pro:~ > ssh tlj
+Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)
+ * Documentation: https://help.ubuntu.com
+ * Management: https://landscape.canonical.com
+ * Support: https://ubuntu.com/advantage
+ Get cloud support with Ubuntu Advantage Cloud Guest:
+ http://www.ubuntu.com/business/services/cloud
+Last login: Sat Oct 14 01:00:43 2017 from 20.244.25.231
+root@linuxnix:~# exit
+logout
+Connection to 18.197.176.13 closed.
+```
+
+**例 2:** 不用密码用 ssh 密钥登到系统要用 `IdentityFile` 。
+
+例:
+
+```
+Host aws
+ User ec2-users
+ HostName ec2-54-200-184-202.us-west-2.compute.amazonaws.com
+ IdentityFile ~/Downloads/surendra.pem
+ port 22
+```
+
+**例 3:** 对同一主机使用不同的别名。在下例中,我们对同一 IP/主机 18.197.176.13 用了 `tlj`、 `linuxnix`、`linuxnix.com` 三个别名。
+
+~/.ssh/config 文件内容
+```
+Host tlj linuxnix linuxnix.com
+ User root
+ HostName 18.197.176.13
+ port 22
+```
+
+**输出:**
+
+```
+sanne@Surendras-MacBook-Pro:~ > ssh tlj
+Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)
+* Documentation: https://help.ubuntu.com
+* Management: https://landscape.canonical.com
+* Support: https://ubuntu.com/advantage
+Get cloud support with Ubuntu Advantage Cloud Guest:
+http://www.ubuntu.com/business/services/cloud
+Last login: Sat Oct 14 01:00:43 2017 from 220.244.205.231
+root@linuxnix:~# exit
+logout
+Connection to 18.197.176.13 closed.
+sanne@Surendras-MacBook-Pro:~ > ssh linuxnix.com
+Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)
+* Documentation: https://help.ubuntu.com
+* Management: https://landscape.canonical.com
+* Support: https://ubuntu.com/advantage
+```
+```
+Get cloud support with Ubuntu Advantage Cloud Guest:
+http://www.ubuntu.com/business/services/cloud
+Last login: Sun Oct 15 20:31:08 2017 from 1.129.110.13
+root@linuxnix:~# exit
+logout
+Connection to 138.197.176.103 closed.
+[6571] sanne@Surendras-MacBook-Pro:~ > ssh linuxnix
+Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)
+* Documentation: https://help.ubuntu.com
+* Management: https://landscape.canonical.com
+* Support: https://ubuntu.com/advantage
+Get cloud support with Ubuntu Advantage Cloud Guest:
+http://www.ubuntu.com/business/services/cloud
+Last login: Sun Oct 15 20:31:20 2017 from 1.129.110.13
+root@linuxnix:~# exit
+logout
+Connection to 18.197.176.13 closed.
+```
+
+**例 4:** 用相同的 SSH 别名复制文件到远程系统
+
+语法:
+
+```
+scp <文件名> :<位置>
+```
+
+例子:
+
+```
+sanne@Surendras-MacBook-Pro:~ > scp abc.txt tlj:/tmp
+abc.txt 100% 12KB 11.7KB/s 00:01
+sanne@Surendras-MacBook-Pro:~ >
+```
+
+若我们已经将 ssh 主机设置好一个别名,由于 `ssh` 和 `scp` 两者用几乎相同的语法和选项,`scp` 也可以轻易使用。
+
+请在下面尝试从本机 `scp` 一个文件到远程机器。
+
+**例 5:** 解决 Linux 中的 SSH 超时问题。默认情况,如果你不积极地使用终端,你的 ssh 登入就会超时
+
+[SSH 超时问题][5] 是一个更痛的点意味着你在一段时间后不得不重新登入到远程机器。我们能在 `~/.ssh/config` 文件里边恰当地设置 SSH 超时时间来使你的会话不管在什么时间总是激活的。我们将用 2 个能保持会话存活的 SSH 选项来实现这一目的。之一是 `ServerAliveInterval` 保持你会话存活的秒数和 `ServerAliveCountMax` 在(经历了一个)给定数值的会话之后初始化会话。
+
+```
+ServerAliveInterval A
+ServerAliveCountMax B
+```
+
+**例:**
+
+```
+Host tlj linuxnix linuxnix.com
+ User root
+ HostName 18.197.176.13
+ port 22
+ ServerAliveInterval 60
+ ServerAliveCountMax 30
+```
+
+在下篇中我们将会看到一些其他的退出方式。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxnix.com/5-ssh-alias-examples-using-ssh-config-file/
+
+作者:[SURENDRA ANNE][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.linuxnix.com
+[1]:https://www.linuxnix.com/wp-content/uploads/2017/10/SSH-alias-1.png
+[2]:https://www.linuxnix.com/ssh-access-remote-linux-server/
+[3]:https://www.linuxnix.com/linux-alias-command-explained-with-examples/
+[4]:/cdn-cgi/l/email-protection
+[5]:https://www.linuxnix.com/how-to-auto-logout/
diff --git a/published/20171018 Install a Centralized Log Server with Rsyslog in Debian 9.md b/published/20171018 Install a Centralized Log Server with Rsyslog in Debian 9.md
new file mode 100644
index 0000000000..f13a69acab
--- /dev/null
+++ b/published/20171018 Install a Centralized Log Server with Rsyslog in Debian 9.md
@@ -0,0 +1,258 @@
+在 Debian 9 上使用 Rsyslog 安装一台中央日志服务器
+======
+
+在 Linux 上,日志文件包含了系统功能的信息,系统管理员经常使用日志来确认机器上的问题所在。日志可以帮助管理员还原在过去的时间中在系统中发生的事件。一般情况下,Linux 中所有的日志文件都保存在 `/var/log` 目录下。在这个目录中,有保存着各种信息的几种类型的日志文件。比如,记录系统事件的日志文件、记录安全相关信息的日志文件、内核专用的日志文件、用户或者 cron 作业使用的日志文件。日志文件的主要作用是系统调试。Linux 中的大部分的日志文件都由 rsyslogd 服务来管理。在最新的 Linux 发行版中,日志文件也可能是由 journald 系统服务来管理和控制的。journald 服务是 systemd 初始化程序的一部分。journald 以二进制的格式存储日志,以易失性的方式写入到内存和 `/run/log/journal/` 中的环状缓冲区中,但是,journald 也可以配置为永久存储到 syslog 中。
+
+在 Linux 中,可以配置运行一个 Rsyslog 服务器来中央化管理日志,在流行的服务端—客户端模式中,通过 TCP 或者 UDP 传输协议基于网络来发送日志信息,或者从网络设备、服务器、路由器、交换机、以及其它系统或嵌入式设备中接受生成的日志。
+
+Rsyslog 守护程序可以被同时配置为以客户端或者服务端方式运行。配置作为服务器时,Rsyslog 将缺省监听 TCP 和 UDP 的 514 端口,来收集远程系统基于网络发送的日志信息。配置为客户端运行时,Rsyslog 将通过相同的 TCP 或 UDP 端口基于网络来发送内部日志信息。
+
+Rsyslog 可以根据选定的属性和动作来过滤 syslog 信息。Rsyslog 拥有的过滤器如下:
+
+ 1. 设备或者优先级过滤器
+ 2. 基于特性的过滤器
+ 3. 基于表达式的过滤器
+
+设备过滤器代表了生成日志的 Linux 内部子系统。它们目前的分类如下:
+
+ * `auth/authpriv` = 由验证进程产生的信息
+ * `cron` = cron 任务相关的日志
+ * `daemon` = 正在运行的系统服务相关的信息
+ * `kernel` = Linux 内核信息
+ * `mail` = 邮件服务器信息
+ * `syslog` = syslog 或者其它守护程序(DHCP 服务器发送的日志在这里)相关的信息
+ * `lpr` = 打印机或者打印服务器信息
+ * `local0` ~ `local7` = 管理员控制下的自定义信息
+
+优先级或者严重程度级别分配如下所述的一个关键字或者一个数字。
+
+ * `emerg` = 紧急 - 0
+ * `alert` = 警报 - 1
+ * `err` = 错误 - 3
+ * `warn` = 警告 - 4
+ * `notice` = 提示 - 5
+ * `info` = 信息 - 6
+ * `debug` = 调试 - 7 (最高级别)
+
+此外也有一些 Rsyslog 专用的关键字,比如星号(`*`)可以用来定义所有的设备和优先级,`none` 关键字更具体地表示没有优先级,等号(`=`)表示仅那个优先级,感叹号(`!`)表示取消这个优先级。
+
+Rsyslog 的动作部分由声明的目的地来表示。日志信息的目的地可以是:存储在文件系统中的一个文件、 `/var/log/` 目录下的一个文件、通过命名管道或者 FIFO 作为输入的另一个本地进程。日志信息也可以直达用户,或者丢弃到一个“黑洞”(`/dev/null`)中、或者发送到标准输出、或者通过一个 TCP/UDP 协议发送到一个远程 syslog 服务器。日志信息也可以保存在一个数据库中,比如 MySQL 或者 PostgreSQL。
+
+### 配置 Rsyslog 为服务器
+
+在大多数 Linux 发行版中 Rsyslog 守护程序是自动安装的。如果你的系统中没有安装 Rsyslog,你可以根据你的系统发行版执行如下之一的命令去安装这个服务。_运行这个命令必须有 root 权限_。
+
+在基于 Debian 的发行版中:
+
+```
+sudo apt-get install rsyslog
+```
+
+在基于 RHEL 的发行版中,比如像 CentOS:
+
+```
+sudo yum install rsyslog
+```
+
+验证 Rsyslog 守护进程是否在你的系统中运行,根据发行版不同,可以选择运行下列的命令:
+
+在新的使用 systemd 的 Linux 发行版中:
+
+```
+systemctl status rsyslog.service
+```
+
+在老的使用 init 的 Linux 发行版中:
+
+```
+service rsyslog status
+```
+
+或
+
+```
+/etc/init.d/rsyslog status
+```
+
+启动 rsyslog 守护进程运行如下的命令。
+
+在使用 init 的老的 Linux 版本:
+
+```
+service rsyslog start
+```
+
+或
+
+```
+/etc/init.d/rsyslog start
+```
+
+在最新的 Linux 发行版:
+
+```
+systemctl start rsyslog.service
+```
+
+安装一个 rsyslog 程序运行为服务器模式,可以编辑主要的配置文件 `/etc/rsyslog.conf` 。可以使用下列所示的命令去改变它。
+
+```
+sudo vi /etc/rsyslog.conf
+```
+
+为了允许在 UDP 的 514 端口上接收日志信息,找到并删除下列行前面的井号(`#`)以取消注释。缺省情况下,UDP 端口用于 syslog 去接收信息。
+
+```
+$ModLoad imudp
+$UDPServerRun 514
+```
+
+因为在网络上使用 UDP 协议交换数据并不可靠,你可以设置 Rsyslog 使用 TCP 协议去向远程服务器输出日志信息。为了启用 TCP 协议去接受日志信息,打开 `/etc/rsyslog.conf` 文件并删除如下行前面的井号(`#`)以取消注释。这将允许 rsyslog 守护程序去绑定并监听 TCP 协议的 514 端口。
+
+```
+$ModLoad imtcp
+$InputTCPServerRun 514
+```
+
+_在 rsyslog 上可以**同时**启用两种协议_。
+
+如果你想去指定哪个发送者被允许访问 rsyslog 守护程序,可以在启用协议行的后面添加如下的行:
+
+```
+$AllowedSender TCP, 127.0.0.1, 10.110.50.0/24, *.yourdomain.com
+```
+
+在接收入站日志信息之前,你需要去创建一个 rsyslog 守护程序解析日志的新模板,这个模板将指示本地 Rsyslog 服务器在哪里保存入站的日志信息。在 `$AllowedSender` 行后以如下示例去创建一个合适的模板。
+
+```
+$template Incoming-logs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
+*.* ?Incoming-logs
+& ~
+```
+
+为了仅接收内核生成的日志信息,可以使用如下的语法。
+
+```
+kern.* ?Incoming-logs
+```
+
+接收到的日志由上面的模板来解析,它将保存在本地文件系统的 `/var/log/` 目录的文件中,之后的是以客户端主机名客户端设备名命名的日志文件名字:`%HOSTNAME%` 和 `%PROGRAMNAME%` 变量。
+
+下面的 `& ~` 重定向规则,配置 Rsyslog 守护程序去保存入站日志信息到由上面的变量名字指定的文件中。否则,接收到的日志信息将被进一步处理,并将保存在本地的日志文件中,比如,`/var/log/syslog` 文件中。
+
+为添加一个规则去丢弃所有与邮件相关的日志信息,你可以使用下列的语法。
+
+```
+mail.* ~
+```
+
+可以在输出文件名中使用的其它变量还有:`%syslogseverity%`、`%syslogfacility%`、`%timegenerated%`、`%HOSTNAME%`、`%syslogtag%`、`%msg%`、`%FROMHOST-IP%`、`%PRI%`、`%MSGID%`、`%APP-NAME%`、`%TIMESTAMP%`、%$year%、`%$month%`、`%$day%`。
+
+从 Rsyslog 版本 7 开始,将使用一个新的配置格式,在一个 Rsyslog 服务器中声明一个模板。
+
+一个版本 7 的模板应该看起来是如下行的样子。
+
+```
+template(name="MyTemplate" type="string"
+ string="/var/log/%FROMHOST-IP%/%PROGRAMNAME:::secpath-replace%.log"
+ )
+```
+
+另一种模式是,你也可以使用如下面所示的样子去写上面的模板:
+
+```
+template(name="MyTemplate" type="list") {
+ constant(value="/var/log/")
+ property(name="fromhost-ip")
+ constant(value="/")
+ property(name="programname" SecurePath="replace")
+ constant(value=".log")
+ }
+```
+
+为了让 Rsyslog 配置文件的变化生效,你必须重启守护程序来加载新的配置。
+
+```
+sudo service rsyslog restart
+```
+
+```
+sudo systemctl restart rsyslog
+```
+
+在 Debian Linux 系统上去检查它监听哪个套接字,你可以用 root 权限去运行 `netstat` 命令。将输出传递给一个过滤程序,比如 `grep`。
+
+```
+sudo netstat -tulpn | grep rsyslog
+```
+
+请注意: 为了允许建立入站连接,你必须在防火墙上打开 Rsyslog 的端口。
+
+在使用 Firewalld 的基于 RHEL 的发行版上,运行如下的命令:
+
+```
+firewall-cmd --permanent --add-port=514/tcp
+firewall-cmd --permanent --add-port=514/tcp
+firewall-cmd -reload
+```
+
+在使用 UFW 的基于 Debian 的发行版上,运行如下的命令:
+
+```
+ufw allow 514/tcp
+ufw allow 514/udp
+```
+
+Iptables 防火墙规则:
+
+```
+iptables -A INPUT -p tcp -m tcp --dport 514 -j ACCEPT
+iptables -A INPUT -p udp --dport 514 -j ACCEPT
+```
+
+### 配置 Rsyslog 作为一个客户端
+
+启用 Rsyslog 守护程序以客户端模式运行,并将输出的本地日志信息发送到远程 Rsyslog 服务器,编辑 `/etc/rsyslog.conf` 文件并增加下列的行:
+
+```
+*. * @IP_REMOTE_RSYSLOG_SERVER:514
+*. * @FQDN_RSYSLOG_SERVER:514
+```
+
+这个行启用了 Rsyslog 服务,并将输出的所有内部日志发送到一个远处的 UDP 的 514 端口上运行的 Rsyslog 服务器上。
+
+为了使用 TCP 协议去发送日志信息,使用下列的模板:
+
+```
+*. * @@IP_reomte_syslog_server:514
+```
+
+输出所有优先级的、仅与 cron 相关的日志信息到一个 Rsyslog 服务器上,使用如下的模板:
+
+```
+cron.* @ IP_reomte_syslog_server:514
+```
+
+在 `/etc/rsyslog.conf` 文件中添加下列行,可以在 Rsyslog 服务器无法通过网络访问时,临时将客户端的日志信息存储在它的一个磁盘缓冲文件中,当网络或者服务器恢复时,再次进行发送。
+
+```
+$ActionQueueFileName queue
+$ActionQueueMaxDiskSpace 1g
+$ActionQueueSaveOnShutdown on
+$ActionQueueType LinkedList
+$ActionResumeRetryCount -1
+```
+
+为使上述规则生效,需要重新 Rsyslog 守护程序,以激活为客户端模式。
+
+--------------------------------------------------------------------------------
+
+via: https://www.howtoforge.com/tutorial/rsyslog-centralized-log-server-in-debian-9/
+
+作者:[Matt Vas][a]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.howtoforge.com
diff --git a/published/20171027 Scary Linux commands for Halloween.md b/published/20171027 Scary Linux commands for Halloween.md
new file mode 100644
index 0000000000..4f88023a72
--- /dev/null
+++ b/published/20171027 Scary Linux commands for Halloween.md
@@ -0,0 +1,106 @@
+可怕的万圣节 Linux 命令
+======
+
+![](https://images.idgesg.net/images/article/2017/10/animal-skeleton-100739983-large.jpg)
+
+虽然现在不是万圣节,也可以关注一下 Linux 可怕的一面。什么命令可能会显示鬼、巫婆和僵尸的图像?哪个会鼓励“不给糖果就捣蛋”的精神?
+
+### crypt
+
+好吧,我们一直看到 `crypt`。尽管名称不同,crypt 不是一个地窖,也不是垃圾文件的埋葬坑,而是一个加密文件内容的命令。现在,`crypt` 通常用一个脚本实现,通过调用一个名为 `mcrypt` 的二进制文件来模拟以前的 `crypt` 命令来完成它的工作。直接使用 `mycrypt` 命令是更好的选择。
+
+```
+$ mcrypt x
+Enter the passphrase (maximum of 512 characters)
+Please use a combination of upper and lower case letters and numbers.
+Enter passphrase:
+Enter passphrase:
+
+File x was encrypted.
+```
+
+请注意,`mcrypt` 命令会创建第二个扩展名为 `.nc` 的文件。它不会覆盖你正在加密的文件。
+
+`mcrypt` 命令有密钥大小和加密算法的选项。你也可以再选项中指定密钥,但 `mcrypt` 命令不鼓励这样做。
+
+### kill
+
+还有 `kill` 命令 - 当然并不是指谋杀,而是用来强制和非强制地结束进程,这取决于正确终止它们的要求。当然,Linux 并不止于此。相反,它有各种 `kill` 命令来终止进程。我们有 `kill`、`pkill`、`killall`、`killpg`、`rfkill`、`skill`()读作 es-kill)、`tgkill`、`tkill` 和 `xkill`。
+
+```
+$ killall runme
+[1] Terminated ./runme
+[2] Terminated ./runme
+[3]- Terminated ./runme
+[4]+ Terminated ./runme
+```
+
+### shred
+
+Linux 系统也支持一个名为 `shred` 的命令。`shred` 命令会覆盖文件以隐藏其以前的内容,并确保使用硬盘恢复工具无法恢复它们。请记住,`rm` 命令基本上只是删除文件在目录文件中的引用,但不一定会从磁盘上删除内容或覆盖它。`shred` 命令覆盖文件的内容。
+
+```
+$ shred dupes.txt
+$ more dupes.txt
+▒oΛ▒▒9▒lm▒▒▒▒▒o▒1־▒▒f▒f▒▒▒i▒▒h^}&▒▒▒{▒▒
+```
+
+### 僵尸
+
+虽然不是命令,但僵尸在 Linux 系统上是很顽固的存在。僵尸基本上是没有完全清理掉的死亡进程的遗骸。进程_不应该_这样工作 —— 让死亡进程四处游荡,而不是简单地让它们死亡并进入数字天堂,所以僵尸的存在表明了让他们遗留于此的进程有一些缺陷。
+
+一个简单的方法来检查你的系统是否有僵尸进程遗留,看看 `top` 命令的标题行。
+
+```
+$ top
+top - 18:50:38 up 6 days, 6:36, 2 users, load average: 0.00, 0.00, 0.00
+Tasks: 171 total, 1 running, 167 sleeping, 0 stopped, 3 zombie `< ==`
+%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 2003388 total, 250840 free, 545832 used, 1206716 buff/cache
+KiB Swap: 9765884 total, 9765764 free, 120 used. 1156536 avail Mem
+```
+
+可怕!上面显示有三个僵尸进程。
+
+### at midnight
+
+有时会在万圣节这么说,死者的灵魂从日落开始游荡直到午夜。Linux 可以通过 `at midnight` 命令跟踪它们的离开。用于安排在下次到达指定时间时运行的作业,`at` 的作用类似于一次性的 cron。
+
+```
+$ at midnight
+warning: commands will be executed using /bin/sh
+at> echo 'the spirits of the dead have left'
+at>
+job 3 at Thu Oct 31 00:00:00 2017
+```
+
+### 守护进程
+
+Linux 系统也高度依赖守护进程 —— 在后台运行的进程,并提供系统的许多功能。许多守护进程的名称以 “d” 结尾。这个 “d” 代表守护进程,表明这个进程一直运行并支持一些重要功能。有的会用单词 “daemon” 。
+
+```
+$ ps -ef | grep sshd
+root 1142 1 0 Oct19 ? 00:00:00 /usr/sbin/sshd -D
+root 25342 1142 0 18:34 ? 00:00:00 sshd: shs [priv]
+$ ps -ef | grep daemon | grep -v grep
+message+ 790 1 0 Oct19 ? 00:00:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
+root 836 1 0 Oct19 ? 00:00:02 /usr/lib/accountsservice/accounts-daemon
+```
+
+### 万圣节快乐!
+
+在 [Facebook][1] 和 [LinkedIn][2] 上加入 Network World 社区来对主题进行评论。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3235219/linux/scary-linux-commands-for-halloween.html
+
+作者:[Sandra Henry-Stocker][a]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[1]:https://www.facebook.com/NetworkWorld/
+[2]:https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20171109 How to record statistics about a Linux machine-s uptime.md b/published/20171109 How to record statistics about a Linux machine-s uptime.md
similarity index 65%
rename from sources/tech/20171109 How to record statistics about a Linux machine-s uptime.md
rename to published/20171109 How to record statistics about a Linux machine-s uptime.md
index 1a5be11efa..f1684bc9c8 100644
--- a/sources/tech/20171109 How to record statistics about a Linux machine-s uptime.md
+++ b/published/20171109 How to record statistics about a Linux machine-s uptime.md
@@ -1,27 +1,37 @@
-How to record statistics about a Linux machine’s uptime
-======
-Linux/Unix sysadmins have a weird obsession with server uptime. There is a xkcd comic devoted to this subject where a good sysadmin is an unstoppable force that it stands between the forces of darkness and your cat blog's servers.
+如何记录 Linux 的系统运行时间的统计信息
+=====
+
+Linux/Unix 系统管理员对服务器的系统运行时间有一种奇怪的痴迷。这里有一个关于这个主题的 xkcd 漫画,一个好的系统管理员是一股不可阻挡的力量,他伫立在你家猫咪博客的服务器之前,对抗黑暗势力。
+
[![Fig.01: Devotion to Duty https://xkcd.com/705/][1]][1]
-One can tell how long the Linux system has been running using the uptime command or [w command][2] or top command. I can get [a report of the historical and statistical running time of the system][3], keeping it between restarts using tuptime tool.
-Like uptime command but with the more impressive output. Recently I discovered another tool called uptimed that records statistics about a machine's uptime. Let us see how to get uptime record statistics using uptimed and uprecords on Linux operating system.
+我们可以使用 `uptime` 命令或 [w 命令][2] 或 `top` 命令来判断 Linux 系统运行了多久。我可以使用 `tuptime` 工具保留每次重新启动的运行时间,以[获得系统运行时间的历史和统计报告][3]。
+
+这就像 `uptime` 命令一样,但输出结果更令人印象深刻。最近我发现了另一种称为 `uptimed` 的工具,用于记录关于机器的系统运行时间和统计信息。让我们看看如何使用 Linux 操作系统上的 `uptimed` 和 `uprecords` 来获得运行时间的记录统计信息。
+
+查找系统运行时间非常简单,只需在基于 Linux 的系统上键入以下命令即可:
-Finding uptime is pretty easy, just type the following on your Linux based system:
```
-$ **uptime -p**
+$ uptime -p
up 2 weeks, 4 days, 7 hours, 28 minutes
```
-To keep historical stats about uptime use either [tuptime][3] or uptimed tool.
-## uptimed installation
+要保留有关 `uptime` 的历史统计信息,请使用 [tuptime][3] 或 `uptimed` 工具。
-The simplest way to install uptimed locally is through your package managers such as apt/apt-get/yum and friends as per your Linux distro.
+### 安装 uptimed
-### Install uptimed on a Debian/Ubuntu Linux
+安装 `uptimed` 的最简单的方式是通过你的软件包管理器,比如 apt/apt-get/yum 这些你的 Linux 发行版的朋友。
+
+#### 在 Debian/Ubuntu Linux 上安装 uptimed
+
+键入以下 [apt 命令][4]/[apt-get 命令][5]:
+
+```
+$ sudo apt-get install uptimed
+```
+
+示例输出:
-Type the following [apt command][4]/[apt-get command][5]:
-`$ sudo apt-get install uptimed`
-Sample outputs:
```
Reading package lists... Done
Building dependency tree
@@ -55,13 +65,22 @@ Processing triggers for systemd (229-4ubuntu21) ...
Processing triggers for ureadahead (0.100.0-19) ...
```
-### Install uptimed on a CentOS/RHEL/Fedora/Oracle/Scientific Linux
+#### 在 CentOS/RHEL/Fedora/Oracle/Scientific Linux 上安装 uptimed
+
+首先 [在 CentOS/RHEL 使用 EPEL 仓库][6]:
+
+```
+$ sudo yum -y install epel-release
+```
+
+然后,键入以下 [yum 命令][7]:
+
+```
+$ sudo yum install uptimed
+```
+
+示例输出:
-First [enable EPEL repo on a CentOS/RHEL][6]:
-`$ sudo yum -y install epel-release`
-Next, type the following [yum command][7]:
-`$ sudo yum install uptimed`
-Sample outputs:
```
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
@@ -104,35 +123,53 @@ Installed:
Complete!
```
-If you are using **a Fedora Linux** , run the following dnf command:
-`$ sudo dnf install uptimed`
+如果你正在使用 Fedora Linux,运行以下 `dnf` 命令:
-### Install uptimed on an Arch Linux
+```
+$ sudo dnf install uptimed
+```
-Type the following pacman command:
-`$ sudo pacman -S uptimed`
+#### 在 Arch Linux 上安装 uptimed
-### Install uptimed on a Gentoo Linux
+键入以下 `pacman` 命令:
-Type the following emerge command:
-`$ sudo emerge --ask uptimed`
+```
+$ sudo pacman -S uptimed
+```
-## How to configure uptimed
+#### 在 Gentoo Linux 上安装 uptimed
+
+键入以下 `emerge` 命令:
+
+```
+$ sudo emerge --ask uptimed
+```
+
+### 如何配置 uptimed
+
+使用文本编辑器编辑 `/etc/uptimed.conf` 文件,例如 `vim` 命令:
+
+```
+$ sudo vim /etc/uptimed.conf
+```
+
+最少设置一个 email 地址来发送记录。假定有个兼容 sendmail 的 MTA 安装在 `/usr/lib/sendmail`。
-Edit the file /etc/uptimed.conf using a text editor such as vim command:
-`$ sudo vim /etc/uptimed.conf`
-At least set an email address to mail milestones/records to. Assumes sendmail compatible MTA installed as /usr/lib/sendmail.
```
EMAIL=vivek@server1.cyberciti.biz
```
-Save and close the file.
-### How do I enable uptimed service at boot time?
+保存并关闭文件。
-Enable uptimed service using the systemctl command:
-`$ sudo systemctl enable uptimed`
+### 如何在系统启动时启动 uptimed 服务?
-### How do I start/stop/restart or view status of uptimed service?
+使用 `systemctl` 命令启动 `uptimed` 服务:
+
+```
+$ sudo systemctl enable uptimed
+```
+
+### 我该如何 启动/停止/重启 或者查看 uptimed 服务的状态?
```
$ sudo systemctl start uptimed ## start it ##
@@ -140,7 +177,9 @@ $ sudo systemctl stop uptimed ## stop it ##
$ sudo systemctl restart uptimed ## restart it ##
$ sudo systemctl status uptimed ## view status ##
```
-Sample outputs:
+
+示例输出:
+
```
● uptimed.service - uptime record daemon
Loaded: loaded (/lib/systemd/system/uptimed.service; enabled; vendor preset: enabled)
@@ -152,19 +191,26 @@ Sample outputs:
Nov 09 17:49:14 gfs04 systemd[1]: Started uptime record daemon.
```
-## How to see uptime record
+### 如何查看 uptime 记录
+
+只需键入以下命令即可查看 `uptimed(8)` 程序的统计信息:
-Simply type the following command to see statistics from the uptimed(8) program:
```
$ uprecords
```
-Sample outputs:
+
+示例输出:
+
[![Fig.02: uprecords in action][9]][9]
-uprecords has a few more option:
+
+`uprecords` 有一些选项:
+
```
$ uprecords -?
```
-Sample outputs:
+
+示例输出:
+
```
usage: uprecords [OPTION]...
@@ -185,19 +231,19 @@ usage: uprecords [OPTION]...
-v version information
```
-## Conclusion
+### 结论
+
+这是一个极好的小工具,可以显示服务器正常运行时间的记录,以证明机器正常运行时间和你的业务连续性。在相关说明中,你可以看到官方的 [XKCD 系统管理员 T恤][10] 因为漫画被制作成衬衫,其中包括背面的新插图。
-This is an excellent little tool to show your server uptime records to prove your uptime and business continuity. On a related note, you should get the official [XKCD sysadmin t-shirt][10] as comic was made into a shirt, which includes a new illustration on the back.
[![Fig.03: Sysadmin XKCD shirt features the original comic on the front and a new illustration on the back.][11]][11]
-
--------------------------------------------------------------------------------
via: https://www.cyberciti.biz/hardware/see-records-statistics-about-a-linux-servers-uptime/
-作者:[][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+作者:[Vivek Gite][a]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20171113 My Adventure Migrating Back To Windows.md b/published/20171113 My Adventure Migrating Back To Windows.md
new file mode 100644
index 0000000000..4d2017bf8d
--- /dev/null
+++ b/published/20171113 My Adventure Migrating Back To Windows.md
@@ -0,0 +1,121 @@
+我的冒险旅程之迁移回 Windows
+======
+
+我已经主要使用 Linux 大约 10 年了,而且主要是 Ubuntu。但在最新发布的版本中,我决定重新回到我通常不喜欢的操作系统: Windows 10。
+
+![Ubuntu On Windows][1]
+
+我一直是 Linux 的粉丝,我最喜欢的两个发行版是 Debian 和 Ubuntu。现今作为一个服务器操作系统,Linux 是完美无暇的,但在桌面上一直存在不同程度的问题。
+
+最近一系列的问题让我意识到,我不需要使用 Linux 作为我的桌面操作系统,我仍然是一个 Linux 粉丝,但基于我安装 Ubuntu 17.10 的经验,我已经决定回到 Windows。
+
+### 什么使我选择了回归
+
+问题是,当 Ubuntu 17.10 出来后,我像往常一样进行全新安装,但遇到了一些非常奇怪的新问题。
+
+* Dell D3100 Dock 不再工作(包括临时规避方案也没用)
+* Ubuntu 意外死机(随机)
+* 双击桌面上的图标没反应
+* 使用 HUD 搜索诸如“tweaks”之类的程序会尝试安装 META 桌面版本
+* GUI 比标准的 GNOME 感觉更糟糕
+
+现在我确实考虑回到使用 Ubuntu 16.04 或另一个发行版,但是我觉得 Unity 7 是最精致的桌面环境,而另外唯一一个优雅且稳定的是 Windows 10。
+
+除此之外,使用 Linux 而不是使用 Windows 也有一些固有的问题,如:
+
+* 大多数商用软件不可用,E.G Maya、 PhotoShop、 Microsoft Office(大多数情况下,替代品并不相同)等等。
+* 大多数游戏都没有移植到 Linux 上,包括来自 EA、 Rockstar Ect. 等主要工作室的游戏。
+* 对于大多数硬件来说,其 Linux 驱动程序是厂商的次要考虑。
+
+在决定使用 Windows 之前,我确实考虑过其他发行版和操作系统。
+
+与此同时,我看到了更多的“微软爱 Linux ”的行动,并且了解了 WSL。他们的新开发者的关注角度对我来说很有意思,于是我试了一下。
+
+### 我在 Windows 找到了什么
+
+我使用计算机主要是为了编程,我也使用虚拟机、git 和 ssh,并且大部分工作依赖于 bash。我偶尔也会玩游戏,观看 netflix 和一些轻松的办公室工作。
+
+总之,我期待在 Ubuntu 中保留当前的工作流程并将其移植到 Windows 上。我也想利用 Windows 的优点。
+
+* 所有的 PC 游戏支持 Windows
+* 大多数程序是原生的
+* 微软办公软件
+
+虽然使用 Windows 有很多坑,但是我打算正确对待它,所以我不担心一般的 Windows 故障,例如病毒和恶意软件。
+
+### Windows 的子系统 Linux(Windows 上的 Ubuntu 中的 Bash)
+
+微软与 Canonical 的密切合作将 Ubuntu 带到了 Windows 上。在经过快速设置和启动程序之后,你将拥有非常熟悉的 bash 界面。
+
+我一直在研究其局限性,但是在写这篇文章时我碰到的唯一真正的限制是它从硬件中抽象了出来。例如,`lsblk` 不会显示你有什么分区,因为子系统里的 Ubuntu 没有提供这些信息。
+
+但是除了访问底层工具之外,我发现其体验非常熟悉,也很棒。
+
+我在下面的工作流程中使用了它。
+
+* 生成 SSH 密钥对
+* 使用 Git 和 Github 来管理我的仓库
+* SSH 到几个服务器,包括不用密码
+* 为本地数据库运行 MySQL
+* 监视系统资源
+* 使用 Vim 编辑配置文件
+* 运行 Bash 脚本
+* 运行本地 Web 服务器
+* 运行 PHP、NodeJS
+
+到目前为止,它已经被证明是非常强大的工具。除了是在 Windows 10 用户界面之中,我的工作流程感觉和我在 Ubuntu 上几乎一样。尽管我的多数工作可以在 WSL 中处理,但我仍然打算通过虚拟机进行更深入的工作,这可能超出了 WSL 的范围。
+
+### 不需要用 Wine
+
+我遇到的另一个主要问题是兼容性问题。我很少使用 Wine 来使用 Windows 软件。(LCTT 译注:Wine 是可以使 Linux 上运行 Windows 应用的软件)但是有时它是必需的,尽管通常体验不是很好。
+
+#### HeidiSQL
+
+我首先安装的程序之一是 HeidiSQL,它是我最喜欢的数据库客户端之一。它可以在 Wine 下工作,但是感觉很不好,所以我在 Linux 下丢掉它而使用了 MySQL Workbench。回到了 Windows 中,就像一个可靠的老朋友回来了。
+
+#### 游戏平台 / Steam
+
+没有游戏的 Windows 电脑是无法想象的。我从 Steam 的网站上安装了它,我的 Linux 游戏,加上我的 Windows 游戏就变大了 5 倍,并且包括 GTA V (LCTT 译注: GTA V 是一款名叫侠盗飞车的游戏) 等 AAA 级游戏。而这些我在 Ubuntu 中只能梦想。
+
+我对 SteamOS 有很大的期望,并且一直会持续如此。但是我认为在可预见的将来,它不会在任何地方的游戏市场中崭露头角。所以如果你想在 PC 上玩游戏,你确实需要 Windows。
+
+还有一点需要注意的是, 你的 nvidia 显卡的驱动程序会得到很好的支持,这使得像 TF2 (LCTT 译注: 这是一款名叫军团要塞 2 的游戏)这样的一些 Linux 原生游戏运行的稍好一些。
+
+**Windows 在游戏方面总是优越的,所以这并不令人感到意外。**
+
+### 从 USB 硬盘运行,为什么
+
+我在我的主固态硬盘上运行 Linux,但在过去,我是从 usb 棒和 usb 硬盘运行它的。我习惯了 Linux 的这种持久性,这让我可以在不丢失主要操作系统的情况下长期尝试多个版本。现在我尝试将 Windows 安装到 USB 连接的硬盘上时,它无法工作也不可能工作。所以当我将 Windows 硬盘分区的克隆作为备份时,我很惊讶我可以通过 USB 启动它。
+
+这对我来说已经成为一个方便的选择,因为我打算将我的工作笔记本电脑迁移回 Windows,但如果不想冒险,那就把它扔在那里吧。
+
+所以我在过去的几天里,我使用 USB 来运行它,除了一些错误的消息外,我没有通过 USB 运行发现它真正的缺点。
+
+这样做主要的问题是:
+
+* 较慢的启动速度
+* 恼人的信息:不要拔掉你的 USB
+* 无法激活它
+
+**我可能会写一篇关于 USB 驱动器上的 Windows 的文章,这样我们可以有更详细的了解。**
+
+### 那么结论是什么?
+
+我使用 Windows 10 大约两周了,并没有注意到它对我的工作流程有任何的负面影响。尽管过程会有一些小问题,但我需要的所以工具都在手边,并且操作系统一般都在运行。
+
+### 我会留在 Windows吗?
+
+虽然现在还为时尚早,但我想在可见的未来我会坚持使用 Windows。
+
+--------------------------------------------------------------------------------
+
+via: [https://www.chris-shaw.com/blog/my-adventure-migrating-back-to-windows](https://www.chris-shaw.com/blog/my-adventure-migrating-back-to-windows)
+
+作者:[Christopher Shaw][a]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.chris-shaw.com
+[1]:https://winaero.com/blog/wp-content/uploads/2016/07/Ubutntu-on-Windows-10-logo-banner.jpg
diff --git a/published/20171113 The big break in computer languages.md b/published/20171113 The big break in computer languages.md
new file mode 100644
index 0000000000..720100a600
--- /dev/null
+++ b/published/20171113 The big break in computer languages.md
@@ -0,0 +1,90 @@
+计算机语言的巨变
+====================================================
+
+我的上一篇博文《[与 C 语言长别离][3]》引来了我的老朋友,一位 C++ 专家的评论。在评论里,他推荐把 C++ 作为 C 的替代品。这是不可能发生的,如果 C++ 代替 C 是趋势的话,那么 Go 和 Rust 也就不会出现了。
+
+![](https://static1.squarespace.com/static/586bd48d03596e5605450cee/t/5880d61b29687f4fd5a5712d/1484838431523/)
+
+但是我不能只给我的读者一个光秃秃的看法(LCTT 译注:此处是双关语)。所以,在这篇文章中,我来讲述一下为什么我不再碰 C++ 的故事。这是关于计算机语言设计经济学专题文章的起始点。这篇文章会讨论为什么一些真心不好的决策会被做出来,然后进入语言的基础设计之中,以及我们该如何修正这些问题。
+
+在这篇文章中,我会一点一点的指出人们(当然也包括我)自从 20 世纪 80 年代以来就存在的关于未来的编程语言的预见失误。直到最近,我们才找到了证明我们错了的证据。
+
+我记得我第一次学习 C++ 是因为我需要使用 GNU eqn 输出 MathXML,而 eqn 是使用 C++ 写的。那个项目不错。在那之后,21 世纪初,我在韦诺之战那边当了多年的资深开发人生,并且与 C++ 相处甚欢。
+
+在那之后啊,有一天我们发现一个不小心被我们授予提交权限的人已经把游戏的 AI 核心搞崩掉了。显然,在团队中只有我是不那么害怕查看代码的。最终,我把一切都恢复正常了 —— 我折腾了整整两周。再那之后,我就发誓我再也不靠近 C++ 了。
+
+在那次经历过后,我发现这个语言的问题就是它在尝试使得本来就复杂的东西更加复杂,来粗陋补上因为基础概念的缺失造成的漏洞。对于裸指针这样东西,它说“别这样做”,这没有问题。对于小规模的个人项目(比如我的魔改版 eqn),遵守这些规定没有问题。
+
+但是对于大型项目,或者开发者水平参差不齐的多人项目(这是我经常要处理的情况)就不能这样。随着时间的推移以及代码行数的增加,有的人就会捅篓子。当别人指出有 BUG 时,因为诸如 STL 之类的东西给你增加了一层复杂度,你处理这种问题所需要的精力就比处理同等规模的 C 语言的问题就要难上很多。我在韦诺之战时,我就知道了,处理这种问题真的相当棘手。
+
+我给 Stell Heller(我的老朋友,C++ 的支持者)写代码时不会发生的问题在我与非 Heller 们合作时就被放大了,我和他们合作的结局可能就是我得给他们擦屁股。所以我就不用 C++ ,我觉得不值得为了其花时间。 C 是有缺陷的,但是 C 有 C++ 没有的优点 —— 如果你能在脑内模拟出硬件,那么你就能很简单的看出程序是怎么运行的。如果 C++ 真的能解决 C 的问题(也就是说,C++ 是类型安全以及内存安全的),那么失去其透明性也是值得的。但是,C++ 并没有这样。
+
+我们判断 C++ 做的还不够的方法之一是想象一个 C++ 已经搞得不错的世界。在那个世界里,老旧的 C 语言项目会被迁移到 C++ 上来。主流的操作系统内核会是 C++ 写就,而现存的内核实现,比如 Linux 会渐渐升级成那样。在现实世界,这些都没有发生。C++ 不仅没有打消语言设计者设想像 D、Go 以及 Rust 那样的新语言的想法,它甚至都没有取代它的前辈。不改变 C++ 的核心思想,它就没有未来,也因此,C++ 的抽象泄露也不会消失。
+
+既然我刚刚提到了 D 语言,那我就说说为什么我不把 D 视为一个够格的 C 语言竞争者的原因吧。尽管它比 Rust 早出现了八年(和 Rust 相比是九年)Walter Bright 早在那时就有了构建那样一个语言的想法。但是在 2001 年,以 Python 和 Perl 为首的语言的出现已经确定了,专有语言能和开源语言抗衡的时代已经过去。官方 D 语言库/运行时和 Tangle 的无谓纷争也打击了其发展。它从未修正这些错误。
+
+然后就是 Go 语言(我本来想说“以及 Rust”。但是如前文所述,我认为 Rust 还需要几年时间才能有竞争力)。它_的确是_类型安全以及内存安全的(好吧,是在大多数时候是这样,但是如果你要使用接口的话就不是如此了,但是自找麻烦可不是正常人的做法)。我的一位好友,Mark Atwood,曾指出过 Go 语言是脾气暴躁的老头子因为愤怒而创造出的语言,主要是 _C 语言的作者之一_(Ken Thompson) 因为 C++ 的混乱臃肿造成的愤怒,我深以为然。
+
+我能理解 Ken 恼火的原因。这几十年来我就一直认为 C++ 搞错了需要解决的问题。C 语言的后继者有两条路可走。其一就是 C++ 那样,接受 C 的抽象泄漏、裸指针等等,以保证兼容性。然后以此为基础,构建一个最先进的语言。还有一条道路,就是从根源上解决问题 —— _修正_ C语言的抽象泄露。这一来就会破环其兼容性,但是也会杜绝 C/C++ 现有的问题。
+
+对于第二条道路,第一次严谨的尝试就是 1995 年出现的 Java。Java 搞得不错,但是在语言解释器上构建这门语言使其不适合系统编程。这就在系统编程那留下一个巨大的洞,在 Go 以及 Rust 出现之前的 15 年里,都没有语言来填补这个空白。这也就是我的 GPSD 和 NTPsec 等软件在 2017 年仍然主要用 C 写成的原因,尽管 C 的问题也很多。
+
+在许多方面这都是很糟糕的情况。尽管由于缺少足够多样化的选择,我们很难认识到 C/C++ 做的不够好的地方。我们都认为在软件里面出现缺陷以及基于安全方面考虑的妥协是理所当然的,而不是想想这其中多少是真的由于语言的设计问题导致的,就像缓存区溢出漏洞一样。
+
+所以,为什么我们花了这么长时间才开始解决这个问题?从 C 1972 年面世到 Go 2009 年出现,这其中隔了 37 年;Rust 也是在其仅仅一年之前出现。我想根本原因还是经济。
+
+从最早的计算机语言开始,人们就已经知道,每种语言的设计都体现了程序员时间与机器资源的相对价值的权衡。在机器这端,就是汇编语言,以及之后的 C 语言,这些语言以牺牲开发人员的时间为代价来提高性能。 另一方面,像 Lisp 和(之后的)Python 这样的语言则试图自动处理尽可能多的细节,但这是以牺牲机器性能为代价的。
+
+广义地说,这两端的语言的最重要的区别就是有没有自动内存管理。这与经验一致,内存管理缺陷是以机器为中心的语言中最常见的一类缺陷,程序员需要手动管理资源。
+
+当相对价值断言与软件开发在某个特定领域的实际成本动因相匹配时,这个语言就是在经济上可行的。语言设计者通过设计一个适合处理现在或者不远的将来出现的情况的语言,而不是使用现有的语言来解决他们遇到的问题。
+
+随着时间的推移,时兴的编程语言已经渐渐从需要手动管理内存的语言变为带有自动内存管理以及垃圾回收(GC)机制的语言。这种变化对应了摩尔定律导致的计算机硬件成本的降低,使得程序员的时间与之前相比更加的宝贵。但是,除了程序员的时间以及机器效率的变化之外,至少还有两个维度与这种变化相关。
+
+其一就是距离底层硬件的距离。底层软件(内核与服务代码)的低效率会被成倍地扩大。因此我们可以发现,以机器为中心的语言向底层推进,而以程序员为中心的语言向着高级发展。因为大多数情况下面向用户的语言仅仅需要以人类的反应速度(0.1 秒)做出回应即可。
+
+另一个维度就是项目的规模。由于程序员抽象发生的问题的漏洞以及自身的疏忽,任何语言都会有可预期的每千行代码的出错率。这个比率在以机器为中心的语言上很高,而在程序员为中心的带有 GC 的语言里就大大降低。随着项目规模的增大,带有 GC 的语言作为一个防止出错率不堪入目的策略就显得愈发重要起来。
+
+当我们使用这三种维度来看当今的编程语言的形势 —— C 语言在底层,蓬勃发展的带有 GC 的语言在上层,我们会发现这基本上很合理。但是还有一些看似不合理的是 —— C 语言的应用不合理地广泛。
+
+我为什么这么说?想想那些经典的 Unix 命令行工具吧。那些小程序通常都可以使用带有完整的 POSIX 支持的脚本语言快速实现出来。重新编码那些程序将使得它们调试、维护和拓展起来都会更加简单。
+
+但是为什么还是使用 C (或者某些像 eqn 的项目,使用 C++)?因为有转换成本。就算是把相当小、相当简单的程序使用新的语言重写并且确认你已经忠实地保留了所有非错误行为都是相当困难的。笼统地说,在任何一个领域的应用编程或者系统编程在一种语言的权衡过时之后,仍然坚持使用它。
+
+这就是我和其他预测者犯的大错。 我们认为,降低机器资源成本(增加程序员时间的相对成本)本身就足以取代 C 语言(以及没有 GC 的语言)。 在这个过程中,我们有一部分或者甚至一大部分都是错误的 —— 自 20 世纪 90 年代初以来,脚本语言、Java 以及像 Node.js 这样的东西的兴起显然都是这样兴起的。
+
+但是,竞争系统编程语言的新浪潮并非如此。 Rust 和 Go 都明确地回应了_增加项目规模_ 这一需求。 脚本语言是先是作为编写小程序的有效途径,并逐渐扩大规模,而 Rust 和 Go 从一开始就定位为减少_大型项目_中的缺陷率。 比如 Google 的搜索服务和 Facebook 的实时聊天复用。
+
+我认为这就是对 “为什么不再早点儿” 这个问题的回答。Rust 和 Go 实际上并不算晚,它们相对迅速地回应了一个直到最近才被发现低估的成本动因问题。
+
+好,说了这么多理论上的问题。按照这些理论我们能预言什么?它告诉我们在 C 之后会出现什么?
+
+推动 GC 语言发展的趋势还没有扭转,也不要期待其扭转。这是大势所趋。因此:最终我们*将*拥有具有足够低延迟的 GC 技术,可用于内核和底层固件,这些技术将以语言实现方式被提供。 这些才是真正结束 C 长期统治的语言应有的特性。
+
+我们能从 Go 语言开发团队的工作文件中发现端倪,他们正朝着这个方向前进 —— 可参见关于并发 GC 的学术研究 —— 从未停止研究。 如果 Go 语言自己没有选择这么做,其他的语言设计师也会这样。 但我认为他们会这么做 —— 谷歌推动他们的项目的能力是显而易见的(我们从 “Android 的发展”就能看出来)。
+
+在我们拥有那么理想的 GC 之前,我把能替换 C 语言的赌注押在 Go 语言上。因为其 GC 的开销是可以接受的 —— 也就是说不只是应用,甚至是大部分内核外的服务都可以使用。原因很简单: C 的出错率无药可医,转化成本还很高。
+
+上周我尝试将 C 语言项目转化到 Go 语言上,我发现了两件事。其一就是这活很简单, C 的语言和 Go 对应的很好。还有就是写出的代码相当简单。由于 GC 的存在以及把集合视为首要的数据结构,人们会预期代码减少,但是我意识到我写的代码比我最初期望的减少的更多,比例约为 2:1 —— 和 C 转 Python 类似。
+
+抱歉呐,Rust 粉们。你们在内核以及底层固件上有着美好的未来,但是你们在别的 C 领域被 Go 压的很惨。没有 GC ,再加上难以从 C 语言转化过来,还有就是 API 的标准部分还是不够完善。(我的 `select(2)` 又哪去了啊?)。
+
+对你们来说,唯一的安慰就是,C++ 粉比你们更糟糕 —— 如果这算是安慰的话。至少 Rust 还可以在 Go 顾及不到的 C 领域内大展宏图。C++ 可不能。
+
+--------------------------------------------------------------------------------
+
+via: http://esr.ibiblio.org/?p=7724
+
+作者:[Eric Raymond][a]
+译者:[name1e5s](https://github.com/name1e5s)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://esr.ibiblio.org/?author=2
+[1]:http://esr.ibiblio.org/?author=2
+[2]:http://esr.ibiblio.org/?p=7724
+[3]:https://linux.cn/article-9268-1.html
+[4]:http://esr.ibiblio.org/?cat=13
+[5]:http://esr.ibiblio.org/?author=2
+[6]:http://esr.ibiblio.org/?p=7724
diff --git a/published/20171123 Why microservices are a security issue.md b/published/20171123 Why microservices are a security issue.md
new file mode 100644
index 0000000000..816baaba85
--- /dev/null
+++ b/published/20171123 Why microservices are a security issue.md
@@ -0,0 +1,93 @@
+为什么微服务是一个安全问题
+============================================================
+
+> 你可能并不想把所有的遗留应用全部分解为微服务,或许你可以考虑从安全功能开始。
+
+![Why microservices are a security issue](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_security_cc.png?itok=3V07Lpko)
+
+Image by : Opensource.com
+
+我为了给这篇文章起个标题,使出 “洪荒之力”,也很担心这会变成标题党。如果你点击它,是因为它激起了你的好奇,那么我表示抱歉 ^[注1][5] 。我当然是希望你留下来阅读的 ^[注2][6] :我有很多有趣的观点以及很多 ^[注3][7] 脚注。我不是故意提出微服务会导致安全问题——尽管如同很多组件一样都有安全问题。当然,这些微服务是那些安全方面的人员的趣向所在。进一步地说,我认为对于那些担心安全的人来说,它们是优秀的架构。
+
+为什么这样说?这是个好问题,对于我们这些有[系统安全][16] 经验的人来说,此时这个世界才是一个有趣的地方。我们看到随着带宽便宜了并且延迟降低了,分布式系统在增长。加上部署到云愈加便利,越来越多的架构师们开始意识到应用是可以分解的,不只是分成多个层,并且层内还能分为多个组件。当然,均衡负载可以用于让一个层内的各个组件协同工作,但是将不同的服务输出为各种小组件的能力导致了微服务在设计、实施和部署方面的增长。
+
+所以,[到底什么是微服务呢][23]?我同意[维基百科的定义][24],尽管没有提及安全性方面的内容^[注4][17] 。 我喜欢微服务的一点是,经过精心设计,其符合 Peter H. Salus 描述的 [UNIX 哲学][25] 的前俩点:
+
+1. 程序应该只做一件事,并尽可能把它做好。
+2. 让程序能够互相协同工作。
+3. 应该让程序处理文本数据流,因为这是一个通用的接口。
+
+三者中最后一个有点不太相关,因为 UNIX 哲学通常被用来指代独立应用,它常有一个实例化的命令。但是,它确实包含了微服务的基本要求之一:必须具有“定义明确”的接口。
+
+这里的“定义明确”,我指的不仅仅是可外部访问的 API 的方法描述,也指正常的微服务输入输出操作——以及,如果有的话,还有其副作用。就像我之前的文章描述的,“[良好的系统架构的五个特征][18]”,如果你能够去设计一个系统,数据和主体描述是至关重要的。在此,在我们的微服务描述上,我们要去看看为什么这些是如此重要。因为对我来说,微服务架构的关键定义是可分解性。如果你要分解 ^[注5][8] 你的架构,你必须非常、非常地清楚每个细节(“组件”)要做什么。
+
+在这里,就要开始考虑安全了。特定组件的准确描述可以让你:
+
+* 审查您的设计
+* 确保您的实现符合描述
+* 提出可重用测试单元来审查功能
+* 跟踪实施中的错误并纠正错误
+* 测试意料之外的产出
+* 监视不当行为
+* 审核未来可能的实际行为
+
+现在,这些微服务能用在一个大型架构里了吗?是的。但如果实体是在更复杂的配置中彼此链接或组合在一起,它们会随之越来越难。当你让一小部分可以彼此配合工作时,确保正确的实施和行为是非常、非常容易的。并且如果你不能确定单个组件正在做它们应该作的,那么确保其衍生出来的复杂系统的正确行为及不正确行为就困难的多了。
+
+而且还不止于此。如我已经在许多[以往场合][19]提过的,写足够安全的代码是困难的^[注7][9] ,证实它应该做的更加困难。因此,有理由限制有特定安全要求的代码——密码检测、加密、加密密钥管理、授权等等——将它们变成小而定义明确的代码块。然后你就可以执行我上面提及所有工作,以确保正确完成。
+
+还有,我们都知道并不是每个人都擅长于编写与安全相关的代码。通过分解你的体系架构,将安全敏感的代码限制到定义明确的组件中,你就可以把你最棒的安全人员放到这方面,并限制了 J.佛系.码奴 ^[注8][10] 绕过或降级一些关键的安全控制措施的危险。
+
+它可以作为学习的机会:它对于设计/实现/测试/监视的兄弟们都是好的,而且给他们说:“听、读、标记、学习,并且引为己用 ^[注9][11] 。这是应该做的。”
+
+是否应该将所有遗留应用程序分解为微服务? 不一定。 但是考虑到其带来的好处,你可以考虑从安全入手。
+
+* * *
+
+- 注1、有一点——有读者总是好的。
+- 注2、这是我写下文章的意义。
+- 注3、可能没那么有趣。
+- 注4、在我写这篇文章时。我或你们中的一个可能会去编辑改变它。
+- 注5、这很有趣,听起来想一个园艺术语。并不是说我很喜欢园艺,但仍然... ^[注6][12]
+- 注6、有意思的是,我最先写的 “如果你要分解你的架构....” 听起来想是一个 IT 主题的谋杀电影标题。
+- 注7、长期读者可能会记得提到的优秀电影 “The Thick of It”
+- 注8、其他的什么人:请随便选择。
+- 注9、不是加密摘要:我不认同原作者的想法。
+
+这篇文章最初出在[爱丽丝、伊娃与鲍伯](https://zh.wikipedia.org/zh-hans/%E6%84%9B%E9%BA%97%E7%B5%B2%E8%88%87%E9%AE%91%E4%BC%AF)——一个安全博客上,并被许可转载。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/11/microservices-are-security-issue
+
+作者:[Mike Bursell][a]
+译者:[erlinux](https://itxdm.me)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/mikecamel
+[1]:https://blog.openshift.com/microservices-how-to-explain-them-to-your-ceo/?intcmp=7016000000127cYAAQ&amp;amp;amp;amp;amp;amp;src=microservices_resource_menu1
+[2]:https://www.openshift.com/promotions/microservices.html?intcmp=7016000000127cYAAQ&amp;amp;amp;amp;amp;amp;src=microservices_resource_menu2
+[3]:https://opensource.com/business/16/11/secured-devops-microservices?src=microservices_resource_menu3
+[4]:https://opensource.com/article/17/11/microservices-are-security-issue?rate=GDH4xOWsgYsVnWbjEIoAcT_92b8gum8XmgR6U0T04oM
+[5]:https://opensource.com/article/17/11/microservices-are-security-issue#1
+[6]:https://opensource.com/article/17/11/microservices-are-security-issue#2
+[7]:https://opensource.com/article/17/11/microservices-are-security-issue#3
+[8]:https://opensource.com/article/17/11/microservices-are-security-issue#5
+[9]:https://opensource.com/article/17/11/microservices-are-security-issue#7
+[10]:https://opensource.com/article/17/11/microservices-are-security-issue#8
+[11]:https://opensource.com/article/17/11/microservices-are-security-issue#9
+[12]:https://opensource.com/article/17/11/microservices-are-security-issue#6
+[13]:https://aliceevebob.com/2017/10/31/why-microservices-are-a-security-issue/
+[14]:https://opensource.com/user/105961/feed
+[15]:https://opensource.com/tags/security
+[16]:https://aliceevebob.com/2017/03/14/systems-security-why-it-matters/
+[17]:https://opensource.com/article/17/11/microservices-are-security-issue#4
+[18]:https://opensource.com/article/17/10/systems-architect
+[19]:https://opensource.com/users/mikecamel
+[20]:https://opensource.com/users/mikecamel
+[21]:https://opensource.com/users/mikecamel
+[22]:https://opensource.com/article/17/11/microservices-are-security-issue#comments
+[23]:https://opensource.com/resources/what-are-microservices
+[24]:https://en.wikipedia.org/wiki/Microservices
+[25]:https://en.wikipedia.org/wiki/Unix_philosophy
diff --git a/published/20171205 7 rules for avoiding documentation pitfalls.md b/published/20171205 7 rules for avoiding documentation pitfalls.md
new file mode 100644
index 0000000000..76cc9b6eaf
--- /dev/null
+++ b/published/20171205 7 rules for avoiding documentation pitfalls.md
@@ -0,0 +1,72 @@
+防止文档陷阱的 7 条准则
+======
+> 让我们了解一下如何使国外读者更容易理解你的技术文章。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys-4-series.png?itok=ccZISDxR)
+
+英语是开源社区的通用语言。为了减少翻译成本,很多团队都改成用英语来写他们的文档。 但奇怪的是,为国际读者写英语并不一定就意味着以英语为母语的人就占据更多的优势。 相反, 他们往往忘记了该文档用的语言可能并不是读者的母语。
+
+我们以下面这个简单的句子为例: “Encrypt the password using the `foo bar` command。”语法上来说,这个句子是正确的。 鉴于动名词的 “-ing” 形式在英语中很常见,大多数的母语人士都认为这是一种优雅的表达方式, 他们通常会很自然的写出这样的句子。 但是仔细观察, 这个句子存在歧义因为 “using” 可能指的宾语(“the password”)也可能指的动词(“encrypt”)。 因此这个句子有两种解读方式:
+
+ * “加密使用了 `foo bar` 命令的密码。”
+ * “使用命令 `foo bar` 来加密密码。”
+
+如果你有相关的先验知识(密码加密或者 `foo bar` 命令),你可以消除这种不确定性并且明白第二种方式才是真正的意思。 但是若你没有足够深入的知识怎么办呢? 如果你并不是这方面的专家,而只是一个拥有泛泛相关知识的翻译者而已怎么办呢? 再或者,如果你只是个非母语人士且对像动名词这种高级语法不熟悉怎么办呢?
+
+即使是英语为母语的人也需要经过训练才能写出清晰直接的技术文档。训练的第一步就是提高对文本可用性以及潜在问题的警觉性, 下面让我们来看一下可以帮助避免常见陷阱的 7 条规则。
+
+### 1、了解你的目标读者并代入其中。
+
+如果你是一名开发者,而写作的对象是最终用户, 那么你需要站在他们的角度来看这个产品。 文档的结构是否反映了用户的目标? [人格面具 技术][1] 能帮你专注于目标受众并为你的读者提供合适层次的细节。
+
+### 2、遵循 KISS 原则——保持文档简短而简单
+
+这个原则适用于多个层次,从语法,句子到单词。 比如:
+
+ * 使用合适的最简单时态。比如, 当提到一个动作的结果时使用现在时:
+ * " ~~Click 'OK.' The 'Printer Options' dialog will appear.~~ " -> "Click 'OK.' The 'Printer Options' dialog appears."
+ * 按经验来说,一个句子表达一个主题;然而, 短句子并不一定就容易理解(尤其当这些句子都是由名词组成时)。 有时, 将句子裁剪过度可能会引起歧义,而反过来太多单词则又难以理解。
+ * 不常用的以及很长的单词会降低阅读速度,而且可能成为非母语人士的障碍。 使用更简单的替代词语:
+ * " ~~utilize~~ " -> "use"
+ * " ~~indicate~~ " -> "show","tell" 或 "say"
+ * " ~~prerequisite~~ " -> "requirement"
+
+### 3、不要干扰阅读流
+
+将虚词和较长的插入语移到句子的首部或者尾部:
+
+ * " ~~They are not, however, marked as installed.~~ " -> "However, they are not marked as installed."
+
+将长命令放在句子的末尾可以让自动/半自动的翻译拥有更好的断句。
+
+### 4、区别对待两种基本的信息类型
+
+描述型信息以及任务导向型信息有必要区分开来。描述型信息的一个典型例子就是命令行参考, 而 HOWTO 则是属于基于任务的信息;(LCTT 译注:HOWTO 文档是 Linux 文档中的一种)然而, 技术写作中都会涉及这两种类型的信息。 仔细观察, 就会发现许多文本都同时包含了两种类型的信息。 然而如果能够清晰地划分这两种类型的信息那必是极好的。 为了更好地区分它们,可以对它们进行分别标记。 标题应该能够反映章节的内容以及信息的类型。 对描述性章节使用基于名词的标题(比如“Types of Frobnicators”),而对基于任务的章节使用口头表达式的标题(例如“Installing Frobnicators”)。 这可以让读者快速定位感兴趣的章节而跳过对他无用的章节。
+
+### 5、考虑不同的阅读场景和阅读模式
+
+有些读者在阅读产品文档时会由于自己搞不定而感到十分的沮丧。他们在一个嘈杂的环境中工作,也很难专注于阅读。 同时,不要期望你的读者会一页一页的进行阅读,很多人都是快速浏览文本,搜索关键字或者通过表格、索引以及全文搜索的方式来查找主题。 请牢记这一点, 从不同的角度来看待你的文字。 通常需要折中才能找到一种适合多种情况的文本结构。
+
+### 6、将复杂的信息分成小块
+
+这会让读者更容易记住和吸收信息。例如, 过程不应该超过 7 到 10 个步骤(根据认知心理学中的 [米勒法则][2])。 如果需要更多的步骤, 那么就将任务分拆成不同的过程。
+
+### 7、形式遵循功能
+
+根据以下问题检查你的文字:某句话/段落/章节的 _目的_(功能)是什么?比如,它是一个指令呢?还是一个结果呢?还是一个警告呢?如果是指令, 使用主动语气: “Configure the system.” 被动语气可能适合于进行描述: “The system is configured automatically.” 将警告放在危险操作的 _前面_ 。 专注于目的还有助于发现冗余的内容,可以清除类似 “basically” 或者 “easily” 这一类的填充词,类似 “~~already~~ existing ” 或“ ~~completely~~ new” 这一类的不必要的修饰, 以及任何与你的目标大众无关的内容。
+
+你现在可能已经猜到了,写作就是一个不断重写的过程。 好的写作需要付出努力和练习。 即使你只是偶尔写点东西, 你也可以通过关注目标大众并遵循上述规则来显著地改善你的文字。 文字的可读性越好, 理解就越容易, 这一点对不同语言能力的读者来说都是适合的。 尤其是当进行本地化时, 高质量的原始文本至关重要:“垃圾进, 垃圾出”。 如果原始文本就有缺陷, 翻译所需要的时间就会变长, 从而导致更高的成本。 最坏的情况下, 翻译会导致缺陷成倍增加,需要在不同的语言版本中修正这个缺陷。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/12/7-rules
+
+作者:[Tanja Roth][a]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com
+[1]:https://en.wikipedia.org/wiki/Persona_(user_experience)
+[2]:https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two
diff --git a/published/20171205 What DevOps teams really need from a CIO.md b/published/20171205 What DevOps teams really need from a CIO.md
new file mode 100644
index 0000000000..b26a62e485
--- /dev/null
+++ b/published/20171205 What DevOps teams really need from a CIO.md
@@ -0,0 +1,59 @@
+CIO 真正需要 DevOps 团队做什么?
+======
+
+> DevOps 团队需要 IT 领导者关注三件事:沟通、技术债务和信任。
+
+![](https://enterprisersproject.com/sites/default/files/styles/620x350/public/cio_cloud_2.png?itok=wGdeAHVn)
+
+IT 领导者可以从大量的 [DevOps][1] 材料和 [向 DevOps 转变][2] 所要求的文化挑战中学习。但是,你在一个 DevOps 团队面对长期或短期的团结挑战的调整中 —— 一个 CIO 真正需要他们做的是什么呢?
+
+在我与 DevOps 团队成员的谈话中,我听到的其中一些内容让你感到非常的意外。DevOps 专家(无论是内部团队的还是外部团队的)都希望将下列的事情放在你的 CIO 优先关注的级别。
+
+### 1. 沟通
+
+第一个也是最重要的一个,DevOps 专家需要面对面的沟通。一个经验丰富的 DevOps 团队是非常了解当前 DevOps 的趋势,以及成功和失败的经验,并且他们非常乐意去分享这些信息。表达 DevOps 的概念是很困难的,因此,要在这种新的工作关系中保持开放,定期(不用担心,不用每周)讨论有关你的 IT 的当前状态,如何评价你的沟通环境,以及你的整体的 IT 产业。
+
+相反,你应该准备好与 DevOps 团队去共享当前的业务需求和目标。业务不再是独立于 IT 的东西:它们现在是驱动 IT 发展的重要因素,并且 IT 决定了你的业务需求和目标运行的效果如何。
+
+注重参与而不是领导。在需要做决策的时候,你仍然是最终的决策者,但是,理解这些决策的最好方式是协作,这样,你的 DevOps 团队将有更多的自主权,并因此受到更多激励。
+
+### 2. 降低技术债务
+
+第二,力争更好地理解技术债务,并在 DevOps 中努力降低它。你的 DevOps 团队都工作于一线。这里,“技术债务”是指在一个庞大的、不可持续发展的环境之中,通过维护和增加新功能而占用的人力资源和基础设备资源(查看 Rube Goldberg)。
+
+CIO 常见的问题包括:
+
+ * 为什么我们要用一种新方法去做这件事情?
+ * 为什么我们要在它上面花费时间和金钱?
+ * 如果这里没有新功能,只是现有组件实现了自动化,那么我们的收益是什么?
+
+“如果没有坏,就不要去修理它”,这样的事情是可以理解的。但是,如果你正在路上好好的开车,而每个人都加速超过你,这时候,你的环境就被破坏了。持续投入宝贵的资源去支撑或扩张拼凑起来的环境。
+
+选择妥协,并且一个接一个的打补丁,以这种方式去处理每个独立的问题,结果将从一开始就变得很糟糕 —— 在一个不能支撑建筑物的地基上,一层摞一层地往上堆。事实上,这种方法就像不断地在电脑中插入坏磁盘一样。迟早有一天,面对出现的问题你将会毫无办法。在外面持续增加的压力下,整个事情将变得一团糟,完全吞噬掉你的资源。
+
+这种情况下,解决方案就是:自动化。使用自动化的结果是良好的可伸缩性 —— 每个维护人员在 IT 环境的维护和增长方面花费更少的努力。如果增加人力资源是实现业务增长的唯一办法,那么,可伸缩性就是白日做梦。
+
+自动化降低了你的人力资源需求,并且对持续进行的 IT 提供了更灵活的需求。很简单,对吗?是的,但是你必须为迟到的满意做好心理准备。为了在提高生产力和效率的基础上获得后端经济效益,需要预先投入时间和精力对架构和结构进行变更。为了你的 DevOps 团队能够成功,接受这些挑战,对 IT 领导者来说是非常重要的。
+
+### 3. 信任
+
+最后,相信你的 DevOps 团队并且一定要理解他们。DevOps 专家也知道这个要求很难,但是他们必须得到你的强大支持和你积极参与的意愿。因为 DevOps 团队持续改进你的 IT 环境,他们自身也在不断地适应这些变化的技术,而这些变化通常正是 “你要去学习的经验”。
+
+倾听,倾听,倾听他们,并且相信他们。DevOps 的改变是非常有价值的,而且也是值的去投入时间和金钱的。它可以提高效率、生产力、和业务响应能力。信任你的 DevOps 团队,并且给予他们更多的自由,实现更高效率的 IT 改进。
+
+新 CIO 的底线是:将你的 DevOps 团队的潜力最大化,离开你的领导 “舒适区”,拥抱一个 “CIOps" 的转变。通过 DevOps 转变,持续地与你的 DevOps 团队共同成长,以帮助你的组织获得长期的 IT 成功。
+
+--------------------------------------------------------------------------------
+
+via: https://enterprisersproject.com/article/2017/12/what-devops-teams-really-need-cio
+
+作者:[John Allessio][a]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://enterprisersproject.com/user/john-allessio
+[1]:https://enterprisersproject.com/tags/devops
+[2]:https://www.redhat.com/en/insights/devops?intcmp=701f2000000tjyaAAA
+[3]:https://enterprisersproject.com/devops?sc_cid=70160000000h0aXAAQ
diff --git a/sources/tech/20171207 How to use KVM cloud images on Ubuntu Linux.md b/published/20171207 How to use KVM cloud images on Ubuntu Linux.md
similarity index 56%
rename from sources/tech/20171207 How to use KVM cloud images on Ubuntu Linux.md
rename to published/20171207 How to use KVM cloud images on Ubuntu Linux.md
index 4420807de7..4358b13428 100644
--- a/sources/tech/20171207 How to use KVM cloud images on Ubuntu Linux.md
+++ b/published/20171207 How to use KVM cloud images on Ubuntu Linux.md
@@ -1,15 +1,16 @@
-How to use KVM cloud images on Ubuntu Linux
-======
+如何在 Ubuntu Linux 上使用 KVM 云镜像
+=====
-Kernel-based Virtual Machine (KVM) is a virtualization module for the Linux kernel that turns it into a hypervisor. You can create an Ubuntu cloud image with KVM from the command line using Ubuntu virtualisation front-end for libvirt and KVM.
+如何下载并使用运行在 Ubuntu Linux 服务器上的 KVM 云镜像?如何在 Ubuntu Linux 16.04 LTS 服务器上无需完整安装即可创建虚拟机?如何在 Ubuntu Linux 上使用 KVM 云镜像?
-How do I download and use a cloud image with kvm running on an Ubuntu Linux server? How do I create create a virtual machine without the need of a complete installation on an Ubuntu Linux 16.04 LTS server?Kernel-based Virtual Machine (KVM) is a virtualization module for the Linux kernel that turns it into a hypervisor. You can create an Ubuntu cloud image with KVM from the command line using Ubuntu virtualisation front-end for libvirt and KVM.
+基于内核的虚拟机(KVM)是 Linux 内核的虚拟化模块,可将其转变为虚拟机管理程序。你可以在命令行使用 Ubuntu 为 libvirt 和 KVM 提供的虚拟化前端通过 KVM 创建 Ubuntu 云镜像。
-This quick tutorial shows to install and use uvtool that provides a unified and integrated VM front-end to Ubuntu cloud image downloads, libvirt, and cloud-init.
+这个快速教程展示了如何安装和使用 uvtool,它为 Ubuntu 云镜像下载,libvirt 和 clout_int 提供了统一的集成虚拟机前端。
-### Step 1 - Install KVM
+### 步骤 1 - 安装 KVM
+
+你必须安装并配置 KVM。使用 [apt 命令][1]/[apt-get 命令][2],如下所示:
-You must have kvm installed and configured. Use the [apt command][1]/[apt-get command][2] as follows:
```
$ sudo apt install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker
$ kvm-ok
@@ -18,15 +19,19 @@ $ sudo vi /etc/network/interfaces
$ sudo systemctl restart networking
$ sudo brctl show
```
-See "[How to install KVM on Ubuntu 16.04 LTS Headless Server][4]" for more info.
-### Step 2 - Install uvtool
+参阅[如何在 Ubuntu 16.04 LTS Headless 服务器上安装 KVM][4] 以获得更多信息。(LCTT 译注:Headless 服务器是指没有本地接口的计算设备,专用于向其他计算机及其用户提供服务。)
+
+### 步骤 2 - 安装 uvtool
+
+键入以下 [apt 命令][1]/[apt-get 命令][2]:
-Type the following [apt command][1]/[apt-get command][2]:
```
$ sudo apt install uvtool
```
-Sample outputs:
+
+示例输出:
+
```
[sudo] password for vivek:
Reading package lists... Done
@@ -96,47 +101,68 @@ Processing triggers for man-db (2.7.6.1-2) ...
Setting up uvtool-libvirt (0~git122-0ubuntu1) ...
```
+### 步骤 3 - 下载 Ubuntu 云镜像
-### Step 3 - Download the Ubuntu Cloud image
+你需要使用 `uvt-simplestreams-libvirt` 命令。它维护一个 libvirt 容量存储池,作为一个简单流源的镜像子集的本地镜像,比如 Ubuntu 云镜像。要使用当前所有 amd64 镜像更新 uvtool 的 libvirt 容量存储池,运行:
+
+```
+$ uvt-simplestreams-libvirt sync arch=amd64
+```
+
+要更新/获取 Ubuntu 16.04 LTS (xenial/amd64) 镜像,运行:
+
+```
+$ uvt-simplestreams-libvirt --verbose sync release=xenial arch=amd64
+```
+
+示例输出:
-You need to use the uvt-simplestreams-libvirt command. It maintains a libvirt volume storage pool as a local mirror of a subset of images available from a simplestreams source, such as Ubuntu cloud images. To update uvtool's libvirt volume storage pool with all current amd64 images, run:
-`$ uvt-simplestreams-libvirt sync arch=amd64`
-To just update/grab Ubuntu 16.04 LTS (xenial/amd64) image run:
-`$ uvt-simplestreams-libvirt --verbose sync release=xenial arch=amd64`
-Sample outputs:
```
Adding: com.ubuntu.cloud:server:16.04:amd64 20171121.1
```
-Pass the query option to queries the local mirror:
-`$ uvt-simplestreams-libvirt query`
-Sample outputs:
+通过 query 选项查询本地镜像:
+
+```
+$ uvt-simplestreams-libvirt query
+```
+
+示例输出:
+
```
release=xenial arch=amd64 label=release (20171121.1)
```
-Now, I have an image for Ubuntu xenial and I create the VM.
+现在,我为 Ubuntu xenial 创建了一个镜像,接下来我会创建虚拟机。
-### Step 4 - Create the SSH keys
+### 步骤 4 - 创建 SSH 密钥
-You need ssh keys for login into KVM VMs. Use the ssh-keygen command to create a new one if you do not have any keys at all.
-`$ ssh-keygen`
-See "[How To Setup SSH Keys on a Linux / Unix System][5]" and "[Linux / UNIX: Generate SSH Keys][6]" for more info.
+你需要使用 SSH 密钥才能登录到 KVM 虚拟机。如果你根本没有任何密钥,请使用 `ssh-keygen` 命令创建一个新的密钥。
-### Step 5 - Create the VM
+```
+$ ssh-keygen
+```
-It is time to create the VM named vm1 i.e. create an Ubuntu Linux 16.04 LTS VM:
-`$ uvt-kvm create vm1`
-By default vm1 created using the following characteristics:
+参阅“[如何在 Linux / Unix 系统上设置 SSH 密钥][5]” 和 “[Linux / UNIX: 生成 SSH 密钥][6]” 以获取更多信息。
- 1. RAM/memory : 512M
- 2. Disk size: 8GiB
- 3. CPU: 1 vCPU core
+### 步骤 5 - 创建 VM
+是时候创建虚拟机了,它叫 vm1,即创建一个 Ubuntu Linux 16.04 LTS 虚拟机:
+```
+$ uvt-kvm create vm1
+```
-To control ram, disk, cpu, and other characteristics use the following syntax:
-`$ uvt-kvm create vm1 \
+默认情况下 vm1 使用以下配置创建:
+
+ 1. 内存:512M
+ 2. 磁盘大小:8GiB
+ 3. CPU:1 vCPU core
+
+要控制内存、磁盘、CPU 和其他配置,使用以下语法:
+
+```
+$ uvt-kvm create vm1 \
--memory MEMORY \
--cpu CPU \
--disk DISK \
@@ -145,80 +171,100 @@ To control ram, disk, cpu, and other characteristics use the following syntax:
--packages PACKAGES1, PACKAGES2, .. \
--run-script-once RUN_SCRIPT_ONCE \
--password PASSWORD
-`
-Where,
+```
- 1. **\--password PASSWORD** : Set the password for the ubuntu user and allow login using the ubuntu user (not recommended use ssh keys).
- 2. **\--run-script-once RUN_SCRIPT_ONCE** : Run RUN_SCRIPT_ONCE script as root on the VM the first time it is booted, but never again. Give full path here. This is useful to run custom task on VM such as setting up security or other stuff.
- 3. **\--packages PACKAGES1, PACKAGES2, ..** : Install the comma-separated packages on first boot.
+其中
+ 1. `--password PASSWORD`:设置 ubuntu 用户的密码和允许使用 ubuntu 的用户登录(不推荐,使用 ssh 密钥)。
+ 2. `--run-script-once RUN_SCRIPT_ONCE` : 第一次启动时,在虚拟机上以 root 身份运行 `RUN_SCRIPT_ONCE` 脚本,但再也不会运行。这里给出完整的路径。这对于在虚拟机上运行自定义任务时非常有用,例如设置安全性或其他内容。
+ 3. `--packages PACKAGES1, PACKAGES2, ..` : 在第一次启动时安装以逗号分隔的软件包。
+要获取帮助,运行:
-To get help, run:
```
$ uvt-kvm -h
$ uvt-kvm create -h
```
-#### How do I delete my VM?
+#### 如何删除虚拟机?
-To destroy/delete your VM named vm1, run (please use the following command with care as there would be no confirmation box):
-`$ uvt-kvm destroy vm1`
+要销毁/删除名为 vm1 的虚拟机,运行(请小心使用以下命令,因为没有确认框):
-#### To find out the IP address of the vm1, run:
+```
+$ uvt-kvm destroy vm1
+```
-`$ uvt-kvm ip vm1`
+#### 获取 vm1 的 IP 地址,运行:
+
+```
+$ uvt-kvm ip vm1
192.168.122.52
+```
-#### To list all VMs run
+#### 列出所有运行的虚拟机
+
+```
+$ uvt-kvm list
+```
+
+示例输出:
-`$ uvt-kvm list`
-Sample outputs:
```
vm1
freebsd11.1
-
```
-### Step 6 - How to login to the vm named vm1
+### 步骤 6 - 如何登录 vm1
+
+语法是:
+
+```
+$ uvt-kvm ssh vm1
+```
+
+示例输出:
-The syntax is:
-`$ uvt-kvm ssh vm1`
-Sample outputs:
```
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64)
- comic core.md Dict.md lctt2014.md lctt2016.md LCTT翻译规范.md LICENSE Makefile published README.md sign.md sources translated 选题模板.txt 中文排版指北.md Documentation: https://help.ubuntu.com
- comic core.md Dict.md lctt2014.md lctt2016.md LCTT翻译规范.md LICENSE Makefile published README.md sign.md sources translated 选题模板.txt 中文排版指北.md Management: https://landscape.canonical.com
- comic core.md Dict.md lctt2014.md lctt2016.md LCTT翻译规范.md LICENSE Makefile published README.md sign.md sources translated 选题模板.txt 中文排版指北.md Support: https://ubuntu.com/advantage
+ * Documentation: https://help.ubuntu.com
+ * Management: https://landscape.canonical.com
+ * Support: https://ubuntu.com/advantage
- Get cloud support with Ubuntu Advantage Cloud Guest:
- http://www.ubuntu.com/business/services/cloud
+ Get cloud support with Ubuntu Advantage Cloud Guest:
+ http://www.ubuntu.com/business/services/cloud
0 packages can be updated.
0 updates are security updates.
-Last login: Thu Dec 7 09:55:06 2017 from 192.168.122.1
-
+Last login: Thu Dec 7 09:55:06 2017 from 192.168.122.1
```
-Another option is to use the regular ssh command from macOS/Linux/Unix/Windows client:
-`$ ssh [[email protected]][7]
-$ ssh -i ~/.ssh/id_rsa [[email protected]][7]`
-Sample outputs:
-[![Connect to the running VM using ssh][8]][8]
-Once vim created you can use the virsh command as usual:
-`$ virsh list`
+另一个选择是从 macOS/Linux/Unix/Windows 客户端使用常规的 ssh 命令:
+```
+$ ssh ubuntu@192.168.122.52
+$ ssh -i ~/.ssh/id_rsa ubuntu@192.168.122.52
+```
+
+示例输出:
+
+[![Connect to the running VM using ssh][8]][8]
+
+一旦创建了 vim,你可以照常使用 `virsh` 命令:
+
+```
+$ virsh list
+```
--------------------------------------------------------------------------------
via: https://www.cyberciti.biz/faq/how-to-use-kvm-cloud-images-on-ubuntu-linux/
作者:[Vivek Gite][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20171212 Oh My Fish- Make Your Shell Beautiful.md b/published/20171212 Oh My Fish- Make Your Shell Beautiful.md
new file mode 100644
index 0000000000..4920b7c021
--- /dev/null
+++ b/published/20171212 Oh My Fish- Make Your Shell Beautiful.md
@@ -0,0 +1,283 @@
+Oh My Fish! 让你的 Shell 漂亮起来
+=====
+
+![](https://www.ostechnix.com/wp-content/uploads/2017/12/oh-my-fish-720x340.jpg)
+
+几天前,我们讨论了如何[安装 Fish shell][1],这是一个健壮的、完全可用的 shell,带有许多很酷的功能,如自动建议、内置搜索功能、语法高亮显示、基于 web 配置等等。今天,我们将讨论如何使用 Oh My Fish (简称 `omf` ) 让我们的 Fish shell 变得漂亮且优雅。它是一个 Fishshell 框架,允许你安装扩展或更改你的 shell 外观的软件包。它简单易用,快速可扩展。使用 `omf`,你可以根据你的想法,很容易地安装主题,丰富你的外观和安装插件来调整你的 Fish shell。
+
+### 安装 Oh My Fish
+
+安装 omf 很简单。你要做的只是在你的 Fish shell 中运行下面的命令。
+
+```
+curl -L https://get.oh-my.fish | fish
+```
+
+![][3]
+
+一旦安装完成,你将看到提示符已经自动更改,如上图所所示。另外,你会注意到当前时间在 shell 窗口的右边。
+
+就是这样。让我们继续并调整我们的 fish shell。
+
+### 现在,让我们将 Fish Shell 变漂亮
+
+列出所有的安装包,运行:
+
+```
+omf list
+```
+
+这条命令将显示已安装的主题和插件。请注意,包可以是主题或插件。安装包意味着安装主题和插件。
+
+所有官方和社区支持的包(包括插件和主题)都托管在 [Omf 主仓库][4] 中。在这个主仓库中,你可以看到大量的仓库,其中包含大量的插件和主题。
+
+现在让我们看一下可用的和已安装的主题列表。为此,运行:
+
+```
+omf theme
+```
+
+![][5]
+
+如你所见,我们只有一个已安装的主题,这是默认的,但是还有大量可用的主题。在安装之前,你在[这里][6]可以预览所有可用的主题。这个页面包含了所有的主题细节,特性,每个主题的截图示例,以及哪个主题适合谁。
+
+#### 安装一个新主题
+
+请允许我安装一个主题,例如 clearance 主题,这是一个极简的 fish shell 主题,供那些经常使用 `git` 的人使用。为此,运行:
+
+```
+omf install clearance
+```
+
+![][7]
+
+如上图所示,在安装新主题后,Fish shell 的提示立即发生了变化。
+
+让我浏览一下系统文件,看看它如何显示。
+
+![][8]
+
+看起来不错!这是一个非常简单的主题。它将当前工作目录,文件夹和文件以不同的颜色区分开来。你可能会注意到,它还会在提示符的顶部显示当前工作目录。现在,clearance 是我的默认主题。
+
+#### 改变主题
+
+就像我之前说的一样,这个主题在安装后被立即应用。如果你有多个主题,你可以使用以下命令切换到另一个不同的主题:
+
+```
+omf theme
+```
+
+例如:
+
+```
+omf theme agnoster
+```
+
+现在我正在使用 agnoster 主题。 agnoster 就是这样改变了我 shell 的外观。
+
+![][9]
+
+#### 安装插件
+
+例如,我想安装一个天气插件。为此,只要运行:
+
+```
+omf install weather
+```
+
+天气插件依赖于 [jq][10](LCTT 译注:jq 是一个轻量级且灵活的命令行JSON处理器)。所以,你可能也需要安装 `jq`。它通常在 Linux 发行版的默认仓库中存在。因此,你可以使用默认的包管理器来安装它。例如,以下命令将在 Arch Linux 及其衍生版中安装 `jq`。
+
+```
+sudo pacman -S jq
+```
+
+现在,在 Fish shell 中使用以下命令查看天气:
+
+```
+weather
+```
+
+![][11]
+
+#### 寻找包
+
+要搜索主题或插件,请执行以下操作:
+
+```
+omf search
+```
+
+例如:
+
+```
+omf search nvm
+```
+
+为了限制搜索的主题范围,使用 `-t` 选项。
+
+```
+omf search -t chain
+```
+
+这条命令只会搜索主题名字中包含 “chain” 的主题。
+
+为了限制搜索的插件范围,使用 `-p` 选项。
+
+```
+omf search -p emacs
+```
+
+#### 更新包
+
+要仅更新核心功能(`omf` 本身),运行:
+
+```
+omf update omf
+```
+
+如果是最新的,你会看到以下输出:
+
+```
+Oh My Fish is up to date.
+You are now using Oh My Fish version 6.
+Updating https://github.com/oh-my-fish/packages-main master... Done!
+```
+
+更新所有包:
+
+```
+omf update
+```
+
+要有选择地更新软件包,只需包含如下所示的包名称:
+
+```
+omf update clearance agnoster
+```
+
+#### 显示关于包的信息
+
+当你想知道关于一个主题或插件的信息时,使用以下命令:
+
+```
+omf describe clearance
+```
+
+这条命令将显示关于包的信息。
+
+```
+Package: clearance
+Description: A minimalist fish shell theme for people who use git
+Repository: https://github.com/oh-my-fish/theme-clearance
+Maintainer:
+```
+
+#### 移除包
+
+移除一个包,例如 emacs,运行:
+
+```
+omf remove emacs
+```
+
+#### 管理仓库
+
+默认情况下,当你安装了 Oh My Fish 时,会自动添加官方仓库。这个仓库包含了开发人员构建的所有包。要管理用户安装的仓库包,使用这条命令:
+
+```
+omf repositories [list|add|remove]
+```
+
+列出所有安装的仓库,运行:
+
+```
+omf repositories list
+```
+
+添加一个仓库:
+
+```
+omf repositories add
+```
+
+例如:
+
+```
+omf repositories add https://github.com/ostechnix/theme-sk
+```
+
+移除一个仓库:
+
+```
+omf repositories remove
+```
+
+#### Oh My Fish 排错
+
+如果出现了错误,`omf` 足够聪明来帮助你,它可以列出解决问题的方法。例如,我安装了 clearance 包,得到了文件冲突的错误。幸运的是,在继续之前,Oh My Fish 会指示我该怎么做。因此,我只是简单地运行了以下代码来了解如何修正错误。
+
+```
+omf doctor
+```
+
+通过运行以下命令来解决错误:
+
+```
+rm ~/.config/fish/functions/fish_prompt.fish
+```
+
+![][12]
+
+无论你何时遇到问题,只要运行 `omf doctor` 命令,并尝试所有的建议方法。
+
+#### 获取帮助
+
+显示帮助部分,运行:
+
+```
+omf -h
+```
+
+或者
+
+```
+omf --help
+```
+
+#### 卸载 Oh My Fish
+
+卸载 Oh My Fish,运行以下命令:
+
+```
+omf destroy
+```
+
+继续前进,开始自定义你的 fish shell。获取更多细节,请参考项目的 GitHub 页面。
+
+这就是全部了。我很快将会在这里开始另一个有趣的指导。在此之前,请继续关注我们!
+
+干杯!
+
+
+--------------------------------------------------------------------------------
+via: https://www.ostechnix.com/oh-fish-make-shell-beautiful/
+
+作者:[SK][a]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.ostechnix.com/author/sk/
+[1]:https://www.ostechnix.com/install-fish-friendly-interactive-shell-linux/
+[2]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[3]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-1-1.png()
+[4]:https://github.com/oh-my-fish
+[5]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-5.png()
+[6]:https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md
+[7]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-3.png()
+[8]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-4.png()
+[9]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-6.png()
+[10]:https://stedolan.github.io/jq/
+[11]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-7.png()
+[12]:http://www.ostechnix.com/wp-content/uploads/2017/12/Oh-My-Fish-8.png()
diff --git a/translated/tech/20171219 How to generate webpages using CGI scripts.md b/published/20171219 How to generate webpages using CGI scripts.md
similarity index 61%
rename from translated/tech/20171219 How to generate webpages using CGI scripts.md
rename to published/20171219 How to generate webpages using CGI scripts.md
index 47d424303a..f8a7861716 100644
--- a/translated/tech/20171219 How to generate webpages using CGI scripts.md
+++ b/published/20171219 How to generate webpages using CGI scripts.md
@@ -1,28 +1,33 @@
如何使用 CGI 脚本生成网页
======
-回到互联网的开端,当我第一次创建了我的第一个商业网站,生活是无比的美好。
+> 通用网关接口(CGI)提供了使用任何语言生成动态网站的简易方法。
-我安装 Apache 并写了一些简单的 HTML 网页,网页上列出了一些关于我的业务的重要信息,比如产品概览以及如何联系我。这是一个静态网站,因为内容很少改变。由于网站的内容很少改变这一性质,因此维护起来也很简单。
+回到互联网的开端,当我第一次创建了我的第一个商业网站,生活是如此的美好。
-## 静态内容
+我安装 Apache 并写了一些简单的 HTML 网页,网页上列出了一些关于我的业务的重要信息,比如产品概览以及如何联系我。这是一个静态网站,因为内容很少改变。由于网站的内容很少发生改变这一性质,因此维护起来也很简单。
-静态内容很简单,同时也很常见。让我们快速的浏览一些静态网页的例子。你不需要一个可运行网站来执行这些小实验,只需要把这些文件放到 home 目录,然后使用浏览器打开。你所看到的内容将和通过 web 服务器提供这一文件看到的内容一样。
+### 静态内容
+
+静态内容很简单,同时也很常见。让我们快速的浏览一些静态网页的例子。你不需要一个可运行网站来执行这些小实验,只需要把这些文件放到家目录,然后使用浏览器打开。你所看到的内容将和通过 Web 服务器提供这一文件看到的内容一样。
+
+对于一个静态网站,你需要的第一件东西就是 `index.html` 文件,该文件通常放置在 `/var/www/html` 目录下。这个文件的内容可以非常简单,比如可以是像 “Hello, world” 这样一句短文本,没有任何 HTML 标记。它将简单的展示文本串内容。在你的家目录创建 `index.html` 文件,并添加 “hello, world” 作为内容(不需要引号)。在浏览器中通过下面的链接来打开这一文件:
-对于一个静态网站,你需要的第一件东西就是 index.html 文件,该文件通常放置在 `/var/www/html` 目录下。这个文件的内容可以非常简单,比如可以是像 "Hello, world" 这样一句短文本,没有任何 HTML 标记。它将简单的展示文本串内容。在你的 home 目录创建 index.html 文件,并添加 "hello, world" 作为内容(不需要引号)。在浏览器中通过下面的链接来打开这一文件:
```
-file:///home//index.html
+file:///home/<你的家目录>/index.html
```
所以 HTML 不是必须的,但是,如果你有大量需要格式化的文本,那么,不用 HTML 编码的网页的结果将会令人难以理解。
所以,下一步就是通过使用一些 HTML 编码来提供格式化,从而使内容更加可读。下面这一命令创建了一个具有 HTML 静态网页所需要的绝对最小标记的页面。你也可以使用你最喜欢的编辑器来创建这一内容。
+
```
echo "Hello World
" > test1.html
```
-现在,再次查看 index.html 文件,将会看到和刚才有些不同。
+现在,再次查看 `index.html` 文件,将会看到和刚才有些不同。
+
+当然,你可以在实际的内容行上添加大量的 HTML 标记,以形成更加完整和标准的网页。下面展示的是更加完整的版本,尽管在浏览器中会看到同样的内容,但这也为更加标准化的网站奠定了基础。继续在 `index.html` 中写入这些内容并通过浏览器查看。
-当然,你可以在实际的内容行上添加大量的 HTML 标记,以形成更加完整和标准的网页。下面展示的是更加完整的版本,尽管在浏览器中会看到同样的内容,但这也为更加标准化的网站奠定了基础。继续在 index.html 中写入这些内容并通过浏览器查看。
```
@@ -37,24 +42,25 @@ echo "Hello World
" > test1.html
我使用这些技术搭建了一些静态网站,但我的生活正在改变。
-## 动态网页
+### 动态网页
-我找了一份新工作,这份工作的主要任务就是创建并维护用于一个动态网站的 CGI([公共网关接口][6])代码。字面意思来看,动态意味着在浏览器中生成的网页所需要的 HTML 是由每次访问页面时所访问到的数据生成的。这些数据包括网页表格中的用户输入,以用来在数据库中进行数据查找,结果数据被一些恰当的 HTML 包围着并展示在所请求的浏览器中。但是这不需要非常复杂。
+我找了一份新工作,这份工作的主要任务就是创建并维护用于一个动态网站的 CGI([公共网关接口][6])代码。字面意思来看,动态意味着在浏览器中生成的网页所需要的 HTML 是由每次访问页面时不同的数据所生成的。这些数据包括网页表单中的用户输入,以用来在数据库中进行数据查找,结果数据被一些恰当的 HTML 包围着并展示在所请求的浏览器中。但是这不需要非常复杂。
通过使用 CGI 脚本,你可以创建一些简单或复杂的交互式程序,通过运行这些程序能够生成基于输入、计算、服务器的当前条件等改变的动态页面。有许多种语言可以用来写 CGI 脚本,在这篇文章中,我将谈到的是 Perl 和 Bash ,其他非常受欢迎的 CGI 语言包括 PHP 和 Python 。
-这篇文章不会介绍 Apache 或其他任何 web 服务器的安装和配置。如果你能够访问一个你可以进行实验的 web 服务器,那么你可以直接查看它们在浏览器中出现的结果。否则,你可以在命令行中运行程序来查看它们所创建的 HTML 文本。你也可以重定向 HTML 输出到一个文件中,然后通过浏览器查看结果文件。
+这篇文章不会介绍 Apache 或其他任何 web 服务器的安装和配置。如果你能够访问一个你可以进行实验的 Web 服务器,那么你可以直接查看它们在浏览器中出现的结果。否则,你可以在命令行中运行程序来查看它们所创建的 HTML 文本。你也可以重定向 HTML 输出到一个文件中,然后通过浏览器查看结果文件。
### 使用 Perl
Perl 是一门非常受欢迎的 CGI 脚本语言,它的优势是强大的文本操作能力。
-为了使 CGI 脚本可执行,你需要在你的网站的 httpd.conf 中添加下面这行内容。这会告诉服务器可执行 CGI 文件的位置。在这次实验中,不必担心这个问题。
+为了使 CGI 脚本可执行,你需要在你的网站的 `httpd.conf` 中添加下面这行内容。这会告诉服务器可执行 CGI 文件的位置。在这次实验中,不必担心这个问题。
+
```
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
```
-把下面的 Perl 代码添加到文件 index.cgi,在这次实验中,这个文件应该放在你的 home 目录下。如果你使用 web 服务器,那么应把文件的所有者更改为 apache.apache,同时将文件权限设置为 755,因为无论位于哪,它必须是可执行的。
+把下面的 Perl 代码添加到文件 `index.cgi`,在这次实验中,这个文件应该放在你的家目录下。如果你使用 Web 服务器,那么应把文件的所有者更改为 `apache.apache`,同时将文件权限设置为 755,因为无论位于哪,它必须是可执行的。
```
#!/usr/bin/perl
@@ -67,11 +73,11 @@ print "